module VPCD_Adapter { /* VPCD Adapter layer, sitting on top of VPCD_CodecPort. * test suites can 'inherit' in order to have a VPCD connection to the IUT which they're testing * * (C) 2018-2019 by Harald Welte * All rights reserved. * * Released under the terms of GNU General Public License, Version 2 or * (at your option) any later version. */ import from VPCD_Types all; import from VPCD_CodecPort all; import from VPCD_CodecPort_CtrlFunct all; import from IPL4asp_Types all; import from IPL4asp_PortType all; import from Socket_API_Definitions all; modulepar { integer mp_vpcd_port := 35963; charstring mp_vpcd_host := "127.0.0.1"; } type component VPCD_Adapter_CT { port VPCD_CODEC_PT VPCD; var integer g_vpcd_conn_id; }; private function f_set_tcp_segmentation() runs on VPCD_Adapter_CT { /* Set function for dissecting the binary stream into packets */ var f_IPL4_getMsgLen vl_f := refers(f_IPL4_fixedMsgLen); /* Offset: 0, size of length: 2, delta: 0, multiplier: 1, big-endian: 0 */ VPCD_CodecPort_CtrlFunct.f_IPL4_setGetMsgLen(VPCD, g_vpcd_conn_id, vl_f, {0, 2, 2, 1, 0}); } function f_connect(charstring remote_host := mp_vpcd_host, integer remote_port := mp_vpcd_port) runs on VPCD_Adapter_CT { var IPL4asp_Types.Result res; map(self:VPCD, system:VPCD); res := VPCD_CodecPort_CtrlFunct.f_IPL4_connect(VPCD, remote_host, remote_port, "", 0, 0, { tcp := {} }); if (not ispresent(res.connId)) { setverdict(fail, "Could not connect to VPCD at ", remote_host, ":", remote_port, ", check your configuration"); mtc.stop; } g_vpcd_conn_id := res.connId; f_set_tcp_segmentation(); } function f_bind(charstring local_host, IPL4asp_Types.PortNumber local_port) runs on VPCD_Adapter_CT { var IPL4asp_Types.Result res; map(self:VPCD, system:VPCD); res := VPCD_CodecPort_CtrlFunct.f_IPL4_listen(VPCD, local_host, local_port, { tcp:={} }); g_vpcd_conn_id := res.connId; f_set_tcp_segmentation(); } function f_vpcd_send(template (value) VPCD_PDU pdu) runs on VPCD_Adapter_CT { VPCD.send(ts_VPCD_Send(g_vpcd_conn_id, pdu)); } function f_vpcd_exp(template VPCD_PDU exp) runs on VPCD_Adapter_CT return VPCD_PDU { var VPCD_RecvFrom rf; VPCD.receive(tr_VPCD_Recv(g_vpcd_conn_id, exp)) -> value rf; return rf.msg; } }