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 // +build darwin dragonfly freebsd linux netbsd openbsd | 5 // +build darwin dragonfly freebsd linux netbsd openbsd |
6 | 6 |
7 package ipv4 | 7 package ipv4 |
8 | 8 |
9 import ( | 9 import ( |
10 "os" | 10 "os" |
11 » "unsafe" | 11 » "syscall" |
12 ) | 12 ) |
13 | 13 |
14 func ipv4TOS(fd int) (int, error) { | 14 func ipv4TOS(fd int) (int, error) { |
15 » var v int32 | 15 » v, err := syscall.GetsockoptInt(fd, ianaProtocolIP, sysSockoptTOS) |
16 » l := sysSockoptLen(4) | 16 » if err != nil { |
17 » if err := getsockopt(fd, ianaProtocolIP, sysSockoptTOS, unsafe.Pointer(&
v), &l); err != nil { | |
18 return 0, os.NewSyscallError("getsockopt", err) | 17 return 0, os.NewSyscallError("getsockopt", err) |
19 } | 18 } |
20 » return int(v), nil | 19 » return v, nil |
21 } | 20 } |
22 | 21 |
23 func setIPv4TOS(fd int, v int) error { | 22 func setIPv4TOS(fd int, v int) error { |
24 » vv := int32(v) | 23 » return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaPr
otocolIP, sysSockoptTOS, v)) |
25 » return os.NewSyscallError("setsockopt", setsockopt(fd, ianaProtocolIP, s
ysSockoptTOS, unsafe.Pointer(&vv), 4)) | |
26 } | 24 } |
27 | 25 |
28 func ipv4TTL(fd int) (int, error) { | 26 func ipv4TTL(fd int) (int, error) { |
29 » var v int32 | 27 » v, err := syscall.GetsockoptInt(fd, ianaProtocolIP, sysSockoptTTL) |
30 » l := sysSockoptLen(4) | 28 » if err != nil { |
31 » if err := getsockopt(fd, ianaProtocolIP, sysSockoptTTL, unsafe.Pointer(&
v), &l); err != nil { | |
32 return 0, os.NewSyscallError("getsockopt", err) | 29 return 0, os.NewSyscallError("getsockopt", err) |
33 } | 30 } |
34 » return int(v), nil | 31 » return v, nil |
35 } | 32 } |
36 | 33 |
37 func setIPv4TTL(fd int, v int) error { | 34 func setIPv4TTL(fd int, v int) error { |
38 » vv := int32(v) | 35 » return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaPr
otocolIP, sysSockoptTTL, v)) |
39 » return os.NewSyscallError("setsockopt", setsockopt(fd, ianaProtocolIP, s
ysSockoptTTL, unsafe.Pointer(&vv), 4)) | |
40 } | 36 } |
41 | 37 |
42 func ipv4ReceiveTTL(fd int) (bool, error) { | 38 func ipv4ReceiveTTL(fd int) (bool, error) { |
43 » var v int32 | 39 » v, err := syscall.GetsockoptInt(fd, ianaProtocolIP, sysSockoptReceiveTTL
) |
44 » l := sysSockoptLen(4) | 40 » if err != nil { |
45 » if err := getsockopt(fd, ianaProtocolIP, sysSockoptReceiveTTL, unsafe.Po
inter(&v), &l); err != nil { | |
46 return false, os.NewSyscallError("getsockopt", err) | 41 return false, os.NewSyscallError("getsockopt", err) |
47 } | 42 } |
48 return v == 1, nil | 43 return v == 1, nil |
49 } | 44 } |
50 | 45 |
51 func setIPv4ReceiveTTL(fd int, v bool) error { | 46 func setIPv4ReceiveTTL(fd int, v bool) error { |
52 » vv := int32(boolint(v)) | 47 » return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaPr
otocolIP, sysSockoptReceiveTTL, boolint(v))) |
53 » return os.NewSyscallError("setsockopt", setsockopt(fd, ianaProtocolIP, s
ysSockoptReceiveTTL, unsafe.Pointer(&vv), 4)) | |
54 } | 48 } |
55 | 49 |
56 func ipv4HeaderPrepend(fd int) (bool, error) { | 50 func ipv4HeaderPrepend(fd int) (bool, error) { |
57 » var v int32 | 51 » v, err := syscall.GetsockoptInt(fd, ianaProtocolIP, sysSockoptHeaderPrep
end) |
58 » l := sysSockoptLen(4) | 52 » if err != nil { |
59 » if err := getsockopt(fd, ianaProtocolIP, sysSockoptHeaderPrepend, unsafe
.Pointer(&v), &l); err != nil { | |
60 return false, os.NewSyscallError("getsockopt", err) | 53 return false, os.NewSyscallError("getsockopt", err) |
61 } | 54 } |
62 return v == 1, nil | 55 return v == 1, nil |
63 } | 56 } |
64 | 57 |
65 func setIPv4HeaderPrepend(fd int, v bool) error { | 58 func setIPv4HeaderPrepend(fd int, v bool) error { |
66 » vv := int32(boolint(v)) | 59 » return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaPr
otocolIP, sysSockoptHeaderPrepend, boolint(v))) |
67 » return os.NewSyscallError("setsockopt", setsockopt(fd, ianaProtocolIP, s
ysSockoptHeaderPrepend, unsafe.Pointer(&vv), 4)) | |
68 } | 60 } |
LEFT | RIGHT |