handle reestablishPDCP in RadioBearerConfig
This commit is contained in:
@@ -1225,8 +1225,10 @@ static void nr_rrc_ue_process_RadioBearerConfig(NR_UE_RRC_INST_t *ue_rrc,
|
||||
if (LOG_DEBUGFLAG(DEBUG_ASN1))
|
||||
xer_fprint(stdout, &asn_DEF_NR_RadioBearerConfig, (const void *)radioBearerConfig);
|
||||
|
||||
if (radioBearerConfig->srb3_ToRelease)
|
||||
if (radioBearerConfig->srb3_ToRelease) {
|
||||
nr_pdcp_release_srb(ue_rrc->ue_id, 3);
|
||||
ue_rrc->Srb[3] = RB_NOT_PRESENT;
|
||||
}
|
||||
|
||||
uint8_t kRRCenc[NR_K_KEY_SIZE] = {0};
|
||||
uint8_t kRRCint[NR_K_KEY_SIZE] = {0};
|
||||
@@ -1251,7 +1253,8 @@ static void nr_rrc_ue_process_RadioBearerConfig(NR_UE_RRC_INST_t *ue_rrc,
|
||||
if (radioBearerConfig->srb_ToAddModList != NULL) {
|
||||
for (int cnt = 0; cnt < radioBearerConfig->srb_ToAddModList->list.count; cnt++) {
|
||||
struct NR_SRB_ToAddMod *srb = radioBearerConfig->srb_ToAddModList->list.array[cnt];
|
||||
if (ue_rrc->Srb[srb->srb_Identity] == RB_NOT_PRESENT)
|
||||
if (ue_rrc->Srb[srb->srb_Identity] == RB_NOT_PRESENT) {
|
||||
ue_rrc->Srb[srb->srb_Identity] = RB_ESTABLISHED;
|
||||
add_srb(false,
|
||||
ue_rrc->ue_id,
|
||||
radioBearerConfig->srb_ToAddModList->list.array[cnt],
|
||||
@@ -1259,21 +1262,28 @@ static void nr_rrc_ue_process_RadioBearerConfig(NR_UE_RRC_INST_t *ue_rrc,
|
||||
ue_rrc->integrityProtAlgorithm,
|
||||
kRRCenc,
|
||||
kRRCint);
|
||||
}
|
||||
else {
|
||||
AssertFatal(srb->discardOnPDCP == NULL, "discardOnPDCP not yet implemented\n");
|
||||
AssertFatal(srb->reestablishPDCP == NULL, "reestablishPDCP not yet implemented\n");
|
||||
if (srb->reestablishPDCP) {
|
||||
ue_rrc->Srb[srb->srb_Identity] = RB_ESTABLISHED;
|
||||
nr_pdcp_reestablishment(ue_rrc->ue_id, srb->srb_Identity, true);
|
||||
// TODO configure the PDCP entity to apply the integrity protection algorithm
|
||||
// TODO configure the PDCP entity to apply the ciphering algorithm
|
||||
}
|
||||
if (srb->pdcp_Config && srb->pdcp_Config->t_Reordering)
|
||||
nr_pdcp_reconfigure_srb(ue_rrc->ue_id, srb->srb_Identity, *srb->pdcp_Config->t_Reordering);
|
||||
}
|
||||
ue_rrc->Srb[srb->srb_Identity] = RB_ESTABLISHED;
|
||||
}
|
||||
}
|
||||
|
||||
if (radioBearerConfig->drb_ToReleaseList) {
|
||||
for (int cnt = 0; cnt < radioBearerConfig->drb_ToReleaseList->list.count; cnt++) {
|
||||
NR_DRB_Identity_t *DRB_id = radioBearerConfig->drb_ToReleaseList->list.array[cnt];
|
||||
if (DRB_id)
|
||||
if (DRB_id) {
|
||||
nr_pdcp_release_drb(ue_rrc->ue_id, *DRB_id);
|
||||
set_DRB_status(ue_rrc, *DRB_id, RB_NOT_PRESENT);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1285,9 +1295,13 @@ static void nr_rrc_ue_process_RadioBearerConfig(NR_UE_RRC_INST_t *ue_rrc,
|
||||
for (int cnt = 0; cnt < radioBearerConfig->drb_ToAddModList->list.count; cnt++) {
|
||||
struct NR_DRB_ToAddMod *drb = radioBearerConfig->drb_ToAddModList->list.array[cnt];
|
||||
int DRB_id = drb->drb_Identity;
|
||||
/* DRB is already established and configured */
|
||||
if (get_DRB_status(ue_rrc, DRB_id) == RB_ESTABLISHED) {
|
||||
AssertFatal(drb->reestablishPDCP == NULL, "reestablishPDCP not yet implemented\n");
|
||||
if (get_DRB_status(ue_rrc, DRB_id) != RB_NOT_PRESENT) {
|
||||
if (drb->reestablishPDCP) {
|
||||
set_DRB_status(ue_rrc, DRB_id, RB_ESTABLISHED);
|
||||
nr_pdcp_reestablishment(ue_rrc->ue_id, DRB_id, false);
|
||||
// TODO configure the PDCP entity to apply the integrity protection algorithm
|
||||
// TODO configure the PDCP entity to apply the ciphering algorithm
|
||||
}
|
||||
AssertFatal(drb->recoverPDCP == NULL, "recoverPDCP not yet implemented\n");
|
||||
/* sdap-Config is included (SA mode) */
|
||||
NR_SDAP_Config_t *sdap_Config = drb->cnAssociation ? drb->cnAssociation->choice.sdap_Config : NULL;
|
||||
|
||||
Reference in New Issue
Block a user