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
lizhongxiao
OpenXG UE
Commits
af3557a4
Commit
af3557a4
authored
Mar 12, 2021
by
Remi Hardy
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/s1_subnormal' into integration_2021_wk10
parents
f1f91743
4b25cb7f
Changes
23
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
23 changed files
with
988 additions
and
183 deletions
+988
-183
openair2/COMMON/s1ap_messages_types.h
openair2/COMMON/s1ap_messages_types.h
+5
-0
openair2/ENB_APP/enb_config.c
openair2/ENB_APP/enb_config.c
+59
-0
openair2/ENB_APP/enb_paramdef.h
openair2/ENB_APP/enb_paramdef.h
+15
-0
openair2/RRC/LTE/rrc_eNB_S1AP.c
openair2/RRC/LTE/rrc_eNB_S1AP.c
+24
-8
openair2/X2AP/x2ap_eNB_handler.c
openair2/X2AP/x2ap_eNB_handler.c
+34
-1
openair3/GTPV1-U/gtpv1u_eNB.c
openair3/GTPV1-U/gtpv1u_eNB.c
+1
-1
openair3/NAS/COMMON/EMM/MSG/AttachAccept.c
openair3/NAS/COMMON/EMM/MSG/AttachAccept.c
+0
-1
openair3/NAS/COMMON/IES/SupportedCodecList.c
openair3/NAS/COMMON/IES/SupportedCodecList.c
+4
-0
openair3/NAS/UE/EMM/SAP/emm_as.c
openair3/NAS/UE/EMM/SAP/emm_as.c
+2
-2
openair3/NAS/UE/EMM/SecurityModeControl.c
openair3/NAS/UE/EMM/SecurityModeControl.c
+7
-7
openair3/S1AP/s1ap_common.h
openair3/S1AP/s1ap_common.h
+6
-1
openair3/S1AP/s1ap_eNB.c
openair3/S1AP/s1ap_eNB.c
+353
-68
openair3/S1AP/s1ap_eNB.h
openair3/S1AP/s1ap_eNB.h
+17
-0
openair3/S1AP/s1ap_eNB_decoder.c
openair3/S1AP/s1ap_eNB_decoder.c
+0
-2
openair3/S1AP/s1ap_eNB_defs.h
openair3/S1AP/s1ap_eNB_defs.h
+14
-0
openair3/S1AP/s1ap_eNB_handlers.c
openair3/S1AP/s1ap_eNB_handlers.c
+310
-55
openair3/S1AP/s1ap_eNB_management_procedures.c
openair3/S1AP/s1ap_eNB_management_procedures.c
+27
-7
openair3/S1AP/s1ap_eNB_nas_procedures.c
openair3/S1AP/s1ap_eNB_nas_procedures.c
+17
-5
openair3/S1AP/s1ap_eNB_nnsf.c
openair3/S1AP/s1ap_eNB_nnsf.c
+66
-16
openair3/S1AP/s1ap_eNB_overload.c
openair3/S1AP/s1ap_eNB_overload.c
+14
-2
openair3/S1AP/s1ap_eNB_trace.c
openair3/S1AP/s1ap_eNB_trace.c
+4
-0
openair3/SCTP/sctp_default_values.h
openair3/SCTP/sctp_default_values.h
+2
-2
openair3/SCTP/sctp_eNB_task.c
openair3/SCTP/sctp_eNB_task.c
+7
-5
No files found.
openair2/COMMON/s1ap_messages_types.h
View file @
af3557a4
...
...
@@ -398,6 +398,11 @@ typedef struct s1ap_register_enb_req_s {
/* Number of SCTP streams used for a mme association */
uint16_t
sctp_in_streams
;
uint16_t
sctp_out_streams
;
uint16_t
s1_setuprsp_wait_timer
;
uint16_t
s1_setupreq_wait_timer
;
uint16_t
s1_setupreq_count
;
uint16_t
sctp_req_timer
;
uint16_t
sctp_req_count
;
}
s1ap_register_enb_req_t
;
//-------------------------------------------------------------------------------------------//
...
...
openair2/ENB_APP/enb_config.c
View file @
af3557a4
...
...
@@ -2429,6 +2429,65 @@ int RCconfig_S1(
"to
\n
"
" tracking_area_code = 1; // no string!!
\n
"
" plmn_list = ( { mcc = 208; mnc = 93; mnc_length = 2; } )
\n
"
);
if
(
*
ENBParamList
.
paramarray
[
k
][
ENB_S1SETUP_RSP_TIMER_IDX
].
uptr
<=
0xffff
)
{
S1AP_REGISTER_ENB_REQ
(
msg_p
).
s1_setuprsp_wait_timer
=
*
ENBParamList
.
paramarray
[
k
][
ENB_S1SETUP_RSP_TIMER_IDX
].
uptr
;
}
else
{
LOG_E
(
S1AP
,
"s1setup_rsp_timer value in conf file is invalid (%d). Default value is set.
\n
"
,
*
ENBParamList
.
paramarray
[
k
][
ENB_S1SETUP_RSP_TIMER_IDX
].
uptr
);
S1AP_REGISTER_ENB_REQ
(
msg_p
).
s1_setuprsp_wait_timer
=
5
;
}
if
(
*
ENBParamList
.
paramarray
[
k
][
ENB_S1SETUP_REQ_TIMER_IDX
].
uptr
<=
0xffff
)
{
S1AP_REGISTER_ENB_REQ
(
msg_p
).
s1_setupreq_wait_timer
=
*
ENBParamList
.
paramarray
[
k
][
ENB_S1SETUP_REQ_TIMER_IDX
].
uptr
;
}
else
{
LOG_E
(
S1AP
,
"s1setup_req_timer value in conf file is invalid (%d). Default value is set.
\n
"
,
*
ENBParamList
.
paramarray
[
k
][
ENB_S1SETUP_REQ_TIMER_IDX
].
uptr
);
S1AP_REGISTER_ENB_REQ
(
msg_p
).
s1_setupreq_wait_timer
=
5
;
}
if
(
*
ENBParamList
.
paramarray
[
k
][
ENB_S1SETUP_REQ_COUNT_IDX
].
uptr
<=
0xffff
)
{
S1AP_REGISTER_ENB_REQ
(
msg_p
).
s1_setupreq_count
=
*
ENBParamList
.
paramarray
[
k
][
ENB_S1SETUP_REQ_COUNT_IDX
].
uptr
;
}
else
{
LOG_E
(
S1AP
,
"s1setup_req_count value in conf file is invalid (%d). Default value is set.
\n
"
,
*
ENBParamList
.
paramarray
[
k
][
ENB_S1SETUP_REQ_COUNT_IDX
].
uptr
);
S1AP_REGISTER_ENB_REQ
(
msg_p
).
s1_setupreq_count
=
0xffff
;
}
if
(
*
ENBParamList
.
paramarray
[
k
][
ENB_SCTP_REQ_TIMER_IDX
].
uptr
<=
0xffff
)
{
S1AP_REGISTER_ENB_REQ
(
msg_p
).
sctp_req_timer
=
*
ENBParamList
.
paramarray
[
k
][
ENB_SCTP_REQ_TIMER_IDX
].
uptr
;
}
else
{
LOG_E
(
S1AP
,
"sctp_req_timer value in conf file is invalid (%d). Default value is set.
\n
"
,
*
ENBParamList
.
paramarray
[
k
][
ENB_SCTP_REQ_TIMER_IDX
].
uptr
);
S1AP_REGISTER_ENB_REQ
(
msg_p
).
sctp_req_timer
=
180
;
}
if
(
*
ENBParamList
.
paramarray
[
k
][
ENB_SCTP_REQ_COUNT_IDX
].
uptr
<=
0xffff
)
{
S1AP_REGISTER_ENB_REQ
(
msg_p
).
sctp_req_count
=
*
ENBParamList
.
paramarray
[
k
][
ENB_SCTP_REQ_COUNT_IDX
].
uptr
;
}
else
{
LOG_E
(
S1AP
,
"sctp_req_count value in conf file is invalid (%d). Default value is set.
\n
"
,
*
ENBParamList
.
paramarray
[
k
][
ENB_SCTP_REQ_COUNT_IDX
].
uptr
);
S1AP_REGISTER_ENB_REQ
(
msg_p
).
sctp_req_count
=
0xffff
;
}
config_getlist
(
&
PLMNParamList
,
PLMNParams
,
sizeof
(
PLMNParams
)
/
sizeof
(
paramdef_t
),
aprefix
);
if
(
PLMNParamList
.
numelt
<
1
||
PLMNParamList
.
numelt
>
6
)
{
...
...
openair2/ENB_APP/enb_paramdef.h
View file @
af3557a4
...
...
@@ -214,6 +214,11 @@ typedef enum {
#define ENB_CONFIG_STRING_X2 "enable_x2"
#define ENB_CONFIG_STRING_ENB_M2 "enable_enb_m2"
#define ENB_CONFIG_STRING_MCE_M2 "enable_mce_m2"
#define ENB_CONFIG_STRING_S1SETUP_RSP_TIMER "s1setup_rsp_timer"
#define ENB_CONFIG_STRING_S1SETUP_REQ_TIMER "s1setup_req_timer"
#define ENB_CONFIG_STRING_S1SETUP_REQ_COUNT "s1setup_req_count"
#define ENB_CONFIG_STRING_SCTP_REQ_TIMER "sctp_req_timer"
#define ENB_CONFIG_STRING_SCTP_REQ_COUNT "sctp_req_count"
/*-----------------------------------------------------------------------------------------------------------------------------------------*/
/* cell configuration parameters */
/* optname helpstr paramflags XXXptr defXXXval type numelt */
...
...
@@ -239,6 +244,11 @@ typedef enum {
{ENB_CONFIG_STRING_X2, NULL, 0, strptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \
{ENB_CONFIG_STRING_ENB_M2, NULL, 0, strptr:NULL, defstrval:"no", TYPE_STRING, 0}, \
{ENB_CONFIG_STRING_MCE_M2, NULL, 0, strptr:NULL, defstrval:"no", TYPE_STRING, 0}, \
{ENB_CONFIG_STRING_S1SETUP_RSP_TIMER, NULL, 0, uptr:NULL, defuintval:5, TYPE_UINT, 0}, \
{ENB_CONFIG_STRING_S1SETUP_REQ_TIMER, NULL, 0, uptr:NULL, defuintval:5, TYPE_UINT, 0}, \
{ENB_CONFIG_STRING_S1SETUP_REQ_COUNT, NULL, 0, uptr:NULL, defuintval:65535, TYPE_UINT, 0}, \
{ENB_CONFIG_STRING_SCTP_REQ_TIMER, NULL, 0, uptr:NULL, defuintval:180, TYPE_UINT, 0}, \
{ENB_CONFIG_STRING_SCTP_REQ_COUNT, NULL, 0, uptr:NULL, defuintval:65535, TYPE_UINT, 0}, \
}
#define ENB_ENB_ID_IDX 0
...
...
@@ -261,6 +271,11 @@ typedef enum {
#define ENB_ENABLE_X2 17
#define ENB_ENABLE_ENB_M2 18
#define ENB_ENABLE_MCE_M2 19
#define ENB_S1SETUP_RSP_TIMER_IDX 20
#define ENB_S1SETUP_REQ_TIMER_IDX 21
#define ENB_S1SETUP_REQ_COUNT_IDX 22
#define ENB_SCTP_REQ_TIMER_IDX 23
#define ENB_SCTP_REQ_COUNT_IDX 24
#define TRACKING_AREA_CODE_OKRANGE {0x0001,0xFFFD}
#define ENBPARAMS_CHECK { \
...
...
openair2/RRC/LTE/rrc_eNB_S1AP.c
View file @
af3557a4
...
...
@@ -782,21 +782,37 @@ rrc_eNB_send_S1AP_NAS_FIRST_REQ(
S1AP_NAS_FIRST_REQ
(
message_p
).
ue_identity
.
presenceMask
|=
UE_IDENTITIES_gummei
;
if
(
r_mme
->
plmn_Identity
!=
NULL
)
{
if
((
r_mme
->
plmn_Identity
->
mcc
!=
NULL
)
&&
(
r_mme
->
plmn_Identity
->
mcc
->
list
.
count
>
0
))
{
/* Use first indicated PLMN MCC if it is defined */
S1AP_NAS_FIRST_REQ
(
message_p
).
ue_identity
.
gummei
.
mcc
=
*
r_mme
->
plmn_Identity
->
mcc
->
list
.
array
[
selected_plmn_identity
];
if
((
r_mme
->
plmn_Identity
->
mcc
!=
NULL
)
&&
(
r_mme
->
plmn_Identity
->
mcc
->
list
.
count
==
3
))
{
S1AP_NAS_FIRST_REQ
(
message_p
).
ue_identity
.
gummei
.
mcc
=
(
*
r_mme
->
plmn_Identity
->
mcc
->
list
.
array
[
0
]
&
0xf
)
*
100
+
(
*
r_mme
->
plmn_Identity
->
mcc
->
list
.
array
[
1
]
&
0xf
)
*
10
+
(
*
r_mme
->
plmn_Identity
->
mcc
->
list
.
array
[
2
]
&
0xf
);
LOG_I
(
S1AP
,
"[eNB %d] Build S1AP_NAS_FIRST_REQ adding in s_TMSI: GUMMEI MCC %u ue %x
\n
"
,
ctxt_pP
->
module_id
,
S1AP_NAS_FIRST_REQ
(
message_p
).
ue_identity
.
gummei
.
mcc
,
ue_context_pP
->
ue_context
.
rnti
);
}
if
(
r_mme
->
plmn_Identity
->
mnc
.
list
.
count
>
0
)
{
/* Use first indicated PLMN MNC if it is defined */
S1AP_NAS_FIRST_REQ
(
message_p
).
ue_identity
.
gummei
.
mnc
=
*
r_mme
->
plmn_Identity
->
mnc
.
list
.
array
[
selected_plmn_identity
];
LOG_I
(
S1AP
,
"[eNB %d] Build S1AP_NAS_FIRST_REQ adding in s_TMSI: GUMMEI MNC %u ue %x
\n
"
,
if
(
r_mme
->
plmn_Identity
->
mnc
.
list
.
count
==
3
)
{
S1AP_NAS_FIRST_REQ
(
message_p
).
ue_identity
.
gummei
.
mnc
=
(
*
r_mme
->
plmn_Identity
->
mnc
.
list
.
array
[
0
]
&
0xf
)
*
100
+
(
*
r_mme
->
plmn_Identity
->
mnc
.
list
.
array
[
1
]
&
0xf
)
*
10
+
(
*
r_mme
->
plmn_Identity
->
mnc
.
list
.
array
[
2
]
&
0xf
);
S1AP_NAS_FIRST_REQ
(
message_p
).
ue_identity
.
gummei
.
mnc_len
=
3
;
LOG_I
(
S1AP
,
"[eNB %d] Build S1AP_NAS_FIRST_REQ adding in s_TMSI: GUMMEI MNC %u %udigit ue %x
\n
"
,
ctxt_pP
->
module_id
,
S1AP_NAS_FIRST_REQ
(
message_p
).
ue_identity
.
gummei
.
mnc
,
S1AP_NAS_FIRST_REQ
(
message_p
).
ue_identity
.
gummei
.
mnc_len
,
ue_context_pP
->
ue_context
.
rnti
);
}
else
if
(
r_mme
->
plmn_Identity
->
mnc
.
list
.
count
==
2
)
{
S1AP_NAS_FIRST_REQ
(
message_p
).
ue_identity
.
gummei
.
mnc
=
(
*
r_mme
->
plmn_Identity
->
mnc
.
list
.
array
[
0
]
&
0xf
)
*
10
+
(
*
r_mme
->
plmn_Identity
->
mnc
.
list
.
array
[
1
]
&
0xf
);
S1AP_NAS_FIRST_REQ
(
message_p
).
ue_identity
.
gummei
.
mnc_len
=
2
;
LOG_I
(
S1AP
,
"[eNB %d] Build S1AP_NAS_FIRST_REQ adding in s_TMSI: GUMMEI MNC %u %udigit ue %x
\n
"
,
ctxt_pP
->
module_id
,
S1AP_NAS_FIRST_REQ
(
message_p
).
ue_identity
.
gummei
.
mnc
,
S1AP_NAS_FIRST_REQ
(
message_p
).
ue_identity
.
gummei
.
mnc_len
,
ue_context_pP
->
ue_context
.
rnti
);
}
}
else
{
// end if plmn_Identity != NULL
...
...
openair2/X2AP/x2ap_eNB_handler.c
View file @
af3557a4
...
...
@@ -536,6 +536,14 @@ int x2ap_eNB_handle_x2_setup_response(instance_t instance,
return
-
1
;
}
if
((
x2ap_eNB_data
->
state
==
X2AP_ENB_STATE_CONNECTED
)
||
(
x2ap_eNB_data
->
state
==
X2AP_ENB_STATE_READY
))
{
X2AP_ERROR
(
"Received Unexpexted X2 Setup Response Message
\n
"
);
return
-
1
;
}
X2AP_DEBUG
(
"Received a new X2 setup response
\n
"
);
X2AP_FIND_PROTOCOLIE_BY_ID
(
X2AP_X2SetupResponse_IEs_t
,
ie
,
x2SetupResponse
,
...
...
@@ -662,6 +670,14 @@ int x2ap_eNB_handle_x2_setup_failure(instance_t instance,
return
-
1
;
}
if
((
x2ap_eNB_data
->
state
==
X2AP_ENB_STATE_CONNECTED
)
||
(
x2ap_eNB_data
->
state
==
X2AP_ENB_STATE_READY
))
{
X2AP_ERROR
(
"Received Unexpexted X2 Setup Failure Message
\n
"
);
return
-
1
;
}
X2AP_DEBUG
(
"Received a new X2 setup failure
\n
"
);
X2AP_FIND_PROTOCOLIE_BY_ID
(
X2AP_X2SetupFailure_IEs_t
,
ie
,
x2SetupFailure
,
...
...
@@ -730,6 +746,7 @@ int x2ap_eNB_handle_handover_preparation (instance_t instance,
X2AP_ProtocolIE_ID_id_Old_eNB_UE_X2AP_ID
,
true
);
if
(
ie
==
NULL
)
{
X2AP_ERROR
(
"%s %d: ie is a NULL pointer
\n
"
,
__FILE__
,
__LINE__
);
itti_free
(
ITTI_MSG_ORIGIN_ID
(
msg
),
msg
);
return
-
1
;
}
...
...
@@ -750,7 +767,11 @@ int x2ap_eNB_handle_handover_preparation (instance_t instance,
//measResultListEUTRA.list.array[ncell_index]->physCellId;
X2AP_FIND_PROTOCOLIE_BY_ID
(
X2AP_HandoverRequest_IEs_t
,
ie
,
x2HandoverRequest
,
X2AP_ProtocolIE_ID_id_GUMMEI_ID
,
true
);
if
(
ie
==
NULL
)
{
X2AP_ERROR
(
"%s %d: ie is a NULL pointer
\n
"
,
__FILE__
,
__LINE__
);
itti_free
(
ITTI_MSG_ORIGIN_ID
(
msg
),
msg
);
return
-
1
;
}
TBCD_TO_MCC_MNC
(
&
ie
->
value
.
choice
.
ECGI
.
pLMN_Identity
,
X2AP_HANDOVER_REQ
(
msg
).
ue_gummei
.
mcc
,
X2AP_HANDOVER_REQ
(
msg
).
ue_gummei
.
mnc
,
X2AP_HANDOVER_REQ
(
msg
).
ue_gummei
.
mnc_len
);
OCTET_STRING_TO_INT8
(
&
ie
->
value
.
choice
.
GUMMEI
.
mME_Code
,
X2AP_HANDOVER_REQ
(
msg
).
ue_gummei
.
mme_code
);
...
...
@@ -761,6 +782,7 @@ int x2ap_eNB_handle_handover_preparation (instance_t instance,
if
(
ie
==
NULL
)
{
X2AP_ERROR
(
"%s %d: ie is a NULL pointer
\n
"
,
__FILE__
,
__LINE__
);
itti_free
(
ITTI_MSG_ORIGIN_ID
(
msg
),
msg
);
return
-
1
;
}
...
...
@@ -872,6 +894,7 @@ int x2ap_eNB_handle_handover_response (instance_t instance,
if
(
ie
==
NULL
)
{
X2AP_ERROR
(
"%s %d: ie is a NULL pointer
\n
"
,
__FILE__
,
__LINE__
);
itti_free
(
ITTI_MSG_ORIGIN_ID
(
msg
),
msg
);
return
-
1
;
}
...
...
@@ -882,6 +905,7 @@ int x2ap_eNB_handle_handover_response (instance_t instance,
if
(
ie
==
NULL
)
{
X2AP_ERROR
(
"%s %d: ie is a NULL pointer
\n
"
,
__FILE__
,
__LINE__
);
itti_free
(
ITTI_MSG_ORIGIN_ID
(
msg
),
msg
);
return
-
1
;
}
...
...
@@ -912,6 +936,7 @@ int x2ap_eNB_handle_handover_response (instance_t instance,
if
(
ie
==
NULL
)
{
X2AP_ERROR
(
"%s %d: ie is a NULL pointer
\n
"
,
__FILE__
,
__LINE__
);
itti_free
(
ITTI_MSG_ORIGIN_ID
(
msg
),
msg
);
return
-
1
;
}
else
{
if
(
ie
->
value
.
choice
.
E_RABs_Admitted_List
.
list
.
count
>
0
)
{
...
...
@@ -959,6 +984,12 @@ int x2ap_eNB_handle_handover_response (instance_t instance,
X2AP_FIND_PROTOCOLIE_BY_ID
(
X2AP_HandoverRequestAcknowledge_IEs_t
,
ie
,
x2HandoverRequestAck
,
X2AP_ProtocolIE_ID_id_TargeteNBtoSource_eNBTransparentContainer
,
true
);
if
(
ie
==
NULL
)
{
X2AP_ERROR
(
"%s %d: ie is a NULL pointer
\n
"
,
__FILE__
,
__LINE__
);
itti_free
(
ITTI_MSG_ORIGIN_ID
(
msg
),
msg
);
return
-
1
;
}
X2AP_TargeteNBtoSource_eNBTransparentContainer_t
*
c
=
&
ie
->
value
.
choice
.
TargeteNBtoSource_eNBTransparentContainer
;
if
(
c
->
size
>
1024
/* TODO: this is the size of rrc_buffer in struct x2ap_handover_req_ack_s */
)
...
...
@@ -1012,6 +1043,7 @@ int x2ap_eNB_handle_ue_context_release (instance_t instance,
if
(
ie
==
NULL
)
{
X2AP_ERROR
(
"%s %d: ie is a NULL pointer
\n
"
,
__FILE__
,
__LINE__
);
itti_free
(
ITTI_MSG_ORIGIN_ID
(
msg
),
msg
);
return
-
1
;
}
...
...
@@ -1022,6 +1054,7 @@ int x2ap_eNB_handle_ue_context_release (instance_t instance,
if
(
ie
==
NULL
)
{
X2AP_ERROR
(
"%s %d: ie is a NULL pointer
\n
"
,
__FILE__
,
__LINE__
);
itti_free
(
ITTI_MSG_ORIGIN_ID
(
msg
),
msg
);
return
-
1
;
}
...
...
openair3/GTPV1-U/gtpv1u_eNB.c
View file @
af3557a4
...
...
@@ -1211,7 +1211,7 @@ int gtpv1u_eNB_init(void) {
//gtpv1u_data_g.udp_data;
RC
.
gtpv1u_data_g
->
seq_num
=
0
;
RC
.
gtpv1u_data_g
->
restart_counter
=
0
;
RC
.
gtpv1u_data_g
->
enb_ip_address_for_S1u_S12_S4_up
=
0
;
/* Initializing GTPv1-U stack */
if
((
rc
=
nwGtpv1uInitialize
(
&
RC
.
gtpv1u_data_g
->
gtpv1u_stack
,
GTPU_STACK_ENB
))
!=
NW_GTPV1U_OK
)
{
LOG_E
(
GTPU
,
"Failed to setup nwGtpv1u stack %x
\n
"
,
rc
);
...
...
openair3/NAS/COMMON/EMM/MSG/AttachAccept.c
View file @
af3557a4
...
...
@@ -190,7 +190,6 @@ int decode_attach_accept(attach_accept_msg *attach_accept, uint8_t *buffer, uint
default:
errorCodeDecoder
=
TLV_DECODE_UNEXPECTED_IEI
;
LOG_TRACE
(
WARNING
,
"DECODE_UNEXPECTED_IEI %x (4 bits)"
,
ieiDecoded
);
AssertFatal
(
0
,
" "
);
return
TLV_DECODE_UNEXPECTED_IEI
;
}
}
...
...
openair3/NAS/COMMON/IES/SupportedCodecList.c
View file @
af3557a4
...
...
@@ -43,13 +43,17 @@ int decode_supported_codec_list(SupportedCodecList *supportedcodeclist, uint8_t
CHECK_LENGTH_DECODER
(
len
-
decoded
,
ielen
);
supportedcodeclist
->
systemidentification
=
*
(
buffer
+
decoded
);
decoded
++
;
ielen
--
;
supportedcodeclist
->
lengthofbitmap
=
*
(
buffer
+
decoded
);
decoded
++
;
ielen
--
;
//IES_DECODE_U16(supportedcodeclist->codecbitmap, *(buffer + decoded));
IES_DECODE_U16
(
buffer
,
decoded
,
supportedcodeclist
->
codecbitmap
);
ielen
=
ielen
-
2
;
#if defined (NAS_DEBUG)
dump_supported_codec_list_xml
(
supportedcodeclist
,
iei
);
#endif
decoded
=
decoded
+
ielen
;
return
decoded
;
}
int
encode_supported_codec_list
(
SupportedCodecList
*
supportedcodeclist
,
uint8_t
iei
,
uint8_t
*
buffer
,
uint32_t
len
)
...
...
openair3/NAS/UE/EMM/SAP/emm_as.c
View file @
af3557a4
...
...
@@ -443,14 +443,14 @@ static int _emm_as_data_ind(nas_user_t *user, const emm_as_data_t *msg, int *emm
EPS_MOBILITY_MANAGEMENT_MESSAGE
)
{
/* Process EMM data */
rc
=
_emm_as_recv
(
user
,
plain_msg
,
bytes
,
emm_cause
);
free
(
plain_msg
);
}
else
if
(
header
.
protocol_discriminator
==
EPS_SESSION_MANAGEMENT_MESSAGE
)
{
const
OctetString
data
=
{
bytes
,
(
uint8_t
*
)
plain_msg
};
/* Foward ESM data to EPS session management */
rc
=
lowerlayer_data_ind
(
user
,
&
data
);
free
(
plain_msg
);
}
free
(
plain_msg
);
}
}
else
{
/* Process successfull lower layer transfer indication */
...
...
openair3/NAS/UE/EMM/SecurityModeControl.c
View file @
af3557a4
...
...
@@ -296,16 +296,16 @@ int emm_proc_security_mode_command(nas_user_t *user, int native_ksi, int ksi,
else
{
/* Setup EMM cause code */
emm_cause
=
EMM_CAUSE_SECURITY_MODE_REJECTED
;
/* Release security mode control internal data */
if
(
security_data
->
kenb
.
value
)
{
free
(
security_data
->
kenb
.
value
);
security_data
->
kenb
.
value
=
NULL
;
security_data
->
kenb
.
length
=
0
;
}
}
}
/* Release security mode control internal data */
if
(
security_data
->
kenb
.
value
)
{
free
(
security_data
->
kenb
.
value
);
security_data
->
kenb
.
value
=
NULL
;
security_data
->
kenb
.
length
=
0
;
}
/* Setup EMM procedure handler to be executed upon receiving
* lower layer notification */
rc
=
emm_proc_lowerlayer_initialize
(
user
->
lowerlayer_data
,
NULL
,
NULL
,
NULL
,
NULL
);
...
...
openair3/S1AP/s1ap_common.h
View file @
af3557a4
...
...
@@ -106,7 +106,12 @@ extern int asn1_xer_print;
if (ie == NULL ) { \
S1AP_ERROR("S1AP_FIND_PROTOCOLIE_BY_ID: %s %d: ie is NULL\n",__FILE__,__LINE__);\
} \
if (mandatory) DevAssert(ie != NULL); \
if (mandatory) { \
if (ie == NULL) { \
S1AP_ERROR("S1AP_FIND_PROTOCOLIE_BY_ID: %s %d: ie is NULL\n",__FILE__,__LINE__);\
return -1; \
} \
} \
} while(0)
/** \brief Function callback prototype.
**/
...
...
openair3/S1AP/s1ap_eNB.c
View file @
af3557a4
This diff is collapsed.
Click to expand it.
openair3/S1AP/s1ap_eNB.h
View file @
af3557a4
...
...
@@ -30,6 +30,22 @@
#ifndef S1AP_ENB_H_
#define S1AP_ENB_H_
#define S1AP_MMEIND 0x80000000
#define S1AP_UEIND 0x00000000
#define S1_SETRSP_WAIT 0x00010000
#define S1_SETREQ_WAIT 0x00020000
#define SCTP_REQ_WAIT 0x00030000
#define S1AP_LINEIND 0x0000ffff
#define S1AP_TIMERIND 0x00ff0000
#define S1AP_TIMERID_INIT 0xffffffffffffffff
typedef
enum
s1ap_timer_type_s
{
S1AP_TIMER_PERIODIC
,
S1AP_TIMER_ONE_SHOT
,
S1AP_TIMER_TYPE_MAX
,
}
s1ap_timer_type_t
;
typedef
struct
s1ap_eNB_config_s
{
// MME related params
unsigned
char
mme_enabled
;
///< MME enabled ?
...
...
@@ -43,6 +59,7 @@ void *s1ap_eNB_process_itti_msg(void*);
void
s1ap_eNB_init
(
void
);
void
*
s1ap_eNB_task
(
void
*
arg
);
int
s1ap_timer_remove
(
long
timer_id
);
uint32_t
s1ap_generate_eNB_id
(
void
);
#endif
/* S1AP_ENB_H_ */
...
...
openair3/S1AP/s1ap_eNB_decoder.c
View file @
af3557a4
...
...
@@ -89,8 +89,6 @@ static int s1ap_eNB_decode_initiating_message(S1AP_S1AP_PDU_t *pdu) {
default:
S1AP_ERROR
(
"Unknown procedure ID (%d) for initiating message
\n
"
,
(
int
)
pdu
->
choice
.
initiatingMessage
.
procedureCode
);
AssertFatal
(
0
,
"Unknown procedure ID (%d) for initiating message
\n
"
,
(
int
)
pdu
->
choice
.
initiatingMessage
.
procedureCode
);
return
-
1
;
}
...
...
openair3/S1AP/s1ap_eNB_defs.h
View file @
af3557a4
...
...
@@ -165,6 +165,12 @@ typedef struct s1ap_eNB_mme_data_s {
/* Only meaningfull in virtual mode */
struct
s1ap_eNB_instance_s
*
s1ap_eNB_instance
;
uint32_t
nb_calls
;
net_ip_address_t
mme_ip_address
;
long
timer_id
;
uint16_t
s1_setupreq_cnt
;
uint16_t
sctp_req_cnt
;
}
s1ap_eNB_mme_data_t
;
typedef
struct
s1ap_eNB_instance_s
{
...
...
@@ -217,6 +223,14 @@ typedef struct s1ap_eNB_instance_s {
/* Default Paging DRX of the eNB as defined in TS 36.304 */
paging_drx_t
default_drx
;
net_ip_address_t
enb_ip_address
;
uint16_t
s1_setuprsp_wait_timer
;
uint16_t
s1_setupreq_wait_timer
;
uint16_t
s1_setupreq_count
;
uint16_t
sctp_req_timer
;
uint16_t
sctp_req_count
;
uint16_t
sctp_in_streams
;
uint16_t
sctp_out_streams
;
}
s1ap_eNB_instance_t
;
typedef
struct
{
...
...
openair3/S1AP/s1ap_eNB_handlers.c
View file @
af3557a4
This diff is collapsed.
Click to expand it.
openair3/S1AP/s1ap_eNB_management_procedures.c
View file @
af3557a4
...
...
@@ -95,23 +95,43 @@ struct s1ap_eNB_mme_data_s *s1ap_eNB_get_MME(
{
struct
s1ap_eNB_mme_data_s
temp
;
struct
s1ap_eNB_mme_data_s
*
found
;
struct
s1ap_eNB_mme_data_s
*
mme_p
;
memset
(
&
temp
,
0
,
sizeof
(
struct
s1ap_eNB_mme_data_s
));
temp
.
assoc_id
=
assoc_id
;
temp
.
cnx_id
=
cnx_id
;
if
(
instance_p
==
NULL
)
{
STAILQ_FOREACH
(
instance_p
,
&
s1ap_eNB_internal_data
.
s1ap_eNB_instances_head
,
s1ap_eNB_entries
)
{
found
=
RB_FIND
(
s1ap_mme_map
,
&
instance_p
->
s1ap_mme_head
,
&
temp
);
if
(
cnx_id
!=
0
)
{
if
(
instance_p
==
NULL
)
{
STAILQ_FOREACH
(
instance_p
,
&
s1ap_eNB_internal_data
.
s1ap_eNB_instances_head
,
s1ap_eNB_entries
)
{
found
=
RB_FIND
(
s1ap_mme_map
,
&
instance_p
->
s1ap_mme_head
,
&
temp
);
if
(
found
!=
NULL
)
{
return
found
;
if
(
found
!=
NULL
)
{
return
found
;
}
}
}
else
{
return
RB_FIND
(
s1ap_mme_map
,
&
instance_p
->
s1ap_mme_head
,
&
temp
);
}
}
else
{
return
RB_FIND
(
s1ap_mme_map
,
&
instance_p
->
s1ap_mme_head
,
&
temp
);
if
(
instance_p
==
NULL
)
{
STAILQ_FOREACH
(
instance_p
,
&
s1ap_eNB_internal_data
.
s1ap_eNB_instances_head
,
s1ap_eNB_entries
)
{
RB_FOREACH
(
mme_p
,
s1ap_mme_map
,
&
instance_p
->
s1ap_mme_head
)
{
if
(
mme_p
->
assoc_id
==
assoc_id
)
{
return
mme_p
;
}
}
}
}
else
{
RB_FOREACH
(
mme_p
,
s1ap_mme_map
,
&
instance_p
->
s1ap_mme_head
)
{
if
(
mme_p
->
assoc_id
==
assoc_id
)
{
return
mme_p
;
}
}
}
}
return
NULL
;
...
...
openair3/S1AP/s1ap_eNB_nas_procedures.c
View file @
af3557a4
...
...
@@ -138,8 +138,8 @@ int s1ap_eNB_handle_nas_first_req(
* identity, selects the MME with the highest capacity.
*/
mme_desc_p
=
s1ap_eNB_nnsf_select_mme
(
instance_p
,
s1ap_nas_first_req_p
->
establishment_cause
);
instance_p
,
s1ap_nas_first_req_p
->
establishment_cause
);
if
(
mme_desc_p
)
{
S1AP_INFO
(
"[eNB %ld] Chose MME '%s' (assoc_id %d) through highest relative capacity
\n
"
,
...
...
@@ -358,10 +358,18 @@ int s1ap_eNB_handle_nas_downlink(uint32_t assoc_id,
container
=
&
pdu
->
choice
.
initiatingMessage
.
value
.
choice
.
DownlinkNASTransport
;
S1AP_FIND_PROTOCOLIE_BY_ID
(
S1AP_DownlinkNASTransport_IEs_t
,
ie
,
container
,
S1AP_ProtocolIE_ID_id_MME_UE_S1AP_ID
,
true
);
if
(
ie
==
NULL
)
{
return
-
1
;
}
mme_ue_s1ap_id
=
ie
->
value
.
choice
.
MME_UE_S1AP_ID
;
S1AP_FIND_PROTOCOLIE_BY_ID
(
S1AP_DownlinkNASTransport_IEs_t
,
ie
,
container
,
S1AP_ProtocolIE_ID_id_eNB_UE_S1AP_ID
,
true
);
if
(
ie
==
NULL
)
{
return
-
1
;
}
enb_ue_s1ap_id
=
ie
->
value
.
choice
.
ENB_UE_S1AP_ID
;
if
((
ue_desc_p
=
s1ap_eNB_get_ue_context
(
s1ap_eNB_instance
,
...
...
@@ -416,6 +424,10 @@ int s1ap_eNB_handle_nas_downlink(uint32_t assoc_id,
S1AP_FIND_PROTOCOLIE_BY_ID
(
S1AP_DownlinkNASTransport_IEs_t
,
ie
,
container
,
S1AP_ProtocolIE_ID_id_NAS_PDU
,
true
);
if
(
ie
==
NULL
)
{
return
-
1
;
}
/* Forward the NAS PDU to RRC */
s1ap_eNB_itti_send_nas_downlink_ind
(
s1ap_eNB_instance
->
instance
,
ue_desc_p
->
ue_initial_id
,
...
...
@@ -494,9 +506,9 @@ int s1ap_eNB_nas_uplink(instance_t instance, s1ap_uplink_nas_t *s1ap_uplink_nas_
ie
->
criticality
=
S1AP_Criticality_ignore
;
ie
->
value
.
present
=
S1AP_UplinkNASTransport_IEs__value_PR_EUTRAN_CGI
;
MCC_MNC_TO_PLMNID
(
s1ap_eNB_instance_p
->
mcc
[
ue_context_p
->
selected_plmn_identity
],
s1ap_eNB_instance_p
->
mnc
[
ue_context_p
->
selected_plmn_identity
],
s1ap_eNB_instance_p
->
mnc_digit_length
[
ue_context_p
->
selected_plmn_identity
],
s1ap_eNB_instance_p
->
mcc
[
ue_context_p
->
mme_ref
->
broadcast_plmn_index
[
0
]
],
s1ap_eNB_instance_p
->
mnc
[
ue_context_p
->
mme_ref
->
broadcast_plmn_index
[
0
]
],
s1ap_eNB_instance_p
->
mnc_digit_length
[
ue_context_p
->
mme_ref
->
broadcast_plmn_index
[
0
]
],
&
ie
->
value
.
choice
.
EUTRAN_CGI
.
pLMNidentity
);
//#warning "TODO get cell id from RRC"
MACRO_ENB_ID_TO_CELL_IDENTITY
(
s1ap_eNB_instance_p
->
eNB_id
,
...
...
openair3/S1AP/s1ap_eNB_nnsf.c
View file @
af3557a4
...
...
@@ -36,15 +36,29 @@
#include "s1ap_eNB_defs.h"
#include "s1ap_eNB_nnsf.h"
typedef
struct
MME_nnsf_inf
{
struct
s1ap_eNB_mme_data_s
*
mme_p
;
uint64_t
weight
;
}
MME_nnsf_inf_t
;
struct
s1ap_eNB_mme_data_s
*
s1ap_eNB_nnsf_select_mme
(
s1ap_eNB_instance_t
*
instance_p
,
rrc_establishment_cause_t
cause
)
{
struct
s1ap_eNB_mme_data_s
*
mme_data_p
=
NULL
;
struct
s1ap_eNB_mme_data_s
*
mme_highest_capacity_p
=
NULL
;
uint8_t
current_capacity
=
0
;
uint16_t
capacity_sum
=
0
;
MME_nnsf_inf_t
mme_inf
[
10
];
int
cnt
;
int
nb_mme
=
0
;
uint64_t
weight
=
0
;
memset
(
mme_inf
,
0
,
sizeof
(
mme_inf
));
RB_FOREACH
(
mme_data_p
,
s1ap_mme_map
,
&
instance_p
->
s1ap_mme_head
)
{
capacity_sum
=
capacity_sum
+
mme_data_p
->
relative_mme_capacity
;
if
(
mme_data_p
->
state
!=
S1AP_ENB_STATE_CONNECTED
)
{
/* The association between MME and eNB is not ready for the moment,
* go to the next known MME.
...
...
@@ -69,7 +83,8 @@ s1ap_eNB_nnsf_select_mme(s1ap_eNB_instance_t *instance_p,
||
(
cause
==
RRC_CAUSE_HIGH_PRIO_ACCESS
)))
{
continue
;
}
mme_inf
[
nb_mme
].
mme_p
=
mme_data_p
;
nb_mme
++
;
/* At this point, the RRC establishment can be handled by the MME
* even if it is in overload state.
*/
...
...
@@ -78,14 +93,27 @@ s1ap_eNB_nnsf_select_mme(s1ap_eNB_instance_t *instance_p,
continue
;
}
}
if
(
current_capacity
<
mme_data_p
->
relative_mme_capacity
)
{
/* We find a better MME, keep a reference to it */
current_capacity
=
mme_data_p
->
relative_mme_capacity
;
mme_highest_capacity_p
=
mme_data_p
;
}
if
(
nb_mme
!=
0
)
{
for
(
cnt
=
0
;
cnt
<
nb_mme
;
cnt
++
)
{
mme_inf
[
cnt
].
weight
=
(
capacity_sum
*
10
)
/
mme_inf
[
cnt
].
mme_p
->
relative_mme_capacity
;
mme_inf
[
cnt
].
weight
=
(
mme_inf
[
cnt
].
weight
)
*
(
mme_inf
[
cnt
].
mme_p
->
nb_calls
+
1
);
}
mme_highest_capacity_p
=
mme_inf
[
0
].
mme_p
;
weight
=
mme_inf
[
0
].
weight
;
for
(
cnt
=
1
;
cnt
<
nb_mme
;
cnt
++
)
{
if
(
weight
>
mme_inf
[
cnt
].
weight
)
{
mme_highest_capacity_p
=
mme_inf
[
cnt
].
mme_p
;
weight
=
mme_inf
[
cnt
].
weight
;
}
}
}
else
{
mme_highest_capacity_p
=
NULL
;
}
if
(
mme_highest_capacity_p
!=
NULL
)
{
mme_highest_capacity_p
->
nb_calls
++
;
}
return
mme_highest_capacity_p
;
}
...
...
@@ -96,8 +124,15 @@ s1ap_eNB_nnsf_select_mme_by_plmn_id(s1ap_eNB_instance_t *instance_p,
{
struct
s1ap_eNB_mme_data_s
*
mme_data_p
=
NULL
;
struct
s1ap_eNB_mme_data_s
*
mme_highest_capacity_p
=
NULL
;
uint8_t
current_capacity
=
0
;
uint16_t
capacity_sum
=
0
;
MME_nnsf_inf_t
mme_inf
[
10
];
int
cnt
;
int
nb_mme
=
0
;
uint64_t
weight
=
0
;
memset
(
mme_inf
,
0
,
sizeof
(
mme_inf
));
RB_FOREACH
(
mme_data_p
,
s1ap_mme_map
,
&
instance_p
->
s1ap_mme_head
)
{
struct
served_gummei_s
*
gummei_p
=
NULL
;
struct
plmn_identity_s
*
served_plmn_p
=
NULL
;
...
...
@@ -140,6 +175,8 @@ s1ap_eNB_nnsf_select_mme_by_plmn_id(s1ap_eNB_instance_t *instance_p,
STAILQ_FOREACH
(
served_plmn_p
,
&
gummei_p
->
served_plmns
,
next
)
{
if
((
served_plmn_p
->
mcc
==
instance_p
->
mcc
[
selected_plmn_identity
])
&&
(
served_plmn_p
->
mnc
==
instance_p
->
mnc
[
selected_plmn_identity
]))
{
mme_inf
[
nb_mme
].
mme_p
=
mme_data_p
;
nb_mme
++
;
break
;
}
}
...
...
@@ -148,14 +185,27 @@ s1ap_eNB_nnsf_select_mme_by_plmn_id(s1ap_eNB_instance_t *instance_p,
}
/* if we didn't find such a served PLMN, go on with the next MME */
if
(
!
served_plmn_p
)
continue
;
}
if
(
current_capacity
<
mme_data_p
->
relative_mme_capacity
)
{
/* We find a better MME, keep a reference to it */
current_capacity
=
mme_data_p
->
relative_mme_capacity
;
mme_highest_capacity_p
=
mme_data_p
;
if
(
nb_mme
!=
0
)
{
for
(
cnt
=
0
;
cnt
<
nb_mme
;
cnt
++
)
{
mme_inf
[
cnt
].
weight
=
(
capacity_sum
*
10
)
/
mme_inf
[
cnt
].
mme_p
->
relative_mme_capacity
;
mme_inf
[
cnt
].
weight
=
(
mme_inf
[
cnt
].
weight
)
*
(
mme_inf
[
cnt
].
mme_p
->
nb_calls
+
1
);
}
mme_highest_capacity_p
=
mme_inf
[
0
].
mme_p
;
weight
=
mme_inf
[
0
].
weight
;
for
(
cnt
=
1
;
cnt
<
nb_mme
;
cnt
++
)
{
if
(
weight
>
mme_inf
[
cnt
].
weight
)
{
mme_highest_capacity_p
=
mme_inf
[
cnt
].
mme_p
;
weight
=
mme_inf
[
cnt
].
weight
;
}
}
}
else
{
mme_highest_capacity_p
=
NULL
;
}
if
(
mme_highest_capacity_p
!=
NULL
)
{
mme_highest_capacity_p
->
nb_calls
++
;
}
return
mme_highest_capacity_p
;
}
...
...
openair3/S1AP/s1ap_eNB_overload.c
View file @
af3557a4
...
...
@@ -62,8 +62,16 @@ int s1ap_eNB_handle_overload_start(uint32_t assoc_id,
S1AP_OverloadResponse_PR_overloadAction
,
S1AP_OverloadResponse_PR_overloadAction
,
0
,
0
);
}
else
{
return
-
1
;
}
/* Non UE-associated signalling -> stream 0 */
DevCheck
(
stream
==
0
,
stream
,
0
,
0
);
if
(
stream
!=
0
)
{
S1AP_ERROR
(
"[SCTP %d] Received s1 overload start on stream != 0 (%d)
\n
"
,
assoc_id
,
stream
);
return
-
1
;
}
if
((
mme_desc_p
=
s1ap_eNB_get_MME
(
NULL
,
assoc_id
,
0
))
==
NULL
)
{
/* No MME context associated */
...
...
@@ -93,7 +101,11 @@ int s1ap_eNB_handle_overload_stop(uint32_t assoc_id,
s1ap_eNB_mme_data_t
*
mme_desc_p
;
/* Non UE-associated signalling -> stream 0 */
DevCheck
(
stream
==
0
,
stream
,
0
,
0
);
if
(
stream
!=
0
)
{
S1AP_ERROR
(
"[SCTP %d] Received s1 overload stop on stream != 0 (%d)
\n
"
,
assoc_id
,
stream
);
return
-
1
;
}
if
((
mme_desc_p
=
s1ap_eNB_get_MME
(
NULL
,
assoc_id
,
0
))
==
NULL
)
{
/* No MME context associated */
...
...
openair3/S1AP/s1ap_eNB_trace.c
View file @
af3557a4
...
...
@@ -121,6 +121,10 @@ int s1ap_eNB_handle_trace_start(uint32_t assoc_id,
if
(
ie
!=
NULL
)
{
ue_desc_p
=
s1ap_eNB_get_ue_context
(
mme_ref_p
->
s1ap_eNB_instance
,
ie
->
value
.
choice
.
ENB_UE_S1AP_ID
);
}
else
{
return
-
1
;
}
if
(
ue_desc_p
==
NULL
)
{
/* Could not find context associated with this eNB_ue_s1ap_id -> generate
...
...
openair3/SCTP/sctp_default_values.h
View file @
af3557a4
...
...
@@ -24,8 +24,8 @@
#define SCTP_OUT_STREAMS (16)
#define SCTP_IN_STREAMS (16)
#define SCTP_MAX_ATTEMPTS (
2
)
#define SCTP_TIMEOUT (
5
)
#define SCTP_MAX_ATTEMPTS (
8
)
#define SCTP_TIMEOUT (
60000
)
#define SCTP_RECV_BUFFER_SIZE (8192)
#endif
/* SCTP_DEFAULT_VALUES_H_ */
openair3/SCTP/sctp_eNB_task.c
View file @
af3557a4
...
...
@@ -270,7 +270,7 @@ sctp_handle_new_association_req_multi(
sctp_new_association_req_p
->
remote_address
.
ipv6_address
);
//close(sd);
//return;
exit
(
1
);
exit
_fun
(
"sctp_handle_new_association_req_multi fatal: inet_pton error"
);
}
SCTP_DEBUG
(
"Converted ipv6 address %*s to network type
\n
"
,
...
...
@@ -290,7 +290,7 @@ sctp_handle_new_association_req_multi(
sctp_new_association_req_p
->
remote_address
.
ipv4_address
);
//close(sd);
//return;
exit
(
1
);
exit
_fun
(
"sctp_handle_new_association_req_multi fatal: inet_pton error"
);
}
SCTP_DEBUG
(
"Converted ipv4 address %*s to network type
\n
"
,
...
...
@@ -329,7 +329,7 @@ sctp_handle_new_association_req_multi(
if
(
ns
==
-
1
)
{
perror
(
"sctp_peeloff"
);
printf
(
"sctp_peeloff: sd=%d assoc_id=%d
\n
"
,
sd
,
assoc_id
);
exit
(
1
);
exit
_fun
(
"sctp_handle_new_association_req_multi fatal: sctp_peeloff error"
);
}
sctp_cnx
=
calloc
(
1
,
sizeof
(
*
sctp_cnx
));
...
...
@@ -943,10 +943,12 @@ sctp_eNB_read_from_socket(
&
sinfo
,
&
flags
);
if
(
n
<
0
)
{
if
(
errno
==
ENOTCONN
)
{
if
(
(
errno
==
ENOTCONN
)
||
(
errno
==
ECONNRESET
)
||
(
errno
==
ETIMEDOUT
)
||
(
errno
==
ECONNREFUSED
)
)
{
itti_unsubscribe_event_fd
(
TASK_SCTP
,
sctp_cnx
->
sd
);
SCTP_DEBUG
(
"Received not connected for sd %d
\n
"
,
sctp_cnx
->
sd
);
SCTP_ERROR
(
"sctp_recvmsg (fd %d, len %d ): %s:%d
\n
"
,
sctp_cnx
->
sd
,
n
,
strerror
(
errno
),
errno
);
sctp_itti_send_association_resp
(
sctp_cnx
->
task_id
,
sctp_cnx
->
instance
,
-
1
,
...
...
@@ -969,7 +971,7 @@ sctp_eNB_read_from_socket(
if
(
!
(
flags
&
MSG_EOR
))
{
SCTP_ERROR
(
"fatal: partial SCTP messages are not handled
\n
"
);
exit
(
1
);
exit
_fun
(
"fatal: partial SCTP messages are not handled"
);
}
if
(
flags
&
MSG_NOTIFICATION
)
{
...
...
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