module M3UA_CodecPort { /* Simple M3UA Codec Port, translating between raw SCTP primitives with * octetstring payload towards the IPL4asp provider, and M3UA primitives * which carry the decoded M3UA data types as payload. * * (C) 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. * * SPDX-License-Identifier: GPL-2.0-or-later */ import from IPL4asp_PortType all; import from IPL4asp_Types all; import from M3UA_CodecPort_CtrlFunct all; import from M3UA_Types all; type record M3UA_RecvFrom { ConnectionId connId, HostName remName, PortNumber remPort, HostName locName, PortNumber locPort, PDU_M3UA msg }; template M3UA_RecvFrom t_M3UA_RecvFrom(template PDU_M3UA msg) := { connId := ?, remName := ?, remPort := ?, locName := ?, locPort := ?, msg := msg } type record M3UA_Send { ConnectionId connId, integer stream optional, PDU_M3UA msg } template M3UA_Send t_M3UA_Send(template ConnectionId connId, template PDU_M3UA msg, template (omit) integer stream := omit) := { connId := connId, stream := stream, msg := msg } private function IPL4_to_M3UA_RecvFrom(in ASP_RecvFrom pin, out M3UA_RecvFrom pout) { pout.connId := pin.connId; pout.remName := pin.remName; pout.remPort := pin.remPort; pout.locName := pin.locName; pout.locPort := pin.locPort; pout.msg := dec_PDU_M3UA(pin.msg); } with { extension "prototype(fast)" }; private function M3UA_to_IPL4_Send(in M3UA_Send pin, out ASP_Send pout) { pout.connId := pin.connId; if (ispresent(pin.stream)) { pout.proto := { sctp := { sinfo_stream := pin.stream, sinfo_ppid := 3, remSocks := omit, assocId := omit } }; } else { pout.proto := { tcp := { } }; } pout.msg := enc_PDU_M3UA(pin.msg); } with { extension "prototype(fast)" }; type port M3UA_CODEC_PT message { out M3UA_Send; in M3UA_RecvFrom, ASP_ConnId_ReadyToRelease, ASP_Event; } with { extension "user IPL4asp_PT out(M3UA_Send -> ASP_Send:function(M3UA_to_IPL4_Send)) in(ASP_RecvFrom -> M3UA_RecvFrom: function(IPL4_to_M3UA_RecvFrom); ASP_ConnId_ReadyToRelease -> ASP_ConnId_ReadyToRelease: simple; ASP_Event -> ASP_Event: simple)" }; function f_set_tcp_segmentation(M3UA_CODEC_PT pt, ConnectionId connId) { /* Set function for dissecting the binary stream into packets */ var f_IPL4_getMsgLen vl_f := refers(f_IPL4_fixedMsgLen); /* Offset: 4, size of length: 4, delta: 0, multiplier: 1, big-endian */ M3UA_CodecPort_CtrlFunct.f_IPL4_setGetMsgLen(pt, connId, vl_f, {4, 4, 0, 1, 0}); } }