diff options
author | Daniel Willmann <dwillmann@sysmocom.de> | 2020-10-12 18:10:06 +0200 |
---|---|---|
committer | Daniel Willmann <dwillmann@sysmocom.de> | 2020-10-15 10:48:34 +0200 |
commit | 654f85e2b85c3a5b18be8904d1602b98df3c0ae0 (patch) | |
tree | ef11f69e96d101dd8d13ec44101f3c39c7f6432c | |
parent | 5c5b276600c3abf257b69b11600e77599689c20d (diff) |
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
-rw-r--r-- | library/NS_Emulation.ttcnpp | 57 |
1 files changed, 37 insertions, 20 deletions
diff --git a/library/NS_Emulation.ttcnpp b/library/NS_Emulation.ttcnpp index 5fb2aa67..4d3db4cd 100644 --- a/library/NS_Emulation.ttcnpp +++ b/library/NS_Emulation.ttcnpp @@ -217,20 +217,9 @@ module NS_Emulation { 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,10 +235,36 @@ module NS_Emulation { /* FIXME */ } + [not config.handle_sns] as_handle_reset(); + + [config.role_sgsn and config.handle_sns and ischosen(config.provider.ip)] as_sns_sgsn(); + + /* default case of handling unknown PDUs */ + [] NSCP.receive(PDU_NS: ?) -> value rf { + log("Rx Unexpected NS PDU ", rf," in state ", g_state); + NSCP.send(ts_NS_STATUS(NS_CAUSE_PDU_NOT_COMPATIBLE_WITH_PROTOCOL_STATE, rf)); + } + } + + 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 */ @@ -257,20 +272,22 @@ module NS_Emulation { log("Rx NS-RESET for unknown NSEI/NSVCI"); /* FIXME */ } - - [config.role_sgsn and config.handle_sns and ischosen(config.provider.ip)] as_sns_sgsn(); - - /* default case of handling unknown PDUs */ - [] NSCP.receive(PDU_NS: ?) -> value rf { - log("Rx Unexpected NS PDU ", rf," in state ", g_state); - NSCP.send(ts_NS_STATUS(NS_CAUSE_PDU_NOT_COMPATIBLE_WITH_PROTOCOL_STATE, rf)); - } } /* 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)); |