N2 handover intra-AMF 2Gnb 1ue

This commit is contained in:
agtuser
2025-09-11 06:16:32 +00:00
parent 10ca9395e5
commit 388389428d
38 changed files with 4031 additions and 13 deletions

View File

@@ -16,7 +16,11 @@
namespace nr::gnb
{
NgapTask::NgapTask(TaskBase *base) : m_base{base}, m_ueNgapIdCounter{}, m_downlinkTeidCounter{}, m_isInitialized{}
// 切换清理定时器
static constexpr const int TIMER_ID_HANDOVER_CLEANUP = 3001;
static constexpr const int TIMER_PERIOD_HANDOVER_CLEANUP = 5000; // 5秒检查一次
NgapTask::NgapTask(TaskBase *base) : m_base{base}, m_ueNgapIdCounter{}, m_ueIdCounter{100}, m_downlinkTeidCounter{}, m_isInitialized{}
{
m_logger = base->logBase->makeUniqueLogger("ngap");
}
@@ -40,6 +44,9 @@ void NgapTask::onStart()
msg->associatedTask = this;
m_base->sctpTask->push(std::move(msg));
}
// 启动切换清理定时器
setTimer(TIMER_ID_HANDOVER_CLEANUP, TIMER_PERIOD_HANDOVER_CLEANUP);
}
void NgapTask::onLoop()
@@ -50,6 +57,14 @@ void NgapTask::onLoop()
switch (msg->msgType)
{
case NtsMessageType::TIMER_EXPIRED: {
auto &w = dynamic_cast<NmTimerExpired &>(*msg);
if (w.timerId == TIMER_ID_HANDOVER_CLEANUP) {
checkAndCleanupExpiredHandovers();
setTimer(TIMER_ID_HANDOVER_CLEANUP, TIMER_PERIOD_HANDOVER_CLEANUP);
}
break;
}
case NtsMessageType::GNB_RRC_TO_NGAP: {
auto &w = dynamic_cast<NmGnbRrcToNgap &>(*msg);
switch (w.present)
@@ -66,6 +81,33 @@ void NgapTask::onLoop()
handleRadioLinkFailure(w.ueId);
break;
}
case NmGnbRrcToNgap::HANDOVER_TRIGGER: {
// 处理来自RRC的切换触发
triggerHandover(w.ueId, w.targetCellId, w.targetGnbId);
break;
}
case NmGnbRrcToNgap::HANDOVER_REQUEST_ACK: {
// 处理来自RRC的切换请求确认
sendHandoverRequestAcknowledge(w.ueId, w.sourceToTargetContainer);
break;
}
case NmGnbRrcToNgap::HANDOVER_REQUEST_FAILURE: {
// 处理来自RRC的切换请求失败
m_logger->err("RRC reported handover request failure for UE {}", w.ueId);
// 清理切换上下文
auto *ueCtx = findUeContext(w.ueId);
if (ueCtx) {
// 删除为切换创建的UE上下文
deleteUeContext(w.ueId);
m_logger->info("Cleaned up UE context {} due to handover failure", w.ueId);
}
break;
}
case NmGnbRrcToNgap::HANDOVER_RRC_COMPLETE: {
// UE已在目标侧完成RRC重配置正式发起Path Switch
sendPathSwitchRequest(w.ueId);
break;
}
}
break;
}