diff options
Diffstat (limited to 'tests/msc_vlr/msc_vlr_tests.c')
-rw-r--r-- | tests/msc_vlr/msc_vlr_tests.c | 100 |
1 files changed, 76 insertions, 24 deletions
diff --git a/tests/msc_vlr/msc_vlr_tests.c b/tests/msc_vlr/msc_vlr_tests.c index 07a3927af..1e371bfd8 100644 --- a/tests/msc_vlr/msc_vlr_tests.c +++ b/tests/msc_vlr/msc_vlr_tests.c @@ -41,6 +41,7 @@ #include <osmocom/msc/msc_t.h> #include <osmocom/msc/call_leg.h> #include <osmocom/msc/rtp_stream.h> +#include <osmocom/msc/codec_sdp_cc_t9n.h> #include "msc_vlr_tests.h" @@ -75,6 +76,7 @@ bool bssap_clear_sent = false; bool bssap_assignment_expected = false; bool bssap_assignment_sent = false; +struct gsm0808_channel_type bssap_assignment_command_last_channel_type; bool iu_rab_assignment_expected = false; bool iu_rab_assignment_sent = false; @@ -82,9 +84,10 @@ uint32_t cc_to_mncc_tx_expected_msg_type = 0; const char *cc_to_mncc_tx_expected_imsi = NULL; bool cc_to_mncc_tx_confirmed = false; uint32_t cc_to_mncc_tx_got_callref = 0; +char cc_to_mncc_tx_last_sdp[1024] = {}; -enum rtp_direction expecting_crcx = -1; -bool got_crcx = false; +bool expecting_crcx[2] = {}; +bool got_crcx[2] = {}; extern int ran_dec_dtap_undup_pdisc_ctr_bin(uint8_t pdisc); @@ -306,14 +309,18 @@ static int bssap_validate_cipher_mode_cmd(const struct ran_cipher_mode_command * return 0; } -static void bssap_validate_assignment_cmd() +static void bssap_validate_assignment_cmd(const struct ran_assignment_command *assignment_command) { OSMO_ASSERT(bssap_assignment_expected); bssap_assignment_expected = false; bssap_assignment_sent = true; + if (assignment_command->channel_type) + bssap_assignment_command_last_channel_type = *assignment_command->channel_type; + else + bssap_assignment_command_last_channel_type = (struct gsm0808_channel_type){}; } -static void iucs_validate_assignment_cmd() +static void iucs_validate_assignment_cmd(const struct ran_assignment_command *assignment_command) { OSMO_ASSERT(iu_rab_assignment_expected); iu_rab_assignment_expected = false; @@ -373,10 +380,10 @@ struct msgb *dont_ran_encode(struct osmo_fsm_inst *caller_fi, const struct ran_m case RAN_MSG_ASSIGNMENT_COMMAND: switch (ran_type) { case OSMO_RAT_GERAN_A: - bssap_validate_assignment_cmd(); + bssap_validate_assignment_cmd(&ran_enc_msg->assignment_command); break; case OSMO_RAT_UTRAN_IU: - iucs_validate_assignment_cmd(); + iucs_validate_assignment_cmd(&ran_enc_msg->assignment_command); break; default: OSMO_ASSERT(false); @@ -418,7 +425,7 @@ static int fake_msc_a_ran_dec(const struct ran_msg *ran_dec_msg) return msc_a_ran_decode_cb(g_msub->role[MSC_ROLE_A], &d, ran_dec_msg); } -void rx_from_ms(struct msgb *msg) +void rx_from_ms(struct msgb *msg, const struct gsm0808_speech_codec_list *codec_list_bss_supported) { struct gsm48_hdr *gh = msgb_l3(msg); struct ran_msg ran_dec_msg; @@ -451,6 +458,7 @@ void rx_from_ms(struct msgb *msg) .compl_l3 = { .cell_id = &cell_id, .msg = msg, + .codec_list_bss_supported = codec_list_bss_supported, }, }; } else { @@ -478,7 +486,30 @@ void ms_sends_msg(const char *hex) msg = msgb_from_hex("ms_sends_msg", 1024, hex); msg->l1h = msg->l2h = msg->l3h = msg->data; - rx_from_ms(msg); + rx_from_ms(msg, NULL); + msgb_free(msg); +} + +void ms_sends_msgf(const char *fmt, ...) +{ + va_list ap; + char *hex; + + va_start(ap, fmt); + hex = talloc_vasprintf(msc_vlr_tests_ctx, fmt, ap); + va_end(ap); + + ms_sends_msg(hex); + talloc_free(hex); +} + +void ms_sends_compl_l3(const char *hex, const struct gsm0808_speech_codec_list *codec_list_bss_supported) +{ + struct msgb *msg; + + msg = msgb_from_hex("ms_sends_msg", 1024, hex); + msg->l1h = msg->l2h = msg->l3h = msg->data; + rx_from_ms(msg, codec_list_bss_supported); msgb_free(msg); } @@ -639,8 +670,8 @@ void clear_vlr() osmo_gettimeofday_override = false; - expecting_crcx = -1; - got_crcx = false; + memset(expecting_crcx, 0, sizeof(expecting_crcx)); + memset(got_crcx, 0, sizeof(got_crcx)); bssap_assignment_expected = false; bssap_assignment_sent = false; @@ -721,8 +752,18 @@ struct gsm_mncc *on_call_release_mncc_sends_to_cc_data = NULL; int mncc_recv(struct gsm_network *net, struct msgb *msg) { struct gsm_mncc *mncc = (void*)msg->data; - log("MSC --> MNCC: callref 0x%x: %s", mncc->callref, - get_mncc_name(mncc->msg_type)); + if (mncc->msg_type == MNCC_RTP_CREATE) { + struct gsm_mncc_rtp *rtp = (void*)msg->data; + log("MSC --> MNCC: callref 0x%x: %s\n%s", rtp->callref, + get_mncc_name(rtp->msg_type), + rtp->sdp); + OSMO_STRLCPY_ARRAY(cc_to_mncc_tx_last_sdp, rtp->sdp); + } else { + log("MSC --> MNCC: callref 0x%x: %s\n%s", mncc->callref, + get_mncc_name(mncc->msg_type), + mncc->sdp); + OSMO_STRLCPY_ARRAY(cc_to_mncc_tx_last_sdp, mncc->sdp); + } if (mncc->msg_type == MNCC_REL_IND && on_call_release_mncc_sends_to_cc_data) { @@ -834,27 +875,35 @@ struct rtp_stream fake_rtp[2] = { void expect_crcx(enum rtp_direction towards) { - OSMO_ASSERT(expecting_crcx == -1); - expecting_crcx = towards; - got_crcx = false; + OSMO_ASSERT(!expecting_crcx[towards]); + expecting_crcx[towards] = true; + got_crcx[towards] = false; +} + +bool crcx_scheduled(enum rtp_direction towards) +{ + return got_crcx[towards]; } /* override, requires '-Wl,--wrap=call_leg_ensure_ci' */ int __real_call_leg_ensure_ci(struct call_leg *cl, enum rtp_direction dir, uint32_t call_id, struct gsm_trans *for_trans, - const enum mgcp_codecs *codec_if_known, const struct osmo_sockaddr_str *remote_addr_if_known); + const struct sdp_audio_codecs *codecs_if_known, + const struct osmo_sockaddr_str *remote_addr_if_known); int __wrap_call_leg_ensure_ci(struct call_leg *cl, enum rtp_direction dir, uint32_t call_id, struct gsm_trans *for_trans, - const enum mgcp_codecs *codec_if_known, const struct osmo_sockaddr_str *remote_addr_if_known) + const struct sdp_audio_codecs *codecs_if_known, + const struct osmo_sockaddr_str *remote_addr_if_known) { if (!cl->rtp[dir]) { - log("MGW <--CRCX to %s-- MSC: callref=0x%x", rtp_direction_name(dir), call_id); + log("MGW <--CRCX to %s-- MSC: callref=0x%x codecs=%s", rtp_direction_name(dir), call_id, + codecs_if_known ? sdp_audio_codecs_name(codecs_if_known) : "unset"); - OSMO_ASSERT(expecting_crcx == dir); - expecting_crcx = -1; - got_crcx = true; + OSMO_ASSERT(expecting_crcx[dir]); + expecting_crcx[dir] = false; + got_crcx[dir] = true; call_leg_ensure_rtp_alloc(cl, dir, call_id, for_trans); - if (codec_if_known) - rtp_stream_set_codec(cl->rtp[dir], *codec_if_known); + if (codecs_if_known) + rtp_stream_set_codecs(cl->rtp[dir], codecs_if_known); if (remote_addr_if_known && osmo_sockaddr_str_is_nonzero(remote_addr_if_known)) rtp_stream_set_remote_addr(cl->rtp[dir], remote_addr_if_known); } @@ -998,9 +1047,12 @@ void ms_sends_security_mode_complete() g_msub = NULL; } -void ms_sends_assignment_complete(enum mgcp_codecs assigned_codec) +void ms_sends_assignment_complete(const char *sdp_codec_name) { struct ran_msg ran_dec; + const struct codec_mapping *m = codec_mapping_by_subtype_name(sdp_codec_name); + OSMO_ASSERT(m); + enum mgcp_codecs assigned_codec = m->mgcp; ran_dec = (struct ran_msg){ .msg_type = RAN_MSG_ASSIGNMENT_COMPLETE, |