summaryrefslogtreecommitdiffstats
path: root/library
diff options
context:
space:
mode:
authorHarald Welte <laforge@osmocom.org>2020-09-13 18:32:32 +0200
committerHarald Welte <laforge@osmocom.org>2020-10-03 18:24:50 +0200
commit867243a3ec2389fa67ab2b132dca1240abdf1913 (patch)
tree55069036b60b4b154eb912b9ada0cdf805cbb605 /library
parent8c0f2fc0b0dc989b38afda5ced7251530a9083a2 (diff)
NS_Emulation: Add [optional] support for FrameRelay transport
This adds a NS_Provider_FR which interfaces between FrameRelay_Emulation and NS_Emulation. Include support for it only if enabled at compile time to avoid pulling in a dependency on the FrameRelay stack for every user of NS_Emulation. Change-Id: I42ca811d23e383e362d2527c8ff2c916a62a5b42
Diffstat (limited to 'library')
-rw-r--r--library/NS_Emulation.ttcnpp (renamed from library/NS_Emulation.ttcn)31
-rw-r--r--library/NS_Provider_FR.ttcn67
2 files changed, 92 insertions, 6 deletions
diff --git a/library/NS_Emulation.ttcn b/library/NS_Emulation.ttcnpp
index a0b24c9..32746b4 100644
--- a/library/NS_Emulation.ttcn
+++ b/library/NS_Emulation.ttcnpp
@@ -12,9 +12,12 @@
module NS_Emulation {
import from NS_Types all;
import from BSSGP_Types all;
+ import from Osmocom_Types all;
import from Osmocom_Gb_Types all;
import from NS_Provider_IPL4 all;
- import from Osmocom_Types all;
+#ifdef NS_EMULATION_FR
+ import from NS_Provider_FR all;
+#endif
import from IPL4asp_Types all;
type record NsUnitdataRequest {
@@ -91,10 +94,18 @@ module NS_Emulation {
private function f_init() runs on NS_CT {
var Result res;
- /* Connect the UDP socket */
- vc_NSP_IP := NS_Provider_IPL4_CT.create;
- connect(self:NSCP, vc_NSP_IP:NSE);
- vc_NSP_IP.start(NS_Provider_IPL4.main(config));
+ if (ischosen(config.provider.ip)) {
+ /* Connect the UDP socket */
+ vc_NSP_IP := NS_Provider_IPL4_CT.create;
+ connect(self:NSCP, vc_NSP_IP:NSE);
+ vc_NSP_IP.start(NS_Provider_IPL4.main(config));
+#ifdef NS_EMULATION_FR
+ } else if (ischosen(config.provider.fr)) {
+ vc_NSP_FR := NS_Provider_FR_CT.create;
+ connect(self:NSCP, vc_NSP_FR:NSE);
+ vc_NSP_FR.start(NS_Provider_FR.main(config));
+#endif
+ }
f_change_state(NSE_S_DEAD_BLOCKED);
/* Send the first NS-ALIVE to test the connection */
@@ -118,6 +129,9 @@ module NS_Emulation {
/* UDP port towards the bottom (IUT) */
port NS_PROVIDER_PT NSCP;
var NS_Provider_IPL4_CT vc_NSP_IP;
+#ifdef NS_EMULATION_FR
+ var NS_Provider_FR_CT vc_NSP_FR;
+#endif
/* NS-User SAP towards the user */
port NS_SP_PT NS_SP;
@@ -138,8 +152,13 @@ module NS_Emulation {
PortNumber remote_udp_port,
charstring remote_ip
};
+ type record NSConfigurationFR {
+ charstring netdev, /* HDLC net-device for AF_PACKET socket */
+ integer dlci
+ };
type union NSConfigurationP {
- NSConfigurationIP ip
+ NSConfigurationIP ip,
+ NSConfigurationFR fr
};
type record NSConfiguration {
NSConfigurationP provider,
diff --git a/library/NS_Provider_FR.ttcn b/library/NS_Provider_FR.ttcn
new file mode 100644
index 0000000..851e6c4
--- /dev/null
+++ b/library/NS_Provider_FR.ttcn
@@ -0,0 +1,67 @@
+/* NS Provider for NS/FR/E1
+ * (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_FR {
+
+import from NS_Emulation all;
+import from NS_Types all;
+
+import from AF_PACKET_PortType all;
+import from FrameRelay_Types all;
+import from FrameRelay_Emulation all;
+
+
+type component NS_Provider_FR_CT extends NS_Provider_CT, FR_Client_CT {
+ /* component reference to Frame Relay emulation */
+ var FR_Emulation_CT vc_FREMU;
+};
+
+function main(NSConfiguration config) runs on NS_Provider_FR_CT system af_packet {
+
+ /* start Frame Relay Emulation */
+ vc_FREMU := FR_Emulation_CT.create();
+ var Q933em_Config q933_cfg := valueof(ts_Q933em_Config(ats_is_user := not config.role_sgsn, bidirectional := false));
+ map(vc_FREMU:FR, system:AF_PACKET) param (config.provider.fr.netdev);
+ vc_FREMU.start(FrameRelay_Emulation.main(q933_cfg));
+
+ /* connect ourselves to frame relay emulation */
+ connect(self:FR, vc_FREMU:CLIENT);
+ connect(self:FR_PROC, vc_FREMU:PROC);
+
+ /* register ourselves for the specified DLCI */
+ f_fremu_register(config.provider.fr.dlci);
+
+ /* transceive between user-facing port and FR socket */
+ while (true) {
+ var FrameRelayFrame rx_fr;
+ var FRemu_Event rx_frevt;
+ var PDU_NS rx_pdu;
+ alt {
+
+ [] FR.receive(FrameRelayFrame:?) -> value rx_fr {
+ NSE.send(dec_PDU_NS(rx_fr.payload));
+ }
+
+ [] FR.receive(FRemu_Event:?) -> value rx_frevt {
+ /* TODO: dispatch to user */
+ }
+ [] NSE.receive(PDU_NS:?) -> value rx_pdu {
+ FR.send(ts_FR(config.provider.fr.dlci, enc_PDU_NS(rx_pdu), true));
+ }
+
+ }
+ }
+
+} /* main */
+
+
+
+} /* module */