diff --git a/conf/upf.jsonc b/conf/upf.jsonc index 2818d2087..4415d63fb 100644 --- a/conf/upf.jsonc +++ b/conf/upf.jsonc @@ -155,7 +155,12 @@ "cpiface": { "peers": ["148.162.12.214"], // [Optional] Below parameters - "dnn": "internet", + "dnn_list": [ + { + "dnn": "internet", + "ue_ip_pool": "10.250.0.0/16" + } + ], "http_port": "8080", "enable_ue_ip_alloc": false, // "use_fqdn": "true", diff --git a/pfcpiface/config.go b/pfcpiface/config.go index 0b8868d37..8a39e316b 100644 --- a/pfcpiface/config.go +++ b/pfcpiface/config.go @@ -86,13 +86,18 @@ type SimModeInfo struct { // CPIfaceInfo : CPIface interface settings. type CPIfaceInfo struct { - Peers []string `json:"peers"` - UseFQDN bool `json:"use_fqdn"` - NodeID string `json:"hostname"` - HTTPPort string `json:"http_port"` - Dnn string `json:"dnn"` - EnableUeIPAlloc bool `json:"enable_ue_ip_alloc"` - UEIPPool string `json:"ue_ip_pool"` + Peers []string `json:"peers"` + UseFQDN bool `json:"use_fqdn"` + NodeID string `json:"hostname"` + HTTPPort string `json:"http_port"` + DnnList []DNNInfo `json:"dnn_list"` + EnableUeIPAlloc bool `json:"enable_ue_ip_alloc"` + UEIPPool string `json:"ue_ip_pool"` +} + +type DNNInfo struct { + DNN string `json:"dnn"` + UEIPPool string `json:"ue_ip_pool"` } // IfaceType : Gateway interface struct. @@ -118,12 +123,12 @@ func validateConf(conf Conf) error { if err != nil { return ErrInvalidArgumentWithReason("conf.P4rtcIface.AccessIP", conf.P4rtcIface.AccessIP, err.Error()) } - - _, _, err = net.ParseCIDR(conf.CPIface.UEIPPool) - if err != nil { - return ErrInvalidArgumentWithReason("conf.UEIPPool", conf.CPIface.UEIPPool, err.Error()) + for _, dnn := range conf.CPIface.DnnList { + _, _, err := net.ParseCIDR(dnn.UEIPPool) + if err != nil { + return ErrInvalidArgumentWithReason("conf.CPIface.DnnList.UEIPPool", dnn.UEIPPool, err.Error()) + } } - if conf.Mode != "" { return ErrInvalidArgumentWithReason("conf.Mode", conf.Mode, "mode must not be set for UP4") } @@ -140,14 +145,14 @@ func validateConf(conf Conf) error { return ErrInvalidArgumentWithReason("conf.Mode", conf.Mode, "invalid mode") } } - if conf.CPIface.EnableUeIPAlloc { - _, _, err := net.ParseCIDR(conf.CPIface.UEIPPool) - if err != nil { - return ErrInvalidArgumentWithReason("conf.UEIPPool", conf.CPIface.UEIPPool, err.Error()) + for _, dnn := range conf.CPIface.DnnList { + _, _, err := net.ParseCIDR(dnn.UEIPPool) + if err != nil { + return ErrInvalidArgumentWithReason("conf.CPIface.DnnList.UEIPPool", dnn.UEIPPool, err.Error()) + } } } - for _, peer := range conf.CPIface.Peers { ip := net.ParseIP(peer) if ip == nil { diff --git a/pfcpiface/fteid.go b/pfcpiface/fteid.go index 8d8c49d44..57dacf6b4 100644 --- a/pfcpiface/fteid.go +++ b/pfcpiface/fteid.go @@ -29,6 +29,9 @@ func NewFTEIDGenerator() *FTEIDGenerator { // Allocate and return an id in range [minValue, maxValue] func (idGenerator *FTEIDGenerator) Allocate() (uint32, error) { + if idGenerator == nil { + return 0, errors.New("FTEIDGenerator is not initialized") + } idGenerator.lock.Lock() defer idGenerator.lock.Unlock() diff --git a/pfcpiface/messages_conn.go b/pfcpiface/messages_conn.go index ebed1366f..657b293ef 100644 --- a/pfcpiface/messages_conn.go +++ b/pfcpiface/messages_conn.go @@ -5,6 +5,7 @@ package pfcpiface import ( "errors" + "strings" "github.com/omec-project/upf-epc/logger" "github.com/wmnsk/go-pfcp/ie" @@ -92,7 +93,7 @@ func (pConn *PFCPConn) handleIncomingResponse(msg message.Message) { func (pConn *PFCPConn) associationIEs() []*ie.IE { upf := pConn.upf - networkInstance := string(ie.NewNetworkInstanceFQDN(upf.dnn).Payload) + networkInstance := string(ie.NewNetworkInstanceFQDN(strings.Join(upf.dnn, ",")).Payload) flags := uint8(0x41) if len(upf.dnn) != 0 { diff --git a/pfcpiface/messages_session.go b/pfcpiface/messages_session.go index f5344f15f..a94266bb5 100644 --- a/pfcpiface/messages_session.go +++ b/pfcpiface/messages_session.go @@ -94,6 +94,10 @@ func (pConn *PFCPConn) handleSessionEstablishmentRequest(msg message.Message) (m if p.UPAllocateFteid { var fteid uint32 + if pConn.upf.fteidGenerator == nil { + logger.PfcpLog.Warnf("fteid is nill") + pConn.upf.fteidGenerator = NewFTEIDGenerator() + } fteid, err = pConn.upf.fteidGenerator.Allocate() if err != nil { return errProcessReply(err, ie.CauseNoResourcesAvailable) diff --git a/pfcpiface/up4.go b/pfcpiface/up4.go index 34fbc2407..72933c297 100644 --- a/pfcpiface/up4.go +++ b/pfcpiface/up4.go @@ -404,7 +404,11 @@ func (up4 *UP4) SetUpfInfo(u *upf, conf *Conf) { logger.PfcpLog.Infof("AccessIP: %v", up4.accessIP) - up4.ueIPPool = MustParseStrIP(conf.CPIface.UEIPPool) + if len(conf.CPIface.DnnList) > 0 { + up4.ueIPPool = MustParseStrIP(conf.CPIface.DnnList[0].UEIPPool) + } else { + logger.PfcpLog.Fatalln("No UE IP pool configured in DnnList") + } logger.PfcpLog.Infof("UE IP pool: %v", up4.ueIPPool) diff --git a/pfcpiface/upf.go b/pfcpiface/upf.go index bba7680a4..ba161c2a2 100644 --- a/pfcpiface/upf.go +++ b/pfcpiface/upf.go @@ -48,7 +48,7 @@ type upf struct { nodeID string ippool *IPPool peers []string - dnn string + dnn []string reportNotifyChan chan uint64 sliceInfo *SliceInfo readTimeout time.Duration @@ -116,6 +116,17 @@ func NewUPF(conf *Conf, fp datapath) *upf { nodeID = hosts[0] } + var dnns []string + var ippoolCidr string + + // Extract DNN names and UEIPPool from the new DnnList structure + for _, dnnInfo := range conf.CPIface.DnnList { + dnns = append(dnns, dnnInfo.DNN) + if ippoolCidr == "" { + ippoolCidr = dnnInfo.UEIPPool + } + } + u := &upf{ enableUeIPAlloc: conf.CPIface.EnableUeIPAlloc, enableEndMarker: conf.EnableEndMarker, @@ -123,10 +134,10 @@ func NewUPF(conf *Conf, fp datapath) *upf { enableGtpuMonitor: conf.EnableGtpuPathMonitoring, accessIface: conf.AccessIface.IfName, coreIface: conf.CoreIface.IfName, - ippoolCidr: conf.CPIface.UEIPPool, + ippoolCidr: ippoolCidr, nodeID: nodeID, datapath: fp, - dnn: conf.CPIface.Dnn, + dnn: dnns, peers: conf.CPIface.Peers, reportNotifyChan: make(chan uint64, 1024), maxReqRetries: conf.MaxReqRetries, diff --git a/ptf/config/upf.jsonc b/ptf/config/upf.jsonc index f6e7490cf..9e150f06c 100644 --- a/ptf/config/upf.jsonc +++ b/ptf/config/upf.jsonc @@ -155,7 +155,12 @@ "cpiface": { "peers": ["148.162.12.214"], // [Optional] Below parameters - "dnn": "internet", + "dnn_list": [ + { + "dnn": "internet", + "ue_ip_pool": "10.250.0.0/16" + } + ], "http_port": "8080", "enable_ue_ip_alloc": false, // "use_fqdn": "true", diff --git a/test/integration/conf.go b/test/integration/conf.go index c1368a278..af22d8425 100644 --- a/test/integration/conf.go +++ b/test/integration/conf.go @@ -57,9 +57,12 @@ func BESSConfigUPFBasedIPAllocation() pfcpiface.Conf { config := BESSConfigDefault() config.CPIface = pfcpiface.CPIfaceInfo{ EnableUeIPAlloc: true, - UEIPPool: UEPoolUPF, + DnnList: []pfcpiface.DNNInfo{ + { + UEIPPool: UEPoolUPF, + }, + }, } - return config } @@ -87,7 +90,11 @@ func UP4ConfigDefault() pfcpiface.Conf { } config.CPIface = pfcpiface.CPIfaceInfo{ - UEIPPool: UEPoolCP, + DnnList: []pfcpiface.DNNInfo{ + { + UEIPPool: UEPoolCP, + }, + }, } return config @@ -97,7 +104,11 @@ func UP4ConfigUPFBasedIPAllocation() pfcpiface.Conf { config := UP4ConfigDefault() config.CPIface = pfcpiface.CPIfaceInfo{ EnableUeIPAlloc: true, - UEIPPool: UEPoolUPF, + DnnList: []pfcpiface.DNNInfo{ + { + UEIPPool: UEPoolUPF, + }, + }, } return config