diff options
author | Jacob Erlbeck <jerlbeck@sysmocom.de> | 2015-12-17 13:22:36 +0100 |
---|---|---|
committer | Holger Hans Peter Freyther <holger@moiji-mobile.com> | 2015-12-17 14:16:50 +0100 |
commit | cc6ac4cdc4103cb68a3e161deb49dfb64c931adf (patch) | |
tree | 0aabeb0e1f0b0c4fb7c9b341441b6c5f9b338740 /tests/gb | |
parent | 5ab8e2cdfcdfb932b918405061798e0079223273 (diff) |
ns: Force a defined state when sending NS RESET
Currently the state is assumed to remain the same while the reset
procedure is active. While this works correctly in general, a single
unexpected BLOCK_ACK or UNBLOCK_ACK can change the state but will not
stop the reset procedure. The leads to repeated RESET messages, where
the corresponding RESET_ACK is ignored. This is a stable state which
can only be left by manual intervention or by reception of a RESET
message from the peer.
This commit changes the RESET timeout handler to set the state to
BLOCKED/RESET when sending the new NS RESET message.
Note that this should ensure a clean restart even if the state has been
screwed up. It does not fix the handling of BLOCK_ACK or UNBLOCK_ACK
in abnormal cases.
Addresses:
gprs_ns.c:349 NSEI=8895 Tx NS RESET (NSVCI=8895, cause=O&M intervention)
gprs_ns.c:878 NSVCI=8895 Rx NS RESET ACK (NSEI=8895, NSVCI=8895)
gprs_ns.c:887 NS RESET ACK Discarding unexpected message for NS-VCI 8895 from SGSN NSEI=8895
Ticket: OW#1551
Sponsored-by: On-Waves ehf
Diffstat (limited to 'tests/gb')
-rw-r--r-- | tests/gb/gprs_ns_test.c | 18 | ||||
-rw-r--r-- | tests/gb/gprs_ns_test.ok | 84 |
2 files changed, 102 insertions, 0 deletions
diff --git a/tests/gb/gprs_ns_test.c b/tests/gb/gprs_ns_test.c index 00b8732e..a742130f 100644 --- a/tests/gb/gprs_ns_test.c +++ b/tests/gb/gprs_ns_test.c @@ -710,6 +710,24 @@ static void test_bss_reset_ack() send_ns_reset_ack(nsi, nse[0], 0xf001, 0x1000); gprs_dump_nsi(nsi); + /* Test crossing RESET and UNBLOCK_ACK */ + + printf("--- RESET (BSS -> SGSN) crossing an UNBLOCK_ACK (SGSN -> BSS) ---\n\n"); + + setup_ns(nsi, nse[0], 0x1001, 0x1000); + nsvc = gprs_nsvc_by_nsvci(nsi, 0x1001); + gprs_nsvc_reset(nsvc, NS_CAUSE_OM_INTERVENTION); + OSMO_ASSERT(nsvc->state & NSE_S_BLOCKED); + OSMO_ASSERT(nsvc->state & NSE_S_RESET); + send_ns_unblock_ack(nsi, nse[0]); + gprs_dump_nsi(nsi); + send_ns_reset_ack(nsi, nse[0], 0x1001, 0x1000); + expire_nsvc_timer(nsvc); + OSMO_ASSERT(nsvc->state & NSE_S_BLOCKED); + OSMO_ASSERT(nsvc->state & NSE_S_RESET); + send_ns_reset_ack(nsi, nse[0], 0x1001, 0x1000); + gprs_dump_nsi(nsi); + gprs_ns_destroy(nsi); nsi = NULL; } diff --git a/tests/gb/gprs_ns_test.ok b/tests/gb/gprs_ns_test.ok index 1e0bf7f8..b0c81e44 100644 --- a/tests/gb/gprs_ns_test.ok +++ b/tests/gb/gprs_ns_test.ok @@ -569,6 +569,90 @@ Current NS-VCIs: NS-VC replaced other count: 2 NS-VC changed NSEI count : 3 +--- RESET (BSS -> SGSN) crossing an UNBLOCK_ACK (SGSN -> BSS) --- + +Setup NS-VC: remote 0x01020304:2222, NSVCI 0x1001(4097), NSEI 0x1000(4096) + +PROCESSING RESET from 0x01020304:2222 +02 00 81 01 01 82 10 01 04 82 10 00 + +==> got signal NS_REPLACED: 0x1001/0.0.0.0:0 -> 0xf001/1.2.3.4:2222 +==> got signal NS_RESET, NS-VC 0x1001/1.2.3.4:2222 +MESSAGE to BSS, msg length 9 +03 01 82 10 01 04 82 10 00 + +MESSAGE to BSS, msg length 1 +0a + +result (RESET) = 9 + +PROCESSING ALIVE from 0x01020304:2222 +0a + +MESSAGE to BSS, msg length 1 +0b + +result (ALIVE) = 1 + +PROCESSING UNBLOCK from 0x01020304:2222 +06 + +==> got signal NS_UNBLOCK, NS-VC 0x1001/1.2.3.4:2222 +MESSAGE to BSS, msg length 1 +07 + +result (UNBLOCK) = 1 + +PROCESSING ALIVE_ACK from 0x01020304:2222 +0b + +result (ALIVE_ACK) = 0 + +MESSAGE to BSS, msg length 12 +02 00 81 01 01 82 10 01 04 82 10 00 + +PROCESSING UNBLOCK_ACK from 0x01020304:2222 +07 + +==> got signal NS_UNBLOCK, NS-VC 0x1001/1.2.3.4:2222 +result (UNBLOCK_ACK) = 0 + +Current NS-VCIs: + VCI 0xf001, NSEI 0x1000, peer 0x00000000:0, blocked + NS-VC Block count : 1 + NS-VC replaced other count: 2 + VCI 0x2001, NSEI 0x2000, peer 0x01020304:1111 + VCI 0x1001, NSEI 0x1000, peer 0x01020304:2222 + NS-VC Block count : 4 + NS-VC replaced other count: 3 + NS-VC changed NSEI count : 4 + +PROCESSING RESET_ACK from 0x01020304:2222 +03 01 82 10 01 04 82 10 00 + +result (RESET_ACK) = 0 + +MESSAGE to BSS, msg length 12 +02 00 81 01 01 82 10 01 04 82 10 00 + +PROCESSING RESET_ACK from 0x01020304:2222 +03 01 82 10 01 04 82 10 00 + +MESSAGE to BSS, msg length 1 +0a + +result (RESET_ACK) = 1 + +Current NS-VCIs: + VCI 0xf001, NSEI 0x1000, peer 0x00000000:0, blocked + NS-VC Block count : 1 + NS-VC replaced other count: 2 + VCI 0x2001, NSEI 0x2000, peer 0x01020304:1111 + VCI 0x1001, NSEI 0x1000, peer 0x01020304:2222, blocked + NS-VC Block count : 5 + NS-VC replaced other count: 3 + NS-VC changed NSEI count : 4 + Current NS-VCIs: --- Setup SGSN connection, BSS -> SGSN --- |