remove more files, add a LOG_E() for UE not developped use case
This commit is contained in:
@@ -1,23 +0,0 @@
|
||||
#ifndef _TIME_UTILS_H_
|
||||
#define _TIME_UTILS_H_
|
||||
|
||||
#include <time.h>
|
||||
#include <stdint.h>
|
||||
|
||||
static inline int64_t clock_difftime_ns(struct timespec start, struct timespec end)
|
||||
{
|
||||
struct timespec temp;
|
||||
int64_t temp_ns;
|
||||
|
||||
if ((end.tv_nsec-start.tv_nsec)<0) {
|
||||
temp.tv_sec = end.tv_sec-start.tv_sec-1;
|
||||
temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec;
|
||||
} else {
|
||||
temp.tv_sec = end.tv_sec-start.tv_sec;
|
||||
temp.tv_nsec = end.tv_nsec-start.tv_nsec;
|
||||
}
|
||||
temp_ns = (int64_t)(temp.tv_sec) * (int64_t)1000000000 + (temp.tv_nsec);
|
||||
return temp_ns;
|
||||
}
|
||||
|
||||
#endif /* _TIME_UTILS_H_ */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,21 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
@@ -4783,7 +4783,7 @@ void phy_procedures_UE_lte(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,u
|
||||
if (msg_p != NULL) {
|
||||
switch (ITTI_MSG_ID(msg_p)) {
|
||||
case PHY_FIND_CELL_REQ:
|
||||
LOG_I(PHY, "[UE %d] Received %s\n", ITTI_MSG_INSTANCE (msg_p) - NB_eNB_INST, ITTI_MSG_NAME (msg_p));
|
||||
LOG_E(PHY, "[UE %d] Received PLMN doesn't match SIM data, but not developped further processing %s\n", ITTI_MSG_INSTANCE (msg_p) - NB_eNB_INST, ITTI_MSG_NAME (msg_p));
|
||||
/* TODO process the message */
|
||||
break;
|
||||
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
@@ -1,439 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*!
|
||||
*******************************************************************************
|
||||
|
||||
\file rrc_2_rrm_msg.c
|
||||
|
||||
\brief data formating for sending message over socket between RRC and RRM
|
||||
|
||||
\author BURLOT Pascal
|
||||
|
||||
\date 16/07/08
|
||||
|
||||
\par Historique:
|
||||
P.BURLOT 2009-01-20
|
||||
bug fix (memeory leak)
|
||||
Macro changed :
|
||||
RRM_CALLOC() by RRM_CALLOC2() in msg_rrc_sensing_meas_ind()
|
||||
|
||||
*******************************************************************************
|
||||
*/
|
||||
#ifdef RRC_EMUL
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/un.h>
|
||||
#include "L3_rrc_defs.h"
|
||||
#include "rrm_sock.h"
|
||||
#include "L3_rrc_interface.h"
|
||||
#include "rrc_rrm_msg.h"
|
||||
#include "rrm_util.h"
|
||||
|
||||
#else
|
||||
|
||||
#include "defs.h"
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef TRACE
|
||||
//! Macro creant la chaine a partir du nom de la variable
|
||||
#define STRINGIZER(x) #x
|
||||
//! Tableau pour le mode trace faisant la translation entre le numero et le nom du message
|
||||
const char *Str_msg_rrc_rrm[NB_MSG_RRC_RRM] = {
|
||||
STRINGIZER(RRM_RB_ESTABLISH_REQ ),
|
||||
STRINGIZER(RRC_RB_ESTABLISH_RESP ),
|
||||
STRINGIZER(RRC_RB_ESTABLISH_CFM ),
|
||||
STRINGIZER(RRM_RB_MODIFY_REQ ),
|
||||
STRINGIZER(RRC_RB_MODIFY_RESP ),
|
||||
STRINGIZER(RRC_RB_MODIFY_CFM ),
|
||||
STRINGIZER(RRM_RB_RELEASE_REQ ),
|
||||
STRINGIZER(RRC_RB_RELEASE_RESP ),
|
||||
STRINGIZER(RRC_MR_ATTACH_IND ),
|
||||
STRINGIZER(RRM_SENSING_MEAS_REQ ),
|
||||
STRINGIZER(RRC_SENSING_MEAS_RESP ),
|
||||
STRINGIZER(RRC_CX_ESTABLISH_IND ),
|
||||
STRINGIZER(RRC_PHY_SYNCH_TO_MR_IND ),
|
||||
STRINGIZER(RRC_PHY_SYNCH_TO_CH_IND ),
|
||||
STRINGIZER(RRCI_CX_ESTABLISH_RESP ),
|
||||
STRINGIZER(RRC_SENSING_MEAS_IND ),
|
||||
STRINGIZER(RRM_SENSING_MEAS_RESP ),
|
||||
STRINGIZER(RRC_RB_MEAS_IND ),
|
||||
STRINGIZER(RRM_RB_MEAS_RESP ),
|
||||
STRINGIZER(RRM_INIT_CH_REQ ),
|
||||
STRINGIZER(RRCI_INIT_MR_REQ )
|
||||
} ;
|
||||
#endif
|
||||
|
||||
/*!
|
||||
*******************************************************************************
|
||||
\brief This function initialize the message header
|
||||
\return any return value
|
||||
*/
|
||||
static void init_rrc_msg_head(
|
||||
msg_head_t *msg_head , //!< message header to initialize
|
||||
Instance_t inst , //!< Instance ID
|
||||
MSG_RRC_RRM_T msg_type , //!< type of message to initialize
|
||||
unsigned int size , //!< size of message
|
||||
Transaction_t Trans_id //!< transaction id associated to this message
|
||||
)
|
||||
{
|
||||
if ( msg_head != NULL ) {
|
||||
msg_head->start = START_MSG ;
|
||||
msg_head->msg_type = 0xFF & msg_type ;
|
||||
msg_head->inst = inst ;
|
||||
msg_head->Trans_id = Trans_id ;
|
||||
msg_head->size = size;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
*******************************************************************************
|
||||
\brief La fonction formate en un message generique de reponse pour les
|
||||
fonctions :
|
||||
- rrc_rb_establish_resp(),rrc_rb_modify_resp(),rrc_rb_modify_resp(),
|
||||
- rrc_rb_release_resp() et rrc_sensing_meas_resp() .
|
||||
\return message formate
|
||||
*/
|
||||
msg_t mesg;
|
||||
msg_t *msg_rrc_generic_resp(
|
||||
Instance_t inst , //!< Instance ID
|
||||
MSG_RRC_RRM_T msg_type , //!< type of message
|
||||
Transaction_t Trans_id //!< Transaction ID
|
||||
)
|
||||
{
|
||||
init_rrc_msg_head(&(mesg.head),inst, msg_type, 0 , Trans_id);
|
||||
mesg.data = NULL ;
|
||||
|
||||
return &mesg ;
|
||||
}
|
||||
|
||||
/*!
|
||||
*******************************************************************************
|
||||
\brief La fonction formate en un message les parametres de la fonction
|
||||
rrc_rb_establish_resp().
|
||||
\return message formate
|
||||
*/
|
||||
msg_t *msg_rrc_rb_establish_resp(
|
||||
Instance_t inst , //!< Instance ID
|
||||
Transaction_t Trans_id //!< Transaction ID
|
||||
)
|
||||
{
|
||||
return msg_rrc_generic_resp( inst, RRC_RB_ESTABLISH_RESP, Trans_id) ;
|
||||
}
|
||||
/*!
|
||||
*******************************************************************************
|
||||
\brief La fonction formate en un message les parametres de la fonction
|
||||
rrc_rb_establish_cfm().
|
||||
\return message formate
|
||||
*/
|
||||
rrc_rb_establish_cfm_t P_rb_est_cfm ;//= RRM_CALLOC(rrc_rb_establish_cfm_t , 1 ) ;
|
||||
msg_t *msg_rrc_rb_establish_cfm(
|
||||
Instance_t inst , //!< Instance ID
|
||||
RB_ID Rb_id , //!< Radio Bearer ID used by RRC
|
||||
RB_TYPE RB_type , //!< Radio Bearer Type
|
||||
Transaction_t Trans_id //!< Transaction ID
|
||||
)
|
||||
{
|
||||
// msg_t mesg;
|
||||
|
||||
init_rrc_msg_head(&(mesg.head),inst,RRC_RB_ESTABLISH_CFM, sizeof( rrc_rb_establish_cfm_t ) ,Trans_id);
|
||||
P_rb_est_cfm.Rb_id = Rb_id ;
|
||||
P_rb_est_cfm.RB_type = RB_type ;
|
||||
mesg.data = (char *) &P_rb_est_cfm ;
|
||||
return &mesg ;
|
||||
|
||||
}
|
||||
|
||||
/*!
|
||||
*******************************************************************************
|
||||
\brief La fonction formate en un message les parametres de la fonction
|
||||
rrc_rb_modify_resp().
|
||||
\return message formate
|
||||
*/
|
||||
msg_t *msg_rrc_rb_modify_resp(
|
||||
Instance_t inst , //!< Instance ID
|
||||
Transaction_t Trans_id //!< Transaction ID
|
||||
)
|
||||
{
|
||||
return msg_rrc_generic_resp( inst,RRC_RB_MODIFY_RESP, Trans_id) ;
|
||||
}
|
||||
/*!
|
||||
*******************************************************************************
|
||||
\brief La fonction formate en un message les parametres de la fonction
|
||||
rrc_rb_modify_cfm().
|
||||
\return message formate
|
||||
*/
|
||||
rrc_rb_modify_cfm_t P_rb_md_cfm;
|
||||
msg_t *msg_rrc_rb_modify_cfm(
|
||||
Instance_t inst , //!< Instance ID
|
||||
RB_ID Rb_id , //!< Radio Bearer ID used by RRC
|
||||
Transaction_t Trans_id //!< Transaction ID
|
||||
)
|
||||
{
|
||||
// msg_t mesg;
|
||||
init_rrc_msg_head(&(mesg.head),inst,RRC_RB_MODIFY_CFM, sizeof( rrc_rb_modify_cfm_t ) ,Trans_id);
|
||||
P_rb_md_cfm.Rb_id = Rb_id ;
|
||||
mesg.data = (char *) &P_rb_md_cfm ;
|
||||
return &mesg ;
|
||||
|
||||
}
|
||||
|
||||
/*!
|
||||
*******************************************************************************
|
||||
\brief La fonction formate en un message les parametres de la fonction
|
||||
rrc_rb_release_resp().
|
||||
\return message formate
|
||||
*/
|
||||
msg_t *msg_rrc_rb_release_resp(
|
||||
Instance_t inst , //!< Instance ID
|
||||
Transaction_t Trans_id //!< Transaction ID
|
||||
)
|
||||
{
|
||||
return msg_rrc_generic_resp( inst,RRC_RB_RELEASE_RESP, Trans_id) ;
|
||||
}
|
||||
/*!
|
||||
*******************************************************************************
|
||||
\brief La fonction formate en un message les parametres de la fonction
|
||||
rrc_MR_attach_ind().
|
||||
\return message formate
|
||||
*/
|
||||
rrc_MR_attach_ind_t P_att_ind;
|
||||
msg_t * msg_rrc_MR_attach_ind(
|
||||
Instance_t inst , //!< Instance ID
|
||||
L2_ID L2_id
|
||||
)
|
||||
{
|
||||
// msg_t mesg;
|
||||
init_rrc_msg_head(&(mesg.head),inst,RRC_MR_ATTACH_IND, sizeof( rrc_MR_attach_ind_t ) ,0);
|
||||
memcpy( P_att_ind.L2_id.L2_id, L2_id.L2_id, sizeof(L2_ID) ) ;
|
||||
mesg.data = (char *) &P_att_ind ;
|
||||
return &mesg ;
|
||||
}
|
||||
|
||||
/*!
|
||||
*******************************************************************************
|
||||
\brief La fonction formate en un message les parametres de la fonction
|
||||
rrc_sensing_meas_resp().
|
||||
\return message formate
|
||||
*/
|
||||
msg_t *msg_rrc_sensing_meas_resp(
|
||||
Instance_t inst , //!< Instance ID
|
||||
Transaction_t Trans_id //!< Transaction ID
|
||||
)
|
||||
{
|
||||
return msg_rrc_generic_resp( inst,RRC_SENSING_MEAS_RESP, Trans_id) ;
|
||||
}
|
||||
/*!
|
||||
*******************************************************************************
|
||||
\brief La fonction formate en un message les parametres de la fonction
|
||||
rrc_cx_establish_ind().
|
||||
\return message formate
|
||||
*/
|
||||
rrc_cx_establish_ind_t P_cx_est_ind;
|
||||
msg_t * msg_rrc_cx_establish_ind(
|
||||
Instance_t inst , //!< Instance ID
|
||||
L2_ID L2_id , //!< Layer 2 (MAC) ID
|
||||
Transaction_t Trans_id , //!< Transaction ID
|
||||
unsigned char *L3_info , //!< Optional L3 Information
|
||||
L3_INFO_T L3_info_t , //!< Type of L3 Information
|
||||
RB_ID DTCH_B_id , //!< RBID of broadcast IP service (MR only)
|
||||
RB_ID DTCH_id //!< RBID of default IP service (MR only)
|
||||
)
|
||||
{
|
||||
//msg_t mesg;
|
||||
init_rrc_msg_head(&(mesg.head),inst,RRC_CX_ESTABLISH_IND, sizeof( rrc_cx_establish_ind_t ) ,Trans_id);
|
||||
memcpy( P_cx_est_ind.L2_id.L2_id, L2_id.L2_id, sizeof(L2_ID) ) ;
|
||||
P_cx_est_ind.DTCH_B_id = DTCH_B_id ;
|
||||
P_cx_est_ind.DTCH_id = DTCH_id ;
|
||||
P_cx_est_ind.L3_info_t = L3_info_t ;
|
||||
|
||||
if ( L3_info_t == IPv4_ADDR ) {
|
||||
memcpy( P_cx_est_ind.L3_info, L3_info, 4 );
|
||||
} else if ( L3_info_t == IPv6_ADDR ) {
|
||||
memcpy( P_cx_est_ind.L3_info, L3_info, 16 );
|
||||
}
|
||||
|
||||
mesg.data = (char *) &P_cx_est_ind ;
|
||||
return &mesg ;
|
||||
}
|
||||
/*!
|
||||
*******************************************************************************
|
||||
\brief La fonction formate en un message les parametres de la fonction
|
||||
rrc_phy_synch_to_MR_ind().
|
||||
\return message formate
|
||||
*/
|
||||
rrc_phy_synch_to_MR_ind_t P_snc_mr;
|
||||
msg_t * msg_rrc_phy_synch_to_MR_ind(
|
||||
Instance_t inst , //!< Instance ID
|
||||
L2_ID L2_id
|
||||
)
|
||||
{
|
||||
//msg_t smsg;
|
||||
init_rrc_msg_head(&(mesg.head),inst,RRC_PHY_SYNCH_TO_MR_IND, sizeof( rrc_phy_synch_to_MR_ind_t ) ,0);
|
||||
memcpy(&P_snc_mr.L2_id,(L2_ID*)&L2_id,sizeof(L2_ID));
|
||||
mesg.data = (char *)&P_snc_mr ;
|
||||
msg("[msg_rrc_phy_synch_to_MR_ind] from Inst :%d\n",mesg.head.inst);
|
||||
return &mesg ;
|
||||
}
|
||||
/*!
|
||||
*******************************************************************************
|
||||
\brief La fonction formate en un message les parametres de la fonction
|
||||
rrc_phy_synch_to_CH_ind().
|
||||
\return message formate
|
||||
*/
|
||||
rrc_phy_synch_to_CH_ind_t P_snc_ch;
|
||||
msg_t * msg_rrc_phy_synch_to_CH_ind(
|
||||
Instance_t inst , //!< Instance ID
|
||||
unsigned int Ch_index , //!< Clusterhead index
|
||||
L2_ID L2_id
|
||||
)
|
||||
{
|
||||
// msg_t smsg;
|
||||
init_rrc_msg_head(&(mesg.head),inst, RRC_PHY_SYNCH_TO_CH_IND, sizeof( rrc_phy_synch_to_CH_ind_t ) ,0);
|
||||
P_snc_ch.Ch_index = Ch_index ;
|
||||
memcpy(&P_snc_ch.L2_id,(L2_ID*)&L2_id,sizeof(L2_ID));
|
||||
mesg.data = (char *) &P_snc_ch;
|
||||
msg("[msg_rrc_phy_synch_to_CH_ind] from Inst :%d\n",mesg.head.inst);
|
||||
return &mesg ;
|
||||
}
|
||||
|
||||
/*!
|
||||
*******************************************************************************
|
||||
\brief La fonction formate en un message les parametres de la fonction
|
||||
rrc_sensing_meas_ind().
|
||||
\return message formate
|
||||
*/
|
||||
rrc_sensing_meas_ind_t P_sens_ind;
|
||||
msg_t * msg_rrc_sensing_meas_ind(
|
||||
Instance_t inst , //!< Instance ID
|
||||
L2_ID L2_id , //!< Layer 2 ID (MAC) of sensing node
|
||||
unsigned int NB_meas , //!< Layer 2 ID (MAC) of sensing node
|
||||
SENSING_MEAS_T *Sensing_meas , //!< Sensing Information
|
||||
Transaction_t Trans_id //!< Transaction ID
|
||||
)
|
||||
{
|
||||
|
||||
// msg_t mesg;
|
||||
unsigned int size = sizeof( rrc_sensing_meas_ind_t ) + (NB_meas-1) * sizeof(SENSING_MEAS_T) ;
|
||||
// Note : (NB_meas-1) car la première est incorporé dans rrc_sensing_meas_ind_t
|
||||
init_rrc_msg_head(&(mesg.head),inst, RRC_SENSING_MEAS_IND, size ,Trans_id);
|
||||
memcpy( P_sens_ind.L2_id.L2_id, L2_id.L2_id, sizeof(L2_ID) ) ;
|
||||
|
||||
if ( NB_meas > 0 ) {
|
||||
memcpy( P_sens_ind.Sensing_meas , Sensing_meas, NB_meas * sizeof(SENSING_MEAS_T) ) ;
|
||||
}
|
||||
|
||||
P_sens_ind.NB_meas = NB_meas ;
|
||||
mesg.data = (char *) &P_sens_ind ;
|
||||
return &mesg ;
|
||||
}
|
||||
|
||||
/*!
|
||||
*******************************************************************************
|
||||
\brief La fonction formate en un message les parametres de la fonction
|
||||
rrc_rb_meas_ind().
|
||||
\return message formate
|
||||
*/
|
||||
rrc_rb_meas_ind_t P_rb_meas;
|
||||
msg_t * msg_rrc_rb_meas_ind(
|
||||
Instance_t inst , //!< Instance ID
|
||||
RB_ID Rb_id , //!< Radio Bearer ID
|
||||
L2_ID L2_id , //!< Layer 2 (MAC) IDs for link
|
||||
MEAS_MODE Meas_mode , //!< Measurement mode (periodic or event-driven)
|
||||
MAC_RLC_MEAS_T *Mac_rlc_meas , //!< MAC/RLC measurements
|
||||
Transaction_t Trans_id //!< Transaction ID
|
||||
)
|
||||
{
|
||||
//msg_t mesg;
|
||||
init_rrc_msg_head(&(mesg.head),inst, RRC_RB_MEAS_IND, sizeof( rrc_rb_meas_ind_t ) ,Trans_id);
|
||||
memcpy( P_rb_meas.L2_id.L2_id, L2_id.L2_id, sizeof(L2_ID) ) ;
|
||||
memcpy( &(P_rb_meas.Mac_rlc_meas), Mac_rlc_meas, sizeof(L2_ID) ) ;
|
||||
P_rb_meas.Rb_id = Rb_id ;
|
||||
P_rb_meas.Meas_mode = Meas_mode ;
|
||||
mesg.data = (char *) &P_rb_meas;
|
||||
return &mesg ;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
rrc_init_scan_req_t P_init_scan;
|
||||
msg_t * msg_rrc_init_scan_req(
|
||||
Instance_t inst , //!< Instance ID
|
||||
L2_ID L2_id , //!< Layer 2 (MAC) IDs for link
|
||||
unsigned int Interv
|
||||
)
|
||||
{
|
||||
//msg_t mesg;
|
||||
msg("RRCI: inst %d sendind rrc_init_scan_req from FC %d %d\n",inst,L2_id.L2_id[0],L2_id.L2_id[7]);
|
||||
init_rrc_msg_head(&(mesg.head),inst, RRC_INIT_SCAN_REQ, sizeof( rrc_init_scan_req_t ) ,0);
|
||||
memcpy( &P_init_scan.L2_id.L2_id[0], &L2_id.L2_id[0], sizeof(L2_ID) ) ;
|
||||
P_init_scan.interv=Interv;
|
||||
|
||||
return &mesg ;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
rrc_update_sens_t P_update_sens;
|
||||
msg_t * msg_rrc_update_sens(
|
||||
Instance_t inst , //!< Instance ID
|
||||
Sens_ch_t *Sens,
|
||||
L2_ID L2_id,
|
||||
unsigned char NB_info
|
||||
)
|
||||
{
|
||||
//msg_t mesg;
|
||||
init_rrc_msg_head(&(mesg.head),inst, RRC_UPDATE_SENS, sizeof( rrc_update_sens_t ) ,0);
|
||||
memcpy( &P_update_sens.L2_id.L2_id[0], &L2_id.L2_id[0], sizeof(L2_ID) ) ;
|
||||
memcpy( &P_update_sens.Sens_meas[0], (rrc_update_sens_t *)Sens, NB_info*sizeof(Sens_ch_t) ) ;
|
||||
P_update_sens.NB_info=NB_info;
|
||||
return &mesg ;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
rrc_end_scan_req_t P_end_scan;
|
||||
msg_t * msg_rrc_end_scan_req(
|
||||
Instance_t inst , //!< Instance ID
|
||||
unsigned char CH_index
|
||||
)
|
||||
{
|
||||
|
||||
//msg_t mesg;
|
||||
msg("RRC: send END_SCAN_REQ, INST %d\n",inst);
|
||||
init_rrc_msg_head(&(mesg.head),inst, RRC_END_SCAN_REQ, sizeof( rrc_end_scan_req_t ) ,0);
|
||||
P_update_sens.L2_id.L2_id[0]=CH_index;
|
||||
return &mesg ;
|
||||
|
||||
}
|
||||
|
||||
@@ -3301,6 +3301,7 @@ int decode_SIB1( const protocol_ctxt_t* const ctxt_pP, const uint8_t eNB_index,
|
||||
msg_p = itti_alloc_new_message(TASK_RRC_UE, PHY_FIND_NEXT_CELL_REQ);
|
||||
|
||||
itti_send_msg_to_task(TASK_PHY_UE, ctxt_pP->instance, msg_p);
|
||||
LOG_E(RRC, "Synched with a cell, but PLMN doesn't match our SIM, the message PHY_FIND_NEXT_CELL_REQ is sent but lost in current UE implementation! \n");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -4718,7 +4719,6 @@ void *rrc_ue_task( void *args_p )
|
||||
break;
|
||||
|
||||
case MESSAGE_TEST:
|
||||
LOG_D(RRC, "[UE %d] Received %s\n", ue_mod_id, ITTI_MSG_NAME (msg_p));
|
||||
break;
|
||||
|
||||
/* MAC messages */
|
||||
@@ -5113,6 +5113,7 @@ void *rrc_ue_task( void *args_p )
|
||||
break; // PHY_FIND_CELL_IND
|
||||
|
||||
case PHY_MEAS_REPORT_IND: {
|
||||
LOG_D(RRC, "[UE %d] Received %s\n", ue_mod_id, ITTI_MSG_NAME (msg_p));
|
||||
MessageDef *message_p;
|
||||
message_p = itti_alloc_new_message(TASK_RRC_UE, RRC_RAL_MEASUREMENT_REPORT_IND);
|
||||
|
||||
@@ -5130,6 +5131,7 @@ void *rrc_ue_task( void *args_p )
|
||||
}
|
||||
|
||||
case RRC_RAL_CONFIGURE_THRESHOLD_REQ:
|
||||
LOG_D(RRC, "[UE %d] Received %s\n", ue_mod_id, ITTI_MSG_NAME (msg_p));
|
||||
rrc_ue_ral_handle_configure_threshold_request(ue_mod_id, msg_p);
|
||||
break;
|
||||
|
||||
|
||||
@@ -1,310 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*****************************************************************************
|
||||
|
||||
Source as_message.h
|
||||
|
||||
Version 0.1
|
||||
|
||||
Date 2012/10/18
|
||||
|
||||
Product NAS stack
|
||||
|
||||
Subsystem Application Programming Interface
|
||||
|
||||
Author Frederic Maurel
|
||||
|
||||
Description Defines the messages supported by the Access Stratum sublayer
|
||||
protocol (usually RRC and S1AP for E-UTRAN) and functions used
|
||||
to encode and decode
|
||||
|
||||
*****************************************************************************/
|
||||
#ifndef __AS_MESSAGE_H__
|
||||
#define __AS_MESSAGE_H__
|
||||
|
||||
#include "commonDef.h"
|
||||
#include "networkDef.h"
|
||||
|
||||
/****************************************************************************/
|
||||
/********************* G L O B A L C O N S T A N T S *******************/
|
||||
/****************************************************************************/
|
||||
|
||||
/* Access Stratum Message types */
|
||||
#define AS_REQUEST 0x0100
|
||||
#define AS_RESPONSE 0x0200
|
||||
#define AS_INDICATION 0x0400
|
||||
#define AS_CONFIRM 0x0800
|
||||
|
||||
/*
|
||||
* Access Stratum Message identifiers
|
||||
* ----------------------------------
|
||||
*/
|
||||
|
||||
/* Cell information relevant for cell selection processing */
|
||||
#define AS_CELL_INFO 0x01
|
||||
#define AS_CELL_INFO_REQ (AS_CELL_INFO | AS_REQUEST)
|
||||
#define AS_CELL_INFO_RSP (AS_CELL_INFO | AS_RESPONSE)
|
||||
#define AS_CELL_INFO_IND (AS_CELL_INFO | AS_INDICATION)
|
||||
|
||||
/* Security mode control */
|
||||
#define AS_SECURITY 0x02
|
||||
#define AS_SECURITY_REQ (AS_SECURITY | AS_REQUEST)
|
||||
#define AS_SECURITY_RSP (AS_SECURITY | AS_RESPONSE)
|
||||
|
||||
/* Paging information */
|
||||
#define AS_PAGING 0x03
|
||||
#define AS_PAGING_IND (AS_PAGING | AS_INDICATION)
|
||||
|
||||
/* NAS signalling connection establishment */
|
||||
#define AS_NAS_ESTABLISH 0x04
|
||||
#define AS_NAS_ESTABLISH_REQ (AS_NAS_ESTABLISH | AS_REQUEST)
|
||||
#define AS_NAS_ESTABLISH_RSP (AS_NAS_ESTABLISH | AS_RESPONSE)
|
||||
|
||||
/* NAS signalling connection release */
|
||||
#define AS_NAS_RELEASE 0x05
|
||||
#define AS_NAS_RELEASE_REQ (AS_NAS_RELEASE | AS_REQUEST)
|
||||
#define AS_NAS_RELEASE_IND (AS_NAS_RELEASE | AS_INDICATION)
|
||||
|
||||
/* NAS information transfer */
|
||||
#define AS_INFO_TRANSFER 0x10
|
||||
#define AS_UL_INFO_TRANSFER (AS_INFO_TRANSFER | AS_REQUEST)
|
||||
#define AS_DL_INFO_TRANSFER (AS_INFO_TRANSFER | AS_INDICATION)
|
||||
|
||||
/****************************************************************************/
|
||||
/************************ G L O B A L T Y P E S ************************/
|
||||
/****************************************************************************/
|
||||
|
||||
/*
|
||||
* --------------------------------------------------------------------------
|
||||
* Available PLMNs and cell Information
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/* Radio access technologies supported by the network */
|
||||
#define AS_GSM (1 << NET_ACCESS_GSM)
|
||||
#define AS_COMPACT (1 << NET_ACCESS_COMPACT)
|
||||
#define AS_UTRAN (1 << NET_ACCESS_UTRAN)
|
||||
#define AS_EGPRS (1 << NET_ACCESS_EGPRS)
|
||||
#define AS_HSDPA (1 << NET_ACCESS_HSDPA)
|
||||
#define AS_HSUPA (1 << NET_ACCESS_HSUPA)
|
||||
#define AS_HSDUPA (1 << NET_ACCESS_HSDUPA)
|
||||
#define AS_EUTRAN (1 << NET_ACCESS_EUTRAN)
|
||||
|
||||
/*
|
||||
* NAS->AS -K_eNB refresh request
|
||||
* NAS request AS to refresh its KeNB key
|
||||
*/
|
||||
typedef struct kenb_refresh_req_s {
|
||||
Byte_t kenb[32];
|
||||
} kenb_refresh_req_t;
|
||||
|
||||
/*
|
||||
* NAS->AS - Cell Information request
|
||||
* NAS request AS to search for a suitable cell belonging to the selected
|
||||
* PLMN to camp on.
|
||||
*/
|
||||
typedef struct {
|
||||
plmn_t plmnID; /* PLMN identifier */
|
||||
Byte_t rat; /* Bitmap - set of radio access technologies */
|
||||
} cell_info_req_t;
|
||||
|
||||
/*
|
||||
* AS->NAS - Cell Information response
|
||||
* AS search for a suitable cell and respond to NAS. If found, the cell
|
||||
* is selected to camp on.
|
||||
*/
|
||||
typedef struct {
|
||||
plmn_t plmnID; /* PLMN identifier */
|
||||
TAC_t tac; /* identifies a tracking area the PLMN belongs to */
|
||||
CI_t cellID; /* identifies a cell within a PLMN */
|
||||
AcT_t rat; /* radio access technology supported by the cell */
|
||||
} cell_info_rsp_t;
|
||||
|
||||
/*
|
||||
* AS->NAS - Cell Information indication
|
||||
* AS Reports available PLMNs with associated Radio Access Technologies
|
||||
* to NAS on request from NAS or autonomously.
|
||||
*/
|
||||
typedef struct {
|
||||
#define PLMN_LIST_MAX_SIZE 6
|
||||
PLMN_LIST_T(PLMN_LIST_MAX_SIZE) plmnIDs; /* List of PLMN identifiers */
|
||||
Byte_t rat[PLMN_LIST_MAX_SIZE]; /* Radio access technologies */
|
||||
TAC_t tac; /* identifies a tracking area within a scope of PLMNs */
|
||||
CI_t cellID; /* identifies a cell within a PLMN */
|
||||
} cell_info_ind_t;
|
||||
|
||||
/*
|
||||
* --------------------------------------------------------------------------
|
||||
* Security mode control
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/*
|
||||
* TODO: NAS->AS - Security command request
|
||||
*/
|
||||
typedef struct {} security_req_t;
|
||||
|
||||
|
||||
/*
|
||||
* TODO: AS->NAS - Security command response
|
||||
*/
|
||||
typedef struct {} security_rsp_t;
|
||||
|
||||
|
||||
/*
|
||||
* --------------------------------------------------------------------------
|
||||
* Paging information
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/*
|
||||
* TODO: AS->NAS - Paging Information indication
|
||||
*/
|
||||
typedef struct {} paging_ind_t;
|
||||
|
||||
/*
|
||||
* --------------------------------------------------------------------------
|
||||
* NAS signalling connection establishment
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/* Cause of RRC connection establishment */
|
||||
#define AS_CAUSE_EMERGENCY (NET_ESTABLISH_CAUSE_EMERGENCY)
|
||||
#define AS_CAUSE_HIGH_PRIO (NET_ESTABLISH_CAUSE_HIGH_PRIO)
|
||||
#define AS_CAUSE_MT_ACCESS (NET_ESTABLISH_CAUSE_MT_ACCESS)
|
||||
#define AS_CAUSE_MO_SIGNAL (NET_ESTABLISH_CAUSE_MO_SIGNAL)
|
||||
#define AS_CAUSE_MO_DATA (NET_ESTABLISH_CAUSE_MO_DATA)
|
||||
#define AS_CAUSE_V1020 (NET_ESTABLISH_CAUSE_V1020)
|
||||
|
||||
/* Type of the call associated to the RRC connection establishment */
|
||||
#define AS_TYPE_ORIGINATING_SIGNAL (NET_ESTABLISH_TYPE_ORIGINATING_SIGNAL)
|
||||
#define AS_TYPE_EMERGENCY_CALLS (NET_ESTABLISH_TYPE_EMERGENCY_CALLS)
|
||||
#define AS_TYPE_ORIGINATING_CALLS (NET_ESTABLISH_TYPE_ORIGINATING_CALLS)
|
||||
#define AS_TYPE_TERMINATING_CALLS (NET_ESTABLISH_TYPE_TERMINATING_CALLS)
|
||||
#define AS_TYPE_MO_CS_FALLBACK (NET_ESTABLISH_TYPE_MO_CS_FALLBACK)
|
||||
|
||||
|
||||
/* Structure of the SAE Temporary Mobile Subscriber Identity */
|
||||
typedef struct {
|
||||
uint8_t MMEcode; /* MME code that allocated the GUTI */
|
||||
uint32_t m_tmsi; /* M-Temporary Mobile Subscriber Identity */
|
||||
} as_stmsi_t;
|
||||
|
||||
/* Structure of the dedicated NAS information */
|
||||
typedef struct {
|
||||
uint32_t length; /* Length of the NAS information data */
|
||||
Byte_t* data; /* Dedicated NAS information data container */
|
||||
} as_nas_info_t;
|
||||
|
||||
/*
|
||||
* NAS->AS - NAS signalling connection establishment request
|
||||
* NAS request AS to perform the RRC connection establishment procedure
|
||||
* to transfer initial NAS message to the network while UE is in IDLE mode.
|
||||
*/
|
||||
typedef struct {
|
||||
uint8_t cause; /* Connection establishment cause */
|
||||
uint8_t type; /* Associated call type */
|
||||
plmn_t plmnID; /* Identifier of the selected PLMN */
|
||||
as_stmsi_t s_tmsi; /* SAE Temporary Mobile Subscriber Identity */
|
||||
as_nas_info_t initialNasMsg;/* Initial NAS message to transfer */
|
||||
} nas_establish_req_t;
|
||||
|
||||
/*
|
||||
* TODO: AS->NAS - NAS signalling connection establishment response
|
||||
*/
|
||||
typedef struct {} nas_establish_rsp_t;
|
||||
|
||||
/*
|
||||
* --------------------------------------------------------------------------
|
||||
* NAS signalling connection release
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/*
|
||||
* TODO: NAS->AS - NAS signalling connection release request
|
||||
*/
|
||||
typedef struct {} nas_release_req_t;
|
||||
|
||||
/*
|
||||
* TODO: AS->NAS - NAS signalling connection release indication
|
||||
*/
|
||||
typedef struct {} nas_release_ind_t;
|
||||
|
||||
/*
|
||||
* --------------------------------------------------------------------------
|
||||
* NAS information transfer
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/*
|
||||
* AS->NAS - Downlink data transfer
|
||||
* AS notifies upper layer that NAS or non-3GPP dedicated downlink information
|
||||
* has to be transfered to NAS.
|
||||
*/
|
||||
typedef as_nas_info_t dl_info_transfer_t;
|
||||
|
||||
/*
|
||||
* NAS->AS - Uplink data transfer request
|
||||
* NAS requests under layer to transfer NAS or non-3GPP dedicated uplink
|
||||
* information to AS.
|
||||
*/
|
||||
typedef as_nas_info_t ul_info_transfer_t;
|
||||
|
||||
/*
|
||||
* --------------------------------------------------------------------------
|
||||
* Structure of the AS messages handled by the network sublayer
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
typedef struct {
|
||||
uint16_t msgID;
|
||||
union {
|
||||
cell_info_req_t cell_info_req;
|
||||
cell_info_rsp_t cell_info_rsp;
|
||||
cell_info_ind_t cell_info_ind;
|
||||
security_req_t security_req;
|
||||
security_rsp_t security_rsp;
|
||||
paging_ind_t paging_ind;
|
||||
nas_establish_req_t nas_establish_req;
|
||||
nas_establish_rsp_t nas_establish_rsp;
|
||||
nas_release_req_t nas_release_req;
|
||||
nas_release_ind_t nas_release_ind;
|
||||
ul_info_transfer_t ul_info_transfer;
|
||||
dl_info_transfer_t dl_info_transfer;
|
||||
} __attribute__((__packed__)) msg;
|
||||
} as_message_t;
|
||||
|
||||
/****************************************************************************/
|
||||
/******************** G L O B A L V A R I A B L E S ********************/
|
||||
/****************************************************************************/
|
||||
|
||||
/****************************************************************************/
|
||||
/****************** E X P O R T E D F U N C T I O N S ******************/
|
||||
/****************************************************************************/
|
||||
|
||||
int as_message_decode(const char* buffer, int length, as_message_t* msg);
|
||||
|
||||
int as_message_encode(char* buffer, int length, const as_message_t* msg);
|
||||
|
||||
/* Implemented in the network_api.c body file */
|
||||
int as_message_send(as_message_t* as_msg, const void* nas_msg);
|
||||
|
||||
#endif /* __AS_MESSAGE_H__*/
|
||||
@@ -1,123 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*****************************************************************************
|
||||
Source network.h
|
||||
|
||||
Version 0.1
|
||||
|
||||
Date 2013/03/26
|
||||
|
||||
Product USIM data generator
|
||||
|
||||
Subsystem PLMN network operators
|
||||
|
||||
Author Frederic Maurel
|
||||
|
||||
Description Defines a list of PLMN network operators
|
||||
|
||||
*****************************************************************************/
|
||||
#ifndef __NETWORK_H__
|
||||
#define __NETWORK_H__
|
||||
|
||||
#include "commonDef.h"
|
||||
#include "networkDef.h"
|
||||
|
||||
/****************************************************************************/
|
||||
/********************* G L O B A L C O N S T A N T S *******************/
|
||||
/****************************************************************************/
|
||||
/*
|
||||
* PLMN network operator record index
|
||||
*/
|
||||
#define TEST1 0
|
||||
#define SFR1 1
|
||||
#define SFR2 2
|
||||
#define SFR3 3
|
||||
#define OAI_LTEBOX 4
|
||||
#define TM1 5
|
||||
#define FCT1 6
|
||||
#define VDF1 7
|
||||
#define VDF2 8
|
||||
#define VDF3 9
|
||||
#define VDF4 10
|
||||
#define VDF5 11
|
||||
|
||||
|
||||
#define SELECTED_PLMN TEST1 //SFR1
|
||||
|
||||
#define TEST_PLMN {0,0,0x0f,1,1,0} // 00101
|
||||
#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_3 {0,2,0x0f,8,3,1} // 20813
|
||||
#define OAI_LTEBOX_PLMN {0,2,0x0f,8,3,9} //20893
|
||||
#define TM_PLMN_1 {1,3,0,0,8,2} // 310280
|
||||
#define FCT_PLMN_1 {1,3,8,0,2,0} // 310028
|
||||
#define VDF_PLMN_1 {2,2,0x0f,2,0,1} // 22210
|
||||
#define VDF_PLMN_2 {1,2,0x0f,4,0x0f,1} // 2141
|
||||
#define VDF_PLMN_3 {1,2,0x0f,4,0x0f,6} // 2146
|
||||
#define VDF_PLMN_4 {6,2,0x0f,2,0x0f,2} // 2622
|
||||
#define VDF_PLMN_5 {6,2,0x0f,2,0x0f,4} // 2624
|
||||
|
||||
|
||||
/****************************************************************************/
|
||||
/************************ G L O B A L T Y P E S ************************/
|
||||
/****************************************************************************/
|
||||
|
||||
/*
|
||||
* PLMN network operator record
|
||||
*/
|
||||
typedef struct {
|
||||
unsigned int num;
|
||||
plmn_t plmn;
|
||||
char fullname[NET_FORMAT_LONG_SIZE + 1];
|
||||
char shortname[NET_FORMAT_SHORT_SIZE + 1];
|
||||
tac_t tac_start;
|
||||
tac_t tac_end;
|
||||
} network_record_t;
|
||||
|
||||
|
||||
/****************************************************************************/
|
||||
/******************** G L O B A L V A R I A B L E S ********************/
|
||||
/****************************************************************************/
|
||||
|
||||
/*
|
||||
* The list of PLMN network operator records
|
||||
*/
|
||||
network_record_t network_records[] = {
|
||||
{00101, TEST_PLMN, "Test network", "OAI4G", 0x0001, 0xfffd},
|
||||
{20810, SFR_PLMN_1, "SFR France", "SFR", 0x0001, 0xfffd},
|
||||
{20811, SFR_PLMN_2, "SFR France", "SFR", 0x0001, 0xfffd},
|
||||
{20813, SFR_PLMN_3, "SFR France", "SFR", 0x0001, 0xfffd},
|
||||
{20893, OAI_LTEBOX_PLMN, "OAI LTEBOX", "OAIALU", 0x0001, 0xfffd},
|
||||
{310280,TM_PLMN_1, "T-Mobile USA", "T-Mobile", 0x0001, 0xfffd},
|
||||
{310028,FCT_PLMN_1, "FICTITIOUS USA", "FICTITIO", 0x0001, 0xfffd},
|
||||
{22210, VDF_PLMN_1, "Vodafone Italia", "VODAFONE", 0x0001, 0xfffd},
|
||||
{2141, VDF_PLMN_2, "Vodafone Spain", "VODAFONE", 0x0001, 0xfffd},
|
||||
{2146, VDF_PLMN_3, "Vodafone Spain", "VODAFONE", 0x0001, 0xfffd},
|
||||
{2622, VDF_PLMN_4, "Vodafone Germ", "VODAFONE", 0x0001, 0xfffd},
|
||||
{2624, VDF_PLMN_5, "Vodafone Germ", "VODAFONE", 0x0001, 0xfffd},
|
||||
};
|
||||
|
||||
/****************************************************************************/
|
||||
/****************** E X P O R T E D F U N C T I O N S ******************/
|
||||
/****************************************************************************/
|
||||
|
||||
#endif /* __NETWORK_H__*/
|
||||
@@ -1,716 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <libconfig.h>
|
||||
|
||||
#include <arpa/inet.h> /* To provide inet_addr */
|
||||
|
||||
#include "intertask_interface.h"
|
||||
#include "assertions.h"
|
||||
#include "msc.h"
|
||||
#include "mme_config.h"
|
||||
#include "spgw_config.h"
|
||||
#include "intertask_interface_conf.h"
|
||||
|
||||
mme_config_t mme_config;
|
||||
|
||||
int mme_config_find_mnc_length(const char mcc_digit1P,
|
||||
const char mcc_digit2P,
|
||||
const char mcc_digit3P,
|
||||
const char mnc_digit1P,
|
||||
const char mnc_digit2P,
|
||||
const char mnc_digit3P)
|
||||
{
|
||||
|
||||
uint16_t mcc = 100*mcc_digit1P + 10*mcc_digit2P + mcc_digit3P;
|
||||
uint16_t mnc3= 100*mnc_digit1P + 10*mnc_digit2P + mnc_digit3P;
|
||||
uint16_t mnc2= 10*mnc_digit1P + mnc_digit2P;
|
||||
int plmn_index = 0;
|
||||
|
||||
AssertFatal((mcc_digit1P >= 0) && (mcc_digit1P <= 9)
|
||||
&& (mcc_digit2P >= 0) && (mcc_digit2P <= 9)
|
||||
&& (mcc_digit3P >= 0) && (mcc_digit3P <= 9) ,
|
||||
"BAD MCC PARAMETER (%d%d%d)!\n",
|
||||
mcc_digit1P, mcc_digit2P, mcc_digit3P);
|
||||
|
||||
AssertFatal((mnc_digit2P >= 0) && (mnc_digit2P <= 9)
|
||||
&& (mnc_digit1P >= 0) && (mnc_digit1P <= 9) ,
|
||||
"BAD MNC PARAMETER (%d.%d.%d)!\n",
|
||||
mnc_digit1P, mnc_digit2P, mnc_digit3P);
|
||||
|
||||
|
||||
while (plmn_index < mme_config.gummei.nb_plmns) {
|
||||
if (mme_config.gummei.plmn_mcc[plmn_index] == mcc) {
|
||||
if ((mme_config.gummei.plmn_mnc[plmn_index] == mnc2) &&
|
||||
(mme_config.gummei.plmn_mnc_len[plmn_index] == 2)) {
|
||||
return 2;
|
||||
} else if ((mme_config.gummei.plmn_mnc[plmn_index] == mnc3) &&
|
||||
(mme_config.gummei.plmn_mnc_len[plmn_index] == 3)) {
|
||||
return 3;
|
||||
}
|
||||
}
|
||||
|
||||
plmn_index += 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static
|
||||
void mme_config_init(mme_config_t *mme_config_p)
|
||||
{
|
||||
memset(mme_config_p, 0, sizeof(mme_config_t));
|
||||
|
||||
pthread_rwlock_init(&mme_config_p->rw_lock, NULL);
|
||||
|
||||
mme_config_p->verbosity_level = 0;
|
||||
mme_config_p->config_file = NULL;
|
||||
mme_config_p->max_eNBs = MAX_NUMBER_OF_ENB;
|
||||
mme_config_p->max_ues = MAX_NUMBER_OF_UE;
|
||||
|
||||
mme_config_p->emergency_attach_supported = 0;
|
||||
mme_config_p->unauthenticated_imsi_supported = 0;
|
||||
|
||||
/* Timer configuration */
|
||||
mme_config_p->gtpv1u_config.port_number = GTPV1_U_PORT_NUMBER;
|
||||
mme_config_p->s1ap_config.port_number = S1AP_PORT_NUMBER;
|
||||
/* IP configuration */
|
||||
mme_config_p->ipv4.sgw_ip_address_for_S1u_S12_S4_up = inet_addr(DEFAULT_SGW_IP_ADDRESS_FOR_S1U_S12_S4_UP);
|
||||
|
||||
mme_config_p->ipv4.mme_interface_name_for_S1_MME = DEFAULT_MME_INTERFACE_NAME_FOR_S1_MME;
|
||||
mme_config_p->ipv4.mme_ip_address_for_S1_MME = inet_addr(DEFAULT_MME_IP_ADDRESS_FOR_S1_MME);
|
||||
|
||||
mme_config_p->ipv4.mme_interface_name_for_S11 = DEFAULT_MME_INTERFACE_NAME_FOR_S11;
|
||||
mme_config_p->ipv4.mme_ip_address_for_S11 = inet_addr(DEFAULT_MME_IP_ADDRESS_FOR_S11);
|
||||
|
||||
mme_config_p->ipv4.sgw_ip_address_for_S11 = inet_addr(DEFAULT_SGW_IP_ADDRESS_FOR_S11);
|
||||
|
||||
mme_config_p->s6a_config.conf_file = S6A_CONF_FILE;
|
||||
|
||||
mme_config_p->itti_config.queue_size = ITTI_QUEUE_MAX_ELEMENTS;
|
||||
mme_config_p->itti_config.log_file = NULL;
|
||||
|
||||
mme_config_p->sctp_config.in_streams = SCTP_IN_STREAMS;
|
||||
mme_config_p->sctp_config.out_streams = SCTP_OUT_STREAMS;
|
||||
|
||||
mme_config_p->relative_capacity = RELATIVE_CAPACITY;
|
||||
|
||||
mme_config_p->mme_statistic_timer = MME_STATISTIC_TIMER_S;
|
||||
|
||||
mme_config_p->gummei.nb_mme_gid = 1;
|
||||
mme_config_p->gummei.mme_gid = calloc(1, sizeof(*mme_config_p->gummei.mme_gid));
|
||||
mme_config_p->gummei.mme_gid[0] = MMEGID;
|
||||
mme_config_p->gummei.nb_mmec = 1;
|
||||
mme_config_p->gummei.mmec = calloc(1, sizeof(*mme_config_p->gummei.mmec));
|
||||
mme_config_p->gummei.mmec[0] = MMEC;
|
||||
|
||||
/* Set the TAI */
|
||||
mme_config_p->gummei.nb_plmns = 1;
|
||||
mme_config_p->gummei.plmn_mcc = calloc(1, sizeof(*mme_config_p->gummei.plmn_mcc));
|
||||
mme_config_p->gummei.plmn_mnc = calloc(1, sizeof(*mme_config_p->gummei.plmn_mnc));
|
||||
mme_config_p->gummei.plmn_mnc_len = calloc(1, sizeof(*mme_config_p->gummei.plmn_mnc_len));
|
||||
mme_config_p->gummei.plmn_tac = calloc(1, sizeof(*mme_config_p->gummei.plmn_tac));
|
||||
|
||||
|
||||
mme_config_p->gummei.plmn_mcc[0] = PLMN_MCC;
|
||||
mme_config_p->gummei.plmn_mnc[0] = PLMN_MNC;
|
||||
mme_config_p->gummei.plmn_mnc_len[0] = PLMN_MNC_LEN;
|
||||
mme_config_p->gummei.plmn_tac[0] = PLMN_TAC;
|
||||
|
||||
mme_config_p->s1ap_config.outcome_drop_timer_sec = S1AP_OUTCOME_TIMER_DEFAULT;
|
||||
}
|
||||
|
||||
int mme_system(char *command_pP, int abort_on_errorP)
|
||||
{
|
||||
int ret = -1;
|
||||
|
||||
if (command_pP) {
|
||||
fprintf(stdout, "system command: %s\n",command_pP);
|
||||
ret = system(command_pP);
|
||||
|
||||
if (ret < 0) {
|
||||
fprintf(stderr, "ERROR in system command %s: %d\n",
|
||||
command_pP,ret);
|
||||
|
||||
if (abort_on_errorP) {
|
||||
exit(-1); // may be not exit
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static int config_parse_file(mme_config_t *mme_config_p)
|
||||
{
|
||||
config_t cfg;
|
||||
config_setting_t *setting_mme = NULL;
|
||||
config_setting_t *setting = NULL;
|
||||
config_setting_t *subsetting = NULL;
|
||||
config_setting_t *sub2setting = NULL;
|
||||
|
||||
long int alongint;
|
||||
int i, num;
|
||||
char *astring = NULL;
|
||||
char *address = NULL;
|
||||
char *cidr = NULL;
|
||||
|
||||
const char* tac = NULL;
|
||||
const char* mcc = NULL;
|
||||
const char* mnc = NULL;
|
||||
|
||||
char *sgw_ip_address_for_S1u_S12_S4_up = NULL;
|
||||
char *mme_interface_name_for_S1_MME = NULL;
|
||||
char *mme_ip_address_for_S1_MME = NULL;
|
||||
char *mme_interface_name_for_S11 = NULL;
|
||||
char *mme_ip_address_for_S11 = NULL;
|
||||
char *sgw_ip_address_for_S11 = NULL;
|
||||
char system_cmd[256];
|
||||
|
||||
config_init(&cfg);
|
||||
|
||||
if(mme_config_p->config_file != NULL) {
|
||||
/* Read the file. If there is an error, report it and exit. */
|
||||
if(! config_read_file(&cfg, mme_config_p->config_file)) {
|
||||
fprintf(stdout, "ERROR: %s:%d - %s\n", mme_config_p->config_file, config_error_line(&cfg), config_error_text(&cfg));
|
||||
config_destroy(&cfg);
|
||||
AssertFatal (1 == 0, "Failed to parse MME configuration file %s!\n", mme_config_p->config_file);
|
||||
}
|
||||
} else {
|
||||
fprintf(stdout, "ERROR No MME configuration file provided!\n");
|
||||
config_destroy(&cfg);
|
||||
AssertFatal (0, "No MME configuration file provided!\n");
|
||||
}
|
||||
|
||||
setting_mme = config_lookup(&cfg, MME_CONFIG_STRING_MME_CONFIG);
|
||||
|
||||
if(setting_mme != NULL) {
|
||||
// GENERAL MME SETTINGS
|
||||
if( (config_setting_lookup_string( setting_mme, MME_CONFIG_STRING_REALM, (const char **)&astring) )) {
|
||||
mme_config_p->realm = strdup(astring);
|
||||
mme_config_p->realm_length = strlen(mme_config_p->realm);
|
||||
}
|
||||
|
||||
if( (config_setting_lookup_int( setting_mme, MME_CONFIG_STRING_MAXENB, &alongint) )) {
|
||||
mme_config_p->max_eNBs = (uint32_t)alongint;
|
||||
}
|
||||
|
||||
if( (config_setting_lookup_int( setting_mme, MME_CONFIG_STRING_MAXUE, &alongint) )) {
|
||||
mme_config_p->max_ues = (uint32_t)alongint;
|
||||
}
|
||||
|
||||
if( (config_setting_lookup_int( setting_mme, MME_CONFIG_STRING_RELATIVE_CAPACITY, &alongint) )) {
|
||||
mme_config_p->relative_capacity = (uint8_t)alongint;
|
||||
}
|
||||
|
||||
if( (config_setting_lookup_int( setting_mme, MME_CONFIG_STRING_STATISTIC_TIMER, &alongint) )) {
|
||||
mme_config_p->mme_statistic_timer = (uint32_t)alongint;
|
||||
}
|
||||
|
||||
if( (config_setting_lookup_string( setting_mme, MME_CONFIG_STRING_EMERGENCY_ATTACH_SUPPORTED, (const char **)&astring) )) {
|
||||
if (strcasecmp(astring , "yes") == 0)
|
||||
mme_config_p->emergency_attach_supported = 1;
|
||||
else
|
||||
mme_config_p->emergency_attach_supported = 0;
|
||||
}
|
||||
|
||||
if( (config_setting_lookup_string( setting_mme, MME_CONFIG_STRING_UNAUTHENTICATED_IMSI_SUPPORTED, (const char **)&astring) )) {
|
||||
if (strcasecmp(astring , "yes") == 0)
|
||||
mme_config_p->unauthenticated_imsi_supported = 1;
|
||||
else
|
||||
mme_config_p->unauthenticated_imsi_supported = 0;
|
||||
}
|
||||
|
||||
if( (config_setting_lookup_string( setting_mme, MME_CONFIG_STRING_ASN1_VERBOSITY, (const char **)&astring) )) {
|
||||
if (strcasecmp(astring , MME_CONFIG_STRING_ASN1_VERBOSITY_NONE) == 0)
|
||||
mme_config_p->verbosity_level = 0;
|
||||
else if (strcasecmp(astring , MME_CONFIG_STRING_ASN1_VERBOSITY_ANNOYING) == 0)
|
||||
mme_config_p->verbosity_level = 2;
|
||||
else if (strcasecmp(astring , MME_CONFIG_STRING_ASN1_VERBOSITY_INFO) == 0)
|
||||
mme_config_p->verbosity_level = 1;
|
||||
else
|
||||
mme_config_p->verbosity_level = 0;
|
||||
}
|
||||
|
||||
// ITTI SETTING
|
||||
setting = config_setting_get_member (setting_mme, MME_CONFIG_STRING_INTERTASK_INTERFACE_CONFIG);
|
||||
|
||||
if (setting != NULL) {
|
||||
if( (config_setting_lookup_int( setting, MME_CONFIG_STRING_INTERTASK_INTERFACE_QUEUE_SIZE, &alongint) )) {
|
||||
mme_config_p->itti_config.queue_size = (uint32_t)alongint;
|
||||
}
|
||||
}
|
||||
|
||||
// S6A SETTING
|
||||
setting = config_setting_get_member (setting_mme, MME_CONFIG_STRING_S6A_CONFIG);
|
||||
|
||||
if (setting != NULL) {
|
||||
if( (config_setting_lookup_string( setting, MME_CONFIG_STRING_S6A_CONF_FILE_PATH, (const char **)&astring) )) {
|
||||
if (astring != NULL)
|
||||
mme_config_p->s6a_config.conf_file = strdup(astring);
|
||||
}
|
||||
|
||||
if( (config_setting_lookup_string( setting, MME_CONFIG_STRING_S6A_HSS_HOSTNAME, (const char **)&astring) )) {
|
||||
if (astring != NULL)
|
||||
mme_config_p->s6a_config.hss_host_name = strdup(astring);
|
||||
else
|
||||
AssertFatal (1 == 0,
|
||||
"You have to provide a valid HSS hostname %s=...\n",
|
||||
MME_CONFIG_STRING_S6A_HSS_HOSTNAME);
|
||||
}
|
||||
}
|
||||
|
||||
// SCTP SETTING
|
||||
setting = config_setting_get_member (setting_mme, MME_CONFIG_STRING_SCTP_CONFIG);
|
||||
|
||||
if (setting != NULL) {
|
||||
if( (config_setting_lookup_int( setting, MME_CONFIG_STRING_SCTP_INSTREAMS, &alongint) )) {
|
||||
mme_config_p->sctp_config.in_streams = (uint16_t)alongint;
|
||||
}
|
||||
|
||||
if( (config_setting_lookup_int( setting, MME_CONFIG_STRING_SCTP_OUTSTREAMS, &alongint) )) {
|
||||
mme_config_p->sctp_config.out_streams = (uint16_t)alongint;
|
||||
}
|
||||
}
|
||||
|
||||
// S1AP SETTING
|
||||
setting = config_setting_get_member (setting_mme, MME_CONFIG_STRING_S1AP_CONFIG);
|
||||
|
||||
if (setting != NULL) {
|
||||
if( (config_setting_lookup_int( setting, MME_CONFIG_STRING_S1AP_OUTCOME_TIMER, &alongint) )) {
|
||||
mme_config_p->s1ap_config.outcome_drop_timer_sec = (uint8_t)alongint;
|
||||
}
|
||||
|
||||
if( (config_setting_lookup_int( setting, MME_CONFIG_STRING_S1AP_PORT, &alongint) )) {
|
||||
mme_config_p->s1ap_config.port_number = (uint16_t)alongint;
|
||||
}
|
||||
}
|
||||
|
||||
// GUMMEI SETTING
|
||||
setting = config_setting_get_member (setting_mme, MME_CONFIG_STRING_GUMMEI_CONFIG);
|
||||
|
||||
if (setting != NULL) {
|
||||
subsetting = config_setting_get_member (setting, MME_CONFIG_STRING_MME_CODE);
|
||||
|
||||
if (subsetting != NULL) {
|
||||
num = config_setting_length(subsetting);
|
||||
|
||||
if (mme_config_p->gummei.nb_mmec != num) {
|
||||
if (mme_config_p->gummei.mmec != NULL) {
|
||||
free(mme_config_p->gummei.mmec);
|
||||
}
|
||||
|
||||
mme_config_p->gummei.mmec = calloc(num, sizeof(*mme_config_p->gummei.mmec));
|
||||
}
|
||||
|
||||
mme_config_p->gummei.nb_mmec = num;
|
||||
|
||||
for (i = 0; i < num; i++) {
|
||||
mme_config_p->gummei.mmec[i] = config_setting_get_int_elem(subsetting, i);
|
||||
}
|
||||
}
|
||||
|
||||
subsetting = config_setting_get_member (setting, MME_CONFIG_STRING_MME_GID);
|
||||
|
||||
if (subsetting != NULL) {
|
||||
num = config_setting_length(subsetting);
|
||||
|
||||
if (mme_config_p->gummei.nb_mme_gid != num) {
|
||||
if (mme_config_p->gummei.mme_gid != NULL) {
|
||||
free(mme_config_p->gummei.mme_gid);
|
||||
}
|
||||
|
||||
mme_config_p->gummei.mme_gid = calloc(num, sizeof(*mme_config_p->gummei.mme_gid));
|
||||
}
|
||||
|
||||
mme_config_p->gummei.nb_mme_gid = num;
|
||||
|
||||
for (i = 0; i < num; i++) {
|
||||
mme_config_p->gummei.mme_gid[i] = config_setting_get_int_elem(subsetting, i);
|
||||
}
|
||||
}
|
||||
|
||||
subsetting = config_setting_get_member (setting, MME_CONFIG_STRING_TAI_LIST);
|
||||
|
||||
if (subsetting != NULL) {
|
||||
num = config_setting_length(subsetting);
|
||||
|
||||
if (mme_config_p->gummei.nb_plmns != num) {
|
||||
if (mme_config_p->gummei.plmn_mcc != NULL) free(mme_config_p->gummei.plmn_mcc);
|
||||
|
||||
if (mme_config_p->gummei.plmn_mnc != NULL) free(mme_config_p->gummei.plmn_mnc);
|
||||
|
||||
if (mme_config_p->gummei.plmn_mnc_len != NULL) free(mme_config_p->gummei.plmn_mnc_len);
|
||||
|
||||
if (mme_config_p->gummei.plmn_tac != NULL) free(mme_config_p->gummei.plmn_tac);
|
||||
|
||||
mme_config_p->gummei.plmn_mcc = calloc(num, sizeof(*mme_config_p->gummei.plmn_mcc));
|
||||
mme_config_p->gummei.plmn_mnc = calloc(num, sizeof(*mme_config_p->gummei.plmn_mnc));
|
||||
mme_config_p->gummei.plmn_mnc_len = calloc(num, sizeof(*mme_config_p->gummei.plmn_mnc_len));
|
||||
mme_config_p->gummei.plmn_tac = calloc(num, sizeof(*mme_config_p->gummei.plmn_tac));
|
||||
}
|
||||
|
||||
mme_config_p->gummei.nb_plmns = num;
|
||||
|
||||
for (i = 0; i < num; i++) {
|
||||
sub2setting = config_setting_get_elem(subsetting, i);
|
||||
|
||||
if (sub2setting != NULL) {
|
||||
if( (config_setting_lookup_string( sub2setting, MME_CONFIG_STRING_MCC, &mcc) )) {
|
||||
mme_config_p->gummei.plmn_mcc[i] = (uint16_t)atoi(mcc);
|
||||
}
|
||||
|
||||
if( (config_setting_lookup_string( sub2setting, MME_CONFIG_STRING_MNC, &mnc) )) {
|
||||
mme_config_p->gummei.plmn_mnc[i] = (uint16_t)atoi(mnc);
|
||||
mme_config_p->gummei.plmn_mnc_len[i] = strlen(mnc);
|
||||
AssertFatal((mme_config_p->gummei.plmn_mnc_len[i] == 2) || (mme_config_p->gummei.plmn_mnc_len[i] == 3),
|
||||
"Bad MNC length %u, must be 2 or 3", mme_config_p->gummei.plmn_mnc_len[i]);
|
||||
}
|
||||
|
||||
if( (config_setting_lookup_string( sub2setting, MME_CONFIG_STRING_TAC, &tac) )) {
|
||||
mme_config_p->gummei.plmn_tac[i] = (uint16_t)atoi(tac);
|
||||
AssertFatal(mme_config_p->gummei.plmn_tac[i] != 0,
|
||||
"TAC must not be 0");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// NETWORK INTERFACE SETTING
|
||||
setting = config_setting_get_member (setting_mme, MME_CONFIG_STRING_NETWORK_INTERFACES_CONFIG);
|
||||
|
||||
if(setting != NULL) {
|
||||
if( (
|
||||
config_setting_lookup_string( setting, MME_CONFIG_STRING_INTERFACE_NAME_FOR_S1_MME,
|
||||
(const char **)&mme_interface_name_for_S1_MME)
|
||||
&& config_setting_lookup_string( setting, MME_CONFIG_STRING_IPV4_ADDRESS_FOR_S1_MME,
|
||||
(const char **)&mme_ip_address_for_S1_MME)
|
||||
&& config_setting_lookup_string( setting, MME_CONFIG_STRING_INTERFACE_NAME_FOR_S11_MME,
|
||||
(const char **)&mme_interface_name_for_S11)
|
||||
&& config_setting_lookup_string( setting, MME_CONFIG_STRING_IPV4_ADDRESS_FOR_S11_MME,
|
||||
(const char **)&mme_ip_address_for_S11)
|
||||
)
|
||||
) {
|
||||
mme_config_p->ipv4.mme_interface_name_for_S1_MME = strdup(mme_interface_name_for_S1_MME);
|
||||
cidr = strdup(mme_ip_address_for_S1_MME);
|
||||
address = strtok(cidr, "/");
|
||||
IPV4_STR_ADDR_TO_INT_NWBO ( address, mme_config_p->ipv4.mme_ip_address_for_S1_MME, "BAD IP ADDRESS FORMAT FOR MME S1_MME !\n" )
|
||||
free(cidr);
|
||||
|
||||
mme_config_p->ipv4.mme_interface_name_for_S11 = strdup(mme_interface_name_for_S11);
|
||||
cidr = strdup(mme_ip_address_for_S11);
|
||||
address = strtok(cidr, "/");
|
||||
IPV4_STR_ADDR_TO_INT_NWBO ( address, mme_config_p->ipv4.mme_ip_address_for_S11, "BAD IP ADDRESS FORMAT FOR MME S11 !\n" )
|
||||
free(cidr);
|
||||
|
||||
if (strncasecmp("tun",mme_config_p->ipv4.mme_interface_name_for_S1_MME, strlen("tun")) == 0) {
|
||||
if (snprintf(system_cmd, 256,
|
||||
"ip link set %s down ;openvpn --rmtun --dev %s",
|
||||
mme_config_p->ipv4.mme_interface_name_for_S1_MME,
|
||||
mme_config_p->ipv4.mme_interface_name_for_S1_MME
|
||||
) > 0) {
|
||||
mme_system(system_cmd, 1);
|
||||
} else {
|
||||
fprintf(stderr, "Del %s\n", mme_config_p->ipv4.mme_interface_name_for_S1_MME);
|
||||
}
|
||||
|
||||
if (snprintf(system_cmd, 256,
|
||||
"openvpn --mktun --dev %s;sync;ifconfig %s up;sync",
|
||||
mme_config_p->ipv4.mme_interface_name_for_S1_MME,
|
||||
mme_config_p->ipv4.mme_interface_name_for_S1_MME) > 0) {
|
||||
mme_system(system_cmd, 1);
|
||||
} else {
|
||||
fprintf(stderr, "Create %s\n", mme_config_p->ipv4.mme_interface_name_for_S1_MME);
|
||||
}
|
||||
|
||||
if (snprintf(system_cmd, 256,
|
||||
"ip -4 addr add %s dev %s",
|
||||
mme_ip_address_for_S1_MME,
|
||||
mme_config_p->ipv4.mme_interface_name_for_S1_MME) > 0) {
|
||||
mme_system(system_cmd, 1);
|
||||
} else {
|
||||
fprintf(stderr, "Set IPv4 address on %s\n", mme_config_p->ipv4.mme_interface_name_for_S1_MME);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// NAS SETTING
|
||||
setting = config_setting_get_member (setting_mme, MME_CONFIG_STRING_NAS_CONFIG);
|
||||
|
||||
if (setting != NULL) {
|
||||
subsetting = config_setting_get_member (setting, MME_CONFIG_STRING_NAS_SUPPORTED_INTEGRITY_ALGORITHM_LIST);
|
||||
|
||||
if (subsetting != NULL) {
|
||||
num = config_setting_length(subsetting);
|
||||
|
||||
if (num <= 8) {
|
||||
for (i = 0; i < num; i++) {
|
||||
astring = config_setting_get_string_elem(subsetting, i);
|
||||
|
||||
if (strcmp("EIA0", astring) == 0) mme_config_p->nas_config.prefered_integrity_algorithm[i] = NAS_CONFIG_SECURITY_ALGORITHMS_EIA0;
|
||||
else if (strcmp("EIA1", astring) == 0) mme_config_p->nas_config.prefered_integrity_algorithm[i] = NAS_CONFIG_SECURITY_ALGORITHMS_EIA1;
|
||||
else if (strcmp("EIA2", astring) == 0) mme_config_p->nas_config.prefered_integrity_algorithm[i] = NAS_CONFIG_SECURITY_ALGORITHMS_EIA2;
|
||||
else if (strcmp("EIA3", astring) == 0) mme_config_p->nas_config.prefered_integrity_algorithm[i] = NAS_CONFIG_SECURITY_ALGORITHMS_EIA0;
|
||||
else if (strcmp("EIA4", astring) == 0) mme_config_p->nas_config.prefered_integrity_algorithm[i] = NAS_CONFIG_SECURITY_ALGORITHMS_EIA0;
|
||||
else if (strcmp("EIA5", astring) == 0) mme_config_p->nas_config.prefered_integrity_algorithm[i] = NAS_CONFIG_SECURITY_ALGORITHMS_EIA0;
|
||||
else if (strcmp("EIA6", astring) == 0) mme_config_p->nas_config.prefered_integrity_algorithm[i] = NAS_CONFIG_SECURITY_ALGORITHMS_EIA0;
|
||||
else if (strcmp("EIA7", astring) == 0) mme_config_p->nas_config.prefered_integrity_algorithm[i] = NAS_CONFIG_SECURITY_ALGORITHMS_EIA0;
|
||||
}
|
||||
|
||||
for (i = num; i < 8; i++) {
|
||||
mme_config_p->nas_config.prefered_integrity_algorithm[i] = NAS_CONFIG_SECURITY_ALGORITHMS_EIA0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
subsetting = config_setting_get_member (setting, MME_CONFIG_STRING_NAS_SUPPORTED_CIPHERING_ALGORITHM_LIST);
|
||||
|
||||
if (subsetting != NULL) {
|
||||
num = config_setting_length(subsetting);
|
||||
|
||||
if (num <= 8) {
|
||||
for (i = 0; i < num; i++) {
|
||||
astring = config_setting_get_string_elem(subsetting, i);
|
||||
|
||||
if (strcmp("EEA0", astring) == 0) mme_config_p->nas_config.prefered_ciphering_algorithm[i] = NAS_CONFIG_SECURITY_ALGORITHMS_EEA0;
|
||||
else if (strcmp("EEA1", astring) == 0) mme_config_p->nas_config.prefered_ciphering_algorithm[i] = NAS_CONFIG_SECURITY_ALGORITHMS_EEA1;
|
||||
else if (strcmp("EEA2", astring) == 0) mme_config_p->nas_config.prefered_ciphering_algorithm[i] = NAS_CONFIG_SECURITY_ALGORITHMS_EEA2;
|
||||
else if (strcmp("EEA3", astring) == 0) mme_config_p->nas_config.prefered_ciphering_algorithm[i] = NAS_CONFIG_SECURITY_ALGORITHMS_EEA0;
|
||||
else if (strcmp("EEA4", astring) == 0) mme_config_p->nas_config.prefered_ciphering_algorithm[i] = NAS_CONFIG_SECURITY_ALGORITHMS_EEA0;
|
||||
else if (strcmp("EEA5", astring) == 0) mme_config_p->nas_config.prefered_ciphering_algorithm[i] = NAS_CONFIG_SECURITY_ALGORITHMS_EEA0;
|
||||
else if (strcmp("EEA6", astring) == 0) mme_config_p->nas_config.prefered_ciphering_algorithm[i] = NAS_CONFIG_SECURITY_ALGORITHMS_EEA0;
|
||||
else if (strcmp("EEA7", astring) == 0) mme_config_p->nas_config.prefered_ciphering_algorithm[i] = NAS_CONFIG_SECURITY_ALGORITHMS_EEA0;
|
||||
}
|
||||
|
||||
for (i = num; i < 8; i++) {
|
||||
mme_config_p->nas_config.prefered_ciphering_algorithm[i] = NAS_CONFIG_SECURITY_ALGORITHMS_EEA0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
setting = config_lookup(&cfg, SGW_CONFIG_STRING_SGW_CONFIG);
|
||||
|
||||
if(setting != NULL) {
|
||||
subsetting = config_setting_get_member (setting, SGW_CONFIG_STRING_NETWORK_INTERFACES_CONFIG);
|
||||
|
||||
if(subsetting != NULL) {
|
||||
if( (
|
||||
config_setting_lookup_string( subsetting, SGW_CONFIG_STRING_SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP,
|
||||
(const char **)&sgw_ip_address_for_S1u_S12_S4_up)
|
||||
&& config_setting_lookup_string( subsetting, SGW_CONFIG_STRING_SGW_IPV4_ADDRESS_FOR_S11,
|
||||
(const char **)&sgw_ip_address_for_S11)
|
||||
&& config_setting_lookup_int( subsetting, SGW_CONFIG_STRING_SGW_PORT_FOR_S1U_S12_S4_UP, &alongint)
|
||||
)
|
||||
) {
|
||||
cidr = strdup(sgw_ip_address_for_S1u_S12_S4_up);
|
||||
address = strtok(cidr, "/");
|
||||
IPV4_STR_ADDR_TO_INT_NWBO ( address, mme_config_p->ipv4.sgw_ip_address_for_S1u_S12_S4_up, "BAD IP ADDRESS FORMAT FOR SGW S1u_S12_S4 !\n" )
|
||||
free(cidr);
|
||||
|
||||
cidr = strdup(sgw_ip_address_for_S11);
|
||||
address = strtok(cidr, "/");
|
||||
IPV4_STR_ADDR_TO_INT_NWBO ( address, mme_config_p->ipv4.sgw_ip_address_for_S11, "BAD IP ADDRESS FORMAT FOR SGW S11 !\n" )
|
||||
free(cidr);
|
||||
|
||||
mme_config_p->gtpv1u_config.port_number = (uint16_t) alongint;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define DISPLAY_ARRAY(size, format, args...) \
|
||||
do { \
|
||||
int i; \
|
||||
for (i = 0; i < size; i++) { \
|
||||
fprintf(stdout, format, args); \
|
||||
if ((i != (size - 1)) && ((i + 1) % 10 == 0)) \
|
||||
{ \
|
||||
fprintf(stdout, "\n "); \
|
||||
} \
|
||||
} \
|
||||
if (i > 0) \
|
||||
fprintf(stdout, "\n"); \
|
||||
} while(0)
|
||||
|
||||
static void config_display(mme_config_t *mme_config_p)
|
||||
{
|
||||
int j;
|
||||
|
||||
fprintf(stdout, "==== EURECOM %s v%s ====\n", PACKAGE_NAME, PACKAGE_VERSION);
|
||||
fprintf(stdout, "Configuration:\n");
|
||||
fprintf(stdout, "- File ...............: %s\n", mme_config_p->config_file);
|
||||
fprintf(stdout, "- Verbosity level ....: %d\n", mme_config_p->verbosity_level);
|
||||
fprintf(stdout, "- Realm ..............: %s\n", mme_config_p->realm);
|
||||
fprintf(stdout, "- Max eNBs ...........: %u\n", mme_config_p->max_eNBs);
|
||||
fprintf(stdout, "- Max UEs ............: %u\n", mme_config_p->max_ues);
|
||||
fprintf(stdout, "- Emergency support ..: %s\n", mme_config_p->emergency_attach_supported == 0 ? "FALSE" : "TRUE");
|
||||
fprintf(stdout, "- Unauth IMSI support : %s\n", mme_config_p->unauthenticated_imsi_supported == 0 ? "FALSE" : "TRUE");
|
||||
fprintf(stdout, "- Relative capa ......: %u\n\n", mme_config_p->relative_capacity);
|
||||
fprintf(stdout, "- Statistics timer ...: %u (seconds)\n\n", mme_config_p->mme_statistic_timer);
|
||||
fprintf(stdout, "- S1-U:\n");
|
||||
fprintf(stdout, " port number ......: %d\n", mme_config_p->gtpv1u_config.port_number);
|
||||
fprintf(stdout, "- S1-MME:\n");
|
||||
fprintf(stdout, " port number ......: %d\n", mme_config_p->s1ap_config.port_number);
|
||||
fprintf(stdout, "- IP:\n");
|
||||
//fprintf(stdout, " s1-u iface .......: %s\n", mme_config_p->ipv4.sgw_interface_name_for_S1u_S12_S4_up);
|
||||
fprintf(stdout, " s1-u ip ..........: %s\n",
|
||||
inet_ntoa(*((struct in_addr *)&mme_config_p->ipv4.sgw_ip_address_for_S1u_S12_S4_up)));
|
||||
//fprintf(stdout, " sgi iface ........: %s\n", mme_config_p->ipv4.pgw_interface_name_for_SGI);
|
||||
//fprintf(stdout, " sgi ip ...........: %s/%d\n",
|
||||
// inet_ntoa(*((struct in_addr *)&mme_config_p->ipv4.pgw_ip_addr_for_SGI)),
|
||||
// mme_config_p->ipv4.pgw_ip_netmask_for_SGI);
|
||||
fprintf(stdout, " s1-MME iface .....: %s\n", mme_config_p->ipv4.mme_interface_name_for_S1_MME);
|
||||
fprintf(stdout, " s1-MME ip ........: %s\n",
|
||||
inet_ntoa(*((struct in_addr *)&mme_config_p->ipv4.mme_ip_address_for_S1_MME)));
|
||||
//fprintf(stdout, " s11 S-GW iface ...: %s\n", mme_config_p->ipv4.sgw_interface_name_for_S11);
|
||||
//fprintf(stdout, " s11 S-GW ip ......: %s/%d\n",
|
||||
// inet_ntoa(*((struct in_addr *)&mme_config_p->ipv4.sgw_ip_address_for_S11)),
|
||||
// mme_config_p->ipv4.sgw_ip_netmask_for_S11);
|
||||
fprintf(stdout, " s11 MME iface ....: %s\n", mme_config_p->ipv4.mme_interface_name_for_S11);
|
||||
fprintf(stdout, " s11 S-GW ip ......: %s\n",
|
||||
inet_ntoa(*((struct in_addr *)&mme_config_p->ipv4.mme_ip_address_for_S11)));
|
||||
fprintf(stdout, "- ITTI:\n");
|
||||
fprintf(stdout, " queue size .......: %u (bytes)\n", mme_config_p->itti_config.queue_size);
|
||||
fprintf(stdout, " log file .........: %s\n", mme_config_p->itti_config.log_file);
|
||||
fprintf(stdout, "- SCTP:\n");
|
||||
fprintf(stdout, " in streams .......: %u\n", mme_config_p->sctp_config.in_streams);
|
||||
fprintf(stdout, " out streams ......: %u\n", mme_config_p->sctp_config.out_streams);
|
||||
fprintf(stdout, "- GUMMEI:\n");
|
||||
fprintf(stdout, " mme group ids ....:\n ");
|
||||
DISPLAY_ARRAY(mme_config_p->gummei.nb_mme_gid, "| %u ", mme_config_p->gummei.mme_gid[i]);
|
||||
fprintf(stdout, " mme codes ........:\n ");
|
||||
DISPLAY_ARRAY(mme_config_p->gummei.nb_mmec, "| %u ", mme_config_p->gummei.mmec[i]);
|
||||
fprintf(stdout, " plmns ............: (mcc.mnc:tac)\n");
|
||||
|
||||
for (j= 0; j < mme_config_p->gummei.nb_plmns; j++) {
|
||||
if (mme_config_p->gummei.plmn_mnc_len[j] ==2 ) {
|
||||
fprintf(stdout, " %3u.%3u:%u\n",
|
||||
mme_config_p->gummei.plmn_mcc[j],
|
||||
mme_config_p->gummei.plmn_mnc[j],
|
||||
mme_config_p->gummei.plmn_tac[j]);
|
||||
} else {
|
||||
fprintf(stdout, " %3u.%03u:%u\n",
|
||||
mme_config_p->gummei.plmn_mcc[j],
|
||||
mme_config_p->gummei.plmn_mnc[j],
|
||||
mme_config_p->gummei.plmn_tac[j]);
|
||||
}
|
||||
}
|
||||
|
||||
fprintf(stdout, "- S6A:\n");
|
||||
fprintf(stdout, " conf file ........: %s\n", mme_config_p->s6a_config.conf_file);
|
||||
}
|
||||
|
||||
static void usage(void)
|
||||
{
|
||||
fprintf(stdout, "==== EURECOM %s v%s ====\n", PACKAGE_NAME, PACKAGE_VERSION);
|
||||
fprintf(stdout, "Please report any bug to: %s\n\n", PACKAGE_BUGREPORT);
|
||||
fprintf(stdout, "Usage: oaisim_mme [options]\n\n");
|
||||
fprintf(stdout, "Available options:\n");
|
||||
fprintf(stdout, "-h Print this help and return\n");
|
||||
fprintf(stdout, "-c<path>\n");
|
||||
fprintf(stdout, " Set the configuration file for mme\n");
|
||||
fprintf(stdout, " See template in UTILS/CONF\n");
|
||||
fprintf(stdout, "-K<file>\n");
|
||||
fprintf(stdout, " Output intertask messages to provided file\n");
|
||||
fprintf(stdout, "-V Print %s version and return\n", PACKAGE_NAME);
|
||||
fprintf(stdout, "-v[1-2] Debug level:\n");
|
||||
fprintf(stdout, " 1 -> ASN1 XER printf on and ASN1 debug off\n");
|
||||
fprintf(stdout, " 2 -> ASN1 XER printf on and ASN1 debug on\n");
|
||||
}
|
||||
|
||||
extern void
|
||||
nwGtpv1uDisplayBanner(void);
|
||||
|
||||
int config_parse_opt_line(int argc, char *argv[], mme_config_t *mme_config_p)
|
||||
{
|
||||
int c;
|
||||
mme_config_init(mme_config_p);
|
||||
|
||||
/* Parsing command line */
|
||||
while ((c = getopt (argc, argv, "O:c:hi:K:v:V")) != -1) {
|
||||
switch (c) {
|
||||
case 'O':
|
||||
case 'c': {
|
||||
/* Store the given configuration file. If no file is given,
|
||||
* then the default values will be used.
|
||||
*/
|
||||
int config_file_len = 0;
|
||||
config_file_len = strlen(optarg);
|
||||
mme_config_p->config_file = malloc(sizeof(char) * (config_file_len + 1));
|
||||
memcpy(mme_config_p->config_file, optarg, config_file_len);
|
||||
mme_config_p->config_file[config_file_len] = '\0';
|
||||
}
|
||||
break;
|
||||
|
||||
case 'v': {
|
||||
mme_config_p->verbosity_level = atoi(optarg);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'V': {
|
||||
fprintf(stdout, "==== EURECOM %s v%s ====\n"
|
||||
"Please report any bug to: %s\n", PACKAGE_NAME, PACKAGE_VERSION,
|
||||
PACKAGE_BUGREPORT);
|
||||
exit(0);
|
||||
nwGtpv1uDisplayBanner();
|
||||
}
|
||||
break;
|
||||
|
||||
case 'K':
|
||||
mme_config_p->itti_config.log_file = strdup(optarg);
|
||||
break;
|
||||
|
||||
case 'h': /* Fall through */
|
||||
default:
|
||||
usage();
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
/* Parse the configuration file using libconfig */
|
||||
if (config_parse_file(mme_config_p) != 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Display the configuration */
|
||||
config_display(mme_config_p);
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user