aboutsummaryrefslogtreecommitdiffstats
path: root/src/gb/gprs_ns2_vc_fsm.c
diff options
context:
space:
mode:
authorAlexander Couzens <lynxis@fe80.eu>2021-01-20 14:50:31 +0100
committerAlexander Couzens <lynxis@fe80.eu>2021-01-20 17:50:55 +0100
commit9c1e04e5802dfa25fcab3ca2c947897a1b7e7485 (patch)
tree0b471afa0fa9285c10c999dfe8da917feb4ee24c /src/gb/gprs_ns2_vc_fsm.c
parent842599ca6252b9d65504fbe55148c6aad86f7025 (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: I8518bdb03e9e33b04b77a2a346d04c5d29544a6c
Diffstat (limited to 'src/gb/gprs_ns2_vc_fsm.c')
-rw-r--r--src/gb/gprs_ns2_vc_fsm.c16
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);