diff options
author | Harald Welte <laforge@gnumonks.org> | 2016-05-01 15:23:41 +0200 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2016-05-01 15:35:58 +0200 |
commit | 74101106a1114d819dfce83cd5a50837c8bd5d0e (patch) | |
tree | 8707a5d8e453a6db87d6475aa79b8f34a7f61744 /openbsc/src | |
parent | db916bfd8dcceaeb0414ea0628e99a8e7955e660 (diff) |
RAB Assignment Response: Handle TEID changes
When the RNC confirms the RAB Assignment, it can each time indicate a
new TEID for the GTP-U endpoint on the RNC side. We need to update our
information about the PDP context and include that in the UPDATE PDP
CONTEXT that we're sending towards the GGSN. This is similar to
updating the RNC-side IP address of the GTP endpoint.
Diffstat (limited to 'openbsc/src')
-rw-r--r-- | openbsc/src/gprs/sgsn_libgtp.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/openbsc/src/gprs/sgsn_libgtp.c b/openbsc/src/gprs/sgsn_libgtp.c index 4205fbc14..a41d6d71c 100644 --- a/openbsc/src/gprs/sgsn_libgtp.c +++ b/openbsc/src/gprs/sgsn_libgtp.c @@ -399,6 +399,7 @@ reject: int sgsn_ranap_rab_ass_resp(struct sgsn_mm_ctx *ctx, RANAP_RAB_SetupOrModifiedItemIEs_t *setup_ies) { uint8_t rab_id; + bool require_pdp_update = false; struct sgsn_pdp_ctx *pdp = NULL; RANAP_RAB_SetupOrModifiedItem_t *item = &setup_ies->raB_SetupOrModifiedItem; @@ -411,14 +412,27 @@ int sgsn_ranap_rab_ass_resp(struct sgsn_mm_ctx *ctx, RANAP_RAB_SetupOrModifiedIt } if (item->transportLayerAddress) { - LOGPC(DRANAP, LOGL_INFO, " Setup: (%u/%s)", rab_id, osmo_hexdump(item->transportLayerAddress->buf, item->transportLayerAddress->size)); memcpy(pdp->lib->gsnlu.v, &item->transportLayerAddress->buf[3], 4); - gtp_update_context(pdp->ggsn->gsn, pdp->lib, pdp, &pdp->lib->hisaddr0); + require_pdp_update = true; + } + /* The TEI on the RNC side might have changed, too */ + if (item->iuTransportAssociation && + item->iuTransportAssociation->present == RANAP_IuTransportAssociation_PR_gTP_TEI && + item->iuTransportAssociation->choice.gTP_TEI.buf && + item->iuTransportAssociation->choice.gTP_TEI.size >= 4) { + uint32_t tei = osmo_load32be(item->iuTransportAssociation->choice.gTP_TEI.buf); + LOGP(DRANAP, LOGL_DEBUG, "Updating TEID on RNC side from 0x%08x to 0x%08x\n", + pdp->lib->teid_own, tei); + pdp->lib->teid_own = tei; + require_pdp_update = true; } + if (require_pdp_update) + gtp_update_context(pdp->ggsn->gsn, pdp->lib, pdp, &pdp->lib->hisaddr0); + if (pdp->state != PDP_STATE_CR_CONF) { send_act_pdp_cont_acc(pdp); pdp->state = PDP_STATE_CR_CONF; |