diff options
author | Holger Hans Peter Freyther <zecke@selfish.org> | 2010-04-17 06:21:49 +0200 |
---|---|---|
committer | Holger Hans Peter Freyther <zecke@selfish.org> | 2010-04-17 06:21:49 +0200 |
commit | ba6172a7fd3e4fcb609ca1e0ac693022e4810dad (patch) | |
tree | 6401f5b06d157173ad288678fb686296767e1653 | |
parent | 81716d5fa865acebcf632549cb6979d6ffaeebb8 (diff) |
gsm0808: Port asiggnment_complete msg creation to libosmocore.
-rw-r--r-- | include/osmocore/gsm0808.h | 8 | ||||
-rw-r--r-- | src/gsm0808.c | 48 |
2 files changed, 51 insertions, 5 deletions
diff --git a/include/osmocore/gsm0808.h b/include/osmocore/gsm0808.h index 65c66504..a40713f7 100644 --- a/include/osmocore/gsm0808.h +++ b/include/osmocore/gsm0808.h @@ -31,13 +31,11 @@ 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); +struct msgb *gsm0808_create_assignment_completed(struct gsm_lchan *lchan, uint8_t rr_cause, + uint8_t chosen_channel, uint8_t encr_alg_id, + uint8_t speech_mode); struct msgb *gsm0808_create_assignment_failure(uint8_t cause, uint8_t *rr_cause); 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); -#endif - #endif diff --git a/src/gsm0808.c b/src/gsm0808.c index ab32a830..9f6f0059 100644 --- a/src/gsm0808.c +++ b/src/gsm0808.c @@ -187,6 +187,54 @@ struct msgb *gsm0808_create_sapi_reject(uint8_t link_id) return msg; } +struct msgb *gsm0808_create_assignment_completed(struct gsm_lchan *lchan, uint8_t rr_cause, + uint8_t chosen_channel, uint8_t encr_alg_id, + uint8_t speech_mode) +{ + u_int8_t *data; + + struct msgb *msg = msgb_alloc(35, "bssmap: ass compl"); + if (!msg) + return NULL; + + msg->l3h = msgb_put(msg, 3); + msg->l3h[0] = BSSAP_MSG_BSS_MANAGEMENT; + msg->l3h[1] = 0xff; + msg->l3h[2] = BSS_MAP_MSG_ASSIGMENT_COMPLETE; + + /* write 3.2.2.22 */ + data = msgb_put(msg, 2); + data[0] = GSM0808_IE_RR_CAUSE; + data[1] = rr_cause; + + /* write cirtcuit identity code 3.2.2.2 */ + /* write cell identifier 3.2.2.17 */ + /* write chosen channel 3.2.2.33 when BTS picked it */ + data = msgb_put(msg, 2); + data[0] = GSM0808_IE_CHOSEN_CHANNEL; + data[1] = chosen_channel; + + /* write chosen encryption algorithm 3.2.2.44 */ + data = msgb_put(msg, 2); + data[0] = GSM0808_IE_CHOSEN_ENCR_ALG; + data[1] = encr_alg_id; + + /* write circuit pool 3.2.2.45 */ + /* write speech version chosen: 3.2.2.51 when BTS picked it */ + if (speech_mode != 0) { + data = msgb_put(msg, 2); + data[0] = GSM0808_IE_SPEECH_VERSION; + data[1] = speech_mode; + } + + /* write LSA identifier 3.2.2.15 */ + + + /* update the size */ + msg->l3h[1] = msgb_l3len(msg) - 2; + return msg; +} + struct msgb *gsm0808_create_assignment_failure(uint8_t cause, uint8_t *rr_cause) { uint8_t *data; |