This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
dexter gerrit-no-reply at lists.osmocom.orgdexter has uploaded this change for review. ( https://gerrit.osmocom.org/12044 Change subject: gsm0808: add encoder for cause codes and use it ...................................................................... gsm0808: add encoder for cause codes and use it At the moment the all gsm0808 cause codes are encoded directly using the tlv API directly to put a one byte TLV field. This works ok for most situations where the cause code consists of a single byte. However, gsm0808 specifies a two byte cause code model where cause codes may be extended up to two bytes. Lets implement the encoding over and over again, lets rather have an encoder function we can call. - Add an encoder function that can generate single byte and extended cause codeds and makes the length decision automatically. - Use only this function to append cause codes Change-Id: I71d58fad89502a43532f60717ca022c15c73f8bb --- M include/osmocom/gsm/gsm0808_utils.h M src/gsm/gsm0808.c M src/gsm/gsm0808_utils.c 3 files changed, 43 insertions(+), 12 deletions(-) git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/44/12044/1 diff --git a/include/osmocom/gsm/gsm0808_utils.h b/include/osmocom/gsm/gsm0808_utils.h index c5bf280..e1dd11e 100644 --- a/include/osmocom/gsm/gsm0808_utils.h +++ b/include/osmocom/gsm/gsm0808_utils.h @@ -77,6 +77,7 @@ int gsm0808_cell_id_u_name(char *buf, size_t buflen, enum CELL_IDENT id_discr, const union gsm0808_cell_id_u *u); +uint8_t gsm0808_enc_cause(struct msgb *msg, uint16_t cause); uint8_t gsm0808_enc_aoip_trasp_addr(struct msgb *msg, const struct sockaddr_storage *ss); int gsm0808_dec_aoip_trasp_addr(struct sockaddr_storage *ss, diff --git a/src/gsm/gsm0808.c b/src/gsm/gsm0808.c index 04d786e..3e2d8da 100644 --- a/src/gsm/gsm0808.c +++ b/src/gsm/gsm0808.c @@ -144,7 +144,7 @@ return NULL; msgb_v_put(msg, BSS_MAP_MSG_RESET); - msgb_tlv_put(msg, GSM0808_IE_CAUSE, 1, &cause); + gsm0808_enc_cause(msg, cause); msg->l3h = msgb_tv_push(msg, BSSAP_MSG_BSS_MANAGEMENT, msgb_length(msg)); return msg; @@ -193,7 +193,7 @@ msg->l3h = msgb_tv_put(msg, BSSAP_MSG_BSS_MANAGEMENT, 4); msgb_v_put(msg, BSS_MAP_MSG_CLEAR_CMD); - msgb_tlv_put(msg, GSM0808_IE_CAUSE, 1, &cause); + gsm0808_enc_cause(msg, cause); return msg; } @@ -276,7 +276,7 @@ msgb_v_put(msg, BSS_MAP_MSG_CIPHER_MODE_REJECT); - msgb_tlv_put(msg, GSM0808_IE_CAUSE, 1, (const uint8_t *)&cause); + gsm0808_enc_cause(msg, cause); msg->l3h = msgb_tv_push(msg, BSSAP_MSG_BSS_MANAGEMENT, msgb_length(msg)); @@ -289,18 +289,22 @@ * \returns callee-allocated msgb with BSSMAP Cipher Mode Reject message */ struct msgb *gsm0808_create_cipher_reject_ext(enum gsm0808_cause_class class, uint8_t ext) { - uint8_t c[2]; + uint16_t cause; struct msgb *msg = msgb_alloc_headroom(BSSMAP_MSG_SIZE, BSSMAP_MSG_HEADROOM, "bssmap: cipher mode reject"); if (!msg) return NULL; - c[0] = 0x80 | (class << 4); /* set the high bit to indicate extended cause */ - c[1] = ext; + /* Set cause code class in the upper byte */ + cause = 0x80 | (class << 4); + cause = cause << 8; + + /* Set cause code extension in the lower byte */ + cause |= ext; msgb_v_put(msg, BSS_MAP_MSG_CIPHER_MODE_REJECT); - msgb_tlv_put(msg, GSM0808_IE_CAUSE, 2, c); + gsm0808_enc_cause(msg, cause); msg->l3h = msgb_tv_push(msg, BSSAP_MSG_BSS_MANAGEMENT, msgb_length(msg)); @@ -575,7 +579,7 @@ return NULL; msgb_v_put(msg, BSS_MAP_MSG_ASSIGMENT_FAILURE); - msgb_tlv_put(msg, GSM0808_IE_CAUSE, 1, &cause); + gsm0808_enc_cause(msg, cause); /* RR cause 3.2.2.22 */ if (rr_cause) @@ -617,7 +621,7 @@ return NULL; msgb_v_put(msg, BSS_MAP_MSG_CLEAR_RQST); - msgb_tlv_put(msg, GSM0808_IE_CAUSE, 1, &cause); + gsm0808_enc_cause(msg, cause); msg->l3h = msgb_tv_push(msg, BSSAP_MSG_BSS_MANAGEMENT, msgb_length(msg)); return msg; @@ -754,7 +758,7 @@ msgb_v_put(msg, BSS_MAP_MSG_HANDOVER_REQUIRED); /* Cause, 3.2.2.5 */ - msgb_tlv_put(msg, GSM0808_IE_CAUSE, params->cause & 0x80? 2 : 1, (const uint8_t*)¶ms->cause); + gsm0808_enc_cause(msg, params->cause); /* Cell Identifier List, 3.2.2.27 */ gsm0808_enc_cell_id_list2(msg, ¶ms->cil); @@ -879,7 +883,7 @@ msgb_v_put(msg, BSS_MAP_MSG_HANDOVER_FAILURE); /* Cause, 3.2.2.5 */ - msgb_tlv_put(msg, GSM0808_IE_CAUSE, params->cause & 0x80? 2 : 1, (const uint8_t*)¶ms->cause); + gsm0808_enc_cause(msg, params->cause); /* RR Cause, 3.2.2.22 */ if (params->rr_cause_present) @@ -910,7 +914,7 @@ msgb_v_put(msg, BSS_MAP_MSG_HANDOVER_PERFORMED); /* Cause, 3.2.2.5 */ - msgb_tlv_put(msg, GSM0808_IE_CAUSE, gsm0808_cause_ext(params->cause) ? 2 : 1, (const uint8_t *)¶ms->cause); + gsm0808_enc_cause(msg, params->cause); /* Cell Identifier, 3.2.2.17 */ gsm0808_enc_cell_id(msg, ¶ms->cell_id); diff --git a/src/gsm/gsm0808_utils.c b/src/gsm/gsm0808_utils.c index c58d828..1252857 100644 --- a/src/gsm/gsm0808_utils.c +++ b/src/gsm/gsm0808_utils.c @@ -48,6 +48,32 @@ * \file gsm0808_utils.c */ +/*! Encode TS 08.08 AoIP Cause IE + * \param[out] msg Message Buffer to which to append IE + * \param[in] cause Cause code to be used in IE + * \returns number of bytes added to \a msg */ +uint8_t gsm0808_enc_cause(struct msgb *msg, uint16_t cause) +{ + /* See also 3GPP TS 48.008 3.2.2.5 Cause */ + uint8_t *old_tail; + bool extended; + uint8_t buf[2]; + + old_tail = msg->tail; + + extended = gsm0808_cause_ext(cause >> 8); + + if (extended) { + buf[1] = (uint8_t) (cause & 0xff); + buf[0] = (uint8_t) ((cause >> 8) & 0xff); + } else + buf[0] = (uint8_t) (cause & 0xff); + + msgb_tlv_put(msg, GSM0808_IE_CAUSE, extended ? 2 : 1, buf); + + return (uint8_t) (msg->tail - old_tail); +} + /*! Encode TS 08.08 AoIP transport address IE * \param[out] msg Message Buffer to which to append IE * \param[in] ss Socket Address to be used in IE -- To view, visit https://gerrit.osmocom.org/12044 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: libosmocore Gerrit-Branch: master Gerrit-MessageType: newchange Gerrit-Change-Id: I71d58fad89502a43532f60717ca022c15c73f8bb Gerrit-Change-Number: 12044 Gerrit-PatchSet: 1 Gerrit-Owner: dexter <pmaier at sysmocom.de> -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20181130/ab7f98d1/attachment.htm>