diff options
-rw-r--r-- | include/osmocom/gsm/gsm0808.h | 3 | ||||
-rw-r--r-- | src/gsm/gsm0808.c | 9 | ||||
-rw-r--r-- | tests/gsm0808/gsm0808_test.c | 14 |
3 files changed, 19 insertions, 7 deletions
diff --git a/include/osmocom/gsm/gsm0808.h b/include/osmocom/gsm/gsm0808.h index 38d88ef9..5380dd9e 100644 --- a/include/osmocom/gsm/gsm0808.h +++ b/include/osmocom/gsm/gsm0808.h @@ -30,7 +30,8 @@ struct msgb *gsm0808_create_clear_command(uint8_t reason); struct msgb *gsm0808_create_clear_complete(void); struct msgb *gsm0808_create_cipher_complete(struct msgb *layer3, uint8_t alg_id); struct msgb *gsm0808_create_cipher_reject(uint8_t cause); -struct msgb *gsm0808_create_classmark_update(const uint8_t *classmark, uint8_t length); +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_completed(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 6c10177b..30098278 100644 --- a/src/gsm/gsm0808.c +++ b/src/gsm/gsm0808.c @@ -143,7 +143,8 @@ struct msgb *gsm0808_create_cipher_reject(uint8_t cause) return msg; } -struct msgb *gsm0808_create_classmark_update(const uint8_t *classmark_data, uint8_t length) +struct msgb *gsm0808_create_classmark_update(const uint8_t *cm2, uint8_t cm2_len, + const uint8_t *cm3, uint8_t cm3_len) { struct msgb *msg = msgb_alloc_headroom(BSSMAP_MSG_SIZE, BSSMAP_MSG_HEADROOM, "classmark-update"); @@ -151,8 +152,10 @@ struct msgb *gsm0808_create_classmark_update(const uint8_t *classmark_data, uint return NULL; msgb_v_put(msg, BSS_MAP_MSG_CLASSMARK_UPDATE); - msg->l4h = msgb_put(msg, length); - memcpy(msg->l4h, classmark_data, length); + msgb_tlv_put(msg, GSM0808_IE_CLASSMARK_INFORMATION_T2, cm2_len, cm2); + if (cm3) + msgb_tlv_put(msg, GSM0808_IE_CLASSMARK_INFORMATION_T3, + cm3_len, cm3); msg->l3h = msgb_tv_push(msg, BSSAP_MSG_BSS_MANAGEMENT, msgb_length(msg)); diff --git a/tests/gsm0808/gsm0808_test.c b/tests/gsm0808/gsm0808_test.c index 50838c84..7e5e97b5 100644 --- a/tests/gsm0808/gsm0808_test.c +++ b/tests/gsm0808/gsm0808_test.c @@ -136,13 +136,21 @@ static void test_create_cipher_reject() static void test_create_cm_u() { - static const uint8_t res[] = { 0x00, 0x02, 0x54, 0x23 }; + static const uint8_t res[] = { + 0x00, 0x07, 0x54, 0x12, 0x01, 0x23, 0x13, 0x01, 0x42 }; + static const uint8_t res2o[] = { + 0x00, 0x04, 0x54, 0x12, 0x01, 0x23 }; struct msgb *msg; - const uint8_t cm = 0x23; + const uint8_t cm2 = 0x23; + const uint8_t cm3 = 0x42; printf("Testing creating CM U\n"); - msg = gsm0808_create_classmark_update(&cm, 1); + msg = gsm0808_create_classmark_update(&cm2, 1, &cm3, 1); VERIFY(msg, res, ARRAY_SIZE(res)); + + msg = gsm0808_create_classmark_update(&cm2, 1, NULL, 0); + VERIFY(msg, res2o, ARRAY_SIZE(res2o)); + msgb_free(msg); } |