1
// Copyright 2011 The Go Authors. All rights reserved.
2
// Use of this source code is governed by a BSD-style
3
// license that can be found in the LICENSE file.
5
// IP-level socket options for FreeBSD
14
func ipv4MulticastInterface(fd *netFD) (*Interface, error) {
15
if err := fd.incref(false); err != nil {
19
mreq, err := syscall.GetsockoptIPMreqn(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_IF)
21
return nil, os.NewSyscallError("getsockopt", err)
23
if int(mreq.Ifindex) == 0 {
26
return InterfaceByIndex(int(mreq.Ifindex))
29
func setIPv4MulticastInterface(fd *netFD, ifi *Interface) error {
34
mreq := &syscall.IPMreqn{Ifindex: v}
35
if err := fd.incref(false); err != nil {
39
err := syscall.SetsockoptIPMreqn(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_IF, mreq)
41
return os.NewSyscallError("setsockopt", err)
46
func ipv4MulticastLoopback(fd *netFD) (bool, error) {
47
if err := fd.incref(false); err != nil {
51
v, err := syscall.GetsockoptInt(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_LOOP)
53
return false, os.NewSyscallError("getsockopt", err)
58
func setIPv4MulticastLoopback(fd *netFD, v bool) error {
59
if err := fd.incref(false); err != nil {
63
err := syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_LOOP, boolint(v))
65
return os.NewSyscallError("setsockopt", err)
70
func ipv4ReceiveInterface(fd *netFD) (bool, error) {
71
if err := fd.incref(false); err != nil {
75
v, err := syscall.GetsockoptInt(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_RECVIF)
77
return false, os.NewSyscallError("getsockopt", err)
82
func setIPv4ReceiveInterface(fd *netFD, v bool) error {
83
if err := fd.incref(false); err != nil {
87
err := syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_RECVIF, boolint(v))
89
return os.NewSyscallError("setsockopt", err)