diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c index 7e6cd00097..de03f306cb 100644 --- a/openair2/RRC/NR/rrc_gNB.c +++ b/openair2/RRC/NR/rrc_gNB.c @@ -2854,6 +2854,10 @@ void *rrc_gnb_task(void *args_p) { rrc_gNB_process_NGAP_PDUSESSION_RELEASE_COMMAND(msg_p, instance); break; + case NGAP_DL_RAN_STATUS_TRANSFER: + rrc_gNB_process_NGAP_DL_RAN_STATUS_TRANSFER(msg_p, instance); + break; + /* Messages from F1AP task */ case F1AP_SETUP_REQ: AssertFatal(!NODE_IS_DU(RC.nrrrc[instance]->node_type), "should not receive F1AP_SETUP_REQUEST in DU!\n"); diff --git a/openair2/RRC/NR/rrc_gNB_NGAP.c b/openair2/RRC/NR/rrc_gNB_NGAP.c index e845369951..bddd0521d2 100644 --- a/openair2/RRC/NR/rrc_gNB_NGAP.c +++ b/openair2/RRC/NR/rrc_gNB_NGAP.c @@ -1605,3 +1605,51 @@ void rrc_gNB_send_NGAP_HANDOVER_REQUIRED(gNB_RRC_INST *rrc, NGAP_HANDOVER_REQUIRED(msg_p) = msg; itti_send_msg_to_task(TASK_NGAP, rrc->module_id, msg_p); } + +int rrc_gNB_process_NGAP_DL_RAN_STATUS_TRANSFER(MessageDef *msg_p, instance_t instance) +{ + const ngap_ran_status_transfer_t *cmd = &NGAP_DL_RAN_STATUS_TRANSFER(msg_p); + gNB_RRC_INST *rrc = RC.nrrrc[instance]; + rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context(rrc, cmd->gnb_ue_ngap_id); + + if (!ue_context_p) { + LOG_E(NR_RRC, "[gNB %ld] No UE context for gNB_ue_ngap_id %u\n", instance, cmd->gnb_ue_ngap_id); + return -1; + } + + gNB_RRC_UE_t *UE = &ue_context_p->ue_context; + LOG_I(NR_RRC, + "[gNB %ld] DL RAN Status Transfer for gNB_ue_ngap_id %u AMF_UE_NGAP_ID %lu\n", + instance, + cmd->gnb_ue_ngap_id, + cmd->amf_ue_ngap_id); + + for (int i = 0; i < cmd->ran_status.nb_drb; ++i) { + const ngap_drb_status_t *s = &cmd->ran_status.drb_status_list[i]; + LOG_I(NR_RRC, + "DL RAN Status Transfer - DRB ID %d:\n" + " UL COUNT: PDCP SN = %u, HFN = %u (%s)\n" + " DL COUNT: PDCP SN = %u, HFN = %u (%s)\n", + s->drb_id, + s->ul_count.pdcp_sn, + s->ul_count.hfn, + s->ul_count.sn_len == NGAP_SN_LENGTH_18 ? "18-bit" : "12-bit", + s->dl_count.pdcp_sn, + s->dl_count.hfn, + s->dl_count.sn_len == NGAP_SN_LENGTH_18 ? "18-bit" : "12-bit"); + + // Send to PDCP layer + for (int j = 0; j < MAX_DRBS_PER_UE; j++) { + if (UE->established_drbs[j].drb_id == s->drb_id) + nr_pdcp_update_ran_status(UE->rrc_ue_id, + s->drb_id, + s->ul_count.pdcp_sn, + s->ul_count.hfn, + s->dl_count.pdcp_sn, + s->dl_count.hfn, + s->dl_count.sn_len == NGAP_SN_LENGTH_18); + } + } + + return 0; +} diff --git a/openair2/RRC/NR/rrc_gNB_NGAP.h b/openair2/RRC/NR/rrc_gNB_NGAP.h index babd82cb01..d1867173a2 100644 --- a/openair2/RRC/NR/rrc_gNB_NGAP.h +++ b/openair2/RRC/NR/rrc_gNB_NGAP.h @@ -108,4 +108,6 @@ void rrc_gNB_send_NGAP_HANDOVER_NOTIFY(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE); int rrc_gNB_send_NGAP_ul_ran_status_transfer(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE, const int n_to_mod, const e1_pdcp_status_info_t *pdcp_status); +int rrc_gNB_process_NGAP_DL_RAN_STATUS_TRANSFER(MessageDef *msg_p, instance_t instance); + #endif