OSDN Git Service

new repo
[bytom/vapor.git] / vendor / golang.org / x / net / ipv6 / sockopt_posix.go
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 solaris windows
6
7 package ipv6
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         n, err := so.GetInt(c)
19         if err != nil {
20                 return nil, err
21         }
22         return net.InterfaceByIndex(n)
23 }
24
25 func (so *sockOpt) setMulticastInterface(c *socket.Conn, ifi *net.Interface) error {
26         var n int
27         if ifi != nil {
28                 n = ifi.Index
29         }
30         return so.SetInt(c, n)
31 }
32
33 func (so *sockOpt) getICMPFilter(c *socket.Conn) (*ICMPFilter, error) {
34         b := make([]byte, so.Len)
35         n, err := so.Get(c, b)
36         if err != nil {
37                 return nil, err
38         }
39         if n != sizeofICMPv6Filter {
40                 return nil, errOpNoSupport
41         }
42         return (*ICMPFilter)(unsafe.Pointer(&b[0])), nil
43 }
44
45 func (so *sockOpt) setICMPFilter(c *socket.Conn, f *ICMPFilter) error {
46         b := (*[sizeofICMPv6Filter]byte)(unsafe.Pointer(f))[:sizeofICMPv6Filter]
47         return so.Set(c, b)
48 }
49
50 func (so *sockOpt) getMTUInfo(c *socket.Conn) (*net.Interface, int, error) {
51         b := make([]byte, so.Len)
52         n, err := so.Get(c, b)
53         if err != nil {
54                 return nil, 0, err
55         }
56         if n != sizeofIPv6Mtuinfo {
57                 return nil, 0, errOpNoSupport
58         }
59         mi := (*ipv6Mtuinfo)(unsafe.Pointer(&b[0]))
60         if mi.Addr.Scope_id == 0 {
61                 return nil, int(mi.Mtu), nil
62         }
63         ifi, err := net.InterfaceByIndex(int(mi.Addr.Scope_id))
64         if err != nil {
65                 return nil, 0, err
66         }
67         return ifi, int(mi.Mtu), nil
68 }
69
70 func (so *sockOpt) setGroup(c *socket.Conn, ifi *net.Interface, grp net.IP) error {
71         switch so.typ {
72         case ssoTypeIPMreq:
73                 return so.setIPMreq(c, ifi, grp)
74         case ssoTypeGroupReq:
75                 return so.setGroupReq(c, ifi, grp)
76         default:
77                 return errOpNoSupport
78         }
79 }
80
81 func (so *sockOpt) setSourceGroup(c *socket.Conn, ifi *net.Interface, grp, src net.IP) error {
82         return so.setGroupSourceReq(c, ifi, grp, src)
83 }
84
85 func (so *sockOpt) setBPF(c *socket.Conn, f []bpf.RawInstruction) error {
86         return so.setAttachFilter(c, f)
87 }