Skip to content
This repository was archived by the owner on Oct 20, 2024. It is now read-only.

Commit 797353b

Browse files
authored
feat: Adds PDI UE IP address (#38)
1 parent 51c4b26 commit 797353b

File tree

9 files changed

+922
-43
lines changed

9 files changed

+922
-43
lines changed

ie/create_pdr_test.go

Lines changed: 115 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,23 @@ func TestGivenCorrectParametersWhenNewCreatePDRThenFieldsSetCorrectly(t *testing
1414
}
1515

1616
precedence, err := ie.NewPrecedence(1)
17-
1817
if err != nil {
1918
t.Fatalf("Error creating Precedence: %v", err)
2019
}
2120

2221
sourceInterface, err := ie.NewSourceInterface(1)
23-
2422
if err != nil {
2523
t.Fatalf("Error creating SourceInterface: %v", err)
2624
}
2725

28-
pdi, err := ie.NewPDI(sourceInterface)
26+
sd := ie.SourceDestination{}
27+
ipv6DelegationBits := uint8(32)
28+
ueIPAddress, err := ie.NewUEIPAddress("", "", sd, ipv6DelegationBits, 0, false, true)
29+
if err != nil {
30+
t.Fatalf("Expected no error, got %v", err)
31+
}
2932

33+
pdi, err := ie.NewPDI(sourceInterface, ueIPAddress)
3034
if err != nil {
3135
t.Fatalf("Error creating PDI: %v", err)
3236
}
@@ -41,8 +45,8 @@ func TestGivenCorrectParametersWhenNewCreatePDRThenFieldsSetCorrectly(t *testing
4145
t.Errorf("Expected CreatePDR IEType 1, got %d", createPDR.Header.Type)
4246
}
4347

44-
if createPDR.Header.Length != 23 {
45-
t.Errorf("Expected CreatePDR length 23, got %d", createPDR.Header.Length)
48+
if createPDR.Header.Length != 29 {
49+
t.Errorf("Expected CreatePDR length 29, got %d", createPDR.Header.Length)
4650
}
4751

4852
if createPDR.PDRID != pdrID {
@@ -53,8 +57,52 @@ func TestGivenCorrectParametersWhenNewCreatePDRThenFieldsSetCorrectly(t *testing
5357
t.Errorf("Expected CreatePDR Precedence %v, got %v", precedence, createPDR.Precedence)
5458
}
5559

56-
if createPDR.PDI != pdi {
57-
t.Errorf("Expected CreatePDR PDI %v, got %v", pdi, createPDR.PDI)
60+
if createPDR.PDI.SourceInterface != pdi.SourceInterface {
61+
t.Errorf("Expected CreatePDR PDI SourceInterface %v, got %v", pdi.SourceInterface, createPDR.PDI.SourceInterface)
62+
}
63+
64+
if createPDR.PDI.UEIPAddress.IP6PL != false {
65+
t.Errorf("Expected CreatePDR PDI UEIPAddress IP6PL false, got %v", createPDR.PDI.UEIPAddress.IP6PL)
66+
}
67+
68+
if createPDR.PDI.UEIPAddress.CHV6 != true {
69+
t.Errorf("Expected CreatePDR PDI UEIPAddress CHV6 true, got %v", createPDR.PDI.UEIPAddress.CHV6)
70+
}
71+
72+
if createPDR.PDI.UEIPAddress.CHV4 != false {
73+
t.Errorf("Expected CreatePDR PDI UEIPAddress CHV4 false, got %v", createPDR.PDI.UEIPAddress.CHV4)
74+
}
75+
76+
if createPDR.PDI.UEIPAddress.IPv6D != true {
77+
t.Errorf("Expected CreatePDR PDI UEIPAddress IPv6D true, got %v", createPDR.PDI.UEIPAddress.IPv6D)
78+
}
79+
80+
if createPDR.PDI.UEIPAddress.SD != false {
81+
t.Errorf("Expected CreatePDR PDI UEIPAddress SD false, got %v", createPDR.PDI.UEIPAddress.SD)
82+
}
83+
84+
if createPDR.PDI.UEIPAddress.V4 != false {
85+
t.Errorf("Expected CreatePDR PDI UEIPAddress V4 false, got %v", createPDR.PDI.UEIPAddress.V4)
86+
}
87+
88+
if createPDR.PDI.UEIPAddress.V6 != false {
89+
t.Errorf("Expected CreatePDR PDI UEIPAddress V6 false, got %v", createPDR.PDI.UEIPAddress.V6)
90+
}
91+
92+
if createPDR.PDI.UEIPAddress.IPv4Address != nil {
93+
t.Errorf("Expected CreatePDR PDI UEIPAddress IPv4Address nil, got %v", createPDR.PDI.UEIPAddress.IPv4Address)
94+
}
95+
96+
if createPDR.PDI.UEIPAddress.IPv6Address != nil {
97+
t.Errorf("Expected CreatePDR PDI UEIPAddress IPv6Address nil, got %v", createPDR.PDI.UEIPAddress.IPv6Address)
98+
}
99+
100+
if createPDR.PDI.UEIPAddress.IPv6PrefixDelegationBits != ipv6DelegationBits {
101+
t.Errorf("Expected CreatePDR PDI UEIPAddress IPv6PrefixDelegationBits %d, got %d", ipv6DelegationBits, createPDR.PDI.UEIPAddress.IPv6PrefixDelegationBits)
102+
}
103+
104+
if createPDR.PDI.UEIPAddress.IPv6PrefixLength != 0 {
105+
t.Errorf("Expected CreatePDR PDI UEIPAddress IPv6PrefixLength 0, got %d", createPDR.PDI.UEIPAddress.IPv6PrefixLength)
58106
}
59107
}
60108

@@ -71,8 +119,19 @@ func TestGivenSerializedWhenDeserializeCreatePDRThenFieldsSetCorrectly(t *testin
71119
t.Fatalf("Error creating Precedence: %v", err)
72120
}
73121

74-
sourceInterface, _ := ie.NewSourceInterface(1)
75-
pdi, err := ie.NewPDI(sourceInterface)
122+
sourceInterface, err := ie.NewSourceInterface(1)
123+
if err != nil {
124+
t.Fatalf("Error creating SourceInterface: %v", err)
125+
}
126+
127+
sd := ie.SourceDestination{}
128+
ipv6DelegationBits := uint8(32)
129+
ueIPAddress, err := ie.NewUEIPAddress("", "", sd, ipv6DelegationBits, 0, false, true)
130+
if err != nil {
131+
t.Fatalf("Expected no error, got %v", err)
132+
}
133+
134+
pdi, err := ie.NewPDI(sourceInterface, ueIPAddress)
76135

77136
if err != nil {
78137
t.Fatalf("Error creating PDI: %v", err)
@@ -113,7 +172,52 @@ func TestGivenSerializedWhenDeserializeCreatePDRThenFieldsSetCorrectly(t *testin
113172
t.Errorf("Expected CreatePDR Precedence %v, got %v", precedence, deserialized.Precedence)
114173
}
115174

116-
if deserialized.PDI != pdi {
117-
t.Errorf("Expected CreatePDR PDI %v, got %v", pdi, deserialized.PDI)
175+
if deserialized.PDI.SourceInterface != pdi.SourceInterface {
176+
t.Errorf("Expected CreatePDR PDI SourceInterface %v, got %v", pdi.SourceInterface, deserialized.PDI.SourceInterface)
177+
}
178+
179+
if deserialized.PDI.UEIPAddress.IP6PL != false {
180+
t.Errorf("Expected CreatePDR PDI UEIPAddress IP6PL false, got %v", deserialized.PDI.UEIPAddress.IP6PL)
181+
}
182+
183+
if deserialized.PDI.UEIPAddress.CHV6 != true {
184+
t.Errorf("Expected CreatePDR PDI UEIPAddress CHV6 %v, got %v", ueIPAddress.CHV6, deserialized.PDI.UEIPAddress.CHV6)
185+
}
186+
187+
if deserialized.PDI.UEIPAddress.CHV4 != false {
188+
t.Errorf("Expected CreatePDR PDI UEIPAddress CHV4 false, got %v", deserialized.PDI.UEIPAddress.CHV4)
189+
}
190+
191+
if deserialized.PDI.UEIPAddress.IPv6D != true {
192+
t.Errorf("Expected CreatePDR PDI UEIPAddress IPv6D true, got %v", deserialized.PDI.UEIPAddress.IPv6D)
193+
}
194+
195+
if deserialized.PDI.UEIPAddress.SD != false {
196+
t.Errorf("Expected CreatePDR PDI UEIPAddress SD false, got %v", deserialized.PDI.UEIPAddress.SD)
197+
}
198+
199+
if deserialized.PDI.UEIPAddress.V4 != false {
200+
t.Errorf("Expected CreatePDR PDI UEIPAddress V4 false, got %v", deserialized.PDI.UEIPAddress.V4)
201+
}
202+
203+
if deserialized.PDI.UEIPAddress.V6 != false {
204+
t.Errorf("Expected CreatePDR PDI UEIPAddress V6 false, got %v", deserialized.PDI.UEIPAddress.V6)
205+
}
206+
207+
if deserialized.PDI.UEIPAddress.IPv4Address != nil {
208+
t.Errorf("Expected CreatePDR PDI UEIPAddress IPv4Address nil, got %v", deserialized.PDI.UEIPAddress.IPv4Address)
118209
}
210+
211+
if deserialized.PDI.UEIPAddress.IPv6Address != nil {
212+
t.Errorf("Expected CreatePDR PDI UEIPAddress IPv6Address nil, got %v", deserialized.PDI.UEIPAddress.IPv6Address)
213+
}
214+
215+
if deserialized.PDI.UEIPAddress.IPv6PrefixDelegationBits != ipv6DelegationBits {
216+
t.Errorf("Expected CreatePDR PDI UEIPAddress IPv6PrefixDelegationBits %d, got %d", ipv6DelegationBits, deserialized.PDI.UEIPAddress.IPv6PrefixDelegationBits)
217+
}
218+
219+
if deserialized.PDI.UEIPAddress.IPv6PrefixLength != 0 {
220+
t.Errorf("Expected CreatePDR PDI UEIPAddress IPv6PrefixLength 0, got %d", deserialized.PDI.UEIPAddress.IPv6PrefixLength)
221+
}
222+
119223
}

ie/ie.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ const (
2020
PDRIDIEType IEType = 56
2121
FSEIDIEType IEType = 57
2222
NodeIDIEType IEType = 60
23+
UEIPAddressIEType IEType = 93
2324
RecoveryTimeStampIEType IEType = 96
2425
NodeReportTypeIEType IEType = 101
2526
FARIDIEType IEType = 108
@@ -90,6 +91,8 @@ func DeserializeInformationElements(b []byte) ([]InformationElement, error) {
9091
ie, err = DeserializeCreateFAR(ieHeader, ieValue)
9192
case ReportTypeIEType:
9293
ie, err = DeserializeReportType(ieHeader, ieValue)
94+
case UEIPAddressIEType:
95+
ie, err = DeserializeUEIPAddress(ieHeader, ieValue)
9396
default:
9497
err = fmt.Errorf("unknown IE type %d", ieHeader.Type)
9598
}

ie/pdi.go

Lines changed: 56 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,20 @@ import (
88

99
type PDI struct {
1010
Header Header
11-
SourceInterface SourceInterface
11+
SourceInterface SourceInterface // Mandatory
12+
UEIPAddress UEIPAddress // Optional
1213
}
1314

14-
func NewPDI(sourceInterface SourceInterface) (PDI, error) {
15+
func NewPDI(sourceInterface SourceInterface, ueIPAddress UEIPAddress) (PDI, error) {
1516
ieHeader := Header{
1617
Type: PDIIEType,
17-
Length: sourceInterface.Header.Length + 4,
18+
Length: sourceInterface.Header.Length + ueIPAddress.Header.Length + 8,
1819
}
1920

2021
return PDI{
2122
Header: ieHeader,
2223
SourceInterface: sourceInterface,
24+
UEIPAddress: ueIPAddress,
2325
}, nil
2426
}
2527

@@ -33,6 +35,12 @@ func (pdi PDI) Serialize() []byte {
3335
serializedSourceInterface := pdi.SourceInterface.Serialize()
3436
buf.Write(serializedSourceInterface)
3537

38+
// Octets (n+1) to (n+m): UE IP Address
39+
if !pdi.UEIPAddress.IsZeroValue() {
40+
serializedUEIPAddress := pdi.UEIPAddress.Serialize()
41+
buf.Write(serializedUEIPAddress)
42+
}
43+
3644
return buf.Bytes()
3745

3846
}
@@ -46,21 +54,52 @@ func DeserializePDI(ieHeader Header, ieValue []byte) (PDI, error) {
4654
return PDI{}, fmt.Errorf("invalid length for PDI: got %d bytes, want at least 1", len(ieValue))
4755
}
4856

49-
sourceInterfaceIELength := ieHeader.Length - HeaderLength
50-
sourceInterfaceIEValue := ieValue[4 : 4+sourceInterfaceIELength]
51-
sourceInterfaceIEType := binary.BigEndian.Uint16(ieValue[:2])
52-
53-
sourceInterfaceHeader := Header{
54-
Type: IEType(sourceInterfaceIEType),
55-
Length: sourceInterfaceIELength,
57+
pdi := PDI{
58+
Header: ieHeader,
59+
SourceInterface: SourceInterface{},
60+
UEIPAddress: UEIPAddress{},
5661
}
57-
sourceInterface, err := DeserializeSourceInterface(sourceInterfaceHeader, sourceInterfaceIEValue)
58-
if err != nil {
59-
return PDI{}, err
62+
63+
index := 0
64+
for index < len(ieValue) {
65+
if index+4 > len(ieValue) {
66+
return PDI{}, fmt.Errorf("slice bounds out of range")
67+
}
68+
69+
currentIEType := binary.BigEndian.Uint16(ieValue[index : index+2])
70+
currentIELength := binary.BigEndian.Uint16(ieValue[index+2 : index+4])
71+
72+
if index+4+int(currentIELength) > len(ieValue) {
73+
return PDI{}, fmt.Errorf("slice bounds out of range")
74+
}
75+
76+
currentIEValue := ieValue[index+4 : index+4+int(currentIELength)]
77+
78+
switch IEType(currentIEType) {
79+
case SourceInterfaceIEType:
80+
sourceInterfaceHeader := Header{
81+
Type: IEType(currentIEType),
82+
Length: currentIELength,
83+
}
84+
sourceInterface, err := DeserializeSourceInterface(sourceInterfaceHeader, currentIEValue)
85+
if err != nil {
86+
return PDI{}, fmt.Errorf("failed to deserialize Source Interface: %v", err)
87+
}
88+
pdi.SourceInterface = sourceInterface
89+
case UEIPAddressIEType:
90+
ueIPAddressHeader := Header{
91+
Type: IEType(currentIEType),
92+
Length: currentIELength,
93+
}
94+
ueIPAddress, err := DeserializeUEIPAddress(ueIPAddressHeader, currentIEValue)
95+
if err != nil {
96+
return PDI{}, fmt.Errorf("failed to deserialize UE IP Address: %v", err)
97+
}
98+
pdi.UEIPAddress = ueIPAddress
99+
}
100+
index += 4 + int(currentIELength)
101+
60102
}
61103

62-
return PDI{
63-
Header: ieHeader,
64-
SourceInterface: sourceInterface,
65-
}, nil
104+
return pdi, nil
66105
}

0 commit comments

Comments
 (0)