From 7be86bddfd6bf3457815e3d2b728da6d6c3ce83c Mon Sep 17 00:00:00 2001 From: ian-12-NYCU Date: Wed, 9 Oct 2024 15:32:13 +0000 Subject: [PATCH 1/3] fix: add CreatedPDR into Session Establishment Response --- internal/pfcp/session.go | 82 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 78 insertions(+), 4 deletions(-) diff --git a/internal/pfcp/session.go b/internal/pfcp/session.go index 9ea6894..38c6bb0 100644 --- a/internal/pfcp/session.go +++ b/internal/pfcp/session.go @@ -76,11 +76,25 @@ 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) + sess.log.Errorln("UEIPAddress: ", ueIPAddress) + + if ueIPAddress != nil { + ueIPv4 := ueIPAddress.IPv4Address.String() + sess.log.Errorln("ueIPv4: ", ueIPv4) + + CreatedPDRList = append(CreatedPDRList, ie.NewCreatedPDR( + ie.NewUEIPAddress(1, ueIPv4, "", 0, 0), + )) + } } var v4 net.IP @@ -91,16 +105,19 @@ func (s *PfcpServer) handleSessionEstablishmentRequest( // TODO: support v6 var v6 net.IP + + ies := append(CreatedPDRList, + 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) @@ -417,3 +434,60 @@ 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 getFTEIDFromPDR(pdr *ie.IE) *ie.FTEIDFields { + 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.FTEID { + fields, err := x.FTEID() + if err != nil { + return nil + } + return fields + } + } + } + } + return nil +} From 321361f7e6071544f95a40280ee9c47e0ef6bf03 Mon Sep 17 00:00:00 2001 From: ian-12-NYCU Date: Wed, 9 Oct 2024 15:43:39 +0000 Subject: [PATCH 2/3] fix: linter error --- internal/pfcp/session.go | 67 ++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 34 deletions(-) diff --git a/internal/pfcp/session.go b/internal/pfcp/session.go index 38c6bb0..ecead01 100644 --- a/internal/pfcp/session.go +++ b/internal/pfcp/session.go @@ -77,7 +77,7 @@ func (s *PfcpServer) handleSessionEstablishmentRequest( } CreatedPDRList := make([]*ie.IE, 0) - + for _, i := range req.CreatePDR { err = sess.CreatePDR(i) if err != nil { @@ -92,7 +92,8 @@ func (s *PfcpServer) handleSessionEstablishmentRequest( sess.log.Errorln("ueIPv4: ", ueIPv4) CreatedPDRList = append(CreatedPDRList, ie.NewCreatedPDR( - ie.NewUEIPAddress(1, ueIPv4, "", 0, 0), + // ie.NewUEIPAddress(2, "60.60.0.6", "", 0, 0), + ie.NewUEIPAddress(2, ueIPv4, "", 0, 0), )) } } @@ -105,10 +106,9 @@ func (s *PfcpServer) handleSessionEstablishmentRequest( // TODO: support v6 var v6 net.IP - - ies := append(CreatedPDRList, - newIeNodeID(s.nodeID), - ie.NewCause(ie.CauseRequestAccepted), + ies := append(CreatedPDRList, + newIeNodeID(s.nodeID), + ie.NewCause(ie.CauseRequestAccepted), ie.NewFSEID(sess.LocalID, v4, v6)) rsp := message.NewSessionEstablishmentResponse( @@ -438,7 +438,6 @@ func (s *PfcpServer) handleSessionReportRequestTimeout( // getUEAddressFromPDR returns the UEIPaddress() from the PDR IE. func getUEAddressFromPDR(pdr *ie.IE) *ie.UEIPAddressFields { ies, err := pdr.CreatePDR() - if err != nil { return nil } @@ -464,30 +463,30 @@ func getUEAddressFromPDR(pdr *ie.IE) *ie.UEIPAddressFields { return nil } -func getFTEIDFromPDR(pdr *ie.IE) *ie.FTEIDFields { - 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.FTEID { - fields, err := x.FTEID() - if err != nil { - return nil - } - return fields - } - } - } - } - return nil -} +// func getFTEIDFromPDR(pdr *ie.IE) *ie.FTEIDFields { +// 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.FTEID { +// fields, err := x.FTEID() +// if err != nil { +// return nil +// } +// return fields +// } +// } +// } +// } +// return nil +// } From 2d34ac2a1dd86e274f26091082bfd50cfe292ecf Mon Sep 17 00:00:00 2001 From: ian-12-NYCU Date: Thu, 10 Oct 2024 11:58:13 +0000 Subject: [PATCH 3/3] fix: missing PDR ID in Created PDR --- internal/pfcp/session.go | 54 ++++++++++++++++------------------------ 1 file changed, 22 insertions(+), 32 deletions(-) diff --git a/internal/pfcp/session.go b/internal/pfcp/session.go index ecead01..33957ef 100644 --- a/internal/pfcp/session.go +++ b/internal/pfcp/session.go @@ -85,14 +85,12 @@ func (s *PfcpServer) handleSessionEstablishmentRequest( } ueIPAddress := getUEAddressFromPDR(i) - sess.log.Errorln("UEIPAddress: ", ueIPAddress) + pdrId := getPDRIDFromPDR(i) if ueIPAddress != nil { ueIPv4 := ueIPAddress.IPv4Address.String() - sess.log.Errorln("ueIPv4: ", ueIPv4) - CreatedPDRList = append(CreatedPDRList, ie.NewCreatedPDR( - // ie.NewUEIPAddress(2, "60.60.0.6", "", 0, 0), + ie.NewPDRID(pdrId), ie.NewUEIPAddress(2, ueIPv4, "", 0, 0), )) } @@ -106,7 +104,9 @@ func (s *PfcpServer) handleSessionEstablishmentRequest( // TODO: support v6 var v6 net.IP - ies := append(CreatedPDRList, + 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)) @@ -463,30 +463,20 @@ func getUEAddressFromPDR(pdr *ie.IE) *ie.UEIPAddressFields { return nil } -// func getFTEIDFromPDR(pdr *ie.IE) *ie.FTEIDFields { -// 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.FTEID { -// fields, err := x.FTEID() -// 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 +}