92 lines
2.8 KiB
Plaintext
92 lines
2.8 KiB
Plaintext
/* 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;
|
|
|
|
var boolean link_available := false;
|
|
var boolean pvc_active := false;
|
|
};
|
|
|
|
function main(NSVCConfiguration config, NSConfiguration nsconfig, charstring id) runs on NS_Provider_FR_CT system af_packet {
|
|
|
|
/* start Frame Relay Emulation */
|
|
vc_FREMU := FR_Emulation_CT.create(id & "-FRemu");
|
|
var Q933em_Config q933_cfg := valueof(ts_Q933em_Config(ats_is_user := not nsconfig.role_sgsn, bidirectional := false));
|
|
q933_cfg.T391 := 1.0;
|
|
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:{link_status:=FR_LINK_STS_AVAILABLE}) -> value rx_frevt {
|
|
if (link_available == false and pvc_active == true) {
|
|
NSE.send(NS_Provider_Evt:{link_status := NS_PROV_LINK_STATUS_UP});
|
|
}
|
|
link_available := true;
|
|
}
|
|
[] FR.receive(FRemu_Event:{link_status:=FR_LINK_STS_UNAVAILABLE}) -> value rx_frevt {
|
|
link_available := false;
|
|
NSE.send(NS_Provider_Evt:{link_status := NS_PROV_LINK_STATUS_DOWN});
|
|
}
|
|
[] FR.receive(tr_FRemu_PvcStatusAct(config.provider.fr.dlci, true)) -> value rx_frevt {
|
|
if (pvc_active == false and link_available == true) {
|
|
NSE.send(NS_Provider_Evt:{link_status := NS_PROV_LINK_STATUS_UP});
|
|
}
|
|
pvc_active := true;
|
|
}
|
|
[] FR.receive(tr_FRemu_PvcStatusAct(config.provider.fr.dlci, false)) -> value rx_frevt {
|
|
pvc_active := false;
|
|
NSE.send(NS_Provider_Evt:{link_status := NS_PROV_LINK_STATUS_DOWN});
|
|
}
|
|
[] FR.receive(FRemu_Event:?) -> value rx_frevt {
|
|
log("Unhandled FRemu_event: ", rx_frevt);
|
|
}
|
|
[] NSE.receive(PDU_NS:?) -> value rx_pdu {
|
|
FR.send(ts_FR(config.provider.fr.dlci, enc_PDU_NS(rx_pdu), true));
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
} /* main */
|
|
|
|
|
|
|
|
} /* module */
|