diff --git a/src/gb_proxy.c b/src/gb_proxy.c index 736bd7a7..1ca4fc6c 100644 --- a/src/gb_proxy.c +++ b/src/gb_proxy.c @@ -1058,6 +1058,14 @@ static int gbprox_rx_sig_from_bss(struct gbproxy_config *cfg, LOGP(DGPRS, LOGL_INFO, "NSEI=%u Rx BVC RESET (BVCI=%u)\n", nsei, bvci); if (bvci == 0) { + struct gbproxy_nse *nse; + /* Ensure the NSE peer is there and clear all PtP BVCs */ + nse = gbproxy_nse_by_nsei_or_new(cfg, nsei); + if (!nse) + LOGP(DGPRS, LOGL_ERROR, "Could not allocate NSE for NSEI=%u\n", nsei); + + gbproxy_cleanup_peers(cfg, nsei, 0); + /* FIXME: only do this if SGSN is alive! */ LOGP(DGPRS, LOGL_INFO, "NSEI=%u Tx fake " "BVC RESET ACK of BVCI=0\n", nsei); @@ -1066,10 +1074,11 @@ static int gbprox_rx_sig_from_bss(struct gbproxy_config *cfg, } from_peer = gbproxy_peer_by_bvci(cfg, bvci); if (!from_peer) { - struct gbproxy_nse *nse = gbproxy_nse_by_nsei_or_new(cfg, nsei); + struct gbproxy_nse *nse = gbproxy_nse_by_nsei(cfg, nsei); if (!nse) { - LOGP(DGPRS, LOGL_ERROR, "Could not allocate NSE for NSEI=%u\n", nsei); - return bssgp_tx_status(BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg); + LOGP(DGPRS, LOGL_NOTICE, "Got PtP BVC reset before signalling reset for " + "BVCI=%u NSEI=%u\n", bvci, nsei); + return bssgp_tx_status(BSSGP_CAUSE_PDU_INCOMP_STATE, NULL, msg); } /* if a PTP-BVC is reset, and we don't know that * PTP-BVCI yet, we should allocate a new peer */ @@ -1081,10 +1090,11 @@ static int gbprox_rx_sig_from_bss(struct gbproxy_config *cfg, /* Could have moved to a different NSE */ if (!check_peer_nsei(from_peer, nsei)) { struct gbproxy_nse *nse_old = from_peer->nse; - struct gbproxy_nse *nse_new = gbproxy_nse_by_nsei_or_new(cfg, nsei); + struct gbproxy_nse *nse_new = gbproxy_nse_by_nsei(cfg, nsei); if (!nse_new) { - LOGP(DGPRS, LOGL_ERROR, "Could not allocate NSE for NSEI=%u\n", nsei); - return bssgp_tx_status(BSSGP_CAUSE_PROTO_ERR_UNSPEC, NULL, msg); + LOGP(DGPRS, LOGL_NOTICE, "Got PtP BVC reset before signalling reset for " + "BVCI=%u NSEI=%u\n", bvci, nsei); + return bssgp_tx_status(BSSGP_CAUSE_PDU_INCOMP_STATE, NULL, msg); } LOGP(DGPRS, LOGL_NOTICE, "Peer for BVCI=%u moved from NSEI=%u to NSEI=%u\n", bvci, nse_old->nsei, nsei); diff --git a/tests/gbproxy/gbproxy_test.c b/tests/gbproxy/gbproxy_test.c index 06734b40..fec5914d 100644 --- a/tests/gbproxy/gbproxy_test.c +++ b/tests/gbproxy/gbproxy_test.c @@ -930,6 +930,7 @@ static void setup_ns(struct gprs_ns2_inst *nsi, "NSEI 0x%04x(%d)\n\n", nsei, nsei); send_ns_avail(nsi, nsei); + send_bssgp_reset(nsi, nsei, 0); } static void setup_bssgp(struct gprs_ns2_inst *nsi, diff --git a/tests/gbproxy/gbproxy_test.ok b/tests/gbproxy/gbproxy_test.ok index 14a2641e..fbd5366b 100644 --- a/tests/gbproxy/gbproxy_test.ok +++ b/tests/gbproxy/gbproxy_test.ok @@ -13,6 +13,15 @@ Setup NS-VC: NSEI 0x1000(4096) NS2 CALLBACK, prim 2, bvci 0x0000 +PROCESSING BVC_RESET from NSEI 4096 +22 04 82 00 00 07 81 08 08 88 11 22 33 40 50 60 10 00 + +NS2 CALLBACK, prim 0, msg length 18, bvci 0x0000 +22 04 82 00 00 07 81 08 08 88 11 22 33 40 50 60 10 00 + +Message for BSS (NSEI=4096 BVCI=0): +23 04 82 00 00 + Setup BSSGP: BVCI 0x1002(4098) PROCESSING BVC_RESET from NSEI 4096 @@ -48,6 +57,15 @@ Setup NS-VC: NSEI 0x2000(8192) NS2 CALLBACK, prim 2, bvci 0x0000 +PROCESSING BVC_RESET from NSEI 8192 +22 04 82 00 00 07 81 08 08 88 11 22 33 40 50 60 10 00 + +NS2 CALLBACK, prim 0, msg length 18, bvci 0x0000 +22 04 82 00 00 07 81 08 08 88 11 22 33 40 50 60 10 00 + +Message for BSS (NSEI=8192 BVCI=0): +23 04 82 00 00 + Setup BSSGP: BVCI 0x2002(8194) PROCESSING BVC_RESET from NSEI 8192 @@ -366,6 +384,15 @@ Setup NS-VC: NSEI 0x1000(4096) NS2 CALLBACK, prim 2, bvci 0x0000 +PROCESSING BVC_RESET from NSEI 4096 +22 04 82 00 00 07 81 08 08 88 11 22 33 40 50 60 10 00 + +NS2 CALLBACK, prim 0, msg length 18, bvci 0x0000 +22 04 82 00 00 07 81 08 08 88 11 22 33 40 50 60 10 00 + +Message for BSS (NSEI=4096 BVCI=0): +23 04 82 00 00 + --- Setup BVCI 1 --- Setup BSSGP: BVCI 0x1002(4098) @@ -488,6 +515,15 @@ Setup NS-VC: NSEI 0x2000(8192) NS2 CALLBACK, prim 2, bvci 0x0000 +PROCESSING BVC_RESET from NSEI 8192 +22 04 82 00 00 07 81 08 08 88 11 22 33 40 50 60 10 00 + +NS2 CALLBACK, prim 0, msg length 18, bvci 0x0000 +22 04 82 00 00 07 81 08 08 88 11 22 33 40 50 60 10 00 + +Message for BSS (NSEI=8192 BVCI=0): +23 04 82 00 00 + --- Setup BVCI 1 --- Setup BSSGP: BVCI 0x1002(4098) @@ -679,6 +715,15 @@ Setup NS-VC: NSEI 0x1000(4096) NS2 CALLBACK, prim 2, bvci 0x0000 +PROCESSING BVC_RESET from NSEI 4096 +22 04 82 00 00 07 81 08 08 88 11 22 33 40 50 60 10 00 + +NS2 CALLBACK, prim 0, msg length 18, bvci 0x0000 +22 04 82 00 00 07 81 08 08 88 11 22 33 40 50 60 10 00 + +Message for BSS (NSEI=4096 BVCI=0): +23 04 82 00 00 + Setup BSSGP: BVCI 0x1002(4098) PROCESSING BVC_RESET from NSEI 4096 @@ -1057,6 +1102,15 @@ Setup NS-VC: NSEI 0x1000(4096) NS2 CALLBACK, prim 2, bvci 0x0000 +PROCESSING BVC_RESET from NSEI 4096 +22 04 82 00 00 07 81 08 08 88 11 22 33 40 50 60 10 00 + +NS2 CALLBACK, prim 0, msg length 18, bvci 0x0000 +22 04 82 00 00 07 81 08 08 88 11 22 33 40 50 60 10 00 + +Message for BSS (NSEI=4096 BVCI=0): +23 04 82 00 00 + Setup BSSGP: BVCI 0x1002(4098) PROCESSING BVC_RESET from NSEI 4096 @@ -1342,6 +1396,15 @@ Setup NS-VC: NSEI 0x1000(4096) NS2 CALLBACK, prim 2, bvci 0x0000 +PROCESSING BVC_RESET from NSEI 4096 +22 04 82 00 00 07 81 08 08 88 11 22 33 40 50 60 10 00 + +NS2 CALLBACK, prim 0, msg length 18, bvci 0x0000 +22 04 82 00 00 07 81 08 08 88 11 22 33 40 50 60 10 00 + +Message for BSS (NSEI=4096 BVCI=0): +23 04 82 00 00 + Setup BSSGP: BVCI 0x1002(4098) PROCESSING BVC_RESET from NSEI 4096 @@ -1991,6 +2054,15 @@ Setup NS-VC: NSEI 0x1000(4096) NS2 CALLBACK, prim 2, bvci 0x0000 +PROCESSING BVC_RESET from NSEI 4096 +22 04 82 00 00 07 81 08 08 88 11 22 33 40 50 60 10 00 + +NS2 CALLBACK, prim 0, msg length 18, bvci 0x0000 +22 04 82 00 00 07 81 08 08 88 11 22 33 40 50 60 10 00 + +Message for BSS (NSEI=4096 BVCI=0): +23 04 82 00 00 + Setup BSSGP: BVCI 0x1002(4098) PROCESSING BVC_RESET from NSEI 4096 @@ -2250,6 +2322,15 @@ Setup NS-VC: NSEI 0x1000(4096) NS2 CALLBACK, prim 2, bvci 0x0000 +PROCESSING BVC_RESET from NSEI 4096 +22 04 82 00 00 07 81 08 08 88 11 22 33 40 50 60 10 00 + +NS2 CALLBACK, prim 0, msg length 18, bvci 0x0000 +22 04 82 00 00 07 81 08 08 88 11 22 33 40 50 60 10 00 + +Message for BSS (NSEI=4096 BVCI=0): +23 04 82 00 00 + Setup BSSGP: BVCI 0x1002(4098) PROCESSING BVC_RESET from NSEI 4096 @@ -2966,6 +3047,15 @@ Setup NS-VC: NSEI 0x1000(4096) NS2 CALLBACK, prim 2, bvci 0x0000 +PROCESSING BVC_RESET from NSEI 4096 +22 04 82 00 00 07 81 08 08 88 11 22 33 40 50 60 10 00 + +NS2 CALLBACK, prim 0, msg length 18, bvci 0x0000 +22 04 82 00 00 07 81 08 08 88 11 22 33 40 50 60 10 00 + +Message for BSS (NSEI=4096 BVCI=0): +23 04 82 00 00 + Setup BSSGP: BVCI 0x0000(0) PROCESSING BVC_RESET from NSEI 4096 @@ -4108,6 +4198,15 @@ Setup NS-VC: NSEI 0x1000(4096) NS2 CALLBACK, prim 2, bvci 0x0000 +PROCESSING BVC_RESET from NSEI 4096 +22 04 82 00 00 07 81 08 08 88 11 22 33 40 50 60 10 00 + +NS2 CALLBACK, prim 0, msg length 18, bvci 0x0000 +22 04 82 00 00 07 81 08 08 88 11 22 33 40 50 60 10 00 + +Message for BSS (NSEI=4096 BVCI=0): +23 04 82 00 00 + Setup BSSGP: BVCI 0x1002(4098) PROCESSING BVC_RESET from NSEI 4096 @@ -5716,6 +5815,15 @@ Setup NS-VC: NSEI 0x1000(4096) NS2 CALLBACK, prim 2, bvci 0x0000 +PROCESSING BVC_RESET from NSEI 4096 +22 04 82 00 00 07 81 08 08 88 11 22 33 40 50 60 10 00 + +NS2 CALLBACK, prim 0, msg length 18, bvci 0x0000 +22 04 82 00 00 07 81 08 08 88 11 22 33 40 50 60 10 00 + +Message for BSS (NSEI=4096 BVCI=0): +23 04 82 00 00 + Setup BSSGP: BVCI 0x1002(4098) PROCESSING BVC_RESET from NSEI 4096