diff options
-rw-r--r-- | include/osmocom/iuh/hnbgw.h | 7 | ||||
-rw-r--r-- | src/hnbgw.c | 20 | ||||
-rw-r--r-- | src/hnbgw_hnbap.c | 2 |
3 files changed, 23 insertions, 6 deletions
diff --git a/include/osmocom/iuh/hnbgw.h b/include/osmocom/iuh/hnbgw.h index 21a9602..bee7fb6 100644 --- a/include/osmocom/iuh/hnbgw.h +++ b/include/osmocom/iuh/hnbgw.h @@ -101,8 +101,7 @@ struct ue_context { /*! Unique Context ID for this UE */ uint32_t context_id; char imsi[16+1]; - /* TODO: track TMSI, for HNBAP UE Register Request with TMSI, - * seen with ip.access nano3G femto cell */ + uint32_t tmsi; /*! UE is serviced via this HNB */ struct hnb_context *hnb; }; @@ -139,7 +138,9 @@ extern void *talloc_asn1_ctx; struct ue_context *ue_context_by_id(struct hnb_gw *gw, uint32_t id); struct ue_context *ue_context_by_imsi(struct hnb_gw *gw, const char *imsi); -struct ue_context *ue_context_alloc(struct hnb_context *hnb, const char *imsi); +struct ue_context *ue_context_by_tmsi(struct hnb_gw *gw, uint32_t tmsi); +struct ue_context *ue_context_alloc(struct hnb_context *hnb, const char *imsi, + uint32_t tmsi); void ue_context_free(struct ue_context *ue); struct hnb_context *hnb_context_alloc(struct hnb_gw *gw, struct osmo_stream_srv_link *link, int new_fd); 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 */ |