asterisk: Implement SIP UA unregister
Change-Id: I1ea6be662db00e52dbd39c4f54bb656dc4587ec7
diff --git a/asterisk/SIP_ConnectionHandler.ttcn b/asterisk/SIP_ConnectionHandler.ttcn
index 05f872f..892f5a3 100644
--- a/asterisk/SIP_ConnectionHandler.ttcn
+++ b/asterisk/SIP_ConnectionHandler.ttcn
@@ -61,6 +61,7 @@
SipUrl local_sip_url_ext,
SipAddr local_sip_record,
Contact local_contact,
+ Authorization authorization optional,
CallPars cp optional
}
type record of SIPConnHdlrPars SIPConnHdlrParsList;
@@ -147,6 +148,7 @@
ts_UserInfo(user))),
omit)
})),
+ authorization := omit,
cp := cp
}
@@ -299,10 +301,11 @@
as_SIP_expect_resp(exp);
/* Digest Auth: RFC 2617 */
- authorization := f_sip_digest_gen_Authorization_MD5(g_rx_sip_resp.msgHeader.wwwAuthenticate,
- g_pars.user, g_pars.password,
- "REGISTER",
- f_sip_SipUrl_to_str(g_pars.registrar_sip_req_uri))
+ g_pars.authorization :=
+ f_sip_digest_gen_Authorization_MD5(g_rx_sip_resp.msgHeader.wwwAuthenticate,
+ g_pars.user, g_pars.password,
+ "REGISTER",
+ f_sip_SipUrl_to_str(g_pars.registrar_sip_req_uri))
/* New transaction: */
g_pars.registrar_sip_seq_nr := g_pars.registrar_sip_seq_nr + 1;
@@ -320,7 +323,49 @@
g_pars.registrar_sip_seq_nr,
g_pars.local_contact,
ts_Expires("7200"),
- authorization := authorization));
+ authorization := g_pars.authorization));
+
+ /* Wait for OK answer */
+ exp := tr_SIP_Response(
+ g_pars.registrar_sip_call_id,
+ from_addr,
+ to_addr_exp,
+ f_tr_Via_response(via),
+ *,
+ "REGISTER", 200,
+ g_pars.registrar_sip_seq_nr, "OK");
+ as_SIP_expect_resp(exp);
+
+ /* Prepare for next use: */
+ g_pars.registrar_sip_seq_nr := g_pars.registrar_sip_seq_nr + 1;
+ return g_rx_sip_resp;
+}
+
+function f_SIP_unregister() runs on SIPConnHdlr return PDU_SIP_Response
+{
+ var template (present) PDU_SIP_Response exp;
+ var Via via := g_pars.local_via;
+ var From from_addr := valueof(ts_From(g_pars.registrar_sip_record.addr, g_pars.registrar_sip_record.params));
+ var To to_addr := valueof(ts_To(g_pars.registrar_sip_record.addr, g_pars.registrar_sip_record.params));
+ var template (present) To to_addr_exp := tr_To(tr_Addr_Union_from_val(to_addr.addressField), *);
+ var charstring branch_value;
+
+ branch_value := f_sip_gen_branch(f_sip_SipAddr_to_str(g_pars.registrar_sip_record),
+ f_sip_SipAddr_to_str(g_pars.registrar_sip_record),
+ g_pars.registrar_sip_call_id,
+ g_pars.registrar_sip_seq_nr);
+
+ via.viaBody[0].viaParams := f_sip_param_set(via.viaBody[0].viaParams, "branch", branch_value);
+ from_addr.fromParams := f_sip_param_set(from_addr.fromParams, "tag", f_sip_rand_tag());
+ SIP.send(ts_SIP_REGISTER(g_pars.registrar_sip_req_uri,
+ g_pars.registrar_sip_call_id,
+ from_addr,
+ to_addr,
+ via,
+ g_pars.registrar_sip_seq_nr,
+ g_pars.local_contact,
+ ts_Expires("0"),
+ authorization := g_pars.authorization));
/* Wait for OK answer */
exp := tr_SIP_Response(