BVC FSM: Treat overlapping BVC-RESET as implicit ACK
If the BSS (or SGSN) has sent a BVC-RESET PDU for a BVCI to the SGSN (or
BSS) and is awaiting a BVC-RESET- ACK PDU in response, but instead
receives a BVC-RESET PDU indicating the same BVCI, then this shall be
interpreted as a BVC-RESET ACK PDU and the T2 timer shall be stopped.
Related: OS#4974
Change-Id: I4d15733f9f205cb563b66ef9e41dc8df50151900
diff --git a/src/gb/bssgp_bvc_fsm.c b/src/gb/bssgp_bvc_fsm.c
index 8d284d1..ce9079d 100644
--- a/src/gb/bssgp_bvc_fsm.c
+++ b/src/gb/bssgp_bvc_fsm.c
@@ -377,6 +377,12 @@
struct msgb *rx = NULL, *tx;
switch (event) {
+ case BSSGP_BVCFSM_E_RX_RESET:
+ /* 48.018 Section 8.4.3: If the BSS (or SGSN) has sent a BVC-RESET PDU for a BVCI to
+ * the SGSN (or BSS) and is awaiting a BVC-RESET-ACK PDU in response, but instead
+ * receives a BVC-RESET PDU indicating the same BVCI, then this shall be interpreted
+ * as a BVC-RESET ACK PDU and the T2 timer shall be stopped. */
+ /* fall-through */
case BSSGP_BVCFSM_E_RX_RESET_ACK:
rx = data;
tp = (const struct tlv_parsed *) msgb_bcid(rx);
@@ -606,7 +612,8 @@
},
[BSSGP_BVCFSM_S_WAIT_RESET_ACK]= {
.name = "WAIT_RESET_ACK",
- .in_event_mask = S(BSSGP_BVCFSM_E_RX_RESET_ACK),
+ .in_event_mask = S(BSSGP_BVCFSM_E_RX_RESET_ACK) |
+ S(BSSGP_BVCFSM_E_RX_RESET),
.out_state_mask = S(BSSGP_BVCFSM_S_UNBLOCKED) |
S(BSSGP_BVCFSM_S_BLOCKED) |
S(BSSGP_BVCFSM_S_WAIT_RESET_ACK),