[MERGED] libosmocore[master]: gsm0808: Add create functions for BSS_MAP_MSG_ASSIGMENT_RQST
Harald Welte has submitted this change and it was merged. Change subject: gsm0808: Add create functions for BSS_MAP_MSG_ASSIGMENT_RQST .. gsm0808: Add create functions for BSS_MAP_MSG_ASSIGMENT_RQST gsm0808.h/c lacks functionality to generate BSS_MAP_MSG_ASSIGMENT_RQST messages. These messages are required if the code is used in an MSC implementation. This commit adds a gsm0808_create_assignment() function, that generates an A/AoiP BSS_MAP_MSG_PAGING message. Change-Id: I4d1d455a1e1cf95407e23ded7b7defbcf2dd6ff0 --- M include/osmocom/gsm/gsm0808.h M src/gsm/gsm0808.c M src/gsm/libosmogsm.map M tests/gsm0808/gsm0808_test.c M tests/gsm0808/gsm0808_test.ok 5 files changed, 113 insertions(+), 0 deletions(-) Approvals: Harald Welte: Looks good to me, approved Jenkins Builder: Verified diff --git a/include/osmocom/gsm/gsm0808.h b/include/osmocom/gsm/gsm0808.h index 990fd74..a9f610a 100644 --- a/include/osmocom/gsm/gsm0808.h +++ b/include/osmocom/gsm/gsm0808.h @@ -42,6 +42,11 @@ struct msgb *gsm0808_create_classmark_update(const uint8_t *cm2, uint8_t cm2_len, const uint8_t *cm3, uint8_t cm3_len); struct msgb *gsm0808_create_sapi_reject(uint8_t link_id); +struct msgb *gsm0808_create_ass(const struct gsm0808_channel_type *ct, + const uint16_t *cic, + const struct sockaddr_storage *ss, + const struct gsm0808_speech_codec_list *scl, + const uint32_t *ci); struct msgb *gsm0808_create_ass_compl(uint8_t rr_cause, uint8_t chosen_channel, uint8_t encr_alg_id, uint8_t speech_mode, const struct sockaddr_storage *ss, diff --git a/src/gsm/gsm0808.c b/src/gsm/gsm0808.c index 2721a1b..be58939 100644 --- a/src/gsm/gsm0808.c +++ b/src/gsm/gsm0808.c @@ -238,6 +238,62 @@ return msg; } +struct msgb *gsm0808_create_ass(const struct gsm0808_channel_type *ct, + const uint16_t *cic, + const struct sockaddr_storage *ss, + const struct gsm0808_speech_codec_list *scl, + const uint32_t *ci) +{ + /* See also: 3GPP TS 48.008 3.2.1.1 ASSIGNMENT REQUEST */ + struct msgb *msg; + uint16_t cic_sw; + uint32_t ci_sw; + + /* Mandatory emelent! */ + OSMO_ASSERT(ct); + + msg = + msgb_alloc_headroom(BSSMAP_MSG_SIZE, BSSMAP_MSG_HEADROOM, + "bssmap: ass req"); + if (!msg) + return NULL; + + /* Message Type 3.2.2.1 */ + msgb_v_put(msg, BSS_MAP_MSG_ASSIGMENT_RQST); + + /* Channel Type 3.2.2.11 */ + gsm0808_enc_channel_type(msg, ct); + + /* Circuit Identity Code 3.2.2.2 */ + if (cic) { + cic_sw = htons(*cic); + msgb_tv_fixed_put(msg, GSM0808_IE_CIRCUIT_IDENTITY_CODE, + sizeof(cic_sw), (uint8_t *) & cic_sw); + } + + /* AoIP: AoIP Transport Layer Address (MGW) 3.2.2.102 */ + if (ss) { + gsm0808_enc_aoip_trasp_addr(msg, ss); + } + + /* AoIP: Codec List (MSC Preferred) 3.2.2.103 */ + if (scl) + gsm0808_enc_speech_codec_list(msg, scl); + + /* AoIP: Call Identifier 3.2.2.105 */ + if (ci) { + ci_sw = htonl(*ci); + msgb_tv_fixed_put(msg, GSM0808_IE_CALL_ID, sizeof(ci_sw), + (uint8_t *) & ci_sw); + } + + /* push the bssmap header */ + msg->l3h = + msgb_tv_push(msg, BSSAP_MSG_BSS_MANAGEMENT, msgb_length(msg)); + + return msg; +} + struct msgb *gsm0808_create_ass_compl(uint8_t rr_cause, uint8_t chosen_channel, uint8_t encr_alg_id, uint8_t speech_mode, const struct sockaddr_storage *ss, diff --git a/src/gsm/libosmogsm.map b/src/gsm/libosmogsm.map index ec23418..a4e6083 100644 --- a/src/gsm/libosmogsm.map +++ b/src/gsm/libosmogsm.map @@ -124,6 +124,7 @@ gsm0808_att_tlvdef; gsm0808_bssap_name; gsm0808_bssmap_name; +gsm0808_create_ass; gsm0808_create_assignment_completed; gsm0808_create_ass_compl; gsm0808_create_assignment_failure; diff --git a/tests/gsm0808/gsm0808_test.c b/tests/gsm0808/gsm0808_test.c index b0dad7d..a0ff6d5 100644 --- a/tests/gsm0808/gsm0808_test.c +++ b/tests/gsm0808/gsm0808_test.c @@ -262,6 +262,55 @@ msgb_free(msg); } +static void test_create_ass() +{ + static const uint8_t res1[] = + { 0x00, 0x0a, 0x01, 0x0b, 0x04, 0x01, 0x0b, 0xa1, 0x25, 0x01, 0x00, + 0x04 }; + static const uint8_t res2[] = + { 0x00, 0x20, 0x01, 0x0b, 0x04, 0x01, 0x0b, 0xa1, 0x25, 0x01, 0x00, + 0x04,
libosmocore[master]: gsm0808: Add create functions for BSS_MAP_MSG_ASSIGMENT_RQST
Patch Set 6: Code-Review+2 -- To view, visit https://gerrit.osmocom.org/2184 To unsubscribe, visit https://gerrit.osmocom.org/settings Gerrit-MessageType: comment Gerrit-Change-Id: I4d1d455a1e1cf95407e23ded7b7defbcf2dd6ff0 Gerrit-PatchSet: 6 Gerrit-Project: libosmocore Gerrit-Branch: master Gerrit-Owner: dexterGerrit-Reviewer: Harald Welte Gerrit-Reviewer: Jenkins Builder Gerrit-HasComments: No
[PATCH] libosmocore[master]: gsm0808: Add create functions for BSS_MAP_MSG_ASSIGMENT_RQST
Hello Harald Welte, Jenkins Builder, I'd like you to reexamine a change. Please visit https://gerrit.osmocom.org/2184 to look at the new patch set (#6). gsm0808: Add create functions for BSS_MAP_MSG_ASSIGMENT_RQST gsm0808.h/c lacks functionality to generate BSS_MAP_MSG_ASSIGMENT_RQST messages. These messages are required if the code is used in an MSC implementation. This commit adds a gsm0808_create_assignment() function, that generates an A/AoiP BSS_MAP_MSG_PAGING message. Change-Id: I4d1d455a1e1cf95407e23ded7b7defbcf2dd6ff0 --- M include/osmocom/gsm/gsm0808.h M src/gsm/gsm0808.c M src/gsm/libosmogsm.map M tests/gsm0808/gsm0808_test.c M tests/gsm0808/gsm0808_test.ok 5 files changed, 113 insertions(+), 0 deletions(-) git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/84/2184/6 diff --git a/include/osmocom/gsm/gsm0808.h b/include/osmocom/gsm/gsm0808.h index 990fd74..a9f610a 100644 --- a/include/osmocom/gsm/gsm0808.h +++ b/include/osmocom/gsm/gsm0808.h @@ -42,6 +42,11 @@ struct msgb *gsm0808_create_classmark_update(const uint8_t *cm2, uint8_t cm2_len, const uint8_t *cm3, uint8_t cm3_len); struct msgb *gsm0808_create_sapi_reject(uint8_t link_id); +struct msgb *gsm0808_create_ass(const struct gsm0808_channel_type *ct, + const uint16_t *cic, + const struct sockaddr_storage *ss, + const struct gsm0808_speech_codec_list *scl, + const uint32_t *ci); struct msgb *gsm0808_create_ass_compl(uint8_t rr_cause, uint8_t chosen_channel, uint8_t encr_alg_id, uint8_t speech_mode, const struct sockaddr_storage *ss, diff --git a/src/gsm/gsm0808.c b/src/gsm/gsm0808.c index 2721a1b..be58939 100644 --- a/src/gsm/gsm0808.c +++ b/src/gsm/gsm0808.c @@ -238,6 +238,62 @@ return msg; } +struct msgb *gsm0808_create_ass(const struct gsm0808_channel_type *ct, + const uint16_t *cic, + const struct sockaddr_storage *ss, + const struct gsm0808_speech_codec_list *scl, + const uint32_t *ci) +{ + /* See also: 3GPP TS 48.008 3.2.1.1 ASSIGNMENT REQUEST */ + struct msgb *msg; + uint16_t cic_sw; + uint32_t ci_sw; + + /* Mandatory emelent! */ + OSMO_ASSERT(ct); + + msg = + msgb_alloc_headroom(BSSMAP_MSG_SIZE, BSSMAP_MSG_HEADROOM, + "bssmap: ass req"); + if (!msg) + return NULL; + + /* Message Type 3.2.2.1 */ + msgb_v_put(msg, BSS_MAP_MSG_ASSIGMENT_RQST); + + /* Channel Type 3.2.2.11 */ + gsm0808_enc_channel_type(msg, ct); + + /* Circuit Identity Code 3.2.2.2 */ + if (cic) { + cic_sw = htons(*cic); + msgb_tv_fixed_put(msg, GSM0808_IE_CIRCUIT_IDENTITY_CODE, + sizeof(cic_sw), (uint8_t *) & cic_sw); + } + + /* AoIP: AoIP Transport Layer Address (MGW) 3.2.2.102 */ + if (ss) { + gsm0808_enc_aoip_trasp_addr(msg, ss); + } + + /* AoIP: Codec List (MSC Preferred) 3.2.2.103 */ + if (scl) + gsm0808_enc_speech_codec_list(msg, scl); + + /* AoIP: Call Identifier 3.2.2.105 */ + if (ci) { + ci_sw = htonl(*ci); + msgb_tv_fixed_put(msg, GSM0808_IE_CALL_ID, sizeof(ci_sw), + (uint8_t *) & ci_sw); + } + + /* push the bssmap header */ + msg->l3h = + msgb_tv_push(msg, BSSAP_MSG_BSS_MANAGEMENT, msgb_length(msg)); + + return msg; +} + struct msgb *gsm0808_create_ass_compl(uint8_t rr_cause, uint8_t chosen_channel, uint8_t encr_alg_id, uint8_t speech_mode, const struct sockaddr_storage *ss, diff --git a/src/gsm/libosmogsm.map b/src/gsm/libosmogsm.map index ec23418..a4e6083 100644 --- a/src/gsm/libosmogsm.map +++ b/src/gsm/libosmogsm.map @@ -124,6 +124,7 @@ gsm0808_att_tlvdef; gsm0808_bssap_name; gsm0808_bssmap_name; +gsm0808_create_ass; gsm0808_create_assignment_completed; gsm0808_create_ass_compl; gsm0808_create_assignment_failure; diff --git a/tests/gsm0808/gsm0808_test.c b/tests/gsm0808/gsm0808_test.c index b0dad7d..a0ff6d5 100644 --- a/tests/gsm0808/gsm0808_test.c +++ b/tests/gsm0808/gsm0808_test.c @@ -262,6 +262,55 @@ msgb_free(msg); } +static void test_create_ass() +{ + static const uint8_t res1[] = + { 0x00, 0x0a, 0x01, 0x0b, 0x04, 0x01, 0x0b, 0xa1, 0x25, 0x01, 0x00, + 0x04 }; + static const uint8_t res2[] = + { 0x00, 0x20, 0x01, 0x0b, 0x04, 0x01, 0x0b, 0xa1, 0x25, 0x01, 0x00, + 0x04, GSM0808_IE_AOIP_TRASP_ADDR, 0x06, 0xc0, 0xa8, 0x64, 0x17, +
libosmocore[master]: gsm0808: Add create functions for BSS_MAP_MSG_ASSIGMENT_RQST
Patch Set 5: Code-Review+1 (1 comment) https://gerrit.osmocom.org/#/c/2184/5/include/osmocom/gsm/gsm0808.h File include/osmocom/gsm/gsm0808.h: Line 44: struct msgb *gsm0808_create_assignment(struct gsm0808_channel_type *ct, again const? -- To view, visit https://gerrit.osmocom.org/2184 To unsubscribe, visit https://gerrit.osmocom.org/settings Gerrit-MessageType: comment Gerrit-Change-Id: I4d1d455a1e1cf95407e23ded7b7defbcf2dd6ff0 Gerrit-PatchSet: 5 Gerrit-Project: libosmocore Gerrit-Branch: master Gerrit-Owner: dexterGerrit-Reviewer: Harald Welte Gerrit-Reviewer: Jenkins Builder Gerrit-HasComments: Yes
[PATCH] libosmocore[master]: gsm0808: Add create functions for BSS_MAP_MSG_ASSIGMENT_RQST
Hello Jenkins Builder, I'd like you to reexamine a change. Please visit https://gerrit.osmocom.org/2184 to look at the new patch set (#4). gsm0808: Add create functions for BSS_MAP_MSG_ASSIGMENT_RQST gsm0808.h/c lacks functionality to generate BSS_MAP_MSG_ASSIGMENT_RQST messages. These messages are required if the code is used in an MSC implementation. This commit adds a gsm0808_create_assignment() function, that generates an A/AoiP BSS_MAP_MSG_PAGING message. Change-Id: I4d1d455a1e1cf95407e23ded7b7defbcf2dd6ff0 --- M include/osmocom/gsm/gsm0808.h M src/gsm/gsm0808.c M src/gsm/libosmogsm.map M tests/gsm0808/gsm0808_test.c M tests/gsm0808/gsm0808_test.ok 5 files changed, 113 insertions(+), 0 deletions(-) git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/84/2184/4 diff --git a/include/osmocom/gsm/gsm0808.h b/include/osmocom/gsm/gsm0808.h index db9a505..031215e 100644 --- a/include/osmocom/gsm/gsm0808.h +++ b/include/osmocom/gsm/gsm0808.h @@ -41,6 +41,11 @@ struct msgb *gsm0808_create_classmark_update(const uint8_t *cm2, uint8_t cm2_len, const uint8_t *cm3, uint8_t cm3_len); struct msgb *gsm0808_create_sapi_reject(uint8_t link_id); +struct msgb *gsm0808_create_assignment(struct gsm0808_channel_type *ct, + uint16_t * cic, + struct sockaddr_storage *ss, + struct gsm0808_speech_codec_list *scl, + uint32_t * ci); struct msgb *gsm0808_create_assignment_completed_aoip(uint8_t rr_cause, uint8_t chosen_channel, uint8_t encr_alg_id, diff --git a/src/gsm/gsm0808.c b/src/gsm/gsm0808.c index 01d54ef..fd0bf2e 100644 --- a/src/gsm/gsm0808.c +++ b/src/gsm/gsm0808.c @@ -238,6 +238,62 @@ return msg; } +struct msgb *gsm0808_create_assignment(struct gsm0808_channel_type *ct, + uint16_t *cic, + struct sockaddr_storage *ss, + struct gsm0808_speech_codec_list *scl, + uint32_t *ci) +{ + /* See also: 3GPP TS 48.008 3.2.1.1 ASSIGNMENT REQUEST */ + struct msgb *msg; + uint16_t cic_sw; + uint32_t ci_sw; + + /* Mandatory emelent! */ + OSMO_ASSERT(ct); + + msg = + msgb_alloc_headroom(BSSMAP_MSG_SIZE, BSSMAP_MSG_HEADROOM, + "bssmap: ass req"); + if (!msg) + return NULL; + + /* Message Type 3.2.2.1 */ + msgb_v_put(msg, BSS_MAP_MSG_ASSIGMENT_RQST); + + /* Channel Type 3.2.2.11 */ + gsm0808_enc_channel_type(msg, ct); + + /* Circuit Identity Code 3.2.2.2 */ + if (cic) { + cic_sw = htons(*cic); + msgb_tv_fixed_put(msg, GSM0808_IE_CIRCUIT_IDENTITY_CODE, + sizeof(cic_sw), (uint8_t *) & cic_sw); + } + + /* AoIP: AoIP Transport Layer Address (MGW) 3.2.2.102 */ + if (ss) { + gsm0808_enc_aoip_trasp_addr(msg, ss); + } + + /* AoIP: Codec List (MSC Preferred) 3.2.2.103 */ + if (scl) + gsm0808_enc_speech_codec_list(msg, scl); + + /* AoIP: Call Identifier 3.2.2.105 */ + if (ci) { + ci_sw = htonl(*ci); + msgb_tv_fixed_put(msg, GSM0808_IE_CALL_ID, sizeof(ci_sw), + (uint8_t *) & ci_sw); + } + + /* push the bssmap header */ + msg->l3h = + msgb_tv_push(msg, BSSAP_MSG_BSS_MANAGEMENT, msgb_length(msg)); + + return msg; +} + struct msgb *gsm0808_create_assignment_completed_aoip(uint8_t rr_cause, uint8_t chosen_channel, uint8_t encr_alg_id, diff --git a/src/gsm/libosmogsm.map b/src/gsm/libosmogsm.map index fb06bff..fcd13d1 100644 --- a/src/gsm/libosmogsm.map +++ b/src/gsm/libosmogsm.map @@ -124,6 +124,7 @@ gsm0808_att_tlvdef; gsm0808_bssap_name; gsm0808_bssmap_name; +gsm0808_create_assignment; gsm0808_create_assignment_completed; gsm0808_create_assignment_completed_aoip; gsm0808_create_assignment_failure; diff --git a/tests/gsm0808/gsm0808_test.c b/tests/gsm0808/gsm0808_test.c index 02de5e1..521ae24 100644 --- a/tests/gsm0808/gsm0808_test.c +++ b/tests/gsm0808/gsm0808_test.c @@ -262,6 +262,55 @@ msgb_free(msg); } +static void test_create_ass() +{ + static const uint8_t res1[] = + { 0x00, 0x0a, 0x01, 0x0b, 0x04, 0x01, 0x0b, 0xa1, 0x25, 0x01, 0x00, + 0x04 }; + static const uint8_t res2[] = + { 0x00, 0x20, 0x01, 0x0b, 0x04, 0x01, 0x0b, 0xa1, 0x25, 0x01, 0x00, + 0x04, GSM0808_IE_AOIP_TRASP_ADDR, 0x06, 0xc0, 0xa8, 0x64, 0x17, +
[PATCH] libosmocore[master]: gsm0808: Add create functions for BSS_MAP_MSG_ASSIGMENT_RQST
Hello Jenkins Builder, I'd like you to reexamine a change. Please visit https://gerrit.osmocom.org/2184 to look at the new patch set (#3). gsm0808: Add create functions for BSS_MAP_MSG_ASSIGMENT_RQST gsm0808.h/c lacks functionality to generate BSS_MAP_MSG_ASSIGMENT_RQST messages. These messages are required if the code is used in an MSC implementation. This commit adds a gsm0808_create_assignment() function, that generates an A/AoiP BSS_MAP_MSG_PAGING message. Change-Id: I4d1d455a1e1cf95407e23ded7b7defbcf2dd6ff0 --- M include/osmocom/gsm/gsm0808.h M src/gsm/gsm0808.c M src/gsm/libosmogsm.map M tests/gsm0808/gsm0808_test.c M tests/gsm0808/gsm0808_test.ok 5 files changed, 115 insertions(+), 11 deletions(-) git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/84/2184/3 diff --git a/include/osmocom/gsm/gsm0808.h b/include/osmocom/gsm/gsm0808.h index db9a505..031215e 100644 --- a/include/osmocom/gsm/gsm0808.h +++ b/include/osmocom/gsm/gsm0808.h @@ -41,6 +41,11 @@ struct msgb *gsm0808_create_classmark_update(const uint8_t *cm2, uint8_t cm2_len, const uint8_t *cm3, uint8_t cm3_len); struct msgb *gsm0808_create_sapi_reject(uint8_t link_id); +struct msgb *gsm0808_create_assignment(struct gsm0808_channel_type *ct, + uint16_t * cic, + struct sockaddr_storage *ss, + struct gsm0808_speech_codec_list *scl, + uint32_t * ci); struct msgb *gsm0808_create_assignment_completed_aoip(uint8_t rr_cause, uint8_t chosen_channel, uint8_t encr_alg_id, diff --git a/src/gsm/gsm0808.c b/src/gsm/gsm0808.c index daed85c..fd0bf2e 100644 --- a/src/gsm/gsm0808.c +++ b/src/gsm/gsm0808.c @@ -238,6 +238,62 @@ return msg; } +struct msgb *gsm0808_create_assignment(struct gsm0808_channel_type *ct, + uint16_t *cic, + struct sockaddr_storage *ss, + struct gsm0808_speech_codec_list *scl, + uint32_t *ci) +{ + /* See also: 3GPP TS 48.008 3.2.1.1 ASSIGNMENT REQUEST */ + struct msgb *msg; + uint16_t cic_sw; + uint32_t ci_sw; + + /* Mandatory emelent! */ + OSMO_ASSERT(ct); + + msg = + msgb_alloc_headroom(BSSMAP_MSG_SIZE, BSSMAP_MSG_HEADROOM, + "bssmap: ass req"); + if (!msg) + return NULL; + + /* Message Type 3.2.2.1 */ + msgb_v_put(msg, BSS_MAP_MSG_ASSIGMENT_RQST); + + /* Channel Type 3.2.2.11 */ + gsm0808_enc_channel_type(msg, ct); + + /* Circuit Identity Code 3.2.2.2 */ + if (cic) { + cic_sw = htons(*cic); + msgb_tv_fixed_put(msg, GSM0808_IE_CIRCUIT_IDENTITY_CODE, + sizeof(cic_sw), (uint8_t *) & cic_sw); + } + + /* AoIP: AoIP Transport Layer Address (MGW) 3.2.2.102 */ + if (ss) { + gsm0808_enc_aoip_trasp_addr(msg, ss); + } + + /* AoIP: Codec List (MSC Preferred) 3.2.2.103 */ + if (scl) + gsm0808_enc_speech_codec_list(msg, scl); + + /* AoIP: Call Identifier 3.2.2.105 */ + if (ci) { + ci_sw = htonl(*ci); + msgb_tv_fixed_put(msg, GSM0808_IE_CALL_ID, sizeof(ci_sw), + (uint8_t *) & ci_sw); + } + + /* push the bssmap header */ + msg->l3h = + msgb_tv_push(msg, BSSAP_MSG_BSS_MANAGEMENT, msgb_length(msg)); + + return msg; +} + struct msgb *gsm0808_create_assignment_completed_aoip(uint8_t rr_cause, uint8_t chosen_channel, uint8_t encr_alg_id, @@ -365,7 +421,6 @@ uint8_t *chan_needed) { struct msgb *msg; - struct msgb *cil_encoded; uint8_t mid_buf[GSM48_MI_SIZE + 2]; int mid_len; uint32_t tmsi_sw; @@ -397,16 +452,8 @@ } /* Cell Identifier List 3.2.2.27 */ - if (cil) { - cil_encoded = gsm0808_enc_cell_id_list(cil); - if (!cil_encoded) { - msgb_free(msg); - return NULL; - } - msgb_tlv_put(msg, GSM0808_IE_CELL_IDENTIFIER_LIST, -cil_encoded->len, cil_encoded->data); - msgb_free(cil_encoded); - } + if (cil) + gsm0808_enc_cell_id_list(msg, cil); /* Channel Needed 3.2.2.36 */ if (chan_needed) { diff --git a/src/gsm/libosmogsm.map b/src/gsm/libosmogsm.map index fb06bff..fcd13d1 100644 --- a/src/gsm/libosmogsm.map +++
[PATCH] libosmocore[master]: gsm0808: Add create functions for BSS_MAP_MSG_ASSIGMENT_RQST
Review at https://gerrit.osmocom.org/2184 gsm0808: Add create functions for BSS_MAP_MSG_ASSIGMENT_RQST gsm0808.h/c lacks functionality to generate BSS_MAP_MSG_ASSIGMENT_RQST messages. These messages are required if the code is used in an MSC implementation. This commit adds a gsm0808_create_assignment() function, that generates an A/AoiP BSS_MAP_MSG_PAGING message. Change-Id: I4d1d455a1e1cf95407e23ded7b7defbcf2dd6ff0 --- M include/osmocom/gsm/gsm0808.h M src/gsm/gsm0808.c M src/gsm/libosmogsm.map M tests/gsm0808/gsm0808_test.c M tests/gsm0808/gsm0808_test.ok 5 files changed, 138 insertions(+), 0 deletions(-) git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/84/2184/1 diff --git a/include/osmocom/gsm/gsm0808.h b/include/osmocom/gsm/gsm0808.h index 6cd933b..aa8148a 100644 --- a/include/osmocom/gsm/gsm0808.h +++ b/include/osmocom/gsm/gsm0808.h @@ -41,6 +41,11 @@ struct msgb *gsm0808_create_classmark_update(const uint8_t *cm2, uint8_t cm2_len, const uint8_t *cm3, uint8_t cm3_len); struct msgb *gsm0808_create_sapi_reject(uint8_t link_id); +struct msgb *gsm0808_create_assignment(struct gsm0808_channel_type *ct, + uint16_t *cic, + struct sockaddr_storage *ss, + struct llist_head *scl, + uint32_t *ci); struct msgb *gsm0808_create_assignment_completed_aoip(uint8_t rr_cause, uint8_t chosen_channel, uint8_t encr_alg_id, diff --git a/src/gsm/gsm0808.c b/src/gsm/gsm0808.c index b6ae0fa..b43e2eb 100644 --- a/src/gsm/gsm0808.c +++ b/src/gsm/gsm0808.c @@ -255,6 +255,86 @@ return msg; } +struct msgb *gsm0808_create_assignment(struct gsm0808_channel_type *ct, + uint16_t *cic, + struct sockaddr_storage *ss, + struct llist_head *scl, uint32_t *ci) +{ + /* See also: 3GPP TS 48.008 3.2.1.1 ASSIGNMENT REQUEST */ + struct msgb *msg; + struct msgb *ct_encoded; + uint16_t cic_sw; + struct msgb *ss_encoded; + struct msgb *scl_encoded; + uint32_t ci_sw; + + /* Mandatory emelent! */ + OSMO_ASSERT(ct); + + msg = + msgb_alloc_headroom(BSSMAP_MSG_SIZE, BSSMAP_MSG_HEADROOM, + "bssmap: ass req"); + if (!msg) + return NULL; + + /* Message Type 3.2.2.1 */ + msgb_v_put(msg, BSS_MAP_MSG_ASSIGMENT_RQST); + + /* Channel Type 3.2.2.11 */ + ct_encoded = gsm0808_enc_channel_type(ct); + if (!ct_encoded) { + msgb_free(msg); + return NULL; + } + msgb_tlv_put(msg, GSM0808_IE_CHANNEL_TYPE, ct_encoded->len, +ct_encoded->data); + msgb_free(ct_encoded); + + /* Circuit Identity Code 3.2.2.2 */ + if (cic) { + cic_sw = htons(*cic); + msgb_tv_fixed_put(msg, GSM0808_IE_CIRCUIT_IDENTITY_CODE, + sizeof(cic_sw), (uint8_t *) & cic_sw); + } + + /* AoIP: AoIP Transport Layer Address (MGW) 3.2.2.102 */ + if (ss) { + ss_encoded = gsm0808_enc_aoip_trasp_addr(ss); + if (!ss_encoded) { + msgb_free(msg); + return NULL; + } + msgb_tlv_put(msg, GSM0808_IE_AOIP_TRASP_ADDR, +ss_encoded->len, ss_encoded->data); + msgb_free(ss_encoded); + } + + /* AoIP: Codec List (MSC Preferred) 3.2.2.103 */ + if (scl) { + scl_encoded = gsm0808_enc_speech_codec_list(scl); + if (!scl_encoded) { + msgb_free(msg); + return NULL; + } + msgb_tlv_put(msg, GSM0808_IE_SPEECH_CODEC_LIST, +scl_encoded->len, scl_encoded->data); + msgb_free(scl_encoded); + } + + /* AoIP: Call Identifier 3.2.2.105 */ + if (ci) { + ci_sw = htonl(*ci); + msgb_tv_fixed_put(msg, GSM0808_IE_CALL_ID, sizeof(ci_sw), + (uint8_t *) & ci_sw); + } + + /* push the bssmap header */ + msg->l3h = + msgb_tv_push(msg, BSSAP_MSG_BSS_MANAGEMENT, msgb_length(msg)); + + return msg; +} + struct msgb *gsm0808_create_assignment_completed_aoip(uint8_t rr_cause, uint8_t chosen_channel, uint8_t encr_alg_id, diff --git a/src/gsm/libosmogsm.map b/src/gsm/libosmogsm.map index fb06bff..fcd13d1 100644 --- a/src/gsm/libosmogsm.map +++ b/src/gsm/libosmogsm.map @@ -124,6 +124,7 @@