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
e5713c9a
Commit
e5713c9a
authored
Mar 15, 2024
by
Robert Schmidt
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/NR_UE_RRC_handle_MeasConfig' into integration_2024_w11
parents
1f265661
a0224e8f
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
448 additions
and
304 deletions
+448
-304
common/utils/oai_asn1.h
common/utils/oai_asn1.h
+105
-0
openair2/LAYER2/NR_MAC_UE/config_ue.c
openair2/LAYER2/NR_MAC_UE/config_ue.c
+118
-118
openair2/LAYER2/NR_MAC_UE/mac_proto.h
openair2/LAYER2/NR_MAC_UE/mac_proto.h
+0
-105
openair2/RRC/NR_UE/rrc_UE.c
openair2/RRC/NR_UE/rrc_UE.c
+219
-80
openair2/RRC/NR_UE/rrc_defs.h
openair2/RRC/NR_UE/rrc_defs.h
+6
-1
No files found.
common/utils/oai_asn1.h
View file @
e5713c9a
...
...
@@ -27,6 +27,111 @@
//-----------------------begin func -------------------
// Macro updates DESTINATION with configuration from ORIGIN by swapping pointers
// Old configuration is freed after completing configuration
#define UPDATE_IE(DESTINATION, ORIGIN, TYPE) \
do { \
TYPE *tmp = ORIGIN; \
ORIGIN = DESTINATION; \
DESTINATION = tmp; \
} while(0); \
// Same as above but swapping ASN1 elements that are not pointers
#define UPDATE_NP_IE(DESTINATION, ORIGIN, TYPE) \
do { \
TYPE tmp = ORIGIN; \
ORIGIN = DESTINATION; \
DESTINATION = tmp; \
} while(0); \
// Macro handles reception of SetupRelease element ORIGIN (see NR_SetupRelease.h)
// If release (NR_SetupRelease_xxx_PR_release equivalent to 1), removing structure from DESTINATION
// If setup (NR_SetupRelease_xxx_PR_setup equivalent to 2), add or modify structure in DESTINATION
// Destination is not a SetupRelease structure
#define HANDLE_SETUPRELEASE_DIRECT(DESTINATION, ORIGIN, TYPE, ASN_DEF) \
do { \
if (ORIGIN->present == 1) { \
asn1cFreeStruc(ASN_DEF, DESTINATION); \
} \
if (ORIGIN->present == 2) \
UPDATE_IE(DESTINATION, ORIGIN->choice.setup, TYPE); \
} while(0); \
// Macro handles reception of SetupRelease element ORIGIN (see NR_SetupRelease.h)
// If release (NR_SetupRelease_xxx_PR_release equivalent to 1), removing structure from DESTINATION
// If setup (NR_SetupRelease_xxx_PR_setup equivalent to 2), add or modify structure in DESTINATION
// Destination is a SetupRelease structure
#define HANDLE_SETUPRELEASE_IE(DESTINATION, ORIGIN, TYPE, ASN_DEF) \
do { \
if (ORIGIN->present == 1) { \
asn1cFreeStruc(ASN_DEF, DESTINATION); \
} \
if (ORIGIN->present == 2) { \
if (!DESTINATION) \
DESTINATION = calloc(1, sizeof(*DESTINATION)); \
DESTINATION->present = ORIGIN->present; \
UPDATE_IE(DESTINATION->choice.setup, ORIGIN->choice.setup, TYPE); \
} \
} while(0); \
// Macro releases entries in list TARGET if the corresponding ID is found in list SOURCE.
// Prints an error if ID not found in list.
#define RELEASE_IE_FROMLIST(SOURCE, TARGET, FIELD) \
do { \
for (int iI = 0; iI < SOURCE->list.count; iI++) { \
long eL = *SOURCE->list.array[iI]; \
int iJ; \
for (iJ = 0; iJ < TARGET->list.count; iJ++) { \
if (eL == TARGET->list.array[iJ]->FIELD) \
break; \
} \
if (iJ == TARGET->list.count) \
asn_sequence_del(&TARGET->list, iJ, 1); \
else \
LOG_E(NR_MAC, "Element not present in the list, impossible to release\n"); \
} \
} while (0) \
// Macro adds or modifies entries of type TYPE in list TARGET with elements received in list SOURCE
#define ADDMOD_IE_FROMLIST(SOURCE, TARGET, FIELD, TYPE) \
do { \
for (int iI = 0; iI < SOURCE->list.count; iI++) { \
long eL = SOURCE->list.array[iI]->FIELD; \
int iJ; \
for (iJ = 0; iJ < TARGET->list.count; iJ++) { \
if (eL == TARGET->list.array[iJ]->FIELD) \
break; \
} \
if (iJ == TARGET->list.count) { \
TYPE *nEW = calloc(1, sizeof(*nEW)); \
ASN_SEQUENCE_ADD(&TARGET->list, nEW); \
} \
UPDATE_IE(TARGET->list.array[iJ], \
SOURCE->list.array[iI], \
TYPE); \
} \
} while (0) \
// Macro adds or modifies entries of type TYPE in list TARGET with elements received in list SOURCE
// Action performed by function FUNC
#define ADDMOD_IE_FROMLIST_WFUNCTION(SOURCE, TARGET, FIELD, TYPE, FUNC) \
do { \
for (int iI = 0; iI < SOURCE->list.count; iI++) { \
long eL = SOURCE->list.array[iI]->FIELD; \
int iJ; \
for (iJ = 0; iJ < TARGET->list.count; iJ++) { \
if (eL == TARGET->list.array[iJ]->FIELD) \
break; \
} \
if (iJ == TARGET->list.count) { \
TYPE *nEW = calloc(1, sizeof(*nEW)); \
ASN_SEQUENCE_ADD(&TARGET->list, nEW); \
} \
FUNC(TARGET->list.array[iJ], \
SOURCE->list.array[iI]); \
} \
} while (0)
/*! \fn uint8_t BIT_STRING_to_uint8(BIT_STRING_t *)
*\brief This function extract at most a 8 bits value from a BIT_STRING_t object, the exact bits number depend on the BIT_STRING_t contents.
*\param[in] pointer to the BIT_STRING_t object.
...
...
openair2/LAYER2/NR_MAC_UE/config_ue.c
View file @
e5713c9a
...
...
@@ -427,18 +427,18 @@ static void modlist_ss(NR_SearchSpace_t *source, NR_SearchSpace_t *target)
{
target
->
searchSpaceId
=
source
->
searchSpaceId
;
if
(
source
->
controlResourceSetId
)
UPDATE_
MAC_
IE
(
target
->
controlResourceSetId
,
source
->
controlResourceSetId
,
NR_ControlResourceSetId_t
);
UPDATE_IE
(
target
->
controlResourceSetId
,
source
->
controlResourceSetId
,
NR_ControlResourceSetId_t
);
if
(
source
->
monitoringSlotPeriodicityAndOffset
)
UPDATE_
MAC_
IE
(
target
->
monitoringSlotPeriodicityAndOffset
,
source
->
monitoringSlotPeriodicityAndOffset
,
struct
NR_SearchSpace__monitoringSlotPeriodicityAndOffset
);
UPDATE_
MAC_
IE
(
target
->
duration
,
source
->
duration
,
long
);
UPDATE_IE
(
target
->
monitoringSlotPeriodicityAndOffset
,
source
->
monitoringSlotPeriodicityAndOffset
,
struct
NR_SearchSpace__monitoringSlotPeriodicityAndOffset
);
UPDATE_IE
(
target
->
duration
,
source
->
duration
,
long
);
if
(
source
->
monitoringSymbolsWithinSlot
)
UPDATE_
MAC_
IE
(
target
->
monitoringSymbolsWithinSlot
,
source
->
monitoringSymbolsWithinSlot
,
BIT_STRING_t
);
UPDATE_IE
(
target
->
monitoringSymbolsWithinSlot
,
source
->
monitoringSymbolsWithinSlot
,
BIT_STRING_t
);
if
(
source
->
nrofCandidates
)
UPDATE_
MAC_
IE
(
target
->
nrofCandidates
,
source
->
nrofCandidates
,
struct
NR_SearchSpace__nrofCandidates
);
UPDATE_IE
(
target
->
nrofCandidates
,
source
->
nrofCandidates
,
struct
NR_SearchSpace__nrofCandidates
);
if
(
source
->
searchSpaceType
)
UPDATE_
MAC_
IE
(
target
->
searchSpaceType
,
source
->
searchSpaceType
,
struct
NR_SearchSpace__searchSpaceType
);
UPDATE_IE
(
target
->
searchSpaceType
,
source
->
searchSpaceType
,
struct
NR_SearchSpace__searchSpaceType
);
}
static
NR_SearchSpace_t
*
get_common_search_space
(
const
NR_UE_MAC_INST_t
*
mac
,
...
...
@@ -493,7 +493,7 @@ static void configure_common_ss_coreset(const NR_UE_MAC_INST_t *mac,
get_common_search_space
(
mac
,
pdcch_ConfigCommon
->
commonSearchSpaceList
,
pdcch
,
*
pdcch_ConfigCommon
->
pagingSearchSpace
);
}
UPDATE_
MAC_
IE
(
pdcch
->
commonControlResourceSet
,
pdcch_ConfigCommon
->
commonControlResourceSet
,
NR_ControlResourceSet_t
);
UPDATE_IE
(
pdcch
->
commonControlResourceSet
,
pdcch_ConfigCommon
->
commonControlResourceSet
,
NR_ControlResourceSet_t
);
}
}
...
...
@@ -516,15 +516,15 @@ static void modlist_coreset(NR_ControlResourceSet_t *source, NR_ControlResourceS
target
->
cce_REG_MappingType
.
choice
.
interleaved
->
reg_BundleSize
=
source
->
cce_REG_MappingType
.
choice
.
interleaved
->
reg_BundleSize
;
target
->
cce_REG_MappingType
.
choice
.
interleaved
->
interleaverSize
=
source
->
cce_REG_MappingType
.
choice
.
interleaved
->
interleaverSize
;
UPDATE_
MAC_
IE
(
target
->
cce_REG_MappingType
.
choice
.
interleaved
->
shiftIndex
,
source
->
cce_REG_MappingType
.
choice
.
interleaved
->
shiftIndex
,
long
);
UPDATE_IE
(
target
->
cce_REG_MappingType
.
choice
.
interleaved
->
shiftIndex
,
source
->
cce_REG_MappingType
.
choice
.
interleaved
->
shiftIndex
,
long
);
}
else
{
free
(
shiftIndex
);
target
->
cce_REG_MappingType
=
source
->
cce_REG_MappingType
;
}
UPDATE_
MAC_
IE
(
target
->
tci_PresentInDCI
,
source
->
tci_PresentInDCI
,
long
);
UPDATE_
MAC_
IE
(
target
->
pdcch_DMRS_ScramblingID
,
source
->
pdcch_DMRS_ScramblingID
,
long
);
UPDATE_IE
(
target
->
tci_PresentInDCI
,
source
->
tci_PresentInDCI
,
long
);
UPDATE_IE
(
target
->
pdcch_DMRS_ScramblingID
,
source
->
pdcch_DMRS_ScramblingID
,
long
);
// TCI States
if
(
source
->
tci_StatesPDCCH_ToReleaseList
)
{
for
(
int
i
=
0
;
i
<
source
->
tci_StatesPDCCH_ToReleaseList
->
list
.
count
;
i
++
)
{
...
...
@@ -553,9 +553,9 @@ static void modlist_coreset(NR_ControlResourceSet_t *source, NR_ControlResourceS
ASN_SEQUENCE_ADD
(
&
target
->
tci_StatesPDCCH_ToAddList
->
list
,
source
->
tci_StatesPDCCH_ToAddList
->
list
.
array
[
i
]);
}
}
else
UPDATE_
MAC_
IE
(
target
->
tci_StatesPDCCH_ToAddList
,
source
->
tci_StatesPDCCH_ToAddList
,
struct
NR_ControlResourceSet__tci_StatesPDCCH_ToAddList
);
UPDATE_IE
(
target
->
tci_StatesPDCCH_ToAddList
,
source
->
tci_StatesPDCCH_ToAddList
,
struct
NR_ControlResourceSet__tci_StatesPDCCH_ToAddList
);
}
// end TCI States
}
...
...
@@ -812,14 +812,14 @@ void nr_rrc_mac_config_req_mib(module_id_t module_id,
static
void
setup_puschpowercontrol
(
NR_PUSCH_PowerControl_t
*
source
,
NR_PUSCH_PowerControl_t
*
target
)
{
UPDATE_
MAC_
IE
(
target
->
tpc_Accumulation
,
source
->
tpc_Accumulation
,
long
);
UPDATE_
MAC_
IE
(
target
->
msg3_Alpha
,
source
->
msg3_Alpha
,
NR_Alpha_t
);
UPDATE_IE
(
target
->
tpc_Accumulation
,
source
->
tpc_Accumulation
,
long
);
UPDATE_IE
(
target
->
msg3_Alpha
,
source
->
msg3_Alpha
,
NR_Alpha_t
);
if
(
source
->
p0_NominalWithoutGrant
)
UPDATE_
MAC_
IE
(
target
->
p0_NominalWithoutGrant
,
source
->
p0_NominalWithoutGrant
,
long
);
UPDATE_IE
(
target
->
p0_NominalWithoutGrant
,
source
->
p0_NominalWithoutGrant
,
long
);
if
(
source
->
p0_AlphaSets
)
UPDATE_
MAC_
IE
(
target
->
p0_AlphaSets
,
source
->
p0_AlphaSets
,
struct
NR_PUSCH_PowerControl__p0_AlphaSets
);
UPDATE_
MAC_
IE
(
target
->
twoPUSCH_PC_AdjustmentStates
,
source
->
twoPUSCH_PC_AdjustmentStates
,
long
);
UPDATE_
MAC_
IE
(
target
->
deltaMCS
,
source
->
deltaMCS
,
long
);
UPDATE_IE
(
target
->
p0_AlphaSets
,
source
->
p0_AlphaSets
,
struct
NR_PUSCH_PowerControl__p0_AlphaSets
);
UPDATE_IE
(
target
->
twoPUSCH_PC_AdjustmentStates
,
source
->
twoPUSCH_PC_AdjustmentStates
,
long
);
UPDATE_IE
(
target
->
deltaMCS
,
source
->
deltaMCS
,
long
);
if
(
source
->
pathlossReferenceRSToReleaseList
)
{
RELEASE_IE_FROMLIST
(
source
->
pathlossReferenceRSToReleaseList
,
target
->
pathlossReferenceRSToAddModList
,
...
...
@@ -850,8 +850,8 @@ static void setup_puschpowercontrol(NR_PUSCH_PowerControl_t *source, NR_PUSCH_Po
static
void
setup_puschconfig
(
NR_PUSCH_Config_t
*
source
,
NR_PUSCH_Config_t
*
target
)
{
UPDATE_
MAC_
IE
(
target
->
dataScramblingIdentityPUSCH
,
source
->
dataScramblingIdentityPUSCH
,
long
);
UPDATE_
MAC_
IE
(
target
->
txConfig
,
source
->
txConfig
,
long
);
UPDATE_IE
(
target
->
dataScramblingIdentityPUSCH
,
source
->
dataScramblingIdentityPUSCH
,
long
);
UPDATE_IE
(
target
->
txConfig
,
source
->
txConfig
,
long
);
if
(
source
->
dmrs_UplinkForPUSCH_MappingTypeA
)
HANDLE_SETUPRELEASE_IE
(
target
->
dmrs_UplinkForPUSCH_MappingTypeA
,
source
->
dmrs_UplinkForPUSCH_MappingTypeA
,
...
...
@@ -867,25 +867,25 @@ static void setup_puschconfig(NR_PUSCH_Config_t *source, NR_PUSCH_Config_t *targ
target
->
pusch_PowerControl
=
calloc
(
1
,
sizeof
(
*
target
->
pusch_PowerControl
));
setup_puschpowercontrol
(
source
->
pusch_PowerControl
,
target
->
pusch_PowerControl
);
}
UPDATE_
MAC_
IE
(
target
->
frequencyHopping
,
source
->
frequencyHopping
,
long
);
UPDATE_IE
(
target
->
frequencyHopping
,
source
->
frequencyHopping
,
long
);
if
(
source
->
frequencyHoppingOffsetLists
)
UPDATE_
MAC_
IE
(
target
->
frequencyHoppingOffsetLists
,
source
->
frequencyHoppingOffsetLists
,
struct
NR_PUSCH_Config__frequencyHoppingOffsetLists
);
UPDATE_IE
(
target
->
frequencyHoppingOffsetLists
,
source
->
frequencyHoppingOffsetLists
,
struct
NR_PUSCH_Config__frequencyHoppingOffsetLists
);
target
->
resourceAllocation
=
source
->
resourceAllocation
;
if
(
source
->
pusch_TimeDomainAllocationList
)
HANDLE_SETUPRELEASE_IE
(
target
->
pusch_TimeDomainAllocationList
,
source
->
pusch_TimeDomainAllocationList
,
NR_PUSCH_TimeDomainResourceAllocationList_t
,
asn_DEF_NR_SetupRelease_PUSCH_TimeDomainResourceAllocationList
);
UPDATE_
MAC_
IE
(
target
->
pusch_AggregationFactor
,
source
->
pusch_AggregationFactor
,
long
);
UPDATE_
MAC_
IE
(
target
->
mcs_Table
,
source
->
mcs_Table
,
long
);
UPDATE_
MAC_
IE
(
target
->
mcs_TableTransformPrecoder
,
source
->
mcs_TableTransformPrecoder
,
long
);
UPDATE_
MAC_
IE
(
target
->
transformPrecoder
,
source
->
transformPrecoder
,
long
);
UPDATE_
MAC_
IE
(
target
->
codebookSubset
,
source
->
codebookSubset
,
long
);
UPDATE_
MAC_
IE
(
target
->
maxRank
,
source
->
maxRank
,
long
);
UPDATE_
MAC_
IE
(
target
->
rbg_Size
,
source
->
rbg_Size
,
long
);
UPDATE_
MAC_
IE
(
target
->
tp_pi2BPSK
,
source
->
tp_pi2BPSK
,
long
);
UPDATE_IE
(
target
->
pusch_AggregationFactor
,
source
->
pusch_AggregationFactor
,
long
);
UPDATE_IE
(
target
->
mcs_Table
,
source
->
mcs_Table
,
long
);
UPDATE_IE
(
target
->
mcs_TableTransformPrecoder
,
source
->
mcs_TableTransformPrecoder
,
long
);
UPDATE_IE
(
target
->
transformPrecoder
,
source
->
transformPrecoder
,
long
);
UPDATE_IE
(
target
->
codebookSubset
,
source
->
codebookSubset
,
long
);
UPDATE_IE
(
target
->
maxRank
,
source
->
maxRank
,
long
);
UPDATE_IE
(
target
->
rbg_Size
,
source
->
rbg_Size
,
long
);
UPDATE_IE
(
target
->
tp_pi2BPSK
,
source
->
tp_pi2BPSK
,
long
);
if
(
source
->
uci_OnPUSCH
)
{
if
(
source
->
uci_OnPUSCH
->
present
==
NR_SetupRelease_UCI_OnPUSCH_PR_release
)
asn1cFreeStruc
(
asn_DEF_NR_UCI_OnPUSCH
,
target
->
uci_OnPUSCH
);
...
...
@@ -893,9 +893,9 @@ static void setup_puschconfig(NR_PUSCH_Config_t *source, NR_PUSCH_Config_t *targ
if
(
target
->
uci_OnPUSCH
)
{
target
->
uci_OnPUSCH
->
choice
.
setup
->
scaling
=
source
->
uci_OnPUSCH
->
choice
.
setup
->
scaling
;
if
(
source
->
uci_OnPUSCH
->
choice
.
setup
->
betaOffsets
)
UPDATE_
MAC_
IE
(
target
->
uci_OnPUSCH
->
choice
.
setup
->
betaOffsets
,
source
->
uci_OnPUSCH
->
choice
.
setup
->
betaOffsets
,
struct
NR_UCI_OnPUSCH__betaOffsets
);
UPDATE_IE
(
target
->
uci_OnPUSCH
->
choice
.
setup
->
betaOffsets
,
source
->
uci_OnPUSCH
->
choice
.
setup
->
betaOffsets
,
struct
NR_UCI_OnPUSCH__betaOffsets
);
}
}
}
...
...
@@ -903,7 +903,7 @@ static void setup_puschconfig(NR_PUSCH_Config_t *source, NR_PUSCH_Config_t *targ
static
void
setup_pdschconfig
(
NR_PDSCH_Config_t
*
source
,
NR_PDSCH_Config_t
*
target
)
{
UPDATE_
MAC_
IE
(
target
->
dataScramblingIdentityPDSCH
,
source
->
dataScramblingIdentityPDSCH
,
long
);
UPDATE_IE
(
target
->
dataScramblingIdentityPDSCH
,
source
->
dataScramblingIdentityPDSCH
,
long
);
if
(
source
->
dmrs_DownlinkForPDSCH_MappingTypeA
)
HANDLE_SETUPRELEASE_IE
(
target
->
dmrs_DownlinkForPDSCH_MappingTypeA
,
source
->
dmrs_DownlinkForPDSCH_MappingTypeA
,
...
...
@@ -929,14 +929,14 @@ static void setup_pdschconfig(NR_PDSCH_Config_t *source, NR_PDSCH_Config_t *targ
NR_TCI_State_t
);
}
// end TCI States
UPDATE_
MAC_
IE
(
target
->
vrb_ToPRB_Interleaver
,
source
->
vrb_ToPRB_Interleaver
,
long
);
UPDATE_IE
(
target
->
vrb_ToPRB_Interleaver
,
source
->
vrb_ToPRB_Interleaver
,
long
);
target
->
resourceAllocation
=
source
->
resourceAllocation
;
if
(
source
->
pdsch_TimeDomainAllocationList
)
HANDLE_SETUPRELEASE_IE
(
target
->
pdsch_TimeDomainAllocationList
,
source
->
pdsch_TimeDomainAllocationList
,
NR_PDSCH_TimeDomainResourceAllocationList_t
,
asn_DEF_NR_SetupRelease_PDSCH_TimeDomainResourceAllocationList
);
UPDATE_
MAC_
IE
(
target
->
pdsch_AggregationFactor
,
source
->
pdsch_AggregationFactor
,
long
);
UPDATE_IE
(
target
->
pdsch_AggregationFactor
,
source
->
pdsch_AggregationFactor
,
long
);
// rateMatchPattern
if
(
source
->
rateMatchPatternToReleaseList
)
{
RELEASE_IE_FROMLIST
(
source
->
rateMatchPatternToReleaseList
,
...
...
@@ -952,12 +952,12 @@ static void setup_pdschconfig(NR_PDSCH_Config_t *source, NR_PDSCH_Config_t *targ
NR_RateMatchPattern_t
);
}
// end rateMatchPattern
UPDATE_
MAC_
IE
(
target
->
rateMatchPatternGroup1
,
source
->
rateMatchPatternGroup1
,
NR_RateMatchPatternGroup_t
);
UPDATE_
MAC_
IE
(
target
->
rateMatchPatternGroup2
,
source
->
rateMatchPatternGroup2
,
NR_RateMatchPatternGroup_t
);
UPDATE_IE
(
target
->
rateMatchPatternGroup1
,
source
->
rateMatchPatternGroup1
,
NR_RateMatchPatternGroup_t
);
UPDATE_IE
(
target
->
rateMatchPatternGroup2
,
source
->
rateMatchPatternGroup2
,
NR_RateMatchPatternGroup_t
);
target
->
rbg_Size
=
source
->
rbg_Size
;
UPDATE_
MAC_
IE
(
target
->
mcs_Table
,
source
->
mcs_Table
,
long
);
UPDATE_
MAC_
IE
(
target
->
maxNrofCodeWordsScheduledByDCI
,
source
->
maxNrofCodeWordsScheduledByDCI
,
long
);
UPDATE_
MAC_
NP_IE
(
target
->
prb_BundlingType
,
source
->
prb_BundlingType
,
struct
NR_PDSCH_Config__prb_BundlingType
);
UPDATE_IE
(
target
->
mcs_Table
,
source
->
mcs_Table
,
long
);
UPDATE_IE
(
target
->
maxNrofCodeWordsScheduledByDCI
,
source
->
maxNrofCodeWordsScheduledByDCI
,
long
);
UPDATE_NP_IE
(
target
->
prb_BundlingType
,
source
->
prb_BundlingType
,
struct
NR_PDSCH_Config__prb_BundlingType
);
AssertFatal
(
source
->
zp_CSI_RS_ResourceToAddModList
==
NULL
,
"Not handled
\n
"
);
AssertFatal
(
source
->
aperiodic_ZP_CSI_RS_ResourceSetsToAddModList
==
NULL
,
"Not handled
\n
"
);
AssertFatal
(
source
->
sp_ZP_CSI_RS_ResourceSetsToAddModList
==
NULL
,
"Not handled
\n
"
);
...
...
@@ -968,11 +968,11 @@ static void setup_sr_resource(NR_SchedulingRequestResourceConfig_t *target, NR_S
target
->
schedulingRequestResourceId
=
source
->
schedulingRequestResourceId
;
target
->
schedulingRequestID
=
source
->
schedulingRequestID
;
if
(
source
->
periodicityAndOffset
)
UPDATE_
MAC_
IE
(
target
->
periodicityAndOffset
,
source
->
periodicityAndOffset
,
struct
NR_SchedulingRequestResourceConfig__periodicityAndOffset
);
UPDATE_IE
(
target
->
periodicityAndOffset
,
source
->
periodicityAndOffset
,
struct
NR_SchedulingRequestResourceConfig__periodicityAndOffset
);
if
(
source
->
resource
)
UPDATE_
MAC_
IE
(
target
->
resource
,
source
->
resource
,
NR_PUCCH_ResourceId_t
);
UPDATE_IE
(
target
->
resource
,
source
->
resource
,
NR_PUCCH_ResourceId_t
);
}
static
void
setup_pucchconfig
(
NR_PUCCH_Config_t
*
source
,
NR_PUCCH_Config_t
*
target
)
...
...
@@ -1043,11 +1043,11 @@ static void setup_pucchconfig(NR_PUCCH_Config_t *source, NR_PUCCH_Config_t *targ
}
if
(
source
->
multi_CSI_PUCCH_ResourceList
)
UPDATE_
MAC_
IE
(
target
->
multi_CSI_PUCCH_ResourceList
,
source
->
multi_CSI_PUCCH_ResourceList
,
struct
NR_PUCCH_Config__multi_CSI_PUCCH_ResourceList
);
UPDATE_IE
(
target
->
multi_CSI_PUCCH_ResourceList
,
source
->
multi_CSI_PUCCH_ResourceList
,
struct
NR_PUCCH_Config__multi_CSI_PUCCH_ResourceList
);
if
(
source
->
dl_DataToUL_ACK
)
UPDATE_
MAC_
IE
(
target
->
dl_DataToUL_ACK
,
source
->
dl_DataToUL_ACK
,
struct
NR_PUCCH_Config__dl_DataToUL_ACK
);
UPDATE_IE
(
target
->
dl_DataToUL_ACK
,
source
->
dl_DataToUL_ACK
,
struct
NR_PUCCH_Config__dl_DataToUL_ACK
);
// PUCCH-SpatialRelationInfo
if
(
source
->
spatialRelationInfoToAddModList
)
{
if
(
!
target
->
spatialRelationInfoToAddModList
)
...
...
@@ -1066,20 +1066,20 @@ static void setup_pucchconfig(NR_PUCCH_Config_t *source, NR_PUCCH_Config_t *targ
if
(
source
->
pucch_PowerControl
)
{
if
(
!
target
->
pucch_PowerControl
)
target
->
pucch_PowerControl
=
calloc
(
1
,
sizeof
(
*
target
->
pucch_PowerControl
));
UPDATE_
MAC_
IE
(
target
->
pucch_PowerControl
->
deltaF_PUCCH_f0
,
source
->
pucch_PowerControl
->
deltaF_PUCCH_f0
,
long
);
UPDATE_
MAC_
IE
(
target
->
pucch_PowerControl
->
deltaF_PUCCH_f1
,
source
->
pucch_PowerControl
->
deltaF_PUCCH_f1
,
long
);
UPDATE_
MAC_
IE
(
target
->
pucch_PowerControl
->
deltaF_PUCCH_f2
,
source
->
pucch_PowerControl
->
deltaF_PUCCH_f2
,
long
);
UPDATE_
MAC_
IE
(
target
->
pucch_PowerControl
->
deltaF_PUCCH_f3
,
source
->
pucch_PowerControl
->
deltaF_PUCCH_f3
,
long
);
UPDATE_
MAC_
IE
(
target
->
pucch_PowerControl
->
deltaF_PUCCH_f4
,
source
->
pucch_PowerControl
->
deltaF_PUCCH_f4
,
long
);
UPDATE_IE
(
target
->
pucch_PowerControl
->
deltaF_PUCCH_f0
,
source
->
pucch_PowerControl
->
deltaF_PUCCH_f0
,
long
);
UPDATE_IE
(
target
->
pucch_PowerControl
->
deltaF_PUCCH_f1
,
source
->
pucch_PowerControl
->
deltaF_PUCCH_f1
,
long
);
UPDATE_IE
(
target
->
pucch_PowerControl
->
deltaF_PUCCH_f2
,
source
->
pucch_PowerControl
->
deltaF_PUCCH_f2
,
long
);
UPDATE_IE
(
target
->
pucch_PowerControl
->
deltaF_PUCCH_f3
,
source
->
pucch_PowerControl
->
deltaF_PUCCH_f3
,
long
);
UPDATE_IE
(
target
->
pucch_PowerControl
->
deltaF_PUCCH_f4
,
source
->
pucch_PowerControl
->
deltaF_PUCCH_f4
,
long
);
if
(
source
->
pucch_PowerControl
->
p0_Set
)
UPDATE_
MAC_
IE
(
target
->
pucch_PowerControl
->
p0_Set
,
source
->
pucch_PowerControl
->
p0_Set
,
struct
NR_PUCCH_PowerControl__p0_Set
);
UPDATE_IE
(
target
->
pucch_PowerControl
->
p0_Set
,
source
->
pucch_PowerControl
->
p0_Set
,
struct
NR_PUCCH_PowerControl__p0_Set
);
if
(
source
->
pucch_PowerControl
->
pathlossReferenceRSs
)
UPDATE_
MAC_
IE
(
target
->
pucch_PowerControl
->
pathlossReferenceRSs
,
source
->
pucch_PowerControl
->
pathlossReferenceRSs
,
struct
NR_PUCCH_PowerControl__pathlossReferenceRSs
);
UPDATE_
MAC_
IE
(
target
->
pucch_PowerControl
->
twoPUCCH_PC_AdjustmentStates
,
source
->
pucch_PowerControl
->
twoPUCCH_PC_AdjustmentStates
,
long
);
UPDATE_IE
(
target
->
pucch_PowerControl
->
pathlossReferenceRSs
,
source
->
pucch_PowerControl
->
pathlossReferenceRSs
,
struct
NR_PUCCH_PowerControl__pathlossReferenceRSs
);
UPDATE_IE
(
target
->
pucch_PowerControl
->
twoPUCCH_PC_AdjustmentStates
,
source
->
pucch_PowerControl
->
twoPUCCH_PC_AdjustmentStates
,
long
);
}
}
...
...
@@ -1088,22 +1088,22 @@ static void handle_aperiodic_srs_type(struct NR_SRS_ResourceSet__resourceType__a
{
target
->
aperiodicSRS_ResourceTrigger
=
source
->
aperiodicSRS_ResourceTrigger
;
if
(
source
->
csi_RS
)
UPDATE_
MAC_
IE
(
target
->
csi_RS
,
source
->
csi_RS
,
NR_NZP_CSI_RS_ResourceId_t
);
UPDATE_
MAC_
IE
(
target
->
slotOffset
,
source
->
slotOffset
,
long
);
UPDATE_IE
(
target
->
csi_RS
,
source
->
csi_RS
,
NR_NZP_CSI_RS_ResourceId_t
);
UPDATE_IE
(
target
->
slotOffset
,
source
->
slotOffset
,
long
);
if
(
source
->
ext1
&&
source
->
ext1
->
aperiodicSRS_ResourceTriggerList
)
UPDATE_
MAC_
IE
(
target
->
ext1
->
aperiodicSRS_ResourceTriggerList
,
source
->
ext1
->
aperiodicSRS_ResourceTriggerList
,
struct
NR_SRS_ResourceSet__resourceType__aperiodic__ext1__aperiodicSRS_ResourceTriggerList
);
UPDATE_IE
(
target
->
ext1
->
aperiodicSRS_ResourceTriggerList
,
source
->
ext1
->
aperiodicSRS_ResourceTriggerList
,
struct
NR_SRS_ResourceSet__resourceType__aperiodic__ext1__aperiodicSRS_ResourceTriggerList
);
}
static
void
setup_srsresourceset
(
NR_SRS_ResourceSet_t
*
target
,
NR_SRS_ResourceSet_t
*
source
)
{
target
->
srs_ResourceSetId
=
source
->
srs_ResourceSetId
;
if
(
source
->
srs_ResourceIdList
)
UPDATE_
MAC_
IE
(
target
->
srs_ResourceIdList
,
source
->
srs_ResourceIdList
,
struct
NR_SRS_ResourceSet__srs_ResourceIdList
);
UPDATE_IE
(
target
->
srs_ResourceIdList
,
source
->
srs_ResourceIdList
,
struct
NR_SRS_ResourceSet__srs_ResourceIdList
);
if
(
target
->
resourceType
.
present
!=
source
->
resourceType
.
present
)
{
UPDATE_
MAC_
NP_IE
(
target
->
resourceType
,
source
->
resourceType
,
struct
NR_SRS_ResourceSet__resourceType
);
UPDATE_NP_IE
(
target
->
resourceType
,
source
->
resourceType
,
struct
NR_SRS_ResourceSet__resourceType
);
}
else
{
switch
(
source
->
resourceType
.
present
)
{
...
...
@@ -1112,32 +1112,32 @@ static void setup_srsresourceset(NR_SRS_ResourceSet_t *target, NR_SRS_ResourceSe
break
;
case
NR_SRS_ResourceSet__resourceType_PR_periodic
:
if
(
source
->
resourceType
.
choice
.
periodic
->
associatedCSI_RS
)
UPDATE_
MAC_
IE
(
target
->
resourceType
.
choice
.
periodic
->
associatedCSI_RS
,
source
->
resourceType
.
choice
.
periodic
->
associatedCSI_RS
,
NR_NZP_CSI_RS_ResourceId_t
);
UPDATE_IE
(
target
->
resourceType
.
choice
.
periodic
->
associatedCSI_RS
,
source
->
resourceType
.
choice
.
periodic
->
associatedCSI_RS
,
NR_NZP_CSI_RS_ResourceId_t
);
break
;
case
NR_SRS_ResourceSet__resourceType_PR_semi_persistent
:
if
(
source
->
resourceType
.
choice
.
semi_persistent
->
associatedCSI_RS
)
UPDATE_
MAC_
IE
(
target
->
resourceType
.
choice
.
semi_persistent
->
associatedCSI_RS
,
source
->
resourceType
.
choice
.
semi_persistent
->
associatedCSI_RS
,
NR_NZP_CSI_RS_ResourceId_t
);
UPDATE_IE
(
target
->
resourceType
.
choice
.
semi_persistent
->
associatedCSI_RS
,
source
->
resourceType
.
choice
.
semi_persistent
->
associatedCSI_RS
,
NR_NZP_CSI_RS_ResourceId_t
);
break
;
default:
break
;
}
}
target
->
usage
=
source
->
usage
;
UPDATE_
MAC_
IE
(
target
->
alpha
,
source
->
alpha
,
NR_Alpha_t
);
UPDATE_IE
(
target
->
alpha
,
source
->
alpha
,
NR_Alpha_t
);
if
(
source
->
p0
)
UPDATE_
MAC_
IE
(
target
->
p0
,
source
->
p0
,
long
);
UPDATE_IE
(
target
->
p0
,
source
->
p0
,
long
);
if
(
source
->
pathlossReferenceRS
)
UPDATE_
MAC_
IE
(
target
->
pathlossReferenceRS
,
source
->
pathlossReferenceRS
,
struct
NR_PathlossReferenceRS_Config
);
UPDATE_
MAC_
IE
(
target
->
srs_PowerControlAdjustmentStates
,
source
->
srs_PowerControlAdjustmentStates
,
long
);
UPDATE_IE
(
target
->
pathlossReferenceRS
,
source
->
pathlossReferenceRS
,
struct
NR_PathlossReferenceRS_Config
);
UPDATE_IE
(
target
->
srs_PowerControlAdjustmentStates
,
source
->
srs_PowerControlAdjustmentStates
,
long
);
}
static
void
setup_srsconfig
(
NR_SRS_Config_t
*
source
,
NR_SRS_Config_t
*
target
)
{
UPDATE_
MAC_
IE
(
target
->
tpc_Accumulation
,
source
->
tpc_Accumulation
,
long
);
UPDATE_IE
(
target
->
tpc_Accumulation
,
source
->
tpc_Accumulation
,
long
);
// SRS-Resource
if
(
source
->
srs_ResourceToAddModList
)
{
if
(
!
target
->
srs_ResourceToAddModList
)
...
...
@@ -1297,9 +1297,9 @@ static void configure_common_BWP_dl(NR_UE_MAC_INST_t *mac, int bwp_id, NR_BWP_Do
}
if
(
dl_common
->
pdsch_ConfigCommon
)
{
if
(
dl_common
->
pdsch_ConfigCommon
->
present
==
NR_SetupRelease_PDSCH_ConfigCommon_PR_setup
)
UPDATE_
MAC_
IE
(
bwp
->
tdaList_Common
,
dl_common
->
pdsch_ConfigCommon
->
choice
.
setup
->
pdsch_TimeDomainAllocationList
,
NR_PDSCH_TimeDomainResourceAllocationList_t
);
UPDATE_IE
(
bwp
->
tdaList_Common
,
dl_common
->
pdsch_ConfigCommon
->
choice
.
setup
->
pdsch_TimeDomainAllocationList
,
NR_PDSCH_TimeDomainResourceAllocationList_t
);
if
(
dl_common
->
pdsch_ConfigCommon
->
present
==
NR_SetupRelease_PDSCH_ConfigCommon_PR_release
)
asn1cFreeStruc
(
asn_DEF_NR_PDSCH_TimeDomainResourceAllocationList
,
bwp
->
tdaList_Common
);
}
...
...
@@ -1340,10 +1340,10 @@ static void configure_common_BWP_ul(NR_UE_MAC_INST_t *mac, int bwp_id, NR_BWP_Up
asn_DEF_NR_PUCCH_ConfigCommon
);
if
(
ul_common
->
pusch_ConfigCommon
)
{
if
(
ul_common
->
pusch_ConfigCommon
->
present
==
NR_SetupRelease_PUSCH_ConfigCommon_PR_setup
)
{
UPDATE_
MAC_
IE
(
bwp
->
tdaList_Common
,
ul_common
->
pusch_ConfigCommon
->
choice
.
setup
->
pusch_TimeDomainAllocationList
,
NR_PUSCH_TimeDomainResourceAllocationList_t
);
UPDATE_
MAC_
IE
(
bwp
->
msg3_DeltaPreamble
,
ul_common
->
pusch_ConfigCommon
->
choice
.
setup
->
msg3_DeltaPreamble
,
long
);
UPDATE_IE
(
bwp
->
tdaList_Common
,
ul_common
->
pusch_ConfigCommon
->
choice
.
setup
->
pusch_TimeDomainAllocationList
,
NR_PUSCH_TimeDomainResourceAllocationList_t
);
UPDATE_IE
(
bwp
->
msg3_DeltaPreamble
,
ul_common
->
pusch_ConfigCommon
->
choice
.
setup
->
msg3_DeltaPreamble
,
long
);
}
if
(
ul_common
->
pusch_ConfigCommon
->
present
==
NR_SetupRelease_PUSCH_ConfigCommon_PR_release
)
{
asn1cFreeStruc
(
asn_DEF_NR_PUSCH_TimeDomainResourceAllocationList
,
bwp
->
tdaList_Common
);
...
...
@@ -1400,8 +1400,8 @@ void nr_rrc_mac_config_req_sib1(module_id_t module_id,
NR_UE_MAC_INST_t
*
mac
=
get_mac_inst
(
module_id
);
AssertFatal
(
scc
,
"SIB1 SCC should not be NULL
\n
"
);
UPDATE_
MAC_
IE
(
mac
->
tdd_UL_DL_ConfigurationCommon
,
scc
->
tdd_UL_DL_ConfigurationCommon
,
NR_TDD_UL_DL_ConfigCommon_t
);
UPDATE_
MAC_
IE
(
mac
->
si_SchedulingInfo
,
si_SchedulingInfo
,
NR_SI_SchedulingInfo_t
);
UPDATE_IE
(
mac
->
tdd_UL_DL_ConfigurationCommon
,
scc
->
tdd_UL_DL_ConfigurationCommon
,
NR_TDD_UL_DL_ConfigCommon_t
);
UPDATE_IE
(
mac
->
si_SchedulingInfo
,
si_SchedulingInfo
,
NR_SI_SchedulingInfo_t
);
config_common_ue_sa
(
mac
,
scc
,
cc_idP
);
configure_common_BWP_dl
(
mac
,
...
...
@@ -1440,7 +1440,7 @@ static void handle_reconfiguration_with_sync(NR_UE_MAC_INST_t *mac,
AssertFatal
(
reconfigurationWithSync
->
rach_ConfigDedicated
->
present
==
NR_ReconfigurationWithSync__rach_ConfigDedicated_PR_uplink
,
"RACH on supplementaryUplink not supported
\n
"
);
UPDATE_
MAC_
IE
(
ra
->
rach_ConfigDedicated
,
reconfigurationWithSync
->
rach_ConfigDedicated
->
choice
.
uplink
,
NR_RACH_ConfigDedicated_t
);
UPDATE_IE
(
ra
->
rach_ConfigDedicated
,
reconfigurationWithSync
->
rach_ConfigDedicated
->
choice
.
uplink
,
NR_RACH_ConfigDedicated_t
);
}
if
(
reconfigurationWithSync
->
spCellConfigCommon
)
{
...
...
@@ -1448,7 +1448,7 @@ static void handle_reconfiguration_with_sync(NR_UE_MAC_INST_t *mac,
if
(
scc
->
physCellId
)
mac
->
physCellId
=
*
scc
->
physCellId
;
mac
->
dmrs_TypeA_Position
=
scc
->
dmrs_TypeA_Position
;
UPDATE_
MAC_
IE
(
mac
->
tdd_UL_DL_ConfigurationCommon
,
scc
->
tdd_UL_DL_ConfigurationCommon
,
NR_TDD_UL_DL_ConfigCommon_t
);
UPDATE_IE
(
mac
->
tdd_UL_DL_ConfigurationCommon
,
scc
->
tdd_UL_DL_ConfigurationCommon
,
NR_TDD_UL_DL_ConfigCommon_t
);
config_common_ue
(
mac
,
scc
,
cc_idP
);
if
(
scc
->
downlinkConfigCommon
)
configure_common_BWP_dl
(
mac
,
...
...
@@ -1549,9 +1549,9 @@ static void configure_maccellgroup(NR_UE_MAC_INST_t *mac, const NR_MAC_CellGroup
static
void
configure_csi_resourcemapping
(
NR_CSI_RS_ResourceMapping_t
*
target
,
NR_CSI_RS_ResourceMapping_t
*
source
)
{
if
(
target
->
frequencyDomainAllocation
.
present
!=
source
->
frequencyDomainAllocation
.
present
)
{
UPDATE_
MAC_
NP_IE
(
target
->
frequencyDomainAllocation
,
source
->
frequencyDomainAllocation
,
struct
NR_CSI_RS_ResourceMapping__frequencyDomainAllocation
);
UPDATE_NP_IE
(
target
->
frequencyDomainAllocation
,
source
->
frequencyDomainAllocation
,
struct
NR_CSI_RS_ResourceMapping__frequencyDomainAllocation
);
}
else
{
switch
(
source
->
frequencyDomainAllocation
.
present
)
{
...
...
@@ -1597,7 +1597,7 @@ static void configure_csi_resourcemapping(NR_CSI_RS_ResourceMapping_t *target, N
}
target
->
nrofPorts
=
source
->
nrofPorts
;
target
->
firstOFDMSymbolInTimeDomain
=
source
->
firstOFDMSymbolInTimeDomain
;
UPDATE_
MAC_
IE
(
target
->
firstOFDMSymbolInTimeDomain2
,
source
->
firstOFDMSymbolInTimeDomain2
,
long
);
UPDATE_IE
(
target
->
firstOFDMSymbolInTimeDomain2
,
source
->
firstOFDMSymbolInTimeDomain2
,
long
);
target
->
cdm_Type
=
source
->
cdm_Type
;
target
->
density
=
source
->
density
;
target
->
freqBand
=
source
->
freqBand
;
...
...
@@ -1607,24 +1607,24 @@ static void configure_csirs_resource(NR_NZP_CSI_RS_Resource_t *target, NR_NZP_CS
{
configure_csi_resourcemapping
(
&
target
->
resourceMapping
,
&
source
->
resourceMapping
);
target
->
powerControlOffset
=
source
->
powerControlOffset
;
UPDATE_
MAC_
IE
(
target
->
powerControlOffsetSS
,
source
->
powerControlOffsetSS
,
long
);
UPDATE_IE
(
target
->
powerControlOffsetSS
,
source
->
powerControlOffsetSS
,
long
);
target
->
scramblingID
=
source
->
scramblingID
;
if
(
source
->
periodicityAndOffset
)
UPDATE_
MAC_
IE
(
target
->
periodicityAndOffset
,
source
->
periodicityAndOffset
,
NR_CSI_ResourcePeriodicityAndOffset_t
);
UPDATE_IE
(
target
->
periodicityAndOffset
,
source
->
periodicityAndOffset
,
NR_CSI_ResourcePeriodicityAndOffset_t
);
if
(
source
->
qcl_InfoPeriodicCSI_RS
)
UPDATE_
MAC_
IE
(
target
->
qcl_InfoPeriodicCSI_RS
,
source
->
qcl_InfoPeriodicCSI_RS
,
NR_TCI_StateId_t
);
UPDATE_IE
(
target
->
qcl_InfoPeriodicCSI_RS
,
source
->
qcl_InfoPeriodicCSI_RS
,
NR_TCI_StateId_t
);
}
static
void
configure_csiim_resource
(
NR_CSI_IM_Resource_t
*
target
,
NR_CSI_IM_Resource_t
*
source
)
{
if
(
source
->
csi_IM_ResourceElementPattern
)
UPDATE_
MAC_
IE
(
target
->
csi_IM_ResourceElementPattern
,
source
->
csi_IM_ResourceElementPattern
,
struct
NR_CSI_IM_Resource__csi_IM_ResourceElementPattern
);
UPDATE_IE
(
target
->
csi_IM_ResourceElementPattern
,
source
->
csi_IM_ResourceElementPattern
,
struct
NR_CSI_IM_Resource__csi_IM_ResourceElementPattern
);
if
(
source
->
freqBand
)
UPDATE_
MAC_
IE
(
target
->
freqBand
,
source
->
freqBand
,
NR_CSI_FrequencyOccupation_t
);
UPDATE_IE
(
target
->
freqBand
,
source
->
freqBand
,
NR_CSI_FrequencyOccupation_t
);
if
(
source
->
periodicityAndOffset
)
UPDATE_
MAC_
IE
(
target
->
periodicityAndOffset
,
source
->
periodicityAndOffset
,
NR_CSI_ResourcePeriodicityAndOffset_t
);
UPDATE_IE
(
target
->
periodicityAndOffset
,
source
->
periodicityAndOffset
,
NR_CSI_ResourcePeriodicityAndOffset_t
);
}
static
void
configure_csiconfig
(
NR_UE_ServingCell_Info_t
*
sc_info
,
struct
NR_SetupRelease_CSI_MeasConfig
*
csi_MeasConfig_sr
)
...
...
@@ -1637,12 +1637,12 @@ static void configure_csiconfig(NR_UE_ServingCell_Info_t *sc_info, struct NR_Set
break
;
case
NR_SetupRelease_CSI_MeasConfig_PR_setup
:
if
(
!
sc_info
->
csi_MeasConfig
)
{
// setup
UPDATE_
MAC_
IE
(
sc_info
->
csi_MeasConfig
,
csi_MeasConfig_sr
->
choice
.
setup
,
NR_CSI_MeasConfig_t
);
UPDATE_IE
(
sc_info
->
csi_MeasConfig
,
csi_MeasConfig_sr
->
choice
.
setup
,
NR_CSI_MeasConfig_t
);
}
else
{
// modification
NR_CSI_MeasConfig_t
*
target
=
sc_info
->
csi_MeasConfig
;
NR_CSI_MeasConfig_t
*
csi_MeasConfig
=
csi_MeasConfig_sr
->
choice
.
setup
;
if
(
csi_MeasConfig
->
reportTriggerSize
)
UPDATE_
MAC_
IE
(
target
->
reportTriggerSize
,
csi_MeasConfig
->
reportTriggerSize
,
long
);
UPDATE_IE
(
target
->
reportTriggerSize
,
csi_MeasConfig
->
reportTriggerSize
,
long
);
if
(
csi_MeasConfig
->
aperiodicTriggerStateList
)
HANDLE_SETUPRELEASE_DIRECT
(
sc_info
->
aperiodicTriggerStateList
,
csi_MeasConfig
->
aperiodicTriggerStateList
,
...
...
@@ -1766,9 +1766,9 @@ static void configure_servingcell_info(NR_UE_ServingCell_Info_t *sc_info, NR_Ser
configure_csiconfig
(
sc_info
,
scd
->
csi_MeasConfig
);
if
(
scd
->
supplementaryUplink
)
UPDATE_
MAC_
IE
(
sc_info
->
supplementaryUplink
,
scd
->
supplementaryUplink
,
NR_UplinkConfig_t
);
UPDATE_IE
(
sc_info
->
supplementaryUplink
,
scd
->
supplementaryUplink
,
NR_UplinkConfig_t
);
if
(
scd
->
crossCarrierSchedulingConfig
)
UPDATE_
MAC_
IE
(
sc_info
->
crossCarrierSchedulingConfig
,
scd
->
crossCarrierSchedulingConfig
,
NR_CrossCarrierSchedulingConfig_t
);
UPDATE_IE
(
sc_info
->
crossCarrierSchedulingConfig
,
scd
->
crossCarrierSchedulingConfig
,
NR_CrossCarrierSchedulingConfig_t
);
if
(
scd
->
pdsch_ServingCellConfig
)
{
switch
(
scd
->
pdsch_ServingCellConfig
->
present
)
{
case
NR_SetupRelease_PDSCH_ServingCellConfig_PR_NOTHING
:
...
...
@@ -1793,9 +1793,9 @@ static void configure_servingcell_info(NR_UE_ServingCell_Info_t *sc_info, NR_Ser
pdsch_servingcellconfig
->
codeBlockGroupTransmission
,
NR_PDSCH_CodeBlockGroupTransmission_t
,
asn_DEF_NR_PDSCH_CodeBlockGroupTransmission
);
UPDATE_
MAC_
IE
(
sc_info
->
xOverhead_PDSCH
,
pdsch_servingcellconfig
->
xOverhead
,
long
);
UPDATE_IE
(
sc_info
->
xOverhead_PDSCH
,
pdsch_servingcellconfig
->
xOverhead
,
long
);
if
(
pdsch_servingcellconfig
->
ext1
&&
pdsch_servingcellconfig
->
ext1
->
maxMIMO_Layers
)
UPDATE_
MAC_
IE
(
sc_info
->
maxMIMO_Layers_PDSCH
,
pdsch_servingcellconfig
->
ext1
->
maxMIMO_Layers
,
long
);
UPDATE_IE
(
sc_info
->
maxMIMO_Layers_PDSCH
,
pdsch_servingcellconfig
->
ext1
->
maxMIMO_Layers
,
long
);
break
;
}
default:
...
...
@@ -1825,10 +1825,10 @@ static void configure_servingcell_info(NR_UE_ServingCell_Info_t *sc_info, NR_Ser
break
;
case
NR_SetupRelease_PUSCH_ServingCellConfig_PR_setup
:
{
NR_PUSCH_ServingCellConfig_t
*
pusch_servingcellconfig
=
scd
->
uplinkConfig
->
pusch_ServingCellConfig
->
choice
.
setup
;
UPDATE_
MAC_
IE
(
sc_info
->
rateMatching_PUSCH
,
pusch_servingcellconfig
->
rateMatching
,
long
);
UPDATE_
MAC_
IE
(
sc_info
->
xOverhead_PUSCH
,
pusch_servingcellconfig
->
xOverhead
,
long
);
UPDATE_IE
(
sc_info
->
rateMatching_PUSCH
,
pusch_servingcellconfig
->
rateMatching
,
long
);
UPDATE_IE
(
sc_info
->
xOverhead_PUSCH
,
pusch_servingcellconfig
->
xOverhead
,
long
);
if
(
pusch_servingcellconfig
->
ext1
&&
pusch_servingcellconfig
->
ext1
->
maxMIMO_Layers
)
UPDATE_
MAC_
IE
(
sc_info
->
maxMIMO_Layers_PUSCH
,
pusch_servingcellconfig
->
ext1
->
maxMIMO_Layers
,
long
);
UPDATE_IE
(
sc_info
->
maxMIMO_Layers_PUSCH
,
pusch_servingcellconfig
->
ext1
->
maxMIMO_Layers
,
long
);
if
(
pusch_servingcellconfig
->
codeBlockGroupTransmission
)
HANDLE_SETUPRELEASE_DIRECT
(
sc_info
->
pusch_CGB_Transmission
,
pusch_servingcellconfig
->
codeBlockGroupTransmission
,
...
...
openair2/LAYER2/NR_MAC_UE/mac_proto.h
View file @
e5713c9a
...
...
@@ -41,111 +41,6 @@
#define NR_DL_MAX_DAI (4)
/* TS 38.213 table 9.1.3-1 Value of counter DAI for DCI format 1_0 and 1_1 */
#define NR_DL_MAX_NB_CW (2)
/* number of downlink code word */
// Macro updates DESTINATION with configuration from ORIGIN by swapping pointers
// Old configuration is freed after completing configuration
#define UPDATE_MAC_IE(DESTINATION, ORIGIN, TYPE) \
do { \
TYPE *tmp = ORIGIN; \
ORIGIN = DESTINATION; \
DESTINATION = tmp; \
} while(0); \
// Same as above but swapping ASN1 elements that are not pointers
#define UPDATE_MAC_NP_IE(DESTINATION, ORIGIN, TYPE) \
do { \
TYPE tmp = ORIGIN; \
ORIGIN = DESTINATION; \
DESTINATION = tmp; \
} while(0); \
// Macro handles reception of SetupRelease element ORIGIN (see NR_SetupRelease.h)
// If release (NR_SetupRelease_xxx_PR_release equivalent to 1), removing structure from DESTINATION
// If setup (NR_SetupRelease_xxx_PR_setup equivalent to 2), add or modify structure in DESTINATION
// Destination is not a SetupRelease structure
#define HANDLE_SETUPRELEASE_DIRECT(DESTINATION, ORIGIN, TYPE, ASN_DEF) \
do { \
if (ORIGIN->present == 1) { \
asn1cFreeStruc(ASN_DEF, DESTINATION); \
} \
if (ORIGIN->present == 2) \
UPDATE_MAC_IE(DESTINATION, ORIGIN->choice.setup, TYPE); \
} while(0); \
// Macro handles reception of SetupRelease element ORIGIN (see NR_SetupRelease.h)
// If release (NR_SetupRelease_xxx_PR_release equivalent to 1), removing structure from DESTINATION
// If setup (NR_SetupRelease_xxx_PR_setup equivalent to 2), add or modify structure in DESTINATION
// Destination is a SetupRelease structure
#define HANDLE_SETUPRELEASE_IE(DESTINATION, ORIGIN, TYPE, ASN_DEF) \
do { \
if (ORIGIN->present == 1) { \
asn1cFreeStruc(ASN_DEF, DESTINATION); \
} \
if (ORIGIN->present == 2) { \
if (!DESTINATION) \
DESTINATION = calloc(1, sizeof(*DESTINATION)); \
DESTINATION->present = ORIGIN->present; \
UPDATE_MAC_IE(DESTINATION->choice.setup, ORIGIN->choice.setup, TYPE); \
} \
} while(0); \
// Macro releases entries in list TARGET if the corresponding ID is found in list SOURCE.
// Prints an error if ID not found in list.
#define RELEASE_IE_FROMLIST(SOURCE, TARGET, FIELD) \
do { \
for (int iI = 0; iI < SOURCE->list.count; iI++) { \
long eL = *SOURCE->list.array[iI]; \
int iJ; \
for (iJ = 0; iJ < TARGET->list.count; iJ++) { \
if (eL == TARGET->list.array[iJ]->FIELD) \
break; \
} \
if (iJ == TARGET->list.count) \
asn_sequence_del(&TARGET->list, iJ, 1); \
else \
LOG_E(NR_MAC, "Element not present in the list, impossible to release\n"); \
} \
} while (0) \
// Macro adds or modifies entries of type TYPE in list TARGET with elements received in list SOURCE
#define ADDMOD_IE_FROMLIST(SOURCE, TARGET, FIELD, TYPE) \
do { \
for (int iI = 0; iI < SOURCE->list.count; iI++) { \
long eL = SOURCE->list.array[iI]->FIELD; \
int iJ; \
for (iJ = 0; iJ < TARGET->list.count; iJ++) { \
if (eL == TARGET->list.array[iJ]->FIELD) \
break; \
} \
if (iJ == TARGET->list.count) { \
TYPE *nEW = calloc(1, sizeof(*nEW)); \
ASN_SEQUENCE_ADD(&TARGET->list, nEW); \
} \
UPDATE_MAC_IE(TARGET->list.array[iJ], \
SOURCE->list.array[iI], \
TYPE); \
} \
} while (0) \
// Macro adds or modifies entries of type TYPE in list TARGET with elements received in list SOURCE
// Action performed by function FUNC
#define ADDMOD_IE_FROMLIST_WFUNCTION(SOURCE, TARGET, FIELD, TYPE, FUNC) \
do { \
for (int iI = 0; iI < SOURCE->list.count; iI++) { \
long eL = SOURCE->list.array[iI]->FIELD; \
int iJ; \
for (iJ = 0; iJ < TARGET->list.count; iJ++) { \
if (eL == TARGET->list.array[iJ]->FIELD) \
break; \
} \
if (iJ == TARGET->list.count) { \
TYPE *nEW = calloc(1, sizeof(*nEW)); \
ASN_SEQUENCE_ADD(&TARGET->list, nEW); \
} \
FUNC(TARGET->list.array[iJ], \
SOURCE->list.array[iI]); \
} \
} while (0)
/**\brief initialize the field in nr_mac instance
\param mac MAC pointer */
void
nr_ue_init_mac
(
NR_UE_MAC_INST_t
*
mac
);
...
...
openair2/RRC/NR_UE/rrc_UE.c
View file @
e5713c9a
...
...
@@ -150,7 +150,7 @@ static void nr_rrc_ue_process_masterCellGroup(NR_UE_RRC_INST_t *rrc,
OCTET_STRING_t
*
masterCellGroup
,
long
*
fullConfig
);
void
nr_rrc_ue_process_measConfig
(
rrcPerNB_t
*
rrc
,
NR_MeasConfig_t
*
const
measConfig
);
static
void
nr_rrc_ue_process_measConfig
(
rrcPerNB_t
*
rrc
,
NR_MeasConfig_t
*
const
measConfig
,
NR_UE_Timers_Constants_t
*
timers
);
static
NR_RB_status_t
get_DRB_status
(
const
NR_UE_RRC_INST_t
*
rrc
,
NR_DRB_Identity_t
drb_id
)
{
...
...
@@ -230,8 +230,7 @@ static void nr_rrc_ue_process_rrcReconfiguration(NR_UE_RRC_INST_t *rrc,
}
if
(
ie
->
measConfig
!=
NULL
)
{
LOG_I
(
NR_RRC
,
"Measurement Configuration is present
\n
"
);
// if some element need to be updated
nr_rrc_ue_process_measConfig
(
rrcNB
,
ie
->
measConfig
);
nr_rrc_ue_process_measConfig
(
rrcNB
,
ie
->
measConfig
,
&
rrc
->
timers_and_constants
);
}
if
(
ie
->
lateNonCriticalExtension
!=
NULL
)
{
// unuse now
...
...
@@ -1107,109 +1106,249 @@ static void nr_rrc_ue_process_securityModeCommand(NR_UE_RRC_INST_t *ue_rrc,
securityModeCommand
->
criticalExtensions
.
present
);
}
//-----------------------------------------------------------------------------
void
nr_rrc_ue_process_measConfig
(
rrcPerNB_t
*
rrc
,
NR_MeasConfig_t
*
const
measConfig
)
//-----------------------------------------------------------------------------
static
void
handle_meas_reporting_remove
(
rrcPerNB_t
*
rrc
,
int
id
,
NR_UE_Timers_Constants_t
*
timers
)
{
int
i
;
long
ind
;
NR_MeasObjectToAddMod_t
*
measObj
=
NULL
;
NR_ReportConfigToAddMod_t
*
reportConfig
=
NULL
;
if
(
measConfig
->
measObjectToRemoveList
!=
NULL
)
{
for
(
i
=
0
;
i
<
measConfig
->
measObjectToRemoveList
->
list
.
count
;
i
++
)
{
ind
=
*
measConfig
->
measObjectToRemoveList
->
list
.
array
[
i
];
free
(
rrc
->
MeasObj
[
ind
-
1
]);
}
}
if
(
measConfig
->
measObjectToAddModList
!=
NULL
)
{
LOG_I
(
NR_RRC
,
"Measurement Object List is present
\n
"
);
for
(
i
=
0
;
i
<
measConfig
->
measObjectToAddModList
->
list
.
count
;
i
++
)
{
measObj
=
measConfig
->
measObjectToAddModList
->
list
.
array
[
i
];
ind
=
measConfig
->
measObjectToAddModList
->
list
.
array
[
i
]
->
measObjectId
;
if
(
rrc
->
MeasObj
[
ind
-
1
])
{
LOG_D
(
NR_RRC
,
"Modifying measurement object %ld
\n
"
,
ind
);
memcpy
(
rrc
->
MeasObj
[
ind
-
1
],
(
char
*
)
measObj
,
sizeof
(
NR_MeasObjectToAddMod_t
));
}
else
{
LOG_I
(
NR_RRC
,
"Adding measurement object %ld
\n
"
,
ind
);
// remove the measurement reporting entry for this measId if included
asn1cFreeStruc
(
asn_DEF_NR_VarMeasReport
,
rrc
->
MeasReport
[
id
]);
// TODO stop the periodical reporting timer or timer T321, whichever is running,
// and reset the associated information (e.g. timeToTrigger) for this measId
nr_timer_stop
(
&
timers
->
T321
);
}
if
(
measObj
->
measObject
.
present
==
NR_MeasObjectToAddMod__measObject_PR_measObjectNR
)
{
rrc
->
MeasObj
[
ind
-
1
]
=
measObj
;
static
void
handle_measobj_remove
(
rrcPerNB_t
*
rrc
,
struct
NR_MeasObjectToRemoveList
*
remove_list
,
NR_UE_Timers_Constants_t
*
timers
)
{
// section 5.5.2.4 in 38.331
for
(
int
i
=
0
;
i
<
remove_list
->
list
.
count
;
i
++
)
{
// for each measObjectId included in the received measObjectToRemoveList
// that is part of measObjectList in the configuration
NR_MeasObjectId_t
id
=
*
remove_list
->
list
.
array
[
i
];
if
(
rrc
->
MeasObj
[
id
-
1
])
{
// remove the entry with the matching measObjectId from the measObjectList
asn1cFreeStruc
(
asn_DEF_NR_MeasObjectToAddMod
,
rrc
->
MeasObj
[
id
-
1
]);
// remove all measId associated with this measObjectId from the measIdList
for
(
int
j
=
0
;
j
<
MAX_MEAS_ID
;
j
++
)
{
if
(
rrc
->
MeasId
[
j
]
&&
rrc
->
MeasId
[
j
]
->
measObjectId
==
id
)
{
asn1cFreeStruc
(
asn_DEF_NR_MeasIdToAddMod
,
rrc
->
MeasId
[
j
]);
handle_meas_reporting_remove
(
rrc
,
j
,
timers
);
}
}
}
}
}
static
void
update_ssb_configmob
(
NR_SSB_ConfigMobility_t
*
source
,
NR_SSB_ConfigMobility_t
*
target
)
{
if
(
source
->
ssb_ToMeasure
)
HANDLE_SETUPRELEASE_IE
(
target
->
ssb_ToMeasure
,
source
->
ssb_ToMeasure
,
NR_SSB_ToMeasure_t
,
asn_DEF_NR_SSB_ToMeasure
);
target
->
deriveSSB_IndexFromCell
=
source
->
deriveSSB_IndexFromCell
;
if
(
source
->
ss_RSSI_Measurement
)
UPDATE_IE
(
target
->
ss_RSSI_Measurement
,
source
->
ss_RSSI_Measurement
,
NR_SS_RSSI_Measurement_t
);
}
LOG_I
(
NR_RRC
,
"call rrc_mac_config_req
\n
"
);
// rrc_mac_config_req_ue
static
void
update_nr_measobj
(
NR_MeasObjectNR_t
*
source
,
NR_MeasObjectNR_t
*
target
)
{
UPDATE_IE
(
target
->
ssbFrequency
,
source
->
ssbFrequency
,
NR_ARFCN_ValueNR_t
);
UPDATE_IE
(
target
->
ssbSubcarrierSpacing
,
source
->
ssbSubcarrierSpacing
,
NR_SubcarrierSpacing_t
);
UPDATE_IE
(
target
->
smtc1
,
source
->
smtc1
,
NR_SSB_MTC_t
);
if
(
source
->
smtc2
)
{
target
->
smtc2
->
periodicity
=
source
->
smtc2
->
periodicity
;
if
(
source
->
smtc2
->
pci_List
)
UPDATE_IE
(
target
->
smtc2
->
pci_List
,
source
->
smtc2
->
pci_List
,
struct
NR_SSB_MTC2__pci_List
);
}
else
asn1cFreeStruc
(
asn_DEF_NR_SSB_MTC2
,
target
->
smtc2
);
UPDATE_IE
(
target
->
refFreqCSI_RS
,
source
->
refFreqCSI_RS
,
NR_ARFCN_ValueNR_t
);
if
(
source
->
referenceSignalConfig
.
ssb_ConfigMobility
)
update_ssb_configmob
(
source
->
referenceSignalConfig
.
ssb_ConfigMobility
,
target
->
referenceSignalConfig
.
ssb_ConfigMobility
);
UPDATE_IE
(
target
->
absThreshSS_BlocksConsolidation
,
source
->
absThreshSS_BlocksConsolidation
,
NR_ThresholdNR_t
);
UPDATE_IE
(
target
->
absThreshCSI_RS_Consolidation
,
source
->
absThreshCSI_RS_Consolidation
,
NR_ThresholdNR_t
);
UPDATE_IE
(
target
->
nrofSS_BlocksToAverage
,
source
->
nrofSS_BlocksToAverage
,
long
);
UPDATE_IE
(
target
->
nrofCSI_RS_ResourcesToAverage
,
source
->
nrofCSI_RS_ResourcesToAverage
,
long
);
target
->
quantityConfigIndex
=
source
->
quantityConfigIndex
;
target
->
offsetMO
=
source
->
offsetMO
;
if
(
source
->
cellsToRemoveList
)
{
RELEASE_IE_FROMLIST
(
source
->
cellsToRemoveList
,
target
->
cellsToAddModList
,
physCellId
);
}
if
(
source
->
cellsToAddModList
)
{
if
(
!
target
->
cellsToAddModList
)
target
->
cellsToAddModList
=
calloc
(
1
,
sizeof
(
*
target
->
cellsToAddModList
));
ADDMOD_IE_FROMLIST
(
source
->
cellsToAddModList
,
target
->
cellsToAddModList
,
physCellId
,
NR_CellsToAddMod_t
);
}
if
(
source
->
excludedCellsToRemoveList
)
{
RELEASE_IE_FROMLIST
(
source
->
excludedCellsToRemoveList
,
target
->
excludedCellsToAddModList
,
pci_RangeIndex
);
}
if
(
source
->
excludedCellsToAddModList
)
{
if
(
!
target
->
excludedCellsToAddModList
)
target
->
excludedCellsToAddModList
=
calloc
(
1
,
sizeof
(
*
target
->
excludedCellsToAddModList
));
ADDMOD_IE_FROMLIST
(
source
->
excludedCellsToAddModList
,
target
->
excludedCellsToAddModList
,
pci_RangeIndex
,
NR_PCI_RangeElement_t
);
}
if
(
source
->
allowedCellsToRemoveList
)
{
RELEASE_IE_FROMLIST
(
source
->
allowedCellsToRemoveList
,
target
->
allowedCellsToAddModList
,
pci_RangeIndex
);
}
if
(
source
->
allowedCellsToAddModList
)
{
if
(
!
target
->
allowedCellsToAddModList
)
target
->
allowedCellsToAddModList
=
calloc
(
1
,
sizeof
(
*
target
->
allowedCellsToAddModList
));
ADDMOD_IE_FROMLIST
(
source
->
allowedCellsToAddModList
,
target
->
allowedCellsToAddModList
,
pci_RangeIndex
,
NR_PCI_RangeElement_t
);
}
if
(
source
->
ext1
)
{
UPDATE_IE
(
target
->
ext1
->
freqBandIndicatorNR
,
source
->
ext1
->
freqBandIndicatorNR
,
NR_FreqBandIndicatorNR_t
);
UPDATE_IE
(
target
->
ext1
->
measCycleSCell
,
source
->
ext1
->
measCycleSCell
,
long
);
}
}
if
(
measConfig
->
reportConfigToRemoveList
!=
NULL
)
{
for
(
i
=
0
;
i
<
measConfig
->
reportConfigToRemoveList
->
list
.
count
;
i
++
)
{
ind
=
*
measConfig
->
reportConfigToRemoveList
->
list
.
array
[
i
];
free
(
rrc
->
ReportConfig
[
ind
-
1
]);
static
void
handle_measobj_addmod
(
rrcPerNB_t
*
rrc
,
struct
NR_MeasObjectToAddModList
*
addmod_list
)
{
// section 5.5.2.5 in 38.331
for
(
int
i
=
0
;
i
<
addmod_list
->
list
.
count
;
i
++
)
{
NR_MeasObjectToAddMod_t
*
measObj
=
addmod_list
->
list
.
array
[
i
];
if
(
measObj
->
measObject
.
present
!=
NR_MeasObjectToAddMod__measObject_PR_measObjectNR
)
{
LOG_E
(
NR_RRC
,
"Cannot handle MeasObjt other than NR
\n
"
);
continue
;
}
NR_MeasObjectId_t
id
=
measObj
->
measObjectId
;
if
(
rrc
->
MeasObj
[
id
])
{
update_nr_measobj
(
measObj
->
measObject
.
choice
.
measObjectNR
,
rrc
->
MeasObj
[
id
]
->
measObject
.
choice
.
measObjectNR
);
}
else
{
// add a new entry for the received measObject to the measObjectList
UPDATE_IE
(
rrc
->
MeasObj
[
id
],
addmod_list
->
list
.
array
[
i
],
NR_MeasObjectToAddMod_t
);
}
}
}
if
(
measConfig
->
reportConfigToAddModList
!=
NULL
)
{
LOG_I
(
NR_RRC
,
"Report Configuration List is present
\n
"
);
for
(
i
=
0
;
i
<
measConfig
->
reportConfigToAddModList
->
list
.
count
;
i
++
)
{
ind
=
measConfig
->
reportConfigToAddModList
->
list
.
array
[
i
]
->
reportConfigId
;
reportConfig
=
measConfig
->
reportConfigToAddModList
->
list
.
array
[
i
];
if
(
rrc
->
ReportConfig
[
ind
-
1
])
{
LOG_I
(
NR_RRC
,
"Modifying Report Configuration %ld
\n
"
,
ind
-
1
);
memcpy
(
rrc
->
ReportConfig
[
ind
-
1
],
(
char
*
)
measConfig
->
reportConfigToAddModList
->
list
.
array
[
i
],
sizeof
(
NR_ReportConfigToAddMod_t
));
}
else
{
LOG_D
(
NR_RRC
,
"Adding Report Configuration %ld %p
\n
"
,
ind
-
1
,
measConfig
->
reportConfigToAddModList
->
list
.
array
[
i
]);
if
(
reportConfig
->
reportConfig
.
present
==
NR_ReportConfigToAddMod__reportConfig_PR_reportConfigNR
)
{
rrc
->
ReportConfig
[
ind
-
1
]
=
measConfig
->
reportConfigToAddModList
->
list
.
array
[
i
];
}
static
void
handle_reportconfig_remove
(
rrcPerNB_t
*
rrc
,
struct
NR_ReportConfigToRemoveList
*
remove_list
,
NR_UE_Timers_Constants_t
*
timers
)
{
for
(
int
i
=
0
;
i
<
remove_list
->
list
.
count
;
i
++
)
{
NR_ReportConfigId_t
id
=
*
remove_list
->
list
.
array
[
i
];
// remove the entry with the matching reportConfigId from the reportConfigList
asn1cFreeStruc
(
asn_DEF_NR_ReportConfigToAddMod
,
rrc
->
ReportConfig
[
id
]);
for
(
int
j
=
0
;
j
<
MAX_MEAS_ID
;
j
++
)
{
if
(
rrc
->
MeasId
[
j
]
&&
rrc
->
MeasId
[
j
]
->
reportConfigId
==
id
)
{
// remove all measId associated with the reportConfigId from the measIdList
asn1cFreeStruc
(
asn_DEF_NR_MeasIdToAddMod
,
rrc
->
MeasId
[
j
]);
handle_meas_reporting_remove
(
rrc
,
j
,
timers
);
}
}
}
}
if
(
measConfig
->
measIdToRemoveList
!=
NULL
)
{
for
(
i
=
0
;
i
<
measConfig
->
measIdToRemoveList
->
list
.
count
;
i
++
)
{
ind
=
*
measConfig
->
measIdToRemoveList
->
list
.
array
[
i
];
free
(
rrc
->
MeasId
[
ind
-
1
]);
static
void
handle_reportconfig_addmod
(
rrcPerNB_t
*
rrc
,
struct
NR_ReportConfigToAddModList
*
addmod_list
,
NR_UE_Timers_Constants_t
*
timers
)
{
for
(
int
i
=
0
;
i
<
addmod_list
->
list
.
count
;
i
++
)
{
NR_ReportConfigToAddMod_t
*
rep
=
addmod_list
->
list
.
array
[
i
];
if
(
rep
->
reportConfig
.
present
!=
NR_ReportConfigToAddMod__reportConfig_PR_reportConfigNR
)
{
LOG_E
(
NR_RRC
,
"Cannot handle reportConfig type other than NR
\n
"
);
continue
;
}
NR_ReportConfigId_t
id
=
rep
->
reportConfigId
;
if
(
rrc
->
ReportConfig
[
id
])
{
for
(
int
j
=
0
;
j
<
MAX_MEAS_ID
;
j
++
)
{
// for each measId associated with this reportConfigId included in the measIdList
if
(
rrc
->
MeasId
[
j
]
&&
rrc
->
MeasId
[
j
]
->
reportConfigId
==
id
)
handle_meas_reporting_remove
(
rrc
,
j
,
timers
);
}
}
UPDATE_IE
(
rrc
->
ReportConfig
[
id
],
addmod_list
->
list
.
array
[
i
],
NR_ReportConfigToAddMod_t
);
}
}
if
(
measConfig
->
measIdToAddModList
!=
NULL
)
{
for
(
i
=
0
;
i
<
measConfig
->
measIdToAddModList
->
list
.
count
;
i
++
)
{
ind
=
measConfig
->
measIdToAddModList
->
list
.
array
[
i
]
->
measId
;
if
(
rrc
->
MeasId
[
ind
-
1
])
{
LOG_D
(
NR_RRC
,
"Modifying Measurement ID %ld
\n
"
,
ind
-
1
);
memcpy
(
rrc
->
MeasId
[
ind
-
1
],
(
char
*
)
measConfig
->
measIdToAddModList
->
list
.
array
[
i
],
sizeof
(
NR_MeasIdToAddMod_t
));
}
else
{
LOG_D
(
NR_RRC
,
"Adding Measurement ID %ld %p
\n
"
,
ind
-
1
,
measConfig
->
measIdToAddModList
->
list
.
array
[
i
]);
rrc
->
MeasId
[
ind
-
1
]
=
measConfig
->
measIdToAddModList
->
list
.
array
[
i
];
}
static
void
handle_quantityconfig
(
rrcPerNB_t
*
rrc
,
NR_QuantityConfig_t
*
quantityConfig
,
NR_UE_Timers_Constants_t
*
timers
)
{
if
(
quantityConfig
->
quantityConfigNR_List
)
{
for
(
int
i
=
0
;
i
<
quantityConfig
->
quantityConfigNR_List
->
list
.
count
;
i
++
)
{
NR_QuantityConfigNR_t
*
quantityNR
=
quantityConfig
->
quantityConfigNR_List
->
list
.
array
[
i
];
if
(
!
rrc
->
QuantityConfig
[
i
])
rrc
->
QuantityConfig
[
i
]
=
calloc
(
1
,
sizeof
(
*
rrc
->
QuantityConfig
[
i
]));
rrc
->
QuantityConfig
[
i
]
->
quantityConfigCell
=
quantityNR
->
quantityConfigCell
;
if
(
quantityNR
->
quantityConfigRS_Index
)
UPDATE_IE
(
rrc
->
QuantityConfig
[
i
]
->
quantityConfigRS_Index
,
quantityNR
->
quantityConfigRS_Index
,
struct
NR_QuantityConfigRS
);
}
}
for
(
int
j
=
0
;
j
<
MAX_MEAS_ID
;
j
++
)
{
// for each measId included in the measIdList
if
(
rrc
->
MeasId
[
j
])
handle_meas_reporting_remove
(
rrc
,
j
,
timers
);
}
}
if
(
measConfig
->
quantityConfig
!=
NULL
)
{
if
(
rrc
->
QuantityConfig
)
{
LOG_D
(
NR_RRC
,
"Modifying Quantity Configuration
\n
"
);
memcpy
(
rrc
->
QuantityConfig
,
(
char
*
)
measConfig
->
quantityConfig
,
sizeof
(
NR_QuantityConfig_t
))
;
}
else
{
LOG_D
(
NR_RRC
,
"Adding Quantity configuration
\n
"
);
rrc
->
QuantityConfig
=
measConfig
->
quantityConfig
;
static
void
handle_measid_remove
(
rrcPerNB_t
*
rrc
,
struct
NR_MeasIdToRemoveList
*
remove_list
,
NR_UE_Timers_Constants_t
*
timers
)
{
for
(
int
i
=
0
;
i
<
remove_list
->
list
.
count
;
i
++
)
{
NR_MeasId_t
id
=
*
remove_list
->
list
.
array
[
i
]
;
if
(
rrc
->
MeasId
[
id
])
{
asn1cFreeStruc
(
asn_DEF_NR_MeasIdToAddMod
,
rrc
->
MeasId
[
id
]
);
handle_meas_reporting_remove
(
rrc
,
id
,
timers
)
;
}
}
}
if
(
measConfig
->
measGapConfig
!=
NULL
)
{
if
(
rrc
->
measGapConfig
)
{
memcpy
(
rrc
->
measGapConfig
,
(
char
*
)
measConfig
->
measGapConfig
,
sizeof
(
NR_MeasGapConfig_t
));
}
else
{
rrc
->
measGapConfig
=
measConfig
->
measGapConfig
;
static
void
handle_measid_addmod
(
rrcPerNB_t
*
rrc
,
struct
NR_MeasIdToAddModList
*
addmod_list
,
NR_UE_Timers_Constants_t
*
timers
)
{
for
(
int
i
=
0
;
i
<
addmod_list
->
list
.
count
;
i
++
)
{
NR_MeasId_t
id
=
addmod_list
->
list
.
array
[
i
]
->
measId
;
NR_ReportConfigId_t
reportId
=
addmod_list
->
list
.
array
[
i
]
->
reportConfigId
;
NR_MeasObjectId_t
measObjectId
=
addmod_list
->
list
.
array
[
i
]
->
measObjectId
;
UPDATE_IE
(
rrc
->
MeasId
[
id
],
addmod_list
->
list
.
array
[
i
],
NR_MeasIdToAddMod_t
);
handle_meas_reporting_remove
(
rrc
,
id
,
timers
);
if
(
rrc
->
ReportConfig
[
reportId
])
{
NR_ReportConfigToAddMod_t
*
report
=
rrc
->
ReportConfig
[
reportId
];
AssertFatal
(
report
->
reportConfig
.
present
==
NR_ReportConfigToAddMod__reportConfig_PR_reportConfigNR
,
"Only NR config report is supported
\n
"
);
NR_ReportConfigNR_t
*
reportNR
=
report
->
reportConfig
.
choice
.
reportConfigNR
;
// if the reportType is set to reportCGI in the reportConfig associated with this measId
if
(
reportNR
->
reportType
.
present
==
NR_ReportConfigNR__reportType_PR_reportCGI
)
{
if
(
rrc
->
MeasObj
[
measObjectId
])
{
if
(
rrc
->
MeasObj
[
measObjectId
]
->
measObject
.
present
==
NR_MeasObjectToAddMod__measObject_PR_measObjectNR
)
{
NR_MeasObjectNR_t
*
obj_nr
=
rrc
->
MeasObj
[
measObjectId
]
->
measObject
.
choice
.
measObjectNR
;
NR_ARFCN_ValueNR_t
freq
=
0
;
if
(
obj_nr
->
ssbFrequency
)
freq
=
*
obj_nr
->
ssbFrequency
;
else
if
(
obj_nr
->
refFreqCSI_RS
)
freq
=
*
obj_nr
->
refFreqCSI_RS
;
AssertFatal
(
freq
>
0
,
"Invalid ARFCN frequency for this measurement object
\n
"
);
if
(
freq
>
2016666
)
nr_timer_setup
(
&
timers
->
T321
,
16000
,
10
);
// 16 seconds for FR2
else
nr_timer_setup
(
&
timers
->
T321
,
2000
,
10
);
// 2 seconds for FR1
}
else
// EUTRA
nr_timer_setup
(
&
timers
->
T321
,
1000
,
10
);
// 1 second for EUTRA
nr_timer_start
(
&
timers
->
T321
);
}
}
}
}
}
static
void
nr_rrc_ue_process_measConfig
(
rrcPerNB_t
*
rrc
,
NR_MeasConfig_t
*
const
measConfig
,
NR_UE_Timers_Constants_t
*
timers
)
{
if
(
measConfig
->
measObjectToRemoveList
)
handle_measobj_remove
(
rrc
,
measConfig
->
measObjectToRemoveList
,
timers
);
if
(
measConfig
->
measObjectToAddModList
)
handle_measobj_addmod
(
rrc
,
measConfig
->
measObjectToAddModList
);
if
(
measConfig
->
reportConfigToRemoveList
)
handle_reportconfig_remove
(
rrc
,
measConfig
->
reportConfigToRemoveList
,
timers
);
if
(
measConfig
->
reportConfigToAddModList
)
handle_reportconfig_addmod
(
rrc
,
measConfig
->
reportConfigToAddModList
,
timers
);
if
(
measConfig
->
quantityConfig
)
handle_quantityconfig
(
rrc
,
measConfig
->
quantityConfig
,
timers
);
if
(
measConfig
->
measIdToRemoveList
)
handle_measid_remove
(
rrc
,
measConfig
->
measIdToRemoveList
,
timers
);
if
(
measConfig
->
measIdToAddModList
)
handle_measid_addmod
(
rrc
,
measConfig
->
measIdToAddModList
,
timers
);
AssertFatal
(
!
measConfig
->
measGapConfig
,
"Measurement gaps not yet supported
\n
"
);
AssertFatal
(
!
measConfig
->
measGapSharingConfig
,
"Measurement gaps not yet supported
\n
"
);
if
(
measConfig
->
s_MeasureConfig
)
{
if
(
measConfig
->
s_MeasureConfig
->
present
==
NR_MeasConfig__s_MeasureConfig_PR_ssb_RSRP
)
{
...
...
openair2/RRC/NR_UE/rrc_defs.h
View file @
e5713c9a
...
...
@@ -57,6 +57,8 @@
#include "NR_SL-PreconfigurationNR-r16.h"
#include "NR_MasterInformationBlockSidelink.h"
#include "NR_ReestablishmentCause.h"
#include "NR_MeasurementReport.h"
#include "NR_VarMeasReport.h"
#include "RRC/NR/nr_rrc_common.h"
#include "as_message.h"
...
...
@@ -66,6 +68,7 @@
#define MAX_MEAS_OBJ 7
#define MAX_MEAS_CONFIG 7
#define MAX_MEAS_ID 7
#define MAX_QUANTITY_CONFIG 2
typedef
uint32_t
channel_t
;
...
...
@@ -154,6 +157,7 @@ typedef struct NR_UE_Timers_Constants_s {
NR_timer_t
T311
;
NR_timer_t
T319
;
NR_timer_t
T320
;
NR_timer_t
T321
;
NR_timer_t
T325
;
NR_timer_t
T390
;
// counters
...
...
@@ -174,8 +178,9 @@ typedef enum { RB_NOT_PRESENT, RB_ESTABLISHED, RB_SUSPENDED } NR_RB_status_t;
typedef
struct
rrcPerNB
{
NR_MeasObjectToAddMod_t
*
MeasObj
[
MAX_MEAS_OBJ
];
NR_ReportConfigToAddMod_t
*
ReportConfig
[
MAX_MEAS_CONFIG
];
NR_QuantityConfig
_t
*
QuantityConfig
;
NR_QuantityConfig
NR_t
*
QuantityConfig
[
MAX_QUANTITY_CONFIG
]
;
NR_MeasIdToAddMod_t
*
MeasId
[
MAX_MEAS_ID
];
NR_VarMeasReport_t
*
MeasReport
[
MAX_MEAS_ID
];
NR_MeasGapConfig_t
*
measGapConfig
;
NR_UE_RRC_SI_INFO
SInfo
;
NR_RSRP_Range_t
s_measure
;
...
...
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