Merge remote-tracking branch 'origin/UE_issues' into integration_2025_w46 (!3750)
Handling newly opened UE issues Closes #1025 #1024 #1026 #1031 #1030
This commit is contained in:
@@ -329,7 +329,7 @@ static int handle_ue_context_drbs_setup(NR_UE_info_t *UE,
|
|||||||
*rlc_BearerConfig->rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength = NR_SN_FieldLengthAM_size12;
|
*rlc_BearerConfig->rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength = NR_SN_FieldLengthAM_size12;
|
||||||
*rlc_BearerConfig->rlc_Config->choice.am->ul_AM_RLC.sn_FieldLength = NR_SN_FieldLengthAM_size12;
|
*rlc_BearerConfig->rlc_Config->choice.am->ul_AM_RLC.sn_FieldLength = NR_SN_FieldLengthAM_size12;
|
||||||
}
|
}
|
||||||
|
AssertFatal(rlc_BearerConfig->rlc_Config, "We expect rlc-Config to be always present when we configure a DRB\n");
|
||||||
nr_rlc_add_drb(UE->rnti, drb->id, rlc_BearerConfig);
|
nr_rlc_add_drb(UE->rnti, drb->id, rlc_BearerConfig);
|
||||||
|
|
||||||
nr_lc_config_t c = {.lcid = rlc_BearerConfig->logicalChannelIdentity, .nssai = drb->nr.nssai};
|
nr_lc_config_t c = {.lcid = rlc_BearerConfig->logicalChannelIdentity, .nssai = drb->nr.nssai};
|
||||||
|
|||||||
@@ -672,7 +672,7 @@ void nr_rlc_reconfigure_entity(int ue_id, int lc_id, NR_RLC_Config_t *rlc_Config
|
|||||||
|
|
||||||
void nr_rlc_add_srb(int ue_id, int srb_id, const NR_RLC_BearerConfig_t *rlc_BearerConfig)
|
void nr_rlc_add_srb(int ue_id, int srb_id, const NR_RLC_BearerConfig_t *rlc_BearerConfig)
|
||||||
{
|
{
|
||||||
struct NR_RLC_Config *r = rlc_BearerConfig->rlc_Config;
|
NR_RLC_Config_t *r = rlc_BearerConfig->rlc_Config;
|
||||||
int t_status_prohibit;
|
int t_status_prohibit;
|
||||||
int t_poll_retransmit;
|
int t_poll_retransmit;
|
||||||
int poll_pdu;
|
int poll_pdu;
|
||||||
@@ -682,8 +682,7 @@ void nr_rlc_add_srb(int ue_id, int srb_id, const NR_RLC_BearerConfig_t *rlc_Bear
|
|||||||
int sn_field_length;
|
int sn_field_length;
|
||||||
|
|
||||||
LOG_D(RLC, "Trying to add SRB %d\n", srb_id);
|
LOG_D(RLC, "Trying to add SRB %d\n", srb_id);
|
||||||
AssertFatal(srb_id > 0 && srb_id < 4,
|
AssertFatal(srb_id > 0 && srb_id < 4, "Invalid srb id %d\n", srb_id);
|
||||||
"Invalid srb id %d\n", srb_id);
|
|
||||||
|
|
||||||
if (r && r->present == NR_RLC_Config_PR_am) {
|
if (r && r->present == NR_RLC_Config_PR_am) {
|
||||||
struct NR_RLC_Config__am *am;
|
struct NR_RLC_Config__am *am;
|
||||||
|
|||||||
+61
-52
@@ -747,12 +747,15 @@ static void nr_rrc_ue_process_masterCellGroup(NR_UE_RRC_INST_t *rrc,
|
|||||||
{
|
{
|
||||||
AssertFatal(!fullConfig, "fullConfig not supported yet\n");
|
AssertFatal(!fullConfig, "fullConfig not supported yet\n");
|
||||||
NR_CellGroupConfig_t *cellGroupConfig = NULL;
|
NR_CellGroupConfig_t *cellGroupConfig = NULL;
|
||||||
uper_decode(NULL,
|
asn_dec_rval_t dec_rval = uper_decode(NULL,
|
||||||
&asn_DEF_NR_CellGroupConfig, //might be added prefix later
|
&asn_DEF_NR_CellGroupConfig, //might be added prefix later
|
||||||
(void **)&cellGroupConfig,
|
(void **)&cellGroupConfig,
|
||||||
(uint8_t *)masterCellGroup->buf,
|
(uint8_t *)masterCellGroup->buf,
|
||||||
masterCellGroup->size, 0, 0);
|
masterCellGroup->size, 0, 0);
|
||||||
|
if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
|
||||||
|
LOG_E(NR_RRC, "CellGroupConfig decode error\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (LOG_DEBUGFLAG(DEBUG_ASN1)) {
|
if (LOG_DEBUGFLAG(DEBUG_ASN1)) {
|
||||||
xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void *) cellGroupConfig);
|
xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void *) cellGroupConfig);
|
||||||
}
|
}
|
||||||
@@ -823,28 +826,30 @@ static void nr_rrc_process_reconfiguration_v1530(NR_UE_RRC_INST_t *rrc, NR_RRCRe
|
|||||||
NR_RRCReconfiguration_v1540_IEs_t *rec_1540 = rec_1530->nonCriticalExtension;
|
NR_RRCReconfiguration_v1540_IEs_t *rec_1540 = rec_1530->nonCriticalExtension;
|
||||||
if (rec_1540) {
|
if (rec_1540) {
|
||||||
NR_RRCReconfiguration_v1560_IEs_t *rec_1560 = rec_1540->nonCriticalExtension;
|
NR_RRCReconfiguration_v1560_IEs_t *rec_1560 = rec_1540->nonCriticalExtension;
|
||||||
if (rec_1560->sk_Counter) {
|
if (rec_1560) {
|
||||||
// TODO perform AS security key update procedure as specified in 5.3.5.7
|
if (rec_1560->sk_Counter) {
|
||||||
LOG_E(NR_RRC, "RRCReconfiguration includes sk-Counter but this is not implemented yet\n");
|
// TODO perform AS security key update procedure as specified in 5.3.5.7
|
||||||
}
|
LOG_E(NR_RRC, "RRCReconfiguration includes sk-Counter but this is not implemented yet\n");
|
||||||
if (rec_1560->mrdc_SecondaryCellGroupConfig) {
|
}
|
||||||
// TODO perform handling of mrdc-SecondaryCellGroupConfig as specified in 5.3.5.3
|
if (rec_1560->mrdc_SecondaryCellGroupConfig) {
|
||||||
LOG_E(NR_RRC, "RRCReconfiguration includes mrdc-SecondaryCellGroupConfig but this is not handled yet\n");
|
// TODO perform handling of mrdc-SecondaryCellGroupConfig as specified in 5.3.5.3
|
||||||
}
|
LOG_E(NR_RRC, "RRCReconfiguration includes mrdc-SecondaryCellGroupConfig but this is not handled yet\n");
|
||||||
if (rec_1560->radioBearerConfig2) {
|
}
|
||||||
NR_RadioBearerConfig_t *RadioBearerConfig = NULL;
|
if (rec_1560->radioBearerConfig2) {
|
||||||
asn_dec_rval_t dec_rval = uper_decode(NULL,
|
NR_RadioBearerConfig_t *RadioBearerConfig = NULL;
|
||||||
&asn_DEF_NR_RadioBearerConfig,
|
asn_dec_rval_t dec_rval = uper_decode(NULL,
|
||||||
(void **)&RadioBearerConfig,
|
&asn_DEF_NR_RadioBearerConfig,
|
||||||
(uint8_t *)rec_1560->radioBearerConfig2->buf,
|
(void **)&RadioBearerConfig,
|
||||||
rec_1560->radioBearerConfig2->size,
|
(uint8_t *)rec_1560->radioBearerConfig2->buf,
|
||||||
0,
|
rec_1560->radioBearerConfig2->size,
|
||||||
0);
|
0,
|
||||||
if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
|
0);
|
||||||
LOG_E(NR_RRC, "radioBearerConfig2 decode error\n");
|
if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
|
||||||
SEQUENCE_free(&asn_DEF_NR_RadioBearerConfig, RadioBearerConfig, 1);
|
LOG_E(NR_RRC, "radioBearerConfig2 decode error\n");
|
||||||
} else
|
SEQUENCE_free(&asn_DEF_NR_RadioBearerConfig, RadioBearerConfig, 1);
|
||||||
nr_rrc_ue_process_RadioBearerConfig(rrc, RadioBearerConfig);
|
} else
|
||||||
|
nr_rrc_ue_process_RadioBearerConfig(rrc, RadioBearerConfig);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1158,20 +1163,19 @@ static void nr_rrc_ue_process_rrcReconfiguration(NR_UE_RRC_INST_t *rrc, int gNB_
|
|||||||
LOG_E(NR_RRC, "\n");
|
LOG_E(NR_RRC, "\n");
|
||||||
// free the memory
|
// free the memory
|
||||||
SEQUENCE_free(&asn_DEF_NR_CellGroupConfig, (void *)cellGroupConfig, 1);
|
SEQUENCE_free(&asn_DEF_NR_CellGroupConfig, (void *)cellGroupConfig, 1);
|
||||||
|
} else {
|
||||||
|
if (LOG_DEBUGFLAG(DEBUG_ASN1))
|
||||||
|
xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void *) cellGroupConfig);
|
||||||
|
|
||||||
|
nr_rrc_cellgroup_configuration(rrc, cellGroupConfig, gNB_index);
|
||||||
|
AssertFatal(!IS_SA_MODE(get_softmodem_params()), "secondaryCellGroup only used in NSA for now\n");
|
||||||
|
nr_mac_rrc_message_t rrc_msg = {0};
|
||||||
|
rrc_msg.payload_type = NR_MAC_RRC_CONFIG_CG;
|
||||||
|
nr_mac_rrc_config_cg_t *config_cg = &rrc_msg.payload.config_cg;
|
||||||
|
config_cg->cellGroupConfig = cellGroupConfig;
|
||||||
|
config_cg->UE_NR_Capability = rrc->UECap.UE_NR_Capability;
|
||||||
|
nr_rrc_send_msg_to_mac(rrc, &rrc_msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (LOG_DEBUGFLAG(DEBUG_ASN1))
|
|
||||||
xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void *) cellGroupConfig);
|
|
||||||
|
|
||||||
nr_rrc_cellgroup_configuration(rrc, cellGroupConfig, gNB_index);
|
|
||||||
|
|
||||||
AssertFatal(!IS_SA_MODE(get_softmodem_params()), "secondaryCellGroup only used in NSA for now\n");
|
|
||||||
nr_mac_rrc_message_t rrc_msg = {0};
|
|
||||||
rrc_msg.payload_type = NR_MAC_RRC_CONFIG_CG;
|
|
||||||
nr_mac_rrc_config_cg_t *config_cg = &rrc_msg.payload.config_cg;
|
|
||||||
config_cg->cellGroupConfig = cellGroupConfig;
|
|
||||||
config_cg->UE_NR_Capability = rrc->UECap.UE_NR_Capability;
|
|
||||||
nr_rrc_send_msg_to_mac(rrc, &rrc_msg);
|
|
||||||
}
|
}
|
||||||
if (ie->measConfig) {
|
if (ie->measConfig) {
|
||||||
LOG_I(NR_RRC, "RRCReconfiguration includes Measurement Configuration\n");
|
LOG_I(NR_RRC, "RRCReconfiguration includes Measurement Configuration\n");
|
||||||
@@ -1681,8 +1685,13 @@ static void nr_rrc_manage_rlc_bearers(NR_UE_RRC_INST_t *rrc, const NR_CellGroupC
|
|||||||
nr_rlc_set_rlf_handler(rrc->ue_id, nr_rrc_signal_maxrtxindication);
|
nr_rlc_set_rlf_handler(rrc->ue_id, nr_rrc_signal_maxrtxindication);
|
||||||
} else { // DRB
|
} else { // DRB
|
||||||
NR_DRB_Identity_t drb_id = rlc_bearer->servedRadioBearer->choice.drb_Identity;
|
NR_DRB_Identity_t drb_id = rlc_bearer->servedRadioBearer->choice.drb_Identity;
|
||||||
nr_rlc_add_drb(rrc->ue_id, drb_id, rlc_bearer);
|
if (!rlc_bearer->rlc_Config) {
|
||||||
nr_rlc_set_rlf_handler(rrc->ue_id, nr_rrc_signal_maxrtxindication);
|
LOG_E(RLC, "RLC-Config not present but is mandatory for setup\n");
|
||||||
|
rrc->active_RLC_entity[lcid] = false;
|
||||||
|
} else {
|
||||||
|
nr_rlc_add_drb(rrc->ue_id, drb_id, rlc_bearer);
|
||||||
|
nr_rlc_set_rlf_handler(rrc->ue_id, nr_rrc_signal_maxrtxindication);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1710,7 +1719,10 @@ static void nr_rrc_process_reconfigurationWithSync(NR_UE_RRC_INST_t *rrc,
|
|||||||
rrc->arfcn_ssb = *dcc->frequencyInfoDL->absoluteFrequencySSB;
|
rrc->arfcn_ssb = *dcc->frequencyInfoDL->absoluteFrequencySSB;
|
||||||
|
|
||||||
// consider the target SpCell to be one with a physical cell identity indicated by the physCellId
|
// consider the target SpCell to be one with a physical cell identity indicated by the physCellId
|
||||||
rrc->phyCellID = *reconfigurationWithSync->spCellConfigCommon->physCellId;
|
if (!reconfigurationWithSync->spCellConfigCommon->physCellId)
|
||||||
|
LOG_E(NR_RRC, "physCellId absent but should be mandatory present upon cell change and cell addition\n");
|
||||||
|
else
|
||||||
|
rrc->phyCellID = *reconfigurationWithSync->spCellConfigCommon->physCellId;
|
||||||
}
|
}
|
||||||
|
|
||||||
NR_UE_Timers_Constants_t *tac = &rrc->timers_and_constants;
|
NR_UE_Timers_Constants_t *tac = &rrc->timers_and_constants;
|
||||||
@@ -2235,13 +2247,7 @@ static void nr_rrc_ue_process_ueCapabilityEnquiry(NR_UE_RRC_INST_t *rrc, NR_UECa
|
|||||||
AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", enc_rval.failed_type->name, enc_rval.encoded);
|
AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", enc_rval.failed_type->name, enc_rval.encoded);
|
||||||
rrc->UECap.sdu_size = (enc_rval.encoded + 7) / 8;
|
rrc->UECap.sdu_size = (enc_rval.encoded + 7) / 8;
|
||||||
LOG_I(PHY, "[RRC]UE NR Capability encoded, %d bytes (%zd bits)\n", rrc->UECap.sdu_size, enc_rval.encoded + 7);
|
LOG_I(PHY, "[RRC]UE NR Capability encoded, %d bytes (%zd bits)\n", rrc->UECap.sdu_size, enc_rval.encoded + 7);
|
||||||
/* RAT Container */
|
|
||||||
NR_UE_CapabilityRAT_Container_t *ue_CapabilityRAT_Container = CALLOC(1, sizeof(NR_UE_CapabilityRAT_Container_t));
|
|
||||||
ue_CapabilityRAT_Container->rat_Type = NR_RAT_Type_nr;
|
|
||||||
OCTET_STRING_fromBuf(&ue_CapabilityRAT_Container->ue_CapabilityRAT_Container, (const char *)rrc->UECap.sdu, rrc->UECap.sdu_size);
|
|
||||||
NR_UECapabilityEnquiry_IEs_t *ueCapabilityEnquiry_ie = UECapabilityEnquiry->criticalExtensions.choice.ueCapabilityEnquiry;
|
NR_UECapabilityEnquiry_IEs_t *ueCapabilityEnquiry_ie = UECapabilityEnquiry->criticalExtensions.choice.ueCapabilityEnquiry;
|
||||||
// ue_CapabilityRAT_Container.ueCapabilityRAT_Container.buf = UE_rrc_inst[ue_mod_idP].UECapability;
|
|
||||||
// ue_CapabilityRAT_Container.ueCapabilityRAT_Container.size = UE_rrc_inst[ue_mod_idP].UECapability_size;
|
|
||||||
AssertFatal(UECapabilityEnquiry->criticalExtensions.present == NR_UECapabilityEnquiry__criticalExtensions_PR_ueCapabilityEnquiry,
|
AssertFatal(UECapabilityEnquiry->criticalExtensions.present == NR_UECapabilityEnquiry__criticalExtensions_PR_ueCapabilityEnquiry,
|
||||||
"UECapabilityEnquiry->criticalExtensions.present (%d) != UECapabilityEnquiry__criticalExtensions_PR_c1 (%d)\n",
|
"UECapabilityEnquiry->criticalExtensions.present (%d) != UECapabilityEnquiry__criticalExtensions_PR_c1 (%d)\n",
|
||||||
UECapabilityEnquiry->criticalExtensions.present,NR_UECapabilityEnquiry__criticalExtensions_PR_ueCapabilityEnquiry);
|
UECapabilityEnquiry->criticalExtensions.present,NR_UECapabilityEnquiry__criticalExtensions_PR_ueCapabilityEnquiry);
|
||||||
@@ -2254,6 +2260,10 @@ static void nr_rrc_ue_process_ueCapabilityEnquiry(NR_UE_RRC_INST_t *rrc, NR_UECa
|
|||||||
|
|
||||||
for (int i = 0; i < ueCapabilityEnquiry_ie->ue_CapabilityRAT_RequestList.list.count; i++) {
|
for (int i = 0; i < ueCapabilityEnquiry_ie->ue_CapabilityRAT_RequestList.list.count; i++) {
|
||||||
if (ueCapabilityEnquiry_ie->ue_CapabilityRAT_RequestList.list.array[i]->rat_Type == NR_RAT_Type_nr) {
|
if (ueCapabilityEnquiry_ie->ue_CapabilityRAT_RequestList.list.array[i]->rat_Type == NR_RAT_Type_nr) {
|
||||||
|
/* RAT Container */
|
||||||
|
NR_UE_CapabilityRAT_Container_t *ue_CapabilityRAT_Container = CALLOC(1, sizeof(NR_UE_CapabilityRAT_Container_t));
|
||||||
|
ue_CapabilityRAT_Container->rat_Type = NR_RAT_Type_nr;
|
||||||
|
OCTET_STRING_fromBuf(&ue_CapabilityRAT_Container->ue_CapabilityRAT_Container, (const char *)rrc->UECap.sdu, rrc->UECap.sdu_size);
|
||||||
asn1cSeqAdd(&UEcapList->list, ue_CapabilityRAT_Container);
|
asn1cSeqAdd(&UEcapList->list, ue_CapabilityRAT_Container);
|
||||||
uint8_t buffer[500];
|
uint8_t buffer[500];
|
||||||
asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_UL_DCCH_Message, NULL, (void *)&ul_dcch_msg, buffer, 500);
|
asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_UL_DCCH_Message, NULL, (void *)&ul_dcch_msg, buffer, 500);
|
||||||
@@ -2267,8 +2277,7 @@ static void nr_rrc_ue_process_ueCapabilityEnquiry(NR_UE_RRC_INST_t *rrc, NR_UECa
|
|||||||
nr_pdcp_data_req_srb(rrc->ue_id, srb_id, 0, (enc_rval.encoded + 7) / 8, buffer, deliver_pdu_srb_rlc, NULL);
|
nr_pdcp_data_req_srb(rrc->ue_id, srb_id, 0, (enc_rval.encoded + 7) / 8, buffer, deliver_pdu_srb_rlc, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Free struct members after it's done
|
/* Free struct members after it's done including locally allocated ue_CapabilityRAT_Container */
|
||||||
including locally allocated ue_CapabilityRAT_Container */
|
|
||||||
ASN_STRUCT_RESET(asn_DEF_NR_UL_DCCH_Message, &ul_dcch_msg);
|
ASN_STRUCT_RESET(asn_DEF_NR_UL_DCCH_Message, &ul_dcch_msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user