Commit bf61a97f authored by Mikio Hara's avatar Mikio Hara

net: simplify socket option helpers

Also consolidates syscall.IPPROTO_TCP level option helper files.

R=golang-dev, dave, alex.brainman
CC=golang-dev
https://golang.org/cl/8637049
parent 7da7d71c
...@@ -4,8 +4,6 @@ ...@@ -4,8 +4,6 @@
// +build darwin freebsd netbsd openbsd // +build darwin freebsd netbsd openbsd
// Socket options for BSD variants
package net package net
import ( import (
...@@ -13,49 +11,31 @@ import ( ...@@ -13,49 +11,31 @@ import (
"syscall" "syscall"
) )
func setDefaultSockopts(s, f, t int, ipv6only bool) error { func setDefaultSockopts(s, family, sotype int, ipv6only bool) error {
switch f { if family == syscall.AF_INET6 && sotype != syscall.SOCK_RAW {
case syscall.AF_INET6: // Allow both IP versions even if the OS default
if ipv6only { // is otherwise. Note that some operating systems
syscall.SetsockoptInt(s, syscall.IPPROTO_IPV6, syscall.IPV6_V6ONLY, 1) // never admit this option.
} else { syscall.SetsockoptInt(s, syscall.IPPROTO_IPV6, syscall.IPV6_V6ONLY, boolint(ipv6only))
// 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, 0)
}
} }
// Allow broadcast. // Allow broadcast.
err := syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_BROADCAST, 1) return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_BROADCAST, 1))
if err != nil {
return os.NewSyscallError("setsockopt", err)
}
return nil
} }
func setDefaultListenerSockopts(s int) error { func setDefaultListenerSockopts(s int) error {
// Allow reuse of recently-used addresses. // Allow reuse of recently-used addresses.
err := syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1) return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1))
if err != nil {
return os.NewSyscallError("setsockopt", err)
}
return nil
} }
func setDefaultMulticastSockopts(s int) error { func setDefaultMulticastSockopts(s int) error {
// Allow multicast UDP and raw IP datagram sockets to listen // Allow multicast UDP and raw IP datagram sockets to listen
// concurrently across multiple listeners. // concurrently across multiple listeners.
err := syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1) if err := syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1); err != nil {
if err != nil {
return os.NewSyscallError("setsockopt", err) return os.NewSyscallError("setsockopt", err)
} }
// Allow reuse of recently-used ports. // Allow reuse of recently-used ports.
// This option is supported only in descendants of 4.4BSD, // This option is supported only in descendants of 4.4BSD,
// to make an effective multicast application that requires // to make an effective multicast application that requires
// quick draw possible. // quick draw possible.
err = syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_REUSEPORT, 1) return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_REUSEPORT, 1))
if err != nil {
return os.NewSyscallError("setsockopt", err)
}
return nil
} }
...@@ -2,8 +2,6 @@ ...@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// Socket options for Linux
package net package net
import ( import (
...@@ -11,41 +9,24 @@ import ( ...@@ -11,41 +9,24 @@ import (
"syscall" "syscall"
) )
func setDefaultSockopts(s, f, t int, ipv6only bool) error { func setDefaultSockopts(s, family, sotype int, ipv6only bool) error {
switch f { if family == syscall.AF_INET6 && sotype != syscall.SOCK_RAW {
case syscall.AF_INET6: // Allow both IP versions even if the OS default
if ipv6only { // is otherwise. Note that some operating systems
syscall.SetsockoptInt(s, syscall.IPPROTO_IPV6, syscall.IPV6_V6ONLY, 1) // never admit this option.
} else { syscall.SetsockoptInt(s, syscall.IPPROTO_IPV6, syscall.IPV6_V6ONLY, boolint(ipv6only))
// 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, 0)
}
} }
// Allow broadcast. // Allow broadcast.
err := syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_BROADCAST, 1) return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_BROADCAST, 1))
if err != nil {
return os.NewSyscallError("setsockopt", err)
}
return nil
} }
func setDefaultListenerSockopts(s int) error { func setDefaultListenerSockopts(s int) error {
// Allow reuse of recently-used addresses. // Allow reuse of recently-used addresses.
err := syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1) return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1))
if err != nil {
return os.NewSyscallError("setsockopt", err)
}
return nil
} }
func setDefaultMulticastSockopts(s int) error { func setDefaultMulticastSockopts(s int) error {
// Allow multicast UDP and raw IP datagram sockets to listen // Allow multicast UDP and raw IP datagram sockets to listen
// concurrently across multiple listeners. // concurrently across multiple listeners.
err := syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1) return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1))
if err != nil {
return os.NewSyscallError("setsockopt", err)
}
return nil
} }
...@@ -4,8 +4,6 @@ ...@@ -4,8 +4,6 @@
// +build darwin freebsd linux netbsd openbsd windows // +build darwin freebsd linux netbsd openbsd windows
// Socket options
package net package net
import ( import (
...@@ -126,14 +124,6 @@ func setKeepAlive(fd *netFD, keepalive bool) error { ...@@ -126,14 +124,6 @@ func setKeepAlive(fd *netFD, keepalive bool) error {
return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_KEEPALIVE, boolint(keepalive))) return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_KEEPALIVE, boolint(keepalive)))
} }
func setNoDelay(fd *netFD, noDelay bool) error {
if err := fd.incref(false); err != nil {
return err
}
defer fd.decref()
return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_TCP, syscall.TCP_NODELAY, boolint(noDelay)))
}
func setLinger(fd *netFD, sec int) error { func setLinger(fd *netFD, sec int) error {
var l syscall.Linger var l syscall.Linger
if sec >= 0 { if sec >= 0 {
......
...@@ -2,8 +2,6 @@ ...@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// Socket options for Windows
package net package net
import ( import (
...@@ -11,17 +9,12 @@ import ( ...@@ -11,17 +9,12 @@ import (
"syscall" "syscall"
) )
func setDefaultSockopts(s syscall.Handle, f, t int, ipv6only bool) error { func setDefaultSockopts(s syscall.Handle, family, sotype int, ipv6only bool) error {
switch f { if family == syscall.AF_INET6 && sotype != syscall.SOCK_RAW {
case syscall.AF_INET6: // Allow both IP versions even if the OS default
if ipv6only { // is otherwise. Note that some operating systems
syscall.SetsockoptInt(s, syscall.IPPROTO_IPV6, syscall.IPV6_V6ONLY, 1) // never admit this option.
} else { syscall.SetsockoptInt(s, syscall.IPPROTO_IPV6, syscall.IPV6_V6ONLY, boolint(ipv6only))
// 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, 0)
}
} }
// Allow broadcast. // Allow broadcast.
syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_BROADCAST, 1) syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_BROADCAST, 1)
...@@ -41,9 +34,5 @@ func setDefaultListenerSockopts(s syscall.Handle) error { ...@@ -41,9 +34,5 @@ func setDefaultListenerSockopts(s syscall.Handle) error {
func setDefaultMulticastSockopts(s syscall.Handle) error { func setDefaultMulticastSockopts(s syscall.Handle) error {
// Allow multicast UDP and raw IP datagram sockets to listen // Allow multicast UDP and raw IP datagram sockets to listen
// concurrently across multiple listeners. // concurrently across multiple listeners.
err := syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1) return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1))
if err != nil {
return os.NewSyscallError("setsockopt", err)
}
return nil
} }
...@@ -22,11 +22,7 @@ func setIPv4MulticastInterface(fd *netFD, ifi *Interface) error { ...@@ -22,11 +22,7 @@ func setIPv4MulticastInterface(fd *netFD, ifi *Interface) error {
return err return err
} }
defer fd.decref() defer fd.decref()
err = syscall.SetsockoptInet4Addr(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_IF, a) return os.NewSyscallError("setsockopt", syscall.SetsockoptInet4Addr(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_IF, a))
if err != nil {
return os.NewSyscallError("setsockopt", err)
}
return nil
} }
func setIPv4MulticastLoopback(fd *netFD, v bool) error { func setIPv4MulticastLoopback(fd *netFD, v bool) error {
...@@ -34,9 +30,5 @@ func setIPv4MulticastLoopback(fd *netFD, v bool) error { ...@@ -34,9 +30,5 @@ func setIPv4MulticastLoopback(fd *netFD, v bool) error {
return err return err
} }
defer fd.decref() defer fd.decref()
err := syscall.SetsockoptByte(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_LOOP, byte(boolint(v))) return os.NewSyscallError("setsockopt", syscall.SetsockoptByte(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_LOOP, byte(boolint(v))))
if err != nil {
return os.NewSyscallError("setsockopt", err)
}
return nil
} }
...@@ -19,11 +19,7 @@ func setIPv4MulticastInterface(fd *netFD, ifi *Interface) error { ...@@ -19,11 +19,7 @@ func setIPv4MulticastInterface(fd *netFD, ifi *Interface) error {
return err return err
} }
defer fd.decref() defer fd.decref()
err := syscall.SetsockoptIPMreqn(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_IF, mreq) return os.NewSyscallError("setsockopt", syscall.SetsockoptIPMreqn(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_IF, mreq))
if err != nil {
return os.NewSyscallError("setsockopt", err)
}
return nil
} }
func setIPv4MulticastLoopback(fd *netFD, v bool) error { func setIPv4MulticastLoopback(fd *netFD, v bool) error {
...@@ -31,9 +27,5 @@ func setIPv4MulticastLoopback(fd *netFD, v bool) error { ...@@ -31,9 +27,5 @@ func setIPv4MulticastLoopback(fd *netFD, v bool) error {
return err return err
} }
defer fd.decref() defer fd.decref()
err := syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_LOOP, boolint(v)) return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_LOOP, boolint(v)))
if err != nil {
return os.NewSyscallError("setsockopt", err)
}
return nil
} }
...@@ -20,11 +20,7 @@ func joinIPv4Group(fd *netFD, ifi *Interface, ip IP) error { ...@@ -20,11 +20,7 @@ func joinIPv4Group(fd *netFD, ifi *Interface, ip IP) error {
return err return err
} }
defer fd.decref() defer fd.decref()
err := syscall.SetsockoptIPMreq(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_ADD_MEMBERSHIP, mreq) return os.NewSyscallError("setsockopt", syscall.SetsockoptIPMreq(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_ADD_MEMBERSHIP, mreq))
if err != nil {
return os.NewSyscallError("setsockopt", err)
}
return nil
} }
func setIPv6MulticastInterface(fd *netFD, ifi *Interface) error { func setIPv6MulticastInterface(fd *netFD, ifi *Interface) error {
...@@ -36,11 +32,7 @@ func setIPv6MulticastInterface(fd *netFD, ifi *Interface) error { ...@@ -36,11 +32,7 @@ func setIPv6MulticastInterface(fd *netFD, ifi *Interface) error {
return err return err
} }
defer fd.decref() defer fd.decref()
err := syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_IPV6, syscall.IPV6_MULTICAST_IF, v) return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_IPV6, syscall.IPV6_MULTICAST_IF, v))
if err != nil {
return os.NewSyscallError("setsockopt", err)
}
return nil
} }
func setIPv6MulticastLoopback(fd *netFD, v bool) error { func setIPv6MulticastLoopback(fd *netFD, v bool) error {
...@@ -48,11 +40,7 @@ func setIPv6MulticastLoopback(fd *netFD, v bool) error { ...@@ -48,11 +40,7 @@ func setIPv6MulticastLoopback(fd *netFD, v bool) error {
return err return err
} }
defer fd.decref() defer fd.decref()
err := syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_IPV6, syscall.IPV6_MULTICAST_LOOP, boolint(v)) return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_IPV6, syscall.IPV6_MULTICAST_LOOP, boolint(v)))
if err != nil {
return os.NewSyscallError("setsockopt", err)
}
return nil
} }
func joinIPv6Group(fd *netFD, ifi *Interface, ip IP) error { func joinIPv6Group(fd *netFD, ifi *Interface, ip IP) error {
...@@ -65,9 +53,5 @@ func joinIPv6Group(fd *netFD, ifi *Interface, ip IP) error { ...@@ -65,9 +53,5 @@ func joinIPv6Group(fd *netFD, ifi *Interface, ip IP) error {
return err return err
} }
defer fd.decref() defer fd.decref()
err := syscall.SetsockoptIPv6Mreq(fd.sysfd, syscall.IPPROTO_IPV6, syscall.IPV6_JOIN_GROUP, mreq) return os.NewSyscallError("setsockopt", syscall.SetsockoptIPv6Mreq(fd.sysfd, syscall.IPPROTO_IPV6, syscall.IPV6_JOIN_GROUP, mreq))
if err != nil {
return os.NewSyscallError("setsockopt", err)
}
return nil
} }
...@@ -21,11 +21,7 @@ func setIPv4MulticastInterface(fd *netFD, ifi *Interface) error { ...@@ -21,11 +21,7 @@ func setIPv4MulticastInterface(fd *netFD, ifi *Interface) error {
return err return err
} }
defer fd.decref() defer fd.decref()
err = syscall.Setsockopt(fd.sysfd, int32(syscall.IPPROTO_IP), int32(syscall.IP_MULTICAST_IF), (*byte)(unsafe.Pointer(&a[0])), 4) return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_IF, (*byte)(unsafe.Pointer(&a[0])), 4))
if err != nil {
return os.NewSyscallError("setsockopt", err)
}
return nil
} }
func setIPv4MulticastLoopback(fd *netFD, v bool) error { func setIPv4MulticastLoopback(fd *netFD, v bool) error {
...@@ -33,10 +29,5 @@ func setIPv4MulticastLoopback(fd *netFD, v bool) error { ...@@ -33,10 +29,5 @@ func setIPv4MulticastLoopback(fd *netFD, v bool) error {
return err return err
} }
defer fd.decref() defer fd.decref()
vv := int32(boolint(v)) return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_LOOP, boolint(v)))
err := syscall.Setsockopt(fd.sysfd, int32(syscall.IPPROTO_IP), int32(syscall.IP_MULTICAST_LOOP), (*byte)(unsafe.Pointer(&vv)), 4)
if err != nil {
return os.NewSyscallError("setsockopt", err)
}
return nil
} }
...@@ -2,30 +2,19 @@ ...@@ -2,30 +2,19 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build freebsd linux netbsd // +build darwin freebsd linux netbsd openbsd windows
package net package net
import ( import (
"os" "os"
"syscall" "syscall"
"time"
) )
// Set keep alive period. func setNoDelay(fd *netFD, noDelay bool) error {
func setKeepAlivePeriod(fd *netFD, d time.Duration) error {
if err := fd.incref(false); err != nil { if err := fd.incref(false); err != nil {
return err return err
} }
defer fd.decref() defer fd.decref()
return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_TCP, syscall.TCP_NODELAY, boolint(noDelay)))
// The kernel expects seconds so round to next highest second.
d += (time.Second - time.Nanosecond)
secs := int(d.Seconds())
err := os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_TCP, syscall.TCP_KEEPINTVL, secs))
if err != nil {
return err
}
return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_TCP, syscall.TCP_KEEPIDLE, secs))
} }
// Copyright 2009 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.
// +build freebsd linux netbsd
package net
import (
"os"
"syscall"
"time"
)
// Set keep alive period.
func setKeepAlivePeriod(fd *netFD, d time.Duration) error {
if err := fd.incref(false); err != nil {
return err
}
defer fd.decref()
// The kernel expects seconds so round to next highest second.
d += (time.Second - time.Nanosecond)
secs := int(d.Seconds())
err := os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_TCP, syscall.TCP_KEEPINTVL, secs))
if err != nil {
return err
}
return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_TCP, syscall.TCP_KEEPIDLE, secs))
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment