OLD | NEW |
1 // Copyright 2011 The Go Authors. All rights reserved. | 1 // Copyright 2011 The Go Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style | 2 // Use of this source code is governed by a BSD-style |
3 // license that can be found in the LICENSE file. | 3 // license that can be found in the LICENSE file. |
4 | 4 |
5 // +build darwin freebsd netbsd openbsd | 5 // +build darwin freebsd netbsd openbsd |
6 | 6 |
7 // IP-level socket options for BSD variants | 7 // IP-level socket options for BSD variants |
8 | 8 |
9 package net | 9 package net |
10 | 10 |
11 import ( | 11 import ( |
12 "os" | 12 "os" |
13 "syscall" | 13 "syscall" |
14 ) | 14 ) |
15 | 15 |
16 func ipv4MulticastTTL(fd *netFD) (int, error) { | 16 func setIPv4MulticastInterface(fd *netFD, ifi *Interface) error { |
17 » if err := fd.incref(false); err != nil { | 17 » ip, err := interfaceToIPv4Addr(ifi) |
18 » » return 0, err | 18 » if err != nil { |
| 19 » » return os.NewSyscallError("setsockopt", err) |
19 } | 20 } |
20 » defer fd.decref() | 21 » var x [4]byte |
21 » v, err := syscall.GetsockoptByte(fd.sysfd, syscall.IPPROTO_IP, syscall.I
P_MULTICAST_TTL) | 22 » copy(x[:], ip.To4()) |
22 » if err != nil { | |
23 » » return 0, os.NewSyscallError("getsockopt", err) | |
24 » } | |
25 » return int(v), nil | |
26 } | |
27 | |
28 func setIPv4MulticastTTL(fd *netFD, v int) error { | |
29 if err := fd.incref(false); err != nil { | 23 if err := fd.incref(false); err != nil { |
30 return err | 24 return err |
31 } | 25 } |
32 defer fd.decref() | 26 defer fd.decref() |
33 » err := syscall.SetsockoptByte(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_M
ULTICAST_TTL, byte(v)) | 27 » err = syscall.SetsockoptInet4Addr(fd.sysfd, syscall.IPPROTO_IP, syscall.
IP_MULTICAST_IF, x) |
34 if err != nil { | 28 if err != nil { |
35 return os.NewSyscallError("setsockopt", err) | 29 return os.NewSyscallError("setsockopt", err) |
36 } | 30 } |
37 return nil | 31 return nil |
38 } | 32 } |
39 | 33 |
40 func ipv6TrafficClass(fd *netFD) (int, error) { | 34 func setIPv4MulticastLoopback(fd *netFD, v bool) error { |
41 » if err := fd.incref(false); err != nil { | |
42 » » return 0, err | |
43 » } | |
44 » defer fd.decref() | |
45 » v, err := syscall.GetsockoptInt(fd.sysfd, syscall.IPPROTO_IPV6, syscall.
IPV6_TCLASS) | |
46 » if err != nil { | |
47 » » return 0, os.NewSyscallError("getsockopt", err) | |
48 » } | |
49 » return v, nil | |
50 } | |
51 | |
52 func setIPv6TrafficClass(fd *netFD, v int) error { | |
53 if err := fd.incref(false); err != nil { | 35 if err := fd.incref(false); err != nil { |
54 return err | 36 return err |
55 } | 37 } |
56 defer fd.decref() | 38 defer fd.decref() |
57 » err := syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_IPV6, syscall.IPV
6_TCLASS, v) | 39 » err := syscall.SetsockoptByte(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_M
ULTICAST_LOOP, byte(boolint(v))) |
58 if err != nil { | 40 if err != nil { |
59 return os.NewSyscallError("setsockopt", err) | 41 return os.NewSyscallError("setsockopt", err) |
60 } | 42 } |
61 return nil | 43 return nil |
62 } | 44 } |
OLD | NEW |