Skip to content

Commit

Permalink
Merge pull request #58 from ian-cs12-NYCU/fix/missing_created_pdr
Browse files Browse the repository at this point in the history
fix: add CreatedPDR into Session Establishment Response
  • Loading branch information
ianchen0119 authored Oct 11, 2024
2 parents 5709c06 + 2d34ac2 commit 6b73d12
Showing 1 changed file with 67 additions and 4 deletions.
71 changes: 67 additions & 4 deletions internal/pfcp/session.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,11 +76,24 @@ func (s *PfcpServer) handleSessionEstablishmentRequest(
}
}

CreatedPDRList := make([]*ie.IE, 0)

for _, i := range req.CreatePDR {
err = sess.CreatePDR(i)
if err != nil {
sess.log.Errorf("Est CreatePDR error: %+v", err)
}

ueIPAddress := getUEAddressFromPDR(i)
pdrId := getPDRIDFromPDR(i)

if ueIPAddress != nil {
ueIPv4 := ueIPAddress.IPv4Address.String()
CreatedPDRList = append(CreatedPDRList, ie.NewCreatedPDR(
ie.NewPDRID(pdrId),
ie.NewUEIPAddress(2, ueIPv4, "", 0, 0),
))
}
}

var v4 net.IP
Expand All @@ -91,16 +104,20 @@ func (s *PfcpServer) handleSessionEstablishmentRequest(
// TODO: support v6
var v6 net.IP

ies := make([]*ie.IE, 0)
ies = append(ies, CreatedPDRList...)
ies = append(ies,
newIeNodeID(s.nodeID),
ie.NewCause(ie.CauseRequestAccepted),
ie.NewFSEID(sess.LocalID, v4, v6))

rsp := message.NewSessionEstablishmentResponse(
0, // mp
0, // fo
sess.RemoteID, // seid
req.Header.SequenceNumber,
0, // pri
newIeNodeID(s.nodeID),
ie.NewCause(ie.CauseRequestAccepted),
ie.NewFSEID(sess.LocalID, v4, v6),
ie.NewCreatePDR(req.CreatePDR...),
ies...,
)

err = s.sendRspTo(rsp, addr)
Expand Down Expand Up @@ -417,3 +434,49 @@ func (s *PfcpServer) handleSessionReportRequestTimeout(
s.log.Warnf("handleSessionReportRequestTimeout: SEID[%#x]", req.SEID())
// TODO?
}

// getUEAddressFromPDR returns the UEIPaddress() from the PDR IE.
func getUEAddressFromPDR(pdr *ie.IE) *ie.UEIPAddressFields {
ies, err := pdr.CreatePDR()
if err != nil {
return nil
}

for _, i := range ies {
// only care about PDI
if i.Type == ie.PDI {
ies, err := i.PDI()
if err != nil {
return nil
}
for _, x := range ies {
if x.Type == ie.UEIPAddress {
fields, err := x.UEIPAddress()
if err != nil {
return nil
}
return fields
}
}
}
}
return nil
}

func getPDRIDFromPDR(pdr *ie.IE) uint16 {
ies, err := pdr.CreatePDR()
if err != nil {
return 0
}

for _, i := range ies {
if i.Type == ie.PDRID {
id, err := i.PDRID()
if err != nil {
return 0
}
return id
}
}
return 0
}

0 comments on commit 6b73d12

Please sign in to comment.