Commit 7506d634 authored by francescomani's avatar francescomani

Merge remote-tracking branch 'origin/f1-handover-minor-fixes' into integration_2025_w10

parents 46031d5f 501ac2c7
...@@ -45,6 +45,10 @@ ...@@ -45,6 +45,10 @@
040023 040023
020022 020022
040024 040024
000024
040025
000031
030021
100021 100021
222222 222222
</TestCaseRequestedList> </TestCaseRequestedList>
...@@ -73,9 +77,9 @@ ...@@ -73,9 +77,9 @@
<testCase id="000022"> <testCase id="000022">
<class>Deploy_Object</class> <class>Deploy_Object</class>
<desc>Deploy OAI 5G CU+DU+UE RF sim SA</desc> <desc>Deploy OAI 5G CU + DU-PCI0 + UE RF sim SA</desc>
<yaml_path>ci-scripts/yaml_files/5g_f1_rfsimulator</yaml_path> <yaml_path>ci-scripts/yaml_files/5g_f1_rfsimulator</yaml_path>
<services>oai-cu oai-du oai-nr-ue</services> <services>oai-cu oai-du-pci0 oai-nr-ue</services>
<eNB_instance>0</eNB_instance> <eNB_instance>0</eNB_instance>
<eNB_serverId>0</eNB_serverId> <eNB_serverId>0</eNB_serverId>
</testCase> </testCase>
...@@ -86,6 +90,12 @@ ...@@ -86,6 +90,12 @@
<idle_sleep_time_in_sec>5</idle_sleep_time_in_sec> <idle_sleep_time_in_sec>5</idle_sleep_time_in_sec>
</testCase> </testCase>
<testCase id="000031">
<class>IdleSleep</class>
<desc>Sleep</desc>
<idle_sleep_time_in_sec>2</idle_sleep_time_in_sec>
</testCase>
<testCase id="000023"> <testCase id="000023">
<class>Attach_UE</class> <class>Attach_UE</class>
<desc>Attach OAI UE (Wait for IP)</desc> <desc>Attach OAI UE (Wait for IP)</desc>
...@@ -93,6 +103,15 @@ ...@@ -93,6 +103,15 @@
<nodes>cacofonix</nodes> <nodes>cacofonix</nodes>
</testCase> </testCase>
<testCase id="000024">
<class>Deploy_Object</class>
<desc>Deploy OAI 5G (target) DU-PCI1 RF sim SA</desc>
<yaml_path>ci-scripts/yaml_files/5g_f1_rfsimulator</yaml_path>
<services>oai-du-pci1</services>
<eNB_instance>0</eNB_instance>
<eNB_serverId>0</eNB_serverId>
</testCase>
<testCase id="020021"> <testCase id="020021">
<class>Ping</class> <class>Ping</class>
<desc>Ping ext-dn from all NR-UEs</desc> <desc>Ping ext-dn from all NR-UEs</desc>
...@@ -151,6 +170,15 @@ ...@@ -151,6 +170,15 @@
<ping_packetloss_threshold>80</ping_packetloss_threshold> <ping_packetloss_threshold>80</ping_packetloss_threshold>
</testCase> </testCase>
<testCase id="020023">
<class>Ping</class>
<desc>Ping ext-dn from all NR-UEs</desc>
<id>rfsim5g_ue</id>
<nodes>cacofonix</nodes>
<ping_args> -c 5 192.168.72.135 -i0.5 -w25</ping_args>
<ping_packetloss_threshold>80</ping_packetloss_threshold>
</testCase>
<testCase id="040002"> <testCase id="040002">
<class>Custom_Command</class> <class>Custom_Command</class>
<desc>Verify Reestablishment</desc> <desc>Verify Reestablishment</desc>
...@@ -191,6 +219,14 @@ ...@@ -191,6 +219,14 @@
<command_fail>yes</command_fail> <command_fail>yes</command_fail>
</testCase> </testCase>
<testCase id="040025">
<class>Custom_Command</class>
<desc>Trigger Handover</desc>
<node>cacofonix</node>
<command>echo ci trigger_f1_ho | nc 192.168.71.150 9090</command>
<command_fail>yes</command_fail>
</testCase>
<testCase id="100021"> <testCase id="100021">
<class>Undeploy_Object</class> <class>Undeploy_Object</class>
<always_exec>true</always_exec> <always_exec>true</always_exec>
......
...@@ -90,6 +90,7 @@ services: ...@@ -90,6 +90,7 @@ services:
environment: environment:
USE_ADDITIONAL_OPTIONS: --log_config.global_log_options level,nocolor,time USE_ADDITIONAL_OPTIONS: --log_config.global_log_options level,nocolor,time
--rfsimulator.options chanmod --rfsimulator.options chanmod
--gNBs.[0].remote_s_address 0.0.0.0
--telnetsrv --telnetsrv.listenaddr 192.168.71.150 --telnetsrv --telnetsrv.listenaddr 192.168.71.150
--telnetsrv.shrmod ci --telnetsrv.shrmod ci
ASAN_OPTIONS: detect_leaks=0:detect_odr_violation=0 ASAN_OPTIONS: detect_leaks=0:detect_odr_violation=0
...@@ -106,9 +107,9 @@ services: ...@@ -106,9 +107,9 @@ services:
timeout: 5s timeout: 5s
retries: 5 retries: 5
oai-du: oai-du-pci0:
image: ${REGISTRY:-oaisoftwarealliance}/${GNB_IMG:-oai-gnb}:${TAG:-develop} image: ${REGISTRY:-oaisoftwarealliance}/${GNB_IMG:-oai-gnb}:${TAG:-develop}
container_name: rfsim5g-oai-du container_name: rfsim5g-oai-du-pci0
cap_drop: cap_drop:
- ALL - ALL
environment: environment:
...@@ -117,9 +118,11 @@ services: ...@@ -117,9 +118,11 @@ services:
--rfsimulator.options chanmod --rfsimulator.options chanmod
--telnetsrv --telnetsrv.listenaddr 192.168.71.171 --telnetsrv --telnetsrv.listenaddr 192.168.71.171
--telnetsrv.shrmod ci --telnetsrv.shrmod ci
--rfsimulator.serveraddr 192.168.71.181
ASAN_OPTIONS: detect_leaks=0:detect_odr_violation=0 ASAN_OPTIONS: detect_leaks=0:detect_odr_violation=0
depends_on: depends_on:
- oai-cu - oai-cu
- oai-nr-ue
networks: networks:
public_net: public_net:
ipv4_address: 192.168.71.171 ipv4_address: 192.168.71.171
...@@ -131,6 +134,37 @@ services: ...@@ -131,6 +134,37 @@ services:
timeout: 5s timeout: 5s
retries: 5 retries: 5
oai-du-pci1:
image: ${REGISTRY:-oaisoftwarealliance}/${GNB_IMG:-oai-gnb}:${TAG:-develop}
container_name: rfsim5g-oai-du-pci1
cap_drop:
- ALL
environment:
USE_ADDITIONAL_OPTIONS: --rfsim
--log_config.global_log_options level,nocolor,time
--gNBs.[0].gNB_DU_ID 3585
--gNBs.[0].nr_cellid 11111111
--gNBs.[0].servingCellConfigCommon.[0].physCellId 1
--gNBs.[0].servingCellConfigCommon.[0].absoluteFrequencySSB 643296
--gNBs.[0].servingCellConfigCommon.[0].dl_absoluteFrequencyPointA 642024
--gNBs.[0].servingCellConfigCommon.[0].ssb_PositionsInBurst_Bitmap 3
--MACRLCs.[0].local_n_address 192.168.71.172
--rfsimulator.serveraddr 192.168.71.181
ASAN_OPTIONS: detect_leaks=0:detect_odr_violation=0
depends_on:
- oai-cu
- oai-nr-ue
networks:
public_net:
ipv4_address: 192.168.71.172
volumes:
- ../../conf_files/gnb-du.sa.band78.106prb.rfsim.conf:/opt/oai-gnb/etc/gnb.conf
healthcheck:
test: /bin/bash -c "pgrep nr-softmodem"
interval: 10s
timeout: 5s
retries: 5
oai-nr-ue: oai-nr-ue:
image: ${REGISTRY:-oaisoftwarealliance}/${NRUE_IMG:-oai-nr-ue}:${TAG:-develop} image: ${REGISTRY:-oaisoftwarealliance}/${NRUE_IMG:-oai-nr-ue}:${TAG:-develop}
container_name: rfsim5g-oai-nr-ue container_name: rfsim5g-oai-nr-ue
...@@ -143,12 +177,12 @@ services: ...@@ -143,12 +177,12 @@ services:
USE_ADDITIONAL_OPTIONS: --rfsim --log_config.global_log_options level,nocolor,time USE_ADDITIONAL_OPTIONS: --rfsim --log_config.global_log_options level,nocolor,time
-r 106 --numerology 1 -C 3619200000 -r 106 --numerology 1 -C 3619200000
--uicc0.imsi 208990100001100 --uicc0.imsi 208990100001100
--rfsimulator.serveraddr 192.168.71.171
--rfsimulator.options chanmod --rfsimulator.options chanmod
--rfsimulator.serveraddr server
--telnetsrv --telnetsrv.shrmod ciUE --telnetsrv.listenaddr 192.168.71.181 --telnetsrv.listenport 8091 --telnetsrv --telnetsrv.shrmod ciUE --telnetsrv.listenaddr 192.168.71.181 --telnetsrv.listenport 8091
--channelmod.modellist_rfsimu_1.[0].model_name rfsimu_channel_ue0
--channelmod.modellist_rfsimu_1.[1].model_name rfsimu_channel_ue1
ASAN_OPTIONS: detect_odr_violation=0 ASAN_OPTIONS: detect_odr_violation=0
depends_on:
- oai-du
networks: networks:
public_net: public_net:
ipv4_address: 192.168.71.181 ipv4_address: 192.168.71.181
......
...@@ -1415,15 +1415,12 @@ int do_NR_Paging(uint8_t Mod_id, uint8_t *buffer, uint32_t tmsi) ...@@ -1415,15 +1415,12 @@ int do_NR_Paging(uint8_t Mod_id, uint8_t *buffer, uint32_t tmsi)
* in encoded form which we decode + add to the handoverPreparationInformation */ * in encoded form which we decode + add to the handoverPreparationInformation */
int do_NR_HandoverPreparationInformation(const uint8_t *uecap_buf, int uecap_buf_size, uint8_t *buf, int buf_size) int do_NR_HandoverPreparationInformation(const uint8_t *uecap_buf, int uecap_buf_size, uint8_t *buf, int buf_size)
{ {
NR_HandoverPreparationInformation_t *hpi = calloc(1, sizeof(*hpi)); NR_HandoverPreparationInformation_t *hpi = calloc_or_fail(1, sizeof(*hpi));
AssertFatal(hpi != NULL, "out of memory\n");
hpi->criticalExtensions.present = NR_HandoverPreparationInformation__criticalExtensions_PR_c1; hpi->criticalExtensions.present = NR_HandoverPreparationInformation__criticalExtensions_PR_c1;
hpi->criticalExtensions.choice.c1 = calloc(1, sizeof(*hpi->criticalExtensions.choice.c1)); hpi->criticalExtensions.choice.c1 = calloc_or_fail(1, sizeof(*hpi->criticalExtensions.choice.c1));
AssertFatal(hpi->criticalExtensions.choice.c1 != NULL, "out of memory\n");
hpi->criticalExtensions.choice.c1->present = hpi->criticalExtensions.choice.c1->present =
NR_HandoverPreparationInformation__criticalExtensions__c1_PR_handoverPreparationInformation; NR_HandoverPreparationInformation__criticalExtensions__c1_PR_handoverPreparationInformation;
NR_HandoverPreparationInformation_IEs_t *hpi_ie = calloc(1, sizeof(*hpi_ie)); NR_HandoverPreparationInformation_IEs_t *hpi_ie = calloc_or_fail(1, sizeof(*hpi_ie));
AssertFatal(hpi_ie != NULL, "out of memory\n");
hpi->criticalExtensions.choice.c1->choice.handoverPreparationInformation = hpi_ie; hpi->criticalExtensions.choice.c1->choice.handoverPreparationInformation = hpi_ie;
NR_UE_CapabilityRAT_ContainerList_t *list = NULL; NR_UE_CapabilityRAT_ContainerList_t *list = NULL;
......
...@@ -1276,7 +1276,11 @@ static void process_Event_Based_Measurement_Report(gNB_RRC_UE_t *ue, NR_ReportCo ...@@ -1276,7 +1276,11 @@ static void process_Event_Based_Measurement_Report(gNB_RRC_UE_t *ue, NR_ReportCo
break; break;
case NR_EventTriggerConfig__eventId_PR_eventA3: { case NR_EventTriggerConfig__eventId_PR_eventA3: {
LOG_W(NR_RRC, "HO LOG: Event A3 Report - Neighbour Becomes Better than Serving!\n"); LOG_W(NR_RRC, "HO LOG: Event A3 Report for UE %d - Neighbour Becomes Better than Serving!\n", ue->rrc_ue_id);
if (!measurementReport->criticalExtensions.choice.measurementReport) {
LOG_E(NR_RRC, "HO LOG: Event A3 Report: measurementReport is null\n");
break;
}
const NR_MeasResults_t *measResults = &measurementReport->criticalExtensions.choice.measurementReport->measResults; const NR_MeasResults_t *measResults = &measurementReport->criticalExtensions.choice.measurementReport->measResults;
for (int serving_cell_idx = 0; serving_cell_idx < measResults->measResultServingMOList.list.count; serving_cell_idx++) { for (int serving_cell_idx = 0; serving_cell_idx < measResults->measResultServingMOList.list.count; serving_cell_idx++) {
...@@ -1290,11 +1294,11 @@ static void process_Event_Based_Measurement_Report(gNB_RRC_UE_t *ue, NR_ReportCo ...@@ -1290,11 +1294,11 @@ static void process_Event_Based_Measurement_Report(gNB_RRC_UE_t *ue, NR_ReportCo
LOG_D(NR_RRC, "Serving Cell RSRP: %d\n", servingCellRSRP); LOG_D(NR_RRC, "Serving Cell RSRP: %d\n", servingCellRSRP);
} }
if (measResults->measResultNeighCells == NULL) if (measResults->measResultNeighCells == NULL ||
break; measResults->measResultNeighCells->present != NR_MeasResults__measResultNeighCells_PR_measResultListNR) {
LOG_D(NR_RRC, "HO LOG: No neighbor cell measurements available\n");
if (measResults->measResultNeighCells->present != NR_MeasResults__measResultNeighCells_PR_measResultListNR)
break; break;
}
const NR_MeasResultListNR_t *measResultListNR = measResults->measResultNeighCells->choice.measResultListNR; const NR_MeasResultListNR_t *measResultListNR = measResults->measResultNeighCells->choice.measResultListNR;
for (int neigh_meas_idx = 0; neigh_meas_idx < measResultListNR->list.count; neigh_meas_idx++) { for (int neigh_meas_idx = 0; neigh_meas_idx < measResultListNR->list.count; neigh_meas_idx++) {
...@@ -1392,7 +1396,7 @@ static void rrc_gNB_process_MeasurementReport(gNB_RRC_UE_t *UE, NR_MeasurementRe ...@@ -1392,7 +1396,7 @@ static void rrc_gNB_process_MeasurementReport(gNB_RRC_UE_t *UE, NR_MeasurementRe
} }
} }
if (report_config == NULL) { if (report_config == NULL || report_config->choice.reportConfigNR == NULL) {
LOG_E(NR_RRC, "There is no related report configuration for this measId!\n"); LOG_E(NR_RRC, "There is no related report configuration for this measId!\n");
return; return;
} }
...@@ -1741,7 +1745,11 @@ static int rrc_gNB_decode_dcch(gNB_RRC_INST *rrc, const f1ap_ul_rrc_message_t *m ...@@ -1741,7 +1745,11 @@ static int rrc_gNB_decode_dcch(gNB_RRC_INST *rrc, const f1ap_ul_rrc_message_t *m
break; break;
case NR_UL_DCCH_MessageType__c1_PR_measurementReport: case NR_UL_DCCH_MessageType__c1_PR_measurementReport:
if (ul_dcch_msg->message.choice.c1->choice.measurementReport != NULL) {
rrc_gNB_process_MeasurementReport(UE, ul_dcch_msg->message.choice.c1->choice.measurementReport); rrc_gNB_process_MeasurementReport(UE, ul_dcch_msg->message.choice.c1->choice.measurementReport);
} else {
LOG_E(NR_RRC, "UE %d: No measurementReport CHOICE is given\n", ue_context_p->ue_context.rrc_ue_id);
}
break; break;
case NR_UL_DCCH_MessageType__c1_PR_ulInformationTransfer: case NR_UL_DCCH_MessageType__c1_PR_ulInformationTransfer:
......
...@@ -39,15 +39,12 @@ ...@@ -39,15 +39,12 @@
typedef enum { HO_CTX_BOTH, HO_CTX_SOURCE, HO_CTX_TARGET } ho_ctx_type_t; typedef enum { HO_CTX_BOTH, HO_CTX_SOURCE, HO_CTX_TARGET } ho_ctx_type_t;
static nr_handover_context_t *alloc_ho_ctx(ho_ctx_type_t type) static nr_handover_context_t *alloc_ho_ctx(ho_ctx_type_t type)
{ {
nr_handover_context_t *ho_ctx = calloc(1, sizeof(*ho_ctx)); nr_handover_context_t *ho_ctx = calloc_or_fail(1, sizeof(*ho_ctx));
AssertFatal(ho_ctx != NULL, "out of memory\n");
if (type == HO_CTX_SOURCE || type == HO_CTX_BOTH) { if (type == HO_CTX_SOURCE || type == HO_CTX_BOTH) {
ho_ctx->source = calloc(1, sizeof(*ho_ctx->source)); ho_ctx->source = calloc_or_fail(1, sizeof(*ho_ctx->source));
AssertFatal(ho_ctx->source != NULL, "out of memory\n");
} }
if (type == HO_CTX_TARGET || type == HO_CTX_BOTH) { if (type == HO_CTX_TARGET || type == HO_CTX_BOTH) {
ho_ctx->target = calloc(1, sizeof(*ho_ctx->target)); ho_ctx->target = calloc_or_fail(1, sizeof(*ho_ctx->target));
AssertFatal(ho_ctx->target != NULL, "out of memory\n");
} }
return ho_ctx; return ho_ctx;
} }
...@@ -132,9 +129,9 @@ static void nr_initiate_handover(const gNB_RRC_INST *rrc, ...@@ -132,9 +129,9 @@ static void nr_initiate_handover(const gNB_RRC_INST *rrc,
.handoverPreparationInfo_length = ho_prep_len, .handoverPreparationInfo_length = ho_prep_len,
}; };
f1ap_drb_to_be_setup_t drbs[32] = {0}; // maximum DRB can be 32 f1ap_drb_to_be_setup_t drbs[MAX_DRBS_PER_UE] = {0};
int nb_drb = 0; int nb_drb = 0;
for (int i = 0; i < 32; ++i) { /* for each DRB */ for (int i = 0; i < sizeofArray(drbs); ++i) {
drb_t *rrc_drb = &ue->established_drbs[i]; drb_t *rrc_drb = &ue->established_drbs[i];
if (rrc_drb->status == DRB_INACTIVE) if (rrc_drb->status == DRB_INACTIVE)
continue; continue;
...@@ -157,8 +154,7 @@ static void nr_initiate_handover(const gNB_RRC_INST *rrc, ...@@ -157,8 +154,7 @@ static void nr_initiate_handover(const gNB_RRC_INST *rrc,
// this changes // this changes
AssertFatal(pdu->param.nb_qos == 1, "only 1 Qos flow supported\n"); AssertFatal(pdu->param.nb_qos == 1, "only 1 Qos flow supported\n");
drb->drb_info.flows_to_be_setup_length = 1; drb->drb_info.flows_to_be_setup_length = 1;
drb->drb_info.flows_mapped_to_drb = calloc(1, sizeof(f1ap_flows_mapped_to_drb_t)); drb->drb_info.flows_mapped_to_drb = calloc_or_fail(1, sizeof(f1ap_flows_mapped_to_drb_t));
AssertFatal(drb->drb_info.flows_mapped_to_drb, "could not allocate memory\n");
int qfi = rrc_drb->cnAssociation.sdap_config.mappedQoS_FlowsToAdd[0]; int qfi = rrc_drb->cnAssociation.sdap_config.mappedQoS_FlowsToAdd[0];
DevAssert(qfi > 0); DevAssert(qfi > 0);
drb->drb_info.flows_mapped_to_drb[0].qfi = qfi; drb->drb_info.flows_mapped_to_drb[0].qfi = qfi;
...@@ -283,7 +279,7 @@ static void nr_rrc_f1_ho_complete(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE) ...@@ -283,7 +279,7 @@ static void nr_rrc_f1_ho_complete(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE)
f1ap_ue_context_release_cmd_t cmd = { f1ap_ue_context_release_cmd_t cmd = {
.gNB_CU_ue_id = UE->rrc_ue_id, .gNB_CU_ue_id = UE->rrc_ue_id,
.gNB_DU_ue_id = source_ctx->du_ue_id, .gNB_DU_ue_id = source_ctx->du_ue_id,
.cause = F1AP_CAUSE_RADIO_NETWORK, // better .cause = F1AP_CAUSE_RADIO_NETWORK,
.cause_value = 5, // 5 = F1AP_CauseRadioNetwork_interaction_with_other_procedure .cause_value = 5, // 5 = F1AP_CauseRadioNetwork_interaction_with_other_procedure
.srb_id = DL_SCH_LCID_DCCH, .srb_id = DL_SCH_LCID_DCCH,
}; };
......
Active_gNBs = ( "cu-rfsim"); Active_gNBs = ( "cu-rfsim");
# Asn1_verbosity, choice in: none, info, annoying # Asn1_verbosity, choice in: none, info, annoying
Asn1_verbosity = "none"; Asn1_verbosity = "none";
Num_Threads_PUSCH = 8;
gNBs = gNBs =
( (
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment