From cbf92bec2e9ff755836ace9ab9e0d83997e6ed9a Mon Sep 17 00:00:00 2001 From: Johannes Kimmel Date: Tue, 7 Mar 2023 01:08:21 +0100 Subject: [PATCH] packet: set SO_REUSEADDR on babel port This allows to listen to incoming babel packets along side another babel instance. --- packet/packet.go | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/packet/packet.go b/packet/packet.go index 83d04ae..69e24e6 100644 --- a/packet/packet.go +++ b/packet/packet.go @@ -1,8 +1,10 @@ package packet import ( + "context" "fmt" "net" + "syscall" "golang.org/x/net/ipv6" "inet.af/netaddr" @@ -34,10 +36,21 @@ func Listen(group string, port uint16, ifaces ...string) (Conn, error) { func ListenPort(port uint16) (Conn, error) { var c Conn - uc, err := net.ListenUDP("udp6", &net.UDPAddr{Port: int(port)}) + lc := net.ListenConfig{ + Control: func(network, address string, c syscall.RawConn) error { + var err error + c.Control(func(fd uintptr) { + err = syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1) + }) + return err + }, + } + uc, err := lc.ListenPacket(context.Background(), "udp6", fmt.Sprintf(":%d", port)) + if err != nil { return c, err } + c.v6pc = ipv6.NewPacketConn(uc) return c, c.v6pc.SetControlMessage(