Skip to content

Conversation

anaswarac-dac
Copy link
Contributor

πŸ“Œ Description:
This PR introduces support for associating multiple DNNs to a single device group in the 5G Core, enabling flexible and scalable configurations in deployments with a single UPF.

βœ… Key Highlights:
Introduced configuration support for multiple DNNs per IMSI range in the sdcore-5g-values.yml file.

Each DNN can have its own:

IP pool

MTU

DNS

UE QoS profile (including MBR uplink/downlink and traffic class)

Validated end-to-end traffic flow for both ims and internet DNNs over the same UPF.

πŸ“‚ Configuration Changes (in sdcore-5g-values.yml):

βœ… device-groups Section:

ip-domains list now includes multiple DNNs (ims, internet) under a single group (gnbsim-user-group1).
ip-domain-expanded changed to ip-domains
Each DNN is mapped to a different ue-ip-pool and ue-dnn-qos.
device-groups:
- name: "gnbsim-user-group1"
imsis:
- "208930100007487"
- "208930100007488"
- "208930100007489"
- "208930100007490"
- "208930100007491"
- "208930100007492"
- "208930100007493"
- "208930100007494"
- "208930100007495"
- "208930100007496"
ip-domain-name: "pool1"
ip-domains:
- dnn: ims
dns-primary: "8.8.8.8"
mtu: 1400
ue-ip-pool: "172.252.0.0/16"
ue-dnn-qos:
dnn-mbr-downlink: 2400
dnn-mbr-uplink: 1200
bitrate-unit: Kbps
traffic-class:
name: "platinum"
qci: 5
arp: 1
pdb: 100
pelr: 6
- dnn: internet
dns-primary: "10.176.0.11"
mtu: 1460
ue-ip-pool: {{ core.upf.default_upf.ue_ip_pool }}
ue-dnn-qos:
dnn-mbr-downlink: 1000
dnn-mbr-uplink: 1000
bitrate-unit: Mbps
traffic-class:
name: "platinum"
qci: 9
arp: 6
pdb: 300
pelr: 6
site-info: "enterprise"

βœ… Userplane Section:
Defined dnn_list with individual DNNs and their respective ue_ip_pool.
cpiface:
dnn_list:
- dnn: "ims"
ue_ip_pool: "172.252.0.0/16"
- dnn: "internet"
ue_ip_pool: "172.250.0.0/16" # Must match slice DNN
hostname: "upf"
enable_ue_ip_alloc: false

@thakurajayL thakurajayL self-assigned this Aug 2, 2025
@@ -163,12 +164,20 @@ func (i *UPFInterfaceInfo) IP(pduSessType uint8) (net.IP, error) {
}

func (upfSelectionParams *UPFSelectionParams) String() string {
if upfSelectionParams == nil {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@anaswarac-dac - I am curious to know if you found any case where upfSelectionParams was null in this function call. Though this check will not have side effects but I would like to why this input parameter would be null.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@thakurajayL , We haven't encountered a case where upfSelectionParams was nil in this function call. The check was added purely as a precautionary measure to avoid potential nil dereference issues and to assist in debugging, if such a case ever arises.

@@ -223,17 +227,20 @@ func (upi *UserPlaneInformation) GenerateDefaultPath(selection *UPFSelectionPara

func (upi *UserPlaneInformation) selectMatchUPF(selection *UPFSelectionParams) []*UPNode {
upList := make([]*UPNode, 0)

logger.CtxLog.Infof("Selecting matching UPFs for DNNs[%v] and S-NSSAI[sst: %d, sd: %s]", selection.DnnList, selection.SNssai.Sst, selection.SNssai.Sd)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any logging event which is not error and per call should not be at info level. Should stay at debug level

for _, dnn := range selection.DnnList {
if dnnInfo.Dnn == dnn && dnnInfo.ContainsDNAI(selection.Dnai) {
upList = append(upList, upNode)
logger.CtxLog.Infof("Matching UPF found: %v for DNN[%s] and DNAI[%s]", upNode, dnn, selection.Dnai)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Update logging level to debug as suggested in previous comment.

@@ -160,7 +160,7 @@ func TestGenerateDefaultPath(t *testing.T) {
Sst: 1,
Sd: "112232",
},
Dnn: "internet",
DnnList: []string{"internet"},
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would be good if you could add test which coveres multiple DNN.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, we will do this.

@@ -50,7 +50,7 @@ func makeDummyConfig(sst, sd string) *protos.NetworkSliceResponse {

ns.DeviceGroup = make([]*protos.DeviceGroup, 0)
ipDomain := protos.IpDomain{DnnName: "internet", UePool: "60.60.0.0/16", DnsPrimary: "8.8.8.8", Mtu: 1400}
devGrp := protos.DeviceGroup{IpDomainDetails: &ipDomain}
devGrp := protos.DeviceGroup{IpDomainDetails: []*protos.IpDomain{&ipDomain}}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would suggest add one more additional testcase to cover 2 DNNs.

@@ -23,6 +22,8 @@ require (
gopkg.in/yaml.v2 v2.4.0
)

require github.com/5GC-DEV/config5g-cdac v0.2.1 // indirect
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gab-arrobo - this change may not be good right? We should be using omec-project config5g. We can not be using forked version of config5g.

@@ -18,9 +18,9 @@ import (
"syscall"
"time"

grpcClient "github.com/5GC-DEV/config5g-cdac/proto/client"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We will have to port this change once other big change from Canonical team merges.

@gab-arrobo
Copy link
Contributor

@anaswarac-dac,
Please resolve conflict and rebase your PR

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants