sockopt_rfc3542_unix.go 2.9 KB

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