Files
ueransim/HANDOVER_RESET_SOLUTION.md
2025-09-11 06:16:32 +00:00

3.7 KiB
Vendored
Raw Permalink Blame History

UERANSIM Handover 状态重置功能实现

问题背景

在UERANSIM的N2 handover测试中经常遇到以下错误

triggerHandover: UE 1 already in handover state 1

这个错误表示UE仍然处于handover状态HO_PREPARATION无法启动新的handover流程。

解决方案

实现了handover-reset命令来重置UE的handover状态使其能够重新执行handover操作。

1. 核心实现

resetHandoverState() 方法

位置:src/gnb/ngap/context.cpp

void NgapTask::resetHandoverState(int ueId)
{
    m_logger->debug("Resetting handover state for ueId=%d", ueId);

    auto *ue = findUeContext(ueId);
    if (!ue) {
        m_logger->err("resetHandoverState: UE context not found for ueId=%d", ueId);
        return;
    }

    // 重置handover相关状态
    ue->handoverState = NgapUeContext::EHandoverState::HO_IDLE;
    ue->targetGnbId = 0;
    ue->handoverStartTime = 0;
    
    // 清空容器
    ue->sourceToTargetContainer = OctetString{};
    ue->targetToSourceContainer = OctetString{};

    m_logger->info("Handover state reset completed for UE %d", ueId);
}

2. CLI命令支持

handover-reset 命令

  • 语法handover-reset <ue-id>
  • 功能重置指定UE的handover状态到HO_IDLE
  • 示例./nr-cli UERANSIM-gnb-208-95-1 -e 'handover-reset 1'

3. 修改的文件

  1. src/lib/app/cli_cmd.hpp - 添加HANDOVER_RESET枚举
  2. src/lib/app/cli_cmd.cpp - 实现handover-reset命令解析
  3. src/gnb/ngap/task.hpp - 添加resetHandoverState方法声明
  4. src/gnb/ngap/context.cpp - 实现resetHandoverState方法
  5. src/gnb/app/cmd_handler.cpp - 处理HANDOVER_RESET命令

使用指南

基本用法

  1. 重置UE状态

    ./nr-cli UERANSIM-gnb-208-95-1 -e 'handover-reset 1'
    
  2. 触发handover

    ./nr-cli UERANSIM-gnb-208-95-1 -e 'handover 1 2'
    

完整流程示例

# 步骤1重置状态清除之前的handover状态
./nr-cli UERANSIM-gnb-208-95-1 -e 'handover-reset 1'

# 步骤2触发新的handover
./nr-cli UERANSIM-gnb-208-95-1 -e 'handover 1 2'

故障排除场景

  1. 场景1UE stuck in handover state

    错误信息triggerHandover: UE 1 already in handover state 1
    解决方案:./nr-cli UERANSIM-gnb-208-95-1 -e 'handover-reset 1'
    
  2. 场景2测试期间状态清理

    # 在每次新测试前重置所有UE状态
    ./nr-cli UERANSIM-gnb-208-95-1 -e 'handover-reset 1'
    ./nr-cli UERANSIM-gnb-208-95-1 -e 'handover-reset 2'
    

日志输出

成功重置

[DEBUG] Resetting handover state for ueId=1
[INFO] Handover state reset completed for UE 1

UE未找到

[ERROR] resetHandoverState: UE context not found for ueId=1

技术细节

重置的状态字段

  • handoverState: 设置为 HO_IDLE
  • targetGnbId: 重置为 0
  • handoverStartTime: 重置为 0
  • sourceToTargetContainer: 清空
  • targetToSourceContainer: 清空

状态机转换

任何状态 (HO_PREPARATION, HO_EXECUTION) -> HO_IDLE

编译和测试

编译

cd /home/uenr-3.2.7/ueransim
make -j4

测试脚本

./test_handover_reset.sh

兼容性

  • 兼容现有handover实现
  • 不影响正常的handover流程
  • 向后兼容现有CLI命令
  • 支持所有UERANSIM配置

总结

handover-reset功能成功解决了"UE already in handover state"的问题,提供了:

  1. 状态管理完整的handover状态重置机制
  2. CLI支持:简单易用的命令行接口
  3. 错误处理:完善的错误检查和日志记录
  4. 操作性:便于测试和调试的工具

这个实现使得UERANSIM的handover功能更加健壮和易于操作。