asterisk: Split SIPConnHdlr to its own file

Change-Id: I168920887bfd05c0a1785c5cb7ac485edaef0df2
diff --git a/asterisk/Asterisk_Tests.ttcn b/asterisk/Asterisk_Tests.ttcn
index c883bac..b164ee5 100644
--- a/asterisk/Asterisk_Tests.ttcn
+++ b/asterisk/Asterisk_Tests.ttcn
@@ -26,6 +26,8 @@
 import from SIPmsg_Types all;
 import from SIP_Templates all;
 
+import from SIP_ConnectionHandler all;
+
 modulepar {
 	charstring mp_local_sip_host := "127.0.0.2";
 	integer mp_local_sip_port := 5060;
@@ -37,135 +39,25 @@
 	charstring mp_ami_secret := "1234";
 }
 
-type port Coord_PT message
-{
-	inout charstring;
-} with { extension "internal" };
-private const charstring COORD_CMD_REGISTERED := "COORD_CMD_REGISTERED";
-private const charstring COORD_CMD_START := "COORD_CMD_START";
-private const charstring COORD_CMD_PICKUP := "COORD_CMD_PICKUP";
-private const charstring COORD_CMD_CALL_ESTABLISHED := "COORD_CMD_CALL_ESTABLISHED";
-private const charstring COORD_CMD_CALL_CANCELLED := "COORD_CMD_CALL_CANCELLED";
-private const charstring COORD_CMD_HANGUP := "COORD_CMD_HANGUP";
-
 type component test_CT {
 	var SIP_Emulation_CT vc_SIP;
 	port TELNETasp_PT AMI;
 	port Coord_PT COORD;
 }
 
-type component ConnHdlr extends SIP_ConnHdlr {
-	var charstring g_name;
-	var ConnHdlrPars g_pars;
-	timer g_Tguard;
-	var PDU_SIP_Request g_rx_sip_req;
-	var PDU_SIP_Response g_rx_sip_resp;
-
-	port Coord_PT COORD;
-}
-type record of ConnHdlr ConnHdlrList;
-
 const charstring broadcast_sip_extension := "0500";
 
-type record ConnHdlrPars {
-	float t_guard,
-	charstring user,
-	charstring display_name,
-	charstring password,
-	SipUrl registrar_sip_req_uri,
-	SipAddr registrar_sip_record,
-	CallidString registrar_sip_call_id,
-	integer registrar_sip_seq_nr,
-	Via local_via,
-	SipUrl local_sip_url_ext,
-	SipAddr local_sip_record,
-	Contact local_contact,
-	CallPars cp optional
-}
-type record of ConnHdlrPars ConnHdlrParsList;
-
-template (value) ConnHdlrPars t_Pars(charstring user,
-				     charstring display_name := "Anonymous",
-				     charstring password := "secret",
-				     template (value) CallPars cp := t_CallPars()) := {
-	t_guard := 30.0,
-	user := user,
-	display_name := f_sip_str_quote(display_name),
-	password := password,
-	registrar_sip_req_uri := valueof(ts_SipUrlHost(mp_remote_sip_host)),
-	registrar_sip_record := ts_SipAddr(ts_HostPort(mp_remote_sip_host),
-					   ts_UserInfo(user),
-					   f_sip_str_quote(display_name)),
-	registrar_sip_call_id := hex2str(f_rnd_hexstring(15)) & "@" & mp_local_sip_host,
-	registrar_sip_seq_nr := f_sip_rand_seq_nr(),
-	local_via := ts_Via_from(ts_HostPort(mp_local_sip_host, mp_local_sip_port)),
-	local_sip_url_ext := ts_SipUrl(ts_HostPort(mp_local_sip_host, mp_local_sip_port),
-				       ts_UserInfo(user)),
-	local_sip_record := ts_SipAddr(ts_HostPort(mp_local_sip_host),
-				       ts_UserInfo(user)),
-	local_contact := valueof(ts_Contact({
-					ts_ContactAddress(
-						ts_Addr_Union_SipUrl(ts_SipUrl(ts_HostPort(
-										 mp_local_sip_host,
-										 mp_local_sip_port),
-									       ts_UserInfo(user))),
-						omit)
-				})),
-	cp := cp
-}
-
-function f_init_ConnHdlrPars(integer idx := 1) runs on test_CT return ConnHdlrPars {
-	var  template (value) CallPars cp := t_CallPars(idx := idx);
-	var template (value) ConnHdlrPars pars := t_Pars("0" & int2str(str2int(broadcast_sip_extension) + idx),
-							 cp := cp);
+function f_init_ConnHdlrPars(integer idx := 1) runs on test_CT return SIPConnHdlrPars {
+	var template (value) CallPars cp := t_CallPars(mp_local_sip_host, 1234 + 2*idx);
+	var template (value) SIPConnHdlrPars pars := t_Pars(mp_local_sip_host,
+							    mp_local_sip_port,
+							    mp_remote_sip_host,
+							    mp_remote_sip_port,
+							    "0" & int2str(str2int(broadcast_sip_extension) + idx),
+							    cp := cp);
 	return valueof(pars);
 }
 
-type record CallParsMT {
-	/* Whether to wait for COORD.receive(COORD_CMD_PICKUP) before accepting the call. */
-	boolean wait_coord_cmd_pickup,
-	/* Whether to expect CANCEL instead of ACK as answer to our OK */
-	boolean exp_cancel
-}
-private template (value) CallParsMT t_CallParsMT := {
-	wait_coord_cmd_pickup := false,
-	exp_cancel := false
-}
-
-type record CallPars {
-	SipAddr calling optional,
-	SipAddr called optional,
-
-	SipAddr from_addr optional,
-	SipAddr to_addr optional,
-
-	CallidString sip_call_id,
-	integer sip_seq_nr,
-	charstring sip_body optional,
-
-	charstring local_rtp_addr,
-	uint16_t local_rtp_port,
-
-	SDP_Message peer_sdp optional,
-	CallParsMT mt
-}
-
-private template (value) CallPars t_CallPars(integer idx := 1,
-					     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 := mp_local_sip_host,
-	local_rtp_port := 1234 + 2*idx,
-	peer_sdp := omit,
-	mt := t_CallParsMT
-}
-
 /* Initialize connection towards Asterisk AMI */
 private function f_init_ami() runs on test_CT {
 	map(self:AMI, system:AMI);
@@ -178,14 +70,12 @@
 	log("end of f_init");
 }
 
-type function void_fn(charstring id) runs on ConnHdlr;
-
-function f_start_handler(void_fn fn, ConnHdlrPars pars)
-runs on test_CT return ConnHdlr {
-	var ConnHdlr vc_conn;
+function f_start_handler(void_fn fn, SIPConnHdlrPars pars)
+runs on test_CT return SIPConnHdlr {
+	var SIPConnHdlr vc_conn;
 	var charstring id := testcasename() & "-ConnHdlr-" & pars.user;
 
-	vc_conn := ConnHdlr.create(id) alive;
+	vc_conn := SIPConnHdlr.create(id) alive;
 
 	connect(vc_conn:SIP, vc_SIP:CLIENT);
 	connect(vc_conn:SIP_PROC, vc_SIP:CLIENT_PROC);
@@ -196,572 +86,16 @@
 	return vc_conn;
 }
 
-private altstep as_Tguard() runs on ConnHdlr {
-	[] g_Tguard.timeout {
-		setverdict(fail, "Tguard timeout");
-		mtc.stop;
-	}
-}
-
-private function f_handler_init(void_fn fn, charstring id, ConnHdlrPars pars)
-runs on ConnHdlr {
-	g_name := id;
-	g_pars := pars;
-	g_Tguard.start(pars.t_guard);
-	activate(as_Tguard());
-
-	// Make sure the UA is deregistered before starting the test:
-	// sends REGISTER with Contact = "*" and Expires = 0
-	//f_SIP_deregister();
-
-	/* call the user-supied test case function */
-	fn.apply(id);
-}
-
-private altstep as_SIP_fail_req(charstring exp_msg_str := "") runs on 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 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));
-	}
-}
-
-altstep as_SIP_expect_req(template (present) PDU_SIP_Request sip_expect, boolean fail_others := true) runs on ConnHdlr
-{
-	var charstring sip_expect_str := log2str(sip_expect);
-	[] SIP.receive(sip_expect) -> value g_rx_sip_req;
-	[fail_others] as_SIP_fail_req(sip_expect_str);
-	[fail_others] as_SIP_fail_resp(sip_expect_str);
-}
-
-altstep as_SIP_expect_resp(template (present) PDU_SIP_Response sip_expect, boolean fail_others := true) runs on ConnHdlr
-{
-	var charstring sip_expect_str := log2str(sip_expect);
-	[] SIP.receive(sip_expect) -> value g_rx_sip_resp;
-	[fail_others] as_SIP_fail_resp(sip_expect_str);
-	[fail_others] as_SIP_fail_req(sip_expect_str);
-}
-
-altstep as_SIP_ignore_resp(template PDU_SIP_Response sip_expect := ?) runs on ConnHdlr
-{
-	[] SIP.receive(sip_expect) -> value g_rx_sip_resp {
-		log("Ignoring ", g_rx_sip_resp);
-		repeat;
-	}
-}
-
-private function f_tr_Via_response(Via via_req) return template (present) Via {
-	template (present) SemicolonParam_List via_resp_params := ?;
-
-	/*via_resp_params := {
-		{ id := "rport", paramValue := int2str(mp_remote_sip_port) },
-		{ id := "received", paramValue := mp_remote_sip_host }
-	}; */
-	return 	tr_Via_from(via_req.viaBody[0].sentBy,
-			    via_resp_params);
-}
-
-private function f_tr_To_response(template (value) SipAddr to_req) return template (present) SipAddr {
-	return tr_SipAddr_from_val(to_req);
-}
-
-private function f_tr_From(template (value) SipAddr from_req) return template (present) SipAddr {
-	return tr_SipAddr_from_val(from_req);
-}
-
-private function f_gen_sdp() runs on ConnHdlr return charstring {
-	var charstring sdp :=
-		"v=0\r\n" &
-		"o=0502 2390 1824 IN IP4 " & g_pars.cp.local_rtp_addr & "\r\n" &
-		"s=Talk\r\n" &
-		"c=IN IP4 " & g_pars.cp.local_rtp_addr & "\r\n" &
-		"t=0 0\r\n" &
-		"a=rtcp-xr:rcvr-rtt=all:10000 stat-summary=loss,dup,jitt,TTL voip-metrics\r\n" &
-		"a=record:off\r\n" &
-		"m=audio " & int2str(g_pars.cp.local_rtp_port) & " RTP/AVP 96 97 98 0 8 18 99 100 101\r\n" &
-		"a=rtpmap:96 opus/48000/2\r\n" &
-		"a=fmtp:96 useinbandfec=1\r\n" &
-		"a=rtpmap:97 speex/16000\r\n" &
-		"a=fmtp:97 vbr=on\r\n" &
-		"a=rtpmap:98 speex/8000\r\n" &
-		"a=fmtp:98 vbr=on\r\n" &
-		"a=fmtp:18 annexb=yes\r\n" &
-		"a=rtpmap:99 telephone-event/48000\r\n" &
-		"a=rtpmap:100 telephone-event/16000\r\n" &
-		"a=rtpmap:101 telephone-event/8000\r\n" &
-		"a=rtcp:" & int2str(g_pars.cp.local_rtp_port + 1) & "\r\n" &
-		"a=rtcp-fb:* trr-int 1000\r\n" &
-		"a=rtcp-fb:* ccm tmmbr\r\n";
-	return sdp;
-}
-
-private function f_SIP_register() runs on ConnHdlr return PDU_SIP_Response
-{
-	var template (present) PDU_SIP_Response exp;
-	var Authorization authorization;
-	var Via via := g_pars.local_via;
-	var SipAddr from_sipaddr := g_pars.registrar_sip_record;
-	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_sipaddr.params := f_sip_param_set(from_sipaddr.params, "tag", f_sip_rand_tag());
-	SIP.send(ts_SIP_REGISTER(g_pars.registrar_sip_req_uri,
-				 g_pars.registrar_sip_call_id,
-				 from_sipaddr,
-				 g_pars.registrar_sip_record,
-				 via,
-				 g_pars.registrar_sip_seq_nr,
-				 g_pars.local_contact,
-				 ts_Expires("7200")));
-
-	exp := tr_SIP_Response_Unauthorized(
-			g_pars.registrar_sip_call_id,
-			from_sipaddr,
-			f_tr_To_response(g_pars.registrar_sip_record),
-			f_tr_Via_response(via),
-			*,
-			tr_WwwAuthenticate({tr_Challenge_digestCln(?)}),
-			g_pars.registrar_sip_seq_nr);
-	as_SIP_expect_resp(exp);
-
-	/* Digest Auth: RFC 2617 */
-	authorization := f_sip_digest_gen_Authorization(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;
-	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);
-
-	SIP.send(ts_SIP_REGISTER(g_pars.registrar_sip_req_uri,
-				g_pars.registrar_sip_call_id,
-				from_sipaddr,
-				g_pars.registrar_sip_record,
-				via,
-				g_pars.registrar_sip_seq_nr,
-				g_pars.local_contact,
-				ts_Expires("7200"),
-				authorization := authorization));
-
-	/* Wait for OK answer */
-	exp := tr_SIP_Response(
-			g_pars.registrar_sip_call_id,
-			from_sipaddr,
-			f_tr_To_response(g_pars.registrar_sip_record),
-			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;
-}
-
-private function f_SIP_mo_call_setup() runs on ConnHdlr
-{
-	var template (value) PDU_SIP_Request req;
-	var template (present) PDU_SIP_Response exp;
-	var Via via;
-	var charstring tx_sdp := f_gen_sdp();
-	var default d_trying, d_ringing;
-	var charstring branch_value;
-
-	/* RFC 3261 8.1.1.3 From */
-	g_pars.cp.from_addr := g_pars.cp.calling;
-	g_pars.cp.from_addr.params := f_sip_param_set(g_pars.cp.from_addr.params, "tag", f_sip_rand_tag());
-	g_pars.cp.to_addr := g_pars.cp.called;
-	branch_value := f_sip_gen_branch(f_sip_SipAddr_to_str(g_pars.cp.from_addr),
-					 f_sip_SipAddr_to_str(valueof(g_pars.cp.to_addr)),
-					 g_pars.cp.sip_call_id,
-					 g_pars.cp.sip_seq_nr);
-	via := g_pars.local_via;
-	via.viaBody[0].viaParams := f_sip_param_set(via.viaBody[0].viaParams, "branch", branch_value);
-
-	req := ts_SIP_INVITE(g_pars.cp.sip_call_id,
-			     g_pars.cp.from_addr,
-			     g_pars.cp.to_addr,
-			     via,
-			     g_pars.local_contact,
-			     g_pars.cp.sip_seq_nr,
-			     body := tx_sdp);
-
-	SIP.send(req);
-
-	/* RFC 3261 22.2: */
-	exp := tr_SIP_Response_Unauthorized(
-			g_pars.cp.sip_call_id,
-			f_tr_From(g_pars.cp.from_addr),
-			f_tr_To_response(g_pars.cp.to_addr),
-			f_tr_Via_response(via),
-			*,
-			tr_WwwAuthenticate({tr_Challenge_digestCln(?)}),
-			g_pars.cp.sip_seq_nr, "INVITE");
-	as_SIP_expect_resp(exp);
-
-	/* Digest Auth: RFC 2617 */
-	req.msgHeader.authorization := f_sip_digest_gen_Authorization(
-						g_rx_sip_resp.msgHeader.wwwAuthenticate,
-						g_pars.user, g_pars.password,
-						"INVITE",
-						f_sip_SipUrl_to_str(g_pars.registrar_sip_req_uri))
-	g_pars.cp.sip_seq_nr := g_pars.cp.sip_seq_nr + 1;
-	f_sip_Request_inc_seq_nr(req);
-	SIP.send(req);
-
-	/* Conditionally match and accept 100 Trying. */
-	exp := tr_SIP_Response_Trying(g_pars.cp.sip_call_id,
-			g_pars.cp.from_addr,
-			f_tr_To_response(g_pars.cp.to_addr),
-			f_tr_Via_response(via),
-			g_pars.cp.sip_seq_nr, "INVITE");
-	d_trying := activate(as_SIP_ignore_resp(exp));
-
-	/* Conditionally match and accept 180 Ringing */
-	exp := tr_SIP_Response_Ringing(g_pars.cp.sip_call_id,
-			g_pars.cp.from_addr,
-			f_tr_To_response(g_pars.cp.to_addr),
-			f_tr_Via_response(via),
-			g_pars.cp.sip_seq_nr, "INVITE");
-	d_ringing := activate(as_SIP_ignore_resp(exp));
-
-	/* Wait for OK answer */
-	exp := tr_SIP_Response(
-			g_pars.cp.sip_call_id,
-			g_pars.cp.from_addr,
-			f_tr_To_response(g_pars.cp.to_addr),
-			f_tr_Via_response(via),
-			*,
-			"INVITE", 200,
-			g_pars.cp.sip_seq_nr, "OK",
-			body := ?);
-	as_SIP_expect_resp(exp, fail_others := false);
-
-	deactivate(d_trying);
-	deactivate(d_ringing);
-
-	/* Update To with the tags received from peer: */
-	g_pars.cp.to_addr := valueof(ts_SipAddr_from_Addr_Union(g_rx_sip_resp.msgHeader.toField.addressField,
-								g_rx_sip_resp.msgHeader.toField.toParams));
-
-	/* Transmit ACK */
-	g_pars.cp.sip_seq_nr := g_pars.cp.sip_seq_nr + 1;
-	req := ts_SIP_ACK(g_pars.cp.sip_call_id,
-			  g_pars.cp.from_addr,
-			  g_pars.cp.to_addr,
-			  via,
-			  g_pars.cp.sip_seq_nr,
-			  omit);
-	SIP.send(req);
-	g_pars.cp.sip_seq_nr := g_pars.cp.sip_seq_nr + 1;
-}
-
-private function f_ConnHdlr_parse_initial_SIP_INVITE(PDU_SIP_Request rx_sip_req) runs on ConnHdlr
-{
-	f_SDP_decodeMessage(rx_sip_req.messageBody, g_pars.cp.peer_sdp);
-	log("Rx Initial MT INVITE decoded SDP: ", g_pars.cp.peer_sdp);
-
-	/* Obtain params: */
-	g_pars.cp.sip_call_id := rx_sip_req.msgHeader.callId.callid;
-	g_pars.cp.from_addr := valueof(ts_SipAddr_from_Addr_Union(rx_sip_req.msgHeader.fromField.addressField,
-								rx_sip_req.msgHeader.fromField.fromParams));
-	g_pars.cp.to_addr := valueof(ts_SipAddr_from_Addr_Union(rx_sip_req.msgHeader.toField.addressField,
-								rx_sip_req.msgHeader.toField.toParams));
-	g_pars.cp.to_addr.params := f_sip_param_set(g_pars.cp.to_addr.params, "tag", f_sip_rand_tag());
-	g_pars.cp.sip_seq_nr := rx_sip_req.msgHeader.cSeq.seqNumber;
-}
-
-/* Peer is calling us, accept it: */
-private altstep as_SIP_mt_call_accept(boolean exp_update_to_direct_rtp := true,
-				      boolean fail_others := true) runs on ConnHdlr
-{
-	var template (present) PDU_SIP_Request exp_req :=
-		tr_SIP_INVITE(f_tr_SipUrl_opt_defport(g_pars.local_sip_url_ext),
-			      ?,
-			      f_tr_From(g_pars.cp.calling),
-			      g_pars.cp.called,
-			      tr_Via_from(f_tr_HostPort(mp_remote_sip_host, mp_remote_sip_port)),
-			      ?, ?);
-	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;
-
-		/* Obtain params: */
-		f_ConnHdlr_parse_initial_SIP_INVITE(g_rx_sip_req);
-		via := g_rx_sip_req.msgHeader.via;
-
-
-		/* Tx 180 Ringing */
-		tx_resp := ts_SIP_Response_Ringing(g_pars.cp.sip_call_id,
-						g_pars.cp.from_addr,
-						g_pars.cp.to_addr,
-						via,
-						g_pars.cp.sip_seq_nr);
-		SIP.send(tx_resp);
-
-		if (g_pars.cp.mt.wait_coord_cmd_pickup) {
-			COORD.receive(COORD_CMD_PICKUP);
-		}
-
-		/* Tx 200 OK */
-		tx_sdp := f_gen_sdp();
-		tx_resp := ts_SIP_Response(g_pars.cp.sip_call_id,
-					g_pars.cp.from_addr,
-					g_pars.cp.to_addr,
-					"INVITE", 200,
-					g_pars.cp.sip_seq_nr,
-					"OK",
-					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_pars.cp.sip_call_id,
-				g_pars.cp.from_addr,
-				g_pars.cp.to_addr,
-				f_tr_Via_response(via),
-				g_pars.cp.sip_seq_nr, *);
-		as_SIP_expect_req(exp_req);
-
-		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);
-		}
-	}
-	[fail_others] as_SIP_fail_resp(sip_expect_str);
-	[fail_others] as_SIP_fail_req(sip_expect_str);
-
-}
-
-/* Peer is calling us, but cancells it during ringing: */
-private altstep as_SIP_mt_call_cancelled(boolean fail_others := true) runs on ConnHdlr
-{
-	var template (present) PDU_SIP_Request exp_req :=
-		tr_SIP_INVITE(f_tr_SipUrl_opt_defport(g_pars.local_sip_url_ext),
-			      ?,
-			      f_tr_From(g_pars.cp.calling),
-			      g_pars.cp.called,
-			      tr_Via_from(f_tr_HostPort(mp_remote_sip_host, mp_remote_sip_port)),
-			      ?, ?);
-	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 template (present) SipAddr exp_to_addr;
-		var charstring tx_sdp;
-
-		/* Obtain params: */
-		f_ConnHdlr_parse_initial_SIP_INVITE(g_rx_sip_req);
-		via := g_rx_sip_req.msgHeader.via;
-
-
-		/* Tx 180 Ringing */
-		tx_resp := ts_SIP_Response_Ringing(g_pars.cp.sip_call_id,
-						g_pars.cp.from_addr,
-						g_pars.cp.to_addr,
-						via,
-						g_pars.cp.sip_seq_nr);
-		SIP.send(tx_resp);
-
-		if (g_pars.cp.mt.wait_coord_cmd_pickup) {
-			COORD.receive(COORD_CMD_PICKUP);
-		}
-
-		/* Wait for CANCEL */
-		/* Cancel may come even before we send Ringing, hence To's "tag"
-		 * may not be known by peer, so g_pars.to_addr can't be used here: */
-		exp_to_addr := ts_SipAddr_from_Addr_Union(g_rx_sip_req.msgHeader.toField.addressField,
-							  g_rx_sip_req.msgHeader.toField.toParams);
-		exp_req := tr_SIP_CANCEL(f_tr_SipUrl_opt_defport(g_pars.local_sip_url_ext),
-					 g_pars.cp.sip_call_id,
-					 g_pars.cp.from_addr,
-					 exp_to_addr,
-					 f_tr_Via_response(via),
-					 g_pars.cp.sip_seq_nr, *);
-		as_SIP_expect_req(exp_req);
-
-		/* Tx 200 OK */
-		tx_sdp := f_gen_sdp();
-		tx_resp := ts_SIP_Response(g_pars.cp.sip_call_id,
-					   g_pars.cp.from_addr,
-					   g_pars.cp.to_addr,
-					   "CANCEL", 200,
-					   g_pars.cp.sip_seq_nr,
-					   "OK",
-					   via,
-					   body := omit);
-		SIP.send(tx_resp);
-	}
-	[fail_others] as_SIP_fail_resp(sip_expect_str);
-	[fail_others] as_SIP_fail_req(sip_expect_str);
-
-}
-
-/* New INVITE arrives after MT call is established. Accept it: */
-private altstep as_SIP_exp_call_update(template (present) integer exp_seq_nr := ?, boolean fail_others := true) runs on ConnHdlr
-{
-	var template (present) PDU_SIP_Request exp_req :=
-		tr_SIP_INVITE(f_tr_SipUrl_opt_defport(g_pars.local_sip_url_ext),
-				 		      g_pars.cp.sip_call_id,
-				 		      g_pars.cp.from_addr,
-				 		      g_pars.cp.to_addr,
-				 		      tr_Via_from(f_tr_HostPort(mp_remote_sip_host, mp_remote_sip_port)),
-				 		      exp_seq_nr,
-				 		      ?);
-	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;
-		var Via via;
-
-		f_SDP_decodeMessage(g_rx_sip_req.messageBody, g_pars.cp.peer_sdp);
-		log("Rx Update MT INVITE decoded SDP: ", g_pars.cp.peer_sdp);
-
-		/* Update parameters: */
-		g_pars.cp.sip_seq_nr := g_rx_sip_req.msgHeader.cSeq.seqNumber;
-		/* "branch" has changed: */
-		via := g_rx_sip_req.msgHeader.via;
-
-		/* Tx 200 OK */
-		tx_sdp := f_gen_sdp();
-		tx_resp := ts_SIP_Response(g_pars.cp.sip_call_id,
-					g_pars.cp.from_addr,
-					g_pars.cp.to_addr,
-					"INVITE", 200,
-					g_pars.cp.sip_seq_nr,
-					"OK",
-					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_pars.cp.sip_call_id,
-				g_pars.cp.from_addr,
-				g_pars.cp.to_addr,
-				f_tr_Via_response(via),
-				g_pars.cp.sip_seq_nr, *);
-		as_SIP_expect_req(exp_req);
-	}
-	[fail_others] as_SIP_fail_resp(sip_expect_str);
-	[fail_others] as_SIP_fail_req(sip_expect_str);
-}
-
-/* Tx BYE: */
-private function f_SIP_do_call_hangup() runs on ConnHdlr
-{
-	var template (value) PDU_SIP_Request req;
-	var template (present) PDU_SIP_Response exp_resp;
-	var Via via;
-	var charstring branch_value;
-
-	branch_value := f_sip_gen_branch(f_sip_SipAddr_to_str(g_pars.cp.from_addr),
-					 f_sip_SipAddr_to_str(valueof(g_pars.cp.to_addr)),
-					 g_pars.cp.sip_call_id,
-					 g_pars.cp.sip_seq_nr);
-
-	via := g_pars.local_via;
-	via.viaBody[0].viaParams := f_sip_param_set(via.viaBody[0].viaParams, "branch", branch_value);
-
-	/* Transmit ACK */
-	req := ts_SIP_BYE(g_pars.cp.sip_call_id,
-			  g_pars.cp.from_addr,
-			  g_pars.cp.to_addr,
-			  via,
-			  g_pars.cp.sip_seq_nr,
-			  omit);
-	SIP.send(req);
-
-	/* Wait for OK answer */
-	exp_resp := tr_SIP_Response(
-			g_pars.cp.sip_call_id,
-			g_pars.cp.from_addr,
-			f_tr_To_response(g_pars.cp.to_addr),
-			f_tr_Via_response(via),
-			*,
-			"BYE", 200,
-			g_pars.cp.sip_seq_nr, "OK");
-	as_SIP_expect_resp(exp_resp);
-
-	g_pars.cp.sip_seq_nr := g_pars.cp.sip_seq_nr + 1;
-}
-
-/* Call is terminated by peer: */
-private altstep as_SIP_exp_call_hangup(template (present) integer exp_seq_nr := ?, boolean fail_others := true) runs on ConnHdlr
-{
-	var template (present) PDU_SIP_Request exp_req :=
-		tr_SIP_BYE(f_tr_SipUrl_opt_defport(g_pars.local_sip_url_ext),
-				 		   g_pars.cp.sip_call_id,
-				 		   g_pars.cp.from_addr,
-				 		   g_pars.cp.to_addr,
-				 		   tr_Via_from(f_tr_HostPort(mp_remote_sip_host, mp_remote_sip_port)),
-				 		   exp_seq_nr);
-	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;
-		var Via via;
-
-		/* Update parameters: */
-		g_pars.cp.sip_seq_nr := g_rx_sip_req.msgHeader.cSeq.seqNumber;
-		/* "branch" has changed: */
-		via := g_rx_sip_req.msgHeader.via;
-
-		/* Tx 200 OK */
-		tx_sdp := f_gen_sdp();
-		tx_resp := ts_SIP_Response(g_pars.cp.sip_call_id,
-					g_pars.cp.from_addr,
-					g_pars.cp.to_addr,
-					"BYE", 200,
-					g_pars.cp.sip_seq_nr,
-					"OK",
-					via,
-					body := tx_sdp);
-		SIP.send(tx_resp);
-	}
-	[fail_others] as_SIP_fail_resp(sip_expect_str);
-	[fail_others] as_SIP_fail_req(sip_expect_str);
-}
-
 /* Test SIP registration of local clients */
-private function f_TC_internal_registration(charstring id) runs on ConnHdlr {
+private function f_TC_internal_registration(charstring id) runs on SIPConnHdlr {
 
 	f_SIP_register();
 	// f_SIP_deregister();
 	setverdict(pass);
 }
 testcase TC_internal_registration() runs on test_CT {
-	var ConnHdlrPars pars;
-	var ConnHdlr vc_conn;
+	var SIPConnHdlrPars pars;
+	var SIPConnHdlr vc_conn;
 	f_init();
 	pars := f_init_ConnHdlrPars();
 	vc_conn := f_start_handler(refers(f_TC_internal_registration), pars);
@@ -769,7 +103,7 @@
 }
 
 /* Successful SIP MO-MT Call between local clients: */
-private function f_TC_internal_call_mo(charstring id) runs on ConnHdlr {
+private function f_TC_internal_call_mo(charstring id) runs on SIPConnHdlr {
 
 	f_SIP_register();
 	COORD.send(COORD_CMD_REGISTERED);
@@ -783,7 +117,7 @@
 
 	setverdict(pass);
 }
-private function f_TC_internal_call_mt(charstring id) runs on ConnHdlr {
+private function f_TC_internal_call_mt(charstring id) runs on SIPConnHdlr {
 
 	f_create_sip_expect(valueof(ts_SipUrl_from_Addr_Union(g_pars.cp.called.addr)));
 
@@ -807,8 +141,8 @@
 	setverdict(pass);
 }
 testcase TC_internal_call_momt() runs on test_CT {
-	var ConnHdlrPars pars[2];
-	var ConnHdlr vc_conn[2];
+	var SIPConnHdlrPars pars[2];
+	var SIPConnHdlr vc_conn[2];
 
 	f_init();
 
@@ -850,11 +184,11 @@
  * equipments ring (INVITE). The first one to pick up the call (OK 200) gets the
  * call established (ACK), others get a CANCEL event. */
 private function TC_internal_call_all_Nregistered(integer num_conns := 2) runs on test_CT {
-	var ConnHdlrList vc_conn_list := {};
+	var SIPConnHdlrList vc_conn_list := {};
 	const integer vc_conn_mo_idx := 0; /* Index of MO leg in vc_conn_list */
 	const integer vc_conn_mt_idx := 1; /* Index of MT leg in vc_conn_list, peer picking up first the call */
 	var SipAddr broadcast_sip_record;
-	var ConnHdlrPars pars_mo;
+	var SIPConnHdlrPars pars_mo;
 
 	f_init();
 
@@ -862,8 +196,8 @@
 					ts_UserInfo(broadcast_sip_extension)));
 
 	for (var integer i := 0; i < num_conns; i := i + 1) {
-		var ConnHdlrPars pars;
-		var ConnHdlr vc_conn;
+		var SIPConnHdlrPars pars;
+		var SIPConnHdlr vc_conn;
 		pars := f_init_ConnHdlrPars(idx := i + 1);
 		if (i == vc_conn_mo_idx) { /* MO */
 			pars.cp.calling := pars.registrar_sip_record;