aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/dnsserver/listen_go111.go34
-rw-r--r--core/dnsserver/listen_go_not111.go11
-rw-r--r--core/dnsserver/server.go4
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
}