From d418fc6bb53fdda43310abc03f090ecf9bf38b1e Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Fri, 4 Aug 2017 00:34:42 +0200 Subject: GTP: convert from translation port to dual faced port I spent numerous hours in trying to avoid the dual faced port from segfaulting, but in the end didn't succeed :( The easy way was then simply to fall back to the known-working pattern of the dual-faced port, which I already successfully used also on the NS module for the Gb Inteface --- ggsn_tests/GTP_CodecPort.ttcn | 47 ++++++++++++++------------------ ggsn_tests/GTP_CodecPort_CtrlFunct.ttcn | 7 +++++ ggsn_tests/GTP_CodecPort_CtrlFunctDef.cc | 16 ++++++++--- ggsn_tests/regen_makefile.sh | 2 +- 4 files changed, 41 insertions(+), 31 deletions(-) diff --git a/ggsn_tests/GTP_CodecPort.ttcn b/ggsn_tests/GTP_CodecPort.ttcn index 44c71e25..561e5b9b 100644 --- a/ggsn_tests/GTP_CodecPort.ttcn +++ b/ggsn_tests/GTP_CodecPort.ttcn @@ -1,4 +1,4 @@ -/* Translation Port sitting on top of IPL4_asp UDP to encode/decode GTP */ +/* dual-faced port sitting on top of IPL4_asp UDP to encode/decode GTP */ /* (C) 2017 by Harald Welte ASP_SendTo: function(f_enc_Gtp1cUD)) + in(ASP_RecvFrom -> Gtp1cUnitdata: function(f_dec_Gtp1cUD); + ASP_Event -> ASP_Event: simple)" } - function f_enc_Gtp1cUD(in Gtp1cUnitdata in_ud, out ASP_SendTo out_ud) port GTPC_PT { + private function f_enc_Gtp1cUD(in Gtp1cUnitdata in_ud, out ASP_SendTo out_ud) { out_ud.connId := in_ud.peer.connId; out_ud.remName := in_ud.peer.remName; out_ud.remPort := in_ud.peer.remPort; out_ud.proto := { udp := {} }; out_ud.msg := enc_PDU_GTPC(in_ud.gtpc); - port.setstate(0); } with { extension "prototype(fast)" }; - function f_dec_Gtp1cUD(in ASP_RecvFrom in_ud, out Gtp1cUnitdata out_ud) port GTPC_PT { + private function f_dec_Gtp1cUD(in ASP_RecvFrom in_ud, out Gtp1cUnitdata out_ud) { out_ud.peer.connId := in_ud.connId; out_ud.peer.remName := in_ud.remName; out_ud.peer.remPort := in_ud.remPort; out_ud.gtpc := dec_PDU_GTPC(in_ud.msg); - port.setstate(0); } with { extension "prototype(fast)" }; - /* Translation port on top of IPL4asp; ASP_Event passed through transparently */ - type port GTPU_PT message map to IPL4asp_PT { - out Gtp1uUnitdata to ASP_SendTo with f_enc_Gtp1uUD(); - in Gtp1uUnitdata from ASP_RecvFrom with f_dec_Gtp1uUD(), + /* dual-faced port on top of IPL4asp; ASP_Event passed through transparently */ + type port GTPU_PT message { + out Gtp1uUnitdata; + in Gtp1uUnitdata, ASP_Event; - /* we can declare variables here and use them from all functions with "port" label */ - } + } with { extension "user IPL4asp_PT + out(Gtp1uUnitdata -> ASP_SendTo: function(f_enc_Gtp1uUD)) + in(ASP_RecvFrom -> Gtp1uUnitdata: function(f_dec_Gtp1uUD); + ASP_Event -> ASP_Event: simple)" } - function f_enc_Gtp1uUD(in Gtp1uUnitdata in_ud, out ASP_SendTo out_ud) port GTPU_PT { + function f_enc_Gtp1uUD(in Gtp1uUnitdata in_ud, out ASP_SendTo out_ud) { out_ud.connId := in_ud.peer.connId; out_ud.remName := in_ud.peer.remName; out_ud.remPort := in_ud.peer.remPort; out_ud.proto := { udp := {} }; out_ud.msg := enc_PDU_GTPU(in_ud.gtpu); - port.setstate(0); } with { extension "prototype(fast)" }; - function f_dec_Gtp1uUD(in ASP_RecvFrom in_ud, out Gtp1uUnitdata out_ud) port GTPU_PT { + function f_dec_Gtp1uUD(in ASP_RecvFrom in_ud, out Gtp1uUnitdata out_ud) { out_ud.peer.connId := in_ud.connId; out_ud.peer.remName := in_ud.remName; out_ud.peer.remPort := in_ud.remPort; out_ud.gtpu := dec_PDU_GTPU(in_ud.msg); - port.setstate(0); } with { extension "prototype(fast)" }; -/* - function f_GTPC_listen(inout GTPC_PT portRef, in HostName locName, - in PortNumber locPort) return Result { - return f_IPL4_listen(portRef, locName, locPort, { udp := {} }); - } -*/ + } diff --git a/ggsn_tests/GTP_CodecPort_CtrlFunct.ttcn b/ggsn_tests/GTP_CodecPort_CtrlFunct.ttcn index 33a2cabf..4f61af79 100644 --- a/ggsn_tests/GTP_CodecPort_CtrlFunct.ttcn +++ b/ggsn_tests/GTP_CodecPort_CtrlFunct.ttcn @@ -40,4 +40,11 @@ module GTP_CodecPort_CtrlFunct { out UserData userData ) return Result; + external function f_GTPU_listen( + inout GTPU_PT portRef, + in HostName locName, + in PortNumber locPort, + in ProtoTuple proto, + in OptionList options := {} + ) return Result; } diff --git a/ggsn_tests/GTP_CodecPort_CtrlFunctDef.cc b/ggsn_tests/GTP_CodecPort_CtrlFunctDef.cc index a8a014b6..c0b9391f 100644 --- a/ggsn_tests/GTP_CodecPort_CtrlFunctDef.cc +++ b/ggsn_tests/GTP_CodecPort_CtrlFunctDef.cc @@ -2,9 +2,6 @@ #include "IPL4asp_PT.hh" #include "GTP_CodecPort.hh" -using namespace IPL4asp__PortType; -using namespace IPL4asp__Types; - namespace GTP__CodecPort__CtrlFunct { IPL4asp__Types::Result f__IPL4__listen( @@ -54,5 +51,16 @@ namespace GTP__CodecPort__CtrlFunct { { return f__IPL4__PROVIDER__getUserData(portRef, connId, userData); } - + + + IPL4asp__Types::Result f__GTPU__listen( + GTP__CodecPort::GTPU__PT& portRef, + const IPL4asp__Types::HostName& locName, + const IPL4asp__Types::PortNumber& locPort, + const IPL4asp__Types::ProtoTuple& proto, + const IPL4asp__Types::OptionList& options) + { + return f__IPL4__PROVIDER__listen(portRef, locName, locPort, proto, options); + } + } diff --git a/ggsn_tests/regen_makefile.sh b/ggsn_tests/regen_makefile.sh index 26688733..e73452d6 100755 --- a/ggsn_tests/regen_makefile.sh +++ b/ggsn_tests/regen_makefile.sh @@ -1,6 +1,6 @@ #!/bin/sh -FILES="*.ttcn IPL4asp_PT.cc IPL4asp_discovery.cc TCCConversion.cc TCCInterface.cc GTPC_EncDec.cc GTPU_EncDec.cc GTP_CodecPort_CtrlFunctDef.cc GTPC_PT.cc GTPU_PT.cc" +FILES="*.ttcn IPL4asp_PT.cc IPL4asp_discovery.cc TCCConversion.cc TCCInterface.cc GTPC_EncDec.cc GTPU_EncDec.cc GTP_CodecPort_CtrlFunctDef.cc" ttcn3_makefilegen -f GGSN_Tests.ttcn $FILES sed -i -e 's/# TTCN3_DIR = /TTCN3_DIR = \/usr/' Makefile -- cgit v1.2.3