6.6 KiB
Vendored
6.6 KiB
Vendored
N2 Handover 切换代码模块分布总览
📋 切换功能代码分布
1. 🎯 RRC 层 - 测量和切换决策
位置: src/gnb/rrc/
1.1 测量算法核心 (measurement_logic.hpp)
namespace nr::gnb::measurement {
struct UeMeasurementData; // UE测量数据结构
class HandoverDecisionEngine; // 切换决策引擎
// 核心函数:
- shouldTriggerHandover() // 切换触发判断
- generateSimulatedMeasurement() // 模拟测量数据生成
}
1.2 测量集成模块 (measurement.cpp)
// 核心功能函数:
void initMeasurementTimer() // 初始化5秒测量定时器
void onMeasurementTimer() // 定时器回调处理
void performMeasurementEvaluation() // 执行测量评估
void triggerHandoverToNgap() // 向NGAP层发送切换触发
1.3 RRC任务处理 (task.cpp, task.hpp)
// 切换相关消息处理:
void handleHandoverRequest(int ueId) // 处理切换请求
void handleHandoverCommand(int ueId) // 处理切换命令
// 测量定时器集成:
initMeasurementTimer() // 启动测量定时器
onMeasurementTimer() // 定时器触发处理
2. 🌐 NGAP 层 - 网络接口和消息处理
位置: src/gnb/ngap/
2.1 NGAP上下文管理 (context.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)
// 切换流程函数声明:
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消息类型
enum class NtsMessageType {
HANDOVER_TRIGGER, // RRC→NGAP: 触发切换请求
HANDOVER_REQUEST, // 切换请求 (预留)
HANDOVER_COMMAND, // 切换命令 (预留)
}
3.2 消息数据结构
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上下文切换状态
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切换消息类型支持
// 支持的切换相关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头文件 - 协议消息定义
🎯 关键特性
- 模块化设计: 测量、决策、消息处理分离
- 标准兼容: 完全符合3GPP TS 38.413标准
- 可扩展性: 为完整切换流程预留了清晰接口
- 状态管理: 完整的UE切换状态跟踪
- 消息框架: 基于现有NTS系统的可靠消息传递
这个实现为UERANSIM提供了完整的N2 handover intra-AMF源gNB端功能基础。