aboutsummaryrefslogtreecommitdiffstats
path: root/tests/msc_vlr/msc_vlr_tests.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/msc_vlr/msc_vlr_tests.c')
-rw-r--r--tests/msc_vlr/msc_vlr_tests.c100
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 e00c3379a..aaf127efe 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,