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
2f81f190
Commit
2f81f190
authored
1 year ago
by
Giulio Carota
Committed by
Robert Schmidt
1 year ago
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Generate TimingMeasurementConfig at DU, store at CU
parent
a771d584
Changes
10
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
196 additions
and
13 deletions
+196
-13
openair2/COMMON/f1ap_messages_types.h
openair2/COMMON/f1ap_messages_types.h
+2
-1
openair2/F1AP/f1ap_cu_interface_management.c
openair2/F1AP/f1ap_cu_interface_management.c
+25
-1
openair2/F1AP/f1ap_du_interface_management.c
openair2/F1AP/f1ap_du_interface_management.c
+2
-3
openair2/GNB_APP/gnb_config.c
openair2/GNB_APP/gnb_config.c
+11
-1
openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_direct.c
openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_direct.c
+17
-5
openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_f1ap.c
openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_f1ap.c
+8
-2
openair2/RRC/NR/nr_rrc_config.c
openair2/RRC/NR/nr_rrc_config.c
+79
-0
openair2/RRC/NR/nr_rrc_config.h
openair2/RRC/NR/nr_rrc_config.h
+4
-0
openair2/RRC/NR/nr_rrc_defs.h
openair2/RRC/NR/nr_rrc_defs.h
+2
-0
openair2/RRC/NR/rrc_gNB_du.c
openair2/RRC/NR/rrc_gNB_du.c
+46
-0
No files found.
openair2/COMMON/f1ap_messages_types.h
View file @
2f81f190
...
...
@@ -140,7 +140,8 @@ typedef struct f1ap_served_cell_info_t {
f1ap_tdd_info_t
tdd
;
};
char
*
measurement_timing_information
;
uint8_t
*
measurement_timing_config
;
int
measurement_timing_config_len
;
}
f1ap_served_cell_info_t
;
typedef
struct
f1ap_gnb_du_system_info_t
{
...
...
This diff is collapsed.
Click to expand it.
openair2/F1AP/f1ap_cu_interface_management.c
View file @
2f81f190
...
...
@@ -67,6 +67,14 @@ int CU_send_ERROR_INDICATION(sctp_assoc_t assoc_id, F1AP_ErrorIndication_t *Erro
AssertFatal
(
1
==
0
,
"Not implemented yet
\n
"
);
}
static
uint8_t
*
cp_octet_string
(
const
OCTET_STRING_t
*
os
,
int
*
len
)
{
uint8_t
*
buf
=
calloc
(
os
->
size
,
sizeof
(
*
buf
));
AssertFatal
(
buf
!=
NULL
,
"out of memory
\n
"
);
memcpy
(
buf
,
os
->
buf
,
os
->
size
);
*
len
=
os
->
size
;
return
buf
;
}
/*
F1 Setup
...
...
@@ -187,6 +195,11 @@ int CU_handle_F1_SETUP_REQUEST(instance_t instance, sctp_assoc_t assoc_id, uint3
AssertFatal
(
false
,
"unknown NR Mode info %d
\n
"
,
servedCellInformation
->
nR_Mode_Info
.
present
);
}
/* MeasurementConfig */
if
(
servedCellInformation
->
measurementTimingConfiguration
.
size
>
0
)
req
->
cell
[
i
].
info
.
measurement_timing_config
=
cp_octet_string
(
&
servedCellInformation
->
measurementTimingConfiguration
,
&
req
->
cell
[
i
].
info
.
measurement_timing_config_len
);
struct
F1AP_GNB_DU_System_Information
*
DUsi
=
served_cells_item
->
gNB_DU_System_Information
;
if
(
DUsi
!=
NULL
)
{
// System Information
...
...
@@ -537,6 +550,12 @@ int CU_handle_gNB_DU_CONFIGURATION_UPDATE(instance_t instance, sctp_assoc_t asso
AssertFatal
(
false
,
"unknown NR Mode info %d
\n
"
,
servedCellInformation
->
nR_Mode_Info
.
present
);
}
/* MeasurementConfig */
if
(
servedCellInformation
->
measurementTimingConfiguration
.
size
>
0
)
req
->
cell_to_add
[
i
].
info
.
measurement_timing_config
=
cp_octet_string
(
&
servedCellInformation
->
measurementTimingConfiguration
,
&
req
->
cell_to_add
[
i
].
info
.
measurement_timing_config_len
);
struct
F1AP_GNB_DU_System_Information
*
DUsi
=
served_cells_item
->
gNB_DU_System_Information
;
// System Information
req
->
cell_to_add
[
i
].
sys_info
=
calloc
(
1
,
sizeof
(
*
req
->
cell_to_add
[
i
].
sys_info
));
...
...
@@ -648,7 +667,12 @@ int CU_handle_gNB_DU_CONFIGURATION_UPDATE(instance_t instance, sctp_assoc_t asso
}
else
{
AssertFatal
(
false
,
"unknown NR Mode info %d
\n
"
,
servedCellInformation
->
nR_Mode_Info
.
present
);
}
// TODO: Measurement Config
/* MeasurementConfig */
if
(
servedCellInformation
->
measurementTimingConfiguration
.
size
>
0
)
req
->
cell_to_modify
[
i
].
info
.
measurement_timing_config
=
cp_octet_string
(
&
servedCellInformation
->
measurementTimingConfiguration
,
&
req
->
cell_to_modify
[
i
].
info
.
measurement_timing_config_len
);
/*gNB DU SYSTEM INFORMATION */
struct
F1AP_GNB_DU_System_Information
*
DUsi
=
served_cells_item
->
gNB_DU_System_Information
;
...
...
This diff is collapsed.
Click to expand it.
openair2/F1AP/f1ap_du_interface_management.c
View file @
2f81f190
...
...
@@ -196,10 +196,9 @@ static F1AP_Served_Cell_Information_t encode_served_cell_info(const f1ap_served_
}
/* - measurementTimingConfiguration */
char
*
measurementTimingConfiguration
=
c
->
measurement_timing_information
;
OCTET_STRING_fromBuf
(
&
scell_info
.
measurementTimingConfiguration
,
measurementTimingConfiguration
,
strlen
(
measurementTimingConfiguration
)
);
(
const
char
*
)
c
->
measurement_timing_config
,
c
->
measurement_timing_config_len
);
return
scell_info
;
}
...
...
This diff is collapsed.
Click to expand it.
openair2/GNB_APP/gnb_config.c
View file @
2f81f190
...
...
@@ -82,6 +82,7 @@
#include "NR_RateMatchPatternLTE-CRS.h"
#include "NR_SearchSpace.h"
#include "NR_ControlResourceSet.h"
#include "NR_MeasurementTimingConfiguration.h"
#include "NR_EUTRA-MBSFN-SubframeConfig.h"
#include "uper_decoder.h"
#include "uper_encoder.h"
...
...
@@ -1168,7 +1169,16 @@ static f1ap_setup_req_t *RC_read_F1Setup(uint64_t id,
req
->
cell
[
0
].
info
.
fdd
=
read_fdd_config
(
scc
);
}
req
->
cell
[
0
].
info
.
measurement_timing_information
=
"0"
;
NR_MeasurementTimingConfiguration_t
*
mtc
=
get_new_MeasurementTimingConfiguration
(
scc
);
uint8_t
buf
[
1024
];
int
len
=
encode_MeasurementTimingConfiguration
(
mtc
,
buf
,
sizeof
(
buf
));
DevAssert
(
len
<=
sizeof
(
buf
));
free_MeasurementTimingConfiguration
(
mtc
);
uint8_t
*
mtc_buf
=
calloc
(
len
,
sizeof
(
*
mtc_buf
));
AssertFatal
(
mtc_buf
!=
NULL
,
"out of memory
\n
"
);
memcpy
(
mtc_buf
,
buf
,
len
);
req
->
cell
[
0
].
info
.
measurement_timing_config
=
mtc_buf
;
req
->
cell
[
0
].
info
.
measurement_timing_config_len
=
len
;
if
(
get_softmodem_params
()
->
sa
)
{
// in NSA we don't transmit SIB1, so cannot fill DU system information
...
...
This diff is collapsed.
Click to expand it.
openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_direct.c
View file @
2f81f190
...
...
@@ -39,8 +39,14 @@ static void f1_setup_request_direct(const f1ap_setup_req_t *req)
AssertFatal
(
f1ap_msg
->
cell
[
n
].
info
.
tac
!=
NULL
,
"out of memory
\n
"
);
*
f1ap_msg
->
cell
[
n
].
info
.
tac
=
*
req
->
cell
[
n
].
info
.
tac
;
}
if
(
req
->
cell
[
n
].
info
.
measurement_timing_information
)
f1ap_msg
->
cell
[
n
].
info
.
measurement_timing_information
=
strdup
(
req
->
cell
[
n
].
info
.
measurement_timing_information
);
if
(
req
->
cell
[
n
].
info
.
measurement_timing_config_len
>
0
)
{
f1ap_msg
->
cell
[
n
].
info
.
measurement_timing_config
=
calloc
(
req
->
cell
[
n
].
info
.
measurement_timing_config_len
,
sizeof
(
uint8_t
));
AssertFatal
(
f1ap_msg
->
cell
[
n
].
info
.
measurement_timing_config
!=
NULL
,
"out of memory
\n
"
);
memcpy
(
f1ap_msg
->
cell
[
n
].
info
.
measurement_timing_config
,
req
->
cell
[
n
].
info
.
measurement_timing_config
,
req
->
cell
[
n
].
info
.
measurement_timing_config_len
);
f1ap_msg
->
cell
[
n
].
info
.
measurement_timing_config_len
=
req
->
cell
[
n
].
info
.
measurement_timing_config_len
;
}
if
(
req
->
cell
[
n
].
sys_info
)
{
f1ap_gnb_du_system_info_t
*
orig_sys_info
=
req
->
cell
[
n
].
sys_info
;
...
...
@@ -85,9 +91,15 @@ static void gnb_du_configuration_update_direct(const f1ap_gnb_du_configuration_u
AssertFatal
(
f1ap_msg
->
cell_to_modify
[
n
].
info
.
tac
!=
NULL
,
"out of memory
\n
"
);
*
f1ap_msg
->
cell_to_modify
[
n
].
info
.
tac
=
*
upd
->
cell_to_modify
[
n
].
info
.
tac
;
}
if
(
upd
->
cell_to_modify
[
n
].
info
.
measurement_timing_information
)
f1ap_msg
->
cell_to_modify
[
n
].
info
.
measurement_timing_information
=
strdup
(
upd
->
cell_to_modify
[
n
].
info
.
measurement_timing_information
);
if
(
upd
->
cell_to_modify
[
n
].
info
.
measurement_timing_config_len
>
0
)
{
f1ap_msg
->
cell_to_modify
[
n
].
info
.
measurement_timing_config
=
calloc
(
upd
->
cell_to_modify
[
n
].
info
.
measurement_timing_config_len
,
sizeof
(
uint8_t
));
AssertFatal
(
f1ap_msg
->
cell_to_modify
[
n
].
info
.
measurement_timing_config
!=
NULL
,
"out of memory
\n
"
);
memcpy
(
f1ap_msg
->
cell_to_modify
[
n
].
info
.
measurement_timing_config
,
upd
->
cell_to_modify
[
n
].
info
.
measurement_timing_config
,
upd
->
cell_to_modify
[
n
].
info
.
measurement_timing_config_len
);
f1ap_msg
->
cell_to_modify
[
n
].
info
.
measurement_timing_config_len
=
upd
->
cell_to_modify
[
n
].
info
.
measurement_timing_config_len
;
}
if
(
upd
->
cell_to_modify
[
n
].
sys_info
)
{
f1ap_gnb_du_system_info_t
*
orig_sys_info
=
upd
->
cell_to_modify
[
n
].
sys_info
;
...
...
This diff is collapsed.
Click to expand it.
openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_f1ap.c
View file @
2f81f190
...
...
@@ -69,8 +69,14 @@ static void f1_setup_request_f1ap(const f1ap_setup_req_t *req)
AssertFatal
(
f1ap_setup
->
cell
[
n
].
info
.
tac
!=
NULL
,
"out of memory
\n
"
);
*
f1ap_setup
->
cell
[
n
].
info
.
tac
=
*
req
->
cell
[
n
].
info
.
tac
;
}
if
(
req
->
cell
[
n
].
info
.
measurement_timing_information
)
f1ap_setup
->
cell
[
n
].
info
.
measurement_timing_information
=
strdup
(
req
->
cell
[
n
].
info
.
measurement_timing_information
);
if
(
req
->
cell
[
n
].
info
.
measurement_timing_config_len
>
0
)
{
f1ap_setup
->
cell
[
n
].
info
.
measurement_timing_config
=
calloc
(
req
->
cell
[
n
].
info
.
measurement_timing_config_len
,
sizeof
(
uint8_t
));
AssertFatal
(
f1ap_setup
->
cell
[
n
].
info
.
measurement_timing_config
!=
NULL
,
"out of memory
\n
"
);
memcpy
(
f1ap_setup
->
cell
[
n
].
info
.
measurement_timing_config
,
req
->
cell
[
n
].
info
.
measurement_timing_config
,
req
->
cell
[
n
].
info
.
measurement_timing_config_len
);
f1ap_setup
->
cell
[
n
].
info
.
measurement_timing_config_len
=
req
->
cell
[
n
].
info
.
measurement_timing_config_len
;
}
if
(
req
->
cell
[
n
].
sys_info
)
{
f1ap_gnb_du_system_info_t
*
orig_sys_info
=
req
->
cell
[
n
].
sys_info
;
...
...
This diff is collapsed.
Click to expand it.
openair2/RRC/NR/nr_rrc_config.c
View file @
2f81f190
...
...
@@ -36,6 +36,8 @@
#include "oai_asn1.h"
#include "SIMULATION/TOOLS/sim.h" // for taus();
#include "NR_MeasurementTimingConfiguration.h"
#include "uper_decoder.h"
#include "uper_encoder.h"
...
...
@@ -1887,6 +1889,83 @@ int encode_MIB_NR_setup(NR_MIB_t *mib, int frame, uint8_t *buf, int buf_size)
return
(
enc_rval
.
encoded
+
7
)
/
8
;
}
static
struct
NR_SSB_MTC__periodicityAndOffset
get_SSB_MTC_periodicityAndOffset
(
long
ssb_periodicityServingCell
)
{
struct
NR_SSB_MTC__periodicityAndOffset
po
=
{
0
};
switch
(
ssb_periodicityServingCell
)
{
case
NR_ServingCellConfigCommon__ssb_periodicityServingCell_ms5
:
po
.
present
=
NR_SSB_MTC__periodicityAndOffset_PR_sf5
;
po
.
choice
.
sf5
=
0
;
break
;
case
NR_ServingCellConfigCommon__ssb_periodicityServingCell_ms10
:
po
.
present
=
NR_SSB_MTC__periodicityAndOffset_PR_sf10
;
po
.
choice
.
sf10
=
0
;
break
;
case
NR_ServingCellConfigCommon__ssb_periodicityServingCell_ms20
:
po
.
present
=
NR_SSB_MTC__periodicityAndOffset_PR_sf20
;
po
.
choice
.
sf20
=
0
;
break
;
case
NR_ServingCellConfigCommon__ssb_periodicityServingCell_ms40
:
po
.
present
=
NR_SSB_MTC__periodicityAndOffset_PR_sf40
;
po
.
choice
.
sf40
=
0
;
break
;
case
NR_ServingCellConfigCommon__ssb_periodicityServingCell_ms80
:
po
.
present
=
NR_SSB_MTC__periodicityAndOffset_PR_sf80
;
po
.
choice
.
sf80
=
0
;
break
;
case
NR_ServingCellConfigCommon__ssb_periodicityServingCell_ms160
:
po
.
present
=
NR_SSB_MTC__periodicityAndOffset_PR_sf160
;
po
.
choice
.
sf160
=
0
;
break
;
default:
AssertFatal
(
false
,
"illegal ssb_periodicityServingCell %ld
\n
"
,
ssb_periodicityServingCell
);
break
;
}
return
po
;
}
NR_MeasurementTimingConfiguration_t
*
get_new_MeasurementTimingConfiguration
(
const
NR_ServingCellConfigCommon_t
*
scc
)
{
NR_MeasurementTimingConfiguration_t
*
mtc
=
calloc
(
1
,
sizeof
(
*
mtc
));
AssertFatal
(
mtc
!=
NULL
,
"out of memory
\n
"
);
mtc
->
criticalExtensions
.
present
=
NR_MeasurementTimingConfiguration__criticalExtensions_PR_c1
;
mtc
->
criticalExtensions
.
choice
.
c1
=
calloc
(
1
,
sizeof
(
*
mtc
->
criticalExtensions
.
choice
.
c1
));
AssertFatal
(
mtc
->
criticalExtensions
.
choice
.
c1
!=
NULL
,
"out of memory
\n
"
);
mtc
->
criticalExtensions
.
choice
.
c1
->
present
=
NR_MeasurementTimingConfiguration__criticalExtensions__c1_PR_measTimingConf
;
NR_MeasurementTimingConfiguration_IEs_t
*
mtc_ie
=
calloc
(
1
,
sizeof
(
*
mtc_ie
));
AssertFatal
(
mtc_ie
!=
NULL
,
"out of memory
\n
"
);
mtc
->
criticalExtensions
.
choice
.
c1
->
choice
.
measTimingConf
=
mtc_ie
;
mtc_ie
->
measTiming
=
calloc
(
1
,
sizeof
(
*
mtc_ie
->
measTiming
));
AssertFatal
(
mtc_ie
->
measTiming
!=
NULL
,
"out of memory
\n
"
);
asn1cSequenceAdd
(
mtc_ie
->
measTiming
->
list
,
NR_MeasTiming_t
,
mt
);
AssertFatal
(
mt
!=
NULL
,
"out of memory
\n
"
);
mt
->
frequencyAndTiming
=
calloc
(
1
,
sizeof
(
*
mt
->
frequencyAndTiming
));
AssertFatal
(
mt
->
frequencyAndTiming
!=
NULL
,
"out of memory
\n
"
);
mt
->
frequencyAndTiming
->
carrierFreq
=
*
scc
->
downlinkConfigCommon
->
frequencyInfoDL
->
absoluteFrequencySSB
;
mt
->
frequencyAndTiming
->
ssbSubcarrierSpacing
=
*
scc
->
ssbSubcarrierSpacing
;
NR_SSB_MTC_t
*
ssb_mtc
=
&
mt
->
frequencyAndTiming
->
ssb_MeasurementTimingConfiguration
;
ssb_mtc
->
duration
=
NR_SSB_MTC__duration_sf1
;
ssb_mtc
->
periodicityAndOffset
=
get_SSB_MTC_periodicityAndOffset
(
*
scc
->
ssb_periodicityServingCell
);
return
mtc
;
}
int
encode_MeasurementTimingConfiguration
(
const
struct
NR_MeasurementTimingConfiguration
*
mtc
,
uint8_t
*
buf
,
int
buf_len
)
{
DevAssert
(
mtc
!=
NULL
);
xer_fprint
(
stdout
,
&
asn_DEF_NR_MeasurementTimingConfiguration
,
mtc
);
asn_enc_rval_t
enc_rval
=
uper_encode_to_buffer
(
&
asn_DEF_NR_MeasurementTimingConfiguration
,
NULL
,
mtc
,
buf
,
buf_len
);
AssertFatal
(
enc_rval
.
encoded
>
0
,
"ASN1 message encoding failed (%s, %lu)!
\n
"
,
enc_rval
.
failed_type
->
name
,
enc_rval
.
encoded
);
return
(
enc_rval
.
encoded
+
7
)
/
8
;
}
void
free_MeasurementTimingConfiguration
(
NR_MeasurementTimingConfiguration_t
*
mtc
)
{
ASN_STRUCT_FREE
(
asn_DEF_NR_MeasurementTimingConfiguration
,
mtc
);
}
NR_BCCH_DL_SCH_Message_t
*
get_SIB1_NR
(
const
NR_ServingCellConfigCommon_t
*
scc
,
const
f1ap_plmn_t
*
plmn
,
uint64_t
cellID
,
int
tac
)
{
AssertFatal
(
cellID
<
(
1l
<<
36
),
"cellID must fit within 36 bits, but is %lu
\n
"
,
cellID
);
...
...
This diff is collapsed.
Click to expand it.
openair2/RRC/NR/nr_rrc_config.h
View file @
2f81f190
...
...
@@ -57,6 +57,10 @@ void free_MIB_NR(NR_BCCH_BCH_Message_t *mib);
int
encode_MIB_NR
(
NR_BCCH_BCH_Message_t
*
mib
,
int
frame
,
uint8_t
*
buf
,
int
buf_size
);
int
encode_MIB_NR_setup
(
NR_MIB_t
*
mib
,
int
frame
,
uint8_t
*
buf
,
int
buf_size
);
struct
NR_MeasurementTimingConfiguration
;
struct
NR_MeasurementTimingConfiguration
*
get_new_MeasurementTimingConfiguration
(
const
NR_ServingCellConfigCommon_t
*
scc
);
int
encode_MeasurementTimingConfiguration
(
const
struct
NR_MeasurementTimingConfiguration
*
mtc
,
uint8_t
*
buf
,
int
buf_len
);
void
free_MeasurementTimingConfiguration
(
struct
NR_MeasurementTimingConfiguration
*
mtc
);
#define NR_MAX_SIB_LENGTH 2976 // 3GPP TS 38.331 section 5.2.1
NR_BCCH_DL_SCH_Message_t
*
get_SIB1_NR
(
const
NR_ServingCellConfigCommon_t
*
scc
,
const
f1ap_plmn_t
*
plmn
,
uint64_t
cellID
,
int
tac
);
...
...
This diff is collapsed.
Click to expand it.
openair2/RRC/NR/nr_rrc_defs.h
View file @
2f81f190
...
...
@@ -62,6 +62,7 @@
#include "NR_CellGroupConfig.h"
#include "NR_ServingCellConfigCommon.h"
#include "NR_EstablishmentCause.h"
#include "NR_MeasurementTimingConfiguration.h"
//-------------------
...
...
@@ -382,6 +383,7 @@ typedef struct nr_rrc_du_container_t {
f1ap_setup_req_t
*
setup_req
;
NR_MIB_t
*
mib
;
NR_SIB1_t
*
sib1
;
NR_MeasurementTimingConfiguration_t
*
mtc
;
}
nr_rrc_du_container_t
;
typedef
struct
nr_rrc_cuup_container_t
{
...
...
This diff is collapsed.
Click to expand it.
openair2/RRC/NR/rrc_gNB_du.c
View file @
2f81f190
...
...
@@ -80,6 +80,30 @@ static bool extract_sys_info(const f1ap_gnb_du_system_info_t *sys_info, NR_MIB_t
return
true
;
}
static
NR_MeasurementTimingConfiguration_t
*
extract_mtc
(
uint8_t
*
buf
,
int
buf_len
)
{
NR_MeasurementTimingConfiguration_t
*
mtc
=
NULL
;
asn_dec_rval_t
dec_rval
=
uper_decode_complete
(
NULL
,
&
asn_DEF_NR_MeasurementTimingConfiguration
,
(
void
**
)
&
mtc
,
buf
,
buf_len
);
if
(
dec_rval
.
code
!=
RC_OK
)
{
ASN_STRUCT_FREE
(
asn_DEF_NR_MeasurementTimingConfiguration
,
mtc
);
return
NULL
;
}
/* verify that it has the format we need */
if
(
mtc
->
criticalExtensions
.
present
!=
NR_MeasurementTimingConfiguration__criticalExtensions_PR_c1
||
mtc
->
criticalExtensions
.
choice
.
c1
==
NULL
||
mtc
->
criticalExtensions
.
choice
.
c1
->
present
!=
NR_MeasurementTimingConfiguration__criticalExtensions__c1_PR_measTimingConf
||
mtc
->
criticalExtensions
.
choice
.
c1
->
choice
.
measTimingConf
==
NULL
||
mtc
->
criticalExtensions
.
choice
.
c1
->
choice
.
measTimingConf
->
measTiming
==
NULL
||
mtc
->
criticalExtensions
.
choice
.
c1
->
choice
.
measTimingConf
->
measTiming
->
list
.
count
==
0
)
{
LOG_E
(
RRC
,
"error: measurementTimingConfiguration does not have expected format (at least one measTiming entry
\n
"
);
if
(
LOG_DEBUGFLAG
(
DEBUG_ASN1
))
xer_fprint
(
stdout
,
&
asn_DEF_NR_MeasurementTimingConfiguration
,
mtc
);
ASN_STRUCT_FREE
(
asn_DEF_NR_MeasurementTimingConfiguration
,
mtc
);
return
NULL
;
}
return
mtc
;
}
void
rrc_gNB_process_f1_setup_req
(
f1ap_setup_req_t
*
req
,
sctp_assoc_t
assoc_id
)
{
AssertFatal
(
assoc_id
!=
0
,
"illegal assoc_id == 0: should be -1 (monolithic) or >0 (split)
\n
"
);
...
...
@@ -142,6 +166,15 @@ void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *req, sctp_assoc_t assoc_id)
}
}
NR_MeasurementTimingConfiguration_t
*
mtc
=
extract_mtc
(
cell_info
->
measurement_timing_config
,
cell_info
->
measurement_timing_config_len
);
if
(
!
mtc
)
{
LOG_W
(
RRC
,
"cannot decode MeasurementTimingConfiguration of DU ID %ld, rejecting
\n
"
,
req
->
gNB_DU_id
);
f1ap_setup_failure_t
fail
=
{.
cause
=
F1AP_CauseProtocol_semantic_error
};
rrc
->
mac_rrc
.
f1_setup_failure
(
assoc_id
,
&
fail
);
return
;
}
const
f1ap_gnb_du_system_info_t
*
sys_info
=
req
->
cell
[
0
].
sys_info
;
NR_MIB_t
*
mib
=
NULL
;
NR_SIB1_t
*
sib1
=
NULL
;
...
...
@@ -151,6 +184,7 @@ void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *req, sctp_assoc_t assoc_id)
LOG_W
(
RRC
,
"rejecting DU ID %ld
\n
"
,
req
->
gNB_DU_id
);
f1ap_setup_failure_t
fail
=
{.
cause
=
F1AP_CauseProtocol_semantic_error
};
rrc
->
mac_rrc
.
f1_setup_failure
(
assoc_id
,
&
fail
);
ASN_STRUCT_FREE
(
asn_DEF_NR_MeasurementTimingConfiguration
,
mtc
);
return
;
}
}
...
...
@@ -171,6 +205,7 @@ void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *req, sctp_assoc_t assoc_id)
// MIB can be null and configured later via DU Configuration Update
du
->
mib
=
mib
;
du
->
sib1
=
sib1
;
du
->
mtc
=
mtc
;
RB_INSERT
(
rrc_du_tree
,
&
rrc
->
dus
,
du
);
rrc
->
num_dus
++
;
...
...
@@ -234,6 +269,16 @@ static void update_cell_info(nr_rrc_du_container_t *du, const f1ap_served_cell_i
ci
->
tdd
=
new_ci
->
tdd
;
else
ci
->
fdd
=
new_ci
->
fdd
;
NR_MeasurementTimingConfiguration_t
*
new_mtc
=
extract_mtc
(
new_ci
->
measurement_timing_config
,
new_ci
->
measurement_timing_config_len
);
if
(
new_mtc
!=
NULL
)
{
ASN_STRUCT_FREE
(
asn_DEF_NR_MeasurementTimingConfiguration
,
du
->
mtc
);
du
->
mtc
=
new_mtc
;
}
else
{
LOG_E
(
RRC
,
"error decoding MeasurementTimingConfiguration during cell update, ignoring new config
\n
"
);
ASN_STRUCT_FREE
(
asn_DEF_NR_MeasurementTimingConfiguration
,
new_mtc
);
}
}
void
rrc_gNB_process_f1_du_configuration_update
(
f1ap_gnb_du_configuration_update_t
*
conf_up
,
sctp_assoc_t
assoc_id
)
...
...
@@ -321,6 +366,7 @@ void rrc_CU_process_f1_lost_connection(gNB_RRC_INST *rrc, f1ap_lost_connection_t
LOG_I
(
RRC
,
"releasing DU ID %ld (%s) on assoc_id %d
\n
"
,
req
->
gNB_DU_id
,
req
->
gNB_DU_name
,
assoc_id
);
ASN_STRUCT_FREE
(
asn_DEF_NR_MIB
,
du
->
mib
);
ASN_STRUCT_FREE
(
asn_DEF_NR_SIB1
,
du
->
sib1
);
ASN_STRUCT_FREE
(
asn_DEF_NR_MeasurementTimingConfiguration
,
du
->
mtc
);
/* TODO: free setup request */
nr_rrc_du_container_t
*
removed
=
RB_REMOVE
(
rrc_du_tree
,
&
rrc
->
dus
,
du
);
DevAssert
(
removed
!=
NULL
);
...
...
This diff is collapsed.
Click to expand it.
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