OLD | NEW |
| (Empty) |
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. | |
4 | |
5 // IP-level socket options for FreeBSD | |
6 | |
7 package net | |
8 | |
9 import ( | |
10 "os" | |
11 "syscall" | |
12 ) | |
13 | |
14 func ipv4MulticastInterface(fd *netFD) (*Interface, error) { | |
15 if err := fd.incref(false); err != nil { | |
16 return nil, err | |
17 } | |
18 defer fd.decref() | |
19 mreq, err := syscall.GetsockoptIPMreqn(fd.sysfd, syscall.IPPROTO_IP, sys
call.IP_MULTICAST_IF) | |
20 if err != nil { | |
21 return nil, os.NewSyscallError("getsockopt", err) | |
22 } | |
23 if int(mreq.Ifindex) == 0 { | |
24 return nil, nil | |
25 } | |
26 return InterfaceByIndex(int(mreq.Ifindex)) | |
27 } | |
28 | |
29 func setIPv4MulticastInterface(fd *netFD, ifi *Interface) error { | |
30 var v int32 | |
31 if ifi != nil { | |
32 v = int32(ifi.Index) | |
33 } | |
34 mreq := &syscall.IPMreqn{Ifindex: v} | |
35 if err := fd.incref(false); err != nil { | |
36 return err | |
37 } | |
38 defer fd.decref() | |
39 err := syscall.SetsockoptIPMreqn(fd.sysfd, syscall.IPPROTO_IP, syscall.I
P_MULTICAST_IF, mreq) | |
40 if err != nil { | |
41 return os.NewSyscallError("setsockopt", err) | |
42 } | |
43 return nil | |
44 } | |
45 | |
46 func ipv4MulticastLoopback(fd *netFD) (bool, error) { | |
47 if err := fd.incref(false); err != nil { | |
48 return false, err | |
49 } | |
50 defer fd.decref() | |
51 v, err := syscall.GetsockoptInt(fd.sysfd, syscall.IPPROTO_IP, syscall.IP
_MULTICAST_LOOP) | |
52 if err != nil { | |
53 return false, os.NewSyscallError("getsockopt", err) | |
54 } | |
55 return v == 1, nil | |
56 } | |
57 | |
58 func setIPv4MulticastLoopback(fd *netFD, v bool) error { | |
59 if err := fd.incref(false); err != nil { | |
60 return err | |
61 } | |
62 defer fd.decref() | |
63 err := syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MU
LTICAST_LOOP, boolint(v)) | |
64 if err != nil { | |
65 return os.NewSyscallError("setsockopt", err) | |
66 } | |
67 return nil | |
68 } | |
69 | |
70 func ipv4ReceiveInterface(fd *netFD) (bool, error) { | |
71 if err := fd.incref(false); err != nil { | |
72 return false, err | |
73 } | |
74 defer fd.decref() | |
75 v, err := syscall.GetsockoptInt(fd.sysfd, syscall.IPPROTO_IP, syscall.IP
_RECVIF) | |
76 if err != nil { | |
77 return false, os.NewSyscallError("getsockopt", err) | |
78 } | |
79 return v == 1, nil | |
80 } | |
81 | |
82 func setIPv4ReceiveInterface(fd *netFD, v bool) error { | |
83 if err := fd.incref(false); err != nil { | |
84 return err | |
85 } | |
86 defer fd.decref() | |
87 err := syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_RE
CVIF, boolint(v)) | |
88 if err != nil { | |
89 return os.NewSyscallError("setsockopt", err) | |
90 } | |
91 return nil | |
92 } | |
OLD | NEW |