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