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:
parent
c94ed09f50
commit
f33e8358cc
|
@ -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);
|
||||
|
|
20
src/hnbgw.c
20
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);
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue