diff options
-rw-r--r-- | core/dnsserver/listen_go111.go | 34 | ||||
-rw-r--r-- | core/dnsserver/listen_go_not111.go | 11 | ||||
-rw-r--r-- | core/dnsserver/server.go | 4 |
3 files changed, 47 insertions, 2 deletions
diff --git a/core/dnsserver/listen_go111.go b/core/dnsserver/listen_go111.go new file mode 100644 index 000000000..3d730df8e --- /dev/null +++ b/core/dnsserver/listen_go111.go @@ -0,0 +1,34 @@ +// +build go1.11 +// +build aix darwin dragonfly freebsd linux netbsd openbsd + +package dnsserver + +import ( + "context" + "net" + "syscall" + + "golang.org/x/sys/unix" +) + +const supportsReusePort = true + +func reuseportControl(network, address string, c syscall.RawConn) (opErr error) { + err := c.Control(func(fd uintptr) { + opErr = unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_REUSEPORT, 1) + }) + if err != nil { + return err + } + return opErr +} + +func listen(network, addr string) (net.Listener, error) { + lc := net.ListenConfig{Control: reuseportControl} + return lc.Listen(context.Background(), network, addr) +} + +func listenPacket(network, addr string) (net.PacketConn, error) { + lc := net.ListenConfig{Control: reuseportControl} + return lc.ListenPacket(context.Background(), network, addr) +} diff --git a/core/dnsserver/listen_go_not111.go b/core/dnsserver/listen_go_not111.go new file mode 100644 index 000000000..11021d099 --- /dev/null +++ b/core/dnsserver/listen_go_not111.go @@ -0,0 +1,11 @@ +// +build !go1.11 !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd + +package dnsserver + +import "net" + +func listen(network, addr string) (net.Listener, error) { return net.Listen(network, addr) } + +func listenPacket(network, addr string) (net.PacketConn, error) { + return net.ListenPacket(network, addr) +} diff --git a/core/dnsserver/server.go b/core/dnsserver/server.go index 47d406e31..5ca826b0a 100644 --- a/core/dnsserver/server.go +++ b/core/dnsserver/server.go @@ -135,7 +135,7 @@ func (s *Server) ServePacket(p net.PacketConn) error { // Listen implements caddy.TCPServer interface. func (s *Server) Listen() (net.Listener, error) { - l, err := net.Listen("tcp", s.Addr[len(transport.DNS+"://"):]) + l, err := listen("tcp", s.Addr[len(transport.DNS+"://"):]) if err != nil { return nil, err } @@ -144,7 +144,7 @@ func (s *Server) Listen() (net.Listener, error) { // ListenPacket implements caddy.UDPServer interface. func (s *Server) ListenPacket() (net.PacketConn, error) { - p, err := net.ListenPacket("udp", s.Addr[len(transport.DNS+"://"):]) + p, err := listenPacket("udp", s.Addr[len(transport.DNS+"://"):]) if err != nil { return nil, err } |