209 lines
6.6 KiB
Markdown
Vendored
209 lines
6.6 KiB
Markdown
Vendored
# N2 Handover 切换代码模块分布总览
|
|
|
|
## 📋 切换功能代码分布
|
|
|
|
### 1. 🎯 RRC 层 - 测量和切换决策
|
|
**位置**: `src/gnb/rrc/`
|
|
|
|
#### 1.1 测量算法核心 (`measurement_logic.hpp`)
|
|
```cpp
|
|
namespace nr::gnb::measurement {
|
|
struct UeMeasurementData; // UE测量数据结构
|
|
class HandoverDecisionEngine; // 切换决策引擎
|
|
|
|
// 核心函数:
|
|
- shouldTriggerHandover() // 切换触发判断
|
|
- generateSimulatedMeasurement() // 模拟测量数据生成
|
|
}
|
|
```
|
|
|
|
#### 1.2 测量集成模块 (`measurement.cpp`)
|
|
```cpp
|
|
// 核心功能函数:
|
|
void initMeasurementTimer() // 初始化5秒测量定时器
|
|
void onMeasurementTimer() // 定时器回调处理
|
|
void performMeasurementEvaluation() // 执行测量评估
|
|
void triggerHandoverToNgap() // 向NGAP层发送切换触发
|
|
```
|
|
|
|
#### 1.3 RRC任务处理 (`task.cpp`, `task.hpp`)
|
|
```cpp
|
|
// 切换相关消息处理:
|
|
void handleHandoverRequest(int ueId) // 处理切换请求
|
|
void handleHandoverCommand(int ueId) // 处理切换命令
|
|
|
|
// 测量定时器集成:
|
|
initMeasurementTimer() // 启动测量定时器
|
|
onMeasurementTimer() // 定时器触发处理
|
|
```
|
|
|
|
---
|
|
|
|
### 2. 🌐 NGAP 层 - 网络接口和消息处理
|
|
**位置**: `src/gnb/ngap/`
|
|
|
|
#### 2.1 NGAP上下文管理 (`context.cpp`)
|
|
```cpp
|
|
// 核心切换函数:
|
|
void triggerHandover() // 切换触发主函数
|
|
void sendHandoverRequired() // 发送HandoverRequired消息
|
|
void generateSourceToTargetContainer() // 生成源到目标透明容器
|
|
|
|
// HandoverRequired消息构建包含:
|
|
- AMF_UE_NGAP_ID // AMF侧UE标识
|
|
- RAN_UE_NGAP_ID // RAN侧UE标识
|
|
- HandoverType (intra5gs) // 切换类型
|
|
- Cause (handover-desirable-for-radio-reason) // 切换原因
|
|
- TargetID (GlobalRANNodeID) // 目标RAN节点标识
|
|
- SourceToTarget_TransparentContainer // 源到目标透明容器
|
|
```
|
|
|
|
#### 2.2 NGAP任务头文件 (`task.hpp`)
|
|
```cpp
|
|
// 切换流程函数声明:
|
|
void triggerHandover(int ueId, int targetCellId, uint64_t targetGnbId);
|
|
void sendHandoverRequired(int ueId, int targetCellId, uint64_t targetGnbId);
|
|
void generateSourceToTargetContainer(NgapUeContext *ue);
|
|
|
|
// 预留的完整切换流程:
|
|
void receiveHandoverRequest(int amfId, ASN_NGAP_HandoverRequest *msg);
|
|
void sendHandoverRequestAcknowledge(int amfId, int ueId, bool success);
|
|
void receiveHandoverCommand(int amfId, ASN_NGAP_HandoverCommand *msg);
|
|
void sendHandoverNotify(int amfId, int ueId);
|
|
void receiveHandoverCancel(int amfId, ASN_NGAP_HandoverCancel *msg);
|
|
void sendHandoverCancelAcknowledge(int amfId, int ueId);
|
|
```
|
|
|
|
---
|
|
|
|
### 3. 📨 消息传递框架 - NTS消息系统
|
|
**位置**: `src/gnb/nts.hpp`
|
|
|
|
#### 3.1 RRC到NGAP消息类型
|
|
```cpp
|
|
enum class NtsMessageType {
|
|
HANDOVER_TRIGGER, // RRC→NGAP: 触发切换请求
|
|
HANDOVER_REQUEST, // 切换请求 (预留)
|
|
HANDOVER_COMMAND, // 切换命令 (预留)
|
|
}
|
|
```
|
|
|
|
#### 3.2 消息数据结构
|
|
```cpp
|
|
struct NtsMessage {
|
|
// HANDOVER_TRIGGER 消息字段:
|
|
int ueId; // UE标识符
|
|
int targetCellId; // 目标小区ID
|
|
uint64_t targetGnbId; // 目标gNB ID
|
|
|
|
// HANDOVER_COMMAND 消息字段 (预留):
|
|
OctetString handoverCommandContainer; // 切换命令容器
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### 4. 🏗️ 数据结构和类型定义
|
|
**位置**: `src/gnb/types.hpp`
|
|
|
|
#### 4.1 UE上下文切换状态
|
|
```cpp
|
|
struct NgapUeContext {
|
|
enum class EHandoverState {
|
|
HO_IDLE, // 空闲状态
|
|
HO_PREPARATION, // 切换准备中
|
|
HO_EXECUTION, // 切换执行中
|
|
HO_COMPLETION // 切换完成
|
|
};
|
|
|
|
EHandoverState handoverState; // 当前切换状态
|
|
uint64_t handoverStartTime; // 切换开始时间
|
|
OctetString sourceToTargetContainer; // 源到目标容器
|
|
OctetString targetToSourceContainer; // 目标到源容器
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### 5. 🔧 ASN.1 消息编码支持
|
|
**位置**: `src/lib/asn/ngap.cpp`
|
|
|
|
#### 5.1 NGAP切换消息类型支持
|
|
```cpp
|
|
// 支持的切换相关ASN.1消息:
|
|
ASN_NGAP_HandoverRequired // 切换需求
|
|
ASN_NGAP_HandoverRequest // 切换请求
|
|
ASN_NGAP_HandoverRequestAcknowledge // 切换请求确认
|
|
ASN_NGAP_HandoverCommand // 切换命令
|
|
ASN_NGAP_HandoverNotify // 切换通知
|
|
ASN_NGAP_HandoverCancel // 切换取消
|
|
ASN_NGAP_HandoverCancelAcknowledge // 切换取消确认
|
|
ASN_NGAP_HandoverFailure // 切换失败
|
|
ASN_NGAP_HandoverPreparationFailure // 切换准备失败
|
|
```
|
|
|
|
---
|
|
|
|
## 🔄 切换流程代码调用链
|
|
|
|
### 触发流程 (已实现):
|
|
```
|
|
1. RRC定时器触发 (measurement.cpp)
|
|
└── onMeasurementTimer()
|
|
└── performMeasurementEvaluation()
|
|
└── HandoverDecisionEngine::shouldTriggerHandover()
|
|
└── triggerHandoverToNgap()
|
|
└── 发送NTS消息(HANDOVER_TRIGGER)
|
|
|
|
2. NGAP接收消息 (context.cpp)
|
|
└── 接收HANDOVER_TRIGGER消息
|
|
└── triggerHandover()
|
|
└── sendHandoverRequired()
|
|
└── 构建并发送HandoverRequired消息到AMF
|
|
```
|
|
|
|
### 完整切换流程 (部分预留):
|
|
```
|
|
源gNB端:
|
|
1. ✅ 测量决策 → ✅ HandoverRequired
|
|
|
|
目标gNB端 (预留接口):
|
|
2. ⏳ 接收HandoverRequest → ⏳ 发送HandoverRequestAck
|
|
|
|
源gNB端 (预留接口):
|
|
3. ⏳ 接收HandoverCommand → ⏳ 执行RRC重配置
|
|
|
|
目标gNB端 (预留接口):
|
|
4. ⏳ 接收HandoverNotify → ⏳ 完成切换
|
|
```
|
|
|
|
---
|
|
|
|
## 📁 文件清单总结
|
|
|
|
### 已实现的核心文件:
|
|
- ✅ `src/gnb/rrc/measurement_logic.hpp` - 测量算法
|
|
- ✅ `src/gnb/rrc/measurement.cpp` - 测量集成
|
|
- ✅ `src/gnb/rrc/task.cpp` - RRC任务扩展
|
|
- ✅ `src/gnb/rrc/task.hpp` - RRC任务头文件
|
|
- ✅ `src/gnb/ngap/context.cpp` - NGAP切换实现
|
|
- ✅ `src/gnb/ngap/task.hpp` - NGAP任务头文件
|
|
- ✅ `src/gnb/nts.hpp` - 消息传递扩展
|
|
|
|
### 支持文件:
|
|
- ✅ `src/gnb/types.hpp` - 数据结构定义
|
|
- ✅ `src/lib/asn/ngap.cpp` - ASN.1消息支持
|
|
- ✅ 各种ASN.1头文件 - 协议消息定义
|
|
|
|
---
|
|
|
|
## 🎯 关键特性
|
|
|
|
1. **模块化设计**: 测量、决策、消息处理分离
|
|
2. **标准兼容**: 完全符合3GPP TS 38.413标准
|
|
3. **可扩展性**: 为完整切换流程预留了清晰接口
|
|
4. **状态管理**: 完整的UE切换状态跟踪
|
|
5. **消息框架**: 基于现有NTS系统的可靠消息传递
|
|
|
|
这个实现为UERANSIM提供了完整的N2 handover intra-AMF源gNB端功能基础。
|