diff options
author | Neels Hofmeyr <nhofmeyr@sysmocom.de> | 2023-11-28 04:45:09 +0100 |
---|---|---|
committer | neels <nhofmeyr@sysmocom.de> | 2023-12-13 01:52:22 +0000 |
commit | b51c35e846ce4f9b288056eb71db0e6421d7d99e (patch) | |
tree | 6d1721af3bcc6627c68b2c426125a242ec438873 /tests/msc_vlr/msc_vlr_test_call.c | |
parent | 11c04ae38341b9727a6303127f792dbc1f456676 (diff) |
msc_vlr_test_call: codecs: properly test new codec matching
In patch I8760feaa8598047369ef8c3ab2673013bac8ac8a, osmo-msc learns to
handle codec mismatches reported by MT. For simplicity, that patch cuts
short the msc_vlr codecs tests by validating only the first codec.
Now test the full list of codecs properly.
This also introduces testing the re-assignment that MO does to match
MT's codec limitations, and removes the "EXPECTED FAILURE" markers.
Related: OS#6258
Change-Id: Ib933554f826c1b4347dfa3f6c4f6fe086be8b133
Diffstat (limited to 'tests/msc_vlr/msc_vlr_test_call.c')
-rw-r--r-- | tests/msc_vlr/msc_vlr_test_call.c | 116 |
1 files changed, 89 insertions, 27 deletions
diff --git a/tests/msc_vlr/msc_vlr_test_call.c b/tests/msc_vlr/msc_vlr_test_call.c index 1264dfd55..b89ea8009 100644 --- a/tests/msc_vlr/msc_vlr_test_call.c +++ b/tests/msc_vlr/msc_vlr_test_call.c @@ -824,6 +824,11 @@ struct codec_test { const char *mt_tx_sdp_mncc_rtp_create[8]; const char *mt_tx_sdp_mncc_alert_ind[8]; + + bool mo_expect_reassignment; + enum gsm0808_permitted_speech mo_tx_reassignment_perm_speech[8]; + const char *mo_rx_reassigned_codec; + const char *mt_tx_sdp_mncc_setup_cnf[8]; const char *mt_rx_sdp_mncc_setup_compl_req[8]; @@ -878,23 +883,33 @@ static const struct codec_test codec_tests[] = { .mo_rx_sdp_mncc_rtp_create = {}, .mo_tx_assignment_perm_speech = PERM_SPEECH_ALL_GSM, .mo_rx_assigned_codec = "AMR", - .mo_tx_sdp_mncc_rtp_create = { "AMR" }, + .mo_tx_sdp_mncc_rtp_create = { "AMR", "GSM-EFR", "GSM", "GSM-HR-08" }, /* mt_rx_sdp_mncc_setup_req == mo_tx_sdp_mncc_rtp_create */ .mt_rx_compl_l3_codec_list_bss_supported = CODEC_LIST_ALL_GSM, .mt_tx_cc_setup_bcap = { GSM48_BCAP_SV_AMR_F, GSM48_BCAP_SV_AMR_H, GSM48_BCAP_SV_AMR_OH, + GSM48_BCAP_SV_EFR, + GSM48_BCAP_SV_FR, + GSM48_BCAP_SV_HR, LIST_END }, .mt_rx_ms_bcap = BCAP_ALL_GSM, .mt_tx_sdp_mncc_call_conf_ind = {}, .mt_rx_sdp_mncc_rtp_create = {}, - .mt_tx_assignment_perm_speech = { GSM0808_PERM_FR3, GSM0808_PERM_HR3, LIST_END }, + .mt_tx_assignment_perm_speech = { + GSM0808_PERM_FR3, + GSM0808_PERM_HR3, + GSM0808_PERM_FR2, + GSM0808_PERM_FR1, + GSM0808_PERM_HR1, + LIST_END + }, .mt_rx_assigned_codec = "AMR", - .mt_tx_sdp_mncc_rtp_create = { "AMR" }, - .mt_tx_sdp_mncc_alert_ind = { "AMR" }, - .mt_tx_sdp_mncc_setup_cnf = { "AMR" }, + .mt_tx_sdp_mncc_rtp_create = { "AMR", "GSM-EFR", "GSM", "GSM-HR-08" }, + .mt_tx_sdp_mncc_alert_ind = { "AMR", "GSM-EFR", "GSM", "GSM-HR-08" }, + .mt_tx_sdp_mncc_setup_cnf = { "AMR", "GSM-EFR", "GSM", "GSM-HR-08" }, .mo_tx_sdp_mncc_setup_compl_ind = {}, }, @@ -945,49 +960,83 @@ static const struct codec_test codec_tests[] = { }, { - .desc = "FR1 picked by MT's Codec List (BSS Supported), hence MO also picks FR1 (EXPECTED FAILURE)", - /* Currently the MO Assignment happens before MT gets a chance to send its available codecs. - * So even though the MO side would be able to assign FR1 and match MT, this is established too late - * and MO mismatches MT. This can only be fixed by a) moving MO Assignment to after MT Assignment - * or b) doing a Channel Mode Change or re-assignment after MT Assignment -- since re-assigning might - * need an lchan type change and means more overhead, a) would be the best option. */ + .desc = "FR1 picked by MT's Codec List (BSS Supported), hence MO re-assigns to FR1", .mo_rx_compl_l3_codec_list_bss_supported = CODEC_LIST_ALL_GSM, .mo_rx_ms_bcap = BCAP_ALL_GSM, .mo_tx_sdp_mncc_setup_ind = SDP_CODECS_ALL_GSM, .mo_rx_sdp_mncc_rtp_create = {}, .mo_tx_assignment_perm_speech = PERM_SPEECH_ALL_GSM, - .mo_rx_assigned_codec = "AMR", /* <- Early Assignment means codec mismatch */ - .mo_tx_sdp_mncc_rtp_create = { "AMR" }, + .mo_rx_assigned_codec = "AMR", /* <- Early Assignment first picks a mismatching codec */ + .mo_tx_sdp_mncc_rtp_create = { "AMR", "GSM-EFR", "GSM", "GSM-HR-08" }, + /* This is the codec limitation this test verifies, Codec List (BSS Supported): */ .mt_rx_compl_l3_codec_list_bss_supported = { GSM0808_SCT_FR1, LIST_END }, - .expect_codec_mismatch_on_paging_response = true, - /* The mismatching codec AMR vs. GSM means the call fails (in the lack of transcoding) */ + + /* from above codec list, MSC derives the limited bcap sent in CC Setup to MS */ + .mt_tx_cc_setup_bcap = { + GSM48_BCAP_SV_FR, + LIST_END + }, + /* MS could do more, but it doesn't affect the choice of FR1 */ + .mt_rx_ms_bcap = BCAP_ALL_GSM, + .mt_tx_sdp_mncc_call_conf_ind = {}, + .mt_rx_sdp_mncc_rtp_create = {}, + .mt_tx_assignment_perm_speech = { + GSM0808_PERM_FR1, + LIST_END + }, + .mt_rx_assigned_codec = "GSM", + .mt_tx_sdp_mncc_rtp_create = { "GSM" }, + .mt_tx_sdp_mncc_alert_ind = { "GSM" }, + + .mo_expect_reassignment = true, + .mo_tx_reassignment_perm_speech = { + GSM0808_PERM_FR1, + LIST_END + }, + .mo_rx_reassigned_codec = "GSM", + + .mt_tx_sdp_mncc_setup_cnf = { "GSM" }, + .mo_tx_sdp_mncc_setup_compl_ind = {}, }, { - .desc = "FR1 picked by MT's MS Bearer Capability, hence MO also picks FR1 (EXPECTED FAILURE)", - /* Like above, MO Assignment happens too early to be able to match MT's codec availability. */ + .desc = "FR1 picked by MT's MS Bearer Capability, hence MO re-assigns to FR1", .mo_rx_compl_l3_codec_list_bss_supported = CODEC_LIST_ALL_GSM, .mo_rx_ms_bcap = BCAP_ALL_GSM, .mo_tx_sdp_mncc_setup_ind = SDP_CODECS_ALL_GSM, .mo_rx_sdp_mncc_rtp_create = {}, .mo_tx_assignment_perm_speech = PERM_SPEECH_ALL_GSM, - .mo_rx_assigned_codec = "AMR", /* <- Early Assignment means codec mismatch */ - .mo_tx_sdp_mncc_rtp_create = { "AMR" }, + .mo_rx_assigned_codec = "AMR", /* <- Early Assignment first picks a mismatching codec */ + .mo_tx_sdp_mncc_rtp_create = { "AMR", "GSM-EFR", "GSM", "GSM-HR-08" }, .mt_rx_compl_l3_codec_list_bss_supported = CODEC_LIST_ALL_GSM, - .mt_tx_cc_setup_bcap = { - GSM48_BCAP_SV_AMR_F, - GSM48_BCAP_SV_AMR_H, - GSM48_BCAP_SV_AMR_OH, + .mt_tx_cc_setup_bcap = BCAP_ALL_GSM, + + /* This is the codec limitation this test verifies: */ + .mt_rx_ms_bcap = { + GSM48_BCAP_SV_FR, LIST_END }, - .mt_rx_ms_bcap = { GSM48_BCAP_SV_FR, LIST_END }, .mt_tx_sdp_mncc_call_conf_ind = {}, .mt_rx_sdp_mncc_rtp_create = {}, - .mt_tx_assignment_perm_speech = { GSM0808_PERM_FR3, GSM0808_PERM_HR3, LIST_END }, - .expect_codec_mismatch_on_cc_call_conf = true, - /* The mismatching codec AMR vs. GSM means the call fails (in the lack of transcoding) */ + .mt_tx_assignment_perm_speech = { + GSM0808_PERM_FR1, + LIST_END + }, + .mt_rx_assigned_codec = "GSM", + .mt_tx_sdp_mncc_rtp_create = { "GSM" }, + .mt_tx_sdp_mncc_alert_ind = { "GSM" }, + + .mo_expect_reassignment = true, + .mo_tx_reassignment_perm_speech = { + GSM0808_PERM_FR1, + LIST_END + }, + .mo_rx_reassigned_codec = "GSM", + + .mt_tx_sdp_mncc_setup_cnf = { "GSM" }, + .mo_tx_sdp_mncc_setup_compl_ind = {}, }, }; @@ -1258,10 +1307,23 @@ static void test_codecs_mo(const struct codec_test *t) btw("The other call leg got established (not shown here), MNCC tells us so, with codecs {%s }", strlist_name(t->mo_rx_sdp_mncc_alert_req)); dtap_expect_tx("8301" /* CC: Call Alerting */); + + if (t->mo_expect_reassignment) { + btw("Expecting re-assignment"); + expect_bssap_assignment(); + } + sdp_str_from_subtype_names(mncc.sdp, sizeof(mncc.sdp), t->mo_rx_sdp_mncc_alert_req); mncc_sends_to_cc(MNCC_ALERT_REQ, &mncc); OSMO_ASSERT(dtap_tx_confirmed); + if (t->mo_expect_reassignment) { + btw("Validating re-assignment"); + OSMO_ASSERT(bssap_assignment_sent); + VALIDATE_PERM_SPEECH(&bssap_assignment_command_last_channel_type, t->mo_tx_reassignment_perm_speech); + ms_sends_assignment_complete(t->mo_rx_reassigned_codec); + } + dtap_expect_tx("8307" /* CC: Connect */); sdp_str_from_subtype_names(mncc.sdp, sizeof(mncc.sdp), t->mo_rx_sdp_mncc_setup_rsp); mncc_sends_to_cc(MNCC_SETUP_RSP, &mncc); |