Skip to content
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

Fix bad handling of PFD Content IE #106

Merged
merged 2 commits into from
Oct 18, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
17 changes: 10 additions & 7 deletions ie/pfd-contents.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ func NewPFDContentsFields(fd, url, dn, cp, dnp string, afd, aurl, adnp []string)
f.SetDNPFlag()
}

if afd != nil {
if len(afd) > 0 {
l := 0
for _, a := range afd {
l += 2 + len([]byte(a))
Expand All @@ -123,7 +123,7 @@ func NewPFDContentsFields(fd, url, dn, cp, dnp string, afd, aurl, adnp []string)
f.SetAFDFlag()
}

if aurl != nil {
if len(aurl) > 0 {
l := 0
for _, a := range aurl {
l += 2 + len([]byte(a))
Expand All @@ -134,7 +134,7 @@ func NewPFDContentsFields(fd, url, dn, cp, dnp string, afd, aurl, adnp []string)
f.SetAURLFlag()
}

if adnp != nil {
if len(adnp) > 0 {
l := 0
for _, a := range adnp {
l += 2 + len([]byte(a))
Expand Down Expand Up @@ -240,7 +240,7 @@ func ParsePFDContentsFields(b []byte) (*PFDContentsFields, error) {
// UnmarshalBinary parses b into IE.
func (f *PFDContentsFields) UnmarshalBinary(b []byte) error {
l := len(b)
if l < 3 {
if l < 2 {
return io.ErrUnexpectedEOF
}

Expand Down Expand Up @@ -293,7 +293,7 @@ func (f *PFDContentsFields) UnmarshalBinary(b []byte) error {
}

if f.HasAFD() {
if len(b[offset:]) < offset+2+int(f.AFDLength) {
if len(b[offset:]) < 2+int(f.AFDLength) {
return io.ErrUnexpectedEOF
}
f.AFDLength = binary.BigEndian.Uint16(b[offset : offset+2])
Expand All @@ -309,12 +309,13 @@ func (f *PFDContentsFields) UnmarshalBinary(b []byte) error {
break
}
f.AdditionalFlowDescription = append(f.AdditionalFlowDescription, string(p[o+2:o+2+int(l)]))
o += 2 + int(l)
}
offset += 2 + int(f.AFDLength)
}

if f.HasAURL() {
if len(b[offset:]) < offset+2+int(f.AURLLength) {
if len(b[offset:]) < 2+int(f.AURLLength) {
return io.ErrUnexpectedEOF
}
f.AURLLength = binary.BigEndian.Uint16(b[offset : offset+2])
Expand All @@ -330,12 +331,13 @@ func (f *PFDContentsFields) UnmarshalBinary(b []byte) error {
break
}
f.AdditionalURL = append(f.AdditionalURL, string(p[o+2:o+2+int(l)]))
o += 2 + int(l)
}
offset += 2 + int(f.AURLLength)
}

if f.HasADNP() {
if len(b[offset:]) < offset+2+int(f.ADNPLength) {
if len(b[offset:]) < 2+int(f.ADNPLength) {
return io.ErrUnexpectedEOF
}
f.ADNPLength = binary.BigEndian.Uint16(b[offset : offset+2])
Expand All @@ -351,6 +353,7 @@ func (f *PFDContentsFields) UnmarshalBinary(b []byte) error {
break
}
f.AdditionalDomainNameAndProtocol = append(f.AdditionalDomainNameAndProtocol, string(p[o+2:o+2+int(l)]))
o += 2 + int(l)
}
}

Expand Down
111 changes: 111 additions & 0 deletions message/pfd-management-request_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,64 @@ import (
func TestPFDManagementRequest(t *testing.T) {
cases := []testutil.TestCase{
{
Description: "Empty PFDContent",
Structured: message.NewPFDManagementRequest(seq,
ie.NewApplicationIDsPFDs(
ie.NewApplicationID("https://github.com/wmnsk/go-pfcp/"),
ie.NewPFDContext(
ie.NewPFDContents("", "", "", "", "", []string{}, []string{}, []string{}),
),
),
),
Serialized: []byte{
0x20, 0x03, // Flag + MsgType: PFCP PFD Mgmt Req
0x00, 0x37, // Msg Len
0x11, 0x22, 0x33, 0x00, // Seq Num + 1 byte spare
0x00, 0x3a, // IE type: Application ID's PFDs (58)
0x00, 0x2f, // IE Len
// ApplicationID
0x00, 0x18, // IE Type: Application ID
0x00, 0x21, // IE Len
0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x77, 0x6d, 0x6e, 0x73, 0x6b, 0x2f, 0x67, 0x6f, 0x2d, 0x70, 0x66, 0x63, 0x70, 0x2f,
// PFD Context
0x00, 0x3b, // IE type: PFD Context
0x00, 0x06, // IE Len
0x00, 0x3d, // IE type: PFD Content
0x00, 0x02, // IE Len
0x00, 0x00, // Flag (0x00, no FD, no CP, no DN, ... nothing) + Spare
},
}, {
Description: "Empty PFDContent + NodeID",
Structured: message.NewPFDManagementRequest(seq,
ie.NewApplicationIDsPFDs(
ie.NewApplicationID("te5t@pp"),
ie.NewPFDContext(
ie.NewPFDContents("", "", "", "", "", []string{}, []string{}, []string{}),
),
),
ie.NewNodeID("172.16.41.51", "", ""),
),
Serialized: []byte{
0x20, 0x03, // Flag + MsgType: PFCP PFD Mgmt Req
0x00, 0x26, // Msg Len
0x11, 0x22, 0x33, 0x00, // Seq Num + 1 byte spare
0x00, 0x3a, // IE type: Application ID's PFDs (58)
0x00, 0x15, // IE Len
// ApplicationID
0x00, 0x18, // IE Type: Application ID
0x00, 0x07, // IE Len
0x74, 0x65, 0x35, 0x74, 0x40, 0x70, 0x70, // te5t@pp
// PFD Context
0x00, 0x3b, // IE type: PFD Context
0x00, 0x06, // IE Len
0x00, 0x3d, // IE type: PFD Content
0x00, 0x02, // IE Len
0x00, 0x00, // Flag (0x00, no FD, no CP, no DN, ... nothing) + Spare
0x00, 0x3c, // IE Type: Node ID
0x00, 0x05, 0x00, // IE Len + 1 byte spare
0xac, 0x10, 0x29, 0x33,
},
}, {
Description: "Single IE",
Structured: message.NewPFDManagementRequest(seq,
ie.NewApplicationIDsPFDs(
Expand Down Expand Up @@ -92,6 +150,59 @@ func TestPFDManagementRequest(t *testing.T) {
0x00, 0x08, 0x00, 0x02, 0x33, 0x33, 0x00, 0x02, 0x34, 0x34, // AURL
0x00, 0x08, 0x00, 0x02, 0x35, 0x35, 0x00, 0x02, 0x36, 0x36, // ADNP
},
}, {
Description: "PFDContent(FD + AFD) + NodeID",
Structured: message.NewPFDManagementRequest(seq,
ie.NewApplicationIDsPFDs(
ie.NewApplicationID("te5t@pp"),
ie.NewPFDContext(
ie.NewPFDContents("permit out ip from 172.16.61.0/24 to 10.62.0.7",
"", "", "", "",
[]string{"permit in ip from 10.62.0.7 to 172.16.61.0/24"},
[]string{}, nil),
),
),
ie.NewNodeID("172.16.41.51", "", ""),
),
Serialized: []byte{
0x20, 0x03, // Flag + MsgType: PFCP PFD Mgmt Req
0x00, 0x87, // Len
0x11, 0x22, 0x33, 0x00, // 3 bytes Seq number + 1 byte spare
0x00, 0x3a, // IE type: Application ID's PFDs (58)
0x00, 0x76, // IE Len
// Application ID
0x00, 0x18, // IE type: Application ID
0x00, 0x07, // IE Len
0x74, 0x65, 0x35, 0x74, 0x40, 0x70, 0x70, // Application ID: te5t@pp
// PFD Context
0x00, 0x3b, // IE type: PFD Context
0x00, 0x67, // IE Len
// PFD Content
0x00, 0x3d, // IE type: PFD Content
0x00, 0x63, // IE Len
0x21, 0x00, // Flag (Flow Desc 0x01 + Additional Flow Desc 0x20) + Spare
0x00, 0x2e, // Len(Flow Description)
// Flow Description
0x70, 0x65, 0x72, 0x6d, 0x69, 0x74, 0x20, 0x6f,
0x75, 0x74, 0x20, 0x69, 0x70, 0x20, 0x66, 0x72,
0x6f, 0x6d, 0x20, 0x31, 0x37, 0x32, 0x2e, 0x31,
0x36, 0x2e, 0x36, 0x31, 0x2e, 0x30, 0x2f, 0x32,
0x34, 0x20, 0x74, 0x6f, 0x20, 0x31, 0x30, 0x2e,
0x36, 0x32, 0x2e, 0x30, 0x2e, 0x37,
// Additional Flow Description
0x00, 0x2f, // Len(Additional Flow Description)
0x00, 0x2d, // Len(Flow Description)
0x70, 0x65, 0x72, 0x6d, 0x69, 0x74, 0x20, 0x69,
0x6e, 0x20, 0x69, 0x70, 0x20, 0x66, 0x72, 0x6f,
0x6d, 0x20, 0x31, 0x30, 0x2e, 0x36, 0x32, 0x2e,
0x30, 0x2e, 0x37, 0x20, 0x74, 0x6f, 0x20, 0x31,
0x37, 0x32, 0x2e, 0x31, 0x36, 0x2e, 0x36, 0x31,
0x2e, 0x30, 0x2f, 0x32, 0x34,
// Node ID
0x00, 0x3c, // IE Type: Node ID
0x00, 0x05, 0x00, // IE Len + spare
0xac, 0x10, 0x29, 0x33, // Node ID: 172.16.41.51
},
},
}

Expand Down