hlr: add TC_MSLookup_mDNS_service_other_home

Send an mslookup mDNS request to the home HLR, asking about a service
that is not "gsup.hlr". Hence the "_other" in the test name, service
"gsup.hlr" has different code paths, and related tests will be added in
follow-up patches.

This is the first test using MSLookup_mDNS_Emulation, so add related
test infrastructure.

Related: OS#4380
Depends: osmo-hlr I2fe453553c90e6ee527ed13a13089900efd488aa
Change-Id: Ia7f92d33691f910549353b16a7b0efc18e521719
diff --git a/library/MSLookup_mDNS_Emulation.ttcn b/library/MSLookup_mDNS_Emulation.ttcn
new file mode 100644
index 0000000..029091d
--- /dev/null
+++ b/library/MSLookup_mDNS_Emulation.ttcn
@@ -0,0 +1,45 @@
+module MSLookup_mDNS_Emulation {
+
+/* (C) 2020 sysmocom s.f.m.c. GmbH <info@sysmocom.de>
+ * All rights reserved.
+ *
+ * Released under the terms of GNU General Public License, Version 2 or
+ * (at your option) any later version.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+import from DNS_Types all;
+import from UDPasp_Types all;
+import from MSLookup_mDNS_Types all;
+
+/* Transcode between mDNS and UDP:
+   Wait for DNS packets on the mDNS port, encode them as UDP and forward them to the mDNS_UDP port.
+   Wait for UDP packets on mDNS_UDP port, decode them as DNS and forward them to the mDNS port. */
+function f_main() runs on MSLookup_mDNS_Emulation_CT
+{
+	var MSLookup_mDNS vl_dnsmsg;
+	var ASP_UDP vl_udpmsg;
+	map(self:mDNS_UDP, system:UDP);
+	alt {
+	[] mDNS_UDP.receive(ASP_UDP:?) -> value vl_udpmsg {
+		mDNS.send(MSLookup_mDNS: {
+			  dec_PDU_DNS(vl_udpmsg.data),
+			  vl_udpmsg.addressf,
+			  vl_udpmsg.portf
+		});
+		repeat;
+		}
+	[] mDNS.receive(MSLookup_mDNS:?) -> value vl_dnsmsg {
+		mDNS_UDP.send(ASP_UDP: {
+			 enc_PDU_DNS(vl_dnsmsg.dnsMessage, false, true),
+			 vl_dnsmsg.udpAddress,
+			 vl_dnsmsg.udpPort
+		});
+		repeat;
+		}
+	}
+	unmap(self:mDNS_UDP, system:UDP);
+}
+
+}
diff --git a/library/MSLookup_mDNS_Templates.ttcn b/library/MSLookup_mDNS_Templates.ttcn
new file mode 100644
index 0000000..123ec16
--- /dev/null
+++ b/library/MSLookup_mDNS_Templates.ttcn
@@ -0,0 +1,99 @@
+
+/* (C) 2020 by sysmocom s.f.m.c. GmbH <info@sysmocom.de>
+ * All Rights Reserved
+ *
+ * Released under the terms of GNU General Public License, Version 2 or
+ * (at your option) any later version.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+module MSLookup_mDNS_Templates {
+
+import from DNS_Types all;
+import from MSLookup_mDNS_Types all;
+
+template MSLookup_mDNS ts_MSLookup_mDNS_query(integer id, charstring domain) := {
+	dnsMessage := {
+		header := {
+			id := id,
+			qr := DNS_QUERY,
+			opCode := 0,
+			aa := false,
+			tc := false,
+			rd := false,
+			ra := false,
+			z := '000'B,
+			rCode := DNS_NO_ERROR,
+			qdCount := 1,
+			anCount := 0,
+			nsCount := 0,
+			arCount := 0
+		},
+		queries := {
+			{
+				qName := domain,
+				qType := 255,
+				qClass := DNS_IN
+			}
+		},
+		answers := {},
+		nameServerRecords := {},
+		additionalRecords := {}
+	},
+	udpAddress := "239.192.23.42",
+	udpPort := 4266
+}
+
+template MSLookup_mDNS tr_MSLookup_mDNS_result_IPv4(integer id, charstring domain, UInt32 ip_v4, integer port_v4) := {
+	dnsMessage := {
+		header := {
+			id := id,
+			qr := DNS_RESPONSE,
+			opCode := DNS_OP_QUERY,
+			aa := false,
+			tc := false,
+			rd := false,
+			ra := false,
+			z := '000'B,
+			rCode := DNS_NO_ERROR,
+			qdCount := 0,
+			anCount := 3,
+			nsCount := 0,
+			arCount := 0
+		},
+		queries := {},
+		answers := {
+			{
+				name := domain,
+				rrType := DNS_TXT,
+				rrClass := DNS_IN,
+				ttl := ?,
+				rdLength := ?,
+				rData := {txt := {pattern "age=*"}}
+			},
+			{
+				name := domain,
+				rrType := DNS_A,
+				rrClass := DNS_IN,
+				ttl := ?,
+				rdLength := ?,
+				rData := {a := ip_v4}
+			},
+			{
+				name := domain,
+				rrType := DNS_TXT,
+				rrClass := DNS_IN,
+				ttl := ?,
+				rdLength := ?,
+				rData := {txt := {"port=" & int2str(port_v4)}}
+			}
+		},
+		nameServerRecords := {},
+		additionalRecords := {}
+	},
+	udpAddress := ?,
+	udpPort := ?
+}
+
+}
diff --git a/library/MSLookup_mDNS_Types.ttcn b/library/MSLookup_mDNS_Types.ttcn
new file mode 100644
index 0000000..dacbb2b
--- /dev/null
+++ b/library/MSLookup_mDNS_Types.ttcn
@@ -0,0 +1,31 @@
+module MSLookup_mDNS_Types {
+
+/* (C) 2020 sysmocom s.f.m.c. GmbH <info@sysmocom.de>
+ * All rights reserved.
+ *
+ * Released under the terms of GNU General Public License, Version 2 or
+ * (at your option) any later version.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+import from DNS_Types all;
+import from UDPasp_Types all;
+import from UDPasp_PortType all;
+
+type record MSLookup_mDNS {
+	PDU_DNS       dnsMessage,
+	AddressType   udpAddress,
+	PortType      udpPort
+}
+
+type port MSLookup_mDNS_PT message {
+	inout MSLookup_mDNS
+} with { extension "internal" }
+
+type component MSLookup_mDNS_Emulation_CT {
+	port MSLookup_mDNS_PT mDNS;
+	port UDPasp_PT mDNS_UDP;
+}
+
+}