Merge remote-tracking branch 'origin/NR_UE_RRC_handle_MeasConfig' into integration_2024_w11
This commit is contained in:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user