RRC logging: add utility function to dump ASN1 MCG

Add debugging utilities dump_cgc() and dump_mcg() to decode and
print CellGroupConfig in XER format when DEBUG_ASN1 flag is enabled.
This helps debug RRC Reconfiguration messages containing masterCellGroup.
This commit is contained in:
Guido Casati
2026-01-29 10:17:42 +01:00
parent 9a11690f81
commit aff0ea5760
+44
View File
@@ -630,6 +630,49 @@ static byte_array_t do_HO_RRCReconfiguration(nr_rrc_reconfig_param_t *params)
return msg;
}
static void dump_cgc(const uint8_t *buf, size_t len)
{
// Decode the encoded CellGroupConfig for debugging
NR_CellGroupConfig_t *temp_cellGroupConfig = NULL;
asn_dec_rval_t dec_rval = uper_decode_complete(NULL, &asn_DEF_NR_CellGroupConfig, (void **)&temp_cellGroupConfig, buf, len);
if (dec_rval.code == RC_OK && dec_rval.consumed > 0) {
xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, temp_cellGroupConfig);
ASN_STRUCT_FREE(asn_DEF_NR_CellGroupConfig, temp_cellGroupConfig);
} else {
LOG_W(NR_RRC, "Failed to decode CellGroupConfig (code=%d consumed=%zu)\n", dec_rval.code, dec_rval.consumed);
}
}
static void dump_mcg(const NR_DL_DCCH_Message_t *dl_dcch_msg)
{
if (!dl_dcch_msg) {
LOG_W(NR_RRC, "DL_DCCH_Message is NULL\n");
return;
}
const NR_RRCReconfiguration_IEs_t *reconf_ies = NULL;
const struct NR_DL_DCCH_MessageType__c1 *c1 = NULL;
if (dl_dcch_msg->message.present == NR_DL_DCCH_MessageType_PR_c1
&& (c1 = dl_dcch_msg->message.choice.c1)
&& c1->present == NR_DL_DCCH_MessageType__c1_PR_rrcReconfiguration
&& c1->choice.rrcReconfiguration
&& c1->choice.rrcReconfiguration->criticalExtensions.present
== NR_RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration
&& c1->choice.rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration) {
reconf_ies = c1->choice.rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration;
}
if (reconf_ies && reconf_ies->nonCriticalExtension && reconf_ies->nonCriticalExtension->masterCellGroup) {
const OCTET_STRING_t *mcg = reconf_ies->nonCriticalExtension->masterCellGroup;
/* decode and XER print CellGroupConfig */
dump_cgc(mcg->buf, mcg->size);
} else {
LOG_W(NR_RRC, "No masterCellGroup found in RRCReconfiguration nonCriticalExtension\n");
}
}
byte_array_t do_RRCReconfiguration(const nr_rrc_reconfig_param_t *params)
{
byte_array_t msg = {.buf = NULL, .len = 0};
@@ -651,6 +694,7 @@ byte_array_t do_RRCReconfiguration(const nr_rrc_reconfig_param_t *params)
if (LOG_DEBUGFLAG(DEBUG_ASN1)) {
xer_fprint(stdout, &asn_DEF_NR_DL_DCCH_Message, (void *)&dl_dcch_msg);
dump_mcg(&dl_dcch_msg);
}
int val = uper_encode_to_new_buffer(&asn_DEF_NR_DL_DCCH_Message, NULL, &dl_dcch_msg, (void **)&msg.buf);