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
This commit is contained in:
Neels Hofmeyr 2016-09-22 18:06:59 +02:00 committed by Harald Welte
parent c94ed09f50
commit f33e8358cc
3 changed files with 23 additions and 6 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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 */