2017-04-06 11:10:00 +00:00
|
|
|
#ifndef __MME_CONTEXT__
|
|
|
|
#define __MME_CONTEXT__
|
2017-02-06 06:30:12 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
#include "ogs-crypt.h"
|
|
|
|
#include "base/types.h"
|
|
|
|
|
2019-06-11 09:28:25 +00:00
|
|
|
#include "asn1c/s1ap-message.h"
|
|
|
|
#include "nas/nas-message.h"
|
|
|
|
#include "fd/s6a/s6a-message.h"
|
|
|
|
#include "gtp/gtp-tlv.h"
|
2017-03-26 15:48:33 +00:00
|
|
|
|
2017-04-28 04:46:16 +00:00
|
|
|
/* S1AP */
|
2018-03-05 14:01:07 +00:00
|
|
|
#include "S1AP_Cause.h"
|
2017-04-28 04:46:16 +00:00
|
|
|
|
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-07-14 15:27:22 +00:00
|
|
|
#define MAX_NUM_OF_SERVED_TAI 16
|
|
|
|
#define MAX_NUM_OF_SERVED_GUMMEI 8
|
2017-07-14 11:46:15 +00:00
|
|
|
#define MAX_NUM_OF_ALGORITHM 8
|
|
|
|
|
2017-08-04 21:34:52 +00:00
|
|
|
#define MAX_NUM_OF_BPLMN 6
|
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
extern int __mme_log_domain;
|
|
|
|
extern int __emm_log_domain;
|
|
|
|
extern int __esm_log_domain;
|
|
|
|
|
|
|
|
#undef OGS_LOG_DOMAIN
|
|
|
|
#define OGS_LOG_DOMAIN __mme_log_domain
|
|
|
|
|
2019-05-18 15:24:15 +00:00
|
|
|
typedef struct mme_sgw_s mme_sgw_t;
|
|
|
|
typedef struct mme_pgw_s mme_pgw_t;
|
2019-06-02 12:55:24 +00:00
|
|
|
typedef struct mme_vlr_s mme_vlr_t;
|
2018-09-23 04:16:40 +00:00
|
|
|
|
2019-05-18 15:24:15 +00:00
|
|
|
typedef struct enb_ue_s enb_ue_t;
|
|
|
|
typedef struct mme_ue_s mme_ue_t;
|
2017-11-24 15:52:07 +00:00
|
|
|
|
2019-05-28 05:47:06 +00:00
|
|
|
typedef struct gtp_node_s gtp_node_t;
|
|
|
|
typedef struct gtp_xact_s gtp_xact_t;
|
2017-11-30 11:13:15 +00:00
|
|
|
|
2019-05-28 05:47:06 +00:00
|
|
|
typedef struct fd_config_s fd_config_t;
|
2018-01-05 07:25:02 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
typedef uint32_t mme_m_tmsi_t;
|
2018-01-21 06:44:30 +00:00
|
|
|
|
2018-09-23 05:29:19 +00:00
|
|
|
typedef enum {
|
|
|
|
SGW_SELECT_RR = 0, /* Default SGW Selection Method */
|
|
|
|
SGW_SELECT_TAC,
|
|
|
|
} sgw_select_e;
|
|
|
|
|
2019-05-18 15:24:15 +00:00
|
|
|
typedef struct served_gummei_s {
|
|
|
|
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
|
|
|
|
2019-05-18 15:24:15 +00:00
|
|
|
uint32_t num_of_mme_gid;
|
|
|
|
uint16_t mme_gid[GRP_PER_MME];
|
|
|
|
uint32_t num_of_mme_code;
|
|
|
|
uint8_t mme_code[CODE_PER_MME];
|
2017-07-14 13:03:10 +00:00
|
|
|
} served_gummei_t;
|
2017-02-06 06:30:12 +00:00
|
|
|
|
2019-05-18 15:24:15 +00:00
|
|
|
typedef struct mme_context_s {
|
2017-11-08 15:05:18 +00:00
|
|
|
const char *fd_conf_path; /* MME freeDiameter conf path */
|
2018-01-05 07:25:02 +00:00
|
|
|
fd_config_t *fd_config; /* MME freeDiameter config */
|
2017-08-17 05:15:08 +00:00
|
|
|
|
2019-05-18 15:24:15 +00:00
|
|
|
uint16_t s1ap_port; /* Default S1AP Port */
|
|
|
|
uint16_t gtpc_port; /* Default GTPC Port */
|
2019-06-02 12:55:24 +00:00
|
|
|
uint16_t sgsap_port; /* Default SGsAP Port */
|
2017-12-01 15:44:07 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_list_t s1ap_list; /* MME S1AP IPv4 Server List */
|
|
|
|
ogs_list_t s1ap_list6; /* MME S1AP IPv6 Server List */
|
2017-12-08 03:43:35 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_list_t gtpc_list; /* MME GTPC IPv4 Server List */
|
|
|
|
ogs_list_t gtpc_list6; /* MME GTPC IPv6 Server List */
|
2019-06-02 12:55:24 +00:00
|
|
|
ogs_sock_t *gtpc_sock; /* MME GTPC IPv4 Socket */
|
|
|
|
ogs_sock_t *gtpc_sock6; /* MME GTPC IPv6 Socket */
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_sockaddr_t *gtpc_addr; /* MME GTPC IPv4 Address */
|
|
|
|
ogs_sockaddr_t *gtpc_addr6; /* MME GTPC IPv6 Address */
|
2017-02-13 04:19:53 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_list_t sgw_list; /* SGW GTPC Client List */
|
2018-09-23 04:16:40 +00:00
|
|
|
mme_sgw_t *sgw; /* Iterator for SGW round-robin */
|
2017-12-02 05:17:32 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_list_t pgw_list; /* PGW GTPC Client List */
|
|
|
|
ogs_sockaddr_t *pgw_addr; /* First IPv4 Address Selected */
|
|
|
|
ogs_sockaddr_t *pgw_addr6; /* First IPv6 Address Selected */
|
2017-08-28 12:47:32 +00:00
|
|
|
|
2019-06-02 12:55:24 +00:00
|
|
|
ogs_list_t vlr_list; /* VLR SGsAP Client List */
|
|
|
|
mme_vlr_t *vlr; /* Iterator for VLR */
|
|
|
|
|
2017-12-10 15:01:02 +00:00
|
|
|
/* Served GUMME */
|
2019-04-27 14:54:30 +00:00
|
|
|
uint8_t max_num_of_served_gummei;
|
2017-12-10 15:01:02 +00:00
|
|
|
served_gummei_t served_gummei[MAX_NUM_OF_SERVED_GUMMEI];
|
2017-03-06 08:55:50 +00:00
|
|
|
|
2017-12-10 15:01:02 +00:00
|
|
|
/* Served TAI */
|
2019-04-27 14:54:30 +00:00
|
|
|
uint8_t num_of_served_tai;
|
2017-12-10 15:01:02 +00:00
|
|
|
struct {
|
|
|
|
tai0_list_t list0;
|
|
|
|
tai2_list_t list2;
|
|
|
|
} served_tai[MAX_NUM_OF_SERVED_TAI];
|
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 */
|
2019-05-18 15:24:15 +00:00
|
|
|
uint8_t num_of_ciphering_order;
|
|
|
|
uint8_t ciphering_order[MAX_NUM_OF_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 */
|
2019-04-27 14:54:30 +00:00
|
|
|
uint8_t num_of_integrity_order;
|
|
|
|
uint8_t integrity_order[MAX_NUM_OF_ALGORITHM];
|
2017-03-07 00:30:12 +00:00
|
|
|
|
2017-02-14 00:09:01 +00:00
|
|
|
/* S1SetupResponse */
|
2019-04-27 14:54:30 +00:00
|
|
|
uint8_t relative_capacity;
|
2017-04-06 11:58:13 +00:00
|
|
|
|
2019-06-16 08:33:45 +00:00
|
|
|
/* Paging retry timer value */
|
|
|
|
ogs_time_t t3413_value;
|
|
|
|
/* Client timer value to connect to server */
|
2019-06-16 09:20:40 +00:00
|
|
|
ogs_time_t t_conn_value;
|
2017-12-10 15:01:02 +00:00
|
|
|
|
|
|
|
/* Generator for unique identification */
|
2019-04-27 14:54:30 +00:00
|
|
|
uint32_t mme_ue_s1ap_id; /* mme_ue_s1ap_id generator */
|
2019-06-16 07:47:20 +00:00
|
|
|
uint16_t enb_ostream_id; /* enb_ostream_id generator */
|
|
|
|
uint16_t vlr_ostream_id; /* vlr_ostream_id generator */
|
2018-01-21 06:44:30 +00:00
|
|
|
|
2018-01-21 07:53:39 +00:00
|
|
|
/* M-TMSI Pool */
|
2019-04-27 14:54:30 +00:00
|
|
|
OGS_POOL(m_tmsi, mme_m_tmsi_t);
|
|
|
|
|
|
|
|
ogs_hash_t *enb_sock_hash; /* hash table for ENB Socket */
|
|
|
|
ogs_hash_t *enb_addr_hash; /* hash table for ENB Address */
|
|
|
|
ogs_hash_t *enb_id_hash; /* hash table for ENB-ID */
|
|
|
|
ogs_hash_t *mme_ue_s1ap_id_hash; /* hash table for MME-UE-S1AP-ID */
|
|
|
|
ogs_hash_t *imsi_ue_hash; /* hash table (IMSI : MME_UE) */
|
|
|
|
ogs_hash_t *guti_ue_hash; /* hash table (GUTI : MME_UE) */
|
2017-12-10 15:01:02 +00:00
|
|
|
|
|
|
|
/* System */
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_queue_t *queue; /* Queue for processing MME control */
|
|
|
|
ogs_timer_mgr_t *timer_mgr; /* Timer Manager */
|
|
|
|
ogs_pollset_t *pollset; /* Poll Set for I/O Multiplexing */
|
2018-02-25 21:33:36 +00:00
|
|
|
|
|
|
|
/* Network Name */
|
|
|
|
nas_network_name_t short_name; /* Network short name */
|
|
|
|
nas_network_name_t full_name; /* Network Full Name */
|
2018-09-23 05:29:19 +00:00
|
|
|
|
|
|
|
/* SGW Selection */
|
|
|
|
sgw_select_e sgw_selection;
|
2018-02-25 21:33:36 +00:00
|
|
|
|
2017-04-06 11:10:00 +00:00
|
|
|
} mme_context_t;
|
2017-02-06 06:30:12 +00:00
|
|
|
|
2019-05-18 15:24:15 +00:00
|
|
|
typedef struct mme_sgw_s {
|
2019-06-05 12:13:18 +00:00
|
|
|
ogs_lnode_t lnode;
|
2018-09-23 04:16:40 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
uint16_t tac[MAX_NUM_OF_TAI];
|
|
|
|
uint8_t num_of_tac;
|
2018-09-23 05:29:19 +00:00
|
|
|
|
2019-06-05 12:13:18 +00:00
|
|
|
gtp_node_t *node;
|
2018-09-23 04:16:40 +00:00
|
|
|
} mme_sgw_t;
|
|
|
|
|
2019-05-18 15:24:15 +00:00
|
|
|
typedef struct mme_pgw_s {
|
2019-06-05 12:13:18 +00:00
|
|
|
ogs_lnode_t lnode;
|
2018-09-23 04:16:40 +00:00
|
|
|
|
2019-06-05 12:13:18 +00:00
|
|
|
gtp_node_t *node;
|
2019-05-18 15:24:15 +00:00
|
|
|
const char *apn;
|
2018-09-23 04:16:40 +00:00
|
|
|
} mme_pgw_t;
|
|
|
|
|
2019-06-02 12:55:24 +00:00
|
|
|
typedef struct mme_vlr_s {
|
|
|
|
ogs_lnode_t lnode;
|
|
|
|
|
2019-06-16 09:20:40 +00:00
|
|
|
ogs_fsm_t sm; /* A state machine */
|
2019-06-16 08:33:45 +00:00
|
|
|
|
2019-06-16 09:20:40 +00:00
|
|
|
ogs_timer_t *t_conn; /* client timer to connect to server */
|
2019-06-16 07:47:20 +00:00
|
|
|
|
2019-06-16 06:40:26 +00:00
|
|
|
nas_tai_t tai;
|
|
|
|
nas_lai_t lai;
|
2019-06-02 12:55:24 +00:00
|
|
|
|
2019-06-16 07:47:20 +00:00
|
|
|
uint16_t max_num_of_ostreams; /* SCTP Max num of outbound streams */
|
|
|
|
|
2019-06-17 01:36:44 +00:00
|
|
|
ogs_sockaddr_t *sa_list; /* VLR SGsAP Socket Address List */
|
|
|
|
|
2019-06-16 12:26:22 +00:00
|
|
|
ogs_socknode_t *node; /* VLR SGsAP Node */
|
2019-06-17 01:36:44 +00:00
|
|
|
ogs_sockaddr_t *addr; /* VLR SGsAP Connected Socket Address */
|
2019-06-02 12:55:24 +00:00
|
|
|
} mme_vlr_t;
|
|
|
|
|
2019-05-18 15:24:15 +00:00
|
|
|
typedef struct mme_enb_s {
|
2019-06-02 12:55:24 +00:00
|
|
|
ogs_fsm_t sm; /* A state machine */
|
2017-02-13 04:19:53 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
uint32_t enb_id; /* eNB_ID received from eNB */
|
2017-11-24 10:03:48 +00:00
|
|
|
int sock_type; /* SOCK_STREAM or SOCK_SEQPACKET */
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_sock_t *sock; /* eNB S1AP Socket */
|
|
|
|
ogs_sockaddr_t *addr; /* eNB S1AP Address */
|
|
|
|
ogs_poll_t *poll; /* eNB S1AP Poll */
|
2017-03-05 04:03:11 +00:00
|
|
|
|
2019-06-16 07:47:20 +00:00
|
|
|
uint16_t max_num_of_ostreams; /* SCTP Max num of outbound streams */
|
2018-05-18 08:14:29 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
uint8_t num_of_supported_ta_list;
|
2017-12-11 07:55:11 +00:00
|
|
|
tai_t supported_ta_list[MAX_NUM_OF_TAI * MAX_NUM_OF_BPLMN];
|
2017-08-04 21:34:52 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_list_t enb_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
|
|
|
|
2019-05-18 15:24:15 +00:00
|
|
|
struct enb_ue_s {
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_lnode_t node; /* A node of list_t */
|
2017-04-28 04:43:42 +00:00
|
|
|
|
|
|
|
/* UE identity */
|
2018-04-17 21:35:15 +00:00
|
|
|
#define INVALID_UE_S1AP_ID 0xffffffff /* Initial value of enb_ue_s1ap_id */
|
2019-04-27 14:54:30 +00:00
|
|
|
uint32_t enb_ue_s1ap_id; /* eNB-UE-S1AP-ID received from eNB */
|
|
|
|
uint32_t mme_ue_s1ap_id; /* MME-UE-S1AP-ID received from MME */
|
2017-04-28 04:43:42 +00:00
|
|
|
|
2017-09-13 12:51:02 +00:00
|
|
|
/* Handover Info */
|
2018-03-05 14:01:07 +00:00
|
|
|
S1AP_HandoverType_t handover_type;
|
2017-09-14 09:01:26 +00:00
|
|
|
enb_ue_t *source_ue;
|
|
|
|
enb_ue_t *target_ue;
|
2017-09-13 12:51:02 +00:00
|
|
|
|
2017-09-14 08:40:01 +00:00
|
|
|
/* Use mme_ue->tai, mme_ue->e_cgi.
|
2019-06-02 12:55:24 +00:00
|
|
|
* Do not access enb_ue->saved.tai enb_ue->saved.e_cgi.
|
2017-09-14 08:40:01 +00:00
|
|
|
*
|
|
|
|
* Save TAI and ECGI. And then, this will copy 'mme_ue_t' context later */
|
|
|
|
struct {
|
2018-01-11 13:12:48 +00:00
|
|
|
tai_t tai;
|
|
|
|
e_cgi_t e_cgi;
|
2019-06-02 12:55:24 +00:00
|
|
|
} saved;
|
2017-04-28 04:43:42 +00:00
|
|
|
|
2018-01-11 13:12:48 +00:00
|
|
|
/* Store by UE Context Release Command
|
|
|
|
* Retrieve by UE Context Release Complete */
|
|
|
|
#define S1AP_UE_CTX_REL_INVALID_ACTION 0
|
|
|
|
#define S1AP_UE_CTX_REL_NO_ACTION 1
|
2018-02-04 08:05:30 +00:00
|
|
|
#define S1AP_UE_CTX_REL_S1_NORMAL_RELEASE 2
|
|
|
|
#define S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE 3
|
2018-02-01 17:48:55 +00:00
|
|
|
#define S1AP_UE_CTX_REL_DELETE_INDIRECT_TUNNEL 4
|
2019-04-27 14:54:30 +00:00
|
|
|
uint8_t ue_ctx_rel_action;
|
2018-02-02 10:37:36 +00:00
|
|
|
|
2017-09-14 08:40:01 +00:00
|
|
|
/* Related Context */
|
2017-04-28 04:43:42 +00:00
|
|
|
mme_enb_t *enb;
|
2017-09-14 08:40:01 +00:00
|
|
|
mme_ue_t *mme_ue;
|
2017-04-28 04:43:42 +00:00
|
|
|
};
|
|
|
|
|
2019-05-18 15:24:15 +00:00
|
|
|
struct mme_ue_s {
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_fsm_t sm; /* A state machine */
|
2017-03-06 08:55:50 +00:00
|
|
|
|
2017-09-08 07:46:37 +00:00
|
|
|
struct {
|
2017-09-13 15:02:26 +00:00
|
|
|
#define MME_EPS_TYPE_ATTACH_REQUEST 1
|
|
|
|
#define MME_EPS_TYPE_TAU_REQUEST 2
|
|
|
|
#define MME_EPS_TYPE_SERVICE_REQUEST 3
|
2018-02-04 04:12:26 +00:00
|
|
|
#define MME_EPS_TYPE_DETACH_REQUEST_FROM_UE 4
|
|
|
|
#define MME_EPS_TYPE_DETACH_REQUEST_TO_UE 5
|
2019-04-27 14:54:30 +00:00
|
|
|
uint8_t type;
|
|
|
|
uint8_t ksi;
|
2017-09-08 07:46:37 +00:00
|
|
|
union {
|
|
|
|
nas_eps_attach_type_t attach;
|
|
|
|
nas_eps_update_type_t update;
|
2018-02-04 04:12:26 +00:00
|
|
|
nas_detach_type_t detach;
|
2019-04-27 14:54:30 +00:00
|
|
|
uint8_t data;
|
2017-09-08 07:46:37 +00:00
|
|
|
};
|
|
|
|
} nas_eps;
|
|
|
|
|
2017-03-07 00:30:12 +00:00
|
|
|
/* UE identity */
|
2017-09-03 15:06:39 +00:00
|
|
|
#define MME_UE_HAVE_IMSI(__mME) \
|
|
|
|
((__mME) && ((__mME)->imsi_len))
|
2019-04-27 14:54:30 +00:00
|
|
|
uint8_t imsi[MAX_IMSI_LEN];
|
2017-04-10 02:29:46 +00:00
|
|
|
int imsi_len;
|
2019-04-27 14:54:30 +00:00
|
|
|
char imsi_bcd[MAX_IMSI_BCD_LEN+1];
|
2018-01-29 22:25:42 +00:00
|
|
|
|
2018-01-21 07:53:39 +00:00
|
|
|
mme_m_tmsi_t *m_tmsi;
|
2019-05-26 06:27:09 +00:00
|
|
|
nas_guti_t guti;
|
2018-01-29 22:25:42 +00:00
|
|
|
int guti_present;
|
2017-02-13 04:19:53 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
uint32_t mme_s11_teid; /* MME-S11-TEID is derived from INDEX */
|
|
|
|
uint32_t sgw_s11_teid; /* SGW-S11-TEID is received from SGW */
|
2017-09-01 12:35:45 +00:00
|
|
|
|
2019-06-16 07:47:20 +00:00
|
|
|
uint16_t enb_ostream_id; /* SCTP output stream id for eNB */
|
|
|
|
uint16_t vlr_ostream_id; /* SCTP output stream id for VLR */
|
2018-05-10 02:18:43 +00:00
|
|
|
|
2017-04-09 11:51:26 +00:00
|
|
|
/* UE Info */
|
2017-04-11 11:44:38 +00:00
|
|
|
tai_t tai;
|
|
|
|
e_cgi_t e_cgi;
|
2017-04-09 11:51:26 +00:00
|
|
|
plmn_id_t visited_plmn_id;
|
|
|
|
|
2017-09-03 15:06:39 +00:00
|
|
|
#define SECURITY_CONTEXT_IS_VALID(__mME) \
|
|
|
|
((__mME) && \
|
2018-02-04 04:12:26 +00:00
|
|
|
((__mME)->security_context_available == 1) && \
|
|
|
|
((__mME)->mac_failed == 0) && \
|
|
|
|
((__mME)->nas_eps.ksi != NAS_KSI_NO_KEY_IS_AVAILABLE))
|
2017-09-03 15:06:39 +00:00
|
|
|
#define CLEAR_SECURITY_CONTEXT(__mME) \
|
2017-07-30 09:38:37 +00:00
|
|
|
do { \
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert((__mME)); \
|
2017-09-03 15:06:39 +00:00
|
|
|
(__mME)->security_context_available = 0; \
|
|
|
|
(__mME)->mac_failed = 0; \
|
2018-02-04 04:12:26 +00:00
|
|
|
(__mME)->nas_eps.ksi = 0; \
|
2017-07-30 09:38:37 +00:00
|
|
|
} while(0)
|
2017-03-08 14:42:27 +00:00
|
|
|
int security_context_available;
|
2017-07-30 09:38:37 +00:00
|
|
|
int mac_failed;
|
2017-07-28 05:19:43 +00:00
|
|
|
|
2017-07-30 09:38:37 +00:00
|
|
|
/* Security Context */
|
2017-03-07 05:47:17 +00:00
|
|
|
nas_ue_network_capability_t ue_network_capability;
|
|
|
|
nas_ms_network_capability_t ms_network_capability;
|
2019-04-27 14:54:30 +00:00
|
|
|
uint8_t xres[MAX_RES_LEN];
|
|
|
|
uint8_t xres_len;
|
|
|
|
uint8_t kasme[OGS_SHA256_DIGEST_SIZE];
|
|
|
|
uint8_t rand[RAND_LEN];
|
|
|
|
uint8_t knas_int[OGS_SHA256_DIGEST_SIZE/2];
|
|
|
|
uint8_t knas_enc[OGS_SHA256_DIGEST_SIZE/2];
|
|
|
|
uint32_t dl_count;
|
2017-03-08 15:09:30 +00:00
|
|
|
union {
|
|
|
|
struct {
|
2019-04-27 14:54:30 +00:00
|
|
|
ED3(uint8_t spare;,
|
|
|
|
uint16_t overflow;,
|
|
|
|
uint8_t sqn;)
|
2017-03-08 15:09:30 +00:00
|
|
|
} __attribute__ ((packed));
|
2019-04-27 14:54:30 +00:00
|
|
|
uint32_t i32;
|
2017-03-08 15:09:30 +00:00
|
|
|
} ul_count;
|
2019-04-27 14:54:30 +00:00
|
|
|
uint8_t kenb[OGS_SHA256_DIGEST_SIZE];
|
2017-09-12 01:41:00 +00:00
|
|
|
|
|
|
|
struct {
|
2019-04-27 14:54:30 +00:00
|
|
|
ED2(uint8_t nhcc_spare:5;,
|
|
|
|
uint8_t nhcc:3;) /* Next Hop Channing Counter */
|
2017-09-12 01:41:00 +00:00
|
|
|
};
|
2019-04-27 14:54:30 +00:00
|
|
|
uint8_t nh[OGS_SHA256_DIGEST_SIZE]; /* NH Security Key */
|
2017-03-05 08:36:16 +00:00
|
|
|
|
2017-07-14 12:39:21 +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 */
|
2019-04-27 14:54:30 +00:00
|
|
|
uint8_t selected_enc_algorithm;
|
2017-07-14 12:39:21 +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 */
|
2019-04-27 14:54:30 +00:00
|
|
|
uint8_t selected_int_algorithm;
|
2017-07-14 12:39:21 +00:00
|
|
|
|
2017-04-10 12:05:28 +00:00
|
|
|
/* HSS Info */
|
2017-08-25 15:11:46 +00:00
|
|
|
s6a_subscription_data_t subscription_data;
|
2017-04-10 12:05:28 +00:00
|
|
|
|
2017-04-27 14:06:10 +00:00
|
|
|
/* ESM Info */
|
2017-08-27 07:30:10 +00:00
|
|
|
#define MIN_EPS_BEARER_ID 5
|
|
|
|
#define MAX_EPS_BEARER_ID 15
|
|
|
|
|
2017-09-03 15:06:39 +00:00
|
|
|
#define CLEAR_EPS_BEARER_ID(__mME) \
|
2017-08-27 07:30:10 +00:00
|
|
|
do { \
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert((__mME)); \
|
2017-09-03 15:06:39 +00:00
|
|
|
(__mME)->ebi = MIN_EPS_BEARER_ID - 1; \
|
2017-08-27 07:30:10 +00:00
|
|
|
} while(0)
|
2019-04-27 14:54:30 +00:00
|
|
|
uint8_t ebi; /* EPS Bearer ID generator */
|
|
|
|
ogs_list_t sess_list;
|
2017-04-27 14:06:10 +00:00
|
|
|
|
2018-02-03 13:55:05 +00:00
|
|
|
#define ECM_CONNECTED(__mME) \
|
2019-04-27 14:54:30 +00:00
|
|
|
((__mME) && ((__mME)->enb_ue != NULL))
|
2018-02-03 14:23:50 +00:00
|
|
|
#define ECM_IDLE(__mME) (!ECM_CONNECTED(__mME))
|
2018-01-29 05:48:51 +00:00
|
|
|
/* S1 UE context */
|
2017-04-28 05:43:04 +00:00
|
|
|
enb_ue_t *enb_ue;
|
2017-07-26 08:55:53 +00:00
|
|
|
|
2017-09-06 11:29:55 +00:00
|
|
|
/* Save PDN Connectivity Request */
|
|
|
|
nas_esm_message_container_t pdn_connectivity_request;
|
2017-09-03 02:48:41 +00:00
|
|
|
|
2017-08-07 22:58:13 +00:00
|
|
|
/* Paging */
|
2017-09-08 07:46:37 +00:00
|
|
|
#define CLEAR_PAGING_INFO(__mME) \
|
|
|
|
do { \
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert((__mME)); \
|
2017-09-08 07:46:37 +00:00
|
|
|
\
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_timer_stop((__mME)->t3413); \
|
2017-09-08 07:46:37 +00:00
|
|
|
if ((__mME)->last_paging_msg) \
|
|
|
|
{ \
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_pkbuf_free((__mME)->last_paging_msg); \
|
2017-09-08 07:46:37 +00:00
|
|
|
(__mME)->last_paging_msg = NULL; \
|
|
|
|
} \
|
|
|
|
(__mME)->max_paging_retry = 0; \
|
|
|
|
} while(0);
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_pkbuf_t *last_paging_msg;
|
|
|
|
ogs_timer_t *t3413;
|
2017-08-07 22:58:13 +00:00
|
|
|
#define MAX_NUM_OF_PAGING 2
|
2019-04-27 14:54:30 +00:00
|
|
|
uint32_t max_paging_retry;
|
2017-08-08 19:01:08 +00:00
|
|
|
|
|
|
|
/* UE Radio Capability */
|
2018-04-09 12:52:16 +00:00
|
|
|
OCTET_STRING_t ueRadioCapability;
|
2017-08-27 07:30:10 +00:00
|
|
|
|
2017-09-13 02:57:17 +00:00
|
|
|
/* S1AP Transparent Container */
|
2019-04-27 14:54:30 +00:00
|
|
|
OCTET_STRING_t container;
|
2017-09-13 02:57:17 +00:00
|
|
|
|
2017-09-13 02:18:17 +00:00
|
|
|
/* GTP Request/Response Counter */
|
|
|
|
#define GTP_COUNTER_INCREMENT(__mME, __tYPE) \
|
|
|
|
do { \
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert((__mME)); \
|
2017-09-13 02:18:17 +00:00
|
|
|
((__mME)->gtp_counter[__tYPE].request)++; \
|
|
|
|
} while(0);
|
2017-09-11 15:49:15 +00:00
|
|
|
|
2017-09-13 02:18:17 +00:00
|
|
|
#define GTP_COUNTER_CHECK(__mME, __tYPE, __eXPR) \
|
2017-09-11 15:49:15 +00:00
|
|
|
do { \
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert((__mME)); \
|
2017-09-13 14:49:31 +00:00
|
|
|
if ((__mME)->gtp_counter[__tYPE].request == 0) break; \
|
2017-09-13 02:18:17 +00:00
|
|
|
((__mME)->gtp_counter[__tYPE].response)++; \
|
|
|
|
if (((__mME)->gtp_counter[__tYPE].request) == \
|
|
|
|
((__mME)->gtp_counter[__tYPE].response)) \
|
|
|
|
{ \
|
|
|
|
((__mME)->gtp_counter[__tYPE].request) = 0; \
|
|
|
|
((__mME)->gtp_counter[__tYPE].response) = 0; \
|
|
|
|
__eXPR \
|
|
|
|
} \
|
2017-09-11 15:49:15 +00:00
|
|
|
} while(0);
|
|
|
|
|
2017-09-15 03:06:26 +00:00
|
|
|
#define MAX_NUM_OF_GTP_COUNTER 16
|
2017-09-13 02:18:17 +00:00
|
|
|
|
2017-09-15 03:06:26 +00:00
|
|
|
#define GTP_COUNTER_MODIFY_BEARER_BY_PATH_SWITCH 1
|
|
|
|
#define GTP_COUNTER_MODIFY_BEARER_BY_HANDOVER_NOTIFY 2
|
2017-09-13 02:18:17 +00:00
|
|
|
struct {
|
2019-04-27 14:54:30 +00:00
|
|
|
uint8_t request;
|
|
|
|
uint8_t response;
|
2017-09-13 02:18:17 +00:00
|
|
|
} gtp_counter[MAX_NUM_OF_GTP_COUNTER];
|
2017-09-14 10:55:21 +00:00
|
|
|
|
2019-06-14 09:10:59 +00:00
|
|
|
/*
|
|
|
|
* If the MME sends Delete-Session-Request to the SGW for all sessions,
|
|
|
|
* session_context_will_deleted = 1
|
|
|
|
* When the MME receives a Delete-Session-Response for the last session,
|
|
|
|
* session_context_will_deleted = 0
|
|
|
|
*/
|
|
|
|
int session_context_will_deleted;
|
|
|
|
|
2017-12-06 08:58:38 +00:00
|
|
|
gtp_node_t *gnode;
|
2019-06-16 07:47:20 +00:00
|
|
|
mme_vlr_t *vlr;
|
2017-04-28 05:43:04 +00:00
|
|
|
};
|
2017-04-27 14:06:10 +00:00
|
|
|
|
2017-09-05 03:37:27 +00:00
|
|
|
#define MME_HAVE_SGW_S1U_PATH(__sESS) \
|
2017-09-04 13:00:51 +00:00
|
|
|
((__sESS) && (mme_bearer_first(__sESS)) && \
|
2017-12-07 08:23:45 +00:00
|
|
|
((mme_default_bearer_in_sess(__sESS)->sgw_s1u_teid)))
|
2018-02-09 07:26:55 +00:00
|
|
|
#define CLEAR_SGW_S1U_PATH(__sESS) \
|
|
|
|
do { \
|
|
|
|
mme_bearer_t *__bEARER = NULL; \
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert((__sESS)); \
|
2018-02-09 07:26:55 +00:00
|
|
|
__bEARER = mme_default_bearer_in_sess(__sESS); \
|
|
|
|
__bEARER->sgw_s1u_teid = 0; \
|
|
|
|
} while(0)
|
2017-09-04 13:00:51 +00:00
|
|
|
|
2018-02-03 13:55:05 +00:00
|
|
|
#define SESSION_CONTEXT_IS_AVAILABLE(__mME) \
|
2017-12-06 03:28:24 +00:00
|
|
|
((__mME) && ((__mME)->sgw_s11_teid))
|
2017-09-05 03:37:27 +00:00
|
|
|
|
2019-06-14 09:10:59 +00:00
|
|
|
#define SESSION_CONTEXT_WILL_DELETED(__mME) \
|
|
|
|
((__mME) && ((__mME)->session_context_will_deleted))
|
|
|
|
|
2018-02-02 12:09:37 +00:00
|
|
|
#define CLEAR_SESSION_CONTEXT(__mME) \
|
2017-09-05 03:37:27 +00:00
|
|
|
do { \
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert((__mME)); \
|
2017-09-05 03:37:27 +00:00
|
|
|
(__mME)->sgw_s11_teid = 0; \
|
2019-06-14 09:10:59 +00:00
|
|
|
(__mME)->session_context_will_deleted = 0; \
|
2017-09-05 03:37:27 +00:00
|
|
|
} while(0)
|
2019-05-18 15:24:15 +00:00
|
|
|
typedef struct mme_sess_s {
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_lnode_t node; /* A node of list_t */
|
2017-04-27 14:06:10 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
uint8_t pti; /* Procedure Trasaction Identity */
|
2017-09-07 12:28:12 +00:00
|
|
|
|
2017-12-14 12:42:19 +00:00
|
|
|
/* PDN Connectivity Request */
|
|
|
|
nas_request_type_t request_type;
|
|
|
|
|
2017-04-27 14:06:10 +00:00
|
|
|
/* mme_bearer_first(sess) : Default Bearer Context */
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_list_t bearer_list;
|
2017-04-10 12:05:28 +00:00
|
|
|
|
2017-04-28 03:39:14 +00:00
|
|
|
/* Related Context */
|
2017-04-28 07:11:45 +00:00
|
|
|
mme_ue_t *mme_ue;
|
2017-08-11 11:25:52 +00:00
|
|
|
|
2017-09-03 15:06:39 +00:00
|
|
|
#define MME_UE_HAVE_APN(__mME) \
|
|
|
|
((__mME) && (mme_sess_first(__mME)) && \
|
|
|
|
((mme_sess_first(__mME))->pdn))
|
2017-08-11 11:25:52 +00:00
|
|
|
pdn_t *pdn;
|
2017-08-27 07:30:10 +00:00
|
|
|
|
2017-09-06 11:29:55 +00:00
|
|
|
/* Save Protocol Configuration Options from UE */
|
|
|
|
struct {
|
2019-04-27 14:54:30 +00:00
|
|
|
uint8_t length;
|
|
|
|
uint8_t *buffer;
|
2017-09-06 11:29:55 +00:00
|
|
|
} ue_pco;
|
|
|
|
|
|
|
|
/* Save Protocol Configuration Options from PGW */
|
|
|
|
tlv_octet_t pgw_pco;
|
2017-04-27 14:06:10 +00:00
|
|
|
} mme_sess_t;
|
2017-04-06 11:10:00 +00:00
|
|
|
|
2018-02-03 13:55:05 +00:00
|
|
|
#define BEARER_CONTEXT_IS_ACTIVE(__mME) \
|
2018-02-03 09:29:32 +00:00
|
|
|
(mme_bearer_is_inactive(__mME) == 0)
|
2018-02-03 13:55:05 +00:00
|
|
|
#define CLEAR_BEARER_CONTEXT(__mME) \
|
2018-02-03 09:29:32 +00:00
|
|
|
mme_bearer_set_inactive(__mME)
|
|
|
|
|
2017-09-05 03:37:27 +00:00
|
|
|
#define MME_HAVE_ENB_S1U_PATH(__bEARER) \
|
2017-12-07 08:23:45 +00:00
|
|
|
((__bEARER) && ((__bEARER)->enb_s1u_teid))
|
2018-02-01 13:48:59 +00:00
|
|
|
#define CLEAR_ENB_S1U_PATH(__bEARER) \
|
|
|
|
do { \
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert((__bEARER)); \
|
2018-02-01 13:48:59 +00:00
|
|
|
(__bEARER)->enb_s1u_teid = 0; \
|
|
|
|
} while(0)
|
2017-09-13 07:22:39 +00:00
|
|
|
|
2017-09-13 14:27:02 +00:00
|
|
|
#define MME_HAVE_ENB_DL_INDIRECT_TUNNEL(__bEARER) \
|
2017-12-07 08:23:45 +00:00
|
|
|
((__bEARER) && ((__bEARER)->enb_dl_teid))
|
2017-09-13 14:27:02 +00:00
|
|
|
#define MME_HAVE_ENB_UL_INDIRECT_TUNNEL(__bEARER) \
|
2017-12-07 08:23:45 +00:00
|
|
|
((__bEARER) && ((__bEARER)->enb_ul_teid))
|
2017-09-13 14:27:02 +00:00
|
|
|
#define MME_HAVE_SGW_DL_INDIRECT_TUNNEL(__bEARER) \
|
2017-12-07 08:23:45 +00:00
|
|
|
((__bEARER) && ((__bEARER)->sgw_dl_teid))
|
2017-09-13 14:27:02 +00:00
|
|
|
#define MME_HAVE_SGW_UL_INDIRECT_TUNNEL(__bEARER) \
|
2017-12-07 08:23:45 +00:00
|
|
|
((__bEARER) && ((__bEARER)->sgw_ul_teid))
|
2017-09-14 05:18:47 +00:00
|
|
|
#define CLEAR_INDIRECT_TUNNEL(__bEARER) \
|
2017-09-13 07:22:39 +00:00
|
|
|
do { \
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_assert((__bEARER)); \
|
2017-09-14 05:18:47 +00:00
|
|
|
(__bEARER)->enb_dl_teid = 0; \
|
|
|
|
(__bEARER)->enb_ul_teid = 0; \
|
|
|
|
(__bEARER)->sgw_dl_teid = 0; \
|
|
|
|
(__bEARER)->sgw_ul_teid = 0; \
|
2017-09-13 07:22:39 +00:00
|
|
|
} while(0)
|
2019-05-18 15:24:15 +00:00
|
|
|
typedef struct mme_bearer_s {
|
2019-04-27 14:54:30 +00:00
|
|
|
ogs_lnode_t node; /* A node of list_t */
|
|
|
|
ogs_fsm_t sm; /* State Machine */
|
2017-04-11 14:55:21 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
uint8_t ebi; /* EPS Bearer ID */
|
2017-09-01 13:21:12 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
uint32_t enb_s1u_teid;
|
2017-12-07 08:23:45 +00:00
|
|
|
ip_t enb_s1u_ip;
|
2019-04-27 14:54:30 +00:00
|
|
|
uint32_t sgw_s1u_teid;
|
2017-12-07 08:40:15 +00:00
|
|
|
ip_t sgw_s1u_ip;
|
2017-04-11 10:14:18 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
uint32_t target_s1u_teid; /* Target S1U TEID from HO-Req-Ack */
|
2017-12-07 08:23:45 +00:00
|
|
|
ip_t target_s1u_ip; /* Target S1U ADDR from HO-Req-Ack */
|
2017-09-14 02:12:02 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
uint32_t enb_dl_teid;
|
2017-12-07 08:23:45 +00:00
|
|
|
ip_t enb_dl_ip;
|
2019-04-27 14:54:30 +00:00
|
|
|
uint32_t enb_ul_teid;
|
2017-12-07 08:23:45 +00:00
|
|
|
ip_t enb_ul_ip;
|
2017-09-12 14:07:55 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
uint32_t sgw_dl_teid;
|
2017-12-07 08:23:45 +00:00
|
|
|
ip_t sgw_dl_ip;
|
2019-04-27 14:54:30 +00:00
|
|
|
uint32_t sgw_ul_teid;
|
2017-12-07 08:23:45 +00:00
|
|
|
ip_t sgw_ul_ip;
|
2017-09-13 12:51:02 +00:00
|
|
|
|
2017-09-04 13:00:51 +00:00
|
|
|
qos_t qos;
|
2017-09-06 11:29:55 +00:00
|
|
|
tlv_octet_t tft; /* Saved TFT */
|
2017-09-04 13:00:51 +00:00
|
|
|
|
2017-04-28 03:39:14 +00:00
|
|
|
/* Related Context */
|
2017-04-28 07:11:45 +00:00
|
|
|
mme_ue_t *mme_ue;
|
2017-04-27 14:06:10 +00:00
|
|
|
mme_sess_t *sess;
|
2017-09-04 13:00:51 +00:00
|
|
|
gtp_xact_t *xact;
|
2017-04-13 10:15:53 +00:00
|
|
|
} mme_bearer_t;
|
2017-04-08 01:18:48 +00:00
|
|
|
|
2019-05-06 11:43:50 +00:00
|
|
|
void mme_context_init(void);
|
|
|
|
void mme_context_final(void);
|
2019-04-27 14:54:30 +00:00
|
|
|
mme_context_t *mme_self(void);
|
|
|
|
|
|
|
|
int mme_context_parse_config(void);
|
|
|
|
|
2019-06-05 12:13:18 +00:00
|
|
|
mme_sgw_t *mme_sgw_add(ogs_sockaddr_t *addr);
|
2019-05-30 10:58:27 +00:00
|
|
|
void mme_sgw_remove(mme_sgw_t *sgw);
|
2019-04-27 14:54:30 +00:00
|
|
|
void mme_sgw_remove_all();
|
|
|
|
|
2019-06-05 12:13:18 +00:00
|
|
|
mme_pgw_t *mme_pgw_add(ogs_sockaddr_t *addr);
|
2019-05-30 10:58:27 +00:00
|
|
|
void mme_pgw_remove(mme_pgw_t *pgw);
|
2019-04-27 14:54:30 +00:00
|
|
|
void mme_pgw_remove_all();
|
2019-05-18 15:24:15 +00:00
|
|
|
ogs_sockaddr_t *mme_pgw_addr_find_by_apn(
|
|
|
|
ogs_list_t *list, int family, char *apn);
|
2019-04-27 14:54:30 +00:00
|
|
|
|
2019-06-05 13:07:37 +00:00
|
|
|
mme_vlr_t *mme_vlr_add(ogs_sockaddr_t *addr);
|
2019-06-02 12:55:24 +00:00
|
|
|
void mme_vlr_remove(mme_vlr_t *vlr);
|
|
|
|
void mme_vlr_remove_all();
|
2019-06-17 01:36:44 +00:00
|
|
|
|
|
|
|
ogs_socknode_t *mme_vlr_new_node(mme_vlr_t *vlr);
|
|
|
|
void mme_vlr_free_node(mme_vlr_t *vlr);
|
|
|
|
|
2019-06-16 12:26:22 +00:00
|
|
|
mme_vlr_t *mme_vlr_find_by_addr(ogs_sockaddr_t *addr);
|
2019-06-19 09:04:57 +00:00
|
|
|
mme_vlr_t *mme_vlr_find_by_tai(tai_t *tai);
|
|
|
|
mme_vlr_t *mme_vlr_find_by_nas_lai(nas_lai_t *lai);
|
2019-06-02 12:55:24 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
mme_enb_t *mme_enb_add(ogs_sock_t *sock, ogs_sockaddr_t *addr);
|
|
|
|
int mme_enb_remove(mme_enb_t *enb);
|
|
|
|
int mme_enb_remove_all(void);
|
|
|
|
mme_enb_t *mme_enb_find_by_sock(ogs_sock_t *sock);
|
|
|
|
mme_enb_t *mme_enb_find_by_addr(ogs_sockaddr_t *addr);
|
|
|
|
mme_enb_t *mme_enb_find_by_enb_id(uint32_t enb_id);
|
|
|
|
int mme_enb_set_enb_id(mme_enb_t *enb, uint32_t enb_id);
|
|
|
|
ogs_hash_index_t *mme_enb_first();
|
|
|
|
ogs_hash_index_t *mme_enb_next(ogs_hash_index_t *hi);
|
|
|
|
mme_enb_t *mme_enb_this(ogs_hash_index_t *hi);
|
|
|
|
int mme_enb_sock_type(ogs_sock_t *sock);
|
|
|
|
|
|
|
|
enb_ue_t *enb_ue_add(mme_enb_t *enb);
|
|
|
|
unsigned int enb_ue_count();
|
|
|
|
int enb_ue_remove(enb_ue_t *enb_ue);
|
|
|
|
int enb_ue_remove_in_enb(mme_enb_t *enb);
|
|
|
|
int enb_ue_switch_to_enb(enb_ue_t *enb_ue, mme_enb_t *new_enb);
|
|
|
|
enb_ue_t *enb_ue_find_by_enb_ue_s1ap_id(
|
|
|
|
mme_enb_t *enb, uint32_t enb_ue_s1ap_id);
|
|
|
|
enb_ue_t *enb_ue_find_by_mme_ue_s1ap_id(uint32_t mme_ue_s1ap_id);
|
|
|
|
enb_ue_t *enb_ue_first_in_enb(mme_enb_t *enb);
|
|
|
|
enb_ue_t *enb_ue_next_in_enb(enb_ue_t *enb_ue);
|
|
|
|
|
|
|
|
mme_ue_t *mme_ue_add(enb_ue_t *enb_ue);
|
|
|
|
int mme_ue_remove(mme_ue_t *mme_ue);
|
|
|
|
int mme_ue_remove_all();
|
|
|
|
|
|
|
|
mme_ue_t *mme_ue_find_by_imsi(uint8_t *imsi, int imsi_len);
|
|
|
|
mme_ue_t *mme_ue_find_by_imsi_bcd(char *imsi_bcd);
|
2019-05-26 06:27:09 +00:00
|
|
|
mme_ue_t *mme_ue_find_by_guti(nas_guti_t *nas_guti);
|
2019-04-27 14:54:30 +00:00
|
|
|
mme_ue_t *mme_ue_find_by_teid(uint32_t teid);
|
|
|
|
|
|
|
|
mme_ue_t *mme_ue_find_by_message(nas_message_t *message);
|
|
|
|
int mme_ue_set_imsi(mme_ue_t *mme_ue, char *imsi_bcd);
|
|
|
|
|
|
|
|
int mme_ue_have_indirect_tunnel(mme_ue_t *mme_ue);
|
|
|
|
int mme_ue_clear_indirect_tunnel(mme_ue_t *mme_ue);
|
2018-03-07 13:32:31 +00:00
|
|
|
|
2018-01-29 05:48:51 +00:00
|
|
|
/*
|
|
|
|
* o RECV Initial UE-Message : S-TMSI
|
|
|
|
* o RECV Attach Request : IMSI, GUTI
|
|
|
|
* o RECV TAU Request : GUTI
|
|
|
|
* ### MME_UE_ASSOCIATE_ENB_UE() ###
|
|
|
|
* ### MME_UE_ECM_CONNECTED() ###
|
|
|
|
*
|
|
|
|
* o RECV Initial Context Setup Failure in EMM Registered State
|
|
|
|
* ### MME_UE_DEASSOCIATE_ENB_UE() ###
|
|
|
|
* ### ENB_UE_REMOVE() ###
|
2018-01-29 10:10:54 +00:00
|
|
|
* ### MME_UE_DEASSOCIATE() ###
|
2018-01-29 05:48:51 +00:00
|
|
|
*
|
|
|
|
* o SEND UE Context Release Command with NO_ACTION
|
|
|
|
* - RECV UE Context Release Complete
|
|
|
|
* ### ENB_UE_REMOVE() ###
|
2018-01-29 10:10:54 +00:00
|
|
|
* ### MME_UE_DEASSOCIATE() ###
|
2018-01-29 05:48:51 +00:00
|
|
|
*
|
|
|
|
* o SEND UE Context Release Command with REMOVE_MME_UE_CONTEXT
|
|
|
|
* - RECV UE Context Release Complete
|
|
|
|
* ### ENB_UE_REMOVE() ###
|
|
|
|
* ### MME_UE_REMOVE() ###
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* o RECV Handover Required
|
|
|
|
* ### SOURCE_UE_ASSOCIATE_TARGET_UE() ####
|
|
|
|
* - SEND Handover Request
|
|
|
|
*
|
|
|
|
* o RECV Handover Notify
|
|
|
|
* ### MME_UE_ASSOCIATE_ENB_UE(TARGET) ###
|
|
|
|
* ### MME_UE_ECM_CONNECTED(TARGET) ###
|
|
|
|
* - Modify Bearer Request/Response
|
|
|
|
* - UE Context Release Command/Complete
|
|
|
|
* ### SOURCE_UE_DEASSOCIATE_TARGET_UE() ####
|
|
|
|
* ### ENB_UE_REMOVE() ####
|
|
|
|
* - Delete Indirect Data Forwarding Tunnel Request/Response
|
|
|
|
*
|
|
|
|
* o RECV Handover Cancel
|
|
|
|
* - UE Context Release Command/Complete
|
|
|
|
* ### SOURCE_UE_DEASSOCIATE_TARGET_UE() ####
|
|
|
|
* ### ENB_UE_REMOVE() ####
|
|
|
|
* - Delete Indirect Data Forwarding Tunnel Request/Response
|
|
|
|
*
|
|
|
|
* o RECV Handover Failure
|
|
|
|
* - UE Context Release Command/Complete
|
|
|
|
* ### SOURCE_UE_DEASSOCIATE_TARGET_UE() ####
|
|
|
|
* ### ENB_UE_REMOVE() ####
|
|
|
|
* - Delete Indirect Data Forwarding Tunnel Request/Response
|
|
|
|
*/
|
2019-04-27 14:54:30 +00:00
|
|
|
int mme_ue_associate_enb_ue(
|
|
|
|
mme_ue_t *mme_ue, enb_ue_t *enb_ue);
|
|
|
|
int enb_ue_deassociate(enb_ue_t *enb_ue);
|
|
|
|
int mme_ue_deassociate(mme_ue_t *mme_ue);
|
|
|
|
int source_ue_associate_target_ue(
|
|
|
|
enb_ue_t *source_ue, enb_ue_t *target_ue);
|
|
|
|
int source_ue_deassociate_target_ue(enb_ue_t *enb_ue);
|
|
|
|
|
|
|
|
ogs_hash_index_t *mme_ue_first();
|
|
|
|
ogs_hash_index_t *mme_ue_next(ogs_hash_index_t *hi);
|
|
|
|
mme_ue_t *mme_ue_this(ogs_hash_index_t *hi);
|
|
|
|
|
|
|
|
mme_sess_t *mme_sess_add(mme_ue_t *mme_ue, uint8_t pti);
|
|
|
|
int mme_sess_remove(mme_sess_t *sess);
|
|
|
|
int mme_sess_remove_all(mme_ue_t *mme_ue);
|
|
|
|
mme_sess_t *mme_sess_find_by_pti(mme_ue_t *mme_ue, uint8_t pti);
|
|
|
|
mme_sess_t *mme_sess_find_by_ebi(mme_ue_t *mme_ue, uint8_t ebi);
|
|
|
|
mme_sess_t *mme_sess_find_by_apn(mme_ue_t *mme_ue, char *apn);
|
|
|
|
mme_sess_t *mme_sess_first(mme_ue_t *mme_ue);
|
|
|
|
mme_sess_t *mme_sess_next(mme_sess_t *sess);
|
|
|
|
unsigned int mme_sess_count(mme_ue_t *mme_ue);
|
|
|
|
|
|
|
|
mme_bearer_t *mme_bearer_add(mme_sess_t *sess);
|
|
|
|
int mme_bearer_remove(mme_bearer_t *bearer);
|
|
|
|
int mme_bearer_remove_all(mme_sess_t *sess);
|
|
|
|
mme_bearer_t *mme_bearer_find_by_sess_ebi(mme_sess_t *sess, uint8_t ebi);
|
|
|
|
mme_bearer_t *mme_bearer_find_by_ue_ebi(mme_ue_t *mme_ue, uint8_t ebi);
|
|
|
|
mme_bearer_t *mme_bearer_find_or_add_by_message(
|
2017-09-21 07:03:42 +00:00
|
|
|
mme_ue_t *mme_ue, nas_message_t *message);
|
2019-04-27 14:54:30 +00:00
|
|
|
mme_bearer_t *mme_default_bearer_in_sess(mme_sess_t *sess);
|
|
|
|
mme_bearer_t *mme_linked_bearer(mme_bearer_t *bearer);
|
|
|
|
mme_bearer_t *mme_bearer_first(mme_sess_t *sess);
|
|
|
|
mme_bearer_t *mme_bearer_next(mme_bearer_t *bearer);
|
2017-04-08 01:18:48 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
int mme_bearer_is_inactive(mme_ue_t *mme_ue);
|
|
|
|
int mme_bearer_set_inactive(mme_ue_t *mme_ue);
|
2018-02-03 09:29:32 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
int mme_pdn_remove_all(mme_ue_t *mme_ue);
|
|
|
|
pdn_t *mme_pdn_find_by_apn(mme_ue_t *mme_ue, char *apn);
|
|
|
|
pdn_t *mme_default_pdn(mme_ue_t *mme_ue);
|
2017-04-12 04:45:57 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
int mme_find_served_tai(tai_t *tai);
|
2017-04-28 04:43:42 +00:00
|
|
|
|
2019-04-27 14:54:30 +00:00
|
|
|
int mme_m_tmsi_pool_generate();
|
|
|
|
mme_m_tmsi_t *mme_m_tmsi_alloc();
|
|
|
|
int mme_m_tmsi_free(mme_m_tmsi_t *tmsi);
|
2018-01-21 06:44:30 +00:00
|
|
|
|
2017-02-06 06:30:12 +00:00
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif /* __cplusplus */
|
|
|
|
|
2017-04-06 11:10:00 +00:00
|
|
|
#endif /* __MME_CONTEXT__ */
|