From e7ea3f589c4480367283463a4390e7aba215e22d Mon Sep 17 00:00:00 2001 From: Louis Royer Date: Tue, 4 Feb 2025 17:02:07 +0100 Subject: [PATCH] fix: ULCL not working; close #141 --- internal/context/sm_context.go | 35 ++++++++++++++++++++------- internal/sbi/processor/pdu_session.go | 10 ++++++++ 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/internal/context/sm_context.go b/internal/context/sm_context.go index 7097412..cba6e79 100644 --- a/internal/context/sm_context.go +++ b/internal/context/sm_context.go @@ -576,23 +576,43 @@ func (c *SMContext) AllocUeIP() error { return nil } -// This function create a data path to be default data path. -func (c *SMContext) SelectDefaultDataPath() error { +// This function create ULCL data paths. +func (c *SMContext) SelectULCLDataPaths() error { if c.SelectionParam == nil || c.SelectedUPF == nil { - return fmt.Errorf("SelectDefaultDataPath err: SelectionParam or SelectedUPF is nil") + return fmt.Errorf("SelectULCLDataPath err: SelectionParam or SelectedUPF is nil") } - var defaultPath *DataPath if GetSelf().ULCLSupport && CheckUEHasPreConfig(c.Supi) { - c.Log.Infof("Has pre-config default path") + c.Log.Infof("Has pre-config ULCL paths") uePreConfigPaths := GetUEPreConfigPaths(c.Supi, c.SelectedUPF.Name) for _, dp := range uePreConfigPaths.DataPathPool { if !dp.IsDefaultPath { c.Tunnel.AddDataPath(dp) } } + } + return nil +} + +// This function create a data path to be default data path. +func (c *SMContext) SelectDefaultDataPath() error { + if c.SelectionParam == nil || c.SelectedUPF == nil { + return fmt.Errorf("SelectDefaultDataPath err: SelectionParam or SelectedUPF is nil") + } + + defaultPath := c.Tunnel.DataPathPool.GetDefaultPath() + if defaultPath != nil { + // A default path already exists. + // Use this one. + c.Log.Infof("Has default path") + defaultPath = c.Tunnel.DataPathPool.GetDefaultPath() + } else if GetSelf().ULCLSupport && CheckUEHasPreConfig(c.Supi) { + // Fallback on pre-config default path + c.Log.Infof("Has pre-config default path") + uePreConfigPaths := GetUEPreConfigPaths(c.Supi, c.SelectedUPF.Name) defaultPath = uePreConfigPaths.DataPathPool.GetDefaultPath() - } else if c.Tunnel.DataPathPool.GetDefaultPath() == nil { + c.Tunnel.AddDataPath(defaultPath) + } else { // UE has no pre-config path and default path // Use default route c.Log.Infof("Has no pre-config route. Has no default path") @@ -603,9 +623,6 @@ func (c *SMContext) SelectDefaultDataPath() error { defaultPath.IsDefaultPath = true c.Tunnel.AddDataPath(defaultPath) } - } else { - c.Log.Infof("Has no pre-config route. Has default path") - defaultPath = c.Tunnel.DataPathPool.GetDefaultPath() } if defaultPath == nil { diff --git a/internal/sbi/processor/pdu_session.go b/internal/sbi/processor/pdu_session.go index f0ae1be..2d93abd 100644 --- a/internal/sbi/processor/pdu_session.go +++ b/internal/sbi/processor/pdu_session.go @@ -234,6 +234,16 @@ func (p *Processor) HandlePDUSessionSMContextCreate( return } + // SelectULCLDataPaths() will create other paths if ULCL is enabled. + if err = smContext.SelectULCLDataPaths(); err != nil { + smContext.SetState(smf_context.InActive) + smContext.Log.Errorf("PDUSessionSMContextCreate err: %v", err) + p.makeEstRejectResAndReleaseSMContext(c, smContext, + nasMessage.Cause5GSMInsufficientResourcesForSpecificSliceAndDNN, + &smf_errors.InsufficientResourceSliceDnn) + return + } + // generate goroutine to handle PFCP and // reply PDUSessionSMContextCreate rsp immediately needUnlock = false