-
Notifications
You must be signed in to change notification settings - Fork 14
Support for Multiple DNNs per Device Group with a Single UPF #389
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weβll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
Signed-off-by: anaswara <[email protected]>
Signed-off-by: anaswara <[email protected]>
1f0dea8
to
64d5ca6
Compare
@anaswarac-dac, @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 |
Hi @gab-arrobo @anaswarac-dac , we are actively working on the migration. What's left:
We are not modifying the UPF so that could be a good starting point for @anaswarac-dac |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hi @anaswarac-dac ,
- 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?
- 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"` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
IpDomainExpanded []DeviceGroupsIpDomainExpanded `json:"ip-domains,omitempty"` | |
IpDomains []DeviceGroupsIpDomainExpanded `json:"ip-domains,omitempty"` |
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) |
There was a problem hiding this comment.
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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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 { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
for i, ipdomain := range *ipdomains { | |
for i, ipdomain := range ipdomains { |
IpDomainName string `json:"ip-domain-name,omitempty"` | ||
|
||
IpDomainExpanded DeviceGroupsIpDomainExpanded `json:"ip-domain-expanded,omitempty"` |
There was a problem hiding this comment.
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
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 | ||
} |
There was a problem hiding this comment.
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) { |
There was a problem hiding this comment.
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 { |
There was a problem hiding this comment.
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 |
There was a problem hiding this comment.
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) | ||
} |
There was a problem hiding this comment.
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
Closes #257 |
@anaswarac-dac, |
π 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