Correctly handle ALIVE/TEST procedure with FR/NS-over-IP without SNS
If IP-SNS is not used we should wait for the RESET procedure to finish
before sending NS-ALIVE.
For IP-SNS start NS-ALIVE in both roles (sgsn and bss) and don't handle
NS-RESET.
Also unified the log messages a bit (received -> Rx).
Related: SYS#5002
Change-Id: Ie01fee70297255b3d9c091bc2cec75b0f915c588
diff --git a/library/NS_Emulation.ttcnpp b/library/NS_Emulation.ttcnpp
index 5fb2aa6..4d3db4c 100644
--- a/library/NS_Emulation.ttcnpp
+++ b/library/NS_Emulation.ttcnpp
@@ -217,20 +217,9 @@
f_sendAlive();
}
- [config.role_sgsn] 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;
- }
-
- [not config.role_sgsn] NSCP.receive(NS_Provider_Evt:{link_status:=NS_PROV_LINK_STATUS_UP}) {
- log("Provider Link came up: sending NS-RESET");
- f_sendReset();
- }
-
/* 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");
+ log("Rx NS-ALIVE-ACK: stopping Tns-alive; starting Tns-test");
Tns_alive.stop;
Tns_test.start;
}
@@ -246,17 +235,7 @@
/* FIXME */
}
- /* Respond to RESET with correct NSEI/NSVCI */
- [] NSCP.receive(tr_NS_RESET(?, config.nsvci, config.nsei)) -> value rf {
- f_change_state(NSE_S_ALIVE_BLOCKED);
- NSCP.send(ts_NS_RESET_ACK(config.nsvci, config.nsei));
- }
-
- /* Respond to RESET with wrong NSEI/NSVCI */
- [] NSCP.receive(tr_NS_RESET(?, ?, ?)) -> value rf {
- log("Rx NS-RESET for unknown NSEI/NSVCI");
- /* FIXME */
- }
+ [not config.handle_sns] as_handle_reset();
[config.role_sgsn and config.handle_sns and ischosen(config.provider.ip)] as_sns_sgsn();
@@ -267,10 +246,48 @@
}
}
+ private altstep as_handle_reset() runs on NS_CT {
+ var PDU_NS rf;
+
+ [config.role_sgsn] NSCP.receive(NS_Provider_Evt:{link_status:=NS_PROV_LINK_STATUS_UP}) {
+ log("Provider Link came up: waiting for NS-RESET");
+ }
+
+ [not config.role_sgsn] NSCP.receive(NS_Provider_Evt:{link_status:=NS_PROV_LINK_STATUS_UP}) {
+ log("Provider Link came up: sending NS-RESET");
+ f_sendReset();
+ }
+
+ /* Respond to RESET with correct NSEI/NSVCI */
+ [] NSCP.receive(tr_NS_RESET(?, config.nsvci, config.nsei)) -> value rf {
+ f_change_state(NSE_S_ALIVE_BLOCKED);
+ NSCP.send(ts_NS_RESET_ACK(config.nsvci, config.nsei));
+ log("Rx NS-RESET: Sending NS-ALIVE");
+ f_sendAlive();
+ Tns_test.start;
+ }
+
+ /* Respond to RESET with wrong NSEI/NSVCI */
+ [] NSCP.receive(tr_NS_RESET(?, ?, ?)) -> value rf {
+ log("Rx NS-RESET for unknown NSEI/NSVCI");
+ /* FIXME */
+ }
+ }
+
/* simple IP Sub-Network Service responder for the SGSN side. This is not a full implementation
* of the protocol, merely sufficient to make the PCU/BSS side happy to proceed */
private altstep as_sns_sgsn() runs on NS_CT {
var PDU_NS rf;
+ [config.role_sgsn] NSCP.receive(NS_Provider_Evt:{link_status:=NS_PROV_LINK_STATUS_UP}) {
+ log("Provider Link came up: sending NS-ALIVE");
+ f_sendAlive();
+ }
+
+ [not config.role_sgsn] NSCP.receive(NS_Provider_Evt:{link_status:=NS_PROV_LINK_STATUS_UP}) {
+ log("Provider Link came up: sending NS-ALIVE");
+ f_sendAlive();
+ }
+
[] NSCP.receive(tr_SNS_SIZE(config.nsei)) -> value rf {
/* blindly acknowledge whatever the PCU sends */
NSCP.send(ts_SNS_SIZE_ACK(config.nsei, omit));