Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG UE
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Michael Black
OpenXG UE
Commits
7e98a9e7
Commit
7e98a9e7
authored
Sep 07, 2018
by
Cedric Roux
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/x2' into develop_integration_2018_w36
parents
4183ccfd
8271832f
Changes
19
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
19 changed files
with
1461 additions
and
103 deletions
+1461
-103
cmake_targets/CMakeLists.txt
cmake_targets/CMakeLists.txt
+10
-10
common/utils/LOG/log.c
common/utils/LOG/log.c
+1
-0
openair2/COMMON/sctp_messages_def.h
openair2/COMMON/sctp_messages_def.h
+11
-8
openair2/COMMON/sctp_messages_types.h
openair2/COMMON/sctp_messages_types.h
+36
-7
openair2/COMMON/x2ap_messages_def.h
openair2/COMMON/x2ap_messages_def.h
+9
-9
openair2/ENB_APP/enb_app.c
openair2/ENB_APP/enb_app.c
+63
-12
openair2/X2AP/x2ap_common.h
openair2/X2AP/x2ap_common.h
+2
-0
openair2/X2AP/x2ap_eNB.c
openair2/X2AP/x2ap_eNB.c
+451
-0
openair2/X2AP/x2ap_eNB.h
openair2/X2AP/x2ap_eNB.h
+5
-3
openair2/X2AP/x2ap_eNB_defs.h
openair2/X2AP/x2ap_eNB_defs.h
+184
-0
openair2/X2AP/x2ap_eNB_handler.c
openair2/X2AP/x2ap_eNB_handler.c
+79
-0
openair2/X2AP/x2ap_eNB_handler.h
openair2/X2AP/x2ap_eNB_handler.h
+33
-0
openair2/X2AP/x2ap_eNB_management_procedures.c
openair2/X2AP/x2ap_eNB_management_procedures.c
+236
-0
openair2/X2AP/x2ap_eNB_management_procedures.h
openair2/X2AP/x2ap_eNB_management_procedures.h
+14
-39
openair3/SCTP/sctp_common.c
openair3/SCTP/sctp_common.c
+6
-0
openair3/SCTP/sctp_eNB_itti_messaging.c
openair3/SCTP/sctp_eNB_itti_messaging.c
+14
-0
openair3/SCTP/sctp_eNB_itti_messaging.h
openair3/SCTP/sctp_eNB_itti_messaging.h
+2
-0
openair3/SCTP/sctp_eNB_task.c
openair3/SCTP/sctp_eNB_task.c
+299
-15
targets/COMMON/create_tasks.c
targets/COMMON/create_tasks.c
+6
-0
No files found.
cmake_targets/CMakeLists.txt
View file @
7e98a9e7
...
...
@@ -472,15 +472,15 @@ add_library(X2AP_LIB
include_directories
(
"
${
X2AP_C_DIR
}
"
)
include_directories
(
"
${
X2AP_DIR
}
"
)
#
add_library(X2AP_ENB
#
${X2AP_DIR}/x2ap_eNB.c
add_library
(
X2AP_ENB
${
X2AP_DIR
}
/x2ap_eNB.c
# ${X2AP_DIR}/x2ap_eNB_decoder.c
# ${X2AP_DIR}/x2ap_eNB_encoder.c
#
${X2AP_DIR}/x2ap_eNB_handler.c
${
X2AP_DIR
}
/x2ap_eNB_handler.c
# ${X2AP_DIR}/x2ap_eNB_itti_messaging.c
#
${X2AP_DIR}/x2ap_eNB_management_procedures.c
${
X2AP_DIR
}
/x2ap_eNB_management_procedures.c
# ${X2AP_DIR}/x2ap_eNB_generate_messages.c
#
)
)
# Hardware dependant options
###################################
...
...
@@ -1947,7 +1947,7 @@ add_executable(lte-softmodem
target_link_libraries
(
lte-softmodem
-Wl,--start-group
RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB PHY_COMMON PHY PHY_RU LFDS L2
RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB
X2AP_ENB
GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB PHY_COMMON PHY PHY_RU LFDS L2
${
MSC_LIB
}
${
RAL_LIB
}
${
NAS_UE_LIB
}
${
ITTI_LIB
}
${
FLPT_MSG_LIB
}
${
ASYNC_IF_LIB
}
${
FLEXRAN_AGENT_LIB
}
LFDS7
NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
-Wl,--end-group z dl
)
...
...
@@ -2023,7 +2023,7 @@ add_executable(lte-uesoftmodem
target_link_libraries
(
lte-uesoftmodem
-Wl,--start-group
RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON PHY_UE PHY_RU LFDS L2_UE SIMU
RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB
X2AP_ENB
GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON PHY_UE PHY_RU LFDS L2_UE SIMU
${
MSC_LIB
}
${
RAL_LIB
}
${
NAS_UE_LIB
}
${
ITTI_LIB
}
${
FLPT_MSG_LIB
}
${
ASYNC_IF_LIB
}
LFDS7
${
ATLAS_LIBRARIES
}
NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
-Wl,--end-group z dl
)
...
...
@@ -2140,7 +2140,7 @@ add_executable(test_epc_generate_scenario
${
OPENAIR3_DIR
}
/S1AP/s1ap_eNB_defs.h
)
target_link_libraries
(
test_epc_generate_scenario
-Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS
${
ITTI_LIB
}
L2 -Wl,--end-group pthread m rt crypt sctp
${
LIBXML2_LIBRARIES
}
${
LIBXSLT_LIBRARIES
}
${
CRYPTO_LIBRARIES
}
${
OPENSSL_LIBRARIES
}
${
NETTLE_LIBRARIES
}
${
CONFIG_LIBRARIES
}
-Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB
X2AP_ENB
GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS
${
ITTI_LIB
}
L2 -Wl,--end-group pthread m rt crypt sctp
${
LIBXML2_LIBRARIES
}
${
LIBXSLT_LIBRARIES
}
${
CRYPTO_LIBRARIES
}
${
OPENSSL_LIBRARIES
}
${
NETTLE_LIBRARIES
}
${
CONFIG_LIBRARIES
}
)
add_executable
(
test_epc_play_scenario
...
...
@@ -2160,7 +2160,7 @@ add_executable(test_epc_play_scenario
)
target_include_directories
(
test_epc_play_scenario PUBLIC /usr/local/share/asn1c
)
target_link_libraries
(
test_epc_play_scenario
-Wl,--start-group RRC_LIB S1AP_LIB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY_COMMON PHY PHY_UE LFDS
${
ITTI_LIB
}
${
MSC_LIB
}
-Wl,--end-group pthread m rt crypt sctp
${
LIBXML2_LIBRARIES
}
${
LIBXSLT_LIBRARIES
}
${
CRYPTO_LIBRARIES
}
${
OPENSSL_LIBRARIES
}
${
NETTLE_LIBRARIES
}
${
CONFIG_LIBRARIES
}
-Wl,--start-group RRC_LIB S1AP_LIB X2AP_LIB
X2AP_ENB
GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY_COMMON PHY PHY_UE LFDS
${
ITTI_LIB
}
${
MSC_LIB
}
-Wl,--end-group pthread m rt crypt sctp
${
LIBXML2_LIBRARIES
}
${
LIBXSLT_LIBRARIES
}
${
CRYPTO_LIBRARIES
}
${
OPENSSL_LIBRARIES
}
${
NETTLE_LIBRARIES
}
${
CONFIG_LIBRARIES
}
)
...
...
@@ -2196,7 +2196,7 @@ if (${T_TRACER})
dlsim_tm4 dlsim dlsim_tm7 ulsim pbchsim scansim mbmssim
pdcchsim pucchsim prachsim syncsim ulsim
#all "add_library" definitions
ITTI RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB
ITTI RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB
X2AP_ENB
oai_exmimodevif oai_usrpdevif oai_bladerfdevif oai_lmssdrdevif
oai_eth_transpro
FLPT_MSG ASYNC_IF FLEXRAN_AGENT HASHTABLE MSC UTIL OMG_SUMO SECU_OSA
...
...
common/utils/LOG/log.c
View file @
7e98a9e7
...
...
@@ -410,6 +410,7 @@ int logInit (void)
register_log_component
(
"S1AP"
,
""
,
S1AP
);
register_log_component
(
"X2AP"
,
""
,
X2AP
);
register_log_component
(
"SCTP"
,
""
,
SCTP
);
...
...
openair2/COMMON/sctp_messages_def.h
View file @
7e98a9e7
...
...
@@ -19,11 +19,14 @@
* contact@openairinterface.org
*/
MESSAGE_DEF
(
SCTP_NEW_ASSOCIATION_REQ
,
MESSAGE_PRIORITY_MED
,
sctp_new_association_req_t
,
sctp_new_association_req
)
MESSAGE_DEF
(
SCTP_NEW_ASSOCIATION_RESP
,
MESSAGE_PRIORITY_MED
,
sctp_new_association_resp_t
,
sctp_new_association_resp
)
MESSAGE_DEF
(
SCTP_NEW_ASSOCIATION_IND
,
MESSAGE_PRIORITY_MED
,
sctp_new_association_ind_t
,
sctp_new_association_ind
)
MESSAGE_DEF
(
SCTP_REGISTER_UPPER_LAYER
,
MESSAGE_PRIORITY_MED
,
sctp_listener_register_upper_layer_t
,
sctp_listener_register_upper_layer
)
MESSAGE_DEF
(
SCTP_DATA_REQ
,
MESSAGE_PRIORITY_MED
,
sctp_data_req_t
,
sctp_data_req
)
MESSAGE_DEF
(
SCTP_DATA_IND
,
MESSAGE_PRIORITY_MED
,
sctp_data_ind_t
,
sctp_data_ind
)
MESSAGE_DEF
(
SCTP_INIT_MSG
,
MESSAGE_PRIORITY_MED
,
sctp_init_t
,
sctp_init
)
MESSAGE_DEF
(
SCTP_CLOSE_ASSOCIATION
,
MESSAGE_PRIORITY_MAX
,
sctp_close_association_t
,
sctp_close_association
)
MESSAGE_DEF
(
SCTP_NEW_ASSOCIATION_REQ
,
MESSAGE_PRIORITY_MED
,
sctp_new_association_req_t
,
sctp_new_association_req
)
MESSAGE_DEF
(
SCTP_NEW_ASSOCIATION_REQ_MULTI
,
MESSAGE_PRIORITY_MED
,
sctp_new_association_req_multi_t
,
sctp_new_association_req_multi
)
MESSAGE_DEF
(
SCTP_NEW_ASSOCIATION_RESP
,
MESSAGE_PRIORITY_MED
,
sctp_new_association_resp_t
,
sctp_new_association_resp
)
MESSAGE_DEF
(
SCTP_NEW_ASSOCIATION_IND
,
MESSAGE_PRIORITY_MED
,
sctp_new_association_ind_t
,
sctp_new_association_ind
)
MESSAGE_DEF
(
SCTP_REGISTER_UPPER_LAYER
,
MESSAGE_PRIORITY_MED
,
sctp_listener_register_upper_layer_t
,
sctp_listener_register_upper_layer
)
MESSAGE_DEF
(
SCTP_DATA_REQ
,
MESSAGE_PRIORITY_MED
,
sctp_data_req_t
,
sctp_data_req
)
MESSAGE_DEF
(
SCTP_DATA_IND
,
MESSAGE_PRIORITY_MED
,
sctp_data_ind_t
,
sctp_data_ind
)
MESSAGE_DEF
(
SCTP_INIT_MSG
,
MESSAGE_PRIORITY_MED
,
sctp_init_t
,
sctp_init
)
MESSAGE_DEF
(
SCTP_INIT_MSG_MULTI_REQ
,
MESSAGE_PRIORITY_MED
,
sctp_init_t
,
sctp_init_multi
)
MESSAGE_DEF
(
SCTP_INIT_MSG_MULTI_CNF
,
MESSAGE_PRIORITY_MED
,
sctp_init_msg_multi_cnf_t
,
sctp_init_msg_multi_cnf
)
MESSAGE_DEF
(
SCTP_CLOSE_ASSOCIATION
,
MESSAGE_PRIORITY_MAX
,
sctp_close_association_t
,
sctp_close_association
)
openair2/COMMON/sctp_messages_types.h
View file @
7e98a9e7
...
...
@@ -22,13 +22,16 @@
#ifndef SCTP_MESSAGES_TYPES_H_
#define SCTP_MESSAGES_TYPES_H_
#define SCTP_NEW_ASSOCIATION_REQ(mSGpTR) (mSGpTR)->ittiMsg.sctp_new_association_req
#define SCTP_NEW_ASSOCIATION_RESP(mSGpTR)(mSGpTR)->ittiMsg.sctp_new_association_resp
#define SCTP_NEW_ASSOCIATION_IND(mSGpTR) (mSGpTR)->ittiMsg.sctp_new_association_ind
#define SCTP_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.sctp_data_ind
#define SCTP_DATA_REQ(mSGpTR) (mSGpTR)->ittiMsg.sctp_data_req
#define SCTP_INIT_MSG(mSGpTR) (mSGpTR)->ittiMsg.sctp_init
#define SCTP_CLOSE_ASSOCIATION(mSGpTR) (mSGpTR)->ittiMsg.sctp_close_association
#define SCTP_NEW_ASSOCIATION_REQ(mSGpTR) (mSGpTR)->ittiMsg.sctp_new_association_req
#define SCTP_NEW_ASSOCIATION_REQ_MULTI(mSGpTR) (mSGpTR)->ittiMsg.sctp_new_association_req_multi
#define SCTP_NEW_ASSOCIATION_RESP(mSGpTR) (mSGpTR)->ittiMsg.sctp_new_association_resp
#define SCTP_NEW_ASSOCIATION_IND(mSGpTR) (mSGpTR)->ittiMsg.sctp_new_association_ind
#define SCTP_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.sctp_data_ind
#define SCTP_DATA_REQ(mSGpTR) (mSGpTR)->ittiMsg.sctp_data_req
#define SCTP_INIT_MSG(mSGpTR) (mSGpTR)->ittiMsg.sctp_init
#define SCTP_INIT_MSG_MULTI_REQ(mSGpTR) (mSGpTR)->ittiMsg.sctp_init_multi
#define SCTP_INIT_MSG_MULTI_CNF(mSGpTR) (mSGpTR)->ittiMsg.sctp_init_msg_multi_cnf
#define SCTP_CLOSE_ASSOCIATION(mSGpTR) (mSGpTR)->ittiMsg.sctp_close_association
enum
sctp_state_e
{
SCTP_STATE_CLOSED
,
...
...
@@ -56,6 +59,32 @@ typedef struct sctp_new_association_req_s {
net_ip_address_t
remote_address
;
}
sctp_new_association_req_t
;
typedef
struct
sctp_new_association_req_multi_s
{
/* Upper layer connexion identifier */
uint16_t
ulp_cnx_id
;
/* The port to connect to */
uint16_t
port
;
/* Payload Protocol Identifier to use */
uint32_t
ppid
;
/* Number of streams used for this association */
uint16_t
in_streams
;
uint16_t
out_streams
;
/* Local address to bind to */
net_ip_address_t
local_address
;
/* Remote address to connect to */
net_ip_address_t
remote_address
;
/* Multi-socket descriptor */
int
multi_sd
;
}
sctp_new_association_req_multi_t
;
typedef
struct
sctp_init_msg_multi_cnf_s
{
int
multi_sd
;
}
sctp_init_msg_multi_cnf_t
;
typedef
struct
sctp_new_association_ind_s
{
/* Assoc id of the new association */
int32_t
assoc_id
;
...
...
openair2/COMMON/x2ap_messages_def.h
View file @
7e98a9e7
...
...
@@ -22,21 +22,21 @@
/* eNB application layer -> X2AP messages */
/* ITTI LOG messages */
/* ENCODER */
MESSAGE_DEF
(
X2AP_RESET_REQUST_LOG
,
MESSAGE_PRIORITY_MED
,
IttiMsgText
,
x2ap_reset_request_log
)
MESSAGE_DEF
(
X2AP_RESOURCE_STATUS_RESPONSE_LOG
,
MESSAGE_PRIORITY_MED
,
IttiMsgText
,
x2ap_resource_status_response_log
)
MESSAGE_DEF
(
X2AP_RESOURCE_STATUS_FAILURE_LOG
,
MESSAGE_PRIORITY_MED
,
IttiMsgText
,
x2ap_resource_status_failure_log
)
MESSAGE_DEF
(
X2AP_RESET_REQUST_LOG
,
MESSAGE_PRIORITY_MED
,
IttiMsgText
,
x2ap_reset_request_log
)
MESSAGE_DEF
(
X2AP_RESOURCE_STATUS_RESPONSE_LOG
,
MESSAGE_PRIORITY_MED
,
IttiMsgText
,
x2ap_resource_status_response_log
)
MESSAGE_DEF
(
X2AP_RESOURCE_STATUS_FAILURE_LOG
,
MESSAGE_PRIORITY_MED
,
IttiMsgText
,
x2ap_resource_status_failure_log
)
/* Messages for X2AP logging */
MESSAGE_DEF
(
X2AP_SETUP_REQUEST_LOG
,
MESSAGE_PRIORITY_MED
,
IttiMsgText
,
x2ap_setup_request_log
)
MESSAGE_DEF
(
X2AP_SETUP_REQUEST_LOG
,
MESSAGE_PRIORITY_MED
,
IttiMsgText
,
x2ap_setup_request_log
)
/* eNB application layer -> X2AP messages */
MESSAGE_DEF
(
X2AP_REGISTER_ENB_REQ
,
MESSAGE_PRIORITY_MED
,
x2ap_register_enb_req_t
,
x2ap_register_enb_req
)
MESSAGE_DEF
(
X2AP_REGISTER_ENB_REQ
,
MESSAGE_PRIORITY_MED
,
x2ap_register_enb_req_t
,
x2ap_register_enb_req
)
/* X2AP -> eNB application layer messages */
MESSAGE_DEF
(
X2AP_REGISTER_ENB_CNF
,
MESSAGE_PRIORITY_MED
,
x2ap_register_enb_cnf_t
,
x2ap_register_enb_cnf
)
MESSAGE_DEF
(
X2AP_DEREGISTERED_ENB_IND
,
MESSAGE_PRIORITY_MED
,
x2ap_deregistered_enb_ind_t
,
x2ap_deregistered_enb_ind
)
MESSAGE_DEF
(
X2AP_REGISTER_ENB_CNF
,
MESSAGE_PRIORITY_MED
,
x2ap_register_enb_cnf_t
,
x2ap_register_enb_cnf
)
MESSAGE_DEF
(
X2AP_DEREGISTERED_ENB_IND
,
MESSAGE_PRIORITY_MED
,
x2ap_deregistered_enb_ind_t
,
x2ap_deregistered_enb_ind
)
/* handover messages X2AP <-> RRC */
MESSAGE_DEF
(
X2AP_HANDOVER_REQ
,
MESSAGE_PRIORITY_MED
,
x2ap_handover_req_t
,
x2ap_handover_req
)
MESSAGE_DEF
(
X2AP_HANDOVER_REQ_ACK
,
MESSAGE_PRIORITY_MED
,
x2ap_handover_req_ack_t
,
x2ap_handover_req_ack
)
MESSAGE_DEF
(
X2AP_HANDOVER_REQ
,
MESSAGE_PRIORITY_MED
,
x2ap_handover_req_t
,
x2ap_handover_req
)
MESSAGE_DEF
(
X2AP_HANDOVER_REQ_ACK
,
MESSAGE_PRIORITY_MED
,
x2ap_handover_req_ack_t
,
x2ap_handover_req_ack
)
openair2/ENB_APP/enb_app.c
View file @
7e98a9e7
...
...
@@ -47,7 +47,7 @@
# define EPC_MODE_ENABLED 0
# endif
//
# include "x2ap_eNB.h"
# include "x2ap_eNB.h"
# include "x2ap_messages_types.h"
# define X2AP_ENB_REGISTER_RETRY_DELAY 10
...
...
@@ -157,7 +157,7 @@ static uint32_t eNB_app_register_x2(uint32_t enb_id_start, uint32_t enb_id_end)
RCconfig_X2
(
msg_p
,
enb_id
);
//
itti_send_msg_to_task (TASK_X2AP, ENB_MODULE_ID_TO_INSTANCE(enb_id), msg_p);
itti_send_msg_to_task
(
TASK_X2AP
,
ENB_MODULE_ID_TO_INSTANCE
(
enb_id
),
msg_p
);
register_enb_x2_pending
++
;
}
...
...
@@ -179,8 +179,8 @@ void *eNB_app_task(void *args_p)
long
enb_register_retry_timer_id
;
# endif
uint32_t
x2_register_enb_pending
;
//
uint32_t x2_registered_enb;
//
long x2_enb_register_retry_timer_id;
uint32_t
x2_registered_enb
;
long
x2_enb_register_retry_timer_id
;
uint32_t
enb_id
;
MessageDef
*
msg_p
=
NULL
;
instance_t
instance
;
...
...
@@ -227,7 +227,7 @@ void *eNB_app_task(void *args_p)
#endif
/* Try to register each eNB with each other */
//
x2_registered_enb = 0;
x2_registered_enb
=
0
;
x2_register_enb_pending
=
eNB_app_register_x2
(
enb_id_start
,
enb_id_end
);
do
{
...
...
@@ -302,16 +302,67 @@ void *eNB_app_task(void *args_p)
case
TIMER_HAS_EXPIRED
:
# if defined(ENABLE_USE_MME)
LOG_I
(
ENB_APP
,
" Received %s: timer_id %ld
\n
"
,
ITTI_MSG_NAME
(
msg_p
),
TIMER_HAS_EXPIRED
(
msg_p
).
timer_id
);
LOG_I
(
ENB_APP
,
" Received %s: timer_id %ld
\n
"
,
ITTI_MSG_NAME
(
msg_p
),
TIMER_HAS_EXPIRED
(
msg_p
).
timer_id
);
if
(
TIMER_HAS_EXPIRED
(
msg_p
).
timer_id
==
enb_register_retry_timer_id
)
{
/* Restart the registration process */
registered_enb
=
0
;
register_enb_pending
=
eNB_app_register
(
enb_id_start
,
enb_id_end
);
//, enb_properties_p);
}
#endif
if
(
TIMER_HAS_EXPIRED
(
msg_p
).
timer_id
==
enb_register_retry_timer_id
)
{
/* Restart the registration process */
registered_enb
=
0
;
register_enb_pending
=
eNB_app_register
(
enb_id_start
,
enb_id_end
);
//, enb_properties_p);
}
if
(
TIMER_HAS_EXPIRED
(
msg_p
).
timer_id
==
x2_enb_register_retry_timer_id
)
{
/* Restart the registration process */
x2_registered_enb
=
0
;
x2_register_enb_pending
=
eNB_app_register_x2
(
enb_id_start
,
enb_id_end
);
}
# endif
break
;
case
X2AP_DEREGISTERED_ENB_IND
:
LOG_W
(
ENB_APP
,
"[eNB %d] Received %s: associated eNB %d
\n
"
,
instance
,
ITTI_MSG_NAME
(
msg_p
),
X2AP_DEREGISTERED_ENB_IND
(
msg_p
).
nb_x2
);
/* TODO handle recovering of registration */
break
;
case
X2AP_REGISTER_ENB_CNF
:
LOG_I
(
ENB_APP
,
"[eNB %d] Received %s: associated eNB %d
\n
"
,
instance
,
ITTI_MSG_NAME
(
msg_p
),
X2AP_REGISTER_ENB_CNF
(
msg_p
).
nb_x2
);
DevAssert
(
x2_register_enb_pending
>
0
);
x2_register_enb_pending
--
;
/* Check if at least eNB is registered with one target eNB */
if
(
X2AP_REGISTER_ENB_CNF
(
msg_p
).
nb_x2
>
0
)
{
x2_registered_enb
++
;
}
/* Check if all register eNB requests have been processed */
if
(
x2_register_enb_pending
==
0
)
{
if
(
x2_registered_enb
==
enb_nb
)
{
/* If all eNB are registered, start RRC HO task */
}
else
{
uint32_t
x2_not_associated
=
enb_nb
-
x2_registered_enb
;
LOG_W
(
ENB_APP
,
" %d eNB %s not associated with the target
\n
"
,
x2_not_associated
,
x2_not_associated
>
1
?
"are"
:
"is"
);
// timer to retry
/* Restart the eNB registration process in ENB_REGISTER_RETRY_DELAY seconds */
if
(
timer_setup
(
X2AP_ENB_REGISTER_RETRY_DELAY
,
0
,
TASK_ENB_APP
,
INSTANCE_DEFAULT
,
TIMER_ONE_SHOT
,
NULL
,
&
x2_enb_register_retry_timer_id
)
<
0
)
{
LOG_E
(
ENB_APP
,
" Can not start eNB X2AP register: retry timer, use
\"
sleep
\"
instead!
\n
"
);
sleep
(
X2AP_ENB_REGISTER_RETRY_DELAY
);
/* Restart the registration process */
x2_registered_enb
=
0
;
x2_register_enb_pending
=
eNB_app_register_x2
(
enb_id_start
,
enb_id_end
);
}
}
}
break
;
default:
LOG_E
(
ENB_APP
,
"Received unexpected message %s
\n
"
,
ITTI_MSG_NAME
(
msg_p
));
...
...
openair2/X2AP/x2ap_common.h
View file @
7e98a9e7
...
...
@@ -61,10 +61,12 @@ extern int asn1_xer_print;
#if defined(ENB_MODE)
# include "common/utils/LOG/log.h"
# define X2AP_INFO(x, args...) LOG_I(X2AP, x, ##args)
# define X2AP_ERROR(x, args...) LOG_E(X2AP, x, ##args)
# define X2AP_WARN(x, args...) LOG_W(X2AP, x, ##args)
# define X2AP_DEBUG(x, args...) LOG_D(X2AP, x, ##args)
#else
# define X2AP_INFO(x, args...) do { fprintf(stdout, "[X2AP][I]"x, ##args); } while(0)
# define X2AP_ERROR(x, args...) do { fprintf(stdout, "[X2AP][E]"x, ##args); } while(0)
# define X2AP_WARN(x, args...) do { fprintf(stdout, "[X2AP][W]"x, ##args); } while(0)
# define X2AP_DEBUG(x, args...) do { fprintf(stdout, "[X2AP][D]"x, ##args); } while(0)
...
...
openair2/X2AP/x2ap_eNB.c
0 → 100644
View file @
7e98a9e7
This diff is collapsed.
Click to expand it.
openair2/X2AP/x2ap.h
→
openair2/X2AP/x2ap
_eNB
.h
View file @
7e98a9e7
...
...
@@ -30,10 +30,12 @@
#ifndef X2AP_H_
#define X2AP_H_
typedef
struct
x2ap_config_s
{
}
x2ap_config_t
;
#define X2AP_SCTP_PPID (27) ///< X2AP SCTP Payload Protocol Identifier (PPID)
#include "x2ap_eNB_defs.h"
extern
x2ap_config_t
x2ap_config
;
int
x2ap_eNB_init_sctp
(
x2ap_eNB_instance_t
*
instance_p
,
net_ip_address_t
*
local_ip_addr
,
uint32_t
enb_port_for_X2C
);
void
*
x2ap_task
(
void
*
arg
);
...
...
openair2/X2AP/x2ap_eNB_defs.h
0 → 100644
View file @
7e98a9e7
/*
* 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
*/
#include <stdint.h>
#include "queue.h"
#include "tree.h"
#include "sctp_eNB_defs.h"
#ifndef X2AP_ENB_DEFS_H_
#define X2AP_ENB_DEFS_H_
#define X2AP_ENB_NAME_LENGTH_MAX (150)
typedef
enum
{
/* Disconnected state: initial state for any association. */
X2AP_ENB_STATE_DISCONNECTED
=
0x0
,
/* State waiting for x2 Setup response message if the target eNB accepts or
* X2 Setup failure if rejects the eNB.
*/
X2AP_ENB_STATE_WAITING
=
0x1
,
/* The eNB is successfully connected to another eNB. */
X2AP_ENB_STATE_CONNECTED
=
0x2
,
/* X2AP is ready, and the eNB is successfully connected to another eNB. */
X2AP_ENB_STATE_READY
=
0x3
,
X2AP_ENB_STATE_OVERLOAD
=
0x4
,
X2AP_ENB_STATE_RESETTING
=
0x5
,
/* Max number of states available */
X2AP_ENB_STATE_MAX
,
}
x2ap_eNB_state_t
;
/* Served PLMN identity element */
struct
plmn_identity_s
{
uint16_t
mcc
;
uint16_t
mnc
;
uint8_t
mnc_digit_length
;
STAILQ_ENTRY
(
plmn_identity_s
)
next
;
};
/* Served group id element */
struct
served_group_id_s
{
uint16_t
enb_group_id
;
STAILQ_ENTRY
(
served_group_id_s
)
next
;
};
/* Served enn code for a particular eNB */
struct
enb_code_s
{
uint8_t
enb_code
;
STAILQ_ENTRY
(
enb_code_s
)
next
;
};
struct
x2ap_eNB_instance_s
;
/* This structure describes association of a eNB to another eNB */
typedef
struct
x2ap_eNB_data_s
{
/* eNB descriptors tree, ordered by sctp assoc id */
RB_ENTRY
(
x2ap_eNB_data_s
)
entry
;
/* This is the optional name provided by the MME */
char
*
eNB_name
;
/* target eNB ID */
uint32_t
eNB_id
;
/* Current eNB load information (if any). */
//x2ap_load_state_t overload_state;
/* Current eNB->eNB X2AP association state */
x2ap_eNB_state_t
state
;
/* Next usable stream for UE signalling */
int32_t
nextstream
;
/* Number of input/ouput streams */
uint16_t
in_streams
;
uint16_t
out_streams
;
/* Connexion id used between SCTP/X2AP */
uint16_t
cnx_id
;
/* SCTP association id */
int32_t
assoc_id
;
/* Only meaningfull in virtual mode */
struct
x2ap_eNB_instance_s
*
x2ap_eNB_instance
;
}
x2ap_eNB_data_t
;
typedef
struct
x2ap_eNB_instance_s
{
/* used in simulation to store multiple eNB instances*/
STAILQ_ENTRY
(
x2ap_eNB_instance_s
)
x2ap_eNB_entries
;
/* Number of target eNBs requested by eNB (tree size) */
uint32_t
x2_target_enb_nb
;
/* Number of target eNBs for which association is pending */
uint32_t
x2_target_enb_pending_nb
;
/* Number of target eNB successfully associated to eNB */
uint32_t
x2_target_enb_associated_nb
;
/* Tree of X2AP eNB associations ordered by association ID */
RB_HEAD
(
x2ap_enb_map
,
x2ap_eNB_data_s
)
x2ap_enb_head
;
/* Tree of UE ordered by eNB_ue_x2ap_id's */
// RB_HEAD(x2ap_ue_map, x2ap_eNB_ue_context_s) x2ap_ue_head;
/* For virtual mode, mod_id as defined in the rest of the L1/L2 stack */
instance_t
instance
;
/* Displayable name of eNB */
char
*
eNB_name
;
/* Unique eNB_id to identify the eNB within EPC.
* In our case the eNB is a macro eNB so the id will be 20 bits long.
* For Home eNB id, this field should be 28 bits long.
*/
uint32_t
eNB_id
;
/* The type of the cell */
cell_type_t
cell_type
;
/* Tracking area code */
uint16_t
tac
;
/* Mobile Country Code
* Mobile Network Code
*/
uint16_t
mcc
;
uint16_t
mnc
;
uint8_t
mnc_digit_length
;
net_ip_address_t
target_enb_x2_ip_address
[
X2AP_MAX_NB_ENB_IP_ADDRESS
];
uint8_t
nb_x2
;
net_ip_address_t
enb_x2_ip_address
;
uint16_t
sctp_in_streams
;
uint16_t
sctp_out_streams
;
uint32_t
enb_port_for_X2C
;
int
multi_sd
;
}
x2ap_eNB_instance_t
;
typedef
struct
{
/* List of served eNBs
* Only used for virtual mode
*/
STAILQ_HEAD
(
x2ap_eNB_instances_head_s
,
x2ap_eNB_instance_s
)
x2ap_eNB_instances_head
;
/* Nb of registered eNBs */
uint8_t
nb_registered_eNBs
;
/* Generate a unique connexion id used between X2AP and SCTP */
uint16_t
global_cnx_id
;
}
x2ap_eNB_internal_data_t
;
int
x2ap_eNB_compare_assoc_id
(
struct
x2ap_eNB_data_s
*
p1
,
struct
x2ap_eNB_data_s
*
p2
);
/* Generate the tree management functions */
struct
x2ap_eNB_map
;
struct
x2ap_eNB_data_s
;
RB_PROTOTYPE
(
x2ap_eNB_map
,
x2ap_eNB_data_s
,
entry
,
x2ap_eNB_compare_assoc_id
);
#endif
/* X2AP_ENB_DEFS_H_ */
openair2/X2AP/x2ap_eNB_handler.c
0 → 100644
View file @
7e98a9e7
/*
* 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
*/
#include <stdint.h>
#include "intertask_interface.h"
#include "asn1_conversions.h"
#include "x2ap_common.h"
#include "x2ap_eNB_defs.h"
#include "x2ap_eNB_handler.h"
#include "x2ap_eNB_management_procedures.h"
#include "assertions.h"
#include "conversions.h"
void
x2ap_handle_x2_setup_message
(
x2ap_eNB_data_t
*
enb_desc_p
,
int
sctp_shutdown
)
{
if
(
sctp_shutdown
)
{
/* A previously connected eNB has been shutdown */
/* TODO check if it was used by some eNB and send a message to inform these eNB if there is no more associated eNB */
if
(
enb_desc_p
->
state
==
X2AP_ENB_STATE_CONNECTED
)
{
enb_desc_p
->
state
=
X2AP_ENB_STATE_DISCONNECTED
;
if
(
enb_desc_p
->
x2ap_eNB_instance
->
x2_target_enb_associated_nb
>
0
)
{
/* Decrease associated eNB number */
enb_desc_p
->
x2ap_eNB_instance
->
x2_target_enb_associated_nb
--
;
}
/* If there are no more associated eNB, inform eNB app */
if
(
enb_desc_p
->
x2ap_eNB_instance
->
x2_target_enb_associated_nb
==
0
)
{
MessageDef
*
message_p
;
message_p
=
itti_alloc_new_message
(
TASK_X2AP
,
X2AP_DEREGISTERED_ENB_IND
);
X2AP_DEREGISTERED_ENB_IND
(
message_p
).
nb_x2
=
0
;
itti_send_msg_to_task
(
TASK_ENB_APP
,
enb_desc_p
->
x2ap_eNB_instance
->
instance
,
message_p
);
}
}
}
else
{
/* Check that at least one setup message is pending */
DevCheck
(
enb_desc_p
->
x2ap_eNB_instance
->
x2_target_enb_pending_nb
>
0
,
enb_desc_p
->
x2ap_eNB_instance
->
instance
,
enb_desc_p
->
x2ap_eNB_instance
->
x2_target_enb_pending_nb
,
0
);
if
(
enb_desc_p
->
x2ap_eNB_instance
->
x2_target_enb_pending_nb
>
0
)
{
/* Decrease pending messages number */
enb_desc_p
->
x2ap_eNB_instance
->
x2_target_enb_pending_nb
--
;
}
/* If there are no more pending messages, inform eNB app */
if
(
enb_desc_p
->
x2ap_eNB_instance
->
x2_target_enb_pending_nb
==
0
)
{
MessageDef
*
message_p
;
message_p
=
itti_alloc_new_message
(
TASK_X2AP
,
X2AP_REGISTER_ENB_CNF
);
X2AP_REGISTER_ENB_CNF
(
message_p
).
nb_x2
=
enb_desc_p
->
x2ap_eNB_instance
->
x2_target_enb_associated_nb
;
itti_send_msg_to_task
(
TASK_ENB_APP
,
enb_desc_p
->
x2ap_eNB_instance
->
instance
,
message_p
);
}
}
}
openair2/X2AP/x2ap_eNB_handler.h
0 → 100644
View file @
7e98a9e7
/*
* 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
*/
#ifndef X2AP_ENB_HANDLERS_H_
#define X2AP_ENB_HANDLERS_H_
#include "x2ap_eNB_defs.h"
void
x2ap_handle_x2_setup_message
(
x2ap_eNB_data_t
*
mme_desc_p
,
int
sctp_shutdown
);
//int x2ap_eNB_handle_message(uint32_t assoc_id, int32_t stream,
// const uint8_t * const data, const uint32_t data_length);
#endif
/* X2AP_ENB_HANDLERS_H_ */
openair2/X2AP/x2ap_eNB_management_procedures.c
0 → 100644
View file @
7e98a9e7
/*
* 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
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include "intertask_interface.h"
#include "assertions.h"
#include "conversions.h"
#include "x2ap_common.h"
#include "x2ap_eNB_defs.h"
#include "x2ap_eNB.h"
#define X2AP_DEBUG_LIST
#ifdef X2AP_DEBUG_LIST
# define X2AP_eNB_LIST_OUT(x, args...) X2AP_DEBUG("[eNB]%*s"x"\n", 4*indent, "", ##args)
#else
# define X2AP_eNB_LIST_OUT(x, args...)
#endif
static
int
indent
=
0
;
x2ap_eNB_internal_data_t
x2ap_eNB_internal_data
;
RB_GENERATE
(
x2ap_enb_map
,
x2ap_eNB_data_s
,
entry
,
x2ap_eNB_compare_assoc_id
);
int
x2ap_eNB_compare_assoc_id
(
struct
x2ap_eNB_data_s
*
p1
,
struct
x2ap_eNB_data_s
*
p2
)
{
if
(
p1
->
assoc_id
==
-
1
)
{
if
(
p1
->
cnx_id
<
p2
->
cnx_id
)
{
return
-
1
;
}
if
(
p1
->
cnx_id
>
p2
->
cnx_id
)
{
return
1
;
}
}
else
{
if
(
p1
->
assoc_id
<
p2
->
assoc_id
)
{
return
-
1
;
}
if
(
p1
->
assoc_id
>
p2
->
assoc_id
)
{
return
1
;
}
}
/* Matching reference */
return
0
;
}
uint16_t
x2ap_eNB_fetch_add_global_cnx_id
(
void
)
{
return
++
x2ap_eNB_internal_data
.
global_cnx_id
;
}
void
x2ap_eNB_prepare_internal_data
(
void
)
{
memset
(
&
x2ap_eNB_internal_data
,
0
,
sizeof
(
x2ap_eNB_internal_data
));
STAILQ_INIT
(
&
x2ap_eNB_internal_data
.
x2ap_eNB_instances_head
);
}
void
x2ap_eNB_insert_new_instance
(
x2ap_eNB_instance_t
*
new_instance_p
)
{
DevAssert
(
new_instance_p
!=
NULL
);
STAILQ_INSERT_TAIL
(
&
x2ap_eNB_internal_data
.
x2ap_eNB_instances_head
,
new_instance_p
,
x2ap_eNB_entries
);
}
void
dump_tree
(
x2ap_eNB_data_t
*
t
)
{
if
(
t
==
NULL
)
return
;
printf
(
"-----------------------
\n
"
);
printf
(
"eNB id %d %s
\n
"
,
t
->
eNB_id
,
t
->
eNB_name
);
printf
(
"state %d
\n
"
,
t
->
state
);
printf
(
"nextstream %d
\n
"
,
t
->
nextstream
);
printf
(
"in_streams %d out_streams %d
\n
"
,
t
->
in_streams
,
t
->
out_streams
);
printf
(
"cnx_id %d assoc_id %d
\n
"
,
t
->
cnx_id
,
t
->
assoc_id
);
dump_tree
(
t
->
entry
.
rbe_left
);
dump_tree
(
t
->
entry
.
rbe_right
);
}
void
dump_trees
(
void
)
{
x2ap_eNB_instance_t
*
zz
;
STAILQ_FOREACH
(
zz
,
&
x2ap_eNB_internal_data
.
x2ap_eNB_instances_head
,
x2ap_eNB_entries
)
{
printf
(
"here comes the tree (instance %d):
\n
---------------------------------------------
\n
"
,
zz
->
instance
);
dump_tree
(
zz
->
x2ap_enb_head
.
rbh_root
);
printf
(
"---------------------------------------------
\n
"
);
}
}
struct
x2ap_eNB_data_s
*
x2ap_get_eNB
(
x2ap_eNB_instance_t
*
instance_p
,
int32_t
assoc_id
,
uint16_t
cnx_id
)
{
struct
x2ap_eNB_data_s
temp
;
struct
x2ap_eNB_data_s
*
found
;
printf
(
"x2ap_get_eNB at 1 (looking for assoc_id %d cnx_id %d)
\n
"
,
assoc_id
,
cnx_id
);
dump_trees
();
memset
(
&
temp
,
0
,
sizeof
(
struct
x2ap_eNB_data_s
));
temp
.
assoc_id
=
assoc_id
;
temp
.
cnx_id
=
cnx_id
;
if
(
instance_p
==
NULL
)
{
STAILQ_FOREACH
(
instance_p
,
&
x2ap_eNB_internal_data
.
x2ap_eNB_instances_head
,
x2ap_eNB_entries
)
{
found
=
RB_FIND
(
x2ap_enb_map
,
&
instance_p
->
x2ap_enb_head
,
&
temp
);
if
(
found
!=
NULL
)
{
return
found
;
}
}
}
else
{
return
RB_FIND
(
x2ap_enb_map
,
&
instance_p
->
x2ap_enb_head
,
&
temp
);
}
return
NULL
;
}
x2ap_eNB_instance_t
*
x2ap_eNB_get_instance
(
instance_t
instance
)
{
x2ap_eNB_instance_t
*
temp
=
NULL
;
STAILQ_FOREACH
(
temp
,
&
x2ap_eNB_internal_data
.
x2ap_eNB_instances_head
,
x2ap_eNB_entries
)
{
if
(
temp
->
instance
==
instance
)
{
/* Matching occurence */
return
temp
;
}
}
return
NULL
;
}
/// utility functions
void
x2ap_dump_eNB
(
x2ap_eNB_data_t
*
eNB_ref
);
void
x2ap_dump_eNB_list
(
void
)
{
x2ap_eNB_instance_t
*
inst
=
NULL
;
struct
x2ap_eNB_data_s
*
found
=
NULL
;
struct
x2ap_eNB_data_s
temp
;
memset
(
&
temp
,
0
,
sizeof
(
struct
x2ap_eNB_data_s
));
STAILQ_FOREACH
(
inst
,
&
x2ap_eNB_internal_data
.
x2ap_eNB_instances_head
,
x2ap_eNB_entries
)
{
found
=
RB_FIND
(
x2ap_enb_map
,
&
inst
->
x2ap_enb_head
,
&
temp
);
x2ap_dump_eNB
(
found
);
}
}
void
x2ap_dump_eNB
(
x2ap_eNB_data_t
*
eNB_ref
)
{
if
(
eNB_ref
==
NULL
)
{
return
;
}
X2AP_eNB_LIST_OUT
(
""
);
X2AP_eNB_LIST_OUT
(
"eNB name: %s"
,
eNB_ref
->
eNB_name
==
NULL
?
"not present"
:
eNB_ref
->
eNB_name
);
X2AP_eNB_LIST_OUT
(
"eNB STATE: %07x"
,
eNB_ref
->
state
);
X2AP_eNB_LIST_OUT
(
"eNB ID: %07x"
,
eNB_ref
->
eNB_id
);
indent
++
;
X2AP_eNB_LIST_OUT
(
"SCTP cnx id: %d"
,
eNB_ref
->
cnx_id
);
X2AP_eNB_LIST_OUT
(
"SCTP assoc id: %d"
,
eNB_ref
->
assoc_id
);
X2AP_eNB_LIST_OUT
(
"SCTP instreams: %d"
,
eNB_ref
->
in_streams
);
X2AP_eNB_LIST_OUT
(
"SCTP outstreams: %d"
,
eNB_ref
->
out_streams
);
indent
--
;
}
x2ap_eNB_data_t
*
x2ap_is_eNB_id_in_list
(
const
uint32_t
eNB_id
)
{
x2ap_eNB_instance_t
*
inst
;
struct
x2ap_eNB_data_s
*
elm
;
STAILQ_FOREACH
(
inst
,
&
x2ap_eNB_internal_data
.
x2ap_eNB_instances_head
,
x2ap_eNB_entries
)
{
RB_FOREACH
(
elm
,
x2ap_enb_map
,
&
inst
->
x2ap_enb_head
)
{
if
(
elm
->
eNB_id
==
eNB_id
)
return
elm
;
}
}
return
NULL
;
}
x2ap_eNB_data_t
*
x2ap_is_eNB_assoc_id_in_list
(
const
uint32_t
sctp_assoc_id
)
{
x2ap_eNB_instance_t
*
inst
;
struct
x2ap_eNB_data_s
*
found
;
struct
x2ap_eNB_data_s
temp
;
temp
.
assoc_id
=
sctp_assoc_id
;
temp
.
cnx_id
=
-
1
;
STAILQ_FOREACH
(
inst
,
&
x2ap_eNB_internal_data
.
x2ap_eNB_instances_head
,
x2ap_eNB_entries
)
{
found
=
RB_FIND
(
x2ap_enb_map
,
&
inst
->
x2ap_enb_head
,
&
temp
);
if
(
found
!=
NULL
){
if
(
found
->
assoc_id
==
sctp_assoc_id
)
{
return
found
;
}
}
}
return
NULL
;
}
openair2/X2AP/x2ap
.c
→
openair2/X2AP/x2ap
_eNB_management_procedures.h
View file @
7e98a9e7
...
...
@@ -19,53 +19,28 @@
* contact@openairinterface.org
*/
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#ifndef X2AP_ENB_MANAGEMENT_PROCEDURES_H_
#define X2AP_ENB_MANAGEMENT_PROCEDURES_H
void
x2ap_eNB_prepare_internal_data
(
void
);
#include "intertask_interface.h"
void
dump_trees
(
void
);
#include "x2ap.h"
void
x2ap_eNB_insert_new_instance
(
x2ap_eNB_instance_t
*
new_instance_p
);
#include "assertions.h"
#include "conversions.h"
x2ap_eNB_instance_t
*
x2ap_eNB_get_instance
(
uint8_t
mod_id
);
uint16_t
x2ap_eNB_fetch_add_global_cnx_id
(
void
);
void
*
x2ap_task
(
void
*
arg
)
{
MessageDef
*
received_msg
=
NULL
;
int
result
;
void
x2ap_eNB_prepare_internal_data
(
void
);
X2AP_DEBUG
(
"Starting X2AP layer
\n
"
);
x2ap_eNB_data_t
*
x2ap_is_eNB_id_in_list
(
uint32_t
eNB_id
);
x2ap_prepare_internal_data
(
);
x2ap_eNB_data_t
*
x2ap_is_eNB_assoc_id_in_list
(
uint32_t
sctp_assoc_id
);
itti_mark_task_ready
(
TASK_X2AP
);
while
(
1
)
{
itti_receive_msg
(
TASK_X2AP
,
&
received_msg
);
switch
(
ITTI_MSG_ID
(
received_msg
))
{
case
TERMINATE_MESSAGE
:
X2AP_WARN
(
" *** Exiting X2AP thread
\n
"
);
itti_exit_task
();
break
;
default:
X2AP_ERROR
(
"Received unhandled message: %d:%s
\n
"
,
ITTI_MSG_ID
(
received_msg
),
ITTI_MSG_NAME
(
received_msg
));
break
;
}
result
=
itti_free
(
ITTI_MSG_ORIGIN_ID
(
received_msg
),
received_msg
);
AssertFatal
(
result
==
EXIT_SUCCESS
,
"Failed to free memory (%d)!
\n
"
,
result
);
received_msg
=
NULL
;
}
return
NULL
;
}
struct
x2ap_eNB_data_s
*
x2ap_get_eNB
(
x2ap_eNB_instance_t
*
instance_p
,
int32_t
assoc_id
,
uint16_t
cnx_id
);
#endif
/* X2AP_ENB_MANAGEMENT_PROCEDURES_H_ */
openair3/SCTP/sctp_common.c
View file @
7e98a9e7
...
...
@@ -86,6 +86,12 @@ int sctp_get_sockinfo(int sock, uint16_t *instream, uint16_t *outstream,
memset
(
&
status
,
0
,
sizeof
(
struct
sctp_status
));
i
=
sizeof
(
struct
sctp_status
);
/* if sock refers to a multi SCTP endpoint, *assoc_id gives us
* the association ID that we want
*/
if
(
assoc_id
!=
NULL
)
status
.
sstat_assoc_id
=
*
assoc_id
;
if
(
getsockopt
(
sock
,
IPPROTO_SCTP
,
SCTP_STATUS
,
&
status
,
&
i
)
<
0
)
{
SCTP_ERROR
(
"Getsockopt SCTP_STATUS failed: %s
\n
"
,
strerror
(
errno
));
return
-
1
;
...
...
openair3/SCTP/sctp_eNB_itti_messaging.c
View file @
7e98a9e7
...
...
@@ -24,6 +24,20 @@
#include "sctp_common.h"
#include "sctp_eNB_itti_messaging.h"
int
sctp_itti_send_init_msg_multi_cnf
(
task_id_t
task_id
,
instance_t
instance
,
int
multi_sd
)
{
MessageDef
*
message_p
;
sctp_init_msg_multi_cnf_t
*
sctp_init_msg_multi_cnf_p
;
message_p
=
itti_alloc_new_message
(
TASK_SCTP
,
SCTP_INIT_MSG_MULTI_CNF
);
sctp_init_msg_multi_cnf_p
=
&
message_p
->
ittiMsg
.
sctp_init_msg_multi_cnf
;
sctp_init_msg_multi_cnf_p
->
multi_sd
=
multi_sd
;
return
itti_send_msg_to_task
(
task_id
,
instance
,
message_p
);
}
int
sctp_itti_send_new_message_ind
(
task_id_t
task_id
,
uint32_t
assoc_id
,
uint8_t
*
buffer
,
uint32_t
buffer_length
,
uint16_t
stream
)
{
...
...
openair3/SCTP/sctp_eNB_itti_messaging.h
View file @
7e98a9e7
...
...
@@ -22,6 +22,8 @@
#ifndef SCTP_ITTI_MESSAGING_H_
#define SCTP_ITTI_MESSAGING_H_
int
sctp_itti_send_init_msg_multi_cnf
(
task_id_t
task_id
,
instance_t
instance
,
int
multi_sd
);
int
sctp_itti_send_new_message_ind
(
task_id_t
task_id
,
uint32_t
assoc_id
,
uint8_t
*
buffer
,
uint32_t
buffer_length
,
uint16_t
stream
);
...
...
openair3/SCTP/sctp_eNB_task.c
View file @
7e98a9e7
This diff is collapsed.
Click to expand it.
targets/COMMON/create_tasks.c
View file @
7e98a9e7
...
...
@@ -27,6 +27,7 @@
# ifdef OPENAIR2
# if defined(ENABLE_USE_MME)
# include "sctp_eNB_task.h"
# include "x2ap_eNB.h"
# include "s1ap_eNB.h"
# include "nas_ue_task.h"
# include "udp_eNB_task.h"
...
...
@@ -64,6 +65,11 @@ int create_tasks(uint32_t enb_nb)
# if defined(ENABLE_USE_MME)
if
(
EPC_MODE_ENABLED
)
{
if
(
enb_nb
>
0
)
{
if
(
itti_create_task
(
TASK_X2AP
,
x2ap_task
,
NULL
)
<
0
)
{
LOG_E
(
X2AP
,
"Create task for X2AP failed
\n
"
);
return
-
1
;
}
if
(
itti_create_task
(
TASK_SCTP
,
sctp_eNB_task
,
NULL
)
<
0
)
{
LOG_E
(
SCTP
,
"Create task for SCTP failed
\n
"
);
return
-
1
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment