sgsn: Handle different levels of QoS

If QoS is only three bytes it does not include the allocation/
retention policy. Otherwise it does. Copy it depending on that.
We should have a macro for the clamping to reduce code duplication.

The insanity does come from the MAP data and this seems to be
the easiest in terms of complexity. It is an array of bytes that
is transported from MAPProxy to the SGSN and then simply forwarded.

The case of more than three bytes is neither unit nor manually
tested so far.
This commit is contained in:
Holger Hans Peter Freyther 2015-04-23 11:50:41 -04:00
parent 8cedded88c
commit 4bd931f96d
1 changed files with 12 additions and 5 deletions

View File

@ -199,11 +199,18 @@ struct sgsn_pdp_ctx *sgsn_create_pdp_ctx(struct sgsn_ggsn_ctx *ggsn,
qos = TLVP_VAL(tp, OSMO_IE_GSM_REQ_QOS); qos = TLVP_VAL(tp, OSMO_IE_GSM_REQ_QOS);
} }
pdp->qos_req.l = qos_len + 1; if (qos_len <= 3) {
if (pdp->qos_req.l > sizeof(pdp->qos_req.v)) pdp->qos_req.l = qos_len + 1;
pdp->qos_req.l = sizeof(pdp->qos_req.v); if (pdp->qos_req.l > sizeof(pdp->qos_req.v))
pdp->qos_req.v[0] = 0; /* Allocation/Retention policy */ pdp->qos_req.l = sizeof(pdp->qos_req.v);
memcpy(&pdp->qos_req.v[1], qos, pdp->qos_req.l - 1); pdp->qos_req.v[0] = 0; /* Allocation/Retention policy */
memcpy(&pdp->qos_req.v[1], qos, pdp->qos_req.l - 1);
} else {
pdp->qos_req.l = qos_len;
if (pdp->qos_req.l > sizeof(pdp->qos_req.v))
pdp->qos_req.l = sizeof(pdp->qos_req.v);
memcpy(pdp->qos_req.v, qos, pdp->qos_req.l);
}
/* SGSN address for control plane */ /* SGSN address for control plane */
pdp->gsnlc.l = sizeof(sgsn->cfg.gtp_listenaddr.sin_addr); pdp->gsnlc.l = sizeof(sgsn->cfg.gtp_listenaddr.sin_addr);