From 654f85e2b85c3a5b18be8904d1602b98df3c0ae0 Mon Sep 17 00:00:00 2001 From: Daniel Willmann Date: Mon, 12 Oct 2020 18:10:06 +0200 Subject: 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 --- library/NS_Emulation.ttcnpp | 57 +++++++++++++++++++++++++++++---------------- 1 file 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)); -- cgit v1.2.3