From 308e9378b639c93290e61e49df921be2f1c5f53a Mon Sep 17 00:00:00 2001 From: Louis Royer Date: Mon, 13 Jan 2025 15:42:52 +0100 Subject: [PATCH 1/2] Update libs --- go.mod | 8 ++++---- go.sum | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index 03a01af..cde4c5d 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.22.7 require ( github.com/adrg/xdg v0.5.3 github.com/google/gopacket v1.1.19 - github.com/nextmn/go-pfcp-networking v0.0.41 + github.com/nextmn/go-pfcp-networking v0.0.42-0.20250113143454-90776d0e392b github.com/nextmn/logrus-formatter v0.0.1 github.com/sirupsen/logrus v1.9.3 github.com/songgao/water v0.0.0-20200317203138-2b4b6d7c09d8 @@ -16,14 +16,14 @@ require ( ) require ( - github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/rogpeppe/go-internal v1.10.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/vishvananda/netlink v1.3.0 // indirect github.com/vishvananda/netns v0.0.5 // indirect github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect - golang.org/x/net v0.32.0 // indirect - golang.org/x/sys v0.28.0 // indirect + golang.org/x/net v0.34.0 // indirect + golang.org/x/sys v0.29.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect ) diff --git a/go.sum b/go.sum index 1a07a0e..a4b6e45 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ github.com/adrg/xdg v0.5.3 h1:xRnxJXne7+oWDatRhR1JLnvuccuIeCoBu2rtuLqQB78= github.com/adrg/xdg v0.5.3/go.mod h1:nlTsY+NNiCBGCK2tpm09vRqfVzrc2fLmXGpBLF0zlTQ= -github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc= -github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.6 h1:XJtiaUW6dEEqVuZiMTn1ldk455QWwEIsMIJlo5vtkx0= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -17,8 +17,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/nextmn/go-pfcp-networking v0.0.41 h1:vA8TfjlxZMxZIZiJ3eEdllwYjmBurvZvD9J4xcCPheo= -github.com/nextmn/go-pfcp-networking v0.0.41/go.mod h1:KYoKLiltDmHL2YMU5mz2k/E1xMoz4TpmzTz6Nr5u5gA= +github.com/nextmn/go-pfcp-networking v0.0.42-0.20250113143454-90776d0e392b h1:EsmVgMOf2EGTQbSjCw32PHUBxXc9sO/PEkmaDwAYguU= +github.com/nextmn/go-pfcp-networking v0.0.42-0.20250113143454-90776d0e392b/go.mod h1:KYoKLiltDmHL2YMU5mz2k/E1xMoz4TpmzTz6Nr5u5gA= github.com/nextmn/logrus-formatter v0.0.1 h1:Bsf78jjiEESc+rV8xE6IyKj4frDPGMwXFNrLQzm6A1E= github.com/nextmn/logrus-formatter v0.0.1/go.mod h1:vdSZ+sIcSna8vjbXkSFxsnsKHqRwaUEed4JCPcXoGyM= github.com/pascaldekloe/goe v0.1.1 h1:Ah6WQ56rZONR3RW3qWa2NCZ6JAVvSpUcoLBaOmYFt9Q= @@ -58,16 +58,16 @@ golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPI golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= -golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= +golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= +golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= -golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= +golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From a0b986de42ea635c518e8b74c67db8aa75e7a2e3 Mon Sep 17 00:00:00 2001 From: Louis Royer Date: Mon, 13 Jan 2025 16:14:45 +0100 Subject: [PATCH 2/2] Fix `"Error while resolving UDP address of GTP-U Peer app=NextMN-UPF error="lookup udp/%!s(int=2152): unknown port"` --- go.mod | 2 +- go.sum | 4 +-- internal/app/gtp-entity.go | 2 +- internal/app/tun.go | 7 ++++- internal/app/up-handler.go | 52 +++++++++++++++----------------------- 5 files changed, 30 insertions(+), 37 deletions(-) diff --git a/go.mod b/go.mod index cde4c5d..1403aee 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.22.7 require ( github.com/adrg/xdg v0.5.3 github.com/google/gopacket v1.1.19 - github.com/nextmn/go-pfcp-networking v0.0.42-0.20250113143454-90776d0e392b + github.com/nextmn/go-pfcp-networking v0.0.42 github.com/nextmn/logrus-formatter v0.0.1 github.com/sirupsen/logrus v1.9.3 github.com/songgao/water v0.0.0-20200317203138-2b4b6d7c09d8 diff --git a/go.sum b/go.sum index a4b6e45..2d4e5de 100644 --- a/go.sum +++ b/go.sum @@ -17,8 +17,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/nextmn/go-pfcp-networking v0.0.42-0.20250113143454-90776d0e392b h1:EsmVgMOf2EGTQbSjCw32PHUBxXc9sO/PEkmaDwAYguU= -github.com/nextmn/go-pfcp-networking v0.0.42-0.20250113143454-90776d0e392b/go.mod h1:KYoKLiltDmHL2YMU5mz2k/E1xMoz4TpmzTz6Nr5u5gA= +github.com/nextmn/go-pfcp-networking v0.0.42 h1:kYcGyIUMe/RVt3DpvDOKJt4+UbScIewDBMSQWLruusE= +github.com/nextmn/go-pfcp-networking v0.0.42/go.mod h1:KYoKLiltDmHL2YMU5mz2k/E1xMoz4TpmzTz6Nr5u5gA= github.com/nextmn/logrus-formatter v0.0.1 h1:Bsf78jjiEESc+rV8xE6IyKj4frDPGMwXFNrLQzm6A1E= github.com/nextmn/logrus-formatter v0.0.1/go.mod h1:vdSZ+sIcSna8vjbXkSFxsnsKHqRwaUEed4JCPcXoGyM= github.com/pascaldekloe/goe v0.1.1 h1:Ah6WQ56rZONR3RW3qWa2NCZ6JAVvSpUcoLBaOmYFt9Q= diff --git a/internal/app/gtp-entity.go b/internal/app/gtp-entity.go index 09972cf..c3973ab 100644 --- a/internal/app/gtp-entity.go +++ b/internal/app/gtp-entity.go @@ -33,7 +33,7 @@ func (s *Setup) createGtpUProtocolEntity(ipAddress netip.Addr) error { defer cancel() uConn.DisableErrorIndication() uConn.AddHandler(message.MsgTypeTPDU, func(c gtpv1.Conn, senderAddr net.Addr, msg message.Message) error { - return tpduHandler(ipAddress.String(), c, senderAddr, msg, s.farUconnDb, s.tunInterface, s.pfcpServer) + return tpduHandler(ipAddress, c, senderAddr, msg, s.farUconnDb, s.tunInterface, s.pfcpServer) }) if err := uConn.ListenAndServe(ctx); err != nil { return err diff --git a/internal/app/tun.go b/internal/app/tun.go index bba670f..091ece6 100644 --- a/internal/app/tun.go +++ b/internal/app/tun.go @@ -7,6 +7,7 @@ package app import ( "fmt" + "net/netip" "strconv" "github.com/nextmn/upf/internal/constants" @@ -21,6 +22,10 @@ func (s *Setup) createTUNInterface() error { if s.tunInterface == nil { return fmt.Errorf("Tun interface has not been created") } + var gtpEntity netip.Addr + if len(s.config.Gtpu.GTPUProtocolEntities) > 0 { + gtpEntity = s.config.Gtpu.GTPUProtocolEntities[0].Addr + } go func() error { for { @@ -30,7 +35,7 @@ func (s *Setup) createTUNInterface() error { return err } go func(packet []byte, db *FARAssociationDB, tuniface *water.Interface, pfcpServer *pfcp_networking.PFCPEntityUP) { - err := ipPacketHandler(packet, db, tuniface, pfcpServer) + err := ipPacketHandler(gtpEntity, packet, db, tuniface, pfcpServer) if err != nil { logrus.WithError(err).Debug("Drop packet") } diff --git a/internal/app/up-handler.go b/internal/app/up-handler.go index 4a0631e..bcf420a 100644 --- a/internal/app/up-handler.go +++ b/internal/app/up-handler.go @@ -9,14 +9,16 @@ import ( "context" "fmt" "net" + "net/netip" "strings" "sync" - "github.com/google/gopacket" - "github.com/google/gopacket/layers" pfcp_networking "github.com/nextmn/go-pfcp-networking/pfcp" "github.com/nextmn/go-pfcp-networking/pfcp/api" "github.com/nextmn/upf/internal/constants" + + "github.com/google/gopacket" + "github.com/google/gopacket/layers" "github.com/sirupsen/logrus" "github.com/songgao/water" "github.com/songgao/water/waterutil" @@ -55,7 +57,7 @@ func (db *FARAssociationDB) Get(seid uint64, farid uint32) *gtpv1.UPlaneConn { return nil } -func ipPacketHandler(packet []byte, db *FARAssociationDB, tuniface *water.Interface, pfcpServer *pfcp_networking.PFCPEntityUP) error { +func ipPacketHandler(gtpEntity netip.Addr, packet []byte, db *FARAssociationDB, tuniface *water.Interface, pfcpServer *pfcp_networking.PFCPEntityUP) error { logrus.Debug("Received IP packet on TUN interface") pfcpSession, err := pfcpSessionLookUp(false, 0, "", packet, pfcpServer) if err != nil { @@ -83,11 +85,11 @@ func ipPacketHandler(packet []byte, db *FARAssociationDB, tuniface *water.Interf } return err } - handleIncommingPacket(db, packet, false, pfcpSession, pdr, tuniface) + handleIncommingPacket(gtpEntity, db, packet, false, pfcpSession, pdr, tuniface) return nil } -func tpduHandler(iface string, c gtpv1.Conn, senderAddr net.Addr, msg message.Message, db *FARAssociationDB, tuniface *water.Interface, pfcpServer *pfcp_networking.PFCPEntityUP) error { +func tpduHandler(iface netip.Addr, c gtpv1.Conn, senderAddr net.Addr, msg message.Message, db *FARAssociationDB, tuniface *water.Interface, pfcpServer *pfcp_networking.PFCPEntityUP) error { logrus.WithFields(logrus.Fields{ "sender": senderAddr, "teid": msg.TEID(), @@ -99,7 +101,7 @@ func tpduHandler(iface string, c gtpv1.Conn, senderAddr net.Addr, msg message.Me logrus.WithError(err).Error("Could not marshal GTP packet") return err } - pfcpSession, err := pfcpSessionLookUp(true, msg.TEID(), iface, packet, pfcpServer) + pfcpSession, err := pfcpSessionLookUp(true, msg.TEID(), iface.String(), packet, pfcpServer) if err != nil { logrus.WithError(err).WithFields(logrus.Fields{ "teid": msg.TEID(), @@ -108,7 +110,7 @@ func tpduHandler(iface string, c gtpv1.Conn, senderAddr net.Addr, msg message.Me return err } defer pfcpSession.RUnlock() - pdr, err := pfcpSessionPDRLookUp(pfcpSession, true, msg.TEID(), iface, packet) + pdr, err := pfcpSessionPDRLookUp(pfcpSession, true, msg.TEID(), iface.String(), packet) if err != nil { logrus.WithError(err).WithFields(logrus.Fields{ "teid": msg.TEID(), @@ -121,7 +123,7 @@ func tpduHandler(iface string, c gtpv1.Conn, senderAddr net.Addr, msg message.Me "teid": msg.TEID(), "interface": iface, }).Debug("Found PDR associated on this packet") - handleIncommingPacket(db, packet, true, pfcpSession, pdr, tuniface) + handleIncommingPacket(iface, db, packet, true, pfcpSession, pdr, tuniface) return nil } @@ -199,7 +201,7 @@ func handleOuterHeaderRemoval(packet []byte, isGTP bool, outerHeaderRemoval *ie. return packet, nil, nil } -func handleIncommingPacket(db *FARAssociationDB, packet []byte, isGTP bool, session api.PFCPSessionInterface, pdr api.PDRInterface, tuniface *water.Interface) error { +func handleIncommingPacket(gtpIface netip.Addr, db *FARAssociationDB, packet []byte, isGTP bool, session api.PFCPSessionInterface, pdr api.PDRInterface, tuniface *water.Interface) error { if logrus.IsLevelEnabled(logrus.TraceLevel) { pdrid, err := pdr.ID() if err == nil { @@ -271,6 +273,10 @@ func handleIncommingPacket(db *FARAssociationDB, packet []byte, isGTP bool, sess default: ipAddress = "" } + netIpAddr, err := netip.ParseAddr(ipAddress) + if err != nil { + return err + } switch { case ohc.HasTEID(): // Outer Header Creation // forward over GTP/UDP/IP @@ -280,9 +286,9 @@ func handleIncommingPacket(db *FARAssociationDB, packet []byte, isGTP bool, sess } tlm, err := fp.TransportLevelMarking() if err == nil { - return forwardGTP(gpdu, ipAddress, int(tlm>>8), session, farid, db) + return forwardGTP(gtpIface, gpdu, netIpAddr, int(tlm>>8), session, farid, db) } else { - return forwardGTP(gpdu, ipAddress, 0, session, farid, db) + return forwardGTP(gtpIface, gpdu, netIpAddr, 0, session, farid, db) } case ohc.HasPortNumber(): // forward over UDP/IP @@ -349,21 +355,8 @@ func handleIncommingPacket(db *FARAssociationDB, packet []byte, isGTP bool, sess } -func forwardGTP(gpdu *message.Header, ipAddress string, dscpecn int, session api.PFCPSessionInterface, farid uint32, db *FARAssociationDB) error { - if ipAddress == "" { - return fmt.Errorf("IP Address for GTP Forwarding is empty") - } - var udpaddr string - if strings.Count(ipAddress, ":") > 0 { - udpaddr = fmt.Sprintf("[%s]:%s", ipAddress, constants.GTPU_PORT) - } else { - udpaddr = fmt.Sprintf("%s:%s", ipAddress, constants.GTPU_PORT) - } - raddr, err := net.ResolveUDPAddr("udp", udpaddr) - if err != nil { - logrus.WithError(err).Error("Error while resolving UDP address of GTP-U Peer") - return err - } +func forwardGTP(gtpIface netip.Addr, gpdu *message.Header, ipAddress netip.Addr, dscpecn int, session api.PFCPSessionInterface, farid uint32, db *FARAssociationDB) error { + raddr := net.UDPAddrFromAddrPort(netip.AddrPortFrom(ipAddress, constants.GTPU_PORT)) // Check Uconn exists for this FAR seid, err := session.LocalSEID() if err != nil { @@ -376,12 +369,7 @@ func forwardGTP(gpdu *message.Header, ipAddress string, dscpecn int, session api // For the GTP-U messages described below (other than the Echo Response message, see clause 4.4.2.2), the UDP Source // Port or the Flow Label field (see IETF RFC 6437 [37]) should be set dynamically by the sending GTP-U entity to help // balancing the load in the transport network. - c, err := net.Dial("udp", udpaddr) - if err != nil { - return err - } - c.Close() - laddr := c.LocalAddr().(*net.UDPAddr) + laddr := net.UDPAddrFromAddrPort(netip.AddrPortFrom(gtpIface, 0)) ch := make(chan bool) go func(ch chan bool) error { ctx, cancel := context.WithCancel(context.Background()) // FIXME: use context