Core: Support REUSE_PORT (#2149)

Automatically submitted.
This commit is contained in:
Miek Gieben
2018-10-01 18:05:24 +01:00
committed by corbot[bot]
parent e197830245
commit fb971ffff3
3 changed files with 47 additions and 2 deletions

View File

@@ -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)
}

View File

@@ -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)
}

View File

@@ -135,7 +135,7 @@ func (s *Server) ServePacket(p net.PacketConn) error {
// Listen implements caddy.TCPServer interface. // Listen implements caddy.TCPServer interface.
func (s *Server) Listen() (net.Listener, error) { 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 { if err != nil {
return nil, err return nil, err
} }
@@ -144,7 +144,7 @@ func (s *Server) Listen() (net.Listener, error) {
// ListenPacket implements caddy.UDPServer interface. // ListenPacket implements caddy.UDPServer interface.
func (s *Server) ListenPacket() (net.PacketConn, error) { 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 { if err != nil {
return nil, err return nil, err
} }