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 {