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(