BSSMAP: decode Codec List (BSS Supported)

Actually decode the Codec List (BSS Supported) in BSSMAP, in both the Complete
Layer 3 Information and the Assignment Complete messages.

An upcoming patch improves codec negotiation and requires the BSS supported
codecs, which are so far ignored (which is/was a pity as osmo-bsc goes at great
lengths to compose those IEs).

Change-Id: I66c735c79e982388f06b5de783aa584c9d13569e
This commit is contained in:
Neels Hofmeyr 2019-10-21 03:01:00 +02:00
parent 3f391dd77d
commit 8a50cfbc4e
2 changed files with 32 additions and 0 deletions

View File

@ -192,6 +192,7 @@ struct ran_msg {
union { union {
struct { struct {
const struct gsm0808_cell_id *cell_id; const struct gsm0808_cell_id *cell_id;
const struct gsm0808_speech_codec_list *codec_list_bss_supported;
struct msgb *msg; struct msgb *msg;
} compl_l3; } compl_l3;
struct msgb *dtap; struct msgb *dtap;
@ -226,6 +227,7 @@ struct ran_msg {
struct osmo_sockaddr_str remote_rtp; struct osmo_sockaddr_str remote_rtp;
bool codec_present; bool codec_present;
enum mgcp_codecs codec; enum mgcp_codecs codec;
const struct gsm0808_speech_codec_list *codec_list_bss_supported;
bool osmux_present; bool osmux_present;
uint8_t osmux_cid; uint8_t osmux_cid;
} assignment_complete; } assignment_complete;

View File

@ -52,6 +52,8 @@ static int ran_a_decode_l3_compl(struct ran_dec *ran_dec, struct msgb *msg, stru
struct gsm0808_cell_id cell_id; struct gsm0808_cell_id cell_id;
struct tlv_p_entry *ie_cell_id = TLVP_GET(tp, GSM0808_IE_CELL_IDENTIFIER); struct tlv_p_entry *ie_cell_id = TLVP_GET(tp, GSM0808_IE_CELL_IDENTIFIER);
struct tlv_p_entry *ie_l3_info = TLVP_GET(tp, GSM0808_IE_LAYER_3_INFORMATION); struct tlv_p_entry *ie_l3_info = TLVP_GET(tp, GSM0808_IE_LAYER_3_INFORMATION);
struct tlv_p_entry *ie_codec_list_bss_supported = TLVP_GET(tp, GSM0808_IE_SPEECH_CODEC_LIST);
struct gsm0808_speech_codec_list codec_list_bss_supported;
struct ran_msg ran_dec_msg = { struct ran_msg ran_dec_msg = {
.msg_type = RAN_MSG_COMPL_L3, .msg_type = RAN_MSG_COMPL_L3,
.msg_name = "BSSMAP Complete Layer 3 Information", .msg_name = "BSSMAP Complete Layer 3 Information",
@ -114,6 +116,19 @@ static int ran_a_decode_l3_compl(struct ran_dec *ran_dec, struct msgb *msg, stru
return -ENODATA; return -ENODATA;
} }
/* Decode Codec List (BSS Supported) */
if (ie_codec_list_bss_supported) {
rc = gsm0808_dec_speech_codec_list(&codec_list_bss_supported,
ie_codec_list_bss_supported->val, ie_codec_list_bss_supported->len);
if (rc < 0) {
LOG_RAN_A_DEC_MSG(LOGL_ERROR,
"Complete Layer 3 Information: unable to decode IE Codec List (BSS Supported)"
" (rc=%d), continuing anyway\n", rc);
/* This IE is not critical, do not abort with error. */
} else
ran_dec_msg.compl_l3.codec_list_bss_supported = &codec_list_bss_supported;
}
return ran_decoded(ran_dec, &ran_dec_msg); return ran_decoded(ran_dec, &ran_dec_msg);
} }
@ -261,10 +276,12 @@ 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_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_speech_codec = TLVP_GET(tp, GSM0808_IE_SPEECH_CODEC);
struct tlv_p_entry *ie_codec_list_bss_supported = TLVP_GET(tp, GSM0808_IE_SPEECH_CODEC_LIST);
struct tlv_p_entry *ie_osmux_cid = TLVP_GET(tp, GSM0808_IE_OSMO_OSMUX_CID); struct tlv_p_entry *ie_osmux_cid = TLVP_GET(tp, GSM0808_IE_OSMO_OSMUX_CID);
struct sockaddr_storage rtp_addr; struct sockaddr_storage rtp_addr;
struct sockaddr_in *rtp_addr_in; struct sockaddr_in *rtp_addr_in;
struct gsm0808_speech_codec sc; struct gsm0808_speech_codec sc;
struct gsm0808_speech_codec_list codec_list_bss_supported;
int rc; int rc;
struct ran_msg ran_dec_msg = { struct ran_msg ran_dec_msg = {
.msg_type = RAN_MSG_ASSIGNMENT_COMPLETE, .msg_type = RAN_MSG_ASSIGNMENT_COMPLETE,
@ -314,6 +331,19 @@ static int ran_a_decode_assignment_complete(struct ran_dec *ran_dec, struct msgb
ran_dec_msg.assignment_complete.codec = ran_a_mgcp_codec_from_sc(&sc); ran_dec_msg.assignment_complete.codec = ran_a_mgcp_codec_from_sc(&sc);
} }
if (ie_codec_list_bss_supported) {
/* Decode Codec List (BSS Supported) */
rc = gsm0808_dec_speech_codec_list(&codec_list_bss_supported,
ie_codec_list_bss_supported->val, ie_codec_list_bss_supported->len);
if (rc < 0) {
LOG_RAN_A_DEC_MSG(LOGL_ERROR,
"Assignment Complete: unable to decode IE Codec List (BSS Supported)"
" (rc=%d), continuing anyway\n", rc);
/* This IE is not critical, do not abort with error. */
} else
ran_dec_msg.assignment_complete.codec_list_bss_supported = &codec_list_bss_supported;
}
return ran_decoded(ran_dec, &ran_dec_msg); return ran_decoded(ran_dec, &ran_dec_msg);
} }