gNB: add function nr_update_sib19() allowing to update SIB19 information

This commit is contained in:
Thomas Schlichter
2025-06-20 11:15:49 +00:00
parent 69d1d5fb5f
commit 99f3628569
6 changed files with 147 additions and 0 deletions
+2
View File
@@ -60,3 +60,5 @@ MESSAGE_DEF(NR_RRC_MAC_CCCH_DATA_IND, MESSAGE_PRIORITY_MED_PLUS, NRRrcMacCcch
MESSAGE_DEF(NR_RRC_MAC_BCCH_DATA_IND, MESSAGE_PRIORITY_MED_PLUS, NRRrcMacBcchDataInd, nr_rrc_mac_bcch_data_ind)
MESSAGE_DEF(NR_RRC_MAC_SBCCH_DATA_IND, MESSAGE_PRIORITY_MED_PLUS, NRRrcMacSBcchDataInd, nr_rrc_mac_sbcch_data_ind)
// Message to GNB_APP to update SIB19 satellite position information
MESSAGE_DEF(GNB_SAT_POSITION_UPDATE, MESSAGE_PRIORITY_MED, gnb_sat_position_update_t, gnb_sat_position_update)
+3
View File
@@ -31,6 +31,7 @@
#include <LTE_DRX-Config.h>
#include "OCTET_STRING.h"
#include "NR_MAC_gNB/mac_config.h"
//-------------------------------------------------------------------------------------------//
// Defines to access message fields.
@@ -61,6 +62,8 @@
#define RRC_MAC_DRX_CONFIG_REQ(mSGpTR) (mSGpTR)->ittiMsg.rrc_mac_drx_config_req
#define GNB_SAT_POSITION_UPDATE(mSGpTR) (mSGpTR)->ittiMsg.gnb_sat_position_update
// Some constants from "LAYER2/MAC/defs.h"
#define BCCH_SDU_SIZE (512)
#define BCCH_SDU_MBMS_SIZE (512)
+5
View File
@@ -212,6 +212,11 @@ void *gNB_app_task(void *args_p)
LOG_I(GNB_APP, " Received %s: timer_id %ld\n", msg_name, TIMER_HAS_EXPIRED(msg_p).timer_id);
break;
case GNB_SAT_POSITION_UPDATE:
LOG_I(GNB_APP, " Received GNB_SAT_POSITION_UPDATE message\n");
nr_update_sib19(&GNB_SAT_POSITION_UPDATE(msg_p));
break;
default:
LOG_E(GNB_APP, "Received unexpected message %s\n", msg_name);
break;
+90
View File
@@ -927,6 +927,96 @@ bool nr_mac_configure_other_sib(gNB_MAC_INST *nrmac, int num_cu_sib, const f1ap_
return true;
}
bool nr_update_sib19(const gnb_sat_position_update_t *sat_position)
{
gNB_MAC_INST *nrmac = RC.nrmac[0];
NR_COMMON_channels_t *cc = &nrmac->common_channels[0];
NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon;
if (!scc || !scc->ext2 || !scc->ext2->ntn_Config_r17)
return false;
const vector_t *pos = &sat_position->position;
const vector_t *vel = &sat_position->velocity;
LOG_D(NR_MAC, "SFN = %d, SubFrame = %d\n", sat_position->sfn, sat_position->subframe);
LOG_D(NR_MAC, "TA_Common: value %d, %f msec\n", sat_position->delay, sat_position->delay * 4.072e-6);
LOG_D(NR_MAC, "TA_CommonDrift: value %d, = %f µsec/sec\n", sat_position->drift, sat_position->drift * 0.2e-3);
LOG_D(NR_MAC, "TA_CommonDriftVariant: value %d, %f µsec/sec^2\n", sat_position->accel, sat_position->accel * 0.2e-4);
LOG_D(NR_MAC, "SAT Position: values %d/%d/%d, %.3f/%3f/%3f metres in X/Y/Z\n", pos->X, pos->Y, pos->Z, pos->X * 1.3, pos->Y * 1.3, pos->Z * 1.3);
LOG_D(NR_MAC, "SAT Velocity: values %d/%d/%d, %.3f/%3f/%3f m/s in X/Y/Z\n", vel->X, vel->Y, vel->Z, vel->X * 0.06, vel->Y * 0.06, vel->Z * 0.06);
NR_SCHED_LOCK(&nrmac->sched_lock);
if (!scc->ext2->ntn_Config_r17->epochTime_r17)
scc->ext2->ntn_Config_r17->epochTime_r17 = calloc (1, sizeof(*scc->ext2->ntn_Config_r17->epochTime_r17));
NR_EpochTime_r17_t *epoch_time_r17 = scc->ext2->ntn_Config_r17->epochTime_r17;
epoch_time_r17->sfn_r17 = sat_position->sfn;
epoch_time_r17->subFrameNR_r17 = sat_position->subframe;
if (!scc->ext2->ntn_Config_r17->ta_Info_r17)
scc->ext2->ntn_Config_r17->ta_Info_r17 = calloc(1, sizeof(*scc->ext2->ntn_Config_r17->ta_Info_r17));
NR_TA_Info_r17_t *sib19_ta_info = scc->ext2->ntn_Config_r17->ta_Info_r17;
// SIB19 provides Round trip delay on feeder link (between gNB and SAT).
sib19_ta_info->ta_Common_r17 = sat_position->delay;
if (sat_position->drift) {
if (!sib19_ta_info->ta_CommonDrift_r17)
sib19_ta_info->ta_CommonDrift_r17 = calloc(1, sizeof(*sib19_ta_info->ta_CommonDrift_r17));
*sib19_ta_info->ta_CommonDrift_r17 = sat_position->drift;
} else
free_and_zero(sib19_ta_info->ta_CommonDrift_r17);
if (sat_position->accel) {
if (!sib19_ta_info->ta_CommonDriftVariant_r17)
sib19_ta_info->ta_CommonDriftVariant_r17 = calloc(1, sizeof(*sib19_ta_info->ta_CommonDriftVariant_r17));
*sib19_ta_info->ta_CommonDriftVariant_r17 = sat_position->accel;
} else
free_and_zero(sib19_ta_info->ta_CommonDriftVariant_r17);
// Currently PositionVelocity is supported and not yet the OrbitalParams
if (!scc->ext2->ntn_Config_r17->ephemerisInfo_r17) {
scc->ext2->ntn_Config_r17->ephemerisInfo_r17 = calloc(1, sizeof(*scc->ext2->ntn_Config_r17->ephemerisInfo_r17));
scc->ext2->ntn_Config_r17->ephemerisInfo_r17->present = NR_EphemerisInfo_r17_PR_NOTHING;
}
if (scc->ext2->ntn_Config_r17->ephemerisInfo_r17->present == NR_EphemerisInfo_r17_PR_orbital_r17) {
ASN_STRUCT_FREE(asn_DEF_NR_Orbital_r17, scc->ext2->ntn_Config_r17->ephemerisInfo_r17->choice.orbital_r17);
scc->ext2->ntn_Config_r17->ephemerisInfo_r17->choice.orbital_r17 = NULL;
scc->ext2->ntn_Config_r17->ephemerisInfo_r17->present = NR_EphemerisInfo_r17_PR_NOTHING;
}
if (!scc->ext2->ntn_Config_r17->ephemerisInfo_r17->choice.positionVelocity_r17)
scc->ext2->ntn_Config_r17->ephemerisInfo_r17->choice.positionVelocity_r17 =
calloc(1, sizeof(*scc->ext2->ntn_Config_r17->ephemerisInfo_r17->choice.positionVelocity_r17));
scc->ext2->ntn_Config_r17->ephemerisInfo_r17->present = NR_EphemerisInfo_r17_PR_positionVelocity_r17;
NR_PositionVelocity_r17_t *sib19_PosVel = scc->ext2->ntn_Config_r17->ephemerisInfo_r17->choice.positionVelocity_r17;
sib19_PosVel->positionX_r17 = pos->X;
sib19_PosVel->positionY_r17 = pos->Y;
sib19_PosVel->positionZ_r17 = pos->Z;
sib19_PosVel->velocityVX_r17 = vel->X;
sib19_PosVel->velocityVY_r17 = vel->Y;
sib19_PosVel->velocityVZ_r17 = vel->Z;
NR_SystemInformation_IEs_t *sysInfov17 = calloc(1, sizeof(*sysInfov17)); // for othersibs
struct NR_SystemInformation_IEs__sib_TypeAndInfo__Member *type_du = calloc(1, sizeof(*type_du));
type_du->present = NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib19_v1700;
NR_SIB19_r17_t *sib19 = get_SIB19_NR(cc->ServingCellConfigCommon);
type_du->choice.sib19_v1700 = sib19;
add_sib_to_systeminformation(sysInfov17, type_du);
cc->other_sib_bcch_length[1] = encode_sysinfo_ie(sysInfov17, cc->other_sib_bcch_pdu[1], sizeof(cc->other_sib_bcch_pdu[1]));
AssertFatal(cc->other_sib_bcch_length[1] > 0, "could not encode SIB19\n");
ASN_STRUCT_FREE(asn_DEF_NR_SystemInformation_IEs, sysInfov17);
NR_SCHED_UNLOCK(&nrmac->sched_lock);
return true;
}
void prepare_du_configuration_update(gNB_MAC_INST *mac,
f1ap_served_cell_info_t *info,
NR_BCCH_BCH_Message_t *mib,
+46
View File
@@ -0,0 +1,46 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#ifndef __LAYER2_NR_MAC_CONFIG_H__
#define __LAYER2_NR_MAC_CONFIG_H__
#include <stdint.h>
typedef struct vector_s {
int X;
int Y;
int Z;
} vector_t;
// Format similar to values sent in SIB19
typedef struct gnb_sat_position_update_s {
int sfn;
int subframe;
uint32_t delay;
int drift;
uint32_t accel;
vector_t position;
vector_t velocity;
} gnb_sat_position_update_t;
bool nr_update_sib19(const gnb_sat_position_update_t *sat_position);
#endif /*__LAYER2_NR_MAC_CONFIG_H__*/
+1
View File
@@ -88,6 +88,7 @@
/* MAC */
#include "LAYER2/NR_MAC_COMMON/nr_mac_common.h"
#include "LAYER2/NR_MAC_gNB/mac_config.h"
#include "NR_TAG.h"
/* Defs */