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
This commit is contained in:
Jacob Erlbeck 2013-10-24 01:33:23 +02:00 committed by Holger Hans Peter Freyther
parent 81d7c14756
commit 5405a104bb
4 changed files with 294 additions and 157 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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,

View File

@ -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
03 01 82 01 01 04 82 01 00
MESSAGE to SGSN, msg length 1
0a
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
03 01 82 01 01 04 82 01 00
MESSAGE to SGSN, msg length 1
0a
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: