mirror of https://gerrit.osmocom.org/libosmocore
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
This commit is contained in:
parent
52354dd785
commit
fe2aa68db8
|
@ -559,6 +559,12 @@ static void gprs_ns_timer_cb(void *data)
|
||||||
nsvc_start_timer(nsvc, NSVC_TIMER_TNS_ALIVE);
|
nsvc_start_timer(nsvc, NSVC_TIMER_TNS_ALIVE);
|
||||||
break;
|
break;
|
||||||
case NSVC_TIMER_TNS_RESET:
|
case NSVC_TIMER_TNS_RESET:
|
||||||
|
if (!(nsvc->state & NSE_S_RESET))
|
||||||
|
LOGP(DNS, LOGL_NOTICE,
|
||||||
|
"NSEI=%u Reset timed out but RESET flag is not set\n",
|
||||||
|
nsvc->nsei);
|
||||||
|
/* Mark NS-VC locally as blocked and dead */
|
||||||
|
nsvc->state = NSE_S_BLOCKED | NSE_S_RESET;
|
||||||
/* Chapter 7.3: Re-send the RESET */
|
/* Chapter 7.3: Re-send the RESET */
|
||||||
gprs_ns_tx_reset(nsvc, NS_CAUSE_OM_INTERVENTION);
|
gprs_ns_tx_reset(nsvc, NS_CAUSE_OM_INTERVENTION);
|
||||||
/* Re-start Tns-reset timer */
|
/* Re-start Tns-reset timer */
|
||||||
|
|
|
@ -710,6 +710,24 @@ static void test_bss_reset_ack()
|
||||||
send_ns_reset_ack(nsi, nse[0], 0xf001, 0x1000);
|
send_ns_reset_ack(nsi, nse[0], 0xf001, 0x1000);
|
||||||
gprs_dump_nsi(nsi);
|
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);
|
gprs_ns_destroy(nsi);
|
||||||
nsi = NULL;
|
nsi = NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -569,6 +569,90 @@ Current NS-VCIs:
|
||||||
NS-VC replaced other count: 2
|
NS-VC replaced other count: 2
|
||||||
NS-VC changed NSEI count : 3
|
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:
|
Current NS-VCIs:
|
||||||
|
|
||||||
--- Setup SGSN connection, BSS -> SGSN ---
|
--- Setup SGSN connection, BSS -> SGSN ---
|
||||||
|
|
Loading…
Reference in New Issue