sockoptip_posix.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. // Copyright 2011 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. //go:build aix || darwin || dragonfly || freebsd || hurd || linux || netbsd || openbsd || solaris || windows
  5. package net
  6. import (
  7. "runtime"
  8. "syscall"
  9. )
  10. func joinIPv4Group(fd *netFD, ifi *Interface, ip IP) error {
  11. mreq := &syscall.IPMreq{Multiaddr: [4]byte{ip[0], ip[1], ip[2], ip[3]}}
  12. if err := setIPv4MreqToInterface(mreq, ifi); err != nil {
  13. return err
  14. }
  15. err := fd.pfd.SetsockoptIPMreq(syscall.IPPROTO_IP, syscall.IP_ADD_MEMBERSHIP, mreq)
  16. runtime.KeepAlive(fd)
  17. return wrapSyscallError("setsockopt", err)
  18. }
  19. func setIPv6MulticastInterface(fd *netFD, ifi *Interface) error {
  20. var v int
  21. if ifi != nil {
  22. v = ifi.Index
  23. }
  24. err := fd.pfd.SetsockoptInt(syscall.IPPROTO_IPV6, syscall.IPV6_MULTICAST_IF, v)
  25. runtime.KeepAlive(fd)
  26. return wrapSyscallError("setsockopt", err)
  27. }
  28. func setIPv6MulticastLoopback(fd *netFD, v bool) error {
  29. err := fd.pfd.SetsockoptInt(syscall.IPPROTO_IPV6, syscall.IPV6_MULTICAST_LOOP, boolint(v))
  30. runtime.KeepAlive(fd)
  31. return wrapSyscallError("setsockopt", err)
  32. }
  33. func joinIPv6Group(fd *netFD, ifi *Interface, ip IP) error {
  34. mreq := &syscall.IPv6Mreq{}
  35. copy(mreq.Multiaddr[:], ip)
  36. if ifi != nil {
  37. mreq.Interface = uint32(ifi.Index)
  38. }
  39. err := fd.pfd.SetsockoptIPv6Mreq(syscall.IPPROTO_IPV6, syscall.IPV6_JOIN_GROUP, mreq)
  40. runtime.KeepAlive(fd)
  41. return wrapSyscallError("setsockopt", err)
  42. }