blob: 7a3e755d60f0bbda064684495dfbd3d7ae5ffc8b [file] [log] [blame]
Harald Welted418fc62017-08-04 00:34:42 +02001/* dual-faced port sitting on top of IPL4_asp UDP to encode/decode GTP */
Harald Welte25606082017-08-03 17:00:40 +02002/* (C) 2017 by Harald Welte <laforge@gnumonks.org */
3module GTP_CodecPort {
Harald Welte627c7c72017-08-03 18:17:02 +02004 import from IPL4asp_PortType all;
5 import from IPL4asp_Types all;
Harald Welte25606082017-08-03 17:00:40 +02006 import from GTPC_Types all;
7 import from GTPU_Types all;
8
9 /* identifies a remote peer (sender or receiver) */
10 type record GtpPeer {
Harald Welte627c7c72017-08-03 18:17:02 +020011 ConnectionId connId,
12 HostName remName,
13 PortNumber remPort
Harald Welte25606082017-08-03 17:00:40 +020014 }
15
16 /* Decoded GTP1C (Control Plane), used in send and receive direction */
17 type record Gtp1cUnitdata {
18 GtpPeer peer,
19 PDU_GTPC gtpc
20 }
21
22 /* Decoded GTP1U (User Plane), used in send and receive direction */
23 type record Gtp1uUnitdata {
24 GtpPeer peer,
25 PDU_GTPU gtpu
26 }
27
Harald Welte627c7c72017-08-03 18:17:02 +020028 /* Translation port on top of IPL4asp; ASP_Event passed through transparently */
Harald Welted418fc62017-08-04 00:34:42 +020029 type port GTPC_PT message {
30 out Gtp1cUnitdata;
31 in Gtp1cUnitdata,
Harald Welte04d74cd2017-11-19 09:29:51 +010032 ASP_ConnId_ReadyToRelease,
Harald Welte627c7c72017-08-03 18:17:02 +020033 ASP_Event;
Harald Welted418fc62017-08-04 00:34:42 +020034 } with { extension "user IPL4asp_PT
35 out(Gtp1cUnitdata -> ASP_SendTo: function(f_enc_Gtp1cUD))
36 in(ASP_RecvFrom -> Gtp1cUnitdata: function(f_dec_Gtp1cUD);
Harald Welte04d74cd2017-11-19 09:29:51 +010037 ASP_ConnId_ReadyToRelease -> ASP_ConnId_ReadyToRelease: simple;
Harald Welted418fc62017-08-04 00:34:42 +020038 ASP_Event -> ASP_Event: simple)" }
Harald Welte25606082017-08-03 17:00:40 +020039
Harald Welted418fc62017-08-04 00:34:42 +020040 private function f_enc_Gtp1cUD(in Gtp1cUnitdata in_ud, out ASP_SendTo out_ud) {
Harald Welte627c7c72017-08-03 18:17:02 +020041 out_ud.connId := in_ud.peer.connId;
42 out_ud.remName := in_ud.peer.remName;
43 out_ud.remPort := in_ud.peer.remPort;
44 out_ud.proto := { udp := {} };
45 out_ud.msg := enc_PDU_GTPC(in_ud.gtpc);
Harald Welte25606082017-08-03 17:00:40 +020046 } with { extension "prototype(fast)" };
47
Harald Welted418fc62017-08-04 00:34:42 +020048 private function f_dec_Gtp1cUD(in ASP_RecvFrom in_ud, out Gtp1cUnitdata out_ud) {
Harald Welte627c7c72017-08-03 18:17:02 +020049 out_ud.peer.connId := in_ud.connId;
50 out_ud.peer.remName := in_ud.remName;
51 out_ud.peer.remPort := in_ud.remPort;
52 out_ud.gtpc := dec_PDU_GTPC(in_ud.msg);
Harald Welte25606082017-08-03 17:00:40 +020053 } with { extension "prototype(fast)" };
54
55
Harald Welted418fc62017-08-04 00:34:42 +020056 /* dual-faced port on top of IPL4asp; ASP_Event passed through transparently */
57 type port GTPU_PT message {
58 out Gtp1uUnitdata;
59 in Gtp1uUnitdata,
Harald Welte04d74cd2017-11-19 09:29:51 +010060 ASP_ConnId_ReadyToRelease,
Harald Welte627c7c72017-08-03 18:17:02 +020061 ASP_Event;
Harald Welted418fc62017-08-04 00:34:42 +020062 } with { extension "user IPL4asp_PT
63 out(Gtp1uUnitdata -> ASP_SendTo: function(f_enc_Gtp1uUD))
64 in(ASP_RecvFrom -> Gtp1uUnitdata: function(f_dec_Gtp1uUD);
Harald Welte04d74cd2017-11-19 09:29:51 +010065 ASP_ConnId_ReadyToRelease -> ASP_ConnId_ReadyToRelease: simple;
Harald Welted418fc62017-08-04 00:34:42 +020066 ASP_Event -> ASP_Event: simple)" }
Harald Welte25606082017-08-03 17:00:40 +020067
Harald Welted418fc62017-08-04 00:34:42 +020068 function f_enc_Gtp1uUD(in Gtp1uUnitdata in_ud, out ASP_SendTo out_ud) {
Harald Welte627c7c72017-08-03 18:17:02 +020069 out_ud.connId := in_ud.peer.connId;
70 out_ud.remName := in_ud.peer.remName;
71 out_ud.remPort := in_ud.peer.remPort;
72 out_ud.proto := { udp := {} };
73 out_ud.msg := enc_PDU_GTPU(in_ud.gtpu);
Harald Welte25606082017-08-03 17:00:40 +020074 } with { extension "prototype(fast)" };
75
Harald Welted418fc62017-08-04 00:34:42 +020076 function f_dec_Gtp1uUD(in ASP_RecvFrom in_ud, out Gtp1uUnitdata out_ud) {
Harald Welte627c7c72017-08-03 18:17:02 +020077 out_ud.peer.connId := in_ud.connId;
78 out_ud.peer.remName := in_ud.remName;
79 out_ud.peer.remPort := in_ud.remPort;
80 out_ud.gtpu := dec_PDU_GTPU(in_ud.msg);
Harald Welte25606082017-08-03 17:00:40 +020081 } with { extension "prototype(fast)" };
Harald Welted418fc62017-08-04 00:34:42 +020082
Harald Welte25606082017-08-03 17:00:40 +020083}