update it
This commit is contained in:
parent
3adc609e4b
commit
d2578281a1
|
@ -50,7 +50,6 @@ struct s6a_config_t {
|
|||
};
|
||||
|
||||
extern struct s6a_config_t *s6a_config;
|
||||
extern struct session_handler *s6a_mme_reg;
|
||||
|
||||
/* Some global variables for dictionary */
|
||||
extern struct dict_object *s6a_vendor;
|
||||
|
@ -124,26 +123,18 @@ extern struct dict_object *s6a_pre_emption_capability;
|
|||
extern struct dict_object *s6a_pre_emption_vulnerability;
|
||||
extern struct dict_object *s6a_served_party_ip_addr;
|
||||
|
||||
CORE_DECLARE(int) s6a_init(void);
|
||||
CORE_DECLARE(void) s6a_final(void);
|
||||
CORE_DECLARE(int) s6a_app_init(int mode);
|
||||
CORE_DECLARE(void) s6a_app_final(void);
|
||||
|
||||
CORE_DECLARE(int) s6a_fd_init(const char *conffile);
|
||||
CORE_DECLARE(void) s6a_fd_final();
|
||||
|
||||
CORE_DECLARE(int) s6a_app_init(int mode);
|
||||
CORE_DECLARE(void) s6a_app_final(void);
|
||||
|
||||
CORE_DECLARE(char *) s6a_hss_config();
|
||||
CORE_DECLARE(char *) s6a_mme_config();
|
||||
CORE_DECLARE(status_t) s6a_config_apply();
|
||||
|
||||
CORE_DECLARE(int) s6a_dict_init(void);
|
||||
|
||||
CORE_DECLARE(int) mme_init(void);
|
||||
CORE_DECLARE(void) mme_final(void);
|
||||
CORE_DECLARE(int) hss_init(void);
|
||||
CORE_DECLARE(void) hss_final(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
|
|
@ -14,6 +14,9 @@ CORE_DECLARE_NONSTD(void) cellwire_terminate(void);
|
|||
CORE_DECLARE(status_t) mme_initialize();
|
||||
CORE_DECLARE_NONSTD(void) mme_terminate(void);
|
||||
|
||||
CORE_DECLARE(status_t) hss_initialize();
|
||||
CORE_DECLARE_NONSTD(void) hss_terminate(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
|
|
@ -3,24 +3,21 @@
|
|||
noinst_LTLIBRARIES = libhss.la
|
||||
|
||||
libhss_la_SOURCES = \
|
||||
hss_ctx.h hss_sm.h
|
||||
hss_ctx.h
|
||||
|
||||
nodist_libhss_la_SOURCES = \
|
||||
init.c hss_ctx.c hss_sm.c
|
||||
init.c hss_ctx.c
|
||||
|
||||
libhss_la_DEPENDENCIES = \
|
||||
$(top_srcdir)/lib/core/src/libcore.la \
|
||||
$(top_srcdir)/lib/3gpp/lib3gpp.la \
|
||||
$(top_srcdir)/lib/s6a/libs6a.la
|
||||
|
||||
libhss_la_LIBADD = \
|
||||
$(top_srcdir)/lib/core/src/libcore.la \
|
||||
$(top_srcdir)/lib/3gpp/lib3gpp.la \
|
||||
$(top_srcdir)/lib/s6a/libs6a.la
|
||||
|
||||
AM_CPPFLAGS = \
|
||||
-I$(top_srcdir)/lib/core/include \
|
||||
-I$(top_srcdir)/lib/3gpp \
|
||||
-I$(top_srcdir)/lib/s6a
|
||||
|
||||
AM_CFLAGS = \
|
||||
|
|
206
src/hss/hss_sm.c
206
src/hss/hss_sm.c
|
@ -1,206 +0,0 @@
|
|||
#define TRACE_MODULE _hss_sm
|
||||
|
||||
#include "core_debug.h"
|
||||
#include "core_pool.h"
|
||||
#include "core_lib.h"
|
||||
|
||||
#include "kasme.h"
|
||||
#include "milenage.h"
|
||||
|
||||
#include "hss_ctx.h"
|
||||
#include "s6a_app.h"
|
||||
|
||||
#define MAX_SQN_LEN 6
|
||||
#define MAX_AK_LEN 6
|
||||
#define MAX_XRES_LEN 8
|
||||
#define MAX_KASME_LEN 32
|
||||
|
||||
static struct disp_hdl *hdl_fb = NULL; /* handler for fallback cb */
|
||||
static struct disp_hdl *hdl_air = NULL; /* handler for Auth-Info-Request cb */
|
||||
|
||||
/* Default callback for the application. */
|
||||
static int hss_fb_cb(struct msg **msg, struct avp *avp,
|
||||
struct session *sess, void *opaque, enum disp_action *act)
|
||||
{
|
||||
/* This CB should never be called */
|
||||
d_warn("Unexpected message received!");
|
||||
|
||||
return ENOTSUP;
|
||||
}
|
||||
|
||||
/* Callback for incoming Test-Request messages */
|
||||
static int hss_air_cb( struct msg **msg, struct avp *avp,
|
||||
struct session *sess, void *opaque, enum disp_action *act)
|
||||
{
|
||||
struct msg *ans, *qry;
|
||||
struct avp *avpch1, *avpch2;
|
||||
struct avp_hdr *hdr;
|
||||
union avp_value val;
|
||||
|
||||
ue_ctx_t *ue = NULL;
|
||||
c_uint8_t sqn[MAX_SQN_LEN];
|
||||
c_uint8_t autn[MAX_KEY_LEN];
|
||||
c_uint8_t ik[MAX_KEY_LEN];
|
||||
c_uint8_t ck[MAX_KEY_LEN];
|
||||
c_uint8_t ak[MAX_AK_LEN];
|
||||
c_uint8_t xres[MAX_XRES_LEN];
|
||||
c_uint8_t kasme[MAX_KASME_LEN];
|
||||
size_t xres_len = 8;
|
||||
|
||||
d_assert(msg, return EINVAL,);
|
||||
|
||||
/* Create answer header */
|
||||
qry = *msg;
|
||||
fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0);
|
||||
ans = *msg;
|
||||
|
||||
d_assert(fd_msg_search_avp(qry, s6a_user_name, &avp) == 0 && avp,
|
||||
goto out,);
|
||||
d_assert(fd_msg_avp_hdr(avp, &hdr) == 0 && hdr,,);
|
||||
|
||||
ue = hss_ue_ctx_find_by_imsi(
|
||||
hdr->avp_value->os.data, hdr->avp_value->os.len);
|
||||
if (!ue)
|
||||
{
|
||||
char imsi[MAX_IMSI_LEN];
|
||||
strncpy(imsi, (char*)hdr->avp_value->os.data, hdr->avp_value->os.len);
|
||||
d_warn("Cannot find IMSI:%s\n", imsi);
|
||||
goto out;
|
||||
}
|
||||
|
||||
d_assert(fd_msg_search_avp(qry, s6a_visited_plmn_id, &avp) == 0 &&
|
||||
avp, goto out,);
|
||||
d_assert(fd_msg_avp_hdr(avp, &hdr) == 0 && hdr,,);
|
||||
|
||||
core_generate_random_bytes(ue->rand, MAX_KEY_LEN);
|
||||
milenage_opc(ue->k, ue->op, ue->opc);
|
||||
milenage_generate(ue->opc, ue->amf, ue->k,
|
||||
core_int_to_buffer(ue->sqn, sqn, MAX_SQN_LEN), ue->rand,
|
||||
autn, ik, ck, ak, xres, &xres_len);
|
||||
derive_kasme(ck, ik, hdr->avp_value->os.data, sqn, ak, kasme);
|
||||
|
||||
ue->sqn = (ue->sqn + 32) & 0x7ffffffffff;
|
||||
|
||||
/* Set the Origin-Host, Origin-Realm, andResult-Code AVPs */
|
||||
d_assert(fd_msg_rescode_set(ans, "DIAMETER_SUCCESS", NULL, NULL, 1) == 0,
|
||||
goto out,);
|
||||
|
||||
/* Set the Auth-Session-Statee AVP */
|
||||
d_assert(fd_msg_avp_new(s6a_auth_session_state, 0, &avp) == 0, goto out,);
|
||||
val.i32 = 1;
|
||||
d_assert(fd_msg_avp_setvalue(avp, &val) == 0, goto out,);
|
||||
d_assert(fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp) == 0, goto out,);
|
||||
|
||||
/* Set the Authentication-Info */
|
||||
d_assert(fd_msg_avp_new(s6a_authentication_info, 0, &avp) == 0, goto out,);
|
||||
d_assert(fd_msg_avp_new(s6a_e_utran_vector, 0, &avpch1) == 0, goto out,);
|
||||
|
||||
d_assert(fd_msg_avp_new(s6a_rand, 0, &avpch2) == 0, goto out,);
|
||||
val.os.data = ue->rand;
|
||||
val.os.len = MAX_KEY_LEN;
|
||||
d_assert(fd_msg_avp_setvalue(avpch2, &val) == 0, goto out,);
|
||||
d_assert(fd_msg_avp_add(avpch1, MSG_BRW_LAST_CHILD, avpch2) == 0,
|
||||
goto out,);
|
||||
|
||||
d_assert(fd_msg_avp_new(s6a_xres, 0, &avpch2) == 0, goto out,);
|
||||
val.os.data = xres;
|
||||
val.os.len = xres_len;
|
||||
d_assert(fd_msg_avp_setvalue(avpch2, &val) == 0, goto out,);
|
||||
d_assert(fd_msg_avp_add(avpch1, MSG_BRW_LAST_CHILD, avpch2) == 0,
|
||||
goto out,);
|
||||
|
||||
d_assert(fd_msg_avp_new(s6a_autn, 0, &avpch2) == 0, goto out,);
|
||||
val.os.data = autn;
|
||||
val.os.len = MAX_KEY_LEN;
|
||||
d_assert(fd_msg_avp_setvalue(avpch2, &val) == 0, goto out,);
|
||||
d_assert(fd_msg_avp_add(avpch1, MSG_BRW_LAST_CHILD, avpch2) == 0,
|
||||
goto out,);
|
||||
|
||||
d_assert(fd_msg_avp_new(s6a_kasme, 0, &avpch2) == 0, goto out,);
|
||||
val.os.data = kasme;
|
||||
val.os.len = MAX_KASME_LEN;
|
||||
d_assert(fd_msg_avp_setvalue(avpch2, &val) == 0, goto out,);
|
||||
d_assert(fd_msg_avp_add(avpch1, MSG_BRW_LAST_CHILD, avpch2) == 0,
|
||||
goto out,);
|
||||
|
||||
d_assert(fd_msg_avp_add(avp, MSG_BRW_LAST_CHILD, avpch1) == 0, goto out,);
|
||||
d_assert(fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp) == 0, goto out,);
|
||||
|
||||
/* Send the answer */
|
||||
fd_msg_send(msg, NULL, NULL);
|
||||
|
||||
/* Add this value to the stats */
|
||||
pthread_mutex_lock(&s6a_config->stats_lock);
|
||||
s6a_config->stats.nb_echoed++;
|
||||
pthread_mutex_unlock(&s6a_config->stats_lock);
|
||||
|
||||
return 0;
|
||||
|
||||
out:
|
||||
fd_msg_rescode_set(ans, "DIAMETER_AUTHENTICATION_REJECTED", NULL, NULL, 1);
|
||||
fd_msg_send(msg, NULL, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int hss_sm_init(void)
|
||||
{
|
||||
struct disp_when data;
|
||||
|
||||
/* FIXME : this is a sample UE for testing */
|
||||
{
|
||||
ue_ctx_t *ue;
|
||||
char buf[MAX_KEY_LEN];
|
||||
|
||||
#define K "465B5CE8B199B49FAA5F0A2EE238A6BC"
|
||||
#define UE1_IMSI "001010123456800"
|
||||
#define UE2_IMSI "001010123456796"
|
||||
|
||||
ue = hss_ue_ctx_add();
|
||||
d_assert(ue, return -1, "UE context add failed");
|
||||
|
||||
strcpy((char*)ue->imsi, UE1_IMSI);
|
||||
ue->imsi_len = strlen(UE1_IMSI);
|
||||
memcpy(ue->k, core_ascii_to_hex(K, strlen(K), buf), MAX_KEY_LEN);
|
||||
ue->sqn = 32;
|
||||
|
||||
ue = hss_ue_ctx_add();
|
||||
d_assert(ue, return -1, "UE context add failed");
|
||||
|
||||
strcpy((char*)ue->imsi, UE2_IMSI);
|
||||
ue->imsi_len = strlen(UE2_IMSI);
|
||||
memcpy(ue->k, core_ascii_to_hex(K, strlen(K), buf), MAX_KEY_LEN);
|
||||
ue->sqn = 32;
|
||||
}
|
||||
|
||||
memset(&data, 0, sizeof(data));
|
||||
data.app = s6a_appli;
|
||||
data.command = s6a_cmd_air;
|
||||
|
||||
/* fallback CB if command != unexpected message received */
|
||||
d_assert(fd_disp_register(hss_fb_cb, DISP_HOW_APPID, &data, NULL,
|
||||
&hdl_fb) == 0, return -1,);
|
||||
|
||||
/* Now specific handler for Authentication-Information-Request */
|
||||
d_assert(fd_disp_register(hss_air_cb, DISP_HOW_CC, &data, NULL,
|
||||
&hdl_air) == 0, return -1,);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void hss_sm_final(void)
|
||||
{
|
||||
if (hdl_fb) {
|
||||
(void) fd_disp_unregister(&hdl_fb, NULL);
|
||||
}
|
||||
if (hdl_air) {
|
||||
(void) fd_disp_unregister(&hdl_air, NULL);
|
||||
}
|
||||
|
||||
/* FIXME : this is a sample UE for testing */
|
||||
{
|
||||
hss_ue_ctx_remove_all();
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
|
@ -1,15 +0,0 @@
|
|||
#ifndef __HSS_SM_H__
|
||||
#define __HSS_SM_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
CORE_DECLARE(int) hss_sm_init(void);
|
||||
CORE_DECLARE(void) hss_sm_final(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* ! __HSS_SM_H__ */
|
210
src/hss/init.c
210
src/hss/init.c
|
@ -1,25 +1,215 @@
|
|||
#define TRACE_MODULE _hss_init
|
||||
|
||||
#include "hss_ctx.h"
|
||||
#include "hss_sm.h"
|
||||
#include "core_debug.h"
|
||||
#include "core_lib.h"
|
||||
|
||||
#include "kasme.h"
|
||||
#include "milenage.h"
|
||||
|
||||
#include "hss_ctx.h"
|
||||
#include "s6a_app.h"
|
||||
|
||||
int hss_init(void)
|
||||
{
|
||||
s6a_app_init(MODE_HSS);
|
||||
#define MAX_SQN_LEN 6
|
||||
#define MAX_AK_LEN 6
|
||||
#define MAX_XRES_LEN 8
|
||||
#define MAX_KASME_LEN 32
|
||||
|
||||
hss_ctx_init();
|
||||
hss_sm_init();
|
||||
static struct disp_hdl *hdl_fb = NULL; /* handler for fallback cb */
|
||||
static struct disp_hdl *hdl_air = NULL; /* handler for Auth-Info-Request cb */
|
||||
|
||||
/* Default callback for the application. */
|
||||
static int hss_fb_cb(struct msg **msg, struct avp *avp,
|
||||
struct session *sess, void *opaque, enum disp_action *act)
|
||||
{
|
||||
/* This CB should never be called */
|
||||
d_warn("Unexpected message received!");
|
||||
|
||||
return ENOTSUP;
|
||||
}
|
||||
|
||||
/* Callback for incoming Test-Request messages */
|
||||
static int hss_air_cb( struct msg **msg, struct avp *avp,
|
||||
struct session *sess, void *opaque, enum disp_action *act)
|
||||
{
|
||||
struct msg *ans, *qry;
|
||||
struct avp *avpch1, *avpch2;
|
||||
struct avp_hdr *hdr;
|
||||
union avp_value val;
|
||||
|
||||
ue_ctx_t *ue = NULL;
|
||||
c_uint8_t sqn[MAX_SQN_LEN];
|
||||
c_uint8_t autn[MAX_KEY_LEN];
|
||||
c_uint8_t ik[MAX_KEY_LEN];
|
||||
c_uint8_t ck[MAX_KEY_LEN];
|
||||
c_uint8_t ak[MAX_AK_LEN];
|
||||
c_uint8_t xres[MAX_XRES_LEN];
|
||||
c_uint8_t kasme[MAX_KASME_LEN];
|
||||
size_t xres_len = 8;
|
||||
|
||||
d_assert(msg, return EINVAL,);
|
||||
|
||||
/* Create answer header */
|
||||
qry = *msg;
|
||||
fd_msg_new_answer_from_req(fd_g_config->cnf_dict, msg, 0);
|
||||
ans = *msg;
|
||||
|
||||
d_assert(fd_msg_search_avp(qry, s6a_user_name, &avp) == 0 && avp,
|
||||
goto out,);
|
||||
d_assert(fd_msg_avp_hdr(avp, &hdr) == 0 && hdr,,);
|
||||
|
||||
ue = hss_ue_ctx_find_by_imsi(
|
||||
hdr->avp_value->os.data, hdr->avp_value->os.len);
|
||||
if (!ue)
|
||||
{
|
||||
char imsi[MAX_IMSI_LEN];
|
||||
strncpy(imsi, (char*)hdr->avp_value->os.data, hdr->avp_value->os.len);
|
||||
d_warn("Cannot find IMSI:%s\n", imsi);
|
||||
goto out;
|
||||
}
|
||||
|
||||
d_assert(fd_msg_search_avp(qry, s6a_visited_plmn_id, &avp) == 0 &&
|
||||
avp, goto out,);
|
||||
d_assert(fd_msg_avp_hdr(avp, &hdr) == 0 && hdr,,);
|
||||
|
||||
core_generate_random_bytes(ue->rand, MAX_KEY_LEN);
|
||||
milenage_opc(ue->k, ue->op, ue->opc);
|
||||
milenage_generate(ue->opc, ue->amf, ue->k,
|
||||
core_int_to_buffer(ue->sqn, sqn, MAX_SQN_LEN), ue->rand,
|
||||
autn, ik, ck, ak, xres, &xres_len);
|
||||
derive_kasme(ck, ik, hdr->avp_value->os.data, sqn, ak, kasme);
|
||||
|
||||
ue->sqn = (ue->sqn + 32) & 0x7ffffffffff;
|
||||
|
||||
/* Set the Origin-Host, Origin-Realm, andResult-Code AVPs */
|
||||
d_assert(fd_msg_rescode_set(ans, "DIAMETER_SUCCESS", NULL, NULL, 1) == 0,
|
||||
goto out,);
|
||||
|
||||
/* Set the Auth-Session-Statee AVP */
|
||||
d_assert(fd_msg_avp_new(s6a_auth_session_state, 0, &avp) == 0, goto out,);
|
||||
val.i32 = 1;
|
||||
d_assert(fd_msg_avp_setvalue(avp, &val) == 0, goto out,);
|
||||
d_assert(fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp) == 0, goto out,);
|
||||
|
||||
/* Set the Authentication-Info */
|
||||
d_assert(fd_msg_avp_new(s6a_authentication_info, 0, &avp) == 0, goto out,);
|
||||
d_assert(fd_msg_avp_new(s6a_e_utran_vector, 0, &avpch1) == 0, goto out,);
|
||||
|
||||
d_assert(fd_msg_avp_new(s6a_rand, 0, &avpch2) == 0, goto out,);
|
||||
val.os.data = ue->rand;
|
||||
val.os.len = MAX_KEY_LEN;
|
||||
d_assert(fd_msg_avp_setvalue(avpch2, &val) == 0, goto out,);
|
||||
d_assert(fd_msg_avp_add(avpch1, MSG_BRW_LAST_CHILD, avpch2) == 0,
|
||||
goto out,);
|
||||
|
||||
d_assert(fd_msg_avp_new(s6a_xres, 0, &avpch2) == 0, goto out,);
|
||||
val.os.data = xres;
|
||||
val.os.len = xres_len;
|
||||
d_assert(fd_msg_avp_setvalue(avpch2, &val) == 0, goto out,);
|
||||
d_assert(fd_msg_avp_add(avpch1, MSG_BRW_LAST_CHILD, avpch2) == 0,
|
||||
goto out,);
|
||||
|
||||
d_assert(fd_msg_avp_new(s6a_autn, 0, &avpch2) == 0, goto out,);
|
||||
val.os.data = autn;
|
||||
val.os.len = MAX_KEY_LEN;
|
||||
d_assert(fd_msg_avp_setvalue(avpch2, &val) == 0, goto out,);
|
||||
d_assert(fd_msg_avp_add(avpch1, MSG_BRW_LAST_CHILD, avpch2) == 0,
|
||||
goto out,);
|
||||
|
||||
d_assert(fd_msg_avp_new(s6a_kasme, 0, &avpch2) == 0, goto out,);
|
||||
val.os.data = kasme;
|
||||
val.os.len = MAX_KASME_LEN;
|
||||
d_assert(fd_msg_avp_setvalue(avpch2, &val) == 0, goto out,);
|
||||
d_assert(fd_msg_avp_add(avpch1, MSG_BRW_LAST_CHILD, avpch2) == 0,
|
||||
goto out,);
|
||||
|
||||
d_assert(fd_msg_avp_add(avp, MSG_BRW_LAST_CHILD, avpch1) == 0, goto out,);
|
||||
d_assert(fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp) == 0, goto out,);
|
||||
|
||||
/* Send the answer */
|
||||
fd_msg_send(msg, NULL, NULL);
|
||||
|
||||
/* Add this value to the stats */
|
||||
pthread_mutex_lock(&s6a_config->stats_lock);
|
||||
s6a_config->stats.nb_echoed++;
|
||||
pthread_mutex_unlock(&s6a_config->stats_lock);
|
||||
|
||||
return 0;
|
||||
|
||||
out:
|
||||
fd_msg_rescode_set(ans, "DIAMETER_AUTHENTICATION_REJECTED", NULL, NULL, 1);
|
||||
fd_msg_send(msg, NULL, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
status_t hss_initialize(void)
|
||||
{
|
||||
status_t rv;
|
||||
int ret;
|
||||
struct disp_when data;
|
||||
|
||||
ret = s6a_app_init(MODE_HSS);
|
||||
if (ret != 0) return CORE_ERROR;
|
||||
|
||||
rv = hss_ctx_init();
|
||||
if (rv != CORE_OK) return rv;
|
||||
|
||||
/* FIXME : this is a sample UE for testing */
|
||||
{
|
||||
ue_ctx_t *ue;
|
||||
char buf[MAX_KEY_LEN];
|
||||
|
||||
#define K "465B5CE8B199B49FAA5F0A2EE238A6BC"
|
||||
#define UE1_IMSI "001010123456800"
|
||||
#define UE2_IMSI "001010123456796"
|
||||
|
||||
ue = hss_ue_ctx_add();
|
||||
d_assert(ue, return -1, "UE context add failed");
|
||||
|
||||
strcpy((char*)ue->imsi, UE1_IMSI);
|
||||
ue->imsi_len = strlen(UE1_IMSI);
|
||||
memcpy(ue->k, core_ascii_to_hex(K, strlen(K), buf), MAX_KEY_LEN);
|
||||
ue->sqn = 32;
|
||||
|
||||
ue = hss_ue_ctx_add();
|
||||
d_assert(ue, return -1, "UE context add failed");
|
||||
|
||||
strcpy((char*)ue->imsi, UE2_IMSI);
|
||||
ue->imsi_len = strlen(UE2_IMSI);
|
||||
memcpy(ue->k, core_ascii_to_hex(K, strlen(K), buf), MAX_KEY_LEN);
|
||||
ue->sqn = 32;
|
||||
}
|
||||
|
||||
memset(&data, 0, sizeof(data));
|
||||
data.app = s6a_appli;
|
||||
data.command = s6a_cmd_air;
|
||||
|
||||
/* fallback CB if command != unexpected message received */
|
||||
d_assert(fd_disp_register(hss_fb_cb, DISP_HOW_APPID, &data, NULL,
|
||||
&hdl_fb) == 0, return CORE_ERROR,);
|
||||
|
||||
/* Now specific handler for Authentication-Information-Request */
|
||||
d_assert(fd_disp_register(hss_air_cb, DISP_HOW_CC, &data, NULL,
|
||||
&hdl_air) == 0, return CORE_ERROR,);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void hss_final(void)
|
||||
void hss_terminate(void)
|
||||
{
|
||||
hss_sm_init();
|
||||
hss_ctx_final();
|
||||
if (hdl_fb) {
|
||||
(void) fd_disp_unregister(&hdl_fb, NULL);
|
||||
}
|
||||
if (hdl_air) {
|
||||
(void) fd_disp_unregister(&hdl_air, NULL);
|
||||
}
|
||||
|
||||
/* FIXME : this is a sample UE for testing */
|
||||
{
|
||||
hss_ue_ctx_remove_all();
|
||||
}
|
||||
|
||||
hss_ctx_final();
|
||||
s6a_app_final();
|
||||
|
||||
return;
|
||||
|
|
12
src/init.c
12
src/init.c
|
@ -1,9 +1,5 @@
|
|||
/**
|
||||
* @file init.c
|
||||
*/
|
||||
|
||||
/* Core library */
|
||||
#define TRACE_MODULE _cellwire_init
|
||||
|
||||
#include "core_general.h"
|
||||
#include "core_debug.h"
|
||||
#include "core_thread.h"
|
||||
|
@ -15,8 +11,6 @@
|
|||
|
||||
#include "cellwire.h"
|
||||
|
||||
#include "s6a_app.h"
|
||||
|
||||
static pid_t child_pid;
|
||||
static thread_id net_thread;
|
||||
|
||||
|
@ -54,11 +48,11 @@ status_t cellwire_initialize(char *config_path, char *log_path)
|
|||
rv = semaphore_delete(semaphore);
|
||||
d_assert(rv == CORE_OK, _exit(EXIT_FAILURE), "semaphore_delete() failed");
|
||||
|
||||
ret = hss_init();
|
||||
ret = hss_initialize();
|
||||
if (ret != 0) _exit(EXIT_FAILURE);
|
||||
|
||||
signal_thread(check_signal);
|
||||
hss_final();
|
||||
hss_terminate();
|
||||
|
||||
_exit(EXIT_SUCCESS);
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
#include "context.h"
|
||||
#include "event.h"
|
||||
|
||||
#include "s6a_app.h"
|
||||
#include "s6a_lib.h"
|
||||
|
||||
#define EVENT_WAIT_TIMEOUT 10000 /* 10 msec */
|
||||
|
||||
|
@ -21,7 +21,7 @@ status_t mme_initialize()
|
|||
rv = context_init();
|
||||
if (rv != CORE_OK) return rv;
|
||||
|
||||
ret = mme_init();
|
||||
ret = s6a_mme_init();
|
||||
if (ret != 0) return -1;
|
||||
|
||||
rv = thread_create(&mme_sm_thread, NULL, mme_sm_main, NULL);
|
||||
|
@ -34,7 +34,7 @@ void mme_terminate(void)
|
|||
{
|
||||
thread_delete(mme_sm_thread);
|
||||
|
||||
mme_final();
|
||||
s6a_mme_final();
|
||||
|
||||
context_final();
|
||||
}
|
||||
|
|
|
@ -2,8 +2,8 @@
|
|||
|
||||
#include "core_debug.h"
|
||||
|
||||
#include "s6a_lib.h"
|
||||
#include "s6a_app.h"
|
||||
#include "s6a_auth_info.h"
|
||||
|
||||
struct sess_state {
|
||||
c_int32_t randval; /* a random value to store in Test-AVP */
|
||||
|
|
|
@ -6,17 +6,20 @@
|
|||
|
||||
struct session_handler *s6a_mme_reg = NULL;
|
||||
|
||||
int mme_init(void)
|
||||
status_t s6a_mme_init(void)
|
||||
{
|
||||
s6a_app_init(MODE_MME);
|
||||
status_t rv;
|
||||
|
||||
rv = s6a_app_init(MODE_MME);
|
||||
if (rv != CORE_OK) return rv;
|
||||
|
||||
d_assert(fd_sess_handler_create(&s6a_mme_reg,
|
||||
(void *)free, NULL, NULL) == 0, return -1,);
|
||||
|
||||
return 0;
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
void mme_final(void)
|
||||
void s6a_mme_final(void)
|
||||
{
|
||||
d_assert(fd_sess_handler_destroy(&s6a_mme_reg, NULL) == 0,,);
|
||||
|
||||
|
|
|
@ -46,6 +46,11 @@ typedef struct _s6a_auth_info_ans_t {
|
|||
s6a_auth_info_t auth_info;
|
||||
} s6a_auth_info_ans_t;
|
||||
|
||||
extern struct session_handler *s6a_mme_reg;
|
||||
|
||||
CORE_DECLARE(status_t) s6a_mme_init(void);
|
||||
CORE_DECLARE(void) s6a_mme_final(void);
|
||||
|
||||
CORE_DECLARE(int) s6a_send_auth_info_req(s6a_auth_info_req_t *air);
|
||||
|
||||
#ifdef __cplusplus
|
Loading…
Reference in New Issue