LEFT | RIGHT |
1 // Copyright 2012 The Go Authors. All rights reserved. | 1 // Copyright 2012 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 package ipv4 | 5 package ipv4 |
6 | 6 |
7 import ( | 7 import ( |
8 "net" | 8 "net" |
9 "os" | 9 "os" |
10 » "unsafe" | 10 » "syscall" |
11 ) | 11 ) |
12 | 12 |
13 func ipv4ReceiveTOS(fd int) (bool, error) { | 13 func ipv4ReceiveTOS(fd int) (bool, error) { |
14 » var v int32 | 14 » v, err := syscall.GetsockoptInt(fd, ianaProtocolIP, sysSockoptReceiveTOS
) |
15 » l := sysSockoptLen(4) | 15 » if err != nil { |
16 » if err := getsockopt(fd, ianaProtocolIP, sysSockoptReceiveTOS, unsafe.Po
inter(&v), &l); err != nil { | |
17 return false, os.NewSyscallError("getsockopt", err) | 16 return false, os.NewSyscallError("getsockopt", err) |
18 } | 17 } |
19 return v == 1, nil | 18 return v == 1, nil |
20 } | 19 } |
21 | 20 |
22 func setIPv4ReceiveTOS(fd int, v bool) error { | 21 func setIPv4ReceiveTOS(fd int, v bool) error { |
23 » vv := int32(boolint(v)) | 22 » return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaPr
otocolIP, sysSockoptReceiveTOS, boolint(v))) |
24 » return os.NewSyscallError("setsockopt", setsockopt(fd, ianaProtocolIP, s
ysSockoptReceiveTOS, unsafe.Pointer(&vv), 4)) | |
25 } | 23 } |
26 | 24 |
27 func ipv4MulticastTTL(fd int) (int, error) { | 25 func ipv4MulticastTTL(fd int) (int, error) { |
28 » var v int32 | 26 » v, err := syscall.GetsockoptInt(fd, ianaProtocolIP, sysSockoptMulticastT
TL) |
29 » l := sysSockoptLen(4) | 27 » if err != nil { |
30 » if err := getsockopt(fd, ianaProtocolIP, sysSockoptMulticastTTL, unsafe.
Pointer(&v), &l); err != nil { | |
31 return 0, os.NewSyscallError("getsockopt", err) | 28 return 0, os.NewSyscallError("getsockopt", err) |
32 } | 29 } |
33 » return int(v), nil | 30 » return v, nil |
34 } | 31 } |
35 | 32 |
36 func setIPv4MulticastTTL(fd int, v int) error { | 33 func setIPv4MulticastTTL(fd int, v int) error { |
37 » vv := int32(v) | 34 » return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaPr
otocolIP, sysSockoptMulticastTTL, v)) |
38 » return os.NewSyscallError("setsockopt", setsockopt(fd, ianaProtocolIP, s
ysSockoptMulticastTTL, unsafe.Pointer(&vv), 4)) | |
39 } | |
40 | |
41 func ipv4PacketInfo(fd int) (bool, error) { | |
42 » var v int32 | |
43 » l := sysSockoptLen(4) | |
44 » if err := getsockopt(fd, ianaProtocolIP, sysSockoptPacketInfo, unsafe.Po
inter(&v), &l); err != nil { | |
45 » » return false, os.NewSyscallError("getsockopt", err) | |
46 » } | |
47 » return v == 1, nil | |
48 } | |
49 | |
50 func setIPv4PacketInfo(fd int, v bool) error { | |
51 » vv := int32(boolint(v)) | |
52 » return os.NewSyscallError("setsockopt", setsockopt(fd, ianaProtocolIP, s
ysSockoptPacketInfo, unsafe.Pointer(&vv), 4)) | |
53 } | 35 } |
54 | 36 |
55 func ipv4MulticastInterface(fd int) (*net.Interface, error) { | 37 func ipv4MulticastInterface(fd int) (*net.Interface, error) { |
56 » var mreq sysNewMulticastReq | 38 » mreqn, err := syscall.GetsockoptIPMreqn(fd, ianaProtocolIP, sysSockoptMu
lticastInterface) |
57 » l := sysSockoptLen(sysSizeofNewMulticastReq) | 39 » if err != nil { |
58 » if err := getsockopt(fd, ianaProtocolIP, sysSockoptMulticastInterface, u
nsafe.Pointer(&mreq), &l); err != nil { | |
59 return nil, os.NewSyscallError("getsockopt", err) | 40 return nil, os.NewSyscallError("getsockopt", err) |
60 } | 41 } |
61 » if mreq.IfIndex == 0 { | 42 » if mreqn.Ifindex == 0 { |
62 return nil, nil | 43 return nil, nil |
63 } | 44 } |
64 » return net.InterfaceByIndex(int(mreq.IfIndex)) | 45 » return net.InterfaceByIndex(int(mreqn.Ifindex)) |
65 } | 46 } |
66 | 47 |
67 func setIPv4MulticastInterface(fd int, ifi *net.Interface) error { | 48 func setIPv4MulticastInterface(fd int, ifi *net.Interface) error { |
68 » var mreq sysNewMulticastReq | 49 » var mreqn syscall.IPMreqn |
69 if ifi != nil { | 50 if ifi != nil { |
70 » » mreq.IfIndex = int32(ifi.Index) | 51 » » mreqn.Ifindex = int32(ifi.Index) |
71 } | 52 } |
72 » return os.NewSyscallError("setsockopt", setsockopt(fd, ianaProtocolIP, s
ysSockoptMulticastInterface, unsafe.Pointer(&mreq), sysSizeofNewMulticastReq)) | 53 » return os.NewSyscallError("setsockopt", syscall.SetsockoptIPMreqn(fd, ia
naProtocolIP, sysSockoptMulticastInterface, &mreqn)) |
73 } | 54 } |
74 | 55 |
75 func ipv4MulticastLoopback(fd int) (bool, error) { | 56 func ipv4MulticastLoopback(fd int) (bool, error) { |
76 » var v int32 | 57 » v, err := syscall.GetsockoptInt(fd, ianaProtocolIP, sysSockoptMulticastL
oopback) |
77 » l := sysSockoptLen(4) | 58 » if err != nil { |
78 » if err := getsockopt(fd, ianaProtocolIP, sysSockoptMulticastLoopback, un
safe.Pointer(&v), &l); err != nil { | |
79 return false, os.NewSyscallError("getsockopt", err) | 59 return false, os.NewSyscallError("getsockopt", err) |
80 } | 60 } |
81 return v == 1, nil | 61 return v == 1, nil |
82 } | 62 } |
83 | 63 |
84 func setIPv4MulticastLoopback(fd int, v bool) error { | 64 func setIPv4MulticastLoopback(fd int, v bool) error { |
85 » vv := int32(boolint(v)) | 65 » return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaPr
otocolIP, sysSockoptMulticastLoopback, boolint(v))) |
86 » return os.NewSyscallError("setsockopt", setsockopt(fd, ianaProtocolIP, s
ysSockoptMulticastLoopback, unsafe.Pointer(&vv), 4)) | |
87 } | 66 } |
88 | |
89 func joinIPv4Group(fd int, ifi *net.Interface, grp net.IP) error { | |
90 mreq := sysNewMulticastReq{IP: [4]byte{grp[0], grp[1], grp[2], grp[3]}} | |
91 if ifi != nil { | |
92 mreq.IfIndex = int32(ifi.Index) | |
93 } | |
94 return os.NewSyscallError("setsockopt", setsockopt(fd, ianaProtocolIP, s
ysSockoptJoinGroup, unsafe.Pointer(&mreq), sysSizeofNewMulticastReq)) | |
95 } | |
96 | |
97 func leaveIPv4Group(fd int, ifi *net.Interface, grp net.IP) error { | |
98 mreq := sysNewMulticastReq{IP: [4]byte{grp[0], grp[1], grp[2], grp[3]}} | |
99 if ifi != nil { | |
100 mreq.IfIndex = int32(ifi.Index) | |
101 } | |
102 return os.NewSyscallError("setsockopt", setsockopt(fd, ianaProtocolIP, s
ysSockoptLeaveGroup, unsafe.Pointer(&mreq), sysSizeofNewMulticastReq)) | |
103 } | |
LEFT | RIGHT |