OK for start of MME_GW and HSS on same host
git-svn-id: http://svn.eurecom.fr/openair4G/trunk@7110 818b1a75-f10b-46b9-bf7c-635c3b92a50f
This commit is contained in:
@@ -349,6 +349,10 @@ _gtpuah_tg4_add(struct sk_buff *old_skb_pP, const struct xt_action_param *par_pP
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
/*pr_info("GTPUAH: PACKET -> NF_HOOK NF_INET_POST_ROUTING/%s encapsulated src: %u.%u.%u.%u dst: %u.%u.%u.%u\n",
|
||||||
|
gtpuah_tg_reg[0].table,
|
||||||
|
NIPADDR(old_iph_p->saddr),
|
||||||
|
NIPADDR(old_iph_p->daddr));*/
|
||||||
|
|
||||||
|
|
||||||
rt = ip_route_output_key(&init_net, &fl.u.ip4);
|
rt = ip_route_output_key(&init_net, &fl.u.ip4);
|
||||||
|
|||||||
@@ -68,6 +68,7 @@ extern boolean_t pdcp_data_req(
|
|||||||
unsigned char *const sdu_buffer_pP,
|
unsigned char *const sdu_buffer_pP,
|
||||||
const pdcp_transmission_mode_t modeP);
|
const pdcp_transmission_mode_t modeP);
|
||||||
|
|
||||||
|
extern unsigned char NB_eNB_INST;
|
||||||
|
|
||||||
static int
|
static int
|
||||||
gtpv1u_eNB_send_init_udp(
|
gtpv1u_eNB_send_init_udp(
|
||||||
@@ -132,19 +133,23 @@ gtpv1u_initial_req(
|
|||||||
|
|
||||||
int
|
int
|
||||||
gtpv1u_new_data_req(
|
gtpv1u_new_data_req(
|
||||||
uint8_t enb_idP,
|
uint8_t enb_module_idP,
|
||||||
uint8_t ue_idP,
|
rnti_t ue_rntiP,
|
||||||
uint8_t rab_idP,
|
uint8_t rab_idP,
|
||||||
uint8_t *buffer_pP,
|
uint8_t *buffer_pP,
|
||||||
uint32_t buf_lenP,
|
uint32_t buf_lenP,
|
||||||
uint32_t buf_offsetP);
|
uint32_t buf_offsetP
|
||||||
|
);
|
||||||
|
|
||||||
static int
|
static int
|
||||||
gtpv1u_create_s1u_tunnel(
|
gtpv1u_create_s1u_tunnel(
|
||||||
gtpv1u_enb_create_tunnel_req_t *create_tunnel_req_pP);
|
const instance_t instanceP,
|
||||||
|
const gtpv1u_enb_create_tunnel_req_t * const create_tunnel_req_pP);
|
||||||
|
|
||||||
static int
|
static int
|
||||||
gtpv1u_delete_s1u_tunnel(gtpv1u_enb_delete_tunnel_req_t *req_pP);
|
gtpv1u_delete_s1u_tunnel(
|
||||||
|
const instance_t instanceP,
|
||||||
|
const gtpv1u_enb_delete_tunnel_req_t * const req_pP);
|
||||||
|
|
||||||
static int
|
static int
|
||||||
gtpv1u_eNB_init(void);
|
gtpv1u_eNB_init(void);
|
||||||
@@ -322,17 +327,14 @@ NwGtpv1uRcT gtpv1u_eNB_process_stack_req(
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#warning "LG eps bearer mapping to DRB id to do (offset -4)"
|
#warning "LG eps bearer mapping to DRB id to do (offset -4)"
|
||||||
ctxt.enb_module_id = gtpv1u_teid_data_p->enb_id;
|
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, gtpv1u_teid_data_p->enb_id, ENB_FLAG_YES, gtpv1u_teid_data_p->ue_id, 0, 0);
|
||||||
ctxt.ue_module_id = gtpv1u_teid_data_p->ue_id;
|
|
||||||
ctxt.frame = 0;
|
|
||||||
ctxt.enb_flag = ENB_FLAG_YES;
|
|
||||||
|
|
||||||
result = pdcp_data_req(
|
result = pdcp_data_req(
|
||||||
&ctxt,
|
&ctxt,
|
||||||
SRB_FLAG_NO,
|
SRB_FLAG_NO,
|
||||||
(gtpv1u_teid_data_p->eps_bearer_id) ? gtpv1u_teid_data_p->eps_bearer_id - 4: 5-4,
|
(gtpv1u_teid_data_p->eps_bearer_id) ? gtpv1u_teid_data_p->eps_bearer_id - 4: 5-4,
|
||||||
0, // mui
|
0, // mui
|
||||||
FALSE, // confirm
|
SDU_CONFIRM_NO, // confirm
|
||||||
buffer_len,
|
buffer_len,
|
||||||
buffer,
|
buffer,
|
||||||
PDCP_TRANSMISSION_MODE_DATA);
|
PDCP_TRANSMISSION_MODE_DATA);
|
||||||
@@ -551,8 +553,8 @@ gtpv1u_initial_req(
|
|||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
int
|
int
|
||||||
gtpv1u_new_data_req(
|
gtpv1u_new_data_req(
|
||||||
uint8_t enb_idP,
|
uint8_t enb_module_idP,
|
||||||
uint8_t ue_idP,
|
rnti_t ue_rntiP,
|
||||||
uint8_t rab_idP,
|
uint8_t rab_idP,
|
||||||
uint8_t *buffer_pP,
|
uint8_t *buffer_pP,
|
||||||
uint32_t buf_lenP,
|
uint32_t buf_lenP,
|
||||||
@@ -569,18 +571,18 @@ gtpv1u_new_data_req(
|
|||||||
gtpv1u_data_t *gtpv1u_data_p = NULL;
|
gtpv1u_data_t *gtpv1u_data_p = NULL;
|
||||||
|
|
||||||
memset(&ue, 0, sizeof(struct gtpv1u_ue_data_s));
|
memset(&ue, 0, sizeof(struct gtpv1u_ue_data_s));
|
||||||
ue.ue_id = ue_idP;
|
ue.ue_id = ue_rntiP;
|
||||||
|
|
||||||
AssertFatal(enb_idP >=0, "Bad parameter enb module id %u\n", enb_idP);
|
AssertFatal(enb_module_idP >=0, "Bad parameter enb module id %u\n", enb_module_idP);
|
||||||
AssertFatal((rab_idP - GTPV1U_BEARER_OFFSET)< GTPV1U_MAX_BEARERS_ID, "Bad parameter rab id %u\n", rab_idP);
|
AssertFatal((rab_idP - GTPV1U_BEARER_OFFSET)< GTPV1U_MAX_BEARERS_ID, "Bad parameter rab id %u\n", rab_idP);
|
||||||
AssertFatal((rab_idP - GTPV1U_BEARER_OFFSET) >= 0 , "Bad parameter rab id %u\n", rab_idP);
|
AssertFatal((rab_idP - GTPV1U_BEARER_OFFSET) >= 0 , "Bad parameter rab id %u\n", rab_idP);
|
||||||
|
|
||||||
gtpv1u_data_p = >pv1u_data_g;
|
gtpv1u_data_p = >pv1u_data_g;
|
||||||
/* Check that UE context is present in ue map. */
|
/* Check that UE context is present in ue map. */
|
||||||
hash_rc = hashtable_get(gtpv1u_data_p->ue_mapping, (uint64_t)ue_idP, (void**)&ue_inst_p);
|
hash_rc = hashtable_get(gtpv1u_data_p->ue_mapping, (uint64_t)ue_rntiP, (void**)&ue_inst_p);
|
||||||
|
|
||||||
if (hash_rc == HASH_TABLE_KEY_NOT_EXISTS ) {
|
if (hash_rc == HASH_TABLE_KEY_NOT_EXISTS ) {
|
||||||
LOG_E(GTPU, "[UE %d] Trying to send data on non-existing UE context\n", ue_idP);
|
LOG_E(GTPU, "[UE %d] Trying to send data on non-existing UE context\n", ue_rntiP);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -643,7 +645,8 @@ gtpv1u_new_data_req(
|
|||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
static int
|
static int
|
||||||
gtpv1u_create_s1u_tunnel(
|
gtpv1u_create_s1u_tunnel(
|
||||||
gtpv1u_enb_create_tunnel_req_t *create_tunnel_req_pP)
|
const instance_t instanceP,
|
||||||
|
const gtpv1u_enb_create_tunnel_req_t * const create_tunnel_req_pP)
|
||||||
{
|
{
|
||||||
/* Create a new nw-gtpv1-u stack req using API */
|
/* Create a new nw-gtpv1-u stack req using API */
|
||||||
NwGtpv1uUlpApiT stack_req;
|
NwGtpv1uUlpApiT stack_req;
|
||||||
@@ -662,15 +665,15 @@ gtpv1u_create_s1u_tunnel(
|
|||||||
int addrs_length_in_bytes= 0;
|
int addrs_length_in_bytes= 0;
|
||||||
|
|
||||||
message_p = itti_alloc_new_message(TASK_GTPV1_U, GTPV1U_ENB_CREATE_TUNNEL_RESP);
|
message_p = itti_alloc_new_message(TASK_GTPV1_U, GTPV1U_ENB_CREATE_TUNNEL_RESP);
|
||||||
GTPV1U_ENB_CREATE_TUNNEL_RESP(message_p).ue_index = create_tunnel_req_pP->ue_index;
|
GTPV1U_ENB_CREATE_TUNNEL_RESP(message_p).rnti = create_tunnel_req_pP->rnti;
|
||||||
GTPV1U_ENB_CREATE_TUNNEL_RESP(message_p).status = 0;
|
GTPV1U_ENB_CREATE_TUNNEL_RESP(message_p).status = 0;
|
||||||
GTPV1U_ENB_CREATE_TUNNEL_RESP(message_p).num_tunnels = 0;
|
GTPV1U_ENB_CREATE_TUNNEL_RESP(message_p).num_tunnels = 0;
|
||||||
|
|
||||||
for (i = 0; i < create_tunnel_req_pP->num_tunnels; i++) {
|
for (i = 0; i < create_tunnel_req_pP->num_tunnels; i++) {
|
||||||
ip_offset = 0;
|
ip_offset = 0;
|
||||||
eps_bearer_id = create_tunnel_req_pP->eps_bearer_id[i];
|
eps_bearer_id = create_tunnel_req_pP->eps_bearer_id[i];
|
||||||
LOG_D(GTPU, "Rx GTPV1U_ENB_CREATE_TUNNEL_REQ ue_index %u eps bearer id %u\n",
|
LOG_D(GTPU, "Rx GTPV1U_ENB_CREATE_TUNNEL_REQ ue rnti %x eps bearer id %u\n",
|
||||||
create_tunnel_req_pP->ue_index, eps_bearer_id);
|
create_tunnel_req_pP->rnti, eps_bearer_id);
|
||||||
memset(&stack_req, 0, sizeof(NwGtpv1uUlpApiT));
|
memset(&stack_req, 0, sizeof(NwGtpv1uUlpApiT));
|
||||||
|
|
||||||
stack_req.apiType = NW_GTPV1U_ULP_API_CREATE_TUNNEL_ENDPOINT;
|
stack_req.apiType = NW_GTPV1U_ULP_API_CREATE_TUNNEL_ENDPOINT;
|
||||||
@@ -689,17 +692,17 @@ gtpv1u_create_s1u_tunnel(
|
|||||||
//-----------------------
|
//-----------------------
|
||||||
// PDCP->GTPV1U mapping
|
// PDCP->GTPV1U mapping
|
||||||
//-----------------------
|
//-----------------------
|
||||||
hash_rc = hashtable_get(gtpv1u_data_g.ue_mapping, create_tunnel_req_pP->ue_index, (void **)>pv1u_ue_data_p);
|
hash_rc = hashtable_get(gtpv1u_data_g.ue_mapping, create_tunnel_req_pP->rnti, (void **)>pv1u_ue_data_p);
|
||||||
|
|
||||||
if ((hash_rc == HASH_TABLE_KEY_NOT_EXISTS) || (hash_rc == HASH_TABLE_OK)) {
|
if ((hash_rc == HASH_TABLE_KEY_NOT_EXISTS) || (hash_rc == HASH_TABLE_OK)) {
|
||||||
|
|
||||||
if (hash_rc == HASH_TABLE_KEY_NOT_EXISTS) {
|
if (hash_rc == HASH_TABLE_KEY_NOT_EXISTS) {
|
||||||
gtpv1u_ue_data_p = calloc (1, sizeof(gtpv1u_ue_data_t));
|
gtpv1u_ue_data_p = calloc (1, sizeof(gtpv1u_ue_data_t));
|
||||||
hash_rc = hashtable_insert(gtpv1u_data_g.ue_mapping, create_tunnel_req_pP->ue_index, gtpv1u_ue_data_p);
|
hash_rc = hashtable_insert(gtpv1u_data_g.ue_mapping, create_tunnel_req_pP->rnti, gtpv1u_ue_data_p);
|
||||||
AssertFatal(hash_rc == HASH_TABLE_OK, "Error inserting ue_mapping in GTPV1U hashtable");
|
AssertFatal(hash_rc == HASH_TABLE_OK, "Error inserting ue_mapping in GTPV1U hashtable");
|
||||||
}
|
}
|
||||||
|
|
||||||
gtpv1u_ue_data_p->ue_id = create_tunnel_req_pP->ue_index;
|
gtpv1u_ue_data_p->ue_id = create_tunnel_req_pP->rnti;
|
||||||
gtpv1u_ue_data_p->instance_id = 0; // TO DO
|
gtpv1u_ue_data_p->instance_id = 0; // TO DO
|
||||||
memcpy(>PV1U_ENB_CREATE_TUNNEL_RESP(message_p).enb_addr.buffer,
|
memcpy(>PV1U_ENB_CREATE_TUNNEL_RESP(message_p).enb_addr.buffer,
|
||||||
>pv1u_data_g.enb_ip_address_for_S1u_S12_S4_up,
|
>pv1u_data_g.enb_ip_address_for_S1u_S12_S4_up,
|
||||||
@@ -748,7 +751,7 @@ gtpv1u_create_s1u_tunnel(
|
|||||||
if (hash_rc == HASH_TABLE_KEY_NOT_EXISTS) {
|
if (hash_rc == HASH_TABLE_KEY_NOT_EXISTS) {
|
||||||
gtpv1u_teid_data_p = calloc (1, sizeof(gtpv1u_teid_data_t));
|
gtpv1u_teid_data_p = calloc (1, sizeof(gtpv1u_teid_data_t));
|
||||||
gtpv1u_teid_data_p->enb_id = 0; // TO DO
|
gtpv1u_teid_data_p->enb_id = 0; // TO DO
|
||||||
gtpv1u_teid_data_p->ue_id = create_tunnel_req_pP->ue_index;
|
gtpv1u_teid_data_p->ue_id = create_tunnel_req_pP->rnti;
|
||||||
gtpv1u_teid_data_p->eps_bearer_id = eps_bearer_id;
|
gtpv1u_teid_data_p->eps_bearer_id = eps_bearer_id;
|
||||||
hash_rc = hashtable_insert(gtpv1u_data_g.teid_mapping, s1u_teid, gtpv1u_teid_data_p);
|
hash_rc = hashtable_insert(gtpv1u_data_g.teid_mapping, s1u_teid, gtpv1u_teid_data_p);
|
||||||
AssertFatal(hash_rc == HASH_TABLE_OK, "Error inserting teid mapping in GTPV1U hashtable");
|
AssertFatal(hash_rc == HASH_TABLE_OK, "Error inserting teid mapping in GTPV1U hashtable");
|
||||||
@@ -758,16 +761,18 @@ gtpv1u_create_s1u_tunnel(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_D(GTPU, "Tx GTPV1U_ENB_CREATE_TUNNEL_RESP ue_index %u status %d\n",
|
LOG_D(GTPU, "Tx GTPV1U_ENB_CREATE_TUNNEL_RESP ue rnti %x status %d\n",
|
||||||
create_tunnel_req_pP->ue_index,
|
create_tunnel_req_pP->rnti,
|
||||||
GTPV1U_ENB_CREATE_TUNNEL_RESP(message_p).status);
|
GTPV1U_ENB_CREATE_TUNNEL_RESP(message_p).status);
|
||||||
return itti_send_msg_to_task(TASK_RRC_ENB, INSTANCE_DEFAULT, message_p);
|
return itti_send_msg_to_task(TASK_RRC_ENB, instanceP, message_p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
static int gtpv1u_delete_s1u_tunnel(gtpv1u_enb_delete_tunnel_req_t *req_pP)
|
static int gtpv1u_delete_s1u_tunnel(
|
||||||
|
const instance_t instanceP,
|
||||||
|
const gtpv1u_enb_delete_tunnel_req_t * const req_pP)
|
||||||
{
|
{
|
||||||
NwGtpv1uUlpApiT stack_req;
|
NwGtpv1uUlpApiT stack_req;
|
||||||
NwGtpv1uRcT rc = NW_GTPV1U_FAILURE;
|
NwGtpv1uRcT rc = NW_GTPV1U_FAILURE;
|
||||||
@@ -779,18 +784,18 @@ static int gtpv1u_delete_s1u_tunnel(gtpv1u_enb_delete_tunnel_req_t *req_pP)
|
|||||||
|
|
||||||
message_p = itti_alloc_new_message(TASK_GTPV1_U, GTPV1U_ENB_DELETE_TUNNEL_RESP);
|
message_p = itti_alloc_new_message(TASK_GTPV1_U, GTPV1U_ENB_DELETE_TUNNEL_RESP);
|
||||||
|
|
||||||
GTPV1U_ENB_DELETE_TUNNEL_RESP(message_p).ue_index = req_pP->ue_index;
|
GTPV1U_ENB_DELETE_TUNNEL_RESP(message_p).rnti = req_pP->rnti;
|
||||||
GTPV1U_ENB_DELETE_TUNNEL_RESP(message_p).status = 0;
|
GTPV1U_ENB_DELETE_TUNNEL_RESP(message_p).status = 0;
|
||||||
|
|
||||||
|
|
||||||
hash_rc = hashtable_get(gtpv1u_data_g.ue_mapping, req_pP->ue_index, (void**)>pv1u_ue_data_p);
|
hash_rc = hashtable_get(gtpv1u_data_g.ue_mapping, req_pP->rnti, (void**)>pv1u_ue_data_p);
|
||||||
|
|
||||||
if (hash_rc == HASH_TABLE_OK) {
|
if (hash_rc == HASH_TABLE_OK) {
|
||||||
|
|
||||||
for (erab_index = 0; erab_index < req_pP->num_erab; erab_index++) {
|
for (erab_index = 0; erab_index < req_pP->num_erab; erab_index++) {
|
||||||
teid_eNB = gtpv1u_ue_data_p->bearers[req_pP->eps_bearer_id[erab_index] - GTPV1U_BEARER_OFFSET].teid_eNB;
|
teid_eNB = gtpv1u_ue_data_p->bearers[req_pP->eps_bearer_id[erab_index] - GTPV1U_BEARER_OFFSET].teid_eNB;
|
||||||
LOG_D(GTPU, "Rx GTPV1U_ENB_DELETE_TUNNEL user index %u eNB S1U teid %u eps bearer id %u\n",
|
LOG_D(GTPU, "Rx GTPV1U_ENB_DELETE_TUNNEL user rnti %x eNB S1U teid %u eps bearer id %u\n",
|
||||||
req_pP->ue_index, teid_eNB, req_pP->eps_bearer_id[erab_index]);
|
req_pP->rnti, teid_eNB, req_pP->eps_bearer_id[erab_index]);
|
||||||
|
|
||||||
{
|
{
|
||||||
memset(&stack_req, 0, sizeof(NwGtpv1uUlpApiT));
|
memset(&stack_req, 0, sizeof(NwGtpv1uUlpApiT));
|
||||||
@@ -821,8 +826,8 @@ static int gtpv1u_delete_s1u_tunnel(gtpv1u_enb_delete_tunnel_req_t *req_pP)
|
|||||||
gtpv1u_ue_data_p->num_bearers -= 1;
|
gtpv1u_ue_data_p->num_bearers -= 1;
|
||||||
|
|
||||||
if (gtpv1u_ue_data_p->num_bearers == 0) {
|
if (gtpv1u_ue_data_p->num_bearers == 0) {
|
||||||
hash_rc = hashtable_remove(gtpv1u_data_g.ue_mapping, req_pP->ue_index);
|
hash_rc = hashtable_remove(gtpv1u_data_g.ue_mapping, req_pP->rnti);
|
||||||
LOG_D(GTPU, "Removed user index %u,no more bearers configured\n", req_pP->ue_index);
|
LOG_D(GTPU, "Removed user rnti %x,no more bearers configured\n", req_pP->rnti);
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------
|
//-----------------------
|
||||||
@@ -831,17 +836,17 @@ static int gtpv1u_delete_s1u_tunnel(gtpv1u_enb_delete_tunnel_req_t *req_pP)
|
|||||||
hash_rc = hashtable_remove(gtpv1u_data_g.teid_mapping, teid_eNB);
|
hash_rc = hashtable_remove(gtpv1u_data_g.teid_mapping, teid_eNB);
|
||||||
|
|
||||||
if (hash_rc != HASH_TABLE_OK) {
|
if (hash_rc != HASH_TABLE_OK) {
|
||||||
LOG_D(GTPU, "Removed user index %u , enb S1U teid %u not found\n", req_pP->ue_index, teid_eNB);
|
LOG_D(GTPU, "Removed user rnti %x , enb S1U teid %u not found\n", req_pP->rnti, teid_eNB);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}// else silently do nothing
|
}// else silently do nothing
|
||||||
|
|
||||||
|
|
||||||
LOG_D(GTPU, "Tx GTPV1U_ENB_DELETE_TUNNEL_RESP user index %u eNB S1U teid %u status %u\n",
|
LOG_D(GTPU, "Tx GTPV1U_ENB_DELETE_TUNNEL_RESP user rnti %x eNB S1U teid %u status %u\n",
|
||||||
GTPV1U_ENB_DELETE_TUNNEL_RESP(message_p).ue_index,
|
GTPV1U_ENB_DELETE_TUNNEL_RESP(message_p).rnti,
|
||||||
GTPV1U_ENB_DELETE_TUNNEL_RESP(message_p).enb_S1u_teid,
|
GTPV1U_ENB_DELETE_TUNNEL_RESP(message_p).enb_S1u_teid,
|
||||||
GTPV1U_ENB_DELETE_TUNNEL_RESP(message_p).status);
|
GTPV1U_ENB_DELETE_TUNNEL_RESP(message_p).status);
|
||||||
return itti_send_msg_to_task(TASK_RRC_ENB, INSTANCE_DEFAULT, message_p);
|
return itti_send_msg_to_task(TASK_RRC_ENB, instanceP, message_p);
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@@ -947,7 +952,10 @@ static int gtpv1u_eNB_init(void)
|
|||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void *gtpv1u_eNB_task(void *args)
|
void *gtpv1u_eNB_task(void *args)
|
||||||
{
|
{
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
instance_t instance;
|
||||||
|
const char *msg_name_p;
|
||||||
|
|
||||||
rc = gtpv1u_eNB_init();
|
rc = gtpv1u_eNB_init();
|
||||||
AssertFatal(rc == 0, "gtpv1u_eNB_init Failed");
|
AssertFatal(rc == 0, "gtpv1u_eNB_init Failed");
|
||||||
itti_mark_task_ready(TASK_GTPV1_U);
|
itti_mark_task_ready(TASK_GTPV1_U);
|
||||||
@@ -962,14 +970,17 @@ void *gtpv1u_eNB_task(void *args)
|
|||||||
vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_GTPV1U_ENB_TASK, VCD_FUNCTION_IN);
|
vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_GTPV1U_ENB_TASK, VCD_FUNCTION_IN);
|
||||||
DevAssert(received_message_p != NULL);
|
DevAssert(received_message_p != NULL);
|
||||||
|
|
||||||
|
instance = ITTI_MSG_INSTANCE(received_message_p);
|
||||||
|
msg_name_p = ITTI_MSG_NAME(received_message_p);
|
||||||
|
|
||||||
switch (ITTI_MSG_ID(received_message_p)) {
|
switch (ITTI_MSG_ID(received_message_p)) {
|
||||||
case GTPV1U_ENB_CREATE_TUNNEL_REQ: {
|
case GTPV1U_ENB_CREATE_TUNNEL_REQ: {
|
||||||
gtpv1u_create_s1u_tunnel(&received_message_p->ittiMsg.Gtpv1uCreateTunnelReq);
|
gtpv1u_create_s1u_tunnel(instance, &received_message_p->ittiMsg.Gtpv1uCreateTunnelReq);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GTPV1U_ENB_DELETE_TUNNEL_REQ: {
|
case GTPV1U_ENB_DELETE_TUNNEL_REQ: {
|
||||||
gtpv1u_delete_s1u_tunnel(&received_message_p->ittiMsg.Gtpv1uDeleteTunnelReq);
|
gtpv1u_delete_s1u_tunnel(instance, &received_message_p->ittiMsg.Gtpv1uDeleteTunnelReq);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -989,7 +1000,7 @@ void *gtpv1u_eNB_task(void *args)
|
|||||||
// DATA TO BE SENT TO UDP
|
// DATA TO BE SENT TO UDP
|
||||||
case GTPV1U_ENB_TUNNEL_DATA_REQ: {
|
case GTPV1U_ENB_TUNNEL_DATA_REQ: {
|
||||||
gtpv1u_enb_tunnel_data_req_t *data_req_p = NULL;
|
gtpv1u_enb_tunnel_data_req_t *data_req_p = NULL;
|
||||||
NwGtpv1uUlpApiT stack_req;
|
NwGtpv1uUlpApiT stack_req;
|
||||||
NwGtpv1uRcT rc = NW_GTPV1U_FAILURE;
|
NwGtpv1uRcT rc = NW_GTPV1U_FAILURE;
|
||||||
hashtable_rc_t hash_rc = HASH_TABLE_KEY_NOT_EXISTS;
|
hashtable_rc_t hash_rc = HASH_TABLE_KEY_NOT_EXISTS;
|
||||||
gtpv1u_ue_data_t *gtpv1u_ue_data_p = NULL;
|
gtpv1u_ue_data_t *gtpv1u_ue_data_p = NULL;
|
||||||
@@ -1005,10 +1016,10 @@ void *gtpv1u_eNB_task(void *args)
|
|||||||
#endif
|
#endif
|
||||||
memset(&stack_req, 0, sizeof(NwGtpv1uUlpApiT));
|
memset(&stack_req, 0, sizeof(NwGtpv1uUlpApiT));
|
||||||
|
|
||||||
hash_rc = hashtable_get(gtpv1u_data_g.ue_mapping, (uint64_t)data_req_p->ue_index, (void**)>pv1u_ue_data_p);
|
hash_rc = hashtable_get(gtpv1u_data_g.ue_mapping, (uint64_t)data_req_p->rnti, (void**)>pv1u_ue_data_p);
|
||||||
|
|
||||||
if (hash_rc == HASH_TABLE_KEY_NOT_EXISTS) {
|
if (hash_rc == HASH_TABLE_KEY_NOT_EXISTS) {
|
||||||
LOG_E(GTPU, "nwGtpv1uProcessUlpReq failed: while getting ue_index %u in hashtable ue_mapping\n", data_req_p->ue_index);
|
LOG_E(GTPU, "nwGtpv1uProcessUlpReq failed: while getting ue rnti %x in hashtable ue_mapping\n", data_req_p->rnti);
|
||||||
} else {
|
} else {
|
||||||
if ((data_req_p->rab_id >= GTPV1U_BEARER_OFFSET) && (data_req_p->rab_id <= max_val_DRB_Identity)) {
|
if ((data_req_p->rab_id >= GTPV1U_BEARER_OFFSET) && (data_req_p->rab_id <= max_val_DRB_Identity)) {
|
||||||
enb_s1u_teid = gtpv1u_ue_data_p->bearers[data_req_p->rab_id - GTPV1U_BEARER_OFFSET].teid_eNB;
|
enb_s1u_teid = gtpv1u_ue_data_p->bearers[data_req_p->rab_id - GTPV1U_BEARER_OFFSET].teid_eNB;
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ typedef enum {
|
|||||||
typedef struct gtpv1u_teid_data_s {
|
typedef struct gtpv1u_teid_data_s {
|
||||||
/* UE identifier for oaisim stack */
|
/* UE identifier for oaisim stack */
|
||||||
module_id_t enb_id;
|
module_id_t enb_id;
|
||||||
module_id_t ue_id;
|
rnti_t ue_id;
|
||||||
ebi_t eps_bearer_id;
|
ebi_t eps_bearer_id;
|
||||||
} gtpv1u_teid_data_t;
|
} gtpv1u_teid_data_t;
|
||||||
|
|
||||||
@@ -76,7 +76,7 @@ typedef struct gtpv1u_bearer_s {
|
|||||||
|
|
||||||
typedef struct gtpv1u_ue_data_s {
|
typedef struct gtpv1u_ue_data_s {
|
||||||
/* UE identifier for oaisim stack */
|
/* UE identifier for oaisim stack */
|
||||||
module_id_t ue_id;
|
rnti_t ue_id;
|
||||||
|
|
||||||
/* Unique identifier used between PDCP and GTP-U to distinguish UEs */
|
/* Unique identifier used between PDCP and GTP-U to distinguish UEs */
|
||||||
uint32_t instance_id;
|
uint32_t instance_id;
|
||||||
@@ -121,12 +121,13 @@ typedef struct gtpv1u_data_s {
|
|||||||
|
|
||||||
int
|
int
|
||||||
gtpv1u_new_data_req(
|
gtpv1u_new_data_req(
|
||||||
uint8_t enb_id,
|
uint8_t enb_module_idP,
|
||||||
uint8_t ue_id,
|
rnti_t ue_rntiP,
|
||||||
uint8_t rab_id,
|
uint8_t rab_idP,
|
||||||
uint8_t *buffer,
|
uint8_t *buffer_pP,
|
||||||
uint32_t buf_len,
|
uint32_t buf_lenP,
|
||||||
uint32_t buf_offset);
|
uint32_t buf_offsetP
|
||||||
|
);
|
||||||
|
|
||||||
int
|
int
|
||||||
gtpv1u_initial_req(
|
gtpv1u_initial_req(
|
||||||
|
|||||||
@@ -54,7 +54,9 @@
|
|||||||
//static NwGtpv1uStackHandleT gtpv1u_stack = 0;
|
//static NwGtpv1uStackHandleT gtpv1u_stack = 0;
|
||||||
static gtpv1u_data_t gtpv1u_sgw_data;
|
static gtpv1u_data_t gtpv1u_sgw_data;
|
||||||
|
|
||||||
|
#if !defined(ENABLE_USE_GTPU_IN_KERNEL)
|
||||||
static int gtpv1u_send_init_udp(uint16_t port_number);
|
static int gtpv1u_send_init_udp(uint16_t port_number);
|
||||||
|
#endif
|
||||||
static int gtpv1u_create_s1u_tunnel(Gtpv1uCreateTunnelReq *create_tunnel_reqP);
|
static int gtpv1u_create_s1u_tunnel(Gtpv1uCreateTunnelReq *create_tunnel_reqP);
|
||||||
static int gtpv1u_delete_s1u_tunnel(Teid_t context_teidP, Teid_t S1U_teidP);
|
static int gtpv1u_delete_s1u_tunnel(Teid_t context_teidP, Teid_t S1U_teidP);
|
||||||
static int gtpv1u_update_s1u_tunnel(Gtpv1uUpdateTunnelReq *reqP);
|
static int gtpv1u_update_s1u_tunnel(Gtpv1uUpdateTunnelReq *reqP);
|
||||||
@@ -147,6 +149,7 @@ void gtpu_print_hex_octets(unsigned char* dataP, unsigned long sizeP)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if !defined(ENABLE_USE_GTPU_IN_KERNEL)
|
||||||
static int gtpv1u_send_init_udp(uint16_t port_number)
|
static int gtpv1u_send_init_udp(uint16_t port_number)
|
||||||
{
|
{
|
||||||
// Create and alloc new message
|
// Create and alloc new message
|
||||||
@@ -168,6 +171,7 @@ static int gtpv1u_send_init_udp(uint16_t port_number)
|
|||||||
|
|
||||||
return itti_send_msg_to_task(TASK_UDP, INSTANCE_DEFAULT, message_p);
|
return itti_send_msg_to_task(TASK_UDP, INSTANCE_DEFAULT, message_p);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
NwGtpv1uRcT gtpv1u_log_request(NwGtpv1uLogMgrHandleT hLogMgr,
|
NwGtpv1uRcT gtpv1u_log_request(NwGtpv1uLogMgrHandleT hLogMgr,
|
||||||
NwU32T logLevel,
|
NwU32T logLevel,
|
||||||
@@ -179,6 +183,7 @@ NwGtpv1uRcT gtpv1u_log_request(NwGtpv1uLogMgrHandleT hLogMgr,
|
|||||||
return NW_GTPV1U_OK;
|
return NW_GTPV1U_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if !defined(ENABLE_USE_GTPU_IN_KERNEL)
|
||||||
NwGtpv1uRcT gtpv1u_send_udp_msg(
|
NwGtpv1uRcT gtpv1u_send_udp_msg(
|
||||||
NwGtpv1uUdpHandleT udpHandle,
|
NwGtpv1uUdpHandleT udpHandle,
|
||||||
NwU8T *buffer,
|
NwU8T *buffer,
|
||||||
@@ -203,7 +208,7 @@ NwGtpv1uRcT gtpv1u_send_udp_msg(
|
|||||||
|
|
||||||
return itti_send_msg_to_task(TASK_UDP, INSTANCE_DEFAULT, message_p);
|
return itti_send_msg_to_task(TASK_UDP, INSTANCE_DEFAULT, message_p);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
/* Callback called when a gtpv1u message arrived on UDP interface */
|
/* Callback called when a gtpv1u message arrived on UDP interface */
|
||||||
NwGtpv1uRcT gtpv1u_process_stack_req(
|
NwGtpv1uRcT gtpv1u_process_stack_req(
|
||||||
NwGtpv1uUlpHandleT hUlp,
|
NwGtpv1uUlpHandleT hUlp,
|
||||||
|
|||||||
@@ -128,6 +128,7 @@ nwGtpv1uGpduMsgNew( NW_IN NwGtpv1uStackHandleT hGtpuStackHandle,
|
|||||||
{
|
{
|
||||||
NwGtpv1uStackT *pStack = (NwGtpv1uStackT *) hGtpuStackHandle;
|
NwGtpv1uStackT *pStack = (NwGtpv1uStackT *) hGtpuStackHandle;
|
||||||
NwGtpv1uMsgT *pMsg;
|
NwGtpv1uMsgT *pMsg;
|
||||||
|
//NwU32T header_len = 0;
|
||||||
NwU32T msgExtraLen = 0;
|
NwU32T msgExtraLen = 0;
|
||||||
|
|
||||||
if(gpGtpv1uMsgPool) {
|
if(gpGtpv1uMsgPool) {
|
||||||
|
|||||||
@@ -45,19 +45,20 @@
|
|||||||
#include "assertions.h"
|
#include "assertions.h"
|
||||||
|
|
||||||
static
|
static
|
||||||
int mme_app_request_authentication_info(const mme_app_imsi_t imsi,
|
int mme_app_request_authentication_info(const char *imsi,
|
||||||
const uint8_t nb_of_vectors,
|
const uint8_t nb_of_vectors,
|
||||||
const plmn_t *plmn,
|
const plmn_t *plmn,
|
||||||
const uint8_t *auts);
|
const uint8_t *auts);
|
||||||
|
|
||||||
static
|
static
|
||||||
int mme_app_request_authentication_info(const mme_app_imsi_t imsi,
|
int mme_app_request_authentication_info(const char *imsi,
|
||||||
const uint8_t nb_of_vectors,
|
const uint8_t nb_of_vectors,
|
||||||
const plmn_t *plmn,
|
const plmn_t *plmn,
|
||||||
const uint8_t *auts)
|
const uint8_t *auts)
|
||||||
{
|
{
|
||||||
s6a_auth_info_req_t *auth_info_req = NULL;
|
s6a_auth_info_req_t *auth_info_req = NULL;
|
||||||
MessageDef *message_p = NULL;
|
MessageDef *message_p = NULL;
|
||||||
|
int imsi_length = strlen(imsi);
|
||||||
|
|
||||||
DevAssert(plmn != NULL);
|
DevAssert(plmn != NULL);
|
||||||
|
|
||||||
@@ -66,7 +67,9 @@ int mme_app_request_authentication_info(const mme_app_imsi_t imsi,
|
|||||||
auth_info_req = &message_p->ittiMsg.s6a_auth_info_req;
|
auth_info_req = &message_p->ittiMsg.s6a_auth_info_req;
|
||||||
memset(auth_info_req, 0, sizeof(*auth_info_req));
|
memset(auth_info_req, 0, sizeof(*auth_info_req));
|
||||||
|
|
||||||
auth_info_req->imsi_length = MME_APP_IMSI_TO_STRING(imsi, auth_info_req->imsi);
|
strncpy(auth_info_req->imsi, imsi, imsi_length);
|
||||||
|
auth_info_req->imsi_length = imsi_length;
|
||||||
|
//MME_APP_IMSI_TO_STRING(imsi, auth_info_req->imsi);
|
||||||
|
|
||||||
memcpy(&auth_info_req->visited_plmn, plmn, sizeof(plmn_t));
|
memcpy(&auth_info_req->visited_plmn, plmn, sizeof(plmn_t));
|
||||||
MME_APP_DEBUG("%s visited_plmn MCC %X%X%X MNC %X%X%X\n",
|
MME_APP_DEBUG("%s visited_plmn MCC %X%X%X MNC %X%X%X\n",
|
||||||
@@ -214,122 +217,7 @@ mme_app_handle_authentication_info_answer(
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(DISABLE_USE_NAS)
|
|
||||||
int mme_app_handle_attach_req(nas_attach_req_t *attach_req_p)
|
|
||||||
{
|
|
||||||
/* An attach request has been received from NAS layer.
|
|
||||||
* If the UE authentication vectors for the UE are known within MME then the
|
|
||||||
* authentication procedure should be triggered only if the request is an
|
|
||||||
* initial attach, otherwise an update location should be sent to the HSS
|
|
||||||
* and default bearer should be established for the provided APN.
|
|
||||||
* In case of initial attach procedure, the default APN retrieved from the
|
|
||||||
* HSS will be used to establish the default bearer within EPC.
|
|
||||||
* The default APN is the one that matches the context-identifier
|
|
||||||
*/
|
|
||||||
struct ue_context_s *ue_context;
|
|
||||||
uint64_t imsi = 0;
|
|
||||||
|
|
||||||
DevAssert(attach_req_p != NULL);
|
|
||||||
|
|
||||||
MME_APP_STRING_TO_IMSI((char *)attach_req_p->imsi, &imsi);
|
|
||||||
|
|
||||||
MME_APP_DEBUG("Handling imsi %"IMSI_FORMAT"\n", imsi);
|
|
||||||
|
|
||||||
ue_context = mme_ue_context_exists_imsi(&mme_app_desc.mme_ue_contexts, imsi);
|
|
||||||
|
|
||||||
if (ue_context == NULL) {
|
|
||||||
/* The MME doesn't know this IMSI.
|
|
||||||
* Insert the UE to the list of known equipements and
|
|
||||||
* Retrieve the authentication vector from HSS.
|
|
||||||
*/
|
|
||||||
MME_APP_DEBUG("UE context doesn't exist -> create one\n");
|
|
||||||
|
|
||||||
if ((ue_context = mme_create_new_ue_context()) == NULL) {
|
|
||||||
/* Error during ue context malloc */
|
|
||||||
/* TODO */
|
|
||||||
DevMessage("mme_create_new_ue_context");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ue_context->imsi = imsi;
|
|
||||||
|
|
||||||
ue_context->eNB_ue_s1ap_id = attach_req_p->transparent.eNB_ue_s1ap_id;
|
|
||||||
ue_context->mme_ue_s1ap_id = attach_req_p->transparent.mme_ue_s1ap_id;
|
|
||||||
ue_context->ue_id = attach_req_p->transparent.mme_ue_s1ap_id;
|
|
||||||
|
|
||||||
// STAILQ_INIT(&ue_context->vector_list);
|
|
||||||
DevAssert(mme_insert_ue_context(&mme_app_desc.mme_ue_contexts, ue_context) == 0);
|
|
||||||
goto request_auth;
|
|
||||||
} else {
|
|
||||||
/* MME knows this IMSI, check if UE is authenticated and authentication
|
|
||||||
* vectors are known.
|
|
||||||
*/
|
|
||||||
MME_APP_DEBUG("UE context already exists, use it\n");
|
|
||||||
|
|
||||||
/* Update mme ue s1ap id */
|
|
||||||
ue_context->mme_ue_s1ap_id = attach_req_p->transparent.mme_ue_s1ap_id;
|
|
||||||
|
|
||||||
if ((ue_context->imsi_auth == IMSI_AUTHENTICATED) &&
|
|
||||||
(attach_req_p->initial != INITIAL_REQUEST)) {
|
|
||||||
/* We have to send an update location request to the HSS */
|
|
||||||
MME_APP_DEBUG("UE is authenticated\n");
|
|
||||||
} else {
|
|
||||||
MME_APP_DEBUG("UE is not authenticated\n");
|
|
||||||
|
|
||||||
/* UE is not authenticated or an initial request */
|
|
||||||
// if (STAILQ_EMPTY(&ue_context->vector_list))
|
|
||||||
if (ue_context->nb_of_vectors == 0)
|
|
||||||
request_auth: {
|
|
||||||
/* We have no vector for this UE, send an authentication request
|
|
||||||
* to the HSS.
|
|
||||||
*/
|
|
||||||
AssertFatal(0, "Hardcoded MCC/MNC");
|
|
||||||
plmn_t plmn = {
|
|
||||||
.MCCdigit2 = 0,
|
|
||||||
.MCCdigit1 = 8,
|
|
||||||
.MCCdigit3 = 2,
|
|
||||||
.MNCdigit1 = 0,
|
|
||||||
.MNCdigit2 = 4,
|
|
||||||
.MNCdigit3 = 3,
|
|
||||||
};
|
|
||||||
|
|
||||||
memcpy(&ue_context->e_utran_cgi, &attach_req_p->transparent.e_utran_cgi,
|
|
||||||
sizeof(cgi_t));
|
|
||||||
|
|
||||||
/* Acquire the current time */
|
|
||||||
time(&ue_context->cell_age);
|
|
||||||
|
|
||||||
/* Some random values for GUTI */
|
|
||||||
ue_context->guti.m_tmsi = 0x24568956;
|
|
||||||
ue_context->guti.gummei.MMEcode = 0x01;
|
|
||||||
ue_context->guti.gummei.MMEgid = 0x5691;
|
|
||||||
|
|
||||||
memcpy(&ue_context->guti.gummei.plmn, &plmn, sizeof(plmn_t));
|
|
||||||
MME_APP_DEBUG("and we have no auth. vector for it, request"
|
|
||||||
" authentication information\n");
|
|
||||||
// mme_app_dump_ue_contexts();
|
|
||||||
mme_app_request_authentication_info(imsi, 1, &plmn, NULL);
|
|
||||||
} else {
|
|
||||||
nas_auth_req_t *nas_auth_req_p;
|
|
||||||
MessageDef *message_p;
|
|
||||||
/* We have a vector... USE it */
|
|
||||||
MME_APP_DEBUG("but we have an auth. vector for it, request"
|
|
||||||
" authentication from NAS\n");
|
|
||||||
message_p = itti_alloc_new_message(TASK_MME_APP, NAS_AUTHENTICATION_PARAM_FAIL);
|
|
||||||
|
|
||||||
nas_auth_req_p = &message_p->ittiMsg.nas_auth_req;
|
|
||||||
|
|
||||||
MME_APP_IMSI_TO_STRING(imsi, nas_auth_req_p->imsi);
|
|
||||||
nas_auth_req_p->failure = NAS_FAILURE_OK;
|
|
||||||
|
|
||||||
return itti_send_msg_to_task(TASK_NAS_MME, INSTANCE_DEFAULT, message_p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
void
|
void
|
||||||
mme_app_handle_nas_auth_param_req(
|
mme_app_handle_nas_auth_param_req(
|
||||||
const nas_auth_param_req_t * const nas_auth_param_req_pP)
|
const nas_auth_param_req_t * const nas_auth_param_req_pP)
|
||||||
@@ -354,13 +242,14 @@ mme_app_handle_nas_auth_param_req(
|
|||||||
visited_plmn_from_req.MCCdigit2 = nas_auth_param_req_pP->imsi[1];
|
visited_plmn_from_req.MCCdigit2 = nas_auth_param_req_pP->imsi[1];
|
||||||
visited_plmn_from_req.MCCdigit3 = nas_auth_param_req_pP->imsi[2];
|
visited_plmn_from_req.MCCdigit3 = nas_auth_param_req_pP->imsi[2];
|
||||||
|
|
||||||
mnc_length = find_mnc_length(nas_auth_param_req_pP->imsi[0],
|
mnc_length = find_mnc_length(
|
||||||
nas_auth_param_req_pP->imsi[1],
|
nas_auth_param_req_pP->imsi[0],
|
||||||
nas_auth_param_req_pP->imsi[2],
|
nas_auth_param_req_pP->imsi[1],
|
||||||
nas_auth_param_req_pP->imsi[3],
|
nas_auth_param_req_pP->imsi[2],
|
||||||
nas_auth_param_req_pP->imsi[4],
|
nas_auth_param_req_pP->imsi[3],
|
||||||
nas_auth_param_req_pP->imsi[5]
|
nas_auth_param_req_pP->imsi[4],
|
||||||
);
|
nas_auth_param_req_pP->imsi[5]
|
||||||
|
);
|
||||||
|
|
||||||
if (mnc_length == 2) {
|
if (mnc_length == 2) {
|
||||||
visited_plmn_from_req.MNCdigit1 = nas_auth_param_req_pP->imsi[3];
|
visited_plmn_from_req.MNCdigit1 = nas_auth_param_req_pP->imsi[3];
|
||||||
@@ -439,11 +328,10 @@ mme_app_handle_nas_auth_param_req(
|
|||||||
memcpy(&ue_context->guti.gummei.plmn, visited_plmn, sizeof(plmn_t));
|
memcpy(&ue_context->guti.gummei.plmn, visited_plmn, sizeof(plmn_t));
|
||||||
MME_APP_DEBUG("and we have no auth. vector for it, request"
|
MME_APP_DEBUG("and we have no auth. vector for it, request"
|
||||||
" authentication information\n");
|
" authentication information\n");
|
||||||
mme_app_request_authentication_info(imsi, 1, visited_plmn, NULL);
|
mme_app_request_authentication_info(nas_auth_param_req_pP->imsi, 1, visited_plmn, NULL);
|
||||||
} else {
|
} else {
|
||||||
memcpy(&ue_context->guti.gummei.plmn, visited_plmn, sizeof(plmn_t));
|
memcpy(&ue_context->guti.gummei.plmn, visited_plmn, sizeof(plmn_t));
|
||||||
|
|
||||||
mme_app_request_authentication_info(imsi, 1, visited_plmn, nas_auth_param_req_pP->auts);
|
mme_app_request_authentication_info(nas_auth_param_req_pP->imsi, 1, visited_plmn, nas_auth_param_req_pP->auts);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|||||||
@@ -50,8 +50,8 @@
|
|||||||
#include "mme_app_ue_context.h"
|
#include "mme_app_ue_context.h"
|
||||||
#include "mme_app_defs.h"
|
#include "mme_app_defs.h"
|
||||||
|
|
||||||
static inline int ue_context_compare_identifiers(struct ue_context_s *p1,
|
int ue_context_compare_identifiers(struct ue_context_s *p1,
|
||||||
struct ue_context_s *p2);
|
struct ue_context_s *p2);
|
||||||
|
|
||||||
RB_PROTOTYPE(ue_context_map, ue_context_s, rb_entry,
|
RB_PROTOTYPE(ue_context_map, ue_context_s, rb_entry,
|
||||||
ue_context_compare_identifiers);
|
ue_context_compare_identifiers);
|
||||||
@@ -59,7 +59,7 @@ RB_PROTOTYPE(ue_context_map, ue_context_s, rb_entry,
|
|||||||
RB_GENERATE(ue_context_map, ue_context_s, rb_entry,
|
RB_GENERATE(ue_context_map, ue_context_s, rb_entry,
|
||||||
ue_context_compare_identifiers);
|
ue_context_compare_identifiers);
|
||||||
|
|
||||||
static inline int ue_context_compare_identifiers(
|
extern inline int ue_context_compare_identifiers(
|
||||||
struct ue_context_s *p1, struct ue_context_s *p2)
|
struct ue_context_s *p1, struct ue_context_s *p2)
|
||||||
{
|
{
|
||||||
MME_APP_DEBUG(" ue_context_compare_identifiers IMSI %"SCNu64"\n", p1->imsi);
|
MME_APP_DEBUG(" ue_context_compare_identifiers IMSI %"SCNu64"\n", p1->imsi);
|
||||||
@@ -68,6 +68,8 @@ static inline int ue_context_compare_identifiers(
|
|||||||
MME_APP_DEBUG(" ue_context_compare_identifiers ue_id %08x\n" , p1->ue_id);
|
MME_APP_DEBUG(" ue_context_compare_identifiers ue_id %08x\n" , p1->ue_id);
|
||||||
|
|
||||||
if (p1->imsi > 0) {
|
if (p1->imsi > 0) {
|
||||||
|
MME_APP_DEBUG(" with IMSI %"SCNu64"\n", p2->imsi);
|
||||||
|
|
||||||
/* if IMSI provided */
|
/* if IMSI provided */
|
||||||
if (p1->imsi > p2->imsi) {
|
if (p1->imsi > p2->imsi) {
|
||||||
return 1;
|
return 1;
|
||||||
@@ -77,6 +79,8 @@ static inline int ue_context_compare_identifiers(
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
} else if (p1->mme_s11_teid > 0) {
|
} else if (p1->mme_s11_teid > 0) {
|
||||||
|
MME_APP_DEBUG(" with mme_s11_teid %08x\n", p2->mme_s11_teid);
|
||||||
|
|
||||||
/* if s11 teid provided */
|
/* if s11 teid provided */
|
||||||
if (p1->mme_s11_teid > p2->mme_s11_teid) {
|
if (p1->mme_s11_teid > p2->mme_s11_teid) {
|
||||||
return 1;
|
return 1;
|
||||||
@@ -86,7 +90,7 @@ static inline int ue_context_compare_identifiers(
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
} else if (p1->mme_ue_s1ap_id > 0) {
|
} else if (p1->mme_ue_s1ap_id > 0) {
|
||||||
MME_APP_DEBUG(" with mme_ue_s1ap_id %d\n" , p2->mme_ue_s1ap_id);
|
MME_APP_DEBUG(" with mme_ue_s1ap_id %08x\n", p2->mme_ue_s1ap_id);
|
||||||
|
|
||||||
/* if s1ap ue id provided */
|
/* if s1ap ue id provided */
|
||||||
if (p1->mme_ue_s1ap_id > p2->mme_ue_s1ap_id) {
|
if (p1->mme_ue_s1ap_id > p2->mme_ue_s1ap_id) {
|
||||||
@@ -97,6 +101,8 @@ static inline int ue_context_compare_identifiers(
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
} else if (p1->ue_id > 0) {
|
} else if (p1->ue_id > 0) {
|
||||||
|
MME_APP_DEBUG(" with ue_id %08x\n", p2->ue_id);
|
||||||
|
|
||||||
/* if nas ue_id provided */
|
/* if nas ue_id provided */
|
||||||
if (p1->ue_id > p2->ue_id) {
|
if (p1->ue_id > p2->ue_id) {
|
||||||
return 1;
|
return 1;
|
||||||
@@ -152,7 +158,7 @@ ue_context_t *mme_create_new_ue_context(void)
|
|||||||
return new_p;
|
return new_p;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline
|
|
||||||
struct ue_context_s *mme_ue_context_exists_imsi(mme_ue_context_t *mme_ue_context,
|
struct ue_context_s *mme_ue_context_exists_imsi(mme_ue_context_t *mme_ue_context,
|
||||||
mme_app_imsi_t imsi)
|
mme_app_imsi_t imsi)
|
||||||
{
|
{
|
||||||
@@ -166,7 +172,7 @@ struct ue_context_s *mme_ue_context_exists_imsi(mme_ue_context_t *mme_ue_context
|
|||||||
&reference);
|
&reference);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline
|
|
||||||
struct ue_context_s *mme_ue_context_exists_s11_teid(mme_ue_context_t *mme_ue_context,
|
struct ue_context_s *mme_ue_context_exists_s11_teid(mme_ue_context_t *mme_ue_context,
|
||||||
uint32_t teid)
|
uint32_t teid)
|
||||||
{
|
{
|
||||||
@@ -180,7 +186,8 @@ struct ue_context_s *mme_ue_context_exists_s11_teid(mme_ue_context_t *mme_ue_con
|
|||||||
&reference);
|
&reference);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline
|
|
||||||
|
|
||||||
ue_context_t *mme_ue_context_exists_mme_ue_s1ap_id(
|
ue_context_t *mme_ue_context_exists_mme_ue_s1ap_id(
|
||||||
mme_ue_context_t *mme_ue_context,
|
mme_ue_context_t *mme_ue_context,
|
||||||
uint32_t mme_ue_s1ap_id)
|
uint32_t mme_ue_s1ap_id)
|
||||||
@@ -195,7 +202,8 @@ ue_context_t *mme_ue_context_exists_mme_ue_s1ap_id(
|
|||||||
&reference);
|
&reference);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline
|
|
||||||
|
|
||||||
ue_context_t *mme_ue_context_exists_nas_ue_id(
|
ue_context_t *mme_ue_context_exists_nas_ue_id(
|
||||||
mme_ue_context_t *mme_ue_context,
|
mme_ue_context_t *mme_ue_context,
|
||||||
uint32_t nas_ue_id)
|
uint32_t nas_ue_id)
|
||||||
@@ -211,7 +219,8 @@ ue_context_t *mme_ue_context_exists_nas_ue_id(
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline
|
|
||||||
|
|
||||||
ue_context_t *mme_ue_context_exists_guti(mme_ue_context_t *mme_ue_context,
|
ue_context_t *mme_ue_context_exists_guti(mme_ue_context_t *mme_ue_context,
|
||||||
GUTI_t guti)
|
GUTI_t guti)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -200,7 +200,6 @@ typedef struct {
|
|||||||
* \param imsi Imsi to find in UE map
|
* \param imsi Imsi to find in UE map
|
||||||
* @returns an UE context matching the IMSI or NULL if the context doesn't exists
|
* @returns an UE context matching the IMSI or NULL if the context doesn't exists
|
||||||
**/
|
**/
|
||||||
inline
|
|
||||||
ue_context_t *mme_ue_context_exists_imsi(mme_ue_context_t *mme_ue_context,
|
ue_context_t *mme_ue_context_exists_imsi(mme_ue_context_t *mme_ue_context,
|
||||||
mme_app_imsi_t imsi);
|
mme_app_imsi_t imsi);
|
||||||
|
|
||||||
@@ -208,7 +207,6 @@ ue_context_t *mme_ue_context_exists_imsi(mme_ue_context_t *mme_ue_context,
|
|||||||
* \param teid The tunnel endpoint identifier used between MME and S-GW
|
* \param teid The tunnel endpoint identifier used between MME and S-GW
|
||||||
* @returns an UE context matching the teid or NULL if the context doesn't exists
|
* @returns an UE context matching the teid or NULL if the context doesn't exists
|
||||||
**/
|
**/
|
||||||
inline
|
|
||||||
ue_context_t *mme_ue_context_exists_s11_teid(mme_ue_context_t *mme_ue_context,
|
ue_context_t *mme_ue_context_exists_s11_teid(mme_ue_context_t *mme_ue_context,
|
||||||
uint32_t teid);
|
uint32_t teid);
|
||||||
|
|
||||||
@@ -216,7 +214,6 @@ ue_context_t *mme_ue_context_exists_s11_teid(mme_ue_context_t *mme_ue_context,
|
|||||||
* \param mme_ue_s1ap_id The UE id identifier used in S1AP MME (and NAS)
|
* \param mme_ue_s1ap_id The UE id identifier used in S1AP MME (and NAS)
|
||||||
* @returns an UE context matching the mme_ue_s1ap_id or NULL if the context doesn't exists
|
* @returns an UE context matching the mme_ue_s1ap_id or NULL if the context doesn't exists
|
||||||
**/
|
**/
|
||||||
inline
|
|
||||||
ue_context_t *mme_ue_context_exists_mme_ue_s1ap_id(mme_ue_context_t *mme_ue_context,
|
ue_context_t *mme_ue_context_exists_mme_ue_s1ap_id(mme_ue_context_t *mme_ue_context,
|
||||||
uint32_t mme_ue_s1ap_id);
|
uint32_t mme_ue_s1ap_id);
|
||||||
|
|
||||||
@@ -224,7 +221,6 @@ ue_context_t *mme_ue_context_exists_mme_ue_s1ap_id(mme_ue_context_t *mme_ue_cont
|
|||||||
* \param nas_ue_id The UE id identifier used in S1AP MME and NAS
|
* \param nas_ue_id The UE id identifier used in S1AP MME and NAS
|
||||||
* @returns an UE context matching the nas_ue_id or NULL if the context doesn't exists
|
* @returns an UE context matching the nas_ue_id or NULL if the context doesn't exists
|
||||||
**/
|
**/
|
||||||
inline
|
|
||||||
ue_context_t *mme_ue_context_exists_nas_ue_id(mme_ue_context_t *mme_ue_context,
|
ue_context_t *mme_ue_context_exists_nas_ue_id(mme_ue_context_t *mme_ue_context,
|
||||||
uint32_t nas_ue_id);
|
uint32_t nas_ue_id);
|
||||||
|
|
||||||
@@ -232,7 +228,6 @@ ue_context_t *mme_ue_context_exists_nas_ue_id(mme_ue_context_t *mme_ue_context,
|
|||||||
* \param guti The GUTI used by the UE
|
* \param guti The GUTI used by the UE
|
||||||
* @returns an UE context matching the guti or NULL if the context doesn't exists
|
* @returns an UE context matching the guti or NULL if the context doesn't exists
|
||||||
**/
|
**/
|
||||||
inline
|
|
||||||
ue_context_t *mme_ue_context_exists_guti(mme_ue_context_t *mme_ue_context,
|
ue_context_t *mme_ue_context_exists_guti(mme_ue_context_t *mme_ue_context,
|
||||||
GUTI_t guti);
|
GUTI_t guti);
|
||||||
|
|
||||||
|
|||||||
@@ -251,14 +251,14 @@ static int _mme_api_pdn_id = 0;
|
|||||||
** Others: None **
|
** Others: None **
|
||||||
** **
|
** **
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
int mme_api_get_emm_config(mme_api_emm_config_t *config,
|
int mme_api_get_emm_config(mme_api_emm_config_t *config,
|
||||||
mme_config_t *mme_config_p)
|
mme_config_t *mme_config_p)
|
||||||
#else
|
#else
|
||||||
int mme_api_get_emm_config(mme_api_emm_config_t *config)
|
int mme_api_get_emm_config(mme_api_emm_config_t *config)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
int i;
|
int i;
|
||||||
#endif
|
#endif
|
||||||
LOG_FUNC_IN;
|
LOG_FUNC_IN;
|
||||||
@@ -285,7 +285,7 @@ int mme_api_get_emm_config(mme_api_emm_config_t *config)
|
|||||||
|
|
||||||
config->gummei.MMEgid = mme_config_p->gummei.mme_gid[0];
|
config->gummei.MMEgid = mme_config_p->gummei.mme_gid[0];
|
||||||
config->gummei.MMEcode = mme_config_p->gummei.mmec[0];
|
config->gummei.MMEcode = mme_config_p->gummei.mmec[0];
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
|
|
||||||
/* SR: this config param comes from MME global config */
|
/* SR: this config param comes from MME global config */
|
||||||
if (mme_config_p->emergency_attach_supported != 0) {
|
if (mme_config_p->emergency_attach_supported != 0) {
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ Description Implements the API used by the NAS layer running in the MME
|
|||||||
#define __MME_API_H__
|
#define __MME_API_H__
|
||||||
|
|
||||||
#ifdef NAS_MME
|
#ifdef NAS_MME
|
||||||
# if defined(EPC_BUILD)
|
# if defined(NAS_BUILT_IN_EPC)
|
||||||
# include "mme_config.h"
|
# include "mme_config.h"
|
||||||
# endif
|
# endif
|
||||||
#include "commonDef.h"
|
#include "commonDef.h"
|
||||||
@@ -127,7 +127,7 @@ typedef struct mme_api_tft_s {
|
|||||||
/****************** E X P O R T E D F U N C T I O N S ******************/
|
/****************** E X P O R T E D F U N C T I O N S ******************/
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
int mme_api_get_emm_config(mme_api_emm_config_t *config,
|
int mme_api_get_emm_config(mme_api_emm_config_t *config,
|
||||||
mme_config_t *mme_config_p);
|
mme_config_t *mme_config_p);
|
||||||
#else
|
#else
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ Description Defines the layer 3 messages supported by the NAS sublayer
|
|||||||
#include <stdlib.h> // malloc, free
|
#include <stdlib.h> // malloc, free
|
||||||
#include <string.h> // memcpy
|
#include <string.h> // memcpy
|
||||||
|
|
||||||
#if ((defined(EPC_BUILD) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(UE_BUILD) && defined(NAS_UE)))
|
#if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
|
||||||
# include "nas_itti_messaging.h"
|
# include "nas_itti_messaging.h"
|
||||||
#endif
|
#endif
|
||||||
#include "secu_defs.h"
|
#include "secu_defs.h"
|
||||||
@@ -313,7 +313,6 @@ int nas_message_decrypt(
|
|||||||
#endif
|
#endif
|
||||||
emm_security_context);
|
emm_security_context);
|
||||||
|
|
||||||
|
|
||||||
/* Check NAS message integrity */
|
/* Check NAS message integrity */
|
||||||
if (mac != header->message_authentication_code) {
|
if (mac != header->message_authentication_code) {
|
||||||
LOG_TRACE(DEBUG,
|
LOG_TRACE(DEBUG,
|
||||||
@@ -425,6 +424,24 @@ int nas_message_decode(
|
|||||||
emm_security_context
|
emm_security_context
|
||||||
);
|
);
|
||||||
|
|
||||||
|
#define NAS_CODE_TO_BE_MODIFIED 1
|
||||||
|
#ifdef NAS_CODE_TO_BE_MODIFIED
|
||||||
|
|
||||||
|
// According to 3GPP TS 24.301 version 10.15.0 Release 10, 4.4.4.3 Integrity checking of NAS signalling messages in the MME
|
||||||
|
if ((!emm_security_context) && (mac == 0) && (msg->header.message_authentication_code != 0)) {
|
||||||
|
// force mac to be the same, but we should check for message types.
|
||||||
|
// TODO Reverse order of processing in NAS code: decode message type then check MAC
|
||||||
|
LOG_TRACE(DEBUG,
|
||||||
|
"Forced computed MAC to be the MSG MAC %04x",
|
||||||
|
msg->header.message_authentication_code);
|
||||||
|
mac = msg->header.message_authentication_code;
|
||||||
|
LOG_TRACE(DEBUG,
|
||||||
|
"Forced computed MAC to be the same as MAC in message %04x",
|
||||||
|
msg->header.message_authentication_code);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Check NAS message integrity */
|
/* Check NAS message integrity */
|
||||||
if (mac != msg->header.message_authentication_code) {
|
if (mac != msg->header.message_authentication_code) {
|
||||||
LOG_TRACE(DEBUG,
|
LOG_TRACE(DEBUG,
|
||||||
@@ -434,7 +451,7 @@ int nas_message_decode(
|
|||||||
LOG_FUNC_RETURN (TLV_DECODE_MAC_MISMATCH);
|
LOG_FUNC_RETURN (TLV_DECODE_MAC_MISMATCH);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if ((defined(EPC_BUILD) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(UE_BUILD) && defined(NAS_UE)))
|
#if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
|
||||||
/* Log message header */
|
/* Log message header */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -566,7 +583,7 @@ int nas_message_encode(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if ((defined(EPC_BUILD) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(UE_BUILD) && defined(NAS_UE)))
|
#if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
|
||||||
/* Log message header */
|
/* Log message header */
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
@@ -970,7 +987,9 @@ static int _nas_message_decrypt(
|
|||||||
"No decryption of message length %u according to security header type 0x%02x",
|
"No decryption of message length %u according to security header type 0x%02x",
|
||||||
length, security_header_type);
|
length, security_header_type);
|
||||||
memcpy(dest, src, length);
|
memcpy(dest, src, length);
|
||||||
LOG_FUNC_RETURN (length);
|
DECODE_U8(dest, *(UInt8_t*)(&header), size);
|
||||||
|
LOG_FUNC_RETURN (header.protocol_discriminator);
|
||||||
|
//LOG_FUNC_RETURN (length);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SECURITY_HEADER_TYPE_INTEGRITY_PROTECTED_CYPHERED:
|
case SECURITY_HEADER_TYPE_INTEGRITY_PROTECTED_CYPHERED:
|
||||||
@@ -1268,7 +1287,7 @@ static UInt32_t _nas_message_get_mac(
|
|||||||
if (!emm_security_context) {
|
if (!emm_security_context) {
|
||||||
LOG_TRACE(DEBUG,
|
LOG_TRACE(DEBUG,
|
||||||
"No security context set for integrity protection algorithm");
|
"No security context set for integrity protection algorithm");
|
||||||
#if defined(EPC_BUILD) || defined(UE_BUILD)
|
#if defined(NAS_BUILT_IN_EPC) || defined(NAS_BUILT_IN_UE)
|
||||||
LOG_FUNC_RETURN (0);
|
LOG_FUNC_RETURN (0);
|
||||||
#else
|
#else
|
||||||
LOG_FUNC_RETURN (0xabababab);
|
LOG_FUNC_RETURN (0xabababab);
|
||||||
@@ -1398,7 +1417,7 @@ static UInt32_t _nas_message_get_mac(
|
|||||||
(direction == SECU_DIRECTION_UPLINK) ? emm_security_context->ul_count.seq_num:emm_security_context->dl_count.seq_num
|
(direction == SECU_DIRECTION_UPLINK) ? emm_security_context->ul_count.seq_num:emm_security_context->dl_count.seq_num
|
||||||
);
|
);
|
||||||
|
|
||||||
#if defined(EPC_BUILD) || defined(UE_BUILD)
|
#if defined(NAS_BUILT_IN_EPC) || defined(NAS_BUILT_IN_UE)
|
||||||
LOG_FUNC_RETURN (0);
|
LOG_FUNC_RETURN (0);
|
||||||
#else
|
#else
|
||||||
LOG_FUNC_RETURN (0xabababab);
|
LOG_FUNC_RETURN (0xabababab);
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ Description Defines the layer 3 messages supported by the NAS sublayer
|
|||||||
|
|
||||||
#include "commonDef.h"
|
#include "commonDef.h"
|
||||||
#include "emm_msg.h"
|
#include "emm_msg.h"
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
#include "emmData.h"
|
#include "emmData.h"
|
||||||
#endif
|
#endif
|
||||||
#include "esm_msg.h"
|
#include "esm_msg.h"
|
||||||
|
|||||||
@@ -1084,7 +1084,7 @@ static int _at_response_encode_cgpaddr(char* buffer, const at_response_t* data)
|
|||||||
if (cgpaddr->PDP_addr_2[i] != NULL) {
|
if (cgpaddr->PDP_addr_2[i] != NULL) {
|
||||||
/* IPv6 Link-local address prefixe */
|
/* IPv6 Link-local address prefixe */
|
||||||
offset += sprintf(buffer+offset,
|
offset += sprintf(buffer+offset,
|
||||||
",%u.%u.%u.%u.%u.%u.%u.%u",
|
",%hhu.%hhu.%hhu.%hhu.%hhu.%hhu.%hhu.%hhu",
|
||||||
0xfe, 0x80, 0, 0, 0, 0, 0, 0);
|
0xfe, 0x80, 0, 0, 0, 0, 0, 0);
|
||||||
/* IPv6 Link-local address */
|
/* IPv6 Link-local address */
|
||||||
offset += sprintf(buffer+offset,
|
offset += sprintf(buffer+offset,
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ Description Defines the attach related EMM procedure executed by the
|
|||||||
#ifdef NAS_MME
|
#ifdef NAS_MME
|
||||||
#include "mme_api.h"
|
#include "mme_api.h"
|
||||||
#include "mme_config.h"
|
#include "mme_config.h"
|
||||||
# if defined(EPC_BUILD)
|
# if defined(NAS_BUILT_IN_EPC)
|
||||||
# include "nas_itti_messaging.h"
|
# include "nas_itti_messaging.h"
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
@@ -1075,13 +1075,18 @@ int emm_proc_attach_set_detach(void)
|
|||||||
** Others: _emm_data **
|
** Others: _emm_data **
|
||||||
** **
|
** **
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
int emm_proc_attach_request(unsigned int ueid, emm_proc_attach_type_t type,
|
int emm_proc_attach_request(
|
||||||
int native_ksi, int ksi, int native_guti,
|
unsigned int ueid,
|
||||||
GUTI_t *guti, imsi_t *imsi, imei_t *imei,
|
emm_proc_attach_type_t type,
|
||||||
tai_t *tai,
|
int native_ksi, int ksi,
|
||||||
int eea, int eia, int ucs2, int uea, int uia, int gea,
|
int native_guti,
|
||||||
int umts_present, int gprs_present,
|
GUTI_t *guti,
|
||||||
const OctetString *esm_msg)
|
imsi_t *imsi,
|
||||||
|
imei_t *imei,
|
||||||
|
tai_t *tai,
|
||||||
|
int eea, int eia, int ucs2, int uea, int uia, int gea,
|
||||||
|
int umts_present, int gprs_present,
|
||||||
|
const OctetString *esm_msg)
|
||||||
{
|
{
|
||||||
LOG_FUNC_IN;
|
LOG_FUNC_IN;
|
||||||
|
|
||||||
@@ -1098,7 +1103,7 @@ int emm_proc_attach_request(unsigned int ueid, emm_proc_attach_type_t type,
|
|||||||
ue_ctx.is_dynamic = FALSE;
|
ue_ctx.is_dynamic = FALSE;
|
||||||
ue_ctx.ueid = ueid;
|
ue_ctx.ueid = ueid;
|
||||||
|
|
||||||
#if !defined(EPC_BUILD)
|
#if !defined(NAS_BUILT_IN_EPC)
|
||||||
|
|
||||||
/* UE identifier sanity check */
|
/* UE identifier sanity check */
|
||||||
if (ueid >= EMM_DATA_NB_UE_MAX) {
|
if (ueid >= EMM_DATA_NB_UE_MAX) {
|
||||||
@@ -1126,7 +1131,7 @@ int emm_proc_attach_request(unsigned int ueid, emm_proc_attach_type_t type,
|
|||||||
/* Get the UE's EMM context if it exists */
|
/* Get the UE's EMM context if it exists */
|
||||||
emm_data_context_t **emm_ctx = NULL;
|
emm_data_context_t **emm_ctx = NULL;
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
emm_data_context_t *temp = NULL;
|
emm_data_context_t *temp = NULL;
|
||||||
|
|
||||||
temp = emm_data_context_get(&_emm_data, ueid);
|
temp = emm_data_context_get(&_emm_data, ueid);
|
||||||
@@ -1197,7 +1202,7 @@ int emm_proc_attach_request(unsigned int ueid, emm_proc_attach_type_t type,
|
|||||||
(*emm_ctx)->ueid = ueid;
|
(*emm_ctx)->ueid = ueid;
|
||||||
|
|
||||||
emm_fsm_set_status(ueid, *emm_ctx, EMM_DEREGISTERED);
|
emm_fsm_set_status(ueid, *emm_ctx, EMM_DEREGISTERED);
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
emm_data_context_add(&_emm_data, *(emm_ctx));
|
emm_data_context_add(&_emm_data, *(emm_ctx));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1265,7 +1270,7 @@ int emm_proc_attach_reject(unsigned int ueid, int emm_cause)
|
|||||||
ue_ctx.ueid = ueid;
|
ue_ctx.ueid = ueid;
|
||||||
|
|
||||||
/* Update the EMM cause code */
|
/* Update the EMM cause code */
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
|
|
||||||
if (ueid > 0)
|
if (ueid > 0)
|
||||||
#else
|
#else
|
||||||
@@ -1333,7 +1338,7 @@ int emm_proc_attach_complete(unsigned int ueid, const OctetString *esm_msg)
|
|||||||
|
|
||||||
/* Get the UE context */
|
/* Get the UE context */
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
|
|
||||||
if (ueid > 0) {
|
if (ueid > 0) {
|
||||||
emm_ctx = emm_data_context_get(&_emm_data, ueid);
|
emm_ctx = emm_data_context_get(&_emm_data, ueid);
|
||||||
@@ -1670,7 +1675,7 @@ static void *_emm_attach_t3450_handler(void *args)
|
|||||||
/* Get the UE's EMM context */
|
/* Get the UE's EMM context */
|
||||||
emm_data_context_t *emm_ctx = NULL;
|
emm_data_context_t *emm_ctx = NULL;
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
emm_ctx = emm_data_context_get(&_emm_data, data->ueid);
|
emm_ctx = emm_data_context_get(&_emm_data, data->ueid);
|
||||||
#else
|
#else
|
||||||
emm_ctx = _emm_data.ctx[data->ueid];
|
emm_ctx = _emm_data.ctx[data->ueid];
|
||||||
@@ -1768,7 +1773,7 @@ static int _emm_attach_release(void *args)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Release the EMM context */
|
/* Release the EMM context */
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
emm_data_context_remove(&_emm_data, emm_ctx);
|
emm_data_context_remove(&_emm_data, emm_ctx);
|
||||||
#else
|
#else
|
||||||
free(_emm_data.ctx[ueid]);
|
free(_emm_data.ctx[ueid]);
|
||||||
@@ -1903,7 +1908,7 @@ static int _emm_attach_abort(void *args)
|
|||||||
|
|
||||||
free(data);
|
free(data);
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
ctx = emm_data_context_get(&_emm_data, ueid);
|
ctx = emm_data_context_get(&_emm_data, ueid);
|
||||||
#else
|
#else
|
||||||
ctx = _emm_data.ctx[ueid];
|
ctx = _emm_data.ctx[ueid];
|
||||||
@@ -1979,7 +1984,7 @@ static int _emm_attach_identify(void *args)
|
|||||||
*/
|
*/
|
||||||
if (emm_ctx->imsi) {
|
if (emm_ctx->imsi) {
|
||||||
/* The UE identifies itself using an IMSI */
|
/* The UE identifies itself using an IMSI */
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
if (!emm_ctx->security) {
|
if (!emm_ctx->security) {
|
||||||
/* Ask upper layer to fetch new security context */
|
/* Ask upper layer to fetch new security context */
|
||||||
nas_itti_auth_info_req(emm_ctx->ueid, emm_ctx->imsi, 1, NULL);
|
nas_itti_auth_info_req(emm_ctx->ueid, emm_ctx->imsi, 1, NULL);
|
||||||
@@ -2096,7 +2101,7 @@ static int _emm_attach_identify(void *args)
|
|||||||
rc = _emm_attach_security(emm_ctx);
|
rc = _emm_attach_security(emm_ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(EPC_BUILD)
|
#if !defined(NAS_BUILT_IN_EPC)
|
||||||
else {
|
else {
|
||||||
/* 3GPP TS 24.401, Figure 5.3.2.1-1, point 5a
|
/* 3GPP TS 24.401, Figure 5.3.2.1-1, point 5a
|
||||||
* No EMM context exists for the UE in the network; authentication
|
* No EMM context exists for the UE in the network; authentication
|
||||||
@@ -2145,7 +2150,7 @@ static int _emm_attach_identify(void *args)
|
|||||||
** Others: _emm_data **
|
** Others: _emm_data **
|
||||||
** **
|
** **
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
int emm_attach_security(void *args)
|
int emm_attach_security(void *args)
|
||||||
{
|
{
|
||||||
return _emm_attach_security(args);
|
return _emm_attach_security(args);
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ Description Defines the authentication EMM procedure executed by the
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef NAS_MME
|
#ifdef NAS_MME
|
||||||
# if defined(EPC_BUILD)
|
# if defined(NAS_BUILT_IN_EPC)
|
||||||
# include "nas_itti_messaging.h"
|
# include "nas_itti_messaging.h"
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
@@ -710,7 +710,7 @@ int emm_proc_authentication_complete(unsigned int ueid, int emm_cause,
|
|||||||
/* Get the UE context */
|
/* Get the UE context */
|
||||||
emm_data_context_t *emm_ctx = NULL;
|
emm_data_context_t *emm_ctx = NULL;
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
|
|
||||||
if (ueid > 0) {
|
if (ueid > 0) {
|
||||||
emm_ctx = emm_data_context_get(&_emm_data, ueid);
|
emm_ctx = emm_data_context_get(&_emm_data, ueid);
|
||||||
@@ -739,7 +739,7 @@ int emm_proc_authentication_complete(unsigned int ueid, int emm_cause,
|
|||||||
if (emm_cause != EMM_CAUSE_SUCCESS) {
|
if (emm_cause != EMM_CAUSE_SUCCESS) {
|
||||||
switch (emm_cause) {
|
switch (emm_cause) {
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
|
|
||||||
case EMM_CAUSE_SYNCH_FAILURE:
|
case EMM_CAUSE_SYNCH_FAILURE:
|
||||||
/* USIM has detected a mismatch in SQN.
|
/* USIM has detected a mismatch in SQN.
|
||||||
@@ -1408,7 +1408,7 @@ int _authentication_request(authentication_data_t *data)
|
|||||||
emm_sap.u.emm_as.u.security.autn = &data->autn;
|
emm_sap.u.emm_as.u.security.autn = &data->autn;
|
||||||
|
|
||||||
/* TODO: check for pointer validity */
|
/* TODO: check for pointer validity */
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
emm_ctx = emm_data_context_get(&_emm_data, data->ueid);
|
emm_ctx = emm_data_context_get(&_emm_data, data->ueid);
|
||||||
#else
|
#else
|
||||||
emm_ctx = _emm_data.ctx[data->ueid];
|
emm_ctx = _emm_data.ctx[data->ueid];
|
||||||
@@ -1467,7 +1467,7 @@ static int _authentication_reject(unsigned int ueid)
|
|||||||
emm_sap.u.emm_as.u.security.ueid = ueid;
|
emm_sap.u.emm_as.u.security.ueid = ueid;
|
||||||
emm_sap.u.emm_as.u.security.msgType = EMM_AS_MSG_TYPE_AUTH;
|
emm_sap.u.emm_as.u.security.msgType = EMM_AS_MSG_TYPE_AUTH;
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
emm_ctx = emm_data_context_get(&_emm_data, ueid);
|
emm_ctx = emm_data_context_get(&_emm_data, ueid);
|
||||||
#else
|
#else
|
||||||
emm_ctx = _emm_data.ctx[ueid];
|
emm_ctx = _emm_data.ctx[ueid];
|
||||||
|
|||||||
@@ -456,7 +456,7 @@ int emm_proc_detach_request(unsigned int ueid, emm_proc_detach_type_t type,
|
|||||||
_emm_detach_type_str[type], type, ueid);
|
_emm_detach_type_str[type], type, ueid);
|
||||||
|
|
||||||
/* Get the UE context */
|
/* Get the UE context */
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
|
|
||||||
if (ueid > 0) {
|
if (ueid > 0) {
|
||||||
emm_ctx = emm_data_context_get(&_emm_data, ueid);
|
emm_ctx = emm_data_context_get(&_emm_data, ueid);
|
||||||
@@ -513,7 +513,7 @@ int emm_proc_detach_request(unsigned int ueid, emm_proc_detach_type_t type,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Release the EMM context */
|
/* Release the EMM context */
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
emm_data_context_remove(&_emm_data, emm_ctx);
|
emm_data_context_remove(&_emm_data, emm_ctx);
|
||||||
free(emm_ctx);
|
free(emm_ctx);
|
||||||
#else
|
#else
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ Description Defines callback functions executed within EMM common procedures
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
# include "assertions.h"
|
# include "assertions.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -90,12 +90,12 @@ typedef struct emm_common_data_s {
|
|||||||
emm_common_abort_callback_t abort;
|
emm_common_abort_callback_t abort;
|
||||||
void *args;
|
void *args;
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
RB_ENTRY(emm_common_data_s) entries;
|
RB_ENTRY(emm_common_data_s) entries;
|
||||||
#endif
|
#endif
|
||||||
} emm_common_data_t;
|
} emm_common_data_t;
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
typedef struct emm_common_data_head_s {
|
typedef struct emm_common_data_head_s {
|
||||||
RB_HEAD(emm_common_data_map, emm_common_data_s) emm_common_data_root;
|
RB_HEAD(emm_common_data_map, emm_common_data_s) emm_common_data_root;
|
||||||
} emm_common_data_head_t;
|
} emm_common_data_head_t;
|
||||||
@@ -185,7 +185,7 @@ int emm_proc_common_initialize(unsigned int ueid,
|
|||||||
struct emm_common_data_s *emm_common_data_ctx = NULL;
|
struct emm_common_data_s *emm_common_data_ctx = NULL;
|
||||||
LOG_FUNC_IN;
|
LOG_FUNC_IN;
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
assert(ueid > 0);
|
assert(ueid > 0);
|
||||||
emm_common_data_ctx = emm_common_data_context_get(&emm_common_data_head, ueid);
|
emm_common_data_ctx = emm_common_data_context_get(&emm_common_data_head, ueid);
|
||||||
#else
|
#else
|
||||||
@@ -195,7 +195,7 @@ int emm_proc_common_initialize(unsigned int ueid,
|
|||||||
if (emm_common_data_ctx == NULL) {
|
if (emm_common_data_ctx == NULL) {
|
||||||
emm_common_data_ctx = (emm_common_data_t *)malloc(sizeof(emm_common_data_t));
|
emm_common_data_ctx = (emm_common_data_t *)malloc(sizeof(emm_common_data_t));
|
||||||
emm_common_data_ctx->ueid = ueid;
|
emm_common_data_ctx->ueid = ueid;
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
RB_INSERT(emm_common_data_map, &emm_common_data_head.emm_common_data_root,
|
RB_INSERT(emm_common_data_map, &emm_common_data_head.emm_common_data_root,
|
||||||
emm_common_data_ctx);
|
emm_common_data_ctx);
|
||||||
#endif
|
#endif
|
||||||
@@ -244,7 +244,7 @@ int emm_proc_common_success(unsigned int ueid)
|
|||||||
|
|
||||||
LOG_FUNC_IN;
|
LOG_FUNC_IN;
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
DevCheck(ueid > 0, ueid, 0, 0);
|
DevCheck(ueid > 0, ueid, 0, 0);
|
||||||
emm_common_data_ctx = emm_common_data_context_get(&emm_common_data_head, ueid);
|
emm_common_data_ctx = emm_common_data_context_get(&emm_common_data_head, ueid);
|
||||||
#else
|
#else
|
||||||
@@ -259,7 +259,7 @@ int emm_proc_common_success(unsigned int ueid)
|
|||||||
if (emm_callback) {
|
if (emm_callback) {
|
||||||
struct emm_data_context_s *ctx = NULL;
|
struct emm_data_context_s *ctx = NULL;
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
ctx = emm_data_context_get(&_emm_data, ueid);
|
ctx = emm_data_context_get(&_emm_data, ueid);
|
||||||
#else
|
#else
|
||||||
ctx = _emm_data.ctx[ueid];
|
ctx = _emm_data.ctx[ueid];
|
||||||
@@ -297,7 +297,7 @@ int emm_proc_common_reject(unsigned int ueid)
|
|||||||
|
|
||||||
LOG_FUNC_IN;
|
LOG_FUNC_IN;
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
DevCheck(ueid > 0, ueid, 0, 0);
|
DevCheck(ueid > 0, ueid, 0, 0);
|
||||||
emm_common_data_ctx = emm_common_data_context_get(&emm_common_data_head, ueid);
|
emm_common_data_ctx = emm_common_data_context_get(&emm_common_data_head, ueid);
|
||||||
#else
|
#else
|
||||||
@@ -312,7 +312,7 @@ int emm_proc_common_reject(unsigned int ueid)
|
|||||||
if (emm_callback) {
|
if (emm_callback) {
|
||||||
struct emm_data_context_s *ctx = NULL;
|
struct emm_data_context_s *ctx = NULL;
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
ctx = emm_data_context_get(&_emm_data, ueid);
|
ctx = emm_data_context_get(&_emm_data, ueid);
|
||||||
#else
|
#else
|
||||||
ctx = _emm_data.ctx[ueid];
|
ctx = _emm_data.ctx[ueid];
|
||||||
@@ -352,7 +352,7 @@ int emm_proc_common_failure(unsigned int ueid)
|
|||||||
|
|
||||||
LOG_FUNC_IN;
|
LOG_FUNC_IN;
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
DevCheck(ueid > 0, ueid, 0, 0);
|
DevCheck(ueid > 0, ueid, 0, 0);
|
||||||
emm_common_data_ctx = emm_common_data_context_get(&emm_common_data_head, ueid);
|
emm_common_data_ctx = emm_common_data_context_get(&emm_common_data_head, ueid);
|
||||||
#else
|
#else
|
||||||
@@ -366,7 +366,7 @@ int emm_proc_common_failure(unsigned int ueid)
|
|||||||
if (emm_callback) {
|
if (emm_callback) {
|
||||||
struct emm_data_context_s *ctx = NULL;
|
struct emm_data_context_s *ctx = NULL;
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
ctx = emm_data_context_get(&_emm_data, ueid);
|
ctx = emm_data_context_get(&_emm_data, ueid);
|
||||||
#else
|
#else
|
||||||
ctx = _emm_data.ctx[ueid];
|
ctx = _emm_data.ctx[ueid];
|
||||||
@@ -405,7 +405,7 @@ int emm_proc_common_abort(unsigned int ueid)
|
|||||||
|
|
||||||
LOG_FUNC_IN;
|
LOG_FUNC_IN;
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
DevCheck(ueid > 0, ueid, 0, 0);
|
DevCheck(ueid > 0, ueid, 0, 0);
|
||||||
emm_common_data_ctx = emm_common_data_context_get(&emm_common_data_head, ueid);
|
emm_common_data_ctx = emm_common_data_context_get(&emm_common_data_head, ueid);
|
||||||
#else
|
#else
|
||||||
@@ -419,7 +419,7 @@ int emm_proc_common_abort(unsigned int ueid)
|
|||||||
if (emm_callback) {
|
if (emm_callback) {
|
||||||
struct emm_data_context_s *ctx = NULL;
|
struct emm_data_context_s *ctx = NULL;
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
ctx = emm_data_context_get(&_emm_data, ueid);
|
ctx = emm_data_context_get(&_emm_data, ueid);
|
||||||
#else
|
#else
|
||||||
ctx = _emm_data.ctx[ueid];
|
ctx = _emm_data.ctx[ueid];
|
||||||
@@ -453,7 +453,7 @@ void *emm_proc_common_get_args(unsigned int ueid)
|
|||||||
emm_common_data_t *emm_common_data_ctx = NULL;
|
emm_common_data_t *emm_common_data_ctx = NULL;
|
||||||
LOG_FUNC_IN;
|
LOG_FUNC_IN;
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
DevCheck(ueid > 0, ueid, 0, 0);
|
DevCheck(ueid > 0, ueid, 0, 0);
|
||||||
emm_common_data_ctx = emm_common_data_context_get(&emm_common_data_head, ueid);
|
emm_common_data_ctx = emm_common_data_context_get(&emm_common_data_head, ueid);
|
||||||
#else
|
#else
|
||||||
@@ -490,7 +490,7 @@ static void _emm_common_cleanup(unsigned int ueid)
|
|||||||
{
|
{
|
||||||
emm_common_data_t *emm_common_data_ctx = NULL;
|
emm_common_data_t *emm_common_data_ctx = NULL;
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
DevCheck(ueid > 0, ueid, 0, 0);
|
DevCheck(ueid > 0, ueid, 0, 0);
|
||||||
emm_common_data_ctx = emm_common_data_context_get(&emm_common_data_head, ueid);
|
emm_common_data_ctx = emm_common_data_context_get(&emm_common_data_head, ueid);
|
||||||
#else
|
#else
|
||||||
@@ -503,7 +503,7 @@ static void _emm_common_cleanup(unsigned int ueid)
|
|||||||
|
|
||||||
if (emm_common_data_ctx->ref_count == 0) {
|
if (emm_common_data_ctx->ref_count == 0) {
|
||||||
/* Release the callback functions */
|
/* Release the callback functions */
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
RB_REMOVE(emm_common_data_map,
|
RB_REMOVE(emm_common_data_map,
|
||||||
&emm_common_data_head.emm_common_data_root,
|
&emm_common_data_head.emm_common_data_root,
|
||||||
emm_common_data_ctx);
|
emm_common_data_ctx);
|
||||||
|
|||||||
@@ -147,7 +147,7 @@ int emm_proc_status(unsigned int ueid, int emm_cause)
|
|||||||
#endif
|
#endif
|
||||||
#ifdef NAS_MME
|
#ifdef NAS_MME
|
||||||
emm_sap.u.emm_as.u.status.guti = NULL;
|
emm_sap.u.emm_as.u.status.guti = NULL;
|
||||||
# if defined(EPC_BUILD)
|
# if defined(NAS_BUILT_IN_EPC)
|
||||||
ctx = emm_data_context_get(&_emm_data, ueid);
|
ctx = emm_data_context_get(&_emm_data, ueid);
|
||||||
# else
|
# else
|
||||||
ctx = _emm_data.ctx[ueid];
|
ctx = _emm_data.ctx[ueid];
|
||||||
|
|||||||
@@ -384,7 +384,7 @@ int emm_proc_identification_complete(unsigned int ueid, const imsi_t *imsi,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Get the UE context */
|
/* Get the UE context */
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
|
|
||||||
if (ueid > 0) {
|
if (ueid > 0) {
|
||||||
emm_ctx = emm_data_context_get(&_emm_data, ueid);
|
emm_ctx = emm_data_context_get(&_emm_data, ueid);
|
||||||
@@ -551,7 +551,7 @@ int _identification_request(identification_data_t *data)
|
|||||||
emm_sap.u.emm_as.u.security.msgType = EMM_AS_MSG_TYPE_IDENT;
|
emm_sap.u.emm_as.u.security.msgType = EMM_AS_MSG_TYPE_IDENT;
|
||||||
emm_sap.u.emm_as.u.security.identType = data->type;
|
emm_sap.u.emm_as.u.security.identType = data->type;
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
|
|
||||||
if (data->ueid > 0) {
|
if (data->ueid > 0) {
|
||||||
emm_ctx = emm_data_context_get(&_emm_data, data->ueid);
|
emm_ctx = emm_data_context_get(&_emm_data, data->ueid);
|
||||||
|
|||||||
@@ -236,7 +236,7 @@ int lowerlayer_data_ind(unsigned int ueid, const OctetString *data)
|
|||||||
|
|
||||||
LOG_FUNC_IN;
|
LOG_FUNC_IN;
|
||||||
|
|
||||||
#if defined(EPC_BUILD) && defined(NAS_MME)
|
#if defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)
|
||||||
|
|
||||||
if (ueid > 0) {
|
if (ueid > 0) {
|
||||||
emm_ctx = emm_data_context_get(&_emm_data, ueid);
|
emm_ctx = emm_data_context_get(&_emm_data, ueid);
|
||||||
@@ -290,7 +290,7 @@ int lowerlayer_data_req(unsigned int ueid, const OctetString *data)
|
|||||||
#ifdef NAS_MME
|
#ifdef NAS_MME
|
||||||
emm_sap.u.emm_as.u.data.guti = NULL;
|
emm_sap.u.emm_as.u.data.guti = NULL;
|
||||||
emm_sap.u.emm_as.u.data.ueid = ueid;
|
emm_sap.u.emm_as.u.data.ueid = ueid;
|
||||||
# if defined(EPC_BUILD)
|
# if defined(NAS_BUILT_IN_EPC)
|
||||||
|
|
||||||
if (ueid > 0) {
|
if (ueid > 0) {
|
||||||
ctx = emm_data_context_get(&_emm_data, ueid);
|
ctx = emm_data_context_get(&_emm_data, ueid);
|
||||||
|
|||||||
@@ -446,7 +446,7 @@ int emm_proc_security_mode_control(unsigned int ueid, int ksi,
|
|||||||
"KSI = %d EEA = %d EIA = %d",
|
"KSI = %d EEA = %d EIA = %d",
|
||||||
ksi, eea, eia);
|
ksi, eea, eia);
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
|
|
||||||
if (ueid > 0) {
|
if (ueid > 0) {
|
||||||
emm_ctx = emm_data_context_get(&_emm_data, ueid);
|
emm_ctx = emm_data_context_get(&_emm_data, ueid);
|
||||||
@@ -638,7 +638,7 @@ int emm_proc_security_mode_complete(unsigned int ueid)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Get the UE context */
|
/* Get the UE context */
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
|
|
||||||
if (ueid > 0) {
|
if (ueid > 0) {
|
||||||
emm_ctx = emm_data_context_get(&_emm_data, ueid);
|
emm_ctx = emm_data_context_get(&_emm_data, ueid);
|
||||||
@@ -721,7 +721,7 @@ int emm_proc_security_mode_reject(unsigned int ueid)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Get the UE context */
|
/* Get the UE context */
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
|
|
||||||
if (ueid > 0) {
|
if (ueid > 0) {
|
||||||
emm_ctx = emm_data_context_get(&_emm_data, ueid);
|
emm_ctx = emm_data_context_get(&_emm_data, ueid);
|
||||||
@@ -1074,7 +1074,7 @@ int _security_request(security_data_t *data, int is_new)
|
|||||||
emm_sap.u.emm_as.u.security.selected_eea = data->selected_eea;
|
emm_sap.u.emm_as.u.security.selected_eea = data->selected_eea;
|
||||||
emm_sap.u.emm_as.u.security.selected_eia = data->selected_eia;
|
emm_sap.u.emm_as.u.security.selected_eia = data->selected_eia;
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
|
|
||||||
if (data->ueid > 0) {
|
if (data->ueid > 0) {
|
||||||
emm_ctx = emm_data_context_get(&_emm_data, data->ueid);
|
emm_ctx = emm_data_context_get(&_emm_data, data->ueid);
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ int emm_proc_tracking_area_update_reject(unsigned int ueid, int emm_cause)
|
|||||||
ue_ctx.ueid = ueid;
|
ue_ctx.ueid = ueid;
|
||||||
|
|
||||||
/* Update the EMM cause code */
|
/* Update the EMM cause code */
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
|
|
||||||
if (ueid > 0)
|
if (ueid > 0)
|
||||||
#else
|
#else
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ Description Defines internal private data handled by EPS Mobility
|
|||||||
#ifdef NAS_MME
|
#ifdef NAS_MME
|
||||||
#include "emm_fsm.h"
|
#include "emm_fsm.h"
|
||||||
#include "mme_api.h"
|
#include "mme_api.h"
|
||||||
# if defined(EPC_BUILD)
|
# if defined(NAS_BUILT_IN_EPC)
|
||||||
# include "tree.h"
|
# include "tree.h"
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
@@ -356,7 +356,7 @@ typedef struct {
|
|||||||
* ---------------------------------------------------------------------------
|
* ---------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
typedef struct emm_data_context_s {
|
typedef struct emm_data_context_s {
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
RB_ENTRY(emm_data_context_s) entries;
|
RB_ENTRY(emm_data_context_s) entries;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -409,7 +409,7 @@ typedef struct {
|
|||||||
* EMM contexts
|
* EMM contexts
|
||||||
* ------------
|
* ------------
|
||||||
*/
|
*/
|
||||||
# if defined(EPC_BUILD)
|
# if defined(NAS_BUILT_IN_EPC)
|
||||||
/* Use a tree for ue data context within MME */
|
/* Use a tree for ue data context within MME */
|
||||||
RB_HEAD(emm_data_context_map, emm_data_context_s) ctx_map;
|
RB_HEAD(emm_data_context_map, emm_data_context_s) ctx_map;
|
||||||
# else
|
# else
|
||||||
|
|||||||
@@ -30,7 +30,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#if defined(EPC_BUILD) && defined(NAS_MME)
|
#if defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)
|
||||||
#include "assertions.h"
|
#include "assertions.h"
|
||||||
#include "tree.h"
|
#include "tree.h"
|
||||||
#include "emmData.h"
|
#include "emmData.h"
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ Description Defines the EPS Mobility Management procedure call manager,
|
|||||||
#include <stdlib.h> // malloc, free
|
#include <stdlib.h> // malloc, free
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(EPC_BUILD) && defined(NAS_MME)
|
#if defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)
|
||||||
# include "mme_config.h"
|
# include "mme_config.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -425,7 +425,7 @@ void emm_main_initialize(emm_indication_callback_t cb, const char *imei)
|
|||||||
** Others: _emm_data **
|
** Others: _emm_data **
|
||||||
** **
|
** **
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
void emm_main_initialize(mme_config_t *mme_config_p)
|
void emm_main_initialize(mme_config_t *mme_config_p)
|
||||||
#else
|
#else
|
||||||
void emm_main_initialize(void)
|
void emm_main_initialize(void)
|
||||||
@@ -434,7 +434,7 @@ void emm_main_initialize(void)
|
|||||||
LOG_FUNC_IN;
|
LOG_FUNC_IN;
|
||||||
|
|
||||||
/* Retreive MME supported configuration data */
|
/* Retreive MME supported configuration data */
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
|
|
||||||
if (mme_api_get_emm_config(&_emm_data.conf, mme_config_p) != RETURNok)
|
if (mme_api_get_emm_config(&_emm_data.conf, mme_config_p) != RETURNok)
|
||||||
#else
|
#else
|
||||||
@@ -444,7 +444,7 @@ void emm_main_initialize(void)
|
|||||||
LOG_TRACE(ERROR, "EMM-MAIN - Failed to get MME configuration data");
|
LOG_TRACE(ERROR, "EMM-MAIN - Failed to get MME configuration data");
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
RB_INIT(&_emm_data.ctx_map);
|
RB_INIT(&_emm_data.ctx_map);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ Description Defines the EPS Mobility Management procedure call manager,
|
|||||||
#ifndef __EMM_MAIN_H__
|
#ifndef __EMM_MAIN_H__
|
||||||
#define __EMM_MAIN_H__
|
#define __EMM_MAIN_H__
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
# include "mme_config.h"
|
# include "mme_config.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -73,7 +73,7 @@ Description Defines the EPS Mobility Management procedure call manager,
|
|||||||
void emm_main_initialize(emm_indication_callback_t cb, const char *imei);
|
void emm_main_initialize(emm_indication_callback_t cb, const char *imei);
|
||||||
#endif
|
#endif
|
||||||
#ifdef NAS_MME
|
#ifdef NAS_MME
|
||||||
# if defined(EPC_BUILD)
|
# if defined(NAS_BUILT_IN_EPC)
|
||||||
void emm_main_initialize(mme_config_t *mme_config_p);
|
void emm_main_initialize(mme_config_t *mme_config_p);
|
||||||
# else
|
# else
|
||||||
void emm_main_initialize(void);
|
void emm_main_initialize(void);
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ Description Defines EPS Mobility Management messages
|
|||||||
#include "TLVDecoder.h"
|
#include "TLVDecoder.h"
|
||||||
#include "TLVEncoder.h"
|
#include "TLVEncoder.h"
|
||||||
|
|
||||||
#if ((defined(EPC_BUILD) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(UE_BUILD) && defined(NAS_UE)))
|
#if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
|
||||||
# include "nas_itti_messaging.h"
|
# include "nas_itti_messaging.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -97,12 +97,12 @@ int emm_msg_decode(EMM_msg *msg, uint8_t *buffer, uint32_t len)
|
|||||||
int header_result;
|
int header_result;
|
||||||
int decode_result;
|
int decode_result;
|
||||||
|
|
||||||
#if ((defined(EPC_BUILD) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(UE_BUILD) && defined(NAS_UE)))
|
#if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
|
||||||
uint8_t *buffer_log = buffer;
|
uint8_t *buffer_log = buffer;
|
||||||
uint32_t len_log = len;
|
uint32_t len_log = len;
|
||||||
int down_link;
|
int down_link;
|
||||||
|
|
||||||
# if ((defined(EPC_BUILD) && defined(NAS_MME)))
|
# if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)))
|
||||||
down_link = 0;
|
down_link = 0;
|
||||||
# else
|
# else
|
||||||
down_link = 1;
|
down_link = 1;
|
||||||
@@ -265,7 +265,7 @@ int emm_msg_decode(EMM_msg *msg, uint8_t *buffer, uint32_t len)
|
|||||||
"(%d)", msg->header.message_type, decode_result);
|
"(%d)", msg->header.message_type, decode_result);
|
||||||
LOG_FUNC_RETURN (decode_result);
|
LOG_FUNC_RETURN (decode_result);
|
||||||
} else {
|
} else {
|
||||||
#if ((defined(EPC_BUILD) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(UE_BUILD) && defined(NAS_UE)))
|
#if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
|
||||||
/* Message has been decoded and security header removed, handle it has a plain message */
|
/* Message has been decoded and security header removed, handle it has a plain message */
|
||||||
nas_itti_plain_msg((char *) buffer_log, (nas_message_t *) msg, len_log, down_link);
|
nas_itti_plain_msg((char *) buffer_log, (nas_message_t *) msg, len_log, down_link);
|
||||||
#endif
|
#endif
|
||||||
@@ -298,11 +298,11 @@ int emm_msg_encode(EMM_msg *msg, uint8_t *buffer, uint32_t len)
|
|||||||
int header_result;
|
int header_result;
|
||||||
int encode_result;
|
int encode_result;
|
||||||
|
|
||||||
#if ((defined(EPC_BUILD) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(UE_BUILD) && defined(NAS_UE)))
|
#if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
|
||||||
uint8_t *buffer_log = buffer;
|
uint8_t *buffer_log = buffer;
|
||||||
int down_link;
|
int down_link;
|
||||||
|
|
||||||
# if ((defined(EPC_BUILD) && defined(NAS_MME)))
|
# if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)))
|
||||||
down_link = 1;
|
down_link = 1;
|
||||||
# else
|
# else
|
||||||
down_link = 0;
|
down_link = 0;
|
||||||
@@ -466,7 +466,7 @@ int emm_msg_encode(EMM_msg *msg, uint8_t *buffer, uint32_t len)
|
|||||||
LOG_TRACE(ERROR, "EMM-MSG - Failed to encode L3 EMM message 0x%x "
|
LOG_TRACE(ERROR, "EMM-MSG - Failed to encode L3 EMM message 0x%x "
|
||||||
"(%d)", msg->header.message_type, encode_result);
|
"(%d)", msg->header.message_type, encode_result);
|
||||||
} else {
|
} else {
|
||||||
#if ((defined(EPC_BUILD) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(UE_BUILD) && defined(NAS_UE)))
|
#if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
|
||||||
nas_itti_plain_msg((char *) buffer_log, (nas_message_t *) msg, header_result + encode_result, down_link);
|
nas_itti_plain_msg((char *) buffer_log, (nas_message_t *) msg, header_result + encode_result, down_link);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ Description Defines the EMMAS Service Access Point that provides
|
|||||||
#include <string.h> // memset
|
#include <string.h> // memset
|
||||||
#include <stdlib.h> // malloc, free
|
#include <stdlib.h> // malloc, free
|
||||||
|
|
||||||
#if (defined(EPC_BUILD) && defined(NAS_MME)) || (defined(UE_BUILD) && defined(NAS_UE))
|
#if (defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(NAS_BUILT_IN_UE) && defined(NAS_UE))
|
||||||
# include "nas_itti_messaging.h"
|
# include "nas_itti_messaging.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -356,11 +356,11 @@ static int _emm_as_recv(unsigned int ueid, const char *msg, int len,
|
|||||||
|
|
||||||
emm_security_context_t *security = NULL; /* Current EPS NAS security context */
|
emm_security_context_t *security = NULL; /* Current EPS NAS security context */
|
||||||
#if defined(NAS_MME)
|
#if defined(NAS_MME)
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
emm_data_context_t *emm_ctx = NULL;
|
emm_data_context_t *emm_ctx = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
emm_ctx = emm_data_context_get(&_emm_data, ueid);
|
emm_ctx = emm_data_context_get(&_emm_data, ueid);
|
||||||
|
|
||||||
if (emm_ctx) {
|
if (emm_ctx) {
|
||||||
@@ -552,7 +552,7 @@ static int _emm_as_data_ind(const emm_as_data_t *msg, int *emm_cause)
|
|||||||
/* Decrypt the received security protected message */
|
/* Decrypt the received security protected message */
|
||||||
#if defined(NAS_MME)
|
#if defined(NAS_MME)
|
||||||
emm_data_context_t *emm_ctx = NULL;
|
emm_data_context_t *emm_ctx = NULL;
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
|
|
||||||
if (msg->ueid > 0) {
|
if (msg->ueid > 0) {
|
||||||
emm_ctx = emm_data_context_get(&_emm_data, msg->ueid);
|
emm_ctx = emm_data_context_get(&_emm_data, msg->ueid);
|
||||||
@@ -825,7 +825,7 @@ static int _emm_as_establish_req(const emm_as_establish_t *msg, int *emm_cause)
|
|||||||
memset(&nas_msg, 0 , sizeof(nas_message_t));
|
memset(&nas_msg, 0 , sizeof(nas_message_t));
|
||||||
|
|
||||||
#if defined(NAS_MME)
|
#if defined(NAS_MME)
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
emm_ctx = emm_data_context_get(&_emm_data, msg->ueid);
|
emm_ctx = emm_data_context_get(&_emm_data, msg->ueid);
|
||||||
#else
|
#else
|
||||||
|
|
||||||
@@ -1279,7 +1279,7 @@ static int _emm_as_send(const emm_as_t *msg)
|
|||||||
|
|
||||||
/* Send the message to the Access Stratum or S1AP in case of MME */
|
/* Send the message to the Access Stratum or S1AP in case of MME */
|
||||||
if (as_msg.msgID > 0) {
|
if (as_msg.msgID > 0) {
|
||||||
#if defined(EPC_BUILD) && defined(NAS_MME)
|
#if defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)
|
||||||
LOG_TRACE(DEBUG, "EMMAS-SAP - "
|
LOG_TRACE(DEBUG, "EMMAS-SAP - "
|
||||||
"Sending msg with id 0x%x, primitive %s (%d) to S1AP layer for transmission",
|
"Sending msg with id 0x%x, primitive %s (%d) to S1AP layer for transmission",
|
||||||
as_msg.msgID,
|
as_msg.msgID,
|
||||||
@@ -1330,7 +1330,7 @@ static int _emm_as_send(const emm_as_t *msg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
# if defined(UE_BUILD) && defined(NAS_UE)
|
# if defined(NAS_BUILT_IN_UE) && defined(NAS_UE)
|
||||||
LOG_TRACE(DEBUG, "EMMAS-SAP - "
|
LOG_TRACE(DEBUG, "EMMAS-SAP - "
|
||||||
"Sending msg with id 0x%x, primitive %s (%d) to RRC layer for transmission",
|
"Sending msg with id 0x%x, primitive %s (%d) to RRC layer for transmission",
|
||||||
as_msg.msgID,
|
as_msg.msgID,
|
||||||
@@ -1467,7 +1467,7 @@ static int _emm_as_data_req(const emm_as_data_t *msg,
|
|||||||
emm_security_context_t *emm_security_context = NULL;
|
emm_security_context_t *emm_security_context = NULL;
|
||||||
#if defined(NAS_MME)
|
#if defined(NAS_MME)
|
||||||
struct emm_data_context_s *emm_ctx = NULL;
|
struct emm_data_context_s *emm_ctx = NULL;
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
emm_ctx = emm_data_context_get(&_emm_data, msg->ueid);
|
emm_ctx = emm_data_context_get(&_emm_data, msg->ueid);
|
||||||
#else
|
#else
|
||||||
|
|
||||||
@@ -1573,7 +1573,7 @@ static int _emm_as_status_ind(const emm_as_status_t *msg,
|
|||||||
emm_security_context_t *emm_security_context = NULL;
|
emm_security_context_t *emm_security_context = NULL;
|
||||||
#if defined(NAS_MME)
|
#if defined(NAS_MME)
|
||||||
struct emm_data_context_s *emm_ctx = NULL;
|
struct emm_data_context_s *emm_ctx = NULL;
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
emm_ctx = emm_data_context_get(&_emm_data, msg->ueid);
|
emm_ctx = emm_data_context_get(&_emm_data, msg->ueid);
|
||||||
#else
|
#else
|
||||||
|
|
||||||
@@ -1914,7 +1914,7 @@ static int _emm_as_security_req(const emm_as_security_t *msg,
|
|||||||
if (size > 0) {
|
if (size > 0) {
|
||||||
struct emm_data_context_s *emm_ctx = NULL;
|
struct emm_data_context_s *emm_ctx = NULL;
|
||||||
emm_security_context_t *emm_security_context = NULL;
|
emm_security_context_t *emm_security_context = NULL;
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
emm_ctx = emm_data_context_get(&_emm_data, msg->ueid);
|
emm_ctx = emm_data_context_get(&_emm_data, msg->ueid);
|
||||||
#else
|
#else
|
||||||
|
|
||||||
@@ -2004,7 +2004,7 @@ static int _emm_as_security_rej(const emm_as_security_t *msg,
|
|||||||
if (size > 0) {
|
if (size > 0) {
|
||||||
struct emm_data_context_s *emm_ctx = NULL;
|
struct emm_data_context_s *emm_ctx = NULL;
|
||||||
emm_security_context_t *emm_security_context = NULL;
|
emm_security_context_t *emm_security_context = NULL;
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
emm_ctx = emm_data_context_get(&_emm_data, msg->ueid);
|
emm_ctx = emm_data_context_get(&_emm_data, msg->ueid);
|
||||||
#else
|
#else
|
||||||
|
|
||||||
@@ -2099,7 +2099,7 @@ static int _emm_as_establish_cnf(const emm_as_establish_t *msg,
|
|||||||
if (size > 0) {
|
if (size > 0) {
|
||||||
struct emm_data_context_s *emm_ctx = NULL;
|
struct emm_data_context_s *emm_ctx = NULL;
|
||||||
emm_security_context_t *emm_security_context = NULL;
|
emm_security_context_t *emm_security_context = NULL;
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
emm_ctx = emm_data_context_get(&_emm_data, msg->ueid);
|
emm_ctx = emm_data_context_get(&_emm_data, msg->ueid);
|
||||||
#else
|
#else
|
||||||
|
|
||||||
@@ -2217,7 +2217,7 @@ static int _emm_as_establish_rej(const emm_as_establish_t *msg,
|
|||||||
if (size > 0) {
|
if (size > 0) {
|
||||||
struct emm_data_context_s *emm_ctx = NULL;
|
struct emm_data_context_s *emm_ctx = NULL;
|
||||||
emm_security_context_t *emm_security_context = NULL;
|
emm_security_context_t *emm_security_context = NULL;
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
emm_ctx = emm_data_context_get(&_emm_data, msg->ueid);
|
emm_ctx = emm_data_context_get(&_emm_data, msg->ueid);
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ Description
|
|||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
|
|
||||||
#include "nas_log.h"
|
#include "nas_log.h"
|
||||||
#include "commonDef.h"
|
#include "commonDef.h"
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ Description
|
|||||||
#ifndef _EMM_CN_H_
|
#ifndef _EMM_CN_H_
|
||||||
#define _EMM_CN_H_
|
#define _EMM_CN_H_
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
int emm_cn_send(const emm_cn_t *msg);
|
int emm_cn_send(const emm_cn_t *msg);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ Description
|
|||||||
|
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
#include "intertask_interface.h"
|
#include "intertask_interface.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -53,7 +53,7 @@ Description
|
|||||||
|
|
||||||
typedef enum emmcn_primitive_s {
|
typedef enum emmcn_primitive_s {
|
||||||
_EMMCN_START = 400,
|
_EMMCN_START = 400,
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
_EMMCN_AUTHENTICATION_PARAM_RES,
|
_EMMCN_AUTHENTICATION_PARAM_RES,
|
||||||
_EMMCN_AUTHENTICATION_PARAM_FAIL,
|
_EMMCN_AUTHENTICATION_PARAM_FAIL,
|
||||||
_EMMCN_DEREGISTER_UE,
|
_EMMCN_DEREGISTER_UE,
|
||||||
@@ -63,7 +63,7 @@ typedef enum emmcn_primitive_s {
|
|||||||
_EMMCN_END
|
_EMMCN_END
|
||||||
} emm_cn_primitive_t;
|
} emm_cn_primitive_t;
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
typedef nas_auth_param_rsp_t emm_cn_auth_res_t;
|
typedef nas_auth_param_rsp_t emm_cn_auth_res_t;
|
||||||
typedef nas_auth_param_fail_t emm_cn_auth_fail_t;
|
typedef nas_auth_param_fail_t emm_cn_auth_fail_t;
|
||||||
typedef nas_pdn_connectivity_rsp_t emm_cn_pdn_res_t;
|
typedef nas_pdn_connectivity_rsp_t emm_cn_pdn_res_t;
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ Description Defines the EPS Mobility Management procedures executed at
|
|||||||
#include "mme_api.h"
|
#include "mme_api.h"
|
||||||
#include "emmData.h"
|
#include "emmData.h"
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
# include "assertions.h"
|
# include "assertions.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -229,7 +229,7 @@ static const emm_fsm_handler_t _emm_fsm_handlers[EMM_STATE_MAX] = {
|
|||||||
* -----------------------------------------------------------------------------
|
* -----------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if !defined(EPC_BUILD)
|
#if !defined(NAS_BUILT_IN_EPC)
|
||||||
emm_fsm_state_t _emm_fsm_status[EMM_FSM_NB_UE_MAX];
|
emm_fsm_state_t _emm_fsm_status[EMM_FSM_NB_UE_MAX];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -260,7 +260,7 @@ void emm_fsm_initialize(void)
|
|||||||
_emm_fsm_status[0] = EMM_NULL;
|
_emm_fsm_status[0] = EMM_NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(NAS_MME) && !defined(EPC_BUILD)
|
#if defined(NAS_MME) && !defined(NAS_BUILT_IN_EPC)
|
||||||
|
|
||||||
for (ueid = 0; ueid < EMM_FSM_NB_UE_MAX; ueid++) {
|
for (ueid = 0; ueid < EMM_FSM_NB_UE_MAX; ueid++) {
|
||||||
_emm_fsm_status[ueid] = EMM_DEREGISTERED;
|
_emm_fsm_status[ueid] = EMM_DEREGISTERED;
|
||||||
@@ -299,7 +299,7 @@ int emm_fsm_set_status(
|
|||||||
unsigned int ueid = 0;
|
unsigned int ueid = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
emm_data_context_t *emm_ctx = (emm_data_context_t *)ctx;
|
emm_data_context_t *emm_ctx = (emm_data_context_t *)ctx;
|
||||||
|
|
||||||
DevAssert(emm_ctx != NULL);
|
DevAssert(emm_ctx != NULL);
|
||||||
@@ -360,7 +360,7 @@ emm_fsm_state_t emm_fsm_get_status(void)
|
|||||||
#ifdef NAS_MME
|
#ifdef NAS_MME
|
||||||
emm_fsm_state_t emm_fsm_get_status(unsigned int ueid, void *ctx)
|
emm_fsm_state_t emm_fsm_get_status(unsigned int ueid, void *ctx)
|
||||||
{
|
{
|
||||||
# if defined(EPC_BUILD)
|
# if defined(NAS_BUILT_IN_EPC)
|
||||||
emm_data_context_t *emm_ctx = (emm_data_context_t *)ctx;
|
emm_data_context_t *emm_ctx = (emm_data_context_t *)ctx;
|
||||||
|
|
||||||
if (emm_ctx != NULL) {
|
if (emm_ctx != NULL) {
|
||||||
@@ -406,7 +406,7 @@ int emm_fsm_process(const emm_reg_t *evt)
|
|||||||
status = _emm_fsm_status[0];
|
status = _emm_fsm_status[0];
|
||||||
#endif
|
#endif
|
||||||
#ifdef NAS_MME
|
#ifdef NAS_MME
|
||||||
# if defined(EPC_BUILD)
|
# if defined(NAS_BUILT_IN_EPC)
|
||||||
emm_data_context_t *emm_ctx = (emm_data_context_t *)evt->ctx;
|
emm_data_context_t *emm_ctx = (emm_data_context_t *)evt->ctx;
|
||||||
|
|
||||||
DevAssert(emm_ctx != NULL);
|
DevAssert(emm_ctx != NULL);
|
||||||
@@ -426,7 +426,7 @@ int emm_fsm_process(const emm_reg_t *evt)
|
|||||||
_emm_fsm_event_str[primitive - _EMMREG_START - 1], primitive,
|
_emm_fsm_event_str[primitive - _EMMREG_START - 1], primitive,
|
||||||
_emm_fsm_status_str[status]);
|
_emm_fsm_status_str[status]);
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
DevAssert(status != EMM_INVALID);
|
DevAssert(status != EMM_INVALID);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ int emm_fsm_set_status(emm_fsm_state_t status);
|
|||||||
emm_fsm_state_t emm_fsm_get_status(void);
|
emm_fsm_state_t emm_fsm_get_status(void);
|
||||||
#endif
|
#endif
|
||||||
#ifdef NAS_MME
|
#ifdef NAS_MME
|
||||||
struct emm_data_context_t;
|
//LG 2015-03-13 struct emm_data_context_t;
|
||||||
int emm_fsm_set_status(unsigned int ueid, void *ctx, emm_fsm_state_t status);
|
int emm_fsm_set_status(unsigned int ueid, void *ctx, emm_fsm_state_t status);
|
||||||
emm_fsm_state_t emm_fsm_get_status(unsigned int ueid, void *ctx);
|
emm_fsm_state_t emm_fsm_get_status(unsigned int ueid, void *ctx);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -510,7 +510,8 @@ int emm_recv_security_mode_command(security_mode_command_msg *msg,
|
|||||||
int emm_recv_attach_request(unsigned int ueid, const attach_request_msg *msg,
|
int emm_recv_attach_request(unsigned int ueid, const attach_request_msg *msg,
|
||||||
int *emm_cause)
|
int *emm_cause)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
|
uint8_t gea = 0;
|
||||||
emm_proc_attach_type_t type;
|
emm_proc_attach_type_t type;
|
||||||
|
|
||||||
LOG_FUNC_IN;
|
LOG_FUNC_IN;
|
||||||
@@ -639,6 +640,16 @@ int emm_recv_attach_request(unsigned int ueid, const attach_request_msg *msg,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Execute the requested UE attach procedure */
|
/* Execute the requested UE attach procedure */
|
||||||
|
#warning " TODO gea to be review"
|
||||||
|
|
||||||
|
if (msg->msnetworkcapability.msnetworkcapabilityvalue.length > 0) {
|
||||||
|
gea = (msg->msnetworkcapability.msnetworkcapabilityvalue.value[0] & 0x80) >> 1;
|
||||||
|
|
||||||
|
if ((gea) && (msg->msnetworkcapability.msnetworkcapabilityvalue.length >= 2)) {
|
||||||
|
gea |= ((msg->msnetworkcapability.msnetworkcapabilityvalue.value[1] & 0x60) >> 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
rc = emm_proc_attach_request(ueid, type,
|
rc = emm_proc_attach_request(ueid, type,
|
||||||
msg->naskeysetidentifier.tsc != NAS_KEY_SET_IDENTIFIER_MAPPED,
|
msg->naskeysetidentifier.tsc != NAS_KEY_SET_IDENTIFIER_MAPPED,
|
||||||
msg->naskeysetidentifier.naskeysetidentifier,
|
msg->naskeysetidentifier.naskeysetidentifier,
|
||||||
@@ -648,13 +659,7 @@ int emm_recv_attach_request(unsigned int ueid, const attach_request_msg *msg,
|
|||||||
msg->uenetworkcapability.ucs2,
|
msg->uenetworkcapability.ucs2,
|
||||||
msg->uenetworkcapability.uea,
|
msg->uenetworkcapability.uea,
|
||||||
msg->uenetworkcapability.uia,
|
msg->uenetworkcapability.uia,
|
||||||
0x00 |
|
gea,
|
||||||
//((msg->uenetworkcapability.spare & 0x7) << 5) | // spare coded as zero
|
|
||||||
((msg->uenetworkcapability.csfb & 0x1) << 4) |
|
|
||||||
((msg->uenetworkcapability.lpp & 0x1) << 3) |
|
|
||||||
((msg->uenetworkcapability.lcs & 0x1) << 2) |
|
|
||||||
((msg->uenetworkcapability.srvcc & 0x1) << 1) |
|
|
||||||
(msg->uenetworkcapability.nf & 0x1),
|
|
||||||
msg->uenetworkcapability.umts_present,
|
msg->uenetworkcapability.umts_present,
|
||||||
msg->uenetworkcapability.gprs_present,
|
msg->uenetworkcapability.gprs_present,
|
||||||
&msg->esmmessagecontainer.esmmessagecontainercontents);
|
&msg->esmmessagecontainer.esmmessagecontainercontents);
|
||||||
|
|||||||
@@ -132,7 +132,7 @@ int emm_sap_send(emm_sap_t *msg)
|
|||||||
rc = emm_as_send(&msg->u.emm_as);
|
rc = emm_as_send(&msg->u.emm_as);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
else if ( (primitive > EMMCN_PRIMITIVE_MIN) &&
|
else if ( (primitive > EMMCN_PRIMITIVE_MIN) &&
|
||||||
(primitive < EMMCN_PRIMITIVE_MAX) ) {
|
(primitive < EMMCN_PRIMITIVE_MAX) ) {
|
||||||
/* Forward to the EMMCN-SAP */
|
/* Forward to the EMMCN-SAP */
|
||||||
|
|||||||
@@ -133,7 +133,7 @@ typedef enum {
|
|||||||
EMMAS_CELL_INFO_RES = _EMMAS_CELL_INFO_RES,
|
EMMAS_CELL_INFO_RES = _EMMAS_CELL_INFO_RES,
|
||||||
EMMAS_CELL_INFO_IND = _EMMAS_CELL_INFO_IND,
|
EMMAS_CELL_INFO_IND = _EMMAS_CELL_INFO_IND,
|
||||||
|
|
||||||
#ifdef EPC_BUILD
|
#ifdef NAS_BUILT_IN_EPC
|
||||||
EMMCN_AUTHENTICATION_PARAM_RES = _EMMCN_AUTHENTICATION_PARAM_RES,
|
EMMCN_AUTHENTICATION_PARAM_RES = _EMMCN_AUTHENTICATION_PARAM_RES,
|
||||||
EMMCN_AUTHENTICATION_PARAM_FAIL = _EMMCN_AUTHENTICATION_PARAM_FAIL,
|
EMMCN_AUTHENTICATION_PARAM_FAIL = _EMMCN_AUTHENTICATION_PARAM_FAIL,
|
||||||
EMMCN_DEREGISTER_UE = _EMMCN_DEREGISTER_UE,
|
EMMCN_DEREGISTER_UE = _EMMCN_DEREGISTER_UE,
|
||||||
@@ -171,7 +171,7 @@ typedef struct {
|
|||||||
emm_reg_t emm_reg; /* EMMREG-SAP primitives */
|
emm_reg_t emm_reg; /* EMMREG-SAP primitives */
|
||||||
emm_esm_t emm_esm; /* EMMESM-SAP primitives */
|
emm_esm_t emm_esm; /* EMMESM-SAP primitives */
|
||||||
emm_as_t emm_as; /* EMMAS-SAP primitives */
|
emm_as_t emm_as; /* EMMAS-SAP primitives */
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
emm_cn_t emm_cn; /* EMMCN-SAP primitives */
|
emm_cn_t emm_cn; /* EMMCN-SAP primitives */
|
||||||
#endif
|
#endif
|
||||||
} u;
|
} u;
|
||||||
|
|||||||
@@ -666,7 +666,7 @@ int esm_proc_pdn_connectivity_request(emm_data_context_t *ctx, int pti,
|
|||||||
(apn) ? (char *)(apn->value) : "null",
|
(apn) ? (char *)(apn->value) : "null",
|
||||||
(pdn_addr) ? (char *)(pdn_addr->value) : "null");
|
(pdn_addr) ? (char *)(pdn_addr->value) : "null");
|
||||||
|
|
||||||
#if !defined(EPC_BUILD)
|
#if !defined(NAS_BUILT_IN_EPC)
|
||||||
|
|
||||||
/* UE identifier sanity check */
|
/* UE identifier sanity check */
|
||||||
if (ctx->ueid >= ESM_DATA_NB_UE_MAX) {
|
if (ctx->ueid >= ESM_DATA_NB_UE_MAX) {
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ Description Defines internal private data handled by EPS Session
|
|||||||
#include "mme_api.h"
|
#include "mme_api.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
# include "tree.h"
|
# include "tree.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -244,7 +244,7 @@ typedef struct {
|
|||||||
* ESM contexts
|
* ESM contexts
|
||||||
* ------------
|
* ------------
|
||||||
*/
|
*/
|
||||||
# if defined(EPC_BUILD)
|
# if defined(NAS_BUILT_IN_EPC)
|
||||||
/* Use a tree for ue data context within MME */
|
/* Use a tree for ue data context within MME */
|
||||||
RB_HEAD(esm_data_context_map, esm_data_context_s) ctx_map;
|
RB_HEAD(esm_data_context_map, esm_data_context_s) ctx_map;
|
||||||
# else
|
# else
|
||||||
@@ -253,7 +253,7 @@ typedef struct {
|
|||||||
# endif
|
# endif
|
||||||
} esm_data_t;
|
} esm_data_t;
|
||||||
|
|
||||||
# if defined(EPC_BUILD)
|
# if defined(NAS_BUILT_IN_EPC)
|
||||||
struct esm_data_context_s *esm_data_context_get(
|
struct esm_data_context_s *esm_data_context_get(
|
||||||
esm_data_t *esm_data, unsigned int _ueid);
|
esm_data_t *esm_data, unsigned int _ueid);
|
||||||
|
|
||||||
@@ -282,10 +282,10 @@ esm_data_t _esm_data;
|
|||||||
|
|
||||||
extern char ip_addr_str[100];
|
extern char ip_addr_str[100];
|
||||||
|
|
||||||
extern inline char *esm_data_get_ipv4_addr(const OctetString *ip_addr);
|
extern char *esm_data_get_ipv4_addr(const OctetString *ip_addr);
|
||||||
|
|
||||||
extern inline char *esm_data_get_ipv6_addr(const OctetString *ip_addr);
|
extern char *esm_data_get_ipv6_addr(const OctetString *ip_addr);
|
||||||
|
|
||||||
extern inline char *esm_data_get_ipv4v6_addr(const OctetString *ip_addr);
|
extern char *esm_data_get_ipv4v6_addr(const OctetString *ip_addr);
|
||||||
|
|
||||||
#endif /* __ESMDATA_H__*/
|
#endif /* __ESMDATA_H__*/
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ static const char *_esm_ebr_state_str[ESM_EBR_STATE_MAX] = {
|
|||||||
* ----------------------------------
|
* ----------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if !defined(EPC_BUILD)
|
#if !defined(NAS_BUILT_IN_EPC)
|
||||||
static esm_ebr_data_t _esm_ebr_data[ESM_EBR_NB_UE_MAX];
|
static esm_ebr_data_t _esm_ebr_data[ESM_EBR_NB_UE_MAX];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -151,7 +151,7 @@ void esm_ebr_initialize(
|
|||||||
#endif
|
#endif
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
#if !defined(EPC_BUILD)
|
#if !defined(NAS_BUILT_IN_EPC)
|
||||||
int ueid, i;
|
int ueid, i;
|
||||||
|
|
||||||
LOG_FUNC_IN;
|
LOG_FUNC_IN;
|
||||||
@@ -249,7 +249,7 @@ int esm_ebr_assign(emm_data_context_t *ctx, int ebi)
|
|||||||
LOG_FUNC_RETURN(ESM_EBI_UNASSIGNED);
|
LOG_FUNC_RETURN(ESM_EBI_UNASSIGNED);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
ctx->esm_data_ctx.ebr.context[ebi - ESM_EBI_MIN] = ebr_ctx;
|
ctx->esm_data_ctx.ebr.context[ebi - ESM_EBI_MIN] = ebr_ctx;
|
||||||
#else
|
#else
|
||||||
_esm_ebr_data[ueid].context[ebi - ESM_EBI_MIN] = ebr_ctx;
|
_esm_ebr_data[ueid].context[ebi - ESM_EBI_MIN] = ebr_ctx;
|
||||||
|
|||||||
@@ -128,7 +128,7 @@ int esm_ebr_context_create(
|
|||||||
esm_ctx = &_esm_data;
|
esm_ctx = &_esm_data;
|
||||||
#endif
|
#endif
|
||||||
#ifdef NAS_MME
|
#ifdef NAS_MME
|
||||||
# if defined(EPC_BUILD)
|
# if defined(NAS_BUILT_IN_EPC)
|
||||||
esm_ctx = &ctx->esm_data_ctx;
|
esm_ctx = &ctx->esm_data_ctx;
|
||||||
# else
|
# else
|
||||||
|
|
||||||
@@ -369,7 +369,7 @@ int esm_ebr_context_release(
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef NAS_MME
|
#ifdef NAS_MME
|
||||||
# if defined(EPC_BUILD)
|
# if defined(NAS_BUILT_IN_EPC)
|
||||||
esm_ctx = &ctx->esm_data_ctx;
|
esm_ctx = &ctx->esm_data_ctx;
|
||||||
# else
|
# else
|
||||||
|
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ void esm_main_initialize(void)
|
|||||||
LOG_TRACE(ERROR, "ESM-MAIN - Failed to get MME configuration data");
|
LOG_TRACE(ERROR, "ESM-MAIN - Failed to get MME configuration data");
|
||||||
}
|
}
|
||||||
|
|
||||||
# if !defined(EPC_BUILD)
|
# if !defined(NAS_BUILT_IN_EPC)
|
||||||
|
|
||||||
/* Initialize ESM contexts */
|
/* Initialize ESM contexts */
|
||||||
for (i = 0; i < ESM_DATA_NB_UE_MAX; i++) {
|
for (i = 0; i < ESM_DATA_NB_UE_MAX; i++) {
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ Description Defines EPS Session Management messages
|
|||||||
#include "TLVDecoder.h"
|
#include "TLVDecoder.h"
|
||||||
#include "TLVEncoder.h"
|
#include "TLVEncoder.h"
|
||||||
|
|
||||||
#if ((defined(EPC_BUILD) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(UE_BUILD) && defined(NAS_UE)))
|
#if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
|
||||||
# include "nas_itti_messaging.h"
|
# include "nas_itti_messaging.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -92,12 +92,12 @@ int esm_msg_decode(ESM_msg *msg, uint8_t *buffer, uint32_t len)
|
|||||||
int header_result;
|
int header_result;
|
||||||
int decode_result;
|
int decode_result;
|
||||||
|
|
||||||
#if ((defined(EPC_BUILD) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(UE_BUILD) && defined(NAS_UE)))
|
#if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
|
||||||
uint8_t *buffer_log = buffer;
|
uint8_t *buffer_log = buffer;
|
||||||
uint32_t len_log = len;
|
uint32_t len_log = len;
|
||||||
int down_link;
|
int down_link;
|
||||||
|
|
||||||
# if ((defined(EPC_BUILD) && defined(NAS_MME)))
|
# if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)))
|
||||||
down_link = 0;
|
down_link = 0;
|
||||||
# else
|
# else
|
||||||
down_link = 1;
|
down_link = 1;
|
||||||
@@ -219,7 +219,7 @@ int esm_msg_decode(ESM_msg *msg, uint8_t *buffer, uint32_t len)
|
|||||||
"(%u)", msg->header.message_type, decode_result);
|
"(%u)", msg->header.message_type, decode_result);
|
||||||
LOG_FUNC_RETURN (decode_result);
|
LOG_FUNC_RETURN (decode_result);
|
||||||
} else {
|
} else {
|
||||||
#if ((defined(EPC_BUILD) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(UE_BUILD) && defined(NAS_UE)))
|
#if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
|
||||||
/* Message has been decoded and security header removed, handle it has a plain message */
|
/* Message has been decoded and security header removed, handle it has a plain message */
|
||||||
nas_itti_plain_msg((char *) buffer_log, (nas_message_t *) msg, len_log, down_link);
|
nas_itti_plain_msg((char *) buffer_log, (nas_message_t *) msg, len_log, down_link);
|
||||||
#endif
|
#endif
|
||||||
@@ -252,11 +252,11 @@ int esm_msg_encode(ESM_msg *msg, uint8_t *buffer, uint32_t len)
|
|||||||
int header_result;
|
int header_result;
|
||||||
int encode_result;
|
int encode_result;
|
||||||
|
|
||||||
#if ((defined(EPC_BUILD) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(UE_BUILD) && defined(NAS_UE)))
|
#if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
|
||||||
uint8_t *buffer_log = buffer;
|
uint8_t *buffer_log = buffer;
|
||||||
int down_link;
|
int down_link;
|
||||||
|
|
||||||
# if ((defined(EPC_BUILD) && defined(NAS_MME)))
|
# if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)))
|
||||||
down_link = 1;
|
down_link = 1;
|
||||||
# else
|
# else
|
||||||
down_link = 0;
|
down_link = 0;
|
||||||
@@ -378,7 +378,7 @@ int esm_msg_encode(ESM_msg *msg, uint8_t *buffer, uint32_t len)
|
|||||||
LOG_TRACE(ERROR, "ESM-MSG - Failed to encode L3 ESM message 0x%x "
|
LOG_TRACE(ERROR, "ESM-MSG - Failed to encode L3 ESM message 0x%x "
|
||||||
"(%d)", msg->header.message_type, encode_result);
|
"(%d)", msg->header.message_type, encode_result);
|
||||||
} else {
|
} else {
|
||||||
#if ((defined(EPC_BUILD) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(UE_BUILD) && defined(NAS_UE)))
|
#if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
|
||||||
nas_itti_plain_msg((char *) buffer_log, (nas_message_t *) msg, header_result + encode_result, down_link);
|
nas_itti_plain_msg((char *) buffer_log, (nas_message_t *) msg, header_result + encode_result, down_link);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -80,6 +80,9 @@ int decode_ue_network_capability(UeNetworkCapability *uenetworkcapability, uint8
|
|||||||
uenetworkcapability->gprs_present =1;
|
uenetworkcapability->gprs_present =1;
|
||||||
LOG_TRACE(INFO, "uenetworkcapability decoded GPRS\n");
|
LOG_TRACE(INFO, "uenetworkcapability decoded GPRS\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#warning "Force GPRS present if UMTS present"
|
||||||
|
uenetworkcapability->gprs_present =1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -96,18 +96,32 @@ int encode_ue_security_capability(UeSecurityCapability *uesecuritycapability, ui
|
|||||||
*(buffer + encoded) = uesecuritycapability->eia;
|
*(buffer + encoded) = uesecuritycapability->eia;
|
||||||
encoded++;
|
encoded++;
|
||||||
|
|
||||||
|
// From ETSI TS 124 301 V10.15.0 (2014-10) 9.9.3.36 Security capability:
|
||||||
|
// Octets 5, 6, and 7 are optional. If octet 5 is included, then also octet 6 shall be included and octet 7 may be included.
|
||||||
|
// If a UE did not indicate support of any security algorithm for Gb mode, octet 7 shall not be included. If the UE did not
|
||||||
|
// indicate support of any security algorithm for Iu mode and Gb mode, octets 5, 6, and 7 shall not be included.
|
||||||
|
// If the UE did not indicate support of any security algorithm for Iu mode but indicated support of a security algorithm for
|
||||||
|
// Gb mode, octets 5, 6, and 7 shall be included. In this case octets 5 and 6 are filled with the value of zeroes.
|
||||||
if (uesecuritycapability->umts_present) {
|
if (uesecuritycapability->umts_present) {
|
||||||
*(buffer + encoded) = uesecuritycapability->uea;
|
*(buffer + encoded) = uesecuritycapability->uea;
|
||||||
encoded++;
|
encoded++;
|
||||||
*(buffer + encoded) = 0x00 |
|
*(buffer + encoded) = 0x00 |
|
||||||
(uesecuritycapability->uia & 0x7f);
|
(uesecuritycapability->uia & 0x7f);
|
||||||
encoded++;
|
encoded++;
|
||||||
#warning "force gea to 0x60 if umts security capability present"
|
|
||||||
//if (uesecuritycapability->gprs_present) {
|
if (uesecuritycapability->gprs_present) {
|
||||||
*(buffer + encoded) = 0x00 | 0x60;
|
*(buffer + encoded) = 0x00 | (uesecuritycapability->gea & 0x7f);
|
||||||
//(uesecuritycapability->gea & 0x7f);
|
encoded++;
|
||||||
encoded++;
|
}
|
||||||
//}
|
} else {
|
||||||
|
if (uesecuritycapability->gprs_present) {
|
||||||
|
*(buffer + encoded) = 0x00;
|
||||||
|
encoded++;
|
||||||
|
*(buffer + encoded) = 0x00;
|
||||||
|
encoded++;
|
||||||
|
*(buffer + encoded) = 0x00 | (uesecuritycapability->gea & 0x7f);
|
||||||
|
encoded++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*lenPtr = encoded - 1 - ((iei > 0) ? 1 : 0);
|
*lenPtr = encoded - 1 - ((iei > 0) ? 1 : 0);
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ Description NAS procedure functions triggered by the network
|
|||||||
** Others: None **
|
** Others: None **
|
||||||
** **
|
** **
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
#if defined(EPC_BUILD) && defined(NAS_MME)
|
#if defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)
|
||||||
void nas_network_initialize(mme_config_t *mme_config_p)
|
void nas_network_initialize(mme_config_t *mme_config_p)
|
||||||
#else
|
#else
|
||||||
void nas_network_initialize(void)
|
void nas_network_initialize(void)
|
||||||
@@ -87,7 +87,7 @@ void nas_network_initialize(void)
|
|||||||
|
|
||||||
#ifdef NAS_MME
|
#ifdef NAS_MME
|
||||||
/* Initialize the internal NAS processing data */
|
/* Initialize the internal NAS processing data */
|
||||||
# if defined(EPC_BUILD)
|
# if defined(NAS_BUILT_IN_EPC)
|
||||||
nas_timer_init();
|
nas_timer_init();
|
||||||
nas_proc_initialize(mme_config_p);
|
nas_proc_initialize(mme_config_p);
|
||||||
# else
|
# else
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ Description NAS procedure functions triggered by the network
|
|||||||
|
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
#if defined(EPC_BUILD) && defined(NAS_MME)
|
#if defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)
|
||||||
# include "mme_config.h"
|
# include "mme_config.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -66,7 +66,7 @@ Description NAS procedure functions triggered by the network
|
|||||||
/****************** E X P O R T E D F U N C T I O N S ******************/
|
/****************** E X P O R T E D F U N C T I O N S ******************/
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
#if defined(EPC_BUILD) && defined(NAS_MME)
|
#if defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)
|
||||||
void nas_network_initialize(mme_config_t *mme_config_p);
|
void nas_network_initialize(mme_config_t *mme_config_p);
|
||||||
#else
|
#else
|
||||||
void nas_network_initialize(void);
|
void nas_network_initialize(void);
|
||||||
|
|||||||
@@ -140,7 +140,7 @@ void nas_proc_initialize(emm_indication_callback_t emm_cb,
|
|||||||
** Others: None **
|
** Others: None **
|
||||||
** **
|
** **
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
# if defined(EPC_BUILD)
|
# if defined(NAS_BUILT_IN_EPC)
|
||||||
void nas_proc_initialize(mme_config_t *mme_config_p)
|
void nas_proc_initialize(mme_config_t *mme_config_p)
|
||||||
{
|
{
|
||||||
LOG_FUNC_IN;
|
LOG_FUNC_IN;
|
||||||
@@ -1482,7 +1482,7 @@ int nas_proc_ul_transfer_ind(UInt32_t ueid, const Byte_t *data, UInt32_t len)
|
|||||||
LOG_FUNC_RETURN (rc);
|
LOG_FUNC_RETURN (rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
# if defined(EPC_BUILD)
|
# if defined(NAS_BUILT_IN_EPC)
|
||||||
int nas_proc_auth_param_res(emm_cn_auth_res_t *emm_cn_auth_res)
|
int nas_proc_auth_param_res(emm_cn_auth_res_t *emm_cn_auth_res)
|
||||||
{
|
{
|
||||||
int rc = RETURNerror;
|
int rc = RETURNerror;
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ Description NAS procedure call manager
|
|||||||
#ifndef __NAS_PROC_H__
|
#ifndef __NAS_PROC_H__
|
||||||
#define __NAS_PROC_H__
|
#define __NAS_PROC_H__
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
# include "mme_config.h"
|
# include "mme_config.h"
|
||||||
# include "emm_cnDef.h"
|
# include "emm_cnDef.h"
|
||||||
#endif
|
#endif
|
||||||
@@ -74,7 +74,7 @@ void nas_proc_initialize(emm_indication_callback_t emm_cb,
|
|||||||
esm_indication_callback_t esm_cb, const char *imei);
|
esm_indication_callback_t esm_cb, const char *imei);
|
||||||
#endif
|
#endif
|
||||||
#ifdef NAS_MME
|
#ifdef NAS_MME
|
||||||
# if defined(EPC_BUILD)
|
# if defined(NAS_BUILT_IN_EPC)
|
||||||
void nas_proc_initialize(mme_config_t *mme_config_p);
|
void nas_proc_initialize(mme_config_t *mme_config_p);
|
||||||
# else
|
# else
|
||||||
void nas_proc_initialize(void);
|
void nas_proc_initialize(void);
|
||||||
@@ -159,7 +159,7 @@ int nas_proc_ul_transfer_ind(UInt32_t ueid, const Byte_t *data, UInt32_t len);
|
|||||||
* NAS procedures triggered by the mme applicative layer
|
* NAS procedures triggered by the mme applicative layer
|
||||||
* --------------------------------------------------------------------------
|
* --------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
#if defined(NAS_MME) && defined(EPC_BUILD)
|
#if defined(NAS_MME) && defined(NAS_BUILT_IN_EPC)
|
||||||
int nas_proc_auth_param_res(emm_cn_auth_res_t *emm_cn_auth_res);
|
int nas_proc_auth_param_res(emm_cn_auth_res_t *emm_cn_auth_res);
|
||||||
int nas_proc_auth_param_fail(emm_cn_auth_fail_t *emm_cn_auth_fail);
|
int nas_proc_auth_param_fail(emm_cn_auth_fail_t *emm_cn_auth_fail);
|
||||||
int nas_proc_deregister_ue(UInt32_t ue_id);
|
int nas_proc_deregister_ue(UInt32_t ue_id);
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ Description Usefull logging functions
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
#include "nas_log.h"
|
#include "nas_log.h"
|
||||||
#if defined(UE_BUILD) && defined(NAS_UE)
|
#if defined(NAS_BUILT_IN_UE) && defined(NAS_UE)
|
||||||
int nas_log_func_indent;
|
int nas_log_func_indent;
|
||||||
#else
|
#else
|
||||||
#include <stdio.h> // stderr, sprintf, fprintf, vfprintf
|
#include <stdio.h> // stderr, sprintf, fprintf, vfprintf
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ Description Usefull logging functions
|
|||||||
#ifndef __NAS_LOG_H__
|
#ifndef __NAS_LOG_H__
|
||||||
#define __NAS_LOG_H__
|
#define __NAS_LOG_H__
|
||||||
|
|
||||||
#if defined(UE_BUILD) && defined(NAS_UE)
|
#if defined(NAS_BUILT_IN_UE) && defined(NAS_UE)
|
||||||
# include "UTIL/LOG/log.h"
|
# include "UTIL/LOG/log.h"
|
||||||
# undef LOG_TRACE
|
# undef LOG_TRACE
|
||||||
#endif
|
#endif
|
||||||
@@ -102,7 +102,7 @@ typedef enum {
|
|||||||
/****************** E X P O R T E D F U N C T I O N S ******************/
|
/****************** E X P O R T E D F U N C T I O N S ******************/
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
#if defined(UE_BUILD) && defined(NAS_UE)
|
#if defined(NAS_BUILT_IN_UE) && defined(NAS_UE)
|
||||||
# define LOG_TRACE(s, x, args...) \
|
# define LOG_TRACE(s, x, args...) \
|
||||||
do { \
|
do { \
|
||||||
switch (s) { \
|
switch (s) { \
|
||||||
|
|||||||
@@ -278,7 +278,7 @@ int nas_timer_start(long sec, nas_timer_callback_t cb, void *args)
|
|||||||
/* Insert the new entry into the timer queue */
|
/* Insert the new entry into the timer queue */
|
||||||
_nas_timer_db_insert_entry(id, te);
|
_nas_timer_db_insert_entry(id, te);
|
||||||
#if defined(ENABLE_ITTI)
|
#if defined(ENABLE_ITTI)
|
||||||
# if defined(EPC_BUILD)
|
# if defined(NAS_BUILT_IN_EPC)
|
||||||
ret = timer_setup(sec, 0, TASK_NAS_MME, INSTANCE_DEFAULT, TIMER_PERIODIC, args, &timer_id);
|
ret = timer_setup(sec, 0, TASK_NAS_MME, INSTANCE_DEFAULT, TIMER_PERIODIC, args, &timer_id);
|
||||||
# else
|
# else
|
||||||
ret = timer_setup(sec, 0, TASK_NAS_UE, INSTANCE_DEFAULT, TIMER_PERIODIC, args, &timer_id);
|
ret = timer_setup(sec, 0, TASK_NAS_UE, INSTANCE_DEFAULT, TIMER_PERIODIC, args, &timer_id);
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ int nas_timer_start(long sec, nas_timer_callback_t cb, void *args);
|
|||||||
int nas_timer_stop(int id);
|
int nas_timer_stop(int id);
|
||||||
int nas_timer_restart(int id);
|
int nas_timer_restart(int id);
|
||||||
|
|
||||||
#if defined(EPC_BUILD)
|
#if defined(NAS_BUILT_IN_EPC)
|
||||||
void nas_timer_handle_signal_expiry(long timer_id, void *arg_p);
|
void nas_timer_handle_signal_expiry(long timer_id, void *arg_p);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ Description Defines a list of PLMN network operators
|
|||||||
/********************* G L O B A L C O N S T A N T S *******************/
|
/********************* G L O B A L C O N S T A N T S *******************/
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#define TEST_PLMN {0,0,0x0f,1,1,0} // 00101
|
||||||
#define SFR_PLMN_1 {0,2,0x0f,8,0,1} // 20810
|
#define SFR_PLMN_1 {0,2,0x0f,8,0,1} // 20810
|
||||||
#define SFR_PLMN_2 {0,2,0x0f,8,1,1} // 20811
|
#define SFR_PLMN_2 {0,2,0x0f,8,1,1} // 20811
|
||||||
#define SFR_PLMN_3 {0,2,0x0f,8,3,1} // 20813
|
#define SFR_PLMN_3 {0,2,0x0f,8,3,1} // 20813
|
||||||
@@ -71,7 +72,8 @@ Description Defines a list of PLMN network operators
|
|||||||
* PLMN network operator record index
|
* PLMN network operator record index
|
||||||
*/
|
*/
|
||||||
enum {
|
enum {
|
||||||
SFR1=0,
|
TEST1=0,
|
||||||
|
SFR1,
|
||||||
SFR2,
|
SFR2,
|
||||||
SFR3,
|
SFR3,
|
||||||
TM1,
|
TM1,
|
||||||
@@ -104,6 +106,7 @@ typedef struct {
|
|||||||
* The list of PLMN network operator records
|
* The list of PLMN network operator records
|
||||||
*/
|
*/
|
||||||
network_record_t network_records[] = {
|
network_record_t network_records[] = {
|
||||||
|
{00101, TEST_PLMN, "Test network", "OAI4G", 0x0001, 0xfffd},
|
||||||
{20810, SFR_PLMN_1, "SFR France", "SFR", 0x0001, 0xfffd},
|
{20810, SFR_PLMN_1, "SFR France", "SFR", 0x0001, 0xfffd},
|
||||||
{20811, SFR_PLMN_2, "SFR France", "SFR", 0x0001, 0xfffd},
|
{20811, SFR_PLMN_2, "SFR France", "SFR", 0x0001, 0xfffd},
|
||||||
{20813, SFR_PLMN_3, "SFR France", "SFR", 0x0001, 0xfffd},
|
{20813, SFR_PLMN_3, "SFR France", "SFR", 0x0001, 0xfffd},
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ Description Implements the utility used to generate data stored in the
|
|||||||
#include <stdlib.h> // exit, free
|
#include <stdlib.h> // exit, free
|
||||||
#include <string.h> // memset, strncpy
|
#include <string.h> // memset, strncpy
|
||||||
|
|
||||||
#define SELECTED_PLMN SFR1
|
#define SELECTED_PLMN TEST1
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
/**************** E X T E R N A L D E F I N I T I O N S ****************/
|
/**************** E X T E R N A L D E F I N I T I O N S ****************/
|
||||||
@@ -331,31 +331,34 @@ static void _gen_emm_data(emm_nvdata_t* data)
|
|||||||
* International Mobile Subscriber Identity
|
* International Mobile Subscriber Identity
|
||||||
* IMSI = MCC + MNC + MSIN = 208 (France) + 10 (SFR) + 00001234
|
* IMSI = MCC + MNC + MSIN = 208 (France) + 10 (SFR) + 00001234
|
||||||
*/
|
*/
|
||||||
#warning "IMSI 208.10.000001234"
|
|
||||||
/* data->imsi.length = 8;
|
/* data->imsi.length = 8;
|
||||||
data->imsi.u.num.parity = 0x0; // Type of identity = IMSI, even
|
data->imsi.u.num.parity = 0x0; // Type of identity = IMSI, even
|
||||||
data->imsi.u.num.digit1 = 2; // MCC digit 1
|
data->imsi.u.num.digit1 = 2; // MCC digit 1
|
||||||
data->imsi.u.num.digit2 = 0; // MCC digit 2
|
data->imsi.u.num.digit2 = 0; // MCC digit 2
|
||||||
data->imsi.u.num.digit3 = 8; // MCC digit 3
|
data->imsi.u.num.digit3 = 8; // MCC digit 3
|
||||||
data->imsi.u.num.digit4 = 1; // MNC digit 1
|
data->imsi.u.num.digit4 = 1; // MNC digit 1
|
||||||
data->imsi.u.num.digit5 = 0; // MNC digit 2
|
data->imsi.u.num.digit5 = 0; // MNC digit 2
|
||||||
data->imsi.u.num.digit6 = 0xF; // MNC digit 3
|
data->imsi.u.num.digit6 = 0xF; // MNC digit 3
|
||||||
data->imsi.u.num.digit7 = 0;
|
data->imsi.u.num.digit7 = 0;
|
||||||
data->imsi.u.num.digit8 = 0;
|
data->imsi.u.num.digit8 = 0;
|
||||||
data->imsi.u.num.digit9 = 0;
|
data->imsi.u.num.digit9 = 0;
|
||||||
data->imsi.u.num.digit10 = 0;
|
data->imsi.u.num.digit10 = 0;
|
||||||
data->imsi.u.num.digit11 = 1;
|
data->imsi.u.num.digit11 = 1;
|
||||||
data->imsi.u.num.digit12 = 2;
|
data->imsi.u.num.digit12 = 2;
|
||||||
data->imsi.u.num.digit13 = 3;
|
data->imsi.u.num.digit13 = 3;
|
||||||
data->imsi.u.num.digit14 = 4;
|
data->imsi.u.num.digit14 = 4;
|
||||||
data->imsi.u.num.digit15 = 0xF;*/
|
data->imsi.u.num.digit15 = 0xF;*/
|
||||||
|
/*
|
||||||
|
* International Mobile Subscriber Identity
|
||||||
|
* IMSI = MCC + MNC + MSIN = 001 + 01 + 00001234
|
||||||
|
*/
|
||||||
data->imsi.length = 8;
|
data->imsi.length = 8;
|
||||||
data->imsi.u.num.parity = 0x0; // Type of identity = IMSI, even
|
data->imsi.u.num.parity = 0x0; // Type of identity = IMSI, even
|
||||||
data->imsi.u.num.digit1 = 2; // MCC digit 1
|
data->imsi.u.num.digit1 = 0; // MCC digit 1
|
||||||
data->imsi.u.num.digit2 = 0; // MCC digit 2
|
data->imsi.u.num.digit2 = 0; // MCC digit 2
|
||||||
data->imsi.u.num.digit3 = 8; // MCC digit 3
|
data->imsi.u.num.digit3 = 1; // MCC digit 3
|
||||||
data->imsi.u.num.digit4 = 1; // MNC digit 1
|
data->imsi.u.num.digit4 = 0; // MNC digit 1
|
||||||
data->imsi.u.num.digit5 = 0; // MNC digit 2
|
data->imsi.u.num.digit5 = 1; // MNC digit 2
|
||||||
data->imsi.u.num.digit6 = 0;
|
data->imsi.u.num.digit6 = 0;
|
||||||
data->imsi.u.num.digit7 = 0;
|
data->imsi.u.num.digit7 = 0;
|
||||||
data->imsi.u.num.digit8 = 0;
|
data->imsi.u.num.digit8 = 0;
|
||||||
@@ -370,11 +373,11 @@ static void _gen_emm_data(emm_nvdata_t* data)
|
|||||||
/*
|
/*
|
||||||
* Last registered home PLMN
|
* Last registered home PLMN
|
||||||
*/
|
*/
|
||||||
data->rplmn.MCCdigit1 = 2;
|
data->rplmn.MCCdigit1 = 0;
|
||||||
data->rplmn.MCCdigit2 = 0;
|
data->rplmn.MCCdigit2 = 0;
|
||||||
data->rplmn.MCCdigit3 = 8;
|
data->rplmn.MCCdigit3 = 1;
|
||||||
data->rplmn.MNCdigit1 = 1;
|
data->rplmn.MNCdigit1 = 0;
|
||||||
data->rplmn.MNCdigit2 = 0;
|
data->rplmn.MNCdigit2 = 1;
|
||||||
data->rplmn.MNCdigit3 = 0xf;
|
data->rplmn.MNCdigit3 = 0xf;
|
||||||
#endif
|
#endif
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -27,20 +27,20 @@
|
|||||||
|
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
Source usim_data.c
|
Source usim_data.c
|
||||||
|
|
||||||
Version 0.1
|
Version 0.1
|
||||||
|
|
||||||
Date 2012/10/31
|
Date 2012/10/31
|
||||||
|
|
||||||
Product USIM data generator
|
Product USIM data generator
|
||||||
|
|
||||||
Subsystem USIM data generator main process
|
Subsystem USIM data generator main process
|
||||||
|
|
||||||
Author Frederic Maurel
|
Author Frederic Maurel
|
||||||
|
|
||||||
Description Implements the utility used to generate data stored in the
|
Description Implements the utility used to generate data stored in the
|
||||||
USIM application
|
USIM application
|
||||||
|
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
@@ -53,7 +53,7 @@
|
|||||||
#include <stdlib.h> // exit
|
#include <stdlib.h> // exit
|
||||||
#include <string.h> // memset, memcpy, strncpy
|
#include <string.h> // memset, memcpy, strncpy
|
||||||
|
|
||||||
#define SELECTED_PLMN SFR1
|
#define SELECTED_PLMN TEST1
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
/**************** E X T E R N A L D E F I N I T I O N S ****************/
|
/**************** E X T E R N A L D E F I N I T I O N S ****************/
|
||||||
@@ -104,7 +104,6 @@ int main (int argc, const char* argv[])
|
|||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
usim_data_t usim_data;
|
usim_data_t usim_data;
|
||||||
int i;
|
|
||||||
|
|
||||||
unsigned char gen_data;
|
unsigned char gen_data;
|
||||||
|
|
||||||
@@ -115,12 +114,12 @@ int main (int argc, const char* argv[])
|
|||||||
fprintf(stderr, "Invalid parameter\n");
|
fprintf(stderr, "Invalid parameter\n");
|
||||||
_display_usage(argv[0]);
|
_display_usage(argv[0]);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
} else if ((strcmp(argv[1], "--gen") == 0)
|
} else if ( (strcmp(argv[1], "--gen") == 0) ||
|
||||||
|| (strcmp(argv[1], "-g") == 0)) {
|
(strcmp(argv[1], "-g") == 0) ) {
|
||||||
/* Generate USIM data files */
|
/* Generate USIM data files */
|
||||||
gen_data = TRUE;
|
gen_data = TRUE;
|
||||||
} else if ((strcmp(argv[1], "--print") == 0)
|
} else if ( (strcmp(argv[1], "--print") == 0) ||
|
||||||
|| (strcmp(argv[1], "-p") == 0)) {
|
(strcmp(argv[1], "-p") == 0) ) {
|
||||||
/* Display content of USIM data files */
|
/* Display content of USIM data files */
|
||||||
gen_data = FALSE;
|
gen_data = FALSE;
|
||||||
} else {
|
} else {
|
||||||
@@ -164,31 +163,31 @@ int main (int argc, const char* argv[])
|
|||||||
* International Mobile Subscriber Identity
|
* International Mobile Subscriber Identity
|
||||||
* IMSI = MCC + MNC + MSIN = 208 (France) + 10 (SFR) + 00001234
|
* IMSI = MCC + MNC + MSIN = 208 (France) + 10 (SFR) + 00001234
|
||||||
*/
|
*/
|
||||||
#warning "IMSI 208.10.00001234"
|
//#warning "IMSI 208.10.00001234"
|
||||||
/* usim_data.imsi.length = 8;
|
/* usim_data.imsi.length = 8;
|
||||||
usim_data.imsi.u.num.parity = EVEN_PARITY; // Parity: even
|
usim_data.imsi.u.num.parity = EVEN_PARITY; // Parity: even
|
||||||
usim_data.imsi.u.num.digit1 = 2; // MCC digit 1
|
usim_data.imsi.u.num.digit1 = 2; // MCC digit 1
|
||||||
usim_data.imsi.u.num.digit2 = 0; // MCC digit 2
|
usim_data.imsi.u.num.digit2 = 0; // MCC digit 2
|
||||||
usim_data.imsi.u.num.digit3 = 8; // MCC digit 3
|
usim_data.imsi.u.num.digit3 = 8; // MCC digit 3
|
||||||
usim_data.imsi.u.num.digit4 = 1; // MNC digit 1
|
usim_data.imsi.u.num.digit4 = 1; // MNC digit 1
|
||||||
usim_data.imsi.u.num.digit5 = 0; // MNC digit 2
|
usim_data.imsi.u.num.digit5 = 0; // MNC digit 2
|
||||||
usim_data.imsi.u.num.digit6 = 0b1111; // MNC digit 3
|
usim_data.imsi.u.num.digit6 = 0b1111; // MNC digit 3
|
||||||
usim_data.imsi.u.num.digit7 = 0;
|
usim_data.imsi.u.num.digit7 = 0;
|
||||||
usim_data.imsi.u.num.digit8 = 0;
|
usim_data.imsi.u.num.digit8 = 0;
|
||||||
usim_data.imsi.u.num.digit9 = 0;
|
usim_data.imsi.u.num.digit9 = 0;
|
||||||
usim_data.imsi.u.num.digit10 = 0;
|
usim_data.imsi.u.num.digit10 = 0;
|
||||||
usim_data.imsi.u.num.digit11 = 1;
|
usim_data.imsi.u.num.digit11 = 1;
|
||||||
usim_data.imsi.u.num.digit12 = 2;
|
usim_data.imsi.u.num.digit12 = 2;
|
||||||
usim_data.imsi.u.num.digit13 = 3;
|
usim_data.imsi.u.num.digit13 = 3;
|
||||||
usim_data.imsi.u.num.digit14 = 4;
|
usim_data.imsi.u.num.digit14 = 4;
|
||||||
usim_data.imsi.u.num.digit15 = 0b1111;*/
|
usim_data.imsi.u.num.digit15 = 0b1111;*/
|
||||||
usim_data.imsi.length = 8;
|
usim_data.imsi.length = 8;
|
||||||
usim_data.imsi.u.num.parity = 0x0; // Type of identity = IMSI, even
|
usim_data.imsi.u.num.parity = 0x0; // Type of identity = IMSI, even
|
||||||
usim_data.imsi.u.num.digit1 = 2;// MCC digit 1
|
usim_data.imsi.u.num.digit1 = 0; // MCC digit 1
|
||||||
usim_data.imsi.u.num.digit2 = 0;// MCC digit 2
|
usim_data.imsi.u.num.digit2 = 0; // MCC digit 2
|
||||||
usim_data.imsi.u.num.digit3 = 8;// MCC digit 3
|
usim_data.imsi.u.num.digit3 = 1; // MCC digit 3
|
||||||
usim_data.imsi.u.num.digit4 = 1;// MNC digit 1
|
usim_data.imsi.u.num.digit4 = 0; // MNC digit 1
|
||||||
usim_data.imsi.u.num.digit5 = 0;// MNC digit 2
|
usim_data.imsi.u.num.digit5 = 1; // MNC digit 2
|
||||||
usim_data.imsi.u.num.digit6 = 0;
|
usim_data.imsi.u.num.digit6 = 0;
|
||||||
usim_data.imsi.u.num.digit7 = 0;
|
usim_data.imsi.u.num.digit7 = 0;
|
||||||
usim_data.imsi.u.num.digit8 = 0;
|
usim_data.imsi.u.num.digit8 = 0;
|
||||||
@@ -210,12 +209,12 @@ int main (int argc, const char* argv[])
|
|||||||
/*
|
/*
|
||||||
* Higher Priority PLMN search period
|
* Higher Priority PLMN search period
|
||||||
*/
|
*/
|
||||||
usim_data.hpplmn = 0x00; /* Disable timer */
|
usim_data.hpplmn = 0x00; /* Disable timer */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* List of Forbidden PLMNs
|
* List of Forbidden PLMNs
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < USIM_FPLMN_MAX; i++) {
|
for (int i = 0; i < USIM_FPLMN_MAX; i++) {
|
||||||
memset(&usim_data.fplmn[i], 0xff, sizeof(plmn_t));
|
memset(&usim_data.fplmn[i], 0xff, sizeof(plmn_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -292,21 +291,21 @@ int main (int argc, const char* argv[])
|
|||||||
usim_data.msisdn.number.digit[8].lsb = 0xf;
|
usim_data.msisdn.number.digit[8].lsb = 0xf;
|
||||||
usim_data.msisdn.number.digit[9].msb = 0xf;
|
usim_data.msisdn.number.digit[9].msb = 0xf;
|
||||||
usim_data.msisdn.number.digit[9].lsb = 0xf;
|
usim_data.msisdn.number.digit[9].lsb = 0xf;
|
||||||
usim_data.msisdn.conf1_record_id = 0xff; /* Not used */
|
usim_data.msisdn.conf1_record_id = 0xff; /* Not used */
|
||||||
usim_data.msisdn.ext1_record_id = 0xff; /* Not used */
|
usim_data.msisdn.ext1_record_id = 0xff; /* Not used */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* PLMN Network Name and Operator PLMN List
|
* PLMN Network Name and Operator PLMN List
|
||||||
*/
|
*/
|
||||||
for (i = SFR1; i < VDF2; i++) {
|
for (int i = TEST1; i < VDF1; i++) {
|
||||||
network_record_t record = network_records[i];
|
network_record_t record = network_records[i];
|
||||||
usim_data.pnn[i].fullname.type = USIM_PNN_FULLNAME_TAG;
|
usim_data.pnn[i].fullname.type = USIM_PNN_FULLNAME_TAG;
|
||||||
usim_data.pnn[i].fullname.length = strlen(record.fullname);
|
usim_data.pnn[i].fullname.length = strlen(record.fullname);
|
||||||
strncpy((char*) usim_data.pnn[i].fullname.value, record.fullname,
|
strncpy((char*)usim_data.pnn[i].fullname.value, record.fullname,
|
||||||
usim_data.pnn[i].fullname.length);
|
usim_data.pnn[i].fullname.length);
|
||||||
usim_data.pnn[i].shortname.type = USIM_PNN_SHORTNAME_TAG;
|
usim_data.pnn[i].shortname.type = USIM_PNN_SHORTNAME_TAG;
|
||||||
usim_data.pnn[i].shortname.length = strlen(record.shortname);
|
usim_data.pnn[i].shortname.length = strlen(record.shortname);
|
||||||
strncpy((char*) usim_data.pnn[i].shortname.value, record.shortname,
|
strncpy((char*)usim_data.pnn[i].shortname.value, record.shortname,
|
||||||
usim_data.pnn[i].shortname.length);
|
usim_data.pnn[i].shortname.length);
|
||||||
usim_data.opl[i].plmn = record.plmn;
|
usim_data.opl[i].plmn = record.plmn;
|
||||||
usim_data.opl[i].start = record.tac_start;
|
usim_data.opl[i].start = record.tac_start;
|
||||||
@@ -314,7 +313,7 @@ int main (int argc, const char* argv[])
|
|||||||
usim_data.opl[i].record_id = i;
|
usim_data.opl[i].record_id = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = VDF2; i < USIM_OPL_MAX; i++) {
|
for (int i = VDF2; i < USIM_OPL_MAX; i++) {
|
||||||
memset(&usim_data.opl[i].plmn, 0xff, sizeof(plmn_t));
|
memset(&usim_data.opl[i].plmn, 0xff, sizeof(plmn_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -332,7 +331,7 @@ int main (int argc, const char* argv[])
|
|||||||
/*
|
/*
|
||||||
* List of user controlled PLMN selector with Access Technology
|
* List of user controlled PLMN selector with Access Technology
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < USIM_PLMN_MAX; i++) {
|
for (int i = 0; i < USIM_PLMN_MAX; i++) {
|
||||||
memset(&usim_data.plmn[i], 0xff, sizeof(plmn_t));
|
memset(&usim_data.plmn[i], 0xff, sizeof(plmn_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -340,30 +339,24 @@ int main (int argc, const char* argv[])
|
|||||||
* List of operator controlled PLMN selector with Access Technology
|
* List of operator controlled PLMN selector with Access Technology
|
||||||
*/
|
*/
|
||||||
usim_data.oplmn[0].plmn = network_records[VDF1].plmn;
|
usim_data.oplmn[0].plmn = network_records[VDF1].plmn;
|
||||||
usim_data.oplmn[0].AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN
|
usim_data.oplmn[0].AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN | USIM_ACT_EUTRAN);
|
||||||
| USIM_ACT_EUTRAN);
|
|
||||||
usim_data.oplmn[1].plmn = network_records[VDF2].plmn;
|
usim_data.oplmn[1].plmn = network_records[VDF2].plmn;
|
||||||
usim_data.oplmn[1].AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN
|
usim_data.oplmn[1].AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN | USIM_ACT_EUTRAN);
|
||||||
| USIM_ACT_EUTRAN);
|
|
||||||
usim_data.oplmn[2].plmn = network_records[VDF3].plmn;
|
usim_data.oplmn[2].plmn = network_records[VDF3].plmn;
|
||||||
usim_data.oplmn[2].AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN
|
usim_data.oplmn[2].AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN | USIM_ACT_EUTRAN);
|
||||||
| USIM_ACT_EUTRAN);
|
|
||||||
usim_data.oplmn[3].plmn = network_records[VDF4].plmn;
|
usim_data.oplmn[3].plmn = network_records[VDF4].plmn;
|
||||||
usim_data.oplmn[3].AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN
|
usim_data.oplmn[3].AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN | USIM_ACT_EUTRAN);
|
||||||
| USIM_ACT_EUTRAN);
|
|
||||||
usim_data.oplmn[4].plmn = network_records[VDF5].plmn;
|
usim_data.oplmn[4].plmn = network_records[VDF5].plmn;
|
||||||
usim_data.oplmn[4].AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN
|
usim_data.oplmn[4].AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN | USIM_ACT_EUTRAN);
|
||||||
| USIM_ACT_EUTRAN);
|
|
||||||
|
|
||||||
for (i = 5; i < USIM_OPLMN_MAX; i++) {
|
for (int i = 5; i < USIM_OPLMN_MAX; i++) {
|
||||||
memset(&usim_data.oplmn[i], 0xff, sizeof(plmn_t));
|
memset(&usim_data.oplmn[i], 0xff, sizeof(plmn_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* EPS Location Information
|
* EPS Location Information
|
||||||
*/
|
*/
|
||||||
usim_data.epsloci.guti.gummei.plmn =
|
usim_data.epsloci.guti.gummei.plmn = network_records[SELECTED_PLMN].plmn;
|
||||||
network_records[SELECTED_PLMN].plmn;
|
|
||||||
usim_data.epsloci.guti.gummei.MMEgid = DEFAULT_MME_ID;
|
usim_data.epsloci.guti.gummei.MMEgid = DEFAULT_MME_ID;
|
||||||
usim_data.epsloci.guti.gummei.MMEcode = DEFAULT_MME_CODE;
|
usim_data.epsloci.guti.gummei.MMEcode = DEFAULT_MME_CODE;
|
||||||
usim_data.epsloci.guti.m_tmsi = DEFAULT_M_TMSI;
|
usim_data.epsloci.guti.m_tmsi = DEFAULT_M_TMSI;
|
||||||
@@ -373,8 +366,7 @@ int main (int argc, const char* argv[])
|
|||||||
/*
|
/*
|
||||||
* Non-Access Stratum configuration
|
* Non-Access Stratum configuration
|
||||||
*/
|
*/
|
||||||
usim_data.nasconfig.NAS_SignallingPriority.type =
|
usim_data.nasconfig.NAS_SignallingPriority.type = USIM_NAS_SIGNALLING_PRIORITY_TAG;
|
||||||
USIM_NAS_SIGNALLING_PRIORITY_TAG;
|
|
||||||
usim_data.nasconfig.NAS_SignallingPriority.length = 1;
|
usim_data.nasconfig.NAS_SignallingPriority.length = 1;
|
||||||
usim_data.nasconfig.NAS_SignallingPriority.value[0] = 0x00;
|
usim_data.nasconfig.NAS_SignallingPriority.value[0] = 0x00;
|
||||||
usim_data.nasconfig.NMO_I_Behaviour.type = USIM_NMO_I_BEHAVIOUR_TAG;
|
usim_data.nasconfig.NMO_I_Behaviour.type = USIM_NMO_I_BEHAVIOUR_TAG;
|
||||||
@@ -387,16 +379,13 @@ int main (int argc, const char* argv[])
|
|||||||
#else
|
#else
|
||||||
usim_data.nasconfig.AttachWithImsi.value[0] = 0x01;
|
usim_data.nasconfig.AttachWithImsi.value[0] = 0x01;
|
||||||
#endif
|
#endif
|
||||||
usim_data.nasconfig.MinimumPeriodicSearchTimer.type =
|
usim_data.nasconfig.MinimumPeriodicSearchTimer.type = USIM_MINIMUM_PERIODIC_SEARCH_TIMER_TAG;
|
||||||
USIM_MINIMUM_PERIODIC_SEARCH_TIMER_TAG;
|
|
||||||
usim_data.nasconfig.MinimumPeriodicSearchTimer.length = 1;
|
usim_data.nasconfig.MinimumPeriodicSearchTimer.length = 1;
|
||||||
usim_data.nasconfig.MinimumPeriodicSearchTimer.value[0] = 0x00;
|
usim_data.nasconfig.MinimumPeriodicSearchTimer.value[0] = 0x00;
|
||||||
usim_data.nasconfig.ExtendedAccessBarring.type =
|
usim_data.nasconfig.ExtendedAccessBarring.type = USIM_EXTENDED_ACCESS_BARRING_TAG;
|
||||||
USIM_EXTENDED_ACCESS_BARRING_TAG;
|
|
||||||
usim_data.nasconfig.ExtendedAccessBarring.length = 1;
|
usim_data.nasconfig.ExtendedAccessBarring.length = 1;
|
||||||
usim_data.nasconfig.ExtendedAccessBarring.value[0] = 0x00;
|
usim_data.nasconfig.ExtendedAccessBarring.value[0] = 0x00;
|
||||||
usim_data.nasconfig.Timer_T3245_Behaviour.type =
|
usim_data.nasconfig.Timer_T3245_Behaviour.type = USIM_TIMER_T3245_BEHAVIOUR_TAG;
|
||||||
USIM_TIMER_T3245_BEHAVIOUR_TAG;
|
|
||||||
usim_data.nasconfig.Timer_T3245_Behaviour.length = 1;
|
usim_data.nasconfig.Timer_T3245_Behaviour.length = 1;
|
||||||
usim_data.nasconfig.Timer_T3245_Behaviour.value[0] = 0x00;
|
usim_data.nasconfig.Timer_T3245_Behaviour.value[0] = 0x00;
|
||||||
|
|
||||||
@@ -449,8 +438,7 @@ static void _display_usage(const char* command)
|
|||||||
{
|
{
|
||||||
fprintf(stderr, "usage: %s [OPTION]\n", command);
|
fprintf(stderr, "usage: %s [OPTION]\n", command);
|
||||||
fprintf(stderr, "\t[--gen|-g]\tGenerate the USIM data file\n");
|
fprintf(stderr, "\t[--gen|-g]\tGenerate the USIM data file\n");
|
||||||
fprintf(stderr,
|
fprintf(stderr, "\t[--print|-p]\tDisplay the content of the USIM data file\n");
|
||||||
"\t[--print|-p]\tDisplay the content of the USIM data file\n");
|
|
||||||
fprintf(stderr, "\t[--help|-h]\tDisplay this usage\n");
|
fprintf(stderr, "\t[--help|-h]\tDisplay this usage\n");
|
||||||
const char* path = getenv("USIM_DIR");
|
const char* path = getenv("USIM_DIR");
|
||||||
|
|
||||||
@@ -467,7 +455,6 @@ static void _display_usage(const char* command)
|
|||||||
static void _display_usim_data(const usim_data_t* data)
|
static void _display_usim_data(const usim_data_t* data)
|
||||||
{
|
{
|
||||||
int digits;
|
int digits;
|
||||||
int i;
|
|
||||||
|
|
||||||
printf("Administrative Data:\n");
|
printf("Administrative Data:\n");
|
||||||
printf("\tUE_Operation_Mode\t= 0x%.2x\n", data->ad.UE_Operation_Mode);
|
printf("\tUE_Operation_Mode\t= 0x%.2x\n", data->ad.UE_Operation_Mode);
|
||||||
@@ -476,10 +463,8 @@ static void _display_usim_data(const usim_data_t* data)
|
|||||||
|
|
||||||
printf("IMSI:\n");
|
printf("IMSI:\n");
|
||||||
printf("\tlength\t= %d\n", data->imsi.length);
|
printf("\tlength\t= %d\n", data->imsi.length);
|
||||||
printf("\tparity\t= %s\n",
|
printf("\tparity\t= %s\n", data->imsi.u.num.parity == EVEN_PARITY ? "Even" : "Odd");
|
||||||
data->imsi.u.num.parity == EVEN_PARITY ? "Even" : "Odd");
|
digits = (data->imsi.length * 2) - 1 - (data->imsi.u.num.parity == EVEN_PARITY ? 1 : 0);
|
||||||
digits = (data->imsi.length * 2) - 1
|
|
||||||
- (data->imsi.u.num.parity == EVEN_PARITY ? 1 : 0);
|
|
||||||
printf("\tdigits\t= %d\n", digits);
|
printf("\tdigits\t= %d\n", digits);
|
||||||
printf("\tdigits\t= %u%u%u%u%u%x%u%u%u%u",
|
printf("\tdigits\t= %u%u%u%u%u%x%u%u%u%u",
|
||||||
data->imsi.u.num.digit1, // MCC digit 1
|
data->imsi.u.num.digit1, // MCC digit 1
|
||||||
@@ -488,8 +473,10 @@ static void _display_usim_data(const usim_data_t* data)
|
|||||||
data->imsi.u.num.digit4, // MNC digit 1
|
data->imsi.u.num.digit4, // MNC digit 1
|
||||||
data->imsi.u.num.digit5, // MNC digit 2
|
data->imsi.u.num.digit5, // MNC digit 2
|
||||||
data->imsi.u.num.digit6, // MNC digit 3
|
data->imsi.u.num.digit6, // MNC digit 3
|
||||||
data->imsi.u.num.digit7, data->imsi.u.num.digit8,
|
data->imsi.u.num.digit7,
|
||||||
data->imsi.u.num.digit9, data->imsi.u.num.digit10);
|
data->imsi.u.num.digit8,
|
||||||
|
data->imsi.u.num.digit9,
|
||||||
|
data->imsi.u.num.digit10);
|
||||||
|
|
||||||
if (digits >= 11)
|
if (digits >= 11)
|
||||||
printf("%x", data->imsi.u.num.digit11);
|
printf("%x", data->imsi.u.num.digit11);
|
||||||
@@ -524,32 +511,37 @@ static void _display_usim_data(const usim_data_t* data)
|
|||||||
memcpy(kasme, data->securityctx.Kasme.value, USIM_K_ASME_SIZE);
|
memcpy(kasme, data->securityctx.Kasme.value, USIM_K_ASME_SIZE);
|
||||||
printf("\tKasme\t: \"%s\"\n", kasme);
|
printf("\tKasme\t: \"%s\"\n", kasme);
|
||||||
printf("\tulNAScount\t: 0x%.8x\n",
|
printf("\tulNAScount\t: 0x%.8x\n",
|
||||||
*(UInt32_t*) data->securityctx.ulNAScount.value);
|
*(UInt32_t*)data->securityctx.ulNAScount.value);
|
||||||
printf("\tdlNAScount\t: 0x%.8x\n",
|
printf("\tdlNAScount\t: 0x%.8x\n",
|
||||||
*(UInt32_t*) data->securityctx.dlNAScount.value);
|
*(UInt32_t*)data->securityctx.dlNAScount.value);
|
||||||
printf("\talgorithmID\t: 0x%.2x\n\n",
|
printf("\talgorithmID\t: 0x%.2x\n\n",
|
||||||
data->securityctx.algorithmID.value[0]);
|
data->securityctx.algorithmID.value[0]);
|
||||||
|
|
||||||
printf("MSISDN\t= %u%u%u %u%u%u%u %u%u%u%u\n\n",
|
printf("MSISDN\t= %u%u%u %u%u%u%u %u%u%u%u\n\n",
|
||||||
data->msisdn.number.digit[0].msb, data->msisdn.number.digit[0].lsb,
|
data->msisdn.number.digit[0].msb,
|
||||||
data->msisdn.number.digit[1].msb, data->msisdn.number.digit[1].lsb,
|
data->msisdn.number.digit[0].lsb,
|
||||||
data->msisdn.number.digit[2].msb, data->msisdn.number.digit[2].lsb,
|
data->msisdn.number.digit[1].msb,
|
||||||
data->msisdn.number.digit[3].msb, data->msisdn.number.digit[3].lsb,
|
data->msisdn.number.digit[1].lsb,
|
||||||
data->msisdn.number.digit[4].msb, data->msisdn.number.digit[4].lsb,
|
data->msisdn.number.digit[2].msb,
|
||||||
|
data->msisdn.number.digit[2].lsb,
|
||||||
|
data->msisdn.number.digit[3].msb,
|
||||||
|
data->msisdn.number.digit[3].lsb,
|
||||||
|
data->msisdn.number.digit[4].msb,
|
||||||
|
data->msisdn.number.digit[4].lsb,
|
||||||
data->msisdn.number.digit[5].msb);
|
data->msisdn.number.digit[5].msb);
|
||||||
|
|
||||||
for (i = 0; i < USIM_PNN_MAX; i++) {
|
for (int i = 0; i < USIM_PNN_MAX; i++) {
|
||||||
printf("PNN[%d]\t= {%s, %s}\n", i, data->pnn[i].fullname.value,
|
printf("PNN[%d]\t= {%s, %s}\n", i,
|
||||||
data->pnn[i].shortname.value);
|
data->pnn[i].fullname.value, data->pnn[i].shortname.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
for (i = 0; i < USIM_OPL_MAX; i++) {
|
for (int i = 0; i < USIM_OPL_MAX; i++) {
|
||||||
printf("OPL[%d]\t= ", i);
|
printf("OPL[%d]\t= ", i);
|
||||||
PRINT_PLMN(data->opl[i].plmn);
|
PRINT_PLMN(data->opl[i].plmn);
|
||||||
printf(", TAC = [%.4x - %.4x], record_id = %d\n", data->opl[i].start,
|
printf(", TAC = [%.4x - %.4x], record_id = %d\n",
|
||||||
data->opl[i].end, data->opl[i].record_id);
|
data->opl[i].start, data->opl[i].end, data->opl[i].record_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("\n");
|
printf("\n");
|
||||||
@@ -558,7 +550,7 @@ static void _display_usim_data(const usim_data_t* data)
|
|||||||
PRINT_PLMN(data->hplmn.plmn);
|
PRINT_PLMN(data->hplmn.plmn);
|
||||||
printf(", AcT = 0x%x\n\n", data->hplmn.AcT);
|
printf(", AcT = 0x%x\n\n", data->hplmn.AcT);
|
||||||
|
|
||||||
for (i = 0; i < USIM_FPLMN_MAX; i++) {
|
for (int i = 0; i < USIM_FPLMN_MAX; i++) {
|
||||||
printf("FPLMN[%d]\t= ", i);
|
printf("FPLMN[%d]\t= ", i);
|
||||||
PRINT_PLMN(data->fplmn[i]);
|
PRINT_PLMN(data->fplmn[i]);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
@@ -566,7 +558,7 @@ static void _display_usim_data(const usim_data_t* data)
|
|||||||
|
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
for (i = 0; i < USIM_EHPLMN_MAX; i++) {
|
for (int i = 0; i < USIM_EHPLMN_MAX; i++) {
|
||||||
printf("EHPLMN[%d]\t= ", i);
|
printf("EHPLMN[%d]\t= ", i);
|
||||||
PRINT_PLMN(data->ehplmn[i]);
|
PRINT_PLMN(data->ehplmn[i]);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
@@ -574,7 +566,7 @@ static void _display_usim_data(const usim_data_t* data)
|
|||||||
|
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
for (i = 0; i < USIM_PLMN_MAX; i++) {
|
for (int i = 0; i < USIM_PLMN_MAX; i++) {
|
||||||
printf("PLMN[%d]\t\t= ", i);
|
printf("PLMN[%d]\t\t= ", i);
|
||||||
PRINT_PLMN(data->plmn[i].plmn);
|
PRINT_PLMN(data->plmn[i].plmn);
|
||||||
printf(", AcTPLMN = 0x%x", data->plmn[i].AcT);
|
printf(", AcTPLMN = 0x%x", data->plmn[i].AcT);
|
||||||
@@ -583,7 +575,7 @@ static void _display_usim_data(const usim_data_t* data)
|
|||||||
|
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
for (i = 0; i < USIM_OPLMN_MAX; i++) {
|
for (int i = 0; i < USIM_OPLMN_MAX; i++) {
|
||||||
printf("OPLMN[%d]\t= ", i);
|
printf("OPLMN[%d]\t= ", i);
|
||||||
PRINT_PLMN(data->oplmn[i].plmn);
|
PRINT_PLMN(data->oplmn[i].plmn);
|
||||||
printf(", AcTPLMN = 0x%x", data->oplmn[i].AcT);
|
printf(", AcTPLMN = 0x%x", data->oplmn[i].AcT);
|
||||||
@@ -603,12 +595,14 @@ static void _display_usim_data(const usim_data_t* data)
|
|||||||
|
|
||||||
printf("PSLOCI:\n");
|
printf("PSLOCI:\n");
|
||||||
printf("\tP-TMSI = 0x%.4x\n", data->psloci.p_tmsi);
|
printf("\tP-TMSI = 0x%.4x\n", data->psloci.p_tmsi);
|
||||||
printf("\tsignature = 0x%x 0x%x 0x%x\n", data->psloci.signature[0],
|
printf("\tsignature = 0x%x 0x%x 0x%x\n",
|
||||||
data->psloci.signature[1], data->psloci.signature[2]);
|
data->psloci.signature[0],
|
||||||
|
data->psloci.signature[1],
|
||||||
|
data->psloci.signature[2]);
|
||||||
printf("\tRAI\t: PLMN = ");
|
printf("\tRAI\t: PLMN = ");
|
||||||
PRINT_PLMN(data->psloci.rai.plmn);
|
PRINT_PLMN(data->psloci.rai.plmn);
|
||||||
printf(", LAC = 0x%.2x, RAC = 0x%.1x\n", data->psloci.rai.lac,
|
printf(", LAC = 0x%.2x, RAC = 0x%.1x\n",
|
||||||
data->psloci.rai.rac);
|
data->psloci.rai.lac, data->psloci.rai.rac);
|
||||||
printf("\tstatus\t= %d\n\n", data->psloci.status);
|
printf("\tstatus\t= %d\n\n", data->psloci.status);
|
||||||
|
|
||||||
printf("EPSLOCI:\n");
|
printf("EPSLOCI:\n");
|
||||||
@@ -620,7 +614,8 @@ static void _display_usim_data(const usim_data_t* data)
|
|||||||
printf(", M-TMSI = 0x%.4x\n", data->epsloci.guti.m_tmsi);
|
printf(", M-TMSI = 0x%.4x\n", data->epsloci.guti.m_tmsi);
|
||||||
printf("\tTAI\t: PLMN = ");
|
printf("\tTAI\t: PLMN = ");
|
||||||
PRINT_PLMN(data->epsloci.tai.plmn);
|
PRINT_PLMN(data->epsloci.tai.plmn);
|
||||||
printf(", TAC = 0x%.2x\n", data->epsloci.tai.tac);
|
printf(", TAC = 0x%.2x\n",
|
||||||
|
data->epsloci.tai.tac);
|
||||||
printf("\tstatus\t= %d\n\n", data->epsloci.status);
|
printf("\tstatus\t= %d\n\n", data->epsloci.status);
|
||||||
|
|
||||||
printf("NASCONFIG:\n");
|
printf("NASCONFIG:\n");
|
||||||
|
|||||||
@@ -307,7 +307,7 @@ CFLAGS = \
|
|||||||
-g \
|
-g \
|
||||||
-Wall \
|
-Wall \
|
||||||
-DNAS_UE \
|
-DNAS_UE \
|
||||||
-DUE_BUILD \
|
-DNAS_BUILT_IN_UE \
|
||||||
-Wuninitialized \
|
-Wuninitialized \
|
||||||
-Werror=implicit-function-declaration \
|
-Werror=implicit-function-declaration \
|
||||||
$(UENAS_CFLAGS) \
|
$(UENAS_CFLAGS) \
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ libnas_la_LDFLAGS = -all-static
|
|||||||
AM_CFLAGS = \
|
AM_CFLAGS = \
|
||||||
@ADD_CFLAGS@ \
|
@ADD_CFLAGS@ \
|
||||||
-DNAS_MME \
|
-DNAS_MME \
|
||||||
-DEPC_BUILD \
|
-DNAS_BUILT_IN_EPC \
|
||||||
-DENABLE_ITTI \
|
-DENABLE_ITTI \
|
||||||
-I$(top_srcdir)/COMMON \
|
-I$(top_srcdir)/COMMON \
|
||||||
-I$(top_srcdir)/SECU \
|
-I$(top_srcdir)/SECU \
|
||||||
|
|||||||
@@ -31,15 +31,15 @@
|
|||||||
#include "intertask_interface.h"
|
#include "intertask_interface.h"
|
||||||
#include "nas_itti_messaging.h"
|
#include "nas_itti_messaging.h"
|
||||||
|
|
||||||
#if ((defined(EPC_BUILD) && defined(NAS_MME)) || (defined(UE_BUILD) && defined(NAS_UE)))
|
#if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
|
||||||
# if (defined(EPC_BUILD) && defined(NAS_MME))
|
# if (defined(NAS_BUILT_IN_EPC) && defined(NAS_MME))
|
||||||
# define TASK_ORIGIN TASK_NAS_MME
|
# define TASK_ORIGIN TASK_NAS_MME
|
||||||
# else
|
# else
|
||||||
# define TASK_ORIGIN TASK_NAS_UE
|
# define TASK_ORIGIN TASK_NAS_UE
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ((defined(EPC_BUILD) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(UE_BUILD) && defined(NAS_UE)))
|
#if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
|
||||||
static const UInt8_t emm_message_ids[] = {
|
static const UInt8_t emm_message_ids[] = {
|
||||||
ATTACH_REQUEST,
|
ATTACH_REQUEST,
|
||||||
ATTACH_ACCEPT,
|
ATTACH_ACCEPT,
|
||||||
@@ -188,7 +188,7 @@ int nas_itti_protected_msg(const char *buffer, const nas_message_t *msg, const i
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(EPC_BUILD) && defined(NAS_MME)
|
#if defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)
|
||||||
int nas_itti_dl_data_req(const uint32_t ue_id, void *const data,
|
int nas_itti_dl_data_req(const uint32_t ue_id, void *const data,
|
||||||
const uint32_t length)
|
const uint32_t length)
|
||||||
{
|
{
|
||||||
@@ -205,7 +205,7 @@ int nas_itti_dl_data_req(const uint32_t ue_id, void *const data,
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(UE_BUILD) && defined(NAS_UE)
|
#if defined(NAS_BUILT_IN_UE) && defined(NAS_UE)
|
||||||
extern unsigned char NB_eNB_INST;
|
extern unsigned char NB_eNB_INST;
|
||||||
|
|
||||||
int nas_itti_cell_info_req(const plmn_t plmnID, const Byte_t rat)
|
int nas_itti_cell_info_req(const plmn_t plmnID, const Byte_t rat)
|
||||||
|
|||||||
@@ -37,7 +37,7 @@
|
|||||||
#ifndef NAS_ITTI_MESSAGING_H_
|
#ifndef NAS_ITTI_MESSAGING_H_
|
||||||
#define NAS_ITTI_MESSAGING_H_
|
#define NAS_ITTI_MESSAGING_H_
|
||||||
|
|
||||||
# if ((defined(EPC_BUILD) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(UE_BUILD) && defined(NAS_UE)))
|
# if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
|
||||||
int nas_itti_plain_msg(
|
int nas_itti_plain_msg(
|
||||||
const char *buffer,
|
const char *buffer,
|
||||||
const nas_message_t *msg,
|
const nas_message_t *msg,
|
||||||
@@ -51,7 +51,7 @@ int nas_itti_protected_msg(
|
|||||||
const int instance);
|
const int instance);
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# if defined(EPC_BUILD) && defined(NAS_MME)
|
# if defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)
|
||||||
#include "conversions.h"
|
#include "conversions.h"
|
||||||
|
|
||||||
int nas_itti_dl_data_req(
|
int nas_itti_dl_data_req(
|
||||||
@@ -223,7 +223,7 @@ static inline void nas_itti_establish_rej(
|
|||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# if defined(UE_BUILD) && defined(NAS_UE)
|
# if defined(NAS_BUILT_IN_UE) && defined(NAS_UE)
|
||||||
int nas_itti_cell_info_req(const plmn_t plmnID, const Byte_t rat);
|
int nas_itti_cell_info_req(const plmn_t plmnID, const Byte_t rat);
|
||||||
|
|
||||||
int nas_itti_nas_establish_req(as_cause_t cause, as_call_type_t type, as_stmsi_t s_tmsi, plmn_t plmnID, Byte_t *data_pP, UInt32_t lengthP);
|
int nas_itti_nas_establish_req(as_cause_t cause, as_call_type_t type, as_stmsi_t s_tmsi, plmn_t plmnID, Byte_t *data_pP, UInt32_t lengthP);
|
||||||
|
|||||||
@@ -85,7 +85,9 @@ int main(int argc, char *argv[])
|
|||||||
CHECK_INIT_RETURN(mme_app_init(&mme_config));
|
CHECK_INIT_RETURN(mme_app_init(&mme_config));
|
||||||
CHECK_INIT_RETURN(s6a_init(&mme_config));
|
CHECK_INIT_RETURN(s6a_init(&mme_config));
|
||||||
CHECK_INIT_RETURN(sgw_lite_init(mme_config.config_file));
|
CHECK_INIT_RETURN(sgw_lite_init(mme_config.config_file));
|
||||||
|
#if ! defined(ENABLE_USE_GTPU_IN_KERNEL)
|
||||||
CHECK_INIT_RETURN(sgi_init(&spgw_config.pgw_config));
|
CHECK_INIT_RETURN(sgi_init(&spgw_config.pgw_config));
|
||||||
|
#endif
|
||||||
/* Handle signals here */
|
/* Handle signals here */
|
||||||
itti_wait_tasks_end();
|
itti_wait_tasks_end();
|
||||||
|
|
||||||
|
|||||||
@@ -55,6 +55,9 @@
|
|||||||
|
|
||||||
#include "s1ap_eNB_itti_messaging.h"
|
#include "s1ap_eNB_itti_messaging.h"
|
||||||
|
|
||||||
|
#include "s1ap_eNB_ue_context.h" // test, to be removed
|
||||||
|
|
||||||
|
|
||||||
#include "assertions.h"
|
#include "assertions.h"
|
||||||
#include "conversions.h"
|
#include "conversions.h"
|
||||||
|
|
||||||
@@ -322,8 +325,22 @@ void *s1ap_eNB_task(void *arg)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case S1AP_UE_CONTEXT_RELEASE_REQ: {
|
case S1AP_UE_CONTEXT_RELEASE_REQ: {
|
||||||
|
s1ap_eNB_instance_t *s1ap_eNB_instance_p = NULL; // test
|
||||||
|
struct s1ap_eNB_ue_context_s *ue_context_p = NULL; // test
|
||||||
|
|
||||||
s1ap_ue_context_release_req(ITTI_MESSAGE_GET_INSTANCE(received_msg),
|
s1ap_ue_context_release_req(ITTI_MESSAGE_GET_INSTANCE(received_msg),
|
||||||
&S1AP_UE_CONTEXT_RELEASE_REQ(received_msg));
|
&S1AP_UE_CONTEXT_RELEASE_REQ(received_msg));
|
||||||
|
|
||||||
|
|
||||||
|
s1ap_eNB_instance_p = s1ap_eNB_get_instance(ITTI_MESSAGE_GET_INSTANCE(received_msg)); // test
|
||||||
|
DevAssert(s1ap_eNB_instance_p != NULL); // test
|
||||||
|
|
||||||
|
if ((ue_context_p = s1ap_eNB_get_ue_context(s1ap_eNB_instance_p,
|
||||||
|
S1AP_UE_CONTEXT_RELEASE_REQ(received_msg).eNB_ue_s1ap_id)) == NULL) { // test
|
||||||
|
/* The context for this eNB ue s1ap id doesn't exist in the map of eNB UEs */
|
||||||
|
S1AP_ERROR("Failed to find ue context associated with eNB ue s1ap id: %u\n",
|
||||||
|
S1AP_UE_CONTEXT_RELEASE_REQ(received_msg).eNB_ue_s1ap_id); // test
|
||||||
|
} // test
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
@@ -48,6 +48,9 @@
|
|||||||
#include "s1ap_eNB_nas_procedures.h"
|
#include "s1ap_eNB_nas_procedures.h"
|
||||||
#include "s1ap_eNB_management_procedures.h"
|
#include "s1ap_eNB_management_procedures.h"
|
||||||
#include "s1ap_eNB_context_management_procedures.h"
|
#include "s1ap_eNB_context_management_procedures.h"
|
||||||
|
#ifdef MESSAGE_CHART_GENERATOR
|
||||||
|
#include "msc.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
int s1ap_ue_context_release_complete(instance_t instance,
|
int s1ap_ue_context_release_complete(instance_t instance,
|
||||||
@@ -98,6 +101,18 @@ int s1ap_ue_context_release_complete(instance_t instance,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef MESSAGE_CHART_GENERATOR
|
||||||
|
msc_log_tx_message(
|
||||||
|
MSC_S1AP_ENB,
|
||||||
|
MSC_S1AP_MME,
|
||||||
|
buffer,
|
||||||
|
length,
|
||||||
|
MSC_AS_TIME_FMT" UEContextRelease successfulOutcome eNB_ue_s1ap_id %u mme_ue_s1ap_id %u",
|
||||||
|
0,0, //MSC_AS_TIME_ARGS(ctxt_pP),
|
||||||
|
ue_ctxt_release_complete_ies_p->eNB_UE_S1AP_ID,
|
||||||
|
ue_ctxt_release_complete_ies_p->mme_ue_s1ap_id);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* UE associated signalling -> use the allocated stream */
|
/* UE associated signalling -> use the allocated stream */
|
||||||
s1ap_eNB_itti_send_sctp_data_req(s1ap_eNB_instance_p->instance,
|
s1ap_eNB_itti_send_sctp_data_req(s1ap_eNB_instance_p->instance,
|
||||||
ue_context_p->mme_ref->assoc_id, buffer,
|
ue_context_p->mme_ref->assoc_id, buffer,
|
||||||
@@ -114,7 +129,12 @@ int s1ap_ue_context_release_complete(instance_t instance,
|
|||||||
|
|
||||||
if ((ue_context2_p = RB_REMOVE(s1ap_ue_map, &s1ap_eNB_instance_p->s1ap_ue_head, ue_context_p))
|
if ((ue_context2_p = RB_REMOVE(s1ap_ue_map, &s1ap_eNB_instance_p->s1ap_ue_head, ue_context_p))
|
||||||
== NULL) {
|
== NULL) {
|
||||||
|
S1AP_WARN("Removed UE context eNB_ue_s1ap_id %u\n",
|
||||||
|
ue_context2_p->eNB_ue_s1ap_id);
|
||||||
s1ap_eNB_free_ue_context(ue_context2_p);
|
s1ap_eNB_free_ue_context(ue_context2_p);
|
||||||
|
} else {
|
||||||
|
S1AP_WARN("Removing UE context eNB_ue_s1ap_id %u: did not find context\n",
|
||||||
|
ue_context_p->eNB_ue_s1ap_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@@ -195,6 +215,18 @@ int s1ap_ue_context_release_req(instance_t instance,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef MESSAGE_CHART_GENERATOR
|
||||||
|
msc_log_tx_message(
|
||||||
|
MSC_S1AP_ENB,
|
||||||
|
MSC_S1AP_MME,
|
||||||
|
buffer,
|
||||||
|
length,
|
||||||
|
MSC_AS_TIME_FMT" UEContextReleaseRequest initiatingMessage eNB_ue_s1ap_id %u mme_ue_s1ap_id %u",
|
||||||
|
0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
|
||||||
|
ue_ctxt_release_request_ies_p->eNB_UE_S1AP_ID,
|
||||||
|
ue_ctxt_release_request_ies_p->mme_ue_s1ap_id);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* UE associated signalling -> use the allocated stream */
|
/* UE associated signalling -> use the allocated stream */
|
||||||
s1ap_eNB_itti_send_sctp_data_req(s1ap_eNB_instance_p->instance,
|
s1ap_eNB_itti_send_sctp_data_req(s1ap_eNB_instance_p->instance,
|
||||||
ue_context_p->mme_ref->assoc_id, buffer,
|
ue_context_p->mme_ref->assoc_id, buffer,
|
||||||
|
|||||||
@@ -226,7 +226,7 @@ typedef struct {
|
|||||||
uint16_t global_cnx_id;
|
uint16_t global_cnx_id;
|
||||||
} s1ap_eNB_internal_data_t;
|
} s1ap_eNB_internal_data_t;
|
||||||
|
|
||||||
inline int s1ap_eNB_compare_assoc_id(
|
int s1ap_eNB_compare_assoc_id(
|
||||||
struct s1ap_eNB_mme_data_s *p1, struct s1ap_eNB_mme_data_s *p2);
|
struct s1ap_eNB_mme_data_s *p1, struct s1ap_eNB_mme_data_s *p2);
|
||||||
|
|
||||||
/* Generate the tree management functions */
|
/* Generate the tree management functions */
|
||||||
|
|||||||
@@ -47,9 +47,14 @@
|
|||||||
#include "s1ap_eNB_ue_context.h"
|
#include "s1ap_eNB_ue_context.h"
|
||||||
#include "s1ap_eNB_nas_procedures.h"
|
#include "s1ap_eNB_nas_procedures.h"
|
||||||
#include "s1ap_eNB_management_procedures.h"
|
#include "s1ap_eNB_management_procedures.h"
|
||||||
|
#ifdef MESSAGE_CHART_GENERATOR
|
||||||
|
#include "msc.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
int s1ap_eNB_handle_nas_first_req(
|
int s1ap_eNB_handle_nas_first_req(
|
||||||
instance_t instance, s1ap_nas_first_req_t *s1ap_nas_first_req_p)
|
instance_t instance, s1ap_nas_first_req_t *s1ap_nas_first_req_p)
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
{
|
{
|
||||||
s1ap_eNB_instance_t *instance_p = NULL;
|
s1ap_eNB_instance_t *instance_p = NULL;
|
||||||
struct s1ap_eNB_mme_data_s *mme_desc_p = NULL;
|
struct s1ap_eNB_mme_data_s *mme_desc_p = NULL;
|
||||||
@@ -221,8 +226,21 @@ int s1ap_eNB_handle_nas_first_req(
|
|||||||
mme_desc_p->nextstream += 1;
|
mme_desc_p->nextstream += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(S1AP_LIMIT_STREAM_ID_TO_1)
|
||||||
|
mme_desc_p->nextstream = 1;
|
||||||
|
#endif
|
||||||
ue_desc_p->stream = mme_desc_p->nextstream;
|
ue_desc_p->stream = mme_desc_p->nextstream;
|
||||||
|
|
||||||
|
#ifdef MESSAGE_CHART_GENERATOR
|
||||||
|
msc_log_tx_message(
|
||||||
|
MSC_S1AP_ENB,
|
||||||
|
MSC_S1AP_MME,
|
||||||
|
(const char *)NULL,
|
||||||
|
0,
|
||||||
|
MSC_AS_TIME_FMT" initialUEMessage initiatingMessage eNB_ue_s1ap_id %u",
|
||||||
|
0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
|
||||||
|
initial_ue_message_p->eNB_UE_S1AP_ID);
|
||||||
|
#endif
|
||||||
/* Send encoded message over sctp */
|
/* Send encoded message over sctp */
|
||||||
s1ap_eNB_itti_send_sctp_data_req(instance_p->instance, mme_desc_p->assoc_id,
|
s1ap_eNB_itti_send_sctp_data_req(instance_p->instance, mme_desc_p->assoc_id,
|
||||||
buffer, length, ue_desc_p->stream);
|
buffer, length, ue_desc_p->stream);
|
||||||
@@ -230,11 +248,13 @@ int s1ap_eNB_handle_nas_first_req(
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
int s1ap_eNB_handle_nas_downlink(const uint32_t assoc_id,
|
int s1ap_eNB_handle_nas_downlink(const uint32_t assoc_id,
|
||||||
const uint32_t stream,
|
const uint32_t stream,
|
||||||
const struct s1ap_message_s *const message_p)
|
const struct s1ap_message_s *const message_p)
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
{
|
{
|
||||||
S1ap_DownlinkNASTransportIEs_t *downlink_NAS_transport_p = NULL;
|
const S1ap_DownlinkNASTransportIEs_t *downlink_NAS_transport_p = NULL;
|
||||||
|
|
||||||
s1ap_eNB_mme_data_t *mme_desc_p = NULL;
|
s1ap_eNB_mme_data_t *mme_desc_p = NULL;
|
||||||
s1ap_eNB_ue_context_t *ue_desc_p = NULL;
|
s1ap_eNB_ue_context_t *ue_desc_p = NULL;
|
||||||
@@ -262,7 +282,19 @@ int s1ap_eNB_handle_nas_downlink(const uint32_t assoc_id,
|
|||||||
|
|
||||||
if ((ue_desc_p = s1ap_eNB_get_ue_context(s1ap_eNB_instance,
|
if ((ue_desc_p = s1ap_eNB_get_ue_context(s1ap_eNB_instance,
|
||||||
downlink_NAS_transport_p->eNB_UE_S1AP_ID)) == NULL) {
|
downlink_NAS_transport_p->eNB_UE_S1AP_ID)) == NULL) {
|
||||||
S1AP_ERROR("[SCTP %d] Received NAS downlink message for non existing UE context: 0x%08x %l(10)\n",
|
#ifdef MESSAGE_CHART_GENERATOR
|
||||||
|
msc_log_rx_discarded_message(
|
||||||
|
MSC_S1AP_ENB,
|
||||||
|
MSC_S1AP_MME,
|
||||||
|
(const char *)downlink_NAS_transport_p,
|
||||||
|
sizeof(S1ap_DownlinkNASTransportIEs_t),
|
||||||
|
MSC_AS_TIME_FMT" downlinkNASTransport eNB_ue_s1ap_id %u mme_ue_s1ap_id %u",
|
||||||
|
0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
|
||||||
|
downlink_NAS_transport_p->eNB_UE_S1AP_ID,
|
||||||
|
downlink_NAS_transport_p->mme_ue_s1ap_id);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
S1AP_ERROR("[SCTP %d] Received NAS downlink message for non existing UE context eNB_UE_S1AP_ID: 0x%"PRIx32" %u\n",
|
||||||
assoc_id,
|
assoc_id,
|
||||||
downlink_NAS_transport_p->eNB_UE_S1AP_ID,
|
downlink_NAS_transport_p->eNB_UE_S1AP_ID,
|
||||||
downlink_NAS_transport_p->eNB_UE_S1AP_ID);
|
downlink_NAS_transport_p->eNB_UE_S1AP_ID);
|
||||||
@@ -277,7 +309,7 @@ int s1ap_eNB_handle_nas_downlink(const uint32_t assoc_id,
|
|||||||
} else {
|
} else {
|
||||||
/* We already have a mme ue s1ap id check the received is the same */
|
/* We already have a mme ue s1ap id check the received is the same */
|
||||||
if (ue_desc_p->mme_ue_s1ap_id != downlink_NAS_transport_p->mme_ue_s1ap_id) {
|
if (ue_desc_p->mme_ue_s1ap_id != downlink_NAS_transport_p->mme_ue_s1ap_id) {
|
||||||
S1AP_ERROR("[SCTP %d] Mismatch in MME UE S1AP ID (0x%08x != 0x%08x)\n",
|
S1AP_ERROR("[SCTP %d] Mismatch in MME UE S1AP ID (0x%"PRIx32" != 0x%"PRIx32")\n",
|
||||||
assoc_id,
|
assoc_id,
|
||||||
downlink_NAS_transport_p->mme_ue_s1ap_id,
|
downlink_NAS_transport_p->mme_ue_s1ap_id,
|
||||||
ue_desc_p->mme_ue_s1ap_id
|
ue_desc_p->mme_ue_s1ap_id
|
||||||
@@ -285,6 +317,18 @@ int s1ap_eNB_handle_nas_downlink(const uint32_t assoc_id,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef MESSAGE_CHART_GENERATOR
|
||||||
|
msc_log_rx_message(
|
||||||
|
MSC_S1AP_ENB,
|
||||||
|
MSC_S1AP_MME,
|
||||||
|
(const char *)downlink_NAS_transport_p,
|
||||||
|
sizeof(S1ap_DownlinkNASTransportIEs_t),
|
||||||
|
MSC_AS_TIME_FMT" downlinkNASTransport eNB_ue_s1ap_id %u mme_ue_s1ap_id %u",
|
||||||
|
0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
|
||||||
|
downlink_NAS_transport_p->eNB_UE_S1AP_ID,
|
||||||
|
downlink_NAS_transport_p->mme_ue_s1ap_id);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Forward the NAS PDU to RRC */
|
/* Forward the NAS PDU to RRC */
|
||||||
s1ap_eNB_itti_send_nas_downlink_ind(s1ap_eNB_instance->instance,
|
s1ap_eNB_itti_send_nas_downlink_ind(s1ap_eNB_instance->instance,
|
||||||
ue_desc_p->ue_initial_id,
|
ue_desc_p->ue_initial_id,
|
||||||
@@ -292,12 +336,15 @@ int s1ap_eNB_handle_nas_downlink(const uint32_t assoc_id,
|
|||||||
downlink_NAS_transport_p->nas_pdu.buf,
|
downlink_NAS_transport_p->nas_pdu.buf,
|
||||||
downlink_NAS_transport_p->nas_pdu.size);
|
downlink_NAS_transport_p->nas_pdu.size);
|
||||||
|
|
||||||
ue_desc_p->ue_initial_id = 0;
|
// LG: Why set to 0 ??
|
||||||
|
//ue_desc_p->ue_initial_id = 0;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
int s1ap_eNB_nas_uplink(instance_t instance, s1ap_uplink_nas_t *s1ap_uplink_nas_p)
|
int s1ap_eNB_nas_uplink(instance_t instance, s1ap_uplink_nas_t *s1ap_uplink_nas_p)
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
{
|
{
|
||||||
struct s1ap_eNB_ue_context_s *ue_context_p;
|
struct s1ap_eNB_ue_context_s *ue_context_p;
|
||||||
s1ap_eNB_instance_t *s1ap_eNB_instance_p;
|
s1ap_eNB_instance_t *s1ap_eNB_instance_p;
|
||||||
@@ -370,6 +417,18 @@ int s1ap_eNB_nas_uplink(instance_t instance, s1ap_uplink_nas_t *s1ap_uplink_nas_
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef MESSAGE_CHART_GENERATOR
|
||||||
|
msc_log_tx_message(
|
||||||
|
MSC_S1AP_ENB,
|
||||||
|
MSC_S1AP_MME,
|
||||||
|
(const char *)NULL,
|
||||||
|
0,
|
||||||
|
MSC_AS_TIME_FMT" uplinkNASTransport initiatingMessage eNB_ue_s1ap_id %u mme_ue_s1ap_id %u",
|
||||||
|
0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
|
||||||
|
uplink_NAS_transport_p->eNB_UE_S1AP_ID,
|
||||||
|
uplink_NAS_transport_p->mme_ue_s1ap_id);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* UE associated signalling -> use the allocated stream */
|
/* UE associated signalling -> use the allocated stream */
|
||||||
s1ap_eNB_itti_send_sctp_data_req(s1ap_eNB_instance_p->instance,
|
s1ap_eNB_itti_send_sctp_data_req(s1ap_eNB_instance_p->instance,
|
||||||
ue_context_p->mme_ref->assoc_id, buffer,
|
ue_context_p->mme_ref->assoc_id, buffer,
|
||||||
@@ -378,8 +437,11 @@ int s1ap_eNB_nas_uplink(instance_t instance, s1ap_uplink_nas_t *s1ap_uplink_nas_
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
void s1ap_eNB_nas_non_delivery_ind(instance_t instance,
|
void s1ap_eNB_nas_non_delivery_ind(instance_t instance,
|
||||||
s1ap_nas_non_delivery_ind_t *s1ap_nas_non_delivery_ind)
|
s1ap_nas_non_delivery_ind_t *s1ap_nas_non_delivery_ind)
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
{
|
{
|
||||||
struct s1ap_eNB_ue_context_s *ue_context_p;
|
struct s1ap_eNB_ue_context_s *ue_context_p;
|
||||||
s1ap_eNB_instance_t *s1ap_eNB_instance_p;
|
s1ap_eNB_instance_t *s1ap_eNB_instance_p;
|
||||||
@@ -426,6 +488,17 @@ void s1ap_eNB_nas_non_delivery_ind(instance_t instance,
|
|||||||
/* Send a dummy cause */
|
/* Send a dummy cause */
|
||||||
nas_non_delivery_p->cause.present = S1ap_Cause_PR_radioNetwork;
|
nas_non_delivery_p->cause.present = S1ap_Cause_PR_radioNetwork;
|
||||||
nas_non_delivery_p->cause.choice.radioNetwork = S1ap_CauseRadioNetwork_radio_connection_with_ue_lost;
|
nas_non_delivery_p->cause.choice.radioNetwork = S1ap_CauseRadioNetwork_radio_connection_with_ue_lost;
|
||||||
|
#ifdef MESSAGE_CHART_GENERATOR
|
||||||
|
msc_log_tx_message(
|
||||||
|
MSC_S1AP_ENB,
|
||||||
|
MSC_S1AP_MME,
|
||||||
|
(const char *)s1ap_nas_non_delivery_ind,
|
||||||
|
sizeof(s1ap_nas_non_delivery_ind_t),
|
||||||
|
MSC_AS_TIME_FMT" NASNonDeliveryIndication initiatingMessage eNB_ue_s1ap_id %u mme_ue_s1ap_id %u",
|
||||||
|
0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
|
||||||
|
nas_non_delivery_p->eNB_UE_S1AP_ID,
|
||||||
|
nas_non_delivery_p->mme_ue_s1ap_id);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* UE associated signalling -> use the allocated stream */
|
/* UE associated signalling -> use the allocated stream */
|
||||||
s1ap_eNB_itti_send_sctp_data_req(s1ap_eNB_instance_p->instance,
|
s1ap_eNB_itti_send_sctp_data_req(s1ap_eNB_instance_p->instance,
|
||||||
@@ -433,8 +506,10 @@ void s1ap_eNB_nas_non_delivery_ind(instance_t instance,
|
|||||||
length, ue_context_p->stream);
|
length, ue_context_p->stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
int s1ap_eNB_initial_ctxt_resp(
|
int s1ap_eNB_initial_ctxt_resp(
|
||||||
instance_t instance, s1ap_initial_context_setup_resp_t *initial_ctxt_resp_p)
|
instance_t instance, s1ap_initial_context_setup_resp_t *initial_ctxt_resp_p)
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
{
|
{
|
||||||
s1ap_eNB_instance_t *s1ap_eNB_instance_p = NULL;
|
s1ap_eNB_instance_t *s1ap_eNB_instance_p = NULL;
|
||||||
struct s1ap_eNB_ue_context_s *ue_context_p = NULL;
|
struct s1ap_eNB_ue_context_s *ue_context_p = NULL;
|
||||||
@@ -505,6 +580,18 @@ int s1ap_eNB_initial_ctxt_resp(
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef MESSAGE_CHART_GENERATOR
|
||||||
|
msc_log_tx_message(
|
||||||
|
MSC_S1AP_ENB,
|
||||||
|
MSC_S1AP_MME,
|
||||||
|
(const char *)buffer,
|
||||||
|
length,
|
||||||
|
MSC_AS_TIME_FMT" InitialContextSetup successfulOutcome eNB_ue_s1ap_id %u mme_ue_s1ap_id %u",
|
||||||
|
0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
|
||||||
|
initial_ies_p->eNB_UE_S1AP_ID,
|
||||||
|
initial_ies_p->mme_ue_s1ap_id);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* UE associated signalling -> use the allocated stream */
|
/* UE associated signalling -> use the allocated stream */
|
||||||
s1ap_eNB_itti_send_sctp_data_req(s1ap_eNB_instance_p->instance,
|
s1ap_eNB_itti_send_sctp_data_req(s1ap_eNB_instance_p->instance,
|
||||||
ue_context_p->mme_ref->assoc_id, buffer,
|
ue_context_p->mme_ref->assoc_id, buffer,
|
||||||
@@ -513,8 +600,10 @@ int s1ap_eNB_initial_ctxt_resp(
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
int s1ap_eNB_ue_capabilities(instance_t instance,
|
int s1ap_eNB_ue_capabilities(instance_t instance,
|
||||||
s1ap_ue_cap_info_ind_t *ue_cap_info_ind_p)
|
s1ap_ue_cap_info_ind_t *ue_cap_info_ind_p)
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
{
|
{
|
||||||
s1ap_eNB_instance_t *s1ap_eNB_instance_p;
|
s1ap_eNB_instance_t *s1ap_eNB_instance_p;
|
||||||
struct s1ap_eNB_ue_context_s *ue_context_p;
|
struct s1ap_eNB_ue_context_s *ue_context_p;
|
||||||
@@ -572,6 +661,18 @@ int s1ap_eNB_ue_capabilities(instance_t instance,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef MESSAGE_CHART_GENERATOR
|
||||||
|
msc_log_tx_message(
|
||||||
|
MSC_S1AP_ENB,
|
||||||
|
MSC_S1AP_MME,
|
||||||
|
(const char *)buffer,
|
||||||
|
length,
|
||||||
|
MSC_AS_TIME_FMT" UECapabilityInfoIndication initiatingMessage eNB_ue_s1ap_id %u mme_ue_s1ap_id %u",
|
||||||
|
0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
|
||||||
|
ue_cap_info_ind_ies_p->eNB_UE_S1AP_ID,
|
||||||
|
ue_cap_info_ind_ies_p->mme_ue_s1ap_id);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* UE associated signalling -> use the allocated stream */
|
/* UE associated signalling -> use the allocated stream */
|
||||||
s1ap_eNB_itti_send_sctp_data_req(s1ap_eNB_instance_p->instance,
|
s1ap_eNB_itti_send_sctp_data_req(s1ap_eNB_instance_p->instance,
|
||||||
ue_context_p->mme_ref->assoc_id, buffer,
|
ue_context_p->mme_ref->assoc_id, buffer,
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ typedef struct s1ap_eNB_ue_context_s {
|
|||||||
s1ap_eNB_instance_t *eNB_instance;
|
s1ap_eNB_instance_t *eNB_instance;
|
||||||
} s1ap_eNB_ue_context_t;
|
} s1ap_eNB_ue_context_t;
|
||||||
|
|
||||||
inline int s1ap_eNB_compare_eNB_ue_s1ap_id(
|
int s1ap_eNB_compare_eNB_ue_s1ap_id(
|
||||||
struct s1ap_eNB_ue_context_s *p1, struct s1ap_eNB_ue_context_s *p2);
|
struct s1ap_eNB_ue_context_s *p1, struct s1ap_eNB_ue_context_s *p2);
|
||||||
|
|
||||||
/* Generate the tree management functions prototypes */
|
/* Generate the tree management functions prototypes */
|
||||||
|
|||||||
+12
-10
@@ -291,14 +291,14 @@ void s1ap_dump_ue(ue_description_t *ue_ref)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
eNB_description_t* s1ap_is_eNB_id_in_list(uint32_t eNB_id)
|
eNB_description_t* s1ap_is_eNB_id_in_list(const uint32_t eNB_id)
|
||||||
{
|
{
|
||||||
|
|
||||||
eNB_description_t *eNB_ref;
|
eNB_description_t *eNB_ref;
|
||||||
|
|
||||||
STAILQ_FOREACH(eNB_ref, &eNB_list_head, eNB_entries) {
|
STAILQ_FOREACH(eNB_ref, &eNB_list_head, eNB_entries) {
|
||||||
if (eNB_ref->eNB_id == eNB_id) {
|
if (eNB_ref->eNB_id == eNB_id) {
|
||||||
/* We fount a matching reference, return it */
|
/* We found a matching reference, return it */
|
||||||
return eNB_ref;
|
return eNB_ref;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -306,14 +306,14 @@ eNB_description_t* s1ap_is_eNB_id_in_list(uint32_t eNB_id)
|
|||||||
return eNB_ref;
|
return eNB_ref;
|
||||||
}
|
}
|
||||||
|
|
||||||
eNB_description_t* s1ap_is_eNB_assoc_id_in_list(uint32_t sctp_assoc_id)
|
eNB_description_t* s1ap_is_eNB_assoc_id_in_list(const uint32_t sctp_assoc_id)
|
||||||
{
|
{
|
||||||
|
|
||||||
eNB_description_t *eNB_ref;
|
eNB_description_t *eNB_ref;
|
||||||
|
|
||||||
STAILQ_FOREACH(eNB_ref, &eNB_list_head, eNB_entries) {
|
STAILQ_FOREACH(eNB_ref, &eNB_list_head, eNB_entries) {
|
||||||
if (eNB_ref->sctp_assoc_id == sctp_assoc_id) {
|
if (eNB_ref->sctp_assoc_id == sctp_assoc_id) {
|
||||||
/* We fount a matching reference, return it */
|
/* We found a matching reference, return it */
|
||||||
return eNB_ref;
|
return eNB_ref;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -322,7 +322,7 @@ eNB_description_t* s1ap_is_eNB_assoc_id_in_list(uint32_t sctp_assoc_id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ue_description_t *s1ap_is_ue_eNB_id_in_list(eNB_description_t *eNB_ref,
|
ue_description_t *s1ap_is_ue_eNB_id_in_list(eNB_description_t *eNB_ref,
|
||||||
uint32_t eNB_ue_s1ap_id)
|
const uint32_t eNB_ue_s1ap_id)
|
||||||
{
|
{
|
||||||
ue_description_t *ue_ref;
|
ue_description_t *ue_ref;
|
||||||
|
|
||||||
@@ -337,7 +337,7 @@ ue_description_t *s1ap_is_ue_eNB_id_in_list(eNB_description_t *eNB_ref,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ue_description_t* s1ap_is_ue_mme_id_in_list(uint32_t mme_ue_s1ap_id)
|
ue_description_t* s1ap_is_ue_mme_id_in_list(const uint32_t mme_ue_s1ap_id)
|
||||||
{
|
{
|
||||||
|
|
||||||
ue_description_t *ue_ref;
|
ue_description_t *ue_ref;
|
||||||
@@ -345,7 +345,7 @@ ue_description_t* s1ap_is_ue_mme_id_in_list(uint32_t mme_ue_s1ap_id)
|
|||||||
|
|
||||||
STAILQ_FOREACH(eNB_ref, &eNB_list_head, eNB_entries) {
|
STAILQ_FOREACH(eNB_ref, &eNB_list_head, eNB_entries) {
|
||||||
STAILQ_FOREACH(ue_ref, &eNB_ref->ue_list_head, ue_entries) {
|
STAILQ_FOREACH(ue_ref, &eNB_ref->ue_list_head, ue_entries) {
|
||||||
// We fount a matching reference, return it
|
// We found a matching reference, return it
|
||||||
if (ue_ref->mme_ue_s1ap_id == mme_ue_s1ap_id) {
|
if (ue_ref->mme_ue_s1ap_id == mme_ue_s1ap_id) {
|
||||||
return ue_ref;
|
return ue_ref;
|
||||||
}
|
}
|
||||||
@@ -355,7 +355,7 @@ ue_description_t* s1ap_is_ue_mme_id_in_list(uint32_t mme_ue_s1ap_id)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ue_description_t* s1ap_is_teid_in_list(uint32_t teid)
|
ue_description_t* s1ap_is_teid_in_list(const uint32_t teid)
|
||||||
{
|
{
|
||||||
|
|
||||||
ue_description_t *ue_ref;
|
ue_description_t *ue_ref;
|
||||||
@@ -363,7 +363,7 @@ ue_description_t* s1ap_is_teid_in_list(uint32_t teid)
|
|||||||
|
|
||||||
STAILQ_FOREACH(eNB_ref, &eNB_list_head, eNB_entries) {
|
STAILQ_FOREACH(eNB_ref, &eNB_list_head, eNB_entries) {
|
||||||
STAILQ_FOREACH(ue_ref, &eNB_ref->ue_list_head, ue_entries) {
|
STAILQ_FOREACH(ue_ref, &eNB_ref->ue_list_head, ue_entries) {
|
||||||
// We fount a matching reference, return it
|
// We found a matching reference, return it
|
||||||
if (ue_ref->teid == teid) {
|
if (ue_ref->teid == teid) {
|
||||||
return ue_ref;
|
return ue_ref;
|
||||||
}
|
}
|
||||||
@@ -397,7 +397,7 @@ eNB_description_t* s1ap_new_eNB(void)
|
|||||||
return eNB_ref;
|
return eNB_ref;
|
||||||
}
|
}
|
||||||
|
|
||||||
ue_description_t* s1ap_new_ue(uint32_t sctp_assoc_id)
|
ue_description_t* s1ap_new_ue(const uint32_t sctp_assoc_id)
|
||||||
{
|
{
|
||||||
|
|
||||||
eNB_description_t *eNB_ref = NULL;
|
eNB_description_t *eNB_ref = NULL;
|
||||||
@@ -438,6 +438,7 @@ void s1ap_remove_ue(ue_description_t *ue_ref)
|
|||||||
|
|
||||||
/* Freeing memory */
|
/* Freeing memory */
|
||||||
free(ue_ref);
|
free(ue_ref);
|
||||||
|
ue_ref = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void s1ap_remove_eNB(eNB_description_t *eNB_ref)
|
void s1ap_remove_eNB(eNB_description_t *eNB_ref)
|
||||||
@@ -456,6 +457,7 @@ void s1ap_remove_eNB(eNB_description_t *eNB_ref)
|
|||||||
STAILQ_REMOVE(&eNB_list_head, eNB_ref, eNB_description_s, eNB_entries);
|
STAILQ_REMOVE(&eNB_list_head, eNB_ref, eNB_description_s, eNB_entries);
|
||||||
|
|
||||||
free(eNB_ref);
|
free(eNB_ref);
|
||||||
|
eNB_ref = NULL;
|
||||||
nb_eNB_associated--;
|
nb_eNB_associated--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -123,27 +123,27 @@ int s1ap_mme_init(const mme_config_t *mme_config);
|
|||||||
* \param eNB_id The unique eNB id to search in list
|
* \param eNB_id The unique eNB id to search in list
|
||||||
* @returns NULL if no eNB matchs the eNB id, or reference to the eNB element in list if matches
|
* @returns NULL if no eNB matchs the eNB id, or reference to the eNB element in list if matches
|
||||||
**/
|
**/
|
||||||
eNB_description_t* s1ap_is_eNB_id_in_list(uint32_t eNB_id);
|
eNB_description_t* s1ap_is_eNB_id_in_list(const uint32_t eNB_id);
|
||||||
|
|
||||||
/** \brief Look for given eNB SCTP assoc id in the list
|
/** \brief Look for given eNB SCTP assoc id in the list
|
||||||
* \param eNB_id The unique sctp assoc id to search in list
|
* \param eNB_id The unique sctp assoc id to search in list
|
||||||
* @returns NULL if no eNB matchs the sctp assoc id, or reference to the eNB element in list if matches
|
* @returns NULL if no eNB matchs the sctp assoc id, or reference to the eNB element in list if matches
|
||||||
**/
|
**/
|
||||||
eNB_description_t* s1ap_is_eNB_assoc_id_in_list(uint32_t sctp_assoc_id);
|
eNB_description_t* s1ap_is_eNB_assoc_id_in_list(const uint32_t sctp_assoc_id);
|
||||||
|
|
||||||
/** \brief Look for given ue eNB id in the list
|
/** \brief Look for given ue eNB id in the list
|
||||||
* \param eNB_id The unique ue_eNB_id to search in list
|
* \param eNB_id The unique ue_eNB_id to search in list
|
||||||
* @returns NULL if no UE matchs the ue_eNB_id, or reference to the ue element in list if matches
|
* @returns NULL if no UE matchs the ue_eNB_id, or reference to the ue element in list if matches
|
||||||
**/
|
**/
|
||||||
ue_description_t* s1ap_is_ue_eNB_id_in_list(eNB_description_t *eNB_ref,
|
ue_description_t* s1ap_is_ue_eNB_id_in_list(eNB_description_t *eNB_ref,
|
||||||
uint32_t eNB_ue_s1ap_id);
|
const uint32_t eNB_ue_s1ap_id);
|
||||||
|
|
||||||
/** \brief Look for given ue mme id in the list
|
/** \brief Look for given ue mme id in the list
|
||||||
* \param eNB_id The unique ue_mme_id to search in list
|
* \param eNB_id The unique ue_mme_id to search in list
|
||||||
* @returns NULL if no UE matchs the ue_mme_id, or reference to the ue element in list if matches
|
* @returns NULL if no UE matchs the ue_mme_id, or reference to the ue element in list if matches
|
||||||
**/
|
**/
|
||||||
ue_description_t* s1ap_is_ue_mme_id_in_list(uint32_t ue_mme_id);
|
ue_description_t* s1ap_is_ue_mme_id_in_list(const uint32_t ue_mme_id);
|
||||||
ue_description_t* s1ap_is_teid_in_list(uint32_t teid);
|
ue_description_t* s1ap_is_teid_in_list(const uint32_t teid);
|
||||||
|
|
||||||
/** \brief Allocate and add to the list a new eNB descriptor
|
/** \brief Allocate and add to the list a new eNB descriptor
|
||||||
* @returns Reference to the new eNB element in list
|
* @returns Reference to the new eNB element in list
|
||||||
@@ -154,7 +154,7 @@ eNB_description_t* s1ap_new_eNB(void);
|
|||||||
* \param sctp_assoc_id association ID over SCTP
|
* \param sctp_assoc_id association ID over SCTP
|
||||||
* @returns Reference to the new UE element in list
|
* @returns Reference to the new UE element in list
|
||||||
**/
|
**/
|
||||||
ue_description_t* s1ap_new_ue(uint32_t sctp_assoc_id);
|
ue_description_t* s1ap_new_ue(const uint32_t sctp_assoc_id);
|
||||||
|
|
||||||
/** \brief Dump the eNB list
|
/** \brief Dump the eNB list
|
||||||
* Calls dump_eNB for each eNB in list
|
* Calls dump_eNB for each eNB in list
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ s1ap_message_decoded_callback messages_callback[][3] = {
|
|||||||
{ 0, 0, 0 }, /* ErrorIndication */
|
{ 0, 0, 0 }, /* ErrorIndication */
|
||||||
{ s1ap_mme_handle_nas_non_delivery, 0, 0 }, /* NASNonDeliveryIndication */
|
{ s1ap_mme_handle_nas_non_delivery, 0, 0 }, /* NASNonDeliveryIndication */
|
||||||
{ s1ap_mme_handle_s1_setup_request, 0, 0 }, /* S1Setup */
|
{ s1ap_mme_handle_s1_setup_request, 0, 0 }, /* S1Setup */
|
||||||
{ 0, 0, 0 }, /* UEContextReleaseRequest */
|
{ s1ap_mme_handle_ue_context_release_request, 0, 0 }, /* UEContextReleaseRequest */
|
||||||
{ 0, 0, 0 }, /* DownlinkS1cdma2000tunneling */
|
{ 0, 0, 0 }, /* DownlinkS1cdma2000tunneling */
|
||||||
{ 0, 0, 0 }, /* UplinkS1cdma2000tunneling */
|
{ 0, 0, 0 }, /* UplinkS1cdma2000tunneling */
|
||||||
{ 0, 0, 0 }, /* UEContextModification */
|
{ 0, 0, 0 }, /* UEContextModification */
|
||||||
@@ -586,6 +586,9 @@ int s1ap_mme_handle_ue_context_release_request(uint32_t assoc_id,
|
|||||||
/* MME doesn't know the MME UE S1AP ID provided.
|
/* MME doesn't know the MME UE S1AP ID provided.
|
||||||
* TODO
|
* TODO
|
||||||
*/
|
*/
|
||||||
|
S1AP_DEBUG("UE_CONTEXT_RELEASE_REQUEST ignored cause could not get context with mme_ue_s1ap_id 0x%08x %u(10)\n",
|
||||||
|
ueContextReleaseRequest_p->mme_ue_s1ap_id,
|
||||||
|
ueContextReleaseRequest_p->mme_ue_s1ap_id);
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
if (ue_ref->eNB_ue_s1ap_id == (ueContextReleaseRequest_p->eNB_UE_S1AP_ID &
|
if (ue_ref->eNB_ue_s1ap_id == (ueContextReleaseRequest_p->eNB_UE_S1AP_ID &
|
||||||
@@ -594,6 +597,8 @@ int s1ap_mme_handle_ue_context_release_request(uint32_t assoc_id,
|
|||||||
* -> Send a UE context Release Command to eNB.
|
* -> Send a UE context Release Command to eNB.
|
||||||
* TODO
|
* TODO
|
||||||
*/
|
*/
|
||||||
|
s1ap_mme_generate_ue_context_release_command(ue_ref);
|
||||||
|
// UE context will be removed when receiving UE_CONTEXT_RELEASE_COMPLETE
|
||||||
} else {
|
} else {
|
||||||
// TODO
|
// TODO
|
||||||
return -1;
|
return -1;
|
||||||
@@ -888,15 +893,15 @@ int s1ap_handle_create_session_response(SgwCreateSessionResponse
|
|||||||
initialContextSetupRequest_p->eNB_UE_S1AP_ID = ue_ref->eNB_ue_s1ap_id;
|
initialContextSetupRequest_p->eNB_UE_S1AP_ID = ue_ref->eNB_ue_s1ap_id;
|
||||||
|
|
||||||
/* uEaggregateMaximumBitrateDL and uEaggregateMaximumBitrateUL expressed in term of bits/sec */
|
/* uEaggregateMaximumBitrateDL and uEaggregateMaximumBitrateUL expressed in term of bits/sec */
|
||||||
// asn_int642INTEGER(
|
asn_int642INTEGER(
|
||||||
// &initialContextSetupRequest_p->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateDL,
|
&initialContextSetupRequest_p->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateDL,
|
||||||
// 100000000UL);
|
100000000UL);
|
||||||
// asn_int642INTEGER(
|
asn_int642INTEGER(
|
||||||
// &initialContextSetupRequest_p->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateUL,
|
&initialContextSetupRequest_p->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateUL,
|
||||||
// 50000000UL);
|
50000000UL);
|
||||||
|
|
||||||
initialContextSetupRequest_p->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateDL = 100000000UL;
|
//initialContextSetupRequest_p->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateDL = 100000000UL;
|
||||||
initialContextSetupRequest_p->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateUL = 50000000UL;
|
//initialContextSetupRequest_p->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateUL = 50000000UL;
|
||||||
|
|
||||||
e_RABToBeSetup.e_RAB_ID =
|
e_RABToBeSetup.e_RAB_ID =
|
||||||
session_response_p->bearer_context_created.eps_bearer_id; /* ??? */
|
session_response_p->bearer_context_created.eps_bearer_id; /* ??? */
|
||||||
|
|||||||
@@ -30,6 +30,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
|
||||||
#include "s1ap_common.h"
|
#include "s1ap_common.h"
|
||||||
#include "s1ap_ies_defs.h"
|
#include "s1ap_ies_defs.h"
|
||||||
#include "s1ap_mme_encoder.h"
|
#include "s1ap_mme_encoder.h"
|
||||||
@@ -211,7 +212,7 @@ int s1ap_generate_downlink_nas_transport(const uint32_t ue_id, void * const data
|
|||||||
/* If the UE-associated logical S1-connection is not established,
|
/* If the UE-associated logical S1-connection is not established,
|
||||||
* the MME shall allocate a unique MME UE S1AP ID to be used for the UE.
|
* the MME shall allocate a unique MME UE S1AP ID to be used for the UE.
|
||||||
*/
|
*/
|
||||||
DevMessage("This case is not handled right now\n");
|
S1AP_DEBUG("Unknown UE MME ID %08X, This case is not handled right now\n", ue_id);
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
@@ -580,8 +581,8 @@ void s1ap_handle_conn_est_cnf(const mme_app_connection_establishment_cnf_t * con
|
|||||||
initialContextSetupRequest_p->eNB_UE_S1AP_ID = (unsigned long)ue_ref->eNB_ue_s1ap_id;
|
initialContextSetupRequest_p->eNB_UE_S1AP_ID = (unsigned long)ue_ref->eNB_ue_s1ap_id;
|
||||||
|
|
||||||
/* uEaggregateMaximumBitrateDL and uEaggregateMaximumBitrateUL expressed in term of bits/sec */
|
/* uEaggregateMaximumBitrateDL and uEaggregateMaximumBitrateUL expressed in term of bits/sec */
|
||||||
initialContextSetupRequest_p->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateDL = conn_est_cnf_pP->ambr.br_dl;
|
asn_uint642INTEGER(&initialContextSetupRequest_p->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateDL, conn_est_cnf_pP->ambr.br_dl);
|
||||||
initialContextSetupRequest_p->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateUL = conn_est_cnf_pP->ambr.br_ul;
|
asn_uint642INTEGER(&initialContextSetupRequest_p->uEaggregateMaximumBitrate.uEaggregateMaximumBitRateUL, conn_est_cnf_pP->ambr.br_ul);
|
||||||
|
|
||||||
e_RABToBeSetup.e_RAB_ID = conn_est_cnf_pP->eps_bearer_id; //5;
|
e_RABToBeSetup.e_RAB_ID = conn_est_cnf_pP->eps_bearer_id; //5;
|
||||||
e_RABToBeSetup.e_RABlevelQoSParameters.qCI = conn_est_cnf_pP->bearer_qos_qci;
|
e_RABToBeSetup.e_RABlevelQoSParameters.qCI = conn_est_cnf_pP->bearer_qos_qci;
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ RB_PROTOTYPE(s1ap_timer_map, s1ap_timer_map_s, entries,
|
|||||||
RB_GENERATE(s1ap_timer_map, s1ap_timer_map_s, entries,
|
RB_GENERATE(s1ap_timer_map, s1ap_timer_map_s, entries,
|
||||||
s1ap_mme_timer_map_compare_id);
|
s1ap_mme_timer_map_compare_id);
|
||||||
|
|
||||||
inline int s1ap_mme_timer_map_compare_id(
|
int s1ap_mme_timer_map_compare_id(
|
||||||
struct s1ap_timer_map_s *p1, struct s1ap_timer_map_s *p2)
|
struct s1ap_timer_map_s *p1, struct s1ap_timer_map_s *p2)
|
||||||
{
|
{
|
||||||
if (p1->mme_ue_s1ap_id > 0) {
|
if (p1->mme_ue_s1ap_id > 0) {
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ typedef struct s1ap_timer_map_s {
|
|||||||
RB_ENTRY(s1ap_timer_map_s) entries;
|
RB_ENTRY(s1ap_timer_map_s) entries;
|
||||||
} s1ap_timer_map_t;
|
} s1ap_timer_map_t;
|
||||||
|
|
||||||
inline int s1ap_mme_timer_map_compare_id(
|
int s1ap_mme_timer_map_compare_id(
|
||||||
struct s1ap_timer_map_s *p1, struct s1ap_timer_map_s *p2);
|
struct s1ap_timer_map_s *p1, struct s1ap_timer_map_s *p2);
|
||||||
|
|
||||||
int s1ap_handle_timer_expiry(timer_has_expired_t *timer_has_expired);
|
int s1ap_handle_timer_expiry(timer_has_expired_t *timer_has_expired);
|
||||||
|
|||||||
+1
-1
@@ -171,7 +171,7 @@ diff -rupN freeDiameter-1.2.0/extensions/dict_s6a/dict_s6a.c freeDiameter-1.2.0.
|
|||||||
+ {
|
+ {
|
||||||
+ struct dict_avp_data data = {
|
+ struct dict_avp_data data = {
|
||||||
+ 493, /* Code */
|
+ 493, /* Code */
|
||||||
+ 0, /* Vendor */
|
+ VENDOR_3GPP_Id, /* Vendor , EURECOM: with FD 1.2.0 does not work if vendor ID is 0 for this AVP*/
|
||||||
+ "Service-Selection", /* Name */
|
+ "Service-Selection", /* Name */
|
||||||
+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */
|
+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flags */
|
||||||
+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */
|
+ AVP_FLAG_VENDOR | AVP_FLAG_MANDATORY, /* Fixed flag values */
|
||||||
@@ -117,6 +117,7 @@ typedef struct {
|
|||||||
struct dict_object *dataobj_s6a_immediate_response_pref;
|
struct dict_object *dataobj_s6a_immediate_response_pref;
|
||||||
struct dict_object *dataobj_s6a_authentication_info;
|
struct dict_object *dataobj_s6a_authentication_info;
|
||||||
struct dict_object *dataobj_s6a_re_synchronization_info;
|
struct dict_object *dataobj_s6a_re_synchronization_info;
|
||||||
|
struct dict_object *dataobj_s6a_service_selection;
|
||||||
struct dict_object *dataobj_s6a_ue_srvcc_cap;
|
struct dict_object *dataobj_s6a_ue_srvcc_cap;
|
||||||
|
|
||||||
/* Handlers */
|
/* Handlers */
|
||||||
|
|||||||
@@ -148,6 +148,9 @@ int s6a_fd_init_dict_objs(void)
|
|||||||
CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP,
|
CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP,
|
||||||
AVP_BY_NAME_ALL_VENDORS, "Re-Synchronization-Info",
|
AVP_BY_NAME_ALL_VENDORS, "Re-Synchronization-Info",
|
||||||
&s6a_fd_cnf.dataobj_s6a_re_synchronization_info, ENOENT));
|
&s6a_fd_cnf.dataobj_s6a_re_synchronization_info, ENOENT));
|
||||||
|
CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP,
|
||||||
|
AVP_BY_NAME_ALL_VENDORS, "Service-Selection",
|
||||||
|
&s6a_fd_cnf.dataobj_s6a_service_selection, ENOENT));
|
||||||
CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP,
|
CHECK_FD_FCT(fd_dict_search(fd_g_config->cnf_dict, DICT_AVP,
|
||||||
AVP_BY_NAME_ALL_VENDORS, "UE-SRVCC-Capability",
|
AVP_BY_NAME_ALL_VENDORS, "UE-SRVCC-Capability",
|
||||||
&s6a_fd_cnf.dataobj_s6a_ue_srvcc_cap, ENOENT));
|
&s6a_fd_cnf.dataobj_s6a_ue_srvcc_cap, ENOENT));
|
||||||
|
|||||||
@@ -89,8 +89,7 @@ void *s6a_thread(void *args)
|
|||||||
itti_exit_task();
|
itti_exit_task();
|
||||||
} break;
|
} break;
|
||||||
default: {
|
default: {
|
||||||
S6A_DEBUG("Unkwnon message ID %d:
|
S6A_DEBUG("Unkwnon message ID %d: %s\n",
|
||||||
%s\n",
|
|
||||||
ITTI_MSG_ID(received_message_p), ITTI_MSG_NAME(received_message_p));
|
ITTI_MSG_ID(received_message_p), ITTI_MSG_NAME(received_message_p));
|
||||||
} break;
|
} break;
|
||||||
}
|
}
|
||||||
@@ -121,8 +120,7 @@ int s6a_init(const mme_config_t *mme_config_p)
|
|||||||
S6A_DEBUG("Initializing freeDiameter core...\n");
|
S6A_DEBUG("Initializing freeDiameter core...\n");
|
||||||
ret = fd_core_initialize();
|
ret = fd_core_initialize();
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
S6A_ERROR("An error occurred during freeDiameter core library initialization:
|
S6A_ERROR("An error occurred during freeDiameter core library initialization: %d\n",ret);
|
||||||
%d\n",ret);
|
|
||||||
return ret;
|
return ret;
|
||||||
} else {
|
} else {
|
||||||
S6A_DEBUG("Initializing freeDiameter core done\n");
|
S6A_DEBUG("Initializing freeDiameter core done\n");
|
||||||
@@ -130,13 +128,11 @@ int s6a_init(const mme_config_t *mme_config_p)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
S6A_DEBUG("Default ext path:
|
S6A_DEBUG("Default ext path: %s\n", DEFAULT_EXTENSIONS_PATH);
|
||||||
%s\n", DEFAULT_EXTENSIONS_PATH);
|
|
||||||
|
|
||||||
ret = fd_core_parseconf(mme_config_p->s6a_config.conf_file);
|
ret = fd_core_parseconf(mme_config_p->s6a_config.conf_file);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
S6A_ERROR("An error occurred during fd_core_parseconf file :
|
S6A_ERROR("An error occurred during fd_core_parseconf file : %s.\n", mme_config_p->s6a_config.conf_file);
|
||||||
%s.\n", mme_config_p->s6a_config.conf_file);
|
|
||||||
return ret;
|
return ret;
|
||||||
} else {
|
} else {
|
||||||
S6A_DEBUG("fd_core_parseconf done\n");
|
S6A_DEBUG("fd_core_parseconf done\n");
|
||||||
@@ -183,8 +179,7 @@ int s6a_init(const mme_config_t *mme_config_p)
|
|||||||
S6A_ERROR("s6a create task\n");
|
S6A_ERROR("s6a create task\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
S6A_DEBUG("Initializing S6a interface:
|
S6A_DEBUG("Initializing S6a interface: DONE\n");
|
||||||
DONE\n");
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -155,6 +155,15 @@ int sgw_lite_init(char* config_file_name_pP)
|
|||||||
spgw_system("rmmod x_tables > /dev/null 2>&1", SPGW_WARN_ON_ERROR, __FILE__, __LINE__);
|
spgw_system("rmmod x_tables > /dev/null 2>&1", SPGW_WARN_ON_ERROR, __FILE__, __LINE__);
|
||||||
spgw_system("rmmod nf_conntrack_netlink nfnetlink nf_nat nf_conntrack_ipv4 nf_conntrack > /dev/null 2>&1", SPGW_WARN_ON_ERROR, __FILE__, __LINE__);
|
spgw_system("rmmod nf_conntrack_netlink nfnetlink nf_nat nf_conntrack_ipv4 nf_conntrack > /dev/null 2>&1", SPGW_WARN_ON_ERROR, __FILE__, __LINE__);
|
||||||
spgw_system("modprobe ip_tables", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__);
|
spgw_system("modprobe ip_tables", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__);
|
||||||
|
spgw_system("modprobe iptable_filter", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__);
|
||||||
|
spgw_system("modprobe iptable_mangle", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__);
|
||||||
|
spgw_system("modprobe iptable_nat", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__);
|
||||||
|
spgw_system("modprobe iptable_raw", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__);
|
||||||
|
spgw_system("modprobe ipt_MASQUERADE", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__);
|
||||||
|
spgw_system("modprobe ipt_LOG", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__);
|
||||||
|
spgw_system("modprobe nf_conntrack", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__);
|
||||||
|
spgw_system("modprobe nf_conntrack_ipv4", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__);
|
||||||
|
spgw_system("modprobe nf_nat", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__);
|
||||||
spgw_system("modprobe x_tables", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__);
|
spgw_system("modprobe x_tables", SPGW_ABORT_ON_ERROR, __FILE__, __LINE__);
|
||||||
spgw_system("sysctl -w net.ipv4.netfilter.ip_conntrack_max=16000", SPGW_WARN_ON_ERROR, __FILE__, __LINE__);
|
spgw_system("sysctl -w net.ipv4.netfilter.ip_conntrack_max=16000", SPGW_WARN_ON_ERROR, __FILE__, __LINE__);
|
||||||
spgw_system("sysctl -w net.ipv4.ip_forward=1", SPGW_WARN_ON_ERROR, __FILE__, __LINE__);
|
spgw_system("sysctl -w net.ipv4.ip_forward=1", SPGW_WARN_ON_ERROR, __FILE__, __LINE__);
|
||||||
|
|||||||
@@ -168,7 +168,7 @@ int udp_eNB_create_socket(int port, char *ip_addr, task_id_t task_id)
|
|||||||
sin.sin_port = htons(port);
|
sin.sin_port = htons(port);
|
||||||
|
|
||||||
if (ip_addr == NULL) {
|
if (ip_addr == NULL) {
|
||||||
sin.sin_addr.s_addr = INADDR_ANY;
|
sin.sin_addr.s_addr = inet_addr(INADDR_ANY);
|
||||||
} else {
|
} else {
|
||||||
sin.sin_addr.s_addr = inet_addr(ip_addr);
|
sin.sin_addr.s_addr = inet_addr(ip_addr);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
# ------- Interfaces definitions
|
|
||||||
ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
|
||||||
ENB_IP_ADDRESS_FOR_S1_MME = "192.168.12.30";
|
|
||||||
ENB_IP_NETMASK_FOR_S1_MME = 24;
|
|
||||||
|
|
||||||
ENB_INTERFACE_NAME_FOR_S1U = "eth2";
|
|
||||||
ENB_IP_ADDRESS_FOR_S1U = "192.168.14.30";
|
|
||||||
ENB_IP_NETMASK_FOR_S1U = 24;
|
|
||||||
|
|
||||||
MME_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
|
||||||
MME_IP_ADDRESS_FOR_S1_MME = "192.168.12.175";
|
|
||||||
MME_IP_NETMASK_FOR_S1_MME = 24;
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
# ------- Interfaces definitions
|
|
||||||
ENB_INTERFACE_NAME_FOR_S1_MME = "eth2";
|
|
||||||
ENB_IP_ADDRESS_FOR_S1_MME = "192.168.14.30";
|
|
||||||
ENB_IP_NETMASK_FOR_S1_MME = 24;
|
|
||||||
|
|
||||||
ENB_INTERFACE_NAME_FOR_S1U = "eth2";
|
|
||||||
ENB_IP_ADDRESS_FOR_S1U = "192.168.14.30";
|
|
||||||
ENB_IP_NETMASK_FOR_S1U = 24;
|
|
||||||
|
|
||||||
MME_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
|
||||||
MME_IP_ADDRESS_FOR_S1_MME = "192.168.14.162";
|
|
||||||
MME_IP_NETMASK_FOR_S1_MME = 24;
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
# ------- Interfaces definitions
|
|
||||||
ENB_INTERFACE_NAME_FOR_S1_MME = "cpenb0";
|
|
||||||
ENB_IP_ADDRESS_FOR_S1_MME = "192.168.30.117";
|
|
||||||
ENB_IP_NETMASK_FOR_S1_MME = 24;
|
|
||||||
|
|
||||||
ENB_INTERFACE_NAME_FOR_S1U = "upenb0";
|
|
||||||
ENB_IP_ADDRESS_FOR_S1U = "192.168.31.117";
|
|
||||||
ENB_IP_NETMASK_FOR_S1U = 24;
|
|
||||||
|
|
||||||
MME_INTERFACE_NAME_FOR_S1_MME = "cpmme0";
|
|
||||||
MME_IP_ADDRESS_FOR_S1_MME = "192.168.30.17";
|
|
||||||
MME_IP_NETMASK_FOR_S1_MME = 24;
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
S6A_CONF = "../objs/UTILS/CONF/s6a.conf";
|
|
||||||
|
|
||||||
REALM = "eur";
|
|
||||||
|
|
||||||
# Define the limits of the system in terms of served eNB and served UE.
|
|
||||||
# When the limits will be reached, overload procedure will take place.
|
|
||||||
|
|
||||||
MAXENB = 10;
|
|
||||||
MAXUE = 100;
|
|
||||||
|
|
||||||
RELATIVE_CAPACITY = 10;
|
|
||||||
|
|
||||||
# Display statistics about whole system (expressed in seconds)
|
|
||||||
MME_STATISTIC_TIMER = 60;
|
|
||||||
|
|
||||||
# max queue size per task
|
|
||||||
ITTI_QUEUE_SIZE = 2000000;
|
|
||||||
|
|
||||||
# ------- SCTP definitions
|
|
||||||
# Number of streams to use in input/output
|
|
||||||
|
|
||||||
SCTP_INSTREAMS = 32;
|
|
||||||
SCTP_OUTSTREAMS = 32;
|
|
||||||
|
|
||||||
# ------- S1AP definitions
|
|
||||||
|
|
||||||
# outcome drop timer value (seconds)
|
|
||||||
S1AP_OUTCOME_TIMER = 10;
|
|
||||||
|
|
||||||
# ------- MME served GUMMEI
|
|
||||||
# MME code DEFAULT = 0
|
|
||||||
# size = 8 bits
|
|
||||||
# maximum of 256 values, comma separated
|
|
||||||
MME_CODE = 30,56,1,8;
|
|
||||||
|
|
||||||
# MME GROUP ID DEFAULT = 0
|
|
||||||
# size = 16 bits
|
|
||||||
# maximum of 65535 values, comma separated
|
|
||||||
MME_GID = 3,4,5,30,8,9,50021;
|
|
||||||
|
|
||||||
# TA (mcc.mnc:tracking area code) DEFAULT = 208.34:0
|
|
||||||
# max values = 999.999:65535
|
|
||||||
# maximum of 32 values, comma separated
|
|
||||||
PLMN = 208.38:0,209.130:4,208.92:1;
|
|
||||||
|
|
||||||
# ------- Interfaces definitions
|
|
||||||
SGW_INTERFACE_NAME_FOR_S11 = "eth0";
|
|
||||||
SGW_IP_ADDRESS_FOR_S11 = "192.168.12.87";
|
|
||||||
SGW_IP_NETMASK_FOR_S11 = 24;
|
|
||||||
|
|
||||||
SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP = "eth0";
|
|
||||||
SGW_IP_ADDRESS_FOR_S1U_S12_S4_UP = "192.168.12.87";
|
|
||||||
SGW_IP_NETMASK_FOR_S1U_S12_S4_UP = 24;
|
|
||||||
|
|
||||||
SGW_INTERFACE_NAME_FOR_S5_S8_UP = "upsgw1";
|
|
||||||
SGW_IP_ADDRESS_FOR_S5_S8_UP = "192.168.5.2";
|
|
||||||
SGW_IP_NETMASK_FOR_S5_S8_UP = 24;
|
|
||||||
|
|
||||||
PGW_INTERFACE_NAME_FOR_S5_S8 = "uppgw0";
|
|
||||||
PGW_IP_ADDRESS_FOR_S5_S8 = "192.168.5.1";
|
|
||||||
PGW_IP_NETMASK_FOR_S5_S8 = 24;
|
|
||||||
|
|
||||||
PGW_INTERFACE_NAME_FOR_SGI = "eth0";
|
|
||||||
PGW_IP_ADDR_FOR_SGI = "192.168.12.87";
|
|
||||||
PGW_IP_NETMASK_FOR_SGI = 24;
|
|
||||||
|
|
||||||
MME_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
|
||||||
MME_IP_ADDRESS_FOR_S1_MME = "192.168.12.87";
|
|
||||||
MME_IP_NETMASK_FOR_S1_MME = 24;
|
|
||||||
|
|
||||||
MME_INTERFACE_NAME_FOR_S11_MME = "eth0";
|
|
||||||
MME_IP_ADDRESS_FOR_S11_MME = "192.168.12.87";
|
|
||||||
MME_IP_NETMASK_FOR_S11_MME = 24;
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
S6A_CONF = "../objs/UTILS/CONF/s6a.conf";
|
|
||||||
|
|
||||||
REALM = "eur";
|
|
||||||
|
|
||||||
# Define the limits of the system in terms of served eNB and served UE.
|
|
||||||
# When the limits will be reached, overload procedure will take place.
|
|
||||||
|
|
||||||
MAXENB = 10;
|
|
||||||
MAXUE = 100;
|
|
||||||
|
|
||||||
RELATIVE_CAPACITY = 10;
|
|
||||||
|
|
||||||
# Display statistics about whole system (expressed in seconds)
|
|
||||||
MME_STATISTIC_TIMER = 10;
|
|
||||||
|
|
||||||
# max queue size per task
|
|
||||||
ITTI_QUEUE_SIZE = 2000000;
|
|
||||||
|
|
||||||
# ------- SCTP definitions
|
|
||||||
# Number of streams to use in input/output
|
|
||||||
|
|
||||||
SCTP_INSTREAMS = 32;
|
|
||||||
SCTP_OUTSTREAMS = 32;
|
|
||||||
|
|
||||||
# ------- S1AP definitions
|
|
||||||
|
|
||||||
# outcome drop timer value (seconds)
|
|
||||||
S1AP_OUTCOME_TIMER = 10;
|
|
||||||
|
|
||||||
# ------- MME served GUMMEI
|
|
||||||
# MME code DEFAULT = 0
|
|
||||||
# size = 8 bits
|
|
||||||
# maximum of 256 values, comma separated
|
|
||||||
MME_CODE = 30,56,1,8;
|
|
||||||
|
|
||||||
# MME GROUP ID DEFAULT = 0
|
|
||||||
# size = 16 bits
|
|
||||||
# maximum of 65535 values, comma separated
|
|
||||||
MME_GID = 3,4,5,30,8,9,50021;
|
|
||||||
|
|
||||||
# TA (mcc.mnc:tracking area code) DEFAULT = 208.34:0
|
|
||||||
# max values = 999.999:65535
|
|
||||||
# maximum of 32 values, comma separated
|
|
||||||
PLMN = 208.38:0,209.130:4,208.35:8;
|
|
||||||
|
|
||||||
# ------- Interfaces definitions
|
|
||||||
SGW_INTERFACE_NAME_FOR_S11 = "eth0";
|
|
||||||
SGW_IP_ADDRESS_FOR_S11 = "192.168.14.162";
|
|
||||||
SGW_IP_NETMASK_FOR_S11 = 24;
|
|
||||||
|
|
||||||
SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP = "eth0";
|
|
||||||
SGW_IP_ADDRESS_FOR_S1U_S12_S4_UP = "192.168.14.162";
|
|
||||||
SGW_IP_NETMASK_FOR_S1U_S12_S4_UP = 24;
|
|
||||||
|
|
||||||
SGW_INTERFACE_NAME_FOR_S5_S8_UP = "upsgw1";
|
|
||||||
SGW_IP_ADDRESS_FOR_S5_S8_UP = "192.168.5.2";
|
|
||||||
SGW_IP_NETMASK_FOR_S5_S8_UP = 24;
|
|
||||||
|
|
||||||
PGW_INTERFACE_NAME_FOR_S5_S8 = "uppgw0";
|
|
||||||
PGW_IP_ADDRESS_FOR_S5_S8 = "192.168.5.1";
|
|
||||||
PGW_IP_NETMASK_FOR_S5_S8 = 24;
|
|
||||||
|
|
||||||
PGW_INTERFACE_NAME_FOR_SGI = "eth0";
|
|
||||||
PGW_IP_ADDR_FOR_SGI = "192.168.14.162";
|
|
||||||
PGW_IP_NETMASK_FOR_SGI = 24;
|
|
||||||
|
|
||||||
MME_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
|
||||||
MME_IP_ADDRESS_FOR_S1_MME = "192.168.12.30";
|
|
||||||
MME_IP_NETMASK_FOR_S1_MME = 24;
|
|
||||||
|
|
||||||
MME_INTERFACE_NAME_FOR_S11_MME = "eth2";
|
|
||||||
MME_IP_ADDRESS_FOR_S11_MME = "192.168.14.30";
|
|
||||||
MME_IP_NETMASK_FOR_S11_MME = 24;
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
S6A_CONF = "../objs/UTILS/CONF/s6a.conf";
|
|
||||||
|
|
||||||
REALM = "eur";
|
|
||||||
|
|
||||||
# Define the limits of the system in terms of served eNB and served UE.
|
|
||||||
# When the limits will be reached, overload procedure will take place.
|
|
||||||
|
|
||||||
MAXENB = 10;
|
|
||||||
MAXUE = 100;
|
|
||||||
|
|
||||||
RELATIVE_CAPACITY = 10;
|
|
||||||
|
|
||||||
# Display statistics about whole system (expressed in seconds)
|
|
||||||
MME_STATISTIC_TIMER = 10;
|
|
||||||
|
|
||||||
# max queue size per task
|
|
||||||
ITTI_QUEUE_SIZE = 2000000;
|
|
||||||
|
|
||||||
# ------- SCTP definitions
|
|
||||||
# Number of streams to use in input/output
|
|
||||||
|
|
||||||
SCTP_INSTREAMS = 32;
|
|
||||||
SCTP_OUTSTREAMS = 32;
|
|
||||||
|
|
||||||
# ------- S1AP definitions
|
|
||||||
|
|
||||||
# outcome drop timer value (seconds)
|
|
||||||
S1AP_OUTCOME_TIMER = 10;
|
|
||||||
|
|
||||||
# ------- MME served GUMMEI
|
|
||||||
# MME code DEFAULT = 0
|
|
||||||
# size = 8 bits
|
|
||||||
# maximum of 256 values, comma separated
|
|
||||||
MME_CODE = 30,56,1,8;
|
|
||||||
|
|
||||||
# MME GROUP ID DEFAULT = 0
|
|
||||||
# size = 16 bits
|
|
||||||
# maximum of 65535 values, comma separated
|
|
||||||
MME_GID = 3,4,5,30,8,9,50021;
|
|
||||||
|
|
||||||
# TA (mcc.mnc:tracking area code) DEFAULT = 208.34:0
|
|
||||||
# max values = 999.999:65535
|
|
||||||
# maximum of 32 values, comma separated
|
|
||||||
PLMN = 208.38:0,209.130:4,208.35:8;
|
|
||||||
|
|
||||||
# ------- Interfaces definitions
|
|
||||||
SGW_INTERFACE_NAME_FOR_S11 = "eth0";
|
|
||||||
SGW_IP_ADDRESS_FOR_S11 = "192.168.14.162";
|
|
||||||
SGW_IP_NETMASK_FOR_S11 = 24;
|
|
||||||
|
|
||||||
SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP = "eth0";
|
|
||||||
SGW_IP_ADDRESS_FOR_S1U_S12_S4_UP = "192.168.14.162";
|
|
||||||
SGW_IP_NETMASK_FOR_S1U_S12_S4_UP = 24;
|
|
||||||
|
|
||||||
SGW_INTERFACE_NAME_FOR_S5_S8_UP = "upsgw1";
|
|
||||||
SGW_IP_ADDRESS_FOR_S5_S8_UP = "192.168.5.2";
|
|
||||||
SGW_IP_NETMASK_FOR_S5_S8_UP = 24;
|
|
||||||
|
|
||||||
PGW_INTERFACE_NAME_FOR_S5_S8 = "uppgw0";
|
|
||||||
PGW_IP_ADDRESS_FOR_S5_S8 = "192.168.5.1";
|
|
||||||
PGW_IP_NETMASK_FOR_S5_S8 = 24;
|
|
||||||
|
|
||||||
PGW_INTERFACE_NAME_FOR_SGI = "eth0";
|
|
||||||
PGW_IP_ADDR_FOR_SGI = "192.168.14.162";
|
|
||||||
PGW_IP_NETMASK_FOR_SGI = 24;
|
|
||||||
|
|
||||||
MME_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
|
||||||
MME_IP_ADDRESS_FOR_S1_MME = "192.168.14.162";
|
|
||||||
MME_IP_NETMASK_FOR_S1_MME = 24;
|
|
||||||
|
|
||||||
MME_INTERFACE_NAME_FOR_S11_MME = "eth0";
|
|
||||||
MME_IP_ADDRESS_FOR_S11_MME = "192.168.14.162";
|
|
||||||
MME_IP_NETMASK_FOR_S11_MME = 24;
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
S6A_CONF = "../epc_nas/UTILS/CONF/s6a.conf";
|
|
||||||
|
|
||||||
REALM = "eur";
|
|
||||||
|
|
||||||
# Define the limits of the system in terms of served eNB and served UE.
|
|
||||||
# When the limits will be reached, overload procedure will take place.
|
|
||||||
|
|
||||||
MAXENB = 10;
|
|
||||||
MAXUE = 100;
|
|
||||||
|
|
||||||
RELATIVE_CAPACITY = 10;
|
|
||||||
|
|
||||||
# Display statistics about whole system (expressed in seconds)
|
|
||||||
MME_STATISTIC_TIMER = 10;
|
|
||||||
|
|
||||||
# max queue size per task
|
|
||||||
ITTI_QUEUE_SIZE = 2000000;
|
|
||||||
|
|
||||||
# ------- SCTP definitions
|
|
||||||
# Number of streams to use in input/output
|
|
||||||
|
|
||||||
SCTP_INSTREAMS = 32;
|
|
||||||
SCTP_OUTSTREAMS = 32;
|
|
||||||
|
|
||||||
# ------- S1AP definitions
|
|
||||||
|
|
||||||
# outcome drop timer value (seconds)
|
|
||||||
S1AP_OUTCOME_TIMER = 10;
|
|
||||||
|
|
||||||
# ------- MME served GUMMEI
|
|
||||||
# MME code DEFAULT = 0
|
|
||||||
# size = 8 bits
|
|
||||||
# maximum of 256 values, comma separated
|
|
||||||
MME_CODE = 30,56,1,8;
|
|
||||||
|
|
||||||
# MME GROUP ID DEFAULT = 0
|
|
||||||
# size = 16 bits
|
|
||||||
# maximum of 65535 values, comma separated
|
|
||||||
MME_GID = 3,4,5,30,8,9,50021;
|
|
||||||
|
|
||||||
# TA (mcc.mnc:tracking area code) DEFAULT = 208.34:0
|
|
||||||
# max values = 999.999:65535
|
|
||||||
# maximum of 32 values, comma separated
|
|
||||||
PLMN = 208.38:0,209.130:4,208.92:1,208.10:1;
|
|
||||||
|
|
||||||
# ------- Interfaces definitions
|
|
||||||
SGW_INTERFACE_NAME_FOR_S11 = "eth0";
|
|
||||||
SGW_IP_ADDRESS_FOR_S11 = "192.168.12.31";
|
|
||||||
SGW_IP_NETMASK_FOR_S11 = 24;
|
|
||||||
|
|
||||||
SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP = "eth0";
|
|
||||||
SGW_IP_ADDRESS_FOR_S1U_S12_S4_UP = "192.168.12.31";
|
|
||||||
SGW_IP_NETMASK_FOR_S1U_S12_S4_UP = 24;
|
|
||||||
|
|
||||||
SGW_INTERFACE_NAME_FOR_S5_S8_UP = "eth0";
|
|
||||||
SGW_IP_ADDRESS_FOR_S5_S8_UP = "192.168.12.31";
|
|
||||||
SGW_IP_NETMASK_FOR_S5_S8_UP = 24;
|
|
||||||
|
|
||||||
PGW_INTERFACE_NAME_FOR_S5_S8 = "eth0";
|
|
||||||
PGW_IP_ADDRESS_FOR_S5_S8 = "192.168.12.31";
|
|
||||||
PGW_IP_NETMASK_FOR_S5_S8 = 24;
|
|
||||||
|
|
||||||
PGW_INTERFACE_NAME_FOR_SGI = "eth0";
|
|
||||||
PGW_IP_ADDR_FOR_SGI = "192.168.12.31";
|
|
||||||
PGW_IP_NETMASK_FOR_SGI = 24;
|
|
||||||
|
|
||||||
MME_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
|
||||||
MME_IP_ADDRESS_FOR_S1_MME = "192.168.12.31";
|
|
||||||
MME_IP_NETMASK_FOR_S1_MME = 24;
|
|
||||||
|
|
||||||
MME_INTERFACE_NAME_FOR_S11_MME = "eth0";
|
|
||||||
MME_IP_ADDRESS_FOR_S11_MME = "192.168.12.31";
|
|
||||||
MME_IP_NETMASK_FOR_S11_MME = 24;
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
S6A_CONF = "../epc_nas/UTILS/CONF/s6a.conf";
|
|
||||||
|
|
||||||
REALM = "eur";
|
|
||||||
|
|
||||||
# Define the limits of the system in terms of served eNB and served UE.
|
|
||||||
# When the limits will be reached, overload procedure will take place.
|
|
||||||
|
|
||||||
MAXENB = 10;
|
|
||||||
MAXUE = 100;
|
|
||||||
|
|
||||||
RELATIVE_CAPACITY = 10;
|
|
||||||
|
|
||||||
# Display statistics about whole system (expressed in seconds)
|
|
||||||
MME_STATISTIC_TIMER = 60;
|
|
||||||
|
|
||||||
# max queue size per task
|
|
||||||
ITTI_QUEUE_SIZE = 2000000;
|
|
||||||
|
|
||||||
# ------- SCTP definitions
|
|
||||||
# Number of streams to use in input/output
|
|
||||||
|
|
||||||
SCTP_INSTREAMS = 32;
|
|
||||||
SCTP_OUTSTREAMS = 32;
|
|
||||||
|
|
||||||
# ------- S1AP definitions
|
|
||||||
|
|
||||||
# outcome drop timer value (seconds)
|
|
||||||
S1AP_OUTCOME_TIMER = 10;
|
|
||||||
|
|
||||||
# ------- MME served GUMMEI
|
|
||||||
# MME code DEFAULT = 0
|
|
||||||
# size = 8 bits
|
|
||||||
# maximum of 256 values, comma separated
|
|
||||||
MME_CODE = 30,56,1,8;
|
|
||||||
|
|
||||||
# MME GROUP ID DEFAULT = 0
|
|
||||||
# size = 16 bits
|
|
||||||
# maximum of 65535 values, comma separated
|
|
||||||
MME_GID = 3,4,5,30,8,9,50021;
|
|
||||||
|
|
||||||
# TA (mcc.mnc:tracking area code) DEFAULT = 208.34:0
|
|
||||||
# max values = 999.999:65535
|
|
||||||
# maximum of 32 values, comma separated
|
|
||||||
PLMN = 208.38:0,209.130:4,208.92:1,208.10:1;
|
|
||||||
|
|
||||||
# ------- Interfaces definitions
|
|
||||||
SGW_INTERFACE_NAME_FOR_S11 = "eth0";
|
|
||||||
SGW_IP_ADDRESS_FOR_S11 = "192.168.12.86";
|
|
||||||
SGW_IP_NETMASK_FOR_S11 = 24;
|
|
||||||
|
|
||||||
SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP = "eth0";
|
|
||||||
SGW_IP_ADDRESS_FOR_S1U_S12_S4_UP = "192.168.12.86";
|
|
||||||
SGW_IP_NETMASK_FOR_S1U_S12_S4_UP = 24;
|
|
||||||
|
|
||||||
SGW_INTERFACE_NAME_FOR_S5_S8_UP = "eth0";
|
|
||||||
SGW_IP_ADDRESS_FOR_S5_S8_UP = "192.168.12.86";
|
|
||||||
SGW_IP_NETMASK_FOR_S5_S8_UP = 24;
|
|
||||||
|
|
||||||
PGW_INTERFACE_NAME_FOR_S5_S8 = "eth0";
|
|
||||||
PGW_IP_ADDRESS_FOR_S5_S8 = "192.168.12.86";
|
|
||||||
PGW_IP_NETMASK_FOR_S5_S8 = 24;
|
|
||||||
|
|
||||||
PGW_INTERFACE_NAME_FOR_SGI = "eth0";
|
|
||||||
PGW_IP_ADDR_FOR_SGI = "192.168.12.86";
|
|
||||||
PGW_IP_NETMASK_FOR_SGI = 24;
|
|
||||||
|
|
||||||
MME_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
|
||||||
MME_IP_ADDRESS_FOR_S1_MME = "192.168.12.86";
|
|
||||||
MME_IP_NETMASK_FOR_S1_MME = 24;
|
|
||||||
|
|
||||||
MME_INTERFACE_NAME_FOR_S11_MME = "eth0";
|
|
||||||
MME_IP_ADDRESS_FOR_S11_MME = "192.168.12.86";
|
|
||||||
MME_IP_NETMASK_FOR_S11_MME = 24;
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
S6A_CONF = "../objs/UTILS/CONF/s6a.conf";
|
|
||||||
|
|
||||||
REALM = "eur";
|
|
||||||
|
|
||||||
# Define the limits of the system in terms of served eNB and served UE.
|
|
||||||
# When the limits will be reached, overload procedure will take place.
|
|
||||||
|
|
||||||
MAXENB = 10;
|
|
||||||
MAXUE = 100;
|
|
||||||
|
|
||||||
RELATIVE_CAPACITY = 10;
|
|
||||||
|
|
||||||
# Display statistics about whole system (expressed in seconds)
|
|
||||||
MME_STATISTIC_TIMER = 10;
|
|
||||||
|
|
||||||
# max queue size per task
|
|
||||||
ITTI_QUEUE_SIZE = 2000000;
|
|
||||||
|
|
||||||
# ------- SCTP definitions
|
|
||||||
# Number of streams to use in input/output
|
|
||||||
|
|
||||||
SCTP_INSTREAMS = 32;
|
|
||||||
SCTP_OUTSTREAMS = 32;
|
|
||||||
|
|
||||||
# ------- S1AP definitions
|
|
||||||
|
|
||||||
# outcome drop timer value (seconds)
|
|
||||||
S1AP_OUTCOME_TIMER = 10;
|
|
||||||
|
|
||||||
# ------- MME served GUMMEI
|
|
||||||
# MME code DEFAULT = 0
|
|
||||||
# size = 8 bits
|
|
||||||
# maximum of 256 values, comma separated
|
|
||||||
MME_CODE = 30,56,1,8;
|
|
||||||
|
|
||||||
# MME GROUP ID DEFAULT = 0
|
|
||||||
# size = 16 bits
|
|
||||||
# maximum of 65535 values, comma separated
|
|
||||||
MME_GID = 3,4,5,30,8,9,50021;
|
|
||||||
|
|
||||||
# TA (mcc.mnc:tracking area code) DEFAULT = 208.34:0
|
|
||||||
# max values = 999.999:65535
|
|
||||||
# maximum of 32 values, comma separated
|
|
||||||
PLMN = 208.38:0,209.130:4,208.35:8;
|
|
||||||
|
|
||||||
# ------- Interfaces definitions
|
|
||||||
SGW_INTERFACE_NAME_FOR_S11 = "s11sgw";
|
|
||||||
SGW_IP_ADDRESS_FOR_S11 = "192.168.33.17";
|
|
||||||
SGW_IP_NETMASK_FOR_S11 = 24;
|
|
||||||
|
|
||||||
SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP = "upsgw0";
|
|
||||||
SGW_IP_ADDRESS_FOR_S1U_S12_S4_UP = "192.168.31.17";
|
|
||||||
SGW_IP_NETMASK_FOR_S1U_S12_S4_UP = 24;
|
|
||||||
|
|
||||||
SGW_INTERFACE_NAME_FOR_S5_S8_UP = "upsgw1";
|
|
||||||
SGW_IP_ADDRESS_FOR_S5_S8_UP = "192.168.5.2";
|
|
||||||
SGW_IP_NETMASK_FOR_S5_S8_UP = 24;
|
|
||||||
|
|
||||||
PGW_INTERFACE_NAME_FOR_S5_S8 = "uppgw0";
|
|
||||||
PGW_IP_ADDRESS_FOR_S5_S8 = "192.168.5.1";
|
|
||||||
PGW_IP_NETMASK_FOR_S5_S8 = 24;
|
|
||||||
|
|
||||||
PGW_INTERFACE_NAME_FOR_SGI = "eth2";
|
|
||||||
PGW_IP_ADDR_FOR_SGI = "192.168.13.17";
|
|
||||||
PGW_IP_NETMASK_FOR_SGI = 24;
|
|
||||||
|
|
||||||
MME_INTERFACE_NAME_FOR_S1_MME = "cpmme0";
|
|
||||||
MME_IP_ADDRESS_FOR_S1_MME = "192.168.30.17";
|
|
||||||
MME_IP_NETMASK_FOR_S1_MME = 24;
|
|
||||||
|
|
||||||
MME_INTERFACE_NAME_FOR_S11_MME = "s11mme";
|
|
||||||
MME_IP_ADDRESS_FOR_S11_MME = "192.168.33.117";
|
|
||||||
MME_IP_NETMASK_FOR_S11_MME = 24;
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
S6A_CONF = "../objs/UTILS/CONF/s6a.conf";
|
|
||||||
|
|
||||||
REALM = "eur";
|
|
||||||
|
|
||||||
# Define the limits of the system in terms of served eNB and served UE.
|
|
||||||
# When the limits will be reached, overload procedure will take place.
|
|
||||||
|
|
||||||
MAXENB = 10;
|
|
||||||
MAXUE = 100;
|
|
||||||
|
|
||||||
RELATIVE_CAPACITY = 10;
|
|
||||||
|
|
||||||
# Display statistics about whole system (expressed in seconds)
|
|
||||||
MME_STATISTIC_TIMER = 10;
|
|
||||||
|
|
||||||
# max queue size per task
|
|
||||||
ITTI_QUEUE_SIZE = 2000000;
|
|
||||||
|
|
||||||
# ------- SCTP definitions
|
|
||||||
# Number of streams to use in input/output
|
|
||||||
|
|
||||||
SCTP_INSTREAMS = 32;
|
|
||||||
SCTP_OUTSTREAMS = 32;
|
|
||||||
|
|
||||||
# ------- S1AP definitions
|
|
||||||
|
|
||||||
# outcome drop timer value (seconds)
|
|
||||||
S1AP_OUTCOME_TIMER = 10;
|
|
||||||
|
|
||||||
# ------- MME served GUMMEI
|
|
||||||
# MME code DEFAULT = 0
|
|
||||||
# size = 8 bits
|
|
||||||
# maximum of 256 values, comma separated
|
|
||||||
MME_CODE = 30,56,1,8;
|
|
||||||
|
|
||||||
# MME GROUP ID DEFAULT = 0
|
|
||||||
# size = 16 bits
|
|
||||||
# maximum of 65535 values, comma separated
|
|
||||||
MME_GID = 3,4,5,30,8,9,50021;
|
|
||||||
|
|
||||||
# TA (mcc.mnc:tracking area code) DEFAULT = 208.34:0
|
|
||||||
# max values = 999.999:65535
|
|
||||||
# maximum of 32 values, comma separated
|
|
||||||
PLMN = 208.38:0,209.130:4,208.35:8;
|
|
||||||
|
|
||||||
# ------- Interfaces definitions
|
|
||||||
SGW_INTERFACE_NAME_FOR_S11 = "eth0";
|
|
||||||
SGW_IP_ADDRESS_FOR_S11 = "192.168.14.162";
|
|
||||||
SGW_IP_NETMASK_FOR_S11 = 24;
|
|
||||||
|
|
||||||
SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP = "eth0";
|
|
||||||
SGW_IP_ADDRESS_FOR_S1U_S12_S4_UP = "192.168.14.162";
|
|
||||||
SGW_IP_NETMASK_FOR_S1U_S12_S4_UP = 24;
|
|
||||||
|
|
||||||
SGW_INTERFACE_NAME_FOR_S5_S8_UP = "upsgw1";
|
|
||||||
SGW_IP_ADDRESS_FOR_S5_S8_UP = "192.168.5.2";
|
|
||||||
SGW_IP_NETMASK_FOR_S5_S8_UP = 24;
|
|
||||||
|
|
||||||
PGW_INTERFACE_NAME_FOR_S5_S8 = "uppgw0";
|
|
||||||
PGW_IP_ADDRESS_FOR_S5_S8 = "192.168.5.1";
|
|
||||||
PGW_IP_NETMASK_FOR_S5_S8 = 24;
|
|
||||||
|
|
||||||
PGW_INTERFACE_NAME_FOR_SGI = "eth0";
|
|
||||||
PGW_IP_ADDR_FOR_SGI = "192.168.14.162";
|
|
||||||
PGW_IP_NETMASK_FOR_SGI = 24;
|
|
||||||
|
|
||||||
MME_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
|
||||||
MME_IP_ADDRESS_FOR_S1_MME = "192.168.12.175";
|
|
||||||
MME_IP_NETMASK_FOR_S1_MME = 24;
|
|
||||||
|
|
||||||
MME_INTERFACE_NAME_FOR_S11_MME = "eth0";
|
|
||||||
MME_IP_ADDRESS_FOR_S11_MME = "192.168.12.175";
|
|
||||||
MME_IP_NETMASK_FOR_S11_MME = 24;
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
S6A_CONF = "../objs/UTILS/CONF/s6a.conf";
|
|
||||||
|
|
||||||
REALM = "eur";
|
|
||||||
|
|
||||||
# Define the limits of the system in terms of served eNB and served UE.
|
|
||||||
# When the limits will be reached, overload procedure will take place.
|
|
||||||
|
|
||||||
MAXENB = 10;
|
|
||||||
MAXUE = 100;
|
|
||||||
|
|
||||||
RELATIVE_CAPACITY = 10;
|
|
||||||
|
|
||||||
# Display statistics about whole system (expressed in seconds)
|
|
||||||
MME_STATISTIC_TIMER = 10;
|
|
||||||
|
|
||||||
# max queue size per task
|
|
||||||
ITTI_QUEUE_SIZE = 2000000;
|
|
||||||
|
|
||||||
# ------- SCTP definitions
|
|
||||||
# Number of streams to use in input/output
|
|
||||||
|
|
||||||
SCTP_INSTREAMS = 32;
|
|
||||||
SCTP_OUTSTREAMS = 32;
|
|
||||||
|
|
||||||
# ------- S1AP definitions
|
|
||||||
|
|
||||||
# outcome drop timer value (seconds)
|
|
||||||
S1AP_OUTCOME_TIMER = 10;
|
|
||||||
|
|
||||||
# ------- MME served GUMMEI
|
|
||||||
# MME code DEFAULT = 0
|
|
||||||
# size = 8 bits
|
|
||||||
# maximum of 256 values, comma separated
|
|
||||||
MME_CODE = 30,56,1,8;
|
|
||||||
|
|
||||||
# MME GROUP ID DEFAULT = 0
|
|
||||||
# size = 16 bits
|
|
||||||
# maximum of 65535 values, comma separated
|
|
||||||
MME_GID = 3,4,5,30,8,9,50021;
|
|
||||||
|
|
||||||
# TA (mcc.mnc:tracking area code) DEFAULT = 208.34:0
|
|
||||||
# max values = 999.999:65535
|
|
||||||
# maximum of 32 values, comma separated
|
|
||||||
PLMN = 208.38:0,209.130:4,208.35:8;
|
|
||||||
|
|
||||||
# ------- Interfaces definitions
|
|
||||||
SGW_INTERFACE_NAME_FOR_S11 = "s11sgw";
|
|
||||||
SGW_IP_ADDRESS_FOR_S11 = "192.168.33.17";
|
|
||||||
SGW_IP_NETMASK_FOR_S11 = 24;
|
|
||||||
|
|
||||||
SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP = "upsgw0";
|
|
||||||
SGW_IP_ADDRESS_FOR_S1U_S12_S4_UP = "192.168.31.17";
|
|
||||||
SGW_IP_NETMASK_FOR_S1U_S12_S4_UP = 24;
|
|
||||||
|
|
||||||
SGW_INTERFACE_NAME_FOR_S5_S8_UP = "upsgw1";
|
|
||||||
SGW_IP_ADDRESS_FOR_S5_S8_UP = "192.168.5.2";
|
|
||||||
SGW_IP_NETMASK_FOR_S5_S8_UP = 24;
|
|
||||||
|
|
||||||
PGW_INTERFACE_NAME_FOR_S5_S8 = "uppgw0";
|
|
||||||
PGW_IP_ADDRESS_FOR_S5_S8 = "192.168.5.1";
|
|
||||||
PGW_IP_NETMASK_FOR_S5_S8 = 24;
|
|
||||||
|
|
||||||
PGW_INTERFACE_NAME_FOR_SGI = "eth2";
|
|
||||||
PGW_IP_ADDR_FOR_SGI = "192.168.13.17";
|
|
||||||
PGW_IP_NETMASK_FOR_SGI = 24;
|
|
||||||
|
|
||||||
MME_INTERFACE_NAME_FOR_S1_MME = "cpmme0";
|
|
||||||
MME_IP_ADDRESS_FOR_S1_MME = "192.168.30.17";
|
|
||||||
MME_IP_NETMASK_FOR_S1_MME = 24;
|
|
||||||
|
|
||||||
MME_INTERFACE_NAME_FOR_S11_MME = "s11mme";
|
|
||||||
MME_IP_ADDRESS_FOR_S11_MME = "192.168.33.117";
|
|
||||||
MME_IP_NETMASK_FOR_S11_MME = 24;
|
|
||||||
@@ -1,97 +0,0 @@
|
|||||||
# -------- Local ---------
|
|
||||||
|
|
||||||
# Uncomment if the framework cannot resolv it.
|
|
||||||
Identity = "@MME_FQDN@";
|
|
||||||
Realm = "@REALM@";
|
|
||||||
|
|
||||||
# TLS configuration (see previous section)
|
|
||||||
TLS_Cred = "${FREEDIAMETER_PATH}/../etc/freeDiameter/mme.cert.pem",
|
|
||||||
"${FREEDIAMETER_PATH}/../etc/freeDiameter/mme.key.pem";
|
|
||||||
TLS_CA = "${FREEDIAMETER_PATH}/../etc/freeDiameter/mme.cacert.pem";
|
|
||||||
|
|
||||||
# Disable use of TCP protocol (only listen and connect in SCTP)
|
|
||||||
# Default : TCP enabled
|
|
||||||
@TRANSPORT_option@;
|
|
||||||
|
|
||||||
# This option is ignored if freeDiameter is compiled with DISABLE_SCTP option.
|
|
||||||
# Prefer TCP instead of SCTP for establishing new connections.
|
|
||||||
# This setting may be overwritten per peer in peer configuration blocs.
|
|
||||||
# Default : SCTP is attempted first.
|
|
||||||
@TRANSPORT_PREFER_TCP_option@;
|
|
||||||
|
|
||||||
|
|
||||||
No_IPv6;
|
|
||||||
|
|
||||||
# Overwrite the number of SCTP streams. This value should be kept low,
|
|
||||||
# especially if you are using TLS over SCTP, because it consumes a lot of
|
|
||||||
# resources in that case. See tickets 19 and 27 for some additional details on
|
|
||||||
# this.
|
|
||||||
# Limit the number of SCTP streams
|
|
||||||
SCTP_streams = 3;
|
|
||||||
|
|
||||||
|
|
||||||
# By default, freeDiameter acts as a Diameter Relay Agent by forwarding all
|
|
||||||
# messages it cannot handle locally. This parameter disables this behavior.
|
|
||||||
NoRelay;
|
|
||||||
|
|
||||||
|
|
||||||
TLS_old_method;
|
|
||||||
|
|
||||||
|
|
||||||
AppServThreads = 1;
|
|
||||||
|
|
||||||
# Specify the addresses on which to bind the listening server. This must be
|
|
||||||
# specified if the framework is unable to auto-detect these addresses, or if the
|
|
||||||
# auto-detected values are incorrect. Note that the list of addresses is sent
|
|
||||||
# in CER or CEA message, so one should pay attention to this parameter if some
|
|
||||||
# adresses should be kept hidden.
|
|
||||||
@ListenOn@
|
|
||||||
|
|
||||||
@DIAMETER_PORT@;
|
|
||||||
@DIAMETER_SEC_PORT@;
|
|
||||||
|
|
||||||
# -------- Extensions ---------
|
|
||||||
|
|
||||||
# Uncomment (and create rtd.conf) to specify routing table for this peer.
|
|
||||||
#LoadExtension = "rt_default.fdx" : "rtd.conf";
|
|
||||||
|
|
||||||
# Uncomment (and create acl.conf) to allow incoming connections from other peers.
|
|
||||||
#LoadExtension = "acl_wl.fdx" : "acl.conf";
|
|
||||||
|
|
||||||
# Uncomment to display periodic state information
|
|
||||||
#LoadExtension = "dbg_monitor.fdx";
|
|
||||||
|
|
||||||
# Uncomment to enable an interactive Python interpreter session.
|
|
||||||
# (see doc/dbg_interactive.py.sample for more information)
|
|
||||||
#LoadExtension = "dbg_interactive.fdx";
|
|
||||||
|
|
||||||
# Load the RFC4005 dictionary objects
|
|
||||||
#LoadExtension = "dict_nasreq.fdx";
|
|
||||||
|
|
||||||
LoadExtension = "dict_nas_mipv6.fdx";
|
|
||||||
LoadExtension = "dict_s6a.fdx";
|
|
||||||
|
|
||||||
# Load RFC4072 dictionary objects
|
|
||||||
#LoadExtension = "dict_eap.fdx";
|
|
||||||
|
|
||||||
# Load the Diameter EAP server extension (requires diameap.conf)
|
|
||||||
#LoadExtension = "app_diameap.fdx" : "diameap.conf";
|
|
||||||
|
|
||||||
# Load the Accounting Server extension (requires app_acct.conf)
|
|
||||||
#LoadExtension = "app_acct.fdx" : "app_acct.conf";
|
|
||||||
|
|
||||||
# -------- Peers ---------
|
|
||||||
|
|
||||||
# The framework will actively attempt to establish and maintain a connection
|
|
||||||
# with the peers listed here.
|
|
||||||
# For only accepting incoming connections, see the acl_wl.fx extension.
|
|
||||||
|
|
||||||
# ConnectPeer
|
|
||||||
# Declare a remote peer to which this peer must maintain a connection.
|
|
||||||
# In addition, this allows specifying non-default parameters for this peer only
|
|
||||||
# (for example disable SCTP with this peer, or use RFC3588-flavour TLS).
|
|
||||||
# Note that by default, if a peer is not listed as a ConnectPeer entry, an
|
|
||||||
# incoming connection from this peer will be rejected. If you want to accept
|
|
||||||
# incoming connections from other peers, see the acl_wl.fdx? extension which
|
|
||||||
# allows exactly this.
|
|
||||||
@ConnectPeer@ = "@HSS_FQDN@" { ConnectTo = "@HSS_IP@"; No_IPv6; No_TLS ; port = 3868; Realm = "@REALM@"; };
|
|
||||||
Reference in New Issue
Block a user