/* NS Provider for NS/UDP/IP
 * (C) 2020 Harald Welte <laforge@gnumonks.org>
 * contributions by sysmocom - s.f.m.c. GmbH
 * 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 NS_Provider_IPL4 {

import from NS_Emulation all;
import from NS_Types all;

import from IPL4asp_Types all;
import from IPL4asp_PortType all;

type component NS_Provider_IPL4_CT extends NS_Provider_CT {
	/* down-facing port towards IPL4asp to IUT */
	port IPL4asp_PT IPL4;
	var integer g_conn_id := -1;
};

function main(NSConfiguration config, charstring id) runs on NS_Provider_IPL4_CT {

	/* connect socket */
	map(self:IPL4, system:IPL4);
	var Result res := f_IPL4_connect(IPL4, config.provider.ip.remote_ip,
					 config.provider.ip.remote_udp_port,
					 config.provider.ip.local_ip,
					 config.provider.ip.local_udp_port, 0, { udp := {}});
	if (not ispresent(res.connId)) {
		setverdict(fail, "Could not connect NS UDP socket ", config.provider.ip);
		mtc.stop;
	}
	g_conn_id := res.connId;
	NSE.send(NS_Provider_Evt:{link_status := NS_PROV_LINK_STATUS_UP});

	/* transceive beteween user-facing port and UDP socket */
	while (true) {
	var ASP_RecvFrom rx_rf;
	var PDU_NS rx_pdu;
	alt {

	[] IPL4.receive(ASP_RecvFrom:?) -> value rx_rf {
		NSE.send(dec_PDU_NS(rx_rf.msg));
		}

	[] IPL4.receive(ASP_ConnId_ReadyToRelease:?) {
		}

	[] IPL4.receive(ASP_Event:?) {
		}

	[] NSE.receive(PDU_NS:?) -> value rx_pdu {
		IPL4.send(ASP_Send:{connId := g_conn_id, proto := { udp := {} }, msg := enc_PDU_NS(rx_pdu)});
		}

	} /* alt */
	} /* while */

} /* main */



} /* module */
