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);
}

}
