pespin has submitted this change. ( 
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(-)

Approvals:
  pespin: Looks good to me, approved
  Jenkins Builder: Verified




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,

--
To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/37489?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Change-Id: I4ac602865cf0c18036b411acff4562322b32933b
Gerrit-Change-Number: 37489
Gerrit-PatchSet: 2
Gerrit-Owner: pespin <[email protected]>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: pespin <[email protected]>
Gerrit-MessageType: merged

Reply via email to