pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/37489?usp=email )
Change subject: asterisk: MO internal call: Expect direct rtp re-INVITE ......................................................................
asterisk: MO internal call: Expect direct rtp re-INVITE
Change-Id: I4ac602865cf0c18036b411acff4562322b32933b --- M asterisk/Asterisk_Tests.ttcn M asterisk/SIP_ConnectionHandler.ttcn 2 files changed, 70 insertions(+), 6 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/89/37489/1
diff --git a/asterisk/Asterisk_Tests.ttcn b/asterisk/Asterisk_Tests.ttcn index 9b5bb11..71d3576 100644 --- a/asterisk/Asterisk_Tests.ttcn +++ b/asterisk/Asterisk_Tests.ttcn @@ -213,7 +213,7 @@ COORD.send(COORD_CMD_REGISTERED);
COORD.receive(COORD_CMD_START); - f_SIP_mo_call_setup(); + f_SIP_mo_call_setup(exp_update_to_direct_rtp := g_pars.cp.exp_update_to_direct_rtp); COORD.send(COORD_CMD_CALL_ESTABLISHED); } private function f_TC_internal_hangup_call_mo_unregister() runs on SIPConnHdlr { @@ -271,7 +271,7 @@
if (g_pars.cp.exp_update_to_direct_rtp) { /* Once MO hangs up, Asterisk updates us to point RTP to it: */ - as_SIP_exp_call_update(g_pars.cp.sip_seq_nr + 1); + as_SIP_exp_mt_call_update(g_pars.cp.sip_seq_nr + 1); } as_SIP_exp_call_hangup(g_pars.cp.sip_seq_nr + 1);
@@ -716,6 +716,7 @@
private function f_ims_call_mo_configure(inout SIPConnHdlrPars sip_pars, inout IMS_ConnHdlrPars ims_pars, charstring tgt_ext_msisdn := "90829") runs on test_CT { + sip_pars.cp.exp_update_to_direct_rtp := false; sip_pars.cp.calling := sip_pars.registrar_sip_record; sip_pars.cp.called := valueof(ts_SipAddr(ts_HostPort(sip_pars.remote_sip_host), ts_UserInfo(tgt_ext_msisdn))); diff --git a/asterisk/SIP_ConnectionHandler.ttcn b/asterisk/SIP_ConnectionHandler.ttcn index 49fa04c..c3d955a 100644 --- a/asterisk/SIP_ConnectionHandler.ttcn +++ b/asterisk/SIP_ConnectionHandler.ttcn @@ -467,7 +467,8 @@ }
function f_SIP_mo_call_setup(template (present) integer exp_status_code := 200, - template (present) charstring exp_reason := "OK") runs on SIPConnHdlr + template (present) charstring exp_reason := "OK", + boolean exp_update_to_direct_rtp := false) runs on SIPConnHdlr { var template (value) PDU_SIP_Request req; var template (present) PDU_SIP_Response exp; @@ -545,9 +546,62 @@ g_pars.cp.sip_seq_nr, omit); SIP.send(req); + + if (exp_update_to_direct_rtp) { + /* Asterisk will now update the session to connect us to MT directly: */ + /* Via is not kept since anyway "branch" will change upon following INVITE. */ + as_SIP_exp_mo_call_update(?); + } + g_pars.cp.sip_seq_nr := g_pars.cp.sip_seq_nr + 1; }
+/* New (re-)INVITE arrives after MO call is established. Accept it: */ +altstep as_SIP_exp_mo_call_update(template (present) integer exp_seq_nr := ?, boolean fail_others := true) runs on SIPConnHdlr +{ + var template (present) PDU_SIP_Request exp_req := + tr_SIP_INVITE(f_tr_SipUrl_opt_defport(g_pars.local_sip_url_ext), + ?, + tr_From(tr_Addr_Union_from_val(g_pars.cp.called.addr), *), + tr_To(tr_Addr_Union_from_val(g_pars.cp.calling.addr), *), + tr_Via_from(f_tr_HostPort(g_pars.remote_sip_host, g_pars.remote_sip_port)), + exp_seq_nr, + body := ?); + 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 charstring tx_sdp; + + f_SDP_decodeMessage(g_rx_sip_req.messageBody, g_pars.cp.peer_sdp); + log("Rx Update MO INVITE decoded SDP: ", g_pars.cp.peer_sdp); + + /* Tx 200 OK */ + tx_sdp := f_gen_sdp(); + tx_resp := ts_SIP_Response(g_rx_sip_req.msgHeader.callId.callid, + g_rx_sip_req.msgHeader.fromField, + g_rx_sip_req.msgHeader.toField, + "INVITE", 200, + g_rx_sip_req.msgHeader.cSeq.seqNumber, + "OK", + g_rx_sip_req.msgHeader.via, + body := tx_sdp); + SIP.send(tx_resp); + + /* Wait for ACK */ + exp_req := tr_SIP_ACK(f_tr_SipUrl_opt_defport(g_pars.local_sip_url_ext), + g_rx_sip_req.msgHeader.callId.callid, + g_rx_sip_req.msgHeader.fromField, + g_rx_sip_req.msgHeader.toField, + f_tr_Via_response(g_rx_sip_req.msgHeader.via), + g_rx_sip_req.msgHeader.cSeq.seqNumber, + *); + as_SIP_expect_req(exp_req); + } + [fail_others] as_SIP_fail_resp(sip_expect_str); + [fail_others] as_SIP_fail_req(sip_expect_str); +} + private function f_ConnHdlr_parse_initial_SIP_INVITE(PDU_SIP_Request rx_sip_req) runs on SIPConnHdlr { f_SDP_decodeMessage(rx_sip_req.messageBody, g_pars.cp.peer_sdp); @@ -621,7 +675,7 @@ if (exp_update_to_direct_rtp) { /* Asterisk will now update the session to connect us to MO directly: */ /* Via is not kept since anyway "branch" will change upon following INVITE. */ - as_SIP_exp_call_update(g_pars.cp.sip_seq_nr + 1); + as_SIP_exp_mt_call_update(g_pars.cp.sip_seq_nr + 1); } } [fail_others] as_SIP_fail_resp(sip_expect_str); @@ -694,7 +748,7 @@ }
/* New INVITE arrives after MT call is established. Accept it: */ -altstep as_SIP_exp_call_update(template (present) integer exp_seq_nr := ?, boolean fail_others := true) runs on SIPConnHdlr +altstep as_SIP_exp_mt_call_update(template (present) integer exp_seq_nr := ?, boolean fail_others := true) runs on SIPConnHdlr { var template (present) PDU_SIP_Request exp_req := tr_SIP_INVITE(f_tr_SipUrl_opt_defport(g_pars.local_sip_url_ext), @@ -760,7 +814,7 @@ via := g_pars.local_via; via.viaBody[0].viaParams := f_sip_param_set(via.viaBody[0].viaParams, "branch", branch_value);
- /* Transmit ACK */ + /* Transmit BYE */ req := ts_SIP_BYE(g_pars.cp.sip_call_id, g_pars.cp.from_addr, g_pars.cp.to_addr,