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 8package ipv4 9 10import ( 11 "net" 12 "unsafe" 13 14 "golang.org/x/net/bpf" 15 "golang.org/x/net/internal/socket" 16) 17 18func (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 27func (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 36func (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 48func (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 53func (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 66func (so *sockOpt) setSourceGroup(c *socket.Conn, ifi *net.Interface, grp, src net.IP) error { 67 return so.setGroupSourceReq(c, ifi, grp, src) 68} 69 70func (so *sockOpt) setBPF(c *socket.Conn, f []bpf.RawInstruction) error { 71 return so.setAttachFilter(c, f) 72} 73