sockopt_posix.go raw

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