pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmo-gprs/+/32316 )
Change subject: sm: Handle radio_prio,qos,llc_sapi in rx PDP Ctx Accept ......................................................................
sm: Handle radio_prio,qos,llc_sapi in rx PDP Ctx Accept
Related: OS#5501 Change-Id: Icbd9ba82b6d8cbcfcaf5a80ddc801139c409c585 --- M include/osmocom/gprs/sm/sm_prim.h M include/osmocom/gprs/sm/sm_private.h M src/sm/sm.c 3 files changed, 26 insertions(+), 9 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/libosmo-gprs refs/changes/16/32316/1
diff --git a/include/osmocom/gprs/sm/sm_prim.h b/include/osmocom/gprs/sm/sm_prim.h index 4f16ae4..86a36d2 100644 --- a/include/osmocom/gprs/sm/sm_prim.h +++ b/include/osmocom/gprs/sm/sm_prim.h @@ -82,6 +82,7 @@ enum osmo_gprs_sm_pdp_addr_ietf_type pdp_addr_ietf_type; struct osmo_sockaddr pdp_addr_v4; struct osmo_sockaddr pdp_addr_v6; + uint8_t radio_prio; /* TS 24.008 10.5.7.2 */ uint8_t qos[OSMO_GPRS_SM_QOS_MAXLEN]; uint8_t qos_len; } acc; diff --git a/include/osmocom/gprs/sm/sm_private.h b/include/osmocom/gprs/sm/sm_private.h index c727cd2..56b3e4f 100644 --- a/include/osmocom/gprs/sm/sm_private.h +++ b/include/osmocom/gprs/sm/sm_private.h @@ -103,6 +103,7 @@ struct osmo_sockaddr pdp_addr_v4; struct osmo_sockaddr pdp_addr_v6;
+ uint8_t radio_prio; /* TS 24.008 10.5.7.2 */ uint8_t qos[OSMO_GPRS_SM_QOS_MAXLEN]; uint8_t qos_len;
diff --git a/src/sm/sm.c b/src/sm/sm.c index d760ae6..c57ef3f 100644 --- a/src/sm/sm.c +++ b/src/sm/sm.c @@ -212,6 +212,10 @@ sm_prim_tx->smreg.pdp_act_cnf.acc.pdp_addr_ietf_type = sme->pdp_addr_ietf_type; memcpy(&sm_prim_tx->smreg.pdp_act_cnf.acc.pdp_addr_v4, &sme->pdp_addr_v4, sizeof(sme->pdp_addr_v4)); memcpy(&sm_prim_tx->smreg.pdp_act_cnf.acc.pdp_addr_v6, &sme->pdp_addr_v6, sizeof(sme->pdp_addr_v6)); + sm_prim_tx->smreg.pdp_act_cnf.acc.radio_prio = sme->radio_prio; + sm_prim_tx->smreg.pdp_act_cnf.acc.qos_len = sme->qos_len; + if (sme->qos_len) + memcpy(sm_prim_tx->smreg.pdp_act_cnf.acc.qos, &sme->qos, sme->qos_len); } else { sm_prim_tx->smreg.pdp_act_cnf.rej.cause = cause; } @@ -269,10 +273,8 @@ { struct tlv_parsed tp; int rc; - uint8_t radio_prio, llc_sapi; uint8_t *ofs = (uint8_t *)gh; uint8_t qos_len; - uint8_t *qos;
ofs += sizeof(*gh); //uint8_t transaction_id = gsm48_hdr_trans_id(gh); @@ -281,22 +283,25 @@
if (len < (ofs + 2) - (uint8_t *)gh) goto tooshort; - llc_sapi = *ofs++; + sme->llc_sapi = *ofs++; qos_len = *ofs++;
+ if (qos_len > ARRAY_SIZE(sme->qos)) { + LOGSME(sme, LOGL_ERROR, + "Rx SM Activate PDP Context Accept: QoS size too big! %u\n", qos_len); + goto rejected; + } + if (len < (ofs + qos_len) - (uint8_t *)gh) goto tooshort; - qos = ofs; + memcpy(sme->qos, ofs, qos_len); + ofs += qos_len;
if (len < (ofs + 1) - (uint8_t *)gh) goto tooshort;
- radio_prio = *ofs++; - - (void)llc_sapi; - (void)qos; - (void)radio_prio; + sme->radio_prio = *ofs++;
if (len > ofs - (uint8_t *)gh) { rc = gprs_sm_tlv_parse(&tp, ofs, len - (ofs - (uint8_t *)gh));