mirror of
https://github.com/golang/go
synced 2024-11-26 08:17:59 -07:00
b9c9cbf926
Only enable broadcast on SOCK_DGRAM and SOCK_RAW sockets, SOCK_STREAM and others don't support it. Don't enable SO_BROADCAST on UNIX domain sockets as they don't support it. This caused failures on WSL which strictly checks setsockopt calls unlike other OSes which often silently ignore bad options. Also return error for setsockopt call for SO_BROADCAST on Windows matching all other platforms but for IPv4 only as it's not supported on IPv6 as per: https://docs.microsoft.com/en-us/windows/win32/winsock/socket-options Fixes #38954 Change-Id: I0503fd1ce96102b17121af548b66b3e9c2bb80d3 Reviewed-on: https://go-review.googlesource.com/c/go/+/232807 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
36 lines
1.3 KiB
Go
36 lines
1.3 KiB
Go
// Copyright 2011 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package net
|
|
|
|
import (
|
|
"os"
|
|
"syscall"
|
|
)
|
|
|
|
func setDefaultSockopts(s, family, sotype int, ipv6only bool) error {
|
|
if family == syscall.AF_INET6 && sotype != syscall.SOCK_RAW {
|
|
// Allow both IP versions even if the OS default
|
|
// is otherwise. Note that some operating systems
|
|
// never admit this option.
|
|
syscall.SetsockoptInt(s, syscall.IPPROTO_IPV6, syscall.IPV6_V6ONLY, boolint(ipv6only))
|
|
}
|
|
if (sotype == syscall.SOCK_DGRAM || sotype == syscall.SOCK_RAW) && family != syscall.AF_UNIX {
|
|
// Allow broadcast.
|
|
return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_BROADCAST, 1))
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func setDefaultListenerSockopts(s int) error {
|
|
// Allow reuse of recently-used addresses.
|
|
return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1))
|
|
}
|
|
|
|
func setDefaultMulticastSockopts(s int) error {
|
|
// Allow multicast UDP and raw IP datagram sockets to listen
|
|
// concurrently across multiple listeners.
|
|
return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1))
|
|
}
|