From 5405a104bbe7d3711fe6f19ea7d0fce50ef91147 Mon Sep 17 00:00:00 2001 From: Jacob Erlbeck Date: Thu, 24 Oct 2013 01:33:23 +0200 Subject: gb: Fix NS RESET/RESET_ACK abnormal cases This changes the implementations for the reception of RESET and RESET_ACK to be compatible with 3GPP TS 08.16, 7.3.1: - Just send a RESET_ACK with correct values back to the SGSN when a RESET with an invalid NSVCI or NSEI has been received. - Check RESET_ACK for matching NSEI and NSVCI. - Ignore unexpected RESET_ACKs. In addition, use RESET_ACK from a BSS to update the BSS source address based on the NSVCI to be tolerant with changing UDP source addresses/ports. Sponsored-by: On-Waves ehf --- include/osmocom/gprs/gprs_ns.h | 5 + src/gb/gprs_ns.c | 271 ++++++++++++++++++++++++++++++++--------- tests/gb/gprs_ns_test.c | 6 + tests/gb/gprs_ns_test.ok | 169 +++++++++++-------------- 4 files changed, 294 insertions(+), 157 deletions(-) diff --git a/include/osmocom/gprs/gprs_ns.h b/include/osmocom/gprs/gprs_ns.h index b28c58d6..296800e4 100644 --- a/include/osmocom/gprs/gprs_ns.h +++ b/include/osmocom/gprs/gprs_ns.h @@ -36,6 +36,7 @@ enum ns_timeout { #define NSE_S_BLOCKED 0x0001 #define NSE_S_ALIVE 0x0002 +#define NSE_S_RESET 0x0004 /*! \brief Osmocom NS link layer types */ enum gprs_ns_ll { @@ -199,12 +200,16 @@ enum signal_ns { S_NS_UNBLOCK, S_NS_ALIVE_EXP, /* Tns-alive expired more than N times */ S_NS_REPLACED, /* nsvc object is replaced (sets old_nsvc) */ + S_NS_MISMATCH, /* got an unexpected IE (sets msg, pdu_type, ie_type) */ }; struct ns_signal_data { struct gprs_nsvc *nsvc; struct gprs_nsvc *old_nsvc; uint8_t cause; + uint8_t pdu_type; + uint8_t ie_type; + struct msgb *msg; }; void gprs_ns_set_log_ss(int ss); diff --git a/src/gb/gprs_ns.c b/src/gb/gprs_ns.c index a4a6376f..a597c2c0 100644 --- a/src/gb/gprs_ns.c +++ b/src/gb/gprs_ns.c @@ -102,6 +102,8 @@ enum ns_ctr { NS_CTR_DEAD, NS_CTR_REPLACED, NS_CTR_NSEI_CHG, + NS_CTR_INV_VCI, + NS_CTR_INV_NSEI, }; static const struct rate_ctr_desc nsvc_ctr_description[] = { @@ -113,6 +115,8 @@ static const struct rate_ctr_desc nsvc_ctr_description[] = { { "dead", "NS-VC gone dead count " }, { "replaced", "NS-VC replaced other count" }, { "nsei-chg", "NS-VC changed NSEI " }, + { "inv-nsvci", "NS-VCI was invalid count " }, + { "inv-nsei", "NSEI was invalid count " }, }; static const struct rate_ctr_group_desc nsvc_ctrg_desc = { @@ -225,6 +229,20 @@ static void ns_osmo_signal_dispatch(struct gprs_nsvc *nsvc, unsigned int signal, osmo_signal_dispatch(SS_L_NS, signal, &nssd); } +static void ns_osmo_signal_dispatch_mismatch(struct gprs_nsvc *nsvc, + struct msgb *msg, + uint8_t pdu_type, uint8_t ie_type) +{ + struct ns_signal_data nssd = {0}; + + nssd.nsvc = nsvc; + nssd.pdu_type = pdu_type; + nssd.ie_type = ie_type; + nssd.msg = msg; + + osmo_signal_dispatch(SS_L_NS, S_NS_MISMATCH, &nssd); +} + static void ns_osmo_signal_dispatch_replaced(struct gprs_nsvc *nsvc, struct gprs_nsvc *old_nsvc) { struct ns_signal_data nssd = {0}; @@ -323,6 +341,8 @@ int gprs_ns_tx_reset(struct gprs_nsvc *nsvc, uint8_t cause) LOGP(DNS, LOGL_INFO, "NSEI=%u Tx NS RESET (NSVCI=%u, cause=%s)\n", nsvc->nsei, nsvc->nsvci, gprs_ns_cause_str(cause)); + nsvc->state |= NSE_S_RESET; + msg->l2h = msgb_put(msg, sizeof(*nsh)); nsh = (struct gprs_ns_hdr *) msg->l2h; nsh->pdu_type = NS_PDUT_RESET; @@ -672,6 +692,49 @@ static int gprs_ns_rx_status(struct gprs_nsvc *nsvc, struct msgb *msg) return 0; } +/* Replace a nsvc object with another based on NSVCI. + * This function replaces looks for a NSVC with the given NSVCI and replaces it + * if possible and necessary. If replaced, the former value of *nsvc is + * returned in *old_nsvc. + * \return != 0 if *nsvc points to a matching NSVC. + */ +static int gprs_nsvc_replace_if_found(uint16_t nsvci, + struct gprs_nsvc **nsvc, + struct gprs_nsvc **old_nsvc) +{ + struct gprs_nsvc *matching_nsvc; + + if ((*nsvc)->nsvci == nsvci) { + *old_nsvc = NULL; + return 1; + } + + matching_nsvc = gprs_nsvc_by_nsvci((*nsvc)->nsi, nsvci); + + if (!matching_nsvc) + return 0; + + /* The NS-VCI is already used by this NS-VC */ + + char *old_peer; + + /* Exchange the NS-VC objects */ + *old_nsvc = *nsvc; + *nsvc = matching_nsvc; + + /* Do logging */ + old_peer = talloc_strdup(*old_nsvc, gprs_ns_ll_str(*old_nsvc)); + LOGP(DNS, LOGL_INFO, "NS-VC changed link (NSVCI=%u) from %s to %s\n", + nsvci, old_peer, gprs_ns_ll_str(*nsvc)); + + talloc_free(old_peer); + + /* Do statistics */ + rate_ctr_inc(&(*nsvc)->ctrg->ctr[NS_CTR_REPLACED]); + + return 1; +} + /* Section 7.3 */ static int gprs_ns_rx_reset(struct gprs_nsvc **nsvc, struct msgb *msg) { @@ -679,7 +742,7 @@ static int gprs_ns_rx_reset(struct gprs_nsvc **nsvc, struct msgb *msg) struct tlv_parsed tp; uint8_t cause; uint16_t nsvci, nsei; - struct gprs_nsvc *other_nsvc = NULL; + struct gprs_nsvc *orig_nsvc = NULL; int rc; rc = tlv_parse(&tp, &ns_att_tlvdef, nsh->data, @@ -706,57 +769,47 @@ static int gprs_ns_rx_reset(struct gprs_nsvc **nsvc, struct msgb *msg) (*nsvc)->nsvci, (*nsvc)->nsvci_is_valid ? "" : "(invalid)", nsei, nsvci, gprs_ns_cause_str(cause)); - if ((*nsvc)->nsvci_is_valid && (*nsvc)->nsvci != nsvci) { - /* NS-VCI has changed */ - other_nsvc = gprs_nsvc_by_nsvci((*nsvc)->nsi, nsvci); - - if (other_nsvc) { - /* The NS-VCI is already used by this NS-VC */ - - struct gprs_nsvc *tmp_nsvc; - char *old_peer; - - /* Exchange the NS-VC objects */ - tmp_nsvc = *nsvc; - *nsvc = other_nsvc; - other_nsvc = tmp_nsvc; - - /* Do logging */ - old_peer = talloc_strdup(other_nsvc, - gprs_ns_ll_str(other_nsvc)); - LOGP(DNS, LOGL_INFO, - "NS-VC changed link (NSVCI=%u) from %s to %s\n", - nsvci, old_peer, gprs_ns_ll_str(*nsvc)); - - talloc_free(old_peer); - - /* Do statistics */ - rate_ctr_inc(&(*nsvc)->ctrg->ctr[NS_CTR_REPLACED]); + if (!(*nsvc)->nsvci_is_valid) { + /* It's a new uninitialised NS-VC, nothing to check here */ + } else if ((*nsvc)->nsvci != nsvci) { + if ((*nsvc)->remote_end_is_sgsn) { + /* The incoming RESET doesn't match the NSVCI. Send an + * appropriate RESET_ACK and ignore the RESET. + * See 3GPP TS 08.16, 7.3.1, 2nd paragraph. + */ + ns_osmo_signal_dispatch_mismatch(*nsvc, msg, + NS_PDUT_RESET, + NS_IE_VCI); + rate_ctr_inc(&(*nsvc)->ctrg->ctr[NS_CTR_INV_VCI]); + gprs_ns_tx_reset_ack(*nsvc); + return 0; } + + /* NS-VCI has changed */ + gprs_nsvc_replace_if_found(nsvci, nsvc, &orig_nsvc); + + } else if ((*nsvc)->nsei != nsei) { + /* The incoming RESET doesn't match the NSEI. Send an + * appropriate RESET_ACK and ignore the RESET. + * See 3GPP TS 08.16, 7.3.1, 3rd paragraph. + */ + ns_osmo_signal_dispatch_mismatch(*nsvc, msg, + NS_PDUT_RESET, + NS_IE_NSEI); + rate_ctr_inc(&(*nsvc)->ctrg->ctr[NS_CTR_INV_NSEI]); + gprs_ns_tx_reset_ack(*nsvc); + return 0; } /* Mark NS-VC as blocked and alive */ (*nsvc)->state = NSE_S_BLOCKED | NSE_S_ALIVE; - if (other_nsvc) { - /* Check NSEI */ - if ((*nsvc)->nsei != nsei) { - LOGP(DNS, LOGL_NOTICE, - "NS-VC changed NSEI (NSVCI=%u) from %u to %u\n", - nsvci, (*nsvc)->nsei, nsei); - - /* Override old NSEI */ - (*nsvc)->nsei = nsei; - - /* Do statistics */ - rate_ctr_inc(&(*nsvc)->ctrg->ctr[NS_CTR_NSEI_CHG]); - } - - ns_osmo_signal_dispatch_replaced(*nsvc, other_nsvc); + if (orig_nsvc) { + ns_osmo_signal_dispatch_replaced(*nsvc, orig_nsvc); /* Update the ll info fields */ - gprs_ns_ll_copy(*nsvc, other_nsvc); - gprs_ns_ll_clear(other_nsvc); + gprs_ns_ll_copy(*nsvc, orig_nsvc); + gprs_ns_ll_clear(orig_nsvc); } else { (*nsvc)->nsei = nsei; (*nsvc)->nsvci = nsvci; @@ -776,6 +829,121 @@ static int gprs_ns_rx_reset(struct gprs_nsvc **nsvc, struct msgb *msg) return rc; } +static int gprs_ns_rx_reset_ack(struct gprs_nsvc **nsvc, struct msgb *msg) +{ + struct gprs_ns_hdr *nsh = (struct gprs_ns_hdr *) msg->l2h; + struct tlv_parsed tp; + uint16_t nsvci, nsei; + struct gprs_nsvc *orig_nsvc = NULL; + int rc; + + rc = tlv_parse(&tp, &ns_att_tlvdef, nsh->data, + msgb_l2len(msg) - sizeof(*nsh), 0, 0); + if (rc < 0) { + LOGP(DNS, LOGL_ERROR, "NSEI=%u Rx NS RESET ACK " + "Error during TLV Parse\n", (*nsvc)->nsei); + return rc; + } + + if (!TLVP_PRESENT(&tp, NS_IE_VCI) || + !TLVP_PRESENT(&tp, NS_IE_NSEI)) { + LOGP(DNS, LOGL_ERROR, "NS RESET ACK Missing mandatory IE\n"); + gprs_ns_tx_status(*nsvc, NS_CAUSE_MISSING_ESSENT_IE, 0, msg); + return -EINVAL; + } + + nsvci = ntohs(*(uint16_t *) TLVP_VAL(&tp, NS_IE_VCI)); + nsei = ntohs(*(uint16_t *) TLVP_VAL(&tp, NS_IE_NSEI)); + + LOGP(DNS, LOGL_INFO, "NSVCI=%u%s Rx NS RESET ACK (NSEI=%u, NSVCI=%u)\n", + (*nsvc)->nsvci, (*nsvc)->nsvci_is_valid ? "" : "(invalid)", + nsei, nsvci); + + if (!((*nsvc)->state & NSE_S_RESET)) { + /* Not waiting for a RESET_ACK on this NS-VC, ignore it. + * See 3GPP TS 08.16, 7.3.1, 5th paragraph. + */ + LOGP(DNS, LOGL_ERROR, + "NS RESET ACK Discarding unexpected message for " + "NS-VCI %d from SGSN NSEI=%d\n", + nsvci, nsei); + return 0; + } + + if (!(*nsvc)->nsvci_is_valid) { + LOGP(DNS, LOGL_NOTICE, + "NS RESET ACK Uninitialised NS-VC (%u) for " + "NS-VCI %d, NSEI=%d from %s\n", + (*nsvc)->nsvci, nsvci, nsei, gprs_ns_ll_str(*nsvc)); + return -EINVAL; + } + + if ((*nsvc)->nsvci != nsvci) { + /* NS-VCI has changed */ + + /* if !0, use another NSVC object that matches the NSVCI */ + int use_other_nsvc; + + /* Only do this with BSS peers */ + use_other_nsvc = !(*nsvc)->remote_end_is_sgsn; + + if (use_other_nsvc) + /* Update *nsvc to point to the right NSVC object */ + use_other_nsvc = gprs_nsvc_replace_if_found(nsvci, nsvc, + &orig_nsvc); + + if (!use_other_nsvc) { + /* The incoming RESET_ACK doesn't match the NSVCI. + * See 3GPP TS 08.16, 7.3.1, 4th paragraph. + */ + ns_osmo_signal_dispatch_mismatch(*nsvc, msg, + NS_PDUT_RESET_ACK, + NS_IE_VCI); + rate_ctr_inc(&(*nsvc)->ctrg->ctr[NS_CTR_INV_VCI]); + LOGP(DNS, LOGL_ERROR, + "NS RESET ACK Unknown NS-VCI %d (%s NSEI=%d) " + "from %s\n", + nsvci, + (*nsvc)->remote_end_is_sgsn ? "SGSN" : "BSS", + nsei, gprs_ns_ll_str(*nsvc)); + return -EINVAL; + } + + /* Notify others */ + ns_osmo_signal_dispatch_replaced(*nsvc, orig_nsvc); + + /* Update the ll info fields */ + gprs_ns_ll_copy(*nsvc, orig_nsvc); + gprs_ns_ll_clear(orig_nsvc); + } else if ((*nsvc)->nsei != nsei) { + /* The incoming RESET_ACK doesn't match the NSEI. + * See 3GPP TS 08.16, 7.3.1, 4th paragraph. + */ + ns_osmo_signal_dispatch_mismatch(*nsvc, msg, + NS_PDUT_RESET_ACK, + NS_IE_NSEI); + rate_ctr_inc(&(*nsvc)->ctrg->ctr[NS_CTR_INV_NSEI]); + LOGP(DNS, LOGL_ERROR, + "NS RESET ACK Unknown NSEI %d (NS-VCI=%u) from %s\n", + nsei, nsvci, gprs_ns_ll_str(*nsvc)); + return -EINVAL; + } + + /* Mark NS-VC as blocked and alive */ + (*nsvc)->state = NSE_S_BLOCKED | NSE_S_ALIVE; + (*nsvc)->remote_state = NSE_S_BLOCKED | NSE_S_ALIVE; + rate_ctr_inc(&(*nsvc)->ctrg->ctr[NS_CTR_BLOCKED]); + if ((*nsvc)->persistent || (*nsvc)->remote_end_is_sgsn) { + /* stop RESET timer */ + osmo_timer_del(&(*nsvc)->timer); + } + /* Initiate TEST proc.: Send ALIVE and start timer */ + rc = gprs_ns_tx_simple(*nsvc, NS_PDUT_ALIVE); + nsvc_start_timer(*nsvc, NSVC_TIMER_TNS_TEST); + + return rc; +} + static int gprs_ns_rx_block(struct gprs_nsvc *nsvc, struct msgb *msg) { struct gprs_ns_hdr *nsh = (struct gprs_ns_hdr *) msg->l2h; @@ -944,6 +1112,7 @@ int gprs_ns_vc_create(struct gprs_ns_inst *nsi, struct msgb *msg, "from %s for non-existing NS-VC\n", nsh->pdu_type, gprs_ns_ll_str(fallback_nsvc)); fallback_nsvc->nsvci = fallback_nsvc->nsei = 0xfffe; + fallback_nsvc->nsvci_is_valid = 0; fallback_nsvc->state = NSE_S_ALIVE; rc = gprs_ns_tx_status(fallback_nsvc, @@ -1057,18 +1226,7 @@ int gprs_ns_process_msg(struct gprs_ns_inst *nsi, struct msgb *msg, rc = gprs_ns_rx_reset(nsvc, msg); break; case NS_PDUT_RESET_ACK: - LOGP(DNS, LOGL_INFO, "NSEI=%u Rx NS RESET ACK\n", (*nsvc)->nsei); - /* mark NS-VC as blocked + active */ - (*nsvc)->state = NSE_S_BLOCKED | NSE_S_ALIVE; - (*nsvc)->remote_state = NSE_S_BLOCKED | NSE_S_ALIVE; - rate_ctr_inc(&(*nsvc)->ctrg->ctr[NS_CTR_BLOCKED]); - if ((*nsvc)->persistent || (*nsvc)->remote_end_is_sgsn) { - /* stop RESET timer */ - osmo_timer_del(&(*nsvc)->timer); - } - /* Initiate TEST proc.: Send ALIVE and start timer */ - rc = gprs_ns_tx_simple(*nsvc, NS_PDUT_ALIVE); - nsvc_start_timer(*nsvc, NSVC_TIMER_TNS_TEST); + rc = gprs_ns_rx_reset_ack(nsvc, msg); break; case NS_PDUT_UNBLOCK: /* Section 7.2: unblocking procedure */ @@ -1323,6 +1481,7 @@ struct gprs_nsvc *gprs_ns_nsip_connect(struct gprs_ns_inst *nsi, nsvc->ip.bts_addr = *dest; nsvc->nsei = nsei; nsvc->nsvci = nsvci; + nsvc->nsvci_is_valid = 1; nsvc->remote_end_is_sgsn = 1; gprs_nsvc_reset(nsvc, NS_CAUSE_OM_INTERVENTION); diff --git a/tests/gb/gprs_ns_test.c b/tests/gb/gprs_ns_test.c index 3d0293eb..546c20a3 100644 --- a/tests/gb/gprs_ns_test.c +++ b/tests/gb/gprs_ns_test.c @@ -357,6 +357,12 @@ static int test_signal(unsigned int subsys, unsigned int signal, gprs_ns_ll_str(nssd->old_nsvc)); break; + case S_NS_MISMATCH: + printf("==> got signal NS_MISMATCH: 0x%04x/%s pdu=%d, ie=%d\n", + nssd->nsvc->nsvci, gprs_ns_ll_str(nssd->nsvc), + nssd->pdu_type, nssd->ie_type); + break; + default: printf("==> got signal %d, NS-VC 0x%04x/%s\n", signal, nssd->nsvc->nsvci, diff --git a/tests/gb/gprs_ns_test.ok b/tests/gb/gprs_ns_test.ok index 96fbd380..a882488a 100644 --- a/tests/gb/gprs_ns_test.ok +++ b/tests/gb/gprs_ns_test.ok @@ -196,7 +196,7 @@ PROCESSING RESET from 0x01020304:3333 ==> got signal NS_REPLACED: 0x1122/1.2.3.4:4444 -> 0x3344/1.2.3.4:3333 ==> got signal NS_RESET, NS-VC 0x1122/1.2.3.4:3333 MESSAGE to BSS, msg length 9 -03 01 82 11 22 04 82 11 22 +03 01 82 11 22 04 82 33 44 MESSAGE to BSS, msg length 1 0a @@ -205,9 +205,9 @@ result (RESET) = 9 Current NS-VCIs: VCI 0x3344, NSEI 0x1122, peer 0x00000000:0, blocked - VCI 0x1122, NSEI 0x1122, peer 0x01020304:3333, blocked + VCI 0x1122, NSEI 0x3344, peer 0x01020304:3333, blocked NS-VC replaced other count: 1 - NS-VC changed NSEI : 2 + NS-VC changed NSEI : 1 --- Peer port 4444, RESET, NSEI is changed back --- @@ -340,35 +340,21 @@ MESSAGE to BSS, msg length 12 PROCESSING RESET_ACK from 0x01020304:2222 03 01 82 10 01 04 82 10 00 +==> got signal NS_REPLACED: 0x1001/1.2.3.4:1111 -> 0x2001/1.2.3.4:2222 MESSAGE to BSS, msg length 1 0a result (RESET_ACK) = 1 Current NS-VCIs: - VCI 0x2001, NSEI 0x2000, peer 0x01020304:2222, blocked - NS-VC Block count : 1 - VCI 0x1001, NSEI 0x1000, peer 0x01020304:1111, blocked - NS-VC Block count : 1 + VCI 0x2001, NSEI 0x2000, peer 0x00000000:0 + VCI 0x1001, NSEI 0x1000, peer 0x01020304:2222, blocked + NS-VC Block count : 2 + NS-VC replaced other count: 1 --- Setup VC 2 SGSN -> BSS (hits NSEI 2) --- -MESSAGE to BSS, msg length 12 -02 00 81 01 01 82 20 01 04 82 20 00 - -PROCESSING RESET_ACK from 0x01020304:1111 -03 01 82 20 01 04 82 20 00 - -MESSAGE to BSS, msg length 1 -0a - -result (RESET_ACK) = 1 - -Current NS-VCIs: - VCI 0x2001, NSEI 0x2000, peer 0x01020304:2222, blocked - NS-VC Block count : 1 - VCI 0x1001, NSEI 0x1000, peer 0x01020304:1111, blocked - NS-VC Block count : 2 +Failed to send RESET to 0.0.0.0:0 --- Setup VC 1 SGSN -> BSS (hits NSEI 1) --- @@ -384,10 +370,10 @@ MESSAGE to BSS, msg length 1 result (RESET_ACK) = 1 Current NS-VCIs: - VCI 0x2001, NSEI 0x2000, peer 0x01020304:2222, blocked - NS-VC Block count : 2 - VCI 0x1001, NSEI 0x1000, peer 0x01020304:1111, blocked - NS-VC Block count : 2 + VCI 0x2001, NSEI 0x2000, peer 0x00000000:0 + VCI 0x1001, NSEI 0x1000, peer 0x01020304:2222, blocked + NS-VC Block count : 3 + NS-VC replaced other count: 1 --- Setup VC 2 BSS -> SGSN --- @@ -396,7 +382,6 @@ Setup NS-VC: remote 0x01020304:1111, NSVCI 0x2001(8193), NSEI 0x2000(8192) PROCESSING RESET from 0x01020304:1111 02 00 81 01 01 82 20 01 04 82 20 00 -==> got signal NS_REPLACED: 0x2001/1.2.3.4:2222 -> 0x1001/1.2.3.4:1111 ==> got signal NS_RESET, NS-VC 0x2001/1.2.3.4:1111 MESSAGE to BSS, msg length 9 03 01 82 20 01 04 82 20 00 @@ -430,32 +415,27 @@ result (ALIVE_ACK) = 0 Current NS-VCIs: VCI 0x2001, NSEI 0x2000, peer 0x01020304:1111 - NS-VC Block count : 2 + VCI 0x1001, NSEI 0x1000, peer 0x01020304:2222, blocked + NS-VC Block count : 3 NS-VC replaced other count: 1 - VCI 0x1001, NSEI 0x1000, peer 0x00000000:0, blocked - NS-VC Block count : 2 --- RESET with invalid NSEI, BSS -> SGSN --- PROCESSING RESET from 0x01020304:2222 02 00 81 01 01 82 10 01 04 82 f0 00 -==> got signal NS_RESET, NS-VC 0x1001/1.2.3.4:2222 +==> got signal NS_MISMATCH: 0x1001/1.2.3.4:2222 pdu=2, ie=4 MESSAGE to BSS, msg length 9 -03 01 82 10 01 04 82 f0 00 +03 01 82 10 01 04 82 10 00 -MESSAGE to BSS, msg length 1 -0a - -result (RESET) = 9 +result (RESET) = 0 Current NS-VCIs: VCI 0x2001, NSEI 0x2000, peer 0x01020304:1111 - NS-VC Block count : 2 + VCI 0x1001, NSEI 0x1000, peer 0x01020304:2222, blocked + NS-VC Block count : 3 NS-VC replaced other count: 1 - VCI 0x1001, NSEI 0xf000, peer 0x01020304:2222, blocked - NS-VC Block count : 2 - NS-VC changed NSEI : 1 + NSEI was invalid count : 1 --- RESET with invalid NSVCI, BSS -> SGSN --- @@ -473,11 +453,10 @@ result (RESET) = 9 Current NS-VCIs: VCI 0x2001, NSEI 0x2000, peer 0x01020304:1111 - NS-VC Block count : 2 - NS-VC replaced other count: 1 VCI 0xf001, NSEI 0x1000, peer 0x01020304:2222, blocked - NS-VC Block count : 2 - NS-VC changed NSEI : 1 + NS-VC Block count : 3 + NS-VC replaced other count: 1 + NSEI was invalid count : 1 --- RESET with old NSEI, NSVCI, BSS -> SGSN --- @@ -495,29 +474,24 @@ result (RESET) = 9 Current NS-VCIs: VCI 0x2001, NSEI 0x2000, peer 0x01020304:1111 - NS-VC Block count : 2 - NS-VC replaced other count: 1 VCI 0x1001, NSEI 0x1000, peer 0x01020304:2222, blocked - NS-VC Block count : 2 - NS-VC changed NSEI : 1 + NS-VC Block count : 3 + NS-VC replaced other count: 1 + NSEI was invalid count : 1 --- Unexpected RESET_ACK VC 1, BSS -> SGSN --- 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 +result (RESET_ACK) = 0 Current NS-VCIs: VCI 0x2001, NSEI 0x2000, peer 0x01020304:1111 - NS-VC Block count : 2 - NS-VC replaced other count: 1 VCI 0x1001, NSEI 0x1000, peer 0x01020304:2222, blocked NS-VC Block count : 3 - NS-VC changed NSEI : 1 + NS-VC replaced other count: 1 + NSEI was invalid count : 1 --- RESET_ACK with invalid NSEI, BSS -> SGSN --- @@ -527,18 +501,15 @@ MESSAGE to BSS, msg length 12 PROCESSING RESET_ACK from 0x01020304:2222 03 01 82 10 01 04 82 f0 00 -MESSAGE to BSS, msg length 1 -0a - -result (RESET_ACK) = 1 +==> got signal NS_MISMATCH: 0x1001/1.2.3.4:2222 pdu=3, ie=4 +result (RESET_ACK) = -22 Current NS-VCIs: VCI 0x2001, NSEI 0x2000, peer 0x01020304:1111 - NS-VC Block count : 2 - NS-VC replaced other count: 1 VCI 0x1001, NSEI 0x1000, peer 0x01020304:2222, blocked - NS-VC Block count : 4 - NS-VC changed NSEI : 1 + NS-VC Block count : 3 + NS-VC replaced other count: 1 + NSEI was invalid count : 2 --- RESET_ACK with invalid NSVCI, BSS -> SGSN --- @@ -548,18 +519,16 @@ MESSAGE to BSS, msg length 12 PROCESSING RESET_ACK from 0x01020304:2222 03 01 82 f0 01 04 82 10 00 -MESSAGE to BSS, msg length 1 -0a - -result (RESET_ACK) = 1 +==> got signal NS_MISMATCH: 0x1001/1.2.3.4:2222 pdu=3, ie=1 +result (RESET_ACK) = -22 Current NS-VCIs: VCI 0x2001, NSEI 0x2000, peer 0x01020304:1111 - NS-VC Block count : 2 - NS-VC replaced other count: 1 VCI 0x1001, NSEI 0x1000, peer 0x01020304:2222, blocked - NS-VC Block count : 5 - NS-VC changed NSEI : 1 + NS-VC Block count : 3 + NS-VC replaced other count: 1 + NS-VCI was invalid count : 1 + NSEI was invalid count : 2 Current NS-VCIs: @@ -617,36 +586,33 @@ Current NS-VCIs: PROCESSING RESET from 0x05060708:32000 02 00 81 01 01 82 01 01 04 82 f0 00 -==> got signal NS_RESET, NS-VC 0x0101/5.6.7.8:32000 +==> got signal NS_MISMATCH: 0x0101/5.6.7.8:32000 pdu=2, ie=4 MESSAGE to SGSN, msg length 9 -03 01 82 01 01 04 82 f0 00 - -MESSAGE to SGSN, msg length 1 -0a +03 01 82 01 01 04 82 01 00 -result (RESET) = 9 +result (RESET) = 0 Current NS-VCIs: - VCI 0x0101, NSEI 0xf000, peer 0x05060708:32000, blocked + VCI 0x0101, NSEI 0x0100, peer 0x05060708:32000, blocked NS-VC Block count : 1 + NSEI was invalid count : 1 --- RESET with invalid NSVCI, SGSN -> BSS --- PROCESSING RESET from 0x05060708:32000 02 00 81 01 01 82 f0 01 04 82 01 00 -==> got signal NS_RESET, NS-VC 0xf001/5.6.7.8:32000 +==> got signal NS_MISMATCH: 0x0101/5.6.7.8:32000 pdu=2, ie=1 MESSAGE to SGSN, msg length 9 -03 01 82 f0 01 04 82 01 00 - -MESSAGE to SGSN, msg length 1 -0a +03 01 82 01 01 04 82 01 00 -result (RESET) = 9 +result (RESET) = 0 Current NS-VCIs: - VCI 0xf001, NSEI 0x0100, peer 0x05060708:32000, blocked + VCI 0x0101, NSEI 0x0100, peer 0x05060708:32000, blocked NS-VC Block count : 1 + NS-VCI was invalid count : 1 + NSEI was invalid count : 1 --- RESET, SGSN -> BSS --- @@ -665,20 +631,21 @@ result (RESET) = 9 Current NS-VCIs: VCI 0x0101, NSEI 0x0100, peer 0x05060708:32000, blocked NS-VC Block count : 1 + NS-VCI was invalid count : 1 + NSEI was invalid count : 1 --- Unexpected RESET_ACK VC 1, BSS -> SGSN --- PROCESSING RESET_ACK from 0x05060708:32000 03 01 82 01 01 04 82 01 00 -MESSAGE to SGSN, msg length 1 -0a - -result (RESET_ACK) = 1 +result (RESET_ACK) = 0 Current NS-VCIs: VCI 0x0101, NSEI 0x0100, peer 0x05060708:32000, blocked - NS-VC Block count : 2 + NS-VC Block count : 1 + NS-VCI was invalid count : 1 + NSEI was invalid count : 1 --- RESET_ACK with invalid NSEI, BSS -> SGSN --- @@ -688,14 +655,14 @@ MESSAGE to SGSN, msg length 12 PROCESSING RESET_ACK from 0x05060708:32000 03 01 82 01 01 04 82 e0 00 -MESSAGE to SGSN, msg length 1 -0a - -result (RESET_ACK) = 1 +==> got signal NS_MISMATCH: 0x0101/5.6.7.8:32000 pdu=3, ie=4 +result (RESET_ACK) = -22 Current NS-VCIs: VCI 0x0101, NSEI 0x0100, peer 0x05060708:32000, blocked - NS-VC Block count : 3 + NS-VC Block count : 1 + NS-VCI was invalid count : 1 + NSEI was invalid count : 2 --- RESET_ACK with invalid NSVCI, BSS -> SGSN --- @@ -705,14 +672,14 @@ MESSAGE to SGSN, msg length 12 PROCESSING RESET_ACK from 0x05060708:32000 03 01 82 e0 01 04 82 01 00 -MESSAGE to SGSN, msg length 1 -0a - -result (RESET_ACK) = 1 +==> got signal NS_MISMATCH: 0x0101/5.6.7.8:32000 pdu=3, ie=1 +result (RESET_ACK) = -22 Current NS-VCIs: VCI 0x0101, NSEI 0x0100, peer 0x05060708:32000, blocked - NS-VC Block count : 4 + NS-VC Block count : 1 + NS-VCI was invalid count : 2 + NSEI was invalid count : 2 Current NS-VCIs: -- cgit v1.2.3