diff options
author | Neels Hofmeyr <nhofmeyr@sysmocom.de> | 2016-09-22 18:06:59 +0200 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2016-09-27 05:55:55 +0000 |
commit | f33e8358cc2350e6fecb8653dc726770afa9fede (patch) | |
tree | df66bc616e4df2800b5999c4c82b2367b1866eb1 /src | |
parent | c94ed09f50a124b962abb1f71f11c006db30e587 (diff) |
hnbgw: UE context: add handling by tmsi identification
To prepare for an upcoming commit that accepts TMSI identification upon UE
Register Requests:
Add tmsi arg to ue_context_alloc().
Add ue_context_by_tmsi().
This is aimed at the ip.access nano3G femto cell, as it apparently feeds
whichever identification the UE sends through to HNBAP (TMSI+LAI, pTMSI+RAI),
instead of an IMSI as expected.
See the upcoming commit that enables accepting TMSI identities for further
detail.
Change-Id: I138458443319cc4cbea5ee7906cf5dd72d582130
Diffstat (limited to 'src')
-rw-r--r-- | src/hnbgw.c | 20 | ||||
-rw-r--r-- | src/hnbgw_hnbap.c | 2 |
2 files changed, 19 insertions, 3 deletions
diff --git a/src/hnbgw.c b/src/hnbgw.c index 8c860b1..c326b12 100644 --- a/src/hnbgw.c +++ b/src/hnbgw.c @@ -111,6 +111,17 @@ struct ue_context *ue_context_by_imsi(struct hnb_gw *gw, const char *imsi) return NULL; } +struct ue_context *ue_context_by_tmsi(struct hnb_gw *gw, uint32_t tmsi) +{ + struct ue_context *ue; + + llist_for_each_entry(ue, &gw->ue_list, list) { + if (ue->tmsi == tmsi) + return ue; + } + return NULL; +} + void ue_context_free_by_hnb(struct hnb_gw *gw, const struct hnb_context *hnb) { struct ue_context *ue, *tmp; @@ -132,7 +143,8 @@ static uint32_t get_next_ue_ctx_id(struct hnb_gw *gw) return id; } -struct ue_context *ue_context_alloc(struct hnb_context *hnb, const char *imsi) +struct ue_context *ue_context_alloc(struct hnb_context *hnb, const char *imsi, + uint32_t tmsi) { struct ue_context *ue; @@ -141,7 +153,11 @@ struct ue_context *ue_context_alloc(struct hnb_context *hnb, const char *imsi) return NULL; ue->hnb = hnb; - strncpy(ue->imsi, imsi, sizeof(ue->imsi)); + if (imsi) + strncpy(ue->imsi, imsi, sizeof(ue->imsi)); + else + ue->imsi[0] = '\0'; + ue->tmsi = tmsi; ue->context_id = get_next_ue_ctx_id(hnb->gw); llist_add_tail(&ue->list, &hnb->gw->ue_list); diff --git a/src/hnbgw_hnbap.c b/src/hnbgw_hnbap.c index ae0d16c..78f4692 100644 --- a/src/hnbgw_hnbap.c +++ b/src/hnbgw_hnbap.c @@ -327,7 +327,7 @@ static int hnbgw_rx_ue_register_req(struct hnb_context *ctx, ANY_t *in) ue = ue_context_by_imsi(ctx->gw, imsi); if (!ue) - ue = ue_context_alloc(ctx, imsi); + ue = ue_context_alloc(ctx, imsi, 0); hnbap_free_ueregisterrequesties(&ies); /* Send UERegisterAccept */ |