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
spbro
OpenXG-RAN
Commits
200a408e
Commit
200a408e
authored
Mar 11, 2024
by
Robert Schmidt
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
F1AP: factor DU QoS decoding into functions
parent
2fbb41dd
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
85 additions
and
88 deletions
+85
-88
openair2/F1AP/f1ap_du_ue_context_management.c
openair2/F1AP/f1ap_du_ue_context_management.c
+85
-88
No files found.
openair2/F1AP/f1ap_du_ue_context_management.c
View file @
200a408e
...
...
@@ -39,6 +39,82 @@
#include "openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h"
#include "openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.h"
static
void
f1ap_read_drb_qos_param
(
const
F1AP_QoSFlowLevelQoSParameters_t
*
asn1_qos
,
f1ap_qos_flow_level_qos_parameters_t
*
drb_qos
)
{
f1ap_qos_characteristics_t
*
drb_qos_char
=
&
drb_qos
->
qos_characteristics
;
const
F1AP_QoS_Characteristics_t
*
dRB_QoS_Char
=
&
asn1_qos
->
qoS_Characteristics
;
if
(
dRB_QoS_Char
->
present
==
F1AP_QoS_Characteristics_PR_non_Dynamic_5QI
)
{
drb_qos_char
->
qos_type
=
non_dynamic
;
drb_qos_char
->
non_dynamic
.
fiveqi
=
dRB_QoS_Char
->
choice
.
non_Dynamic_5QI
->
fiveQI
;
drb_qos_char
->
non_dynamic
.
qos_priority_level
=
(
dRB_QoS_Char
->
choice
.
non_Dynamic_5QI
->
qoSPriorityLevel
!=
NULL
)
?
*
dRB_QoS_Char
->
choice
.
non_Dynamic_5QI
->
qoSPriorityLevel
:
-
1
;
}
else
{
drb_qos_char
->
qos_type
=
dynamic
;
drb_qos_char
->
dynamic
.
fiveqi
=
(
dRB_QoS_Char
->
choice
.
dynamic_5QI
->
fiveQI
!=
NULL
)
?
*
dRB_QoS_Char
->
choice
.
dynamic_5QI
->
fiveQI
:
-
1
;
drb_qos_char
->
dynamic
.
qos_priority_level
=
dRB_QoS_Char
->
choice
.
dynamic_5QI
->
qoSPriorityLevel
;
drb_qos_char
->
dynamic
.
packet_delay_budget
=
dRB_QoS_Char
->
choice
.
dynamic_5QI
->
packetDelayBudget
;
drb_qos_char
->
dynamic
.
packet_error_rate
.
per_scalar
=
dRB_QoS_Char
->
choice
.
dynamic_5QI
->
packetErrorRate
.
pER_Scalar
;
drb_qos_char
->
dynamic
.
packet_error_rate
.
per_exponent
=
dRB_QoS_Char
->
choice
.
dynamic_5QI
->
packetErrorRate
.
pER_Exponent
;
}
/* nGRANallocationRetentionPriority */
drb_qos
->
alloc_reten_priority
.
priority_level
=
asn1_qos
->
nGRANallocationRetentionPriority
.
priorityLevel
;
drb_qos
->
alloc_reten_priority
.
preemption_vulnerability
=
asn1_qos
->
nGRANallocationRetentionPriority
.
pre_emptionVulnerability
;
drb_qos
->
alloc_reten_priority
.
preemption_capability
=
asn1_qos
->
nGRANallocationRetentionPriority
.
pre_emptionVulnerability
;
}
static
void
f1ap_read_flows_mapped
(
const
F1AP_Flows_Mapped_To_DRB_List_t
*
asn1_flows_mapped
,
f1ap_flows_mapped_to_drb_t
*
flows_mapped
,
int
n
)
{
for
(
int
k
=
0
;
k
<
n
;
k
++
)
{
f1ap_flows_mapped_to_drb_t
*
flows_mapped_to_drb
=
flows_mapped
+
k
;
const
F1AP_Flows_Mapped_To_DRB_Item_t
*
flows_Mapped_To_Drb
=
asn1_flows_mapped
->
list
.
array
[
0
]
+
k
;
flows_mapped_to_drb
->
qfi
=
flows_Mapped_To_Drb
->
qoSFlowIdentifier
;
/* QoS-Flow-Level-QoS-Parameters */
{
f1ap_qos_flow_level_qos_parameters_t
*
flow_qos
=
&
flows_mapped_to_drb
->
qos_params
;
const
F1AP_QoSFlowLevelQoSParameters_t
*
Flow_QoS
=
&
flows_Mapped_To_Drb
->
qoSFlowLevelQoSParameters
;
/* QoS Characteristics*/
f1ap_qos_characteristics_t
*
flow_qos_char
=
&
flow_qos
->
qos_characteristics
;
const
F1AP_QoS_Characteristics_t
*
Flow_QoS_Char
=
&
Flow_QoS
->
qoS_Characteristics
;
if
(
Flow_QoS_Char
->
present
==
F1AP_QoS_Characteristics_PR_non_Dynamic_5QI
)
{
flow_qos_char
->
qos_type
=
non_dynamic
;
flow_qos_char
->
non_dynamic
.
fiveqi
=
Flow_QoS_Char
->
choice
.
non_Dynamic_5QI
->
fiveQI
;
flow_qos_char
->
non_dynamic
.
qos_priority_level
=
(
Flow_QoS_Char
->
choice
.
non_Dynamic_5QI
->
qoSPriorityLevel
!=
NULL
)
?
*
Flow_QoS_Char
->
choice
.
non_Dynamic_5QI
->
qoSPriorityLevel
:
-
1
;
}
else
{
flow_qos_char
->
qos_type
=
dynamic
;
flow_qos_char
->
dynamic
.
fiveqi
=
(
Flow_QoS_Char
->
choice
.
dynamic_5QI
->
fiveQI
!=
NULL
)
?
*
Flow_QoS_Char
->
choice
.
dynamic_5QI
->
fiveQI
:
-
1
;
flow_qos_char
->
dynamic
.
qos_priority_level
=
Flow_QoS_Char
->
choice
.
dynamic_5QI
->
qoSPriorityLevel
;
flow_qos_char
->
dynamic
.
packet_delay_budget
=
Flow_QoS_Char
->
choice
.
dynamic_5QI
->
packetDelayBudget
;
flow_qos_char
->
dynamic
.
packet_error_rate
.
per_scalar
=
Flow_QoS_Char
->
choice
.
dynamic_5QI
->
packetErrorRate
.
pER_Scalar
;
flow_qos_char
->
dynamic
.
packet_error_rate
.
per_exponent
=
Flow_QoS_Char
->
choice
.
dynamic_5QI
->
packetErrorRate
.
pER_Exponent
;
}
/* nGRANallocationRetentionPriority */
flow_qos
->
alloc_reten_priority
.
priority_level
=
Flow_QoS
->
nGRANallocationRetentionPriority
.
priorityLevel
;
flow_qos
->
alloc_reten_priority
.
preemption_vulnerability
=
Flow_QoS
->
nGRANallocationRetentionPriority
.
pre_emptionVulnerability
;
flow_qos
->
alloc_reten_priority
.
preemption_capability
=
Flow_QoS
->
nGRANallocationRetentionPriority
.
pre_emptionVulnerability
;
}
}
}
static
void
f1ap_read_drb_nssai
(
const
F1AP_SNSSAI_t
*
asn1_nssai
,
nssai_t
*
nssai
)
{
OCTET_STRING_TO_INT8
(
&
asn1_nssai
->
sST
,
nssai
->
sst
);
nssai
->
sd
=
0xffffff
;
if
(
asn1_nssai
->
sD
!=
NULL
)
memcpy
((
uint8_t
*
)
&
nssai
->
sd
,
asn1_nssai
->
sD
->
buf
,
3
);
}
int
DU_handle_UE_CONTEXT_SETUP_REQUEST
(
instance_t
instance
,
sctp_assoc_t
assoc_id
,
uint32_t
stream
,
F1AP_F1AP_PDU_t
*
pdu
)
{
F1AP_UEContextSetupRequest_t
*
container
;
...
...
@@ -845,101 +921,22 @@ int DU_handle_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance, sctp_assoc_t
(
F1AP_QoSInformation_ExtIEs_t
*
)
drbs_tobesetupmod_item_p
->
qoSInformation
.
choice
.
choice_extension
;
if
(
ie
->
id
==
F1AP_ProtocolIE_ID_id_DRB_Information
&&
ie
->
criticality
==
F1AP_Criticality_reject
&&
ie
->
value
.
present
==
F1AP_QoSInformation_ExtIEs__value_PR_DRB_Information
)
{
F1AP_DRB_Information_t
*
dRB_Info
=
&
ie
->
value
.
choice
.
DRB_Information
;
f1ap_drb_information_t
*
drb_info
=
&
f1ap_ue_context_modification_req
->
drbs_to_be_setup
->
drb_info
;
/* 12.1.2.1 dRB_QoS */
{
/* QoS-Flow-Level-QoS-Parameters */
f1ap_qos_flow_level_qos_parameters_t
*
drb_qos
=
&
drb_info
->
drb_qos
;
F1AP_QoSFlowLevelQoSParameters_t
*
dRB_QoS
=
&
dRB_Info
->
dRB_QoS
;
{
/* QoS Characteristics*/
f1ap_qos_characteristics_t
*
drb_qos_char
=
&
drb_qos
->
qos_characteristics
;
F1AP_QoS_Characteristics_t
*
dRB_QoS_Char
=
&
dRB_QoS
->
qoS_Characteristics
;
if
(
dRB_QoS_Char
->
present
==
F1AP_QoS_Characteristics_PR_non_Dynamic_5QI
)
{
drb_qos_char
->
qos_type
=
non_dynamic
;
drb_qos_char
->
non_dynamic
.
fiveqi
=
dRB_QoS_Char
->
choice
.
non_Dynamic_5QI
->
fiveQI
;
drb_qos_char
->
non_dynamic
.
qos_priority_level
=
(
dRB_QoS_Char
->
choice
.
non_Dynamic_5QI
->
qoSPriorityLevel
!=
NULL
)
?
*
dRB_QoS_Char
->
choice
.
non_Dynamic_5QI
->
qoSPriorityLevel
:
-
1
;
}
else
{
drb_qos_char
->
qos_type
=
dynamic
;
drb_qos_char
->
dynamic
.
fiveqi
=
(
dRB_QoS_Char
->
choice
.
dynamic_5QI
->
fiveQI
!=
NULL
)
?
*
dRB_QoS_Char
->
choice
.
dynamic_5QI
->
fiveQI
:
-
1
;
drb_qos_char
->
dynamic
.
qos_priority_level
=
dRB_QoS_Char
->
choice
.
dynamic_5QI
->
qoSPriorityLevel
;
drb_qos_char
->
dynamic
.
packet_delay_budget
=
dRB_QoS_Char
->
choice
.
dynamic_5QI
->
packetDelayBudget
;
drb_qos_char
->
dynamic
.
packet_error_rate
.
per_scalar
=
dRB_QoS_Char
->
choice
.
dynamic_5QI
->
packetErrorRate
.
pER_Scalar
;
drb_qos_char
->
dynamic
.
packet_error_rate
.
per_exponent
=
dRB_QoS_Char
->
choice
.
dynamic_5QI
->
packetErrorRate
.
pER_Exponent
;
}
}
/* nGRANallocationRetentionPriority */
drb_qos
->
alloc_reten_priority
.
priority_level
=
dRB_QoS
->
nGRANallocationRetentionPriority
.
priorityLevel
;
drb_qos
->
alloc_reten_priority
.
preemption_vulnerability
=
dRB_QoS
->
nGRANallocationRetentionPriority
.
pre_emptionVulnerability
;
drb_qos
->
alloc_reten_priority
.
preemption_capability
=
dRB_QoS
->
nGRANallocationRetentionPriority
.
pre_emptionVulnerability
;
}
// dRB_QoS
const
F1AP_DRB_Information_t
*
dRB_Info
=
&
ie
->
value
.
choice
.
DRB_Information
;
f1ap_drb_information_t
*
drb_info
=
&
drb_p
->
drb_info
;
/* QoS-Flow-Level-QoS-Parameters */
/* QoS Characteristics*/
f1ap_read_drb_qos_param
(
&
dRB_Info
->
dRB_QoS
,
&
drb_info
->
drb_qos
);
// 12.1.2.4 flows_Mapped_To_DRB_List
drb_info
->
flows_to_be_setup_length
=
dRB_Info
->
flows_Mapped_To_DRB_List
.
list
.
count
;
drb_info
->
flows_mapped_to_drb
=
calloc
(
drb_info
->
flows_to_be_setup_length
,
sizeof
(
f1ap_flows_mapped_to_drb_t
));
AssertFatal
(
drb_info
->
flows_mapped_to_drb
,
"could not allocate memory for drb_p->drb_info.flows_mapped_to_drb
\n
"
);
for
(
int
k
=
0
;
k
<
drb_p
->
drb_info
.
flows_to_be_setup_length
;
k
++
)
{
f1ap_flows_mapped_to_drb_t
*
flows_mapped_to_drb
=
drb_info
->
flows_mapped_to_drb
+
k
;
F1AP_Flows_Mapped_To_DRB_Item_t
*
flows_Mapped_To_Drb
=
dRB_Info
->
flows_Mapped_To_DRB_List
.
list
.
array
[
0
]
+
k
;
flows_mapped_to_drb
->
qfi
=
flows_Mapped_To_Drb
->
qoSFlowIdentifier
;
/* QoS-Flow-Level-QoS-Parameters */
{
f1ap_qos_flow_level_qos_parameters_t
*
flow_qos
=
&
flows_mapped_to_drb
->
qos_params
;
F1AP_QoSFlowLevelQoSParameters_t
*
Flow_QoS
=
&
flows_Mapped_To_Drb
->
qoSFlowLevelQoSParameters
;
/* QoS Characteristics*/
{
f1ap_qos_characteristics_t
*
flow_qos_char
=
&
flow_qos
->
qos_characteristics
;
F1AP_QoS_Characteristics_t
*
Flow_QoS_Char
=
&
Flow_QoS
->
qoS_Characteristics
;
if
(
Flow_QoS_Char
->
present
==
F1AP_QoS_Characteristics_PR_non_Dynamic_5QI
)
{
flow_qos_char
->
qos_type
=
non_dynamic
;
flow_qos_char
->
non_dynamic
.
fiveqi
=
Flow_QoS_Char
->
choice
.
non_Dynamic_5QI
->
fiveQI
;
flow_qos_char
->
non_dynamic
.
qos_priority_level
=
(
Flow_QoS_Char
->
choice
.
non_Dynamic_5QI
->
qoSPriorityLevel
!=
NULL
)
?
*
Flow_QoS_Char
->
choice
.
non_Dynamic_5QI
->
qoSPriorityLevel
:
-
1
;
}
else
{
flow_qos_char
->
qos_type
=
dynamic
;
flow_qos_char
->
dynamic
.
fiveqi
=
(
Flow_QoS_Char
->
choice
.
dynamic_5QI
->
fiveQI
!=
NULL
)
?
*
Flow_QoS_Char
->
choice
.
dynamic_5QI
->
fiveQI
:
-
1
;
flow_qos_char
->
dynamic
.
qos_priority_level
=
Flow_QoS_Char
->
choice
.
dynamic_5QI
->
qoSPriorityLevel
;
flow_qos_char
->
dynamic
.
packet_delay_budget
=
Flow_QoS_Char
->
choice
.
dynamic_5QI
->
packetDelayBudget
;
flow_qos_char
->
dynamic
.
packet_error_rate
.
per_scalar
=
Flow_QoS_Char
->
choice
.
dynamic_5QI
->
packetErrorRate
.
pER_Scalar
;
flow_qos_char
->
dynamic
.
packet_error_rate
.
per_exponent
=
Flow_QoS_Char
->
choice
.
dynamic_5QI
->
packetErrorRate
.
pER_Exponent
;
}
}
/* nGRANallocationRetentionPriority */
flow_qos
->
alloc_reten_priority
.
priority_level
=
Flow_QoS
->
nGRANallocationRetentionPriority
.
priorityLevel
;
flow_qos
->
alloc_reten_priority
.
preemption_vulnerability
=
Flow_QoS
->
nGRANallocationRetentionPriority
.
pre_emptionVulnerability
;
flow_qos
->
alloc_reten_priority
.
preemption_capability
=
Flow_QoS
->
nGRANallocationRetentionPriority
.
pre_emptionVulnerability
;
}
}
f1ap_read_flows_mapped
(
&
dRB_Info
->
flows_Mapped_To_DRB_List
,
drb_info
->
flows_mapped_to_drb
,
drb_info
->
flows_to_be_setup_length
);
/* S-NSSAI */
OCTET_STRING_TO_INT8
(
&
dRB_Info
->
sNSSAI
.
sST
,
drb_p
->
nssai
.
sst
);
if
(
dRB_Info
->
sNSSAI
.
sD
!=
NULL
)
memcpy
((
uint8_t
*
)
&
drb_p
->
nssai
.
sd
,
dRB_Info
->
sNSSAI
.
sD
->
buf
,
3
);
else
drb_p
->
nssai
.
sd
=
0xffffff
;
f1ap_read_drb_nssai
(
&
dRB_Info
->
sNSSAI
,
&
drb_p
->
nssai
);
}
}
}
...
...
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