From 81716d5fa865acebcf632549cb6979d6ffaeebb8 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Sat, 17 Apr 2010 06:16:35 +0200 Subject: gsm0808: Port cipher_complete to be part of libosmocore. --- include/osmocore/gsm0808.h | 2 +- src/gsm0808.c | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/include/osmocore/gsm0808.h b/include/osmocore/gsm0808.h index 0ea78da4..65c66504 100644 --- a/include/osmocore/gsm0808.h +++ b/include/osmocore/gsm0808.h @@ -27,6 +27,7 @@ struct msgb; struct msgb *gsm0808_create_layer3(struct msgb *msg, uint16_t netcode, uint16_t countrycode, int lac, int ci); struct msgb *gsm0808_create_reset(void); 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_sapi_reject(uint8_t link_id); @@ -37,7 +38,6 @@ const struct tlv_definition *gsm0808_att_tlvdef(); /* needs to be ported */ #if 0 struct msgb *bssmap_create_assignment_completed(struct gsm_lchan *lchan, uint8_t rr_cause); -struct msgb *bssmap_create_cipher_complete(struct msgb *layer3); #endif #endif diff --git a/src/gsm0808.c b/src/gsm0808.c index 67e62288..ab32a830 100644 --- a/src/gsm0808.c +++ b/src/gsm0808.c @@ -103,6 +103,37 @@ struct msgb *gsm0808_create_clear_complete(void) return msg; } +struct msgb *gsm0808_create_cipher_complete(struct msgb *layer3, uint8_t alg_id) +{ + struct msgb *msg = msgb_alloc_headroom(BSSMAP_MSG_SIZE, BSSMAP_MSG_HEADROOM, + "cipher-complete"); + if (!msg) + return NULL; + + /* send response with BSS override for A5/1... cheating */ + msg->l3h = msgb_put(msg, 3); + msg->l3h[0] = BSSAP_MSG_BSS_MANAGEMENT; + msg->l3h[1] = 0xff; + msg->l3h[2] = BSS_MAP_MSG_CIPHER_MODE_COMPLETE; + + /* include layer3 in case we have at least two octets */ + if (layer3 && msgb_l3len(layer3) > 2) { + msg->l4h = msgb_put(msg, msgb_l3len(layer3) + 2); + msg->l4h[0] = GSM0808_IE_LAYER_3_MESSAGE_CONTENTS; + msg->l4h[1] = msgb_l3len(layer3); + memcpy(&msg->l4h[2], layer3->l3h, msgb_l3len(layer3)); + } + + /* and the optional BSS message */ + msg->l4h = msgb_put(msg, 2); + msg->l4h[0] = GSM0808_IE_CHOSEN_ENCR_ALG; + msg->l4h[1] = alg_id; + + /* update the size */ + msg->l3h[1] = msgb_l3len(msg) - 2; + return msg; +} + struct msgb *gsm0808_create_cipher_reject(uint8_t cause) { struct msgb *msg = msgb_alloc_headroom(BSSMAP_MSG_SIZE, BSSMAP_MSG_HEADROOM, -- cgit v1.2.3