2017-04-06 11:44:52 +00:00
|
|
|
#define TRACE_MODULE _hss_context
|
2017-03-02 02:43:26 +00:00
|
|
|
|
|
|
|
#include "core_debug.h"
|
|
|
|
#include "core_pool.h"
|
2017-03-02 13:47:43 +00:00
|
|
|
#include "core_lib.h"
|
2017-03-02 02:43:26 +00:00
|
|
|
|
2017-04-06 10:20:33 +00:00
|
|
|
#include "hss_context.h"
|
2017-03-02 02:43:26 +00:00
|
|
|
|
2017-03-02 13:47:43 +00:00
|
|
|
#define OP "5F1D289C5D354D0A140C2548F5F3E3BA"
|
|
|
|
#define OPc "E8ED289DEBA952E4283B54E88E6183CA"
|
|
|
|
#define AMF "8000"
|
|
|
|
|
2017-04-06 11:44:52 +00:00
|
|
|
static hss_context_t self;
|
2017-03-02 13:47:43 +00:00
|
|
|
|
2017-04-06 11:44:52 +00:00
|
|
|
pool_declare(hss_ue_pool, hss_ue_t, MAX_NUM_OF_UE);
|
2017-03-02 02:43:26 +00:00
|
|
|
|
2017-04-06 11:44:52 +00:00
|
|
|
hss_context_t* hss_self()
|
2017-03-02 13:47:43 +00:00
|
|
|
{
|
|
|
|
return &self;
|
|
|
|
}
|
|
|
|
|
2017-04-06 11:44:52 +00:00
|
|
|
status_t hss_context_init(void)
|
2017-03-02 02:43:26 +00:00
|
|
|
{
|
2017-03-24 12:19:24 +00:00
|
|
|
char buf[HSS_KEY_LEN];
|
2017-04-06 11:58:13 +00:00
|
|
|
hss_ue_t *ue;
|
2017-03-02 13:47:43 +00:00
|
|
|
|
2017-04-06 11:44:52 +00:00
|
|
|
memset(&self, 0, sizeof(hss_context_t));
|
2017-03-02 13:47:43 +00:00
|
|
|
|
2017-04-06 12:44:30 +00:00
|
|
|
pool_init(&hss_ue_pool, MAX_NUM_OF_UE);
|
|
|
|
|
2017-03-25 01:45:49 +00:00
|
|
|
memcpy(self.op, CORE_HEX(OP, strlen(OP), buf), HSS_KEY_LEN);
|
|
|
|
memcpy(self.amf, CORE_HEX(AMF, strlen(AMF), buf), HSS_AMF_LEN);
|
2017-03-07 07:19:18 +00:00
|
|
|
|
|
|
|
#define K "465B5CE8B199B49FAA5F0A2EE238A6BC"
|
|
|
|
#define UE1_IMSI "001010123456800"
|
|
|
|
#define UE2_IMSI "001010123456796"
|
|
|
|
|
|
|
|
#define UE3_IMSI "001010123456819"
|
|
|
|
#define UE3_RAND "20080c3818183b52 2614162c07601d0d"
|
|
|
|
|
2017-04-06 11:58:13 +00:00
|
|
|
ue = hss_ue_add();
|
|
|
|
d_assert(ue, return -1, "UE context add failed");
|
2017-03-07 07:19:18 +00:00
|
|
|
|
2017-04-06 11:58:13 +00:00
|
|
|
strcpy((char*)ue->imsi, UE1_IMSI);
|
|
|
|
ue->imsi_len = strlen(UE1_IMSI);
|
|
|
|
memcpy(ue->k, CORE_HEX(K, strlen(K), buf), HSS_KEY_LEN);
|
|
|
|
core_generate_random_bytes(ue->rand, RAND_LEN);
|
|
|
|
ue->sqn = 64;
|
2017-03-07 07:19:18 +00:00
|
|
|
|
2017-04-06 11:58:13 +00:00
|
|
|
ue = hss_ue_add();
|
|
|
|
d_assert(ue, return -1, "UE context add failed");
|
2017-03-07 07:19:18 +00:00
|
|
|
|
2017-04-06 11:58:13 +00:00
|
|
|
strcpy((char*)ue->imsi, UE2_IMSI);
|
|
|
|
ue->imsi_len = strlen(UE2_IMSI);
|
|
|
|
memcpy(ue->k, CORE_HEX(K, strlen(K), buf), HSS_KEY_LEN);
|
|
|
|
core_generate_random_bytes(ue->rand, RAND_LEN);
|
|
|
|
ue->sqn = 64;
|
2017-03-07 07:19:18 +00:00
|
|
|
|
2017-04-06 11:58:13 +00:00
|
|
|
ue = hss_ue_add();
|
|
|
|
d_assert(ue, return -1, "UE context add failed");
|
2017-03-07 07:19:18 +00:00
|
|
|
|
2017-04-06 11:58:13 +00:00
|
|
|
strcpy((char*)ue->imsi, UE3_IMSI);
|
|
|
|
ue->imsi_len = strlen(UE3_IMSI);
|
|
|
|
memcpy(ue->k, CORE_HEX(K, strlen(K), buf), HSS_KEY_LEN);
|
|
|
|
memcpy(ue->rand, CORE_HEX(UE3_RAND, strlen(UE3_RAND), buf),
|
2017-03-25 01:45:49 +00:00
|
|
|
RAND_LEN);
|
2017-04-06 11:58:13 +00:00
|
|
|
ue->sqn = 64;
|
2017-03-07 07:19:18 +00:00
|
|
|
|
2017-03-02 02:43:26 +00:00
|
|
|
return CORE_OK;
|
|
|
|
}
|
|
|
|
|
2017-04-06 11:44:52 +00:00
|
|
|
void hss_context_final(void)
|
2017-03-02 02:43:26 +00:00
|
|
|
{
|
2017-04-06 11:44:52 +00:00
|
|
|
hss_ue_remove_all();
|
2017-03-07 07:19:18 +00:00
|
|
|
|
2017-04-06 11:44:52 +00:00
|
|
|
pool_final(&hss_ue_pool);
|
2017-03-02 02:43:26 +00:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2017-04-06 11:44:52 +00:00
|
|
|
hss_ue_t* hss_ue_add()
|
2017-03-02 02:43:26 +00:00
|
|
|
{
|
2017-04-06 11:58:13 +00:00
|
|
|
hss_ue_t *ue = NULL;
|
2017-03-02 02:43:26 +00:00
|
|
|
|
|
|
|
/* Allocate new eNB context */
|
2017-04-06 11:58:13 +00:00
|
|
|
pool_alloc_node(&hss_ue_pool, &ue);
|
|
|
|
d_assert(ue, return NULL, "HSS-UE context allocation failed");
|
2017-03-02 02:43:26 +00:00
|
|
|
|
|
|
|
/* Initialize eNB context */
|
2017-04-06 11:58:13 +00:00
|
|
|
memset(ue, 0, sizeof(hss_ue_t));
|
2017-03-02 02:43:26 +00:00
|
|
|
|
|
|
|
/* Add new eNB context to list */
|
2017-04-06 11:58:13 +00:00
|
|
|
list_append(&self.ue_list, ue);
|
2017-03-03 07:22:09 +00:00
|
|
|
|
2017-04-06 11:58:13 +00:00
|
|
|
memcpy(ue->op, self.op, HSS_KEY_LEN);
|
|
|
|
memcpy(ue->amf, self.amf, HSS_AMF_LEN);
|
2017-03-02 02:43:26 +00:00
|
|
|
|
2017-04-06 11:58:13 +00:00
|
|
|
return ue;
|
2017-03-02 02:43:26 +00:00
|
|
|
}
|
|
|
|
|
2017-04-06 11:58:13 +00:00
|
|
|
status_t hss_ue_remove(hss_ue_t *ue)
|
2017-03-02 02:43:26 +00:00
|
|
|
{
|
2017-04-06 11:58:13 +00:00
|
|
|
d_assert(ue, return CORE_ERROR, "Null param");
|
2017-03-02 02:43:26 +00:00
|
|
|
|
2017-04-06 11:58:13 +00:00
|
|
|
list_remove(&self.ue_list, ue);
|
|
|
|
pool_free_node(&hss_ue_pool, ue);
|
2017-03-02 02:43:26 +00:00
|
|
|
|
|
|
|
return CORE_OK;
|
|
|
|
}
|
|
|
|
|
2017-04-06 11:44:52 +00:00
|
|
|
status_t hss_ue_remove_all()
|
2017-03-02 02:43:26 +00:00
|
|
|
{
|
2017-04-06 11:58:13 +00:00
|
|
|
hss_ue_t *ue = NULL, *next_ue = NULL;
|
2017-03-02 02:43:26 +00:00
|
|
|
|
2017-04-06 11:58:13 +00:00
|
|
|
ue = list_first(&self.ue_list);
|
|
|
|
while (ue)
|
2017-03-02 02:43:26 +00:00
|
|
|
{
|
2017-04-06 11:58:13 +00:00
|
|
|
next_ue = list_next(ue);
|
2017-03-02 02:43:26 +00:00
|
|
|
|
2017-04-06 11:58:13 +00:00
|
|
|
hss_ue_remove(ue);
|
2017-03-02 02:43:26 +00:00
|
|
|
|
2017-04-06 11:58:13 +00:00
|
|
|
ue = next_ue;
|
2017-03-02 02:43:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return CORE_OK;
|
|
|
|
}
|
|
|
|
|
2017-04-06 11:44:52 +00:00
|
|
|
hss_ue_t* hss_ue_find_by_imsi(c_uint8_t *imsi, c_uint8_t imsi_len)
|
2017-03-02 02:43:26 +00:00
|
|
|
{
|
2017-04-06 11:58:13 +00:00
|
|
|
hss_ue_t *ue = NULL;
|
2017-03-02 02:43:26 +00:00
|
|
|
|
2017-04-06 11:58:13 +00:00
|
|
|
ue = list_first(&self.ue_list);
|
|
|
|
while (ue)
|
2017-03-02 02:43:26 +00:00
|
|
|
{
|
2017-04-06 11:58:13 +00:00
|
|
|
if (memcmp(ue->imsi, imsi, imsi_len) == 0)
|
2017-03-02 02:43:26 +00:00
|
|
|
break;
|
|
|
|
|
2017-04-06 11:58:13 +00:00
|
|
|
ue = list_next(ue);
|
2017-03-02 02:43:26 +00:00
|
|
|
}
|
|
|
|
|
2017-04-06 11:58:13 +00:00
|
|
|
return ue;
|
2017-03-02 02:43:26 +00:00
|
|
|
}
|
|
|
|
|
2017-04-06 11:44:52 +00:00
|
|
|
hss_ue_t* hss_ue_first()
|
2017-03-02 02:43:26 +00:00
|
|
|
{
|
2017-04-06 11:58:13 +00:00
|
|
|
return list_first(&self.ue_list);
|
2017-03-02 02:43:26 +00:00
|
|
|
}
|
|
|
|
|
2017-04-06 11:58:13 +00:00
|
|
|
hss_ue_t* hss_ue_next(hss_ue_t *ue)
|
2017-03-02 02:43:26 +00:00
|
|
|
{
|
2017-04-06 11:58:13 +00:00
|
|
|
return list_next(ue);
|
2017-03-02 02:43:26 +00:00
|
|
|
}
|