Path Switch Request 过程的目的是请求将 NG-U 传输承载的下行链路终结点切换到新的终结点。

NG-RAN 节点通过向 AMF 发送 PATH SWITCH REQUEST 消息来启动该过程。一旦接收到路径切换请求消息,AMF 就应为 PDU 会话 ID IE 中指示的每个 PDU 会话,将路径切换请求传输 IE 透明地传输到与所关注的 PDU 会话相关联的 SMF。
在 5GC 中成功完成所有必要的更新(包括UP路径切换)后,对于 PATH SWITCH REQUEST 中至少包括的 PDU 会话资源之一,AMF 将向 NG-RAN 节点发送 PATH SWITCH REQUEST ACKNOWLEDGE 消息。
接受的 QoS 流列表应包括在路径切换请求传输IE内的路径切换请求消息中。 SMF 应按照 TS 23.502 [10]中的规定处理此信息。 对于每个PDU会话,在 PATH SWITCH REQUEST 消息的请求传输 IE 中包括每个 TNL Information IE 中的 DL QoS Flow,SMF 可以使用包含的 UP 传输层信息作为该 PDU 会话在不同隧道中拆分的关联 QoS 流的下行链路终结点。
1. NG-RAN 向 AMF 发起 PATH SWITCH REQUEST
NG-RAN 节点发送此消息,以通知 AMF 新服务的 NG-RAN 节点,并通过 AMF 将一个或多个 PDU 会话资源的一些 NG-U DL 隧道终止点传输到 SMF。 NGAP 消息 Present 为 NGAPPDUPresentInitiatingMessage,initiatingMessage 的 ProcedureCode 设置为 ProcedureCodePathSwitchRequest, Present 设置为 InitiatingMessagePresentPathSwitchRequest

N2 Path Switch Request
- List of PDU Sessions To Be Switched with N2 SM Information,
- List of PDU Sessions that failed to be established with the failure cause given in the N2 SM information element,
- UE Location Information


1.1 AMF 处理 PATH SWITCH REQUEST
// TS 23.502 4.9.1
func HandlePathSwitchRequest(ran *context.AmfRan, message *ngapType.NGAPPDU) {
var rANUENGAPID *ngapType.RANUENGAPID
var sourceAMFUENGAPID *ngapType.AMFUENGAPID
var userLocationInformation *ngapType.UserLocationInformation
var uESecurityCapabilities *ngapType.UESecurityCapabilities
var pduSessionResourceToBeSwitchedInDLList *ngapType.PDUSessionResourceToBeSwitchedDLList
var pduSessionResourceFailedToSetupList *ngapType.PDUSessionResourceFailedToSetupListPSReq
1.1.1 AMF 向 SMF 发送 UpdateSmContext
n2SmInfoType 设置为 N2SmInfoType_PATH_SWITCH_REQ

1.2 SMF 处理 UpdateSmContext
func HandlePDUSessionSMContextUpdate(smContextRef string, body models.UpdateSmContextRequest) *http_wrapper.Response {
//GSM State
//PDU Session Modification Reject(Cause Value == 43 || Cause Value != 43)/Complete
//PDU Session Release Command/Complete
logger.PduSessLog.Infoln("In HandlePDUSessionSMContextUpdate")
smContext := smf_context.GetSMContext(smContextRef)
1.2.1 根据 n2SmInfoType 为 N2SmInfoType_PATH_SWITCH_REQ
switch smContextUpdateData.N2SmInfoType {
case models.N2SmInfoType_PATH_SWITCH_REQ:
smContext.SMContextState = smf_context.ModificationPending
logger.CtxLog.Traceln("SMContextState Change State: ", smContext.SMContextState.String())
if err := smf_context.HandlePathSwitchRequestTransfer(body.BinaryDataN2SmInformation, smContext); err != nil {
logger.PduSessLog.Errorf("Handle PathSwitchRequestTransfer: %+v", err)
}
if n2Buf, err := smf_context.BuildPathSwitchRequestAcknowledgeTransfer(smContext); err != nil {
logger.PduSessLog.Errorf("Build Path Switch Transfer Error(%+v)", err)
} else {
response.BinaryDataN2SmInformation = n2Buf
}
response.JsonData.N2SmInfoType = models.N2SmInfoType_PATH_SWITCH_REQ_ACK
response.JsonData.N2SmInfo = &models.RefToBinaryData{
ContentId: "PATH_SWITCH_REQ_ACK",
}
smContext.PendingUPF = make(smf_context.PendingUPF)
for _, dataPath := range tunnel.DataPathPool {
if dataPath.Activated {
ANUPF := dataPath.FirstDPNode
DLPDR := ANUPF.DownLinkTunnel.PDR
pdrList = append(pdrList, DLPDR)
farList = append(farList, DLPDR.FAR)
if _, exist := smContext.PendingUPF[ANUPF.GetNodeIP()]; !exist {
smContext.PendingUPF[ANUPF.GetNodeIP()] = true
}
}
}
sendPFCPModification = true
smContext.SMContextState = smf_context.PFCPModification
logger.CtxLog.Traceln("SMContextState Change State: ", smContext.SMContextState.String())
HandlePathSwitchRequestTransfer 函数将发来的 PathSwitchRequestTransfer ,根据 gTPTunnel 设置 FAR,更新 N3 RAN 地址

BuildPathSwitchRequestAcknowledgeTransfer 函数向 AMF 响应请求

2. AMF 向 RAN 发送 PathSwitchRequestAcknowledge
