N2 handover intra-AMF 2Gnb 1ue
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user