diff options
Diffstat (limited to 'vendor/github.com/google/gopacket/macs/gen.go')
-rw-r--r-- | vendor/github.com/google/gopacket/macs/gen.go | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/vendor/github.com/google/gopacket/macs/gen.go b/vendor/github.com/google/gopacket/macs/gen.go new file mode 100644 index 0000000..ccfcc34 --- /dev/null +++ b/vendor/github.com/google/gopacket/macs/gen.go @@ -0,0 +1,98 @@ +// Copyright 2012 Google, Inc. All rights reserved. +// +// Use of this source code is governed by a BSD-style license +// that can be found in the LICENSE file in the root of the source +// tree. + +// +build ignore + +// This binary pulls the list of known MAC +// prefixes from IEEE and writes them out to a go file which is compiled +// into gopacket. It should be run as follows: +// +// go run gen.go | gofmt > valid_mac_prefixes.go +package main + +import ( + "bufio" + "bytes" + "encoding/hex" + "flag" + "fmt" + "io" + "net/http" + "os" + "regexp" + "sort" + "time" +) + +const header = `// Copyright 2012 Google, Inc. All rights reserved. +// +// Use of this source code is governed by a BSD-style license +// that can be found in the LICENSE file in the root of the source +// tree. + +package macs + +// Created by gen.go, don't edit manually +// Generated at %s +// Fetched from %q + +// ValidMACPrefixMap maps a valid MAC address prefix to the name of the +// organization that owns the rights to use it. We map it to a hidden +// variable so it won't show up in godoc, since it's a very large map. +var ValidMACPrefixMap = validMACPrefixMap +var validMACPrefixMap = map[[3]byte]string{ +` + +var url = flag.String("url", "http://standards.ieee.org/develop/regauth/oui/oui.txt", "URL to fetch MACs from") + +type mac struct { + prefix [3]byte + company string +} + +type macs []mac + +func (m macs) Len() int { return len(m) } +func (m macs) Less(i, j int) bool { return bytes.Compare(m[i].prefix[:], m[j].prefix[:]) < 0 } +func (m macs) Swap(i, j int) { m[i], m[j] = m[j], m[i] } + +func main() { + fmt.Fprintf(os.Stderr, "Fetching MACs from %q\n", *url) + resp, err := http.Get(*url) + if err != nil { + panic(err) + } + defer resp.Body.Close() + buffered := bufio.NewReader(resp.Body) + finder := regexp.MustCompile(`^\s*([0-9A-F]{6})\s+\(base 16\)\s+(.*\S)`) + got := macs{} + for { + line, err := buffered.ReadString('\n') + if err == io.EOF { + break + } else if err != nil { + panic(err) + } + if matches := finder.FindStringSubmatch(line); matches != nil { + var prefix [3]byte + hex.Decode(prefix[:], []byte(matches[1])) + company := matches[2] + if company == "" { + company = "PRIVATE" + } + fmt.Fprint(os.Stderr, "*") + got = append(got, mac{prefix: prefix, company: company}) + } + } + fmt.Fprintln(os.Stderr, "\nSorting macs") + sort.Sort(got) + fmt.Fprintln(os.Stderr, "Starting write to standard output") + fmt.Printf(header, time.Now(), *url) + for _, m := range got { + fmt.Printf("\t[3]byte{%d, %d, %d}: %q,\n", m.prefix[0], m.prefix[1], m.prefix[2], m.company) + } + fmt.Println("}") +} |