diff --git a/internal/pfcp/session.go b/internal/pfcp/session.go index 9ea6894..33957ef 100644 --- a/internal/pfcp/session.go +++ b/internal/pfcp/session.go @@ -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 @@ -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) @@ -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 +}