# 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功能更加健壮和易于操作。
