Skip to content

Commit 1def594

Browse files
committed
feat: Multiple DNN support in single UPF
1 parent 5c6e68b commit 1def594

14 files changed

+594
-371
lines changed

backend/nfconfig/config.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -244,13 +244,15 @@ func extractIpDomains(groupNames []string, deviceGroupMap map[string]configmodel
244244
logger.NfConfigLog.Warnf("Device group %s not found", name)
245245
continue
246246
}
247-
ip := nfConfigApi.NewIpDomain(
248-
dg.IpDomainExpanded.Dnn,
249-
dg.IpDomainExpanded.DnsPrimary,
250-
dg.IpDomainExpanded.UeIpPool,
251-
dg.IpDomainExpanded.Mtu,
252-
)
253-
ipDomains = append(ipDomains, *ip)
247+
for _, ipDomainExp := range dg.IpDomainExpanded {
248+
ip := nfConfigApi.NewIpDomain(
249+
ipDomainExp.Dnn,
250+
ipDomainExp.DnsPrimary,
251+
ipDomainExp.UeIpPool, // Now accessing the correct field from the slice element
252+
ipDomainExp.Mtu,
253+
)
254+
ipDomains = append(ipDomains, *ip)
255+
}
254256
}
255257
return ipDomains
256258
}

backend/nfconfig/config_session_management_test.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,13 @@ type deviceGroupParams struct {
7878

7979
func makeDeviceGroup(p deviceGroupParams) (string, configmodels.DeviceGroups) {
8080
return p.name, configmodels.DeviceGroups{
81-
IpDomainExpanded: configmodels.DeviceGroupsIpDomainExpanded{
82-
Dnn: p.dnn,
83-
DnsPrimary: p.dnsPrimary,
84-
UeIpPool: p.ueIpPool,
85-
Mtu: p.mtu,
81+
IpDomainExpanded: []configmodels.DeviceGroupsIpDomainExpanded{
82+
{
83+
Dnn: p.dnn,
84+
DnsPrimary: p.dnsPrimary,
85+
UeIpPool: p.ueIpPool,
86+
Mtu: p.mtu,
87+
},
8688
},
8789
}
8890
}

configapi/api/configapi.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ components:
124124
ip-domain-name:
125125
example: pool1
126126
type: string
127-
ip-domain-expanded:
127+
ip-domains:
128128
$ref: '#/components/schemas/device_groups_ip_domain_expanded'
129129
type: object
130130
slice:

configapi/api_default_test.go

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -163,33 +163,56 @@ func (m *MockMongoClientFoundNetworkSlice) RestfulAPIGetOne(coll string, filter
163163
}
164164

165165
func deviceGroup(name string) configmodels.DeviceGroups {
166-
traffic_class := configmodels.TrafficClassInfo{
166+
traffic_class1 := configmodels.TrafficClassInfo{
167167
Name: "platinum",
168168
Qci: 8,
169169
Arp: 6,
170170
Pdb: 300,
171171
Pelr: 6,
172172
}
173-
qos := configmodels.DeviceGroupsIpDomainExpandedUeDnnQos{
173+
qos1 := configmodels.DeviceGroupsIpDomainExpandedUeDnnQos{
174174
DnnMbrUplink: 10000000,
175175
DnnMbrDownlink: 10000000,
176176
BitrateUnit: "kbps",
177-
TrafficClass: &traffic_class,
177+
TrafficClass: &traffic_class1,
178178
}
179-
ipdomain := configmodels.DeviceGroupsIpDomainExpanded{
179+
ipdomain1 := configmodels.DeviceGroupsIpDomainExpanded{
180180
Dnn: "internet",
181181
UeIpPool: "172.250.1.0/16",
182182
DnsPrimary: "1.1.1.1",
183183
DnsSecondary: "8.8.8.8",
184184
Mtu: 1460,
185-
UeDnnQos: &qos,
185+
UeDnnQos: &qos1,
186+
}
187+
188+
// Define the second traffic class and QoS
189+
traffic_class2 := configmodels.TrafficClassInfo{
190+
Name: "gold",
191+
Qci: 7,
192+
Arp: 5,
193+
Pdb: 150,
194+
Pelr: 5,
195+
}
196+
qos2 := configmodels.DeviceGroupsIpDomainExpandedUeDnnQos{
197+
DnnMbrUplink: 5000000,
198+
DnnMbrDownlink: 5000000,
199+
BitrateUnit: "kbps",
200+
TrafficClass: &traffic_class2,
201+
}
202+
ipdomain2 := configmodels.DeviceGroupsIpDomainExpanded{
203+
Dnn: "ims",
204+
UeIpPool: "172.248.0.0/16",
205+
DnsPrimary: "4.4.4.4",
206+
DnsSecondary: "8.8.4.4",
207+
Mtu: 1400,
208+
UeDnnQos: &qos2,
186209
}
187210
deviceGroup := configmodels.DeviceGroups{
188211
DeviceGroupName: name,
189212
Imsis: []string{"1234", "5678"},
190213
SiteInfo: "demo",
191214
IpDomainName: "pool1",
192-
IpDomainExpanded: ipdomain,
215+
IpDomainExpanded: []configmodels.DeviceGroupsIpDomainExpanded{ipdomain1, ipdomain2},
193216
}
194217
return deviceGroup
195218
}
@@ -297,7 +320,7 @@ func TestGetDeviceGroupByNameDoesExists(t *testing.T) {
297320
t.Fatalf("failed to read response body: %v", err)
298321
}
299322
body := string(body_bytes)
300-
expected := `{"group-name":"group1","imsis":["1234","5678"],"site-info":"demo","ip-domain-name":"pool1","ip-domain-expanded":{"dnn":"internet","ue-ip-pool":"172.250.1.0/16","dns-primary":"1.1.1.1","dns-secondary":"8.8.8.8","mtu":1460,"ue-dnn-qos":{"dnn-mbr-uplink":10000000,"dnn-mbr-downlink":10000000,"bitrate-unit":"kbps","traffic-class":{"name":"platinum","qci":8,"arp":6,"pdb":300,"pelr":6}}}}`
323+
expected := "{\"group-name\":\"group1\",\"imsis\":[\"1234\",\"5678\"],\"site-info\":\"demo\",\"ip-domain-name\":\"pool1\",\"ip-domains\":[{\"dnn\":\"internet\",\"ue-ip-pool\":\"172.250.1.0/16\",\"dns-primary\":\"1.1.1.1\",\"dns-secondary\":\"8.8.8.8\",\"mtu\":1460,\"ue-dnn-qos\":{\"dnn-mbr-uplink\":10000000,\"dnn-mbr-downlink\":10000000,\"bitrate-unit\":\"kbps\",\"traffic-class\":{\"name\":\"platinum\",\"qci\":8,\"arp\":6,\"pdb\":300,\"pelr\":6}}},{\"dnn\":\"ims\",\"ue-ip-pool\":\"172.248.0.0/16\",\"dns-primary\":\"4.4.4.4\",\"dns-secondary\":\"8.8.4.4\",\"mtu\":1400,\"ue-dnn-qos\":{\"dnn-mbr-uplink\":5000000,\"dnn-mbr-downlink\":5000000,\"bitrate-unit\":\"kbps\",\"traffic-class\":{\"name\":\"gold\",\"qci\":7,\"arp\":5,\"pdb\":150,\"pelr\":5}}}]}"
301324
if body != expected {
302325
t.Errorf("Expected %v, got %v", expected, body)
303326
}

configapi/api_subscriber_config_test.go

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -974,33 +974,56 @@ func TestSubscriberDeleteSuccessWithDeviceGroup(t *testing.T) {
974974
}
975975

976976
func deviceGroupWithImsis(name string, imsis []string) configmodels.DeviceGroups {
977-
trafficClass := configmodels.TrafficClassInfo{
977+
traffic_class1 := configmodels.TrafficClassInfo{
978978
Name: "platinum",
979979
Qci: 8,
980980
Arp: 6,
981981
Pdb: 300,
982982
Pelr: 6,
983983
}
984-
qos := configmodels.DeviceGroupsIpDomainExpandedUeDnnQos{
984+
qos1 := configmodels.DeviceGroupsIpDomainExpandedUeDnnQos{
985985
DnnMbrUplink: 10000000,
986986
DnnMbrDownlink: 10000000,
987987
BitrateUnit: "kbps",
988-
TrafficClass: &trafficClass,
988+
TrafficClass: &traffic_class1,
989989
}
990-
ipDomain := configmodels.DeviceGroupsIpDomainExpanded{
990+
ipdomain1 := configmodels.DeviceGroupsIpDomainExpanded{
991991
Dnn: "internet",
992992
UeIpPool: "172.250.1.0/16",
993993
DnsPrimary: "1.1.1.1",
994994
DnsSecondary: "8.8.8.8",
995995
Mtu: 1460,
996-
UeDnnQos: &qos,
996+
UeDnnQos: &qos1,
997+
}
998+
999+
// Define the second traffic class and QoS
1000+
traffic_class2 := configmodels.TrafficClassInfo{
1001+
Name: "gold",
1002+
Qci: 7,
1003+
Arp: 5,
1004+
Pdb: 150,
1005+
Pelr: 5,
1006+
}
1007+
qos2 := configmodels.DeviceGroupsIpDomainExpandedUeDnnQos{
1008+
DnnMbrUplink: 5000000,
1009+
DnnMbrDownlink: 5000000,
1010+
BitrateUnit: "kbps",
1011+
TrafficClass: &traffic_class2,
1012+
}
1013+
ipdomain2 := configmodels.DeviceGroupsIpDomainExpanded{
1014+
Dnn: "ims",
1015+
UeIpPool: "172.248.0.0/16",
1016+
DnsPrimary: "4.4.4.4",
1017+
DnsSecondary: "8.8.4.4",
1018+
Mtu: 1400,
1019+
UeDnnQos: &qos2,
9971020
}
9981021
deviceGroup := configmodels.DeviceGroups{
9991022
DeviceGroupName: name,
10001023
Imsis: imsis,
10011024
SiteInfo: "demo",
10021025
IpDomainName: "pool1",
1003-
IpDomainExpanded: ipDomain,
1026+
IpDomainExpanded: []configmodels.DeviceGroupsIpDomainExpanded{ipdomain1, ipdomain2},
10041027
}
10051028
return deviceGroup
10061029
}

configapi/device_group_helpers.go

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -89,28 +89,27 @@ func updateDeviceGroupInNetworkSlices(groupName string) error {
8989
func deviceGroupPostHelper(requestDeviceGroup configmodels.DeviceGroups, msgOp int, groupName string) (int, error) {
9090
logger.ConfigLog.Infof("received device group: %s", groupName)
9191

92-
ipdomain := &requestDeviceGroup.IpDomainExpanded
92+
ipdomains := &requestDeviceGroup.IpDomainExpanded
9393
logger.ConfigLog.Infof("imsis.size: %v, Imsis: %s", len(requestDeviceGroup.Imsis), requestDeviceGroup.Imsis)
94-
logger.ConfigLog.Infof("IP Domain Name: %s", requestDeviceGroup.IpDomainName)
95-
logger.ConfigLog.Infof("IP Domain details: %+v", ipdomain)
96-
logger.ConfigLog.Infof("dnn name: %s", ipdomain.Dnn)
97-
logger.ConfigLog.Infof("ue pool: %s", ipdomain.UeIpPool)
98-
logger.ConfigLog.Infof("dns Primary: %s", ipdomain.DnsPrimary)
99-
logger.ConfigLog.Infof("dns Secondary: %s", ipdomain.DnsSecondary)
100-
logger.ConfigLog.Infof("ip mtu: %v", ipdomain.Mtu)
101-
logger.ConfigLog.Infof("device Group Name: %s", groupName)
102-
103-
if ipdomain.UeDnnQos != nil {
104-
ipdomain.UeDnnQos.DnnMbrDownlink = convertToBps(ipdomain.UeDnnQos.DnnMbrDownlink, ipdomain.UeDnnQos.BitrateUnit)
105-
if ipdomain.UeDnnQos.DnnMbrDownlink < 0 {
106-
ipdomain.UeDnnQos.DnnMbrDownlink = math.MaxInt64
107-
}
108-
logger.ConfigLog.Infof("MbrDownLink: %v", ipdomain.UeDnnQos.DnnMbrDownlink)
109-
ipdomain.UeDnnQos.DnnMbrUplink = convertToBps(ipdomain.UeDnnQos.DnnMbrUplink, ipdomain.UeDnnQos.BitrateUnit)
110-
if ipdomain.UeDnnQos.DnnMbrUplink < 0 {
111-
ipdomain.UeDnnQos.DnnMbrUplink = math.MaxInt64
94+
for i, ipdomain := range *ipdomains {
95+
logger.ConfigLog.Infof("IP Domain details [%d]: %+v", i, ipdomain)
96+
logger.ConfigLog.Infof("DNN Name : %v", ipdomain.Dnn)
97+
logger.ConfigLog.Infof("UE Pool : %v", ipdomain.UeIpPool)
98+
logger.ConfigLog.Infof("DNS Primary : %v", ipdomain.DnsPrimary)
99+
logger.ConfigLog.Infof("DNS Secondary : %v", ipdomain.DnsSecondary)
100+
logger.ConfigLog.Infof("IP MTU : %v", ipdomain.Mtu)
101+
if ipdomain.UeDnnQos != nil {
102+
ipdomain.UeDnnQos.DnnMbrDownlink = convertToBps(ipdomain.UeDnnQos.DnnMbrDownlink, ipdomain.UeDnnQos.BitrateUnit)
103+
if ipdomain.UeDnnQos.DnnMbrDownlink < 0 {
104+
ipdomain.UeDnnQos.DnnMbrDownlink = math.MaxInt64
105+
}
106+
logger.ConfigLog.Infof("MBR DownLink : %v", ipdomain.UeDnnQos.DnnMbrDownlink)
107+
ipdomain.UeDnnQos.DnnMbrUplink = convertToBps(ipdomain.UeDnnQos.DnnMbrUplink, ipdomain.UeDnnQos.BitrateUnit)
108+
if ipdomain.UeDnnQos.DnnMbrUplink < 0 {
109+
ipdomain.UeDnnQos.DnnMbrUplink = math.MaxInt64
110+
}
111+
logger.ConfigLog.Infof("MBR UpLink : %v", ipdomain.UeDnnQos.DnnMbrUplink)
112112
}
113-
logger.ConfigLog.Infof("MbrUpLink: %v", ipdomain.UeDnnQos.DnnMbrUplink)
114113
}
115114

116115
prevDevGroup := getDeviceGroupByName(groupName)
@@ -214,18 +213,25 @@ func syncDeviceGroupSubscriber(devGroup *configmodels.DeviceGroups, prevDevGroup
214213
Sst: int32(sVal),
215214
}
216215
var errorOccured bool
216+
dnnMap := make(map[string][]configmodels.DeviceGroupsIpDomainExpandedUeDnnQos)
217217
for _, imsi := range devGroup.Imsis {
218218
/* update all current IMSIs */
219219
subscriberAuthData := DatabaseSubscriberAuthenticationData{}
220220
if subscriberAuthData.SubscriberAuthenticationDataGet("imsi-"+imsi) != nil {
221-
dnn := devGroup.IpDomainExpanded.Dnn
221+
for _, ipDomain := range devGroup.IpDomainExpanded {
222+
dnn := ipDomain.Dnn
223+
224+
// Ensure UeDnnQos is not nil before appending
225+
if ipDomain.UeDnnQos != nil {
226+
dnnMap[dnn] = append(dnnMap[dnn], *ipDomain.UeDnnQos) // Directly append the UeDnnQos
227+
}
228+
}
222229
err = updatePolicyAndProvisionedData(
223230
imsi,
224231
slice.SiteInfo.Plmn.Mcc,
225232
slice.SiteInfo.Plmn.Mnc,
226233
snssai,
227-
dnn,
228-
devGroup.IpDomainExpanded.UeDnnQos,
234+
dnnMap,
229235
)
230236
if err != nil {
231237
logger.DbLog.Errorf("updatePolicyAndProvisionedData failed for IMSI %s: %+v", imsi, err)

configapi/device_group_helpers_test.go

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,12 @@ func Test_handleDeviceGroupPost(t *testing.T) {
6363
deviceGroup("group_no_imsis"), deviceGroup("group_no_traf_class"), deviceGroup("group_no_qos"),
6464
}
6565
deviceGroups[2].Imsis = []string{}
66-
deviceGroups[3].IpDomainExpanded.UeDnnQos.TrafficClass = nil
67-
deviceGroups[4].IpDomainExpanded.UeDnnQos = nil
66+
if len(deviceGroups[3].IpDomainExpanded) > 0 {
67+
deviceGroups[3].IpDomainExpanded[0].UeDnnQos.TrafficClass = nil
68+
}
69+
if len(deviceGroups[4].IpDomainExpanded) > 0 {
70+
deviceGroups[4].IpDomainExpanded[0].UeDnnQos = nil
71+
}
6872
factory.WebUIConfig.Configuration.Mode5G = true
6973

7074
for _, testGroup := range deviceGroups {
@@ -157,9 +161,12 @@ func Test_handleDeviceGroupPost_alreadyExists(t *testing.T) {
157161
deviceGroup("group_no_qos"),
158162
}
159163
deviceGroups[2].Imsis = []string{}
160-
deviceGroups[3].IpDomainExpanded.UeDnnQos.TrafficClass = nil
161-
deviceGroups[4].IpDomainExpanded.UeDnnQos = nil
162-
164+
if len(deviceGroups[3].IpDomainExpanded) > 0 {
165+
deviceGroups[3].IpDomainExpanded[0].UeDnnQos.TrafficClass = nil
166+
}
167+
if len(deviceGroups[4].IpDomainExpanded) > 0 {
168+
deviceGroups[4].IpDomainExpanded[0].UeDnnQos = nil
169+
}
163170
factory.WebUIConfig.Configuration.Mode5G = true
164171

165172
for _, testGroup := range deviceGroups {
@@ -248,25 +255,27 @@ const DEVICE_GROUP_CONFIG = `{
248255
"imsis": [
249256
"string"
250257
],
251-
"ip-domain-expanded": {
252-
"dnn": "string",
253-
"dns-primary": "string",
254-
"dns-secondary": "string",
255-
"mtu": 0,
256-
"ue-dnn-qos": {
257-
"bitrate-unit": "string",
258-
"dnn-mbr-downlink": 0,
259-
"dnn-mbr-uplink": 0,
260-
"traffic-class": {
261-
"arp": 0,
262-
"name": "string",
263-
"pdb": 0,
264-
"pelr": 0,
265-
"qci": 0
266-
}
267-
},
268-
"ue-ip-pool": "string"
269-
},
258+
"ip-domains": [
259+
{
260+
"dnn": "string",
261+
"dns-primary": "string",
262+
"dns-secondary": "string",
263+
"mtu": 0,
264+
"ue-dnn-qos": {
265+
"bitrate-unit": "string",
266+
"dnn-mbr-downlink": 0,
267+
"dnn-mbr-uplink": 0,
268+
"traffic-class": {
269+
"arp": 0,
270+
"name": "string",
271+
"pdb": 0,
272+
"pelr": 0,
273+
"qci": 0
274+
}
275+
},
276+
"ue-ip-pool": "string"
277+
}
278+
],
270279
"ip-domain-name": "string",
271280
"site-info": "string"
272281
}`

0 commit comments

Comments
 (0)