Minor fixes, comments, Clang formatting
- comments to improve readability of the code - Clang formatting of E1 / RRC (partial)
This commit is contained in:
+62
-31
@@ -155,15 +155,24 @@ static void rrc_deliver_dl_rrc_message(void *deliver_pdu_data, ue_id_t ue_id, in
|
||||
data->rrc->mac_rrc.dl_rrc_message_transfer(data->assoc_id, data->dl_rrc);
|
||||
}
|
||||
|
||||
|
||||
void nr_rrc_transfer_protected_rrc_message(const gNB_RRC_INST *rrc, const gNB_RRC_UE_t *ue_p, uint8_t srb_id, const uint8_t* buffer, int size)
|
||||
void nr_rrc_transfer_protected_rrc_message(const gNB_RRC_INST *rrc,
|
||||
const gNB_RRC_UE_t *ue_p,
|
||||
uint8_t srb_id,
|
||||
const uint8_t *buffer,
|
||||
int size)
|
||||
{
|
||||
DevAssert(size > 0);
|
||||
f1_ue_data_t ue_data = cu_get_f1_ue_data(ue_p->rrc_ue_id);
|
||||
RETURN_IF_INVALID_ASSOC_ID(ue_data);
|
||||
f1ap_dl_rrc_message_t dl_rrc = {.gNB_CU_ue_id = ue_p->rrc_ue_id, .gNB_DU_ue_id = ue_data.secondary_ue, .srb_id = srb_id};
|
||||
deliver_dl_rrc_message_data_t data = {.rrc = rrc, .dl_rrc = &dl_rrc, .assoc_id = ue_data.du_assoc_id };
|
||||
nr_pdcp_data_req_srb(ue_p->rrc_ue_id, srb_id, rrc_gNB_mui++, size, (unsigned char *const)buffer, rrc_deliver_dl_rrc_message, &data);
|
||||
deliver_dl_rrc_message_data_t data = {.rrc = rrc, .dl_rrc = &dl_rrc, .assoc_id = ue_data.du_assoc_id};
|
||||
nr_pdcp_data_req_srb(ue_p->rrc_ue_id,
|
||||
srb_id,
|
||||
rrc_gNB_mui++,
|
||||
size,
|
||||
(unsigned char *const)buffer,
|
||||
rrc_deliver_dl_rrc_message,
|
||||
&data);
|
||||
}
|
||||
|
||||
static int get_dl_band(const f1ap_served_cell_info_t *cell_info)
|
||||
@@ -189,9 +198,13 @@ static int get_dl_bw(const f1ap_served_cell_info_t *cell_info)
|
||||
static int get_ssb_arfcn(const f1ap_served_cell_info_t *cell_info, const NR_MIB_t *mib, const NR_SIB1_t *sib1)
|
||||
{
|
||||
DevAssert(cell_info != NULL && sib1 != NULL && mib != NULL);
|
||||
const NR_FrequencyInfoDL_SIB_t* freq_info = &sib1->servingCellConfigCommon->downlinkConfigCommon.frequencyInfoDL;
|
||||
AssertFatal(freq_info->scs_SpecificCarrierList.list.count == 1, "cannot handle more than one carrier, but has %d\n", freq_info->scs_SpecificCarrierList.list.count);
|
||||
AssertFatal(freq_info->scs_SpecificCarrierList.list.array[0]->offsetToCarrier == 0, "cannot handle offsetToCarrier != 0, but is %ld\n", freq_info->scs_SpecificCarrierList.list.array[0]->offsetToCarrier);
|
||||
const NR_FrequencyInfoDL_SIB_t *freq_info = &sib1->servingCellConfigCommon->downlinkConfigCommon.frequencyInfoDL;
|
||||
AssertFatal(freq_info->scs_SpecificCarrierList.list.count == 1,
|
||||
"cannot handle more than one carrier, but has %d\n",
|
||||
freq_info->scs_SpecificCarrierList.list.count);
|
||||
AssertFatal(freq_info->scs_SpecificCarrierList.list.array[0]->offsetToCarrier == 0,
|
||||
"cannot handle offsetToCarrier != 0, but is %ld\n",
|
||||
freq_info->scs_SpecificCarrierList.list.array[0]->offsetToCarrier);
|
||||
|
||||
long offsetToPointA = freq_info->offsetToPointA;
|
||||
long kssb = mib->ssb_SubcarrierOffset;
|
||||
@@ -208,16 +221,25 @@ static int get_ssb_arfcn(const f1ap_served_cell_info_t *cell_info, const NR_MIB_
|
||||
else
|
||||
AssertFatal(false, "Invalid absoluteFrequencyPointA: %d\n", dl_arfcn);
|
||||
|
||||
|
||||
uint64_t freqpointa = from_nrarfcn(band, scs, dl_arfcn);
|
||||
// offsetToPointA and kSSB are both on 15kHz SCS for FR1 and 60kHz SCS for FR2 (see 38.211 sections 7.4.3.1 and 4.4.4.2)
|
||||
// SSB uses the SCS of the cell and is 20 RBs wide, so use 10
|
||||
uint64_t freqssb = freqpointa + scaling * 15000 * (offsetToPointA * 12 + kssb) + 10ll * 12 * (1 << scs) * 15000;
|
||||
uint64_t freqssb = freqpointa + scaling * 15000 * (offsetToPointA * 12 + kssb) + 10ll * 12 * (1 << scs) * 15000;
|
||||
int bw_index = get_supported_band_index(scs, band, get_dl_bw(cell_info));
|
||||
int band_size_hz = get_supported_bw_mhz(band > 256 ? FR2 : FR1, bw_index) * 1000 * 1000;
|
||||
uint32_t ssb_arfcn = to_nrarfcn(band, freqssb, scs, band_size_hz);
|
||||
|
||||
LOG_D(RRC, "freqpointa %ld Hz/%d offsetToPointA %ld kssb %ld scs %d band %d band_size_hz %d freqssb %ld Hz/%d\n", freqpointa, dl_arfcn, offsetToPointA, kssb, scs, band, band_size_hz, freqssb, ssb_arfcn);
|
||||
LOG_D(NR_RRC,
|
||||
"freqpointa %ld Hz/%d offsetToPointA %ld kssb %ld scs %d band %d band_size_hz %d freqssb %ld Hz/%d\n",
|
||||
freqpointa,
|
||||
dl_arfcn,
|
||||
offsetToPointA,
|
||||
kssb,
|
||||
scs,
|
||||
band,
|
||||
band_size_hz,
|
||||
freqssb,
|
||||
ssb_arfcn);
|
||||
|
||||
if (RC.nrmac) {
|
||||
// debugging: let's test this is the correct ARFCN
|
||||
@@ -228,7 +250,11 @@ static int get_ssb_arfcn(const f1ap_served_cell_info_t *cell_info, const NR_MIB_
|
||||
// taken out (but the reestablishment will likely not work).
|
||||
const NR_ServingCellConfigCommon_t *scc = RC.nrmac[0]->common_channels[0].ServingCellConfigCommon;
|
||||
uint32_t scc_ssb_arfcn = *scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB;
|
||||
AssertFatal(ssb_arfcn == scc_ssb_arfcn, "mismatch of SCC SSB ARFCN original %d vs. computed %d! Note: you can remove this Assert, the gNB might run but UE connection instable\n", scc_ssb_arfcn, ssb_arfcn);
|
||||
AssertFatal(ssb_arfcn == scc_ssb_arfcn,
|
||||
"mismatch of SCC SSB ARFCN original %d vs. computed %d! Note: you can remove this Assert, the gNB might run but UE "
|
||||
"connection instable\n",
|
||||
scc_ssb_arfcn,
|
||||
ssb_arfcn);
|
||||
}
|
||||
|
||||
return ssb_arfcn;
|
||||
@@ -960,13 +986,11 @@ static void rrc_gNB_generate_RRCReestablishment(rrc_gNB_ue_context_t *ue_context
|
||||
const uint8_t *masterCellGroup_from_DU,
|
||||
const rnti_t old_rnti,
|
||||
const nr_rrc_du_container_t *du)
|
||||
//-----------------------------------------------------------------------------
|
||||
{
|
||||
module_id_t module_id = 0;
|
||||
gNB_RRC_INST *rrc = RC.nrrrc[module_id];
|
||||
int enable_ciphering = 0;
|
||||
gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context;
|
||||
|
||||
uint8_t buffer[RRC_BUF_SIZE] = {0};
|
||||
uint8_t xid = rrc_gNB_get_next_transaction_identifier(module_id);
|
||||
ue_p->xids[xid] = RRC_REESTABLISH;
|
||||
@@ -985,8 +1009,12 @@ static void rrc_gNB_generate_RRCReestablishment(rrc_gNB_ue_context_t *ue_context
|
||||
nr_derive_key(UP_ENC_ALG, ue_p->ciphering_algorithm, ue_p->kgnb, kUPenc);
|
||||
nr_derive_key(RRC_ENC_ALG, ue_p->ciphering_algorithm, ue_p->kgnb, kRRCenc);
|
||||
nr_derive_key(RRC_INT_ALG, ue_p->integrity_algorithm, ue_p->kgnb, kRRCint);
|
||||
|
||||
LOG_I(NR_RRC, "Set PDCP security UE %d RNTI %04x nca %ld nia %d in RRCReestablishment\n", ue_p->rrc_ue_id, ue_p->rnti, ue_p->ciphering_algorithm, ue_p->integrity_algorithm);
|
||||
LOG_I(NR_RRC,
|
||||
"Set PDCP security UE %d RNTI %04x nca %ld nia %d in RRCReestablishment\n",
|
||||
ue_p->rrc_ue_id,
|
||||
ue_p->rnti,
|
||||
ue_p->ciphering_algorithm,
|
||||
ue_p->integrity_algorithm);
|
||||
uint8_t security_mode =
|
||||
enable_ciphering ? ue_p->ciphering_algorithm | (ue_p->integrity_algorithm << 4) : 0 | (ue_p->integrity_algorithm << 4);
|
||||
|
||||
@@ -1085,11 +1113,11 @@ static void rrc_gNB_process_RRCReestablishmentComplete(const protocol_ctxt_t *co
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
int nr_rrc_reconfiguration_req(rrc_gNB_ue_context_t *const ue_context_pP,
|
||||
protocol_ctxt_t *const ctxt_pP,
|
||||
const int dl_bwp_id,
|
||||
const int ul_bwp_id) {
|
||||
|
||||
int nr_rrc_reconfiguration_req(rrc_gNB_ue_context_t *const ue_context_pP,
|
||||
protocol_ctxt_t *const ctxt_pP,
|
||||
const int dl_bwp_id,
|
||||
const int ul_bwp_id)
|
||||
{
|
||||
uint8_t xid = rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id);
|
||||
gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context;
|
||||
ue_p->xids[xid] = RRC_DEDICATED_RECONF;
|
||||
@@ -1112,7 +1140,10 @@ int nr_rrc_reconfiguration_req(rrc_gNB_ue_context_t *const ue_context_pP
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void rrc_handle_RRCSetupRequest(gNB_RRC_INST *rrc, sctp_assoc_t assoc_id, const NR_RRCSetupRequest_IEs_t *rrcSetupRequest, const f1ap_initial_ul_rrc_message_t *msg)
|
||||
static void rrc_handle_RRCSetupRequest(gNB_RRC_INST *rrc,
|
||||
sctp_assoc_t assoc_id,
|
||||
const NR_RRCSetupRequest_IEs_t *rrcSetupRequest,
|
||||
const f1ap_initial_ul_rrc_message_t *msg)
|
||||
{
|
||||
rrc_gNB_ue_context_t *ue_context_p = NULL;
|
||||
if (NR_InitialUE_Identity_PR_randomValue == rrcSetupRequest->ue_Identity.present) {
|
||||
@@ -1189,7 +1220,10 @@ static const char *get_reestab_cause(NR_ReestablishmentCause_t c)
|
||||
return "UNKNOWN Failure (ASN.1 decoder error?)";
|
||||
}
|
||||
|
||||
static void rrc_handle_RRCReestablishmentRequest(gNB_RRC_INST *rrc, sctp_assoc_t assoc_id, const NR_RRCReestablishmentRequest_IEs_t *req, const f1ap_initial_ul_rrc_message_t *msg)
|
||||
static void rrc_handle_RRCReestablishmentRequest(gNB_RRC_INST *rrc,
|
||||
sctp_assoc_t assoc_id,
|
||||
const NR_RRCReestablishmentRequest_IEs_t *req,
|
||||
const f1ap_initial_ul_rrc_message_t *msg)
|
||||
{
|
||||
uint64_t random_value = 0;
|
||||
const char *scause = get_reestab_cause(req->reestablishmentCause);
|
||||
@@ -1235,9 +1269,7 @@ static void rrc_handle_RRCReestablishmentRequest(gNB_RRC_INST *rrc, sctp_assoc_t
|
||||
// 3GPP TS 38.321 version 15.13.0 Section 7.1 Table 7.1-1: RNTI values
|
||||
if (req->ue_Identity.c_RNTI < 0x1 || req->ue_Identity.c_RNTI > 0xffef) {
|
||||
/* c_RNTI range error should not happen */
|
||||
LOG_E(NR_RRC,
|
||||
"NR_RRCReestablishmentRequest c_RNTI %04lx range error, fallback to RRC setup\n",
|
||||
req->ue_Identity.c_RNTI);
|
||||
LOG_E(NR_RRC, "NR_RRCReestablishmentRequest c_RNTI %04lx range error, fallback to RRC setup\n", req->ue_Identity.c_RNTI);
|
||||
goto fallback_rrc_setup;
|
||||
}
|
||||
|
||||
@@ -1300,9 +1332,7 @@ static int handle_rrcReestablishmentComplete(const protocol_ctxt_t *const ctxt_p
|
||||
|
||||
DevAssert(reestablishment_complete->criticalExtensions.present
|
||||
== NR_RRCReestablishmentComplete__criticalExtensions_PR_rrcReestablishmentComplete);
|
||||
rrc_gNB_process_RRCReestablishmentComplete(ctxt_pP,
|
||||
ue_context_p,
|
||||
reestablishment_complete->rrc_TransactionIdentifier);
|
||||
rrc_gNB_process_RRCReestablishmentComplete(ctxt_pP, ue_context_p, reestablishment_complete->rrc_TransactionIdentifier);
|
||||
|
||||
UE->ue_reestablishment_counter++;
|
||||
return 0;
|
||||
@@ -2069,7 +2099,7 @@ void rrc_gNB_process_e1_bearer_context_setup_resp(e1ap_bearer_setup_resp_t *resp
|
||||
resp->gNB_cu_up_ue_id);
|
||||
|
||||
// save the tunnel address for the PDU sessions
|
||||
for (int i=0; i < resp->numPDUSessions; i++) {
|
||||
for (int i = 0; i < resp->numPDUSessions; i++) {
|
||||
pdu_session_setup_t *e1_pdu = &resp->pduSession[i];
|
||||
rrc_pdu_session_param_t *rrc_pdu = find_pduSession(UE, e1_pdu->id, false);
|
||||
if (rrc_pdu == NULL) {
|
||||
@@ -2178,7 +2208,7 @@ void rrc_gNB_process_e1_bearer_context_setup_resp(e1ap_bearer_setup_resp_t *resp
|
||||
|
||||
/**
|
||||
* @brief E1AP Bearer Context Modification Response processing on CU-CP
|
||||
*/
|
||||
*/
|
||||
void rrc_gNB_process_e1_bearer_context_modif_resp(const e1ap_bearer_modif_resp_t *resp)
|
||||
{
|
||||
gNB_RRC_INST *rrc = RC.nrrrc[0];
|
||||
@@ -2197,7 +2227,7 @@ void rrc_gNB_process_e1_bearer_context_modif_resp(const e1ap_bearer_modif_resp_t
|
||||
|
||||
/**
|
||||
* @brief E1AP Bearer Context Release processing
|
||||
*/
|
||||
*/
|
||||
void rrc_gNB_process_e1_bearer_context_release_cplt(const e1ap_bearer_release_cplt_t *cplt)
|
||||
{
|
||||
// there is not really anything to do here as of now
|
||||
@@ -2364,6 +2394,7 @@ void *rrc_gnb_task(void *args_p) {
|
||||
break;
|
||||
|
||||
/* Messages from PDCP */
|
||||
/* From DU -> CU */
|
||||
case F1AP_UL_RRC_MESSAGE:
|
||||
PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt,
|
||||
instance,
|
||||
|
||||
Reference in New Issue
Block a user