NS_Emulation: Introduce status events from provider -> emulation
This allows NS_Emulation to react to changes of the underlying transport layer (e.g. Frame Relay Link/DLCI up). Change-Id: If00e9c50dc664ce62b6c0cbde99d741e8173169b
This commit is contained in:
parent
867243a3ec
commit
bd612cd328
|
@ -120,9 +120,17 @@ module NS_Emulation {
|
|||
/* lower layer ports (UDP/IP, Frame Relay) are added in derived components */
|
||||
};
|
||||
|
||||
type enumerated NS_Provider_LinkStatus {
|
||||
NS_PROV_LINK_STATUS_UP,
|
||||
NS_PROV_LINK_STATUS_DOWN
|
||||
};
|
||||
type union NS_Provider_Evt {
|
||||
NS_Provider_LinkStatus link_status
|
||||
};
|
||||
|
||||
/* port between NS_Provider and NS_CT */
|
||||
type port NS_PROVIDER_PT message {
|
||||
inout PDU_NS;
|
||||
inout PDU_NS, NS_Provider_Evt;
|
||||
} with { extension "internal" };
|
||||
|
||||
type component NS_CT {
|
||||
|
@ -211,6 +219,12 @@ module NS_Emulation {
|
|||
f_sendAlive();
|
||||
}
|
||||
|
||||
[] NSCP.receive(NS_Provider_Evt:{link_status:=NS_PROV_LINK_STATUS_UP}) {
|
||||
log("Provider Link came up: sending NS-ALIVE");
|
||||
f_sendAlive();
|
||||
Tns_test.start;
|
||||
}
|
||||
|
||||
/* Stop t_alive when receiving ALIVE-ACK */
|
||||
[Tns_alive.running] NSCP.receive(t_NS_ALIVE_ACK) {
|
||||
log("NS-ALIVE-ACK received: stopping Tns-alive; starting Tns-test");
|
||||
|
|
|
@ -22,6 +22,9 @@ 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(NSConfiguration config) runs on NS_Provider_FR_CT system af_packet {
|
||||
|
@ -50,8 +53,28 @@ function main(NSConfiguration config) runs on NS_Provider_FR_CT system af_packet
|
|||
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 {
|
||||
/* TODO: dispatch to user */
|
||||
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));
|
||||
|
|
|
@ -36,6 +36,7 @@ function main(NSConfiguration config) runs on NS_Provider_IPL4_CT {
|
|||
mtc.stop;
|
||||
}
|
||||
g_conn_id := res.connId;
|
||||
NSE.send(NS_Provider_Evt:{link_status := NS_PROV_LINK_STATUS_UP});
|
||||
|
||||
/* transceive beteween user-facing port and UDP socket */
|
||||
while (true) {
|
||||
|
|
Loading…
Reference in New Issue