sockopt_posix.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. // Copyright 2012 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 || linux || netbsd || openbsd || solaris || windows || zos
  5. // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows zos
  6. package ipv4
  7. import (
  8. "net"
  9. "unsafe"
  10. "golang.org/x/net/bpf"
  11. "golang.org/x/net/internal/socket"
  12. )
  13. func (so *sockOpt) getMulticastInterface(c *socket.Conn) (*net.Interface, error) {
  14. switch so.typ {
  15. case ssoTypeIPMreqn:
  16. return so.getIPMreqn(c)
  17. default:
  18. return so.getMulticastIf(c)
  19. }
  20. }
  21. func (so *sockOpt) setMulticastInterface(c *socket.Conn, ifi *net.Interface) error {
  22. switch so.typ {
  23. case ssoTypeIPMreqn:
  24. return so.setIPMreqn(c, ifi, nil)
  25. default:
  26. return so.setMulticastIf(c, ifi)
  27. }
  28. }
  29. func (so *sockOpt) getICMPFilter(c *socket.Conn) (*ICMPFilter, error) {
  30. b := make([]byte, so.Len)
  31. n, err := so.Get(c, b)
  32. if err != nil {
  33. return nil, err
  34. }
  35. if n != sizeofICMPFilter {
  36. return nil, errNotImplemented
  37. }
  38. return (*ICMPFilter)(unsafe.Pointer(&b[0])), nil
  39. }
  40. func (so *sockOpt) setICMPFilter(c *socket.Conn, f *ICMPFilter) error {
  41. b := (*[sizeofICMPFilter]byte)(unsafe.Pointer(f))[:sizeofICMPFilter]
  42. return so.Set(c, b)
  43. }
  44. func (so *sockOpt) setGroup(c *socket.Conn, ifi *net.Interface, grp net.IP) error {
  45. switch so.typ {
  46. case ssoTypeIPMreq:
  47. return so.setIPMreq(c, ifi, grp)
  48. case ssoTypeIPMreqn:
  49. return so.setIPMreqn(c, ifi, grp)
  50. case ssoTypeGroupReq:
  51. return so.setGroupReq(c, ifi, grp)
  52. default:
  53. return errNotImplemented
  54. }
  55. }
  56. func (so *sockOpt) setSourceGroup(c *socket.Conn, ifi *net.Interface, grp, src net.IP) error {
  57. return so.setGroupSourceReq(c, ifi, grp, src)
  58. }
  59. func (so *sockOpt) setBPF(c *socket.Conn, f []bpf.RawInstruction) error {
  60. return so.setAttachFilter(c, f)
  61. }