traefik/pkg/server/server_entrypoint_listenconfig_unix.go
2024-01-30 14:56:05 +01:00

45 lines
1.2 KiB
Go

//go:build linux || freebsd || openbsd || darwin
package server
import (
"fmt"
"net"
"syscall"
"github.com/traefik/traefik/v3/pkg/config/static"
"golang.org/x/sys/unix"
)
// newListenConfig creates a new net.ListenConfig for the given configuration of
// the entry point.
func newListenConfig(configuration *static.EntryPoint) (lc net.ListenConfig) {
if configuration != nil && configuration.ReusePort {
lc.Control = controlReusePort
}
return
}
// controlReusePort is a net.ListenConfig.Control function that enables SO_REUSEPORT
// on the socket.
func controlReusePort(network, address string, c syscall.RawConn) error {
var setSockOptErr error
err := c.Control(func(fd uintptr) {
// Note that net.ListenConfig enables unix.SO_REUSEADDR by default,
// as seen in https://go.dev/src/net/sockopt_linux.go. Therefore, no
// additional action is required to enable it here.
setSockOptErr = unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unixSOREUSEPORT, 1)
if setSockOptErr != nil {
return
}
})
if err != nil {
return fmt.Errorf("control: %w", err)
}
if setSockOptErr != nil {
return fmt.Errorf("setsockopt: %w", setSockOptErr)
}
return nil
}