smf

package
v0.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 19, 2026 License: MIT Imports: 15 Imported by: 0

Documentation

Index

Constants

View Source
const (
	FteidTypeIPv4                  = 0x01
	UEIpAddrTypeIPv4Source         = 0x02
	UEIpAddrTypeIPv4Destination    = 0x02 | 0x04 // S/D Flag = 1
	OuterHeaderRemoveGtpuUdpIpv4   = 0x00
	ApplyActionForw                = 0x02
	OuterHeaderCreationGtpuUdpIpv4 = 0x0100
)

PFCP Constants

Variables

View Source
var (
	ErrDnnNotFound        = errors.New("DNN not found")
	ErrPDUSessionNotFound = errors.New("PDU Session not found")
	ErrAreaNotFound       = errors.New("RAN Area not found for this gNB")
	ErrPathNotFound       = errors.New("path not found for this RAN Area")

	ErrUpfNotAssociated    = errors.New("UPF not associated")
	ErrUpfNotFound         = errors.New("UPF not found")
	ErrInterfaceNotFound   = errors.New("interface not found")
	ErrNoPFCPRule          = errors.New("no PFCP rule to push")
	ErrNoIpAvailableInPool = errors.New("no IP address available in pool")

	ErrSmfNotStarted     = errors.New("SMF not started")
	ErrSmfAlreadyStarted = errors.New("SMF already started")
)

Functions

func NewUpfInterfaceMap

func NewUpfInterfaceMap(ifaces []config.Interface) map[netip.Addr]*UpfInterface

Types

type AreasMap added in v0.0.5

type AreasMap struct {
	// contains filtered or unexported fields
}

func NewAreasMap added in v0.0.5

func NewAreasMap(areas map[config.AreaName]config.Area) AreasMap

func (AreasMap) Area added in v0.0.5

func (a AreasMap) Area(gnb jsonapi.ControlURI) (config.AreaName, bool)

func (AreasMap) Contains added in v0.0.5

func (a AreasMap) Contains(areaName config.AreaName, gnb jsonapi.ControlURI) bool

type PduSessionN3

type PduSessionN3 struct {
	UeIpAddr      netip.Addr
	UplinkFteid   *jsonapi.Fteid
	DownlinkFteid *jsonapi.Fteid

	// Handover
	NextDownlinkFteid          *jsonapi.Fteid
	DlFarId                    uint32
	IndirectForwardingRequired bool
}

type Pfcprules

type Pfcprules struct {
	sync.Mutex
	// contains filtered or unexported fields
}

func NewPfcpRules

func NewPfcpRules() *Pfcprules

type Sessions added in v0.0.3

type Sessions struct {
	// contains filtered or unexported fields
}

type SessionsMap

type SessionsMap struct {
	sync.RWMutex
	// contains filtered or unexported fields
}

func NewSessionsMap added in v0.0.3

func NewSessionsMap() *SessionsMap

func (*SessionsMap) Add added in v0.0.3

func (s *SessionsMap) Add(ueCtrl jsonapi.ControlURI, session *PduSessionN3)

func (*SessionsMap) Get added in v0.0.3

func (s *SessionsMap) Get(ueCtrl jsonapi.ControlURI, ueAddr netip.Addr) (*PduSessionN3, error)

func (*SessionsMap) GetIndirectForwardingRequired added in v0.0.7

func (s *SessionsMap) GetIndirectForwardingRequired(ueCtrl jsonapi.ControlURI, ueAddr netip.Addr) (bool, error)

func (*SessionsMap) GetNextDownlinkFteid added in v0.0.7

func (s *SessionsMap) GetNextDownlinkFteid(ueCtrl jsonapi.ControlURI, ueAddr netip.Addr) (*jsonapi.Fteid, error)

func (*SessionsMap) SetIndirectForwardingRequired added in v0.0.7

func (s *SessionsMap) SetIndirectForwardingRequired(ueCtrl jsonapi.ControlURI, ueAddr netip.Addr, value bool) error

func (*SessionsMap) SetNextDownlinkFteid added in v0.0.3

func (s *SessionsMap) SetNextDownlinkFteid(ueCtrl jsonapi.ControlURI, ueAddr netip.Addr, fteid *jsonapi.Fteid) error

func (*SessionsMap) SetUplinkFteid added in v0.0.7

func (s *SessionsMap) SetUplinkFteid(ueCtrl jsonapi.ControlURI, ueAddr netip.Addr, fteid *jsonapi.Fteid) error

type Slice

type Slice struct {
	Upfs []netip.Addr
	Pool *UeIpPool

	Paths map[config.AreaName][]config.GTPInterface
	// contains filtered or unexported fields
}

func NewSlice

func NewSlice(pool netip.Prefix, upfs []netip.Addr, paths map[config.AreaName][]config.GTPInterface) *Slice

type SlicesMap

type SlicesMap struct {
	sync.Map // slice name: Slice
}

func NewSlicesMap

func NewSlicesMap(slices map[config.SliceName]config.Slice, areas map[config.AreaName]config.Area) *SlicesMap

type Smf

type Smf struct {
	common.WithContext

	Areas AreasMap
	// contains filtered or unexported fields
}

func NewSmf

func NewSmf(addr netip.Addr, slices map[config.SliceName]config.Slice, areas map[config.AreaName]config.Area) *Smf
func (smf *Smf) CreateSessionDownlink(ctx context.Context, ueCtrl jsonapi.ControlURI, ueIp netip.Addr, dnn config.SliceName, gnbCtrl jsonapi.ControlURI, gnbFteid jsonapi.Fteid, precedence uint32) (*PduSessionN3, error)

func (*Smf) CreateSessionDownlinkFWUpfI added in v0.1.0

func (smf *Smf) CreateSessionDownlinkFWUpfI(ctx context.Context, ueCtrl jsonapi.ControlURI, ueIp netip.Addr, dnn config.SliceName, fwUpfi *config.GTPInterface, DlFteid jsonapi.Fteid) (*jsonapi.Fteid, error)
func (smf *Smf) CreateSessionUplink(ctx context.Context, ueCtrl jsonapi.ControlURI, ueIpAddr netip.Addr, gnbCtrl jsonapi.ControlURI, dnn config.SliceName) (*PduSessionN3, error)

func (*Smf) GetNextDownlinkFteid added in v0.0.7

func (smf *Smf) GetNextDownlinkFteid(ueCtrl jsonapi.ControlURI, ueAddr netip.Addr, dnn config.SliceName) (*jsonapi.Fteid, error)

func (*Smf) GetNextUeIpAddr added in v0.0.7

func (smf *Smf) GetNextUeIpAddr(dnn config.SliceName) (netip.Addr, error)

func (*Smf) GetSessionDownlinkFteid added in v0.0.3

func (smf *Smf) GetSessionDownlinkFteid(ueCtrl jsonapi.ControlURI, ueAddr netip.Addr, dnn config.SliceName) (*jsonapi.Fteid, error)

func (*Smf) GetSessionIndirectForwardingRequired added in v0.0.7

func (smf *Smf) GetSessionIndirectForwardingRequired(ueCtrl jsonapi.ControlURI, ueAddr netip.Addr, dnn config.SliceName) (bool, error)

func (*Smf) GetSessionUplinkFteid added in v0.0.3

func (smf *Smf) GetSessionUplinkFteid(ueCtrl jsonapi.ControlURI, ueAddr netip.Addr, dnn config.SliceName) (*jsonapi.Fteid, error)

func (*Smf) SessionFirstUpf added in v0.0.7

func (smf *Smf) SessionFirstUpf(ueCtrl jsonapi.ControlURI, ueIp netip.Addr, dnn config.SliceName, gnbCtrl jsonapi.ControlURI) (*config.GTPInterface, error)

func (*Smf) SetSessionIndirectForwardingRequired added in v0.0.7

func (smf *Smf) SetSessionIndirectForwardingRequired(ueCtrl jsonapi.ControlURI, ueAddr netip.Addr, dnn config.SliceName, value bool) error

func (*Smf) Start

func (smf *Smf) Start(ctx context.Context) error

func (*Smf) StoreNextDownlinkFteid added in v0.0.3

func (smf *Smf) StoreNextDownlinkFteid(ueCtrl jsonapi.ControlURI, ueAddr netip.Addr, dnn config.SliceName, fteid *jsonapi.Fteid) error
func (smf *Smf) UpdateSessionDownlink(ctx context.Context, ueCtrl jsonapi.ControlURI, ueAddr netip.Addr, dnn config.SliceName, oldGnbCtrl jsonapi.ControlURI) error

Updates Session to NextDownlinkFteid

func (smf *Smf) UpdateSessionUplink(ctx context.Context, ueCtrl jsonapi.ControlURI, ueIpAddr netip.Addr, gnbCtrl jsonapi.ControlURI, dnn config.SliceName) (*PduSessionN3, error)

func (*Smf) WaitShutdown

func (smf *Smf) WaitShutdown(ctx context.Context) error

type TEID added in v0.1.0

type TEID uint32 // TODO: replace with `type TEID = jsonapi.TEID`

type TEIDsPool

type TEIDsPool struct {
	// contains filtered or unexported fields
}

TEIDsPool allows to generate and maintain TEIDs.

func NewTEIDsPool

func NewTEIDsPool() *TEIDsPool

NewTEIDsPool creates a TEIDsPool.

func (*TEIDsPool) Next

func (t *TEIDsPool) Next(ctx context.Context) (TEID, error)

Next provides a new random, but unused, TEID from the pool. It may hang if there is no more available TEID within the pool (until a TEID is released, or the context is done). TEIDs are generated at random, so it will take more time if a lot of TEIDs are already used. Current number of TEIDs Available/In use can be checked with `TEIDsAvailable()` / `TEIDsInUse()` and the SMF should consider using another UPF if number of TEIDsAvailable is too low.

func (*TEIDsPool) Release added in v0.1.0

func (t *TEIDsPool) Release(ctx context.Context, teid TEID) error

Release releases a TEID into the pool of available TEIDs.

func (*TEIDsPool) TEIDsAvailable added in v0.1.0

func (t *TEIDsPool) TEIDsAvailable() int

func (*TEIDsPool) TEIDsInUse added in v0.1.0

func (t *TEIDsPool) TEIDsInUse() int

type UeIpPool

type UeIpPool struct {
	// contains filtered or unexported fields
}

func NewUeIpPool

func NewUeIpPool(pool netip.Prefix) *UeIpPool

func (*UeIpPool) Next

func (p *UeIpPool) Next() (netip.Addr, error)

type Upf

type Upf struct {
	common.WithContext
	// contains filtered or unexported fields
}

func NewUpf

func NewUpf(interfaces []config.Interface) *Upf

func (*Upf) Associate

func (upf *Upf) Associate(ctx context.Context, a pfcpapi.PFCPAssociationInterface)

func (*Upf) CreateSession

func (upf *Upf) CreateSession(ue netip.Addr) error

func (*Upf) CreateUplinkAnchor

func (upf *Upf) CreateUplinkAnchor(ctx context.Context, ueIp netip.Addr, dnn config.SliceName, listenInterface netip.Addr, precedence uint32) (*jsonapi.Fteid, error)

func (*Upf) CreateUplinkAnchorWithFteid

func (upf *Upf) CreateUplinkAnchorWithFteid(ueIp netip.Addr, dnn config.SliceName, listenFteid *jsonapi.Fteid, precedence uint32)

func (*Upf) CreateUplinkIntermediate

func (upf *Upf) CreateUplinkIntermediate(ctx context.Context, ueIp netip.Addr, dnn config.SliceName, listenInterface netip.Addr, forwardFteid *jsonapi.Fteid) (*jsonapi.Fteid, error)

func (*Upf) CreateUplinkIntermediateWithFteid

func (upf *Upf) CreateUplinkIntermediateWithFteid(ueIp netip.Addr, dnn config.SliceName, listenFteid *jsonapi.Fteid, forwardFteid *jsonapi.Fteid)

func (*Upf) Rules

func (upf *Upf) Rules(ueIp netip.Addr) *Pfcprules

func (*Upf) UpdateDownlinkAnchor

func (upf *Upf) UpdateDownlinkAnchor(ueIp netip.Addr, dnn config.SliceName, forwardFteid *jsonapi.Fteid, precedence uint32) uint32

func (*Upf) UpdateDownlinkIntermediate

func (upf *Upf) UpdateDownlinkIntermediate(ctx context.Context, ueIp netip.Addr, dnn config.SliceName, listenInterface netip.Addr, forwardFteid *jsonapi.Fteid, precedence uint32) (*jsonapi.Fteid, uint32, error)

func (*Upf) UpdateDownlinkIntermediateDirectForward added in v0.0.3

func (upf *Upf) UpdateDownlinkIntermediateDirectForward(ueIp netip.Addr, dnn config.SliceName, farid uint32, fteid *jsonapi.Fteid)

func (*Upf) UpdateDownlinkIntermediateWithFteid

func (upf *Upf) UpdateDownlinkIntermediateWithFteid(ueIp netip.Addr, dnn config.SliceName, listenFteid *jsonapi.Fteid, forwardFteid *jsonapi.Fteid, precedence uint32) uint32

func (*Upf) UpdateSession

func (upf *Upf) UpdateSession(ue netip.Addr) error

type UpfInterface

type UpfInterface struct {
	Teids *TEIDsPool
	Types []string
}

func NewUpfInterface

func NewUpfInterface(t string) *UpfInterface

func (*UpfInterface) IsN3

func (iface *UpfInterface) IsN3() bool

func (*UpfInterface) IsN9

func (iface *UpfInterface) IsN9() bool

type UpfsMap

type UpfsMap struct {
	sync.Map
}

func NewUpfsMap

func NewUpfsMap(slices map[config.SliceName]config.Slice) *UpfsMap

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL