sockopt_rfc3493_windows.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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. package ipv6
  5. import (
  6. "net"
  7. "os"
  8. "syscall"
  9. "unsafe"
  10. )
  11. func ipv6TrafficClass(fd syscall.Handle) (int, error) {
  12. // TODO(mikio): Implement this
  13. return 0, syscall.EWINDOWS
  14. }
  15. func setIPv6TrafficClass(fd syscall.Handle, v int) error {
  16. // TODO(mikio): Implement this
  17. return syscall.EWINDOWS
  18. }
  19. func ipv6HopLimit(fd syscall.Handle) (int, error) {
  20. var v int32
  21. l := int32(4)
  22. if err := syscall.Getsockopt(fd, ianaProtocolIPv6, syscall.IPV6_UNICAST_HOPS, (*byte)(unsafe.Pointer(&v)), &l); err != nil {
  23. return 0, os.NewSyscallError("getsockopt", err)
  24. }
  25. return int(v), nil
  26. }
  27. func setIPv6HopLimit(fd syscall.Handle, v int) error {
  28. vv := int32(v)
  29. return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, ianaProtocolIPv6, syscall.IPV6_UNICAST_HOPS, (*byte)(unsafe.Pointer(&vv)), 4))
  30. }
  31. func ipv6Checksum(fd syscall.Handle) (bool, int, error) {
  32. // TODO(mikio): Implement this
  33. return false, 0, syscall.EWINDOWS
  34. }
  35. func ipv6MulticastHopLimit(fd syscall.Handle) (int, error) {
  36. var v int32
  37. l := int32(4)
  38. if err := syscall.Getsockopt(fd, ianaProtocolIPv6, syscall.IPV6_MULTICAST_HOPS, (*byte)(unsafe.Pointer(&v)), &l); err != nil {
  39. return 0, os.NewSyscallError("getsockopt", err)
  40. }
  41. return int(v), nil
  42. }
  43. func setIPv6MulticastHopLimit(fd syscall.Handle, v int) error {
  44. vv := int32(v)
  45. return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, ianaProtocolIPv6, syscall.IPV6_MULTICAST_HOPS, (*byte)(unsafe.Pointer(&vv)), 4))
  46. }
  47. func ipv6MulticastInterface(fd syscall.Handle) (*net.Interface, error) {
  48. var v int32
  49. l := int32(4)
  50. if err := syscall.Getsockopt(fd, ianaProtocolIPv6, syscall.IPV6_MULTICAST_IF, (*byte)(unsafe.Pointer(&v)), &l); err != nil {
  51. return nil, os.NewSyscallError("getsockopt", err)
  52. }
  53. if v == 0 {
  54. return nil, nil
  55. }
  56. ifi, err := net.InterfaceByIndex(int(v))
  57. if err != nil {
  58. return nil, err
  59. }
  60. return ifi, nil
  61. }
  62. func setIPv6MulticastInterface(fd syscall.Handle, ifi *net.Interface) error {
  63. var v int32
  64. if ifi != nil {
  65. v = int32(ifi.Index)
  66. }
  67. return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, ianaProtocolIPv6, syscall.IPV6_MULTICAST_IF, (*byte)(unsafe.Pointer(&v)), 4))
  68. }
  69. func ipv6MulticastLoopback(fd syscall.Handle) (bool, error) {
  70. var v int32
  71. l := int32(4)
  72. if err := syscall.Getsockopt(fd, ianaProtocolIPv6, syscall.IPV6_MULTICAST_LOOP, (*byte)(unsafe.Pointer(&v)), &l); err != nil {
  73. return false, os.NewSyscallError("getsockopt", err)
  74. }
  75. return v == 1, nil
  76. }
  77. func setIPv6MulticastLoopback(fd syscall.Handle, v bool) error {
  78. vv := int32(boolint(v))
  79. return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, ianaProtocolIPv6, syscall.IPV6_MULTICAST_LOOP, (*byte)(unsafe.Pointer(&vv)), 4))
  80. }
  81. func joinIPv6Group(fd syscall.Handle, ifi *net.Interface, grp net.IP) error {
  82. mreq := syscall.IPv6Mreq{}
  83. copy(mreq.Multiaddr[:], grp)
  84. if ifi != nil {
  85. mreq.Interface = uint32(ifi.Index)
  86. }
  87. return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, ianaProtocolIPv6, syscall.IPV6_JOIN_GROUP, (*byte)(unsafe.Pointer(&mreq)), int32(unsafe.Sizeof(mreq))))
  88. }
  89. func leaveIPv6Group(fd syscall.Handle, ifi *net.Interface, grp net.IP) error {
  90. mreq := syscall.IPv6Mreq{}
  91. copy(mreq.Multiaddr[:], grp)
  92. if ifi != nil {
  93. mreq.Interface = uint32(ifi.Index)
  94. }
  95. return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, ianaProtocolIPv6, syscall.IPV6_LEAVE_GROUP, (*byte)(unsafe.Pointer(&mreq)), int32(unsafe.Sizeof(mreq))))
  96. }
  97. func setIPv6Checksum(fd syscall.Handle, on bool, offset int) error {
  98. // TODO(mikio): Implement this
  99. return syscall.EWINDOWS
  100. }