Add new vendored files.
authorBrian Brazil <brian.brazil@robustperception.io>
Wed, 20 Sep 2017 12:47:44 +0000 (13:47 +0100)
committerBrian Brazil <brian.brazil@robustperception.io>
Wed, 20 Sep 2017 12:47:44 +0000 (13:47 +0100)
150 files changed:
vendor/github.com/miekg/dns/compress_generate.go [new file with mode: 0644]
vendor/github.com/miekg/dns/dane.go [new file with mode: 0644]
vendor/github.com/miekg/dns/smimea.go [new file with mode: 0644]
vendor/github.com/miekg/dns/zcompress.go [new file with mode: 0644]
vendor/github.com/prometheus/client_golang/prometheus/labels.go [new file with mode: 0644]
vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator.go [new file with mode: 0644]
vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator_pre_1_8.go [new file with mode: 0644]
vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.go [new file with mode: 0644]
vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client_1_8.go [new file with mode: 0644]
vendor/github.com/prometheus/procfs/MAINTAINERS.md [new file with mode: 0644]
vendor/github.com/prometheus/procfs/buddyinfo.go [new file with mode: 0644]
vendor/github.com/prometheus/procfs/mountstats.go [new file with mode: 0644]
vendor/github.com/prometheus/procfs/ttar [new file with mode: 0755]
vendor/github.com/prometheus/procfs/xfrm.go [new file with mode: 0644]
vendor/github.com/prometheus/procfs/xfs/parse.go [new file with mode: 0644]
vendor/github.com/prometheus/procfs/xfs/xfs.go [new file with mode: 0644]
vendor/golang.org/x/net/bpf/asm.go [new file with mode: 0644]
vendor/golang.org/x/net/bpf/constants.go [new file with mode: 0644]
vendor/golang.org/x/net/bpf/doc.go [new file with mode: 0644]
vendor/golang.org/x/net/bpf/instructions.go [new file with mode: 0644]
vendor/golang.org/x/net/bpf/setter.go [new file with mode: 0644]
vendor/golang.org/x/net/bpf/vm.go [new file with mode: 0644]
vendor/golang.org/x/net/bpf/vm_instructions.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/cmsghdr.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/cmsghdr_bsd.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/cmsghdr_linux_32bit.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/cmsghdr_solaris_64bit.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/cmsghdr_stub.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/defs_darwin.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/defs_dragonfly.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/defs_freebsd.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/defs_linux.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/defs_netbsd.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/defs_openbsd.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/defs_solaris.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/error_unix.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/error_windows.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/iovec_32bit.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/iovec_64bit.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/iovec_solaris_64bit.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/iovec_stub.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/mmsghdr_stub.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/mmsghdr_unix.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/msghdr_bsd.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/msghdr_bsdvar.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/msghdr_linux.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/msghdr_linux_32bit.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/msghdr_openbsd.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/msghdr_solaris_64bit.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/msghdr_stub.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/rawconn.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/rawconn_mmsg.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/rawconn_msg.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/rawconn_nommsg.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/rawconn_nomsg.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/rawconn_stub.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/reflect.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/socket.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/sys.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/sys_bsd.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/sys_bsdvar.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/sys_darwin.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/sys_dragonfly.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/sys_linux.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/sys_linux_386.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/sys_linux_386.s [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/sys_linux_amd64.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/sys_linux_arm.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/sys_linux_arm64.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/sys_linux_mips.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/sys_linux_mips64.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/sys_linux_mips64le.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/sys_linux_mipsle.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/sys_linux_ppc64.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/sys_linux_ppc64le.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/sys_linux_s390x.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/sys_linux_s390x.s [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/sys_netbsd.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/sys_posix.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/sys_solaris.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/sys_solaris_amd64.s [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/sys_stub.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/sys_unix.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/sys_windows.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/zsys_darwin_386.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/zsys_darwin_amd64.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/zsys_darwin_arm.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/zsys_dragonfly_amd64.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/zsys_freebsd_386.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/zsys_freebsd_amd64.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/zsys_linux_386.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/zsys_linux_amd64.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/zsys_linux_arm.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/zsys_linux_arm64.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/zsys_linux_mips.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/zsys_linux_mips64.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/zsys_linux_mips64le.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/zsys_linux_mipsle.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64le.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/zsys_linux_s390x.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/zsys_netbsd_386.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/zsys_netbsd_amd64.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/zsys_openbsd_386.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/zsys_openbsd_amd64.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm.go [new file with mode: 0644]
vendor/golang.org/x/net/internal/socket/zsys_solaris_amd64.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv4/batch.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv4/dgramopt.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv4/genericopt.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv4/packet_go1_8.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv4/packet_go1_9.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv4/payload_cmsg_go1_8.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv4/payload_cmsg_go1_9.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv4/sockopt_posix.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv4/sys_asmreq.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv4/sys_asmreq_stub.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv4/sys_asmreqn.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv4/sys_asmreqn_stub.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv4/sys_bpf.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv4/sys_bpf_stub.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv4/sys_dragonfly.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv4/sys_solaris.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv4/sys_ssmreq.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv4/sys_ssmreq_stub.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv4/zsys_linux_mips.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv4/zsys_linux_mipsle.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv4/zsys_linux_ppc.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv4/zsys_linux_s390x.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv6/batch.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv6/dgramopt.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv6/genericopt.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv6/payload_cmsg_go1_8.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv6/payload_cmsg_go1_9.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv6/sockopt_posix.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv6/sys_asmreq.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv6/sys_asmreq_stub.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv6/sys_bpf.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv6/sys_bpf_stub.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv6/sys_solaris.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv6/sys_ssmreq.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv6/sys_ssmreq_stub.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv6/zsys_linux_mips.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv6/zsys_linux_mipsle.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv6/zsys_linux_ppc.go [new file with mode: 0644]
vendor/golang.org/x/net/ipv6/zsys_linux_s390x.go [new file with mode: 0644]

diff --git a/vendor/github.com/miekg/dns/compress_generate.go b/vendor/github.com/miekg/dns/compress_generate.go
new file mode 100644 (file)
index 0000000..1a301e9
--- /dev/null
@@ -0,0 +1,184 @@
+//+build ignore
+
+// compression_generate.go is meant to run with go generate. It will use
+// go/{importer,types} to track down all the RR struct types. Then for each type
+// it will look to see if there are (compressible) names, if so it will add that
+// type to compressionLenHelperType and comressionLenSearchType which "fake" the
+// compression so that Len() is fast.
+package main
+
+import (
+       "bytes"
+       "fmt"
+       "go/format"
+       "go/importer"
+       "go/types"
+       "log"
+       "os"
+)
+
+var packageHdr = `
+// *** DO NOT MODIFY ***
+// AUTOGENERATED BY go generate from compress_generate.go
+
+package dns
+
+`
+
+// getTypeStruct will take a type and the package scope, and return the
+// (innermost) struct if the type is considered a RR type (currently defined as
+// those structs beginning with a RR_Header, could be redefined as implementing
+// the RR interface). The bool return value indicates if embedded structs were
+// resolved.
+func getTypeStruct(t types.Type, scope *types.Scope) (*types.Struct, bool) {
+       st, ok := t.Underlying().(*types.Struct)
+       if !ok {
+               return nil, false
+       }
+       if st.Field(0).Type() == scope.Lookup("RR_Header").Type() {
+               return st, false
+       }
+       if st.Field(0).Anonymous() {
+               st, _ := getTypeStruct(st.Field(0).Type(), scope)
+               return st, true
+       }
+       return nil, false
+}
+
+func main() {
+       // Import and type-check the package
+       pkg, err := importer.Default().Import("github.com/miekg/dns")
+       fatalIfErr(err)
+       scope := pkg.Scope()
+
+       domainTypes := map[string]bool{}  // Types that have a domain name in them (either comressible or not).
+       cdomainTypes := map[string]bool{} // Types that have a compressible domain name in them (subset of domainType)
+       for _, name := range scope.Names() {
+               o := scope.Lookup(name)
+               if o == nil || !o.Exported() {
+                       continue
+               }
+               st, _ := getTypeStruct(o.Type(), scope)
+               if st == nil {
+                       continue
+               }
+               if name == "PrivateRR" {
+                       continue
+               }
+
+               if scope.Lookup("Type"+o.Name()) == nil && o.Name() != "RFC3597" {
+                       log.Fatalf("Constant Type%s does not exist.", o.Name())
+               }
+
+               for i := 1; i < st.NumFields(); i++ {
+                       if _, ok := st.Field(i).Type().(*types.Slice); ok {
+                               if st.Tag(i) == `dns:"domain-name"` {
+                                       domainTypes[o.Name()] = true
+                               }
+                               if st.Tag(i) == `dns:"cdomain-name"` {
+                                       cdomainTypes[o.Name()] = true
+                                       domainTypes[o.Name()] = true
+                               }
+                               continue
+                       }
+
+                       switch {
+                       case st.Tag(i) == `dns:"domain-name"`:
+                               domainTypes[o.Name()] = true
+                       case st.Tag(i) == `dns:"cdomain-name"`:
+                               cdomainTypes[o.Name()] = true
+                               domainTypes[o.Name()] = true
+                       }
+               }
+       }
+
+       b := &bytes.Buffer{}
+       b.WriteString(packageHdr)
+
+       // compressionLenHelperType - all types that have domain-name/cdomain-name can be used for compressing names
+
+       fmt.Fprint(b, "func compressionLenHelperType(c map[string]int, r RR) {\n")
+       fmt.Fprint(b, "switch x := r.(type) {\n")
+       for name, _ := range domainTypes {
+               o := scope.Lookup(name)
+               st, _ := getTypeStruct(o.Type(), scope)
+
+               fmt.Fprintf(b, "case *%s:\n", name)
+               for i := 1; i < st.NumFields(); i++ {
+                       out := func(s string) { fmt.Fprintf(b, "compressionLenHelper(c, x.%s)\n", st.Field(i).Name()) }
+
+                       if _, ok := st.Field(i).Type().(*types.Slice); ok {
+                               switch st.Tag(i) {
+                               case `dns:"domain-name"`:
+                                       fallthrough
+                               case `dns:"cdomain-name"`:
+                                       // For HIP we need to slice over the elements in this slice.
+                                       fmt.Fprintf(b, `for i := range x.%s {
+                                               compressionLenHelper(c, x.%s[i])
+                                       }
+`, st.Field(i).Name(), st.Field(i).Name())
+                               }
+                               continue
+                       }
+
+                       switch {
+                       case st.Tag(i) == `dns:"cdomain-name"`:
+                               fallthrough
+                       case st.Tag(i) == `dns:"domain-name"`:
+                               out(st.Field(i).Name())
+                       }
+               }
+       }
+       fmt.Fprintln(b, "}\n}\n\n")
+
+       // compressionLenSearchType - search cdomain-tags types for compressible names.
+
+       fmt.Fprint(b, "func compressionLenSearchType(c map[string]int, r RR) (int, bool) {\n")
+       fmt.Fprint(b, "switch x := r.(type) {\n")
+       for name, _ := range cdomainTypes {
+               o := scope.Lookup(name)
+               st, _ := getTypeStruct(o.Type(), scope)
+
+               fmt.Fprintf(b, "case *%s:\n", name)
+               j := 1
+               for i := 1; i < st.NumFields(); i++ {
+                       out := func(s string, j int) {
+                               fmt.Fprintf(b, "k%d, ok%d := compressionLenSearch(c, x.%s)\n", j, j, st.Field(i).Name())
+                       }
+
+                       // There are no slice types with names that can be compressed.
+
+                       switch {
+                       case st.Tag(i) == `dns:"cdomain-name"`:
+                               out(st.Field(i).Name(), j)
+                               j++
+                       }
+               }
+               k := "k1"
+               ok := "ok1"
+               for i := 2; i < j; i++ {
+                       k += fmt.Sprintf(" + k%d", i)
+                       ok += fmt.Sprintf(" && ok%d", i)
+               }
+               fmt.Fprintf(b, "return %s, %s\n", k, ok)
+       }
+       fmt.Fprintln(b, "}\nreturn 0, false\n}\n\n")
+
+       // gofmt
+       res, err := format.Source(b.Bytes())
+       if err != nil {
+               b.WriteTo(os.Stderr)
+               log.Fatal(err)
+       }
+
+       f, err := os.Create("zcompress.go")
+       fatalIfErr(err)
+       defer f.Close()
+       f.Write(res)
+}
+
+func fatalIfErr(err error) {
+       if err != nil {
+               log.Fatal(err)
+       }
+}
diff --git a/vendor/github.com/miekg/dns/dane.go b/vendor/github.com/miekg/dns/dane.go
new file mode 100644 (file)
index 0000000..8c4a14e
--- /dev/null
@@ -0,0 +1,43 @@
+package dns
+
+import (
+       "crypto/sha256"
+       "crypto/sha512"
+       "crypto/x509"
+       "encoding/hex"
+       "errors"
+)
+
+// CertificateToDANE converts a certificate to a hex string as used in the TLSA or SMIMEA records.
+func CertificateToDANE(selector, matchingType uint8, cert *x509.Certificate) (string, error) {
+       switch matchingType {
+       case 0:
+               switch selector {
+               case 0:
+                       return hex.EncodeToString(cert.Raw), nil
+               case 1:
+                       return hex.EncodeToString(cert.RawSubjectPublicKeyInfo), nil
+               }
+       case 1:
+               h := sha256.New()
+               switch selector {
+               case 0:
+                       h.Write(cert.Raw)
+                       return hex.EncodeToString(h.Sum(nil)), nil
+               case 1:
+                       h.Write(cert.RawSubjectPublicKeyInfo)
+                       return hex.EncodeToString(h.Sum(nil)), nil
+               }
+       case 2:
+               h := sha512.New()
+               switch selector {
+               case 0:
+                       h.Write(cert.Raw)
+                       return hex.EncodeToString(h.Sum(nil)), nil
+               case 1:
+                       h.Write(cert.RawSubjectPublicKeyInfo)
+                       return hex.EncodeToString(h.Sum(nil)), nil
+               }
+       }
+       return "", errors.New("dns: bad MatchingType or Selector")
+}
diff --git a/vendor/github.com/miekg/dns/smimea.go b/vendor/github.com/miekg/dns/smimea.go
new file mode 100644 (file)
index 0000000..4e7ded4
--- /dev/null
@@ -0,0 +1,47 @@
+package dns
+
+import (
+       "crypto/sha256"
+       "crypto/x509"
+       "encoding/hex"
+)
+
+// Sign creates a SMIMEA record from an SSL certificate.
+func (r *SMIMEA) Sign(usage, selector, matchingType int, cert *x509.Certificate) (err error) {
+       r.Hdr.Rrtype = TypeSMIMEA
+       r.Usage = uint8(usage)
+       r.Selector = uint8(selector)
+       r.MatchingType = uint8(matchingType)
+
+       r.Certificate, err = CertificateToDANE(r.Selector, r.MatchingType, cert)
+       if err != nil {
+               return err
+       }
+       return nil
+}
+
+// Verify verifies a SMIMEA record against an SSL certificate. If it is OK
+// a nil error is returned.
+func (r *SMIMEA) Verify(cert *x509.Certificate) error {
+       c, err := CertificateToDANE(r.Selector, r.MatchingType, cert)
+       if err != nil {
+               return err // Not also ErrSig?
+       }
+       if r.Certificate == c {
+               return nil
+       }
+       return ErrSig // ErrSig, really?
+}
+
+// SMIMEAName returns the ownername of a SMIMEA resource record as per the
+// format specified in RFC 'draft-ietf-dane-smime-12' Section 2 and 3
+func SMIMEAName(email, domain string) (string, error) {
+       hasher := sha256.New()
+       hasher.Write([]byte(email))
+
+       // RFC Section 3: "The local-part is hashed using the SHA2-256
+       // algorithm with the hash truncated to 28 octets and
+       // represented in its hexadecimal representation to become the
+       // left-most label in the prepared domain name"
+       return hex.EncodeToString(hasher.Sum(nil)[:28]) + "." + "_smimecert." + domain, nil
+}
diff --git a/vendor/github.com/miekg/dns/zcompress.go b/vendor/github.com/miekg/dns/zcompress.go
new file mode 100644 (file)
index 0000000..b277978
--- /dev/null
@@ -0,0 +1,119 @@
+// *** DO NOT MODIFY ***
+// AUTOGENERATED BY go generate from compress_generate.go
+
+package dns
+
+func compressionLenHelperType(c map[string]int, r RR) {
+       switch x := r.(type) {
+       case *PTR:
+               compressionLenHelper(c, x.Ptr)
+       case *SOA:
+               compressionLenHelper(c, x.Ns)
+               compressionLenHelper(c, x.Mbox)
+       case *AFSDB:
+               compressionLenHelper(c, x.Hostname)
+       case *HIP:
+               for i := range x.RendezvousServers {
+                       compressionLenHelper(c, x.RendezvousServers[i])
+               }
+       case *LP:
+               compressionLenHelper(c, x.Fqdn)
+       case *CNAME:
+               compressionLenHelper(c, x.Target)
+       case *MB:
+               compressionLenHelper(c, x.Mb)
+       case *RP:
+               compressionLenHelper(c, x.Mbox)
+               compressionLenHelper(c, x.Txt)
+       case *RRSIG:
+               compressionLenHelper(c, x.SignerName)
+       case *MF:
+               compressionLenHelper(c, x.Mf)
+       case *MINFO:
+               compressionLenHelper(c, x.Rmail)
+               compressionLenHelper(c, x.Email)
+       case *SIG:
+               compressionLenHelper(c, x.SignerName)
+       case *SRV:
+               compressionLenHelper(c, x.Target)
+       case *TSIG:
+               compressionLenHelper(c, x.Algorithm)
+       case *KX:
+               compressionLenHelper(c, x.Exchanger)
+       case *MG:
+               compressionLenHelper(c, x.Mg)
+       case *NSAPPTR:
+               compressionLenHelper(c, x.Ptr)
+       case *PX:
+               compressionLenHelper(c, x.Map822)
+               compressionLenHelper(c, x.Mapx400)
+       case *DNAME:
+               compressionLenHelper(c, x.Target)
+       case *MR:
+               compressionLenHelper(c, x.Mr)
+       case *MX:
+               compressionLenHelper(c, x.Mx)
+       case *TKEY:
+               compressionLenHelper(c, x.Algorithm)
+       case *NSEC:
+               compressionLenHelper(c, x.NextDomain)
+       case *TALINK:
+               compressionLenHelper(c, x.PreviousName)
+               compressionLenHelper(c, x.NextName)
+       case *MD:
+               compressionLenHelper(c, x.Md)
+       case *NAPTR:
+               compressionLenHelper(c, x.Replacement)
+       case *NS:
+               compressionLenHelper(c, x.Ns)
+       case *RT:
+               compressionLenHelper(c, x.Host)
+       }
+}
+
+func compressionLenSearchType(c map[string]int, r RR) (int, bool) {
+       switch x := r.(type) {
+       case *MG:
+               k1, ok1 := compressionLenSearch(c, x.Mg)
+               return k1, ok1
+       case *PTR:
+               k1, ok1 := compressionLenSearch(c, x.Ptr)
+               return k1, ok1
+       case *AFSDB:
+               k1, ok1 := compressionLenSearch(c, x.Hostname)
+               return k1, ok1
+       case *MB:
+               k1, ok1 := compressionLenSearch(c, x.Mb)
+               return k1, ok1
+       case *MD:
+               k1, ok1 := compressionLenSearch(c, x.Md)
+               return k1, ok1
+       case *MF:
+               k1, ok1 := compressionLenSearch(c, x.Mf)
+               return k1, ok1
+       case *NS:
+               k1, ok1 := compressionLenSearch(c, x.Ns)
+               return k1, ok1
+       case *RT:
+               k1, ok1 := compressionLenSearch(c, x.Host)
+               return k1, ok1
+       case *SOA:
+               k1, ok1 := compressionLenSearch(c, x.Ns)
+               k2, ok2 := compressionLenSearch(c, x.Mbox)
+               return k1 + k2, ok1 && ok2
+       case *CNAME:
+               k1, ok1 := compressionLenSearch(c, x.Target)
+               return k1, ok1
+       case *MINFO:
+               k1, ok1 := compressionLenSearch(c, x.Rmail)
+               k2, ok2 := compressionLenSearch(c, x.Email)
+               return k1 + k2, ok1 && ok2
+       case *MR:
+               k1, ok1 := compressionLenSearch(c, x.Mr)
+               return k1, ok1
+       case *MX:
+               k1, ok1 := compressionLenSearch(c, x.Mx)
+               return k1, ok1
+       }
+       return 0, false
+}
diff --git a/vendor/github.com/prometheus/client_golang/prometheus/labels.go b/vendor/github.com/prometheus/client_golang/prometheus/labels.go
new file mode 100644 (file)
index 0000000..2502e37
--- /dev/null
@@ -0,0 +1,57 @@
+package prometheus
+
+import (
+       "errors"
+       "fmt"
+       "strings"
+       "unicode/utf8"
+
+       "github.com/prometheus/common/model"
+)
+
+// Labels represents a collection of label name -> value mappings. This type is
+// commonly used with the With(Labels) and GetMetricWith(Labels) methods of
+// metric vector Collectors, e.g.:
+//     myVec.With(Labels{"code": "404", "method": "GET"}).Add(42)
+//
+// The other use-case is the specification of constant label pairs in Opts or to
+// create a Desc.
+type Labels map[string]string
+
+// reservedLabelPrefix is a prefix which is not legal in user-supplied
+// label names.
+const reservedLabelPrefix = "__"
+
+var errInconsistentCardinality = errors.New("inconsistent label cardinality")
+
+func validateValuesInLabels(labels Labels, expectedNumberOfValues int) error {
+       if len(labels) != expectedNumberOfValues {
+               return errInconsistentCardinality
+       }
+
+       for name, val := range labels {
+               if !utf8.ValidString(val) {
+                       return fmt.Errorf("label %s: value %q is not valid UTF-8", name, val)
+               }
+       }
+
+       return nil
+}
+
+func validateLabelValues(vals []string, expectedNumberOfValues int) error {
+       if len(vals) != expectedNumberOfValues {
+               return errInconsistentCardinality
+       }
+
+       for _, val := range vals {
+               if !utf8.ValidString(val) {
+                       return fmt.Errorf("label value %q is not valid UTF-8", val)
+               }
+       }
+
+       return nil
+}
+
+func checkLabelName(l string) bool {
+       return model.LabelName(l).IsValid() && !strings.HasPrefix(l, reservedLabelPrefix)
+}
diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator.go
new file mode 100644 (file)
index 0000000..5ee095b
--- /dev/null
@@ -0,0 +1,199 @@
+// Copyright 2017 The Prometheus Authors
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package promhttp
+
+import (
+       "bufio"
+       "io"
+       "net"
+       "net/http"
+)
+
+const (
+       closeNotifier = 1 << iota
+       flusher
+       hijacker
+       readerFrom
+       pusher
+)
+
+type delegator interface {
+       http.ResponseWriter
+
+       Status() int
+       Written() int64
+}
+
+type responseWriterDelegator struct {
+       http.ResponseWriter
+
+       handler, method    string
+       status             int
+       written            int64
+       wroteHeader        bool
+       observeWriteHeader func(int)
+}
+
+func (r *responseWriterDelegator) Status() int {
+       return r.status
+}
+
+func (r *responseWriterDelegator) Written() int64 {
+       return r.written
+}
+
+func (r *responseWriterDelegator) WriteHeader(code int) {
+       r.status = code
+       r.wroteHeader = true
+       r.ResponseWriter.WriteHeader(code)
+       if r.observeWriteHeader != nil {
+               r.observeWriteHeader(code)
+       }
+}
+
+func (r *responseWriterDelegator) Write(b []byte) (int, error) {
+       if !r.wroteHeader {
+               r.WriteHeader(http.StatusOK)
+       }
+       n, err := r.ResponseWriter.Write(b)
+       r.written += int64(n)
+       return n, err
+}
+
+type closeNotifierDelegator struct{ *responseWriterDelegator }
+type flusherDelegator struct{ *responseWriterDelegator }
+type hijackerDelegator struct{ *responseWriterDelegator }
+type readerFromDelegator struct{ *responseWriterDelegator }
+
+func (d *closeNotifierDelegator) CloseNotify() <-chan bool {
+       return d.ResponseWriter.(http.CloseNotifier).CloseNotify()
+}
+func (d *flusherDelegator) Flush() {
+       d.ResponseWriter.(http.Flusher).Flush()
+}
+func (d *hijackerDelegator) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+       return d.ResponseWriter.(http.Hijacker).Hijack()
+}
+func (d *readerFromDelegator) ReadFrom(re io.Reader) (int64, error) {
+       if !d.wroteHeader {
+               d.WriteHeader(http.StatusOK)
+       }
+       n, err := d.ResponseWriter.(io.ReaderFrom).ReadFrom(re)
+       d.written += n
+       return n, err
+}
+
+var pickDelegator = make([]func(*responseWriterDelegator) delegator, 32)
+
+func init() {
+       // TODO(beorn7): Code generation would help here.
+       pickDelegator[0] = func(d *responseWriterDelegator) delegator { // 0
+               return d
+       }
+       pickDelegator[closeNotifier] = func(d *responseWriterDelegator) delegator { // 1
+               return closeNotifierDelegator{d}
+       }
+       pickDelegator[flusher] = func(d *responseWriterDelegator) delegator { // 2
+               return flusherDelegator{d}
+       }
+       pickDelegator[flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 3
+               return struct {
+                       *responseWriterDelegator
+                       http.Flusher
+                       http.CloseNotifier
+               }{d, &flusherDelegator{d}, &closeNotifierDelegator{d}}
+       }
+       pickDelegator[hijacker] = func(d *responseWriterDelegator) delegator { // 4
+               return hijackerDelegator{d}
+       }
+       pickDelegator[hijacker+closeNotifier] = func(d *responseWriterDelegator) delegator { // 5
+               return struct {
+                       *responseWriterDelegator
+                       http.Hijacker
+                       http.CloseNotifier
+               }{d, &hijackerDelegator{d}, &closeNotifierDelegator{d}}
+       }
+       pickDelegator[hijacker+flusher] = func(d *responseWriterDelegator) delegator { // 6
+               return struct {
+                       *responseWriterDelegator
+                       http.Hijacker
+                       http.Flusher
+               }{d, &hijackerDelegator{d}, &flusherDelegator{d}}
+       }
+       pickDelegator[hijacker+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 7
+               return struct {
+                       *responseWriterDelegator
+                       http.Hijacker
+                       http.Flusher
+                       http.CloseNotifier
+               }{d, &hijackerDelegator{d}, &flusherDelegator{d}, &closeNotifierDelegator{d}}
+       }
+       pickDelegator[readerFrom] = func(d *responseWriterDelegator) delegator { // 8
+               return readerFromDelegator{d}
+       }
+       pickDelegator[readerFrom+closeNotifier] = func(d *responseWriterDelegator) delegator { // 9
+               return struct {
+                       *responseWriterDelegator
+                       io.ReaderFrom
+                       http.CloseNotifier
+               }{d, &readerFromDelegator{d}, &closeNotifierDelegator{d}}
+       }
+       pickDelegator[readerFrom+flusher] = func(d *responseWriterDelegator) delegator { // 10
+               return struct {
+                       *responseWriterDelegator
+                       io.ReaderFrom
+                       http.Flusher
+               }{d, &readerFromDelegator{d}, &flusherDelegator{d}}
+       }
+       pickDelegator[readerFrom+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 11
+               return struct {
+                       *responseWriterDelegator
+                       io.ReaderFrom
+                       http.Flusher
+                       http.CloseNotifier
+               }{d, &readerFromDelegator{d}, &flusherDelegator{d}, &closeNotifierDelegator{d}}
+       }
+       pickDelegator[readerFrom+hijacker] = func(d *responseWriterDelegator) delegator { // 12
+               return struct {
+                       *responseWriterDelegator
+                       io.ReaderFrom
+                       http.Hijacker
+               }{d, &readerFromDelegator{d}, &hijackerDelegator{d}}
+       }
+       pickDelegator[readerFrom+hijacker+closeNotifier] = func(d *responseWriterDelegator) delegator { // 13
+               return struct {
+                       *responseWriterDelegator
+                       io.ReaderFrom
+                       http.Hijacker
+                       http.CloseNotifier
+               }{d, &readerFromDelegator{d}, &hijackerDelegator{d}, &closeNotifierDelegator{d}}
+       }
+       pickDelegator[readerFrom+hijacker+flusher] = func(d *responseWriterDelegator) delegator { // 14
+               return struct {
+                       *responseWriterDelegator
+                       io.ReaderFrom
+                       http.Hijacker
+                       http.Flusher
+               }{d, &readerFromDelegator{d}, &hijackerDelegator{d}, &flusherDelegator{d}}
+       }
+       pickDelegator[readerFrom+hijacker+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 15
+               return struct {
+                       *responseWriterDelegator
+                       io.ReaderFrom
+                       http.Hijacker
+                       http.Flusher
+                       http.CloseNotifier
+               }{d, &readerFromDelegator{d}, &hijackerDelegator{d}, &flusherDelegator{d}, &closeNotifierDelegator{d}}
+       }
+}
diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator_pre_1_8.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator_pre_1_8.go
new file mode 100644 (file)
index 0000000..8bb9b8b
--- /dev/null
@@ -0,0 +1,44 @@
+// Copyright 2017 The Prometheus Authors
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// +build !go1.8
+
+package promhttp
+
+import (
+       "io"
+       "net/http"
+)
+
+func newDelegator(w http.ResponseWriter, observeWriteHeaderFunc func(int)) delegator {
+       d := &responseWriterDelegator{
+               ResponseWriter:     w,
+               observeWriteHeader: observeWriteHeaderFunc,
+       }
+
+       id := 0
+       if _, ok := w.(http.CloseNotifier); ok {
+               id += closeNotifier
+       }
+       if _, ok := w.(http.Flusher); ok {
+               id += flusher
+       }
+       if _, ok := w.(http.Hijacker); ok {
+               id += hijacker
+       }
+       if _, ok := w.(io.ReaderFrom); ok {
+               id += readerFrom
+       }
+
+       return pickDelegator[id](d)
+}
diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.go
new file mode 100644 (file)
index 0000000..65f9425
--- /dev/null
@@ -0,0 +1,98 @@
+// Copyright 2017 The Prometheus Authors
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package promhttp
+
+import (
+       "net/http"
+       "time"
+
+       "github.com/prometheus/client_golang/prometheus"
+)
+
+// The RoundTripperFunc type is an adapter to allow the use of ordinary
+// functions as RoundTrippers. If f is a function with the appropriate
+// signature, RountTripperFunc(f) is a RoundTripper that calls f.
+type RoundTripperFunc func(req *http.Request) (*http.Response, error)
+
+// RoundTrip implements the RoundTripper interface.
+func (rt RoundTripperFunc) RoundTrip(r *http.Request) (*http.Response, error) {
+       return rt(r)
+}
+
+// InstrumentRoundTripperInFlight is a middleware that wraps the provided
+// http.RoundTripper. It sets the provided prometheus.Gauge to the number of
+// requests currently handled by the wrapped http.RoundTripper.
+//
+// See the example for ExampleInstrumentRoundTripperDuration for example usage.
+func InstrumentRoundTripperInFlight(gauge prometheus.Gauge, next http.RoundTripper) RoundTripperFunc {
+       return RoundTripperFunc(func(r *http.Request) (*http.Response, error) {
+               gauge.Inc()
+               defer gauge.Dec()
+               return next.RoundTrip(r)
+       })
+}
+
+// InstrumentRoundTripperCounter is a middleware that wraps the provided
+// http.RoundTripper to observe the request result with the provided CounterVec.
+// The CounterVec must have zero, one, or two labels. The only allowed label
+// names are "code" and "method". The function panics if any other instance
+// labels are provided. Partitioning of the CounterVec happens by HTTP status
+// code and/or HTTP method if the respective instance label names are present
+// in the CounterVec. For unpartitioned counting, use a CounterVec with
+// zero labels.
+//
+// If the wrapped RoundTripper panics or returns a non-nil error, the Counter
+// is not incremented.
+//
+// See the example for ExampleInstrumentRoundTripperDuration for example usage.
+func InstrumentRoundTripperCounter(counter *prometheus.CounterVec, next http.RoundTripper) RoundTripperFunc {
+       code, method := checkLabels(counter)
+
+       return RoundTripperFunc(func(r *http.Request) (*http.Response, error) {
+               resp, err := next.RoundTrip(r)
+               if err == nil {
+                       counter.With(labels(code, method, r.Method, resp.StatusCode)).Inc()
+               }
+               return resp, err
+       })
+}
+
+// InstrumentRoundTripperDuration is a middleware that wraps the provided
+// http.RoundTripper to observe the request duration with the provided ObserverVec.
+// The ObserverVec must have zero, one, or two labels. The only allowed label
+// names are "code" and "method". The function panics if any other instance
+// labels are provided. The Observe method of the Observer in the ObserverVec
+// is called with the request duration in seconds. Partitioning happens by HTTP
+// status code and/or HTTP method if the respective instance label names are
+// present in the ObserverVec. For unpartitioned observations, use an
+// ObserverVec with zero labels. Note that partitioning of Histograms is
+// expensive and should be used judiciously.
+//
+// If the wrapped RoundTripper panics or returns a non-nil error, no values are
+// reported.
+//
+// Note that this method is only guaranteed to never observe negative durations
+// if used with Go1.9+.
+func InstrumentRoundTripperDuration(obs prometheus.ObserverVec, next http.RoundTripper) RoundTripperFunc {
+       code, method := checkLabels(obs)
+
+       return RoundTripperFunc(func(r *http.Request) (*http.Response, error) {
+               start := time.Now()
+               resp, err := next.RoundTrip(r)
+               if err == nil {
+                       obs.With(labels(code, method, r.Method, resp.StatusCode)).Observe(time.Since(start).Seconds())
+               }
+               return resp, err
+       })
+}
diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client_1_8.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client_1_8.go
new file mode 100644 (file)
index 0000000..0bd80c3
--- /dev/null
@@ -0,0 +1,144 @@
+// Copyright 2017 The Prometheus Authors
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// +build go1.8
+
+package promhttp
+
+import (
+       "context"
+       "crypto/tls"
+       "net/http"
+       "net/http/httptrace"
+       "time"
+)
+
+// InstrumentTrace is used to offer flexibility in instrumenting the available
+// httptrace.ClientTrace hook functions. Each function is passed a float64
+// representing the time in seconds since the start of the http request. A user
+// may choose to use separately buckets Histograms, or implement custom
+// instance labels on a per function basis.
+type InstrumentTrace struct {
+       GotConn              func(float64)
+       PutIdleConn          func(float64)
+       GotFirstResponseByte func(float64)
+       Got100Continue       func(float64)
+       DNSStart             func(float64)
+       DNSDone              func(float64)
+       ConnectStart         func(float64)
+       ConnectDone          func(float64)
+       TLSHandshakeStart    func(float64)
+       TLSHandshakeDone     func(float64)
+       WroteHeaders         func(float64)
+       Wait100Continue      func(float64)
+       WroteRequest         func(float64)
+}
+
+// InstrumentRoundTripperTrace is a middleware that wraps the provided
+// RoundTripper and reports times to hook functions provided in the
+// InstrumentTrace struct. Hook functions that are not present in the provided
+// InstrumentTrace struct are ignored. Times reported to the hook functions are
+// time since the start of the request. Only with Go1.9+, those times are
+// guaranteed to never be negative. (Earlier Go versions are not using a
+// monotonic clock.) Note that partitioning of Histograms is expensive and
+// should be used judiciously.
+//
+// For hook functions that receive an error as an argument, no observations are
+// made in the event of a non-nil error value.
+//
+// See the example for ExampleInstrumentRoundTripperDuration for example usage.
+func InstrumentRoundTripperTrace(it *InstrumentTrace, next http.RoundTripper) RoundTripperFunc {
+       return RoundTripperFunc(func(r *http.Request) (*http.Response, error) {
+               start := time.Now()
+
+               trace := &httptrace.ClientTrace{
+                       GotConn: func(_ httptrace.GotConnInfo) {
+                               if it.GotConn != nil {
+                                       it.GotConn(time.Since(start).Seconds())
+                               }
+                       },
+                       PutIdleConn: func(err error) {
+                               if err != nil {
+                                       return
+                               }
+                               if it.PutIdleConn != nil {
+                                       it.PutIdleConn(time.Since(start).Seconds())
+                               }
+                       },
+                       DNSStart: func(_ httptrace.DNSStartInfo) {
+                               if it.DNSStart != nil {
+                                       it.DNSStart(time.Since(start).Seconds())
+                               }
+                       },
+                       DNSDone: func(_ httptrace.DNSDoneInfo) {
+                               if it.DNSStart != nil {
+                                       it.DNSStart(time.Since(start).Seconds())
+                               }
+                       },
+                       ConnectStart: func(_, _ string) {
+                               if it.ConnectStart != nil {
+                                       it.ConnectStart(time.Since(start).Seconds())
+                               }
+                       },
+                       ConnectDone: func(_, _ string, err error) {
+                               if err != nil {
+                                       return
+                               }
+                               if it.ConnectDone != nil {
+                                       it.ConnectDone(time.Since(start).Seconds())
+                               }
+                       },
+                       GotFirstResponseByte: func() {
+                               if it.GotFirstResponseByte != nil {
+                                       it.GotFirstResponseByte(time.Since(start).Seconds())
+                               }
+                       },
+                       Got100Continue: func() {
+                               if it.Got100Continue != nil {
+                                       it.Got100Continue(time.Since(start).Seconds())
+                               }
+                       },
+                       TLSHandshakeStart: func() {
+                               if it.TLSHandshakeStart != nil {
+                                       it.TLSHandshakeStart(time.Since(start).Seconds())
+                               }
+                       },
+                       TLSHandshakeDone: func(_ tls.ConnectionState, err error) {
+                               if err != nil {
+                                       return
+                               }
+                               if it.TLSHandshakeDone != nil {
+                                       it.TLSHandshakeDone(time.Since(start).Seconds())
+                               }
+                       },
+                       WroteHeaders: func() {
+                               if it.WroteHeaders != nil {
+                                       it.WroteHeaders(time.Since(start).Seconds())
+                               }
+                       },
+                       Wait100Continue: func() {
+                               if it.Wait100Continue != nil {
+                                       it.Wait100Continue(time.Since(start).Seconds())
+                               }
+                       },
+                       WroteRequest: func(_ httptrace.WroteRequestInfo) {
+                               if it.WroteRequest != nil {
+                                       it.WroteRequest(time.Since(start).Seconds())
+                               }
+                       },
+               }
+               r = r.WithContext(httptrace.WithClientTrace(context.Background(), trace))
+
+               return next.RoundTrip(r)
+       })
+}
diff --git a/vendor/github.com/prometheus/procfs/MAINTAINERS.md b/vendor/github.com/prometheus/procfs/MAINTAINERS.md
new file mode 100644 (file)
index 0000000..35993c4
--- /dev/null
@@ -0,0 +1 @@
+* Tobias Schmidt <tobidt@gmail.com>
diff --git a/vendor/github.com/prometheus/procfs/buddyinfo.go b/vendor/github.com/prometheus/procfs/buddyinfo.go
new file mode 100644 (file)
index 0000000..680a984
--- /dev/null
@@ -0,0 +1,95 @@
+// Copyright 2017 The Prometheus Authors
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package procfs
+
+import (
+       "bufio"
+       "fmt"
+       "io"
+       "os"
+       "strconv"
+       "strings"
+)
+
+// A BuddyInfo is the details parsed from /proc/buddyinfo.
+// The data is comprised of an array of free fragments of each size.
+// The sizes are 2^n*PAGE_SIZE, where n is the array index.
+type BuddyInfo struct {
+       Node  string
+       Zone  string
+       Sizes []float64
+}
+
+// NewBuddyInfo reads the buddyinfo statistics.
+func NewBuddyInfo() ([]BuddyInfo, error) {
+       fs, err := NewFS(DefaultMountPoint)
+       if err != nil {
+               return nil, err
+       }
+
+       return fs.NewBuddyInfo()
+}
+
+// NewBuddyInfo reads the buddyinfo statistics from the specified `proc` filesystem.
+func (fs FS) NewBuddyInfo() ([]BuddyInfo, error) {
+       file, err := os.Open(fs.Path("buddyinfo"))
+       if err != nil {
+               return nil, err
+       }
+       defer file.Close()
+
+       return parseBuddyInfo(file)
+}
+
+func parseBuddyInfo(r io.Reader) ([]BuddyInfo, error) {
+       var (
+               buddyInfo   = []BuddyInfo{}
+               scanner     = bufio.NewScanner(r)
+               bucketCount = -1
+       )
+
+       for scanner.Scan() {
+               var err error
+               line := scanner.Text()
+               parts := strings.Fields(string(line))
+
+               if len(parts) < 4 {
+                       return nil, fmt.Errorf("invalid number of fields when parsing buddyinfo")
+               }
+
+               node := strings.TrimRight(parts[1], ",")
+               zone := strings.TrimRight(parts[3], ",")
+               arraySize := len(parts[4:])
+
+               if bucketCount == -1 {
+                       bucketCount = arraySize
+               } else {
+                       if bucketCount != arraySize {
+                               return nil, fmt.Errorf("mismatch in number of buddyinfo buckets, previous count %d, new count %d", bucketCount, arraySize)
+                       }
+               }
+
+               sizes := make([]float64, arraySize)
+               for i := 0; i < arraySize; i++ {
+                       sizes[i], err = strconv.ParseFloat(parts[i+4], 64)
+                       if err != nil {
+                               return nil, fmt.Errorf("invalid value in buddyinfo: %s", err)
+                       }
+               }
+
+               buddyInfo = append(buddyInfo, BuddyInfo{node, zone, sizes})
+       }
+
+       return buddyInfo, scanner.Err()
+}
diff --git a/vendor/github.com/prometheus/procfs/mountstats.go b/vendor/github.com/prometheus/procfs/mountstats.go
new file mode 100644 (file)
index 0000000..6b2b0ba
--- /dev/null
@@ -0,0 +1,556 @@
+package procfs
+
+// While implementing parsing of /proc/[pid]/mountstats, this blog was used
+// heavily as a reference:
+//   https://utcc.utoronto.ca/~cks/space/blog/linux/NFSMountstatsIndex
+//
+// Special thanks to Chris Siebenmann for all of his posts explaining the
+// various statistics available for NFS.
+
+import (
+       "bufio"
+       "fmt"
+       "io"
+       "strconv"
+       "strings"
+       "time"
+)
+
+// Constants shared between multiple functions.
+const (
+       deviceEntryLen = 8
+
+       fieldBytesLen  = 8
+       fieldEventsLen = 27
+
+       statVersion10 = "1.0"
+       statVersion11 = "1.1"
+
+       fieldTransport10Len = 10
+       fieldTransport11Len = 13
+)
+
+// A Mount is a device mount parsed from /proc/[pid]/mountstats.
+type Mount struct {
+       // Name of the device.
+       Device string
+       // The mount point of the device.
+       Mount string
+       // The filesystem type used by the device.
+       Type string
+       // If available additional statistics related to this Mount.
+       // Use a type assertion to determine if additional statistics are available.
+       Stats MountStats
+}
+
+// A MountStats is a type which contains detailed statistics for a specific
+// type of Mount.
+type MountStats interface {
+       mountStats()
+}
+
+// A MountStatsNFS is a MountStats implementation for NFSv3 and v4 mounts.
+type MountStatsNFS struct {
+       // The version of statistics provided.
+       StatVersion string
+       // The age of the NFS mount.
+       Age time.Duration
+       // Statistics related to byte counters for various operations.
+       Bytes NFSBytesStats
+       // Statistics related to various NFS event occurrences.
+       Events NFSEventsStats
+       // Statistics broken down by filesystem operation.
+       Operations []NFSOperationStats
+       // Statistics about the NFS RPC transport.
+       Transport NFSTransportStats
+}
+
+// mountStats implements MountStats.
+func (m MountStatsNFS) mountStats() {}
+
+// A NFSBytesStats contains statistics about the number of bytes read and written
+// by an NFS client to and from an NFS server.
+type NFSBytesStats struct {
+       // Number of bytes read using the read() syscall.
+       Read uint64
+       // Number of bytes written using the write() syscall.
+       Write uint64
+       // Number of bytes read using the read() syscall in O_DIRECT mode.
+       DirectRead uint64
+       // Number of bytes written using the write() syscall in O_DIRECT mode.
+       DirectWrite uint64
+       // Number of bytes read from the NFS server, in total.
+       ReadTotal uint64
+       // Number of bytes written to the NFS server, in total.
+       WriteTotal uint64
+       // Number of pages read directly via mmap()'d files.
+       ReadPages uint64
+       // Number of pages written directly via mmap()'d files.
+       WritePages uint64
+}
+
+// A NFSEventsStats contains statistics about NFS event occurrences.
+type NFSEventsStats struct {
+       // Number of times cached inode attributes are re-validated from the server.
+       InodeRevalidate uint64
+       // Number of times cached dentry nodes are re-validated from the server.
+       DnodeRevalidate uint64
+       // Number of times an inode cache is cleared.
+       DataInvalidate uint64
+       // Number of times cached inode attributes are invalidated.
+       AttributeInvalidate uint64
+       // Number of times files or directories have been open()'d.
+       VFSOpen uint64
+       // Number of times a directory lookup has occurred.
+       VFSLookup uint64
+       // Number of times permissions have been checked.
+       VFSAccess uint64
+       // Number of updates (and potential writes) to pages.
+       VFSUpdatePage uint64
+       // Number of pages read directly via mmap()'d files.
+       VFSReadPage uint64
+       // Number of times a group of pages have been read.
+       VFSReadPages uint64
+       // Number of pages written directly via mmap()'d files.
+       VFSWritePage uint64
+       // Number of times a group of pages have been written.
+       VFSWritePages uint64
+       // Number of times directory entries have been read with getdents().
+       VFSGetdents uint64
+       // Number of times attributes have been set on inodes.
+       VFSSetattr uint64
+       // Number of pending writes that have been forcefully flushed to the server.
+       VFSFlush uint64
+       // Number of times fsync() has been called on directories and files.
+       VFSFsync uint64
+       // Number of times locking has been attempted on a file.
+       VFSLock uint64
+       // Number of times files have been closed and released.
+       VFSFileRelease uint64
+       // Unknown.  Possibly unused.
+       CongestionWait uint64
+       // Number of times files have been truncated.
+       Truncation uint64
+       // Number of times a file has been grown due to writes beyond its existing end.
+       WriteExtension uint64
+       // Number of times a file was removed while still open by another process.
+       SillyRename uint64
+       // Number of times the NFS server gave less data than expected while reading.
+       ShortRead uint64
+       // Number of times the NFS server wrote less data than expected while writing.
+       ShortWrite uint64
+       // Number of times the NFS server indicated EJUKEBOX; retrieving data from
+       // offline storage.
+       JukeboxDelay uint64
+       // Number of NFS v4.1+ pNFS reads.
+       PNFSRead uint64
+       // Number of NFS v4.1+ pNFS writes.
+       PNFSWrite uint64
+}
+
+// A NFSOperationStats contains statistics for a single operation.
+type NFSOperationStats struct {
+       // The name of the operation.
+       Operation string
+       // Number of requests performed for this operation.
+       Requests uint64
+       // Number of times an actual RPC request has been transmitted for this operation.
+       Transmissions uint64
+       // Number of times a request has had a major timeout.
+       MajorTimeouts uint64
+       // Number of bytes sent for this operation, including RPC headers and payload.
+       BytesSent uint64
+       // Number of bytes received for this operation, including RPC headers and payload.
+       BytesReceived uint64
+       // Duration all requests spent queued for transmission before they were sent.
+       CumulativeQueueTime time.Duration
+       // Duration it took to get a reply back after the request was transmitted.
+       CumulativeTotalResponseTime time.Duration
+       // Duration from when a request was enqueued to when it was completely handled.
+       CumulativeTotalRequestTime time.Duration
+}
+
+// A NFSTransportStats contains statistics for the NFS mount RPC requests and
+// responses.
+type NFSTransportStats struct {
+       // The local port used for the NFS mount.
+       Port uint64
+       // Number of times the client has had to establish a connection from scratch
+       // to the NFS server.
+       Bind uint64
+       // Number of times the client has made a TCP connection to the NFS server.
+       Connect uint64
+       // Duration (in jiffies, a kernel internal unit of time) the NFS mount has
+       // spent waiting for connections to the server to be established.
+       ConnectIdleTime uint64
+       // Duration since the NFS mount last saw any RPC traffic.
+       IdleTime time.Duration
+       // Number of RPC requests for this mount sent to the NFS server.
+       Sends uint64
+       // Number of RPC responses for this mount received from the NFS server.
+       Receives uint64
+       // Number of times the NFS server sent a response with a transaction ID
+       // unknown to this client.
+       BadTransactionIDs uint64
+       // A running counter, incremented on each request as the current difference
+       // ebetween sends and receives.
+       CumulativeActiveRequests uint64
+       // A running counter, incremented on each request by the current backlog
+       // queue size.
+       CumulativeBacklog uint64
+
+       // Stats below only available with stat version 1.1.
+
+       // Maximum number of simultaneously active RPC requests ever used.
+       MaximumRPCSlotsUsed uint64
+       // A running counter, incremented on each request as the current size of the
+       // sending queue.
+       CumulativeSendingQueue uint64
+       // A running counter, incremented on each request as the current size of the
+       // pending queue.
+       CumulativePendingQueue uint64
+}
+
+// parseMountStats parses a /proc/[pid]/mountstats file and returns a slice
+// of Mount structures containing detailed information about each mount.
+// If available, statistics for each mount are parsed as well.
+func parseMountStats(r io.Reader) ([]*Mount, error) {
+       const (
+               device            = "device"
+               statVersionPrefix = "statvers="
+
+               nfs3Type = "nfs"
+               nfs4Type = "nfs4"
+       )
+
+       var mounts []*Mount
+
+       s := bufio.NewScanner(r)
+       for s.Scan() {
+               // Only look for device entries in this function
+               ss := strings.Fields(string(s.Bytes()))
+               if len(ss) == 0 || ss[0] != device {
+                       continue
+               }
+
+               m, err := parseMount(ss)
+               if err != nil {
+                       return nil, err
+               }
+
+               // Does this mount also possess statistics information?
+               if len(ss) > deviceEntryLen {
+                       // Only NFSv3 and v4 are supported for parsing statistics
+                       if m.Type != nfs3Type && m.Type != nfs4Type {
+                               return nil, fmt.Errorf("cannot parse MountStats for fstype %q", m.Type)
+                       }
+
+                       statVersion := strings.TrimPrefix(ss[8], statVersionPrefix)
+
+                       stats, err := parseMountStatsNFS(s, statVersion)
+                       if err != nil {
+                               return nil, err
+                       }
+
+                       m.Stats = stats
+               }
+
+               mounts = append(mounts, m)
+       }
+
+       return mounts, s.Err()
+}
+
+// parseMount parses an entry in /proc/[pid]/mountstats in the format:
+//   device [device] mounted on [mount] with fstype [type]
+func parseMount(ss []string) (*Mount, error) {
+       if len(ss) < deviceEntryLen {
+               return nil, fmt.Errorf("invalid device entry: %v", ss)
+       }
+
+       // Check for specific words appearing at specific indices to ensure
+       // the format is consistent with what we expect
+       format := []struct {
+               i int
+               s string
+       }{
+               {i: 0, s: "device"},
+               {i: 2, s: "mounted"},
+               {i: 3, s: "on"},
+               {i: 5, s: "with"},
+               {i: 6, s: "fstype"},
+       }
+
+       for _, f := range format {
+               if ss[f.i] != f.s {
+                       return nil, fmt.Errorf("invalid device entry: %v", ss)
+               }
+       }
+
+       return &Mount{
+               Device: ss[1],
+               Mount:  ss[4],
+               Type:   ss[7],
+       }, nil
+}
+
+// parseMountStatsNFS parses a MountStatsNFS by scanning additional information
+// related to NFS statistics.
+func parseMountStatsNFS(s *bufio.Scanner, statVersion string) (*MountStatsNFS, error) {
+       // Field indicators for parsing specific types of data
+       const (
+               fieldAge        = "age:"
+               fieldBytes      = "bytes:"
+               fieldEvents     = "events:"
+               fieldPerOpStats = "per-op"
+               fieldTransport  = "xprt:"
+       )
+
+       stats := &MountStatsNFS{
+               StatVersion: statVersion,
+       }
+
+       for s.Scan() {
+               ss := strings.Fields(string(s.Bytes()))
+               if len(ss) == 0 {
+                       break
+               }
+               if len(ss) < 2 {
+                       return nil, fmt.Errorf("not enough information for NFS stats: %v", ss)
+               }
+
+               switch ss[0] {
+               case fieldAge:
+                       // Age integer is in seconds
+                       d, err := time.ParseDuration(ss[1] + "s")
+                       if err != nil {
+                               return nil, err
+                       }
+
+                       stats.Age = d
+               case fieldBytes:
+                       bstats, err := parseNFSBytesStats(ss[1:])
+                       if err != nil {
+                               return nil, err
+                       }
+
+                       stats.Bytes = *bstats
+               case fieldEvents:
+                       estats, err := parseNFSEventsStats(ss[1:])
+                       if err != nil {
+                               return nil, err
+                       }
+
+                       stats.Events = *estats
+               case fieldTransport:
+                       if len(ss) < 3 {
+                               return nil, fmt.Errorf("not enough information for NFS transport stats: %v", ss)
+                       }
+
+                       tstats, err := parseNFSTransportStats(ss[2:], statVersion)
+                       if err != nil {
+                               return nil, err
+                       }
+
+                       stats.Transport = *tstats
+               }
+
+               // When encountering "per-operation statistics", we must break this
+               // loop and parse them separately to ensure we can terminate parsing
+               // before reaching another device entry; hence why this 'if' statement
+               // is not just another switch case
+               if ss[0] == fieldPerOpStats {
+                       break
+               }
+       }
+
+       if err := s.Err(); err != nil {
+               return nil, err
+       }
+
+       // NFS per-operation stats appear last before the next device entry
+       perOpStats, err := parseNFSOperationStats(s)
+       if err != nil {
+               return nil, err
+       }
+
+       stats.Operations = perOpStats
+
+       return stats, nil
+}
+
+// parseNFSBytesStats parses a NFSBytesStats line using an input set of
+// integer fields.
+func parseNFSBytesStats(ss []string) (*NFSBytesStats, error) {
+       if len(ss) != fieldBytesLen {
+               return nil, fmt.Errorf("invalid NFS bytes stats: %v", ss)
+       }
+
+       ns := make([]uint64, 0, fieldBytesLen)
+       for _, s := range ss {
+               n, err := strconv.ParseUint(s, 10, 64)
+               if err != nil {
+                       return nil, err
+               }
+
+               ns = append(ns, n)
+       }
+
+       return &NFSBytesStats{
+               Read:        ns[0],
+               Write:       ns[1],
+               DirectRead:  ns[2],
+               DirectWrite: ns[3],
+               ReadTotal:   ns[4],
+               WriteTotal:  ns[5],
+               ReadPages:   ns[6],
+               WritePages:  ns[7],
+       }, nil
+}
+
+// parseNFSEventsStats parses a NFSEventsStats line using an input set of
+// integer fields.
+func parseNFSEventsStats(ss []string) (*NFSEventsStats, error) {
+       if len(ss) != fieldEventsLen {
+               return nil, fmt.Errorf("invalid NFS events stats: %v", ss)
+       }
+
+       ns := make([]uint64, 0, fieldEventsLen)
+       for _, s := range ss {
+               n, err := strconv.ParseUint(s, 10, 64)
+               if err != nil {
+                       return nil, err
+               }
+
+               ns = append(ns, n)
+       }
+
+       return &NFSEventsStats{
+               InodeRevalidate:     ns[0],
+               DnodeRevalidate:     ns[1],
+               DataInvalidate:      ns[2],
+               AttributeInvalidate: ns[3],
+               VFSOpen:             ns[4],
+               VFSLookup:           ns[5],
+               VFSAccess:           ns[6],
+               VFSUpdatePage:       ns[7],
+               VFSReadPage:         ns[8],
+               VFSReadPages:        ns[9],
+               VFSWritePage:        ns[10],
+               VFSWritePages:       ns[11],
+               VFSGetdents:         ns[12],
+               VFSSetattr:          ns[13],
+               VFSFlush:            ns[14],
+               VFSFsync:            ns[15],
+               VFSLock:             ns[16],
+               VFSFileRelease:      ns[17],
+               CongestionWait:      ns[18],
+               Truncation:          ns[19],
+               WriteExtension:      ns[20],
+               SillyRename:         ns[21],
+               ShortRead:           ns[22],
+               ShortWrite:          ns[23],
+               JukeboxDelay:        ns[24],
+               PNFSRead:            ns[25],
+               PNFSWrite:           ns[26],
+       }, nil
+}
+
+// parseNFSOperationStats parses a slice of NFSOperationStats by scanning
+// additional information about per-operation statistics until an empty
+// line is reached.
+func parseNFSOperationStats(s *bufio.Scanner) ([]NFSOperationStats, error) {
+       const (
+               // Number of expected fields in each per-operation statistics set
+               numFields = 9
+       )
+
+       var ops []NFSOperationStats
+
+       for s.Scan() {
+               ss := strings.Fields(string(s.Bytes()))
+               if len(ss) == 0 {
+                       // Must break when reading a blank line after per-operation stats to
+                       // enable top-level function to parse the next device entry
+                       break
+               }
+
+               if len(ss) != numFields {
+                       return nil, fmt.Errorf("invalid NFS per-operations stats: %v", ss)
+               }
+
+               // Skip string operation name for integers
+               ns := make([]uint64, 0, numFields-1)
+               for _, st := range ss[1:] {
+                       n, err := strconv.ParseUint(st, 10, 64)
+                       if err != nil {
+                               return nil, err
+                       }
+
+                       ns = append(ns, n)
+               }
+
+               ops = append(ops, NFSOperationStats{
+                       Operation:                   strings.TrimSuffix(ss[0], ":"),
+                       Requests:                    ns[0],
+                       Transmissions:               ns[1],
+                       MajorTimeouts:               ns[2],
+                       BytesSent:                   ns[3],
+                       BytesReceived:               ns[4],
+                       CumulativeQueueTime:         time.Duration(ns[5]) * time.Millisecond,
+                       CumulativeTotalResponseTime: time.Duration(ns[6]) * time.Millisecond,
+                       CumulativeTotalRequestTime:  time.Duration(ns[7]) * time.Millisecond,
+               })
+       }
+
+       return ops, s.Err()
+}
+
+// parseNFSTransportStats parses a NFSTransportStats line using an input set of
+// integer fields matched to a specific stats version.
+func parseNFSTransportStats(ss []string, statVersion string) (*NFSTransportStats, error) {
+       switch statVersion {
+       case statVersion10:
+               if len(ss) != fieldTransport10Len {
+                       return nil, fmt.Errorf("invalid NFS transport stats 1.0 statement: %v", ss)
+               }
+       case statVersion11:
+               if len(ss) != fieldTransport11Len {
+                       return nil, fmt.Errorf("invalid NFS transport stats 1.1 statement: %v", ss)
+               }
+       default:
+               return nil, fmt.Errorf("unrecognized NFS transport stats version: %q", statVersion)
+       }
+
+       // Allocate enough for v1.1 stats since zero value for v1.1 stats will be okay
+       // in a v1.0 response.
+       //
+       // Note: slice length must be set to length of v1.1 stats to avoid a panic when
+       // only v1.0 stats are present.
+       // See: https://github.com/prometheus/node_exporter/issues/571.
+       ns := make([]uint64, fieldTransport11Len)
+       for i, s := range ss {
+               n, err := strconv.ParseUint(s, 10, 64)
+               if err != nil {
+                       return nil, err
+               }
+
+               ns[i] = n
+       }
+
+       return &NFSTransportStats{
+               Port:                     ns[0],
+               Bind:                     ns[1],
+               Connect:                  ns[2],
+               ConnectIdleTime:          ns[3],
+               IdleTime:                 time.Duration(ns[4]) * time.Second,
+               Sends:                    ns[5],
+               Receives:                 ns[6],
+               BadTransactionIDs:        ns[7],
+               CumulativeActiveRequests: ns[8],
+               CumulativeBacklog:        ns[9],
+               MaximumRPCSlotsUsed:      ns[10],
+               CumulativeSendingQueue:   ns[11],
+               CumulativePendingQueue:   ns[12],
+       }, nil
+}
diff --git a/vendor/github.com/prometheus/procfs/ttar b/vendor/github.com/prometheus/procfs/ttar
new file mode 100755 (executable)
index 0000000..8227a4a
--- /dev/null
@@ -0,0 +1,264 @@
+#!/usr/bin/env bash
+# Purpose: plain text tar format
+# Limitations: - only suitable for text files, directories, and symlinks
+#              - stores only filename, content, and mode
+#              - not designed for untrusted input
+
+# Note: must work with bash version 3.2 (macOS)
+
+set -o errexit -o nounset
+
+# Sanitize environment (for instance, standard sorting of glob matches)
+export LC_ALL=C
+
+path=""
+CMD=""
+
+function usage {
+    bname=$(basename "$0")
+    cat << USAGE
+Usage:   $bname [-C <DIR>] -c -f <ARCHIVE> <FILE...> (create archive)
+         $bname            -t -f <ARCHIVE>           (list archive contents)
+         $bname [-C <DIR>] -x -f <ARCHIVE>           (extract archive)
+
+Options:
+         -C <DIR>                                    (change directory)
+
+Example: Change to sysfs directory, create ttar file from fixtures directory
+         $bname -C sysfs -c -f sysfs/fixtures.ttar fixtures/
+USAGE
+exit "$1"
+}
+
+function vecho {
+    if [ "${VERBOSE:-}" == "yes" ]; then
+        echo >&7 "$@"
+    fi
+}
+
+function set_cmd {
+    if [ -n "$CMD" ]; then
+        echo "ERROR: more than one command given"
+        echo
+        usage 2
+    fi
+    CMD=$1
+}
+
+while getopts :cf:htxvC: opt; do
+    case $opt in
+        c)
+            set_cmd "create"
+            ;;
+        f)
+            ARCHIVE=$OPTARG
+            ;;
+        h)
+            usage 0
+            ;;
+        t)
+            set_cmd "list"
+            ;;
+        x)
+            set_cmd "extract"
+            ;;
+        v)
+            VERBOSE=yes
+            exec 7>&1
+            ;;
+        C)
+            CDIR=$OPTARG
+            ;;
+        *)
+            echo >&2 "ERROR: invalid option -$OPTARG"
+            echo
+            usage 1
+            ;;
+    esac
+done
+
+# Remove processed options from arguments
+shift $(( OPTIND - 1 ));
+
+if [ "${CMD:-}" == "" ]; then
+    echo >&2 "ERROR: no command given"
+    echo
+    usage 1
+elif [ "${ARCHIVE:-}" == "" ]; then
+    echo >&2 "ERROR: no archive name given"
+    echo
+    usage 1
+fi
+
+function list {
+    local path=""
+    local size=0
+    local line_no=0
+    local ttar_file=$1
+    if [ -n "${2:-}" ]; then
+        echo >&2 "ERROR: too many arguments."
+        echo
+        usage 1
+    fi
+    if [ ! -e "$ttar_file" ]; then
+        echo >&2 "ERROR: file not found ($ttar_file)"
+        echo
+        usage 1
+    fi
+    while read -r line; do
+        line_no=$(( line_no + 1 ))
+        if [ $size -gt 0 ]; then
+            size=$(( size - 1 ))
+            continue
+        fi
+        if [[ $line =~ ^Path:\ (.*)$ ]]; then
+            path=${BASH_REMATCH[1]}
+        elif [[ $line =~ ^Lines:\ (.*)$ ]]; then
+            size=${BASH_REMATCH[1]}
+            echo "$path"
+        elif [[ $line =~ ^Directory:\ (.*)$ ]]; then
+            path=${BASH_REMATCH[1]}
+            echo "$path/"
+        elif [[ $line =~ ^SymlinkTo:\ (.*)$ ]]; then
+            echo  "$path -> ${BASH_REMATCH[1]}"
+        fi
+    done < "$ttar_file"
+}
+
+function extract {
+    local path=""
+    local size=0
+    local line_no=0
+    local ttar_file=$1
+    if [ -n "${2:-}" ]; then
+        echo >&2 "ERROR: too many arguments."
+        echo
+        usage 1
+    fi
+    if [ ! -e "$ttar_file" ]; then
+        echo >&2 "ERROR: file not found ($ttar_file)"
+        echo
+        usage 1
+    fi
+    while IFS= read -r line; do
+        line_no=$(( line_no + 1 ))
+        if [ "$size" -gt 0 ]; then
+            echo "$line" >> "$path"
+            size=$(( size - 1 ))
+            continue
+        fi
+        if [[ $line =~ ^Path:\ (.*)$ ]]; then
+            path=${BASH_REMATCH[1]}
+            if [ -e "$path" ] || [ -L "$path" ]; then
+                rm "$path"
+            fi
+        elif [[ $line =~ ^Lines:\ (.*)$ ]]; then
+            size=${BASH_REMATCH[1]}
+            # Create file even if it is zero-length.
+            touch "$path"
+            vecho "    $path"
+        elif [[ $line =~ ^Mode:\ (.*)$ ]]; then
+            mode=${BASH_REMATCH[1]}
+            chmod "$mode" "$path"
+            vecho "$mode"
+        elif [[ $line =~ ^Directory:\ (.*)$ ]]; then
+            path=${BASH_REMATCH[1]}
+            mkdir -p "$path"
+            vecho "    $path/"
+        elif [[ $line =~ ^SymlinkTo:\ (.*)$ ]]; then
+            ln -s "${BASH_REMATCH[1]}" "$path"
+            vecho "    $path -> ${BASH_REMATCH[1]}"
+        elif [[ $line =~ ^# ]]; then
+            # Ignore comments between files
+            continue
+        else
+            echo >&2 "ERROR: Unknown keyword on line $line_no: $line"
+            exit 1
+        fi
+    done < "$ttar_file"
+}
+
+function div {
+    echo "# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" \
+         "- - - - - -"
+}
+
+function get_mode {
+    local mfile=$1
+    if [ -z "${STAT_OPTION:-}" ]; then
+        if stat -c '%a' "$mfile" >/dev/null 2>&1; then
+            STAT_OPTION='-c'
+            STAT_FORMAT='%a'
+        else
+            STAT_OPTION='-f'
+            STAT_FORMAT='%A'
+        fi
+    fi
+    stat "${STAT_OPTION}" "${STAT_FORMAT}" "$mfile"
+}
+
+function _create {
+    shopt -s nullglob
+    local mode
+    while (( "$#" )); do
+        file=$1
+        if [ -L "$file" ]; then
+            echo "Path: $file"
+            symlinkTo=$(readlink "$file")
+            echo "SymlinkTo: $symlinkTo"
+            vecho "    $file -> $symlinkTo"
+            div
+        elif [ -d "$file" ]; then
+            # Strip trailing slash (if there is one)
+            file=${file%/}
+            echo "Directory: $file"
+            mode=$(get_mode "$file")
+            echo "Mode: $mode"
+            vecho "$mode $file/"
+            div
+            # Find all files and dirs, including hidden/dot files
+            for x in "$file/"{*,.[^.]*}; do
+                _create "$x"
+            done
+        elif [ -f "$file" ]; then
+            echo "Path: $file"
+            lines=$(wc -l "$file"|awk '{print $1}')
+            echo "Lines: $lines"
+            cat "$file"
+            mode=$(get_mode "$file")
+            echo "Mode: $mode"
+            vecho "$mode $file"
+            div
+        else
+            echo >&2 "ERROR: file not found ($file in $(pwd))"
+            exit 2
+        fi
+        shift
+    done
+}
+
+function create {
+    ttar_file=$1
+    shift
+    if [ -z "${1:-}" ]; then
+        echo >&2 "ERROR: missing arguments."
+        echo
+        usage 1
+    fi
+    if [ -e "$ttar_file" ]; then
+        rm "$ttar_file"
+    fi
+    exec > "$ttar_file"
+    _create "$@"
+}
+
+if [ -n "${CDIR:-}" ]; then
+    if [[ "$ARCHIVE" != /* ]]; then
+        # Relative path: preserve the archive's location before changing
+        # directory
+        ARCHIVE="$(pwd)/$ARCHIVE"
+    fi
+    cd "$CDIR"
+fi
+
+"$CMD" "$ARCHIVE" "$@"
diff --git a/vendor/github.com/prometheus/procfs/xfrm.go b/vendor/github.com/prometheus/procfs/xfrm.go
new file mode 100644 (file)
index 0000000..ffe9df5
--- /dev/null
@@ -0,0 +1,187 @@
+// Copyright 2017 Prometheus Team
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package procfs
+
+import (
+       "bufio"
+       "fmt"
+       "os"
+       "strconv"
+       "strings"
+)
+
+// XfrmStat models the contents of /proc/net/xfrm_stat.
+type XfrmStat struct {
+       // All errors which are not matched by other
+       XfrmInError int
+       // No buffer is left
+       XfrmInBufferError int
+       // Header Error
+       XfrmInHdrError int
+       // No state found
+       // i.e. either inbound SPI, address, or IPSEC protocol at SA is wrong
+       XfrmInNoStates int
+       // Transformation protocol specific error
+       // e.g. SA Key is wrong
+       XfrmInStateProtoError int
+       // Transformation mode specific error
+       XfrmInStateModeError int
+       // Sequence error
+       // e.g. sequence number is out of window
+       XfrmInStateSeqError int
+       // State is expired
+       XfrmInStateExpired int
+       // State has mismatch option
+       // e.g. UDP encapsulation type is mismatched
+       XfrmInStateMismatch int
+       // State is invalid
+       XfrmInStateInvalid int
+       // No matching template for states
+       // e.g. Inbound SAs are correct but SP rule is wrong
+       XfrmInTmplMismatch int
+       // No policy is found for states
+       // e.g. Inbound SAs are correct but no SP is found
+       XfrmInNoPols int
+       // Policy discards
+       XfrmInPolBlock int
+       // Policy error
+       XfrmInPolError int
+       // All errors which are not matched by others
+       XfrmOutError int
+       // Bundle generation error
+       XfrmOutBundleGenError int
+       // Bundle check error
+       XfrmOutBundleCheckError int
+       // No state was found
+       XfrmOutNoStates int
+       // Transformation protocol specific error
+       XfrmOutStateProtoError int
+       // Transportation mode specific error
+       XfrmOutStateModeError int
+       // Sequence error
+       // i.e sequence number overflow
+       XfrmOutStateSeqError int
+       // State is expired
+       XfrmOutStateExpired int
+       // Policy discads
+       XfrmOutPolBlock int
+       // Policy is dead
+       XfrmOutPolDead int
+       // Policy Error
+       XfrmOutPolError     int
+       XfrmFwdHdrError     int
+       XfrmOutStateInvalid int
+       XfrmAcquireError    int
+}
+
+// NewXfrmStat reads the xfrm_stat statistics.
+func NewXfrmStat() (XfrmStat, error) {
+       fs, err := NewFS(DefaultMountPoint)
+       if err != nil {
+               return XfrmStat{}, err
+       }
+
+       return fs.NewXfrmStat()
+}
+
+// NewXfrmStat reads the xfrm_stat statistics from the 'proc' filesystem.
+func (fs FS) NewXfrmStat() (XfrmStat, error) {
+       file, err := os.Open(fs.Path("net/xfrm_stat"))
+       if err != nil {
+               return XfrmStat{}, err
+       }
+       defer file.Close()
+
+       var (
+               x = XfrmStat{}
+               s = bufio.NewScanner(file)
+       )
+
+       for s.Scan() {
+               fields := strings.Fields(s.Text())
+
+               if len(fields) != 2 {
+                       return XfrmStat{}, fmt.Errorf(
+                               "couldnt parse %s line %s", file.Name(), s.Text())
+               }
+
+               name := fields[0]
+               value, err := strconv.Atoi(fields[1])
+               if err != nil {
+                       return XfrmStat{}, err
+               }
+
+               switch name {
+               case "XfrmInError":
+                       x.XfrmInError = value
+               case "XfrmInBufferError":
+                       x.XfrmInBufferError = value
+               case "XfrmInHdrError":
+                       x.XfrmInHdrError = value
+               case "XfrmInNoStates":
+                       x.XfrmInNoStates = value
+               case "XfrmInStateProtoError":
+                       x.XfrmInStateProtoError = value
+               case "XfrmInStateModeError":
+                       x.XfrmInStateModeError = value
+               case "XfrmInStateSeqError":
+                       x.XfrmInStateSeqError = value
+               case "XfrmInStateExpired":
+                       x.XfrmInStateExpired = value
+               case "XfrmInStateInvalid":
+                       x.XfrmInStateInvalid = value
+               case "XfrmInTmplMismatch":
+                       x.XfrmInTmplMismatch = value
+               case "XfrmInNoPols":
+                       x.XfrmInNoPols = value
+               case "XfrmInPolBlock":
+                       x.XfrmInPolBlock = value
+               case "XfrmInPolError":
+                       x.XfrmInPolError = value
+               case "XfrmOutError":
+                       x.XfrmOutError = value
+               case "XfrmInStateMismatch":
+                       x.XfrmInStateMismatch = value
+               case "XfrmOutBundleGenError":
+                       x.XfrmOutBundleGenError = value
+               case "XfrmOutBundleCheckError":
+                       x.XfrmOutBundleCheckError = value
+               case "XfrmOutNoStates":
+                       x.XfrmOutNoStates = value
+               case "XfrmOutStateProtoError":
+                       x.XfrmOutStateProtoError = value
+               case "XfrmOutStateModeError":
+                       x.XfrmOutStateModeError = value
+               case "XfrmOutStateSeqError":
+                       x.XfrmOutStateSeqError = value
+               case "XfrmOutStateExpired":
+                       x.XfrmOutStateExpired = value
+               case "XfrmOutPolBlock":
+                       x.XfrmOutPolBlock = value
+               case "XfrmOutPolDead":
+                       x.XfrmOutPolDead = value
+               case "XfrmOutPolError":
+                       x.XfrmOutPolError = value
+               case "XfrmFwdHdrError":
+                       x.XfrmFwdHdrError = value
+               case "XfrmOutStateInvalid":
+                       x.XfrmOutStateInvalid = value
+               case "XfrmAcquireError":
+                       x.XfrmAcquireError = value
+               }
+
+       }
+
+       return x, s.Err()
+}
diff --git a/vendor/github.com/prometheus/procfs/xfs/parse.go b/vendor/github.com/prometheus/procfs/xfs/parse.go
new file mode 100644 (file)
index 0000000..c8f6279
--- /dev/null
@@ -0,0 +1,359 @@
+// Copyright 2017 The Prometheus Authors
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package xfs
+
+import (
+       "bufio"
+       "fmt"
+       "io"
+       "strconv"
+       "strings"
+)
+
+// ParseStats parses a Stats from an input io.Reader, using the format
+// found in /proc/fs/xfs/stat.
+func ParseStats(r io.Reader) (*Stats, error) {
+       const (
+               // Fields parsed into stats structures.
+               fieldExtentAlloc = "extent_alloc"
+               fieldAbt         = "abt"
+               fieldBlkMap      = "blk_map"
+               fieldBmbt        = "bmbt"
+               fieldDir         = "dir"
+               fieldTrans       = "trans"
+               fieldIg          = "ig"
+               fieldLog         = "log"
+               fieldRw          = "rw"
+               fieldAttr        = "attr"
+               fieldIcluster    = "icluster"
+               fieldVnodes      = "vnodes"
+               fieldBuf         = "buf"
+               fieldXpc         = "xpc"
+
+               // Unimplemented at this time due to lack of documentation.
+               fieldPushAil = "push_ail"
+               fieldXstrat  = "xstrat"
+               fieldAbtb2   = "abtb2"
+               fieldAbtc2   = "abtc2"
+               fieldBmbt2   = "bmbt2"
+               fieldIbt2    = "ibt2"
+               fieldFibt2   = "fibt2"
+               fieldQm      = "qm"
+               fieldDebug   = "debug"
+       )
+
+       var xfss Stats
+
+       s := bufio.NewScanner(r)
+       for s.Scan() {
+               // Expect at least a string label and a single integer value, ex:
+               //   - abt 0
+               //   - rw 1 2
+               ss := strings.Fields(string(s.Bytes()))
+               if len(ss) < 2 {
+                       continue
+               }
+               label := ss[0]
+
+               // Extended precision counters are uint64 values.
+               if label == fieldXpc {
+                       us, err := parseUint64s(ss[1:])
+                       if err != nil {
+                               return nil, err
+                       }
+
+                       xfss.ExtendedPrecision, err = extendedPrecisionStats(us)
+                       if err != nil {
+                               return nil, err
+                       }
+
+                       continue
+               }
+
+               // All other counters are uint32 values.
+               us, err := parseUint32s(ss[1:])
+               if err != nil {
+                       return nil, err
+               }
+
+               switch label {
+               case fieldExtentAlloc:
+                       xfss.ExtentAllocation, err = extentAllocationStats(us)
+               case fieldAbt:
+                       xfss.AllocationBTree, err = btreeStats(us)
+               case fieldBlkMap:
+                       xfss.BlockMapping, err = blockMappingStats(us)
+               case fieldBmbt:
+                       xfss.BlockMapBTree, err = btreeStats(us)
+               case fieldDir:
+                       xfss.DirectoryOperation, err = directoryOperationStats(us)
+               case fieldTrans:
+                       xfss.Transaction, err = transactionStats(us)
+               case fieldIg:
+                       xfss.InodeOperation, err = inodeOperationStats(us)
+               case fieldLog:
+                       xfss.LogOperation, err = logOperationStats(us)
+               case fieldRw:
+                       xfss.ReadWrite, err = readWriteStats(us)
+               case fieldAttr:
+                       xfss.AttributeOperation, err = attributeOperationStats(us)
+               case fieldIcluster:
+                       xfss.InodeClustering, err = inodeClusteringStats(us)
+               case fieldVnodes:
+                       xfss.Vnode, err = vnodeStats(us)
+               case fieldBuf:
+                       xfss.Buffer, err = bufferStats(us)
+               }
+               if err != nil {
+                       return nil, err
+               }
+       }
+
+       return &xfss, s.Err()
+}
+
+// extentAllocationStats builds an ExtentAllocationStats from a slice of uint32s.
+func extentAllocationStats(us []uint32) (ExtentAllocationStats, error) {
+       if l := len(us); l != 4 {
+               return ExtentAllocationStats{}, fmt.Errorf("incorrect number of values for XFS extent allocation stats: %d", l)
+       }
+
+       return ExtentAllocationStats{
+               ExtentsAllocated: us[0],
+               BlocksAllocated:  us[1],
+               ExtentsFreed:     us[2],
+               BlocksFreed:      us[3],
+       }, nil
+}
+
+// btreeStats builds a BTreeStats from a slice of uint32s.
+func btreeStats(us []uint32) (BTreeStats, error) {
+       if l := len(us); l != 4 {
+               return BTreeStats{}, fmt.Errorf("incorrect number of values for XFS btree stats: %d", l)
+       }
+
+       return BTreeStats{
+               Lookups:         us[0],
+               Compares:        us[1],
+               RecordsInserted: us[2],
+               RecordsDeleted:  us[3],
+       }, nil
+}
+
+// BlockMappingStat builds a BlockMappingStats from a slice of uint32s.
+func blockMappingStats(us []uint32) (BlockMappingStats, error) {
+       if l := len(us); l != 7 {
+               return BlockMappingStats{}, fmt.Errorf("incorrect number of values for XFS block mapping stats: %d", l)
+       }
+
+       return BlockMappingStats{
+               Reads:                us[0],
+               Writes:               us[1],
+               Unmaps:               us[2],
+               ExtentListInsertions: us[3],
+               ExtentListDeletions:  us[4],
+               ExtentListLookups:    us[5],
+               ExtentListCompares:   us[6],
+       }, nil
+}
+
+// DirectoryOperationStats builds a DirectoryOperationStats from a slice of uint32s.
+func directoryOperationStats(us []uint32) (DirectoryOperationStats, error) {
+       if l := len(us); l != 4 {
+               return DirectoryOperationStats{}, fmt.Errorf("incorrect number of values for XFS directory operation stats: %d", l)
+       }
+
+       return DirectoryOperationStats{
+               Lookups:  us[0],
+               Creates:  us[1],
+               Removes:  us[2],
+               Getdents: us[3],
+       }, nil
+}
+
+// TransactionStats builds a TransactionStats from a slice of uint32s.
+func transactionStats(us []uint32) (TransactionStats, error) {
+       if l := len(us); l != 3 {
+               return TransactionStats{}, fmt.Errorf("incorrect number of values for XFS transaction stats: %d", l)
+       }
+
+       return TransactionStats{
+               Sync:  us[0],
+               Async: us[1],
+               Empty: us[2],
+       }, nil
+}
+
+// InodeOperationStats builds an InodeOperationStats from a slice of uint32s.
+func inodeOperationStats(us []uint32) (InodeOperationStats, error) {
+       if l := len(us); l != 7 {
+               return InodeOperationStats{}, fmt.Errorf("incorrect number of values for XFS inode operation stats: %d", l)
+       }
+
+       return InodeOperationStats{
+               Attempts:        us[0],
+               Found:           us[1],
+               Recycle:         us[2],
+               Missed:          us[3],
+               Duplicate:       us[4],
+               Reclaims:        us[5],
+               AttributeChange: us[6],
+       }, nil
+}
+
+// LogOperationStats builds a LogOperationStats from a slice of uint32s.
+func logOperationStats(us []uint32) (LogOperationStats, error) {
+       if l := len(us); l != 5 {
+               return LogOperationStats{}, fmt.Errorf("incorrect number of values for XFS log operation stats: %d", l)
+       }
+
+       return LogOperationStats{
+               Writes:            us[0],
+               Blocks:            us[1],
+               NoInternalBuffers: us[2],
+               Force:             us[3],
+               ForceSleep:        us[4],
+       }, nil
+}
+
+// ReadWriteStats builds a ReadWriteStats from a slice of uint32s.
+func readWriteStats(us []uint32) (ReadWriteStats, error) {
+       if l := len(us); l != 2 {
+               return ReadWriteStats{}, fmt.Errorf("incorrect number of values for XFS read write stats: %d", l)
+       }
+
+       return ReadWriteStats{
+               Read:  us[0],
+               Write: us[1],
+       }, nil
+}
+
+// AttributeOperationStats builds an AttributeOperationStats from a slice of uint32s.
+func attributeOperationStats(us []uint32) (AttributeOperationStats, error) {
+       if l := len(us); l != 4 {
+               return AttributeOperationStats{}, fmt.Errorf("incorrect number of values for XFS attribute operation stats: %d", l)
+       }
+
+       return AttributeOperationStats{
+               Get:    us[0],
+               Set:    us[1],
+               Remove: us[2],
+               List:   us[3],
+       }, nil
+}
+
+// InodeClusteringStats builds an InodeClusteringStats from a slice of uint32s.
+func inodeClusteringStats(us []uint32) (InodeClusteringStats, error) {
+       if l := len(us); l != 3 {
+               return InodeClusteringStats{}, fmt.Errorf("incorrect number of values for XFS inode clustering stats: %d", l)
+       }
+
+       return InodeClusteringStats{
+               Iflush:     us[0],
+               Flush:      us[1],
+               FlushInode: us[2],
+       }, nil
+}
+
+// VnodeStats builds a VnodeStats from a slice of uint32s.
+func vnodeStats(us []uint32) (VnodeStats, error) {
+       // The attribute "Free" appears to not be available on older XFS
+       // stats versions.  Therefore, 7 or 8 elements may appear in
+       // this slice.
+       l := len(us)
+       if l != 7 && l != 8 {
+               return VnodeStats{}, fmt.Errorf("incorrect number of values for XFS vnode stats: %d", l)
+       }
+
+       s := VnodeStats{
+               Active:   us[0],
+               Allocate: us[1],
+               Get:      us[2],
+               Hold:     us[3],
+               Release:  us[4],
+               Reclaim:  us[5],
+               Remove:   us[6],
+       }
+
+       // Skip adding free, unless it is present. The zero value will
+       // be used in place of an actual count.
+       if l == 7 {
+               return s, nil
+       }
+
+       s.Free = us[7]
+       return s, nil
+}
+
+// BufferStats builds a BufferStats from a slice of uint32s.
+func bufferStats(us []uint32) (BufferStats, error) {
+       if l := len(us); l != 9 {
+               return BufferStats{}, fmt.Errorf("incorrect number of values for XFS buffer stats: %d", l)
+       }
+
+       return BufferStats{
+               Get:             us[0],
+               Create:          us[1],
+               GetLocked:       us[2],
+               GetLockedWaited: us[3],
+               BusyLocked:      us[4],
+               MissLocked:      us[5],
+               PageRetries:     us[6],
+               PageFound:       us[7],
+               GetRead:         us[8],
+       }, nil
+}
+
+// ExtendedPrecisionStats builds an ExtendedPrecisionStats from a slice of uint32s.
+func extendedPrecisionStats(us []uint64) (ExtendedPrecisionStats, error) {
+       if l := len(us); l != 3 {
+               return ExtendedPrecisionStats{}, fmt.Errorf("incorrect number of values for XFS extended precision stats: %d", l)
+       }
+
+       return ExtendedPrecisionStats{
+               FlushBytes: us[0],
+               WriteBytes: us[1],
+               ReadBytes:  us[2],
+       }, nil
+}
+
+// parseUint32s parses a slice of strings into a slice of uint32s.
+func parseUint32s(ss []string) ([]uint32, error) {
+       us := make([]uint32, 0, len(ss))
+       for _, s := range ss {
+               u, err := strconv.ParseUint(s, 10, 32)
+               if err != nil {
+                       return nil, err
+               }
+
+               us = append(us, uint32(u))
+       }
+
+       return us, nil
+}
+
+// parseUint64s parses a slice of strings into a slice of uint64s.
+func parseUint64s(ss []string) ([]uint64, error) {
+       us := make([]uint64, 0, len(ss))
+       for _, s := range ss {
+               u, err := strconv.ParseUint(s, 10, 64)
+               if err != nil {
+                       return nil, err
+               }
+
+               us = append(us, u)
+       }
+
+       return us, nil
+}
diff --git a/vendor/github.com/prometheus/procfs/xfs/xfs.go b/vendor/github.com/prometheus/procfs/xfs/xfs.go
new file mode 100644 (file)
index 0000000..d86794b
--- /dev/null
@@ -0,0 +1,163 @@
+// Copyright 2017 The Prometheus Authors
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Package xfs provides access to statistics exposed by the XFS filesystem.
+package xfs
+
+// Stats contains XFS filesystem runtime statistics, parsed from
+// /proc/fs/xfs/stat.
+//
+// The names and meanings of each statistic were taken from
+// http://xfs.org/index.php/Runtime_Stats and xfs_stats.h in the Linux
+// kernel source. Most counters are uint32s (same data types used in
+// xfs_stats.h), but some of the "extended precision stats" are uint64s.
+type Stats struct {
+       // The name of the filesystem used to source these statistics.
+       // If empty, this indicates aggregated statistics for all XFS
+       // filesystems on the host.
+       Name string
+
+       ExtentAllocation   ExtentAllocationStats
+       AllocationBTree    BTreeStats
+       BlockMapping       BlockMappingStats
+       BlockMapBTree      BTreeStats
+       DirectoryOperation DirectoryOperationStats
+       Transaction        TransactionStats
+       InodeOperation     InodeOperationStats
+       LogOperation       LogOperationStats
+       ReadWrite          ReadWriteStats
+       AttributeOperation AttributeOperationStats
+       InodeClustering    InodeClusteringStats
+       Vnode              VnodeStats
+       Buffer             BufferStats
+       ExtendedPrecision  ExtendedPrecisionStats
+}
+
+// ExtentAllocationStats contains statistics regarding XFS extent allocations.
+type ExtentAllocationStats struct {
+       ExtentsAllocated uint32
+       BlocksAllocated  uint32
+       ExtentsFreed     uint32
+       BlocksFreed      uint32
+}
+
+// BTreeStats contains statistics regarding an XFS internal B-tree.
+type BTreeStats struct {
+       Lookups         uint32
+       Compares        uint32
+       RecordsInserted uint32
+       RecordsDeleted  uint32
+}
+
+// BlockMappingStats contains statistics regarding XFS block maps.
+type BlockMappingStats struct {
+       Reads                uint32
+       Writes               uint32
+       Unmaps               uint32
+       ExtentListInsertions uint32
+       ExtentListDeletions  uint32
+       ExtentListLookups    uint32
+       ExtentListCompares   uint32
+}
+
+// DirectoryOperationStats contains statistics regarding XFS directory entries.
+type DirectoryOperationStats struct {
+       Lookups  uint32
+       Creates  uint32
+       Removes  uint32
+       Getdents uint32
+}
+
+// TransactionStats contains statistics regarding XFS metadata transactions.
+type TransactionStats struct {
+       Sync  uint32
+       Async uint32
+       Empty uint32
+}
+
+// InodeOperationStats contains statistics regarding XFS inode operations.
+type InodeOperationStats struct {
+       Attempts        uint32
+       Found           uint32
+       Recycle         uint32
+       Missed          uint32
+       Duplicate       uint32
+       Reclaims        uint32
+       AttributeChange uint32
+}
+
+// LogOperationStats contains statistics regarding the XFS log buffer.
+type LogOperationStats struct {
+       Writes            uint32
+       Blocks            uint32
+       NoInternalBuffers uint32
+       Force             uint32
+       ForceSleep        uint32
+}
+
+// ReadWriteStats contains statistics regarding the number of read and write
+// system calls for XFS filesystems.
+type ReadWriteStats struct {
+       Read  uint32
+       Write uint32
+}
+
+// AttributeOperationStats contains statistics regarding manipulation of
+// XFS extended file attributes.
+type AttributeOperationStats struct {
+       Get    uint32
+       Set    uint32
+       Remove uint32
+       List   uint32
+}
+
+// InodeClusteringStats contains statistics regarding XFS inode clustering
+// operations.
+type InodeClusteringStats struct {
+       Iflush     uint32
+       Flush      uint32
+       FlushInode uint32
+}
+
+// VnodeStats contains statistics regarding XFS vnode operations.
+type VnodeStats struct {
+       Active   uint32
+       Allocate uint32
+       Get      uint32
+       Hold     uint32
+       Release  uint32
+       Reclaim  uint32
+       Remove   uint32
+       Free     uint32
+}
+
+// BufferStats contains statistics regarding XFS read/write I/O buffers.
+type BufferStats struct {
+       Get             uint32
+       Create          uint32
+       GetLocked       uint32
+       GetLockedWaited uint32
+       BusyLocked      uint32
+       MissLocked      uint32
+       PageRetries     uint32
+       PageFound       uint32
+       GetRead         uint32
+}
+
+// ExtendedPrecisionStats contains high precision counters used to track the
+// total number of bytes read, written, or flushed, during XFS operations.
+type ExtendedPrecisionStats struct {
+       FlushBytes uint64
+       WriteBytes uint64
+       ReadBytes  uint64
+}
diff --git a/vendor/golang.org/x/net/bpf/asm.go b/vendor/golang.org/x/net/bpf/asm.go
new file mode 100644 (file)
index 0000000..15e21b1
--- /dev/null
@@ -0,0 +1,41 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package bpf
+
+import "fmt"
+
+// Assemble converts insts into raw instructions suitable for loading
+// into a BPF virtual machine.
+//
+// Currently, no optimization is attempted, the assembled program flow
+// is exactly as provided.
+func Assemble(insts []Instruction) ([]RawInstruction, error) {
+       ret := make([]RawInstruction, len(insts))
+       var err error
+       for i, inst := range insts {
+               ret[i], err = inst.Assemble()
+               if err != nil {
+                       return nil, fmt.Errorf("assembling instruction %d: %s", i+1, err)
+               }
+       }
+       return ret, nil
+}
+
+// Disassemble attempts to parse raw back into
+// Instructions. Unrecognized RawInstructions are assumed to be an
+// extension not implemented by this package, and are passed through
+// unchanged to the output. The allDecoded value reports whether insts
+// contains no RawInstructions.
+func Disassemble(raw []RawInstruction) (insts []Instruction, allDecoded bool) {
+       insts = make([]Instruction, len(raw))
+       allDecoded = true
+       for i, r := range raw {
+               insts[i] = r.Disassemble()
+               if _, ok := insts[i].(RawInstruction); ok {
+                       allDecoded = false
+               }
+       }
+       return insts, allDecoded
+}
diff --git a/vendor/golang.org/x/net/bpf/constants.go b/vendor/golang.org/x/net/bpf/constants.go
new file mode 100644 (file)
index 0000000..b89ca35
--- /dev/null
@@ -0,0 +1,218 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package bpf
+
+// A Register is a register of the BPF virtual machine.
+type Register uint16
+
+const (
+       // RegA is the accumulator register. RegA is always the
+       // destination register of ALU operations.
+       RegA Register = iota
+       // RegX is the indirection register, used by LoadIndirect
+       // operations.
+       RegX
+)
+
+// An ALUOp is an arithmetic or logic operation.
+type ALUOp uint16
+
+// ALU binary operation types.
+const (
+       ALUOpAdd ALUOp = iota << 4
+       ALUOpSub
+       ALUOpMul
+       ALUOpDiv
+       ALUOpOr
+       ALUOpAnd
+       ALUOpShiftLeft
+       ALUOpShiftRight
+       aluOpNeg // Not exported because it's the only unary ALU operation, and gets its own instruction type.
+       ALUOpMod
+       ALUOpXor
+)
+
+// A JumpTest is a comparison operator used in conditional jumps.
+type JumpTest uint16
+
+// Supported operators for conditional jumps.
+const (
+       // K == A
+       JumpEqual JumpTest = iota
+       // K != A
+       JumpNotEqual
+       // K > A
+       JumpGreaterThan
+       // K < A
+       JumpLessThan
+       // K >= A
+       JumpGreaterOrEqual
+       // K <= A
+       JumpLessOrEqual
+       // K & A != 0
+       JumpBitsSet
+       // K & A == 0
+       JumpBitsNotSet
+)
+
+// An Extension is a function call provided by the kernel that
+// performs advanced operations that are expensive or impossible
+// within the BPF virtual machine.
+//
+// Extensions are only implemented by the Linux kernel.
+//
+// TODO: should we prune this list? Some of these extensions seem
+// either broken or near-impossible to use correctly, whereas other
+// (len, random, ifindex) are quite useful.
+type Extension int
+
+// Extension functions available in the Linux kernel.
+const (
+       // extOffset is the negative maximum number of instructions used
+       // to load instructions by overloading the K argument.
+       extOffset = -0x1000
+       // ExtLen returns the length of the packet.
+       ExtLen Extension = 1
+       // ExtProto returns the packet's L3 protocol type.
+       ExtProto Extension = 0
+       // ExtType returns the packet's type (skb->pkt_type in the kernel)
+       //
+       // TODO: better documentation. How nice an API do we want to
+       // provide for these esoteric extensions?
+       ExtType Extension = 4
+       // ExtPayloadOffset returns the offset of the packet payload, or
+       // the first protocol header that the kernel does not know how to
+       // parse.
+       ExtPayloadOffset Extension = 52
+       // ExtInterfaceIndex returns the index of the interface on which
+       // the packet was received.
+       ExtInterfaceIndex Extension = 8
+       // ExtNetlinkAttr returns the netlink attribute of type X at
+       // offset A.
+       ExtNetlinkAttr Extension = 12
+       // ExtNetlinkAttrNested returns the nested netlink attribute of
+       // type X at offset A.
+       ExtNetlinkAttrNested Extension = 16
+       // ExtMark returns the packet's mark value.
+       ExtMark Extension = 20
+       // ExtQueue returns the packet's assigned hardware queue.
+       ExtQueue Extension = 24
+       // ExtLinkLayerType returns the packet's hardware address type
+       // (e.g. Ethernet, Infiniband).
+       ExtLinkLayerType Extension = 28
+       // ExtRXHash returns the packets receive hash.
+       //
+       // TODO: figure out what this rxhash actually is.
+       ExtRXHash Extension = 32
+       // ExtCPUID returns the ID of the CPU processing the current
+       // packet.
+       ExtCPUID Extension = 36
+       // ExtVLANTag returns the packet's VLAN tag.
+       ExtVLANTag Extension = 44
+       // ExtVLANTagPresent returns non-zero if the packet has a VLAN
+       // tag.
+       //
+       // TODO: I think this might be a lie: it reads bit 0x1000 of the
+       // VLAN header, which changed meaning in recent revisions of the
+       // spec - this extension may now return meaningless information.
+       ExtVLANTagPresent Extension = 48
+       // ExtVLANProto returns 0x8100 if the frame has a VLAN header,
+       // 0x88a8 if the frame has a "Q-in-Q" double VLAN header, or some
+       // other value if no VLAN information is present.
+       ExtVLANProto Extension = 60
+       // ExtRand returns a uniformly random uint32.
+       ExtRand Extension = 56
+)
+
+// The following gives names to various bit patterns used in opcode construction.
+
+const (
+       opMaskCls uint16 = 0x7
+       // opClsLoad masks
+       opMaskLoadDest  = 0x01
+       opMaskLoadWidth = 0x18
+       opMaskLoadMode  = 0xe0
+       // opClsALU
+       opMaskOperandSrc = 0x08
+       opMaskOperator   = 0xf0
+       // opClsJump
+       opMaskJumpConst = 0x0f
+       opMaskJumpCond  = 0xf0
+)
+
+const (
+       // +---------------+-----------------+---+---+---+
+       // | AddrMode (3b) | LoadWidth (2b)  | 0 | 0 | 0 |
+       // +---------------+-----------------+---+---+---+
+       opClsLoadA uint16 = iota
+       // +---------------+-----------------+---+---+---+
+       // | AddrMode (3b) | LoadWidth (2b)  | 0 | 0 | 1 |
+       // +---------------+-----------------+---+---+---+
+       opClsLoadX
+       // +---+---+---+---+---+---+---+---+
+       // | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
+       // +---+---+---+---+---+---+---+---+
+       opClsStoreA
+       // +---+---+---+---+---+---+---+---+
+       // | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
+       // +---+---+---+---+---+---+---+---+
+       opClsStoreX
+       // +---------------+-----------------+---+---+---+
+       // | Operator (4b) | OperandSrc (1b) | 1 | 0 | 0 |
+       // +---------------+-----------------+---+---+---+
+       opClsALU
+       // +-----------------------------+---+---+---+---+
+       // |      TestOperator (4b)      | 0 | 1 | 0 | 1 |
+       // +-----------------------------+---+---+---+---+
+       opClsJump
+       // +---+-------------------------+---+---+---+---+
+       // | 0 | 0 | 0 |   RetSrc (1b)   | 0 | 1 | 1 | 0 |
+       // +---+-------------------------+---+---+---+---+
+       opClsReturn
+       // +---+-------------------------+---+---+---+---+
+       // | 0 | 0 | 0 |  TXAorTAX (1b)  | 0 | 1 | 1 | 1 |
+       // +---+-------------------------+---+---+---+---+
+       opClsMisc
+)
+
+const (
+       opAddrModeImmediate uint16 = iota << 5
+       opAddrModeAbsolute
+       opAddrModeIndirect
+       opAddrModeScratch
+       opAddrModePacketLen // actually an extension, not an addressing mode.
+       opAddrModeMemShift
+)
+
+const (
+       opLoadWidth4 uint16 = iota << 3
+       opLoadWidth2
+       opLoadWidth1
+)
+
+// Operator defined by ALUOp*
+
+const (
+       opALUSrcConstant uint16 = iota << 3
+       opALUSrcX
+)
+
+const (
+       opJumpAlways = iota << 4
+       opJumpEqual
+       opJumpGT
+       opJumpGE
+       opJumpSet
+)
+
+const (
+       opRetSrcConstant uint16 = iota << 4
+       opRetSrcA
+)
+
+const (
+       opMiscTAX = 0x00
+       opMiscTXA = 0x80
+)
diff --git a/vendor/golang.org/x/net/bpf/doc.go b/vendor/golang.org/x/net/bpf/doc.go
new file mode 100644 (file)
index 0000000..ae62feb
--- /dev/null
@@ -0,0 +1,82 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+/*
+
+Package bpf implements marshaling and unmarshaling of programs for the
+Berkeley Packet Filter virtual machine, and provides a Go implementation
+of the virtual machine.
+
+BPF's main use is to specify a packet filter for network taps, so that
+the kernel doesn't have to expensively copy every packet it sees to
+userspace. However, it's been repurposed to other areas where running
+user code in-kernel is needed. For example, Linux's seccomp uses BPF
+to apply security policies to system calls. For simplicity, this
+documentation refers only to packets, but other uses of BPF have their
+own data payloads.
+
+BPF programs run in a restricted virtual machine. It has almost no
+access to kernel functions, and while conditional branches are
+allowed, they can only jump forwards, to guarantee that there are no
+infinite loops.
+
+The virtual machine
+
+The BPF VM is an accumulator machine. Its main register, called
+register A, is an implicit source and destination in all arithmetic
+and logic operations. The machine also has 16 scratch registers for
+temporary storage, and an indirection register (register X) for
+indirect memory access. All registers are 32 bits wide.
+
+Each run of a BPF program is given one packet, which is placed in the
+VM's read-only "main memory". LoadAbsolute and LoadIndirect
+instructions can fetch up to 32 bits at a time into register A for
+examination.
+
+The goal of a BPF program is to produce and return a verdict (uint32),
+which tells the kernel what to do with the packet. In the context of
+packet filtering, the returned value is the number of bytes of the
+packet to forward to userspace, or 0 to ignore the packet. Other
+contexts like seccomp define their own return values.
+
+In order to simplify programs, attempts to read past the end of the
+packet terminate the program execution with a verdict of 0 (ignore
+packet). This means that the vast majority of BPF programs don't need
+to do any explicit bounds checking.
+
+In addition to the bytes of the packet, some BPF programs have access
+to extensions, which are essentially calls to kernel utility
+functions. Currently, the only extensions supported by this package
+are the Linux packet filter extensions.
+
+Examples
+
+This packet filter selects all ARP packets.
+
+       bpf.Assemble([]bpf.Instruction{
+               // Load "EtherType" field from the ethernet header.
+               bpf.LoadAbsolute{Off: 12, Size: 2},
+               // Skip over the next instruction if EtherType is not ARP.
+               bpf.JumpIf{Cond: bpf.JumpNotEqual, Val: 0x0806, SkipTrue: 1},
+               // Verdict is "send up to 4k of the packet to userspace."
+               bpf.RetConstant{Val: 4096},
+               // Verdict is "ignore packet."
+               bpf.RetConstant{Val: 0},
+       })
+
+This packet filter captures a random 1% sample of traffic.
+
+       bpf.Assemble([]bpf.Instruction{
+               // Get a 32-bit random number from the Linux kernel.
+               bpf.LoadExtension{Num: bpf.ExtRand},
+               // 1% dice roll?
+               bpf.JumpIf{Cond: bpf.JumpLessThan, Val: 2^32/100, SkipFalse: 1},
+               // Capture.
+               bpf.RetConstant{Val: 4096},
+               // Ignore.
+               bpf.RetConstant{Val: 0},
+       })
+
+*/
+package bpf // import "golang.org/x/net/bpf"
diff --git a/vendor/golang.org/x/net/bpf/instructions.go b/vendor/golang.org/x/net/bpf/instructions.go
new file mode 100644 (file)
index 0000000..3b4fd08
--- /dev/null
@@ -0,0 +1,704 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package bpf
+
+import "fmt"
+
+// An Instruction is one instruction executed by the BPF virtual
+// machine.
+type Instruction interface {
+       // Assemble assembles the Instruction into a RawInstruction.
+       Assemble() (RawInstruction, error)
+}
+
+// A RawInstruction is a raw BPF virtual machine instruction.
+type RawInstruction struct {
+       // Operation to execute.
+       Op uint16
+       // For conditional jump instructions, the number of instructions
+       // to skip if the condition is true/false.
+       Jt uint8
+       Jf uint8
+       // Constant parameter. The meaning depends on the Op.
+       K uint32
+}
+
+// Assemble implements the Instruction Assemble method.
+func (ri RawInstruction) Assemble() (RawInstruction, error) { return ri, nil }
+
+// Disassemble parses ri into an Instruction and returns it. If ri is
+// not recognized by this package, ri itself is returned.
+func (ri RawInstruction) Disassemble() Instruction {
+       switch ri.Op & opMaskCls {
+       case opClsLoadA, opClsLoadX:
+               reg := Register(ri.Op & opMaskLoadDest)
+               sz := 0
+               switch ri.Op & opMaskLoadWidth {
+               case opLoadWidth4:
+                       sz = 4
+               case opLoadWidth2:
+                       sz = 2
+               case opLoadWidth1:
+                       sz = 1
+               default:
+                       return ri
+               }
+               switch ri.Op & opMaskLoadMode {
+               case opAddrModeImmediate:
+                       if sz != 4 {
+                               return ri
+                       }
+                       return LoadConstant{Dst: reg, Val: ri.K}
+               case opAddrModeScratch:
+                       if sz != 4 || ri.K > 15 {
+                               return ri
+                       }
+                       return LoadScratch{Dst: reg, N: int(ri.K)}
+               case opAddrModeAbsolute:
+                       if ri.K > extOffset+0xffffffff {
+                               return LoadExtension{Num: Extension(-extOffset + ri.K)}
+                       }
+                       return LoadAbsolute{Size: sz, Off: ri.K}
+               case opAddrModeIndirect:
+                       return LoadIndirect{Size: sz, Off: ri.K}
+               case opAddrModePacketLen:
+                       if sz != 4 {
+                               return ri
+                       }
+                       return LoadExtension{Num: ExtLen}
+               case opAddrModeMemShift:
+                       return LoadMemShift{Off: ri.K}
+               default:
+                       return ri
+               }
+
+       case opClsStoreA:
+               if ri.Op != opClsStoreA || ri.K > 15 {
+                       return ri
+               }
+               return StoreScratch{Src: RegA, N: int(ri.K)}
+
+       case opClsStoreX:
+               if ri.Op != opClsStoreX || ri.K > 15 {
+                       return ri
+               }
+               return StoreScratch{Src: RegX, N: int(ri.K)}
+
+       case opClsALU:
+               switch op := ALUOp(ri.Op & opMaskOperator); op {
+               case ALUOpAdd, ALUOpSub, ALUOpMul, ALUOpDiv, ALUOpOr, ALUOpAnd, ALUOpShiftLeft, ALUOpShiftRight, ALUOpMod, ALUOpXor:
+                       if ri.Op&opMaskOperandSrc != 0 {
+                               return ALUOpX{Op: op}
+                       }
+                       return ALUOpConstant{Op: op, Val: ri.K}
+               case aluOpNeg:
+                       return NegateA{}
+               default:
+                       return ri
+               }
+
+       case opClsJump:
+               if ri.Op&opMaskJumpConst != opClsJump {
+                       return ri
+               }
+               switch ri.Op & opMaskJumpCond {
+               case opJumpAlways:
+                       return Jump{Skip: ri.K}
+               case opJumpEqual:
+                       if ri.Jt == 0 {
+                               return JumpIf{
+                                       Cond:      JumpNotEqual,
+                                       Val:       ri.K,
+                                       SkipTrue:  ri.Jf,
+                                       SkipFalse: 0,
+                               }
+                       }
+                       return JumpIf{
+                               Cond:      JumpEqual,
+                               Val:       ri.K,
+                               SkipTrue:  ri.Jt,
+                               SkipFalse: ri.Jf,
+                       }
+               case opJumpGT:
+                       if ri.Jt == 0 {
+                               return JumpIf{
+                                       Cond:      JumpLessOrEqual,
+                                       Val:       ri.K,
+                                       SkipTrue:  ri.Jf,
+                                       SkipFalse: 0,
+                               }
+                       }
+                       return JumpIf{
+                               Cond:      JumpGreaterThan,
+                               Val:       ri.K,
+                               SkipTrue:  ri.Jt,
+                               SkipFalse: ri.Jf,
+                       }
+               case opJumpGE:
+                       if ri.Jt == 0 {
+                               return JumpIf{
+                                       Cond:      JumpLessThan,
+                                       Val:       ri.K,
+                                       SkipTrue:  ri.Jf,
+                                       SkipFalse: 0,
+                               }
+                       }
+                       return JumpIf{
+                               Cond:      JumpGreaterOrEqual,
+                               Val:       ri.K,
+                               SkipTrue:  ri.Jt,
+                               SkipFalse: ri.Jf,
+                       }
+               case opJumpSet:
+                       return JumpIf{
+                               Cond:      JumpBitsSet,
+                               Val:       ri.K,
+                               SkipTrue:  ri.Jt,
+                               SkipFalse: ri.Jf,
+                       }
+               default:
+                       return ri
+               }
+
+       case opClsReturn:
+               switch ri.Op {
+               case opClsReturn | opRetSrcA:
+                       return RetA{}
+               case opClsReturn | opRetSrcConstant:
+                       return RetConstant{Val: ri.K}
+               default:
+                       return ri
+               }
+
+       case opClsMisc:
+               switch ri.Op {
+               case opClsMisc | opMiscTAX:
+                       return TAX{}
+               case opClsMisc | opMiscTXA:
+                       return TXA{}
+               default:
+                       return ri
+               }
+
+       default:
+               panic("unreachable") // switch is exhaustive on the bit pattern
+       }
+}
+
+// LoadConstant loads Val into register Dst.
+type LoadConstant struct {
+       Dst Register
+       Val uint32
+}
+
+// Assemble implements the Instruction Assemble method.
+func (a LoadConstant) Assemble() (RawInstruction, error) {
+       return assembleLoad(a.Dst, 4, opAddrModeImmediate, a.Val)
+}
+
+// String returns the the instruction in assembler notation.
+func (a LoadConstant) String() string {
+       switch a.Dst {
+       case RegA:
+               return fmt.Sprintf("ld #%d", a.Val)
+       case RegX:
+               return fmt.Sprintf("ldx #%d", a.Val)
+       default:
+               return fmt.Sprintf("unknown instruction: %#v", a)
+       }
+}
+
+// LoadScratch loads scratch[N] into register Dst.
+type LoadScratch struct {
+       Dst Register
+       N   int // 0-15
+}
+
+// Assemble implements the Instruction Assemble method.
+func (a LoadScratch) Assemble() (RawInstruction, error) {
+       if a.N < 0 || a.N > 15 {
+               return RawInstruction{}, fmt.Errorf("invalid scratch slot %d", a.N)
+       }
+       return assembleLoad(a.Dst, 4, opAddrModeScratch, uint32(a.N))
+}
+
+// String returns the the instruction in assembler notation.
+func (a LoadScratch) String() string {
+       switch a.Dst {
+       case RegA:
+               return fmt.Sprintf("ld M[%d]", a.N)
+       case RegX:
+               return fmt.Sprintf("ldx M[%d]", a.N)
+       default:
+               return fmt.Sprintf("unknown instruction: %#v", a)
+       }
+}
+
+// LoadAbsolute loads packet[Off:Off+Size] as an integer value into
+// register A.
+type LoadAbsolute struct {
+       Off  uint32
+       Size int // 1, 2 or 4
+}
+
+// Assemble implements the Instruction Assemble method.
+func (a LoadAbsolute) Assemble() (RawInstruction, error) {
+       return assembleLoad(RegA, a.Size, opAddrModeAbsolute, a.Off)
+}
+
+// String returns the the instruction in assembler notation.
+func (a LoadAbsolute) String() string {
+       switch a.Size {
+       case 1: // byte
+               return fmt.Sprintf("ldb [%d]", a.Off)
+       case 2: // half word
+               return fmt.Sprintf("ldh [%d]", a.Off)
+       case 4: // word
+               if a.Off > extOffset+0xffffffff {
+                       return LoadExtension{Num: Extension(a.Off + 0x1000)}.String()
+               }
+               return fmt.Sprintf("ld [%d]", a.Off)
+       default:
+               return fmt.Sprintf("unknown instruction: %#v", a)
+       }
+}
+
+// LoadIndirect loads packet[X+Off:X+Off+Size] as an integer value
+// into register A.
+type LoadIndirect struct {
+       Off  uint32
+       Size int // 1, 2 or 4
+}
+
+// Assemble implements the Instruction Assemble method.
+func (a LoadIndirect) Assemble() (RawInstruction, error) {
+       return assembleLoad(RegA, a.Size, opAddrModeIndirect, a.Off)
+}
+
+// String returns the the instruction in assembler notation.
+func (a LoadIndirect) String() string {
+       switch a.Size {
+       case 1: // byte
+               return fmt.Sprintf("ldb [x + %d]", a.Off)
+       case 2: // half word
+               return fmt.Sprintf("ldh [x + %d]", a.Off)
+       case 4: // word
+               return fmt.Sprintf("ld [x + %d]", a.Off)
+       default:
+               return fmt.Sprintf("unknown instruction: %#v", a)
+       }
+}
+
+// LoadMemShift multiplies the first 4 bits of the byte at packet[Off]
+// by 4 and stores the result in register X.
+//
+// This instruction is mainly useful to load into X the length of an
+// IPv4 packet header in a single instruction, rather than have to do
+// the arithmetic on the header's first byte by hand.
+type LoadMemShift struct {
+       Off uint32
+}
+
+// Assemble implements the Instruction Assemble method.
+func (a LoadMemShift) Assemble() (RawInstruction, error) {
+       return assembleLoad(RegX, 1, opAddrModeMemShift, a.Off)
+}
+
+// String returns the the instruction in assembler notation.
+func (a LoadMemShift) String() string {
+       return fmt.Sprintf("ldx 4*([%d]&0xf)", a.Off)
+}
+
+// LoadExtension invokes a linux-specific extension and stores the
+// result in register A.
+type LoadExtension struct {
+       Num Extension
+}
+
+// Assemble implements the Instruction Assemble method.
+func (a LoadExtension) Assemble() (RawInstruction, error) {
+       if a.Num == ExtLen {
+               return assembleLoad(RegA, 4, opAddrModePacketLen, 0)
+       }
+       return assembleLoad(RegA, 4, opAddrModeAbsolute, uint32(extOffset+a.Num))
+}
+
+// String returns the the instruction in assembler notation.
+func (a LoadExtension) String() string {
+       switch a.Num {
+       case ExtLen:
+               return "ld #len"
+       case ExtProto:
+               return "ld #proto"
+       case ExtType:
+               return "ld #type"
+       case ExtPayloadOffset:
+               return "ld #poff"
+       case ExtInterfaceIndex:
+               return "ld #ifidx"
+       case ExtNetlinkAttr:
+               return "ld #nla"
+       case ExtNetlinkAttrNested:
+               return "ld #nlan"
+       case ExtMark:
+               return "ld #mark"
+       case ExtQueue:
+               return "ld #queue"
+       case ExtLinkLayerType:
+               return "ld #hatype"
+       case ExtRXHash:
+               return "ld #rxhash"
+       case ExtCPUID:
+               return "ld #cpu"
+       case ExtVLANTag:
+               return "ld #vlan_tci"
+       case ExtVLANTagPresent:
+               return "ld #vlan_avail"
+       case ExtVLANProto:
+               return "ld #vlan_tpid"
+       case ExtRand:
+               return "ld #rand"
+       default:
+               return fmt.Sprintf("unknown instruction: %#v", a)
+       }
+}
+
+// StoreScratch stores register Src into scratch[N].
+type StoreScratch struct {
+       Src Register
+       N   int // 0-15
+}
+
+// Assemble implements the Instruction Assemble method.
+func (a StoreScratch) Assemble() (RawInstruction, error) {
+       if a.N < 0 || a.N > 15 {
+               return RawInstruction{}, fmt.Errorf("invalid scratch slot %d", a.N)
+       }
+       var op uint16
+       switch a.Src {
+       case RegA:
+               op = opClsStoreA
+       case RegX:
+               op = opClsStoreX
+       default:
+               return RawInstruction{}, fmt.Errorf("invalid source register %v", a.Src)
+       }
+
+       return RawInstruction{
+               Op: op,
+               K:  uint32(a.N),
+       }, nil
+}
+
+// String returns the the instruction in assembler notation.
+func (a StoreScratch) String() string {
+       switch a.Src {
+       case RegA:
+               return fmt.Sprintf("st M[%d]", a.N)
+       case RegX:
+               return fmt.Sprintf("stx M[%d]", a.N)
+       default:
+               return fmt.Sprintf("unknown instruction: %#v", a)
+       }
+}
+
+// ALUOpConstant executes A = A <Op> Val.
+type ALUOpConstant struct {
+       Op  ALUOp
+       Val uint32
+}
+
+// Assemble implements the Instruction Assemble method.
+func (a ALUOpConstant) Assemble() (RawInstruction, error) {
+       return RawInstruction{
+               Op: opClsALU | opALUSrcConstant | uint16(a.Op),
+               K:  a.Val,
+       }, nil
+}
+
+// String returns the the instruction in assembler notation.
+func (a ALUOpConstant) String() string {
+       switch a.Op {
+       case ALUOpAdd:
+               return fmt.Sprintf("add #%d", a.Val)
+       case ALUOpSub:
+               return fmt.Sprintf("sub #%d", a.Val)
+       case ALUOpMul:
+               return fmt.Sprintf("mul #%d", a.Val)
+       case ALUOpDiv:
+               return fmt.Sprintf("div #%d", a.Val)
+       case ALUOpMod:
+               return fmt.Sprintf("mod #%d", a.Val)
+       case ALUOpAnd:
+               return fmt.Sprintf("and #%d", a.Val)
+       case ALUOpOr:
+               return fmt.Sprintf("or #%d", a.Val)
+       case ALUOpXor:
+               return fmt.Sprintf("xor #%d", a.Val)
+       case ALUOpShiftLeft:
+               return fmt.Sprintf("lsh #%d", a.Val)
+       case ALUOpShiftRight:
+               return fmt.Sprintf("rsh #%d", a.Val)
+       default:
+               return fmt.Sprintf("unknown instruction: %#v", a)
+       }
+}
+
+// ALUOpX executes A = A <Op> X
+type ALUOpX struct {
+       Op ALUOp
+}
+
+// Assemble implements the Instruction Assemble method.
+func (a ALUOpX) Assemble() (RawInstruction, error) {
+       return RawInstruction{
+               Op: opClsALU | opALUSrcX | uint16(a.Op),
+       }, nil
+}
+
+// String returns the the instruction in assembler notation.
+func (a ALUOpX) String() string {
+       switch a.Op {
+       case ALUOpAdd:
+               return "add x"
+       case ALUOpSub:
+               return "sub x"
+       case ALUOpMul:
+               return "mul x"
+       case ALUOpDiv:
+               return "div x"
+       case ALUOpMod:
+               return "mod x"
+       case ALUOpAnd:
+               return "and x"
+       case ALUOpOr:
+               return "or x"
+       case ALUOpXor:
+               return "xor x"
+       case ALUOpShiftLeft:
+               return "lsh x"
+       case ALUOpShiftRight:
+               return "rsh x"
+       default:
+               return fmt.Sprintf("unknown instruction: %#v", a)
+       }
+}
+
+// NegateA executes A = -A.
+type NegateA struct{}
+
+// Assemble implements the Instruction Assemble method.
+func (a NegateA) Assemble() (RawInstruction, error) {
+       return RawInstruction{
+               Op: opClsALU | uint16(aluOpNeg),
+       }, nil
+}
+
+// String returns the the instruction in assembler notation.
+func (a NegateA) String() string {
+       return fmt.Sprintf("neg")
+}
+
+// Jump skips the following Skip instructions in the program.
+type Jump struct {
+       Skip uint32
+}
+
+// Assemble implements the Instruction Assemble method.
+func (a Jump) Assemble() (RawInstruction, error) {
+       return RawInstruction{
+               Op: opClsJump | opJumpAlways,
+               K:  a.Skip,
+       }, nil
+}
+
+// String returns the the instruction in assembler notation.
+func (a Jump) String() string {
+       return fmt.Sprintf("ja %d", a.Skip)
+}
+
+// JumpIf skips the following Skip instructions in the program if A
+// <Cond> Val is true.
+type JumpIf struct {
+       Cond      JumpTest
+       Val       uint32
+       SkipTrue  uint8
+       SkipFalse uint8
+}
+
+// Assemble implements the Instruction Assemble method.
+func (a JumpIf) Assemble() (RawInstruction, error) {
+       var (
+               cond uint16
+               flip bool
+       )
+       switch a.Cond {
+       case JumpEqual:
+               cond = opJumpEqual
+       case JumpNotEqual:
+               cond, flip = opJumpEqual, true
+       case JumpGreaterThan:
+               cond = opJumpGT
+       case JumpLessThan:
+               cond, flip = opJumpGE, true
+       case JumpGreaterOrEqual:
+               cond = opJumpGE
+       case JumpLessOrEqual:
+               cond, flip = opJumpGT, true
+       case JumpBitsSet:
+               cond = opJumpSet
+       case JumpBitsNotSet:
+               cond, flip = opJumpSet, true
+       default:
+               return RawInstruction{}, fmt.Errorf("unknown JumpTest %v", a.Cond)
+       }
+       jt, jf := a.SkipTrue, a.SkipFalse
+       if flip {
+               jt, jf = jf, jt
+       }
+       return RawInstruction{
+               Op: opClsJump | cond,
+               Jt: jt,
+               Jf: jf,
+               K:  a.Val,
+       }, nil
+}
+
+// String returns the the instruction in assembler notation.
+func (a JumpIf) String() string {
+       switch a.Cond {
+       // K == A
+       case JumpEqual:
+               return conditionalJump(a, "jeq", "jneq")
+       // K != A
+       case JumpNotEqual:
+               return fmt.Sprintf("jneq #%d,%d", a.Val, a.SkipTrue)
+       // K > A
+       case JumpGreaterThan:
+               return conditionalJump(a, "jgt", "jle")
+       // K < A
+       case JumpLessThan:
+               return fmt.Sprintf("jlt #%d,%d", a.Val, a.SkipTrue)
+       // K >= A
+       case JumpGreaterOrEqual:
+               return conditionalJump(a, "jge", "jlt")
+       // K <= A
+       case JumpLessOrEqual:
+               return fmt.Sprintf("jle #%d,%d", a.Val, a.SkipTrue)
+       // K & A != 0
+       case JumpBitsSet:
+               if a.SkipFalse > 0 {
+                       return fmt.Sprintf("jset #%d,%d,%d", a.Val, a.SkipTrue, a.SkipFalse)
+               }
+               return fmt.Sprintf("jset #%d,%d", a.Val, a.SkipTrue)
+       // K & A == 0, there is no assembler instruction for JumpBitNotSet, use JumpBitSet and invert skips
+       case JumpBitsNotSet:
+               return JumpIf{Cond: JumpBitsSet, SkipTrue: a.SkipFalse, SkipFalse: a.SkipTrue, Val: a.Val}.String()
+       default:
+               return fmt.Sprintf("unknown instruction: %#v", a)
+       }
+}
+
+func conditionalJump(inst JumpIf, positiveJump, negativeJump string) string {
+       if inst.SkipTrue > 0 {
+               if inst.SkipFalse > 0 {
+                       return fmt.Sprintf("%s #%d,%d,%d", positiveJump, inst.Val, inst.SkipTrue, inst.SkipFalse)
+               }
+               return fmt.Sprintf("%s #%d,%d", positiveJump, inst.Val, inst.SkipTrue)
+       }
+       return fmt.Sprintf("%s #%d,%d", negativeJump, inst.Val, inst.SkipFalse)
+}
+
+// RetA exits the BPF program, returning the value of register A.
+type RetA struct{}
+
+// Assemble implements the Instruction Assemble method.
+func (a RetA) Assemble() (RawInstruction, error) {
+       return RawInstruction{
+               Op: opClsReturn | opRetSrcA,
+       }, nil
+}
+
+// String returns the the instruction in assembler notation.
+func (a RetA) String() string {
+       return fmt.Sprintf("ret a")
+}
+
+// RetConstant exits the BPF program, returning a constant value.
+type RetConstant struct {
+       Val uint32
+}
+
+// Assemble implements the Instruction Assemble method.
+func (a RetConstant) Assemble() (RawInstruction, error) {
+       return RawInstruction{
+               Op: opClsReturn | opRetSrcConstant,
+               K:  a.Val,
+       }, nil
+}
+
+// String returns the the instruction in assembler notation.
+func (a RetConstant) String() string {
+       return fmt.Sprintf("ret #%d", a.Val)
+}
+
+// TXA copies the value of register X to register A.
+type TXA struct{}
+
+// Assemble implements the Instruction Assemble method.
+func (a TXA) Assemble() (RawInstruction, error) {
+       return RawInstruction{
+               Op: opClsMisc | opMiscTXA,
+       }, nil
+}
+
+// String returns the the instruction in assembler notation.
+func (a TXA) String() string {
+       return fmt.Sprintf("txa")
+}
+
+// TAX copies the value of register A to register X.
+type TAX struct{}
+
+// Assemble implements the Instruction Assemble method.
+func (a TAX) Assemble() (RawInstruction, error) {
+       return RawInstruction{
+               Op: opClsMisc | opMiscTAX,
+       }, nil
+}
+
+// String returns the the instruction in assembler notation.
+func (a TAX) String() string {
+       return fmt.Sprintf("tax")
+}
+
+func assembleLoad(dst Register, loadSize int, mode uint16, k uint32) (RawInstruction, error) {
+       var (
+               cls uint16
+               sz  uint16
+       )
+       switch dst {
+       case RegA:
+               cls = opClsLoadA
+       case RegX:
+               cls = opClsLoadX
+       default:
+               return RawInstruction{}, fmt.Errorf("invalid target register %v", dst)
+       }
+       switch loadSize {
+       case 1:
+               sz = opLoadWidth1
+       case 2:
+               sz = opLoadWidth2
+       case 4:
+               sz = opLoadWidth4
+       default:
+               return RawInstruction{}, fmt.Errorf("invalid load byte length %d", sz)
+       }
+       return RawInstruction{
+               Op: cls | sz | mode,
+               K:  k,
+       }, nil
+}
diff --git a/vendor/golang.org/x/net/bpf/setter.go b/vendor/golang.org/x/net/bpf/setter.go
new file mode 100644 (file)
index 0000000..43e35f0
--- /dev/null
@@ -0,0 +1,10 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package bpf
+
+// A Setter is a type which can attach a compiled BPF filter to itself.
+type Setter interface {
+       SetBPF(filter []RawInstruction) error
+}
diff --git a/vendor/golang.org/x/net/bpf/vm.go b/vendor/golang.org/x/net/bpf/vm.go
new file mode 100644 (file)
index 0000000..4c656f1
--- /dev/null
@@ -0,0 +1,140 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package bpf
+
+import (
+       "errors"
+       "fmt"
+)
+
+// A VM is an emulated BPF virtual machine.
+type VM struct {
+       filter []Instruction
+}
+
+// NewVM returns a new VM using the input BPF program.
+func NewVM(filter []Instruction) (*VM, error) {
+       if len(filter) == 0 {
+               return nil, errors.New("one or more Instructions must be specified")
+       }
+
+       for i, ins := range filter {
+               check := len(filter) - (i + 1)
+               switch ins := ins.(type) {
+               // Check for out-of-bounds jumps in instructions
+               case Jump:
+                       if check <= int(ins.Skip) {
+                               return nil, fmt.Errorf("cannot jump %d instructions; jumping past program bounds", ins.Skip)
+                       }
+               case JumpIf:
+                       if check <= int(ins.SkipTrue) {
+                               return nil, fmt.Errorf("cannot jump %d instructions in true case; jumping past program bounds", ins.SkipTrue)
+                       }
+                       if check <= int(ins.SkipFalse) {
+                               return nil, fmt.Errorf("cannot jump %d instructions in false case; jumping past program bounds", ins.SkipFalse)
+                       }
+               // Check for division or modulus by zero
+               case ALUOpConstant:
+                       if ins.Val != 0 {
+                               break
+                       }
+
+                       switch ins.Op {
+                       case ALUOpDiv, ALUOpMod:
+                               return nil, errors.New("cannot divide by zero using ALUOpConstant")
+                       }
+               // Check for unknown extensions
+               case LoadExtension:
+                       switch ins.Num {
+                       case ExtLen:
+                       default:
+                               return nil, fmt.Errorf("extension %d not implemented", ins.Num)
+                       }
+               }
+       }
+
+       // Make sure last instruction is a return instruction
+       switch filter[len(filter)-1].(type) {
+       case RetA, RetConstant:
+       default:
+               return nil, errors.New("BPF program must end with RetA or RetConstant")
+       }
+
+       // Though our VM works using disassembled instructions, we
+       // attempt to assemble the input filter anyway to ensure it is compatible
+       // with an operating system VM.
+       _, err := Assemble(filter)
+
+       return &VM{
+               filter: filter,
+       }, err
+}
+
+// Run runs the VM's BPF program against the input bytes.
+// Run returns the number of bytes accepted by the BPF program, and any errors
+// which occurred while processing the program.
+func (v *VM) Run(in []byte) (int, error) {
+       var (
+               // Registers of the virtual machine
+               regA       uint32
+               regX       uint32
+               regScratch [16]uint32
+
+               // OK is true if the program should continue processing the next
+               // instruction, or false if not, causing the loop to break
+               ok = true
+       )
+
+       // TODO(mdlayher): implement:
+       // - NegateA:
+       //   - would require a change from uint32 registers to int32
+       //     registers
+
+       // TODO(mdlayher): add interop tests that check signedness of ALU
+       // operations against kernel implementation, and make sure Go
+       // implementation matches behavior
+
+       for i := 0; i < len(v.filter) && ok; i++ {
+               ins := v.filter[i]
+
+               switch ins := ins.(type) {
+               case ALUOpConstant:
+                       regA = aluOpConstant(ins, regA)
+               case ALUOpX:
+                       regA, ok = aluOpX(ins, regA, regX)
+               case Jump:
+                       i += int(ins.Skip)
+               case JumpIf:
+                       jump := jumpIf(ins, regA)
+                       i += jump
+               case LoadAbsolute:
+                       regA, ok = loadAbsolute(ins, in)
+               case LoadConstant:
+                       regA, regX = loadConstant(ins, regA, regX)
+               case LoadExtension:
+                       regA = loadExtension(ins, in)
+               case LoadIndirect:
+                       regA, ok = loadIndirect(ins, in, regX)
+               case LoadMemShift:
+                       regX, ok = loadMemShift(ins, in)
+               case LoadScratch:
+                       regA, regX = loadScratch(ins, regScratch, regA, regX)
+               case RetA:
+                       return int(regA), nil
+               case RetConstant:
+                       return int(ins.Val), nil
+               case StoreScratch:
+                       regScratch = storeScratch(ins, regScratch, regA, regX)
+               case TAX:
+                       regX = regA
+               case TXA:
+                       regA = regX
+               default:
+                       return 0, fmt.Errorf("unknown Instruction at index %d: %T", i, ins)
+               }
+       }
+
+       return 0, nil
+}
diff --git a/vendor/golang.org/x/net/bpf/vm_instructions.go b/vendor/golang.org/x/net/bpf/vm_instructions.go
new file mode 100644 (file)
index 0000000..516f946
--- /dev/null
@@ -0,0 +1,174 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package bpf
+
+import (
+       "encoding/binary"
+       "fmt"
+)
+
+func aluOpConstant(ins ALUOpConstant, regA uint32) uint32 {
+       return aluOpCommon(ins.Op, regA, ins.Val)
+}
+
+func aluOpX(ins ALUOpX, regA uint32, regX uint32) (uint32, bool) {
+       // Guard against division or modulus by zero by terminating
+       // the program, as the OS BPF VM does
+       if regX == 0 {
+               switch ins.Op {
+               case ALUOpDiv, ALUOpMod:
+                       return 0, false
+               }
+       }
+
+       return aluOpCommon(ins.Op, regA, regX), true
+}
+
+func aluOpCommon(op ALUOp, regA uint32, value uint32) uint32 {
+       switch op {
+       case ALUOpAdd:
+               return regA + value
+       case ALUOpSub:
+               return regA - value
+       case ALUOpMul:
+               return regA * value
+       case ALUOpDiv:
+               // Division by zero not permitted by NewVM and aluOpX checks
+               return regA / value
+       case ALUOpOr:
+               return regA | value
+       case ALUOpAnd:
+               return regA & value
+       case ALUOpShiftLeft:
+               return regA << value
+       case ALUOpShiftRight:
+               return regA >> value
+       case ALUOpMod:
+               // Modulus by zero not permitted by NewVM and aluOpX checks
+               return regA % value
+       case ALUOpXor:
+               return regA ^ value
+       default:
+               return regA
+       }
+}
+
+func jumpIf(ins JumpIf, value uint32) int {
+       var ok bool
+       inV := uint32(ins.Val)
+
+       switch ins.Cond {
+       case JumpEqual:
+               ok = value == inV
+       case JumpNotEqual:
+               ok = value != inV
+       case JumpGreaterThan:
+               ok = value > inV
+       case JumpLessThan:
+               ok = value < inV
+       case JumpGreaterOrEqual:
+               ok = value >= inV
+       case JumpLessOrEqual:
+               ok = value <= inV
+       case JumpBitsSet:
+               ok = (value & inV) != 0
+       case JumpBitsNotSet:
+               ok = (value & inV) == 0
+       }
+
+       if ok {
+               return int(ins.SkipTrue)
+       }
+
+       return int(ins.SkipFalse)
+}
+
+func loadAbsolute(ins LoadAbsolute, in []byte) (uint32, bool) {
+       offset := int(ins.Off)
+       size := int(ins.Size)
+
+       return loadCommon(in, offset, size)
+}
+
+func loadConstant(ins LoadConstant, regA uint32, regX uint32) (uint32, uint32) {
+       switch ins.Dst {
+       case RegA:
+               regA = ins.Val
+       case RegX:
+               regX = ins.Val
+       }
+
+       return regA, regX
+}
+
+func loadExtension(ins LoadExtension, in []byte) uint32 {
+       switch ins.Num {
+       case ExtLen:
+               return uint32(len(in))
+       default:
+               panic(fmt.Sprintf("unimplemented extension: %d", ins.Num))
+       }
+}
+
+func loadIndirect(ins LoadIndirect, in []byte, regX uint32) (uint32, bool) {
+       offset := int(ins.Off) + int(regX)
+       size := int(ins.Size)
+
+       return loadCommon(in, offset, size)
+}
+
+func loadMemShift(ins LoadMemShift, in []byte) (uint32, bool) {
+       offset := int(ins.Off)
+
+       if !inBounds(len(in), offset, 0) {
+               return 0, false
+       }
+
+       // Mask off high 4 bits and multiply low 4 bits by 4
+       return uint32(in[offset]&0x0f) * 4, true
+}
+
+func inBounds(inLen int, offset int, size int) bool {
+       return offset+size <= inLen
+}
+
+func loadCommon(in []byte, offset int, size int) (uint32, bool) {
+       if !inBounds(len(in), offset, size) {
+               return 0, false
+       }
+
+       switch size {
+       case 1:
+               return uint32(in[offset]), true
+       case 2:
+               return uint32(binary.BigEndian.Uint16(in[offset : offset+size])), true
+       case 4:
+               return uint32(binary.BigEndian.Uint32(in[offset : offset+size])), true
+       default:
+               panic(fmt.Sprintf("invalid load size: %d", size))
+       }
+}
+
+func loadScratch(ins LoadScratch, regScratch [16]uint32, regA uint32, regX uint32) (uint32, uint32) {
+       switch ins.Dst {
+       case RegA:
+               regA = regScratch[ins.N]
+       case RegX:
+               regX = regScratch[ins.N]
+       }
+
+       return regA, regX
+}
+
+func storeScratch(ins StoreScratch, regScratch [16]uint32, regA uint32, regX uint32) [16]uint32 {
+       switch ins.Src {
+       case RegA:
+               regScratch[ins.N] = regA
+       case RegX:
+               regScratch[ins.N] = regX
+       }
+
+       return regScratch
+}
diff --git a/vendor/golang.org/x/net/internal/socket/cmsghdr.go b/vendor/golang.org/x/net/internal/socket/cmsghdr.go
new file mode 100644 (file)
index 0000000..1eb07d2
--- /dev/null
@@ -0,0 +1,11 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin dragonfly freebsd linux netbsd openbsd solaris
+
+package socket
+
+func (h *cmsghdr) len() int { return int(h.Len) }
+func (h *cmsghdr) lvl() int { return int(h.Level) }
+func (h *cmsghdr) typ() int { return int(h.Type) }
diff --git a/vendor/golang.org/x/net/internal/socket/cmsghdr_bsd.go b/vendor/golang.org/x/net/internal/socket/cmsghdr_bsd.go
new file mode 100644 (file)
index 0000000..d1d0c2d
--- /dev/null
@@ -0,0 +1,13 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin dragonfly freebsd netbsd openbsd
+
+package socket
+
+func (h *cmsghdr) set(l, lvl, typ int) {
+       h.Len = uint32(l)
+       h.Level = int32(lvl)
+       h.Type = int32(typ)
+}
diff --git a/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_32bit.go b/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_32bit.go
new file mode 100644 (file)
index 0000000..bac6681
--- /dev/null
@@ -0,0 +1,14 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build arm mips mipsle 386
+// +build linux
+
+package socket
+
+func (h *cmsghdr) set(l, lvl, typ int) {
+       h.Len = uint32(l)
+       h.Level = int32(lvl)
+       h.Type = int32(typ)
+}
diff --git a/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go b/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go
new file mode 100644 (file)
index 0000000..63f0534
--- /dev/null
@@ -0,0 +1,14 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build arm64 amd64 ppc64 ppc64le mips64 mips64le s390x
+// +build linux
+
+package socket
+
+func (h *cmsghdr) set(l, lvl, typ int) {
+       h.Len = uint64(l)
+       h.Level = int32(lvl)
+       h.Type = int32(typ)
+}
diff --git a/vendor/golang.org/x/net/internal/socket/cmsghdr_solaris_64bit.go b/vendor/golang.org/x/net/internal/socket/cmsghdr_solaris_64bit.go
new file mode 100644 (file)
index 0000000..7dedd43
--- /dev/null
@@ -0,0 +1,14 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build amd64
+// +build solaris
+
+package socket
+
+func (h *cmsghdr) set(l, lvl, typ int) {
+       h.Len = uint32(l)
+       h.Level = int32(lvl)
+       h.Type = int32(typ)
+}
diff --git a/vendor/golang.org/x/net/internal/socket/cmsghdr_stub.go b/vendor/golang.org/x/net/internal/socket/cmsghdr_stub.go
new file mode 100644 (file)
index 0000000..a4e7122
--- /dev/null
@@ -0,0 +1,17 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris
+
+package socket
+
+type cmsghdr struct{}
+
+const sizeofCmsghdr = 0
+
+func (h *cmsghdr) len() int { return 0 }
+func (h *cmsghdr) lvl() int { return 0 }
+func (h *cmsghdr) typ() int { return 0 }
+
+func (h *cmsghdr) set(l, lvl, typ int) {}
diff --git a/vendor/golang.org/x/net/internal/socket/defs_darwin.go b/vendor/golang.org/x/net/internal/socket/defs_darwin.go
new file mode 100644 (file)
index 0000000..14e28c0
--- /dev/null
@@ -0,0 +1,44 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build ignore
+
+// +godefs map struct_in_addr [4]byte /* in_addr */
+// +godefs map struct_in6_addr [16]byte /* in6_addr */
+
+package socket
+
+/*
+#include <sys/socket.h>
+
+#include <netinet/in.h>
+*/
+import "C"
+
+const (
+       sysAF_UNSPEC = C.AF_UNSPEC
+       sysAF_INET   = C.AF_INET
+       sysAF_INET6  = C.AF_INET6
+
+       sysSOCK_RAW = C.SOCK_RAW
+)
+
+type iovec C.struct_iovec
+
+type msghdr C.struct_msghdr
+
+type cmsghdr C.struct_cmsghdr
+
+type sockaddrInet C.struct_sockaddr_in
+
+type sockaddrInet6 C.struct_sockaddr_in6
+
+const (
+       sizeofIovec   = C.sizeof_struct_iovec
+       sizeofMsghdr  = C.sizeof_struct_msghdr
+       sizeofCmsghdr = C.sizeof_struct_cmsghdr
+
+       sizeofSockaddrInet  = C.sizeof_struct_sockaddr_in
+       sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
+)
diff --git a/vendor/golang.org/x/net/internal/socket/defs_dragonfly.go b/vendor/golang.org/x/net/internal/socket/defs_dragonfly.go
new file mode 100644 (file)
index 0000000..14e28c0
--- /dev/null
@@ -0,0 +1,44 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build ignore
+
+// +godefs map struct_in_addr [4]byte /* in_addr */
+// +godefs map struct_in6_addr [16]byte /* in6_addr */
+
+package socket
+
+/*
+#include <sys/socket.h>
+
+#include <netinet/in.h>
+*/
+import "C"
+
+const (
+       sysAF_UNSPEC = C.AF_UNSPEC
+       sysAF_INET   = C.AF_INET
+       sysAF_INET6  = C.AF_INET6
+
+       sysSOCK_RAW = C.SOCK_RAW
+)
+
+type iovec C.struct_iovec
+
+type msghdr C.struct_msghdr
+
+type cmsghdr C.struct_cmsghdr
+
+type sockaddrInet C.struct_sockaddr_in
+
+type sockaddrInet6 C.struct_sockaddr_in6
+
+const (
+       sizeofIovec   = C.sizeof_struct_iovec
+       sizeofMsghdr  = C.sizeof_struct_msghdr
+       sizeofCmsghdr = C.sizeof_struct_cmsghdr
+
+       sizeofSockaddrInet  = C.sizeof_struct_sockaddr_in
+       sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
+)
diff --git a/vendor/golang.org/x/net/internal/socket/defs_freebsd.go b/vendor/golang.org/x/net/internal/socket/defs_freebsd.go
new file mode 100644 (file)
index 0000000..14e28c0
--- /dev/null
@@ -0,0 +1,44 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build ignore
+
+// +godefs map struct_in_addr [4]byte /* in_addr */
+// +godefs map struct_in6_addr [16]byte /* in6_addr */
+
+package socket
+
+/*
+#include <sys/socket.h>
+
+#include <netinet/in.h>
+*/
+import "C"
+
+const (
+       sysAF_UNSPEC = C.AF_UNSPEC
+       sysAF_INET   = C.AF_INET
+       sysAF_INET6  = C.AF_INET6
+
+       sysSOCK_RAW = C.SOCK_RAW
+)
+
+type iovec C.struct_iovec
+
+type msghdr C.struct_msghdr
+
+type cmsghdr C.struct_cmsghdr
+
+type sockaddrInet C.struct_sockaddr_in
+
+type sockaddrInet6 C.struct_sockaddr_in6
+
+const (
+       sizeofIovec   = C.sizeof_struct_iovec
+       sizeofMsghdr  = C.sizeof_struct_msghdr
+       sizeofCmsghdr = C.sizeof_struct_cmsghdr
+
+       sizeofSockaddrInet  = C.sizeof_struct_sockaddr_in
+       sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
+)
diff --git a/vendor/golang.org/x/net/internal/socket/defs_linux.go b/vendor/golang.org/x/net/internal/socket/defs_linux.go
new file mode 100644 (file)
index 0000000..ce9ec2f
--- /dev/null
@@ -0,0 +1,49 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build ignore
+
+// +godefs map struct_in_addr [4]byte /* in_addr */
+// +godefs map struct_in6_addr [16]byte /* in6_addr */
+
+package socket
+
+/*
+#include <linux/in.h>
+#include <linux/in6.h>
+
+#define _GNU_SOURCE
+#include <sys/socket.h>
+*/
+import "C"
+
+const (
+       sysAF_UNSPEC = C.AF_UNSPEC
+       sysAF_INET   = C.AF_INET
+       sysAF_INET6  = C.AF_INET6
+
+       sysSOCK_RAW = C.SOCK_RAW
+)
+
+type iovec C.struct_iovec
+
+type msghdr C.struct_msghdr
+
+type mmsghdr C.struct_mmsghdr
+
+type cmsghdr C.struct_cmsghdr
+
+type sockaddrInet C.struct_sockaddr_in
+
+type sockaddrInet6 C.struct_sockaddr_in6
+
+const (
+       sizeofIovec   = C.sizeof_struct_iovec
+       sizeofMsghdr  = C.sizeof_struct_msghdr
+       sizeofMmsghdr = C.sizeof_struct_mmsghdr
+       sizeofCmsghdr = C.sizeof_struct_cmsghdr
+
+       sizeofSockaddrInet  = C.sizeof_struct_sockaddr_in
+       sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
+)
diff --git a/vendor/golang.org/x/net/internal/socket/defs_netbsd.go b/vendor/golang.org/x/net/internal/socket/defs_netbsd.go
new file mode 100644 (file)
index 0000000..3f84335
--- /dev/null
@@ -0,0 +1,47 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build ignore
+
+// +godefs map struct_in_addr [4]byte /* in_addr */
+// +godefs map struct_in6_addr [16]byte /* in6_addr */
+
+package socket
+
+/*
+#include <sys/socket.h>
+
+#include <netinet/in.h>
+*/
+import "C"
+
+const (
+       sysAF_UNSPEC = C.AF_UNSPEC
+       sysAF_INET   = C.AF_INET
+       sysAF_INET6  = C.AF_INET6
+
+       sysSOCK_RAW = C.SOCK_RAW
+)
+
+type iovec C.struct_iovec
+
+type msghdr C.struct_msghdr
+
+type mmsghdr C.struct_mmsghdr
+
+type cmsghdr C.struct_cmsghdr
+
+type sockaddrInet C.struct_sockaddr_in
+
+type sockaddrInet6 C.struct_sockaddr_in6
+
+const (
+       sizeofIovec   = C.sizeof_struct_iovec
+       sizeofMsghdr  = C.sizeof_struct_msghdr
+       sizeofMmsghdr = C.sizeof_struct_mmsghdr
+       sizeofCmsghdr = C.sizeof_struct_cmsghdr
+
+       sizeofSockaddrInet  = C.sizeof_struct_sockaddr_in
+       sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
+)
diff --git a/vendor/golang.org/x/net/internal/socket/defs_openbsd.go b/vendor/golang.org/x/net/internal/socket/defs_openbsd.go
new file mode 100644 (file)
index 0000000..14e28c0
--- /dev/null
@@ -0,0 +1,44 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build ignore
+
+// +godefs map struct_in_addr [4]byte /* in_addr */
+// +godefs map struct_in6_addr [16]byte /* in6_addr */
+
+package socket
+
+/*
+#include <sys/socket.h>
+
+#include <netinet/in.h>
+*/
+import "C"
+
+const (
+       sysAF_UNSPEC = C.AF_UNSPEC
+       sysAF_INET   = C.AF_INET
+       sysAF_INET6  = C.AF_INET6
+
+       sysSOCK_RAW = C.SOCK_RAW
+)
+
+type iovec C.struct_iovec
+
+type msghdr C.struct_msghdr
+
+type cmsghdr C.struct_cmsghdr
+
+type sockaddrInet C.struct_sockaddr_in
+
+type sockaddrInet6 C.struct_sockaddr_in6
+
+const (
+       sizeofIovec   = C.sizeof_struct_iovec
+       sizeofMsghdr  = C.sizeof_struct_msghdr
+       sizeofCmsghdr = C.sizeof_struct_cmsghdr
+
+       sizeofSockaddrInet  = C.sizeof_struct_sockaddr_in
+       sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
+)
diff --git a/vendor/golang.org/x/net/internal/socket/defs_solaris.go b/vendor/golang.org/x/net/internal/socket/defs_solaris.go
new file mode 100644 (file)
index 0000000..14e28c0
--- /dev/null
@@ -0,0 +1,44 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build ignore
+
+// +godefs map struct_in_addr [4]byte /* in_addr */
+// +godefs map struct_in6_addr [16]byte /* in6_addr */
+
+package socket
+
+/*
+#include <sys/socket.h>
+
+#include <netinet/in.h>
+*/
+import "C"
+
+const (
+       sysAF_UNSPEC = C.AF_UNSPEC
+       sysAF_INET   = C.AF_INET
+       sysAF_INET6  = C.AF_INET6
+
+       sysSOCK_RAW = C.SOCK_RAW
+)
+
+type iovec C.struct_iovec
+
+type msghdr C.struct_msghdr
+
+type cmsghdr C.struct_cmsghdr
+
+type sockaddrInet C.struct_sockaddr_in
+
+type sockaddrInet6 C.struct_sockaddr_in6
+
+const (
+       sizeofIovec   = C.sizeof_struct_iovec
+       sizeofMsghdr  = C.sizeof_struct_msghdr
+       sizeofCmsghdr = C.sizeof_struct_cmsghdr
+
+       sizeofSockaddrInet  = C.sizeof_struct_sockaddr_in
+       sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
+)
diff --git a/vendor/golang.org/x/net/internal/socket/error_unix.go b/vendor/golang.org/x/net/internal/socket/error_unix.go
new file mode 100644 (file)
index 0000000..93dff91
--- /dev/null
@@ -0,0 +1,31 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin dragonfly freebsd linux netbsd openbsd solaris
+
+package socket
+
+import "syscall"
+
+var (
+       errEAGAIN error = syscall.EAGAIN
+       errEINVAL error = syscall.EINVAL
+       errENOENT error = syscall.ENOENT
+)
+
+// errnoErr returns common boxed Errno values, to prevent allocations
+// at runtime.
+func errnoErr(errno syscall.Errno) error {
+       switch errno {
+       case 0:
+               return nil
+       case syscall.EAGAIN:
+               return errEAGAIN
+       case syscall.EINVAL:
+               return errEINVAL
+       case syscall.ENOENT:
+               return errENOENT
+       }
+       return errno
+}
diff --git a/vendor/golang.org/x/net/internal/socket/error_windows.go b/vendor/golang.org/x/net/internal/socket/error_windows.go
new file mode 100644 (file)
index 0000000..6a6379a
--- /dev/null
@@ -0,0 +1,26 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package socket
+
+import "syscall"
+
+var (
+       errERROR_IO_PENDING error = syscall.ERROR_IO_PENDING
+       errEINVAL           error = syscall.EINVAL
+)
+
+// errnoErr returns common boxed Errno values, to prevent allocations
+// at runtime.
+func errnoErr(errno syscall.Errno) error {
+       switch errno {
+       case 0:
+               return nil
+       case syscall.ERROR_IO_PENDING:
+               return errERROR_IO_PENDING
+       case syscall.EINVAL:
+               return errEINVAL
+       }
+       return errno
+}
diff --git a/vendor/golang.org/x/net/internal/socket/iovec_32bit.go b/vendor/golang.org/x/net/internal/socket/iovec_32bit.go
new file mode 100644 (file)
index 0000000..d6a570c
--- /dev/null
@@ -0,0 +1,15 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build arm mips mipsle 386
+// +build darwin dragonfly freebsd linux netbsd openbsd
+
+package socket
+
+import "unsafe"
+
+func (v *iovec) set(b []byte) {
+       v.Base = (*byte)(unsafe.Pointer(&b[0]))
+       v.Len = uint32(len(b))
+}
diff --git a/vendor/golang.org/x/net/internal/socket/iovec_64bit.go b/vendor/golang.org/x/net/internal/socket/iovec_64bit.go
new file mode 100644 (file)
index 0000000..2ae435e
--- /dev/null
@@ -0,0 +1,15 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build arm64 amd64 ppc64 ppc64le mips64 mips64le s390x
+// +build darwin dragonfly freebsd linux netbsd openbsd
+
+package socket
+
+import "unsafe"
+
+func (v *iovec) set(b []byte) {
+       v.Base = (*byte)(unsafe.Pointer(&b[0]))
+       v.Len = uint64(len(b))
+}
diff --git a/vendor/golang.org/x/net/internal/socket/iovec_solaris_64bit.go b/vendor/golang.org/x/net/internal/socket/iovec_solaris_64bit.go
new file mode 100644 (file)
index 0000000..100a628
--- /dev/null
@@ -0,0 +1,15 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build amd64
+// +build solaris
+
+package socket
+
+import "unsafe"
+
+func (v *iovec) set(b []byte) {
+       v.Base = (*int8)(unsafe.Pointer(&b[0]))
+       v.Len = uint64(len(b))
+}
diff --git a/vendor/golang.org/x/net/internal/socket/iovec_stub.go b/vendor/golang.org/x/net/internal/socket/iovec_stub.go
new file mode 100644 (file)
index 0000000..c87d2a9
--- /dev/null
@@ -0,0 +1,11 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris
+
+package socket
+
+type iovec struct{}
+
+func (v *iovec) set(b []byte) {}
diff --git a/vendor/golang.org/x/net/internal/socket/mmsghdr_stub.go b/vendor/golang.org/x/net/internal/socket/mmsghdr_stub.go
new file mode 100644 (file)
index 0000000..2e80a9c
--- /dev/null
@@ -0,0 +1,21 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !linux,!netbsd
+
+package socket
+
+import "net"
+
+type mmsghdr struct{}
+
+type mmsghdrs []mmsghdr
+
+func (hs mmsghdrs) pack(ms []Message, parseFn func([]byte, string) (net.Addr, error), marshalFn func(net.Addr) []byte) error {
+       return nil
+}
+
+func (hs mmsghdrs) unpack(ms []Message, parseFn func([]byte, string) (net.Addr, error), hint string) error {
+       return nil
+}
diff --git a/vendor/golang.org/x/net/internal/socket/mmsghdr_unix.go b/vendor/golang.org/x/net/internal/socket/mmsghdr_unix.go
new file mode 100644 (file)
index 0000000..3c42ea7
--- /dev/null
@@ -0,0 +1,42 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build linux netbsd
+
+package socket
+
+import "net"
+
+type mmsghdrs []mmsghdr
+
+func (hs mmsghdrs) pack(ms []Message, parseFn func([]byte, string) (net.Addr, error), marshalFn func(net.Addr) []byte) error {
+       for i := range hs {
+               vs := make([]iovec, len(ms[i].Buffers))
+               var sa []byte
+               if parseFn != nil {
+                       sa = make([]byte, sizeofSockaddrInet6)
+               }
+               if marshalFn != nil {
+                       sa = marshalFn(ms[i].Addr)
+               }
+               hs[i].Hdr.pack(vs, ms[i].Buffers, ms[i].OOB, sa)
+       }
+       return nil
+}
+
+func (hs mmsghdrs) unpack(ms []Message, parseFn func([]byte, string) (net.Addr, error), hint string) error {
+       for i := range hs {
+               ms[i].N = int(hs[i].Len)
+               ms[i].NN = hs[i].Hdr.controllen()
+               ms[i].Flags = hs[i].Hdr.flags()
+               if parseFn != nil {
+                       var err error
+                       ms[i].Addr, err = parseFn(hs[i].Hdr.name(), hint)
+                       if err != nil {
+                               return err
+                       }
+               }
+       }
+       return nil
+}
diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_bsd.go b/vendor/golang.org/x/net/internal/socket/msghdr_bsd.go
new file mode 100644 (file)
index 0000000..5567afc
--- /dev/null
@@ -0,0 +1,39 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin dragonfly freebsd netbsd openbsd
+
+package socket
+
+import "unsafe"
+
+func (h *msghdr) pack(vs []iovec, bs [][]byte, oob []byte, sa []byte) {
+       for i := range vs {
+               vs[i].set(bs[i])
+       }
+       h.setIov(vs)
+       if len(oob) > 0 {
+               h.Control = (*byte)(unsafe.Pointer(&oob[0]))
+               h.Controllen = uint32(len(oob))
+       }
+       if sa != nil {
+               h.Name = (*byte)(unsafe.Pointer(&sa[0]))
+               h.Namelen = uint32(len(sa))
+       }
+}
+
+func (h *msghdr) name() []byte {
+       if h.Name != nil && h.Namelen > 0 {
+               return (*[sizeofSockaddrInet6]byte)(unsafe.Pointer(h.Name))[:h.Namelen]
+       }
+       return nil
+}
+
+func (h *msghdr) controllen() int {
+       return int(h.Controllen)
+}
+
+func (h *msghdr) flags() int {
+       return int(h.Flags)
+}
diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_bsdvar.go b/vendor/golang.org/x/net/internal/socket/msghdr_bsdvar.go
new file mode 100644 (file)
index 0000000..3fcb042
--- /dev/null
@@ -0,0 +1,12 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin dragonfly freebsd netbsd
+
+package socket
+
+func (h *msghdr) setIov(vs []iovec) {
+       h.Iov = &vs[0]
+       h.Iovlen = int32(len(vs))
+}
diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_linux.go b/vendor/golang.org/x/net/internal/socket/msghdr_linux.go
new file mode 100644 (file)
index 0000000..5a38798
--- /dev/null
@@ -0,0 +1,36 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package socket
+
+import "unsafe"
+
+func (h *msghdr) pack(vs []iovec, bs [][]byte, oob []byte, sa []byte) {
+       for i := range vs {
+               vs[i].set(bs[i])
+       }
+       h.setIov(vs)
+       if len(oob) > 0 {
+               h.setControl(oob)
+       }
+       if sa != nil {
+               h.Name = (*byte)(unsafe.Pointer(&sa[0]))
+               h.Namelen = uint32(len(sa))
+       }
+}
+
+func (h *msghdr) name() []byte {
+       if h.Name != nil && h.Namelen > 0 {
+               return (*[sizeofSockaddrInet6]byte)(unsafe.Pointer(h.Name))[:h.Namelen]
+       }
+       return nil
+}
+
+func (h *msghdr) controllen() int {
+       return int(h.Controllen)
+}
+
+func (h *msghdr) flags() int {
+       return int(h.Flags)
+}
diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_linux_32bit.go b/vendor/golang.org/x/net/internal/socket/msghdr_linux_32bit.go
new file mode 100644 (file)
index 0000000..9f671ae
--- /dev/null
@@ -0,0 +1,20 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build arm mips mipsle 386
+// +build linux
+
+package socket
+
+import "unsafe"
+
+func (h *msghdr) setIov(vs []iovec) {
+       h.Iov = &vs[0]
+       h.Iovlen = uint32(len(vs))
+}
+
+func (h *msghdr) setControl(b []byte) {
+       h.Control = (*byte)(unsafe.Pointer(&b[0]))
+       h.Controllen = uint32(len(b))
+}
diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go b/vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go
new file mode 100644 (file)
index 0000000..9f78706
--- /dev/null
@@ -0,0 +1,20 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build arm64 amd64 ppc64 ppc64le mips64 mips64le s390x
+// +build linux
+
+package socket
+
+import "unsafe"
+
+func (h *msghdr) setIov(vs []iovec) {
+       h.Iov = &vs[0]
+       h.Iovlen = uint64(len(vs))
+}
+
+func (h *msghdr) setControl(b []byte) {
+       h.Control = (*byte)(unsafe.Pointer(&b[0]))
+       h.Controllen = uint64(len(b))
+}
diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_openbsd.go b/vendor/golang.org/x/net/internal/socket/msghdr_openbsd.go
new file mode 100644 (file)
index 0000000..be354ff
--- /dev/null
@@ -0,0 +1,10 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package socket
+
+func (h *msghdr) setIov(vs []iovec) {
+       h.Iov = &vs[0]
+       h.Iovlen = uint32(len(vs))
+}
diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_solaris_64bit.go b/vendor/golang.org/x/net/internal/socket/msghdr_solaris_64bit.go
new file mode 100644 (file)
index 0000000..d1b0593
--- /dev/null
@@ -0,0 +1,34 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build amd64
+// +build solaris
+
+package socket
+
+import "unsafe"
+
+func (h *msghdr) pack(vs []iovec, bs [][]byte, oob []byte, sa []byte) {
+       for i := range vs {
+               vs[i].set(bs[i])
+       }
+       h.Iov = &vs[0]
+       h.Iovlen = int32(len(vs))
+       if len(oob) > 0 {
+               h.Accrights = (*int8)(unsafe.Pointer(&oob[0]))
+               h.Accrightslen = int32(len(oob))
+       }
+       if sa != nil {
+               h.Name = (*byte)(unsafe.Pointer(&sa[0]))
+               h.Namelen = uint32(len(sa))
+       }
+}
+
+func (h *msghdr) controllen() int {
+       return int(h.Accrightslen)
+}
+
+func (h *msghdr) flags() int {
+       return int(NativeEndian.Uint32(h.Pad_cgo_2[:]))
+}
diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_stub.go b/vendor/golang.org/x/net/internal/socket/msghdr_stub.go
new file mode 100644 (file)
index 0000000..64e8173
--- /dev/null
@@ -0,0 +1,14 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris
+
+package socket
+
+type msghdr struct{}
+
+func (h *msghdr) pack(vs []iovec, bs [][]byte, oob []byte, sa []byte) {}
+func (h *msghdr) name() []byte                                        { return nil }
+func (h *msghdr) controllen() int                                     { return 0 }
+func (h *msghdr) flags() int                                          { return 0 }
diff --git a/vendor/golang.org/x/net/internal/socket/rawconn.go b/vendor/golang.org/x/net/internal/socket/rawconn.go
new file mode 100644 (file)
index 0000000..d6871d5
--- /dev/null
@@ -0,0 +1,66 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build go1.9
+
+package socket
+
+import (
+       "errors"
+       "net"
+       "os"
+       "syscall"
+)
+
+// A Conn represents a raw connection.
+type Conn struct {
+       network string
+       c       syscall.RawConn
+}
+
+// NewConn returns a new raw connection.
+func NewConn(c net.Conn) (*Conn, error) {
+       var err error
+       var cc Conn
+       switch c := c.(type) {
+       case *net.TCPConn:
+               cc.network = "tcp"
+               cc.c, err = c.SyscallConn()
+       case *net.UDPConn:
+               cc.network = "udp"
+               cc.c, err = c.SyscallConn()
+       case *net.IPConn:
+               cc.network = "ip"
+               cc.c, err = c.SyscallConn()
+       default:
+               return nil, errors.New("unknown connection type")
+       }
+       if err != nil {
+               return nil, err
+       }
+       return &cc, nil
+}
+
+func (o *Option) get(c *Conn, b []byte) (int, error) {
+       var operr error
+       var n int
+       fn := func(s uintptr) {
+               n, operr = getsockopt(s, o.Level, o.Name, b)
+       }
+       if err := c.c.Control(fn); err != nil {
+               return 0, err
+       }
+       return n, os.NewSyscallError("getsockopt", operr)
+}
+
+func (o *Option) set(c *Conn, b []byte) error {
+       var operr error
+       fn := func(s uintptr) {
+               operr = setsockopt(s, o.Level, o.Name, b)
+       }
+       if err := c.c.Control(fn); err != nil {
+               return err
+       }
+       return os.NewSyscallError("setsockopt", operr)
+}
diff --git a/vendor/golang.org/x/net/internal/socket/rawconn_mmsg.go b/vendor/golang.org/x/net/internal/socket/rawconn_mmsg.go
new file mode 100644 (file)
index 0000000..499164a
--- /dev/null
@@ -0,0 +1,74 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build go1.9
+// +build linux
+
+package socket
+
+import (
+       "net"
+       "os"
+       "syscall"
+)
+
+func (c *Conn) recvMsgs(ms []Message, flags int) (int, error) {
+       hs := make(mmsghdrs, len(ms))
+       var parseFn func([]byte, string) (net.Addr, error)
+       if c.network != "tcp" {
+               parseFn = parseInetAddr
+       }
+       if err := hs.pack(ms, parseFn, nil); err != nil {
+               return 0, err
+       }
+       var operr error
+       var n int
+       fn := func(s uintptr) bool {
+               n, operr = recvmmsg(s, hs, flags)
+               if operr == syscall.EAGAIN {
+                       return false
+               }
+               return true
+       }
+       if err := c.c.Read(fn); err != nil {
+               return n, err
+       }
+       if operr != nil {
+               return n, os.NewSyscallError("recvmmsg", operr)
+       }
+       if err := hs[:n].unpack(ms[:n], parseFn, c.network); err != nil {
+               return n, err
+       }
+       return n, nil
+}
+
+func (c *Conn) sendMsgs(ms []Message, flags int) (int, error) {
+       hs := make(mmsghdrs, len(ms))
+       var marshalFn func(net.Addr) []byte
+       if c.network != "tcp" {
+               marshalFn = marshalInetAddr
+       }
+       if err := hs.pack(ms, nil, marshalFn); err != nil {
+               return 0, err
+       }
+       var operr error
+       var n int
+       fn := func(s uintptr) bool {
+               n, operr = sendmmsg(s, hs, flags)
+               if operr == syscall.EAGAIN {
+                       return false
+               }
+               return true
+       }
+       if err := c.c.Write(fn); err != nil {
+               return n, err
+       }
+       if operr != nil {
+               return n, os.NewSyscallError("sendmmsg", operr)
+       }
+       if err := hs[:n].unpack(ms[:n], nil, ""); err != nil {
+               return n, err
+       }
+       return n, nil
+}
diff --git a/vendor/golang.org/x/net/internal/socket/rawconn_msg.go b/vendor/golang.org/x/net/internal/socket/rawconn_msg.go
new file mode 100644 (file)
index 0000000..b21d2e6
--- /dev/null
@@ -0,0 +1,77 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build go1.9
+// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows
+
+package socket
+
+import (
+       "os"
+       "syscall"
+)
+
+func (c *Conn) recvMsg(m *Message, flags int) error {
+       var h msghdr
+       vs := make([]iovec, len(m.Buffers))
+       var sa []byte
+       if c.network != "tcp" {
+               sa = make([]byte, sizeofSockaddrInet6)
+       }
+       h.pack(vs, m.Buffers, m.OOB, sa)
+       var operr error
+       var n int
+       fn := func(s uintptr) bool {
+               n, operr = recvmsg(s, &h, flags)
+               if operr == syscall.EAGAIN {
+                       return false
+               }
+               return true
+       }
+       if err := c.c.Read(fn); err != nil {
+               return err
+       }
+       if operr != nil {
+               return os.NewSyscallError("recvmsg", operr)
+       }
+       if c.network != "tcp" {
+               var err error
+               m.Addr, err = parseInetAddr(sa[:], c.network)
+               if err != nil {
+                       return err
+               }
+       }
+       m.N = n
+       m.NN = h.controllen()
+       m.Flags = h.flags()
+       return nil
+}
+
+func (c *Conn) sendMsg(m *Message, flags int) error {
+       var h msghdr
+       vs := make([]iovec, len(m.Buffers))
+       var sa []byte
+       if m.Addr != nil {
+               sa = marshalInetAddr(m.Addr)
+       }
+       h.pack(vs, m.Buffers, m.OOB, sa)
+       var operr error
+       var n int
+       fn := func(s uintptr) bool {
+               n, operr = sendmsg(s, &h, flags)
+               if operr == syscall.EAGAIN {
+                       return false
+               }
+               return true
+       }
+       if err := c.c.Write(fn); err != nil {
+               return err
+       }
+       if operr != nil {
+               return os.NewSyscallError("sendmsg", operr)
+       }
+       m.N = n
+       m.NN = len(m.OOB)
+       return nil
+}
diff --git a/vendor/golang.org/x/net/internal/socket/rawconn_nommsg.go b/vendor/golang.org/x/net/internal/socket/rawconn_nommsg.go
new file mode 100644 (file)
index 0000000..f78832a
--- /dev/null
@@ -0,0 +1,18 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build go1.9
+// +build !linux
+
+package socket
+
+import "errors"
+
+func (c *Conn) recvMsgs(ms []Message, flags int) (int, error) {
+       return 0, errors.New("not implemented")
+}
+
+func (c *Conn) sendMsgs(ms []Message, flags int) (int, error) {
+       return 0, errors.New("not implemented")
+}
diff --git a/vendor/golang.org/x/net/internal/socket/rawconn_nomsg.go b/vendor/golang.org/x/net/internal/socket/rawconn_nomsg.go
new file mode 100644 (file)
index 0000000..96733cb
--- /dev/null
@@ -0,0 +1,18 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build go1.9
+// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows
+
+package socket
+
+import "errors"
+
+func (c *Conn) recvMsg(m *Message, flags int) error {
+       return errors.New("not implemented")
+}
+
+func (c *Conn) sendMsg(m *Message, flags int) error {
+       return errors.New("not implemented")
+}
diff --git a/vendor/golang.org/x/net/internal/socket/rawconn_stub.go b/vendor/golang.org/x/net/internal/socket/rawconn_stub.go
new file mode 100644 (file)
index 0000000..d2add1a
--- /dev/null
@@ -0,0 +1,25 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !go1.9
+
+package socket
+
+import "errors"
+
+func (c *Conn) recvMsg(m *Message, flags int) error {
+       return errors.New("not implemented")
+}
+
+func (c *Conn) sendMsg(m *Message, flags int) error {
+       return errors.New("not implemented")
+}
+
+func (c *Conn) recvMsgs(ms []Message, flags int) (int, error) {
+       return 0, errors.New("not implemented")
+}
+
+func (c *Conn) sendMsgs(ms []Message, flags int) (int, error) {
+       return 0, errors.New("not implemented")
+}
diff --git a/vendor/golang.org/x/net/internal/socket/reflect.go b/vendor/golang.org/x/net/internal/socket/reflect.go
new file mode 100644 (file)
index 0000000..bb179f1
--- /dev/null
@@ -0,0 +1,62 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !go1.9
+
+package socket
+
+import (
+       "errors"
+       "net"
+       "os"
+       "reflect"
+       "runtime"
+)
+
+// A Conn represents a raw connection.
+type Conn struct {
+       c net.Conn
+}
+
+// NewConn returns a new raw connection.
+func NewConn(c net.Conn) (*Conn, error) {
+       return &Conn{c: c}, nil
+}
+
+func (o *Option) get(c *Conn, b []byte) (int, error) {
+       s, err := socketOf(c.c)
+       if err != nil {
+               return 0, err
+       }
+       n, err := getsockopt(s, o.Level, o.Name, b)
+       return n, os.NewSyscallError("getsockopt", err)
+}
+
+func (o *Option) set(c *Conn, b []byte) error {
+       s, err := socketOf(c.c)
+       if err != nil {
+               return err
+       }
+       return os.NewSyscallError("setsockopt", setsockopt(s, o.Level, o.Name, b))
+}
+
+func socketOf(c net.Conn) (uintptr, error) {
+       switch c.(type) {
+       case *net.TCPConn, *net.UDPConn, *net.IPConn:
+               v := reflect.ValueOf(c)
+               switch e := v.Elem(); e.Kind() {
+               case reflect.Struct:
+                       fd := e.FieldByName("conn").FieldByName("fd")
+                       switch e := fd.Elem(); e.Kind() {
+                       case reflect.Struct:
+                               sysfd := e.FieldByName("sysfd")
+                               if runtime.GOOS == "windows" {
+                                       return uintptr(sysfd.Uint()), nil
+                               }
+                               return uintptr(sysfd.Int()), nil
+                       }
+               }
+       }
+       return 0, errors.New("invalid type")
+}
diff --git a/vendor/golang.org/x/net/internal/socket/socket.go b/vendor/golang.org/x/net/internal/socket/socket.go
new file mode 100644 (file)
index 0000000..729dea1
--- /dev/null
@@ -0,0 +1,285 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package socket provides a portable interface for socket system
+// calls.
+package socket // import "golang.org/x/net/internal/socket"
+
+import (
+       "errors"
+       "net"
+       "unsafe"
+)
+
+// An Option represents a sticky socket option.
+type Option struct {
+       Level int // level
+       Name  int // name; must be equal or greater than 1
+       Len   int // length of value in bytes; must be equal or greater than 1
+}
+
+// Get reads a value for the option from the kernel.
+// It returns the number of bytes written into b.
+func (o *Option) Get(c *Conn, b []byte) (int, error) {
+       if o.Name < 1 || o.Len < 1 {
+               return 0, errors.New("invalid option")
+       }
+       if len(b) < o.Len {
+               return 0, errors.New("short buffer")
+       }
+       return o.get(c, b)
+}
+
+// GetInt returns an integer value for the option.
+//
+// The Len field of Option must be either 1 or 4.
+func (o *Option) GetInt(c *Conn) (int, error) {
+       if o.Len != 1 && o.Len != 4 {
+               return 0, errors.New("invalid option")
+       }
+       var b []byte
+       var bb [4]byte
+       if o.Len == 1 {
+               b = bb[:1]
+       } else {
+               b = bb[:4]
+       }
+       n, err := o.get(c, b)
+       if err != nil {
+               return 0, err
+       }
+       if n != o.Len {
+               return 0, errors.New("invalid option length")
+       }
+       if o.Len == 1 {
+               return int(b[0]), nil
+       }
+       return int(NativeEndian.Uint32(b[:4])), nil
+}
+
+// Set writes the option and value to the kernel.
+func (o *Option) Set(c *Conn, b []byte) error {
+       if o.Name < 1 || o.Len < 1 {
+               return errors.New("invalid option")
+       }
+       if len(b) < o.Len {
+               return errors.New("short buffer")
+       }
+       return o.set(c, b)
+}
+
+// SetInt writes the option and value to the kernel.
+//
+// The Len field of Option must be either 1 or 4.
+func (o *Option) SetInt(c *Conn, v int) error {
+       if o.Len != 1 && o.Len != 4 {
+               return errors.New("invalid option")
+       }
+       var b []byte
+       if o.Len == 1 {
+               b = []byte{byte(v)}
+       } else {
+               var bb [4]byte
+               NativeEndian.PutUint32(bb[:o.Len], uint32(v))
+               b = bb[:4]
+       }
+       return o.set(c, b)
+}
+
+func controlHeaderLen() int {
+       return roundup(sizeofCmsghdr)
+}
+
+func controlMessageLen(dataLen int) int {
+       return roundup(sizeofCmsghdr) + dataLen
+}
+
+// ControlMessageSpace returns the whole length of control message.
+func ControlMessageSpace(dataLen int) int {
+       return roundup(sizeofCmsghdr) + roundup(dataLen)
+}
+
+// A ControlMessage represents the head message in a stream of control
+// messages.
+//
+// A control message comprises of a header, data and a few padding
+// fields to conform to the interface to the kernel.
+//
+// See RFC 3542 for further information.
+type ControlMessage []byte
+
+// Data returns the data field of the control message at the head on
+// w.
+func (m ControlMessage) Data(dataLen int) []byte {
+       l := controlHeaderLen()
+       if len(m) < l || len(m) < l+dataLen {
+               return nil
+       }
+       return m[l : l+dataLen]
+}
+
+// Next returns the control message at the next on w.
+//
+// Next works only for standard control messages.
+func (m ControlMessage) Next(dataLen int) ControlMessage {
+       l := ControlMessageSpace(dataLen)
+       if len(m) < l {
+               return nil
+       }
+       return m[l:]
+}
+
+// MarshalHeader marshals the header fields of the control message at
+// the head on w.
+func (m ControlMessage) MarshalHeader(lvl, typ, dataLen int) error {
+       if len(m) < controlHeaderLen() {
+               return errors.New("short message")
+       }
+       h := (*cmsghdr)(unsafe.Pointer(&m[0]))
+       h.set(controlMessageLen(dataLen), lvl, typ)
+       return nil
+}
+
+// ParseHeader parses and returns the header fields of the control
+// message at the head on w.
+func (m ControlMessage) ParseHeader() (lvl, typ, dataLen int, err error) {
+       l := controlHeaderLen()
+       if len(m) < l {
+               return 0, 0, 0, errors.New("short message")
+       }
+       h := (*cmsghdr)(unsafe.Pointer(&m[0]))
+       return h.lvl(), h.typ(), int(uint64(h.len()) - uint64(l)), nil
+}
+
+// Marshal marshals the control message at the head on w, and returns
+// the next control message.
+func (m ControlMessage) Marshal(lvl, typ int, data []byte) (ControlMessage, error) {
+       l := len(data)
+       if len(m) < ControlMessageSpace(l) {
+               return nil, errors.New("short message")
+       }
+       h := (*cmsghdr)(unsafe.Pointer(&m[0]))
+       h.set(controlMessageLen(l), lvl, typ)
+       if l > 0 {
+               copy(m.Data(l), data)
+       }
+       return m.Next(l), nil
+}
+
+// Parse parses w as a single or multiple control messages.
+//
+// Parse works for both standard and compatible messages.
+func (m ControlMessage) Parse() ([]ControlMessage, error) {
+       var ms []ControlMessage
+       for len(m) >= controlHeaderLen() {
+               h := (*cmsghdr)(unsafe.Pointer(&m[0]))
+               l := h.len()
+               if l <= 0 {
+                       return nil, errors.New("invalid header length")
+               }
+               if uint64(l) < uint64(controlHeaderLen()) {
+                       return nil, errors.New("invalid message length")
+               }
+               if uint64(l) > uint64(len(m)) {
+                       return nil, errors.New("short buffer")
+               }
+               // On message reception:
+               //
+               // |<- ControlMessageSpace --------------->|
+               // |<- controlMessageLen ---------->|      |
+               // |<- controlHeaderLen ->|         |      |
+               // +---------------+------+---------+------+
+               // |    Header     | PadH |  Data   | PadD |
+               // +---------------+------+---------+------+
+               //
+               // On compatible message reception:
+               //
+               // | ... |<- controlMessageLen ----------->|
+               // | ... |<- controlHeaderLen ->|          |
+               // +-----+---------------+------+----------+
+               // | ... |    Header     | PadH |   Data   |
+               // +-----+---------------+------+----------+
+               ms = append(ms, ControlMessage(m[:l]))
+               ll := l - controlHeaderLen()
+               if len(m) >= ControlMessageSpace(ll) {
+                       m = m[ControlMessageSpace(ll):]
+               } else {
+                       m = m[controlMessageLen(ll):]
+               }
+       }
+       return ms, nil
+}
+
+// NewControlMessage returns a new stream of control messages.
+func NewControlMessage(dataLen []int) ControlMessage {
+       var l int
+       for i := range dataLen {
+               l += ControlMessageSpace(dataLen[i])
+       }
+       return make([]byte, l)
+}
+
+// A Message represents an IO message.
+type Message struct {
+       // When writing, the Buffers field must contain at least one
+       // byte to write.
+       // When reading, the Buffers field will always contain a byte
+       // to read.
+       Buffers [][]byte
+
+       // OOB contains protocol-specific control or miscellaneous
+       // ancillary data known as out-of-band data.
+       OOB []byte
+
+       // Addr specifies a destination address when writing.
+       // It can be nil when the underlying protocol of the raw
+       // connection uses connection-oriented communication.
+       // After a successful read, it may contain the source address
+       // on the received packet.
+       Addr net.Addr
+
+       N     int // # of bytes read or written from/to Buffers
+       NN    int // # of bytes read or written from/to OOB
+       Flags int // protocol-specific information on the received message
+}
+
+// RecvMsg wraps recvmsg system call.
+//
+// The provided flags is a set of platform-dependent flags, such as
+// syscall.MSG_PEEK.
+func (c *Conn) RecvMsg(m *Message, flags int) error {
+       return c.recvMsg(m, flags)
+}
+
+// SendMsg wraps sendmsg system call.
+//
+// The provided flags is a set of platform-dependent flags, such as
+// syscall.MSG_DONTROUTE.
+func (c *Conn) SendMsg(m *Message, flags int) error {
+       return c.sendMsg(m, flags)
+}
+
+// RecvMsgs wraps recvmmsg system call.
+//
+// It returns the number of processed messages.
+//
+// The provided flags is a set of platform-dependent flags, such as
+// syscall.MSG_PEEK.
+//
+// Only Linux supports this.
+func (c *Conn) RecvMsgs(ms []Message, flags int) (int, error) {
+       return c.recvMsgs(ms, flags)
+}
+
+// SendMsgs wraps sendmmsg system call.
+//
+// It returns the number of processed messages.
+//
+// The provided flags is a set of platform-dependent flags, such as
+// syscall.MSG_DONTROUTE.
+//
+// Only Linux supports this.
+func (c *Conn) SendMsgs(ms []Message, flags int) (int, error) {
+       return c.sendMsgs(ms, flags)
+}
diff --git a/vendor/golang.org/x/net/internal/socket/sys.go b/vendor/golang.org/x/net/internal/socket/sys.go
new file mode 100644 (file)
index 0000000..4f0eead
--- /dev/null
@@ -0,0 +1,33 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package socket
+
+import (
+       "encoding/binary"
+       "unsafe"
+)
+
+var (
+       // NativeEndian is the machine native endian implementation of
+       // ByteOrder.
+       NativeEndian binary.ByteOrder
+
+       kernelAlign int
+)
+
+func init() {
+       i := uint32(1)
+       b := (*[4]byte)(unsafe.Pointer(&i))
+       if b[0] == 1 {
+               NativeEndian = binary.LittleEndian
+       } else {
+               NativeEndian = binary.BigEndian
+       }
+       kernelAlign = probeProtocolStack()
+}
+
+func roundup(l int) int {
+       return (l + kernelAlign - 1) & ^(kernelAlign - 1)
+}
diff --git a/vendor/golang.org/x/net/internal/socket/sys_bsd.go b/vendor/golang.org/x/net/internal/socket/sys_bsd.go
new file mode 100644 (file)
index 0000000..f13e14f
--- /dev/null
@@ -0,0 +1,17 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin dragonfly freebsd openbsd
+
+package socket
+
+import "errors"
+
+func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) {
+       return 0, errors.New("not implemented")
+}
+
+func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) {
+       return 0, errors.New("not implemented")
+}
diff --git a/vendor/golang.org/x/net/internal/socket/sys_bsdvar.go b/vendor/golang.org/x/net/internal/socket/sys_bsdvar.go
new file mode 100644 (file)
index 0000000..f723fa3
--- /dev/null
@@ -0,0 +1,14 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build freebsd netbsd openbsd
+
+package socket
+
+import "unsafe"
+
+func probeProtocolStack() int {
+       var p uintptr
+       return int(unsafe.Sizeof(p))
+}
diff --git a/vendor/golang.org/x/net/internal/socket/sys_darwin.go b/vendor/golang.org/x/net/internal/socket/sys_darwin.go
new file mode 100644 (file)
index 0000000..b17d223
--- /dev/null
@@ -0,0 +1,7 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package socket
+
+func probeProtocolStack() int { return 4 }
diff --git a/vendor/golang.org/x/net/internal/socket/sys_dragonfly.go b/vendor/golang.org/x/net/internal/socket/sys_dragonfly.go
new file mode 100644 (file)
index 0000000..b17d223
--- /dev/null
@@ -0,0 +1,7 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package socket
+
+func probeProtocolStack() int { return 4 }
diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux.go b/vendor/golang.org/x/net/internal/socket/sys_linux.go
new file mode 100644 (file)
index 0000000..1559521
--- /dev/null
@@ -0,0 +1,27 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build linux,!s390x,!386
+
+package socket
+
+import (
+       "syscall"
+       "unsafe"
+)
+
+func probeProtocolStack() int {
+       var p uintptr
+       return int(unsafe.Sizeof(p))
+}
+
+func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) {
+       n, _, errno := syscall.Syscall6(sysRECVMMSG, s, uintptr(unsafe.Pointer(&hs[0])), uintptr(len(hs)), uintptr(flags), 0, 0)
+       return int(n), errnoErr(errno)
+}
+
+func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) {
+       n, _, errno := syscall.Syscall6(sysSENDMMSG, s, uintptr(unsafe.Pointer(&hs[0])), uintptr(len(hs)), uintptr(flags), 0, 0)
+       return int(n), errnoErr(errno)
+}
diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux_386.go b/vendor/golang.org/x/net/internal/socket/sys_linux_386.go
new file mode 100644 (file)
index 0000000..235b2cc
--- /dev/null
@@ -0,0 +1,55 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package socket
+
+import (
+       "syscall"
+       "unsafe"
+)
+
+func probeProtocolStack() int { return 4 }
+
+const (
+       sysSETSOCKOPT = 0xe
+       sysGETSOCKOPT = 0xf
+       sysSENDMSG    = 0x10
+       sysRECVMSG    = 0x11
+       sysRECVMMSG   = 0x13
+       sysSENDMMSG   = 0x14
+)
+
+func socketcall(call, a0, a1, a2, a3, a4, a5 uintptr) (uintptr, syscall.Errno)
+func rawsocketcall(call, a0, a1, a2, a3, a4, a5 uintptr) (uintptr, syscall.Errno)
+
+func getsockopt(s uintptr, level, name int, b []byte) (int, error) {
+       l := uint32(len(b))
+       _, errno := socketcall(sysGETSOCKOPT, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(unsafe.Pointer(&l)), 0)
+       return int(l), errnoErr(errno)
+}
+
+func setsockopt(s uintptr, level, name int, b []byte) error {
+       _, errno := socketcall(sysSETSOCKOPT, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(len(b)), 0)
+       return errnoErr(errno)
+}
+
+func recvmsg(s uintptr, h *msghdr, flags int) (int, error) {
+       n, errno := socketcall(sysRECVMSG, s, uintptr(unsafe.Pointer(h)), uintptr(flags), 0, 0, 0)
+       return int(n), errnoErr(errno)
+}
+
+func sendmsg(s uintptr, h *msghdr, flags int) (int, error) {
+       n, errno := socketcall(sysSENDMSG, s, uintptr(unsafe.Pointer(h)), uintptr(flags), 0, 0, 0)
+       return int(n), errnoErr(errno)
+}
+
+func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) {
+       n, errno := socketcall(sysRECVMMSG, s, uintptr(unsafe.Pointer(&hs[0])), uintptr(len(hs)), uintptr(flags), 0, 0)
+       return int(n), errnoErr(errno)
+}
+
+func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) {
+       n, errno := socketcall(sysSENDMMSG, s, uintptr(unsafe.Pointer(&hs[0])), uintptr(len(hs)), uintptr(flags), 0, 0)
+       return int(n), errnoErr(errno)
+}
diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux_386.s b/vendor/golang.org/x/net/internal/socket/sys_linux_386.s
new file mode 100644 (file)
index 0000000..93e7d75
--- /dev/null
@@ -0,0 +1,11 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+#include "textflag.h"
+
+TEXT   Â·socketcall(SB),NOSPLIT,$0-36
+       JMP     syscall·socketcall(SB)
+
+TEXT   Â·rawsocketcall(SB),NOSPLIT,$0-36
+       JMP     syscall·rawsocketcall(SB)
diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux_amd64.go b/vendor/golang.org/x/net/internal/socket/sys_linux_amd64.go
new file mode 100644 (file)
index 0000000..9decee2
--- /dev/null
@@ -0,0 +1,10 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package socket
+
+const (
+       sysRECVMMSG = 0x12b
+       sysSENDMMSG = 0x133
+)
diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux_arm.go b/vendor/golang.org/x/net/internal/socket/sys_linux_arm.go
new file mode 100644 (file)
index 0000000..d753b43
--- /dev/null
@@ -0,0 +1,10 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package socket
+
+const (
+       sysRECVMMSG = 0x16d
+       sysSENDMMSG = 0x176
+)
diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux_arm64.go b/vendor/golang.org/x/net/internal/socket/sys_linux_arm64.go
new file mode 100644 (file)
index 0000000..b670894
--- /dev/null
@@ -0,0 +1,10 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package socket
+
+const (
+       sysRECVMMSG = 0xf3
+       sysSENDMMSG = 0x10d
+)
diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux_mips.go b/vendor/golang.org/x/net/internal/socket/sys_linux_mips.go
new file mode 100644 (file)
index 0000000..9c0d740
--- /dev/null
@@ -0,0 +1,10 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package socket
+
+const (
+       sysRECVMMSG = 0x10ef
+       sysSENDMMSG = 0x10f7
+)
diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux_mips64.go b/vendor/golang.org/x/net/internal/socket/sys_linux_mips64.go
new file mode 100644 (file)
index 0000000..071a4ab
--- /dev/null
@@ -0,0 +1,10 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package socket
+
+const (
+       sysRECVMMSG = 0x14ae
+       sysSENDMMSG = 0x14b6
+)
diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux_mips64le.go b/vendor/golang.org/x/net/internal/socket/sys_linux_mips64le.go
new file mode 100644 (file)
index 0000000..071a4ab
--- /dev/null
@@ -0,0 +1,10 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package socket
+
+const (
+       sysRECVMMSG = 0x14ae
+       sysSENDMMSG = 0x14b6
+)
diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux_mipsle.go b/vendor/golang.org/x/net/internal/socket/sys_linux_mipsle.go
new file mode 100644 (file)
index 0000000..9c0d740
--- /dev/null
@@ -0,0 +1,10 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package socket
+
+const (
+       sysRECVMMSG = 0x10ef
+       sysSENDMMSG = 0x10f7
+)
diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux_ppc64.go b/vendor/golang.org/x/net/internal/socket/sys_linux_ppc64.go
new file mode 100644 (file)
index 0000000..21c1e3f
--- /dev/null
@@ -0,0 +1,10 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package socket
+
+const (
+       sysRECVMMSG = 0x157
+       sysSENDMMSG = 0x15d
+)
diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux_ppc64le.go b/vendor/golang.org/x/net/internal/socket/sys_linux_ppc64le.go
new file mode 100644 (file)
index 0000000..21c1e3f
--- /dev/null
@@ -0,0 +1,10 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package socket
+
+const (
+       sysRECVMMSG = 0x157
+       sysSENDMMSG = 0x15d
+)
diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux_s390x.go b/vendor/golang.org/x/net/internal/socket/sys_linux_s390x.go
new file mode 100644 (file)
index 0000000..327979e
--- /dev/null
@@ -0,0 +1,55 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package socket
+
+import (
+       "syscall"
+       "unsafe"
+)
+
+func probeProtocolStack() int { return 8 }
+
+const (
+       sysSETSOCKOPT = 0xe
+       sysGETSOCKOPT = 0xf
+       sysSENDMSG    = 0x10
+       sysRECVMSG    = 0x11
+       sysRECVMMSG   = 0x13
+       sysSENDMMSG   = 0x14
+)
+
+func socketcall(call, a0, a1, a2, a3, a4, a5 uintptr) (uintptr, syscall.Errno)
+func rawsocketcall(call, a0, a1, a2, a3, a4, a5 uintptr) (uintptr, syscall.Errno)
+
+func getsockopt(s uintptr, level, name int, b []byte) (int, error) {
+       l := uint32(len(b))
+       _, errno := socketcall(sysGETSOCKOPT, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(unsafe.Pointer(&l)), 0)
+       return int(l), errnoErr(errno)
+}
+
+func setsockopt(s uintptr, level, name int, b []byte) error {
+       _, errno := socketcall(sysSETSOCKOPT, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(len(b)), 0)
+       return errnoErr(errno)
+}
+
+func recvmsg(s uintptr, h *msghdr, flags int) (int, error) {
+       n, errno := socketcall(sysRECVMSG, s, uintptr(unsafe.Pointer(h)), uintptr(flags), 0, 0, 0)
+       return int(n), errnoErr(errno)
+}
+
+func sendmsg(s uintptr, h *msghdr, flags int) (int, error) {
+       n, errno := socketcall(sysSENDMSG, s, uintptr(unsafe.Pointer(h)), uintptr(flags), 0, 0, 0)
+       return int(n), errnoErr(errno)
+}
+
+func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) {
+       n, errno := socketcall(sysRECVMMSG, s, uintptr(unsafe.Pointer(&hs[0])), uintptr(len(hs)), uintptr(flags), 0, 0)
+       return int(n), errnoErr(errno)
+}
+
+func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) {
+       n, errno := socketcall(sysSENDMMSG, s, uintptr(unsafe.Pointer(&hs[0])), uintptr(len(hs)), uintptr(flags), 0, 0)
+       return int(n), errnoErr(errno)
+}
diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux_s390x.s b/vendor/golang.org/x/net/internal/socket/sys_linux_s390x.s
new file mode 100644 (file)
index 0000000..06d7562
--- /dev/null
@@ -0,0 +1,11 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+#include "textflag.h"
+
+TEXT   Â·socketcall(SB),NOSPLIT,$0-72
+       JMP     syscall·socketcall(SB)
+
+TEXT   Â·rawsocketcall(SB),NOSPLIT,$0-72
+       JMP     syscall·rawsocketcall(SB)
diff --git a/vendor/golang.org/x/net/internal/socket/sys_netbsd.go b/vendor/golang.org/x/net/internal/socket/sys_netbsd.go
new file mode 100644 (file)
index 0000000..431851c
--- /dev/null
@@ -0,0 +1,25 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package socket
+
+import (
+       "syscall"
+       "unsafe"
+)
+
+const (
+       sysRECVMMSG = 0x1db
+       sysSENDMMSG = 0x1dc
+)
+
+func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) {
+       n, _, errno := syscall.Syscall6(sysRECVMMSG, s, uintptr(unsafe.Pointer(&hs[0])), uintptr(len(hs)), uintptr(flags), 0, 0)
+       return int(n), errnoErr(errno)
+}
+
+func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) {
+       n, _, errno := syscall.Syscall6(sysSENDMMSG, s, uintptr(unsafe.Pointer(&hs[0])), uintptr(len(hs)), uintptr(flags), 0, 0)
+       return int(n), errnoErr(errno)
+}
diff --git a/vendor/golang.org/x/net/internal/socket/sys_posix.go b/vendor/golang.org/x/net/internal/socket/sys_posix.go
new file mode 100644 (file)
index 0000000..9a0dbcf
--- /dev/null
@@ -0,0 +1,168 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build go1.9
+// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows
+
+package socket
+
+import (
+       "encoding/binary"
+       "errors"
+       "net"
+       "runtime"
+       "strconv"
+       "sync"
+       "time"
+)
+
+func marshalInetAddr(a net.Addr) []byte {
+       switch a := a.(type) {
+       case *net.TCPAddr:
+               return marshalSockaddr(a.IP, a.Port, a.Zone)
+       case *net.UDPAddr:
+               return marshalSockaddr(a.IP, a.Port, a.Zone)
+       case *net.IPAddr:
+               return marshalSockaddr(a.IP, 0, a.Zone)
+       default:
+               return nil
+       }
+}
+
+func marshalSockaddr(ip net.IP, port int, zone string) []byte {
+       if ip4 := ip.To4(); ip4 != nil {
+               b := make([]byte, sizeofSockaddrInet)
+               switch runtime.GOOS {
+               case "linux", "solaris", "windows":
+                       NativeEndian.PutUint16(b[:2], uint16(sysAF_INET))
+               default:
+                       b[0] = sizeofSockaddrInet
+                       b[1] = sysAF_INET
+               }
+               binary.BigEndian.PutUint16(b[2:4], uint16(port))
+               copy(b[4:8], ip4)
+               return b
+       }
+       if ip6 := ip.To16(); ip6 != nil && ip.To4() == nil {
+               b := make([]byte, sizeofSockaddrInet6)
+               switch runtime.GOOS {
+               case "linux", "solaris", "windows":
+                       NativeEndian.PutUint16(b[:2], uint16(sysAF_INET6))
+               default:
+                       b[0] = sizeofSockaddrInet6
+                       b[1] = sysAF_INET6
+               }
+               binary.BigEndian.PutUint16(b[2:4], uint16(port))
+               copy(b[8:24], ip6)
+               if zone != "" {
+                       NativeEndian.PutUint32(b[24:28], uint32(zoneCache.index(zone)))
+               }
+               return b
+       }
+       return nil
+}
+
+func parseInetAddr(b []byte, network string) (net.Addr, error) {
+       if len(b) < 2 {
+               return nil, errors.New("invalid address")
+       }
+       var af int
+       switch runtime.GOOS {
+       case "linux", "solaris", "windows":
+               af = int(NativeEndian.Uint16(b[:2]))
+       default:
+               af = int(b[1])
+       }
+       var ip net.IP
+       var zone string
+       if af == sysAF_INET {
+               if len(b) < sizeofSockaddrInet {
+                       return nil, errors.New("short address")
+               }
+               ip = make(net.IP, net.IPv4len)
+               copy(ip, b[4:8])
+       }
+       if af == sysAF_INET6 {
+               if len(b) < sizeofSockaddrInet6 {
+                       return nil, errors.New("short address")
+               }
+               ip = make(net.IP, net.IPv6len)
+               copy(ip, b[8:24])
+               if id := int(NativeEndian.Uint32(b[24:28])); id > 0 {
+                       zone = zoneCache.name(id)
+               }
+       }
+       switch network {
+       case "tcp", "tcp4", "tcp6":
+               return &net.TCPAddr{IP: ip, Port: int(binary.BigEndian.Uint16(b[2:4])), Zone: zone}, nil
+       case "udp", "udp4", "udp6":
+               return &net.UDPAddr{IP: ip, Port: int(binary.BigEndian.Uint16(b[2:4])), Zone: zone}, nil
+       default:
+               return &net.IPAddr{IP: ip, Zone: zone}, nil
+       }
+}
+
+// An ipv6ZoneCache represents a cache holding partial network
+// interface information. It is used for reducing the cost of IPv6
+// addressing scope zone resolution.
+//
+// Multiple names sharing the index are managed by first-come
+// first-served basis for consistency.
+type ipv6ZoneCache struct {
+       sync.RWMutex                // guard the following
+       lastFetched  time.Time      // last time routing information was fetched
+       toIndex      map[string]int // interface name to its index
+       toName       map[int]string // interface index to its name
+}
+
+var zoneCache = ipv6ZoneCache{
+       toIndex: make(map[string]int),
+       toName:  make(map[int]string),
+}
+
+func (zc *ipv6ZoneCache) update(ift []net.Interface) {
+       zc.Lock()
+       defer zc.Unlock()
+       now := time.Now()
+       if zc.lastFetched.After(now.Add(-60 * time.Second)) {
+               return
+       }
+       zc.lastFetched = now
+       if len(ift) == 0 {
+               var err error
+               if ift, err = net.Interfaces(); err != nil {
+                       return
+               }
+       }
+       zc.toIndex = make(map[string]int, len(ift))
+       zc.toName = make(map[int]string, len(ift))
+       for _, ifi := range ift {
+               zc.toIndex[ifi.Name] = ifi.Index
+               if _, ok := zc.toName[ifi.Index]; !ok {
+                       zc.toName[ifi.Index] = ifi.Name
+               }
+       }
+}
+
+func (zc *ipv6ZoneCache) name(zone int) string {
+       zoneCache.update(nil)
+       zoneCache.RLock()
+       defer zoneCache.RUnlock()
+       name, ok := zoneCache.toName[zone]
+       if !ok {
+               name = strconv.Itoa(zone)
+       }
+       return name
+}
+
+func (zc *ipv6ZoneCache) index(zone string) int {
+       zoneCache.update(nil)
+       zoneCache.RLock()
+       defer zoneCache.RUnlock()
+       index, ok := zoneCache.toIndex[zone]
+       if !ok {
+               index, _ = strconv.Atoi(zone)
+       }
+       return index
+}
diff --git a/vendor/golang.org/x/net/internal/socket/sys_solaris.go b/vendor/golang.org/x/net/internal/socket/sys_solaris.go
new file mode 100644 (file)
index 0000000..cced74e
--- /dev/null
@@ -0,0 +1,71 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package socket
+
+import (
+       "errors"
+       "runtime"
+       "syscall"
+       "unsafe"
+)
+
+func probeProtocolStack() int {
+       switch runtime.GOARCH {
+       case "amd64":
+               return 4
+       default:
+               var p uintptr
+               return int(unsafe.Sizeof(p))
+       }
+}
+
+//go:cgo_import_dynamic libc___xnet_getsockopt __xnet_getsockopt "libsocket.so"
+//go:cgo_import_dynamic libc_setsockopt setsockopt "libsocket.so"
+//go:cgo_import_dynamic libc___xnet_recvmsg __xnet_recvmsg "libsocket.so"
+//go:cgo_import_dynamic libc___xnet_sendmsg __xnet_sendmsg "libsocket.so"
+
+//go:linkname procGetsockopt libc___xnet_getsockopt
+//go:linkname procSetsockopt libc_setsockopt
+//go:linkname procRecvmsg libc___xnet_recvmsg
+//go:linkname procSendmsg libc___xnet_sendmsg
+
+var (
+       procGetsockopt uintptr
+       procSetsockopt uintptr
+       procRecvmsg    uintptr
+       procSendmsg    uintptr
+)
+
+func sysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (uintptr, uintptr, syscall.Errno)
+func rawSysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (uintptr, uintptr, syscall.Errno)
+
+func getsockopt(s uintptr, level, name int, b []byte) (int, error) {
+       l := uint32(len(b))
+       _, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procGetsockopt)), 5, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(unsafe.Pointer(&l)), 0)
+       return int(l), errnoErr(errno)
+}
+
+func setsockopt(s uintptr, level, name int, b []byte) error {
+       _, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procSetsockopt)), 5, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(len(b)), 0)
+       return errnoErr(errno)
+}
+
+func recvmsg(s uintptr, h *msghdr, flags int) (int, error) {
+       n, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procRecvmsg)), 3, s, uintptr(unsafe.Pointer(h)), uintptr(flags), 0, 0, 0)
+       return int(n), errnoErr(errno)
+}
+
+func sendmsg(s uintptr, h *msghdr, flags int) (int, error) {
+       n, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procSendmsg)), 3, s, uintptr(unsafe.Pointer(h)), uintptr(flags), 0, 0, 0)
+       return int(n), errnoErr(errno)
+}
+
+func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) {
+       return 0, errors.New("not implemented")
+}
+
+func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) {
+       return 0, errors.New("not implemented")
+}
diff --git a/vendor/golang.org/x/net/internal/socket/sys_solaris_amd64.s b/vendor/golang.org/x/net/internal/socket/sys_solaris_amd64.s
new file mode 100644 (file)
index 0000000..a18ac5e
--- /dev/null
@@ -0,0 +1,11 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+#include "textflag.h"
+
+TEXT   Â·sysvicall6(SB),NOSPLIT,$0-88
+       JMP     syscall·sysvicall6(SB)
+
+TEXT   Â·rawSysvicall6(SB),NOSPLIT,$0-88
+       JMP     syscall·rawSysvicall6(SB)
diff --git a/vendor/golang.org/x/net/internal/socket/sys_stub.go b/vendor/golang.org/x/net/internal/socket/sys_stub.go
new file mode 100644 (file)
index 0000000..d9f06d0
--- /dev/null
@@ -0,0 +1,64 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows
+
+package socket
+
+import (
+       "errors"
+       "net"
+       "runtime"
+       "unsafe"
+)
+
+const (
+       sysAF_UNSPEC = 0x0
+       sysAF_INET   = 0x2
+       sysAF_INET6  = 0xa
+
+       sysSOCK_RAW = 0x3
+)
+
+func probeProtocolStack() int {
+       switch runtime.GOARCH {
+       case "amd64p32", "mips64p32":
+               return 4
+       default:
+               var p uintptr
+               return int(unsafe.Sizeof(p))
+       }
+}
+
+func marshalInetAddr(ip net.IP, port int, zone string) []byte {
+       return nil
+}
+
+func parseInetAddr(b []byte, network string) (net.Addr, error) {
+       return nil, errors.New("not implemented")
+}
+
+func getsockopt(s uintptr, level, name int, b []byte) (int, error) {
+       return 0, errors.New("not implemented")
+}
+
+func setsockopt(s uintptr, level, name int, b []byte) error {
+       return errors.New("not implemented")
+}
+
+func recvmsg(s uintptr, h *msghdr, flags int) (int, error) {
+       return 0, errors.New("not implemented")
+}
+
+func sendmsg(s uintptr, h *msghdr, flags int) (int, error) {
+       return 0, errors.New("not implemented")
+}
+
+func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) {
+       return 0, errors.New("not implemented")
+}
+
+func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) {
+       return 0, errors.New("not implemented")
+}
diff --git a/vendor/golang.org/x/net/internal/socket/sys_unix.go b/vendor/golang.org/x/net/internal/socket/sys_unix.go
new file mode 100644 (file)
index 0000000..18eba30
--- /dev/null
@@ -0,0 +1,33 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin dragonfly freebsd linux,!s390x,!386 netbsd openbsd
+
+package socket
+
+import (
+       "syscall"
+       "unsafe"
+)
+
+func getsockopt(s uintptr, level, name int, b []byte) (int, error) {
+       l := uint32(len(b))
+       _, _, errno := syscall.Syscall6(syscall.SYS_GETSOCKOPT, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(unsafe.Pointer(&l)), 0)
+       return int(l), errnoErr(errno)
+}
+
+func setsockopt(s uintptr, level, name int, b []byte) error {
+       _, _, errno := syscall.Syscall6(syscall.SYS_SETSOCKOPT, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(len(b)), 0)
+       return errnoErr(errno)
+}
+
+func recvmsg(s uintptr, h *msghdr, flags int) (int, error) {
+       n, _, errno := syscall.Syscall(syscall.SYS_RECVMSG, s, uintptr(unsafe.Pointer(h)), uintptr(flags))
+       return int(n), errnoErr(errno)
+}
+
+func sendmsg(s uintptr, h *msghdr, flags int) (int, error) {
+       n, _, errno := syscall.Syscall(syscall.SYS_SENDMSG, s, uintptr(unsafe.Pointer(h)), uintptr(flags))
+       return int(n), errnoErr(errno)
+}
diff --git a/vendor/golang.org/x/net/internal/socket/sys_windows.go b/vendor/golang.org/x/net/internal/socket/sys_windows.go
new file mode 100644 (file)
index 0000000..54a470e
--- /dev/null
@@ -0,0 +1,70 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package socket
+
+import (
+       "errors"
+       "syscall"
+       "unsafe"
+)
+
+func probeProtocolStack() int {
+       var p uintptr
+       return int(unsafe.Sizeof(p))
+}
+
+const (
+       sysAF_UNSPEC = 0x0
+       sysAF_INET   = 0x2
+       sysAF_INET6  = 0x17
+
+       sysSOCK_RAW = 0x3
+)
+
+type sockaddrInet struct {
+       Family uint16
+       Port   uint16
+       Addr   [4]byte /* in_addr */
+       Zero   [8]uint8
+}
+
+type sockaddrInet6 struct {
+       Family   uint16
+       Port     uint16
+       Flowinfo uint32
+       Addr     [16]byte /* in6_addr */
+       Scope_id uint32
+}
+
+const (
+       sizeofSockaddrInet  = 0x10
+       sizeofSockaddrInet6 = 0x1c
+)
+
+func getsockopt(s uintptr, level, name int, b []byte) (int, error) {
+       l := uint32(len(b))
+       err := syscall.Getsockopt(syscall.Handle(s), int32(level), int32(name), (*byte)(unsafe.Pointer(&b[0])), (*int32)(unsafe.Pointer(&l)))
+       return int(l), err
+}
+
+func setsockopt(s uintptr, level, name int, b []byte) error {
+       return syscall.Setsockopt(syscall.Handle(s), int32(level), int32(name), (*byte)(unsafe.Pointer(&b[0])), int32(len(b)))
+}
+
+func recvmsg(s uintptr, h *msghdr, flags int) (int, error) {
+       return 0, errors.New("not implemented")
+}
+
+func sendmsg(s uintptr, h *msghdr, flags int) (int, error) {
+       return 0, errors.New("not implemented")
+}
+
+func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) {
+       return 0, errors.New("not implemented")
+}
+
+func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) {
+       return 0, errors.New("not implemented")
+}
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_darwin_386.go b/vendor/golang.org/x/net/internal/socket/zsys_darwin_386.go
new file mode 100644 (file)
index 0000000..26f8fef
--- /dev/null
@@ -0,0 +1,59 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_darwin.go
+
+package socket
+
+const (
+       sysAF_UNSPEC = 0x0
+       sysAF_INET   = 0x2
+       sysAF_INET6  = 0x1e
+
+       sysSOCK_RAW = 0x3
+)
+
+type iovec struct {
+       Base *byte
+       Len  uint32
+}
+
+type msghdr struct {
+       Name       *byte
+       Namelen    uint32
+       Iov        *iovec
+       Iovlen     int32
+       Control    *byte
+       Controllen uint32
+       Flags      int32
+}
+
+type cmsghdr struct {
+       Len   uint32
+       Level int32
+       Type  int32
+}
+
+type sockaddrInet struct {
+       Len    uint8
+       Family uint8
+       Port   uint16
+       Addr   [4]byte /* in_addr */
+       Zero   [8]int8
+}
+
+type sockaddrInet6 struct {
+       Len      uint8
+       Family   uint8
+       Port     uint16
+       Flowinfo uint32
+       Addr     [16]byte /* in6_addr */
+       Scope_id uint32
+}
+
+const (
+       sizeofIovec   = 0x8
+       sizeofMsghdr  = 0x1c
+       sizeofCmsghdr = 0xc
+
+       sizeofSockaddrInet  = 0x10
+       sizeofSockaddrInet6 = 0x1c
+)
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_darwin_amd64.go b/vendor/golang.org/x/net/internal/socket/zsys_darwin_amd64.go
new file mode 100644 (file)
index 0000000..e2987f7
--- /dev/null
@@ -0,0 +1,61 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_darwin.go
+
+package socket
+
+const (
+       sysAF_UNSPEC = 0x0
+       sysAF_INET   = 0x2
+       sysAF_INET6  = 0x1e
+
+       sysSOCK_RAW = 0x3
+)
+
+type iovec struct {
+       Base *byte
+       Len  uint64
+}
+
+type msghdr struct {
+       Name       *byte
+       Namelen    uint32
+       Pad_cgo_0  [4]byte
+       Iov        *iovec
+       Iovlen     int32
+       Pad_cgo_1  [4]byte
+       Control    *byte
+       Controllen uint32
+       Flags      int32
+}
+
+type cmsghdr struct {
+       Len   uint32
+       Level int32
+       Type  int32
+}
+
+type sockaddrInet struct {
+       Len    uint8
+       Family uint8
+       Port   uint16
+       Addr   [4]byte /* in_addr */
+       Zero   [8]int8
+}
+
+type sockaddrInet6 struct {
+       Len      uint8
+       Family   uint8
+       Port     uint16
+       Flowinfo uint32
+       Addr     [16]byte /* in6_addr */
+       Scope_id uint32
+}
+
+const (
+       sizeofIovec   = 0x10
+       sizeofMsghdr  = 0x30
+       sizeofCmsghdr = 0xc
+
+       sizeofSockaddrInet  = 0x10
+       sizeofSockaddrInet6 = 0x1c
+)
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm.go b/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm.go
new file mode 100644 (file)
index 0000000..26f8fef
--- /dev/null
@@ -0,0 +1,59 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_darwin.go
+
+package socket
+
+const (
+       sysAF_UNSPEC = 0x0
+       sysAF_INET   = 0x2
+       sysAF_INET6  = 0x1e
+
+       sysSOCK_RAW = 0x3
+)
+
+type iovec struct {
+       Base *byte
+       Len  uint32
+}
+
+type msghdr struct {
+       Name       *byte
+       Namelen    uint32
+       Iov        *iovec
+       Iovlen     int32
+       Control    *byte
+       Controllen uint32
+       Flags      int32
+}
+
+type cmsghdr struct {
+       Len   uint32
+       Level int32
+       Type  int32
+}
+
+type sockaddrInet struct {
+       Len    uint8
+       Family uint8
+       Port   uint16
+       Addr   [4]byte /* in_addr */
+       Zero   [8]int8
+}
+
+type sockaddrInet6 struct {
+       Len      uint8
+       Family   uint8
+       Port     uint16
+       Flowinfo uint32
+       Addr     [16]byte /* in6_addr */
+       Scope_id uint32
+}
+
+const (
+       sizeofIovec   = 0x8
+       sizeofMsghdr  = 0x1c
+       sizeofCmsghdr = 0xc
+
+       sizeofSockaddrInet  = 0x10
+       sizeofSockaddrInet6 = 0x1c
+)
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_dragonfly_amd64.go b/vendor/golang.org/x/net/internal/socket/zsys_dragonfly_amd64.go
new file mode 100644 (file)
index 0000000..c582abd
--- /dev/null
@@ -0,0 +1,61 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_dragonfly.go
+
+package socket
+
+const (
+       sysAF_UNSPEC = 0x0
+       sysAF_INET   = 0x2
+       sysAF_INET6  = 0x1c
+
+       sysSOCK_RAW = 0x3
+)
+
+type iovec struct {
+       Base *byte
+       Len  uint64
+}
+
+type msghdr struct {
+       Name       *byte
+       Namelen    uint32
+       Pad_cgo_0  [4]byte
+       Iov        *iovec
+       Iovlen     int32
+       Pad_cgo_1  [4]byte
+       Control    *byte
+       Controllen uint32
+       Flags      int32
+}
+
+type cmsghdr struct {
+       Len   uint32
+       Level int32
+       Type  int32
+}
+
+type sockaddrInet struct {
+       Len    uint8
+       Family uint8
+       Port   uint16
+       Addr   [4]byte /* in_addr */
+       Zero   [8]int8
+}
+
+type sockaddrInet6 struct {
+       Len      uint8
+       Family   uint8
+       Port     uint16
+       Flowinfo uint32
+       Addr     [16]byte /* in6_addr */
+       Scope_id uint32
+}
+
+const (
+       sizeofIovec   = 0x10
+       sizeofMsghdr  = 0x30
+       sizeofCmsghdr = 0xc
+
+       sizeofSockaddrInet  = 0x10
+       sizeofSockaddrInet6 = 0x1c
+)
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_freebsd_386.go b/vendor/golang.org/x/net/internal/socket/zsys_freebsd_386.go
new file mode 100644 (file)
index 0000000..04a2488
--- /dev/null
@@ -0,0 +1,59 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_freebsd.go
+
+package socket
+
+const (
+       sysAF_UNSPEC = 0x0
+       sysAF_INET   = 0x2
+       sysAF_INET6  = 0x1c
+
+       sysSOCK_RAW = 0x3
+)
+
+type iovec struct {
+       Base *byte
+       Len  uint32
+}
+
+type msghdr struct {
+       Name       *byte
+       Namelen    uint32
+       Iov        *iovec
+       Iovlen     int32
+       Control    *byte
+       Controllen uint32
+       Flags      int32
+}
+
+type cmsghdr struct {
+       Len   uint32
+       Level int32
+       Type  int32
+}
+
+type sockaddrInet struct {
+       Len    uint8
+       Family uint8
+       Port   uint16
+       Addr   [4]byte /* in_addr */
+       Zero   [8]int8
+}
+
+type sockaddrInet6 struct {
+       Len      uint8
+       Family   uint8
+       Port     uint16
+       Flowinfo uint32
+       Addr     [16]byte /* in6_addr */
+       Scope_id uint32
+}
+
+const (
+       sizeofIovec   = 0x8
+       sizeofMsghdr  = 0x1c
+       sizeofCmsghdr = 0xc
+
+       sizeofSockaddrInet  = 0x10
+       sizeofSockaddrInet6 = 0x1c
+)
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_freebsd_amd64.go b/vendor/golang.org/x/net/internal/socket/zsys_freebsd_amd64.go
new file mode 100644 (file)
index 0000000..35c7cb9
--- /dev/null
@@ -0,0 +1,61 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_freebsd.go
+
+package socket
+
+const (
+       sysAF_UNSPEC = 0x0
+       sysAF_INET   = 0x2
+       sysAF_INET6  = 0x1c
+
+       sysSOCK_RAW = 0x3
+)
+
+type iovec struct {
+       Base *byte
+       Len  uint64
+}
+
+type msghdr struct {
+       Name       *byte
+       Namelen    uint32
+       Pad_cgo_0  [4]byte
+       Iov        *iovec
+       Iovlen     int32
+       Pad_cgo_1  [4]byte
+       Control    *byte
+       Controllen uint32
+       Flags      int32
+}
+
+type cmsghdr struct {
+       Len   uint32
+       Level int32
+       Type  int32
+}
+
+type sockaddrInet struct {
+       Len    uint8
+       Family uint8
+       Port   uint16
+       Addr   [4]byte /* in_addr */
+       Zero   [8]int8
+}
+
+type sockaddrInet6 struct {
+       Len      uint8
+       Family   uint8
+       Port     uint16
+       Flowinfo uint32
+       Addr     [16]byte /* in6_addr */
+       Scope_id uint32
+}
+
+const (
+       sizeofIovec   = 0x10
+       sizeofMsghdr  = 0x30
+       sizeofCmsghdr = 0xc
+
+       sizeofSockaddrInet  = 0x10
+       sizeofSockaddrInet6 = 0x1c
+)
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm.go b/vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm.go
new file mode 100644 (file)
index 0000000..04a2488
--- /dev/null
@@ -0,0 +1,59 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_freebsd.go
+
+package socket
+
+const (
+       sysAF_UNSPEC = 0x0
+       sysAF_INET   = 0x2
+       sysAF_INET6  = 0x1c
+
+       sysSOCK_RAW = 0x3
+)
+
+type iovec struct {
+       Base *byte
+       Len  uint32
+}
+
+type msghdr struct {
+       Name       *byte
+       Namelen    uint32
+       Iov        *iovec
+       Iovlen     int32
+       Control    *byte
+       Controllen uint32
+       Flags      int32
+}
+
+type cmsghdr struct {
+       Len   uint32
+       Level int32
+       Type  int32
+}
+
+type sockaddrInet struct {
+       Len    uint8
+       Family uint8
+       Port   uint16
+       Addr   [4]byte /* in_addr */
+       Zero   [8]int8
+}
+
+type sockaddrInet6 struct {
+       Len      uint8
+       Family   uint8
+       Port     uint16
+       Flowinfo uint32
+       Addr     [16]byte /* in6_addr */
+       Scope_id uint32
+}
+
+const (
+       sizeofIovec   = 0x8
+       sizeofMsghdr  = 0x1c
+       sizeofCmsghdr = 0xc
+
+       sizeofSockaddrInet  = 0x10
+       sizeofSockaddrInet6 = 0x1c
+)
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_386.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_386.go
new file mode 100644 (file)
index 0000000..4302069
--- /dev/null
@@ -0,0 +1,63 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_linux.go
+
+package socket
+
+const (
+       sysAF_UNSPEC = 0x0
+       sysAF_INET   = 0x2
+       sysAF_INET6  = 0xa
+
+       sysSOCK_RAW = 0x3
+)
+
+type iovec struct {
+       Base *byte
+       Len  uint32
+}
+
+type msghdr struct {
+       Name       *byte
+       Namelen    uint32
+       Iov        *iovec
+       Iovlen     uint32
+       Control    *byte
+       Controllen uint32
+       Flags      int32
+}
+
+type mmsghdr struct {
+       Hdr msghdr
+       Len uint32
+}
+
+type cmsghdr struct {
+       Len   uint32
+       Level int32
+       Type  int32
+}
+
+type sockaddrInet struct {
+       Family uint16
+       Port   uint16
+       Addr   [4]byte /* in_addr */
+       X__pad [8]uint8
+}
+
+type sockaddrInet6 struct {
+       Family   uint16
+       Port     uint16
+       Flowinfo uint32
+       Addr     [16]byte /* in6_addr */
+       Scope_id uint32
+}
+
+const (
+       sizeofIovec   = 0x8
+       sizeofMsghdr  = 0x1c
+       sizeofMmsghdr = 0x20
+       sizeofCmsghdr = 0xc
+
+       sizeofSockaddrInet  = 0x10
+       sizeofSockaddrInet6 = 0x1c
+)
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_amd64.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_amd64.go
new file mode 100644 (file)
index 0000000..1502f6c
--- /dev/null
@@ -0,0 +1,66 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_linux.go
+
+package socket
+
+const (
+       sysAF_UNSPEC = 0x0
+       sysAF_INET   = 0x2
+       sysAF_INET6  = 0xa
+
+       sysSOCK_RAW = 0x3
+)
+
+type iovec struct {
+       Base *byte
+       Len  uint64
+}
+
+type msghdr struct {
+       Name       *byte
+       Namelen    uint32
+       Pad_cgo_0  [4]byte
+       Iov        *iovec
+       Iovlen     uint64
+       Control    *byte
+       Controllen uint64
+       Flags      int32
+       Pad_cgo_1  [4]byte
+}
+
+type mmsghdr struct {
+       Hdr       msghdr
+       Len       uint32
+       Pad_cgo_0 [4]byte
+}
+
+type cmsghdr struct {
+       Len   uint64
+       Level int32
+       Type  int32
+}
+
+type sockaddrInet struct {
+       Family uint16
+       Port   uint16
+       Addr   [4]byte /* in_addr */
+       X__pad [8]uint8
+}
+
+type sockaddrInet6 struct {
+       Family   uint16
+       Port     uint16
+       Flowinfo uint32
+       Addr     [16]byte /* in6_addr */
+       Scope_id uint32
+}
+
+const (
+       sizeofIovec   = 0x10
+       sizeofMsghdr  = 0x38
+       sizeofMmsghdr = 0x40
+       sizeofCmsghdr = 0x10
+
+       sizeofSockaddrInet  = 0x10
+       sizeofSockaddrInet6 = 0x1c
+)
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_arm.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_arm.go
new file mode 100644 (file)
index 0000000..4302069
--- /dev/null
@@ -0,0 +1,63 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_linux.go
+
+package socket
+
+const (
+       sysAF_UNSPEC = 0x0
+       sysAF_INET   = 0x2
+       sysAF_INET6  = 0xa
+
+       sysSOCK_RAW = 0x3
+)
+
+type iovec struct {
+       Base *byte
+       Len  uint32
+}
+
+type msghdr struct {
+       Name       *byte
+       Namelen    uint32
+       Iov        *iovec
+       Iovlen     uint32
+       Control    *byte
+       Controllen uint32
+       Flags      int32
+}
+
+type mmsghdr struct {
+       Hdr msghdr
+       Len uint32
+}
+
+type cmsghdr struct {
+       Len   uint32
+       Level int32
+       Type  int32
+}
+
+type sockaddrInet struct {
+       Family uint16
+       Port   uint16
+       Addr   [4]byte /* in_addr */
+       X__pad [8]uint8
+}
+
+type sockaddrInet6 struct {
+       Family   uint16
+       Port     uint16
+       Flowinfo uint32
+       Addr     [16]byte /* in6_addr */
+       Scope_id uint32
+}
+
+const (
+       sizeofIovec   = 0x8
+       sizeofMsghdr  = 0x1c
+       sizeofMmsghdr = 0x20
+       sizeofCmsghdr = 0xc
+
+       sizeofSockaddrInet  = 0x10
+       sizeofSockaddrInet6 = 0x1c
+)
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_arm64.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_arm64.go
new file mode 100644 (file)
index 0000000..1502f6c
--- /dev/null
@@ -0,0 +1,66 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_linux.go
+
+package socket
+
+const (
+       sysAF_UNSPEC = 0x0
+       sysAF_INET   = 0x2
+       sysAF_INET6  = 0xa
+
+       sysSOCK_RAW = 0x3
+)
+
+type iovec struct {
+       Base *byte
+       Len  uint64
+}
+
+type msghdr struct {
+       Name       *byte
+       Namelen    uint32
+       Pad_cgo_0  [4]byte
+       Iov        *iovec
+       Iovlen     uint64
+       Control    *byte
+       Controllen uint64
+       Flags      int32
+       Pad_cgo_1  [4]byte
+}
+
+type mmsghdr struct {
+       Hdr       msghdr
+       Len       uint32
+       Pad_cgo_0 [4]byte
+}
+
+type cmsghdr struct {
+       Len   uint64
+       Level int32
+       Type  int32
+}
+
+type sockaddrInet struct {
+       Family uint16
+       Port   uint16
+       Addr   [4]byte /* in_addr */
+       X__pad [8]uint8
+}
+
+type sockaddrInet6 struct {
+       Family   uint16
+       Port     uint16
+       Flowinfo uint32
+       Addr     [16]byte /* in6_addr */
+       Scope_id uint32
+}
+
+const (
+       sizeofIovec   = 0x10
+       sizeofMsghdr  = 0x38
+       sizeofMmsghdr = 0x40
+       sizeofCmsghdr = 0x10
+
+       sizeofSockaddrInet  = 0x10
+       sizeofSockaddrInet6 = 0x1c
+)
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_mips.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_mips.go
new file mode 100644 (file)
index 0000000..4302069
--- /dev/null
@@ -0,0 +1,63 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_linux.go
+
+package socket
+
+const (
+       sysAF_UNSPEC = 0x0
+       sysAF_INET   = 0x2
+       sysAF_INET6  = 0xa
+
+       sysSOCK_RAW = 0x3
+)
+
+type iovec struct {
+       Base *byte
+       Len  uint32
+}
+
+type msghdr struct {
+       Name       *byte
+       Namelen    uint32
+       Iov        *iovec
+       Iovlen     uint32
+       Control    *byte
+       Controllen uint32
+       Flags      int32
+}
+
+type mmsghdr struct {
+       Hdr msghdr
+       Len uint32
+}
+
+type cmsghdr struct {
+       Len   uint32
+       Level int32
+       Type  int32
+}
+
+type sockaddrInet struct {
+       Family uint16
+       Port   uint16
+       Addr   [4]byte /* in_addr */
+       X__pad [8]uint8
+}
+
+type sockaddrInet6 struct {
+       Family   uint16
+       Port     uint16
+       Flowinfo uint32
+       Addr     [16]byte /* in6_addr */
+       Scope_id uint32
+}
+
+const (
+       sizeofIovec   = 0x8
+       sizeofMsghdr  = 0x1c
+       sizeofMmsghdr = 0x20
+       sizeofCmsghdr = 0xc
+
+       sizeofSockaddrInet  = 0x10
+       sizeofSockaddrInet6 = 0x1c
+)
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64.go
new file mode 100644 (file)
index 0000000..1502f6c
--- /dev/null
@@ -0,0 +1,66 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_linux.go
+
+package socket
+
+const (
+       sysAF_UNSPEC = 0x0
+       sysAF_INET   = 0x2
+       sysAF_INET6  = 0xa
+
+       sysSOCK_RAW = 0x3
+)
+
+type iovec struct {
+       Base *byte
+       Len  uint64
+}
+
+type msghdr struct {
+       Name       *byte
+       Namelen    uint32
+       Pad_cgo_0  [4]byte
+       Iov        *iovec
+       Iovlen     uint64
+       Control    *byte
+       Controllen uint64
+       Flags      int32
+       Pad_cgo_1  [4]byte
+}
+
+type mmsghdr struct {
+       Hdr       msghdr
+       Len       uint32
+       Pad_cgo_0 [4]byte
+}
+
+type cmsghdr struct {
+       Len   uint64
+       Level int32
+       Type  int32
+}
+
+type sockaddrInet struct {
+       Family uint16
+       Port   uint16
+       Addr   [4]byte /* in_addr */
+       X__pad [8]uint8
+}
+
+type sockaddrInet6 struct {
+       Family   uint16
+       Port     uint16
+       Flowinfo uint32
+       Addr     [16]byte /* in6_addr */
+       Scope_id uint32
+}
+
+const (
+       sizeofIovec   = 0x10
+       sizeofMsghdr  = 0x38
+       sizeofMmsghdr = 0x40
+       sizeofCmsghdr = 0x10
+
+       sizeofSockaddrInet  = 0x10
+       sizeofSockaddrInet6 = 0x1c
+)
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64le.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64le.go
new file mode 100644 (file)
index 0000000..1502f6c
--- /dev/null
@@ -0,0 +1,66 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_linux.go
+
+package socket
+
+const (
+       sysAF_UNSPEC = 0x0
+       sysAF_INET   = 0x2
+       sysAF_INET6  = 0xa
+
+       sysSOCK_RAW = 0x3
+)
+
+type iovec struct {
+       Base *byte
+       Len  uint64
+}
+
+type msghdr struct {
+       Name       *byte
+       Namelen    uint32
+       Pad_cgo_0  [4]byte
+       Iov        *iovec
+       Iovlen     uint64
+       Control    *byte
+       Controllen uint64
+       Flags      int32
+       Pad_cgo_1  [4]byte
+}
+
+type mmsghdr struct {
+       Hdr       msghdr
+       Len       uint32
+       Pad_cgo_0 [4]byte
+}
+
+type cmsghdr struct {
+       Len   uint64
+       Level int32
+       Type  int32
+}
+
+type sockaddrInet struct {
+       Family uint16
+       Port   uint16
+       Addr   [4]byte /* in_addr */
+       X__pad [8]uint8
+}
+
+type sockaddrInet6 struct {
+       Family   uint16
+       Port     uint16
+       Flowinfo uint32
+       Addr     [16]byte /* in6_addr */
+       Scope_id uint32
+}
+
+const (
+       sizeofIovec   = 0x10
+       sizeofMsghdr  = 0x38
+       sizeofMmsghdr = 0x40
+       sizeofCmsghdr = 0x10
+
+       sizeofSockaddrInet  = 0x10
+       sizeofSockaddrInet6 = 0x1c
+)
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_mipsle.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_mipsle.go
new file mode 100644 (file)
index 0000000..4302069
--- /dev/null
@@ -0,0 +1,63 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_linux.go
+
+package socket
+
+const (
+       sysAF_UNSPEC = 0x0
+       sysAF_INET   = 0x2
+       sysAF_INET6  = 0xa
+
+       sysSOCK_RAW = 0x3
+)
+
+type iovec struct {
+       Base *byte
+       Len  uint32
+}
+
+type msghdr struct {
+       Name       *byte
+       Namelen    uint32
+       Iov        *iovec
+       Iovlen     uint32
+       Control    *byte
+       Controllen uint32
+       Flags      int32
+}
+
+type mmsghdr struct {
+       Hdr msghdr
+       Len uint32
+}
+
+type cmsghdr struct {
+       Len   uint32
+       Level int32
+       Type  int32
+}
+
+type sockaddrInet struct {
+       Family uint16
+       Port   uint16
+       Addr   [4]byte /* in_addr */
+       X__pad [8]uint8
+}
+
+type sockaddrInet6 struct {
+       Family   uint16
+       Port     uint16
+       Flowinfo uint32
+       Addr     [16]byte /* in6_addr */
+       Scope_id uint32
+}
+
+const (
+       sizeofIovec   = 0x8
+       sizeofMsghdr  = 0x1c
+       sizeofMmsghdr = 0x20
+       sizeofCmsghdr = 0xc
+
+       sizeofSockaddrInet  = 0x10
+       sizeofSockaddrInet6 = 0x1c
+)
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64.go
new file mode 100644 (file)
index 0000000..1502f6c
--- /dev/null
@@ -0,0 +1,66 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_linux.go
+
+package socket
+
+const (
+       sysAF_UNSPEC = 0x0
+       sysAF_INET   = 0x2
+       sysAF_INET6  = 0xa
+
+       sysSOCK_RAW = 0x3
+)
+
+type iovec struct {
+       Base *byte
+       Len  uint64
+}
+
+type msghdr struct {
+       Name       *byte
+       Namelen    uint32
+       Pad_cgo_0  [4]byte
+       Iov        *iovec
+       Iovlen     uint64
+       Control    *byte
+       Controllen uint64
+       Flags      int32
+       Pad_cgo_1  [4]byte
+}
+
+type mmsghdr struct {
+       Hdr       msghdr
+       Len       uint32
+       Pad_cgo_0 [4]byte
+}
+
+type cmsghdr struct {
+       Len   uint64
+       Level int32
+       Type  int32
+}
+
+type sockaddrInet struct {
+       Family uint16
+       Port   uint16
+       Addr   [4]byte /* in_addr */
+       X__pad [8]uint8
+}
+
+type sockaddrInet6 struct {
+       Family   uint16
+       Port     uint16
+       Flowinfo uint32
+       Addr     [16]byte /* in6_addr */
+       Scope_id uint32
+}
+
+const (
+       sizeofIovec   = 0x10
+       sizeofMsghdr  = 0x38
+       sizeofMmsghdr = 0x40
+       sizeofCmsghdr = 0x10
+
+       sizeofSockaddrInet  = 0x10
+       sizeofSockaddrInet6 = 0x1c
+)
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64le.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64le.go
new file mode 100644 (file)
index 0000000..1502f6c
--- /dev/null
@@ -0,0 +1,66 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_linux.go
+
+package socket
+
+const (
+       sysAF_UNSPEC = 0x0
+       sysAF_INET   = 0x2
+       sysAF_INET6  = 0xa
+
+       sysSOCK_RAW = 0x3
+)
+
+type iovec struct {
+       Base *byte
+       Len  uint64
+}
+
+type msghdr struct {
+       Name       *byte
+       Namelen    uint32
+       Pad_cgo_0  [4]byte
+       Iov        *iovec
+       Iovlen     uint64
+       Control    *byte
+       Controllen uint64
+       Flags      int32
+       Pad_cgo_1  [4]byte
+}
+
+type mmsghdr struct {
+       Hdr       msghdr
+       Len       uint32
+       Pad_cgo_0 [4]byte
+}
+
+type cmsghdr struct {
+       Len   uint64
+       Level int32
+       Type  int32
+}
+
+type sockaddrInet struct {
+       Family uint16
+       Port   uint16
+       Addr   [4]byte /* in_addr */
+       X__pad [8]uint8
+}
+
+type sockaddrInet6 struct {
+       Family   uint16
+       Port     uint16
+       Flowinfo uint32
+       Addr     [16]byte /* in6_addr */
+       Scope_id uint32
+}
+
+const (
+       sizeofIovec   = 0x10
+       sizeofMsghdr  = 0x38
+       sizeofMmsghdr = 0x40
+       sizeofCmsghdr = 0x10
+
+       sizeofSockaddrInet  = 0x10
+       sizeofSockaddrInet6 = 0x1c
+)
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_s390x.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_s390x.go
new file mode 100644 (file)
index 0000000..1502f6c
--- /dev/null
@@ -0,0 +1,66 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_linux.go
+
+package socket
+
+const (
+       sysAF_UNSPEC = 0x0
+       sysAF_INET   = 0x2
+       sysAF_INET6  = 0xa
+
+       sysSOCK_RAW = 0x3
+)
+
+type iovec struct {
+       Base *byte
+       Len  uint64
+}
+
+type msghdr struct {
+       Name       *byte
+       Namelen    uint32
+       Pad_cgo_0  [4]byte
+       Iov        *iovec
+       Iovlen     uint64
+       Control    *byte
+       Controllen uint64
+       Flags      int32
+       Pad_cgo_1  [4]byte
+}
+
+type mmsghdr struct {
+       Hdr       msghdr
+       Len       uint32
+       Pad_cgo_0 [4]byte
+}
+
+type cmsghdr struct {
+       Len   uint64
+       Level int32
+       Type  int32
+}
+
+type sockaddrInet struct {
+       Family uint16
+       Port   uint16
+       Addr   [4]byte /* in_addr */
+       X__pad [8]uint8
+}
+
+type sockaddrInet6 struct {
+       Family   uint16
+       Port     uint16
+       Flowinfo uint32
+       Addr     [16]byte /* in6_addr */
+       Scope_id uint32
+}
+
+const (
+       sizeofIovec   = 0x10
+       sizeofMsghdr  = 0x38
+       sizeofMmsghdr = 0x40
+       sizeofCmsghdr = 0x10
+
+       sizeofSockaddrInet  = 0x10
+       sizeofSockaddrInet6 = 0x1c
+)
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_netbsd_386.go b/vendor/golang.org/x/net/internal/socket/zsys_netbsd_386.go
new file mode 100644 (file)
index 0000000..db60491
--- /dev/null
@@ -0,0 +1,65 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_netbsd.go
+
+package socket
+
+const (
+       sysAF_UNSPEC = 0x0
+       sysAF_INET   = 0x2
+       sysAF_INET6  = 0x18
+
+       sysSOCK_RAW = 0x3
+)
+
+type iovec struct {
+       Base *byte
+       Len  uint32
+}
+
+type msghdr struct {
+       Name       *byte
+       Namelen    uint32
+       Iov        *iovec
+       Iovlen     int32
+       Control    *byte
+       Controllen uint32
+       Flags      int32
+}
+
+type mmsghdr struct {
+       Hdr msghdr
+       Len uint32
+}
+
+type cmsghdr struct {
+       Len   uint32
+       Level int32
+       Type  int32
+}
+
+type sockaddrInet struct {
+       Len    uint8
+       Family uint8
+       Port   uint16
+       Addr   [4]byte /* in_addr */
+       Zero   [8]int8
+}
+
+type sockaddrInet6 struct {
+       Len      uint8
+       Family   uint8
+       Port     uint16
+       Flowinfo uint32
+       Addr     [16]byte /* in6_addr */
+       Scope_id uint32
+}
+
+const (
+       sizeofIovec   = 0x8
+       sizeofMsghdr  = 0x1c
+       sizeofMmsghdr = 0x20
+       sizeofCmsghdr = 0xc
+
+       sizeofSockaddrInet  = 0x10
+       sizeofSockaddrInet6 = 0x1c
+)
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_netbsd_amd64.go b/vendor/golang.org/x/net/internal/socket/zsys_netbsd_amd64.go
new file mode 100644 (file)
index 0000000..2a1a799
--- /dev/null
@@ -0,0 +1,68 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_netbsd.go
+
+package socket
+
+const (
+       sysAF_UNSPEC = 0x0
+       sysAF_INET   = 0x2
+       sysAF_INET6  = 0x18
+
+       sysSOCK_RAW = 0x3
+)
+
+type iovec struct {
+       Base *byte
+       Len  uint64
+}
+
+type msghdr struct {
+       Name       *byte
+       Namelen    uint32
+       Pad_cgo_0  [4]byte
+       Iov        *iovec
+       Iovlen     int32
+       Pad_cgo_1  [4]byte
+       Control    *byte
+       Controllen uint32
+       Flags      int32
+}
+
+type mmsghdr struct {
+       Hdr       msghdr
+       Len       uint32
+       Pad_cgo_0 [4]byte
+}
+
+type cmsghdr struct {
+       Len   uint32
+       Level int32
+       Type  int32
+}
+
+type sockaddrInet struct {
+       Len    uint8
+       Family uint8
+       Port   uint16
+       Addr   [4]byte /* in_addr */
+       Zero   [8]int8
+}
+
+type sockaddrInet6 struct {
+       Len      uint8
+       Family   uint8
+       Port     uint16
+       Flowinfo uint32
+       Addr     [16]byte /* in6_addr */
+       Scope_id uint32
+}
+
+const (
+       sizeofIovec   = 0x10
+       sizeofMsghdr  = 0x30
+       sizeofMmsghdr = 0x40
+       sizeofCmsghdr = 0xc
+
+       sizeofSockaddrInet  = 0x10
+       sizeofSockaddrInet6 = 0x1c
+)
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm.go b/vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm.go
new file mode 100644 (file)
index 0000000..206ea2d
--- /dev/null
@@ -0,0 +1,59 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_netbsd.go
+
+package socket
+
+const (
+       sysAF_UNSPEC = 0x0
+       sysAF_INET   = 0x2
+       sysAF_INET6  = 0x18
+
+       sysSOCK_RAW = 0x3
+)
+
+type iovec struct {
+       Base *byte
+       Len  uint32
+}
+
+type msghdr struct {
+       Name       *byte
+       Namelen    uint32
+       Iov        *iovec
+       Iovlen     int32
+       Control    *byte
+       Controllen uint32
+       Flags      int32
+}
+
+type cmsghdr struct {
+       Len   uint32
+       Level int32
+       Type  int32
+}
+
+type sockaddrInet struct {
+       Len    uint8
+       Family uint8
+       Port   uint16
+       Addr   [4]byte /* in_addr */
+       Zero   [8]int8
+}
+
+type sockaddrInet6 struct {
+       Len      uint8
+       Family   uint8
+       Port     uint16
+       Flowinfo uint32
+       Addr     [16]byte /* in6_addr */
+       Scope_id uint32
+}
+
+const (
+       sizeofIovec   = 0x8
+       sizeofMsghdr  = 0x1c
+       sizeofCmsghdr = 0xc
+
+       sizeofSockaddrInet  = 0x10
+       sizeofSockaddrInet6 = 0x1c
+)
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_openbsd_386.go b/vendor/golang.org/x/net/internal/socket/zsys_openbsd_386.go
new file mode 100644 (file)
index 0000000..1c83636
--- /dev/null
@@ -0,0 +1,59 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_openbsd.go
+
+package socket
+
+const (
+       sysAF_UNSPEC = 0x0
+       sysAF_INET   = 0x2
+       sysAF_INET6  = 0x18
+
+       sysSOCK_RAW = 0x3
+)
+
+type iovec struct {
+       Base *byte
+       Len  uint32
+}
+
+type msghdr struct {
+       Name       *byte
+       Namelen    uint32
+       Iov        *iovec
+       Iovlen     uint32
+       Control    *byte
+       Controllen uint32
+       Flags      int32
+}
+
+type cmsghdr struct {
+       Len   uint32
+       Level int32
+       Type  int32
+}
+
+type sockaddrInet struct {
+       Len    uint8
+       Family uint8
+       Port   uint16
+       Addr   [4]byte /* in_addr */
+       Zero   [8]int8
+}
+
+type sockaddrInet6 struct {
+       Len      uint8
+       Family   uint8
+       Port     uint16
+       Flowinfo uint32
+       Addr     [16]byte /* in6_addr */
+       Scope_id uint32
+}
+
+const (
+       sizeofIovec   = 0x8
+       sizeofMsghdr  = 0x1c
+       sizeofCmsghdr = 0xc
+
+       sizeofSockaddrInet  = 0x10
+       sizeofSockaddrInet6 = 0x1c
+)
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_openbsd_amd64.go b/vendor/golang.org/x/net/internal/socket/zsys_openbsd_amd64.go
new file mode 100644 (file)
index 0000000..a6c0bf4
--- /dev/null
@@ -0,0 +1,61 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_openbsd.go
+
+package socket
+
+const (
+       sysAF_UNSPEC = 0x0
+       sysAF_INET   = 0x2
+       sysAF_INET6  = 0x18
+
+       sysSOCK_RAW = 0x3
+)
+
+type iovec struct {
+       Base *byte
+       Len  uint64
+}
+
+type msghdr struct {
+       Name       *byte
+       Namelen    uint32
+       Pad_cgo_0  [4]byte
+       Iov        *iovec
+       Iovlen     uint32
+       Pad_cgo_1  [4]byte
+       Control    *byte
+       Controllen uint32
+       Flags      int32
+}
+
+type cmsghdr struct {
+       Len   uint32
+       Level int32
+       Type  int32
+}
+
+type sockaddrInet struct {
+       Len    uint8
+       Family uint8
+       Port   uint16
+       Addr   [4]byte /* in_addr */
+       Zero   [8]int8
+}
+
+type sockaddrInet6 struct {
+       Len      uint8
+       Family   uint8
+       Port     uint16
+       Flowinfo uint32
+       Addr     [16]byte /* in6_addr */
+       Scope_id uint32
+}
+
+const (
+       sizeofIovec   = 0x10
+       sizeofMsghdr  = 0x30
+       sizeofCmsghdr = 0xc
+
+       sizeofSockaddrInet  = 0x10
+       sizeofSockaddrInet6 = 0x1c
+)
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm.go b/vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm.go
new file mode 100644 (file)
index 0000000..1c83636
--- /dev/null
@@ -0,0 +1,59 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_openbsd.go
+
+package socket
+
+const (
+       sysAF_UNSPEC = 0x0
+       sysAF_INET   = 0x2
+       sysAF_INET6  = 0x18
+
+       sysSOCK_RAW = 0x3
+)
+
+type iovec struct {
+       Base *byte
+       Len  uint32
+}
+
+type msghdr struct {
+       Name       *byte
+       Namelen    uint32
+       Iov        *iovec
+       Iovlen     uint32
+       Control    *byte
+       Controllen uint32
+       Flags      int32
+}
+
+type cmsghdr struct {
+       Len   uint32
+       Level int32
+       Type  int32
+}
+
+type sockaddrInet struct {
+       Len    uint8
+       Family uint8
+       Port   uint16
+       Addr   [4]byte /* in_addr */
+       Zero   [8]int8
+}
+
+type sockaddrInet6 struct {
+       Len      uint8
+       Family   uint8
+       Port     uint16
+       Flowinfo uint32
+       Addr     [16]byte /* in6_addr */
+       Scope_id uint32
+}
+
+const (
+       sizeofIovec   = 0x8
+       sizeofMsghdr  = 0x1c
+       sizeofCmsghdr = 0xc
+
+       sizeofSockaddrInet  = 0x10
+       sizeofSockaddrInet6 = 0x1c
+)
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_solaris_amd64.go b/vendor/golang.org/x/net/internal/socket/zsys_solaris_amd64.go
new file mode 100644 (file)
index 0000000..327c632
--- /dev/null
@@ -0,0 +1,60 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_solaris.go
+
+package socket
+
+const (
+       sysAF_UNSPEC = 0x0
+       sysAF_INET   = 0x2
+       sysAF_INET6  = 0x1a
+
+       sysSOCK_RAW = 0x4
+)
+
+type iovec struct {
+       Base *int8
+       Len  uint64
+}
+
+type msghdr struct {
+       Name         *byte
+       Namelen      uint32
+       Pad_cgo_0    [4]byte
+       Iov          *iovec
+       Iovlen       int32
+       Pad_cgo_1    [4]byte
+       Accrights    *int8
+       Accrightslen int32
+       Pad_cgo_2    [4]byte
+}
+
+type cmsghdr struct {
+       Len   uint32
+       Level int32
+       Type  int32
+}
+
+type sockaddrInet struct {
+       Family uint16
+       Port   uint16
+       Addr   [4]byte /* in_addr */
+       Zero   [8]int8
+}
+
+type sockaddrInet6 struct {
+       Family         uint16
+       Port           uint16
+       Flowinfo       uint32
+       Addr           [16]byte /* in6_addr */
+       Scope_id       uint32
+       X__sin6_src_id uint32
+}
+
+const (
+       sizeofIovec   = 0x10
+       sizeofMsghdr  = 0x30
+       sizeofCmsghdr = 0xc
+
+       sizeofSockaddrInet  = 0x10
+       sizeofSockaddrInet6 = 0x20
+)
diff --git a/vendor/golang.org/x/net/ipv4/batch.go b/vendor/golang.org/x/net/ipv4/batch.go
new file mode 100644 (file)
index 0000000..b445499
--- /dev/null
@@ -0,0 +1,191 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build go1.9
+
+package ipv4
+
+import (
+       "net"
+       "runtime"
+       "syscall"
+
+       "golang.org/x/net/internal/socket"
+)
+
+// BUG(mikio): On Windows, the ReadBatch and WriteBatch methods of
+// PacketConn are not implemented.
+
+// BUG(mikio): On Windows, the ReadBatch and WriteBatch methods of
+// RawConn are not implemented.
+
+// A Message represents an IO message.
+//
+//     type Message struct {
+//             Buffers [][]byte
+//             OOB     []byte
+//             Addr    net.Addr
+//             N       int
+//             NN      int
+//             Flags   int
+//     }
+//
+// The Buffers fields represents a list of contiguous buffers, which
+// can be used for vectored IO, for example, putting a header and a
+// payload in each slice.
+// When writing, the Buffers field must contain at least one byte to
+// write.
+// When reading, the Buffers field will always contain a byte to read.
+//
+// The OOB field contains protocol-specific control or miscellaneous
+// ancillary data known as out-of-band data.
+// It can be nil when not required.
+//
+// The Addr field specifies a destination address when writing.
+// It can be nil when the underlying protocol of the endpoint uses
+// connection-oriented communication.
+// After a successful read, it may contain the source address on the
+// received packet.
+//
+// The N field indicates the number of bytes read or written from/to
+// Buffers.
+//
+// The NN field indicates the number of bytes read or written from/to
+// OOB.
+//
+// The Flags field contains protocol-specific information on the
+// received message.
+type Message = socket.Message
+
+// ReadBatch reads a batch of messages.
+//
+// The provided flags is a set of platform-dependent flags, such as
+// syscall.MSG_PEEK.
+//
+// On a successful read it returns the number of messages received, up
+// to len(ms).
+//
+// On Linux, a batch read will be optimized.
+// On other platforms, this method will read only a single message.
+//
+// Unlike the ReadFrom method, it doesn't strip the IPv4 header
+// followed by option headers from the received IPv4 datagram when the
+// underlying transport is net.IPConn. Each Buffers field of Message
+// must be large enough to accommodate an IPv4 header and option
+// headers.
+func (c *payloadHandler) ReadBatch(ms []Message, flags int) (int, error) {
+       if !c.ok() {
+               return 0, syscall.EINVAL
+       }
+       switch runtime.GOOS {
+       case "linux":
+               n, err := c.RecvMsgs([]socket.Message(ms), flags)
+               if err != nil {
+                       err = &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err}
+               }
+               return n, err
+       default:
+               n := 1
+               err := c.RecvMsg(&ms[0], flags)
+               if err != nil {
+                       n = 0
+                       err = &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err}
+               }
+               return n, err
+       }
+}
+
+// WriteBatch writes a batch of messages.
+//
+// The provided flags is a set of platform-dependent flags, such as
+// syscall.MSG_DONTROUTE.
+//
+// It returns the number of messages written on a successful write.
+//
+// On Linux, a batch write will be optimized.
+// On other platforms, this method will write only a single message.
+func (c *payloadHandler) WriteBatch(ms []Message, flags int) (int, error) {
+       if !c.ok() {
+               return 0, syscall.EINVAL
+       }
+       switch runtime.GOOS {
+       case "linux":
+               n, err := c.SendMsgs([]socket.Message(ms), flags)
+               if err != nil {
+                       err = &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err}
+               }
+               return n, err
+       default:
+               n := 1
+               err := c.SendMsg(&ms[0], flags)
+               if err != nil {
+                       n = 0
+                       err = &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err}
+               }
+               return n, err
+       }
+}
+
+// ReadBatch reads a batch of messages.
+//
+// The provided flags is a set of platform-dependent flags, such as
+// syscall.MSG_PEEK.
+//
+// On a successful read it returns the number of messages received, up
+// to len(ms).
+//
+// On Linux, a batch read will be optimized.
+// On other platforms, this method will read only a single message.
+func (c *packetHandler) ReadBatch(ms []Message, flags int) (int, error) {
+       if !c.ok() {
+               return 0, syscall.EINVAL
+       }
+       switch runtime.GOOS {
+       case "linux":
+               n, err := c.RecvMsgs([]socket.Message(ms), flags)
+               if err != nil {
+                       err = &net.OpError{Op: "read", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Err: err}
+               }
+               return n, err
+       default:
+               n := 1
+               err := c.RecvMsg(&ms[0], flags)
+               if err != nil {
+                       n = 0
+                       err = &net.OpError{Op: "read", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Err: err}
+               }
+               return n, err
+       }
+}
+
+// WriteBatch writes a batch of messages.
+//
+// The provided flags is a set of platform-dependent flags, such as
+// syscall.MSG_DONTROUTE.
+//
+// It returns the number of messages written on a successful write.
+//
+// On Linux, a batch write will be optimized.
+// On other platforms, this method will write only a single message.
+func (c *packetHandler) WriteBatch(ms []Message, flags int) (int, error) {
+       if !c.ok() {
+               return 0, syscall.EINVAL
+       }
+       switch runtime.GOOS {
+       case "linux":
+               n, err := c.SendMsgs([]socket.Message(ms), flags)
+               if err != nil {
+                       err = &net.OpError{Op: "write", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Err: err}
+               }
+               return n, err
+       default:
+               n := 1
+               err := c.SendMsg(&ms[0], flags)
+               if err != nil {
+                       n = 0
+                       err = &net.OpError{Op: "write", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Err: err}
+               }
+               return n, err
+       }
+}
diff --git a/vendor/golang.org/x/net/ipv4/dgramopt.go b/vendor/golang.org/x/net/ipv4/dgramopt.go
new file mode 100644 (file)
index 0000000..54d77d5
--- /dev/null
@@ -0,0 +1,265 @@
+// Copyright 2012 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package ipv4
+
+import (
+       "net"
+       "syscall"
+
+       "golang.org/x/net/bpf"
+)
+
+// MulticastTTL returns the time-to-live field value for outgoing
+// multicast packets.
+func (c *dgramOpt) MulticastTTL() (int, error) {
+       if !c.ok() {
+               return 0, syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoMulticastTTL]
+       if !ok {
+               return 0, errOpNoSupport
+       }
+       return so.GetInt(c.Conn)
+}
+
+// SetMulticastTTL sets the time-to-live field value for future
+// outgoing multicast packets.
+func (c *dgramOpt) SetMulticastTTL(ttl int) error {
+       if !c.ok() {
+               return syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoMulticastTTL]
+       if !ok {
+               return errOpNoSupport
+       }
+       return so.SetInt(c.Conn, ttl)
+}
+
+// MulticastInterface returns the default interface for multicast
+// packet transmissions.
+func (c *dgramOpt) MulticastInterface() (*net.Interface, error) {
+       if !c.ok() {
+               return nil, syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoMulticastInterface]
+       if !ok {
+               return nil, errOpNoSupport
+       }
+       return so.getMulticastInterface(c.Conn)
+}
+
+// SetMulticastInterface sets the default interface for future
+// multicast packet transmissions.
+func (c *dgramOpt) SetMulticastInterface(ifi *net.Interface) error {
+       if !c.ok() {
+               return syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoMulticastInterface]
+       if !ok {
+               return errOpNoSupport
+       }
+       return so.setMulticastInterface(c.Conn, ifi)
+}
+
+// MulticastLoopback reports whether transmitted multicast packets
+// should be copied and send back to the originator.
+func (c *dgramOpt) MulticastLoopback() (bool, error) {
+       if !c.ok() {
+               return false, syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoMulticastLoopback]
+       if !ok {
+               return false, errOpNoSupport
+       }
+       on, err := so.GetInt(c.Conn)
+       if err != nil {
+               return false, err
+       }
+       return on == 1, nil
+}
+
+// SetMulticastLoopback sets whether transmitted multicast packets
+// should be copied and send back to the originator.
+func (c *dgramOpt) SetMulticastLoopback(on bool) error {
+       if !c.ok() {
+               return syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoMulticastLoopback]
+       if !ok {
+               return errOpNoSupport
+       }
+       return so.SetInt(c.Conn, boolint(on))
+}
+
+// JoinGroup joins the group address group on the interface ifi.
+// By default all sources that can cast data to group are accepted.
+// It's possible to mute and unmute data transmission from a specific
+// source by using ExcludeSourceSpecificGroup and
+// IncludeSourceSpecificGroup.
+// JoinGroup uses the system assigned multicast interface when ifi is
+// nil, although this is not recommended because the assignment
+// depends on platforms and sometimes it might require routing
+// configuration.
+func (c *dgramOpt) JoinGroup(ifi *net.Interface, group net.Addr) error {
+       if !c.ok() {
+               return syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoJoinGroup]
+       if !ok {
+               return errOpNoSupport
+       }
+       grp := netAddrToIP4(group)
+       if grp == nil {
+               return errMissingAddress
+       }
+       return so.setGroup(c.Conn, ifi, grp)
+}
+
+// LeaveGroup leaves the group address group on the interface ifi
+// regardless of whether the group is any-source group or
+// source-specific group.
+func (c *dgramOpt) LeaveGroup(ifi *net.Interface, group net.Addr) error {
+       if !c.ok() {
+               return syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoLeaveGroup]
+       if !ok {
+               return errOpNoSupport
+       }
+       grp := netAddrToIP4(group)
+       if grp == nil {
+               return errMissingAddress
+       }
+       return so.setGroup(c.Conn, ifi, grp)
+}
+
+// JoinSourceSpecificGroup joins the source-specific group comprising
+// group and source on the interface ifi.
+// JoinSourceSpecificGroup uses the system assigned multicast
+// interface when ifi is nil, although this is not recommended because
+// the assignment depends on platforms and sometimes it might require
+// routing configuration.
+func (c *dgramOpt) JoinSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error {
+       if !c.ok() {
+               return syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoJoinSourceGroup]
+       if !ok {
+               return errOpNoSupport
+       }
+       grp := netAddrToIP4(group)
+       if grp == nil {
+               return errMissingAddress
+       }
+       src := netAddrToIP4(source)
+       if src == nil {
+               return errMissingAddress
+       }
+       return so.setSourceGroup(c.Conn, ifi, grp, src)
+}
+
+// LeaveSourceSpecificGroup leaves the source-specific group on the
+// interface ifi.
+func (c *dgramOpt) LeaveSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error {
+       if !c.ok() {
+               return syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoLeaveSourceGroup]
+       if !ok {
+               return errOpNoSupport
+       }
+       grp := netAddrToIP4(group)
+       if grp == nil {
+               return errMissingAddress
+       }
+       src := netAddrToIP4(source)
+       if src == nil {
+               return errMissingAddress
+       }
+       return so.setSourceGroup(c.Conn, ifi, grp, src)
+}
+
+// ExcludeSourceSpecificGroup excludes the source-specific group from
+// the already joined any-source groups by JoinGroup on the interface
+// ifi.
+func (c *dgramOpt) ExcludeSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error {
+       if !c.ok() {
+               return syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoBlockSourceGroup]
+       if !ok {
+               return errOpNoSupport
+       }
+       grp := netAddrToIP4(group)
+       if grp == nil {
+               return errMissingAddress
+       }
+       src := netAddrToIP4(source)
+       if src == nil {
+               return errMissingAddress
+       }
+       return so.setSourceGroup(c.Conn, ifi, grp, src)
+}
+
+// IncludeSourceSpecificGroup includes the excluded source-specific
+// group by ExcludeSourceSpecificGroup again on the interface ifi.
+func (c *dgramOpt) IncludeSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error {
+       if !c.ok() {
+               return syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoUnblockSourceGroup]
+       if !ok {
+               return errOpNoSupport
+       }
+       grp := netAddrToIP4(group)
+       if grp == nil {
+               return errMissingAddress
+       }
+       src := netAddrToIP4(source)
+       if src == nil {
+               return errMissingAddress
+       }
+       return so.setSourceGroup(c.Conn, ifi, grp, src)
+}
+
+// ICMPFilter returns an ICMP filter.
+// Currently only Linux supports this.
+func (c *dgramOpt) ICMPFilter() (*ICMPFilter, error) {
+       if !c.ok() {
+               return nil, syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoICMPFilter]
+       if !ok {
+               return nil, errOpNoSupport
+       }
+       return so.getICMPFilter(c.Conn)
+}
+
+// SetICMPFilter deploys the ICMP filter.
+// Currently only Linux supports this.
+func (c *dgramOpt) SetICMPFilter(f *ICMPFilter) error {
+       if !c.ok() {
+               return syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoICMPFilter]
+       if !ok {
+               return errOpNoSupport
+       }
+       return so.setICMPFilter(c.Conn, f)
+}
+
+// SetBPF attaches a BPF program to the connection.
+//
+// Only supported on Linux.
+func (c *dgramOpt) SetBPF(filter []bpf.RawInstruction) error {
+       if !c.ok() {
+               return syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoAttachFilter]
+       if !ok {
+               return errOpNoSupport
+       }
+       return so.setBPF(c.Conn, filter)
+}
diff --git a/vendor/golang.org/x/net/ipv4/genericopt.go b/vendor/golang.org/x/net/ipv4/genericopt.go
new file mode 100644 (file)
index 0000000..119bf84
--- /dev/null
@@ -0,0 +1,57 @@
+// Copyright 2012 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package ipv4
+
+import "syscall"
+
+// TOS returns the type-of-service field value for outgoing packets.
+func (c *genericOpt) TOS() (int, error) {
+       if !c.ok() {
+               return 0, syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoTOS]
+       if !ok {
+               return 0, errOpNoSupport
+       }
+       return so.GetInt(c.Conn)
+}
+
+// SetTOS sets the type-of-service field value for future outgoing
+// packets.
+func (c *genericOpt) SetTOS(tos int) error {
+       if !c.ok() {
+               return syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoTOS]
+       if !ok {
+               return errOpNoSupport
+       }
+       return so.SetInt(c.Conn, tos)
+}
+
+// TTL returns the time-to-live field value for outgoing packets.
+func (c *genericOpt) TTL() (int, error) {
+       if !c.ok() {
+               return 0, syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoTTL]
+       if !ok {
+               return 0, errOpNoSupport
+       }
+       return so.GetInt(c.Conn)
+}
+
+// SetTTL sets the time-to-live field value for future outgoing
+// packets.
+func (c *genericOpt) SetTTL(ttl int) error {
+       if !c.ok() {
+               return syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoTTL]
+       if !ok {
+               return errOpNoSupport
+       }
+       return so.SetInt(c.Conn, ttl)
+}
diff --git a/vendor/golang.org/x/net/ipv4/packet_go1_8.go b/vendor/golang.org/x/net/ipv4/packet_go1_8.go
new file mode 100644 (file)
index 0000000..b47d186
--- /dev/null
@@ -0,0 +1,56 @@
+// Copyright 2012 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !go1.9
+
+package ipv4
+
+import "net"
+
+func (c *packetHandler) readFrom(b []byte) (h *Header, p []byte, cm *ControlMessage, err error) {
+       c.rawOpt.RLock()
+       oob := NewControlMessage(c.rawOpt.cflags)
+       c.rawOpt.RUnlock()
+       n, nn, _, src, err := c.ReadMsgIP(b, oob)
+       if err != nil {
+               return nil, nil, nil, err
+       }
+       var hs []byte
+       if hs, p, err = slicePacket(b[:n]); err != nil {
+               return nil, nil, nil, err
+       }
+       if h, err = ParseHeader(hs); err != nil {
+               return nil, nil, nil, err
+       }
+       if nn > 0 {
+               cm = new(ControlMessage)
+               if err := cm.Parse(oob[:nn]); err != nil {
+                       return nil, nil, nil, err
+               }
+       }
+       if src != nil && cm != nil {
+               cm.Src = src.IP
+       }
+       return
+}
+
+func (c *packetHandler) writeTo(h *Header, p []byte, cm *ControlMessage) error {
+       oob := cm.Marshal()
+       wh, err := h.Marshal()
+       if err != nil {
+               return err
+       }
+       dst := new(net.IPAddr)
+       if cm != nil {
+               if ip := cm.Dst.To4(); ip != nil {
+                       dst.IP = ip
+               }
+       }
+       if dst.IP == nil {
+               dst.IP = h.Dst
+       }
+       wh = append(wh, p...)
+       _, _, err = c.WriteMsgIP(wh, oob, dst)
+       return err
+}
diff --git a/vendor/golang.org/x/net/ipv4/packet_go1_9.go b/vendor/golang.org/x/net/ipv4/packet_go1_9.go
new file mode 100644 (file)
index 0000000..082c36d
--- /dev/null
@@ -0,0 +1,67 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build go1.9
+
+package ipv4
+
+import (
+       "net"
+
+       "golang.org/x/net/internal/socket"
+)
+
+func (c *packetHandler) readFrom(b []byte) (h *Header, p []byte, cm *ControlMessage, err error) {
+       c.rawOpt.RLock()
+       m := socket.Message{
+               Buffers: [][]byte{b},
+               OOB:     NewControlMessage(c.rawOpt.cflags),
+       }
+       c.rawOpt.RUnlock()
+       if err := c.RecvMsg(&m, 0); err != nil {
+               return nil, nil, nil, &net.OpError{Op: "read", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Err: err}
+       }
+       var hs []byte
+       if hs, p, err = slicePacket(b[:m.N]); err != nil {
+               return nil, nil, nil, &net.OpError{Op: "read", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Err: err}
+       }
+       if h, err = ParseHeader(hs); err != nil {
+               return nil, nil, nil, &net.OpError{Op: "read", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Err: err}
+       }
+       if m.NN > 0 {
+               cm = new(ControlMessage)
+               if err := cm.Parse(m.OOB[:m.NN]); err != nil {
+                       return nil, nil, nil, &net.OpError{Op: "read", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Err: err}
+               }
+       }
+       if src, ok := m.Addr.(*net.IPAddr); ok && cm != nil {
+               cm.Src = src.IP
+       }
+       return
+}
+
+func (c *packetHandler) writeTo(h *Header, p []byte, cm *ControlMessage) error {
+       m := socket.Message{
+               OOB: cm.Marshal(),
+       }
+       wh, err := h.Marshal()
+       if err != nil {
+               return err
+       }
+       m.Buffers = [][]byte{wh, p}
+       dst := new(net.IPAddr)
+       if cm != nil {
+               if ip := cm.Dst.To4(); ip != nil {
+                       dst.IP = ip
+               }
+       }
+       if dst.IP == nil {
+               dst.IP = h.Dst
+       }
+       m.Addr = dst
+       if err := c.SendMsg(&m, 0); err != nil {
+               return &net.OpError{Op: "write", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Addr: opAddr(dst), Err: err}
+       }
+       return nil
+}
diff --git a/vendor/golang.org/x/net/ipv4/payload_cmsg_go1_8.go b/vendor/golang.org/x/net/ipv4/payload_cmsg_go1_8.go
new file mode 100644 (file)
index 0000000..d26ccd9
--- /dev/null
@@ -0,0 +1,59 @@
+// Copyright 2012 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !go1.9
+// +build !nacl,!plan9,!windows
+
+package ipv4
+
+import "net"
+
+func (c *payloadHandler) readFrom(b []byte) (n int, cm *ControlMessage, src net.Addr, err error) {
+       c.rawOpt.RLock()
+       oob := NewControlMessage(c.rawOpt.cflags)
+       c.rawOpt.RUnlock()
+       var nn int
+       switch c := c.PacketConn.(type) {
+       case *net.UDPConn:
+               if n, nn, _, src, err = c.ReadMsgUDP(b, oob); err != nil {
+                       return 0, nil, nil, err
+               }
+       case *net.IPConn:
+               nb := make([]byte, maxHeaderLen+len(b))
+               if n, nn, _, src, err = c.ReadMsgIP(nb, oob); err != nil {
+                       return 0, nil, nil, err
+               }
+               hdrlen := int(nb[0]&0x0f) << 2
+               copy(b, nb[hdrlen:])
+               n -= hdrlen
+       default:
+               return 0, nil, nil, &net.OpError{Op: "read", Net: c.LocalAddr().Network(), Source: c.LocalAddr(), Err: errInvalidConnType}
+       }
+       if nn > 0 {
+               cm = new(ControlMessage)
+               if err = cm.Parse(oob[:nn]); err != nil {
+                       return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err}
+               }
+       }
+       if cm != nil {
+               cm.Src = netAddrToIP4(src)
+       }
+       return
+}
+
+func (c *payloadHandler) writeTo(b []byte, cm *ControlMessage, dst net.Addr) (n int, err error) {
+       oob := cm.Marshal()
+       if dst == nil {
+               return 0, &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: errMissingAddress}
+       }
+       switch c := c.PacketConn.(type) {
+       case *net.UDPConn:
+               n, _, err = c.WriteMsgUDP(b, oob, dst.(*net.UDPAddr))
+       case *net.IPConn:
+               n, _, err = c.WriteMsgIP(b, oob, dst.(*net.IPAddr))
+       default:
+               return 0, &net.OpError{Op: "write", Net: c.LocalAddr().Network(), Source: c.LocalAddr(), Addr: opAddr(dst), Err: errInvalidConnType}
+       }
+       return
+}
diff --git a/vendor/golang.org/x/net/ipv4/payload_cmsg_go1_9.go b/vendor/golang.org/x/net/ipv4/payload_cmsg_go1_9.go
new file mode 100644 (file)
index 0000000..2f19311
--- /dev/null
@@ -0,0 +1,67 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build go1.9
+// +build !nacl,!plan9,!windows
+
+package ipv4
+
+import (
+       "net"
+
+       "golang.org/x/net/internal/socket"
+)
+
+func (c *payloadHandler) readFrom(b []byte) (int, *ControlMessage, net.Addr, error) {
+       c.rawOpt.RLock()
+       m := socket.Message{
+               OOB: NewControlMessage(c.rawOpt.cflags),
+       }
+       c.rawOpt.RUnlock()
+       switch c.PacketConn.(type) {
+       case *net.UDPConn:
+               m.Buffers = [][]byte{b}
+               if err := c.RecvMsg(&m, 0); err != nil {
+                       return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err}
+               }
+       case *net.IPConn:
+               h := make([]byte, HeaderLen)
+               m.Buffers = [][]byte{h, b}
+               if err := c.RecvMsg(&m, 0); err != nil {
+                       return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err}
+               }
+               hdrlen := int(h[0]&0x0f) << 2
+               if hdrlen > len(h) {
+                       d := hdrlen - len(h)
+                       copy(b, b[d:])
+                       m.N -= d
+               } else {
+                       m.N -= hdrlen
+               }
+       default:
+               return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: errInvalidConnType}
+       }
+       var cm *ControlMessage
+       if m.NN > 0 {
+               cm = new(ControlMessage)
+               if err := cm.Parse(m.OOB[:m.NN]); err != nil {
+                       return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err}
+               }
+               cm.Src = netAddrToIP4(m.Addr)
+       }
+       return m.N, cm, m.Addr, nil
+}
+
+func (c *payloadHandler) writeTo(b []byte, cm *ControlMessage, dst net.Addr) (int, error) {
+       m := socket.Message{
+               Buffers: [][]byte{b},
+               OOB:     cm.Marshal(),
+               Addr:    dst,
+       }
+       err := c.SendMsg(&m, 0)
+       if err != nil {
+               err = &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Addr: opAddr(dst), Err: err}
+       }
+       return m.N, err
+}
diff --git a/vendor/golang.org/x/net/ipv4/sockopt_posix.go b/vendor/golang.org/x/net/ipv4/sockopt_posix.go
new file mode 100644 (file)
index 0000000..e96955b
--- /dev/null
@@ -0,0 +1,71 @@
+// Copyright 2012 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows
+
+package ipv4
+
+import (
+       "net"
+       "unsafe"
+
+       "golang.org/x/net/bpf"
+       "golang.org/x/net/internal/socket"
+)
+
+func (so *sockOpt) getMulticastInterface(c *socket.Conn) (*net.Interface, error) {
+       switch so.typ {
+       case ssoTypeIPMreqn:
+               return so.getIPMreqn(c)
+       default:
+               return so.getMulticastIf(c)
+       }
+}
+
+func (so *sockOpt) setMulticastInterface(c *socket.Conn, ifi *net.Interface) error {
+       switch so.typ {
+       case ssoTypeIPMreqn:
+               return so.setIPMreqn(c, ifi, nil)
+       default:
+               return so.setMulticastIf(c, ifi)
+       }
+}
+
+func (so *sockOpt) getICMPFilter(c *socket.Conn) (*ICMPFilter, error) {
+       b := make([]byte, so.Len)
+       n, err := so.Get(c, b)
+       if err != nil {
+               return nil, err
+       }
+       if n != sizeofICMPFilter {
+               return nil, errOpNoSupport
+       }
+       return (*ICMPFilter)(unsafe.Pointer(&b[0])), nil
+}
+
+func (so *sockOpt) setICMPFilter(c *socket.Conn, f *ICMPFilter) error {
+       b := (*[sizeofICMPFilter]byte)(unsafe.Pointer(f))[:sizeofICMPFilter]
+       return so.Set(c, b)
+}
+
+func (so *sockOpt) setGroup(c *socket.Conn, ifi *net.Interface, grp net.IP) error {
+       switch so.typ {
+       case ssoTypeIPMreq:
+               return so.setIPMreq(c, ifi, grp)
+       case ssoTypeIPMreqn:
+               return so.setIPMreqn(c, ifi, grp)
+       case ssoTypeGroupReq:
+               return so.setGroupReq(c, ifi, grp)
+       default:
+               return errOpNoSupport
+       }
+}
+
+func (so *sockOpt) setSourceGroup(c *socket.Conn, ifi *net.Interface, grp, src net.IP) error {
+       return so.setGroupSourceReq(c, ifi, grp, src)
+}
+
+func (so *sockOpt) setBPF(c *socket.Conn, f []bpf.RawInstruction) error {
+       return so.setAttachFilter(c, f)
+}
diff --git a/vendor/golang.org/x/net/ipv4/sys_asmreq.go b/vendor/golang.org/x/net/ipv4/sys_asmreq.go
new file mode 100644 (file)
index 0000000..0388cba
--- /dev/null
@@ -0,0 +1,119 @@
+// Copyright 2012 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin dragonfly freebsd netbsd openbsd solaris windows
+
+package ipv4
+
+import (
+       "net"
+       "unsafe"
+
+       "golang.org/x/net/internal/socket"
+)
+
+func (so *sockOpt) setIPMreq(c *socket.Conn, ifi *net.Interface, grp net.IP) error {
+       mreq := ipMreq{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3]}}
+       if err := setIPMreqInterface(&mreq, ifi); err != nil {
+               return err
+       }
+       b := (*[sizeofIPMreq]byte)(unsafe.Pointer(&mreq))[:sizeofIPMreq]
+       return so.Set(c, b)
+}
+
+func (so *sockOpt) getMulticastIf(c *socket.Conn) (*net.Interface, error) {
+       var b [4]byte
+       if _, err := so.Get(c, b[:]); err != nil {
+               return nil, err
+       }
+       ifi, err := netIP4ToInterface(net.IPv4(b[0], b[1], b[2], b[3]))
+       if err != nil {
+               return nil, err
+       }
+       return ifi, nil
+}
+
+func (so *sockOpt) setMulticastIf(c *socket.Conn, ifi *net.Interface) error {
+       ip, err := netInterfaceToIP4(ifi)
+       if err != nil {
+               return err
+       }
+       var b [4]byte
+       copy(b[:], ip)
+       return so.Set(c, b[:])
+}
+
+func setIPMreqInterface(mreq *ipMreq, ifi *net.Interface) error {
+       if ifi == nil {
+               return nil
+       }
+       ifat, err := ifi.Addrs()
+       if err != nil {
+               return err
+       }
+       for _, ifa := range ifat {
+               switch ifa := ifa.(type) {
+               case *net.IPAddr:
+                       if ip := ifa.IP.To4(); ip != nil {
+                               copy(mreq.Interface[:], ip)
+                               return nil
+                       }
+               case *net.IPNet:
+                       if ip := ifa.IP.To4(); ip != nil {
+                               copy(mreq.Interface[:], ip)
+                               return nil
+                       }
+               }
+       }
+       return errNoSuchInterface
+}
+
+func netIP4ToInterface(ip net.IP) (*net.Interface, error) {
+       ift, err := net.Interfaces()
+       if err != nil {
+               return nil, err
+       }
+       for _, ifi := range ift {
+               ifat, err := ifi.Addrs()
+               if err != nil {
+                       return nil, err
+               }
+               for _, ifa := range ifat {
+                       switch ifa := ifa.(type) {
+                       case *net.IPAddr:
+                               if ip.Equal(ifa.IP) {
+                                       return &ifi, nil
+                               }
+                       case *net.IPNet:
+                               if ip.Equal(ifa.IP) {
+                                       return &ifi, nil
+                               }
+                       }
+               }
+       }
+       return nil, errNoSuchInterface
+}
+
+func netInterfaceToIP4(ifi *net.Interface) (net.IP, error) {
+       if ifi == nil {
+               return net.IPv4zero.To4(), nil
+       }
+       ifat, err := ifi.Addrs()
+       if err != nil {
+               return nil, err
+       }
+       for _, ifa := range ifat {
+               switch ifa := ifa.(type) {
+               case *net.IPAddr:
+                       if ip := ifa.IP.To4(); ip != nil {
+                               return ip, nil
+                       }
+               case *net.IPNet:
+                       if ip := ifa.IP.To4(); ip != nil {
+                               return ip, nil
+                       }
+               }
+       }
+       return nil, errNoSuchInterface
+}
diff --git a/vendor/golang.org/x/net/ipv4/sys_asmreq_stub.go b/vendor/golang.org/x/net/ipv4/sys_asmreq_stub.go
new file mode 100644 (file)
index 0000000..f391920
--- /dev/null
@@ -0,0 +1,25 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !darwin,!dragonfly,!freebsd,!netbsd,!openbsd,!solaris,!windows
+
+package ipv4
+
+import (
+       "net"
+
+       "golang.org/x/net/internal/socket"
+)
+
+func (so *sockOpt) setIPMreq(c *socket.Conn, ifi *net.Interface, grp net.IP) error {
+       return errOpNoSupport
+}
+
+func (so *sockOpt) getMulticastIf(c *socket.Conn) (*net.Interface, error) {
+       return nil, errOpNoSupport
+}
+
+func (so *sockOpt) setMulticastIf(c *socket.Conn, ifi *net.Interface) error {
+       return errOpNoSupport
+}
diff --git a/vendor/golang.org/x/net/ipv4/sys_asmreqn.go b/vendor/golang.org/x/net/ipv4/sys_asmreqn.go
new file mode 100644 (file)
index 0000000..1f24f69
--- /dev/null
@@ -0,0 +1,42 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin freebsd linux
+
+package ipv4
+
+import (
+       "net"
+       "unsafe"
+
+       "golang.org/x/net/internal/socket"
+)
+
+func (so *sockOpt) getIPMreqn(c *socket.Conn) (*net.Interface, error) {
+       b := make([]byte, so.Len)
+       if _, err := so.Get(c, b); err != nil {
+               return nil, err
+       }
+       mreqn := (*ipMreqn)(unsafe.Pointer(&b[0]))
+       if mreqn.Ifindex == 0 {
+               return nil, nil
+       }
+       ifi, err := net.InterfaceByIndex(int(mreqn.Ifindex))
+       if err != nil {
+               return nil, err
+       }
+       return ifi, nil
+}
+
+func (so *sockOpt) setIPMreqn(c *socket.Conn, ifi *net.Interface, grp net.IP) error {
+       var mreqn ipMreqn
+       if ifi != nil {
+               mreqn.Ifindex = int32(ifi.Index)
+       }
+       if grp != nil {
+               mreqn.Multiaddr = [4]byte{grp[0], grp[1], grp[2], grp[3]}
+       }
+       b := (*[sizeofIPMreqn]byte)(unsafe.Pointer(&mreqn))[:sizeofIPMreqn]
+       return so.Set(c, b)
+}
diff --git a/vendor/golang.org/x/net/ipv4/sys_asmreqn_stub.go b/vendor/golang.org/x/net/ipv4/sys_asmreqn_stub.go
new file mode 100644 (file)
index 0000000..0711d3d
--- /dev/null
@@ -0,0 +1,21 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !darwin,!freebsd,!linux
+
+package ipv4
+
+import (
+       "net"
+
+       "golang.org/x/net/internal/socket"
+)
+
+func (so *sockOpt) getIPMreqn(c *socket.Conn) (*net.Interface, error) {
+       return nil, errOpNoSupport
+}
+
+func (so *sockOpt) setIPMreqn(c *socket.Conn, ifi *net.Interface, grp net.IP) error {
+       return errOpNoSupport
+}
diff --git a/vendor/golang.org/x/net/ipv4/sys_bpf.go b/vendor/golang.org/x/net/ipv4/sys_bpf.go
new file mode 100644 (file)
index 0000000..9f30b73
--- /dev/null
@@ -0,0 +1,23 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build linux
+
+package ipv4
+
+import (
+       "unsafe"
+
+       "golang.org/x/net/bpf"
+       "golang.org/x/net/internal/socket"
+)
+
+func (so *sockOpt) setAttachFilter(c *socket.Conn, f []bpf.RawInstruction) error {
+       prog := sockFProg{
+               Len:    uint16(len(f)),
+               Filter: (*sockFilter)(unsafe.Pointer(&f[0])),
+       }
+       b := (*[sizeofSockFprog]byte)(unsafe.Pointer(&prog))[:sizeofSockFprog]
+       return so.Set(c, b)
+}
diff --git a/vendor/golang.org/x/net/ipv4/sys_bpf_stub.go b/vendor/golang.org/x/net/ipv4/sys_bpf_stub.go
new file mode 100644 (file)
index 0000000..9a21320
--- /dev/null
@@ -0,0 +1,16 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !linux
+
+package ipv4
+
+import (
+       "golang.org/x/net/bpf"
+       "golang.org/x/net/internal/socket"
+)
+
+func (so *sockOpt) setAttachFilter(c *socket.Conn, f []bpf.RawInstruction) error {
+       return errOpNoSupport
+}
diff --git a/vendor/golang.org/x/net/ipv4/sys_dragonfly.go b/vendor/golang.org/x/net/ipv4/sys_dragonfly.go
new file mode 100644 (file)
index 0000000..859764f
--- /dev/null
@@ -0,0 +1,35 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package ipv4
+
+import (
+       "net"
+       "syscall"
+
+       "golang.org/x/net/internal/iana"
+       "golang.org/x/net/internal/socket"
+)
+
+var (
+       ctlOpts = [ctlMax]ctlOpt{
+               ctlTTL:       {sysIP_RECVTTL, 1, marshalTTL, parseTTL},
+               ctlDst:       {sysIP_RECVDSTADDR, net.IPv4len, marshalDst, parseDst},
+               ctlInterface: {sysIP_RECVIF, syscall.SizeofSockaddrDatalink, marshalInterface, parseInterface},
+       }
+
+       sockOpts = map[int]*sockOpt{
+               ssoTOS:                {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TOS, Len: 4}},
+               ssoTTL:                {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TTL, Len: 4}},
+               ssoMulticastTTL:       {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_TTL, Len: 1}},
+               ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_IF, Len: 4}},
+               ssoMulticastLoopback:  {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_LOOP, Len: 4}},
+               ssoReceiveTTL:         {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVTTL, Len: 4}},
+               ssoReceiveDst:         {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVDSTADDR, Len: 4}},
+               ssoReceiveInterface:   {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVIF, Len: 4}},
+               ssoHeaderPrepend:      {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_HDRINCL, Len: 4}},
+               ssoJoinGroup:          {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_ADD_MEMBERSHIP, Len: sizeofIPMreq}, typ: ssoTypeIPMreq},
+               ssoLeaveGroup:         {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_DROP_MEMBERSHIP, Len: sizeofIPMreq}, typ: ssoTypeIPMreq},
+       }
+)
diff --git a/vendor/golang.org/x/net/ipv4/sys_solaris.go b/vendor/golang.org/x/net/ipv4/sys_solaris.go
new file mode 100644 (file)
index 0000000..832fef1
--- /dev/null
@@ -0,0 +1,57 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package ipv4
+
+import (
+       "net"
+       "syscall"
+       "unsafe"
+
+       "golang.org/x/net/internal/iana"
+       "golang.org/x/net/internal/socket"
+)
+
+var (
+       ctlOpts = [ctlMax]ctlOpt{
+               ctlTTL:        {sysIP_RECVTTL, 4, marshalTTL, parseTTL},
+               ctlPacketInfo: {sysIP_PKTINFO, sizeofInetPktinfo, marshalPacketInfo, parsePacketInfo},
+       }
+
+       sockOpts = map[int]sockOpt{
+               ssoTOS:                {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TOS, Len: 4}},
+               ssoTTL:                {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TTL, Len: 4}},
+               ssoMulticastTTL:       {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_TTL, Len: 1}},
+               ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_IF, Len: 4}},
+               ssoMulticastLoopback:  {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_LOOP, Len: 1}},
+               ssoReceiveTTL:         {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVTTL, Len: 4}},
+               ssoPacketInfo:         {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVPKTINFO, Len: 4}},
+               ssoHeaderPrepend:      {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_HDRINCL, Len: 4}},
+               ssoJoinGroup:          {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_JOIN_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq},
+               ssoLeaveGroup:         {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_LEAVE_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq},
+               ssoJoinSourceGroup:    {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_JOIN_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq},
+               ssoLeaveSourceGroup:   {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_LEAVE_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq},
+               ssoBlockSourceGroup:   {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_BLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq},
+               ssoUnblockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_UNBLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq},
+       }
+)
+
+func (pi *inetPktinfo) setIfindex(i int) {
+       pi.Ifindex = uint32(i)
+}
+
+func (gr *groupReq) setGroup(grp net.IP) {
+       sa := (*sockaddrInet)(unsafe.Pointer(uintptr(unsafe.Pointer(gr)) + 4))
+       sa.Family = syscall.AF_INET
+       copy(sa.Addr[:], grp)
+}
+
+func (gsr *groupSourceReq) setSourceGroup(grp, src net.IP) {
+       sa := (*sockaddrInet)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 4))
+       sa.Family = syscall.AF_INET
+       copy(sa.Addr[:], grp)
+       sa = (*sockaddrInet)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 260))
+       sa.Family = syscall.AF_INET
+       copy(sa.Addr[:], src)
+}
diff --git a/vendor/golang.org/x/net/ipv4/sys_ssmreq.go b/vendor/golang.org/x/net/ipv4/sys_ssmreq.go
new file mode 100644 (file)
index 0000000..ae5704e
--- /dev/null
@@ -0,0 +1,54 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin freebsd linux solaris
+
+package ipv4
+
+import (
+       "net"
+       "unsafe"
+
+       "golang.org/x/net/internal/socket"
+)
+
+var freebsd32o64 bool
+
+func (so *sockOpt) setGroupReq(c *socket.Conn, ifi *net.Interface, grp net.IP) error {
+       var gr groupReq
+       if ifi != nil {
+               gr.Interface = uint32(ifi.Index)
+       }
+       gr.setGroup(grp)
+       var b []byte
+       if freebsd32o64 {
+               var d [sizeofGroupReq + 4]byte
+               s := (*[sizeofGroupReq]byte)(unsafe.Pointer(&gr))
+               copy(d[:4], s[:4])
+               copy(d[8:], s[4:])
+               b = d[:]
+       } else {
+               b = (*[sizeofGroupReq]byte)(unsafe.Pointer(&gr))[:sizeofGroupReq]
+       }
+       return so.Set(c, b)
+}
+
+func (so *sockOpt) setGroupSourceReq(c *socket.Conn, ifi *net.Interface, grp, src net.IP) error {
+       var gsr groupSourceReq
+       if ifi != nil {
+               gsr.Interface = uint32(ifi.Index)
+       }
+       gsr.setSourceGroup(grp, src)
+       var b []byte
+       if freebsd32o64 {
+               var d [sizeofGroupSourceReq + 4]byte
+               s := (*[sizeofGroupSourceReq]byte)(unsafe.Pointer(&gsr))
+               copy(d[:4], s[:4])
+               copy(d[8:], s[4:])
+               b = d[:]
+       } else {
+               b = (*[sizeofGroupSourceReq]byte)(unsafe.Pointer(&gsr))[:sizeofGroupSourceReq]
+       }
+       return so.Set(c, b)
+}
diff --git a/vendor/golang.org/x/net/ipv4/sys_ssmreq_stub.go b/vendor/golang.org/x/net/ipv4/sys_ssmreq_stub.go
new file mode 100644 (file)
index 0000000..e6b7623
--- /dev/null
@@ -0,0 +1,21 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !darwin,!freebsd,!linux,!solaris
+
+package ipv4
+
+import (
+       "net"
+
+       "golang.org/x/net/internal/socket"
+)
+
+func (so *sockOpt) setGroupReq(c *socket.Conn, ifi *net.Interface, grp net.IP) error {
+       return errOpNoSupport
+}
+
+func (so *sockOpt) setGroupSourceReq(c *socket.Conn, ifi *net.Interface, grp, src net.IP) error {
+       return errOpNoSupport
+}
diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_mips.go b/vendor/golang.org/x/net/ipv4/zsys_linux_mips.go
new file mode 100644 (file)
index 0000000..c0260f0
--- /dev/null
@@ -0,0 +1,148 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_linux.go
+
+package ipv4
+
+const (
+       sysIP_TOS             = 0x1
+       sysIP_TTL             = 0x2
+       sysIP_HDRINCL         = 0x3
+       sysIP_OPTIONS         = 0x4
+       sysIP_ROUTER_ALERT    = 0x5
+       sysIP_RECVOPTS        = 0x6
+       sysIP_RETOPTS         = 0x7
+       sysIP_PKTINFO         = 0x8
+       sysIP_PKTOPTIONS      = 0x9
+       sysIP_MTU_DISCOVER    = 0xa
+       sysIP_RECVERR         = 0xb
+       sysIP_RECVTTL         = 0xc
+       sysIP_RECVTOS         = 0xd
+       sysIP_MTU             = 0xe
+       sysIP_FREEBIND        = 0xf
+       sysIP_TRANSPARENT     = 0x13
+       sysIP_RECVRETOPTS     = 0x7
+       sysIP_ORIGDSTADDR     = 0x14
+       sysIP_RECVORIGDSTADDR = 0x14
+       sysIP_MINTTL          = 0x15
+       sysIP_NODEFRAG        = 0x16
+       sysIP_UNICAST_IF      = 0x32
+
+       sysIP_MULTICAST_IF           = 0x20
+       sysIP_MULTICAST_TTL          = 0x21
+       sysIP_MULTICAST_LOOP         = 0x22
+       sysIP_ADD_MEMBERSHIP         = 0x23
+       sysIP_DROP_MEMBERSHIP        = 0x24
+       sysIP_UNBLOCK_SOURCE         = 0x25
+       sysIP_BLOCK_SOURCE           = 0x26
+       sysIP_ADD_SOURCE_MEMBERSHIP  = 0x27
+       sysIP_DROP_SOURCE_MEMBERSHIP = 0x28
+       sysIP_MSFILTER               = 0x29
+       sysMCAST_JOIN_GROUP          = 0x2a
+       sysMCAST_LEAVE_GROUP         = 0x2d
+       sysMCAST_JOIN_SOURCE_GROUP   = 0x2e
+       sysMCAST_LEAVE_SOURCE_GROUP  = 0x2f
+       sysMCAST_BLOCK_SOURCE        = 0x2b
+       sysMCAST_UNBLOCK_SOURCE      = 0x2c
+       sysMCAST_MSFILTER            = 0x30
+       sysIP_MULTICAST_ALL          = 0x31
+
+       sysICMP_FILTER = 0x1
+
+       sysSO_EE_ORIGIN_NONE         = 0x0
+       sysSO_EE_ORIGIN_LOCAL        = 0x1
+       sysSO_EE_ORIGIN_ICMP         = 0x2
+       sysSO_EE_ORIGIN_ICMP6        = 0x3
+       sysSO_EE_ORIGIN_TXSTATUS     = 0x4
+       sysSO_EE_ORIGIN_TIMESTAMPING = 0x4
+
+       sysSOL_SOCKET       = 0x1
+       sysSO_ATTACH_FILTER = 0x1a
+
+       sizeofKernelSockaddrStorage = 0x80
+       sizeofSockaddrInet          = 0x10
+       sizeofInetPktinfo           = 0xc
+       sizeofSockExtendedErr       = 0x10
+
+       sizeofIPMreq         = 0x8
+       sizeofIPMreqn        = 0xc
+       sizeofIPMreqSource   = 0xc
+       sizeofGroupReq       = 0x84
+       sizeofGroupSourceReq = 0x104
+
+       sizeofICMPFilter = 0x4
+
+       sizeofSockFprog = 0x8
+)
+
+type kernelSockaddrStorage struct {
+       Family  uint16
+       X__data [126]int8
+}
+
+type sockaddrInet struct {
+       Family uint16
+       Port   uint16
+       Addr   [4]byte /* in_addr */
+       X__pad [8]uint8
+}
+
+type inetPktinfo struct {
+       Ifindex  int32
+       Spec_dst [4]byte /* in_addr */
+       Addr     [4]byte /* in_addr */
+}
+
+type sockExtendedErr struct {
+       Errno  uint32
+       Origin uint8
+       Type   uint8
+       Code   uint8
+       Pad    uint8
+       Info   uint32
+       Data   uint32
+}
+
+type ipMreq struct {
+       Multiaddr [4]byte /* in_addr */
+       Interface [4]byte /* in_addr */
+}
+
+type ipMreqn struct {
+       Multiaddr [4]byte /* in_addr */
+       Address   [4]byte /* in_addr */
+       Ifindex   int32
+}
+
+type ipMreqSource struct {
+       Multiaddr  uint32
+       Interface  uint32
+       Sourceaddr uint32
+}
+
+type groupReq struct {
+       Interface uint32
+       Group     kernelSockaddrStorage
+}
+
+type groupSourceReq struct {
+       Interface uint32
+       Group     kernelSockaddrStorage
+       Source    kernelSockaddrStorage
+}
+
+type icmpFilter struct {
+       Data uint32
+}
+
+type sockFProg struct {
+       Len       uint16
+       Pad_cgo_0 [2]byte
+       Filter    *sockFilter
+}
+
+type sockFilter struct {
+       Code uint16
+       Jt   uint8
+       Jf   uint8
+       K    uint32
+}
diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_mipsle.go b/vendor/golang.org/x/net/ipv4/zsys_linux_mipsle.go
new file mode 100644 (file)
index 0000000..c0260f0
--- /dev/null
@@ -0,0 +1,148 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_linux.go
+
+package ipv4
+
+const (
+       sysIP_TOS             = 0x1
+       sysIP_TTL             = 0x2
+       sysIP_HDRINCL         = 0x3
+       sysIP_OPTIONS         = 0x4
+       sysIP_ROUTER_ALERT    = 0x5
+       sysIP_RECVOPTS        = 0x6
+       sysIP_RETOPTS         = 0x7
+       sysIP_PKTINFO         = 0x8
+       sysIP_PKTOPTIONS      = 0x9
+       sysIP_MTU_DISCOVER    = 0xa
+       sysIP_RECVERR         = 0xb
+       sysIP_RECVTTL         = 0xc
+       sysIP_RECVTOS         = 0xd
+       sysIP_MTU             = 0xe
+       sysIP_FREEBIND        = 0xf
+       sysIP_TRANSPARENT     = 0x13
+       sysIP_RECVRETOPTS     = 0x7
+       sysIP_ORIGDSTADDR     = 0x14
+       sysIP_RECVORIGDSTADDR = 0x14
+       sysIP_MINTTL          = 0x15
+       sysIP_NODEFRAG        = 0x16
+       sysIP_UNICAST_IF      = 0x32
+
+       sysIP_MULTICAST_IF           = 0x20
+       sysIP_MULTICAST_TTL          = 0x21
+       sysIP_MULTICAST_LOOP         = 0x22
+       sysIP_ADD_MEMBERSHIP         = 0x23
+       sysIP_DROP_MEMBERSHIP        = 0x24
+       sysIP_UNBLOCK_SOURCE         = 0x25
+       sysIP_BLOCK_SOURCE           = 0x26
+       sysIP_ADD_SOURCE_MEMBERSHIP  = 0x27
+       sysIP_DROP_SOURCE_MEMBERSHIP = 0x28
+       sysIP_MSFILTER               = 0x29
+       sysMCAST_JOIN_GROUP          = 0x2a
+       sysMCAST_LEAVE_GROUP         = 0x2d
+       sysMCAST_JOIN_SOURCE_GROUP   = 0x2e
+       sysMCAST_LEAVE_SOURCE_GROUP  = 0x2f
+       sysMCAST_BLOCK_SOURCE        = 0x2b
+       sysMCAST_UNBLOCK_SOURCE      = 0x2c
+       sysMCAST_MSFILTER            = 0x30
+       sysIP_MULTICAST_ALL          = 0x31
+
+       sysICMP_FILTER = 0x1
+
+       sysSO_EE_ORIGIN_NONE         = 0x0
+       sysSO_EE_ORIGIN_LOCAL        = 0x1
+       sysSO_EE_ORIGIN_ICMP         = 0x2
+       sysSO_EE_ORIGIN_ICMP6        = 0x3
+       sysSO_EE_ORIGIN_TXSTATUS     = 0x4
+       sysSO_EE_ORIGIN_TIMESTAMPING = 0x4
+
+       sysSOL_SOCKET       = 0x1
+       sysSO_ATTACH_FILTER = 0x1a
+
+       sizeofKernelSockaddrStorage = 0x80
+       sizeofSockaddrInet          = 0x10
+       sizeofInetPktinfo           = 0xc
+       sizeofSockExtendedErr       = 0x10
+
+       sizeofIPMreq         = 0x8
+       sizeofIPMreqn        = 0xc
+       sizeofIPMreqSource   = 0xc
+       sizeofGroupReq       = 0x84
+       sizeofGroupSourceReq = 0x104
+
+       sizeofICMPFilter = 0x4
+
+       sizeofSockFprog = 0x8
+)
+
+type kernelSockaddrStorage struct {
+       Family  uint16
+       X__data [126]int8
+}
+
+type sockaddrInet struct {
+       Family uint16
+       Port   uint16
+       Addr   [4]byte /* in_addr */
+       X__pad [8]uint8
+}
+
+type inetPktinfo struct {
+       Ifindex  int32
+       Spec_dst [4]byte /* in_addr */
+       Addr     [4]byte /* in_addr */
+}
+
+type sockExtendedErr struct {
+       Errno  uint32
+       Origin uint8
+       Type   uint8
+       Code   uint8
+       Pad    uint8
+       Info   uint32
+       Data   uint32
+}
+
+type ipMreq struct {
+       Multiaddr [4]byte /* in_addr */
+       Interface [4]byte /* in_addr */
+}
+
+type ipMreqn struct {
+       Multiaddr [4]byte /* in_addr */
+       Address   [4]byte /* in_addr */
+       Ifindex   int32
+}
+
+type ipMreqSource struct {
+       Multiaddr  uint32
+       Interface  uint32
+       Sourceaddr uint32
+}
+
+type groupReq struct {
+       Interface uint32
+       Group     kernelSockaddrStorage
+}
+
+type groupSourceReq struct {
+       Interface uint32
+       Group     kernelSockaddrStorage
+       Source    kernelSockaddrStorage
+}
+
+type icmpFilter struct {
+       Data uint32
+}
+
+type sockFProg struct {
+       Len       uint16
+       Pad_cgo_0 [2]byte
+       Filter    *sockFilter
+}
+
+type sockFilter struct {
+       Code uint16
+       Jt   uint8
+       Jf   uint8
+       K    uint32
+}
diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_ppc.go b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc.go
new file mode 100644 (file)
index 0000000..f65bd9a
--- /dev/null
@@ -0,0 +1,148 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_linux.go
+
+package ipv4
+
+const (
+       sysIP_TOS             = 0x1
+       sysIP_TTL             = 0x2
+       sysIP_HDRINCL         = 0x3
+       sysIP_OPTIONS         = 0x4
+       sysIP_ROUTER_ALERT    = 0x5
+       sysIP_RECVOPTS        = 0x6
+       sysIP_RETOPTS         = 0x7
+       sysIP_PKTINFO         = 0x8
+       sysIP_PKTOPTIONS      = 0x9
+       sysIP_MTU_DISCOVER    = 0xa
+       sysIP_RECVERR         = 0xb
+       sysIP_RECVTTL         = 0xc
+       sysIP_RECVTOS         = 0xd
+       sysIP_MTU             = 0xe
+       sysIP_FREEBIND        = 0xf
+       sysIP_TRANSPARENT     = 0x13
+       sysIP_RECVRETOPTS     = 0x7
+       sysIP_ORIGDSTADDR     = 0x14
+       sysIP_RECVORIGDSTADDR = 0x14
+       sysIP_MINTTL          = 0x15
+       sysIP_NODEFRAG        = 0x16
+       sysIP_UNICAST_IF      = 0x32
+
+       sysIP_MULTICAST_IF           = 0x20
+       sysIP_MULTICAST_TTL          = 0x21
+       sysIP_MULTICAST_LOOP         = 0x22
+       sysIP_ADD_MEMBERSHIP         = 0x23
+       sysIP_DROP_MEMBERSHIP        = 0x24
+       sysIP_UNBLOCK_SOURCE         = 0x25
+       sysIP_BLOCK_SOURCE           = 0x26
+       sysIP_ADD_SOURCE_MEMBERSHIP  = 0x27
+       sysIP_DROP_SOURCE_MEMBERSHIP = 0x28
+       sysIP_MSFILTER               = 0x29
+       sysMCAST_JOIN_GROUP          = 0x2a
+       sysMCAST_LEAVE_GROUP         = 0x2d
+       sysMCAST_JOIN_SOURCE_GROUP   = 0x2e
+       sysMCAST_LEAVE_SOURCE_GROUP  = 0x2f
+       sysMCAST_BLOCK_SOURCE        = 0x2b
+       sysMCAST_UNBLOCK_SOURCE      = 0x2c
+       sysMCAST_MSFILTER            = 0x30
+       sysIP_MULTICAST_ALL          = 0x31
+
+       sysICMP_FILTER = 0x1
+
+       sysSO_EE_ORIGIN_NONE         = 0x0
+       sysSO_EE_ORIGIN_LOCAL        = 0x1
+       sysSO_EE_ORIGIN_ICMP         = 0x2
+       sysSO_EE_ORIGIN_ICMP6        = 0x3
+       sysSO_EE_ORIGIN_TXSTATUS     = 0x4
+       sysSO_EE_ORIGIN_TIMESTAMPING = 0x4
+
+       sysSOL_SOCKET       = 0x1
+       sysSO_ATTACH_FILTER = 0x1a
+
+       sizeofKernelSockaddrStorage = 0x80
+       sizeofSockaddrInet          = 0x10
+       sizeofInetPktinfo           = 0xc
+       sizeofSockExtendedErr       = 0x10
+
+       sizeofIPMreq         = 0x8
+       sizeofIPMreqn        = 0xc
+       sizeofIPMreqSource   = 0xc
+       sizeofGroupReq       = 0x84
+       sizeofGroupSourceReq = 0x104
+
+       sizeofICMPFilter = 0x4
+
+       sizeofSockFprog = 0x8
+)
+
+type kernelSockaddrStorage struct {
+       Family  uint16
+       X__data [126]uint8
+}
+
+type sockaddrInet struct {
+       Family uint16
+       Port   uint16
+       Addr   [4]byte /* in_addr */
+       X__pad [8]uint8
+}
+
+type inetPktinfo struct {
+       Ifindex  int32
+       Spec_dst [4]byte /* in_addr */
+       Addr     [4]byte /* in_addr */
+}
+
+type sockExtendedErr struct {
+       Errno  uint32
+       Origin uint8
+       Type   uint8
+       Code   uint8
+       Pad    uint8
+       Info   uint32
+       Data   uint32
+}
+
+type ipMreq struct {
+       Multiaddr [4]byte /* in_addr */
+       Interface [4]byte /* in_addr */
+}
+
+type ipMreqn struct {
+       Multiaddr [4]byte /* in_addr */
+       Address   [4]byte /* in_addr */
+       Ifindex   int32
+}
+
+type ipMreqSource struct {
+       Multiaddr  uint32
+       Interface  uint32
+       Sourceaddr uint32
+}
+
+type groupReq struct {
+       Interface uint32
+       Group     kernelSockaddrStorage
+}
+
+type groupSourceReq struct {
+       Interface uint32
+       Group     kernelSockaddrStorage
+       Source    kernelSockaddrStorage
+}
+
+type icmpFilter struct {
+       Data uint32
+}
+
+type sockFProg struct {
+       Len       uint16
+       Pad_cgo_0 [2]byte
+       Filter    *sockFilter
+}
+
+type sockFilter struct {
+       Code uint16
+       Jt   uint8
+       Jf   uint8
+       K    uint32
+}
diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_s390x.go b/vendor/golang.org/x/net/ipv4/zsys_linux_s390x.go
new file mode 100644 (file)
index 0000000..9c967ea
--- /dev/null
@@ -0,0 +1,150 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_linux.go
+
+package ipv4
+
+const (
+       sysIP_TOS             = 0x1
+       sysIP_TTL             = 0x2
+       sysIP_HDRINCL         = 0x3
+       sysIP_OPTIONS         = 0x4
+       sysIP_ROUTER_ALERT    = 0x5
+       sysIP_RECVOPTS        = 0x6
+       sysIP_RETOPTS         = 0x7
+       sysIP_PKTINFO         = 0x8
+       sysIP_PKTOPTIONS      = 0x9
+       sysIP_MTU_DISCOVER    = 0xa
+       sysIP_RECVERR         = 0xb
+       sysIP_RECVTTL         = 0xc
+       sysIP_RECVTOS         = 0xd
+       sysIP_MTU             = 0xe
+       sysIP_FREEBIND        = 0xf
+       sysIP_TRANSPARENT     = 0x13
+       sysIP_RECVRETOPTS     = 0x7
+       sysIP_ORIGDSTADDR     = 0x14
+       sysIP_RECVORIGDSTADDR = 0x14
+       sysIP_MINTTL          = 0x15
+       sysIP_NODEFRAG        = 0x16
+       sysIP_UNICAST_IF      = 0x32
+
+       sysIP_MULTICAST_IF           = 0x20
+       sysIP_MULTICAST_TTL          = 0x21
+       sysIP_MULTICAST_LOOP         = 0x22
+       sysIP_ADD_MEMBERSHIP         = 0x23
+       sysIP_DROP_MEMBERSHIP        = 0x24
+       sysIP_UNBLOCK_SOURCE         = 0x25
+       sysIP_BLOCK_SOURCE           = 0x26
+       sysIP_ADD_SOURCE_MEMBERSHIP  = 0x27
+       sysIP_DROP_SOURCE_MEMBERSHIP = 0x28
+       sysIP_MSFILTER               = 0x29
+       sysMCAST_JOIN_GROUP          = 0x2a
+       sysMCAST_LEAVE_GROUP         = 0x2d
+       sysMCAST_JOIN_SOURCE_GROUP   = 0x2e
+       sysMCAST_LEAVE_SOURCE_GROUP  = 0x2f
+       sysMCAST_BLOCK_SOURCE        = 0x2b
+       sysMCAST_UNBLOCK_SOURCE      = 0x2c
+       sysMCAST_MSFILTER            = 0x30
+       sysIP_MULTICAST_ALL          = 0x31
+
+       sysICMP_FILTER = 0x1
+
+       sysSO_EE_ORIGIN_NONE         = 0x0
+       sysSO_EE_ORIGIN_LOCAL        = 0x1
+       sysSO_EE_ORIGIN_ICMP         = 0x2
+       sysSO_EE_ORIGIN_ICMP6        = 0x3
+       sysSO_EE_ORIGIN_TXSTATUS     = 0x4
+       sysSO_EE_ORIGIN_TIMESTAMPING = 0x4
+
+       sysSOL_SOCKET       = 0x1
+       sysSO_ATTACH_FILTER = 0x1a
+
+       sizeofKernelSockaddrStorage = 0x80
+       sizeofSockaddrInet          = 0x10
+       sizeofInetPktinfo           = 0xc
+       sizeofSockExtendedErr       = 0x10
+
+       sizeofIPMreq         = 0x8
+       sizeofIPMreqn        = 0xc
+       sizeofIPMreqSource   = 0xc
+       sizeofGroupReq       = 0x88
+       sizeofGroupSourceReq = 0x108
+
+       sizeofICMPFilter = 0x4
+
+       sizeofSockFprog = 0x10
+)
+
+type kernelSockaddrStorage struct {
+       Family  uint16
+       X__data [126]int8
+}
+
+type sockaddrInet struct {
+       Family uint16
+       Port   uint16
+       Addr   [4]byte /* in_addr */
+       X__pad [8]uint8
+}
+
+type inetPktinfo struct {
+       Ifindex  int32
+       Spec_dst [4]byte /* in_addr */
+       Addr     [4]byte /* in_addr */
+}
+
+type sockExtendedErr struct {
+       Errno  uint32
+       Origin uint8
+       Type   uint8
+       Code   uint8
+       Pad    uint8
+       Info   uint32
+       Data   uint32
+}
+
+type ipMreq struct {
+       Multiaddr [4]byte /* in_addr */
+       Interface [4]byte /* in_addr */
+}
+
+type ipMreqn struct {
+       Multiaddr [4]byte /* in_addr */
+       Address   [4]byte /* in_addr */
+       Ifindex   int32
+}
+
+type ipMreqSource struct {
+       Multiaddr  uint32
+       Interface  uint32
+       Sourceaddr uint32
+}
+
+type groupReq struct {
+       Interface uint32
+       Pad_cgo_0 [4]byte
+       Group     kernelSockaddrStorage
+}
+
+type groupSourceReq struct {
+       Interface uint32
+       Pad_cgo_0 [4]byte
+       Group     kernelSockaddrStorage
+       Source    kernelSockaddrStorage
+}
+
+type icmpFilter struct {
+       Data uint32
+}
+
+type sockFProg struct {
+       Len       uint16
+       Pad_cgo_0 [6]byte
+       Filter    *sockFilter
+}
+
+type sockFilter struct {
+       Code uint16
+       Jt   uint8
+       Jf   uint8
+       K    uint32
+}
diff --git a/vendor/golang.org/x/net/ipv6/batch.go b/vendor/golang.org/x/net/ipv6/batch.go
new file mode 100644 (file)
index 0000000..4f5fe68
--- /dev/null
@@ -0,0 +1,119 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build go1.9
+
+package ipv6
+
+import (
+       "net"
+       "runtime"
+       "syscall"
+
+       "golang.org/x/net/internal/socket"
+)
+
+// BUG(mikio): On Windows, the ReadBatch and WriteBatch methods of
+// PacketConn are not implemented.
+
+// A Message represents an IO message.
+//
+//     type Message struct {
+//             Buffers [][]byte
+//             OOB     []byte
+//             Addr    net.Addr
+//             N       int
+//             NN      int
+//             Flags   int
+//     }
+//
+// The Buffers fields represents a list of contiguous buffers, which
+// can be used for vectored IO, for example, putting a header and a
+// payload in each slice.
+// When writing, the Buffers field must contain at least one byte to
+// write.
+// When reading, the Buffers field will always contain a byte to read.
+//
+// The OOB field contains protocol-specific control or miscellaneous
+// ancillary data known as out-of-band data.
+// It can be nil when not required.
+//
+// The Addr field specifies a destination address when writing.
+// It can be nil when the underlying protocol of the endpoint uses
+// connection-oriented communication.
+// After a successful read, it may contain the source address on the
+// received packet.
+//
+// The N field indicates the number of bytes read or written from/to
+// Buffers.
+//
+// The NN field indicates the number of bytes read or written from/to
+// OOB.
+//
+// The Flags field contains protocol-specific information on the
+// received message.
+type Message = socket.Message
+
+// ReadBatch reads a batch of messages.
+//
+// The provided flags is a set of platform-dependent flags, such as
+// syscall.MSG_PEEK.
+//
+// On a successful read it returns the number of messages received, up
+// to len(ms).
+//
+// On Linux, a batch read will be optimized.
+// On other platforms, this method will read only a single message.
+func (c *payloadHandler) ReadBatch(ms []Message, flags int) (int, error) {
+       if !c.ok() {
+               return 0, syscall.EINVAL
+       }
+       switch runtime.GOOS {
+       case "linux":
+               n, err := c.RecvMsgs([]socket.Message(ms), flags)
+               if err != nil {
+                       err = &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err}
+               }
+               return n, err
+       default:
+               n := 1
+               err := c.RecvMsg(&ms[0], flags)
+               if err != nil {
+                       n = 0
+                       err = &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err}
+               }
+               return n, err
+       }
+}
+
+// WriteBatch writes a batch of messages.
+//
+// The provided flags is a set of platform-dependent flags, such as
+// syscall.MSG_DONTROUTE.
+//
+// It returns the number of messages written on a successful write.
+//
+// On Linux, a batch write will be optimized.
+// On other platforms, this method will write only a single message.
+func (c *payloadHandler) WriteBatch(ms []Message, flags int) (int, error) {
+       if !c.ok() {
+               return 0, syscall.EINVAL
+       }
+       switch runtime.GOOS {
+       case "linux":
+               n, err := c.SendMsgs([]socket.Message(ms), flags)
+               if err != nil {
+                       err = &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err}
+               }
+               return n, err
+       default:
+               n := 1
+               err := c.SendMsg(&ms[0], flags)
+               if err != nil {
+                       n = 0
+                       err = &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err}
+               }
+               return n, err
+       }
+}
diff --git a/vendor/golang.org/x/net/ipv6/dgramopt.go b/vendor/golang.org/x/net/ipv6/dgramopt.go
new file mode 100644 (file)
index 0000000..703dafe
--- /dev/null
@@ -0,0 +1,302 @@
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package ipv6
+
+import (
+       "net"
+       "syscall"
+
+       "golang.org/x/net/bpf"
+)
+
+// MulticastHopLimit returns the hop limit field value for outgoing
+// multicast packets.
+func (c *dgramOpt) MulticastHopLimit() (int, error) {
+       if !c.ok() {
+               return 0, syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoMulticastHopLimit]
+       if !ok {
+               return 0, errOpNoSupport
+       }
+       return so.GetInt(c.Conn)
+}
+
+// SetMulticastHopLimit sets the hop limit field value for future
+// outgoing multicast packets.
+func (c *dgramOpt) SetMulticastHopLimit(hoplim int) error {
+       if !c.ok() {
+               return syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoMulticastHopLimit]
+       if !ok {
+               return errOpNoSupport
+       }
+       return so.SetInt(c.Conn, hoplim)
+}
+
+// MulticastInterface returns the default interface for multicast
+// packet transmissions.
+func (c *dgramOpt) MulticastInterface() (*net.Interface, error) {
+       if !c.ok() {
+               return nil, syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoMulticastInterface]
+       if !ok {
+               return nil, errOpNoSupport
+       }
+       return so.getMulticastInterface(c.Conn)
+}
+
+// SetMulticastInterface sets the default interface for future
+// multicast packet transmissions.
+func (c *dgramOpt) SetMulticastInterface(ifi *net.Interface) error {
+       if !c.ok() {
+               return syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoMulticastInterface]
+       if !ok {
+               return errOpNoSupport
+       }
+       return so.setMulticastInterface(c.Conn, ifi)
+}
+
+// MulticastLoopback reports whether transmitted multicast packets
+// should be copied and send back to the originator.
+func (c *dgramOpt) MulticastLoopback() (bool, error) {
+       if !c.ok() {
+               return false, syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoMulticastLoopback]
+       if !ok {
+               return false, errOpNoSupport
+       }
+       on, err := so.GetInt(c.Conn)
+       if err != nil {
+               return false, err
+       }
+       return on == 1, nil
+}
+
+// SetMulticastLoopback sets whether transmitted multicast packets
+// should be copied and send back to the originator.
+func (c *dgramOpt) SetMulticastLoopback(on bool) error {
+       if !c.ok() {
+               return syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoMulticastLoopback]
+       if !ok {
+               return errOpNoSupport
+       }
+       return so.SetInt(c.Conn, boolint(on))
+}
+
+// JoinGroup joins the group address group on the interface ifi.
+// By default all sources that can cast data to group are accepted.
+// It's possible to mute and unmute data transmission from a specific
+// source by using ExcludeSourceSpecificGroup and
+// IncludeSourceSpecificGroup.
+// JoinGroup uses the system assigned multicast interface when ifi is
+// nil, although this is not recommended because the assignment
+// depends on platforms and sometimes it might require routing
+// configuration.
+func (c *dgramOpt) JoinGroup(ifi *net.Interface, group net.Addr) error {
+       if !c.ok() {
+               return syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoJoinGroup]
+       if !ok {
+               return errOpNoSupport
+       }
+       grp := netAddrToIP16(group)
+       if grp == nil {
+               return errMissingAddress
+       }
+       return so.setGroup(c.Conn, ifi, grp)
+}
+
+// LeaveGroup leaves the group address group on the interface ifi
+// regardless of whether the group is any-source group or
+// source-specific group.
+func (c *dgramOpt) LeaveGroup(ifi *net.Interface, group net.Addr) error {
+       if !c.ok() {
+               return syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoLeaveGroup]
+       if !ok {
+               return errOpNoSupport
+       }
+       grp := netAddrToIP16(group)
+       if grp == nil {
+               return errMissingAddress
+       }
+       return so.setGroup(c.Conn, ifi, grp)
+}
+
+// JoinSourceSpecificGroup joins the source-specific group comprising
+// group and source on the interface ifi.
+// JoinSourceSpecificGroup uses the system assigned multicast
+// interface when ifi is nil, although this is not recommended because
+// the assignment depends on platforms and sometimes it might require
+// routing configuration.
+func (c *dgramOpt) JoinSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error {
+       if !c.ok() {
+               return syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoJoinSourceGroup]
+       if !ok {
+               return errOpNoSupport
+       }
+       grp := netAddrToIP16(group)
+       if grp == nil {
+               return errMissingAddress
+       }
+       src := netAddrToIP16(source)
+       if src == nil {
+               return errMissingAddress
+       }
+       return so.setSourceGroup(c.Conn, ifi, grp, src)
+}
+
+// LeaveSourceSpecificGroup leaves the source-specific group on the
+// interface ifi.
+func (c *dgramOpt) LeaveSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error {
+       if !c.ok() {
+               return syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoLeaveSourceGroup]
+       if !ok {
+               return errOpNoSupport
+       }
+       grp := netAddrToIP16(group)
+       if grp == nil {
+               return errMissingAddress
+       }
+       src := netAddrToIP16(source)
+       if src == nil {
+               return errMissingAddress
+       }
+       return so.setSourceGroup(c.Conn, ifi, grp, src)
+}
+
+// ExcludeSourceSpecificGroup excludes the source-specific group from
+// the already joined any-source groups by JoinGroup on the interface
+// ifi.
+func (c *dgramOpt) ExcludeSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error {
+       if !c.ok() {
+               return syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoBlockSourceGroup]
+       if !ok {
+               return errOpNoSupport
+       }
+       grp := netAddrToIP16(group)
+       if grp == nil {
+               return errMissingAddress
+       }
+       src := netAddrToIP16(source)
+       if src == nil {
+               return errMissingAddress
+       }
+       return so.setSourceGroup(c.Conn, ifi, grp, src)
+}
+
+// IncludeSourceSpecificGroup includes the excluded source-specific
+// group by ExcludeSourceSpecificGroup again on the interface ifi.
+func (c *dgramOpt) IncludeSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error {
+       if !c.ok() {
+               return syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoUnblockSourceGroup]
+       if !ok {
+               return errOpNoSupport
+       }
+       grp := netAddrToIP16(group)
+       if grp == nil {
+               return errMissingAddress
+       }
+       src := netAddrToIP16(source)
+       if src == nil {
+               return errMissingAddress
+       }
+       return so.setSourceGroup(c.Conn, ifi, grp, src)
+}
+
+// Checksum reports whether the kernel will compute, store or verify a
+// checksum for both incoming and outgoing packets. If on is true, it
+// returns an offset in bytes into the data of where the checksum
+// field is located.
+func (c *dgramOpt) Checksum() (on bool, offset int, err error) {
+       if !c.ok() {
+               return false, 0, syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoChecksum]
+       if !ok {
+               return false, 0, errOpNoSupport
+       }
+       offset, err = so.GetInt(c.Conn)
+       if err != nil {
+               return false, 0, err
+       }
+       if offset < 0 {
+               return false, 0, nil
+       }
+       return true, offset, nil
+}
+
+// SetChecksum enables the kernel checksum processing. If on is ture,
+// the offset should be an offset in bytes into the data of where the
+// checksum field is located.
+func (c *dgramOpt) SetChecksum(on bool, offset int) error {
+       if !c.ok() {
+               return syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoChecksum]
+       if !ok {
+               return errOpNoSupport
+       }
+       if !on {
+               offset = -1
+       }
+       return so.SetInt(c.Conn, offset)
+}
+
+// ICMPFilter returns an ICMP filter.
+func (c *dgramOpt) ICMPFilter() (*ICMPFilter, error) {
+       if !c.ok() {
+               return nil, syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoICMPFilter]
+       if !ok {
+               return nil, errOpNoSupport
+       }
+       return so.getICMPFilter(c.Conn)
+}
+
+// SetICMPFilter deploys the ICMP filter.
+func (c *dgramOpt) SetICMPFilter(f *ICMPFilter) error {
+       if !c.ok() {
+               return syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoICMPFilter]
+       if !ok {
+               return errOpNoSupport
+       }
+       return so.setICMPFilter(c.Conn, f)
+}
+
+// SetBPF attaches a BPF program to the connection.
+//
+// Only supported on Linux.
+func (c *dgramOpt) SetBPF(filter []bpf.RawInstruction) error {
+       if !c.ok() {
+               return syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoAttachFilter]
+       if !ok {
+               return errOpNoSupport
+       }
+       return so.setBPF(c.Conn, filter)
+}
diff --git a/vendor/golang.org/x/net/ipv6/genericopt.go b/vendor/golang.org/x/net/ipv6/genericopt.go
new file mode 100644 (file)
index 0000000..e9dbc2e
--- /dev/null
@@ -0,0 +1,58 @@
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package ipv6
+
+import "syscall"
+
+// TrafficClass returns the traffic class field value for outgoing
+// packets.
+func (c *genericOpt) TrafficClass() (int, error) {
+       if !c.ok() {
+               return 0, syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoTrafficClass]
+       if !ok {
+               return 0, errOpNoSupport
+       }
+       return so.GetInt(c.Conn)
+}
+
+// SetTrafficClass sets the traffic class field value for future
+// outgoing packets.
+func (c *genericOpt) SetTrafficClass(tclass int) error {
+       if !c.ok() {
+               return syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoTrafficClass]
+       if !ok {
+               return errOpNoSupport
+       }
+       return so.SetInt(c.Conn, tclass)
+}
+
+// HopLimit returns the hop limit field value for outgoing packets.
+func (c *genericOpt) HopLimit() (int, error) {
+       if !c.ok() {
+               return 0, syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoHopLimit]
+       if !ok {
+               return 0, errOpNoSupport
+       }
+       return so.GetInt(c.Conn)
+}
+
+// SetHopLimit sets the hop limit field value for future outgoing
+// packets.
+func (c *genericOpt) SetHopLimit(hoplim int) error {
+       if !c.ok() {
+               return syscall.EINVAL
+       }
+       so, ok := sockOpts[ssoHopLimit]
+       if !ok {
+               return errOpNoSupport
+       }
+       return so.SetInt(c.Conn, hoplim)
+}
diff --git a/vendor/golang.org/x/net/ipv6/payload_cmsg_go1_8.go b/vendor/golang.org/x/net/ipv6/payload_cmsg_go1_8.go
new file mode 100644 (file)
index 0000000..fdc6c39
--- /dev/null
@@ -0,0 +1,55 @@
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !go1.9
+// +build !nacl,!plan9,!windows
+
+package ipv6
+
+import "net"
+
+func (c *payloadHandler) readFrom(b []byte) (n int, cm *ControlMessage, src net.Addr, err error) {
+       c.rawOpt.RLock()
+       oob := NewControlMessage(c.rawOpt.cflags)
+       c.rawOpt.RUnlock()
+       var nn int
+       switch c := c.PacketConn.(type) {
+       case *net.UDPConn:
+               if n, nn, _, src, err = c.ReadMsgUDP(b, oob); err != nil {
+                       return 0, nil, nil, err
+               }
+       case *net.IPConn:
+               if n, nn, _, src, err = c.ReadMsgIP(b, oob); err != nil {
+                       return 0, nil, nil, err
+               }
+       default:
+               return 0, nil, nil, &net.OpError{Op: "read", Net: c.LocalAddr().Network(), Source: c.LocalAddr(), Err: errInvalidConnType}
+       }
+       if nn > 0 {
+               cm = new(ControlMessage)
+               if err = cm.Parse(oob[:nn]); err != nil {
+                       return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err}
+               }
+       }
+       if cm != nil {
+               cm.Src = netAddrToIP16(src)
+       }
+       return
+}
+
+func (c *payloadHandler) writeTo(b []byte, cm *ControlMessage, dst net.Addr) (n int, err error) {
+       oob := cm.Marshal()
+       if dst == nil {
+               return 0, &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: errMissingAddress}
+       }
+       switch c := c.PacketConn.(type) {
+       case *net.UDPConn:
+               n, _, err = c.WriteMsgUDP(b, oob, dst.(*net.UDPAddr))
+       case *net.IPConn:
+               n, _, err = c.WriteMsgIP(b, oob, dst.(*net.IPAddr))
+       default:
+               return 0, &net.OpError{Op: "write", Net: c.LocalAddr().Network(), Source: c.LocalAddr(), Addr: opAddr(dst), Err: errInvalidConnType}
+       }
+       return
+}
diff --git a/vendor/golang.org/x/net/ipv6/payload_cmsg_go1_9.go b/vendor/golang.org/x/net/ipv6/payload_cmsg_go1_9.go
new file mode 100644 (file)
index 0000000..8f6d02e
--- /dev/null
@@ -0,0 +1,57 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build go1.9
+// +build !nacl,!plan9,!windows
+
+package ipv6
+
+import (
+       "net"
+
+       "golang.org/x/net/internal/socket"
+)
+
+func (c *payloadHandler) readFrom(b []byte) (int, *ControlMessage, net.Addr, error) {
+       c.rawOpt.RLock()
+       m := socket.Message{
+               Buffers: [][]byte{b},
+               OOB:     NewControlMessage(c.rawOpt.cflags),
+       }
+       c.rawOpt.RUnlock()
+       switch c.PacketConn.(type) {
+       case *net.UDPConn:
+               if err := c.RecvMsg(&m, 0); err != nil {
+                       return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err}
+               }
+       case *net.IPConn:
+               if err := c.RecvMsg(&m, 0); err != nil {
+                       return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err}
+               }
+       default:
+               return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: errInvalidConnType}
+       }
+       var cm *ControlMessage
+       if m.NN > 0 {
+               cm = new(ControlMessage)
+               if err := cm.Parse(m.OOB[:m.NN]); err != nil {
+                       return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err}
+               }
+               cm.Src = netAddrToIP16(m.Addr)
+       }
+       return m.N, cm, m.Addr, nil
+}
+
+func (c *payloadHandler) writeTo(b []byte, cm *ControlMessage, dst net.Addr) (int, error) {
+       m := socket.Message{
+               Buffers: [][]byte{b},
+               OOB:     cm.Marshal(),
+               Addr:    dst,
+       }
+       err := c.SendMsg(&m, 0)
+       if err != nil {
+               err = &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Addr: opAddr(dst), Err: err}
+       }
+       return m.N, err
+}
diff --git a/vendor/golang.org/x/net/ipv6/sockopt_posix.go b/vendor/golang.org/x/net/ipv6/sockopt_posix.go
new file mode 100644 (file)
index 0000000..0eac86e
--- /dev/null
@@ -0,0 +1,87 @@
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows
+
+package ipv6
+
+import (
+       "net"
+       "unsafe"
+
+       "golang.org/x/net/bpf"
+       "golang.org/x/net/internal/socket"
+)
+
+func (so *sockOpt) getMulticastInterface(c *socket.Conn) (*net.Interface, error) {
+       n, err := so.GetInt(c)
+       if err != nil {
+               return nil, err
+       }
+       return net.InterfaceByIndex(n)
+}
+
+func (so *sockOpt) setMulticastInterface(c *socket.Conn, ifi *net.Interface) error {
+       var n int
+       if ifi != nil {
+               n = ifi.Index
+       }
+       return so.SetInt(c, n)
+}
+
+func (so *sockOpt) getICMPFilter(c *socket.Conn) (*ICMPFilter, error) {
+       b := make([]byte, so.Len)
+       n, err := so.Get(c, b)
+       if err != nil {
+               return nil, err
+       }
+       if n != sizeofICMPv6Filter {
+               return nil, errOpNoSupport
+       }
+       return (*ICMPFilter)(unsafe.Pointer(&b[0])), nil
+}
+
+func (so *sockOpt) setICMPFilter(c *socket.Conn, f *ICMPFilter) error {
+       b := (*[sizeofICMPv6Filter]byte)(unsafe.Pointer(f))[:sizeofICMPv6Filter]
+       return so.Set(c, b)
+}
+
+func (so *sockOpt) getMTUInfo(c *socket.Conn) (*net.Interface, int, error) {
+       b := make([]byte, so.Len)
+       n, err := so.Get(c, b)
+       if err != nil {
+               return nil, 0, err
+       }
+       if n != sizeofIPv6Mtuinfo {
+               return nil, 0, errOpNoSupport
+       }
+       mi := (*ipv6Mtuinfo)(unsafe.Pointer(&b[0]))
+       if mi.Addr.Scope_id == 0 {
+               return nil, int(mi.Mtu), nil
+       }
+       ifi, err := net.InterfaceByIndex(int(mi.Addr.Scope_id))
+       if err != nil {
+               return nil, 0, err
+       }
+       return ifi, int(mi.Mtu), nil
+}
+
+func (so *sockOpt) setGroup(c *socket.Conn, ifi *net.Interface, grp net.IP) error {
+       switch so.typ {
+       case ssoTypeIPMreq:
+               return so.setIPMreq(c, ifi, grp)
+       case ssoTypeGroupReq:
+               return so.setGroupReq(c, ifi, grp)
+       default:
+               return errOpNoSupport
+       }
+}
+
+func (so *sockOpt) setSourceGroup(c *socket.Conn, ifi *net.Interface, grp, src net.IP) error {
+       return so.setGroupSourceReq(c, ifi, grp, src)
+}
+
+func (so *sockOpt) setBPF(c *socket.Conn, f []bpf.RawInstruction) error {
+       return so.setAttachFilter(c, f)
+}
diff --git a/vendor/golang.org/x/net/ipv6/sys_asmreq.go b/vendor/golang.org/x/net/ipv6/sys_asmreq.go
new file mode 100644 (file)
index 0000000..b0510c0
--- /dev/null
@@ -0,0 +1,24 @@
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows
+
+package ipv6
+
+import (
+       "net"
+       "unsafe"
+
+       "golang.org/x/net/internal/socket"
+)
+
+func (so *sockOpt) setIPMreq(c *socket.Conn, ifi *net.Interface, grp net.IP) error {
+       var mreq ipv6Mreq
+       copy(mreq.Multiaddr[:], grp)
+       if ifi != nil {
+               mreq.setIfindex(ifi.Index)
+       }
+       b := (*[sizeofIPv6Mreq]byte)(unsafe.Pointer(&mreq))[:sizeofIPv6Mreq]
+       return so.Set(c, b)
+}
diff --git a/vendor/golang.org/x/net/ipv6/sys_asmreq_stub.go b/vendor/golang.org/x/net/ipv6/sys_asmreq_stub.go
new file mode 100644 (file)
index 0000000..eece961
--- /dev/null
@@ -0,0 +1,17 @@
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows
+
+package ipv6
+
+import (
+       "net"
+
+       "golang.org/x/net/internal/socket"
+)
+
+func (so *sockOpt) setIPMreq(c *socket.Conn, ifi *net.Interface, grp net.IP) error {
+       return errOpNoSupport
+}
diff --git a/vendor/golang.org/x/net/ipv6/sys_bpf.go b/vendor/golang.org/x/net/ipv6/sys_bpf.go
new file mode 100644 (file)
index 0000000..b2dbcb2
--- /dev/null
@@ -0,0 +1,23 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build linux
+
+package ipv6
+
+import (
+       "unsafe"
+
+       "golang.org/x/net/bpf"
+       "golang.org/x/net/internal/socket"
+)
+
+func (so *sockOpt) setAttachFilter(c *socket.Conn, f []bpf.RawInstruction) error {
+       prog := sockFProg{
+               Len:    uint16(len(f)),
+               Filter: (*sockFilter)(unsafe.Pointer(&f[0])),
+       }
+       b := (*[sizeofSockFprog]byte)(unsafe.Pointer(&prog))[:sizeofSockFprog]
+       return so.Set(c, b)
+}
diff --git a/vendor/golang.org/x/net/ipv6/sys_bpf_stub.go b/vendor/golang.org/x/net/ipv6/sys_bpf_stub.go
new file mode 100644 (file)
index 0000000..676bea5
--- /dev/null
@@ -0,0 +1,16 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !linux
+
+package ipv6
+
+import (
+       "golang.org/x/net/bpf"
+       "golang.org/x/net/internal/socket"
+)
+
+func (so *sockOpt) setAttachFilter(c *socket.Conn, f []bpf.RawInstruction) error {
+       return errOpNoSupport
+}
diff --git a/vendor/golang.org/x/net/ipv6/sys_solaris.go b/vendor/golang.org/x/net/ipv6/sys_solaris.go
new file mode 100644 (file)
index 0000000..d348b5f
--- /dev/null
@@ -0,0 +1,74 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package ipv6
+
+import (
+       "net"
+       "syscall"
+       "unsafe"
+
+       "golang.org/x/net/internal/iana"
+       "golang.org/x/net/internal/socket"
+)
+
+var (
+       ctlOpts = [ctlMax]ctlOpt{
+               ctlTrafficClass: {sysIPV6_TCLASS, 4, marshalTrafficClass, parseTrafficClass},
+               ctlHopLimit:     {sysIPV6_HOPLIMIT, 4, marshalHopLimit, parseHopLimit},
+               ctlPacketInfo:   {sysIPV6_PKTINFO, sizeofInet6Pktinfo, marshalPacketInfo, parsePacketInfo},
+               ctlNextHop:      {sysIPV6_NEXTHOP, sizeofSockaddrInet6, marshalNextHop, parseNextHop},
+               ctlPathMTU:      {sysIPV6_PATHMTU, sizeofIPv6Mtuinfo, marshalPathMTU, parsePathMTU},
+       }
+
+       sockOpts = map[int]*sockOpt{
+               ssoTrafficClass:        {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_TCLASS, Len: 4}},
+               ssoHopLimit:            {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_UNICAST_HOPS, Len: 4}},
+               ssoMulticastInterface:  {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_IF, Len: 4}},
+               ssoMulticastHopLimit:   {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_HOPS, Len: 4}},
+               ssoMulticastLoopback:   {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_LOOP, Len: 4}},
+               ssoReceiveTrafficClass: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVTCLASS, Len: 4}},
+               ssoReceiveHopLimit:     {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVHOPLIMIT, Len: 4}},
+               ssoReceivePacketInfo:   {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVPKTINFO, Len: 4}},
+               ssoReceivePathMTU:      {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVPATHMTU, Len: 4}},
+               ssoPathMTU:             {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_PATHMTU, Len: sizeofIPv6Mtuinfo}},
+               ssoChecksum:            {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_CHECKSUM, Len: 4}},
+               ssoICMPFilter:          {Option: socket.Option{Level: iana.ProtocolIPv6ICMP, Name: sysICMP6_FILTER, Len: sizeofICMPv6Filter}},
+               ssoJoinGroup:           {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_JOIN_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq},
+               ssoLeaveGroup:          {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_LEAVE_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq},
+               ssoJoinSourceGroup:     {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_JOIN_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq},
+               ssoLeaveSourceGroup:    {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_LEAVE_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq},
+               ssoBlockSourceGroup:    {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_BLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq},
+               ssoUnblockSourceGroup:  {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_UNBLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq},
+       }
+)
+
+func (sa *sockaddrInet6) setSockaddr(ip net.IP, i int) {
+       sa.Family = syscall.AF_INET6
+       copy(sa.Addr[:], ip)
+       sa.Scope_id = uint32(i)
+}
+
+func (pi *inet6Pktinfo) setIfindex(i int) {
+       pi.Ifindex = uint32(i)
+}
+
+func (mreq *ipv6Mreq) setIfindex(i int) {
+       mreq.Interface = uint32(i)
+}
+
+func (gr *groupReq) setGroup(grp net.IP) {
+       sa := (*sockaddrInet6)(unsafe.Pointer(uintptr(unsafe.Pointer(gr)) + 4))
+       sa.Family = syscall.AF_INET6
+       copy(sa.Addr[:], grp)
+}
+
+func (gsr *groupSourceReq) setSourceGroup(grp, src net.IP) {
+       sa := (*sockaddrInet6)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 4))
+       sa.Family = syscall.AF_INET6
+       copy(sa.Addr[:], grp)
+       sa = (*sockaddrInet6)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 260))
+       sa.Family = syscall.AF_INET6
+       copy(sa.Addr[:], src)
+}
diff --git a/vendor/golang.org/x/net/ipv6/sys_ssmreq.go b/vendor/golang.org/x/net/ipv6/sys_ssmreq.go
new file mode 100644 (file)
index 0000000..add8ccc
--- /dev/null
@@ -0,0 +1,54 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin freebsd linux solaris
+
+package ipv6
+
+import (
+       "net"
+       "unsafe"
+
+       "golang.org/x/net/internal/socket"
+)
+
+var freebsd32o64 bool
+
+func (so *sockOpt) setGroupReq(c *socket.Conn, ifi *net.Interface, grp net.IP) error {
+       var gr groupReq
+       if ifi != nil {
+               gr.Interface = uint32(ifi.Index)
+       }
+       gr.setGroup(grp)
+       var b []byte
+       if freebsd32o64 {
+               var d [sizeofGroupReq + 4]byte
+               s := (*[sizeofGroupReq]byte)(unsafe.Pointer(&gr))
+               copy(d[:4], s[:4])
+               copy(d[8:], s[4:])
+               b = d[:]
+       } else {
+               b = (*[sizeofGroupReq]byte)(unsafe.Pointer(&gr))[:sizeofGroupReq]
+       }
+       return so.Set(c, b)
+}
+
+func (so *sockOpt) setGroupSourceReq(c *socket.Conn, ifi *net.Interface, grp, src net.IP) error {
+       var gsr groupSourceReq
+       if ifi != nil {
+               gsr.Interface = uint32(ifi.Index)
+       }
+       gsr.setSourceGroup(grp, src)
+       var b []byte
+       if freebsd32o64 {
+               var d [sizeofGroupSourceReq + 4]byte
+               s := (*[sizeofGroupSourceReq]byte)(unsafe.Pointer(&gsr))
+               copy(d[:4], s[:4])
+               copy(d[8:], s[4:])
+               b = d[:]
+       } else {
+               b = (*[sizeofGroupSourceReq]byte)(unsafe.Pointer(&gsr))[:sizeofGroupSourceReq]
+       }
+       return so.Set(c, b)
+}
diff --git a/vendor/golang.org/x/net/ipv6/sys_ssmreq_stub.go b/vendor/golang.org/x/net/ipv6/sys_ssmreq_stub.go
new file mode 100644 (file)
index 0000000..581ee49
--- /dev/null
@@ -0,0 +1,21 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !darwin,!freebsd,!linux,!solaris
+
+package ipv6
+
+import (
+       "net"
+
+       "golang.org/x/net/internal/socket"
+)
+
+func (so *sockOpt) setGroupReq(c *socket.Conn, ifi *net.Interface, grp net.IP) error {
+       return errOpNoSupport
+}
+
+func (so *sockOpt) setGroupSourceReq(c *socket.Conn, ifi *net.Interface, grp, src net.IP) error {
+       return errOpNoSupport
+}
diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_mips.go b/vendor/golang.org/x/net/ipv6/zsys_linux_mips.go
new file mode 100644 (file)
index 0000000..73aa8c6
--- /dev/null
@@ -0,0 +1,170 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_linux.go
+
+package ipv6
+
+const (
+       sysIPV6_ADDRFORM       = 0x1
+       sysIPV6_2292PKTINFO    = 0x2
+       sysIPV6_2292HOPOPTS    = 0x3
+       sysIPV6_2292DSTOPTS    = 0x4
+       sysIPV6_2292RTHDR      = 0x5
+       sysIPV6_2292PKTOPTIONS = 0x6
+       sysIPV6_CHECKSUM       = 0x7
+       sysIPV6_2292HOPLIMIT   = 0x8
+       sysIPV6_NEXTHOP        = 0x9
+       sysIPV6_FLOWINFO       = 0xb
+
+       sysIPV6_UNICAST_HOPS        = 0x10
+       sysIPV6_MULTICAST_IF        = 0x11
+       sysIPV6_MULTICAST_HOPS      = 0x12
+       sysIPV6_MULTICAST_LOOP      = 0x13
+       sysIPV6_ADD_MEMBERSHIP      = 0x14
+       sysIPV6_DROP_MEMBERSHIP     = 0x15
+       sysMCAST_JOIN_GROUP         = 0x2a
+       sysMCAST_LEAVE_GROUP        = 0x2d
+       sysMCAST_JOIN_SOURCE_GROUP  = 0x2e
+       sysMCAST_LEAVE_SOURCE_GROUP = 0x2f
+       sysMCAST_BLOCK_SOURCE       = 0x2b
+       sysMCAST_UNBLOCK_SOURCE     = 0x2c
+       sysMCAST_MSFILTER           = 0x30
+       sysIPV6_ROUTER_ALERT        = 0x16
+       sysIPV6_MTU_DISCOVER        = 0x17
+       sysIPV6_MTU                 = 0x18
+       sysIPV6_RECVERR             = 0x19
+       sysIPV6_V6ONLY              = 0x1a
+       sysIPV6_JOIN_ANYCAST        = 0x1b
+       sysIPV6_LEAVE_ANYCAST       = 0x1c
+
+       sysIPV6_FLOWLABEL_MGR = 0x20
+       sysIPV6_FLOWINFO_SEND = 0x21
+
+       sysIPV6_IPSEC_POLICY = 0x22
+       sysIPV6_XFRM_POLICY  = 0x23
+
+       sysIPV6_RECVPKTINFO  = 0x31
+       sysIPV6_PKTINFO      = 0x32
+       sysIPV6_RECVHOPLIMIT = 0x33
+       sysIPV6_HOPLIMIT     = 0x34
+       sysIPV6_RECVHOPOPTS  = 0x35
+       sysIPV6_HOPOPTS      = 0x36
+       sysIPV6_RTHDRDSTOPTS = 0x37
+       sysIPV6_RECVRTHDR    = 0x38
+       sysIPV6_RTHDR        = 0x39
+       sysIPV6_RECVDSTOPTS  = 0x3a
+       sysIPV6_DSTOPTS      = 0x3b
+       sysIPV6_RECVPATHMTU  = 0x3c
+       sysIPV6_PATHMTU      = 0x3d
+       sysIPV6_DONTFRAG     = 0x3e
+
+       sysIPV6_RECVTCLASS = 0x42
+       sysIPV6_TCLASS     = 0x43
+
+       sysIPV6_ADDR_PREFERENCES = 0x48
+
+       sysIPV6_PREFER_SRC_TMP            = 0x1
+       sysIPV6_PREFER_SRC_PUBLIC         = 0x2
+       sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100
+       sysIPV6_PREFER_SRC_COA            = 0x4
+       sysIPV6_PREFER_SRC_HOME           = 0x400
+       sysIPV6_PREFER_SRC_CGA            = 0x8
+       sysIPV6_PREFER_SRC_NONCGA         = 0x800
+
+       sysIPV6_MINHOPCOUNT = 0x49
+
+       sysIPV6_ORIGDSTADDR     = 0x4a
+       sysIPV6_RECVORIGDSTADDR = 0x4a
+       sysIPV6_TRANSPARENT     = 0x4b
+       sysIPV6_UNICAST_IF      = 0x4c
+
+       sysICMPV6_FILTER = 0x1
+
+       sysICMPV6_FILTER_BLOCK       = 0x1
+       sysICMPV6_FILTER_PASS        = 0x2
+       sysICMPV6_FILTER_BLOCKOTHERS = 0x3
+       sysICMPV6_FILTER_PASSONLY    = 0x4
+
+       sysSOL_SOCKET       = 0x1
+       sysSO_ATTACH_FILTER = 0x1a
+
+       sizeofKernelSockaddrStorage = 0x80
+       sizeofSockaddrInet6         = 0x1c
+       sizeofInet6Pktinfo          = 0x14
+       sizeofIPv6Mtuinfo           = 0x20
+       sizeofIPv6FlowlabelReq      = 0x20
+
+       sizeofIPv6Mreq       = 0x14
+       sizeofGroupReq       = 0x84
+       sizeofGroupSourceReq = 0x104
+
+       sizeofICMPv6Filter = 0x20
+
+       sizeofSockFprog = 0x8
+)
+
+type kernelSockaddrStorage struct {
+       Family  uint16
+       X__data [126]int8
+}
+
+type sockaddrInet6 struct {
+       Family   uint16
+       Port     uint16
+       Flowinfo uint32
+       Addr     [16]byte /* in6_addr */
+       Scope_id uint32
+}
+
+type inet6Pktinfo struct {
+       Addr    [16]byte /* in6_addr */
+       Ifindex int32
+}
+
+type ipv6Mtuinfo struct {
+       Addr sockaddrInet6
+       Mtu  uint32
+}
+
+type ipv6FlowlabelReq struct {
+       Dst        [16]byte /* in6_addr */
+       Label      uint32
+       Action     uint8
+       Share      uint8
+       Flags      uint16
+       Expires    uint16
+       Linger     uint16
+       X__flr_pad uint32
+}
+
+type ipv6Mreq struct {
+       Multiaddr [16]byte /* in6_addr */
+       Ifindex   int32
+}
+
+type groupReq struct {
+       Interface uint32
+       Group     kernelSockaddrStorage
+}
+
+type groupSourceReq struct {
+       Interface uint32
+       Group     kernelSockaddrStorage
+       Source    kernelSockaddrStorage
+}
+
+type icmpv6Filter struct {
+       Data [8]uint32
+}
+
+type sockFProg struct {
+       Len       uint16
+       Pad_cgo_0 [2]byte
+       Filter    *sockFilter
+}
+
+type sockFilter struct {
+       Code uint16
+       Jt   uint8
+       Jf   uint8
+       K    uint32
+}
diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_mipsle.go b/vendor/golang.org/x/net/ipv6/zsys_linux_mipsle.go
new file mode 100644 (file)
index 0000000..73aa8c6
--- /dev/null
@@ -0,0 +1,170 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_linux.go
+
+package ipv6
+
+const (
+       sysIPV6_ADDRFORM       = 0x1
+       sysIPV6_2292PKTINFO    = 0x2
+       sysIPV6_2292HOPOPTS    = 0x3
+       sysIPV6_2292DSTOPTS    = 0x4
+       sysIPV6_2292RTHDR      = 0x5
+       sysIPV6_2292PKTOPTIONS = 0x6
+       sysIPV6_CHECKSUM       = 0x7
+       sysIPV6_2292HOPLIMIT   = 0x8
+       sysIPV6_NEXTHOP        = 0x9
+       sysIPV6_FLOWINFO       = 0xb
+
+       sysIPV6_UNICAST_HOPS        = 0x10
+       sysIPV6_MULTICAST_IF        = 0x11
+       sysIPV6_MULTICAST_HOPS      = 0x12
+       sysIPV6_MULTICAST_LOOP      = 0x13
+       sysIPV6_ADD_MEMBERSHIP      = 0x14
+       sysIPV6_DROP_MEMBERSHIP     = 0x15
+       sysMCAST_JOIN_GROUP         = 0x2a
+       sysMCAST_LEAVE_GROUP        = 0x2d
+       sysMCAST_JOIN_SOURCE_GROUP  = 0x2e
+       sysMCAST_LEAVE_SOURCE_GROUP = 0x2f
+       sysMCAST_BLOCK_SOURCE       = 0x2b
+       sysMCAST_UNBLOCK_SOURCE     = 0x2c
+       sysMCAST_MSFILTER           = 0x30
+       sysIPV6_ROUTER_ALERT        = 0x16
+       sysIPV6_MTU_DISCOVER        = 0x17
+       sysIPV6_MTU                 = 0x18
+       sysIPV6_RECVERR             = 0x19
+       sysIPV6_V6ONLY              = 0x1a
+       sysIPV6_JOIN_ANYCAST        = 0x1b
+       sysIPV6_LEAVE_ANYCAST       = 0x1c
+
+       sysIPV6_FLOWLABEL_MGR = 0x20
+       sysIPV6_FLOWINFO_SEND = 0x21
+
+       sysIPV6_IPSEC_POLICY = 0x22
+       sysIPV6_XFRM_POLICY  = 0x23
+
+       sysIPV6_RECVPKTINFO  = 0x31
+       sysIPV6_PKTINFO      = 0x32
+       sysIPV6_RECVHOPLIMIT = 0x33
+       sysIPV6_HOPLIMIT     = 0x34
+       sysIPV6_RECVHOPOPTS  = 0x35
+       sysIPV6_HOPOPTS      = 0x36
+       sysIPV6_RTHDRDSTOPTS = 0x37
+       sysIPV6_RECVRTHDR    = 0x38
+       sysIPV6_RTHDR        = 0x39
+       sysIPV6_RECVDSTOPTS  = 0x3a
+       sysIPV6_DSTOPTS      = 0x3b
+       sysIPV6_RECVPATHMTU  = 0x3c
+       sysIPV6_PATHMTU      = 0x3d
+       sysIPV6_DONTFRAG     = 0x3e
+
+       sysIPV6_RECVTCLASS = 0x42
+       sysIPV6_TCLASS     = 0x43
+
+       sysIPV6_ADDR_PREFERENCES = 0x48
+
+       sysIPV6_PREFER_SRC_TMP            = 0x1
+       sysIPV6_PREFER_SRC_PUBLIC         = 0x2
+       sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100
+       sysIPV6_PREFER_SRC_COA            = 0x4
+       sysIPV6_PREFER_SRC_HOME           = 0x400
+       sysIPV6_PREFER_SRC_CGA            = 0x8
+       sysIPV6_PREFER_SRC_NONCGA         = 0x800
+
+       sysIPV6_MINHOPCOUNT = 0x49
+
+       sysIPV6_ORIGDSTADDR     = 0x4a
+       sysIPV6_RECVORIGDSTADDR = 0x4a
+       sysIPV6_TRANSPARENT     = 0x4b
+       sysIPV6_UNICAST_IF      = 0x4c
+
+       sysICMPV6_FILTER = 0x1
+
+       sysICMPV6_FILTER_BLOCK       = 0x1
+       sysICMPV6_FILTER_PASS        = 0x2
+       sysICMPV6_FILTER_BLOCKOTHERS = 0x3
+       sysICMPV6_FILTER_PASSONLY    = 0x4
+
+       sysSOL_SOCKET       = 0x1
+       sysSO_ATTACH_FILTER = 0x1a
+
+       sizeofKernelSockaddrStorage = 0x80
+       sizeofSockaddrInet6         = 0x1c
+       sizeofInet6Pktinfo          = 0x14
+       sizeofIPv6Mtuinfo           = 0x20
+       sizeofIPv6FlowlabelReq      = 0x20
+
+       sizeofIPv6Mreq       = 0x14
+       sizeofGroupReq       = 0x84
+       sizeofGroupSourceReq = 0x104
+
+       sizeofICMPv6Filter = 0x20
+
+       sizeofSockFprog = 0x8
+)
+
+type kernelSockaddrStorage struct {
+       Family  uint16
+       X__data [126]int8
+}
+
+type sockaddrInet6 struct {
+       Family   uint16
+       Port     uint16
+       Flowinfo uint32
+       Addr     [16]byte /* in6_addr */
+       Scope_id uint32
+}
+
+type inet6Pktinfo struct {
+       Addr    [16]byte /* in6_addr */
+       Ifindex int32
+}
+
+type ipv6Mtuinfo struct {
+       Addr sockaddrInet6
+       Mtu  uint32
+}
+
+type ipv6FlowlabelReq struct {
+       Dst        [16]byte /* in6_addr */
+       Label      uint32
+       Action     uint8
+       Share      uint8
+       Flags      uint16
+       Expires    uint16
+       Linger     uint16
+       X__flr_pad uint32
+}
+
+type ipv6Mreq struct {
+       Multiaddr [16]byte /* in6_addr */
+       Ifindex   int32
+}
+
+type groupReq struct {
+       Interface uint32
+       Group     kernelSockaddrStorage
+}
+
+type groupSourceReq struct {
+       Interface uint32
+       Group     kernelSockaddrStorage
+       Source    kernelSockaddrStorage
+}
+
+type icmpv6Filter struct {
+       Data [8]uint32
+}
+
+type sockFProg struct {
+       Len       uint16
+       Pad_cgo_0 [2]byte
+       Filter    *sockFilter
+}
+
+type sockFilter struct {
+       Code uint16
+       Jt   uint8
+       Jf   uint8
+       K    uint32
+}
diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_ppc.go b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc.go
new file mode 100644 (file)
index 0000000..c9bf6a8
--- /dev/null
@@ -0,0 +1,170 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_linux.go
+
+package ipv6
+
+const (
+       sysIPV6_ADDRFORM       = 0x1
+       sysIPV6_2292PKTINFO    = 0x2
+       sysIPV6_2292HOPOPTS    = 0x3
+       sysIPV6_2292DSTOPTS    = 0x4
+       sysIPV6_2292RTHDR      = 0x5
+       sysIPV6_2292PKTOPTIONS = 0x6
+       sysIPV6_CHECKSUM       = 0x7
+       sysIPV6_2292HOPLIMIT   = 0x8
+       sysIPV6_NEXTHOP        = 0x9
+       sysIPV6_FLOWINFO       = 0xb
+
+       sysIPV6_UNICAST_HOPS        = 0x10
+       sysIPV6_MULTICAST_IF        = 0x11
+       sysIPV6_MULTICAST_HOPS      = 0x12
+       sysIPV6_MULTICAST_LOOP      = 0x13
+       sysIPV6_ADD_MEMBERSHIP      = 0x14
+       sysIPV6_DROP_MEMBERSHIP     = 0x15
+       sysMCAST_JOIN_GROUP         = 0x2a
+       sysMCAST_LEAVE_GROUP        = 0x2d
+       sysMCAST_JOIN_SOURCE_GROUP  = 0x2e
+       sysMCAST_LEAVE_SOURCE_GROUP = 0x2f
+       sysMCAST_BLOCK_SOURCE       = 0x2b
+       sysMCAST_UNBLOCK_SOURCE     = 0x2c
+       sysMCAST_MSFILTER           = 0x30
+       sysIPV6_ROUTER_ALERT        = 0x16
+       sysIPV6_MTU_DISCOVER        = 0x17
+       sysIPV6_MTU                 = 0x18
+       sysIPV6_RECVERR             = 0x19
+       sysIPV6_V6ONLY              = 0x1a
+       sysIPV6_JOIN_ANYCAST        = 0x1b
+       sysIPV6_LEAVE_ANYCAST       = 0x1c
+
+       sysIPV6_FLOWLABEL_MGR = 0x20
+       sysIPV6_FLOWINFO_SEND = 0x21
+
+       sysIPV6_IPSEC_POLICY = 0x22
+       sysIPV6_XFRM_POLICY  = 0x23
+
+       sysIPV6_RECVPKTINFO  = 0x31
+       sysIPV6_PKTINFO      = 0x32
+       sysIPV6_RECVHOPLIMIT = 0x33
+       sysIPV6_HOPLIMIT     = 0x34
+       sysIPV6_RECVHOPOPTS  = 0x35
+       sysIPV6_HOPOPTS      = 0x36
+       sysIPV6_RTHDRDSTOPTS = 0x37
+       sysIPV6_RECVRTHDR    = 0x38
+       sysIPV6_RTHDR        = 0x39
+       sysIPV6_RECVDSTOPTS  = 0x3a
+       sysIPV6_DSTOPTS      = 0x3b
+       sysIPV6_RECVPATHMTU  = 0x3c
+       sysIPV6_PATHMTU      = 0x3d
+       sysIPV6_DONTFRAG     = 0x3e
+
+       sysIPV6_RECVTCLASS = 0x42
+       sysIPV6_TCLASS     = 0x43
+
+       sysIPV6_ADDR_PREFERENCES = 0x48
+
+       sysIPV6_PREFER_SRC_TMP            = 0x1
+       sysIPV6_PREFER_SRC_PUBLIC         = 0x2
+       sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100
+       sysIPV6_PREFER_SRC_COA            = 0x4
+       sysIPV6_PREFER_SRC_HOME           = 0x400
+       sysIPV6_PREFER_SRC_CGA            = 0x8
+       sysIPV6_PREFER_SRC_NONCGA         = 0x800
+
+       sysIPV6_MINHOPCOUNT = 0x49
+
+       sysIPV6_ORIGDSTADDR     = 0x4a
+       sysIPV6_RECVORIGDSTADDR = 0x4a
+       sysIPV6_TRANSPARENT     = 0x4b
+       sysIPV6_UNICAST_IF      = 0x4c
+
+       sysICMPV6_FILTER = 0x1
+
+       sysICMPV6_FILTER_BLOCK       = 0x1
+       sysICMPV6_FILTER_PASS        = 0x2
+       sysICMPV6_FILTER_BLOCKOTHERS = 0x3
+       sysICMPV6_FILTER_PASSONLY    = 0x4
+
+       sysSOL_SOCKET       = 0x1
+       sysSO_ATTACH_FILTER = 0x1a
+
+       sizeofKernelSockaddrStorage = 0x80
+       sizeofSockaddrInet6         = 0x1c
+       sizeofInet6Pktinfo          = 0x14
+       sizeofIPv6Mtuinfo           = 0x20
+       sizeofIPv6FlowlabelReq      = 0x20
+
+       sizeofIPv6Mreq       = 0x14
+       sizeofGroupReq       = 0x84
+       sizeofGroupSourceReq = 0x104
+
+       sizeofICMPv6Filter = 0x20
+
+       sizeofSockFprog = 0x8
+)
+
+type kernelSockaddrStorage struct {
+       Family  uint16
+       X__data [126]uint8
+}
+
+type sockaddrInet6 struct {
+       Family   uint16
+       Port     uint16
+       Flowinfo uint32
+       Addr     [16]byte /* in6_addr */
+       Scope_id uint32
+}
+
+type inet6Pktinfo struct {
+       Addr    [16]byte /* in6_addr */
+       Ifindex int32
+}
+
+type ipv6Mtuinfo struct {
+       Addr sockaddrInet6
+       Mtu  uint32
+}
+
+type ipv6FlowlabelReq struct {
+       Dst        [16]byte /* in6_addr */
+       Label      uint32
+       Action     uint8
+       Share      uint8
+       Flags      uint16
+       Expires    uint16
+       Linger     uint16
+       X__flr_pad uint32
+}
+
+type ipv6Mreq struct {
+       Multiaddr [16]byte /* in6_addr */
+       Ifindex   int32
+}
+
+type groupReq struct {
+       Interface uint32
+       Group     kernelSockaddrStorage
+}
+
+type groupSourceReq struct {
+       Interface uint32
+       Group     kernelSockaddrStorage
+       Source    kernelSockaddrStorage
+}
+
+type icmpv6Filter struct {
+       Data [8]uint32
+}
+
+type sockFProg struct {
+       Len       uint16
+       Pad_cgo_0 [2]byte
+       Filter    *sockFilter
+}
+
+type sockFilter struct {
+       Code uint16
+       Jt   uint8
+       Jf   uint8
+       K    uint32
+}
diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_s390x.go b/vendor/golang.org/x/net/ipv6/zsys_linux_s390x.go
new file mode 100644 (file)
index 0000000..b64f015
--- /dev/null
@@ -0,0 +1,172 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_linux.go
+
+package ipv6
+
+const (
+       sysIPV6_ADDRFORM       = 0x1
+       sysIPV6_2292PKTINFO    = 0x2
+       sysIPV6_2292HOPOPTS    = 0x3
+       sysIPV6_2292DSTOPTS    = 0x4
+       sysIPV6_2292RTHDR      = 0x5
+       sysIPV6_2292PKTOPTIONS = 0x6
+       sysIPV6_CHECKSUM       = 0x7
+       sysIPV6_2292HOPLIMIT   = 0x8
+       sysIPV6_NEXTHOP        = 0x9
+       sysIPV6_FLOWINFO       = 0xb
+
+       sysIPV6_UNICAST_HOPS        = 0x10
+       sysIPV6_MULTICAST_IF        = 0x11
+       sysIPV6_MULTICAST_HOPS      = 0x12
+       sysIPV6_MULTICAST_LOOP      = 0x13
+       sysIPV6_ADD_MEMBERSHIP      = 0x14
+       sysIPV6_DROP_MEMBERSHIP     = 0x15
+       sysMCAST_JOIN_GROUP         = 0x2a
+       sysMCAST_LEAVE_GROUP        = 0x2d
+       sysMCAST_JOIN_SOURCE_GROUP  = 0x2e
+       sysMCAST_LEAVE_SOURCE_GROUP = 0x2f
+       sysMCAST_BLOCK_SOURCE       = 0x2b
+       sysMCAST_UNBLOCK_SOURCE     = 0x2c
+       sysMCAST_MSFILTER           = 0x30
+       sysIPV6_ROUTER_ALERT        = 0x16
+       sysIPV6_MTU_DISCOVER        = 0x17
+       sysIPV6_MTU                 = 0x18
+       sysIPV6_RECVERR             = 0x19
+       sysIPV6_V6ONLY              = 0x1a
+       sysIPV6_JOIN_ANYCAST        = 0x1b
+       sysIPV6_LEAVE_ANYCAST       = 0x1c
+
+       sysIPV6_FLOWLABEL_MGR = 0x20
+       sysIPV6_FLOWINFO_SEND = 0x21
+
+       sysIPV6_IPSEC_POLICY = 0x22
+       sysIPV6_XFRM_POLICY  = 0x23
+
+       sysIPV6_RECVPKTINFO  = 0x31
+       sysIPV6_PKTINFO      = 0x32
+       sysIPV6_RECVHOPLIMIT = 0x33
+       sysIPV6_HOPLIMIT     = 0x34
+       sysIPV6_RECVHOPOPTS  = 0x35
+       sysIPV6_HOPOPTS      = 0x36
+       sysIPV6_RTHDRDSTOPTS = 0x37
+       sysIPV6_RECVRTHDR    = 0x38
+       sysIPV6_RTHDR        = 0x39
+       sysIPV6_RECVDSTOPTS  = 0x3a
+       sysIPV6_DSTOPTS      = 0x3b
+       sysIPV6_RECVPATHMTU  = 0x3c
+       sysIPV6_PATHMTU      = 0x3d
+       sysIPV6_DONTFRAG     = 0x3e
+
+       sysIPV6_RECVTCLASS = 0x42
+       sysIPV6_TCLASS     = 0x43
+
+       sysIPV6_ADDR_PREFERENCES = 0x48
+
+       sysIPV6_PREFER_SRC_TMP            = 0x1
+       sysIPV6_PREFER_SRC_PUBLIC         = 0x2
+       sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100
+       sysIPV6_PREFER_SRC_COA            = 0x4
+       sysIPV6_PREFER_SRC_HOME           = 0x400
+       sysIPV6_PREFER_SRC_CGA            = 0x8
+       sysIPV6_PREFER_SRC_NONCGA         = 0x800
+
+       sysIPV6_MINHOPCOUNT = 0x49
+
+       sysIPV6_ORIGDSTADDR     = 0x4a
+       sysIPV6_RECVORIGDSTADDR = 0x4a
+       sysIPV6_TRANSPARENT     = 0x4b
+       sysIPV6_UNICAST_IF      = 0x4c
+
+       sysICMPV6_FILTER = 0x1
+
+       sysICMPV6_FILTER_BLOCK       = 0x1
+       sysICMPV6_FILTER_PASS        = 0x2
+       sysICMPV6_FILTER_BLOCKOTHERS = 0x3
+       sysICMPV6_FILTER_PASSONLY    = 0x4
+
+       sysSOL_SOCKET       = 0x1
+       sysSO_ATTACH_FILTER = 0x1a
+
+       sizeofKernelSockaddrStorage = 0x80
+       sizeofSockaddrInet6         = 0x1c
+       sizeofInet6Pktinfo          = 0x14
+       sizeofIPv6Mtuinfo           = 0x20
+       sizeofIPv6FlowlabelReq      = 0x20
+
+       sizeofIPv6Mreq       = 0x14
+       sizeofGroupReq       = 0x88
+       sizeofGroupSourceReq = 0x108
+
+       sizeofICMPv6Filter = 0x20
+
+       sizeofSockFprog = 0x10
+)
+
+type kernelSockaddrStorage struct {
+       Family  uint16
+       X__data [126]int8
+}
+
+type sockaddrInet6 struct {
+       Family   uint16
+       Port     uint16
+       Flowinfo uint32
+       Addr     [16]byte /* in6_addr */
+       Scope_id uint32
+}
+
+type inet6Pktinfo struct {
+       Addr    [16]byte /* in6_addr */
+       Ifindex int32
+}
+
+type ipv6Mtuinfo struct {
+       Addr sockaddrInet6
+       Mtu  uint32
+}
+
+type ipv6FlowlabelReq struct {
+       Dst        [16]byte /* in6_addr */
+       Label      uint32
+       Action     uint8
+       Share      uint8
+       Flags      uint16
+       Expires    uint16
+       Linger     uint16
+       X__flr_pad uint32
+}
+
+type ipv6Mreq struct {
+       Multiaddr [16]byte /* in6_addr */
+       Ifindex   int32
+}
+
+type groupReq struct {
+       Interface uint32
+       Pad_cgo_0 [4]byte
+       Group     kernelSockaddrStorage
+}
+
+type groupSourceReq struct {
+       Interface uint32
+       Pad_cgo_0 [4]byte
+       Group     kernelSockaddrStorage
+       Source    kernelSockaddrStorage
+}
+
+type icmpv6Filter struct {
+       Data [8]uint32
+}
+
+type sockFProg struct {
+       Len       uint16
+       Pad_cgo_0 [6]byte
+       Filter    *sockFilter
+}
+
+type sockFilter struct {
+       Code uint16
+       Jt   uint8
+       Jf   uint8
+       K    uint32
+}