2017-04-06 11:10:00 +00:00
|
|
|
#ifndef __MME_CONTEXT__
|
|
|
|
#define __MME_CONTEXT__
|
2017-02-06 06:30:12 +00:00
|
|
|
|
|
|
|
#include "core_list.h"
|
2017-02-06 10:12:10 +00:00
|
|
|
#include "core_errno.h"
|
2017-02-13 04:19:53 +00:00
|
|
|
#include "core_net.h"
|
2017-03-06 12:45:41 +00:00
|
|
|
#include "core_sha2.h"
|
2017-04-06 12:44:30 +00:00
|
|
|
#include "core_hash.h"
|
2017-02-13 04:19:53 +00:00
|
|
|
|
2017-04-06 08:10:26 +00:00
|
|
|
#include "3gpp_common.h"
|
2017-03-26 06:57:46 +00:00
|
|
|
#include "nas_types.h"
|
2017-03-28 07:35:57 +00:00
|
|
|
#include "gtp_xact.h"
|
2017-03-26 15:48:33 +00:00
|
|
|
|
2017-04-04 01:49:19 +00:00
|
|
|
#include "mme_sm.h"
|
2017-02-06 06:30:12 +00:00
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif /* __cplusplus */
|
|
|
|
|
|
|
|
#define MAX_PLMN_ID 6
|
|
|
|
#define GRP_PER_MME 256 /* According to spec it is 65535 */
|
2017-03-05 04:03:11 +00:00
|
|
|
#define CODE_PER_MME 256 /* According to spec it is 256 */
|
2017-02-13 04:19:53 +00:00
|
|
|
|
2017-02-06 06:30:12 +00:00
|
|
|
typedef struct _served_gummei {
|
2017-02-06 10:12:10 +00:00
|
|
|
c_uint32_t num_of_plmn_id;
|
2017-03-24 14:01:44 +00:00
|
|
|
plmn_id_t plmn_id[MAX_PLMN_ID];
|
2017-02-06 06:30:12 +00:00
|
|
|
|
2017-02-13 05:41:20 +00:00
|
|
|
c_uint32_t num_of_mme_gid;
|
|
|
|
c_uint16_t mme_gid[GRP_PER_MME];
|
|
|
|
c_uint32_t num_of_mme_code;
|
|
|
|
c_uint8_t mme_code[CODE_PER_MME];
|
2017-02-06 06:30:12 +00:00
|
|
|
} srvd_gummei_t;
|
|
|
|
|
2017-04-06 11:10:00 +00:00
|
|
|
typedef struct _mme_context_t {
|
2017-03-27 04:22:42 +00:00
|
|
|
c_uint32_t s1ap_addr; /* MME S1AP local address */
|
|
|
|
c_uint16_t s1ap_port; /* MME S1AP local port */
|
|
|
|
net_sock_t *s1ap_sock; /* MME S1AP local listen socket */
|
|
|
|
|
|
|
|
c_uint32_t s11_addr; /* MME S11 local address */
|
|
|
|
c_uint16_t s11_port; /* MME S11 local port */
|
|
|
|
net_sock_t *s11_sock; /* MME S11 local listen socket */
|
2017-02-13 04:19:53 +00:00
|
|
|
|
2017-03-28 07:35:57 +00:00
|
|
|
msgq_id queue_id; /* Queue for processing MME control plane */
|
|
|
|
tm_service_t tm_service; /* Timer Service */
|
|
|
|
gtp_xact_ctx_t gtp_xact_ctx; /* GTP Transaction Context for MME */
|
2017-03-06 08:55:50 +00:00
|
|
|
|
2017-03-07 00:30:12 +00:00
|
|
|
c_uint32_t mme_ue_s1ap_id; /** mme_ue_s1ap_id generator */
|
2017-03-24 14:01:44 +00:00
|
|
|
plmn_id_t plmn_id;
|
2017-02-13 04:19:53 +00:00
|
|
|
|
2017-03-07 00:30:12 +00:00
|
|
|
/* defined in 'nas_ies.h'
|
|
|
|
* #define NAS_SECURITY_ALGORITHMS_EIA0 0
|
|
|
|
* #define NAS_SECURITY_ALGORITHMS_128_EEA1 1
|
|
|
|
* #define NAS_SECURITY_ALGORITHMS_128_EEA2 2
|
|
|
|
* #define NAS_SECURITY_ALGORITHMS_128_EEA3 3 */
|
|
|
|
c_uint8_t selected_enc_algorithm;
|
2017-03-07 05:47:17 +00:00
|
|
|
/* defined in 'nas_ies.h'
|
|
|
|
* #define NAS_SECURITY_ALGORITHMS_EIA0 0
|
|
|
|
* #define NAS_SECURITY_ALGORITHMS_128_EIA1 1
|
|
|
|
* #define NAS_SECURITY_ALGORITHMS_128_EIA1 2
|
|
|
|
* #define NAS_SECURITY_ALGORITHMS_128_EIA3 3 */
|
|
|
|
c_uint8_t selected_int_algorithm;
|
2017-03-07 00:30:12 +00:00
|
|
|
|
2017-02-14 00:09:01 +00:00
|
|
|
/* S1SetupRequest */
|
|
|
|
c_uint16_t tracking_area_code;
|
|
|
|
c_uint16_t default_paging_drx;
|
|
|
|
|
|
|
|
/* S1SetupResponse */
|
|
|
|
srvd_gummei_t srvd_gummei;
|
2017-02-13 04:19:53 +00:00
|
|
|
c_uint8_t relative_capacity;
|
2017-04-06 11:58:13 +00:00
|
|
|
|
|
|
|
list_t sgw_list;
|
|
|
|
list_t enb_list;
|
2017-04-06 12:44:30 +00:00
|
|
|
|
|
|
|
hash_t *mme_ue_s1ap_id_hash; /* hash table for MME-UE-S1AP-ID */
|
2017-04-06 11:10:00 +00:00
|
|
|
} mme_context_t;
|
2017-02-06 06:30:12 +00:00
|
|
|
|
2017-04-06 11:10:00 +00:00
|
|
|
typedef struct _mme_sgw_t {
|
2017-03-27 04:22:42 +00:00
|
|
|
gtp_node_t gnode; /* SGW S11 remote GTPv2-C node */
|
2017-03-26 15:48:33 +00:00
|
|
|
|
2017-04-06 11:10:00 +00:00
|
|
|
} mme_sgw_t;
|
2017-03-26 15:48:33 +00:00
|
|
|
|
2017-04-06 11:10:00 +00:00
|
|
|
typedef struct _mme_enb_t {
|
2017-02-13 04:19:53 +00:00
|
|
|
lnode_t node; /**< A node of list_t */
|
|
|
|
|
2017-03-05 04:03:11 +00:00
|
|
|
c_uint32_t enb_id; /** eNB_ID received from eNB */
|
|
|
|
|
2017-03-27 10:32:24 +00:00
|
|
|
s1ap_sm_t s1ap_sm;
|
2017-03-05 04:03:11 +00:00
|
|
|
net_sock_t *s1ap_sock;
|
|
|
|
|
2017-04-06 10:33:27 +00:00
|
|
|
list_t ue_list;
|
2017-02-13 04:19:53 +00:00
|
|
|
|
2017-04-06 11:10:00 +00:00
|
|
|
} mme_enb_t;
|
2017-02-13 04:19:53 +00:00
|
|
|
|
2017-04-06 11:10:00 +00:00
|
|
|
typedef struct _mme_ue_t {
|
2017-02-13 04:19:53 +00:00
|
|
|
lnode_t node; /**< A node of list_t */
|
|
|
|
|
2017-03-07 00:30:12 +00:00
|
|
|
/* State Machine */
|
2017-03-27 10:32:24 +00:00
|
|
|
emm_sm_t emm_sm;
|
2017-03-06 08:55:50 +00:00
|
|
|
|
2017-03-07 00:30:12 +00:00
|
|
|
/* UE identity */
|
2017-03-05 04:03:11 +00:00
|
|
|
c_uint32_t enb_ue_s1ap_id; /** eNB-UE-S1AP-ID received from eNB */
|
|
|
|
c_uint32_t mme_ue_s1ap_id; /** MME-UE-S1AP-ID received from MME */
|
2017-04-09 15:27:19 +00:00
|
|
|
#if 0
|
|
|
|
c_uint8_t imsi[MAX_IMSI_LEN];
|
2017-03-05 14:36:17 +00:00
|
|
|
c_uint8_t imsi_len;
|
2017-04-09 15:27:19 +00:00
|
|
|
#else
|
|
|
|
c_uint8_t imsi_bcd[MAX_IMSI_BCD_LEN+1];
|
|
|
|
c_uint8_t imsi_bcd_len;
|
|
|
|
#endif
|
2017-02-13 04:19:53 +00:00
|
|
|
|
2017-04-09 11:51:26 +00:00
|
|
|
/* UE Info */
|
|
|
|
plmn_id_t visited_plmn_id;
|
|
|
|
|
2017-03-07 00:30:12 +00:00
|
|
|
/* Security Context */
|
2017-03-08 14:42:27 +00:00
|
|
|
int security_context_available;
|
2017-03-07 05:47:17 +00:00
|
|
|
nas_ue_network_capability_t ue_network_capability;
|
|
|
|
nas_ms_network_capability_t ms_network_capability;
|
2017-03-06 08:55:50 +00:00
|
|
|
c_uint8_t xres[MAX_RES_LEN];
|
|
|
|
c_uint8_t xres_len;
|
2017-03-06 12:45:41 +00:00
|
|
|
c_uint8_t kasme[SHA256_DIGEST_SIZE];
|
2017-03-07 00:30:12 +00:00
|
|
|
c_uint8_t knas_int[SHA256_DIGEST_SIZE/2];
|
|
|
|
c_uint8_t knas_enc[SHA256_DIGEST_SIZE/2];
|
2017-03-08 10:10:01 +00:00
|
|
|
c_uint32_t dl_count;
|
2017-03-08 15:09:30 +00:00
|
|
|
union {
|
|
|
|
struct {
|
|
|
|
ED3(c_uint8_t spare;,
|
|
|
|
c_uint16_t overflow;,
|
|
|
|
c_uint8_t sqn;)
|
|
|
|
} __attribute__ ((packed));
|
|
|
|
c_uint32_t i32;
|
|
|
|
} ul_count;
|
2017-03-05 08:36:16 +00:00
|
|
|
|
2017-04-08 01:18:48 +00:00
|
|
|
list_t esm_list;
|
|
|
|
|
2017-04-06 11:10:00 +00:00
|
|
|
mme_enb_t *enb;
|
|
|
|
} mme_ue_t;
|
|
|
|
|
2017-04-08 01:18:48 +00:00
|
|
|
typedef struct _mme_esm_t {
|
|
|
|
lnode_t node; /**< A node of list_t */
|
|
|
|
|
|
|
|
c_uint8_t pti; /** Procedure Trasaction Identity */
|
|
|
|
|
|
|
|
esm_sm_t sm;
|
|
|
|
|
|
|
|
mme_ue_t *ue;
|
|
|
|
} mme_esm_t;
|
|
|
|
|
2017-04-06 11:10:00 +00:00
|
|
|
CORE_DECLARE(status_t) mme_context_init(void);
|
|
|
|
CORE_DECLARE(status_t) mme_context_final(void);
|
|
|
|
CORE_DECLARE(mme_context_t*) mme_self(void);
|
|
|
|
|
|
|
|
CORE_DECLARE(mme_sgw_t*) mme_sgw_add(void);
|
|
|
|
CORE_DECLARE(status_t) mme_sgw_remove(mme_sgw_t *sgw);
|
|
|
|
CORE_DECLARE(status_t) mme_sgw_remove_all(void);
|
|
|
|
CORE_DECLARE(mme_sgw_t*) mme_sgw_find_by_node(gtp_node_t *gnode);
|
|
|
|
CORE_DECLARE(mme_sgw_t*) mme_sgw_first(void);
|
|
|
|
CORE_DECLARE(mme_sgw_t*) mme_sgw_next(mme_sgw_t *sgw);
|
|
|
|
|
2017-04-08 01:45:48 +00:00
|
|
|
CORE_DECLARE(mme_enb_t*) mme_enb_add(net_sock_t *s1ap_sock);
|
2017-04-06 11:10:00 +00:00
|
|
|
CORE_DECLARE(status_t) mme_enb_remove(mme_enb_t *enb);
|
|
|
|
CORE_DECLARE(status_t) mme_enb_remove_all(void);
|
|
|
|
CORE_DECLARE(mme_enb_t*) mme_enb_find_by_sock(net_sock_t *sock);
|
|
|
|
CORE_DECLARE(mme_enb_t*) mme_enb_find_by_enb_id(c_uint32_t enb_id);
|
|
|
|
CORE_DECLARE(mme_enb_t*) mme_enb_first(void);
|
|
|
|
CORE_DECLARE(mme_enb_t*) mme_enb_next(mme_enb_t *enb);
|
|
|
|
|
|
|
|
CORE_DECLARE(mme_ue_t*) mme_ue_add(mme_enb_t *enb);
|
|
|
|
CORE_DECLARE(status_t) mme_ue_remove(mme_ue_t *ue);
|
2017-04-06 12:44:30 +00:00
|
|
|
CORE_DECLARE(status_t) mme_ue_remove_all();
|
|
|
|
CORE_DECLARE(mme_ue_t*) mme_ue_find_by_mme_ue_s1ap_id(
|
|
|
|
c_uint32_t mme_ue_s1ap_id);
|
|
|
|
CORE_DECLARE(hash_index_t *) mme_ue_first();
|
|
|
|
CORE_DECLARE(hash_index_t *) mme_ue_next(hash_index_t *hi);
|
|
|
|
CORE_DECLARE(mme_ue_t *) mme_ue_this(hash_index_t *hi);
|
|
|
|
CORE_DECLARE(unsigned int) mme_ue_count();
|
|
|
|
CORE_DECLARE(status_t) mme_ue_remove_in_enb(mme_enb_t *enb);
|
2017-04-06 11:10:00 +00:00
|
|
|
CORE_DECLARE(mme_ue_t*) mme_ue_find_by_enb_ue_s1ap_id(
|
|
|
|
mme_enb_t *enb, c_uint32_t enb_ue_s1ap_id);
|
2017-04-06 12:44:30 +00:00
|
|
|
CORE_DECLARE(mme_ue_t*) mme_ue_first_in_enb(mme_enb_t *enb);
|
|
|
|
CORE_DECLARE(mme_ue_t*) mme_ue_next_in_enb(mme_ue_t *ue);
|
2017-03-05 04:03:11 +00:00
|
|
|
|
2017-04-08 01:45:48 +00:00
|
|
|
CORE_DECLARE(mme_esm_t*) mme_esm_add(mme_ue_t *ue, c_uint8_t pti);
|
2017-04-08 01:18:48 +00:00
|
|
|
CORE_DECLARE(status_t) mme_esm_remove(mme_esm_t *esm);
|
|
|
|
CORE_DECLARE(status_t) mme_esm_remove_all(mme_ue_t *ue);
|
|
|
|
CORE_DECLARE(mme_esm_t*) mme_esm_find_by_pti(mme_ue_t *ue, c_uint8_t pti);
|
|
|
|
CORE_DECLARE(mme_esm_t*) mme_esm_first(mme_ue_t *ue);
|
|
|
|
CORE_DECLARE(mme_esm_t*) mme_esm_next(mme_esm_t *esm);
|
|
|
|
|
2017-02-06 06:30:12 +00:00
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif /* __cplusplus */
|
|
|
|
|
2017-04-06 11:10:00 +00:00
|
|
|
#endif /* __MME_CONTEXT__ */
|