diff options
author | Alexander Couzens <lynxis@fe80.eu> | 2021-01-20 14:50:31 +0100 |
---|---|---|
committer | Alexander Couzens <lynxis@fe80.eu> | 2021-01-25 15:35:14 +0100 |
commit | 3f576ab486bbee211593014cbc453d4ae1999775 (patch) | |
tree | 93adbbe2260bf88b0a563fde5f932c2a26ac5688 /src/gb/gprs_ns2_vc_fsm.c | |
parent | 43771df63f5e7f578ee97c8df8e9dde07969c081 (diff) |
gprs_ns2_vc_fsm: check NSVCI match the NSE
The NSVCI must match the PDUs. The only exception is a RESET with
dialect ipaccess. However those will be handled later.
Change-Id: I0ebdd4f4135b03a7d44a93aff3846c8ec19f333b
Diffstat (limited to 'src/gb/gprs_ns2_vc_fsm.c')
-rw-r--r-- | src/gb/gprs_ns2_vc_fsm.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/src/gb/gprs_ns2_vc_fsm.c b/src/gb/gprs_ns2_vc_fsm.c index 3ec69097..d4f43207 100644 --- a/src/gb/gprs_ns2_vc_fsm.c +++ b/src/gb/gprs_ns2_vc_fsm.c @@ -750,11 +750,10 @@ int gprs_ns2_vc_rx(struct gprs_ns2_vc *nsvc, struct msgb *msg, struct tlv_parsed struct osmo_fsm_inst *fi = nsvc->fi; int rc = 0; uint8_t cause; - uint16_t nsei; + uint16_t nsei, nsvci; /* TODO: 7.2: on UNBLOCK/BLOCK: check if NS-VCI is correct, * if not answer STATUS with "NS-VC unknown" */ - /* TODO: handle RESET with different VCI */ /* TODO: handle BLOCK/UNBLOCK/ALIVE with different VCI */ if (gprs_ns2_validate(nsvc, nsh->pdu_type, msg, tp, &cause)) { @@ -777,6 +776,19 @@ int gprs_ns2_vc_rx(struct gprs_ns2_vc *nsvc, struct msgb *msg, struct tlv_parsed } } + if (nsvc->nsvci_is_valid && TLVP_PRESENT(tp, NS_IE_VCI)) { + nsvci = tlvp_val16be(tp, NS_IE_VCI); + if (nsvci != nsvc->nsvci) { + /* 48.016 ยง 7.3.1 send RESET_ACK to wrong NSVCI + ignore */ + if (nsh->pdu_type == NS_PDUT_RESET) + ns2_tx_reset_ack(nsvc); + + LOGNSVC(nsvc, LOGL_ERROR, "Rx %s with wrong NSVCI=%05u. Ignoring PDU.\n", + get_value_string(gprs_ns_pdu_strings, nsh->pdu_type), nsvci); + goto out; + } + } + switch (nsh->pdu_type) { case NS_PDUT_RESET: osmo_fsm_inst_dispatch(fi, GPRS_NS2_EV_RX_RESET, tp); |