NR SA HO(Handover)
This tutorial shows how to test NR SA to NR SA Handover in Inter Frequency. This tutorial also shows how to configure Measurement Report and how to trigger measurement report. Handover is a procedure of cell change during the connected mode and usually occurs as described below.
Step 1 : Network (gNB) configures measurement request to direct UE to perform the measurement of current cell and neighbouring cells
Step 2 : UE perform the measurement and send the report to the network if the measurement result matches the condition set by the measurement request configuration specified at step 1
Step 3 : Network sends RRC message to force UE to change cell (Handover) to the target cell. In this RRC message, network sends all the necessary low layer information about the target cell (e.g, cell frequency, rach info and other channel information)
In terms of frequencies of current cell and target/destination cell, the handover can be categorized into two types as below
- Intra Frequency Handover : Current Cell and Target Cell frequency is same
- Inter Frequency Handover : Current Cell and Target Cell frequency is different
Table of Contents
- NR SA HO(Handover)
- Introduction
- Summary of the Tutorial
- Test Setup
- Key Configuration Parameters
- Test 1 : SA Inter Frequency Handover - with Cell Power Change
- Test 2 : SA Inter Frequency Handover - PingPong Handover with UE Movement
- Test 3 : SA Inter Frequency Handover - Blind Handover
- Test 4 : SA Inter Frequency Handover - Blind Handover with Contention-Free RACH
- RRC / NAS Signaling
Introduction
5G New Radio Standalone (NR SA) technology represents a significant evolution in mobile communications, enabling ultra-fast data rates, low latency, and massive connectivity without relying on legacy LTE infrastructure. One of the critical aspects of NR SA networks is the ability to seamlessly maintain service continuity and quality during mobility events through handover procedures, particularly in scenarios involving Inter Frequency Handover (IFHO), where the user equipment (UE) transitions between cells operating on different carrier frequencies. In NR SA, handover is managed by the gNB (next-generation NodeB), which orchestrates the measurement, reporting, and execution phases to ensure reliable connectivity as UEs move between coverage areas. The measurement configuration and reporting mechanisms play a pivotal role, as they enable the network to make informed decisions based on real-time radio conditions observed by the UE. This process can be driven by network-initiated measurement requests, where the UE periodically evaluates both serving and neighboring cells, or through direct handover commands (blind handover) when a rapid cell transition is desired. Understanding and validating these procedures in a controlled laboratory environment is essential for optimizing network performance, troubleshooting mobility issues, and supporting advanced use cases such as ultra-reliable low-latency communication (URLLC) and enhanced mobile broadband (eMBB). Tools like the Amarisoft callbox facilitate comprehensive testing of both measurement-based and blind handovers, allowing engineers to simulate real-world mobility scenarios and fine-tune handover parameters for optimal network behavior. Mastery of NR SA handover concepts—especially inter frequency transitions—equips professionals with the expertise needed to design, test, and deploy robust 5G networks that deliver seamless user experiences across diverse deployment scenarios.
-
Context of NR SA Handover and Measurement Procedures
- 5G NR Standalone networks operate independently of legacy LTE systems, utilizing the gNB for all radio resource management and mobility events.
- Handover ensures uninterrupted connectivity as user equipment moves between cells, with special complexity when transitioning across different frequencies (inter frequency handover).
- Measurement configuration and reporting mechanisms are essential for the network to assess the radio environment and trigger timely handovers, maintaining optimal service quality.
-
Relevance and Importance of This Tutorial
- This tutorial addresses the practical aspects of testing NR SA inter frequency handover, a fundamental mobility procedure in 5G networks.
- It covers both measurement-based and blind handover scenarios, aligning with real-world deployment and troubleshooting requirements.
- Understanding these procedures enables engineers to ensure service reliability and optimize user experience in advanced 5G deployments.
-
Learning Outcomes
- Comprehend the architectural flow of NR SA handover, including measurement configuration, reporting, and execution phases.
- Gain hands-on expertise in configuring measurement reports and triggering handover events in a controlled lab environment using the Amarisoft callbox.
- Distinguish between intra frequency and inter frequency handover processes, with emphasis on the specific challenges and procedures for IFHO.
- Develop the capability to test and validate 5G NR SA mobility scenarios effectively, contributing to robust network performance.
-
Prerequisite Knowledge and Skills
- Familiarity with 5G NR architecture, terminology, and key network elements (e.g., gNB, UE, core network).
- Basic understanding of radio resource management concepts and mobility management in cellular networks.
- Experience with lab testing tools, such as the Amarisoft callbox, and the ability to interpret protocol flows at a high level.
- Comfort with interpreting technical specifications and following stepwise testing procedures.
Summary of the Tutorial
This tutorial covers several test cases for SA (Standalone) Inter Frequency Handover scenarios using Amarisoft gNB and UEsim or commercial UE. The procedures are organized into four main tests, each detailing configuration steps, execution methodology, and analysis approaches. All content structure, indentation, and formatting are faithfully preserved from the source material.
- Test Setup:
- SIM Card usage and setup options are outlined. The default SIM card is used unless changes are needed, in which case the Configuration Guide is referenced.
- Two hardware setups (Setup A and Setup B) are introduced, with diagrams provided for both callbox with UE and UEsim configurations.
- Key Configuration Parameters:
- Parameters such as ncell_list and meas_config_desc are highlighted, including important sub-parameters like rat, cell_id, a1_report_type, a1_rsrp, a2_report_type, etc.
- Test 1 : SA Inter Frequency Handover - with Cell Power Change
- Objective: Demonstrate handover between two NR SA cells triggered by direct cell power change and corresponding UE measurement report.
- Configuration:
- Multiple configuration files are copied and modified for the test scenario (e.g., gnb-sa-ho.cfg, ue-nr-sa-ho.cfg).
- Neighbour cell lists are added to both cells, using different frequencies (dl_earfcn) to set up inter-frequency handover scenarios.
- Measurement criteria are set using meas_config_desc to trigger handover events (notably Event A2 and A3).
- If using a commercial UE, it is recommended to extend inactivity_timer to prevent premature RRC release or generate continuous IP traffic.
- All physical layer parameters in UEsim must match the gNB configuration.
- Test Execution:
- Start LTE service and verify all NR cell configurations.
- Adjust cell power using cell_gain command to avoid unexpected UE behavior.
- Observe handover by monitoring the change in cell ID output.
- Log Analysis:
- Check that measurement report configuration lists are set as intended.
- Event A2 triggers measurement report; Event A3 triggers handover.
- gNB enables measurement gap when required and proceeds to handover upon receiving the correct measurement report.
- Test 2 : SA Inter Frequency Handover - PingPong Handover with UE Movement
- Objective: Demonstrate ping-pong handover by moving the UE back and forth between two cells, causing repeated handovers.
- Configuration:
- Derived from gnb-sa-channel-sim-pingpong-ho.cfg and related files.
- Neighbour cell lists and measurement criteria are set similarly to Test 1.
- UEsim configuration includes initial position and channel model (e.g., "EPA").
- Test Execution:
- Start LTE service and ensure NR cell configurations are correct.
- Trigger measurement report and handover by moving the UE using a shell script and remoteAPI commands, alternating direction to create ping-pong effect.
- Observe handover events by monitoring cell ID changes and PHY scheduling in logs and bitrate plots.
- Log Analysis:
- Confirm cell changes in logs and correlate to ping-pong handover events.
- Protocol log analysis similar to Test 1 to confirm handover events at the signaling level.
- Test 3 : SA Inter Frequency Handover - Blind Handover
- SIM Card used in this tutorial is the one delivered with the system as it is.
- If you want to change the configuration, The tutorial Configuration Guide would help
- ncell_list : In this link, you would get the descriptions for all the items listed below
- meas_config_desc : In this link, you would get the descriptions for all the items listed below
- a1_report_type
- a1_rsrp
- a1_hysteresis
- a1_time_to_trigger
- a2_report_type
- a2_hysteresis
- a2_time_to_trigger
- nr_handover
- meas_gap_config
- ho_from_meas
Test Setup
Test setup for this tutorial is as shown below.
< Setup A >

< Setup B >

Key Configuration Parameters
Followings are important configuration parameters for this tutorial. You may click on the items for the descriptions from Amarisoft documents.
Test 1 : SA Inter Frequency Handover - with Cell Power Change
In this test, I will show on a very simple scenario to trigger an handover between two NR SA cells which is triggered by the direct power change of the cell and the corresponding measurement report from UE.
Configuration
I used the gnb-sa-ho.cfg which is copied and modified from gnb-sa.cfg

I also used mme-ims.cfg as it is.

I used the ue-nr-sa-ho.cfg which is copied and modified from ue-nr-sa.cfg

Configure enb-2cell-ho-inter.cfg as below.
You can configure this part in any way you like. In this test, I used TDD (NR_TDD 1), 2x2 MIMO(N_ANTENNA_DL 2) and bandwidth 40 Mhz (NR_BANDWIDTH 40).

Make it sure that you have enough number of sdr cards for this test in rf_driver. In this test, I am using only 2 cell with 2x2 MIMO, so dev0, dev1 would be good enough.

I added neighbour cell list(ncell_list) to the configuration of the first cell and add the second cell(n_id_cell:2) as the neighbour cell. As you see, the camping cell (the first cell in this case) and the target cell(the second cell in this case) has different frequency(different dl_earfcn) because this test is for Inter cell Handover.

I added neighbour cell list(ncell_list) to the configuration of the second cell and add the first cell(n_id_cell:1) as the neighbour cell. As you see, the camping cell (the second cell in this case) and the target cell(the first cell in this case) has different frequency(different dl_earfcn) because this test is for Inter cell Handover.

Then added measurement criterial before triggering Handover via the parameter meas_config_desc. Once this is configured, UE should report appropriate meausrement report for gNB to trigger handover. (
NOTE : If you are using a commercial UE instead of UEsim, I would strongly suggest you to extend inactivity_timer to large value (e.g, 600000 = 10 min) otherwise gNB will release RRC before reaching the point of handover trigger. You can prevent such a early RRC release by generating IP traffic (e.g, continuous ping from callbox to UE or watching a YouTube from UE, but just extending inactivity_timer value would be simpler).
NOTE : Even if various events are explicitely configured in meas_config_desc, whether they are applied to RRC Reconfiguration or not is determined by various factors. Read carefully on the description of meas_config_desc for NR and meas_config_desc for NR in enb document for the details. For ENDC case, the logic would become even more complicated. So it is strongly suggested to read the entire section carefully before you start testing.Now let's look into UEsim(DUT) configuration. (NOTE : If you are using commercial UE instead of UEsim (i.e <Setup A>), you can skip this part.
First, N_CELL is set to 2 because this test require 2 cells and N_ANTENNA_DL is set to 2 for 2x2 MIMO. TDD is set to 1 indicating this is TDD and CELL_BANDWIDTH is set to 40. Basically all of these configuration should match the configuration in gNB(Callbox).
And then the first cell(rf_port 0) is configured to match all the physical layer parameters to the first cell of gNB(Callbox) configuration.

Then the second cell(rf_port 1) is configured to match all the physical layer parameters to the second cell of gNB(Callbox) configuration.

UE configuration is same as default ue-nr-sa. As long as imsi, K matches any nr UE configuration would be OK.

Following is optional which is mainly for automating UEsim operation. What it does is that it automatically power on UE and start IP traffic to prevent early RRC release before Handover is triggered.

Perform the test
Start LTE service and check basic cell configuration. Any cell configuration is OK as long as they are all NR cell. (
NOTE : If you are using UEsim as a DUT instead of mobile phone, make it sure that the cell configuration on UEsim matches the configurations shown here)

Adjust cell power. I used cell_gain command here instead of tx_gain because tx_gain changes broadcasting reference cell power in SIB message and UE may behave unexpectedly due to the SIB changes.

You should see the change of cell ID in 't' output if Handover performs properly.

Log Analysis
Sample Log During the initial attach, Callbox send Measurement Report configuration as below. Check out measObjectToAddModList, reportConfigToAddModList, measIdToAddModList and confirm that all of them are configured as intended.
Confirm ssbFrequency in measObjectNR is configured as you confirmed in 'cell phy' output.

Check out if reportConfigToAddModList items are properly set as you configured in meas_config_desc in the configuration file.

Check out which specific measurement is configured (i.e, ordered to report) in measIdToAddModList. In this specific measurement report configuration, Event A2 for cell 1 is configured and Measurement Gap is not enabled at this point. (
NOTE : gNB will enable Measurement Gap only when the measurement is for inter frequency, inter RAT and Event A2 report is recieved. Check out meas_config_desc for further details).
If you properly adjust the cell power to meet the criteria for Event A2, you will get the measurement report for Event A2.

And then gNB configures Event A3 with Cell 2 in measurement configuration.

If you properly adjust the cell power to meet the criteria for Event A2, you will get the measurement report for Event A2. gNB enables measurement GAP.

If the cell power is properly set to meet the criteria of event A3 report, you should see the report for the event A3 which is criteria for triggering Handover.

Now gNB triggers Handover to physicalCellId(501) which is cell 2.

Test 2 : SA Inter Frequency Handover - PingPong Handover with UE Movement
In this test, I will show on a very simple scenario to trigger an handover between two NR SA cells. In this scenario, UE is first connected to a cell and then moves away from the initial cell and gets closer to other cell which triggers measurement report and lead to handover. Once the UE gets closer to the other cell after the Handover, it changes the direction of the movement 180 degree moving towards the initial cell which lead to another handover. Repetition of this back-and-forth movement between the two cells triggers ping-pong handover.

Configuration
I used the gnb-sa-channel-sim-pingpong-ho.cfg which is copied and modified from gnb-sa.cfg

I also used mme-ims.cfg as it is.

I used the ue-nr-sa-chan-sim-pingpong-ho.cfg which is copied and modified from ue-nr-sa.cfg

Configure gnb-sa-channel-sim-pingpong-ho.cfg as below.
You can configure this part in any way you like. In this test, I used TDD (NR_TDD 1), 2x2 MIMO(N_ANTENNA_DL 2) and bandwidth 40 Mhz (NR_BANDWIDTH 40).

Make it sure that you have enough number of sdr cards for this test in rf_driver. In this test, I am using only 2 cell with 2x2 MIMO, so dev0, dev1 would be good enough.

I added neighbour cell list(ncell_list) to the configuration of the first cell and add the second cell(n_id_cell:2) as the neighbour cell. As you see, the camping cell (the first cell in this case) and the target cell(the second cell in this case) has different frequency(different dl_earfcn) because this test is for Inter cell Handover.

I added neighbour cell list(ncell_list) to the configuration of the second cell and add the first cell(n_id_cell:1) as the neighbour cell. As you see, the camping cell (the second cell in this case) and the target cell(the first cell in this case) has different frequency(different dl_earfcn) because this test is for Inter cell Handover.

Then added measurement criterial before triggering Handover via the parameter meas_config_desc. Once this is configured, UE should report appropriate meausrement report for gNB to trigger handover. (
NOTE : If you are using a commercial UE instead of UEsim, I would strongly suggest you to extend inactivity_timer to large value (e.g, 600000 = 10 min) otherwise gNB will release RRC before reaching the point of handover trigger. You can prevent such a early RRC release by generating IP traffic (e.g, continuous ping from callbox to UE or watching a YouTube from UE, but just extending inactivity_timer value would be simpler).
NOTE : Even if various events are explicitely configured in meas_config_desc, whether they are applied to RRC Reconfiguration or not is determined by various factors. Read carefully on the description of meas_config_desc for NR and meas_config_desc for NR in enb document for the details. For ENDC case, the logic would become even more complicated. So it is strongly suggested to read the entire section carefully before you start testing.Now let's look into UEsim(DUT) configuration. (NOTE : If you are using commercial UE instead of UEsim (i.e <Setup A>), you can skip this part.
First, N_CELL is set to 2 because this test require 2 cells and N_ANTENNA_DL is set to 2 for 2x2 MIMO. TDD is set to 1 indicating this is TDD and CELL_BANDWIDTH is set to 40. Basically all of these configuration should match the configuration in gNB(Callbox).
And then the first cell(rf_port 0) is configured to match all the physical layer parameters to the first cell of gNB(Callbox) configuration.

Then the second cell(rf_port 1) is configured to match all the physical layer parameters to the second cell of gNB(Callbox) configuration.

Then specify UE position (position) and channel model (
NOTE : In this test, "EPA" channel model is used but you can use any other model like "awgn"). The position specified here is the initial position, you can move this position while running with RemoteAPI.
Following is optional which is mainly for automating UEsim operation. What it does is that it automatically power on UE and start IP traffic to prevent early RRC release before Handover is triggered.

Perform the test
Start LTE service and check basic cell configuration. Any cell configuration is OK as long as they are all NR cell. (
NOTE : If you are using UEsim as a DUT instead of mobile phone, make it sure that the cell configuration on UEsim matches the configurations shown here)

Now we will triggering measurement report from UE to let gNB initiate hanover by moving UE. The UE start moving farther away from one cell and getting closer to another cell. The UE movement is performed by a remoteAPI. In this test, UE is moving between one cell and another cell repeatedly. So you may write a simple shell script for this as shown below.
#!/bin/bash
num_iter=2
#set initial position
./ws.js ue '{"message" : "ue_move", "ue_id" : 1, "position" : [10,0], "speed" : 0}'
for ((i=0; i<$num_iter; i++)); do
# move to the right on x axis at a 2 m/s
./ws.js ue '{"message" : "ue_move", "ue_id" : 1, "speed" : 7.2, "direction" : 0}'
sleep 40
# move to the left on x axis at 2 m/s
./ws.js ue '{"message" : "ue_move", "ue_id" : 1, "speed" : 7.2, "direction" : -180}'
sleep 40
done
#stop it somewhere
./ws.js ue '{"message" : "ue_move", "ue_id" : 1, "position" : [10,0], "speed" : 0}'
You should see the change of cell ID in 't' output if Handover performs properly.

Log Analysis
At the highest level, you can check on whether 'Cell' changes back and forth between the two cells (
NOTE : Just changed cell does not guarantee the indication of handover since there can be other reasons for the cell change, but this can be a good first level indicator for the handover)
Then you can check if the PHY schedule changes from one cell to another cell in RB map as another indicator of handover.

Another way to confirm the traffic change between two cells can be shown in Bitrate plot.

NOTE : The most obvious indicator of handover should be confirmed by protocol log. The protocol log analysis for this test is same as in Test 1. Check out the log analysis of Test 1 for the details.Test 3 : SA Inter Frequency Handover - Blind Handover
In this test, I will show on a very simple scenario to trigger an handover between two NR SA cells which is triggered by the direct power change of the cell and the corresponding measurement report from UE.
Configuration
I used the gnb-sa-ho-blind.cfg which is copied and modified from gnb-sa.cfg

I also used mme-ims.cfg as it is.

I used the ue-nr-sa-ho.cfg which is copied and modified from ue-nr-sa.cfg

Configure gnb-sa-ho-blind.cfg as below.
You can configure this part in any way you like. In this test, I used TDD (NR_TDD 1), 2x2 MIMO(N_ANTENNA_DL 2) and bandwidth 40 Mhz (NR_BANDWIDTH 40).

Make it sure that you have enough number of sdr cards for this test in rf_driver. In this test, I am using only 2 cell with 2x2 MIMO, so dev0, dev1 would be good enough.

I added neighbour cell list(ncell_list) to the configuration of the first cell and add the second cell(n_id_cell:2) as the neighbour cell. As you see, the camping cell (the first cell in this case) and the target cell(the second cell in this case) has different frequency(different dl_earfcn) because this test is for Inter cell Handover.

I added neighbour cell list(ncell_list) to the configuration of the second cell and add the first cell(n_id_cell:1) as the neighbour cell. As you see, the camping cell (the second cell in this case) and the target cell(the first cell in this case) has different frequency(different dl_earfcn) because this test is for Inter cell Handover.

Since this test case is for blind handover triggered by gNB without any Measurement Report from UE, I commented out meas_config_desc configuration. (
NOTE : If you are using a commercial UE instead of UEsim, I would strongly suggest you to extend inactivity_timer to large value (e.g, 600000 = 10 min) otherwise gNB will release RRC before reaching the point of handover trigger. You can prevent such a early RRC release by generating IP traffic (e.g, continuous ping from callbox to UE or watching a YouTube from UE, but just extending inactivity_timer value would be simpler).
Now let's look into UEsim(DUT) configuration. (
NOTE : If you are using commercial UE instead of UEsim (i.e <Setup A>), you can skip this part.First, N_CELL is set to 2 because this test require 2 cells and N_ANTENNA_DL is set to 2 for 2x2 MIMO. TDD is set to 1 indicating this is TDD and CELL_BANDWIDTH is set to 40. Basically all of these configuration should match the configuration in gNB(Callbox).
And then the first cell(rf_port 0) is configured to match all the physical layer parameters to the first cell of gNB(Callbox) configuration.

Then the second cell(rf_port 1) is configured to match all the physical layer parameters to the second cell of gNB(Callbox) configuration.

UE configuration is same as default ue-nr-sa. As long as imsi, K matches any nr UE configuration would be OK.

Perform the test
Start LTE service and check basic cell configuration. Any cell configuration is OK as long as they are all NR cell. (
NOTE : If you are using UEsim as a DUT instead of mobile phone, make it sure that the cell configuration on UEsim matches the configurations shown here)

The power on UE and wait until the initial attach is complete and the call is in connected status.
Then go to /root/end directory and send remote API command : ./ws.js enb '{"message":"handover","ran_ue_id":1,"pci":501,"ssb_nr_arfcn":712608 }' (
NOTE : In case of intra cell Handover, ./ws.js enb '{"message":"handover","ran_ue_id":1,"pci":501 }'would be enough, but in case of inter cell Handover as in this test case, you need to specify the target cell ssb_nr_arfcn)[root@CBU-SOPHIA-TEST enb]# ./ws.js enb '{"message":"handover","ran_ue_id":1,"pci":501,"ssb_nr_arfcn":712608 }'
WebSocket remote API tool version 2024-06-06, Copyright (C) 2012-2024 Amarisoft
[0.003] ### Connected to 127.0.0.1:9001
[0.004] ### Ready: name=ENB, type=ENB, version=2024-03-15
[0.031] <== Send message handover id#1
[0.042] ==> Message received
{
"message": "handover",
"message_id": "id#1",
"time": 144.224,
"utc": 1718117032.955
}
You should see the change of cell ID in 't' output if Handover performs properly.

Log Analysis
First it would be good idea to check if UE capability first.
In this test case, gNB send UE capability inquiry for bandNR 78 and 79 as set in the configuration file.

An important thing you may need to check from UE capability Information is to confirm whether the UE support Inter Frequency Handover. You can check this out via handoverIterF of measAndMobParameters->measAndMobParametersFRX-Diff IE.

Since I commented out meas_config_desc in the configuration file, you would notice that none of the measurement related configuration is set in RRCReconfiguration messages.

Once the remote API command ./ws.js enb '{"message":"handover","ran_ue_id":1,"pci":501,"ssb_nr_arfcn":712608 }' is set and properly accepted, gNB send Handover command in RRCReconfiguration.

If the RRCReconfiguration with Handover command is received by UE and properly processed, UE performs RACH process with the target cell.

Test 4 : SA Inter Frequency Handover - Blind Handover with Contention-Free RACH
The purpose of this tutorial is to show how to configure and test contention free rach procedure in a simplest manner. In Amarisoft gNB, contention-free rach can be triggered mainly in two scenario. The first scenario is with NSA setup (i.e, RACH to add NR addition) and NR-to-NR handover (i.e, RACH to handover to the destination cell). In this tutorial, contention-free rach procedure in NR-to-NR handover scenario will be demonstrated.
Configuration
NOTE : For this test, there is only very minor modification from the configuration of the previous test. I would just shows only the configuration that differs from the previous test configuration here. For the detailed description of the configuration, refer to the configuration of previous test.I used the gnb-sa-ho-blind-cfra.cfg which is copied and modified from gnb-sa-ho-blind.cfg . Ony this enb configuration file has been modified from previous test. mme, ims and uesim configuration remain unchanged.

Configure gnb-sa-ho-blind-cfra.cfg as below.
The only one configuration is added in this test comparing to the previous test. I just added reconfig_sync_cfra : true. I put this nr_cell_default in order to apply this configuration to all the cells.

Perform the test
Start LTE service and check basic cell configuration. Any cell configuration is OK as long as they are all NR cell. (
NOTE : If you are using UEsim as a DUT instead of mobile phone, make it sure that the cell configuration on UEsim matches the configurations shown here)

The power on UE and wait until the initial attach is complete and the call is in connected status.
Then go to /root/end directory and send remote API command : ./ws.js enb '{"message":"handover","ran_ue_id":1,"pci":501,"ssb_nr_arfcn":712608 }' (
NOTE : In case of intra cell Handover, ./ws.js enb '{"message":"handover","ran_ue_id":1,"pci":501 }'would be enough, but in case of inter cell Handover as in this test case, you need to specify the target cell ssb_nr_arfcn)[root@CBU-SOPHIA-TEST enb]# ./ws.js enb '{"message":"handover","ran_ue_id":1,"pci":501,"ssb_nr_arfcn":712608 }'
WebSocket remote API tool version 2024-06-06, Copyright (C) 2012-2024 Amarisoft
[0.003] ### Connected to 127.0.0.1:9001
[0.004] ### Ready: name=ENB, type=ENB, version=2024-03-15
[0.031] <== Send message handover id#1
[0.042] ==> Message received
{
"message": "handover",
"message_id": "id#1",
"time": 144.224,
"utc": 1718117032.955
}
You should see the change of cell ID in 't' output if Handover performs properly.

Log Analysis
NOTE : Since this test is derived from previous test with very minor modification, most part of the log is same as the log of previous test. So I would point out only the part that is important for this specific test. You may refer to the log of previous test for the part that is not explained here.gNB send RRC reconfiguration that triggers Handover to a destination cell (PCI 501 in this case)

In this RRC reconfig message, you see cfra configuration in rach-ConfigDedicated uplink IE(information element) which indicates a specific ra-PreambleIndex that UE is supposed to use.

Then you can confirm that UE send PRACH with preamble index that is configured by cfra specified by gNB (preamble 8 in this specific test)

RRC / NAS Signaling
RrcReconfiguration
: This is the RrcReconfiguration message sent by eNB to configure Handover (
NOTE : You would see some IEs that has a specific assigned vale here, but consider it as just an example value. Those values should vary depending on test requirement){
message c1: rrcReconfiguration: {
rrc-TransactionIdentifier 0,
criticalExtensions rrcReconfiguration: {
radioBearerConfig {
srb-ToAddModList {
{
srb-Identity 1,
reestablishPDCP true
},
{
srb-Identity 2,
reestablishPDCP true
}
},
drb-ToAddModList {
{
drb-Identity 1,
reestablishPDCP true
}
}
},
nonCriticalExtension {
masterCellGroup {
cellGroupId 0,
rlc-BearerToAddModList {
{
logicalChannelIdentity 4,
reestablishRLC true
},
{
logicalChannelIdentity 1,
reestablishRLC true
},
{
logicalChannelIdentity 2,
reestablishRLC true
}
},
mac-CellGroupConfig {
schedulingRequestConfig {
schedulingRequestToAddModList {
{
schedulingRequestId 0,
sr-TransMax n64
}
}
},
bsr-Config {
periodicBSR-Timer sf20,
retxBSR-Timer sf320
},
tag-Config {
tag-ToAddModList {
{
tag-Id 0,
timeAlignmentTimer infinity
}
}
},
phr-Config setup: {
phr-PeriodicTimer sf500,
phr-ProhibitTimer sf200,
phr-Tx-PowerFactorChange dB3,
multiplePHR FALSE,
dummy FALSE,
phr-Type2OtherCell FALSE,
phr-ModeOtherCG real
},
skipUplinkTxDynamic FALSE,
dataInactivityTimer release: NULL
},
physicalCellGroupConfig {
pdsch-HARQ-ACK-Codebook dynamic
},
spCellConfig {
reconfigurationWithSync {
spCellConfigCommon {
physCellId 501,
downlinkConfigCommon {
frequencyInfoDL {
absoluteFrequencySSB 712608,
frequencyBandList {
79
},
absoluteFrequencyPointA 712062,
scs-SpecificCarrierList {
{
offsetToCarrier 0,
subcarrierSpacing kHz30,
carrierBandwidth 106
}
}
},
initialDownlinkBWP {
genericParameters {
locationAndBandwidth 28875,
subcarrierSpacing kHz30
},
pdcch-ConfigCommon setup: {
controlResourceSetZero 4,
searchSpaceZero 0,
commonSearchSpaceList {
{
searchSpaceId 1,
controlResourceSetId 0,
monitoringSlotPeriodicityAndOffset sl1: NULL,
monitoringSymbolsWithinSlot '10000000000000'B,
nrofCandidates {
aggregationLevel1 n0,
aggregationLevel2 n0,
aggregationLevel4 n4,
aggregationLevel8 n0,
aggregationLevel16 n0
},
searchSpaceType common: {
dci-Format0-0-AndFormat1-0 {
}
}
}
},
searchSpaceSIB1 0,
searchSpaceOtherSystemInformation 1,
pagingSearchSpace 1,
ra-SearchSpace 1
},
pdsch-ConfigCommon setup: {
pdsch-TimeDomainAllocationList {
{
mappingType typeA,
startSymbolAndLength 40
},
{
mappingType typeA,
startSymbolAndLength 57
}
}
}
}
},
uplinkConfigCommon {
frequencyInfoUL {
scs-SpecificCarrierList {
{
offsetToCarrier 0,
subcarrierSpacing kHz30,
carrierBandwidth 106
}
}
},
initialUplinkBWP {
genericParameters {
locationAndBandwidth 28875,
subcarrierSpacing kHz30
},
rach-ConfigCommon setup: {
rach-ConfigGeneric {
prach-ConfigurationIndex 160,
msg1-FDM one,
msg1-FrequencyStart 7,
zeroCorrelationZoneConfig 15,
preambleReceivedTargetPower -110,
preambleTransMax n7,
powerRampingStep dB4,
ra-ResponseWindow sl20
},
ssb-perRACH-OccasionAndCB-PreamblesPerSSB one: n8,
ra-ContentionResolutionTimer sf64,
prach-RootSequenceIndex l139: 1,
msg1-SubcarrierSpacing kHz30,
restrictedSetConfig unrestrictedSet
},
pusch-ConfigCommon setup: {
pusch-TimeDomainAllocationList {
{
k2 7,
mappingType typeA,
startSymbolAndLength 27
},
{
k2 4,
mappingType typeA,
startSymbolAndLength 27
},
{
k2 2,
mappingType typeA,
startSymbolAndLength 27
}
},
p0-NominalWithGrant -84
},
pucch-ConfigCommon setup: {
pucch-ResourceCommon 11,
pucch-GroupHopping neither,
p0-nominal -90
}
},
dummy ms500
},
ssb-PositionsInBurst mediumBitmap: '80'H,
ssb-periodicityServingCell ms20,
dmrs-TypeA-Position pos2,
ssbSubcarrierSpacing kHz30,
tdd-UL-DL-ConfigurationCommon {
referenceSubcarrierSpacing kHz30,
pattern1 {
dl-UL-TransmissionPeriodicity ms5,
nrofDownlinkSlots 7,
nrofDownlinkSymbols 6,
nrofUplinkSlots 2,
nrofUplinkSymbols 4
}
},
ss-PBCH-BlockPower -60
},
newUE-Identity 17922,
t304 ms1000,
smtc {
periodicityAndOffset sf20: 0,
duration sf1
}
},
spCellConfigDedicated {
initialDownlinkBWP {
pdcch-Config setup: {
controlResourceSetToAddModList {
{
controlResourceSetId 2,
frequencyDomainResources '111111111111111110000000000000000000000000000'B,
duration 1,
cce-REG-MappingType nonInterleaved: NULL,
precoderGranularity sameAsREG-bundle
}
},
searchSpacesToAddModList {
{
searchSpaceId 2,
controlResourceSetId 2,
monitoringSlotPeriodicityAndOffset sl1: NULL,
monitoringSymbolsWithinSlot '10000000000000'B,
nrofCandidates {
aggregationLevel1 n0,
aggregationLevel2 n2,
aggregationLevel4 n1,
aggregationLevel8 n0,
aggregationLevel16 n0
},
searchSpaceType ue-Specific: {
dci-Formats formats0-1-And-1-1
}
}
}
},
pdsch-Config setup: {
dmrs-DownlinkForPDSCH-MappingTypeA setup: {
dmrs-AdditionalPosition pos1
},
tci-StatesToAddModList {
{
tci-StateId 0,
qcl-Type1 {
referenceSignal ssb: 0,
qcl-Type typeD
}
}
},
resourceAllocation resourceAllocationType1,
rbg-Size config1,
mcs-Table qam256,
prb-BundlingType staticBundling: {
bundleSize wideband
},
zp-CSI-RS-ResourceToAddModList {
{
zp-CSI-RS-ResourceId 0,
resourceMapping {
frequencyDomainAllocation row4: '001'B,
nrofPorts p4,
firstOFDMSymbolInTimeDomain 4,
cdm-Type fd-CDM2,
density one: NULL,
freqBand {
startingRB 0,
nrofRBs 108
}
},
periodicityAndOffset slots80: 1
}
},
p-ZP-CSI-RS-ResourceSet setup: {
zp-CSI-RS-ResourceSetId 0,
zp-CSI-RS-ResourceIdList {
0
}
}
}
},
firstActiveDownlinkBWP-Id 0,
uplinkConfig {
initialUplinkBWP {
pucch-Config setup: {
resourceSetToAddModList {
{
pucch-ResourceSetId 0,
resourceList {
0,
1,
2,
3,
4,
5,
6,
7
}
},
{
pucch-ResourceSetId 1,
resourceList {
8,
9,
10,
11
}
}
},
resourceToAddModList {
{
pucch-ResourceId 0,
startingPRB 105,
intraSlotFrequencyHopping enabled,
secondHopPRB 0,
format format1: {
initialCyclicShift 1,
nrofSymbols 14,
startingSymbolIndex 0,
timeDomainOCC 0
}
},
{
pucch-ResourceId 1,
startingPRB 105,
intraSlotFrequencyHopping enabled,
secondHopPRB 0,
format format1: {
initialCyclicShift 5,
nrofSymbols 14,
startingSymbolIndex 0,
timeDomainOCC 0
}
},
{
pucch-ResourceId 2,
startingPRB 105,
intraSlotFrequencyHopping enabled,
secondHopPRB 0,
format format1: {
initialCyclicShift 9,
nrofSymbols 14,
startingSymbolIndex 0,
timeDomainOCC 0
}
},
{
pucch-ResourceId 3,
startingPRB 105,
intraSlotFrequencyHopping enabled,
secondHopPRB 0,
format format1: {
initialCyclicShift 1,
nrofSymbols 14,
startingSymbolIndex 0,
timeDomainOCC 1
}
},
{
pucch-ResourceId 4,
startingPRB 105,
intraSlotFrequencyHopping enabled,
secondHopPRB 0,
format format1: {
initialCyclicShift 5,
nrofSymbols 14,
startingSymbolIndex 0,
timeDomainOCC 1
}
},
{
pucch-ResourceId 5,
startingPRB 105,
intraSlotFrequencyHopping enabled,
secondHopPRB 0,
format format1: {
initialCyclicShift 9,
nrofSymbols 14,
startingSymbolIndex 0,
timeDomainOCC 1
}
},
{
pucch-ResourceId 6,
startingPRB 105,
intraSlotFrequencyHopping enabled,
secondHopPRB 0,
format format1: {
initialCyclicShift 1,
nrofSymbols 14,
startingSymbolIndex 0,
timeDomainOCC 2
}
},
{
pucch-ResourceId 7,
startingPRB 105,
intraSlotFrequencyHopping enabled,
secondHopPRB 0,
format format1: {
initialCyclicShift 5,
nrofSymbols 14,
startingSymbolIndex 0,
timeDomainOCC 2
}
},
{
pucch-ResourceId 8,
startingPRB 1,
intraSlotFrequencyHopping enabled,
secondHopPRB 104,
format format2: {
nrofPRBs 1,
nrofSymbols 2,
startingSymbolIndex 0
}
},
{
pucch-ResourceId 9,
startingPRB 1,
intraSlotFrequencyHopping enabled,
secondHopPRB 104,
format format2: {
nrofPRBs 1,
nrofSymbols 2,
startingSymbolIndex 2
}
},
{
pucch-ResourceId 10,
startingPRB 1,
intraSlotFrequencyHopping enabled,
secondHopPRB 104,
format format2: {
nrofPRBs 1,
nrofSymbols 2,
startingSymbolIndex 4
}
},
{
pucch-ResourceId 11,
startingPRB 1,
intraSlotFrequencyHopping enabled,
secondHopPRB 104,
format format2: {
nrofPRBs 1,
nrofSymbols 2,
startingSymbolIndex 6
}
},
{
pucch-ResourceId 12,
startingPRB 105,
intraSlotFrequencyHopping enabled,
secondHopPRB 0,
format format1: {
initialCyclicShift 9,
nrofSymbols 14,
startingSymbolIndex 0,
timeDomainOCC 2
}
},
{
pucch-ResourceId 13,
startingPRB 1,
intraSlotFrequencyHopping enabled,
secondHopPRB 104,
format format2: {
nrofPRBs 1,
nrofSymbols 2,
startingSymbolIndex 8
}
}
},
format1 setup: {
},
format2 setup: {
maxCodeRate zeroDot25
},
schedulingRequestResourceToAddModList {
{
schedulingRequestResourceId 1,
schedulingRequestID 0,
periodicityAndOffset sl40: 8,
resource 12
}
},
dl-DataToUL-ACK {
8,
7,
6,
5,
4,
12,
11
}
},
pusch-Config setup: {
txConfig codebook,
dmrs-UplinkForPUSCH-MappingTypeA setup: {
dmrs-AdditionalPosition pos1,
transformPrecodingDisabled {
}
},
pusch-PowerControl {
msg3-Alpha alpha1,
p0-AlphaSets {
{
p0-PUSCH-AlphaSetId 0,
p0 0,
alpha alpha1
}
},
pathlossReferenceRSToAddModList {
{
pusch-PathlossReferenceRS-Id 0,
referenceSignal ssb-Index: 0
}
},
sri-PUSCH-MappingToAddModList {
{
sri-PUSCH-PowerControlId 0,
sri-PUSCH-PathlossReferenceRS-Id 0,
sri-P0-PUSCH-AlphaSetId 0,
sri-PUSCH-ClosedLoopIndex i0
}
}
},
resourceAllocation resourceAllocationType1,
mcs-Table qam256,
mcs-TableTransformPrecoder qam256,
codebookSubset nonCoherent,
maxRank 1,
uci-OnPUSCH setup: {
betaOffsets semiStatic: {
betaOffsetACK-Index1 9,
betaOffsetACK-Index2 9,
betaOffsetACK-Index3 9,
betaOffsetCSI-Part1-Index1 7,
betaOffsetCSI-Part1-Index2 7,
betaOffsetCSI-Part2-Index1 7,
betaOffsetCSI-Part2-Index2 7
},
scaling f1
}
},
srs-Config setup: {
srs-ResourceSetToAddModList {
{
srs-ResourceSetId 0,
srs-ResourceIdList {
0
},
resourceType aperiodic: {
aperiodicSRS-ResourceTrigger 1,
slotOffset 7
},
usage codebook,
p0 -84,
pathlossReferenceRS ssb-Index: 0
}
},
srs-ResourceToAddModList {
{
srs-ResourceId 0,
nrofSRS-Ports port1,
transmissionComb n2: {
combOffset-n2 0,
cyclicShift-n2 0
},
resourceMapping {
startPosition 0,
nrofSymbols n1,
repetitionFactor n1
},
freqDomainPosition 0,
freqDomainShift 9,
freqHopping {
c-SRS 22,
b-SRS 3,
b-hop 0
},
groupOrSequenceHopping neither,
resourceType aperiodic: {
},
sequenceId 501
}
}
}
},
firstActiveUplinkBWP-Id 0,
pusch-ServingCellConfig setup: {
}
},
pdcch-ServingCellConfig setup: {
},
pdsch-ServingCellConfig setup: {
nrofHARQ-ProcessesForPDSCH n16,
maxMIMO-Layers 2
},
csi-MeasConfig setup: {
nzp-CSI-RS-ResourceToAddModList {
{
nzp-CSI-RS-ResourceId 0,
resourceMapping {
frequencyDomainAllocation other: '000001'B,
nrofPorts p2,
firstOFDMSymbolInTimeDomain 3,
cdm-Type fd-CDM2,
density one: NULL,
freqBand {
startingRB 0,
nrofRBs 108
}
},
powerControlOffset 0,
scramblingID 501,
periodicityAndOffset slots80: 1,
qcl-InfoPeriodicCSI-RS 0
},
{
nzp-CSI-RS-ResourceId 1,
resourceMapping {
frequencyDomainAllocation row1: '1'H,
nrofPorts p1,
firstOFDMSymbolInTimeDomain 5,
cdm-Type noCDM,
density three: NULL,
freqBand {
startingRB 0,
nrofRBs 108
}
},
powerControlOffset 0,
scramblingID 501,
periodicityAndOffset slots80: 1,
qcl-InfoPeriodicCSI-RS 0
},
{
nzp-CSI-RS-ResourceId 2,
resourceMapping {
frequencyDomainAllocation row1: '1'H,
nrofPorts p1,
firstOFDMSymbolInTimeDomain 9,
cdm-Type noCDM,
density three: NULL,
freqBand {
startingRB 0,
nrofRBs 108
}
},
powerControlOffset 0,
scramblingID 501,
periodicityAndOffset slots80: 1,
qcl-InfoPeriodicCSI-RS 0
},
{
nzp-CSI-RS-ResourceId 3,
resourceMapping {
frequencyDomainAllocation row1: '1'H,
nrofPorts p1,
firstOFDMSymbolInTimeDomain 5,
cdm-Type noCDM,
density three: NULL,
freqBand {
startingRB 0,
nrofRBs 108
}
},
powerControlOffset 0,
scramblingID 501,
periodicityAndOffset slots80: 2,
qcl-InfoPeriodicCSI-RS 0
},
{
nzp-CSI-RS-ResourceId 4,
resourceMapping {
frequencyDomainAllocation row1: '1'H,
nrofPorts p1,
firstOFDMSymbolInTimeDomain 9,
cdm-Type noCDM,
density three: NULL,
freqBand {
startingRB 0,
nrofRBs 108
}
},
powerControlOffset 0,
scramblingID 501,
periodicityAndOffset slots80: 2,
qcl-InfoPeriodicCSI-RS 0
}
},
nzp-CSI-RS-ResourceSetToAddModList {
{
nzp-CSI-ResourceSetId 0,
nzp-CSI-RS-Resources {
0
}
},
{
nzp-CSI-ResourceSetId 1,
nzp-CSI-RS-Resources {
1,
2,
3,
4
},
trs-Info true
}
},
csi-IM-ResourceToAddModList {
{
csi-IM-ResourceId 0,
csi-IM-ResourceElementPattern pattern1: {
subcarrierLocation-p1 s0,
symbolLocation-p1 4
},
freqBand {
startingRB 0,
nrofRBs 108
},
periodicityAndOffset slots80: 1
}
},
csi-IM-ResourceSetToAddModList {
{
csi-IM-ResourceSetId 0,
csi-IM-Resources {
0
}
}
},
csi-ResourceConfigToAddModList {
{
csi-ResourceConfigId 0,
csi-RS-ResourceSetList nzp-CSI-RS-SSB: {
nzp-CSI-RS-ResourceSetList {
0
}
},
bwp-Id 0,
resourceType periodic
},
{
csi-ResourceConfigId 1,
csi-RS-ResourceSetList csi-IM-ResourceSetList: {
0
},
bwp-Id 0,
resourceType periodic
},
{
csi-ResourceConfigId 2,
csi-RS-ResourceSetList nzp-CSI-RS-SSB: {
nzp-CSI-RS-ResourceSetList {
1
}
},
bwp-Id 0,
resourceType periodic
}
},
csi-ReportConfigToAddModList {
{
reportConfigId 0,
resourcesForChannelMeasurement 0,
csi-IM-ResourcesForInterference 1,
reportConfigType periodic: {
reportSlotConfig slots80: 9,
pucch-CSI-ResourceList {
{
uplinkBandwidthPartId 0,
pucch-Resource 13
}
}
},
reportQuantity cri-RI-PMI-CQI: NULL,
reportFreqConfiguration {
cqi-FormatIndicator widebandCQI,
pmi-FormatIndicator widebandPMI
},
timeRestrictionForChannelMeasurements notConfigured,
timeRestrictionForInterferenceMeasurements notConfigured,
codebookConfig {
codebookType type1: {
subType typeI-SinglePanel: {
nrOfAntennaPorts two: {
twoTX-CodebookSubsetRestriction '111111'B
},
typeI-SinglePanel-ri-Restriction '03'H
},
codebookMode 1
}
},
groupBasedBeamReporting disabled: {
},
cqi-Table table2,
subbandSize value1
}
}
},
tag-Id 0,
servingCellMO 1,
lte-CRS-ToMatchAround release: NULL
}
}
},
masterKeyUpdate {
keySetChangeIndicator FALSE,
nextHopChainingCount 0
}
}
}
}
}