aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2016-05-01 12:43:21 +0200
committerHarald Welte <laforge@gnumonks.org>2016-05-01 15:35:57 +0200
commita54358879f1ab928659568ebd6547fc65265f662 (patch)
treee0dbabf77c62508c9ed5784ac5b049193cd56333
parenta54b47b04876152d6f5473d528480a67ccc89803 (diff)
Identify PDP context by RAB ID, not TEI
When receiving an RAB-Assignment response from the RNC, we should use the RAB ID (=NSAPI) to resolve the PDP context. We cannot use the TEID, as the TEID chosen by the RNC for this RAB has no relationship to the TEID we were using for the RAB-Assignment request. TEIDs are local to each of the peer, like UDP port numbers.
-rw-r--r--openbsc/include/openbsc/gprs_sgsn.h3
-rw-r--r--openbsc/src/gprs/gprs_sgsn.c13
-rw-r--r--openbsc/src/gprs/sgsn_libgtp.c8
3 files changed, 2 insertions, 22 deletions
diff --git a/openbsc/include/openbsc/gprs_sgsn.h b/openbsc/include/openbsc/gprs_sgsn.h
index 495836be7..10c2d9a7f 100644
--- a/openbsc/include/openbsc/gprs_sgsn.h
+++ b/openbsc/include/openbsc/gprs_sgsn.h
@@ -311,9 +311,6 @@ struct sgsn_pdp_ctx *sgsn_pdp_ctx_by_nsapi(const struct sgsn_mm_ctx *mm,
/* look up PDP context by MM context and transaction ID */
struct sgsn_pdp_ctx *sgsn_pdp_ctx_by_tid(const struct sgsn_mm_ctx *mm,
uint8_t tid);
-/* look up PDP context by MM context and gtp TEI */
-struct sgsn_pdp_ctx *sgsn_pdp_ctx_by_tei(const struct sgsn_mm_ctx *mm,
- uint32_t tei);
struct sgsn_pdp_ctx *sgsn_pdp_ctx_alloc(struct sgsn_mm_ctx *mm,
uint8_t nsapi);
diff --git a/openbsc/src/gprs/gprs_sgsn.c b/openbsc/src/gprs/gprs_sgsn.c
index 70b0358e6..c34620183 100644
--- a/openbsc/src/gprs/gprs_sgsn.c
+++ b/openbsc/src/gprs/gprs_sgsn.c
@@ -311,19 +311,6 @@ struct sgsn_pdp_ctx *sgsn_pdp_ctx_by_tid(const struct sgsn_mm_ctx *mm,
return NULL;
}
-/* look up PDP context by MM context and gtp TEI */
-struct sgsn_pdp_ctx *sgsn_pdp_ctx_by_tei(const struct sgsn_mm_ctx *mm,
- uint32_t tei)
-{
- struct sgsn_pdp_ctx *pdp;
-
- llist_for_each_entry(pdp, &mm->pdp_list, list) {
- if (pdp->lib->teid_own == tei)
- return pdp;
- }
- return NULL;
-}
-
/* you don't want to use this directly, call sgsn_create_pdp_ctx() */
struct sgsn_pdp_ctx *sgsn_pdp_ctx_alloc(struct sgsn_mm_ctx *mm,
uint8_t nsapi)
diff --git a/openbsc/src/gprs/sgsn_libgtp.c b/openbsc/src/gprs/sgsn_libgtp.c
index 214859948..4205fbc14 100644
--- a/openbsc/src/gprs/sgsn_libgtp.c
+++ b/openbsc/src/gprs/sgsn_libgtp.c
@@ -400,17 +400,13 @@ int sgsn_ranap_rab_ass_resp(struct sgsn_mm_ctx *ctx, RANAP_RAB_SetupOrModifiedIt
{
uint8_t rab_id;
struct sgsn_pdp_ctx *pdp = NULL;
- uint32_t gtp_tei;
RANAP_RAB_SetupOrModifiedItem_t *item = &setup_ies->raB_SetupOrModifiedItem;
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(ctx, gtp_tei);
- }
-
+ pdp = sgsn_pdp_ctx_by_nsapi(ctx, rab_id);
if (!pdp) {
+ LOGP(DRANAP, LOGL_ERROR, "RAB Assignment Response for unknown RAB/NSAPI=%u\n", rab_id);
return -1;
}