diff --git a/pfcp/api/entity_interface.go b/pfcp/api/entity_interface.go index 1a9fbb2..6fd8eef 100644 --- a/pfcp/api/entity_interface.go +++ b/pfcp/api/entity_interface.go @@ -6,10 +6,13 @@ package api import ( + "net/netip" + "github.com/wmnsk/go-pfcp/ie" ) type PFCPEntityInterface interface { + ListenAddr() netip.Addr IsUserPlane() bool IsControlPlane() bool NodeID() *ie.IE diff --git a/pfcp/entity.go b/pfcp/entity.go index 0bc2929..f1b3144 100644 --- a/pfcp/entity.go +++ b/pfcp/entity.go @@ -85,6 +85,10 @@ func (e *PFCPEntity) closePfcpConn() error { return nil } +func (e *PFCPEntity) ListenAddr() netip.Addr { + return e.listenAddr +} + func (e *PFCPEntity) Options() api.EntityOptionsInterface { return e.options } diff --git a/pfcp/peer.go b/pfcp/peer.go index 7802d87..944b30e 100644 --- a/pfcp/peer.go +++ b/pfcp/peer.go @@ -63,7 +63,7 @@ func newPFCPPeer(srv api.PFCPEntityInterface, nodeID *ie.IE, kind string) (peer raddr := net.UDPAddrFromAddrPort(netip.AddrPortFrom(ips[0], pfcputil.PFCP_PORT)) - conn, err := net.DialUDP("udp", nil, raddr) + conn, err := net.ListenUDP("udp", net.UDPAddrFromAddrPort(netip.AddrPortFrom(srv.ListenAddr(), 0))) if err != nil { return nil, err } @@ -112,11 +112,15 @@ func (peer *PFCPPeer) startLoop() { func (peer *PFCPPeer) loopUnwrapped() { b := make([]byte, pfcputil.DEFAULT_MTU) // TODO: detect MTU for interface instead of using DEFAULT_MTU - n, _, err := peer.conn.ReadFromUDP(b) + n, addr, err := peer.conn.ReadFromUDP(b) if err != nil { // socket has been closed return } + if addr.String() != peer.udpAddr.String() { + // peer usurpated + return + } // Processing of message in a new thread to avoid blocking go func(msgArray []byte, size int, e *PFCPPeer) { msg, err := message.ParseHeader(msgArray[:size])