From 9036e8bce8faad8f52b466f8ecc7081bd06f4f8f Mon Sep 17 00:00:00 2001 From: "CTFang@WireLab" Date: Thu, 29 Aug 2024 07:18:09 +0000 Subject: [PATCH 1/3] fix: FindAmfUe restore when CM-Idle --- internal/gmm/common/user_profile.go | 12 ++++---- internal/nas/handler.go | 43 +++++++++++++++++++---------- 2 files changed, 34 insertions(+), 21 deletions(-) diff --git a/internal/gmm/common/user_profile.go b/internal/gmm/common/user_profile.go index 8201340..00b08a2 100644 --- a/internal/gmm/common/user_profile.go +++ b/internal/gmm/common/user_profile.go @@ -54,19 +54,19 @@ func PurgeAmfUeSubscriberData(ue *context.AmfUe) { } } -func AttachRanUeToAmfUeAndReleaseOldIfAny(ue *context.AmfUe, ranUe *context.RanUe) { - if oldRanUe := ue.RanUe[ranUe.Ran.AnType]; oldRanUe != nil { +func AttachRanUeToAmfUeAndReleaseOldIfAny(amfUe *context.AmfUe, ranUe *context.RanUe) { + if oldRanUe := amfUe.RanUe[ranUe.Ran.AnType]; oldRanUe != nil { oldRanUe.Log.Infof("Implicit Deregistration - RanUeNgapID[%d]", oldRanUe.RanUeNgapId) oldRanUe.DetachAmfUe() - if ue.T3550 != nil { - ue.State[ranUe.Ran.AnType].Set(context.Registered) + if amfUe.T3550 != nil { + amfUe.State[ranUe.Ran.AnType].Set(context.Registered) } - StopAll5GSMMTimers(ue) + StopAll5GSMMTimers(amfUe) causeGroup := ngapType.CausePresentRadioNetwork causeValue := ngapType.CauseRadioNetworkPresentReleaseDueToNgranGeneratedReason ngap_message.SendUEContextReleaseCommand(oldRanUe, context.UeContextReleaseUeContext, causeGroup, causeValue) } - ue.AttachRanUe(ranUe) + amfUe.AttachRanUe(ranUe) } func ClearHoldingRanUe(ranUe *context.RanUe) { diff --git a/internal/nas/handler.go b/internal/nas/handler.go index 5584074..8018b40 100644 --- a/internal/nas/handler.go +++ b/internal/nas/handler.go @@ -10,39 +10,52 @@ import ( "github.com/free5gc/nas" ) -func HandleNAS(ue *amf_context.RanUe, procedureCode int64, nasPdu []byte, initialMessage bool) { +func HandleNAS(ranUe *amf_context.RanUe, procedureCode int64, nasPdu []byte, initialMessage bool) { + logger.NasLog.Error("HandleNAS") + amfSelf := amf_context.GetSelf() - if ue == nil { + if ranUe == nil { logger.NasLog.Error("RanUe is nil") return } if nasPdu == nil { - ue.Log.Error("nasPdu is nil") + ranUe.Log.Error("nasPdu is nil") return } - if ue.AmfUe == nil { - ue.AmfUe = amfSelf.NewAmfUe("") - gmm_common.AttachRanUeToAmfUeAndReleaseOldIfAny(ue.AmfUe, ue) + if ranUe.AmfUe == nil { + if ranUe.FindAmfUe != nil && !ranUe.FindAmfUe.CmConnect(ranUe.Ran.AnType) { + // models.CmState_IDLE + logger.NasLog.Errorln("FindAmfUe", ranUe.FindAmfUe.RanUe) + gmm_common.ClearHoldingRanUe(ranUe.FindAmfUe.RanUe[ranUe.Ran.AnType]) + + ranUe.AmfUe = ranUe.FindAmfUe + gmm_common.AttachRanUeToAmfUeAndReleaseOldIfAny(ranUe.AmfUe, ranUe) + ranUe.FindAmfUe = nil + } else { + ranUe.AmfUe = amfSelf.NewAmfUe("") + gmm_common.AttachRanUeToAmfUeAndReleaseOldIfAny(ranUe.AmfUe, ranUe) + } } - msg, integrityProtected, err := nas_security.Decode(ue.AmfUe, ue.Ran.AnType, nasPdu, initialMessage) + msg, integrityProtected, err := nas_security.Decode(ranUe.AmfUe, ranUe.Ran.AnType, nasPdu, initialMessage) if err != nil { - ue.AmfUe.NASLog.Errorln(err) + ranUe.AmfUe.NASLog.Errorln(err) return } - ue.AmfUe.NasPduValue = nasPdu - ue.AmfUe.MacFailed = !integrityProtected + ranUe.AmfUe.NasPduValue = nasPdu + ranUe.AmfUe.MacFailed = !integrityProtected - if ue.AmfUe.SecurityContextIsValid() && ue.FindAmfUe != nil { - gmm_common.ClearHoldingRanUe(ue.FindAmfUe.RanUe[ue.Ran.AnType]) - ue.FindAmfUe = nil + if ranUe.AmfUe.SecurityContextIsValid() && ranUe.FindAmfUe != nil && + msg.GmmHeader.GetMessageType() == nas.MsgTypeRegistrationRequest { + gmm_common.ClearHoldingRanUe(ranUe.FindAmfUe.RanUe[ranUe.Ran.AnType]) + ranUe.FindAmfUe = nil } - if errDispatch := Dispatch(ue.AmfUe, ue.Ran.AnType, procedureCode, msg); errDispatch != nil { - ue.AmfUe.NASLog.Errorf("Handle NAS Error: %v", errDispatch) + if errDispatch := Dispatch(ranUe.AmfUe, ranUe.Ran.AnType, procedureCode, msg); errDispatch != nil { + ranUe.AmfUe.NASLog.Errorf("Handle NAS Error: %v", errDispatch) } } From 130a12c0ed91cd24f72721776c1d881ad72ad01c Mon Sep 17 00:00:00 2001 From: "CTFang@WireLab" Date: Thu, 29 Aug 2024 08:01:05 +0000 Subject: [PATCH 2/3] fix: remove unused code --- internal/nas/handler.go | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/internal/nas/handler.go b/internal/nas/handler.go index 8018b40..dc4c8b8 100644 --- a/internal/nas/handler.go +++ b/internal/nas/handler.go @@ -11,8 +11,6 @@ import ( ) func HandleNAS(ranUe *amf_context.RanUe, procedureCode int64, nasPdu []byte, initialMessage bool) { - logger.NasLog.Error("HandleNAS") - amfSelf := amf_context.GetSelf() if ranUe == nil { @@ -28,13 +26,13 @@ func HandleNAS(ranUe *amf_context.RanUe, procedureCode int64, nasPdu []byte, ini if ranUe.AmfUe == nil { if ranUe.FindAmfUe != nil && !ranUe.FindAmfUe.CmConnect(ranUe.Ran.AnType) { // models.CmState_IDLE - logger.NasLog.Errorln("FindAmfUe", ranUe.FindAmfUe.RanUe) gmm_common.ClearHoldingRanUe(ranUe.FindAmfUe.RanUe[ranUe.Ran.AnType]) ranUe.AmfUe = ranUe.FindAmfUe gmm_common.AttachRanUeToAmfUeAndReleaseOldIfAny(ranUe.AmfUe, ranUe) ranUe.FindAmfUe = nil } else { + // New AmfUe ranUe.AmfUe = amfSelf.NewAmfUe("") gmm_common.AttachRanUeToAmfUeAndReleaseOldIfAny(ranUe.AmfUe, ranUe) } @@ -48,8 +46,7 @@ func HandleNAS(ranUe *amf_context.RanUe, procedureCode int64, nasPdu []byte, ini ranUe.AmfUe.NasPduValue = nasPdu ranUe.AmfUe.MacFailed = !integrityProtected - if ranUe.AmfUe.SecurityContextIsValid() && ranUe.FindAmfUe != nil && - msg.GmmHeader.GetMessageType() == nas.MsgTypeRegistrationRequest { + if ranUe.AmfUe.SecurityContextIsValid() && ranUe.FindAmfUe != nil { gmm_common.ClearHoldingRanUe(ranUe.FindAmfUe.RanUe[ranUe.Ran.AnType]) ranUe.FindAmfUe = nil } From dd578d702e892e93dcd4c05b7da46574d5fd5eaa Mon Sep 17 00:00:00 2001 From: "CTFang@WireLab" Date: Fri, 30 Aug 2024 03:33:31 +0000 Subject: [PATCH 3/3] fix: add comments and remove redundant code --- internal/context/amf_ran.go | 2 +- internal/context/ran_ue.go | 6 +++--- internal/nas/handler.go | 20 ++++++++++---------- internal/ngap/handler.go | 2 +- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/internal/context/amf_ran.go b/internal/context/amf_ran.go index 97b3264..a94c9c6 100644 --- a/internal/context/amf_ran.go +++ b/internal/context/amf_ran.go @@ -63,7 +63,7 @@ func (ran *AmfRan) NewRanUe(ranUeNgapID int64) (*RanUe, error) { ranUe.RanUeNgapId = ranUeNgapID ranUe.Ran = ran ranUe.Log = ran.Log - ranUe.FindAmfUe = nil + ranUe.HoldingAmfUe = nil ranUe.UpdateLogFields() if ranUeNgapID != RanUeNgapIdUnspecified { diff --git a/internal/context/ran_ue.go b/internal/context/ran_ue.go index 60b28eb..e80ef47 100644 --- a/internal/context/ran_ue.go +++ b/internal/context/ran_ue.go @@ -47,9 +47,9 @@ type RanUe struct { LastActTime *time.Time /* Related Context*/ - AmfUe *AmfUe - Ran *AmfRan - FindAmfUe *AmfUe + AmfUe *AmfUe + Ran *AmfRan + HoldingAmfUe *AmfUe // The AmfUe that is already exist (CM-Idle, Re-Registration) /* Routing ID */ RoutingID string diff --git a/internal/nas/handler.go b/internal/nas/handler.go index dc4c8b8..4cd477b 100644 --- a/internal/nas/handler.go +++ b/internal/nas/handler.go @@ -24,15 +24,15 @@ func HandleNAS(ranUe *amf_context.RanUe, procedureCode int64, nasPdu []byte, ini } if ranUe.AmfUe == nil { - if ranUe.FindAmfUe != nil && !ranUe.FindAmfUe.CmConnect(ranUe.Ran.AnType) { - // models.CmState_IDLE - gmm_common.ClearHoldingRanUe(ranUe.FindAmfUe.RanUe[ranUe.Ran.AnType]) + // Only the New created RanUE will have no AmfUe in it - ranUe.AmfUe = ranUe.FindAmfUe - gmm_common.AttachRanUeToAmfUeAndReleaseOldIfAny(ranUe.AmfUe, ranUe) - ranUe.FindAmfUe = nil + if ranUe.HoldingAmfUe != nil && !ranUe.HoldingAmfUe.CmConnect(ranUe.Ran.AnType) { + // If the UE is CM-IDLE, there is no RanUE in AmfUe, so here we attach new RanUe to AmfUe. + gmm_common.AttachRanUeToAmfUeAndReleaseOldIfAny(ranUe.HoldingAmfUe, ranUe) + ranUe.HoldingAmfUe = nil } else { - // New AmfUe + // Assume we have an existing UE context in CM-CONNECTED state. (RanUe <-> AmfUe) + // We will release it if the new UE context has a valid security context(Authenticated) in line 50. ranUe.AmfUe = amfSelf.NewAmfUe("") gmm_common.AttachRanUeToAmfUeAndReleaseOldIfAny(ranUe.AmfUe, ranUe) } @@ -46,9 +46,9 @@ func HandleNAS(ranUe *amf_context.RanUe, procedureCode int64, nasPdu []byte, ini ranUe.AmfUe.NasPduValue = nasPdu ranUe.AmfUe.MacFailed = !integrityProtected - if ranUe.AmfUe.SecurityContextIsValid() && ranUe.FindAmfUe != nil { - gmm_common.ClearHoldingRanUe(ranUe.FindAmfUe.RanUe[ranUe.Ran.AnType]) - ranUe.FindAmfUe = nil + if ranUe.AmfUe.SecurityContextIsValid() && ranUe.HoldingAmfUe != nil { + gmm_common.ClearHoldingRanUe(ranUe.HoldingAmfUe.RanUe[ranUe.Ran.AnType]) + ranUe.HoldingAmfUe = nil } if errDispatch := Dispatch(ranUe.AmfUe, ranUe.Ran.AnType, procedureCode, msg); errDispatch != nil { diff --git a/internal/ngap/handler.go b/internal/ngap/handler.go index 677b323..d10116d 100644 --- a/internal/ngap/handler.go +++ b/internal/ngap/handler.go @@ -498,7 +498,7 @@ func handleInitialUEMessageMain(ran *context.AmfRan, // Described in TS 23.502 4.2.2.2.2 step 4 (without UDSF deployment) ranUe.Log.Infof("find AmfUe [%q:%q]", idType, id) ranUe.Log.Debugf("AmfUe Attach RanUe [RanUeNgapID: %d]", ranUe.RanUeNgapId) - ranUe.FindAmfUe = amfUe + ranUe.HoldingAmfUe = amfUe } else if regReqType != nasMessage.RegistrationType5GSInitialRegistration { if regReqType == nasMessage.RegistrationType5GSPeriodicRegistrationUpdating || regReqType == nasMessage.RegistrationType5GSMobilityRegistrationUpdating {