aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorNeels Hofmeyr <nhofmeyr@sysmocom.de>2016-09-22 18:06:59 +0200
committerHarald Welte <laforge@gnumonks.org>2016-09-27 05:55:55 +0000
commitf33e8358cc2350e6fecb8653dc726770afa9fede (patch)
treedf66bc616e4df2800b5999c4c82b2367b1866eb1 /src
parentc94ed09f50a124b962abb1f71f11c006db30e587 (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.c20
-rw-r--r--src/hnbgw_hnbap.c2
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 */