github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/net/ipv6/sockopt_unix.go (about) 1 // Copyright 2013 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 // +build darwin dragonfly freebsd linux netbsd openbsd 6 7 package ipv6 8 9 import ( 10 "net" 11 "os" 12 "unsafe" 13 ) 14 15 func getInt(fd int, opt *sockOpt) (int, error) { 16 if opt.name < 1 || opt.typ != ssoTypeInt { 17 return 0, errOpNoSupport 18 } 19 var i int32 20 l := sysSockoptLen(4) 21 if err := getsockopt(fd, opt.level, opt.name, unsafe.Pointer(&i), &l); err != nil { 22 return 0, os.NewSyscallError("getsockopt", err) 23 } 24 return int(i), nil 25 } 26 27 func setInt(fd int, opt *sockOpt, v int) error { 28 if opt.name < 1 || opt.typ != ssoTypeInt { 29 return errOpNoSupport 30 } 31 i := int32(v) 32 return os.NewSyscallError("setsockopt", setsockopt(fd, opt.level, opt.name, unsafe.Pointer(&i), sysSockoptLen(4))) 33 } 34 35 func getInterface(fd int, opt *sockOpt) (*net.Interface, error) { 36 if opt.name < 1 || opt.typ != ssoTypeInterface { 37 return nil, errOpNoSupport 38 } 39 var i int32 40 l := sysSockoptLen(4) 41 if err := getsockopt(fd, opt.level, opt.name, unsafe.Pointer(&i), &l); err != nil { 42 return nil, os.NewSyscallError("getsockopt", err) 43 } 44 if i == 0 { 45 return nil, nil 46 } 47 ifi, err := net.InterfaceByIndex(int(i)) 48 if err != nil { 49 return nil, err 50 } 51 return ifi, nil 52 } 53 54 func setInterface(fd int, opt *sockOpt, ifi *net.Interface) error { 55 if opt.name < 1 || opt.typ != ssoTypeInterface { 56 return errOpNoSupport 57 } 58 var i int32 59 if ifi != nil { 60 i = int32(ifi.Index) 61 } 62 return os.NewSyscallError("setsockopt", setsockopt(fd, opt.level, opt.name, unsafe.Pointer(&i), sysSockoptLen(4))) 63 } 64 65 func getICMPFilter(fd int, opt *sockOpt) (*ICMPFilter, error) { 66 if opt.name < 1 || opt.typ != ssoTypeICMPFilter { 67 return nil, errOpNoSupport 68 } 69 var f ICMPFilter 70 l := sysSockoptLen(sysSizeofICMPv6Filter) 71 if err := getsockopt(fd, opt.level, opt.name, unsafe.Pointer(&f.sysICMPv6Filter), &l); err != nil { 72 return nil, os.NewSyscallError("getsockopt", err) 73 } 74 return &f, nil 75 } 76 77 func setICMPFilter(fd int, opt *sockOpt, f *ICMPFilter) error { 78 if opt.name < 1 || opt.typ != ssoTypeICMPFilter { 79 return errOpNoSupport 80 } 81 return os.NewSyscallError("setsockopt", setsockopt(fd, opt.level, opt.name, unsafe.Pointer(&f.sysICMPv6Filter), sysSizeofICMPv6Filter)) 82 } 83 84 func getMTUInfo(fd int, opt *sockOpt) (*net.Interface, int, error) { 85 if opt.name < 1 || opt.typ != ssoTypeMTUInfo { 86 return nil, 0, errOpNoSupport 87 } 88 var mi sysIPv6Mtuinfo 89 l := sysSockoptLen(sysSizeofIPv6Mtuinfo) 90 if err := getsockopt(fd, opt.level, opt.name, unsafe.Pointer(&mi), &l); err != nil { 91 return nil, 0, os.NewSyscallError("getsockopt", err) 92 } 93 if mi.Addr.Scope_id == 0 { 94 return nil, int(mi.Mtu), nil 95 } 96 ifi, err := net.InterfaceByIndex(int(mi.Addr.Scope_id)) 97 if err != nil { 98 return nil, 0, err 99 } 100 return ifi, int(mi.Mtu), nil 101 } 102 103 func setGroup(fd int, opt *sockOpt, ifi *net.Interface, grp net.IP) error { 104 if opt.name < 1 { 105 return errOpNoSupport 106 } 107 switch opt.typ { 108 case ssoTypeIPMreq: 109 return setsockoptIPMreq(fd, opt, ifi, grp) 110 case ssoTypeGroupReq: 111 return setsockoptGroupReq(fd, opt, ifi, grp) 112 default: 113 return errOpNoSupport 114 } 115 } 116 117 func setSourceGroup(fd int, opt *sockOpt, ifi *net.Interface, grp, src net.IP) error { 118 if opt.name < 1 || opt.typ != ssoTypeGroupSourceReq { 119 return errOpNoSupport 120 } 121 return setsockoptGroupSourceReq(fd, opt, ifi, grp, src) 122 }