From 711333c1137137508912000cc9e4398cf205c341 Mon Sep 17 00:00:00 2001 From: Daniel Willmann Date: Mon, 15 Feb 2016 13:58:35 +0100 Subject: sgsn_iu: Parse the RAB assignemnt response and get pdp ctx form it The RAB assignment response includes the gtp teid that we sent along in the assignment request. Retrieve the correct pdp context from there and activate it. --- openbsc/src/libiu/iu.c | 41 ++++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) (limited to 'openbsc/src/libiu/iu.c') diff --git a/openbsc/src/libiu/iu.c b/openbsc/src/libiu/iu.c index 41425df3a..33583aa82 100644 --- a/openbsc/src/libiu/iu.c +++ b/openbsc/src/libiu/iu.c @@ -101,8 +101,6 @@ int iu_rab_act_ps(struct sgsn_pdp_ctx *pdp) uint32_t ggsn_ip; uectx = mm->iu.ue_ctx; - uectx->pdp = pdp; - /* Get the IP address for ggsn user plane */ memcpy(&ggsn_ip, pdp->lib->gsnru.v, pdp->lib->gsnru.l); @@ -257,27 +255,44 @@ int send_act_pdp_cont_acc(struct sgsn_pdp_ctx *pctx); static int ranap_handle_co_rab_ass_resp(struct ue_conn_ctx *ctx, RANAP_RAB_AssignmentResponseIEs_t *ies) { - int rc; + struct sgsn_mm_ctx *mm; + struct sgsn_pdp_ctx *pdp = NULL; + int i, rc; + uint8_t rab_id; + uint32_t gtp_tei; + + mm = sgsn_mm_ctx_by_ue_ctx(ctx); + /* XXX: Error handling */ LOGP(DRANAP, LOGL_INFO, "RAB Asignment Response:"); - if (0) { -// if (ies->presenceMask & RAB_ASSIGNMENTRESPONSEIES_RANAP_RAB_SETUPORMODIFIEDLIST_PRESENT) { + if (ies->presenceMask & RAB_ASSIGNMENTRESPONSEIES_RANAP_RAB_SETUPORMODIFIEDLIST_PRESENT) { + RANAP_IE_t *ranap_ie = ies->raB_SetupOrModifiedList.raB_SetupOrModifiedList_ies.list.array[0]; RANAP_RAB_SetupOrModifiedItemIEs_t setup_ies; RANAP_RAB_SetupOrModifiedItem_t *item = &setup_ies.raB_SetupOrModifiedItem; - rc = ranap_decode_rab_setupormodifieditemies(&setup_ies, - (ANY_t *)&ies->raB_SetupOrModifiedList); + rc = ranap_decode_rab_setupormodifieditemies(&setup_ies, &ranap_ie->value); + + rab_id = item->rAB_ID.buf[0]; + if (item->iuTransportAssociation->present == RANAP_IuTransportAssociation_PR_gTP_TEI) { + gtp_tei = asn1str_to_u32(&item->iuTransportAssociation->choice.gTP_TEI); + pdp = sgsn_pdp_ctx_by_tei(mm, gtp_tei); + } + + if (!pdp) { + ranap_free_rab_setupormodifieditemies(&setup_ies); + return -1; + } + if (item->transportLayerAddress) { - uint8_t rab_id = item->rAB_ID.buf[0]; - LOGPC(DRANAP, LOGL_INFO, " Setup: (%u/%s)", - rab_id, - osmo_hexdump(item->transportLayerAddress->buf, - item->transportLayerAddress->size)); + + LOGPC(DRANAP, LOGL_INFO, " Setup: (%u/%s)", rab_id, osmo_hexdump(item->transportLayerAddress->buf, + item->transportLayerAddress->size)); } + ranap_free_rab_setupormodifieditemies(&setup_ies); } LOGPC(DRANAP, LOGL_INFO, "\n"); - send_act_pdp_cont_acc(ctx->pdp); + send_act_pdp_cont_acc(pdp); return rc; } -- cgit v1.2.3