3.7 KiB
Vendored
3.7 KiB
Vendored
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. 修改的文件
- src/lib/app/cli_cmd.hpp - 添加HANDOVER_RESET枚举
- src/lib/app/cli_cmd.cpp - 实现handover-reset命令解析
- src/gnb/ngap/task.hpp - 添加resetHandoverState方法声明
- src/gnb/ngap/context.cpp - 实现resetHandoverState方法
- src/gnb/app/cmd_handler.cpp - 处理HANDOVER_RESET命令
使用指南
基本用法
-
重置UE状态:
./nr-cli UERANSIM-gnb-208-95-1 -e 'handover-reset 1' -
触发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:UE stuck in handover state
错误信息:triggerHandover: UE 1 already in handover state 1 解决方案:./nr-cli UERANSIM-gnb-208-95-1 -e 'handover-reset 1' -
场景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_IDLEtargetGnbId: 重置为 0handoverStartTime: 重置为 0sourceToTargetContainer: 清空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"的问题,提供了:
- 状态管理:完整的handover状态重置机制
- CLI支持:简单易用的命令行接口
- 错误处理:完善的错误检查和日志记录
- 操作性:便于测试和调试的工具
这个实现使得UERANSIM的handover功能更加健壮和易于操作。