Mikio Hara | cdfc4ce | 2013-06-04 17:42:58 +0900 | [diff] [blame] | 1 | // Copyright 2013 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 | |
Mikio Hara | 9704df9 | 2014-04-27 22:30:08 +0900 | [diff] [blame] | 5 | // +build dragonfly freebsd linux netbsd openbsd |
Mikio Hara | cdfc4ce | 2013-06-04 17:42:58 +0900 | [diff] [blame] | 6 | |
| 7 | package ipv6 |
| 8 | |
| 9 | import ( |
| 10 | "os" |
Mikio Hara | 0c92458 | 2014-05-19 12:20:39 +0900 | [diff] [blame] | 11 | "syscall" |
Mikio Hara | b27e68b | 2013-11-06 21:33:49 +0900 | [diff] [blame] | 12 | "unsafe" |
Mikio Hara | cdfc4ce | 2013-06-04 17:42:58 +0900 | [diff] [blame] | 13 | ) |
| 14 | |
| 15 | func ipv6ReceiveTrafficClass(fd int) (bool, error) { |
Mikio Hara | 0c92458 | 2014-05-19 12:20:39 +0900 | [diff] [blame] | 16 | v, err := syscall.GetsockoptInt(fd, ianaProtocolIPv6, sysSockoptReceiveTrafficClass) |
| 17 | if err != nil { |
Mikio Hara | cdfc4ce | 2013-06-04 17:42:58 +0900 | [diff] [blame] | 18 | return false, os.NewSyscallError("getsockopt", err) |
| 19 | } |
| 20 | return v == 1, nil |
| 21 | } |
| 22 | |
| 23 | func setIPv6ReceiveTrafficClass(fd int, v bool) error { |
Mikio Hara | 0c92458 | 2014-05-19 12:20:39 +0900 | [diff] [blame] | 24 | return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIPv6, sysSockoptReceiveTrafficClass, boolint(v))) |
Mikio Hara | cdfc4ce | 2013-06-04 17:42:58 +0900 | [diff] [blame] | 25 | } |
| 26 | |
| 27 | func ipv6ReceiveHopLimit(fd int) (bool, error) { |
Mikio Hara | 0c92458 | 2014-05-19 12:20:39 +0900 | [diff] [blame] | 28 | v, err := syscall.GetsockoptInt(fd, ianaProtocolIPv6, sysSockoptReceiveHopLimit) |
| 29 | if err != nil { |
Mikio Hara | cdfc4ce | 2013-06-04 17:42:58 +0900 | [diff] [blame] | 30 | return false, os.NewSyscallError("getsockopt", err) |
| 31 | } |
| 32 | return v == 1, nil |
| 33 | } |
| 34 | |
| 35 | func setIPv6ReceiveHopLimit(fd int, v bool) error { |
Mikio Hara | 0c92458 | 2014-05-19 12:20:39 +0900 | [diff] [blame] | 36 | return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIPv6, sysSockoptReceiveHopLimit, boolint(v))) |
Mikio Hara | cdfc4ce | 2013-06-04 17:42:58 +0900 | [diff] [blame] | 37 | } |
| 38 | |
| 39 | func ipv6ReceivePacketInfo(fd int) (bool, error) { |
Mikio Hara | 0c92458 | 2014-05-19 12:20:39 +0900 | [diff] [blame] | 40 | v, err := syscall.GetsockoptInt(fd, ianaProtocolIPv6, sysSockoptReceivePacketInfo) |
| 41 | if err != nil { |
Mikio Hara | cdfc4ce | 2013-06-04 17:42:58 +0900 | [diff] [blame] | 42 | return false, os.NewSyscallError("getsockopt", err) |
| 43 | } |
| 44 | return v == 1, nil |
| 45 | } |
| 46 | |
| 47 | func setIPv6ReceivePacketInfo(fd int, v bool) error { |
Mikio Hara | 0c92458 | 2014-05-19 12:20:39 +0900 | [diff] [blame] | 48 | return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIPv6, sysSockoptReceivePacketInfo, boolint(v))) |
Mikio Hara | b27e68b | 2013-11-06 21:33:49 +0900 | [diff] [blame] | 49 | } |
| 50 | |
| 51 | func ipv6PathMTU(fd int) (int, error) { |
| 52 | var v sysMTUInfo |
| 53 | l := sysSockoptLen(sysSizeofMTUInfo) |
Mikio Hara | d587440 | 2014-04-28 11:32:27 +0900 | [diff] [blame] | 54 | if err := getsockopt(fd, ianaProtocolIPv6, sysSockoptPathMTU, unsafe.Pointer(&v), &l); err != nil { |
Mikio Hara | b27e68b | 2013-11-06 21:33:49 +0900 | [diff] [blame] | 55 | return 0, os.NewSyscallError("getsockopt", err) |
| 56 | } |
| 57 | return int(v.MTU), nil |
| 58 | } |
| 59 | |
| 60 | func ipv6ReceivePathMTU(fd int) (bool, error) { |
Mikio Hara | 0c92458 | 2014-05-19 12:20:39 +0900 | [diff] [blame] | 61 | v, err := syscall.GetsockoptInt(fd, ianaProtocolIPv6, sysSockoptReceivePathMTU) |
| 62 | if err != nil { |
Mikio Hara | b27e68b | 2013-11-06 21:33:49 +0900 | [diff] [blame] | 63 | return false, os.NewSyscallError("getsockopt", err) |
| 64 | } |
| 65 | return v == 1, nil |
| 66 | } |
| 67 | |
| 68 | func setIPv6ReceivePathMTU(fd int, v bool) error { |
Mikio Hara | 0c92458 | 2014-05-19 12:20:39 +0900 | [diff] [blame] | 69 | return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, ianaProtocolIPv6, sysSockoptReceivePathMTU, boolint(v))) |
Mikio Hara | b27e68b | 2013-11-06 21:33:49 +0900 | [diff] [blame] | 70 | } |
| 71 | |
| 72 | func ipv6ICMPFilter(fd int) (*ICMPFilter, error) { |
| 73 | var v ICMPFilter |
| 74 | l := sysSockoptLen(sysSizeofICMPFilter) |
Mikio Hara | d587440 | 2014-04-28 11:32:27 +0900 | [diff] [blame] | 75 | if err := getsockopt(fd, ianaProtocolIPv6ICMP, sysSockoptICMPFilter, unsafe.Pointer(&v.sysICMPFilter), &l); err != nil { |
Mikio Hara | b27e68b | 2013-11-06 21:33:49 +0900 | [diff] [blame] | 76 | return nil, os.NewSyscallError("getsockopt", err) |
| 77 | } |
| 78 | return &v, nil |
| 79 | } |
| 80 | |
| 81 | func setIPv6ICMPFilter(fd int, f *ICMPFilter) error { |
Mikio Hara | d587440 | 2014-04-28 11:32:27 +0900 | [diff] [blame] | 82 | return os.NewSyscallError("setsockopt", setsockopt(fd, ianaProtocolIPv6ICMP, sysSockoptICMPFilter, unsafe.Pointer(&f.sysICMPFilter), sysSizeofICMPFilter)) |
Mikio Hara | cdfc4ce | 2013-06-04 17:42:58 +0900 | [diff] [blame] | 83 | } |