pespin has uploaded this change for review.
WIP: asterisk: Initial IMS registration
Change-Id: Idb3b19ccd82cad25948106b2c72aa424d7f79cd8
---
M asterisk/Asterisk_Tests.ttcn
M asterisk/IMS_ConnectionHandler.ttcn
2 files changed, 202 insertions(+), 2 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/59/36759/1
diff --git a/asterisk/Asterisk_Tests.ttcn b/asterisk/Asterisk_Tests.ttcn
index 08a5f65..67e73e0 100644
--- a/asterisk/Asterisk_Tests.ttcn
+++ b/asterisk/Asterisk_Tests.ttcn
@@ -37,6 +37,7 @@
charstring mp_local_ims_host := "127.0.0.3";
integer mp_local_ims_port := 5060;
+ charstring mp_ims_imsi := "238010000090828";
/* Asterisk AMI: */
charstring mp_ami_remote_host := "127.0.0.1";
@@ -45,6 +46,7 @@
integer mp_ami_local_port := 0;
charstring mp_ami_user := "test_user";
charstring mp_ami_secret := "1234";
+ charstring mp_volte_ims_outbound_registration := "volte_ims";
}
type component test_CT {
@@ -74,6 +76,15 @@
return valueof(pars);
}
+function f_init_IMS_ConnHdlrPars(integer idx := 1) runs on test_CT return IMS_ConnHdlrPars {
+ var template (value) IMS_CallPars cp := t_IMS_CallPars(mp_local_sip_host, 1234 + 2*idx);
+ var template (value) IMS_ConnHdlrPars pars := t_IMS_Pars(mp_local_ims_host,
+ mp_local_ims_port,
+ mp_ims_imsi,
+ cp := cp);
+ return valueof(pars);
+}
+
/* Initialize connection towards Asterisk AMI */
private function f_init_ami() runs on test_CT {
var charstring id := "Asterisk_Tests_AMI_EMU";
@@ -139,6 +150,22 @@
return vc_conn;
}
+function f_start_handler_IMS(ims_void_fn fn, IMS_ConnHdlrPars pars)
+runs on test_CT return IMS_ConnHdlr {
+ var IMS_ConnHdlr vc_conn;
+ var charstring id := testcasename() & "-IMS_ConnHdlr-" & pars.user;
+
+ vc_conn := IMS_ConnHdlr.create(id) alive;
+
+ connect(vc_conn:SIP, vc_IMS:CLIENT);
+ connect(vc_conn:SIP_PROC, vc_IMS:CLIENT_PROC);
+
+ connect(vc_conn:COORD, self:IMS_COORD);
+
+ vc_conn.start(f_ims_handler_init(fn, id, pars));
+ return vc_conn;
+}
+
/* Test SIP registration of local clients */
private function f_TC_internal_registration(charstring id) runs on SIPConnHdlr {
@@ -322,12 +349,49 @@
setverdict(pass);
}
+/* Test SIP registration of local clients */
+private function f_TC_ims_registration(charstring id) runs on IMS_ConnHdlr {
+ f_create_sip_expect(valueof(ts_SipUrl_from_Addr_Union(g_pars.registrar_sip_record.addr)));
+ as_IMS_register();
+ setverdict(pass);
+}
+testcase TC_ims_registration() runs on test_CT {
+ var IMS_ConnHdlrPars pars;
+ var IMS_ConnHdlr vc_conn;
+ f_init();
+ pars := f_init_IMS_ConnHdlrPars();
+ vc_conn := f_start_handler_IMS(refers(f_TC_ims_registration), pars);
+
+ /* Clear events: */
+ AMI_CLIENT.clear;
+ /* Trigger registration: */
+ f_ami_action_PJSIPRegister(AMI_CLIENT, mp_volte_ims_outbound_registration);
+ /* TODO: Rx "Event: AuthRequest" */
+ /* TODO: Tx "Action: AuthResponse" */
+ /* TODO: Rx "Response: Success" */
+ /* TODO: once registration is successful, rx:
+ * Event: Registry
+ * ChannelType: pjsip
+ * Username: <value>
+ * Domain: <value>
+ * Status: <value>
+ * Cause: <value> */
+
+ /* TODO: test "Action: PJSIPUnregister" */
+
+ /* TODO: in another test emulating a call, test "Action: DedicatedBearerStatus" */
+
+ vc_conn.done;
+ f_shutdown();
+}
+
control {
execute( TC_internal_registration() );
execute( TC_internal_call_momt() );
execute( TC_internal_call_all_2registered() );
execute( TC_internal_call_all_3registered() );
execute( TC_internal_call_all_4registered() );
+ execute( TC_ims_registration() );
}
}
diff --git a/asterisk/IMS_ConnectionHandler.ttcn b/asterisk/IMS_ConnectionHandler.ttcn
index a1baeb4..cded5fc 100644
--- a/asterisk/IMS_ConnectionHandler.ttcn
+++ b/asterisk/IMS_ConnectionHandler.ttcn
@@ -43,8 +43,8 @@
type record IMS_ConnHdlrPars {
float t_guard,
- charstring remote_sip_host,
- uint16_t remote_sip_port,
+ charstring remote_sip_host optional,
+ uint16_t remote_sip_port optional,
charstring user,
charstring display_name,
charstring password,
@@ -66,6 +66,10 @@
/* Whether to expect CANCEL instead of ACK as answer to our OK */
boolean exp_cancel
}
+template (value) IMS_CallParsMT t_IMS_CallParsMT := {
+ wait_coord_cmd_pickup := false,
+ exp_cancel := false
+}
type record IMS_CallPars {
SipAddr calling optional,
@@ -85,4 +89,127 @@
IMS_CallParsMT mt
}
+template (value) IMS_CallPars t_IMS_CallPars(charstring local_rtp_addr,
+ uint16_t local_rtp_port := 0,
+ template (omit) SipAddr calling := omit,
+ template (omit) SipAddr called := omit) := {
+ calling := calling,
+ called := called,
+ from_addr := omit,
+ to_addr := omit,
+ sip_call_id := hex2str(f_rnd_hexstring(15)),
+ sip_seq_nr := f_sip_rand_seq_nr(),
+ sip_body := omit,
+ local_rtp_addr := local_rtp_addr,
+ local_rtp_port := local_rtp_port,
+ peer_sdp := omit,
+ mt := t_IMS_CallParsMT
+}
+
+template (value) IMS_ConnHdlrPars t_IMS_Pars(charstring local_sip_host,
+ uint16_t local_sip_port,
+ charstring user,
+ charstring display_name := "Anonymous",
+ charstring password := "secret",
+ template (omit) IMS_CallPars cp := omit) := {
+ t_guard := 30.0,
+ remote_sip_host := omit,
+ remote_sip_port := omit,
+ user := user,
+ display_name := f_sip_str_quote(display_name),
+ password := password,
+ registrar_sip_req_uri := valueof(ts_SipUrlHost(local_sip_host)),
+ registrar_sip_record := ts_SipAddr(ts_HostPort(local_sip_host),
+ ts_UserInfo(user),
+ f_sip_str_quote(display_name)),
+ registrar_sip_call_id := hex2str(f_rnd_hexstring(15)) & "@" & local_sip_host,
+ registrar_sip_seq_nr := f_sip_rand_seq_nr(),
+ local_via := ts_Via_from(ts_HostPort(local_sip_host, local_sip_port)),
+ local_sip_url_ext := ts_SipUrl(ts_HostPort(local_sip_host, local_sip_port),
+ ts_UserInfo(user)),
+ local_sip_record := ts_SipAddr(ts_HostPort(local_sip_host),
+ ts_UserInfo(user)),
+ local_contact := valueof(ts_Contact({
+ ts_ContactAddress(
+ ts_Addr_Union_SipUrl(ts_SipUrl(ts_HostPort(
+ local_sip_host,
+ local_sip_port),
+ ts_UserInfo(user))),
+ omit)
+ })),
+ cp := cp
+}
+
+private altstep as_Tguard() runs on IMS_ConnHdlr {
+ [] g_Tguard.timeout {
+ setverdict(fail, "Tguard timeout");
+ mtc.stop;
+ }
+}
+
+type function ims_void_fn(charstring id) runs on IMS_ConnHdlr;
+function f_ims_handler_init(ims_void_fn fn, charstring id, IMS_ConnHdlrPars pars)
+runs on IMS_ConnHdlr {
+ g_name := id;
+ g_pars := pars;
+ g_Tguard.start(pars.t_guard);
+ activate(as_Tguard());
+
+ /* call the user-supied test case function */
+ fn.apply(id);
+}
+
+private altstep as_SIP_fail_req(charstring exp_msg_str := "") runs on IMS_ConnHdlr
+{
+ var PDU_SIP_Request sip_req;
+ [] SIP.receive(PDU_SIP_Request:?) -> value sip_req {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
+ log2str(g_name & ": Received unexpected SIP Req message := ", sip_req, "\nvs exp := ", exp_msg_str));
+ }
+}
+
+private altstep as_SIP_fail_resp(charstring exp_msg_str := "") runs on IMS_ConnHdlr
+{
+ var PDU_SIP_Response sip_resp;
+ [] SIP.receive(PDU_SIP_Response:?) -> value sip_resp {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
+ log2str(g_name & ": Received unexpected SIP Resp message := ", sip_resp, "\nvs exp := ", exp_msg_str));
+ }
+}
+
+/* Peer is calling us, accept it: */
+altstep as_IMS_register(boolean exp_update_to_direct_rtp := true,
+ boolean fail_others := true) runs on IMS_ConnHdlr
+{
+ var template (present) PDU_SIP_Request exp_req :=
+ tr_SIP_REGISTER(g_pars.registrar_sip_req_uri,
+ ?,
+ tr_SipAddr(),
+ tr_SipAddr(),
+ tr_Via_from(?));
+ var charstring sip_expect_str := log2str(exp_req);
+
+ [] SIP.receive(exp_req) -> value g_rx_sip_req {
+ var template (value) PDU_SIP_Response tx_resp;
+ var Via via;
+ var charstring tx_sdp;
+
+ via := g_rx_sip_req.msgHeader.via;
+
+ /* Tx 200 OK
+ * TODO: Tx Unauthorized instead, with IMS params */
+ tx_resp := ts_SIP_Response(g_pars.cp.sip_call_id,
+ g_pars.cp.from_addr,
+ g_pars.cp.to_addr,
+ "REGISTER", 200,
+ g_pars.cp.sip_seq_nr,
+ "OK",
+ via);
+ SIP.send(tx_resp);
+ }
+ [fail_others] as_SIP_fail_resp(sip_expect_str);
+ [fail_others] as_SIP_fail_req(sip_expect_str);
+
+}
+
}
To view, visit change 36759. To unsubscribe, or for help writing mail filters, visit settings.