N2 handover intra-AMF 2Gnb 1ue
This commit is contained in:
155
HANDOVER_RESET_SOLUTION.md
vendored
Normal file
155
HANDOVER_RESET_SOLUTION.md
vendored
Normal file
@@ -0,0 +1,155 @@
|
||||
# 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`
|
||||
|
||||
```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状态**:
|
||||
```bash
|
||||
./nr-cli UERANSIM-gnb-208-95-1 -e 'handover-reset 1'
|
||||
```
|
||||
|
||||
2. **触发handover**:
|
||||
```bash
|
||||
./nr-cli UERANSIM-gnb-208-95-1 -e 'handover 1 2'
|
||||
```
|
||||
|
||||
### 完整流程示例
|
||||
|
||||
```bash
|
||||
# 步骤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. **场景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. **场景2:测试期间状态清理**
|
||||
```bash
|
||||
# 在每次新测试前重置所有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
|
||||
```
|
||||
|
||||
## 编译和测试
|
||||
|
||||
### 编译
|
||||
```bash
|
||||
cd /home/uenr-3.2.7/ueransim
|
||||
make -j4
|
||||
```
|
||||
|
||||
### 测试脚本
|
||||
```bash
|
||||
./test_handover_reset.sh
|
||||
```
|
||||
|
||||
## 兼容性
|
||||
|
||||
- ✅ 兼容现有handover实现
|
||||
- ✅ 不影响正常的handover流程
|
||||
- ✅ 向后兼容现有CLI命令
|
||||
- ✅ 支持所有UERANSIM配置
|
||||
|
||||
## 总结
|
||||
|
||||
handover-reset功能成功解决了"UE already in handover state"的问题,提供了:
|
||||
|
||||
1. **状态管理**:完整的handover状态重置机制
|
||||
2. **CLI支持**:简单易用的命令行接口
|
||||
3. **错误处理**:完善的错误检查和日志记录
|
||||
4. **操作性**:便于测试和调试的工具
|
||||
|
||||
这个实现使得UERANSIM的handover功能更加健壮和易于操作。
|
||||
Reference in New Issue
Block a user