aboutsummaryrefslogtreecommitdiffstats
path: root/src/libmsc/ran_msg_a.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libmsc/ran_msg_a.c')
-rw-r--r--src/libmsc/ran_msg_a.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/src/libmsc/ran_msg_a.c b/src/libmsc/ran_msg_a.c
index 64590a1fe..fd8afdccd 100644
--- a/src/libmsc/ran_msg_a.c
+++ b/src/libmsc/ran_msg_a.c
@@ -269,6 +269,7 @@ static int ran_a_decode_assignment_complete(struct ran_dec *ran_dec, struct msgb
{
struct tlv_p_entry *ie_aoip_transp_addr = TLVP_GET(tp, GSM0808_IE_AOIP_TRASP_ADDR);
struct tlv_p_entry *ie_speech_codec = TLVP_GET(tp, GSM0808_IE_SPEECH_CODEC);
+ struct tlv_p_entry *ie_osmux_cid = TLVP_GET(tp, GSM0808_IE_OSMO_OSMUX_CID);
struct sockaddr_storage rtp_addr;
struct sockaddr_in *rtp_addr_in;
struct gsm0808_speech_codec sc;
@@ -300,6 +301,15 @@ static int ran_a_decode_assignment_complete(struct ran_dec *ran_dec, struct msgb
}
}
+ if (ie_osmux_cid) {
+ rc = gsm0808_dec_osmux_cid(&ran_dec_msg.assignment_complete.osmux_cid, ie_osmux_cid->val, ie_osmux_cid->len);
+ if (rc < 0) {
+ LOG_RAN_A_DEC_MSG(LOGL_ERROR, "Unable to decode Osmux CID\n");
+ return -EINVAL;
+ }
+ ran_dec_msg.assignment_complete.osmux_present = true;
+ }
+
if (ie_speech_codec) {
/* Decode Speech Codec (Chosen) element */
rc = gsm0808_dec_speech_codec(&sc, ie_speech_codec->val, ie_speech_codec->len);
@@ -902,6 +912,13 @@ static int ran_a_channel_type_to_speech_codec_list(struct gsm0808_speech_codec_l
return 0;
}
+static void _gsm0808_assignment_extend_osmux(struct msgb *msg, uint8_t cid)
+{
+ OSMO_ASSERT(msg->l3h[1] == msgb_l3len(msg) - 2); /*TL not in len */
+ msgb_tv_put(msg, GSM0808_IE_OSMO_OSMUX_CID, cid);
+ msg->l3h[1] = msgb_l3len(msg) - 2;
+}
+
/* Compose a BSSAP Assignment Command.
* Passing an RTP address is optional.
* The msub is passed merely for error logging. */
@@ -912,6 +929,7 @@ static struct msgb *ran_a_make_assignment_command(struct osmo_fsm_inst *log_fi,
struct gsm0808_speech_codec_list *use_scl = NULL;
struct sockaddr_storage rtp_addr;
struct sockaddr_storage *use_rtp_addr = NULL;
+ struct msgb *msg;
int rc;
if (!ac->channel_type) {
@@ -952,7 +970,10 @@ static struct msgb *ran_a_make_assignment_command(struct osmo_fsm_inst *log_fi,
}
}
- return gsm0808_create_ass(ac->channel_type, NULL, use_rtp_addr, use_scl, NULL);
+ msg = gsm0808_create_ass(ac->channel_type, NULL, use_rtp_addr, use_scl, NULL);
+ if (ac->osmux_present)
+ _gsm0808_assignment_extend_osmux(msg, ac->osmux_cid);
+ return msg;
}
/* For an A5/N number a5_n set dst to the matching GSM0808_ALG_ID_A5_<n>. */