Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
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
zzha zzha
OpenXG-RAN
Commits
7c067095
Commit
7c067095
authored
Jun 25, 2022
by
Sakthivel Velumani
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Populate PDU and DRB paramenters from NGAP
parent
c4ada56a
Changes
8
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
210 additions
and
63 deletions
+210
-63
openair2/COMMON/e1ap_messages_types.h
openair2/COMMON/e1ap_messages_types.h
+7
-2
openair2/COMMON/ngap_messages_types.h
openair2/COMMON/ngap_messages_types.h
+15
-0
openair2/E1AP/e1ap.c
openair2/E1AP/e1ap.c
+20
-7
openair2/E1AP/e1ap_common.c
openair2/E1AP/e1ap_common.c
+11
-0
openair2/E1AP/e1ap_common.h
openair2/E1AP/e1ap_common.h
+2
-0
openair2/RRC/NR/rrc_gNB.c
openair2/RRC/NR/rrc_gNB.c
+4
-1
openair2/RRC/NR/rrc_gNB_NGAP.c
openair2/RRC/NR/rrc_gNB_NGAP.c
+135
-53
openair3/NGAP/ngap_gNB_handlers.c
openair3/NGAP/ngap_gNB_handlers.c
+16
-0
No files found.
openair2/COMMON/e1ap_messages_types.h
View file @
7c067095
...
@@ -27,6 +27,7 @@
...
@@ -27,6 +27,7 @@
#include "E1AP_E1AP-PDU.h"
#include "E1AP_E1AP-PDU.h"
#include "E1AP_TransactionID.h"
#include "E1AP_TransactionID.h"
#include "E1AP_PriorityLevel.h"
#include "E1AP_PriorityLevel.h"
#include "ngap_messages_types.h"
#define E1AP_MAX_NUM_TRANSAC_IDS 4
#define E1AP_MAX_NUM_TRANSAC_IDS 4
#define E1AP_MAX_NUM_PLMNS 4
#define E1AP_MAX_NUM_PLMNS 4
...
@@ -44,7 +45,7 @@
...
@@ -44,7 +45,7 @@
#define E1AP_BEARER_CONTEXT_SETUP_RESP(mSGpTR) (mSGpTR)->ittiMsg.e1ap_bearer_setup_resp
#define E1AP_BEARER_CONTEXT_SETUP_RESP(mSGpTR) (mSGpTR)->ittiMsg.e1ap_bearer_setup_resp
#define E1AP_PORT_NUMBER 25
#define E1AP_PORT_NUMBER 25
#define E1AP_SCTP_PPID 6
3
#define E1AP_SCTP_PPID 6
4
typedef
f1ap_net_ip_address_t
e1ap_net_ip_address_t
;
typedef
f1ap_net_ip_address_t
e1ap_net_ip_address_t
;
...
@@ -101,6 +102,7 @@ typedef struct drb_to_setup_s {
...
@@ -101,6 +102,7 @@ typedef struct drb_to_setup_s {
typedef
struct
qos_flow_to_setup_s
{
typedef
struct
qos_flow_to_setup_s
{
long
id
;
long
id
;
fiveQI_type_t
fiveQI_type
;
long
fiveQI
;
long
fiveQI
;
long
qoSPriorityLevel
;
long
qoSPriorityLevel
;
long
packetDelayBudget
;
long
packetDelayBudget
;
...
@@ -116,6 +118,9 @@ typedef struct DRB_nGRAN_to_setup_s {
...
@@ -116,6 +118,9 @@ typedef struct DRB_nGRAN_to_setup_s {
long
defaultDRB
;
long
defaultDRB
;
long
sDAP_Header_UL
;
long
sDAP_Header_UL
;
long
sDAP_Header_DL
;
long
sDAP_Header_DL
;
long
pDCP_SN_Size_UL
;
long
pDCP_SN_Size_DL
;
long
rLC_Mode
;
int
numCellGroups
;
int
numCellGroups
;
cell_group_t
cellGroupList
[
E1AP_MAX_NUM_CELL_GROUPS
];
cell_group_t
cellGroupList
[
E1AP_MAX_NUM_CELL_GROUPS
];
int
numQosFlow2Setup
;
int
numQosFlow2Setup
;
...
@@ -138,7 +143,7 @@ typedef struct e1ap_bearer_setup_req_s {
...
@@ -138,7 +143,7 @@ typedef struct e1ap_bearer_setup_req_s {
uint64_t
gNB_cu_cp_ue_id
;
uint64_t
gNB_cu_cp_ue_id
;
uint64_t
cipheringAlgorithm
;
uint64_t
cipheringAlgorithm
;
char
encryptionKey
[
128
];
char
encryptionKey
[
128
];
long
b
itRate
;
long
ueDlAggMaxB
itRate
;
PLMN_ID_t
servingPLMNid
;
PLMN_ID_t
servingPLMNid
;
long
activityNotificationLevel
;
long
activityNotificationLevel
;
int
numDRBs
;
int
numDRBs
;
...
...
openair2/COMMON/ngap_messages_types.h
View file @
7c067095
...
@@ -262,9 +262,15 @@ typedef struct ngap_transport_layer_addr_s {
...
@@ -262,9 +262,15 @@ typedef struct ngap_transport_layer_addr_s {
dEST.length = sOURCE.length; \
dEST.length = sOURCE.length; \
} while (0)
} while (0)
typedef
enum
{
non_dynamic
,
dynamic
}
fiveQI_type_t
;
typedef
struct
pdusession_level_qos_parameter_s
{
typedef
struct
pdusession_level_qos_parameter_s
{
uint8_t
qfi
;
uint8_t
qfi
;
uint64_t
fiveQI
;
uint64_t
fiveQI
;
fiveQI_type_t
fiveQI_type
;
ngap_allocation_retention_priority_t
allocation_retention_priority
;
ngap_allocation_retention_priority_t
allocation_retention_priority
;
}
pdusession_level_qos_parameter_t
;
}
pdusession_level_qos_parameter_t
;
...
@@ -692,12 +698,21 @@ typedef struct ngap_pdusession_setup_req_s {
...
@@ -692,12 +698,21 @@ typedef struct ngap_pdusession_setup_req_s {
/* gNB ue ngap id as initialized by NGAP layer */
/* gNB ue ngap id as initialized by NGAP layer */
uint32_t
gNB_ue_ngap_id
;
uint32_t
gNB_ue_ngap_id
;
/* S-NSSAI */
ngap_allowed_NSSAI_t
allowed_nssai
[
8
];
/* Number of pdusession to be setup in the list */
/* Number of pdusession to be setup in the list */
uint8_t
nb_pdusessions_tosetup
;
uint8_t
nb_pdusessions_tosetup
;
/* E RAB setup request */
/* E RAB setup request */
pdusession_t
pdusession_setup_params
[
NGAP_MAX_PDUSESSION
];
pdusession_t
pdusession_setup_params
[
NGAP_MAX_PDUSESSION
];
/* UE Uplink Aggregated Max Bitrates */
uint64_t
ueAggMaxBitRateUplink
;
/* UE Downlink Aggregated Max Bitrates */
uint64_t
ueAggMaxBitRateDownlink
;
}
ngap_pdusession_setup_req_t
;
}
ngap_pdusession_setup_req_t
;
typedef
struct
ngap_pdusession_setup_resp_s
{
typedef
struct
ngap_pdusession_setup_resp_s
{
...
...
openair2/E1AP/e1ap.c
View file @
7c067095
...
@@ -175,6 +175,7 @@ int e1apCUUP_send_SETUP_REQUEST(instance_t instance) {
...
@@ -175,6 +175,7 @@ int e1apCUUP_send_SETUP_REQUEST(instance_t instance) {
ieC1
->
value
.
present
=
E1AP_GNB_CU_UP_E1SetupRequestIEs__value_PR_TransactionID
;
ieC1
->
value
.
present
=
E1AP_GNB_CU_UP_E1SetupRequestIEs__value_PR_TransactionID
;
setup
->
transac_id
=
E1AP_get_next_transaction_identifier
();
setup
->
transac_id
=
E1AP_get_next_transaction_identifier
();
ieC1
->
value
.
choice
.
TransactionID
=
setup
->
transac_id
;
ieC1
->
value
.
choice
.
TransactionID
=
setup
->
transac_id
;
LOG_I
(
E1AP
,
"Transaction ID of setup request %ld
\n
"
,
setup
->
transac_id
);
/* mandatory */
/* mandatory */
/* c2. GNB_CU_ID (integer value) */
/* c2. GNB_CU_ID (integer value) */
asn1cSequenceAdd
(
e1SetupUP
->
protocolIEs
.
list
,
E1AP_GNB_CU_UP_E1SetupRequestIEs_t
,
ieC2
);
asn1cSequenceAdd
(
e1SetupUP
->
protocolIEs
.
list
,
E1AP_GNB_CU_UP_E1SetupRequestIEs_t
,
ieC2
);
...
@@ -341,11 +342,17 @@ int e1apCUUP_handle_SETUP_RESPONSE(instance_t instance,
...
@@ -341,11 +342,17 @@ int e1apCUUP_handle_SETUP_RESPONSE(instance_t instance,
E1AP_GNB_CU_UP_E1SetupResponseIEs_t
*
ie
;
E1AP_GNB_CU_UP_E1SetupResponseIEs_t
*
ie
;
/* transac_id */
/* transac_id */
int
transaction_id
;
long
transaction_id
;
long
old_transaction_id
=
getCxtE1
(
UPtype
,
instance
)
->
setupReq
.
transac_id
;
F1AP_FIND_PROTOCOLIE_BY_ID
(
E1AP_GNB_CU_UP_E1SetupResponseIEs_t
,
ie
,
in
,
F1AP_FIND_PROTOCOLIE_BY_ID
(
E1AP_GNB_CU_UP_E1SetupResponseIEs_t
,
ie
,
in
,
E1AP_ProtocolIE_ID_id_TransactionID
,
true
);
E1AP_ProtocolIE_ID_id_TransactionID
,
true
);
transaction_id
=
ie
->
value
.
choice
.
TransactionID
;
transaction_id
=
ie
->
value
.
choice
.
TransactionID
;
LOG_D
(
E1AP
,
"gNB CU UP E1 setup response transaction ID: %d
\n
"
,
transaction_id
);
LOG_D
(
E1AP
,
"gNB CU UP E1 setup response transaction ID: %ld
\n
"
,
transaction_id
);
if
(
old_transaction_id
!=
transaction_id
)
LOG_E
(
E1AP
,
"Transaction IDs do not match %ld != %ld
\n
"
,
old_transaction_id
,
transaction_id
);
E1AP_free_transaction_identifier
(
transaction_id
);
/* do the required processing */
/* do the required processing */
...
@@ -527,21 +534,23 @@ int e1apCUCP_send_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance,
...
@@ -527,21 +534,23 @@ int e1apCUCP_send_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance,
ieC3
->
id
=
E1AP_ProtocolIE_ID_id_UEDLAggregateMaximumBitRate
;
ieC3
->
id
=
E1AP_ProtocolIE_ID_id_UEDLAggregateMaximumBitRate
;
ieC3
->
criticality
=
E1AP_Criticality_reject
;
ieC3
->
criticality
=
E1AP_Criticality_reject
;
ieC3
->
value
.
present
=
E1AP_BearerContextSetupRequestIEs__value_PR_BitRate
;
ieC3
->
value
.
present
=
E1AP_BearerContextSetupRequestIEs__value_PR_BitRate
;
asn_long2INTEGER
(
&
ieC3
->
value
.
choice
.
BitRate
,
bearerCxt
->
b
itRate
);
asn_long2INTEGER
(
&
ieC3
->
value
.
choice
.
BitRate
,
bearerCxt
->
ueDlAggMaxB
itRate
);
/* mandatory */
/* mandatory */
/* c4. Serving PLMN */
/* c4. Serving PLMN */
asn1cSequenceAdd
(
out
->
protocolIEs
.
list
,
E1AP_BearerContextSetupRequestIEs_t
,
ieC4
);
asn1cSequenceAdd
(
out
->
protocolIEs
.
list
,
E1AP_BearerContextSetupRequestIEs_t
,
ieC4
);
ieC4
->
id
=
E1AP_ProtocolIE_ID_id_Serving_PLMN
;
ieC4
->
id
=
E1AP_ProtocolIE_ID_id_Serving_PLMN
;
ieC4
->
criticality
=
E1AP_Criticality_ignore
;
ieC4
->
criticality
=
E1AP_Criticality_ignore
;
ieC4
->
value
.
present
=
E1AP_BearerContextSetupRequestIEs__value_PR_PLMN_Identity
;
ieC4
->
value
.
present
=
E1AP_BearerContextSetupRequestIEs__value_PR_PLMN_Identity
;
MCC_MNC_TO_PLMNID
(
bearerCxt
->
servingPLMNid
.
mcc
,
bearerCxt
->
servingPLMNid
.
mnc
,
bearerCxt
->
servingPLMNid
.
mnc_digit_length
,
&
ieC4
->
value
.
choice
.
PLMN_Identity
);
e1ap_setup_req_t
*
setup
=
&
getCxtE1
(
CPtype
,
instance
)
->
setupReq
;
PLMN_ID_t
*
servingPLMN
=
setup
->
plmns
;
// First PLMN is serving PLMN. TODO: Remove hard coding here
MCC_MNC_TO_PLMNID
(
servingPLMN
->
mcc
,
servingPLMN
->
mnc
,
servingPLMN
->
mnc_digit_length
,
&
ieC4
->
value
.
choice
.
PLMN_Identity
);
/* mandatory */
/* mandatory */
/* Activity Notification Level */
/* Activity Notification Level */
asn1cSequenceAdd
(
out
->
protocolIEs
.
list
,
E1AP_BearerContextSetupRequestIEs_t
,
ieC5
);
asn1cSequenceAdd
(
out
->
protocolIEs
.
list
,
E1AP_BearerContextSetupRequestIEs_t
,
ieC5
);
ieC5
->
id
=
E1AP_ProtocolIE_ID_id_ActivityNotificationLevel
;
ieC5
->
id
=
E1AP_ProtocolIE_ID_id_ActivityNotificationLevel
;
ieC5
->
criticality
=
E1AP_Criticality_reject
;
ieC5
->
criticality
=
E1AP_Criticality_reject
;
ieC5
->
value
.
present
=
E1AP_BearerContextSetupRequestIEs__value_PR_ActivityNotificationLevel
;
ieC5
->
value
.
present
=
E1AP_BearerContextSetupRequestIEs__value_PR_ActivityNotificationLevel
;
ieC5
->
value
.
choice
.
ActivityNotificationLevel
=
bearerCxt
->
activityNotificationLevel
;
ieC5
->
value
.
choice
.
ActivityNotificationLevel
=
2
;
// TODO: Remove hard coding
/* mandatory */
/* mandatory */
/* */
/* */
asn1cSequenceAdd
(
out
->
protocolIEs
.
list
,
E1AP_BearerContextSetupRequestIEs_t
,
ieC6
);
asn1cSequenceAdd
(
out
->
protocolIEs
.
list
,
E1AP_BearerContextSetupRequestIEs_t
,
ieC6
);
...
@@ -612,6 +621,10 @@ int e1apCUCP_send_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance,
...
@@ -612,6 +621,10 @@ int e1apCUCP_send_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance,
ieC6_1_1
->
sDAP_Configuration
.
sDAP_Header_UL
=
j
->
sDAP_Header_UL
;
ieC6_1_1
->
sDAP_Configuration
.
sDAP_Header_UL
=
j
->
sDAP_Header_UL
;
ieC6_1_1
->
sDAP_Configuration
.
sDAP_Header_DL
=
j
->
sDAP_Header_DL
;
ieC6_1_1
->
sDAP_Configuration
.
sDAP_Header_DL
=
j
->
sDAP_Header_DL
;
ieC6_1_1
->
pDCP_Configuration
.
pDCP_SN_Size_UL
=
j
->
pDCP_SN_Size_UL
;
ieC6_1_1
->
pDCP_Configuration
.
pDCP_SN_Size_DL
=
j
->
pDCP_SN_Size_DL
;
ieC6_1_1
->
pDCP_Configuration
.
rLC_Mode
=
j
->
rLC_Mode
;
for
(
cell_group_t
*
k
=
j
->
cellGroupList
;
k
<
j
->
cellGroupList
+
j
->
numCellGroups
;
k
++
)
{
for
(
cell_group_t
*
k
=
j
->
cellGroupList
;
k
<
j
->
cellGroupList
+
j
->
numCellGroups
;
k
++
)
{
asn1cSequenceAdd
(
ieC6_1_1
->
cell_Group_Information
.
list
,
E1AP_Cell_Group_Information_Item_t
,
ieC6_1_1_1
);
asn1cSequenceAdd
(
ieC6_1_1
->
cell_Group_Information
.
list
,
E1AP_Cell_Group_Information_Item_t
,
ieC6_1_1_1
);
ieC6_1_1_1
->
cell_Group_ID
=
k
->
id
;
ieC6_1_1_1
->
cell_Group_ID
=
k
->
id
;
...
@@ -621,7 +634,7 @@ int e1apCUCP_send_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance,
...
@@ -621,7 +634,7 @@ int e1apCUCP_send_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance,
asn1cSequenceAdd
(
ieC6_1_1
->
qos_flow_Information_To_Be_Setup
,
E1AP_QoS_Flow_QoS_Parameter_Item_t
,
ieC6_1_1_1
);
asn1cSequenceAdd
(
ieC6_1_1
->
qos_flow_Information_To_Be_Setup
,
E1AP_QoS_Flow_QoS_Parameter_Item_t
,
ieC6_1_1_1
);
ieC6_1_1_1
->
qoS_Flow_Identifier
=
k
->
id
;
ieC6_1_1_1
->
qoS_Flow_Identifier
=
k
->
id
;
if
(
0
)
{
// non Dynamic 5QI
if
(
k
->
fiveQI_type
==
non_dynamic
)
{
// non Dynamic 5QI
ieC6_1_1_1
->
qoSFlowLevelQoSParameters
.
qoS_Characteristics
.
present
=
E1AP_QoS_Characteristics_PR_non_Dynamic_5QI
;
ieC6_1_1_1
->
qoSFlowLevelQoSParameters
.
qoS_Characteristics
.
present
=
E1AP_QoS_Characteristics_PR_non_Dynamic_5QI
;
asn1cCalloc
(
ieC6_1_1_1
->
qoSFlowLevelQoSParameters
.
qoS_Characteristics
.
choice
.
non_Dynamic_5QI
,
non_Dynamic_5QI
);
asn1cCalloc
(
ieC6_1_1_1
->
qoSFlowLevelQoSParameters
.
qoS_Characteristics
.
choice
.
non_Dynamic_5QI
,
non_Dynamic_5QI
);
non_Dynamic_5QI
->
fiveQI
=
k
->
fiveQI
;
non_Dynamic_5QI
->
fiveQI
=
k
->
fiveQI
;
...
@@ -825,7 +838,7 @@ int e1apCUUP_handle_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance,
...
@@ -825,7 +838,7 @@ int e1apCUUP_handle_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance,
"ie->criticality != E1AP_Criticality_reject
\n
"
);
"ie->criticality != E1AP_Criticality_reject
\n
"
);
AssertFatal
(
ie
->
value
.
present
==
E1AP_BearerContextSetupRequestIEs__value_PR_BitRate
,
AssertFatal
(
ie
->
value
.
present
==
E1AP_BearerContextSetupRequestIEs__value_PR_BitRate
,
"ie->value.present != E1AP_BearerContextSetupRequestIEs__value_PR_BitRate
\n
"
);
"ie->value.present != E1AP_BearerContextSetupRequestIEs__value_PR_BitRate
\n
"
);
asn_INTEGER2long
(
&
ie
->
value
.
choice
.
BitRate
,
&
bearerCxt
->
b
itRate
);
asn_INTEGER2long
(
&
ie
->
value
.
choice
.
BitRate
,
&
bearerCxt
->
ueDlAggMaxB
itRate
);
break
;
break
;
case
E1AP_ProtocolIE_ID_id_Serving_PLMN
:
case
E1AP_ProtocolIE_ID_id_Serving_PLMN
:
...
...
openair2/E1AP/e1ap_common.c
View file @
7c067095
...
@@ -96,6 +96,17 @@ E1AP_TransactionID_t E1AP_get_next_transaction_identifier() {
...
@@ -96,6 +96,17 @@ E1AP_TransactionID_t E1AP_get_next_transaction_identifier() {
return
genTransacId
;
return
genTransacId
;
}
}
void
E1AP_free_transaction_identifier
(
E1AP_TransactionID_t
id
)
{
for
(
int
i
=
0
;
i
<
E1AP_MAX_NUM_TRANSAC_IDS
;
i
++
)
{
if
(
id
==
transacID
[
i
])
{
transacID
[
i
]
=
0
;
return
;
}
}
LOG_E
(
E1AP
,
"Couldn't find transaction ID %ld in list
\n
"
,
id
);
}
int
e1ap_decode_initiating_message
(
E1AP_E1AP_PDU_t
*
pdu
)
{
int
e1ap_decode_initiating_message
(
E1AP_E1AP_PDU_t
*
pdu
)
{
DevAssert
(
pdu
!=
NULL
);
DevAssert
(
pdu
!=
NULL
);
...
...
openair2/E1AP/e1ap_common.h
View file @
7c067095
...
@@ -41,4 +41,6 @@ int e1ap_assoc_id(E1_t type, instance_t instance);
...
@@ -41,4 +41,6 @@ int e1ap_assoc_id(E1_t type, instance_t instance);
int
e1ap_encode_send
(
E1_t
type
,
instance_t
instance
,
E1AP_E1AP_PDU_t
*
pdu
,
uint16_t
stream
,
const
char
*
func
);
int
e1ap_encode_send
(
E1_t
type
,
instance_t
instance
,
E1AP_E1AP_PDU_t
*
pdu
,
uint16_t
stream
,
const
char
*
func
);
void
e1ap_common_init
();
void
e1ap_common_init
();
void
E1AP_free_transaction_identifier
(
E1AP_TransactionID_t
id
);
#endif
/* E1AP_COMMON_H_ */
#endif
/* E1AP_COMMON_H_ */
openair2/RRC/NR/rrc_gNB.c
View file @
7c067095
...
@@ -3876,7 +3876,7 @@ void nr_rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) {
...
@@ -3876,7 +3876,7 @@ void nr_rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) {
}
}
}
}
void
rrc_gNB_process_e1_setup_req
(
e1ap_setup_req_t
*
req
,
instance_t
instance
)
{
int
rrc_gNB_process_e1_setup_req
(
e1ap_setup_req_t
*
req
,
instance_t
instance
)
{
AssertFatal
(
req
->
supported_plmns
<=
PLMN_LIST_MAX_SIZE
,
"Supported PLMNs is more than PLMN_LIST_MAX_SIZE
\n
"
);
AssertFatal
(
req
->
supported_plmns
<=
PLMN_LIST_MAX_SIZE
,
"Supported PLMNs is more than PLMN_LIST_MAX_SIZE
\n
"
);
gNB_RRC_INST
*
rrc
=
RC
.
nrrrc
[
0
];
//TODO: remove hardcoding of RC index here
gNB_RRC_INST
*
rrc
=
RC
.
nrrrc
[
0
];
//TODO: remove hardcoding of RC index here
...
@@ -3890,10 +3890,13 @@ void rrc_gNB_process_e1_setup_req(e1ap_setup_req_t *req, instance_t instance) {
...
@@ -3890,10 +3890,13 @@ void rrc_gNB_process_e1_setup_req(e1ap_setup_req_t *req, instance_t instance) {
rrc
->
configuration
.
mnc
[
i
]
==
req
->
plmns
[
i
].
mnc
)
{
rrc
->
configuration
.
mnc
[
i
]
==
req
->
plmns
[
i
].
mnc
)
{
LOG_E
(
NR_RRC
,
"PLMNs received from CUUP (mcc:%d, mnc:%d) did not match with PLMNs in RRC (mcc:%d, mnc:%d)
\n
"
,
LOG_E
(
NR_RRC
,
"PLMNs received from CUUP (mcc:%d, mnc:%d) did not match with PLMNs in RRC (mcc:%d, mnc:%d)
\n
"
,
req
->
plmns
[
i
].
mcc
,
req
->
plmns
[
i
].
mnc
,
rrc
->
configuration
.
mcc
[
i
],
rrc
->
configuration
.
mnc
[
i
]);
req
->
plmns
[
i
].
mcc
,
req
->
plmns
[
i
].
mnc
,
rrc
->
configuration
.
mcc
[
i
],
rrc
->
configuration
.
mnc
[
i
]);
return
-
1
;
}
}
}
}
itti_send_msg_to_task
(
TASK_CUCP_E1
,
instance
,
msg_p
);
itti_send_msg_to_task
(
TASK_CUCP_E1
,
instance
,
msg_p
);
return
0
;
}
}
///---------------------------------------------------------------------------------------------------------------///
///---------------------------------------------------------------------------------------------------------------///
...
...
openair2/RRC/NR/rrc_gNB_NGAP.c
View file @
7c067095
...
@@ -58,6 +58,8 @@
...
@@ -58,6 +58,8 @@
#include "NGAP_Cause.h"
#include "NGAP_Cause.h"
#include "NGAP_CauseRadioNetwork.h"
#include "NGAP_CauseRadioNetwork.h"
#include "f1ap_messages_types.h"
#include "f1ap_messages_types.h"
#include "E1AP_SDAP-Configuration.h"
#include "E1AP_PDCP-Configuration.h"
extern
RAN_CONTEXT_t
RC
;
extern
RAN_CONTEXT_t
RC
;
...
@@ -954,6 +956,7 @@ rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ(
...
@@ -954,6 +956,7 @@ rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ(
)
)
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
{
{
gNB_RRC_INST
*
rrc
;
uint16_t
ue_initial_id
;
uint16_t
ue_initial_id
;
uint32_t
gNB_ue_ngap_id
;
uint32_t
gNB_ue_ngap_id
;
rrc_gNB_ue_context_t
*
ue_context_p
=
NULL
;
rrc_gNB_ue_context_t
*
ue_context_p
=
NULL
;
...
@@ -967,9 +970,77 @@ rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ(
...
@@ -967,9 +970,77 @@ rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ(
ue_initial_id
=
NGAP_PDUSESSION_SETUP_REQ
(
msg_p
).
ue_initial_id
;
ue_initial_id
=
NGAP_PDUSESSION_SETUP_REQ
(
msg_p
).
ue_initial_id
;
gNB_ue_ngap_id
=
NGAP_PDUSESSION_SETUP_REQ
(
msg_p
).
gNB_ue_ngap_id
;
gNB_ue_ngap_id
=
NGAP_PDUSESSION_SETUP_REQ
(
msg_p
).
gNB_ue_ngap_id
;
ue_context_p
=
rrc_gNB_get_ue_context_from_ngap_ids
(
instance
,
ue_initial_id
,
gNB_ue_ngap_id
);
ue_context_p
=
rrc_gNB_get_ue_context_from_ngap_ids
(
instance
,
ue_initial_id
,
gNB_ue_ngap_id
);
PROTOCOL_CTXT_SET_BY_MODULE_ID
(
&
ctxt
,
0
,
GNB_FLAG_YES
,
ue_context_p
->
ue_context
.
rnti
,
0
,
0
,
0
);
rrc
=
RC
.
nrrrc
[
ctxt
.
module_id
];
LOG_I
(
NR_RRC
,
"[gNB %ld] Received %s: ue_initial_id %d, gNB_ue_ngap_id %u
\n
"
,
LOG_I
(
NR_RRC
,
"[gNB %ld] Received %s: ue_initial_id %d, gNB_ue_ngap_id %u
\n
"
,
instance
,
msg_name
,
ue_initial_id
,
gNB_ue_ngap_id
);
instance
,
msg_name
,
ue_initial_id
,
gNB_ue_ngap_id
);
if
(
RC
.
nrrrc
[
ctxt
.
module_id
]
->
cu_type
==
CPtype
)
{
// E1 split CU-CP node
/* Configurations are referred from rrc_gNB_generate_dedicatedRRCReconfiguration() and
rrc_gNB_process_RRCReconfigurationComplete()
At CU-CP we configure the E1 bearer context setup parameters (PDU sessions, DRBs and
QoS flows) same as in these functions. At CU-UP we create PDU Sessions and allocate DRBs.
*/
MessageDef
*
msg_p
=
NULL
;
msg_p
=
itti_alloc_new_message
(
TASK_CUCP_E1
,
0
,
E1AP_BEARER_CONTEXT_SETUP_REQ
);
e1ap_bearer_setup_req_t
*
bearer_req
=
&
E1AP_BEARER_CONTEXT_SETUP_REQ
(
msg_p
);
bearer_req
->
gNB_cu_cp_ue_id
=
gNB_ue_ngap_id
;
bearer_req
->
cipheringAlgorithm
=
ue_context_p
->
ue_context
.
ciphering_algorithm
;
memcpy
(
bearer_req
->
encryptionKey
,
ue_context_p
->
ue_context
.
kgnb
,
128
);
bearer_req
->
ueDlAggMaxBitRate
=
NGAP_PDUSESSION_SETUP_REQ
(
msg_p
).
ueAggMaxBitRateDownlink
;
bearer_req
->
numPDUSessions
=
NGAP_PDUSESSION_SETUP_REQ
(
msg_p
).
nb_pdusessions_tosetup
;
for
(
int
i
=
0
;
i
<
bearer_req
->
numPDUSessions
;
i
++
)
{
pdu_session_to_setup_t
*
pdu
=
bearer_req
->
pduSession
+
i
;
pdu
->
sessionId
=
NGAP_PDUSESSION_SETUP_REQ
(
msg_p
).
pdusession_setup_params
[
i
].
pdusession_id
;
pdu
->
sessionType
=
NGAP_PDUSESSION_SETUP_REQ
(
msg_p
).
pdusession_setup_params
[
i
].
upf_addr
.
pdu_session_type
;
pdu
->
sst
=
NGAP_PDUSESSION_SETUP_REQ
(
msg_p
).
allowed_nssai
[
i
].
sST
;
pdu
->
integrityProtectionIndication
=
1
;
// Preferred. TODO: Remove hardcoding
pdu
->
confidentialityProtectionIndication
=
1
;
// Preferred. TODO: Remove hardcoding
pdu
->
teId
=
NGAP_PDUSESSION_SETUP_REQ
(
msg_p
).
pdusession_setup_params
[
i
].
gtp_teid
;
memcpy
(
&
pdu
->
tlAddress
,
NGAP_PDUSESSION_SETUP_REQ
(
msg_p
).
pdusession_setup_params
[
i
].
upf_addr
.
buffer
,
sizeof
(
uint8_t
)
*
20
);
pdu
->
numDRB2Setup
=
1
;
// One DRB per PDU Session. TODO: Remove hardcoding
for
(
int
j
=
0
;
j
<
pdu
->
numDRB2Setup
;
j
++
)
{
DRB_nGRAN_to_setup_t
*
drb
=
pdu
->
DRBnGRanList
+
j
;
drb
->
id
=
i
+
j
;
drb
->
defaultDRB
=
E1AP_DefaultDRB_true
;
drb
->
sDAP_Header_UL
=
!
(
rrc
->
configuration
.
enable_sdap
);
drb
->
sDAP_Header_DL
=
!
(
rrc
->
configuration
.
enable_sdap
);
drb
->
pDCP_SN_Size_UL
=
E1AP_PDCP_SN_Size_s_18
;
drb
->
pDCP_SN_Size_DL
=
E1AP_PDCP_SN_Size_s_18
;
drb
->
rLC_Mode
=
E1AP_RLC_Mode_rlc_am
;
drb
->
numCellGroups
=
1
;
// assume one cell group associated with a DRB
for
(
int
k
=
0
;
k
<
drb
->
numCellGroups
;
k
++
)
{
cell_group_t
*
cellGroup
=
drb
->
cellGroupList
+
k
;
cellGroup
->
id
=
0
;
// MCG
}
drb
->
numQosFlow2Setup
=
NGAP_PDUSESSION_SETUP_REQ
(
msg_p
).
pdusession_setup_params
[
i
].
nb_qos
;
for
(
int
k
=
0
;
k
<
drb
->
numQosFlow2Setup
;
k
++
)
{
qos_flow_to_setup_t
*
qos
=
drb
->
qosFlows
+
k
;
qos
->
id
=
NGAP_PDUSESSION_SETUP_REQ
(
msg_p
).
pdusession_setup_params
[
i
].
qos
[
k
].
qfi
;
qos
->
fiveQI
=
NGAP_PDUSESSION_SETUP_REQ
(
msg_p
).
pdusession_setup_params
[
i
].
qos
[
k
].
fiveQI
;
qos
->
fiveQI_type
=
NGAP_PDUSESSION_SETUP_REQ
(
msg_p
).
pdusession_setup_params
[
i
].
qos
[
k
].
fiveQI_type
;
qos
->
qoSPriorityLevel
=
NGAP_PDUSESSION_SETUP_REQ
(
msg_p
).
pdusession_setup_params
[
i
].
qos
[
k
].
allocation_retention_priority
.
priority_level
;
qos
->
pre_emptionCapability
=
NGAP_PDUSESSION_SETUP_REQ
(
msg_p
).
pdusession_setup_params
[
i
].
qos
[
k
].
allocation_retention_priority
.
pre_emp_capability
;
qos
->
pre_emptionVulnerability
=
NGAP_PDUSESSION_SETUP_REQ
(
msg_p
).
pdusession_setup_params
[
i
].
qos
[
k
].
allocation_retention_priority
.
pre_emp_vulnerability
;
}
}
}
itti_send_msg_to_task
(
TASK_CUCP_E1
,
ctxt
.
module_id
,
msg_p
);
}
else
{
// Monolithic
if
(
ue_context_p
==
NULL
)
{
if
(
ue_context_p
==
NULL
)
{
MessageDef
*
msg_fail_p
=
NULL
;
MessageDef
*
msg_fail_p
=
NULL
;
LOG_W
(
NR_RRC
,
"[gNB %ld] In NGAP_PDUSESSION_SETUP_REQ: unknown UE from NGAP ids (%d, %u)
\n
"
,
instance
,
ue_initial_id
,
gNB_ue_ngap_id
);
LOG_W
(
NR_RRC
,
"[gNB %ld] In NGAP_PDUSESSION_SETUP_REQ: unknown UE from NGAP ids (%d, %u)
\n
"
,
instance
,
ue_initial_id
,
gNB_ue_ngap_id
);
...
@@ -983,7 +1054,6 @@ rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ(
...
@@ -983,7 +1054,6 @@ rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ(
uint8_t
nb_pdusessions_tosetup
=
NGAP_PDUSESSION_SETUP_REQ
(
msg_p
).
nb_pdusessions_tosetup
;
uint8_t
nb_pdusessions_tosetup
=
NGAP_PDUSESSION_SETUP_REQ
(
msg_p
).
nb_pdusessions_tosetup
;
pdu_sessions_done
=
0
;
pdu_sessions_done
=
0
;
PROTOCOL_CTXT_SET_BY_MODULE_ID
(
&
ctxt
,
0
,
GNB_FLAG_YES
,
ue_context_p
->
ue_context
.
rnti
,
0
,
0
,
0
);
for
(
int
i
=
0
;
i
<
NR_NB_RB_MAX
-
3
;
i
++
)
{
for
(
int
i
=
0
;
i
<
NR_NB_RB_MAX
-
3
;
i
++
)
{
if
(
ue_context_p
->
ue_context
.
pduSession
[
i
].
status
>=
PDU_SESSION_STATUS_DONE
)
if
(
ue_context_p
->
ue_context
.
pduSession
[
i
].
status
>=
PDU_SESSION_STATUS_DONE
)
continue
;
continue
;
...
@@ -1036,6 +1106,18 @@ rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ(
...
@@ -1036,6 +1106,18 @@ rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ(
&
inde_list
[
0
]);
&
inde_list
[
0
]);
ue_context_p
->
ue_context
.
setup_pdu_sessions
+=
nb_pdusessions_tosetup
;
ue_context_p
->
ue_context
.
setup_pdu_sessions
+=
nb_pdusessions_tosetup
;
// TEST
// ue_context_p->ue_context.pdusession[0].status = PDU_SESSION_STATUS_DONE;
// rrc_gNB_send_NGAP_PDUSESSION_SETUP_RESP(&ctxt, ue_context_p, 0);
rrc_gNB_generate_dedicatedRRCReconfiguration
(
&
ctxt
,
ue_context_p
);
return
(
0
);
}
nr_rrc_gNB_process_GTPV1U_CREATE_TUNNEL_RESP
(
&
ctxt
,
&
create_tunnel_resp
,
&
inde_list
[
0
]);
ue_context_p
->
ue_context
.
setup_pdu_sessions
+=
nb_pdusessions_tosetup
;
// TEST
// TEST
// ue_context_p->ue_context.pdusession[0].status = PDU_SESSION_STATUS_DONE;
// ue_context_p->ue_context.pdusession[0].status = PDU_SESSION_STATUS_DONE;
// rrc_gNB_send_NGAP_PDUSESSION_SETUP_RESP(&ctxt, ue_context_p, 0);
// rrc_gNB_send_NGAP_PDUSESSION_SETUP_RESP(&ctxt, ue_context_p, 0);
...
...
openair3/NGAP/ngap_gNB_handlers.c
View file @
7c067095
...
@@ -1321,6 +1321,14 @@ int ngap_gNB_handle_pdusession_setup_request(uint32_t assoc_id,
...
@@ -1321,6 +1321,14 @@ int ngap_gNB_handle_pdusession_setup_request(uint32_t assoc_id,
NGAP_PDUSESSION_SETUP_REQ
(
message_p
).
gNB_ue_ngap_id
=
ue_desc_p
->
gNB_ue_ngap_id
;
NGAP_PDUSESSION_SETUP_REQ
(
message_p
).
gNB_ue_ngap_id
=
ue_desc_p
->
gNB_ue_ngap_id
;
NGAP_PDUSESSION_SETUP_REQ
(
message_p
).
amf_ue_ngap_id
=
ue_desc_p
->
amf_ue_ngap_id
;
NGAP_PDUSESSION_SETUP_REQ
(
message_p
).
amf_ue_ngap_id
=
ue_desc_p
->
amf_ue_ngap_id
;
/* UE Aggregated Maximum Bitrate */
NGAP_FIND_PROTOCOLIE_BY_ID
(
NGAP_PDUSessionResourceSetupRequestIEs_t
,
ie
,
container
,
NGAP_ProtocolIE_ID_id_UEAggregateMaximumBitRate
,
true
);
asn_INTEGER2ulong
(
&
(
ie
->
value
.
choice
.
UEAggregateMaximumBitRate
.
uEAggregateMaximumBitRateUL
),
&
NGAP_PDUSESSION_SETUP_REQ
(
message_p
).
ueAggMaxBitRateUplink
);
asn_INTEGER2ulong
(
&
(
ie
->
value
.
choice
.
UEAggregateMaximumBitRate
.
uEAggregateMaximumBitRateDL
),
&
NGAP_PDUSESSION_SETUP_REQ
(
message_p
).
ueAggMaxBitRateDownlink
);
NGAP_FIND_PROTOCOLIE_BY_ID
(
NGAP_PDUSessionResourceSetupRequestIEs_t
,
ie
,
container
,
NGAP_FIND_PROTOCOLIE_BY_ID
(
NGAP_PDUSessionResourceSetupRequestIEs_t
,
ie
,
container
,
NGAP_ProtocolIE_ID_id_PDUSessionResourceSetupListSUReq
,
true
);
NGAP_ProtocolIE_ID_id_PDUSessionResourceSetupListSUReq
,
true
);
...
@@ -1334,9 +1342,13 @@ int ngap_gNB_handle_pdusession_setup_request(uint32_t assoc_id,
...
@@ -1334,9 +1342,13 @@ int ngap_gNB_handle_pdusession_setup_request(uint32_t assoc_id,
NGAP_PDUSessionResourceSetupRequestTransfer_t
*
pdusessionTransfer_p
=
NULL
;
NGAP_PDUSessionResourceSetupRequestTransfer_t
*
pdusessionTransfer_p
=
NULL
;
NGAP_PDUSessionResourceSetupRequestTransferIEs_t
*
pdusessionTransfer_ies
=
NULL
;
NGAP_PDUSessionResourceSetupRequestTransferIEs_t
*
pdusessionTransfer_ies
=
NULL
;
// PDU session ID
item_p
=
(
NGAP_PDUSessionResourceSetupItemSUReq_t
*
)
ie
->
value
.
choice
.
PDUSessionResourceSetupListSUReq
.
list
.
array
[
i
];
item_p
=
(
NGAP_PDUSessionResourceSetupItemSUReq_t
*
)
ie
->
value
.
choice
.
PDUSessionResourceSetupListSUReq
.
list
.
array
[
i
];
NGAP_PDUSESSION_SETUP_REQ
(
message_p
).
pdusession_setup_params
[
i
].
pdusession_id
=
item_p
->
pDUSessionID
;
NGAP_PDUSESSION_SETUP_REQ
(
message_p
).
pdusession_setup_params
[
i
].
pdusession_id
=
item_p
->
pDUSessionID
;
// S-NSSAI
OCTET_STRING_TO_INT32
(
&
item_p
->
s_NSSAI
.
sST
,
NGAP_PDUSESSION_SETUP_REQ
(
message_p
).
allowed_nssai
[
i
].
sST
);
OCTET_STRING_TO_INT32
(
item_p
->
s_NSSAI
.
sD
,
*
NGAP_PDUSESSION_SETUP_REQ
(
message_p
).
allowed_nssai
[
i
].
sD
);
// check for the NAS PDU
// check for the NAS PDU
if
(
item_p
->
pDUSessionNAS_PDU
->
size
>
0
)
{
if
(
item_p
->
pDUSessionNAS_PDU
->
size
>
0
)
{
...
@@ -1422,10 +1434,14 @@ int ngap_gNB_handle_pdusession_setup_request(uint32_t assoc_id,
...
@@ -1422,10 +1434,14 @@ int ngap_gNB_handle_pdusession_setup_request(uint32_t assoc_id,
/* Set the QOS informations */
/* Set the QOS informations */
NGAP_PDUSESSION_SETUP_REQ
(
message_p
).
pdusession_setup_params
[
i
].
qos
[
qosIdx
].
qfi
=
(
uint8_t
)
qosFlowItem_p
->
qosFlowIdentifier
;
NGAP_PDUSESSION_SETUP_REQ
(
message_p
).
pdusession_setup_params
[
i
].
qos
[
qosIdx
].
qfi
=
(
uint8_t
)
qosFlowItem_p
->
qosFlowIdentifier
;
if
(
qosFlowItem_p
->
qosFlowLevelQosParameters
.
qosCharacteristics
.
present
==
NGAP_QosCharacteristics_PR_nonDynamic5QI
){
if
(
qosFlowItem_p
->
qosFlowLevelQosParameters
.
qosCharacteristics
.
present
==
NGAP_QosCharacteristics_PR_nonDynamic5QI
){
NGAP_PDUSESSION_SETUP_REQ
(
message_p
).
pdusession_setup_params
[
i
].
qos
[
qosIdx
].
fiveQI_type
=
non_dynamic
;
if
(
qosFlowItem_p
->
qosFlowLevelQosParameters
.
qosCharacteristics
.
choice
.
nonDynamic5QI
!=
NULL
){
if
(
qosFlowItem_p
->
qosFlowLevelQosParameters
.
qosCharacteristics
.
choice
.
nonDynamic5QI
!=
NULL
){
NGAP_PDUSESSION_SETUP_REQ
(
message_p
).
pdusession_setup_params
[
i
].
qos
[
qosIdx
].
fiveQI
=
NGAP_PDUSESSION_SETUP_REQ
(
message_p
).
pdusession_setup_params
[
i
].
qos
[
qosIdx
].
fiveQI
=
(
uint64_t
)
qosFlowItem_p
->
qosFlowLevelQosParameters
.
qosCharacteristics
.
choice
.
nonDynamic5QI
->
fiveQI
;
(
uint64_t
)
qosFlowItem_p
->
qosFlowLevelQosParameters
.
qosCharacteristics
.
choice
.
nonDynamic5QI
->
fiveQI
;
}
}
}
else
if
(
qosFlowItem_p
->
qosFlowLevelQosParameters
.
qosCharacteristics
.
present
==
NGAP_QosCharacteristics_PR_dynamic5QI
)
{
NGAP_PDUSESSION_SETUP_REQ
(
message_p
).
pdusession_setup_params
[
i
].
qos
[
qosIdx
].
fiveQI_type
=
dynamic
;
}
}
NGAP_PDUSESSION_SETUP_REQ
(
message_p
).
pdusession_setup_params
[
i
].
qos
[
qosIdx
].
allocation_retention_priority
.
priority_level
=
NGAP_PDUSESSION_SETUP_REQ
(
message_p
).
pdusession_setup_params
[
i
].
qos
[
qosIdx
].
allocation_retention_priority
.
priority_level
=
qosFlowItem_p
->
qosFlowLevelQosParameters
.
allocationAndRetentionPriority
.
priorityLevelARP
;
qosFlowItem_p
->
qosFlowLevelQosParameters
.
allocationAndRetentionPriority
.
priorityLevelARP
;
...
...
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