Skip to content

Conversation

anaswarac-dac
Copy link

πŸ“Œ 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

@gab-arrobo
Copy link
Contributor

@anaswarac-dac,
Similar comment/note as in your UDR PR, we (@gatici, @patriciareinoso, @dariofaccin, @ghislainbourgeois) are in the process of replacing the GRPC communication for the SBI (across the NFs). Some NFs such as udm, udr, nssf, nrf and ausf are already using the REST-based communication instead of the GRPC-based communication. Migration is still pending for the pcf, amf and smf. Currently, the webconsole runs 2 servers (GRPC-based and REST-based) because we are still in the migration process and as soon as the remaining NFs get migrated to REST-based communication, the GRPC server will be removed from the webconsole.

@gatici, @patriciareinoso, @dariofaccin, is it possible that we complete the migration to REST-based such that @anaswarac-dac can enable the multi-DNN support per device group feature/capability based on the latest codebase?

@anaswarac-dac, the REST-based communication relies on the openapi repo (https://github.com/omec-project/openapi/tree/main/nfConfigApi)

@patriciareinoso
Copy link
Contributor

@anaswarac-dac, Similar comment/note as in your UDR PR, we (@gatici, @patriciareinoso, @dariofaccin, @ghislainbourgeois) are in the process of replacing the GRPC communication for the SBI (across the NFs). Some NFs such as udm, udr, nssf, nrf and ausf are already using the REST-based communication instead of the GRPC-based communication. Migration is still pending for the pcf, amf and smf. Currently, the webconsole runs 2 servers (GRPC-based and REST-based) because we are still in the migration process and as soon as the remaining NFs get migrated to REST-based communication, the GRPC server will be removed from the webconsole.

@gatici, @patriciareinoso, @dariofaccin, is it possible that we complete the migration to REST-based such that @anaswarac-dac can enable the multi-DNN support per device group feature/capability based on the latest codebase?

@anaswarac-dac, the REST-based communication relies on the openapi repo (https://github.com/omec-project/openapi/tree/main/nfConfigApi)

Hi @gab-arrobo @anaswarac-dac , we are actively working on the migration. What's left:

  • Webconsole: implementation of 1 endpoint. Good progress. Taken care by @Gmerold
  • SMF: in progress. Taken care by @gatici
  • AMF: just started. Taken care by @dariofaccin
  • PCF: not started yet

We are not modifying the UPF so that could be a good starting point for @anaswarac-dac
The webconsole and SMF are expected to be finished soon.

Copy link
Contributor

@patriciareinoso patriciareinoso left a comment

Choose a reason for hiding this comment

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

Hi @anaswarac-dac ,

  1. I have questions regarding the direction of this implementation:

1.1. In which configuration or to what purpose would we need to have multiple DNNs with different IP pools / QoS for a device group? It means that a subscriber will now be associated to multiple DNNs/ QoS.
When we say "allow the UPF to support multiple DNNs" I would have expected it to be for a configuration like:

  • Network slice A with device group using DNN1, network slice B with device group using DNN2 , both network slices served by the same UPF
  • or maybe, 1 network slice, with 2 device groups, each one using a different DNN

1.2. How will the UE request for multiple DNNs?
1.3. Do you have a specification/document that we can refer to to better understand the implementation of this feature?

  1. Some comments around the code implementation:

2.1. Please run the following command to update the swagger documentation

swag init -g backend/webui_service/swagger_ui_service.go --outputTypes go

2.2. I have some concerns regarding the QoS aggregation. If we want to keep the information of multiple DNNs, why do we need to aggregate the values?

2.3 How are we going to deal with DB migration?

IpDomainName string `json:"ip-domain-name,omitempty"`

IpDomainExpanded DeviceGroupsIpDomainExpanded `json:"ip-domain-expanded,omitempty"`
IpDomainExpanded []DeviceGroupsIpDomainExpanded `json:"ip-domains,omitempty"`
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
IpDomainExpanded []DeviceGroupsIpDomainExpanded `json:"ip-domains,omitempty"`
IpDomains []DeviceGroupsIpDomainExpanded `json:"ip-domains,omitempty"`

Comment on lines +96 to +99
logger.ConfigLog.Infof("DNN Name : %v", ipdomain.Dnn)
logger.ConfigLog.Infof("UE Pool : %v", ipdomain.UeIpPool)
logger.ConfigLog.Infof("DNS Primary : %v", ipdomain.DnsPrimary)
logger.ConfigLog.Infof("DNS Secondary : %v", ipdomain.DnsSecondary)
Copy link
Contributor

Choose a reason for hiding this comment

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

these can stay as %s since they are strings

logger.ConfigLog.Infof("received device group: %s", groupName)

ipdomain := &requestDeviceGroup.IpDomainExpanded
ipdomains := &requestDeviceGroup.IpDomainExpanded
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
ipdomains := &requestDeviceGroup.IpDomainExpanded
ipdomains := requestDeviceGroup.IpDomainExpanded

ipdomain.UeDnnQos.DnnMbrUplink = convertToBps(ipdomain.UeDnnQos.DnnMbrUplink, ipdomain.UeDnnQos.BitrateUnit)
if ipdomain.UeDnnQos.DnnMbrUplink < 0 {
ipdomain.UeDnnQos.DnnMbrUplink = math.MaxInt64
for i, ipdomain := range *ipdomains {
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
for i, ipdomain := range *ipdomains {
for i, ipdomain := range ipdomains {

Comment on lines 24 to -26
IpDomainName string `json:"ip-domain-name,omitempty"`

IpDomainExpanded DeviceGroupsIpDomainExpanded `json:"ip-domain-expanded,omitempty"`
Copy link
Contributor

Choose a reason for hiding this comment

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

it seems to be a mismatch on the struct now, we have 1 ip domain name but multiple ip domains

Comment on lines +250 to +256
for _, ipDomain := range devGroupConfig.IpDomainExpanded {
dnn := ipDomain.Dnn

// Ensure UeDnnQos is not nil before appending
if ipDomain.UeDnnQos != nil {
dnnMap[dnn] = append(dnnMap[dnn], *ipDomain.UeDnnQos) // Directly append the UeDnnQos
}
Copy link
Contributor

Choose a reason for hiding this comment

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

this should be done outside of the devGroupConfig.Imsis loop

return nil
}

func deviceGroupPostHelper(requestDeviceGroup configmodels.DeviceGroups, msgOp int, groupName string) (int, error) {
Copy link
Contributor

Choose a reason for hiding this comment

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

we need to add validation in this function to make sure that the DNN is different than empty string.
Also, should each IP domain should use a different DNN name?
if validation fails, a 400 bad request error should be returned to the user

dg.IpDomainExpanded.Mtu,
)
ipDomains = append(ipDomains, *ip)
for _, ipDomainExp := range dg.IpDomainExpanded {
Copy link
Contributor

Choose a reason for hiding this comment

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

We can no longer preallocate the capacity of ipDomains in line 239

ip := nfConfigApi.NewIpDomain(
ipDomainExp.Dnn,
ipDomainExp.DnsPrimary,
ipDomainExp.UeIpPool, // Now accessing the correct field from the slice element
Copy link
Contributor

Choose a reason for hiding this comment

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

what does this comment mean ?

ipDomainExp.Mtu,
)
ipDomains = append(ipDomains, *ip)
}
Copy link
Contributor

Choose a reason for hiding this comment

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

please add a UT that involves multiple ip-domains in a device group

@gab-arrobo
Copy link
Contributor

Closes #257

@gab-arrobo
Copy link
Contributor

gab-arrobo commented Aug 18, 2025

@anaswarac-dac,
Please resolve conflicts and rebase your PR
Note that the GRPC server was removed (proto directory)

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