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
diff --git a/tests/gb/gprs_ns_test.c b/tests/gb/gprs_ns_test.c
index 00b8732..a742130 100644
--- a/tests/gb/gprs_ns_test.c
+++ b/tests/gb/gprs_ns_test.c
@@ -710,6 +710,24 @@
 	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;
 }