aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2010-04-17 06:16:35 +0200
committerHolger Hans Peter Freyther <zecke@selfish.org>2010-04-17 06:16:35 +0200
commit81716d5fa865acebcf632549cb6979d6ffaeebb8 (patch)
tree346590348f3b62f5150ee50c81de0d47ce18b779
parent7daa01c434a20fa497a41393e53b894c7f1ed364 (diff)
gsm0808: Port cipher_complete to be part of libosmocore.
-rw-r--r--include/osmocore/gsm0808.h2
-rw-r--r--src/gsm0808.c31
2 files changed, 32 insertions, 1 deletions
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,