diff options
author | Milan Lenco <milan.lenco@pantheon.tech> | 2017-10-11 16:40:58 +0200 |
---|---|---|
committer | Milan Lenco <milan.lenco@pantheon.tech> | 2017-10-13 08:40:37 +0200 |
commit | 3f1edad4e6ba0a7876750aea55507fae14d8badf (patch) | |
tree | a473997249d9ba7deb70b1076d14e4c4ed029a43 /vendor/github.com/google | |
parent | 8b66677c2382a8e739d437621de4473d5ec0b9f1 (diff) |
ODPM 266: Go-libmemif + 2 examples.
Change-Id: Icdb9b9eb2314eff6c96afe7996fcf2728291de4a
Signed-off-by: Milan Lenco <milan.lenco@pantheon.tech>
Diffstat (limited to 'vendor/github.com/google')
165 files changed, 78064 insertions, 0 deletions
diff --git a/vendor/github.com/google/gopacket/.gitignore b/vendor/github.com/google/gopacket/.gitignore new file mode 100644 index 0000000..149266f --- /dev/null +++ b/vendor/github.com/google/gopacket/.gitignore @@ -0,0 +1,38 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe +#* +*~ + +# examples binaries +examples/synscan/synscan +examples/pfdump/pfdump +examples/pcapdump/pcapdump +examples/httpassembly/httpassembly +examples/statsassembly/statsassembly +examples/arpscan/arpscan +examples/bidirectional/bidirectional +examples/bytediff/bytediff +examples/reassemblydump/reassemblydump +layers/gen +macs/gen +pcap/pcap_tester diff --git a/vendor/github.com/google/gopacket/.travis.gofmt.sh b/vendor/github.com/google/gopacket/.travis.gofmt.sh new file mode 100755 index 0000000..e341a1c --- /dev/null +++ b/vendor/github.com/google/gopacket/.travis.gofmt.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +cd "$(dirname $0)" +if [ -n "$(go fmt ./...)" ]; then + echo "Go code is not formatted, run 'go fmt github.com/google/stenographer/...'" >&2 + exit 1 +fi diff --git a/vendor/github.com/google/gopacket/.travis.golint.sh b/vendor/github.com/google/gopacket/.travis.golint.sh new file mode 100755 index 0000000..ed74c65 --- /dev/null +++ b/vendor/github.com/google/gopacket/.travis.golint.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +cd "$(dirname $0)" + +go get github.com/golang/lint/golint +DIRS=". tcpassembly tcpassembly/tcpreader ip4defrag reassembly macs pcapgo pcap afpacket pfring routing" +# Add subdirectories here as we clean up golint on each. +for subdir in $DIRS; do + pushd $subdir + if golint | + grep -v CannotSetRFMon | # pcap exported error name + grep -v DataLost | # tcpassembly/tcpreader exported error name + grep .; then + exit 1 + fi + popd +done + +pushd layers +for file in $(cat .linted); do + if golint $file | grep .; then + exit 1 + fi +done +popd diff --git a/vendor/github.com/google/gopacket/.travis.govet.sh b/vendor/github.com/google/gopacket/.travis.govet.sh new file mode 100755 index 0000000..52ad084 --- /dev/null +++ b/vendor/github.com/google/gopacket/.travis.govet.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +cd "$(dirname $0)" +DIRS=". layers pcap pcapgo pfring tcpassembly tcpassembly/tcpreader routing ip4defrag bytediff macs" +set -e +for subdir in $DIRS; do + pushd $subdir + go vet + popd +done diff --git a/vendor/github.com/google/gopacket/.travis.yml b/vendor/github.com/google/gopacket/.travis.yml new file mode 100644 index 0000000..7d73126 --- /dev/null +++ b/vendor/github.com/google/gopacket/.travis.yml @@ -0,0 +1,14 @@ +language: go +install: + - go get github.com/google/gopacket + - go get github.com/google/gopacket/layers + - go get github.com/google/gopacket/tcpassembly + - go get github.com/google/gopacket/reassembly +script: + - go test github.com/google/gopacket + - go test github.com/google/gopacket/layers + - go test github.com/google/gopacket/tcpassembly + - go test github.com/google/gopacket/reassembly + - ./.travis.gofmt.sh + - ./.travis.govet.sh + - ./.travis.golint.sh diff --git a/vendor/github.com/google/gopacket/AUTHORS b/vendor/github.com/google/gopacket/AUTHORS new file mode 100644 index 0000000..eba34f0 --- /dev/null +++ b/vendor/github.com/google/gopacket/AUTHORS @@ -0,0 +1,46 @@ +AUTHORS AND MAINTAINERS: + +MAIN DEVELOPERS: +Graeme Connell <gconnell@google.com, gsconnell@gmail.com> + +AUTHORS: +Nigel Tao <nigeltao@google.com> +Cole Mickens <cole.mickens@gmail.com> +Ben Daglish <bdaglish@restorepoint.com> +Luis Martinez <martinezlc99@gmail.com> +Remco Verhoef <remco@dutchcoders.io> +Hiroaki Kawai <Hiroaki.Kawai@gmail.com> +Lukas Lueg <lukas.lueg@gmail.com> +Laurent Hausermann <laurent.hausermann@gmail.com> +Bill Green <bgreen@newrelic.com> + +CONTRIBUTORS: +Attila Oláh <attila@attilaolah.eu> +Vittus Mikiassen <matt.miki.vimik@gmail.com> +Matthias Radestock <matthias.radestock@gmail.com> +Matthew Sackman <matthew@wellquite.org> +Loic Prylli <loicp@google.com> +Alexandre Fiori <fiorix@gmail.com> +Adrian Tam <adrian.c.m.tam@gmail.com> +Satoshi Matsumoto <kaorimatz@gmail.com> +David Stainton <dstainton415@gmail.com> +Jesse Ward <jesse@jesseward.com> +Kane Mathers <kane@kanemathers.name> + +----------------------------------------------- +FORKED FROM github.com/akrennmair/gopcap +ALL THE FOLLOWING ARE FOR THAT PROJECT + +MAIN DEVELOPERS: +Andreas Krennmair <ak@synflood.at> + +CONTRIBUTORS: +Andrea Nall <anall@andreanall.com> +Daniel Arndt <danielarndt@gmail.com> +Dustin Sallings <dustin@spy.net> +Graeme Connell <gconnell@google.com, gsconnell@gmail.com> +Guillaume Savary <guillaume@savary.name> +Mark Smith <mark@qq.is> +Miek Gieben <miek@miek.nl> +Mike Bell <mike@mikebell.org> +Trevor Strohman <strohman@google.com> diff --git a/vendor/github.com/google/gopacket/CONTRIBUTING.md b/vendor/github.com/google/gopacket/CONTRIBUTING.md new file mode 100644 index 0000000..99ab7a2 --- /dev/null +++ b/vendor/github.com/google/gopacket/CONTRIBUTING.md @@ -0,0 +1,215 @@ +Contributing To gopacket +======================== + +So you've got some code and you'd like it to be part of gopacket... wonderful! +We're happy to accept contributions, whether they're fixes to old protocols, new +protocols entirely, or anything else you think would improve the gopacket +library. This document is designed to help you to do just that. + +The first section deals with the plumbing: how to actually get a change +submitted. + +The second section deals with coding style... Go is great in that it +has a uniform style implemented by 'go fmt', but there's still some decisions +we've made that go above and beyond, and if you follow them, they won't come up +in your code review. + +The third section deals with some of the implementation decisions we've made, +which may help you to understand the current code and which we may ask you to +conform to (or provide compelling reasons for ignoring). + +Overall, we hope this document will help you to understand our system and write +great code which fits in, and help us to turn around on your code review quickly +so the code can make it into the master branch as quickly as possible. + + +How To Submit Code +------------------ + +We use github.com's Pull Request feature to receive code contributions from +external contributors. See +https://help.github.com/articles/creating-a-pull-request/ for details on +how to create a request. + +Also, there's a local script `gc` in the base directory of GoPacket that +runs a local set of checks, which should give you relatively high confidence +that your pull won't fail github pull checks. + +```sh +go get github.com/google/gopacket +cd $GOROOT/src/pkg/github.com/google/gopacket +git checkout -b <mynewfeature> # create a new branch to work from +... code code code ... +./gc # Run this to do local commits, it performs a number of checks +``` + +To sum up: + +* DO + + Pull down the latest version. + + Make a feature-specific branch. + + Code using the style and methods discussed in the rest of this document. + + Use the ./gc command to do local commits or check correctness. + + Push your new feature branch up to github.com, as a pull request. + + Handle comments and requests from reviewers, pushing new commits up to + your feature branch as problems are addressed. + + Put interesting comments and discussions into commit comments. +* DON'T + + Push to someone else's branch without their permission. + + +Coding Style +------------ + +* Go code must be run through `go fmt`, `go vet`, and `golint` +* Follow http://golang.org/doc/effective_go.html as much as possible. + + In particular, http://golang.org/doc/effective_go.html#mixed-caps. Enums + should be be CamelCase, with acronyms capitalized (TCPSourcePort, vs. + TcpSourcePort or TCP_SOURCE_PORT). +* Bonus points for giving enum types a String() field. +* Any exported types or functions should have commentary + (http://golang.org/doc/effective_go.html#commentary) + + +Coding Methods And Implementation Notes +--------------------------------------- + +### Error Handling + +Many times, you'll be decoding a protocol and run across something bad, a packet +corruption or the like. How do you handle this? First off, ALWAYS report the +error. You can do this either by returning the error from the decode() function +(most common), or if you're up for it you can implement and add an ErrorLayer +through the packet builder (the first method is a simple shortcut that does +exactly this, then stops any future decoding). + +Often, you'll already have decode some part of your protocol by the time you hit +your error. Use your own discretion to determine whether the stuff you've +already decoded should be returned to the caller or not: + +```go +func decodeMyProtocol(data []byte, p gopacket.PacketBuilder) error { + prot := &MyProtocol{} + if len(data) < 10 { + // This error occurred before we did ANYTHING, so there's nothing in my + // protocol that the caller could possibly want. Just return the error. + return fmt.Errorf("Length %d less than 10", len(data)) + } + prot.ImportantField1 = data[:5] + prot.ImportantField2 = data[5:10] + // At this point, we've already got enough information in 'prot' to + // warrant returning it to the caller, so we'll add it now. + p.AddLayer(prot) + if len(data) < 15 { + // We encountered an error later in the packet, but the caller already + // has the important info we've gleaned so far. + return fmt.Errorf("Length %d less than 15", len(data)) + } + prot.ImportantField3 = data[10:15] + return nil // We've already added the layer, we can just return success. +} +``` + +In general, our code follows the approach of returning the first error it +encounters. In general, we don't trust any bytes after the first error we see. + +### What Is A Layer? + +The definition of a layer is up to the discretion of the coder. It should be +something important enough that it's actually useful to the caller (IE: every +TLV value should probably NOT be a layer). However, it can be more granular +than a single protocol... IPv6 and SCTP both implement many layers to handle the +various parts of the protocol. Use your best judgement, and prepare to defend +your decisions during code review. ;) + +### Performance + +We strive to make gopacket as fast as possible while still providing lots of +features. In general, this means: + +* Focus performance tuning on common protocols (IP4/6, TCP, etc), and optimize + others on an as-needed basis (tons of MPLS on your network? Time to optimize + MPLS!) +* Use fast operations. See the toplevel benchmark_test for benchmarks of some + of Go's underlying features and types. +* Test your performance changes! You should use the ./gc script's --benchmark + flag to submit any performance-related changes. Use pcap/gopacket_benchmark + to test your change against a PCAP file based on your traffic patterns. +* Don't be TOO hacky. Sometimes, removing an unused struct from a field causes + a huge performance hit, due to the way that Go currently handles its segmented + stack... don't be afraid to clean it up anyway. We'll trust the Go compiler + to get good enough over time to handle this. Also, this type of + compiler-specific optimization is very fragile; someone adding a field to an + entirely different struct elsewhere in the codebase could reverse any gains + you might achieve by aligning your allocations. +* Try to minimize memory allocations. If possible, use []byte to reference + pieces of the input, instead of using string, which requires copying the bytes + into a new memory allocation. +* Think hard about what should be evaluated lazily vs. not. In general, a + layer's struct should almost exactly mirror the layer's frame. Anything + that's more interesting should be a function. This may not always be + possible, but it's a good rule of thumb. +* Don't fear micro-optimizations. With the above in mind, we welcome + micro-optimizations that we think will have positive/neutral impacts on the + majority of workloads. A prime example of this is pre-allocating certain + structs within a larger one: + +```go +type MyProtocol struct { + // Most packets have 1-4 of VeryCommon, so we preallocate it here. + initialAllocation [4]uint32 + VeryCommon []uint32 +} + +func decodeMyProtocol(data []byte, p gopacket.PacketBuilder) error { + prot := &MyProtocol{} + prot.VeryCommon = proto.initialAllocation[:0] + for len(data) > 4 { + field := binary.BigEndian.Uint32(data[:4]) + data = data[4:] + // Since we're using the underlying initialAllocation, we won't need to + // allocate new memory for the following append unless we more than 16 + // bytes of data, which should be the uncommon case. + prot.VeryCommon = append(prot.VeryCommon, field) + } + p.AddLayer(prot) + if len(data) > 0 { + return fmt.Errorf("MyProtocol packet has %d bytes left after decoding", len(data)) + } + return nil +} +``` + +### Slices And Data + +If you're pulling a slice from the data you're decoding, don't copy it. Just +use the slice itself. + +```go +type MyProtocol struct { + A, B net.IP +} +func decodeMyProtocol(data []byte, p gopacket.PacketBuilder) error { + p.AddLayer(&MyProtocol{ + A: data[:4], + B: data[4:8], + }) + return nil +} +``` + +The caller has already agreed, by using this library, that they won't modify the +set of bytes they pass in to the decoder, or the library has already copied the +set of bytes to a read-only location. See DecodeOptions.NoCopy for more +information. + +### Enums/Types + +If a protocol has an integer field (uint8, uint16, etc) with a couple of known +values that mean something special, make it a type. This allows us to do really +nice things like adding a String() function to them, so we can more easily +display those to users. Check out layers/enums.go for one example, as well as +layers/icmp.go for layer-specific enums. + +When naming things, try for descriptiveness over suscinctness. For example, +choose DNSResponseRecord over DNSRR. diff --git a/vendor/github.com/google/gopacket/LICENSE b/vendor/github.com/google/gopacket/LICENSE new file mode 100644 index 0000000..2100d52 --- /dev/null +++ b/vendor/github.com/google/gopacket/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2012 Google, Inc. All rights reserved. +Copyright (c) 2009-2011 Andreas Krennmair. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Andreas Krennmair, Google, nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/google/gopacket/README.md b/vendor/github.com/google/gopacket/README.md new file mode 100644 index 0000000..f71854c --- /dev/null +++ b/vendor/github.com/google/gopacket/README.md @@ -0,0 +1,10 @@ +# GoPacket + +This library provides packet decoding capabilities for Go. +See [godoc](https://godoc.org/github.com/google/gopacket) for more details. + +[![Build Status](https://travis-ci.org/google/gopacket.svg?branch=master)](https://travis-ci.org/google/gopacket) +[![GoDoc](https://godoc.org/github.com/google/gopacket?status.svg)](https://godoc.org/github.com/google/gopacket) + +Originally forked from the gopcap project written by Andreas +Krennmair <ak@synflood.at> (http://github.com/akrennmair/gopcap). diff --git a/vendor/github.com/google/gopacket/afpacket/afpacket.go b/vendor/github.com/google/gopacket/afpacket/afpacket.go new file mode 100644 index 0000000..13937c1 --- /dev/null +++ b/vendor/github.com/google/gopacket/afpacket/afpacket.go @@ -0,0 +1,476 @@ +// 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 linux + +// Package afpacket provides Go bindings for MMap'd AF_PACKET socket reading. +package afpacket + +// Couldn't have done this without: +// http://lxr.free-electrons.com/source/Documentation/networking/packet_mmap.txt +// http://codemonkeytips.blogspot.co.uk/2011/07/asynchronous-packet-socket-reading-with.html + +import ( + "errors" + "fmt" + "net" + "runtime" + "sync" + "sync/atomic" + "time" + "unsafe" + + "golang.org/x/net/bpf" + "golang.org/x/sys/unix" + + "github.com/google/gopacket" +) + +/* +#include <linux/if_packet.h> // AF_PACKET, sockaddr_ll +#include <linux/if_ether.h> // ETH_P_ALL +#include <sys/socket.h> // socket() +#include <unistd.h> // close() +#include <arpa/inet.h> // htons() +#include <sys/mman.h> // mmap(), munmap() +#include <poll.h> // poll() +*/ +import "C" + +var pageSize = unix.Getpagesize() +var tpacketAlignment = uint(C.TPACKET_ALIGNMENT) + +// ErrPoll returned by poll +var ErrPoll = errors.New("packet poll failed") + +// ErrTimeout returned on poll timeout +var ErrTimeout = errors.New("packet poll timeout expired") + +func tpacketAlign(v int) int { + return int((uint(v) + tpacketAlignment - 1) & ((^tpacketAlignment) - 1)) +} + +// Stats is a set of counters detailing the work TPacket has done so far. +type Stats struct { + // Packets is the total number of packets returned to the caller. + Packets int64 + // Polls is the number of blocking syscalls made waiting for packets. + // This should always be <= Packets, since with TPacket one syscall + // can (and often does) return many results. + Polls int64 +} + +// SocketStats is a struct where socket stats are stored +type SocketStats C.struct_tpacket_stats + +// SocketStatsV3 is a struct where socket stats for TPacketV3 are stored +type SocketStatsV3 C.struct_tpacket_stats_v3 + +// TPacket implements packet receiving for Linux AF_PACKET versions 1, 2, and 3. +type TPacket struct { + // fd is the C file descriptor. + fd int + // ring points to the memory space of the ring buffer shared by tpacket and the kernel. + ring []byte + // rawring is the unsafe pointer that we use to poll for packets + rawring unsafe.Pointer + // opts contains read-only options for the TPacket object. + opts options + mu sync.Mutex // guards below + // offset is the offset into the ring of the current header. + offset int + // current is the current header. + current header + // pollset is used by TPacket for its poll() call. + pollset unix.PollFd + // shouldReleasePacket is set to true whenever we return packet data, to make sure we remember to release that data back to the kernel. + shouldReleasePacket bool + // headerNextNeeded is set to true when header need to move to the next packet. No need to move it case of poll error. + headerNextNeeded bool + // tpVersion is the version of TPacket actually in use, set by setRequestedTPacketVersion. + tpVersion OptTPacketVersion + // Hackity hack hack hack. We need to return a pointer to the header with + // getTPacketHeader, and we don't want to allocate a v3wrapper every time, + // so we leave it in the TPacket object and return a pointer to it. + v3 v3wrapper + + statsMu sync.Mutex // guards stats below + // stats is simple statistics on TPacket's run. + stats Stats + // socketStats contains stats from the socket + socketStats SocketStats + // same as socketStats, but with an extra field freeze_q_cnt + socketStatsV3 SocketStatsV3 +} + +var _ gopacket.ZeroCopyPacketDataSource = &TPacket{} + +// bindToInterface binds the TPacket socket to a particular named interface. +func (h *TPacket) bindToInterface(ifaceName string) error { + ifIndex := 0 + // An empty string here means to listen to all interfaces + if ifaceName != "" { + iface, err := net.InterfaceByName(ifaceName) + if err != nil { + return fmt.Errorf("InterfaceByName: %v", err) + } + ifIndex = iface.Index + } + s := &unix.SockaddrLinklayer{ + Protocol: htons(uint16(unix.ETH_P_ALL)), + Ifindex: ifIndex, + } + return unix.Bind(h.fd, s) +} + +// setTPacketVersion asks the kernel to set TPacket to a particular version, and returns an error on failure. +func (h *TPacket) setTPacketVersion(version OptTPacketVersion) error { + if err := unix.SetsockoptInt(h.fd, unix.SOL_PACKET, unix.PACKET_VERSION, int(version)); err != nil { + return fmt.Errorf("setsockopt packet_version: %v", err) + } + return nil +} + +// setRequestedTPacketVersion tries to set TPacket to the requested version or versions. +func (h *TPacket) setRequestedTPacketVersion() error { + switch { + case (h.opts.version == TPacketVersionHighestAvailable || h.opts.version == TPacketVersion3) && h.setTPacketVersion(TPacketVersion3) == nil: + h.tpVersion = TPacketVersion3 + case (h.opts.version == TPacketVersionHighestAvailable || h.opts.version == TPacketVersion2) && h.setTPacketVersion(TPacketVersion2) == nil: + h.tpVersion = TPacketVersion2 + case (h.opts.version == TPacketVersionHighestAvailable || h.opts.version == TPacketVersion1) && h.setTPacketVersion(TPacketVersion1) == nil: + h.tpVersion = TPacketVersion1 + default: + return errors.New("no known tpacket versions work on this machine") + } + return nil +} + +// setUpRing sets up the shared-memory ring buffer between the user process and the kernel. +func (h *TPacket) setUpRing() (err error) { + totalSize := int(h.opts.framesPerBlock * h.opts.numBlocks * h.opts.frameSize) + switch h.tpVersion { + case TPacketVersion1, TPacketVersion2: + var tp C.struct_tpacket_req + tp.tp_block_size = C.uint(h.opts.blockSize) + tp.tp_block_nr = C.uint(h.opts.numBlocks) + tp.tp_frame_size = C.uint(h.opts.frameSize) + tp.tp_frame_nr = C.uint(h.opts.framesPerBlock * h.opts.numBlocks) + if err := setsockopt(h.fd, unix.SOL_PACKET, unix.PACKET_RX_RING, unsafe.Pointer(&tp), unsafe.Sizeof(tp)); err != nil { + return fmt.Errorf("setsockopt packet_rx_ring: %v", err) + } + case TPacketVersion3: + var tp C.struct_tpacket_req3 + tp.tp_block_size = C.uint(h.opts.blockSize) + tp.tp_block_nr = C.uint(h.opts.numBlocks) + tp.tp_frame_size = C.uint(h.opts.frameSize) + tp.tp_frame_nr = C.uint(h.opts.framesPerBlock * h.opts.numBlocks) + tp.tp_retire_blk_tov = C.uint(h.opts.blockTimeout / time.Millisecond) + if err := setsockopt(h.fd, unix.SOL_PACKET, unix.PACKET_RX_RING, unsafe.Pointer(&tp), unsafe.Sizeof(tp)); err != nil { + return fmt.Errorf("setsockopt packet_rx_ring v3: %v", err) + } + default: + return errors.New("invalid tpVersion") + } + h.ring, err = unix.Mmap(h.fd, 0, totalSize, unix.PROT_READ|unix.PROT_WRITE, unix.MAP_SHARED) + if err != nil { + return err + } + if h.ring == nil { + return errors.New("no ring") + } + h.rawring = unsafe.Pointer(&h.ring[0]) + return nil +} + +// Close cleans up the TPacket. It should not be used after the Close call. +func (h *TPacket) Close() { + if h.fd == -1 { + return // already closed. + } + if h.ring != nil { + unix.Munmap(h.ring) + } + h.ring = nil + unix.Close(h.fd) + h.fd = -1 + runtime.SetFinalizer(h, nil) +} + +// NewTPacket returns a new TPacket object for reading packets off the wire. +// Its behavior may be modified by passing in any/all of afpacket.Opt* to this +// function. +// If this function succeeds, the user should be sure to Close the returned +// TPacket when finished with it. +func NewTPacket(opts ...interface{}) (h *TPacket, err error) { + h = &TPacket{} + if h.opts, err = parseOptions(opts...); err != nil { + return nil, err + } + fd, err := unix.Socket(unix.AF_PACKET, int(h.opts.socktype), int(htons(unix.ETH_P_ALL))) + if err != nil { + return nil, err + } + h.fd = fd + if err = h.bindToInterface(h.opts.iface); err != nil { + goto errlbl + } + if err = h.setRequestedTPacketVersion(); err != nil { + goto errlbl + } + if err = h.setUpRing(); err != nil { + goto errlbl + } + // Clear stat counter from socket + if err = h.InitSocketStats(); err != nil { + goto errlbl + } + runtime.SetFinalizer(h, (*TPacket).Close) + return h, nil +errlbl: + h.Close() + return nil, err +} + +// SetBPF attaches a BPF filter to the underlying socket +func (h *TPacket) SetBPF(filter []bpf.RawInstruction) error { + var p unix.SockFprog + if len(filter) > int(^uint16(0)) { + return errors.New("filter too large") + } + p.Len = uint16(len(filter)) + p.Filter = (*unix.SockFilter)(unsafe.Pointer(&filter[0])) + + return setsockopt(h.fd, unix.SOL_SOCKET, unix.SO_ATTACH_FILTER, unsafe.Pointer(&p), unix.SizeofSockFprog) +} + +func (h *TPacket) releaseCurrentPacket() error { + h.current.clearStatus() + h.offset++ + h.shouldReleasePacket = false + return nil +} + +// ZeroCopyReadPacketData reads the next packet off the wire, and returns its data. +// The slice returned by ZeroCopyReadPacketData points to bytes owned by the +// TPacket. Each call to ZeroCopyReadPacketData invalidates any data previously +// returned by ZeroCopyReadPacketData. Care must be taken not to keep pointers +// to old bytes when using ZeroCopyReadPacketData... if you need to keep data past +// the next time you call ZeroCopyReadPacketData, use ReadPacketData, which copies +// the bytes into a new buffer for you. +// tp, _ := NewTPacket(...) +// data1, _, _ := tp.ZeroCopyReadPacketData() +// // do everything you want with data1 here, copying bytes out of it if you'd like to keep them around. +// data2, _, _ := tp.ZeroCopyReadPacketData() // invalidates bytes in data1 +func (h *TPacket) ZeroCopyReadPacketData() (data []byte, ci gopacket.CaptureInfo, err error) { + h.mu.Lock() +retry: + if h.current == nil || !h.headerNextNeeded || !h.current.next() { + if h.shouldReleasePacket { + h.releaseCurrentPacket() + } + h.current = h.getTPacketHeader() + if err = h.pollForFirstPacket(h.current); err != nil { + h.headerNextNeeded = false + h.mu.Unlock() + return + } + // We received an empty block + if h.current.getLength() == 0 { + goto retry + } + } + data = h.current.getData() + ci.Timestamp = h.current.getTime() + ci.CaptureLength = len(data) + ci.Length = h.current.getLength() + ci.InterfaceIndex = h.current.getIfaceIndex() + atomic.AddInt64(&h.stats.Packets, 1) + h.headerNextNeeded = true + h.mu.Unlock() + + return +} + +// Stats returns statistics on the packets the TPacket has seen so far. +func (h *TPacket) Stats() (Stats, error) { + return Stats{ + Polls: atomic.LoadInt64(&h.stats.Polls), + Packets: atomic.LoadInt64(&h.stats.Packets), + }, nil +} + +// InitSocketStats clears socket counters and return empty stats. +func (h *TPacket) InitSocketStats() error { + if h.tpVersion == TPacketVersion3 { + socklen := unsafe.Sizeof(h.socketStatsV3) + slt := C.socklen_t(socklen) + var ssv3 SocketStatsV3 + + err := getsockopt(h.fd, unix.SOL_PACKET, unix.PACKET_STATISTICS, unsafe.Pointer(&ssv3), uintptr(unsafe.Pointer(&slt))) + if err != nil { + return err + } + h.socketStatsV3 = SocketStatsV3{} + } else { + socklen := unsafe.Sizeof(h.socketStats) + slt := C.socklen_t(socklen) + var ss SocketStats + + err := getsockopt(h.fd, unix.SOL_PACKET, unix.PACKET_STATISTICS, unsafe.Pointer(&ss), uintptr(unsafe.Pointer(&slt))) + if err != nil { + return err + } + h.socketStats = SocketStats{} + } + return nil +} + +// SocketStats saves stats from the socket to the TPacket instance. +func (h *TPacket) SocketStats() (SocketStats, SocketStatsV3, error) { + h.statsMu.Lock() + defer h.statsMu.Unlock() + // We need to save the counters since asking for the stats will clear them + if h.tpVersion == TPacketVersion3 { + socklen := unsafe.Sizeof(h.socketStatsV3) + slt := C.socklen_t(socklen) + var ssv3 SocketStatsV3 + + err := getsockopt(h.fd, unix.SOL_PACKET, unix.PACKET_STATISTICS, unsafe.Pointer(&ssv3), uintptr(unsafe.Pointer(&slt))) + if err != nil { + return SocketStats{}, SocketStatsV3{}, err + } + + h.socketStatsV3.tp_packets += ssv3.tp_packets + h.socketStatsV3.tp_drops += ssv3.tp_drops + h.socketStatsV3.tp_freeze_q_cnt += ssv3.tp_freeze_q_cnt + return h.socketStats, h.socketStatsV3, nil + } + socklen := unsafe.Sizeof(h.socketStats) + slt := C.socklen_t(socklen) + var ss SocketStats + + err := getsockopt(h.fd, unix.SOL_PACKET, unix.PACKET_STATISTICS, unsafe.Pointer(&ss), uintptr(unsafe.Pointer(&slt))) + if err != nil { + return SocketStats{}, SocketStatsV3{}, err + } + + h.socketStats.tp_packets += ss.tp_packets + h.socketStats.tp_drops += ss.tp_drops + return h.socketStats, h.socketStatsV3, nil +} + +// ReadPacketDataTo reads packet data into a user-supplied buffer. +// This function reads up to the length of the passed-in slice. +// The number of bytes read into data will be returned in ci.CaptureLength, +// which is the minimum of the size of the passed-in buffer and the size of +// the captured packet. +func (h *TPacket) ReadPacketDataTo(data []byte) (ci gopacket.CaptureInfo, err error) { + var d []byte + d, ci, err = h.ZeroCopyReadPacketData() + if err != nil { + return + } + ci.CaptureLength = copy(data, d) + return +} + +// ReadPacketData reads the next packet, copies it into a new buffer, and returns +// that buffer. Since the buffer is allocated by ReadPacketData, it is safe for long-term +// use. This implements gopacket.PacketDataSource. +func (h *TPacket) ReadPacketData() (data []byte, ci gopacket.CaptureInfo, err error) { + var d []byte + d, ci, err = h.ZeroCopyReadPacketData() + if err != nil { + return + } + data = make([]byte, len(d)) + copy(data, d) + return +} + +func (h *TPacket) getTPacketHeader() header { + switch h.tpVersion { + case TPacketVersion1: + if h.offset >= h.opts.framesPerBlock*h.opts.numBlocks { + h.offset = 0 + } + position := uintptr(h.rawring) + uintptr(h.opts.frameSize*h.offset) + return (*v1header)(unsafe.Pointer(position)) + case TPacketVersion2: + if h.offset >= h.opts.framesPerBlock*h.opts.numBlocks { + h.offset = 0 + } + position := uintptr(h.rawring) + uintptr(h.opts.frameSize*h.offset) + return (*v2header)(unsafe.Pointer(position)) + case TPacketVersion3: + // TPacket3 uses each block to return values, instead of each frame. Hence we need to rotate when we hit #blocks, not #frames. + if h.offset >= h.opts.numBlocks { + h.offset = 0 + } + position := uintptr(h.rawring) + uintptr(h.opts.frameSize*h.offset*h.opts.framesPerBlock) + h.v3 = initV3Wrapper(unsafe.Pointer(position)) + return &h.v3 + } + panic("handle tpacket version is invalid") +} + +func (h *TPacket) pollForFirstPacket(hdr header) error { + tm := int(h.opts.pollTimeout / time.Millisecond) + for hdr.getStatus()&C.TP_STATUS_USER == 0 { + h.pollset.Fd = int32(h.fd) + h.pollset.Events = unix.POLLIN + h.pollset.Revents = 0 + n, err := unix.Poll([]unix.PollFd{h.pollset}, tm) + if n == 0 { + return ErrTimeout + } + + atomic.AddInt64(&h.stats.Polls, 1) + if h.pollset.Revents&unix.POLLERR > 0 { + return ErrPoll + } + if err != nil { + return err + } + } + + h.shouldReleasePacket = true + return nil +} + +// FanoutType determines the type of fanout to use with a TPacket SetFanout call. +type FanoutType int + +// FanoutType values. +const ( + FanoutHash FanoutType = 0 + // It appears that defrag only works with FanoutHash, see: + // http://lxr.free-electrons.com/source/net/packet/af_packet.c#L1204 + FanoutHashWithDefrag FanoutType = 0x8000 + FanoutLoadBalance FanoutType = 1 + FanoutCPU FanoutType = 2 +) + +// SetFanout activates TPacket's fanout ability. +// Use of Fanout requires creating multiple TPacket objects and the same id/type to +// a SetFanout call on each. Note that this can be done cross-process, so if two +// different processes both call SetFanout with the same type/id, they'll share +// packets between them. The same should work for multiple TPacket objects within +// the same process. +func (h *TPacket) SetFanout(t FanoutType, id uint16) error { + h.mu.Lock() + defer h.mu.Unlock() + arg := C.int(t) << 16 + arg |= C.int(id) + return setsockopt(h.fd, unix.SOL_PACKET, unix.PACKET_FANOUT, unsafe.Pointer(&arg), unsafe.Sizeof(arg)) +} + +// WritePacketData transmits a raw packet. +func (h *TPacket) WritePacketData(pkt []byte) error { + _, err := unix.Write(h.fd, pkt) + return err +} diff --git a/vendor/github.com/google/gopacket/afpacket/afpacket_test.go b/vendor/github.com/google/gopacket/afpacket/afpacket_test.go new file mode 100644 index 0000000..57f6480 --- /dev/null +++ b/vendor/github.com/google/gopacket/afpacket/afpacket_test.go @@ -0,0 +1,40 @@ +// 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 linux + +package afpacket + +import ( + "reflect" + "testing" +) + +func TestParseOptions(t *testing.T) { + wanted1 := defaultOpts + wanted1.frameSize = 1 << 10 + wanted1.framesPerBlock = wanted1.blockSize / wanted1.frameSize + for i, test := range []struct { + opts []interface{} + want options + err bool + }{ + {opts: []interface{}{OptBlockSize(2)}, err: true}, + {opts: []interface{}{OptFrameSize(333)}, err: true}, + {opts: []interface{}{OptTPacketVersion(-3)}, err: true}, + {opts: []interface{}{OptTPacketVersion(5)}, err: true}, + {opts: []interface{}{OptFrameSize(1 << 10)}, want: wanted1}, + } { + got, err := parseOptions(test.opts...) + t.Logf("got: %#v\nerr: %v", got, err) + if test.err && err == nil || !test.err && err != nil { + t.Errorf("%d error mismatch, want error? %v. error: %v", i, test.err, err) + } + if !test.err && !reflect.DeepEqual(test.want, got) { + t.Errorf("%d opts mismatch, want\n%#v", i, test.want) + } + } +} diff --git a/vendor/github.com/google/gopacket/afpacket/header.go b/vendor/github.com/google/gopacket/afpacket/header.go new file mode 100644 index 0000000..0b9918e --- /dev/null +++ b/vendor/github.com/google/gopacket/afpacket/header.go @@ -0,0 +1,158 @@ +// 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 linux + +package afpacket + +import ( + "reflect" + "time" + "unsafe" +) + +// #include <linux/if_packet.h> +import "C" + +// Our model of handling all TPacket versions is a little hacky, to say the +// least. We use the header interface to handle interactions with the +// tpacket1/tpacket2 packet header AND the tpacket3 block header. The big +// difference is that tpacket3's block header implements the next() call to get +// the next packet within the block, while v1/v2 just always return false. + +type header interface { + // getStatus returns the TPacket status of the current header. + getStatus() int + // clearStatus clears the status of the current header, releasing its + // underlying data back to the kernel for future use with new packets. + // Using the header after calling clearStatus is an error. clearStatus + // should only be called after next() returns false. + clearStatus() + // getTime returns the timestamp for the current packet pointed to by + // the header. + getTime() time.Time + // getData returns the packet data pointed to by the current header. + getData() []byte + // getLength returns the total length of the packet. + getLength() int + // getIfaceIndex returns the index of the network interface + // where the packet was seen. The index can later be translated to a name. + getIfaceIndex() int + // next moves this header to point to the next packet it contains, + // returning true on success (in which case getTime and getData will + // return values for the new packet) or false if there are no more + // packets (in which case clearStatus should be called). + next() bool +} + +func tpAlign(x int) int { + return int((uint(x) + tpacketAlignment - 1) &^ (tpacketAlignment - 1)) +} + +type v1header C.struct_tpacket_hdr +type v2header C.struct_tpacket2_hdr + +func makeSlice(start uintptr, length int) (data []byte) { + slice := (*reflect.SliceHeader)(unsafe.Pointer(&data)) + slice.Data = start + slice.Len = length + slice.Cap = length + return +} + +func (h *v1header) getStatus() int { + return int(h.tp_status) +} +func (h *v1header) clearStatus() { + h.tp_status = 0 +} +func (h *v1header) getTime() time.Time { + return time.Unix(int64(h.tp_sec), int64(h.tp_usec)*1000) +} +func (h *v1header) getData() []byte { + return makeSlice(uintptr(unsafe.Pointer(h))+uintptr(h.tp_mac), int(h.tp_snaplen)) +} +func (h *v1header) getLength() int { + return int(h.tp_len) +} +func (h *v1header) getIfaceIndex() int { + ll := (*C.struct_sockaddr_ll)(unsafe.Pointer(uintptr(unsafe.Pointer(h)) + uintptr(tpAlign(int(C.sizeof_struct_tpacket_hdr))))) + return int(ll.sll_ifindex) +} +func (h *v1header) next() bool { + return false +} + +func (h *v2header) getStatus() int { + return int(h.tp_status) +} +func (h *v2header) clearStatus() { + h.tp_status = 0 +} +func (h *v2header) getTime() time.Time { + return time.Unix(int64(h.tp_sec), int64(h.tp_nsec)) +} +func (h *v2header) getData() []byte { + return makeSlice(uintptr(unsafe.Pointer(h))+uintptr(h.tp_mac), int(h.tp_snaplen)) +} +func (h *v2header) getLength() int { + return int(h.tp_len) +} +func (h *v2header) getIfaceIndex() int { + ll := (*C.struct_sockaddr_ll)(unsafe.Pointer(uintptr(unsafe.Pointer(h)) + uintptr(tpAlign(int(C.sizeof_struct_tpacket2_hdr))))) + return int(ll.sll_ifindex) +} +func (h *v2header) next() bool { + return false +} + +type v3wrapper struct { + block *C.struct_tpacket_block_desc + blockhdr *C.struct_tpacket_hdr_v1 + packet *C.struct_tpacket3_hdr + used C.__u32 +} + +func initV3Wrapper(block unsafe.Pointer) (w v3wrapper) { + w.block = (*C.struct_tpacket_block_desc)(block) + w.blockhdr = (*C.struct_tpacket_hdr_v1)(unsafe.Pointer(&w.block.hdr[0])) + w.packet = (*C.struct_tpacket3_hdr)(unsafe.Pointer(uintptr(block) + uintptr(w.blockhdr.offset_to_first_pkt))) + return +} +func (w *v3wrapper) getStatus() int { + return int(w.blockhdr.block_status) +} +func (w *v3wrapper) clearStatus() { + w.blockhdr.block_status = 0 +} +func (w *v3wrapper) getTime() time.Time { + return time.Unix(int64(w.packet.tp_sec), int64(w.packet.tp_nsec)) +} +func (w *v3wrapper) getData() []byte { + return makeSlice(uintptr(unsafe.Pointer(w.packet))+uintptr(w.packet.tp_mac), int(w.packet.tp_snaplen)) +} +func (w *v3wrapper) getLength() int { + return int(w.packet.tp_len) +} +func (w *v3wrapper) getIfaceIndex() int { + ll := (*C.struct_sockaddr_ll)(unsafe.Pointer(uintptr(unsafe.Pointer(w.packet)) + uintptr(tpAlign(int(C.sizeof_struct_tpacket3_hdr))))) + return int(ll.sll_ifindex) +} +func (w *v3wrapper) next() bool { + w.used++ + if w.used >= w.blockhdr.num_pkts { + return false + } + + next := uintptr(unsafe.Pointer(w.packet)) + if w.packet.tp_next_offset != 0 { + next += uintptr(w.packet.tp_next_offset) + } else { + next += uintptr(tpacketAlign(int(w.packet.tp_snaplen) + int(w.packet.tp_mac))) + } + w.packet = (*C.struct_tpacket3_hdr)(unsafe.Pointer(next)) + return true +} diff --git a/vendor/github.com/google/gopacket/afpacket/options.go b/vendor/github.com/google/gopacket/afpacket/options.go new file mode 100644 index 0000000..c5ab771 --- /dev/null +++ b/vendor/github.com/google/gopacket/afpacket/options.go @@ -0,0 +1,171 @@ +// 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 linux + +package afpacket + +import ( + "errors" + "fmt" + "time" +) + +// #include <linux/if_packet.h> +// #include <sys/socket.h> +import "C" + +// OptTPacketVersion is the version of TPacket to use. +// It can be passed into NewTPacket. +type OptTPacketVersion int + +// String returns a string representation of the version, generally of the form V#. +func (t OptTPacketVersion) String() string { + switch t { + case TPacketVersion1: + return "V1" + case TPacketVersion2: + return "V2" + case TPacketVersion3: + return "V3" + case TPacketVersionHighestAvailable: + return "HighestAvailable" + } + return "InvalidVersion" +} + +// OptSocketType is the socket type used to open the TPacket socket. +type OptSocketType int + +func (t OptSocketType) String() string { + switch t { + case SocketRaw: + return "SOCK_RAW" + case SocketDgram: + return "SOCK_DGRAM" + } + return "UnknownSocketType" +} + +// TPacket version numbers for use with NewHandle. +const ( + // TPacketVersionHighestAvailable tells NewHandle to use the highest available version of tpacket the kernel has available. + // This is the default, should a version number not be given in NewHandle's options. + TPacketVersionHighestAvailable = OptTPacketVersion(-1) + TPacketVersion1 = OptTPacketVersion(C.TPACKET_V1) + TPacketVersion2 = OptTPacketVersion(C.TPACKET_V2) + TPacketVersion3 = OptTPacketVersion(C.TPACKET_V3) + tpacketVersionMax = TPacketVersion3 + tpacketVersionMin = -1 + // SocketRaw is the default socket type. It returns packet data + // including the link layer (ethernet headers, etc). + SocketRaw = OptSocketType(C.SOCK_RAW) + // SocketDgram strips off the link layer when reading packets, and adds + // the link layer back automatically on packet writes (coming soon...) + SocketDgram = OptSocketType(C.SOCK_DGRAM) +) + +// OptInterface is the specific interface to bind to. +// It can be passed into NewTPacket. +type OptInterface string + +// OptFrameSize is TPacket's tp_frame_size +// It can be passed into NewTPacket. +type OptFrameSize int + +// OptBlockSize is TPacket's tp_block_size +// It can be passed into NewTPacket. +type OptBlockSize int + +// OptNumBlocks is TPacket's tp_block_nr +// It can be passed into NewTPacket. +type OptNumBlocks int + +// OptBlockTimeout is TPacket v3's tp_retire_blk_tov. Note that it has only millisecond granularity, so must be >= 1 ms. +// It can be passed into NewTPacket. +type OptBlockTimeout time.Duration + +// OptPollTimeout is the number of milliseconds that poll() should block waiting for a file +// descriptor to become ready. Specifying a negative value in time‐out means an infinite timeout. +type OptPollTimeout time.Duration + +// Default constants used by options. +const ( + DefaultFrameSize = 4096 // Default value for OptFrameSize. + DefaultBlockSize = DefaultFrameSize * 128 // Default value for OptBlockSize. + DefaultNumBlocks = 128 // Default value for OptNumBlocks. + DefaultBlockTimeout = 64 * time.Millisecond // Default value for OptBlockTimeout. + DefaultPollTimeout = -1 * time.Millisecond // Default value for OptPollTimeout. This blocks forever. +) + +type options struct { + frameSize int + framesPerBlock int + blockSize int + numBlocks int + blockTimeout time.Duration + pollTimeout time.Duration + version OptTPacketVersion + socktype OptSocketType + iface string +} + +var defaultOpts = options{ + frameSize: DefaultFrameSize, + blockSize: DefaultBlockSize, + numBlocks: DefaultNumBlocks, + blockTimeout: DefaultBlockTimeout, + pollTimeout: DefaultPollTimeout, + version: TPacketVersionHighestAvailable, + socktype: SocketRaw, +} + +func parseOptions(opts ...interface{}) (ret options, err error) { + ret = defaultOpts + for _, opt := range opts { + switch v := opt.(type) { + case OptFrameSize: + ret.frameSize = int(v) + case OptBlockSize: + ret.blockSize = int(v) + case OptNumBlocks: + ret.numBlocks = int(v) + case OptBlockTimeout: + ret.blockTimeout = time.Duration(v) + case OptPollTimeout: + ret.pollTimeout = time.Duration(v) + case OptTPacketVersion: + ret.version = v + case OptInterface: + ret.iface = string(v) + case OptSocketType: + ret.socktype = v + default: + err = errors.New("unknown type in options") + return + } + } + if err = ret.check(); err != nil { + return + } + ret.framesPerBlock = ret.blockSize / ret.frameSize + return +} +func (o options) check() error { + switch { + case o.blockSize%pageSize != 0: + return fmt.Errorf("block size %d must be divisible by page size %d", o.blockSize, pageSize) + case o.blockSize%o.frameSize != 0: + return fmt.Errorf("block size %d must be divisible by frame size %d", o.blockSize, o.frameSize) + case o.numBlocks < 1: + return fmt.Errorf("num blocks %d must be >= 1", o.numBlocks) + case o.blockTimeout < time.Millisecond: + return fmt.Errorf("block timeout %v must be > %v", o.blockTimeout, time.Millisecond) + case o.version < tpacketVersionMin || o.version > tpacketVersionMax: + return fmt.Errorf("tpacket version %v is invalid", o.version) + } + return nil +} diff --git a/vendor/github.com/google/gopacket/afpacket/sockopt_linux.go b/vendor/github.com/google/gopacket/afpacket/sockopt_linux.go new file mode 100644 index 0000000..c53e1cc --- /dev/null +++ b/vendor/github.com/google/gopacket/afpacket/sockopt_linux.go @@ -0,0 +1,58 @@ +// 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 linux + +package afpacket + +import ( + "unsafe" + + "golang.org/x/sys/unix" +) + +// setsockopt provides access to the setsockopt syscall. +func setsockopt(fd, level, name int, val unsafe.Pointer, vallen uintptr) error { + _, _, errno := unix.Syscall6( + unix.SYS_SETSOCKOPT, + uintptr(fd), + uintptr(level), + uintptr(name), + uintptr(val), + vallen, + 0, + ) + if errno != 0 { + return error(errno) + } + + return nil +} + +// getsockopt provides access to the getsockopt syscall. +func getsockopt(fd, level, name int, val unsafe.Pointer, vallen uintptr) error { + _, _, errno := unix.Syscall6( + unix.SYS_GETSOCKOPT, + uintptr(fd), + uintptr(level), + uintptr(name), + uintptr(val), + vallen, + 0, + ) + if errno != 0 { + return error(errno) + } + + return nil +} + +// htons converts a short (uint16) from host-to-network byte order. +// Thanks to mikioh for this neat trick: +// https://github.com/mikioh/-stdyng/blob/master/afpacket.go +func htons(i uint16) uint16 { + return (i<<8)&0xff00 | i>>8 +} diff --git a/vendor/github.com/google/gopacket/afpacket/sockopt_linux_386.go b/vendor/github.com/google/gopacket/afpacket/sockopt_linux_386.go new file mode 100644 index 0000000..8c3eb42 --- /dev/null +++ b/vendor/github.com/google/gopacket/afpacket/sockopt_linux_386.go @@ -0,0 +1,57 @@ +// 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 linux,386 + +package afpacket + +import ( + "unsafe" + + "golang.org/x/sys/unix" +) + +const ( + sysSETSOCKOPT = 0xe + sysGETSOCKOPT = 0xf +) + +func socketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (int, unix.Errno) + +// setsockopt provides access to the setsockopt syscall. +func setsockopt(fd, level, name int, v unsafe.Pointer, l uintptr) error { + _, errno := socketcall( + sysSETSOCKOPT, + uintptr(fd), + uintptr(level), + uintptr(name), + uintptr(v), + l, + 0, + ) + if errno != 0 { + return error(errno) + } + + return nil +} + +func getsockopt(fd, level, name int, v unsafe.Pointer, l uintptr) error { + _, errno := socketcall( + sysGETSOCKOPT, + uintptr(fd), + uintptr(level), + uintptr(name), + uintptr(v), + l, + 0, + ) + if errno != 0 { + return error(errno) + } + + return nil +} diff --git a/vendor/github.com/google/gopacket/afpacket/sockopt_linux_386.s b/vendor/github.com/google/gopacket/afpacket/sockopt_linux_386.s new file mode 100644 index 0000000..7d0336a --- /dev/null +++ b/vendor/github.com/google/gopacket/afpacket/sockopt_linux_386.s @@ -0,0 +1,8 @@ +// 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. + +TEXT ·socketcall(SB),4,$0-36 + JMP syscall·socketcall(SB)
\ No newline at end of file diff --git a/vendor/github.com/google/gopacket/base.go b/vendor/github.com/google/gopacket/base.go new file mode 100644 index 0000000..797b55f --- /dev/null +++ b/vendor/github.com/google/gopacket/base.go @@ -0,0 +1,178 @@ +// 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 gopacket + +import ( + "fmt" +) + +// Layer represents a single decoded packet layer (using either the +// OSI or TCP/IP definition of a layer). When decoding, a packet's data is +// broken up into a number of layers. The caller may call LayerType() to +// figure out which type of layer they've received from the packet. Optionally, +// they may then use a type assertion to get the actual layer type for deep +// inspection of the data. +type Layer interface { + // LayerType is the gopacket type for this layer. + LayerType() LayerType + // LayerContents returns the set of bytes that make up this layer. + LayerContents() []byte + // LayerPayload returns the set of bytes contained within this layer, not + // including the layer itself. + LayerPayload() []byte +} + +// Payload is a Layer containing the payload of a packet. The definition of +// what constitutes the payload of a packet depends on previous layers; for +// TCP and UDP, we stop decoding above layer 4 and return the remaining +// bytes as a Payload. Payload is an ApplicationLayer. +type Payload []byte + +// LayerType returns LayerTypePayload +func (p Payload) LayerType() LayerType { return LayerTypePayload } + +// LayerContents returns the bytes making up this layer. +func (p Payload) LayerContents() []byte { return []byte(p) } + +// LayerPayload returns the payload within this layer. +func (p Payload) LayerPayload() []byte { return nil } + +// Payload returns this layer as bytes. +func (p Payload) Payload() []byte { return []byte(p) } + +// String implements fmt.Stringer. +func (p Payload) String() string { return fmt.Sprintf("%d byte(s)", len(p)) } + +// GoString implements fmt.GoStringer. +func (p Payload) GoString() string { return LongBytesGoString([]byte(p)) } + +// CanDecode implements DecodingLayer. +func (p Payload) CanDecode() LayerClass { return LayerTypePayload } + +// NextLayerType implements DecodingLayer. +func (p Payload) NextLayerType() LayerType { return LayerTypeZero } + +// DecodeFromBytes implements DecodingLayer. +func (p *Payload) DecodeFromBytes(data []byte, df DecodeFeedback) error { + *p = Payload(data) + return nil +} + +// SerializeTo writes the serialized form of this layer into the +// SerializationBuffer, implementing gopacket.SerializableLayer. +// See the docs for gopacket.SerializableLayer for more info. +func (p Payload) SerializeTo(b SerializeBuffer, opts SerializeOptions) error { + bytes, err := b.PrependBytes(len(p)) + if err != nil { + return err + } + copy(bytes, p) + return nil +} + +// decodePayload decodes data by returning it all in a Payload layer. +func decodePayload(data []byte, p PacketBuilder) error { + payload := &Payload{} + if err := payload.DecodeFromBytes(data, p); err != nil { + return nil + } + p.AddLayer(payload) + p.SetApplicationLayer(payload) + return nil +} + +// Fragment is a Layer containing a fragment of a larger frame, used by layers +// like IPv4 and IPv6 that allow for fragmentation of their payloads. +type Fragment []byte + +// LayerType returns LayerTypeFragment +func (p *Fragment) LayerType() LayerType { return LayerTypeFragment } + +// LayerContents implements Layer. +func (p *Fragment) LayerContents() []byte { return []byte(*p) } + +// LayerPayload implements Layer. +func (p *Fragment) LayerPayload() []byte { return nil } + +// Payload returns this layer as a byte slice. +func (p *Fragment) Payload() []byte { return []byte(*p) } + +// String implements fmt.Stringer. +func (p *Fragment) String() string { return fmt.Sprintf("%d byte(s)", len(*p)) } + +// CanDecode implements DecodingLayer. +func (p *Fragment) CanDecode() LayerClass { return LayerTypeFragment } + +// NextLayerType implements DecodingLayer. +func (p *Fragment) NextLayerType() LayerType { return LayerTypeZero } + +// DecodeFromBytes implements DecodingLayer. +func (p *Fragment) DecodeFromBytes(data []byte, df DecodeFeedback) error { + *p = Fragment(data) + return nil +} + +// SerializeTo writes the serialized form of this layer into the +// SerializationBuffer, implementing gopacket.SerializableLayer. +// See the docs for gopacket.SerializableLayer for more info. +func (p *Fragment) SerializeTo(b SerializeBuffer, opts SerializeOptions) error { + bytes, err := b.PrependBytes(len(*p)) + if err != nil { + return err + } + copy(bytes, *p) + return nil +} + +// decodeFragment decodes data by returning it all in a Fragment layer. +func decodeFragment(data []byte, p PacketBuilder) error { + payload := &Fragment{} + if err := payload.DecodeFromBytes(data, p); err != nil { + return nil + } + p.AddLayer(payload) + p.SetApplicationLayer(payload) + return nil +} + +// These layers correspond to Internet Protocol Suite (TCP/IP) layers, and their +// corresponding OSI layers, as best as possible. + +// LinkLayer is the packet layer corresponding to TCP/IP layer 1 (OSI layer 2) +type LinkLayer interface { + Layer + LinkFlow() Flow +} + +// NetworkLayer is the packet layer corresponding to TCP/IP layer 2 (OSI +// layer 3) +type NetworkLayer interface { + Layer + NetworkFlow() Flow +} + +// TransportLayer is the packet layer corresponding to the TCP/IP layer 3 (OSI +// layer 4) +type TransportLayer interface { + Layer + TransportFlow() Flow +} + +// ApplicationLayer is the packet layer corresponding to the TCP/IP layer 4 (OSI +// layer 7), also known as the packet payload. +type ApplicationLayer interface { + Layer + Payload() []byte +} + +// ErrorLayer is a packet layer created when decoding of the packet has failed. +// Its payload is all the bytes that we were unable to decode, and the returned +// error details why the decoding failed. +type ErrorLayer interface { + Layer + Error() error +} diff --git a/vendor/github.com/google/gopacket/benchmark_test.go b/vendor/github.com/google/gopacket/benchmark_test.go new file mode 100644 index 0000000..74a1d28 --- /dev/null +++ b/vendor/github.com/google/gopacket/benchmark_test.go @@ -0,0 +1,194 @@ +// 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 gopacket + +import ( + "runtime" + "testing" +) + +// A few benchmarks for figuring out exactly how fast some underlying Go +// things are. + +type testError struct{} + +func (t *testError) Error() string { return "abc" } + +func BenchmarkTypeAssertion(b *testing.B) { + var e error = &testError{} + for i := 0; i < b.N; i++ { + _, _ = e.(*testError) + } +} + +func BenchmarkMapLookup(b *testing.B) { + m := map[LayerType]bool{ + LayerTypePayload: true, + } + for i := 0; i < b.N; i++ { + _ = m[LayerTypePayload] + } +} + +func BenchmarkNilMapLookup(b *testing.B) { + var m map[LayerType]bool + for i := 0; i < b.N; i++ { + _ = m[LayerTypePayload] + } +} + +func BenchmarkNilMapLookupWithNilCheck(b *testing.B) { + var m map[LayerType]bool + for i := 0; i < b.N; i++ { + if m != nil { + _ = m[LayerTypePayload] + } + } +} + +func BenchmarkArrayLookup(b *testing.B) { + m := make([]bool, 100) + for i := 0; i < b.N; i++ { + _ = m[LayerTypePayload] + } +} + +var testError1 = &testError{} +var testError2 error = testError1 + +func BenchmarkTypeToInterface1(b *testing.B) { + var e error + for i := 0; i < b.N; i++ { + e = testError1 + } + // Have to do someting with 'e' or the compiler complains about an unused + // variable. + testError2 = e +} +func BenchmarkTypeToInterface2(b *testing.B) { + var e error + for i := 0; i < b.N; i++ { + e = testError2 + } + // Have to do someting with 'e' or the compiler complains about an unused + // variable. + testError2 = e +} + +var decodeOpts DecodeOptions + +func decodeOptsByValue(_ DecodeOptions) {} +func decodeOptsByPointer(_ *DecodeOptions) {} +func BenchmarkPassDecodeOptionsByValue(b *testing.B) { + for i := 0; i < b.N; i++ { + decodeOptsByValue(decodeOpts) + } +} +func BenchmarkPassDecodeOptionsByPointer(b *testing.B) { + for i := 0; i < b.N; i++ { + decodeOptsByPointer(&decodeOpts) + } +} + +func BenchmarkLockOSThread(b *testing.B) { + for i := 0; i < b.N; i++ { + runtime.LockOSThread() + } +} +func BenchmarkUnlockOSThread(b *testing.B) { + for i := 0; i < b.N; i++ { + runtime.UnlockOSThread() + } +} +func lockUnlock() { + runtime.LockOSThread() + runtime.UnlockOSThread() +} +func lockDeferUnlock() { + runtime.LockOSThread() + defer runtime.UnlockOSThread() +} +func BenchmarkLockUnlockOSThread(b *testing.B) { + for i := 0; i < b.N; i++ { + lockUnlock() + } +} +func BenchmarkLockDeferUnlockOSThread(b *testing.B) { + for i := 0; i < b.N; i++ { + lockDeferUnlock() + } +} + +func BenchmarkUnbufferedChannel(b *testing.B) { + ca := make(chan bool) + cb := make(chan bool) + defer close(ca) + go func() { + defer close(cb) + for _ = range ca { + cb <- true + } + }() + for i := 0; i < b.N; i++ { + ca <- true + <-cb + } +} +func BenchmarkSmallBufferedChannel(b *testing.B) { + ca := make(chan bool, 1) + cb := make(chan bool, 1) + defer close(ca) + go func() { + defer close(cb) + for _ = range ca { + cb <- true + } + }() + for i := 0; i < b.N; i++ { + ca <- true + <-cb + } +} +func BenchmarkLargeBufferedChannel(b *testing.B) { + ca := make(chan bool, 1000) + cb := make(chan bool, 1000) + defer close(ca) + go func() { + defer close(cb) + for _ = range ca { + cb <- true + } + }() + for i := 0; i < b.N; i++ { + ca <- true + <-cb + } +} +func BenchmarkEndpointFastHashShort(b *testing.B) { + e := Endpoint{typ: 1, len: 2} + for i := 0; i < b.N; i++ { + e.FastHash() + } +} +func BenchmarkEndpointFastHashLong(b *testing.B) { + e := Endpoint{typ: 1, len: 16} + for i := 0; i < b.N; i++ { + e.FastHash() + } +} +func BenchmarkFlowFastHashShort(b *testing.B) { + e := Flow{typ: 1, slen: 2, dlen: 2} + for i := 0; i < b.N; i++ { + e.FastHash() + } +} +func BenchmarkFlowFastHashLong(b *testing.B) { + e := Flow{typ: 1, slen: 16, dlen: 16} + for i := 0; i < b.N; i++ { + e.FastHash() + } +} diff --git a/vendor/github.com/google/gopacket/bsdbpf/bsd_bpf_sniffer.go b/vendor/github.com/google/gopacket/bsdbpf/bsd_bpf_sniffer.go new file mode 100644 index 0000000..3e1da0b --- /dev/null +++ b/vendor/github.com/google/gopacket/bsdbpf/bsd_bpf_sniffer.go @@ -0,0 +1,215 @@ +// 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 darwin dragonfly freebsd netbsd openbsd + +package bsdbpf + +import ( + "errors" + "fmt" + "syscall" + "time" + "unsafe" + + "github.com/google/gopacket" + "golang.org/x/sys/unix" +) + +const wordSize = int(unsafe.Sizeof(uintptr(0))) + +func bpfWordAlign(x int) int { + return (((x) + (wordSize - 1)) &^ (wordSize - 1)) +} + +// Options is used to configure various properties of the BPF sniffer. +// Default values are used when a nil Options pointer is passed to NewBPFSniffer. +type Options struct { + // BPFDeviceName is name of the bpf device to use for sniffing + // the network device. The default value of BPFDeviceName is empty string + // which causes the first available BPF device file /dev/bpfX to be used. + BPFDeviceName string + // ReadBufLen specifies the size of the buffer used to read packets + // off the wire such that multiple packets are buffered with each read syscall. + // Note that an individual packet larger than the buffer size is necessarily truncated. + // A larger buffer should increase performance because fewer read syscalls would be made. + // If zero is used, the system's default buffer length will be used which depending on the + // system may default to 4096 bytes which is not big enough to accomodate some link layers + // such as WLAN (802.11). + // ReadBufLen defaults to 32767... however typical BSD manual pages for BPF indicate that + // if the requested buffer size cannot be accommodated, the closest allowable size will be + // set and returned... hence our GetReadBufLen method. + ReadBufLen int + // Timeout is the length of time to wait before timing out on a read request. + // Timeout defaults to nil which means no timeout is used. + Timeout *syscall.Timeval + // Promisc is set to true for promiscuous mode ethernet sniffing. + // Promisc defaults to true. + Promisc bool + // Immediate is set to true to make our read requests return as soon as a packet becomes available. + // Otherwise, a read will block until either the kernel buffer becomes full or a timeout occurs. + // The default is true. + Immediate bool + // PreserveLinkAddr is set to false if the link level source address should be filled in automatically + // by the interface output routine. Set to true if the link level source address will be written, + // as provided, to the wire. + // The default is true. + PreserveLinkAddr bool +} + +var defaultOptions = Options{ + BPFDeviceName: "", + ReadBufLen: 32767, + Timeout: nil, + Promisc: true, + Immediate: true, + PreserveLinkAddr: true, +} + +// BPFSniffer is a struct used to track state of a BSD BPF ethernet sniffer +// such that gopacket's PacketDataSource interface is implemented. +type BPFSniffer struct { + options *Options + sniffDeviceName string + fd int + readBuffer []byte + lastReadLen int + readBytesConsumed int +} + +// NewBPFSniffer is used to create BSD-only BPF ethernet sniffer +// iface is the network interface device name that you wish to sniff +// options can set to nil in order to utilize default values for everything. +// Each field of Options also have a default setting if left unspecified by +// the user's custome Options struct. +func NewBPFSniffer(iface string, options *Options) (*BPFSniffer, error) { + var err error + enable := 1 + sniffer := BPFSniffer{ + sniffDeviceName: iface, + } + if options == nil { + sniffer.options = &defaultOptions + } else { + sniffer.options = options + } + + if sniffer.options.BPFDeviceName == "" { + sniffer.pickBpfDevice() + } + + // setup our read buffer + if sniffer.options.ReadBufLen == 0 { + sniffer.options.ReadBufLen, err = syscall.BpfBuflen(sniffer.fd) + if err != nil { + return nil, err + } + } else { + sniffer.options.ReadBufLen, err = syscall.SetBpfBuflen(sniffer.fd, sniffer.options.ReadBufLen) + if err != nil { + return nil, err + } + } + sniffer.readBuffer = make([]byte, sniffer.options.ReadBufLen) + + err = syscall.SetBpfInterface(sniffer.fd, sniffer.sniffDeviceName) + if err != nil { + return nil, err + } + + if sniffer.options.Immediate { + // turn immediate mode on. This makes the snffer non-blocking. + err = syscall.SetBpfImmediate(sniffer.fd, enable) + if err != nil { + return nil, err + } + } + + // the above call to syscall.SetBpfImmediate needs to be made + // before setting a timer otherwise the reads will block for the + // entire timer duration even if there are packets to return. + if sniffer.options.Timeout != nil { + err = syscall.SetBpfTimeout(sniffer.fd, sniffer.options.Timeout) + if err != nil { + return nil, err + } + } + + if sniffer.options.PreserveLinkAddr { + // preserves the link level source address... + // higher level protocol analyzers will not need this + err = syscall.SetBpfHeadercmpl(sniffer.fd, enable) + if err != nil { + return nil, err + } + } + + if sniffer.options.Promisc { + // forces the interface into promiscuous mode + err = syscall.SetBpfPromisc(sniffer.fd, enable) + if err != nil { + return nil, err + } + } + + return &sniffer, nil +} + +// Close is used to close the file-descriptor of the BPF device file. +func (b *BPFSniffer) Close() error { + return syscall.Close(b.fd) +} + +func (b *BPFSniffer) pickBpfDevice() { + var err error + b.options.BPFDeviceName = "" + for i := 0; i < 99; i++ { + b.options.BPFDeviceName = fmt.Sprintf("/dev/bpf%d", i) + b.fd, err = syscall.Open(b.options.BPFDeviceName, syscall.O_RDWR, 0) + if err == nil { + return + } + } + panic("failed to acquire a BPF device for read-write access") +} + +func (b *BPFSniffer) ReadPacketData() ([]byte, gopacket.CaptureInfo, error) { + var err error + if b.readBytesConsumed >= b.lastReadLen { + b.readBytesConsumed = 0 + b.readBuffer = make([]byte, b.options.ReadBufLen) + b.lastReadLen, err = syscall.Read(b.fd, b.readBuffer) + if err != nil { + b.lastReadLen = 0 + return nil, gopacket.CaptureInfo{}, err + } + } + hdr := (*unix.BpfHdr)(unsafe.Pointer(&b.readBuffer[b.readBytesConsumed])) + frameStart := b.readBytesConsumed + int(hdr.Hdrlen) + b.readBytesConsumed += bpfWordAlign(int(hdr.Hdrlen) + int(hdr.Caplen)) + + if frameStart+int(hdr.Caplen) > len(b.readBuffer) { + captureInfo := gopacket.CaptureInfo{ + Timestamp: time.Unix(int64(hdr.Tstamp.Sec), int64(hdr.Tstamp.Usec)*1000), + CaptureLength: 0, + Length: 0, + } + return nil, captureInfo, errors.New("BPF captured frame received with corrupted BpfHdr struct.") + } + + rawFrame := b.readBuffer[frameStart : frameStart+int(hdr.Caplen)] + captureInfo := gopacket.CaptureInfo{ + Timestamp: time.Unix(int64(hdr.Tstamp.Sec), int64(hdr.Tstamp.Usec)*1000), + CaptureLength: len(rawFrame), + Length: len(rawFrame), + } + return rawFrame, captureInfo, nil +} + +// GetReadBufLen returns the BPF read buffer length +func (b *BPFSniffer) GetReadBufLen() int { + return b.options.ReadBufLen +} diff --git a/vendor/github.com/google/gopacket/bytediff/bytediff.go b/vendor/github.com/google/gopacket/bytediff/bytediff.go new file mode 100644 index 0000000..63addd9 --- /dev/null +++ b/vendor/github.com/google/gopacket/bytediff/bytediff.go @@ -0,0 +1,217 @@ +// 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 bytediff provides a simple diff utility for looking at differences in byte +// slices. It's slow, clunky, and not particularly good by any measure, but +// it does provide very useful visualizations for diffs between small byte +// slices. +// +// Our diff algorithm uses a dynamic programming implementation of longest common +// substring to find matching parts of slices, then recursively calls itself on +// the prefix/suffix of that matching part for each packet. This is a Bad Idea +// (tm) for normal (especially large) input, but for packets where large portions +// repeat frequently and we expect minor changes between results, it's actually +// quite useful. +package bytediff + +import ( + "bytes" + "fmt" +) + +// OutputFormat tells a Differences.String call how to format the set of +// differences into a human-readable string. Its internals are currently +// unexported because we may want to change them drastically in the future. For +// the moment, please just use one of the provided OutputFormats that comes with +// this library. +type OutputFormat struct { + start, finish, add, remove, change, reset string +} + +var ( + // BashOutput uses bash escape sequences to color output. + BashOutput = &OutputFormat{ + reset: "\033[0m", + remove: "\033[32m", + add: "\033[31m", + change: "\033[33m", + } + // HTMLOutput uses a <pre> to wrap output, and <span>s to color it. + // HTMLOutput is pretty experimental, so use at your own risk ;) + HTMLOutput = &OutputFormat{ + start: "<pre>", + finish: "</pre>", + reset: "</span>", + remove: "<span style='color:red'>", + add: "<span style='color:green'>", + change: "<span style='color:yellow'>", + } +) + +// longestCommonSubstring uses a O(MN) dynamic programming approach to find the +// longest common substring in a set of slices. It returns the index in each +// slice at which the substring begins, plus the length of the commonality. +func longestCommonSubstring(strA, strB []byte) (indexA, indexB, length int) { + lenA, lenB := len(strA), len(strB) + if lenA == 0 || lenB == 0 { + return 0, 0, 0 + } + arr := make([][]int, lenA) + for i := 0; i < lenA; i++ { + arr[i] = make([]int, lenB) + } + var maxLength int + var maxA, maxB int + for a := 0; a < lenA; a++ { + for b := 0; b < lenB; b++ { + if strA[a] == strB[b] { + length := 1 + if a > 0 && b > 0 { + length = arr[a-1][b-1] + 1 + } + arr[a][b] = length + if length > maxLength { + maxLength = length + maxA = a + maxB = b + } + } + } + } + a, b := maxA, maxB + for a >= 0 && b >= 0 && strA[a] == strB[b] { + indexA = a + indexB = b + a-- + b-- + length++ + } + return +} + +func intMax(a, b int) int { + if a > b { + return a + } + return b +} + +// Difference represents a single part of the data being diffed, containing +// information about both the original and new values. +// From and To are the sets of bytes in the original and the new byte slice. +// !Replace implies From == To (no change) +// len(To) == 0 implies From is being deleted +// len(From) == 0 implies To is being inserted +// else implies From is being replaced by To +type Difference struct { + Replace bool + From, To []byte +} + +// color returns the bash color for a given difference. +func (c *OutputFormat) color(d Difference) string { + switch { + case !d.Replace: + return "" + case len(d.From) == 0: + return c.remove + case len(d.To) == 0: + return c.add + default: + return c.change + } +} + +// Diff diffs strA and strB, returning a list of differences which +// can be used to construct either the original or new string. +// +// Diff is optimized for comparing VERY SHORT slices. It's meant for comparing +// things like packets off the wire, not large files or the like. +// As such, its runtime can be catastrophic if large inputs are passed in. +// You've been warned. +func Diff(strA, strB []byte) Differences { + if len(strA) == 0 && len(strB) == 0 { + return nil + } + ia, ib, l := longestCommonSubstring(strA, strB) + if l == 0 { + return Differences{ + Difference{true, strA, strB}, + } + } + beforeA, match, afterA := strA[:ia], strA[ia:ia+l], strA[ia+l:] + beforeB, afterB := strB[:ib], strB[ib+l:] + var diffs Differences + diffs = append(diffs, Diff(beforeA, beforeB)...) + diffs = append(diffs, Difference{false, match, match}) + diffs = append(diffs, Diff(afterA, afterB)...) + return diffs +} + +// Differences is a set of differences for a given diff'd pair of byte slices. +type Differences []Difference + +// String outputs a previously diff'd set of strings, showing differences +// between them, highlighted by colors. +// +// The output format of this function is NOT guaranteed consistent, and may be +// changed at any time by the library authors. It's meant solely for human +// consumption. +func (c *OutputFormat) String(diffs Differences) string { + var buf bytes.Buffer + count := 0 + fmt.Fprintf(&buf, "%s", c.start) + fmt.Fprintf(&buf, "00000000 ") + for i := 0; i < len(diffs); i++ { + diff := diffs[i] + color := c.color(diff) + reset := "" + if color != "" { + reset = c.reset + } + fmt.Fprint(&buf, color) + for _, b := range diff.From { + fmt.Fprintf(&buf, " %02x", b) + count++ + switch count % 16 { + case 0: + fmt.Fprintf(&buf, "%v\n%08x%v ", reset, count, color) + case 8: + fmt.Fprintf(&buf, " ") + } + } + fmt.Fprint(&buf, reset) + } + fmt.Fprintf(&buf, "\n\n00000000 ") + count = 0 + for i := 0; i < len(diffs); i++ { + diff := diffs[i] + str := diff.From + if diff.Replace { + str = diff.To + } + color := c.color(diff) + reset := "" + if color != "" { + reset = c.reset + } + fmt.Fprint(&buf, color) + for _, b := range str { + fmt.Fprintf(&buf, " %02x", b) + count++ + switch count % 16 { + case 0: + fmt.Fprintf(&buf, "%v\n%08x%v ", reset, count, color) + case 8: + fmt.Fprintf(&buf, " ") + } + } + fmt.Fprint(&buf, reset) + } + fmt.Fprint(&buf, "\n") + fmt.Fprintf(&buf, "%s", c.finish) + return string(buf.Bytes()) +} diff --git a/vendor/github.com/google/gopacket/bytediff/bytediff_test.go b/vendor/github.com/google/gopacket/bytediff/bytediff_test.go new file mode 100644 index 0000000..022ad4b --- /dev/null +++ b/vendor/github.com/google/gopacket/bytediff/bytediff_test.go @@ -0,0 +1,53 @@ +// 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 bytediff + +import ( + "reflect" + "testing" +) + +func TestLCS(t *testing.T) { + for i, test := range []struct { + a, b []byte + indexA, indexB, length int + }{ + {[]byte{1, 2, 3}, []byte{1, 2, 3}, 0, 0, 3}, + {[]byte{0, 1, 2, 3}, []byte{1, 2, 3, 4}, 1, 0, 3}, + {[]byte{0, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3}, []byte{1, 2, 3, 4}, 4, 0, 4}, + {[]byte{1, 2, 2, 3, 4}, []byte{1, 2, 3, 4}, 2, 1, 3}, + {[]byte{0, 1, 2, 3, 4}, []byte{1, 1, 2, 2, 3, 4}, 2, 3, 3}, + } { + ia, ib, l := longestCommonSubstring(test.a, test.b) + if ia != test.indexA || ib != test.indexB || l != test.length { + t.Errorf("%d: want (%d %d %d) got (%d %d %d)", i, test.indexA, test.indexB, test.length, ia, ib, l) + } + } +} + +func TestDiff(t *testing.T) { + for i, test := range []struct { + a, b []byte + d Differences + }{ + { + []byte{0, 1, 2, 3, 4}, + []byte{1, 1, 2, 2, 3, 4}, + Differences{ + Difference{true, []byte{0}, []byte{}}, + Difference{false, []byte{1}, []byte{1}}, + Difference{true, []byte{}, []byte{1, 2}}, + Difference{false, []byte{2, 3, 4}, []byte{2, 3, 4}}, + }, + }, + } { + diffs := Diff(test.a, test.b) + if !reflect.DeepEqual(diffs, test.d) { + t.Errorf("%d want %v got %v", i, test.d, diffs) + } + } +} diff --git a/vendor/github.com/google/gopacket/decode.go b/vendor/github.com/google/gopacket/decode.go new file mode 100644 index 0000000..2633f84 --- /dev/null +++ b/vendor/github.com/google/gopacket/decode.go @@ -0,0 +1,157 @@ +// 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 gopacket + +import ( + "errors" +) + +// DecodeFeedback is used by DecodingLayer layers to provide decoding metadata. +type DecodeFeedback interface { + // SetTruncated should be called if during decoding you notice that a packet + // is shorter than internal layer variables (HeaderLength, or the like) say it + // should be. It sets packet.Metadata().Truncated. + SetTruncated() +} + +type nilDecodeFeedback struct{} + +func (nilDecodeFeedback) SetTruncated() {} + +// NilDecodeFeedback implements DecodeFeedback by doing nothing. +var NilDecodeFeedback DecodeFeedback = nilDecodeFeedback{} + +// PacketBuilder is used by layer decoders to store the layers they've decoded, +// and to defer future decoding via NextDecoder. +// Typically, the pattern for use is: +// func (m *myDecoder) Decode(data []byte, p PacketBuilder) error { +// if myLayer, err := myDecodingLogic(data); err != nil { +// return err +// } else { +// p.AddLayer(myLayer) +// } +// // maybe do this, if myLayer is a LinkLayer +// p.SetLinkLayer(myLayer) +// return p.NextDecoder(nextDecoder) +// } +type PacketBuilder interface { + DecodeFeedback + // AddLayer should be called by a decoder immediately upon successful + // decoding of a layer. + AddLayer(l Layer) + // The following functions set the various specific layers in the final + // packet. Note that if many layers call SetX, the first call is kept and all + // other calls are ignored. + SetLinkLayer(LinkLayer) + SetNetworkLayer(NetworkLayer) + SetTransportLayer(TransportLayer) + SetApplicationLayer(ApplicationLayer) + SetErrorLayer(ErrorLayer) + // NextDecoder should be called by a decoder when they're done decoding a + // packet layer but not done with decoding the entire packet. The next + // decoder will be called to decode the last AddLayer's LayerPayload. + // Because of this, NextDecoder must only be called once all other + // PacketBuilder calls have been made. Set*Layer and AddLayer calls after + // NextDecoder calls will behave incorrectly. + NextDecoder(next Decoder) error + // DumpPacketData is used solely for decoding. If you come across an error + // you need to diagnose while processing a packet, call this and your packet's + // data will be dumped to stderr so you can create a test. This should never + // be called from a production decoder. + DumpPacketData() + // DecodeOptions returns the decode options + DecodeOptions() *DecodeOptions +} + +// Decoder is an interface for logic to decode a packet layer. Users may +// implement a Decoder to handle their own strange packet types, or may use one +// of the many decoders available in the 'layers' subpackage to decode things +// for them. +type Decoder interface { + // Decode decodes the bytes of a packet, sending decoded values and other + // information to PacketBuilder, and returning an error if unsuccessful. See + // the PacketBuilder documentation for more details. + Decode([]byte, PacketBuilder) error +} + +// DecodeFunc wraps a function to make it a Decoder. +type DecodeFunc func([]byte, PacketBuilder) error + +// Decode implements Decoder by calling itself. +func (d DecodeFunc) Decode(data []byte, p PacketBuilder) error { + // function, call thyself. + return d(data, p) +} + +// DecodePayload is a Decoder that returns a Payload layer containing all +// remaining bytes. +var DecodePayload Decoder = DecodeFunc(decodePayload) + +// DecodeUnknown is a Decoder that returns an Unknown layer containing all +// remaining bytes, useful if you run up against a layer that you're unable to +// decode yet. This layer is considered an ErrorLayer. +var DecodeUnknown Decoder = DecodeFunc(decodeUnknown) + +// DecodeFragment is a Decoder that returns a Fragment layer containing all +// remaining bytes. +var DecodeFragment Decoder = DecodeFunc(decodeFragment) + +// LayerTypeZero is an invalid layer type, but can be used to determine whether +// layer type has actually been set correctly. +var LayerTypeZero = RegisterLayerType(0, LayerTypeMetadata{Name: "Unknown", Decoder: DecodeUnknown}) + +// LayerTypeDecodeFailure is the layer type for the default error layer. +var LayerTypeDecodeFailure = RegisterLayerType(1, LayerTypeMetadata{Name: "DecodeFailure", Decoder: DecodeUnknown}) + +// LayerTypePayload is the layer type for a payload that we don't try to decode +// but treat as a success, IE: an application-level payload. +var LayerTypePayload = RegisterLayerType(2, LayerTypeMetadata{Name: "Payload", Decoder: DecodePayload}) + +// LayerTypeFragment is the layer type for a fragment of a layer transported +// by an underlying layer that supports fragmentation. +var LayerTypeFragment = RegisterLayerType(3, LayerTypeMetadata{Name: "Fragment", Decoder: DecodeFragment}) + +// DecodeFailure is a packet layer created if decoding of the packet data failed +// for some reason. It implements ErrorLayer. LayerContents will be the entire +// set of bytes that failed to parse, and Error will return the reason parsing +// failed. +type DecodeFailure struct { + data []byte + err error + stack []byte +} + +// Error returns the error encountered during decoding. +func (d *DecodeFailure) Error() error { return d.err } + +// LayerContents implements Layer. +func (d *DecodeFailure) LayerContents() []byte { return d.data } + +// LayerPayload implements Layer. +func (d *DecodeFailure) LayerPayload() []byte { return nil } + +// String implements fmt.Stringer. +func (d *DecodeFailure) String() string { + return "Packet decoding error: " + d.Error().Error() +} + +// Dump implements Dumper. +func (d *DecodeFailure) Dump() (s string) { + if d.stack != nil { + s = string(d.stack) + } + return +} + +// LayerType returns LayerTypeDecodeFailure +func (d *DecodeFailure) LayerType() LayerType { return LayerTypeDecodeFailure } + +// decodeUnknown "decodes" unsupported data types by returning an error. +// This decoder will thus always return a DecodeFailure layer. +func decodeUnknown(data []byte, p PacketBuilder) error { + return errors.New("Layer type not currently supported") +} diff --git a/vendor/github.com/google/gopacket/doc.go b/vendor/github.com/google/gopacket/doc.go new file mode 100644 index 0000000..6198940 --- /dev/null +++ b/vendor/github.com/google/gopacket/doc.go @@ -0,0 +1,365 @@ +// 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 gopacket provides packet decoding for the Go language. + +gopacket contains many sub-packages with additional functionality you may find +useful, including: + + * layers: You'll probably use this every time. This contains of the logic + built into gopacket for decoding packet protocols. Note that all example + code below assumes that you have imported both gopacket and + gopacket/layers. + * pcap: C bindings to use libpcap to read packets off the wire. + * pfring: C bindings to use PF_RING to read packets off the wire. + * afpacket: C bindings for Linux's AF_PACKET to read packets off the wire. + * tcpassembly: TCP stream reassembly + +Also, if you're looking to dive right into code, see the examples subdirectory +for numerous simple binaries built using gopacket libraries. + +Basic Usage + +gopacket takes in packet data as a []byte and decodes it into a packet with +a non-zero number of "layers". Each layer corresponds to a protocol +within the bytes. Once a packet has been decoded, the layers of the packet +can be requested from the packet. + + // Decode a packet + packet := gopacket.NewPacket(myPacketData, layers.LayerTypeEthernet, gopacket.Default) + // Get the TCP layer from this packet + if tcpLayer := packet.Layer(layers.LayerTypeTCP); tcpLayer != nil { + fmt.Println("This is a TCP packet!") + // Get actual TCP data from this layer + tcp, _ := tcpLayer.(*layers.TCP) + fmt.Printf("From src port %d to dst port %d\n", tcp.SrcPort, tcp.DstPort) + } + // Iterate over all layers, printing out each layer type + for _, layer := range packet.Layers() { + fmt.Println("PACKET LAYER:", layer.LayerType()) + } + +Packets can be decoded from a number of starting points. Many of our base +types implement Decoder, which allow us to decode packets for which +we don't have full data. + + // Decode an ethernet packet + ethP := gopacket.NewPacket(p1, layers.LayerTypeEthernet, gopacket.Default) + // Decode an IPv6 header and everything it contains + ipP := gopacket.NewPacket(p2, layers.LayerTypeIPv6, gopacket.Default) + // Decode a TCP header and its payload + tcpP := gopacket.NewPacket(p3, layers.LayerTypeTCP, gopacket.Default) + + +Reading Packets From A Source + +Most of the time, you won't just have a []byte of packet data lying around. +Instead, you'll want to read packets in from somewhere (file, interface, etc) +and process them. To do that, you'll want to build a PacketSource. + +First, you'll need to construct an object that implements the PacketDataSource +interface. There are implementations of this interface bundled with gopacket +in the gopacket/pcap and gopacket/pfring subpackages... see their documentation +for more information on their usage. Once you have a PacketDataSource, you can +pass it into NewPacketSource, along with a Decoder of your choice, to create +a PacketSource. + +Once you have a PacketSource, you can read packets from it in multiple ways. +See the docs for PacketSource for more details. The easiest method is the +Packets function, which returns a channel, then asynchronously writes new +packets into that channel, closing the channel if the packetSource hits an +end-of-file. + + packetSource := ... // construct using pcap or pfring + for packet := range packetSource.Packets() { + handlePacket(packet) // do something with each packet + } + +You can change the decoding options of the packetSource by setting fields in +packetSource.DecodeOptions... see the following sections for more details. + + +Lazy Decoding + +gopacket optionally decodes packet data lazily, meaning it +only decodes a packet layer when it needs to handle a function call. + + // Create a packet, but don't actually decode anything yet + packet := gopacket.NewPacket(myPacketData, layers.LayerTypeEthernet, gopacket.Lazy) + // Now, decode the packet up to the first IPv4 layer found but no further. + // If no IPv4 layer was found, the whole packet will be decoded looking for + // it. + ip4 := packet.Layer(layers.LayerTypeIPv4) + // Decode all layers and return them. The layers up to the first IPv4 layer + // are already decoded, and will not require decoding a second time. + layers := packet.Layers() + +Lazily-decoded packets are not concurrency-safe. Since layers have not all been +decoded, each call to Layer() or Layers() has the potential to mutate the packet +in order to decode the next layer. If a packet is used +in multiple goroutines concurrently, don't use gopacket.Lazy. Then gopacket +will decode the packet fully, and all future function calls won't mutate the +object. + + +NoCopy Decoding + +By default, gopacket will copy the slice passed to NewPacket and store the +copy within the packet, so future mutations to the bytes underlying the slice +don't affect the packet and its layers. If you can guarantee that the +underlying slice bytes won't be changed, you can use NoCopy to tell +gopacket.NewPacket, and it'll use the passed-in slice itself. + + // This channel returns new byte slices, each of which points to a new + // memory location that's guaranteed immutable for the duration of the + // packet. + for data := range myByteSliceChannel { + p := gopacket.NewPacket(data, layers.LayerTypeEthernet, gopacket.NoCopy) + doSomethingWithPacket(p) + } + +The fastest method of decoding is to use both Lazy and NoCopy, but note from +the many caveats above that for some implementations either or both may be +dangerous. + + +Pointers To Known Layers + +During decoding, certain layers are stored in the packet as well-known +layer types. For example, IPv4 and IPv6 are both considered NetworkLayer +layers, while TCP and UDP are both TransportLayer layers. We support 4 +layers, corresponding to the 4 layers of the TCP/IP layering scheme (roughly +anagalous to layers 2, 3, 4, and 7 of the OSI model). To access these, +you can use the packet.LinkLayer, packet.NetworkLayer, +packet.TransportLayer, and packet.ApplicationLayer functions. Each of +these functions returns a corresponding interface +(gopacket.{Link,Network,Transport,Application}Layer). The first three +provide methods for getting src/dst addresses for that particular layer, +while the final layer provides a Payload function to get payload data. +This is helpful, for example, to get payloads for all packets regardless +of their underlying data type: + + // Get packets from some source + for packet := range someSource { + if app := packet.ApplicationLayer(); app != nil { + if strings.Contains(string(app.Payload()), "magic string") { + fmt.Println("Found magic string in a packet!") + } + } + } + +A particularly useful layer is ErrorLayer, which is set whenever there's +an error parsing part of the packet. + + packet := gopacket.NewPacket(myPacketData, layers.LayerTypeEthernet, gopacket.Default) + if err := packet.ErrorLayer(); err != nil { + fmt.Println("Error decoding some part of the packet:", err) + } + +Note that we don't return an error from NewPacket because we may have decoded +a number of layers successfully before running into our erroneous layer. You +may still be able to get your Ethernet and IPv4 layers correctly, even if +your TCP layer is malformed. + + +Flow And Endpoint + +gopacket has two useful objects, Flow and Endpoint, for communicating in a protocol +independent manner the fact that a packet is coming from A and going to B. +The general layer types LinkLayer, NetworkLayer, and TransportLayer all provide +methods for extracting their flow information, without worrying about the type +of the underlying Layer. + +A Flow is a simple object made up of a set of two Endpoints, one source and one +destination. It details the sender and receiver of the Layer of the Packet. + +An Endpoint is a hashable representation of a source or destination. For +example, for LayerTypeIPv4, an Endpoint contains the IP address bytes for a v4 +IP packet. A Flow can be broken into Endpoints, and Endpoints can be combined +into Flows: + + packet := gopacket.NewPacket(myPacketData, layers.LayerTypeEthernet, gopacket.Lazy) + netFlow := packet.NetworkLayer().NetworkFlow() + src, dst := netFlow.Endpoints() + reverseFlow := gopacket.NewFlow(dst, src) + +Both Endpoint and Flow objects can be used as map keys, and the equality +operator can compare them, so you can easily group together all packets +based on endpoint criteria: + + flows := map[gopacket.Endpoint]chan gopacket.Packet + packet := gopacket.NewPacket(myPacketData, layers.LayerTypeEthernet, gopacket.Lazy) + // Send all TCP packets to channels based on their destination port. + if tcp := packet.Layer(layers.LayerTypeTCP); tcp != nil { + flows[tcp.TransportFlow().Dst()] <- packet + } + // Look for all packets with the same source and destination network address + if net := packet.NetworkLayer(); net != nil { + src, dst := net.NetworkFlow().Endpoints() + if src == dst { + fmt.Println("Fishy packet has same network source and dst: %s", src) + } + } + // Find all packets coming from UDP port 1000 to UDP port 500 + interestingFlow := gopacket.NewFlow(layers.NewUDPPortEndpoint(1000), layers.NewUDPPortEndpoint(500)) + if t := packet.NetworkLayer(); t != nil && t.TransportFlow() == interestingFlow { + fmt.Println("Found that UDP flow I was looking for!") + } + +For load-balancing purposes, both Flow and Endpoint have FastHash() functions, +which provide quick, non-cryptographic hashes of their contents. Of particular +importance is the fact that Flow FastHash() is symmetric: A->B will have the same +hash as B->A. An example usage could be: + + channels := [8]chan gopacket.Packet + for i := 0; i < 8; i++ { + channels[i] = make(chan gopacket.Packet) + go packetHandler(channels[i]) + } + for packet := range getPackets() { + if net := packet.NetworkLayer(); net != nil { + channels[int(net.NetworkFlow().FastHash()) & 0x7] <- packet + } + } + +This allows us to split up a packet stream while still making sure that each +stream sees all packets for a flow (and its bidirectional opposite). + + +Implementing Your Own Decoder + +If your network has some strange encapsulation, you can implement your own +decoder. In this example, we handle Ethernet packets which are encapsulated +in a 4-byte header. + + // Create a layer type, should be unique and high, so it doesn't conflict, + // giving it a name and a decoder to use. + var MyLayerType = gopacket.RegisterLayerType(12345, gopacket.LayerTypeMetadata{Name: "MyLayerType", Decoder: gopacket.DecodeFunc(decodeMyLayer)}) + + // Implement my layer + type MyLayer struct { + StrangeHeader []byte + payload []byte + } + func (m MyLayer) LayerType() gopacket.LayerType { return MyLayerType } + func (m MyLayer) LayerContents() []byte { return m.StrangeHeader } + func (m MyLayer) LayerPayload() []byte { return m.payload } + + // Now implement a decoder... this one strips off the first 4 bytes of the + // packet. + func decodeMyLayer(data []byte, p gopacket.PacketBuilder) error { + // Create my layer + p.AddLayer(&MyLayer{data[:4], data[4:]}) + // Determine how to handle the rest of the packet + return p.NextDecoder(layers.LayerTypeEthernet) + } + + // Finally, decode your packets: + p := gopacket.NewPacket(data, MyLayerType, gopacket.Lazy) + +See the docs for Decoder and PacketBuilder for more details on how coding +decoders works, or look at RegisterLayerType and RegisterEndpointType to see how +to add layer/endpoint types to gopacket. + + +Fast Decoding With DecodingLayerParser + +TLDR: DecodingLayerParser takes about 10% of the time as NewPacket to decode +packet data, but only for known packet stacks. + +Basic decoding using gopacket.NewPacket or PacketSource.Packets is somewhat slow +due to its need to allocate a new packet and every respective layer. It's very +versatile and can handle all known layer types, but sometimes you really only +care about a specific set of layers regardless, so that versatility is wasted. + +DecodingLayerParser avoids memory allocation altogether by decoding packet +layers directly into preallocated objects, which you can then reference to get +the packet's information. A quick example: + + func main() { + var eth layers.Ethernet + var ip4 layers.IPv4 + var ip6 layers.IPv6 + var tcp layers.TCP + parser := gopacket.NewDecodingLayerParser(layers.LayerTypeEthernet, ð, &ip4, &ip6, &tcp) + decoded := []gopacket.LayerType{} + for packetData := range somehowGetPacketData() { + err := parser.DecodeLayers(packetData, &decoded) + for _, layerType := range decoded { + switch layerType { + case layers.LayerTypeIPv6: + fmt.Println(" IP6 ", ip6.SrcIP, ip6.DstIP) + case layers.LayerTypeIPv4: + fmt.Println(" IP4 ", ip4.SrcIP, ip4.DstIP) + } + } + } + } + +The important thing to note here is that the parser is modifying the passed in +layers (eth, ip4, ip6, tcp) instead of allocating new ones, thus greatly +speeding up the decoding process. It's even branching based on layer type... +it'll handle an (eth, ip4, tcp) or (eth, ip6, tcp) stack. However, it won't +handle any other type... since no other decoders were passed in, an (eth, ip4, +udp) stack will stop decoding after ip4, and only pass back [LayerTypeEthernet, +LayerTypeIPv4] through the 'decoded' slice (along with an error saying it can't +decode a UDP packet). + +Unfortunately, not all layers can be used by DecodingLayerParser... only those +implementing the DecodingLayer interface are usable. Also, it's possible to +create DecodingLayers that are not themselves Layers... see +layers.IPv6ExtensionSkipper for an example of this. + + +Creating Packet Data + +As well as offering the ability to decode packet data, gopacket will allow you +to create packets from scratch, as well. A number of gopacket layers implement +the SerializableLayer interface; these layers can be serialized to a []byte in +the following manner: + + ip := &layers.IPv4{ + SrcIP: net.IP{1, 2, 3, 4}, + DstIP: net.IP{5, 6, 7, 8}, + // etc... + } + buf := gopacket.NewSerializeBuffer() + opts := gopacket.SerializeOptions{} // See SerializeOptions for more details. + err := ip.SerializeTo(&buf, opts) + if err != nil { panic(err) } + fmt.Println(buf.Bytes()) // prints out a byte slice containing the serialized IPv4 layer. + +SerializeTo PREPENDS the given layer onto the SerializeBuffer, and they treat +the current buffer's Bytes() slice as the payload of the serializing layer. +Therefore, you can serialize an entire packet by serializing a set of layers in +reverse order (Payload, then TCP, then IP, then Ethernet, for example). The +SerializeBuffer's SerializeLayers function is a helper that does exactly that. + +To generate a (empty and useless, because no fields are set) +Ethernet(IPv4(TCP(Payload))) packet, for example, you can run: + + buf := gopacket.NewSerializeBuffer() + opts := gopacket.SerializeOptions{} + gopacket.SerializeLayers(buf, opts, + &layers.Ethernet{}, + &layers.IPv4{}, + &layers.TCP{}, + gopacket.Payload([]byte{1, 2, 3, 4})) + packetData := buf.Bytes() + +A Final Note + +If you use gopacket, you'll almost definitely want to make sure gopacket/layers +is imported, since when imported it sets all the LayerType variables and fills +in a lot of interesting variables/maps (DecodersByLayerName, etc). Therefore, +it's recommended that even if you don't use any layers functions directly, you still import with: + + import ( + _ "github.com/google/gopacket/layers" + ) +*/ +package gopacket diff --git a/vendor/github.com/google/gopacket/dumpcommand/tcpdump.go b/vendor/github.com/google/gopacket/dumpcommand/tcpdump.go new file mode 100644 index 0000000..2d35722 --- /dev/null +++ b/vendor/github.com/google/gopacket/dumpcommand/tcpdump.go @@ -0,0 +1,119 @@ +// 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 dumpcommand implements a run function for pfdump and pcapdump +// with many similar flags/features to tcpdump. This code is split out seperate +// from data sources (pcap/pfring) so it can be used by both. +package dumpcommand + +import ( + "flag" + "fmt" + "log" + "os" + "time" + + "github.com/google/gopacket" + "github.com/google/gopacket/ip4defrag" + "github.com/google/gopacket/layers" // pulls in all layers decoders +) + +var ( + print = flag.Bool("print", true, "Print out packets, if false only prints out statistics") + maxcount = flag.Int("c", -1, "Only grab this many packets, then exit") + decoder = flag.String("decoder", "Ethernet", "Name of the decoder to use") + dump = flag.Bool("X", false, "If true, dump very verbose info on each packet") + statsevery = flag.Int("stats", 1000, "Output statistics every N packets") + printErrors = flag.Bool("errors", false, "Print out packet dumps of decode errors, useful for checking decoders against live traffic") + lazy = flag.Bool("lazy", false, "If true, do lazy decoding") + defrag = flag.Bool("defrag", false, "If true, do IPv4 defrag") +) + +func Run(src gopacket.PacketDataSource) { + if !flag.Parsed() { + log.Fatalln("Run called without flags.Parse() being called") + } + var dec gopacket.Decoder + var ok bool + if dec, ok = gopacket.DecodersByLayerName[*decoder]; !ok { + log.Fatalln("No decoder named", *decoder) + } + source := gopacket.NewPacketSource(src, dec) + source.Lazy = *lazy + source.NoCopy = true + source.DecodeStreamsAsDatagrams = true + fmt.Fprintln(os.Stderr, "Starting to read packets") + count := 0 + bytes := int64(0) + start := time.Now() + errors := 0 + truncated := 0 + layertypes := map[gopacket.LayerType]int{} + defragger := ip4defrag.NewIPv4Defragmenter() + + for packet := range source.Packets() { + count++ + bytes += int64(len(packet.Data())) + + // defrag the IPv4 packet if required + if *defrag { + ip4Layer := packet.Layer(layers.LayerTypeIPv4) + if ip4Layer == nil { + continue + } + ip4 := ip4Layer.(*layers.IPv4) + l := ip4.Length + + newip4, err := defragger.DefragIPv4(ip4) + if err != nil { + log.Fatalln("Error while de-fragmenting", err) + } else if newip4 == nil { + continue // packet fragment, we don't have whole packet yet. + } + if newip4.Length != l { + fmt.Printf("Decoding re-assembled packet: %s\n", newip4.NextLayerType()) + pb, ok := packet.(gopacket.PacketBuilder) + if !ok { + panic("Not a PacketBuilder") + } + nextDecoder := newip4.NextLayerType() + nextDecoder.Decode(newip4.Payload, pb) + } + } + + if *dump { + fmt.Println(packet.Dump()) + } else if *print { + fmt.Println(packet) + } + if !*lazy || *print || *dump { // if we've already decoded all layers... + for _, layer := range packet.Layers() { + layertypes[layer.LayerType()]++ + } + if packet.Metadata().Truncated { + truncated++ + } + if errLayer := packet.ErrorLayer(); errLayer != nil { + errors++ + if *printErrors { + fmt.Println("Error:", errLayer.Error()) + fmt.Println("--- Packet ---") + fmt.Println(packet.Dump()) + } + } + } + done := *maxcount > 0 && count >= *maxcount + if count%*statsevery == 0 || done { + fmt.Fprintf(os.Stderr, "Processed %v packets (%v bytes) in %v, %v errors and %v truncated packets\n", count, bytes, time.Since(start), errors, truncated) + if len(layertypes) > 0 { + fmt.Fprintf(os.Stderr, "Layer types seen: %+v\n", layertypes) + } + } + if done { + break + } + } +} diff --git a/vendor/github.com/google/gopacket/examples/arpscan/arpscan.go b/vendor/github.com/google/gopacket/examples/arpscan/arpscan.go new file mode 100644 index 0000000..1a0e33e --- /dev/null +++ b/vendor/github.com/google/gopacket/examples/arpscan/arpscan.go @@ -0,0 +1,188 @@ +// 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. + +// arpscan implements ARP scanning of all interfaces' local networks using +// gopacket and its subpackages. This example shows, among other things: +// * Generating and sending packet data +// * Reading in packet data and interpreting it +// * Use of the 'pcap' subpackage for reading/writing +package main + +import ( + "bytes" + "encoding/binary" + "errors" + "log" + "net" + "sync" + "time" + + "github.com/google/gopacket" + "github.com/google/gopacket/layers" + "github.com/google/gopacket/pcap" +) + +func main() { + // Get a list of all interfaces. + ifaces, err := net.Interfaces() + if err != nil { + panic(err) + } + + var wg sync.WaitGroup + for _, iface := range ifaces { + wg.Add(1) + // Start up a scan on each interface. + go func(iface net.Interface) { + defer wg.Done() + if err := scan(&iface); err != nil { + log.Printf("interface %v: %v", iface.Name, err) + } + }(iface) + } + // Wait for all interfaces' scans to complete. They'll try to run + // forever, but will stop on an error, so if we get past this Wait + // it means all attempts to write have failed. + wg.Wait() +} + +// scan scans an individual interface's local network for machines using ARP requests/replies. +// +// scan loops forever, sending packets out regularly. It returns an error if +// it's ever unable to write a packet. +func scan(iface *net.Interface) error { + // We just look for IPv4 addresses, so try to find if the interface has one. + var addr *net.IPNet + if addrs, err := iface.Addrs(); err != nil { + return err + } else { + for _, a := range addrs { + if ipnet, ok := a.(*net.IPNet); ok { + if ip4 := ipnet.IP.To4(); ip4 != nil { + addr = &net.IPNet{ + IP: ip4, + Mask: ipnet.Mask[len(ipnet.Mask)-4:], + } + break + } + } + } + } + // Sanity-check that the interface has a good address. + if addr == nil { + return errors.New("no good IP network found") + } else if addr.IP[0] == 127 { + return errors.New("skipping localhost") + } else if addr.Mask[0] != 0xff || addr.Mask[1] != 0xff { + return errors.New("mask means network is too large") + } + log.Printf("Using network range %v for interface %v", addr, iface.Name) + + // Open up a pcap handle for packet reads/writes. + handle, err := pcap.OpenLive(iface.Name, 65536, true, pcap.BlockForever) + if err != nil { + return err + } + defer handle.Close() + + // Start up a goroutine to read in packet data. + stop := make(chan struct{}) + go readARP(handle, iface, stop) + defer close(stop) + for { + // Write our scan packets out to the handle. + if err := writeARP(handle, iface, addr); err != nil { + log.Printf("error writing packets on %v: %v", iface.Name, err) + return err + } + // We don't know exactly how long it'll take for packets to be + // sent back to us, but 10 seconds should be more than enough + // time ;) + time.Sleep(10 * time.Second) + } +} + +// readARP watches a handle for incoming ARP responses we might care about, and prints them. +// +// readARP loops until 'stop' is closed. +func readARP(handle *pcap.Handle, iface *net.Interface, stop chan struct{}) { + src := gopacket.NewPacketSource(handle, layers.LayerTypeEthernet) + in := src.Packets() + for { + var packet gopacket.Packet + select { + case <-stop: + return + case packet = <-in: + arpLayer := packet.Layer(layers.LayerTypeARP) + if arpLayer == nil { + continue + } + arp := arpLayer.(*layers.ARP) + if arp.Operation != layers.ARPReply || bytes.Equal([]byte(iface.HardwareAddr), arp.SourceHwAddress) { + // This is a packet I sent. + continue + } + // Note: we might get some packets here that aren't responses to ones we've sent, + // if for example someone else sends US an ARP request. Doesn't much matter, though... + // all information is good information :) + log.Printf("IP %v is at %v", net.IP(arp.SourceProtAddress), net.HardwareAddr(arp.SourceHwAddress)) + } + } +} + +// writeARP writes an ARP request for each address on our local network to the +// pcap handle. +func writeARP(handle *pcap.Handle, iface *net.Interface, addr *net.IPNet) error { + // Set up all the layers' fields we can. + eth := layers.Ethernet{ + SrcMAC: iface.HardwareAddr, + DstMAC: net.HardwareAddr{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, + EthernetType: layers.EthernetTypeARP, + } + arp := layers.ARP{ + AddrType: layers.LinkTypeEthernet, + Protocol: layers.EthernetTypeIPv4, + HwAddressSize: 6, + ProtAddressSize: 4, + Operation: layers.ARPRequest, + SourceHwAddress: []byte(iface.HardwareAddr), + SourceProtAddress: []byte(addr.IP), + DstHwAddress: []byte{0, 0, 0, 0, 0, 0}, + } + // Set up buffer and options for serialization. + buf := gopacket.NewSerializeBuffer() + opts := gopacket.SerializeOptions{ + FixLengths: true, + ComputeChecksums: true, + } + // Send one packet for every address. + for _, ip := range ips(addr) { + arp.DstProtAddress = []byte(ip) + gopacket.SerializeLayers(buf, opts, ð, &arp) + if err := handle.WritePacketData(buf.Bytes()); err != nil { + return err + } + } + return nil +} + +// ips is a simple and not very good method for getting all IPv4 addresses from a +// net.IPNet. It returns all IPs it can over the channel it sends back, closing +// the channel when done. +func ips(n *net.IPNet) (out []net.IP) { + num := binary.BigEndian.Uint32([]byte(n.IP)) + mask := binary.BigEndian.Uint32([]byte(n.Mask)) + num &= mask + for mask < 0xffffffff { + var buf [4]byte + binary.BigEndian.PutUint32(buf[:], num) + out = append(out, net.IP(buf[:])) + mask += 1 + num += 1 + } + return +} diff --git a/vendor/github.com/google/gopacket/examples/bidirectional/main.go b/vendor/github.com/google/gopacket/examples/bidirectional/main.go new file mode 100644 index 0000000..4b0b240 --- /dev/null +++ b/vendor/github.com/google/gopacket/examples/bidirectional/main.go @@ -0,0 +1,192 @@ +// 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. + +// This binary provides an example of connecting up bidirectional streams from +// the unidirectional streams provided by gopacket/tcpassembly. +package main + +import ( + "flag" + "fmt" + "github.com/google/gopacket" + "github.com/google/gopacket/examples/util" + "github.com/google/gopacket/layers" + "github.com/google/gopacket/pcap" + "github.com/google/gopacket/tcpassembly" + "log" + "time" +) + +var iface = flag.String("i", "eth0", "Interface to get packets from") +var snaplen = flag.Int("s", 16<<10, "SnapLen for pcap packet capture") +var filter = flag.String("f", "tcp", "BPF filter for pcap") +var logAllPackets = flag.Bool("v", false, "Logs every packet in great detail") + +// key is used to map bidirectional streams to each other. +type key struct { + net, transport gopacket.Flow +} + +// String prints out the key in a human-readable fashion. +func (k key) String() string { + return fmt.Sprintf("%v:%v", k.net, k.transport) +} + +// timeout is the length of time to wait befor flushing connections and +// bidirectional stream pairs. +const timeout time.Duration = time.Minute * 5 + +// myStream implements tcpassembly.Stream +type myStream struct { + bytes int64 // total bytes seen on this stream. + bidi *bidi // maps to my bidirectional twin. + done bool // if true, we've seen the last packet we're going to for this stream. +} + +// bidi stores each unidirectional side of a bidirectional stream. +// +// When a new stream comes in, if we don't have an opposite stream, a bidi is +// created with 'a' set to the new stream. If we DO have an opposite stream, +// 'b' is set to the new stream. +type bidi struct { + key key // Key of the first stream, mostly for logging. + a, b *myStream // the two bidirectional streams. + lastPacketSeen time.Time // last time we saw a packet from either stream. +} + +// myFactory implements tcpassmebly.StreamFactory +type myFactory struct { + // bidiMap maps keys to bidirectional stream pairs. + bidiMap map[key]*bidi +} + +// New handles creating a new tcpassembly.Stream. +func (f *myFactory) New(netFlow, tcpFlow gopacket.Flow) tcpassembly.Stream { + // Create a new stream. + s := &myStream{} + + // Find the bidi bidirectional struct for this stream, creating a new one if + // one doesn't already exist in the map. + k := key{netFlow, tcpFlow} + bd := f.bidiMap[k] + if bd == nil { + bd = &bidi{a: s, key: k} + log.Printf("[%v] created first side of bidirectional stream", bd.key) + // Register bidirectional with the reverse key, so the matching stream going + // the other direction will find it. + f.bidiMap[key{netFlow.Reverse(), tcpFlow.Reverse()}] = bd + } else { + log.Printf("[%v] found second side of bidirectional stream", bd.key) + bd.b = s + // Clear out the bidi we're using from the map, just in case. + delete(f.bidiMap, k) + } + s.bidi = bd + return s +} + +// emptyStream is used to finish bidi that only have one stream, in +// collectOldStreams. +var emptyStream = &myStream{done: true} + +// collectOldStreams finds any streams that haven't received a packet within +// 'timeout', and sets/finishes the 'b' stream inside them. The 'a' stream may +// still receive packets after this. +func (f *myFactory) collectOldStreams() { + cutoff := time.Now().Add(-timeout) + for k, bd := range f.bidiMap { + if bd.lastPacketSeen.Before(cutoff) { + log.Printf("[%v] timing out old stream", bd.key) + bd.b = emptyStream // stub out b with an empty stream. + delete(f.bidiMap, k) // remove it from our map. + bd.maybeFinish() // if b was the last stream we were waiting for, finish up. + } + } +} + +// Reassembled handles reassembled TCP stream data. +func (s *myStream) Reassembled(rs []tcpassembly.Reassembly) { + for _, r := range rs { + // For now, we'll simply count the bytes on each side of the TCP stream. + s.bytes += int64(len(r.Bytes)) + if r.Skip > 0 { + s.bytes += int64(r.Skip) + } + // Mark that we've received new packet data. + // We could just use time.Now, but by using r.Seen we handle the case + // where packets are being read from a file and could be very old. + if s.bidi.lastPacketSeen.After(r.Seen) { + s.bidi.lastPacketSeen = r.Seen + } + } +} + +// ReassemblyComplete marks this stream as finished. +func (s *myStream) ReassemblyComplete() { + s.done = true + s.bidi.maybeFinish() +} + +// maybeFinish will wait until both directions are complete, then print out +// stats. +func (bd *bidi) maybeFinish() { + switch { + case bd.a == nil: + log.Fatalf("[%v] a should always be non-nil, since it's set when bidis are created", bd.key) + case !bd.a.done: + log.Printf("[%v] still waiting on first stream", bd.key) + case bd.b == nil: + log.Printf("[%v] no second stream yet", bd.key) + case !bd.b.done: + log.Printf("[%v] still waiting on second stream", bd.key) + default: + log.Printf("[%v] FINISHED, bytes: %d tx, %d rx", bd.key, bd.a.bytes, bd.b.bytes) + } +} + +func main() { + defer util.Run()() + log.Printf("starting capture on interface %q", *iface) + // Set up pcap packet capture + handle, err := pcap.OpenLive(*iface, int32(*snaplen), true, pcap.BlockForever) + if err != nil { + panic(err) + } + if err := handle.SetBPFFilter(*filter); err != nil { + panic(err) + } + + // Set up assembly + streamFactory := &myFactory{bidiMap: make(map[key]*bidi)} + streamPool := tcpassembly.NewStreamPool(streamFactory) + assembler := tcpassembly.NewAssembler(streamPool) + + log.Println("reading in packets") + // Read in packets, pass to assembler. + packetSource := gopacket.NewPacketSource(handle, handle.LinkType()) + packets := packetSource.Packets() + ticker := time.Tick(timeout / 4) + for { + select { + case packet := <-packets: + if *logAllPackets { + log.Println(packet) + } + if packet.NetworkLayer() == nil || packet.TransportLayer() == nil || packet.TransportLayer().LayerType() != layers.LayerTypeTCP { + log.Println("Unusable packet") + continue + } + tcp := packet.TransportLayer().(*layers.TCP) + assembler.AssembleWithTimestamp(packet.NetworkLayer().NetworkFlow(), tcp, packet.Metadata().Timestamp) + + case <-ticker: + // Every minute, flush connections that haven't seen activity in the past minute. + log.Println("---- FLUSHING ----") + assembler.FlushOlderThan(time.Now().Add(-timeout)) + streamFactory.collectOldStreams() + } + } +} diff --git a/vendor/github.com/google/gopacket/examples/bytediff/bytediff.png b/vendor/github.com/google/gopacket/examples/bytediff/bytediff.png Binary files differnew file mode 100644 index 0000000..5aa3c8a --- /dev/null +++ b/vendor/github.com/google/gopacket/examples/bytediff/bytediff.png diff --git a/vendor/github.com/google/gopacket/examples/bytediff/main.go b/vendor/github.com/google/gopacket/examples/bytediff/main.go new file mode 100644 index 0000000..2a4c11b --- /dev/null +++ b/vendor/github.com/google/gopacket/examples/bytediff/main.go @@ -0,0 +1,96 @@ +// 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. + +// This binary shows how to display byte differences to users via the bytediff +// library. +package main + +import ( + "fmt" + "github.com/google/gopacket/bytediff" +) + +var sliceA = []byte{ + 0x00, 0x00, 0x0c, 0x9f, 0xf0, 0x20, 0xbc, 0x30, 0x5b, 0xe8, 0xd3, 0x49, + 0x08, 0x00, 0x45, 0x00, 0x01, 0xa4, 0x39, 0xdf, 0x40, 0x00, 0x40, 0x06, + 0x55, 0x5a, 0xac, 0x11, 0x51, 0x49, 0xad, 0xde, 0xfe, 0xe1, 0xc5, 0xf7, + 0x00, 0x50, 0xc5, 0x7e, 0x0e, 0x48, 0x49, 0x07, 0x42, 0x32, 0x80, 0x18, + 0x00, 0x73, 0x9a, 0x8f, 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0x03, 0x77, + 0x37, 0x9c, 0x42, 0x77, 0x5e, 0x3a, 0x47, 0x45, 0x54, 0x20, 0x2f, 0x20, + 0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x31, 0x0d, 0x0a, 0x48, 0x6f, + 0x73, 0x74, 0x3a, 0x20, 0x77, 0x77, 0x77, 0x2e, 0x66, 0x69, 0x73, 0x68, + 0x2e, 0x63, 0x6f, 0x6d, 0x0d, 0x0a, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x6b, 0x65, 0x65, 0x70, 0x2d, 0x61, + 0x6c, 0x69, 0x76, 0x65, 0x0d, 0x0a, 0x55, 0x73, 0x65, 0x72, 0x2d, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x3a, 0x20, 0x4d, 0x6f, 0x7a, 0x69, 0x6c, 0x6c, + 0x61, 0x2f, 0x35, 0x2e, 0x30, 0x20, 0x28, 0x58, 0x31, 0x31, 0x3b, 0x20, + 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x20, 0x78, 0x38, 0x36, 0x5f, 0x36, 0x34, + 0x29, 0x20, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x57, 0x65, 0x62, 0x4b, 0x69, + 0x74, 0x2f, 0x35, 0x33, 0x35, 0x2e, 0x32, 0x20, 0x28, 0x4b, 0x48, 0x54, + 0x4d, 0x4c, 0x2c, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x47, 0x65, 0x63, + 0x6b, 0x6f, 0x29, 0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x2f, 0x31, + 0x35, 0x2e, 0x30, 0x2e, 0x38, 0x37, 0x34, 0x2e, 0x31, 0x32, 0x31, 0x20, + 0x53, 0x61, 0x66, 0x61, 0x72, 0x69, 0x2f, 0x35, 0x2e, 0x31, + 0x0d, 0x0a, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x3a, 0x20, 0x74, 0x65, + 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x2c, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x78, 0x68, 0x74, 0x6d, + 0x6c, 0x2b, 0x78, 0x6d, 0x6c, 0x2c, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x78, 0x6d, 0x6c, 0x3b, 0x71, 0x3d, + 0x30, 0x2e, 0x39, 0x2c, 0x2a, 0x2f, 0x2a, 0x3b, 0x71, 0x3d, 0x30, 0x2e, + 0x38, 0x0d, 0x0a, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x67, 0x7a, 0x69, 0x70, + 0x2c, 0x64, 0x65, 0x66, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x73, 0x64, 0x63, + 0x68, 0x0d, 0x0a, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x4c, 0x61, + 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x65, 0x6e, 0x2d, 0x55, + 0x53, 0x2c, 0x65, 0x6e, 0x3b, 0x71, 0x3d, 0x30, 0x2e, 0x38, 0x0d, 0x0a, + 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x43, 0x68, 0x61, 0x72, 0x73, + 0x65, 0x74, 0x3a, 0x20, 0x49, 0x53, 0x4f, 0x2d, 0x38, 0x38, 0x35, 0x39, + 0x2d, 0x31, 0x2c, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x3b, 0x71, 0x3d, 0x30, + 0x2e, 0x37, 0x2c, 0x2a, 0x3b, 0x71, 0x3d, 0x30, 0x2e, 0x33, 0x0d, 0x0a, + 0x0d, 0x0a, +} +var sliceB = []byte{ + 0x00, 0x00, 0x0c, 0x9f, 0xf0, 0x20, 0xbc, 0x30, 0x5b, 0xe8, 0xd3, 0x49, + 0x08, 0x00, 0x45, 0x00, 0x01, 0xa4, 0x39, 0xdf, 0x40, 0x00, 0x40, 0x06, + 0x55, 0x5a, 0xac, 0x11, 0x51, 0x49, 0xad, 0xde, 0xfe, 0xe1, 0xc5, 0xf7, + 0x00, 0x50, 0xc5, 0x7e, 0x0e, 0x48, 0x49, 0x07, 0x42, 0x32, 0x80, 0x18, + 0x00, 0x73, 0x9a, 0x8f, 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0x03, 0x77, + 0x37, 0x9c, 0x42, 0x77, 0x5e, 0x3a, 0x47, 0x45, 0x54, 0x20, 0x2f, 0x20, + 0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x31, 0x0d, 0x0a, 0x48, 0x6f, + 0x73, 0x74, 0x3a, 0x20, 0x77, 0x77, 0x77, 0x2e, 0x66, 0x69, 0x73, 0x68, + 0x2e, 0x63, 0x6f, 0x6d, 0x0d, 0x0a, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x6c, 0x69, 0x76, 0x65, 0x0d, 0x0a, 0x55, 0x73, 0x65, 0x72, 0x2d, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x3a, 0x20, 0x4d, 0x6f, 0x7a, 0x69, 0x6c, 0x6c, + 0x61, 0x2f, 0x35, 0x2e, 0x30, 0x20, 0x28, 0x58, 0x31, 0x31, 0x3b, 0x20, + 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x20, 0x78, 0x38, 0x36, 0x5f, 0x36, 0x34, + 0x29, 0x20, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x57, 0x65, 0x62, 0x4b, 0x69, + 0x74, 0x2f, 0x35, 0x33, 0x35, 0x2e, 0x32, 0x20, 0x28, 0x4b, 0x48, 0x54, + 0x4d, 0x4c, 0x2c, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x47, 0x65, 0x63, + 0x6b, 0x6f, 0x29, 0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x2f, 0x31, + 0x35, 0x2e, 0x30, 0x2e, 0x38, 0x37, 0x34, 0x2e, 0x31, 0x32, 0x31, 0x20, + 0x53, 0x61, 0x66, 0x61, 0x72, 0x69, 0x2f, 0x35, 0x33, 0x35, 0x2e, 0x32, + 0x0d, 0x0a, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x3a, 0x20, 0x74, 0x65, + 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x2c, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x78, 0x68, 0x74, 0x6d, + 0x6c, 0x2b, 0x78, 0x6d, 0x6c, 0x2c, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x78, 0x6d, 0x6c, 0x3b, 0x71, 0x3d, + 0x30, 0x2e, 0x39, 0x2c, 0x2a, 0x2f, 0x2a, 0x3b, 0x71, 0x3d, 0x30, 0x2e, + 0x38, 0x0d, 0x0a, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x67, 0x7a, 0x69, 0x70, + 0x2c, 0x64, 0x65, 0x66, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x73, 0x64, 0x63, + 0x68, 0x0d, 0x0a, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x4c, 0x61, + 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x65, 0x6e, 0x2d, 0x55, + 0x53, 0x2c, 0x65, 0x6e, 0x3b, 0x71, 0x3d, 0x30, 0x2e, 0x38, 0x0d, 0x0a, + 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x43, 0x68, 0x61, 0x72, 0x73, + 0x65, 0x74, 0x3a, 0x20, 0x49, 0x53, 0x4f, 0x2e, 0x39, 0x55, 0x35, 0x39, + 0x2d, 0x31, 0x2c, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x3b, 0x71, 0x3d, 0x30, + 0x2e, 0x37, 0x2c, 0x2a, 0x3b, 0x71, 0x3d, 0x30, 0x2e, 0x33, 0x0d, 0x0a, + 0x0d, 0x0a, +} + +func main() { + fmt.Println(bytediff.BashOutput.String(bytediff.Diff(sliceA, sliceB))) +} diff --git a/vendor/github.com/google/gopacket/examples/httpassembly/main.go b/vendor/github.com/google/gopacket/examples/httpassembly/main.go new file mode 100644 index 0000000..02af21e --- /dev/null +++ b/vendor/github.com/google/gopacket/examples/httpassembly/main.go @@ -0,0 +1,127 @@ +// 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. + +// This binary provides sample code for using the gopacket TCP assembler and TCP +// stream reader. It reads packets off the wire and reconstructs HTTP requests +// it sees, logging them. +package main + +import ( + "bufio" + "flag" + "io" + "log" + "net/http" + "time" + + "github.com/google/gopacket" + "github.com/google/gopacket/examples/util" + "github.com/google/gopacket/layers" + "github.com/google/gopacket/pcap" + "github.com/google/gopacket/tcpassembly" + "github.com/google/gopacket/tcpassembly/tcpreader" +) + +var iface = flag.String("i", "eth0", "Interface to get packets from") +var fname = flag.String("r", "", "Filename to read from, overrides -i") +var snaplen = flag.Int("s", 1600, "SnapLen for pcap packet capture") +var filter = flag.String("f", "tcp and dst port 80", "BPF filter for pcap") +var logAllPackets = flag.Bool("v", false, "Logs every packet in great detail") + +// Build a simple HTTP request parser using tcpassembly.StreamFactory and tcpassembly.Stream interfaces + +// httpStreamFactory implements tcpassembly.StreamFactory +type httpStreamFactory struct{} + +// httpStream will handle the actual decoding of http requests. +type httpStream struct { + net, transport gopacket.Flow + r tcpreader.ReaderStream +} + +func (h *httpStreamFactory) New(net, transport gopacket.Flow) tcpassembly.Stream { + hstream := &httpStream{ + net: net, + transport: transport, + r: tcpreader.NewReaderStream(), + } + go hstream.run() // Important... we must guarantee that data from the reader stream is read. + + // ReaderStream implements tcpassembly.Stream, so we can return a pointer to it. + return &hstream.r +} + +func (h *httpStream) run() { + buf := bufio.NewReader(&h.r) + for { + req, err := http.ReadRequest(buf) + if err == io.EOF { + // We must read until we see an EOF... very important! + return + } else if err != nil { + log.Println("Error reading stream", h.net, h.transport, ":", err) + } else { + bodyBytes := tcpreader.DiscardBytesToEOF(req.Body) + req.Body.Close() + log.Println("Received request from stream", h.net, h.transport, ":", req, "with", bodyBytes, "bytes in request body") + } + } +} + +func main() { + defer util.Run()() + var handle *pcap.Handle + var err error + + // Set up pcap packet capture + if *fname != "" { + log.Printf("Reading from pcap dump %q", *fname) + handle, err = pcap.OpenOffline(*fname) + } else { + log.Printf("Starting capture on interface %q", *iface) + handle, err = pcap.OpenLive(*iface, int32(*snaplen), true, pcap.BlockForever) + } + if err != nil { + log.Fatal(err) + } + + if err := handle.SetBPFFilter(*filter); err != nil { + log.Fatal(err) + } + + // Set up assembly + streamFactory := &httpStreamFactory{} + streamPool := tcpassembly.NewStreamPool(streamFactory) + assembler := tcpassembly.NewAssembler(streamPool) + + log.Println("reading in packets") + // Read in packets, pass to assembler. + packetSource := gopacket.NewPacketSource(handle, handle.LinkType()) + packets := packetSource.Packets() + ticker := time.Tick(time.Minute) + for { + select { + case packet := <-packets: + // A nil packet indicates the end of a pcap file. + if packet == nil { + return + } + if *logAllPackets { + log.Println(packet) + } + if packet.NetworkLayer() == nil || packet.TransportLayer() == nil || packet.TransportLayer().LayerType() != layers.LayerTypeTCP { + log.Println("Unusable packet") + continue + } + tcp := packet.TransportLayer().(*layers.TCP) + assembler.AssembleWithTimestamp(packet.NetworkLayer().NetworkFlow(), tcp, packet.Metadata().Timestamp) + + case <-ticker: + // Every minute, flush connections that haven't seen activity in the past 2 minutes. + assembler.FlushOlderThan(time.Now().Add(time.Minute * -2)) + } + } +} diff --git a/vendor/github.com/google/gopacket/examples/pcapdump/main.go b/vendor/github.com/google/gopacket/examples/pcapdump/main.go new file mode 100644 index 0000000..373dee2 --- /dev/null +++ b/vendor/github.com/google/gopacket/examples/pcapdump/main.go @@ -0,0 +1,73 @@ +// 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. + +// The pcapdump binary implements a tcpdump-like command line tool with gopacket +// using pcap as a backend data collection mechanism. +package main + +import ( + "flag" + "fmt" + "github.com/google/gopacket/dumpcommand" + "github.com/google/gopacket/examples/util" + "github.com/google/gopacket/pcap" + "log" + "os" + "strings" + "time" +) + +var iface = flag.String("i", "eth0", "Interface to read packets from") +var fname = flag.String("r", "", "Filename to read from, overrides -i") +var snaplen = flag.Int("s", 65536, "Snap length (number of bytes max to read per packet") +var tstype = flag.String("timestamp_type", "", "Type of timestamps to use") +var promisc = flag.Bool("promisc", true, "Set promiscuous mode") + +func main() { + defer util.Run()() + var handle *pcap.Handle + var err error + if *fname != "" { + if handle, err = pcap.OpenOffline(*fname); err != nil { + log.Fatal("PCAP OpenOffline error:", err) + } + } else { + // This is a little complicated because we want to allow all possible options + // for creating the packet capture handle... instead of all this you can + // just call pcap.OpenLive if you want a simple handle. + inactive, err := pcap.NewInactiveHandle(*iface) + if err != nil { + log.Fatalf("could not create: %v", err) + } + defer inactive.CleanUp() + if err = inactive.SetSnapLen(*snaplen); err != nil { + log.Fatalf("could not set snap length: %v", err) + } else if err = inactive.SetPromisc(*promisc); err != nil { + log.Fatalf("could not set promisc mode: %v", err) + } else if err = inactive.SetTimeout(time.Second); err != nil { + log.Fatalf("could not set timeout: %v", err) + } + if *tstype != "" { + if t, err := pcap.TimestampSourceFromString(*tstype); err != nil { + log.Fatalf("Supported timestamp types: %v", inactive.SupportedTimestamps()) + } else if err := inactive.SetTimestampSource(t); err != nil { + log.Fatalf("Supported timestamp types: %v", inactive.SupportedTimestamps()) + } + } + if handle, err = inactive.Activate(); err != nil { + log.Fatal("PCAP Activate error:", err) + } + defer handle.Close() + } + if len(flag.Args()) > 0 { + bpffilter := strings.Join(flag.Args(), " ") + fmt.Fprintf(os.Stderr, "Using BPF filter %q\n", bpffilter) + if err = handle.SetBPFFilter(bpffilter); err != nil { + log.Fatal("BPF filter error:", err) + } + } + dumpcommand.Run(handle) +} diff --git a/vendor/github.com/google/gopacket/examples/pcaplay/main.go b/vendor/github.com/google/gopacket/examples/pcaplay/main.go new file mode 100644 index 0000000..d36d860 --- /dev/null +++ b/vendor/github.com/google/gopacket/examples/pcaplay/main.go @@ -0,0 +1,163 @@ +// 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. + +// The pcaplay binary load an offline capture (pcap file) and replay +// it on the select interface, with an emphasis on packet timing +package main + +import ( + "flag" + "fmt" + "io" + "log" + "os" + "strings" + "time" + + "github.com/google/gopacket" + "github.com/google/gopacket/examples/util" + "github.com/google/gopacket/pcap" +) + +var iface = flag.String("i", "eth0", "Interface to write packets to") +var fname = flag.String("r", "", "Filename to read from") +var fast = flag.Bool("f", false, "Send each packets as fast as possible") + +var lastTS time.Time +var lastSend time.Time + +var start time.Time +var bytesSent int + +func writePacketDelayed(handle *pcap.Handle, buf []byte, ci gopacket.CaptureInfo) { + if ci.CaptureLength != ci.Length { + // do not write truncated packets + return + } + + intervalInCapture := ci.Timestamp.Sub(lastTS) + elapsedTime := time.Since(lastSend) + + if (intervalInCapture > elapsedTime) && !lastSend.IsZero() { + time.Sleep(intervalInCapture - elapsedTime) + } + + lastSend = time.Now() + writePacket(handle, buf) + lastTS = ci.Timestamp +} + +func writePacket(handle *pcap.Handle, buf []byte) error { + if err := handle.WritePacketData(buf); err != nil { + log.Printf("Failed to send packet: %s\n", err) + return err + } + return nil +} + +func pcapInfo(filename string) (start time.Time, end time.Time, packets int, size int) { + handleRead, err := pcap.OpenOffline(*fname) + if err != nil { + log.Fatal("PCAP OpenOffline error (handle to read packet):", err) + } + + var previousTs time.Time + var deltaTotal time.Duration + + for { + data, ci, err := handleRead.ReadPacketData() + if err != nil && err != io.EOF { + log.Fatal(err) + } else if err == io.EOF { + break + } else { + + if start.IsZero() { + start = ci.Timestamp + } + end = ci.Timestamp + packets++ + size += len(data) + + if previousTs.IsZero() { + previousTs = ci.Timestamp + } else { + deltaTotal += ci.Timestamp.Sub(previousTs) + previousTs = ci.Timestamp + } + } + } + sec := int(deltaTotal.Seconds()) + if sec == 0 { + sec = 1 + } + fmt.Printf("Avg packet rate %d/s\n", packets/sec) + return start, end, packets, size +} + +func main() { + defer util.Run()() + + // Sanity checks + if *fname == "" { + log.Fatal("Need a input file") + } + + // Open PCAP file + handle potential BPF Filter + handleRead, err := pcap.OpenOffline(*fname) + if err != nil { + log.Fatal("PCAP OpenOffline error (handle to read packet):", err) + } + defer handleRead.Close() + if len(flag.Args()) > 0 { + bpffilter := strings.Join(flag.Args(), " ") + fmt.Fprintf(os.Stderr, "Using BPF filter %q\n", bpffilter) + if err = handleRead.SetBPFFilter(bpffilter); err != nil { + log.Fatal("BPF filter error:", err) + } + } + // Open up a second pcap handle for packet writes. + handleWrite, err := pcap.OpenLive(*iface, 65536, true, pcap.BlockForever) + if err != nil { + log.Fatal("PCAP OpenLive error (handle to write packet):", err) + } + defer handleWrite.Close() + + start = time.Now() + pkt := 0 + tsStart, tsEnd, packets, size := pcapInfo(*fname) + + // Loop over packets and write them + for { + data, ci, err := handleRead.ReadPacketData() + switch { + case err == io.EOF: + fmt.Printf("\nFinished in %s", time.Since(start)) + return + case err != nil: + log.Printf("Failed to read packet %d: %s\n", pkt, err) + default: + if *fast { + writePacket(handleWrite, data) + } else { + writePacketDelayed(handleWrite, data, ci) + } + + bytesSent += len(data) + duration := time.Since(start) + pkt++ + + if duration > time.Second { + rate := bytesSent / int(duration.Seconds()) + remainingTime := tsEnd.Sub(tsStart) - duration + fmt.Printf("\rrate %d kB/sec - sent %d/%d kB - %d/%d packets - remaining time %s", + rate/1000, bytesSent/1000, size/1000, + pkt, packets, remainingTime) + } + } + } + +} diff --git a/vendor/github.com/google/gopacket/examples/pfdump/main.go b/vendor/github.com/google/gopacket/examples/pfdump/main.go new file mode 100644 index 0000000..4b3ace6 --- /dev/null +++ b/vendor/github.com/google/gopacket/examples/pfdump/main.go @@ -0,0 +1,52 @@ +// 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. + +// The pfdump binary implements a tcpdump-like command line tool with gopacket +// using pfring as a backend data collection mechanism. +package main + +import ( + "flag" + "fmt" + "github.com/google/gopacket/dumpcommand" + "github.com/google/gopacket/examples/util" + "github.com/google/gopacket/pfring" + "log" + "os" + "strings" +) + +var iface = flag.String("i", "eth0", "Interface to read packets from") +var snaplen = flag.Int("s", 65536, "Snap length (number of bytes max to read per packet") +var cluster = flag.Int("cluster", -1, "If >= 0, sets the pfring cluster to this value") +var clustertype = flag.Int("clustertype", int(pfring.ClusterPerFlow), "Cluster type") + +func main() { + defer util.Run()() + var ring *pfring.Ring + var err error + if ring, err = pfring.NewRing(*iface, uint32(*snaplen), pfring.FlagPromisc); err != nil { + log.Fatalln("pfring ring creation error:", err) + } + if len(flag.Args()) > 0 { + bpffilter := strings.Join(flag.Args(), " ") + fmt.Fprintf(os.Stderr, "Using BPF filter %q\n", bpffilter) + if err = ring.SetBPFFilter(bpffilter); err != nil { + log.Fatalln("BPF filter error:", err) + } + } + if *cluster >= 0 { + if err = ring.SetCluster(*cluster, pfring.ClusterType(*clustertype)); err != nil { + log.Fatalln("pfring SetCluster error:", err) + } + } + if err = ring.SetSocketMode(pfring.ReadOnly); err != nil { + log.Fatalln("pfring SetSocketMode error:", err) + } else if err = ring.Enable(); err != nil { + log.Fatalln("pfring Enable error:", err) + } + dumpcommand.Run(ring) +} diff --git a/vendor/github.com/google/gopacket/examples/reassemblydump/compare.sh b/vendor/github.com/google/gopacket/examples/reassemblydump/compare.sh new file mode 100755 index 0000000..671d29f --- /dev/null +++ b/vendor/github.com/google/gopacket/examples/reassemblydump/compare.sh @@ -0,0 +1,103 @@ +#!/bin/bash + +# Limitations: if the number extracted files in too big, finding identical +# files might fail due to '*' in cmdline +# This would require to split sha256sum symlinks in xx/yyyyy + +usage() +{ + echo "Usage: $0 <file.pcap> <output-dir>" + echo "Compares tcpreassembly against tcpflow" + echo "" + echo "$@" + exit 1 +} + +debug() { + return # comment me for debug + echo "$@" +} + +die() +{ + ( + echo "$@" + echo + ) >&2 + exit 1 +} + +rename() +{ + local path="$1" + local filter="$2" + find "$path" -type f -name "$filter" -print0 | + while IFS= read -r -d $'\0' f; do + local sha256="$(sha256sum "$f" | cut -d ' ' -f 1)" + local target="$(dirname $f)/../sha256/$sha256" + debug "$target → $f" + mkdir -p "$(dirname "$target")" || return 1 + if [ ! -f "$target" ]; then + ln -sr "$f" "$target" || return 1 + fi + done + return $? +} + +main() +{ + local src="$1" + local out="$2" + + # TODO: make options + local extra="" + extra="$extra -debug" + extra="$extra -cpuprofile "$out/gopacket/cpu.prof"" + extra="$extra -memprofile "$out/gopacket/mem.prof"" + + [ ! -f "$src" ] && usage "Missing pcap" + [ ! -d "$out" ] && ( mkdir "$out" || die "Failed to create $out" ) + + mkdir -p "$out/gopacket/all" || die "Failed to create $out/gopacket/all" + mkdir -p "$out/tcpflow/all" || die "Faield to create $out/tcpflow/all" + + echo " * Running go reassembly" + time ./reassemblydump -r "$src" $debug -output "$out/gopacket/all" $extra -writeincomplete -ignorefsmerr -nooptcheck -allowmissinginit port 80 &> "$out/gopacket.txt" || die "Failed to run reassmbly. Check $out/gopacket.txt" + echo " * Running tcpflow" + time tcpflow -e http -r "$src" -o "$out/tcpflow/all" port 80 &> "$out/tcpflow.txt" || die "Failed to run tcpflow. Check $out/tcpflow.txt" + + echo " * Creating sha256sum symlinks for gopacket" + rename "$out/gopacket/all" '*' || die "Failed to rename in $out/gopacket" + echo " * Creating sha256sum symlinks for tcpflow" + rename "$out/tcpflow/all" '*HTTPBODY*' || die "Failed to rename in $out/tcpflow" + + # Remove identical files + echo " * Finding identical files" + local nb=0 + mkdir -p "$out/gopacket/sha256-equal" + mkdir -p "$out/tcpflow/sha256-equal" + for f in "$out/gopacket/sha256/"*; do + local f="$(basename "$f")" + [ -f "$out/tcpflow/sha256/$f" ] && { + debug " $f" + mv "$out/gopacket/sha256/$f" "$out/gopacket/sha256-equal" + mv "$out/tcpflow/sha256/$f" "$out/tcpflow/sha256-equal" + nb=$((nb+1)) + } + done + echo " → found $nb files" + + echo " * Diffing {gopacket,tcpflow}/sha256" + local rc=0 + for p in "gopacket" "tcpflow"; do + local nb=$(ls -1 "$out/$p/sha256/" | wc -l) + if [ $nb -ne 0 ]; then + rc=$((rc+1)) + echo " → $nb files in $out/$p/sha256" + fi + done + return $rc +} + +main "$@" +exit $? diff --git a/vendor/github.com/google/gopacket/examples/reassemblydump/main.go b/vendor/github.com/google/gopacket/examples/reassemblydump/main.go new file mode 100644 index 0000000..9fc3791 --- /dev/null +++ b/vendor/github.com/google/gopacket/examples/reassemblydump/main.go @@ -0,0 +1,650 @@ +// 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. + +// The pcapdump binary implements a tcpdump-like command line tool with gopacket +// using pcap as a backend data collection mechanism. +package main + +import ( + "bufio" + "bytes" + "compress/gzip" + "encoding/binary" + "encoding/hex" + "flag" + "fmt" + "io" + "io/ioutil" + "log" + "net/http" + "net/url" + "os" + "os/signal" + "path" + "runtime/pprof" + "strings" + "sync" + "time" + + "github.com/google/gopacket" + "github.com/google/gopacket/examples/util" + "github.com/google/gopacket/ip4defrag" + "github.com/google/gopacket/layers" // pulls in all layers decoders + "github.com/google/gopacket/pcap" + "github.com/google/gopacket/reassembly" +) + +var maxcount = flag.Int("c", -1, "Only grab this many packets, then exit") +var decoder = flag.String("decoder", "", "Name of the decoder to use (default: guess from capture)") +var statsevery = flag.Int("stats", 1000, "Output statistics every N packets") +var lazy = flag.Bool("lazy", false, "If true, do lazy decoding") +var nodefrag = flag.Bool("nodefrag", false, "If true, do not do IPv4 defrag") +var checksum = flag.Bool("checksum", false, "Check TCP checksum") +var nooptcheck = flag.Bool("nooptcheck", false, "Do not check TCP options (useful to ignore MSS on captures with TSO)") +var ignorefsmerr = flag.Bool("ignorefsmerr", false, "Ignore TCP FSM errors") +var allowmissinginit = flag.Bool("allowmissinginit", false, "Support streams without SYN/SYN+ACK/ACK sequence") +var verbose = flag.Bool("verbose", false, "Be verbose") +var debug = flag.Bool("debug", false, "Display debug information") +var quiet = flag.Bool("quiet", false, "Be quiet regarding errors") + +// http +var nohttp = flag.Bool("nohttp", false, "Disable HTTP parsing") +var output = flag.String("output", "", "Path to create file for HTTP 200 OK responses") +var writeincomplete = flag.Bool("writeincomplete", false, "Write incomplete response") + +var hexdump = flag.Bool("dump", false, "Dump HTTP request/response as hex") +var hexdumppkt = flag.Bool("dumppkt", false, "Dump packet as hex") + +// capture +var iface = flag.String("i", "eth0", "Interface to read packets from") +var fname = flag.String("r", "", "Filename to read from, overrides -i") +var snaplen = flag.Int("s", 65536, "Snap length (number of bytes max to read per packet") +var tstype = flag.String("timestamp_type", "", "Type of timestamps to use") +var promisc = flag.Bool("promisc", true, "Set promiscuous mode") + +var memprofile = flag.String("memprofile", "", "Write memory profile") + +var stats struct { + ipdefrag int + missedBytes int + pkt int + sz int + totalsz int + rejectFsm int + rejectOpt int + rejectConnFsm int + reassembled int + outOfOrderBytes int + outOfOrderPackets int + biggestChunkBytes int + biggestChunkPackets int + overlapBytes int + overlapPackets int +} + +const closeTimeout time.Duration = time.Hour * 24 // Closing inactive: TODO: from CLI +const timeout time.Duration = time.Minute * 5 // Pending bytes: TODO: from CLI + +/* + * HTTP part + */ + +type httpReader struct { + ident string + isClient bool + bytes chan []byte + data []byte + hexdump bool + parent *tcpStream +} + +func (h *httpReader) Read(p []byte) (int, error) { + ok := true + for ok && len(h.data) == 0 { + h.data, ok = <-h.bytes + } + if !ok || len(h.data) == 0 { + return 0, io.EOF + } + + l := copy(p, h.data) + h.data = h.data[l:] + return l, nil +} + +var outputLevel int +var errorsMap map[string]uint +var errors uint + +// Too bad for perf that a... is evaluated +func Error(t string, s string, a ...interface{}) { + errors++ + nb, _ := errorsMap[t] + errorsMap[t] = nb + 1 + if outputLevel >= 0 { + fmt.Printf(s, a...) + } +} +func Info(s string, a ...interface{}) { + if outputLevel >= 1 { + fmt.Printf(s, a...) + } +} +func Debug(s string, a ...interface{}) { + if outputLevel >= 2 { + fmt.Printf(s, a...) + } +} + +func (h *httpReader) run(wg *sync.WaitGroup) { + defer wg.Done() + b := bufio.NewReader(h) + for true { + if h.isClient { + req, err := http.ReadRequest(b) + if err == io.EOF || err == io.ErrUnexpectedEOF { + break + } else if err != nil { + Error("HTTP-request", "HTTP/%s Request error: %s (%v,%+v)\n", h.ident, err, err, err) + continue + } + body, err := ioutil.ReadAll(req.Body) + s := len(body) + if err != nil { + Error("HTTP-request-body", "Got body err: %s\n", err) + } else if h.hexdump { + Info("Body(%d/0x%x)\n%s\n", len(body), len(body), hex.Dump(body)) + } + req.Body.Close() + Info("HTTP/%s Request: %s %s (body:%d)\n", h.ident, req.Method, req.URL, s) + h.parent.urls = append(h.parent.urls, req.URL.String()) + } else { + res, err := http.ReadResponse(b, nil) + var req string + if len(h.parent.urls) == 0 { + req = fmt.Sprintf("<no-request-seen>") + } else { + req, h.parent.urls = h.parent.urls[0], h.parent.urls[1:] + } + if err == io.EOF || err == io.ErrUnexpectedEOF { + break + } else if err != nil { + Error("HTTP-response", "HTTP/%s Response error: %s (%v,%+v)\n", h.ident, err, err, err) + continue + } + body, err := ioutil.ReadAll(res.Body) + s := len(body) + if err != nil { + Error("HTTP-response-body", "HTTP/%s: failed to get body(parsed len:%d): %s\n", h.ident, s, err) + } + if h.hexdump { + Info("Body(%d/0x%x)\n%s\n", len(body), len(body), hex.Dump(body)) + } + res.Body.Close() + sym := "," + if res.ContentLength > 0 && res.ContentLength != int64(s) { + sym = "!=" + } + contentType, ok := res.Header["Content-Type"] + if !ok { + contentType = []string{http.DetectContentType(body)} + } + encoding := res.Header["Content-Encoding"] + Info("HTTP/%s Response: %s URL:%s (%d%s%d%s) -> %s\n", h.ident, res.Status, req, res.ContentLength, sym, s, contentType, encoding) + if (err == nil || *writeincomplete) && *output != "" { + base := url.QueryEscape(path.Base(req)) + if err != nil { + base = "incomplete-" + base + } + base = path.Join(*output, base) + if len(base) > 250 { + base = base[:250] + "..." + } + if base == *output { + base = path.Join(*output, "noname") + } + target := base + n := 0 + for true { + _, err := os.Stat(target) + //if os.IsNotExist(err) != nil { + if err != nil { + break + } + target = fmt.Sprintf("%s-%d", base, n) + n++ + } + f, err := os.Create(target) + if err != nil { + Error("HTTP-create", "Cannot create %s: %s\n", target, err) + continue + } + var r io.Reader + r = bytes.NewBuffer(body) + if len(encoding) > 0 && (encoding[0] == "gzip" || encoding[0] == "deflate") { + r, err = gzip.NewReader(r) + if err != nil { + Error("HTTP-gunzip", "Failed to gzip decode: %s", err) + } + } + if err == nil { + w, err := io.Copy(f, r) + if _, ok := r.(*gzip.Reader); ok { + r.(*gzip.Reader).Close() + } + f.Close() + if err != nil { + Error("HTTP-save", "%s: failed to save %s (l:%d): %s\n", h.ident, target, w, err) + } else { + Info("%s: Saved %s (l:%d)\n", h.ident, target, w) + } + } + } + } + } +} + +/* + * The TCP factory: returns a new Stream + */ +type tcpStreamFactory struct { + wg sync.WaitGroup + doHTTP bool +} + +func (factory *tcpStreamFactory) New(net, transport gopacket.Flow, tcp *layers.TCP, ac reassembly.AssemblerContext) reassembly.Stream { + Debug("* NEW: %s %s\n", net, transport) + fsmOptions := reassembly.TCPSimpleFSMOptions{ + SupportMissingEstablishment: *allowmissinginit, + } + stream := &tcpStream{ + net: net, + transport: transport, + isDNS: tcp.SrcPort == 53 || tcp.DstPort == 53, + isHTTP: (tcp.SrcPort == 80 || tcp.DstPort == 80) && factory.doHTTP, + reversed: tcp.SrcPort == 80, + tcpstate: reassembly.NewTCPSimpleFSM(fsmOptions), + ident: fmt.Sprintf("%s:%s", net, transport), + optchecker: reassembly.NewTCPOptionCheck(), + } + if stream.isHTTP { + stream.client = httpReader{ + bytes: make(chan []byte), + ident: fmt.Sprintf("%s %s", net, transport), + hexdump: *hexdump, + parent: stream, + isClient: true, + } + stream.server = httpReader{ + bytes: make(chan []byte), + ident: fmt.Sprintf("%s %s", net.Reverse(), transport.Reverse()), + hexdump: *hexdump, + parent: stream, + } + factory.wg.Add(2) + go stream.client.run(&factory.wg) + go stream.server.run(&factory.wg) + } + return stream +} + +func (factory *tcpStreamFactory) WaitGoRoutines() { + factory.wg.Wait() +} + +/* + * The assembler context + */ +type Context struct { + CaptureInfo gopacket.CaptureInfo +} + +func (c *Context) GetCaptureInfo() gopacket.CaptureInfo { + return c.CaptureInfo +} + +/* + * TCP stream + */ + +/* It's a connection (bidirectional) */ +type tcpStream struct { + tcpstate *reassembly.TCPSimpleFSM + fsmerr bool + optchecker reassembly.TCPOptionCheck + net, transport gopacket.Flow + isDNS bool + isHTTP bool + reversed bool + client httpReader + server httpReader + urls []string + ident string +} + +func (t *tcpStream) Accept(tcp *layers.TCP, ci gopacket.CaptureInfo, dir reassembly.TCPFlowDirection, acked reassembly.Sequence, start *bool, ac reassembly.AssemblerContext) bool { + // FSM + if !t.tcpstate.CheckState(tcp, dir) { + Error("FSM", "%s: Packet rejected by FSM (state:%s)\n", t.ident, t.tcpstate.String()) + stats.rejectFsm++ + if !t.fsmerr { + t.fsmerr = true + stats.rejectConnFsm++ + } + if !*ignorefsmerr { + return false + } + } + // Options + err := t.optchecker.Accept(tcp, ci, dir, acked, start) + if err != nil { + Error("OptionChecker", "%s: Packet rejected by OptionChecker: %s\n", t.ident, err) + stats.rejectOpt++ + if !*nooptcheck { + return false + } + } + // Checksum + accept := true + if *checksum { + c, err := tcp.ComputeChecksum() + if err != nil { + Error("ChecksumCompute", "%s: Got error computing checksum: %s\n", t.ident, err) + accept = false + } else if c != 0x0 { + Error("Checksum", "%s: Invalid checksum: 0x%x\n", t.ident, c) + accept = false + } + } + if !accept { + stats.rejectOpt++ + } + return accept +} + +func (t *tcpStream) ReassembledSG(sg reassembly.ScatterGather, ac reassembly.AssemblerContext) { + dir, start, end, skip := sg.Info() + length, saved := sg.Lengths() + // update stats + sgStats := sg.Stats() + if skip > 0 { + stats.missedBytes += skip + } + stats.sz += length - saved + stats.pkt += sgStats.Packets + if sgStats.Chunks > 1 { + stats.reassembled++ + } + stats.outOfOrderPackets += sgStats.QueuedPackets + stats.outOfOrderBytes += sgStats.QueuedBytes + if length > stats.biggestChunkBytes { + stats.biggestChunkBytes = length + } + if sgStats.Packets > stats.biggestChunkPackets { + stats.biggestChunkPackets = sgStats.Packets + } + if sgStats.OverlapBytes != 0 && sgStats.OverlapPackets == 0 { + fmt.Printf("bytes:%d, pkts:%d\n", sgStats.OverlapBytes, sgStats.OverlapPackets) + panic("Invalid overlap") + } + stats.overlapBytes += sgStats.OverlapBytes + stats.overlapPackets += sgStats.OverlapPackets + + var ident string + if dir == reassembly.TCPDirClientToServer { + ident = fmt.Sprintf("%v %v(%s): ", t.net, t.transport, dir) + } else { + ident = fmt.Sprintf("%v %v(%s): ", t.net.Reverse(), t.transport.Reverse(), dir) + } + Debug("%s: SG reassembled packet with %d bytes (start:%v,end:%v,skip:%d,saved:%d,nb:%d,%d,overlap:%d,%d)\n", ident, length, start, end, skip, saved, sgStats.Packets, sgStats.Chunks, sgStats.OverlapBytes, sgStats.OverlapPackets) + if skip == -1 && *allowmissinginit { + // this is allowed + } else if skip != 0 { + // Missing bytes in stream: do not even try to parse it + return + } + data := sg.Fetch(length) + if t.isDNS { + dns := &layers.DNS{} + var decoded []gopacket.LayerType + if len(data) < 2 { + if len(data) > 0 { + sg.KeepFrom(0) + } + return + } + dnsSize := binary.BigEndian.Uint16(data[:2]) + missing := int(dnsSize) - len(data[2:]) + Debug("dnsSize: %d, missing: %d\n", dnsSize, missing) + if missing > 0 { + Info("Missing some bytes: %d\n", missing) + sg.KeepFrom(0) + return + } + p := gopacket.NewDecodingLayerParser(layers.LayerTypeDNS, dns) + err := p.DecodeLayers(data[2:], &decoded) + if err != nil { + Error("DNS-parser", "Failed to decode DNS: %v\n", err) + } else { + Debug("DNS: %s\n", gopacket.LayerDump(dns)) + } + if len(data) > 2+int(dnsSize) { + sg.KeepFrom(2 + int(dnsSize)) + } + } else if t.isHTTP { + if length > 0 { + if *hexdump { + Debug("Feeding http with:\n%s", hex.Dump(data)) + } + if dir == reassembly.TCPDirClientToServer && !t.reversed { + t.client.bytes <- data + } else { + t.server.bytes <- data + } + } + } +} + +func (t *tcpStream) ReassemblyComplete(ac reassembly.AssemblerContext) bool { + Debug("%s: Connection closed\n", t.ident) + if t.isHTTP { + close(t.client.bytes) + close(t.server.bytes) + } + // do not remove the connection to allow last ACK + return false +} + +func main() { + defer util.Run()() + var handle *pcap.Handle + var err error + if *debug { + outputLevel = 2 + } else if *verbose { + outputLevel = 1 + } else if *quiet { + outputLevel = -1 + } + errorsMap = make(map[string]uint) + if *fname != "" { + if handle, err = pcap.OpenOffline(*fname); err != nil { + log.Fatal("PCAP OpenOffline error:", err) + } + } else { + // This is a little complicated because we want to allow all possible options + // for creating the packet capture handle... instead of all this you can + // just call pcap.OpenLive if you want a simple handle. + inactive, err := pcap.NewInactiveHandle(*iface) + if err != nil { + log.Fatal("could not create: %v", err) + } + defer inactive.CleanUp() + if err = inactive.SetSnapLen(*snaplen); err != nil { + log.Fatal("could not set snap length: %v", err) + } else if err = inactive.SetPromisc(*promisc); err != nil { + log.Fatal("could not set promisc mode: %v", err) + } else if err = inactive.SetTimeout(time.Second); err != nil { + log.Fatal("could not set timeout: %v", err) + } + if *tstype != "" { + if t, err := pcap.TimestampSourceFromString(*tstype); err != nil { + log.Fatalf("Supported timestamp types: %v", inactive.SupportedTimestamps()) + } else if err := inactive.SetTimestampSource(t); err != nil { + log.Fatalf("Supported timestamp types: %v", inactive.SupportedTimestamps()) + } + } + if handle, err = inactive.Activate(); err != nil { + log.Fatal("PCAP Activate error:", err) + } + defer handle.Close() + } + if len(flag.Args()) > 0 { + bpffilter := strings.Join(flag.Args(), " ") + Info("Using BPF filter %q\n", bpffilter) + if err = handle.SetBPFFilter(bpffilter); err != nil { + log.Fatal("BPF filter error:", err) + } + } + + var dec gopacket.Decoder + var ok bool + decoder_name := *decoder + if decoder_name == "" { + decoder_name = fmt.Sprintf("%s", handle.LinkType()) + } + if dec, ok = gopacket.DecodersByLayerName[decoder_name]; !ok { + log.Fatalln("No decoder named", decoder_name) + } + source := gopacket.NewPacketSource(handle, dec) + source.Lazy = *lazy + source.NoCopy = true + Info("Starting to read packets\n") + count := 0 + bytes := int64(0) + start := time.Now() + defragger := ip4defrag.NewIPv4Defragmenter() + + streamFactory := &tcpStreamFactory{doHTTP: !*nohttp} + streamPool := reassembly.NewStreamPool(streamFactory) + assembler := reassembly.NewAssembler(streamPool) + + signalChan := make(chan os.Signal, 1) + signal.Notify(signalChan, os.Interrupt) + + for packet := range source.Packets() { + count++ + Debug("PACKET #%d\n", count) + data := packet.Data() + bytes += int64(len(data)) + if *hexdumppkt { + Debug("Packet content (%d/0x%x)\n%s\n", len(data), len(data), hex.Dump(data)) + } + + // defrag the IPv4 packet if required + if !*nodefrag { + ip4Layer := packet.Layer(layers.LayerTypeIPv4) + if ip4Layer == nil { + continue + } + ip4 := ip4Layer.(*layers.IPv4) + l := ip4.Length + newip4, err := defragger.DefragIPv4(ip4) + if err != nil { + log.Fatalln("Error while de-fragmenting", err) + } else if newip4 == nil { + Debug("Fragment...\n") + continue // packet fragment, we don't have whole packet yet. + } + if newip4.Length != l { + stats.ipdefrag++ + Debug("Decoding re-assembled packet: %s\n", newip4.NextLayerType()) + pb, ok := packet.(gopacket.PacketBuilder) + if !ok { + panic("Not a PacketBuilder") + } + nextDecoder := newip4.NextLayerType() + nextDecoder.Decode(newip4.Payload, pb) + } + } + + tcp := packet.Layer(layers.LayerTypeTCP) + if tcp != nil { + tcp := tcp.(*layers.TCP) + if *checksum { + err := tcp.SetNetworkLayerForChecksum(packet.NetworkLayer()) + if err != nil { + log.Fatalf("Failed to set network layer for checksum: %s\n", err) + } + } + c := Context{ + CaptureInfo: packet.Metadata().CaptureInfo, + } + stats.totalsz += len(tcp.Payload) + assembler.AssembleWithContext(packet.NetworkLayer().NetworkFlow(), tcp, &c) + } + if count%*statsevery == 0 { + ref := packet.Metadata().CaptureInfo.Timestamp + flushed, closed := assembler.FlushWithOptions(reassembly.FlushOptions{T: ref.Add(-timeout), TC: ref.Add(-closeTimeout)}) + Debug("Forced flush: %d flushed, %d closed (%s)", flushed, closed, ref) + } + + done := *maxcount > 0 && count >= *maxcount + if count%*statsevery == 0 || done { + fmt.Fprintf(os.Stderr, "Processed %v packets (%v bytes) in %v (errors: %v, type:%v)\n", count, bytes, time.Since(start), errors, len(errorsMap)) + } + select { + case <-signalChan: + fmt.Fprintf(os.Stderr, "\nCaught SIGINT: aborting\n") + done = true + default: + // NOP: continue + } + if done { + break + } + } + + closed := assembler.FlushAll() + Debug("Final flush: %d closed", closed) + if outputLevel >= 2 { + streamPool.Dump() + } + + if *memprofile != "" { + f, err := os.Create(*memprofile) + if err != nil { + log.Fatal(err) + } + pprof.WriteHeapProfile(f) + f.Close() + } + + streamFactory.WaitGoRoutines() + Debug("%s\n", assembler.Dump()) + if !*nodefrag { + fmt.Printf("IPdefrag:\t\t%d\n", stats.ipdefrag) + } + fmt.Printf("TCP stats:\n") + fmt.Printf(" missed bytes:\t\t%d\n", stats.missedBytes) + fmt.Printf(" total packets:\t\t%d\n", stats.pkt) + fmt.Printf(" rejected FSM:\t\t%d\n", stats.rejectFsm) + fmt.Printf(" rejected Options:\t%d\n", stats.rejectOpt) + fmt.Printf(" reassembled bytes:\t%d\n", stats.sz) + fmt.Printf(" total TCP bytes:\t%d\n", stats.totalsz) + fmt.Printf(" conn rejected FSM:\t%d\n", stats.rejectConnFsm) + fmt.Printf(" reassembled chunks:\t%d\n", stats.reassembled) + fmt.Printf(" out-of-order packets:\t%d\n", stats.outOfOrderPackets) + fmt.Printf(" out-of-order bytes:\t%d\n", stats.outOfOrderBytes) + fmt.Printf(" biggest-chunk packets:\t%d\n", stats.biggestChunkPackets) + fmt.Printf(" biggest-chunk bytes:\t%d\n", stats.biggestChunkBytes) + fmt.Printf(" overlap packets:\t%d\n", stats.overlapPackets) + fmt.Printf(" overlap bytes:\t\t%d\n", stats.overlapBytes) + fmt.Printf("Errors: %d\n", errors) + for e, _ := range errorsMap { + fmt.Printf(" %s:\t\t%d\n", e, errorsMap[e]) + } +} diff --git a/vendor/github.com/google/gopacket/examples/statsassembly/main.go b/vendor/github.com/google/gopacket/examples/statsassembly/main.go new file mode 100644 index 0000000..36da011 --- /dev/null +++ b/vendor/github.com/google/gopacket/examples/statsassembly/main.go @@ -0,0 +1,211 @@ +// 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. + +// This binary provides sample code for using the gopacket TCP assembler raw, +// without the help of the tcpreader library. It watches TCP streams and +// reports statistics on completed streams. +// +// It also uses gopacket.DecodingLayerParser instead of the normal +// gopacket.PacketSource, to highlight the methods, pros, and cons of this +// approach. +package main + +import ( + "flag" + "github.com/google/gopacket" + "github.com/google/gopacket/examples/util" + "github.com/google/gopacket/layers" + "github.com/google/gopacket/pcap" + "github.com/google/gopacket/tcpassembly" + "log" + "time" +) + +var iface = flag.String("i", "eth0", "Interface to get packets from") +var snaplen = flag.Int("s", 65536, "SnapLen for pcap packet capture") +var filter = flag.String("f", "tcp", "BPF filter for pcap") +var logAllPackets = flag.Bool("v", false, "Log whenever we see a packet") +var bufferedPerConnection = flag.Int("connection_max_buffer", 0, ` +Max packets to buffer for a single connection before skipping over a gap in data +and continuing to stream the connection after the buffer. If zero or less, this +is infinite.`) +var bufferedTotal = flag.Int("total_max_buffer", 0, ` +Max packets to buffer total before skipping over gaps in connections and +continuing to stream connection data. If zero or less, this is infinite`) +var flushAfter = flag.String("flush_after", "2m", ` +Connections which have buffered packets (they've gotten packets out of order and +are waiting for old packets to fill the gaps) are flushed after they're this old +(their oldest gap is skipped). Any string parsed by time.ParseDuration is +acceptable here`) +var packetCount = flag.Int("c", -1, ` +Quit after processing this many packets, flushing all currently buffered +connections. If negative, this is infinite`) + +// simpleStreamFactory implements tcpassembly.StreamFactory +type statsStreamFactory struct{} + +// statsStream will handle the actual decoding of stats requests. +type statsStream struct { + net, transport gopacket.Flow + bytes, packets, outOfOrder, skipped int64 + start, end time.Time + sawStart, sawEnd bool +} + +// New creates a new stream. It's called whenever the assembler sees a stream +// it isn't currently following. +func (factory *statsStreamFactory) New(net, transport gopacket.Flow) tcpassembly.Stream { + log.Printf("new stream %v:%v started", net, transport) + s := &statsStream{ + net: net, + transport: transport, + start: time.Now(), + } + s.end = s.start + // ReaderStream implements tcpassembly.Stream, so we can return a pointer to it. + return s +} + +// Reassembled is called whenever new packet data is available for reading. +// Reassembly objects contain stream data IN ORDER. +func (s *statsStream) Reassembled(reassemblies []tcpassembly.Reassembly) { + for _, reassembly := range reassemblies { + if reassembly.Seen.Before(s.end) { + s.outOfOrder++ + } else { + s.end = reassembly.Seen + } + s.bytes += int64(len(reassembly.Bytes)) + s.packets += 1 + if reassembly.Skip > 0 { + s.skipped += int64(reassembly.Skip) + } + s.sawStart = s.sawStart || reassembly.Start + s.sawEnd = s.sawEnd || reassembly.End + } +} + +// ReassemblyComplete is called when the TCP assembler believes a stream has +// finished. +func (s *statsStream) ReassemblyComplete() { + diffSecs := float64(s.end.Sub(s.start)) / float64(time.Second) + log.Printf("Reassembly of stream %v:%v complete - start:%v end:%v bytes:%v packets:%v ooo:%v bps:%v pps:%v skipped:%v", + s.net, s.transport, s.start, s.end, s.bytes, s.packets, s.outOfOrder, + float64(s.bytes)/diffSecs, float64(s.packets)/diffSecs, s.skipped) +} + +func main() { + defer util.Run()() + + flushDuration, err := time.ParseDuration(*flushAfter) + if err != nil { + log.Fatal("invalid flush duration: ", *flushAfter) + } + + log.Printf("starting capture on interface %q", *iface) + // Set up pcap packet capture + handle, err := pcap.OpenLive(*iface, int32(*snaplen), true, flushDuration/2) + if err != nil { + log.Fatal("error opening pcap handle: ", err) + } + if err := handle.SetBPFFilter(*filter); err != nil { + log.Fatal("error setting BPF filter: ", err) + } + + // Set up assembly + streamFactory := &statsStreamFactory{} + streamPool := tcpassembly.NewStreamPool(streamFactory) + assembler := tcpassembly.NewAssembler(streamPool) + assembler.MaxBufferedPagesPerConnection = *bufferedPerConnection + assembler.MaxBufferedPagesTotal = *bufferedTotal + + log.Println("reading in packets") + + // We use a DecodingLayerParser here instead of a simpler PacketSource. + // This approach should be measurably faster, but is also more rigid. + // PacketSource will handle any known type of packet safely and easily, + // but DecodingLayerParser will only handle those packet types we + // specifically pass in. This trade-off can be quite useful, though, in + // high-throughput situations. + var eth layers.Ethernet + var dot1q layers.Dot1Q + var ip4 layers.IPv4 + var ip6 layers.IPv6 + var ip6extensions layers.IPv6ExtensionSkipper + var tcp layers.TCP + var payload gopacket.Payload + parser := gopacket.NewDecodingLayerParser(layers.LayerTypeEthernet, + ð, &dot1q, &ip4, &ip6, &ip6extensions, &tcp, &payload) + decoded := make([]gopacket.LayerType, 0, 4) + + nextFlush := time.Now().Add(flushDuration / 2) + + var byteCount int64 + start := time.Now() + +loop: + for ; *packetCount != 0; *packetCount-- { + // Check to see if we should flush the streams we have + // that haven't seen any new data in a while. Note we set a + // timeout on our PCAP handle, so this should happen even if we + // never see packet data. + if time.Now().After(nextFlush) { + stats, _ := handle.Stats() + log.Printf("flushing all streams that haven't seen packets in the last 2 minutes, pcap stats: %+v", stats) + assembler.FlushOlderThan(time.Now().Add(flushDuration)) + nextFlush = time.Now().Add(flushDuration / 2) + } + + // To speed things up, we're also using the ZeroCopy method for + // reading packet data. This method is faster than the normal + // ReadPacketData, but the returned bytes in 'data' are + // invalidated by any subsequent ZeroCopyReadPacketData call. + // Note that tcpassembly is entirely compatible with this packet + // reading method. This is another trade-off which might be + // appropriate for high-throughput sniffing: it avoids a packet + // copy, but its cost is much more careful handling of the + // resulting byte slice. + data, ci, err := handle.ZeroCopyReadPacketData() + + if err != nil { + log.Printf("error getting packet: %v", err) + continue + } + err = parser.DecodeLayers(data, &decoded) + if err != nil { + log.Printf("error decoding packet: %v", err) + continue + } + if *logAllPackets { + log.Printf("decoded the following layers: %v", decoded) + } + byteCount += int64(len(data)) + // Find either the IPv4 or IPv6 address to use as our network + // layer. + foundNetLayer := false + var netFlow gopacket.Flow + for _, typ := range decoded { + switch typ { + case layers.LayerTypeIPv4: + netFlow = ip4.NetworkFlow() + foundNetLayer = true + case layers.LayerTypeIPv6: + netFlow = ip6.NetworkFlow() + foundNetLayer = true + case layers.LayerTypeTCP: + if foundNetLayer { + assembler.AssembleWithTimestamp(netFlow, &tcp, ci.Timestamp) + } else { + log.Println("could not find IPv4 or IPv6 layer, inoring") + } + continue loop + } + } + log.Println("could not find TCP layer") + } + assembler.FlushAll() + log.Printf("processed %d bytes in %v", byteCount, time.Since(start)) +} diff --git a/vendor/github.com/google/gopacket/examples/synscan/main.go b/vendor/github.com/google/gopacket/examples/synscan/main.go new file mode 100644 index 0000000..7a2345f --- /dev/null +++ b/vendor/github.com/google/gopacket/examples/synscan/main.go @@ -0,0 +1,259 @@ +// 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. + +// synscan implements a TCP syn scanner on top of pcap. +// It's more complicated than arpscan, since it has to handle sending packets +// outside the local network, requiring some routing and ARP work. +// +// Since this is just an example program, it aims for simplicity over +// performance. It doesn't handle sending packets very quickly, it scans IPs +// serially instead of in parallel, and uses gopacket.Packet instead of +// gopacket.DecodingLayerParser for packet processing. We also make use of very +// simple timeout logic with time.Since. +// +// Making it blazingly fast is left as an exercise to the reader. +package main + +import ( + "errors" + "flag" + "log" + "net" + "time" + + "github.com/google/gopacket" + "github.com/google/gopacket/examples/util" + "github.com/google/gopacket/layers" + "github.com/google/gopacket/pcap" + "github.com/google/gopacket/routing" +) + +// scanner handles scanning a single IP address. +type scanner struct { + // iface is the interface to send packets on. + iface *net.Interface + // destination, gateway (if applicable), and source IP addresses to use. + dst, gw, src net.IP + + handle *pcap.Handle + + // opts and buf allow us to easily serialize packets in the send() + // method. + opts gopacket.SerializeOptions + buf gopacket.SerializeBuffer +} + +// newScanner creates a new scanner for a given destination IP address, using +// router to determine how to route packets to that IP. +func newScanner(ip net.IP, router routing.Router) (*scanner, error) { + s := &scanner{ + dst: ip, + opts: gopacket.SerializeOptions{ + FixLengths: true, + ComputeChecksums: true, + }, + buf: gopacket.NewSerializeBuffer(), + } + // Figure out the route to the IP. + iface, gw, src, err := router.Route(ip) + if err != nil { + return nil, err + } + log.Printf("scanning ip %v with interface %v, gateway %v, src %v", ip, iface.Name, gw, src) + s.gw, s.src, s.iface = gw, src, iface + + // Open the handle for reading/writing. + // Note we could very easily add some BPF filtering here to greatly + // decrease the number of packets we have to look at when getting back + // scan results. + handle, err := pcap.OpenLive(iface.Name, 65536, true, pcap.BlockForever) + if err != nil { + return nil, err + } + s.handle = handle + return s, nil +} + +// close cleans up the handle. +func (s *scanner) close() { + s.handle.Close() +} + +// getHwAddr is a hacky but effective way to get the destination hardware +// address for our packets. It does an ARP request for our gateway (if there is +// one) or destination IP (if no gateway is necessary), then waits for an ARP +// reply. This is pretty slow right now, since it blocks on the ARP +// request/reply. +func (s *scanner) getHwAddr() (net.HardwareAddr, error) { + start := time.Now() + arpDst := s.dst + if s.gw != nil { + arpDst = s.gw + } + // Prepare the layers to send for an ARP request. + eth := layers.Ethernet{ + SrcMAC: s.iface.HardwareAddr, + DstMAC: net.HardwareAddr{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, + EthernetType: layers.EthernetTypeARP, + } + arp := layers.ARP{ + AddrType: layers.LinkTypeEthernet, + Protocol: layers.EthernetTypeIPv4, + HwAddressSize: 6, + ProtAddressSize: 4, + Operation: layers.ARPRequest, + SourceHwAddress: []byte(s.iface.HardwareAddr), + SourceProtAddress: []byte(s.src), + DstHwAddress: []byte{0, 0, 0, 0, 0, 0}, + DstProtAddress: []byte(arpDst), + } + // Send a single ARP request packet (we never retry a send, since this + // is just an example ;) + if err := s.send(ð, &arp); err != nil { + return nil, err + } + // Wait 3 seconds for an ARP reply. + for { + if time.Since(start) > time.Second*3 { + return nil, errors.New("timeout getting ARP reply") + } + data, _, err := s.handle.ReadPacketData() + if err == pcap.NextErrorTimeoutExpired { + continue + } else if err != nil { + return nil, err + } + packet := gopacket.NewPacket(data, layers.LayerTypeEthernet, gopacket.NoCopy) + if arpLayer := packet.Layer(layers.LayerTypeARP); arpLayer != nil { + arp := arpLayer.(*layers.ARP) + if net.IP(arp.SourceProtAddress).Equal(net.IP(arpDst)) { + return net.HardwareAddr(arp.SourceHwAddress), nil + } + } + } +} + +// scan scans the dst IP address of this scanner. +func (s *scanner) scan() error { + // First off, get the MAC address we should be sending packets to. + hwaddr, err := s.getHwAddr() + if err != nil { + return err + } + // Construct all the network layers we need. + eth := layers.Ethernet{ + SrcMAC: s.iface.HardwareAddr, + DstMAC: hwaddr, + EthernetType: layers.EthernetTypeIPv4, + } + ip4 := layers.IPv4{ + SrcIP: s.src, + DstIP: s.dst, + Version: 4, + TTL: 64, + Protocol: layers.IPProtocolTCP, + } + tcp := layers.TCP{ + SrcPort: 54321, + DstPort: 0, // will be incremented during the scan + SYN: true, + } + tcp.SetNetworkLayerForChecksum(&ip4) + + // Create the flow we expect returning packets to have, so we can check + // against it and discard useless packets. + ipFlow := gopacket.NewFlow(layers.EndpointIPv4, s.dst, s.src) + start := time.Now() + for { + // Send one packet per loop iteration until we've sent packets + // to all of ports [1, 65535]. + if tcp.DstPort < 65535 { + start = time.Now() + tcp.DstPort++ + if err := s.send(ð, &ip4, &tcp); err != nil { + log.Printf("error sending to port %v: %v", tcp.DstPort, err) + } + } + // Time out 5 seconds after the last packet we sent. + if time.Since(start) > time.Second*5 { + log.Printf("timed out for %v, assuming we've seen all we can", s.dst) + return nil + } + + // Read in the next packet. + data, _, err := s.handle.ReadPacketData() + if err == pcap.NextErrorTimeoutExpired { + continue + } else if err != nil { + log.Printf("error reading packet: %v", err) + continue + } + + // Parse the packet. We'd use DecodingLayerParser here if we + // wanted to be really fast. + packet := gopacket.NewPacket(data, layers.LayerTypeEthernet, gopacket.NoCopy) + + // Find the packets we care about, and print out logging + // information about them. All others are ignored. + if net := packet.NetworkLayer(); net == nil { + // log.Printf("packet has no network layer") + } else if net.NetworkFlow() != ipFlow { + // log.Printf("packet does not match our ip src/dst") + } else if tcpLayer := packet.Layer(layers.LayerTypeTCP); tcpLayer == nil { + // log.Printf("packet has not tcp layer") + } else if tcp, ok := tcpLayer.(*layers.TCP); !ok { + // We panic here because this is guaranteed to never + // happen. + panic("tcp layer is not tcp layer :-/") + } else if tcp.DstPort != 54321 { + // log.Printf("dst port %v does not match", tcp.DstPort) + } else if tcp.RST { + log.Printf(" port %v closed", tcp.SrcPort) + } else if tcp.SYN && tcp.ACK { + log.Printf(" port %v open", tcp.SrcPort) + } else { + // log.Printf("ignoring useless packet") + } + } +} + +// send sends the given layers as a single packet on the network. +func (s *scanner) send(l ...gopacket.SerializableLayer) error { + if err := gopacket.SerializeLayers(s.buf, s.opts, l...); err != nil { + return err + } + return s.handle.WritePacketData(s.buf.Bytes()) +} + +func main() { + defer util.Run()() + router, err := routing.New() + if err != nil { + log.Fatal("routing error:", err) + } + for _, arg := range flag.Args() { + var ip net.IP + if ip = net.ParseIP(arg); ip == nil { + log.Printf("non-ip target: %q", arg) + continue + } else if ip = ip.To4(); ip == nil { + log.Printf("non-ipv4 target: %q", arg) + continue + } + // Note: newScanner creates and closes a pcap Handle once for + // every scan target. We could do much better, were this not an + // example ;) + s, err := newScanner(ip, router) + if err != nil { + log.Printf("unable to create scanner for %v: %v", ip, err) + continue + } + if err := s.scan(); err != nil { + log.Printf("unable to scan %v: %v", ip, err) + } + s.close() + } +} diff --git a/vendor/github.com/google/gopacket/examples/util/util.go b/vendor/github.com/google/gopacket/examples/util/util.go new file mode 100644 index 0000000..0f698fb --- /dev/null +++ b/vendor/github.com/google/gopacket/examples/util/util.go @@ -0,0 +1,40 @@ +// 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 util provides shared utilities for all gopacket examples. +package util + +import ( + "flag" + "log" + "os" + "runtime/pprof" +) + +var cpuprofile = flag.String("cpuprofile", "", "Where to write CPU profile") + +// Run starts up stuff at the beginning of a main function, and returns a +// function to defer until the function completes. It should be used like this: +// +// func main() { +// defer util.Run()() +// ... stuff ... +// } +func Run() func() { + flag.Parse() + if *cpuprofile != "" { + f, err := os.Create(*cpuprofile) + if err != nil { + log.Fatalf("could not open cpu profile file %q", *cpuprofile) + } + pprof.StartCPUProfile(f) + return func() { + pprof.StopCPUProfile() + f.Close() + } + } + return func() {} +} diff --git a/vendor/github.com/google/gopacket/flows.go b/vendor/github.com/google/gopacket/flows.go new file mode 100644 index 0000000..7203ead --- /dev/null +++ b/vendor/github.com/google/gopacket/flows.go @@ -0,0 +1,236 @@ +// 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 gopacket + +import ( + "bytes" + "fmt" + "strconv" +) + +// MaxEndpointSize determines the maximum size in bytes of an endpoint address. +// +// Endpoints/Flows have a problem: They need to be hashable. Therefore, they +// can't use a byte slice. The two obvious choices are to use a string or a +// byte array. Strings work great, but string creation requires memory +// allocation, which can be slow. Arrays work great, but have a fixed size. We +// originally used the former, now we've switched to the latter. Use of a fixed +// byte-array doubles the speed of constructing a flow (due to not needing to +// allocate). This is a huge increase... too much for us to pass up. +// +// The end result of this, though, is that an endpoint/flow can't be created +// using more than MaxEndpointSize bytes per address. +const MaxEndpointSize = 16 + +// Endpoint is the set of bytes used to address packets at various layers. +// See LinkLayer, NetworkLayer, and TransportLayer specifications. +// Endpoints are usable as map keys. +type Endpoint struct { + typ EndpointType + len int + raw [MaxEndpointSize]byte +} + +// EndpointType returns the endpoint type associated with this endpoint. +func (a Endpoint) EndpointType() EndpointType { return a.typ } + +// Raw returns the raw bytes of this endpoint. These aren't human-readable +// most of the time, but they are faster than calling String. +func (a Endpoint) Raw() []byte { return a.raw[:a.len] } + +// LessThan provides a stable ordering for all endpoints. It sorts first based +// on the EndpointType of an endpoint, then based on the raw bytes of that +// endpoint. +// +// For some endpoints, the actual comparison may not make sense, however this +// ordering does provide useful information for most Endpoint types. +// Ordering is based first on endpoint type, then on raw endpoint bytes. +// Endpoint bytes are sorted lexigraphically. +func (a Endpoint) LessThan(b Endpoint) bool { + return a.typ < b.typ || (a.typ == b.typ && bytes.Compare(a.raw[:a.len], b.raw[:b.len]) < 0) +} + +// fnvHash is used by our FastHash functions, and implements the FNV hash +// created by Glenn Fowler, Landon Curt Noll, and Phong Vo. +// See http://isthe.com/chongo/tech/comp/fnv/. +func fnvHash(s []byte) (h uint64) { + h = fnvBasis + for i := 0; i < len(s); i++ { + h ^= uint64(s[i]) + h *= fnvPrime + } + return +} + +const fnvBasis = 14695981039346656037 +const fnvPrime = 1099511628211 + +// FastHash provides a quick hashing function for an endpoint, useful if you'd +// like to split up endpoints by modulos or other load-balancing techniques. +// It uses a variant of Fowler-Noll-Vo hashing. +// +// The output of FastHash is not guaranteed to remain the same through future +// code revisions, so should not be used to key values in persistent storage. +func (a Endpoint) FastHash() (h uint64) { + h = fnvHash(a.raw[:a.len]) + h ^= uint64(a.typ) + h *= fnvPrime + return +} + +// NewEndpoint creates a new Endpoint object. +// +// The size of raw must be less than MaxEndpointSize, otherwise this function +// will panic. +func NewEndpoint(typ EndpointType, raw []byte) (e Endpoint) { + e.len = len(raw) + if e.len > MaxEndpointSize { + panic("raw byte length greater than MaxEndpointSize") + } + e.typ = typ + copy(e.raw[:], raw) + return +} + +// EndpointTypeMetadata is used to register a new endpoint type. +type EndpointTypeMetadata struct { + // Name is the string returned by an EndpointType's String function. + Name string + // Formatter is called from an Endpoint's String function to format the raw + // bytes in an Endpoint into a human-readable string. + Formatter func([]byte) string +} + +// EndpointType is the type of a gopacket Endpoint. This type determines how +// the bytes stored in the endpoint should be interpreted. +type EndpointType int64 + +var endpointTypes = map[EndpointType]EndpointTypeMetadata{} + +// RegisterEndpointType creates a new EndpointType and registers it globally. +// It MUST be passed a unique number, or it will panic. Numbers 0-999 are +// reserved for gopacket's use. +func RegisterEndpointType(num int, meta EndpointTypeMetadata) EndpointType { + t := EndpointType(num) + if _, ok := endpointTypes[t]; ok { + panic("Endpoint type number already in use") + } + endpointTypes[t] = meta + return t +} + +func (e EndpointType) String() string { + if t, ok := endpointTypes[e]; ok { + return t.Name + } + return strconv.Itoa(int(e)) +} + +func (a Endpoint) String() string { + if t, ok := endpointTypes[a.typ]; ok && t.Formatter != nil { + return t.Formatter(a.raw[:a.len]) + } + return fmt.Sprintf("%v:%v", a.typ, a.raw) +} + +// Flow represents the direction of traffic for a packet layer, as a source and destination Endpoint. +// Flows are usable as map keys. +type Flow struct { + typ EndpointType + slen, dlen int + src, dst [MaxEndpointSize]byte +} + +// FlowFromEndpoints creates a new flow by pasting together two endpoints. +// The endpoints must have the same EndpointType, or this function will return +// an error. +func FlowFromEndpoints(src, dst Endpoint) (_ Flow, err error) { + if src.typ != dst.typ { + err = fmt.Errorf("Mismatched endpoint types: %v->%v", src.typ, dst.typ) + return + } + return Flow{src.typ, src.len, dst.len, src.raw, dst.raw}, nil +} + +// FastHash provides a quick hashing function for a flow, useful if you'd +// like to split up flows by modulos or other load-balancing techniques. +// It uses a variant of Fowler-Noll-Vo hashing, and is guaranteed to collide +// with its reverse flow. IE: the flow A->B will have the same hash as the flow +// B->A. +// +// The output of FastHash is not guaranteed to remain the same through future +// code revisions, so should not be used to key values in persistent storage. +func (f Flow) FastHash() (h uint64) { + // This combination must be commutative. We don't use ^, since that would + // give the same hash for all A->A flows. + h = fnvHash(f.src[:f.slen]) + fnvHash(f.dst[:f.dlen]) + h ^= uint64(f.typ) + h *= fnvPrime + return +} + +// String returns a human-readable representation of this flow, in the form +// "Src->Dst" +func (f Flow) String() string { + s, d := f.Endpoints() + return fmt.Sprintf("%v->%v", s, d) +} + +// EndpointType returns the EndpointType for this Flow. +func (f Flow) EndpointType() EndpointType { + return f.typ +} + +// Endpoints returns the two Endpoints for this flow. +func (f Flow) Endpoints() (src, dst Endpoint) { + return Endpoint{f.typ, f.slen, f.src}, Endpoint{f.typ, f.dlen, f.dst} +} + +// Src returns the source Endpoint for this flow. +func (f Flow) Src() (src Endpoint) { + src, _ = f.Endpoints() + return +} + +// Dst returns the destination Endpoint for this flow. +func (f Flow) Dst() (dst Endpoint) { + _, dst = f.Endpoints() + return +} + +// Reverse returns a new flow with endpoints reversed. +func (f Flow) Reverse() Flow { + return Flow{f.typ, f.dlen, f.slen, f.dst, f.src} +} + +// NewFlow creates a new flow. +// +// src and dst must have length <= MaxEndpointSize, otherwise NewFlow will +// panic. +func NewFlow(t EndpointType, src, dst []byte) (f Flow) { + f.slen = len(src) + f.dlen = len(dst) + if f.slen > MaxEndpointSize || f.dlen > MaxEndpointSize { + panic("flow raw byte length greater than MaxEndpointSize") + } + f.typ = t + copy(f.src[:], src) + copy(f.dst[:], dst) + return +} + +// EndpointInvalid is an endpoint type used for invalid endpoints, IE endpoints +// that are specified incorrectly during creation. +var EndpointInvalid = RegisterEndpointType(0, EndpointTypeMetadata{Name: "invalid", Formatter: func(b []byte) string { + return fmt.Sprintf("%v", b) +}}) + +// InvalidEndpoint is a singleton Endpoint of type EndpointInvalid. +var InvalidEndpoint = NewEndpoint(EndpointInvalid, nil) + +// InvalidFlow is a singleton Flow of type EndpointInvalid. +var InvalidFlow = NewFlow(EndpointInvalid, nil, nil) diff --git a/vendor/github.com/google/gopacket/gc b/vendor/github.com/google/gopacket/gc new file mode 100755 index 0000000..57bcdee --- /dev/null +++ b/vendor/github.com/google/gopacket/gc @@ -0,0 +1,278 @@ +#!/bin/bash +# Copyright 2012 Google, Inc. All rights reserved. + +# This script provides a simple way to run benchmarks against previous code and +# keep a log of how benchmarks change over time. When used with the --benchmark +# flag, it runs benchmarks from the current code and from the last commit run +# with --benchmark, then stores the results in the git commit description. We +# rerun the old benchmarks along with the new ones, since there's no guarantee +# that git commits will happen on the same machine, so machine differences could +# cause wildly inaccurate results. +# +# If you're making changes to 'gopacket' which could cause performance changes, +# you may be requested to use this commit script to make sure your changes don't +# have large detrimental effects (or to show off how awesome your performance +# improvements are). +# +# If not run with the --benchmark flag, this script is still very useful... it +# makes sure all the correct go formatting, building, and testing work as +# expected. + +function Usage { + cat <<EOF +USAGE: $0 [--benchmark regexp] [--root] [--gen] <git commit flags...> + +--benchmark: Run benchmark comparisons against last benchmark'd commit +--root: Run tests that require root priviledges +--gen: Generate code for MACs/ports by pulling down external data + +Note, some 'git commit' flags are necessary, if all else fails, pass in -a +EOF + exit 1 +} + +BENCH="" +GEN="" +ROOT="" +while [ ! -z "$1" ]; do + case "$1" in + "--benchmark") + BENCH="$2" + shift + shift + ;; + "--gen") + GEN="yes" + shift + ;; + "--root") + ROOT="yes" + shift + ;; + "--help") + Usage + ;; + "-h") + Usage + ;; + "help") + Usage + ;; + *) + break + ;; + esac +done + +function Root { + if [ ! -z "$ROOT" ]; then + local exec="$1" + # Some folks (like me) keep source code in places inaccessible by root (like + # NFS), so to make sure things run smoothly we copy them to a /tmp location. + local tmpfile="$(mktemp -t gopacket_XXXXXXXX)" + echo "Running root test executable $exec as $tmpfile" + cp "$exec" "$tmpfile" + chmod a+x "$tmpfile" + shift + sudo "$tmpfile" "$@" + fi +} + +if [ "$#" -eq "0" ]; then + Usage +fi + +cd $(dirname $0) + +# Check for copyright notices. +for filename in $(find ./ -type f -name '*.go'); do + if ! head -n 1 "$filename" | grep -q Copyright; then + echo "File '$filename' may not have copyright notice" + exit 1 + fi +done + +set -e +set -x + +if [ ! -z "$ROOT" ]; then + echo "Running SUDO to get root priviledges for root tests" + sudo echo "have root" +fi + +if [ ! -z "$GEN" ]; then + pushd macs + go run gen.go | gofmt > valid_mac_prefixes.go + popd + pushd layers + go run gen.go | gofmt > iana_ports.go + popd +fi + +# Make sure everything is formatted, compiles, and tests pass. +go fmt ./... +go test -i ./... 2>/dev/null >/dev/null || true +go test +go build +pushd examples/bytediff +go build +popd +if [ -f /usr/include/pcap.h ]; then + pushd pcap + go test ./... + go build ./... + go build pcap_tester.go + Root pcap_tester --mode=basic + Root pcap_tester --mode=filtered + Root pcap_tester --mode=timestamp || echo "You might not support timestamp sources" + popd + pushd examples/pcapdump + go build + popd + pushd examples/arpscan + go build + popd + pushd examples/bidirectional + go build + popd + pushd examples/synscan + go build + popd + pushd examples/httpassembly + go build + popd + pushd examples/statsassembly + go build + popd +fi +pushd macs +go test ./... +gofmt -w gen.go +go build gen.go +popd +pushd tcpassembly +go test ./... +popd +pushd reassembly +go test ./... +popd +pushd layers +gofmt -w gen.go +go build gen.go +go test ./... +popd +pushd pcapgo +go test ./... +go build ./... +popd +if [ -f /usr/include/linux/if_packet.h ]; then + if grep -q TPACKET_V3 /usr/include/linux/if_packet.h; then + pushd afpacket + go build ./... + go test ./... + popd + fi +fi +if [ -f /usr/include/pfring.h ]; then + pushd pfring + go test ./... + go build ./... + popd + pushd examples/pfdump + go build + popd +fi + +for travis_script in `ls .travis.*.sh`; do + ./$travis_script +done + +# Run our initial commit +git commit "$@" + +if [ -z "$BENCH" ]; then + set +x + echo "We're not benchmarking and we've committed... we're done!" + exit +fi + +### If we get here, we want to run benchmarks from current commit, and compare +### then to benchmarks from the last --benchmark commit. + +# Get our current branch. +BRANCH="$(git branch | grep '^*' | awk '{print $2}')" + +# File we're going to build our commit description in. +COMMIT_FILE="$(mktemp /tmp/tmp.XXXXXXXX)" + +# Add the word "BENCH" to the start of the git commit. +echo -n "BENCH " > $COMMIT_FILE + +# Get the current description... there must be an easier way. +git log -n 1 | grep '^ ' | sed 's/^ //' >> $COMMIT_FILE + +# Get the commit sha for the last benchmark commit +PREV=$(git log -n 1 --grep='BENCHMARK_MARKER_DO_NOT_CHANGE' | head -n 1 | awk '{print $2}') + +## Run current benchmarks + +cat >> $COMMIT_FILE <<EOF + + +---------------------------------------------------------- +BENCHMARK_MARKER_DO_NOT_CHANGE +---------------------------------------------------------- + +Go version $(go version) + + +TEST BENCHMARKS "$BENCH" +EOF +# go seems to have trouble with 'go test --bench=. ./...' +go test --test.bench="$BENCH" 2>&1 | tee -a $COMMIT_FILE +pushd layers +go test --test.bench="$BENCH" 2>&1 | tee -a $COMMIT_FILE +popd +cat >> $COMMIT_FILE <<EOF + + +PCAP BENCHMARK +EOF +if [ "$BENCH" -eq ".*" ]; then + go run pcap/gopacket_benchmark/*.go 2>&1 | tee -a $COMMIT_FILE +fi + + + +## Reset to last benchmark commit, run benchmarks + +git checkout $PREV + +cat >> $COMMIT_FILE <<EOF +---------------------------------------------------------- +BENCHMARKING AGAINST COMMIT $PREV +---------------------------------------------------------- + + +OLD TEST BENCHMARKS +EOF +# go seems to have trouble with 'go test --bench=. ./...' +go test --test.bench="$BENCH" 2>&1 | tee -a $COMMIT_FILE +pushd layers +go test --test.bench="$BENCH" 2>&1 | tee -a $COMMIT_FILE +popd +cat >> $COMMIT_FILE <<EOF + + +OLD PCAP BENCHMARK +EOF +if [ "$BENCH" -eq ".*" ]; then + go run pcap/gopacket_benchmark/*.go 2>&1 | tee -a $COMMIT_FILE +fi + + + +## Reset back to the most recent commit, edit the commit message by appending +## benchmark results. +git checkout $BRANCH +git commit --amend -F $COMMIT_FILE diff --git a/vendor/github.com/google/gopacket/ip4defrag/defrag.go b/vendor/github.com/google/gopacket/ip4defrag/defrag.go new file mode 100644 index 0000000..9d3862f --- /dev/null +++ b/vendor/github.com/google/gopacket/ip4defrag/defrag.go @@ -0,0 +1,350 @@ +// Copyright 2013 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 ip4defrag implements a IPv4 defragmenter +package ip4defrag + +import ( + "container/list" + "errors" + "fmt" + "log" + "sync" + "time" + + "github.com/google/gopacket" + "github.com/google/gopacket/layers" +) + +// Quick and Easy to use debug code to trace +// how defrag works. +var debug debugging = false // or flip to true +type debugging bool + +func (d debugging) Printf(format string, args ...interface{}) { + if d { + log.Printf(format, args...) + } +} + +// Constants determining how to handle fragments. +const ( + IPv4MinimumFragmentSize = 576 // Minimum size of a single fragment + IPv4MaximumSize = 65535 // Maximum size of a fragment (2^16) + IPv4MaximumFragmentOffset = 8189 // Maximum offset of a fragment + IPv4MaximumFragmentListLen = 8 // Back out if we get more than this many fragments +) + +// DefragIPv4 takes in an IPv4 packet with a fragment payload. +// +// It do not modify the IPv4 layer in place, 'in' remains untouched +// It returns a ready-to be used IPv4 layer. +// +// If the passed-in IPv4 layer is NOT fragmented, it will +// immediately return it without modifying the layer. +// +// If the IPv4 layer is a fragment and we don't have all +// fragments, it will return nil and store whatever internal +// information it needs to eventually defrag the packet. +// +// If the IPv4 layer is the last fragment needed to reconstruct +// the packet, a new IPv4 layer will be returned, and will be set to +// the entire defragmented packet, +// +// It use a map of all the running flows +// +// Usage example: +// +// func HandlePacket(in *layers.IPv4) err { +// defragger := ip4defrag.NewIPv4Defragmenter() +// in, err := defragger.DefragIPv4(in) +// if err != nil { +// return err +// } else if in == nil { +// return nil // packet fragment, we don't have whole packet yet. +// } +// // At this point, we know that 'in' is defragmented. +// //It may be the same 'in' passed to +// // HandlePacket, or it may not, but we don't really care :) +// ... do stuff to 'in' ... +//} +// +func (d *IPv4Defragmenter) DefragIPv4(in *layers.IPv4) (*layers.IPv4, error) { + return d.DefragIPv4WithTimestamp(in, time.Now()) +} + +// DefragIPv4WithTimestamp provides functionality of DefragIPv4 with +// an additional timestamp parameter which is used for discarding +// old fragments instead of time.Now() +// +// This is useful when operating on pcap files instead of live captured data +// +func (d *IPv4Defragmenter) DefragIPv4WithTimestamp(in *layers.IPv4, t time.Time) (*layers.IPv4, error) { + // check if we need to defrag + if st := d.dontDefrag(in); st == true { + debug.Printf("defrag: do nothing, do not need anything") + return in, nil + } + // perfom security checks + st, err := d.securityChecks(in) + if err != nil || st == false { + debug.Printf("defrag: alert security check") + return nil, err + } + + // ok, got a fragment + debug.Printf("defrag: got a new fragment in.Id=%d in.FragOffset=%d in.Flags=%d\n", + in.Id, in.FragOffset*8, in.Flags) + + // have we already seen a flow between src/dst with that Id? + ipf := newIPv4(in) + var fl *fragmentList + var exist bool + d.Lock() + fl, exist = d.ipFlows[ipf] + if !exist { + debug.Printf("defrag: unknown flow, creating a new one\n") + fl = new(fragmentList) + d.ipFlows[ipf] = fl + } + d.Unlock() + // insert, and if final build it + out, err2 := fl.insert(in, t) + + // at last, if we hit the maximum frag list len + // without any defrag success, we just drop everything and + // raise an error + if out == nil && fl.List.Len()+1 > IPv4MaximumFragmentListLen { + d.flush(ipf) + return nil, fmt.Errorf("defrag: Fragment List hits its maximum"+ + "size(%d), without success. Flushing the list", + IPv4MaximumFragmentListLen) + } + + // if we got a packet, it's a new one, and he is defragmented + if out != nil { + // when defrag is done for a flow between two ip + // clean the list + d.flush(ipf) + return out, nil + } + return nil, err2 +} + +// DiscardOlderThan forgets all packets without any activity since +// time t. It returns the number of FragmentList aka number of +// fragment packets it has discarded. +func (d *IPv4Defragmenter) DiscardOlderThan(t time.Time) int { + var nb int + d.Lock() + for k, v := range d.ipFlows { + if v.LastSeen.Before(t) { + nb = nb + 1 + delete(d.ipFlows, k) + } + } + d.Unlock() + return nb +} + +// flush the fragment list for a particular flow +func (d *IPv4Defragmenter) flush(ipf ipv4) { + d.Lock() + fl := new(fragmentList) + d.ipFlows[ipf] = fl + d.Unlock() +} + +// dontDefrag returns true if the IPv4 packet do not need +// any defragmentation +func (d *IPv4Defragmenter) dontDefrag(ip *layers.IPv4) bool { + // don't defrag packet with DF flag + if ip.Flags&layers.IPv4DontFragment != 0 { + return true + } + // don't defrag not fragmented ones + if ip.Flags&layers.IPv4MoreFragments == 0 && ip.FragOffset == 0 { + return true + } + return false +} + +// securityChecks performs the needed security checks +func (d *IPv4Defragmenter) securityChecks(ip *layers.IPv4) (bool, error) { + // don't allow too big fragment offset + if ip.FragOffset > IPv4MaximumFragmentOffset { + return false, fmt.Errorf("defrag: fragment offset too big "+ + "(handcrafted? %d > %d)", ip.FragOffset, IPv4MaximumFragmentOffset) + } + fragOffset := ip.FragOffset * 8 + + // don't allow fragment that would oversize an IP packet + if fragOffset+ip.Length > IPv4MaximumSize { + return false, fmt.Errorf("defrag: fragment will overrun "+ + "(handcrafted? %d > %d)", ip.FragOffset*8+ip.Length, IPv4MaximumSize) + } + + return true, nil +} + +// fragmentList holds a container/list used to contains IP +// packets/fragments. It stores internal counters to track the +// maximum total of byte, and the current length it has received. +// It also stores a flag to know if he has seen the last packet. +type fragmentList struct { + List list.List + Highest uint16 + Current uint16 + FinalReceived bool + LastSeen time.Time +} + +// insert insert an IPv4 fragment/packet into the Fragment List +// It use the following strategy : we are inserting fragment based +// on their offset, latest first. This is sometimes called BSD-Right. +// See: http://www.sans.org/reading-room/whitepapers/detection/ip-fragment-reassembly-scapy-33969 +func (f *fragmentList) insert(in *layers.IPv4, t time.Time) (*layers.IPv4, error) { + // TODO: should keep a copy of *in in the list + // or not (ie the packet source is reliable) ? -> depends on Lazy / last packet + fragOffset := in.FragOffset * 8 + if fragOffset >= f.Highest { + f.List.PushBack(in) + } else { + for e := f.List.Front(); e != nil; e = e.Next() { + frag, _ := e.Value.(*layers.IPv4) + if in.FragOffset == frag.FragOffset { + // TODO: what if we receive a fragment + // that begins with duplicate data but + // *also* has new data? For example: + // + // AAAA + // BB + // BBCC + // DDDD + // + // In this situation we completely + // ignore CC and the complete packet can + // never be reassembled. + debug.Printf("defrag: ignoring frag %d as we already have it (duplicate?)\n", + fragOffset) + return nil, nil + } + if in.FragOffset < frag.FragOffset { + debug.Printf("defrag: inserting frag %d before existing frag %d\n", + fragOffset, frag.FragOffset*8) + f.List.InsertBefore(in, e) + break + } + } + } + + f.LastSeen = t + + fragLength := in.Length - 20 + // After inserting the Fragment, we update the counters + if f.Highest < fragOffset+fragLength { + f.Highest = fragOffset + fragLength + } + f.Current = f.Current + fragLength + + debug.Printf("defrag: insert ListLen: %d Highest:%d Current:%d\n", + f.List.Len(), + f.Highest, f.Current) + + // Final Fragment ? + if in.Flags&layers.IPv4MoreFragments == 0 { + f.FinalReceived = true + } + // Ready to try defrag ? + if f.FinalReceived && f.Highest == f.Current { + return f.build(in) + } + return nil, nil +} + +// Build builds the final datagram, modifying ip in place. +// It puts priority to packet in the early position of the list. +// See Insert for more details. +func (f *fragmentList) build(in *layers.IPv4) (*layers.IPv4, error) { + var final []byte + var currentOffset uint16 + + debug.Printf("defrag: building the datagram \n") + for e := f.List.Front(); e != nil; e = e.Next() { + frag, _ := e.Value.(*layers.IPv4) + if frag.FragOffset*8 == currentOffset { + debug.Printf("defrag: building - adding %d\n", frag.FragOffset*8) + final = append(final, frag.Payload...) + currentOffset = currentOffset + frag.Length - 20 + } else if frag.FragOffset*8 < currentOffset { + // overlapping fragment - let's take only what we need + startAt := currentOffset - frag.FragOffset*8 + debug.Printf("defrag: building - overlapping, starting at %d\n", + startAt) + if startAt > frag.Length-20 { + return nil, errors.New("defrag: building - invalid fragment") + } + final = append(final, frag.Payload[startAt:]...) + currentOffset = currentOffset + frag.FragOffset*8 + } else { + // Houston - we have an hole ! + debug.Printf("defrag: hole found while building, " + + "stopping the defrag process\n") + return nil, errors.New("defrag: building - hole found") + } + debug.Printf("defrag: building - next is %d\n", currentOffset) + } + + // TODO recompute IP Checksum + out := &layers.IPv4{ + Version: in.Version, + IHL: in.IHL, + TOS: in.TOS, + Length: f.Highest, + Id: 0, + Flags: 0, + FragOffset: 0, + TTL: in.TTL, + Protocol: in.Protocol, + Checksum: 0, + SrcIP: in.SrcIP, + DstIP: in.DstIP, + Options: in.Options, + Padding: in.Padding, + } + out.Payload = final + + return out, nil +} + +// ipv4 is a struct to be used as a key. +type ipv4 struct { + ip4 gopacket.Flow + id uint16 +} + +// newIPv4 returns a new initialized IPv4 Flow +func newIPv4(ip *layers.IPv4) ipv4 { + return ipv4{ + ip4: ip.NetworkFlow(), + id: ip.Id, + } +} + +// IPv4Defragmenter is a struct which embedded a map of +// all fragment/packet. +type IPv4Defragmenter struct { + sync.RWMutex + ipFlows map[ipv4]*fragmentList +} + +// NewIPv4Defragmenter returns a new IPv4Defragmenter +// with an initialized map. +func NewIPv4Defragmenter() *IPv4Defragmenter { + return &IPv4Defragmenter{ + ipFlows: make(map[ipv4]*fragmentList), + } +} diff --git a/vendor/github.com/google/gopacket/ip4defrag/defrag_test.go b/vendor/github.com/google/gopacket/ip4defrag/defrag_test.go new file mode 100644 index 0000000..1eb66d2 --- /dev/null +++ b/vendor/github.com/google/gopacket/ip4defrag/defrag_test.go @@ -0,0 +1,1396 @@ +// Copyright 2013 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 ip4defrag + +import ( + "bytes" + "fmt" + "net" + "testing" + + "github.com/google/gopacket" + "github.com/google/gopacket/bytediff" + "github.com/google/gopacket/layers" +) + +func TestNotFrag(t *testing.T) { + ip := layers.IPv4{ + Version: 4, + TTL: 220, + SrcIP: net.IPv4(1, 1, 1, 1), + DstIP: net.IPv4(2, 2, 2, 2), + Flags: layers.IPv4DontFragment, + } + defrag := NewIPv4Defragmenter() + + out, err := defrag.DefragIPv4(&ip) + if out == nil || err != nil { + t.Errorf("defrag: this packet do not need to be defrag ['%s']", err) + } +} + +func TestDefragPingMultipleFrags(t *testing.T) { + defrag := NewIPv4Defragmenter() + + // We inject the 4 fragments and test the DefragIPv4 interface + gentestDefrag(t, defrag, testPing1Frag1, false, "Ping1Frag1") + gentestDefrag(t, defrag, testPing1Frag1, false, "Ping1Frag1") + gentestDefrag(t, defrag, testPing1Frag1, false, "Ping1Frag1") + gentestDefrag(t, defrag, testPing1Frag3, false, "Ping1Frag3") + gentestDefrag(t, defrag, testPing1Frag2, false, "Ping1Frag2") + ip := gentestDefrag(t, defrag, testPing1Frag4, true, "Ping1Frag4") + + if len(ip.Payload) != 4508 { + t.Fatalf("defrag: expecting a packet of 4508 bytes, got %d", len(ip.Payload)) + } + + validPayload := append(testPing1Frag1[34:], testPing1Frag2[34:]...) + validPayload = append(validPayload, testPing1Frag3[34:]...) + validPayload = append(validPayload, testPing1Frag4[34:]...) + + if bytes.Compare(validPayload, ip.Payload) != 0 { + fmt.Println(bytediff.BashOutput.String( + bytediff.Diff(validPayload, ip.Payload))) + t.Errorf("defrag: payload is not correctly defragmented") + } +} + +func TestDefragPing1(t *testing.T) { + defrag := NewIPv4Defragmenter() + + // We inject the 4 fragments and test the DefragIPv4 interface + gentestDefrag(t, defrag, testPing1Frag1, false, "Ping1Frag1") + gentestDefrag(t, defrag, testPing1Frag3, false, "Ping1Frag3") + gentestDefrag(t, defrag, testPing1Frag2, false, "Ping1Frag2") + ip := gentestDefrag(t, defrag, testPing1Frag4, true, "Ping1Frag4") + + if len(ip.Payload) != 4508 { + t.Fatalf("defrag: expecting a packet of 4508 bytes, got %d", len(ip.Payload)) + } + + validPayload := append(testPing1Frag1[34:], testPing1Frag2[34:]...) + validPayload = append(validPayload, testPing1Frag3[34:]...) + validPayload = append(validPayload, testPing1Frag4[34:]...) + + if bytes.Compare(validPayload, ip.Payload) != 0 { + fmt.Println(bytediff.BashOutput.String( + bytediff.Diff(validPayload, ip.Payload))) + t.Errorf("defrag: payload is not correctly defragmented") + } + + // We redo the same test to handle duplication, and be sure + // that the internal list is correctly cleaned up. + gentestDefrag(t, defrag, testPing1Frag1, false, "Ping1Frag1") + gentestDefrag(t, defrag, testPing1Frag3, false, "Ping1Frag3") + gentestDefrag(t, defrag, testPing1Frag2, false, "Ping1Frag2") + ip2 := gentestDefrag(t, defrag, testPing1Frag4, true, "Ping1Frag4") + + if bytes.Compare(ip2.Payload, ip.Payload) != 0 { + fmt.Println(bytediff.BashOutput.String( + bytediff.Diff(validPayload, ip.Payload))) + t.Errorf("defrag: ip and ip2 payload are different") + } +} + +func TestDefragPing1and2(t *testing.T) { + debug = false + defrag := NewIPv4Defragmenter() + + // We inject the 8 mixed fragments from two "flows" + // and test the DefragIPv4 interface + gentestDefrag(t, defrag, testPing1Frag1, false, "Ping1Frag1") + gentestDefrag(t, defrag, testPing1Frag3, false, "Ping1Frag3") + gentestDefrag(t, defrag, testPing2Frag3, false, "Ping2Frag3") + gentestDefrag(t, defrag, testPing2Frag4, false, "Ping2Frag4") + gentestDefrag(t, defrag, testPing1Frag2, false, "Ping1Frag2") + gentestDefrag(t, defrag, testPing2Frag1, false, "Ping2Frag1") + ip := gentestDefrag(t, defrag, testPing1Frag4, true, "Ping1Frag4") + + if len(ip.Payload) != 4508 { + t.Fatalf("defrag: expecting a packet Ping1 of 4508 bytes, got %d", + len(ip.Payload)) + } + + validPayload := append(testPing1Frag1[34:], testPing1Frag2[34:]...) + validPayload = append(validPayload, testPing1Frag3[34:]...) + validPayload = append(validPayload, testPing1Frag4[34:]...) + + if bytes.Compare(validPayload, ip.Payload) != 0 { + fmt.Println(bytediff.BashOutput.String( + bytediff.Diff(validPayload, ip.Payload))) + t.Errorf("defrag: payload Ping1 is not correctly defragmented") + } + + ip = gentestDefrag(t, defrag, testPing2Frag2, true, "Ping2Frag2") + if len(ip.Payload) != 4508 { + t.Fatalf("defrag: expecting a packet Ping2 of 4508 bytes, got %d", + len(ip.Payload)) + } + + validPayload2 := append(testPing2Frag1[34:], testPing2Frag2[34:]...) + validPayload2 = append(validPayload2, testPing2Frag3[34:]...) + validPayload2 = append(validPayload2, testPing2Frag4[34:]...) + + if bytes.Compare(validPayload2, ip.Payload) != 0 { + fmt.Println(bytediff.BashOutput.String( + bytediff.Diff(validPayload2, ip.Payload))) + t.Errorf("defrag: payload Ping2 is not correctly defragmented") + } + debug = false +} + +func TestDefragPingTooMuch(t *testing.T) { + defrag := NewIPv4Defragmenter() + + ip1 := layers.IPv4{ + Version: 4, + TTL: 15, + SrcIP: net.IPv4(1, 1, 1, 1), + DstIP: net.IPv4(2, 2, 2, 2), + Id: 0xcc, + FragOffset: 0, + Length: 500, + Flags: layers.IPv4MoreFragments, + } + defrag.DefragIPv4(&ip1) + for i := 2; i < 8; i = i + 1 { + nip := ip1 + nip.FragOffset = ip1.Length * uint16(i) + out, err := defrag.DefragIPv4(&nip) + if err != nil || out != nil { + t.Fatalf("defrag: %s", err) + } + + } + ip8 := ip1 + ip8.FragOffset = 666 + + _, err := defrag.DefragIPv4(&ip8) + if err == nil { + t.Fatalf("defrag: Maximum number of fragments are supposed to be 8") + } +} + +func gentestDefrag(t *testing.T, defrag *IPv4Defragmenter, buf []byte, expect bool, label string) *layers.IPv4 { + p := gopacket.NewPacket(buf, layers.LinkTypeEthernet, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + ipL := p.Layer(layers.LayerTypeIPv4) + in, _ := ipL.(*layers.IPv4) + + out, err := defrag.DefragIPv4(in) + if err != nil { + t.Fatalf("defrag: %s", err) + } + status := false + if out != nil { + status = true + } + if status != expect { + t.Fatalf("defrag: a fragment was not detected (%s)", label) + } + return out +} + +/* Frame 1-1 (1514 bytes) */ +var testPing1Frag1 = []byte{ + 0xf4, 0xca, 0xe5, 0x4e, 0xe1, 0x46, 0x7c, 0x7a, /* ...N.F|z */ + 0x91, 0x7d, 0x7c, 0x74, 0x08, 0x00, 0x45, 0x00, /* .}|t..E. */ + 0x05, 0xdc, 0xb3, 0xe1, 0x20, 0x00, 0x40, 0x01, /* .... .@. */ + 0xcf, 0x70, 0xc0, 0xa8, 0x01, 0x17, 0x08, 0x08, /* .p...... */ + 0x08, 0x08, 0x08, 0x00, 0x45, 0xa6, 0x14, 0xbf, /* ....E... */ + 0x00, 0x01, 0x9e, 0x3e, 0x20, 0x55, 0x00, 0x00, /* ...> U.. */ + 0x00, 0x00, 0x16, 0x91, 0x0d, 0x00, 0x00, 0x00, /* ........ */ + 0x00, 0x00, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, /* ........ */ + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, /* ........ */ + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, /* .. !"#$% */ + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* &'()*+,- */ + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* ./012345 */ + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, /* 6789:;<= */ + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, /* >?@ABCDE */ + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, /* FGHIJKLM */ + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, /* NOPQRSTU */ + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, /* VWXYZ[\] */ + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* ^_`abcde */ + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, /* fghijklm */ + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, /* nopqrstu */ + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, /* vwxyz{|} */ + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, /* ~....... */ + 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, /* ........ */ + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, /* ........ */ + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, /* ........ */ + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, /* ........ */ + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, /* ........ */ + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, /* ........ */ + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, /* ........ */ + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, /* ........ */ + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, /* ........ */ + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, /* ........ */ + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, /* ........ */ + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, /* ........ */ + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, /* ........ */ + 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, /* ........ */ + 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, /* ........ */ + 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* ........ */ + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, /* ........ */ + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, /* ........ */ + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, /* ........ */ + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, /* .. !"#$% */ + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* &'()*+,- */ + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* ./012345 */ + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, /* 6789:;<= */ + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, /* >?@ABCDE */ + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, /* FGHIJKLM */ + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, /* NOPQRSTU */ + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, /* VWXYZ[\] */ + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* ^_`abcde */ + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, /* fghijklm */ + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, /* nopqrstu */ + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, /* vwxyz{|} */ + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, /* ~....... */ + 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, /* ........ */ + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, /* ........ */ + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, /* ........ */ + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, /* ........ */ + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, /* ........ */ + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, /* ........ */ + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, /* ........ */ + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, /* ........ */ + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, /* ........ */ + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, /* ........ */ + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, /* ........ */ + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, /* ........ */ + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, /* ........ */ + 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, /* ........ */ + 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, /* ........ */ + 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* ........ */ + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, /* ........ */ + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, /* ........ */ + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, /* ........ */ + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, /* .. !"#$% */ + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* &'()*+,- */ + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* ./012345 */ + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, /* 6789:;<= */ + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, /* >?@ABCDE */ + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, /* FGHIJKLM */ + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, /* NOPQRSTU */ + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, /* VWXYZ[\] */ + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* ^_`abcde */ + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, /* fghijklm */ + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, /* nopqrstu */ + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, /* vwxyz{|} */ + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, /* ~....... */ + 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, /* ........ */ + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, /* ........ */ + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, /* ........ */ + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, /* ........ */ + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, /* ........ */ + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, /* ........ */ + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, /* ........ */ + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, /* ........ */ + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, /* ........ */ + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, /* ........ */ + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, /* ........ */ + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, /* ........ */ + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, /* ........ */ + 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, /* ........ */ + 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, /* ........ */ + 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* ........ */ + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, /* ........ */ + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, /* ........ */ + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, /* ........ */ + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, /* .. !"#$% */ + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* &'()*+,- */ + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* ./012345 */ + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, /* 6789:;<= */ + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, /* >?@ABCDE */ + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, /* FGHIJKLM */ + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, /* NOPQRSTU */ + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, /* VWXYZ[\] */ + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* ^_`abcde */ + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, /* fghijklm */ + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, /* nopqrstu */ + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, /* vwxyz{|} */ + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, /* ~....... */ + 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, /* ........ */ + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, /* ........ */ + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, /* ........ */ + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, /* ........ */ + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, /* ........ */ + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, /* ........ */ + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, /* ........ */ + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, /* ........ */ + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, /* ........ */ + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, /* ........ */ + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, /* ........ */ + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, /* ........ */ + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, /* ........ */ + 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, /* ........ */ + 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, /* ........ */ + 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* ........ */ + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, /* ........ */ + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, /* ........ */ + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, /* ........ */ + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, /* .. !"#$% */ + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* &'()*+,- */ + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* ./012345 */ + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, /* 6789:;<= */ + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, /* >?@ABCDE */ + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, /* FGHIJKLM */ + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, /* NOPQRSTU */ + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, /* VWXYZ[\] */ + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* ^_`abcde */ + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, /* fghijklm */ + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, /* nopqrstu */ + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, /* vwxyz{|} */ + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, /* ~....... */ + 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, /* ........ */ + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, /* ........ */ + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, /* ........ */ + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, /* ........ */ + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, /* ........ */ + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, /* ........ */ + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, /* ........ */ + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, /* ........ */ + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, /* ........ */ + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, /* ........ */ + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, /* ........ */ + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, /* ........ */ + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, /* ........ */ + 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, /* ........ */ + 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, /* ........ */ + 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* ........ */ + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, /* ........ */ + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, /* ........ */ + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, /* ........ */ + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, /* .. !"#$% */ + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* &'()*+,- */ + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* ./012345 */ + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, /* 6789:;<= */ + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, /* >?@ABCDE */ + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, /* FGHIJKLM */ + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, /* NOPQRSTU */ + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, /* VWXYZ[\] */ + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* ^_`abcde */ + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, /* fghijklm */ + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, /* nopqrstu */ + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, /* vwxyz{|} */ + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, /* ~....... */ + 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, /* ........ */ + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, /* ........ */ + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, /* ........ */ + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, /* ........ */ + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, /* ........ */ + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, /* ........ */ + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, /* ........ */ + 0xbe, 0xbf, /* .. */ +} + +/* Frame (1514 bytes) */ +var testPing1Frag2 = []byte{ + 0xf4, 0xca, 0xe5, 0x4e, 0xe1, 0x46, 0x7c, 0x7a, /* ...N.F|z */ + 0x91, 0x7d, 0x7c, 0x74, 0x08, 0x00, 0x45, 0x00, /* .}|t..E. */ + 0x05, 0xdc, 0xb3, 0xe1, 0x20, 0xb9, 0x40, 0x01, /* .... .@. */ + 0xce, 0xb7, 0xc0, 0xa8, 0x01, 0x17, 0x08, 0x08, /* ........ */ + 0x08, 0x08, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, /* ........ */ + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, /* ........ */ + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, /* ........ */ + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, /* ........ */ + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, /* ........ */ + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, /* ........ */ + 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, /* ........ */ + 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, /* ........ */ + 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* ........ */ + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, /* ........ */ + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, /* ........ */ + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, /* ........ */ + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, /* .. !"#$% */ + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* &'()*+,- */ + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* ./012345 */ + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, /* 6789:;<= */ + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, /* >?@ABCDE */ + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, /* FGHIJKLM */ + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, /* NOPQRSTU */ + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, /* VWXYZ[\] */ + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* ^_`abcde */ + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, /* fghijklm */ + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, /* nopqrstu */ + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, /* vwxyz{|} */ + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, /* ~....... */ + 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, /* ........ */ + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, /* ........ */ + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, /* ........ */ + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, /* ........ */ + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, /* ........ */ + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, /* ........ */ + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, /* ........ */ + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, /* ........ */ + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, /* ........ */ + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, /* ........ */ + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, /* ........ */ + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, /* ........ */ + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, /* ........ */ + 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, /* ........ */ + 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, /* ........ */ + 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* ........ */ + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, /* ........ */ + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, /* ........ */ + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, /* ........ */ + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, /* .. !"#$% */ + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* &'()*+,- */ + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* ./012345 */ + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, /* 6789:;<= */ + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, /* >?@ABCDE */ + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, /* FGHIJKLM */ + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, /* NOPQRSTU */ + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, /* VWXYZ[\] */ + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* ^_`abcde */ + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, /* fghijklm */ + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, /* nopqrstu */ + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, /* vwxyz{|} */ + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, /* ~....... */ + 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, /* ........ */ + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, /* ........ */ + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, /* ........ */ + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, /* ........ */ + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, /* ........ */ + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, /* ........ */ + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, /* ........ */ + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, /* ........ */ + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, /* ........ */ + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, /* ........ */ + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, /* ........ */ + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, /* ........ */ + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, /* ........ */ + 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, /* ........ */ + 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, /* ........ */ + 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* ........ */ + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, /* ........ */ + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, /* ........ */ + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, /* ........ */ + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, /* .. !"#$% */ + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* &'()*+,- */ + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* ./012345 */ + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, /* 6789:;<= */ + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, /* >?@ABCDE */ + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, /* FGHIJKLM */ + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, /* NOPQRSTU */ + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, /* VWXYZ[\] */ + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* ^_`abcde */ + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, /* fghijklm */ + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, /* nopqrstu */ + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, /* vwxyz{|} */ + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, /* ~....... */ + 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, /* ........ */ + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, /* ........ */ + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, /* ........ */ + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, /* ........ */ + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, /* ........ */ + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, /* ........ */ + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, /* ........ */ + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, /* ........ */ + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, /* ........ */ + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, /* ........ */ + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, /* ........ */ + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, /* ........ */ + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, /* ........ */ + 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, /* ........ */ + 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, /* ........ */ + 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* ........ */ + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, /* ........ */ + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, /* ........ */ + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, /* ........ */ + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, /* .. !"#$% */ + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* &'()*+,- */ + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* ./012345 */ + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, /* 6789:;<= */ + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, /* >?@ABCDE */ + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, /* FGHIJKLM */ + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, /* NOPQRSTU */ + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, /* VWXYZ[\] */ + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* ^_`abcde */ + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, /* fghijklm */ + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, /* nopqrstu */ + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, /* vwxyz{|} */ + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, /* ~....... */ + 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, /* ........ */ + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, /* ........ */ + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, /* ........ */ + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, /* ........ */ + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, /* ........ */ + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, /* ........ */ + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, /* ........ */ + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, /* ........ */ + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, /* ........ */ + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, /* ........ */ + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, /* ........ */ + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, /* ........ */ + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, /* ........ */ + 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, /* ........ */ + 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, /* ........ */ + 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* ........ */ + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, /* ........ */ + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, /* ........ */ + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, /* ........ */ + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, /* .. !"#$% */ + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* &'()*+,- */ + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* ./012345 */ + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, /* 6789:;<= */ + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, /* >?@ABCDE */ + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, /* FGHIJKLM */ + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, /* NOPQRSTU */ + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, /* VWXYZ[\] */ + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* ^_`abcde */ + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, /* fghijklm */ + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, /* nopqrstu */ + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, /* vwxyz{|} */ + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, /* ~....... */ + 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, /* ........ */ + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, /* ........ */ + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, /* ........ */ + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, /* ........ */ + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, /* ........ */ + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, /* ........ */ + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, /* ........ */ + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, /* ........ */ + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, /* ........ */ + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, /* ........ */ + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, /* ........ */ + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, /* ........ */ + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, /* ........ */ + 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, /* ........ */ + 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, /* ........ */ + 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* ........ */ + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, /* ........ */ + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, /* ........ */ + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, /* ........ */ + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, /* .. !"#$% */ + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* &'()*+,- */ + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* ./012345 */ + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, /* 6789:;<= */ + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, /* >?@ABCDE */ + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, /* FGHIJKLM */ + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, /* NOPQRSTU */ + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, /* VWXYZ[\] */ + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* ^_`abcde */ + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, /* fghijklm */ + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, /* nopqrstu */ + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, /* vwxyz{|} */ + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, /* ~....... */ + 0x86, 0x87, /* .. */ +} + +/* Frame (1514 bytes) */ +var testPing1Frag3 = []byte{ + 0xf4, 0xca, 0xe5, 0x4e, 0xe1, 0x46, 0x7c, 0x7a, /* ...N.F|z */ + 0x91, 0x7d, 0x7c, 0x74, 0x08, 0x00, 0x45, 0x00, /* .}|t..E. */ + 0x05, 0xdc, 0xb3, 0xe1, 0x21, 0x72, 0x40, 0x01, /* ....!r@. */ + 0xcd, 0xfe, 0xc0, 0xa8, 0x01, 0x17, 0x08, 0x08, /* ........ */ + 0x08, 0x08, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, /* ........ */ + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, /* ........ */ + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, /* ........ */ + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, /* ........ */ + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, /* ........ */ + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, /* ........ */ + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, /* ........ */ + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, /* ........ */ + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, /* ........ */ + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, /* ........ */ + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, /* ........ */ + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, /* ........ */ + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, /* ........ */ + 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, /* ........ */ + 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, /* ........ */ + 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* ........ */ + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, /* ........ */ + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, /* ........ */ + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, /* ........ */ + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, /* .. !"#$% */ + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* &'()*+,- */ + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* ./012345 */ + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, /* 6789:;<= */ + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, /* >?@ABCDE */ + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, /* FGHIJKLM */ + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, /* NOPQRSTU */ + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, /* VWXYZ[\] */ + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* ^_`abcde */ + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, /* fghijklm */ + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, /* nopqrstu */ + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, /* vwxyz{|} */ + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, /* ~....... */ + 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, /* ........ */ + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, /* ........ */ + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, /* ........ */ + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, /* ........ */ + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, /* ........ */ + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, /* ........ */ + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, /* ........ */ + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, /* ........ */ + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, /* ........ */ + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, /* ........ */ + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, /* ........ */ + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, /* ........ */ + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, /* ........ */ + 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, /* ........ */ + 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, /* ........ */ + 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* ........ */ + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, /* ........ */ + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, /* ........ */ + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, /* ........ */ + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, /* .. !"#$% */ + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* &'()*+,- */ + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* ./012345 */ + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, /* 6789:;<= */ + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, /* >?@ABCDE */ + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, /* FGHIJKLM */ + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, /* NOPQRSTU */ + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, /* VWXYZ[\] */ + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* ^_`abcde */ + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, /* fghijklm */ + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, /* nopqrstu */ + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, /* vwxyz{|} */ + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, /* ~....... */ + 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, /* ........ */ + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, /* ........ */ + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, /* ........ */ + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, /* ........ */ + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, /* ........ */ + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, /* ........ */ + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, /* ........ */ + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, /* ........ */ + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, /* ........ */ + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, /* ........ */ + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, /* ........ */ + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, /* ........ */ + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, /* ........ */ + 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, /* ........ */ + 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, /* ........ */ + 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* ........ */ + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, /* ........ */ + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, /* ........ */ + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, /* ........ */ + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, /* .. !"#$% */ + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* &'()*+,- */ + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* ./012345 */ + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, /* 6789:;<= */ + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, /* >?@ABCDE */ + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, /* FGHIJKLM */ + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, /* NOPQRSTU */ + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, /* VWXYZ[\] */ + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* ^_`abcde */ + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, /* fghijklm */ + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, /* nopqrstu */ + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, /* vwxyz{|} */ + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, /* ~....... */ + 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, /* ........ */ + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, /* ........ */ + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, /* ........ */ + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, /* ........ */ + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, /* ........ */ + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, /* ........ */ + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, /* ........ */ + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, /* ........ */ + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, /* ........ */ + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, /* ........ */ + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, /* ........ */ + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, /* ........ */ + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, /* ........ */ + 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, /* ........ */ + 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, /* ........ */ + 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* ........ */ + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, /* ........ */ + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, /* ........ */ + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, /* ........ */ + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, /* .. !"#$% */ + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* &'()*+,- */ + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* ./012345 */ + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, /* 6789:;<= */ + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, /* >?@ABCDE */ + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, /* FGHIJKLM */ + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, /* NOPQRSTU */ + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, /* VWXYZ[\] */ + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* ^_`abcde */ + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, /* fghijklm */ + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, /* nopqrstu */ + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, /* vwxyz{|} */ + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, /* ~....... */ + 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, /* ........ */ + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, /* ........ */ + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, /* ........ */ + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, /* ........ */ + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, /* ........ */ + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, /* ........ */ + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, /* ........ */ + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, /* ........ */ + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, /* ........ */ + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, /* ........ */ + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, /* ........ */ + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, /* ........ */ + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, /* ........ */ + 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, /* ........ */ + 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, /* ........ */ + 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* ........ */ + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, /* ........ */ + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, /* ........ */ + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, /* ........ */ + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, /* .. !"#$% */ + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* &'()*+,- */ + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* ./012345 */ + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, /* 6789:;<= */ + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, /* >?@ABCDE */ + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, /* FGHIJKLM */ + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, /* NOPQRSTU */ + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, /* VWXYZ[\] */ + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* ^_`abcde */ + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, /* fghijklm */ + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, /* nopqrstu */ + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, /* vwxyz{|} */ + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, /* ~....... */ + 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, /* ........ */ + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, /* ........ */ + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, /* ........ */ + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, /* ........ */ + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, /* ........ */ + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, /* ........ */ + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, /* ........ */ + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, /* ........ */ + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, /* ........ */ + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, /* ........ */ + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, /* ........ */ + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, /* ........ */ + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, /* ........ */ + 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, /* ........ */ + 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, /* ........ */ + 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* ........ */ + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, /* ........ */ + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, /* ........ */ + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, /* ........ */ + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, /* .. !"#$% */ + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* &'()*+,- */ + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* ./012345 */ + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, /* 6789:;<= */ + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, /* >?@ABCDE */ + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, /* FGHIJKLM */ + 0x4e, 0x4f, /* NO */ +} + +/* Frame (102 bytes) */ +var testPing1Frag4 = []byte{ + 0xf4, 0xca, 0xe5, 0x4e, 0xe1, 0x46, 0x7c, 0x7a, /* ...N.F|z */ + 0x91, 0x7d, 0x7c, 0x74, 0x08, 0x00, 0x45, 0x00, /* .}|t..E. */ + 0x00, 0x58, 0xb3, 0xe1, 0x02, 0x2b, 0x40, 0x01, /* .X...+@. */ + 0xf2, 0xc9, 0xc0, 0xa8, 0x01, 0x17, 0x08, 0x08, /* ........ */ + 0x08, 0x08, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, /* ..PQRSTU */ + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, /* VWXYZ[\] */ + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* ^_`abcde */ + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, /* fghijklm */ + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, /* nopqrstu */ + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, /* vwxyz{|} */ + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, /* ~....... */ + 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, /* ........ */ + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, /* ...... */ +} + +/* Frame (1514 bytes) */ +var testPing2Frag1 = []byte{ + 0xf4, 0xca, 0xe5, 0x4e, 0xe1, 0x46, 0x7c, 0x7a, /* ...N.F|z */ + 0x91, 0x7d, 0x7c, 0x74, 0x08, 0x00, 0x45, 0x00, /* .}|t..E. */ + 0x05, 0xdc, 0xb4, 0x9e, 0x20, 0x00, 0x40, 0x01, /* .... .@. */ + 0xce, 0xb3, 0xc0, 0xa8, 0x01, 0x17, 0x08, 0x08, /* ........ */ + 0x08, 0x08, 0x08, 0x00, 0x9e, 0xa0, 0x14, 0xbf, /* ........ */ + 0x00, 0x02, 0x9f, 0x3e, 0x20, 0x55, 0x00, 0x00, /* ...> U.. */ + 0x00, 0x00, 0xbc, 0x95, 0x0d, 0x00, 0x00, 0x00, /* ........ */ + 0x00, 0x00, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, /* ........ */ + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, /* ........ */ + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, /* .. !"#$% */ + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* &'()*+,- */ + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* ./012345 */ + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, /* 6789:;<= */ + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, /* >?@ABCDE */ + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, /* FGHIJKLM */ + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, /* NOPQRSTU */ + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, /* VWXYZ[\] */ + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* ^_`abcde */ + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, /* fghijklm */ + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, /* nopqrstu */ + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, /* vwxyz{|} */ + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, /* ~....... */ + 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, /* ........ */ + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, /* ........ */ + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, /* ........ */ + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, /* ........ */ + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, /* ........ */ + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, /* ........ */ + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, /* ........ */ + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, /* ........ */ + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, /* ........ */ + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, /* ........ */ + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, /* ........ */ + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, /* ........ */ + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, /* ........ */ + 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, /* ........ */ + 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, /* ........ */ + 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* ........ */ + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, /* ........ */ + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, /* ........ */ + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, /* ........ */ + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, /* .. !"#$% */ + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* &'()*+,- */ + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* ./012345 */ + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, /* 6789:;<= */ + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, /* >?@ABCDE */ + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, /* FGHIJKLM */ + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, /* NOPQRSTU */ + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, /* VWXYZ[\] */ + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* ^_`abcde */ + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, /* fghijklm */ + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, /* nopqrstu */ + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, /* vwxyz{|} */ + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, /* ~....... */ + 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, /* ........ */ + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, /* ........ */ + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, /* ........ */ + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, /* ........ */ + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, /* ........ */ + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, /* ........ */ + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, /* ........ */ + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, /* ........ */ + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, /* ........ */ + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, /* ........ */ + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, /* ........ */ + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, /* ........ */ + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, /* ........ */ + 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, /* ........ */ + 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, /* ........ */ + 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* ........ */ + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, /* ........ */ + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, /* ........ */ + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, /* ........ */ + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, /* .. !"#$% */ + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* &'()*+,- */ + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* ./012345 */ + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, /* 6789:;<= */ + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, /* >?@ABCDE */ + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, /* FGHIJKLM */ + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, /* NOPQRSTU */ + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, /* VWXYZ[\] */ + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* ^_`abcde */ + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, /* fghijklm */ + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, /* nopqrstu */ + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, /* vwxyz{|} */ + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, /* ~....... */ + 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, /* ........ */ + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, /* ........ */ + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, /* ........ */ + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, /* ........ */ + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, /* ........ */ + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, /* ........ */ + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, /* ........ */ + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, /* ........ */ + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, /* ........ */ + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, /* ........ */ + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, /* ........ */ + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, /* ........ */ + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, /* ........ */ + 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, /* ........ */ + 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, /* ........ */ + 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* ........ */ + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, /* ........ */ + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, /* ........ */ + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, /* ........ */ + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, /* .. !"#$% */ + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* &'()*+,- */ + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* ./012345 */ + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, /* 6789:;<= */ + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, /* >?@ABCDE */ + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, /* FGHIJKLM */ + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, /* NOPQRSTU */ + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, /* VWXYZ[\] */ + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* ^_`abcde */ + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, /* fghijklm */ + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, /* nopqrstu */ + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, /* vwxyz{|} */ + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, /* ~....... */ + 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, /* ........ */ + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, /* ........ */ + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, /* ........ */ + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, /* ........ */ + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, /* ........ */ + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, /* ........ */ + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, /* ........ */ + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, /* ........ */ + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, /* ........ */ + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, /* ........ */ + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, /* ........ */ + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, /* ........ */ + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, /* ........ */ + 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, /* ........ */ + 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, /* ........ */ + 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* ........ */ + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, /* ........ */ + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, /* ........ */ + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, /* ........ */ + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, /* .. !"#$% */ + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* &'()*+,- */ + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* ./012345 */ + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, /* 6789:;<= */ + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, /* >?@ABCDE */ + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, /* FGHIJKLM */ + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, /* NOPQRSTU */ + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, /* VWXYZ[\] */ + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* ^_`abcde */ + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, /* fghijklm */ + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, /* nopqrstu */ + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, /* vwxyz{|} */ + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, /* ~....... */ + 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, /* ........ */ + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, /* ........ */ + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, /* ........ */ + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, /* ........ */ + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, /* ........ */ + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, /* ........ */ + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, /* ........ */ + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, /* ........ */ + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, /* ........ */ + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, /* ........ */ + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, /* ........ */ + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, /* ........ */ + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, /* ........ */ + 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, /* ........ */ + 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, /* ........ */ + 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* ........ */ + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, /* ........ */ + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, /* ........ */ + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, /* ........ */ + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, /* .. !"#$% */ + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* &'()*+,- */ + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* ./012345 */ + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, /* 6789:;<= */ + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, /* >?@ABCDE */ + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, /* FGHIJKLM */ + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, /* NOPQRSTU */ + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, /* VWXYZ[\] */ + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* ^_`abcde */ + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, /* fghijklm */ + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, /* nopqrstu */ + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, /* vwxyz{|} */ + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, /* ~....... */ + 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, /* ........ */ + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, /* ........ */ + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, /* ........ */ + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, /* ........ */ + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, /* ........ */ + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, /* ........ */ + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, /* ........ */ + 0xbe, 0xbf, /* .. */ +} + +/* Frame (1514 bytes) */ +var testPing2Frag2 = []byte{ + 0xf4, 0xca, 0xe5, 0x4e, 0xe1, 0x46, 0x7c, 0x7a, /* ...N.F|z */ + 0x91, 0x7d, 0x7c, 0x74, 0x08, 0x00, 0x45, 0x00, /* .}|t..E. */ + 0x05, 0xdc, 0xb4, 0x9e, 0x20, 0xb9, 0x40, 0x01, /* .... .@. */ + 0xcd, 0xfa, 0xc0, 0xa8, 0x01, 0x17, 0x08, 0x08, /* ........ */ + 0x08, 0x08, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, /* ........ */ + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, /* ........ */ + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, /* ........ */ + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, /* ........ */ + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, /* ........ */ + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, /* ........ */ + 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, /* ........ */ + 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, /* ........ */ + 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* ........ */ + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, /* ........ */ + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, /* ........ */ + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, /* ........ */ + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, /* .. !"#$% */ + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* &'()*+,- */ + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* ./012345 */ + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, /* 6789:;<= */ + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, /* >?@ABCDE */ + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, /* FGHIJKLM */ + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, /* NOPQRSTU */ + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, /* VWXYZ[\] */ + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* ^_`abcde */ + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, /* fghijklm */ + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, /* nopqrstu */ + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, /* vwxyz{|} */ + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, /* ~....... */ + 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, /* ........ */ + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, /* ........ */ + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, /* ........ */ + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, /* ........ */ + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, /* ........ */ + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, /* ........ */ + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, /* ........ */ + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, /* ........ */ + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, /* ........ */ + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, /* ........ */ + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, /* ........ */ + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, /* ........ */ + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, /* ........ */ + 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, /* ........ */ + 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, /* ........ */ + 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* ........ */ + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, /* ........ */ + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, /* ........ */ + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, /* ........ */ + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, /* .. !"#$% */ + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* &'()*+,- */ + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* ./012345 */ + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, /* 6789:;<= */ + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, /* >?@ABCDE */ + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, /* FGHIJKLM */ + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, /* NOPQRSTU */ + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, /* VWXYZ[\] */ + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* ^_`abcde */ + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, /* fghijklm */ + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, /* nopqrstu */ + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, /* vwxyz{|} */ + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, /* ~....... */ + 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, /* ........ */ + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, /* ........ */ + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, /* ........ */ + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, /* ........ */ + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, /* ........ */ + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, /* ........ */ + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, /* ........ */ + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, /* ........ */ + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, /* ........ */ + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, /* ........ */ + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, /* ........ */ + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, /* ........ */ + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, /* ........ */ + 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, /* ........ */ + 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, /* ........ */ + 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* ........ */ + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, /* ........ */ + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, /* ........ */ + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, /* ........ */ + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, /* .. !"#$% */ + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* &'()*+,- */ + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* ./012345 */ + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, /* 6789:;<= */ + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, /* >?@ABCDE */ + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, /* FGHIJKLM */ + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, /* NOPQRSTU */ + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, /* VWXYZ[\] */ + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* ^_`abcde */ + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, /* fghijklm */ + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, /* nopqrstu */ + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, /* vwxyz{|} */ + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, /* ~....... */ + 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, /* ........ */ + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, /* ........ */ + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, /* ........ */ + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, /* ........ */ + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, /* ........ */ + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, /* ........ */ + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, /* ........ */ + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, /* ........ */ + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, /* ........ */ + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, /* ........ */ + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, /* ........ */ + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, /* ........ */ + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, /* ........ */ + 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, /* ........ */ + 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, /* ........ */ + 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* ........ */ + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, /* ........ */ + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, /* ........ */ + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, /* ........ */ + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, /* .. !"#$% */ + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* &'()*+,- */ + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* ./012345 */ + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, /* 6789:;<= */ + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, /* >?@ABCDE */ + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, /* FGHIJKLM */ + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, /* NOPQRSTU */ + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, /* VWXYZ[\] */ + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* ^_`abcde */ + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, /* fghijklm */ + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, /* nopqrstu */ + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, /* vwxyz{|} */ + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, /* ~....... */ + 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, /* ........ */ + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, /* ........ */ + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, /* ........ */ + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, /* ........ */ + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, /* ........ */ + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, /* ........ */ + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, /* ........ */ + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, /* ........ */ + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, /* ........ */ + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, /* ........ */ + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, /* ........ */ + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, /* ........ */ + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, /* ........ */ + 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, /* ........ */ + 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, /* ........ */ + 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* ........ */ + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, /* ........ */ + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, /* ........ */ + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, /* ........ */ + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, /* .. !"#$% */ + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* &'()*+,- */ + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* ./012345 */ + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, /* 6789:;<= */ + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, /* >?@ABCDE */ + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, /* FGHIJKLM */ + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, /* NOPQRSTU */ + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, /* VWXYZ[\] */ + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* ^_`abcde */ + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, /* fghijklm */ + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, /* nopqrstu */ + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, /* vwxyz{|} */ + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, /* ~....... */ + 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, /* ........ */ + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, /* ........ */ + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, /* ........ */ + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, /* ........ */ + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, /* ........ */ + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, /* ........ */ + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, /* ........ */ + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, /* ........ */ + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, /* ........ */ + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, /* ........ */ + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, /* ........ */ + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, /* ........ */ + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, /* ........ */ + 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, /* ........ */ + 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, /* ........ */ + 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* ........ */ + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, /* ........ */ + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, /* ........ */ + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, /* ........ */ + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, /* .. !"#$% */ + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* &'()*+,- */ + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* ./012345 */ + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, /* 6789:;<= */ + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, /* >?@ABCDE */ + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, /* FGHIJKLM */ + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, /* NOPQRSTU */ + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, /* VWXYZ[\] */ + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* ^_`abcde */ + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, /* fghijklm */ + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, /* nopqrstu */ + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, /* vwxyz{|} */ + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, /* ~....... */ + 0x86, 0x87, /* .. */ +} + +/* Frame (1514 bytes) */ +var testPing2Frag3 = []byte{ + 0xf4, 0xca, 0xe5, 0x4e, 0xe1, 0x46, 0x7c, 0x7a, /* ...N.F|z */ + 0x91, 0x7d, 0x7c, 0x74, 0x08, 0x00, 0x45, 0x00, /* .}|t..E. */ + 0x05, 0xdc, 0xb4, 0x9e, 0x21, 0x72, 0x40, 0x01, /* ....!r@. */ + 0xcd, 0x41, 0xc0, 0xa8, 0x01, 0x17, 0x08, 0x08, /* .A...... */ + 0x08, 0x08, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, /* ........ */ + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, /* ........ */ + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, /* ........ */ + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, /* ........ */ + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, /* ........ */ + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, /* ........ */ + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, /* ........ */ + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, /* ........ */ + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, /* ........ */ + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, /* ........ */ + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, /* ........ */ + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, /* ........ */ + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, /* ........ */ + 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, /* ........ */ + 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, /* ........ */ + 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* ........ */ + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, /* ........ */ + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, /* ........ */ + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, /* ........ */ + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, /* .. !"#$% */ + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* &'()*+,- */ + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* ./012345 */ + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, /* 6789:;<= */ + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, /* >?@ABCDE */ + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, /* FGHIJKLM */ + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, /* NOPQRSTU */ + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, /* VWXYZ[\] */ + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* ^_`abcde */ + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, /* fghijklm */ + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, /* nopqrstu */ + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, /* vwxyz{|} */ + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, /* ~....... */ + 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, /* ........ */ + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, /* ........ */ + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, /* ........ */ + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, /* ........ */ + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, /* ........ */ + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, /* ........ */ + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, /* ........ */ + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, /* ........ */ + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, /* ........ */ + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, /* ........ */ + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, /* ........ */ + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, /* ........ */ + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, /* ........ */ + 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, /* ........ */ + 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, /* ........ */ + 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* ........ */ + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, /* ........ */ + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, /* ........ */ + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, /* ........ */ + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, /* .. !"#$% */ + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* &'()*+,- */ + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* ./012345 */ + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, /* 6789:;<= */ + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, /* >?@ABCDE */ + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, /* FGHIJKLM */ + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, /* NOPQRSTU */ + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, /* VWXYZ[\] */ + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* ^_`abcde */ + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, /* fghijklm */ + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, /* nopqrstu */ + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, /* vwxyz{|} */ + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, /* ~....... */ + 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, /* ........ */ + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, /* ........ */ + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, /* ........ */ + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, /* ........ */ + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, /* ........ */ + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, /* ........ */ + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, /* ........ */ + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, /* ........ */ + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, /* ........ */ + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, /* ........ */ + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, /* ........ */ + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, /* ........ */ + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, /* ........ */ + 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, /* ........ */ + 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, /* ........ */ + 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* ........ */ + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, /* ........ */ + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, /* ........ */ + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, /* ........ */ + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, /* .. !"#$% */ + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* &'()*+,- */ + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* ./012345 */ + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, /* 6789:;<= */ + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, /* >?@ABCDE */ + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, /* FGHIJKLM */ + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, /* NOPQRSTU */ + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, /* VWXYZ[\] */ + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* ^_`abcde */ + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, /* fghijklm */ + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, /* nopqrstu */ + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, /* vwxyz{|} */ + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, /* ~....... */ + 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, /* ........ */ + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, /* ........ */ + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, /* ........ */ + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, /* ........ */ + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, /* ........ */ + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, /* ........ */ + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, /* ........ */ + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, /* ........ */ + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, /* ........ */ + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, /* ........ */ + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, /* ........ */ + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, /* ........ */ + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, /* ........ */ + 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, /* ........ */ + 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, /* ........ */ + 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* ........ */ + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, /* ........ */ + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, /* ........ */ + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, /* ........ */ + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, /* .. !"#$% */ + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* &'()*+,- */ + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* ./012345 */ + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, /* 6789:;<= */ + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, /* >?@ABCDE */ + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, /* FGHIJKLM */ + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, /* NOPQRSTU */ + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, /* VWXYZ[\] */ + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* ^_`abcde */ + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, /* fghijklm */ + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, /* nopqrstu */ + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, /* vwxyz{|} */ + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, /* ~....... */ + 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, /* ........ */ + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, /* ........ */ + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, /* ........ */ + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, /* ........ */ + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, /* ........ */ + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, /* ........ */ + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, /* ........ */ + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, /* ........ */ + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, /* ........ */ + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, /* ........ */ + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, /* ........ */ + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, /* ........ */ + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, /* ........ */ + 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, /* ........ */ + 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, /* ........ */ + 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* ........ */ + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, /* ........ */ + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, /* ........ */ + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, /* ........ */ + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, /* .. !"#$% */ + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* &'()*+,- */ + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* ./012345 */ + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, /* 6789:;<= */ + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, /* >?@ABCDE */ + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, /* FGHIJKLM */ + 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, /* NOPQRSTU */ + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, /* VWXYZ[\] */ + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* ^_`abcde */ + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, /* fghijklm */ + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, /* nopqrstu */ + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, /* vwxyz{|} */ + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, /* ~....... */ + 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, /* ........ */ + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, /* ........ */ + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, /* ........ */ + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, /* ........ */ + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, /* ........ */ + 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, /* ........ */ + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, /* ........ */ + 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, /* ........ */ + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, /* ........ */ + 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, /* ........ */ + 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, /* ........ */ + 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, /* ........ */ + 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, /* ........ */ + 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, /* ........ */ + 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, /* ........ */ + 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* ........ */ + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, /* ........ */ + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, /* ........ */ + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, /* ........ */ + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, /* .. !"#$% */ + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* &'()*+,- */ + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* ./012345 */ + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, /* 6789:;<= */ + 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, /* >?@ABCDE */ + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, /* FGHIJKLM */ + 0x4e, 0x4f, /* NO */ +} + +/* Frame (102 bytes) */ +var testPing2Frag4 = []byte{ + 0xf4, 0xca, 0xe5, 0x4e, 0xe1, 0x46, 0x7c, 0x7a, /* ...N.F|z */ + 0x91, 0x7d, 0x7c, 0x74, 0x08, 0x00, 0x45, 0x00, /* .}|t..E. */ + 0x00, 0x58, 0xb4, 0x9e, 0x02, 0x2b, 0x40, 0x01, /* .X...+@. */ + 0xf2, 0x0c, 0xc0, 0xa8, 0x01, 0x17, 0x08, 0x08, /* ........ */ + 0x08, 0x08, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, /* ..PQRSTU */ + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, /* VWXYZ[\] */ + 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* ^_`abcde */ + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, /* fghijklm */ + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, /* nopqrstu */ + 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, /* vwxyz{|} */ + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, /* ~....... */ + 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, /* ........ */ + 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, /* ...... */ +} diff --git a/vendor/github.com/google/gopacket/layerclass.go b/vendor/github.com/google/gopacket/layerclass.go new file mode 100644 index 0000000..775cd09 --- /dev/null +++ b/vendor/github.com/google/gopacket/layerclass.go @@ -0,0 +1,107 @@ +// 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 gopacket + +// LayerClass is a set of LayerTypes, used for grabbing one of a number of +// different types from a packet. +type LayerClass interface { + // Contains returns true if the given layer type should be considered part + // of this layer class. + Contains(LayerType) bool + // LayerTypes returns the set of all layer types in this layer class. + // Note that this may not be a fast operation on all LayerClass + // implementations. + LayerTypes() []LayerType +} + +// Contains implements LayerClass. +func (l LayerType) Contains(a LayerType) bool { + return l == a +} + +// LayerTypes implements LayerClass. +func (l LayerType) LayerTypes() []LayerType { + return []LayerType{l} +} + +// LayerClassSlice implements a LayerClass with a slice. +type LayerClassSlice []bool + +// Contains returns true if the given layer type should be considered part +// of this layer class. +func (s LayerClassSlice) Contains(t LayerType) bool { + return int(t) < len(s) && s[t] +} + +// LayerTypes returns all layer types in this LayerClassSlice. +// Because of LayerClassSlice's implementation, this could be quite slow. +func (s LayerClassSlice) LayerTypes() (all []LayerType) { + for i := 0; i < len(s); i++ { + if s[i] { + all = append(all, LayerType(i)) + } + } + return +} + +// NewLayerClassSlice creates a new LayerClassSlice by creating a slice of +// size max(types) and setting slice[t] to true for each type t. Note, if +// you implement your own LayerType and give it a high value, this WILL create +// a very large slice. +func NewLayerClassSlice(types []LayerType) LayerClassSlice { + var max LayerType + for _, typ := range types { + if typ > max { + max = typ + } + } + t := make([]bool, int(max+1)) + for _, typ := range types { + t[typ] = true + } + return t +} + +// LayerClassMap implements a LayerClass with a map. +type LayerClassMap map[LayerType]bool + +// Contains returns true if the given layer type should be considered part +// of this layer class. +func (m LayerClassMap) Contains(t LayerType) bool { + return m[t] +} + +// LayerTypes returns all layer types in this LayerClassMap. +func (m LayerClassMap) LayerTypes() (all []LayerType) { + for t := range m { + all = append(all, t) + } + return +} + +// NewLayerClassMap creates a LayerClassMap and sets map[t] to true for each +// type in types. +func NewLayerClassMap(types []LayerType) LayerClassMap { + m := LayerClassMap{} + for _, typ := range types { + m[typ] = true + } + return m +} + +// NewLayerClass creates a LayerClass, attempting to be smart about which type +// it creates based on which types are passed in. +func NewLayerClass(types []LayerType) LayerClass { + for _, typ := range types { + if typ > maxLayerType { + // NewLayerClassSlice could create a very large object, so instead create + // a map. + return NewLayerClassMap(types) + } + } + return NewLayerClassSlice(types) +} diff --git a/vendor/github.com/google/gopacket/layers/.linted b/vendor/github.com/google/gopacket/layers/.linted new file mode 100644 index 0000000..afe7689 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/.linted @@ -0,0 +1,41 @@ +arp.go +base.go +base_test.go +bfd.go +cdp.go +ctp.go +decode_test.go +dhcp_test.go +dhcpv4.go +dns.go +dns_test.go +doc.go +dot11_test.go +dot1q.go +dot1q_test.go +eapol.go +etherip.go +fddi.go +gen.go +gre.go +gre_test.go +iana_ports.go +icmp6_test.go +igmp_test.go +ip4_test.go +ipsec.go +ipsec_test.go +loopback.go +mpls_test.go +ntp_test.go +ports.go +ppp.go +prism_test.go +radiotap_test.go +sflow_test.go +tcp_test.go +udp_test.go +usb_test.go +vrrp_test.go +vxlan.go +vxlan_test.go diff --git a/vendor/github.com/google/gopacket/layers/arp.go b/vendor/github.com/google/gopacket/layers/arp.go new file mode 100644 index 0000000..49e05ac --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/arp.go @@ -0,0 +1,109 @@ +// Copyright 2012 Google, Inc. All rights reserved. +// Copyright 2009-2011 Andreas Krennmair. 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 layers + +import ( + "encoding/binary" + "errors" + + "github.com/google/gopacket" +) + +// Potential values for ARP.Operation. +const ( + ARPRequest = 1 + ARPReply = 2 +) + +// ARP is a ARP packet header. +type ARP struct { + BaseLayer + AddrType LinkType + Protocol EthernetType + HwAddressSize uint8 + ProtAddressSize uint8 + Operation uint16 + SourceHwAddress []byte + SourceProtAddress []byte + DstHwAddress []byte + DstProtAddress []byte +} + +// LayerType returns LayerTypeARP +func (arp *ARP) LayerType() gopacket.LayerType { return LayerTypeARP } + +// DecodeFromBytes decodes the given bytes into this layer. +func (arp *ARP) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + arp.AddrType = LinkType(binary.BigEndian.Uint16(data[0:2])) + arp.Protocol = EthernetType(binary.BigEndian.Uint16(data[2:4])) + arp.HwAddressSize = data[4] + arp.ProtAddressSize = data[5] + arp.Operation = binary.BigEndian.Uint16(data[6:8]) + arp.SourceHwAddress = data[8 : 8+arp.HwAddressSize] + arp.SourceProtAddress = data[8+arp.HwAddressSize : 8+arp.HwAddressSize+arp.ProtAddressSize] + arp.DstHwAddress = data[8+arp.HwAddressSize+arp.ProtAddressSize : 8+2*arp.HwAddressSize+arp.ProtAddressSize] + arp.DstProtAddress = data[8+2*arp.HwAddressSize+arp.ProtAddressSize : 8+2*arp.HwAddressSize+2*arp.ProtAddressSize] + + arpLength := 8 + 2*arp.HwAddressSize + 2*arp.ProtAddressSize + arp.Contents = data[:arpLength] + arp.Payload = data[arpLength:] + return nil +} + +// SerializeTo writes the serialized form of this layer into the +// SerializationBuffer, implementing gopacket.SerializableLayer. +// See the docs for gopacket.SerializableLayer for more info. +func (arp *ARP) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + size := 8 + len(arp.SourceHwAddress) + len(arp.SourceProtAddress) + len(arp.DstHwAddress) + len(arp.DstProtAddress) + bytes, err := b.PrependBytes(size) + if err != nil { + return err + } + if opts.FixLengths { + if len(arp.SourceHwAddress) != len(arp.DstHwAddress) { + return errors.New("mismatched hardware address sizes") + } + arp.HwAddressSize = uint8(len(arp.SourceHwAddress)) + if len(arp.SourceProtAddress) != len(arp.DstProtAddress) { + return errors.New("mismatched prot address sizes") + } + arp.ProtAddressSize = uint8(len(arp.SourceProtAddress)) + } + binary.BigEndian.PutUint16(bytes, uint16(arp.AddrType)) + binary.BigEndian.PutUint16(bytes[2:], uint16(arp.Protocol)) + bytes[4] = arp.HwAddressSize + bytes[5] = arp.ProtAddressSize + binary.BigEndian.PutUint16(bytes[6:], arp.Operation) + start := 8 + for _, addr := range [][]byte{ + arp.SourceHwAddress, + arp.SourceProtAddress, + arp.DstHwAddress, + arp.DstProtAddress, + } { + copy(bytes[start:], addr) + start += len(addr) + } + return nil +} + +// CanDecode returns the set of layer types that this DecodingLayer can decode. +func (arp *ARP) CanDecode() gopacket.LayerClass { + return LayerTypeARP +} + +// NextLayerType returns the layer type contained by this DecodingLayer. +func (arp *ARP) NextLayerType() gopacket.LayerType { + return gopacket.LayerTypePayload +} + +func decodeARP(data []byte, p gopacket.PacketBuilder) error { + + arp := &ARP{} + return decodingLayerDecoder(arp, data, p) +} diff --git a/vendor/github.com/google/gopacket/layers/base.go b/vendor/github.com/google/gopacket/layers/base.go new file mode 100644 index 0000000..cd59b46 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/base.go @@ -0,0 +1,52 @@ +// 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 layers + +import ( + "github.com/google/gopacket" +) + +// BaseLayer is a convenience struct which implements the LayerData and +// LayerPayload functions of the Layer interface. +type BaseLayer struct { + // Contents is the set of bytes that make up this layer. IE: for an + // Ethernet packet, this would be the set of bytes making up the + // Ethernet frame. + Contents []byte + // Payload is the set of bytes contained by (but not part of) this + // Layer. Again, to take Ethernet as an example, this would be the + // set of bytes encapsulated by the Ethernet protocol. + Payload []byte +} + +// LayerContents returns the bytes of the packet layer. +func (b *BaseLayer) LayerContents() []byte { return b.Contents } + +// LayerPayload returns the bytes contained within the packet layer. +func (b *BaseLayer) LayerPayload() []byte { return b.Payload } + +type layerDecodingLayer interface { + gopacket.Layer + DecodeFromBytes([]byte, gopacket.DecodeFeedback) error + NextLayerType() gopacket.LayerType +} + +func decodingLayerDecoder(d layerDecodingLayer, data []byte, p gopacket.PacketBuilder) error { + err := d.DecodeFromBytes(data, p) + if err != nil { + return err + } + p.AddLayer(d) + next := d.NextLayerType() + if next == gopacket.LayerTypeZero { + return nil + } + return p.NextDecoder(next) +} + +// hacky way to zero out memory... there must be a better way? +var lotsOfZeros [1024]byte diff --git a/vendor/github.com/google/gopacket/layers/base_test.go b/vendor/github.com/google/gopacket/layers/base_test.go new file mode 100644 index 0000000..4be7480 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/base_test.go @@ -0,0 +1,42 @@ +// 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. + +// This file contains some test helper functions. + +package layers + +import ( + "github.com/google/gopacket" + "testing" +) + +func min(a, b int) int { + if a < b { + return a + } + return b +} + +func checkLayers(p gopacket.Packet, want []gopacket.LayerType, t *testing.T) { + layers := p.Layers() + t.Log("Checking packet layers, want", want) + for _, l := range layers { + t.Logf(" Got layer %v, %d bytes, payload of %d bytes", l.LayerType(), + len(l.LayerContents()), len(l.LayerPayload())) + } + t.Log(p) + if len(layers) != len(want) { + t.Errorf(" Number of layers mismatch: got %d want %d", len(layers), + len(want)) + return + } + for i, l := range layers { + if l.LayerType() != want[i] { + t.Errorf(" Layer %d mismatch: got %v want %v", i, l.LayerType(), + want[i]) + } + } +} diff --git a/vendor/github.com/google/gopacket/layers/bfd.go b/vendor/github.com/google/gopacket/layers/bfd.go new file mode 100644 index 0000000..43030fb --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/bfd.go @@ -0,0 +1,481 @@ +// Copyright 2017 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 layers + +import ( + "encoding/binary" + "errors" + + "github.com/google/gopacket" +) + +// BFD Control Packet Format +// ------------------------- +// The current version of BFD's RFC (RFC 5880) contains the following +// diagram for the BFD Control packet format: +// +// 0 1 2 3 +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// |Vers | Diag |Sta|P|F|C|A|D|M| Detect Mult | Length | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | My Discriminator | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Your Discriminator | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Desired Min TX Interval | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Required Min RX Interval | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Required Min Echo RX Interval | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// +// An optional Authentication Section MAY be present: +// +// 0 1 2 3 +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Auth Type | Auth Len | Authentication Data... | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// +// +// Simple Password Authentication Section Format +// --------------------------------------------- +// 0 1 2 3 +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Auth Type | Auth Len | Auth Key ID | Password... | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | ... | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// +// +// Keyed MD5 and Meticulous Keyed MD5 Authentication Section Format +// ---------------------------------------------------------------- +// 0 1 2 3 +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Auth Type | Auth Len | Auth Key ID | Reserved | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Sequence Number | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Auth Key/Digest... | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | ... | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// +// +// Keyed SHA1 and Meticulous Keyed SHA1 Authentication Section Format +// ------------------------------------------------------------------ +// 0 1 2 3 +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Auth Type | Auth Len | Auth Key ID | Reserved | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Sequence Number | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Auth Key/Hash... | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | ... | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// +// From https://tools.ietf.org/rfc/rfc5880.txt +const bfdMinimumRecordSizeInBytes int = 24 + +// BFDVersion represents the version as decoded from the BFD control message +type BFDVersion uint8 + +// BFDDiagnostic represents diagnostic infomation about a BFD session +type BFDDiagnostic uint8 + +// constants that define BFDDiagnostic flags +const ( + BFDDiagnosticNone BFDDiagnostic = 0 // No Diagnostic + BFDDiagnosticTimeExpired BFDDiagnostic = 1 // Control Detection Time Expired + BFDDiagnosticEchoFailed BFDDiagnostic = 2 // Echo Function Failed + BFDDiagnosticNeighborSignalDown BFDDiagnostic = 3 // Neighbor Signaled Session Down + BFDDiagnosticForwardPlaneReset BFDDiagnostic = 4 // Forwarding Plane Reset + BFDDiagnosticPathDown BFDDiagnostic = 5 // Path Down + BFDDiagnosticConcatPathDown BFDDiagnostic = 6 // Concatenated Path Down + BFDDiagnosticAdminDown BFDDiagnostic = 7 // Administratively Down + BFDDiagnosticRevConcatPathDown BFDDiagnostic = 8 // Reverse Concatenated Path Dow +) + +// String returns a string version of BFDDiagnostic +func (bd BFDDiagnostic) String() string { + switch bd { + default: + return "Unknown" + case BFDDiagnosticNone: + return "None" + case BFDDiagnosticTimeExpired: + return "Control Detection Time Expired" + case BFDDiagnosticEchoFailed: + return "Echo Function Failed" + case BFDDiagnosticNeighborSignalDown: + return "Neighbor Signaled Session Down" + case BFDDiagnosticForwardPlaneReset: + return "Forwarding Plane Reset" + case BFDDiagnosticPathDown: + return "Path Down" + case BFDDiagnosticConcatPathDown: + return "Concatenated Path Down" + case BFDDiagnosticAdminDown: + return "Administratively Down" + case BFDDiagnosticRevConcatPathDown: + return "Reverse Concatenated Path Down" + } +} + +// BFDState represents the state of a BFD session +type BFDState uint8 + +// constants that define BFDState +const ( + BFDStateAdminDown BFDState = 0 + BFDStateDown BFDState = 1 + BFDStateInit BFDState = 2 + BFDStateUp BFDState = 3 +) + +// String returns a string version of BFDState +func (s BFDState) String() string { + switch s { + default: + return "Unknown" + case BFDStateAdminDown: + return "Admin Down" + case BFDStateDown: + return "Down" + case BFDStateInit: + return "Init" + case BFDStateUp: + return "Up" + } +} + +// BFDDetectMultiplier represents the negotiated transmit interval, +// multiplied by this value, provides the Detection Time for the +// receiving system in Asynchronous mode. +type BFDDetectMultiplier uint8 + +// BFDDiscriminator is a unique, nonzero discriminator value used +// to demultiplex multiple BFD sessions between the same pair of systems. +type BFDDiscriminator uint32 + +// BFDTimeInterval represents a time interval in microseconds +type BFDTimeInterval uint32 + +// BFDAuthType represents the authentication used in the BFD session +type BFDAuthType uint8 + +// constants that define the BFDAuthType +const ( + BFDAuthTypeNone BFDAuthType = 0 // No Auth + BFDAuthTypePassword BFDAuthType = 1 // Simple Password + BFDAuthTypeKeyedMD5 BFDAuthType = 2 // Keyed MD5 + BFDAuthTypeMeticulousKeyedMD5 BFDAuthType = 3 // Meticulous Keyed MD5 + BFDAuthTypeKeyedSHA1 BFDAuthType = 4 // Keyed SHA1 + BFDAuthTypeMeticulousKeyedSHA1 BFDAuthType = 5 // Meticulous Keyed SHA1 +) + +// String returns a string version of BFDAuthType +func (at BFDAuthType) String() string { + switch at { + default: + return "Unknown" + case BFDAuthTypeNone: + return "No Authentication" + case BFDAuthTypePassword: + return "Simple Password" + case BFDAuthTypeKeyedMD5: + return "Keyed MD5" + case BFDAuthTypeMeticulousKeyedMD5: + return "Meticulous Keyed MD5" + case BFDAuthTypeKeyedSHA1: + return "Keyed SHA1" + case BFDAuthTypeMeticulousKeyedSHA1: + return "Meticulous Keyed SHA1" + } +} + +// BFDAuthKeyID represents the authentication key ID in use for +// this packet. This allows multiple keys to be active simultaneously. +type BFDAuthKeyID uint8 + +// BFDAuthSequenceNumber represents the sequence number for this packet. +// For Keyed Authentication, this value is incremented occasionally. For +// Meticulous Keyed Authentication, this value is incremented for each +// successive packet transmitted for a session. This provides protection +// against replay attacks. +type BFDAuthSequenceNumber uint32 + +// BFDAuthData represents the authentication key or digest +type BFDAuthData []byte + +// BFDAuthHeader represents authentication data used in the BFD session +type BFDAuthHeader struct { + AuthType BFDAuthType + KeyID BFDAuthKeyID + SequenceNumber BFDAuthSequenceNumber + Data BFDAuthData +} + +// Length returns the data length of the BFDAuthHeader based on the +// authentication type +func (h *BFDAuthHeader) Length() int { + switch h.AuthType { + case BFDAuthTypePassword: + return 3 + len(h.Data) + case BFDAuthTypeKeyedMD5, BFDAuthTypeMeticulousKeyedMD5: + return 8 + len(h.Data) + case BFDAuthTypeKeyedSHA1, BFDAuthTypeMeticulousKeyedSHA1: + return 8 + len(h.Data) + default: + return 0 + } +} + +// BFD represents a BFD control message packet whose payload contains +// the control information required to for a BFD session. +// +// References +// ---------- +// +// Wikipedia's BFD entry: +// https://en.wikipedia.org/wiki/Bidirectional_Forwarding_Detection +// This is the best place to get an overview of BFD. +// +// RFC 5880 "Bidirectional Forwarding Detection (BFD)" (2010) +// https://tools.ietf.org/html/rfc5880 +// This is the original BFD specification. +// +// RFC 5881 "Bidirectional Forwarding Detection (BFD) for IPv4 and IPv6 (Single Hop)" (2010) +// https://tools.ietf.org/html/rfc5881 +// Describes the use of the Bidirectional Forwarding Detection (BFD) +// protocol over IPv4 and IPv6 for single IP hops. +type BFD struct { + BaseLayer // Stores the packet bytes and payload bytes. + + Version BFDVersion // Version of the BFD protocol. + Diagnostic BFDDiagnostic // Diagnostic code for last state change + State BFDState // Current state + Poll bool // Requesting verification + Final bool // Responding to a received BFD Control packet that had the Poll (P) bit set. + ControlPlaneIndependent bool // BFD implementation does not share fate with its control plane + AuthPresent bool // Authentication Section is present and the session is to be authenticated + Demand bool // Demand mode is active + Multipoint bool // For future point-to-multipoint extensions. Must always be zero + DetectMultiplier BFDDetectMultiplier // Detection time multiplier + MyDiscriminator BFDDiscriminator // A unique, nonzero discriminator value + YourDiscriminator BFDDiscriminator // discriminator received from the remote system. + DesiredMinTxInterval BFDTimeInterval // Minimum interval, in microseconds, the local system would like to use when transmitting BFD Control packets + RequiredMinRxInterval BFDTimeInterval // Minimum interval, in microseconds, between received BFD Control packets that this system is capable of supporting + RequiredMinEchoRxInterval BFDTimeInterval // Minimum interval, in microseconds, between received BFD Echo packets that this system is capable of supporting + AuthHeader *BFDAuthHeader // Authentication data, variable length. +} + +// Length returns the data length of a BFD Control message which +// changes based on the presence and type of authentication +// contained in the message +func (d *BFD) Length() int { + if d.AuthPresent && (d.AuthHeader != nil) { + return bfdMinimumRecordSizeInBytes + d.AuthHeader.Length() + } + + return bfdMinimumRecordSizeInBytes +} + +// LayerType returns the layer type of the BFD object, which is LayerTypeBFD. +func (d *BFD) LayerType() gopacket.LayerType { + return LayerTypeBFD +} + +// decodeBFD analyses a byte slice and attempts to decode it as a BFD +// control packet +// +// If it succeeds, it loads p with information about the packet and returns nil. +// If it fails, it returns an error (non nil). +// +// This function is employed in layertypes.go to register the BFD layer. +func decodeBFD(data []byte, p gopacket.PacketBuilder) error { + + // Attempt to decode the byte slice. + d := &BFD{} + err := d.DecodeFromBytes(data, p) + if err != nil { + return err + } + + // If the decoding worked, add the layer to the packet and set it + // as the application layer too, if there isn't already one. + p.AddLayer(d) + p.SetApplicationLayer(d) + + return nil +} + +// DecodeFromBytes analyses a byte slice and attempts to decode it as a BFD +// control packet. +// +// Upon succeeds, it loads the BFD object with information about the packet +// and returns nil. +// Upon failure, it returns an error (non nil). +func (d *BFD) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + + // If the data block is too short to be a BFD record, then return an error. + if len(data) < bfdMinimumRecordSizeInBytes { + df.SetTruncated() + return errors.New("BFD packet too short") + } + + pLen := uint8(data[3]) + if len(data) != int(pLen) { + return errors.New("BFD packet length does not match") + } + + // BFD type embeds type BaseLayer which contains two fields: + // Contents is supposed to contain the bytes of the data at this level. + // Payload is supposed to contain the payload of this level. + // Here we set the baselayer to be the bytes of the BFD record. + d.BaseLayer = BaseLayer{Contents: data[:len(data)]} + + // Extract the fields from the block of bytes. + // To make sense of this, refer to the packet diagram + // above and the section on endian conventions. + + // The first few fields are all packed into the first 32 bits. Unpack them. + d.Version = BFDVersion(((data[0] & 0xE0) >> 5)) + d.Diagnostic = BFDDiagnostic(data[0] & 0x1F) + data = data[1:] + + d.State = BFDState((data[0] & 0xC0) >> 6) + d.Poll = data[0]&0x20 != 0 + d.Final = data[0]&0x10 != 0 + d.ControlPlaneIndependent = data[0]&0x08 != 0 + d.AuthPresent = data[0]&0x04 != 0 + d.Demand = data[0]&0x02 != 0 + d.Multipoint = data[0]&0x01 != 0 + data = data[1:] + + data, d.DetectMultiplier = data[1:], BFDDetectMultiplier(data[0]) + data, _ = data[1:], uint8(data[0]) // Consume length + + // The remaining fields can just be copied in big endian order. + data, d.MyDiscriminator = data[4:], BFDDiscriminator(binary.BigEndian.Uint32(data[:4])) + data, d.YourDiscriminator = data[4:], BFDDiscriminator(binary.BigEndian.Uint32(data[:4])) + data, d.DesiredMinTxInterval = data[4:], BFDTimeInterval(binary.BigEndian.Uint32(data[:4])) + data, d.RequiredMinRxInterval = data[4:], BFDTimeInterval(binary.BigEndian.Uint32(data[:4])) + data, d.RequiredMinEchoRxInterval = data[4:], BFDTimeInterval(binary.BigEndian.Uint32(data[:4])) + + if d.AuthPresent && (len(data) > 2) { + d.AuthHeader = &BFDAuthHeader{} + data, d.AuthHeader.AuthType = data[1:], BFDAuthType(data[0]) + data, _ = data[1:], uint8(data[0]) // Consume length + data, d.AuthHeader.KeyID = data[1:], BFDAuthKeyID(data[0]) + + switch d.AuthHeader.AuthType { + case BFDAuthTypePassword: + d.AuthHeader.Data = BFDAuthData(data) + case BFDAuthTypeKeyedMD5, BFDAuthTypeMeticulousKeyedMD5: + // Skipped reserved byte + data, d.AuthHeader.SequenceNumber = data[5:], BFDAuthSequenceNumber(binary.BigEndian.Uint32(data[1:5])) + d.AuthHeader.Data = BFDAuthData(data) + case BFDAuthTypeKeyedSHA1, BFDAuthTypeMeticulousKeyedSHA1: + // Skipped reserved byte + data, d.AuthHeader.SequenceNumber = data[5:], BFDAuthSequenceNumber(binary.BigEndian.Uint32(data[1:5])) + d.AuthHeader.Data = BFDAuthData(data) + } + } + + return nil +} + +// SerializeTo writes the serialized form of this layer into the +// SerializationBuffer, implementing gopacket.SerializableLayer. +// See the docs for gopacket.SerializableLayer for more info. +func (d *BFD) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + data, err := b.PrependBytes(bfdMinimumRecordSizeInBytes) + if err != nil { + return err + } + + // Pack the first few fields into the first 32 bits. + data[0] = byte(byte(d.Version<<5) | byte(d.Diagnostic)) + h := uint8(0) + h |= (uint8(d.State) << 6) + h |= (uint8(bool2uint8(d.Poll)) << 5) + h |= (uint8(bool2uint8(d.Final)) << 4) + h |= (uint8(bool2uint8(d.ControlPlaneIndependent)) << 3) + h |= (uint8(bool2uint8(d.AuthPresent)) << 2) + h |= (uint8(bool2uint8(d.Demand)) << 1) + h |= uint8(bool2uint8(d.Multipoint)) + data[1] = byte(h) + data[2] = byte(d.DetectMultiplier) + data[3] = byte(d.Length()) + + // The remaining fields can just be copied in big endian order. + binary.BigEndian.PutUint32(data[4:], uint32(d.MyDiscriminator)) + binary.BigEndian.PutUint32(data[8:], uint32(d.YourDiscriminator)) + binary.BigEndian.PutUint32(data[12:], uint32(d.DesiredMinTxInterval)) + binary.BigEndian.PutUint32(data[16:], uint32(d.RequiredMinRxInterval)) + binary.BigEndian.PutUint32(data[20:], uint32(d.RequiredMinEchoRxInterval)) + + if d.AuthPresent && (d.AuthHeader != nil) { + auth, err := b.AppendBytes(int(d.AuthHeader.Length())) + if err != nil { + return err + } + + auth[0] = byte(d.AuthHeader.AuthType) + auth[1] = byte(d.AuthHeader.Length()) + auth[2] = byte(d.AuthHeader.KeyID) + + switch d.AuthHeader.AuthType { + case BFDAuthTypePassword: + copy(auth[3:], d.AuthHeader.Data) + case BFDAuthTypeKeyedMD5, BFDAuthTypeMeticulousKeyedMD5: + auth[3] = byte(0) + binary.BigEndian.PutUint32(auth[4:], uint32(d.AuthHeader.SequenceNumber)) + copy(auth[8:], d.AuthHeader.Data) + case BFDAuthTypeKeyedSHA1, BFDAuthTypeMeticulousKeyedSHA1: + auth[3] = byte(0) + binary.BigEndian.PutUint32(auth[4:], uint32(d.AuthHeader.SequenceNumber)) + copy(auth[8:], d.AuthHeader.Data) + } + } + + return nil +} + +// CanDecode returns a set of layers that BFD objects can decode. +// As BFD objects can only decide the BFD layer, we can return just that layer. +// Apparently a single layer type implements LayerClass. +func (d *BFD) CanDecode() gopacket.LayerClass { + return LayerTypeBFD +} + +// NextLayerType specifies the next layer that GoPacket should attempt to +// analyse after this (BFD) layer. As BFD packets do not contain any payload +// bytes, there are no further layers to analyse. +func (d *BFD) NextLayerType() gopacket.LayerType { + return gopacket.LayerTypeZero +} + +// Payload returns an empty byte slice as BFD packets do not carry a payload +func (d *BFD) Payload() []byte { + return nil +} + +// bool2uint8 converts a bool to uint8 +func bool2uint8(b bool) uint8 { + if b { + return 1 + } + return 0 +} diff --git a/vendor/github.com/google/gopacket/layers/bfd_test.go b/vendor/github.com/google/gopacket/layers/bfd_test.go new file mode 100644 index 0000000..1ac84cb --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/bfd_test.go @@ -0,0 +1,289 @@ +// Copyright 2017 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 layers + +import ( + "github.com/google/gopacket" + "reflect" + "testing" +) + +//****************************************************************************** + +// checkBFD() uses the bfd.go code to analyse the packet bytes as an BFD Control +// packet and generate an BFD object. It then compares the generated BFD object +// with the one provided and throws an error if there is any difference. +// The desc argument is output with any failure message to identify the test. +func checkBFD(desc string, t *testing.T, packetBytes []byte, pExpectedBFD *BFD) { + + // Analyse the packet bytes, yielding a new packet object p. + p := gopacket.NewPacket(packetBytes, LinkTypeEthernet, gopacket.Default) + if p.ErrorLayer() != nil { + t.Errorf("Failed to decode packet %s: %v", desc, p.ErrorLayer().Error()) + } + + // Ensure that the packet analysis yielded the correct set of layers: + // Link Layer = Ethernet. + // Network Layer = IPv4. + // Transport Layer = UDP. + // Application Layer = BFD. + checkLayers(p, []gopacket.LayerType{ + LayerTypeEthernet, + LayerTypeIPv4, + LayerTypeUDP, + LayerTypeBFD}, t) + + // Select the Application (BFD) layer. + pResultBFD, ok := p.ApplicationLayer().(*BFD) + if !ok { + t.Error("No BFD layer type found in packet in " + desc + ".") + } + + // Compare the generated BFD object with the expected BFD object. + if !reflect.DeepEqual(pResultBFD, pExpectedBFD) { + t.Errorf("BFD packet processing failed for packet "+desc+ + ":\ngot :\n%#v\n\nwant :\n%#v\n\n", pResultBFD, pExpectedBFD) + } + buf := gopacket.NewSerializeBuffer() + opts := gopacket.SerializeOptions{} + err := pResultBFD.SerializeTo(buf, opts) + if err != nil { + t.Error(err) + } + if !reflect.DeepEqual(pResultBFD.Contents, buf.Bytes()) { + t.Errorf("BFD packet serialization failed for packet "+desc+ + ":\ngot :\n%+v\n\nwant :\n%+v\n\n", buf.Bytes(), pResultBFD.Contents) + } + +} + +func TestBFDNoAuth(t *testing.T) { + // This test packet is based off of the first BFD packet in the BFD sample capture + // pcap file bfd-raw-auth-simple.pcap on the Wireshark sample captures page: + // + // https://wiki.wireshark.org/SampleCaptures + // https://wiki.wireshark.org/SampleCaptures?action=AttachFile&do=get&target=bfd-raw-auth-simple.pcap + // + // Changed to remove the authentication header, and adjust all of the lengths + var testPacketBFD = []byte{ + 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x10, 0x94, 0x00, 0x00, 0x02, 0x08, 0x00, 0x45, 0x00, + 0x00, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x11, 0x2f, 0x58, 0xc0, 0x55, 0x01, 0x02, 0xc0, 0x00, + 0x00, 0x01, 0xc0, 0x00, 0x0e, 0xc8, 0x00, 0x20, 0x72, 0x31, 0x20, 0x40, 0x05, 0x18, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x42, 0x40, 0x00, 0x0f, 0x42, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x4e, 0x0a, 0x90, 0x40, + } + + // Assemble the BFD object that we expect to emerge from this test. + pExpectedBFD := &BFD{ + BaseLayer: BaseLayer{ + Contents: []byte{ + 0x20, 0x40, 0x05, 0x18, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x42, 0x40, + 0x00, 0x0f, 0x42, 0x40, 0x00, 0x00, 0x00, 0x00, + }, + Payload: nil, + }, + Version: 1, + Diagnostic: BFDDiagnosticNone, + State: BFDStateDown, + Poll: false, + Final: false, + ControlPlaneIndependent: false, + AuthPresent: false, + Demand: false, + Multipoint: false, + DetectMultiplier: 5, + MyDiscriminator: 1, + YourDiscriminator: 0, + DesiredMinTxInterval: 1000000, + RequiredMinRxInterval: 1000000, + RequiredMinEchoRxInterval: 0, + AuthHeader: nil, + } + + checkBFD("testNoAuth", t, testPacketBFD, pExpectedBFD) +} + +//****************************************************************************** + +func TestBFDAuthTypePassword(t *testing.T) { + + // This test packet is the first BFD packet in the BFD sample capture + // pcap file bfd-raw-auth-simple.pcap on the Wireshark sample captures page: + // + // https://wiki.wireshark.org/SampleCaptures + // https://wiki.wireshark.org/SampleCaptures?action=AttachFile&do=get&target=bfd-raw-auth-simple.pcap + var testPacketBFD = []byte{ + 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x10, 0x94, 0x00, 0x00, 0x02, 0x08, 0x00, 0x45, 0x00, + 0x00, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x11, 0x2f, 0x58, 0xc0, 0x55, 0x01, 0x02, 0xc0, 0x00, + 0x00, 0x01, 0xc0, 0x00, 0x0e, 0xc8, 0x00, 0x29, 0x72, 0x31, 0x20, 0x44, 0x05, 0x21, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x42, 0x40, 0x00, 0x0f, 0x42, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x09, 0x02, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4e, 0x0a, 0x90, 0x40, + } + + // Assemble the BFD object that we expect to emerge from this test. + pExpectedBFD := &BFD{ + BaseLayer: BaseLayer{ + Contents: []byte{ + 0x20, 0x44, 0x05, 0x21, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x42, 0x40, + 0x00, 0x0f, 0x42, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x09, 0x02, 0x73, 0x65, 0x63, 0x72, 0x65, + 0x74, + }, + Payload: nil, + }, + Version: 1, + Diagnostic: BFDDiagnosticNone, + State: BFDStateDown, + Poll: false, + Final: false, + ControlPlaneIndependent: false, + AuthPresent: true, + Demand: false, + Multipoint: false, + DetectMultiplier: 5, + MyDiscriminator: 1, + YourDiscriminator: 0, + DesiredMinTxInterval: 1000000, + RequiredMinRxInterval: 1000000, + RequiredMinEchoRxInterval: 0, + AuthHeader: &BFDAuthHeader{ + AuthType: BFDAuthTypePassword, + KeyID: 2, + SequenceNumber: 0, + Data: []byte{'s', 'e', 'c', 'r', 'e', 't'}, + }, + } + + checkBFD("testBFDAuthTypePassword", t, testPacketBFD, pExpectedBFD) +} + +//****************************************************************************** + +func TestBFDAuthTypeKeyedMD5(t *testing.T) { + + // This test packet is the first BFD packet in the BFD sample capture + // pcap file bfd-raw-auth-md5.pcap on the Wireshark sample captures page: + // + // https://wiki.wireshark.org/SampleCaptures + // https://wiki.wireshark.org/SampleCaptures?action=AttachFile&do=get&target=bfd-raw-auth-md5.pcap + var testPacketBFD = []byte{ + 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x10, 0x94, 0x00, 0x00, 0x02, 0x08, 0x00, 0x45, 0x00, + 0x00, 0x4c, 0x00, 0x01, 0x00, 0x00, 0x0a, 0x11, 0x2f, 0x48, 0xc0, 0x55, 0x01, 0x02, 0xc0, 0x00, + 0x00, 0x01, 0x04, 0x00, 0x0e, 0xc8, 0x00, 0x38, 0x6a, 0xcc, 0x20, 0x44, 0x05, 0x30, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x42, 0x40, 0x00, 0x0f, 0x42, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x05, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, + 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x3c, 0xc3, 0xf8, 0x21, + } + + // Assemble the BFD object that we expect to emerge from this test. + pExpectedBFD := &BFD{ + BaseLayer: BaseLayer{ + Contents: []byte{ + 0x20, 0x44, 0x05, 0x30, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x42, 0x40, + 0x00, 0x0f, 0x42, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, + }, + Payload: nil, + }, + Version: 1, + Diagnostic: BFDDiagnosticNone, + State: BFDStateDown, + Poll: false, + Final: false, + ControlPlaneIndependent: false, + AuthPresent: true, + Demand: false, + Multipoint: false, + DetectMultiplier: 5, + MyDiscriminator: 1, + YourDiscriminator: 0, + DesiredMinTxInterval: 1000000, + RequiredMinRxInterval: 1000000, + RequiredMinEchoRxInterval: 0, + AuthHeader: &BFDAuthHeader{ + AuthType: BFDAuthTypeKeyedMD5, + KeyID: 2, + SequenceNumber: 5, + Data: []byte{ + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, + }, + }, + } + + checkBFD("testBFDAuthTypeKeyedMD5", t, testPacketBFD, pExpectedBFD) +} + +//****************************************************************************** + +func TestBFDAuthTypeMeticulousKeyedSHA1(t *testing.T) { + + // This test packet is the first BFD packet in the BFD sample capture + // pcap file bfd-raw-auth-sha1.pcap on the Wireshark sample captures page: + // + // https://wiki.wireshark.org/SampleCaptures + // https://wiki.wireshark.org/SampleCaptures?action=AttachFile&do=get&target=bfd-raw-auth-sha1.pcap + var testPacketBFD = []byte{ + 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x10, 0x94, 0x00, 0x00, 0x02, 0x08, 0x00, 0x45, 0x00, + 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x11, 0x2f, 0x45, 0xc0, 0x55, 0x01, 0x02, 0xc0, 0x00, + 0x00, 0x01, 0x04, 0x00, 0x0e, 0xc8, 0x00, 0x3c, 0x37, 0x8a, 0x20, 0x44, 0x05, 0x34, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x42, 0x40, 0x00, 0x0f, 0x42, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x1c, 0x02, 0x00, 0x00, 0x00, 0x00, 0x05, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, + 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0xea, 0x6d, + 0x1f, 0x21, + } + + // Assemble the BFD object that we expect to emerge from this test. + pExpectedBFD := &BFD{ + BaseLayer: BaseLayer{ + Contents: []byte{ + 0x20, 0x44, 0x05, 0x34, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x42, 0x40, + 0x00, 0x0f, 0x42, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x1c, 0x02, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, + 0x17, 0x18, 0x19, 0x1a, + }, + Payload: nil, + }, + Version: 1, + Diagnostic: BFDDiagnosticNone, + State: BFDStateDown, + Poll: false, + Final: false, + ControlPlaneIndependent: false, + AuthPresent: true, + Demand: false, + Multipoint: false, + DetectMultiplier: 5, + MyDiscriminator: 1, + YourDiscriminator: 0, + DesiredMinTxInterval: 1000000, + RequiredMinRxInterval: 1000000, + RequiredMinEchoRxInterval: 0, + AuthHeader: &BFDAuthHeader{ + AuthType: BFDAuthTypeMeticulousKeyedSHA1, + KeyID: 2, + SequenceNumber: 5, + Data: []byte{ + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, + 0x17, 0x18, 0x19, 0x1a, + }, + }, + } + + checkBFD("TestBFDAuthTypeMeticulousKeyedSHA1", t, testPacketBFD, pExpectedBFD) +} diff --git a/vendor/github.com/google/gopacket/layers/cdp.go b/vendor/github.com/google/gopacket/layers/cdp.go new file mode 100644 index 0000000..d67203e --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/cdp.go @@ -0,0 +1,651 @@ +// 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. + +// Enum types courtesy of... +// http://search.cpan.org/~mchapman/Net-CDP-0.09/lib/Net/CDP.pm +// https://code.google.com/p/ladvd/ +// http://anonsvn.wireshark.org/viewvc/releases/wireshark-1.8.6/epan/dissectors/packet-cdp.c + +package layers + +import ( + "encoding/binary" + "fmt" + "net" + + "github.com/google/gopacket" +) + +// CDPTLVType is the type of each TLV value in a CiscoDiscovery packet. +type CDPTLVType uint16 + +// CDPTLVType values. +const ( + CDPTLVDevID CDPTLVType = 0x0001 + CDPTLVAddress CDPTLVType = 0x0002 + CDPTLVPortID CDPTLVType = 0x0003 + CDPTLVCapabilities CDPTLVType = 0x0004 + CDPTLVVersion CDPTLVType = 0x0005 + CDPTLVPlatform CDPTLVType = 0x0006 + CDPTLVIPPrefix CDPTLVType = 0x0007 + CDPTLVHello CDPTLVType = 0x0008 + CDPTLVVTPDomain CDPTLVType = 0x0009 + CDPTLVNativeVLAN CDPTLVType = 0x000a + CDPTLVFullDuplex CDPTLVType = 0x000b + CDPTLVVLANReply CDPTLVType = 0x000e + CDPTLVVLANQuery CDPTLVType = 0x000f + CDPTLVPower CDPTLVType = 0x0010 + CDPTLVMTU CDPTLVType = 0x0011 + CDPTLVExtendedTrust CDPTLVType = 0x0012 + CDPTLVUntrustedCOS CDPTLVType = 0x0013 + CDPTLVSysName CDPTLVType = 0x0014 + CDPTLVSysOID CDPTLVType = 0x0015 + CDPTLVMgmtAddresses CDPTLVType = 0x0016 + CDPTLVLocation CDPTLVType = 0x0017 + CDPTLVExternalPortID CDPTLVType = 0x0018 + CDPTLVPowerRequested CDPTLVType = 0x0019 + CDPTLVPowerAvailable CDPTLVType = 0x001a + CDPTLVPortUnidirectional CDPTLVType = 0x001b + CDPTLVEnergyWise CDPTLVType = 0x001d + CDPTLVSparePairPOE CDPTLVType = 0x001f +) + +// CiscoDiscoveryValue is a TLV value inside a CiscoDiscovery packet layer. +type CiscoDiscoveryValue struct { + Type CDPTLVType + Length uint16 + Value []byte +} + +// CiscoDiscovery is a packet layer containing the Cisco Discovery Protocol. +// See http://www.cisco.com/univercd/cc/td/doc/product/lan/trsrb/frames.htm#31885 +type CiscoDiscovery struct { + BaseLayer + Version byte + TTL byte + Checksum uint16 + Values []CiscoDiscoveryValue +} + +// CDPCapability is the set of capabilities advertised by a CDP device. +type CDPCapability uint32 + +// CDPCapability values. +const ( + CDPCapMaskRouter CDPCapability = 0x0001 + CDPCapMaskTBBridge CDPCapability = 0x0002 + CDPCapMaskSPBridge CDPCapability = 0x0004 + CDPCapMaskSwitch CDPCapability = 0x0008 + CDPCapMaskHost CDPCapability = 0x0010 + CDPCapMaskIGMPFilter CDPCapability = 0x0020 + CDPCapMaskRepeater CDPCapability = 0x0040 + CDPCapMaskPhone CDPCapability = 0x0080 + CDPCapMaskRemote CDPCapability = 0x0100 +) + +// CDPCapabilities represents the capabilities of a device +type CDPCapabilities struct { + L3Router bool + TBBridge bool + SPBridge bool + L2Switch bool + IsHost bool + IGMPFilter bool + L1Repeater bool + IsPhone bool + RemotelyManaged bool +} + +// CDP Power-over-Ethernet values. +const ( + CDPPoEFourWire byte = 0x01 + CDPPoEPDArch byte = 0x02 + CDPPoEPDRequest byte = 0x04 + CDPPoEPSE byte = 0x08 +) + +// CDPSparePairPoE provides information on PoE. +type CDPSparePairPoE struct { + PSEFourWire bool // Supported / Not supported + PDArchShared bool // Shared / Independent + PDRequestOn bool // On / Off + PSEOn bool // On / Off +} + +// CDPVLANDialogue encapsulates a VLAN Query/Reply +type CDPVLANDialogue struct { + ID uint8 + VLAN uint16 +} + +// CDPPowerDialogue encapsulates a Power Query/Reply +type CDPPowerDialogue struct { + ID uint16 + MgmtID uint16 + Values []uint32 +} + +// CDPLocation provides location information for a CDP device. +type CDPLocation struct { + Type uint8 // Undocumented + Location string +} + +// CDPHello is a Cisco Hello message (undocumented, hence the "Unknown" fields) +type CDPHello struct { + OUI []byte + ProtocolID uint16 + ClusterMaster net.IP + Unknown1 net.IP + Version byte + SubVersion byte + Status byte + Unknown2 byte + ClusterCommander net.HardwareAddr + SwitchMAC net.HardwareAddr + Unknown3 byte + ManagementVLAN uint16 +} + +// CDPEnergyWiseSubtype is used within CDP to define TLV values. +type CDPEnergyWiseSubtype uint32 + +// CDPEnergyWiseSubtype values. +const ( + CDPEnergyWiseRole CDPEnergyWiseSubtype = 0x00000007 + CDPEnergyWiseDomain CDPEnergyWiseSubtype = 0x00000008 + CDPEnergyWiseName CDPEnergyWiseSubtype = 0x00000009 + CDPEnergyWiseReplyTo CDPEnergyWiseSubtype = 0x00000017 +) + +// CDPEnergyWise is used by CDP to monitor and control power usage. +type CDPEnergyWise struct { + EncryptedData []byte + Unknown1 uint32 + SequenceNumber uint32 + ModelNumber string + Unknown2 uint16 + HardwareID string + SerialNum string + Unknown3 []byte + Role string + Domain string + Name string + ReplyUnknown1 []byte + ReplyPort []byte + ReplyAddress []byte + ReplyUnknown2 []byte + ReplyUnknown3 []byte +} + +// CiscoDiscoveryInfo represents the decoded details for a set of CiscoDiscoveryValues +type CiscoDiscoveryInfo struct { + BaseLayer + CDPHello + DeviceID string + Addresses []net.IP + PortID string + Capabilities CDPCapabilities + Version string + Platform string + IPPrefixes []net.IPNet + VTPDomain string + NativeVLAN uint16 + FullDuplex bool + VLANReply CDPVLANDialogue + VLANQuery CDPVLANDialogue + PowerConsumption uint16 + MTU uint32 + ExtendedTrust uint8 + UntrustedCOS uint8 + SysName string + SysOID string + MgmtAddresses []net.IP + Location CDPLocation + PowerRequest CDPPowerDialogue + PowerAvailable CDPPowerDialogue + SparePairPoe CDPSparePairPoE + EnergyWise CDPEnergyWise + Unknown []CiscoDiscoveryValue +} + +// LayerType returns gopacket.LayerTypeCiscoDiscovery. +func (c *CiscoDiscovery) LayerType() gopacket.LayerType { + return LayerTypeCiscoDiscovery +} + +func decodeCiscoDiscovery(data []byte, p gopacket.PacketBuilder) error { + c := &CiscoDiscovery{ + Version: data[0], + TTL: data[1], + Checksum: binary.BigEndian.Uint16(data[2:4]), + } + if c.Version != 1 && c.Version != 2 { + return fmt.Errorf("Invalid CiscoDiscovery version number %d", c.Version) + } + var err error + c.Values, err = decodeCiscoDiscoveryTLVs(data[4:]) + if err != nil { + return err + } + c.Contents = data[0:4] + c.Payload = data[4:] + p.AddLayer(c) + return p.NextDecoder(gopacket.DecodeFunc(decodeCiscoDiscoveryInfo)) +} + +// LayerType returns gopacket.LayerTypeCiscoDiscoveryInfo. +func (c *CiscoDiscoveryInfo) LayerType() gopacket.LayerType { + return LayerTypeCiscoDiscoveryInfo +} + +func decodeCiscoDiscoveryTLVs(data []byte) (values []CiscoDiscoveryValue, err error) { + for len(data) > 0 { + val := CiscoDiscoveryValue{ + Type: CDPTLVType(binary.BigEndian.Uint16(data[:2])), + Length: binary.BigEndian.Uint16(data[2:4]), + } + if val.Length < 4 { + err = fmt.Errorf("Invalid CiscoDiscovery value length %d", val.Length) + break + } + val.Value = data[4:val.Length] + values = append(values, val) + data = data[val.Length:] + } + return +} + +func decodeCiscoDiscoveryInfo(data []byte, p gopacket.PacketBuilder) error { + var err error + info := &CiscoDiscoveryInfo{BaseLayer: BaseLayer{Contents: data}} + p.AddLayer(info) + values, err := decodeCiscoDiscoveryTLVs(data) + if err != nil { // Unlikely, as parent decode will fail, but better safe... + return err + } + for _, val := range values { + switch val.Type { + case CDPTLVDevID: + info.DeviceID = string(val.Value) + case CDPTLVAddress: + if err = checkCDPTLVLen(val, 4); err != nil { + return err + } + info.Addresses, err = decodeAddresses(val.Value) + if err != nil { + return err + } + case CDPTLVPortID: + info.PortID = string(val.Value) + case CDPTLVCapabilities: + if err = checkCDPTLVLen(val, 4); err != nil { + return err + } + val := CDPCapability(binary.BigEndian.Uint32(val.Value[0:4])) + info.Capabilities.L3Router = (val&CDPCapMaskRouter > 0) + info.Capabilities.TBBridge = (val&CDPCapMaskTBBridge > 0) + info.Capabilities.SPBridge = (val&CDPCapMaskSPBridge > 0) + info.Capabilities.L2Switch = (val&CDPCapMaskSwitch > 0) + info.Capabilities.IsHost = (val&CDPCapMaskHost > 0) + info.Capabilities.IGMPFilter = (val&CDPCapMaskIGMPFilter > 0) + info.Capabilities.L1Repeater = (val&CDPCapMaskRepeater > 0) + info.Capabilities.IsPhone = (val&CDPCapMaskPhone > 0) + info.Capabilities.RemotelyManaged = (val&CDPCapMaskRemote > 0) + case CDPTLVVersion: + info.Version = string(val.Value) + case CDPTLVPlatform: + info.Platform = string(val.Value) + case CDPTLVIPPrefix: + v := val.Value + l := len(v) + if l%5 == 0 && l >= 5 { + for len(v) > 0 { + _, ipnet, _ := net.ParseCIDR(fmt.Sprintf("%d.%d.%d.%d/%d", v[0], v[1], v[2], v[3], v[4])) + info.IPPrefixes = append(info.IPPrefixes, *ipnet) + v = v[5:] + } + } else { + return fmt.Errorf("Invalid TLV %v length %d", val.Type, len(val.Value)) + } + case CDPTLVHello: + if err = checkCDPTLVLen(val, 32); err != nil { + return err + } + v := val.Value + info.CDPHello.OUI = v[0:3] + info.CDPHello.ProtocolID = binary.BigEndian.Uint16(v[3:5]) + info.CDPHello.ClusterMaster = v[5:9] + info.CDPHello.Unknown1 = v[9:13] + info.CDPHello.Version = v[13] + info.CDPHello.SubVersion = v[14] + info.CDPHello.Status = v[15] + info.CDPHello.Unknown2 = v[16] + info.CDPHello.ClusterCommander = v[17:23] + info.CDPHello.SwitchMAC = v[23:29] + info.CDPHello.Unknown3 = v[29] + info.CDPHello.ManagementVLAN = binary.BigEndian.Uint16(v[30:32]) + case CDPTLVVTPDomain: + info.VTPDomain = string(val.Value) + case CDPTLVNativeVLAN: + if err = checkCDPTLVLen(val, 2); err != nil { + return err + } + info.NativeVLAN = binary.BigEndian.Uint16(val.Value[0:2]) + case CDPTLVFullDuplex: + if err = checkCDPTLVLen(val, 1); err != nil { + return err + } + info.FullDuplex = (val.Value[0] == 1) + case CDPTLVVLANReply: + if err = checkCDPTLVLen(val, 3); err != nil { + return err + } + info.VLANReply.ID = uint8(val.Value[0]) + info.VLANReply.VLAN = binary.BigEndian.Uint16(val.Value[1:3]) + case CDPTLVVLANQuery: + if err = checkCDPTLVLen(val, 3); err != nil { + return err + } + info.VLANQuery.ID = uint8(val.Value[0]) + info.VLANQuery.VLAN = binary.BigEndian.Uint16(val.Value[1:3]) + case CDPTLVPower: + if err = checkCDPTLVLen(val, 2); err != nil { + return err + } + info.PowerConsumption = binary.BigEndian.Uint16(val.Value[0:2]) + case CDPTLVMTU: + if err = checkCDPTLVLen(val, 4); err != nil { + return err + } + info.MTU = binary.BigEndian.Uint32(val.Value[0:4]) + case CDPTLVExtendedTrust: + if err = checkCDPTLVLen(val, 1); err != nil { + return err + } + info.ExtendedTrust = uint8(val.Value[0]) + case CDPTLVUntrustedCOS: + if err = checkCDPTLVLen(val, 1); err != nil { + return err + } + info.UntrustedCOS = uint8(val.Value[0]) + case CDPTLVSysName: + info.SysName = string(val.Value) + case CDPTLVSysOID: + info.SysOID = string(val.Value) + case CDPTLVMgmtAddresses: + if err = checkCDPTLVLen(val, 4); err != nil { + return err + } + info.MgmtAddresses, err = decodeAddresses(val.Value) + if err != nil { + return err + } + case CDPTLVLocation: + if err = checkCDPTLVLen(val, 2); err != nil { + return err + } + info.Location.Type = uint8(val.Value[0]) + info.Location.Location = string(val.Value[1:]) + + // case CDPTLVLExternalPortID: + // Undocumented + case CDPTLVPowerRequested: + if err = checkCDPTLVLen(val, 4); err != nil { + return err + } + info.PowerRequest.ID = binary.BigEndian.Uint16(val.Value[0:2]) + info.PowerRequest.MgmtID = binary.BigEndian.Uint16(val.Value[2:4]) + for n := 4; n < len(val.Value); n += 4 { + info.PowerRequest.Values = append(info.PowerRequest.Values, binary.BigEndian.Uint32(val.Value[n:n+4])) + } + case CDPTLVPowerAvailable: + if err = checkCDPTLVLen(val, 4); err != nil { + return err + } + info.PowerAvailable.ID = binary.BigEndian.Uint16(val.Value[0:2]) + info.PowerAvailable.MgmtID = binary.BigEndian.Uint16(val.Value[2:4]) + for n := 4; n < len(val.Value); n += 4 { + info.PowerAvailable.Values = append(info.PowerAvailable.Values, binary.BigEndian.Uint32(val.Value[n:n+4])) + } + // case CDPTLVPortUnidirectional + // Undocumented + case CDPTLVEnergyWise: + if err = checkCDPTLVLen(val, 72); err != nil { + return err + } + info.EnergyWise.EncryptedData = val.Value[0:20] + info.EnergyWise.Unknown1 = binary.BigEndian.Uint32(val.Value[20:24]) + info.EnergyWise.SequenceNumber = binary.BigEndian.Uint32(val.Value[24:28]) + info.EnergyWise.ModelNumber = string(val.Value[28:44]) + info.EnergyWise.Unknown2 = binary.BigEndian.Uint16(val.Value[44:46]) + info.EnergyWise.HardwareID = string(val.Value[46:49]) + info.EnergyWise.SerialNum = string(val.Value[49:60]) + info.EnergyWise.Unknown3 = val.Value[60:68] + tlvLen := binary.BigEndian.Uint16(val.Value[68:70]) + tlvNum := binary.BigEndian.Uint16(val.Value[70:72]) + data := val.Value[72:] + if len(data) < int(tlvLen) { + return fmt.Errorf("Invalid TLV length %d vs %d", tlvLen, len(data)) + } + numSeen := 0 + for len(data) > 8 { + numSeen++ + if numSeen > int(tlvNum) { // Too many TLV's ? + return fmt.Errorf("Too many TLV's - wanted %d, saw %d", tlvNum, numSeen) + } + tType := CDPEnergyWiseSubtype(binary.BigEndian.Uint32(data[0:4])) + tLen := int(binary.BigEndian.Uint32(data[4:8])) + if tLen > len(data)-8 { + return fmt.Errorf("Invalid TLV length %d vs %d", tLen, len(data)-8) + } + data = data[8:] + switch tType { + case CDPEnergyWiseRole: + info.EnergyWise.Role = string(data[:]) + case CDPEnergyWiseDomain: + info.EnergyWise.Domain = string(data[:]) + case CDPEnergyWiseName: + info.EnergyWise.Name = string(data[:]) + case CDPEnergyWiseReplyTo: + if len(data) >= 18 { + info.EnergyWise.ReplyUnknown1 = data[0:2] + info.EnergyWise.ReplyPort = data[2:4] + info.EnergyWise.ReplyAddress = data[4:8] + info.EnergyWise.ReplyUnknown2 = data[8:10] + info.EnergyWise.ReplyUnknown3 = data[10:14] + } + } + data = data[tLen:] + } + case CDPTLVSparePairPOE: + if err = checkCDPTLVLen(val, 1); err != nil { + return err + } + v := val.Value[0] + info.SparePairPoe.PSEFourWire = (v&CDPPoEFourWire > 0) + info.SparePairPoe.PDArchShared = (v&CDPPoEPDArch > 0) + info.SparePairPoe.PDRequestOn = (v&CDPPoEPDRequest > 0) + info.SparePairPoe.PSEOn = (v&CDPPoEPSE > 0) + default: + info.Unknown = append(info.Unknown, val) + } + } + return nil +} + +// CDP Protocol Types +const ( + CDPProtocolTypeNLPID byte = 1 + CDPProtocolType802_2 byte = 2 +) + +// CDPAddressType is used to define TLV values within CDP addresses. +type CDPAddressType uint64 + +// CDP Address types. +const ( + CDPAddressTypeCLNP CDPAddressType = 0x81 + CDPAddressTypeIPV4 CDPAddressType = 0xcc + CDPAddressTypeIPV6 CDPAddressType = 0xaaaa030000000800 + CDPAddressTypeDECNET CDPAddressType = 0xaaaa030000006003 + CDPAddressTypeAPPLETALK CDPAddressType = 0xaaaa03000000809b + CDPAddressTypeIPX CDPAddressType = 0xaaaa030000008137 + CDPAddressTypeVINES CDPAddressType = 0xaaaa0300000080c4 + CDPAddressTypeXNS CDPAddressType = 0xaaaa030000000600 + CDPAddressTypeAPOLLO CDPAddressType = 0xaaaa030000008019 +) + +func decodeAddresses(v []byte) (addresses []net.IP, err error) { + numaddr := int(binary.BigEndian.Uint32(v[0:4])) + if numaddr < 1 { + return nil, fmt.Errorf("Invalid Address TLV number %d", numaddr) + } + v = v[4:] + if len(v) < numaddr*8 { + return nil, fmt.Errorf("Invalid Address TLV length %d", len(v)) + } + for i := 0; i < numaddr; i++ { + prottype := v[0] + if prottype != CDPProtocolTypeNLPID && prottype != CDPProtocolType802_2 { // invalid protocol type + return nil, fmt.Errorf("Invalid Address Protocol %d", prottype) + } + protlen := int(v[1]) + if (prottype == CDPProtocolTypeNLPID && protlen != 1) || + (prottype == CDPProtocolType802_2 && protlen != 3 && protlen != 8) { // invalid length + return nil, fmt.Errorf("Invalid Address Protocol length %d", protlen) + } + plen := make([]byte, 8) + copy(plen[8-protlen:], v[2:2+protlen]) + protocol := CDPAddressType(binary.BigEndian.Uint64(plen)) + v = v[2+protlen:] + addrlen := binary.BigEndian.Uint16(v[0:2]) + ab := v[2 : 2+addrlen] + if protocol == CDPAddressTypeIPV4 && addrlen == 4 { + addresses = append(addresses, net.IPv4(ab[0], ab[1], ab[2], ab[3])) + } else if protocol == CDPAddressTypeIPV6 && addrlen == 16 { + addresses = append(addresses, net.IP(ab)) + } else { + // only handle IPV4 & IPV6 for now + } + v = v[2+addrlen:] + if len(v) < 8 { + break + } + } + return +} + +func (t CDPTLVType) String() (s string) { + switch t { + case CDPTLVDevID: + s = "Device ID" + case CDPTLVAddress: + s = "Addresses" + case CDPTLVPortID: + s = "Port ID" + case CDPTLVCapabilities: + s = "Capabilities" + case CDPTLVVersion: + s = "Software Version" + case CDPTLVPlatform: + s = "Platform" + case CDPTLVIPPrefix: + s = "IP Prefix" + case CDPTLVHello: + s = "Protocol Hello" + case CDPTLVVTPDomain: + s = "VTP Management Domain" + case CDPTLVNativeVLAN: + s = "Native VLAN" + case CDPTLVFullDuplex: + s = "Full Duplex" + case CDPTLVVLANReply: + s = "VoIP VLAN Reply" + case CDPTLVVLANQuery: + s = "VLANQuery" + case CDPTLVPower: + s = "Power consumption" + case CDPTLVMTU: + s = "MTU" + case CDPTLVExtendedTrust: + s = "Extended Trust Bitmap" + case CDPTLVUntrustedCOS: + s = "Untrusted Port CoS" + case CDPTLVSysName: + s = "System Name" + case CDPTLVSysOID: + s = "System OID" + case CDPTLVMgmtAddresses: + s = "Management Addresses" + case CDPTLVLocation: + s = "Location" + case CDPTLVExternalPortID: + s = "External Port ID" + case CDPTLVPowerRequested: + s = "Power Requested" + case CDPTLVPowerAvailable: + s = "Power Available" + case CDPTLVPortUnidirectional: + s = "Port Unidirectional" + case CDPTLVEnergyWise: + s = "Energy Wise" + case CDPTLVSparePairPOE: + s = "Spare Pair POE" + default: + s = "Unknown" + } + return +} + +func (a CDPAddressType) String() (s string) { + switch a { + case CDPAddressTypeCLNP: + s = "Connectionless Network Protocol" + case CDPAddressTypeIPV4: + s = "IPv4" + case CDPAddressTypeIPV6: + s = "IPv6" + case CDPAddressTypeDECNET: + s = "DECnet Phase IV" + case CDPAddressTypeAPPLETALK: + s = "Apple Talk" + case CDPAddressTypeIPX: + s = "Novell IPX" + case CDPAddressTypeVINES: + s = "Banyan VINES" + case CDPAddressTypeXNS: + s = "Xerox Network Systems" + case CDPAddressTypeAPOLLO: + s = "Apollo" + default: + s = "Unknown" + } + return +} + +func (t CDPEnergyWiseSubtype) String() (s string) { + switch t { + case CDPEnergyWiseRole: + s = "Role" + case CDPEnergyWiseDomain: + s = "Domain" + case CDPEnergyWiseName: + s = "Name" + case CDPEnergyWiseReplyTo: + s = "ReplyTo" + default: + s = "Unknown" + } + return +} + +func checkCDPTLVLen(v CiscoDiscoveryValue, l int) (err error) { + if len(v.Value) < l { + err = fmt.Errorf("Invalid TLV %v length %d", v.Type, len(v.Value)) + } + return +} diff --git a/vendor/github.com/google/gopacket/layers/ctp.go b/vendor/github.com/google/gopacket/layers/ctp.go new file mode 100644 index 0000000..8287584 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/ctp.go @@ -0,0 +1,109 @@ +// 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 layers + +import ( + "encoding/binary" + "fmt" + "github.com/google/gopacket" +) + +// EthernetCTPFunction is the function code used by the EthernetCTP protocol to identify each +// EthernetCTP layer. +type EthernetCTPFunction uint16 + +// EthernetCTPFunction values. +const ( + EthernetCTPFunctionReply EthernetCTPFunction = 1 + EthernetCTPFunctionForwardData EthernetCTPFunction = 2 +) + +// EthernetCTP implements the EthernetCTP protocol, see http://www.mit.edu/people/jhawk/ctp.html. +// We split EthernetCTP up into the top-level EthernetCTP layer, followed by zero or more +// EthernetCTPForwardData layers, followed by a final EthernetCTPReply layer. +type EthernetCTP struct { + BaseLayer + SkipCount uint16 +} + +// LayerType returns gopacket.LayerTypeEthernetCTP. +func (c *EthernetCTP) LayerType() gopacket.LayerType { + return LayerTypeEthernetCTP +} + +// EthernetCTPForwardData is the ForwardData layer inside EthernetCTP. See EthernetCTP's docs for more +// details. +type EthernetCTPForwardData struct { + BaseLayer + Function EthernetCTPFunction + ForwardAddress []byte +} + +// LayerType returns gopacket.LayerTypeEthernetCTPForwardData. +func (c *EthernetCTPForwardData) LayerType() gopacket.LayerType { + return LayerTypeEthernetCTPForwardData +} + +// ForwardEndpoint returns the EthernetCTPForwardData ForwardAddress as an endpoint. +func (c *EthernetCTPForwardData) ForwardEndpoint() gopacket.Endpoint { + return gopacket.NewEndpoint(EndpointMAC, c.ForwardAddress) +} + +// EthernetCTPReply is the Reply layer inside EthernetCTP. See EthernetCTP's docs for more details. +type EthernetCTPReply struct { + BaseLayer + Function EthernetCTPFunction + ReceiptNumber uint16 + Data []byte +} + +// LayerType returns gopacket.LayerTypeEthernetCTPReply. +func (c *EthernetCTPReply) LayerType() gopacket.LayerType { + return LayerTypeEthernetCTPReply +} + +// Payload returns the EthernetCTP reply's Data bytes. +func (c *EthernetCTPReply) Payload() []byte { return c.Data } + +func decodeEthernetCTP(data []byte, p gopacket.PacketBuilder) error { + c := &EthernetCTP{ + SkipCount: binary.LittleEndian.Uint16(data[:2]), + BaseLayer: BaseLayer{data[:2], data[2:]}, + } + if c.SkipCount%2 != 0 { + return fmt.Errorf("EthernetCTP skip count is odd: %d", c.SkipCount) + } + p.AddLayer(c) + return p.NextDecoder(gopacket.DecodeFunc(decodeEthernetCTPFromFunctionType)) +} + +// decodeEthernetCTPFromFunctionType reads in the first 2 bytes to determine the EthernetCTP +// layer type to decode next, then decodes based on that. +func decodeEthernetCTPFromFunctionType(data []byte, p gopacket.PacketBuilder) error { + function := EthernetCTPFunction(binary.LittleEndian.Uint16(data[:2])) + switch function { + case EthernetCTPFunctionReply: + reply := &EthernetCTPReply{ + Function: function, + ReceiptNumber: binary.LittleEndian.Uint16(data[2:4]), + Data: data[4:], + BaseLayer: BaseLayer{data, nil}, + } + p.AddLayer(reply) + p.SetApplicationLayer(reply) + return nil + case EthernetCTPFunctionForwardData: + forward := &EthernetCTPForwardData{ + Function: function, + ForwardAddress: data[2:8], + BaseLayer: BaseLayer{data[:8], data[8:]}, + } + p.AddLayer(forward) + return p.NextDecoder(gopacket.DecodeFunc(decodeEthernetCTPFromFunctionType)) + } + return fmt.Errorf("Unknown EthernetCTP function type %v", function) +} diff --git a/vendor/github.com/google/gopacket/layers/decode_test.go b/vendor/github.com/google/gopacket/layers/decode_test.go new file mode 100644 index 0000000..ecfbff7 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/decode_test.go @@ -0,0 +1,1234 @@ +// Copyright 2012, Google, Inc. All rights reserved. +// Copyright 2009-2011 Andreas Krennmair. 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 layers + +import ( + "bytes" + "encoding/hex" + "fmt" + "net" + "reflect" + "strings" + "testing" + + "github.com/google/gopacket" + "github.com/google/gopacket/bytediff" +) + +var testSimpleTCPPacket = []byte{ + 0x00, 0x00, 0x0c, 0x9f, 0xf0, 0x20, 0xbc, 0x30, 0x5b, 0xe8, 0xd3, 0x49, + 0x08, 0x00, 0x45, 0x00, 0x01, 0xa4, 0x39, 0xdf, 0x40, 0x00, 0x40, 0x06, + 0x55, 0x5a, 0xac, 0x11, 0x51, 0x49, 0xad, 0xde, 0xfe, 0xe1, 0xc5, 0xf7, + 0x00, 0x50, 0xc5, 0x7e, 0x0e, 0x48, 0x49, 0x07, 0x42, 0x32, 0x80, 0x18, + 0x00, 0x73, 0x9a, 0x8f, 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0x03, 0x77, + 0x37, 0x9c, 0x42, 0x77, 0x5e, 0x3a, 0x47, 0x45, 0x54, 0x20, 0x2f, 0x20, + 0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x31, 0x0d, 0x0a, 0x48, 0x6f, + 0x73, 0x74, 0x3a, 0x20, 0x77, 0x77, 0x77, 0x2e, 0x66, 0x69, 0x73, 0x68, + 0x2e, 0x63, 0x6f, 0x6d, 0x0d, 0x0a, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x6b, 0x65, 0x65, 0x70, 0x2d, 0x61, + 0x6c, 0x69, 0x76, 0x65, 0x0d, 0x0a, 0x55, 0x73, 0x65, 0x72, 0x2d, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x3a, 0x20, 0x4d, 0x6f, 0x7a, 0x69, 0x6c, 0x6c, + 0x61, 0x2f, 0x35, 0x2e, 0x30, 0x20, 0x28, 0x58, 0x31, 0x31, 0x3b, 0x20, + 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x20, 0x78, 0x38, 0x36, 0x5f, 0x36, 0x34, + 0x29, 0x20, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x57, 0x65, 0x62, 0x4b, 0x69, + 0x74, 0x2f, 0x35, 0x33, 0x35, 0x2e, 0x32, 0x20, 0x28, 0x4b, 0x48, 0x54, + 0x4d, 0x4c, 0x2c, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x47, 0x65, 0x63, + 0x6b, 0x6f, 0x29, 0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x2f, 0x31, + 0x35, 0x2e, 0x30, 0x2e, 0x38, 0x37, 0x34, 0x2e, 0x31, 0x32, 0x31, 0x20, + 0x53, 0x61, 0x66, 0x61, 0x72, 0x69, 0x2f, 0x35, 0x33, 0x35, 0x2e, 0x32, + 0x0d, 0x0a, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x3a, 0x20, 0x74, 0x65, + 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x2c, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x78, 0x68, 0x74, 0x6d, + 0x6c, 0x2b, 0x78, 0x6d, 0x6c, 0x2c, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x78, 0x6d, 0x6c, 0x3b, 0x71, 0x3d, + 0x30, 0x2e, 0x39, 0x2c, 0x2a, 0x2f, 0x2a, 0x3b, 0x71, 0x3d, 0x30, 0x2e, + 0x38, 0x0d, 0x0a, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x67, 0x7a, 0x69, 0x70, + 0x2c, 0x64, 0x65, 0x66, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x73, 0x64, 0x63, + 0x68, 0x0d, 0x0a, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x4c, 0x61, + 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x65, 0x6e, 0x2d, 0x55, + 0x53, 0x2c, 0x65, 0x6e, 0x3b, 0x71, 0x3d, 0x30, 0x2e, 0x38, 0x0d, 0x0a, + 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x43, 0x68, 0x61, 0x72, 0x73, + 0x65, 0x74, 0x3a, 0x20, 0x49, 0x53, 0x4f, 0x2d, 0x38, 0x38, 0x35, 0x39, + 0x2d, 0x31, 0x2c, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x3b, 0x71, 0x3d, 0x30, + 0x2e, 0x37, 0x2c, 0x2a, 0x3b, 0x71, 0x3d, 0x30, 0x2e, 0x33, 0x0d, 0x0a, + 0x0d, 0x0a, +} + +var testDecodeOptions = gopacket.DecodeOptions{ + SkipDecodeRecovery: true, +} + +// Benchmarks for actual gopacket code + +func BenchmarkLayerClassSliceContains(b *testing.B) { + lc := gopacket.NewLayerClassSlice([]gopacket.LayerType{LayerTypeTCP, LayerTypeEthernet}) + for i := 0; i < b.N; i++ { + _ = lc.Contains(LayerTypeTCP) + } +} + +func BenchmarkLayerClassMapContains(b *testing.B) { + lc := gopacket.NewLayerClassMap([]gopacket.LayerType{LayerTypeTCP, LayerTypeEthernet}) + for i := 0; i < b.N; i++ { + _ = lc.Contains(LayerTypeTCP) + } +} + +func BenchmarkLazyNoCopyEthLayer(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testSimpleTCPPacket, LinkTypeEthernet, gopacket.DecodeOptions{Lazy: true, NoCopy: true}).Layer(LayerTypeEthernet) + } +} + +func BenchmarkLazyNoCopyIPLayer(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testSimpleTCPPacket, LinkTypeEthernet, gopacket.DecodeOptions{Lazy: true, NoCopy: true}).Layer(LayerTypeIPv4) + } +} + +func BenchmarkLazyNoCopyTCPLayer(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testSimpleTCPPacket, LinkTypeEthernet, gopacket.DecodeOptions{Lazy: true, NoCopy: true}).Layer(LayerTypeTCP) + } +} + +func BenchmarkLazyNoCopyAllLayers(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testSimpleTCPPacket, LinkTypeEthernet, gopacket.DecodeOptions{Lazy: true, NoCopy: true}).Layers() + } +} + +func BenchmarkDefault(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testSimpleTCPPacket, LinkTypeEthernet, gopacket.Default) + } +} + +func getSerializeLayers() []gopacket.SerializableLayer { + p := gopacket.NewPacket(testSimpleTCPPacket, LinkTypeEthernet, testDecodeOptions) + slayers := []gopacket.SerializableLayer{} + for _, l := range p.Layers() { + slayers = append(slayers, l.(gopacket.SerializableLayer)) + } + p.Layer(LayerTypeTCP).(*TCP).SetNetworkLayerForChecksum( + p.NetworkLayer()) + return slayers +} + +func BenchmarkSerializeTcpNoOptions(b *testing.B) { + slayers := getSerializeLayers() + buf := gopacket.NewSerializeBuffer() + opts := gopacket.SerializeOptions{} + for i := 0; i < b.N; i++ { + gopacket.SerializeLayers(buf, opts, slayers...) + } +} + +func BenchmarkSerializeTcpFixLengths(b *testing.B) { + slayers := getSerializeLayers() + buf := gopacket.NewSerializeBuffer() + opts := gopacket.SerializeOptions{FixLengths: true} + for i := 0; i < b.N; i++ { + gopacket.SerializeLayers(buf, opts, slayers...) + } +} + +func BenchmarkSerializeTcpComputeChecksums(b *testing.B) { + slayers := getSerializeLayers() + buf := gopacket.NewSerializeBuffer() + opts := gopacket.SerializeOptions{ComputeChecksums: true} + for i := 0; i < b.N; i++ { + gopacket.SerializeLayers(buf, opts, slayers...) + } +} + +func BenchmarkSerializeTcpFixLengthsComputeChecksums(b *testing.B) { + slayers := getSerializeLayers() + buf := gopacket.NewSerializeBuffer() + opts := gopacket.SerializeOptions{FixLengths: true, ComputeChecksums: true} + for i := 0; i < b.N; i++ { + gopacket.SerializeLayers(buf, opts, slayers...) + } +} + +func BenchmarkLazy(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testSimpleTCPPacket, LinkTypeEthernet, gopacket.Lazy) + } +} + +func BenchmarkNoCopy(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testSimpleTCPPacket, LinkTypeEthernet, gopacket.NoCopy) + } +} + +func BenchmarkLazyNoCopy(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testSimpleTCPPacket, LinkTypeEthernet, gopacket.DecodeOptions{Lazy: true, NoCopy: true}) + } +} + +func BenchmarkKnownStack(b *testing.B) { + stack := []gopacket.DecodingLayer{&Ethernet{}, &IPv4{}, &TCP{}, &gopacket.Payload{}} + nf := gopacket.NilDecodeFeedback + for i := 0; i < b.N; i++ { + data := testSimpleTCPPacket[:] + for _, d := range stack { + _ = d.DecodeFromBytes(data, nf) + data = d.LayerPayload() + } + } +} + +func BenchmarkDecodingLayerParserIgnorePanic(b *testing.B) { + decoded := make([]gopacket.LayerType, 0, 20) + dlp := gopacket.NewDecodingLayerParser(LayerTypeEthernet, &Ethernet{}, &IPv4{}, &TCP{}, &gopacket.Payload{}) + dlp.IgnorePanic = true + for i := 0; i < b.N; i++ { + dlp.DecodeLayers(testSimpleTCPPacket, &decoded) + } +} + +func BenchmarkDecodingLayerParserHandlePanic(b *testing.B) { + decoded := make([]gopacket.LayerType, 0, 20) + dlp := gopacket.NewDecodingLayerParser(LayerTypeEthernet, &Ethernet{}, &IPv4{}, &TCP{}, &gopacket.Payload{}) + dlp.IgnorePanic = false + for i := 0; i < b.N; i++ { + dlp.DecodeLayers(testSimpleTCPPacket, &decoded) + } +} + +func BenchmarkAlloc(b *testing.B) { + for i := 0; i < b.N; i++ { + _ = &TCP{} + } +} + +func BenchmarkFlow(b *testing.B) { + p := gopacket.NewPacket(testSimpleTCPPacket, LinkTypeEthernet, gopacket.DecodeOptions{Lazy: true, NoCopy: true}) + net := p.NetworkLayer() + for i := 0; i < b.N; i++ { + net.NetworkFlow() + } +} + +func BenchmarkEndpoints(b *testing.B) { + p := gopacket.NewPacket(testSimpleTCPPacket, LinkTypeEthernet, gopacket.DecodeOptions{Lazy: true, NoCopy: true}) + flow := p.NetworkLayer().NetworkFlow() + for i := 0; i < b.N; i++ { + flow.Endpoints() + } +} + +func BenchmarkTCPLayerFromDecodedPacket(b *testing.B) { + b.StopTimer() + p := gopacket.NewPacket(testSimpleTCPPacket, LinkTypeEthernet, testDecodeOptions) + b.StartTimer() + for i := 0; i < b.N; i++ { + _ = p.Layer(LayerTypeTCP) + } +} + +func BenchmarkTCPLayerClassFromDecodedPacket(b *testing.B) { + b.StopTimer() + p := gopacket.NewPacket(testSimpleTCPPacket, LinkTypeEthernet, testDecodeOptions) + lc := gopacket.NewLayerClass([]gopacket.LayerType{LayerTypeTCP}) + b.StartTimer() + for i := 0; i < b.N; i++ { + _ = p.LayerClass(lc) + } +} + +func BenchmarkTCPTransportLayerFromDecodedPacket(b *testing.B) { + b.StopTimer() + p := gopacket.NewPacket(testSimpleTCPPacket, LinkTypeEthernet, testDecodeOptions) + b.StartTimer() + for i := 0; i < b.N; i++ { + _ = p.TransportLayer() + } +} + +func testDecoder([]byte, gopacket.PacketBuilder) error { + return nil +} + +func BenchmarkDecodeFuncCallOverheadDirectCall(b *testing.B) { + var data []byte + var pb gopacket.PacketBuilder + for i := 0; i < b.N; i++ { + _ = testDecoder(data, pb) + } +} + +func BenchmarkDecodeFuncCallOverheadDecoderCall(b *testing.B) { + d := gopacket.DecodeFunc(testDecoder) + var data []byte + var pb gopacket.PacketBuilder + for i := 0; i < b.N; i++ { + _ = d.Decode(data, pb) + } +} + +func BenchmarkDecodeFuncCallOverheadArrayCall(b *testing.B) { + EthernetTypeMetadata[1] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(testDecoder)} + d := EthernetType(1) + var data []byte + var pb gopacket.PacketBuilder + for i := 0; i < b.N; i++ { + _ = d.Decode(data, pb) + } +} + +func BenchmarkFmtVerboseString(b *testing.B) { + b.StopTimer() + p := gopacket.NewPacket(testSimpleTCPPacket, LinkTypeEthernet, testDecodeOptions) + b.StartTimer() + for i := 0; i < b.N; i++ { + _ = fmt.Sprintf("%#v", p) + } +} + +func BenchmarkPacketString(b *testing.B) { + b.StopTimer() + p := gopacket.NewPacket(testSimpleTCPPacket, LinkTypeEthernet, testDecodeOptions) + b.StartTimer() + for i := 0; i < b.N; i++ { + _ = p.String() + } +} + +func BenchmarkPacketDumpString(b *testing.B) { + b.StopTimer() + p := gopacket.NewPacket(testSimpleTCPPacket, LinkTypeEthernet, testDecodeOptions) + b.StartTimer() + for i := 0; i < b.N; i++ { + _ = p.String() + } +} + +// TestFlowMapKey makes sure a flow and an endpoint can be used as map keys. +func TestFlowMapKey(t *testing.T) { + _ = map[gopacket.Flow]bool{} + _ = map[gopacket.Endpoint]bool{} + _ = map[[2]gopacket.Flow]bool{} +} + +func TestDecodeSimpleTCPPacket(t *testing.T) { + equal := func(desc, want string, got fmt.Stringer) { + if want != got.String() { + t.Errorf("%s: got %q want %q", desc, got.String(), want) + } + } + p := gopacket.NewPacket(testSimpleTCPPacket, LinkTypeEthernet, gopacket.DecodeOptions{Lazy: true, NoCopy: true}) + if eth := p.LinkLayer(); eth == nil { + t.Error("No ethernet layer found") + } else { + equal("Eth Src", "bc:30:5b:e8:d3:49", eth.LinkFlow().Src()) + equal("Eth Dst", "00:00:0c:9f:f0:20", eth.LinkFlow().Dst()) + } + if net := p.NetworkLayer(); net == nil { + t.Error("No net layer found") + } else if ip, ok := net.(*IPv4); !ok { + t.Error("Net layer is not IP layer") + } else { + equal("IP Src", "172.17.81.73", net.NetworkFlow().Src()) + equal("IP Dst", "173.222.254.225", net.NetworkFlow().Dst()) + want := &IPv4{ + BaseLayer: BaseLayer{testSimpleTCPPacket[14:34], testSimpleTCPPacket[34:]}, + Version: 4, + IHL: 5, + TOS: 0, + Length: 420, + Id: 14815, + Flags: 0x02, + FragOffset: 0, + TTL: 64, + Protocol: 6, + Checksum: 0x555A, + SrcIP: []byte{172, 17, 81, 73}, + DstIP: []byte{173, 222, 254, 225}, + } + if !reflect.DeepEqual(ip, want) { + t.Errorf("IP layer mismatch, \ngot %#v\nwant %#v\n", ip, want) + } + } + if trans := p.TransportLayer(); trans == nil { + t.Error("No transport layer found") + } else if tcp, ok := trans.(*TCP); !ok { + t.Error("Transport layer is not TCP layer") + } else { + equal("TCP Src", "50679", trans.TransportFlow().Src()) + equal("TCP Dst", "80", trans.TransportFlow().Dst()) + want := &TCP{ + BaseLayer: BaseLayer{testSimpleTCPPacket[34:66], testSimpleTCPPacket[66:]}, + SrcPort: 50679, + DstPort: 80, + Seq: 0xc57e0e48, + Ack: 0x49074232, + DataOffset: 8, + ACK: true, + PSH: true, + Window: 0x73, + Checksum: 0x9a8f, + Urgent: 0, + sPort: []byte{0xc5, 0xf7}, + dPort: []byte{0x0, 0x50}, + Options: []TCPOption{ + TCPOption{ + OptionType: 0x1, + OptionLength: 0x1, + }, + TCPOption{ + OptionType: 0x1, + OptionLength: 0x1, + }, + TCPOption{ + OptionType: 0x8, + OptionLength: 0xa, + OptionData: []byte{0x3, 0x77, 0x37, 0x9c, 0x42, 0x77, 0x5e, 0x3a}, + }, + }, + opts: [4]TCPOption{ + TCPOption{ + OptionType: 0x1, + OptionLength: 0x1, + }, + TCPOption{ + OptionType: 0x1, + OptionLength: 0x1, + }, + TCPOption{ + OptionType: 0x8, + OptionLength: 0xa, + OptionData: []byte{0x3, 0x77, 0x37, 0x9c, 0x42, 0x77, 0x5e, 0x3a}, + }, + TCPOption{}, + }, + } + if !reflect.DeepEqual(tcp, want) { + t.Errorf("TCP layer mismatch\ngot %#v\nwant %#v", tcp, want) + } + } + if payload, ok := p.Layer(gopacket.LayerTypePayload).(*gopacket.Payload); payload == nil || !ok { + t.Error("No payload layer found") + } else { + if string(payload.Payload()) != "GET / HTTP/1.1\r\nHost: www.fish.com\r\nConnection: keep-alive\r\nUser-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Encoding: gzip,deflate,sdch\r\nAccept-Language: en-US,en;q=0.8\r\nAccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3\r\n\r\n" { + t.Error("--- Payload STRING ---\n", string(payload.Payload()), "\n--- Payload BYTES ---\n", payload.Payload()) + } + } + + // Test re-serialization. + testSerialization(t, p, testSimpleTCPPacket) +} + +type canSetNetLayer interface { + SetNetworkLayerForChecksum(gopacket.NetworkLayer) error +} + +func testSerialization(t *testing.T, p gopacket.Packet, data []byte) { + for _, opts := range []gopacket.SerializeOptions{ + gopacket.SerializeOptions{}, + gopacket.SerializeOptions{FixLengths: true}, + gopacket.SerializeOptions{ComputeChecksums: true}, + gopacket.SerializeOptions{FixLengths: true, ComputeChecksums: true}, + } { + testSerializationWithOpts(t, p, data, opts) + } +} + +func testSerializationWithOpts(t *testing.T, p gopacket.Packet, data []byte, opts gopacket.SerializeOptions) { + // Test re-serialization. + slayers := []gopacket.SerializableLayer{} + for _, l := range p.Layers() { + slayers = append(slayers, l.(gopacket.SerializableLayer)) + if h, ok := l.(canSetNetLayer); ok { + if err := h.SetNetworkLayerForChecksum(p.NetworkLayer()); err != nil { + t.Fatal("can't set network layer:", err) + } + } + } + buf := gopacket.NewSerializeBuffer() + err := gopacket.SerializeLayers(buf, opts, slayers...) + if err != nil { + t.Errorf("unable to reserialize layers with opts %#v: %v", opts, err) + } else if !bytes.Equal(buf.Bytes(), data) { + t.Errorf("serialization failure with opts %#v:\n---want---\n%v\n---got---\n%v\nBASH-colorized diff, want->got:\n%v\n\n---PACKET---\n%v", + opts, hex.Dump(data), hex.Dump(buf.Bytes()), bytediff.BashOutput.String(bytediff.Diff(data, buf.Bytes())), p) + } +} + +// Makes sure packet payload doesn't display the 6 trailing null of this packet +// as part of the payload. They're actually the ethernet trailer. +func TestDecodeSmallTCPPacketHasEmptyPayload(t *testing.T) { + smallPacket := []byte{ + 0xbc, 0x30, 0x5b, 0xe8, 0xd3, 0x49, 0xb8, 0xac, 0x6f, 0x92, 0xd5, 0xbf, + 0x08, 0x00, 0x45, 0x00, 0x00, 0x28, 0x00, 0x00, 0x40, 0x00, 0x40, 0x06, + 0x3f, 0x9f, 0xac, 0x11, 0x51, 0xc5, 0xac, 0x11, 0x51, 0x49, 0x00, 0x63, + 0x9a, 0xef, 0x00, 0x00, 0x00, 0x00, 0x2e, 0xc1, 0x27, 0x83, 0x50, 0x14, + 0x00, 0x00, 0xc3, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + } + p := gopacket.NewPacket(smallPacket, LinkTypeEthernet, testDecodeOptions) + + if payload := p.Layer(gopacket.LayerTypePayload); payload != nil { + t.Error("Payload found for empty TCP packet") + } + + testSerialization(t, p, smallPacket) +} + +func TestDecodeVLANPacket(t *testing.T) { + p := gopacket.NewPacket( + []byte{ + 0x00, 0x10, 0xdb, 0xff, 0x10, 0x00, 0x00, 0x15, 0x2c, 0x9d, 0xcc, 0x00, + 0x81, 0x00, 0x01, 0xf7, 0x08, 0x00, 0x45, 0x00, 0x00, 0x28, 0x29, 0x8d, + 0x40, 0x00, 0x7d, 0x06, 0x83, 0xa0, 0xac, 0x1b, 0xca, 0x8e, 0x45, 0x16, + 0x94, 0xe2, 0xd4, 0x0a, 0x00, 0x50, 0xdf, 0xab, 0x9c, 0xc6, 0xcd, 0x1e, + 0xe5, 0xd1, 0x50, 0x10, 0x01, 0x00, 0x5a, 0x74, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + }, LinkTypeEthernet, testDecodeOptions) + if err := p.ErrorLayer(); err != nil { + t.Error("Error while parsing vlan packet:", err) + } + if vlan := p.Layer(LayerTypeDot1Q); vlan == nil { + t.Error("Didn't detect vlan") + } else if _, ok := vlan.(*Dot1Q); !ok { + t.Error("LayerTypeDot1Q layer is not a Dot1Q object") + } + for i, l := range p.Layers() { + t.Logf("Layer %d: %#v", i, l) + } + want := []gopacket.LayerType{LayerTypeEthernet, LayerTypeDot1Q, LayerTypeIPv4, LayerTypeTCP} + checkLayers(p, want, t) +} + +func TestDecodeSCTPPackets(t *testing.T) { + sctpPackets := [][]byte{ + []byte{ // INIT + 0x00, 0x00, 0x0c, 0x9f, 0xf0, 0x1f, 0x24, 0xbe, 0x05, 0x27, 0x0b, 0x17, 0x08, 0x00, 0x45, 0x02, + 0x00, 0x44, 0x00, 0x00, 0x40, 0x00, 0x40, 0x84, 0xc4, 0x22, 0xac, 0x1d, 0x14, 0x0f, 0xac, 0x19, + 0x09, 0xcc, 0x27, 0x0f, 0x22, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x19, 0x6b, 0x0b, 0x40, 0x01, 0x00, + 0x00, 0x24, 0xb6, 0x96, 0xb0, 0x9e, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xdb, 0x85, + 0x60, 0x23, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x05, 0x00, 0x00, 0x80, 0x00, 0x00, 0x04, 0xc0, 0x00, + 0x00, 0x04, + }, []byte{ // INIT ACK + 0x24, 0xbe, 0x05, 0x27, 0x0b, 0x17, 0x00, 0x1f, 0xca, 0xb3, 0x76, 0x40, 0x08, 0x00, 0x45, 0x20, + 0x01, 0x24, 0x00, 0x00, 0x40, 0x00, 0x36, 0x84, 0xcd, 0x24, 0xac, 0x19, 0x09, 0xcc, 0xac, 0x1d, + 0x14, 0x0f, 0x22, 0xb8, 0x27, 0x0f, 0xb6, 0x96, 0xb0, 0x9e, 0x4b, 0xab, 0x40, 0x9a, 0x02, 0x00, + 0x01, 0x04, 0x32, 0x80, 0xfb, 0x42, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x0a, 0x00, 0x0a, 0x85, 0x98, + 0xb1, 0x26, 0x00, 0x07, 0x00, 0xe8, 0xd3, 0x08, 0xce, 0xe2, 0x52, 0x95, 0xcc, 0x09, 0xa1, 0x4c, + 0x6f, 0xa7, 0x9e, 0xba, 0x03, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xfb, 0x80, 0x32, 0x9e, 0xb0, + 0x96, 0xb6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x46, 0xc2, 0x50, 0x00, 0x00, + 0x00, 0x00, 0x5e, 0x25, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x26, 0xb1, + 0x98, 0x85, 0x02, 0x00, 0x27, 0x0f, 0xac, 0x1d, 0x14, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x22, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x24, 0x6a, 0x72, 0x5c, 0x1c, 0x3c, 0xaa, + 0x7a, 0xcd, 0xd3, 0x8f, 0x52, 0x78, 0x7c, 0x77, 0xfd, 0x46, 0xbd, 0x72, 0x82, 0xc1, 0x1f, 0x70, + 0x44, 0xcc, 0xc7, 0x9b, 0x9b, 0x7b, 0x13, 0x54, 0x3f, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x24, 0xb6, 0x96, + 0xb0, 0x9e, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xdb, 0x85, 0x60, 0x23, 0x00, 0x0c, + 0x00, 0x06, 0x00, 0x05, 0x00, 0x00, 0x80, 0x00, 0x00, 0x04, 0xc0, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x04, 0xc0, 0x00, + 0x00, 0x04, + }, []byte{ // COOKIE ECHO, DATA + 0x00, 0x00, 0x0c, 0x9f, 0xf0, 0x1f, 0x24, 0xbe, 0x05, 0x27, 0x0b, 0x17, 0x08, 0x00, 0x45, 0x02, + 0x01, 0x20, 0x00, 0x00, 0x40, 0x00, 0x40, 0x84, 0xc3, 0x46, 0xac, 0x1d, 0x14, 0x0f, 0xac, 0x19, + 0x09, 0xcc, 0x27, 0x0f, 0x22, 0xb8, 0x32, 0x80, 0xfb, 0x42, 0x01, 0xf9, 0xf3, 0xa9, 0x0a, 0x00, + 0x00, 0xe8, 0xd3, 0x08, 0xce, 0xe2, 0x52, 0x95, 0xcc, 0x09, 0xa1, 0x4c, 0x6f, 0xa7, 0x9e, 0xba, + 0x03, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xfb, 0x80, 0x32, 0x9e, 0xb0, 0x96, 0xb6, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x46, 0xc2, 0x50, 0x00, 0x00, 0x00, 0x00, 0x5e, 0x25, + 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x26, 0xb1, 0x98, 0x85, 0x02, 0x00, + 0x27, 0x0f, 0xac, 0x1d, 0x14, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x22, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x02, 0x00, 0x24, 0x6a, 0x72, 0x5c, 0x1c, 0x3c, 0xaa, 0x7a, 0xcd, 0xd3, 0x8f, + 0x52, 0x78, 0x7c, 0x77, 0xfd, 0x46, 0xbd, 0x72, 0x82, 0xc1, 0x1f, 0x70, 0x44, 0xcc, 0xc7, 0x9b, + 0x9b, 0x7b, 0x13, 0x54, 0x3f, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x24, 0xb6, 0x96, 0xb0, 0x9e, 0x00, 0x01, + 0xc0, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xdb, 0x85, 0x60, 0x23, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x05, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x04, 0xc0, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x16, 0xdb, 0x85, 0x60, 0x23, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x6f, 0x6f, 0x21, 0x0a, 0x00, 0x00, 0x00, + }, []byte{ // COOKIE ACK, SACK + 0x24, 0xbe, 0x05, 0x27, 0x0b, 0x17, 0x00, 0x1f, 0xca, 0xb3, 0x76, 0x40, 0x08, 0x00, 0x45, 0x20, + 0x00, 0x34, 0x00, 0x00, 0x40, 0x00, 0x36, 0x84, 0xce, 0x14, 0xac, 0x19, 0x09, 0xcc, 0xac, 0x1d, + 0x14, 0x0f, 0x22, 0xb8, 0x27, 0x0f, 0xb6, 0x96, 0xb0, 0x9e, 0xed, 0x64, 0x30, 0x98, 0x0b, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x00, 0x10, 0xdb, 0x85, 0x60, 0x23, 0x00, 0x00, 0xf3, 0xfa, 0x00, 0x00, + 0x00, 0x00, + }, []byte{ // DATA + 0x00, 0x00, 0x0c, 0x9f, 0xf0, 0x1f, 0x24, 0xbe, 0x05, 0x27, 0x0b, 0x17, 0x08, 0x00, 0x45, 0x02, + 0x00, 0x3c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x84, 0xc4, 0x2a, 0xac, 0x1d, 0x14, 0x0f, 0xac, 0x19, + 0x09, 0xcc, 0x27, 0x0f, 0x22, 0xb8, 0x32, 0x80, 0xfb, 0x42, 0xa1, 0xe3, 0xb2, 0x31, 0x00, 0x03, + 0x00, 0x19, 0xdb, 0x85, 0x60, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x62, 0x69, + 0x7a, 0x7a, 0x6c, 0x65, 0x21, 0x0a, 0x00, 0x00, 0x00, 0x00, + }, []byte{ // SACK + 0x24, 0xbe, 0x05, 0x27, 0x0b, 0x17, 0x00, 0x1f, 0xca, 0xb3, 0x76, 0x40, 0x08, 0x00, 0x45, 0x20, + 0x00, 0x30, 0x00, 0x00, 0x40, 0x00, 0x36, 0x84, 0xce, 0x18, 0xac, 0x19, 0x09, 0xcc, 0xac, 0x1d, + 0x14, 0x0f, 0x22, 0xb8, 0x27, 0x0f, 0xb6, 0x96, 0xb0, 0x9e, 0xfa, 0x49, 0x94, 0x3a, 0x03, 0x00, + 0x00, 0x10, 0xdb, 0x85, 0x60, 0x24, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, + }, []byte{ // SHUTDOWN + 0x00, 0x00, 0x0c, 0x9f, 0xf0, 0x1f, 0x24, 0xbe, 0x05, 0x27, 0x0b, 0x17, 0x08, 0x00, 0x45, 0x02, + 0x00, 0x28, 0x00, 0x00, 0x40, 0x00, 0x40, 0x84, 0xc4, 0x3e, 0xac, 0x1d, 0x14, 0x0f, 0xac, 0x19, + 0x09, 0xcc, 0x27, 0x0f, 0x22, 0xb8, 0x32, 0x80, 0xfb, 0x42, 0x3f, 0x29, 0x59, 0x23, 0x07, 0x00, + 0x00, 0x08, 0x85, 0x98, 0xb1, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, []byte{ // SHUTDOWN ACK + 0x24, 0xbe, 0x05, 0x27, 0x0b, 0x17, 0x00, 0x1f, 0xca, 0xb3, 0x76, 0x40, 0x08, 0x00, 0x45, 0x20, + 0x00, 0x24, 0x00, 0x00, 0x40, 0x00, 0x36, 0x84, 0xce, 0x24, 0xac, 0x19, 0x09, 0xcc, 0xac, 0x1d, + 0x14, 0x0f, 0x22, 0xb8, 0x27, 0x0f, 0xb6, 0x96, 0xb0, 0x9e, 0xb2, 0xc8, 0x99, 0x24, 0x08, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, []byte{ // SHUTDOWN COMPLETE + 0x00, 0x00, 0x0c, 0x9f, 0xf0, 0x1f, 0x24, 0xbe, 0x05, 0x27, 0x0b, 0x17, 0x08, 0x00, 0x45, 0x02, + 0x00, 0x24, 0x00, 0x00, 0x40, 0x00, 0x40, 0x84, 0xc4, 0x42, 0xac, 0x1d, 0x14, 0x0f, 0xac, 0x19, + 0x09, 0xcc, 0x27, 0x0f, 0x22, 0xb8, 0x32, 0x80, 0xfb, 0x42, 0xa8, 0xd1, 0x86, 0x85, 0x0e, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }} + wantLayers := [][]gopacket.LayerType{ + []gopacket.LayerType{LayerTypeSCTPInit}, + []gopacket.LayerType{LayerTypeSCTPInitAck}, + []gopacket.LayerType{LayerTypeSCTPCookieEcho, LayerTypeSCTPData, gopacket.LayerTypePayload}, + []gopacket.LayerType{LayerTypeSCTPCookieAck, LayerTypeSCTPSack}, + []gopacket.LayerType{LayerTypeSCTPData, gopacket.LayerTypePayload}, + []gopacket.LayerType{LayerTypeSCTPSack}, + []gopacket.LayerType{LayerTypeSCTPShutdown}, + []gopacket.LayerType{LayerTypeSCTPShutdownAck}, + []gopacket.LayerType{LayerTypeSCTPShutdownComplete}, + } + for i, data := range sctpPackets { + p := gopacket.NewPacket(data, LinkTypeEthernet, testDecodeOptions) + for _, typ := range wantLayers[i] { + if p.Layer(typ) == nil { + t.Errorf("Packet %d missing layer type %v, got:", i, typ) + for _, layer := range p.Layers() { + t.Errorf("\t%v", layer.LayerType()) + } + if p.ErrorLayer() != nil { + t.Error("\tPacket layer error:", p.ErrorLayer().Error()) + } + } + } + // Test re-serialization. + testSerializationWithOpts(t, p, data, gopacket.SerializeOptions{FixLengths: true, ComputeChecksums: true}) + } +} + +func TestDecodeCiscoDiscovery(t *testing.T) { + // http://wiki.wireshark.org/SampleCaptures?action=AttachFile&do=get&target=cdp_v2.pcap + data := []byte{ + 0x01, 0x00, 0x0c, 0xcc, 0xcc, 0xcc, 0x00, 0x0b, 0xbe, 0x18, 0x9a, 0x41, 0x01, 0xc3, 0xaa, 0xaa, + 0x03, 0x00, 0x00, 0x0c, 0x20, 0x00, 0x02, 0xb4, 0x09, 0xa0, 0x00, 0x01, 0x00, 0x0c, 0x6d, 0x79, + 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x00, 0x02, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, + 0xcc, 0x00, 0x04, 0xc0, 0xa8, 0x00, 0xfd, 0x00, 0x03, 0x00, 0x13, 0x46, 0x61, 0x73, 0x74, 0x45, + 0x74, 0x68, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x30, 0x2f, 0x31, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x28, 0x00, 0x05, 0x01, 0x14, 0x43, 0x69, 0x73, 0x63, 0x6f, 0x20, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6e, 0x67, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, + 0x72, 0x65, 0x20, 0x0a, 0x49, 0x4f, 0x53, 0x20, 0x28, 0x74, 0x6d, 0x29, 0x20, 0x43, 0x32, 0x39, + 0x35, 0x30, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x28, 0x43, 0x32, 0x39, + 0x35, 0x30, 0x2d, 0x49, 0x36, 0x4b, 0x32, 0x4c, 0x32, 0x51, 0x34, 0x2d, 0x4d, 0x29, 0x2c, 0x20, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x31, 0x32, 0x2e, 0x31, 0x28, 0x32, 0x32, 0x29, + 0x45, 0x41, 0x31, 0x34, 0x2c, 0x20, 0x52, 0x45, 0x4c, 0x45, 0x41, 0x53, 0x45, 0x20, 0x53, 0x4f, + 0x46, 0x54, 0x57, 0x41, 0x52, 0x45, 0x20, 0x28, 0x66, 0x63, 0x31, 0x29, 0x0a, 0x54, 0x65, 0x63, + 0x68, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x3a, 0x20, + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x63, 0x69, 0x73, 0x63, 0x6f, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x65, 0x63, 0x68, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, + 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x31, + 0x39, 0x38, 0x36, 0x2d, 0x32, 0x30, 0x31, 0x30, 0x20, 0x62, 0x79, 0x20, 0x63, 0x69, 0x73, 0x63, + 0x6f, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x0a, + 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x54, 0x75, 0x65, 0x20, 0x32, 0x36, 0x2d, + 0x4f, 0x63, 0x74, 0x2d, 0x31, 0x30, 0x20, 0x31, 0x30, 0x3a, 0x33, 0x35, 0x20, 0x62, 0x79, 0x20, + 0x6e, 0x62, 0x75, 0x72, 0x72, 0x61, 0x00, 0x06, 0x00, 0x15, 0x63, 0x69, 0x73, 0x63, 0x6f, 0x20, + 0x57, 0x53, 0x2d, 0x43, 0x32, 0x39, 0x35, 0x30, 0x2d, 0x31, 0x32, 0x00, 0x08, 0x00, 0x24, 0x00, + 0x00, 0x0c, 0x01, 0x12, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x02, 0x20, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xbe, 0x18, 0x9a, 0x40, 0xff, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x0c, 0x4d, 0x59, 0x44, 0x4f, 0x4d, 0x41, 0x49, 0x4e, 0x00, 0x0a, 0x00, 0x06, 0x00, + 0x01, 0x00, 0x0b, 0x00, 0x05, 0x01, 0x00, 0x12, 0x00, 0x05, 0x00, 0x00, 0x13, 0x00, 0x05, 0x00, + 0x00, 0x16, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0xcc, 0x00, 0x04, 0xc0, 0xa8, 0x00, + 0xfd, + } + p := gopacket.NewPacket(data, LinkTypeEthernet, testDecodeOptions) + wantLayers := []gopacket.LayerType{LayerTypeEthernet, LayerTypeLLC, LayerTypeSNAP, LayerTypeCiscoDiscovery, LayerTypeCiscoDiscoveryInfo} + checkLayers(p, wantLayers, t) + + want := &CiscoDiscoveryInfo{ + CDPHello: CDPHello{ + OUI: []byte{0, 0, 12}, + ProtocolID: 274, + ClusterMaster: []byte{0, 0, 0, 0}, + Unknown1: []byte{255, 255, 255, 255}, + Version: 1, + SubVersion: 2, + Status: 32, + Unknown2: 255, + ClusterCommander: net.HardwareAddr{0, 0, 0, 0, 0, 0}, + SwitchMAC: net.HardwareAddr{0, 0x0b, 0xbe, 0x18, 0x9a, 0x40}, + Unknown3: 255, + ManagementVLAN: 0, + }, + DeviceID: "myswitch", + Addresses: []net.IP{net.IPv4(192, 168, 0, 253)}, + PortID: "FastEthernet0/1", + Capabilities: CDPCapabilities{false, false, false, true, false, true, false, false, false}, + Version: "Cisco Internetwork Operating System Software \nIOS (tm) C2950 Software (C2950-I6K2L2Q4-M), Version 12.1(22)EA14, RELEASE SOFTWARE (fc1)\nTechnical Support: http://www.cisco.com/techsupport\nCopyright (c) 1986-2010 by cisco Systems, Inc.\nCompiled Tue 26-Oct-10 10:35 by nburra", + Platform: "cisco WS-C2950-12", + VTPDomain: "MYDOMAIN", + NativeVLAN: 1, + FullDuplex: true, + MgmtAddresses: []net.IP{net.IPv4(192, 168, 0, 253)}, + BaseLayer: BaseLayer{Contents: data[26:]}, + } + cdpL := p.Layer(LayerTypeCiscoDiscoveryInfo) + info, _ := cdpL.(*CiscoDiscoveryInfo) + if !reflect.DeepEqual(info, want) { + t.Errorf("Values mismatch, \ngot %#v\nwant %#v\n", info, want) + } +} + +func TestDecodeLinkLayerDiscovery(t *testing.T) { + // http://wiki.wireshark.org/SampleCaptures?action=AttachFile&do=get&target=lldp.detailed.pcap + data := []byte{ + 0x01, 0x80, 0xc2, 0x00, 0x00, 0x0e, 0x00, 0x01, 0x30, 0xf9, 0xad, 0xa0, + 0x88, 0xcc, 0x02, 0x07, 0x04, 0x00, 0x01, 0x30, 0xf9, 0xad, 0xa0, 0x04, + 0x04, 0x05, 0x31, 0x2f, 0x31, 0x06, 0x02, 0x00, 0x78, 0x08, 0x17, 0x53, + 0x75, 0x6d, 0x6d, 0x69, 0x74, 0x33, 0x30, 0x30, 0x2d, 0x34, 0x38, 0x2d, + 0x50, 0x6f, 0x72, 0x74, 0x20, 0x31, 0x30, 0x30, 0x31, 0x00, 0x0a, 0x0d, + 0x53, 0x75, 0x6d, 0x6d, 0x69, 0x74, 0x33, 0x30, 0x30, 0x2d, 0x34, 0x38, + 0x00, 0x0c, 0x4c, 0x53, 0x75, 0x6d, 0x6d, 0x69, 0x74, 0x33, 0x30, 0x30, + 0x2d, 0x34, 0x38, 0x20, 0x2d, 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x20, 0x37, 0x2e, 0x34, 0x65, 0x2e, 0x31, 0x20, 0x28, 0x42, 0x75, + 0x69, 0x6c, 0x64, 0x20, 0x35, 0x29, 0x20, 0x62, 0x79, 0x20, 0x52, 0x65, + 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, + 0x20, 0x30, 0x35, 0x2f, 0x32, 0x37, 0x2f, 0x30, 0x35, 0x20, 0x30, 0x34, + 0x3a, 0x35, 0x33, 0x3a, 0x31, 0x31, 0x00, 0x0e, 0x04, 0x00, 0x14, 0x00, + 0x14, 0x10, 0x0e, 0x07, 0x06, 0x00, 0x01, 0x30, 0xf9, 0xad, 0xa0, 0x02, + 0x00, 0x00, 0x03, 0xe9, 0x00, 0xfe, 0x07, 0x00, 0x12, 0x0f, 0x02, 0x07, + 0x01, 0x00, 0xfe, 0x09, 0x00, 0x12, 0x0f, 0x01, 0x03, 0x6c, 0x00, 0x00, + 0x10, 0xfe, 0x09, 0x00, 0x12, 0x0f, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, + 0xfe, 0x06, 0x00, 0x12, 0x0f, 0x04, 0x05, 0xf2, 0xfe, 0x06, 0x00, 0x80, + 0xc2, 0x01, 0x01, 0xe8, 0xfe, 0x07, 0x00, 0x80, 0xc2, 0x02, 0x01, 0x00, + 0x00, 0xfe, 0x17, 0x00, 0x80, 0xc2, 0x03, 0x01, 0xe8, 0x10, 0x76, 0x32, + 0x2d, 0x30, 0x34, 0x38, 0x38, 0x2d, 0x30, 0x33, 0x2d, 0x30, 0x35, 0x30, + 0x35, 0x00, 0xfe, 0x05, 0x00, 0x80, 0xc2, 0x04, 0x00, 0x00, 0x00, + } + + p := gopacket.NewPacket(data, LinkTypeEthernet, testDecodeOptions) + wantLayers := []gopacket.LayerType{LayerTypeEthernet, LayerTypeLinkLayerDiscovery, LayerTypeLinkLayerDiscoveryInfo} + checkLayers(p, wantLayers, t) + lldpL := p.Layer(LayerTypeLinkLayerDiscovery) + lldp := lldpL.(*LinkLayerDiscovery) + want := &LinkLayerDiscovery{ + ChassisID: LLDPChassisID{LLDPChassisIDSubTypeMACAddr, []byte{0x00, 0x01, 0x30, 0xf9, 0xad, 0xa0}}, + PortID: LLDPPortID{LLDPPortIDSubtypeIfaceName, []byte("1/1")}, + TTL: 120, + BaseLayer: BaseLayer{Contents: data[14:]}, + } + lldp.Values = nil // test these in next stage + if !reflect.DeepEqual(lldp, want) { + t.Errorf("Values mismatch, \ngot %#v\nwant %#v\n", lldp, want) + } + + infoL := p.Layer(LayerTypeLinkLayerDiscoveryInfo) + info := infoL.(*LinkLayerDiscoveryInfo) + wantinfo := &LinkLayerDiscoveryInfo{ + PortDescription: "Summit300-48-Port 1001\x00", + SysName: "Summit300-48\x00", + SysDescription: "Summit300-48 - Version 7.4e.1 (Build 5) by Release_Master 05/27/05 04:53:11\x00", + SysCapabilities: LLDPSysCapabilities{ + SystemCap: LLDPCapabilities{Bridge: true, Router: true}, + EnabledCap: LLDPCapabilities{Bridge: true, Router: true}, + }, + MgmtAddress: LLDPMgmtAddress{IANAAddressFamily802, []byte{0x00, 0x01, 0x30, 0xf9, 0xad, 0xa0}, LLDPInterfaceSubtypeifIndex, 1001, ""}, + OrgTLVs: []LLDPOrgSpecificTLV{ + LLDPOrgSpecificTLV{OUI: 0x120f, SubType: 0x2, Info: []uint8{0x7, 0x1, 0x0}}, + LLDPOrgSpecificTLV{OUI: 0x120f, SubType: 0x1, Info: []uint8{0x3, 0x6c, 0x0, 0x0, 0x10}}, + LLDPOrgSpecificTLV{OUI: 0x120f, SubType: 0x3, Info: []uint8{0x1, 0x0, 0x0, 0x0, 0x0}}, + LLDPOrgSpecificTLV{OUI: 0x120f, SubType: 0x4, Info: []uint8{0x5, 0xf2}}, + LLDPOrgSpecificTLV{OUI: 0x80c2, SubType: 0x1, Info: []uint8{0x1, 0xe8}}, + LLDPOrgSpecificTLV{OUI: 0x80c2, SubType: 0x2, Info: []uint8{0x1, 0x0, 0x0}}, + LLDPOrgSpecificTLV{OUI: 0x80c2, SubType: 0x3, Info: []uint8{0x1, 0xe8, 0x10, 0x76, 0x32, 0x2d, 0x30, 0x34, 0x38, 0x38, 0x2d, 0x30, 0x33, 0x2d, 0x30, 0x35, 0x30, 0x35, 0x0}}, + LLDPOrgSpecificTLV{OUI: 0x80c2, SubType: 0x4, Info: []uint8{0x0}}, + }, + Unknown: nil, + } + if !reflect.DeepEqual(info, wantinfo) { + t.Errorf("Values mismatch, \ngot %#v\nwant %#v\n", info, wantinfo) + } + info8021, err := info.Decode8021() + if err != nil { + t.Errorf("8021 Values decode error: %v", err) + } + want8021 := LLDPInfo8021{ + PVID: 488, + PPVIDs: []PortProtocolVLANID{PortProtocolVLANID{false, false, 0}}, + VLANNames: []VLANName{VLANName{488, "v2-0488-03-0505\x00"}}, + ProtocolIdentities: nil, + VIDUsageDigest: 0, + ManagementVID: 0, + LinkAggregation: LLDPLinkAggregation{false, false, 0}, + } + if !reflect.DeepEqual(info8021, want8021) { + t.Errorf("Values mismatch, \ngot %#v\nwant %#v\n", info8021, want8021) + } + info8023, err := info.Decode8023() + if err != nil { + t.Errorf("8023 Values decode error: %v", err) + } + want8023 := LLDPInfo8023{ + LinkAggregation: LLDPLinkAggregation{true, false, 0}, + MACPHYConfigStatus: LLDPMACPHYConfigStatus{true, true, 0x6c00, 0x0010}, + PowerViaMDI: LLDPPowerViaMDI8023{true, true, true, false, 1, 0, 0, 0, 0, 0, 0}, + MTU: 1522, + } + + if !reflect.DeepEqual(info8023, want8023) { + t.Errorf("Values mismatch, \ngot %#v\nwant %#v\n", info8023, want8023) + } + + // http://wiki.wireshark.org/SampleCaptures?action=AttachFile&do=get&target=lldpmed_civicloc.pcap + data = []byte{ + 0x01, 0x80, 0xc2, 0x00, 0x00, 0x0e, 0x00, 0x13, 0x21, 0x57, 0xca, 0x7f, + 0x88, 0xcc, 0x02, 0x07, 0x04, 0x00, 0x13, 0x21, 0x57, 0xca, 0x40, 0x04, + 0x02, 0x07, 0x31, 0x06, 0x02, 0x00, 0x78, 0x08, 0x01, 0x31, 0x0a, 0x1a, + 0x50, 0x72, 0x6f, 0x43, 0x75, 0x72, 0x76, 0x65, 0x20, 0x53, 0x77, 0x69, + 0x74, 0x63, 0x68, 0x20, 0x32, 0x36, 0x30, 0x30, 0x2d, 0x38, 0x2d, 0x50, + 0x57, 0x52, 0x0c, 0x5f, 0x50, 0x72, 0x6f, 0x43, 0x75, 0x72, 0x76, 0x65, + 0x20, 0x4a, 0x38, 0x37, 0x36, 0x32, 0x41, 0x20, 0x53, 0x77, 0x69, 0x74, + 0x63, 0x68, 0x20, 0x32, 0x36, 0x30, 0x30, 0x2d, 0x38, 0x2d, 0x50, 0x57, + 0x52, 0x2c, 0x20, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, + 0x48, 0x2e, 0x30, 0x38, 0x2e, 0x38, 0x39, 0x2c, 0x20, 0x52, 0x4f, 0x4d, + 0x20, 0x48, 0x2e, 0x30, 0x38, 0x2e, 0x35, 0x58, 0x20, 0x28, 0x2f, 0x73, + 0x77, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, + 0x2f, 0x66, 0x69, 0x73, 0x68, 0x28, 0x74, 0x73, 0x5f, 0x30, 0x38, 0x5f, + 0x35, 0x29, 0x29, 0x0e, 0x04, 0x00, 0x14, 0x00, 0x04, 0x10, 0x0c, 0x05, + 0x01, 0x0f, 0xff, 0x7a, 0x94, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, + 0x09, 0x00, 0x12, 0x0f, 0x01, 0x03, 0x6c, 0x00, 0x00, 0x10, 0xfe, 0x07, + 0x00, 0x12, 0xbb, 0x01, 0x00, 0x0f, 0x04, 0xfe, 0x08, 0x00, 0x12, 0xbb, + 0x02, 0x01, 0x40, 0x65, 0xae, 0xfe, 0x2e, 0x00, 0x12, 0xbb, 0x03, 0x02, + 0x28, 0x02, 0x55, 0x53, 0x01, 0x02, 0x43, 0x41, 0x03, 0x09, 0x52, 0x6f, + 0x73, 0x65, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x06, 0x09, 0x46, 0x6f, 0x6f, + 0x74, 0x68, 0x69, 0x6c, 0x6c, 0x73, 0x13, 0x04, 0x38, 0x30, 0x30, 0x30, + 0x1a, 0x03, 0x52, 0x33, 0x4c, 0xfe, 0x07, 0x00, 0x12, 0xbb, 0x04, 0x03, + 0x00, 0x41, 0x00, 0x00, + } + + p = gopacket.NewPacket(data, LinkTypeEthernet, testDecodeOptions) + wantLayers = []gopacket.LayerType{LayerTypeEthernet, LayerTypeLinkLayerDiscovery, LayerTypeLinkLayerDiscoveryInfo} + checkLayers(p, wantLayers, t) + lldpL = p.Layer(LayerTypeLinkLayerDiscovery) + lldp = lldpL.(*LinkLayerDiscovery) + want = &LinkLayerDiscovery{ + ChassisID: LLDPChassisID{LLDPChassisIDSubTypeMACAddr, []byte{0x00, 0x13, 0x21, 0x57, 0xca, 0x40}}, + PortID: LLDPPortID{LLDPPortIDSubtypeLocal, []byte("1")}, + TTL: 120, + BaseLayer: BaseLayer{Contents: data[14:]}, + } + lldp.Values = nil // test these in next stage + if !reflect.DeepEqual(lldp, want) { + t.Errorf("Values mismatch, \ngot %#v\nwant %#v\n", lldp, want) + } + + infoL = p.Layer(LayerTypeLinkLayerDiscoveryInfo) + info = infoL.(*LinkLayerDiscoveryInfo) + wantinfo = &LinkLayerDiscoveryInfo{ + PortDescription: "1", + SysName: "ProCurve Switch 2600-8-PWR", + SysDescription: "ProCurve J8762A Switch 2600-8-PWR, revision H.08.89, ROM H.08.5X (/sw/code/build/fish(ts_08_5))", + SysCapabilities: LLDPSysCapabilities{ + SystemCap: LLDPCapabilities{Bridge: true, Router: true}, + EnabledCap: LLDPCapabilities{Bridge: true}, + }, + MgmtAddress: LLDPMgmtAddress{IANAAddressFamilyIPV4, []byte{0x0f, 0xff, 0x7a, 0x94}, LLDPInterfaceSubtypeifIndex, 0, ""}, + OrgTLVs: []LLDPOrgSpecificTLV{ + LLDPOrgSpecificTLV{OUI: 0x120f, SubType: 0x1, Info: []uint8{0x3, 0x6c, 0x0, 0x0, 0x10}}, + LLDPOrgSpecificTLV{OUI: 0x12bb, SubType: 0x1, Info: []uint8{0x0, 0xf, 0x4}}, + LLDPOrgSpecificTLV{OUI: 0x12bb, SubType: 0x2, Info: []uint8{0x1, 0x40, 0x65, 0xae}}, + LLDPOrgSpecificTLV{OUI: 0x12bb, SubType: 0x3, Info: []uint8{0x2, 0x28, 0x2, 0x55, 0x53, 0x1, 0x2, 0x43, 0x41, 0x3, 0x9, 0x52, 0x6f, 0x73, 0x65, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x6, 0x9, 0x46, 0x6f, 0x6f, 0x74, 0x68, 0x69, 0x6c, 0x6c, 0x73, 0x13, 0x4, 0x38, 0x30, 0x30, 0x30, 0x1a, 0x3, 0x52, 0x33, 0x4c}}, + LLDPOrgSpecificTLV{OUI: 0x12bb, SubType: 0x4, Info: []uint8{0x3, 0x0, 0x41}}, + }, + Unknown: nil, + } + if !reflect.DeepEqual(info, wantinfo) { + t.Errorf("Values mismatch, \ngot %#v\nwant %#v\n", info, wantinfo) + } + info8023, err = info.Decode8023() + if err != nil { + t.Errorf("8023 Values decode error: %v", err) + } + want8023 = LLDPInfo8023{ + MACPHYConfigStatus: LLDPMACPHYConfigStatus{true, true, 0x6c00, 0x0010}, + } + + if !reflect.DeepEqual(info8023, want8023) { + t.Errorf("Values mismatch, \ngot %#v\nwant %#v\n", info8023, want8023) + } + + infoMedia, err := info.DecodeMedia() + if err != nil { + t.Errorf("8023 Values decode error: %v", err) + } + wantMedia := LLDPInfoMedia{ + MediaCapabilities: LLDPMediaCapabilities{true, true, true, true, false, false, LLDPMediaClassNetwork}, + NetworkPolicy: LLDPNetworkPolicy{LLDPAppTypeVoice, true, true, 50, 6, 46}, + Location: LLDPLocation{Format: LLDPLocationFormatAddress, Address: LLDPLocationAddress{ + What: LLDPLocationAddressWhatClient, + CountryCode: "US", + AddressLines: []LLDPLocationAddressLine{ + LLDPLocationAddressLine{LLDPLocationAddressTypeNational, "CA"}, + LLDPLocationAddressLine{LLDPLocationAddressTypeCity, "Roseville"}, + LLDPLocationAddressLine{LLDPLocationAddressTypeStreet, "Foothills"}, + LLDPLocationAddressLine{LLDPLocationAddressTypeHouseNum, "8000"}, + LLDPLocationAddressLine{LLDPLocationAddressTypeUnit, "R3L"}, + }, + }}, + PowerViaMDI: LLDPPowerViaMDI{0, 0, LLDPPowerPriorityLow, 6500}, + } + + if !reflect.DeepEqual(infoMedia, wantMedia) { + t.Errorf("Values mismatch, \ngot %#v\nwant %#v\n", infoMedia, wantMedia) + } + +} + +func TestDecodeNortelDiscovery(t *testing.T) { + // http://www.thetechfirm.com/packets/nortel_btdp/btdp_nai.enc + data := []byte{ + 0x01, 0x00, 0x81, 0x00, 0x01, 0x00, 0x00, 0x04, 0x38, 0xe0, 0xcc, 0xde, + 0x00, 0x13, 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x81, 0x01, 0xa2, 0xac, 0x13, + 0x58, 0x03, 0x00, 0x04, 0x15, 0x30, 0x0c, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x38, 0xe0, 0xcc, 0xde, 0x80, 0x6a, 0x00, 0x01, 0x14, 0x00, + 0x02, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + } + p := gopacket.NewPacket(data, LinkTypeEthernet, testDecodeOptions) + wantLayers := []gopacket.LayerType{LayerTypeEthernet, LayerTypeLLC, LayerTypeSNAP, LayerTypeNortelDiscovery} + checkLayers(p, wantLayers, t) + + want := &NortelDiscovery{ + IPAddress: []byte{172, 19, 88, 3}, + SegmentID: []byte{0x00, 0x04, 0x15}, + Chassis: NDPChassisBayStack450101001000Switches, + Backplane: NDPBackplaneEthernetFastEthernetGigabitEthernet, + State: NDPStateHeartbeat, + NumLinks: 0, + } + ndpL := p.Layer(LayerTypeNortelDiscovery) + info, _ := ndpL.(*NortelDiscovery) + if !reflect.DeepEqual(info, want) { + t.Errorf("Values mismatch, \ngot %#v\nwant %#v\n", info, want) + } +} + +func TestDecodeIPv6Jumbogram(t *testing.T) { + // Haven't found any of these in the wild or on example pcaps online, so had + // to generate one myself via scapy. Unfortunately, scapy can only + // str(packet) for packets with length < 65536, due to limitations in python's + // struct library, so I generated the header with: + // Ether() / IPv6(src='::1', dst='::2') / IPv6ExtHdrHopByHop(options=[Jumbo(jumboplen=70000)]) / TCP(sport=8888, dport=80) + // then added the payload manually ("payload" * 9996). The checksums here are + // not correct, but we don't check, so who cares ;) + dataStr := "\x00\x1f\xca\xb3v@$\xbe\x05'\x0b\x17\x86\xdd`\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x06\x00\xc2\x04\x00\x01\x11p\"\xb8\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00l\xd8\x00\x00" + payload := strings.Repeat("payload", 9996) + data := []byte(dataStr + payload) + p := gopacket.NewPacket(data, LinkTypeEthernet, testDecodeOptions) + checkLayers(p, []gopacket.LayerType{LayerTypeEthernet, LayerTypeIPv6, LayerTypeIPv6HopByHop, LayerTypeTCP, gopacket.LayerTypePayload}, t) + if p.ApplicationLayer() == nil { + t.Error("Packet has no application layer") + } else if string(p.ApplicationLayer().Payload()) != payload { + t.Errorf("Jumbogram payload wrong") + } + // Check truncated for jumbograms + data = data[:len(data)-1] + p = gopacket.NewPacket(data, LinkTypeEthernet, testDecodeOptions) + checkLayers(p, []gopacket.LayerType{LayerTypeEthernet, LayerTypeIPv6, LayerTypeIPv6HopByHop, LayerTypeTCP, gopacket.LayerTypePayload}, t) + if !p.Metadata().Truncated { + t.Error("Jumbogram should be truncated") + } +} + +func TestDecodeUDPPacketTooSmall(t *testing.T) { + data := []byte{ + 0x00, 0x15, 0x2c, 0x9d, 0xcc, 0x00, 0x00, 0x10, 0xdb, 0xff, 0x10, 0x00, 0x81, 0x00, 0x01, 0xf7, + 0x08, 0x00, 0x45, 0x60, 0x00, 0x3c, 0x0f, 0xa9, 0x00, 0x00, 0x6e, 0x11, 0x01, 0x0a, 0x47, 0xe6, + 0xee, 0x2e, 0xac, 0x16, 0x59, 0x73, 0x00, 0x50, 0x00, 0x50, 0x00, 0x28, 0x4d, 0xad, 0x00, 0x67, + 0x00, 0x01, 0x00, 0x72, 0xd5, 0xc7, 0xf1, 0x07, 0x00, 0x00, 0x01, 0x01, 0x00, 0x0d, 0x00, 0x00, + 0x00, 0x14, 0x00, 0x00, 0x19, 0xba, + } + p := gopacket.NewPacket(data, LinkTypeEthernet, testDecodeOptions) + checkLayers(p, []gopacket.LayerType{LayerTypeEthernet, LayerTypeDot1Q, LayerTypeIPv4, LayerTypeUDP, gopacket.LayerTypePayload}, t) + if !p.Metadata().Truncated { + t.Error("UDP short packet should be truncated") + } +} + +func TestDecodingLayerParserFullTCPPacket(t *testing.T) { + dlp := gopacket.NewDecodingLayerParser(LayerTypeEthernet, &Ethernet{}, &IPv4{}, &TCP{}, &gopacket.Payload{}) + decoded := make([]gopacket.LayerType, 1) + err := dlp.DecodeLayers(testSimpleTCPPacket, &decoded) + if err != nil { + t.Error("Error from dlp parser: ", err) + } + if len(decoded) != 4 { + t.Error("Expected 4 layers parsed, instead got ", len(decoded)) + } +} + +// testICMP is the packet: +// 15:49:15.773265 IP 72.14.222.226 > 172.29.20.15: ICMP host 10.66.73.201 unreachable - admin prohibited filter, length 36 +// 0x0000: 24be 0527 0b17 001f cab3 75c0 0800 4500 $..'......u...E. +// 0x0010: 0038 0000 0000 fc01 d7a7 480e dee2 ac1d .8........H..... +// 0x0020: 140f 030d 946e 0000 0000 4520 004d 0000 .....n....E..M.. +// 0x0030: 4000 3e11 2849 ac1d 140f 0a42 49c9 8ecc @.>.(I.....BI... +// 0x0040: 62e1 0039 769d b..9v. +var testICMP = []byte{ + 0x24, 0xbe, 0x05, 0x27, 0x0b, 0x17, 0x00, 0x1f, 0xca, 0xb3, 0x75, 0xc0, 0x08, 0x00, 0x45, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x01, 0xd7, 0xa7, 0x48, 0x0e, 0xde, 0xe2, 0xac, 0x1d, + 0x14, 0x0f, 0x03, 0x0d, 0x94, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x45, 0x20, 0x00, 0x4d, 0x00, 0x00, + 0x40, 0x00, 0x3e, 0x11, 0x28, 0x49, 0xac, 0x1d, 0x14, 0x0f, 0x0a, 0x42, 0x49, 0xc9, 0x8e, 0xcc, + 0x62, 0xe1, 0x00, 0x39, 0x76, 0x9d, +} + +func TestICMP(t *testing.T) { + p := gopacket.NewPacket(testICMP, LinkTypeEthernet, testDecodeOptions) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeEthernet, LayerTypeIPv4, LayerTypeICMPv4, gopacket.LayerTypePayload}, t) + testSerialization(t, p, testICMP) +} +func BenchmarkDecodeICMP(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testICMP, LinkTypeEthernet, gopacket.NoCopy) + } +} + +// testICMP6 is the packet: +// 16:17:37.758937 IP6 fe80::21f:caff:feb3:75c0 > 2620:0:1005:0:26be:5ff:fe27:b17: ICMP6, neighbor solicitation, who has 2620:0:1005:0:26be:5ff:fe27:b17, length 32 +// 0x0000: 24be 0527 0b17 001f cab3 75c0 86dd 6e00 $..'......u...n. +// 0x0010: 0000 0020 3aff fe80 0000 0000 0000 021f ....:........... +// 0x0020: caff feb3 75c0 2620 0000 1005 0000 26be ....u.&.......&. +// 0x0030: 05ff fe27 0b17 8700 1eba 0000 0000 2620 ...'..........&. +// 0x0040: 0000 1005 0000 26be 05ff fe27 0b17 0101 ......&....'.... +// 0x0050: 001f cab3 75c0 ....u. +var testICMP6 = []byte{ + 0x24, 0xbe, 0x05, 0x27, 0x0b, 0x17, 0x00, 0x1f, 0xca, 0xb3, 0x75, 0xc0, 0x86, 0xdd, 0x6e, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x3a, 0xff, 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1f, + 0xca, 0xff, 0xfe, 0xb3, 0x75, 0xc0, 0x26, 0x20, 0x00, 0x00, 0x10, 0x05, 0x00, 0x00, 0x26, 0xbe, + 0x05, 0xff, 0xfe, 0x27, 0x0b, 0x17, 0x87, 0x00, 0x1e, 0xba, 0x00, 0x00, 0x00, 0x00, 0x26, 0x20, + 0x00, 0x00, 0x10, 0x05, 0x00, 0x00, 0x26, 0xbe, 0x05, 0xff, 0xfe, 0x27, 0x0b, 0x17, 0x01, 0x01, + 0x00, 0x1f, 0xca, 0xb3, 0x75, 0xc0, +} + +func TestICMP6(t *testing.T) { + p := gopacket.NewPacket(testICMP6, LinkTypeEthernet, testDecodeOptions) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeEthernet, LayerTypeIPv6, LayerTypeICMPv6, gopacket.LayerTypePayload}, t) + testSerialization(t, p, testICMP6) +} +func BenchmarkDecodeICMP6(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testICMP6, LinkTypeEthernet, gopacket.NoCopy) + } +} + +// testMPLS is the packet: +// 12:48:57.201014 MPLS (label 29, exp 0, [S], ttl 255) IP 10.1.2.1 > 10.34.0.1: ICMP echo request, id 2618, seq 1579, length 80 +// 0x0000: 0030 96e6 fc39 0030 9605 2838 8847 0001 .0...9.0..(8.G.. +// 0x0010: d1ff 4500 0064 000b 0000 ff01 a569 0a01 ..E..d.......i.. +// 0x0020: 0201 0a22 0001 0800 3a76 0a3a 062b 0000 ..."....:v.:.+.. +// 0x0030: 0000 001f 3350 abcd abcd abcd abcd abcd ....3P.......... +// 0x0040: abcd abcd abcd abcd abcd abcd abcd abcd ................ +// 0x0050: abcd abcd abcd abcd abcd abcd abcd abcd ................ +// 0x0060: abcd abcd abcd abcd abcd abcd abcd abcd ................ +// 0x0070: abcd abcd abcd ...... +var testMPLS = []byte{ + 0x00, 0x30, 0x96, 0xe6, 0xfc, 0x39, 0x00, 0x30, 0x96, 0x05, 0x28, 0x38, 0x88, 0x47, 0x00, 0x01, + 0xd1, 0xff, 0x45, 0x00, 0x00, 0x64, 0x00, 0x0b, 0x00, 0x00, 0xff, 0x01, 0xa5, 0x69, 0x0a, 0x01, + 0x02, 0x01, 0x0a, 0x22, 0x00, 0x01, 0x08, 0x00, 0x3a, 0x76, 0x0a, 0x3a, 0x06, 0x2b, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1f, 0x33, 0x50, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, + 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, + 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, + 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, + 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, +} + +func TestMPLS(t *testing.T) { + p := gopacket.NewPacket(testMPLS, LinkTypeEthernet, testDecodeOptions) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeEthernet, LayerTypeMPLS, LayerTypeIPv4, LayerTypeICMPv4, gopacket.LayerTypePayload}, t) + testSerialization(t, p, testMPLS) +} +func BenchmarkDecodeMPLS(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testMPLS, LinkTypeEthernet, gopacket.NoCopy) + } +} + +// testPPPoEICMPv6 is the packet: +// 07:43:31.091560 PPPoE [ses 0x11] IP6 fe80::c801:eff:fe88:8 > ff02::1: ICMP6, neighbor advertisement, tgt is fe80::c801:eff:fe88:8, length 24 +// 0x0000: cc05 0e88 0000 ca01 0e88 0006 8864 1100 .............d.. +// 0x0010: 0011 0042 0057 6e00 0000 0018 3aff fe80 ...B.Wn.....:... +// 0x0020: 0000 0000 0000 c801 0eff fe88 0008 ff02 ................ +// 0x0030: 0000 0000 0000 0000 0000 0000 0001 8800 ................ +// 0x0040: 5083 8000 0000 fe80 0000 0000 0000 c801 P............... +// 0x0050: 0eff fe88 0008 ...... +var testPPPoEICMPv6 = []byte{ + 0xcc, 0x05, 0x0e, 0x88, 0x00, 0x00, 0xca, 0x01, 0x0e, 0x88, 0x00, 0x06, 0x88, 0x64, 0x11, 0x00, + 0x00, 0x11, 0x00, 0x42, 0x00, 0x57, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3a, 0xff, 0xfe, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x01, 0x0e, 0xff, 0xfe, 0x88, 0x00, 0x08, 0xff, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x88, 0x00, + 0x50, 0x83, 0x80, 0x00, 0x00, 0x00, 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x01, + 0x0e, 0xff, 0xfe, 0x88, 0x00, 0x08, +} + +func TestPPPoEICMPv6(t *testing.T) { + p := gopacket.NewPacket(testPPPoEICMPv6, LinkTypeEthernet, testDecodeOptions) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{ + LayerTypeEthernet, + LayerTypePPPoE, + LayerTypePPP, + LayerTypeIPv6, + LayerTypeICMPv6, + gopacket.LayerTypePayload, + }, t) + testSerialization(t, p, testPPPoEICMPv6) +} +func BenchmarkDecodePPPoEICMPv6(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testPPPoEICMPv6, LinkTypeEthernet, gopacket.NoCopy) + } +} + +var testPFLogUDP = []byte{ + 0x3d, 0x02, 0x00, 0x00, 0x65, 0x6e, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xae, 0xff, 0xff, 0xff, 0x7f, + 0xa0, 0x86, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xb8, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x45, 0x00, 0x00, 0x2c, 0x02, 0x16, 0x00, 0x00, 0x40, 0x11, 0x4e, 0xb0, 0xac, 0x17, 0xe8, 0xcc, + 0xac, 0x17, 0xe8, 0xff, 0xf0, 0xff, 0x21, 0xa4, 0x00, 0x18, 0x2a, 0x25, 0x50, 0x4e, 0x4a, 0x50, + 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +} + +func TestPFLogUDP(t *testing.T) { + p := gopacket.NewPacket(testPFLogUDP, LinkTypePFLog, testDecodeOptions) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{ + LayerTypePFLog, + LayerTypeIPv4, + LayerTypeUDP, + gopacket.LayerTypePayload, + }, t) +} + +func TestRegressionDot1QPriority(t *testing.T) { + d := &Dot1Q{ + Priority: 2, + } + out := gopacket.NewSerializeBuffer() + gopacket.SerializeLayers(out, gopacket.SerializeOptions{}, d) + if err := d.DecodeFromBytes(out.Bytes(), gopacket.NilDecodeFeedback); err != nil { + t.Errorf("could not decode encoded dot1q") + } else if d.Priority != 2 { + t.Errorf("priority mismatch, want 2 got %d", d.Priority) + } +} + +// testPacketMPLSInMPLS is the packet: +// 15:27:44.753678 MPLS (label 18, exp 0, ttl 255) (label 16, exp 0, [S], ttl +// 255) IP 10.31.0.1 > 10.34.0.1: ICMP echo request, id 3941, seq 4768, length +// 80 +// 0x0000: 0030 96e6 fc39 0030 9605 2838 8847 0001 .0...9.0..(8.G.. +// 0x0010: 20ff 0001 01ff 4500 0064 0050 0000 ff01 ......E..d.P.... +// 0x0020: a706 0a1f 0001 0a22 0001 0800 bd11 0f65 .......".......e +// 0x0030: 12a0 0000 0000 0053 9ee0 abcd abcd abcd .......S........ +// 0x0040: abcd abcd abcd abcd abcd abcd abcd abcd ................ +// 0x0050: abcd abcd abcd abcd abcd abcd abcd abcd ................ +// 0x0060: abcd abcd abcd abcd abcd abcd abcd abcd ................ +// 0x0070: abcd abcd abcd abcd abcd .......... +var testPacketMPLSInMPLS = []byte{ + 0x00, 0x30, 0x96, 0xe6, 0xfc, 0x39, 0x00, 0x30, 0x96, 0x05, 0x28, 0x38, 0x88, 0x47, 0x00, 0x01, + 0x20, 0xff, 0x00, 0x01, 0x01, 0xff, 0x45, 0x00, 0x00, 0x64, 0x00, 0x50, 0x00, 0x00, 0xff, 0x01, + 0xa7, 0x06, 0x0a, 0x1f, 0x00, 0x01, 0x0a, 0x22, 0x00, 0x01, 0x08, 0x00, 0xbd, 0x11, 0x0f, 0x65, + 0x12, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x9e, 0xe0, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, + 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, + 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, + 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, + 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, +} + +func TestPacketMPLSInMPLS(t *testing.T) { + p := gopacket.NewPacket(testPacketMPLSInMPLS, LinkTypeEthernet, testDecodeOptions) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{ + LayerTypeEthernet, + LayerTypeMPLS, + LayerTypeMPLS, + LayerTypeIPv4, + LayerTypeICMPv4, + gopacket.LayerTypePayload}, t) +} + +// testPacketIPv4Fragmented is the packet: +// 22:11:26.616090 IP 10.1.1.1.31915 > 129.111.30.27.20197: UDP, length 28 +// 0x0000: 0000 39cf d9cd 0040 33d9 7cfd 0800 4500 ..9....@3.|...E. +// 0x0010: 0038 00f2 2000 4011 af37 0a01 0101 816f .8....@..7.....o +// 0x0020: 1e1b 7cab 4ee5 0024 0000 0000 0000 0000 ..|.N..$........ +// 0x0030: 0000 0000 0000 0000 0000 0000 0000 0000 ................ +// 0x0040: 0000 0000 0000 ...... +var testPacketIPv4Fragmented = []byte{ + 0x00, 0x00, 0x39, 0xcf, 0xd9, 0xcd, 0x00, 0x40, 0x33, 0xd9, 0x7c, 0xfd, 0x08, 0x00, 0x45, 0x00, + 0x00, 0x38, 0x00, 0xf2, 0x20, 0x00, 0x40, 0x11, 0xaf, 0x37, 0x0a, 0x01, 0x01, 0x01, 0x81, 0x6f, + 0x1e, 0x1b, 0x7c, 0xab, 0x4e, 0xe5, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +} + +func TestPacketIPv4Fragmented(t *testing.T) { + p := gopacket.NewPacket(testPacketIPv4Fragmented, LinkTypeEthernet, testDecodeOptions) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeEthernet, LayerTypeIPv4, gopacket.LayerTypeFragment}, t) + testSerializationWithOpts(t, p, testPacketIPv4Fragmented, gopacket.SerializeOptions{FixLengths: true, ComputeChecksums: true}) +} + +// TestSCTPChunkBadLength tests for issue #146 +func TestSCTPChunkBadLength(t *testing.T) { + data := []byte( + "0000\xad9$e\x11\xe4\xaeo\b\x00E\x00\x018\xb4\xa3" + + "\x00\x00Y\x84\xc4@\x11gz\xc0\xa8\xee\x01\xc0\xa8" + + "\xeeD\x007le\x03\x01\xc0\f\xdf\b\x01\x00\x00") + + // this panic'd previously due to a zero length chunk getting + // repeatedly read + gopacket.NewPacket(data, LinkTypeEthernet, gopacket.Default) +} + +// TestSTP +func TestSTP(t *testing.T) { + testSTPpacket := []byte{ + 0x01, 0x80, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x0E, 0x87, 0x85, 0x04, 0x00, 0x26, 0x42, 0x42, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x64, 0x00, 0x1C, 0x0E, 0x87, 0x78, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x80, 0x64, 0x00, 0x1C, 0x0E, 0x87, 0x85, 0x00, 0x80, 0x04, 0x01, 0x00, 0x14, 0x00, + 0x02, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + } + p := gopacket.NewPacket(testSTPpacket, LinkTypeEthernet, testDecodeOptions) + checkLayers(p, []gopacket.LayerType{LayerTypeEthernet, LayerTypeLLC, LayerTypeSTP}, t) +} diff --git a/vendor/github.com/google/gopacket/layers/dhcp_test.go b/vendor/github.com/google/gopacket/layers/dhcp_test.go new file mode 100644 index 0000000..c4975dc --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/dhcp_test.go @@ -0,0 +1,129 @@ +// Copyright 2016, 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 layers + +import ( + "bytes" + "net" + "testing" + + "github.com/google/gopacket" +) + +func TestDHCPv4EncodeRequest(t *testing.T) { + dhcp := &DHCPv4{Operation: DHCPOpRequest, HardwareType: LinkTypeEthernet, Xid: 0x12345678, + ClientIP: net.IP{0, 0, 0, 0}, YourClientIP: net.IP{0, 0, 0, 0}, NextServerIP: net.IP{0, 0, 0, 0}, RelayAgentIP: net.IP{0, 0, 0, 0}, + ClientHWAddr: net.HardwareAddr{0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc}, + ServerName: make([]byte, 64), File: make([]byte, 128)} + + dhcp.Options = append(dhcp.Options, NewDHCPOption(DHCPOptMessageType, []byte{byte(DHCPMsgTypeDiscover)})) + dhcp.Options = append(dhcp.Options, NewDHCPOption(DHCPOptHostname, []byte{'e', 'x', 'a', 'm', 'p', 'l', 'e', '.', 'c', 'o', 'm'})) + dhcp.Options = append(dhcp.Options, NewDHCPOption(DHCPOptPad, nil)) + dhcp.Options = append(dhcp.Options, NewDHCPOption(DHCPOptParamsRequest, + []byte{byte(DHCPOptSubnetMask), byte(DHCPOptBroadcastAddr), byte(DHCPOptTimeOffset), + byte(DHCPOptRouter), byte(DHCPOptDomainName), byte(DHCPOptDNS), byte(DHCPOptDomainSearch), + byte(DHCPOptHostname), byte(DHCPOptNetBIOSTCPNS), byte(DHCPOptInterfaceMTU), byte(DHCPOptClasslessStaticRoute), + byte(DHCPOptNTPServers)})) + + buf := gopacket.NewSerializeBuffer() + opts := gopacket.SerializeOptions{FixLengths: true} + err := gopacket.SerializeLayers(buf, opts, dhcp) + if err != nil { + t.Fatal(err) + } + + p2 := gopacket.NewPacket(buf.Bytes(), LayerTypeDHCPv4, testDecodeOptions) + dhcp2 := p2.Layer(LayerTypeDHCPv4).(*DHCPv4) + testDHCPEqual(t, dhcp, dhcp2) +} + +func TestDHCPv4EncodeResponse(t *testing.T) { + dhcp := &DHCPv4{Operation: DHCPOpReply, HardwareType: LinkTypeEthernet, Xid: 0x12345678, + ClientIP: net.IP{0, 0, 0, 0}, YourClientIP: net.IP{192, 168, 0, 123}, NextServerIP: net.IP{192, 168, 0, 1}, RelayAgentIP: net.IP{0, 0, 0, 0}, + ClientHWAddr: net.HardwareAddr{0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc}, + ServerName: make([]byte, 64), File: make([]byte, 128)} + + dhcp.Options = append(dhcp.Options, NewDHCPOption(DHCPOptMessageType, []byte{byte(DHCPMsgTypeOffer)})) + dhcp.Options = append(dhcp.Options, NewDHCPOption(DHCPOptSubnetMask, []byte{255, 255, 255, 0})) + dhcp.Options = append(dhcp.Options, NewDHCPOption(DHCPOptPad, nil)) + dhcp.Options = append(dhcp.Options, NewDHCPOption(DHCPOptT1, []byte{0x00, 0x00, 0x0e, 0x10})) + dhcp.Options = append(dhcp.Options, NewDHCPOption(DHCPOptT2, []byte{0x00, 0x00, 0x0e, 0x10})) + dhcp.Options = append(dhcp.Options, NewDHCPOption(DHCPOptLeaseTime, []byte{0x00, 0x00, 0x0e, 0x10})) + dhcp.Options = append(dhcp.Options, NewDHCPOption(DHCPOptServerID, []byte{192, 168, 0, 1})) + + buf := gopacket.NewSerializeBuffer() + opts := gopacket.SerializeOptions{FixLengths: true} + err := gopacket.SerializeLayers(buf, opts, dhcp) + if err != nil { + t.Fatal(err) + } + + p2 := gopacket.NewPacket(buf.Bytes(), LayerTypeDHCPv4, testDecodeOptions) + dhcp2 := p2.Layer(LayerTypeDHCPv4).(*DHCPv4) + testDHCPEqual(t, dhcp, dhcp2) +} + +func testDHCPEqual(t *testing.T, d1, d2 *DHCPv4) { + if d1.Operation != d2.Operation { + t.Errorf("expected Operation=%s, got %s", d1.Operation, d2.Operation) + } + if d1.HardwareType != d2.HardwareType { + t.Errorf("expected HardwareType=%s, got %s", d1.HardwareType, d2.HardwareType) + } + if d1.HardwareLen != d2.HardwareLen { + t.Errorf("expected HardwareLen=%v, got %v", d1.HardwareLen, d2.HardwareLen) + } + if d1.HardwareOpts != d2.HardwareOpts { + t.Errorf("expected HardwareOpts=%v, got %v", d1.HardwareOpts, d2.HardwareOpts) + } + if d1.Xid != d2.Xid { + t.Errorf("expected Xid=%v, got %v", d1.Xid, d2.Xid) + } + if d1.Secs != d2.Secs { + t.Errorf("expected Secs=%v, got %v", d1.Secs, d2.Secs) + } + if d1.Flags != d2.Flags { + t.Errorf("expected Flags=%v, got %v", d1.Flags, d2.Flags) + } + if !d1.ClientIP.Equal(d2.ClientIP) { + t.Errorf("expected ClientIP=%v, got %v", d1.ClientIP, d2.ClientIP) + } + if !d1.YourClientIP.Equal(d2.YourClientIP) { + t.Errorf("expected YourClientIP=%v, got %v", d1.YourClientIP, d2.YourClientIP) + } + if !d1.NextServerIP.Equal(d2.NextServerIP) { + t.Errorf("expected NextServerIP=%v, got %v", d1.NextServerIP, d2.NextServerIP) + } + if !d1.RelayAgentIP.Equal(d2.RelayAgentIP) { + t.Errorf("expected RelayAgentIP=%v, got %v", d1.RelayAgentIP, d2.RelayAgentIP) + } + if !bytes.Equal(d1.ClientHWAddr, d2.ClientHWAddr) { + t.Errorf("expected ClientHWAddr=%v, got %v", d1.ClientHWAddr, d2.ClientHWAddr) + } + if !bytes.Equal(d1.ServerName, d2.ServerName) { + t.Errorf("expected ServerName=%v, got %v", d1.ServerName, d2.ServerName) + } + if !bytes.Equal(d1.File, d2.File) { + t.Errorf("expected File=%v, got %v", d1.File, d2.File) + } + if len(d1.Options) != len(d2.Options) { + t.Errorf("expected %d options, got %d", len(d1.Options), len(d2.Options)) + } + + for i, o := range d1.Options { + testDHCPOptionEqual(t, i, o, d2.Options[i]) + } +} + +func testDHCPOptionEqual(t *testing.T, idx int, d1, d2 DHCPOption) { + if d1.Type != d2.Type { + t.Errorf("expection Options[%d].Type = %s, got %s", idx, d1.Type, d2.Type) + } + if !bytes.Equal(d1.Data, d2.Data) { + t.Errorf("expection Options[%d].Data to be = %v, got %v", idx, d1.Data, d2.Data) + } +} diff --git a/vendor/github.com/google/gopacket/layers/dhcpv4.go b/vendor/github.com/google/gopacket/layers/dhcpv4.go new file mode 100644 index 0000000..761b201 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/dhcpv4.go @@ -0,0 +1,571 @@ +// Copyright 2016 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 layers + +import ( + "bytes" + "encoding/binary" + "errors" + "fmt" + "net" + + "github.com/google/gopacket" +) + +// DHCPOp rerprents a bootp operation +type DHCPOp byte + +// bootp operations +const ( + DHCPOpRequest DHCPOp = 1 + DHCPOpReply DHCPOp = 2 +) + +// String returns a string version of a DHCPOp. +func (o DHCPOp) String() string { + switch o { + case DHCPOpRequest: + return "Request" + case DHCPOpReply: + return "Reply" + default: + return "Unknown" + } +} + +// DHCPMsgType represents a DHCP operation +type DHCPMsgType byte + +// Constants that represent DHCP operations +const ( + DHCPMsgTypeUnspecified DHCPMsgType = iota + DHCPMsgTypeDiscover + DHCPMsgTypeOffer + DHCPMsgTypeRequest + DHCPMsgTypeDecline + DHCPMsgTypeAck + DHCPMsgTypeNak + DHCPMsgTypeRelease + DHCPMsgTypeInform +) + +// String returns a string version of a DHCPMsgType. +func (o DHCPMsgType) String() string { + switch o { + case DHCPMsgTypeUnspecified: + return "Unspecified" + case DHCPMsgTypeDiscover: + return "Discover" + case DHCPMsgTypeOffer: + return "Offer" + case DHCPMsgTypeRequest: + return "Request" + case DHCPMsgTypeDecline: + return "Decline" + case DHCPMsgTypeAck: + return "Ack" + case DHCPMsgTypeNak: + return "Nak" + case DHCPMsgTypeRelease: + return "Release" + case DHCPMsgTypeInform: + return "Inform" + default: + return "Unknown" + } +} + +//DHCPMagic is the RFC 2131 "magic cooke" for DHCP. +var DHCPMagic uint32 = 0x63825363 + +// DHCPv4 contains data for a single DHCP packet. +type DHCPv4 struct { + BaseLayer + Operation DHCPOp + HardwareType LinkType + HardwareLen uint8 + HardwareOpts uint8 + Xid uint32 + Secs uint16 + Flags uint16 + ClientIP net.IP + YourClientIP net.IP + NextServerIP net.IP + RelayAgentIP net.IP + ClientHWAddr net.HardwareAddr + ServerName []byte + File []byte + Options DHCPOptions +} + +// DHCPOptions is used to get nicely printed option lists which would normally +// be cut off after 5 options. +type DHCPOptions []DHCPOption + +// String returns a string version of the options list. +func (o DHCPOptions) String() string { + buf := &bytes.Buffer{} + buf.WriteByte('[') + for i, opt := range o { + buf.WriteString(opt.String()) + if i+1 != len(o) { + buf.WriteString(", ") + } + } + buf.WriteByte(']') + return buf.String() +} + +// LayerType returns gopacket.LayerTypeDHCPv4 +func (d *DHCPv4) LayerType() gopacket.LayerType { return LayerTypeDHCPv4 } + +// DecodeFromBytes decodes the given bytes into this layer. +func (d *DHCPv4) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + d.Operation = DHCPOp(data[0]) + d.HardwareType = LinkType(data[1]) + d.HardwareLen = data[2] + d.HardwareOpts = data[3] + d.Xid = binary.BigEndian.Uint32(data[4:8]) + d.Secs = binary.BigEndian.Uint16(data[8:10]) + d.Flags = binary.BigEndian.Uint16(data[10:12]) + d.ClientIP = net.IP(data[12:16]) + d.YourClientIP = net.IP(data[16:20]) + d.NextServerIP = net.IP(data[20:24]) + d.RelayAgentIP = net.IP(data[24:28]) + d.ClientHWAddr = net.HardwareAddr(data[28 : 28+d.HardwareLen]) + d.ServerName = data[44:108] + d.File = data[108:236] + if binary.BigEndian.Uint32(data[236:240]) != DHCPMagic { + return errors.New("Bad DHCP header") + } + + if len(data) <= 240 { + // DHCP Packet could have no option (??) + return nil + } + + options := data[240:] + + stop := len(options) + start := 0 + for start < stop { + o := DHCPOption{} + if err := o.decode(options[start:]); err != nil { + return err + } + if o.Type == DHCPOptEnd { + break + } + d.Options = append(d.Options, o) + // Check if the option is a single byte pad + if o.Type == DHCPOptPad { + start++ + } else { + start += int(o.Length) + 2 + } + } + return nil +} + +// Len returns the length of a DHCPv4 packet. +func (d *DHCPv4) Len() uint16 { + n := uint16(240) + for _, o := range d.Options { + if o.Type == DHCPOptPad { + n++ + } else { + n += uint16(o.Length) + 2 + } + } + n++ // for opt end + return n +} + +// SerializeTo writes the serialized form of this layer into the +// SerializationBuffer, implementing gopacket.SerializableLayer. +// See the docs for gopacket.SerializableLayer for more info. +func (d *DHCPv4) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + plen := int(d.Len()) + + data, err := b.PrependBytes(plen) + if err != nil { + return err + } + + data[0] = byte(d.Operation) + data[1] = byte(d.HardwareType) + if opts.FixLengths { + d.HardwareLen = uint8(len(d.ClientHWAddr)) + } + data[2] = d.HardwareLen + data[3] = d.HardwareOpts + binary.BigEndian.PutUint32(data[4:8], d.Xid) + binary.BigEndian.PutUint16(data[8:10], d.Secs) + binary.BigEndian.PutUint16(data[10:12], d.Flags) + copy(data[12:16], d.ClientIP.To4()) + copy(data[16:20], d.YourClientIP.To4()) + copy(data[20:24], d.NextServerIP.To4()) + copy(data[24:28], d.RelayAgentIP.To4()) + copy(data[28:44], d.ClientHWAddr) + copy(data[44:108], d.ServerName) + copy(data[108:236], d.File) + binary.BigEndian.PutUint32(data[236:240], DHCPMagic) + + if len(d.Options) > 0 { + offset := 240 + for _, o := range d.Options { + if err := o.encode(data[offset:]); err != nil { + return err + } + // A pad option is only a single byte + if o.Type == DHCPOptPad { + offset++ + } else { + offset += 2 + len(o.Data) + } + } + optend := NewDHCPOption(DHCPOptEnd, nil) + if err := optend.encode(data[offset:]); err != nil { + return err + } + } + return nil +} + +// CanDecode returns the set of layer types that this DecodingLayer can decode. +func (d *DHCPv4) CanDecode() gopacket.LayerClass { + return LayerTypeDHCPv4 +} + +// NextLayerType returns the layer type contained by this DecodingLayer. +func (d *DHCPv4) NextLayerType() gopacket.LayerType { + return gopacket.LayerTypePayload +} + +func decodeDHCPv4(data []byte, p gopacket.PacketBuilder) error { + dhcp := &DHCPv4{} + err := dhcp.DecodeFromBytes(data, p) + if err != nil { + return err + } + p.AddLayer(dhcp) + return p.NextDecoder(gopacket.LayerTypePayload) +} + +// DHCPOpt represents a DHCP option or parameter from RFC-2132 +type DHCPOpt byte + +// Constants for the DHCPOpt options. +const ( + DHCPOptPad DHCPOpt = 0 + DHCPOptSubnetMask DHCPOpt = 1 // 4, net.IP + DHCPOptTimeOffset DHCPOpt = 2 // 4, int32 (signed seconds from UTC) + DHCPOptRouter DHCPOpt = 3 // n*4, [n]net.IP + DHCPOptTimeServer DHCPOpt = 4 // n*4, [n]net.IP + DHCPOptNameServer DHCPOpt = 5 // n*4, [n]net.IP + DHCPOptDNS DHCPOpt = 6 // n*4, [n]net.IP + DHCPOptLogServer DHCPOpt = 7 // n*4, [n]net.IP + DHCPOptCookieServer DHCPOpt = 8 // n*4, [n]net.IP + DHCPOptLPRServer DHCPOpt = 9 // n*4, [n]net.IP + DHCPOptImpressServer DHCPOpt = 10 // n*4, [n]net.IP + DHCPOptResLocServer DHCPOpt = 11 // n*4, [n]net.IP + DHCPOptHostname DHCPOpt = 12 // n, string + DHCPOptBootfileSize DHCPOpt = 13 // 2, uint16 + DHCPOptMeritDumpFile DHCPOpt = 14 // >1, string + DHCPOptDomainName DHCPOpt = 15 // n, string + DHCPOptSwapServer DHCPOpt = 16 // n*4, [n]net.IP + DHCPOptRootPath DHCPOpt = 17 // n, string + DHCPOptExtensionsPath DHCPOpt = 18 // n, string + DHCPOptIPForwarding DHCPOpt = 19 // 1, bool + DHCPOptSourceRouting DHCPOpt = 20 // 1, bool + DHCPOptPolicyFilter DHCPOpt = 21 // 8*n, [n]{net.IP/net.IP} + DHCPOptDatagramMTU DHCPOpt = 22 // 2, uint16 + DHCPOptDefaultTTL DHCPOpt = 23 // 1, byte + DHCPOptPathMTUAgingTimeout DHCPOpt = 24 // 4, uint32 + DHCPOptPathPlateuTableOption DHCPOpt = 25 // 2*n, []uint16 + DHCPOptInterfaceMTU DHCPOpt = 26 // 2, uint16 + DHCPOptAllSubsLocal DHCPOpt = 27 // 1, bool + DHCPOptBroadcastAddr DHCPOpt = 28 // 4, net.IP + DHCPOptMaskDiscovery DHCPOpt = 29 // 1, bool + DHCPOptMaskSupplier DHCPOpt = 30 // 1, bool + DHCPOptRouterDiscovery DHCPOpt = 31 // 1, bool + DHCPOptSolicitAddr DHCPOpt = 32 // 4, net.IP + DHCPOptStaticRoute DHCPOpt = 33 // n*8, [n]{net.IP/net.IP} -- note the 2nd is router not mask + DHCPOptARPTrailers DHCPOpt = 34 // 1, bool + DHCPOptARPTimeout DHCPOpt = 35 // 4, uint32 + DHCPOptEthernetEncap DHCPOpt = 36 // 1, bool + DHCPOptTCPTTL DHCPOpt = 37 // 1, byte + DHCPOptTCPKeepAliveInt DHCPOpt = 38 // 4, uint32 + DHCPOptTCPKeepAliveGarbage DHCPOpt = 39 // 1, bool + DHCPOptNISDomain DHCPOpt = 40 // n, string + DHCPOptNISServers DHCPOpt = 41 // 4*n, [n]net.IP + DHCPOptNTPServers DHCPOpt = 42 // 4*n, [n]net.IP + DHCPOptVendorOption DHCPOpt = 43 // n, [n]byte // may be encapsulated. + DHCPOptNetBIOSTCPNS DHCPOpt = 44 // 4*n, [n]net.IP + DHCPOptNetBIOSTCPDDS DHCPOpt = 45 // 4*n, [n]net.IP + DHCPOptNETBIOSTCPNodeType DHCPOpt = 46 // 1, magic byte + DHCPOptNetBIOSTCPScope DHCPOpt = 47 // n, string + DHCPOptXFontServer DHCPOpt = 48 // n, string + DHCPOptXDisplayManager DHCPOpt = 49 // n, string + DHCPOptRequestIP DHCPOpt = 50 // 4, net.IP + DHCPOptLeaseTime DHCPOpt = 51 // 4, uint32 + DHCPOptExtOptions DHCPOpt = 52 // 1, 1/2/3 + DHCPOptMessageType DHCPOpt = 53 // 1, 1-7 + DHCPOptServerID DHCPOpt = 54 // 4, net.IP + DHCPOptParamsRequest DHCPOpt = 55 // n, []byte + DHCPOptMessage DHCPOpt = 56 // n, 3 + DHCPOptMaxMessageSize DHCPOpt = 57 // 2, uint16 + DHCPOptT1 DHCPOpt = 58 // 4, uint32 + DHCPOptT2 DHCPOpt = 59 // 4, uint32 + DHCPOptClassID DHCPOpt = 60 // n, []byte + DHCPOptClientID DHCPOpt = 61 // n >= 2, []byte + DHCPOptDomainSearch DHCPOpt = 119 // n, string + DHCPOptSIPServers DHCPOpt = 120 // n, url + DHCPOptClasslessStaticRoute DHCPOpt = 121 // + DHCPOptEnd DHCPOpt = 255 +) + +// String returns a string version of a DHCPOpt. +func (o DHCPOpt) String() string { + switch o { + case DHCPOptPad: + return "(padding)" + case DHCPOptSubnetMask: + return "SubnetMask" + case DHCPOptTimeOffset: + return "TimeOffset" + case DHCPOptRouter: + return "Router" + case DHCPOptTimeServer: + return "rfc868" // old time server protocol stringified to dissuade confusion w. NTP + case DHCPOptNameServer: + return "ien116" // obscure nameserver protocol stringified to dissuade confusion w. DNS + case DHCPOptDNS: + return "DNS" + case DHCPOptLogServer: + return "mitLCS" // MIT LCS server protocol yada yada w. Syslog + case DHCPOptCookieServer: + return "CookieServer" + case DHCPOptLPRServer: + return "LPRServer" + case DHCPOptImpressServer: + return "ImpressServer" + case DHCPOptResLocServer: + return "ResourceLocationServer" + case DHCPOptHostname: + return "Hostname" + case DHCPOptBootfileSize: + return "BootfileSize" + case DHCPOptMeritDumpFile: + return "MeritDumpFile" + case DHCPOptDomainName: + return "DomainName" + case DHCPOptSwapServer: + return "SwapServer" + case DHCPOptRootPath: + return "RootPath" + case DHCPOptExtensionsPath: + return "ExtensionsPath" + case DHCPOptIPForwarding: + return "IPForwarding" + case DHCPOptSourceRouting: + return "SourceRouting" + case DHCPOptPolicyFilter: + return "PolicyFilter" + case DHCPOptDatagramMTU: + return "DatagramMTU" + case DHCPOptDefaultTTL: + return "DefaultTTL" + case DHCPOptPathMTUAgingTimeout: + return "PathMTUAgingTimeout" + case DHCPOptPathPlateuTableOption: + return "PathPlateuTableOption" + case DHCPOptInterfaceMTU: + return "InterfaceMTU" + case DHCPOptAllSubsLocal: + return "AllSubsLocal" + case DHCPOptBroadcastAddr: + return "BroadcastAddress" + case DHCPOptMaskDiscovery: + return "MaskDiscovery" + case DHCPOptMaskSupplier: + return "MaskSupplier" + case DHCPOptRouterDiscovery: + return "RouterDiscovery" + case DHCPOptSolicitAddr: + return "SolicitAddr" + case DHCPOptStaticRoute: + return "StaticRoute" + case DHCPOptARPTrailers: + return "ARPTrailers" + case DHCPOptARPTimeout: + return "ARPTimeout" + case DHCPOptEthernetEncap: + return "EthernetEncap" + case DHCPOptTCPTTL: + return "TCPTTL" + case DHCPOptTCPKeepAliveInt: + return "TCPKeepAliveInt" + case DHCPOptTCPKeepAliveGarbage: + return "TCPKeepAliveGarbage" + case DHCPOptNISDomain: + return "NISDomain" + case DHCPOptNISServers: + return "NISServers" + case DHCPOptNTPServers: + return "NTPServers" + case DHCPOptVendorOption: + return "VendorOption" + case DHCPOptNetBIOSTCPNS: + return "NetBIOSOverTCPNS" + case DHCPOptNetBIOSTCPDDS: + return "NetBiosOverTCPDDS" + case DHCPOptNETBIOSTCPNodeType: + return "NetBIOSOverTCPNodeType" + case DHCPOptNetBIOSTCPScope: + return "NetBIOSOverTCPScope" + case DHCPOptXFontServer: + return "XFontServer" + case DHCPOptXDisplayManager: + return "XDisplayManager" + case DHCPOptEnd: + return "(end)" + case DHCPOptSIPServers: + return "SipServers" + case DHCPOptRequestIP: + return "RequestIP" + case DHCPOptLeaseTime: + return "LeaseTime" + case DHCPOptExtOptions: + return "ExtOpts" + case DHCPOptMessageType: + return "MessageType" + case DHCPOptServerID: + return "ServerID" + case DHCPOptParamsRequest: + return "ParamsRequest" + case DHCPOptMessage: + return "Message" + case DHCPOptMaxMessageSize: + return "MaxDHCPSize" + case DHCPOptT1: + return "Timer1" + case DHCPOptT2: + return "Timer2" + case DHCPOptClassID: + return "ClassID" + case DHCPOptClientID: + return "ClientID" + case DHCPOptDomainSearch: + return "DomainSearch" + case DHCPOptClasslessStaticRoute: + return "ClasslessStaticRoute" + default: + return "Unknown" + } +} + +// DHCPOption rerpresents a DHCP option. +type DHCPOption struct { + Type DHCPOpt + Length uint8 + Data []byte +} + +// String returns a string version of a DHCP Option. +func (o DHCPOption) String() string { + switch o.Type { + + case DHCPOptHostname, DHCPOptMeritDumpFile, DHCPOptDomainName, DHCPOptRootPath, + DHCPOptExtensionsPath, DHCPOptNISDomain, DHCPOptNetBIOSTCPScope, DHCPOptXFontServer, + DHCPOptXDisplayManager, DHCPOptMessage, DHCPOptDomainSearch: // string + return fmt.Sprintf("Option(%s:%s)", o.Type, string(o.Data)) + + case DHCPOptMessageType: + if len(o.Data) != 1 { + return fmt.Sprintf("Option(%s:INVALID)", o.Type) + } + return fmt.Sprintf("Option(%s:%s)", o.Type, DHCPMsgType(o.Data[0])) + + case DHCPOptSubnetMask, DHCPOptServerID, DHCPOptBroadcastAddr, + DHCPOptSolicitAddr, DHCPOptRequestIP: // net.IP + if len(o.Data) < 4 { + return fmt.Sprintf("Option(%s:INVALID)", o.Type) + } + return fmt.Sprintf("Option(%s:%s)", o.Type, net.IP(o.Data)) + + case DHCPOptT1, DHCPOptT2, DHCPOptLeaseTime, DHCPOptPathMTUAgingTimeout, + DHCPOptARPTimeout, DHCPOptTCPKeepAliveInt: // uint32 + if len(o.Data) != 4 { + return fmt.Sprintf("Option(%s:INVALID)", o.Type) + } + return fmt.Sprintf("Option(%s:%d)", o.Type, + uint32(o.Data[0])<<24|uint32(o.Data[1])<<16|uint32(o.Data[2])<<8|uint32(o.Data[3])) + + case DHCPOptParamsRequest: + buf := &bytes.Buffer{} + buf.WriteString(fmt.Sprintf("Option(%s:", o.Type)) + for i, v := range o.Data { + buf.WriteString(DHCPOpt(v).String()) + if i+1 != len(o.Data) { + buf.WriteByte(',') + } + } + buf.WriteString(")") + return buf.String() + + default: + return fmt.Sprintf("Option(%s:%v)", o.Type, o.Data) + } +} + +// NewDHCPOption constructs a new DHCPOption with a given type and data. +func NewDHCPOption(t DHCPOpt, data []byte) DHCPOption { + o := DHCPOption{Type: t} + if data != nil { + o.Data = data + o.Length = uint8(len(data)) + } + return o +} + +func (o *DHCPOption) encode(b []byte) error { + switch o.Type { + case DHCPOptPad, DHCPOptEnd: + b[0] = byte(o.Type) + default: + if o.Length > 253 { + return errors.New("data too long to encode") + } + b[0] = byte(o.Type) + b[1] = o.Length + copy(b[2:], o.Data) + } + return nil +} + +func (o *DHCPOption) decode(data []byte) error { + if len(data) < 1 { + // Pad/End have a length of 1 + return errors.New("Not enough data to decode") + } + o.Type = DHCPOpt(data[0]) + switch o.Type { + case DHCPOptPad, DHCPOptEnd: + o.Data = nil + default: + if len(data) < 3 { + return errors.New("Not enough data to decode") + } + o.Length = data[1] + if o.Length > 253 { + return errors.New("data too long to decode") + } + o.Data = data[2 : 2+o.Length] + } + return nil +} diff --git a/vendor/github.com/google/gopacket/layers/dns.go b/vendor/github.com/google/gopacket/layers/dns.go new file mode 100644 index 0000000..2368a28 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/dns.go @@ -0,0 +1,894 @@ +// Copyright 2014 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 layers + +import ( + "encoding/binary" + "errors" + "fmt" + "net" + + "github.com/google/gopacket" +) + +// DNSClass defines the class associated with a request/response. Different DNS +// classes can be thought of as an array of parallel namespace trees. +type DNSClass uint16 + +// DNSClass known values. +const ( + DNSClassIN DNSClass = 1 // Internet + DNSClassCS DNSClass = 2 // the CSNET class (Obsolete) + DNSClassCH DNSClass = 3 // the CHAOS class + DNSClassHS DNSClass = 4 // Hesiod [Dyer 87] + DNSClassAny DNSClass = 255 // AnyClass +) + +func (dc DNSClass) String() string { + switch dc { + default: + return "Unknown" + case DNSClassIN: + return "IN" + case DNSClassCS: + return "CS" + case DNSClassCH: + return "CH" + case DNSClassHS: + return "HS" + case DNSClassAny: + return "Any" + } +} + +// DNSType defines the type of data being requested/returned in a +// question/answer. +type DNSType uint16 + +// DNSType known values. +const ( + DNSTypeA DNSType = 1 // a host address + DNSTypeNS DNSType = 2 // an authoritative name server + DNSTypeMD DNSType = 3 // a mail destination (Obsolete - use MX) + DNSTypeMF DNSType = 4 // a mail forwarder (Obsolete - use MX) + DNSTypeCNAME DNSType = 5 // the canonical name for an alias + DNSTypeSOA DNSType = 6 // marks the start of a zone of authority + DNSTypeMB DNSType = 7 // a mailbox domain name (EXPERIMENTAL) + DNSTypeMG DNSType = 8 // a mail group member (EXPERIMENTAL) + DNSTypeMR DNSType = 9 // a mail rename domain name (EXPERIMENTAL) + DNSTypeNULL DNSType = 10 // a null RR (EXPERIMENTAL) + DNSTypeWKS DNSType = 11 // a well known service description + DNSTypePTR DNSType = 12 // a domain name pointer + DNSTypeHINFO DNSType = 13 // host information + DNSTypeMINFO DNSType = 14 // mailbox or mail list information + DNSTypeMX DNSType = 15 // mail exchange + DNSTypeTXT DNSType = 16 // text strings + DNSTypeAAAA DNSType = 28 // a IPv6 host address [RFC3596] + DNSTypeSRV DNSType = 33 // server discovery [RFC2782] [RFC6195] +) + +func (dt DNSType) String() string { + switch dt { + default: + return "Unknown" + case DNSTypeA: + return "A" + case DNSTypeNS: + return "NS" + case DNSTypeMD: + return "MD" + case DNSTypeMF: + return "MF" + case DNSTypeCNAME: + return "CNAME" + case DNSTypeSOA: + return "SOA" + case DNSTypeMB: + return "MB" + case DNSTypeMG: + return "MG" + case DNSTypeMR: + return "MR" + case DNSTypeNULL: + return "NULL" + case DNSTypeWKS: + return "WKS" + case DNSTypePTR: + return "PTR" + case DNSTypeHINFO: + return "HINFO" + case DNSTypeMINFO: + return "MINFO" + case DNSTypeMX: + return "MX" + case DNSTypeTXT: + return "TXT" + case DNSTypeAAAA: + return "AAAA" + case DNSTypeSRV: + return "SRV" + } +} + +// DNSResponseCode provides response codes for question answers. +type DNSResponseCode uint8 + +// DNSResponseCode known values. +const ( + DNSResponseCodeNoErr DNSResponseCode = 0 // No error + DNSResponseCodeFormErr DNSResponseCode = 1 // Format Error [RFC1035] + DNSResponseCodeServFail DNSResponseCode = 2 // Server Failure [RFC1035] + DNSResponseCodeNXDomain DNSResponseCode = 3 // Non-Existent Domain [RFC1035] + DNSResponseCodeNotImp DNSResponseCode = 4 // Not Implemented [RFC1035] + DNSResponseCodeRefused DNSResponseCode = 5 // Query Refused [RFC1035] + DNSResponseCodeYXDomain DNSResponseCode = 6 // Name Exists when it should not [RFC2136] + DNSResponseCodeYXRRSet DNSResponseCode = 7 // RR Set Exists when it should not [RFC2136] + DNSResponseCodeNXRRSet DNSResponseCode = 8 // RR Set that should exist does not [RFC2136] + DNSResponseCodeNotAuth DNSResponseCode = 9 // Server Not Authoritative for zone [RFC2136] + DNSResponseCodeNotZone DNSResponseCode = 10 // Name not contained in zone [RFC2136] + DNSResponseCodeBadVers DNSResponseCode = 16 // Bad OPT Version [RFC2671] + DNSResponseCodeBadSig DNSResponseCode = 16 // TSIG Signature Failure [RFC2845] + DNSResponseCodeBadKey DNSResponseCode = 17 // Key not recognized [RFC2845] + DNSResponseCodeBadTime DNSResponseCode = 18 // Signature out of time window [RFC2845] + DNSResponseCodeBadMode DNSResponseCode = 19 // Bad TKEY Mode [RFC2930] + DNSResponseCodeBadName DNSResponseCode = 20 // Duplicate key name [RFC2930] + DNSResponseCodeBadAlg DNSResponseCode = 21 // Algorithm not supported [RFC2930] + DNSResponseCodeBadTruc DNSResponseCode = 22 // Bad Truncation [RFC4635] +) + +func (drc DNSResponseCode) String() string { + switch drc { + default: + return "Unknown" + case DNSResponseCodeNoErr: + return "No Error" + case DNSResponseCodeFormErr: + return "Format Error" + case DNSResponseCodeServFail: + return "Server Failure " + case DNSResponseCodeNXDomain: + return "Non-Existent Domain" + case DNSResponseCodeNotImp: + return "Not Implemented" + case DNSResponseCodeRefused: + return "Query Refused" + case DNSResponseCodeYXDomain: + return "Name Exists when it should not" + case DNSResponseCodeYXRRSet: + return "RR Set Exists when it should not" + case DNSResponseCodeNXRRSet: + return "RR Set that should exist does not" + case DNSResponseCodeNotAuth: + return "Server Not Authoritative for zone" + case DNSResponseCodeNotZone: + return "Name not contained in zone" + case DNSResponseCodeBadVers: + return "Bad OPT Version" + case DNSResponseCodeBadKey: + return "Key not recognized" + case DNSResponseCodeBadTime: + return "Signature out of time window" + case DNSResponseCodeBadMode: + return "Bad TKEY Mode" + case DNSResponseCodeBadName: + return "Duplicate key name" + case DNSResponseCodeBadAlg: + return "Algorithm not supported" + case DNSResponseCodeBadTruc: + return "Bad Truncation" + } +} + +// DNSOpCode defines a set of different operation types. +type DNSOpCode uint8 + +// DNSOpCode known values. +const ( + DNSOpCodeQuery DNSOpCode = 0 // Query [RFC1035] + DNSOpCodeIQuery DNSOpCode = 1 // Inverse Query Obsolete [RFC3425] + DNSOpCodeStatus DNSOpCode = 2 // Status [RFC1035] + DNSOpCodeNotify DNSOpCode = 4 // Notify [RFC1996] + DNSOpCodeUpdate DNSOpCode = 5 // Update [RFC2136] +) + +func (doc DNSOpCode) String() string { + switch doc { + default: + return "Unknown" + case DNSOpCodeQuery: + return "Query" + case DNSOpCodeIQuery: + return "Inverse Query" + case DNSOpCodeStatus: + return "Status" + case DNSOpCodeNotify: + return "Notify" + case DNSOpCodeUpdate: + return "Update" + } +} + +// DNS is specified in RFC 1034 / RFC 1035 +// +---------------------+ +// | Header | +// +---------------------+ +// | Question | the question for the name server +// +---------------------+ +// | Answer | RRs answering the question +// +---------------------+ +// | Authority | RRs pointing toward an authority +// +---------------------+ +// | Additional | RRs holding additional information +// +---------------------+ +// +// DNS Header +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | ID | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// |QR| Opcode |AA|TC|RD|RA| Z | RCODE | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | QDCOUNT | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | ANCOUNT | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | NSCOUNT | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | ARCOUNT | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + +// DNS contains data from a single Domain Name Service packet. +type DNS struct { + BaseLayer + + // Header fields + ID uint16 + QR bool + OpCode DNSOpCode + + AA bool // Authoritative answer + TC bool // Truncated + RD bool // Recursion desired + RA bool // Recursion available + Z uint8 // Resrved for future use + + ResponseCode DNSResponseCode + QDCount uint16 // Number of questions to expect + ANCount uint16 // Number of answers to expect + NSCount uint16 // Number of authorities to expect + ARCount uint16 // Number of additional records to expect + + // Entries + Questions []DNSQuestion + Answers []DNSResourceRecord + Authorities []DNSResourceRecord + Additionals []DNSResourceRecord + + // buffer for doing name decoding. We use a single reusable buffer to avoid + // name decoding on a single object via multiple DecodeFromBytes calls + // requiring constant allocation of small byte slices. + buffer []byte +} + +// LayerType returns gopacket.LayerTypeDNS. +func (d *DNS) LayerType() gopacket.LayerType { return LayerTypeDNS } + +// decodeDNS decodes the byte slice into a DNS type. It also +// setups the application Layer in PacketBuilder. +func decodeDNS(data []byte, p gopacket.PacketBuilder) error { + d := &DNS{} + err := d.DecodeFromBytes(data, p) + if err != nil { + return err + } + p.AddLayer(d) + p.SetApplicationLayer(d) + return nil +} + +// DecodeFromBytes decodes the slice into the DNS struct. +func (d *DNS) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + d.buffer = d.buffer[:0] + + if len(data) < 12 { + df.SetTruncated() + return errors.New("DNS packet too short") + } + + // since there are no further layers, the baselayer's content is + // pointing to this layer + d.BaseLayer = BaseLayer{Contents: data[:len(data)]} + d.ID = binary.BigEndian.Uint16(data[:2]) + d.QR = data[2]&0x80 != 0 + d.OpCode = DNSOpCode(data[2]>>3) & 0x0F + d.AA = data[2]&0x04 != 0 + d.TC = data[2]&0x02 != 0 + d.RD = data[2]&0x01 != 0 + d.RA = data[3]&0x80 != 0 + d.Z = uint8(data[3]>>4) & 0x7 + d.ResponseCode = DNSResponseCode(data[3] & 0xF) + d.QDCount = binary.BigEndian.Uint16(data[4:6]) + d.ANCount = binary.BigEndian.Uint16(data[6:8]) + d.NSCount = binary.BigEndian.Uint16(data[8:10]) + d.ARCount = binary.BigEndian.Uint16(data[10:12]) + + d.Questions = d.Questions[:0] + d.Answers = d.Answers[:0] + d.Authorities = d.Authorities[:0] + d.Additionals = d.Additionals[:0] + + offset := 12 + var err error + for i := 0; i < int(d.QDCount); i++ { + var q DNSQuestion + if offset, err = q.decode(data, offset, df, &d.buffer); err != nil { + return err + } + d.Questions = append(d.Questions, q) + } + + // For some horrible reason, if we do the obvious thing in this loop: + // var r DNSResourceRecord + // if blah := r.decode(blah); err != nil { + // return err + // } + // d.Foo = append(d.Foo, r) + // the Go compiler thinks that 'r' escapes to the heap, causing a malloc for + // every Answer, Authority, and Additional. To get around this, we do + // something really silly: we append an empty resource record to our slice, + // then use the last value in the slice to call decode. Since the value is + // already in the slice, there's no WAY it can escape... on the other hand our + // code is MUCH uglier :( + for i := 0; i < int(d.ANCount); i++ { + d.Answers = append(d.Answers, DNSResourceRecord{}) + if offset, err = d.Answers[i].decode(data, offset, df, &d.buffer); err != nil { + d.Answers = d.Answers[:i] // strip off erroneous value + return err + } + } + for i := 0; i < int(d.NSCount); i++ { + d.Authorities = append(d.Authorities, DNSResourceRecord{}) + if offset, err = d.Authorities[i].decode(data, offset, df, &d.buffer); err != nil { + d.Authorities = d.Authorities[:i] // strip off erroneous value + return err + } + } + for i := 0; i < int(d.ARCount); i++ { + d.Additionals = append(d.Additionals, DNSResourceRecord{}) + if offset, err = d.Additionals[i].decode(data, offset, df, &d.buffer); err != nil { + d.Additionals = d.Additionals[:i] // strip off erroneous value + return err + } + } + + if uint16(len(d.Questions)) != d.QDCount { + return errors.New("Invalid query decoding, not the right number of questions") + } else if uint16(len(d.Answers)) != d.ANCount { + return errors.New("Invalid query decoding, not the right number of answers") + } else if uint16(len(d.Authorities)) != d.NSCount { + return errors.New("Invalid query decoding, not the right number of authorities") + } else if uint16(len(d.Additionals)) != d.ARCount { + return errors.New("Invalid query decoding, not the right number of additionals info") + } + return nil +} + +// CanDecode implements gopacket.DecodingLayer. +func (d *DNS) CanDecode() gopacket.LayerClass { + return LayerTypeDNS +} + +// NextLayerType implements gopacket.DecodingLayer. +func (d *DNS) NextLayerType() gopacket.LayerType { + return gopacket.LayerTypePayload +} + +// Payload returns nil. +func (d *DNS) Payload() []byte { + return nil +} + +func b2i(b bool) int { + if b { + return 1 + } + return 0 +} + +func recSize(rr *DNSResourceRecord) int { + switch rr.Type { + case DNSTypeA: + return 4 + case DNSTypeAAAA: + return 16 + case DNSTypeNS: + return len(rr.NS) + 2 + case DNSTypeCNAME: + return len(rr.CNAME) + 2 + case DNSTypePTR: + return len(rr.PTR) + 2 + case DNSTypeSOA: + return len(rr.SOA.MName) + 2 + len(rr.SOA.RName) + 2 + 20 + case DNSTypeMX: + return 2 + len(rr.MX.Name) + 2 + case DNSTypeTXT: + l := len(rr.TXTs) + for _, txt := range rr.TXTs { + l += len(txt) + } + return l + case DNSTypeSRV: + return 6 + len(rr.SRV.Name) + 2 + } + + return 0 +} + +func computeSize(recs []DNSResourceRecord) int { + sz := 0 + for _, rr := range recs { + sz += len(rr.Name) + 14 + sz += recSize(&rr) + } + return sz +} + +// SerializeTo writes the serialized form of this layer into the +// SerializationBuffer, implementing gopacket.SerializableLayer. +func (d *DNS) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + dsz := 0 + for _, q := range d.Questions { + dsz += len(q.Name) + 6 + } + dsz += computeSize(d.Answers) + dsz += computeSize(d.Authorities) + dsz += computeSize(d.Additionals) + + bytes, err := b.PrependBytes(12 + dsz) + if err != nil { + return err + } + binary.BigEndian.PutUint16(bytes, d.ID) + bytes[2] = byte((b2i(d.QR) << 7) | (int(d.OpCode) << 3) | (b2i(d.AA) << 2) | (b2i(d.TC) << 1) | b2i(d.RD)) + bytes[3] = byte((b2i(d.RA) << 7) | (int(d.Z) << 4) | int(d.ResponseCode)) + + if opts.FixLengths { + d.QDCount = uint16(len(d.Questions)) + d.ANCount = uint16(len(d.Answers)) + d.NSCount = uint16(len(d.Authorities)) + d.ARCount = uint16(len(d.Additionals)) + } + binary.BigEndian.PutUint16(bytes[4:], d.QDCount) + binary.BigEndian.PutUint16(bytes[6:], d.ANCount) + binary.BigEndian.PutUint16(bytes[8:], d.NSCount) + binary.BigEndian.PutUint16(bytes[10:], d.ARCount) + + off := 12 + for _, qd := range d.Questions { + n := qd.encode(bytes, off) + off += n + } + + for i := range d.Answers { + // done this way so we can modify DNSResourceRecord to fix + // lengths if requested + qa := &d.Answers[i] + n, err := qa.encode(bytes, off, opts) + if err != nil { + return err + } + off += n + } + + for i := range d.Authorities { + qa := &d.Authorities[i] + n, err := qa.encode(bytes, off, opts) + if err != nil { + return err + } + off += n + } + for i := range d.Additionals { + qa := &d.Additionals[i] + n, err := qa.encode(bytes, off, opts) + if err != nil { + return err + } + off += n + } + + return nil +} + +var errMaxRecursion = errors.New("max DNS recursion level hit") + +const maxRecursionLevel = 255 + +func decodeName(data []byte, offset int, buffer *[]byte, level int) ([]byte, int, error) { + if level > maxRecursionLevel { + return nil, 0, errMaxRecursion + } else if offset >= len(data) { + return nil, 0, errors.New("dns name offset too high") + } else if offset < 0 { + return nil, 0, errors.New("dns name offset is negative") + } + start := len(*buffer) + index := offset + if data[index] == 0x00 { + return nil, index + 1, nil + } +loop: + for data[index] != 0x00 { + switch data[index] & 0xc0 { + default: + /* RFC 1035 + A domain name represented as a sequence of labels, where + each label consists of a length octet followed by that + number of octets. The domain name terminates with the + zero length octet for the null label of the root. Note + that this field may be an odd number of octets; no + padding is used. + */ + index2 := index + int(data[index]) + 1 + if index2-offset > 255 { + return nil, 0, errors.New("dns name is too long") + } else if index2 < index+1 || index2 > len(data) { + return nil, 0, errors.New("dns name uncomputable: invalid index") + } + *buffer = append(*buffer, '.') + *buffer = append(*buffer, data[index+1:index2]...) + index = index2 + + case 0xc0: + /* RFC 1035 + The pointer takes the form of a two octet sequence. + + The first two bits are ones. This allows a pointer to + be distinguished from a label, since the label must + begin with two zero bits because labels are restricted + to 63 octets or less. (The 10 and 01 combinations are + reserved for future use.) The OFFSET field specifies + an offset from the start of the message (i.e., the + first octet of the ID field in the domain header). A + zero offset specifies the first byte of the ID field, + etc. + + The compression scheme allows a domain name in a message to be + represented as either: + - a sequence of labels ending in a zero octet + - a pointer + - a sequence of labels ending with a pointer + */ + if index+2 > len(data) { + return nil, 0, errors.New("dns offset pointer too high") + } + offsetp := int(binary.BigEndian.Uint16(data[index:index+2]) & 0x3fff) + if offsetp > len(data) { + return nil, 0, errors.New("dns offset pointer too high") + } + // This looks a little tricky, but actually isn't. Because of how + // decodeName is written, calling it appends the decoded name to the + // current buffer. We already have the start of the buffer, then, so + // once this call is done buffer[start:] will contain our full name. + _, _, err := decodeName(data, offsetp, buffer, level+1) + if err != nil { + return nil, 0, err + } + index++ // pointer is two bytes, so add an extra byte here. + break loop + /* EDNS, or other DNS option ? */ + case 0x40: // RFC 2673 + return nil, 0, fmt.Errorf("qname '0x40' - RFC 2673 unsupported yet (data=%x index=%d)", + data[index], index) + + case 0x80: + return nil, 0, fmt.Errorf("qname '0x80' unsupported yet (data=%x index=%d)", + data[index], index) + } + if index >= len(data) { + return nil, 0, errors.New("dns index walked out of range") + } + } + if len(*buffer) <= start { + return nil, 0, errors.New("no dns data found for name") + } + return (*buffer)[start+1:], index + 1, nil +} + +// DNSQuestion wraps a single request (question) within a DNS query. +type DNSQuestion struct { + Name []byte + Type DNSType + Class DNSClass +} + +func (q *DNSQuestion) decode(data []byte, offset int, df gopacket.DecodeFeedback, buffer *[]byte) (int, error) { + name, endq, err := decodeName(data, offset, buffer, 1) + if err != nil { + return 0, err + } + + q.Name = name + q.Type = DNSType(binary.BigEndian.Uint16(data[endq : endq+2])) + q.Class = DNSClass(binary.BigEndian.Uint16(data[endq+2 : endq+4])) + + return endq + 4, nil +} + +func (q *DNSQuestion) encode(data []byte, offset int) int { + noff := encodeName(q.Name, data, offset) + binary.BigEndian.PutUint16(data[noff:], uint16(q.Type)) + binary.BigEndian.PutUint16(data[noff+2:], uint16(q.Class)) + return len(q.Name) + 6 +} + +// DNSResourceRecord +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | | +// / / +// / NAME / +// | | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | TYPE | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | CLASS | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | TTL | +// | | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | RDLENGTH | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--| +// / RDATA / +// / / +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + +// DNSResourceRecord wraps the data from a single DNS resource within a +// response. +type DNSResourceRecord struct { + // Header + Name []byte + Type DNSType + Class DNSClass + TTL uint32 + + // RDATA Raw Values + DataLength uint16 + Data []byte + + // RDATA Decoded Values + IP net.IP + NS, CNAME, PTR []byte + TXTs [][]byte + SOA DNSSOA + SRV DNSSRV + MX DNSMX + + // Undecoded TXT for backward compatibility + TXT []byte +} + +// decode decodes the resource record, returning the total length of the record. +func (rr *DNSResourceRecord) decode(data []byte, offset int, df gopacket.DecodeFeedback, buffer *[]byte) (int, error) { + name, endq, err := decodeName(data, offset, buffer, 1) + if err != nil { + return 0, err + } + + rr.Name = name + rr.Type = DNSType(binary.BigEndian.Uint16(data[endq : endq+2])) + rr.Class = DNSClass(binary.BigEndian.Uint16(data[endq+2 : endq+4])) + rr.TTL = binary.BigEndian.Uint32(data[endq+4 : endq+8]) + rr.DataLength = binary.BigEndian.Uint16(data[endq+8 : endq+10]) + end := endq + 10 + int(rr.DataLength) + if end > len(data) { + return 0, fmt.Errorf("resource record length exceeds data") + } + rr.Data = data[endq+10 : end] + + if err = rr.decodeRData(data, endq+10, buffer); err != nil { + return 0, err + } + + return endq + 10 + int(rr.DataLength), nil +} + +func encodeName(name []byte, data []byte, offset int) int { + l := 0 + for i := range name { + if name[i] == '.' { + data[offset+i-l] = byte(l) + l = 0 + } else { + // skip one to write the length + data[offset+i+1] = name[i] + l++ + } + } + // length for final portion + data[offset+len(name)-l] = byte(l) + data[offset+len(name)+1] = 0x00 // terminal + return offset + len(name) + 2 +} + +func (rr *DNSResourceRecord) encode(data []byte, offset int, opts gopacket.SerializeOptions) (int, error) { + + noff := encodeName(rr.Name, data, offset) + + binary.BigEndian.PutUint16(data[noff:], uint16(rr.Type)) + binary.BigEndian.PutUint16(data[noff+2:], uint16(rr.Class)) + binary.BigEndian.PutUint32(data[noff+4:], uint32(rr.TTL)) + + switch rr.Type { + case DNSTypeA: + copy(data[noff+10:], rr.IP.To4()) + case DNSTypeAAAA: + copy(data[noff+10:], rr.IP) + case DNSTypeNS: + encodeName(rr.NS, data, noff+10) + case DNSTypeCNAME: + encodeName(rr.CNAME, data, noff+10) + case DNSTypePTR: + encodeName(rr.PTR, data, noff+10) + case DNSTypeSOA: + noff2 := encodeName(rr.SOA.MName, data, noff+10) + noff2 = encodeName(rr.SOA.RName, data, noff2) + binary.BigEndian.PutUint32(data[noff2:], rr.SOA.Serial) + binary.BigEndian.PutUint32(data[noff2+4:], rr.SOA.Refresh) + binary.BigEndian.PutUint32(data[noff2+8:], rr.SOA.Retry) + binary.BigEndian.PutUint32(data[noff2+12:], rr.SOA.Expire) + binary.BigEndian.PutUint32(data[noff2+16:], rr.SOA.Minimum) + case DNSTypeMX: + binary.BigEndian.PutUint16(data[noff+10:], rr.MX.Preference) + encodeName(rr.MX.Name, data, noff+12) + case DNSTypeTXT: + noff2 := noff + 10 + for _, txt := range rr.TXTs { + data[noff2] = byte(len(txt)) + copy(data[noff2+1:], txt) + noff2 += 1 + len(txt) + } + case DNSTypeSRV: + binary.BigEndian.PutUint16(data[noff+10:], rr.SRV.Priority) + binary.BigEndian.PutUint16(data[noff+12:], rr.SRV.Weight) + binary.BigEndian.PutUint16(data[noff+14:], rr.SRV.Port) + encodeName(rr.SRV.Name, data, noff+16) + default: + return 0, fmt.Errorf("serializing resource record of type %v not supported", rr.Type) + } + + // DataLength + dSz := recSize(rr) + binary.BigEndian.PutUint16(data[noff+8:], uint16(dSz)) + + if opts.FixLengths { + rr.DataLength = uint16(dSz) + } + + return len(rr.Name) + 1 + 11 + dSz, nil +} + +func (rr *DNSResourceRecord) String() string { + + if rr.Class == DNSClassIN { + switch rr.Type { + case DNSTypeA, DNSTypeAAAA: + return rr.IP.String() + case DNSTypeNS: + return "NS " + string(rr.NS) + case DNSTypeCNAME: + return "CNAME " + string(rr.CNAME) + case DNSTypePTR: + return "PTR " + string(rr.PTR) + case DNSTypeTXT: + return "TXT " + string(rr.TXT) + } + } + + return fmt.Sprintf("<%v, %v>", rr.Class, rr.Type) +} + +func decodeCharacterStrings(data []byte) ([][]byte, error) { + strings := make([][]byte, 0, 1) + end := len(data) + for index, index2 := 0, 0; index != end; index = index2 { + index2 = index + 1 + int(data[index]) // index increases by 1..256 and does not overflow + if index2 > end { + return nil, errors.New("Insufficient data for a <character-string>") + } + strings = append(strings, data[index+1:index2]) + } + return strings, nil +} + +func (rr *DNSResourceRecord) decodeRData(data []byte, offset int, buffer *[]byte) error { + switch rr.Type { + case DNSTypeA: + rr.IP = rr.Data + case DNSTypeAAAA: + rr.IP = rr.Data + case DNSTypeTXT, DNSTypeHINFO: + rr.TXT = rr.Data + txts, err := decodeCharacterStrings(rr.Data) + if err != nil { + return err + } + rr.TXTs = txts + case DNSTypeNS: + name, _, err := decodeName(data, offset, buffer, 1) + if err != nil { + return err + } + rr.NS = name + case DNSTypeCNAME: + name, _, err := decodeName(data, offset, buffer, 1) + if err != nil { + return err + } + rr.CNAME = name + case DNSTypePTR: + name, _, err := decodeName(data, offset, buffer, 1) + if err != nil { + return err + } + rr.PTR = name + case DNSTypeSOA: + name, endq, err := decodeName(data, offset, buffer, 1) + if err != nil { + return err + } + rr.SOA.MName = name + name, endq, err = decodeName(data, endq, buffer, 1) + if err != nil { + return err + } + rr.SOA.RName = name + rr.SOA.Serial = binary.BigEndian.Uint32(data[endq : endq+4]) + rr.SOA.Refresh = binary.BigEndian.Uint32(data[endq+4 : endq+8]) + rr.SOA.Retry = binary.BigEndian.Uint32(data[endq+8 : endq+12]) + rr.SOA.Expire = binary.BigEndian.Uint32(data[endq+12 : endq+16]) + rr.SOA.Minimum = binary.BigEndian.Uint32(data[endq+16 : endq+20]) + case DNSTypeMX: + rr.MX.Preference = binary.BigEndian.Uint16(data[offset : offset+2]) + name, _, err := decodeName(data, offset+2, buffer, 1) + if err != nil { + return err + } + rr.MX.Name = name + case DNSTypeSRV: + rr.SRV.Priority = binary.BigEndian.Uint16(data[offset : offset+2]) + rr.SRV.Weight = binary.BigEndian.Uint16(data[offset+2 : offset+4]) + rr.SRV.Port = binary.BigEndian.Uint16(data[offset+4 : offset+6]) + name, _, err := decodeName(data, offset+6, buffer, 1) + if err != nil { + return err + } + rr.SRV.Name = name + } + return nil +} + +// DNSSOA is a Start of Authority record. Each domain requires a SOA record at +// the cutover where a domain is delegated from its parent. +type DNSSOA struct { + MName, RName []byte + Serial, Refresh, Retry, Expire, Minimum uint32 +} + +// DNSSRV is a Service record, defining a location (hostname/port) of a +// server/service. +type DNSSRV struct { + Priority, Weight, Port uint16 + Name []byte +} + +// DNSMX is a mail exchange record, defining a mail server for a recipient's +// domain. +type DNSMX struct { + Preference uint16 + Name []byte +} diff --git a/vendor/github.com/google/gopacket/layers/dns_test.go b/vendor/github.com/google/gopacket/layers/dns_test.go new file mode 100644 index 0000000..264513b --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/dns_test.go @@ -0,0 +1,833 @@ +// 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 layers + +import ( + "bytes" + "net" + "strings" + "testing" + + "github.com/google/gopacket" +) + +// testPacketDNSRegression is the packet: +// 11:08:05.708342 IP 109.194.160.4.57766 > 95.211.92.14.53: 63000% [1au] A? picslife.ru. (40) +// 0x0000: 0022 19b6 7e22 000f 35bb 0b40 0800 4500 ."..~"..5..@..E. +// 0x0010: 0044 89c4 0000 3811 2f3d 6dc2 a004 5fd3 .D....8./=m..._. +// 0x0020: 5c0e e1a6 0035 0030 a597 f618 0010 0001 \....5.0........ +// 0x0030: 0000 0000 0001 0870 6963 736c 6966 6502 .......picslife. +// 0x0040: 7275 0000 0100 0100 0029 1000 0000 8000 ru.......)...... +// 0x0050: 0000 .. +var testPacketDNSRegression = []byte{ + 0x00, 0x22, 0x19, 0xb6, 0x7e, 0x22, 0x00, 0x0f, 0x35, 0xbb, 0x0b, 0x40, 0x08, 0x00, 0x45, 0x00, + 0x00, 0x44, 0x89, 0xc4, 0x00, 0x00, 0x38, 0x11, 0x2f, 0x3d, 0x6d, 0xc2, 0xa0, 0x04, 0x5f, 0xd3, + 0x5c, 0x0e, 0xe1, 0xa6, 0x00, 0x35, 0x00, 0x30, 0xa5, 0x97, 0xf6, 0x18, 0x00, 0x10, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x70, 0x69, 0x63, 0x73, 0x6c, 0x69, 0x66, 0x65, 0x02, + 0x72, 0x75, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x29, 0x10, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, +} + +func TestPacketDNSRegression(t *testing.T) { + p := gopacket.NewPacket(testPacketDNSRegression, LinkTypeEthernet, testDecodeOptions) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeEthernet, LayerTypeIPv4, LayerTypeUDP, LayerTypeDNS}, t) +} +func BenchmarkDecodePacketDNSRegression(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testPacketDNSRegression, LinkTypeEthernet, gopacket.NoCopy) + } +} + +// response to `dig TXT google.com` over IPv4 link: +var testParseDNSTypeTXTValue = `v=spf1 include:_spf.google.com ~all` +var testParseDNSTypeTXT = []byte{ + 0x02, 0x00, 0x00, 0x00, // PF_INET + 0x45, 0x00, 0x00, 0x73, 0x00, 0x00, 0x40, 0x00, 0x39, 0x11, 0x64, 0x98, 0xd0, 0x43, 0xde, 0xde, + 0x0a, 0xba, 0x23, 0x06, 0x00, 0x35, 0x81, 0xb2, 0x00, 0x5f, 0xdc, 0xb5, 0x98, 0x71, 0x81, 0x80, + 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x06, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x03, + 0x63, 0x6f, 0x6d, 0x00, 0x00, 0x10, 0x00, 0x01, 0xc0, 0x0c, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, + 0x0e, 0x10, 0x00, 0x24, 0x23, 0x76, 0x3d, 0x73, 0x70, 0x66, 0x31, 0x20, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x3a, 0x5f, 0x73, 0x70, 0x66, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x63, 0x6f, 0x6d, 0x20, 0x7e, 0x61, 0x6c, 0x6c, 0x00, 0x00, 0x29, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, +} + +func TestParseDNSTypeTXT(t *testing.T) { + p := gopacket.NewPacket(testParseDNSTypeTXT, LinkTypeNull, testDecodeOptions) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeLoopback, LayerTypeIPv4, LayerTypeUDP, LayerTypeDNS}, t) + answers := p.Layer(LayerTypeDNS).(*DNS).Answers + if len(answers) != 1 { + t.Error("Failed to parse 1 DNS answer") + } + if len(answers[0].TXTs) != 1 { + t.Error("Failed to parse 1 TXT record") + } + txt := string(answers[0].TXTs[0]) + if txt != testParseDNSTypeTXTValue { + t.Errorf("Incorrect TXT value, expected %q, got %q", testParseDNSTypeTXTValue, txt) + } +} + +func testQuestionEqual(t *testing.T, i int, exp, got DNSQuestion) { + if !bytes.Equal(exp.Name, got.Name) { + t.Errorf("expected Questions[%d].Name = %v, got %v", i, string(exp.Name), string(got.Name)) + } + if exp.Type != got.Type { + t.Errorf("expected Questions[%d].Type = %v, got %v", i, exp.Type, got.Type) + } + if exp.Class != got.Class { + t.Errorf("expected Questions[%d].Class = %v, got %v", i, exp.Class, got.Class) + } +} + +func testResourceEqual(t *testing.T, i int, name string, exp, got DNSResourceRecord) { + if !bytes.Equal(exp.Name, got.Name) { + t.Errorf("expected %s[%d].Name = %v, got %v", name, i, string(exp.Name), string(got.Name)) + } + + if exp.Type != got.Type { + t.Errorf("expected %s[%d].Type = %v, got %v", name, i, exp.Type, got.Type) + } + + if exp.Class != got.Class { + t.Errorf("expected %s[%d].Class = %v, got %v", name, i, exp.Class, got.Class) + } + + if exp.TTL != got.TTL { + t.Errorf("expected %s[%d].TTL = %v, got %v", name, i, exp.TTL, got.TTL) + } + if exp.DataLength != got.DataLength { + t.Errorf("expected %s[%d].DataLength = %v, got %v", name, i, exp.DataLength, got.DataLength) + } + + // we don't check .Data + + if !exp.IP.Equal(got.IP) { + t.Errorf("expected %s[%d].IP = %v, got %v", name, i, exp.IP, got.IP) + } + if !bytes.Equal(exp.NS, got.NS) { + t.Errorf("expected %s[%d].NS = %v, got %v", name, i, exp.NS, got.NS) + } + if !bytes.Equal(exp.CNAME, got.CNAME) { + t.Errorf("expected %s[%d].CNAME = %v, got %v", name, i, exp.CNAME, got.CNAME) + } + if !bytes.Equal(exp.PTR, got.PTR) { + t.Errorf("expected %s[%d].PTR = %v, got %v", name, i, exp.PTR, got.PTR) + } + if len(exp.TXTs) != len(got.TXTs) { + t.Errorf("expected %s[%d].TXTs = %v, got %v", name, i, exp.TXTs, got.TXTs) + } + for j := range exp.TXTs { + if !bytes.Equal(exp.TXTs[j], got.TXTs[j]) { + t.Errorf("expected %s[%d].TXTs[%d] = %v, got %v", name, i, j, exp.TXTs[j], got.TXTs[j]) + } + } + + // SOA + if !bytes.Equal(exp.SOA.MName, got.SOA.MName) { + t.Errorf("expected %s[%d].SOA.MName = %v, got %v", name, i, exp.SOA.MName, got.SOA.MName) + } + if !bytes.Equal(exp.SOA.RName, got.SOA.RName) { + t.Errorf("expected %s[%d].SOA.RName = %v, got %v", name, i, exp.SOA.RName, got.SOA.RName) + } + if exp.SOA.Serial != got.SOA.Serial { + t.Errorf("expected %s[%d].SOA.Serial = %v, got %v", name, i, exp.SOA.Serial, got.SOA.Serial) + } + if exp.SOA.Refresh != got.SOA.Refresh { + t.Errorf("expected %s[%d].SOA.Refresh = %v, got %v", name, i, exp.SOA.Refresh, got.SOA.Refresh) + } + if exp.SOA.Retry != got.SOA.Retry { + t.Errorf("expected %s[%d].SOA.Retry = %v, got %v", name, i, exp.SOA.Retry, got.SOA.Retry) + } + if exp.SOA.Expire != got.SOA.Expire { + t.Errorf("expected %s[%d].SOA.Expire = %v, got %v", name, i, exp.SOA.Expire, got.SOA.Expire) + } + if exp.SOA.Minimum != got.SOA.Minimum { + t.Errorf("expected %s[%d].SOA.Minimum = %v, got %v", name, i, exp.SOA.Minimum, got.SOA.Minimum) + } + + // SRV + if !bytes.Equal(exp.SRV.Name, got.SRV.Name) { + t.Errorf("expected %s[%d].SRV.Name = %v, got %v", name, i, exp.SRV.Name, got.SRV.Name) + } + if exp.SRV.Weight != got.SRV.Weight { + t.Errorf("expected %s[%d].SRV.Weight = %v, got %v", name, i, exp.SRV.Weight, got.SRV.Weight) + } + if exp.SRV.Port != got.SRV.Port { + t.Errorf("expected %s[%d].SRV.Port = %v, got %v", name, i, exp.SRV.Port, got.SRV.Port) + } + // MX + if !bytes.Equal(exp.MX.Name, got.MX.Name) { + t.Errorf("expected %s[%d].MX.Name = %v, got %v", name, i, exp.MX.Name, got.MX.Name) + } + if exp.MX.Preference != got.MX.Preference { + t.Errorf("expected %s[%d].MX.Preference = %v, got %v", name, i, exp.MX.Preference, got.MX.Preference) + } +} + +func testDNSEqual(t *testing.T, exp, got *DNS) { + if exp.ID != got.ID { + t.Errorf("expected ID = %v, got %v", exp.ID, got.ID) + } + if exp.AA != got.AA { + t.Errorf("expected AA = %v, got %v", exp.AA, got.AA) + } + if exp.OpCode != got.OpCode { + t.Errorf("expected OpCode = %v, got %v", exp.OpCode, got.OpCode) + } + if exp.AA != got.AA { + t.Errorf("expected AA = %v, got %v", exp.AA, got.AA) + } + if exp.TC != got.TC { + t.Errorf("expected TC = %v, got %v", exp.TC, got.TC) + } + if exp.RD != got.RD { + t.Errorf("expected RD = %v, got %v", exp.RD, got.RD) + } + if exp.RA != got.RA { + t.Errorf("expected RA = %v, got %v", exp.RA, got.RA) + } + if exp.Z != got.Z { + t.Errorf("expected Z = %v, got %v", exp.Z, got.Z) + } + if exp.ResponseCode != got.ResponseCode { + t.Errorf("expected ResponseCode = %v, got %v", exp.ResponseCode, got.ResponseCode) + } + if exp.QDCount != got.QDCount { + t.Errorf("expected QDCount = %v, got %v", exp.QDCount, got.QDCount) + } + if exp.ANCount != got.ANCount { + t.Errorf("expected ANCount = %v, got %v", exp.ANCount, got.ANCount) + } + if exp.ANCount != got.ANCount { + t.Errorf("expected ANCount = %v, got %v", exp.ANCount, got.ANCount) + } + if exp.NSCount != got.NSCount { + t.Errorf("expected NSCount = %v, got %v", exp.NSCount, got.NSCount) + } + if exp.ARCount != got.ARCount { + t.Errorf("expected ARCount = %v, got %v", exp.ARCount, got.ARCount) + } + + if len(exp.Questions) != len(got.Questions) { + t.Errorf("expected %d Questions, got %d", len(exp.Questions), len(got.Questions)) + } + for i := range exp.Questions { + testQuestionEqual(t, i, exp.Questions[i], got.Questions[i]) + } + + if len(exp.Answers) != len(got.Answers) { + t.Errorf("expected %d Answers, got %d", len(exp.Answers), len(got.Answers)) + } + for i := range exp.Answers { + testResourceEqual(t, i, "Answers", exp.Answers[i], got.Answers[i]) + } + + if len(exp.Authorities) != len(got.Authorities) { + t.Errorf("expected %d Answers, got %d", len(exp.Authorities), len(got.Authorities)) + } + for i := range exp.Authorities { + testResourceEqual(t, i, "Authorities", exp.Authorities[i], got.Authorities[i]) + } + + if len(exp.Additionals) != len(got.Additionals) { + t.Errorf("expected %d Additionals, got %d", len(exp.Additionals), len(got.Additionals)) + } + for i := range exp.Additionals { + testResourceEqual(t, i, "Additionals", exp.Additionals[i], got.Additionals[i]) + } +} + +func TestDNSEncodeQuery(t *testing.T) { + dns := &DNS{ID: 1234, OpCode: DNSOpCodeQuery, RD: true} + dns.Questions = append(dns.Questions, + DNSQuestion{ + Name: []byte("example1.com"), + Type: DNSTypeA, + Class: DNSClassIN, + }) + + dns.Questions = append(dns.Questions, + DNSQuestion{ + Name: []byte("example2.com"), + Type: DNSTypeA, + Class: DNSClassIN, + }) + + buf := gopacket.NewSerializeBuffer() + opts := gopacket.SerializeOptions{FixLengths: true} + err := gopacket.SerializeLayers(buf, opts, dns) + if err != nil { + t.Fatal(err) + } + if int(dns.QDCount) != len(dns.Questions) { + t.Errorf("fix lengths did not adjust QDCount, expected %d got %d", len(dns.Questions), dns.QDCount) + } + + p2 := gopacket.NewPacket(buf.Bytes(), LayerTypeDNS, testDecodeOptions) + dns2 := p2.Layer(LayerTypeDNS).(*DNS) + testDNSEqual(t, dns, dns2) +} + +func TestDNSEncodeResponse(t *testing.T) { + dns := &DNS{ID: 1234, QR: true, OpCode: DNSOpCodeQuery, + AA: true, RD: true, RA: true} + dns.Questions = append(dns.Questions, + DNSQuestion{ + Name: []byte("example1.com"), + Type: DNSTypeA, + Class: DNSClassIN, + }) + dns.Questions = append(dns.Questions, + DNSQuestion{ + Name: []byte("www.example2.com"), + Type: DNSTypeAAAA, + Class: DNSClassIN, + }) + + dns.Answers = append(dns.Answers, + DNSResourceRecord{ + Name: []byte("example1.com"), + Type: DNSTypeA, + Class: DNSClassIN, + TTL: 1024, + IP: net.IP([]byte{1, 2, 3, 4}), + }) + + dns.Answers = append(dns.Answers, + DNSResourceRecord{ + Name: []byte("www.example2.com"), + Type: DNSTypeAAAA, + Class: DNSClassIN, + TTL: 1024, + IP: net.IP([]byte{5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4}), + }) + + dns.Answers = append(dns.Answers, + DNSResourceRecord{ + Name: []byte("www.example2.com"), + Type: DNSTypeCNAME, + Class: DNSClassIN, + TTL: 1024, + CNAME: []byte("example2.com"), + }) + + buf := gopacket.NewSerializeBuffer() + opts := gopacket.SerializeOptions{FixLengths: true} + err := gopacket.SerializeLayers(buf, opts, dns) + if err != nil { + t.Fatal(err) + } + if int(dns.ANCount) != len(dns.Answers) { + t.Errorf("fix lengths did not adjust ANCount, expected %d got %d", len(dns.Answers), dns.ANCount) + } + for i, a := range dns.Answers { + if a.DataLength == 0 { + t.Errorf("fix lengths did not adjust Answers[%d].DataLength", i) + } + } + + p2 := gopacket.NewPacket(buf.Bytes(), LayerTypeDNS, testDecodeOptions) + dns2 := p2.Layer(LayerTypeDNS).(*DNS) + testDNSEqual(t, dns, dns2) +} + +// testDNSMalformedPacket is the packet: +// 10:30:00.389666 IP 10.77.43.131.60718 > 10.1.0.17.53: 18245 updateD [b2&3=0x5420] [18516a] [12064q] [21584n] [12081au][|domain] +// 0x0000: 0000 0101 0000 4e96 1476 afa1 0800 4500 ......N..v....E. +// 0x0010: 0039 d431 0000 f311 b3a0 0a4d 2b83 0a01 .9.1.......M+... +// 0x0020: 0011 ed2e 0035 0025 0832 4745 5420 2f20 .....5.%.2GET./. +// 0x0030: 4854 5450 2f31 2e31 0d0a 486f 7374 3a20 HTTP/1.1..Host:. +// 0x0040: 7777 770d 0a0d 0a www.... +var testDNSMalformedPacket = []byte{ + 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x4e, 0x96, 0x14, 0x76, 0xaf, 0xa1, 0x08, 0x00, 0x45, 0x00, + 0x00, 0x39, 0xd4, 0x31, 0x00, 0x00, 0xf3, 0x11, 0xb3, 0xa0, 0x0a, 0x4d, 0x2b, 0x83, 0x0a, 0x01, + 0x00, 0x11, 0xed, 0x2e, 0x00, 0x35, 0x00, 0x25, 0x08, 0x32, 0x47, 0x45, 0x54, 0x20, 0x2f, 0x20, + 0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x31, 0x0d, 0x0a, 0x48, 0x6f, 0x73, 0x74, 0x3a, 0x20, + 0x77, 0x77, 0x77, 0x0d, 0x0a, 0x0d, 0x0a, +} + +func TestDNSMalformedPacket(t *testing.T) { + p := gopacket.NewPacket(testDNSMalformedPacket, LinkTypeEthernet, testDecodeOptions) + if errLayer := p.ErrorLayer(); errLayer == nil { + t.Error("No error layer on invalid DNS name") + } else if err := errLayer.Error(); !strings.Contains(err.Error(), "invalid index") { + t.Errorf("unexpected error message: %v", err) + } +} + +// testDNSMalformedPacket2 is the packet: +// 15:14:42.056054 IP 10.77.0.245.53 > 10.1.0.45.38769: 12625 zoneInit YXRRSet- [49833q],[|domain] +// 0x0000: 0055 22af c637 0022 55ac deac 0800 4500 .U"..7."U.....E. +// 0x0010: 0079 3767 4000 3911 f49d 0a4d 00f5 0a01 .y7g@.9....M.... +// 0x0020: 002d 0035 9771 0065 6377 3151 f057 c2a9 .-.5.q.ecw1Q.W.. +// 0x0030: fc6e e86a beb0 f7d4 8599 373e b5f8 9db2 .n.j......7>.... +// 0x0040: a399 21a1 9762 def1 def4 f5ab 5675 023e ..!..b......Vu.> +// 0x0050: c9ca 304f 178a c2ad f2fc 677a 0e4c b892 ..0O......gz.L.. +// 0x0060: ab71 09bb 1ea4 f7c4 fe47 7a39 868b 29a0 .q.......Gz9..). +// 0x0070: 62c4 d184 5b4e 8817 4cc0 d1d0 d430 11d3 b...[N..L....0.. +// 0x0080: d147 543f afc7 1a .GT?... +var testDNSMalformedPacket2 = []byte{ + 0x00, 0x55, 0x22, 0xaf, 0xc6, 0x37, 0x00, 0x22, 0x55, 0xac, 0xde, 0xac, 0x08, 0x00, 0x45, 0x00, + 0x00, 0x79, 0x37, 0x67, 0x40, 0x00, 0x39, 0x11, 0xf4, 0x9d, 0x0a, 0x4d, 0x00, 0xf5, 0x0a, 0x01, + 0x00, 0x2d, 0x00, 0x35, 0x97, 0x71, 0x00, 0x65, 0x63, 0x77, 0x31, 0x51, 0xf0, 0x57, 0xc2, 0xa9, + 0xfc, 0x6e, 0xe8, 0x6a, 0xbe, 0xb0, 0xf7, 0xd4, 0x85, 0x99, 0x37, 0x3e, 0xb5, 0xf8, 0x9d, 0xb2, + 0xa3, 0x99, 0x21, 0xa1, 0x97, 0x62, 0xde, 0xf1, 0xde, 0xf4, 0xf5, 0xab, 0x56, 0x75, 0x02, 0x3e, + 0xc9, 0xca, 0x30, 0x4f, 0x17, 0x8a, 0xc2, 0xad, 0xf2, 0xfc, 0x67, 0x7a, 0x0e, 0x4c, 0xb8, 0x92, + 0xab, 0x71, 0x09, 0xbb, 0x1e, 0xa4, 0xf7, 0xc4, 0xfe, 0x47, 0x7a, 0x39, 0x86, 0x8b, 0x29, 0xa0, + 0x62, 0xc4, 0xd1, 0x84, 0x5b, 0x4e, 0x88, 0x17, 0x4c, 0xc0, 0xd1, 0xd0, 0xd4, 0x30, 0x11, 0xd3, + 0xd1, 0x47, 0x54, 0x3f, 0xaf, 0xc7, 0x1a, +} + +func TestDNSMalformedPacket2(t *testing.T) { + p := gopacket.NewPacket(testDNSMalformedPacket2, LinkTypeEthernet, testDecodeOptions) + if errLayer := p.ErrorLayer(); errLayer == nil { + t.Error("No error layer on invalid DNS name") + } else if err := errLayer.Error(); !strings.Contains(err.Error(), "offset pointer too high") { + t.Errorf("unexpected error message: %v", err) + } +} + +// testMalformedRootQuery is the packet: +// 08:31:18.143065 IP 10.77.0.26.53 > 10.1.0.233.65071: 59508- 0/13/3 (508) +// 0x0000: 0055 22af c637 0022 55ac deac 0800 4500 .U"..7."U.....E. +// 0x0010: 0218 76b2 4000 7211 7ad2 0a4d 001a 0a01 ..v.@.r.z..M.... +// 0x0020: 00e9 0035 fe2f 0204 b8f5 e874 8100 0001 ...5./.....t.... +// 0x0030: 0000 000d 0003 0c61 786b 7663 6863 7063 .......axkvchcpc +// 0x0040: 7073 6c0a 7878 7878 7878 7878 7878 036e psl.xxxxxxxxxx.n +// 0x0050: 6574 0000 0100 0100 0002 0001 0000 0e10 et.............. +// 0x0060: 0014 016d 0c72 6f6f 742d 7365 7276 6572 ...m.root-server +// 0x0070: 7303 6e65 7400 c02d 0002 0001 0000 0e10 s.net..-........ +// 0x0080: 0014 0161 0c72 6f6f 742d 7365 7276 6572 ...a.root-server +// 0x0090: 7303 6e65 7400 c02d 0002 0001 0000 0e10 s.net..-........ +// 0x00a0: 0014 0169 0c72 6f6f 742d 7365 7276 6572 ...i.root-server +// 0x00b0: 7303 6e65 7400 c02d 0002 0001 0000 0e10 s.net..-........ +// 0x00c0: 0014 0162 0c72 6f6f 742d 7365 7276 6572 ...b.root-server +// 0x00d0: 7303 6e65 7400 c02d 0002 0001 0000 0e10 s.net..-........ +// 0x00e0: 0014 016c 0c72 6f6f 742d 7365 7276 6572 ...l.root-server +// 0x00f0: 7303 6e65 7400 c02d 0002 0001 0000 0e10 s.net..-........ +// 0x0100: 0014 0166 0c72 6f6f 742d 7365 7276 6572 ...f.root-server +// 0x0110: 7303 6e65 7400 c02d 0002 0001 0000 0e10 s.net..-........ +// 0x0120: 0014 0167 0c72 6f6f 742d 7365 7276 6572 ...g.root-server +// 0x0130: 7303 6e65 7400 c02d 0002 0001 0000 0e10 s.net..-........ +// 0x0140: 0014 0164 0c72 6f6f 742d 7365 7276 6572 ...d.root-server +// 0x0150: 7303 6e65 7400 c02d 0002 0001 0000 0e10 s.net..-........ +// 0x0160: 0014 0168 0c72 6f6f 742d 7365 7276 6572 ...h.root-server +// 0x0170: 7303 6e65 7400 c02d 0002 0001 0000 0e10 s.net..-........ +// 0x0180: 0014 0165 0c72 6f6f 742d 7365 7276 6572 ...e.root-server +// 0x0190: 7303 6e65 7400 c02d 0002 0001 0000 0e10 s.net..-........ +// 0x01a0: 0014 016a 0c72 6f6f 742d 7365 7276 6572 ...j.root-server +// 0x01b0: 7303 6e65 7400 c02d 0002 0001 0000 0e10 s.net..-........ +// 0x01c0: 0014 016b 0c72 6f6f 742d 7365 7276 6572 ...k.root-server +// 0x01d0: 7303 6e65 7400 c02d 0002 0001 0000 0e10 s.net..-........ +// 0x01e0: 0014 0163 0c72 6f6f 742d 7365 7276 6572 ...c.root-server +// 0x01f0: 7303 6e65 7400 c038 0001 0001 0000 0e10 s.net..8........ +// 0x0200: 0004 ca0c 1b21 c058 0001 0001 0000 0e10 .....!.X........ +// 0x0210: 0004 c629 0004 c078 0001 0001 0000 0e10 ...)...x........ +// 0x0220: 0004 c024 9411 ...$.. +var testMalformedRootQuery = []byte{ + 0x00, 0x55, 0x22, 0xaf, 0xc6, 0x37, 0x00, 0x22, 0x55, 0xac, 0xde, 0xac, 0x08, 0x00, 0x45, 0x00, + 0x02, 0x18, 0x76, 0xb2, 0x40, 0x00, 0x72, 0x11, 0x7a, 0xd2, 0x0a, 0x4d, 0x00, 0x1a, 0x0a, 0x01, + 0x00, 0xe9, 0x00, 0x35, 0xfe, 0x2f, 0x02, 0x04, 0xb8, 0xf5, 0xe8, 0x74, 0x81, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x0d, 0x00, 0x03, 0x0c, 0x61, 0x78, 0x6b, 0x76, 0x63, 0x68, 0x63, 0x70, 0x63, + 0x70, 0x73, 0x6c, 0x0a, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x03, 0x6e, + 0x65, 0x74, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x10, + 0x00, 0x14, 0x01, 0x6d, 0x0c, 0x72, 0x6f, 0x6f, 0x74, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x73, 0x03, 0x6e, 0x65, 0x74, 0x00, 0xc0, 0x2d, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x10, + 0x00, 0x14, 0x01, 0x61, 0x0c, 0x72, 0x6f, 0x6f, 0x74, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x73, 0x03, 0x6e, 0x65, 0x74, 0x00, 0xc0, 0x2d, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x10, + 0x00, 0x14, 0x01, 0x69, 0x0c, 0x72, 0x6f, 0x6f, 0x74, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x73, 0x03, 0x6e, 0x65, 0x74, 0x00, 0xc0, 0x2d, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x10, + 0x00, 0x14, 0x01, 0x62, 0x0c, 0x72, 0x6f, 0x6f, 0x74, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x73, 0x03, 0x6e, 0x65, 0x74, 0x00, 0xc0, 0x2d, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x10, + 0x00, 0x14, 0x01, 0x6c, 0x0c, 0x72, 0x6f, 0x6f, 0x74, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x73, 0x03, 0x6e, 0x65, 0x74, 0x00, 0xc0, 0x2d, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x10, + 0x00, 0x14, 0x01, 0x66, 0x0c, 0x72, 0x6f, 0x6f, 0x74, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x73, 0x03, 0x6e, 0x65, 0x74, 0x00, 0xc0, 0x2d, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x10, + 0x00, 0x14, 0x01, 0x67, 0x0c, 0x72, 0x6f, 0x6f, 0x74, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x73, 0x03, 0x6e, 0x65, 0x74, 0x00, 0xc0, 0x2d, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x10, + 0x00, 0x14, 0x01, 0x64, 0x0c, 0x72, 0x6f, 0x6f, 0x74, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x73, 0x03, 0x6e, 0x65, 0x74, 0x00, 0xc0, 0x2d, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x10, + 0x00, 0x14, 0x01, 0x68, 0x0c, 0x72, 0x6f, 0x6f, 0x74, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x73, 0x03, 0x6e, 0x65, 0x74, 0x00, 0xc0, 0x2d, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x10, + 0x00, 0x14, 0x01, 0x65, 0x0c, 0x72, 0x6f, 0x6f, 0x74, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x73, 0x03, 0x6e, 0x65, 0x74, 0x00, 0xc0, 0x2d, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x10, + 0x00, 0x14, 0x01, 0x6a, 0x0c, 0x72, 0x6f, 0x6f, 0x74, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x73, 0x03, 0x6e, 0x65, 0x74, 0x00, 0xc0, 0x2d, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x10, + 0x00, 0x14, 0x01, 0x6b, 0x0c, 0x72, 0x6f, 0x6f, 0x74, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x73, 0x03, 0x6e, 0x65, 0x74, 0x00, 0xc0, 0x2d, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x10, + 0x00, 0x14, 0x01, 0x63, 0x0c, 0x72, 0x6f, 0x6f, 0x74, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x73, 0x03, 0x6e, 0x65, 0x74, 0x00, 0xc0, 0x38, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x10, + 0x00, 0x04, 0xca, 0x0c, 0x1b, 0x21, 0xc0, 0x58, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x10, + 0x00, 0x04, 0xc6, 0x29, 0x00, 0x04, 0xc0, 0x78, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x10, + 0x00, 0x04, 0xc0, 0x24, 0x94, 0x11, +} + +func TestMalformedRootQuery(t *testing.T) { + p := gopacket.NewPacket(testMalformedRootQuery, LinkTypeEthernet, testDecodeOptions) + if errLayer := p.ErrorLayer(); errLayer == nil { + t.Error("No error layer on invalid DNS name") + } else if err := errLayer.Error(); !strings.Contains(err.Error(), "no dns data found") { + t.Errorf("unexpected error message: %v", err) + } +} + +// testAnotherMalformedDNS is the packet: +// 10:52:13.690904 IP 10.77.0.29.53 > 10.1.0.6.42280: 13491 op6+% [b2&3=0x3313] [11720a] [23583q] [29742n] [52087au] Type22277 (Class 43688)? M- M-<.VM-^KM-wQM-s"M-^E^]M-+^Wx^P^@M-^\^\M-oM-FM-U^F^E7M-tM-^VM-^[M-F^H>G^FM-uM-^KM-_6GM-[M-jM-bM-^H]hM-^J.[|domain] +// 0x0000: 0055 22af c637 0022 55ac deac 0800 4500 .U"..7."U.....E. +// 0x0010: 05c1 2eea 4000 3611 fbd1 0a4d 001d 0a01 ....@.6....M.... +// 0x0020: 0006 0035 a528 05ad 00a2 34b3 3313 5c1f ...5.(....4.3.\. +// 0x0030: 2dc8 742e cb77 2da0 bc2e 568b f751 f322 -.t..w-...V..Q." +// 0x0040: 851d ab17 7810 009c 1cef c6d5 0605 37f4 ....x.........7. +// 0x0050: 969b c65e 483e 4706 f58b df36 47db eae2 ...^H>G....6G... +// 0x0060: 885d 688a c5a5 5705 aaa8 95eb 93a4 d85a .]h...W........Z +// 0x0070: c9af 261f 7816 a354 2d23 d84a 579c 4876 ..&.x..T-#.JW.Hv +// 0x0080: a391 43db 5c41 191a 92b8 dcdd 6839 eef5 ..C.\A......h9.. +// 0x0090: 728e 13e0 0679 6f47 88a0 25b9 44d8 f8e7 r....yoG..%.D... +// 0x00a0: 8afe 0bfa f811 8da5 f8a3 1f8e d23b fe12 .............;.. +// 0x00b0: d943 9327 92ad 4410 183e 688d b06d 5391 .C.'..D..>h..mS. +// 0x00c0: 695b e49f 8f1e c075 d043 afe0 1174 9db0 i[.....u.C...t.. +// 0x00d0: 06b0 f01e b85b 3c84 945e 06d0 b20f 9eaa .....[<..^...... +// 0x00e0: 123d 0ab0 2a55 309c 0ee9 3e5e db2f f377 .=..*U0...>^./.w +// 0x00f0: d7f1 9bae 373d 3316 0796 b80e dd18 5173 ....7=3.......Qs +// 0x0100: b28d 84fd 1812 d87b 42c8 5f11 4db6 b269 .......{B._.M..i +// 0x0110: 1c42 4aea d5a4 644b 6c00 f0c0 fcee 71a7 .BJ...dKl.....q. +// 0x0120: e7f0 719c a207 dc5c a6fa f005 a338 7ff0 ..q....\.....8.. +// 0x0130: 5beb 3b4d 8952 2a46 d47b a5a2 e1fb 9e76 [.;M.R*F.{.....v +// 0x0140: c815 6258 50f4 6997 bad5 b479 2d06 ebbb ..bXP.i....y-... +// 0x0150: 2cac 2ecc e4f0 1f94 ce9f 186c 61da 9681 ,..........la... +// 0x0160: 345c 4d88 efc7 037b fbe3 4402 ea06 2e5d 4\M....{..D....] +// 0x0170: 2e6e 4860 e180 3ef7 c006 0ad1 ebb9 c4ff .nH`..>......... +// 0x0180: dee2 f21c 02c2 751a ded8 ae2e 13a9 3fa2 ......u.......?. +// 0x0190: 392a 8b54 11b2 2b4e 2bf1 4780 db9f 8c10 9*.T..+N+.G..... +// 0x01a0: ac6f 61b0 7b19 423f 07e5 4628 b870 f75d .oa.{.B?..F(.p.] +// 0x01b0: 09a3 63b2 77af 5985 a0ae 51d8 243f a7c8 ..c.w.Y...Q.$?.. +// 0x01c0: ab08 7fc6 0217 c09f c412 0c45 e6aa 96bf ...........E.... +// 0x01d0: 184c 4307 1f1f c4f4 7734 da31 2088 662b .LC.....w4.1..f+ +// 0x01e0: 44c5 096f 1d1d 2dc5 ffd6 867d 9fc5 7b45 D..o..-....}..{E +// 0x01f0: f949 7dd9 38de 0d51 ac2a 32fc f50b 1bbe .I}.8..Q.*2..... +// 0x0200: 1c4b 5441 fbf3 0821 6c28 4530 5676 1d27 .KTA...!l(E0Vv.' +// 0x0210: 5087 466c 3d5b 45a6 af7f 917a 6d43 66c2 P.Fl=[E....zmCf. +// 0x0220: 036a 8bef ca60 9b13 8d29 9fda 82fa 01b1 .j...`...)...... +// 0x0230: df8f 1f83 c71d 630f 349e 508c 9f7a e3da ......c.4.P..z.. +// 0x0240: a114 3622 9df8 9926 4dac 4150 d505 7b3a ..6"...&M.AP..{: +// 0x0250: 6fed fc75 6b4f 2d60 8a89 767d 9af0 896e o..ukO-`..v}...n +// 0x0260: 907d 1ada def3 345c 0d81 283c a24f fcbb .}....4\..(<.O.. +// 0x0270: bbdd b7b3 e3bb 9f1b d966 51b7 8217 7fa0 .........fQ..... +// 0x0280: e828 d3ca a6f1 532f 164e e405 bb3b 0de3 .(....S/.N...;.. +// 0x0290: 985d 6e89 d825 ebc6 d8ba 5190 a114 c6a3 .]n..%....Q..... +// 0x02a0: 18b4 8aa7 181a 01ac cdc0 8048 ea72 a5e3 ...........H.r.. +// 0x02b0: e37a dc57 65cd b787 39e6 c39e 317b 45d8 .z.We...9...1{E. +// 0x02c0: 475c 05ba e8f8 8224 5a85 27b8 1584 8d78 G\.....$Z.'....x +// 0x02d0: 62b6 6495 ac10 338f 1122 f2ff 043e 9e2a b.d...3.."...>.* +// 0x02e0: 1058 a910 5792 6fcd 9a96 6183 6708 8f70 .X..W.o...a.g..p +// 0x02f0: edc6 a67c 64ff 50fa 520b de94 c82c c4d6 ...|d.P.R....,.. +// 0x0300: 7d8f 0fd5 2f0d 9833 7c6c be10 a4e5 dc99 }.../..3|l...... +// 0x0310: a467 ef5f b35b c11c e23c 131a 48b2 9cef .g._.[...<..H... +// 0x0320: 5a2f fece dd9e 2aea 0db9 faf3 a6ef b29d Z/....*......... +// 0x0330: e85d a410 dd6a 6806 3fc6 1694 179f cb4b .]...jh.?......K +// 0x0340: 08c4 86b2 0713 cddb b257 d56b fe82 7d82 .........W.k..}. +// 0x0350: 0d1f 6dc9 67b2 d2a1 6791 4f38 edf9 491f ..m.g...g.O8..I. +// 0x0360: 2c02 35f5 8165 ecc3 bc6a b631 3c7e 1ad4 ,.5..e...j.1<~.. +// 0x0370: 8e27 f962 f942 11b5 1b45 9bac b474 3c6e .'.b.B...E...t<n +// 0x0380: 6832 3075 be6d ac0d a8a0 7d47 a6ef 4e43 h20u.m....}G..NC +// 0x0390: 6b9a 3097 8a8b 82a3 9515 362c f7d6 a37f k.0.......6,.... +// 0x03a0: 7313 1199 a5f3 03dc bcc9 fb10 c23d eeb9 s............=.. +// 0x03b0: 78ff c8f3 0d38 9f74 ceec b7ae 63e3 3424 x....8.t....c.4$ +// 0x03c0: b783 f106 011f 666b bf2d abc8 ea10 57a1 ......fk.-....W. +// 0x03d0: 7cf2 4a3f 57ca 1386 bfba 27e5 4662 81c8 |.J?W.....'.Fb.. +// 0x03e0: 041e 1820 b3d5 c399 cd4d 222f 29f0 b994 .........M"/)... +// 0x03f0: 865a e6e2 1686 3261 b0cd caaf 07ec d0bc .Z....2a........ +// 0x0400: afb8 3cf0 51c1 6c7a 6383 6b3a ff47 9551 ..<.Q.lzc.k:.G.Q +// 0x0410: 1099 525f 355e 4684 bd34 ec12 88c9 dcc2 ..R_5^F..4...... +// 0x0420: d11c 826d f1df 37e6 f08f 6ce8 817d bdc3 ...m..7...l..}.. +// 0x0430: 20b9 a274 c645 c67d f299 fef9 287f 09ee ...t.E.}....(... +// 0x0440: ac67 6872 a126 b1d3 922c 4c2a 0ec9 b6d4 .ghr.&...,L*.... +// 0x0450: fb59 6163 d1c4 1708 8d94 bc3d be5e ae29 .Yac.......=.^.) +// 0x0460: 51ff a765 9df6 ae35 ed6b 0555 933f 3ed6 Q..e...5.k.U.?>. +// 0x0470: 259b d93e f86f 6088 0c4e 357b 5c67 7d93 %..>.o`..N5{\g}. +// 0x0480: a695 1a42 e1e1 ef91 14d7 b7b7 0ca4 2dda ...B..........-. +// 0x0490: 6ac1 771e 25c1 a578 4ca8 6fd8 de04 1c09 j.w.%..xL.o..... +// 0x04a0: df49 f179 6a58 2b45 7231 307f bc67 e5e7 .I.yjX+Er10..g.. +// 0x04b0: c5cd fec0 b021 508e 4fc5 f821 f734 90bc .....!P.O..!.4.. +// 0x04c0: c87f 14f1 2e5c d17b 1818 5b4a 6b68 0212 .....\.{..[Jkh.. +// 0x04d0: 1791 4a30 8518 99a9 b516 67e7 ed56 d1d1 ..J0......g..V.. +// 0x04e0: 239d dfda 11c5 0afe e58a b6e0 fb66 ab5c #............f.\ +// 0x04f0: f590 dcd6 457d 01d1 83f5 a9f0 cdb2 9c14 ....E}.......... +// 0x0500: ff66 f10c d428 a07b 34e3 d600 91f2 aca7 .f...(.{4....... +// 0x0510: 4e1f f3ac a96e 2aa3 ec9b 448c 748d f858 N....n*...D.t..X +// 0x0520: 131c d496 af9b f5f0 d2f5 57ac 0b64 55a1 ..........W..dU. +// 0x0530: 860e 5ad0 3e62 26b5 9e17 f51f 88c1 02e3 ..Z.>b&......... +// 0x0540: 4a38 de70 3216 6f88 5d1e f429 ee19 4121 J8.p2.o.]..)..A! +// 0x0550: f571 84ac 3789 141f 1798 90b1 8373 2499 .q..7........s$. +// 0x0560: c131 b13f f3a3 9a07 aef1 bfe8 8cd7 8c2e .1.?............ +// 0x0570: ba35 dfc5 eb07 013c 7621 6481 bdfb 6233 .5.....<v!d...b3 +// 0x0580: 22e2 0f05 7e15 0417 67e4 2632 5207 28a6 "...~...g.&2R.(. +// 0x0590: 8e88 9423 de54 5412 b53e fd8d d47a de58 ...#.TT..>...z.X +// 0x05a0: a1b2 6e08 d06d dc21 1eda 14a0 a2f7 1701 ..n..m.!........ +// 0x05b0: a5e0 dfd7 871f 595d db43 70f5 bab3 b732 ......Y].Cp....2 +// 0x05c0: 6275 da15 b203 dac7 321f 8d61 11bd 30 bu......2..a..0 +var testAnotherMalformedDNS = []byte{ + 0x00, 0x55, 0x22, 0xaf, 0xc6, 0x37, 0x00, 0x22, 0x55, 0xac, 0xde, 0xac, 0x08, 0x00, 0x45, 0x00, + 0x05, 0xc1, 0x2e, 0xea, 0x40, 0x00, 0x36, 0x11, 0xfb, 0xd1, 0x0a, 0x4d, 0x00, 0x1d, 0x0a, 0x01, + 0x00, 0x06, 0x00, 0x35, 0xa5, 0x28, 0x05, 0xad, 0x00, 0xa2, 0x34, 0xb3, 0x33, 0x13, 0x5c, 0x1f, + 0x2d, 0xc8, 0x74, 0x2e, 0xcb, 0x77, 0x2d, 0xa0, 0xbc, 0x2e, 0x56, 0x8b, 0xf7, 0x51, 0xf3, 0x22, + 0x85, 0x1d, 0xab, 0x17, 0x78, 0x10, 0x00, 0x9c, 0x1c, 0xef, 0xc6, 0xd5, 0x06, 0x05, 0x37, 0xf4, + 0x96, 0x9b, 0xc6, 0x5e, 0x48, 0x3e, 0x47, 0x06, 0xf5, 0x8b, 0xdf, 0x36, 0x47, 0xdb, 0xea, 0xe2, + 0x88, 0x5d, 0x68, 0x8a, 0xc5, 0xa5, 0x57, 0x05, 0xaa, 0xa8, 0x95, 0xeb, 0x93, 0xa4, 0xd8, 0x5a, + 0xc9, 0xaf, 0x26, 0x1f, 0x78, 0x16, 0xa3, 0x54, 0x2d, 0x23, 0xd8, 0x4a, 0x57, 0x9c, 0x48, 0x76, + 0xa3, 0x91, 0x43, 0xdb, 0x5c, 0x41, 0x19, 0x1a, 0x92, 0xb8, 0xdc, 0xdd, 0x68, 0x39, 0xee, 0xf5, + 0x72, 0x8e, 0x13, 0xe0, 0x06, 0x79, 0x6f, 0x47, 0x88, 0xa0, 0x25, 0xb9, 0x44, 0xd8, 0xf8, 0xe7, + 0x8a, 0xfe, 0x0b, 0xfa, 0xf8, 0x11, 0x8d, 0xa5, 0xf8, 0xa3, 0x1f, 0x8e, 0xd2, 0x3b, 0xfe, 0x12, + 0xd9, 0x43, 0x93, 0x27, 0x92, 0xad, 0x44, 0x10, 0x18, 0x3e, 0x68, 0x8d, 0xb0, 0x6d, 0x53, 0x91, + 0x69, 0x5b, 0xe4, 0x9f, 0x8f, 0x1e, 0xc0, 0x75, 0xd0, 0x43, 0xaf, 0xe0, 0x11, 0x74, 0x9d, 0xb0, + 0x06, 0xb0, 0xf0, 0x1e, 0xb8, 0x5b, 0x3c, 0x84, 0x94, 0x5e, 0x06, 0xd0, 0xb2, 0x0f, 0x9e, 0xaa, + 0x12, 0x3d, 0x0a, 0xb0, 0x2a, 0x55, 0x30, 0x9c, 0x0e, 0xe9, 0x3e, 0x5e, 0xdb, 0x2f, 0xf3, 0x77, + 0xd7, 0xf1, 0x9b, 0xae, 0x37, 0x3d, 0x33, 0x16, 0x07, 0x96, 0xb8, 0x0e, 0xdd, 0x18, 0x51, 0x73, + 0xb2, 0x8d, 0x84, 0xfd, 0x18, 0x12, 0xd8, 0x7b, 0x42, 0xc8, 0x5f, 0x11, 0x4d, 0xb6, 0xb2, 0x69, + 0x1c, 0x42, 0x4a, 0xea, 0xd5, 0xa4, 0x64, 0x4b, 0x6c, 0x00, 0xf0, 0xc0, 0xfc, 0xee, 0x71, 0xa7, + 0xe7, 0xf0, 0x71, 0x9c, 0xa2, 0x07, 0xdc, 0x5c, 0xa6, 0xfa, 0xf0, 0x05, 0xa3, 0x38, 0x7f, 0xf0, + 0x5b, 0xeb, 0x3b, 0x4d, 0x89, 0x52, 0x2a, 0x46, 0xd4, 0x7b, 0xa5, 0xa2, 0xe1, 0xfb, 0x9e, 0x76, + 0xc8, 0x15, 0x62, 0x58, 0x50, 0xf4, 0x69, 0x97, 0xba, 0xd5, 0xb4, 0x79, 0x2d, 0x06, 0xeb, 0xbb, + 0x2c, 0xac, 0x2e, 0xcc, 0xe4, 0xf0, 0x1f, 0x94, 0xce, 0x9f, 0x18, 0x6c, 0x61, 0xda, 0x96, 0x81, + 0x34, 0x5c, 0x4d, 0x88, 0xef, 0xc7, 0x03, 0x7b, 0xfb, 0xe3, 0x44, 0x02, 0xea, 0x06, 0x2e, 0x5d, + 0x2e, 0x6e, 0x48, 0x60, 0xe1, 0x80, 0x3e, 0xf7, 0xc0, 0x06, 0x0a, 0xd1, 0xeb, 0xb9, 0xc4, 0xff, + 0xde, 0xe2, 0xf2, 0x1c, 0x02, 0xc2, 0x75, 0x1a, 0xde, 0xd8, 0xae, 0x2e, 0x13, 0xa9, 0x3f, 0xa2, + 0x39, 0x2a, 0x8b, 0x54, 0x11, 0xb2, 0x2b, 0x4e, 0x2b, 0xf1, 0x47, 0x80, 0xdb, 0x9f, 0x8c, 0x10, + 0xac, 0x6f, 0x61, 0xb0, 0x7b, 0x19, 0x42, 0x3f, 0x07, 0xe5, 0x46, 0x28, 0xb8, 0x70, 0xf7, 0x5d, + 0x09, 0xa3, 0x63, 0xb2, 0x77, 0xaf, 0x59, 0x85, 0xa0, 0xae, 0x51, 0xd8, 0x24, 0x3f, 0xa7, 0xc8, + 0xab, 0x08, 0x7f, 0xc6, 0x02, 0x17, 0xc0, 0x9f, 0xc4, 0x12, 0x0c, 0x45, 0xe6, 0xaa, 0x96, 0xbf, + 0x18, 0x4c, 0x43, 0x07, 0x1f, 0x1f, 0xc4, 0xf4, 0x77, 0x34, 0xda, 0x31, 0x20, 0x88, 0x66, 0x2b, + 0x44, 0xc5, 0x09, 0x6f, 0x1d, 0x1d, 0x2d, 0xc5, 0xff, 0xd6, 0x86, 0x7d, 0x9f, 0xc5, 0x7b, 0x45, + 0xf9, 0x49, 0x7d, 0xd9, 0x38, 0xde, 0x0d, 0x51, 0xac, 0x2a, 0x32, 0xfc, 0xf5, 0x0b, 0x1b, 0xbe, + 0x1c, 0x4b, 0x54, 0x41, 0xfb, 0xf3, 0x08, 0x21, 0x6c, 0x28, 0x45, 0x30, 0x56, 0x76, 0x1d, 0x27, + 0x50, 0x87, 0x46, 0x6c, 0x3d, 0x5b, 0x45, 0xa6, 0xaf, 0x7f, 0x91, 0x7a, 0x6d, 0x43, 0x66, 0xc2, + 0x03, 0x6a, 0x8b, 0xef, 0xca, 0x60, 0x9b, 0x13, 0x8d, 0x29, 0x9f, 0xda, 0x82, 0xfa, 0x01, 0xb1, + 0xdf, 0x8f, 0x1f, 0x83, 0xc7, 0x1d, 0x63, 0x0f, 0x34, 0x9e, 0x50, 0x8c, 0x9f, 0x7a, 0xe3, 0xda, + 0xa1, 0x14, 0x36, 0x22, 0x9d, 0xf8, 0x99, 0x26, 0x4d, 0xac, 0x41, 0x50, 0xd5, 0x05, 0x7b, 0x3a, + 0x6f, 0xed, 0xfc, 0x75, 0x6b, 0x4f, 0x2d, 0x60, 0x8a, 0x89, 0x76, 0x7d, 0x9a, 0xf0, 0x89, 0x6e, + 0x90, 0x7d, 0x1a, 0xda, 0xde, 0xf3, 0x34, 0x5c, 0x0d, 0x81, 0x28, 0x3c, 0xa2, 0x4f, 0xfc, 0xbb, + 0xbb, 0xdd, 0xb7, 0xb3, 0xe3, 0xbb, 0x9f, 0x1b, 0xd9, 0x66, 0x51, 0xb7, 0x82, 0x17, 0x7f, 0xa0, + 0xe8, 0x28, 0xd3, 0xca, 0xa6, 0xf1, 0x53, 0x2f, 0x16, 0x4e, 0xe4, 0x05, 0xbb, 0x3b, 0x0d, 0xe3, + 0x98, 0x5d, 0x6e, 0x89, 0xd8, 0x25, 0xeb, 0xc6, 0xd8, 0xba, 0x51, 0x90, 0xa1, 0x14, 0xc6, 0xa3, + 0x18, 0xb4, 0x8a, 0xa7, 0x18, 0x1a, 0x01, 0xac, 0xcd, 0xc0, 0x80, 0x48, 0xea, 0x72, 0xa5, 0xe3, + 0xe3, 0x7a, 0xdc, 0x57, 0x65, 0xcd, 0xb7, 0x87, 0x39, 0xe6, 0xc3, 0x9e, 0x31, 0x7b, 0x45, 0xd8, + 0x47, 0x5c, 0x05, 0xba, 0xe8, 0xf8, 0x82, 0x24, 0x5a, 0x85, 0x27, 0xb8, 0x15, 0x84, 0x8d, 0x78, + 0x62, 0xb6, 0x64, 0x95, 0xac, 0x10, 0x33, 0x8f, 0x11, 0x22, 0xf2, 0xff, 0x04, 0x3e, 0x9e, 0x2a, + 0x10, 0x58, 0xa9, 0x10, 0x57, 0x92, 0x6f, 0xcd, 0x9a, 0x96, 0x61, 0x83, 0x67, 0x08, 0x8f, 0x70, + 0xed, 0xc6, 0xa6, 0x7c, 0x64, 0xff, 0x50, 0xfa, 0x52, 0x0b, 0xde, 0x94, 0xc8, 0x2c, 0xc4, 0xd6, + 0x7d, 0x8f, 0x0f, 0xd5, 0x2f, 0x0d, 0x98, 0x33, 0x7c, 0x6c, 0xbe, 0x10, 0xa4, 0xe5, 0xdc, 0x99, + 0xa4, 0x67, 0xef, 0x5f, 0xb3, 0x5b, 0xc1, 0x1c, 0xe2, 0x3c, 0x13, 0x1a, 0x48, 0xb2, 0x9c, 0xef, + 0x5a, 0x2f, 0xfe, 0xce, 0xdd, 0x9e, 0x2a, 0xea, 0x0d, 0xb9, 0xfa, 0xf3, 0xa6, 0xef, 0xb2, 0x9d, + 0xe8, 0x5d, 0xa4, 0x10, 0xdd, 0x6a, 0x68, 0x06, 0x3f, 0xc6, 0x16, 0x94, 0x17, 0x9f, 0xcb, 0x4b, + 0x08, 0xc4, 0x86, 0xb2, 0x07, 0x13, 0xcd, 0xdb, 0xb2, 0x57, 0xd5, 0x6b, 0xfe, 0x82, 0x7d, 0x82, + 0x0d, 0x1f, 0x6d, 0xc9, 0x67, 0xb2, 0xd2, 0xa1, 0x67, 0x91, 0x4f, 0x38, 0xed, 0xf9, 0x49, 0x1f, + 0x2c, 0x02, 0x35, 0xf5, 0x81, 0x65, 0xec, 0xc3, 0xbc, 0x6a, 0xb6, 0x31, 0x3c, 0x7e, 0x1a, 0xd4, + 0x8e, 0x27, 0xf9, 0x62, 0xf9, 0x42, 0x11, 0xb5, 0x1b, 0x45, 0x9b, 0xac, 0xb4, 0x74, 0x3c, 0x6e, + 0x68, 0x32, 0x30, 0x75, 0xbe, 0x6d, 0xac, 0x0d, 0xa8, 0xa0, 0x7d, 0x47, 0xa6, 0xef, 0x4e, 0x43, + 0x6b, 0x9a, 0x30, 0x97, 0x8a, 0x8b, 0x82, 0xa3, 0x95, 0x15, 0x36, 0x2c, 0xf7, 0xd6, 0xa3, 0x7f, + 0x73, 0x13, 0x11, 0x99, 0xa5, 0xf3, 0x03, 0xdc, 0xbc, 0xc9, 0xfb, 0x10, 0xc2, 0x3d, 0xee, 0xb9, + 0x78, 0xff, 0xc8, 0xf3, 0x0d, 0x38, 0x9f, 0x74, 0xce, 0xec, 0xb7, 0xae, 0x63, 0xe3, 0x34, 0x24, + 0xb7, 0x83, 0xf1, 0x06, 0x01, 0x1f, 0x66, 0x6b, 0xbf, 0x2d, 0xab, 0xc8, 0xea, 0x10, 0x57, 0xa1, + 0x7c, 0xf2, 0x4a, 0x3f, 0x57, 0xca, 0x13, 0x86, 0xbf, 0xba, 0x27, 0xe5, 0x46, 0x62, 0x81, 0xc8, + 0x04, 0x1e, 0x18, 0x20, 0xb3, 0xd5, 0xc3, 0x99, 0xcd, 0x4d, 0x22, 0x2f, 0x29, 0xf0, 0xb9, 0x94, + 0x86, 0x5a, 0xe6, 0xe2, 0x16, 0x86, 0x32, 0x61, 0xb0, 0xcd, 0xca, 0xaf, 0x07, 0xec, 0xd0, 0xbc, + 0xaf, 0xb8, 0x3c, 0xf0, 0x51, 0xc1, 0x6c, 0x7a, 0x63, 0x83, 0x6b, 0x3a, 0xff, 0x47, 0x95, 0x51, + 0x10, 0x99, 0x52, 0x5f, 0x35, 0x5e, 0x46, 0x84, 0xbd, 0x34, 0xec, 0x12, 0x88, 0xc9, 0xdc, 0xc2, + 0xd1, 0x1c, 0x82, 0x6d, 0xf1, 0xdf, 0x37, 0xe6, 0xf0, 0x8f, 0x6c, 0xe8, 0x81, 0x7d, 0xbd, 0xc3, + 0x20, 0xb9, 0xa2, 0x74, 0xc6, 0x45, 0xc6, 0x7d, 0xf2, 0x99, 0xfe, 0xf9, 0x28, 0x7f, 0x09, 0xee, + 0xac, 0x67, 0x68, 0x72, 0xa1, 0x26, 0xb1, 0xd3, 0x92, 0x2c, 0x4c, 0x2a, 0x0e, 0xc9, 0xb6, 0xd4, + 0xfb, 0x59, 0x61, 0x63, 0xd1, 0xc4, 0x17, 0x08, 0x8d, 0x94, 0xbc, 0x3d, 0xbe, 0x5e, 0xae, 0x29, + 0x51, 0xff, 0xa7, 0x65, 0x9d, 0xf6, 0xae, 0x35, 0xed, 0x6b, 0x05, 0x55, 0x93, 0x3f, 0x3e, 0xd6, + 0x25, 0x9b, 0xd9, 0x3e, 0xf8, 0x6f, 0x60, 0x88, 0x0c, 0x4e, 0x35, 0x7b, 0x5c, 0x67, 0x7d, 0x93, + 0xa6, 0x95, 0x1a, 0x42, 0xe1, 0xe1, 0xef, 0x91, 0x14, 0xd7, 0xb7, 0xb7, 0x0c, 0xa4, 0x2d, 0xda, + 0x6a, 0xc1, 0x77, 0x1e, 0x25, 0xc1, 0xa5, 0x78, 0x4c, 0xa8, 0x6f, 0xd8, 0xde, 0x04, 0x1c, 0x09, + 0xdf, 0x49, 0xf1, 0x79, 0x6a, 0x58, 0x2b, 0x45, 0x72, 0x31, 0x30, 0x7f, 0xbc, 0x67, 0xe5, 0xe7, + 0xc5, 0xcd, 0xfe, 0xc0, 0xb0, 0x21, 0x50, 0x8e, 0x4f, 0xc5, 0xf8, 0x21, 0xf7, 0x34, 0x90, 0xbc, + 0xc8, 0x7f, 0x14, 0xf1, 0x2e, 0x5c, 0xd1, 0x7b, 0x18, 0x18, 0x5b, 0x4a, 0x6b, 0x68, 0x02, 0x12, + 0x17, 0x91, 0x4a, 0x30, 0x85, 0x18, 0x99, 0xa9, 0xb5, 0x16, 0x67, 0xe7, 0xed, 0x56, 0xd1, 0xd1, + 0x23, 0x9d, 0xdf, 0xda, 0x11, 0xc5, 0x0a, 0xfe, 0xe5, 0x8a, 0xb6, 0xe0, 0xfb, 0x66, 0xab, 0x5c, + 0xf5, 0x90, 0xdc, 0xd6, 0x45, 0x7d, 0x01, 0xd1, 0x83, 0xf5, 0xa9, 0xf0, 0xcd, 0xb2, 0x9c, 0x14, + 0xff, 0x66, 0xf1, 0x0c, 0xd4, 0x28, 0xa0, 0x7b, 0x34, 0xe3, 0xd6, 0x00, 0x91, 0xf2, 0xac, 0xa7, + 0x4e, 0x1f, 0xf3, 0xac, 0xa9, 0x6e, 0x2a, 0xa3, 0xec, 0x9b, 0x44, 0x8c, 0x74, 0x8d, 0xf8, 0x58, + 0x13, 0x1c, 0xd4, 0x96, 0xaf, 0x9b, 0xf5, 0xf0, 0xd2, 0xf5, 0x57, 0xac, 0x0b, 0x64, 0x55, 0xa1, + 0x86, 0x0e, 0x5a, 0xd0, 0x3e, 0x62, 0x26, 0xb5, 0x9e, 0x17, 0xf5, 0x1f, 0x88, 0xc1, 0x02, 0xe3, + 0x4a, 0x38, 0xde, 0x70, 0x32, 0x16, 0x6f, 0x88, 0x5d, 0x1e, 0xf4, 0x29, 0xee, 0x19, 0x41, 0x21, + 0xf5, 0x71, 0x84, 0xac, 0x37, 0x89, 0x14, 0x1f, 0x17, 0x98, 0x90, 0xb1, 0x83, 0x73, 0x24, 0x99, + 0xc1, 0x31, 0xb1, 0x3f, 0xf3, 0xa3, 0x9a, 0x07, 0xae, 0xf1, 0xbf, 0xe8, 0x8c, 0xd7, 0x8c, 0x2e, + 0xba, 0x35, 0xdf, 0xc5, 0xeb, 0x07, 0x01, 0x3c, 0x76, 0x21, 0x64, 0x81, 0xbd, 0xfb, 0x62, 0x33, + 0x22, 0xe2, 0x0f, 0x05, 0x7e, 0x15, 0x04, 0x17, 0x67, 0xe4, 0x26, 0x32, 0x52, 0x07, 0x28, 0xa6, + 0x8e, 0x88, 0x94, 0x23, 0xde, 0x54, 0x54, 0x12, 0xb5, 0x3e, 0xfd, 0x8d, 0xd4, 0x7a, 0xde, 0x58, + 0xa1, 0xb2, 0x6e, 0x08, 0xd0, 0x6d, 0xdc, 0x21, 0x1e, 0xda, 0x14, 0xa0, 0xa2, 0xf7, 0x17, 0x01, + 0xa5, 0xe0, 0xdf, 0xd7, 0x87, 0x1f, 0x59, 0x5d, 0xdb, 0x43, 0x70, 0xf5, 0xba, 0xb3, 0xb7, 0x32, + 0x62, 0x75, 0xda, 0x15, 0xb2, 0x03, 0xda, 0xc7, 0x32, 0x1f, 0x8d, 0x61, 0x11, 0xbd, 0x30, +} + +func TestAnotherMalformedDNS(t *testing.T) { + p := gopacket.NewPacket(testAnotherMalformedDNS, LinkTypeEthernet, testDecodeOptions) + if errLayer := p.ErrorLayer(); errLayer == nil { + t.Error("No error layer on invalid DNS name") + } else if err := errLayer.Error(); !strings.Contains(err.Error(), "offset too high") { + t.Errorf("unexpected error message: %v", err) + } +} + +// testMalformedDNSAgain is the packet: +// 12:14:52.702061 IP 10.77.0.4.53 > 10.1.0.41.61610: 12529 updateDA [b2&3=0x5cad] [38274a] [61303q] [1718n] [14913au][|domain] +// 0x0000: 0055 22af c637 0022 55ac deac 0800 4500 .U"..7."U.....E. +// 0x0010: 0091 2dff 0000 7811 ffe2 0a4d 0004 0a01 ..-...x....M.... +// 0x0020: 0029 0035 f0aa 007d 5b53 30f1 5cad ef77 .).5...}[S0.\..w +// 0x0030: 9582 06b6 3a41 357a 8cef cdc0 a732 b800 ....:A5z.....2.. +// 0x0040: 466e 1c30 2e75 95ac c03d 1ed4 8635 2d09 Fn.0.u...=...5-. +// 0x0050: 2fee 3a82 b4f0 427e 2b6b f870 cc7f c9a1 /.:...B~+k.p.... +// 0x0060: e6f1 a761 97ec 2ff7 d248 4d95 321c 6e4e ...a../..HM.2.nN +// 0x0070: 57fa 6d3d 9ec0 fe3a 6f1e e634 4396 b494 W.m=...:o..4C... +// 0x0080: 8b7a a929 d7e1 da7c c346 ca77 4890 6bf3 .z.)...|.F.wH.k. +// 0x0090: 5ecb 7e97 c49d 3564 984f bf7c 8ac1 dd ^.~...5d.O.|... +var testMalformedDNSAgain = []byte{ + 0x00, 0x55, 0x22, 0xaf, 0xc6, 0x37, 0x00, 0x22, 0x55, 0xac, 0xde, 0xac, 0x08, 0x00, 0x45, 0x00, + 0x00, 0x91, 0x2d, 0xff, 0x00, 0x00, 0x78, 0x11, 0xff, 0xe2, 0x0a, 0x4d, 0x00, 0x04, 0x0a, 0x01, + 0x00, 0x29, 0x00, 0x35, 0xf0, 0xaa, 0x00, 0x7d, 0x5b, 0x53, 0x30, 0xf1, 0x5c, 0xad, 0xef, 0x77, + 0x95, 0x82, 0x06, 0xb6, 0x3a, 0x41, 0x35, 0x7a, 0x8c, 0xef, 0xcd, 0xc0, 0xa7, 0x32, 0xb8, 0x00, + 0x46, 0x6e, 0x1c, 0x30, 0x2e, 0x75, 0x95, 0xac, 0xc0, 0x3d, 0x1e, 0xd4, 0x86, 0x35, 0x2d, 0x09, + 0x2f, 0xee, 0x3a, 0x82, 0xb4, 0xf0, 0x42, 0x7e, 0x2b, 0x6b, 0xf8, 0x70, 0xcc, 0x7f, 0xc9, 0xa1, + 0xe6, 0xf1, 0xa7, 0x61, 0x97, 0xec, 0x2f, 0xf7, 0xd2, 0x48, 0x4d, 0x95, 0x32, 0x1c, 0x6e, 0x4e, + 0x57, 0xfa, 0x6d, 0x3d, 0x9e, 0xc0, 0xfe, 0x3a, 0x6f, 0x1e, 0xe6, 0x34, 0x43, 0x96, 0xb4, 0x94, + 0x8b, 0x7a, 0xa9, 0x29, 0xd7, 0xe1, 0xda, 0x7c, 0xc3, 0x46, 0xca, 0x77, 0x48, 0x90, 0x6b, 0xf3, + 0x5e, 0xcb, 0x7e, 0x97, 0xc4, 0x9d, 0x35, 0x64, 0x98, 0x4f, 0xbf, 0x7c, 0x8a, 0xc1, 0xdd, +} + +func TestMalformedDNSAgain(t *testing.T) { + p := gopacket.NewPacket(testMalformedDNSAgain, LinkTypeEthernet, testDecodeOptions) + if errLayer := p.ErrorLayer(); errLayer == nil { + t.Error("No error layer on invalid DNS name") + } else if err := errLayer.Error(); !strings.Contains(err.Error(), "walked out of range") { + t.Errorf("unexpected error message: %v", err) + } +} + +// testMalformedDNSOhGodMakeItStop is the packet: +// 15:08:24.430906 IP 10.77.0.19.53 > 10.1.0.19.50635: 12397 zoneInit% [b2&3=0x7232] [47729a] [46283q] [60247n] [61718au][|domain] +// 0x0000: 0055 22af c637 0022 55ac deac 0800 4500 .U"..7."U.....E. +// 0x0010: 0079 c51c 4000 3511 6be4 0a4d 0013 0a01 .y..@.5.k..M.... +// 0x0020: 0013 0035 c5cb 0065 ef45 306d 7232 b4cb ...5...e.E0mr2.. +// 0x0030: ba71 eb57 f116 3994 e000 4626 0534 66cc .q.W..9...F&.4f. +// 0x0040: 7b32 24f2 eece bca7 20e2 9a2a e1ce e737 {2$........*...7 +// 0x0050: ac39 5fae 72ec c3ec 284f ca4a 171f 466d .9_.r...(O.J..Fm +// 0x0060: f6c6 84d7 e795 310f 26df 9b59 6db9 21cf ......1.&..Ym.!. +// 0x0070: 15cb 30a3 c4cf df23 805a ed1a 0584 4fc3 ..0....#.Z....O. +// 0x0080: 7fa3 3cb4 e04f e9 ..<..O. +var testMalformedDNSOhGodMakeItStop = []byte{ + 0x00, 0x55, 0x22, 0xaf, 0xc6, 0x37, 0x00, 0x22, 0x55, 0xac, 0xde, 0xac, 0x08, 0x00, 0x45, 0x00, + 0x00, 0x79, 0xc5, 0x1c, 0x40, 0x00, 0x35, 0x11, 0x6b, 0xe4, 0x0a, 0x4d, 0x00, 0x13, 0x0a, 0x01, + 0x00, 0x13, 0x00, 0x35, 0xc5, 0xcb, 0x00, 0x65, 0xef, 0x45, 0x30, 0x6d, 0x72, 0x32, 0xb4, 0xcb, + 0xba, 0x71, 0xeb, 0x57, 0xf1, 0x16, 0x39, 0x94, 0xe0, 0x00, 0x46, 0x26, 0x05, 0x34, 0x66, 0xcc, + 0x7b, 0x32, 0x24, 0xf2, 0xee, 0xce, 0xbc, 0xa7, 0x20, 0xe2, 0x9a, 0x2a, 0xe1, 0xce, 0xe7, 0x37, + 0xac, 0x39, 0x5f, 0xae, 0x72, 0xec, 0xc3, 0xec, 0x28, 0x4f, 0xca, 0x4a, 0x17, 0x1f, 0x46, 0x6d, + 0xf6, 0xc6, 0x84, 0xd7, 0xe7, 0x95, 0x31, 0x0f, 0x26, 0xdf, 0x9b, 0x59, 0x6d, 0xb9, 0x21, 0xcf, + 0x15, 0xcb, 0x30, 0xa3, 0xc4, 0xcf, 0xdf, 0x23, 0x80, 0x5a, 0xed, 0x1a, 0x05, 0x84, 0x4f, 0xc3, + 0x7f, 0xa3, 0x3c, 0xb4, 0xe0, 0x4f, 0xe9, +} + +func TestMalformedDNSOhGodMakeItStop(t *testing.T) { + p := gopacket.NewPacket(testMalformedDNSOhGodMakeItStop, LinkTypeEthernet, testDecodeOptions) + if errLayer := p.ErrorLayer(); errLayer == nil { + t.Error("No error layer on invalid DNS name") + } else if err := errLayer.Error(); !strings.Contains(err.Error(), "offset pointer too high") { + t.Errorf("unexpected error message: %v", err) + } +} + +// testPacketDNSPanic7 is the packet: +// 07:56:25.174747 IP 10.77.0.11.53 > 10.1.0.67.55777: 41808*-| 3/7/0 TXT "google-site-verification=DC2uC-T8kD33lINhNzfo0bNBrw-vrCXs5BPF5BXY56g", TXT "v=spf1 include:spf-a.outlook.com include:spf-b.outlook.com ip4:157.55.9.128/25 include:spf.protection.outlook.com include:spf-a.hotmail.com include:_spf-ssg-b.microsoft.com include:_spf-ssg-c.microsoft.com ~all", TXT "google-site-verification=0iLWhIMhXEkeWwWfFU4ursTn-_OvoOjaA0Lr7Pg1sEM" (512) +// 0x0000: 0055 22af c637 0022 55ac deac 0800 4500 .U"..7."U.....E. +// 0x0010: 021c b5ca 4000 fa11 b46a 0a4d 000b 0a01 ....@....j.M.... +// 0x0020: 0043 0035 d9e1 0208 afd6 a350 8600 0001 .C.5.......P.... +// 0x0030: 0003 0007 0000 076f 7574 6c6f 6f6b 0363 .......outlook.c +// 0x0040: 6f6d 0000 1000 01c0 0c00 1000 0100 0001 om.............. +// 0x0050: 2c00 4544 676f 6f67 6c65 2d73 6974 652d ,.EDgoogle-site- +// 0x0060: 7665 7269 6669 6361 7469 6f6e 3d44 4332 verification=DC2 +// 0x0070: 7543 2d54 386b 4433 336c 494e 684e 7a66 uC-T8kD33lINhNzf +// 0x0080: 6f30 624e 4272 772d 7672 4358 7335 4250 o0bNBrw-vrCXs5BP +// 0x0090: 4635 4258 5935 3667 c00c 0010 0001 0000 F5BXY56g........ +// 0x00a0: 012c 00d3 d276 3d73 7066 3120 696e 636c .,...v=spf1.incl +// 0x00b0: 7564 653a 7370 662d 612e 6f75 746c 6f6f ude:spf-a.outloo +// 0x00c0: 6b2e 636f 6d20 696e 636c 7564 653a 7370 k.com.include:sp +// 0x00d0: 662d 622e 6f75 746c 6f6f 6b2e 636f 6d20 f-b.outlook.com. +// 0x00e0: 6970 343a 3135 372e 3535 2e39 2e31 3238 ip4:157.55.9.128 +// 0x00f0: 2f32 3520 696e 636c 7564 653a 7370 662e /25.include:spf. +// 0x0100: 7072 6f74 6563 7469 6f6e 2e6f 7574 6c6f protection.outlo +// 0x0110: 6f6b 2e63 6f6d 2069 6e63 6c75 6465 3a73 ok.com.include:s +// 0x0120: 7066 2d61 2e68 6f74 6d61 696c 2e63 6f6d pf-a.hotmail.com +// 0x0130: 2069 6e63 6c75 6465 3a5f 7370 662d 7373 .include:_spf-ss +// 0x0140: 672d 622e 6d69 6372 6f73 6f66 742e 636f g-b.microsoft.co +// 0x0150: 6d20 696e 636c 7564 653a 5f73 7066 2d73 m.include:_spf-s +// 0x0160: 7367 2d63 2e6d 6963 726f 736f 6674 2e63 sg-c.microsoft.c +// 0x0170: 6f6d 207e 616c 6cc0 0c00 1000 0100 0001 om.~all......... +// 0x0180: 2c00 4544 676f 6f67 6c65 2d73 6974 652d ,.EDgoogle-site- +// 0x0190: 7665 7269 6669 6361 7469 6f6e 3d30 694c verification=0iL +// 0x01a0: 5768 494d 6858 456b 6557 7757 6646 5534 WhIMhXEkeWwWfFU4 +// 0x01b0: 7572 7354 6e2d 5f4f 766f 4f6a 6141 304c ursTn-_OvoOjaA0L +// 0x01c0: 7237 5067 3173 454d c00c 0002 0001 0002 r7Pg1sEM........ +// 0x01d0: a300 000e 036e 7332 046d 7366 7403 6e65 .....ns2.msft.ne +// 0x01e0: 7400 c00c 0002 0001 0002 a300 0006 036e t..............n +// 0x01f0: 7334 c1ae c00c 0002 0001 0002 a300 0006 s4.............. +// 0x0200: 036e 7331 c1ae c00c 0002 0001 0002 a300 .ns1............ +// 0x0210: 0006 036e 7333 c1ae c00c 0002 0001 0002 ...ns3.......... +// 0x0220: a300 0015 046e 7331 610d .....ns1a. +var testPacketDNSPanic7 = []byte{ + 0x00, 0x55, 0x22, 0xaf, 0xc6, 0x37, 0x00, 0x22, 0x55, 0xac, 0xde, 0xac, 0x08, 0x00, 0x45, 0x00, + 0x02, 0x1c, 0xb5, 0xca, 0x40, 0x00, 0xfa, 0x11, 0xb4, 0x6a, 0x0a, 0x4d, 0x00, 0x0b, 0x0a, 0x01, + 0x00, 0x43, 0x00, 0x35, 0xd9, 0xe1, 0x02, 0x08, 0xaf, 0xd6, 0xa3, 0x50, 0x86, 0x00, 0x00, 0x01, + 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x07, 0x6f, 0x75, 0x74, 0x6c, 0x6f, 0x6f, 0x6b, 0x03, 0x63, + 0x6f, 0x6d, 0x00, 0x00, 0x10, 0x00, 0x01, 0xc0, 0x0c, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x01, + 0x2c, 0x00, 0x45, 0x44, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2d, 0x73, 0x69, 0x74, 0x65, 0x2d, + 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x44, 0x43, 0x32, + 0x75, 0x43, 0x2d, 0x54, 0x38, 0x6b, 0x44, 0x33, 0x33, 0x6c, 0x49, 0x4e, 0x68, 0x4e, 0x7a, 0x66, + 0x6f, 0x30, 0x62, 0x4e, 0x42, 0x72, 0x77, 0x2d, 0x76, 0x72, 0x43, 0x58, 0x73, 0x35, 0x42, 0x50, + 0x46, 0x35, 0x42, 0x58, 0x59, 0x35, 0x36, 0x67, 0xc0, 0x0c, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, + 0x01, 0x2c, 0x00, 0xd3, 0xd2, 0x76, 0x3d, 0x73, 0x70, 0x66, 0x31, 0x20, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x3a, 0x73, 0x70, 0x66, 0x2d, 0x61, 0x2e, 0x6f, 0x75, 0x74, 0x6c, 0x6f, 0x6f, + 0x6b, 0x2e, 0x63, 0x6f, 0x6d, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x3a, 0x73, 0x70, + 0x66, 0x2d, 0x62, 0x2e, 0x6f, 0x75, 0x74, 0x6c, 0x6f, 0x6f, 0x6b, 0x2e, 0x63, 0x6f, 0x6d, 0x20, + 0x69, 0x70, 0x34, 0x3a, 0x31, 0x35, 0x37, 0x2e, 0x35, 0x35, 0x2e, 0x39, 0x2e, 0x31, 0x32, 0x38, + 0x2f, 0x32, 0x35, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x3a, 0x73, 0x70, 0x66, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6f, 0x75, 0x74, 0x6c, 0x6f, + 0x6f, 0x6b, 0x2e, 0x63, 0x6f, 0x6d, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x3a, 0x73, + 0x70, 0x66, 0x2d, 0x61, 0x2e, 0x68, 0x6f, 0x74, 0x6d, 0x61, 0x69, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, + 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x3a, 0x5f, 0x73, 0x70, 0x66, 0x2d, 0x73, 0x73, + 0x67, 0x2d, 0x62, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x2e, 0x63, 0x6f, + 0x6d, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x3a, 0x5f, 0x73, 0x70, 0x66, 0x2d, 0x73, + 0x73, 0x67, 0x2d, 0x63, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x2e, 0x63, + 0x6f, 0x6d, 0x20, 0x7e, 0x61, 0x6c, 0x6c, 0xc0, 0x0c, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x01, + 0x2c, 0x00, 0x45, 0x44, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2d, 0x73, 0x69, 0x74, 0x65, 0x2d, + 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x30, 0x69, 0x4c, + 0x57, 0x68, 0x49, 0x4d, 0x68, 0x58, 0x45, 0x6b, 0x65, 0x57, 0x77, 0x57, 0x66, 0x46, 0x55, 0x34, + 0x75, 0x72, 0x73, 0x54, 0x6e, 0x2d, 0x5f, 0x4f, 0x76, 0x6f, 0x4f, 0x6a, 0x61, 0x41, 0x30, 0x4c, + 0x72, 0x37, 0x50, 0x67, 0x31, 0x73, 0x45, 0x4d, 0xc0, 0x0c, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, + 0xa3, 0x00, 0x00, 0x0e, 0x03, 0x6e, 0x73, 0x32, 0x04, 0x6d, 0x73, 0x66, 0x74, 0x03, 0x6e, 0x65, + 0x74, 0x00, 0xc0, 0x0c, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0xa3, 0x00, 0x00, 0x06, 0x03, 0x6e, + 0x73, 0x34, 0xc1, 0xae, 0xc0, 0x0c, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0xa3, 0x00, 0x00, 0x06, + 0x03, 0x6e, 0x73, 0x31, 0xc1, 0xae, 0xc0, 0x0c, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0xa3, 0x00, + 0x00, 0x06, 0x03, 0x6e, 0x73, 0x33, 0xc1, 0xae, 0xc0, 0x0c, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, + 0xa3, 0x00, 0x00, 0x15, 0x04, 0x6e, 0x73, 0x31, 0x61, 0x0d, +} + +func TestPacketDNSPanic7(t *testing.T) { + p := gopacket.NewPacket(testPacketDNSPanic7, LinkTypeEthernet, testDecodeOptions) + if errLayer := p.ErrorLayer(); errLayer == nil { + t.Error("No error layer on invalid DNS name") + } else if err := errLayer.Error(); !strings.Contains(err.Error(), "resource record length exceeds data") { + t.Errorf("unexpected error message: %v", err) + } +} diff --git a/vendor/github.com/google/gopacket/layers/doc.go b/vendor/github.com/google/gopacket/layers/doc.go new file mode 100644 index 0000000..3c882c3 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/doc.go @@ -0,0 +1,61 @@ +// 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 layers provides decoding layers for many common protocols. + +The layers package contains decode implementations for a number of different +types of packet layers. Users of gopacket will almost always want to also use +layers to actually decode packet data into useful pieces. To see the set of +protocols that gopacket/layers is currently able to decode, +look at the set of LayerTypes defined in the Variables sections. The +layers package also defines endpoints for many of the common packet layers +that have source/destination addresses associated with them, for example IPv4/6 +(IPs) and TCP/UDP (ports). +Finally, layers contains a number of useful enumerations (IPProtocol, +EthernetType, LinkType, PPPType, etc...). Many of these implement the +gopacket.Decoder interface, so they can be passed into gopacket as decoders. + +Most common protocol layers are named using acronyms or other industry-common +names (IPv4, TCP, PPP). Some of the less common ones have their names expanded +(CiscoDiscoveryProtocol). +For certain protocols, sub-parts of the protocol are split out into their own +layers (SCTP, for example). This is done mostly in cases where portions of the +protocol may fulfill the capabilities of interesting layers (SCTPData implements +ApplicationLayer, while base SCTP implements TransportLayer), or possibly +because splitting a protocol into a few layers makes decoding easier. + +This package is meant to be used with its parent, +http://github.com/google/gopacket. + +Port Types + +Instead of using raw uint16 or uint8 values for ports, we use a different port +type for every protocol, for example TCPPort and UDPPort. This allows us to +override string behavior for each port, which we do by setting up port name +maps (TCPPortNames, UDPPortNames, etc...). Well-known ports are annotated with +their protocol names, and their String function displays these names: + + p := TCPPort(80) + fmt.Printf("Number: %d String: %v", p, p) + // Prints: "Number: 80 String: 80(http)" + +Modifying Decode Behavior + +layers links together decoding through its enumerations. For example, after +decoding layer type Ethernet, it uses Ethernet.EthernetType as its next decoder. +All enumerations that act as decoders, like EthernetType, can be modified by +users depending on their preferences. For example, if you have a spiffy new +IPv4 decoder that works way better than the one built into layers, you can do +this: + + var mySpiffyIPv4Decoder gopacket.Decoder = ... + layers.EthernetTypeMetadata[EthernetTypeIPv4].DecodeWith = mySpiffyIPv4Decoder + +This will make all future ethernet packets use your new decoder to decode IPv4 +packets, instead of the built-in decoder used by gopacket. +*/ +package layers diff --git a/vendor/github.com/google/gopacket/layers/dot11.go b/vendor/github.com/google/gopacket/layers/dot11.go new file mode 100644 index 0000000..1b53026 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/dot11.go @@ -0,0 +1,1430 @@ +// Copyright 2014 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. + +// See http://standards.ieee.org/findstds/standard/802.11-2012.html for info on +// all of the layers in this file. + +package layers + +import ( + "bytes" + "encoding/binary" + "fmt" + "hash/crc32" + "net" + + "github.com/google/gopacket" +) + +// Dot11Flags contains the set of 8 flags in the IEEE 802.11 frame control +// header, all in one place. +type Dot11Flags uint8 + +const ( + Dot11FlagsToDS Dot11Flags = 1 << iota + Dot11FlagsFromDS + Dot11FlagsMF + Dot11FlagsRetry + Dot11FlagsPowerManagement + Dot11FlagsMD + Dot11FlagsWEP + Dot11FlagsOrder +) + +func (d Dot11Flags) ToDS() bool { + return d&Dot11FlagsToDS != 0 +} +func (d Dot11Flags) FromDS() bool { + return d&Dot11FlagsFromDS != 0 +} +func (d Dot11Flags) MF() bool { + return d&Dot11FlagsMF != 0 +} +func (d Dot11Flags) Retry() bool { + return d&Dot11FlagsRetry != 0 +} +func (d Dot11Flags) PowerManagement() bool { + return d&Dot11FlagsPowerManagement != 0 +} +func (d Dot11Flags) MD() bool { + return d&Dot11FlagsMD != 0 +} +func (d Dot11Flags) WEP() bool { + return d&Dot11FlagsWEP != 0 +} +func (d Dot11Flags) Order() bool { + return d&Dot11FlagsOrder != 0 +} + +// String provides a human readable string for Dot11Flags. +// This string is possibly subject to change over time; if you're storing this +// persistently, you should probably store the Dot11Flags value, not its string. +func (a Dot11Flags) String() string { + var out bytes.Buffer + if a.ToDS() { + out.WriteString("TO-DS,") + } + if a.FromDS() { + out.WriteString("FROM-DS,") + } + if a.MF() { + out.WriteString("MF,") + } + if a.Retry() { + out.WriteString("Retry,") + } + if a.PowerManagement() { + out.WriteString("PowerManagement,") + } + if a.MD() { + out.WriteString("MD,") + } + if a.WEP() { + out.WriteString("WEP,") + } + if a.Order() { + out.WriteString("Order,") + } + + if length := out.Len(); length > 0 { + return string(out.Bytes()[:length-1]) // strip final comma + } + return "" +} + +type Dot11Reason uint16 + +// TODO: Verify these reasons, and append more reasons if necessary. + +const ( + Dot11ReasonReserved Dot11Reason = 1 + Dot11ReasonUnspecified Dot11Reason = 2 + Dot11ReasonAuthExpired Dot11Reason = 3 + Dot11ReasonDeauthStLeaving Dot11Reason = 4 + Dot11ReasonInactivity Dot11Reason = 5 + Dot11ReasonApFull Dot11Reason = 6 + Dot11ReasonClass2FromNonAuth Dot11Reason = 7 + Dot11ReasonClass3FromNonAss Dot11Reason = 8 + Dot11ReasonDisasStLeaving Dot11Reason = 9 + Dot11ReasonStNotAuth Dot11Reason = 10 +) + +// String provides a human readable string for Dot11Reason. +// This string is possibly subject to change over time; if you're storing this +// persistently, you should probably store the Dot11Reason value, not its string. +func (a Dot11Reason) String() string { + switch a { + case Dot11ReasonReserved: + return "Reserved" + case Dot11ReasonUnspecified: + return "Unspecified" + case Dot11ReasonAuthExpired: + return "Auth. expired" + case Dot11ReasonDeauthStLeaving: + return "Deauth. st. leaving" + case Dot11ReasonInactivity: + return "Inactivity" + case Dot11ReasonApFull: + return "Ap. full" + case Dot11ReasonClass2FromNonAuth: + return "Class2 from non auth." + case Dot11ReasonClass3FromNonAss: + return "Class3 from non ass." + case Dot11ReasonDisasStLeaving: + return "Disass st. leaving" + case Dot11ReasonStNotAuth: + return "St. not auth." + default: + return "Unknown reason" + } +} + +type Dot11Status uint16 + +const ( + Dot11StatusSuccess Dot11Status = 0 + Dot11StatusFailure Dot11Status = 1 // Unspecified failure + Dot11StatusCannotSupportAllCapabilities Dot11Status = 10 // Cannot support all requested capabilities in the Capability Information field + Dot11StatusInabilityExistsAssociation Dot11Status = 11 // Reassociation denied due to inability to confirm that association exists + Dot11StatusAssociationDenied Dot11Status = 12 // Association denied due to reason outside the scope of this standard + Dot11StatusAlgorithmUnsupported Dot11Status = 13 // Responding station does not support the specified authentication algorithm + Dot11StatusOufOfExpectedSequence Dot11Status = 14 // Received an Authentication frame with authentication transaction sequence number out of expected sequence + Dot11StatusChallengeFailure Dot11Status = 15 // Authentication rejected because of challenge failure + Dot11StatusTimeout Dot11Status = 16 // Authentication rejected due to timeout waiting for next frame in sequence + Dot11StatusAPUnableToHandle Dot11Status = 17 // Association denied because AP is unable to handle additional associated stations + Dot11StatusRateUnsupported Dot11Status = 18 // Association denied due to requesting station not supporting all of the data rates in the BSSBasicRateSet parameter +) + +// String provides a human readable string for Dot11Status. +// This string is possibly subject to change over time; if you're storing this +// persistently, you should probably store the Dot11Status value, not its string. +func (a Dot11Status) String() string { + switch a { + case Dot11StatusSuccess: + return "success" + case Dot11StatusFailure: + return "failure" + case Dot11StatusCannotSupportAllCapabilities: + return "cannot-support-all-capabilities" + case Dot11StatusInabilityExistsAssociation: + return "inability-exists-association" + case Dot11StatusAssociationDenied: + return "association-denied" + case Dot11StatusAlgorithmUnsupported: + return "algorithm-unsupported" + case Dot11StatusOufOfExpectedSequence: + return "out-of-expected-sequence" + case Dot11StatusChallengeFailure: + return "challenge-failure" + case Dot11StatusTimeout: + return "timeout" + case Dot11StatusAPUnableToHandle: + return "ap-unable-to-handle" + case Dot11StatusRateUnsupported: + return "rate-unsupported" + default: + return "unknown status" + } +} + +type Dot11AckPolicy uint8 + +const ( + Dot11AckPolicyNormal Dot11AckPolicy = 0 + Dot11AckPolicyNone Dot11AckPolicy = 1 + Dot11AckPolicyNoExplicit Dot11AckPolicy = 2 + Dot11AckPolicyBlock Dot11AckPolicy = 3 +) + +// String provides a human readable string for Dot11AckPolicy. +// This string is possibly subject to change over time; if you're storing this +// persistently, you should probably store the Dot11AckPolicy value, not its string. +func (a Dot11AckPolicy) String() string { + switch a { + case Dot11AckPolicyNormal: + return "normal-ack" + case Dot11AckPolicyNone: + return "no-ack" + case Dot11AckPolicyNoExplicit: + return "no-explicit-ack" + case Dot11AckPolicyBlock: + return "block-ack" + default: + return "unknown-ack-policy" + } +} + +type Dot11Algorithm uint16 + +const ( + Dot11AlgorithmOpen Dot11Algorithm = 0 + Dot11AlgorithmSharedKey Dot11Algorithm = 1 +) + +// String provides a human readable string for Dot11Algorithm. +// This string is possibly subject to change over time; if you're storing this +// persistently, you should probably store the Dot11Algorithm value, not its string. +func (a Dot11Algorithm) String() string { + switch a { + case Dot11AlgorithmOpen: + return "open" + case Dot11AlgorithmSharedKey: + return "shared-key" + default: + return "unknown-algorithm" + } +} + +type Dot11InformationElementID uint8 + +// TODO: Verify these element ids, and append more ids if more. + +const ( + Dot11InformationElementIDSSID Dot11InformationElementID = 0 + Dot11InformationElementIDRates Dot11InformationElementID = 1 + Dot11InformationElementIDFHSet Dot11InformationElementID = 2 + Dot11InformationElementIDDSSet Dot11InformationElementID = 3 + Dot11InformationElementIDCFSet Dot11InformationElementID = 4 + Dot11InformationElementIDTIM Dot11InformationElementID = 5 + Dot11InformationElementIDIBSSSet Dot11InformationElementID = 6 + Dot11InformationElementIDChallenge Dot11InformationElementID = 16 + Dot11InformationElementIDERPInfo Dot11InformationElementID = 42 + Dot11InformationElementIDQOSCapability Dot11InformationElementID = 46 + Dot11InformationElementIDERPInfo2 Dot11InformationElementID = 47 + Dot11InformationElementIDRSNInfo Dot11InformationElementID = 48 + Dot11InformationElementIDESRates Dot11InformationElementID = 50 + Dot11InformationElementIDVendor Dot11InformationElementID = 221 + Dot11InformationElementIDReserved Dot11InformationElementID = 68 +) + +// String provides a human readable string for Dot11InformationElementID. +// This string is possibly subject to change over time; if you're storing this +// persistently, you should probably store the Dot11InformationElementID value, +// not its string. +func (a Dot11InformationElementID) String() string { + switch a { + case Dot11InformationElementIDSSID: + return "SSID" + case Dot11InformationElementIDRates: + return "Rates" + case Dot11InformationElementIDFHSet: + return "FHset" + case Dot11InformationElementIDDSSet: + return "DSset" + case Dot11InformationElementIDCFSet: + return "CFset" + case Dot11InformationElementIDTIM: + return "TIM" + case Dot11InformationElementIDIBSSSet: + return "IBSSset" + case Dot11InformationElementIDChallenge: + return "Challenge" + case Dot11InformationElementIDERPInfo: + return "ERPinfo" + case Dot11InformationElementIDQOSCapability: + return "QOS capability" + case Dot11InformationElementIDERPInfo2: + return "ERPinfo2" + case Dot11InformationElementIDRSNInfo: + return "RSNinfo" + case Dot11InformationElementIDESRates: + return "ESrates" + case Dot11InformationElementIDVendor: + return "Vendor" + case Dot11InformationElementIDReserved: + return "Reserved" + default: + return "Unknown information element id" + } +} + +// Dot11 provides an IEEE 802.11 base packet header. +// See http://standards.ieee.org/findstds/standard/802.11-2012.html +// for excrutiating detail. +type Dot11 struct { + BaseLayer + Type Dot11Type + Proto uint8 + Flags Dot11Flags + DurationID uint16 + Address1 net.HardwareAddr + Address2 net.HardwareAddr + Address3 net.HardwareAddr + Address4 net.HardwareAddr + SequenceNumber uint16 + FragmentNumber uint16 + Checksum uint32 +} + +func decodeDot11(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11) LayerType() gopacket.LayerType { return LayerTypeDot11 } +func (m *Dot11) CanDecode() gopacket.LayerClass { return LayerTypeDot11 } +func (m *Dot11) NextLayerType() gopacket.LayerType { + if m.Flags.WEP() { + return (LayerTypeDot11WEP) + } + + return m.Type.LayerType() +} + +func (m *Dot11) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + if len(data) < 10 { + df.SetTruncated() + return fmt.Errorf("Dot11 length %v too short, %v required", len(data), 10) + } + m.Type = Dot11Type((data[0])&0xFC) >> 2 + + m.Proto = uint8(data[0]) & 0x0003 + m.Flags = Dot11Flags(data[1]) + m.DurationID = binary.LittleEndian.Uint16(data[2:4]) + m.Address1 = net.HardwareAddr(data[4:10]) + + offset := 10 + + mainType := m.Type.MainType() + + switch mainType { + case Dot11TypeCtrl: + switch m.Type { + case Dot11TypeCtrlRTS, Dot11TypeCtrlPowersavePoll, Dot11TypeCtrlCFEnd, Dot11TypeCtrlCFEndAck: + if len(data) < offset+6 { + df.SetTruncated() + return fmt.Errorf("Dot11 length %v too short, %v required", len(data), offset+6) + } + m.Address2 = net.HardwareAddr(data[offset : offset+6]) + offset += 6 + } + case Dot11TypeMgmt, Dot11TypeData: + if len(data) < offset+14 { + df.SetTruncated() + return fmt.Errorf("Dot11 length %v too short, %v required", len(data), offset+14) + } + m.Address2 = net.HardwareAddr(data[offset : offset+6]) + offset += 6 + m.Address3 = net.HardwareAddr(data[offset : offset+6]) + offset += 6 + + m.SequenceNumber = (binary.LittleEndian.Uint16(data[offset:offset+2]) & 0xFFF0) >> 4 + m.FragmentNumber = (binary.LittleEndian.Uint16(data[offset:offset+2]) & 0x000F) + offset += 2 + } + + if mainType == Dot11TypeData && m.Flags.FromDS() && m.Flags.ToDS() { + if len(data) < offset+6 { + df.SetTruncated() + return fmt.Errorf("Dot11 length %v too short, %v required", len(data), offset+6) + } + m.Address4 = net.HardwareAddr(data[offset : offset+6]) + offset += 6 + } + + m.BaseLayer = BaseLayer{Contents: data[0:offset], Payload: data[offset : len(data)-4]} + m.Checksum = binary.LittleEndian.Uint32(data[len(data)-4 : len(data)]) + return nil +} + +func (m *Dot11) ChecksumValid() bool { + // only for CTRL and MGMT frames + h := crc32.NewIEEE() + h.Write(m.Contents) + h.Write(m.Payload) + return m.Checksum == h.Sum32() +} + +func (m Dot11) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + buf, err := b.PrependBytes(24) + + if err != nil { + return err + } + + buf[0] = (uint8(m.Type) << 2) | m.Proto + buf[1] = uint8(m.Flags) + + binary.LittleEndian.PutUint16(buf[2:4], m.DurationID) + + copy(buf[4:10], m.Address1) + + offset := 10 + + switch m.Type.MainType() { + case Dot11TypeCtrl: + switch m.Type { + case Dot11TypeCtrlRTS, Dot11TypeCtrlPowersavePoll, Dot11TypeCtrlCFEnd, Dot11TypeCtrlCFEndAck: + copy(buf[offset:offset+6], m.Address2) + offset += 6 + } + case Dot11TypeMgmt, Dot11TypeData: + copy(buf[offset:offset+6], m.Address2) + offset += 6 + copy(buf[offset:offset+6], m.Address3) + offset += 6 + + binary.LittleEndian.PutUint16(buf[offset:offset+2], (m.SequenceNumber<<4)|m.FragmentNumber) + offset += 2 + } + + if m.Type.MainType() == Dot11TypeData && m.Flags.FromDS() && m.Flags.ToDS() { + copy(buf[offset:offset+6], m.Address4) + offset += 6 + } + + return nil +} + +// Dot11Mgmt is a base for all IEEE 802.11 management layers. +type Dot11Mgmt struct { + BaseLayer +} + +func (m *Dot11Mgmt) NextLayerType() gopacket.LayerType { return gopacket.LayerTypePayload } +func (m *Dot11Mgmt) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + m.Contents = data + return nil +} + +// Dot11Ctrl is a base for all IEEE 802.11 control layers. +type Dot11Ctrl struct { + BaseLayer +} + +func (m *Dot11Ctrl) NextLayerType() gopacket.LayerType { return gopacket.LayerTypePayload } + +func (m *Dot11Ctrl) LayerType() gopacket.LayerType { return LayerTypeDot11Ctrl } +func (m *Dot11Ctrl) CanDecode() gopacket.LayerClass { return LayerTypeDot11Ctrl } +func (m *Dot11Ctrl) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + m.Contents = data + return nil +} + +func decodeDot11Ctrl(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11Ctrl{} + return decodingLayerDecoder(d, data, p) +} + +// Dot11WEP contains WEP encrpted IEEE 802.11 data. +type Dot11WEP struct { + BaseLayer +} + +func (m *Dot11WEP) NextLayerType() gopacket.LayerType { return LayerTypeLLC } + +func (m *Dot11WEP) LayerType() gopacket.LayerType { return LayerTypeDot11WEP } +func (m *Dot11WEP) CanDecode() gopacket.LayerClass { return LayerTypeDot11WEP } +func (m *Dot11WEP) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + m.Contents = data + return nil +} + +func decodeDot11WEP(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11WEP{} + return decodingLayerDecoder(d, data, p) +} + +// Dot11Data is a base for all IEEE 802.11 data layers. +type Dot11Data struct { + BaseLayer +} + +func (m *Dot11Data) NextLayerType() gopacket.LayerType { return LayerTypeLLC } + +func (m *Dot11Data) LayerType() gopacket.LayerType { return LayerTypeDot11Data } +func (m *Dot11Data) CanDecode() gopacket.LayerClass { return LayerTypeDot11Data } +func (m *Dot11Data) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + m.Payload = data + return nil +} + +func decodeDot11Data(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11Data{} + return decodingLayerDecoder(d, data, p) +} + +type Dot11DataCFAck struct { + Dot11Data +} + +func decodeDot11DataCFAck(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11DataCFAck{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11DataCFAck) LayerType() gopacket.LayerType { return LayerTypeDot11DataCFAck } +func (m *Dot11DataCFAck) CanDecode() gopacket.LayerClass { return LayerTypeDot11DataCFAck } +func (m *Dot11DataCFAck) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + return m.Dot11Data.DecodeFromBytes(data, df) +} + +type Dot11DataCFPoll struct { + Dot11Data +} + +func decodeDot11DataCFPoll(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11DataCFPoll{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11DataCFPoll) LayerType() gopacket.LayerType { return LayerTypeDot11DataCFPoll } +func (m *Dot11DataCFPoll) CanDecode() gopacket.LayerClass { return LayerTypeDot11DataCFPoll } +func (m *Dot11DataCFPoll) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + return m.Dot11Data.DecodeFromBytes(data, df) +} + +type Dot11DataCFAckPoll struct { + Dot11Data +} + +func decodeDot11DataCFAckPoll(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11DataCFAckPoll{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11DataCFAckPoll) LayerType() gopacket.LayerType { return LayerTypeDot11DataCFAckPoll } +func (m *Dot11DataCFAckPoll) CanDecode() gopacket.LayerClass { return LayerTypeDot11DataCFAckPoll } +func (m *Dot11DataCFAckPoll) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + return m.Dot11Data.DecodeFromBytes(data, df) +} + +type Dot11DataNull struct { + Dot11Data +} + +func decodeDot11DataNull(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11DataNull{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11DataNull) LayerType() gopacket.LayerType { return LayerTypeDot11DataNull } +func (m *Dot11DataNull) CanDecode() gopacket.LayerClass { return LayerTypeDot11DataNull } +func (m *Dot11DataNull) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + return m.Dot11Data.DecodeFromBytes(data, df) +} + +type Dot11DataCFAckNoData struct { + Dot11Data +} + +func decodeDot11DataCFAckNoData(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11DataCFAckNoData{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11DataCFAckNoData) LayerType() gopacket.LayerType { return LayerTypeDot11DataCFAckNoData } +func (m *Dot11DataCFAckNoData) CanDecode() gopacket.LayerClass { return LayerTypeDot11DataCFAckNoData } +func (m *Dot11DataCFAckNoData) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + return m.Dot11Data.DecodeFromBytes(data, df) +} + +type Dot11DataCFPollNoData struct { + Dot11Data +} + +func decodeDot11DataCFPollNoData(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11DataCFPollNoData{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11DataCFPollNoData) LayerType() gopacket.LayerType { return LayerTypeDot11DataCFPollNoData } +func (m *Dot11DataCFPollNoData) CanDecode() gopacket.LayerClass { return LayerTypeDot11DataCFPollNoData } +func (m *Dot11DataCFPollNoData) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + return m.Dot11Data.DecodeFromBytes(data, df) +} + +type Dot11DataCFAckPollNoData struct { + Dot11Data +} + +func decodeDot11DataCFAckPollNoData(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11DataCFAckPollNoData{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11DataCFAckPollNoData) LayerType() gopacket.LayerType { + return LayerTypeDot11DataCFAckPollNoData +} +func (m *Dot11DataCFAckPollNoData) CanDecode() gopacket.LayerClass { + return LayerTypeDot11DataCFAckPollNoData +} +func (m *Dot11DataCFAckPollNoData) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + return m.Dot11Data.DecodeFromBytes(data, df) +} + +type Dot11DataQOS struct { + Dot11Ctrl + TID uint8 /* Traffic IDentifier */ + EOSP bool /* End of service period */ + AckPolicy Dot11AckPolicy + TXOP uint8 +} + +func (m *Dot11DataQOS) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + if len(data) < 4 { + df.SetTruncated() + return fmt.Errorf("Dot11DataQOS length %v too short, %v required", len(data), 4) + } + m.TID = (uint8(data[0]) & 0x0F) + m.EOSP = (uint8(data[0]) & 0x10) == 0x10 + m.AckPolicy = Dot11AckPolicy((uint8(data[0]) & 0x60) >> 5) + m.TXOP = uint8(data[1]) + // TODO: Mesh Control bytes 2:4 + m.BaseLayer = BaseLayer{Contents: data[0:4], Payload: data[4:]} + return nil +} + +type Dot11DataQOSData struct { + Dot11DataQOS +} + +func decodeDot11DataQOSData(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11DataQOSData{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11DataQOSData) LayerType() gopacket.LayerType { return LayerTypeDot11DataQOSData } +func (m *Dot11DataQOSData) CanDecode() gopacket.LayerClass { return LayerTypeDot11DataQOSData } + +func (m *Dot11DataQOSData) NextLayerType() gopacket.LayerType { + return LayerTypeDot11Data +} + +type Dot11DataQOSDataCFAck struct { + Dot11DataQOS +} + +func decodeDot11DataQOSDataCFAck(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11DataQOSDataCFAck{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11DataQOSDataCFAck) LayerType() gopacket.LayerType { return LayerTypeDot11DataQOSDataCFAck } +func (m *Dot11DataQOSDataCFAck) CanDecode() gopacket.LayerClass { return LayerTypeDot11DataQOSDataCFAck } +func (m *Dot11DataQOSDataCFAck) NextLayerType() gopacket.LayerType { return LayerTypeDot11DataCFAck } + +type Dot11DataQOSDataCFPoll struct { + Dot11DataQOS +} + +func decodeDot11DataQOSDataCFPoll(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11DataQOSDataCFPoll{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11DataQOSDataCFPoll) LayerType() gopacket.LayerType { + return LayerTypeDot11DataQOSDataCFPoll +} +func (m *Dot11DataQOSDataCFPoll) CanDecode() gopacket.LayerClass { + return LayerTypeDot11DataQOSDataCFPoll +} +func (m *Dot11DataQOSDataCFPoll) NextLayerType() gopacket.LayerType { return LayerTypeDot11DataCFPoll } + +type Dot11DataQOSDataCFAckPoll struct { + Dot11DataQOS +} + +func decodeDot11DataQOSDataCFAckPoll(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11DataQOSDataCFAckPoll{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11DataQOSDataCFAckPoll) LayerType() gopacket.LayerType { + return LayerTypeDot11DataQOSDataCFAckPoll +} +func (m *Dot11DataQOSDataCFAckPoll) CanDecode() gopacket.LayerClass { + return LayerTypeDot11DataQOSDataCFAckPoll +} +func (m *Dot11DataQOSDataCFAckPoll) NextLayerType() gopacket.LayerType { + return LayerTypeDot11DataCFAckPoll +} + +type Dot11DataQOSNull struct { + Dot11DataQOS +} + +func decodeDot11DataQOSNull(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11DataQOSNull{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11DataQOSNull) LayerType() gopacket.LayerType { return LayerTypeDot11DataQOSNull } +func (m *Dot11DataQOSNull) CanDecode() gopacket.LayerClass { return LayerTypeDot11DataQOSNull } +func (m *Dot11DataQOSNull) NextLayerType() gopacket.LayerType { return LayerTypeDot11DataNull } + +type Dot11DataQOSCFPollNoData struct { + Dot11DataQOS +} + +func decodeDot11DataQOSCFPollNoData(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11DataQOSCFPollNoData{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11DataQOSCFPollNoData) LayerType() gopacket.LayerType { + return LayerTypeDot11DataQOSCFPollNoData +} +func (m *Dot11DataQOSCFPollNoData) CanDecode() gopacket.LayerClass { + return LayerTypeDot11DataQOSCFPollNoData +} +func (m *Dot11DataQOSCFPollNoData) NextLayerType() gopacket.LayerType { + return LayerTypeDot11DataCFPollNoData +} + +type Dot11DataQOSCFAckPollNoData struct { + Dot11DataQOS +} + +func decodeDot11DataQOSCFAckPollNoData(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11DataQOSCFAckPollNoData{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11DataQOSCFAckPollNoData) LayerType() gopacket.LayerType { + return LayerTypeDot11DataQOSCFAckPollNoData +} +func (m *Dot11DataQOSCFAckPollNoData) CanDecode() gopacket.LayerClass { + return LayerTypeDot11DataQOSCFAckPollNoData +} +func (m *Dot11DataQOSCFAckPollNoData) NextLayerType() gopacket.LayerType { + return LayerTypeDot11DataCFAckPollNoData +} + +type Dot11InformationElement struct { + BaseLayer + ID Dot11InformationElementID + Length uint8 + OUI []byte + Info []byte +} + +func (m *Dot11InformationElement) LayerType() gopacket.LayerType { + return LayerTypeDot11InformationElement +} +func (m *Dot11InformationElement) CanDecode() gopacket.LayerClass { + return LayerTypeDot11InformationElement +} + +func (m *Dot11InformationElement) NextLayerType() gopacket.LayerType { + return LayerTypeDot11InformationElement +} + +func (m *Dot11InformationElement) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + if len(data) < 2 { + df.SetTruncated() + return fmt.Errorf("Dot11InformationElement length %v too short, %v required", len(data), 2) + } + m.ID = Dot11InformationElementID(data[0]) + m.Length = data[1] + offset := int(2) + + if len(data) < offset+int(m.Length) { + df.SetTruncated() + return fmt.Errorf("Dot11InformationElement length %v too short, %v required", len(data), offset+int(m.Length)) + } + if m.ID == 221 { + // Vendor extension + m.OUI = data[offset : offset+4] + m.Info = data[offset+4 : offset+int(m.Length)] + } else { + m.Info = data[offset : offset+int(m.Length)] + } + + offset += int(m.Length) + + m.BaseLayer = BaseLayer{Contents: data[:offset], Payload: data[offset:]} + return nil +} + +func (d *Dot11InformationElement) String() string { + if d.ID == 0 { + return fmt.Sprintf("802.11 Information Element (SSID: %v)", string(d.Info)) + } else if d.ID == 1 { + rates := "" + for i := 0; i < len(d.Info); i++ { + if d.Info[i]&0x80 == 0 { + rates += fmt.Sprintf("%.1f ", float32(d.Info[i])*0.5) + } else { + rates += fmt.Sprintf("%.1f* ", float32(d.Info[i]&0x7F)*0.5) + } + } + return fmt.Sprintf("802.11 Information Element (Rates: %s Mbit)", rates) + } else if d.ID == 221 { + return fmt.Sprintf("802.11 Information Element (Vendor: ID: %v, Length: %v, OUI: %X, Info: %X)", d.ID, d.Length, d.OUI, d.Info) + } else { + return fmt.Sprintf("802.11 Information Element (ID: %v, Length: %v, Info: %X)", d.ID, d.Length, d.Info) + } +} + +func (m Dot11InformationElement) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + length := len(m.Info) + len(m.OUI) + if buf, err := b.PrependBytes(2 + length); err != nil { + return err + } else { + buf[0] = uint8(m.ID) + buf[1] = uint8(length) + copy(buf[2:], m.OUI) + copy(buf[2+len(m.OUI):], m.Info) + } + return nil +} + +func decodeDot11InformationElement(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11InformationElement{} + return decodingLayerDecoder(d, data, p) +} + +type Dot11CtrlCTS struct { + Dot11Ctrl +} + +func decodeDot11CtrlCTS(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11CtrlCTS{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11CtrlCTS) LayerType() gopacket.LayerType { + return LayerTypeDot11CtrlCTS +} +func (m *Dot11CtrlCTS) CanDecode() gopacket.LayerClass { + return LayerTypeDot11CtrlCTS +} +func (m *Dot11CtrlCTS) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + return m.Dot11Ctrl.DecodeFromBytes(data, df) +} + +type Dot11CtrlRTS struct { + Dot11Ctrl +} + +func decodeDot11CtrlRTS(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11CtrlRTS{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11CtrlRTS) LayerType() gopacket.LayerType { + return LayerTypeDot11CtrlRTS +} +func (m *Dot11CtrlRTS) CanDecode() gopacket.LayerClass { + return LayerTypeDot11CtrlRTS +} +func (m *Dot11CtrlRTS) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + return m.Dot11Ctrl.DecodeFromBytes(data, df) +} + +type Dot11CtrlBlockAckReq struct { + Dot11Ctrl +} + +func decodeDot11CtrlBlockAckReq(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11CtrlBlockAckReq{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11CtrlBlockAckReq) LayerType() gopacket.LayerType { + return LayerTypeDot11CtrlBlockAckReq +} +func (m *Dot11CtrlBlockAckReq) CanDecode() gopacket.LayerClass { + return LayerTypeDot11CtrlBlockAckReq +} +func (m *Dot11CtrlBlockAckReq) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + return m.Dot11Ctrl.DecodeFromBytes(data, df) +} + +type Dot11CtrlBlockAck struct { + Dot11Ctrl +} + +func decodeDot11CtrlBlockAck(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11CtrlBlockAck{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11CtrlBlockAck) LayerType() gopacket.LayerType { return LayerTypeDot11CtrlBlockAck } +func (m *Dot11CtrlBlockAck) CanDecode() gopacket.LayerClass { return LayerTypeDot11CtrlBlockAck } +func (m *Dot11CtrlBlockAck) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + return m.Dot11Ctrl.DecodeFromBytes(data, df) +} + +type Dot11CtrlPowersavePoll struct { + Dot11Ctrl +} + +func decodeDot11CtrlPowersavePoll(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11CtrlPowersavePoll{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11CtrlPowersavePoll) LayerType() gopacket.LayerType { + return LayerTypeDot11CtrlPowersavePoll +} +func (m *Dot11CtrlPowersavePoll) CanDecode() gopacket.LayerClass { + return LayerTypeDot11CtrlPowersavePoll +} +func (m *Dot11CtrlPowersavePoll) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + return m.Dot11Ctrl.DecodeFromBytes(data, df) +} + +type Dot11CtrlAck struct { + Dot11Ctrl +} + +func decodeDot11CtrlAck(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11CtrlAck{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11CtrlAck) LayerType() gopacket.LayerType { return LayerTypeDot11CtrlAck } +func (m *Dot11CtrlAck) CanDecode() gopacket.LayerClass { return LayerTypeDot11CtrlAck } +func (m *Dot11CtrlAck) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + return m.Dot11Ctrl.DecodeFromBytes(data, df) +} + +type Dot11CtrlCFEnd struct { + Dot11Ctrl +} + +func decodeDot11CtrlCFEnd(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11CtrlCFEnd{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11CtrlCFEnd) LayerType() gopacket.LayerType { + return LayerTypeDot11CtrlCFEnd +} +func (m *Dot11CtrlCFEnd) CanDecode() gopacket.LayerClass { + return LayerTypeDot11CtrlCFEnd +} +func (m *Dot11CtrlCFEnd) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + return m.Dot11Ctrl.DecodeFromBytes(data, df) +} + +type Dot11CtrlCFEndAck struct { + Dot11Ctrl +} + +func decodeDot11CtrlCFEndAck(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11CtrlCFEndAck{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11CtrlCFEndAck) LayerType() gopacket.LayerType { + return LayerTypeDot11CtrlCFEndAck +} +func (m *Dot11CtrlCFEndAck) CanDecode() gopacket.LayerClass { + return LayerTypeDot11CtrlCFEndAck +} +func (m *Dot11CtrlCFEndAck) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + return m.Dot11Ctrl.DecodeFromBytes(data, df) +} + +type Dot11MgmtAssociationReq struct { + Dot11Mgmt + CapabilityInfo uint16 + ListenInterval uint16 +} + +func decodeDot11MgmtAssociationReq(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11MgmtAssociationReq{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11MgmtAssociationReq) LayerType() gopacket.LayerType { + return LayerTypeDot11MgmtAssociationReq +} +func (m *Dot11MgmtAssociationReq) CanDecode() gopacket.LayerClass { + return LayerTypeDot11MgmtAssociationReq +} +func (m *Dot11MgmtAssociationReq) NextLayerType() gopacket.LayerType { + return LayerTypeDot11InformationElement +} +func (m *Dot11MgmtAssociationReq) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + if len(data) < 4 { + df.SetTruncated() + return fmt.Errorf("Dot11MgmtAssociationReq length %v too short, %v required", len(data), 4) + } + m.CapabilityInfo = binary.LittleEndian.Uint16(data[0:2]) + m.ListenInterval = binary.LittleEndian.Uint16(data[2:4]) + m.Payload = data[4:] + return m.Dot11Mgmt.DecodeFromBytes(data, df) +} + +func (m Dot11MgmtAssociationReq) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + buf, err := b.PrependBytes(4) + + if err != nil { + return err + } + + binary.LittleEndian.PutUint16(buf[0:2], m.CapabilityInfo) + binary.LittleEndian.PutUint16(buf[2:4], m.ListenInterval) + + return nil +} + +type Dot11MgmtAssociationResp struct { + Dot11Mgmt + CapabilityInfo uint16 + Status Dot11Status + AID uint16 +} + +func decodeDot11MgmtAssociationResp(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11MgmtAssociationResp{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11MgmtAssociationResp) CanDecode() gopacket.LayerClass { + return LayerTypeDot11MgmtAssociationResp +} +func (m *Dot11MgmtAssociationResp) LayerType() gopacket.LayerType { + return LayerTypeDot11MgmtAssociationResp +} +func (m *Dot11MgmtAssociationResp) NextLayerType() gopacket.LayerType { + return LayerTypeDot11InformationElement +} +func (m *Dot11MgmtAssociationResp) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + if len(data) < 6 { + df.SetTruncated() + return fmt.Errorf("Dot11MgmtAssociationResp length %v too short, %v required", len(data), 6) + } + m.CapabilityInfo = binary.LittleEndian.Uint16(data[0:2]) + m.Status = Dot11Status(binary.LittleEndian.Uint16(data[2:4])) + m.AID = binary.LittleEndian.Uint16(data[4:6]) + m.Payload = data[6:] + return m.Dot11Mgmt.DecodeFromBytes(data, df) +} + +func (m Dot11MgmtAssociationResp) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + buf, err := b.PrependBytes(6) + + if err != nil { + return err + } + + binary.LittleEndian.PutUint16(buf[0:2], m.CapabilityInfo) + binary.LittleEndian.PutUint16(buf[2:4], uint16(m.Status)) + binary.LittleEndian.PutUint16(buf[4:6], m.AID) + + return nil +} + +type Dot11MgmtReassociationReq struct { + Dot11Mgmt + CapabilityInfo uint16 + ListenInterval uint16 + CurrentApAddress net.HardwareAddr +} + +func decodeDot11MgmtReassociationReq(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11MgmtReassociationReq{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11MgmtReassociationReq) LayerType() gopacket.LayerType { + return LayerTypeDot11MgmtReassociationReq +} +func (m *Dot11MgmtReassociationReq) CanDecode() gopacket.LayerClass { + return LayerTypeDot11MgmtReassociationReq +} +func (m *Dot11MgmtReassociationReq) NextLayerType() gopacket.LayerType { + return LayerTypeDot11InformationElement +} +func (m *Dot11MgmtReassociationReq) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + if len(data) < 10 { + df.SetTruncated() + return fmt.Errorf("Dot11MgmtReassociationReq length %v too short, %v required", len(data), 10) + } + m.CapabilityInfo = binary.LittleEndian.Uint16(data[0:2]) + m.ListenInterval = binary.LittleEndian.Uint16(data[2:4]) + m.CurrentApAddress = net.HardwareAddr(data[4:10]) + m.Payload = data[10:] + return m.Dot11Mgmt.DecodeFromBytes(data, df) +} + +func (m Dot11MgmtReassociationReq) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + buf, err := b.PrependBytes(10) + + if err != nil { + return err + } + + binary.LittleEndian.PutUint16(buf[0:2], m.CapabilityInfo) + binary.LittleEndian.PutUint16(buf[2:4], m.ListenInterval) + + copy(buf[4:10], m.CurrentApAddress) + + return nil +} + +type Dot11MgmtReassociationResp struct { + Dot11Mgmt +} + +func decodeDot11MgmtReassociationResp(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11MgmtReassociationResp{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11MgmtReassociationResp) LayerType() gopacket.LayerType { + return LayerTypeDot11MgmtReassociationResp +} +func (m *Dot11MgmtReassociationResp) CanDecode() gopacket.LayerClass { + return LayerTypeDot11MgmtReassociationResp +} +func (m *Dot11MgmtReassociationResp) NextLayerType() gopacket.LayerType { + return LayerTypeDot11InformationElement +} + +type Dot11MgmtProbeReq struct { + Dot11Mgmt +} + +func decodeDot11MgmtProbeReq(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11MgmtProbeReq{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11MgmtProbeReq) LayerType() gopacket.LayerType { return LayerTypeDot11MgmtProbeReq } +func (m *Dot11MgmtProbeReq) CanDecode() gopacket.LayerClass { return LayerTypeDot11MgmtProbeReq } +func (m *Dot11MgmtProbeReq) NextLayerType() gopacket.LayerType { + return LayerTypeDot11InformationElement +} + +type Dot11MgmtProbeResp struct { + Dot11Mgmt + Timestamp uint64 + Interval uint16 + Flags uint16 +} + +func decodeDot11MgmtProbeResp(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11MgmtProbeResp{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11MgmtProbeResp) LayerType() gopacket.LayerType { return LayerTypeDot11MgmtProbeResp } +func (m *Dot11MgmtProbeResp) CanDecode() gopacket.LayerClass { return LayerTypeDot11MgmtProbeResp } +func (m *Dot11MgmtProbeResp) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + if len(data) < 12 { + df.SetTruncated() + + return fmt.Errorf("Dot11MgmtProbeResp length %v too short, %v required", len(data), 12) + } + + m.Timestamp = binary.LittleEndian.Uint64(data[0:8]) + m.Interval = binary.LittleEndian.Uint16(data[8:10]) + m.Flags = binary.LittleEndian.Uint16(data[10:12]) + m.Payload = data[12:] + + return m.Dot11Mgmt.DecodeFromBytes(data, df) +} + +func (m *Dot11MgmtProbeResp) NextLayerType() gopacket.LayerType { + return LayerTypeDot11InformationElement +} + +func (m Dot11MgmtProbeResp) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + buf, err := b.PrependBytes(12) + + if err != nil { + return err + } + + binary.LittleEndian.PutUint64(buf[0:8], m.Timestamp) + binary.LittleEndian.PutUint16(buf[8:10], m.Interval) + binary.LittleEndian.PutUint16(buf[10:12], m.Flags) + + return nil +} + +type Dot11MgmtMeasurementPilot struct { + Dot11Mgmt +} + +func decodeDot11MgmtMeasurementPilot(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11MgmtMeasurementPilot{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11MgmtMeasurementPilot) LayerType() gopacket.LayerType { + return LayerTypeDot11MgmtMeasurementPilot +} +func (m *Dot11MgmtMeasurementPilot) CanDecode() gopacket.LayerClass { + return LayerTypeDot11MgmtMeasurementPilot +} + +type Dot11MgmtBeacon struct { + Dot11Mgmt + Timestamp uint64 + Interval uint16 + Flags uint16 +} + +func decodeDot11MgmtBeacon(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11MgmtBeacon{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11MgmtBeacon) LayerType() gopacket.LayerType { return LayerTypeDot11MgmtBeacon } +func (m *Dot11MgmtBeacon) CanDecode() gopacket.LayerClass { return LayerTypeDot11MgmtBeacon } +func (m *Dot11MgmtBeacon) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + if len(data) < 12 { + df.SetTruncated() + return fmt.Errorf("Dot11MgmtBeacon length %v too short, %v required", len(data), 12) + } + m.Timestamp = binary.LittleEndian.Uint64(data[0:8]) + m.Interval = binary.LittleEndian.Uint16(data[8:10]) + m.Flags = binary.LittleEndian.Uint16(data[10:12]) + m.Payload = data[12:] + return m.Dot11Mgmt.DecodeFromBytes(data, df) +} + +func (m *Dot11MgmtBeacon) NextLayerType() gopacket.LayerType { return LayerTypeDot11InformationElement } + +func (m Dot11MgmtBeacon) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + buf, err := b.PrependBytes(12) + + if err != nil { + return err + } + + binary.LittleEndian.PutUint64(buf[0:8], m.Timestamp) + binary.LittleEndian.PutUint16(buf[8:10], m.Interval) + binary.LittleEndian.PutUint16(buf[10:12], m.Flags) + + return nil +} + +type Dot11MgmtATIM struct { + Dot11Mgmt +} + +func decodeDot11MgmtATIM(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11MgmtATIM{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11MgmtATIM) LayerType() gopacket.LayerType { return LayerTypeDot11MgmtATIM } +func (m *Dot11MgmtATIM) CanDecode() gopacket.LayerClass { return LayerTypeDot11MgmtATIM } + +type Dot11MgmtDisassociation struct { + Dot11Mgmt + Reason Dot11Reason +} + +func decodeDot11MgmtDisassociation(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11MgmtDisassociation{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11MgmtDisassociation) LayerType() gopacket.LayerType { + return LayerTypeDot11MgmtDisassociation +} +func (m *Dot11MgmtDisassociation) CanDecode() gopacket.LayerClass { + return LayerTypeDot11MgmtDisassociation +} +func (m *Dot11MgmtDisassociation) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + if len(data) < 2 { + df.SetTruncated() + return fmt.Errorf("Dot11MgmtDisassociation length %v too short, %v required", len(data), 2) + } + m.Reason = Dot11Reason(binary.LittleEndian.Uint16(data[0:2])) + return m.Dot11Mgmt.DecodeFromBytes(data, df) +} + +func (m Dot11MgmtDisassociation) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + buf, err := b.PrependBytes(2) + + if err != nil { + return err + } + + binary.LittleEndian.PutUint16(buf[0:2], uint16(m.Reason)) + + return nil +} + +type Dot11MgmtAuthentication struct { + Dot11Mgmt + Algorithm Dot11Algorithm + Sequence uint16 + Status Dot11Status +} + +func decodeDot11MgmtAuthentication(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11MgmtAuthentication{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11MgmtAuthentication) LayerType() gopacket.LayerType { + return LayerTypeDot11MgmtAuthentication +} +func (m *Dot11MgmtAuthentication) CanDecode() gopacket.LayerClass { + return LayerTypeDot11MgmtAuthentication +} +func (m *Dot11MgmtAuthentication) NextLayerType() gopacket.LayerType { + return LayerTypeDot11InformationElement +} +func (m *Dot11MgmtAuthentication) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + if len(data) < 6 { + df.SetTruncated() + return fmt.Errorf("Dot11MgmtAuthentication length %v too short, %v required", len(data), 6) + } + m.Algorithm = Dot11Algorithm(binary.LittleEndian.Uint16(data[0:2])) + m.Sequence = binary.LittleEndian.Uint16(data[2:4]) + m.Status = Dot11Status(binary.LittleEndian.Uint16(data[4:6])) + m.Payload = data[6:] + return m.Dot11Mgmt.DecodeFromBytes(data, df) +} + +func (m Dot11MgmtAuthentication) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + buf, err := b.PrependBytes(6) + + if err != nil { + return err + } + + binary.LittleEndian.PutUint16(buf[0:2], uint16(m.Algorithm)) + binary.LittleEndian.PutUint16(buf[2:4], m.Sequence) + binary.LittleEndian.PutUint16(buf[4:6], uint16(m.Status)) + + return nil +} + +type Dot11MgmtDeauthentication struct { + Dot11Mgmt + Reason Dot11Reason +} + +func decodeDot11MgmtDeauthentication(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11MgmtDeauthentication{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11MgmtDeauthentication) LayerType() gopacket.LayerType { + return LayerTypeDot11MgmtDeauthentication +} +func (m *Dot11MgmtDeauthentication) CanDecode() gopacket.LayerClass { + return LayerTypeDot11MgmtDeauthentication +} +func (m *Dot11MgmtDeauthentication) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + if len(data) < 2 { + df.SetTruncated() + return fmt.Errorf("Dot11MgmtDeauthentication length %v too short, %v required", len(data), 2) + } + m.Reason = Dot11Reason(binary.LittleEndian.Uint16(data[0:2])) + return m.Dot11Mgmt.DecodeFromBytes(data, df) +} + +func (m Dot11MgmtDeauthentication) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + buf, err := b.PrependBytes(2) + + if err != nil { + return err + } + + binary.LittleEndian.PutUint16(buf[0:2], uint16(m.Reason)) + + return nil +} + +type Dot11MgmtAction struct { + Dot11Mgmt +} + +func decodeDot11MgmtAction(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11MgmtAction{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11MgmtAction) LayerType() gopacket.LayerType { return LayerTypeDot11MgmtAction } +func (m *Dot11MgmtAction) CanDecode() gopacket.LayerClass { return LayerTypeDot11MgmtAction } + +type Dot11MgmtActionNoAck struct { + Dot11Mgmt +} + +func decodeDot11MgmtActionNoAck(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11MgmtActionNoAck{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11MgmtActionNoAck) LayerType() gopacket.LayerType { return LayerTypeDot11MgmtActionNoAck } +func (m *Dot11MgmtActionNoAck) CanDecode() gopacket.LayerClass { return LayerTypeDot11MgmtActionNoAck } + +type Dot11MgmtArubaWLAN struct { + Dot11Mgmt +} + +func decodeDot11MgmtArubaWLAN(data []byte, p gopacket.PacketBuilder) error { + d := &Dot11MgmtArubaWLAN{} + return decodingLayerDecoder(d, data, p) +} + +func (m *Dot11MgmtArubaWLAN) LayerType() gopacket.LayerType { return LayerTypeDot11MgmtArubaWLAN } +func (m *Dot11MgmtArubaWLAN) CanDecode() gopacket.LayerClass { return LayerTypeDot11MgmtArubaWLAN } diff --git a/vendor/github.com/google/gopacket/layers/dot11_test.go b/vendor/github.com/google/gopacket/layers/dot11_test.go new file mode 100644 index 0000000..b0299fc --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/dot11_test.go @@ -0,0 +1,495 @@ +// Copyright 2014, 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 layers + +import ( + "bytes" + "net" + "reflect" + "testing" + + "github.com/google/gopacket" +) + +// Generator: python layers/test_creator.py --layerType=LayerTypeRadioTap --linkType=LinkTypeIEEE80211Radio --name=Dot11%s ~/Downloads/mesh.pcap +// http://wiki.wireshark.org/SampleCaptures#Sample_Captures + +// testPacketDot11CtrlCTS is the packet: +// 09:28:41.830560 20604983us tsft short preamble 24.0 Mb/s 5240 MHz 11a -79dB signal -92dB noise antenna 1 Clear-To-Send RA:d8:a2:5e:97:61:c1 +// 0x0000: 0000 1900 6f08 0000 3768 3a01 0000 0000 ....o...7h:..... +// 0x0010: 1230 7814 4001 b1a4 01c4 0094 00d8 a25e .0x.@..........^ +// 0x0020: 9761 c136 5095 8e .a.6P.. + +var testPacketDot11CtrlCTS = []byte{ + 0x00, 0x00, 0x19, 0x00, 0x6f, 0x08, 0x00, 0x00, 0x37, 0x68, 0x3a, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x12, 0x30, 0x78, 0x14, 0x40, 0x01, 0xb1, 0xa4, 0x01, 0xc4, 0x00, 0x94, 0x00, 0xd8, 0xa2, 0x5e, + 0x97, 0x61, 0xc1, 0x36, 0x50, 0x95, 0x8e, +} + +func TestPacketDot11CtrlCTS(t *testing.T) { + p := gopacket.NewPacket(testPacketDot11CtrlCTS, LinkTypeIEEE80211Radio, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeRadioTap, LayerTypeDot11}, t) + + if got, ok := p.Layer(LayerTypeRadioTap).(*RadioTap); ok { + want := &RadioTap{ + BaseLayer: BaseLayer{ + Contents: []uint8{0x0, 0x0, 0x19, 0x0, 0x6f, 0x8, 0x0, 0x0, 0x37, 0x68, 0x3a, 0x1, 0x0, 0x0, 0x0, 0x0, 0x12, 0x30, 0x78, 0x14, 0x40, 0x1, 0xb1, 0xa4, 0x1}, + Payload: []uint8{0xc4, 0x0, 0x94, 0x0, 0xd8, 0xa2, 0x5e, 0x97, 0x61, 0xc1, 0x36, 0x50, 0x95, 0x8e}, + }, + Version: 0x0, + Length: 0x19, + Present: 0x86f, + TSFT: 0x13a6837, + Flags: 0x12, + Rate: 0x30, + ChannelFrequency: 0x1478, + ChannelFlags: 0x140, + FHSS: 0x0, + DBMAntennaSignal: -79, + DBMAntennaNoise: -92, + LockQuality: 0x0, + TxAttenuation: 0x0, + DBTxAttenuation: 0x0, + DBMTxPower: 0, + Antenna: 1, + DBAntennaSignal: 0x0, + DBAntennaNoise: 0x0, + } + + if !reflect.DeepEqual(got, want) { + t.Errorf("RadioTap packet processing failed:\ngot :\n%#v\n\nwant :\n%#v\n\n", got, want) + } + } + + if got, ok := p.Layer(LayerTypeDot11).(*Dot11); ok { + if !got.ChecksumValid() { + t.Errorf("Dot11 packet processing failed:\nchecksum failed. got :\n%#v\n\n", got) + } + + want := &Dot11{ + BaseLayer: BaseLayer{ + Contents: []uint8{0xc4, 0x0, 0x94, 0x0, 0xd8, 0xa2, 0x5e, 0x97, 0x61, 0xc1}, + Payload: []uint8{}, + }, + Type: Dot11TypeCtrlCTS, + Proto: 0x0, + Flags: 0x0, + DurationID: 0x94, + Address1: net.HardwareAddr{0xd8, 0xa2, 0x5e, 0x97, 0x61, 0xc1}, // check + Address2: net.HardwareAddr(nil), + Address3: net.HardwareAddr(nil), + Address4: net.HardwareAddr(nil), + Checksum: 0x8e955036, + } + + if !reflect.DeepEqual(got, want) { + t.Errorf("Dot11 packet processing failed:\ngot :\n%#v\n\nwant :\n%#v\n\n", got, want) + } + } +} + +func BenchmarkDecodePacketDot11CtrlCTS(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testPacketDot11CtrlCTS, LinkTypeIEEE80211Radio, gopacket.NoCopy) + } +} + +// testPacketDot11MgmtBeacon is the packet: +// 15:44:56.531833 6.0 Mb/s 2412 MHz 11g -81dB signal antenna 5 Beacon (Wi2) [6.0* 9.0 12.0* 18.0 24.0* 36.0 48.0 54.0 Mbit] ESS CH: 1 +// 0x0000: 0000 1200 2e48 0000 100c 6c09 c000 af05 .....H....l..... +// 0x0010: 0000 8000 0000 ffff ffff ffff c08a de01 ................ +// 0x0020: 11b8 c08a de01 11b8 f097 80f1 30bc 1300 ............0... +// 0x0030: 0000 6400 2104 0003 5769 3201 088c 1298 ..d.!...Wi2..... +// 0x0040: 24b0 4860 6c03 0101 0504 0001 0000 2a01 $.H`l.........*. +// 0x0050: 00dd 1800 50f2 0201 0181 0007 a400 0023 ....P..........# +// 0x0060: a400 0042 435e 0062 322f 00dd 1e00 904c ...BC^.b2/.....L +// 0x0070: 338c 011b ffff 0000 0000 0000 0000 0000 3............... +// 0x0080: 1000 0000 0000 0000 0000 002d 1a8c 011b ...........-.... +// 0x0090: ffff 0000 0000 0000 0000 0000 1000 0000 ................ +// 0x00a0: 0000 0000 0000 00dd 1a00 904c 3401 0000 ...........L4... +// 0x00b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ +// 0x00c0: 0000 003d 1601 0000 0000 0000 0000 0000 ...=............ +// 0x00d0: 0000 0000 0000 0000 0000 007f 0400 0000 ................ +// 0x00e0: 00dd 0800 1392 0100 0185 0094 0b90 15 ............... +var testPacketDot11MgmtBeacon = []byte{ + 0x00, 0x00, 0x12, 0x00, 0x2e, 0x48, 0x00, 0x00, 0x10, 0x0c, 0x6c, 0x09, 0xc0, 0x00, 0xaf, 0x05, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x8a, 0xde, 0x01, + 0x11, 0xb8, 0xc0, 0x8a, 0xde, 0x01, 0x11, 0xb8, 0xf0, 0x97, 0x80, 0xf1, 0x30, 0xbc, 0x13, 0x00, + 0x00, 0x00, 0x64, 0x00, 0x21, 0x04, 0x00, 0x03, 0x57, 0x69, 0x32, 0x01, 0x08, 0x8c, 0x12, 0x98, + 0x24, 0xb0, 0x48, 0x60, 0x6c, 0x03, 0x01, 0x01, 0x05, 0x04, 0x00, 0x01, 0x00, 0x00, 0x2a, 0x01, + 0x00, 0xdd, 0x18, 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0x81, 0x00, 0x07, 0xa4, 0x00, 0x00, 0x23, + 0xa4, 0x00, 0x00, 0x42, 0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00, 0xdd, 0x1e, 0x00, 0x90, 0x4c, + 0x33, 0x8c, 0x01, 0x1b, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x1a, 0x8c, 0x01, 0x1b, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdd, 0x1a, 0x00, 0x90, 0x4c, 0x34, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3d, 0x16, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x04, 0x00, 0x00, 0x00, + 0x00, 0xdd, 0x08, 0x00, 0x13, 0x92, 0x01, 0x00, 0x01, 0x85, 0x00, 0x94, 0x0b, 0x90, 0x15, +} + +func TestPacketDot11MgmtBeacon(t *testing.T) { + p := gopacket.NewPacket(testPacketDot11MgmtBeacon, LinkTypeIEEE80211Radio, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + expectedLayers := []gopacket.LayerType{LayerTypeRadioTap, LayerTypeDot11, LayerTypeDot11MgmtBeacon} + for i := 0; i < 12; i++ { + expectedLayers = append(expectedLayers, LayerTypeDot11InformationElement) + } + checkLayers(p, expectedLayers, t) + + if p.Layer(LayerTypeDot11).(*Dot11).SequenceNumber != 2431 { + t.Error("dot11 invalid sequence number") + } + if p.Layer(LayerTypeDot11).(*Dot11).FragmentNumber != 0 { + t.Error("dot11 invalid fragment number") + } + if _, ok := p.Layer(LayerTypeDot11MgmtBeacon).(*Dot11MgmtBeacon); !ok { + t.Errorf("dot11 management beacon frame was expected") + } +} + +func BenchmarkDecodePacketDot11MgmtBeacon(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testPacketDot11MgmtBeacon, LinkTypeIEEE80211Radio, gopacket.NoCopy) + } +} + +// testPacketDot11DataQOSData is the packet: +// 06:14:27.838634 638790765us tsft short preamble 54.0 Mb/s -51dB signal -96dB noise antenna 2 5180 MHz 11a CF +QoS ARP, Request who-has 140.180.51.68 tell 169.254.247.0, length 28 +// 0x0000: 0000 2000 6708 0400 6d2c 1326 0000 0000 ....g...m,.&.... +// 0x0010: 226c cda0 0200 0000 4001 0000 3c14 2411 "l......@...<.$. +// 0x0020: 8801 2c00 0603 7f07 a016 0019 e3d3 5352 ..,...........SR +// 0x0030: ffff ffff ffff 5064 0000 50aa aaaa 0300 ......Pd..P..... +// 0x0040: 0000 0806 0001 0800 0604 0001 0019 e3d3 ................ +// 0x0050: 5352 a9fe f700 0000 0000 0000 8cb4 3344 SR............3D +var testPacketDot11DataQOSData = []byte{ + 0x00, 0x00, 0x20, 0x00, 0x67, 0x08, 0x04, 0x00, 0x6d, 0x2c, 0x13, 0x26, 0x00, 0x00, 0x00, 0x00, + 0x22, 0x6c, 0xcd, 0xa0, 0x02, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x3c, 0x14, 0x24, 0x11, + 0x88, 0x01, 0x2c, 0x00, 0x06, 0x03, 0x7f, 0x07, 0xa0, 0x16, 0x00, 0x19, 0xe3, 0xd3, 0x53, 0x52, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x64, 0x00, 0x00, 0x50, 0xaa, 0xaa, 0xaa, 0x03, 0x00, + 0x00, 0x00, 0x08, 0x06, 0x00, 0x01, 0x08, 0x00, 0x06, 0x04, 0x00, 0x01, 0x00, 0x19, 0xe3, 0xd3, + 0x53, 0x52, 0xa9, 0xfe, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0xb4, 0x33, 0x44, +} + +func TestPacketDot11DataQOSData(t *testing.T) { + p := gopacket.NewPacket(testPacketDot11DataQOSData, LinkTypeIEEE80211Radio, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeRadioTap, LayerTypeDot11, LayerTypeDot11DataQOSData, LayerTypeDot11Data, LayerTypeLLC, LayerTypeSNAP, LayerTypeARP}, t) + + if got, ok := p.Layer(LayerTypeARP).(*ARP); ok { + want := &ARP{BaseLayer: BaseLayer{ + Contents: []uint8{0x0, 0x1, 0x8, 0x0, 0x6, 0x4, 0x0, 0x1, 0x0, 0x19, 0xe3, 0xd3, 0x53, 0x52, 0xa9, 0xfe, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8c, 0xb4, 0x33, 0x44}, + Payload: []uint8{}, + }, + AddrType: 0x1, + Protocol: 0x800, + HwAddressSize: 0x6, + ProtAddressSize: 0x4, + Operation: 0x1, + SourceHwAddress: []uint8{0x0, 0x19, 0xe3, 0xd3, 0x53, 0x52}, + SourceProtAddress: []uint8{0xa9, 0xfe, 0xf7, 0x0}, + DstHwAddress: []uint8{0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, + DstProtAddress: []uint8{0x8c, 0xb4, 0x33, 0x44}, + } + + if !reflect.DeepEqual(got, want) { + t.Errorf("ARP packet processing failed:\ngot :\n%#v\n\nwant :\n%#v\n\n", got, want) + } + } +} +func BenchmarkDecodePacketDot11DataQOSData(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testPacketDot11DataQOSData, LinkTypeIEEE80211Radio, gopacket.NoCopy) + } +} + +// testPacketDot11MgmtAction is the packet: +// 15:54:43.236460 1.0 Mb/s 2412 MHz 11b -67dB signal antenna 5 Action (8e:3a:e3:44:ac:c6): Spectrum Management Act#4 +// 0x0000: 0000 1200 2e48 0000 1002 6c09 a000 bd05 .....H....l..... +// 0x0010: 0000 d000 0000 ffff ffff ffff 8e3a e344 .............:.D +// 0x0020: acc6 8e3a e344 acc6 001b 0004 2503 0001 ...:.D......%... +// 0x0030: 0055 39f0 33 .U9.3 +var testPacketDot11MgmtAction = []byte{ + 0x00, 0x00, 0x12, 0x00, 0x2e, 0x48, 0x00, 0x00, 0x10, 0x02, 0x6c, 0x09, 0xa0, 0x00, 0xbd, 0x05, + 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e, 0x3a, 0xe3, 0x44, + 0xac, 0xc6, 0x8e, 0x3a, 0xe3, 0x44, 0xac, 0xc6, 0x00, 0x1b, 0x00, 0x04, 0x25, 0x03, 0x00, 0x01, + 0x00, 0x55, 0x39, 0xf0, 0x33, +} + +func TestPacketDot11MgmtAction(t *testing.T) { + p := gopacket.NewPacket(testPacketDot11MgmtAction, LinkTypeIEEE80211Radio, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeRadioTap, LayerTypeDot11, LayerTypeDot11MgmtAction}, t) + if got, ok := p.Layer(LayerTypeDot11).(*Dot11); !ok { + t.Errorf("dot11 frame was not parsed") + } else if !got.ChecksumValid() { + t.Errorf("Dot11 packet processing failed: checksum failed") + } + if got, ok := p.Layer(LayerTypeDot11MgmtAction).(*Dot11MgmtAction); !ok { + t.Errorf("management action frame was not parsed") + } else if got.Contents[0] != 0 { + t.Errorf("action category was not spectrum management") + } +} + +func BenchmarkDecodePacketDot11MgmtAction(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testPacketDot11MgmtAction, LinkTypeIEEE80211Radio, gopacket.NoCopy) + } +} + +// testPacketDot11CtrlAck is the packet: +// 06:14:27.838669 638758038us tsft short preamble 24.0 Mb/s -39dB signal -96dB noise antenna 2 5180 MHz 11a Acknowledgment RA:00:19:e3:d3:53:52 +// 0x0000: 0000 2000 6708 0400 96ac 1226 0000 0000 ....g......&.... +// 0x0010: 2230 d9a0 0200 0000 4001 0000 3c14 2411 "0......@...<.$. +// 0x0020: d400 0000 0019 e3d3 5352 46e9 7687 ........SRF.v. +var testPacketDot11CtrlAck = []byte{ + 0x00, 0x00, 0x20, 0x00, 0x67, 0x08, 0x04, 0x00, 0x96, 0xac, 0x12, 0x26, 0x00, 0x00, 0x00, 0x00, + 0x32, 0x30, 0xd9, 0xa0, 0x02, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x3c, 0x14, 0x24, 0x11, + 0xd4, 0x00, 0x00, 0x00, 0x00, 0x19, 0xe3, 0xd3, 0x53, 0x52, 0x46, 0xe9, 0x76, 0x87, +} + +func TestPacketDot11CtrlAck(t *testing.T) { + p := gopacket.NewPacket(testPacketDot11CtrlAck, LinkTypeIEEE80211Radio, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeRadioTap, LayerTypeDot11}, t) + + if got, ok := p.Layer(LayerTypeDot11).(*Dot11); ok { + if !got.ChecksumValid() { + t.Errorf("Dot11 packet processing failed:\nchecksum failed. got :\n%#v\n\n", got) + } + } + + if got, ok := p.Layer(LayerTypeDot11).(*Dot11); ok { + if !got.ChecksumValid() { + t.Errorf("Dot11 packet processing failed:\nchecksum failed. got :\n%#v\n\n", got) + } + want := &Dot11{ + BaseLayer: BaseLayer{ + Contents: []uint8{0xd4, 0x0, 0x0, 0x0, 0x0, 0x19, 0xe3, 0xd3, 0x53, 0x52}, + Payload: []uint8{}, + }, + Type: Dot11TypeCtrlAck, + Proto: 0x0, + Flags: 0x0, + DurationID: 0x0, + Address1: net.HardwareAddr{0x0, 0x19, 0xe3, 0xd3, 0x53, 0x52}, + Address2: net.HardwareAddr(nil), + Address3: net.HardwareAddr(nil), + Address4: net.HardwareAddr(nil), + Checksum: 0x8776e946, + } + if !reflect.DeepEqual(got, want) { + t.Errorf("Dot11 packet processing failed:\ngot :\n%#v\n\nwant :\n%#v\n\n", got, want) + } + } +} +func BenchmarkDecodePacketDot11CtrlAck(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testPacketDot11CtrlAck, LinkTypeIEEE80211Radio, gopacket.NoCopy) + } +} + +// testPacketDot11DataARP is the packet: +// 06:14:11.512316 622463798us tsft short preamble 6.0 Mb/s -39dB signal -96dB noise antenna 2 5180 MHz 11a ARP, Request who-has 67.8.14.54 tell 169.254.247.0, length 28 +// 0x0000: 0000 2000 6708 0400 360b 1a25 0000 0000 ....g...6..%.... +// 0x0010: 220c d9a0 0200 0000 4001 0000 3c14 2411 ".......@...<.$. +// 0x0020: 0802 0000 ffff ffff ffff 0603 7f07 a016 ................ +// 0x0030: 0019 e3d3 5352 e07f aaaa 0300 0000 0806 ....SR.......... +// 0x0040: 0001 0800 0604 0001 0019 e3d3 5352 a9fe ............SR.. +// 0x0050: f700 0000 0000 0000 4308 0e36 ........C..6 +var testPacketDot11DataARP = []byte{ + 0x00, 0x00, 0x20, 0x00, 0x67, 0x08, 0x04, 0x00, 0x36, 0x0b, 0x1a, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x22, 0x0c, 0xd9, 0xa0, 0x02, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x3c, 0x14, 0x24, 0x11, + 0x08, 0x02, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x06, 0x03, 0x7f, 0x07, 0xa0, 0x16, + 0x00, 0x19, 0xe3, 0xd3, 0x53, 0x52, 0xe0, 0x7f, 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00, 0x08, 0x06, + 0x00, 0x01, 0x08, 0x00, 0x06, 0x04, 0x00, 0x01, 0x00, 0x19, 0xe3, 0xd3, 0x53, 0x52, 0xa9, 0xfe, + 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x08, 0x0e, 0x36, +} + +func TestPacketDot11DataARP(t *testing.T) { + p := gopacket.NewPacket(testPacketDot11DataARP, LinkTypeIEEE80211Radio, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeRadioTap, LayerTypeDot11, LayerTypeDot11Data, LayerTypeLLC, LayerTypeSNAP, LayerTypeARP}, t) + + if got, ok := p.Layer(LayerTypeARP).(*ARP); ok { + want := &ARP{ + BaseLayer: BaseLayer{ + Contents: []uint8{0x0, 0x1, 0x8, 0x0, 0x6, 0x4, 0x0, 0x1, 0x0, 0x19, 0xe3, 0xd3, 0x53, 0x52, 0xa9, 0xfe, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x43, 0x8, 0xe, 0x36}, + Payload: []uint8{}, + }, + AddrType: 0x1, + Protocol: 0x800, + HwAddressSize: 0x6, + ProtAddressSize: 0x4, + Operation: 0x1, + SourceHwAddress: []uint8{0x0, 0x19, 0xe3, 0xd3, 0x53, 0x52}, + SourceProtAddress: []uint8{0xa9, 0xfe, 0xf7, 0x0}, + DstHwAddress: []uint8{0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, + DstProtAddress: []uint8{0x43, 0x8, 0xe, 0x36}, + } + + if !reflect.DeepEqual(got, want) { + t.Errorf("ARP packet processing failed:\ngot :\n%#v\n\nwant :\n%#v\n\n", got, want) + } + } +} + +func BenchmarkDecodePacketDot11DataARP(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testPacketDot11DataARP, LinkTypeIEEE80211Radio, gopacket.NoCopy) + } +} + +// testPacketDot11DataIP is the packet: +// 06:14:21.388622 632340487us tsft short preamble 6.0 Mb/s -40dB signal -96dB noise antenna 1 5180 MHz 11a IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:19:e3:d3:53:52, length 300 +// 0x0000: 0000 2000 6708 0400 07c0 b025 0000 0000 ....g......%.... +// 0x0010: 220c d8a0 0100 0000 4001 0000 3c14 2411 ".......@...<.$. +// 0x0020: 0802 0000 ffff ffff ffff 0603 7f07 a016 ................ +// 0x0030: 0019 e3d3 5352 4095 aaaa 0300 0000 0800 ....SR@......... +// 0x0040: 4500 0148 c514 0000 ff11 f590 0000 0000 E..H............ +// 0x0050: ffff ffff 0044 0043 0134 2b39 0101 0600 .....D.C.4+9.... +// 0x0060: 131f 8c43 003c 0000 0000 0000 0000 0000 ...C.<.......... +// 0x0070: 0000 0000 0000 0000 0019 e3d3 5352 0000 ............SR.. +// 0x0080: 0000 0000 0000 0000 0000 0000 0000 0000 ................ +// 0x0090: 0000 0000 0000 0000 0000 0000 0000 0000 ................ +// 0x00a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ +// 0x00b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ +// 0x00c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ +// 0x00d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ +// 0x00e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ +// 0x00f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ +// 0x0100: 0000 0000 0000 0000 0000 0000 0000 0000 ................ +// 0x0110: 0000 0000 0000 0000 0000 0000 0000 0000 ................ +// 0x0120: 0000 0000 0000 0000 0000 0000 0000 0000 ................ +// 0x0130: 0000 0000 0000 0000 0000 0000 0000 0000 ................ +// 0x0140: 0000 0000 0000 0000 6382 5363 3501 0137 ........c.Sc5..7 +// 0x0150: 0a01 0306 0f77 5ffc 2c2e 2f39 0205 dc3d .....w_.,./9...= +// 0x0160: 0701 0019 e3d3 5352 3304 0076 a700 0c0b ......SR3..v.... +// 0x0170: 4d61 6369 6e74 6f73 682d 34ff 0000 0000 Macintosh-4..... +// 0x0180: 0000 0000 0000 0000 ........ +var testPacketDot11DataIP = []byte{ + 0x00, 0x00, 0x20, 0x00, 0x67, 0x08, 0x04, 0x00, 0x07, 0xc0, 0xb0, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x22, 0x0c, 0xd8, 0xa0, 0x01, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x3c, 0x14, 0x24, 0x11, + 0x08, 0x02, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x06, 0x03, 0x7f, 0x07, 0xa0, 0x16, + 0x00, 0x19, 0xe3, 0xd3, 0x53, 0x52, 0x40, 0x95, 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x45, 0x00, 0x01, 0x48, 0xc5, 0x14, 0x00, 0x00, 0xff, 0x11, 0xf5, 0x90, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x44, 0x00, 0x43, 0x01, 0x34, 0x2b, 0x39, 0x01, 0x01, 0x06, 0x00, + 0x13, 0x1f, 0x8c, 0x43, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xe3, 0xd3, 0x53, 0x52, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x82, 0x53, 0x63, 0x35, 0x01, 0x01, 0x37, + 0x0a, 0x01, 0x03, 0x06, 0x0f, 0x77, 0x5f, 0xfc, 0x2c, 0x2e, 0x2f, 0x39, 0x02, 0x05, 0xdc, 0x3d, + 0x07, 0x01, 0x00, 0x19, 0xe3, 0xd3, 0x53, 0x52, 0x33, 0x04, 0x00, 0x76, 0xa7, 0x00, 0x0c, 0x0b, + 0x4d, 0x61, 0x63, 0x69, 0x6e, 0x74, 0x6f, 0x73, 0x68, 0x2d, 0x34, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +} + +func TestPacketDot11DataIP(t *testing.T) { + p := gopacket.NewPacket(testPacketDot11DataIP, LinkTypeIEEE80211Radio, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeRadioTap, LayerTypeDot11, LayerTypeDot11Data, LayerTypeLLC, LayerTypeSNAP, LayerTypeIPv4, LayerTypeUDP, LayerTypeDHCPv4}, t) +} +func BenchmarkDecodePacketDot11DataIP(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testPacketDot11DataIP, LinkTypeIEEE80211Radio, gopacket.NoCopy) + } +} + +// Encrypted + +/// testPacketP6196 is the packet: +// 09:28:41.830631 20605036us tsft wep -69dB signal -92dB noise antenna 1 5240 MHz 11a ht/40- 162.0 Mb/s MCS 12 40 MHz lon GI mixed BCC FEC [bit 20] CF +QoS Data IV:50a9 Pad 20 KeyID 0 +// 0x0000: 0000 3000 6b08 1c00 6c68 3a01 0000 0000 ..0.k...lh:..... +// 0x0010: 1400 7814 4001 bba4 0160 0e1a 4001 0400 ..x.@....`..@... +// 0x0020: 7814 3022 1f01 0cff b10d 0000 0400 0000 x.0"............ +// 0x0030: 8841 2c00 0025 9c42 c262 d8a2 5e97 61c1 .A,..%.B.b..^.a. +// 0x0040: 0025 9c42 c25f 10db 0000 a950 0020 0000 .%.B._.....P.... +// 0x0050: 0000 f8ab a97e 3fbd d6e1 785b 0040 5f15 .....~?...x[.@_. +// 0x0060: 7123 8711 bd1f ffb9 e5b3 84bb ec2a 0a90 q#...........*.. +// 0x0070: d0a0 1a6f 9033 1083 5179 a0da f833 3a00 ...o.3..Qy...3:. +// 0x0080: 5471 f596 539b 1823 a33c 4908 545c 266a Tq..S..#.<I.T\&j +// 0x0090: 8540 515a 1da9 c49e a85a fbf7 de09 7f9c .@QZ.....Z...... +// 0x00a0: 6f35 0b8b 6831 2c10 43dc 8983 b1d9 dd29 o5..h1,.C......) +// 0x00b0: 7395 65b9 4b43 b391 16ec 4201 86c9 ca s.e.KC....B.... +var testPacketP6196 = []byte{ + 0x00, 0x00, 0x30, 0x00, 0x6b, 0x08, 0x1c, 0x00, 0x6c, 0x68, 0x3a, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x78, 0x14, 0x40, 0x01, 0xbb, 0xa4, 0x01, 0x60, 0x0e, 0x1a, 0x40, 0x01, 0x04, 0x00, + 0x78, 0x14, 0x30, 0x22, 0x1f, 0x01, 0x0c, 0xff, 0xb1, 0x0d, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x88, 0x41, 0x2c, 0x00, 0x00, 0x25, 0x9c, 0x42, 0xc2, 0x62, 0xd8, 0xa2, 0x5e, 0x97, 0x61, 0xc1, + 0x00, 0x25, 0x9c, 0x42, 0xc2, 0x5f, 0x10, 0xdb, 0x00, 0x00, 0xa9, 0x50, 0x00, 0x20, 0x00, 0x00, + 0x00, 0x00, 0xf8, 0xab, 0xa9, 0x7e, 0x3f, 0xbd, 0xd6, 0xe1, 0x78, 0x5b, 0x00, 0x40, 0x5f, 0x15, + 0x71, 0x23, 0x87, 0x11, 0xbd, 0x1f, 0xff, 0xb9, 0xe5, 0xb3, 0x84, 0xbb, 0xec, 0x2a, 0x0a, 0x90, + 0xd0, 0xa0, 0x1a, 0x6f, 0x90, 0x33, 0x10, 0x83, 0x51, 0x79, 0xa0, 0xda, 0xf8, 0x33, 0x3a, 0x00, + 0x54, 0x71, 0xf5, 0x96, 0x53, 0x9b, 0x18, 0x23, 0xa3, 0x3c, 0x49, 0x08, 0x54, 0x5c, 0x26, 0x6a, + 0x85, 0x40, 0x51, 0x5a, 0x1d, 0xa9, 0xc4, 0x9e, 0xa8, 0x5a, 0xfb, 0xf7, 0xde, 0x09, 0x7f, 0x9c, + 0x6f, 0x35, 0x0b, 0x8b, 0x68, 0x31, 0x2c, 0x10, 0x43, 0xdc, 0x89, 0x83, 0xb1, 0xd9, 0xdd, 0x29, + 0x73, 0x95, 0x65, 0xb9, 0x4b, 0x43, 0xb3, 0x91, 0x16, 0xec, 0x42, 0x01, 0x86, 0xc9, 0xca, +} + +func TestPacketP6196(t *testing.T) { + p := gopacket.NewPacket(testPacketP6196, LinkTypeIEEE80211Radio, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + + checkLayers(p, []gopacket.LayerType{LayerTypeRadioTap, LayerTypeDot11, LayerTypeDot11WEP}, t) +} + +func BenchmarkDecodePacketP6196(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testPacketP6196, LinkTypeIEEE80211Radio, gopacket.NoCopy) + } +} + +func TestInformationElement(t *testing.T) { + bin := []byte{ + 0, 0, + 0, 2, 1, 3, + 221, 5, 1, 2, 3, 4, 5, + } + pkt := gopacket.NewPacket(bin, LayerTypeDot11InformationElement, gopacket.NoCopy) + + buf := gopacket.NewSerializeBuffer() + var sLayers []gopacket.SerializableLayer + for _, l := range pkt.Layers() { + sLayers = append(sLayers, l.(*Dot11InformationElement)) + } + if err := gopacket.SerializeLayers(buf, gopacket.SerializeOptions{}, sLayers...); err != nil { + t.Error(err.Error()) + } + if !bytes.Equal(bin, buf.Bytes()) { + t.Error("build failed") + } +} diff --git a/vendor/github.com/google/gopacket/layers/dot1q.go b/vendor/github.com/google/gopacket/layers/dot1q.go new file mode 100644 index 0000000..47f93d7 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/dot1q.go @@ -0,0 +1,71 @@ +// Copyright 2012 Google, Inc. All rights reserved. +// Copyright 2009-2011 Andreas Krennmair. 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 layers + +import ( + "encoding/binary" + "fmt" + "github.com/google/gopacket" +) + +// Dot1Q is the packet layer for 802.1Q VLAN headers. +type Dot1Q struct { + BaseLayer + Priority uint8 + DropEligible bool + VLANIdentifier uint16 + Type EthernetType +} + +// LayerType returns gopacket.LayerTypeDot1Q +func (d *Dot1Q) LayerType() gopacket.LayerType { return LayerTypeDot1Q } + +// DecodeFromBytes decodes the given bytes into this layer. +func (d *Dot1Q) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + d.Priority = (data[0] & 0xE0) >> 5 + d.DropEligible = data[0]&0x10 != 0 + d.VLANIdentifier = binary.BigEndian.Uint16(data[:2]) & 0x0FFF + d.Type = EthernetType(binary.BigEndian.Uint16(data[2:4])) + d.BaseLayer = BaseLayer{Contents: data[:4], Payload: data[4:]} + return nil +} + +// CanDecode returns the set of layer types that this DecodingLayer can decode. +func (d *Dot1Q) CanDecode() gopacket.LayerClass { + return LayerTypeDot1Q +} + +// NextLayerType returns the layer type contained by this DecodingLayer. +func (d *Dot1Q) NextLayerType() gopacket.LayerType { + return d.Type.LayerType() +} + +func decodeDot1Q(data []byte, p gopacket.PacketBuilder) error { + d := &Dot1Q{} + return decodingLayerDecoder(d, data, p) +} + +// SerializeTo writes the serialized form of this layer into the +// SerializationBuffer, implementing gopacket.SerializableLayer. +// See the docs for gopacket.SerializableLayer for more info. +func (d *Dot1Q) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + bytes, err := b.PrependBytes(4) + if err != nil { + return err + } + if d.VLANIdentifier > 0xFFF { + return fmt.Errorf("vlan identifier %v is too high", d.VLANIdentifier) + } + firstBytes := uint16(d.Priority)<<13 | d.VLANIdentifier + if d.DropEligible { + firstBytes |= 0x1000 + } + binary.BigEndian.PutUint16(bytes, firstBytes) + binary.BigEndian.PutUint16(bytes[2:], uint16(d.Type)) + return nil +} diff --git a/vendor/github.com/google/gopacket/layers/dot1q_test.go b/vendor/github.com/google/gopacket/layers/dot1q_test.go new file mode 100644 index 0000000..4a409c7 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/dot1q_test.go @@ -0,0 +1,62 @@ +// 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 layers + +import ( + "fmt" + "reflect" + "testing" + + "github.com/google/gopacket" +) + +// test harness to ensure the dot1q layer can be encoded/decoded properly +// return error if decoded data not match. +func testEncodeDecodeDot1Q(dot1Q *Dot1Q) error { + buf := gopacket.NewSerializeBuffer() + opts := gopacket.SerializeOptions{} + expectedDot1Q := dot1Q + + err := dot1Q.SerializeTo(buf, opts) + if err != nil { + return err + } + + newDot1q := &Dot1Q{} + err = newDot1q.DecodeFromBytes(buf.Bytes(), gopacket.NilDecodeFeedback) + if err != nil { + return err + } + newDot1q.BaseLayer = BaseLayer{} + + if !reflect.DeepEqual(expectedDot1Q, newDot1q) { + return fmt.Errorf("Expect %v actual %v", expectedDot1Q, newDot1q) + } + return nil + +} + +// Test to ensure what has been encode can be decoded +func TestEncodeDecodeDot1Q(t *testing.T) { + dot1Qs := []*Dot1Q{ + &Dot1Q{ + Priority: uint8(3), + VLANIdentifier: uint16(30), + }, + &Dot1Q{ + Priority: uint8(0x07), + DropEligible: true, + VLANIdentifier: uint16(0xFFF), + }, + } + + for i, curTest := range dot1Qs { + err := testEncodeDecodeDot1Q(curTest) + if err != nil { + t.Error("Error with item ", i, " with error message :", err) + } + } +} diff --git a/vendor/github.com/google/gopacket/layers/eap.go b/vendor/github.com/google/gopacket/layers/eap.go new file mode 100644 index 0000000..250f857 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/eap.go @@ -0,0 +1,106 @@ +// 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 layers + +import ( + "encoding/binary" + "fmt" + "github.com/google/gopacket" +) + +type EAPCode uint8 +type EAPType uint8 + +const ( + EAPCodeRequest EAPCode = 1 + EAPCodeResponse EAPCode = 2 + EAPCodeSuccess EAPCode = 3 + EAPCodeFailure EAPCode = 4 + + // EAPTypeNone means that this EAP layer has no Type or TypeData. + // Success and Failure EAPs will have this set. + EAPTypeNone EAPType = 0 + + EAPTypeIdentity EAPType = 1 + EAPTypeNotification EAPType = 2 + EAPTypeNACK EAPType = 3 + EAPTypeOTP EAPType = 4 + EAPTypeTokenCard EAPType = 5 +) + +// EAP defines an Extensible Authentication Protocol (rfc 3748) layer. +type EAP struct { + BaseLayer + Code EAPCode + Id uint8 + Length uint16 + Type EAPType + TypeData []byte +} + +// LayerType returns LayerTypeEAP. +func (e *EAP) LayerType() gopacket.LayerType { return LayerTypeEAP } + +// DecodeFromBytes decodes the given bytes into this layer. +func (e *EAP) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + e.Code = EAPCode(data[0]) + e.Id = data[1] + e.Length = binary.BigEndian.Uint16(data[2:4]) + switch { + case e.Length > 4: + e.Type = EAPType(data[4]) + e.TypeData = data[5:] + case e.Length == 4: + e.Type = 0 + e.TypeData = nil + default: + return fmt.Errorf("invalid EAP length %d", e.Length) + } + e.BaseLayer.Contents = data[:e.Length] + e.BaseLayer.Payload = data[e.Length:] // Should be 0 bytes + return nil +} + +// SerializeTo writes the serialized form of this layer into the +// SerializationBuffer, implementing gopacket.SerializableLayer. +// See the docs for gopacket.SerializableLayer for more info. +func (e *EAP) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + if opts.FixLengths { + e.Length = uint16(len(e.TypeData) + 1) + } + size := len(e.TypeData) + 4 + if size > 4 { + size++ + } + bytes, err := b.PrependBytes(size) + if err != nil { + return err + } + bytes[0] = byte(e.Code) + bytes[1] = e.Id + binary.BigEndian.PutUint16(bytes[2:], e.Length) + if size > 4 { + bytes[4] = byte(e.Type) + copy(bytes[5:], e.TypeData) + } + return nil +} + +// CanDecode returns the set of layer types that this DecodingLayer can decode. +func (e *EAP) CanDecode() gopacket.LayerClass { + return LayerTypeEAP +} + +// NextLayerType returns the layer type contained by this DecodingLayer. +func (e *EAP) NextLayerType() gopacket.LayerType { + return gopacket.LayerTypeZero +} + +func decodeEAP(data []byte, p gopacket.PacketBuilder) error { + e := &EAP{} + return decodingLayerDecoder(e, data, p) +} diff --git a/vendor/github.com/google/gopacket/layers/eapol.go b/vendor/github.com/google/gopacket/layers/eapol.go new file mode 100644 index 0000000..041cd59 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/eapol.go @@ -0,0 +1,57 @@ +// 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 layers + +import ( + "encoding/binary" + "github.com/google/gopacket" +) + +// EAPOL defines an EAP over LAN (802.1x) layer. +type EAPOL struct { + BaseLayer + Version uint8 + Type EAPOLType + Length uint16 +} + +// LayerType returns LayerTypeEAPOL. +func (e *EAPOL) LayerType() gopacket.LayerType { return LayerTypeEAPOL } + +// DecodeFromBytes decodes the given bytes into this layer. +func (e *EAPOL) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + e.Version = data[0] + e.Type = EAPOLType(data[1]) + e.Length = binary.BigEndian.Uint16(data[2:4]) + e.BaseLayer = BaseLayer{data[:4], data[4:]} + return nil +} + +// SerializeTo writes the serialized form of this layer into the +// SerializationBuffer, implementing gopacket.SerializableLayer +func (e *EAPOL) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + bytes, _ := b.PrependBytes(4) + bytes[0] = e.Version + bytes[1] = byte(e.Type) + binary.BigEndian.PutUint16(bytes[2:], e.Length) + return nil +} + +// CanDecode returns the set of layer types that this DecodingLayer can decode. +func (e *EAPOL) CanDecode() gopacket.LayerClass { + return LayerTypeEAPOL +} + +// NextLayerType returns the layer type contained by this DecodingLayer. +func (e *EAPOL) NextLayerType() gopacket.LayerType { + return e.Type.LayerType() +} + +func decodeEAPOL(data []byte, p gopacket.PacketBuilder) error { + e := &EAPOL{} + return decodingLayerDecoder(e, data, p) +} diff --git a/vendor/github.com/google/gopacket/layers/endpoints.go b/vendor/github.com/google/gopacket/layers/endpoints.go new file mode 100644 index 0000000..4c91cc3 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/endpoints.go @@ -0,0 +1,97 @@ +// 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 layers + +import ( + "encoding/binary" + "github.com/google/gopacket" + "net" + "strconv" +) + +var ( + // We use two different endpoint types for IPv4 vs IPv6 addresses, so that + // ordering with endpointA.LessThan(endpointB) sanely groups all IPv4 + // addresses and all IPv6 addresses, such that IPv6 > IPv4 for all addresses. + EndpointIPv4 = gopacket.RegisterEndpointType(1, gopacket.EndpointTypeMetadata{Name: "IPv4", Formatter: func(b []byte) string { + return net.IP(b).String() + }}) + EndpointIPv6 = gopacket.RegisterEndpointType(2, gopacket.EndpointTypeMetadata{Name: "IPv6", Formatter: func(b []byte) string { + return net.IP(b).String() + }}) + + EndpointMAC = gopacket.RegisterEndpointType(3, gopacket.EndpointTypeMetadata{Name: "MAC", Formatter: func(b []byte) string { + return net.HardwareAddr(b).String() + }}) + EndpointTCPPort = gopacket.RegisterEndpointType(4, gopacket.EndpointTypeMetadata{Name: "TCP", Formatter: func(b []byte) string { + return strconv.Itoa(int(binary.BigEndian.Uint16(b))) + }}) + EndpointUDPPort = gopacket.RegisterEndpointType(5, gopacket.EndpointTypeMetadata{Name: "UDP", Formatter: func(b []byte) string { + return strconv.Itoa(int(binary.BigEndian.Uint16(b))) + }}) + EndpointSCTPPort = gopacket.RegisterEndpointType(6, gopacket.EndpointTypeMetadata{Name: "SCTP", Formatter: func(b []byte) string { + return strconv.Itoa(int(binary.BigEndian.Uint16(b))) + }}) + EndpointRUDPPort = gopacket.RegisterEndpointType(7, gopacket.EndpointTypeMetadata{Name: "RUDP", Formatter: func(b []byte) string { + return strconv.Itoa(int(b[0])) + }}) + EndpointUDPLitePort = gopacket.RegisterEndpointType(8, gopacket.EndpointTypeMetadata{Name: "UDPLite", Formatter: func(b []byte) string { + return strconv.Itoa(int(binary.BigEndian.Uint16(b))) + }}) + EndpointPPP = gopacket.RegisterEndpointType(9, gopacket.EndpointTypeMetadata{Name: "PPP", Formatter: func([]byte) string { + return "point" + }}) +) + +// NewIPEndpoint creates a new IP (v4 or v6) endpoint from a net.IP address. +// It returns gopacket.InvalidEndpoint if the IP address is invalid. +func NewIPEndpoint(a net.IP) gopacket.Endpoint { + ipv4 := a.To4() + if ipv4 != nil { + return gopacket.NewEndpoint(EndpointIPv4, []byte(ipv4)) + } + + ipv6 := a.To16() + if ipv6 != nil { + return gopacket.NewEndpoint(EndpointIPv6, []byte(ipv6)) + } + + return gopacket.InvalidEndpoint +} + +// NewMACEndpoint returns a new MAC address endpoint. +func NewMACEndpoint(a net.HardwareAddr) gopacket.Endpoint { + return gopacket.NewEndpoint(EndpointMAC, []byte(a)) +} +func newPortEndpoint(t gopacket.EndpointType, p uint16) gopacket.Endpoint { + return gopacket.NewEndpoint(t, []byte{byte(p >> 8), byte(p)}) +} + +// NewTCPPortEndpoint returns an endpoint based on a TCP port. +func NewTCPPortEndpoint(p TCPPort) gopacket.Endpoint { + return newPortEndpoint(EndpointTCPPort, uint16(p)) +} + +// NewUDPPortEndpoint returns an endpoint based on a UDP port. +func NewUDPPortEndpoint(p UDPPort) gopacket.Endpoint { + return newPortEndpoint(EndpointUDPPort, uint16(p)) +} + +// NewSCTPPortEndpoint returns an endpoint based on a SCTP port. +func NewSCTPPortEndpoint(p SCTPPort) gopacket.Endpoint { + return newPortEndpoint(EndpointSCTPPort, uint16(p)) +} + +// NewRUDPPortEndpoint returns an endpoint based on a RUDP port. +func NewRUDPPortEndpoint(p RUDPPort) gopacket.Endpoint { + return gopacket.NewEndpoint(EndpointRUDPPort, []byte{byte(p)}) +} + +// NewUDPLitePortEndpoint returns an endpoint based on a UDPLite port. +func NewUDPLitePortEndpoint(p UDPLitePort) gopacket.Endpoint { + return newPortEndpoint(EndpointUDPLitePort, uint16(p)) +} diff --git a/vendor/github.com/google/gopacket/layers/endpoints_test.go b/vendor/github.com/google/gopacket/layers/endpoints_test.go new file mode 100644 index 0000000..906762a --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/endpoints_test.go @@ -0,0 +1,37 @@ +// Copyright 2017, 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 layers + +import ( + "net" + "testing" + + "github.com/google/gopacket" +) + +func TestNewIPEndpoint(t *testing.T) { + cases := []struct { + ip net.IP + endpointType gopacket.EndpointType + }{ + {net.ParseIP("192.168.0.1").To4(), EndpointIPv4}, + {net.ParseIP("192.168.0.1").To16(), EndpointIPv4}, + {net.ParseIP("2001:0db8:85a3:0000:0000:8a2e:0370:7334"), EndpointIPv6}, + } + + for _, c := range cases { + endpoint := NewIPEndpoint(c.ip) + if endpoint == gopacket.InvalidEndpoint { + t.Errorf("Failed to create an IP endpoint for %s (%d-bytes)", + c.ip, len(c.ip)) + } + if endpoint.EndpointType() != c.endpointType { + t.Errorf("Wrong endpoint type created for %s (%d-bytes): expected %s, got %s", + c.ip, len(c.ip), c.endpointType, endpoint.EndpointType()) + } + } +} diff --git a/vendor/github.com/google/gopacket/layers/enums.go b/vendor/github.com/google/gopacket/layers/enums.go new file mode 100644 index 0000000..0ea2058 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/enums.go @@ -0,0 +1,564 @@ +// Copyright 2012 Google, Inc. All rights reserved. +// Copyright 2009-2011 Andreas Krennmair. 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 layers + +import ( + "errors" + "fmt" + + "github.com/google/gopacket" +) + +// EnumMetadata keeps track of a set of metadata for each enumeration value +// for protocol enumerations. +type EnumMetadata struct { + // DecodeWith is the decoder to use to decode this protocol's data. + DecodeWith gopacket.Decoder + // Name is the name of the enumeration value. + Name string + // LayerType is the layer type implied by the given enum. + LayerType gopacket.LayerType +} + +// errorFunc returns a decoder that spits out a specific error message. +func errorFunc(msg string) gopacket.Decoder { + var e = errors.New(msg) + return gopacket.DecodeFunc(func([]byte, gopacket.PacketBuilder) error { + return e + }) +} + +// EthernetType is an enumeration of ethernet type values, and acts as a decoder +// for any type it supports. +type EthernetType uint16 + +const ( + // EthernetTypeLLC is not an actual ethernet type. It is instead a + // placeholder we use in Ethernet frames that use the 802.3 standard of + // srcmac|dstmac|length|LLC instead of srcmac|dstmac|ethertype. + EthernetTypeLLC EthernetType = 0 + EthernetTypeIPv4 EthernetType = 0x0800 + EthernetTypeARP EthernetType = 0x0806 + EthernetTypeIPv6 EthernetType = 0x86DD + EthernetTypeCiscoDiscovery EthernetType = 0x2000 + EthernetTypeNortelDiscovery EthernetType = 0x01a2 + EthernetTypeTransparentEthernetBridging EthernetType = 0x6558 + EthernetTypeDot1Q EthernetType = 0x8100 + EthernetTypePPPoEDiscovery EthernetType = 0x8863 + EthernetTypePPPoESession EthernetType = 0x8864 + EthernetTypeMPLSUnicast EthernetType = 0x8847 + EthernetTypeMPLSMulticast EthernetType = 0x8848 + EthernetTypeEAPOL EthernetType = 0x888e + EthernetTypeQinQ EthernetType = 0x88a8 + EthernetTypeLinkLayerDiscovery EthernetType = 0x88cc + EthernetTypeEthernetCTP EthernetType = 0x9000 +) + +// IPProtocol is an enumeration of IP protocol values, and acts as a decoder +// for any type it supports. +type IPProtocol uint8 + +const ( + IPProtocolIPv6HopByHop IPProtocol = 0 + IPProtocolICMPv4 IPProtocol = 1 + IPProtocolIGMP IPProtocol = 2 + IPProtocolIPv4 IPProtocol = 4 + IPProtocolTCP IPProtocol = 6 + IPProtocolUDP IPProtocol = 17 + IPProtocolRUDP IPProtocol = 27 + IPProtocolIPv6 IPProtocol = 41 + IPProtocolIPv6Routing IPProtocol = 43 + IPProtocolIPv6Fragment IPProtocol = 44 + IPProtocolGRE IPProtocol = 47 + IPProtocolESP IPProtocol = 50 + IPProtocolAH IPProtocol = 51 + IPProtocolICMPv6 IPProtocol = 58 + IPProtocolNoNextHeader IPProtocol = 59 + IPProtocolIPv6Destination IPProtocol = 60 + IPProtocolOSPF IPProtocol = 89 + IPProtocolIPIP IPProtocol = 94 + IPProtocolEtherIP IPProtocol = 97 + IPProtocolVRRP IPProtocol = 112 + IPProtocolSCTP IPProtocol = 132 + IPProtocolUDPLite IPProtocol = 136 + IPProtocolMPLSInIP IPProtocol = 137 +) + +// LinkType is an enumeration of link types, and acts as a decoder for any +// link type it supports. +type LinkType uint8 + +const ( + // According to pcap-linktype(7) and http://www.tcpdump.org/linktypes.html + LinkTypeNull LinkType = 0 + LinkTypeEthernet LinkType = 1 + LinkTypeAX25 LinkType = 3 + LinkTypeTokenRing LinkType = 6 + LinkTypeArcNet LinkType = 7 + LinkTypeSLIP LinkType = 8 + LinkTypePPP LinkType = 9 + LinkTypeFDDI LinkType = 10 + LinkTypePPP_HDLC LinkType = 50 + LinkTypePPPEthernet LinkType = 51 + LinkTypeATM_RFC1483 LinkType = 100 + LinkTypeRaw LinkType = 101 + LinkTypeC_HDLC LinkType = 104 + LinkTypeIEEE802_11 LinkType = 105 + LinkTypeFRelay LinkType = 107 + LinkTypeLoop LinkType = 108 + LinkTypeLinuxSLL LinkType = 113 + LinkTypeLTalk LinkType = 114 + LinkTypePFLog LinkType = 117 + LinkTypePrismHeader LinkType = 119 + LinkTypeIPOverFC LinkType = 122 + LinkTypeSunATM LinkType = 123 + LinkTypeIEEE80211Radio LinkType = 127 + LinkTypeARCNetLinux LinkType = 129 + LinkTypeIPOver1394 LinkType = 138 + LinkTypeMTP2Phdr LinkType = 139 + LinkTypeMTP2 LinkType = 140 + LinkTypeMTP3 LinkType = 141 + LinkTypeSCCP LinkType = 142 + LinkTypeDOCSIS LinkType = 143 + LinkTypeLinuxIRDA LinkType = 144 + LinkTypeLinuxLAPD LinkType = 177 + LinkTypeLinuxUSB LinkType = 220 + LinkTypeIPv4 LinkType = 228 + LinkTypeIPv6 LinkType = 229 +) + +// PPPoECode is the PPPoE code enum, taken from http://tools.ietf.org/html/rfc2516 +type PPPoECode uint8 + +const ( + PPPoECodePADI PPPoECode = 0x09 + PPPoECodePADO PPPoECode = 0x07 + PPPoECodePADR PPPoECode = 0x19 + PPPoECodePADS PPPoECode = 0x65 + PPPoECodePADT PPPoECode = 0xA7 + PPPoECodeSession PPPoECode = 0x00 +) + +// PPPType is an enumeration of PPP type values, and acts as a decoder for any +// type it supports. +type PPPType uint16 + +const ( + PPPTypeIPv4 PPPType = 0x0021 + PPPTypeIPv6 PPPType = 0x0057 + PPPTypeMPLSUnicast PPPType = 0x0281 + PPPTypeMPLSMulticast PPPType = 0x0283 +) + +// SCTPChunkType is an enumeration of chunk types inside SCTP packets. +type SCTPChunkType uint8 + +const ( + SCTPChunkTypeData SCTPChunkType = 0 + SCTPChunkTypeInit SCTPChunkType = 1 + SCTPChunkTypeInitAck SCTPChunkType = 2 + SCTPChunkTypeSack SCTPChunkType = 3 + SCTPChunkTypeHeartbeat SCTPChunkType = 4 + SCTPChunkTypeHeartbeatAck SCTPChunkType = 5 + SCTPChunkTypeAbort SCTPChunkType = 6 + SCTPChunkTypeShutdown SCTPChunkType = 7 + SCTPChunkTypeShutdownAck SCTPChunkType = 8 + SCTPChunkTypeError SCTPChunkType = 9 + SCTPChunkTypeCookieEcho SCTPChunkType = 10 + SCTPChunkTypeCookieAck SCTPChunkType = 11 + SCTPChunkTypeShutdownComplete SCTPChunkType = 14 +) + +// FDDIFrameControl is an enumeration of FDDI frame control bytes. +type FDDIFrameControl uint8 + +const ( + FDDIFrameControlLLC FDDIFrameControl = 0x50 +) + +// EAPOLType is an enumeration of EAPOL packet types. +type EAPOLType uint8 + +const ( + EAPOLTypeEAP EAPOLType = 0 + EAPOLTypeStart EAPOLType = 1 + EAPOLTypeLogOff EAPOLType = 2 + EAPOLTypeKey EAPOLType = 3 + EAPOLTypeASFAlert EAPOLType = 4 +) + +// ProtocolFamily is the set of values defined as PF_* in sys/socket.h +type ProtocolFamily uint8 + +const ( + ProtocolFamilyIPv4 ProtocolFamily = 2 + // BSDs use different values for INET6... glory be. These values taken from + // tcpdump 4.3.0. + ProtocolFamilyIPv6BSD ProtocolFamily = 24 + ProtocolFamilyIPv6FreeBSD ProtocolFamily = 28 + ProtocolFamilyIPv6Darwin ProtocolFamily = 30 + ProtocolFamilyIPv6Linux ProtocolFamily = 10 +) + +// Dot11Type is a combination of IEEE 802.11 frame's Type and Subtype fields. +// By combining these two fields together into a single type, we're able to +// provide a String function that correctly displays the subtype given the +// top-level type. +// +// If you just care about the top-level type, use the MainType function. +type Dot11Type uint8 + +// MainType strips the subtype information from the given type, +// returning just the overarching type (Mgmt, Ctrl, Data, Reserved). +func (d Dot11Type) MainType() Dot11Type { + return d & dot11TypeMask +} + +const ( + Dot11TypeMgmt Dot11Type = 0x00 + Dot11TypeCtrl Dot11Type = 0x01 + Dot11TypeData Dot11Type = 0x02 + Dot11TypeReserved Dot11Type = 0x03 + dot11TypeMask = 0x03 + + // The following are type/subtype conglomerations. + + // Management + Dot11TypeMgmtAssociationReq Dot11Type = 0x00 + Dot11TypeMgmtAssociationResp Dot11Type = 0x04 + Dot11TypeMgmtReassociationReq Dot11Type = 0x08 + Dot11TypeMgmtReassociationResp Dot11Type = 0x0c + Dot11TypeMgmtProbeReq Dot11Type = 0x10 + Dot11TypeMgmtProbeResp Dot11Type = 0x14 + Dot11TypeMgmtMeasurementPilot Dot11Type = 0x18 + Dot11TypeMgmtBeacon Dot11Type = 0x20 + Dot11TypeMgmtATIM Dot11Type = 0x24 + Dot11TypeMgmtDisassociation Dot11Type = 0x28 + Dot11TypeMgmtAuthentication Dot11Type = 0x2c + Dot11TypeMgmtDeauthentication Dot11Type = 0x30 + Dot11TypeMgmtAction Dot11Type = 0x34 + Dot11TypeMgmtActionNoAck Dot11Type = 0x38 + + // Control + Dot11TypeCtrlWrapper Dot11Type = 0x1d + Dot11TypeCtrlBlockAckReq Dot11Type = 0x21 + Dot11TypeCtrlBlockAck Dot11Type = 0x25 + Dot11TypeCtrlPowersavePoll Dot11Type = 0x29 + Dot11TypeCtrlRTS Dot11Type = 0x2d + Dot11TypeCtrlCTS Dot11Type = 0x31 + Dot11TypeCtrlAck Dot11Type = 0x35 + Dot11TypeCtrlCFEnd Dot11Type = 0x39 + Dot11TypeCtrlCFEndAck Dot11Type = 0x3d + + // Data + Dot11TypeDataCFAck Dot11Type = 0x06 + Dot11TypeDataCFPoll Dot11Type = 0x0a + Dot11TypeDataCFAckPoll Dot11Type = 0x0e + Dot11TypeDataNull Dot11Type = 0x12 + Dot11TypeDataCFAckNoData Dot11Type = 0x16 + Dot11TypeDataCFPollNoData Dot11Type = 0x1a + Dot11TypeDataCFAckPollNoData Dot11Type = 0x1e + Dot11TypeDataQOSData Dot11Type = 0x22 + Dot11TypeDataQOSDataCFAck Dot11Type = 0x26 + Dot11TypeDataQOSDataCFPoll Dot11Type = 0x2a + Dot11TypeDataQOSDataCFAckPoll Dot11Type = 0x2e + Dot11TypeDataQOSNull Dot11Type = 0x32 + Dot11TypeDataQOSCFPollNoData Dot11Type = 0x3a + Dot11TypeDataQOSCFAckPollNoData Dot11Type = 0x3e +) + +var ( + // Each of the following arrays contains mappings of how to handle enum + // values for various enum types in gopacket/layers. + // + // So, EthernetTypeMetadata[2] contains information on how to handle EthernetType + // 2, including which name to give it and which decoder to use to decode + // packet data of that type. These arrays are filled by default with all of the + // protocols gopacket/layers knows how to handle, but users of the library can + // add new decoders or override existing ones. For example, if you write a better + // TCP decoder, you can override IPProtocolMetadata[IPProtocolTCP].DecodeWith + // with your new decoder, and all gopacket/layers decoding will use your new + // decoder whenever they encounter that IPProtocol. + EthernetTypeMetadata [65536]EnumMetadata + IPProtocolMetadata [256]EnumMetadata + SCTPChunkTypeMetadata [256]EnumMetadata + PPPTypeMetadata [65536]EnumMetadata + PPPoECodeMetadata [256]EnumMetadata + LinkTypeMetadata [256]EnumMetadata + FDDIFrameControlMetadata [256]EnumMetadata + EAPOLTypeMetadata [256]EnumMetadata + ProtocolFamilyMetadata [256]EnumMetadata + Dot11TypeMetadata [256]EnumMetadata + USBTypeMetadata [256]EnumMetadata +) + +func (a EthernetType) Decode(data []byte, p gopacket.PacketBuilder) error { + return EthernetTypeMetadata[a].DecodeWith.Decode(data, p) +} +func (a EthernetType) String() string { + return EthernetTypeMetadata[a].Name +} +func (a EthernetType) LayerType() gopacket.LayerType { + return EthernetTypeMetadata[a].LayerType +} +func (a IPProtocol) Decode(data []byte, p gopacket.PacketBuilder) error { + return IPProtocolMetadata[a].DecodeWith.Decode(data, p) +} +func (a IPProtocol) String() string { + return IPProtocolMetadata[a].Name +} +func (a IPProtocol) LayerType() gopacket.LayerType { + return IPProtocolMetadata[a].LayerType +} +func (a SCTPChunkType) Decode(data []byte, p gopacket.PacketBuilder) error { + return SCTPChunkTypeMetadata[a].DecodeWith.Decode(data, p) +} +func (a SCTPChunkType) String() string { + return SCTPChunkTypeMetadata[a].Name +} +func (a PPPType) Decode(data []byte, p gopacket.PacketBuilder) error { + return PPPTypeMetadata[a].DecodeWith.Decode(data, p) +} +func (a PPPType) String() string { + return PPPTypeMetadata[a].Name +} +func (a LinkType) Decode(data []byte, p gopacket.PacketBuilder) error { + return LinkTypeMetadata[a].DecodeWith.Decode(data, p) +} +func (a LinkType) String() string { + return LinkTypeMetadata[a].Name +} +func (a PPPoECode) Decode(data []byte, p gopacket.PacketBuilder) error { + return PPPoECodeMetadata[a].DecodeWith.Decode(data, p) +} +func (a PPPoECode) String() string { + return PPPoECodeMetadata[a].Name +} +func (a FDDIFrameControl) Decode(data []byte, p gopacket.PacketBuilder) error { + return FDDIFrameControlMetadata[a].DecodeWith.Decode(data, p) +} +func (a FDDIFrameControl) String() string { + return FDDIFrameControlMetadata[a].Name +} +func (a EAPOLType) Decode(data []byte, p gopacket.PacketBuilder) error { + return EAPOLTypeMetadata[a].DecodeWith.Decode(data, p) +} +func (a EAPOLType) String() string { + return EAPOLTypeMetadata[a].Name +} +func (a EAPOLType) LayerType() gopacket.LayerType { + return EAPOLTypeMetadata[a].LayerType +} +func (a ProtocolFamily) Decode(data []byte, p gopacket.PacketBuilder) error { + return ProtocolFamilyMetadata[a].DecodeWith.Decode(data, p) +} +func (a ProtocolFamily) String() string { + return ProtocolFamilyMetadata[a].Name +} +func (a ProtocolFamily) LayerType() gopacket.LayerType { + return ProtocolFamilyMetadata[a].LayerType +} +func (a Dot11Type) Decode(data []byte, p gopacket.PacketBuilder) error { + return Dot11TypeMetadata[a].DecodeWith.Decode(data, p) +} +func (a Dot11Type) String() string { + return Dot11TypeMetadata[a].Name +} +func (a Dot11Type) LayerType() gopacket.LayerType { + return Dot11TypeMetadata[a].LayerType +} + +// Decode a raw v4 or v6 IP packet. +func decodeIPv4or6(data []byte, p gopacket.PacketBuilder) error { + version := data[0] >> 4 + switch version { + case 4: + return decodeIPv4(data, p) + case 6: + return decodeIPv6(data, p) + } + return fmt.Errorf("Invalid IP packet version %v", version) +} + +func init() { + // Here we link up all enumerations with their respective names and decoders. + for i := 0; i < 65536; i++ { + EthernetTypeMetadata[i] = EnumMetadata{ + DecodeWith: errorFunc(fmt.Sprintf("Unable to decode ethernet type %d", i)), + Name: fmt.Sprintf("UnknownEthernetType(%d)", i), + } + PPPTypeMetadata[i] = EnumMetadata{ + DecodeWith: errorFunc(fmt.Sprintf("Unable to decode PPP type %d", i)), + Name: fmt.Sprintf("UnknownPPPType(%d)", i), + } + } + for i := 0; i < 256; i++ { + IPProtocolMetadata[i] = EnumMetadata{ + DecodeWith: errorFunc(fmt.Sprintf("Unable to decode IP protocol %d", i)), + Name: fmt.Sprintf("UnknownIPProtocol(%d)", i), + } + SCTPChunkTypeMetadata[i] = EnumMetadata{ + DecodeWith: errorFunc(fmt.Sprintf("Unable to decode SCTP chunk type %d", i)), + Name: fmt.Sprintf("UnknownSCTPChunkType(%d)", i), + } + PPPoECodeMetadata[i] = EnumMetadata{ + DecodeWith: errorFunc(fmt.Sprintf("Unable to decode PPPoE code %d", i)), + Name: fmt.Sprintf("UnknownPPPoECode(%d)", i), + } + LinkTypeMetadata[i] = EnumMetadata{ + DecodeWith: errorFunc(fmt.Sprintf("Unable to decode link type %d", i)), + Name: fmt.Sprintf("UnknownLinkType(%d)", i), + } + FDDIFrameControlMetadata[i] = EnumMetadata{ + DecodeWith: errorFunc(fmt.Sprintf("Unable to decode FDDI frame control %d", i)), + Name: fmt.Sprintf("UnknownFDDIFrameControl(%d)", i), + } + EAPOLTypeMetadata[i] = EnumMetadata{ + DecodeWith: errorFunc(fmt.Sprintf("Unable to decode EAPOL type %d", i)), + Name: fmt.Sprintf("UnknownEAPOLType(%d)", i), + } + ProtocolFamilyMetadata[i] = EnumMetadata{ + DecodeWith: errorFunc(fmt.Sprintf("Unable to decode protocol family %d", i)), + Name: fmt.Sprintf("UnknownProtocolFamily(%d)", i), + } + Dot11TypeMetadata[i] = EnumMetadata{ + DecodeWith: errorFunc(fmt.Sprintf("Unable to decode Dot11 type %d", i)), + Name: fmt.Sprintf("UnknownDot11Type(%d)", i), + } + } + + EthernetTypeMetadata[EthernetTypeLLC] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeLLC), Name: "LLC", LayerType: LayerTypeLLC} + EthernetTypeMetadata[EthernetTypeIPv4] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeIPv4), Name: "IPv4", LayerType: LayerTypeIPv4} + EthernetTypeMetadata[EthernetTypeIPv6] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeIPv6), Name: "IPv6", LayerType: LayerTypeIPv6} + EthernetTypeMetadata[EthernetTypeARP] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeARP), Name: "ARP", LayerType: LayerTypeARP} + EthernetTypeMetadata[EthernetTypeDot1Q] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot1Q), Name: "Dot1Q", LayerType: LayerTypeDot1Q} + EthernetTypeMetadata[EthernetTypePPPoEDiscovery] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodePPPoE), Name: "PPPoEDiscovery", LayerType: LayerTypePPPoE} + EthernetTypeMetadata[EthernetTypePPPoESession] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodePPPoE), Name: "PPPoESession", LayerType: LayerTypePPPoE} + EthernetTypeMetadata[EthernetTypeEthernetCTP] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeEthernetCTP), Name: "EthernetCTP", LayerType: LayerTypeEthernetCTP} + EthernetTypeMetadata[EthernetTypeCiscoDiscovery] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeCiscoDiscovery), Name: "CiscoDiscovery", LayerType: LayerTypeCiscoDiscovery} + EthernetTypeMetadata[EthernetTypeNortelDiscovery] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeNortelDiscovery), Name: "NortelDiscovery", LayerType: LayerTypeNortelDiscovery} + EthernetTypeMetadata[EthernetTypeLinkLayerDiscovery] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeLinkLayerDiscovery), Name: "LinkLayerDiscovery", LayerType: LayerTypeLinkLayerDiscovery} + EthernetTypeMetadata[EthernetTypeMPLSUnicast] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeMPLS), Name: "MPLSUnicast", LayerType: LayerTypeMPLS} + EthernetTypeMetadata[EthernetTypeMPLSMulticast] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeMPLS), Name: "MPLSMulticast", LayerType: LayerTypeMPLS} + EthernetTypeMetadata[EthernetTypeEAPOL] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeEAPOL), Name: "EAPOL", LayerType: LayerTypeEAPOL} + EthernetTypeMetadata[EthernetTypeQinQ] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot1Q), Name: "Dot1Q", LayerType: LayerTypeDot1Q} + EthernetTypeMetadata[EthernetTypeTransparentEthernetBridging] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeEthernet), Name: "TransparentEthernetBridging", LayerType: LayerTypeEthernet} + + IPProtocolMetadata[IPProtocolIPv4] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeIPv4), Name: "IPv4", LayerType: LayerTypeIPv4} + IPProtocolMetadata[IPProtocolTCP] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeTCP), Name: "TCP", LayerType: LayerTypeTCP} + IPProtocolMetadata[IPProtocolUDP] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeUDP), Name: "UDP", LayerType: LayerTypeUDP} + IPProtocolMetadata[IPProtocolICMPv4] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeICMPv4), Name: "ICMPv4", LayerType: LayerTypeICMPv4} + IPProtocolMetadata[IPProtocolICMPv6] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeICMPv6), Name: "ICMPv6", LayerType: LayerTypeICMPv6} + IPProtocolMetadata[IPProtocolSCTP] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeSCTP), Name: "SCTP", LayerType: LayerTypeSCTP} + IPProtocolMetadata[IPProtocolIPv6] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeIPv6), Name: "IPv6", LayerType: LayerTypeIPv6} + IPProtocolMetadata[IPProtocolIPIP] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeIPv4), Name: "IPv4", LayerType: LayerTypeIPv4} + IPProtocolMetadata[IPProtocolEtherIP] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeEtherIP), Name: "EtherIP", LayerType: LayerTypeEtherIP} + IPProtocolMetadata[IPProtocolRUDP] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeRUDP), Name: "RUDP", LayerType: LayerTypeRUDP} + IPProtocolMetadata[IPProtocolGRE] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeGRE), Name: "GRE", LayerType: LayerTypeGRE} + IPProtocolMetadata[IPProtocolIPv6HopByHop] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeIPv6HopByHop), Name: "IPv6HopByHop", LayerType: LayerTypeIPv6HopByHop} + IPProtocolMetadata[IPProtocolIPv6Routing] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeIPv6Routing), Name: "IPv6Routing", LayerType: LayerTypeIPv6Routing} + IPProtocolMetadata[IPProtocolIPv6Fragment] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeIPv6Fragment), Name: "IPv6Fragment", LayerType: LayerTypeIPv6Fragment} + IPProtocolMetadata[IPProtocolIPv6Destination] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeIPv6Destination), Name: "IPv6Destination", LayerType: LayerTypeIPv6Destination} + IPProtocolMetadata[IPProtocolOSPF] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeOSPF), Name: "OSPF", LayerType: LayerTypeOSPF} + IPProtocolMetadata[IPProtocolAH] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeIPSecAH), Name: "IPSecAH", LayerType: LayerTypeIPSecAH} + IPProtocolMetadata[IPProtocolESP] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeIPSecESP), Name: "IPSecESP", LayerType: LayerTypeIPSecESP} + IPProtocolMetadata[IPProtocolUDPLite] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeUDPLite), Name: "UDPLite", LayerType: LayerTypeUDPLite} + IPProtocolMetadata[IPProtocolMPLSInIP] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeMPLS), Name: "MPLS", LayerType: LayerTypeMPLS} + IPProtocolMetadata[IPProtocolNoNextHeader] = EnumMetadata{DecodeWith: gopacket.DecodePayload, Name: "NoNextHeader", LayerType: gopacket.LayerTypePayload} + IPProtocolMetadata[IPProtocolIGMP] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeIGMP), Name: "IGMP", LayerType: LayerTypeIGMP} + IPProtocolMetadata[IPProtocolVRRP] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeVRRP), Name: "VRRP", LayerType: LayerTypeVRRP} + + SCTPChunkTypeMetadata[SCTPChunkTypeData] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeSCTPData), Name: "Data"} + SCTPChunkTypeMetadata[SCTPChunkTypeInit] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeSCTPInit), Name: "Init"} + SCTPChunkTypeMetadata[SCTPChunkTypeInitAck] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeSCTPInit), Name: "InitAck"} + SCTPChunkTypeMetadata[SCTPChunkTypeSack] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeSCTPSack), Name: "Sack"} + SCTPChunkTypeMetadata[SCTPChunkTypeHeartbeat] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeSCTPHeartbeat), Name: "Heartbeat"} + SCTPChunkTypeMetadata[SCTPChunkTypeHeartbeatAck] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeSCTPHeartbeat), Name: "HeartbeatAck"} + SCTPChunkTypeMetadata[SCTPChunkTypeAbort] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeSCTPError), Name: "Abort"} + SCTPChunkTypeMetadata[SCTPChunkTypeError] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeSCTPError), Name: "Error"} + SCTPChunkTypeMetadata[SCTPChunkTypeShutdown] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeSCTPShutdown), Name: "Shutdown"} + SCTPChunkTypeMetadata[SCTPChunkTypeShutdownAck] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeSCTPShutdownAck), Name: "ShutdownAck"} + SCTPChunkTypeMetadata[SCTPChunkTypeCookieEcho] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeSCTPCookieEcho), Name: "CookieEcho"} + SCTPChunkTypeMetadata[SCTPChunkTypeCookieAck] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeSCTPEmptyLayer), Name: "CookieAck"} + SCTPChunkTypeMetadata[SCTPChunkTypeShutdownComplete] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeSCTPEmptyLayer), Name: "ShutdownComplete"} + + PPPTypeMetadata[PPPTypeIPv4] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeIPv4), Name: "IPv4"} + PPPTypeMetadata[PPPTypeIPv6] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeIPv6), Name: "IPv6"} + PPPTypeMetadata[PPPTypeMPLSUnicast] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeMPLS), Name: "MPLSUnicast"} + PPPTypeMetadata[PPPTypeMPLSMulticast] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeMPLS), Name: "MPLSMulticast"} + + PPPoECodeMetadata[PPPoECodeSession] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodePPP), Name: "PPP"} + + LinkTypeMetadata[LinkTypeEthernet] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeEthernet), Name: "Ethernet"} + LinkTypeMetadata[LinkTypePPP] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodePPP), Name: "PPP"} + LinkTypeMetadata[LinkTypeFDDI] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeFDDI), Name: "FDDI"} + LinkTypeMetadata[LinkTypeNull] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeLoopback), Name: "Null"} + LinkTypeMetadata[LinkTypeIEEE802_11] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11), Name: "Dot11"} + LinkTypeMetadata[LinkTypeLoop] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeLoopback), Name: "Loop"} + LinkTypeMetadata[LinkTypeIEEE802_11] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11), Name: "802.11"} + LinkTypeMetadata[LinkTypeRaw] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeIPv4or6), Name: "Raw"} + LinkTypeMetadata[LinkTypePFLog] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodePFLog), Name: "PFLog"} + LinkTypeMetadata[LinkTypeIEEE80211Radio] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeRadioTap), Name: "RadioTap"} + LinkTypeMetadata[LinkTypeLinuxUSB] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeUSB), Name: "USB"} + LinkTypeMetadata[LinkTypeLinuxSLL] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeLinuxSLL), Name: "Linux SLL"} + LinkTypeMetadata[LinkTypePrismHeader] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodePrismHeader), Name: "Prism"} + + FDDIFrameControlMetadata[FDDIFrameControlLLC] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeLLC), Name: "LLC"} + + EAPOLTypeMetadata[EAPOLTypeEAP] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeEAP), Name: "EAP", LayerType: LayerTypeEAP} + + ProtocolFamilyMetadata[ProtocolFamilyIPv4] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeIPv4), Name: "IPv4", LayerType: LayerTypeIPv4} + ProtocolFamilyMetadata[ProtocolFamilyIPv6BSD] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeIPv6), Name: "IPv6", LayerType: LayerTypeIPv6} + ProtocolFamilyMetadata[ProtocolFamilyIPv6FreeBSD] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeIPv6), Name: "IPv6", LayerType: LayerTypeIPv6} + ProtocolFamilyMetadata[ProtocolFamilyIPv6Darwin] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeIPv6), Name: "IPv6", LayerType: LayerTypeIPv6} + ProtocolFamilyMetadata[ProtocolFamilyIPv6Linux] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeIPv6), Name: "IPv6", LayerType: LayerTypeIPv6} + + Dot11TypeMetadata[Dot11TypeMgmtAssociationReq] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11MgmtAssociationReq), Name: "MgmtAssociationReq", LayerType: LayerTypeDot11MgmtAssociationReq} + Dot11TypeMetadata[Dot11TypeMgmtAssociationResp] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11MgmtAssociationResp), Name: "MgmtAssociationResp", LayerType: LayerTypeDot11MgmtAssociationResp} + Dot11TypeMetadata[Dot11TypeMgmtReassociationReq] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11MgmtReassociationReq), Name: "MgmtReassociationReq", LayerType: LayerTypeDot11MgmtReassociationReq} + Dot11TypeMetadata[Dot11TypeMgmtReassociationResp] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11MgmtReassociationResp), Name: "MgmtReassociationResp", LayerType: LayerTypeDot11MgmtReassociationResp} + Dot11TypeMetadata[Dot11TypeMgmtProbeReq] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11MgmtProbeReq), Name: "MgmtProbeReq", LayerType: LayerTypeDot11MgmtProbeReq} + Dot11TypeMetadata[Dot11TypeMgmtProbeResp] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11MgmtProbeResp), Name: "MgmtProbeResp", LayerType: LayerTypeDot11MgmtProbeResp} + Dot11TypeMetadata[Dot11TypeMgmtMeasurementPilot] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11MgmtMeasurementPilot), Name: "MgmtMeasurementPilot", LayerType: LayerTypeDot11MgmtMeasurementPilot} + Dot11TypeMetadata[Dot11TypeMgmtBeacon] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11MgmtBeacon), Name: "MgmtBeacon", LayerType: LayerTypeDot11MgmtBeacon} + Dot11TypeMetadata[Dot11TypeMgmtATIM] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11MgmtATIM), Name: "MgmtATIM", LayerType: LayerTypeDot11MgmtATIM} + Dot11TypeMetadata[Dot11TypeMgmtDisassociation] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11MgmtDisassociation), Name: "MgmtDisassociation", LayerType: LayerTypeDot11MgmtDisassociation} + Dot11TypeMetadata[Dot11TypeMgmtAuthentication] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11MgmtAuthentication), Name: "MgmtAuthentication", LayerType: LayerTypeDot11MgmtAuthentication} + Dot11TypeMetadata[Dot11TypeMgmtDeauthentication] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11MgmtDeauthentication), Name: "MgmtDeauthentication", LayerType: LayerTypeDot11MgmtDeauthentication} + Dot11TypeMetadata[Dot11TypeMgmtAction] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11MgmtAction), Name: "MgmtAction", LayerType: LayerTypeDot11MgmtAction} + Dot11TypeMetadata[Dot11TypeMgmtActionNoAck] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11MgmtActionNoAck), Name: "MgmtActionNoAck", LayerType: LayerTypeDot11MgmtActionNoAck} + Dot11TypeMetadata[Dot11TypeCtrl] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11Ctrl), Name: "Ctrl", LayerType: LayerTypeDot11Ctrl} + Dot11TypeMetadata[Dot11TypeCtrlWrapper] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11Ctrl), Name: "CtrlWrapper", LayerType: LayerTypeDot11Ctrl} + Dot11TypeMetadata[Dot11TypeCtrlBlockAckReq] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11CtrlBlockAckReq), Name: "CtrlBlockAckReq", LayerType: LayerTypeDot11CtrlBlockAckReq} + Dot11TypeMetadata[Dot11TypeCtrlBlockAck] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11CtrlBlockAck), Name: "CtrlBlockAck", LayerType: LayerTypeDot11CtrlBlockAck} + Dot11TypeMetadata[Dot11TypeCtrlPowersavePoll] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11CtrlPowersavePoll), Name: "CtrlPowersavePoll", LayerType: LayerTypeDot11CtrlPowersavePoll} + Dot11TypeMetadata[Dot11TypeCtrlRTS] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11CtrlRTS), Name: "CtrlRTS", LayerType: LayerTypeDot11CtrlRTS} + Dot11TypeMetadata[Dot11TypeCtrlCTS] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11CtrlCTS), Name: "CtrlCTS", LayerType: LayerTypeDot11CtrlCTS} + Dot11TypeMetadata[Dot11TypeCtrlAck] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11CtrlAck), Name: "CtrlAck", LayerType: LayerTypeDot11CtrlAck} + Dot11TypeMetadata[Dot11TypeCtrlCFEnd] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11CtrlCFEnd), Name: "CtrlCFEnd", LayerType: LayerTypeDot11CtrlCFEnd} + Dot11TypeMetadata[Dot11TypeCtrlCFEndAck] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11CtrlCFEndAck), Name: "CtrlCFEndAck", LayerType: LayerTypeDot11CtrlCFEndAck} + Dot11TypeMetadata[Dot11TypeData] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11Data), Name: "Data", LayerType: LayerTypeDot11Data} + Dot11TypeMetadata[Dot11TypeDataCFAck] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11DataCFAck), Name: "DataCFAck", LayerType: LayerTypeDot11DataCFAck} + Dot11TypeMetadata[Dot11TypeDataCFPoll] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11DataCFPoll), Name: "DataCFPoll", LayerType: LayerTypeDot11DataCFPoll} + Dot11TypeMetadata[Dot11TypeDataCFAckPoll] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11DataCFAckPoll), Name: "DataCFAckPoll", LayerType: LayerTypeDot11DataCFAckPoll} + Dot11TypeMetadata[Dot11TypeDataNull] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11DataNull), Name: "DataNull", LayerType: LayerTypeDot11DataNull} + Dot11TypeMetadata[Dot11TypeDataCFAckNoData] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11DataCFAckNoData), Name: "DataCFAckNoData", LayerType: LayerTypeDot11DataCFAckNoData} + Dot11TypeMetadata[Dot11TypeDataCFPollNoData] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11DataCFPollNoData), Name: "DataCFPollNoData", LayerType: LayerTypeDot11DataCFPollNoData} + Dot11TypeMetadata[Dot11TypeDataCFAckPollNoData] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11DataCFAckPollNoData), Name: "DataCFAckPollNoData", LayerType: LayerTypeDot11DataCFAckPollNoData} + Dot11TypeMetadata[Dot11TypeDataQOSData] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11DataQOSData), Name: "DataQOSData", LayerType: LayerTypeDot11DataQOSData} + Dot11TypeMetadata[Dot11TypeDataQOSDataCFAck] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11DataQOSDataCFAck), Name: "DataQOSDataCFAck", LayerType: LayerTypeDot11DataQOSDataCFAck} + Dot11TypeMetadata[Dot11TypeDataQOSDataCFPoll] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11DataQOSDataCFPoll), Name: "DataQOSDataCFPoll", LayerType: LayerTypeDot11DataQOSDataCFPoll} + Dot11TypeMetadata[Dot11TypeDataQOSDataCFAckPoll] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11DataQOSDataCFAckPoll), Name: "DataQOSDataCFAckPoll", LayerType: LayerTypeDot11DataQOSDataCFAckPoll} + Dot11TypeMetadata[Dot11TypeDataQOSNull] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11DataQOSNull), Name: "DataQOSNull", LayerType: LayerTypeDot11DataQOSNull} + Dot11TypeMetadata[Dot11TypeDataQOSCFPollNoData] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11DataQOSCFPollNoData), Name: "DataQOSCFPollNoData", LayerType: LayerTypeDot11DataQOSCFPollNoData} + Dot11TypeMetadata[Dot11TypeDataQOSCFAckPollNoData] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot11DataQOSCFAckPollNoData), Name: "DataQOSCFAckPollNoData", LayerType: LayerTypeDot11DataQOSCFAckPollNoData} + + USBTypeMetadata[USBTransportTypeInterrupt] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeUSBInterrupt), Name: "Interrupt", LayerType: LayerTypeUSBInterrupt} + USBTypeMetadata[USBTransportTypeControl] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeUSBControl), Name: "Control", LayerType: LayerTypeUSBControl} + USBTypeMetadata[USBTransportTypeBulk] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeUSBBulk), Name: "Bulk", LayerType: LayerTypeUSBBulk} +} diff --git a/vendor/github.com/google/gopacket/layers/etherip.go b/vendor/github.com/google/gopacket/layers/etherip.go new file mode 100644 index 0000000..5b7b722 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/etherip.go @@ -0,0 +1,45 @@ +// 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 layers + +import ( + "encoding/binary" + "github.com/google/gopacket" +) + +// EtherIP is the struct for storing RFC 3378 EtherIP packet headers. +type EtherIP struct { + BaseLayer + Version uint8 + Reserved uint16 +} + +// LayerType returns gopacket.LayerTypeEtherIP. +func (e *EtherIP) LayerType() gopacket.LayerType { return LayerTypeEtherIP } + +// DecodeFromBytes decodes the given bytes into this layer. +func (e *EtherIP) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + e.Version = data[0] >> 4 + e.Reserved = binary.BigEndian.Uint16(data[:2]) & 0x0fff + e.BaseLayer = BaseLayer{data[:2], data[2:]} + return nil +} + +// CanDecode returns the set of layer types that this DecodingLayer can decode. +func (e *EtherIP) CanDecode() gopacket.LayerClass { + return LayerTypeEtherIP +} + +// NextLayerType returns the layer type contained by this DecodingLayer. +func (e *EtherIP) NextLayerType() gopacket.LayerType { + return LayerTypeEthernet +} + +func decodeEtherIP(data []byte, p gopacket.PacketBuilder) error { + e := &EtherIP{} + return decodingLayerDecoder(e, data, p) +} diff --git a/vendor/github.com/google/gopacket/layers/ethernet.go b/vendor/github.com/google/gopacket/layers/ethernet.go new file mode 100644 index 0000000..4eebf8c --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/ethernet.go @@ -0,0 +1,122 @@ +// Copyright 2012 Google, Inc. All rights reserved. +// Copyright 2009-2011 Andreas Krennmair. 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 layers + +import ( + "encoding/binary" + "errors" + "fmt" + "github.com/google/gopacket" + "net" +) + +// EthernetBroadcast is the broadcast MAC address used by Ethernet. +var EthernetBroadcast = net.HardwareAddr{0xff, 0xff, 0xff, 0xff, 0xff, 0xff} + +// Ethernet is the layer for Ethernet frame headers. +type Ethernet struct { + BaseLayer + SrcMAC, DstMAC net.HardwareAddr + EthernetType EthernetType + // Length is only set if a length field exists within this header. Ethernet + // headers follow two different standards, one that uses an EthernetType, the + // other which defines a length the follows with a LLC header (802.3). If the + // former is the case, we set EthernetType and Length stays 0. In the latter + // case, we set Length and EthernetType = EthernetTypeLLC. + Length uint16 +} + +// LayerType returns LayerTypeEthernet +func (e *Ethernet) LayerType() gopacket.LayerType { return LayerTypeEthernet } + +func (e *Ethernet) LinkFlow() gopacket.Flow { + return gopacket.NewFlow(EndpointMAC, e.SrcMAC, e.DstMAC) +} + +func (eth *Ethernet) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + if len(data) < 14 { + return errors.New("Ethernet packet too small") + } + eth.DstMAC = net.HardwareAddr(data[0:6]) + eth.SrcMAC = net.HardwareAddr(data[6:12]) + eth.EthernetType = EthernetType(binary.BigEndian.Uint16(data[12:14])) + eth.BaseLayer = BaseLayer{data[:14], data[14:]} + if eth.EthernetType < 0x0600 { + eth.Length = uint16(eth.EthernetType) + eth.EthernetType = EthernetTypeLLC + if cmp := len(eth.Payload) - int(eth.Length); cmp < 0 { + df.SetTruncated() + } else if cmp > 0 { + // Strip off bytes at the end, since we have too many bytes + eth.Payload = eth.Payload[:len(eth.Payload)-cmp] + } + // fmt.Println(eth) + } + return nil +} + +// SerializeTo writes the serialized form of this layer into the +// SerializationBuffer, implementing gopacket.SerializableLayer. +// See the docs for gopacket.SerializableLayer for more info. +func (eth *Ethernet) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + if len(eth.DstMAC) != 6 { + return fmt.Errorf("invalid dst MAC: %v", eth.DstMAC) + } + if len(eth.SrcMAC) != 6 { + return fmt.Errorf("invalid src MAC: %v", eth.SrcMAC) + } + payload := b.Bytes() + bytes, err := b.PrependBytes(14) + if err != nil { + return err + } + copy(bytes, eth.DstMAC) + copy(bytes[6:], eth.SrcMAC) + if eth.Length != 0 || eth.EthernetType == EthernetTypeLLC { + if opts.FixLengths { + eth.Length = uint16(len(payload)) + } + if eth.EthernetType != EthernetTypeLLC { + return fmt.Errorf("ethernet type %v not compatible with length value %v", eth.EthernetType, eth.Length) + } else if eth.Length > 0x0600 { + return fmt.Errorf("invalid ethernet length %v", eth.Length) + } + binary.BigEndian.PutUint16(bytes[12:], eth.Length) + } else { + binary.BigEndian.PutUint16(bytes[12:], uint16(eth.EthernetType)) + } + length := len(b.Bytes()) + if length < 60 { + // Pad out to 60 bytes. + padding, err := b.AppendBytes(60 - length) + if err != nil { + return err + } + copy(padding, lotsOfZeros[:]) + } + return nil +} + +func (eth *Ethernet) CanDecode() gopacket.LayerClass { + return LayerTypeEthernet +} + +func (eth *Ethernet) NextLayerType() gopacket.LayerType { + return eth.EthernetType.LayerType() +} + +func decodeEthernet(data []byte, p gopacket.PacketBuilder) error { + eth := &Ethernet{} + err := eth.DecodeFromBytes(data, p) + if err != nil { + return err + } + p.AddLayer(eth) + p.SetLinkLayer(eth) + return p.NextDecoder(eth.EthernetType) +} diff --git a/vendor/github.com/google/gopacket/layers/fddi.go b/vendor/github.com/google/gopacket/layers/fddi.go new file mode 100644 index 0000000..ed9e195 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/fddi.go @@ -0,0 +1,41 @@ +// 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 layers + +import ( + "github.com/google/gopacket" + "net" +) + +// FDDI contains the header for FDDI frames. +type FDDI struct { + BaseLayer + FrameControl FDDIFrameControl + Priority uint8 + SrcMAC, DstMAC net.HardwareAddr +} + +// LayerType returns LayerTypeFDDI. +func (f *FDDI) LayerType() gopacket.LayerType { return LayerTypeFDDI } + +// LinkFlow returns a new flow of type EndpointMAC. +func (f *FDDI) LinkFlow() gopacket.Flow { + return gopacket.NewFlow(EndpointMAC, f.SrcMAC, f.DstMAC) +} + +func decodeFDDI(data []byte, p gopacket.PacketBuilder) error { + f := &FDDI{ + FrameControl: FDDIFrameControl(data[0] & 0xF8), + Priority: data[0] & 0x07, + SrcMAC: net.HardwareAddr(data[1:7]), + DstMAC: net.HardwareAddr(data[7:13]), + BaseLayer: BaseLayer{data[:13], data[13:]}, + } + p.SetLinkLayer(f) + p.AddLayer(f) + return p.NextDecoder(f.FrameControl) +} diff --git a/vendor/github.com/google/gopacket/layers/gen.go b/vendor/github.com/google/gopacket/layers/gen.go new file mode 100644 index 0000000..ab7a0c0 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/gen.go @@ -0,0 +1,109 @@ +// 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 known ports from IANA, and uses them to populate +// iana_ports.go's TCPPortNames and UDPPortNames maps. +// +// go run gen.go | gofmt > iana_ports.go +package main + +import ( + "bytes" + "encoding/xml" + "flag" + "fmt" + "io/ioutil" + "net/http" + "os" + "strconv" + "time" +) + +const fmtString = `// Copyright 2012 Google, Inc. All rights reserved. + +package layers + +// Created by gen.go, don't edit manually +// Generated at %s +// Fetched from %q + +// TCPPortNames contains the port names for all TCP ports. +var TCPPortNames = tcpPortNames + +// UDPPortNames contains the port names for all UDP ports. +var UDPPortNames = udpPortNames + +// SCTPPortNames contains the port names for all SCTP ports. +var SCTPPortNames = sctpPortNames + +var tcpPortNames = map[TCPPort]string{ +%s} +var udpPortNames = map[UDPPort]string{ +%s} +var sctpPortNames = map[SCTPPort]string{ +%s} +` + +var url = flag.String("url", "http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xml", "URL to grab port numbers from") + +func main() { + fmt.Fprintf(os.Stderr, "Fetching ports from %q\n", *url) + resp, err := http.Get(*url) + if err != nil { + panic(err) + } + defer resp.Body.Close() + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + panic(err) + } + fmt.Fprintln(os.Stderr, "Parsing XML") + var registry struct { + Records []struct { + Protocol string `xml:"protocol"` + Number string `xml:"number"` + Name string `xml:"name"` + } `xml:"record"` + } + xml.Unmarshal(body, ®istry) + var tcpPorts bytes.Buffer + var udpPorts bytes.Buffer + var sctpPorts bytes.Buffer + done := map[string]map[int]bool{ + "tcp": map[int]bool{}, + "udp": map[int]bool{}, + "sctp": map[int]bool{}, + } + for _, r := range registry.Records { + port, err := strconv.Atoi(r.Number) + if err != nil { + continue + } + if r.Name == "" { + continue + } + var b *bytes.Buffer + switch r.Protocol { + case "tcp": + b = &tcpPorts + case "udp": + b = &udpPorts + case "sctp": + b = &sctpPorts + default: + continue + } + if done[r.Protocol][port] { + continue + } + done[r.Protocol][port] = true + fmt.Fprintf(b, "\t%d: %q,\n", port, r.Name) + } + fmt.Fprintln(os.Stderr, "Writing results to stdout") + fmt.Printf(fmtString, time.Now(), *url, tcpPorts.String(), udpPorts.String(), sctpPorts.String()) +} diff --git a/vendor/github.com/google/gopacket/layers/gen_linted.sh b/vendor/github.com/google/gopacket/layers/gen_linted.sh new file mode 100644 index 0000000..75c701f --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/gen_linted.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +for i in *.go; do golint $i | grep -q . || echo $i; done > .linted diff --git a/vendor/github.com/google/gopacket/layers/geneve.go b/vendor/github.com/google/gopacket/layers/geneve.go new file mode 100644 index 0000000..6dc05cf --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/geneve.go @@ -0,0 +1,98 @@ +// Copyright 2016 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 layers + +import ( + "encoding/binary" + + "github.com/google/gopacket" +) + +// Geneve is specifed here https://tools.ietf.org/html/draft-ietf-nvo3-geneve-03 +// Geneve Header: +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// |Ver| Opt Len |O|C| Rsvd. | Protocol Type | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Virtual Network Identifier (VNI) | Reserved | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Variable Length Options | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +type Geneve struct { + BaseLayer + Version uint8 // 2 bits + OptionsLength uint8 // 6 bits + OAMPacket bool // 1 bits + CriticalOption bool // 1 bits + Protocol EthernetType // 16 bits + VNI uint32 // 24bits + Options []*GeneveOption +} + +// Geneve Tunnel Options +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Option Class | Type |R|R|R| Length | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Variable Option Data | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +type GeneveOption struct { + Class uint16 // 16 bits + Type uint8 // 8 bits + Flags uint8 // 3 bits + Length uint8 // 5 bits + Data []byte +} + +// LayerType returns LayerTypeGeneve +func (gn *Geneve) LayerType() gopacket.LayerType { return LayerTypeGeneve } + +func decodeGeneveOption(data []byte, gn *Geneve) (*GeneveOption, uint8) { + opt := &GeneveOption{} + + opt.Class = binary.BigEndian.Uint16(data[0:1]) + opt.Type = data[2] + opt.Flags = data[3] >> 4 + opt.Length = data[3] & 0xf + + copy(opt.Data, data[4:opt.Length]) + + return opt, 4 + opt.Length +} + +func (gn *Geneve) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + gn.Version = data[0] >> 7 + gn.OptionsLength = data[0] & 0x3f + + gn.OAMPacket = data[1]&0x80 > 0 + gn.CriticalOption = data[1]&0x40 > 0 + gn.Protocol = EthernetType(binary.BigEndian.Uint16(data[2:4])) + + var buf [4]byte + copy(buf[1:], data[4:7]) + gn.VNI = binary.BigEndian.Uint32(buf[:]) + + offset, length := uint8(8), gn.OptionsLength + for length > 0 { + opt, len := decodeGeneveOption(data[offset:], gn) + gn.Options = append(gn.Options, opt) + + length -= len + offset += len + } + + gn.BaseLayer = BaseLayer{data[:offset], data[offset:]} + + return nil +} + +func (gn *Geneve) NextLayerType() gopacket.LayerType { + return gn.Protocol.LayerType() +} + +func decodeGeneve(data []byte, p gopacket.PacketBuilder) error { + gn := &Geneve{} + return decodingLayerDecoder(gn, data, p) +} diff --git a/vendor/github.com/google/gopacket/layers/geneve_test.go b/vendor/github.com/google/gopacket/layers/geneve_test.go new file mode 100644 index 0000000..ee34d52 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/geneve_test.go @@ -0,0 +1,108 @@ +// Copyright 2016 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 layers + +import ( + "reflect" + "testing" + + "github.com/google/gopacket" +) + +var testPacketGeneve1 = []byte{ + 0x00, 0x04, 0x00, 0x01, 0x00, 0x06, 0xfa, 0x16, 0x3e, 0x23, 0xd3, 0x42, + 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 0x00, 0x86, 0x87, 0x39, 0x40, 0x00, + 0x40, 0x11, 0x31, 0x35, 0xc0, 0xa8, 0x00, 0x53, 0xc0, 0xa8, 0x00, 0x55, + 0x31, 0x57, 0x17, 0xc1, 0x00, 0x72, 0x00, 0x00, 0x00, 0x00, 0x65, 0x58, + 0x00, 0x00, 0x00, 0x00, 0xba, 0x09, 0x60, 0x5f, 0xa0, 0x91, 0xa2, 0xfe, + 0x54, 0x48, 0x88, 0x51, 0x08, 0x00, 0x45, 0x00, 0x00, 0x54, 0x01, 0xf6, + 0x40, 0x00, 0x40, 0x01, 0xb7, 0x5f, 0xc0, 0xa8, 0x00, 0x01, 0xc0, 0xa8, + 0x00, 0x02, 0x08, 0x00, 0x79, 0xdf, 0x0c, 0xfa, 0x63, 0xc4, 0x03, 0x0b, + 0x50, 0x58, 0x00, 0x00, 0x00, 0x00, 0xee, 0x2b, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, + 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, + 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, + 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, +} + +var testPacketGeneve2 = []byte{ + 0x12, 0xbe, 0x4e, 0xb6, 0xa7, 0xc7, 0x02, 0x88, 0x0a, 0x81, 0xbd, 0x6d, + 0x08, 0x00, 0x45, 0x00, 0x00, 0x86, 0x20, 0xf2, 0x00, 0x00, 0x40, 0x11, + 0x01, 0x52, 0xac, 0x10, 0x00, 0x01, 0xac, 0x10, 0x00, 0x02, 0x40, 0xa6, + 0x17, 0xc1, 0x00, 0x72, 0x00, 0x00, 0x00, 0x00, 0x65, 0x58, 0x00, 0x00, + 0x0a, 0x00, 0xd2, 0x8c, 0xdb, 0x12, 0x53, 0xd5, 0x8e, 0xab, 0xa2, 0xa5, + 0x02, 0xf7, 0x08, 0x00, 0x45, 0x00, 0x00, 0x54, 0x38, 0x1a, 0x40, 0x00, + 0x40, 0x01, 0x81, 0x3b, 0xc0, 0xa8, 0x00, 0x01, 0xc0, 0xa8, 0x00, 0x02, + 0x08, 0x00, 0xdd, 0x9d, 0x7e, 0xde, 0x02, 0xc3, 0xcb, 0x07, 0x51, 0x58, + 0x00, 0x00, 0x00, 0x00, 0xba, 0x8d, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, + 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, + 0x34, 0x35, 0x36, 0x37, +} + +func TestDecodeGeneve1(t *testing.T) { + p := gopacket.NewPacket(testPacketGeneve1, LinkTypeLinuxSLL, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{ + LayerTypeLinuxSLL, LayerTypeIPv4, LayerTypeUDP, LayerTypeGeneve, + LayerTypeEthernet, LayerTypeIPv4, LayerTypeICMPv4, gopacket.LayerTypePayload, + }, t) + if got, ok := p.Layer(LayerTypeGeneve).(*Geneve); ok { + want := &Geneve{ + BaseLayer: BaseLayer{ + Contents: testPacketGeneve1[44:52], + Payload: testPacketGeneve1[52:150], + }, + Version: 0x0, + OptionsLength: 0x0, + OAMPacket: false, + CriticalOption: false, + Protocol: EthernetTypeTransparentEthernetBridging, + VNI: 0x0, + } + if !reflect.DeepEqual(want, got) { + t.Errorf("Geneve layer mismatch, \nwant %#v\ngot %#v\n", want, got) + } + } +} + +func TestDecodeGeneve2(t *testing.T) { + p := gopacket.NewPacket(testPacketGeneve2, LinkTypeEthernet, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{ + LayerTypeEthernet, LayerTypeIPv4, LayerTypeUDP, LayerTypeGeneve, + LayerTypeEthernet, LayerTypeIPv4, LayerTypeICMPv4, gopacket.LayerTypePayload, + }, t) + if got, ok := p.Layer(LayerTypeGeneve).(*Geneve); ok { + want := &Geneve{ + BaseLayer: BaseLayer{ + Contents: testPacketGeneve2[42:50], + Payload: testPacketGeneve2[50:148], + }, + Version: 0x0, + OptionsLength: 0x0, + OAMPacket: false, + CriticalOption: false, + Protocol: EthernetTypeTransparentEthernetBridging, + VNI: 0xa, + } + if !reflect.DeepEqual(want, got) { + t.Errorf("Geneve layer mismatch, \nwant %#v\ngot %#v\n", want, got) + } + } +} + +func BenchmarkDecodeGeneve1(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testPacketGeneve1, LinkTypeEthernet, gopacket.NoCopy) + } +} diff --git a/vendor/github.com/google/gopacket/layers/gre.go b/vendor/github.com/google/gopacket/layers/gre.go new file mode 100644 index 0000000..15d5290 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/gre.go @@ -0,0 +1,185 @@ +// 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 layers + +import ( + "encoding/binary" + + "github.com/google/gopacket" +) + +// GRE is a Generic Routing Encapsulation header. +type GRE struct { + BaseLayer + ChecksumPresent, RoutingPresent, KeyPresent, SeqPresent, StrictSourceRoute bool + RecursionControl, Flags, Version uint8 + Protocol EthernetType + Checksum, Offset uint16 + Key, Seq uint32 + *GRERouting +} + +// GRERouting is GRE routing information, present if the RoutingPresent flag is +// set. +type GRERouting struct { + AddressFamily uint16 + SREOffset, SRELength uint8 + RoutingInformation []byte + Next *GRERouting +} + +// LayerType returns gopacket.LayerTypeGRE. +func (g *GRE) LayerType() gopacket.LayerType { return LayerTypeGRE } + +// DecodeFromBytes decodes the given bytes into this layer. +func (g *GRE) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + g.ChecksumPresent = data[0]&0x80 != 0 + g.RoutingPresent = data[0]&0x40 != 0 + g.KeyPresent = data[0]&0x20 != 0 + g.SeqPresent = data[0]&0x10 != 0 + g.StrictSourceRoute = data[0]&0x08 != 0 + g.RecursionControl = data[0] & 0x7 + g.Flags = data[1] >> 3 + g.Version = data[1] & 0x7 + g.Protocol = EthernetType(binary.BigEndian.Uint16(data[2:4])) + offset := 4 + if g.ChecksumPresent || g.RoutingPresent { + g.Checksum = binary.BigEndian.Uint16(data[offset : offset+2]) + g.Offset = binary.BigEndian.Uint16(data[offset+2 : offset+4]) + offset += 4 + } + if g.KeyPresent { + g.Key = binary.BigEndian.Uint32(data[offset : offset+4]) + offset += 4 + } + if g.SeqPresent { + g.Seq = binary.BigEndian.Uint32(data[offset : offset+4]) + offset += 4 + } + if g.RoutingPresent { + tail := &g.GRERouting + for { + sre := &GRERouting{ + AddressFamily: binary.BigEndian.Uint16(data[offset : offset+2]), + SREOffset: data[offset+2], + SRELength: data[offset+3], + } + sre.RoutingInformation = data[offset+4 : offset+4+int(sre.SRELength)] + offset += 4 + int(sre.SRELength) + if sre.AddressFamily == 0 && sre.SRELength == 0 { + break + } + (*tail) = sre + tail = &sre.Next + } + } + g.BaseLayer = BaseLayer{data[:offset], data[offset:]} + return nil +} + +// SerializeTo writes the serialized form of this layer into the SerializationBuffer, +// implementing gopacket.SerializableLayer. See the docs for gopacket.SerializableLayer for more info. +func (g *GRE) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + size := 4 + if g.ChecksumPresent || g.RoutingPresent { + size += 4 + } + if g.KeyPresent { + size += 4 + } + if g.SeqPresent { + size += 4 + } + if g.RoutingPresent { + r := g.GRERouting + for r != nil { + size += 4 + int(r.SRELength) + r = r.Next + } + size += 4 + } + buf, err := b.PrependBytes(size) + if err != nil { + return err + } + // Reset any potentially dirty memory in the first 2 bytes, as these use OR to set flags. + buf[0] = 0 + buf[1] = 0 + if g.ChecksumPresent { + buf[0] |= 0x80 + } + if g.RoutingPresent { + buf[0] |= 0x40 + } + if g.KeyPresent { + buf[0] |= 0x20 + } + if g.SeqPresent { + buf[0] |= 0x10 + } + if g.StrictSourceRoute { + buf[0] |= 0x08 + } + buf[0] |= g.RecursionControl + buf[1] |= g.Flags << 3 + buf[1] |= g.Version + binary.BigEndian.PutUint16(buf[2:4], uint16(g.Protocol)) + offset := 4 + if g.ChecksumPresent || g.RoutingPresent { + // Don't write the checksum value yet, as we may need to compute it, + // which requires the entire header be complete. + // Instead we zeroize the memory in case it is dirty. + buf[offset] = 0 + buf[offset+1] = 0 + binary.BigEndian.PutUint16(buf[offset+2:offset+4], g.Offset) + offset += 4 + } + if g.KeyPresent { + binary.BigEndian.PutUint32(buf[offset:offset+4], g.Key) + offset += 4 + } + if g.SeqPresent { + binary.BigEndian.PutUint32(buf[offset:offset+4], g.Seq) + offset += 4 + } + if g.RoutingPresent { + sre := g.GRERouting + for sre != nil { + binary.BigEndian.PutUint16(buf[offset:offset+2], sre.AddressFamily) + buf[offset+2] = sre.SREOffset + buf[offset+3] = sre.SRELength + copy(buf[offset+4:offset+4+int(sre.SRELength)], sre.RoutingInformation) + offset += 4 + int(sre.SRELength) + sre = sre.Next + } + // Terminate routing field with a "NULL" SRE. + binary.BigEndian.PutUint32(buf[offset:offset+4], 0) + } + if g.ChecksumPresent { + if opts.ComputeChecksums { + g.Checksum = tcpipChecksum(b.Bytes(), 0) + } + + binary.BigEndian.PutUint16(buf[4:6], g.Checksum) + } + return nil +} + +// CanDecode returns the set of layer types that this DecodingLayer can decode. +func (g *GRE) CanDecode() gopacket.LayerClass { + return LayerTypeGRE +} + +// NextLayerType returns the layer type contained by this DecodingLayer. +func (g *GRE) NextLayerType() gopacket.LayerType { + return g.Protocol.LayerType() +} + +func decodeGRE(data []byte, p gopacket.PacketBuilder) error { + g := &GRE{} + return decodingLayerDecoder(g, data, p) +} diff --git a/vendor/github.com/google/gopacket/layers/gre_test.go b/vendor/github.com/google/gopacket/layers/gre_test.go new file mode 100644 index 0000000..af2e38e --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/gre_test.go @@ -0,0 +1,389 @@ +// 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 layers + +import ( + "fmt" + "net" + "reflect" + "testing" + + "github.com/google/gopacket" +) + +// testPacketGRE is the packet: +// 15:08:08.003196 IP 192.168.1.1 > 192.168.1.2: GREv0, length 88: IP 172.16.1.1 > 172.16.2.1: ICMP echo request, id 4724, seq 1, length 64 +// 0x0000: 3a56 6b69 595e 8e7a 12c3 a971 0800 4500 :VkiY^.z...q..E. +// 0x0010: 006c 843c 4000 402f 32d3 c0a8 0101 c0a8 .l.<@.@/2....... +// 0x0020: 0102 0000 0800 4500 0054 0488 4000 4001 ......E..T..@.@. +// 0x0030: dafe ac10 0101 ac10 0201 0800 82c4 1274 ...............t +// 0x0040: 0001 c892 a354 0000 0000 380c 0000 0000 .....T....8..... +// 0x0050: 0000 1011 1213 1415 1617 1819 1a1b 1c1d ................ +// 0x0060: 1e1f 2021 2223 2425 2627 2829 2a2b 2c2d ...!"#$%&'()*+,- +// 0x0070: 2e2f 3031 3233 3435 3637 ./01234567 +var testPacketGRE = []byte{ + 0x3a, 0x56, 0x6b, 0x69, 0x59, 0x5e, 0x8e, 0x7a, 0x12, 0xc3, 0xa9, 0x71, 0x08, 0x00, 0x45, 0x00, + 0x00, 0x6c, 0x84, 0x3c, 0x40, 0x00, 0x40, 0x2f, 0x32, 0xd3, 0xc0, 0xa8, 0x01, 0x01, 0xc0, 0xa8, + 0x01, 0x02, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 0x00, 0x54, 0x04, 0x88, 0x40, 0x00, 0x40, 0x01, + 0xda, 0xfe, 0xac, 0x10, 0x01, 0x01, 0xac, 0x10, 0x02, 0x01, 0x08, 0x00, 0x82, 0xc4, 0x12, 0x74, + 0x00, 0x01, 0xc8, 0x92, 0xa3, 0x54, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, +} + +func TestPacketGRE(t *testing.T) { + p := gopacket.NewPacket(testPacketGRE, LinkTypeEthernet, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeEthernet, LayerTypeIPv4, LayerTypeGRE, LayerTypeIPv4, LayerTypeICMPv4, gopacket.LayerTypePayload}, t) + if got, ok := p.Layer(LayerTypeGRE).(*GRE); ok { + want := &GRE{ + BaseLayer: BaseLayer{testPacketGRE[34:38], testPacketGRE[38:]}, + Protocol: EthernetTypeIPv4, + } + if !reflect.DeepEqual(want, got) { + t.Errorf("GRE layer mismatch, \nwant %#v\ngot %#v\n", want, got) + } + } +} + +func BenchmarkDecodePacketGRE(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testPacketGRE, LinkTypeEthernet, gopacket.NoCopy) + } +} + +var testIPv4OverGRE = []gopacket.SerializableLayer{ + &Ethernet{ + SrcMAC: net.HardwareAddr{142, 122, 18, 195, 169, 113}, + DstMAC: net.HardwareAddr{58, 86, 107, 105, 89, 94}, + EthernetType: EthernetTypeIPv4, + }, + &IPv4{ + Version: 4, + SrcIP: net.IP{192, 168, 1, 1}, + DstIP: net.IP{192, 168, 1, 2}, + Protocol: IPProtocolGRE, + Flags: IPv4DontFragment, + TTL: 64, + Id: 33852, + IHL: 5, + }, + &GRE{ + Protocol: EthernetTypeIPv4, + }, + &IPv4{ + Version: 4, + SrcIP: net.IP{172, 16, 1, 1}, + DstIP: net.IP{172, 16, 2, 1}, + Protocol: IPProtocolICMPv4, + Flags: IPv4DontFragment, + TTL: 64, + IHL: 5, + Id: 1160, + }, + &ICMPv4{ + TypeCode: CreateICMPv4TypeCode(ICMPv4TypeEchoRequest, 0), + Id: 4724, + Seq: 1, + }, + gopacket.Payload{ + 0xc8, 0x92, 0xa3, 0x54, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + }, +} + +func TestIPv4OverGREEncode(t *testing.T) { + b := gopacket.NewSerializeBuffer() + opts := gopacket.SerializeOptions{ + ComputeChecksums: true, + FixLengths: true, + } + if err := gopacket.SerializeLayers(b, opts, testIPv4OverGRE...); err != nil { + t.Errorf("Unable to serialize: %v", err) + } + p := gopacket.NewPacket(b.Bytes(), LinkTypeEthernet, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeEthernet, LayerTypeIPv4, LayerTypeGRE, LayerTypeIPv4, LayerTypeICMPv4, gopacket.LayerTypePayload}, t) + if got, want := b.Bytes(), testPacketGRE; !reflect.DeepEqual(want, got) { + t.Errorf("Encoding mismatch, \nwant: %v\ngot %v\n", want, got) + } +} + +func BenchmarkEncodePacketGRE(b *testing.B) { + buf := gopacket.NewSerializeBuffer() + opts := gopacket.SerializeOptions{ + ComputeChecksums: true, + FixLengths: true, + } + for i := 0; i < b.N; i++ { + gopacket.SerializeLayers(buf, opts, testIPv4OverGRE...) + buf.Clear() + } +} + +// testPacketEthernetOverGRE is the packet: +// 11:01:38.124768 IP 192.168.1.1 > 192.168.1.2: GREv0, length 102: IP 172.16.1.1 > 172.16.1.2: ICMP echo request, id 3842, seq 1, length 64 +// 0x0000: ea6b 4cd3 5513 d6b9 d880 56ef 0800 4500 .kL.U.....V...E. +// 0x0010: 007a 0acd 4000 402f ac34 c0a8 0101 c0a8 .z..@.@/.4...... +// 0x0020: 0102 0000 6558 aa6a 36e6 c630 6e32 3ec7 ....eX.j6..0n2>. +// 0x0030: 9def 0800 4500 0054 d970 4000 4001 0715 ....E..T.p@.@... +// 0x0040: ac10 0101 ac10 0102 0800 3f15 0f02 0001 ..........?..... +// 0x0050: 82d9 b154 0000 0000 b5e6 0100 0000 0000 ...T............ +// 0x0060: 1011 1213 1415 1617 1819 1a1b 1c1d 1e1f ................ +// 0x0070: 2021 2223 2425 2627 2829 2a2b 2c2d 2e2f .!"#$%&'()*+,-./ +// 0x0080: 3031 3233 3435 3637 01234567 +var testPacketEthernetOverGRE = []byte{ + 0xea, 0x6b, 0x4c, 0xd3, 0x55, 0x13, 0xd6, 0xb9, 0xd8, 0x80, 0x56, 0xef, 0x08, 0x00, 0x45, 0x00, + 0x00, 0x7a, 0x0a, 0xcd, 0x40, 0x00, 0x40, 0x2f, 0xac, 0x34, 0xc0, 0xa8, 0x01, 0x01, 0xc0, 0xa8, + 0x01, 0x02, 0x00, 0x00, 0x65, 0x58, 0xaa, 0x6a, 0x36, 0xe6, 0xc6, 0x30, 0x6e, 0x32, 0x3e, 0xc7, + 0x9d, 0xef, 0x08, 0x00, 0x45, 0x00, 0x00, 0x54, 0xd9, 0x70, 0x40, 0x00, 0x40, 0x01, 0x07, 0x15, + 0xac, 0x10, 0x01, 0x01, 0xac, 0x10, 0x01, 0x02, 0x08, 0x00, 0x3f, 0x15, 0x0f, 0x02, 0x00, 0x01, + 0x82, 0xd9, 0xb1, 0x54, 0x00, 0x00, 0x00, 0x00, 0xb5, 0xe6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, +} + +func TestPacketEthernetOverGRE(t *testing.T) { + p := gopacket.NewPacket(testPacketEthernetOverGRE, LinkTypeEthernet, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeEthernet, LayerTypeIPv4, LayerTypeGRE, LayerTypeEthernet, LayerTypeIPv4, LayerTypeICMPv4, gopacket.LayerTypePayload}, t) + if got, ok := p.Layer(LayerTypeGRE).(*GRE); ok { + want := &GRE{ + BaseLayer: BaseLayer{testPacketEthernetOverGRE[34:38], testPacketEthernetOverGRE[38:]}, + Protocol: EthernetTypeTransparentEthernetBridging, + } + if !reflect.DeepEqual(want, got) { + t.Errorf("GRE layer mismatch, \nwant %#v\ngot %#v\n", want, got) + } + } +} + +func BenchmarkDecodePacketEthernetOverGRE(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testPacketEthernetOverGRE, LinkTypeEthernet, gopacket.NoCopy) + } +} + +var testEthernetOverGRE = []gopacket.SerializableLayer{ + &Ethernet{ + SrcMAC: net.HardwareAddr{0xd6, 0xb9, 0xd8, 0x80, 0x56, 0xef}, + DstMAC: net.HardwareAddr{0xea, 0x6b, 0x4c, 0xd3, 0x55, 0x13}, + EthernetType: EthernetTypeIPv4, + }, + &IPv4{ + Version: 4, + SrcIP: net.IP{192, 168, 1, 1}, + DstIP: net.IP{192, 168, 1, 2}, + Protocol: IPProtocolGRE, + Flags: IPv4DontFragment, + TTL: 64, + Id: 2765, + IHL: 5, + }, + &GRE{ + Protocol: EthernetTypeTransparentEthernetBridging, + }, + &Ethernet{ + SrcMAC: net.HardwareAddr{0x6e, 0x32, 0x3e, 0xc7, 0x9d, 0xef}, + DstMAC: net.HardwareAddr{0xaa, 0x6a, 0x36, 0xe6, 0xc6, 0x30}, + EthernetType: EthernetTypeIPv4, + }, + &IPv4{ + Version: 4, + SrcIP: net.IP{172, 16, 1, 1}, + DstIP: net.IP{172, 16, 1, 2}, + Protocol: IPProtocolICMPv4, + Flags: IPv4DontFragment, + TTL: 64, + IHL: 5, + Id: 55664, + }, + &ICMPv4{ + TypeCode: CreateICMPv4TypeCode(ICMPv4TypeEchoRequest, 0), + Id: 3842, + Seq: 1, + }, + gopacket.Payload{ + 0x82, 0xd9, 0xb1, 0x54, 0x00, 0x00, 0x00, 0x00, 0xb5, 0xe6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + }, +} + +func TestEthernetOverGREEncode(t *testing.T) { + b := gopacket.NewSerializeBuffer() + opts := gopacket.SerializeOptions{ + ComputeChecksums: true, + FixLengths: true, + } + if err := gopacket.SerializeLayers(b, opts, testEthernetOverGRE...); err != nil { + t.Errorf("Unable to serialize: %v", err) + } + p := gopacket.NewPacket(b.Bytes(), LinkTypeEthernet, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeEthernet, LayerTypeIPv4, LayerTypeGRE, LayerTypeEthernet, LayerTypeIPv4, LayerTypeICMPv4, gopacket.LayerTypePayload}, t) + if got, want := b.Bytes(), testPacketEthernetOverGRE; !reflect.DeepEqual(want, got) { + t.Errorf("Encoding mismatch, \nwant: %v\ngot %v\n", want, got) + } +} + +func BenchmarkEncodePacketEthernetOverGRE(b *testing.B) { + buf := gopacket.NewSerializeBuffer() + opts := gopacket.SerializeOptions{ + ComputeChecksums: true, + FixLengths: true, + } + for i := 0; i < b.N; i++ { + gopacket.SerializeLayers(buf, opts, testEthernetOverGRE...) + buf.Clear() + } +} + +var testGREChecksum = map[uint16][]gopacket.SerializableLayer{ + 0x77ff: { + &Ethernet{ + SrcMAC: net.HardwareAddr{0xc2, 0x00, 0x57, 0x75, 0x00, 0x00}, + DstMAC: net.HardwareAddr{0xc2, 0x01, 0x57, 0x75, 0x00, 0x00}, + EthernetType: EthernetTypeIPv4, + }, + &IPv4{ + Version: 4, + SrcIP: net.IP{10, 0, 0, 1}, + DstIP: net.IP{10, 0, 0, 2}, + Protocol: IPProtocolGRE, + TTL: 255, + Id: 10, + IHL: 5, + }, + &GRE{ + Protocol: EthernetTypeIPv4, + ChecksumPresent: true, + }, + &IPv4{ + Version: 4, + SrcIP: net.IP{1, 1, 1, 1}, + DstIP: net.IP{2, 2, 2, 2}, + Protocol: IPProtocolICMPv4, + TTL: 255, + IHL: 5, + Id: 10, + }, + &ICMPv4{ + TypeCode: CreateICMPv4TypeCode(ICMPv4TypeEchoRequest, 0), + Id: 2, + Seq: 0, + }, + gopacket.Payload{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xbe, 0x70, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, + 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, + 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, + 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, + 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, + }, + }, + 0x8475: { + &Ethernet{ + SrcMAC: net.HardwareAddr{0xc2, 0x00, 0x57, 0x75, 0x00, 0x00}, + DstMAC: net.HardwareAddr{0xc2, 0x01, 0x57, 0x75, 0x00, 0x00}, + EthernetType: EthernetTypeIPv4, + }, + &IPv4{ + Version: 4, + SrcIP: net.IP{10, 0, 0, 1}, + DstIP: net.IP{10, 0, 0, 2}, + Protocol: IPProtocolGRE, + TTL: 255, + Id: 10, + IHL: 5, + }, + &GRE{ + Protocol: EthernetTypeIPv4, + ChecksumPresent: true, + }, + &IPv4{ + Version: 4, + SrcIP: net.IP{2, 3, 4, 5}, + DstIP: net.IP{2, 3, 4, 50}, + Protocol: IPProtocolUDP, + TTL: 1, + IHL: 5, + Flags: IPv4DontFragment, + Id: 964, + }, + &UDP{ + SrcPort: 41781, + DstPort: 33434, + }, + gopacket.Payload{ + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, + }, + }, +} + +func TestGREChecksum(t *testing.T) { + buf := gopacket.NewSerializeBuffer() + opts := gopacket.SerializeOptions{ + ComputeChecksums: true, + FixLengths: true, + } + for cksum, packet := range testGREChecksum { + buf.Clear() + if err := setNetworkLayer(packet); err != nil { + t.Errorf("Failed to set network layer: %v", err) + continue + } + if err := gopacket.SerializeLayers(buf, opts, packet...); err != nil { + t.Errorf("Failed to serialize packet: %v", err) + continue + } + p := gopacket.NewPacket(buf.Bytes(), LinkTypeEthernet, gopacket.Default) + t.Log(p) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + continue + } + if got, ok := p.Layer(LayerTypeGRE).(*GRE); ok { + if got.Checksum != cksum { + t.Errorf("Incorrect checksum calculated for GRE packet: want %v, got %v", cksum, got.Checksum) + } + } + } +} + +func setNetworkLayer(layers []gopacket.SerializableLayer) error { + type setNetworkLayerForChecksum interface { + SetNetworkLayerForChecksum(gopacket.NetworkLayer) error + } + var l gopacket.NetworkLayer + for _, layer := range layers { + if n, ok := layer.(gopacket.NetworkLayer); ok { + l = n + } + if s, ok := layer.(setNetworkLayerForChecksum); ok { + if l == nil { + return fmt.Errorf("no enclosing network layer found before: %v", s) + } + if err := s.SetNetworkLayerForChecksum(l); err != nil { + return fmt.Errorf("failed to set network layer(%v) on layer(%v): %v", l, s, err) + } + } + } + return nil +} diff --git a/vendor/github.com/google/gopacket/layers/iana_ports.go b/vendor/github.com/google/gopacket/layers/iana_ports.go new file mode 100644 index 0000000..c217a69 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/iana_ports.go @@ -0,0 +1,11350 @@ +// Copyright 2012 Google, Inc. All rights reserved. + +package layers + +// Created by gen.go, don't edit manually +// Generated at 2017-09-19 13:08:22.987239325 -0600 MDT +// Fetched from "http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xml" + +// TCPPortNames contains the port names for all TCP ports. +var TCPPortNames = tcpPortNames + +// UDPPortNames contains the port names for all UDP ports. +var UDPPortNames = udpPortNames + +// SCTPPortNames contains the port names for all SCTP ports. +var SCTPPortNames = sctpPortNames + +var tcpPortNames = map[TCPPort]string{ + 1: "tcpmux", + 2: "compressnet", + 3: "compressnet", + 5: "rje", + 7: "echo", + 9: "discard", + 11: "systat", + 13: "daytime", + 17: "qotd", + 18: "msp", + 19: "chargen", + 20: "ftp-data", + 21: "ftp", + 22: "ssh", + 23: "telnet", + 25: "smtp", + 27: "nsw-fe", + 29: "msg-icp", + 31: "msg-auth", + 33: "dsp", + 37: "time", + 38: "rap", + 39: "rlp", + 41: "graphics", + 42: "name", + 43: "nicname", + 44: "mpm-flags", + 45: "mpm", + 46: "mpm-snd", + 48: "auditd", + 49: "tacacs", + 50: "re-mail-ck", + 52: "xns-time", + 53: "domain", + 54: "xns-ch", + 55: "isi-gl", + 56: "xns-auth", + 58: "xns-mail", + 62: "acas", + 63: "whoispp", + 64: "covia", + 65: "tacacs-ds", + 66: "sql-net", + 67: "bootps", + 68: "bootpc", + 69: "tftp", + 70: "gopher", + 71: "netrjs-1", + 72: "netrjs-2", + 73: "netrjs-3", + 74: "netrjs-4", + 76: "deos", + 78: "vettcp", + 79: "finger", + 80: "http", + 82: "xfer", + 83: "mit-ml-dev", + 84: "ctf", + 85: "mit-ml-dev", + 86: "mfcobol", + 88: "kerberos", + 89: "su-mit-tg", + 90: "dnsix", + 91: "mit-dov", + 92: "npp", + 93: "dcp", + 94: "objcall", + 95: "supdup", + 96: "dixie", + 97: "swift-rvf", + 98: "tacnews", + 99: "metagram", + 101: "hostname", + 102: "iso-tsap", + 103: "gppitnp", + 104: "acr-nema", + 105: "cso", + 106: "3com-tsmux", + 107: "rtelnet", + 108: "snagas", + 109: "pop2", + 110: "pop3", + 111: "sunrpc", + 112: "mcidas", + 113: "ident", + 115: "sftp", + 116: "ansanotify", + 117: "uucp-path", + 118: "sqlserv", + 119: "nntp", + 120: "cfdptkt", + 121: "erpc", + 122: "smakynet", + 123: "ntp", + 124: "ansatrader", + 125: "locus-map", + 126: "nxedit", + 127: "locus-con", + 128: "gss-xlicen", + 129: "pwdgen", + 130: "cisco-fna", + 131: "cisco-tna", + 132: "cisco-sys", + 133: "statsrv", + 134: "ingres-net", + 135: "epmap", + 136: "profile", + 137: "netbios-ns", + 138: "netbios-dgm", + 139: "netbios-ssn", + 140: "emfis-data", + 141: "emfis-cntl", + 142: "bl-idm", + 143: "imap", + 144: "uma", + 145: "uaac", + 146: "iso-tp0", + 147: "iso-ip", + 148: "jargon", + 149: "aed-512", + 150: "sql-net", + 151: "hems", + 152: "bftp", + 153: "sgmp", + 154: "netsc-prod", + 155: "netsc-dev", + 156: "sqlsrv", + 157: "knet-cmp", + 158: "pcmail-srv", + 159: "nss-routing", + 160: "sgmp-traps", + 161: "snmp", + 162: "snmptrap", + 163: "cmip-man", + 164: "cmip-agent", + 165: "xns-courier", + 166: "s-net", + 167: "namp", + 168: "rsvd", + 169: "send", + 170: "print-srv", + 171: "multiplex", + 172: "cl-1", + 173: "xyplex-mux", + 174: "mailq", + 175: "vmnet", + 176: "genrad-mux", + 177: "xdmcp", + 178: "nextstep", + 179: "bgp", + 180: "ris", + 181: "unify", + 182: "audit", + 183: "ocbinder", + 184: "ocserver", + 185: "remote-kis", + 186: "kis", + 187: "aci", + 188: "mumps", + 189: "qft", + 190: "gacp", + 191: "prospero", + 192: "osu-nms", + 193: "srmp", + 194: "irc", + 195: "dn6-nlm-aud", + 196: "dn6-smm-red", + 197: "dls", + 198: "dls-mon", + 199: "smux", + 200: "src", + 201: "at-rtmp", + 202: "at-nbp", + 203: "at-3", + 204: "at-echo", + 205: "at-5", + 206: "at-zis", + 207: "at-7", + 208: "at-8", + 209: "qmtp", + 210: "z39-50", + 211: "914c-g", + 212: "anet", + 213: "ipx", + 214: "vmpwscs", + 215: "softpc", + 216: "CAIlic", + 217: "dbase", + 218: "mpp", + 219: "uarps", + 220: "imap3", + 221: "fln-spx", + 222: "rsh-spx", + 223: "cdc", + 224: "masqdialer", + 242: "direct", + 243: "sur-meas", + 244: "inbusiness", + 245: "link", + 246: "dsp3270", + 247: "subntbcst-tftp", + 248: "bhfhs", + 256: "rap", + 257: "set", + 259: "esro-gen", + 260: "openport", + 261: "nsiiops", + 262: "arcisdms", + 263: "hdap", + 264: "bgmp", + 265: "x-bone-ctl", + 266: "sst", + 267: "td-service", + 268: "td-replica", + 269: "manet", + 271: "pt-tls", + 280: "http-mgmt", + 281: "personal-link", + 282: "cableport-ax", + 283: "rescap", + 284: "corerjd", + 286: "fxp", + 287: "k-block", + 308: "novastorbakcup", + 309: "entrusttime", + 310: "bhmds", + 311: "asip-webadmin", + 312: "vslmp", + 313: "magenta-logic", + 314: "opalis-robot", + 315: "dpsi", + 316: "decauth", + 317: "zannet", + 318: "pkix-timestamp", + 319: "ptp-event", + 320: "ptp-general", + 321: "pip", + 322: "rtsps", + 323: "rpki-rtr", + 324: "rpki-rtr-tls", + 333: "texar", + 344: "pdap", + 345: "pawserv", + 346: "zserv", + 347: "fatserv", + 348: "csi-sgwp", + 349: "mftp", + 350: "matip-type-a", + 351: "matip-type-b", + 352: "dtag-ste-sb", + 353: "ndsauth", + 354: "bh611", + 355: "datex-asn", + 356: "cloanto-net-1", + 357: "bhevent", + 358: "shrinkwrap", + 359: "nsrmp", + 360: "scoi2odialog", + 361: "semantix", + 362: "srssend", + 363: "rsvp-tunnel", + 364: "aurora-cmgr", + 365: "dtk", + 366: "odmr", + 367: "mortgageware", + 368: "qbikgdp", + 369: "rpc2portmap", + 370: "codaauth2", + 371: "clearcase", + 372: "ulistproc", + 373: "legent-1", + 374: "legent-2", + 375: "hassle", + 376: "nip", + 377: "tnETOS", + 378: "dsETOS", + 379: "is99c", + 380: "is99s", + 381: "hp-collector", + 382: "hp-managed-node", + 383: "hp-alarm-mgr", + 384: "arns", + 385: "ibm-app", + 386: "asa", + 387: "aurp", + 388: "unidata-ldm", + 389: "ldap", + 390: "uis", + 391: "synotics-relay", + 392: "synotics-broker", + 393: "meta5", + 394: "embl-ndt", + 395: "netcp", + 396: "netware-ip", + 397: "mptn", + 398: "kryptolan", + 399: "iso-tsap-c2", + 400: "osb-sd", + 401: "ups", + 402: "genie", + 403: "decap", + 404: "nced", + 405: "ncld", + 406: "imsp", + 407: "timbuktu", + 408: "prm-sm", + 409: "prm-nm", + 410: "decladebug", + 411: "rmt", + 412: "synoptics-trap", + 413: "smsp", + 414: "infoseek", + 415: "bnet", + 416: "silverplatter", + 417: "onmux", + 418: "hyper-g", + 419: "ariel1", + 420: "smpte", + 421: "ariel2", + 422: "ariel3", + 423: "opc-job-start", + 424: "opc-job-track", + 425: "icad-el", + 426: "smartsdp", + 427: "svrloc", + 428: "ocs-cmu", + 429: "ocs-amu", + 430: "utmpsd", + 431: "utmpcd", + 432: "iasd", + 433: "nnsp", + 434: "mobileip-agent", + 435: "mobilip-mn", + 436: "dna-cml", + 437: "comscm", + 438: "dsfgw", + 439: "dasp", + 440: "sgcp", + 441: "decvms-sysmgt", + 442: "cvc-hostd", + 443: "https", + 444: "snpp", + 445: "microsoft-ds", + 446: "ddm-rdb", + 447: "ddm-dfm", + 448: "ddm-ssl", + 449: "as-servermap", + 450: "tserver", + 451: "sfs-smp-net", + 452: "sfs-config", + 453: "creativeserver", + 454: "contentserver", + 455: "creativepartnr", + 456: "macon-tcp", + 457: "scohelp", + 458: "appleqtc", + 459: "ampr-rcmd", + 460: "skronk", + 461: "datasurfsrv", + 462: "datasurfsrvsec", + 463: "alpes", + 464: "kpasswd", + 465: "urd", + 466: "digital-vrc", + 467: "mylex-mapd", + 468: "photuris", + 469: "rcp", + 470: "scx-proxy", + 471: "mondex", + 472: "ljk-login", + 473: "hybrid-pop", + 474: "tn-tl-w1", + 475: "tcpnethaspsrv", + 476: "tn-tl-fd1", + 477: "ss7ns", + 478: "spsc", + 479: "iafserver", + 480: "iafdbase", + 481: "ph", + 482: "bgs-nsi", + 483: "ulpnet", + 484: "integra-sme", + 485: "powerburst", + 486: "avian", + 487: "saft", + 488: "gss-http", + 489: "nest-protocol", + 490: "micom-pfs", + 491: "go-login", + 492: "ticf-1", + 493: "ticf-2", + 494: "pov-ray", + 495: "intecourier", + 496: "pim-rp-disc", + 497: "retrospect", + 498: "siam", + 499: "iso-ill", + 500: "isakmp", + 501: "stmf", + 502: "mbap", + 503: "intrinsa", + 504: "citadel", + 505: "mailbox-lm", + 506: "ohimsrv", + 507: "crs", + 508: "xvttp", + 509: "snare", + 510: "fcp", + 511: "passgo", + 512: "exec", + 513: "login", + 514: "shell", + 515: "printer", + 516: "videotex", + 517: "talk", + 518: "ntalk", + 519: "utime", + 520: "efs", + 521: "ripng", + 522: "ulp", + 523: "ibm-db2", + 524: "ncp", + 525: "timed", + 526: "tempo", + 527: "stx", + 528: "custix", + 529: "irc-serv", + 530: "courier", + 531: "conference", + 532: "netnews", + 533: "netwall", + 534: "windream", + 535: "iiop", + 536: "opalis-rdv", + 537: "nmsp", + 538: "gdomap", + 539: "apertus-ldp", + 540: "uucp", + 541: "uucp-rlogin", + 542: "commerce", + 543: "klogin", + 544: "kshell", + 545: "appleqtcsrvr", + 546: "dhcpv6-client", + 547: "dhcpv6-server", + 548: "afpovertcp", + 549: "idfp", + 550: "new-rwho", + 551: "cybercash", + 552: "devshr-nts", + 553: "pirp", + 554: "rtsp", + 555: "dsf", + 556: "remotefs", + 557: "openvms-sysipc", + 558: "sdnskmp", + 559: "teedtap", + 560: "rmonitor", + 561: "monitor", + 562: "chshell", + 563: "nntps", + 564: "9pfs", + 565: "whoami", + 566: "streettalk", + 567: "banyan-rpc", + 568: "ms-shuttle", + 569: "ms-rome", + 570: "meter", + 571: "meter", + 572: "sonar", + 573: "banyan-vip", + 574: "ftp-agent", + 575: "vemmi", + 576: "ipcd", + 577: "vnas", + 578: "ipdd", + 579: "decbsrv", + 580: "sntp-heartbeat", + 581: "bdp", + 582: "scc-security", + 583: "philips-vc", + 584: "keyserver", + 586: "password-chg", + 587: "submission", + 588: "cal", + 589: "eyelink", + 590: "tns-cml", + 591: "http-alt", + 592: "eudora-set", + 593: "http-rpc-epmap", + 594: "tpip", + 595: "cab-protocol", + 596: "smsd", + 597: "ptcnameservice", + 598: "sco-websrvrmg3", + 599: "acp", + 600: "ipcserver", + 601: "syslog-conn", + 602: "xmlrpc-beep", + 603: "idxp", + 604: "tunnel", + 605: "soap-beep", + 606: "urm", + 607: "nqs", + 608: "sift-uft", + 609: "npmp-trap", + 610: "npmp-local", + 611: "npmp-gui", + 612: "hmmp-ind", + 613: "hmmp-op", + 614: "sshell", + 615: "sco-inetmgr", + 616: "sco-sysmgr", + 617: "sco-dtmgr", + 618: "dei-icda", + 619: "compaq-evm", + 620: "sco-websrvrmgr", + 621: "escp-ip", + 622: "collaborator", + 623: "oob-ws-http", + 624: "cryptoadmin", + 625: "dec-dlm", + 626: "asia", + 627: "passgo-tivoli", + 628: "qmqp", + 629: "3com-amp3", + 630: "rda", + 631: "ipp", + 632: "bmpp", + 633: "servstat", + 634: "ginad", + 635: "rlzdbase", + 636: "ldaps", + 637: "lanserver", + 638: "mcns-sec", + 639: "msdp", + 640: "entrust-sps", + 641: "repcmd", + 642: "esro-emsdp", + 643: "sanity", + 644: "dwr", + 645: "pssc", + 646: "ldp", + 647: "dhcp-failover", + 648: "rrp", + 649: "cadview-3d", + 650: "obex", + 651: "ieee-mms", + 652: "hello-port", + 653: "repscmd", + 654: "aodv", + 655: "tinc", + 656: "spmp", + 657: "rmc", + 658: "tenfold", + 660: "mac-srvr-admin", + 661: "hap", + 662: "pftp", + 663: "purenoise", + 664: "oob-ws-https", + 665: "sun-dr", + 666: "mdqs", + 667: "disclose", + 668: "mecomm", + 669: "meregister", + 670: "vacdsm-sws", + 671: "vacdsm-app", + 672: "vpps-qua", + 673: "cimplex", + 674: "acap", + 675: "dctp", + 676: "vpps-via", + 677: "vpp", + 678: "ggf-ncp", + 679: "mrm", + 680: "entrust-aaas", + 681: "entrust-aams", + 682: "xfr", + 683: "corba-iiop", + 684: "corba-iiop-ssl", + 685: "mdc-portmapper", + 686: "hcp-wismar", + 687: "asipregistry", + 688: "realm-rusd", + 689: "nmap", + 690: "vatp", + 691: "msexch-routing", + 692: "hyperwave-isp", + 693: "connendp", + 694: "ha-cluster", + 695: "ieee-mms-ssl", + 696: "rushd", + 697: "uuidgen", + 698: "olsr", + 699: "accessnetwork", + 700: "epp", + 701: "lmp", + 702: "iris-beep", + 704: "elcsd", + 705: "agentx", + 706: "silc", + 707: "borland-dsj", + 709: "entrust-kmsh", + 710: "entrust-ash", + 711: "cisco-tdp", + 712: "tbrpf", + 713: "iris-xpc", + 714: "iris-xpcs", + 715: "iris-lwz", + 729: "netviewdm1", + 730: "netviewdm2", + 731: "netviewdm3", + 741: "netgw", + 742: "netrcs", + 744: "flexlm", + 747: "fujitsu-dev", + 748: "ris-cm", + 749: "kerberos-adm", + 750: "rfile", + 751: "pump", + 752: "qrh", + 753: "rrh", + 754: "tell", + 758: "nlogin", + 759: "con", + 760: "ns", + 761: "rxe", + 762: "quotad", + 763: "cycleserv", + 764: "omserv", + 765: "webster", + 767: "phonebook", + 769: "vid", + 770: "cadlock", + 771: "rtip", + 772: "cycleserv2", + 773: "submit", + 774: "rpasswd", + 775: "entomb", + 776: "wpages", + 777: "multiling-http", + 780: "wpgs", + 800: "mdbs-daemon", + 801: "device", + 802: "mbap-s", + 810: "fcp-udp", + 828: "itm-mcell-s", + 829: "pkix-3-ca-ra", + 830: "netconf-ssh", + 831: "netconf-beep", + 832: "netconfsoaphttp", + 833: "netconfsoapbeep", + 847: "dhcp-failover2", + 848: "gdoi", + 853: "domain-s", + 854: "dlep", + 860: "iscsi", + 861: "owamp-control", + 862: "twamp-control", + 873: "rsync", + 886: "iclcnet-locate", + 887: "iclcnet-svinfo", + 888: "accessbuilder", + 900: "omginitialrefs", + 901: "smpnameres", + 902: "ideafarm-door", + 903: "ideafarm-panic", + 910: "kink", + 911: "xact-backup", + 912: "apex-mesh", + 913: "apex-edge", + 953: "rndc", + 989: "ftps-data", + 990: "ftps", + 991: "nas", + 992: "telnets", + 993: "imaps", + 995: "pop3s", + 996: "vsinet", + 997: "maitrd", + 998: "busboy", + 999: "garcon", + 1000: "cadlock2", + 1001: "webpush", + 1010: "surf", + 1021: "exp1", + 1022: "exp2", + 1025: "blackjack", + 1026: "cap", + 1029: "solid-mux", + 1033: "netinfo-local", + 1034: "activesync", + 1035: "mxxrlogin", + 1036: "nsstp", + 1037: "ams", + 1038: "mtqp", + 1039: "sbl", + 1040: "netarx", + 1041: "danf-ak2", + 1042: "afrog", + 1043: "boinc-client", + 1044: "dcutility", + 1045: "fpitp", + 1046: "wfremotertm", + 1047: "neod1", + 1048: "neod2", + 1049: "td-postman", + 1050: "cma", + 1051: "optima-vnet", + 1052: "ddt", + 1053: "remote-as", + 1054: "brvread", + 1055: "ansyslmd", + 1056: "vfo", + 1057: "startron", + 1058: "nim", + 1059: "nimreg", + 1060: "polestar", + 1061: "kiosk", + 1062: "veracity", + 1063: "kyoceranetdev", + 1064: "jstel", + 1065: "syscomlan", + 1066: "fpo-fns", + 1067: "instl-boots", + 1068: "instl-bootc", + 1069: "cognex-insight", + 1070: "gmrupdateserv", + 1071: "bsquare-voip", + 1072: "cardax", + 1073: "bridgecontrol", + 1074: "warmspotMgmt", + 1075: "rdrmshc", + 1076: "dab-sti-c", + 1077: "imgames", + 1078: "avocent-proxy", + 1079: "asprovatalk", + 1080: "socks", + 1081: "pvuniwien", + 1082: "amt-esd-prot", + 1083: "ansoft-lm-1", + 1084: "ansoft-lm-2", + 1085: "webobjects", + 1086: "cplscrambler-lg", + 1087: "cplscrambler-in", + 1088: "cplscrambler-al", + 1089: "ff-annunc", + 1090: "ff-fms", + 1091: "ff-sm", + 1092: "obrpd", + 1093: "proofd", + 1094: "rootd", + 1095: "nicelink", + 1096: "cnrprotocol", + 1097: "sunclustermgr", + 1098: "rmiactivation", + 1099: "rmiregistry", + 1100: "mctp", + 1101: "pt2-discover", + 1102: "adobeserver-1", + 1103: "adobeserver-2", + 1104: "xrl", + 1105: "ftranhc", + 1106: "isoipsigport-1", + 1107: "isoipsigport-2", + 1108: "ratio-adp", + 1110: "webadmstart", + 1111: "lmsocialserver", + 1112: "icp", + 1113: "ltp-deepspace", + 1114: "mini-sql", + 1115: "ardus-trns", + 1116: "ardus-cntl", + 1117: "ardus-mtrns", + 1118: "sacred", + 1119: "bnetgame", + 1120: "bnetfile", + 1121: "rmpp", + 1122: "availant-mgr", + 1123: "murray", + 1124: "hpvmmcontrol", + 1125: "hpvmmagent", + 1126: "hpvmmdata", + 1127: "kwdb-commn", + 1128: "saphostctrl", + 1129: "saphostctrls", + 1130: "casp", + 1131: "caspssl", + 1132: "kvm-via-ip", + 1133: "dfn", + 1134: "aplx", + 1135: "omnivision", + 1136: "hhb-gateway", + 1137: "trim", + 1138: "encrypted-admin", + 1139: "evm", + 1140: "autonoc", + 1141: "mxomss", + 1142: "edtools", + 1143: "imyx", + 1144: "fuscript", + 1145: "x9-icue", + 1146: "audit-transfer", + 1147: "capioverlan", + 1148: "elfiq-repl", + 1149: "bvtsonar", + 1150: "blaze", + 1151: "unizensus", + 1152: "winpoplanmess", + 1153: "c1222-acse", + 1154: "resacommunity", + 1155: "nfa", + 1156: "iascontrol-oms", + 1157: "iascontrol", + 1158: "dbcontrol-oms", + 1159: "oracle-oms", + 1160: "olsv", + 1161: "health-polling", + 1162: "health-trap", + 1163: "sddp", + 1164: "qsm-proxy", + 1165: "qsm-gui", + 1166: "qsm-remote", + 1167: "cisco-ipsla", + 1168: "vchat", + 1169: "tripwire", + 1170: "atc-lm", + 1171: "atc-appserver", + 1172: "dnap", + 1173: "d-cinema-rrp", + 1174: "fnet-remote-ui", + 1175: "dossier", + 1176: "indigo-server", + 1177: "dkmessenger", + 1178: "sgi-storman", + 1179: "b2n", + 1180: "mc-client", + 1181: "3comnetman", + 1182: "accelenet", + 1183: "llsurfup-http", + 1184: "llsurfup-https", + 1185: "catchpole", + 1186: "mysql-cluster", + 1187: "alias", + 1188: "hp-webadmin", + 1189: "unet", + 1190: "commlinx-avl", + 1191: "gpfs", + 1192: "caids-sensor", + 1193: "fiveacross", + 1194: "openvpn", + 1195: "rsf-1", + 1196: "netmagic", + 1197: "carrius-rshell", + 1198: "cajo-discovery", + 1199: "dmidi", + 1200: "scol", + 1201: "nucleus-sand", + 1202: "caiccipc", + 1203: "ssslic-mgr", + 1204: "ssslog-mgr", + 1205: "accord-mgc", + 1206: "anthony-data", + 1207: "metasage", + 1208: "seagull-ais", + 1209: "ipcd3", + 1210: "eoss", + 1211: "groove-dpp", + 1212: "lupa", + 1213: "mpc-lifenet", + 1214: "kazaa", + 1215: "scanstat-1", + 1216: "etebac5", + 1217: "hpss-ndapi", + 1218: "aeroflight-ads", + 1219: "aeroflight-ret", + 1220: "qt-serveradmin", + 1221: "sweetware-apps", + 1222: "nerv", + 1223: "tgp", + 1224: "vpnz", + 1225: "slinkysearch", + 1226: "stgxfws", + 1227: "dns2go", + 1228: "florence", + 1229: "zented", + 1230: "periscope", + 1231: "menandmice-lpm", + 1232: "first-defense", + 1233: "univ-appserver", + 1234: "search-agent", + 1235: "mosaicsyssvc1", + 1236: "bvcontrol", + 1237: "tsdos390", + 1238: "hacl-qs", + 1239: "nmsd", + 1240: "instantia", + 1241: "nessus", + 1242: "nmasoverip", + 1243: "serialgateway", + 1244: "isbconference1", + 1245: "isbconference2", + 1246: "payrouter", + 1247: "visionpyramid", + 1248: "hermes", + 1249: "mesavistaco", + 1250: "swldy-sias", + 1251: "servergraph", + 1252: "bspne-pcc", + 1253: "q55-pcc", + 1254: "de-noc", + 1255: "de-cache-query", + 1256: "de-server", + 1257: "shockwave2", + 1258: "opennl", + 1259: "opennl-voice", + 1260: "ibm-ssd", + 1261: "mpshrsv", + 1262: "qnts-orb", + 1263: "dka", + 1264: "prat", + 1265: "dssiapi", + 1266: "dellpwrappks", + 1267: "epc", + 1268: "propel-msgsys", + 1269: "watilapp", + 1270: "opsmgr", + 1271: "excw", + 1272: "cspmlockmgr", + 1273: "emc-gateway", + 1274: "t1distproc", + 1275: "ivcollector", + 1277: "miva-mqs", + 1278: "dellwebadmin-1", + 1279: "dellwebadmin-2", + 1280: "pictrography", + 1281: "healthd", + 1282: "emperion", + 1283: "productinfo", + 1284: "iee-qfx", + 1285: "neoiface", + 1286: "netuitive", + 1287: "routematch", + 1288: "navbuddy", + 1289: "jwalkserver", + 1290: "winjaserver", + 1291: "seagulllms", + 1292: "dsdn", + 1293: "pkt-krb-ipsec", + 1294: "cmmdriver", + 1295: "ehtp", + 1296: "dproxy", + 1297: "sdproxy", + 1298: "lpcp", + 1299: "hp-sci", + 1300: "h323hostcallsc", + 1301: "ci3-software-1", + 1302: "ci3-software-2", + 1303: "sftsrv", + 1304: "boomerang", + 1305: "pe-mike", + 1306: "re-conn-proto", + 1307: "pacmand", + 1308: "odsi", + 1309: "jtag-server", + 1310: "husky", + 1311: "rxmon", + 1312: "sti-envision", + 1313: "bmc-patroldb", + 1314: "pdps", + 1315: "els", + 1316: "exbit-escp", + 1317: "vrts-ipcserver", + 1318: "krb5gatekeeper", + 1319: "amx-icsp", + 1320: "amx-axbnet", + 1321: "pip", + 1322: "novation", + 1323: "brcd", + 1324: "delta-mcp", + 1325: "dx-instrument", + 1326: "wimsic", + 1327: "ultrex", + 1328: "ewall", + 1329: "netdb-export", + 1330: "streetperfect", + 1331: "intersan", + 1332: "pcia-rxp-b", + 1333: "passwrd-policy", + 1334: "writesrv", + 1335: "digital-notary", + 1336: "ischat", + 1337: "menandmice-dns", + 1338: "wmc-log-svc", + 1339: "kjtsiteserver", + 1340: "naap", + 1341: "qubes", + 1342: "esbroker", + 1343: "re101", + 1344: "icap", + 1345: "vpjp", + 1346: "alta-ana-lm", + 1347: "bbn-mmc", + 1348: "bbn-mmx", + 1349: "sbook", + 1350: "editbench", + 1351: "equationbuilder", + 1352: "lotusnote", + 1353: "relief", + 1354: "XSIP-network", + 1355: "intuitive-edge", + 1356: "cuillamartin", + 1357: "pegboard", + 1358: "connlcli", + 1359: "ftsrv", + 1360: "mimer", + 1361: "linx", + 1362: "timeflies", + 1363: "ndm-requester", + 1364: "ndm-server", + 1365: "adapt-sna", + 1366: "netware-csp", + 1367: "dcs", + 1368: "screencast", + 1369: "gv-us", + 1370: "us-gv", + 1371: "fc-cli", + 1372: "fc-ser", + 1373: "chromagrafx", + 1374: "molly", + 1375: "bytex", + 1376: "ibm-pps", + 1377: "cichlid", + 1378: "elan", + 1379: "dbreporter", + 1380: "telesis-licman", + 1381: "apple-licman", + 1382: "udt-os", + 1383: "gwha", + 1384: "os-licman", + 1385: "atex-elmd", + 1386: "checksum", + 1387: "cadsi-lm", + 1388: "objective-dbc", + 1389: "iclpv-dm", + 1390: "iclpv-sc", + 1391: "iclpv-sas", + 1392: "iclpv-pm", + 1393: "iclpv-nls", + 1394: "iclpv-nlc", + 1395: "iclpv-wsm", + 1396: "dvl-activemail", + 1397: "audio-activmail", + 1398: "video-activmail", + 1399: "cadkey-licman", + 1400: "cadkey-tablet", + 1401: "goldleaf-licman", + 1402: "prm-sm-np", + 1403: "prm-nm-np", + 1404: "igi-lm", + 1405: "ibm-res", + 1406: "netlabs-lm", + 1407: "tibet-server", + 1408: "sophia-lm", + 1409: "here-lm", + 1410: "hiq", + 1411: "af", + 1412: "innosys", + 1413: "innosys-acl", + 1414: "ibm-mqseries", + 1415: "dbstar", + 1416: "novell-lu6-2", + 1417: "timbuktu-srv1", + 1418: "timbuktu-srv2", + 1419: "timbuktu-srv3", + 1420: "timbuktu-srv4", + 1421: "gandalf-lm", + 1422: "autodesk-lm", + 1423: "essbase", + 1424: "hybrid", + 1425: "zion-lm", + 1426: "sais", + 1427: "mloadd", + 1428: "informatik-lm", + 1429: "nms", + 1430: "tpdu", + 1431: "rgtp", + 1432: "blueberry-lm", + 1433: "ms-sql-s", + 1434: "ms-sql-m", + 1435: "ibm-cics", + 1436: "saism", + 1437: "tabula", + 1438: "eicon-server", + 1439: "eicon-x25", + 1440: "eicon-slp", + 1441: "cadis-1", + 1442: "cadis-2", + 1443: "ies-lm", + 1444: "marcam-lm", + 1445: "proxima-lm", + 1446: "ora-lm", + 1447: "apri-lm", + 1448: "oc-lm", + 1449: "peport", + 1450: "dwf", + 1451: "infoman", + 1452: "gtegsc-lm", + 1453: "genie-lm", + 1454: "interhdl-elmd", + 1455: "esl-lm", + 1456: "dca", + 1457: "valisys-lm", + 1458: "nrcabq-lm", + 1459: "proshare1", + 1460: "proshare2", + 1461: "ibm-wrless-lan", + 1462: "world-lm", + 1463: "nucleus", + 1464: "msl-lmd", + 1465: "pipes", + 1466: "oceansoft-lm", + 1467: "csdmbase", + 1468: "csdm", + 1469: "aal-lm", + 1470: "uaiact", + 1471: "csdmbase", + 1472: "csdm", + 1473: "openmath", + 1474: "telefinder", + 1475: "taligent-lm", + 1476: "clvm-cfg", + 1477: "ms-sna-server", + 1478: "ms-sna-base", + 1479: "dberegister", + 1480: "pacerforum", + 1481: "airs", + 1482: "miteksys-lm", + 1483: "afs", + 1484: "confluent", + 1485: "lansource", + 1486: "nms-topo-serv", + 1487: "localinfosrvr", + 1488: "docstor", + 1489: "dmdocbroker", + 1490: "insitu-conf", + 1492: "stone-design-1", + 1493: "netmap-lm", + 1494: "ica", + 1495: "cvc", + 1496: "liberty-lm", + 1497: "rfx-lm", + 1498: "sybase-sqlany", + 1499: "fhc", + 1500: "vlsi-lm", + 1501: "saiscm", + 1502: "shivadiscovery", + 1503: "imtc-mcs", + 1504: "evb-elm", + 1505: "funkproxy", + 1506: "utcd", + 1507: "symplex", + 1508: "diagmond", + 1509: "robcad-lm", + 1510: "mvx-lm", + 1511: "3l-l1", + 1512: "wins", + 1513: "fujitsu-dtc", + 1514: "fujitsu-dtcns", + 1515: "ifor-protocol", + 1516: "vpad", + 1517: "vpac", + 1518: "vpvd", + 1519: "vpvc", + 1520: "atm-zip-office", + 1521: "ncube-lm", + 1522: "ricardo-lm", + 1523: "cichild-lm", + 1524: "ingreslock", + 1525: "orasrv", + 1526: "pdap-np", + 1527: "tlisrv", + 1529: "coauthor", + 1530: "rap-service", + 1531: "rap-listen", + 1532: "miroconnect", + 1533: "virtual-places", + 1534: "micromuse-lm", + 1535: "ampr-info", + 1536: "ampr-inter", + 1537: "sdsc-lm", + 1538: "3ds-lm", + 1539: "intellistor-lm", + 1540: "rds", + 1541: "rds2", + 1542: "gridgen-elmd", + 1543: "simba-cs", + 1544: "aspeclmd", + 1545: "vistium-share", + 1546: "abbaccuray", + 1547: "laplink", + 1548: "axon-lm", + 1549: "shivahose", + 1550: "3m-image-lm", + 1551: "hecmtl-db", + 1552: "pciarray", + 1553: "sna-cs", + 1554: "caci-lm", + 1555: "livelan", + 1556: "veritas-pbx", + 1557: "arbortext-lm", + 1558: "xingmpeg", + 1559: "web2host", + 1560: "asci-val", + 1561: "facilityview", + 1562: "pconnectmgr", + 1563: "cadabra-lm", + 1564: "pay-per-view", + 1565: "winddlb", + 1566: "corelvideo", + 1567: "jlicelmd", + 1568: "tsspmap", + 1569: "ets", + 1570: "orbixd", + 1571: "rdb-dbs-disp", + 1572: "chip-lm", + 1573: "itscomm-ns", + 1574: "mvel-lm", + 1575: "oraclenames", + 1576: "moldflow-lm", + 1577: "hypercube-lm", + 1578: "jacobus-lm", + 1579: "ioc-sea-lm", + 1580: "tn-tl-r1", + 1581: "mil-2045-47001", + 1582: "msims", + 1583: "simbaexpress", + 1584: "tn-tl-fd2", + 1585: "intv", + 1586: "ibm-abtact", + 1587: "pra-elmd", + 1588: "triquest-lm", + 1589: "vqp", + 1590: "gemini-lm", + 1591: "ncpm-pm", + 1592: "commonspace", + 1593: "mainsoft-lm", + 1594: "sixtrak", + 1595: "radio", + 1596: "radio-sm", + 1597: "orbplus-iiop", + 1598: "picknfs", + 1599: "simbaservices", + 1600: "issd", + 1601: "aas", + 1602: "inspect", + 1603: "picodbc", + 1604: "icabrowser", + 1605: "slp", + 1606: "slm-api", + 1607: "stt", + 1608: "smart-lm", + 1609: "isysg-lm", + 1610: "taurus-wh", + 1611: "ill", + 1612: "netbill-trans", + 1613: "netbill-keyrep", + 1614: "netbill-cred", + 1615: "netbill-auth", + 1616: "netbill-prod", + 1617: "nimrod-agent", + 1618: "skytelnet", + 1619: "xs-openstorage", + 1620: "faxportwinport", + 1621: "softdataphone", + 1622: "ontime", + 1623: "jaleosnd", + 1624: "udp-sr-port", + 1625: "svs-omagent", + 1626: "shockwave", + 1627: "t128-gateway", + 1628: "lontalk-norm", + 1629: "lontalk-urgnt", + 1630: "oraclenet8cman", + 1631: "visitview", + 1632: "pammratc", + 1633: "pammrpc", + 1634: "loaprobe", + 1635: "edb-server1", + 1636: "isdc", + 1637: "islc", + 1638: "ismc", + 1639: "cert-initiator", + 1640: "cert-responder", + 1641: "invision", + 1642: "isis-am", + 1643: "isis-ambc", + 1644: "saiseh", + 1645: "sightline", + 1646: "sa-msg-port", + 1647: "rsap", + 1648: "concurrent-lm", + 1649: "kermit", + 1650: "nkd", + 1651: "shiva-confsrvr", + 1652: "xnmp", + 1653: "alphatech-lm", + 1654: "stargatealerts", + 1655: "dec-mbadmin", + 1656: "dec-mbadmin-h", + 1657: "fujitsu-mmpdc", + 1658: "sixnetudr", + 1659: "sg-lm", + 1660: "skip-mc-gikreq", + 1661: "netview-aix-1", + 1662: "netview-aix-2", + 1663: "netview-aix-3", + 1664: "netview-aix-4", + 1665: "netview-aix-5", + 1666: "netview-aix-6", + 1667: "netview-aix-7", + 1668: "netview-aix-8", + 1669: "netview-aix-9", + 1670: "netview-aix-10", + 1671: "netview-aix-11", + 1672: "netview-aix-12", + 1673: "proshare-mc-1", + 1674: "proshare-mc-2", + 1675: "pdp", + 1676: "netcomm1", + 1677: "groupwise", + 1678: "prolink", + 1679: "darcorp-lm", + 1680: "microcom-sbp", + 1681: "sd-elmd", + 1682: "lanyon-lantern", + 1683: "ncpm-hip", + 1684: "snaresecure", + 1685: "n2nremote", + 1686: "cvmon", + 1687: "nsjtp-ctrl", + 1688: "nsjtp-data", + 1689: "firefox", + 1690: "ng-umds", + 1691: "empire-empuma", + 1692: "sstsys-lm", + 1693: "rrirtr", + 1694: "rrimwm", + 1695: "rrilwm", + 1696: "rrifmm", + 1697: "rrisat", + 1698: "rsvp-encap-1", + 1699: "rsvp-encap-2", + 1700: "mps-raft", + 1701: "l2f", + 1702: "deskshare", + 1703: "hb-engine", + 1704: "bcs-broker", + 1705: "slingshot", + 1706: "jetform", + 1707: "vdmplay", + 1708: "gat-lmd", + 1709: "centra", + 1710: "impera", + 1711: "pptconference", + 1712: "registrar", + 1713: "conferencetalk", + 1714: "sesi-lm", + 1715: "houdini-lm", + 1716: "xmsg", + 1717: "fj-hdnet", + 1718: "h323gatedisc", + 1719: "h323gatestat", + 1720: "h323hostcall", + 1721: "caicci", + 1722: "hks-lm", + 1723: "pptp", + 1724: "csbphonemaster", + 1725: "iden-ralp", + 1726: "iberiagames", + 1727: "winddx", + 1728: "telindus", + 1729: "citynl", + 1730: "roketz", + 1731: "msiccp", + 1732: "proxim", + 1733: "siipat", + 1734: "cambertx-lm", + 1735: "privatechat", + 1736: "street-stream", + 1737: "ultimad", + 1738: "gamegen1", + 1739: "webaccess", + 1740: "encore", + 1741: "cisco-net-mgmt", + 1742: "3Com-nsd", + 1743: "cinegrfx-lm", + 1744: "ncpm-ft", + 1745: "remote-winsock", + 1746: "ftrapid-1", + 1747: "ftrapid-2", + 1748: "oracle-em1", + 1749: "aspen-services", + 1750: "sslp", + 1751: "swiftnet", + 1752: "lofr-lm", + 1753: "predatar-comms", + 1754: "oracle-em2", + 1755: "ms-streaming", + 1756: "capfast-lmd", + 1757: "cnhrp", + 1758: "tftp-mcast", + 1759: "spss-lm", + 1760: "www-ldap-gw", + 1761: "cft-0", + 1762: "cft-1", + 1763: "cft-2", + 1764: "cft-3", + 1765: "cft-4", + 1766: "cft-5", + 1767: "cft-6", + 1768: "cft-7", + 1769: "bmc-net-adm", + 1770: "bmc-net-svc", + 1771: "vaultbase", + 1772: "essweb-gw", + 1773: "kmscontrol", + 1774: "global-dtserv", + 1775: "vdab", + 1776: "femis", + 1777: "powerguardian", + 1778: "prodigy-intrnet", + 1779: "pharmasoft", + 1780: "dpkeyserv", + 1781: "answersoft-lm", + 1782: "hp-hcip", + 1784: "finle-lm", + 1785: "windlm", + 1786: "funk-logger", + 1787: "funk-license", + 1788: "psmond", + 1789: "hello", + 1790: "nmsp", + 1791: "ea1", + 1792: "ibm-dt-2", + 1793: "rsc-robot", + 1794: "cera-bcm", + 1795: "dpi-proxy", + 1796: "vocaltec-admin", + 1797: "uma", + 1798: "etp", + 1799: "netrisk", + 1800: "ansys-lm", + 1801: "msmq", + 1802: "concomp1", + 1803: "hp-hcip-gwy", + 1804: "enl", + 1805: "enl-name", + 1806: "musiconline", + 1807: "fhsp", + 1808: "oracle-vp2", + 1809: "oracle-vp1", + 1810: "jerand-lm", + 1811: "scientia-sdb", + 1812: "radius", + 1813: "radius-acct", + 1814: "tdp-suite", + 1815: "mmpft", + 1816: "harp", + 1817: "rkb-oscs", + 1818: "etftp", + 1819: "plato-lm", + 1820: "mcagent", + 1821: "donnyworld", + 1822: "es-elmd", + 1823: "unisys-lm", + 1824: "metrics-pas", + 1825: "direcpc-video", + 1826: "ardt", + 1827: "asi", + 1828: "itm-mcell-u", + 1829: "optika-emedia", + 1830: "net8-cman", + 1831: "myrtle", + 1832: "tht-treasure", + 1833: "udpradio", + 1834: "ardusuni", + 1835: "ardusmul", + 1836: "ste-smsc", + 1837: "csoft1", + 1838: "talnet", + 1839: "netopia-vo1", + 1840: "netopia-vo2", + 1841: "netopia-vo3", + 1842: "netopia-vo4", + 1843: "netopia-vo5", + 1844: "direcpc-dll", + 1845: "altalink", + 1846: "tunstall-pnc", + 1847: "slp-notify", + 1848: "fjdocdist", + 1849: "alpha-sms", + 1850: "gsi", + 1851: "ctcd", + 1852: "virtual-time", + 1853: "vids-avtp", + 1854: "buddy-draw", + 1855: "fiorano-rtrsvc", + 1856: "fiorano-msgsvc", + 1857: "datacaptor", + 1858: "privateark", + 1859: "gammafetchsvr", + 1860: "sunscalar-svc", + 1861: "lecroy-vicp", + 1862: "mysql-cm-agent", + 1863: "msnp", + 1864: "paradym-31port", + 1865: "entp", + 1866: "swrmi", + 1867: "udrive", + 1868: "viziblebrowser", + 1869: "transact", + 1870: "sunscalar-dns", + 1871: "canocentral0", + 1872: "canocentral1", + 1873: "fjmpjps", + 1874: "fjswapsnp", + 1875: "westell-stats", + 1876: "ewcappsrv", + 1877: "hp-webqosdb", + 1878: "drmsmc", + 1879: "nettgain-nms", + 1880: "vsat-control", + 1881: "ibm-mqseries2", + 1882: "ecsqdmn", + 1883: "mqtt", + 1884: "idmaps", + 1885: "vrtstrapserver", + 1886: "leoip", + 1887: "filex-lport", + 1888: "ncconfig", + 1889: "unify-adapter", + 1890: "wilkenlistener", + 1891: "childkey-notif", + 1892: "childkey-ctrl", + 1893: "elad", + 1894: "o2server-port", + 1896: "b-novative-ls", + 1897: "metaagent", + 1898: "cymtec-port", + 1899: "mc2studios", + 1900: "ssdp", + 1901: "fjicl-tep-a", + 1902: "fjicl-tep-b", + 1903: "linkname", + 1904: "fjicl-tep-c", + 1905: "sugp", + 1906: "tpmd", + 1907: "intrastar", + 1908: "dawn", + 1909: "global-wlink", + 1910: "ultrabac", + 1911: "mtp", + 1912: "rhp-iibp", + 1913: "armadp", + 1914: "elm-momentum", + 1915: "facelink", + 1916: "persona", + 1917: "noagent", + 1918: "can-nds", + 1919: "can-dch", + 1920: "can-ferret", + 1921: "noadmin", + 1922: "tapestry", + 1923: "spice", + 1924: "xiip", + 1925: "discovery-port", + 1926: "egs", + 1927: "videte-cipc", + 1928: "emsd-port", + 1929: "bandwiz-system", + 1930: "driveappserver", + 1931: "amdsched", + 1932: "ctt-broker", + 1933: "xmapi", + 1934: "xaapi", + 1935: "macromedia-fcs", + 1936: "jetcmeserver", + 1937: "jwserver", + 1938: "jwclient", + 1939: "jvserver", + 1940: "jvclient", + 1941: "dic-aida", + 1942: "res", + 1943: "beeyond-media", + 1944: "close-combat", + 1945: "dialogic-elmd", + 1946: "tekpls", + 1947: "sentinelsrm", + 1948: "eye2eye", + 1949: "ismaeasdaqlive", + 1950: "ismaeasdaqtest", + 1951: "bcs-lmserver", + 1952: "mpnjsc", + 1953: "rapidbase", + 1954: "abr-api", + 1955: "abr-secure", + 1956: "vrtl-vmf-ds", + 1957: "unix-status", + 1958: "dxadmind", + 1959: "simp-all", + 1960: "nasmanager", + 1961: "bts-appserver", + 1962: "biap-mp", + 1963: "webmachine", + 1964: "solid-e-engine", + 1965: "tivoli-npm", + 1966: "slush", + 1967: "sns-quote", + 1968: "lipsinc", + 1969: "lipsinc1", + 1970: "netop-rc", + 1971: "netop-school", + 1972: "intersys-cache", + 1973: "dlsrap", + 1974: "drp", + 1975: "tcoflashagent", + 1976: "tcoregagent", + 1977: "tcoaddressbook", + 1978: "unisql", + 1979: "unisql-java", + 1980: "pearldoc-xact", + 1981: "p2pq", + 1982: "estamp", + 1983: "lhtp", + 1984: "bb", + 1985: "hsrp", + 1986: "licensedaemon", + 1987: "tr-rsrb-p1", + 1988: "tr-rsrb-p2", + 1989: "tr-rsrb-p3", + 1990: "stun-p1", + 1991: "stun-p2", + 1992: "stun-p3", + 1993: "snmp-tcp-port", + 1994: "stun-port", + 1995: "perf-port", + 1996: "tr-rsrb-port", + 1997: "gdp-port", + 1998: "x25-svc-port", + 1999: "tcp-id-port", + 2000: "cisco-sccp", + 2001: "dc", + 2002: "globe", + 2003: "brutus", + 2004: "mailbox", + 2005: "berknet", + 2006: "invokator", + 2007: "dectalk", + 2008: "conf", + 2009: "news", + 2010: "search", + 2011: "raid-cc", + 2012: "ttyinfo", + 2013: "raid-am", + 2014: "troff", + 2015: "cypress", + 2016: "bootserver", + 2017: "cypress-stat", + 2018: "terminaldb", + 2019: "whosockami", + 2020: "xinupageserver", + 2021: "servexec", + 2022: "down", + 2023: "xinuexpansion3", + 2024: "xinuexpansion4", + 2025: "ellpack", + 2026: "scrabble", + 2027: "shadowserver", + 2028: "submitserver", + 2029: "hsrpv6", + 2030: "device2", + 2031: "mobrien-chat", + 2032: "blackboard", + 2033: "glogger", + 2034: "scoremgr", + 2035: "imsldoc", + 2036: "e-dpnet", + 2037: "applus", + 2038: "objectmanager", + 2039: "prizma", + 2040: "lam", + 2041: "interbase", + 2042: "isis", + 2043: "isis-bcast", + 2044: "rimsl", + 2045: "cdfunc", + 2046: "sdfunc", + 2047: "dls", + 2048: "dls-monitor", + 2049: "shilp", + 2050: "av-emb-config", + 2051: "epnsdp", + 2052: "clearvisn", + 2053: "lot105-ds-upd", + 2054: "weblogin", + 2055: "iop", + 2056: "omnisky", + 2057: "rich-cp", + 2058: "newwavesearch", + 2059: "bmc-messaging", + 2060: "teleniumdaemon", + 2061: "netmount", + 2062: "icg-swp", + 2063: "icg-bridge", + 2064: "icg-iprelay", + 2065: "dlsrpn", + 2066: "aura", + 2067: "dlswpn", + 2068: "avauthsrvprtcl", + 2069: "event-port", + 2070: "ah-esp-encap", + 2071: "acp-port", + 2072: "msync", + 2073: "gxs-data-port", + 2074: "vrtl-vmf-sa", + 2075: "newlixengine", + 2076: "newlixconfig", + 2077: "tsrmagt", + 2078: "tpcsrvr", + 2079: "idware-router", + 2080: "autodesk-nlm", + 2081: "kme-trap-port", + 2082: "infowave", + 2083: "radsec", + 2084: "sunclustergeo", + 2085: "ada-cip", + 2086: "gnunet", + 2087: "eli", + 2088: "ip-blf", + 2089: "sep", + 2090: "lrp", + 2091: "prp", + 2092: "descent3", + 2093: "nbx-cc", + 2094: "nbx-au", + 2095: "nbx-ser", + 2096: "nbx-dir", + 2097: "jetformpreview", + 2098: "dialog-port", + 2099: "h2250-annex-g", + 2100: "amiganetfs", + 2101: "rtcm-sc104", + 2102: "zephyr-srv", + 2103: "zephyr-clt", + 2104: "zephyr-hm", + 2105: "minipay", + 2106: "mzap", + 2107: "bintec-admin", + 2108: "comcam", + 2109: "ergolight", + 2110: "umsp", + 2111: "dsatp", + 2112: "idonix-metanet", + 2113: "hsl-storm", + 2114: "newheights", + 2115: "kdm", + 2116: "ccowcmr", + 2117: "mentaclient", + 2118: "mentaserver", + 2119: "gsigatekeeper", + 2120: "qencp", + 2121: "scientia-ssdb", + 2122: "caupc-remote", + 2123: "gtp-control", + 2124: "elatelink", + 2125: "lockstep", + 2126: "pktcable-cops", + 2127: "index-pc-wb", + 2128: "net-steward", + 2129: "cs-live", + 2130: "xds", + 2131: "avantageb2b", + 2132: "solera-epmap", + 2133: "zymed-zpp", + 2134: "avenue", + 2135: "gris", + 2136: "appworxsrv", + 2137: "connect", + 2138: "unbind-cluster", + 2139: "ias-auth", + 2140: "ias-reg", + 2141: "ias-admind", + 2142: "tdmoip", + 2143: "lv-jc", + 2144: "lv-ffx", + 2145: "lv-pici", + 2146: "lv-not", + 2147: "lv-auth", + 2148: "veritas-ucl", + 2149: "acptsys", + 2150: "dynamic3d", + 2151: "docent", + 2152: "gtp-user", + 2153: "ctlptc", + 2154: "stdptc", + 2155: "brdptc", + 2156: "trp", + 2157: "xnds", + 2158: "touchnetplus", + 2159: "gdbremote", + 2160: "apc-2160", + 2161: "apc-2161", + 2162: "navisphere", + 2163: "navisphere-sec", + 2164: "ddns-v3", + 2165: "x-bone-api", + 2166: "iwserver", + 2167: "raw-serial", + 2168: "easy-soft-mux", + 2169: "brain", + 2170: "eyetv", + 2171: "msfw-storage", + 2172: "msfw-s-storage", + 2173: "msfw-replica", + 2174: "msfw-array", + 2175: "airsync", + 2176: "rapi", + 2177: "qwave", + 2178: "bitspeer", + 2179: "vmrdp", + 2180: "mc-gt-srv", + 2181: "eforward", + 2182: "cgn-stat", + 2183: "cgn-config", + 2184: "nvd", + 2185: "onbase-dds", + 2186: "gtaua", + 2187: "ssmc", + 2188: "radware-rpm", + 2189: "radware-rpm-s", + 2190: "tivoconnect", + 2191: "tvbus", + 2192: "asdis", + 2193: "drwcs", + 2197: "mnp-exchange", + 2198: "onehome-remote", + 2199: "onehome-help", + 2200: "ici", + 2201: "ats", + 2202: "imtc-map", + 2203: "b2-runtime", + 2204: "b2-license", + 2205: "jps", + 2206: "hpocbus", + 2207: "hpssd", + 2208: "hpiod", + 2209: "rimf-ps", + 2210: "noaaport", + 2211: "emwin", + 2212: "leecoposserver", + 2213: "kali", + 2214: "rpi", + 2215: "ipcore", + 2216: "vtu-comms", + 2217: "gotodevice", + 2218: "bounzza", + 2219: "netiq-ncap", + 2220: "netiq", + 2221: "ethernet-ip-s", + 2222: "EtherNet-IP-1", + 2223: "rockwell-csp2", + 2224: "efi-mg", + 2225: "rcip-itu", + 2226: "di-drm", + 2227: "di-msg", + 2228: "ehome-ms", + 2229: "datalens", + 2230: "queueadm", + 2231: "wimaxasncp", + 2232: "ivs-video", + 2233: "infocrypt", + 2234: "directplay", + 2235: "sercomm-wlink", + 2236: "nani", + 2237: "optech-port1-lm", + 2238: "aviva-sna", + 2239: "imagequery", + 2240: "recipe", + 2241: "ivsd", + 2242: "foliocorp", + 2243: "magicom", + 2244: "nmsserver", + 2245: "hao", + 2246: "pc-mta-addrmap", + 2247: "antidotemgrsvr", + 2248: "ums", + 2249: "rfmp", + 2250: "remote-collab", + 2251: "dif-port", + 2252: "njenet-ssl", + 2253: "dtv-chan-req", + 2254: "seispoc", + 2255: "vrtp", + 2256: "pcc-mfp", + 2257: "simple-tx-rx", + 2258: "rcts", + 2260: "apc-2260", + 2261: "comotionmaster", + 2262: "comotionback", + 2263: "ecwcfg", + 2264: "apx500api-1", + 2265: "apx500api-2", + 2266: "mfserver", + 2267: "ontobroker", + 2268: "amt", + 2269: "mikey", + 2270: "starschool", + 2271: "mmcals", + 2272: "mmcal", + 2273: "mysql-im", + 2274: "pcttunnell", + 2275: "ibridge-data", + 2276: "ibridge-mgmt", + 2277: "bluectrlproxy", + 2278: "s3db", + 2279: "xmquery", + 2280: "lnvpoller", + 2281: "lnvconsole", + 2282: "lnvalarm", + 2283: "lnvstatus", + 2284: "lnvmaps", + 2285: "lnvmailmon", + 2286: "nas-metering", + 2287: "dna", + 2288: "netml", + 2289: "dict-lookup", + 2290: "sonus-logging", + 2291: "eapsp", + 2292: "mib-streaming", + 2293: "npdbgmngr", + 2294: "konshus-lm", + 2295: "advant-lm", + 2296: "theta-lm", + 2297: "d2k-datamover1", + 2298: "d2k-datamover2", + 2299: "pc-telecommute", + 2300: "cvmmon", + 2301: "cpq-wbem", + 2302: "binderysupport", + 2303: "proxy-gateway", + 2304: "attachmate-uts", + 2305: "mt-scaleserver", + 2306: "tappi-boxnet", + 2307: "pehelp", + 2308: "sdhelp", + 2309: "sdserver", + 2310: "sdclient", + 2311: "messageservice", + 2312: "wanscaler", + 2313: "iapp", + 2314: "cr-websystems", + 2315: "precise-sft", + 2316: "sent-lm", + 2317: "attachmate-g32", + 2318: "cadencecontrol", + 2319: "infolibria", + 2320: "siebel-ns", + 2321: "rdlap", + 2322: "ofsd", + 2323: "3d-nfsd", + 2324: "cosmocall", + 2325: "ansysli", + 2326: "idcp", + 2327: "xingcsm", + 2328: "netrix-sftm", + 2329: "nvd", + 2330: "tscchat", + 2331: "agentview", + 2332: "rcc-host", + 2333: "snapp", + 2334: "ace-client", + 2335: "ace-proxy", + 2336: "appleugcontrol", + 2337: "ideesrv", + 2338: "norton-lambert", + 2339: "3com-webview", + 2340: "wrs-registry", + 2341: "xiostatus", + 2342: "manage-exec", + 2343: "nati-logos", + 2344: "fcmsys", + 2345: "dbm", + 2346: "redstorm-join", + 2347: "redstorm-find", + 2348: "redstorm-info", + 2349: "redstorm-diag", + 2350: "psbserver", + 2351: "psrserver", + 2352: "pslserver", + 2353: "pspserver", + 2354: "psprserver", + 2355: "psdbserver", + 2356: "gxtelmd", + 2357: "unihub-server", + 2358: "futrix", + 2359: "flukeserver", + 2360: "nexstorindltd", + 2361: "tl1", + 2362: "digiman", + 2363: "mediacntrlnfsd", + 2364: "oi-2000", + 2365: "dbref", + 2366: "qip-login", + 2367: "service-ctrl", + 2368: "opentable", + 2370: "l3-hbmon", + 2371: "hp-rda", + 2372: "lanmessenger", + 2373: "remographlm", + 2374: "hydra", + 2375: "docker", + 2376: "docker-s", + 2377: "swarm", + 2379: "etcd-client", + 2380: "etcd-server", + 2381: "compaq-https", + 2382: "ms-olap3", + 2383: "ms-olap4", + 2384: "sd-request", + 2385: "sd-data", + 2386: "virtualtape", + 2387: "vsamredirector", + 2388: "mynahautostart", + 2389: "ovsessionmgr", + 2390: "rsmtp", + 2391: "3com-net-mgmt", + 2392: "tacticalauth", + 2393: "ms-olap1", + 2394: "ms-olap2", + 2395: "lan900-remote", + 2396: "wusage", + 2397: "ncl", + 2398: "orbiter", + 2399: "fmpro-fdal", + 2400: "opequus-server", + 2401: "cvspserver", + 2402: "taskmaster2000", + 2403: "taskmaster2000", + 2404: "iec-104", + 2405: "trc-netpoll", + 2406: "jediserver", + 2407: "orion", + 2408: "railgun-webaccl", + 2409: "sns-protocol", + 2410: "vrts-registry", + 2411: "netwave-ap-mgmt", + 2412: "cdn", + 2413: "orion-rmi-reg", + 2414: "beeyond", + 2415: "codima-rtp", + 2416: "rmtserver", + 2417: "composit-server", + 2418: "cas", + 2419: "attachmate-s2s", + 2420: "dslremote-mgmt", + 2421: "g-talk", + 2422: "crmsbits", + 2423: "rnrp", + 2424: "kofax-svr", + 2425: "fjitsuappmgr", + 2426: "vcmp", + 2427: "mgcp-gateway", + 2428: "ott", + 2429: "ft-role", + 2430: "venus", + 2431: "venus-se", + 2432: "codasrv", + 2433: "codasrv-se", + 2434: "pxc-epmap", + 2435: "optilogic", + 2436: "topx", + 2437: "unicontrol", + 2438: "msp", + 2439: "sybasedbsynch", + 2440: "spearway", + 2441: "pvsw-inet", + 2442: "netangel", + 2443: "powerclientcsf", + 2444: "btpp2sectrans", + 2445: "dtn1", + 2446: "bues-service", + 2447: "ovwdb", + 2448: "hpppssvr", + 2449: "ratl", + 2450: "netadmin", + 2451: "netchat", + 2452: "snifferclient", + 2453: "madge-ltd", + 2454: "indx-dds", + 2455: "wago-io-system", + 2456: "altav-remmgt", + 2457: "rapido-ip", + 2458: "griffin", + 2459: "community", + 2460: "ms-theater", + 2461: "qadmifoper", + 2462: "qadmifevent", + 2463: "lsi-raid-mgmt", + 2464: "direcpc-si", + 2465: "lbm", + 2466: "lbf", + 2467: "high-criteria", + 2468: "qip-msgd", + 2469: "mti-tcs-comm", + 2470: "taskman-port", + 2471: "seaodbc", + 2472: "c3", + 2473: "aker-cdp", + 2474: "vitalanalysis", + 2475: "ace-server", + 2476: "ace-svr-prop", + 2477: "ssm-cvs", + 2478: "ssm-cssps", + 2479: "ssm-els", + 2480: "powerexchange", + 2481: "giop", + 2482: "giop-ssl", + 2483: "ttc", + 2484: "ttc-ssl", + 2485: "netobjects1", + 2486: "netobjects2", + 2487: "pns", + 2488: "moy-corp", + 2489: "tsilb", + 2490: "qip-qdhcp", + 2491: "conclave-cpp", + 2492: "groove", + 2493: "talarian-mqs", + 2494: "bmc-ar", + 2495: "fast-rem-serv", + 2496: "dirgis", + 2497: "quaddb", + 2498: "odn-castraq", + 2499: "unicontrol", + 2500: "rtsserv", + 2501: "rtsclient", + 2502: "kentrox-prot", + 2503: "nms-dpnss", + 2504: "wlbs", + 2505: "ppcontrol", + 2506: "jbroker", + 2507: "spock", + 2508: "jdatastore", + 2509: "fjmpss", + 2510: "fjappmgrbulk", + 2511: "metastorm", + 2512: "citrixima", + 2513: "citrixadmin", + 2514: "facsys-ntp", + 2515: "facsys-router", + 2516: "maincontrol", + 2517: "call-sig-trans", + 2518: "willy", + 2519: "globmsgsvc", + 2520: "pvsw", + 2521: "adaptecmgr", + 2522: "windb", + 2523: "qke-llc-v3", + 2524: "optiwave-lm", + 2525: "ms-v-worlds", + 2526: "ema-sent-lm", + 2527: "iqserver", + 2528: "ncr-ccl", + 2529: "utsftp", + 2530: "vrcommerce", + 2531: "ito-e-gui", + 2532: "ovtopmd", + 2533: "snifferserver", + 2534: "combox-web-acc", + 2535: "madcap", + 2536: "btpp2audctr1", + 2537: "upgrade", + 2538: "vnwk-prapi", + 2539: "vsiadmin", + 2540: "lonworks", + 2541: "lonworks2", + 2542: "udrawgraph", + 2543: "reftek", + 2544: "novell-zen", + 2545: "sis-emt", + 2546: "vytalvaultbrtp", + 2547: "vytalvaultvsmp", + 2548: "vytalvaultpipe", + 2549: "ipass", + 2550: "ads", + 2551: "isg-uda-server", + 2552: "call-logging", + 2553: "efidiningport", + 2554: "vcnet-link-v10", + 2555: "compaq-wcp", + 2556: "nicetec-nmsvc", + 2557: "nicetec-mgmt", + 2558: "pclemultimedia", + 2559: "lstp", + 2560: "labrat", + 2561: "mosaixcc", + 2562: "delibo", + 2563: "cti-redwood", + 2564: "hp-3000-telnet", + 2565: "coord-svr", + 2566: "pcs-pcw", + 2567: "clp", + 2568: "spamtrap", + 2569: "sonuscallsig", + 2570: "hs-port", + 2571: "cecsvc", + 2572: "ibp", + 2573: "trustestablish", + 2574: "blockade-bpsp", + 2575: "hl7", + 2576: "tclprodebugger", + 2577: "scipticslsrvr", + 2578: "rvs-isdn-dcp", + 2579: "mpfoncl", + 2580: "tributary", + 2581: "argis-te", + 2582: "argis-ds", + 2583: "mon", + 2584: "cyaserv", + 2585: "netx-server", + 2586: "netx-agent", + 2587: "masc", + 2588: "privilege", + 2589: "quartus-tcl", + 2590: "idotdist", + 2591: "maytagshuffle", + 2592: "netrek", + 2593: "mns-mail", + 2594: "dts", + 2595: "worldfusion1", + 2596: "worldfusion2", + 2597: "homesteadglory", + 2598: "citriximaclient", + 2599: "snapd", + 2600: "hpstgmgr", + 2601: "discp-client", + 2602: "discp-server", + 2603: "servicemeter", + 2604: "nsc-ccs", + 2605: "nsc-posa", + 2606: "netmon", + 2607: "connection", + 2608: "wag-service", + 2609: "system-monitor", + 2610: "versa-tek", + 2611: "lionhead", + 2612: "qpasa-agent", + 2613: "smntubootstrap", + 2614: "neveroffline", + 2615: "firepower", + 2616: "appswitch-emp", + 2617: "cmadmin", + 2618: "priority-e-com", + 2619: "bruce", + 2620: "lpsrecommender", + 2621: "miles-apart", + 2622: "metricadbc", + 2623: "lmdp", + 2624: "aria", + 2625: "blwnkl-port", + 2626: "gbjd816", + 2627: "moshebeeri", + 2628: "dict", + 2629: "sitaraserver", + 2630: "sitaramgmt", + 2631: "sitaradir", + 2632: "irdg-post", + 2633: "interintelli", + 2634: "pk-electronics", + 2635: "backburner", + 2636: "solve", + 2637: "imdocsvc", + 2638: "sybaseanywhere", + 2639: "aminet", + 2640: "ami-control", + 2641: "hdl-srv", + 2642: "tragic", + 2643: "gte-samp", + 2644: "travsoft-ipx-t", + 2645: "novell-ipx-cmd", + 2646: "and-lm", + 2647: "syncserver", + 2648: "upsnotifyprot", + 2649: "vpsipport", + 2650: "eristwoguns", + 2651: "ebinsite", + 2652: "interpathpanel", + 2653: "sonus", + 2654: "corel-vncadmin", + 2655: "unglue", + 2656: "kana", + 2657: "sns-dispatcher", + 2658: "sns-admin", + 2659: "sns-query", + 2660: "gcmonitor", + 2661: "olhost", + 2662: "bintec-capi", + 2663: "bintec-tapi", + 2664: "patrol-mq-gm", + 2665: "patrol-mq-nm", + 2666: "extensis", + 2667: "alarm-clock-s", + 2668: "alarm-clock-c", + 2669: "toad", + 2670: "tve-announce", + 2671: "newlixreg", + 2672: "nhserver", + 2673: "firstcall42", + 2674: "ewnn", + 2675: "ttc-etap", + 2676: "simslink", + 2677: "gadgetgate1way", + 2678: "gadgetgate2way", + 2679: "syncserverssl", + 2680: "pxc-sapxom", + 2681: "mpnjsomb", + 2683: "ncdloadbalance", + 2684: "mpnjsosv", + 2685: "mpnjsocl", + 2686: "mpnjsomg", + 2687: "pq-lic-mgmt", + 2688: "md-cg-http", + 2689: "fastlynx", + 2690: "hp-nnm-data", + 2691: "itinternet", + 2692: "admins-lms", + 2694: "pwrsevent", + 2695: "vspread", + 2696: "unifyadmin", + 2697: "oce-snmp-trap", + 2698: "mck-ivpip", + 2699: "csoft-plusclnt", + 2700: "tqdata", + 2701: "sms-rcinfo", + 2702: "sms-xfer", + 2703: "sms-chat", + 2704: "sms-remctrl", + 2705: "sds-admin", + 2706: "ncdmirroring", + 2707: "emcsymapiport", + 2708: "banyan-net", + 2709: "supermon", + 2710: "sso-service", + 2711: "sso-control", + 2712: "aocp", + 2713: "raventbs", + 2714: "raventdm", + 2715: "hpstgmgr2", + 2716: "inova-ip-disco", + 2717: "pn-requester", + 2718: "pn-requester2", + 2719: "scan-change", + 2720: "wkars", + 2721: "smart-diagnose", + 2722: "proactivesrvr", + 2723: "watchdog-nt", + 2724: "qotps", + 2725: "msolap-ptp2", + 2726: "tams", + 2727: "mgcp-callagent", + 2728: "sqdr", + 2729: "tcim-control", + 2730: "nec-raidplus", + 2731: "fyre-messanger", + 2732: "g5m", + 2733: "signet-ctf", + 2734: "ccs-software", + 2735: "netiq-mc", + 2736: "radwiz-nms-srv", + 2737: "srp-feedback", + 2738: "ndl-tcp-ois-gw", + 2739: "tn-timing", + 2740: "alarm", + 2741: "tsb", + 2742: "tsb2", + 2743: "murx", + 2744: "honyaku", + 2745: "urbisnet", + 2746: "cpudpencap", + 2747: "fjippol-swrly", + 2748: "fjippol-polsvr", + 2749: "fjippol-cnsl", + 2750: "fjippol-port1", + 2751: "fjippol-port2", + 2752: "rsisysaccess", + 2753: "de-spot", + 2754: "apollo-cc", + 2755: "expresspay", + 2756: "simplement-tie", + 2757: "cnrp", + 2758: "apollo-status", + 2759: "apollo-gms", + 2760: "sabams", + 2761: "dicom-iscl", + 2762: "dicom-tls", + 2763: "desktop-dna", + 2764: "data-insurance", + 2765: "qip-audup", + 2766: "compaq-scp", + 2767: "uadtc", + 2768: "uacs", + 2769: "exce", + 2770: "veronica", + 2771: "vergencecm", + 2772: "auris", + 2773: "rbakcup1", + 2774: "rbakcup2", + 2775: "smpp", + 2776: "ridgeway1", + 2777: "ridgeway2", + 2778: "gwen-sonya", + 2779: "lbc-sync", + 2780: "lbc-control", + 2781: "whosells", + 2782: "everydayrc", + 2783: "aises", + 2784: "www-dev", + 2785: "aic-np", + 2786: "aic-oncrpc", + 2787: "piccolo", + 2788: "fryeserv", + 2789: "media-agent", + 2790: "plgproxy", + 2791: "mtport-regist", + 2792: "f5-globalsite", + 2793: "initlsmsad", + 2795: "livestats", + 2796: "ac-tech", + 2797: "esp-encap", + 2798: "tmesis-upshot", + 2799: "icon-discover", + 2800: "acc-raid", + 2801: "igcp", + 2802: "veritas-tcp1", + 2803: "btprjctrl", + 2804: "dvr-esm", + 2805: "wta-wsp-s", + 2806: "cspuni", + 2807: "cspmulti", + 2808: "j-lan-p", + 2809: "corbaloc", + 2810: "netsteward", + 2811: "gsiftp", + 2812: "atmtcp", + 2813: "llm-pass", + 2814: "llm-csv", + 2815: "lbc-measure", + 2816: "lbc-watchdog", + 2817: "nmsigport", + 2818: "rmlnk", + 2819: "fc-faultnotify", + 2820: "univision", + 2821: "vrts-at-port", + 2822: "ka0wuc", + 2823: "cqg-netlan", + 2824: "cqg-netlan-1", + 2826: "slc-systemlog", + 2827: "slc-ctrlrloops", + 2828: "itm-lm", + 2829: "silkp1", + 2830: "silkp2", + 2831: "silkp3", + 2832: "silkp4", + 2833: "glishd", + 2834: "evtp", + 2835: "evtp-data", + 2836: "catalyst", + 2837: "repliweb", + 2838: "starbot", + 2839: "nmsigport", + 2840: "l3-exprt", + 2841: "l3-ranger", + 2842: "l3-hawk", + 2843: "pdnet", + 2844: "bpcp-poll", + 2845: "bpcp-trap", + 2846: "aimpp-hello", + 2847: "aimpp-port-req", + 2848: "amt-blc-port", + 2849: "fxp", + 2850: "metaconsole", + 2851: "webemshttp", + 2852: "bears-01", + 2853: "ispipes", + 2854: "infomover", + 2855: "msrp", + 2856: "cesdinv", + 2857: "simctlp", + 2858: "ecnp", + 2859: "activememory", + 2860: "dialpad-voice1", + 2861: "dialpad-voice2", + 2862: "ttg-protocol", + 2863: "sonardata", + 2864: "astromed-main", + 2865: "pit-vpn", + 2866: "iwlistener", + 2867: "esps-portal", + 2868: "npep-messaging", + 2869: "icslap", + 2870: "daishi", + 2871: "msi-selectplay", + 2872: "radix", + 2874: "dxmessagebase1", + 2875: "dxmessagebase2", + 2876: "sps-tunnel", + 2877: "bluelance", + 2878: "aap", + 2879: "ucentric-ds", + 2880: "synapse", + 2881: "ndsp", + 2882: "ndtp", + 2883: "ndnp", + 2884: "flashmsg", + 2885: "topflow", + 2886: "responselogic", + 2887: "aironetddp", + 2888: "spcsdlobby", + 2889: "rsom", + 2890: "cspclmulti", + 2891: "cinegrfx-elmd", + 2892: "snifferdata", + 2893: "vseconnector", + 2894: "abacus-remote", + 2895: "natuslink", + 2896: "ecovisiong6-1", + 2897: "citrix-rtmp", + 2898: "appliance-cfg", + 2899: "powergemplus", + 2900: "quicksuite", + 2901: "allstorcns", + 2902: "netaspi", + 2903: "suitcase", + 2904: "m2ua", + 2905: "m3ua", + 2906: "caller9", + 2907: "webmethods-b2b", + 2908: "mao", + 2909: "funk-dialout", + 2910: "tdaccess", + 2911: "blockade", + 2912: "epicon", + 2913: "boosterware", + 2914: "gamelobby", + 2915: "tksocket", + 2916: "elvin-server", + 2917: "elvin-client", + 2918: "kastenchasepad", + 2919: "roboer", + 2920: "roboeda", + 2921: "cesdcdman", + 2922: "cesdcdtrn", + 2923: "wta-wsp-wtp-s", + 2924: "precise-vip", + 2926: "mobile-file-dl", + 2927: "unimobilectrl", + 2928: "redstone-cpss", + 2929: "amx-webadmin", + 2930: "amx-weblinx", + 2931: "circle-x", + 2932: "incp", + 2933: "4-tieropmgw", + 2934: "4-tieropmcli", + 2935: "qtp", + 2936: "otpatch", + 2937: "pnaconsult-lm", + 2938: "sm-pas-1", + 2939: "sm-pas-2", + 2940: "sm-pas-3", + 2941: "sm-pas-4", + 2942: "sm-pas-5", + 2943: "ttnrepository", + 2944: "megaco-h248", + 2945: "h248-binary", + 2946: "fjsvmpor", + 2947: "gpsd", + 2948: "wap-push", + 2949: "wap-pushsecure", + 2950: "esip", + 2951: "ottp", + 2952: "mpfwsas", + 2953: "ovalarmsrv", + 2954: "ovalarmsrv-cmd", + 2955: "csnotify", + 2956: "ovrimosdbman", + 2957: "jmact5", + 2958: "jmact6", + 2959: "rmopagt", + 2960: "dfoxserver", + 2961: "boldsoft-lm", + 2962: "iph-policy-cli", + 2963: "iph-policy-adm", + 2964: "bullant-srap", + 2965: "bullant-rap", + 2966: "idp-infotrieve", + 2967: "ssc-agent", + 2968: "enpp", + 2969: "essp", + 2970: "index-net", + 2971: "netclip", + 2972: "pmsm-webrctl", + 2973: "svnetworks", + 2974: "signal", + 2975: "fjmpcm", + 2976: "cns-srv-port", + 2977: "ttc-etap-ns", + 2978: "ttc-etap-ds", + 2979: "h263-video", + 2980: "wimd", + 2981: "mylxamport", + 2982: "iwb-whiteboard", + 2983: "netplan", + 2984: "hpidsadmin", + 2985: "hpidsagent", + 2986: "stonefalls", + 2987: "identify", + 2988: "hippad", + 2989: "zarkov", + 2990: "boscap", + 2991: "wkstn-mon", + 2992: "avenyo", + 2993: "veritas-vis1", + 2994: "veritas-vis2", + 2995: "idrs", + 2996: "vsixml", + 2997: "rebol", + 2998: "realsecure", + 2999: "remoteware-un", + 3000: "hbci", + 3001: "origo-native", + 3002: "exlm-agent", + 3003: "cgms", + 3004: "csoftragent", + 3005: "geniuslm", + 3006: "ii-admin", + 3007: "lotusmtap", + 3008: "midnight-tech", + 3009: "pxc-ntfy", + 3010: "gw", + 3011: "trusted-web", + 3012: "twsdss", + 3013: "gilatskysurfer", + 3014: "broker-service", + 3015: "nati-dstp", + 3016: "notify-srvr", + 3017: "event-listener", + 3018: "srvc-registry", + 3019: "resource-mgr", + 3020: "cifs", + 3021: "agriserver", + 3022: "csregagent", + 3023: "magicnotes", + 3024: "nds-sso", + 3025: "arepa-raft", + 3026: "agri-gateway", + 3027: "LiebDevMgmt-C", + 3028: "LiebDevMgmt-DM", + 3029: "LiebDevMgmt-A", + 3030: "arepa-cas", + 3031: "eppc", + 3032: "redwood-chat", + 3033: "pdb", + 3034: "osmosis-aeea", + 3035: "fjsv-gssagt", + 3036: "hagel-dump", + 3037: "hp-san-mgmt", + 3038: "santak-ups", + 3039: "cogitate", + 3040: "tomato-springs", + 3041: "di-traceware", + 3042: "journee", + 3043: "brp", + 3044: "epp", + 3045: "responsenet", + 3046: "di-ase", + 3047: "hlserver", + 3048: "pctrader", + 3049: "nsws", + 3050: "gds-db", + 3051: "galaxy-server", + 3052: "apc-3052", + 3053: "dsom-server", + 3054: "amt-cnf-prot", + 3055: "policyserver", + 3056: "cdl-server", + 3057: "goahead-fldup", + 3058: "videobeans", + 3059: "qsoft", + 3060: "interserver", + 3061: "cautcpd", + 3062: "ncacn-ip-tcp", + 3063: "ncadg-ip-udp", + 3064: "rprt", + 3065: "slinterbase", + 3066: "netattachsdmp", + 3067: "fjhpjp", + 3068: "ls3bcast", + 3069: "ls3", + 3070: "mgxswitch", + 3071: "xplat-replicate", + 3072: "csd-monitor", + 3073: "vcrp", + 3074: "xbox", + 3075: "orbix-locator", + 3076: "orbix-config", + 3077: "orbix-loc-ssl", + 3078: "orbix-cfg-ssl", + 3079: "lv-frontpanel", + 3080: "stm-pproc", + 3081: "tl1-lv", + 3082: "tl1-raw", + 3083: "tl1-telnet", + 3084: "itm-mccs", + 3085: "pcihreq", + 3086: "jdl-dbkitchen", + 3087: "asoki-sma", + 3088: "xdtp", + 3089: "ptk-alink", + 3090: "stss", + 3091: "1ci-smcs", + 3093: "rapidmq-center", + 3094: "rapidmq-reg", + 3095: "panasas", + 3096: "ndl-aps", + 3098: "umm-port", + 3099: "chmd", + 3100: "opcon-xps", + 3101: "hp-pxpib", + 3102: "slslavemon", + 3103: "autocuesmi", + 3104: "autocuelog", + 3105: "cardbox", + 3106: "cardbox-http", + 3107: "business", + 3108: "geolocate", + 3109: "personnel", + 3110: "sim-control", + 3111: "wsynch", + 3112: "ksysguard", + 3113: "cs-auth-svr", + 3114: "ccmad", + 3115: "mctet-master", + 3116: "mctet-gateway", + 3117: "mctet-jserv", + 3118: "pkagent", + 3119: "d2000kernel", + 3120: "d2000webserver", + 3121: "pcmk-remote", + 3122: "vtr-emulator", + 3123: "edix", + 3124: "beacon-port", + 3125: "a13-an", + 3127: "ctx-bridge", + 3128: "ndl-aas", + 3129: "netport-id", + 3130: "icpv2", + 3131: "netbookmark", + 3132: "ms-rule-engine", + 3133: "prism-deploy", + 3134: "ecp", + 3135: "peerbook-port", + 3136: "grubd", + 3137: "rtnt-1", + 3138: "rtnt-2", + 3139: "incognitorv", + 3140: "ariliamulti", + 3141: "vmodem", + 3142: "rdc-wh-eos", + 3143: "seaview", + 3144: "tarantella", + 3145: "csi-lfap", + 3146: "bears-02", + 3147: "rfio", + 3148: "nm-game-admin", + 3149: "nm-game-server", + 3150: "nm-asses-admin", + 3151: "nm-assessor", + 3152: "feitianrockey", + 3153: "s8-client-port", + 3154: "ccmrmi", + 3155: "jpegmpeg", + 3156: "indura", + 3157: "e3consultants", + 3158: "stvp", + 3159: "navegaweb-port", + 3160: "tip-app-server", + 3161: "doc1lm", + 3162: "sflm", + 3163: "res-sap", + 3164: "imprs", + 3165: "newgenpay", + 3166: "sossecollector", + 3167: "nowcontact", + 3168: "poweronnud", + 3169: "serverview-as", + 3170: "serverview-asn", + 3171: "serverview-gf", + 3172: "serverview-rm", + 3173: "serverview-icc", + 3174: "armi-server", + 3175: "t1-e1-over-ip", + 3176: "ars-master", + 3177: "phonex-port", + 3178: "radclientport", + 3179: "h2gf-w-2m", + 3180: "mc-brk-srv", + 3181: "bmcpatrolagent", + 3182: "bmcpatrolrnvu", + 3183: "cops-tls", + 3184: "apogeex-port", + 3185: "smpppd", + 3186: "iiw-port", + 3187: "odi-port", + 3188: "brcm-comm-port", + 3189: "pcle-infex", + 3190: "csvr-proxy", + 3191: "csvr-sslproxy", + 3192: "firemonrcc", + 3193: "spandataport", + 3194: "magbind", + 3195: "ncu-1", + 3196: "ncu-2", + 3197: "embrace-dp-s", + 3198: "embrace-dp-c", + 3199: "dmod-workspace", + 3200: "tick-port", + 3201: "cpq-tasksmart", + 3202: "intraintra", + 3203: "netwatcher-mon", + 3204: "netwatcher-db", + 3205: "isns", + 3206: "ironmail", + 3207: "vx-auth-port", + 3208: "pfu-prcallback", + 3209: "netwkpathengine", + 3210: "flamenco-proxy", + 3211: "avsecuremgmt", + 3212: "surveyinst", + 3213: "neon24x7", + 3214: "jmq-daemon-1", + 3215: "jmq-daemon-2", + 3216: "ferrari-foam", + 3217: "unite", + 3218: "smartpackets", + 3219: "wms-messenger", + 3220: "xnm-ssl", + 3221: "xnm-clear-text", + 3222: "glbp", + 3223: "digivote", + 3224: "aes-discovery", + 3225: "fcip-port", + 3226: "isi-irp", + 3227: "dwnmshttp", + 3228: "dwmsgserver", + 3229: "global-cd-port", + 3230: "sftdst-port", + 3231: "vidigo", + 3232: "mdtp", + 3233: "whisker", + 3234: "alchemy", + 3235: "mdap-port", + 3236: "apparenet-ts", + 3237: "apparenet-tps", + 3238: "apparenet-as", + 3239: "apparenet-ui", + 3240: "triomotion", + 3241: "sysorb", + 3242: "sdp-id-port", + 3243: "timelot", + 3244: "onesaf", + 3245: "vieo-fe", + 3246: "dvt-system", + 3247: "dvt-data", + 3248: "procos-lm", + 3249: "ssp", + 3250: "hicp", + 3251: "sysscanner", + 3252: "dhe", + 3253: "pda-data", + 3254: "pda-sys", + 3255: "semaphore", + 3256: "cpqrpm-agent", + 3257: "cpqrpm-server", + 3258: "ivecon-port", + 3259: "epncdp2", + 3260: "iscsi-target", + 3261: "winshadow", + 3262: "necp", + 3263: "ecolor-imager", + 3264: "ccmail", + 3265: "altav-tunnel", + 3266: "ns-cfg-server", + 3267: "ibm-dial-out", + 3268: "msft-gc", + 3269: "msft-gc-ssl", + 3270: "verismart", + 3271: "csoft-prev", + 3272: "user-manager", + 3273: "sxmp", + 3274: "ordinox-server", + 3275: "samd", + 3276: "maxim-asics", + 3277: "awg-proxy", + 3278: "lkcmserver", + 3279: "admind", + 3280: "vs-server", + 3281: "sysopt", + 3282: "datusorb", + 3283: "Apple Remote Desktop (Net Assistant)", + 3284: "4talk", + 3285: "plato", + 3286: "e-net", + 3287: "directvdata", + 3288: "cops", + 3289: "enpc", + 3290: "caps-lm", + 3291: "sah-lm", + 3292: "cart-o-rama", + 3293: "fg-fps", + 3294: "fg-gip", + 3295: "dyniplookup", + 3296: "rib-slm", + 3297: "cytel-lm", + 3298: "deskview", + 3299: "pdrncs", + 3300: "ceph", + 3302: "mcs-fastmail", + 3303: "opsession-clnt", + 3304: "opsession-srvr", + 3305: "odette-ftp", + 3306: "mysql", + 3307: "opsession-prxy", + 3308: "tns-server", + 3309: "tns-adv", + 3310: "dyna-access", + 3311: "mcns-tel-ret", + 3312: "appman-server", + 3313: "uorb", + 3314: "uohost", + 3315: "cdid", + 3316: "aicc-cmi", + 3317: "vsaiport", + 3318: "ssrip", + 3319: "sdt-lmd", + 3320: "officelink2000", + 3321: "vnsstr", + 3326: "sftu", + 3327: "bbars", + 3328: "egptlm", + 3329: "hp-device-disc", + 3330: "mcs-calypsoicf", + 3331: "mcs-messaging", + 3332: "mcs-mailsvr", + 3333: "dec-notes", + 3334: "directv-web", + 3335: "directv-soft", + 3336: "directv-tick", + 3337: "directv-catlg", + 3338: "anet-b", + 3339: "anet-l", + 3340: "anet-m", + 3341: "anet-h", + 3342: "webtie", + 3343: "ms-cluster-net", + 3344: "bnt-manager", + 3345: "influence", + 3346: "trnsprntproxy", + 3347: "phoenix-rpc", + 3348: "pangolin-laser", + 3349: "chevinservices", + 3350: "findviatv", + 3351: "btrieve", + 3352: "ssql", + 3353: "fatpipe", + 3354: "suitjd", + 3355: "ordinox-dbase", + 3356: "upnotifyps", + 3357: "adtech-test", + 3358: "mpsysrmsvr", + 3359: "wg-netforce", + 3360: "kv-server", + 3361: "kv-agent", + 3362: "dj-ilm", + 3363: "nati-vi-server", + 3364: "creativeserver", + 3365: "contentserver", + 3366: "creativepartnr", + 3372: "tip2", + 3373: "lavenir-lm", + 3374: "cluster-disc", + 3375: "vsnm-agent", + 3376: "cdbroker", + 3377: "cogsys-lm", + 3378: "wsicopy", + 3379: "socorfs", + 3380: "sns-channels", + 3381: "geneous", + 3382: "fujitsu-neat", + 3383: "esp-lm", + 3384: "hp-clic", + 3385: "qnxnetman", + 3386: "gprs-data", + 3387: "backroomnet", + 3388: "cbserver", + 3389: "ms-wbt-server", + 3390: "dsc", + 3391: "savant", + 3392: "efi-lm", + 3393: "d2k-tapestry1", + 3394: "d2k-tapestry2", + 3395: "dyna-lm", + 3396: "printer-agent", + 3397: "cloanto-lm", + 3398: "mercantile", + 3399: "csms", + 3400: "csms2", + 3401: "filecast", + 3402: "fxaengine-net", + 3405: "nokia-ann-ch1", + 3406: "nokia-ann-ch2", + 3407: "ldap-admin", + 3408: "BESApi", + 3409: "networklens", + 3410: "networklenss", + 3411: "biolink-auth", + 3412: "xmlblaster", + 3413: "svnet", + 3414: "wip-port", + 3415: "bcinameservice", + 3416: "commandport", + 3417: "csvr", + 3418: "rnmap", + 3419: "softaudit", + 3420: "ifcp-port", + 3421: "bmap", + 3422: "rusb-sys-port", + 3423: "xtrm", + 3424: "xtrms", + 3425: "agps-port", + 3426: "arkivio", + 3427: "websphere-snmp", + 3428: "twcss", + 3429: "gcsp", + 3430: "ssdispatch", + 3431: "ndl-als", + 3432: "osdcp", + 3433: "opnet-smp", + 3434: "opencm", + 3435: "pacom", + 3436: "gc-config", + 3437: "autocueds", + 3438: "spiral-admin", + 3439: "hri-port", + 3440: "ans-console", + 3441: "connect-client", + 3442: "connect-server", + 3443: "ov-nnm-websrv", + 3444: "denali-server", + 3445: "monp", + 3446: "3comfaxrpc", + 3447: "directnet", + 3448: "dnc-port", + 3449: "hotu-chat", + 3450: "castorproxy", + 3451: "asam", + 3452: "sabp-signal", + 3453: "pscupd", + 3454: "mira", + 3455: "prsvp", + 3456: "vat", + 3457: "vat-control", + 3458: "d3winosfi", + 3459: "integral", + 3460: "edm-manager", + 3461: "edm-stager", + 3462: "edm-std-notify", + 3463: "edm-adm-notify", + 3464: "edm-mgr-sync", + 3465: "edm-mgr-cntrl", + 3466: "workflow", + 3467: "rcst", + 3468: "ttcmremotectrl", + 3469: "pluribus", + 3470: "jt400", + 3471: "jt400-ssl", + 3472: "jaugsremotec-1", + 3473: "jaugsremotec-2", + 3474: "ttntspauto", + 3475: "genisar-port", + 3476: "nppmp", + 3477: "ecomm", + 3478: "stun", + 3479: "twrpc", + 3480: "plethora", + 3481: "cleanerliverc", + 3482: "vulture", + 3483: "slim-devices", + 3484: "gbs-stp", + 3485: "celatalk", + 3486: "ifsf-hb-port", + 3487: "ltctcp", + 3488: "fs-rh-srv", + 3489: "dtp-dia", + 3490: "colubris", + 3491: "swr-port", + 3492: "tvdumtray-port", + 3493: "nut", + 3494: "ibm3494", + 3495: "seclayer-tcp", + 3496: "seclayer-tls", + 3497: "ipether232port", + 3498: "dashpas-port", + 3499: "sccip-media", + 3500: "rtmp-port", + 3501: "isoft-p2p", + 3502: "avinstalldisc", + 3503: "lsp-ping", + 3504: "ironstorm", + 3505: "ccmcomm", + 3506: "apc-3506", + 3507: "nesh-broker", + 3508: "interactionweb", + 3509: "vt-ssl", + 3510: "xss-port", + 3511: "webmail-2", + 3512: "aztec", + 3513: "arcpd", + 3514: "must-p2p", + 3515: "must-backplane", + 3516: "smartcard-port", + 3517: "802-11-iapp", + 3518: "artifact-msg", + 3519: "nvmsgd", + 3520: "galileolog", + 3521: "mc3ss", + 3522: "nssocketport", + 3523: "odeumservlink", + 3524: "ecmport", + 3525: "eisport", + 3526: "starquiz-port", + 3527: "beserver-msg-q", + 3528: "jboss-iiop", + 3529: "jboss-iiop-ssl", + 3530: "gf", + 3531: "joltid", + 3532: "raven-rmp", + 3533: "raven-rdp", + 3534: "urld-port", + 3535: "ms-la", + 3536: "snac", + 3537: "ni-visa-remote", + 3538: "ibm-diradm", + 3539: "ibm-diradm-ssl", + 3540: "pnrp-port", + 3541: "voispeed-port", + 3542: "hacl-monitor", + 3543: "qftest-lookup", + 3544: "teredo", + 3545: "camac", + 3547: "symantec-sim", + 3548: "interworld", + 3549: "tellumat-nms", + 3550: "ssmpp", + 3551: "apcupsd", + 3552: "taserver", + 3553: "rbr-discovery", + 3554: "questnotify", + 3555: "razor", + 3556: "sky-transport", + 3557: "personalos-001", + 3558: "mcp-port", + 3559: "cctv-port", + 3560: "iniserve-port", + 3561: "bmc-onekey", + 3562: "sdbproxy", + 3563: "watcomdebug", + 3564: "esimport", + 3565: "m2pa", + 3566: "quest-data-hub", + 3567: "dof-eps", + 3568: "dof-tunnel-sec", + 3569: "mbg-ctrl", + 3570: "mccwebsvr-port", + 3571: "megardsvr-port", + 3572: "megaregsvrport", + 3573: "tag-ups-1", + 3574: "dmaf-server", + 3575: "ccm-port", + 3576: "cmc-port", + 3577: "config-port", + 3578: "data-port", + 3579: "ttat3lb", + 3580: "nati-svrloc", + 3581: "kfxaclicensing", + 3582: "press", + 3583: "canex-watch", + 3584: "u-dbap", + 3585: "emprise-lls", + 3586: "emprise-lsc", + 3587: "p2pgroup", + 3588: "sentinel", + 3589: "isomair", + 3590: "wv-csp-sms", + 3591: "gtrack-server", + 3592: "gtrack-ne", + 3593: "bpmd", + 3594: "mediaspace", + 3595: "shareapp", + 3596: "iw-mmogame", + 3597: "a14", + 3598: "a15", + 3599: "quasar-server", + 3600: "trap-daemon", + 3601: "visinet-gui", + 3602: "infiniswitchcl", + 3603: "int-rcv-cntrl", + 3604: "bmc-jmx-port", + 3605: "comcam-io", + 3606: "splitlock", + 3607: "precise-i3", + 3608: "trendchip-dcp", + 3609: "cpdi-pidas-cm", + 3610: "echonet", + 3611: "six-degrees", + 3612: "hp-dataprotect", + 3613: "alaris-disc", + 3614: "sigma-port", + 3615: "start-network", + 3616: "cd3o-protocol", + 3617: "sharp-server", + 3618: "aairnet-1", + 3619: "aairnet-2", + 3620: "ep-pcp", + 3621: "ep-nsp", + 3622: "ff-lr-port", + 3623: "haipe-discover", + 3624: "dist-upgrade", + 3625: "volley", + 3626: "bvcdaemon-port", + 3627: "jamserverport", + 3628: "ept-machine", + 3629: "escvpnet", + 3630: "cs-remote-db", + 3631: "cs-services", + 3632: "distcc", + 3633: "wacp", + 3634: "hlibmgr", + 3635: "sdo", + 3636: "servistaitsm", + 3637: "scservp", + 3638: "ehp-backup", + 3639: "xap-ha", + 3640: "netplay-port1", + 3641: "netplay-port2", + 3642: "juxml-port", + 3643: "audiojuggler", + 3644: "ssowatch", + 3645: "cyc", + 3646: "xss-srv-port", + 3647: "splitlock-gw", + 3648: "fjcp", + 3649: "nmmp", + 3650: "prismiq-plugin", + 3651: "xrpc-registry", + 3652: "vxcrnbuport", + 3653: "tsp", + 3654: "vaprtm", + 3655: "abatemgr", + 3656: "abatjss", + 3657: "immedianet-bcn", + 3658: "ps-ams", + 3659: "apple-sasl", + 3660: "can-nds-ssl", + 3661: "can-ferret-ssl", + 3662: "pserver", + 3663: "dtp", + 3664: "ups-engine", + 3665: "ent-engine", + 3666: "eserver-pap", + 3667: "infoexch", + 3668: "dell-rm-port", + 3669: "casanswmgmt", + 3670: "smile", + 3671: "efcp", + 3672: "lispworks-orb", + 3673: "mediavault-gui", + 3674: "wininstall-ipc", + 3675: "calltrax", + 3676: "va-pacbase", + 3677: "roverlog", + 3678: "ipr-dglt", + 3679: "Escale (Newton Dock)", + 3680: "npds-tracker", + 3681: "bts-x73", + 3682: "cas-mapi", + 3683: "bmc-ea", + 3684: "faxstfx-port", + 3685: "dsx-agent", + 3686: "tnmpv2", + 3687: "simple-push", + 3688: "simple-push-s", + 3689: "daap", + 3690: "svn", + 3691: "magaya-network", + 3692: "intelsync", + 3693: "easl", + 3695: "bmc-data-coll", + 3696: "telnetcpcd", + 3697: "nw-license", + 3698: "sagectlpanel", + 3699: "kpn-icw", + 3700: "lrs-paging", + 3701: "netcelera", + 3702: "ws-discovery", + 3703: "adobeserver-3", + 3704: "adobeserver-4", + 3705: "adobeserver-5", + 3706: "rt-event", + 3707: "rt-event-s", + 3708: "sun-as-iiops", + 3709: "ca-idms", + 3710: "portgate-auth", + 3711: "edb-server2", + 3712: "sentinel-ent", + 3713: "tftps", + 3714: "delos-dms", + 3715: "anoto-rendezv", + 3716: "wv-csp-sms-cir", + 3717: "wv-csp-udp-cir", + 3718: "opus-services", + 3719: "itelserverport", + 3720: "ufastro-instr", + 3721: "xsync", + 3722: "xserveraid", + 3723: "sychrond", + 3724: "blizwow", + 3725: "na-er-tip", + 3726: "array-manager", + 3727: "e-mdu", + 3728: "e-woa", + 3729: "fksp-audit", + 3730: "client-ctrl", + 3731: "smap", + 3732: "m-wnn", + 3733: "multip-msg", + 3734: "synel-data", + 3735: "pwdis", + 3736: "rs-rmi", + 3737: "xpanel", + 3738: "versatalk", + 3739: "launchbird-lm", + 3740: "heartbeat", + 3741: "wysdma", + 3742: "cst-port", + 3743: "ipcs-command", + 3744: "sasg", + 3745: "gw-call-port", + 3746: "linktest", + 3747: "linktest-s", + 3748: "webdata", + 3749: "cimtrak", + 3750: "cbos-ip-port", + 3751: "gprs-cube", + 3752: "vipremoteagent", + 3753: "nattyserver", + 3754: "timestenbroker", + 3755: "sas-remote-hlp", + 3756: "canon-capt", + 3757: "grf-port", + 3758: "apw-registry", + 3759: "exapt-lmgr", + 3760: "adtempusclient", + 3761: "gsakmp", + 3762: "gbs-smp", + 3763: "xo-wave", + 3764: "mni-prot-rout", + 3765: "rtraceroute", + 3766: "sitewatch-s", + 3767: "listmgr-port", + 3768: "rblcheckd", + 3769: "haipe-otnk", + 3770: "cindycollab", + 3771: "paging-port", + 3772: "ctp", + 3773: "ctdhercules", + 3774: "zicom", + 3775: "ispmmgr", + 3776: "dvcprov-port", + 3777: "jibe-eb", + 3778: "c-h-it-port", + 3779: "cognima", + 3780: "nnp", + 3781: "abcvoice-port", + 3782: "iso-tp0s", + 3783: "bim-pem", + 3784: "bfd-control", + 3785: "bfd-echo", + 3786: "upstriggervsw", + 3787: "fintrx", + 3788: "isrp-port", + 3789: "remotedeploy", + 3790: "quickbooksrds", + 3791: "tvnetworkvideo", + 3792: "sitewatch", + 3793: "dcsoftware", + 3794: "jaus", + 3795: "myblast", + 3796: "spw-dialer", + 3797: "idps", + 3798: "minilock", + 3799: "radius-dynauth", + 3800: "pwgpsi", + 3801: "ibm-mgr", + 3802: "vhd", + 3803: "soniqsync", + 3804: "iqnet-port", + 3805: "tcpdataserver", + 3806: "wsmlb", + 3807: "spugna", + 3808: "sun-as-iiops-ca", + 3809: "apocd", + 3810: "wlanauth", + 3811: "amp", + 3812: "neto-wol-server", + 3813: "rap-ip", + 3814: "neto-dcs", + 3815: "lansurveyorxml", + 3816: "sunlps-http", + 3817: "tapeware", + 3818: "crinis-hb", + 3819: "epl-slp", + 3820: "scp", + 3821: "pmcp", + 3822: "acp-discovery", + 3823: "acp-conduit", + 3824: "acp-policy", + 3825: "ffserver", + 3826: "warmux", + 3827: "netmpi", + 3828: "neteh", + 3829: "neteh-ext", + 3830: "cernsysmgmtagt", + 3831: "dvapps", + 3832: "xxnetserver", + 3833: "aipn-auth", + 3834: "spectardata", + 3835: "spectardb", + 3836: "markem-dcp", + 3837: "mkm-discovery", + 3838: "sos", + 3839: "amx-rms", + 3840: "flirtmitmir", + 3841: "shiprush-db-svr", + 3842: "nhci", + 3843: "quest-agent", + 3844: "rnm", + 3845: "v-one-spp", + 3846: "an-pcp", + 3847: "msfw-control", + 3848: "item", + 3849: "spw-dnspreload", + 3850: "qtms-bootstrap", + 3851: "spectraport", + 3852: "sse-app-config", + 3853: "sscan", + 3854: "stryker-com", + 3855: "opentrac", + 3856: "informer", + 3857: "trap-port", + 3858: "trap-port-mom", + 3859: "nav-port", + 3860: "sasp", + 3861: "winshadow-hd", + 3862: "giga-pocket", + 3863: "asap-tcp", + 3864: "asap-tcp-tls", + 3865: "xpl", + 3866: "dzdaemon", + 3867: "dzoglserver", + 3868: "diameter", + 3869: "ovsam-mgmt", + 3870: "ovsam-d-agent", + 3871: "avocent-adsap", + 3872: "oem-agent", + 3873: "fagordnc", + 3874: "sixxsconfig", + 3875: "pnbscada", + 3876: "dl-agent", + 3877: "xmpcr-interface", + 3878: "fotogcad", + 3879: "appss-lm", + 3880: "igrs", + 3881: "idac", + 3882: "msdts1", + 3883: "vrpn", + 3884: "softrack-meter", + 3885: "topflow-ssl", + 3886: "nei-management", + 3887: "ciphire-data", + 3888: "ciphire-serv", + 3889: "dandv-tester", + 3890: "ndsconnect", + 3891: "rtc-pm-port", + 3892: "pcc-image-port", + 3893: "cgi-starapi", + 3894: "syam-agent", + 3895: "syam-smc", + 3896: "sdo-tls", + 3897: "sdo-ssh", + 3898: "senip", + 3899: "itv-control", + 3900: "udt-os", + 3901: "nimsh", + 3902: "nimaux", + 3903: "charsetmgr", + 3904: "omnilink-port", + 3905: "mupdate", + 3906: "topovista-data", + 3907: "imoguia-port", + 3908: "hppronetman", + 3909: "surfcontrolcpa", + 3910: "prnrequest", + 3911: "prnstatus", + 3912: "gbmt-stars", + 3913: "listcrt-port", + 3914: "listcrt-port-2", + 3915: "agcat", + 3916: "wysdmc", + 3917: "aftmux", + 3918: "pktcablemmcops", + 3919: "hyperip", + 3920: "exasoftport1", + 3921: "herodotus-net", + 3922: "sor-update", + 3923: "symb-sb-port", + 3924: "mpl-gprs-port", + 3925: "zmp", + 3926: "winport", + 3927: "natdataservice", + 3928: "netboot-pxe", + 3929: "smauth-port", + 3930: "syam-webserver", + 3931: "msr-plugin-port", + 3932: "dyn-site", + 3933: "plbserve-port", + 3934: "sunfm-port", + 3935: "sdp-portmapper", + 3936: "mailprox", + 3937: "dvbservdsc", + 3938: "dbcontrol-agent", + 3939: "aamp", + 3940: "xecp-node", + 3941: "homeportal-web", + 3942: "srdp", + 3943: "tig", + 3944: "sops", + 3945: "emcads", + 3946: "backupedge", + 3947: "ccp", + 3948: "apdap", + 3949: "drip", + 3950: "namemunge", + 3951: "pwgippfax", + 3952: "i3-sessionmgr", + 3953: "xmlink-connect", + 3954: "adrep", + 3955: "p2pcommunity", + 3956: "gvcp", + 3957: "mqe-broker", + 3958: "mqe-agent", + 3959: "treehopper", + 3960: "bess", + 3961: "proaxess", + 3962: "sbi-agent", + 3963: "thrp", + 3964: "sasggprs", + 3965: "ati-ip-to-ncpe", + 3966: "bflckmgr", + 3967: "ppsms", + 3968: "ianywhere-dbns", + 3969: "landmarks", + 3970: "lanrevagent", + 3971: "lanrevserver", + 3972: "iconp", + 3973: "progistics", + 3974: "citysearch", + 3975: "airshot", + 3976: "opswagent", + 3977: "opswmanager", + 3978: "secure-cfg-svr", + 3979: "smwan", + 3980: "acms", + 3981: "starfish", + 3982: "eis", + 3983: "eisp", + 3984: "mapper-nodemgr", + 3985: "mapper-mapethd", + 3986: "mapper-ws-ethd", + 3987: "centerline", + 3988: "dcs-config", + 3989: "bv-queryengine", + 3990: "bv-is", + 3991: "bv-smcsrv", + 3992: "bv-ds", + 3993: "bv-agent", + 3995: "iss-mgmt-ssl", + 3996: "abcsoftware", + 3997: "agentsease-db", + 3998: "dnx", + 3999: "nvcnet", + 4000: "terabase", + 4001: "newoak", + 4002: "pxc-spvr-ft", + 4003: "pxc-splr-ft", + 4004: "pxc-roid", + 4005: "pxc-pin", + 4006: "pxc-spvr", + 4007: "pxc-splr", + 4008: "netcheque", + 4009: "chimera-hwm", + 4010: "samsung-unidex", + 4011: "altserviceboot", + 4012: "pda-gate", + 4013: "acl-manager", + 4014: "taiclock", + 4015: "talarian-mcast1", + 4016: "talarian-mcast2", + 4017: "talarian-mcast3", + 4018: "talarian-mcast4", + 4019: "talarian-mcast5", + 4020: "trap", + 4021: "nexus-portal", + 4022: "dnox", + 4023: "esnm-zoning", + 4024: "tnp1-port", + 4025: "partimage", + 4026: "as-debug", + 4027: "bxp", + 4028: "dtserver-port", + 4029: "ip-qsig", + 4030: "jdmn-port", + 4031: "suucp", + 4032: "vrts-auth-port", + 4033: "sanavigator", + 4034: "ubxd", + 4035: "wap-push-http", + 4036: "wap-push-https", + 4037: "ravehd", + 4038: "fazzt-ptp", + 4039: "fazzt-admin", + 4040: "yo-main", + 4041: "houston", + 4042: "ldxp", + 4043: "nirp", + 4044: "ltp", + 4045: "npp", + 4046: "acp-proto", + 4047: "ctp-state", + 4049: "wafs", + 4050: "cisco-wafs", + 4051: "cppdp", + 4052: "interact", + 4053: "ccu-comm-1", + 4054: "ccu-comm-2", + 4055: "ccu-comm-3", + 4056: "lms", + 4057: "wfm", + 4058: "kingfisher", + 4059: "dlms-cosem", + 4060: "dsmeter-iatc", + 4061: "ice-location", + 4062: "ice-slocation", + 4063: "ice-router", + 4064: "ice-srouter", + 4065: "avanti-cdp", + 4066: "pmas", + 4067: "idp", + 4068: "ipfltbcst", + 4069: "minger", + 4070: "tripe", + 4071: "aibkup", + 4072: "zieto-sock", + 4073: "iRAPP", + 4074: "cequint-cityid", + 4075: "perimlan", + 4076: "seraph", + 4078: "cssp", + 4079: "santools", + 4080: "lorica-in", + 4081: "lorica-in-sec", + 4082: "lorica-out", + 4083: "lorica-out-sec", + 4085: "ezmessagesrv", + 4087: "applusservice", + 4088: "npsp", + 4089: "opencore", + 4090: "omasgport", + 4091: "ewinstaller", + 4092: "ewdgs", + 4093: "pvxpluscs", + 4094: "sysrqd", + 4095: "xtgui", + 4096: "bre", + 4097: "patrolview", + 4098: "drmsfsd", + 4099: "dpcp", + 4100: "igo-incognito", + 4101: "brlp-0", + 4102: "brlp-1", + 4103: "brlp-2", + 4104: "brlp-3", + 4105: "shofar", + 4106: "synchronite", + 4107: "j-ac", + 4108: "accel", + 4109: "izm", + 4110: "g2tag", + 4111: "xgrid", + 4112: "apple-vpns-rp", + 4113: "aipn-reg", + 4114: "jomamqmonitor", + 4115: "cds", + 4116: "smartcard-tls", + 4117: "hillrserv", + 4118: "netscript", + 4119: "assuria-slm", + 4121: "e-builder", + 4122: "fprams", + 4123: "z-wave", + 4124: "tigv2", + 4125: "opsview-envoy", + 4126: "ddrepl", + 4127: "unikeypro", + 4128: "nufw", + 4129: "nuauth", + 4130: "fronet", + 4131: "stars", + 4132: "nuts-dem", + 4133: "nuts-bootp", + 4134: "nifty-hmi", + 4135: "cl-db-attach", + 4136: "cl-db-request", + 4137: "cl-db-remote", + 4138: "nettest", + 4139: "thrtx", + 4140: "cedros-fds", + 4141: "oirtgsvc", + 4142: "oidocsvc", + 4143: "oidsr", + 4145: "vvr-control", + 4146: "tgcconnect", + 4147: "vrxpservman", + 4148: "hhb-handheld", + 4149: "agslb", + 4150: "PowerAlert-nsa", + 4151: "menandmice-noh", + 4152: "idig-mux", + 4153: "mbl-battd", + 4154: "atlinks", + 4155: "bzr", + 4156: "stat-results", + 4157: "stat-scanner", + 4158: "stat-cc", + 4159: "nss", + 4160: "jini-discovery", + 4161: "omscontact", + 4162: "omstopology", + 4163: "silverpeakpeer", + 4164: "silverpeakcomm", + 4165: "altcp", + 4166: "joost", + 4167: "ddgn", + 4168: "pslicser", + 4169: "iadt", + 4170: "d-cinema-csp", + 4171: "ml-svnet", + 4172: "pcoip", + 4174: "smcluster", + 4175: "bccp", + 4176: "tl-ipcproxy", + 4177: "wello", + 4178: "storman", + 4179: "MaxumSP", + 4180: "httpx", + 4181: "macbak", + 4182: "pcptcpservice", + 4183: "cyborgnet", + 4184: "universe-suite", + 4185: "wcpp", + 4186: "boxbackupstore", + 4187: "csc-proxy", + 4188: "vatata", + 4189: "pcep", + 4190: "sieve", + 4192: "azeti", + 4193: "pvxplusio", + 4197: "hctl", + 4199: "eims-admin", + 4300: "corelccam", + 4301: "d-data", + 4302: "d-data-control", + 4303: "srcp", + 4304: "owserver", + 4305: "batman", + 4306: "pinghgl", + 4307: "trueconf", + 4308: "compx-lockview", + 4309: "dserver", + 4310: "mirrtex", + 4311: "p6ssmc", + 4312: "pscl-mgt", + 4313: "perrla", + 4314: "choiceview-agt", + 4316: "choiceview-clt", + 4320: "fdt-rcatp", + 4321: "rwhois", + 4322: "trim-event", + 4323: "trim-ice", + 4325: "geognosisman", + 4326: "geognosis", + 4327: "jaxer-web", + 4328: "jaxer-manager", + 4329: "publiqare-sync", + 4330: "dey-sapi", + 4331: "ktickets-rest", + 4333: "ahsp", + 4334: "netconf-ch-ssh", + 4335: "netconf-ch-tls", + 4336: "restconf-ch-tls", + 4340: "gaia", + 4341: "lisp-data", + 4342: "lisp-cons", + 4343: "unicall", + 4344: "vinainstall", + 4345: "m4-network-as", + 4346: "elanlm", + 4347: "lansurveyor", + 4348: "itose", + 4349: "fsportmap", + 4350: "net-device", + 4351: "plcy-net-svcs", + 4352: "pjlink", + 4353: "f5-iquery", + 4354: "qsnet-trans", + 4355: "qsnet-workst", + 4356: "qsnet-assist", + 4357: "qsnet-cond", + 4358: "qsnet-nucl", + 4359: "omabcastltkm", + 4360: "matrix-vnet", + 4368: "wxbrief", + 4369: "epmd", + 4370: "elpro-tunnel", + 4371: "l2c-control", + 4372: "l2c-data", + 4373: "remctl", + 4374: "psi-ptt", + 4375: "tolteces", + 4376: "bip", + 4377: "cp-spxsvr", + 4378: "cp-spxdpy", + 4379: "ctdb", + 4389: "xandros-cms", + 4390: "wiegand", + 4391: "apwi-imserver", + 4392: "apwi-rxserver", + 4393: "apwi-rxspooler", + 4395: "omnivisionesx", + 4396: "fly", + 4400: "ds-srv", + 4401: "ds-srvr", + 4402: "ds-clnt", + 4403: "ds-user", + 4404: "ds-admin", + 4405: "ds-mail", + 4406: "ds-slp", + 4407: "nacagent", + 4408: "slscc", + 4409: "netcabinet-com", + 4410: "itwo-server", + 4411: "found", + 4413: "avi-nms", + 4414: "updog", + 4415: "brcd-vr-req", + 4416: "pjj-player", + 4417: "workflowdir", + 4419: "cbp", + 4420: "nvm-express", + 4421: "scaleft", + 4422: "tsepisp", + 4423: "thingkit", + 4425: "netrockey6", + 4426: "beacon-port-2", + 4427: "drizzle", + 4428: "omviserver", + 4429: "omviagent", + 4430: "rsqlserver", + 4431: "wspipe", + 4432: "l-acoustics", + 4433: "vop", + 4442: "saris", + 4443: "pharos", + 4444: "krb524", + 4445: "upnotifyp", + 4446: "n1-fwp", + 4447: "n1-rmgmt", + 4448: "asc-slmd", + 4449: "privatewire", + 4450: "camp", + 4451: "ctisystemmsg", + 4452: "ctiprogramload", + 4453: "nssalertmgr", + 4454: "nssagentmgr", + 4455: "prchat-user", + 4456: "prchat-server", + 4457: "prRegister", + 4458: "mcp", + 4484: "hpssmgmt", + 4485: "assyst-dr", + 4486: "icms", + 4487: "prex-tcp", + 4488: "awacs-ice", + 4500: "ipsec-nat-t", + 4535: "ehs", + 4536: "ehs-ssl", + 4537: "wssauthsvc", + 4538: "swx-gate", + 4545: "worldscores", + 4546: "sf-lm", + 4547: "lanner-lm", + 4548: "synchromesh", + 4549: "aegate", + 4550: "gds-adppiw-db", + 4551: "ieee-mih", + 4552: "menandmice-mon", + 4553: "icshostsvc", + 4554: "msfrs", + 4555: "rsip", + 4556: "dtn-bundle", + 4559: "hylafax", + 4563: "amahi-anywhere", + 4566: "kwtc", + 4567: "tram", + 4568: "bmc-reporting", + 4569: "iax", + 4570: "deploymentmap", + 4573: "cardifftec-back", + 4590: "rid", + 4591: "l3t-at-an", + 4593: "ipt-anri-anri", + 4594: "ias-session", + 4595: "ias-paging", + 4596: "ias-neighbor", + 4597: "a21-an-1xbs", + 4598: "a16-an-an", + 4599: "a17-an-an", + 4600: "piranha1", + 4601: "piranha2", + 4602: "mtsserver", + 4603: "menandmice-upg", + 4604: "irp", + 4605: "sixchat", + 4658: "playsta2-app", + 4659: "playsta2-lob", + 4660: "smaclmgr", + 4661: "kar2ouche", + 4662: "oms", + 4663: "noteit", + 4664: "ems", + 4665: "contclientms", + 4666: "eportcomm", + 4667: "mmacomm", + 4668: "mmaeds", + 4669: "eportcommdata", + 4670: "light", + 4671: "acter", + 4672: "rfa", + 4673: "cxws", + 4674: "appiq-mgmt", + 4675: "dhct-status", + 4676: "dhct-alerts", + 4677: "bcs", + 4678: "traversal", + 4679: "mgesupervision", + 4680: "mgemanagement", + 4681: "parliant", + 4682: "finisar", + 4683: "spike", + 4684: "rfid-rp1", + 4685: "autopac", + 4686: "msp-os", + 4687: "nst", + 4688: "mobile-p2p", + 4689: "altovacentral", + 4690: "prelude", + 4691: "mtn", + 4692: "conspiracy", + 4700: "netxms-agent", + 4701: "netxms-mgmt", + 4702: "netxms-sync", + 4703: "npqes-test", + 4704: "assuria-ins", + 4711: "trinity-dist", + 4725: "truckstar", + 4727: "fcis", + 4728: "capmux", + 4730: "gearman", + 4731: "remcap", + 4733: "resorcs", + 4737: "ipdr-sp", + 4738: "solera-lpn", + 4739: "ipfix", + 4740: "ipfixs", + 4741: "lumimgrd", + 4742: "sicct", + 4743: "openhpid", + 4744: "ifsp", + 4745: "fmp", + 4749: "profilemac", + 4750: "ssad", + 4751: "spocp", + 4752: "snap", + 4753: "simon", + 4756: "RDCenter", + 4774: "converge", + 4784: "bfd-multi-ctl", + 4786: "smart-install", + 4787: "sia-ctrl-plane", + 4788: "xmcp", + 4800: "iims", + 4801: "iwec", + 4802: "ilss", + 4803: "notateit", + 4827: "htcp", + 4837: "varadero-0", + 4838: "varadero-1", + 4839: "varadero-2", + 4840: "opcua-tcp", + 4841: "quosa", + 4842: "gw-asv", + 4843: "opcua-tls", + 4844: "gw-log", + 4845: "wcr-remlib", + 4846: "contamac-icm", + 4847: "wfc", + 4848: "appserv-http", + 4849: "appserv-https", + 4850: "sun-as-nodeagt", + 4851: "derby-repli", + 4867: "unify-debug", + 4868: "phrelay", + 4869: "phrelaydbg", + 4870: "cc-tracking", + 4871: "wired", + 4876: "tritium-can", + 4877: "lmcs", + 4879: "wsdl-event", + 4880: "hislip", + 4883: "wmlserver", + 4884: "hivestor", + 4885: "abbs", + 4894: "lyskom", + 4899: "radmin-port", + 4900: "hfcs", + 4901: "flr-agent", + 4902: "magiccontrol", + 4912: "lutap", + 4913: "lutcp", + 4914: "bones", + 4915: "frcs", + 4940: "eq-office-4940", + 4941: "eq-office-4941", + 4942: "eq-office-4942", + 4949: "munin", + 4950: "sybasesrvmon", + 4951: "pwgwims", + 4952: "sagxtsds", + 4953: "dbsyncarbiter", + 4969: "ccss-qmm", + 4970: "ccss-qsm", + 4971: "burp", + 4984: "webyast", + 4985: "gerhcs", + 4986: "mrip", + 4987: "smar-se-port1", + 4988: "smar-se-port2", + 4989: "parallel", + 4990: "busycal", + 4991: "vrt", + 4999: "hfcs-manager", + 5000: "commplex-main", + 5001: "commplex-link", + 5002: "rfe", + 5003: "fmpro-internal", + 5004: "avt-profile-1", + 5005: "avt-profile-2", + 5006: "wsm-server", + 5007: "wsm-server-ssl", + 5008: "synapsis-edge", + 5009: "winfs", + 5010: "telelpathstart", + 5011: "telelpathattack", + 5012: "nsp", + 5013: "fmpro-v6", + 5015: "fmwp", + 5020: "zenginkyo-1", + 5021: "zenginkyo-2", + 5022: "mice", + 5023: "htuilsrv", + 5024: "scpi-telnet", + 5025: "scpi-raw", + 5026: "strexec-d", + 5027: "strexec-s", + 5028: "qvr", + 5029: "infobright", + 5030: "surfpass", + 5032: "signacert-agent", + 5033: "jtnetd-server", + 5034: "jtnetd-status", + 5042: "asnaacceler8db", + 5043: "swxadmin", + 5044: "lxi-evntsvc", + 5045: "osp", + 5048: "texai", + 5049: "ivocalize", + 5050: "mmcc", + 5051: "ita-agent", + 5052: "ita-manager", + 5053: "rlm", + 5054: "rlm-admin", + 5055: "unot", + 5056: "intecom-ps1", + 5057: "intecom-ps2", + 5059: "sds", + 5060: "sip", + 5061: "sips", + 5062: "na-localise", + 5063: "csrpc", + 5064: "ca-1", + 5065: "ca-2", + 5066: "stanag-5066", + 5067: "authentx", + 5068: "bitforestsrv", + 5069: "i-net-2000-npr", + 5070: "vtsas", + 5071: "powerschool", + 5072: "ayiya", + 5073: "tag-pm", + 5074: "alesquery", + 5075: "pvaccess", + 5080: "onscreen", + 5081: "sdl-ets", + 5082: "qcp", + 5083: "qfp", + 5084: "llrp", + 5085: "encrypted-llrp", + 5086: "aprigo-cs", + 5087: "biotic", + 5093: "sentinel-lm", + 5094: "hart-ip", + 5099: "sentlm-srv2srv", + 5100: "socalia", + 5101: "talarian-tcp", + 5102: "oms-nonsecure", + 5103: "actifio-c2c", + 5106: "actifioudsagent", + 5107: "actifioreplic", + 5111: "taep-as-svc", + 5112: "pm-cmdsvr", + 5114: "ev-services", + 5115: "autobuild", + 5117: "gradecam", + 5120: "barracuda-bbs", + 5133: "nbt-pc", + 5134: "ppactivation", + 5135: "erp-scale", + 5137: "ctsd", + 5145: "rmonitor-secure", + 5146: "social-alarm", + 5150: "atmp", + 5151: "esri-sde", + 5152: "sde-discovery", + 5153: "toruxserver", + 5154: "bzflag", + 5155: "asctrl-agent", + 5156: "rugameonline", + 5157: "mediat", + 5161: "snmpssh", + 5162: "snmpssh-trap", + 5163: "sbackup", + 5164: "vpa", + 5165: "ife-icorp", + 5166: "winpcs", + 5167: "scte104", + 5168: "scte30", + 5172: "pcoip-mgmt", + 5190: "aol", + 5191: "aol-1", + 5192: "aol-2", + 5193: "aol-3", + 5194: "cpscomm", + 5195: "ampl-lic", + 5196: "ampl-tableproxy", + 5197: "tunstall-lwp", + 5200: "targus-getdata", + 5201: "targus-getdata1", + 5202: "targus-getdata2", + 5203: "targus-getdata3", + 5209: "nomad", + 5215: "noteza", + 5221: "3exmp", + 5222: "xmpp-client", + 5223: "hpvirtgrp", + 5224: "hpvirtctrl", + 5225: "hp-server", + 5226: "hp-status", + 5227: "perfd", + 5228: "hpvroom", + 5229: "jaxflow", + 5230: "jaxflow-data", + 5231: "crusecontrol", + 5232: "csedaemon", + 5233: "enfs", + 5234: "eenet", + 5235: "galaxy-network", + 5236: "padl2sim", + 5237: "mnet-discovery", + 5245: "downtools", + 5248: "caacws", + 5249: "caaclang2", + 5250: "soagateway", + 5251: "caevms", + 5252: "movaz-ssc", + 5253: "kpdp", + 5254: "logcabin", + 5264: "3com-njack-1", + 5265: "3com-njack-2", + 5269: "xmpp-server", + 5270: "cartographerxmp", + 5271: "cuelink", + 5272: "pk", + 5280: "xmpp-bosh", + 5281: "undo-lm", + 5282: "transmit-port", + 5298: "presence", + 5299: "nlg-data", + 5300: "hacl-hb", + 5301: "hacl-gs", + 5302: "hacl-cfg", + 5303: "hacl-probe", + 5304: "hacl-local", + 5305: "hacl-test", + 5306: "sun-mc-grp", + 5307: "sco-aip", + 5308: "cfengine", + 5309: "jprinter", + 5310: "outlaws", + 5312: "permabit-cs", + 5313: "rrdp", + 5314: "opalis-rbt-ipc", + 5315: "hacl-poll", + 5316: "hpbladems", + 5317: "hpdevms", + 5318: "pkix-cmc", + 5320: "bsfserver-zn", + 5321: "bsfsvr-zn-ssl", + 5343: "kfserver", + 5344: "xkotodrcp", + 5349: "stuns", + 5352: "dns-llq", + 5353: "mdns", + 5354: "mdnsresponder", + 5355: "llmnr", + 5356: "ms-smlbiz", + 5357: "wsdapi", + 5358: "wsdapi-s", + 5359: "ms-alerter", + 5360: "ms-sideshow", + 5361: "ms-s-sideshow", + 5362: "serverwsd2", + 5363: "net-projection", + 5397: "stresstester", + 5398: "elektron-admin", + 5399: "securitychase", + 5400: "excerpt", + 5401: "excerpts", + 5402: "mftp", + 5403: "hpoms-ci-lstn", + 5404: "hpoms-dps-lstn", + 5405: "netsupport", + 5406: "systemics-sox", + 5407: "foresyte-clear", + 5408: "foresyte-sec", + 5409: "salient-dtasrv", + 5410: "salient-usrmgr", + 5411: "actnet", + 5412: "continuus", + 5413: "wwiotalk", + 5414: "statusd", + 5415: "ns-server", + 5416: "sns-gateway", + 5417: "sns-agent", + 5418: "mcntp", + 5419: "dj-ice", + 5420: "cylink-c", + 5421: "netsupport2", + 5422: "salient-mux", + 5423: "virtualuser", + 5424: "beyond-remote", + 5425: "br-channel", + 5426: "devbasic", + 5427: "sco-peer-tta", + 5428: "telaconsole", + 5429: "base", + 5430: "radec-corp", + 5431: "park-agent", + 5432: "postgresql", + 5433: "pyrrho", + 5434: "sgi-arrayd", + 5435: "sceanics", + 5443: "spss", + 5445: "smbdirect", + 5450: "tiepie", + 5453: "surebox", + 5454: "apc-5454", + 5455: "apc-5455", + 5456: "apc-5456", + 5461: "silkmeter", + 5462: "ttl-publisher", + 5463: "ttlpriceproxy", + 5464: "quailnet", + 5465: "netops-broker", + 5470: "apsolab-col", + 5471: "apsolab-cols", + 5472: "apsolab-tag", + 5473: "apsolab-tags", + 5475: "apsolab-data", + 5500: "fcp-addr-srvr1", + 5501: "fcp-addr-srvr2", + 5502: "fcp-srvr-inst1", + 5503: "fcp-srvr-inst2", + 5504: "fcp-cics-gw1", + 5505: "checkoutdb", + 5506: "amc", + 5507: "psl-management", + 5550: "cbus", + 5553: "sgi-eventmond", + 5554: "sgi-esphttp", + 5555: "personal-agent", + 5556: "freeciv", + 5557: "farenet", + 5565: "hpe-dp-bura", + 5566: "westec-connect", + 5567: "dof-dps-mc-sec", + 5568: "sdt", + 5569: "rdmnet-ctrl", + 5573: "sdmmp", + 5574: "lsi-bobcat", + 5575: "ora-oap", + 5579: "fdtracks", + 5580: "tmosms0", + 5581: "tmosms1", + 5582: "fac-restore", + 5583: "tmo-icon-sync", + 5584: "bis-web", + 5585: "bis-sync", + 5586: "att-mt-sms", + 5597: "ininmessaging", + 5598: "mctfeed", + 5599: "esinstall", + 5600: "esmmanager", + 5601: "esmagent", + 5602: "a1-msc", + 5603: "a1-bs", + 5604: "a3-sdunode", + 5605: "a4-sdunode", + 5618: "efr", + 5627: "ninaf", + 5628: "htrust", + 5629: "symantec-sfdb", + 5630: "precise-comm", + 5631: "pcanywheredata", + 5632: "pcanywherestat", + 5633: "beorl", + 5634: "xprtld", + 5635: "sfmsso", + 5636: "sfm-db-server", + 5637: "cssc", + 5638: "flcrs", + 5639: "ics", + 5646: "vfmobile", + 5666: "nrpe", + 5670: "filemq", + 5671: "amqps", + 5672: "amqp", + 5673: "jms", + 5674: "hyperscsi-port", + 5675: "v5ua", + 5676: "raadmin", + 5677: "questdb2-lnchr", + 5678: "rrac", + 5679: "dccm", + 5680: "auriga-router", + 5681: "ncxcp", + 5688: "ggz", + 5689: "qmvideo", + 5693: "rbsystem", + 5696: "kmip", + 5700: "supportassist", + 5705: "storageos", + 5713: "proshareaudio", + 5714: "prosharevideo", + 5715: "prosharedata", + 5716: "prosharerequest", + 5717: "prosharenotify", + 5718: "dpm", + 5719: "dpm-agent", + 5720: "ms-licensing", + 5721: "dtpt", + 5722: "msdfsr", + 5723: "omhs", + 5724: "omsdk", + 5725: "ms-ilm", + 5726: "ms-ilm-sts", + 5727: "asgenf", + 5728: "io-dist-data", + 5729: "openmail", + 5730: "unieng", + 5741: "ida-discover1", + 5742: "ida-discover2", + 5743: "watchdoc-pod", + 5744: "watchdoc", + 5745: "fcopy-server", + 5746: "fcopys-server", + 5747: "tunatic", + 5748: "tunalyzer", + 5750: "rscd", + 5755: "openmailg", + 5757: "x500ms", + 5766: "openmailns", + 5767: "s-openmail", + 5768: "openmailpxy", + 5769: "spramsca", + 5770: "spramsd", + 5771: "netagent", + 5777: "dali-port", + 5780: "vts-rpc", + 5781: "3par-evts", + 5782: "3par-mgmt", + 5783: "3par-mgmt-ssl", + 5785: "3par-rcopy", + 5793: "xtreamx", + 5813: "icmpd", + 5814: "spt-automation", + 5841: "shiprush-d-ch", + 5842: "reversion", + 5859: "wherehoo", + 5863: "ppsuitemsg", + 5868: "diameters", + 5883: "jute", + 5900: "rfb", + 5910: "cm", + 5911: "cpdlc", + 5912: "fis", + 5913: "ads-c", + 5963: "indy", + 5968: "mppolicy-v5", + 5969: "mppolicy-mgr", + 5984: "couchdb", + 5985: "wsman", + 5986: "wsmans", + 5987: "wbem-rmi", + 5988: "wbem-http", + 5989: "wbem-https", + 5990: "wbem-exp-https", + 5991: "nuxsl", + 5992: "consul-insight", + 5993: "cim-rs", + 5999: "cvsup", + 6064: "ndl-ahp-svc", + 6065: "winpharaoh", + 6066: "ewctsp", + 6068: "gsmp-ancp", + 6069: "trip", + 6070: "messageasap", + 6071: "ssdtp", + 6072: "diagnose-proc", + 6073: "directplay8", + 6074: "max", + 6075: "dpm-acm", + 6076: "msft-dpm-cert", + 6077: "iconstructsrv", + 6084: "reload-config", + 6085: "konspire2b", + 6086: "pdtp", + 6087: "ldss", + 6088: "doglms", + 6099: "raxa-mgmt", + 6100: "synchronet-db", + 6101: "synchronet-rtc", + 6102: "synchronet-upd", + 6103: "rets", + 6104: "dbdb", + 6105: "primaserver", + 6106: "mpsserver", + 6107: "etc-control", + 6108: "sercomm-scadmin", + 6109: "globecast-id", + 6110: "softcm", + 6111: "spc", + 6112: "dtspcd", + 6113: "dayliteserver", + 6114: "wrspice", + 6115: "xic", + 6116: "xtlserv", + 6117: "daylitetouch", + 6121: "spdy", + 6122: "bex-webadmin", + 6123: "backup-express", + 6124: "pnbs", + 6130: "damewaremobgtwy", + 6133: "nbt-wol", + 6140: "pulsonixnls", + 6141: "meta-corp", + 6142: "aspentec-lm", + 6143: "watershed-lm", + 6144: "statsci1-lm", + 6145: "statsci2-lm", + 6146: "lonewolf-lm", + 6147: "montage-lm", + 6148: "ricardo-lm", + 6149: "tal-pod", + 6159: "efb-aci", + 6160: "ecmp", + 6161: "patrol-ism", + 6162: "patrol-coll", + 6163: "pscribe", + 6200: "lm-x", + 6209: "qmtps", + 6222: "radmind", + 6241: "jeol-nsdtp-1", + 6242: "jeol-nsdtp-2", + 6243: "jeol-nsdtp-3", + 6244: "jeol-nsdtp-4", + 6251: "tl1-raw-ssl", + 6252: "tl1-ssh", + 6253: "crip", + 6267: "gld", + 6268: "grid", + 6269: "grid-alt", + 6300: "bmc-grx", + 6301: "bmc-ctd-ldap", + 6306: "ufmp", + 6315: "scup", + 6316: "abb-escp", + 6317: "nav-data-cmd", + 6320: "repsvc", + 6321: "emp-server1", + 6322: "emp-server2", + 6324: "hrd-ncs", + 6325: "dt-mgmtsvc", + 6326: "dt-vra", + 6343: "sflow", + 6344: "streletz", + 6346: "gnutella-svc", + 6347: "gnutella-rtr", + 6350: "adap", + 6355: "pmcs", + 6360: "metaedit-mu", + 6370: "metaedit-se", + 6379: "redis", + 6382: "metatude-mds", + 6389: "clariion-evr01", + 6390: "metaedit-ws", + 6417: "faxcomservice", + 6418: "syserverremote", + 6419: "svdrp", + 6420: "nim-vdrshell", + 6421: "nim-wan", + 6432: "pgbouncer", + 6442: "tarp", + 6443: "sun-sr-https", + 6444: "sge-qmaster", + 6445: "sge-execd", + 6446: "mysql-proxy", + 6455: "skip-cert-recv", + 6456: "skip-cert-send", + 6464: "ieee11073-20701", + 6471: "lvision-lm", + 6480: "sun-sr-http", + 6481: "servicetags", + 6482: "ldoms-mgmt", + 6483: "SunVTS-RMI", + 6484: "sun-sr-jms", + 6485: "sun-sr-iiop", + 6486: "sun-sr-iiops", + 6487: "sun-sr-iiop-aut", + 6488: "sun-sr-jmx", + 6489: "sun-sr-admin", + 6500: "boks", + 6501: "boks-servc", + 6502: "boks-servm", + 6503: "boks-clntd", + 6505: "badm-priv", + 6506: "badm-pub", + 6507: "bdir-priv", + 6508: "bdir-pub", + 6509: "mgcs-mfp-port", + 6510: "mcer-port", + 6513: "netconf-tls", + 6514: "syslog-tls", + 6515: "elipse-rec", + 6543: "lds-distrib", + 6544: "lds-dump", + 6547: "apc-6547", + 6548: "apc-6548", + 6549: "apc-6549", + 6550: "fg-sysupdate", + 6551: "sum", + 6558: "xdsxdm", + 6566: "sane-port", + 6568: "canit-store", + 6579: "affiliate", + 6580: "parsec-master", + 6581: "parsec-peer", + 6582: "parsec-game", + 6583: "joaJewelSuite", + 6600: "mshvlm", + 6601: "mstmg-sstp", + 6602: "wsscomfrmwk", + 6619: "odette-ftps", + 6620: "kftp-data", + 6621: "kftp", + 6622: "mcftp", + 6623: "ktelnet", + 6624: "datascaler-db", + 6625: "datascaler-ctl", + 6626: "wago-service", + 6627: "nexgen", + 6628: "afesc-mc", + 6629: "nexgen-aux", + 6632: "mxodbc-connect", + 6640: "ovsdb", + 6653: "openflow", + 6655: "pcs-sf-ui-man", + 6656: "emgmsg", + 6670: "vocaltec-gold", + 6671: "p4p-portal", + 6672: "vision-server", + 6673: "vision-elmd", + 6678: "vfbp", + 6679: "osaut", + 6687: "clever-ctrace", + 6688: "clever-tcpip", + 6689: "tsa", + 6690: "cleverdetect", + 6697: "ircs-u", + 6701: "kti-icad-srvr", + 6702: "e-design-net", + 6703: "e-design-web", + 6714: "ibprotocol", + 6715: "fibotrader-com", + 6716: "princity-agent", + 6767: "bmc-perf-agent", + 6768: "bmc-perf-mgrd", + 6769: "adi-gxp-srvprt", + 6770: "plysrv-http", + 6771: "plysrv-https", + 6777: "ntz-tracker", + 6778: "ntz-p2p-storage", + 6785: "dgpf-exchg", + 6786: "smc-jmx", + 6787: "smc-admin", + 6788: "smc-http", + 6789: "radg", + 6790: "hnmp", + 6791: "hnm", + 6801: "acnet", + 6817: "pentbox-sim", + 6831: "ambit-lm", + 6841: "netmo-default", + 6842: "netmo-http", + 6850: "iccrushmore", + 6868: "acctopus-cc", + 6888: "muse", + 6900: "rtimeviewer", + 6901: "jetstream", + 6935: "ethoscan", + 6936: "xsmsvc", + 6946: "bioserver", + 6951: "otlp", + 6961: "jmact3", + 6962: "jmevt2", + 6963: "swismgr1", + 6964: "swismgr2", + 6965: "swistrap", + 6966: "swispol", + 6969: "acmsoda", + 6970: "conductor", + 6997: "MobilitySrv", + 6998: "iatp-highpri", + 6999: "iatp-normalpri", + 7000: "afs3-fileserver", + 7001: "afs3-callback", + 7002: "afs3-prserver", + 7003: "afs3-vlserver", + 7004: "afs3-kaserver", + 7005: "afs3-volser", + 7006: "afs3-errors", + 7007: "afs3-bos", + 7008: "afs3-update", + 7009: "afs3-rmtsys", + 7010: "ups-onlinet", + 7011: "talon-disc", + 7012: "talon-engine", + 7013: "microtalon-dis", + 7014: "microtalon-com", + 7015: "talon-webserver", + 7016: "spg", + 7017: "grasp", + 7018: "fisa-svc", + 7019: "doceri-ctl", + 7020: "dpserve", + 7021: "dpserveadmin", + 7022: "ctdp", + 7023: "ct2nmcs", + 7024: "vmsvc", + 7025: "vmsvc-2", + 7030: "op-probe", + 7031: "iposplanet", + 7070: "arcp", + 7071: "iwg1", + 7073: "martalk", + 7080: "empowerid", + 7099: "lazy-ptop", + 7100: "font-service", + 7101: "elcn", + 7117: "rothaga", + 7121: "virprot-lm", + 7128: "scenidm", + 7129: "scenccs", + 7161: "cabsm-comm", + 7162: "caistoragemgr", + 7163: "cacsambroker", + 7164: "fsr", + 7165: "doc-server", + 7166: "aruba-server", + 7167: "casrmagent", + 7168: "cnckadserver", + 7169: "ccag-pib", + 7170: "nsrp", + 7171: "drm-production", + 7172: "metalbend", + 7173: "zsecure", + 7174: "clutild", + 7200: "fodms", + 7201: "dlip", + 7202: "pon-ictp", + 7215: "PS-Server", + 7216: "PS-Capture-Pro", + 7227: "ramp", + 7228: "citrixupp", + 7229: "citrixuppg", + 7236: "display", + 7237: "pads", + 7244: "frc-hicp", + 7262: "cnap", + 7272: "watchme-7272", + 7273: "oma-rlp", + 7274: "oma-rlp-s", + 7275: "oma-ulp", + 7276: "oma-ilp", + 7277: "oma-ilp-s", + 7278: "oma-dcdocbs", + 7279: "ctxlic", + 7280: "itactionserver1", + 7281: "itactionserver2", + 7282: "mzca-action", + 7283: "genstat", + 7365: "lcm-server", + 7391: "mindfilesys", + 7392: "mrssrendezvous", + 7393: "nfoldman", + 7394: "fse", + 7395: "winqedit", + 7397: "hexarc", + 7400: "rtps-discovery", + 7401: "rtps-dd-ut", + 7402: "rtps-dd-mt", + 7410: "ionixnetmon", + 7411: "daqstream", + 7421: "mtportmon", + 7426: "pmdmgr", + 7427: "oveadmgr", + 7428: "ovladmgr", + 7429: "opi-sock", + 7430: "xmpv7", + 7431: "pmd", + 7437: "faximum", + 7443: "oracleas-https", + 7471: "sttunnel", + 7473: "rise", + 7474: "neo4j", + 7478: "openit", + 7491: "telops-lmd", + 7500: "silhouette", + 7501: "ovbus", + 7508: "adcp", + 7509: "acplt", + 7510: "ovhpas", + 7511: "pafec-lm", + 7542: "saratoga", + 7543: "atul", + 7544: "nta-ds", + 7545: "nta-us", + 7546: "cfs", + 7547: "cwmp", + 7548: "tidp", + 7549: "nls-tl", + 7551: "controlone-con", + 7560: "sncp", + 7563: "cfw", + 7566: "vsi-omega", + 7569: "dell-eql-asm", + 7570: "aries-kfinder", + 7574: "coherence", + 7588: "sun-lm", + 7606: "mipi-debug", + 7624: "indi", + 7626: "simco", + 7627: "soap-http", + 7628: "zen-pawn", + 7629: "xdas", + 7630: "hawk", + 7631: "tesla-sys-msg", + 7633: "pmdfmgt", + 7648: "cuseeme", + 7672: "imqstomp", + 7673: "imqstomps", + 7674: "imqtunnels", + 7675: "imqtunnel", + 7676: "imqbrokerd", + 7677: "sun-user-https", + 7680: "pando-pub", + 7683: "dmt", + 7687: "bolt", + 7689: "collaber", + 7697: "klio", + 7700: "em7-secom", + 7707: "sync-em7", + 7708: "scinet", + 7720: "medimageportal", + 7724: "nsdeepfreezectl", + 7725: "nitrogen", + 7726: "freezexservice", + 7727: "trident-data", + 7728: "osvr", + 7734: "smip", + 7738: "aiagent", + 7741: "scriptview", + 7742: "msss", + 7743: "sstp-1", + 7744: "raqmon-pdu", + 7747: "prgp", + 7775: "inetfs", + 7777: "cbt", + 7778: "interwise", + 7779: "vstat", + 7781: "accu-lmgr", + 7786: "minivend", + 7787: "popup-reminders", + 7789: "office-tools", + 7794: "q3ade", + 7797: "pnet-conn", + 7798: "pnet-enc", + 7799: "altbsdp", + 7800: "asr", + 7801: "ssp-client", + 7810: "rbt-wanopt", + 7845: "apc-7845", + 7846: "apc-7846", + 7847: "csoauth", + 7869: "mobileanalyzer", + 7870: "rbt-smc", + 7871: "mdm", + 7878: "owms", + 7880: "pss", + 7887: "ubroker", + 7900: "mevent", + 7901: "tnos-sp", + 7902: "tnos-dp", + 7903: "tnos-dps", + 7913: "qo-secure", + 7932: "t2-drm", + 7933: "t2-brm", + 7962: "generalsync", + 7967: "supercell", + 7979: "micromuse-ncps", + 7980: "quest-vista", + 7981: "sossd-collect", + 7982: "sossd-agent", + 7997: "pushns", + 7999: "irdmi2", + 8000: "irdmi", + 8001: "vcom-tunnel", + 8002: "teradataordbms", + 8003: "mcreport", + 8005: "mxi", + 8006: "wpl-analytics", + 8007: "warppipe", + 8008: "http-alt", + 8019: "qbdb", + 8020: "intu-ec-svcdisc", + 8021: "intu-ec-client", + 8022: "oa-system", + 8025: "ca-audit-da", + 8026: "ca-audit-ds", + 8032: "pro-ed", + 8033: "mindprint", + 8034: "vantronix-mgmt", + 8040: "ampify", + 8041: "enguity-xccetp", + 8042: "fs-agent", + 8043: "fs-server", + 8044: "fs-mgmt", + 8051: "rocrail", + 8052: "senomix01", + 8053: "senomix02", + 8054: "senomix03", + 8055: "senomix04", + 8056: "senomix05", + 8057: "senomix06", + 8058: "senomix07", + 8059: "senomix08", + 8066: "toad-bi-appsrvr", + 8067: "infi-async", + 8070: "ucs-isc", + 8074: "gadugadu", + 8077: "mles", + 8080: "http-alt", + 8081: "sunproxyadmin", + 8082: "us-cli", + 8083: "us-srv", + 8086: "d-s-n", + 8087: "simplifymedia", + 8088: "radan-http", + 8090: "opsmessaging", + 8091: "jamlink", + 8097: "sac", + 8100: "xprint-server", + 8101: "ldoms-migr", + 8102: "kz-migr", + 8115: "mtl8000-matrix", + 8116: "cp-cluster", + 8117: "purityrpc", + 8118: "privoxy", + 8121: "apollo-data", + 8122: "apollo-admin", + 8128: "paycash-online", + 8129: "paycash-wbp", + 8130: "indigo-vrmi", + 8131: "indigo-vbcp", + 8132: "dbabble", + 8140: "puppet", + 8148: "isdd", + 8153: "quantastor", + 8160: "patrol", + 8161: "patrol-snmp", + 8162: "lpar2rrd", + 8181: "intermapper", + 8182: "vmware-fdm", + 8183: "proremote", + 8184: "itach", + 8190: "gcp-rphy", + 8191: "limnerpressure", + 8192: "spytechphone", + 8194: "blp1", + 8195: "blp2", + 8199: "vvr-data", + 8200: "trivnet1", + 8201: "trivnet2", + 8204: "lm-perfworks", + 8205: "lm-instmgr", + 8206: "lm-dta", + 8207: "lm-sserver", + 8208: "lm-webwatcher", + 8230: "rexecj", + 8243: "synapse-nhttps", + 8270: "robot-remote", + 8276: "pando-sec", + 8280: "synapse-nhttp", + 8282: "libelle", + 8292: "blp3", + 8293: "hiperscan-id", + 8294: "blp4", + 8300: "tmi", + 8301: "amberon", + 8313: "hub-open-net", + 8320: "tnp-discover", + 8321: "tnp", + 8322: "garmin-marine", + 8351: "server-find", + 8376: "cruise-enum", + 8377: "cruise-swroute", + 8378: "cruise-config", + 8379: "cruise-diags", + 8380: "cruise-update", + 8383: "m2mservices", + 8400: "cvd", + 8401: "sabarsd", + 8402: "abarsd", + 8403: "admind", + 8404: "svcloud", + 8405: "svbackup", + 8415: "dlpx-sp", + 8416: "espeech", + 8417: "espeech-rtp", + 8423: "aritts", + 8442: "cybro-a-bus", + 8443: "pcsync-https", + 8444: "pcsync-http", + 8445: "copy", + 8450: "npmp", + 8457: "nexentamv", + 8470: "cisco-avp", + 8471: "pim-port", + 8472: "otv", + 8473: "vp2p", + 8474: "noteshare", + 8500: "fmtp", + 8501: "cmtp-mgt", + 8502: "ftnmtp", + 8554: "rtsp-alt", + 8555: "d-fence", + 8567: "dof-tunnel", + 8600: "asterix", + 8610: "canon-mfnp", + 8611: "canon-bjnp1", + 8612: "canon-bjnp2", + 8613: "canon-bjnp3", + 8614: "canon-bjnp4", + 8615: "imink", + 8665: "monetra", + 8666: "monetra-admin", + 8675: "msi-cps-rm", + 8686: "sun-as-jmxrmi", + 8688: "openremote-ctrl", + 8699: "vnyx", + 8711: "nvc", + 8733: "ibus", + 8750: "dey-keyneg", + 8763: "mc-appserver", + 8764: "openqueue", + 8765: "ultraseek-http", + 8766: "amcs", + 8770: "dpap", + 8778: "uec", + 8786: "msgclnt", + 8787: "msgsrvr", + 8793: "acd-pm", + 8800: "sunwebadmin", + 8804: "truecm", + 8873: "dxspider", + 8880: "cddbp-alt", + 8881: "galaxy4d", + 8883: "secure-mqtt", + 8888: "ddi-tcp-1", + 8889: "ddi-tcp-2", + 8890: "ddi-tcp-3", + 8891: "ddi-tcp-4", + 8892: "ddi-tcp-5", + 8893: "ddi-tcp-6", + 8894: "ddi-tcp-7", + 8899: "ospf-lite", + 8900: "jmb-cds1", + 8901: "jmb-cds2", + 8910: "manyone-http", + 8911: "manyone-xml", + 8912: "wcbackup", + 8913: "dragonfly", + 8937: "twds", + 8953: "ub-dns-control", + 8954: "cumulus-admin", + 8980: "nod-provider", + 8989: "sunwebadmins", + 8990: "http-wmap", + 8991: "https-wmap", + 8997: "oracle-ms-ens", + 8998: "canto-roboflow", + 8999: "bctp", + 9000: "cslistener", + 9001: "etlservicemgr", + 9002: "dynamid", + 9005: "golem", + 9008: "ogs-server", + 9009: "pichat", + 9010: "sdr", + 9020: "tambora", + 9021: "panagolin-ident", + 9022: "paragent", + 9023: "swa-1", + 9024: "swa-2", + 9025: "swa-3", + 9026: "swa-4", + 9050: "versiera", + 9051: "fio-cmgmt", + 9060: "CardWeb-IO", + 9080: "glrpc", + 9083: "emc-pp-mgmtsvc", + 9084: "aurora", + 9085: "ibm-rsyscon", + 9086: "net2display", + 9087: "classic", + 9088: "sqlexec", + 9089: "sqlexec-ssl", + 9090: "websm", + 9091: "xmltec-xmlmail", + 9092: "XmlIpcRegSvc", + 9093: "copycat", + 9100: "hp-pdl-datastr", + 9101: "bacula-dir", + 9102: "bacula-fd", + 9103: "bacula-sd", + 9104: "peerwire", + 9105: "xadmin", + 9106: "astergate", + 9107: "astergatefax", + 9119: "mxit", + 9122: "grcmp", + 9123: "grcp", + 9131: "dddp", + 9160: "apani1", + 9161: "apani2", + 9162: "apani3", + 9163: "apani4", + 9164: "apani5", + 9191: "sun-as-jpda", + 9200: "wap-wsp", + 9201: "wap-wsp-wtp", + 9202: "wap-wsp-s", + 9203: "wap-wsp-wtp-s", + 9204: "wap-vcard", + 9205: "wap-vcal", + 9206: "wap-vcard-s", + 9207: "wap-vcal-s", + 9208: "rjcdb-vcards", + 9209: "almobile-system", + 9210: "oma-mlp", + 9211: "oma-mlp-s", + 9212: "serverviewdbms", + 9213: "serverstart", + 9214: "ipdcesgbs", + 9215: "insis", + 9216: "acme", + 9217: "fsc-port", + 9222: "teamcoherence", + 9255: "mon", + 9278: "pegasus", + 9279: "pegasus-ctl", + 9280: "pgps", + 9281: "swtp-port1", + 9282: "swtp-port2", + 9283: "callwaveiam", + 9284: "visd", + 9285: "n2h2server", + 9287: "cumulus", + 9292: "armtechdaemon", + 9293: "storview", + 9294: "armcenterhttp", + 9295: "armcenterhttps", + 9300: "vrace", + 9306: "sphinxql", + 9312: "sphinxapi", + 9318: "secure-ts", + 9321: "guibase", + 9343: "mpidcmgr", + 9344: "mphlpdmc", + 9345: "rancher", + 9346: "ctechlicensing", + 9374: "fjdmimgr", + 9380: "boxp", + 9387: "d2dconfig", + 9388: "d2ddatatrans", + 9389: "adws", + 9390: "otp", + 9396: "fjinvmgr", + 9397: "mpidcagt", + 9400: "sec-t4net-srv", + 9401: "sec-t4net-clt", + 9402: "sec-pc2fax-srv", + 9418: "git", + 9443: "tungsten-https", + 9444: "wso2esb-console", + 9445: "mindarray-ca", + 9450: "sntlkeyssrvr", + 9500: "ismserver", + 9535: "mngsuite", + 9536: "laes-bf", + 9555: "trispen-sra", + 9592: "ldgateway", + 9593: "cba8", + 9594: "msgsys", + 9595: "pds", + 9596: "mercury-disc", + 9597: "pd-admin", + 9598: "vscp", + 9599: "robix", + 9600: "micromuse-ncpw", + 9612: "streamcomm-ds", + 9614: "iadt-tls", + 9616: "erunbook-agent", + 9617: "erunbook-server", + 9618: "condor", + 9628: "odbcpathway", + 9629: "uniport", + 9630: "peoctlr", + 9631: "peocoll", + 9640: "pqsflows", + 9666: "zoomcp", + 9667: "xmms2", + 9668: "tec5-sdctp", + 9694: "client-wakeup", + 9695: "ccnx", + 9700: "board-roar", + 9747: "l5nas-parchan", + 9750: "board-voip", + 9753: "rasadv", + 9762: "tungsten-http", + 9800: "davsrc", + 9801: "sstp-2", + 9802: "davsrcs", + 9875: "sapv1", + 9876: "sd", + 9888: "cyborg-systems", + 9889: "gt-proxy", + 9898: "monkeycom", + 9900: "iua", + 9909: "domaintime", + 9911: "sype-transport", + 9925: "xybrid-cloud", + 9950: "apc-9950", + 9951: "apc-9951", + 9952: "apc-9952", + 9953: "acis", + 9954: "hinp", + 9955: "alljoyn-stm", + 9966: "odnsp", + 9978: "xybrid-rt", + 9979: "visweather", + 9981: "pumpkindb", + 9987: "dsm-scm-target", + 9988: "nsesrvr", + 9990: "osm-appsrvr", + 9991: "osm-oev", + 9992: "palace-1", + 9993: "palace-2", + 9994: "palace-3", + 9995: "palace-4", + 9996: "palace-5", + 9997: "palace-6", + 9998: "distinct32", + 9999: "distinct", + 10000: "ndmp", + 10001: "scp-config", + 10002: "documentum", + 10003: "documentum-s", + 10004: "emcrmirccd", + 10005: "emcrmird", + 10006: "netapp-sync", + 10007: "mvs-capacity", + 10008: "octopus", + 10009: "swdtp-sv", + 10010: "rxapi", + 10020: "abb-hw", + 10050: "zabbix-agent", + 10051: "zabbix-trapper", + 10055: "qptlmd", + 10080: "amanda", + 10081: "famdc", + 10100: "itap-ddtp", + 10101: "ezmeeting-2", + 10102: "ezproxy-2", + 10103: "ezrelay", + 10104: "swdtp", + 10107: "bctp-server", + 10110: "nmea-0183", + 10113: "netiq-endpoint", + 10114: "netiq-qcheck", + 10115: "netiq-endpt", + 10116: "netiq-voipa", + 10117: "iqrm", + 10125: "cimple", + 10128: "bmc-perf-sd", + 10129: "bmc-gms", + 10160: "qb-db-server", + 10161: "snmptls", + 10162: "snmptls-trap", + 10200: "trisoap", + 10201: "rsms", + 10252: "apollo-relay", + 10260: "axis-wimp-port", + 10261: "tile-ml", + 10288: "blocks", + 10321: "cosir", + 10540: "MOS-lower", + 10541: "MOS-upper", + 10542: "MOS-aux", + 10543: "MOS-soap", + 10544: "MOS-soap-opt", + 10548: "serverdocs", + 10631: "printopia", + 10800: "gap", + 10805: "lpdg", + 10809: "nbd", + 10860: "helix", + 10880: "bveapi", + 10933: "octopustentacle", + 10990: "rmiaux", + 11000: "irisa", + 11001: "metasys", + 11095: "weave", + 11103: "origo-sync", + 11104: "netapp-icmgmt", + 11105: "netapp-icdata", + 11106: "sgi-lk", + 11109: "sgi-dmfmgr", + 11110: "sgi-soap", + 11111: "vce", + 11112: "dicom", + 11161: "suncacao-snmp", + 11162: "suncacao-jmxmp", + 11163: "suncacao-rmi", + 11164: "suncacao-csa", + 11165: "suncacao-websvc", + 11172: "oemcacao-jmxmp", + 11173: "t5-straton", + 11174: "oemcacao-rmi", + 11175: "oemcacao-websvc", + 11201: "smsqp", + 11202: "dcsl-backup", + 11208: "wifree", + 11211: "memcache", + 11319: "imip", + 11320: "imip-channels", + 11321: "arena-server", + 11367: "atm-uhas", + 11371: "hkp", + 11489: "asgcypresstcps", + 11600: "tempest-port", + 11623: "emc-xsw-dconfig", + 11720: "h323callsigalt", + 11723: "emc-xsw-dcache", + 11751: "intrepid-ssl", + 11796: "lanschool", + 11876: "xoraya", + 11967: "sysinfo-sp", + 12000: "entextxid", + 12001: "entextnetwk", + 12002: "entexthigh", + 12003: "entextmed", + 12004: "entextlow", + 12005: "dbisamserver1", + 12006: "dbisamserver2", + 12007: "accuracer", + 12008: "accuracer-dbms", + 12010: "edbsrvr", + 12012: "vipera", + 12013: "vipera-ssl", + 12109: "rets-ssl", + 12121: "nupaper-ss", + 12168: "cawas", + 12172: "hivep", + 12300: "linogridengine", + 12302: "rads", + 12321: "warehouse-sss", + 12322: "warehouse", + 12345: "italk", + 12753: "tsaf", + 12865: "netperf", + 13160: "i-zipqd", + 13216: "bcslogc", + 13217: "rs-pias", + 13218: "emc-vcas-tcp", + 13223: "powwow-client", + 13224: "powwow-server", + 13400: "doip-data", + 13720: "bprd", + 13721: "bpdbm", + 13722: "bpjava-msvc", + 13724: "vnetd", + 13782: "bpcd", + 13783: "vopied", + 13785: "nbdb", + 13786: "nomdb", + 13818: "dsmcc-config", + 13819: "dsmcc-session", + 13820: "dsmcc-passthru", + 13821: "dsmcc-download", + 13822: "dsmcc-ccp", + 13823: "bmdss", + 13894: "ucontrol", + 13929: "dta-systems", + 13930: "medevolve", + 14000: "scotty-ft", + 14001: "sua", + 14033: "sage-best-com1", + 14034: "sage-best-com2", + 14141: "vcs-app", + 14142: "icpp", + 14143: "icpps", + 14145: "gcm-app", + 14149: "vrts-tdd", + 14150: "vcscmd", + 14154: "vad", + 14250: "cps", + 14414: "ca-web-update", + 14500: "xpra", + 14936: "hde-lcesrvr-1", + 14937: "hde-lcesrvr-2", + 15000: "hydap", + 15002: "onep-tls", + 15345: "xpilot", + 15363: "3link", + 15555: "cisco-snat", + 15660: "bex-xr", + 15740: "ptp", + 15999: "programmar", + 16000: "fmsas", + 16001: "fmsascon", + 16002: "gsms", + 16020: "jwpc", + 16021: "jwpc-bin", + 16161: "sun-sea-port", + 16162: "solaris-audit", + 16309: "etb4j", + 16310: "pduncs", + 16311: "pdefmns", + 16360: "netserialext1", + 16361: "netserialext2", + 16367: "netserialext3", + 16368: "netserialext4", + 16384: "connected", + 16385: "rdgs", + 16619: "xoms", + 16665: "axon-tunnel", + 16789: "cadsisvr", + 16900: "newbay-snc-mc", + 16950: "sgcip", + 16991: "intel-rci-mp", + 16992: "amt-soap-http", + 16993: "amt-soap-https", + 16994: "amt-redir-tcp", + 16995: "amt-redir-tls", + 17007: "isode-dua", + 17184: "vestasdlp", + 17185: "soundsvirtual", + 17219: "chipper", + 17220: "avtp", + 17221: "avdecc", + 17223: "isa100-gci", + 17225: "trdp-md", + 17234: "integrius-stp", + 17235: "ssh-mgmt", + 17500: "db-lsp", + 17555: "ailith", + 17729: "ea", + 17754: "zep", + 17755: "zigbee-ip", + 17756: "zigbee-ips", + 17777: "sw-orion", + 18000: "biimenu", + 18104: "radpdf", + 18136: "racf", + 18181: "opsec-cvp", + 18182: "opsec-ufp", + 18183: "opsec-sam", + 18184: "opsec-lea", + 18185: "opsec-omi", + 18186: "ohsc", + 18187: "opsec-ela", + 18241: "checkpoint-rtm", + 18242: "iclid", + 18243: "clusterxl", + 18262: "gv-pf", + 18463: "ac-cluster", + 18634: "rds-ib", + 18635: "rds-ip", + 18668: "vdmmesh", + 18769: "ique", + 18881: "infotos", + 18888: "apc-necmp", + 19000: "igrid", + 19007: "scintilla", + 19020: "j-link", + 19191: "opsec-uaa", + 19194: "ua-secureagent", + 19220: "cora", + 19283: "keysrvr", + 19315: "keyshadow", + 19398: "mtrgtrans", + 19410: "hp-sco", + 19411: "hp-sca", + 19412: "hp-sessmon", + 19539: "fxuptp", + 19540: "sxuptp", + 19541: "jcp", + 19998: "iec-104-sec", + 19999: "dnp-sec", + 20000: "dnp", + 20001: "microsan", + 20002: "commtact-http", + 20003: "commtact-https", + 20005: "openwebnet", + 20013: "ss-idi", + 20014: "opendeploy", + 20034: "nburn-id", + 20046: "tmophl7mts", + 20048: "mountd", + 20049: "nfsrdma", + 20057: "avesterra", + 20167: "tolfab", + 20202: "ipdtp-port", + 20222: "ipulse-ics", + 20480: "emwavemsg", + 20670: "track", + 20999: "athand-mmp", + 21000: "irtrans", + 21010: "notezilla-lan", + 21221: "aigairserver", + 21553: "rdm-tfs", + 21554: "dfserver", + 21590: "vofr-gateway", + 21800: "tvpm", + 21845: "webphone", + 21846: "netspeak-is", + 21847: "netspeak-cs", + 21848: "netspeak-acd", + 21849: "netspeak-cps", + 22000: "snapenetio", + 22001: "optocontrol", + 22002: "optohost002", + 22003: "optohost003", + 22004: "optohost004", + 22005: "optohost004", + 22125: "dcap", + 22128: "gsidcap", + 22222: "easyengine", + 22273: "wnn6", + 22305: "cis", + 22335: "shrewd-control", + 22343: "cis-secure", + 22347: "wibukey", + 22350: "codemeter", + 22351: "codemeter-cmwan", + 22537: "caldsoft-backup", + 22555: "vocaltec-wconf", + 22763: "talikaserver", + 22800: "aws-brf", + 22951: "brf-gw", + 23000: "inovaport1", + 23001: "inovaport2", + 23002: "inovaport3", + 23003: "inovaport4", + 23004: "inovaport5", + 23005: "inovaport6", + 23053: "gntp", + 23294: "5afe-dir", + 23333: "elxmgmt", + 23400: "novar-dbase", + 23401: "novar-alarm", + 23402: "novar-global", + 23456: "aequus", + 23457: "aequus-alt", + 23546: "areaguard-neo", + 24000: "med-ltp", + 24001: "med-fsp-rx", + 24002: "med-fsp-tx", + 24003: "med-supp", + 24004: "med-ovw", + 24005: "med-ci", + 24006: "med-net-svc", + 24242: "filesphere", + 24249: "vista-4gl", + 24321: "ild", + 24386: "intel-rci", + 24465: "tonidods", + 24554: "binkp", + 24577: "bilobit", + 24666: "sdtvwcam", + 24676: "canditv", + 24677: "flashfiler", + 24678: "proactivate", + 24680: "tcc-http", + 24754: "cslg", + 24922: "find", + 25000: "icl-twobase1", + 25001: "icl-twobase2", + 25002: "icl-twobase3", + 25003: "icl-twobase4", + 25004: "icl-twobase5", + 25005: "icl-twobase6", + 25006: "icl-twobase7", + 25007: "icl-twobase8", + 25008: "icl-twobase9", + 25009: "icl-twobase10", + 25576: "sauterdongle", + 25604: "idtp", + 25793: "vocaltec-hos", + 25900: "tasp-net", + 25901: "niobserver", + 25902: "nilinkanalyst", + 25903: "niprobe", + 26000: "quake", + 26133: "scscp", + 26208: "wnn6-ds", + 26257: "cockroach", + 26260: "ezproxy", + 26261: "ezmeeting", + 26262: "k3software-svr", + 26263: "k3software-cli", + 26486: "exoline-tcp", + 26487: "exoconfig", + 26489: "exonet", + 27345: "imagepump", + 27442: "jesmsjc", + 27504: "kopek-httphead", + 27782: "ars-vista", + 27876: "astrolink", + 27999: "tw-auth-key", + 28000: "nxlmd", + 28001: "pqsp", + 28200: "voxelstorm", + 28240: "siemensgsm", + 28589: "bosswave", + 29167: "otmp", + 29999: "bingbang", + 30000: "ndmps", + 30001: "pago-services1", + 30002: "pago-services2", + 30003: "amicon-fpsu-ra", + 30100: "rwp", + 30260: "kingdomsonline", + 30400: "gs-realtime", + 30999: "ovobs", + 31016: "ka-sddp", + 31020: "autotrac-acp", + 31400: "pace-licensed", + 31416: "xqosd", + 31457: "tetrinet", + 31620: "lm-mon", + 31685: "dsx-monitor", + 31765: "gamesmith-port", + 31948: "iceedcp-tx", + 31949: "iceedcp-rx", + 32034: "iracinghelper", + 32249: "t1distproc60", + 32400: "plex", + 32483: "apm-link", + 32635: "sec-ntb-clnt", + 32636: "DMExpress", + 32767: "filenet-powsrm", + 32768: "filenet-tms", + 32769: "filenet-rpc", + 32770: "filenet-nch", + 32771: "filenet-rmi", + 32772: "filenet-pa", + 32773: "filenet-cm", + 32774: "filenet-re", + 32775: "filenet-pch", + 32776: "filenet-peior", + 32777: "filenet-obrok", + 32801: "mlsn", + 32811: "retp", + 32896: "idmgratm", + 33060: "mysqlx", + 33123: "aurora-balaena", + 33331: "diamondport", + 33333: "dgi-serv", + 33334: "speedtrace", + 33434: "traceroute", + 33656: "snip-slave", + 34249: "turbonote-2", + 34378: "p-net-local", + 34379: "p-net-remote", + 34567: "dhanalakshmi", + 34962: "profinet-rt", + 34963: "profinet-rtm", + 34964: "profinet-cm", + 34980: "ethercat", + 35000: "heathview", + 35001: "rt-viewer", + 35002: "rt-sound", + 35003: "rt-devicemapper", + 35004: "rt-classmanager", + 35005: "rt-labtracker", + 35006: "rt-helper", + 35100: "axio-disc", + 35354: "kitim", + 35355: "altova-lm", + 35356: "guttersnex", + 35357: "openstack-id", + 36001: "allpeers", + 36524: "febooti-aw", + 36602: "observium-agent", + 36700: "mapx", + 36865: "kastenxpipe", + 37475: "neckar", + 37483: "gdrive-sync", + 37601: "eftp", + 37654: "unisys-eportal", + 38000: "ivs-database", + 38001: "ivs-insertion", + 38002: "cresco-control", + 38201: "galaxy7-data", + 38202: "fairview", + 38203: "agpolicy", + 38800: "sruth", + 38865: "secrmmsafecopya", + 39681: "turbonote-1", + 40000: "safetynetp", + 40404: "sptx", + 40841: "cscp", + 40842: "csccredir", + 40843: "csccfirewall", + 41111: "fs-qos", + 41121: "tentacle", + 41230: "z-wave-s", + 41794: "crestron-cip", + 41795: "crestron-ctp", + 41796: "crestron-cips", + 41797: "crestron-ctps", + 42508: "candp", + 42509: "candrp", + 42510: "caerpc", + 43000: "recvr-rc", + 43188: "reachout", + 43189: "ndm-agent-port", + 43190: "ip-provision", + 43191: "noit-transport", + 43210: "shaperai", + 43439: "eq3-update", + 43440: "ew-mgmt", + 43441: "ciscocsdb", + 44123: "z-wave-tunnel", + 44321: "pmcd", + 44322: "pmcdproxy", + 44323: "pmwebapi", + 44444: "cognex-dataman", + 44553: "rbr-debug", + 44818: "EtherNet-IP-2", + 44900: "m3da", + 45000: "asmp", + 45001: "asmps", + 45002: "rs-status", + 45045: "synctest", + 45054: "invision-ag", + 45514: "cloudcheck", + 45678: "eba", + 45824: "dai-shell", + 45825: "qdb2service", + 45966: "ssr-servermgr", + 46336: "inedo", + 46998: "spremotetablet", + 46999: "mediabox", + 47000: "mbus", + 47001: "winrm", + 47557: "dbbrowse", + 47624: "directplaysrvr", + 47806: "ap", + 47808: "bacnet", + 48000: "nimcontroller", + 48001: "nimspooler", + 48002: "nimhub", + 48003: "nimgtw", + 48004: "nimbusdb", + 48005: "nimbusdbctrl", + 48049: "3gpp-cbsp", + 48050: "weandsf", + 48128: "isnetserv", + 48129: "blp5", + 48556: "com-bardac-dw", + 48619: "iqobject", + 48653: "robotraconteur", + 49000: "matahari", + 49001: "nusrp", +} +var udpPortNames = map[UDPPort]string{ + 1: "tcpmux", + 2: "compressnet", + 3: "compressnet", + 5: "rje", + 7: "echo", + 9: "discard", + 11: "systat", + 13: "daytime", + 17: "qotd", + 18: "msp", + 19: "chargen", + 20: "ftp-data", + 21: "ftp", + 22: "ssh", + 23: "telnet", + 25: "smtp", + 27: "nsw-fe", + 29: "msg-icp", + 31: "msg-auth", + 33: "dsp", + 37: "time", + 38: "rap", + 39: "rlp", + 41: "graphics", + 42: "name", + 43: "nicname", + 44: "mpm-flags", + 45: "mpm", + 46: "mpm-snd", + 48: "auditd", + 49: "tacacs", + 50: "re-mail-ck", + 52: "xns-time", + 53: "domain", + 54: "xns-ch", + 55: "isi-gl", + 56: "xns-auth", + 58: "xns-mail", + 62: "acas", + 63: "whoispp", + 64: "covia", + 65: "tacacs-ds", + 66: "sql-net", + 67: "bootps", + 68: "bootpc", + 69: "tftp", + 70: "gopher", + 71: "netrjs-1", + 72: "netrjs-2", + 73: "netrjs-3", + 74: "netrjs-4", + 76: "deos", + 78: "vettcp", + 79: "finger", + 80: "http", + 82: "xfer", + 83: "mit-ml-dev", + 84: "ctf", + 85: "mit-ml-dev", + 86: "mfcobol", + 88: "kerberos", + 89: "su-mit-tg", + 90: "dnsix", + 91: "mit-dov", + 92: "npp", + 93: "dcp", + 94: "objcall", + 95: "supdup", + 96: "dixie", + 97: "swift-rvf", + 98: "tacnews", + 99: "metagram", + 101: "hostname", + 102: "iso-tsap", + 103: "gppitnp", + 104: "acr-nema", + 105: "cso", + 106: "3com-tsmux", + 107: "rtelnet", + 108: "snagas", + 109: "pop2", + 110: "pop3", + 111: "sunrpc", + 112: "mcidas", + 113: "auth", + 115: "sftp", + 116: "ansanotify", + 117: "uucp-path", + 118: "sqlserv", + 119: "nntp", + 120: "cfdptkt", + 121: "erpc", + 122: "smakynet", + 123: "ntp", + 124: "ansatrader", + 125: "locus-map", + 126: "nxedit", + 127: "locus-con", + 128: "gss-xlicen", + 129: "pwdgen", + 130: "cisco-fna", + 131: "cisco-tna", + 132: "cisco-sys", + 133: "statsrv", + 134: "ingres-net", + 135: "epmap", + 136: "profile", + 137: "netbios-ns", + 138: "netbios-dgm", + 139: "netbios-ssn", + 140: "emfis-data", + 141: "emfis-cntl", + 142: "bl-idm", + 143: "imap", + 144: "uma", + 145: "uaac", + 146: "iso-tp0", + 147: "iso-ip", + 148: "jargon", + 149: "aed-512", + 150: "sql-net", + 151: "hems", + 152: "bftp", + 153: "sgmp", + 154: "netsc-prod", + 155: "netsc-dev", + 156: "sqlsrv", + 157: "knet-cmp", + 158: "pcmail-srv", + 159: "nss-routing", + 160: "sgmp-traps", + 161: "snmp", + 162: "snmptrap", + 163: "cmip-man", + 164: "cmip-agent", + 165: "xns-courier", + 166: "s-net", + 167: "namp", + 168: "rsvd", + 169: "send", + 170: "print-srv", + 171: "multiplex", + 172: "cl-1", + 173: "xyplex-mux", + 174: "mailq", + 175: "vmnet", + 176: "genrad-mux", + 177: "xdmcp", + 178: "nextstep", + 179: "bgp", + 180: "ris", + 181: "unify", + 182: "audit", + 183: "ocbinder", + 184: "ocserver", + 185: "remote-kis", + 186: "kis", + 187: "aci", + 188: "mumps", + 189: "qft", + 190: "gacp", + 191: "prospero", + 192: "osu-nms", + 193: "srmp", + 194: "irc", + 195: "dn6-nlm-aud", + 196: "dn6-smm-red", + 197: "dls", + 198: "dls-mon", + 199: "smux", + 200: "src", + 201: "at-rtmp", + 202: "at-nbp", + 203: "at-3", + 204: "at-echo", + 205: "at-5", + 206: "at-zis", + 207: "at-7", + 208: "at-8", + 209: "qmtp", + 210: "z39-50", + 211: "914c-g", + 212: "anet", + 213: "ipx", + 214: "vmpwscs", + 215: "softpc", + 216: "CAIlic", + 217: "dbase", + 218: "mpp", + 219: "uarps", + 220: "imap3", + 221: "fln-spx", + 222: "rsh-spx", + 223: "cdc", + 224: "masqdialer", + 242: "direct", + 243: "sur-meas", + 244: "inbusiness", + 245: "link", + 246: "dsp3270", + 247: "subntbcst-tftp", + 248: "bhfhs", + 256: "rap", + 257: "set", + 259: "esro-gen", + 260: "openport", + 261: "nsiiops", + 262: "arcisdms", + 263: "hdap", + 264: "bgmp", + 265: "x-bone-ctl", + 266: "sst", + 267: "td-service", + 268: "td-replica", + 269: "manet", + 270: "gist", + 280: "http-mgmt", + 281: "personal-link", + 282: "cableport-ax", + 283: "rescap", + 284: "corerjd", + 286: "fxp", + 287: "k-block", + 308: "novastorbakcup", + 309: "entrusttime", + 310: "bhmds", + 311: "asip-webadmin", + 312: "vslmp", + 313: "magenta-logic", + 314: "opalis-robot", + 315: "dpsi", + 316: "decauth", + 317: "zannet", + 318: "pkix-timestamp", + 319: "ptp-event", + 320: "ptp-general", + 321: "pip", + 322: "rtsps", + 333: "texar", + 344: "pdap", + 345: "pawserv", + 346: "zserv", + 347: "fatserv", + 348: "csi-sgwp", + 349: "mftp", + 350: "matip-type-a", + 351: "matip-type-b", + 352: "dtag-ste-sb", + 353: "ndsauth", + 354: "bh611", + 355: "datex-asn", + 356: "cloanto-net-1", + 357: "bhevent", + 358: "shrinkwrap", + 359: "nsrmp", + 360: "scoi2odialog", + 361: "semantix", + 362: "srssend", + 363: "rsvp-tunnel", + 364: "aurora-cmgr", + 365: "dtk", + 366: "odmr", + 367: "mortgageware", + 368: "qbikgdp", + 369: "rpc2portmap", + 370: "codaauth2", + 371: "clearcase", + 372: "ulistproc", + 373: "legent-1", + 374: "legent-2", + 375: "hassle", + 376: "nip", + 377: "tnETOS", + 378: "dsETOS", + 379: "is99c", + 380: "is99s", + 381: "hp-collector", + 382: "hp-managed-node", + 383: "hp-alarm-mgr", + 384: "arns", + 385: "ibm-app", + 386: "asa", + 387: "aurp", + 388: "unidata-ldm", + 389: "ldap", + 390: "uis", + 391: "synotics-relay", + 392: "synotics-broker", + 393: "meta5", + 394: "embl-ndt", + 395: "netcp", + 396: "netware-ip", + 397: "mptn", + 398: "kryptolan", + 399: "iso-tsap-c2", + 400: "osb-sd", + 401: "ups", + 402: "genie", + 403: "decap", + 404: "nced", + 405: "ncld", + 406: "imsp", + 407: "timbuktu", + 408: "prm-sm", + 409: "prm-nm", + 410: "decladebug", + 411: "rmt", + 412: "synoptics-trap", + 413: "smsp", + 414: "infoseek", + 415: "bnet", + 416: "silverplatter", + 417: "onmux", + 418: "hyper-g", + 419: "ariel1", + 420: "smpte", + 421: "ariel2", + 422: "ariel3", + 423: "opc-job-start", + 424: "opc-job-track", + 425: "icad-el", + 426: "smartsdp", + 427: "svrloc", + 428: "ocs-cmu", + 429: "ocs-amu", + 430: "utmpsd", + 431: "utmpcd", + 432: "iasd", + 433: "nnsp", + 434: "mobileip-agent", + 435: "mobilip-mn", + 436: "dna-cml", + 437: "comscm", + 438: "dsfgw", + 439: "dasp", + 440: "sgcp", + 441: "decvms-sysmgt", + 442: "cvc-hostd", + 443: "https", + 444: "snpp", + 445: "microsoft-ds", + 446: "ddm-rdb", + 447: "ddm-dfm", + 448: "ddm-ssl", + 449: "as-servermap", + 450: "tserver", + 451: "sfs-smp-net", + 452: "sfs-config", + 453: "creativeserver", + 454: "contentserver", + 455: "creativepartnr", + 456: "macon-udp", + 457: "scohelp", + 458: "appleqtc", + 459: "ampr-rcmd", + 460: "skronk", + 461: "datasurfsrv", + 462: "datasurfsrvsec", + 463: "alpes", + 464: "kpasswd", + 465: "igmpv3lite", + 466: "digital-vrc", + 467: "mylex-mapd", + 468: "photuris", + 469: "rcp", + 470: "scx-proxy", + 471: "mondex", + 472: "ljk-login", + 473: "hybrid-pop", + 474: "tn-tl-w2", + 475: "tcpnethaspsrv", + 476: "tn-tl-fd1", + 477: "ss7ns", + 478: "spsc", + 479: "iafserver", + 480: "iafdbase", + 481: "ph", + 482: "bgs-nsi", + 483: "ulpnet", + 484: "integra-sme", + 485: "powerburst", + 486: "avian", + 487: "saft", + 488: "gss-http", + 489: "nest-protocol", + 490: "micom-pfs", + 491: "go-login", + 492: "ticf-1", + 493: "ticf-2", + 494: "pov-ray", + 495: "intecourier", + 496: "pim-rp-disc", + 497: "retrospect", + 498: "siam", + 499: "iso-ill", + 500: "isakmp", + 501: "stmf", + 502: "mbap", + 503: "intrinsa", + 504: "citadel", + 505: "mailbox-lm", + 506: "ohimsrv", + 507: "crs", + 508: "xvttp", + 509: "snare", + 510: "fcp", + 511: "passgo", + 512: "comsat", + 513: "who", + 514: "syslog", + 515: "printer", + 516: "videotex", + 517: "talk", + 518: "ntalk", + 519: "utime", + 520: "router", + 521: "ripng", + 522: "ulp", + 523: "ibm-db2", + 524: "ncp", + 525: "timed", + 526: "tempo", + 527: "stx", + 528: "custix", + 529: "irc-serv", + 530: "courier", + 531: "conference", + 532: "netnews", + 533: "netwall", + 534: "windream", + 535: "iiop", + 536: "opalis-rdv", + 537: "nmsp", + 538: "gdomap", + 539: "apertus-ldp", + 540: "uucp", + 541: "uucp-rlogin", + 542: "commerce", + 543: "klogin", + 544: "kshell", + 545: "appleqtcsrvr", + 546: "dhcpv6-client", + 547: "dhcpv6-server", + 548: "afpovertcp", + 549: "idfp", + 550: "new-rwho", + 551: "cybercash", + 552: "devshr-nts", + 553: "pirp", + 554: "rtsp", + 555: "dsf", + 556: "remotefs", + 557: "openvms-sysipc", + 558: "sdnskmp", + 559: "teedtap", + 560: "rmonitor", + 561: "monitor", + 562: "chshell", + 563: "nntps", + 564: "9pfs", + 565: "whoami", + 566: "streettalk", + 567: "banyan-rpc", + 568: "ms-shuttle", + 569: "ms-rome", + 570: "meter", + 571: "meter", + 572: "sonar", + 573: "banyan-vip", + 574: "ftp-agent", + 575: "vemmi", + 576: "ipcd", + 577: "vnas", + 578: "ipdd", + 579: "decbsrv", + 580: "sntp-heartbeat", + 581: "bdp", + 582: "scc-security", + 583: "philips-vc", + 584: "keyserver", + 586: "password-chg", + 587: "submission", + 588: "cal", + 589: "eyelink", + 590: "tns-cml", + 591: "http-alt", + 592: "eudora-set", + 593: "http-rpc-epmap", + 594: "tpip", + 595: "cab-protocol", + 596: "smsd", + 597: "ptcnameservice", + 598: "sco-websrvrmg3", + 599: "acp", + 600: "ipcserver", + 601: "syslog-conn", + 602: "xmlrpc-beep", + 603: "idxp", + 604: "tunnel", + 605: "soap-beep", + 606: "urm", + 607: "nqs", + 608: "sift-uft", + 609: "npmp-trap", + 610: "npmp-local", + 611: "npmp-gui", + 612: "hmmp-ind", + 613: "hmmp-op", + 614: "sshell", + 615: "sco-inetmgr", + 616: "sco-sysmgr", + 617: "sco-dtmgr", + 618: "dei-icda", + 619: "compaq-evm", + 620: "sco-websrvrmgr", + 621: "escp-ip", + 622: "collaborator", + 623: "asf-rmcp", + 624: "cryptoadmin", + 625: "dec-dlm", + 626: "asia", + 627: "passgo-tivoli", + 628: "qmqp", + 629: "3com-amp3", + 630: "rda", + 631: "ipp", + 632: "bmpp", + 633: "servstat", + 634: "ginad", + 635: "rlzdbase", + 636: "ldaps", + 637: "lanserver", + 638: "mcns-sec", + 639: "msdp", + 640: "entrust-sps", + 641: "repcmd", + 642: "esro-emsdp", + 643: "sanity", + 644: "dwr", + 645: "pssc", + 646: "ldp", + 647: "dhcp-failover", + 648: "rrp", + 649: "cadview-3d", + 650: "obex", + 651: "ieee-mms", + 652: "hello-port", + 653: "repscmd", + 654: "aodv", + 655: "tinc", + 656: "spmp", + 657: "rmc", + 658: "tenfold", + 660: "mac-srvr-admin", + 661: "hap", + 662: "pftp", + 663: "purenoise", + 664: "asf-secure-rmcp", + 665: "sun-dr", + 666: "mdqs", + 667: "disclose", + 668: "mecomm", + 669: "meregister", + 670: "vacdsm-sws", + 671: "vacdsm-app", + 672: "vpps-qua", + 673: "cimplex", + 674: "acap", + 675: "dctp", + 676: "vpps-via", + 677: "vpp", + 678: "ggf-ncp", + 679: "mrm", + 680: "entrust-aaas", + 681: "entrust-aams", + 682: "xfr", + 683: "corba-iiop", + 684: "corba-iiop-ssl", + 685: "mdc-portmapper", + 686: "hcp-wismar", + 687: "asipregistry", + 688: "realm-rusd", + 689: "nmap", + 690: "vatp", + 691: "msexch-routing", + 692: "hyperwave-isp", + 693: "connendp", + 694: "ha-cluster", + 695: "ieee-mms-ssl", + 696: "rushd", + 697: "uuidgen", + 698: "olsr", + 699: "accessnetwork", + 700: "epp", + 701: "lmp", + 702: "iris-beep", + 704: "elcsd", + 705: "agentx", + 706: "silc", + 707: "borland-dsj", + 709: "entrust-kmsh", + 710: "entrust-ash", + 711: "cisco-tdp", + 712: "tbrpf", + 713: "iris-xpc", + 714: "iris-xpcs", + 715: "iris-lwz", + 716: "pana", + 729: "netviewdm1", + 730: "netviewdm2", + 731: "netviewdm3", + 741: "netgw", + 742: "netrcs", + 744: "flexlm", + 747: "fujitsu-dev", + 748: "ris-cm", + 749: "kerberos-adm", + 750: "loadav", + 751: "pump", + 752: "qrh", + 753: "rrh", + 754: "tell", + 758: "nlogin", + 759: "con", + 760: "ns", + 761: "rxe", + 762: "quotad", + 763: "cycleserv", + 764: "omserv", + 765: "webster", + 767: "phonebook", + 769: "vid", + 770: "cadlock", + 771: "rtip", + 772: "cycleserv2", + 773: "notify", + 774: "acmaint-dbd", + 775: "acmaint-transd", + 776: "wpages", + 777: "multiling-http", + 780: "wpgs", + 800: "mdbs-daemon", + 801: "device", + 802: "mbap-s", + 810: "fcp-udp", + 828: "itm-mcell-s", + 829: "pkix-3-ca-ra", + 830: "netconf-ssh", + 831: "netconf-beep", + 832: "netconfsoaphttp", + 833: "netconfsoapbeep", + 847: "dhcp-failover2", + 848: "gdoi", + 853: "domain-s", + 854: "dlep", + 860: "iscsi", + 861: "owamp-control", + 862: "twamp-control", + 873: "rsync", + 886: "iclcnet-locate", + 887: "iclcnet-svinfo", + 888: "accessbuilder", + 900: "omginitialrefs", + 901: "smpnameres", + 902: "ideafarm-door", + 903: "ideafarm-panic", + 910: "kink", + 911: "xact-backup", + 912: "apex-mesh", + 913: "apex-edge", + 989: "ftps-data", + 990: "ftps", + 991: "nas", + 992: "telnets", + 993: "imaps", + 995: "pop3s", + 996: "vsinet", + 997: "maitrd", + 998: "puparp", + 999: "applix", + 1000: "cadlock2", + 1010: "surf", + 1021: "exp1", + 1022: "exp2", + 1025: "blackjack", + 1026: "cap", + 1027: "6a44", + 1029: "solid-mux", + 1033: "netinfo-local", + 1034: "activesync", + 1035: "mxxrlogin", + 1036: "nsstp", + 1037: "ams", + 1038: "mtqp", + 1039: "sbl", + 1040: "netarx", + 1041: "danf-ak2", + 1042: "afrog", + 1043: "boinc-client", + 1044: "dcutility", + 1045: "fpitp", + 1046: "wfremotertm", + 1047: "neod1", + 1048: "neod2", + 1049: "td-postman", + 1050: "cma", + 1051: "optima-vnet", + 1052: "ddt", + 1053: "remote-as", + 1054: "brvread", + 1055: "ansyslmd", + 1056: "vfo", + 1057: "startron", + 1058: "nim", + 1059: "nimreg", + 1060: "polestar", + 1061: "kiosk", + 1062: "veracity", + 1063: "kyoceranetdev", + 1064: "jstel", + 1065: "syscomlan", + 1066: "fpo-fns", + 1067: "instl-boots", + 1068: "instl-bootc", + 1069: "cognex-insight", + 1070: "gmrupdateserv", + 1071: "bsquare-voip", + 1072: "cardax", + 1073: "bridgecontrol", + 1074: "warmspotMgmt", + 1075: "rdrmshc", + 1076: "dab-sti-c", + 1077: "imgames", + 1078: "avocent-proxy", + 1079: "asprovatalk", + 1080: "socks", + 1081: "pvuniwien", + 1082: "amt-esd-prot", + 1083: "ansoft-lm-1", + 1084: "ansoft-lm-2", + 1085: "webobjects", + 1086: "cplscrambler-lg", + 1087: "cplscrambler-in", + 1088: "cplscrambler-al", + 1089: "ff-annunc", + 1090: "ff-fms", + 1091: "ff-sm", + 1092: "obrpd", + 1093: "proofd", + 1094: "rootd", + 1095: "nicelink", + 1096: "cnrprotocol", + 1097: "sunclustermgr", + 1098: "rmiactivation", + 1099: "rmiregistry", + 1100: "mctp", + 1101: "pt2-discover", + 1102: "adobeserver-1", + 1103: "adobeserver-2", + 1104: "xrl", + 1105: "ftranhc", + 1106: "isoipsigport-1", + 1107: "isoipsigport-2", + 1108: "ratio-adp", + 1110: "nfsd-keepalive", + 1111: "lmsocialserver", + 1112: "icp", + 1113: "ltp-deepspace", + 1114: "mini-sql", + 1115: "ardus-trns", + 1116: "ardus-cntl", + 1117: "ardus-mtrns", + 1118: "sacred", + 1119: "bnetgame", + 1120: "bnetfile", + 1121: "rmpp", + 1122: "availant-mgr", + 1123: "murray", + 1124: "hpvmmcontrol", + 1125: "hpvmmagent", + 1126: "hpvmmdata", + 1127: "kwdb-commn", + 1128: "saphostctrl", + 1129: "saphostctrls", + 1130: "casp", + 1131: "caspssl", + 1132: "kvm-via-ip", + 1133: "dfn", + 1134: "aplx", + 1135: "omnivision", + 1136: "hhb-gateway", + 1137: "trim", + 1138: "encrypted-admin", + 1139: "evm", + 1140: "autonoc", + 1141: "mxomss", + 1142: "edtools", + 1143: "imyx", + 1144: "fuscript", + 1145: "x9-icue", + 1146: "audit-transfer", + 1147: "capioverlan", + 1148: "elfiq-repl", + 1149: "bvtsonar", + 1150: "blaze", + 1151: "unizensus", + 1152: "winpoplanmess", + 1153: "c1222-acse", + 1154: "resacommunity", + 1155: "nfa", + 1156: "iascontrol-oms", + 1157: "iascontrol", + 1158: "dbcontrol-oms", + 1159: "oracle-oms", + 1160: "olsv", + 1161: "health-polling", + 1162: "health-trap", + 1163: "sddp", + 1164: "qsm-proxy", + 1165: "qsm-gui", + 1166: "qsm-remote", + 1167: "cisco-ipsla", + 1168: "vchat", + 1169: "tripwire", + 1170: "atc-lm", + 1171: "atc-appserver", + 1172: "dnap", + 1173: "d-cinema-rrp", + 1174: "fnet-remote-ui", + 1175: "dossier", + 1176: "indigo-server", + 1177: "dkmessenger", + 1178: "sgi-storman", + 1179: "b2n", + 1180: "mc-client", + 1181: "3comnetman", + 1182: "accelenet-data", + 1183: "llsurfup-http", + 1184: "llsurfup-https", + 1185: "catchpole", + 1186: "mysql-cluster", + 1187: "alias", + 1188: "hp-webadmin", + 1189: "unet", + 1190: "commlinx-avl", + 1191: "gpfs", + 1192: "caids-sensor", + 1193: "fiveacross", + 1194: "openvpn", + 1195: "rsf-1", + 1196: "netmagic", + 1197: "carrius-rshell", + 1198: "cajo-discovery", + 1199: "dmidi", + 1200: "scol", + 1201: "nucleus-sand", + 1202: "caiccipc", + 1203: "ssslic-mgr", + 1204: "ssslog-mgr", + 1205: "accord-mgc", + 1206: "anthony-data", + 1207: "metasage", + 1208: "seagull-ais", + 1209: "ipcd3", + 1210: "eoss", + 1211: "groove-dpp", + 1212: "lupa", + 1213: "mpc-lifenet", + 1214: "kazaa", + 1215: "scanstat-1", + 1216: "etebac5", + 1217: "hpss-ndapi", + 1218: "aeroflight-ads", + 1219: "aeroflight-ret", + 1220: "qt-serveradmin", + 1221: "sweetware-apps", + 1222: "nerv", + 1223: "tgp", + 1224: "vpnz", + 1225: "slinkysearch", + 1226: "stgxfws", + 1227: "dns2go", + 1228: "florence", + 1229: "zented", + 1230: "periscope", + 1231: "menandmice-lpm", + 1232: "first-defense", + 1233: "univ-appserver", + 1234: "search-agent", + 1235: "mosaicsyssvc1", + 1236: "bvcontrol", + 1237: "tsdos390", + 1238: "hacl-qs", + 1239: "nmsd", + 1240: "instantia", + 1241: "nessus", + 1242: "nmasoverip", + 1243: "serialgateway", + 1244: "isbconference1", + 1245: "isbconference2", + 1246: "payrouter", + 1247: "visionpyramid", + 1248: "hermes", + 1249: "mesavistaco", + 1250: "swldy-sias", + 1251: "servergraph", + 1252: "bspne-pcc", + 1253: "q55-pcc", + 1254: "de-noc", + 1255: "de-cache-query", + 1256: "de-server", + 1257: "shockwave2", + 1258: "opennl", + 1259: "opennl-voice", + 1260: "ibm-ssd", + 1261: "mpshrsv", + 1262: "qnts-orb", + 1263: "dka", + 1264: "prat", + 1265: "dssiapi", + 1266: "dellpwrappks", + 1267: "epc", + 1268: "propel-msgsys", + 1269: "watilapp", + 1270: "opsmgr", + 1271: "excw", + 1272: "cspmlockmgr", + 1273: "emc-gateway", + 1274: "t1distproc", + 1275: "ivcollector", + 1277: "miva-mqs", + 1278: "dellwebadmin-1", + 1279: "dellwebadmin-2", + 1280: "pictrography", + 1281: "healthd", + 1282: "emperion", + 1283: "productinfo", + 1284: "iee-qfx", + 1285: "neoiface", + 1286: "netuitive", + 1287: "routematch", + 1288: "navbuddy", + 1289: "jwalkserver", + 1290: "winjaserver", + 1291: "seagulllms", + 1292: "dsdn", + 1293: "pkt-krb-ipsec", + 1294: "cmmdriver", + 1295: "ehtp", + 1296: "dproxy", + 1297: "sdproxy", + 1298: "lpcp", + 1299: "hp-sci", + 1300: "h323hostcallsc", + 1301: "ci3-software-1", + 1302: "ci3-software-2", + 1303: "sftsrv", + 1304: "boomerang", + 1305: "pe-mike", + 1306: "re-conn-proto", + 1307: "pacmand", + 1308: "odsi", + 1309: "jtag-server", + 1310: "husky", + 1311: "rxmon", + 1312: "sti-envision", + 1313: "bmc-patroldb", + 1314: "pdps", + 1315: "els", + 1316: "exbit-escp", + 1317: "vrts-ipcserver", + 1318: "krb5gatekeeper", + 1319: "amx-icsp", + 1320: "amx-axbnet", + 1321: "pip", + 1322: "novation", + 1323: "brcd", + 1324: "delta-mcp", + 1325: "dx-instrument", + 1326: "wimsic", + 1327: "ultrex", + 1328: "ewall", + 1329: "netdb-export", + 1330: "streetperfect", + 1331: "intersan", + 1332: "pcia-rxp-b", + 1333: "passwrd-policy", + 1334: "writesrv", + 1335: "digital-notary", + 1336: "ischat", + 1337: "menandmice-dns", + 1338: "wmc-log-svc", + 1339: "kjtsiteserver", + 1340: "naap", + 1341: "qubes", + 1342: "esbroker", + 1343: "re101", + 1344: "icap", + 1345: "vpjp", + 1346: "alta-ana-lm", + 1347: "bbn-mmc", + 1348: "bbn-mmx", + 1349: "sbook", + 1350: "editbench", + 1351: "equationbuilder", + 1352: "lotusnote", + 1353: "relief", + 1354: "XSIP-network", + 1355: "intuitive-edge", + 1356: "cuillamartin", + 1357: "pegboard", + 1358: "connlcli", + 1359: "ftsrv", + 1360: "mimer", + 1361: "linx", + 1362: "timeflies", + 1363: "ndm-requester", + 1364: "ndm-server", + 1365: "adapt-sna", + 1366: "netware-csp", + 1367: "dcs", + 1368: "screencast", + 1369: "gv-us", + 1370: "us-gv", + 1371: "fc-cli", + 1372: "fc-ser", + 1373: "chromagrafx", + 1374: "molly", + 1375: "bytex", + 1376: "ibm-pps", + 1377: "cichlid", + 1378: "elan", + 1379: "dbreporter", + 1380: "telesis-licman", + 1381: "apple-licman", + 1382: "udt-os", + 1383: "gwha", + 1384: "os-licman", + 1385: "atex-elmd", + 1386: "checksum", + 1387: "cadsi-lm", + 1388: "objective-dbc", + 1389: "iclpv-dm", + 1390: "iclpv-sc", + 1391: "iclpv-sas", + 1392: "iclpv-pm", + 1393: "iclpv-nls", + 1394: "iclpv-nlc", + 1395: "iclpv-wsm", + 1396: "dvl-activemail", + 1397: "audio-activmail", + 1398: "video-activmail", + 1399: "cadkey-licman", + 1400: "cadkey-tablet", + 1401: "goldleaf-licman", + 1402: "prm-sm-np", + 1403: "prm-nm-np", + 1404: "igi-lm", + 1405: "ibm-res", + 1406: "netlabs-lm", + 1408: "sophia-lm", + 1409: "here-lm", + 1410: "hiq", + 1411: "af", + 1412: "innosys", + 1413: "innosys-acl", + 1414: "ibm-mqseries", + 1415: "dbstar", + 1416: "novell-lu6-2", + 1417: "timbuktu-srv1", + 1418: "timbuktu-srv2", + 1419: "timbuktu-srv3", + 1420: "timbuktu-srv4", + 1421: "gandalf-lm", + 1422: "autodesk-lm", + 1423: "essbase", + 1424: "hybrid", + 1425: "zion-lm", + 1426: "sais", + 1427: "mloadd", + 1428: "informatik-lm", + 1429: "nms", + 1430: "tpdu", + 1431: "rgtp", + 1432: "blueberry-lm", + 1433: "ms-sql-s", + 1434: "ms-sql-m", + 1435: "ibm-cics", + 1436: "saism", + 1437: "tabula", + 1438: "eicon-server", + 1439: "eicon-x25", + 1440: "eicon-slp", + 1441: "cadis-1", + 1442: "cadis-2", + 1443: "ies-lm", + 1444: "marcam-lm", + 1445: "proxima-lm", + 1446: "ora-lm", + 1447: "apri-lm", + 1448: "oc-lm", + 1449: "peport", + 1450: "dwf", + 1451: "infoman", + 1452: "gtegsc-lm", + 1453: "genie-lm", + 1454: "interhdl-elmd", + 1455: "esl-lm", + 1456: "dca", + 1457: "valisys-lm", + 1458: "nrcabq-lm", + 1459: "proshare1", + 1460: "proshare2", + 1461: "ibm-wrless-lan", + 1462: "world-lm", + 1463: "nucleus", + 1464: "msl-lmd", + 1465: "pipes", + 1466: "oceansoft-lm", + 1467: "csdmbase", + 1468: "csdm", + 1469: "aal-lm", + 1470: "uaiact", + 1471: "csdmbase", + 1472: "csdm", + 1473: "openmath", + 1474: "telefinder", + 1475: "taligent-lm", + 1476: "clvm-cfg", + 1477: "ms-sna-server", + 1478: "ms-sna-base", + 1479: "dberegister", + 1480: "pacerforum", + 1481: "airs", + 1482: "miteksys-lm", + 1483: "afs", + 1484: "confluent", + 1485: "lansource", + 1486: "nms-topo-serv", + 1487: "localinfosrvr", + 1488: "docstor", + 1489: "dmdocbroker", + 1490: "insitu-conf", + 1492: "stone-design-1", + 1493: "netmap-lm", + 1494: "ica", + 1495: "cvc", + 1496: "liberty-lm", + 1497: "rfx-lm", + 1498: "sybase-sqlany", + 1499: "fhc", + 1500: "vlsi-lm", + 1501: "saiscm", + 1502: "shivadiscovery", + 1503: "imtc-mcs", + 1504: "evb-elm", + 1505: "funkproxy", + 1506: "utcd", + 1507: "symplex", + 1508: "diagmond", + 1509: "robcad-lm", + 1510: "mvx-lm", + 1511: "3l-l1", + 1512: "wins", + 1513: "fujitsu-dtc", + 1514: "fujitsu-dtcns", + 1515: "ifor-protocol", + 1516: "vpad", + 1517: "vpac", + 1518: "vpvd", + 1519: "vpvc", + 1520: "atm-zip-office", + 1521: "ncube-lm", + 1522: "ricardo-lm", + 1523: "cichild-lm", + 1524: "ingreslock", + 1525: "orasrv", + 1526: "pdap-np", + 1527: "tlisrv", + 1528: "ngr-t", + 1529: "coauthor", + 1530: "rap-service", + 1531: "rap-listen", + 1532: "miroconnect", + 1533: "virtual-places", + 1534: "micromuse-lm", + 1535: "ampr-info", + 1536: "ampr-inter", + 1537: "sdsc-lm", + 1538: "3ds-lm", + 1539: "intellistor-lm", + 1540: "rds", + 1541: "rds2", + 1542: "gridgen-elmd", + 1543: "simba-cs", + 1544: "aspeclmd", + 1545: "vistium-share", + 1546: "abbaccuray", + 1547: "laplink", + 1548: "axon-lm", + 1549: "shivasound", + 1550: "3m-image-lm", + 1551: "hecmtl-db", + 1552: "pciarray", + 1553: "sna-cs", + 1554: "caci-lm", + 1555: "livelan", + 1556: "veritas-pbx", + 1557: "arbortext-lm", + 1558: "xingmpeg", + 1559: "web2host", + 1560: "asci-val", + 1561: "facilityview", + 1562: "pconnectmgr", + 1563: "cadabra-lm", + 1564: "pay-per-view", + 1565: "winddlb", + 1566: "corelvideo", + 1567: "jlicelmd", + 1568: "tsspmap", + 1569: "ets", + 1570: "orbixd", + 1571: "rdb-dbs-disp", + 1572: "chip-lm", + 1573: "itscomm-ns", + 1574: "mvel-lm", + 1575: "oraclenames", + 1576: "moldflow-lm", + 1577: "hypercube-lm", + 1578: "jacobus-lm", + 1579: "ioc-sea-lm", + 1580: "tn-tl-r2", + 1581: "mil-2045-47001", + 1582: "msims", + 1583: "simbaexpress", + 1584: "tn-tl-fd2", + 1585: "intv", + 1586: "ibm-abtact", + 1587: "pra-elmd", + 1588: "triquest-lm", + 1589: "vqp", + 1590: "gemini-lm", + 1591: "ncpm-pm", + 1592: "commonspace", + 1593: "mainsoft-lm", + 1594: "sixtrak", + 1595: "radio", + 1596: "radio-bc", + 1597: "orbplus-iiop", + 1598: "picknfs", + 1599: "simbaservices", + 1600: "issd", + 1601: "aas", + 1602: "inspect", + 1603: "picodbc", + 1604: "icabrowser", + 1605: "slp", + 1606: "slm-api", + 1607: "stt", + 1608: "smart-lm", + 1609: "isysg-lm", + 1610: "taurus-wh", + 1611: "ill", + 1612: "netbill-trans", + 1613: "netbill-keyrep", + 1614: "netbill-cred", + 1615: "netbill-auth", + 1616: "netbill-prod", + 1617: "nimrod-agent", + 1618: "skytelnet", + 1619: "xs-openstorage", + 1620: "faxportwinport", + 1621: "softdataphone", + 1622: "ontime", + 1623: "jaleosnd", + 1624: "udp-sr-port", + 1625: "svs-omagent", + 1626: "shockwave", + 1627: "t128-gateway", + 1628: "lontalk-norm", + 1629: "lontalk-urgnt", + 1630: "oraclenet8cman", + 1631: "visitview", + 1632: "pammratc", + 1633: "pammrpc", + 1634: "loaprobe", + 1635: "edb-server1", + 1636: "isdc", + 1637: "islc", + 1638: "ismc", + 1639: "cert-initiator", + 1640: "cert-responder", + 1641: "invision", + 1642: "isis-am", + 1643: "isis-ambc", + 1644: "saiseh", + 1645: "sightline", + 1646: "sa-msg-port", + 1647: "rsap", + 1648: "concurrent-lm", + 1649: "kermit", + 1650: "nkd", + 1651: "shiva-confsrvr", + 1652: "xnmp", + 1653: "alphatech-lm", + 1654: "stargatealerts", + 1655: "dec-mbadmin", + 1656: "dec-mbadmin-h", + 1657: "fujitsu-mmpdc", + 1658: "sixnetudr", + 1659: "sg-lm", + 1660: "skip-mc-gikreq", + 1661: "netview-aix-1", + 1662: "netview-aix-2", + 1663: "netview-aix-3", + 1664: "netview-aix-4", + 1665: "netview-aix-5", + 1666: "netview-aix-6", + 1667: "netview-aix-7", + 1668: "netview-aix-8", + 1669: "netview-aix-9", + 1670: "netview-aix-10", + 1671: "netview-aix-11", + 1672: "netview-aix-12", + 1673: "proshare-mc-1", + 1674: "proshare-mc-2", + 1675: "pdp", + 1676: "netcomm2", + 1677: "groupwise", + 1678: "prolink", + 1679: "darcorp-lm", + 1680: "microcom-sbp", + 1681: "sd-elmd", + 1682: "lanyon-lantern", + 1683: "ncpm-hip", + 1684: "snaresecure", + 1685: "n2nremote", + 1686: "cvmon", + 1687: "nsjtp-ctrl", + 1688: "nsjtp-data", + 1689: "firefox", + 1690: "ng-umds", + 1691: "empire-empuma", + 1692: "sstsys-lm", + 1693: "rrirtr", + 1694: "rrimwm", + 1695: "rrilwm", + 1696: "rrifmm", + 1697: "rrisat", + 1698: "rsvp-encap-1", + 1699: "rsvp-encap-2", + 1700: "mps-raft", + 1701: "l2f", + 1702: "deskshare", + 1703: "hb-engine", + 1704: "bcs-broker", + 1705: "slingshot", + 1706: "jetform", + 1707: "vdmplay", + 1708: "gat-lmd", + 1709: "centra", + 1710: "impera", + 1711: "pptconference", + 1712: "registrar", + 1713: "conferencetalk", + 1714: "sesi-lm", + 1715: "houdini-lm", + 1716: "xmsg", + 1717: "fj-hdnet", + 1718: "h323gatedisc", + 1719: "h323gatestat", + 1720: "h323hostcall", + 1721: "caicci", + 1722: "hks-lm", + 1723: "pptp", + 1724: "csbphonemaster", + 1725: "iden-ralp", + 1726: "iberiagames", + 1727: "winddx", + 1728: "telindus", + 1729: "citynl", + 1730: "roketz", + 1731: "msiccp", + 1732: "proxim", + 1733: "siipat", + 1734: "cambertx-lm", + 1735: "privatechat", + 1736: "street-stream", + 1737: "ultimad", + 1738: "gamegen1", + 1739: "webaccess", + 1740: "encore", + 1741: "cisco-net-mgmt", + 1742: "3Com-nsd", + 1743: "cinegrfx-lm", + 1744: "ncpm-ft", + 1745: "remote-winsock", + 1746: "ftrapid-1", + 1747: "ftrapid-2", + 1748: "oracle-em1", + 1749: "aspen-services", + 1750: "sslp", + 1751: "swiftnet", + 1752: "lofr-lm", + 1754: "oracle-em2", + 1755: "ms-streaming", + 1756: "capfast-lmd", + 1757: "cnhrp", + 1758: "tftp-mcast", + 1759: "spss-lm", + 1760: "www-ldap-gw", + 1761: "cft-0", + 1762: "cft-1", + 1763: "cft-2", + 1764: "cft-3", + 1765: "cft-4", + 1766: "cft-5", + 1767: "cft-6", + 1768: "cft-7", + 1769: "bmc-net-adm", + 1770: "bmc-net-svc", + 1771: "vaultbase", + 1772: "essweb-gw", + 1773: "kmscontrol", + 1774: "global-dtserv", + 1776: "femis", + 1777: "powerguardian", + 1778: "prodigy-intrnet", + 1779: "pharmasoft", + 1780: "dpkeyserv", + 1781: "answersoft-lm", + 1782: "hp-hcip", + 1784: "finle-lm", + 1785: "windlm", + 1786: "funk-logger", + 1787: "funk-license", + 1788: "psmond", + 1789: "hello", + 1790: "nmsp", + 1791: "ea1", + 1792: "ibm-dt-2", + 1793: "rsc-robot", + 1794: "cera-bcm", + 1795: "dpi-proxy", + 1796: "vocaltec-admin", + 1797: "uma", + 1798: "etp", + 1799: "netrisk", + 1800: "ansys-lm", + 1801: "msmq", + 1802: "concomp1", + 1803: "hp-hcip-gwy", + 1804: "enl", + 1805: "enl-name", + 1806: "musiconline", + 1807: "fhsp", + 1808: "oracle-vp2", + 1809: "oracle-vp1", + 1810: "jerand-lm", + 1811: "scientia-sdb", + 1812: "radius", + 1813: "radius-acct", + 1814: "tdp-suite", + 1815: "mmpft", + 1816: "harp", + 1817: "rkb-oscs", + 1818: "etftp", + 1819: "plato-lm", + 1820: "mcagent", + 1821: "donnyworld", + 1822: "es-elmd", + 1823: "unisys-lm", + 1824: "metrics-pas", + 1825: "direcpc-video", + 1826: "ardt", + 1827: "asi", + 1828: "itm-mcell-u", + 1829: "optika-emedia", + 1830: "net8-cman", + 1831: "myrtle", + 1832: "tht-treasure", + 1833: "udpradio", + 1834: "ardusuni", + 1835: "ardusmul", + 1836: "ste-smsc", + 1837: "csoft1", + 1838: "talnet", + 1839: "netopia-vo1", + 1840: "netopia-vo2", + 1841: "netopia-vo3", + 1842: "netopia-vo4", + 1843: "netopia-vo5", + 1844: "direcpc-dll", + 1845: "altalink", + 1846: "tunstall-pnc", + 1847: "slp-notify", + 1848: "fjdocdist", + 1849: "alpha-sms", + 1850: "gsi", + 1851: "ctcd", + 1852: "virtual-time", + 1853: "vids-avtp", + 1854: "buddy-draw", + 1855: "fiorano-rtrsvc", + 1856: "fiorano-msgsvc", + 1857: "datacaptor", + 1858: "privateark", + 1859: "gammafetchsvr", + 1860: "sunscalar-svc", + 1861: "lecroy-vicp", + 1862: "mysql-cm-agent", + 1863: "msnp", + 1864: "paradym-31port", + 1865: "entp", + 1866: "swrmi", + 1867: "udrive", + 1868: "viziblebrowser", + 1869: "transact", + 1870: "sunscalar-dns", + 1871: "canocentral0", + 1872: "canocentral1", + 1873: "fjmpjps", + 1874: "fjswapsnp", + 1875: "westell-stats", + 1876: "ewcappsrv", + 1877: "hp-webqosdb", + 1878: "drmsmc", + 1879: "nettgain-nms", + 1880: "vsat-control", + 1881: "ibm-mqseries2", + 1882: "ecsqdmn", + 1883: "mqtt", + 1884: "idmaps", + 1885: "vrtstrapserver", + 1886: "leoip", + 1887: "filex-lport", + 1888: "ncconfig", + 1889: "unify-adapter", + 1890: "wilkenlistener", + 1891: "childkey-notif", + 1892: "childkey-ctrl", + 1893: "elad", + 1894: "o2server-port", + 1896: "b-novative-ls", + 1897: "metaagent", + 1898: "cymtec-port", + 1899: "mc2studios", + 1900: "ssdp", + 1901: "fjicl-tep-a", + 1902: "fjicl-tep-b", + 1903: "linkname", + 1904: "fjicl-tep-c", + 1905: "sugp", + 1906: "tpmd", + 1907: "intrastar", + 1908: "dawn", + 1909: "global-wlink", + 1910: "ultrabac", + 1911: "mtp", + 1912: "rhp-iibp", + 1913: "armadp", + 1914: "elm-momentum", + 1915: "facelink", + 1916: "persona", + 1917: "noagent", + 1918: "can-nds", + 1919: "can-dch", + 1920: "can-ferret", + 1921: "noadmin", + 1922: "tapestry", + 1923: "spice", + 1924: "xiip", + 1925: "discovery-port", + 1926: "egs", + 1927: "videte-cipc", + 1928: "emsd-port", + 1929: "bandwiz-system", + 1930: "driveappserver", + 1931: "amdsched", + 1932: "ctt-broker", + 1933: "xmapi", + 1934: "xaapi", + 1935: "macromedia-fcs", + 1936: "jetcmeserver", + 1937: "jwserver", + 1938: "jwclient", + 1939: "jvserver", + 1940: "jvclient", + 1941: "dic-aida", + 1942: "res", + 1943: "beeyond-media", + 1944: "close-combat", + 1945: "dialogic-elmd", + 1946: "tekpls", + 1947: "sentinelsrm", + 1948: "eye2eye", + 1949: "ismaeasdaqlive", + 1950: "ismaeasdaqtest", + 1951: "bcs-lmserver", + 1952: "mpnjsc", + 1953: "rapidbase", + 1954: "abr-api", + 1955: "abr-secure", + 1956: "vrtl-vmf-ds", + 1957: "unix-status", + 1958: "dxadmind", + 1959: "simp-all", + 1960: "nasmanager", + 1961: "bts-appserver", + 1962: "biap-mp", + 1963: "webmachine", + 1964: "solid-e-engine", + 1965: "tivoli-npm", + 1966: "slush", + 1967: "sns-quote", + 1968: "lipsinc", + 1969: "lipsinc1", + 1970: "netop-rc", + 1971: "netop-school", + 1972: "intersys-cache", + 1973: "dlsrap", + 1974: "drp", + 1975: "tcoflashagent", + 1976: "tcoregagent", + 1977: "tcoaddressbook", + 1978: "unisql", + 1979: "unisql-java", + 1980: "pearldoc-xact", + 1981: "p2pq", + 1982: "estamp", + 1983: "lhtp", + 1984: "bb", + 1985: "hsrp", + 1986: "licensedaemon", + 1987: "tr-rsrb-p1", + 1988: "tr-rsrb-p2", + 1989: "tr-rsrb-p3", + 1990: "stun-p1", + 1991: "stun-p2", + 1992: "stun-p3", + 1993: "snmp-tcp-port", + 1994: "stun-port", + 1995: "perf-port", + 1996: "tr-rsrb-port", + 1997: "gdp-port", + 1998: "x25-svc-port", + 1999: "tcp-id-port", + 2000: "cisco-sccp", + 2001: "wizard", + 2002: "globe", + 2003: "brutus", + 2004: "emce", + 2005: "oracle", + 2006: "raid-cd", + 2007: "raid-am", + 2008: "terminaldb", + 2009: "whosockami", + 2010: "pipe-server", + 2011: "servserv", + 2012: "raid-ac", + 2013: "raid-cd", + 2014: "raid-sf", + 2015: "raid-cs", + 2016: "bootserver", + 2017: "bootclient", + 2018: "rellpack", + 2019: "about", + 2020: "xinupageserver", + 2021: "xinuexpansion1", + 2022: "xinuexpansion2", + 2023: "xinuexpansion3", + 2024: "xinuexpansion4", + 2025: "xribs", + 2026: "scrabble", + 2027: "shadowserver", + 2028: "submitserver", + 2029: "hsrpv6", + 2030: "device2", + 2031: "mobrien-chat", + 2032: "blackboard", + 2033: "glogger", + 2034: "scoremgr", + 2035: "imsldoc", + 2036: "e-dpnet", + 2037: "applus", + 2038: "objectmanager", + 2039: "prizma", + 2040: "lam", + 2041: "interbase", + 2042: "isis", + 2043: "isis-bcast", + 2044: "rimsl", + 2045: "cdfunc", + 2046: "sdfunc", + 2047: "dls", + 2048: "dls-monitor", + 2049: "shilp", + 2050: "av-emb-config", + 2051: "epnsdp", + 2052: "clearvisn", + 2053: "lot105-ds-upd", + 2054: "weblogin", + 2055: "iop", + 2056: "omnisky", + 2057: "rich-cp", + 2058: "newwavesearch", + 2059: "bmc-messaging", + 2060: "teleniumdaemon", + 2061: "netmount", + 2062: "icg-swp", + 2063: "icg-bridge", + 2064: "icg-iprelay", + 2065: "dlsrpn", + 2066: "aura", + 2067: "dlswpn", + 2068: "avauthsrvprtcl", + 2069: "event-port", + 2070: "ah-esp-encap", + 2071: "acp-port", + 2072: "msync", + 2073: "gxs-data-port", + 2074: "vrtl-vmf-sa", + 2075: "newlixengine", + 2076: "newlixconfig", + 2077: "tsrmagt", + 2078: "tpcsrvr", + 2079: "idware-router", + 2080: "autodesk-nlm", + 2081: "kme-trap-port", + 2082: "infowave", + 2083: "radsec", + 2084: "sunclustergeo", + 2085: "ada-cip", + 2086: "gnunet", + 2087: "eli", + 2088: "ip-blf", + 2089: "sep", + 2090: "lrp", + 2091: "prp", + 2092: "descent3", + 2093: "nbx-cc", + 2094: "nbx-au", + 2095: "nbx-ser", + 2096: "nbx-dir", + 2097: "jetformpreview", + 2098: "dialog-port", + 2099: "h2250-annex-g", + 2100: "amiganetfs", + 2101: "rtcm-sc104", + 2102: "zephyr-srv", + 2103: "zephyr-clt", + 2104: "zephyr-hm", + 2105: "minipay", + 2106: "mzap", + 2107: "bintec-admin", + 2108: "comcam", + 2109: "ergolight", + 2110: "umsp", + 2111: "dsatp", + 2112: "idonix-metanet", + 2113: "hsl-storm", + 2114: "newheights", + 2115: "kdm", + 2116: "ccowcmr", + 2117: "mentaclient", + 2118: "mentaserver", + 2119: "gsigatekeeper", + 2120: "qencp", + 2121: "scientia-ssdb", + 2122: "caupc-remote", + 2123: "gtp-control", + 2124: "elatelink", + 2125: "lockstep", + 2126: "pktcable-cops", + 2127: "index-pc-wb", + 2128: "net-steward", + 2129: "cs-live", + 2130: "xds", + 2131: "avantageb2b", + 2132: "solera-epmap", + 2133: "zymed-zpp", + 2134: "avenue", + 2135: "gris", + 2136: "appworxsrv", + 2137: "connect", + 2138: "unbind-cluster", + 2139: "ias-auth", + 2140: "ias-reg", + 2141: "ias-admind", + 2142: "tdmoip", + 2143: "lv-jc", + 2144: "lv-ffx", + 2145: "lv-pici", + 2146: "lv-not", + 2147: "lv-auth", + 2148: "veritas-ucl", + 2149: "acptsys", + 2150: "dynamic3d", + 2151: "docent", + 2152: "gtp-user", + 2153: "ctlptc", + 2154: "stdptc", + 2155: "brdptc", + 2156: "trp", + 2157: "xnds", + 2158: "touchnetplus", + 2159: "gdbremote", + 2160: "apc-2160", + 2161: "apc-2161", + 2162: "navisphere", + 2163: "navisphere-sec", + 2164: "ddns-v3", + 2165: "x-bone-api", + 2166: "iwserver", + 2167: "raw-serial", + 2168: "easy-soft-mux", + 2169: "brain", + 2170: "eyetv", + 2171: "msfw-storage", + 2172: "msfw-s-storage", + 2173: "msfw-replica", + 2174: "msfw-array", + 2175: "airsync", + 2176: "rapi", + 2177: "qwave", + 2178: "bitspeer", + 2179: "vmrdp", + 2180: "mc-gt-srv", + 2181: "eforward", + 2182: "cgn-stat", + 2183: "cgn-config", + 2184: "nvd", + 2185: "onbase-dds", + 2186: "gtaua", + 2187: "ssmd", + 2190: "tivoconnect", + 2191: "tvbus", + 2192: "asdis", + 2193: "drwcs", + 2197: "mnp-exchange", + 2198: "onehome-remote", + 2199: "onehome-help", + 2200: "ici", + 2201: "ats", + 2202: "imtc-map", + 2203: "b2-runtime", + 2204: "b2-license", + 2205: "jps", + 2206: "hpocbus", + 2207: "hpssd", + 2208: "hpiod", + 2209: "rimf-ps", + 2210: "noaaport", + 2211: "emwin", + 2212: "leecoposserver", + 2213: "kali", + 2214: "rpi", + 2215: "ipcore", + 2216: "vtu-comms", + 2217: "gotodevice", + 2218: "bounzza", + 2219: "netiq-ncap", + 2220: "netiq", + 2221: "ethernet-ip-s", + 2222: "EtherNet-IP-1", + 2223: "rockwell-csp2", + 2224: "efi-mg", + 2226: "di-drm", + 2227: "di-msg", + 2228: "ehome-ms", + 2229: "datalens", + 2230: "queueadm", + 2231: "wimaxasncp", + 2232: "ivs-video", + 2233: "infocrypt", + 2234: "directplay", + 2235: "sercomm-wlink", + 2236: "nani", + 2237: "optech-port1-lm", + 2238: "aviva-sna", + 2239: "imagequery", + 2240: "recipe", + 2241: "ivsd", + 2242: "foliocorp", + 2243: "magicom", + 2244: "nmsserver", + 2245: "hao", + 2246: "pc-mta-addrmap", + 2247: "antidotemgrsvr", + 2248: "ums", + 2249: "rfmp", + 2250: "remote-collab", + 2251: "dif-port", + 2252: "njenet-ssl", + 2253: "dtv-chan-req", + 2254: "seispoc", + 2255: "vrtp", + 2256: "pcc-mfp", + 2257: "simple-tx-rx", + 2258: "rcts", + 2260: "apc-2260", + 2261: "comotionmaster", + 2262: "comotionback", + 2263: "ecwcfg", + 2264: "apx500api-1", + 2265: "apx500api-2", + 2266: "mfserver", + 2267: "ontobroker", + 2268: "amt", + 2269: "mikey", + 2270: "starschool", + 2271: "mmcals", + 2272: "mmcal", + 2273: "mysql-im", + 2274: "pcttunnell", + 2275: "ibridge-data", + 2276: "ibridge-mgmt", + 2277: "bluectrlproxy", + 2278: "s3db", + 2279: "xmquery", + 2280: "lnvpoller", + 2281: "lnvconsole", + 2282: "lnvalarm", + 2283: "lnvstatus", + 2284: "lnvmaps", + 2285: "lnvmailmon", + 2286: "nas-metering", + 2287: "dna", + 2288: "netml", + 2289: "dict-lookup", + 2290: "sonus-logging", + 2291: "eapsp", + 2292: "mib-streaming", + 2293: "npdbgmngr", + 2294: "konshus-lm", + 2295: "advant-lm", + 2296: "theta-lm", + 2297: "d2k-datamover1", + 2298: "d2k-datamover2", + 2299: "pc-telecommute", + 2300: "cvmmon", + 2301: "cpq-wbem", + 2302: "binderysupport", + 2303: "proxy-gateway", + 2304: "attachmate-uts", + 2305: "mt-scaleserver", + 2306: "tappi-boxnet", + 2307: "pehelp", + 2308: "sdhelp", + 2309: "sdserver", + 2310: "sdclient", + 2311: "messageservice", + 2312: "wanscaler", + 2313: "iapp", + 2314: "cr-websystems", + 2315: "precise-sft", + 2316: "sent-lm", + 2317: "attachmate-g32", + 2318: "cadencecontrol", + 2319: "infolibria", + 2320: "siebel-ns", + 2321: "rdlap", + 2322: "ofsd", + 2323: "3d-nfsd", + 2324: "cosmocall", + 2325: "ansysli", + 2326: "idcp", + 2327: "xingcsm", + 2328: "netrix-sftm", + 2329: "nvd", + 2330: "tscchat", + 2331: "agentview", + 2332: "rcc-host", + 2333: "snapp", + 2334: "ace-client", + 2335: "ace-proxy", + 2336: "appleugcontrol", + 2337: "ideesrv", + 2338: "norton-lambert", + 2339: "3com-webview", + 2340: "wrs-registry", + 2341: "xiostatus", + 2342: "manage-exec", + 2343: "nati-logos", + 2344: "fcmsys", + 2345: "dbm", + 2346: "redstorm-join", + 2347: "redstorm-find", + 2348: "redstorm-info", + 2349: "redstorm-diag", + 2350: "psbserver", + 2351: "psrserver", + 2352: "pslserver", + 2353: "pspserver", + 2354: "psprserver", + 2355: "psdbserver", + 2356: "gxtelmd", + 2357: "unihub-server", + 2358: "futrix", + 2359: "flukeserver", + 2360: "nexstorindltd", + 2361: "tl1", + 2362: "digiman", + 2363: "mediacntrlnfsd", + 2364: "oi-2000", + 2365: "dbref", + 2366: "qip-login", + 2367: "service-ctrl", + 2368: "opentable", + 2370: "l3-hbmon", + 2372: "lanmessenger", + 2381: "compaq-https", + 2382: "ms-olap3", + 2383: "ms-olap4", + 2384: "sd-capacity", + 2385: "sd-data", + 2386: "virtualtape", + 2387: "vsamredirector", + 2388: "mynahautostart", + 2389: "ovsessionmgr", + 2390: "rsmtp", + 2391: "3com-net-mgmt", + 2392: "tacticalauth", + 2393: "ms-olap1", + 2394: "ms-olap2", + 2395: "lan900-remote", + 2396: "wusage", + 2397: "ncl", + 2398: "orbiter", + 2399: "fmpro-fdal", + 2400: "opequus-server", + 2401: "cvspserver", + 2402: "taskmaster2000", + 2403: "taskmaster2000", + 2404: "iec-104", + 2405: "trc-netpoll", + 2406: "jediserver", + 2407: "orion", + 2409: "sns-protocol", + 2410: "vrts-registry", + 2411: "netwave-ap-mgmt", + 2412: "cdn", + 2413: "orion-rmi-reg", + 2414: "beeyond", + 2415: "codima-rtp", + 2416: "rmtserver", + 2417: "composit-server", + 2418: "cas", + 2419: "attachmate-s2s", + 2420: "dslremote-mgmt", + 2421: "g-talk", + 2422: "crmsbits", + 2423: "rnrp", + 2424: "kofax-svr", + 2425: "fjitsuappmgr", + 2426: "vcmp", + 2427: "mgcp-gateway", + 2428: "ott", + 2429: "ft-role", + 2430: "venus", + 2431: "venus-se", + 2432: "codasrv", + 2433: "codasrv-se", + 2434: "pxc-epmap", + 2435: "optilogic", + 2436: "topx", + 2437: "unicontrol", + 2438: "msp", + 2439: "sybasedbsynch", + 2440: "spearway", + 2441: "pvsw-inet", + 2442: "netangel", + 2443: "powerclientcsf", + 2444: "btpp2sectrans", + 2445: "dtn1", + 2446: "bues-service", + 2447: "ovwdb", + 2448: "hpppssvr", + 2449: "ratl", + 2450: "netadmin", + 2451: "netchat", + 2452: "snifferclient", + 2453: "madge-ltd", + 2454: "indx-dds", + 2455: "wago-io-system", + 2456: "altav-remmgt", + 2457: "rapido-ip", + 2458: "griffin", + 2459: "community", + 2460: "ms-theater", + 2461: "qadmifoper", + 2462: "qadmifevent", + 2463: "lsi-raid-mgmt", + 2464: "direcpc-si", + 2465: "lbm", + 2466: "lbf", + 2467: "high-criteria", + 2468: "qip-msgd", + 2469: "mti-tcs-comm", + 2470: "taskman-port", + 2471: "seaodbc", + 2472: "c3", + 2473: "aker-cdp", + 2474: "vitalanalysis", + 2475: "ace-server", + 2476: "ace-svr-prop", + 2477: "ssm-cvs", + 2478: "ssm-cssps", + 2479: "ssm-els", + 2480: "powerexchange", + 2481: "giop", + 2482: "giop-ssl", + 2483: "ttc", + 2484: "ttc-ssl", + 2485: "netobjects1", + 2486: "netobjects2", + 2487: "pns", + 2488: "moy-corp", + 2489: "tsilb", + 2490: "qip-qdhcp", + 2491: "conclave-cpp", + 2492: "groove", + 2493: "talarian-mqs", + 2494: "bmc-ar", + 2495: "fast-rem-serv", + 2496: "dirgis", + 2497: "quaddb", + 2498: "odn-castraq", + 2499: "unicontrol", + 2500: "rtsserv", + 2501: "rtsclient", + 2502: "kentrox-prot", + 2503: "nms-dpnss", + 2504: "wlbs", + 2505: "ppcontrol", + 2506: "jbroker", + 2507: "spock", + 2508: "jdatastore", + 2509: "fjmpss", + 2510: "fjappmgrbulk", + 2511: "metastorm", + 2512: "citrixima", + 2513: "citrixadmin", + 2514: "facsys-ntp", + 2515: "facsys-router", + 2516: "maincontrol", + 2517: "call-sig-trans", + 2518: "willy", + 2519: "globmsgsvc", + 2520: "pvsw", + 2521: "adaptecmgr", + 2522: "windb", + 2523: "qke-llc-v3", + 2524: "optiwave-lm", + 2525: "ms-v-worlds", + 2526: "ema-sent-lm", + 2527: "iqserver", + 2528: "ncr-ccl", + 2529: "utsftp", + 2530: "vrcommerce", + 2531: "ito-e-gui", + 2532: "ovtopmd", + 2533: "snifferserver", + 2534: "combox-web-acc", + 2535: "madcap", + 2536: "btpp2audctr1", + 2537: "upgrade", + 2538: "vnwk-prapi", + 2539: "vsiadmin", + 2540: "lonworks", + 2541: "lonworks2", + 2542: "udrawgraph", + 2543: "reftek", + 2544: "novell-zen", + 2545: "sis-emt", + 2546: "vytalvaultbrtp", + 2547: "vytalvaultvsmp", + 2548: "vytalvaultpipe", + 2549: "ipass", + 2550: "ads", + 2551: "isg-uda-server", + 2552: "call-logging", + 2553: "efidiningport", + 2554: "vcnet-link-v10", + 2555: "compaq-wcp", + 2556: "nicetec-nmsvc", + 2557: "nicetec-mgmt", + 2558: "pclemultimedia", + 2559: "lstp", + 2560: "labrat", + 2561: "mosaixcc", + 2562: "delibo", + 2563: "cti-redwood", + 2564: "hp-3000-telnet", + 2565: "coord-svr", + 2566: "pcs-pcw", + 2567: "clp", + 2568: "spamtrap", + 2569: "sonuscallsig", + 2570: "hs-port", + 2571: "cecsvc", + 2572: "ibp", + 2573: "trustestablish", + 2574: "blockade-bpsp", + 2575: "hl7", + 2576: "tclprodebugger", + 2577: "scipticslsrvr", + 2578: "rvs-isdn-dcp", + 2579: "mpfoncl", + 2580: "tributary", + 2581: "argis-te", + 2582: "argis-ds", + 2583: "mon", + 2584: "cyaserv", + 2585: "netx-server", + 2586: "netx-agent", + 2587: "masc", + 2588: "privilege", + 2589: "quartus-tcl", + 2590: "idotdist", + 2591: "maytagshuffle", + 2592: "netrek", + 2593: "mns-mail", + 2594: "dts", + 2595: "worldfusion1", + 2596: "worldfusion2", + 2597: "homesteadglory", + 2598: "citriximaclient", + 2599: "snapd", + 2600: "hpstgmgr", + 2601: "discp-client", + 2602: "discp-server", + 2603: "servicemeter", + 2604: "nsc-ccs", + 2605: "nsc-posa", + 2606: "netmon", + 2607: "connection", + 2608: "wag-service", + 2609: "system-monitor", + 2610: "versa-tek", + 2611: "lionhead", + 2612: "qpasa-agent", + 2613: "smntubootstrap", + 2614: "neveroffline", + 2615: "firepower", + 2616: "appswitch-emp", + 2617: "cmadmin", + 2618: "priority-e-com", + 2619: "bruce", + 2620: "lpsrecommender", + 2621: "miles-apart", + 2622: "metricadbc", + 2623: "lmdp", + 2624: "aria", + 2625: "blwnkl-port", + 2626: "gbjd816", + 2627: "moshebeeri", + 2628: "dict", + 2629: "sitaraserver", + 2630: "sitaramgmt", + 2631: "sitaradir", + 2632: "irdg-post", + 2633: "interintelli", + 2634: "pk-electronics", + 2635: "backburner", + 2636: "solve", + 2637: "imdocsvc", + 2638: "sybaseanywhere", + 2639: "aminet", + 2640: "ami-control", + 2641: "hdl-srv", + 2642: "tragic", + 2643: "gte-samp", + 2644: "travsoft-ipx-t", + 2645: "novell-ipx-cmd", + 2646: "and-lm", + 2647: "syncserver", + 2648: "upsnotifyprot", + 2649: "vpsipport", + 2650: "eristwoguns", + 2651: "ebinsite", + 2652: "interpathpanel", + 2653: "sonus", + 2654: "corel-vncadmin", + 2655: "unglue", + 2656: "kana", + 2657: "sns-dispatcher", + 2658: "sns-admin", + 2659: "sns-query", + 2660: "gcmonitor", + 2661: "olhost", + 2662: "bintec-capi", + 2663: "bintec-tapi", + 2664: "patrol-mq-gm", + 2665: "patrol-mq-nm", + 2666: "extensis", + 2667: "alarm-clock-s", + 2668: "alarm-clock-c", + 2669: "toad", + 2670: "tve-announce", + 2671: "newlixreg", + 2672: "nhserver", + 2673: "firstcall42", + 2674: "ewnn", + 2675: "ttc-etap", + 2676: "simslink", + 2677: "gadgetgate1way", + 2678: "gadgetgate2way", + 2679: "syncserverssl", + 2680: "pxc-sapxom", + 2681: "mpnjsomb", + 2683: "ncdloadbalance", + 2684: "mpnjsosv", + 2685: "mpnjsocl", + 2686: "mpnjsomg", + 2687: "pq-lic-mgmt", + 2688: "md-cg-http", + 2689: "fastlynx", + 2690: "hp-nnm-data", + 2691: "itinternet", + 2692: "admins-lms", + 2694: "pwrsevent", + 2695: "vspread", + 2696: "unifyadmin", + 2697: "oce-snmp-trap", + 2698: "mck-ivpip", + 2699: "csoft-plusclnt", + 2700: "tqdata", + 2701: "sms-rcinfo", + 2702: "sms-xfer", + 2703: "sms-chat", + 2704: "sms-remctrl", + 2705: "sds-admin", + 2706: "ncdmirroring", + 2707: "emcsymapiport", + 2708: "banyan-net", + 2709: "supermon", + 2710: "sso-service", + 2711: "sso-control", + 2712: "aocp", + 2713: "raventbs", + 2714: "raventdm", + 2715: "hpstgmgr2", + 2716: "inova-ip-disco", + 2717: "pn-requester", + 2718: "pn-requester2", + 2719: "scan-change", + 2720: "wkars", + 2721: "smart-diagnose", + 2722: "proactivesrvr", + 2723: "watchdog-nt", + 2724: "qotps", + 2725: "msolap-ptp2", + 2726: "tams", + 2727: "mgcp-callagent", + 2728: "sqdr", + 2729: "tcim-control", + 2730: "nec-raidplus", + 2731: "fyre-messanger", + 2732: "g5m", + 2733: "signet-ctf", + 2734: "ccs-software", + 2735: "netiq-mc", + 2736: "radwiz-nms-srv", + 2737: "srp-feedback", + 2738: "ndl-tcp-ois-gw", + 2739: "tn-timing", + 2740: "alarm", + 2741: "tsb", + 2742: "tsb2", + 2743: "murx", + 2744: "honyaku", + 2745: "urbisnet", + 2746: "cpudpencap", + 2747: "fjippol-swrly", + 2748: "fjippol-polsvr", + 2749: "fjippol-cnsl", + 2750: "fjippol-port1", + 2751: "fjippol-port2", + 2752: "rsisysaccess", + 2753: "de-spot", + 2754: "apollo-cc", + 2755: "expresspay", + 2756: "simplement-tie", + 2757: "cnrp", + 2758: "apollo-status", + 2759: "apollo-gms", + 2760: "sabams", + 2761: "dicom-iscl", + 2762: "dicom-tls", + 2763: "desktop-dna", + 2764: "data-insurance", + 2765: "qip-audup", + 2766: "compaq-scp", + 2767: "uadtc", + 2768: "uacs", + 2769: "exce", + 2770: "veronica", + 2771: "vergencecm", + 2772: "auris", + 2773: "rbakcup1", + 2774: "rbakcup2", + 2775: "smpp", + 2776: "ridgeway1", + 2777: "ridgeway2", + 2778: "gwen-sonya", + 2779: "lbc-sync", + 2780: "lbc-control", + 2781: "whosells", + 2782: "everydayrc", + 2783: "aises", + 2784: "www-dev", + 2785: "aic-np", + 2786: "aic-oncrpc", + 2787: "piccolo", + 2788: "fryeserv", + 2789: "media-agent", + 2790: "plgproxy", + 2791: "mtport-regist", + 2792: "f5-globalsite", + 2793: "initlsmsad", + 2795: "livestats", + 2796: "ac-tech", + 2797: "esp-encap", + 2798: "tmesis-upshot", + 2799: "icon-discover", + 2800: "acc-raid", + 2801: "igcp", + 2802: "veritas-udp1", + 2803: "btprjctrl", + 2804: "dvr-esm", + 2805: "wta-wsp-s", + 2806: "cspuni", + 2807: "cspmulti", + 2808: "j-lan-p", + 2809: "corbaloc", + 2810: "netsteward", + 2811: "gsiftp", + 2812: "atmtcp", + 2813: "llm-pass", + 2814: "llm-csv", + 2815: "lbc-measure", + 2816: "lbc-watchdog", + 2817: "nmsigport", + 2818: "rmlnk", + 2819: "fc-faultnotify", + 2820: "univision", + 2821: "vrts-at-port", + 2822: "ka0wuc", + 2823: "cqg-netlan", + 2824: "cqg-netlan-1", + 2826: "slc-systemlog", + 2827: "slc-ctrlrloops", + 2828: "itm-lm", + 2829: "silkp1", + 2830: "silkp2", + 2831: "silkp3", + 2832: "silkp4", + 2833: "glishd", + 2834: "evtp", + 2835: "evtp-data", + 2836: "catalyst", + 2837: "repliweb", + 2838: "starbot", + 2839: "nmsigport", + 2840: "l3-exprt", + 2841: "l3-ranger", + 2842: "l3-hawk", + 2843: "pdnet", + 2844: "bpcp-poll", + 2845: "bpcp-trap", + 2846: "aimpp-hello", + 2847: "aimpp-port-req", + 2848: "amt-blc-port", + 2849: "fxp", + 2850: "metaconsole", + 2851: "webemshttp", + 2852: "bears-01", + 2853: "ispipes", + 2854: "infomover", + 2856: "cesdinv", + 2857: "simctlp", + 2858: "ecnp", + 2859: "activememory", + 2860: "dialpad-voice1", + 2861: "dialpad-voice2", + 2862: "ttg-protocol", + 2863: "sonardata", + 2864: "astromed-main", + 2865: "pit-vpn", + 2866: "iwlistener", + 2867: "esps-portal", + 2868: "npep-messaging", + 2869: "icslap", + 2870: "daishi", + 2871: "msi-selectplay", + 2872: "radix", + 2874: "dxmessagebase1", + 2875: "dxmessagebase2", + 2876: "sps-tunnel", + 2877: "bluelance", + 2878: "aap", + 2879: "ucentric-ds", + 2880: "synapse", + 2881: "ndsp", + 2882: "ndtp", + 2883: "ndnp", + 2884: "flashmsg", + 2885: "topflow", + 2886: "responselogic", + 2887: "aironetddp", + 2888: "spcsdlobby", + 2889: "rsom", + 2890: "cspclmulti", + 2891: "cinegrfx-elmd", + 2892: "snifferdata", + 2893: "vseconnector", + 2894: "abacus-remote", + 2895: "natuslink", + 2896: "ecovisiong6-1", + 2897: "citrix-rtmp", + 2898: "appliance-cfg", + 2899: "powergemplus", + 2900: "quicksuite", + 2901: "allstorcns", + 2902: "netaspi", + 2903: "suitcase", + 2904: "m2ua", + 2906: "caller9", + 2907: "webmethods-b2b", + 2908: "mao", + 2909: "funk-dialout", + 2910: "tdaccess", + 2911: "blockade", + 2912: "epicon", + 2913: "boosterware", + 2914: "gamelobby", + 2915: "tksocket", + 2916: "elvin-server", + 2917: "elvin-client", + 2918: "kastenchasepad", + 2919: "roboer", + 2920: "roboeda", + 2921: "cesdcdman", + 2922: "cesdcdtrn", + 2923: "wta-wsp-wtp-s", + 2924: "precise-vip", + 2926: "mobile-file-dl", + 2927: "unimobilectrl", + 2928: "redstone-cpss", + 2929: "amx-webadmin", + 2930: "amx-weblinx", + 2931: "circle-x", + 2932: "incp", + 2933: "4-tieropmgw", + 2934: "4-tieropmcli", + 2935: "qtp", + 2936: "otpatch", + 2937: "pnaconsult-lm", + 2938: "sm-pas-1", + 2939: "sm-pas-2", + 2940: "sm-pas-3", + 2941: "sm-pas-4", + 2942: "sm-pas-5", + 2943: "ttnrepository", + 2944: "megaco-h248", + 2945: "h248-binary", + 2946: "fjsvmpor", + 2947: "gpsd", + 2948: "wap-push", + 2949: "wap-pushsecure", + 2950: "esip", + 2951: "ottp", + 2952: "mpfwsas", + 2953: "ovalarmsrv", + 2954: "ovalarmsrv-cmd", + 2955: "csnotify", + 2956: "ovrimosdbman", + 2957: "jmact5", + 2958: "jmact6", + 2959: "rmopagt", + 2960: "dfoxserver", + 2961: "boldsoft-lm", + 2962: "iph-policy-cli", + 2963: "iph-policy-adm", + 2964: "bullant-srap", + 2965: "bullant-rap", + 2966: "idp-infotrieve", + 2967: "ssc-agent", + 2968: "enpp", + 2969: "essp", + 2970: "index-net", + 2971: "netclip", + 2972: "pmsm-webrctl", + 2973: "svnetworks", + 2974: "signal", + 2975: "fjmpcm", + 2976: "cns-srv-port", + 2977: "ttc-etap-ns", + 2978: "ttc-etap-ds", + 2979: "h263-video", + 2980: "wimd", + 2981: "mylxamport", + 2982: "iwb-whiteboard", + 2983: "netplan", + 2984: "hpidsadmin", + 2985: "hpidsagent", + 2986: "stonefalls", + 2987: "identify", + 2988: "hippad", + 2989: "zarkov", + 2990: "boscap", + 2991: "wkstn-mon", + 2992: "avenyo", + 2993: "veritas-vis1", + 2994: "veritas-vis2", + 2995: "idrs", + 2996: "vsixml", + 2997: "rebol", + 2998: "realsecure", + 2999: "remoteware-un", + 3000: "hbci", + 3002: "exlm-agent", + 3003: "cgms", + 3004: "csoftragent", + 3005: "geniuslm", + 3006: "ii-admin", + 3007: "lotusmtap", + 3008: "midnight-tech", + 3009: "pxc-ntfy", + 3010: "ping-pong", + 3011: "trusted-web", + 3012: "twsdss", + 3013: "gilatskysurfer", + 3014: "broker-service", + 3015: "nati-dstp", + 3016: "notify-srvr", + 3017: "event-listener", + 3018: "srvc-registry", + 3019: "resource-mgr", + 3020: "cifs", + 3021: "agriserver", + 3022: "csregagent", + 3023: "magicnotes", + 3024: "nds-sso", + 3025: "arepa-raft", + 3026: "agri-gateway", + 3027: "LiebDevMgmt-C", + 3028: "LiebDevMgmt-DM", + 3029: "LiebDevMgmt-A", + 3030: "arepa-cas", + 3031: "eppc", + 3032: "redwood-chat", + 3033: "pdb", + 3034: "osmosis-aeea", + 3035: "fjsv-gssagt", + 3036: "hagel-dump", + 3037: "hp-san-mgmt", + 3038: "santak-ups", + 3039: "cogitate", + 3040: "tomato-springs", + 3041: "di-traceware", + 3042: "journee", + 3043: "brp", + 3044: "epp", + 3045: "responsenet", + 3046: "di-ase", + 3047: "hlserver", + 3048: "pctrader", + 3049: "nsws", + 3050: "gds-db", + 3051: "galaxy-server", + 3052: "apc-3052", + 3053: "dsom-server", + 3054: "amt-cnf-prot", + 3055: "policyserver", + 3056: "cdl-server", + 3057: "goahead-fldup", + 3058: "videobeans", + 3059: "qsoft", + 3060: "interserver", + 3061: "cautcpd", + 3062: "ncacn-ip-tcp", + 3063: "ncadg-ip-udp", + 3064: "rprt", + 3065: "slinterbase", + 3066: "netattachsdmp", + 3067: "fjhpjp", + 3068: "ls3bcast", + 3069: "ls3", + 3070: "mgxswitch", + 3072: "csd-monitor", + 3073: "vcrp", + 3074: "xbox", + 3075: "orbix-locator", + 3076: "orbix-config", + 3077: "orbix-loc-ssl", + 3078: "orbix-cfg-ssl", + 3079: "lv-frontpanel", + 3080: "stm-pproc", + 3081: "tl1-lv", + 3082: "tl1-raw", + 3083: "tl1-telnet", + 3084: "itm-mccs", + 3085: "pcihreq", + 3086: "jdl-dbkitchen", + 3087: "asoki-sma", + 3088: "xdtp", + 3089: "ptk-alink", + 3090: "stss", + 3091: "1ci-smcs", + 3093: "rapidmq-center", + 3094: "rapidmq-reg", + 3095: "panasas", + 3096: "ndl-aps", + 3098: "umm-port", + 3099: "chmd", + 3100: "opcon-xps", + 3101: "hp-pxpib", + 3102: "slslavemon", + 3103: "autocuesmi", + 3104: "autocuetime", + 3105: "cardbox", + 3106: "cardbox-http", + 3107: "business", + 3108: "geolocate", + 3109: "personnel", + 3110: "sim-control", + 3111: "wsynch", + 3112: "ksysguard", + 3113: "cs-auth-svr", + 3114: "ccmad", + 3115: "mctet-master", + 3116: "mctet-gateway", + 3117: "mctet-jserv", + 3118: "pkagent", + 3119: "d2000kernel", + 3120: "d2000webserver", + 3122: "vtr-emulator", + 3123: "edix", + 3124: "beacon-port", + 3125: "a13-an", + 3127: "ctx-bridge", + 3128: "ndl-aas", + 3129: "netport-id", + 3130: "icpv2", + 3131: "netbookmark", + 3132: "ms-rule-engine", + 3133: "prism-deploy", + 3134: "ecp", + 3135: "peerbook-port", + 3136: "grubd", + 3137: "rtnt-1", + 3138: "rtnt-2", + 3139: "incognitorv", + 3140: "ariliamulti", + 3141: "vmodem", + 3142: "rdc-wh-eos", + 3143: "seaview", + 3144: "tarantella", + 3145: "csi-lfap", + 3146: "bears-02", + 3147: "rfio", + 3148: "nm-game-admin", + 3149: "nm-game-server", + 3150: "nm-asses-admin", + 3151: "nm-assessor", + 3152: "feitianrockey", + 3153: "s8-client-port", + 3154: "ccmrmi", + 3155: "jpegmpeg", + 3156: "indura", + 3157: "e3consultants", + 3158: "stvp", + 3159: "navegaweb-port", + 3160: "tip-app-server", + 3161: "doc1lm", + 3162: "sflm", + 3163: "res-sap", + 3164: "imprs", + 3165: "newgenpay", + 3166: "sossecollector", + 3167: "nowcontact", + 3168: "poweronnud", + 3169: "serverview-as", + 3170: "serverview-asn", + 3171: "serverview-gf", + 3172: "serverview-rm", + 3173: "serverview-icc", + 3174: "armi-server", + 3175: "t1-e1-over-ip", + 3176: "ars-master", + 3177: "phonex-port", + 3178: "radclientport", + 3179: "h2gf-w-2m", + 3180: "mc-brk-srv", + 3181: "bmcpatrolagent", + 3182: "bmcpatrolrnvu", + 3183: "cops-tls", + 3184: "apogeex-port", + 3185: "smpppd", + 3186: "iiw-port", + 3187: "odi-port", + 3188: "brcm-comm-port", + 3189: "pcle-infex", + 3190: "csvr-proxy", + 3191: "csvr-sslproxy", + 3192: "firemonrcc", + 3193: "spandataport", + 3194: "magbind", + 3195: "ncu-1", + 3196: "ncu-2", + 3197: "embrace-dp-s", + 3198: "embrace-dp-c", + 3199: "dmod-workspace", + 3200: "tick-port", + 3201: "cpq-tasksmart", + 3202: "intraintra", + 3203: "netwatcher-mon", + 3204: "netwatcher-db", + 3205: "isns", + 3206: "ironmail", + 3207: "vx-auth-port", + 3208: "pfu-prcallback", + 3209: "netwkpathengine", + 3210: "flamenco-proxy", + 3211: "avsecuremgmt", + 3212: "surveyinst", + 3213: "neon24x7", + 3214: "jmq-daemon-1", + 3215: "jmq-daemon-2", + 3216: "ferrari-foam", + 3217: "unite", + 3218: "smartpackets", + 3219: "wms-messenger", + 3220: "xnm-ssl", + 3221: "xnm-clear-text", + 3222: "glbp", + 3223: "digivote", + 3224: "aes-discovery", + 3225: "fcip-port", + 3226: "isi-irp", + 3227: "dwnmshttp", + 3228: "dwmsgserver", + 3229: "global-cd-port", + 3230: "sftdst-port", + 3231: "vidigo", + 3232: "mdtp", + 3233: "whisker", + 3234: "alchemy", + 3235: "mdap-port", + 3236: "apparenet-ts", + 3237: "apparenet-tps", + 3238: "apparenet-as", + 3239: "apparenet-ui", + 3240: "triomotion", + 3241: "sysorb", + 3242: "sdp-id-port", + 3243: "timelot", + 3244: "onesaf", + 3245: "vieo-fe", + 3246: "dvt-system", + 3247: "dvt-data", + 3248: "procos-lm", + 3249: "ssp", + 3250: "hicp", + 3251: "sysscanner", + 3252: "dhe", + 3253: "pda-data", + 3254: "pda-sys", + 3255: "semaphore", + 3256: "cpqrpm-agent", + 3257: "cpqrpm-server", + 3258: "ivecon-port", + 3259: "epncdp2", + 3260: "iscsi-target", + 3261: "winshadow", + 3262: "necp", + 3263: "ecolor-imager", + 3264: "ccmail", + 3265: "altav-tunnel", + 3266: "ns-cfg-server", + 3267: "ibm-dial-out", + 3268: "msft-gc", + 3269: "msft-gc-ssl", + 3270: "verismart", + 3271: "csoft-prev", + 3272: "user-manager", + 3273: "sxmp", + 3274: "ordinox-server", + 3275: "samd", + 3276: "maxim-asics", + 3277: "awg-proxy", + 3278: "lkcmserver", + 3279: "admind", + 3280: "vs-server", + 3281: "sysopt", + 3282: "datusorb", + 3283: "Apple Remote Desktop (Net Assistant)", + 3284: "4talk", + 3285: "plato", + 3286: "e-net", + 3287: "directvdata", + 3288: "cops", + 3289: "enpc", + 3290: "caps-lm", + 3291: "sah-lm", + 3292: "cart-o-rama", + 3293: "fg-fps", + 3294: "fg-gip", + 3295: "dyniplookup", + 3296: "rib-slm", + 3297: "cytel-lm", + 3298: "deskview", + 3299: "pdrncs", + 3302: "mcs-fastmail", + 3303: "opsession-clnt", + 3304: "opsession-srvr", + 3305: "odette-ftp", + 3306: "mysql", + 3307: "opsession-prxy", + 3308: "tns-server", + 3309: "tns-adv", + 3310: "dyna-access", + 3311: "mcns-tel-ret", + 3312: "appman-server", + 3313: "uorb", + 3314: "uohost", + 3315: "cdid", + 3316: "aicc-cmi", + 3317: "vsaiport", + 3318: "ssrip", + 3319: "sdt-lmd", + 3320: "officelink2000", + 3321: "vnsstr", + 3326: "sftu", + 3327: "bbars", + 3328: "egptlm", + 3329: "hp-device-disc", + 3330: "mcs-calypsoicf", + 3331: "mcs-messaging", + 3332: "mcs-mailsvr", + 3333: "dec-notes", + 3334: "directv-web", + 3335: "directv-soft", + 3336: "directv-tick", + 3337: "directv-catlg", + 3338: "anet-b", + 3339: "anet-l", + 3340: "anet-m", + 3341: "anet-h", + 3342: "webtie", + 3343: "ms-cluster-net", + 3344: "bnt-manager", + 3345: "influence", + 3346: "trnsprntproxy", + 3347: "phoenix-rpc", + 3348: "pangolin-laser", + 3349: "chevinservices", + 3350: "findviatv", + 3351: "btrieve", + 3352: "ssql", + 3353: "fatpipe", + 3354: "suitjd", + 3355: "ordinox-dbase", + 3356: "upnotifyps", + 3357: "adtech-test", + 3358: "mpsysrmsvr", + 3359: "wg-netforce", + 3360: "kv-server", + 3361: "kv-agent", + 3362: "dj-ilm", + 3363: "nati-vi-server", + 3364: "creativeserver", + 3365: "contentserver", + 3366: "creativepartnr", + 3372: "tip2", + 3373: "lavenir-lm", + 3374: "cluster-disc", + 3375: "vsnm-agent", + 3376: "cdbroker", + 3377: "cogsys-lm", + 3378: "wsicopy", + 3379: "socorfs", + 3380: "sns-channels", + 3381: "geneous", + 3382: "fujitsu-neat", + 3383: "esp-lm", + 3384: "hp-clic", + 3385: "qnxnetman", + 3386: "gprs-sig", + 3387: "backroomnet", + 3388: "cbserver", + 3389: "ms-wbt-server", + 3390: "dsc", + 3391: "savant", + 3392: "efi-lm", + 3393: "d2k-tapestry1", + 3394: "d2k-tapestry2", + 3395: "dyna-lm", + 3396: "printer-agent", + 3397: "cloanto-lm", + 3398: "mercantile", + 3399: "csms", + 3400: "csms2", + 3401: "filecast", + 3402: "fxaengine-net", + 3405: "nokia-ann-ch1", + 3406: "nokia-ann-ch2", + 3407: "ldap-admin", + 3408: "BESApi", + 3409: "networklens", + 3410: "networklenss", + 3411: "biolink-auth", + 3412: "xmlblaster", + 3413: "svnet", + 3414: "wip-port", + 3415: "bcinameservice", + 3416: "commandport", + 3417: "csvr", + 3418: "rnmap", + 3419: "softaudit", + 3420: "ifcp-port", + 3421: "bmap", + 3422: "rusb-sys-port", + 3423: "xtrm", + 3424: "xtrms", + 3425: "agps-port", + 3426: "arkivio", + 3427: "websphere-snmp", + 3428: "twcss", + 3429: "gcsp", + 3430: "ssdispatch", + 3431: "ndl-als", + 3432: "osdcp", + 3433: "opnet-smp", + 3434: "opencm", + 3435: "pacom", + 3436: "gc-config", + 3437: "autocueds", + 3438: "spiral-admin", + 3439: "hri-port", + 3440: "ans-console", + 3441: "connect-client", + 3442: "connect-server", + 3443: "ov-nnm-websrv", + 3444: "denali-server", + 3445: "monp", + 3446: "3comfaxrpc", + 3447: "directnet", + 3448: "dnc-port", + 3449: "hotu-chat", + 3450: "castorproxy", + 3451: "asam", + 3452: "sabp-signal", + 3453: "pscupd", + 3454: "mira", + 3455: "prsvp", + 3456: "vat", + 3457: "vat-control", + 3458: "d3winosfi", + 3459: "integral", + 3460: "edm-manager", + 3461: "edm-stager", + 3462: "edm-std-notify", + 3463: "edm-adm-notify", + 3464: "edm-mgr-sync", + 3465: "edm-mgr-cntrl", + 3466: "workflow", + 3467: "rcst", + 3468: "ttcmremotectrl", + 3469: "pluribus", + 3470: "jt400", + 3471: "jt400-ssl", + 3472: "jaugsremotec-1", + 3473: "jaugsremotec-2", + 3474: "ttntspauto", + 3475: "genisar-port", + 3476: "nppmp", + 3477: "ecomm", + 3478: "stun", + 3479: "twrpc", + 3480: "plethora", + 3481: "cleanerliverc", + 3482: "vulture", + 3483: "slim-devices", + 3484: "gbs-stp", + 3485: "celatalk", + 3486: "ifsf-hb-port", + 3487: "ltcudp", + 3488: "fs-rh-srv", + 3489: "dtp-dia", + 3490: "colubris", + 3491: "swr-port", + 3492: "tvdumtray-port", + 3493: "nut", + 3494: "ibm3494", + 3495: "seclayer-tcp", + 3496: "seclayer-tls", + 3497: "ipether232port", + 3498: "dashpas-port", + 3499: "sccip-media", + 3500: "rtmp-port", + 3501: "isoft-p2p", + 3502: "avinstalldisc", + 3503: "lsp-ping", + 3504: "ironstorm", + 3505: "ccmcomm", + 3506: "apc-3506", + 3507: "nesh-broker", + 3508: "interactionweb", + 3509: "vt-ssl", + 3510: "xss-port", + 3511: "webmail-2", + 3512: "aztec", + 3513: "arcpd", + 3514: "must-p2p", + 3515: "must-backplane", + 3516: "smartcard-port", + 3517: "802-11-iapp", + 3518: "artifact-msg", + 3519: "galileo", + 3520: "galileolog", + 3521: "mc3ss", + 3522: "nssocketport", + 3523: "odeumservlink", + 3524: "ecmport", + 3525: "eisport", + 3526: "starquiz-port", + 3527: "beserver-msg-q", + 3528: "jboss-iiop", + 3529: "jboss-iiop-ssl", + 3530: "gf", + 3531: "joltid", + 3532: "raven-rmp", + 3533: "raven-rdp", + 3534: "urld-port", + 3535: "ms-la", + 3536: "snac", + 3537: "ni-visa-remote", + 3538: "ibm-diradm", + 3539: "ibm-diradm-ssl", + 3540: "pnrp-port", + 3541: "voispeed-port", + 3542: "hacl-monitor", + 3543: "qftest-lookup", + 3544: "teredo", + 3545: "camac", + 3547: "symantec-sim", + 3548: "interworld", + 3549: "tellumat-nms", + 3550: "ssmpp", + 3551: "apcupsd", + 3552: "taserver", + 3553: "rbr-discovery", + 3554: "questnotify", + 3555: "razor", + 3556: "sky-transport", + 3557: "personalos-001", + 3558: "mcp-port", + 3559: "cctv-port", + 3560: "iniserve-port", + 3561: "bmc-onekey", + 3562: "sdbproxy", + 3563: "watcomdebug", + 3564: "esimport", + 3567: "dof-eps", + 3568: "dof-tunnel-sec", + 3569: "mbg-ctrl", + 3570: "mccwebsvr-port", + 3571: "megardsvr-port", + 3572: "megaregsvrport", + 3573: "tag-ups-1", + 3574: "dmaf-caster", + 3575: "ccm-port", + 3576: "cmc-port", + 3577: "config-port", + 3578: "data-port", + 3579: "ttat3lb", + 3580: "nati-svrloc", + 3581: "kfxaclicensing", + 3582: "press", + 3583: "canex-watch", + 3584: "u-dbap", + 3585: "emprise-lls", + 3586: "emprise-lsc", + 3587: "p2pgroup", + 3588: "sentinel", + 3589: "isomair", + 3590: "wv-csp-sms", + 3591: "gtrack-server", + 3592: "gtrack-ne", + 3593: "bpmd", + 3594: "mediaspace", + 3595: "shareapp", + 3596: "iw-mmogame", + 3597: "a14", + 3598: "a15", + 3599: "quasar-server", + 3600: "trap-daemon", + 3601: "visinet-gui", + 3602: "infiniswitchcl", + 3603: "int-rcv-cntrl", + 3604: "bmc-jmx-port", + 3605: "comcam-io", + 3606: "splitlock", + 3607: "precise-i3", + 3608: "trendchip-dcp", + 3609: "cpdi-pidas-cm", + 3610: "echonet", + 3611: "six-degrees", + 3612: "hp-dataprotect", + 3613: "alaris-disc", + 3614: "sigma-port", + 3615: "start-network", + 3616: "cd3o-protocol", + 3617: "sharp-server", + 3618: "aairnet-1", + 3619: "aairnet-2", + 3620: "ep-pcp", + 3621: "ep-nsp", + 3622: "ff-lr-port", + 3623: "haipe-discover", + 3624: "dist-upgrade", + 3625: "volley", + 3626: "bvcdaemon-port", + 3627: "jamserverport", + 3628: "ept-machine", + 3629: "escvpnet", + 3630: "cs-remote-db", + 3631: "cs-services", + 3632: "distcc", + 3633: "wacp", + 3634: "hlibmgr", + 3635: "sdo", + 3636: "servistaitsm", + 3637: "scservp", + 3638: "ehp-backup", + 3639: "xap-ha", + 3640: "netplay-port1", + 3641: "netplay-port2", + 3642: "juxml-port", + 3643: "audiojuggler", + 3644: "ssowatch", + 3645: "cyc", + 3646: "xss-srv-port", + 3647: "splitlock-gw", + 3648: "fjcp", + 3649: "nmmp", + 3650: "prismiq-plugin", + 3651: "xrpc-registry", + 3652: "vxcrnbuport", + 3653: "tsp", + 3654: "vaprtm", + 3655: "abatemgr", + 3656: "abatjss", + 3657: "immedianet-bcn", + 3658: "ps-ams", + 3659: "apple-sasl", + 3660: "can-nds-ssl", + 3661: "can-ferret-ssl", + 3662: "pserver", + 3663: "dtp", + 3664: "ups-engine", + 3665: "ent-engine", + 3666: "eserver-pap", + 3667: "infoexch", + 3668: "dell-rm-port", + 3669: "casanswmgmt", + 3670: "smile", + 3671: "efcp", + 3672: "lispworks-orb", + 3673: "mediavault-gui", + 3674: "wininstall-ipc", + 3675: "calltrax", + 3676: "va-pacbase", + 3677: "roverlog", + 3678: "ipr-dglt", + 3679: "Escale (Newton Dock)", + 3680: "npds-tracker", + 3681: "bts-x73", + 3682: "cas-mapi", + 3683: "bmc-ea", + 3684: "faxstfx-port", + 3685: "dsx-agent", + 3686: "tnmpv2", + 3687: "simple-push", + 3688: "simple-push-s", + 3689: "daap", + 3690: "svn", + 3691: "magaya-network", + 3692: "intelsync", + 3695: "bmc-data-coll", + 3696: "telnetcpcd", + 3697: "nw-license", + 3698: "sagectlpanel", + 3699: "kpn-icw", + 3700: "lrs-paging", + 3701: "netcelera", + 3702: "ws-discovery", + 3703: "adobeserver-3", + 3704: "adobeserver-4", + 3705: "adobeserver-5", + 3706: "rt-event", + 3707: "rt-event-s", + 3708: "sun-as-iiops", + 3709: "ca-idms", + 3710: "portgate-auth", + 3711: "edb-server2", + 3712: "sentinel-ent", + 3713: "tftps", + 3714: "delos-dms", + 3715: "anoto-rendezv", + 3716: "wv-csp-sms-cir", + 3717: "wv-csp-udp-cir", + 3718: "opus-services", + 3719: "itelserverport", + 3720: "ufastro-instr", + 3721: "xsync", + 3722: "xserveraid", + 3723: "sychrond", + 3724: "blizwow", + 3725: "na-er-tip", + 3726: "array-manager", + 3727: "e-mdu", + 3728: "e-woa", + 3729: "fksp-audit", + 3730: "client-ctrl", + 3731: "smap", + 3732: "m-wnn", + 3733: "multip-msg", + 3734: "synel-data", + 3735: "pwdis", + 3736: "rs-rmi", + 3738: "versatalk", + 3739: "launchbird-lm", + 3740: "heartbeat", + 3741: "wysdma", + 3742: "cst-port", + 3743: "ipcs-command", + 3744: "sasg", + 3745: "gw-call-port", + 3746: "linktest", + 3747: "linktest-s", + 3748: "webdata", + 3749: "cimtrak", + 3750: "cbos-ip-port", + 3751: "gprs-cube", + 3752: "vipremoteagent", + 3753: "nattyserver", + 3754: "timestenbroker", + 3755: "sas-remote-hlp", + 3756: "canon-capt", + 3757: "grf-port", + 3758: "apw-registry", + 3759: "exapt-lmgr", + 3760: "adtempusclient", + 3761: "gsakmp", + 3762: "gbs-smp", + 3763: "xo-wave", + 3764: "mni-prot-rout", + 3765: "rtraceroute", + 3767: "listmgr-port", + 3768: "rblcheckd", + 3769: "haipe-otnk", + 3770: "cindycollab", + 3771: "paging-port", + 3772: "ctp", + 3773: "ctdhercules", + 3774: "zicom", + 3775: "ispmmgr", + 3776: "dvcprov-port", + 3777: "jibe-eb", + 3778: "c-h-it-port", + 3779: "cognima", + 3780: "nnp", + 3781: "abcvoice-port", + 3782: "iso-tp0s", + 3783: "bim-pem", + 3784: "bfd-control", + 3785: "bfd-echo", + 3786: "upstriggervsw", + 3787: "fintrx", + 3788: "isrp-port", + 3789: "remotedeploy", + 3790: "quickbooksrds", + 3791: "tvnetworkvideo", + 3792: "sitewatch", + 3793: "dcsoftware", + 3794: "jaus", + 3795: "myblast", + 3796: "spw-dialer", + 3797: "idps", + 3798: "minilock", + 3799: "radius-dynauth", + 3800: "pwgpsi", + 3801: "ibm-mgr", + 3802: "vhd", + 3803: "soniqsync", + 3804: "iqnet-port", + 3805: "tcpdataserver", + 3806: "wsmlb", + 3807: "spugna", + 3808: "sun-as-iiops-ca", + 3809: "apocd", + 3810: "wlanauth", + 3811: "amp", + 3812: "neto-wol-server", + 3813: "rap-ip", + 3814: "neto-dcs", + 3815: "lansurveyorxml", + 3816: "sunlps-http", + 3817: "tapeware", + 3818: "crinis-hb", + 3819: "epl-slp", + 3820: "scp", + 3821: "pmcp", + 3822: "acp-discovery", + 3823: "acp-conduit", + 3824: "acp-policy", + 3825: "ffserver", + 3826: "warmux", + 3827: "netmpi", + 3828: "neteh", + 3829: "neteh-ext", + 3830: "cernsysmgmtagt", + 3831: "dvapps", + 3832: "xxnetserver", + 3833: "aipn-auth", + 3834: "spectardata", + 3835: "spectardb", + 3836: "markem-dcp", + 3837: "mkm-discovery", + 3838: "sos", + 3839: "amx-rms", + 3840: "flirtmitmir", + 3842: "nhci", + 3843: "quest-agent", + 3844: "rnm", + 3845: "v-one-spp", + 3846: "an-pcp", + 3847: "msfw-control", + 3848: "item", + 3849: "spw-dnspreload", + 3850: "qtms-bootstrap", + 3851: "spectraport", + 3852: "sse-app-config", + 3853: "sscan", + 3854: "stryker-com", + 3855: "opentrac", + 3856: "informer", + 3857: "trap-port", + 3858: "trap-port-mom", + 3859: "nav-port", + 3860: "sasp", + 3861: "winshadow-hd", + 3862: "giga-pocket", + 3863: "asap-udp", + 3865: "xpl", + 3866: "dzdaemon", + 3867: "dzoglserver", + 3869: "ovsam-mgmt", + 3870: "ovsam-d-agent", + 3871: "avocent-adsap", + 3872: "oem-agent", + 3873: "fagordnc", + 3874: "sixxsconfig", + 3875: "pnbscada", + 3876: "dl-agent", + 3877: "xmpcr-interface", + 3878: "fotogcad", + 3879: "appss-lm", + 3880: "igrs", + 3881: "idac", + 3882: "msdts1", + 3883: "vrpn", + 3884: "softrack-meter", + 3885: "topflow-ssl", + 3886: "nei-management", + 3887: "ciphire-data", + 3888: "ciphire-serv", + 3889: "dandv-tester", + 3890: "ndsconnect", + 3891: "rtc-pm-port", + 3892: "pcc-image-port", + 3893: "cgi-starapi", + 3894: "syam-agent", + 3895: "syam-smc", + 3896: "sdo-tls", + 3897: "sdo-ssh", + 3898: "senip", + 3899: "itv-control", + 3900: "udt-os", + 3901: "nimsh", + 3902: "nimaux", + 3903: "charsetmgr", + 3904: "omnilink-port", + 3905: "mupdate", + 3906: "topovista-data", + 3907: "imoguia-port", + 3908: "hppronetman", + 3909: "surfcontrolcpa", + 3910: "prnrequest", + 3911: "prnstatus", + 3912: "gbmt-stars", + 3913: "listcrt-port", + 3914: "listcrt-port-2", + 3915: "agcat", + 3916: "wysdmc", + 3917: "aftmux", + 3918: "pktcablemmcops", + 3919: "hyperip", + 3920: "exasoftport1", + 3921: "herodotus-net", + 3922: "sor-update", + 3923: "symb-sb-port", + 3924: "mpl-gprs-port", + 3925: "zmp", + 3926: "winport", + 3927: "natdataservice", + 3928: "netboot-pxe", + 3929: "smauth-port", + 3930: "syam-webserver", + 3931: "msr-plugin-port", + 3932: "dyn-site", + 3933: "plbserve-port", + 3934: "sunfm-port", + 3935: "sdp-portmapper", + 3936: "mailprox", + 3937: "dvbservdsc", + 3938: "dbcontrol-agent", + 3939: "aamp", + 3940: "xecp-node", + 3941: "homeportal-web", + 3942: "srdp", + 3943: "tig", + 3944: "sops", + 3945: "emcads", + 3946: "backupedge", + 3947: "ccp", + 3948: "apdap", + 3949: "drip", + 3950: "namemunge", + 3951: "pwgippfax", + 3952: "i3-sessionmgr", + 3953: "xmlink-connect", + 3954: "adrep", + 3955: "p2pcommunity", + 3956: "gvcp", + 3957: "mqe-broker", + 3958: "mqe-agent", + 3959: "treehopper", + 3960: "bess", + 3961: "proaxess", + 3962: "sbi-agent", + 3963: "thrp", + 3964: "sasggprs", + 3965: "ati-ip-to-ncpe", + 3966: "bflckmgr", + 3967: "ppsms", + 3968: "ianywhere-dbns", + 3969: "landmarks", + 3970: "lanrevagent", + 3971: "lanrevserver", + 3972: "iconp", + 3973: "progistics", + 3974: "citysearch", + 3975: "airshot", + 3976: "opswagent", + 3977: "opswmanager", + 3978: "secure-cfg-svr", + 3979: "smwan", + 3980: "acms", + 3981: "starfish", + 3982: "eis", + 3983: "eisp", + 3984: "mapper-nodemgr", + 3985: "mapper-mapethd", + 3986: "mapper-ws-ethd", + 3987: "centerline", + 3988: "dcs-config", + 3989: "bv-queryengine", + 3990: "bv-is", + 3991: "bv-smcsrv", + 3992: "bv-ds", + 3993: "bv-agent", + 3995: "iss-mgmt-ssl", + 3996: "abcsoftware", + 3997: "agentsease-db", + 3998: "dnx", + 3999: "nvcnet", + 4000: "terabase", + 4001: "newoak", + 4002: "pxc-spvr-ft", + 4003: "pxc-splr-ft", + 4004: "pxc-roid", + 4005: "pxc-pin", + 4006: "pxc-spvr", + 4007: "pxc-splr", + 4008: "netcheque", + 4009: "chimera-hwm", + 4010: "samsung-unidex", + 4011: "altserviceboot", + 4012: "pda-gate", + 4013: "acl-manager", + 4014: "taiclock", + 4015: "talarian-mcast1", + 4016: "talarian-mcast2", + 4017: "talarian-mcast3", + 4018: "talarian-mcast4", + 4019: "talarian-mcast5", + 4020: "trap", + 4021: "nexus-portal", + 4022: "dnox", + 4023: "esnm-zoning", + 4024: "tnp1-port", + 4025: "partimage", + 4026: "as-debug", + 4027: "bxp", + 4028: "dtserver-port", + 4029: "ip-qsig", + 4030: "jdmn-port", + 4031: "suucp", + 4032: "vrts-auth-port", + 4033: "sanavigator", + 4034: "ubxd", + 4035: "wap-push-http", + 4036: "wap-push-https", + 4037: "ravehd", + 4038: "fazzt-ptp", + 4039: "fazzt-admin", + 4040: "yo-main", + 4041: "houston", + 4042: "ldxp", + 4043: "nirp", + 4044: "ltp", + 4045: "npp", + 4046: "acp-proto", + 4047: "ctp-state", + 4049: "wafs", + 4050: "cisco-wafs", + 4051: "cppdp", + 4052: "interact", + 4053: "ccu-comm-1", + 4054: "ccu-comm-2", + 4055: "ccu-comm-3", + 4056: "lms", + 4057: "wfm", + 4058: "kingfisher", + 4059: "dlms-cosem", + 4060: "dsmeter-iatc", + 4061: "ice-location", + 4062: "ice-slocation", + 4063: "ice-router", + 4064: "ice-srouter", + 4065: "avanti-cdp", + 4066: "pmas", + 4067: "idp", + 4068: "ipfltbcst", + 4069: "minger", + 4070: "tripe", + 4071: "aibkup", + 4072: "zieto-sock", + 4073: "iRAPP", + 4074: "cequint-cityid", + 4075: "perimlan", + 4076: "seraph", + 4077: "ascomalarm", + 4079: "santools", + 4080: "lorica-in", + 4081: "lorica-in-sec", + 4082: "lorica-out", + 4083: "lorica-out-sec", + 4084: "fortisphere-vm", + 4086: "ftsync", + 4089: "opencore", + 4090: "omasgport", + 4091: "ewinstaller", + 4092: "ewdgs", + 4093: "pvxpluscs", + 4094: "sysrqd", + 4095: "xtgui", + 4096: "bre", + 4097: "patrolview", + 4098: "drmsfsd", + 4099: "dpcp", + 4100: "igo-incognito", + 4101: "brlp-0", + 4102: "brlp-1", + 4103: "brlp-2", + 4104: "brlp-3", + 4105: "shofar", + 4106: "synchronite", + 4107: "j-ac", + 4108: "accel", + 4109: "izm", + 4110: "g2tag", + 4111: "xgrid", + 4112: "apple-vpns-rp", + 4113: "aipn-reg", + 4114: "jomamqmonitor", + 4115: "cds", + 4116: "smartcard-tls", + 4117: "hillrserv", + 4118: "netscript", + 4119: "assuria-slm", + 4121: "e-builder", + 4122: "fprams", + 4123: "z-wave", + 4124: "tigv2", + 4125: "opsview-envoy", + 4126: "ddrepl", + 4127: "unikeypro", + 4128: "nufw", + 4129: "nuauth", + 4130: "fronet", + 4131: "stars", + 4132: "nuts-dem", + 4133: "nuts-bootp", + 4134: "nifty-hmi", + 4135: "cl-db-attach", + 4136: "cl-db-request", + 4137: "cl-db-remote", + 4138: "nettest", + 4139: "thrtx", + 4140: "cedros-fds", + 4141: "oirtgsvc", + 4142: "oidocsvc", + 4143: "oidsr", + 4145: "vvr-control", + 4146: "tgcconnect", + 4147: "vrxpservman", + 4148: "hhb-handheld", + 4149: "agslb", + 4150: "PowerAlert-nsa", + 4151: "menandmice-noh", + 4152: "idig-mux", + 4153: "mbl-battd", + 4154: "atlinks", + 4155: "bzr", + 4156: "stat-results", + 4157: "stat-scanner", + 4158: "stat-cc", + 4159: "nss", + 4160: "jini-discovery", + 4161: "omscontact", + 4162: "omstopology", + 4163: "silverpeakpeer", + 4164: "silverpeakcomm", + 4165: "altcp", + 4166: "joost", + 4167: "ddgn", + 4168: "pslicser", + 4169: "iadt-disc", + 4172: "pcoip", + 4173: "mma-discovery", + 4174: "sm-disc", + 4177: "wello", + 4178: "storman", + 4179: "MaxumSP", + 4180: "httpx", + 4181: "macbak", + 4182: "pcptcpservice", + 4183: "cyborgnet", + 4184: "universe-suite", + 4185: "wcpp", + 4188: "vatata", + 4191: "dsmipv6", + 4192: "azeti-bd", + 4197: "hctl", + 4199: "eims-admin", + 4300: "corelccam", + 4301: "d-data", + 4302: "d-data-control", + 4303: "srcp", + 4304: "owserver", + 4305: "batman", + 4306: "pinghgl", + 4307: "trueconf", + 4308: "compx-lockview", + 4309: "dserver", + 4310: "mirrtex", + 4320: "fdt-rcatp", + 4321: "rwhois", + 4322: "trim-event", + 4323: "trim-ice", + 4325: "geognosisman", + 4326: "geognosis", + 4327: "jaxer-web", + 4328: "jaxer-manager", + 4333: "ahsp", + 4340: "gaia", + 4341: "lisp-data", + 4342: "lisp-control", + 4343: "unicall", + 4344: "vinainstall", + 4345: "m4-network-as", + 4346: "elanlm", + 4347: "lansurveyor", + 4348: "itose", + 4349: "fsportmap", + 4350: "net-device", + 4351: "plcy-net-svcs", + 4352: "pjlink", + 4353: "f5-iquery", + 4354: "qsnet-trans", + 4355: "qsnet-workst", + 4356: "qsnet-assist", + 4357: "qsnet-cond", + 4358: "qsnet-nucl", + 4359: "omabcastltkm", + 4361: "nacnl", + 4362: "afore-vdp-disc", + 4366: "shadowstream", + 4368: "wxbrief", + 4369: "epmd", + 4370: "elpro-tunnel", + 4371: "l2c-disc", + 4372: "l2c-data", + 4373: "remctl", + 4375: "tolteces", + 4376: "bip", + 4377: "cp-spxsvr", + 4378: "cp-spxdpy", + 4379: "ctdb", + 4389: "xandros-cms", + 4390: "wiegand", + 4394: "apwi-disc", + 4395: "omnivisionesx", + 4400: "ds-srv", + 4401: "ds-srvr", + 4402: "ds-clnt", + 4403: "ds-user", + 4404: "ds-admin", + 4405: "ds-mail", + 4406: "ds-slp", + 4412: "smallchat", + 4413: "avi-nms-disc", + 4416: "pjj-player-disc", + 4418: "axysbridge", + 4420: "nvm-express", + 4425: "netrockey6", + 4426: "beacon-port-2", + 4430: "rsqlserver", + 4432: "l-acoustics", + 4441: "netblox", + 4442: "saris", + 4443: "pharos", + 4444: "krb524", + 4445: "upnotifyp", + 4446: "n1-fwp", + 4447: "n1-rmgmt", + 4448: "asc-slmd", + 4449: "privatewire", + 4450: "camp", + 4451: "ctisystemmsg", + 4452: "ctiprogramload", + 4453: "nssalertmgr", + 4454: "nssagentmgr", + 4455: "prchat-user", + 4456: "prchat-server", + 4457: "prRegister", + 4458: "mcp", + 4484: "hpssmgmt", + 4486: "icms", + 4488: "awacs-ice", + 4500: "ipsec-nat-t", + 4534: "armagetronad", + 4535: "ehs", + 4536: "ehs-ssl", + 4537: "wssauthsvc", + 4538: "swx-gate", + 4545: "worldscores", + 4546: "sf-lm", + 4547: "lanner-lm", + 4548: "synchromesh", + 4549: "aegate", + 4550: "gds-adppiw-db", + 4551: "ieee-mih", + 4552: "menandmice-mon", + 4554: "msfrs", + 4555: "rsip", + 4556: "dtn-bundle", + 4557: "mtcevrunqss", + 4558: "mtcevrunqman", + 4559: "hylafax", + 4566: "kwtc", + 4567: "tram", + 4568: "bmc-reporting", + 4569: "iax", + 4591: "l3t-at-an", + 4592: "hrpd-ith-at-an", + 4593: "ipt-anri-anri", + 4594: "ias-session", + 4595: "ias-paging", + 4596: "ias-neighbor", + 4597: "a21-an-1xbs", + 4598: "a16-an-an", + 4599: "a17-an-an", + 4600: "piranha1", + 4601: "piranha2", + 4621: "ventoso", + 4658: "playsta2-app", + 4659: "playsta2-lob", + 4660: "smaclmgr", + 4661: "kar2ouche", + 4662: "oms", + 4663: "noteit", + 4664: "ems", + 4665: "contclientms", + 4666: "eportcomm", + 4667: "mmacomm", + 4668: "mmaeds", + 4669: "eportcommdata", + 4670: "light", + 4671: "acter", + 4672: "rfa", + 4673: "cxws", + 4674: "appiq-mgmt", + 4675: "dhct-status", + 4676: "dhct-alerts", + 4677: "bcs", + 4678: "traversal", + 4679: "mgesupervision", + 4680: "mgemanagement", + 4681: "parliant", + 4682: "finisar", + 4683: "spike", + 4684: "rfid-rp1", + 4685: "autopac", + 4686: "msp-os", + 4687: "nst", + 4688: "mobile-p2p", + 4689: "altovacentral", + 4690: "prelude", + 4691: "mtn", + 4692: "conspiracy", + 4700: "netxms-agent", + 4701: "netxms-mgmt", + 4702: "netxms-sync", + 4711: "trinity-dist", + 4725: "truckstar", + 4726: "a26-fap-fgw", + 4727: "fcis-disc", + 4728: "capmux", + 4729: "gsmtap", + 4730: "gearman", + 4732: "ohmtrigger", + 4737: "ipdr-sp", + 4738: "solera-lpn", + 4739: "ipfix", + 4740: "ipfixs", + 4741: "lumimgrd", + 4742: "sicct-sdp", + 4743: "openhpid", + 4744: "ifsp", + 4745: "fmp", + 4746: "intelliadm-disc", + 4747: "buschtrommel", + 4749: "profilemac", + 4750: "ssad", + 4751: "spocp", + 4752: "snap", + 4753: "simon-disc", + 4754: "gre-in-udp", + 4755: "gre-udp-dtls", + 4784: "bfd-multi-ctl", + 4785: "cncp", + 4789: "vxlan", + 4790: "vxlan-gpe", + 4791: "roce", + 4800: "iims", + 4801: "iwec", + 4802: "ilss", + 4803: "notateit-disc", + 4804: "aja-ntv4-disc", + 4827: "htcp", + 4837: "varadero-0", + 4838: "varadero-1", + 4839: "varadero-2", + 4840: "opcua-udp", + 4841: "quosa", + 4842: "gw-asv", + 4843: "opcua-tls", + 4844: "gw-log", + 4845: "wcr-remlib", + 4846: "contamac-icm", + 4847: "wfc", + 4848: "appserv-http", + 4849: "appserv-https", + 4850: "sun-as-nodeagt", + 4851: "derby-repli", + 4867: "unify-debug", + 4868: "phrelay", + 4869: "phrelaydbg", + 4870: "cc-tracking", + 4871: "wired", + 4876: "tritium-can", + 4877: "lmcs", + 4878: "inst-discovery", + 4881: "socp-t", + 4882: "socp-c", + 4884: "hivestor", + 4885: "abbs", + 4894: "lyskom", + 4899: "radmin-port", + 4900: "hfcs", + 4914: "bones", + 4936: "an-signaling", + 4937: "atsc-mh-ssc", + 4940: "eq-office-4940", + 4941: "eq-office-4941", + 4942: "eq-office-4942", + 4949: "munin", + 4950: "sybasesrvmon", + 4951: "pwgwims", + 4952: "sagxtsds", + 4969: "ccss-qmm", + 4970: "ccss-qsm", + 4980: "ctxs-vpp", + 4986: "mrip", + 4987: "smar-se-port1", + 4988: "smar-se-port2", + 4989: "parallel", + 4990: "busycal", + 4991: "vrt", + 4999: "hfcs-manager", + 5000: "commplex-main", + 5001: "commplex-link", + 5002: "rfe", + 5003: "fmpro-internal", + 5004: "avt-profile-1", + 5005: "avt-profile-2", + 5006: "wsm-server", + 5007: "wsm-server-ssl", + 5008: "synapsis-edge", + 5009: "winfs", + 5010: "telelpathstart", + 5011: "telelpathattack", + 5012: "nsp", + 5013: "fmpro-v6", + 5014: "onpsocket", + 5020: "zenginkyo-1", + 5021: "zenginkyo-2", + 5022: "mice", + 5023: "htuilsrv", + 5024: "scpi-telnet", + 5025: "scpi-raw", + 5026: "strexec-d", + 5027: "strexec-s", + 5029: "infobright", + 5030: "surfpass", + 5031: "dmp", + 5042: "asnaacceler8db", + 5043: "swxadmin", + 5044: "lxi-evntsvc", + 5046: "vpm-udp", + 5047: "iscape", + 5049: "ivocalize", + 5050: "mmcc", + 5051: "ita-agent", + 5052: "ita-manager", + 5053: "rlm-disc", + 5055: "unot", + 5056: "intecom-ps1", + 5057: "intecom-ps2", + 5058: "locus-disc", + 5059: "sds", + 5060: "sip", + 5061: "sips", + 5062: "na-localise", + 5064: "ca-1", + 5065: "ca-2", + 5066: "stanag-5066", + 5067: "authentx", + 5069: "i-net-2000-npr", + 5070: "vtsas", + 5071: "powerschool", + 5072: "ayiya", + 5073: "tag-pm", + 5074: "alesquery", + 5078: "pixelpusher", + 5079: "cp-spxrpts", + 5080: "onscreen", + 5081: "sdl-ets", + 5082: "qcp", + 5083: "qfp", + 5084: "llrp", + 5085: "encrypted-llrp", + 5092: "magpie", + 5093: "sentinel-lm", + 5094: "hart-ip", + 5099: "sentlm-srv2srv", + 5100: "socalia", + 5101: "talarian-udp", + 5102: "oms-nonsecure", + 5104: "tinymessage", + 5105: "hughes-ap", + 5111: "taep-as-svc", + 5112: "pm-cmdsvr", + 5116: "emb-proj-cmd", + 5120: "barracuda-bbs", + 5133: "nbt-pc", + 5136: "minotaur-sa", + 5137: "ctsd", + 5145: "rmonitor-secure", + 5150: "atmp", + 5151: "esri-sde", + 5152: "sde-discovery", + 5154: "bzflag", + 5155: "asctrl-agent", + 5164: "vpa-disc", + 5165: "ife-icorp", + 5166: "winpcs", + 5167: "scte104", + 5168: "scte30", + 5190: "aol", + 5191: "aol-1", + 5192: "aol-2", + 5193: "aol-3", + 5200: "targus-getdata", + 5201: "targus-getdata1", + 5202: "targus-getdata2", + 5203: "targus-getdata3", + 5223: "hpvirtgrp", + 5224: "hpvirtctrl", + 5225: "hp-server", + 5226: "hp-status", + 5227: "perfd", + 5234: "eenet", + 5235: "galaxy-network", + 5236: "padl2sim", + 5237: "mnet-discovery", + 5245: "downtools-disc", + 5246: "capwap-control", + 5247: "capwap-data", + 5248: "caacws", + 5249: "caaclang2", + 5250: "soagateway", + 5251: "caevms", + 5252: "movaz-ssc", + 5264: "3com-njack-1", + 5265: "3com-njack-2", + 5270: "cartographerxmp", + 5271: "cuelink-disc", + 5272: "pk", + 5282: "transmit-port", + 5298: "presence", + 5299: "nlg-data", + 5300: "hacl-hb", + 5301: "hacl-gs", + 5302: "hacl-cfg", + 5303: "hacl-probe", + 5304: "hacl-local", + 5305: "hacl-test", + 5306: "sun-mc-grp", + 5307: "sco-aip", + 5308: "cfengine", + 5309: "jprinter", + 5310: "outlaws", + 5312: "permabit-cs", + 5313: "rrdp", + 5314: "opalis-rbt-ipc", + 5315: "hacl-poll", + 5343: "kfserver", + 5344: "xkotodrcp", + 5349: "stuns", + 5350: "pcp-multicast", + 5351: "pcp", + 5352: "dns-llq", + 5353: "mdns", + 5354: "mdnsresponder", + 5355: "llmnr", + 5356: "ms-smlbiz", + 5357: "wsdapi", + 5358: "wsdapi-s", + 5359: "ms-alerter", + 5360: "ms-sideshow", + 5361: "ms-s-sideshow", + 5362: "serverwsd2", + 5363: "net-projection", + 5364: "kdnet", + 5397: "stresstester", + 5398: "elektron-admin", + 5399: "securitychase", + 5400: "excerpt", + 5401: "excerpts", + 5402: "mftp", + 5403: "hpoms-ci-lstn", + 5404: "hpoms-dps-lstn", + 5405: "netsupport", + 5406: "systemics-sox", + 5407: "foresyte-clear", + 5408: "foresyte-sec", + 5409: "salient-dtasrv", + 5410: "salient-usrmgr", + 5411: "actnet", + 5412: "continuus", + 5413: "wwiotalk", + 5414: "statusd", + 5415: "ns-server", + 5416: "sns-gateway", + 5417: "sns-agent", + 5418: "mcntp", + 5419: "dj-ice", + 5420: "cylink-c", + 5421: "netsupport2", + 5422: "salient-mux", + 5423: "virtualuser", + 5424: "beyond-remote", + 5425: "br-channel", + 5426: "devbasic", + 5427: "sco-peer-tta", + 5428: "telaconsole", + 5429: "base", + 5430: "radec-corp", + 5431: "park-agent", + 5432: "postgresql", + 5433: "pyrrho", + 5434: "sgi-arrayd", + 5435: "sceanics", + 5436: "pmip6-cntl", + 5437: "pmip6-data", + 5443: "spss", + 5450: "tiepie-disc", + 5453: "surebox", + 5454: "apc-5454", + 5455: "apc-5455", + 5456: "apc-5456", + 5461: "silkmeter", + 5462: "ttl-publisher", + 5463: "ttlpriceproxy", + 5464: "quailnet", + 5465: "netops-broker", + 5474: "apsolab-rpc", + 5500: "fcp-addr-srvr1", + 5501: "fcp-addr-srvr2", + 5502: "fcp-srvr-inst1", + 5503: "fcp-srvr-inst2", + 5504: "fcp-cics-gw1", + 5505: "checkoutdb", + 5506: "amc", + 5553: "sgi-eventmond", + 5554: "sgi-esphttp", + 5555: "personal-agent", + 5556: "freeciv", + 5567: "dof-dps-mc-sec", + 5568: "sdt", + 5569: "rdmnet-device", + 5573: "sdmmp", + 5580: "tmosms0", + 5581: "tmosms1", + 5582: "fac-restore", + 5583: "tmo-icon-sync", + 5584: "bis-web", + 5585: "bis-sync", + 5597: "ininmessaging", + 5598: "mctfeed", + 5599: "esinstall", + 5600: "esmmanager", + 5601: "esmagent", + 5602: "a1-msc", + 5603: "a1-bs", + 5604: "a3-sdunode", + 5605: "a4-sdunode", + 5627: "ninaf", + 5628: "htrust", + 5629: "symantec-sfdb", + 5630: "precise-comm", + 5631: "pcanywheredata", + 5632: "pcanywherestat", + 5633: "beorl", + 5634: "xprtld", + 5670: "zre-disc", + 5671: "amqps", + 5672: "amqp", + 5673: "jms", + 5674: "hyperscsi-port", + 5675: "v5ua", + 5676: "raadmin", + 5677: "questdb2-lnchr", + 5678: "rrac", + 5679: "dccm", + 5680: "auriga-router", + 5681: "ncxcp", + 5682: "brightcore", + 5683: "coap", + 5684: "coaps", + 5687: "gog-multiplayer", + 5688: "ggz", + 5689: "qmvideo", + 5713: "proshareaudio", + 5714: "prosharevideo", + 5715: "prosharedata", + 5716: "prosharerequest", + 5717: "prosharenotify", + 5718: "dpm", + 5719: "dpm-agent", + 5720: "ms-licensing", + 5721: "dtpt", + 5722: "msdfsr", + 5723: "omhs", + 5724: "omsdk", + 5728: "io-dist-group", + 5729: "openmail", + 5730: "unieng", + 5741: "ida-discover1", + 5742: "ida-discover2", + 5743: "watchdoc-pod", + 5744: "watchdoc", + 5745: "fcopy-server", + 5746: "fcopys-server", + 5747: "tunatic", + 5748: "tunalyzer", + 5750: "rscd", + 5755: "openmailg", + 5757: "x500ms", + 5766: "openmailns", + 5767: "s-openmail", + 5768: "openmailpxy", + 5769: "spramsca", + 5770: "spramsd", + 5771: "netagent", + 5777: "dali-port", + 5781: "3par-evts", + 5782: "3par-mgmt", + 5783: "3par-mgmt-ssl", + 5784: "ibar", + 5785: "3par-rcopy", + 5786: "cisco-redu", + 5787: "waascluster", + 5793: "xtreamx", + 5794: "spdp", + 5813: "icmpd", + 5814: "spt-automation", + 5859: "wherehoo", + 5863: "ppsuitemsg", + 5900: "rfb", + 5910: "cm", + 5911: "cpdlc", + 5912: "fis", + 5913: "ads-c", + 5963: "indy", + 5968: "mppolicy-v5", + 5969: "mppolicy-mgr", + 5984: "couchdb", + 5985: "wsman", + 5986: "wsmans", + 5987: "wbem-rmi", + 5988: "wbem-http", + 5989: "wbem-https", + 5990: "wbem-exp-https", + 5991: "nuxsl", + 5992: "consul-insight", + 5999: "cvsup", + 6064: "ndl-ahp-svc", + 6065: "winpharaoh", + 6066: "ewctsp", + 6069: "trip", + 6070: "messageasap", + 6071: "ssdtp", + 6072: "diagnose-proc", + 6073: "directplay8", + 6074: "max", + 6080: "gue", + 6081: "geneve", + 6082: "p25cai", + 6083: "miami-bcast", + 6085: "konspire2b", + 6086: "pdtp", + 6087: "ldss", + 6088: "doglms-notify", + 6100: "synchronet-db", + 6101: "synchronet-rtc", + 6102: "synchronet-upd", + 6103: "rets", + 6104: "dbdb", + 6105: "primaserver", + 6106: "mpsserver", + 6107: "etc-control", + 6108: "sercomm-scadmin", + 6109: "globecast-id", + 6110: "softcm", + 6111: "spc", + 6112: "dtspcd", + 6118: "tipc", + 6122: "bex-webadmin", + 6123: "backup-express", + 6124: "pnbs", + 6133: "nbt-wol", + 6140: "pulsonixnls", + 6141: "meta-corp", + 6142: "aspentec-lm", + 6143: "watershed-lm", + 6144: "statsci1-lm", + 6145: "statsci2-lm", + 6146: "lonewolf-lm", + 6147: "montage-lm", + 6148: "ricardo-lm", + 6149: "tal-pod", + 6160: "ecmp-data", + 6161: "patrol-ism", + 6162: "patrol-coll", + 6163: "pscribe", + 6200: "lm-x", + 6201: "thermo-calc", + 6209: "qmtps", + 6222: "radmind", + 6241: "jeol-nsddp-1", + 6242: "jeol-nsddp-2", + 6243: "jeol-nsddp-3", + 6244: "jeol-nsddp-4", + 6251: "tl1-raw-ssl", + 6252: "tl1-ssh", + 6253: "crip", + 6268: "grid", + 6269: "grid-alt", + 6300: "bmc-grx", + 6301: "bmc-ctd-ldap", + 6306: "ufmp", + 6315: "scup-disc", + 6316: "abb-escp", + 6317: "nav-data", + 6320: "repsvc", + 6321: "emp-server1", + 6322: "emp-server2", + 6324: "hrd-ns-disc", + 6343: "sflow", + 6346: "gnutella-svc", + 6347: "gnutella-rtr", + 6350: "adap", + 6355: "pmcs", + 6360: "metaedit-mu", + 6363: "ndn", + 6370: "metaedit-se", + 6382: "metatude-mds", + 6389: "clariion-evr01", + 6390: "metaedit-ws", + 6417: "faxcomservice", + 6419: "svdrp-disc", + 6420: "nim-vdrshell", + 6421: "nim-wan", + 6443: "sun-sr-https", + 6444: "sge-qmaster", + 6445: "sge-execd", + 6446: "mysql-proxy", + 6455: "skip-cert-recv", + 6456: "skip-cert-send", + 6464: "ieee11073-20701", + 6471: "lvision-lm", + 6480: "sun-sr-http", + 6481: "servicetags", + 6482: "ldoms-mgmt", + 6483: "SunVTS-RMI", + 6484: "sun-sr-jms", + 6485: "sun-sr-iiop", + 6486: "sun-sr-iiops", + 6487: "sun-sr-iiop-aut", + 6488: "sun-sr-jmx", + 6489: "sun-sr-admin", + 6500: "boks", + 6501: "boks-servc", + 6502: "boks-servm", + 6503: "boks-clntd", + 6505: "badm-priv", + 6506: "badm-pub", + 6507: "bdir-priv", + 6508: "bdir-pub", + 6509: "mgcs-mfp-port", + 6510: "mcer-port", + 6511: "dccp-udp", + 6514: "syslog-tls", + 6515: "elipse-rec", + 6543: "lds-distrib", + 6544: "lds-dump", + 6547: "apc-6547", + 6548: "apc-6548", + 6549: "apc-6549", + 6550: "fg-sysupdate", + 6551: "sum", + 6558: "xdsxdm", + 6566: "sane-port", + 6568: "rp-reputation", + 6579: "affiliate", + 6580: "parsec-master", + 6581: "parsec-peer", + 6582: "parsec-game", + 6583: "joaJewelSuite", + 6619: "odette-ftps", + 6620: "kftp-data", + 6621: "kftp", + 6622: "mcftp", + 6623: "ktelnet", + 6626: "wago-service", + 6627: "nexgen", + 6628: "afesc-mc", + 6629: "nexgen-aux", + 6633: "cisco-vpath-tun", + 6634: "mpls-pm", + 6635: "mpls-udp", + 6636: "mpls-udp-dtls", + 6653: "openflow", + 6657: "palcom-disc", + 6670: "vocaltec-gold", + 6671: "p4p-portal", + 6672: "vision-server", + 6673: "vision-elmd", + 6678: "vfbp-disc", + 6679: "osaut", + 6689: "tsa", + 6696: "babel", + 6701: "kti-icad-srvr", + 6702: "e-design-net", + 6703: "e-design-web", + 6714: "ibprotocol", + 6715: "fibotrader-com", + 6767: "bmc-perf-agent", + 6768: "bmc-perf-mgrd", + 6769: "adi-gxp-srvprt", + 6770: "plysrv-http", + 6771: "plysrv-https", + 6784: "bfd-lag", + 6785: "dgpf-exchg", + 6786: "smc-jmx", + 6787: "smc-admin", + 6788: "smc-http", + 6790: "hnmp", + 6791: "hnm", + 6801: "acnet", + 6831: "ambit-lm", + 6841: "netmo-default", + 6842: "netmo-http", + 6850: "iccrushmore", + 6868: "acctopus-st", + 6888: "muse", + 6935: "ethoscan", + 6936: "xsmsvc", + 6946: "bioserver", + 6951: "otlp", + 6961: "jmact3", + 6962: "jmevt2", + 6963: "swismgr1", + 6964: "swismgr2", + 6965: "swistrap", + 6966: "swispol", + 6969: "acmsoda", + 6997: "MobilitySrv", + 6998: "iatp-highpri", + 6999: "iatp-normalpri", + 7000: "afs3-fileserver", + 7001: "afs3-callback", + 7002: "afs3-prserver", + 7003: "afs3-vlserver", + 7004: "afs3-kaserver", + 7005: "afs3-volser", + 7006: "afs3-errors", + 7007: "afs3-bos", + 7008: "afs3-update", + 7009: "afs3-rmtsys", + 7010: "ups-onlinet", + 7011: "talon-disc", + 7012: "talon-engine", + 7013: "microtalon-dis", + 7014: "microtalon-com", + 7015: "talon-webserver", + 7016: "spg", + 7017: "grasp", + 7019: "doceri-view", + 7020: "dpserve", + 7021: "dpserveadmin", + 7022: "ctdp", + 7023: "ct2nmcs", + 7024: "vmsvc", + 7025: "vmsvc-2", + 7030: "op-probe", + 7040: "quest-disc", + 7070: "arcp", + 7071: "iwg1", + 7080: "empowerid", + 7088: "zixi-transport", + 7095: "jdp-disc", + 7099: "lazy-ptop", + 7100: "font-service", + 7101: "elcn", + 7107: "aes-x170", + 7121: "virprot-lm", + 7128: "scenidm", + 7129: "scenccs", + 7161: "cabsm-comm", + 7162: "caistoragemgr", + 7163: "cacsambroker", + 7164: "fsr", + 7165: "doc-server", + 7166: "aruba-server", + 7169: "ccag-pib", + 7170: "nsrp", + 7171: "drm-production", + 7174: "clutild", + 7181: "janus-disc", + 7200: "fodms", + 7201: "dlip", + 7227: "ramp", + 7235: "aspcoordination", + 7244: "frc-hicp-disc", + 7262: "cnap", + 7272: "watchme-7272", + 7273: "oma-rlp", + 7274: "oma-rlp-s", + 7275: "oma-ulp", + 7276: "oma-ilp", + 7277: "oma-ilp-s", + 7278: "oma-dcdocbs", + 7279: "ctxlic", + 7280: "itactionserver1", + 7281: "itactionserver2", + 7282: "mzca-alert", + 7365: "lcm-server", + 7391: "mindfilesys", + 7392: "mrssrendezvous", + 7393: "nfoldman", + 7394: "fse", + 7395: "winqedit", + 7397: "hexarc", + 7400: "rtps-discovery", + 7401: "rtps-dd-ut", + 7402: "rtps-dd-mt", + 7410: "ionixnetmon", + 7411: "daqstream", + 7421: "mtportmon", + 7426: "pmdmgr", + 7427: "oveadmgr", + 7428: "ovladmgr", + 7429: "opi-sock", + 7430: "xmpv7", + 7431: "pmd", + 7437: "faximum", + 7443: "oracleas-https", + 7473: "rise", + 7491: "telops-lmd", + 7500: "silhouette", + 7501: "ovbus", + 7510: "ovhpas", + 7511: "pafec-lm", + 7542: "saratoga", + 7543: "atul", + 7544: "nta-ds", + 7545: "nta-us", + 7546: "cfs", + 7547: "cwmp", + 7548: "tidp", + 7549: "nls-tl", + 7550: "cloudsignaling", + 7560: "sncp", + 7566: "vsi-omega", + 7570: "aries-kfinder", + 7574: "coherence-disc", + 7588: "sun-lm", + 7606: "mipi-debug", + 7624: "indi", + 7627: "soap-http", + 7628: "zen-pawn", + 7629: "xdas", + 7633: "pmdfmgt", + 7648: "cuseeme", + 7674: "imqtunnels", + 7675: "imqtunnel", + 7676: "imqbrokerd", + 7677: "sun-user-https", + 7680: "pando-pub", + 7689: "collaber", + 7697: "klio", + 7707: "sync-em7", + 7708: "scinet", + 7720: "medimageportal", + 7724: "nsdeepfreezectl", + 7725: "nitrogen", + 7726: "freezexservice", + 7727: "trident-data", + 7728: "osvr", + 7734: "smip", + 7738: "aiagent", + 7741: "scriptview", + 7743: "sstp-1", + 7744: "raqmon-pdu", + 7747: "prgp", + 7777: "cbt", + 7778: "interwise", + 7779: "vstat", + 7781: "accu-lmgr", + 7784: "s-bfd", + 7786: "minivend", + 7787: "popup-reminders", + 7789: "office-tools", + 7794: "q3ade", + 7797: "pnet-conn", + 7798: "pnet-enc", + 7799: "altbsdp", + 7800: "asr", + 7801: "ssp-client", + 7802: "vns-tp", + 7810: "rbt-wanopt", + 7845: "apc-7845", + 7846: "apc-7846", + 7872: "mipv6tls", + 7880: "pss", + 7887: "ubroker", + 7900: "mevent", + 7901: "tnos-sp", + 7902: "tnos-dp", + 7903: "tnos-dps", + 7913: "qo-secure", + 7932: "t2-drm", + 7933: "t2-brm", + 7962: "generalsync", + 7967: "supercell", + 7979: "micromuse-ncps", + 7980: "quest-vista", + 7982: "sossd-disc", + 7998: "usicontentpush", + 7999: "irdmi2", + 8000: "irdmi", + 8001: "vcom-tunnel", + 8002: "teradataordbms", + 8003: "mcreport", + 8005: "mxi", + 8006: "wpl-disc", + 8007: "warppipe", + 8008: "http-alt", + 8019: "qbdb", + 8020: "intu-ec-svcdisc", + 8021: "intu-ec-client", + 8022: "oa-system", + 8025: "ca-audit-da", + 8026: "ca-audit-ds", + 8032: "pro-ed", + 8033: "mindprint", + 8034: "vantronix-mgmt", + 8040: "ampify", + 8041: "enguity-xccetp", + 8052: "senomix01", + 8053: "senomix02", + 8054: "senomix03", + 8055: "senomix04", + 8056: "senomix05", + 8057: "senomix06", + 8058: "senomix07", + 8059: "senomix08", + 8060: "aero", + 8074: "gadugadu", + 8080: "http-alt", + 8081: "sunproxyadmin", + 8082: "us-cli", + 8083: "us-srv", + 8086: "d-s-n", + 8087: "simplifymedia", + 8088: "radan-http", + 8097: "sac", + 8100: "xprint-server", + 8115: "mtl8000-matrix", + 8116: "cp-cluster", + 8118: "privoxy", + 8121: "apollo-data", + 8122: "apollo-admin", + 8128: "paycash-online", + 8129: "paycash-wbp", + 8130: "indigo-vrmi", + 8131: "indigo-vbcp", + 8132: "dbabble", + 8148: "isdd", + 8149: "eor-game", + 8160: "patrol", + 8161: "patrol-snmp", + 8182: "vmware-fdm", + 8184: "itach", + 8192: "spytechphone", + 8194: "blp1", + 8195: "blp2", + 8199: "vvr-data", + 8200: "trivnet1", + 8201: "trivnet2", + 8202: "aesop", + 8204: "lm-perfworks", + 8205: "lm-instmgr", + 8206: "lm-dta", + 8207: "lm-sserver", + 8208: "lm-webwatcher", + 8230: "rexecj", + 8231: "hncp-udp-port", + 8232: "hncp-dtls-port", + 8243: "synapse-nhttps", + 8276: "pando-sec", + 8280: "synapse-nhttp", + 8282: "libelle-disc", + 8292: "blp3", + 8294: "blp4", + 8300: "tmi", + 8301: "amberon", + 8320: "tnp-discover", + 8321: "tnp", + 8322: "garmin-marine", + 8351: "server-find", + 8376: "cruise-enum", + 8377: "cruise-swroute", + 8378: "cruise-config", + 8379: "cruise-diags", + 8380: "cruise-update", + 8383: "m2mservices", + 8384: "marathontp", + 8400: "cvd", + 8401: "sabarsd", + 8402: "abarsd", + 8403: "admind", + 8416: "espeech", + 8417: "espeech-rtp", + 8442: "cybro-a-bus", + 8443: "pcsync-https", + 8444: "pcsync-http", + 8445: "copy-disc", + 8450: "npmp", + 8472: "otv", + 8473: "vp2p", + 8474: "noteshare", + 8500: "fmtp", + 8501: "cmtp-av", + 8503: "lsp-self-ping", + 8554: "rtsp-alt", + 8555: "d-fence", + 8567: "dof-tunnel", + 8600: "asterix", + 8609: "canon-cpp-disc", + 8610: "canon-mfnp", + 8611: "canon-bjnp1", + 8612: "canon-bjnp2", + 8613: "canon-bjnp3", + 8614: "canon-bjnp4", + 8675: "msi-cps-rm-disc", + 8686: "sun-as-jmxrmi", + 8732: "dtp-net", + 8733: "ibus", + 8763: "mc-appserver", + 8764: "openqueue", + 8765: "ultraseek-http", + 8766: "amcs", + 8770: "dpap", + 8786: "msgclnt", + 8787: "msgsrvr", + 8793: "acd-pm", + 8800: "sunwebadmin", + 8804: "truecm", + 8805: "pfcp", + 8808: "ssports-bcast", + 8873: "dxspider", + 8880: "cddbp-alt", + 8883: "secure-mqtt", + 8888: "ddi-udp-1", + 8889: "ddi-udp-2", + 8890: "ddi-udp-3", + 8891: "ddi-udp-4", + 8892: "ddi-udp-5", + 8893: "ddi-udp-6", + 8894: "ddi-udp-7", + 8899: "ospf-lite", + 8900: "jmb-cds1", + 8901: "jmb-cds2", + 8910: "manyone-http", + 8911: "manyone-xml", + 8912: "wcbackup", + 8913: "dragonfly", + 8954: "cumulus-admin", + 8980: "nod-provider", + 8981: "nod-client", + 8989: "sunwebadmins", + 8990: "http-wmap", + 8991: "https-wmap", + 8999: "bctp", + 9000: "cslistener", + 9001: "etlservicemgr", + 9002: "dynamid", + 9007: "ogs-client", + 9009: "pichat", + 9020: "tambora", + 9021: "panagolin-ident", + 9022: "paragent", + 9023: "swa-1", + 9024: "swa-2", + 9025: "swa-3", + 9026: "swa-4", + 9060: "CardWeb-RT", + 9080: "glrpc", + 9084: "aurora", + 9085: "ibm-rsyscon", + 9086: "net2display", + 9087: "classic", + 9088: "sqlexec", + 9089: "sqlexec-ssl", + 9090: "websm", + 9091: "xmltec-xmlmail", + 9092: "XmlIpcRegSvc", + 9100: "hp-pdl-datastr", + 9101: "bacula-dir", + 9102: "bacula-fd", + 9103: "bacula-sd", + 9104: "peerwire", + 9105: "xadmin", + 9106: "astergate-disc", + 9119: "mxit", + 9131: "dddp", + 9160: "apani1", + 9161: "apani2", + 9162: "apani3", + 9163: "apani4", + 9164: "apani5", + 9191: "sun-as-jpda", + 9200: "wap-wsp", + 9201: "wap-wsp-wtp", + 9202: "wap-wsp-s", + 9203: "wap-wsp-wtp-s", + 9204: "wap-vcard", + 9205: "wap-vcal", + 9206: "wap-vcard-s", + 9207: "wap-vcal-s", + 9208: "rjcdb-vcards", + 9209: "almobile-system", + 9210: "oma-mlp", + 9211: "oma-mlp-s", + 9212: "serverviewdbms", + 9213: "serverstart", + 9214: "ipdcesgbs", + 9215: "insis", + 9216: "acme", + 9217: "fsc-port", + 9222: "teamcoherence", + 9255: "mon", + 9277: "traingpsdata", + 9278: "pegasus", + 9279: "pegasus-ctl", + 9280: "pgps", + 9281: "swtp-port1", + 9282: "swtp-port2", + 9283: "callwaveiam", + 9284: "visd", + 9285: "n2h2server", + 9286: "n2receive", + 9287: "cumulus", + 9292: "armtechdaemon", + 9293: "storview", + 9294: "armcenterhttp", + 9295: "armcenterhttps", + 9300: "vrace", + 9318: "secure-ts", + 9321: "guibase", + 9343: "mpidcmgr", + 9344: "mphlpdmc", + 9346: "ctechlicensing", + 9374: "fjdmimgr", + 9380: "boxp", + 9396: "fjinvmgr", + 9397: "mpidcagt", + 9400: "sec-t4net-srv", + 9401: "sec-t4net-clt", + 9402: "sec-pc2fax-srv", + 9418: "git", + 9443: "tungsten-https", + 9444: "wso2esb-console", + 9450: "sntlkeyssrvr", + 9500: "ismserver", + 9522: "sma-spw", + 9535: "mngsuite", + 9536: "laes-bf", + 9555: "trispen-sra", + 9592: "ldgateway", + 9593: "cba8", + 9594: "msgsys", + 9595: "pds", + 9596: "mercury-disc", + 9597: "pd-admin", + 9598: "vscp", + 9599: "robix", + 9600: "micromuse-ncpw", + 9612: "streamcomm-ds", + 9618: "condor", + 9628: "odbcpathway", + 9629: "uniport", + 9632: "mc-comm", + 9667: "xmms2", + 9668: "tec5-sdctp", + 9694: "client-wakeup", + 9695: "ccnx", + 9700: "board-roar", + 9747: "l5nas-parchan", + 9750: "board-voip", + 9753: "rasadv", + 9762: "tungsten-http", + 9800: "davsrc", + 9801: "sstp-2", + 9802: "davsrcs", + 9875: "sapv1", + 9878: "kca-service", + 9888: "cyborg-systems", + 9889: "gt-proxy", + 9898: "monkeycom", + 9899: "sctp-tunneling", + 9900: "iua", + 9901: "enrp", + 9903: "multicast-ping", + 9909: "domaintime", + 9911: "sype-transport", + 9950: "apc-9950", + 9951: "apc-9951", + 9952: "apc-9952", + 9953: "acis", + 9955: "alljoyn-mcm", + 9956: "alljoyn", + 9966: "odnsp", + 9987: "dsm-scm-target", + 9990: "osm-appsrvr", + 9991: "osm-oev", + 9992: "palace-1", + 9993: "palace-2", + 9994: "palace-3", + 9995: "palace-4", + 9996: "palace-5", + 9997: "palace-6", + 9998: "distinct32", + 9999: "distinct", + 10000: "ndmp", + 10001: "scp-config", + 10002: "documentum", + 10003: "documentum-s", + 10007: "mvs-capacity", + 10008: "octopus", + 10009: "swdtp-sv", + 10050: "zabbix-agent", + 10051: "zabbix-trapper", + 10080: "amanda", + 10081: "famdc", + 10100: "itap-ddtp", + 10101: "ezmeeting-2", + 10102: "ezproxy-2", + 10103: "ezrelay", + 10104: "swdtp", + 10107: "bctp-server", + 10110: "nmea-0183", + 10111: "nmea-onenet", + 10113: "netiq-endpoint", + 10114: "netiq-qcheck", + 10115: "netiq-endpt", + 10116: "netiq-voipa", + 10117: "iqrm", + 10128: "bmc-perf-sd", + 10160: "qb-db-server", + 10161: "snmpdtls", + 10162: "snmpdtls-trap", + 10200: "trisoap", + 10201: "rscs", + 10252: "apollo-relay", + 10253: "eapol-relay", + 10260: "axis-wimp-port", + 10288: "blocks", + 10439: "bngsync", + 10500: "hip-nat-t", + 10540: "MOS-lower", + 10541: "MOS-upper", + 10542: "MOS-aux", + 10543: "MOS-soap", + 10544: "MOS-soap-opt", + 10800: "gap", + 10805: "lpdg", + 10810: "nmc-disc", + 10860: "helix", + 10880: "bveapi", + 10990: "rmiaux", + 11000: "irisa", + 11001: "metasys", + 10023: "cefd-vmp", + 11095: "weave", + 11106: "sgi-lk", + 11108: "myq-termlink", + 11111: "vce", + 11112: "dicom", + 11161: "suncacao-snmp", + 11162: "suncacao-jmxmp", + 11163: "suncacao-rmi", + 11164: "suncacao-csa", + 11165: "suncacao-websvc", + 11171: "snss", + 11201: "smsqp", + 11208: "wifree", + 11211: "memcache", + 11319: "imip", + 11320: "imip-channels", + 11321: "arena-server", + 11367: "atm-uhas", + 11371: "hkp", + 11430: "lsdp", + 11600: "tempest-port", + 11720: "h323callsigalt", + 11723: "emc-xsw-dcache", + 11751: "intrepid-ssl", + 11796: "lanschool-mpt", + 11876: "xoraya", + 11877: "x2e-disc", + 11967: "sysinfo-sp", + 12000: "entextxid", + 12001: "entextnetwk", + 12002: "entexthigh", + 12003: "entextmed", + 12004: "entextlow", + 12005: "dbisamserver1", + 12006: "dbisamserver2", + 12007: "accuracer", + 12008: "accuracer-dbms", + 12009: "ghvpn", + 12012: "vipera", + 12013: "vipera-ssl", + 12109: "rets-ssl", + 12121: "nupaper-ss", + 12168: "cawas", + 12172: "hivep", + 12300: "linogridengine", + 12321: "warehouse-sss", + 12322: "warehouse", + 12345: "italk", + 12753: "tsaf", + 13160: "i-zipqd", + 13216: "bcslogc", + 13217: "rs-pias", + 13218: "emc-vcas-udp", + 13223: "powwow-client", + 13224: "powwow-server", + 13400: "doip-disc", + 13720: "bprd", + 13721: "bpdbm", + 13722: "bpjava-msvc", + 13724: "vnetd", + 13782: "bpcd", + 13783: "vopied", + 13785: "nbdb", + 13786: "nomdb", + 13818: "dsmcc-config", + 13819: "dsmcc-session", + 13820: "dsmcc-passthru", + 13821: "dsmcc-download", + 13822: "dsmcc-ccp", + 13894: "ucontrol", + 13929: "dta-systems", + 14000: "scotty-ft", + 14001: "sua", + 14002: "scotty-disc", + 14033: "sage-best-com1", + 14034: "sage-best-com2", + 14141: "vcs-app", + 14142: "icpp", + 14145: "gcm-app", + 14149: "vrts-tdd", + 14154: "vad", + 14250: "cps", + 14414: "ca-web-update", + 14936: "hde-lcesrvr-1", + 14937: "hde-lcesrvr-2", + 15000: "hydap", + 15118: "v2g-secc", + 15345: "xpilot", + 15363: "3link", + 15555: "cisco-snat", + 15660: "bex-xr", + 15740: "ptp", + 15998: "2ping", + 16003: "alfin", + 16161: "sun-sea-port", + 16309: "etb4j", + 16310: "pduncs", + 16311: "pdefmns", + 16360: "netserialext1", + 16361: "netserialext2", + 16367: "netserialext3", + 16368: "netserialext4", + 16384: "connected", + 16666: "vtp", + 16900: "newbay-snc-mc", + 16950: "sgcip", + 16991: "intel-rci-mp", + 16992: "amt-soap-http", + 16993: "amt-soap-https", + 16994: "amt-redir-tcp", + 16995: "amt-redir-tls", + 17007: "isode-dua", + 17185: "soundsvirtual", + 17219: "chipper", + 17220: "avtp", + 17221: "avdecc", + 17222: "cpsp", + 17224: "trdp-pd", + 17225: "trdp-md", + 17234: "integrius-stp", + 17235: "ssh-mgmt", + 17500: "db-lsp-disc", + 17729: "ea", + 17754: "zep", + 17755: "zigbee-ip", + 17756: "zigbee-ips", + 18000: "biimenu", + 18181: "opsec-cvp", + 18182: "opsec-ufp", + 18183: "opsec-sam", + 18184: "opsec-lea", + 18185: "opsec-omi", + 18186: "ohsc", + 18187: "opsec-ela", + 18241: "checkpoint-rtm", + 18262: "gv-pf", + 18463: "ac-cluster", + 18634: "rds-ib", + 18635: "rds-ip", + 18668: "vdmmesh-disc", + 18769: "ique", + 18881: "infotos", + 18888: "apc-necmp", + 19000: "igrid", + 19007: "scintilla", + 19191: "opsec-uaa", + 19194: "ua-secureagent", + 19220: "cora-disc", + 19283: "keysrvr", + 19315: "keyshadow", + 19398: "mtrgtrans", + 19410: "hp-sco", + 19411: "hp-sca", + 19412: "hp-sessmon", + 19539: "fxuptp", + 19540: "sxuptp", + 19541: "jcp", + 19788: "mle", + 19999: "dnp-sec", + 20000: "dnp", + 20001: "microsan", + 20002: "commtact-http", + 20003: "commtact-https", + 20005: "openwebnet", + 20012: "ss-idi-disc", + 20014: "opendeploy", + 20034: "nburn-id", + 20046: "tmophl7mts", + 20048: "mountd", + 20049: "nfsrdma", + 20167: "tolfab", + 20202: "ipdtp-port", + 20222: "ipulse-ics", + 20480: "emwavemsg", + 20670: "track", + 20999: "athand-mmp", + 21000: "irtrans", + 21554: "dfserver", + 21590: "vofr-gateway", + 21800: "tvpm", + 21845: "webphone", + 21846: "netspeak-is", + 21847: "netspeak-cs", + 21848: "netspeak-acd", + 21849: "netspeak-cps", + 22000: "snapenetio", + 22001: "optocontrol", + 22002: "optohost002", + 22003: "optohost003", + 22004: "optohost004", + 22005: "optohost004", + 22273: "wnn6", + 22305: "cis", + 22335: "shrewd-stream", + 22343: "cis-secure", + 22347: "wibukey", + 22350: "codemeter", + 22555: "vocaltec-phone", + 22763: "talikaserver", + 22800: "aws-brf", + 22951: "brf-gw", + 23000: "inovaport1", + 23001: "inovaport2", + 23002: "inovaport3", + 23003: "inovaport4", + 23004: "inovaport5", + 23005: "inovaport6", + 23272: "s102", + 23294: "5afe-disc", + 23333: "elxmgmt", + 23400: "novar-dbase", + 23401: "novar-alarm", + 23402: "novar-global", + 24000: "med-ltp", + 24001: "med-fsp-rx", + 24002: "med-fsp-tx", + 24003: "med-supp", + 24004: "med-ovw", + 24005: "med-ci", + 24006: "med-net-svc", + 24242: "filesphere", + 24249: "vista-4gl", + 24321: "ild", + 24322: "hid", + 24386: "intel-rci", + 24465: "tonidods", + 24554: "binkp", + 24577: "bilobit-update", + 24676: "canditv", + 24677: "flashfiler", + 24678: "proactivate", + 24680: "tcc-http", + 24850: "assoc-disc", + 24922: "find", + 25000: "icl-twobase1", + 25001: "icl-twobase2", + 25002: "icl-twobase3", + 25003: "icl-twobase4", + 25004: "icl-twobase5", + 25005: "icl-twobase6", + 25006: "icl-twobase7", + 25007: "icl-twobase8", + 25008: "icl-twobase9", + 25009: "icl-twobase10", + 25793: "vocaltec-hos", + 25900: "tasp-net", + 25901: "niobserver", + 25902: "nilinkanalyst", + 25903: "niprobe", + 25954: "bf-game", + 25955: "bf-master", + 26000: "quake", + 26133: "scscp", + 26208: "wnn6-ds", + 26260: "ezproxy", + 26261: "ezmeeting", + 26262: "k3software-svr", + 26263: "k3software-cli", + 26486: "exoline-udp", + 26487: "exoconfig", + 26489: "exonet", + 27345: "imagepump", + 27442: "jesmsjc", + 27504: "kopek-httphead", + 27782: "ars-vista", + 27999: "tw-auth-key", + 28000: "nxlmd", + 28119: "a27-ran-ran", + 28200: "voxelstorm", + 28240: "siemensgsm", + 29167: "otmp", + 30001: "pago-services1", + 30002: "pago-services2", + 30003: "amicon-fpsu-ra", + 30004: "amicon-fpsu-s", + 30260: "kingdomsonline", + 30832: "samsung-disc", + 30999: "ovobs", + 31016: "ka-kdp", + 31029: "yawn", + 31416: "xqosd", + 31457: "tetrinet", + 31620: "lm-mon", + 31765: "gamesmith-port", + 31948: "iceedcp-tx", + 31949: "iceedcp-rx", + 32034: "iracinghelper", + 32249: "t1distproc60", + 32483: "apm-link", + 32635: "sec-ntb-clnt", + 32636: "DMExpress", + 32767: "filenet-powsrm", + 32768: "filenet-tms", + 32769: "filenet-rpc", + 32770: "filenet-nch", + 32771: "filenet-rmi", + 32772: "filenet-pa", + 32773: "filenet-cm", + 32774: "filenet-re", + 32775: "filenet-pch", + 32776: "filenet-peior", + 32777: "filenet-obrok", + 32801: "mlsn", + 32896: "idmgratm", + 33123: "aurora-balaena", + 33331: "diamondport", + 33334: "speedtrace-disc", + 33434: "traceroute", + 33656: "snip-slave", + 34249: "turbonote-2", + 34378: "p-net-local", + 34379: "p-net-remote", + 34567: "edi_service", + 34962: "profinet-rt", + 34963: "profinet-rtm", + 34964: "profinet-cm", + 34980: "ethercat", + 35001: "rt-viewer", + 35004: "rt-classmanager", + 35100: "axio-disc", + 35355: "altova-lm-disc", + 36001: "allpeers", + 36411: "wlcp", + 36865: "kastenxpipe", + 37475: "neckar", + 37654: "unisys-eportal", + 38002: "crescoctrl-disc", + 38201: "galaxy7-data", + 38202: "fairview", + 38203: "agpolicy", + 39681: "turbonote-1", + 40000: "safetynetp", + 40023: "k-patentssensor", + 40841: "cscp", + 40842: "csccredir", + 40843: "csccfirewall", + 40853: "ortec-disc", + 41111: "fs-qos", + 41230: "z-wave-s", + 41794: "crestron-cip", + 41795: "crestron-ctp", + 42508: "candp", + 42509: "candrp", + 42510: "caerpc", + 43000: "recvr-rc-disc", + 43188: "reachout", + 43189: "ndm-agent-port", + 43190: "ip-provision", + 43210: "shaperai-disc", + 43439: "eq3-config", + 43440: "ew-disc-cmd", + 43441: "ciscocsdb", + 44321: "pmcd", + 44322: "pmcdproxy", + 44544: "domiq", + 44553: "rbr-debug", + 44600: "asihpi", + 44818: "EtherNet-IP-2", + 44900: "m3da-disc", + 45000: "asmp-mon", + 45054: "invision-ag", + 45514: "cloudcheck-ping", + 45678: "eba", + 45825: "qdb2service", + 45966: "ssr-servermgr", + 46999: "mediabox", + 47000: "mbus", + 47100: "jvl-mactalk", + 47557: "dbbrowse", + 47624: "directplaysrvr", + 47806: "ap", + 47808: "bacnet", + 47809: "presonus-ucnet", + 48000: "nimcontroller", + 48001: "nimspooler", + 48002: "nimhub", + 48003: "nimgtw", + 48128: "isnetserv", + 48129: "blp5", + 48556: "com-bardac-dw", + 48619: "iqobject", + 48653: "robotraconteur", + 49001: "nusdp-disc", +} +var sctpPortNames = map[SCTPPort]string{ + 9: "discard", + 20: "ftp-data", + 21: "ftp", + 22: "ssh", + 80: "http", + 179: "bgp", + 443: "https", + 1021: "exp1", + 1022: "exp2", + 1167: "cisco-ipsla", + 1720: "h323hostcall", + 2049: "nfs", + 2225: "rcip-itu", + 2904: "m2ua", + 2905: "m3ua", + 2944: "megaco-h248", + 2945: "h248-binary", + 3097: "itu-bicc-stc", + 3565: "m2pa", + 3863: "asap-sctp", + 3864: "asap-sctp-tls", + 3868: "diameter", + 4333: "ahsp", + 4502: "a25-fap-fgw", + 4711: "trinity-dist", + 4739: "ipfix", + 4740: "ipfixs", + 5060: "sip", + 5061: "sips", + 5090: "car", + 5091: "cxtp", + 5215: "noteza", + 5445: "smbdirect", + 5672: "amqp", + 5675: "v5ua", + 5868: "diameters", + 5910: "cm", + 5911: "cpdlc", + 5912: "fis", + 5913: "ads-c", + 6704: "frc-hp", + 6705: "frc-mp", + 6706: "frc-lp", + 6970: "conductor-mpx", + 7626: "simco", + 7701: "nfapi", + 7728: "osvr", + 8471: "pim-port", + 9082: "lcs-ap", + 9084: "aurora", + 9900: "iua", + 9901: "enrp-sctp", + 9902: "enrp-sctp-tls", + 11997: "wmereceiving", + 11998: "wmedistribution", + 11999: "wmereporting", + 14001: "sua", + 20049: "nfsrdma", + 25471: "rna", + 29118: "sgsap", + 29168: "sbcap", + 29169: "iuhsctpassoc", + 30100: "rwp", + 36412: "s1-control", + 36422: "x2-control", + 36423: "slmap", + 36424: "nq-ap", + 36443: "m2ap", + 36444: "m3ap", + 36462: "xw-control", + 38412: "ng-control", + 38422: "xn-control", + 38472: "f1-control", +} diff --git a/vendor/github.com/google/gopacket/layers/icmp4.go b/vendor/github.com/google/gopacket/layers/icmp4.go new file mode 100644 index 0000000..bd3f03f --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/icmp4.go @@ -0,0 +1,267 @@ +// Copyright 2012 Google, Inc. All rights reserved. +// Copyright 2009-2011 Andreas Krennmair. 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 layers + +import ( + "encoding/binary" + "errors" + "fmt" + "reflect" + + "github.com/google/gopacket" +) + +const ( + ICMPv4TypeEchoReply = 0 + ICMPv4TypeDestinationUnreachable = 3 + ICMPv4TypeSourceQuench = 4 + ICMPv4TypeRedirect = 5 + ICMPv4TypeEchoRequest = 8 + ICMPv4TypeRouterAdvertisement = 9 + ICMPv4TypeRouterSolicitation = 10 + ICMPv4TypeTimeExceeded = 11 + ICMPv4TypeParameterProblem = 12 + ICMPv4TypeTimestampRequest = 13 + ICMPv4TypeTimestampReply = 14 + ICMPv4TypeInfoRequest = 15 + ICMPv4TypeInfoReply = 16 + ICMPv4TypeAddressMaskRequest = 17 + ICMPv4TypeAddressMaskReply = 18 +) + +const ( + // DestinationUnreachable + ICMPv4CodeNet = 0 + ICMPv4CodeHost = 1 + ICMPv4CodeProtocol = 2 + ICMPv4CodePort = 3 + ICMPv4CodeFragmentationNeeded = 4 + ICMPv4CodeSourceRoutingFailed = 5 + ICMPv4CodeNetUnknown = 6 + ICMPv4CodeHostUnknown = 7 + ICMPv4CodeSourceIsolated = 8 + ICMPv4CodeNetAdminProhibited = 9 + ICMPv4CodeHostAdminProhibited = 10 + ICMPv4CodeNetTOS = 11 + ICMPv4CodeHostTOS = 12 + ICMPv4CodeCommAdminProhibited = 13 + ICMPv4CodeHostPrecedence = 14 + ICMPv4CodePrecedenceCutoff = 15 + + // TimeExceeded + ICMPv4CodeTTLExceeded = 0 + ICMPv4CodeFragmentReassemblyTimeExceeded = 1 + + // ParameterProblem + ICMPv4CodePointerIndicatesError = 0 + ICMPv4CodeMissingOption = 1 + ICMPv4CodeBadLength = 2 + + // Redirect + // ICMPv4CodeNet = same as for DestinationUnreachable + // ICMPv4CodeHost = same as for DestinationUnreachable + ICMPv4CodeTOSNet = 2 + ICMPv4CodeTOSHost = 3 +) + +type icmpv4TypeCodeInfoStruct struct { + typeStr string + codeStr *map[uint8]string +} + +var ( + icmpv4TypeCodeInfo = map[uint8]icmpv4TypeCodeInfoStruct{ + ICMPv4TypeDestinationUnreachable: icmpv4TypeCodeInfoStruct{ + "DestinationUnreachable", &map[uint8]string{ + ICMPv4CodeNet: "Net", + ICMPv4CodeHost: "Host", + ICMPv4CodeProtocol: "Protocol", + ICMPv4CodePort: "Port", + ICMPv4CodeFragmentationNeeded: "FragmentationNeeded", + ICMPv4CodeSourceRoutingFailed: "SourceRoutingFailed", + ICMPv4CodeNetUnknown: "NetUnknown", + ICMPv4CodeHostUnknown: "HostUnknown", + ICMPv4CodeSourceIsolated: "SourceIsolated", + ICMPv4CodeNetAdminProhibited: "NetAdminProhibited", + ICMPv4CodeHostAdminProhibited: "HostAdminProhibited", + ICMPv4CodeNetTOS: "NetTOS", + ICMPv4CodeHostTOS: "HostTOS", + ICMPv4CodeCommAdminProhibited: "CommAdminProhibited", + ICMPv4CodeHostPrecedence: "HostPrecedence", + ICMPv4CodePrecedenceCutoff: "PrecedenceCutoff", + }, + }, + ICMPv4TypeTimeExceeded: icmpv4TypeCodeInfoStruct{ + "TimeExceeded", &map[uint8]string{ + ICMPv4CodeTTLExceeded: "TTLExceeded", + ICMPv4CodeFragmentReassemblyTimeExceeded: "FragmentReassemblyTimeExceeded", + }, + }, + ICMPv4TypeParameterProblem: icmpv4TypeCodeInfoStruct{ + "ParameterProblem", &map[uint8]string{ + ICMPv4CodePointerIndicatesError: "PointerIndicatesError", + ICMPv4CodeMissingOption: "MissingOption", + ICMPv4CodeBadLength: "BadLength", + }, + }, + ICMPv4TypeSourceQuench: icmpv4TypeCodeInfoStruct{ + "SourceQuench", nil, + }, + ICMPv4TypeRedirect: icmpv4TypeCodeInfoStruct{ + "Redirect", &map[uint8]string{ + ICMPv4CodeNet: "Net", + ICMPv4CodeHost: "Host", + ICMPv4CodeTOSNet: "TOS+Net", + ICMPv4CodeTOSHost: "TOS+Host", + }, + }, + ICMPv4TypeEchoRequest: icmpv4TypeCodeInfoStruct{ + "EchoRequest", nil, + }, + ICMPv4TypeEchoReply: icmpv4TypeCodeInfoStruct{ + "EchoReply", nil, + }, + ICMPv4TypeTimestampRequest: icmpv4TypeCodeInfoStruct{ + "TimestampRequest", nil, + }, + ICMPv4TypeTimestampReply: icmpv4TypeCodeInfoStruct{ + "TimestampReply", nil, + }, + ICMPv4TypeInfoRequest: icmpv4TypeCodeInfoStruct{ + "InfoRequest", nil, + }, + ICMPv4TypeInfoReply: icmpv4TypeCodeInfoStruct{ + "InfoReply", nil, + }, + ICMPv4TypeRouterSolicitation: icmpv4TypeCodeInfoStruct{ + "RouterSolicitation", nil, + }, + ICMPv4TypeRouterAdvertisement: icmpv4TypeCodeInfoStruct{ + "RouterAdvertisement", nil, + }, + ICMPv4TypeAddressMaskRequest: icmpv4TypeCodeInfoStruct{ + "AddressMaskRequest", nil, + }, + ICMPv4TypeAddressMaskReply: icmpv4TypeCodeInfoStruct{ + "AddressMaskReply", nil, + }, + } +) + +type ICMPv4TypeCode uint16 + +// Type returns the ICMPv4 type field. +func (a ICMPv4TypeCode) Type() uint8 { + return uint8(a >> 8) +} + +// Code returns the ICMPv4 code field. +func (a ICMPv4TypeCode) Code() uint8 { + return uint8(a) +} + +func (a ICMPv4TypeCode) String() string { + t, c := a.Type(), a.Code() + strInfo, ok := icmpv4TypeCodeInfo[t] + if !ok { + // Unknown ICMPv4 type field + return fmt.Sprintf("%d(%d)", t, c) + } + typeStr := strInfo.typeStr + if strInfo.codeStr == nil && c == 0 { + // The ICMPv4 type does not make use of the code field + return fmt.Sprintf("%s", strInfo.typeStr) + } + if strInfo.codeStr == nil && c != 0 { + // The ICMPv4 type does not make use of the code field, but it is present anyway + return fmt.Sprintf("%s(Code: %d)", typeStr, c) + } + codeStr, ok := (*strInfo.codeStr)[c] + if !ok { + // We don't know this ICMPv4 code; print the numerical value + return fmt.Sprintf("%s(Code: %d)", typeStr, c) + } + return fmt.Sprintf("%s(%s)", typeStr, codeStr) +} + +func (a ICMPv4TypeCode) GoString() string { + t := reflect.TypeOf(a) + return fmt.Sprintf("%s(%d, %d)", t.String(), a.Type(), a.Code()) +} + +// SerializeTo writes the ICMPv4TypeCode value to the 'bytes' buffer. +func (a ICMPv4TypeCode) SerializeTo(bytes []byte) { + binary.BigEndian.PutUint16(bytes, uint16(a)) +} + +// CreateICMPv4TypeCode is a convenience function to create an ICMPv4TypeCode +// gopacket type from the ICMPv4 type and code values. +func CreateICMPv4TypeCode(typ uint8, code uint8) ICMPv4TypeCode { + return ICMPv4TypeCode(binary.BigEndian.Uint16([]byte{typ, code})) +} + +// ICMPv4 is the layer for IPv4 ICMP packet data. +type ICMPv4 struct { + BaseLayer + TypeCode ICMPv4TypeCode + Checksum uint16 + Id uint16 + Seq uint16 +} + +// LayerType returns LayerTypeICMPv4. +func (i *ICMPv4) LayerType() gopacket.LayerType { return LayerTypeICMPv4 } + +// DecodeFromBytes decodes the given bytes into this layer. +func (i *ICMPv4) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + if len(data) < 8 { + df.SetTruncated() + return errors.New("ICMP layer less then 8 bytes for ICMPv4 packet") + } + i.TypeCode = CreateICMPv4TypeCode(data[0], data[1]) + i.Checksum = binary.BigEndian.Uint16(data[2:4]) + i.Id = binary.BigEndian.Uint16(data[4:6]) + i.Seq = binary.BigEndian.Uint16(data[6:8]) + i.BaseLayer = BaseLayer{data[:8], data[8:]} + return nil +} + +// SerializeTo writes the serialized form of this layer into the +// SerializationBuffer, implementing gopacket.SerializableLayer. +// See the docs for gopacket.SerializableLayer for more info. +func (i *ICMPv4) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + bytes, err := b.PrependBytes(8) + if err != nil { + return err + } + i.TypeCode.SerializeTo(bytes) + binary.BigEndian.PutUint16(bytes[4:], i.Id) + binary.BigEndian.PutUint16(bytes[6:], i.Seq) + if opts.ComputeChecksums { + bytes[2] = 0 + bytes[3] = 0 + i.Checksum = tcpipChecksum(b.Bytes(), 0) + } + binary.BigEndian.PutUint16(bytes[2:], i.Checksum) + return nil +} + +// CanDecode returns the set of layer types that this DecodingLayer can decode. +func (i *ICMPv4) CanDecode() gopacket.LayerClass { + return LayerTypeICMPv4 +} + +// NextLayerType returns the layer type contained by this DecodingLayer. +func (i *ICMPv4) NextLayerType() gopacket.LayerType { + return gopacket.LayerTypePayload +} + +func decodeICMPv4(data []byte, p gopacket.PacketBuilder) error { + i := &ICMPv4{} + return decodingLayerDecoder(i, data, p) +} diff --git a/vendor/github.com/google/gopacket/layers/icmp6.go b/vendor/github.com/google/gopacket/layers/icmp6.go new file mode 100644 index 0000000..03a3213 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/icmp6.go @@ -0,0 +1,231 @@ +// Copyright 2012 Google, Inc. All rights reserved. +// Copyright 2009-2011 Andreas Krennmair. 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 layers + +import ( + "encoding/binary" + "errors" + "fmt" + "reflect" + + "github.com/google/gopacket" +) + +const ( + // The following are from RFC 4443 + ICMPv6TypeDestinationUnreachable = 1 + ICMPv6TypePacketTooBig = 2 + ICMPv6TypeTimeExceeded = 3 + ICMPv6TypeParameterProblem = 4 + ICMPv6TypeEchoRequest = 128 + ICMPv6TypeEchoReply = 129 + // The following are from RFC 4861 + ICMPv6TypeRouterSolicitation = 133 + ICMPv6TypeRouterAdvertisement = 134 + ICMPv6TypeNeighborSolicitation = 135 + ICMPv6TypeNeighborAdvertisement = 136 + ICMPv6TypeRedirect = 137 +) + +const ( + // DestinationUnreachable + ICMPv6CodeNoRouteToDst = 0 + ICMPv6CodeAdminProhibited = 1 + ICMPv6CodeBeyondScopeOfSrc = 2 + ICMPv6CodeAddressUnreachable = 3 + ICMPv6CodePortUnreachable = 4 + ICMPv6CodeSrcAddressFailedPolicy = 5 + ICMPv6CodeRejectRouteToDst = 6 + + // TimeExceeded + ICMPv6CodeHopLimitExceeded = 0 + ICMPv6CodeFragmentReassemblyTimeExceeded = 1 + + // ParameterProblem + ICMPv6CodeErroneousHeaderField = 0 + ICMPv6CodeUnrecognizedNextHeader = 1 + ICMPv6CodeUnrecognizedIPv6Option = 2 +) + +type icmpv6TypeCodeInfoStruct struct { + typeStr string + codeStr *map[uint8]string +} + +var ( + icmpv6TypeCodeInfo = map[uint8]icmpv6TypeCodeInfoStruct{ + ICMPv6TypeDestinationUnreachable: icmpv6TypeCodeInfoStruct{ + "DestinationUnreachable", &map[uint8]string{ + ICMPv6CodeNoRouteToDst: "NoRouteToDst", + ICMPv6CodeAdminProhibited: "AdminProhibited", + ICMPv6CodeBeyondScopeOfSrc: "BeyondScopeOfSrc", + ICMPv6CodeAddressUnreachable: "AddressUnreachable", + ICMPv6CodePortUnreachable: "PortUnreachable", + ICMPv6CodeSrcAddressFailedPolicy: "SrcAddressFailedPolicy", + ICMPv6CodeRejectRouteToDst: "RejectRouteToDst", + }, + }, + ICMPv6TypePacketTooBig: icmpv6TypeCodeInfoStruct{ + "PacketTooBig", nil, + }, + ICMPv6TypeTimeExceeded: icmpv6TypeCodeInfoStruct{ + "TimeExceeded", &map[uint8]string{ + ICMPv6CodeHopLimitExceeded: "HopLimitExceeded", + ICMPv6CodeFragmentReassemblyTimeExceeded: "FragmentReassemblyTimeExceeded", + }, + }, + ICMPv6TypeParameterProblem: icmpv6TypeCodeInfoStruct{ + "ParameterProblem", &map[uint8]string{ + ICMPv6CodeErroneousHeaderField: "ErroneousHeaderField", + ICMPv6CodeUnrecognizedNextHeader: "UnrecognizedNextHeader", + ICMPv6CodeUnrecognizedIPv6Option: "UnrecognizedIPv6Option", + }, + }, + ICMPv6TypeEchoRequest: icmpv6TypeCodeInfoStruct{ + "EchoRequest", nil, + }, + ICMPv6TypeEchoReply: icmpv6TypeCodeInfoStruct{ + "EchoReply", nil, + }, + ICMPv6TypeRouterSolicitation: icmpv6TypeCodeInfoStruct{ + "RouterSolicitation", nil, + }, + ICMPv6TypeRouterAdvertisement: icmpv6TypeCodeInfoStruct{ + "RouterAdvertisement", nil, + }, + ICMPv6TypeNeighborSolicitation: icmpv6TypeCodeInfoStruct{ + "NeighborSolicitation", nil, + }, + ICMPv6TypeNeighborAdvertisement: icmpv6TypeCodeInfoStruct{ + "NeighborAdvertisement", nil, + }, + ICMPv6TypeRedirect: icmpv6TypeCodeInfoStruct{ + "Redirect", nil, + }, + } +) + +type ICMPv6TypeCode uint16 + +// Type returns the ICMPv6 type field. +func (a ICMPv6TypeCode) Type() uint8 { + return uint8(a >> 8) +} + +// Code returns the ICMPv6 code field. +func (a ICMPv6TypeCode) Code() uint8 { + return uint8(a) +} + +func (a ICMPv6TypeCode) String() string { + t, c := a.Type(), a.Code() + strInfo, ok := icmpv6TypeCodeInfo[t] + if !ok { + // Unknown ICMPv6 type field + return fmt.Sprintf("%d(%d)", t, c) + } + typeStr := strInfo.typeStr + if strInfo.codeStr == nil && c == 0 { + // The ICMPv6 type does not make use of the code field + return fmt.Sprintf("%s", strInfo.typeStr) + } + if strInfo.codeStr == nil && c != 0 { + // The ICMPv6 type does not make use of the code field, but it is present anyway + return fmt.Sprintf("%s(Code: %d)", typeStr, c) + } + codeStr, ok := (*strInfo.codeStr)[c] + if !ok { + // We don't know this ICMPv6 code; print the numerical value + return fmt.Sprintf("%s(Code: %d)", typeStr, c) + } + return fmt.Sprintf("%s(%s)", typeStr, codeStr) +} + +func (a ICMPv6TypeCode) GoString() string { + t := reflect.TypeOf(a) + return fmt.Sprintf("%s(%d, %d)", t.String(), a.Type(), a.Code()) +} + +// SerializeTo writes the ICMPv6TypeCode value to the 'bytes' buffer. +func (a ICMPv6TypeCode) SerializeTo(bytes []byte) { + binary.BigEndian.PutUint16(bytes, uint16(a)) +} + +// CreateICMPv6TypeCode is a convenience function to create an ICMPv6TypeCode +// gopacket type from the ICMPv6 type and code values. +func CreateICMPv6TypeCode(typ uint8, code uint8) ICMPv6TypeCode { + return ICMPv6TypeCode(binary.BigEndian.Uint16([]byte{typ, code})) +} + +// ICMPv6 is the layer for IPv6 ICMP packet data +type ICMPv6 struct { + BaseLayer + TypeCode ICMPv6TypeCode + Checksum uint16 + TypeBytes []byte + tcpipchecksum +} + +// LayerType returns LayerTypeICMPv6. +func (i *ICMPv6) LayerType() gopacket.LayerType { return LayerTypeICMPv6 } + +// DecodeFromBytes decodes the given bytes into this layer. +func (i *ICMPv6) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + if len(data) < 8 { + df.SetTruncated() + return errors.New("ICMP layer less then 8 bytes for ICMPv6 packet") + } + i.TypeCode = CreateICMPv6TypeCode(data[0], data[1]) + i.Checksum = binary.BigEndian.Uint16(data[2:4]) + i.TypeBytes = data[4:8] + i.BaseLayer = BaseLayer{data[:8], data[8:]} + return nil +} + +// SerializeTo writes the serialized form of this layer into the +// SerializationBuffer, implementing gopacket.SerializableLayer. +// See the docs for gopacket.SerializableLayer for more info. +func (i *ICMPv6) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + if i.TypeBytes == nil { + i.TypeBytes = lotsOfZeros[:4] + } else if len(i.TypeBytes) != 4 { + return fmt.Errorf("invalid type bytes for ICMPv6 packet: %v", i.TypeBytes) + } + bytes, err := b.PrependBytes(8) + if err != nil { + return err + } + i.TypeCode.SerializeTo(bytes) + copy(bytes[4:8], i.TypeBytes) + if opts.ComputeChecksums { + bytes[2] = 0 + bytes[3] = 0 + csum, err := i.computeChecksum(b.Bytes(), IPProtocolICMPv6) + if err != nil { + return err + } + i.Checksum = csum + } + binary.BigEndian.PutUint16(bytes[2:], i.Checksum) + return nil +} + +// CanDecode returns the set of layer types that this DecodingLayer can decode. +func (i *ICMPv6) CanDecode() gopacket.LayerClass { + return LayerTypeICMPv6 +} + +// NextLayerType returns the layer type contained by this DecodingLayer. +func (i *ICMPv6) NextLayerType() gopacket.LayerType { + return gopacket.LayerTypePayload +} + +func decodeICMPv6(data []byte, p gopacket.PacketBuilder) error { + i := &ICMPv6{} + return decodingLayerDecoder(i, data, p) +} diff --git a/vendor/github.com/google/gopacket/layers/icmp6_test.go b/vendor/github.com/google/gopacket/layers/icmp6_test.go new file mode 100644 index 0000000..4a6d248 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/icmp6_test.go @@ -0,0 +1,84 @@ +// Copyright 2012, Google, Inc. All rights reserved. +// Copyright 2009-2011 Andreas Krennmair. 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 layers + +import ( + "github.com/google/gopacket" + "net" + "reflect" + "testing" +) + +// testPacketICMPv6 is the packet: +// 10:48:30.088384 IP6 2620:0:1005:0:26be:5ff:fe27:b17 > fe80::21f:caff:feb3:7640: ICMP6, neighbor advertisement, tgt is 2620:0:1005:0:26be:5ff:fe27:b17, length 24 +// 0x0000: 001f cab3 7640 24be 0527 0b17 86dd 6000 ....v@$..'....`. +// 0x0010: 0000 0018 3aff 2620 0000 1005 0000 26be ....:.&.......&. +// 0x0020: 05ff fe27 0b17 fe80 0000 0000 0000 021f ...'............ +// 0x0030: caff feb3 7640 8800 1ed6 4000 0000 2620 ....v@....@...&. +// 0x0040: 0000 1005 0000 26be 05ff fe27 0b17 ......&....'.. +var testPacketICMPv6 = []byte{ + 0x00, 0x1f, 0xca, 0xb3, 0x76, 0x40, 0x24, 0xbe, 0x05, 0x27, 0x0b, 0x17, 0x86, 0xdd, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x3a, 0xff, 0x26, 0x20, 0x00, 0x00, 0x10, 0x05, 0x00, 0x00, 0x26, 0xbe, + 0x05, 0xff, 0xfe, 0x27, 0x0b, 0x17, 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1f, + 0xca, 0xff, 0xfe, 0xb3, 0x76, 0x40, 0x88, 0x00, 0x1e, 0xd6, 0x40, 0x00, 0x00, 0x00, 0x26, 0x20, + 0x00, 0x00, 0x10, 0x05, 0x00, 0x00, 0x26, 0xbe, 0x05, 0xff, 0xfe, 0x27, 0x0b, 0x17, +} + +func TestPacketICMPv6(t *testing.T) { + p := gopacket.NewPacket(testPacketICMPv6, LinkTypeEthernet, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeEthernet, LayerTypeIPv6, LayerTypeICMPv6, gopacket.LayerTypePayload}, t) + if got, ok := p.Layer(LayerTypeIPv6).(*IPv6); ok { + want := &IPv6{ + BaseLayer: BaseLayer{ + Contents: []byte{0x60, 0x0, 0x0, 0x0, 0x0, 0x18, + 0x3a, 0xff, 0x26, 0x20, 0x0, 0x0, 0x10, 0x5, 0x0, 0x0, 0x26, 0xbe, 0x5, + 0xff, 0xfe, 0x27, 0xb, 0x17, 0xfe, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x1f, 0xca, 0xff, 0xfe, 0xb3, 0x76, 0x40}, + Payload: []byte{0x88, 0x0, 0x1e, 0xd6, 0x40, 0x0, 0x0, 0x0, 0x26, 0x20, + 0x0, 0x0, 0x10, 0x5, 0x0, 0x0, 0x26, 0xbe, 0x5, 0xff, 0xfe, 0x27, 0xb, + 0x17}, + }, + Version: 6, + TrafficClass: 0, + FlowLabel: 0, + Length: 24, + NextHeader: IPProtocolICMPv6, + HopLimit: 255, + SrcIP: net.IP{0x26, 0x20, 0x0, 0x0, 0x10, 0x5, 0x0, 0x0, 0x26, 0xbe, 0x5, 0xff, 0xfe, 0x27, 0xb, 0x17}, + DstIP: net.IP{0xfe, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x1f, 0xca, 0xff, 0xfe, 0xb3, 0x76, 0x40}, + } + if !reflect.DeepEqual(got, want) { + t.Errorf("IPv6 packet processing failed:\ngot :\n%#v\n\nwant :\n%#v\n\n", got, want) + } + } else { + t.Error("No IPv6 layer type found in packet") + } + if got, ok := p.Layer(LayerTypeICMPv6).(*ICMPv6); ok { + want := &ICMPv6{ + BaseLayer: BaseLayer{ + Contents: []byte{0x88, 0x0, 0x1e, 0xd6, 0x40, 0x0, 0x0, 0x0}, + Payload: []byte{0x26, 0x20, 0x0, 0x0, 0x10, + 0x5, 0x0, 0x0, 0x26, 0xbe, 0x5, 0xff, 0xfe, 0x27, 0xb, 0x17}, + }, + TypeCode: 0x8800, + Checksum: 0x1ed6, + TypeBytes: []byte{0x40, 0x0, 0x0, 0x0}, + } + if !reflect.DeepEqual(got, want) { + t.Errorf("ICMPv6 packet processing failed:\ngot :\n%#v\n\nwant :\n%#v\n\n", got, want) + } + if got.TypeCode.String() != "NeighborAdvertisement" { + t.Errorf("ICMPv6 type code, got %q want 'NeighborAdvertisement'", got.TypeCode.String()) + } + } else { + t.Error("No ICMPv6 layer type found in packet") + } +} diff --git a/vendor/github.com/google/gopacket/layers/igmp.go b/vendor/github.com/google/gopacket/layers/igmp.go new file mode 100644 index 0000000..d008415 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/igmp.go @@ -0,0 +1,355 @@ +// Copyright 2012 Google, Inc. All rights reserved. +// Copyright 2009-2011 Andreas Krennmair. 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 layers + +import ( + "encoding/binary" + "errors" + "net" + "time" + + "github.com/google/gopacket" +) + +type IGMPType uint8 + +const ( + IGMPMembershipQuery IGMPType = 0x11 // General or group specific query + IGMPMembershipReportV1 IGMPType = 0x12 // Version 1 Membership Report + IGMPMembershipReportV2 IGMPType = 0x16 // Version 2 Membership Report + IGMPLeaveGroup IGMPType = 0x17 // Leave Group + IGMPMembershipReportV3 IGMPType = 0x22 // Version 3 Membership Report +) + +// String conversions for IGMP message types +func (i IGMPType) String() string { + switch i { + case IGMPMembershipQuery: + return "IGMP Membership Query" + case IGMPMembershipReportV1: + return "IGMPv1 Membership Report" + case IGMPMembershipReportV2: + return "IGMPv2 Membership Report" + case IGMPMembershipReportV3: + return "IGMPv3 Membership Report" + case IGMPLeaveGroup: + return "Leave Group" + default: + return "" + } +} + +type IGMPv3GroupRecordType uint8 + +const ( + IGMPIsIn IGMPv3GroupRecordType = 0x01 // Type MODE_IS_INCLUDE, source addresses x + IGMPIsEx IGMPv3GroupRecordType = 0x02 // Type MODE_IS_EXCLUDE, source addresses x + IGMPToIn IGMPv3GroupRecordType = 0x03 // Type CHANGE_TO_INCLUDE_MODE, source addresses x + IGMPToEx IGMPv3GroupRecordType = 0x04 // Type CHANGE_TO_EXCLUDE_MODE, source addresses x + IGMPAllow IGMPv3GroupRecordType = 0x05 // Type ALLOW_NEW_SOURCES, source addresses x + IGMPBlock IGMPv3GroupRecordType = 0x06 // Type BLOCK_OLD_SOURCES, source addresses x +) + +func (i IGMPv3GroupRecordType) String() string { + switch i { + case IGMPIsIn: + return "MODE_IS_INCLUDE" + case IGMPIsEx: + return "MODE_IS_EXCLUDE" + case IGMPToIn: + return "CHANGE_TO_INCLUDE_MODE" + case IGMPToEx: + return "CHANGE_TO_EXCLUDE_MODE" + case IGMPAllow: + return "ALLOW_NEW_SOURCES" + case IGMPBlock: + return "BLOCK_OLD_SOURCES" + default: + return "" + } +} + +// IGMP represents an IGMPv3 message. +type IGMP struct { + BaseLayer + Type IGMPType + MaxResponseTime time.Duration + Checksum uint16 + GroupAddress net.IP + SupressRouterProcessing bool + RobustnessValue uint8 + IntervalTime time.Duration + SourceAddresses []net.IP + NumberOfGroupRecords uint16 + NumberOfSources uint16 + GroupRecords []IGMPv3GroupRecord + Version uint8 // IGMP protocol version +} + +// IGMPv1or2 stores header details for an IGMPv1 or IGMPv2 packet. +// +// 0 1 2 3 +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Type | Max Resp Time | Checksum | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Group Address | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +type IGMPv1or2 struct { + BaseLayer + Type IGMPType // IGMP message type + MaxResponseTime time.Duration // meaningful only in Membership Query messages + Checksum uint16 // 16-bit checksum of entire ip payload + GroupAddress net.IP // either 0 or an IP multicast address + Version uint8 +} + +// decodeResponse dissects IGMPv1 or IGMPv2 packet. +func (i *IGMPv1or2) decodeResponse(data []byte) error { + if len(data) < 8 { + return errors.New("IGMP packet too small") + } + + i.MaxResponseTime = igmpTimeDecode(data[1]) + i.Checksum = binary.BigEndian.Uint16(data[2:4]) + i.GroupAddress = net.IP(data[4:8]) + + return nil +} + +// 0 1 2 3 +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Type = 0x22 | Reserved | Checksum | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Reserved | Number of Group Records (M) | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | | +// . Group Record [1] . +// | | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | | +// . Group Record [2] . +// | | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | | +// . Group Record [M] . +// | | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Record Type | Aux Data Len | Number of Sources (N) | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Multicast Address | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Source Address [1] | +// +- -+ +// | Source Address [2] | +// +- -+ +// | Source Address [N] | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | | +// . Auxiliary Data . +// | | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +// IGMPv3GroupRecord stores individual group records for a V3 Membership Report message. +type IGMPv3GroupRecord struct { + Type IGMPv3GroupRecordType + AuxDataLen uint8 // this should always be 0 as per IGMPv3 spec. + NumberOfSources uint16 + MulticastAddress net.IP + SourceAddresses []net.IP + AuxData uint32 // NOT USED +} + +func (i *IGMP) decodeIGMPv3MembershipReport(data []byte) error { + if len(data) < 8 { + return errors.New("IGMPv3 Membership Report too small #1") + } + + i.Checksum = binary.BigEndian.Uint16(data[2:4]) + i.NumberOfGroupRecords = binary.BigEndian.Uint16(data[6:8]) + + recordOffset := 8 + for j := 0; j < int(i.NumberOfGroupRecords); j++ { + if len(data) < recordOffset+8 { + return errors.New("IGMPv3 Membership Report too small #2") + } + + var gr IGMPv3GroupRecord + gr.Type = IGMPv3GroupRecordType(data[recordOffset]) + gr.AuxDataLen = data[recordOffset+1] + gr.NumberOfSources = binary.BigEndian.Uint16(data[recordOffset+2 : recordOffset+4]) + gr.MulticastAddress = net.IP(data[recordOffset+4 : recordOffset+8]) + + if len(data) < recordOffset+8+int(gr.NumberOfSources)*4 { + return errors.New("IGMPv3 Membership Report too small #3") + } + + // append source address records. + for i := 0; i < int(gr.NumberOfSources); i++ { + sourceAddr := net.IP(data[recordOffset+8+i*4 : recordOffset+12+i*4]) + gr.SourceAddresses = append(gr.SourceAddresses, sourceAddr) + } + + i.GroupRecords = append(i.GroupRecords, gr) + recordOffset += 8 + 4*int(gr.NumberOfSources) + } + return nil +} + +// 0 1 2 3 +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Type = 0x11 | Max Resp Code | Checksum | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Group Address | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Resv |S| QRV | QQIC | Number of Sources (N) | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Source Address [1] | +// +- -+ +// | Source Address [2] | +// +- . -+ +// | Source Address [N] | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// +// decodeIGMPv3MembershipQuery parses the IGMPv3 message of type 0x11 +func (i *IGMP) decodeIGMPv3MembershipQuery(data []byte) error { + if len(data) < 12 { + return errors.New("IGMPv3 Membership Query too small #1") + } + + i.MaxResponseTime = igmpTimeDecode(data[1]) + i.Checksum = binary.BigEndian.Uint16(data[2:4]) + i.SupressRouterProcessing = data[8]&0x8 != 0 + i.GroupAddress = net.IP(data[4:8]) + i.RobustnessValue = data[8] & 0x7 + i.IntervalTime = igmpTimeDecode(data[9]) + i.NumberOfSources = binary.BigEndian.Uint16(data[10:12]) + + if len(data) < 12+int(i.NumberOfSources)*4 { + return errors.New("IGMPv3 Membership Query too small #2") + } + + for j := 0; j < int(i.NumberOfSources); j++ { + i.SourceAddresses = append(i.SourceAddresses, net.IP(data[12+j*4:16+j*4])) + } + + return nil +} + +// igmpTimeDecode decodes the duration created by the given byte, using the +// algorithm in http://www.rfc-base.org/txt/rfc-3376.txt section 4.1.1. +func igmpTimeDecode(t uint8) time.Duration { + if t&0x80 == 0 { + return time.Millisecond * 100 * time.Duration(t) + } + mant := (t & 0x70) >> 4 + exp := t & 0x0F + return time.Millisecond * 100 * time.Duration((mant|0x10)<<(exp+3)) +} + +// LayerType returns LayerTypeIGMP for the V1,2,3 message protocol formats. +func (i *IGMP) LayerType() gopacket.LayerType { return LayerTypeIGMP } +func (i *IGMPv1or2) LayerType() gopacket.LayerType { return LayerTypeIGMP } + +func (i *IGMPv1or2) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + if len(data) < 8 { + return errors.New("IGMP Packet too small") + } + + i.Type = IGMPType(data[0]) + i.MaxResponseTime = igmpTimeDecode(data[1]) + i.Checksum = binary.BigEndian.Uint16(data[2:4]) + i.GroupAddress = net.IP(data[4:8]) + + return nil +} + +func (i *IGMPv1or2) NextLayerType() gopacket.LayerType { + return gopacket.LayerTypeZero +} + +func (i *IGMPv1or2) CanDecode() gopacket.LayerClass { + return LayerTypeIGMP +} + +// DecodeFromBytes decodes the given bytes into this layer. +func (i *IGMP) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + if len(data) < 1 { + return errors.New("IGMP packet is too small") + } + + // common IGMP header values between versions 1..3 of IGMP specification.. + i.Type = IGMPType(data[0]) + + switch i.Type { + case IGMPMembershipQuery: + i.decodeIGMPv3MembershipQuery(data) + case IGMPMembershipReportV3: + i.decodeIGMPv3MembershipReport(data) + default: + return errors.New("unsupported IGMP type") + } + + return nil +} + +// CanDecode returns the set of layer types that this DecodingLayer can decode. +func (i *IGMP) CanDecode() gopacket.LayerClass { + return LayerTypeIGMP +} + +// NextLayerType returns the layer type contained by this DecodingLayer. +func (i *IGMP) NextLayerType() gopacket.LayerType { + return gopacket.LayerTypeZero +} + +// decodeIGMP will parse IGMP v1,2 or 3 protocols. Checks against the +// IGMP type are performed against byte[0], logic then iniitalizes and +// passes the appropriate struct (IGMP or IGMPv1or2) to +// decodingLayerDecoder. +func decodeIGMP(data []byte, p gopacket.PacketBuilder) error { + if len(data) < 1 { + return errors.New("IGMP packet is too small") + } + + // byte 0 contains IGMP message type. + switch IGMPType(data[0]) { + case IGMPMembershipQuery: + // IGMPv3 Membership Query payload is >= 12 + if len(data) >= 12 { + i := &IGMP{Version: 3} + return decodingLayerDecoder(i, data, p) + } else if len(data) == 8 { + i := &IGMPv1or2{} + if data[1] == 0x00 { + i.Version = 1 // IGMPv1 has a query length of 8 and MaxResp = 0 + } else { + i.Version = 2 // IGMPv2 has a query length of 8 and MaxResp != 0 + } + + return decodingLayerDecoder(i, data, p) + } + case IGMPMembershipReportV3: + i := &IGMP{Version: 3} + return decodingLayerDecoder(i, data, p) + case IGMPMembershipReportV1: + i := &IGMPv1or2{Version: 1} + return decodingLayerDecoder(i, data, p) + case IGMPLeaveGroup, IGMPMembershipReportV2: + // leave group and Query Report v2 used in IGMPv2 only. + i := &IGMPv1or2{Version: 2} + return decodingLayerDecoder(i, data, p) + default: + } + + return errors.New("Unable to determine IGMP type.") +} diff --git a/vendor/github.com/google/gopacket/layers/igmp_test.go b/vendor/github.com/google/gopacket/layers/igmp_test.go new file mode 100644 index 0000000..923356d --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/igmp_test.go @@ -0,0 +1,171 @@ +// Copyright 2016, 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 layers + +import ( + "testing" + + "github.com/google/gopacket" +) + +// igmpv1MembershipReportPacket is the packet: +// 02:45:36.033916 IP 10.60.0.132 > 224.0.1.60: igmp v1 report 224.0.1.60 +// 0x0000: 0100 5e00 013c 0030 c1bf 5755 0800 4500 ..^..<.0..WU..E. +// 0x0010: 001c 6a7f 0000 0102 6365 0a3c 0084 e000 ..j.....ce.<.... +// 0x0020: 013c 1200 0cc3 e000 013c 0000 0000 0000 .<.......<...... +// 0x0030: ffff ffff ffff 0452 0000 0000 .......R.... +var igmpv1MembershipReportPacket = []byte{ + 0x01, 0x00, 0x5e, 0x00, 0x01, 0x3c, 0x00, 0x30, 0xc1, 0xbf, 0x57, 0x55, 0x08, 0x00, 0x45, 0x00, + 0x00, 0x1c, 0x6a, 0x7f, 0x00, 0x00, 0x01, 0x02, 0x63, 0x65, 0x0a, 0x3c, 0x00, 0x84, 0xe0, 0x00, + 0x01, 0x3c, 0x12, 0x00, 0x0c, 0xc3, 0xe0, 0x00, 0x01, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x52, 0x00, 0x00, 0x00, 0x00, +} + +func TestIGMPv1MembershipReportPacket(t *testing.T) { + p := gopacket.NewPacket(igmpv1MembershipReportPacket, LinkTypeEthernet, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeEthernet, LayerTypeIPv4, LayerTypeIGMP}, t) + + igmp := p.Layer(LayerTypeIGMP).(*IGMPv1or2) + if igmp.Type != IGMPMembershipReportV1 { + t.Fatal("Invalid IGMP type") + } +} + +func BenchmarkDecodeigmpv1MembershipReportPacket(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(igmpv1MembershipReportPacket, LinkTypeEthernet, gopacket.NoCopy) + } +} + +// igmpv2MembershipQueryPacket is the packet: +// 02:45:28.071636 IP 10.60.0.189 > 224.0.0.1: igmp query v2 +// 0x0000: 0100 5e00 0001 0001 636f c800 0800 45c0 ..^.....co....E. +// 0x0010: 001c 0153 0000 0102 ccd3 0a3c 00bd e000 ...S.......<.... +// 0x0020: 0001 1164 ee9b 0000 0000 0000 0000 0000 ...d............ +// 0x0030: 0000 0000 0000 0000 0000 0000 ............ +var igmpv2MembershipQueryPacket = []byte{ + 0x01, 0x00, 0x5e, 0x00, 0x00, 0x01, 0x00, 0x01, 0x63, 0x6f, 0xc8, 0x00, 0x08, 0x00, 0x45, 0xc0, + 0x00, 0x1c, 0x01, 0x53, 0x00, 0x00, 0x01, 0x02, 0xcc, 0xd3, 0x0a, 0x3c, 0x00, 0xbd, 0xe0, 0x00, + 0x00, 0x01, 0x11, 0x64, 0xee, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +} + +func TestIGMPv2MembershipQuery(t *testing.T) { + p := gopacket.NewPacket(igmpv2MembershipQueryPacket, LinkTypeEthernet, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeEthernet, LayerTypeIPv4, LayerTypeIGMP}, t) + + igmp := p.Layer(LayerTypeIGMP).(*IGMPv1or2) + if igmp.Type != IGMPMembershipQuery { + t.Fatal("Invalid IGMP type") + } +} +func BenchmarkDecodeigmpv2MembershipQueryPacket(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(igmpv2MembershipQueryPacket, LinkTypeEthernet, gopacket.NoCopy) + } +} + +// igmpv2MembershipReportPacket is the packet: +// 02:47:32.417288 IP 10.60.5.103 > 239.255.255.253: igmp v2 report 239.255.255.253 +// 0x0000: 0100 5e7f fffd 0015 58dc d9f6 0800 4600 ..^.....X.....F. +// 0x0010: 0020 79f0 0000 0102 ab47 0a3c 0567 efff ..y......G.<.g.. +// 0x0020: fffd 9404 0000 1600 fa01 efff fffd 0000 ................ +// 0x0030: 0000 0000 0000 0000 0000 0000 ............ +var igmpv2MembershipReportPacket = []byte{ + 0x01, 0x00, 0x5e, 0x7f, 0xff, 0xfd, 0x00, 0x15, 0x58, 0xdc, 0xd9, 0xf6, 0x08, 0x00, 0x46, 0x00, + 0x00, 0x20, 0x79, 0xf0, 0x00, 0x00, 0x01, 0x02, 0xab, 0x47, 0x0a, 0x3c, 0x05, 0x67, 0xef, 0xff, + 0xff, 0xfd, 0x94, 0x04, 0x00, 0x00, 0x16, 0x00, 0xfa, 0x01, 0xef, 0xff, 0xff, 0xfd, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +} + +func TestIGMPv2MembershipReport(t *testing.T) { + p := gopacket.NewPacket(igmpv2MembershipReportPacket, LinkTypeEthernet, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeEthernet, LayerTypeIPv4, LayerTypeIGMP}, t) + + igmp := p.Layer(LayerTypeIGMP).(*IGMPv1or2) + if igmp.Type != IGMPMembershipReportV2 { + t.Fatal("Invalid IGMP type") + } +} +func BenchmarkDecodeigmpv2MembershipReportPacket(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(igmpv2MembershipReportPacket, LinkTypeEthernet, gopacket.NoCopy) + } +} + +// igmp3v3MembershipQueryPacket is the packet: +// 10:07:30.488511 IP 192.168.1.254 > 224.0.0.1: igmp query v3 [max resp time 2.4s] +// 0x0000: 0100 5e00 0001 0026 446c 1eda 0800 46c0 ..^....&Dl....F. +// 0x0010: 0024 17f1 4000 0102 297b c0a8 01fe e000 .$..@...){...... +// 0x0020: 0001 9404 0000 1118 ecd3 0000 0000 0214 ................ +// 0x0030: 0000 0000 0000 0000 0000 0000 ............ +var igmp3v3MembershipQueryPacket = []byte{ + 0x01, 0x00, 0x5e, 0x00, 0x00, 0x01, 0x00, 0x26, 0x44, 0x6c, 0x1e, 0xda, 0x08, 0x00, 0x46, 0xc0, + 0x00, 0x24, 0x17, 0xf1, 0x40, 0x00, 0x01, 0x02, 0x29, 0x7b, 0xc0, 0xa8, 0x01, 0xfe, 0xe0, 0x00, + 0x00, 0x01, 0x94, 0x04, 0x00, 0x00, 0x11, 0x18, 0xec, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x02, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +} + +func TestIGMPv3MembershipQuery(t *testing.T) { + p := gopacket.NewPacket(igmp3v3MembershipQueryPacket, LinkTypeEthernet, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeEthernet, LayerTypeIPv4, LayerTypeIGMP}, t) + + igmp := p.Layer(LayerTypeIGMP).(*IGMP) + if igmp.Type != IGMPMembershipQuery { + t.Fatal("Invalid IGMP type") + } +} + +func BenchmarkDecodeigmp3v3MembershipQueryPacket(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(igmp3v3MembershipQueryPacket, LinkTypeEthernet, gopacket.NoCopy) + } +} + +// igmpv3MembershipReport2Records is the packet: +// 10:07:29.756202 IP 192.168.1.66 > 224.0.0.22: igmp v3 report, 2 group record(s) +// 0x0000: 0100 5e00 0016 0025 2e51 c381 0800 4658 ..^....%.Q....FX +// 0x0010: 0030 013c 0000 0102 8133 c0a8 0142 e000 .0.<.....3...B.. +// 0x0020: 0016 9404 0000 2200 f33c 0000 0002 0200 ......"..<...... +// 0x0030: 0000 efc3 0702 0200 0000 efff fffa .............. +var igmpv3MembershipReport2Records = []byte{ + 0x01, 0x00, 0x5e, 0x00, 0x00, 0x16, 0x00, 0x25, 0x2e, 0x51, 0xc3, 0x81, 0x08, 0x00, 0x46, 0x58, + 0x00, 0x30, 0x01, 0x3c, 0x00, 0x00, 0x01, 0x02, 0x81, 0x33, 0xc0, 0xa8, 0x01, 0x42, 0xe0, 0x00, + 0x00, 0x16, 0x94, 0x04, 0x00, 0x00, 0x22, 0x00, 0xf3, 0x3c, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, + 0x00, 0x00, 0xef, 0xc3, 0x07, 0x02, 0x02, 0x00, 0x00, 0x00, 0xef, 0xff, 0xff, 0xfa, +} + +func TestIGMPv3MembershipReport2Records(t *testing.T) { + p := gopacket.NewPacket(igmpv3MembershipReport2Records, LinkTypeEthernet, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeEthernet, LayerTypeIPv4, LayerTypeIGMP}, t) + + igmp := p.Layer(LayerTypeIGMP).(*IGMP) + if igmp.Type != IGMPMembershipReportV3 { + t.Fatal("Invalid IGMP type") + } +} + +func BenchmarkDecodeigmpv3MembershipReport2Records(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(igmpv3MembershipReport2Records, LinkTypeEthernet, gopacket.NoCopy) + } +} diff --git a/vendor/github.com/google/gopacket/layers/ip4.go b/vendor/github.com/google/gopacket/layers/ip4.go new file mode 100644 index 0000000..3f31b27 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/ip4.go @@ -0,0 +1,311 @@ +// Copyright 2012 Google, Inc. All rights reserved. +// Copyright 2009-2011 Andreas Krennmair. 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 layers + +import ( + "encoding/binary" + "errors" + "fmt" + "net" + "strings" + + "github.com/google/gopacket" +) + +type IPv4Flag uint8 + +const ( + IPv4EvilBit IPv4Flag = 1 << 2 // http://tools.ietf.org/html/rfc3514 ;) + IPv4DontFragment IPv4Flag = 1 << 1 + IPv4MoreFragments IPv4Flag = 1 << 0 +) + +func (f IPv4Flag) String() string { + var s []string + if f&IPv4EvilBit != 0 { + s = append(s, "Evil") + } + if f&IPv4DontFragment != 0 { + s = append(s, "DF") + } + if f&IPv4MoreFragments != 0 { + s = append(s, "MF") + } + return strings.Join(s, "|") +} + +// IPv4 is the header of an IP packet. +type IPv4 struct { + BaseLayer + Version uint8 + IHL uint8 + TOS uint8 + Length uint16 + Id uint16 + Flags IPv4Flag + FragOffset uint16 + TTL uint8 + Protocol IPProtocol + Checksum uint16 + SrcIP net.IP + DstIP net.IP + Options []IPv4Option + Padding []byte +} + +// LayerType returns LayerTypeIPv4 +func (i *IPv4) LayerType() gopacket.LayerType { return LayerTypeIPv4 } +func (i *IPv4) NetworkFlow() gopacket.Flow { + return gopacket.NewFlow(EndpointIPv4, i.SrcIP, i.DstIP) +} + +type IPv4Option struct { + OptionType uint8 + OptionLength uint8 + OptionData []byte +} + +func (i IPv4Option) String() string { + return fmt.Sprintf("IPv4Option(%v:%v)", i.OptionType, i.OptionData) +} + +// for the current ipv4 options, return the number of bytes (including +// padding that the options used) +func (ip *IPv4) getIPv4OptionSize() uint8 { + optionSize := uint8(0) + for _, opt := range ip.Options { + switch opt.OptionType { + case 0: + // this is the end of option lists + optionSize++ + case 1: + // this is the padding + optionSize++ + default: + optionSize += opt.OptionLength + + } + } + // make sure the options are aligned to 32 bit boundary + if (optionSize % 4) != 0 { + optionSize += 4 - (optionSize % 4) + } + return optionSize +} + +// SerializeTo writes the serialized form of this layer into the +// SerializationBuffer, implementing gopacket.SerializableLayer. +func (ip *IPv4) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + optionLength := ip.getIPv4OptionSize() + bytes, err := b.PrependBytes(20 + int(optionLength)) + if err != nil { + return err + } + if opts.FixLengths { + ip.IHL = 5 + (optionLength / 4) + ip.Length = uint16(len(b.Bytes())) + } + bytes[0] = (ip.Version << 4) | ip.IHL + bytes[1] = ip.TOS + binary.BigEndian.PutUint16(bytes[2:], ip.Length) + binary.BigEndian.PutUint16(bytes[4:], ip.Id) + binary.BigEndian.PutUint16(bytes[6:], ip.flagsfrags()) + bytes[8] = ip.TTL + bytes[9] = byte(ip.Protocol) + if err := ip.AddressTo4(); err != nil { + return err + } + copy(bytes[12:16], ip.SrcIP) + copy(bytes[16:20], ip.DstIP) + + curLocation := 20 + // Now, we will encode the options + for _, opt := range ip.Options { + switch opt.OptionType { + case 0: + // this is the end of option lists + bytes[curLocation] = 0 + curLocation++ + case 1: + // this is the padding + bytes[curLocation] = 1 + curLocation++ + default: + bytes[curLocation] = opt.OptionType + bytes[curLocation+1] = opt.OptionLength + + // sanity checking to protect us from buffer overrun + if len(opt.OptionData) > int(opt.OptionLength-2) { + return errors.New("option length is smaller than length of option data") + } + copy(bytes[curLocation+2:curLocation+int(opt.OptionLength)], opt.OptionData) + curLocation += int(opt.OptionLength) + } + } + + if opts.ComputeChecksums { + ip.Checksum = checksum(bytes) + } + binary.BigEndian.PutUint16(bytes[10:], ip.Checksum) + return nil +} + +func checksum(bytes []byte) uint16 { + // Clear checksum bytes + bytes[10] = 0 + bytes[11] = 0 + + // Compute checksum + var csum uint32 + for i := 0; i < len(bytes); i += 2 { + csum += uint32(bytes[i]) << 8 + csum += uint32(bytes[i+1]) + } + for { + // Break when sum is less or equals to 0xFFFF + if csum <= 65535 { + break + } + // Add carry to the sum + csum = (csum >> 16) + uint32(uint16(csum)) + } + // Flip all the bits + return ^uint16(csum) +} + +func (ip *IPv4) flagsfrags() (ff uint16) { + ff |= uint16(ip.Flags) << 13 + ff |= ip.FragOffset + return +} + +// DecodeFromBytes decodes the given bytes into this layer. +func (ip *IPv4) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + flagsfrags := binary.BigEndian.Uint16(data[6:8]) + + ip.Version = uint8(data[0]) >> 4 + ip.IHL = uint8(data[0]) & 0x0F + ip.TOS = data[1] + ip.Length = binary.BigEndian.Uint16(data[2:4]) + ip.Id = binary.BigEndian.Uint16(data[4:6]) + ip.Flags = IPv4Flag(flagsfrags >> 13) + ip.FragOffset = flagsfrags & 0x1FFF + ip.TTL = data[8] + ip.Protocol = IPProtocol(data[9]) + ip.Checksum = binary.BigEndian.Uint16(data[10:12]) + ip.SrcIP = data[12:16] + ip.DstIP = data[16:20] + ip.Options = ip.Options[:0] + // Set up an initial guess for contents/payload... we'll reset these soon. + ip.BaseLayer = BaseLayer{Contents: data} + + // This code is added for the following enviroment: + // * Windows 10 with TSO option activated. ( tested on Hyper-V, RealTek ethernet driver ) + if ip.Length == 0 { + // If using TSO(TCP Segmentation Offload), length is zero. + // The actual packet length is the length of data. + ip.Length = uint16(len(data)) + } + + if ip.Length < 20 { + return fmt.Errorf("Invalid (too small) IP length (%d < 20)", ip.Length) + } else if ip.IHL < 5 { + return fmt.Errorf("Invalid (too small) IP header length (%d < 5)", ip.IHL) + } else if int(ip.IHL*4) > int(ip.Length) { + return fmt.Errorf("Invalid IP header length > IP length (%d > %d)", ip.IHL, ip.Length) + } + if cmp := len(data) - int(ip.Length); cmp > 0 { + data = data[:ip.Length] + } else if cmp < 0 { + df.SetTruncated() + if int(ip.IHL)*4 > len(data) { + return errors.New("Not all IP header bytes available") + } + } + ip.Contents = data[:ip.IHL*4] + ip.Payload = data[ip.IHL*4:] + // From here on, data contains the header options. + data = data[20 : ip.IHL*4] + // Pull out IP options + for len(data) > 0 { + if ip.Options == nil { + // Pre-allocate to avoid growing the slice too much. + ip.Options = make([]IPv4Option, 0, 4) + } + opt := IPv4Option{OptionType: data[0]} + switch opt.OptionType { + case 0: // End of options + opt.OptionLength = 1 + ip.Options = append(ip.Options, opt) + ip.Padding = data[1:] + break + case 1: // 1 byte padding + opt.OptionLength = 1 + default: + opt.OptionLength = data[1] + opt.OptionData = data[2:opt.OptionLength] + } + if len(data) >= int(opt.OptionLength) { + data = data[opt.OptionLength:] + } else { + return fmt.Errorf("IP option length exceeds remaining IP header size, option type %v length %v", opt.OptionType, opt.OptionLength) + } + ip.Options = append(ip.Options, opt) + } + return nil +} + +func (i *IPv4) CanDecode() gopacket.LayerClass { + return LayerTypeIPv4 +} + +func (i *IPv4) NextLayerType() gopacket.LayerType { + if i.Flags&IPv4MoreFragments != 0 || i.FragOffset != 0 { + return gopacket.LayerTypeFragment + } + return i.Protocol.LayerType() +} + +func decodeIPv4(data []byte, p gopacket.PacketBuilder) error { + ip := &IPv4{} + err := ip.DecodeFromBytes(data, p) + p.AddLayer(ip) + p.SetNetworkLayer(ip) + if err != nil { + return err + } + return p.NextDecoder(ip.NextLayerType()) +} + +func checkIPv4Address(addr net.IP) (net.IP, error) { + if c := addr.To4(); c != nil { + return c, nil + } + if len(addr) == net.IPv6len { + return nil, errors.New("address is IPv6") + } + return nil, fmt.Errorf("wrong length of %d bytes instead of %d", len(addr), net.IPv4len) +} + +func (ip *IPv4) AddressTo4() error { + var src, dst net.IP + + if addr, err := checkIPv4Address(ip.SrcIP); err != nil { + return fmt.Errorf("Invalid source IPv4 address (%s)", err) + } else { + src = addr + } + if addr, err := checkIPv4Address(ip.DstIP); err != nil { + return fmt.Errorf("Invalid destination IPv4 address (%s)", err) + } else { + dst = addr + } + ip.SrcIP = src + ip.DstIP = dst + return nil +} diff --git a/vendor/github.com/google/gopacket/layers/ip4_test.go b/vendor/github.com/google/gopacket/layers/ip4_test.go new file mode 100644 index 0000000..ec6b351 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/ip4_test.go @@ -0,0 +1,131 @@ +// 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. + +// This file tests some of the functionality provided in the ip4.go + +package layers + +import ( + "encoding/binary" + "encoding/hex" + "net" + "testing" + + "github.com/google/gopacket" +) + +// Test the function getIPv4OptionSize when the ipv4 has no options +func TestGetIPOptLengthNoOpt(t *testing.T) { + ip := IPv4{} + length := ip.getIPv4OptionSize() + if length != 0 { + t.Fatalf("Empty option list should have 0 length. Actual %d", length) + } +} + +// Test the function getIPv4OptionSize when the ipv4 has end of list option +func TestGetIPOptLengthEndOfList(t *testing.T) { + ip := IPv4{} + ip.Options = append(ip.Options, IPv4Option{OptionType: 0, OptionLength: 1}) + length := ip.getIPv4OptionSize() + if length != 4 { + t.Fatalf("After padding, the list should have 4 length. Actual %d", length) + } +} + +// Test the function getIPv4OptionSize when the ipv4 has padding and end of list option +func TestGetIPOptLengthPaddingEndOfList(t *testing.T) { + ip := IPv4{} + ip.Options = append(ip.Options, IPv4Option{OptionType: 1, OptionLength: 1}) + ip.Options = append(ip.Options, IPv4Option{OptionType: 0, OptionLength: 1}) + length := ip.getIPv4OptionSize() + if length != 4 { + t.Fatalf("After padding, the list should have 4 length. Actual %d", length) + } +} + +// Test the function getIPv4OptionSize when the ipv4 has some non-trivial option and end of list option +func TestGetIPOptLengthOptionEndOfList(t *testing.T) { + ip := IPv4{} + someByte := make([]byte, 8) + ip.Options = append(ip.Options, IPv4Option{OptionType: 2, OptionLength: 10, OptionData: someByte}) + ip.Options = append(ip.Options, IPv4Option{OptionType: 0, OptionLength: 1}) + length := ip.getIPv4OptionSize() + if length != 12 { + t.Fatalf("The list should have 12 length. Actual %d", length) + } +} + +// Tests that the Options slice is properly reset before parsing new data +func TestIPOptResetDuringDecoding(t *testing.T) { + ip := &IPv4{ + Options: []IPv4Option{{OptionType: 42, OptionLength: 4, OptionData: make([]byte, 2)}}, + } + + ipWithoutOptions := &IPv4{ + SrcIP: net.IPv4(192, 168, 1, 1), + DstIP: net.IPv4(192, 168, 1, 1), + Protocol: IPProtocolTCP, + } + + ipBytes, err := serialize(ipWithoutOptions) + + if err != nil { + t.Fatalf("Failed to serialize ip layer: %v", err) + } + + err = ip.DecodeFromBytes(ipBytes, gopacket.NilDecodeFeedback) + + if err != nil { + t.Fatalf("Failed to deserialize ip layer: %v", err) + } + + if len(ip.Options) > 0 { + t.Fatalf("Options slice has stale data from previous packet") + } + +} + +func serialize(ip *IPv4) ([]byte, error) { + buffer := gopacket.NewSerializeBuffer() + err := ip.SerializeTo(buffer, gopacket.SerializeOptions{ + FixLengths: true, + ComputeChecksums: true, + }) + return buffer.Bytes(), err +} + +// Test the function checksum +func TestChecksum(t *testing.T) { + testData := []struct { + name string + header string + want string + }{{ + name: "sum has two carries", + header: "4540005800000000ff11ffff0aeb1d070aed8877", + want: "fffe", + }, { + name: "wikipedia case", + header: "45000073000040004011b861c0a80001c0a800c7", + want: "b861", + }} + + for _, test := range testData { + bytes, err := hex.DecodeString(test.header) + if err != nil { + t.Fatalf("Failed to Decode header: %v", err) + } + wantBytes, err := hex.DecodeString(test.want) + if err != nil { + t.Fatalf("Failed to decode want checksum: %v", err) + } + + if got, want := checksum(bytes), binary.BigEndian.Uint16(wantBytes); got != want { + t.Errorf("In test %q, got incorrect checksum: got(%x), want(%x)", test.name, got, want) + } + } +} diff --git a/vendor/github.com/google/gopacket/layers/ip6.go b/vendor/github.com/google/gopacket/layers/ip6.go new file mode 100644 index 0000000..b5befe9 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/ip6.go @@ -0,0 +1,650 @@ +// Copyright 2012 Google, Inc. All rights reserved. +// Copyright 2009-2011 Andreas Krennmair. 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 layers + +import ( + "encoding/binary" + "errors" + "fmt" + "net" + + "github.com/google/gopacket" +) + +const ( + IPv6HopByHopOptionJumbogram = 0xC2 // RFC 2675 +) + +const ( + ipv6MaxPayloadLength = 65535 +) + +// IPv6 is the layer for the IPv6 header. +type IPv6 struct { + // http://www.networksorcery.com/enp/protocol/ipv6.htm + BaseLayer + Version uint8 + TrafficClass uint8 + FlowLabel uint32 + Length uint16 + NextHeader IPProtocol + HopLimit uint8 + SrcIP net.IP + DstIP net.IP + HopByHop *IPv6HopByHop + // hbh will be pointed to by HopByHop if that layer exists. + hbh IPv6HopByHop +} + +// LayerType returns LayerTypeIPv6 +func (i *IPv6) LayerType() gopacket.LayerType { return LayerTypeIPv6 } + +func (i *IPv6) NetworkFlow() gopacket.Flow { + return gopacket.NewFlow(EndpointIPv6, i.SrcIP, i.DstIP) +} + +// Search for Jumbo Payload TLV in IPv6HopByHop and return (length, true) if found +func getIPv6HopByHopJumboLength(hopopts *IPv6HopByHop) (uint32, bool, error) { + var tlv *IPv6HopByHopOption + + for _, t := range hopopts.Options { + if t.OptionType == IPv6HopByHopOptionJumbogram { + tlv = t + break + } + } + if tlv == nil { + // Not found + return 0, false, nil + } + if len(tlv.OptionData) != 4 { + return 0, false, errors.New("Jumbo length TLV data must have length 4") + } + l := binary.BigEndian.Uint32(tlv.OptionData) + if l <= ipv6MaxPayloadLength { + return 0, false, fmt.Errorf("Jumbo length cannot be less than %d", ipv6MaxPayloadLength+1) + } + // Found + return l, true, nil +} + +// Adds zero-valued Jumbo TLV to IPv6 header if it does not exist +// (if necessary add hop-by-hop header) +func addIPv6JumboOption(ip6 *IPv6) { + var tlv *IPv6HopByHopOption + + if ip6.HopByHop == nil { + // Add IPv6 HopByHop + ip6.HopByHop = &IPv6HopByHop{} + ip6.HopByHop.NextHeader = ip6.NextHeader + ip6.HopByHop.HeaderLength = 0 + ip6.NextHeader = IPProtocolIPv6HopByHop + } + for _, t := range ip6.HopByHop.Options { + if t.OptionType == IPv6HopByHopOptionJumbogram { + tlv = t + break + } + } + if tlv == nil { + // Add Jumbo TLV + tlv = &IPv6HopByHopOption{} + ip6.HopByHop.Options = append(ip6.HopByHop.Options, tlv) + } + tlv.SetJumboLength(0) +} + +// Set jumbo length in serialized IPv6 payload (starting with HopByHop header) +func setIPv6PayloadJumboLength(hbh []byte) error { + pLen := len(hbh) + if pLen < 8 { + //HopByHop is minimum 8 bytes + return fmt.Errorf("Invalid IPv6 payload (length %d)", pLen) + } + hbhLen := int((hbh[1] + 1) * 8) + if hbhLen > pLen { + return fmt.Errorf("Invalid hop-by-hop length (length: %d, payload: %d", hbhLen, pLen) + } + offset := 2 //start with options + for offset < hbhLen { + opt := hbh[offset] + if opt == 0 { + //Pad1 + offset += 1 + continue + } + optLen := int(hbh[offset+1]) + if opt == IPv6HopByHopOptionJumbogram { + if optLen == 4 { + binary.BigEndian.PutUint32(hbh[offset+2:], uint32(pLen)) + return nil + } + return fmt.Errorf("Jumbo TLV too short (%d bytes)", optLen) + } + offset += 2 + optLen + } + return errors.New("Jumbo TLV not found") +} + +// SerializeTo writes the serialized form of this layer into the +// SerializationBuffer, implementing gopacket.SerializableLayer. +// See the docs for gopacket.SerializableLayer for more info. +func (ip6 *IPv6) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + var jumbo bool + var err error + + payload := b.Bytes() + pLen := len(payload) + if pLen > ipv6MaxPayloadLength { + jumbo = true + if opts.FixLengths { + // We need to set the length later because the hop-by-hop header may + // not exist or else need padding, so pLen may yet change + addIPv6JumboOption(ip6) + } else if ip6.HopByHop == nil { + return fmt.Errorf("Cannot fit payload length of %d into IPv6 packet", pLen) + } else { + _, ok, err := getIPv6HopByHopJumboLength(ip6.HopByHop) + if err != nil { + return err + } + if !ok { + return errors.New("Missing jumbo length hop-by-hop option") + } + } + } + if ip6.HopByHop != nil { + if ip6.NextHeader != IPProtocolIPv6HopByHop { + // Just fix it instead of throwing an error + ip6.NextHeader = IPProtocolIPv6HopByHop + } + err = ip6.HopByHop.SerializeTo(b, opts) + if err != nil { + return err + } + payload = b.Bytes() + pLen = len(payload) + if opts.FixLengths && jumbo { + err := setIPv6PayloadJumboLength(payload) + if err != nil { + return err + } + } + } + if !jumbo && pLen > ipv6MaxPayloadLength { + return errors.New("Cannot fit payload into IPv6 header") + } + bytes, err := b.PrependBytes(40) + if err != nil { + return err + } + bytes[0] = (ip6.Version << 4) | (ip6.TrafficClass >> 4) + bytes[1] = (ip6.TrafficClass << 4) | uint8(ip6.FlowLabel>>16) + binary.BigEndian.PutUint16(bytes[2:], uint16(ip6.FlowLabel)) + if opts.FixLengths { + if jumbo { + ip6.Length = 0 + } else { + ip6.Length = uint16(pLen) + } + } + binary.BigEndian.PutUint16(bytes[4:], ip6.Length) + bytes[6] = byte(ip6.NextHeader) + bytes[7] = byte(ip6.HopLimit) + if err := ip6.AddressTo16(); err != nil { + return err + } + copy(bytes[8:], ip6.SrcIP) + copy(bytes[24:], ip6.DstIP) + return nil +} + +func (ip6 *IPv6) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + ip6.Version = uint8(data[0]) >> 4 + ip6.TrafficClass = uint8((binary.BigEndian.Uint16(data[0:2]) >> 4) & 0x00FF) + ip6.FlowLabel = binary.BigEndian.Uint32(data[0:4]) & 0x000FFFFF + ip6.Length = binary.BigEndian.Uint16(data[4:6]) + ip6.NextHeader = IPProtocol(data[6]) + ip6.HopLimit = data[7] + ip6.SrcIP = data[8:24] + ip6.DstIP = data[24:40] + ip6.HopByHop = nil + ip6.BaseLayer = BaseLayer{data[:40], data[40:]} + + // We treat a HopByHop IPv6 option as part of the IPv6 packet, since its + // options are crucial for understanding what's actually happening per packet. + if ip6.NextHeader == IPProtocolIPv6HopByHop { + err := ip6.hbh.DecodeFromBytes(ip6.Payload, df) + if err != nil { + return err + } + ip6.HopByHop = &ip6.hbh + pEnd, jumbo, err := getIPv6HopByHopJumboLength(ip6.HopByHop) + if err != nil { + return err + } + if jumbo && ip6.Length == 0 { + pEnd := int(pEnd) + if pEnd > len(ip6.Payload) { + df.SetTruncated() + pEnd = len(ip6.Payload) + } + ip6.Payload = ip6.Payload[:pEnd] + return nil + } else if jumbo && ip6.Length != 0 { + return errors.New("IPv6 has jumbo length and IPv6 length is not 0") + } else if !jumbo && ip6.Length == 0 { + return errors.New("IPv6 length 0, but HopByHop header does not have jumbogram option") + } + } + + if ip6.Length == 0 { + return fmt.Errorf("IPv6 length 0, but next header is %v, not HopByHop", ip6.NextHeader) + } else { + pEnd := int(ip6.Length) + if pEnd > len(ip6.Payload) { + df.SetTruncated() + pEnd = len(ip6.Payload) + } + ip6.Payload = ip6.Payload[:pEnd] + } + return nil +} + +func (i *IPv6) CanDecode() gopacket.LayerClass { + return LayerTypeIPv6 +} + +func (i *IPv6) NextLayerType() gopacket.LayerType { + if i.HopByHop != nil { + return i.HopByHop.NextHeader.LayerType() + } + return i.NextHeader.LayerType() +} + +func decodeIPv6(data []byte, p gopacket.PacketBuilder) error { + ip6 := &IPv6{} + err := ip6.DecodeFromBytes(data, p) + p.AddLayer(ip6) + p.SetNetworkLayer(ip6) + if ip6.HopByHop != nil { + p.AddLayer(ip6.HopByHop) + } + if err != nil { + return err + } + return p.NextDecoder(ip6.NextLayerType()) +} + +type ipv6HeaderTLVOption struct { + OptionType, OptionLength uint8 + ActualLength int + OptionData []byte + OptionAlignment [2]uint8 // Xn+Y = [2]uint8{X, Y} +} + +func (h *ipv6HeaderTLVOption) serializeTo(data []byte, fixLengths bool, dryrun bool) int { + if fixLengths { + h.OptionLength = uint8(len(h.OptionData)) + } + length := int(h.OptionLength) + 2 + if !dryrun { + data[0] = h.OptionType + data[1] = h.OptionLength + copy(data[2:], h.OptionData) + } + return length +} + +func decodeIPv6HeaderTLVOption(data []byte) (h *ipv6HeaderTLVOption) { + h = &ipv6HeaderTLVOption{} + if data[0] == 0 { + h.ActualLength = 1 + return + } + h.OptionType = data[0] + h.OptionLength = data[1] + h.ActualLength = int(h.OptionLength) + 2 + h.OptionData = data[2:h.ActualLength] + return +} + +func serializeTLVOptionPadding(data []byte, padLength int) { + if padLength <= 0 { + return + } + if padLength == 1 { + data[0] = 0x0 + return + } + tlvLength := uint8(padLength) - 2 + data[0] = 0x1 + data[1] = tlvLength + if tlvLength != 0 { + for k := range data[2:] { + data[k+2] = 0x0 + } + } + return +} + +// If buf is 'nil' do a serialize dry run +func serializeIPv6HeaderTLVOptions(buf []byte, options []*ipv6HeaderTLVOption, fixLengths bool) int { + var l int + + dryrun := buf == nil + length := 2 + for _, opt := range options { + if fixLengths { + x := int(opt.OptionAlignment[0]) + y := int(opt.OptionAlignment[1]) + if x != 0 { + n := length / x + offset := x*n + y + if offset < length { + offset += x + } + if length != offset { + pad := offset - length + if !dryrun { + serializeTLVOptionPadding(buf[length-2:], pad) + } + length += pad + } + } + } + if dryrun { + l = opt.serializeTo(nil, fixLengths, true) + } else { + l = opt.serializeTo(buf[length-2:], fixLengths, false) + } + length += l + } + if fixLengths { + pad := length % 8 + if pad != 0 { + if !dryrun { + serializeTLVOptionPadding(buf[length-2:], pad) + } + length += pad + } + } + return length - 2 +} + +type ipv6ExtensionBase struct { + BaseLayer + NextHeader IPProtocol + HeaderLength uint8 + ActualLength int +} + +func decodeIPv6ExtensionBase(data []byte) (i ipv6ExtensionBase) { + i.NextHeader = IPProtocol(data[0]) + i.HeaderLength = data[1] + i.ActualLength = int(i.HeaderLength)*8 + 8 + i.Contents = data[:i.ActualLength] + i.Payload = data[i.ActualLength:] + return +} + +// IPv6ExtensionSkipper is a DecodingLayer which decodes and ignores v6 +// extensions. You can use it with a DecodingLayerParser to handle IPv6 stacks +// which may or may not have extensions. +type IPv6ExtensionSkipper struct { + NextHeader IPProtocol + BaseLayer +} + +func (i *IPv6ExtensionSkipper) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + extension := decodeIPv6ExtensionBase(data) + i.BaseLayer = BaseLayer{data[:extension.ActualLength], data[extension.ActualLength:]} + i.NextHeader = extension.NextHeader + return nil +} + +func (i *IPv6ExtensionSkipper) CanDecode() gopacket.LayerClass { + return LayerClassIPv6Extension +} + +func (i *IPv6ExtensionSkipper) NextLayerType() gopacket.LayerType { + return i.NextHeader.LayerType() +} + +// IPv6HopByHopOption is a TLV option present in an IPv6 hop-by-hop extension. +type IPv6HopByHopOption ipv6HeaderTLVOption + +// IPv6HopByHop is the IPv6 hop-by-hop extension. +type IPv6HopByHop struct { + ipv6ExtensionBase + Options []*IPv6HopByHopOption +} + +// LayerType returns LayerTypeIPv6HopByHop. +func (i *IPv6HopByHop) LayerType() gopacket.LayerType { return LayerTypeIPv6HopByHop } + +func (i *IPv6HopByHop) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + var bytes []byte + var err error + + o := make([]*ipv6HeaderTLVOption, 0, len(i.Options)) + for _, v := range i.Options { + o = append(o, (*ipv6HeaderTLVOption)(v)) + } + + l := serializeIPv6HeaderTLVOptions(nil, o, opts.FixLengths) + bytes, err = b.PrependBytes(l) + if err != nil { + return err + } + serializeIPv6HeaderTLVOptions(bytes, o, opts.FixLengths) + + length := len(bytes) + 2 + if length%8 != 0 { + return errors.New("IPv6HopByHop actual length must be multiple of 8") + } + bytes, err = b.PrependBytes(2) + if err != nil { + return err + } + bytes[0] = uint8(i.NextHeader) + if opts.FixLengths { + i.HeaderLength = uint8((length / 8) - 1) + } + bytes[1] = uint8(i.HeaderLength) + return nil +} + +func (i *IPv6HopByHop) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + i.ipv6ExtensionBase = decodeIPv6ExtensionBase(data) + offset := 2 + for offset < i.ActualLength { + opt := decodeIPv6HeaderTLVOption(data[offset:]) + i.Options = append(i.Options, (*IPv6HopByHopOption)(opt)) + offset += opt.ActualLength + } + return nil +} + +func decodeIPv6HopByHop(data []byte, p gopacket.PacketBuilder) error { + i := &IPv6HopByHop{} + err := i.DecodeFromBytes(data, p) + p.AddLayer(i) + if err != nil { + return err + } + return p.NextDecoder(i.NextHeader) +} + +func (o *IPv6HopByHopOption) SetJumboLength(len uint32) { + o.OptionType = IPv6HopByHopOptionJumbogram + o.OptionLength = 4 + o.ActualLength = 6 + if o.OptionData == nil { + o.OptionData = make([]byte, 4) + } + binary.BigEndian.PutUint32(o.OptionData, len) + o.OptionAlignment = [2]uint8{4, 2} +} + +// IPv6Routing is the IPv6 routing extension. +type IPv6Routing struct { + ipv6ExtensionBase + RoutingType uint8 + SegmentsLeft uint8 + // This segment is supposed to be zero according to RFC2460, the second set of + // 4 bytes in the extension. + Reserved []byte + // SourceRoutingIPs is the set of IPv6 addresses requested for source routing, + // set only if RoutingType == 0. + SourceRoutingIPs []net.IP +} + +// LayerType returns LayerTypeIPv6Routing. +func (i *IPv6Routing) LayerType() gopacket.LayerType { return LayerTypeIPv6Routing } + +func decodeIPv6Routing(data []byte, p gopacket.PacketBuilder) error { + i := &IPv6Routing{ + ipv6ExtensionBase: decodeIPv6ExtensionBase(data), + RoutingType: data[2], + SegmentsLeft: data[3], + Reserved: data[4:8], + } + switch i.RoutingType { + case 0: // Source routing + if (i.ActualLength-8)%16 != 0 { + return fmt.Errorf("Invalid IPv6 source routing, length of type 0 packet %d", i.ActualLength) + } + for d := i.Contents[8:]; len(d) >= 16; d = d[16:] { + i.SourceRoutingIPs = append(i.SourceRoutingIPs, net.IP(d[:16])) + } + default: + return fmt.Errorf("Unknown IPv6 routing header type %d", i.RoutingType) + } + p.AddLayer(i) + return p.NextDecoder(i.NextHeader) +} + +// IPv6Fragment is the IPv6 fragment header, used for packet +// fragmentation/defragmentation. +type IPv6Fragment struct { + BaseLayer + NextHeader IPProtocol + // Reserved1 is bits [8-16), from least to most significant, 0-indexed + Reserved1 uint8 + FragmentOffset uint16 + // Reserved2 is bits [29-31), from least to most significant, 0-indexed + Reserved2 uint8 + MoreFragments bool + Identification uint32 +} + +// LayerType returns LayerTypeIPv6Fragment. +func (i *IPv6Fragment) LayerType() gopacket.LayerType { return LayerTypeIPv6Fragment } + +func decodeIPv6Fragment(data []byte, p gopacket.PacketBuilder) error { + i := &IPv6Fragment{ + BaseLayer: BaseLayer{data[:8], data[8:]}, + NextHeader: IPProtocol(data[0]), + Reserved1: data[1], + FragmentOffset: binary.BigEndian.Uint16(data[2:4]) >> 3, + Reserved2: data[3] & 0x6 >> 1, + MoreFragments: data[3]&0x1 != 0, + Identification: binary.BigEndian.Uint32(data[4:8]), + } + p.AddLayer(i) + return p.NextDecoder(gopacket.DecodeFragment) +} + +// IPv6DestinationOption is a TLV option present in an IPv6 destination options extension. +type IPv6DestinationOption ipv6HeaderTLVOption + +// IPv6Destination is the IPv6 destination options header. +type IPv6Destination struct { + ipv6ExtensionBase + Options []*IPv6DestinationOption +} + +// LayerType returns LayerTypeIPv6Destination. +func (i *IPv6Destination) LayerType() gopacket.LayerType { return LayerTypeIPv6Destination } + +func (i *IPv6Destination) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + i.ipv6ExtensionBase = decodeIPv6ExtensionBase(data) + offset := 2 + for offset < i.ActualLength { + opt := decodeIPv6HeaderTLVOption(data[offset:]) + i.Options = append(i.Options, (*IPv6DestinationOption)(opt)) + offset += opt.ActualLength + } + return nil +} + +func decodeIPv6Destination(data []byte, p gopacket.PacketBuilder) error { + i := &IPv6Destination{} + err := i.DecodeFromBytes(data, p) + p.AddLayer(i) + if err != nil { + return err + } + return p.NextDecoder(i.NextHeader) +} + +// SerializeTo writes the serialized form of this layer into the +// SerializationBuffer, implementing gopacket.SerializableLayer. +// See the docs for gopacket.SerializableLayer for more info. +func (i *IPv6Destination) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + var bytes []byte + var err error + + o := make([]*ipv6HeaderTLVOption, 0, len(i.Options)) + for _, v := range i.Options { + o = append(o, (*ipv6HeaderTLVOption)(v)) + } + + l := serializeIPv6HeaderTLVOptions(nil, o, opts.FixLengths) + bytes, err = b.PrependBytes(l) + if err != nil { + return err + } + serializeIPv6HeaderTLVOptions(bytes, o, opts.FixLengths) + + length := len(bytes) + 2 + if length%8 != 0 { + return errors.New("IPv6Destination actual length must be multiple of 8") + } + bytes, err = b.PrependBytes(2) + if err != nil { + return err + } + bytes[0] = uint8(i.NextHeader) + if opts.FixLengths { + i.HeaderLength = uint8((length / 8) - 1) + } + bytes[1] = uint8(i.HeaderLength) + return nil +} + +func checkIPv6Address(addr net.IP) error { + if len(addr) == net.IPv6len { + return nil + } + if len(addr) == net.IPv4len { + return errors.New("address is IPv4") + } + return fmt.Errorf("wrong length of %d bytes instead of %d", len(addr), net.IPv6len) +} + +func (ip *IPv6) AddressTo16() error { + if err := checkIPv6Address(ip.SrcIP); err != nil { + return fmt.Errorf("Invalid source IPv6 address (%s)", err) + } + if err := checkIPv6Address(ip.DstIP); err != nil { + return fmt.Errorf("Invalid destination IPv6 address (%s)", err) + } + return nil +} diff --git a/vendor/github.com/google/gopacket/layers/ip6_test.go b/vendor/github.com/google/gopacket/layers/ip6_test.go new file mode 100644 index 0000000..ab22f17 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/ip6_test.go @@ -0,0 +1,430 @@ +// Copyright 2014, 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 layers + +import ( + "bytes" + "github.com/google/gopacket" + "net" + "reflect" + "testing" +) + +func TestSerializeIPv6HeaderTLVOptions(t *testing.T) { + //RFC 2460 Appendix B + /* + Example 3 + + A Hop-by-Hop or Destination Options header containing both options X + and Y from Examples 1 and 2 would have one of the two following + formats, depending on which option appeared first: + + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Next Header | Hdr Ext Len=3 | Option Type=X |Opt Data Len=12| + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | 4-octet field | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | | + + 8-octet field + + | | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | PadN Option=1 |Opt Data Len=1 | 0 | Option Type=Y | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |Opt Data Len=7 | 1-octet field | 2-octet field | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | 4-octet field | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | PadN Option=1 |Opt Data Len=2 | 0 | 0 | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + opt1 := &ipv6HeaderTLVOption{} + opt1.OptionType = 0x1e + opt1.OptionData = []byte{0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb} + opt1.OptionAlignment = [2]uint8{8, 2} + + opt2 := &ipv6HeaderTLVOption{} + opt2.OptionType = 0x3e + opt2.OptionData = []byte{0x11, 0x22, 0x22, 0x44, 0x44, 0x44, 0x44} + opt2.OptionAlignment = [2]uint8{4, 3} + + l := serializeIPv6HeaderTLVOptions(nil, []*ipv6HeaderTLVOption{opt1, opt2}, true) + b := make([]byte, l) + serializeIPv6HeaderTLVOptions(b, []*ipv6HeaderTLVOption{opt1, opt2}, true) + got := b + want := []byte{0x1e, 0x0c, 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x01, 0x01, 0x00, 0x3e, 0x07, 0x11, 0x22, 0x22, 0x44, 0x44, 0x44, 0x44, 0x01, 0x02, 0x00, 0x00} + + if !bytes.Equal(got, want) { + t.Errorf("IPv6HeaderTLVOption serialize (X,Y) failed:\ngot:\n%#v\n\nwant:\n%#v\n\n", got, want) + } + + /* + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Next Header | Hdr Ext Len=3 | Pad1 Option=0 | Option Type=Y | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |Opt Data Len=7 | 1-octet field | 2-octet field | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | 4-octet field | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | PadN Option=1 |Opt Data Len=4 | 0 | 0 | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | 0 | 0 | Option Type=X |Opt Data Len=12| + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | 4-octet field | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | | + + 8-octet field + + | | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + + l = serializeIPv6HeaderTLVOptions(nil, []*ipv6HeaderTLVOption{opt2, opt1}, true) + b = make([]byte, l) + serializeIPv6HeaderTLVOptions(b, []*ipv6HeaderTLVOption{opt2, opt1}, true) + got = b + want = []byte{0x00, 0x3e, 0x07, 0x11, 0x22, 0x22, 0x44, 0x44, 0x44, 0x44, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x0c, 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb} + + if !bytes.Equal(got, want) { + t.Errorf("IPv6HeaderTLVOption serialize (Y,X) failed:\ngot:\n%#v\n\nwant:\n%#v\n\n", got, want) + } +} + +var testPacketIPv6HopByHop0 = []byte{ + 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x3b, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, +} + +func TestPacketIPv6HopByHop0Serialize(t *testing.T) { + var serialize []gopacket.SerializableLayer = make([]gopacket.SerializableLayer, 0, 2) + var err error + + ip6 := &IPv6{} + ip6.Version = 6 + ip6.NextHeader = IPProtocolIPv6HopByHop + ip6.HopLimit = 64 + ip6.SrcIP = net.ParseIP("2001:db8::1") + ip6.DstIP = net.ParseIP("2001:db8::2") + serialize = append(serialize, ip6) + + tlv := &IPv6HopByHopOption{} + tlv.OptionType = 0x01 //PadN + tlv.OptionData = []byte{0x00, 0x00, 0x00, 0x00} + hop := &IPv6HopByHop{} + hop.Options = append(hop.Options, tlv) + hop.NextHeader = IPProtocolNoNextHeader + ip6.HopByHop = hop + + buf := gopacket.NewSerializeBuffer() + opts := gopacket.SerializeOptions{FixLengths: true} + err = gopacket.SerializeLayers(buf, opts, serialize...) + if err != nil { + t.Fatal(err) + } + + got := buf.Bytes() + want := testPacketIPv6HopByHop0 + if !bytes.Equal(got, want) { + t.Errorf("IPv6HopByHop serialize failed:\ngot:\n%#v\n\nwant:\n%#v\n\n", got, want) + } +} + +func TestPacketIPv6HopByHop0Decode(t *testing.T) { + ip6 := &IPv6{ + BaseLayer: BaseLayer{ + Contents: []byte{ + 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + }, + Payload: []byte{0x3b, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00}, + }, + Version: 6, + TrafficClass: 0, + FlowLabel: 0, + Length: 8, + NextHeader: IPProtocolIPv6HopByHop, + HopLimit: 64, + SrcIP: net.IP{0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, + DstIP: net.IP{0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}, + } + + hop := &ip6.hbh + hop.ipv6ExtensionBase = ipv6ExtensionBase{ + BaseLayer: BaseLayer{ + Contents: []byte{0x3b, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00}, + Payload: []byte{}, + }, + NextHeader: IPProtocolNoNextHeader, + HeaderLength: uint8(0), + ActualLength: 8, + } + opt := &IPv6HopByHopOption{ + OptionType: uint8(0x01), + OptionLength: uint8(0x04), + ActualLength: 6, + OptionData: []byte{0x00, 0x00, 0x00, 0x00}, + } + hop.Options = append(hop.Options, opt) + ip6.HopByHop = hop + + p := gopacket.NewPacket(testPacketIPv6HopByHop0, LinkTypeRaw, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeIPv6, LayerTypeIPv6HopByHop}, t) + if got, ok := p.Layer(LayerTypeIPv6).(*IPv6); ok { + want := ip6 + want.HopByHop = got.HopByHop // avoid comparing pointers + if !reflect.DeepEqual(got, want) { + t.Errorf("IPv6 packet processing failed:\ngot:\n%#v\n\nwant:\n%#v\n\n", got, want) + } + } else { + t.Error("No IPv6 layer type found in packet") + } + if got, ok := p.Layer(LayerTypeIPv6HopByHop).(*IPv6HopByHop); ok { + want := hop + if !reflect.DeepEqual(got, want) { + t.Errorf("IPv6HopByHop packet processing failed:\ngot\n%#v\n\nwant:\n%#v\n\n", got, want) + } + } else { + t.Error("No IPv6HopByHop layer type found in packet") + } +} + +// testPacketIPv6Destination0 is the packet: +// 12:40:14.429409595 IP6 2001:db8::1 > 2001:db8::2: DSTOPT no next header +// 0x0000: 6000 0000 0008 3c40 2001 0db8 0000 0000 `.....<@........ +// 0x0010: 0000 0000 0000 0001 2001 0db8 0000 0000 ................ +// 0x0020: 0000 0000 0000 0002 3b00 0104 0000 0000 ........;....... +var testPacketIPv6Destination0 = []byte{ + 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x3c, 0x40, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x3b, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, +} + +func TestPacketIPv6Destination0Serialize(t *testing.T) { + var serialize []gopacket.SerializableLayer = make([]gopacket.SerializableLayer, 0, 2) + var err error + + ip6 := &IPv6{} + ip6.Version = 6 + ip6.NextHeader = IPProtocolIPv6Destination + ip6.HopLimit = 64 + ip6.SrcIP = net.ParseIP("2001:db8::1") + ip6.DstIP = net.ParseIP("2001:db8::2") + serialize = append(serialize, ip6) + + tlv := &IPv6DestinationOption{} + tlv.OptionType = 0x01 //PadN + tlv.OptionData = []byte{0x00, 0x00, 0x00, 0x00} + dst := &IPv6Destination{} + dst.Options = append(dst.Options, tlv) + dst.NextHeader = IPProtocolNoNextHeader + serialize = append(serialize, dst) + + buf := gopacket.NewSerializeBuffer() + opts := gopacket.SerializeOptions{FixLengths: true} + err = gopacket.SerializeLayers(buf, opts, serialize...) + if err != nil { + t.Fatal(err) + } + + got := buf.Bytes() + want := testPacketIPv6Destination0 + if !bytes.Equal(got, want) { + t.Errorf("IPv6Destination serialize failed:\ngot:\n%#v\n\nwant:\n%#v\n\n", got, want) + } +} + +func TestPacketIPv6Destination0Decode(t *testing.T) { + ip6 := &IPv6{ + BaseLayer: BaseLayer{ + Contents: []byte{ + 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x3c, 0x40, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + }, + Payload: []byte{0x3b, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00}, + }, + Version: 6, + TrafficClass: 0, + FlowLabel: 0, + Length: 8, + NextHeader: IPProtocolIPv6Destination, + HopLimit: 64, + SrcIP: net.IP{0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, + DstIP: net.IP{0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}, + } + + dst := &IPv6Destination{} + dst.BaseLayer = BaseLayer{ + Contents: []byte{0x3b, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00}, + Payload: []byte{}, + } + dst.NextHeader = IPProtocolNoNextHeader + dst.HeaderLength = uint8(0) + dst.ActualLength = 8 + opt := &IPv6DestinationOption{ + OptionType: uint8(0x01), + OptionLength: uint8(0x04), + ActualLength: 6, + OptionData: []byte{0x00, 0x00, 0x00, 0x00}, + } + dst.Options = append(dst.Options, opt) + + p := gopacket.NewPacket(testPacketIPv6Destination0, LinkTypeRaw, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeIPv6, LayerTypeIPv6Destination}, t) + if got, ok := p.Layer(LayerTypeIPv6).(*IPv6); ok { + want := ip6 + if !reflect.DeepEqual(got, want) { + t.Errorf("IPv6 packet processing failed:\ngot:\n%#v\n\nwant:\n%#v\n\n", got, want) + } + } else { + t.Error("No IPv6 layer type found in packet") + } + if got, ok := p.Layer(LayerTypeIPv6Destination).(*IPv6Destination); ok { + want := dst + if !reflect.DeepEqual(got, want) { + t.Errorf("IPv6Destination packet processing failed:\ngot:\n%#v\n\nwant:\n%#v\n\n", got, want) + } + } else { + t.Error("No IPv6Destination layer type found in packet") + } +} + +var testPacketIPv6JumbogramHeader = []byte{ + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x3b, 0x00, 0xc2, 0x04, 0x00, 0x01, 0x00, 0x08, +} + +func TestIPv6JumbogramSerialize(t *testing.T) { + var serialize []gopacket.SerializableLayer = make([]gopacket.SerializableLayer, 0, 2) + var err error + + ip6 := &IPv6{} + ip6.Version = 6 + ip6.NextHeader = IPProtocolNoNextHeader + ip6.HopLimit = 64 + ip6.SrcIP = net.ParseIP("2001:db8::1") + ip6.DstIP = net.ParseIP("2001:db8::2") + serialize = append(serialize, ip6) + + payload := make([]byte, ipv6MaxPayloadLength+1) + for i := range payload { + payload[i] = 0xfe + } + serialize = append(serialize, gopacket.Payload(payload)) + + buf := gopacket.NewSerializeBuffer() + opts := gopacket.SerializeOptions{FixLengths: true} + err = gopacket.SerializeLayers(buf, opts, serialize...) + if err != nil { + t.Fatal(err) + } + + got := buf.Bytes() + w := new(bytes.Buffer) + w.Write(testPacketIPv6JumbogramHeader) + w.Write(payload) + want := w.Bytes() + + if !bytes.Equal(got, want) { + t.Errorf("IPv6 Jumbogram serialize failed:\ngot:\n%v\n\nwant:\n%v\n\n", + gopacket.LongBytesGoString(got), gopacket.LongBytesGoString(want)) + } +} + +func TestIPv6JumbogramDecode(t *testing.T) { + payload := make([]byte, ipv6MaxPayloadLength+1) + for i := range payload { + payload[i] = 0xfe + } + + ip6 := &IPv6{ + BaseLayer: BaseLayer{ + Contents: []byte{ + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + }, + }, + Version: 6, + TrafficClass: 0, + FlowLabel: 0, + Length: 0, + NextHeader: IPProtocolIPv6HopByHop, + HopLimit: 64, + SrcIP: net.IP{0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, + DstIP: net.IP{0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}, + } + buf := new(bytes.Buffer) + buf.Write([]byte{0x3b, 0x00, 0xc2, 0x04, 0x00, 0x01, 0x00, 0x08}) + buf.Write(payload) + ip6.Payload = buf.Bytes() + + hop := &ip6.hbh + hop.Contents = []byte{0x3b, 0x00, 0xc2, 0x04, 0x00, 0x01, 0x00, 0x08} + hop.Payload = payload + hop.NextHeader = IPProtocolNoNextHeader + hop.HeaderLength = uint8(0) + hop.ActualLength = 8 + opt := &IPv6HopByHopOption{} + opt.OptionType = uint8(0xc2) + opt.OptionLength = uint8(0x04) + opt.ActualLength = 6 + opt.OptionData = []byte{0x00, 0x01, 0x00, 0x08} + hop.Options = append(hop.Options, opt) + ip6.HopByHop = hop + + pkt := new(bytes.Buffer) + pkt.Write(testPacketIPv6JumbogramHeader) + pkt.Write(payload) + + p := gopacket.NewPacket(pkt.Bytes(), LinkTypeRaw, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeIPv6, LayerTypeIPv6HopByHop, gopacket.LayerTypePayload}, t) + + if got, ok := p.Layer(LayerTypeIPv6).(*IPv6); ok { + want := ip6 + want.HopByHop = got.HopByHop // Hack, avoid comparing pointers + if !reflect.DeepEqual(got, want) { + t.Errorf("IPv6 packet processing failed:\ngot:\n%v\n\nwant:\n%v\n\n", + gopacket.LayerGoString(got), gopacket.LayerGoString(want)) + } + } else { + t.Error("No IPv6 layer type found in packet") + } + + if got, ok := p.Layer(LayerTypeIPv6HopByHop).(*IPv6HopByHop); ok { + want := hop + if !reflect.DeepEqual(got, want) { + t.Errorf("IPv6HopByHop packet processing failed:\ngot:\n%v\n\nwant:\n%v\n\n", + gopacket.LayerGoString(got), gopacket.LayerGoString(want)) + } + } else { + t.Error("No IPv6HopByHop layer type found in packet") + } + + if got, ok := p.Layer(gopacket.LayerTypePayload).(*gopacket.Payload); ok { + want := (*gopacket.Payload)(&payload) + if !reflect.DeepEqual(got, want) { + t.Errorf("Payload packet processing failed:\ngot:\n%v\n\nwant:\n%v\n\n", + gopacket.LayerGoString(got), gopacket.LayerGoString(want)) + } + } else { + t.Error("No Payload layer type found in packet") + } +} diff --git a/vendor/github.com/google/gopacket/layers/ipsec.go b/vendor/github.com/google/gopacket/layers/ipsec.go new file mode 100644 index 0000000..19163fa --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/ipsec.go @@ -0,0 +1,68 @@ +// 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 layers + +import ( + "encoding/binary" + "github.com/google/gopacket" +) + +// IPSecAH is the authentication header for IPv4/6 defined in +// http://tools.ietf.org/html/rfc2402 +type IPSecAH struct { + // While the auth header can be used for both IPv4 and v6, its format is that of + // an IPv6 extension (NextHeader, PayloadLength, etc...), so we use ipv6ExtensionBase + // to build it. + ipv6ExtensionBase + Reserved uint16 + SPI, Seq uint32 + AuthenticationData []byte +} + +// LayerType returns LayerTypeIPSecAH. +func (i *IPSecAH) LayerType() gopacket.LayerType { return LayerTypeIPSecAH } + +func decodeIPSecAH(data []byte, p gopacket.PacketBuilder) error { + i := &IPSecAH{ + ipv6ExtensionBase: ipv6ExtensionBase{ + NextHeader: IPProtocol(data[0]), + HeaderLength: data[1], + }, + Reserved: binary.BigEndian.Uint16(data[2:4]), + SPI: binary.BigEndian.Uint32(data[4:8]), + Seq: binary.BigEndian.Uint32(data[8:12]), + } + i.ActualLength = (int(i.HeaderLength) + 2) * 4 + i.AuthenticationData = data[12:i.ActualLength] + i.Contents = data[:i.ActualLength] + i.Payload = data[i.ActualLength:] + p.AddLayer(i) + return p.NextDecoder(i.NextHeader) +} + +// IPSecESP is the encapsulating security payload defined in +// http://tools.ietf.org/html/rfc2406 +type IPSecESP struct { + BaseLayer + SPI, Seq uint32 + // Encrypted contains the encrypted set of bytes sent in an ESP + Encrypted []byte +} + +// LayerType returns LayerTypeIPSecESP. +func (i *IPSecESP) LayerType() gopacket.LayerType { return LayerTypeIPSecESP } + +func decodeIPSecESP(data []byte, p gopacket.PacketBuilder) error { + i := &IPSecESP{ + BaseLayer: BaseLayer{data, nil}, + SPI: binary.BigEndian.Uint32(data[:4]), + Seq: binary.BigEndian.Uint32(data[4:8]), + Encrypted: data[8:], + } + p.AddLayer(i) + return nil +} diff --git a/vendor/github.com/google/gopacket/layers/ipsec_test.go b/vendor/github.com/google/gopacket/layers/ipsec_test.go new file mode 100644 index 0000000..466646d --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/ipsec_test.go @@ -0,0 +1,154 @@ +// 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 layers + +import ( + "github.com/google/gopacket" + "reflect" + "testing" +) + +// testPacketIPSecAHTransport is the packet: +// 20:45:10.325850 IP 192.168.1.1 > 192.168.1.2: AH(spi=0x00000101,seq=0x1): ICMP echo request, id 1560, seq 1, length 64 +// 0x0000: 7ec0 ffc6 48f1 1a0e 3c4e 3b3a 0800 4500 ~...H...<N;:..E. +// 0x0010: 006c 650a 4000 4033 5201 c0a8 0101 c0a8 .le.@.@3R....... +// 0x0020: 0102 0104 0000 0000 0101 0000 0001 2533 ..............%3 +// 0x0030: 01b1 a20b b6f1 bdbf 9d9e 0800 fbe5 0618 ................ +// 0x0040: 0001 c6e1 a354 0000 0000 c8f7 0400 0000 .....T.......... +// 0x0050: 0000 1011 1213 1415 1617 1819 1a1b 1c1d ................ +// 0x0060: 1e1f 2021 2223 2425 2627 2829 2a2b 2c2d ...!"#$%&'()*+,- +// 0x0070: 2e2f 3031 3233 3435 3637 ./01234567 +var testPacketIPSecAHTransport = []byte{ + 0x7e, 0xc0, 0xff, 0xc6, 0x48, 0xf1, 0x1a, 0x0e, 0x3c, 0x4e, 0x3b, 0x3a, 0x08, 0x00, 0x45, 0x00, + 0x00, 0x6c, 0x65, 0x0a, 0x40, 0x00, 0x40, 0x33, 0x52, 0x01, 0xc0, 0xa8, 0x01, 0x01, 0xc0, 0xa8, + 0x01, 0x02, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x25, 0x33, + 0x01, 0xb1, 0xa2, 0x0b, 0xb6, 0xf1, 0xbd, 0xbf, 0x9d, 0x9e, 0x08, 0x00, 0xfb, 0xe5, 0x06, 0x18, + 0x00, 0x01, 0xc6, 0xe1, 0xa3, 0x54, 0x00, 0x00, 0x00, 0x00, 0xc8, 0xf7, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, +} + +func TestPacketIPSecAHTransport(t *testing.T) { + p := gopacket.NewPacket(testPacketIPSecAHTransport, LinkTypeEthernet, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeEthernet, LayerTypeIPv4, LayerTypeIPSecAH, LayerTypeICMPv4, gopacket.LayerTypePayload}, t) + if got, ok := p.Layer(LayerTypeIPSecAH).(*IPSecAH); ok { + want := &IPSecAH{ + Reserved: 0x0, + SPI: 0x101, + Seq: 1, + AuthenticationData: []byte{0x25, 0x33, 0x01, 0xb1, 0xa2, 0x0b, 0xb6, 0xf1, 0xbd, 0xbf, 0x9d, 0x9e}, + } + want.BaseLayer = BaseLayer{testPacketIPSecAHTransport[34:58], testPacketIPSecAHTransport[58:]} + want.NextHeader = IPProtocolICMPv4 + want.HeaderLength = 0x4 + want.ActualLength = 0x18 + if !reflect.DeepEqual(want, got) { + t.Errorf("IPSecAH layer mismatch, \nwant %#v\ngot %#v\n", want, got) + } + } +} + +func BenchmarkDecodePacketIPSecAHTransport(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testPacketIPSecAHTransport, LinkTypeEthernet, gopacket.NoCopy) + } +} + +// testPacketIPSecAHTunnel is the packet: +// 14:45:43.252917 IP 192.168.1.1 > 192.168.1.2: AH(spi=0x00000101,seq=0x1): IP 172.16.1.1 > 172.16.2.1: ICMP echo request, id 31322, seq 1, length 64 (ipip-proto-4) +// 0x0000: 7220 4d91 63c9 566c ed2d 73cd 0800 4500 r.M.c.Vl.-s...E. +// 0x0010: 0080 0000 4000 4033 b6f7 c0a8 0101 c0a8 ....@.@3........ +// 0x0020: 0102 0404 0000 0000 0101 0000 0001 cca4 ................ +// 0x0030: 01da 9eb4 fb75 10fe 5a59 4500 0054 a96f .....u..ZYE..T.o +// 0x0040: 4000 4001 3617 ac10 0101 ac10 0201 0800 @.@.6........... +// 0x0050: d75f 7a5a 0001 0741 3355 0000 0000 a9db ._zZ...A3U...... +// 0x0060: 0300 0000 0000 1011 1213 1415 1617 1819 ................ +// 0x0070: 1a1b 1c1d 1e1f 2021 2223 2425 2627 2829 .......!"#$%&'() +// 0x0080: 2a2b 2c2d 2e2f 3031 3233 3435 3637 *+,-./01234567 +var testPacketIPSecAHTunnel = []byte{ + 0x72, 0x20, 0x4d, 0x91, 0x63, 0xc9, 0x56, 0x6c, 0xed, 0x2d, 0x73, 0xcd, 0x08, 0x00, 0x45, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x40, 0x33, 0xb6, 0xf7, 0xc0, 0xa8, 0x01, 0x01, 0xc0, 0xa8, + 0x01, 0x02, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0xcc, 0xa4, + 0x01, 0xda, 0x9e, 0xb4, 0xfb, 0x75, 0x10, 0xfe, 0x5a, 0x59, 0x45, 0x00, 0x00, 0x54, 0xa9, 0x6f, + 0x40, 0x00, 0x40, 0x01, 0x36, 0x17, 0xac, 0x10, 0x01, 0x01, 0xac, 0x10, 0x02, 0x01, 0x08, 0x00, + 0xd7, 0x5f, 0x7a, 0x5a, 0x00, 0x01, 0x07, 0x41, 0x33, 0x55, 0x00, 0x00, 0x00, 0x00, 0xa9, 0xdb, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, + 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, + 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, +} + +func TestPacketIPSecAHTunnel(t *testing.T) { + p := gopacket.NewPacket(testPacketIPSecAHTunnel, LinkTypeEthernet, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeEthernet, LayerTypeIPv4, LayerTypeIPSecAH, LayerTypeIPv4, LayerTypeICMPv4, gopacket.LayerTypePayload}, t) + if got, ok := p.Layer(LayerTypeIPSecAH).(*IPSecAH); ok { + want := &IPSecAH{ + Reserved: 0x0, + SPI: 0x101, + Seq: 1, + AuthenticationData: []byte{0xcc, 0xa4, 0x01, 0xda, 0x9e, 0xb4, 0xfb, 0x75, 0x10, 0xfe, 0x5a, 0x59}, + } + want.BaseLayer = BaseLayer{testPacketIPSecAHTunnel[34:58], testPacketIPSecAHTunnel[58:]} + want.NextHeader = IPProtocolIPv4 + want.HeaderLength = 0x4 + want.ActualLength = 0x18 + if !reflect.DeepEqual(want, got) { + t.Errorf("IPSecAH layer mismatch, \nwant %#v\ngot %#v\n", want, got) + } + } +} + +func BenchmarkDecodePacketIPSecAHTunnel(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testPacketIPSecAHTunnel, LinkTypeEthernet, gopacket.NoCopy) + } +} + +// testPacketIPSecESP is the packet: +// 04:30:37.629376 IP 190.0.0.1 > 190.0.0.2: ESP(spi=0x0000006e,seq=0x13), length 116 +// 0x0000: 0000 0000 0012 0011 434a d70a 0800 4500 ........CJ....E. +// 0x0010: 0088 0000 4000 4032 be40 be00 0001 be00 ....@.@2.@...... +// 0x0020: 0002 0000 006e 0000 0013 82f4 1077 0418 .....n.......w.. +// 0x0030: e8ce dc45 1bac 22bb daaf 2ad2 c2e8 315b ...E.."...*...1[ +// 0x0040: ce9a 39da 2aae cf43 3716 70ab 7e7c 4676 ..9.*..C7.p.~|Fv +// 0x0050: c3fc d109 c990 274d f81c 6534 9a40 a0ef ......'M..e4.@.. +// 0x0060: 46b1 7da5 05af dda8 d0ba 6e23 d1ee 1f10 F.}.......n#.... +// 0x0070: 730c 7371 03b1 445c 2f70 852f 8475 12fb s.sq..D\/p./.u.. +// 0x0080: b057 a19b a617 bae7 09ca 8836 942f 3334 .W.........6./34 +// 0x0090: 312b 96d2 a4e3 1+.... +var testPacketIPSecESP = []byte{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x11, 0x43, 0x4a, 0xd7, 0x0a, 0x08, 0x00, 0x45, 0x00, + 0x00, 0x88, 0x00, 0x00, 0x40, 0x00, 0x40, 0x32, 0xbe, 0x40, 0xbe, 0x00, 0x00, 0x01, 0xbe, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x13, 0x82, 0xf4, 0x10, 0x77, 0x04, 0x18, + 0xe8, 0xce, 0xdc, 0x45, 0x1b, 0xac, 0x22, 0xbb, 0xda, 0xaf, 0x2a, 0xd2, 0xc2, 0xe8, 0x31, 0x5b, + 0xce, 0x9a, 0x39, 0xda, 0x2a, 0xae, 0xcf, 0x43, 0x37, 0x16, 0x70, 0xab, 0x7e, 0x7c, 0x46, 0x76, + 0xc3, 0xfc, 0xd1, 0x09, 0xc9, 0x90, 0x27, 0x4d, 0xf8, 0x1c, 0x65, 0x34, 0x9a, 0x40, 0xa0, 0xef, + 0x46, 0xb1, 0x7d, 0xa5, 0x05, 0xaf, 0xdd, 0xa8, 0xd0, 0xba, 0x6e, 0x23, 0xd1, 0xee, 0x1f, 0x10, + 0x73, 0x0c, 0x73, 0x71, 0x03, 0xb1, 0x44, 0x5c, 0x2f, 0x70, 0x85, 0x2f, 0x84, 0x75, 0x12, 0xfb, + 0xb0, 0x57, 0xa1, 0x9b, 0xa6, 0x17, 0xba, 0xe7, 0x09, 0xca, 0x88, 0x36, 0x94, 0x2f, 0x33, 0x34, + 0x31, 0x2b, 0x96, 0xd2, 0xa4, 0xe3, +} + +func TestPacketIPSecESP(t *testing.T) { + p := gopacket.NewPacket(testPacketIPSecESP, LinkTypeEthernet, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeEthernet, LayerTypeIPv4, LayerTypeIPSecESP}, t) +} + +func BenchmarkDecodePacketIPSecESP(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testPacketIPSecESP, LinkTypeEthernet, gopacket.NoCopy) + } +} diff --git a/vendor/github.com/google/gopacket/layers/layertypes.go b/vendor/github.com/google/gopacket/layers/layertypes.go new file mode 100644 index 0000000..faffb91 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/layertypes.go @@ -0,0 +1,177 @@ +// 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 layers + +import ( + "github.com/google/gopacket" +) + +var ( + LayerTypeARP = gopacket.RegisterLayerType(10, gopacket.LayerTypeMetadata{Name: "ARP", Decoder: gopacket.DecodeFunc(decodeARP)}) + LayerTypeCiscoDiscovery = gopacket.RegisterLayerType(11, gopacket.LayerTypeMetadata{Name: "CiscoDiscovery", Decoder: gopacket.DecodeFunc(decodeCiscoDiscovery)}) + LayerTypeEthernetCTP = gopacket.RegisterLayerType(12, gopacket.LayerTypeMetadata{Name: "EthernetCTP", Decoder: gopacket.DecodeFunc(decodeEthernetCTP)}) + LayerTypeEthernetCTPForwardData = gopacket.RegisterLayerType(13, gopacket.LayerTypeMetadata{Name: "EthernetCTPForwardData", Decoder: nil}) + LayerTypeEthernetCTPReply = gopacket.RegisterLayerType(14, gopacket.LayerTypeMetadata{Name: "EthernetCTPReply", Decoder: nil}) + LayerTypeDot1Q = gopacket.RegisterLayerType(15, gopacket.LayerTypeMetadata{Name: "Dot1Q", Decoder: gopacket.DecodeFunc(decodeDot1Q)}) + LayerTypeEtherIP = gopacket.RegisterLayerType(16, gopacket.LayerTypeMetadata{Name: "EtherIP", Decoder: gopacket.DecodeFunc(decodeEtherIP)}) + LayerTypeEthernet = gopacket.RegisterLayerType(17, gopacket.LayerTypeMetadata{Name: "Ethernet", Decoder: gopacket.DecodeFunc(decodeEthernet)}) + LayerTypeGRE = gopacket.RegisterLayerType(18, gopacket.LayerTypeMetadata{Name: "GRE", Decoder: gopacket.DecodeFunc(decodeGRE)}) + LayerTypeICMPv4 = gopacket.RegisterLayerType(19, gopacket.LayerTypeMetadata{Name: "ICMPv4", Decoder: gopacket.DecodeFunc(decodeICMPv4)}) + LayerTypeIPv4 = gopacket.RegisterLayerType(20, gopacket.LayerTypeMetadata{Name: "IPv4", Decoder: gopacket.DecodeFunc(decodeIPv4)}) + LayerTypeIPv6 = gopacket.RegisterLayerType(21, gopacket.LayerTypeMetadata{Name: "IPv6", Decoder: gopacket.DecodeFunc(decodeIPv6)}) + LayerTypeLLC = gopacket.RegisterLayerType(22, gopacket.LayerTypeMetadata{Name: "LLC", Decoder: gopacket.DecodeFunc(decodeLLC)}) + LayerTypeSNAP = gopacket.RegisterLayerType(23, gopacket.LayerTypeMetadata{Name: "SNAP", Decoder: gopacket.DecodeFunc(decodeSNAP)}) + LayerTypeMPLS = gopacket.RegisterLayerType(24, gopacket.LayerTypeMetadata{Name: "MPLS", Decoder: gopacket.DecodeFunc(decodeMPLS)}) + LayerTypePPP = gopacket.RegisterLayerType(25, gopacket.LayerTypeMetadata{Name: "PPP", Decoder: gopacket.DecodeFunc(decodePPP)}) + LayerTypePPPoE = gopacket.RegisterLayerType(26, gopacket.LayerTypeMetadata{Name: "PPPoE", Decoder: gopacket.DecodeFunc(decodePPPoE)}) + LayerTypeRUDP = gopacket.RegisterLayerType(27, gopacket.LayerTypeMetadata{Name: "RUDP", Decoder: gopacket.DecodeFunc(decodeRUDP)}) + LayerTypeSCTP = gopacket.RegisterLayerType(28, gopacket.LayerTypeMetadata{Name: "SCTP", Decoder: gopacket.DecodeFunc(decodeSCTP)}) + LayerTypeSCTPUnknownChunkType = gopacket.RegisterLayerType(29, gopacket.LayerTypeMetadata{Name: "SCTPUnknownChunkType", Decoder: nil}) + LayerTypeSCTPData = gopacket.RegisterLayerType(30, gopacket.LayerTypeMetadata{Name: "SCTPData", Decoder: nil}) + LayerTypeSCTPInit = gopacket.RegisterLayerType(31, gopacket.LayerTypeMetadata{Name: "SCTPInit", Decoder: nil}) + LayerTypeSCTPSack = gopacket.RegisterLayerType(32, gopacket.LayerTypeMetadata{Name: "SCTPSack", Decoder: nil}) + LayerTypeSCTPHeartbeat = gopacket.RegisterLayerType(33, gopacket.LayerTypeMetadata{Name: "SCTPHeartbeat", Decoder: nil}) + LayerTypeSCTPError = gopacket.RegisterLayerType(34, gopacket.LayerTypeMetadata{Name: "SCTPError", Decoder: nil}) + LayerTypeSCTPShutdown = gopacket.RegisterLayerType(35, gopacket.LayerTypeMetadata{Name: "SCTPShutdown", Decoder: nil}) + LayerTypeSCTPShutdownAck = gopacket.RegisterLayerType(36, gopacket.LayerTypeMetadata{Name: "SCTPShutdownAck", Decoder: nil}) + LayerTypeSCTPCookieEcho = gopacket.RegisterLayerType(37, gopacket.LayerTypeMetadata{Name: "SCTPCookieEcho", Decoder: nil}) + LayerTypeSCTPEmptyLayer = gopacket.RegisterLayerType(38, gopacket.LayerTypeMetadata{Name: "SCTPEmptyLayer", Decoder: nil}) + LayerTypeSCTPInitAck = gopacket.RegisterLayerType(39, gopacket.LayerTypeMetadata{Name: "SCTPInitAck", Decoder: nil}) + LayerTypeSCTPHeartbeatAck = gopacket.RegisterLayerType(40, gopacket.LayerTypeMetadata{Name: "SCTPHeartbeatAck", Decoder: nil}) + LayerTypeSCTPAbort = gopacket.RegisterLayerType(41, gopacket.LayerTypeMetadata{Name: "SCTPAbort", Decoder: nil}) + LayerTypeSCTPShutdownComplete = gopacket.RegisterLayerType(42, gopacket.LayerTypeMetadata{Name: "SCTPShutdownComplete", Decoder: nil}) + LayerTypeSCTPCookieAck = gopacket.RegisterLayerType(43, gopacket.LayerTypeMetadata{Name: "SCTPCookieAck", Decoder: nil}) + LayerTypeTCP = gopacket.RegisterLayerType(44, gopacket.LayerTypeMetadata{Name: "TCP", Decoder: gopacket.DecodeFunc(decodeTCP)}) + LayerTypeUDP = gopacket.RegisterLayerType(45, gopacket.LayerTypeMetadata{Name: "UDP", Decoder: gopacket.DecodeFunc(decodeUDP)}) + LayerTypeIPv6HopByHop = gopacket.RegisterLayerType(46, gopacket.LayerTypeMetadata{Name: "IPv6HopByHop", Decoder: gopacket.DecodeFunc(decodeIPv6HopByHop)}) + LayerTypeIPv6Routing = gopacket.RegisterLayerType(47, gopacket.LayerTypeMetadata{Name: "IPv6Routing", Decoder: gopacket.DecodeFunc(decodeIPv6Routing)}) + LayerTypeIPv6Fragment = gopacket.RegisterLayerType(48, gopacket.LayerTypeMetadata{Name: "IPv6Fragment", Decoder: gopacket.DecodeFunc(decodeIPv6Fragment)}) + LayerTypeIPv6Destination = gopacket.RegisterLayerType(49, gopacket.LayerTypeMetadata{Name: "IPv6Destination", Decoder: gopacket.DecodeFunc(decodeIPv6Destination)}) + LayerTypeIPSecAH = gopacket.RegisterLayerType(50, gopacket.LayerTypeMetadata{Name: "IPSecAH", Decoder: gopacket.DecodeFunc(decodeIPSecAH)}) + LayerTypeIPSecESP = gopacket.RegisterLayerType(51, gopacket.LayerTypeMetadata{Name: "IPSecESP", Decoder: gopacket.DecodeFunc(decodeIPSecESP)}) + LayerTypeUDPLite = gopacket.RegisterLayerType(52, gopacket.LayerTypeMetadata{Name: "UDPLite", Decoder: gopacket.DecodeFunc(decodeUDPLite)}) + LayerTypeFDDI = gopacket.RegisterLayerType(53, gopacket.LayerTypeMetadata{Name: "FDDI", Decoder: gopacket.DecodeFunc(decodeFDDI)}) + LayerTypeLoopback = gopacket.RegisterLayerType(54, gopacket.LayerTypeMetadata{Name: "Loopback", Decoder: gopacket.DecodeFunc(decodeLoopback)}) + LayerTypeEAP = gopacket.RegisterLayerType(55, gopacket.LayerTypeMetadata{Name: "EAP", Decoder: gopacket.DecodeFunc(decodeEAP)}) + LayerTypeEAPOL = gopacket.RegisterLayerType(56, gopacket.LayerTypeMetadata{Name: "EAPOL", Decoder: gopacket.DecodeFunc(decodeEAPOL)}) + LayerTypeICMPv6 = gopacket.RegisterLayerType(57, gopacket.LayerTypeMetadata{Name: "ICMPv6", Decoder: gopacket.DecodeFunc(decodeICMPv6)}) + LayerTypeLinkLayerDiscovery = gopacket.RegisterLayerType(58, gopacket.LayerTypeMetadata{Name: "LinkLayerDiscovery", Decoder: gopacket.DecodeFunc(decodeLinkLayerDiscovery)}) + LayerTypeCiscoDiscoveryInfo = gopacket.RegisterLayerType(59, gopacket.LayerTypeMetadata{Name: "CiscoDiscoveryInfo", Decoder: gopacket.DecodeFunc(decodeCiscoDiscoveryInfo)}) + LayerTypeLinkLayerDiscoveryInfo = gopacket.RegisterLayerType(60, gopacket.LayerTypeMetadata{Name: "LinkLayerDiscoveryInfo", Decoder: nil}) + LayerTypeNortelDiscovery = gopacket.RegisterLayerType(61, gopacket.LayerTypeMetadata{Name: "NortelDiscovery", Decoder: gopacket.DecodeFunc(decodeNortelDiscovery)}) + LayerTypeIGMP = gopacket.RegisterLayerType(62, gopacket.LayerTypeMetadata{Name: "IGMP", Decoder: gopacket.DecodeFunc(decodeIGMP)}) + LayerTypePFLog = gopacket.RegisterLayerType(63, gopacket.LayerTypeMetadata{Name: "PFLog", Decoder: gopacket.DecodeFunc(decodePFLog)}) + LayerTypeRadioTap = gopacket.RegisterLayerType(64, gopacket.LayerTypeMetadata{Name: "RadioTap", Decoder: gopacket.DecodeFunc(decodeRadioTap)}) + LayerTypeDot11 = gopacket.RegisterLayerType(65, gopacket.LayerTypeMetadata{Name: "Dot11", Decoder: gopacket.DecodeFunc(decodeDot11)}) + LayerTypeDot11Ctrl = gopacket.RegisterLayerType(66, gopacket.LayerTypeMetadata{Name: "Dot11Ctrl", Decoder: gopacket.DecodeFunc(decodeDot11Ctrl)}) + LayerTypeDot11Data = gopacket.RegisterLayerType(67, gopacket.LayerTypeMetadata{Name: "Dot11Data", Decoder: gopacket.DecodeFunc(decodeDot11Data)}) + LayerTypeDot11DataCFAck = gopacket.RegisterLayerType(68, gopacket.LayerTypeMetadata{Name: "Dot11DataCFAck", Decoder: gopacket.DecodeFunc(decodeDot11DataCFAck)}) + LayerTypeDot11DataCFPoll = gopacket.RegisterLayerType(69, gopacket.LayerTypeMetadata{Name: "Dot11DataCFPoll", Decoder: gopacket.DecodeFunc(decodeDot11DataCFPoll)}) + LayerTypeDot11DataCFAckPoll = gopacket.RegisterLayerType(70, gopacket.LayerTypeMetadata{Name: "Dot11DataCFAckPoll", Decoder: gopacket.DecodeFunc(decodeDot11DataCFAckPoll)}) + LayerTypeDot11DataNull = gopacket.RegisterLayerType(71, gopacket.LayerTypeMetadata{Name: "Dot11DataNull", Decoder: gopacket.DecodeFunc(decodeDot11DataNull)}) + LayerTypeDot11DataCFAckNoData = gopacket.RegisterLayerType(72, gopacket.LayerTypeMetadata{Name: "Dot11DataCFAck", Decoder: gopacket.DecodeFunc(decodeDot11DataCFAck)}) + LayerTypeDot11DataCFPollNoData = gopacket.RegisterLayerType(73, gopacket.LayerTypeMetadata{Name: "Dot11DataCFPoll", Decoder: gopacket.DecodeFunc(decodeDot11DataCFPoll)}) + LayerTypeDot11DataCFAckPollNoData = gopacket.RegisterLayerType(74, gopacket.LayerTypeMetadata{Name: "Dot11DataCFAckPoll", Decoder: gopacket.DecodeFunc(decodeDot11DataCFAckPoll)}) + LayerTypeDot11DataQOSData = gopacket.RegisterLayerType(75, gopacket.LayerTypeMetadata{Name: "Dot11DataQOSData", Decoder: gopacket.DecodeFunc(decodeDot11DataQOSData)}) + LayerTypeDot11DataQOSDataCFAck = gopacket.RegisterLayerType(76, gopacket.LayerTypeMetadata{Name: "Dot11DataQOSDataCFAck", Decoder: gopacket.DecodeFunc(decodeDot11DataQOSDataCFAck)}) + LayerTypeDot11DataQOSDataCFPoll = gopacket.RegisterLayerType(77, gopacket.LayerTypeMetadata{Name: "Dot11DataQOSDataCFPoll", Decoder: gopacket.DecodeFunc(decodeDot11DataQOSDataCFPoll)}) + LayerTypeDot11DataQOSDataCFAckPoll = gopacket.RegisterLayerType(78, gopacket.LayerTypeMetadata{Name: "Dot11DataQOSDataCFAckPoll", Decoder: gopacket.DecodeFunc(decodeDot11DataQOSDataCFAckPoll)}) + LayerTypeDot11DataQOSNull = gopacket.RegisterLayerType(79, gopacket.LayerTypeMetadata{Name: "Dot11DataQOSNull", Decoder: gopacket.DecodeFunc(decodeDot11DataQOSNull)}) + LayerTypeDot11DataQOSCFPollNoData = gopacket.RegisterLayerType(80, gopacket.LayerTypeMetadata{Name: "Dot11DataQOSCFPoll", Decoder: gopacket.DecodeFunc(decodeDot11DataQOSCFPollNoData)}) + LayerTypeDot11DataQOSCFAckPollNoData = gopacket.RegisterLayerType(81, gopacket.LayerTypeMetadata{Name: "Dot11DataQOSCFAckPoll", Decoder: gopacket.DecodeFunc(decodeDot11DataQOSCFAckPollNoData)}) + LayerTypeDot11InformationElement = gopacket.RegisterLayerType(82, gopacket.LayerTypeMetadata{Name: "Dot11InformationElement", Decoder: gopacket.DecodeFunc(decodeDot11InformationElement)}) + LayerTypeDot11CtrlCTS = gopacket.RegisterLayerType(83, gopacket.LayerTypeMetadata{Name: "Dot11CtrlCTS", Decoder: gopacket.DecodeFunc(decodeDot11CtrlCTS)}) + LayerTypeDot11CtrlRTS = gopacket.RegisterLayerType(84, gopacket.LayerTypeMetadata{Name: "Dot11CtrlRTS", Decoder: gopacket.DecodeFunc(decodeDot11CtrlRTS)}) + LayerTypeDot11CtrlBlockAckReq = gopacket.RegisterLayerType(85, gopacket.LayerTypeMetadata{Name: "Dot11CtrlBlockAckReq", Decoder: gopacket.DecodeFunc(decodeDot11CtrlBlockAckReq)}) + LayerTypeDot11CtrlBlockAck = gopacket.RegisterLayerType(86, gopacket.LayerTypeMetadata{Name: "Dot11CtrlBlockAck", Decoder: gopacket.DecodeFunc(decodeDot11CtrlBlockAck)}) + LayerTypeDot11CtrlPowersavePoll = gopacket.RegisterLayerType(87, gopacket.LayerTypeMetadata{Name: "Dot11CtrlPowersavePoll", Decoder: gopacket.DecodeFunc(decodeDot11CtrlPowersavePoll)}) + LayerTypeDot11CtrlAck = gopacket.RegisterLayerType(88, gopacket.LayerTypeMetadata{Name: "Dot11CtrlAck", Decoder: gopacket.DecodeFunc(decodeDot11CtrlAck)}) + LayerTypeDot11CtrlCFEnd = gopacket.RegisterLayerType(89, gopacket.LayerTypeMetadata{Name: "Dot11CtrlCFEnd", Decoder: gopacket.DecodeFunc(decodeDot11CtrlCFEnd)}) + LayerTypeDot11CtrlCFEndAck = gopacket.RegisterLayerType(90, gopacket.LayerTypeMetadata{Name: "Dot11CtrlCFEndAck", Decoder: gopacket.DecodeFunc(decodeDot11CtrlCFEndAck)}) + LayerTypeDot11MgmtAssociationReq = gopacket.RegisterLayerType(91, gopacket.LayerTypeMetadata{Name: "Dot11MgmtAssociationReq", Decoder: gopacket.DecodeFunc(decodeDot11MgmtAssociationReq)}) + LayerTypeDot11MgmtAssociationResp = gopacket.RegisterLayerType(92, gopacket.LayerTypeMetadata{Name: "Dot11MgmtAssociationResp", Decoder: gopacket.DecodeFunc(decodeDot11MgmtAssociationResp)}) + LayerTypeDot11MgmtReassociationReq = gopacket.RegisterLayerType(93, gopacket.LayerTypeMetadata{Name: "Dot11MgmtReassociationReq", Decoder: gopacket.DecodeFunc(decodeDot11MgmtReassociationReq)}) + LayerTypeDot11MgmtReassociationResp = gopacket.RegisterLayerType(94, gopacket.LayerTypeMetadata{Name: "Dot11MgmtReassociationResp", Decoder: gopacket.DecodeFunc(decodeDot11MgmtReassociationResp)}) + LayerTypeDot11MgmtProbeReq = gopacket.RegisterLayerType(95, gopacket.LayerTypeMetadata{Name: "Dot11MgmtProbeReq", Decoder: gopacket.DecodeFunc(decodeDot11MgmtProbeReq)}) + LayerTypeDot11MgmtProbeResp = gopacket.RegisterLayerType(96, gopacket.LayerTypeMetadata{Name: "Dot11MgmtProbeResp", Decoder: gopacket.DecodeFunc(decodeDot11MgmtProbeResp)}) + LayerTypeDot11MgmtMeasurementPilot = gopacket.RegisterLayerType(97, gopacket.LayerTypeMetadata{Name: "Dot11MgmtMeasurementPilot", Decoder: gopacket.DecodeFunc(decodeDot11MgmtMeasurementPilot)}) + LayerTypeDot11MgmtBeacon = gopacket.RegisterLayerType(98, gopacket.LayerTypeMetadata{Name: "Dot11MgmtBeacon", Decoder: gopacket.DecodeFunc(decodeDot11MgmtBeacon)}) + LayerTypeDot11MgmtATIM = gopacket.RegisterLayerType(99, gopacket.LayerTypeMetadata{Name: "Dot11MgmtATIM", Decoder: gopacket.DecodeFunc(decodeDot11MgmtATIM)}) + LayerTypeDot11MgmtDisassociation = gopacket.RegisterLayerType(100, gopacket.LayerTypeMetadata{Name: "Dot11MgmtDisassociation", Decoder: gopacket.DecodeFunc(decodeDot11MgmtDisassociation)}) + LayerTypeDot11MgmtAuthentication = gopacket.RegisterLayerType(101, gopacket.LayerTypeMetadata{Name: "Dot11MgmtAuthentication", Decoder: gopacket.DecodeFunc(decodeDot11MgmtAuthentication)}) + LayerTypeDot11MgmtDeauthentication = gopacket.RegisterLayerType(102, gopacket.LayerTypeMetadata{Name: "Dot11MgmtDeauthentication", Decoder: gopacket.DecodeFunc(decodeDot11MgmtDeauthentication)}) + LayerTypeDot11MgmtAction = gopacket.RegisterLayerType(103, gopacket.LayerTypeMetadata{Name: "Dot11MgmtAction", Decoder: gopacket.DecodeFunc(decodeDot11MgmtAction)}) + LayerTypeDot11MgmtActionNoAck = gopacket.RegisterLayerType(104, gopacket.LayerTypeMetadata{Name: "Dot11MgmtActionNoAck", Decoder: gopacket.DecodeFunc(decodeDot11MgmtActionNoAck)}) + LayerTypeDot11MgmtArubaWLAN = gopacket.RegisterLayerType(105, gopacket.LayerTypeMetadata{Name: "Dot11MgmtArubaWLAN", Decoder: gopacket.DecodeFunc(decodeDot11MgmtArubaWLAN)}) + LayerTypeDot11WEP = gopacket.RegisterLayerType(106, gopacket.LayerTypeMetadata{Name: "Dot11WEP", Decoder: gopacket.DecodeFunc(decodeDot11WEP)}) + LayerTypeDNS = gopacket.RegisterLayerType(107, gopacket.LayerTypeMetadata{Name: "DNS", Decoder: gopacket.DecodeFunc(decodeDNS)}) + LayerTypeUSB = gopacket.RegisterLayerType(108, gopacket.LayerTypeMetadata{Name: "USB", Decoder: gopacket.DecodeFunc(decodeUSB)}) + LayerTypeUSBRequestBlockSetup = gopacket.RegisterLayerType(109, gopacket.LayerTypeMetadata{Name: "USBRequestBlockSetup", Decoder: gopacket.DecodeFunc(decodeUSBRequestBlockSetup)}) + LayerTypeUSBControl = gopacket.RegisterLayerType(110, gopacket.LayerTypeMetadata{Name: "USBControl", Decoder: gopacket.DecodeFunc(decodeUSBControl)}) + LayerTypeUSBInterrupt = gopacket.RegisterLayerType(111, gopacket.LayerTypeMetadata{Name: "USBInterrupt", Decoder: gopacket.DecodeFunc(decodeUSBInterrupt)}) + LayerTypeUSBBulk = gopacket.RegisterLayerType(112, gopacket.LayerTypeMetadata{Name: "USBBulk", Decoder: gopacket.DecodeFunc(decodeUSBBulk)}) + LayerTypeLinuxSLL = gopacket.RegisterLayerType(113, gopacket.LayerTypeMetadata{Name: "Linux SLL", Decoder: gopacket.DecodeFunc(decodeLinuxSLL)}) + LayerTypeSFlow = gopacket.RegisterLayerType(114, gopacket.LayerTypeMetadata{Name: "SFlow", Decoder: gopacket.DecodeFunc(decodeSFlow)}) + LayerTypePrismHeader = gopacket.RegisterLayerType(115, gopacket.LayerTypeMetadata{Name: "Prism monitor mode header", Decoder: gopacket.DecodeFunc(decodePrismHeader)}) + LayerTypeVXLAN = gopacket.RegisterLayerType(116, gopacket.LayerTypeMetadata{Name: "VXLAN", Decoder: gopacket.DecodeFunc(decodeVXLAN)}) + LayerTypeNTP = gopacket.RegisterLayerType(117, gopacket.LayerTypeMetadata{Name: "NTP", Decoder: gopacket.DecodeFunc(decodeNTP)}) + LayerTypeDHCPv4 = gopacket.RegisterLayerType(118, gopacket.LayerTypeMetadata{Name: "DHCPv4", Decoder: gopacket.DecodeFunc(decodeDHCPv4)}) + LayerTypeVRRP = gopacket.RegisterLayerType(119, gopacket.LayerTypeMetadata{Name: "VRRP", Decoder: gopacket.DecodeFunc(decodeVRRP)}) + LayerTypeGeneve = gopacket.RegisterLayerType(120, gopacket.LayerTypeMetadata{Name: "Geneve", Decoder: gopacket.DecodeFunc(decodeGeneve)}) + LayerTypeSTP = gopacket.RegisterLayerType(121, gopacket.LayerTypeMetadata{Name: "STP", Decoder: gopacket.DecodeFunc(decodeSTP)}) + LayerTypeBFD = gopacket.RegisterLayerType(122, gopacket.LayerTypeMetadata{Name: "BFD", Decoder: gopacket.DecodeFunc(decodeBFD)}) + LayerTypeOSPF = gopacket.RegisterLayerType(123, gopacket.LayerTypeMetadata{Name: "OSPF", Decoder: gopacket.DecodeFunc(decodeOSPF)}) +) + +var ( + // LayerClassIPNetwork contains TCP/IP network layer types. + LayerClassIPNetwork = gopacket.NewLayerClass([]gopacket.LayerType{ + LayerTypeIPv4, + LayerTypeIPv6, + }) + // LayerClassIPTransport contains TCP/IP transport layer types. + LayerClassIPTransport = gopacket.NewLayerClass([]gopacket.LayerType{ + LayerTypeTCP, + LayerTypeUDP, + LayerTypeSCTP, + }) + // LayerClassIPControl contains TCP/IP control protocols. + LayerClassIPControl = gopacket.NewLayerClass([]gopacket.LayerType{ + LayerTypeICMPv4, + LayerTypeICMPv6, + }) + // LayerClassSCTPChunk contains SCTP chunk types (not the top-level SCTP + // layer). + LayerClassSCTPChunk = gopacket.NewLayerClass([]gopacket.LayerType{ + LayerTypeSCTPUnknownChunkType, + LayerTypeSCTPData, + LayerTypeSCTPInit, + LayerTypeSCTPSack, + LayerTypeSCTPHeartbeat, + LayerTypeSCTPError, + LayerTypeSCTPShutdown, + LayerTypeSCTPShutdownAck, + LayerTypeSCTPCookieEcho, + LayerTypeSCTPEmptyLayer, + LayerTypeSCTPInitAck, + LayerTypeSCTPHeartbeatAck, + LayerTypeSCTPAbort, + LayerTypeSCTPShutdownComplete, + LayerTypeSCTPCookieAck, + }) + // LayerClassIPv6Extension contains IPv6 extension headers. + LayerClassIPv6Extension = gopacket.NewLayerClass([]gopacket.LayerType{ + LayerTypeIPv6HopByHop, + LayerTypeIPv6Routing, + LayerTypeIPv6Fragment, + LayerTypeIPv6Destination, + }) + LayerClassIPSec = gopacket.NewLayerClass([]gopacket.LayerType{ + LayerTypeIPSecAH, + LayerTypeIPSecESP, + }) +) diff --git a/vendor/github.com/google/gopacket/layers/linux_sll.go b/vendor/github.com/google/gopacket/layers/linux_sll.go new file mode 100644 index 0000000..b186053 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/linux_sll.go @@ -0,0 +1,96 @@ +// 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 layers + +import ( + "encoding/binary" + "errors" + "fmt" + "net" + + "github.com/google/gopacket" +) + +type LinuxSLLPacketType uint16 + +const ( + LinuxSLLPacketTypeHost LinuxSLLPacketType = 0 // To us + LinuxSLLPacketTypeBroadcast LinuxSLLPacketType = 1 // To all + LinuxSLLPacketTypeMulticast LinuxSLLPacketType = 2 // To group + LinuxSLLPacketTypeOtherhost LinuxSLLPacketType = 3 // To someone else + LinuxSLLPacketTypeOutgoing LinuxSLLPacketType = 4 // Outgoing of any type + // These ones are invisible by user level + LinuxSLLPacketTypeLoopback LinuxSLLPacketType = 5 // MC/BRD frame looped back + LinuxSLLPacketTypeFastroute LinuxSLLPacketType = 6 // Fastrouted frame +) + +func (l LinuxSLLPacketType) String() string { + switch l { + case LinuxSLLPacketTypeHost: + return "host" + case LinuxSLLPacketTypeBroadcast: + return "broadcast" + case LinuxSLLPacketTypeMulticast: + return "multicast" + case LinuxSLLPacketTypeOtherhost: + return "otherhost" + case LinuxSLLPacketTypeOutgoing: + return "outgoing" + case LinuxSLLPacketTypeLoopback: + return "loopback" + case LinuxSLLPacketTypeFastroute: + return "fastroute" + } + return fmt.Sprintf("Unknown(%d)", int(l)) +} + +type LinuxSLL struct { + BaseLayer + PacketType LinuxSLLPacketType + AddrLen uint16 + Addr net.HardwareAddr + EthernetType EthernetType +} + +// LayerType returns LayerTypeLinuxSLL. +func (sll *LinuxSLL) LayerType() gopacket.LayerType { return LayerTypeLinuxSLL } + +func (sll *LinuxSLL) CanDecode() gopacket.LayerClass { + return LayerTypeLinuxSLL +} + +func (sll *LinuxSLL) LinkFlow() gopacket.Flow { + return gopacket.NewFlow(EndpointMAC, sll.Addr, nil) +} + +func (sll *LinuxSLL) NextLayerType() gopacket.LayerType { + return sll.EthernetType.LayerType() +} + +func (sll *LinuxSLL) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + if len(data) < 16 { + return errors.New("Linux SLL packet too small") + } + sll.PacketType = LinuxSLLPacketType(binary.BigEndian.Uint16(data[0:2])) + sll.AddrLen = binary.BigEndian.Uint16(data[4:6]) + + sll.Addr = net.HardwareAddr(data[6 : sll.AddrLen+6]) + sll.EthernetType = EthernetType(binary.BigEndian.Uint16(data[14:16])) + sll.BaseLayer = BaseLayer{data[:16], data[16:]} + + return nil +} + +func decodeLinuxSLL(data []byte, p gopacket.PacketBuilder) error { + sll := &LinuxSLL{} + if err := sll.DecodeFromBytes(data, p); err != nil { + return err + } + p.AddLayer(sll) + p.SetLinkLayer(sll) + return p.NextDecoder(sll.EthernetType) +} diff --git a/vendor/github.com/google/gopacket/layers/llc.go b/vendor/github.com/google/gopacket/layers/llc.go new file mode 100644 index 0000000..59453fe --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/llc.go @@ -0,0 +1,146 @@ +// 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 layers + +import ( + "encoding/binary" + "errors" + + "github.com/google/gopacket" +) + +// LLC is the layer used for 802.2 Logical Link Control headers. +// See http://standards.ieee.org/getieee802/download/802.2-1998.pdf +type LLC struct { + BaseLayer + DSAP uint8 + IG bool // true means group, false means individual + SSAP uint8 + CR bool // true means response, false means command + Control uint16 +} + +// LayerType returns gopacket.LayerTypeLLC. +func (l *LLC) LayerType() gopacket.LayerType { return LayerTypeLLC } + +// SNAP is used inside LLC. See +// http://standards.ieee.org/getieee802/download/802-2001.pdf. +// From http://en.wikipedia.org/wiki/Subnetwork_Access_Protocol: +// "[T]he Subnetwork Access Protocol (SNAP) is a mechanism for multiplexing, +// on networks using IEEE 802.2 LLC, more protocols than can be distinguished +// by the 8-bit 802.2 Service Access Point (SAP) fields." +type SNAP struct { + BaseLayer + OrganizationalCode []byte + Type EthernetType +} + +// LayerType returns gopacket.LayerTypeSNAP. +func (s *SNAP) LayerType() gopacket.LayerType { return LayerTypeSNAP } + +func decodeLLC(data []byte, p gopacket.PacketBuilder) error { + l := &LLC{ + DSAP: data[0] & 0xFE, + IG: data[0]&0x1 != 0, + SSAP: data[1] & 0xFE, + CR: data[1]&0x1 != 0, + Control: uint16(data[2]), + } + if l.Control&0x1 == 0 || l.Control&0x3 == 0x1 { + l.Control = l.Control<<8 | uint16(data[3]) + l.Contents = data[:4] + l.Payload = data[4:] + } else { + l.Contents = data[:3] + l.Payload = data[3:] + } + p.AddLayer(l) + switch { + case l.DSAP == 0xAA && l.SSAP == 0xAA: + return p.NextDecoder(LayerTypeSNAP) + case l.DSAP == 0x42 && l.SSAP == 0x42: + return p.NextDecoder(LayerTypeSTP) + } + return p.NextDecoder(gopacket.DecodeUnknown) +} + +func decodeSNAP(data []byte, p gopacket.PacketBuilder) error { + s := &SNAP{ + OrganizationalCode: data[:3], + Type: EthernetType(binary.BigEndian.Uint16(data[3:5])), + BaseLayer: BaseLayer{data[:5], data[5:]}, + } + p.AddLayer(s) + // BUG(gconnell): When decoding SNAP, we treat the SNAP type as an Ethernet + // type. This may not actually be an ethernet type in all cases, + // depending on the organizational code. Right now, we don't check. + return p.NextDecoder(s.Type) +} + +// SerializeTo writes the serialized form of this layer into the +// SerializationBuffer, implementing gopacket.SerializableLayer. +// See the docs for gopacket.SerializableLayer for more info. +func (l *LLC) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + var ig_flag, cr_flag byte + var length int + + if l.Control&0xFF00 != 0 { + length = 4 + } else { + length = 3 + } + + if l.DSAP&0x1 != 0 { + return errors.New("DSAP value invalid, should not include IG flag bit") + } + + if l.SSAP&0x1 != 0 { + return errors.New("SSAP value invalid, should not include CR flag bit") + } + + if buf, err := b.PrependBytes(length); err != nil { + return err + } else { + ig_flag = 0 + if l.IG { + ig_flag = 0x1 + } + + cr_flag = 0 + if l.CR { + cr_flag = 0x1 + } + + buf[0] = l.DSAP + ig_flag + buf[1] = l.SSAP + cr_flag + + if length == 4 { + buf[2] = uint8(l.Control >> 8) + buf[3] = uint8(l.Control) + } else { + buf[2] = uint8(l.Control) + } + } + + return nil +} + +// SerializeTo writes the serialized form of this layer into the +// SerializationBuffer, implementing gopacket.SerializableLayer. +// See the docs for gopacket.SerializableLayer for more info. +func (s *SNAP) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + if buf, err := b.PrependBytes(5); err != nil { + return err + } else { + buf[0] = s.OrganizationalCode[0] + buf[1] = s.OrganizationalCode[1] + buf[2] = s.OrganizationalCode[2] + binary.BigEndian.PutUint16(buf[3:5], uint16(s.Type)) + } + + return nil +} diff --git a/vendor/github.com/google/gopacket/layers/lldp.go b/vendor/github.com/google/gopacket/layers/lldp.go new file mode 100644 index 0000000..92ec7da --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/lldp.go @@ -0,0 +1,1530 @@ +// 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 layers + +import ( + "encoding/binary" + "errors" + "fmt" + + "github.com/google/gopacket" +) + +// LLDPTLVType is the type of each TLV value in a LinkLayerDiscovery packet. +type LLDPTLVType byte + +const ( + LLDPTLVEnd LLDPTLVType = 0 + LLDPTLVChassisID LLDPTLVType = 1 + LLDPTLVPortID LLDPTLVType = 2 + LLDPTLVTTL LLDPTLVType = 3 + LLDPTLVPortDescription LLDPTLVType = 4 + LLDPTLVSysName LLDPTLVType = 5 + LLDPTLVSysDescription LLDPTLVType = 6 + LLDPTLVSysCapabilities LLDPTLVType = 7 + LLDPTLVMgmtAddress LLDPTLVType = 8 + LLDPTLVOrgSpecific LLDPTLVType = 127 +) + +// LinkLayerDiscoveryValue is a TLV value inside a LinkLayerDiscovery packet layer. +type LinkLayerDiscoveryValue struct { + Type LLDPTLVType + Length uint16 + Value []byte +} + +// LLDPChassisIDSubType specifies the value type for a single LLDPChassisID.ID +type LLDPChassisIDSubType byte + +// LLDP Chassis Types +const ( + LLDPChassisIDSubTypeReserved LLDPChassisIDSubType = 0 + LLDPChassisIDSubTypeChassisComp LLDPChassisIDSubType = 1 + LLDPChassisIDSubtypeIfaceAlias LLDPChassisIDSubType = 2 + LLDPChassisIDSubTypePortComp LLDPChassisIDSubType = 3 + LLDPChassisIDSubTypeMACAddr LLDPChassisIDSubType = 4 + LLDPChassisIDSubTypeNetworkAddr LLDPChassisIDSubType = 5 + LLDPChassisIDSubtypeIfaceName LLDPChassisIDSubType = 6 + LLDPChassisIDSubTypeLocal LLDPChassisIDSubType = 7 +) + +type LLDPChassisID struct { + Subtype LLDPChassisIDSubType + ID []byte +} + +// LLDPPortIDSubType specifies the value type for a single LLDPPortID.ID +type LLDPPortIDSubType byte + +// LLDP PortID types +const ( + LLDPPortIDSubtypeReserved LLDPPortIDSubType = 0 + LLDPPortIDSubtypeIfaceAlias LLDPPortIDSubType = 1 + LLDPPortIDSubtypePortComp LLDPPortIDSubType = 2 + LLDPPortIDSubtypeMACAddr LLDPPortIDSubType = 3 + LLDPPortIDSubtypeNetworkAddr LLDPPortIDSubType = 4 + LLDPPortIDSubtypeIfaceName LLDPPortIDSubType = 5 + LLDPPortIDSubtypeAgentCircuitID LLDPPortIDSubType = 6 + LLDPPortIDSubtypeLocal LLDPPortIDSubType = 7 +) + +type LLDPPortID struct { + Subtype LLDPPortIDSubType + ID []byte +} + +// LinkLayerDiscovery is a packet layer containing the LinkLayer Discovery Protocol. +// See http:http://standards.ieee.org/getieee802/download/802.1AB-2009.pdf +// ChassisID, PortID and TTL are mandatory TLV's. Other values can be decoded +// with DecodeValues() +type LinkLayerDiscovery struct { + BaseLayer + ChassisID LLDPChassisID + PortID LLDPPortID + TTL uint16 + Values []LinkLayerDiscoveryValue +} + +type IEEEOUI uint32 + +// http://standards.ieee.org/develop/regauth/oui/oui.txt +const ( + IEEEOUI8021 IEEEOUI = 0x0080c2 + IEEEOUI8023 IEEEOUI = 0x00120f + IEEEOUI80211 IEEEOUI = 0x000fac + IEEEOUI8021Qbg IEEEOUI = 0x0013BF + IEEEOUICisco2 IEEEOUI = 0x000142 + IEEEOUIMedia IEEEOUI = 0x0012bb // TR-41 + IEEEOUIProfinet IEEEOUI = 0x000ecf + IEEEOUIDCBX IEEEOUI = 0x001b21 +) + +// LLDPOrgSpecificTLV is an Organisation-specific TLV +type LLDPOrgSpecificTLV struct { + OUI IEEEOUI + SubType uint8 + Info []byte +} + +// LLDPCapabilities Types +const ( + LLDPCapsOther uint16 = 1 << 0 + LLDPCapsRepeater uint16 = 1 << 1 + LLDPCapsBridge uint16 = 1 << 2 + LLDPCapsWLANAP uint16 = 1 << 3 + LLDPCapsRouter uint16 = 1 << 4 + LLDPCapsPhone uint16 = 1 << 5 + LLDPCapsDocSis uint16 = 1 << 6 + LLDPCapsStationOnly uint16 = 1 << 7 + LLDPCapsCVLAN uint16 = 1 << 8 + LLDPCapsSVLAN uint16 = 1 << 9 + LLDPCapsTmpr uint16 = 1 << 10 +) + +// LLDPCapabilities represents the capabilities of a device +type LLDPCapabilities struct { + Other bool + Repeater bool + Bridge bool + WLANAP bool + Router bool + Phone bool + DocSis bool + StationOnly bool + CVLAN bool + SVLAN bool + TMPR bool +} + +type LLDPSysCapabilities struct { + SystemCap LLDPCapabilities + EnabledCap LLDPCapabilities +} + +type IANAAddressFamily byte + +// LLDP Management Address Subtypes +// http://www.iana.org/assignments/address-family-numbers/address-family-numbers.xml +const ( + IANAAddressFamilyReserved IANAAddressFamily = 0 + IANAAddressFamilyIPV4 IANAAddressFamily = 1 + IANAAddressFamilyIPV6 IANAAddressFamily = 2 + IANAAddressFamilyNSAP IANAAddressFamily = 3 + IANAAddressFamilyHDLC IANAAddressFamily = 4 + IANAAddressFamilyBBN1822 IANAAddressFamily = 5 + IANAAddressFamily802 IANAAddressFamily = 6 + IANAAddressFamilyE163 IANAAddressFamily = 7 + IANAAddressFamilyE164 IANAAddressFamily = 8 + IANAAddressFamilyF69 IANAAddressFamily = 9 + IANAAddressFamilyX121 IANAAddressFamily = 10 + IANAAddressFamilyIPX IANAAddressFamily = 11 + IANAAddressFamilyAtalk IANAAddressFamily = 12 + IANAAddressFamilyDecnet IANAAddressFamily = 13 + IANAAddressFamilyBanyan IANAAddressFamily = 14 + IANAAddressFamilyE164NSAP IANAAddressFamily = 15 + IANAAddressFamilyDNS IANAAddressFamily = 16 + IANAAddressFamilyDistname IANAAddressFamily = 17 + IANAAddressFamilyASNumber IANAAddressFamily = 18 + IANAAddressFamilyXTPIPV4 IANAAddressFamily = 19 + IANAAddressFamilyXTPIPV6 IANAAddressFamily = 20 + IANAAddressFamilyXTP IANAAddressFamily = 21 + IANAAddressFamilyFcWWPN IANAAddressFamily = 22 + IANAAddressFamilyFcWWNN IANAAddressFamily = 23 + IANAAddressFamilyGWID IANAAddressFamily = 24 + IANAAddressFamilyL2VPN IANAAddressFamily = 25 +) + +type LLDPInterfaceSubtype byte + +// LLDP Interface Subtypes +const ( + LLDPInterfaceSubtypeUnknown LLDPInterfaceSubtype = 1 + LLDPInterfaceSubtypeifIndex LLDPInterfaceSubtype = 2 + LLDPInterfaceSubtypeSysPort LLDPInterfaceSubtype = 3 +) + +type LLDPMgmtAddress struct { + Subtype IANAAddressFamily + Address []byte + InterfaceSubtype LLDPInterfaceSubtype + InterfaceNumber uint32 + OID string +} + +// LinkLayerDiscoveryInfo represents the decoded details for a set of LinkLayerDiscoveryValues +// Organisation-specific TLV's can be decoded using the various Decode() methods +type LinkLayerDiscoveryInfo struct { + BaseLayer + PortDescription string + SysName string + SysDescription string + SysCapabilities LLDPSysCapabilities + MgmtAddress LLDPMgmtAddress + OrgTLVs []LLDPOrgSpecificTLV // Private TLVs + Unknown []LinkLayerDiscoveryValue // undecoded TLVs +} + +/// IEEE 802.1 TLV Subtypes +const ( + LLDP8021SubtypePortVLANID uint8 = 1 + LLDP8021SubtypeProtocolVLANID uint8 = 2 + LLDP8021SubtypeVLANName uint8 = 3 + LLDP8021SubtypeProtocolIdentity uint8 = 4 + LLDP8021SubtypeVDIUsageDigest uint8 = 5 + LLDP8021SubtypeManagementVID uint8 = 6 + LLDP8021SubtypeLinkAggregation uint8 = 7 +) + +// VLAN Port Protocol ID options +const ( + LLDPProtocolVLANIDCapability byte = 1 << 1 + LLDPProtocolVLANIDStatus byte = 1 << 2 +) + +type PortProtocolVLANID struct { + Supported bool + Enabled bool + ID uint16 +} + +type VLANName struct { + ID uint16 + Name string +} + +type ProtocolIdentity []byte + +// LACP options +const ( + LLDPAggregationCapability byte = 1 << 0 + LLDPAggregationStatus byte = 1 << 1 +) + +// IEEE 802 Link Aggregation parameters +type LLDPLinkAggregation struct { + Supported bool + Enabled bool + PortID uint32 +} + +// LLDPInfo8021 represents the information carried in 802.1 Org-specific TLVs +type LLDPInfo8021 struct { + PVID uint16 + PPVIDs []PortProtocolVLANID + VLANNames []VLANName + ProtocolIdentities []ProtocolIdentity + VIDUsageDigest uint32 + ManagementVID uint16 + LinkAggregation LLDPLinkAggregation +} + +// IEEE 802.3 TLV Subtypes +const ( + LLDP8023SubtypeMACPHY uint8 = 1 + LLDP8023SubtypeMDIPower uint8 = 2 + LLDP8023SubtypeLinkAggregation uint8 = 3 + LLDP8023SubtypeMTU uint8 = 4 +) + +// MACPHY options +const ( + LLDPMACPHYCapability byte = 1 << 0 + LLDPMACPHYStatus byte = 1 << 1 +) + +// From IANA-MAU-MIB (introduced by RFC 4836) - dot3MauType +const ( + LLDPMAUTypeUnknown uint16 = 0 + LLDPMAUTypeAUI uint16 = 1 + LLDPMAUType10Base5 uint16 = 2 + LLDPMAUTypeFOIRL uint16 = 3 + LLDPMAUType10Base2 uint16 = 4 + LLDPMAUType10BaseT uint16 = 5 + LLDPMAUType10BaseFP uint16 = 6 + LLDPMAUType10BaseFB uint16 = 7 + LLDPMAUType10BaseFL uint16 = 8 + LLDPMAUType10BROAD36 uint16 = 9 + LLDPMAUType10BaseT_HD uint16 = 10 + LLDPMAUType10BaseT_FD uint16 = 11 + LLDPMAUType10BaseFL_HD uint16 = 12 + LLDPMAUType10BaseFL_FD uint16 = 13 + LLDPMAUType100BaseT4 uint16 = 14 + LLDPMAUType100BaseTX_HD uint16 = 15 + LLDPMAUType100BaseTX_FD uint16 = 16 + LLDPMAUType100BaseFX_HD uint16 = 17 + LLDPMAUType100BaseFX_FD uint16 = 18 + LLDPMAUType100BaseT2_HD uint16 = 19 + LLDPMAUType100BaseT2_FD uint16 = 20 + LLDPMAUType1000BaseX_HD uint16 = 21 + LLDPMAUType1000BaseX_FD uint16 = 22 + LLDPMAUType1000BaseLX_HD uint16 = 23 + LLDPMAUType1000BaseLX_FD uint16 = 24 + LLDPMAUType1000BaseSX_HD uint16 = 25 + LLDPMAUType1000BaseSX_FD uint16 = 26 + LLDPMAUType1000BaseCX_HD uint16 = 27 + LLDPMAUType1000BaseCX_FD uint16 = 28 + LLDPMAUType1000BaseT_HD uint16 = 29 + LLDPMAUType1000BaseT_FD uint16 = 30 + LLDPMAUType10GBaseX uint16 = 31 + LLDPMAUType10GBaseLX4 uint16 = 32 + LLDPMAUType10GBaseR uint16 = 33 + LLDPMAUType10GBaseER uint16 = 34 + LLDPMAUType10GBaseLR uint16 = 35 + LLDPMAUType10GBaseSR uint16 = 36 + LLDPMAUType10GBaseW uint16 = 37 + LLDPMAUType10GBaseEW uint16 = 38 + LLDPMAUType10GBaseLW uint16 = 39 + LLDPMAUType10GBaseSW uint16 = 40 + LLDPMAUType10GBaseCX4 uint16 = 41 + LLDPMAUType2BaseTL uint16 = 42 + LLDPMAUType10PASS_TS uint16 = 43 + LLDPMAUType100BaseBX10D uint16 = 44 + LLDPMAUType100BaseBX10U uint16 = 45 + LLDPMAUType100BaseLX10 uint16 = 46 + LLDPMAUType1000BaseBX10D uint16 = 47 + LLDPMAUType1000BaseBX10U uint16 = 48 + LLDPMAUType1000BaseLX10 uint16 = 49 + LLDPMAUType1000BasePX10D uint16 = 50 + LLDPMAUType1000BasePX10U uint16 = 51 + LLDPMAUType1000BasePX20D uint16 = 52 + LLDPMAUType1000BasePX20U uint16 = 53 + LLDPMAUType10GBaseT uint16 = 54 + LLDPMAUType10GBaseLRM uint16 = 55 + LLDPMAUType1000BaseKX uint16 = 56 + LLDPMAUType10GBaseKX4 uint16 = 57 + LLDPMAUType10GBaseKR uint16 = 58 + LLDPMAUType10_1GBasePRX_D1 uint16 = 59 + LLDPMAUType10_1GBasePRX_D2 uint16 = 60 + LLDPMAUType10_1GBasePRX_D3 uint16 = 61 + LLDPMAUType10_1GBasePRX_U1 uint16 = 62 + LLDPMAUType10_1GBasePRX_U2 uint16 = 63 + LLDPMAUType10_1GBasePRX_U3 uint16 = 64 + LLDPMAUType10GBasePR_D1 uint16 = 65 + LLDPMAUType10GBasePR_D2 uint16 = 66 + LLDPMAUType10GBasePR_D3 uint16 = 67 + LLDPMAUType10GBasePR_U1 uint16 = 68 + LLDPMAUType10GBasePR_U3 uint16 = 69 +) + +// From RFC 3636 - ifMauAutoNegCapAdvertisedBits +const ( + LLDPMAUPMDOther uint16 = 1 << 15 + LLDPMAUPMD10BaseT uint16 = 1 << 14 + LLDPMAUPMD10BaseT_FD uint16 = 1 << 13 + LLDPMAUPMD100BaseT4 uint16 = 1 << 12 + LLDPMAUPMD100BaseTX uint16 = 1 << 11 + LLDPMAUPMD100BaseTX_FD uint16 = 1 << 10 + LLDPMAUPMD100BaseT2 uint16 = 1 << 9 + LLDPMAUPMD100BaseT2_FD uint16 = 1 << 8 + LLDPMAUPMDFDXPAUSE uint16 = 1 << 7 + LLDPMAUPMDFDXAPAUSE uint16 = 1 << 6 + LLDPMAUPMDFDXSPAUSE uint16 = 1 << 5 + LLDPMAUPMDFDXBPAUSE uint16 = 1 << 4 + LLDPMAUPMD1000BaseX uint16 = 1 << 3 + LLDPMAUPMD1000BaseX_FD uint16 = 1 << 2 + LLDPMAUPMD1000BaseT uint16 = 1 << 1 + LLDPMAUPMD1000BaseT_FD uint16 = 1 << 0 +) + +// Inverted ifMauAutoNegCapAdvertisedBits if required +// (Some manufacturers misinterpreted the spec - +// see https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=1455) +const ( + LLDPMAUPMDOtherInv uint16 = 1 << 0 + LLDPMAUPMD10BaseTInv uint16 = 1 << 1 + LLDPMAUPMD10BaseT_FDInv uint16 = 1 << 2 + LLDPMAUPMD100BaseT4Inv uint16 = 1 << 3 + LLDPMAUPMD100BaseTXInv uint16 = 1 << 4 + LLDPMAUPMD100BaseTX_FDInv uint16 = 1 << 5 + LLDPMAUPMD100BaseT2Inv uint16 = 1 << 6 + LLDPMAUPMD100BaseT2_FDInv uint16 = 1 << 7 + LLDPMAUPMDFDXPAUSEInv uint16 = 1 << 8 + LLDPMAUPMDFDXAPAUSEInv uint16 = 1 << 9 + LLDPMAUPMDFDXSPAUSEInv uint16 = 1 << 10 + LLDPMAUPMDFDXBPAUSEInv uint16 = 1 << 11 + LLDPMAUPMD1000BaseXInv uint16 = 1 << 12 + LLDPMAUPMD1000BaseX_FDInv uint16 = 1 << 13 + LLDPMAUPMD1000BaseTInv uint16 = 1 << 14 + LLDPMAUPMD1000BaseT_FDInv uint16 = 1 << 15 +) + +type LLDPMACPHYConfigStatus struct { + AutoNegSupported bool + AutoNegEnabled bool + AutoNegCapability uint16 + MAUType uint16 +} + +// MDI Power options +const ( + LLDPMDIPowerPortClass byte = 1 << 0 + LLDPMDIPowerCapability byte = 1 << 1 + LLDPMDIPowerStatus byte = 1 << 2 + LLDPMDIPowerPairsAbility byte = 1 << 3 +) + +type LLDPPowerType byte + +type LLDPPowerSource byte + +type LLDPPowerPriority byte + +const ( + LLDPPowerPriorityUnknown LLDPPowerPriority = 0 + LLDPPowerPriorityMedium LLDPPowerPriority = 1 + LLDPPowerPriorityHigh LLDPPowerPriority = 2 + LLDPPowerPriorityLow LLDPPowerPriority = 3 +) + +type LLDPPowerViaMDI8023 struct { + PortClassPSE bool // false = PD + PSESupported bool + PSEEnabled bool + PSEPairsAbility bool + PSEPowerPair uint8 + PSEClass uint8 + Type LLDPPowerType + Source LLDPPowerSource + Priority LLDPPowerPriority + Requested uint16 // 1-510 Watts + Allocated uint16 // 1-510 Watts +} + +// LLDPInfo8023 represents the information carried in 802.3 Org-specific TLVs +type LLDPInfo8023 struct { + MACPHYConfigStatus LLDPMACPHYConfigStatus + PowerViaMDI LLDPPowerViaMDI8023 + LinkAggregation LLDPLinkAggregation + MTU uint16 +} + +// IEEE 802.1Qbg TLV Subtypes +const ( + LLDP8021QbgEVB uint8 = 0 + LLDP8021QbgCDCP uint8 = 1 + LLDP8021QbgVDP uint8 = 2 + LLDP8021QbgEVB22 uint8 = 13 +) + +// LLDPEVBCapabilities Types +const ( + LLDPEVBCapsSTD uint16 = 1 << 7 + LLDPEVBCapsRR uint16 = 1 << 6 + LLDPEVBCapsRTE uint16 = 1 << 2 + LLDPEVBCapsECP uint16 = 1 << 1 + LLDPEVBCapsVDP uint16 = 1 << 0 +) + +// LLDPEVBCapabilities represents the EVB capabilities of a device +type LLDPEVBCapabilities struct { + StandardBridging bool + ReflectiveRelay bool + RetransmissionTimerExponent bool + EdgeControlProtocol bool + VSIDiscoveryProtocol bool +} + +type LLDPEVBSettings struct { + Supported LLDPEVBCapabilities + Enabled LLDPEVBCapabilities + SupportedVSIs uint16 + ConfiguredVSIs uint16 + RTEExponent uint8 +} + +// LLDPInfo8021Qbg represents the information carried in 802.1Qbg Org-specific TLVs +type LLDPInfo8021Qbg struct { + EVBSettings LLDPEVBSettings +} + +type LLDPMediaSubtype uint8 + +// Media TLV Subtypes +const ( + LLDPMediaTypeCapabilities LLDPMediaSubtype = 1 + LLDPMediaTypeNetwork LLDPMediaSubtype = 2 + LLDPMediaTypeLocation LLDPMediaSubtype = 3 + LLDPMediaTypePower LLDPMediaSubtype = 4 + LLDPMediaTypeHardware LLDPMediaSubtype = 5 + LLDPMediaTypeFirmware LLDPMediaSubtype = 6 + LLDPMediaTypeSoftware LLDPMediaSubtype = 7 + LLDPMediaTypeSerial LLDPMediaSubtype = 8 + LLDPMediaTypeManufacturer LLDPMediaSubtype = 9 + LLDPMediaTypeModel LLDPMediaSubtype = 10 + LLDPMediaTypeAssetID LLDPMediaSubtype = 11 +) + +type LLDPMediaClass uint8 + +// Media Class Values +const ( + LLDPMediaClassUndefined LLDPMediaClass = 0 + LLDPMediaClassEndpointI LLDPMediaClass = 1 + LLDPMediaClassEndpointII LLDPMediaClass = 2 + LLDPMediaClassEndpointIII LLDPMediaClass = 3 + LLDPMediaClassNetwork LLDPMediaClass = 4 +) + +// LLDPMediaCapabilities Types +const ( + LLDPMediaCapsLLDP uint16 = 1 << 0 + LLDPMediaCapsNetwork uint16 = 1 << 1 + LLDPMediaCapsLocation uint16 = 1 << 2 + LLDPMediaCapsPowerPSE uint16 = 1 << 3 + LLDPMediaCapsPowerPD uint16 = 1 << 4 + LLDPMediaCapsInventory uint16 = 1 << 5 +) + +// LLDPMediaCapabilities represents the LLDP Media capabilities of a device +type LLDPMediaCapabilities struct { + Capabilities bool + NetworkPolicy bool + Location bool + PowerPSE bool + PowerPD bool + Inventory bool + Class LLDPMediaClass +} + +type LLDPApplicationType uint8 + +const ( + LLDPAppTypeReserved LLDPApplicationType = 0 + LLDPAppTypeVoice LLDPApplicationType = 1 + LLDPappTypeVoiceSignaling LLDPApplicationType = 2 + LLDPappTypeGuestVoice LLDPApplicationType = 3 + LLDPappTypeGuestVoiceSignaling LLDPApplicationType = 4 + LLDPappTypeSoftphoneVoice LLDPApplicationType = 5 + LLDPappTypeVideoConferencing LLDPApplicationType = 6 + LLDPappTypeStreamingVideo LLDPApplicationType = 7 + LLDPappTypeVideoSignaling LLDPApplicationType = 8 +) + +type LLDPNetworkPolicy struct { + ApplicationType LLDPApplicationType + Defined bool + Tagged bool + VLANId uint16 + L2Priority uint16 + DSCPValue uint8 +} + +type LLDPLocationFormat uint8 + +const ( + LLDPLocationFormatInvalid LLDPLocationFormat = 0 + LLDPLocationFormatCoordinate LLDPLocationFormat = 1 + LLDPLocationFormatAddress LLDPLocationFormat = 2 + LLDPLocationFormatECS LLDPLocationFormat = 3 +) + +type LLDPLocationAddressWhat uint8 + +const ( + LLDPLocationAddressWhatDHCP LLDPLocationAddressWhat = 0 + LLDPLocationAddressWhatNetwork LLDPLocationAddressWhat = 1 + LLDPLocationAddressWhatClient LLDPLocationAddressWhat = 2 +) + +type LLDPLocationAddressType uint8 + +const ( + LLDPLocationAddressTypeLanguage LLDPLocationAddressType = 0 + LLDPLocationAddressTypeNational LLDPLocationAddressType = 1 + LLDPLocationAddressTypeCounty LLDPLocationAddressType = 2 + LLDPLocationAddressTypeCity LLDPLocationAddressType = 3 + LLDPLocationAddressTypeCityDivision LLDPLocationAddressType = 4 + LLDPLocationAddressTypeNeighborhood LLDPLocationAddressType = 5 + LLDPLocationAddressTypeStreet LLDPLocationAddressType = 6 + LLDPLocationAddressTypeLeadingStreet LLDPLocationAddressType = 16 + LLDPLocationAddressTypeTrailingStreet LLDPLocationAddressType = 17 + LLDPLocationAddressTypeStreetSuffix LLDPLocationAddressType = 18 + LLDPLocationAddressTypeHouseNum LLDPLocationAddressType = 19 + LLDPLocationAddressTypeHouseSuffix LLDPLocationAddressType = 20 + LLDPLocationAddressTypeLandmark LLDPLocationAddressType = 21 + LLDPLocationAddressTypeAdditional LLDPLocationAddressType = 22 + LLDPLocationAddressTypeName LLDPLocationAddressType = 23 + LLDPLocationAddressTypePostal LLDPLocationAddressType = 24 + LLDPLocationAddressTypeBuilding LLDPLocationAddressType = 25 + LLDPLocationAddressTypeUnit LLDPLocationAddressType = 26 + LLDPLocationAddressTypeFloor LLDPLocationAddressType = 27 + LLDPLocationAddressTypeRoom LLDPLocationAddressType = 28 + LLDPLocationAddressTypePlace LLDPLocationAddressType = 29 + LLDPLocationAddressTypeScript LLDPLocationAddressType = 128 +) + +type LLDPLocationCoordinate struct { + LatitudeResolution uint8 + Latitude uint64 + LongitudeResolution uint8 + Longitude uint64 + AltitudeType uint8 + AltitudeResolution uint16 + Altitude uint32 + Datum uint8 +} + +type LLDPLocationAddressLine struct { + Type LLDPLocationAddressType + Value string +} + +type LLDPLocationAddress struct { + What LLDPLocationAddressWhat + CountryCode string + AddressLines []LLDPLocationAddressLine +} + +type LLDPLocationECS struct { + ELIN string +} + +// LLDP represents a physical location. +// Only one of the embedded types will contain values, depending on Format. +type LLDPLocation struct { + Format LLDPLocationFormat + Coordinate LLDPLocationCoordinate + Address LLDPLocationAddress + ECS LLDPLocationECS +} + +type LLDPPowerViaMDI struct { + Type LLDPPowerType + Source LLDPPowerSource + Priority LLDPPowerPriority + Value uint16 +} + +// LLDPInfoMedia represents the information carried in TR-41 Org-specific TLVs +type LLDPInfoMedia struct { + MediaCapabilities LLDPMediaCapabilities + NetworkPolicy LLDPNetworkPolicy + Location LLDPLocation + PowerViaMDI LLDPPowerViaMDI + HardwareRevision string + FirmwareRevision string + SoftwareRevision string + SerialNumber string + Manufacturer string + Model string + AssetID string +} + +type LLDPCisco2Subtype uint8 + +// Cisco2 TLV Subtypes +const ( + LLDPCisco2PowerViaMDI LLDPCisco2Subtype = 1 +) + +const ( + LLDPCiscoPSESupport uint8 = 1 << 0 + LLDPCiscoArchShared uint8 = 1 << 1 + LLDPCiscoPDSparePair uint8 = 1 << 2 + LLDPCiscoPSESparePair uint8 = 1 << 3 +) + +// LLDPInfoCisco2 represents the information carried in Cisco Org-specific TLVs +type LLDPInfoCisco2 struct { + PSEFourWirePoESupported bool + PDSparePairArchitectureShared bool + PDRequestSparePairPoEOn bool + PSESparePairPoEOn bool +} + +// Profinet Subtypes +type LLDPProfinetSubtype uint8 + +const ( + LLDPProfinetPNIODelay LLDPProfinetSubtype = 1 + LLDPProfinetPNIOPortStatus LLDPProfinetSubtype = 2 + LLDPProfinetPNIOMRPPortStatus LLDPProfinetSubtype = 4 + LLDPProfinetPNIOChassisMAC LLDPProfinetSubtype = 5 + LLDPProfinetPNIOPTCPStatus LLDPProfinetSubtype = 6 +) + +type LLDPPNIODelay struct { + RXLocal uint32 + RXRemote uint32 + TXLocal uint32 + TXRemote uint32 + CableLocal uint32 +} + +type LLDPPNIOPortStatus struct { + Class2 uint16 + Class3 uint16 +} + +type LLDPPNIOMRPPortStatus struct { + UUID []byte + Status uint16 +} + +type LLDPPNIOPTCPStatus struct { + MasterAddress []byte + SubdomainUUID []byte + IRDataUUID []byte + PeriodValid bool + PeriodLength uint32 + RedPeriodValid bool + RedPeriodBegin uint32 + OrangePeriodValid bool + OrangePeriodBegin uint32 + GreenPeriodValid bool + GreenPeriodBegin uint32 +} + +// LLDPInfoProfinet represents the information carried in Profinet Org-specific TLVs +type LLDPInfoProfinet struct { + PNIODelay LLDPPNIODelay + PNIOPortStatus LLDPPNIOPortStatus + PNIOMRPPortStatus LLDPPNIOMRPPortStatus + ChassisMAC []byte + PNIOPTCPStatus LLDPPNIOPTCPStatus +} + +// LayerType returns gopacket.LayerTypeLinkLayerDiscovery. +func (c *LinkLayerDiscovery) LayerType() gopacket.LayerType { + return LayerTypeLinkLayerDiscovery +} + +func decodeLinkLayerDiscovery(data []byte, p gopacket.PacketBuilder) error { + var vals []LinkLayerDiscoveryValue + vData := data[0:] + for len(vData) > 0 { + nbit := vData[0] & 0x01 + t := LLDPTLVType(vData[0] >> 1) + val := LinkLayerDiscoveryValue{Type: t, Length: uint16(nbit)<<8 + uint16(vData[1])} + if val.Length > 0 { + val.Value = vData[2 : val.Length+2] + } + vals = append(vals, val) + if t == LLDPTLVEnd { + break + } + if len(vData) < int(2+val.Length) { + return errors.New("Malformed LinkLayerDiscovery Header") + } + vData = vData[2+val.Length:] + } + if len(vals) < 4 { + return errors.New("Missing mandatory LinkLayerDiscovery TLV") + } + c := &LinkLayerDiscovery{} + gotEnd := false + for _, v := range vals { + switch v.Type { + case LLDPTLVEnd: + gotEnd = true + case LLDPTLVChassisID: + if len(v.Value) < 2 { + return errors.New("Malformed LinkLayerDiscovery ChassisID TLV") + } + c.ChassisID.Subtype = LLDPChassisIDSubType(v.Value[0]) + c.ChassisID.ID = v.Value[1:] + case LLDPTLVPortID: + if len(v.Value) < 2 { + return errors.New("Malformed LinkLayerDiscovery PortID TLV") + } + c.PortID.Subtype = LLDPPortIDSubType(v.Value[0]) + c.PortID.ID = v.Value[1:] + case LLDPTLVTTL: + if len(v.Value) < 2 { + return errors.New("Malformed LinkLayerDiscovery TTL TLV") + } + c.TTL = binary.BigEndian.Uint16(v.Value[0:2]) + default: + c.Values = append(c.Values, v) + } + } + if c.ChassisID.Subtype == 0 || c.PortID.Subtype == 0 || !gotEnd { + return errors.New("Missing mandatory LinkLayerDiscovery TLV") + } + c.Contents = data + p.AddLayer(c) + + info := &LinkLayerDiscoveryInfo{} + p.AddLayer(info) + for _, v := range c.Values { + switch v.Type { + case LLDPTLVPortDescription: + info.PortDescription = string(v.Value) + case LLDPTLVSysName: + info.SysName = string(v.Value) + case LLDPTLVSysDescription: + info.SysDescription = string(v.Value) + case LLDPTLVSysCapabilities: + if err := checkLLDPTLVLen(v, 4); err != nil { + return err + } + info.SysCapabilities.SystemCap = getCapabilities(binary.BigEndian.Uint16(v.Value[0:2])) + info.SysCapabilities.EnabledCap = getCapabilities(binary.BigEndian.Uint16(v.Value[2:4])) + case LLDPTLVMgmtAddress: + if err := checkLLDPTLVLen(v, 9); err != nil { + return err + } + mlen := v.Value[0] + if err := checkLLDPTLVLen(v, int(mlen+7)); err != nil { + return err + } + info.MgmtAddress.Subtype = IANAAddressFamily(v.Value[1]) + info.MgmtAddress.Address = v.Value[2 : mlen+1] + info.MgmtAddress.InterfaceSubtype = LLDPInterfaceSubtype(v.Value[mlen+1]) + info.MgmtAddress.InterfaceNumber = binary.BigEndian.Uint32(v.Value[mlen+2 : mlen+6]) + olen := v.Value[mlen+6] + if err := checkLLDPTLVLen(v, int(mlen+6+olen)); err != nil { + return err + } + info.MgmtAddress.OID = string(v.Value[mlen+9 : mlen+9+olen]) + case LLDPTLVOrgSpecific: + if err := checkLLDPTLVLen(v, 4); err != nil { + return err + } + info.OrgTLVs = append(info.OrgTLVs, LLDPOrgSpecificTLV{IEEEOUI(binary.BigEndian.Uint32(append([]byte{byte(0)}, v.Value[0:3]...))), uint8(v.Value[3]), v.Value[4:]}) + } + } + return nil +} + +func (l *LinkLayerDiscoveryInfo) Decode8021() (info LLDPInfo8021, err error) { + for _, o := range l.OrgTLVs { + if o.OUI != IEEEOUI8021 { + continue + } + switch o.SubType { + case LLDP8021SubtypePortVLANID: + if err = checkLLDPOrgSpecificLen(o, 2); err != nil { + return + } + info.PVID = binary.BigEndian.Uint16(o.Info[0:2]) + case LLDP8021SubtypeProtocolVLANID: + if err = checkLLDPOrgSpecificLen(o, 3); err != nil { + return + } + sup := (o.Info[0]&LLDPProtocolVLANIDCapability > 0) + en := (o.Info[0]&LLDPProtocolVLANIDStatus > 0) + id := binary.BigEndian.Uint16(o.Info[1:3]) + info.PPVIDs = append(info.PPVIDs, PortProtocolVLANID{sup, en, id}) + case LLDP8021SubtypeVLANName: + if err = checkLLDPOrgSpecificLen(o, 2); err != nil { + return + } + id := binary.BigEndian.Uint16(o.Info[0:2]) + info.VLANNames = append(info.VLANNames, VLANName{id, string(o.Info[3:])}) + case LLDP8021SubtypeProtocolIdentity: + if err = checkLLDPOrgSpecificLen(o, 1); err != nil { + return + } + l := int(o.Info[0]) + if l > 0 { + info.ProtocolIdentities = append(info.ProtocolIdentities, o.Info[1:1+l]) + } + case LLDP8021SubtypeVDIUsageDigest: + if err = checkLLDPOrgSpecificLen(o, 4); err != nil { + return + } + info.VIDUsageDigest = binary.BigEndian.Uint32(o.Info[0:4]) + case LLDP8021SubtypeManagementVID: + if err = checkLLDPOrgSpecificLen(o, 2); err != nil { + return + } + info.ManagementVID = binary.BigEndian.Uint16(o.Info[0:2]) + case LLDP8021SubtypeLinkAggregation: + if err = checkLLDPOrgSpecificLen(o, 5); err != nil { + return + } + sup := (o.Info[0]&LLDPAggregationCapability > 0) + en := (o.Info[0]&LLDPAggregationStatus > 0) + info.LinkAggregation = LLDPLinkAggregation{sup, en, binary.BigEndian.Uint32(o.Info[1:5])} + } + } + return +} + +func (l *LinkLayerDiscoveryInfo) Decode8023() (info LLDPInfo8023, err error) { + for _, o := range l.OrgTLVs { + if o.OUI != IEEEOUI8023 { + continue + } + switch o.SubType { + case LLDP8023SubtypeMACPHY: + if err = checkLLDPOrgSpecificLen(o, 5); err != nil { + return + } + sup := (o.Info[0]&LLDPMACPHYCapability > 0) + en := (o.Info[0]&LLDPMACPHYStatus > 0) + ca := binary.BigEndian.Uint16(o.Info[1:3]) + mau := binary.BigEndian.Uint16(o.Info[3:5]) + info.MACPHYConfigStatus = LLDPMACPHYConfigStatus{sup, en, ca, mau} + case LLDP8023SubtypeMDIPower: + if err = checkLLDPOrgSpecificLen(o, 3); err != nil { + return + } + info.PowerViaMDI.PortClassPSE = (o.Info[0]&LLDPMDIPowerPortClass > 0) + info.PowerViaMDI.PSESupported = (o.Info[0]&LLDPMDIPowerCapability > 0) + info.PowerViaMDI.PSEEnabled = (o.Info[0]&LLDPMDIPowerStatus > 0) + info.PowerViaMDI.PSEPairsAbility = (o.Info[0]&LLDPMDIPowerPairsAbility > 0) + info.PowerViaMDI.PSEPowerPair = uint8(o.Info[1]) + info.PowerViaMDI.PSEClass = uint8(o.Info[2]) + if len(o.Info) >= 7 { + info.PowerViaMDI.Type = LLDPPowerType((o.Info[3] & 0xc0) >> 6) + info.PowerViaMDI.Source = LLDPPowerSource((o.Info[3] & 0x30) >> 4) + if info.PowerViaMDI.Type == 1 || info.PowerViaMDI.Type == 3 { + info.PowerViaMDI.Source += 128 // For Stringify purposes + } + info.PowerViaMDI.Priority = LLDPPowerPriority(o.Info[3] & 0x0f) + info.PowerViaMDI.Requested = binary.BigEndian.Uint16(o.Info[4:6]) + info.PowerViaMDI.Allocated = binary.BigEndian.Uint16(o.Info[6:8]) + } + case LLDP8023SubtypeLinkAggregation: + if err = checkLLDPOrgSpecificLen(o, 5); err != nil { + return + } + sup := (o.Info[0]&LLDPAggregationCapability > 0) + en := (o.Info[0]&LLDPAggregationStatus > 0) + info.LinkAggregation = LLDPLinkAggregation{sup, en, binary.BigEndian.Uint32(o.Info[1:5])} + case LLDP8023SubtypeMTU: + if err = checkLLDPOrgSpecificLen(o, 2); err != nil { + return + } + info.MTU = binary.BigEndian.Uint16(o.Info[0:2]) + } + } + return +} + +func (l *LinkLayerDiscoveryInfo) Decode8021Qbg() (info LLDPInfo8021Qbg, err error) { + for _, o := range l.OrgTLVs { + if o.OUI != IEEEOUI8021Qbg { + continue + } + switch o.SubType { + case LLDP8021QbgEVB: + if err = checkLLDPOrgSpecificLen(o, 9); err != nil { + return + } + info.EVBSettings.Supported = getEVBCapabilities(binary.BigEndian.Uint16(o.Info[0:2])) + info.EVBSettings.Enabled = getEVBCapabilities(binary.BigEndian.Uint16(o.Info[2:4])) + info.EVBSettings.SupportedVSIs = binary.BigEndian.Uint16(o.Info[4:6]) + info.EVBSettings.ConfiguredVSIs = binary.BigEndian.Uint16(o.Info[6:8]) + info.EVBSettings.RTEExponent = uint8(o.Info[8]) + } + } + return +} + +func (l *LinkLayerDiscoveryInfo) DecodeMedia() (info LLDPInfoMedia, err error) { + for _, o := range l.OrgTLVs { + if o.OUI != IEEEOUIMedia { + continue + } + switch LLDPMediaSubtype(o.SubType) { + case LLDPMediaTypeCapabilities: + if err = checkLLDPOrgSpecificLen(o, 3); err != nil { + return + } + b := binary.BigEndian.Uint16(o.Info[0:2]) + info.MediaCapabilities.Capabilities = (b & LLDPMediaCapsLLDP) > 0 + info.MediaCapabilities.NetworkPolicy = (b & LLDPMediaCapsNetwork) > 0 + info.MediaCapabilities.Location = (b & LLDPMediaCapsLocation) > 0 + info.MediaCapabilities.PowerPSE = (b & LLDPMediaCapsPowerPSE) > 0 + info.MediaCapabilities.PowerPD = (b & LLDPMediaCapsPowerPD) > 0 + info.MediaCapabilities.Inventory = (b & LLDPMediaCapsInventory) > 0 + info.MediaCapabilities.Class = LLDPMediaClass(o.Info[2]) + case LLDPMediaTypeNetwork: + if err = checkLLDPOrgSpecificLen(o, 4); err != nil { + return + } + info.NetworkPolicy.ApplicationType = LLDPApplicationType(o.Info[0]) + b := binary.BigEndian.Uint16(o.Info[1:3]) + info.NetworkPolicy.Defined = (b & 0x8000) == 0 + info.NetworkPolicy.Tagged = (b & 0x4000) > 0 + info.NetworkPolicy.VLANId = (b & 0x1ffe) >> 1 + b = binary.BigEndian.Uint16(o.Info[2:4]) + info.NetworkPolicy.L2Priority = (b & 0x01c0) >> 6 + info.NetworkPolicy.DSCPValue = uint8(o.Info[3] & 0x3f) + case LLDPMediaTypeLocation: + if err = checkLLDPOrgSpecificLen(o, 1); err != nil { + return + } + info.Location.Format = LLDPLocationFormat(o.Info[0]) + o.Info = o.Info[1:] + switch info.Location.Format { + case LLDPLocationFormatCoordinate: + if err = checkLLDPOrgSpecificLen(o, 16); err != nil { + return + } + info.Location.Coordinate.LatitudeResolution = uint8(o.Info[0]&0xfc) >> 2 + b := binary.BigEndian.Uint64(o.Info[0:8]) + info.Location.Coordinate.Latitude = (b & 0x03ffffffff000000) >> 24 + info.Location.Coordinate.LongitudeResolution = uint8(o.Info[5]&0xfc) >> 2 + b = binary.BigEndian.Uint64(o.Info[5:13]) + info.Location.Coordinate.Longitude = (b & 0x03ffffffff000000) >> 24 + info.Location.Coordinate.AltitudeType = uint8((o.Info[10] & 0x30) >> 4) + b1 := binary.BigEndian.Uint16(o.Info[10:12]) + info.Location.Coordinate.AltitudeResolution = (b1 & 0xfc0) >> 6 + b2 := binary.BigEndian.Uint32(o.Info[11:15]) + info.Location.Coordinate.Altitude = b2 & 0x3fffffff + info.Location.Coordinate.Datum = uint8(o.Info[15]) + case LLDPLocationFormatAddress: + if err = checkLLDPOrgSpecificLen(o, 3); err != nil { + return + } + //ll := uint8(o.Info[0]) + info.Location.Address.What = LLDPLocationAddressWhat(o.Info[1]) + info.Location.Address.CountryCode = string(o.Info[2:4]) + data := o.Info[4:] + for len(data) > 1 { + aType := LLDPLocationAddressType(data[0]) + aLen := int(data[1]) + if len(data) >= aLen+2 { + info.Location.Address.AddressLines = append(info.Location.Address.AddressLines, LLDPLocationAddressLine{aType, string(data[2 : aLen+2])}) + data = data[aLen+2:] + } else { + break + } + } + case LLDPLocationFormatECS: + info.Location.ECS.ELIN = string(o.Info) + } + case LLDPMediaTypePower: + if err = checkLLDPOrgSpecificLen(o, 3); err != nil { + return + } + info.PowerViaMDI.Type = LLDPPowerType((o.Info[0] & 0xc0) >> 6) + info.PowerViaMDI.Source = LLDPPowerSource((o.Info[0] & 0x30) >> 4) + if info.PowerViaMDI.Type == 1 || info.PowerViaMDI.Type == 3 { + info.PowerViaMDI.Source += 128 // For Stringify purposes + } + info.PowerViaMDI.Priority = LLDPPowerPriority(o.Info[0] & 0x0f) + info.PowerViaMDI.Value = binary.BigEndian.Uint16(o.Info[1:3]) * 100 // 0 to 102.3 w, 0.1W increments + case LLDPMediaTypeHardware: + info.HardwareRevision = string(o.Info) + case LLDPMediaTypeFirmware: + info.FirmwareRevision = string(o.Info) + case LLDPMediaTypeSoftware: + info.SoftwareRevision = string(o.Info) + case LLDPMediaTypeSerial: + info.SerialNumber = string(o.Info) + case LLDPMediaTypeManufacturer: + info.Manufacturer = string(o.Info) + case LLDPMediaTypeModel: + info.Model = string(o.Info) + case LLDPMediaTypeAssetID: + info.AssetID = string(o.Info) + } + } + return +} + +func (l *LinkLayerDiscoveryInfo) DecodeCisco2() (info LLDPInfoCisco2, err error) { + for _, o := range l.OrgTLVs { + if o.OUI != IEEEOUICisco2 { + continue + } + switch LLDPCisco2Subtype(o.SubType) { + case LLDPCisco2PowerViaMDI: + if err = checkLLDPOrgSpecificLen(o, 1); err != nil { + return + } + info.PSEFourWirePoESupported = (o.Info[0] & LLDPCiscoPSESupport) > 0 + info.PDSparePairArchitectureShared = (o.Info[0] & LLDPCiscoArchShared) > 0 + info.PDRequestSparePairPoEOn = (o.Info[0] & LLDPCiscoPDSparePair) > 0 + info.PSESparePairPoEOn = (o.Info[0] & LLDPCiscoPSESparePair) > 0 + } + } + return +} + +func (l *LinkLayerDiscoveryInfo) DecodeProfinet() (info LLDPInfoProfinet, err error) { + for _, o := range l.OrgTLVs { + if o.OUI != IEEEOUIProfinet { + continue + } + switch LLDPProfinetSubtype(o.SubType) { + case LLDPProfinetPNIODelay: + if err = checkLLDPOrgSpecificLen(o, 20); err != nil { + return + } + info.PNIODelay.RXLocal = binary.BigEndian.Uint32(o.Info[0:4]) + info.PNIODelay.RXRemote = binary.BigEndian.Uint32(o.Info[4:8]) + info.PNIODelay.TXLocal = binary.BigEndian.Uint32(o.Info[8:12]) + info.PNIODelay.TXRemote = binary.BigEndian.Uint32(o.Info[12:16]) + info.PNIODelay.CableLocal = binary.BigEndian.Uint32(o.Info[16:20]) + case LLDPProfinetPNIOPortStatus: + if err = checkLLDPOrgSpecificLen(o, 4); err != nil { + return + } + info.PNIOPortStatus.Class2 = binary.BigEndian.Uint16(o.Info[0:2]) + info.PNIOPortStatus.Class3 = binary.BigEndian.Uint16(o.Info[2:4]) + case LLDPProfinetPNIOMRPPortStatus: + if err = checkLLDPOrgSpecificLen(o, 18); err != nil { + return + } + info.PNIOMRPPortStatus.UUID = o.Info[0:16] + info.PNIOMRPPortStatus.Status = binary.BigEndian.Uint16(o.Info[16:18]) + case LLDPProfinetPNIOChassisMAC: + if err = checkLLDPOrgSpecificLen(o, 6); err != nil { + return + } + info.ChassisMAC = o.Info[0:6] + case LLDPProfinetPNIOPTCPStatus: + if err = checkLLDPOrgSpecificLen(o, 54); err != nil { + return + } + info.PNIOPTCPStatus.MasterAddress = o.Info[0:6] + info.PNIOPTCPStatus.SubdomainUUID = o.Info[6:22] + info.PNIOPTCPStatus.IRDataUUID = o.Info[22:38] + b := binary.BigEndian.Uint32(o.Info[38:42]) + info.PNIOPTCPStatus.PeriodValid = (b & 0x80000000) > 0 + info.PNIOPTCPStatus.PeriodLength = b & 0x7fffffff + b = binary.BigEndian.Uint32(o.Info[42:46]) + info.PNIOPTCPStatus.RedPeriodValid = (b & 0x80000000) > 0 + info.PNIOPTCPStatus.RedPeriodBegin = b & 0x7fffffff + b = binary.BigEndian.Uint32(o.Info[46:50]) + info.PNIOPTCPStatus.OrangePeriodValid = (b & 0x80000000) > 0 + info.PNIOPTCPStatus.OrangePeriodBegin = b & 0x7fffffff + b = binary.BigEndian.Uint32(o.Info[50:54]) + info.PNIOPTCPStatus.GreenPeriodValid = (b & 0x80000000) > 0 + info.PNIOPTCPStatus.GreenPeriodBegin = b & 0x7fffffff + } + } + return +} + +// LayerType returns gopacket.LayerTypeLinkLayerDiscoveryInfo. +func (c *LinkLayerDiscoveryInfo) LayerType() gopacket.LayerType { + return LayerTypeLinkLayerDiscoveryInfo +} + +func getCapabilities(v uint16) (c LLDPCapabilities) { + c.Other = (v&LLDPCapsOther > 0) + c.Repeater = (v&LLDPCapsRepeater > 0) + c.Bridge = (v&LLDPCapsBridge > 0) + c.WLANAP = (v&LLDPCapsWLANAP > 0) + c.Router = (v&LLDPCapsRouter > 0) + c.Phone = (v&LLDPCapsPhone > 0) + c.DocSis = (v&LLDPCapsDocSis > 0) + c.StationOnly = (v&LLDPCapsStationOnly > 0) + c.CVLAN = (v&LLDPCapsCVLAN > 0) + c.SVLAN = (v&LLDPCapsSVLAN > 0) + c.TMPR = (v&LLDPCapsTmpr > 0) + return +} + +func getEVBCapabilities(v uint16) (c LLDPEVBCapabilities) { + c.StandardBridging = (v & LLDPEVBCapsSTD) > 0 + c.StandardBridging = (v & LLDPEVBCapsSTD) > 0 + c.ReflectiveRelay = (v & LLDPEVBCapsRR) > 0 + c.RetransmissionTimerExponent = (v & LLDPEVBCapsRTE) > 0 + c.EdgeControlProtocol = (v & LLDPEVBCapsECP) > 0 + c.VSIDiscoveryProtocol = (v & LLDPEVBCapsVDP) > 0 + return +} + +func (t LLDPTLVType) String() (s string) { + switch t { + case LLDPTLVEnd: + s = "TLV End" + case LLDPTLVChassisID: + s = "Chassis ID" + case LLDPTLVPortID: + s = "Port ID" + case LLDPTLVTTL: + s = "TTL" + case LLDPTLVPortDescription: + s = "Port Description" + case LLDPTLVSysName: + s = "System Name" + case LLDPTLVSysDescription: + s = "System Description" + case LLDPTLVSysCapabilities: + s = "System Capabilities" + case LLDPTLVMgmtAddress: + s = "Management Address" + case LLDPTLVOrgSpecific: + s = "Organisation Specific" + default: + s = "Unknown" + } + return +} + +func (t LLDPChassisIDSubType) String() (s string) { + switch t { + case LLDPChassisIDSubTypeReserved: + s = "Reserved" + case LLDPChassisIDSubTypeChassisComp: + s = "Chassis Component" + case LLDPChassisIDSubtypeIfaceAlias: + s = "Interface Alias" + case LLDPChassisIDSubTypePortComp: + s = "Port Component" + case LLDPChassisIDSubTypeMACAddr: + s = "MAC Address" + case LLDPChassisIDSubTypeNetworkAddr: + s = "Network Address" + case LLDPChassisIDSubtypeIfaceName: + s = "Interface Name" + case LLDPChassisIDSubTypeLocal: + s = "Local" + default: + s = "Unknown" + } + return +} + +func (t LLDPPortIDSubType) String() (s string) { + switch t { + case LLDPPortIDSubtypeReserved: + s = "Reserved" + case LLDPPortIDSubtypeIfaceAlias: + s = "Interface Alias" + case LLDPPortIDSubtypePortComp: + s = "Port Component" + case LLDPPortIDSubtypeMACAddr: + s = "MAC Address" + case LLDPPortIDSubtypeNetworkAddr: + s = "Network Address" + case LLDPPortIDSubtypeIfaceName: + s = "Interface Name" + case LLDPPortIDSubtypeAgentCircuitID: + s = "Agent Circuit ID" + case LLDPPortIDSubtypeLocal: + s = "Local" + default: + s = "Unknown" + } + return +} + +func (t IANAAddressFamily) String() (s string) { + switch t { + case IANAAddressFamilyReserved: + s = "Reserved" + case IANAAddressFamilyIPV4: + s = "IPv4" + case IANAAddressFamilyIPV6: + s = "IPv6" + case IANAAddressFamilyNSAP: + s = "NSAP" + case IANAAddressFamilyHDLC: + s = "HDLC" + case IANAAddressFamilyBBN1822: + s = "BBN 1822" + case IANAAddressFamily802: + s = "802 media plus Ethernet 'canonical format'" + case IANAAddressFamilyE163: + s = "E.163" + case IANAAddressFamilyE164: + s = "E.164 (SMDS, Frame Relay, ATM)" + case IANAAddressFamilyF69: + s = "F.69 (Telex)" + case IANAAddressFamilyX121: + s = "X.121, X.25, Frame Relay" + case IANAAddressFamilyIPX: + s = "IPX" + case IANAAddressFamilyAtalk: + s = "Appletalk" + case IANAAddressFamilyDecnet: + s = "Decnet IV" + case IANAAddressFamilyBanyan: + s = "Banyan Vines" + case IANAAddressFamilyE164NSAP: + s = "E.164 with NSAP format subaddress" + case IANAAddressFamilyDNS: + s = "DNS" + case IANAAddressFamilyDistname: + s = "Distinguished Name" + case IANAAddressFamilyASNumber: + s = "AS Number" + case IANAAddressFamilyXTPIPV4: + s = "XTP over IP version 4" + case IANAAddressFamilyXTPIPV6: + s = "XTP over IP version 6" + case IANAAddressFamilyXTP: + s = "XTP native mode XTP" + case IANAAddressFamilyFcWWPN: + s = "Fibre Channel World-Wide Port Name" + case IANAAddressFamilyFcWWNN: + s = "Fibre Channel World-Wide Node Name" + case IANAAddressFamilyGWID: + s = "GWID" + case IANAAddressFamilyL2VPN: + s = "AFI for Layer 2 VPN" + default: + s = "Unknown" + } + return +} + +func (t LLDPInterfaceSubtype) String() (s string) { + switch t { + case LLDPInterfaceSubtypeUnknown: + s = "Unknown" + case LLDPInterfaceSubtypeifIndex: + s = "IfIndex" + case LLDPInterfaceSubtypeSysPort: + s = "System Port Number" + default: + s = "Unknown" + } + return +} + +func (t LLDPPowerType) String() (s string) { + switch t { + case 0: + s = "Type 2 PSE Device" + case 1: + s = "Type 2 PD Device" + case 2: + s = "Type 1 PSE Device" + case 3: + s = "Type 1 PD Device" + default: + s = "Unknown" + } + return +} + +func (t LLDPPowerSource) String() (s string) { + switch t { + // PD Device + case 0: + s = "Unknown" + case 1: + s = "PSE" + case 2: + s = "Local" + case 3: + s = "PSE and Local" + // PSE Device (Actual value + 128) + case 128: + s = "Unknown" + case 129: + s = "Primary Power Source" + case 130: + s = "Backup Power Source" + default: + s = "Unknown" + } + return +} + +func (t LLDPPowerPriority) String() (s string) { + switch t { + case 0: + s = "Unknown" + case 1: + s = "Critical" + case 2: + s = "High" + case 3: + s = "Low" + default: + s = "Unknown" + } + return +} + +func (t LLDPMediaSubtype) String() (s string) { + switch t { + case LLDPMediaTypeCapabilities: + s = "Media Capabilities " + case LLDPMediaTypeNetwork: + s = "Network Policy" + case LLDPMediaTypeLocation: + s = "Location Identification" + case LLDPMediaTypePower: + s = "Extended Power-via-MDI" + case LLDPMediaTypeHardware: + s = "Hardware Revision" + case LLDPMediaTypeFirmware: + s = "Firmware Revision" + case LLDPMediaTypeSoftware: + s = "Software Revision" + case LLDPMediaTypeSerial: + s = "Serial Number" + case LLDPMediaTypeManufacturer: + s = "Manufacturer" + case LLDPMediaTypeModel: + s = "Model" + case LLDPMediaTypeAssetID: + s = "Asset ID" + default: + s = "Unknown" + } + return +} + +func (t LLDPMediaClass) String() (s string) { + switch t { + case LLDPMediaClassUndefined: + s = "Undefined" + case LLDPMediaClassEndpointI: + s = "Endpoint Class I" + case LLDPMediaClassEndpointII: + s = "Endpoint Class II" + case LLDPMediaClassEndpointIII: + s = "Endpoint Class III" + case LLDPMediaClassNetwork: + s = "Network connectivity " + default: + s = "Unknown" + } + return +} + +func (t LLDPApplicationType) String() (s string) { + switch t { + case LLDPAppTypeReserved: + s = "Reserved" + case LLDPAppTypeVoice: + s = "Voice" + case LLDPappTypeVoiceSignaling: + s = "Voice Signaling" + case LLDPappTypeGuestVoice: + s = "Guest Voice" + case LLDPappTypeGuestVoiceSignaling: + s = "Guest Voice Signaling" + case LLDPappTypeSoftphoneVoice: + s = "Softphone Voice" + case LLDPappTypeVideoConferencing: + s = "Video Conferencing" + case LLDPappTypeStreamingVideo: + s = "Streaming Video" + case LLDPappTypeVideoSignaling: + s = "Video Signaling" + default: + s = "Unknown" + } + return +} + +func (t LLDPLocationFormat) String() (s string) { + switch t { + case LLDPLocationFormatInvalid: + s = "Invalid" + case LLDPLocationFormatCoordinate: + s = "Coordinate-based LCI" + case LLDPLocationFormatAddress: + s = "Address-based LCO" + case LLDPLocationFormatECS: + s = "ECS ELIN" + default: + s = "Unknown" + } + return +} + +func (t LLDPLocationAddressType) String() (s string) { + switch t { + case LLDPLocationAddressTypeLanguage: + s = "Language" + case LLDPLocationAddressTypeNational: + s = "National subdivisions (province, state, etc)" + case LLDPLocationAddressTypeCounty: + s = "County, parish, district" + case LLDPLocationAddressTypeCity: + s = "City, township" + case LLDPLocationAddressTypeCityDivision: + s = "City division, borough, ward" + case LLDPLocationAddressTypeNeighborhood: + s = "Neighborhood, block" + case LLDPLocationAddressTypeStreet: + s = "Street" + case LLDPLocationAddressTypeLeadingStreet: + s = "Leading street direction" + case LLDPLocationAddressTypeTrailingStreet: + s = "Trailing street suffix" + case LLDPLocationAddressTypeStreetSuffix: + s = "Street suffix" + case LLDPLocationAddressTypeHouseNum: + s = "House number" + case LLDPLocationAddressTypeHouseSuffix: + s = "House number suffix" + case LLDPLocationAddressTypeLandmark: + s = "Landmark or vanity address" + case LLDPLocationAddressTypeAdditional: + s = "Additional location information" + case LLDPLocationAddressTypeName: + s = "Name" + case LLDPLocationAddressTypePostal: + s = "Postal/ZIP code" + case LLDPLocationAddressTypeBuilding: + s = "Building" + case LLDPLocationAddressTypeUnit: + s = "Unit" + case LLDPLocationAddressTypeFloor: + s = "Floor" + case LLDPLocationAddressTypeRoom: + s = "Room number" + case LLDPLocationAddressTypePlace: + s = "Place type" + case LLDPLocationAddressTypeScript: + s = "Script" + default: + s = "Unknown" + } + return +} + +func checkLLDPTLVLen(v LinkLayerDiscoveryValue, l int) (err error) { + if len(v.Value) < l { + err = fmt.Errorf("Invalid TLV %v length %d (wanted mimimum %v", v.Type, len(v.Value), l) + } + return +} + +func checkLLDPOrgSpecificLen(o LLDPOrgSpecificTLV, l int) (err error) { + if len(o.Info) < l { + err = fmt.Errorf("Invalid Org Specific TLV %v length %d (wanted minimum %v)", o.SubType, len(o.Info), l) + } + return +} diff --git a/vendor/github.com/google/gopacket/layers/loopback.go b/vendor/github.com/google/gopacket/layers/loopback.go new file mode 100644 index 0000000..839f760 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/loopback.go @@ -0,0 +1,80 @@ +// 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 layers + +import ( + "encoding/binary" + "errors" + "fmt" + + "github.com/google/gopacket" +) + +// Loopback contains the header for loopback encapsulation. This header is +// used by both BSD and OpenBSD style loopback decoding (pcap's DLT_NULL +// and DLT_LOOP, respectively). +type Loopback struct { + BaseLayer + Family ProtocolFamily +} + +// LayerType returns LayerTypeLoopback. +func (l *Loopback) LayerType() gopacket.LayerType { return LayerTypeLoopback } + +// DecodeFromBytes decodes the given bytes into this layer. +func (l *Loopback) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + if len(data) < 4 { + return errors.New("Loopback packet too small") + } + + // The protocol could be either big-endian or little-endian, we're + // not sure. But we're PRETTY sure that the value is less than + // 256, so we can check the first two bytes. + var prot uint32 + if data[0] == 0 && data[1] == 0 { + prot = binary.BigEndian.Uint32(data[:4]) + } else { + prot = binary.LittleEndian.Uint32(data[:4]) + } + if prot > 0xFF { + return fmt.Errorf("Invalid loopback protocol %q", data[:4]) + } + + l.Family = ProtocolFamily(prot) + l.BaseLayer = BaseLayer{data[:4], data[4:]} + return nil +} + +// CanDecode returns the set of layer types that this DecodingLayer can decode. +func (l *Loopback) CanDecode() gopacket.LayerClass { + return LayerTypeLoopback +} + +// NextLayerType returns the layer type contained by this DecodingLayer. +func (l *Loopback) NextLayerType() gopacket.LayerType { + return l.Family.LayerType() +} + +// SerializeTo writes the serialized form of this layer into the +// SerializationBuffer, implementing gopacket.SerializableLayer. +func (l *Loopback) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + bytes, err := b.PrependBytes(4) + if err != nil { + return err + } + binary.LittleEndian.PutUint32(bytes, uint32(l.Family)) + return nil +} + +func decodeLoopback(data []byte, p gopacket.PacketBuilder) error { + l := Loopback{} + if err := l.DecodeFromBytes(data, gopacket.NilDecodeFeedback); err != nil { + return err + } + p.AddLayer(&l) + return p.NextDecoder(l.Family) +} diff --git a/vendor/github.com/google/gopacket/layers/mpls.go b/vendor/github.com/google/gopacket/layers/mpls.go new file mode 100644 index 0000000..83079a0 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/mpls.go @@ -0,0 +1,87 @@ +// 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 layers + +import ( + "encoding/binary" + "errors" + "github.com/google/gopacket" +) + +// MPLS is the MPLS packet header. +type MPLS struct { + BaseLayer + Label uint32 + TrafficClass uint8 + StackBottom bool + TTL uint8 +} + +// LayerType returns gopacket.LayerTypeMPLS. +func (m *MPLS) LayerType() gopacket.LayerType { return LayerTypeMPLS } + +// ProtocolGuessingDecoder attempts to guess the protocol of the bytes it's +// given, then decode the packet accordingly. Its algorithm for guessing is: +// If the packet starts with byte 0x45-0x4F: IPv4 +// If the packet starts with byte 0x60-0x6F: IPv6 +// Otherwise: Error +// See draft-hsmit-isis-aal5mux-00.txt for more detail on this approach. +type ProtocolGuessingDecoder struct{} + +func (ProtocolGuessingDecoder) Decode(data []byte, p gopacket.PacketBuilder) error { + switch data[0] { + // 0x40 | header_len, where header_len is at least 5. + case 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f: + return decodeIPv4(data, p) + // IPv6 can start with any byte whose first 4 bits are 0x6. + case 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f: + return decodeIPv6(data, p) + } + return errors.New("Unable to guess protocol of packet data") +} + +// MPLSPayloadDecoder is the decoder used to data encapsulated by each MPLS +// layer. MPLS contains no type information, so we have to explicitly decide +// which decoder to use. This is initially set to ProtocolGuessingDecoder, our +// simple attempt at guessing protocols based on the first few bytes of data +// available to us. However, if you know that in your environment MPLS always +// encapsulates a specific protocol, you may reset this. +var MPLSPayloadDecoder gopacket.Decoder = ProtocolGuessingDecoder{} + +func decodeMPLS(data []byte, p gopacket.PacketBuilder) error { + decoded := binary.BigEndian.Uint32(data[:4]) + mpls := &MPLS{ + Label: decoded >> 12, + TrafficClass: uint8(decoded>>9) & 0x7, + StackBottom: decoded&0x100 != 0, + TTL: uint8(decoded), + BaseLayer: BaseLayer{data[:4], data[4:]}, + } + p.AddLayer(mpls) + if mpls.StackBottom { + return p.NextDecoder(MPLSPayloadDecoder) + } + return p.NextDecoder(gopacket.DecodeFunc(decodeMPLS)) +} + +// SerializeTo writes the serialized form of this layer into the +// SerializationBuffer, implementing gopacket.SerializableLayer. +// See the docs for gopacket.SerializableLayer for more info. +func (m *MPLS) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + bytes, err := b.PrependBytes(4) + if err != nil { + return err + } + encoded := m.Label << 12 + encoded |= uint32(m.TrafficClass) << 9 + encoded |= uint32(m.TTL) + if m.StackBottom { + encoded |= 0x100 + } + binary.BigEndian.PutUint32(bytes, encoded) + return nil +} diff --git a/vendor/github.com/google/gopacket/layers/mpls_test.go b/vendor/github.com/google/gopacket/layers/mpls_test.go new file mode 100644 index 0000000..e0a2b95 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/mpls_test.go @@ -0,0 +1,96 @@ +// Copyright 2016 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 layers + +import ( + "reflect" + "testing" + + "github.com/google/gopacket" +) + +// testPacketMPLS +// Ethernet II, Src: cc:15:14:64:00:00 (cc:15:14:64:00:00), Dst: cc:13:14:64:00:01 (cc:13:14:64:00:01) +// MultiProtocol Label Switching Header, Label: 17, Exp: 0, S: 0, TTL: 254 +// MultiProtocol Label Switching Header, Label: 19, Exp: 0, S: 1, TTL: 254 +// Internet Protocol Version 4, Src: 12.0.0.1, Dst: 2.2.2.2 +// Internet Control Message Protocol +// 0000 cc 13 14 64 00 01 cc 15 14 64 00 00 88 47 00 01 ...d.....d...G.. +// 0010 10 fe 00 01 31 fe 45 00 00 64 00 39 00 00 fe 01 ....1.E..d.9.... +// 0020 ac 5b 0c 00 00 01 02 02 02 02 08 00 3a 6b 00 0b .[..........:k.. +// 0030 00 02 00 00 00 00 00 3e 43 94 ab cd ab cd ab cd .......>C....... +// 0040 ab cd ab cd ab cd ab cd ab cd ab cd ab cd ab cd ................ +// 0050 ab cd ab cd ab cd ab cd ab cd ab cd ab cd ab cd ................ +// 0060 ab cd ab cd ab cd ab cd ab cd ab cd ab cd ab cd ................ +// 0070 ab cd ab cd ab cd ab cd ab cd .......... + +var testPacketMPLS = []byte{ + 0xcc, 0x13, 0x14, 0x64, 0x00, 0x01, 0xcc, 0x15, 0x14, 0x64, 0x00, 0x00, 0x88, 0x47, 0x00, 0x01, + 0x10, 0xfe, 0x00, 0x01, 0x31, 0xfe, 0x45, 0x00, 0x00, 0x64, 0x00, 0x39, 0x00, 0x00, 0xfe, 0x01, + 0xac, 0x5b, 0x0c, 0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x08, 0x00, 0x3a, 0x6b, 0x00, 0x0b, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x43, 0x94, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, + 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, + 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, + 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, + 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, +} + +func TestPacketMPLS(t *testing.T) { + p := gopacket.NewPacket(testPacketMPLS, LinkTypeEthernet, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeEthernet, LayerTypeMPLS, LayerTypeMPLS, LayerTypeIPv4, LayerTypeICMPv4, gopacket.LayerTypePayload}, t) + if got, ok := p.Layers()[1].(*MPLS); ok { + want := &MPLS{ + BaseLayer: BaseLayer{ + Contents: []byte{0x00, 0x01, 0x10, 0xfe}, + Payload: []byte{0x00, 0x01, 0x31, 0xfe, 0x45, 0x00, 0x00, 0x64, 0x00, 0x39, 0x00, 0x00, 0xfe, 0x01, + 0xac, 0x5b, 0x0c, 0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x08, 0x00, 0x3a, 0x6b, 0x00, 0x0b, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x43, 0x94, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, + 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, + 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, + 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, + 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd}, + }, + Label: 17, + TrafficClass: 0, + StackBottom: false, + TTL: 254, + } + if !reflect.DeepEqual(want, got) { + t.Errorf("MPLS layer 1 mismatch, \nwant %#v\ngot %#v\n", want, got) + } + } + if got, ok := p.Layers()[2].(*MPLS); ok { + want := &MPLS{ + BaseLayer: BaseLayer{ + Contents: []byte{0x00, 0x01, 0x31, 0xfe}, + Payload: []byte{0x45, 0x00, 0x00, 0x64, 0x00, 0x39, 0x00, 0x00, 0xfe, 0x01, + 0xac, 0x5b, 0x0c, 0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x08, 0x00, 0x3a, 0x6b, 0x00, 0x0b, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x43, 0x94, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, + 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, + 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, + 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, + 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd}, + }, + Label: 19, + TrafficClass: 0, + StackBottom: true, + TTL: 254, + } + if !reflect.DeepEqual(want, got) { + t.Errorf("MPLS layer 2 mismatch, \nwant %#v\ngot %#v\n", want, got) + } + } +} + +func BenchmarkDecodePacketMPLS(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testPacketMPLS, LinkTypeEthernet, gopacket.NoCopy) + } +} diff --git a/vendor/github.com/google/gopacket/layers/ndp.go b/vendor/github.com/google/gopacket/layers/ndp.go new file mode 100644 index 0000000..f7ca1b2 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/ndp.go @@ -0,0 +1,611 @@ +// 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. + +// Enum types courtesy of... +// http://anonsvn.wireshark.org/wireshark/trunk/epan/dissectors/packet-ndp.c + +package layers + +import ( + "fmt" + "github.com/google/gopacket" + "net" +) + +type NDPChassisType uint8 + +// Nortel Chassis Types +const ( + NDPChassisother NDPChassisType = 1 + NDPChassis3000 NDPChassisType = 2 + NDPChassis3030 NDPChassisType = 3 + NDPChassis2310 NDPChassisType = 4 + NDPChassis2810 NDPChassisType = 5 + NDPChassis2912 NDPChassisType = 6 + NDPChassis2914 NDPChassisType = 7 + NDPChassis271x NDPChassisType = 8 + NDPChassis2813 NDPChassisType = 9 + NDPChassis2814 NDPChassisType = 10 + NDPChassis2915 NDPChassisType = 11 + NDPChassis5000 NDPChassisType = 12 + NDPChassis2813SA NDPChassisType = 13 + NDPChassis2814SA NDPChassisType = 14 + NDPChassis810M NDPChassisType = 15 + NDPChassisEthercell NDPChassisType = 16 + NDPChassis5005 NDPChassisType = 17 + NDPChassisAlcatelEWC NDPChassisType = 18 + NDPChassis2715SA NDPChassisType = 20 + NDPChassis2486 NDPChassisType = 21 + NDPChassis28000series NDPChassisType = 22 + NDPChassis23000series NDPChassisType = 23 + NDPChassis5DN00xseries NDPChassisType = 24 + NDPChassisBayStackEthernet NDPChassisType = 25 + NDPChassis23100series NDPChassisType = 26 + NDPChassis100BaseTHub NDPChassisType = 27 + NDPChassis3000FastEthernet NDPChassisType = 28 + NDPChassisOrionSwitch NDPChassisType = 29 + NDPChassisDDS NDPChassisType = 31 + NDPChassisCentillion6slot NDPChassisType = 32 + NDPChassisCentillion12slot NDPChassisType = 33 + NDPChassisCentillion1slot NDPChassisType = 34 + NDPChassisBayStack301 NDPChassisType = 35 + NDPChassisBayStackTokenRingHub NDPChassisType = 36 + NDPChassisFVCMultimediaSwitch NDPChassisType = 37 + NDPChassisSwitchNode NDPChassisType = 38 + NDPChassisBayStack302Switch NDPChassisType = 39 + NDPChassisBayStack350Switch NDPChassisType = 40 + NDPChassisBayStack150EthernetHub NDPChassisType = 41 + NDPChassisCentillion50NSwitch NDPChassisType = 42 + NDPChassisCentillion50TSwitch NDPChassisType = 43 + NDPChassisBayStack303304Switches NDPChassisType = 44 + NDPChassisBayStack200EthernetHub NDPChassisType = 45 + NDPChassisBayStack25010100EthernetHub NDPChassisType = 46 + NDPChassisBayStack450101001000Switches NDPChassisType = 48 + NDPChassisBayStack41010100Switches NDPChassisType = 49 + NDPChassisPassport1200L3Switch NDPChassisType = 50 + NDPChassisPassport1250L3Switch NDPChassisType = 51 + NDPChassisPassport1100L3Switch NDPChassisType = 52 + NDPChassisPassport1150L3Switch NDPChassisType = 53 + NDPChassisPassport1050L3Switch NDPChassisType = 54 + NDPChassisPassport1051L3Switch NDPChassisType = 55 + NDPChassisPassport8610L3Switch NDPChassisType = 56 + NDPChassisPassport8606L3Switch NDPChassisType = 57 + NDPChassisPassport8010 NDPChassisType = 58 + NDPChassisPassport8006 NDPChassisType = 59 + NDPChassisBayStack670wirelessaccesspoint NDPChassisType = 60 + NDPChassisPassport740 NDPChassisType = 61 + NDPChassisPassport750 NDPChassisType = 62 + NDPChassisPassport790 NDPChassisType = 63 + NDPChassisBusinessPolicySwitch200010100Switches NDPChassisType = 64 + NDPChassisPassport8110L2Switch NDPChassisType = 65 + NDPChassisPassport8106L2Switch NDPChassisType = 66 + NDPChassisBayStack3580GigSwitch NDPChassisType = 67 + NDPChassisBayStack10PowerSupplyUnit NDPChassisType = 68 + NDPChassisBayStack42010100Switch NDPChassisType = 69 + NDPChassisOPTeraMetro1200EthernetServiceModule NDPChassisType = 70 + NDPChassisOPTera8010co NDPChassisType = 71 + NDPChassisOPTera8610coL3Switch NDPChassisType = 72 + NDPChassisOPTera8110coL2Switch NDPChassisType = 73 + NDPChassisOPTera8003 NDPChassisType = 74 + NDPChassisOPTera8603L3Switch NDPChassisType = 75 + NDPChassisOPTera8103L2Switch NDPChassisType = 76 + NDPChassisBayStack380101001000Switch NDPChassisType = 77 + NDPChassisEthernetSwitch47048T NDPChassisType = 78 + NDPChassisOPTeraMetro1450EthernetServiceModule NDPChassisType = 79 + NDPChassisOPTeraMetro1400EthernetServiceModule NDPChassisType = 80 + NDPChassisAlteonSwitchFamily NDPChassisType = 81 + NDPChassisEthernetSwitch46024TPWR NDPChassisType = 82 + NDPChassisOPTeraMetro8010OPML2Switch NDPChassisType = 83 + NDPChassisOPTeraMetro8010coOPML2Switch NDPChassisType = 84 + NDPChassisOPTeraMetro8006OPML2Switch NDPChassisType = 85 + NDPChassisOPTeraMetro8003OPML2Switch NDPChassisType = 86 + NDPChassisAlteon180e NDPChassisType = 87 + NDPChassisAlteonAD3 NDPChassisType = 88 + NDPChassisAlteon184 NDPChassisType = 89 + NDPChassisAlteonAD4 NDPChassisType = 90 + NDPChassisPassport1424L3Switch NDPChassisType = 91 + NDPChassisPassport1648L3Switch NDPChassisType = 92 + NDPChassisPassport1612L3Switch NDPChassisType = 93 + NDPChassisPassport1624L3Switch NDPChassisType = 94 + NDPChassisBayStack38024FFiber1000Switch NDPChassisType = 95 + NDPChassisEthernetRoutingSwitch551024T NDPChassisType = 96 + NDPChassisEthernetRoutingSwitch551048T NDPChassisType = 97 + NDPChassisEthernetSwitch47024T NDPChassisType = 98 + NDPChassisNortelNetworksWirelessLANAccessPoint2220 NDPChassisType = 99 + NDPChassisPassportRBS2402L3Switch NDPChassisType = 100 + NDPChassisAlteonApplicationSwitch2424 NDPChassisType = 101 + NDPChassisAlteonApplicationSwitch2224 NDPChassisType = 102 + NDPChassisAlteonApplicationSwitch2208 NDPChassisType = 103 + NDPChassisAlteonApplicationSwitch2216 NDPChassisType = 104 + NDPChassisAlteonApplicationSwitch3408 NDPChassisType = 105 + NDPChassisAlteonApplicationSwitch3416 NDPChassisType = 106 + NDPChassisNortelNetworksWirelessLANSecuritySwitch2250 NDPChassisType = 107 + NDPChassisEthernetSwitch42548T NDPChassisType = 108 + NDPChassisEthernetSwitch42524T NDPChassisType = 109 + NDPChassisNortelNetworksWirelessLANAccessPoint2221 NDPChassisType = 110 + NDPChassisNortelMetroEthernetServiceUnit24TSPFswitch NDPChassisType = 111 + NDPChassisNortelMetroEthernetServiceUnit24TLXDCswitch NDPChassisType = 112 + NDPChassisPassport830010slotchassis NDPChassisType = 113 + NDPChassisPassport83006slotchassis NDPChassisType = 114 + NDPChassisEthernetRoutingSwitch552024TPWR NDPChassisType = 115 + NDPChassisEthernetRoutingSwitch552048TPWR NDPChassisType = 116 + NDPChassisNortelNetworksVPNGateway3050 NDPChassisType = 117 + NDPChassisAlteonSSL31010100 NDPChassisType = 118 + NDPChassisAlteonSSL31010100Fiber NDPChassisType = 119 + NDPChassisAlteonSSL31010100FIPS NDPChassisType = 120 + NDPChassisAlteonSSL410101001000 NDPChassisType = 121 + NDPChassisAlteonSSL410101001000Fiber NDPChassisType = 122 + NDPChassisAlteonApplicationSwitch2424SSL NDPChassisType = 123 + NDPChassisEthernetSwitch32524T NDPChassisType = 124 + NDPChassisEthernetSwitch32524G NDPChassisType = 125 + NDPChassisNortelNetworksWirelessLANAccessPoint2225 NDPChassisType = 126 + NDPChassisNortelNetworksWirelessLANSecuritySwitch2270 NDPChassisType = 127 + NDPChassis24portEthernetSwitch47024TPWR NDPChassisType = 128 + NDPChassis48portEthernetSwitch47048TPWR NDPChassisType = 129 + NDPChassisEthernetRoutingSwitch553024TFD NDPChassisType = 130 + NDPChassisEthernetSwitch351024T NDPChassisType = 131 + NDPChassisNortelMetroEthernetServiceUnit12GACL3Switch NDPChassisType = 132 + NDPChassisNortelMetroEthernetServiceUnit12GDCL3Switch NDPChassisType = 133 + NDPChassisNortelSecureAccessSwitch NDPChassisType = 134 + NDPChassisNortelNetworksVPNGateway3070 NDPChassisType = 135 + NDPChassisOPTeraMetro3500 NDPChassisType = 136 + NDPChassisSMBBES101024T NDPChassisType = 137 + NDPChassisSMBBES101048T NDPChassisType = 138 + NDPChassisSMBBES102024TPWR NDPChassisType = 139 + NDPChassisSMBBES102048TPWR NDPChassisType = 140 + NDPChassisSMBBES201024T NDPChassisType = 141 + NDPChassisSMBBES201048T NDPChassisType = 142 + NDPChassisSMBBES202024TPWR NDPChassisType = 143 + NDPChassisSMBBES202048TPWR NDPChassisType = 144 + NDPChassisSMBBES11024T NDPChassisType = 145 + NDPChassisSMBBES11048T NDPChassisType = 146 + NDPChassisSMBBES12024TPWR NDPChassisType = 147 + NDPChassisSMBBES12048TPWR NDPChassisType = 148 + NDPChassisSMBBES21024T NDPChassisType = 149 + NDPChassisSMBBES21048T NDPChassisType = 150 + NDPChassisSMBBES22024TPWR NDPChassisType = 151 + NDPChassisSMBBES22048TPWR NDPChassisType = 152 + NDPChassisOME6500 NDPChassisType = 153 + NDPChassisEthernetRoutingSwitch4548GT NDPChassisType = 154 + NDPChassisEthernetRoutingSwitch4548GTPWR NDPChassisType = 155 + NDPChassisEthernetRoutingSwitch4550T NDPChassisType = 156 + NDPChassisEthernetRoutingSwitch4550TPWR NDPChassisType = 157 + NDPChassisEthernetRoutingSwitch4526FX NDPChassisType = 158 + NDPChassisEthernetRoutingSwitch250026T NDPChassisType = 159 + NDPChassisEthernetRoutingSwitch250026TPWR NDPChassisType = 160 + NDPChassisEthernetRoutingSwitch250050T NDPChassisType = 161 + NDPChassisEthernetRoutingSwitch250050TPWR NDPChassisType = 162 +) + +type NDPBackplaneType uint8 + +// Nortel Backplane Types +const ( + NDPBackplaneOther NDPBackplaneType = 1 + NDPBackplaneEthernet NDPBackplaneType = 2 + NDPBackplaneEthernetTokenring NDPBackplaneType = 3 + NDPBackplaneEthernetFDDI NDPBackplaneType = 4 + NDPBackplaneEthernetTokenringFDDI NDPBackplaneType = 5 + NDPBackplaneEthernetTokenringRedundantPower NDPBackplaneType = 6 + NDPBackplaneEthernetTokenringFDDIRedundantPower NDPBackplaneType = 7 + NDPBackplaneTokenRing NDPBackplaneType = 8 + NDPBackplaneEthernetTokenringFastEthernet NDPBackplaneType = 9 + NDPBackplaneEthernetFastEthernet NDPBackplaneType = 10 + NDPBackplaneEthernetTokenringFastEthernetRedundantPower NDPBackplaneType = 11 + NDPBackplaneEthernetFastEthernetGigabitEthernet NDPBackplaneType = 12 +) + +type NDPState uint8 + +// Device State +const ( + NDPStateTopology NDPState = 1 + NDPStateHeartbeat NDPState = 2 + NDPStateNew NDPState = 3 +) + +// NortelDiscovery is a packet layer containing the Nortel Discovery Protocol. +type NortelDiscovery struct { + BaseLayer + IPAddress net.IP + SegmentID []byte + Chassis NDPChassisType + Backplane NDPBackplaneType + State NDPState + NumLinks uint8 +} + +// LayerType returns gopacket.LayerTypeNortelDiscovery. +func (c *NortelDiscovery) LayerType() gopacket.LayerType { + return LayerTypeNortelDiscovery +} + +func decodeNortelDiscovery(data []byte, p gopacket.PacketBuilder) error { + c := &NortelDiscovery{} + if len(data) < 11 { + return fmt.Errorf("Invalid NortelDiscovery packet length %d", len(data)) + } + c.IPAddress = data[0:4] + c.SegmentID = data[4:7] + c.Chassis = NDPChassisType(data[7]) + c.Backplane = NDPBackplaneType(data[8]) + c.State = NDPState(data[9]) + c.NumLinks = uint8(data[10]) + p.AddLayer(c) + return nil +} + +func (t NDPChassisType) String() (s string) { + switch t { + case NDPChassisother: + s = "other" + case NDPChassis3000: + s = "3000" + case NDPChassis3030: + s = "3030" + case NDPChassis2310: + s = "2310" + case NDPChassis2810: + s = "2810" + case NDPChassis2912: + s = "2912" + case NDPChassis2914: + s = "2914" + case NDPChassis271x: + s = "271x" + case NDPChassis2813: + s = "2813" + case NDPChassis2814: + s = "2814" + case NDPChassis2915: + s = "2915" + case NDPChassis5000: + s = "5000" + case NDPChassis2813SA: + s = "2813SA" + case NDPChassis2814SA: + s = "2814SA" + case NDPChassis810M: + s = "810M" + case NDPChassisEthercell: + s = "Ethercell" + case NDPChassis5005: + s = "5005" + case NDPChassisAlcatelEWC: + s = "Alcatel Ethernet workgroup conc." + case NDPChassis2715SA: + s = "2715SA" + case NDPChassis2486: + s = "2486" + case NDPChassis28000series: + s = "28000 series" + case NDPChassis23000series: + s = "23000 series" + case NDPChassis5DN00xseries: + s = "5DN00x series" + case NDPChassisBayStackEthernet: + s = "BayStack Ethernet" + case NDPChassis23100series: + s = "23100 series" + case NDPChassis100BaseTHub: + s = "100Base-T Hub" + case NDPChassis3000FastEthernet: + s = "3000 Fast Ethernet" + case NDPChassisOrionSwitch: + s = "Orion switch" + case NDPChassisDDS: + s = "DDS" + case NDPChassisCentillion6slot: + s = "Centillion (6 slot)" + case NDPChassisCentillion12slot: + s = "Centillion (12 slot)" + case NDPChassisCentillion1slot: + s = "Centillion (1 slot)" + case NDPChassisBayStack301: + s = "BayStack 301" + case NDPChassisBayStackTokenRingHub: + s = "BayStack TokenRing Hub" + case NDPChassisFVCMultimediaSwitch: + s = "FVC Multimedia Switch" + case NDPChassisSwitchNode: + s = "Switch Node" + case NDPChassisBayStack302Switch: + s = "BayStack 302 Switch" + case NDPChassisBayStack350Switch: + s = "BayStack 350 Switch" + case NDPChassisBayStack150EthernetHub: + s = "BayStack 150 Ethernet Hub" + case NDPChassisCentillion50NSwitch: + s = "Centillion 50N switch" + case NDPChassisCentillion50TSwitch: + s = "Centillion 50T switch" + case NDPChassisBayStack303304Switches: + s = "BayStack 303 and 304 Switches" + case NDPChassisBayStack200EthernetHub: + s = "BayStack 200 Ethernet Hub" + case NDPChassisBayStack25010100EthernetHub: + s = "BayStack 250 10/100 Ethernet Hub" + case NDPChassisBayStack450101001000Switches: + s = "BayStack 450 10/100/1000 Switches" + case NDPChassisBayStack41010100Switches: + s = "BayStack 410 10/100 Switches" + case NDPChassisPassport1200L3Switch: + s = "Passport 1200 L3 Switch" + case NDPChassisPassport1250L3Switch: + s = "Passport 1250 L3 Switch" + case NDPChassisPassport1100L3Switch: + s = "Passport 1100 L3 Switch" + case NDPChassisPassport1150L3Switch: + s = "Passport 1150 L3 Switch" + case NDPChassisPassport1050L3Switch: + s = "Passport 1050 L3 Switch" + case NDPChassisPassport1051L3Switch: + s = "Passport 1051 L3 Switch" + case NDPChassisPassport8610L3Switch: + s = "Passport 8610 L3 Switch" + case NDPChassisPassport8606L3Switch: + s = "Passport 8606 L3 Switch" + case NDPChassisPassport8010: + s = "Passport 8010" + case NDPChassisPassport8006: + s = "Passport 8006" + case NDPChassisBayStack670wirelessaccesspoint: + s = "BayStack 670 wireless access point" + case NDPChassisPassport740: + s = "Passport 740" + case NDPChassisPassport750: + s = "Passport 750" + case NDPChassisPassport790: + s = "Passport 790" + case NDPChassisBusinessPolicySwitch200010100Switches: + s = "Business Policy Switch 2000 10/100 Switches" + case NDPChassisPassport8110L2Switch: + s = "Passport 8110 L2 Switch" + case NDPChassisPassport8106L2Switch: + s = "Passport 8106 L2 Switch" + case NDPChassisBayStack3580GigSwitch: + s = "BayStack 3580 Gig Switch" + case NDPChassisBayStack10PowerSupplyUnit: + s = "BayStack 10 Power Supply Unit" + case NDPChassisBayStack42010100Switch: + s = "BayStack 420 10/100 Switch" + case NDPChassisOPTeraMetro1200EthernetServiceModule: + s = "OPTera Metro 1200 Ethernet Service Module" + case NDPChassisOPTera8010co: + s = "OPTera 8010co" + case NDPChassisOPTera8610coL3Switch: + s = "OPTera 8610co L3 switch" + case NDPChassisOPTera8110coL2Switch: + s = "OPTera 8110co L2 switch" + case NDPChassisOPTera8003: + s = "OPTera 8003" + case NDPChassisOPTera8603L3Switch: + s = "OPTera 8603 L3 switch" + case NDPChassisOPTera8103L2Switch: + s = "OPTera 8103 L2 switch" + case NDPChassisBayStack380101001000Switch: + s = "BayStack 380 10/100/1000 Switch" + case NDPChassisEthernetSwitch47048T: + s = "Ethernet Switch 470-48T" + case NDPChassisOPTeraMetro1450EthernetServiceModule: + s = "OPTera Metro 1450 Ethernet Service Module" + case NDPChassisOPTeraMetro1400EthernetServiceModule: + s = "OPTera Metro 1400 Ethernet Service Module" + case NDPChassisAlteonSwitchFamily: + s = "Alteon Switch Family" + case NDPChassisEthernetSwitch46024TPWR: + s = "Ethernet Switch 460-24T-PWR" + case NDPChassisOPTeraMetro8010OPML2Switch: + s = "OPTera Metro 8010 OPM L2 Switch" + case NDPChassisOPTeraMetro8010coOPML2Switch: + s = "OPTera Metro 8010co OPM L2 Switch" + case NDPChassisOPTeraMetro8006OPML2Switch: + s = "OPTera Metro 8006 OPM L2 Switch" + case NDPChassisOPTeraMetro8003OPML2Switch: + s = "OPTera Metro 8003 OPM L2 Switch" + case NDPChassisAlteon180e: + s = "Alteon 180e" + case NDPChassisAlteonAD3: + s = "Alteon AD3" + case NDPChassisAlteon184: + s = "Alteon 184" + case NDPChassisAlteonAD4: + s = "Alteon AD4" + case NDPChassisPassport1424L3Switch: + s = "Passport 1424 L3 switch" + case NDPChassisPassport1648L3Switch: + s = "Passport 1648 L3 switch" + case NDPChassisPassport1612L3Switch: + s = "Passport 1612 L3 switch" + case NDPChassisPassport1624L3Switch: + s = "Passport 1624 L3 switch" + case NDPChassisBayStack38024FFiber1000Switch: + s = "BayStack 380-24F Fiber 1000 Switch" + case NDPChassisEthernetRoutingSwitch551024T: + s = "Ethernet Routing Switch 5510-24T" + case NDPChassisEthernetRoutingSwitch551048T: + s = "Ethernet Routing Switch 5510-48T" + case NDPChassisEthernetSwitch47024T: + s = "Ethernet Switch 470-24T" + case NDPChassisNortelNetworksWirelessLANAccessPoint2220: + s = "Nortel Networks Wireless LAN Access Point 2220" + case NDPChassisPassportRBS2402L3Switch: + s = "Passport RBS 2402 L3 switch" + case NDPChassisAlteonApplicationSwitch2424: + s = "Alteon Application Switch 2424" + case NDPChassisAlteonApplicationSwitch2224: + s = "Alteon Application Switch 2224" + case NDPChassisAlteonApplicationSwitch2208: + s = "Alteon Application Switch 2208" + case NDPChassisAlteonApplicationSwitch2216: + s = "Alteon Application Switch 2216" + case NDPChassisAlteonApplicationSwitch3408: + s = "Alteon Application Switch 3408" + case NDPChassisAlteonApplicationSwitch3416: + s = "Alteon Application Switch 3416" + case NDPChassisNortelNetworksWirelessLANSecuritySwitch2250: + s = "Nortel Networks Wireless LAN SecuritySwitch 2250" + case NDPChassisEthernetSwitch42548T: + s = "Ethernet Switch 425-48T" + case NDPChassisEthernetSwitch42524T: + s = "Ethernet Switch 425-24T" + case NDPChassisNortelNetworksWirelessLANAccessPoint2221: + s = "Nortel Networks Wireless LAN Access Point 2221" + case NDPChassisNortelMetroEthernetServiceUnit24TSPFswitch: + s = "Nortel Metro Ethernet Service Unit 24-T SPF switch" + case NDPChassisNortelMetroEthernetServiceUnit24TLXDCswitch: + s = " Nortel Metro Ethernet Service Unit 24-T LX DC switch" + case NDPChassisPassport830010slotchassis: + s = "Passport 8300 10-slot chassis" + case NDPChassisPassport83006slotchassis: + s = "Passport 8300 6-slot chassis" + case NDPChassisEthernetRoutingSwitch552024TPWR: + s = "Ethernet Routing Switch 5520-24T-PWR" + case NDPChassisEthernetRoutingSwitch552048TPWR: + s = "Ethernet Routing Switch 5520-48T-PWR" + case NDPChassisNortelNetworksVPNGateway3050: + s = "Nortel Networks VPN Gateway 3050" + case NDPChassisAlteonSSL31010100: + s = "Alteon SSL 310 10/100" + case NDPChassisAlteonSSL31010100Fiber: + s = "Alteon SSL 310 10/100 Fiber" + case NDPChassisAlteonSSL31010100FIPS: + s = "Alteon SSL 310 10/100 FIPS" + case NDPChassisAlteonSSL410101001000: + s = "Alteon SSL 410 10/100/1000" + case NDPChassisAlteonSSL410101001000Fiber: + s = "Alteon SSL 410 10/100/1000 Fiber" + case NDPChassisAlteonApplicationSwitch2424SSL: + s = "Alteon Application Switch 2424-SSL" + case NDPChassisEthernetSwitch32524T: + s = "Ethernet Switch 325-24T" + case NDPChassisEthernetSwitch32524G: + s = "Ethernet Switch 325-24G" + case NDPChassisNortelNetworksWirelessLANAccessPoint2225: + s = "Nortel Networks Wireless LAN Access Point 2225" + case NDPChassisNortelNetworksWirelessLANSecuritySwitch2270: + s = "Nortel Networks Wireless LAN SecuritySwitch 2270" + case NDPChassis24portEthernetSwitch47024TPWR: + s = "24-port Ethernet Switch 470-24T-PWR" + case NDPChassis48portEthernetSwitch47048TPWR: + s = "48-port Ethernet Switch 470-48T-PWR" + case NDPChassisEthernetRoutingSwitch553024TFD: + s = "Ethernet Routing Switch 5530-24TFD" + case NDPChassisEthernetSwitch351024T: + s = "Ethernet Switch 3510-24T" + case NDPChassisNortelMetroEthernetServiceUnit12GACL3Switch: + s = "Nortel Metro Ethernet Service Unit 12G AC L3 switch" + case NDPChassisNortelMetroEthernetServiceUnit12GDCL3Switch: + s = "Nortel Metro Ethernet Service Unit 12G DC L3 switch" + case NDPChassisNortelSecureAccessSwitch: + s = "Nortel Secure Access Switch" + case NDPChassisNortelNetworksVPNGateway3070: + s = "Nortel Networks VPN Gateway 3070" + case NDPChassisOPTeraMetro3500: + s = "OPTera Metro 3500" + case NDPChassisSMBBES101024T: + s = "SMB BES 1010 24T" + case NDPChassisSMBBES101048T: + s = "SMB BES 1010 48T" + case NDPChassisSMBBES102024TPWR: + s = "SMB BES 1020 24T PWR" + case NDPChassisSMBBES102048TPWR: + s = "SMB BES 1020 48T PWR" + case NDPChassisSMBBES201024T: + s = "SMB BES 2010 24T" + case NDPChassisSMBBES201048T: + s = "SMB BES 2010 48T" + case NDPChassisSMBBES202024TPWR: + s = "SMB BES 2020 24T PWR" + case NDPChassisSMBBES202048TPWR: + s = "SMB BES 2020 48T PWR" + case NDPChassisSMBBES11024T: + s = "SMB BES 110 24T" + case NDPChassisSMBBES11048T: + s = "SMB BES 110 48T" + case NDPChassisSMBBES12024TPWR: + s = "SMB BES 120 24T PWR" + case NDPChassisSMBBES12048TPWR: + s = "SMB BES 120 48T PWR" + case NDPChassisSMBBES21024T: + s = "SMB BES 210 24T" + case NDPChassisSMBBES21048T: + s = "SMB BES 210 48T" + case NDPChassisSMBBES22024TPWR: + s = "SMB BES 220 24T PWR" + case NDPChassisSMBBES22048TPWR: + s = "SMB BES 220 48T PWR" + case NDPChassisOME6500: + s = "OME 6500" + case NDPChassisEthernetRoutingSwitch4548GT: + s = "Ethernet Routing Switch 4548GT" + case NDPChassisEthernetRoutingSwitch4548GTPWR: + s = "Ethernet Routing Switch 4548GT-PWR" + case NDPChassisEthernetRoutingSwitch4550T: + s = "Ethernet Routing Switch 4550T" + case NDPChassisEthernetRoutingSwitch4550TPWR: + s = "Ethernet Routing Switch 4550T-PWR" + case NDPChassisEthernetRoutingSwitch4526FX: + s = "Ethernet Routing Switch 4526FX" + case NDPChassisEthernetRoutingSwitch250026T: + s = "Ethernet Routing Switch 2500-26T" + case NDPChassisEthernetRoutingSwitch250026TPWR: + s = "Ethernet Routing Switch 2500-26T-PWR" + case NDPChassisEthernetRoutingSwitch250050T: + s = "Ethernet Routing Switch 2500-50T" + case NDPChassisEthernetRoutingSwitch250050TPWR: + s = "Ethernet Routing Switch 2500-50T-PWR" + default: + s = "Unknown" + } + return +} + +func (t NDPBackplaneType) String() (s string) { + switch t { + case NDPBackplaneOther: + s = "Other" + case NDPBackplaneEthernet: + s = "Ethernet" + case NDPBackplaneEthernetTokenring: + s = "Ethernet and Tokenring" + case NDPBackplaneEthernetFDDI: + s = "Ethernet and FDDI" + case NDPBackplaneEthernetTokenringFDDI: + s = "Ethernet, Tokenring and FDDI" + case NDPBackplaneEthernetTokenringRedundantPower: + s = "Ethernet and Tokenring with redundant power" + case NDPBackplaneEthernetTokenringFDDIRedundantPower: + s = "Ethernet, Tokenring, FDDI with redundant power" + case NDPBackplaneTokenRing: + s = "Token Ring" + case NDPBackplaneEthernetTokenringFastEthernet: + s = "Ethernet, Tokenring and Fast Ethernet" + case NDPBackplaneEthernetFastEthernet: + s = "Ethernet and Fast Ethernet" + case NDPBackplaneEthernetTokenringFastEthernetRedundantPower: + s = "Ethernet, Tokenring, Fast Ethernet with redundant power" + case NDPBackplaneEthernetFastEthernetGigabitEthernet: + s = "Ethernet, Fast Ethernet and Gigabit Ethernet" + default: + s = "Unknown" + } + return +} + +func (t NDPState) String() (s string) { + switch t { + case NDPStateTopology: + s = "Topology Change" + case NDPStateHeartbeat: + s = "Heartbeat" + case NDPStateNew: + s = "New" + default: + s = "Unknown" + } + return +} diff --git a/vendor/github.com/google/gopacket/layers/ntp.go b/vendor/github.com/google/gopacket/layers/ntp.go new file mode 100644 index 0000000..33c15b3 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/ntp.go @@ -0,0 +1,416 @@ +// Copyright 2016 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 layers + +import ( + "encoding/binary" + "errors" + + "github.com/google/gopacket" +) + +//****************************************************************************** +// +// Network Time Protocol (NTP) Decoding Layer +// ------------------------------------------ +// This file provides a GoPacket decoding layer for NTP. +// +//****************************************************************************** +// +// About The Network Time Protocol (NTP) +// ------------------------------------- +// NTP is a protocol that enables computers on the internet to set their +// clocks to the correct time (or to a time that is acceptably close to the +// correct time). NTP runs on top of UDP. +// +// There have been a series of versions of the NTP protocol. The latest +// version is V4 and is specified in RFC 5905: +// http://www.ietf.org/rfc/rfc5905.txt +// +//****************************************************************************** +// +// References +// ---------- +// +// Wikipedia's NTP entry: +// https://en.wikipedia.org/wiki/Network_Time_Protocol +// This is the best place to get an overview of NTP. +// +// Network Time Protocol Home Website: +// http://www.ntp.org/ +// This appears to be the official website of NTP. +// +// List of current NTP Protocol RFCs: +// http://www.ntp.org/rfc.html +// +// RFC 958: "Network Time Protocol (NTP)" (1985) +// https://tools.ietf.org/html/rfc958 +// This is the original NTP specification. +// +// RFC 1305: "Network Time Protocol (Version 3) Specification, Implementation and Analysis" (1992) +// https://tools.ietf.org/html/rfc1305 +// The protocol was updated in 1992 yielding NTP V3. +// +// RFC 5905: "Network Time Protocol Version 4: Protocol and Algorithms Specification" (2010) +// https://www.ietf.org/rfc/rfc5905.txt +// The protocol was updated in 2010 yielding NTP V4. +// V4 is backwards compatible with all previous versions of NTP. +// +// RFC 5906: "Network Time Protocol Version 4: Autokey Specification" +// https://tools.ietf.org/html/rfc5906 +// This document addresses the security of the NTP protocol +// and is probably not relevant to this package. +// +// RFC 5907: "Definitions of Managed Objects for Network Time Protocol Version 4 (NTPv4)" +// https://tools.ietf.org/html/rfc5907 +// This document addresses the management of NTP servers and +// is probably not relevant to this package. +// +// RFC 5908: "Network Time Protocol (NTP) Server Option for DHCPv6" +// https://tools.ietf.org/html/rfc5908 +// This document addresses the use of NTP in DHCPv6 and is +// probably not relevant to this package. +// +// "Let's make a NTP Client in C" +// https://lettier.github.io/posts/2016-04-26-lets-make-a-ntp-client-in-c.html +// This web page contains useful information about the details of NTP, +// including an NTP record struture in C, and C code. +// +// "NTP Packet Header (NTP Reference Implementation) (Computer Network Time Synchronization)" +// http://what-when-how.com/computer-network-time-synchronization/ +// ntp-packet-header-ntp-reference-implementation-computer-network-time-synchronization/ +// This web page contains useful information on the details of NTP. +// +// "Technical information - NTP Data Packet" +// https://www.meinbergglobal.com/english/info/ntp-packet.htm +// This page has a helpful diagram of an NTP V4 packet. +// +//****************************************************************************** +// +// Obsolete References +// ------------------- +// +// RFC 1119: "RFC-1119 "Network Time Protocol (Version 2) Specification and Implementation" (1989) +// https://tools.ietf.org/html/rfc1119 +// Version 2 was drafted in 1989. +// It is unclear whether V2 was ever implememented or whether the +// ideas ended up in V3 (which was implemented in 1992). +// +// RFC 1361: "Simple Network Time Protocol (SNTP)" +// https://tools.ietf.org/html/rfc1361 +// This document is obsoleted by RFC 1769 and is included only for completeness. +// +// RFC 1769: "Simple Network Time Protocol (SNTP)" +// https://tools.ietf.org/html/rfc1769 +// This document is obsoleted by RFC 2030 and RFC 4330 and is included only for completeness. +// +// RFC 2030: "Simple Network Time Protocol (SNTP) Version 4 for IPv4, IPv6 and OSI" +// https://tools.ietf.org/html/rfc2030 +// This document is obsoleted by RFC 4330 and is included only for completeness. +// +// RFC 4330: "Simple Network Time Protocol (SNTP) Version 4 for IPv4, IPv6 and OSI" +// https://tools.ietf.org/html/rfc4330 +// This document is obsoleted by RFC 5905 and is included only for completeness. +// +//****************************************************************************** +// +// Endian And Bit Numbering Issues +// ------------------------------- +// +// Endian and bit numbering issues can be confusing. Here is some +// clarification: +// +// ENDIAN: Values are sent big endian. +// https://en.wikipedia.org/wiki/Endianness +// +// BIT NUMBERING: Bits are numbered 0 upwards from the most significant +// bit to the least significant bit. This means that if there is a 32-bit +// value, the most significant bit is called bit 0 and the least +// significant bit is called bit 31. +// +// See RFC 791 Appendix B for more discussion. +// +//****************************************************************************** +// +// NTP V3 and V4 Packet Format +// --------------------------- +// NTP packets are UDP packets whose payload contains an NTP record. +// +// The NTP RFC defines the format of the NTP record. +// +// There have been four versions of the protocol: +// +// V1 in 1985 +// V2 in 1989 +// V3 in 1992 +// V4 in 2010 +// +// It is clear that V1 and V2 are obsolete, and there is no need to +// cater for these formats. +// +// V3 and V4 essentially use the same format, with V4 adding some optional +// fields on the end. So this package supports the V3 and V4 formats. +// +// The current version of NTP (NTP V4)'s RFC (V4 - RFC 5905) contains +// the following diagram for the NTP record format: + +// 0 1 2 3 +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// |LI | VN |Mode | Stratum | Poll | Precision | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Root Delay | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Root Dispersion | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Reference ID | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | | +// + Reference Timestamp (64) + +// | | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | | +// + Origin Timestamp (64) + +// | | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | | +// + Receive Timestamp (64) + +// | | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | | +// + Transmit Timestamp (64) + +// | | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | | +// . . +// . Extension Field 1 (variable) . +// . . +// | | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | | +// . . +// . Extension Field 2 (variable) . +// . . +// | | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Key Identifier | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | | +// | dgst (128) | +// | | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// From http://www.ietf.org/rfc/rfc5905.txt +// +// The fields "Extension Field 1 (variable)" and later are optional fields, +// and so we can set a minimum NTP record size of 48 bytes. +// +const ntpMinimumRecordSizeInBytes int = 48 + +//****************************************************************************** + +// NTP Type +// -------- +// Type NTP implements the DecodingLayer interface. Each NTP object +// represents in a structured form the NTP record present as the UDP +// payload in an NTP UDP packet. +// + +type NTPLeapIndicator uint8 +type NTPVersion uint8 +type NTPMode uint8 +type NTPStratum uint8 +type NTPLog2Seconds int8 +type NTPFixed16Seconds uint32 +type NTPReferenceID uint32 +type NTPTimestamp uint64 + +type NTP struct { + BaseLayer // Stores the packet bytes and payload bytes. + + LeapIndicator NTPLeapIndicator // [0,3]. Indicates whether leap second(s) is to be added. + Version NTPVersion // [0,7]. Version of the NTP protocol. + Mode NTPMode // [0,7]. Mode. + Stratum NTPStratum // [0,255]. Stratum of time server in the server tree. + Poll NTPLog2Seconds // [-128,127]. The maximum interval between successive messages, in log2 seconds. + Precision NTPLog2Seconds // [-128,127]. The precision of the system clock, in log2 seconds. + RootDelay NTPFixed16Seconds // [0,2^32-1]. Total round trip delay to the reference clock in seconds times 2^16. + RootDispersion NTPFixed16Seconds // [0,2^32-1]. Total dispersion to the reference clock, in seconds times 2^16. + ReferenceID NTPReferenceID // ID code of reference clock [0,2^32-1]. + ReferenceTimestamp NTPTimestamp // Most recent timestamp from the reference clock. + OriginTimestamp NTPTimestamp // Local time when request was sent from local host. + ReceiveTimestamp NTPTimestamp // Local time (on server) that request arrived at server host. + TransmitTimestamp NTPTimestamp // Local time (on server) that request departed server host. + + // FIX: This package should analyse the extension fields and represent the extension fields too. + ExtensionBytes []byte // Just put extensions in a byte slice. +} + +//****************************************************************************** + +// LayerType returns the layer type of the NTP object, which is LayerTypeNTP. +func (d *NTP) LayerType() gopacket.LayerType { + return LayerTypeNTP +} + +//****************************************************************************** + +// decodeNTP analyses a byte slice and attempts to decode it as an NTP +// record of a UDP packet. +// +// If it succeeds, it loads p with information about the packet and returns nil. +// If it fails, it returns an error (non nil). +// +// This function is employed in layertypes.go to register the NTP layer. +func decodeNTP(data []byte, p gopacket.PacketBuilder) error { + + // Attempt to decode the byte slice. + d := &NTP{} + err := d.DecodeFromBytes(data, p) + if err != nil { + return err + } + + // If the decoding worked, add the layer to the packet and set it + // as the application layer too, if there isn't already one. + p.AddLayer(d) + p.SetApplicationLayer(d) + + return nil +} + +//****************************************************************************** + +// DecodeFromBytes analyses a byte slice and attempts to decode it as an NTP +// record of a UDP packet. +// +// Upon succeeds, it loads the NTP object with information about the packet +// and returns nil. +// Upon failure, it returns an error (non nil). +func (d *NTP) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + + // If the data block is too short to be a NTP record, then return an error. + if len(data) < ntpMinimumRecordSizeInBytes { + df.SetTruncated() + return errors.New("NTP packet too short") + } + + // RFC 5905 does not appear to define a maximum NTP record length. + // The protocol allows "extension fields" to be included in the record, + // and states about these fields:" + // + // "While the minimum field length containing required fields is + // four words (16 octets), a maximum field length remains to be + // established." + // + // For this reason, the packet length is not checked here for being too long. + + // NTP type embeds type BaseLayer which contains two fields: + // Contents is supposed to contain the bytes of the data at this level. + // Payload is supposed to contain the payload of this level. + // Here we set the baselayer to be the bytes of the NTP record. + d.BaseLayer = BaseLayer{Contents: data[:len(data)]} + + // Extract the fields from the block of bytes. + // To make sense of this, refer to the packet diagram + // above and the section on endian conventions. + + // The first few fields are all packed into the first 32 bits. Unpack them. + f := data[0] + d.LeapIndicator = NTPLeapIndicator((f & 0xC0) >> 6) + d.Version = NTPVersion((f & 0x38) >> 3) + d.Mode = NTPMode(f & 0x07) + d.Stratum = NTPStratum(data[1]) + d.Poll = NTPLog2Seconds(data[2]) + d.Precision = NTPLog2Seconds(data[3]) + + // The remaining fields can just be copied in big endian order. + d.RootDelay = NTPFixed16Seconds(binary.BigEndian.Uint32(data[4:8])) + d.RootDispersion = NTPFixed16Seconds(binary.BigEndian.Uint32(data[8:12])) + d.ReferenceID = NTPReferenceID(binary.BigEndian.Uint32(data[12:16])) + d.ReferenceTimestamp = NTPTimestamp(binary.BigEndian.Uint64(data[16:24])) + d.OriginTimestamp = NTPTimestamp(binary.BigEndian.Uint64(data[24:32])) + d.ReceiveTimestamp = NTPTimestamp(binary.BigEndian.Uint64(data[32:40])) + d.TransmitTimestamp = NTPTimestamp(binary.BigEndian.Uint64(data[40:48])) + + // This layer does not attempt to analyse the extension bytes. + // But if there are any, we'd like the user to know. So we just + // place them all in an ExtensionBytes field. + d.ExtensionBytes = data[48:] + + // Return no error. + return nil +} + +// SerializeTo writes the serialized form of this layer into the +// SerializationBuffer, implementing gopacket.SerializableLayer. +// See the docs for gopacket.SerializableLayer for more info. +func (d *NTP) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + data, err := b.PrependBytes(ntpMinimumRecordSizeInBytes) + if err != nil { + return err + } + + // Pack the first few fields into the first 32 bits. + h := uint8(0) + h |= (uint8(d.LeapIndicator) << 6) & 0xC0 + h |= (uint8(d.Version) << 3) & 0x38 + h |= (uint8(d.Mode)) & 0x07 + data[0] = byte(h) + data[1] = byte(d.Stratum) + data[2] = byte(d.Poll) + data[3] = byte(d.Precision) + + // The remaining fields can just be copied in big endian order. + binary.BigEndian.PutUint32(data[4:8], uint32(d.RootDelay)) + binary.BigEndian.PutUint32(data[8:12], uint32(d.RootDispersion)) + binary.BigEndian.PutUint32(data[12:16], uint32(d.ReferenceID)) + binary.BigEndian.PutUint64(data[16:24], uint64(d.ReferenceTimestamp)) + binary.BigEndian.PutUint64(data[24:32], uint64(d.OriginTimestamp)) + binary.BigEndian.PutUint64(data[32:40], uint64(d.ReceiveTimestamp)) + binary.BigEndian.PutUint64(data[40:48], uint64(d.TransmitTimestamp)) + + ex, err := b.AppendBytes(len(d.ExtensionBytes)) + if err != nil { + return err + } + copy(ex, d.ExtensionBytes) + + return nil +} + +//****************************************************************************** + +// CanDecode returns a set of layers that NTP objects can decode. +// As NTP objects can only decide the NTP layer, we can return just that layer. +// Apparently a single layer type implements LayerClass. +func (d *NTP) CanDecode() gopacket.LayerClass { + return LayerTypeNTP +} + +//****************************************************************************** + +// NextLayerType specifies the next layer that GoPacket should attempt to +// analyse after this (NTP) layer. As NTP packets do not contain any payload +// bytes, there are no further layers to analyse. +func (d *NTP) NextLayerType() gopacket.LayerType { + return gopacket.LayerTypeZero +} + +//****************************************************************************** + +// NTP packets do not carry any data payload, so the empty byte slice is retured. +// In Go, a nil slice is functionally identical to an empty slice, so we +// return nil to avoid a heap allocation. +func (d *NTP) Payload() []byte { + return nil +} + +//****************************************************************************** +//* End Of NTP File * +//****************************************************************************** diff --git a/vendor/github.com/google/gopacket/layers/ntp_test.go b/vendor/github.com/google/gopacket/layers/ntp_test.go new file mode 100644 index 0000000..b522216 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/ntp_test.go @@ -0,0 +1,258 @@ +// Copyright 2016 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 layers + +import ( + "crypto/rand" + "github.com/google/gopacket" + "io" + "reflect" + "testing" +) + +//****************************************************************************** + +// checkNTP() uses the ntp.go code to analyse the packet bytes as an NTP UDP +// packet and generate an NTP object. It then compares the generated NTP object +// with the one provided and throws an error if there is any difference. +// The desc argument is output with any failure message to identify the test. +func checkNTP(desc string, t *testing.T, packetBytes []byte, pExpectedNTP *NTP) { + + // Analyse the packet bytes, yielding a new packet object p. + p := gopacket.NewPacket(packetBytes, LinkTypeEthernet, gopacket.Default) + if p.ErrorLayer() != nil { + t.Errorf("Failed to decode packet %s: %v", desc, p.ErrorLayer().Error()) + } + + // Ensure that the packet analysis yielded the correct set of layers: + // Link Layer = Ethernet. + // Network Layer = IPv4. + // Transport Layer = UDP. + // Application Layer = NTP. + checkLayers(p, []gopacket.LayerType{ + LayerTypeEthernet, + LayerTypeIPv4, + LayerTypeUDP, + LayerTypeNTP}, t) + + // Select the Application (NTP) layer. + pResultNTP, ok := p.ApplicationLayer().(*NTP) + if !ok { + t.Error("No NTP layer type found in packet in " + desc + ".") + } + + // Compare the generated NTP object with the expected NTP object. + if !reflect.DeepEqual(pResultNTP, pExpectedNTP) { + t.Errorf("NTP packet processing failed for packet "+desc+ + ":\ngot :\n%#v\n\nwant :\n%#v\n\n", pResultNTP, pExpectedNTP) + } + buf := gopacket.NewSerializeBuffer() + opts := gopacket.SerializeOptions{} + err := pResultNTP.SerializeTo(buf, opts) + if err != nil { + t.Error(err) + } + if !reflect.DeepEqual(pResultNTP.BaseLayer.Contents, buf.Bytes()) { + t.Errorf("NTP packet serialization failed for packet "+desc+ + ":\ngot :\n%x\n\nwant :\n%x\n\n", buf.Bytes(), packetBytes) + } +} + +//****************************************************************************** + +func TestNTPOne(t *testing.T) { + + // This test packet is the first NTP packet in the NTP sample capture + // pcap file NTP_sync.pcap on the Wireshark sample captures page: + // + // https://wiki.wireshark.org/SampleCaptures + // https://wiki.wireshark.org/SampleCaptures?action=AttachFile&do=get&target=NTP_sync.pcap + var testPacketNTP = []byte{ + 0x00, 0x0c, 0x41, 0x82, 0xb2, 0x53, 0x00, 0xd0, + 0x59, 0x6c, 0x40, 0x4e, 0x08, 0x00, 0x45, 0x00, + 0x00, 0x4c, 0x0a, 0x42, 0x00, 0x00, 0x80, 0x11, + 0xb5, 0xfa, 0xc0, 0xa8, 0x32, 0x32, 0x43, 0x81, + 0x44, 0x09, 0x00, 0x7b, 0x00, 0x7b, 0x00, 0x38, + 0xf8, 0xd2, 0xd9, 0x00, 0x0a, 0xfa, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x90, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc5, 0x02, 0x04, 0xec, 0xec, 0x42, + 0xee, 0x92, + } + + // Assemble the NTP object that we expect to emerge from this test. + pExpectedNTP := &NTP{ + BaseLayer: BaseLayer{ + Contents: []byte{0xd9, 0x0, 0xa, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x2, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc5, 0x2, 0x4, 0xec, 0xec, 0x42, 0xee, 0x92}, + Payload: nil, + }, + LeapIndicator: 3, + Version: 3, + Mode: 1, + Stratum: 0, + Poll: 10, + Precision: -6, + RootDelay: 0, + RootDispersion: 0x10290, + ReferenceID: 0, + ReferenceTimestamp: 0, + OriginTimestamp: 0, + ReceiveTimestamp: 0, + TransmitTimestamp: 0xc50204ecec42ee92, + ExtensionBytes: []byte{}, + } + + checkNTP("test01", t, testPacketNTP, pExpectedNTP) +} + +//****************************************************************************** + +func TestNTPTwo(t *testing.T) { + + // This test packet is packet #18 in the NTP sample capture + // pcap file NTP_sync.pcap on the Wireshark sample captures page: + // + // https://wiki.wireshark.org/SampleCaptures + // https://wiki.wireshark.org/SampleCaptures?action=AttachFile&do=get&target=NTP_sync.pcap + // + // This packet was chosen because it is the first NTP packet after the first + // NTP packet that has non-zero timestamps. + + var testPacketNTP = []byte{ + 0x00, 0xd0, 0x59, 0x6c, 0x40, 0x4e, 0x00, 0x0c, + 0x41, 0x82, 0xb2, 0x53, 0x08, 0x00, 0x45, 0x00, + 0x00, 0x4c, 0x32, 0x46, 0x40, 0x00, 0x2f, 0x11, + 0xa8, 0x18, 0x45, 0x2c, 0x39, 0x3c, 0xc0, 0xa8, + 0x32, 0x32, 0x00, 0x7b, 0x00, 0x7b, 0x00, 0x38, + 0x09, 0x58, 0x1a, 0x03, 0x0a, 0xee, 0x00, 0x00, + 0x1b, 0xf7, 0x00, 0x00, 0x14, 0xec, 0x51, 0xae, + 0x80, 0xb7, 0xc5, 0x02, 0x03, 0x4c, 0x8d, 0x0e, + 0x66, 0xcb, 0xc5, 0x02, 0x04, 0xec, 0xec, 0x42, + 0xee, 0x92, 0xc5, 0x02, 0x04, 0xeb, 0xcf, 0x49, + 0x59, 0xe6, 0xc5, 0x02, 0x04, 0xeb, 0xcf, 0x4c, + 0x6e, 0x6e, + } + + // Assemble the NTP object that we expect to emerge from this test. + pExpectedNTP := &NTP{ + BaseLayer: BaseLayer{ + Contents: []byte{0x1a, 0x03, 0x0a, 0xee, 0x00, 0x00, + 0x1b, 0xf7, 0x00, 0x00, 0x14, 0xec, 0x51, 0xae, + 0x80, 0xb7, 0xc5, 0x02, 0x03, 0x4c, 0x8d, 0x0e, + 0x66, 0xcb, 0xc5, 0x02, 0x04, 0xec, 0xec, 0x42, + 0xee, 0x92, 0xc5, 0x02, 0x04, 0xeb, 0xcf, 0x49, + 0x59, 0xe6, 0xc5, 0x02, 0x04, 0xeb, 0xcf, 0x4c, + 0x6e, 0x6e}, + Payload: nil, + }, + LeapIndicator: 0, + Version: 3, + Mode: 2, + Stratum: 3, + Poll: 10, + Precision: -18, + RootDelay: 0x1bf7, + RootDispersion: 0x14ec, + ReferenceID: 0x51ae80b7, + ReferenceTimestamp: 0xc502034c8d0e66cb, + OriginTimestamp: 0xc50204ecec42ee92, + ReceiveTimestamp: 0xc50204ebcf4959e6, + TransmitTimestamp: 0xc50204ebcf4c6e6e, + ExtensionBytes: []byte{}, + } + + checkNTP("test02", t, testPacketNTP, pExpectedNTP) +} + +//****************************************************************************** + +func TestNTPThree(t *testing.T) { + + // This test packet is packet #19 in the NTP sample capture + // pcap file NTP_sync.pcap on the Wireshark sample captures page: + // + // https://wiki.wireshark.org/SampleCaptures + // https://wiki.wireshark.org/SampleCaptures?action=AttachFile&do=get&target=NTP_sync.pcap + + var testPacketNTP = []byte{ + 0x00, 0xd0, 0x59, 0x6c, 0x40, 0x4e, 0x00, 0x0c, + 0x41, 0x82, 0xb2, 0x53, 0x08, 0x00, 0x45, 0x00, + 0x00, 0x4c, 0x00, 0x00, 0x40, 0x00, 0x30, 0x11, + 0x74, 0x65, 0x18, 0x7b, 0xca, 0xe6, 0xc0, 0xa8, + 0x32, 0x32, 0x00, 0x7b, 0x00, 0x7b, 0x00, 0x38, + 0x44, 0x05, 0x1a, 0x02, 0x0a, 0xec, 0x00, 0x00, + 0x07, 0xc3, 0x00, 0x00, 0x2f, 0x80, 0xc6, 0x1e, + 0x5c, 0x02, 0xc5, 0x01, 0xf9, 0x95, 0x42, 0x50, + 0x82, 0xcf, 0xc5, 0x02, 0x04, 0xec, 0xec, 0x42, + 0xee, 0x92, 0xc5, 0x02, 0x04, 0xeb, 0xd2, 0x35, + 0x2e, 0xb5, 0xc5, 0x02, 0x04, 0xeb, 0xd2, 0x35, + 0xd6, 0x7b, + } + + // Assemble the NTP object that we expect to emerge from this test. + pExpectedNTP := &NTP{ + BaseLayer: BaseLayer{ + Contents: []byte{0x1a, 0x02, 0x0a, 0xec, 0x00, 0x00, + 0x07, 0xc3, 0x00, 0x00, 0x2f, 0x80, 0xc6, 0x1e, + 0x5c, 0x02, 0xc5, 0x01, 0xf9, 0x95, 0x42, 0x50, + 0x82, 0xcf, 0xc5, 0x02, 0x04, 0xec, 0xec, 0x42, + 0xee, 0x92, 0xc5, 0x02, 0x04, 0xeb, 0xd2, 0x35, + 0x2e, 0xb5, 0xc5, 0x02, 0x04, 0xeb, 0xd2, 0x35, + 0xd6, 0x7b}, + Payload: nil, + }, + LeapIndicator: 0, + Version: 3, + Mode: 2, + Stratum: 2, + Poll: 10, + Precision: -20, + RootDelay: 0x7c3, + RootDispersion: 0x2f80, + ReferenceID: 0xc61e5c02, + ReferenceTimestamp: 0xc501f995425082cf, + OriginTimestamp: 0xc50204ecec42ee92, + ReceiveTimestamp: 0xc50204ebd2352eb5, + TransmitTimestamp: 0xc50204ebd235d67b, + ExtensionBytes: []byte{}, + } + + checkNTP("test03", t, testPacketNTP, pExpectedNTP) +} + +//****************************************************************************** + +// TestNTPIsomorphism tests whether random data gets parsed into NTP layer and +// gets serialized back from it to the same value. +func TestNTPIsomorphism(t *testing.T) { + NTPData := make([]byte, ntpMinimumRecordSizeInBytes+7) + _, err := io.ReadFull(rand.Reader, NTPData) + if err != nil { + t.Error(err) + } + ntpLayer := &NTP{} + err = ntpLayer.DecodeFromBytes(NTPData, gopacket.NilDecodeFeedback) + if err != nil { + t.Error(err) + } + buf := gopacket.NewSerializeBuffer() + opts := gopacket.SerializeOptions{} + err = ntpLayer.SerializeTo(buf, opts) + if err != nil { + t.Error(err) + } + if !reflect.DeepEqual(NTPData, buf.Bytes()) { + t.Errorf("NTP packet is not isomorphic:\ngot :\n%x\n\nwant :\n%x\n\n", buf.Bytes(), NTPData) + } +} diff --git a/vendor/github.com/google/gopacket/layers/ospf.go b/vendor/github.com/google/gopacket/layers/ospf.go new file mode 100644 index 0000000..eee8542 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/ospf.go @@ -0,0 +1,509 @@ +// Copyright 2017 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 layers + +import ( + "encoding/binary" + "fmt" + + "github.com/google/gopacket" +) + +// OSPFType denotes what kind of OSPF type it is +type OSPFType uint8 + +// Potential values for OSPF.Type. +const ( + OSPFHello OSPFType = 1 + OSPFDatabaseDescription OSPFType = 2 + OSPFLinkStateRequest OSPFType = 3 + OSPFLinkStateUpdate OSPFType = 4 + OSPFLinkStateAcknowledgment OSPFType = 5 +) + +// LSA Function Codes for LSAheader.LSType +const ( + RouterLSAtype = 0x2001 + NetworkLSAtype = 0x2002 + InterAreaPrefixLSAtype = 0x2003 + InterAreaRouterLSAtype = 0x2004 + ASExternalLSAtype = 0x4005 + NSSALSAtype = 0x2007 + LinkLSAtype = 0x0008 + IntraAreaPrefixLSAtype = 0x2009 +) + +// String conversions for OSPFType +func (i OSPFType) String() string { + switch i { + case OSPFHello: + return "Hello" + case OSPFDatabaseDescription: + return "Database Description" + case OSPFLinkStateRequest: + return "Link State Request" + case OSPFLinkStateUpdate: + return "Link State Update" + case OSPFLinkStateAcknowledgment: + return "Link State Acknowledgment" + default: + return "" + } +} + +// Prefix extends IntraAreaPrefixLSA +type Prefix struct { + PrefixLength uint8 + PrefixOptions uint8 + Metric uint16 + AddressPrefix []byte +} + +// IntraAreaPrefixLSA is the struct from RFC 5340 A.4.10. +type IntraAreaPrefixLSA struct { + NumOfPrefixes uint16 + RefLSType uint16 + RefLinkStateID uint32 + RefAdvRouter uint32 + Prefixes []Prefix +} + +// LinkLSA is the struct from RFC 5340 A.4.9. +type LinkLSA struct { + RtrPriority uint8 + Options uint32 + LinkLocalAddress []byte + NumOfPrefixes uint32 + Prefixes []Prefix +} + +// ASExternalLSA is the struct from RFC 5340 A.4.7. +type ASExternalLSA struct { + Flags uint8 + Metric uint32 + PrefixLength uint8 + PrefixOptions uint8 + RefLSType uint16 + AddressPrefix []byte + ForwardingAddress []byte + ExternalRouteTag uint32 + RefLinkStateID uint32 +} + +// InterAreaRouterLSA is the struct from RFC 5340 A.4.6. +type InterAreaRouterLSA struct { + Options uint32 + Metric uint32 + DestinationRouterID uint32 +} + +// InterAreaPrefixLSA is the struct from RFC 5340 A.4.5. +type InterAreaPrefixLSA struct { + Metric uint32 + PrefixLength uint8 + PrefixOptions uint8 + AddressPrefix []byte +} + +// NetworkLSA is the struct from RFC 5340 A.4.4. +type NetworkLSA struct { + Options uint32 + AttachedRouter []uint32 +} + +// Router extends RouterLSA +type Router struct { + Type uint8 + Metric uint16 + InterfaceID uint32 + NeighborInterfaceID uint32 + NeighborRouterID uint32 +} + +// RouterLSA is the struct from RFC 5340 A.4.3. +type RouterLSA struct { + Flags uint8 + Options uint32 + Routers []Router +} + +// LSAheader is the struct from RFC 5340 A.4.2. +type LSAheader struct { + LSAge uint16 + LSType uint16 + LinkStateID uint32 + AdvRouter uint32 + LSSeqNumber uint32 + LSChecksum uint16 + Length uint16 +} + +// LSA links LSAheader with the structs from RFC 5340 A.4. +type LSA struct { + LSAheader + Content interface{} +} + +// LSUpdate is the struct from RFC 5340 A.3.5. +type LSUpdate struct { + NumOfLSAs uint32 + LSAs []LSA +} + +// LSReq is the struct from RFC 5340 A.3.4. +type LSReq struct { + LSType uint16 + LSID uint32 + AdvRouter uint32 +} + +// DbDescPkg is the struct from RFC 5340 A.3.3. +type DbDescPkg struct { + Options uint32 + InterfaceMTU uint16 + Flags uint16 + DDSeqNumber uint32 + LSAinfo []LSAheader +} + +// HelloPkg is the struct from RFC 5340 A.3.2. +type HelloPkg struct { + InterfaceID uint32 + RtrPriority uint8 + Options uint32 + HelloInterval uint16 + RouterDeadInterval uint16 + DesignatedRouterID uint32 + BackupDesignatedRouterID uint32 + NeighborID []uint32 +} + +// HelloPkgV2 extends the HelloPkg struct with OSPFv2 information +type HelloPkgV2 struct { + HelloPkg + NetworkMask uint32 +} + +// OSPF is a basic OSPF packet header with common fields of Version 2 and Version 3. +type OSPF struct { + Version uint8 + Type OSPFType + PacketLength uint16 + RouterID uint32 + AreaID uint32 + Checksum uint16 + Content interface{} +} + +//OSPFv2 extend the OSPF head with version 2 specific fields +type OSPFv2 struct { + BaseLayer + OSPF + AuType uint16 + Authentication uint64 +} + +// OSPFv3 extend the OSPF head with version 3 specific fields +type OSPFv3 struct { + BaseLayer + OSPF + Instance uint8 + Reserved uint8 +} + +// getLSAs parses the LSA information from the packet +func getLSAs(num uint32, data []byte) ([]LSA, error) { + var lsas []LSA + var i uint32 = 0 + var offset uint32 = 0 + for ; i < num; i++ { + var content interface{} + lstype := binary.BigEndian.Uint16(data[offset+2 : offset+4]) + lsalength := binary.BigEndian.Uint16(data[offset+18 : offset+20]) + + switch lstype { + case RouterLSAtype: + var routers []Router + var j uint32 + for j = 24; j < uint32(lsalength); j += 16 { + router := Router{ + Type: uint8(data[offset+j]), + Metric: binary.BigEndian.Uint16(data[offset+j+2 : offset+j+4]), + InterfaceID: binary.BigEndian.Uint32(data[offset+j+4 : offset+j+8]), + NeighborInterfaceID: binary.BigEndian.Uint32(data[offset+j+8 : offset+j+12]), + NeighborRouterID: binary.BigEndian.Uint32(data[offset+j+12 : offset+j+16]), + } + routers = append(routers, router) + } + content = RouterLSA{ + Flags: uint8(data[offset+20]), + Options: binary.BigEndian.Uint32(data[offset+20:offset+24]) & 0x00FFFFFF, + Routers: routers, + } + case NetworkLSAtype: + var routers []uint32 + var j uint32 + for j = 24; j < uint32(lsalength); j += 4 { + routers = append(routers, binary.BigEndian.Uint32(data[offset+j:offset+j+4])) + } + content = NetworkLSA{ + Options: binary.BigEndian.Uint32(data[offset+20:offset+24]) & 0x00FFFFFF, + AttachedRouter: routers, + } + case InterAreaPrefixLSAtype: + content = InterAreaPrefixLSA{ + Metric: binary.BigEndian.Uint32(data[offset+20:offset+24]) & 0x00FFFFFF, + PrefixLength: uint8(data[offset+24]), + PrefixOptions: uint8(data[offset+25]), + AddressPrefix: data[offset+28 : offset+uint32(lsalength)], + } + case InterAreaRouterLSAtype: + content = InterAreaRouterLSA{ + Options: binary.BigEndian.Uint32(data[offset+20:offset+24]) & 0x00FFFFFF, + Metric: binary.BigEndian.Uint32(data[offset+24:offset+28]) & 0x00FFFFFF, + DestinationRouterID: binary.BigEndian.Uint32(data[offset+28 : offset+32]), + } + case ASExternalLSAtype: + fallthrough + case NSSALSAtype: + + flags := uint8(data[offset+20]) + prefixLen := uint8(data[offset+24]) / 8 + var forwardingAddress []byte + if (flags & 0x02) == 0x02 { + forwardingAddress = data[offset+28+uint32(prefixLen) : offset+28+uint32(prefixLen)+16] + } + content = ASExternalLSA{ + Flags: flags, + Metric: binary.BigEndian.Uint32(data[offset+20:offset+24]) & 0x00FFFFFF, + PrefixLength: prefixLen, + PrefixOptions: uint8(data[offset+25]), + RefLSType: binary.BigEndian.Uint16(data[offset+26 : offset+28]), + AddressPrefix: data[offset+28 : offset+28+uint32(prefixLen)], + ForwardingAddress: forwardingAddress, + } + case LinkLSAtype: + var prefixes []Prefix + var prefixOffset uint32 = offset + 44 + var j uint32 + numOfPrefixes := binary.BigEndian.Uint32(data[offset+40 : offset+44]) + for j = 0; j < numOfPrefixes; j++ { + prefixLen := uint8(data[prefixOffset]) + prefix := Prefix{ + PrefixLength: prefixLen, + PrefixOptions: uint8(data[prefixOffset+1]), + AddressPrefix: data[prefixOffset+4 : prefixOffset+4+uint32(prefixLen)/8], + } + prefixes = append(prefixes, prefix) + prefixOffset = prefixOffset + 4 + uint32(prefixLen)/8 + } + content = LinkLSA{ + RtrPriority: uint8(data[offset+20]), + Options: binary.BigEndian.Uint32(data[offset+20:offset+24]) & 0x00FFFFFF, + LinkLocalAddress: data[offset+24 : offset+40], + NumOfPrefixes: numOfPrefixes, + Prefixes: prefixes, + } + case IntraAreaPrefixLSAtype: + var prefixes []Prefix + var prefixOffset uint32 = offset + 32 + var j uint16 + numOfPrefixes := binary.BigEndian.Uint16(data[offset+20 : offset+22]) + for j = 0; j < numOfPrefixes; j++ { + prefixLen := uint8(data[prefixOffset]) + prefix := Prefix{ + PrefixLength: prefixLen, + PrefixOptions: uint8(data[prefixOffset+1]), + Metric: binary.BigEndian.Uint16(data[prefixOffset+2 : prefixOffset+4]), + AddressPrefix: data[prefixOffset+4 : prefixOffset+4+uint32(prefixLen)/8], + } + prefixes = append(prefixes, prefix) + prefixOffset = prefixOffset + 4 + uint32(prefixLen) + } + content = IntraAreaPrefixLSA{ + NumOfPrefixes: numOfPrefixes, + RefLSType: binary.BigEndian.Uint16(data[offset+22 : offset+24]), + RefLinkStateID: binary.BigEndian.Uint32(data[offset+24 : offset+28]), + RefAdvRouter: binary.BigEndian.Uint32(data[offset+28 : offset+32]), + Prefixes: prefixes, + } + default: + return nil, fmt.Errorf("Unknown Link State type.") + } + lsa := LSA{ + LSAheader: LSAheader{ + LSAge: binary.BigEndian.Uint16(data[offset : offset+2]), + LSType: lstype, + LinkStateID: binary.BigEndian.Uint32(data[offset+4 : offset+8]), + AdvRouter: binary.BigEndian.Uint32(data[offset+8 : offset+12]), + LSSeqNumber: binary.BigEndian.Uint32(data[offset+12 : offset+16]), + LSChecksum: binary.BigEndian.Uint16(data[offset+16 : offset+18]), + Length: lsalength, + }, + Content: content, + } + lsas = append(lsas, lsa) + offset += uint32(lsalength) + } + return lsas, nil +} + +// DecodeFromBytes decodes the given bytes into the OSPF layer. +func (ospf *OSPFv2) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + if len(data) < 24 { + return fmt.Errorf("Packet too smal for OSPF Version 2") + } + + ospf.Version = uint8(data[0]) + ospf.Type = OSPFType(data[1]) + ospf.PacketLength = binary.BigEndian.Uint16(data[2:4]) + ospf.RouterID = binary.BigEndian.Uint32(data[4:8]) + ospf.AreaID = binary.BigEndian.Uint32(data[8:12]) + ospf.Checksum = binary.BigEndian.Uint16(data[12:14]) + ospf.AuType = binary.BigEndian.Uint16(data[14:16]) + ospf.Authentication = binary.BigEndian.Uint64(data[16:24]) + + return nil +} + +// DecodeFromBytes decodes the given bytes into the OSPF layer. +func (ospf *OSPFv3) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + + if len(data) < 16 { + return fmt.Errorf("Packet too smal for OSPF Version 3") + } + + ospf.Version = uint8(data[0]) + ospf.Type = OSPFType(data[1]) + ospf.PacketLength = binary.BigEndian.Uint16(data[2:4]) + ospf.RouterID = binary.BigEndian.Uint32(data[4:8]) + ospf.AreaID = binary.BigEndian.Uint32(data[8:12]) + ospf.Checksum = binary.BigEndian.Uint16(data[12:14]) + ospf.Instance = uint8(data[14]) + ospf.Reserved = uint8(data[15]) + + switch ospf.Type { + case OSPFHello: + var neighbors []uint32 + for i := 36; uint16(i+4) <= ospf.PacketLength; i += 4 { + neighbors = append(neighbors, binary.BigEndian.Uint32(data[i:i+4])) + } + ospf.Content = HelloPkg{ + InterfaceID: binary.BigEndian.Uint32(data[16:20]), + RtrPriority: uint8(data[20]), + Options: binary.BigEndian.Uint32(data[21:25]) >> 8, + HelloInterval: binary.BigEndian.Uint16(data[24:26]), + RouterDeadInterval: binary.BigEndian.Uint16(data[26:28]), + DesignatedRouterID: binary.BigEndian.Uint32(data[28:32]), + BackupDesignatedRouterID: binary.BigEndian.Uint32(data[32:36]), + NeighborID: neighbors, + } + case OSPFDatabaseDescription: + var lsas []LSAheader + for i := 28; uint16(i+20) <= ospf.PacketLength; i += 20 { + lsa := LSAheader{ + LSAge: binary.BigEndian.Uint16(data[i : i+2]), + LSType: binary.BigEndian.Uint16(data[i+2 : i+4]), + LinkStateID: binary.BigEndian.Uint32(data[i+4 : i+8]), + AdvRouter: binary.BigEndian.Uint32(data[i+8 : i+12]), + LSSeqNumber: binary.BigEndian.Uint32(data[i+12 : i+16]), + LSChecksum: binary.BigEndian.Uint16(data[i+16 : i+18]), + Length: binary.BigEndian.Uint16(data[i+18 : i+20]), + } + lsas = append(lsas, lsa) + } + ospf.Content = DbDescPkg{ + Options: binary.BigEndian.Uint32(data[16:20]) & 0x00FFFFFF, + InterfaceMTU: binary.BigEndian.Uint16(data[20:22]), + Flags: binary.BigEndian.Uint16(data[22:24]), + DDSeqNumber: binary.BigEndian.Uint32(data[24:28]), + LSAinfo: lsas, + } + case OSPFLinkStateRequest: + var lsrs []LSReq + for i := 16; uint16(i+12) <= ospf.PacketLength; i += 12 { + lsr := LSReq{ + LSType: binary.BigEndian.Uint16(data[i+2 : i+4]), + LSID: binary.BigEndian.Uint32(data[i+4 : i+8]), + AdvRouter: binary.BigEndian.Uint32(data[i+8 : i+12]), + } + lsrs = append(lsrs, lsr) + } + ospf.Content = lsrs + case OSPFLinkStateUpdate: + num := binary.BigEndian.Uint32(data[16:20]) + lsas, err := getLSAs(num, data[20:]) + if err != nil { + return fmt.Errorf("Cannot parse Link State Update packet: %v", err) + } + ospf.Content = LSUpdate{ + NumOfLSAs: num, + LSAs: lsas, + } + + case OSPFLinkStateAcknowledgment: + var lsas []LSAheader + for i := 16; uint16(i+20) <= ospf.PacketLength; i += 20 { + lsa := LSAheader{ + LSAge: binary.BigEndian.Uint16(data[i : i+2]), + LSType: binary.BigEndian.Uint16(data[i+2 : i+4]), + LinkStateID: binary.BigEndian.Uint32(data[i+4 : i+8]), + AdvRouter: binary.BigEndian.Uint32(data[i+8 : i+12]), + LSSeqNumber: binary.BigEndian.Uint32(data[i+12 : i+16]), + LSChecksum: binary.BigEndian.Uint16(data[i+16 : i+18]), + Length: binary.BigEndian.Uint16(data[i+18 : i+20]), + } + lsas = append(lsas, lsa) + } + ospf.Content = lsas + default: + } + + return nil +} + +// LayerType returns LayerTypeOSPF +func (ospf *OSPFv2) LayerType() gopacket.LayerType { + return LayerTypeOSPF +} +func (ospf *OSPFv3) LayerType() gopacket.LayerType { + return LayerTypeOSPF +} + +// NextLayerType returns the layer type contained by this DecodingLayer. +func (ospf *OSPFv2) NextLayerType() gopacket.LayerType { + return gopacket.LayerTypeZero +} +func (ospf *OSPFv3) NextLayerType() gopacket.LayerType { + return gopacket.LayerTypeZero +} + +// CanDecode returns the set of layer types that this DecodingLayer can decode. +func (ospf *OSPFv2) CanDecode() gopacket.LayerClass { + return LayerTypeOSPF +} +func (ospf *OSPFv3) CanDecode() gopacket.LayerClass { + return LayerTypeOSPF +} + +func decodeOSPF(data []byte, p gopacket.PacketBuilder) error { + if len(data) < 14 { + return fmt.Errorf("Packet too smal for OSPF") + } + + switch uint8(data[0]) { + case 2: + ospf := &OSPFv2{} + return decodingLayerDecoder(ospf, data, p) + case 3: + ospf := &OSPFv3{} + return decodingLayerDecoder(ospf, data, p) + default: + } + + return fmt.Errorf("Unable to determine OSPF type.") +} diff --git a/vendor/github.com/google/gopacket/layers/ospf_test.go b/vendor/github.com/google/gopacket/layers/ospf_test.go new file mode 100644 index 0000000..930bb4d --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/ospf_test.go @@ -0,0 +1,559 @@ +// Copyright 2017 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 layers + +import ( + "github.com/google/gopacket" + "reflect" + "testing" +) + +// testPacketOSPF3Hello is the packet: +// 14:43:11.663317 IP6 fe80::1 > ff02::5: OSPFv3, Hello, length 36 +// 0x0000: 3333 0000 0005 c200 1ffa 0001 86dd 6e00 33............n. +// 0x0010: 0000 0024 5901 fe80 0000 0000 0000 0000 ...$Y........... +// 0x0020: 0000 0000 0001 ff02 0000 0000 0000 0000 ................ +// 0x0030: 0000 0000 0005 0301 0024 0101 0101 0000 .........$...... +// 0x0040: 0001 fb86 0000 0000 0005 0100 0013 000a ................ +// 0x0050: 0028 0000 0000 0000 0000 .(........ +var testPacketOSPF3Hello = []byte{ + 0x33, 0x33, 0x00, 0x00, 0x00, 0x05, 0xc2, 0x00, 0x1f, 0xfa, 0x00, 0x01, 0x86, 0xdd, 0x6e, 0x00, + 0x00, 0x00, 0x00, 0x24, 0x59, 0x01, 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x03, 0x01, 0x00, 0x24, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x01, 0xfb, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x01, 0x00, 0x00, 0x13, 0x00, 0x0a, + 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +} + +func TestPacketOSPF3Hello(t *testing.T) { + p := gopacket.NewPacket(testPacketOSPF3Hello, LinkTypeEthernet, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeEthernet, LayerTypeIPv6, LayerTypeOSPF}, t) + + ospf := p.Layer(LayerTypeOSPF).(*OSPFv3) + if ospf.Version != 3 { + t.Fatal("Invalid OSPF version") + } + if got, ok := p.Layer(LayerTypeOSPF).(*OSPFv3); ok { + want := &OSPFv3{ + OSPF: OSPF{ + Version: 3, + Type: OSPFHello, + PacketLength: 36, + RouterID: 0x1010101, + AreaID: 1, + Checksum: 0xfb86, + Content: HelloPkg{ + InterfaceID: 5, + RtrPriority: 1, + Options: 0x000013, + HelloInterval: 10, + RouterDeadInterval: 40, + DesignatedRouterID: 0, + BackupDesignatedRouterID: 0, + }, + }, + Instance: 0, + Reserved: 0, + } + if !reflect.DeepEqual(got, want) { + t.Errorf("OSPF packet processing failed:\ngot :\n%#v\n\nwant :\n%#v\n\n", got, want) + } + } else { + t.Error("No OSPF layer type found in packet") + } +} +func BenchmarkDecodePacketPacket0(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testPacketOSPF3Hello, LinkTypeEthernet, gopacket.NoCopy) + } +} + +// testPacketOSPF3DBDesc is the packet: +// 14:43:51.657571 IP6 fe80::2 > fe80::1: OSPFv3, Database Description, length 28 +// 0x0000: c200 1ffa 0001 c201 1ffa 0001 86dd 6e00 ..............n. +// 0x0010: 0000 001c 5901 fe80 0000 0000 0000 0000 ....Y........... +// 0x0020: 0000 0000 0002 fe80 0000 0000 0000 0000 ................ +// 0x0030: 0000 0000 0001 0302 001c 0202 0202 0000 ................ +// 0x0040: 0001 d826 0000 0000 0013 05dc 0007 0000 ...&............ +// 0x0050: 1d46 .F +var testPacketOSPF3DBDesc = []byte{ + 0xc2, 0x00, 0x1f, 0xfa, 0x00, 0x01, 0xc2, 0x01, 0x1f, 0xfa, 0x00, 0x01, 0x86, 0xdd, 0x6e, 0x00, + 0x00, 0x00, 0x00, 0x1c, 0x59, 0x01, 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x02, 0x00, 0x1c, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x01, 0xd8, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x05, 0xdc, 0x00, 0x07, 0x00, 0x00, + 0x1d, 0x46, +} + +func TestPacketOSPF3DBDesc(t *testing.T) { + p := gopacket.NewPacket(testPacketOSPF3DBDesc, LinkTypeEthernet, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeEthernet, LayerTypeIPv6, LayerTypeOSPF}, t) + if got, ok := p.Layer(LayerTypeOSPF).(*OSPFv3); ok { + want := &OSPFv3{ + OSPF: OSPF{ + Version: 3, + Type: OSPFDatabaseDescription, + PacketLength: 28, + RouterID: 0x2020202, + AreaID: 1, + Checksum: 0xd826, + Content: DbDescPkg{ + Options: 0x000013, + InterfaceMTU: 1500, + Flags: 0x7, + DDSeqNumber: 7494, + }, + }, + Instance: 0, + Reserved: 0, + } + if !reflect.DeepEqual(got, want) { + t.Errorf("OSPF packet processing failed:\ngot :\n%#v\n\nwant :\n%#v\n\n", got, want) + } + } else { + t.Error("No OSPF layer type found in packet") + } +} +func BenchmarkDecodePacketPacket1(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testPacketOSPF3DBDesc, LinkTypeEthernet, gopacket.NoCopy) + } +} + +// testPacketOSPF3LSRequest is the packet: +// 14:43:51.673584 IP6 fe80::2 > fe80::1: OSPFv3, LS-Request, length 100 +// 0x0000: c200 1ffa 0001 c201 1ffa 0001 86dd 6e00 ..............n. +// 0x0010: 0000 0064 5901 fe80 0000 0000 0000 0000 ...dY........... +// 0x0020: 0000 0000 0002 fe80 0000 0000 0000 0000 ................ +// 0x0030: 0000 0000 0001 0303 0064 0202 0202 0000 .........d...... +// 0x0040: 0001 2c9a 0000 0000 2001 0000 0000 0101 ..,............. +// 0x0050: 0101 0000 2003 0000 0003 0101 0101 0000 ................ +// 0x0060: 2003 0000 0002 0101 0101 0000 2003 0000 ................ +// 0x0070: 0001 0101 0101 0000 2003 0000 0000 0101 ................ +// 0x0080: 0101 0000 0008 0000 0005 0101 0101 0000 ................ +// 0x0090: 2009 0000 0000 0101 0101 .......... +var testPacketOSPF3LSRequest = []byte{ + 0xc2, 0x00, 0x1f, 0xfa, 0x00, 0x01, 0xc2, 0x01, 0x1f, 0xfa, 0x00, 0x01, 0x86, 0xdd, 0x6e, 0x00, + 0x00, 0x00, 0x00, 0x64, 0x59, 0x01, 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x00, 0x64, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x01, 0x2c, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x01, 0x01, 0x00, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, + 0x20, 0x03, 0x00, 0x00, 0x00, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x20, 0x03, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x05, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, + 0x20, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, +} + +func TestPacketOSPF3LSRequest(t *testing.T) { + p := gopacket.NewPacket(testPacketOSPF3LSRequest, LinkTypeEthernet, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeEthernet, LayerTypeIPv6, LayerTypeOSPF}, t) + if got, ok := p.Layer(LayerTypeOSPF).(*OSPFv3); ok { + want := &OSPFv3{ + OSPF: OSPF{ + Version: 3, + Type: OSPFLinkStateRequest, + PacketLength: 100, + RouterID: 0x2020202, + AreaID: 1, + Checksum: 0x2c9a, + Content: []LSReq{ + LSReq{ + LSType: 0x2001, + LSID: 0x00000000, + AdvRouter: 0x01010101, + }, + LSReq{ + LSType: 0x2003, + LSID: 0x00000003, + AdvRouter: 0x01010101, + }, + LSReq{ + LSType: 0x2003, + LSID: 0x00000002, + AdvRouter: 0x01010101, + }, + LSReq{ + LSType: 0x2003, + LSID: 0x00000001, + AdvRouter: 0x01010101, + }, + LSReq{ + LSType: 0x2003, + LSID: 0x00000000, + AdvRouter: 0x01010101, + }, + LSReq{ + LSType: 0x0008, + LSID: 0x00000005, + AdvRouter: 0x01010101, + }, + LSReq{ + LSType: 0x2009, + LSID: 0x00000000, + AdvRouter: 0x01010101, + }, + }, + }, + Instance: 0, + Reserved: 0, + } + if !reflect.DeepEqual(got, want) { + t.Errorf("OSPF packet processing failed:\ngot :\n%#v\n\nwant :\n%#v\n\n", got, want) + } + } else { + t.Error("No OSPF layer type found in packet") + } +} +func BenchmarkDecodePacketPacket2(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testPacketOSPF3LSRequest, LinkTypeEthernet, gopacket.NoCopy) + } +} + +// testPacketOSPF3LSUpdate is the packet: +// 14:43:51.681554 IP6 fe80::1 > fe80::2: OSPFv3, LS-Update, length 288 +// 0x0000: c201 1ffa 0001 c200 1ffa 0001 86dd 6e00 ..............n. +// 0x0010: 0000 0120 5901 fe80 0000 0000 0000 0000 ....Y........... +// 0x0020: 0000 0000 0001 fe80 0000 0000 0000 0000 ................ +// 0x0030: 0000 0000 0002 0304 0120 0101 0101 0000 ................ +// 0x0040: 0001 e556 0000 0000 0007 0028 2001 0000 ...V.......(.... +// 0x0050: 0000 0101 0101 8000 0002 d13a 0018 0100 ...........:.... +// 0x0060: 0033 0029 2003 0000 0003 0101 0101 8000 .3.)............ +// 0x0070: 0001 6259 0024 0000 004a 4000 0000 2001 ..bY.$...J@..... +// 0x0080: 0db8 0000 0003 0029 2003 0000 0002 0101 .......)........ +// 0x0090: 0101 8000 0001 baf6 0024 0000 0054 4000 .........$...T@. +// 0x00a0: 0000 2001 0db8 0000 0004 0029 2003 0000 ...........).... +// 0x00b0: 0001 0101 0101 8000 0001 eba0 0024 0000 .............$.. +// 0x00c0: 004a 4000 0000 2001 0db8 0000 0034 0029 .J@..........4.) +// 0x00d0: 2003 0000 0000 0101 0101 8000 0001 0ebd ................ +// 0x00e0: 0024 0000 0040 4000 0000 2001 0db8 0000 .$...@@......... +// 0x00f0: 0000 0023 0008 0000 0005 0101 0101 8000 ...#............ +// 0x0100: 0002 3d08 0038 0100 0033 fe80 0000 0000 ..=..8...3...... +// 0x0110: 0000 0000 0000 0000 0001 0000 0001 4000 ..............@. +// 0x0120: 0000 2001 0db8 0000 0012 0023 2009 0000 ...........#.... +// 0x0130: 0000 0101 0101 8000 0001 e8d2 002c 0001 .............,.. +// 0x0140: 2001 0000 0000 0101 0101 4000 000a 2001 ..........@..... +// 0x0150: 0db8 0000 0012 ...... +var testPacketOSPF3LSUpdate = []byte{ + 0xc2, 0x01, 0x1f, 0xfa, 0x00, 0x01, 0xc2, 0x00, 0x1f, 0xfa, 0x00, 0x01, 0x86, 0xdd, 0x6e, 0x00, + 0x00, 0x00, 0x01, 0x20, 0x59, 0x01, 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x04, 0x01, 0x20, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x01, 0xe5, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x28, 0x20, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x80, 0x00, 0x00, 0x02, 0xd1, 0x3a, 0x00, 0x18, 0x01, 0x00, + 0x00, 0x33, 0x00, 0x29, 0x20, 0x03, 0x00, 0x00, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x80, 0x00, + 0x00, 0x01, 0x62, 0x59, 0x00, 0x24, 0x00, 0x00, 0x00, 0x4a, 0x40, 0x00, 0x00, 0x00, 0x20, 0x01, + 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x03, 0x00, 0x29, 0x20, 0x03, 0x00, 0x00, 0x00, 0x02, 0x01, 0x01, + 0x01, 0x01, 0x80, 0x00, 0x00, 0x01, 0xba, 0xf6, 0x00, 0x24, 0x00, 0x00, 0x00, 0x54, 0x40, 0x00, + 0x00, 0x00, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x04, 0x00, 0x29, 0x20, 0x03, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x80, 0x00, 0x00, 0x01, 0xeb, 0xa0, 0x00, 0x24, 0x00, 0x00, + 0x00, 0x4a, 0x40, 0x00, 0x00, 0x00, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x34, 0x00, 0x29, + 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x80, 0x00, 0x00, 0x01, 0x0e, 0xbd, + 0x00, 0x24, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x23, 0x00, 0x08, 0x00, 0x00, 0x00, 0x05, 0x01, 0x01, 0x01, 0x01, 0x80, 0x00, + 0x00, 0x02, 0x3d, 0x08, 0x00, 0x38, 0x01, 0x00, 0x00, 0x33, 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x40, 0x00, + 0x00, 0x00, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x12, 0x00, 0x23, 0x20, 0x09, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x80, 0x00, 0x00, 0x01, 0xe8, 0xd2, 0x00, 0x2c, 0x00, 0x01, + 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x40, 0x00, 0x00, 0x0a, 0x20, 0x01, + 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x12, +} + +func TestPacketOSPF3LSUpdate(t *testing.T) { + p := gopacket.NewPacket(testPacketOSPF3LSUpdate, LinkTypeEthernet, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeEthernet, LayerTypeIPv6, LayerTypeOSPF}, t) + if got, ok := p.Layer(LayerTypeOSPF).(*OSPFv3); ok { + want := &OSPFv3{ + OSPF: OSPF{ + Version: 3, + Type: OSPFLinkStateUpdate, + PacketLength: 288, + RouterID: 0x1010101, + AreaID: 1, + Checksum: 0xe556, + Content: LSUpdate{ + NumOfLSAs: 7, + LSAs: []LSA{ + LSA{ + LSAheader: LSAheader{ + LSAge: 40, + LSType: 0x2001, + LinkStateID: 0x00000000, + AdvRouter: 0x01010101, + LSSeqNumber: 0x80000002, + LSChecksum: 0xd13a, + Length: 24, + }, + Content: RouterLSA{ + Flags: 0x1, + Options: 0x33, + }, + }, + LSA{ + LSAheader: LSAheader{ + LSAge: 41, + LSType: 0x2003, + LinkStateID: 0x00000003, + AdvRouter: 0x01010101, + LSSeqNumber: 0x80000001, + LSChecksum: 0x6259, + Length: 36, + }, + Content: InterAreaPrefixLSA{ + Metric: 74, + PrefixLength: 64, + PrefixOptions: 0, + AddressPrefix: []byte{0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x03}, + }, + }, + LSA{ + LSAheader: LSAheader{ + LSAge: 41, + LSType: 0x2003, + LinkStateID: 0x00000002, + AdvRouter: 0x01010101, + LSSeqNumber: 0x80000001, + LSChecksum: 0xbaf6, + Length: 36, + }, + Content: InterAreaPrefixLSA{ + Metric: 84, + PrefixLength: 64, + PrefixOptions: 0, + AddressPrefix: []byte{0x20, 0x1, 0xd, 0xb8, 0x0, 0x0, 0x0, 0x4}, + }, + }, + LSA{ + LSAheader: LSAheader{ + LSAge: 41, + LSType: 0x2003, + LinkStateID: 0x00000001, + AdvRouter: 0x01010101, + LSSeqNumber: 0x80000001, + LSChecksum: 0xeba0, + Length: 36, + }, + Content: InterAreaPrefixLSA{ + Metric: 74, + PrefixLength: 64, + PrefixOptions: 0, + AddressPrefix: []byte{0x20, 0x1, 0xd, 0xb8, 0x0, 0x0, 0x0, 0x34}, + }, + }, + LSA{ + LSAheader: LSAheader{ + LSAge: 41, + LSType: 0x2003, + LinkStateID: 0x00000000, + AdvRouter: 0x01010101, + LSSeqNumber: 0x80000001, + LSChecksum: 0xebd, + Length: 36, + }, + Content: InterAreaPrefixLSA{ + Metric: 64, + PrefixLength: 64, + PrefixOptions: 0, + AddressPrefix: []byte{0x20, 0x1, 0xd, 0xb8, 0x0, 0x0, 0x0, 0x0}, + }, + }, + LSA{ + LSAheader: LSAheader{ + LSAge: 35, + LSType: 0x8, + LinkStateID: 0x00000005, + AdvRouter: 0x01010101, + LSSeqNumber: 0x80000002, + LSChecksum: 0x3d08, + Length: 56, + }, + Content: LinkLSA{ + RtrPriority: 1, + Options: 0x33, + LinkLocalAddress: []byte{0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, + NumOfPrefixes: 1, + Prefixes: []Prefix{ + Prefix{ + PrefixLength: 64, + PrefixOptions: 0, + AddressPrefix: []byte{0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x12}, + }, + }, + }, + }, + LSA{ + LSAheader: LSAheader{ + LSAge: 35, + LSType: 0x2009, + LinkStateID: 0x00000000, + AdvRouter: 0x01010101, + LSSeqNumber: 0x80000001, + LSChecksum: 0xe8d2, + Length: 44, + }, + Content: IntraAreaPrefixLSA{ + NumOfPrefixes: 1, + RefLSType: 0x2001, + RefAdvRouter: 0x01010101, + Prefixes: []Prefix{ + Prefix{ + PrefixLength: 64, + PrefixOptions: 0, + Metric: 10, + AddressPrefix: []byte{0x20, 0x1, 0xd, 0xb8, 0x0, 0x0, 0x0, 0x12}, + }, + }, + }, + }, + }, + }, + }, + Instance: 0, + Reserved: 0, + } + if !reflect.DeepEqual(got, want) { + t.Errorf("OSPF packet processing failed:\ngot :\n%#v\n\nwant :\n%#v\n\n", got, want) + } + } else { + t.Error("No OSPF layer type found in packet") + } +} +func BenchmarkDecodePacketPacket3(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testPacketOSPF3LSUpdate, LinkTypeEthernet, gopacket.NoCopy) + } +} + +// testPacketOSPF3LSAck is the packet: +// 14:43:54.185384 IP6 fe80::1 > ff02::5: OSPFv3, LS-Ack, length 136 +// 0x0000: 3333 0000 0005 c200 1ffa 0001 86dd 6e00 33............n. +// 0x0010: 0000 0088 5901 fe80 0000 0000 0000 0000 ....Y........... +// 0x0020: 0000 0000 0001 ff02 0000 0000 0000 0000 ................ +// 0x0030: 0000 0000 0005 0305 0088 0101 0101 0000 ................ +// 0x0040: 0001 9d2c 0000 0005 2001 0000 0000 0202 ...,............ +// 0x0050: 0202 8000 0002 b354 0018 0006 2003 0000 .......T........ +// 0x0060: 0003 0202 0202 8000 0001 4473 0024 0006 ..........Ds.$.. +// 0x0070: 2003 0000 0002 0202 0202 8000 0001 9c11 ................ +// 0x0080: 0024 0006 2003 0000 0001 0202 0202 8000 .$.............. +// 0x0090: 0001 cdba 0024 0006 2003 0000 0000 0202 .....$.......... +// 0x00a0: 0202 8000 0001 efd7 0024 0005 0008 0000 .........$...... +// 0x00b0: 0005 0202 0202 8000 0001 5433 002c ..........T3., +var testPacketOSPF3LSAck = []byte{ + 0x33, 0x33, 0x00, 0x00, 0x00, 0x05, 0xc2, 0x00, 0x1f, 0xfa, 0x00, 0x01, 0x86, 0xdd, 0x6e, 0x00, + 0x00, 0x00, 0x00, 0x88, 0x59, 0x01, 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x03, 0x05, 0x00, 0x88, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x9d, 0x2c, 0x00, 0x00, 0x00, 0x05, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, + 0x02, 0x02, 0x80, 0x00, 0x00, 0x02, 0xb3, 0x54, 0x00, 0x18, 0x00, 0x06, 0x20, 0x03, 0x00, 0x00, + 0x00, 0x03, 0x02, 0x02, 0x02, 0x02, 0x80, 0x00, 0x00, 0x01, 0x44, 0x73, 0x00, 0x24, 0x00, 0x06, + 0x20, 0x03, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x80, 0x00, 0x00, 0x01, 0x9c, 0x11, + 0x00, 0x24, 0x00, 0x06, 0x20, 0x03, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x80, 0x00, + 0x00, 0x01, 0xcd, 0xba, 0x00, 0x24, 0x00, 0x06, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, + 0x02, 0x02, 0x80, 0x00, 0x00, 0x01, 0xef, 0xd7, 0x00, 0x24, 0x00, 0x05, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x05, 0x02, 0x02, 0x02, 0x02, 0x80, 0x00, 0x00, 0x01, 0x54, 0x33, 0x00, 0x2c, +} + +func TestPacketOSPF3LSAck(t *testing.T) { + p := gopacket.NewPacket(testPacketOSPF3LSAck, LinkTypeEthernet, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeEthernet, LayerTypeIPv6, LayerTypeOSPF}, t) + if got, ok := p.Layer(LayerTypeOSPF).(*OSPFv3); ok { + want := &OSPFv3{ + OSPF: OSPF{ + Version: 3, + Type: OSPFLinkStateAcknowledgment, + PacketLength: 136, + RouterID: 0x1010101, + AreaID: 1, + Checksum: 0x9d2c, + Content: []LSAheader{ + LSAheader{ + LSAge: 5, + LSType: 0x2001, + LinkStateID: 0x00000000, + AdvRouter: 0x02020202, + LSSeqNumber: 0x80000002, + LSChecksum: 0xb354, + Length: 24, + }, + LSAheader{ + LSAge: 6, + LSType: 0x2003, + LinkStateID: 0x00000003, + AdvRouter: 0x02020202, + LSSeqNumber: 0x80000001, + LSChecksum: 0x4473, + Length: 36, + }, + LSAheader{ + LSAge: 6, + LSType: 0x2003, + LinkStateID: 0x00000002, + AdvRouter: 0x02020202, + LSSeqNumber: 0x80000001, + LSChecksum: 0x9c11, + Length: 36, + }, + LSAheader{ + LSAge: 6, + LSType: 0x2003, + LinkStateID: 0x00000001, + AdvRouter: 0x02020202, + LSSeqNumber: 0x80000001, + LSChecksum: 0xcdba, + Length: 36, + }, + LSAheader{ + LSAge: 6, + LSType: 0x2003, + LinkStateID: 0x00000000, + AdvRouter: 0x02020202, + LSSeqNumber: 0x80000001, + LSChecksum: 0xefd7, + Length: 36, + }, + LSAheader{ + LSAge: 5, + LSType: 0x0008, + LinkStateID: 0x00000005, + AdvRouter: 0x02020202, + LSSeqNumber: 0x80000001, + LSChecksum: 0x5433, + Length: 44, + }, + }, + }, + Instance: 0, + Reserved: 0, + } + if !reflect.DeepEqual(got, want) { + t.Errorf("OSPF packet processing failed:\ngot :\n%#v\n\nwant :\n%#v\n\n", got, want) + } + } else { + t.Error("No OSPF layer type found in packet") + } +} +func BenchmarkDecodePacketPacket4(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testPacketOSPF3LSAck, LinkTypeEthernet, gopacket.NoCopy) + } +} diff --git a/vendor/github.com/google/gopacket/layers/pflog.go b/vendor/github.com/google/gopacket/layers/pflog.go new file mode 100644 index 0000000..853882f --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/pflog.go @@ -0,0 +1,76 @@ +// 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 layers + +import ( + "encoding/binary" + "errors" + + "github.com/google/gopacket" +) + +type PFDirection uint8 + +const ( + PFDirectionInOut PFDirection = 0 + PFDirectionIn PFDirection = 1 + PFDirectionOut PFDirection = 2 +) + +// PFLog provides the layer for 'pf' packet-filter logging, as described at +// http://www.freebsd.org/cgi/man.cgi?query=pflog&sektion=4 +type PFLog struct { + BaseLayer + Length uint8 + Family ProtocolFamily + Action, Reason uint8 + IFName, Ruleset []byte + RuleNum, SubruleNum uint32 + UID uint32 + PID int32 + RuleUID uint32 + RulePID int32 + Direction PFDirection + // The remainder is padding +} + +func (pf *PFLog) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + pf.Length = data[0] + pf.Family = ProtocolFamily(data[1]) + pf.Action = data[2] + pf.Reason = data[3] + pf.IFName = data[4:20] + pf.Ruleset = data[20:36] + pf.RuleNum = binary.BigEndian.Uint32(data[36:40]) + pf.SubruleNum = binary.BigEndian.Uint32(data[40:44]) + pf.UID = binary.BigEndian.Uint32(data[44:48]) + pf.PID = int32(binary.BigEndian.Uint32(data[48:52])) + pf.RuleUID = binary.BigEndian.Uint32(data[52:56]) + pf.RulePID = int32(binary.BigEndian.Uint32(data[56:60])) + pf.Direction = PFDirection(data[60]) + if pf.Length%4 != 1 { + return errors.New("PFLog header length should be 3 less than multiple of 4") + } + actualLength := int(pf.Length) + 3 + pf.Contents = data[:actualLength] + pf.Payload = data[actualLength:] + return nil +} + +// LayerType returns layers.LayerTypePFLog +func (pf *PFLog) LayerType() gopacket.LayerType { return LayerTypePFLog } + +func (pf *PFLog) CanDecode() gopacket.LayerClass { return LayerTypePFLog } + +func (pf *PFLog) NextLayerType() gopacket.LayerType { + return pf.Family.LayerType() +} + +func decodePFLog(data []byte, p gopacket.PacketBuilder) error { + pf := &PFLog{} + return decodingLayerDecoder(pf, data, p) +} diff --git a/vendor/github.com/google/gopacket/layers/ports.go b/vendor/github.com/google/gopacket/layers/ports.go new file mode 100644 index 0000000..431358c --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/ports.go @@ -0,0 +1,140 @@ +// 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 layers + +import ( + "fmt" + "strconv" + + "github.com/google/gopacket" +) + +// TCPPort is a port in a TCP layer. +type TCPPort uint16 + +// UDPPort is a port in a UDP layer. +type UDPPort uint16 + +// RUDPPort is a port in a RUDP layer. +type RUDPPort uint8 + +// SCTPPort is a port in a SCTP layer. +type SCTPPort uint16 + +// UDPLitePort is a port in a UDPLite layer. +type UDPLitePort uint16 + +// RUDPPortNames contains the string names for all RUDP ports. +var RUDPPortNames = map[RUDPPort]string{} + +// UDPLitePortNames contains the string names for all UDPLite ports. +var UDPLitePortNames = map[UDPLitePort]string{} + +// {TCP,UDP,SCTP}PortNames can be found in iana_ports.go + +// String returns the port as "number(name)" if there's a well-known port name, +// or just "number" if there isn't. Well-known names are stored in +// TCPPortNames. +func (a TCPPort) String() string { + if name, ok := TCPPortNames[a]; ok { + return fmt.Sprintf("%d(%s)", a, name) + } + return strconv.Itoa(int(a)) +} + +// LayerType returns a LayerType that would be able to decode the +// application payload. It uses some well-known ports such as 53 for +// DNS. +// +// Returns gopacket.LayerTypePayload for unknown/unsupported port numbers. +func (a TCPPort) LayerType() gopacket.LayerType { + lt := tcpPortLayerType[uint16(a)] + if lt != 0 { + return lt + } + return gopacket.LayerTypePayload +} + +var tcpPortLayerType = [65536]gopacket.LayerType{ + 53: LayerTypeDNS, +} + +// RegisterTCPPortLayerType creates a new mapping between a TCPPort +// and an underlaying LayerType. +func RegisterTCPPortLayerType(port TCPPort, layerType gopacket.LayerType) { + tcpPortLayerType[port] = layerType +} + +// String returns the port as "number(name)" if there's a well-known port name, +// or just "number" if there isn't. Well-known names are stored in +// UDPPortNames. +func (a UDPPort) String() string { + if name, ok := UDPPortNames[a]; ok { + return fmt.Sprintf("%d(%s)", a, name) + } + return strconv.Itoa(int(a)) +} + +// LayerType returns a LayerType that would be able to decode the +// application payload. It uses some well-known ports such as 53 for +// DNS. +// +// Returns gopacket.LayerTypePayload for unknown/unsupported port numbers. +func (a UDPPort) LayerType() gopacket.LayerType { + lt := udpPortLayerType[uint16(a)] + if lt != 0 { + return lt + } + return gopacket.LayerTypePayload +} + +var udpPortLayerType = [65536]gopacket.LayerType{ + 53: LayerTypeDNS, + 123: LayerTypeNTP, + 4789: LayerTypeVXLAN, + 67: LayerTypeDHCPv4, + 68: LayerTypeDHCPv4, + 6343: LayerTypeSFlow, + 6081: LayerTypeGeneve, + 3784: LayerTypeBFD, +} + +// RegisterUDPPortLayerType creates a new mapping between a UDPPort +// and an underlaying LayerType. +func RegisterUDPPortLayerType(port UDPPort, layerType gopacket.LayerType) { + udpPortLayerType[port] = layerType +} + +// String returns the port as "number(name)" if there's a well-known port name, +// or just "number" if there isn't. Well-known names are stored in +// RUDPPortNames. +func (a RUDPPort) String() string { + if name, ok := RUDPPortNames[a]; ok { + return fmt.Sprintf("%d(%s)", a, name) + } + return strconv.Itoa(int(a)) +} + +// String returns the port as "number(name)" if there's a well-known port name, +// or just "number" if there isn't. Well-known names are stored in +// SCTPPortNames. +func (a SCTPPort) String() string { + if name, ok := SCTPPortNames[a]; ok { + return fmt.Sprintf("%d(%s)", a, name) + } + return strconv.Itoa(int(a)) +} + +// String returns the port as "number(name)" if there's a well-known port name, +// or just "number" if there isn't. Well-known names are stored in +// UDPLitePortNames. +func (a UDPLitePort) String() string { + if name, ok := UDPLitePortNames[a]; ok { + return fmt.Sprintf("%d(%s)", a, name) + } + return strconv.Itoa(int(a)) +} diff --git a/vendor/github.com/google/gopacket/layers/ppp.go b/vendor/github.com/google/gopacket/layers/ppp.go new file mode 100644 index 0000000..1d2e7b8 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/ppp.go @@ -0,0 +1,74 @@ +// 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 layers + +import ( + "encoding/binary" + "errors" + "github.com/google/gopacket" +) + +// PPP is the layer for PPP encapsulation headers. +type PPP struct { + BaseLayer + PPPType PPPType +} + +// PPPEndpoint is a singleton endpoint for PPP. Since there is no actual +// addressing for the two ends of a PPP connection, we use a singleton value +// named 'point' for each endpoint. +var PPPEndpoint = gopacket.NewEndpoint(EndpointPPP, nil) + +// PPPFlow is a singleton flow for PPP. Since there is no actual addressing for +// the two ends of a PPP connection, we use a singleton value to represent the +// flow for all PPP connections. +var PPPFlow = gopacket.NewFlow(EndpointPPP, nil, nil) + +// LayerType returns LayerTypePPP +func (p *PPP) LayerType() gopacket.LayerType { return LayerTypePPP } + +// LinkFlow returns PPPFlow. +func (p *PPP) LinkFlow() gopacket.Flow { return PPPFlow } + +func decodePPP(data []byte, p gopacket.PacketBuilder) error { + ppp := &PPP{} + if data[0]&0x1 == 0 { + if data[1]&0x1 == 0 { + return errors.New("PPP has invalid type") + } + ppp.PPPType = PPPType(binary.BigEndian.Uint16(data[:2])) + ppp.Contents = data[:2] + ppp.Payload = data[2:] + } else { + ppp.PPPType = PPPType(data[0]) + ppp.Contents = data[:1] + ppp.Payload = data[1:] + } + p.AddLayer(ppp) + p.SetLinkLayer(ppp) + return p.NextDecoder(ppp.PPPType) +} + +// SerializeTo writes the serialized form of this layer into the +// SerializationBuffer, implementing gopacket.SerializableLayer. +// See the docs for gopacket.SerializableLayer for more info. +func (p *PPP) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + if p.PPPType&0x100 == 0 { + bytes, err := b.PrependBytes(2) + if err != nil { + return err + } + binary.BigEndian.PutUint16(bytes, uint16(p.PPPType)) + } else { + bytes, err := b.PrependBytes(1) + if err != nil { + return err + } + bytes[0] = uint8(p.PPPType) + } + return nil +} diff --git a/vendor/github.com/google/gopacket/layers/pppoe.go b/vendor/github.com/google/gopacket/layers/pppoe.go new file mode 100644 index 0000000..14cd63a --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/pppoe.go @@ -0,0 +1,60 @@ +// 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 layers + +import ( + "encoding/binary" + "github.com/google/gopacket" +) + +// PPPoE is the layer for PPPoE encapsulation headers. +type PPPoE struct { + BaseLayer + Version uint8 + Type uint8 + Code PPPoECode + SessionId uint16 + Length uint16 +} + +// LayerType returns gopacket.LayerTypePPPoE. +func (p *PPPoE) LayerType() gopacket.LayerType { + return LayerTypePPPoE +} + +// decodePPPoE decodes the PPPoE header (see http://tools.ietf.org/html/rfc2516). +func decodePPPoE(data []byte, p gopacket.PacketBuilder) error { + pppoe := &PPPoE{ + Version: data[0] >> 4, + Type: data[0] & 0x0F, + Code: PPPoECode(data[1]), + SessionId: binary.BigEndian.Uint16(data[2:4]), + Length: binary.BigEndian.Uint16(data[4:6]), + } + pppoe.BaseLayer = BaseLayer{data[:6], data[6 : 6+pppoe.Length]} + p.AddLayer(pppoe) + return p.NextDecoder(pppoe.Code) +} + +// SerializeTo writes the serialized form of this layer into the +// SerializationBuffer, implementing gopacket.SerializableLayer. +// See the docs for gopacket.SerializableLayer for more info. +func (p *PPPoE) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + payload := b.Bytes() + bytes, err := b.PrependBytes(6) + if err != nil { + return err + } + bytes[0] = (p.Version << 4) | p.Type + bytes[1] = byte(p.Code) + binary.BigEndian.PutUint16(bytes[2:], p.SessionId) + if opts.FixLengths { + p.Length = uint16(len(payload)) + } + binary.BigEndian.PutUint16(bytes[4:], p.Length) + return nil +} diff --git a/vendor/github.com/google/gopacket/layers/prism.go b/vendor/github.com/google/gopacket/layers/prism.go new file mode 100644 index 0000000..e1711e7 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/prism.go @@ -0,0 +1,146 @@ +// Copyright 2015 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. + +// http://www.tcpdump.org/linktypes/LINKTYPE_IEEE802_11_PRISM.html + +package layers + +import ( + "encoding/binary" + "errors" + + "github.com/google/gopacket" +) + +func decodePrismValue(data []byte, pv *PrismValue) { + pv.DID = PrismDID(binary.LittleEndian.Uint32(data[0:4])) + pv.Status = binary.LittleEndian.Uint16(data[4:6]) + pv.Length = binary.LittleEndian.Uint16(data[6:8]) + pv.Data = data[8 : 8+pv.Length] +} + +type PrismDID uint32 + +const ( + PrismDIDType1HostTime PrismDID = 0x10044 + PrismDIDType2HostTime PrismDID = 0x01041 + PrismDIDType1MACTime PrismDID = 0x20044 + PrismDIDType2MACTime PrismDID = 0x02041 + PrismDIDType1Channel PrismDID = 0x30044 + PrismDIDType2Channel PrismDID = 0x03041 + PrismDIDType1RSSI PrismDID = 0x40044 + PrismDIDType2RSSI PrismDID = 0x04041 + PrismDIDType1SignalQuality PrismDID = 0x50044 + PrismDIDType2SignalQuality PrismDID = 0x05041 + PrismDIDType1Signal PrismDID = 0x60044 + PrismDIDType2Signal PrismDID = 0x06041 + PrismDIDType1Noise PrismDID = 0x70044 + PrismDIDType2Noise PrismDID = 0x07041 + PrismDIDType1Rate PrismDID = 0x80044 + PrismDIDType2Rate PrismDID = 0x08041 + PrismDIDType1TransmittedFrameIndicator PrismDID = 0x90044 + PrismDIDType2TransmittedFrameIndicator PrismDID = 0x09041 + PrismDIDType1FrameLength PrismDID = 0xA0044 + PrismDIDType2FrameLength PrismDID = 0x0A041 +) + +const ( + PrismType1MessageCode uint16 = 0x00000044 + PrismType2MessageCode uint16 = 0x00000041 +) + +func (p PrismDID) String() string { + dids := map[PrismDID]string{ + PrismDIDType1HostTime: "Host Time", + PrismDIDType2HostTime: "Host Time", + PrismDIDType1MACTime: "MAC Time", + PrismDIDType2MACTime: "MAC Time", + PrismDIDType1Channel: "Channel", + PrismDIDType2Channel: "Channel", + PrismDIDType1RSSI: "RSSI", + PrismDIDType2RSSI: "RSSI", + PrismDIDType1SignalQuality: "Signal Quality", + PrismDIDType2SignalQuality: "Signal Quality", + PrismDIDType1Signal: "Signal", + PrismDIDType2Signal: "Signal", + PrismDIDType1Noise: "Noise", + PrismDIDType2Noise: "Noise", + PrismDIDType1Rate: "Rate", + PrismDIDType2Rate: "Rate", + PrismDIDType1TransmittedFrameIndicator: "Transmitted Frame Indicator", + PrismDIDType2TransmittedFrameIndicator: "Transmitted Frame Indicator", + PrismDIDType1FrameLength: "Frame Length", + PrismDIDType2FrameLength: "Frame Length", + } + + if str, ok := dids[p]; ok { + return str + } + + return "Unknown DID" +} + +type PrismValue struct { + DID PrismDID + Status uint16 + Length uint16 + Data []byte +} + +func (pv *PrismValue) IsSupplied() bool { + return pv.Status == 1 +} + +var ErrPrismExpectedMoreData = errors.New("Expected more data.") +var ErrPrismInvalidCode = errors.New("Invalid header code.") + +func decodePrismHeader(data []byte, p gopacket.PacketBuilder) error { + d := &PrismHeader{} + return decodingLayerDecoder(d, data, p) +} + +type PrismHeader struct { + BaseLayer + Code uint16 + Length uint16 + DeviceName string + Values []PrismValue +} + +func (m *PrismHeader) LayerType() gopacket.LayerType { return LayerTypePrismHeader } + +func (m *PrismHeader) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + m.Code = binary.LittleEndian.Uint16(data[0:4]) + m.Length = binary.LittleEndian.Uint16(data[4:8]) + m.DeviceName = string(data[8:24]) + m.BaseLayer = BaseLayer{Contents: data[:m.Length], Payload: data[m.Length:len(data)]} + + switch m.Code { + case PrismType1MessageCode: + fallthrough + case PrismType2MessageCode: + // valid message code + default: + return ErrPrismInvalidCode + } + + offset := uint16(24) + + m.Values = make([]PrismValue, (m.Length-offset)/12) + for i := 0; i < len(m.Values); i++ { + decodePrismValue(data[offset:offset+12], &m.Values[i]) + offset += 12 + } + + if offset != m.Length { + return ErrPrismExpectedMoreData + } + + return nil +} + +func (m *PrismHeader) CanDecode() gopacket.LayerClass { return LayerTypePrismHeader } +func (m *PrismHeader) NextLayerType() gopacket.LayerType { return LayerTypeDot11 } diff --git a/vendor/github.com/google/gopacket/layers/prism_test.go b/vendor/github.com/google/gopacket/layers/prism_test.go new file mode 100644 index 0000000..136a04c --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/prism_test.go @@ -0,0 +1,120 @@ +// Copyright 2014, 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 layers + +import ( + "net" + "reflect" + "testing" + + "github.com/google/gopacket" +) + +// Generator: python layers/test_creator.py --layerType=LayerTypePrismHeader --linkType=LinkTypePrismHeader --name=Prism%s ~/tmp/dump.pcap +// http://wiki.wireshark.org/SampleCaptures#Sample_Captures + +// testPacketPrism is the packet: +// 21:32:37.616872 BSSID:Broadcast DA:Broadcast SA:cc:fa:00:ad:79:e8 (oui Unknown) Probe Request () [1.0 2.0 5.5 11.0 Mbit] +// 0x0000: 4400 0000 9000 0000 7261 3000 0000 0000 +// 0x0010: 0000 0000 0000 0000 4400 0100 0000 0400 +// 0x0020: f9c1 2900 4400 0200 0000 0000 0000 0000 +// 0x0030: 4400 0300 0000 0400 0a00 0000 4400 0400 +// 0x0040: 0000 0400 e1ff ffff 0000 0000 0000 0000 +// 0x0050: 0000 0000 4400 0600 0000 0400 0000 0000 +// 0x0060: 4400 0700 0000 0400 0000 0000 4400 0800 +// 0x0070: 0000 0400 0200 0000 4400 0900 0000 0000 +// 0x0080: 0000 0000 4400 0a00 0000 0400 7e00 0000 +// 0x0090: 4000 0000 ffff ffff ffff ccfa 00ad 79e8 +// 0x00a0: ffff ffff ffff a041 0000 0104 0204 0b16 +// 0x00b0: 3208 0c12 1824 3048 606c 0301 012d 1a2d +// 0x00c0: 1117 ff00 0000 0000 0000 0000 0000 0000 +// 0x00d0: 0000 0000 0000 0000 007f 0800 0000 0000 +// 0x00e0: 0000 40dd 0900 1018 0200 0010 0000 dd1e +// 0x00f0: 0090 4c33 2d11 17ff 0000 0000 0000 0000 +// 0x0100: 0000 0000 0000 0000 0000 0000 0000 + +var testPacketPrism = []byte{ + 0x44, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x72, 0x61, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, + 0xf9, 0xc1, 0x29, 0x00, 0x44, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x44, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x44, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x04, 0x00, 0xe1, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x44, 0x00, 0x07, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x44, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x04, 0x00, 0x7e, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcc, 0xfa, 0x00, 0xad, 0x79, 0xe8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x41, 0x00, 0x00, 0x01, 0x04, 0x02, 0x04, 0x0b, 0x16, + 0x32, 0x08, 0x0c, 0x12, 0x18, 0x24, 0x30, 0x48, 0x60, 0x6c, 0x03, 0x01, 0x01, 0x2d, 0x1a, 0x2d, + 0x11, 0x17, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40, 0xdd, 0x09, 0x00, 0x10, 0x18, 0x02, 0x00, 0x00, 0x10, 0x00, 0x00, 0xdd, 0x1e, + 0x00, 0x90, 0x4c, 0x33, 0x2d, 0x11, 0x17, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +} + +func TestPacketPrism(t *testing.T) { + p := gopacket.NewPacket(testPacketPrism, LinkTypePrismHeader, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypePrismHeader, LayerTypeDot11, LayerTypeDot11MgmtProbeReq}, t) + + if got, ok := p.Layer(LayerTypePrismHeader).(*PrismHeader); ok { + want := &PrismHeader{ + BaseLayer: BaseLayer{ + Contents: []uint8{0x44, 0x0, 0x0, 0x0, 0x90, 0x0, 0x0, 0x0, 0x72, 0x61, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x44, 0x0, 0x1, 0x0, 0x0, 0x0, 0x4, 0x0, 0xf9, 0xc1, 0x29, 0x0, 0x44, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x44, 0x0, 0x3, 0x0, 0x0, 0x0, 0x4, 0x0, 0xa, 0x0, 0x0, 0x0, 0x44, 0x0, 0x4, 0x0, 0x0, 0x0, 0x4, 0x0, 0xe1, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x44, 0x0, 0x6, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x44, 0x0, 0x7, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x44, 0x0, 0x8, 0x0, 0x0, 0x0, 0x4, 0x0, 0x2, 0x0, 0x0, 0x0, 0x44, 0x0, 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x44, 0x0, 0xa, 0x0, 0x0, 0x0, 0x4, 0x0, 0x7e, 0x0, 0x0, 0x0}, + Payload: []uint8{0x40, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcc, 0xfa, 0x0, 0xad, 0x79, 0xe8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x41, 0x0, 0x0, 0x1, 0x4, 0x2, 0x4, 0xb, 0x16, 0x32, 0x8, 0xc, 0x12, 0x18, 0x24, 0x30, 0x48, 0x60, 0x6c, 0x3, 0x1, 0x1, 0x2d, 0x1a, 0x2d, 0x11, 0x17, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0xdd, 0x9, 0x0, 0x10, 0x18, 0x2, 0x0, 0x0, 0x10, 0x0, 0x0, 0xdd, 0x1e, 0x0, 0x90, 0x4c, 0x33, 0x2d, 0x11, 0x17, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}, Code: 0x44, Length: 0x90, DeviceName: "ra0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + Values: []PrismValue{ + PrismValue{DID: PrismDIDType1HostTime, Status: 0x0, Length: 0x4, Data: []uint8{0xf9, 0xc1, 0x29, 0x0}}, + PrismValue{DID: PrismDIDType1MACTime, Status: 0x0, Length: 0x0, Data: []uint8{}}, + PrismValue{DID: PrismDIDType1Channel, Status: 0x0, Length: 0x4, Data: []uint8{0xa, 0x0, 0x0, 0x0}}, + PrismValue{DID: PrismDIDType1RSSI, Status: 0x0, Length: 0x4, Data: []uint8{0xe1, 0xff, 0xff, 0xff}}, + PrismValue{DID: 0x0, Status: 0x0, Length: 0x0, Data: []uint8{}}, + PrismValue{DID: PrismDIDType1Signal, Status: 0x0, Length: 0x4, Data: []uint8{0x0, 0x0, 0x0, 0x0}}, + PrismValue{DID: PrismDIDType1Noise, Status: 0x0, Length: 0x4, Data: []uint8{0x0, 0x0, 0x0, 0x0}}, + PrismValue{DID: PrismDIDType1Rate, Status: 0x0, Length: 0x4, Data: []uint8{0x2, 0x0, 0x0, 0x0}}, + PrismValue{DID: PrismDIDType1TransmittedFrameIndicator, Status: 0x0, Length: 0x0, Data: []uint8{}}, + PrismValue{DID: PrismDIDType1FrameLength, Status: 0x0, Length: 0x4, Data: []uint8{0x7e, 0x0, 0x0, 0x0}}, + }, + } + + if !reflect.DeepEqual(got, want) { + t.Errorf("RadioTap packet processing failed:\ngot :\n%#v\n\nwant :\n%#v\n\n", got, want) + } + } + + if got, ok := p.Layer(LayerTypeDot11).(*Dot11); ok { + want := &Dot11{ + BaseLayer: BaseLayer{ + Contents: []uint8{0x40, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcc, 0xfa, 0x0, 0xad, 0x79, 0xe8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x41}, + Payload: []uint8{0x0, 0x0, 0x1, 0x4, 0x2, 0x4, 0xb, 0x16, 0x32, 0x8, 0xc, 0x12, 0x18, 0x24, 0x30, 0x48, 0x60, 0x6c, 0x3, 0x1, 0x1, 0x2d, 0x1a, 0x2d, 0x11, 0x17, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0xdd, 0x9, 0x0, 0x10, 0x18, 0x2, 0x0, 0x0, 0x10, 0x0, 0x0, 0xdd, 0x1e, 0x0, 0x90, 0x4c, 0x33, 0x2d, 0x11, 0x17, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, + }, + Type: 0x10, + Proto: 0x0, + Flags: 0x0, + DurationID: 0x0, + Address1: net.HardwareAddr{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, + Address2: net.HardwareAddr{0xcc, 0xfa, 0x0, 0xad, 0x79, 0xe8}, + Address3: net.HardwareAddr{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, + Address4: net.HardwareAddr(nil), + SequenceNumber: 0x041a, + FragmentNumber: 0x0, + Checksum: 0x0, + } + + if !reflect.DeepEqual(got, want) { + t.Errorf("Dot11 packet processing failed:\ngot :\n%#v\n\nwant :\n%#v\n\n", got, want) + } + } +} + +func BenchmarkDecodePacketPrism(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testPacketPrism, LinkTypePrismHeader, gopacket.NoCopy) + } +} diff --git a/vendor/github.com/google/gopacket/layers/radiotap.go b/vendor/github.com/google/gopacket/layers/radiotap.go new file mode 100644 index 0000000..4304e75 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/radiotap.go @@ -0,0 +1,1045 @@ +// Copyright 2014 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 layers + +import ( + "bytes" + "encoding/binary" + "fmt" + "hash/crc32" + "strings" + + "github.com/google/gopacket" +) + +// align calculates the number of bytes needed to align with the width +// on the offset, returning the number of bytes we need to skip to +// align to the offset (width). +func align(offset uint16, width uint16) uint16 { + return ((((offset) + ((width) - 1)) & (^((width) - 1))) - offset) +} + +type RadioTapPresent uint32 + +const ( + RadioTapPresentTSFT RadioTapPresent = 1 << iota + RadioTapPresentFlags + RadioTapPresentRate + RadioTapPresentChannel + RadioTapPresentFHSS + RadioTapPresentDBMAntennaSignal + RadioTapPresentDBMAntennaNoise + RadioTapPresentLockQuality + RadioTapPresentTxAttenuation + RadioTapPresentDBTxAttenuation + RadioTapPresentDBMTxPower + RadioTapPresentAntenna + RadioTapPresentDBAntennaSignal + RadioTapPresentDBAntennaNoise + RadioTapPresentRxFlags + RadioTapPresentTxFlags + RadioTapPresentRtsRetries + RadioTapPresentDataRetries + _ + RadioTapPresentMCS + RadioTapPresentAMPDUStatus + RadioTapPresentVHT + RadioTapPresentEXT RadioTapPresent = 1 << 31 +) + +func (r RadioTapPresent) TSFT() bool { + return r&RadioTapPresentTSFT != 0 +} +func (r RadioTapPresent) Flags() bool { + return r&RadioTapPresentFlags != 0 +} +func (r RadioTapPresent) Rate() bool { + return r&RadioTapPresentRate != 0 +} +func (r RadioTapPresent) Channel() bool { + return r&RadioTapPresentChannel != 0 +} +func (r RadioTapPresent) FHSS() bool { + return r&RadioTapPresentFHSS != 0 +} +func (r RadioTapPresent) DBMAntennaSignal() bool { + return r&RadioTapPresentDBMAntennaSignal != 0 +} +func (r RadioTapPresent) DBMAntennaNoise() bool { + return r&RadioTapPresentDBMAntennaNoise != 0 +} +func (r RadioTapPresent) LockQuality() bool { + return r&RadioTapPresentLockQuality != 0 +} +func (r RadioTapPresent) TxAttenuation() bool { + return r&RadioTapPresentTxAttenuation != 0 +} +func (r RadioTapPresent) DBTxAttenuation() bool { + return r&RadioTapPresentDBTxAttenuation != 0 +} +func (r RadioTapPresent) DBMTxPower() bool { + return r&RadioTapPresentDBMTxPower != 0 +} +func (r RadioTapPresent) Antenna() bool { + return r&RadioTapPresentAntenna != 0 +} +func (r RadioTapPresent) DBAntennaSignal() bool { + return r&RadioTapPresentDBAntennaSignal != 0 +} +func (r RadioTapPresent) DBAntennaNoise() bool { + return r&RadioTapPresentDBAntennaNoise != 0 +} +func (r RadioTapPresent) RxFlags() bool { + return r&RadioTapPresentRxFlags != 0 +} +func (r RadioTapPresent) TxFlags() bool { + return r&RadioTapPresentTxFlags != 0 +} +func (r RadioTapPresent) RtsRetries() bool { + return r&RadioTapPresentRtsRetries != 0 +} +func (r RadioTapPresent) DataRetries() bool { + return r&RadioTapPresentDataRetries != 0 +} +func (r RadioTapPresent) MCS() bool { + return r&RadioTapPresentMCS != 0 +} +func (r RadioTapPresent) AMPDUStatus() bool { + return r&RadioTapPresentAMPDUStatus != 0 +} +func (r RadioTapPresent) VHT() bool { + return r&RadioTapPresentVHT != 0 +} +func (r RadioTapPresent) EXT() bool { + return r&RadioTapPresentEXT != 0 +} + +type RadioTapChannelFlags uint16 + +const ( + RadioTapChannelFlagsTurbo RadioTapChannelFlags = 0x0010 // Turbo channel + RadioTapChannelFlagsCCK RadioTapChannelFlags = 0x0020 // CCK channel + RadioTapChannelFlagsOFDM RadioTapChannelFlags = 0x0040 // OFDM channel + RadioTapChannelFlagsGhz2 RadioTapChannelFlags = 0x0080 // 2 GHz spectrum channel. + RadioTapChannelFlagsGhz5 RadioTapChannelFlags = 0x0100 // 5 GHz spectrum channel + RadioTapChannelFlagsPassive RadioTapChannelFlags = 0x0200 // Only passive scan allowed + RadioTapChannelFlagsDynamic RadioTapChannelFlags = 0x0400 // Dynamic CCK-OFDM channel + RadioTapChannelFlagsGFSK RadioTapChannelFlags = 0x0800 // GFSK channel (FHSS PHY) +) + +func (r RadioTapChannelFlags) Turbo() bool { + return r&RadioTapChannelFlagsTurbo != 0 +} +func (r RadioTapChannelFlags) CCK() bool { + return r&RadioTapChannelFlagsCCK != 0 +} +func (r RadioTapChannelFlags) OFDM() bool { + return r&RadioTapChannelFlagsOFDM != 0 +} +func (r RadioTapChannelFlags) Ghz2() bool { + return r&RadioTapChannelFlagsGhz2 != 0 +} +func (r RadioTapChannelFlags) Ghz5() bool { + return r&RadioTapChannelFlagsGhz5 != 0 +} +func (r RadioTapChannelFlags) Passive() bool { + return r&RadioTapChannelFlagsPassive != 0 +} +func (r RadioTapChannelFlags) Dynamic() bool { + return r&RadioTapChannelFlagsDynamic != 0 +} +func (r RadioTapChannelFlags) GFSK() bool { + return r&RadioTapChannelFlagsGFSK != 0 +} + +// String provides a human readable string for RadioTapChannelFlags. +// This string is possibly subject to change over time; if you're storing this +// persistently, you should probably store the RadioTapChannelFlags value, not its string. +func (a RadioTapChannelFlags) String() string { + var out bytes.Buffer + if a.Turbo() { + out.WriteString("Turbo,") + } + if a.CCK() { + out.WriteString("CCK,") + } + if a.OFDM() { + out.WriteString("OFDM,") + } + if a.Ghz2() { + out.WriteString("Ghz2,") + } + if a.Ghz5() { + out.WriteString("Ghz5,") + } + if a.Passive() { + out.WriteString("Passive,") + } + if a.Dynamic() { + out.WriteString("Dynamic,") + } + if a.GFSK() { + out.WriteString("GFSK,") + } + + if length := out.Len(); length > 0 { + return string(out.Bytes()[:length-1]) // strip final comma + } + return "" +} + +type RadioTapFlags uint8 + +const ( + RadioTapFlagsCFP RadioTapFlags = 1 << iota // sent/received during CFP + RadioTapFlagsShortPreamble // sent/received * with short * preamble + RadioTapFlagsWEP // sent/received * with WEP encryption + RadioTapFlagsFrag // sent/received * with fragmentation + RadioTapFlagsFCS // frame includes FCS + RadioTapFlagsDatapad // frame has padding between * 802.11 header and payload * (to 32-bit boundary) + RadioTapFlagsBadFCS // does not pass FCS check + RadioTapFlagsShortGI // HT short GI +) + +func (r RadioTapFlags) CFP() bool { + return r&RadioTapFlagsCFP != 0 +} +func (r RadioTapFlags) ShortPreamble() bool { + return r&RadioTapFlagsShortPreamble != 0 +} +func (r RadioTapFlags) WEP() bool { + return r&RadioTapFlagsWEP != 0 +} +func (r RadioTapFlags) Frag() bool { + return r&RadioTapFlagsFrag != 0 +} +func (r RadioTapFlags) FCS() bool { + return r&RadioTapFlagsFCS != 0 +} +func (r RadioTapFlags) Datapad() bool { + return r&RadioTapFlagsDatapad != 0 +} +func (r RadioTapFlags) BadFCS() bool { + return r&RadioTapFlagsBadFCS != 0 +} +func (r RadioTapFlags) ShortGI() bool { + return r&RadioTapFlagsShortGI != 0 +} + +// String provides a human readable string for RadioTapFlags. +// This string is possibly subject to change over time; if you're storing this +// persistently, you should probably store the RadioTapFlags value, not its string. +func (a RadioTapFlags) String() string { + var out bytes.Buffer + if a.CFP() { + out.WriteString("CFP,") + } + if a.ShortPreamble() { + out.WriteString("SHORT-PREAMBLE,") + } + if a.WEP() { + out.WriteString("WEP,") + } + if a.Frag() { + out.WriteString("FRAG,") + } + if a.FCS() { + out.WriteString("FCS,") + } + if a.Datapad() { + out.WriteString("DATAPAD,") + } + if a.ShortGI() { + out.WriteString("SHORT-GI,") + } + + if length := out.Len(); length > 0 { + return string(out.Bytes()[:length-1]) // strip final comma + } + return "" +} + +type RadioTapRate uint8 + +func (a RadioTapRate) String() string { + return fmt.Sprintf("%v Mb/s", 0.5*float32(a)) +} + +type RadioTapChannelFrequency uint16 + +func (a RadioTapChannelFrequency) String() string { + return fmt.Sprintf("%d MHz", a) +} + +type RadioTapRxFlags uint16 + +const ( + RadioTapRxFlagsBadPlcp RadioTapRxFlags = 0x0002 +) + +func (self RadioTapRxFlags) BadPlcp() bool { + return self&RadioTapRxFlagsBadPlcp != 0 +} + +func (self RadioTapRxFlags) String() string { + if self.BadPlcp() { + return "BADPLCP" + } + return "" +} + +type RadioTapTxFlags uint16 + +const ( + RadioTapTxFlagsFail RadioTapTxFlags = 1 << iota + RadioTapTxFlagsCTS + RadioTapTxFlagsRTS + RadioTapTxFlagsNoACK +) + +func (self RadioTapTxFlags) Fail() bool { return self&RadioTapTxFlagsFail != 0 } +func (self RadioTapTxFlags) CTS() bool { return self&RadioTapTxFlagsCTS != 0 } +func (self RadioTapTxFlags) RTS() bool { return self&RadioTapTxFlagsRTS != 0 } +func (self RadioTapTxFlags) NoACK() bool { return self&RadioTapTxFlagsNoACK != 0 } + +func (self RadioTapTxFlags) String() string { + var tokens []string + if self.Fail() { + tokens = append(tokens, "Fail") + } + if self.CTS() { + tokens = append(tokens, "CTS") + } + if self.RTS() { + tokens = append(tokens, "RTS") + } + if self.NoACK() { + tokens = append(tokens, "NoACK") + } + return strings.Join(tokens, ",") +} + +type RadioTapMCS struct { + Known RadioTapMCSKnown + Flags RadioTapMCSFlags + MCS uint8 +} + +func (self RadioTapMCS) String() string { + var tokens []string + if self.Known.Bandwidth() { + token := "?" + switch self.Flags.Bandwidth() { + case 0: + token = "20" + case 1: + token = "40" + case 2: + token = "40(20L)" + case 3: + token = "40(20U)" + } + tokens = append(tokens, token) + } + if self.Known.MCSIndex() { + tokens = append(tokens, fmt.Sprintf("MCSIndex#%d", self.MCS)) + } + if self.Known.GuardInterval() { + if self.Flags.ShortGI() { + tokens = append(tokens, fmt.Sprintf("shortGI")) + } else { + tokens = append(tokens, fmt.Sprintf("longGI")) + } + } + if self.Known.HTFormat() { + if self.Flags.Greenfield() { + tokens = append(tokens, fmt.Sprintf("HT-greenfield")) + } else { + tokens = append(tokens, fmt.Sprintf("HT-mixed")) + } + } + if self.Known.FECType() { + if self.Flags.FECLDPC() { + tokens = append(tokens, fmt.Sprintf("LDPC")) + } else { + tokens = append(tokens, fmt.Sprintf("BCC")) + } + } + if self.Known.STBC() { + tokens = append(tokens, fmt.Sprintf("STBC#%d", self.Flags.STBC())) + } + if self.Known.NESS() { + num := 0 + if self.Known.NESS1() { + num |= 0x02 + } + if self.Flags.NESS0() { + num |= 0x01 + } + tokens = append(tokens, fmt.Sprintf("num-of-ESS#%d", num)) + } + return strings.Join(tokens, ",") +} + +type RadioTapMCSKnown uint8 + +const ( + RadioTapMCSKnownBandwidth RadioTapMCSKnown = 1 << iota + RadioTapMCSKnownMCSIndex + RadioTapMCSKnownGuardInterval + RadioTapMCSKnownHTFormat + RadioTapMCSKnownFECType + RadioTapMCSKnownSTBC + RadioTapMCSKnownNESS + RadioTapMCSKnownNESS1 +) + +func (self RadioTapMCSKnown) Bandwidth() bool { return self&RadioTapMCSKnownBandwidth != 0 } +func (self RadioTapMCSKnown) MCSIndex() bool { return self&RadioTapMCSKnownMCSIndex != 0 } +func (self RadioTapMCSKnown) GuardInterval() bool { return self&RadioTapMCSKnownGuardInterval != 0 } +func (self RadioTapMCSKnown) HTFormat() bool { return self&RadioTapMCSKnownHTFormat != 0 } +func (self RadioTapMCSKnown) FECType() bool { return self&RadioTapMCSKnownFECType != 0 } +func (self RadioTapMCSKnown) STBC() bool { return self&RadioTapMCSKnownSTBC != 0 } +func (self RadioTapMCSKnown) NESS() bool { return self&RadioTapMCSKnownNESS != 0 } +func (self RadioTapMCSKnown) NESS1() bool { return self&RadioTapMCSKnownNESS1 != 0 } + +type RadioTapMCSFlags uint8 + +const ( + RadioTapMCSFlagsBandwidthMask RadioTapMCSFlags = 0x03 + RadioTapMCSFlagsShortGI = 0x04 + RadioTapMCSFlagsGreenfield = 0x08 + RadioTapMCSFlagsFECLDPC = 0x10 + RadioTapMCSFlagsSTBCMask = 0x60 + RadioTapMCSFlagsNESS0 = 0x80 +) + +func (self RadioTapMCSFlags) Bandwidth() int { + return int(self & RadioTapMCSFlagsBandwidthMask) +} +func (self RadioTapMCSFlags) ShortGI() bool { return self&RadioTapMCSFlagsShortGI != 0 } +func (self RadioTapMCSFlags) Greenfield() bool { return self&RadioTapMCSFlagsGreenfield != 0 } +func (self RadioTapMCSFlags) FECLDPC() bool { return self&RadioTapMCSFlagsFECLDPC != 0 } +func (self RadioTapMCSFlags) STBC() int { + return int(self&RadioTapMCSFlagsSTBCMask) >> 5 +} +func (self RadioTapMCSFlags) NESS0() bool { return self&RadioTapMCSFlagsNESS0 != 0 } + +type RadioTapAMPDUStatus struct { + Reference uint32 + Flags RadioTapAMPDUStatusFlags + CRC uint8 +} + +func (self RadioTapAMPDUStatus) String() string { + tokens := []string{ + fmt.Sprintf("ref#%x", self.Reference), + } + if self.Flags.ReportZerolen() && self.Flags.IsZerolen() { + tokens = append(tokens, fmt.Sprintf("zero-length")) + } + if self.Flags.LastKnown() && self.Flags.IsLast() { + tokens = append(tokens, "last") + } + if self.Flags.DelimCRCErr() { + tokens = append(tokens, "delimiter CRC error") + } + if self.Flags.DelimCRCKnown() { + tokens = append(tokens, fmt.Sprintf("delimiter-CRC=%02x", self.CRC)) + } + return strings.Join(tokens, ",") +} + +type RadioTapAMPDUStatusFlags uint16 + +const ( + RadioTapAMPDUStatusFlagsReportZerolen RadioTapAMPDUStatusFlags = 1 << iota + RadioTapAMPDUIsZerolen + RadioTapAMPDULastKnown + RadioTapAMPDUIsLast + RadioTapAMPDUDelimCRCErr + RadioTapAMPDUDelimCRCKnown +) + +func (self RadioTapAMPDUStatusFlags) ReportZerolen() bool { + return self&RadioTapAMPDUStatusFlagsReportZerolen != 0 +} +func (self RadioTapAMPDUStatusFlags) IsZerolen() bool { return self&RadioTapAMPDUIsZerolen != 0 } +func (self RadioTapAMPDUStatusFlags) LastKnown() bool { return self&RadioTapAMPDULastKnown != 0 } +func (self RadioTapAMPDUStatusFlags) IsLast() bool { return self&RadioTapAMPDUIsLast != 0 } +func (self RadioTapAMPDUStatusFlags) DelimCRCErr() bool { return self&RadioTapAMPDUDelimCRCErr != 0 } +func (self RadioTapAMPDUStatusFlags) DelimCRCKnown() bool { return self&RadioTapAMPDUDelimCRCKnown != 0 } + +type RadioTapVHT struct { + Known RadioTapVHTKnown + Flags RadioTapVHTFlags + Bandwidth uint8 + MCSNSS [4]RadioTapVHTMCSNSS + Coding uint8 + GroupId uint8 + PartialAID uint16 +} + +func (self RadioTapVHT) String() string { + var tokens []string + if self.Known.STBC() { + if self.Flags.STBC() { + tokens = append(tokens, "STBC") + } else { + tokens = append(tokens, "no STBC") + } + } + if self.Known.TXOPPSNotAllowed() { + if self.Flags.TXOPPSNotAllowed() { + tokens = append(tokens, "TXOP doze not allowed") + } else { + tokens = append(tokens, "TXOP doze allowed") + } + } + if self.Known.GI() { + if self.Flags.SGI() { + tokens = append(tokens, "short GI") + } else { + tokens = append(tokens, "long GI") + } + } + if self.Known.SGINSYMDisambiguation() { + if self.Flags.SGINSYMMod() { + tokens = append(tokens, "NSYM mod 10=9") + } else { + tokens = append(tokens, "NSYM mod 10!=9 or no short GI") + } + } + if self.Known.LDPCExtraOFDMSymbol() { + if self.Flags.LDPCExtraOFDMSymbol() { + tokens = append(tokens, "LDPC extra OFDM symbols") + } else { + tokens = append(tokens, "no LDPC extra OFDM symbols") + } + } + if self.Known.Beamformed() { + if self.Flags.Beamformed() { + tokens = append(tokens, "beamformed") + } else { + tokens = append(tokens, "no beamformed") + } + } + if self.Known.Bandwidth() { + token := "?" + switch self.Bandwidth & 0x1f { + case 0: + token = "20" + case 1: + token = "40" + case 2: + token = "40(20L)" + case 3: + token = "40(20U)" + case 4: + token = "80" + case 5: + token = "80(40L)" + case 6: + token = "80(40U)" + case 7: + token = "80(20LL)" + case 8: + token = "80(20LU)" + case 9: + token = "80(20UL)" + case 10: + token = "80(20UU)" + case 11: + token = "160" + case 12: + token = "160(80L)" + case 13: + token = "160(80U)" + case 14: + token = "160(40LL)" + case 15: + token = "160(40LU)" + case 16: + token = "160(40UL)" + case 17: + token = "160(40UU)" + case 18: + token = "160(20LLL)" + case 19: + token = "160(20LLU)" + case 20: + token = "160(20LUL)" + case 21: + token = "160(20LUU)" + case 22: + token = "160(20ULL)" + case 23: + token = "160(20ULU)" + case 24: + token = "160(20UUL)" + case 25: + token = "160(20UUU)" + } + tokens = append(tokens, token) + } + for i, MCSNSS := range self.MCSNSS { + if MCSNSS.Present() { + fec := "?" + switch self.Coding & (1 << uint8(i)) { + case 0: + fec = "BCC" + case 1: + fec = "LDPC" + } + tokens = append(tokens, fmt.Sprintf("user%d(%s,%s)", i, MCSNSS.String(), fec)) + } + } + if self.Known.GroupId() { + tokens = append(tokens, + fmt.Sprintf("group=%d", self.GroupId)) + } + if self.Known.PartialAID() { + tokens = append(tokens, + fmt.Sprintf("partial-AID=%d", self.PartialAID)) + } + return strings.Join(tokens, ",") +} + +type RadioTapVHTKnown uint16 + +const ( + RadioTapVHTKnownSTBC RadioTapVHTKnown = 1 << iota + RadioTapVHTKnownTXOPPSNotAllowed + RadioTapVHTKnownGI + RadioTapVHTKnownSGINSYMDisambiguation + RadioTapVHTKnownLDPCExtraOFDMSymbol + RadioTapVHTKnownBeamformed + RadioTapVHTKnownBandwidth + RadioTapVHTKnownGroupId + RadioTapVHTKnownPartialAID +) + +func (self RadioTapVHTKnown) STBC() bool { return self&RadioTapVHTKnownSTBC != 0 } +func (self RadioTapVHTKnown) TXOPPSNotAllowed() bool { + return self&RadioTapVHTKnownTXOPPSNotAllowed != 0 +} +func (self RadioTapVHTKnown) GI() bool { return self&RadioTapVHTKnownGI != 0 } +func (self RadioTapVHTKnown) SGINSYMDisambiguation() bool { + return self&RadioTapVHTKnownSGINSYMDisambiguation != 0 +} +func (self RadioTapVHTKnown) LDPCExtraOFDMSymbol() bool { + return self&RadioTapVHTKnownLDPCExtraOFDMSymbol != 0 +} +func (self RadioTapVHTKnown) Beamformed() bool { return self&RadioTapVHTKnownBeamformed != 0 } +func (self RadioTapVHTKnown) Bandwidth() bool { return self&RadioTapVHTKnownBandwidth != 0 } +func (self RadioTapVHTKnown) GroupId() bool { return self&RadioTapVHTKnownGroupId != 0 } +func (self RadioTapVHTKnown) PartialAID() bool { return self&RadioTapVHTKnownPartialAID != 0 } + +type RadioTapVHTFlags uint8 + +const ( + RadioTapVHTFlagsSTBC RadioTapVHTFlags = 1 << iota + RadioTapVHTFlagsTXOPPSNotAllowed + RadioTapVHTFlagsSGI + RadioTapVHTFlagsSGINSYMMod + RadioTapVHTFlagsLDPCExtraOFDMSymbol + RadioTapVHTFlagsBeamformed +) + +func (self RadioTapVHTFlags) STBC() bool { return self&RadioTapVHTFlagsSTBC != 0 } +func (self RadioTapVHTFlags) TXOPPSNotAllowed() bool { + return self&RadioTapVHTFlagsTXOPPSNotAllowed != 0 +} +func (self RadioTapVHTFlags) SGI() bool { return self&RadioTapVHTFlagsSGI != 0 } +func (self RadioTapVHTFlags) SGINSYMMod() bool { return self&RadioTapVHTFlagsSGINSYMMod != 0 } +func (self RadioTapVHTFlags) LDPCExtraOFDMSymbol() bool { + return self&RadioTapVHTFlagsLDPCExtraOFDMSymbol != 0 +} +func (self RadioTapVHTFlags) Beamformed() bool { return self&RadioTapVHTFlagsBeamformed != 0 } + +type RadioTapVHTMCSNSS uint8 + +func (self RadioTapVHTMCSNSS) Present() bool { + return self&0x0F != 0 +} + +func (self RadioTapVHTMCSNSS) String() string { + return fmt.Sprintf("NSS#%dMCS#%d", uint32(self&0xf), uint32(self>>4)) +} + +func decodeRadioTap(data []byte, p gopacket.PacketBuilder) error { + d := &RadioTap{} + // TODO: Should we set LinkLayer here? And implement LinkFlow + return decodingLayerDecoder(d, data, p) +} + +type RadioTap struct { + BaseLayer + + // Version 0. Only increases for drastic changes, introduction of compatible new fields does not count. + Version uint8 + // Length of the whole header in bytes, including it_version, it_pad, it_len, and data fields. + Length uint16 + // Present is a bitmap telling which fields are present. Set bit 31 (0x80000000) to extend the bitmap by another 32 bits. Additional extensions are made by setting bit 31. + Present RadioTapPresent + // TSFT: value in microseconds of the MAC's 64-bit 802.11 Time Synchronization Function timer when the first bit of the MPDU arrived at the MAC. For received frames, only. + TSFT uint64 + Flags RadioTapFlags + // Rate Tx/Rx data rate + Rate RadioTapRate + // ChannelFrequency Tx/Rx frequency in MHz, followed by flags + ChannelFrequency RadioTapChannelFrequency + ChannelFlags RadioTapChannelFlags + // FHSS For frequency-hopping radios, the hop set (first byte) and pattern (second byte). + FHSS uint16 + // DBMAntennaSignal RF signal power at the antenna, decibel difference from one milliwatt. + DBMAntennaSignal int8 + // DBMAntennaNoise RF noise power at the antenna, decibel difference from one milliwatt. + DBMAntennaNoise int8 + // LockQuality Quality of Barker code lock. Unitless. Monotonically nondecreasing with "better" lock strength. Called "Signal Quality" in datasheets. + LockQuality uint16 + // TxAttenuation Transmit power expressed as unitless distance from max power set at factory calibration. 0 is max power. Monotonically nondecreasing with lower power levels. + TxAttenuation uint16 + // DBTxAttenuation Transmit power expressed as decibel distance from max power set at factory calibration. 0 is max power. Monotonically nondecreasing with lower power levels. + DBTxAttenuation uint16 + // DBMTxPower Transmit power expressed as dBm (decibels from a 1 milliwatt reference). This is the absolute power level measured at the antenna port. + DBMTxPower int8 + // Antenna Unitless indication of the Rx/Tx antenna for this packet. The first antenna is antenna 0. + Antenna uint8 + // DBAntennaSignal RF signal power at the antenna, decibel difference from an arbitrary, fixed reference. + DBAntennaSignal uint8 + // DBAntennaNoise RF noise power at the antenna, decibel difference from an arbitrary, fixed reference point. + DBAntennaNoise uint8 + // + RxFlags RadioTapRxFlags + TxFlags RadioTapTxFlags + RtsRetries uint8 + DataRetries uint8 + MCS RadioTapMCS + AMPDUStatus RadioTapAMPDUStatus + VHT RadioTapVHT +} + +func (m *RadioTap) LayerType() gopacket.LayerType { return LayerTypeRadioTap } + +func (m *RadioTap) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + m.Version = uint8(data[0]) + m.Length = binary.LittleEndian.Uint16(data[2:4]) + m.Present = RadioTapPresent(binary.LittleEndian.Uint32(data[4:8])) + + offset := uint16(4) + + for (binary.LittleEndian.Uint32(data[offset:offset+4]) & 0x80000000) != 0 { + // This parser only handles standard radiotap namespace, + // and expects all fields are packed in the first it_present. + // Extended bitmap will be just ignored. + offset += 4 + } + offset += 4 // skip the bitmap + + if m.Present.TSFT() { + offset += align(offset, 8) + m.TSFT = binary.LittleEndian.Uint64(data[offset : offset+8]) + offset += 8 + } + if m.Present.Flags() { + m.Flags = RadioTapFlags(data[offset]) + offset++ + } + if m.Present.Rate() { + m.Rate = RadioTapRate(data[offset]) + offset++ + } + if m.Present.Channel() { + offset += align(offset, 2) + m.ChannelFrequency = RadioTapChannelFrequency(binary.LittleEndian.Uint16(data[offset : offset+2])) + offset += 2 + m.ChannelFlags = RadioTapChannelFlags(binary.LittleEndian.Uint16(data[offset : offset+2])) + offset += 2 + } + if m.Present.FHSS() { + m.FHSS = binary.LittleEndian.Uint16(data[offset : offset+2]) + offset += 2 + } + if m.Present.DBMAntennaSignal() { + m.DBMAntennaSignal = int8(data[offset]) + offset++ + } + if m.Present.DBMAntennaNoise() { + m.DBMAntennaNoise = int8(data[offset]) + offset++ + } + if m.Present.LockQuality() { + offset += align(offset, 2) + m.LockQuality = binary.LittleEndian.Uint16(data[offset : offset+2]) + offset += 2 + } + if m.Present.TxAttenuation() { + offset += align(offset, 2) + m.TxAttenuation = binary.LittleEndian.Uint16(data[offset : offset+2]) + offset += 2 + } + if m.Present.DBTxAttenuation() { + offset += align(offset, 2) + m.DBTxAttenuation = binary.LittleEndian.Uint16(data[offset : offset+2]) + offset += 2 + } + if m.Present.DBMTxPower() { + m.DBMTxPower = int8(data[offset]) + offset++ + } + if m.Present.Antenna() { + m.Antenna = uint8(data[offset]) + offset++ + } + if m.Present.DBAntennaSignal() { + m.DBAntennaSignal = uint8(data[offset]) + offset++ + } + if m.Present.DBAntennaNoise() { + m.DBAntennaNoise = uint8(data[offset]) + offset++ + } + if m.Present.RxFlags() { + offset += align(offset, 2) + m.RxFlags = RadioTapRxFlags(binary.LittleEndian.Uint16(data[offset:])) + offset += 2 + } + if m.Present.TxFlags() { + offset += align(offset, 2) + m.TxFlags = RadioTapTxFlags(binary.LittleEndian.Uint16(data[offset:])) + offset += 2 + } + if m.Present.RtsRetries() { + m.RtsRetries = uint8(data[offset]) + offset++ + } + if m.Present.DataRetries() { + m.DataRetries = uint8(data[offset]) + offset++ + } + if m.Present.MCS() { + m.MCS = RadioTapMCS{ + RadioTapMCSKnown(data[offset]), + RadioTapMCSFlags(data[offset+1]), + uint8(data[offset+2]), + } + offset += 3 + } + if m.Present.AMPDUStatus() { + offset += align(offset, 4) + m.AMPDUStatus = RadioTapAMPDUStatus{ + Reference: binary.LittleEndian.Uint32(data[offset:]), + Flags: RadioTapAMPDUStatusFlags(binary.LittleEndian.Uint16(data[offset+4:])), + CRC: uint8(data[offset+6]), + } + offset += 8 + } + if m.Present.VHT() { + offset += align(offset, 2) + m.VHT = RadioTapVHT{ + Known: RadioTapVHTKnown(binary.LittleEndian.Uint16(data[offset:])), + Flags: RadioTapVHTFlags(data[offset+2]), + Bandwidth: uint8(data[offset+3]), + MCSNSS: [4]RadioTapVHTMCSNSS{ + RadioTapVHTMCSNSS(data[offset+4]), + RadioTapVHTMCSNSS(data[offset+5]), + RadioTapVHTMCSNSS(data[offset+6]), + RadioTapVHTMCSNSS(data[offset+7]), + }, + Coding: uint8(data[offset+8]), + GroupId: uint8(data[offset+9]), + PartialAID: binary.LittleEndian.Uint16(data[offset+10:]), + } + offset += 12 + } + + payload := data[m.Length:] + if !m.Flags.FCS() { // Dot11.DecodeFromBytes() expects FCS present + fcs := make([]byte, 4) + h := crc32.NewIEEE() + h.Write(payload) + binary.LittleEndian.PutUint32(fcs, h.Sum32()) + payload = append(payload, fcs...) + } + m.BaseLayer = BaseLayer{Contents: data[:m.Length], Payload: payload} + + return nil +} + +func (m RadioTap) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + buf := make([]byte, 1024) + + buf[0] = m.Version + buf[1] = 0 + + binary.LittleEndian.PutUint32(buf[4:8], uint32(m.Present)) + + offset := uint16(4) + + for (binary.LittleEndian.Uint32(buf[offset:offset+4]) & 0x80000000) != 0 { + offset += 4 + } + + offset += 4 + + if m.Present.TSFT() { + offset += align(offset, 8) + binary.LittleEndian.PutUint64(buf[offset:offset+8], m.TSFT) + offset += 8 + } + + if m.Present.Flags() { + buf[offset] = uint8(m.Flags) + offset++ + } + + if m.Present.Rate() { + buf[offset] = uint8(m.Rate) + offset++ + } + + if m.Present.Channel() { + offset += align(offset, 2) + binary.LittleEndian.PutUint16(buf[offset:offset+2], uint16(m.ChannelFrequency)) + offset += 2 + binary.LittleEndian.PutUint16(buf[offset:offset+2], uint16(m.ChannelFlags)) + offset += 2 + } + + if m.Present.FHSS() { + binary.LittleEndian.PutUint16(buf[offset:offset+2], m.FHSS) + offset += 2 + } + + if m.Present.DBMAntennaSignal() { + buf[offset] = byte(m.DBMAntennaSignal) + offset++ + } + + if m.Present.DBMAntennaNoise() { + buf[offset] = byte(m.DBMAntennaNoise) + offset++ + } + + if m.Present.LockQuality() { + offset += align(offset, 2) + binary.LittleEndian.PutUint16(buf[offset:offset+2], m.LockQuality) + offset += 2 + } + + if m.Present.TxAttenuation() { + offset += align(offset, 2) + binary.LittleEndian.PutUint16(buf[offset:offset+2], m.TxAttenuation) + offset += 2 + } + + if m.Present.DBTxAttenuation() { + offset += align(offset, 2) + binary.LittleEndian.PutUint16(buf[offset:offset+2], m.DBTxAttenuation) + offset += 2 + } + + if m.Present.DBMTxPower() { + buf[offset] = byte(m.DBMTxPower) + offset++ + } + + if m.Present.Antenna() { + buf[offset] = uint8(m.Antenna) + offset++ + } + + if m.Present.DBAntennaSignal() { + buf[offset] = uint8(m.DBAntennaSignal) + offset++ + } + + if m.Present.DBAntennaNoise() { + buf[offset] = uint8(m.DBAntennaNoise) + offset++ + } + + if m.Present.RxFlags() { + offset += align(offset, 2) + binary.LittleEndian.PutUint16(buf[offset:offset+2], uint16(m.RxFlags)) + offset += 2 + } + + if m.Present.TxFlags() { + offset += align(offset, 2) + binary.LittleEndian.PutUint16(buf[offset:offset+2], uint16(m.TxFlags)) + offset += 2 + } + + if m.Present.RtsRetries() { + buf[offset] = m.RtsRetries + offset++ + } + + if m.Present.DataRetries() { + buf[offset] = m.DataRetries + offset++ + } + + if m.Present.MCS() { + buf[offset] = uint8(m.MCS.Known) + buf[offset+1] = uint8(m.MCS.Flags) + buf[offset+2] = uint8(m.MCS.MCS) + + offset += 3 + } + + if m.Present.AMPDUStatus() { + offset += align(offset, 4) + + binary.LittleEndian.PutUint32(buf[offset:offset+4], m.AMPDUStatus.Reference) + binary.LittleEndian.PutUint16(buf[offset+4:offset+6], uint16(m.AMPDUStatus.Flags)) + + buf[offset+6] = m.AMPDUStatus.CRC + + offset += 8 + } + + if m.Present.VHT() { + offset += align(offset, 2) + + binary.LittleEndian.PutUint16(buf[offset:], uint16(m.VHT.Known)) + + buf[offset+2] = uint8(m.VHT.Flags) + buf[offset+3] = uint8(m.VHT.Bandwidth) + buf[offset+4] = uint8(m.VHT.MCSNSS[0]) + buf[offset+5] = uint8(m.VHT.MCSNSS[1]) + buf[offset+6] = uint8(m.VHT.MCSNSS[2]) + buf[offset+7] = uint8(m.VHT.MCSNSS[3]) + buf[offset+8] = uint8(m.VHT.Coding) + buf[offset+9] = uint8(m.VHT.GroupId) + + binary.LittleEndian.PutUint16(buf[offset+10:offset+12], m.VHT.PartialAID) + + offset += 12 + } + + packetBuf, err := b.PrependBytes(int(offset)) + + if err != nil { + return err + } + + if opts.FixLengths { + m.Length = offset + } + + binary.LittleEndian.PutUint16(buf[2:4], m.Length) + + copy(packetBuf, buf) + + return nil +} + +func (m *RadioTap) CanDecode() gopacket.LayerClass { return LayerTypeRadioTap } +func (m *RadioTap) NextLayerType() gopacket.LayerType { return LayerTypeDot11 } diff --git a/vendor/github.com/google/gopacket/layers/radiotap_test.go b/vendor/github.com/google/gopacket/layers/radiotap_test.go new file mode 100644 index 0000000..4d3c7d0 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/radiotap_test.go @@ -0,0 +1,79 @@ +// 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 layers + +import ( + "github.com/google/gopacket" + "testing" +) + +// testPacketRadiotap0 is the packet: +// 09:34:34.799438 1.0 Mb/s 2412 MHz 11b -58dB signal antenna 7 Acknowledgment RA:88:1f:a1:ae:9d:cb +// 0x0000: 0000 1200 2e48 0000 1002 6c09 a000 c607 .....H....l..... +// 0x0010: 0000 d400 0000 881f a1ae 9dcb c630 4b4b .............0KK +var testPacketRadiotap0 = []byte{ + 0x00, 0x00, 0x12, 0x00, 0x2e, 0x48, 0x00, 0x00, 0x10, 0x02, 0x6c, 0x09, 0xa0, 0x00, 0xc6, 0x07, + 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0x88, 0x1f, 0xa1, 0xae, 0x9d, 0xcb, 0xc6, 0x30, 0x4b, 0x4b, +} + +func TestPacketRadiotap0(t *testing.T) { + p := gopacket.NewPacket(testPacketRadiotap0, LayerTypeRadioTap, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeRadioTap, LayerTypeDot11}, t) + rt := p.Layer(LayerTypeRadioTap).(*RadioTap) + if rt.ChannelFrequency != 2412 || rt.DBMAntennaSignal != -58 || rt.Antenna != 7 { + t.Error("Radiotap decode error") + } + if rt.Rate != 2 { // 500Kbps unit + t.Error("Radiotap Rate decode error") + } +} +func BenchmarkDecodePacketRadiotap0(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testPacketRadiotap0, LayerTypeRadioTap, gopacket.NoCopy) + } +} + +// testPacketRadiotap1 is the packet: +// 05:24:21.380948 2412 MHz 11g -36dB signal antenna 5 65.0 Mb/s MCS 7 20 MHz lon GI +// 0x0000: 0000 1500 2a48 0800 1000 6c09 8004 dc05 ....*H....l..... +// 0x0010: 0000 0700 0748 112c 0000 3a9d aaf0 191c .....H.,..:..... +// 0x0020: aba7 f213 9d00 3a9d aaf0 1970 b2ee a9f1 ......:....p.... +// 0x0030: 16 . +var testPacketRadiotap1 = []byte{ + 0x00, 0x00, 0x15, 0x00, 0x2a, 0x48, 0x08, 0x00, 0x10, 0x00, 0x6c, 0x09, 0x80, 0x04, 0xdc, 0x05, + 0x00, 0x00, 0x07, 0x00, 0x07, 0x48, 0x11, 0x2c, 0x00, 0x00, 0x3a, 0x9d, 0xaa, 0xf0, 0x19, 0x1c, + 0xab, 0xa7, 0xf2, 0x13, 0x9d, 0x00, 0x3a, 0x9d, 0xaa, 0xf0, 0x19, 0x70, 0xb2, 0xee, 0xa9, 0xf1, + 0x16, +} + +func TestPacketRadiotap1(t *testing.T) { + p := gopacket.NewPacket(testPacketRadiotap1, LayerTypeRadioTap, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeRadioTap, LayerTypeDot11}, t) + rt := p.Layer(LayerTypeRadioTap).(*RadioTap) + if rt.ChannelFrequency != 2412 || rt.DBMAntennaSignal != -36 || rt.Antenna != 5 { + t.Error("Radiotap decode error") + } + if !rt.MCS.Known.MCSIndex() || rt.MCS.MCS != 7 { + t.Error("Radiotap MCS error") + } + if !rt.MCS.Known.Bandwidth() || rt.MCS.Flags.Bandwidth() != 0 { + t.Error("Radiotap bandwidth error") + } + if !rt.MCS.Known.GuardInterval() || rt.MCS.Flags.ShortGI() { + t.Error("Radiotap GI error") + } +} +func BenchmarkDecodePacketRadiotap1(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testPacketRadiotap1, LayerTypeRadioTap, gopacket.NoCopy) + } +} diff --git a/vendor/github.com/google/gopacket/layers/rudp.go b/vendor/github.com/google/gopacket/layers/rudp.go new file mode 100644 index 0000000..8435129 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/rudp.go @@ -0,0 +1,93 @@ +// 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 layers + +import ( + "encoding/binary" + "fmt" + "github.com/google/gopacket" +) + +type RUDP struct { + BaseLayer + SYN, ACK, EACK, RST, NUL bool + Version uint8 + HeaderLength uint8 + SrcPort, DstPort RUDPPort + DataLength uint16 + Seq, Ack, Checksum uint32 + VariableHeaderArea []byte + // RUDPHeaderSyn contains SYN information for the RUDP packet, + // if the SYN flag is set + *RUDPHeaderSYN + // RUDPHeaderEack contains EACK information for the RUDP packet, + // if the EACK flag is set. + *RUDPHeaderEACK +} + +type RUDPHeaderSYN struct { + MaxOutstandingSegments, MaxSegmentSize, OptionFlags uint16 +} + +type RUDPHeaderEACK struct { + SeqsReceivedOK []uint32 +} + +// LayerType returns gopacket.LayerTypeRUDP. +func (r *RUDP) LayerType() gopacket.LayerType { return LayerTypeRUDP } + +func decodeRUDP(data []byte, p gopacket.PacketBuilder) error { + r := &RUDP{ + SYN: data[0]&0x80 != 0, + ACK: data[0]&0x40 != 0, + EACK: data[0]&0x20 != 0, + RST: data[0]&0x10 != 0, + NUL: data[0]&0x08 != 0, + Version: data[0] & 0x3, + HeaderLength: data[1], + SrcPort: RUDPPort(data[2]), + DstPort: RUDPPort(data[3]), + DataLength: binary.BigEndian.Uint16(data[4:6]), + Seq: binary.BigEndian.Uint32(data[6:10]), + Ack: binary.BigEndian.Uint32(data[10:14]), + Checksum: binary.BigEndian.Uint32(data[14:18]), + } + if r.HeaderLength < 9 { + return fmt.Errorf("RUDP packet with too-short header length %d", r.HeaderLength) + } + hlen := int(r.HeaderLength) * 2 + r.Contents = data[:hlen] + r.Payload = data[hlen : hlen+int(r.DataLength)] + r.VariableHeaderArea = data[18:hlen] + headerData := r.VariableHeaderArea + switch { + case r.SYN: + if len(headerData) != 6 { + return fmt.Errorf("RUDP packet invalid SYN header length: %d", len(headerData)) + } + r.RUDPHeaderSYN = &RUDPHeaderSYN{ + MaxOutstandingSegments: binary.BigEndian.Uint16(headerData[:2]), + MaxSegmentSize: binary.BigEndian.Uint16(headerData[2:4]), + OptionFlags: binary.BigEndian.Uint16(headerData[4:6]), + } + case r.EACK: + if len(headerData)%4 != 0 { + return fmt.Errorf("RUDP packet invalid EACK header length: %d", len(headerData)) + } + r.RUDPHeaderEACK = &RUDPHeaderEACK{make([]uint32, len(headerData)/4)} + for i := 0; i < len(headerData); i += 4 { + r.SeqsReceivedOK[i/4] = binary.BigEndian.Uint32(headerData[i : i+4]) + } + } + p.AddLayer(r) + p.SetTransportLayer(r) + return p.NextDecoder(gopacket.LayerTypePayload) +} + +func (r *RUDP) TransportFlow() gopacket.Flow { + return gopacket.NewFlow(EndpointRUDPPort, []byte{byte(r.SrcPort)}, []byte{byte(r.DstPort)}) +} diff --git a/vendor/github.com/google/gopacket/layers/sctp.go b/vendor/github.com/google/gopacket/layers/sctp.go new file mode 100644 index 0000000..511176e --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/sctp.go @@ -0,0 +1,746 @@ +// 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 layers + +import ( + "encoding/binary" + "errors" + "fmt" + "hash/crc32" + + "github.com/google/gopacket" +) + +// SCTP contains information on the top level of an SCTP packet. +type SCTP struct { + BaseLayer + SrcPort, DstPort SCTPPort + VerificationTag uint32 + Checksum uint32 + sPort, dPort []byte +} + +// LayerType returns gopacket.LayerTypeSCTP +func (s *SCTP) LayerType() gopacket.LayerType { return LayerTypeSCTP } + +func decodeSCTP(data []byte, p gopacket.PacketBuilder) error { + sctp := &SCTP{} + err := sctp.DecodeFromBytes(data, p) + p.AddLayer(sctp) + p.SetTransportLayer(sctp) + if err != nil { + return err + } + return p.NextDecoder(sctpChunkTypePrefixDecoder) +} + +var sctpChunkTypePrefixDecoder = gopacket.DecodeFunc(decodeWithSCTPChunkTypePrefix) + +// TransportFlow returns a flow based on the source and destination SCTP port. +func (s *SCTP) TransportFlow() gopacket.Flow { + return gopacket.NewFlow(EndpointSCTPPort, s.sPort, s.dPort) +} + +func decodeWithSCTPChunkTypePrefix(data []byte, p gopacket.PacketBuilder) error { + chunkType := SCTPChunkType(data[0]) + return chunkType.Decode(data, p) +} + +// SerializeTo is for gopacket.SerializableLayer. +func (s SCTP) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + bytes, err := b.PrependBytes(12) + if err != nil { + return err + } + binary.BigEndian.PutUint16(bytes[0:2], uint16(s.SrcPort)) + binary.BigEndian.PutUint16(bytes[2:4], uint16(s.DstPort)) + binary.BigEndian.PutUint32(bytes[4:8], s.VerificationTag) + if opts.ComputeChecksums { + // Note: MakeTable(Castagnoli) actually only creates the table once, then + // passes back a singleton on every other call, so this shouldn't cause + // excessive memory allocation. + binary.LittleEndian.PutUint32(bytes[8:12], crc32.Checksum(b.Bytes(), crc32.MakeTable(crc32.Castagnoli))) + } + return nil +} + +func (sctp *SCTP) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + if len(data) < 12 { + return errors.New("Invalid SCTP common header length") + } + sctp.SrcPort = SCTPPort(binary.BigEndian.Uint16(data[:2])) + sctp.sPort = data[:2] + sctp.DstPort = SCTPPort(binary.BigEndian.Uint16(data[2:4])) + sctp.dPort = data[2:4] + sctp.VerificationTag = binary.BigEndian.Uint32(data[4:8]) + sctp.Checksum = binary.BigEndian.Uint32(data[8:12]) + sctp.BaseLayer = BaseLayer{data[:12], data[12:]} + + return nil +} + +func (t *SCTP) CanDecode() gopacket.LayerClass { + return LayerTypeSCTP +} + +func (t *SCTP) NextLayerType() gopacket.LayerType { + return gopacket.LayerTypePayload +} + +// SCTPChunk contains the common fields in all SCTP chunks. +type SCTPChunk struct { + BaseLayer + Type SCTPChunkType + Flags uint8 + Length uint16 + // ActualLength is the total length of an SCTP chunk, including padding. + // SCTP chunks start and end on 4-byte boundaries. So if a chunk has a length + // of 18, it means that it has data up to and including byte 18, then padding + // up to the next 4-byte boundary, 20. In this case, Length would be 18, and + // ActualLength would be 20. + ActualLength int +} + +func roundUpToNearest4(i int) int { + if i%4 == 0 { + return i + } + return i + 4 - (i % 4) +} + +func decodeSCTPChunk(data []byte) (SCTPChunk, error) { + length := binary.BigEndian.Uint16(data[2:4]) + if length < 4 { + return SCTPChunk{}, errors.New("invalid SCTP chunk length") + } + actual := roundUpToNearest4(int(length)) + ct := SCTPChunkType(data[0]) + + // For SCTP Data, use a separate layer for the payload + delta := 0 + if ct == SCTPChunkTypeData { + delta = int(actual) - int(length) + actual = 16 + } + + return SCTPChunk{ + Type: ct, + Flags: data[1], + Length: length, + ActualLength: actual, + BaseLayer: BaseLayer{data[:actual], data[actual : len(data)-delta]}, + }, nil +} + +// SCTPParameter is a TLV parameter inside a SCTPChunk. +type SCTPParameter struct { + Type uint16 + Length uint16 + ActualLength int + Value []byte +} + +func decodeSCTPParameter(data []byte) SCTPParameter { + length := binary.BigEndian.Uint16(data[2:4]) + return SCTPParameter{ + Type: binary.BigEndian.Uint16(data[0:2]), + Length: length, + Value: data[4:length], + ActualLength: roundUpToNearest4(int(length)), + } +} + +func (p SCTPParameter) Bytes() []byte { + length := 4 + len(p.Value) + data := make([]byte, roundUpToNearest4(length)) + binary.BigEndian.PutUint16(data[0:2], p.Type) + binary.BigEndian.PutUint16(data[2:4], uint16(length)) + copy(data[4:], p.Value) + return data +} + +// SCTPUnknownChunkType is the layer type returned when we don't recognize the +// chunk type. Since there's a length in a known location, we can skip over +// it even if we don't know what it is, and continue parsing the rest of the +// chunks. This chunk is stored as an ErrorLayer in the packet. +type SCTPUnknownChunkType struct { + SCTPChunk + bytes []byte +} + +func decodeSCTPChunkTypeUnknown(data []byte, p gopacket.PacketBuilder) error { + chunk, err := decodeSCTPChunk(data) + if err != nil { + return err + } + sc := &SCTPUnknownChunkType{SCTPChunk: chunk} + sc.bytes = data[:sc.ActualLength] + p.AddLayer(sc) + p.SetErrorLayer(sc) + return p.NextDecoder(gopacket.DecodeFunc(decodeWithSCTPChunkTypePrefix)) +} + +// SerializeTo is for gopacket.SerializableLayer. +func (s SCTPUnknownChunkType) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + bytes, err := b.PrependBytes(s.ActualLength) + if err != nil { + return err + } + copy(bytes, s.bytes) + return nil +} + +// LayerType returns gopacket.LayerTypeSCTPUnknownChunkType. +func (s *SCTPUnknownChunkType) LayerType() gopacket.LayerType { return LayerTypeSCTPUnknownChunkType } + +// Payload returns all bytes in this header, including the decoded Type, Length, +// and Flags. +func (s *SCTPUnknownChunkType) Payload() []byte { return s.bytes } + +// Error implements ErrorLayer. +func (s *SCTPUnknownChunkType) Error() error { + return fmt.Errorf("No decode method available for SCTP chunk type %s", s.Type) +} + +// SCTPData is the SCTP Data chunk layer. +type SCTPData struct { + SCTPChunk + Unordered, BeginFragment, EndFragment bool + TSN uint32 + StreamId uint16 + StreamSequence uint16 + PayloadProtocol SCTPPayloadProtocol +} + +// LayerType returns gopacket.LayerTypeSCTPData. +func (s *SCTPData) LayerType() gopacket.LayerType { return LayerTypeSCTPData } + +// SCTPPayloadProtocol represents a payload protocol +type SCTPPayloadProtocol uint32 + +// SCTPPayloadProtocol constonts from http://www.iana.org/assignments/sctp-parameters/sctp-parameters.xhtml +const ( + SCTPProtocolReserved SCTPPayloadProtocol = 0 + SCTPPayloadUIA = 1 + SCTPPayloadM2UA = 2 + SCTPPayloadM3UA = 3 + SCTPPayloadSUA = 4 + SCTPPayloadM2PA = 5 + SCTPPayloadV5UA = 6 + SCTPPayloadH248 = 7 + SCTPPayloadBICC = 8 + SCTPPayloadTALI = 9 + SCTPPayloadDUA = 10 + SCTPPayloadASAP = 11 + SCTPPayloadENRP = 12 + SCTPPayloadH323 = 13 + SCTPPayloadQIPC = 14 + SCTPPayloadSIMCO = 15 + SCTPPayloadDDPSegment = 16 + SCTPPayloadDDPStream = 17 + SCTPPayloadS1AP = 18 +) + +func (p SCTPPayloadProtocol) String() string { + switch p { + case SCTPProtocolReserved: + return "Reserved" + case SCTPPayloadUIA: + return "UIA" + case SCTPPayloadM2UA: + return "M2UA" + case SCTPPayloadM3UA: + return "M3UA" + case SCTPPayloadSUA: + return "SUA" + case SCTPPayloadM2PA: + return "M2PA" + case SCTPPayloadV5UA: + return "V5UA" + case SCTPPayloadH248: + return "H.248" + case SCTPPayloadBICC: + return "BICC" + case SCTPPayloadTALI: + return "TALI" + case SCTPPayloadDUA: + return "DUA" + case SCTPPayloadASAP: + return "ASAP" + case SCTPPayloadENRP: + return "ENRP" + case SCTPPayloadH323: + return "H.323" + case SCTPPayloadQIPC: + return "QIPC" + case SCTPPayloadSIMCO: + return "SIMCO" + case SCTPPayloadDDPSegment: + return "DDPSegment" + case SCTPPayloadDDPStream: + return "DDPStream" + case SCTPPayloadS1AP: + return "S1AP" + } + return fmt.Sprintf("Unknown(%d)", p) +} + +func decodeSCTPData(data []byte, p gopacket.PacketBuilder) error { + chunk, err := decodeSCTPChunk(data) + if err != nil { + return err + } + sc := &SCTPData{ + SCTPChunk: chunk, + Unordered: data[1]&0x4 != 0, + BeginFragment: data[1]&0x2 != 0, + EndFragment: data[1]&0x1 != 0, + TSN: binary.BigEndian.Uint32(data[4:8]), + StreamId: binary.BigEndian.Uint16(data[8:10]), + StreamSequence: binary.BigEndian.Uint16(data[10:12]), + PayloadProtocol: SCTPPayloadProtocol(binary.BigEndian.Uint32(data[12:16])), + } + // Length is the length in bytes of the data, INCLUDING the 16-byte header. + p.AddLayer(sc) + return p.NextDecoder(gopacket.LayerTypePayload) +} + +// SerializeTo is for gopacket.SerializableLayer. +func (sc SCTPData) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + payload := b.Bytes() + // Pad the payload to a 32 bit boundary + if rem := len(payload) % 4; rem != 0 { + b.AppendBytes(4 - rem) + } + length := 16 + bytes, err := b.PrependBytes(length) + if err != nil { + return err + } + bytes[0] = uint8(sc.Type) + flags := uint8(0) + if sc.Unordered { + flags |= 0x4 + } + if sc.BeginFragment { + flags |= 0x2 + } + if sc.EndFragment { + flags |= 0x1 + } + bytes[1] = flags + binary.BigEndian.PutUint16(bytes[2:4], uint16(length+len(payload))) + binary.BigEndian.PutUint32(bytes[4:8], sc.TSN) + binary.BigEndian.PutUint16(bytes[8:10], sc.StreamId) + binary.BigEndian.PutUint16(bytes[10:12], sc.StreamSequence) + binary.BigEndian.PutUint32(bytes[12:16], uint32(sc.PayloadProtocol)) + return nil +} + +// SCTPInitParameter is a parameter for an SCTP Init or InitAck packet. +type SCTPInitParameter SCTPParameter + +// SCTPInit is used as the return value for both SCTPInit and SCTPInitAck +// messages. +type SCTPInit struct { + SCTPChunk + InitiateTag uint32 + AdvertisedReceiverWindowCredit uint32 + OutboundStreams, InboundStreams uint16 + InitialTSN uint32 + Parameters []SCTPInitParameter +} + +// LayerType returns either gopacket.LayerTypeSCTPInit or gopacket.LayerTypeSCTPInitAck. +func (sc *SCTPInit) LayerType() gopacket.LayerType { + if sc.Type == SCTPChunkTypeInitAck { + return LayerTypeSCTPInitAck + } + // sc.Type == SCTPChunkTypeInit + return LayerTypeSCTPInit +} + +func decodeSCTPInit(data []byte, p gopacket.PacketBuilder) error { + chunk, err := decodeSCTPChunk(data) + if err != nil { + return err + } + sc := &SCTPInit{ + SCTPChunk: chunk, + InitiateTag: binary.BigEndian.Uint32(data[4:8]), + AdvertisedReceiverWindowCredit: binary.BigEndian.Uint32(data[8:12]), + OutboundStreams: binary.BigEndian.Uint16(data[12:14]), + InboundStreams: binary.BigEndian.Uint16(data[14:16]), + InitialTSN: binary.BigEndian.Uint32(data[16:20]), + } + paramData := data[20:sc.ActualLength] + for len(paramData) > 0 { + p := SCTPInitParameter(decodeSCTPParameter(paramData)) + paramData = paramData[p.ActualLength:] + sc.Parameters = append(sc.Parameters, p) + } + p.AddLayer(sc) + return p.NextDecoder(gopacket.DecodeFunc(decodeWithSCTPChunkTypePrefix)) +} + +// SerializeTo is for gopacket.SerializableLayer. +func (sc SCTPInit) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + var payload []byte + for _, param := range sc.Parameters { + payload = append(payload, SCTPParameter(param).Bytes()...) + } + length := 20 + len(payload) + bytes, err := b.PrependBytes(roundUpToNearest4(length)) + if err != nil { + return err + } + bytes[0] = uint8(sc.Type) + bytes[1] = sc.Flags + binary.BigEndian.PutUint16(bytes[2:4], uint16(length)) + binary.BigEndian.PutUint32(bytes[4:8], sc.InitiateTag) + binary.BigEndian.PutUint32(bytes[8:12], sc.AdvertisedReceiverWindowCredit) + binary.BigEndian.PutUint16(bytes[12:14], sc.OutboundStreams) + binary.BigEndian.PutUint16(bytes[14:16], sc.InboundStreams) + binary.BigEndian.PutUint32(bytes[16:20], sc.InitialTSN) + copy(bytes[20:], payload) + return nil +} + +// SCTPSack is the SCTP Selective ACK chunk layer. +type SCTPSack struct { + SCTPChunk + CumulativeTSNAck uint32 + AdvertisedReceiverWindowCredit uint32 + NumGapACKs, NumDuplicateTSNs uint16 + GapACKs []uint16 + DuplicateTSNs []uint32 +} + +// LayerType return LayerTypeSCTPSack +func (sc *SCTPSack) LayerType() gopacket.LayerType { + return LayerTypeSCTPSack +} + +func decodeSCTPSack(data []byte, p gopacket.PacketBuilder) error { + chunk, err := decodeSCTPChunk(data) + if err != nil { + return err + } + sc := &SCTPSack{ + SCTPChunk: chunk, + CumulativeTSNAck: binary.BigEndian.Uint32(data[4:8]), + AdvertisedReceiverWindowCredit: binary.BigEndian.Uint32(data[8:12]), + NumGapACKs: binary.BigEndian.Uint16(data[12:14]), + NumDuplicateTSNs: binary.BigEndian.Uint16(data[14:16]), + } + // We maximize gapAcks and dupTSNs here so we're not allocating tons + // of memory based on a user-controlable field. Our maximums are not exact, + // but should give us sane defaults... we'll still hit slice boundaries and + // fail if the user-supplied values are too high (in the for loops below), but + // the amount of memory we'll have allocated because of that should be small + // (< sc.ActualLength) + gapAcks := sc.SCTPChunk.ActualLength / 2 + dupTSNs := (sc.SCTPChunk.ActualLength - gapAcks*2) / 4 + if gapAcks > int(sc.NumGapACKs) { + gapAcks = int(sc.NumGapACKs) + } + if dupTSNs > int(sc.NumDuplicateTSNs) { + dupTSNs = int(sc.NumDuplicateTSNs) + } + sc.GapACKs = make([]uint16, 0, gapAcks) + sc.DuplicateTSNs = make([]uint32, 0, dupTSNs) + bytesRemaining := data[16:] + for i := 0; i < int(sc.NumGapACKs); i++ { + sc.GapACKs = append(sc.GapACKs, binary.BigEndian.Uint16(bytesRemaining[:2])) + bytesRemaining = bytesRemaining[2:] + } + for i := 0; i < int(sc.NumDuplicateTSNs); i++ { + sc.DuplicateTSNs = append(sc.DuplicateTSNs, binary.BigEndian.Uint32(bytesRemaining[:4])) + bytesRemaining = bytesRemaining[4:] + } + p.AddLayer(sc) + return p.NextDecoder(gopacket.DecodeFunc(decodeWithSCTPChunkTypePrefix)) +} + +// SerializeTo is for gopacket.SerializableLayer. +func (sc SCTPSack) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + length := 16 + 2*len(sc.GapACKs) + 4*len(sc.DuplicateTSNs) + bytes, err := b.PrependBytes(roundUpToNearest4(length)) + if err != nil { + return err + } + bytes[0] = uint8(sc.Type) + bytes[1] = sc.Flags + binary.BigEndian.PutUint16(bytes[2:4], uint16(length)) + binary.BigEndian.PutUint32(bytes[4:8], sc.CumulativeTSNAck) + binary.BigEndian.PutUint32(bytes[8:12], sc.AdvertisedReceiverWindowCredit) + binary.BigEndian.PutUint16(bytes[12:14], uint16(len(sc.GapACKs))) + binary.BigEndian.PutUint16(bytes[14:16], uint16(len(sc.DuplicateTSNs))) + for i, v := range sc.GapACKs { + binary.BigEndian.PutUint16(bytes[16+i*2:], v) + } + offset := 16 + 2*len(sc.GapACKs) + for i, v := range sc.DuplicateTSNs { + binary.BigEndian.PutUint32(bytes[offset+i*4:], v) + } + return nil +} + +// SCTPHeartbeatParameter is the parameter type used by SCTP heartbeat and +// heartbeat ack layers. +type SCTPHeartbeatParameter SCTPParameter + +// SCTPHeartbeat is the SCTP heartbeat layer, also used for heatbeat ack. +type SCTPHeartbeat struct { + SCTPChunk + Parameters []SCTPHeartbeatParameter +} + +// LayerType returns gopacket.LayerTypeSCTPHeartbeat. +func (sc *SCTPHeartbeat) LayerType() gopacket.LayerType { + if sc.Type == SCTPChunkTypeHeartbeatAck { + return LayerTypeSCTPHeartbeatAck + } + // sc.Type == SCTPChunkTypeHeartbeat + return LayerTypeSCTPHeartbeat +} + +func decodeSCTPHeartbeat(data []byte, p gopacket.PacketBuilder) error { + chunk, err := decodeSCTPChunk(data) + if err != nil { + return err + } + sc := &SCTPHeartbeat{ + SCTPChunk: chunk, + } + paramData := data[4:sc.Length] + for len(paramData) > 0 { + p := SCTPHeartbeatParameter(decodeSCTPParameter(paramData)) + paramData = paramData[p.ActualLength:] + sc.Parameters = append(sc.Parameters, p) + } + p.AddLayer(sc) + return p.NextDecoder(gopacket.DecodeFunc(decodeWithSCTPChunkTypePrefix)) +} + +// SerializeTo is for gopacket.SerializableLayer. +func (sc SCTPHeartbeat) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + var payload []byte + for _, param := range sc.Parameters { + payload = append(payload, SCTPParameter(param).Bytes()...) + } + length := 4 + len(payload) + + bytes, err := b.PrependBytes(roundUpToNearest4(length)) + if err != nil { + return err + } + bytes[0] = uint8(sc.Type) + bytes[1] = sc.Flags + binary.BigEndian.PutUint16(bytes[2:4], uint16(length)) + copy(bytes[4:], payload) + return nil +} + +// SCTPErrorParameter is the parameter type used by SCTP Abort and Error layers. +type SCTPErrorParameter SCTPParameter + +// SCTPError is the SCTP error layer, also used for SCTP aborts. +type SCTPError struct { + SCTPChunk + Parameters []SCTPErrorParameter +} + +// LayerType returns LayerTypeSCTPAbort or LayerTypeSCTPError. +func (sc *SCTPError) LayerType() gopacket.LayerType { + if sc.Type == SCTPChunkTypeAbort { + return LayerTypeSCTPAbort + } + // sc.Type == SCTPChunkTypeError + return LayerTypeSCTPError +} + +func decodeSCTPError(data []byte, p gopacket.PacketBuilder) error { + // remarkably similar to decodeSCTPHeartbeat ;) + chunk, err := decodeSCTPChunk(data) + if err != nil { + return err + } + sc := &SCTPError{ + SCTPChunk: chunk, + } + paramData := data[4:sc.Length] + for len(paramData) > 0 { + p := SCTPErrorParameter(decodeSCTPParameter(paramData)) + paramData = paramData[p.ActualLength:] + sc.Parameters = append(sc.Parameters, p) + } + p.AddLayer(sc) + return p.NextDecoder(gopacket.DecodeFunc(decodeWithSCTPChunkTypePrefix)) +} + +// SerializeTo is for gopacket.SerializableLayer. +func (sc SCTPError) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + var payload []byte + for _, param := range sc.Parameters { + payload = append(payload, SCTPParameter(param).Bytes()...) + } + length := 4 + len(payload) + + bytes, err := b.PrependBytes(roundUpToNearest4(length)) + if err != nil { + return err + } + bytes[0] = uint8(sc.Type) + bytes[1] = sc.Flags + binary.BigEndian.PutUint16(bytes[2:4], uint16(length)) + copy(bytes[4:], payload) + return nil +} + +// SCTPShutdown is the SCTP shutdown layer. +type SCTPShutdown struct { + SCTPChunk + CumulativeTSNAck uint32 +} + +// LayerType returns gopacket.LayerTypeSCTPShutdown. +func (sc *SCTPShutdown) LayerType() gopacket.LayerType { return LayerTypeSCTPShutdown } + +func decodeSCTPShutdown(data []byte, p gopacket.PacketBuilder) error { + chunk, err := decodeSCTPChunk(data) + if err != nil { + return err + } + sc := &SCTPShutdown{ + SCTPChunk: chunk, + CumulativeTSNAck: binary.BigEndian.Uint32(data[4:8]), + } + p.AddLayer(sc) + return p.NextDecoder(gopacket.DecodeFunc(decodeWithSCTPChunkTypePrefix)) +} + +// SerializeTo is for gopacket.SerializableLayer. +func (sc SCTPShutdown) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + bytes, err := b.PrependBytes(8) + if err != nil { + return err + } + bytes[0] = uint8(sc.Type) + bytes[1] = sc.Flags + binary.BigEndian.PutUint16(bytes[2:4], 8) + binary.BigEndian.PutUint32(bytes[4:8], sc.CumulativeTSNAck) + return nil +} + +// SCTPShutdownAck is the SCTP shutdown layer. +type SCTPShutdownAck struct { + SCTPChunk +} + +// LayerType returns gopacket.LayerTypeSCTPShutdownAck. +func (sc *SCTPShutdownAck) LayerType() gopacket.LayerType { return LayerTypeSCTPShutdownAck } + +func decodeSCTPShutdownAck(data []byte, p gopacket.PacketBuilder) error { + chunk, err := decodeSCTPChunk(data) + if err != nil { + return err + } + sc := &SCTPShutdownAck{ + SCTPChunk: chunk, + } + p.AddLayer(sc) + return p.NextDecoder(gopacket.DecodeFunc(decodeWithSCTPChunkTypePrefix)) +} + +// SerializeTo is for gopacket.SerializableLayer. +func (sc SCTPShutdownAck) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + bytes, err := b.PrependBytes(4) + if err != nil { + return err + } + bytes[0] = uint8(sc.Type) + bytes[1] = sc.Flags + binary.BigEndian.PutUint16(bytes[2:4], 4) + return nil +} + +// SCTPCookieEcho is the SCTP Cookie Echo layer. +type SCTPCookieEcho struct { + SCTPChunk + Cookie []byte +} + +// LayerType returns gopacket.LayerTypeSCTPCookieEcho. +func (sc *SCTPCookieEcho) LayerType() gopacket.LayerType { return LayerTypeSCTPCookieEcho } + +func decodeSCTPCookieEcho(data []byte, p gopacket.PacketBuilder) error { + chunk, err := decodeSCTPChunk(data) + if err != nil { + return err + } + sc := &SCTPCookieEcho{ + SCTPChunk: chunk, + } + sc.Cookie = data[4:sc.Length] + p.AddLayer(sc) + return p.NextDecoder(gopacket.DecodeFunc(decodeWithSCTPChunkTypePrefix)) +} + +// SerializeTo is for gopacket.SerializableLayer. +func (sc SCTPCookieEcho) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + length := 4 + len(sc.Cookie) + bytes, err := b.PrependBytes(roundUpToNearest4(length)) + if err != nil { + return err + } + bytes[0] = uint8(sc.Type) + bytes[1] = sc.Flags + binary.BigEndian.PutUint16(bytes[2:4], uint16(length)) + copy(bytes[4:], sc.Cookie) + return nil +} + +// This struct is used by all empty SCTP chunks (currently CookieAck and +// ShutdownComplete). +type SCTPEmptyLayer struct { + SCTPChunk +} + +// LayerType returns either gopacket.LayerTypeSCTPShutdownComplete or +// LayerTypeSCTPCookieAck. +func (sc *SCTPEmptyLayer) LayerType() gopacket.LayerType { + if sc.Type == SCTPChunkTypeShutdownComplete { + return LayerTypeSCTPShutdownComplete + } + // sc.Type == SCTPChunkTypeCookieAck + return LayerTypeSCTPCookieAck +} + +func decodeSCTPEmptyLayer(data []byte, p gopacket.PacketBuilder) error { + chunk, err := decodeSCTPChunk(data) + if err != nil { + return err + } + sc := &SCTPEmptyLayer{ + SCTPChunk: chunk, + } + p.AddLayer(sc) + return p.NextDecoder(gopacket.DecodeFunc(decodeWithSCTPChunkTypePrefix)) +} + +// SerializeTo is for gopacket.SerializableLayer. +func (sc SCTPEmptyLayer) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + bytes, err := b.PrependBytes(4) + if err != nil { + return err + } + bytes[0] = uint8(sc.Type) + bytes[1] = sc.Flags + binary.BigEndian.PutUint16(bytes[2:4], 4) + return nil +} diff --git a/vendor/github.com/google/gopacket/layers/sflow.go b/vendor/github.com/google/gopacket/layers/sflow.go new file mode 100644 index 0000000..55ce31e --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/sflow.go @@ -0,0 +1,2187 @@ +// Copyright 2014 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. + +/* +This layer decodes SFlow version 5 datagrams. + +The specification can be found here: http://sflow.org/sflow_version_5.txt + +Additional developer information about sflow can be found at: +http://sflow.org/developers/specifications.php + +And SFlow in general: +http://sflow.org/index.php + +Two forms of sample data are defined: compact and expanded. The +Specification has this to say: + + Compact and expand forms of counter and flow samples are defined. + An agent must not mix compact/expanded encodings. If an agent + will never use ifIndex numbers >= 2^24 then it must use compact + encodings for all interfaces. Otherwise the expanded formats must + be used for all interfaces. + +This decoder only supports the compact form, because that is the only +one for which data was avaialble. + +The datagram is composed of one or more samples of type flow or counter, +and each sample is composed of one or more records describing the sample. +A sample is a single instance of sampled inforamtion, and each record in +the sample gives additional / supplimentary information about the sample. + +The following sample record types are supported: + + Raw Packet Header + opaque = flow_data; enterprise = 0; format = 1 + + Extended Switch Data + opaque = flow_data; enterprise = 0; format = 1001 + + Extended Router Data + opaque = flow_data; enterprise = 0; format = 1002 + + Extended Gateway Data + opaque = flow_data; enterprise = 0; format = 1003 + + Extended User Data + opaque = flow_data; enterprise = 0; format = 1004 + + Extended URL Data + opaque = flow_data; enterprise = 0; format = 1005 + +The following types of counter records are supported: + + Generic Interface Counters - see RFC 2233 + opaque = counter_data; enterprise = 0; format = 1 + + Ethernet Interface Counters - see RFC 2358 + opaque = counter_data; enterprise = 0; format = 2 + +SFlow is encoded using XDR (RFC4506). There are a few places +where the standard 4-byte fields are partitioned into two +bitfields of different lengths. I'm not sure why the designers +chose to pack together two values like this in some places, and +in others they use the entire 4-byte value to store a number that +will never be more than a few bits. In any case, there are a couple +of types defined to handle the decoding of these bitfields, and +that's why they're there. */ + +package layers + +import ( + "encoding/binary" + "errors" + "fmt" + "net" + + "github.com/google/gopacket" +) + +// SFlowRecord holds both flow sample records and counter sample records. +// A Record is the structure that actually holds the sampled data +// and / or counters. +type SFlowRecord interface { +} + +// SFlowDataSource encodes a 2-bit SFlowSourceFormat in its most significant +// 2 bits, and an SFlowSourceValue in its least significant 30 bits. +// These types and values define the meaning of the inteface information +// presented in the sample metadata. +type SFlowDataSource int32 + +func (sdc SFlowDataSource) decode() (SFlowSourceFormat, SFlowSourceValue) { + leftField := sdc >> 30 + rightField := uint32(0x3FFFFFFF) & uint32(sdc) + return SFlowSourceFormat(leftField), SFlowSourceValue(rightField) +} + +type SFlowDataSourceExpanded struct { + SourceIDClass SFlowSourceFormat + SourceIDIndex SFlowSourceValue +} + +func (sdce SFlowDataSourceExpanded) decode() (SFlowSourceFormat, SFlowSourceValue) { + leftField := sdce.SourceIDClass >> 30 + rightField := uint32(0x3FFFFFFF) & uint32(sdce.SourceIDIndex) + return SFlowSourceFormat(leftField), SFlowSourceValue(rightField) +} + +type SFlowSourceFormat uint32 + +type SFlowSourceValue uint32 + +const ( + SFlowTypeSingleInterface SFlowSourceFormat = 0 + SFlowTypePacketDiscarded SFlowSourceFormat = 1 + SFlowTypeMultipleDestinations SFlowSourceFormat = 2 +) + +func (sdf SFlowSourceFormat) String() string { + switch sdf { + case SFlowTypeSingleInterface: + return "Single Interface" + case SFlowTypePacketDiscarded: + return "Packet Discarded" + case SFlowTypeMultipleDestinations: + return "Multiple Destinations" + default: + return "UNKNOWN" + } +} + +func decodeSFlow(data []byte, p gopacket.PacketBuilder) error { + s := &SFlowDatagram{} + err := s.DecodeFromBytes(data, p) + if err != nil { + return err + } + p.AddLayer(s) + p.SetApplicationLayer(s) + return nil +} + +// SFlowDatagram is the outermost container which holds some basic information +// about the reporting agent, and holds at least one sample record +type SFlowDatagram struct { + BaseLayer + + DatagramVersion uint32 + AgentAddress net.IP + SubAgentID uint32 + SequenceNumber uint32 + AgentUptime uint32 + SampleCount uint32 + FlowSamples []SFlowFlowSample + CounterSamples []SFlowCounterSample +} + +// An SFlow datagram's outer container has the following +// structure: + +// 0 15 31 +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | int sFlow version (2|4|5) | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | int IP version of the Agent (1=v4|2=v6) | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// / Agent IP address (v4=4byte|v6=16byte) / +// / / +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | int sub agent id | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | int datagram sequence number | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | int switch uptime in ms | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | int n samples in datagram | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// / n samples / +// / / +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + +// SFlowDataFormat encodes the EnterpriseID in the most +// significant 12 bits, and the SampleType in the least significant +// 20 bits. +type SFlowDataFormat uint32 + +func (sdf SFlowDataFormat) decode() (SFlowEnterpriseID, SFlowSampleType) { + leftField := sdf >> 12 + rightField := uint32(0xFFF) & uint32(sdf) + return SFlowEnterpriseID(leftField), SFlowSampleType(rightField) +} + +// SFlowEnterpriseID is used to differentiate between the +// official SFlow standard, and other, vendor-specific +// types of flow data. (Similiar to SNMP's enterprise MIB +// OIDs) Only the office SFlow Enterprise ID is decoded +// here. +type SFlowEnterpriseID uint32 + +const ( + SFlowStandard SFlowEnterpriseID = 0 +) + +func (eid SFlowEnterpriseID) String() string { + switch eid { + case SFlowStandard: + return "Standard SFlow" + default: + return "" + } +} + +func (eid SFlowEnterpriseID) GetType() SFlowEnterpriseID { + return SFlowStandard +} + +// SFlowSampleType specifies the type of sample. Only flow samples +// and counter samples are supported +type SFlowSampleType uint32 + +const ( + SFlowTypeFlowSample SFlowSampleType = 1 + SFlowTypeCounterSample SFlowSampleType = 2 + SFlowTypeExpandedFlowSample SFlowSampleType = 3 + SFlowTypeExpandedCounterSample SFlowSampleType = 4 +) + +func (st SFlowSampleType) GetType() SFlowSampleType { + switch st { + case SFlowTypeFlowSample: + return SFlowTypeFlowSample + case SFlowTypeCounterSample: + return SFlowTypeCounterSample + case SFlowTypeExpandedFlowSample: + return SFlowTypeExpandedFlowSample + case SFlowTypeExpandedCounterSample: + return SFlowTypeExpandedCounterSample + default: + panic("Invalid Sample Type") + } +} + +func (st SFlowSampleType) String() string { + switch st { + case SFlowTypeFlowSample: + return "Flow Sample" + case SFlowTypeCounterSample: + return "Counter Sample" + case SFlowTypeExpandedFlowSample: + return "Expanded Flow Sample" + case SFlowTypeExpandedCounterSample: + return "Expanded Counter Sample" + default: + return "" + } +} + +func (s *SFlowDatagram) LayerType() gopacket.LayerType { return LayerTypeSFlow } + +func (d *SFlowDatagram) Payload() []byte { return nil } + +func (d *SFlowDatagram) CanDecode() gopacket.LayerClass { return LayerTypeSFlow } + +func (d *SFlowDatagram) NextLayerType() gopacket.LayerType { return gopacket.LayerTypePayload } + +// SFlowIPType determines what form the IP address being decoded will +// take. This is an XDR union type allowing for both IPv4 and IPv6 +type SFlowIPType uint32 + +const ( + SFlowIPv4 SFlowIPType = 1 + SFlowIPv6 SFlowIPType = 2 +) + +func (s SFlowIPType) String() string { + switch s { + case SFlowIPv4: + return "IPv4" + case SFlowIPv6: + return "IPv6" + default: + return "" + } +} + +func (s SFlowIPType) Length() int { + switch s { + case SFlowIPv4: + return 4 + case SFlowIPv6: + return 16 + default: + return 0 + } +} + +func (s *SFlowDatagram) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + var agentAddressType SFlowIPType + + data, s.DatagramVersion = data[4:], binary.BigEndian.Uint32(data[:4]) + data, agentAddressType = data[4:], SFlowIPType(binary.BigEndian.Uint32(data[:4])) + data, s.AgentAddress = data[agentAddressType.Length():], data[:agentAddressType.Length()] + data, s.SubAgentID = data[4:], binary.BigEndian.Uint32(data[:4]) + data, s.SequenceNumber = data[4:], binary.BigEndian.Uint32(data[:4]) + data, s.AgentUptime = data[4:], binary.BigEndian.Uint32(data[:4]) + data, s.SampleCount = data[4:], binary.BigEndian.Uint32(data[:4]) + + if s.SampleCount < 1 { + return fmt.Errorf("SFlow Datagram has invalid sample length: %d", s.SampleCount) + } + for i := uint32(0); i < s.SampleCount; i++ { + sdf := SFlowDataFormat(binary.BigEndian.Uint32(data[:4])) + _, sampleType := sdf.decode() + switch sampleType { + case SFlowTypeFlowSample: + if flowSample, err := decodeFlowSample(&data, false); err == nil { + s.FlowSamples = append(s.FlowSamples, flowSample) + } else { + return err + } + case SFlowTypeCounterSample: + if counterSample, err := decodeCounterSample(&data, false); err == nil { + s.CounterSamples = append(s.CounterSamples, counterSample) + } else { + return err + } + case SFlowTypeExpandedFlowSample: + if flowSample, err := decodeFlowSample(&data, true); err == nil { + s.FlowSamples = append(s.FlowSamples, flowSample) + } else { + return err + } + case SFlowTypeExpandedCounterSample: + if counterSample, err := decodeCounterSample(&data, true); err == nil { + s.CounterSamples = append(s.CounterSamples, counterSample) + } else { + return err + } + + default: + return fmt.Errorf("Unsupported SFlow sample type %d", sampleType) + } + } + return nil +} + +// SFlowFlowSample represents a sampled packet and contains +// one or more records describing the packet +type SFlowFlowSample struct { + EnterpriseID SFlowEnterpriseID + Format SFlowSampleType + SampleLength uint32 + SequenceNumber uint32 + SourceIDClass SFlowSourceFormat + SourceIDIndex SFlowSourceValue + SamplingRate uint32 + SamplePool uint32 + Dropped uint32 + InputInterfaceFormat uint32 + InputInterface uint32 + OutputInterfaceFormat uint32 + OutputInterface uint32 + RecordCount uint32 + Records []SFlowRecord +} + +// Flow samples have the following structure. Note +// the bit fields to encode the Enterprise ID and the +// Flow record format: type 1 + +// 0 15 31 +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | 20 bit Interprise (0) |12 bit format | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | sample length | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | int sample sequence number | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// |id type | src id index value | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | int sampling rate | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | int sample pool | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | int drops | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | int input ifIndex | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | int output ifIndex | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | int number of records | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// / flow records / +// / / +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + +// Flow samples have the following structure. +// Flow record format: type 3 + +// 0 15 31 +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | 20 bit Interprise (0) |12 bit format | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | sample length | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | int sample sequence number | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | int src id type | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | int src id index value | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | int sampling rate | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | int sample pool | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | int drops | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | int input interface format | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | int input interface value | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | int output interface format | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | int output interface value | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | int number of records | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// / flow records / +// / / +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + +type SFlowFlowDataFormat uint32 + +func (fdf SFlowFlowDataFormat) decode() (SFlowEnterpriseID, SFlowFlowRecordType) { + leftField := fdf >> 12 + rightField := uint32(0xFFF) & uint32(fdf) + return SFlowEnterpriseID(leftField), SFlowFlowRecordType(rightField) +} + +func (fs SFlowFlowSample) GetRecords() []SFlowRecord { + return fs.Records +} + +func (fs SFlowFlowSample) GetType() SFlowSampleType { + return SFlowTypeFlowSample +} + +func skipRecord(data *[]byte) { + recordLength := int(binary.BigEndian.Uint32((*data)[4:])) + *data = (*data)[(recordLength+((4-recordLength)%4))+8:] +} + +func decodeFlowSample(data *[]byte, expanded bool) (SFlowFlowSample, error) { + s := SFlowFlowSample{} + var sdf SFlowDataFormat + *data, sdf = (*data)[4:], SFlowDataFormat(binary.BigEndian.Uint32((*data)[:4])) + var sdc SFlowDataSource + + s.EnterpriseID, s.Format = sdf.decode() + *data, s.SampleLength = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, s.SequenceNumber = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + if expanded { + *data, s.SourceIDClass = (*data)[4:], SFlowSourceFormat(binary.BigEndian.Uint32((*data)[:4])) + *data, s.SourceIDIndex = (*data)[4:], SFlowSourceValue(binary.BigEndian.Uint32((*data)[:4])) + } else { + *data, sdc = (*data)[4:], SFlowDataSource(binary.BigEndian.Uint32((*data)[:4])) + s.SourceIDClass, s.SourceIDIndex = sdc.decode() + } + *data, s.SamplingRate = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, s.SamplePool = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, s.Dropped = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + + if expanded { + *data, s.InputInterfaceFormat = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, s.InputInterface = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, s.OutputInterfaceFormat = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, s.OutputInterface = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + } else { + *data, s.InputInterface = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, s.OutputInterface = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + } + *data, s.RecordCount = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + + for i := uint32(0); i < s.RecordCount; i++ { + rdf := SFlowFlowDataFormat(binary.BigEndian.Uint32((*data)[:4])) + _, flowRecordType := rdf.decode() + + switch flowRecordType { + case SFlowTypeRawPacketFlow: + if record, err := decodeRawPacketFlowRecord(data); err == nil { + s.Records = append(s.Records, record) + } else { + return s, err + } + case SFlowTypeExtendedUserFlow: + if record, err := decodeExtendedUserFlow(data); err == nil { + s.Records = append(s.Records, record) + } else { + return s, err + } + case SFlowTypeExtendedUrlFlow: + if record, err := decodeExtendedURLRecord(data); err == nil { + s.Records = append(s.Records, record) + } else { + return s, err + } + case SFlowTypeExtendedSwitchFlow: + if record, err := decodeExtendedSwitchFlowRecord(data); err == nil { + s.Records = append(s.Records, record) + } else { + return s, err + } + case SFlowTypeExtendedRouterFlow: + if record, err := decodeExtendedRouterFlowRecord(data); err == nil { + s.Records = append(s.Records, record) + } else { + return s, err + } + case SFlowTypeExtendedGatewayFlow: + if record, err := decodeExtendedGatewayFlowRecord(data); err == nil { + s.Records = append(s.Records, record) + } else { + return s, err + } + case SFlowTypeEthernetFrameFlow: + // TODO + skipRecord(data) + return s, errors.New("skipping TypeEthernetFrameFlow") + case SFlowTypeIpv4Flow: + if record, err := decodeSFlowIpv4Record(data); err == nil { + s.Records = append(s.Records, record) + } else { + return s, err + } + case SFlowTypeIpv6Flow: + if record, err := decodeSFlowIpv6Record(data); err == nil { + s.Records = append(s.Records, record) + } else { + return s, err + } + case SFlowTypeExtendedMlpsFlow: + // TODO + skipRecord(data) + return s, errors.New("skipping TypeExtendedMlpsFlow") + case SFlowTypeExtendedNatFlow: + // TODO + skipRecord(data) + return s, errors.New("skipping TypeExtendedNatFlow") + case SFlowTypeExtendedMlpsTunnelFlow: + // TODO + skipRecord(data) + return s, errors.New("skipping TypeExtendedMlpsTunnelFlow") + case SFlowTypeExtendedMlpsVcFlow: + // TODO + skipRecord(data) + return s, errors.New("skipping TypeExtendedMlpsVcFlow") + case SFlowTypeExtendedMlpsFecFlow: + // TODO + skipRecord(data) + return s, errors.New("skipping TypeExtendedMlpsFecFlow") + case SFlowTypeExtendedMlpsLvpFecFlow: + // TODO + skipRecord(data) + return s, errors.New("skipping TypeExtendedMlpsLvpFecFlow") + case SFlowTypeExtendedVlanFlow: + // TODO + skipRecord(data) + return s, errors.New("skipping TypeExtendedVlanFlow") + case SFlowTypeExtendedIpv4TunnelEgressFlow: + if record, err := decodeExtendedIpv4TunnelEgress(data); err == nil { + s.Records = append(s.Records, record) + } else { + return s, err + } + case SFlowTypeExtendedIpv4TunnelIngressFlow: + if record, err := decodeExtendedIpv4TunnelIngress(data); err == nil { + s.Records = append(s.Records, record) + } else { + return s, err + } + case SFlowTypeExtendedIpv6TunnelEgressFlow: + if record, err := decodeExtendedIpv6TunnelEgress(data); err == nil { + s.Records = append(s.Records, record) + } else { + return s, err + } + case SFlowTypeExtendedIpv6TunnelIngressFlow: + if record, err := decodeExtendedIpv6TunnelIngress(data); err == nil { + s.Records = append(s.Records, record) + } else { + return s, err + } + case SFlowTypeExtendedDecapsulateEgressFlow: + if record, err := decodeExtendedDecapsulateEgress(data); err == nil { + s.Records = append(s.Records, record) + } else { + return s, err + } + case SFlowTypeExtendedDecapsulateIngressFlow: + if record, err := decodeExtendedDecapsulateIngress(data); err == nil { + s.Records = append(s.Records, record) + } else { + return s, err + } + case SFlowTypeExtendedVniEgressFlow: + if record, err := decodeExtendedVniEgress(data); err == nil { + s.Records = append(s.Records, record) + } else { + return s, err + } + case SFlowTypeExtendedVniIngressFlow: + if record, err := decodeExtendedVniIngress(data); err == nil { + s.Records = append(s.Records, record) + } else { + return s, err + } + default: + return s, fmt.Errorf("Unsupported flow record type: %d", flowRecordType) + } + } + return s, nil +} + +// Counter samples report information about various counter +// objects. Typically these are items like IfInOctets, or +// CPU / Memory stats, etc. SFlow will report these at regular +// intervals as configured on the agent. If one were sufficiently +// industrious, this could be used to replace the typical +// SNMP polling used for such things. +type SFlowCounterSample struct { + EnterpriseID SFlowEnterpriseID + Format SFlowSampleType + SampleLength uint32 + SequenceNumber uint32 + SourceIDClass SFlowSourceFormat + SourceIDIndex SFlowSourceValue + RecordCount uint32 + Records []SFlowRecord +} + +// Counter samples have the following structure: + +// 0 15 31 +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | int sample sequence number | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// |id type | src id index value | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | int number of records | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// / counter records / +// / / +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + +type SFlowCounterDataFormat uint32 + +func (cdf SFlowCounterDataFormat) decode() (SFlowEnterpriseID, SFlowCounterRecordType) { + leftField := cdf >> 12 + rightField := uint32(0xFFF) & uint32(cdf) + return SFlowEnterpriseID(leftField), SFlowCounterRecordType(rightField) +} + +// GetRecords will return a slice of interface types +// representing records. A type switch can be used to +// get at the underlying SFlowCounterRecordType. +func (cs SFlowCounterSample) GetRecords() []SFlowRecord { + return cs.Records +} + +// GetType will report the type of sample. Only the +// compact form of counter samples is supported +func (cs SFlowCounterSample) GetType() SFlowSampleType { + return SFlowTypeCounterSample +} + +type SFlowCounterRecordType uint32 + +const ( + SFlowTypeGenericInterfaceCounters SFlowCounterRecordType = 1 + SFlowTypeEthernetInterfaceCounters SFlowCounterRecordType = 2 + SFlowTypeTokenRingInterfaceCounters SFlowCounterRecordType = 3 + SFlowType100BaseVGInterfaceCounters SFlowCounterRecordType = 4 + SFlowTypeVLANCounters SFlowCounterRecordType = 5 + SFlowTypeProcessorCounters SFlowCounterRecordType = 1001 +) + +func (cr SFlowCounterRecordType) String() string { + switch cr { + case SFlowTypeGenericInterfaceCounters: + return "Generic Interface Counters" + case SFlowTypeEthernetInterfaceCounters: + return "Ethernet Interface Counters" + case SFlowTypeTokenRingInterfaceCounters: + return "Token Ring Interface Counters" + case SFlowType100BaseVGInterfaceCounters: + return "100BaseVG Interface Counters" + case SFlowTypeVLANCounters: + return "VLAN Counters" + case SFlowTypeProcessorCounters: + return "Processor Counters" + default: + return "" + + } +} + +func decodeCounterSample(data *[]byte, expanded bool) (SFlowCounterSample, error) { + s := SFlowCounterSample{} + var sdc SFlowDataSource + var sdce SFlowDataSourceExpanded + var sdf SFlowDataFormat + + *data, sdf = (*data)[4:], SFlowDataFormat(binary.BigEndian.Uint32((*data)[:4])) + s.EnterpriseID, s.Format = sdf.decode() + *data, s.SampleLength = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, s.SequenceNumber = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + if expanded { + *data, sdce = (*data)[8:], SFlowDataSourceExpanded{SFlowSourceFormat(binary.BigEndian.Uint32((*data)[:4])), SFlowSourceValue(binary.BigEndian.Uint32((*data)[4:8]))} + s.SourceIDClass, s.SourceIDIndex = sdce.decode() + } else { + *data, sdc = (*data)[4:], SFlowDataSource(binary.BigEndian.Uint32((*data)[:4])) + s.SourceIDClass, s.SourceIDIndex = sdc.decode() + } + *data, s.RecordCount = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + + for i := uint32(0); i < s.RecordCount; i++ { + cdf := SFlowCounterDataFormat(binary.BigEndian.Uint32((*data)[:4])) + _, counterRecordType := cdf.decode() + switch counterRecordType { + case SFlowTypeGenericInterfaceCounters: + if record, err := decodeGenericInterfaceCounters(data); err == nil { + s.Records = append(s.Records, record) + } else { + return s, err + } + case SFlowTypeEthernetInterfaceCounters: + if record, err := decodeEthernetCounters(data); err == nil { + s.Records = append(s.Records, record) + } else { + return s, err + } + case SFlowTypeTokenRingInterfaceCounters: + skipRecord(data) + return s, errors.New("skipping TypeTokenRingInterfaceCounters") + case SFlowType100BaseVGInterfaceCounters: + skipRecord(data) + return s, errors.New("skipping Type100BaseVGInterfaceCounters") + case SFlowTypeVLANCounters: + skipRecord(data) + return s, errors.New("skipping TypeVLANCounters") + case SFlowTypeProcessorCounters: + if record, err := decodeProcessorCounters(data); err == nil { + s.Records = append(s.Records, record) + } else { + return s, err + } + default: + return s, fmt.Errorf("Invalid counter record type: %d", counterRecordType) + } + } + return s, nil +} + +// SFlowBaseFlowRecord holds the fields common to all records +// of type SFlowFlowRecordType +type SFlowBaseFlowRecord struct { + EnterpriseID SFlowEnterpriseID + Format SFlowFlowRecordType + FlowDataLength uint32 +} + +func (bfr SFlowBaseFlowRecord) GetType() SFlowFlowRecordType { + return bfr.Format +} + +// SFlowFlowRecordType denotes what kind of Flow Record is +// represented. See RFC 3176 +type SFlowFlowRecordType uint32 + +const ( + SFlowTypeRawPacketFlow SFlowFlowRecordType = 1 + SFlowTypeEthernetFrameFlow SFlowFlowRecordType = 2 + SFlowTypeIpv4Flow SFlowFlowRecordType = 3 + SFlowTypeIpv6Flow SFlowFlowRecordType = 4 + SFlowTypeExtendedSwitchFlow SFlowFlowRecordType = 1001 + SFlowTypeExtendedRouterFlow SFlowFlowRecordType = 1002 + SFlowTypeExtendedGatewayFlow SFlowFlowRecordType = 1003 + SFlowTypeExtendedUserFlow SFlowFlowRecordType = 1004 + SFlowTypeExtendedUrlFlow SFlowFlowRecordType = 1005 + SFlowTypeExtendedMlpsFlow SFlowFlowRecordType = 1006 + SFlowTypeExtendedNatFlow SFlowFlowRecordType = 1007 + SFlowTypeExtendedMlpsTunnelFlow SFlowFlowRecordType = 1008 + SFlowTypeExtendedMlpsVcFlow SFlowFlowRecordType = 1009 + SFlowTypeExtendedMlpsFecFlow SFlowFlowRecordType = 1010 + SFlowTypeExtendedMlpsLvpFecFlow SFlowFlowRecordType = 1011 + SFlowTypeExtendedVlanFlow SFlowFlowRecordType = 1012 + SFlowTypeExtendedIpv4TunnelEgressFlow SFlowFlowRecordType = 1023 + SFlowTypeExtendedIpv4TunnelIngressFlow SFlowFlowRecordType = 1024 + SFlowTypeExtendedIpv6TunnelEgressFlow SFlowFlowRecordType = 1025 + SFlowTypeExtendedIpv6TunnelIngressFlow SFlowFlowRecordType = 1026 + SFlowTypeExtendedDecapsulateEgressFlow SFlowFlowRecordType = 1027 + SFlowTypeExtendedDecapsulateIngressFlow SFlowFlowRecordType = 1028 + SFlowTypeExtendedVniEgressFlow SFlowFlowRecordType = 1029 + SFlowTypeExtendedVniIngressFlow SFlowFlowRecordType = 1030 +) + +func (rt SFlowFlowRecordType) String() string { + switch rt { + case SFlowTypeRawPacketFlow: + return "Raw Packet Flow Record" + case SFlowTypeEthernetFrameFlow: + return "Ethernet Frame Flow Record" + case SFlowTypeIpv4Flow: + return "IPv4 Flow Record" + case SFlowTypeIpv6Flow: + return "IPv6 Flow Record" + case SFlowTypeExtendedSwitchFlow: + return "Extended Switch Flow Record" + case SFlowTypeExtendedRouterFlow: + return "Extended Router Flow Record" + case SFlowTypeExtendedGatewayFlow: + return "Extended Gateway Flow Record" + case SFlowTypeExtendedUserFlow: + return "Extended User Flow Record" + case SFlowTypeExtendedUrlFlow: + return "Extended URL Flow Record" + case SFlowTypeExtendedMlpsFlow: + return "Extended MPLS Flow Record" + case SFlowTypeExtendedNatFlow: + return "Extended NAT Flow Record" + case SFlowTypeExtendedMlpsTunnelFlow: + return "Extended MPLS Tunnel Flow Record" + case SFlowTypeExtendedMlpsVcFlow: + return "Extended MPLS VC Flow Record" + case SFlowTypeExtendedMlpsFecFlow: + return "Extended MPLS FEC Flow Record" + case SFlowTypeExtendedMlpsLvpFecFlow: + return "Extended MPLS LVP FEC Flow Record" + case SFlowTypeExtendedVlanFlow: + return "Extended VLAN Flow Record" + case SFlowTypeExtendedIpv4TunnelEgressFlow: + return "Extended IPv4 Tunnel Egress Record" + case SFlowTypeExtendedIpv4TunnelIngressFlow: + return "Extended IPv4 Tunnel Ingress Record" + case SFlowTypeExtendedIpv6TunnelEgressFlow: + return "Extended IPv6 Tunnel Egress Record" + case SFlowTypeExtendedIpv6TunnelIngressFlow: + return "Extended IPv6 Tunnel Ingress Record" + case SFlowTypeExtendedDecapsulateEgressFlow: + return "Extended Decapsulate Egress Record" + case SFlowTypeExtendedDecapsulateIngressFlow: + return "Extended Decapsulate Ingress Record" + case SFlowTypeExtendedVniEgressFlow: + return "Extended VNI Ingress Record" + case SFlowTypeExtendedVniIngressFlow: + return "Extended VNI Ingress Record" + default: + return "" + } +} + +// SFlowRawPacketFlowRecords hold information about a sampled +// packet grabbed as it transited the agent. This is +// perhaps the most useful and interesting record type, +// as it holds the headers of the sampled packet and +// can be used to build up a complete picture of the +// traffic patterns on a network. +// +// The raw packet header is sent back into gopacket for +// decoding, and the resulting gopackt.Packet is stored +// in the Header member +type SFlowRawPacketFlowRecord struct { + SFlowBaseFlowRecord + HeaderProtocol SFlowRawHeaderProtocol + FrameLength uint32 + PayloadRemoved uint32 + HeaderLength uint32 + Header gopacket.Packet +} + +// Raw packet record types have the following structure: + +// 0 15 31 +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | 20 bit Interprise (0) |12 bit format | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | record length | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | Header Protocol | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | Frame Length | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | Payload Removed | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | Header Length | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// \ Header \ +// \ \ +// \ \ +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + +type SFlowRawHeaderProtocol uint32 + +const ( + SFlowProtoEthernet SFlowRawHeaderProtocol = 1 + SFlowProtoISO88024 SFlowRawHeaderProtocol = 2 + SFlowProtoISO88025 SFlowRawHeaderProtocol = 3 + SFlowProtoFDDI SFlowRawHeaderProtocol = 4 + SFlowProtoFrameRelay SFlowRawHeaderProtocol = 5 + SFlowProtoX25 SFlowRawHeaderProtocol = 6 + SFlowProtoPPP SFlowRawHeaderProtocol = 7 + SFlowProtoSMDS SFlowRawHeaderProtocol = 8 + SFlowProtoAAL5 SFlowRawHeaderProtocol = 9 + SFlowProtoAAL5_IP SFlowRawHeaderProtocol = 10 /* e.g. Cisco AAL5 mux */ + SFlowProtoIPv4 SFlowRawHeaderProtocol = 11 + SFlowProtoIPv6 SFlowRawHeaderProtocol = 12 + SFlowProtoMPLS SFlowRawHeaderProtocol = 13 + SFlowProtoPOS SFlowRawHeaderProtocol = 14 /* RFC 1662, 2615 */ +) + +func (sfhp SFlowRawHeaderProtocol) String() string { + switch sfhp { + case SFlowProtoEthernet: + return "ETHERNET-ISO88023" + case SFlowProtoISO88024: + return "ISO88024-TOKENBUS" + case SFlowProtoISO88025: + return "ISO88025-TOKENRING" + case SFlowProtoFDDI: + return "FDDI" + case SFlowProtoFrameRelay: + return "FRAME-RELAY" + case SFlowProtoX25: + return "X25" + case SFlowProtoPPP: + return "PPP" + case SFlowProtoSMDS: + return "SMDS" + case SFlowProtoAAL5: + return "AAL5" + case SFlowProtoAAL5_IP: + return "AAL5-IP" + case SFlowProtoIPv4: + return "IPv4" + case SFlowProtoIPv6: + return "IPv6" + case SFlowProtoMPLS: + return "MPLS" + case SFlowProtoPOS: + return "POS" + } + return "UNKNOWN" +} + +func decodeRawPacketFlowRecord(data *[]byte) (SFlowRawPacketFlowRecord, error) { + rec := SFlowRawPacketFlowRecord{} + header := []byte{} + var fdf SFlowFlowDataFormat + + *data, fdf = (*data)[4:], SFlowFlowDataFormat(binary.BigEndian.Uint32((*data)[:4])) + rec.EnterpriseID, rec.Format = fdf.decode() + *data, rec.FlowDataLength = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, rec.HeaderProtocol = (*data)[4:], SFlowRawHeaderProtocol(binary.BigEndian.Uint32((*data)[:4])) + *data, rec.FrameLength = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, rec.PayloadRemoved = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, rec.HeaderLength = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + headerLenWithPadding := int(rec.HeaderLength + ((4 - rec.HeaderLength) % 4)) + *data, header = (*data)[headerLenWithPadding:], (*data)[:headerLenWithPadding] + rec.Header = gopacket.NewPacket(header, LayerTypeEthernet, gopacket.Default) + return rec, nil +} + +// SFlowExtendedSwitchFlowRecord give additional information +// about the sampled packet if it's available. It's mainly +// useful for getting at the incoming and outgoing VLANs +// An agent may or may not provide this information. +type SFlowExtendedSwitchFlowRecord struct { + SFlowBaseFlowRecord + IncomingVLAN uint32 + IncomingVLANPriority uint32 + OutgoingVLAN uint32 + OutgoingVLANPriority uint32 +} + +// Extended switch records have the following structure: + +// 0 15 31 +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | 20 bit Interprise (0) |12 bit format | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | record length | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | Incoming VLAN | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | Incoming VLAN Priority | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | Outgoing VLAN | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | Outgoing VLAN Priority | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + +func decodeExtendedSwitchFlowRecord(data *[]byte) (SFlowExtendedSwitchFlowRecord, error) { + es := SFlowExtendedSwitchFlowRecord{} + var fdf SFlowFlowDataFormat + + *data, fdf = (*data)[4:], SFlowFlowDataFormat(binary.BigEndian.Uint32((*data)[:4])) + es.EnterpriseID, es.Format = fdf.decode() + *data, es.FlowDataLength = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, es.IncomingVLAN = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, es.IncomingVLANPriority = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, es.OutgoingVLAN = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, es.OutgoingVLANPriority = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + return es, nil +} + +// SFlowExtendedRouterFlowRecord gives additional information +// about the layer 3 routing information used to forward +// the packet +type SFlowExtendedRouterFlowRecord struct { + SFlowBaseFlowRecord + NextHop net.IP + NextHopSourceMask uint32 + NextHopDestinationMask uint32 +} + +// Extended router records have the following structure: + +// 0 15 31 +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | 20 bit Interprise (0) |12 bit format | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | record length | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | IP version of next hop router (1=v4|2=v6) | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// / Next Hop address (v4=4byte|v6=16byte) / +// / / +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | Next Hop Source Mask | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | Next Hop Destination Mask | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + +func decodeExtendedRouterFlowRecord(data *[]byte) (SFlowExtendedRouterFlowRecord, error) { + er := SFlowExtendedRouterFlowRecord{} + var fdf SFlowFlowDataFormat + var extendedRouterAddressType SFlowIPType + + *data, fdf = (*data)[4:], SFlowFlowDataFormat(binary.BigEndian.Uint32((*data)[:4])) + er.EnterpriseID, er.Format = fdf.decode() + *data, er.FlowDataLength = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, extendedRouterAddressType = (*data)[4:], SFlowIPType(binary.BigEndian.Uint32((*data)[:4])) + *data, er.NextHop = (*data)[extendedRouterAddressType.Length():], (*data)[:extendedRouterAddressType.Length()] + *data, er.NextHopSourceMask = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, er.NextHopDestinationMask = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + return er, nil +} + +// SFlowExtendedGatewayFlowRecord describes information treasured by +// nework engineers everywhere: AS path information listing which +// BGP peer sent the packet, and various other BGP related info. +// This information is vital because it gives a picture of how much +// traffic is being sent from / received by various BGP peers. + +// Extended gateway records have the following structure: + +// 0 15 31 +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | 20 bit Interprise (0) |12 bit format | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | record length | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | IP version of next hop router (1=v4|2=v6) | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// / Next Hop address (v4=4byte|v6=16byte) / +// / / +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | AS | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | Source AS | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | Peer AS | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | AS Path Count | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// / AS Path / Sequence / +// / / +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// / Communities / +// / / +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | Local Pref | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + +// AS Path / Sequence: + +// 0 15 31 +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | AS Source Type (Path=1 / Sequence=2) | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | Path / Sequence length | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// / Path / Sequence Members / +// / / +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + +// Communities: + +// 0 15 31 +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | communitiy length | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// / communitiy Members / +// / / +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + +type SFlowExtendedGatewayFlowRecord struct { + SFlowBaseFlowRecord + NextHop net.IP + AS uint32 + SourceAS uint32 + PeerAS uint32 + ASPathCount uint32 + ASPath []SFlowASDestination + Communities []uint32 + LocalPref uint32 +} + +type SFlowASPathType uint32 + +const ( + SFlowASSet SFlowASPathType = 1 + SFlowASSequence SFlowASPathType = 2 +) + +func (apt SFlowASPathType) String() string { + switch apt { + case SFlowASSet: + return "AS Set" + case SFlowASSequence: + return "AS Sequence" + default: + return "" + } +} + +type SFlowASDestination struct { + Type SFlowASPathType + Count uint32 + Members []uint32 +} + +func (asd SFlowASDestination) String() string { + switch asd.Type { + case SFlowASSet: + return fmt.Sprint("AS Set:", asd.Members) + case SFlowASSequence: + return fmt.Sprint("AS Sequence:", asd.Members) + default: + return "" + } +} + +func (ad *SFlowASDestination) decodePath(data *[]byte) { + *data, ad.Type = (*data)[4:], SFlowASPathType(binary.BigEndian.Uint32((*data)[:4])) + *data, ad.Count = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + ad.Members = make([]uint32, ad.Count) + for i := uint32(0); i < ad.Count; i++ { + var member uint32 + *data, member = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + ad.Members[i] = member + } +} + +func decodeExtendedGatewayFlowRecord(data *[]byte) (SFlowExtendedGatewayFlowRecord, error) { + eg := SFlowExtendedGatewayFlowRecord{} + var fdf SFlowFlowDataFormat + var extendedGatewayAddressType SFlowIPType + var communitiesLength uint32 + var community uint32 + + *data, fdf = (*data)[4:], SFlowFlowDataFormat(binary.BigEndian.Uint32((*data)[:4])) + eg.EnterpriseID, eg.Format = fdf.decode() + *data, eg.FlowDataLength = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, extendedGatewayAddressType = (*data)[4:], SFlowIPType(binary.BigEndian.Uint32((*data)[:4])) + *data, eg.NextHop = (*data)[extendedGatewayAddressType.Length():], (*data)[:extendedGatewayAddressType.Length()] + *data, eg.AS = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, eg.SourceAS = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, eg.PeerAS = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, eg.ASPathCount = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + for i := uint32(0); i < eg.ASPathCount; i++ { + asPath := SFlowASDestination{} + asPath.decodePath(data) + eg.ASPath = append(eg.ASPath, asPath) + } + *data, communitiesLength = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + eg.Communities = make([]uint32, communitiesLength) + for j := uint32(0); j < communitiesLength; j++ { + *data, community = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + eg.Communities[j] = community + } + *data, eg.LocalPref = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + return eg, nil +} + +// ************************************************** +// Extended URL Flow Record +// ************************************************** + +// 0 15 31 +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | 20 bit Interprise (0) |12 bit format | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | record length | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | direction | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | URL | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | Host | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + +type SFlowURLDirection uint32 + +const ( + SFlowURLsrc SFlowURLDirection = 1 + SFlowURLdst SFlowURLDirection = 2 +) + +func (urld SFlowURLDirection) String() string { + switch urld { + case SFlowURLsrc: + return "Source address is the server" + case SFlowURLdst: + return "Destination address is the server" + default: + return "" + } +} + +type SFlowExtendedURLRecord struct { + SFlowBaseFlowRecord + Direction SFlowURLDirection + URL string + Host string +} + +func decodeExtendedURLRecord(data *[]byte) (SFlowExtendedURLRecord, error) { + eur := SFlowExtendedURLRecord{} + var fdf SFlowFlowDataFormat + var urlLen uint32 + var urlLenWithPad int + var hostLen uint32 + var hostLenWithPad int + var urlBytes []byte + var hostBytes []byte + + *data, fdf = (*data)[4:], SFlowFlowDataFormat(binary.BigEndian.Uint32((*data)[:4])) + eur.EnterpriseID, eur.Format = fdf.decode() + *data, eur.FlowDataLength = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, eur.Direction = (*data)[4:], SFlowURLDirection(binary.BigEndian.Uint32((*data)[:4])) + *data, urlLen = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + urlLenWithPad = int(urlLen + ((4 - urlLen) % 4)) + *data, urlBytes = (*data)[urlLenWithPad:], (*data)[:urlLenWithPad] + eur.URL = string(urlBytes[:urlLen]) + *data, hostLen = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + hostLenWithPad = int(hostLen + ((4 - hostLen) % 4)) + *data, hostBytes = (*data)[hostLenWithPad:], (*data)[:hostLenWithPad] + eur.Host = string(hostBytes[:hostLen]) + return eur, nil +} + +// ************************************************** +// Extended User Flow Record +// ************************************************** + +// 0 15 31 +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | 20 bit Interprise (0) |12 bit format | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | record length | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | Source Character Set | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | Source User Id | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | Destination Character Set | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | Destination User ID | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + +type SFlowExtendedUserFlow struct { + SFlowBaseFlowRecord + SourceCharSet SFlowCharSet + SourceUserID string + DestinationCharSet SFlowCharSet + DestinationUserID string +} + +type SFlowCharSet uint32 + +const ( + SFlowCSunknown SFlowCharSet = 2 + SFlowCSASCII SFlowCharSet = 3 + SFlowCSISOLatin1 SFlowCharSet = 4 + SFlowCSISOLatin2 SFlowCharSet = 5 + SFlowCSISOLatin3 SFlowCharSet = 6 + SFlowCSISOLatin4 SFlowCharSet = 7 + SFlowCSISOLatinCyrillic SFlowCharSet = 8 + SFlowCSISOLatinArabic SFlowCharSet = 9 + SFlowCSISOLatinGreek SFlowCharSet = 10 + SFlowCSISOLatinHebrew SFlowCharSet = 11 + SFlowCSISOLatin5 SFlowCharSet = 12 + SFlowCSISOLatin6 SFlowCharSet = 13 + SFlowCSISOTextComm SFlowCharSet = 14 + SFlowCSHalfWidthKatakana SFlowCharSet = 15 + SFlowCSJISEncoding SFlowCharSet = 16 + SFlowCSShiftJIS SFlowCharSet = 17 + SFlowCSEUCPkdFmtJapanese SFlowCharSet = 18 + SFlowCSEUCFixWidJapanese SFlowCharSet = 19 + SFlowCSISO4UnitedKingdom SFlowCharSet = 20 + SFlowCSISO11SwedishForNames SFlowCharSet = 21 + SFlowCSISO15Italian SFlowCharSet = 22 + SFlowCSISO17Spanish SFlowCharSet = 23 + SFlowCSISO21German SFlowCharSet = 24 + SFlowCSISO60DanishNorwegian SFlowCharSet = 25 + SFlowCSISO69French SFlowCharSet = 26 + SFlowCSISO10646UTF1 SFlowCharSet = 27 + SFlowCSISO646basic1983 SFlowCharSet = 28 + SFlowCSINVARIANT SFlowCharSet = 29 + SFlowCSISO2IntlRefVersion SFlowCharSet = 30 + SFlowCSNATSSEFI SFlowCharSet = 31 + SFlowCSNATSSEFIADD SFlowCharSet = 32 + SFlowCSNATSDANO SFlowCharSet = 33 + SFlowCSNATSDANOADD SFlowCharSet = 34 + SFlowCSISO10Swedish SFlowCharSet = 35 + SFlowCSKSC56011987 SFlowCharSet = 36 + SFlowCSISO2022KR SFlowCharSet = 37 + SFlowCSEUCKR SFlowCharSet = 38 + SFlowCSISO2022JP SFlowCharSet = 39 + SFlowCSISO2022JP2 SFlowCharSet = 40 + SFlowCSISO13JISC6220jp SFlowCharSet = 41 + SFlowCSISO14JISC6220ro SFlowCharSet = 42 + SFlowCSISO16Portuguese SFlowCharSet = 43 + SFlowCSISO18Greek7Old SFlowCharSet = 44 + SFlowCSISO19LatinGreek SFlowCharSet = 45 + SFlowCSISO25French SFlowCharSet = 46 + SFlowCSISO27LatinGreek1 SFlowCharSet = 47 + SFlowCSISO5427Cyrillic SFlowCharSet = 48 + SFlowCSISO42JISC62261978 SFlowCharSet = 49 + SFlowCSISO47BSViewdata SFlowCharSet = 50 + SFlowCSISO49INIS SFlowCharSet = 51 + SFlowCSISO50INIS8 SFlowCharSet = 52 + SFlowCSISO51INISCyrillic SFlowCharSet = 53 + SFlowCSISO54271981 SFlowCharSet = 54 + SFlowCSISO5428Greek SFlowCharSet = 55 + SFlowCSISO57GB1988 SFlowCharSet = 56 + SFlowCSISO58GB231280 SFlowCharSet = 57 + SFlowCSISO61Norwegian2 SFlowCharSet = 58 + SFlowCSISO70VideotexSupp1 SFlowCharSet = 59 + SFlowCSISO84Portuguese2 SFlowCharSet = 60 + SFlowCSISO85Spanish2 SFlowCharSet = 61 + SFlowCSISO86Hungarian SFlowCharSet = 62 + SFlowCSISO87JISX0208 SFlowCharSet = 63 + SFlowCSISO88Greek7 SFlowCharSet = 64 + SFlowCSISO89ASMO449 SFlowCharSet = 65 + SFlowCSISO90 SFlowCharSet = 66 + SFlowCSISO91JISC62291984a SFlowCharSet = 67 + SFlowCSISO92JISC62991984b SFlowCharSet = 68 + SFlowCSISO93JIS62291984badd SFlowCharSet = 69 + SFlowCSISO94JIS62291984hand SFlowCharSet = 70 + SFlowCSISO95JIS62291984handadd SFlowCharSet = 71 + SFlowCSISO96JISC62291984kana SFlowCharSet = 72 + SFlowCSISO2033 SFlowCharSet = 73 + SFlowCSISO99NAPLPS SFlowCharSet = 74 + SFlowCSISO102T617bit SFlowCharSet = 75 + SFlowCSISO103T618bit SFlowCharSet = 76 + SFlowCSISO111ECMACyrillic SFlowCharSet = 77 + SFlowCSa71 SFlowCharSet = 78 + SFlowCSa72 SFlowCharSet = 79 + SFlowCSISO123CSAZ24341985gr SFlowCharSet = 80 + SFlowCSISO88596E SFlowCharSet = 81 + SFlowCSISO88596I SFlowCharSet = 82 + SFlowCSISO128T101G2 SFlowCharSet = 83 + SFlowCSISO88598E SFlowCharSet = 84 + SFlowCSISO88598I SFlowCharSet = 85 + SFlowCSISO139CSN369103 SFlowCharSet = 86 + SFlowCSISO141JUSIB1002 SFlowCharSet = 87 + SFlowCSISO143IECP271 SFlowCharSet = 88 + SFlowCSISO146Serbian SFlowCharSet = 89 + SFlowCSISO147Macedonian SFlowCharSet = 90 + SFlowCSISO150 SFlowCharSet = 91 + SFlowCSISO151Cuba SFlowCharSet = 92 + SFlowCSISO6937Add SFlowCharSet = 93 + SFlowCSISO153GOST1976874 SFlowCharSet = 94 + SFlowCSISO8859Supp SFlowCharSet = 95 + SFlowCSISO10367Box SFlowCharSet = 96 + SFlowCSISO158Lap SFlowCharSet = 97 + SFlowCSISO159JISX02121990 SFlowCharSet = 98 + SFlowCSISO646Danish SFlowCharSet = 99 + SFlowCSUSDK SFlowCharSet = 100 + SFlowCSDKUS SFlowCharSet = 101 + SFlowCSKSC5636 SFlowCharSet = 102 + SFlowCSUnicode11UTF7 SFlowCharSet = 103 + SFlowCSISO2022CN SFlowCharSet = 104 + SFlowCSISO2022CNEXT SFlowCharSet = 105 + SFlowCSUTF8 SFlowCharSet = 106 + SFlowCSISO885913 SFlowCharSet = 109 + SFlowCSISO885914 SFlowCharSet = 110 + SFlowCSISO885915 SFlowCharSet = 111 + SFlowCSISO885916 SFlowCharSet = 112 + SFlowCSGBK SFlowCharSet = 113 + SFlowCSGB18030 SFlowCharSet = 114 + SFlowCSOSDEBCDICDF0415 SFlowCharSet = 115 + SFlowCSOSDEBCDICDF03IRV SFlowCharSet = 116 + SFlowCSOSDEBCDICDF041 SFlowCharSet = 117 + SFlowCSISO115481 SFlowCharSet = 118 + SFlowCSKZ1048 SFlowCharSet = 119 + SFlowCSUnicode SFlowCharSet = 1000 + SFlowCSUCS4 SFlowCharSet = 1001 + SFlowCSUnicodeASCII SFlowCharSet = 1002 + SFlowCSUnicodeLatin1 SFlowCharSet = 1003 + SFlowCSUnicodeJapanese SFlowCharSet = 1004 + SFlowCSUnicodeIBM1261 SFlowCharSet = 1005 + SFlowCSUnicodeIBM1268 SFlowCharSet = 1006 + SFlowCSUnicodeIBM1276 SFlowCharSet = 1007 + SFlowCSUnicodeIBM1264 SFlowCharSet = 1008 + SFlowCSUnicodeIBM1265 SFlowCharSet = 1009 + SFlowCSUnicode11 SFlowCharSet = 1010 + SFlowCSSCSU SFlowCharSet = 1011 + SFlowCSUTF7 SFlowCharSet = 1012 + SFlowCSUTF16BE SFlowCharSet = 1013 + SFlowCSUTF16LE SFlowCharSet = 1014 + SFlowCSUTF16 SFlowCharSet = 1015 + SFlowCSCESU8 SFlowCharSet = 1016 + SFlowCSUTF32 SFlowCharSet = 1017 + SFlowCSUTF32BE SFlowCharSet = 1018 + SFlowCSUTF32LE SFlowCharSet = 1019 + SFlowCSBOCU1 SFlowCharSet = 1020 + SFlowCSWindows30Latin1 SFlowCharSet = 2000 + SFlowCSWindows31Latin1 SFlowCharSet = 2001 + SFlowCSWindows31Latin2 SFlowCharSet = 2002 + SFlowCSWindows31Latin5 SFlowCharSet = 2003 + SFlowCSHPRoman8 SFlowCharSet = 2004 + SFlowCSAdobeStandardEncoding SFlowCharSet = 2005 + SFlowCSVenturaUS SFlowCharSet = 2006 + SFlowCSVenturaInternational SFlowCharSet = 2007 + SFlowCSDECMCS SFlowCharSet = 2008 + SFlowCSPC850Multilingual SFlowCharSet = 2009 + SFlowCSPCp852 SFlowCharSet = 2010 + SFlowCSPC8CodePage437 SFlowCharSet = 2011 + SFlowCSPC8DanishNorwegian SFlowCharSet = 2012 + SFlowCSPC862LatinHebrew SFlowCharSet = 2013 + SFlowCSPC8Turkish SFlowCharSet = 2014 + SFlowCSIBMSymbols SFlowCharSet = 2015 + SFlowCSIBMThai SFlowCharSet = 2016 + SFlowCSHPLegal SFlowCharSet = 2017 + SFlowCSHPPiFont SFlowCharSet = 2018 + SFlowCSHPMath8 SFlowCharSet = 2019 + SFlowCSHPPSMath SFlowCharSet = 2020 + SFlowCSHPDesktop SFlowCharSet = 2021 + SFlowCSVenturaMath SFlowCharSet = 2022 + SFlowCSMicrosoftPublishing SFlowCharSet = 2023 + SFlowCSWindows31J SFlowCharSet = 2024 + SFlowCSGB2312 SFlowCharSet = 2025 + SFlowCSBig5 SFlowCharSet = 2026 + SFlowCSMacintosh SFlowCharSet = 2027 + SFlowCSIBM037 SFlowCharSet = 2028 + SFlowCSIBM038 SFlowCharSet = 2029 + SFlowCSIBM273 SFlowCharSet = 2030 + SFlowCSIBM274 SFlowCharSet = 2031 + SFlowCSIBM275 SFlowCharSet = 2032 + SFlowCSIBM277 SFlowCharSet = 2033 + SFlowCSIBM278 SFlowCharSet = 2034 + SFlowCSIBM280 SFlowCharSet = 2035 + SFlowCSIBM281 SFlowCharSet = 2036 + SFlowCSIBM284 SFlowCharSet = 2037 + SFlowCSIBM285 SFlowCharSet = 2038 + SFlowCSIBM290 SFlowCharSet = 2039 + SFlowCSIBM297 SFlowCharSet = 2040 + SFlowCSIBM420 SFlowCharSet = 2041 + SFlowCSIBM423 SFlowCharSet = 2042 + SFlowCSIBM424 SFlowCharSet = 2043 + SFlowCSIBM500 SFlowCharSet = 2044 + SFlowCSIBM851 SFlowCharSet = 2045 + SFlowCSIBM855 SFlowCharSet = 2046 + SFlowCSIBM857 SFlowCharSet = 2047 + SFlowCSIBM860 SFlowCharSet = 2048 + SFlowCSIBM861 SFlowCharSet = 2049 + SFlowCSIBM863 SFlowCharSet = 2050 + SFlowCSIBM864 SFlowCharSet = 2051 + SFlowCSIBM865 SFlowCharSet = 2052 + SFlowCSIBM868 SFlowCharSet = 2053 + SFlowCSIBM869 SFlowCharSet = 2054 + SFlowCSIBM870 SFlowCharSet = 2055 + SFlowCSIBM871 SFlowCharSet = 2056 + SFlowCSIBM880 SFlowCharSet = 2057 + SFlowCSIBM891 SFlowCharSet = 2058 + SFlowCSIBM903 SFlowCharSet = 2059 + SFlowCSIBBM904 SFlowCharSet = 2060 + SFlowCSIBM905 SFlowCharSet = 2061 + SFlowCSIBM918 SFlowCharSet = 2062 + SFlowCSIBM1026 SFlowCharSet = 2063 + SFlowCSIBMEBCDICATDE SFlowCharSet = 2064 + SFlowCSEBCDICATDEA SFlowCharSet = 2065 + SFlowCSEBCDICCAFR SFlowCharSet = 2066 + SFlowCSEBCDICDKNO SFlowCharSet = 2067 + SFlowCSEBCDICDKNOA SFlowCharSet = 2068 + SFlowCSEBCDICFISE SFlowCharSet = 2069 + SFlowCSEBCDICFISEA SFlowCharSet = 2070 + SFlowCSEBCDICFR SFlowCharSet = 2071 + SFlowCSEBCDICIT SFlowCharSet = 2072 + SFlowCSEBCDICPT SFlowCharSet = 2073 + SFlowCSEBCDICES SFlowCharSet = 2074 + SFlowCSEBCDICESA SFlowCharSet = 2075 + SFlowCSEBCDICESS SFlowCharSet = 2076 + SFlowCSEBCDICUK SFlowCharSet = 2077 + SFlowCSEBCDICUS SFlowCharSet = 2078 + SFlowCSUnknown8BiT SFlowCharSet = 2079 + SFlowCSMnemonic SFlowCharSet = 2080 + SFlowCSMnem SFlowCharSet = 2081 + SFlowCSVISCII SFlowCharSet = 2082 + SFlowCSVIQR SFlowCharSet = 2083 + SFlowCSKOI8R SFlowCharSet = 2084 + SFlowCSHZGB2312 SFlowCharSet = 2085 + SFlowCSIBM866 SFlowCharSet = 2086 + SFlowCSPC775Baltic SFlowCharSet = 2087 + SFlowCSKOI8U SFlowCharSet = 2088 + SFlowCSIBM00858 SFlowCharSet = 2089 + SFlowCSIBM00924 SFlowCharSet = 2090 + SFlowCSIBM01140 SFlowCharSet = 2091 + SFlowCSIBM01141 SFlowCharSet = 2092 + SFlowCSIBM01142 SFlowCharSet = 2093 + SFlowCSIBM01143 SFlowCharSet = 2094 + SFlowCSIBM01144 SFlowCharSet = 2095 + SFlowCSIBM01145 SFlowCharSet = 2096 + SFlowCSIBM01146 SFlowCharSet = 2097 + SFlowCSIBM01147 SFlowCharSet = 2098 + SFlowCSIBM01148 SFlowCharSet = 2099 + SFlowCSIBM01149 SFlowCharSet = 2100 + SFlowCSBig5HKSCS SFlowCharSet = 2101 + SFlowCSIBM1047 SFlowCharSet = 2102 + SFlowCSPTCP154 SFlowCharSet = 2103 + SFlowCSAmiga1251 SFlowCharSet = 2104 + SFlowCSKOI7switched SFlowCharSet = 2105 + SFlowCSBRF SFlowCharSet = 2106 + SFlowCSTSCII SFlowCharSet = 2107 + SFlowCSCP51932 SFlowCharSet = 2108 + SFlowCSWindows874 SFlowCharSet = 2109 + SFlowCSWindows1250 SFlowCharSet = 2250 + SFlowCSWindows1251 SFlowCharSet = 2251 + SFlowCSWindows1252 SFlowCharSet = 2252 + SFlowCSWindows1253 SFlowCharSet = 2253 + SFlowCSWindows1254 SFlowCharSet = 2254 + SFlowCSWindows1255 SFlowCharSet = 2255 + SFlowCSWindows1256 SFlowCharSet = 2256 + SFlowCSWindows1257 SFlowCharSet = 2257 + SFlowCSWindows1258 SFlowCharSet = 2258 + SFlowCSTIS620 SFlowCharSet = 2259 + SFlowCS50220 SFlowCharSet = 2260 + SFlowCSreserved SFlowCharSet = 3000 +) + +func decodeExtendedUserFlow(data *[]byte) (SFlowExtendedUserFlow, error) { + eu := SFlowExtendedUserFlow{} + var fdf SFlowFlowDataFormat + var srcUserLen uint32 + var srcUserLenWithPad int + var srcUserBytes []byte + var dstUserLen uint32 + var dstUserLenWithPad int + var dstUserBytes []byte + + *data, fdf = (*data)[4:], SFlowFlowDataFormat(binary.BigEndian.Uint32((*data)[:4])) + eu.EnterpriseID, eu.Format = fdf.decode() + *data, eu.FlowDataLength = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, eu.SourceCharSet = (*data)[4:], SFlowCharSet(binary.BigEndian.Uint32((*data)[:4])) + *data, srcUserLen = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + srcUserLenWithPad = int(srcUserLen + ((4 - srcUserLen) % 4)) + *data, srcUserBytes = (*data)[srcUserLenWithPad:], (*data)[:srcUserLenWithPad] + eu.SourceUserID = string(srcUserBytes[:srcUserLen]) + *data, eu.DestinationCharSet = (*data)[4:], SFlowCharSet(binary.BigEndian.Uint32((*data)[:4])) + *data, dstUserLen = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + dstUserLenWithPad = int(dstUserLen + ((4 - dstUserLen) % 4)) + *data, dstUserBytes = (*data)[dstUserLenWithPad:], (*data)[:dstUserLenWithPad] + eu.DestinationUserID = string(dstUserBytes[:dstUserLen]) + return eu, nil +} + +// ************************************************** +// Packet IP version 4 Record +// ************************************************** + +// 0 15 31 +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | Length | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | Protocol | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | Source IPv4 | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | Destination IPv4 | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | Source Port | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | Destionation Port | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | TCP Flags | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | TOS | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +type SFlowIpv4Record struct { + // The length of the IP packet excluding ower layer encapsulations + Length uint32 + // IP Protocol type (for example, TCP = 6, UDP = 17) + Protocol uint32 + // Source IP Address + IPSrc net.IP + // Destination IP Address + IPDst net.IP + // TCP/UDP source port number or equivalent + PortSrc uint32 + // TCP/UDP destination port number or equivalent + PortDst uint32 + // TCP flags + TCPFlags uint32 + // IP type of service + TOS uint32 +} + +func decodeSFlowIpv4Record(data *[]byte) (SFlowIpv4Record, error) { + si := SFlowIpv4Record{} + + *data, si.Length = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, si.Protocol = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, si.IPSrc = (*data)[4:], net.IP((*data)[:4]) + *data, si.IPDst = (*data)[4:], net.IP((*data)[:4]) + *data, si.PortSrc = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, si.PortDst = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, si.TCPFlags = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, si.TOS = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + + return si, nil +} + +// ************************************************** +// Packet IP version 6 Record +// ************************************************** + +// 0 15 31 +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | Length | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | Protocol | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | Source IPv4 | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | Destination IPv4 | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | Source Port | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | Destionation Port | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | TCP Flags | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | Priority | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +type SFlowIpv6Record struct { + // The length of the IP packet excluding ower layer encapsulations + Length uint32 + // IP Protocol type (for example, TCP = 6, UDP = 17) + Protocol uint32 + // Source IP Address + IPSrc net.IP + // Destination IP Address + IPDst net.IP + // TCP/UDP source port number or equivalent + PortSrc uint32 + // TCP/UDP destination port number or equivalent + PortDst uint32 + // TCP flags + TCPFlags uint32 + // IP priority + Priority uint32 +} + +func decodeSFlowIpv6Record(data *[]byte) (SFlowIpv6Record, error) { + si := SFlowIpv6Record{} + + *data, si.Length = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, si.Protocol = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, si.IPSrc = (*data)[16:], net.IP((*data)[:16]) + *data, si.IPDst = (*data)[16:], net.IP((*data)[:16]) + *data, si.PortSrc = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, si.PortDst = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, si.TCPFlags = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, si.Priority = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + + return si, nil +} + +// ************************************************** +// Extended IPv4 Tunnel Egress +// ************************************************** + +// 0 15 31 +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | 20 bit Interprise (0) |12 bit format | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | record length | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// / Packet IP version 4 Record / +// / / +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +type SFlowExtendedIpv4TunnelEgressRecord struct { + SFlowBaseFlowRecord + SFlowIpv4Record SFlowIpv4Record +} + +func decodeExtendedIpv4TunnelEgress(data *[]byte) (SFlowExtendedIpv4TunnelEgressRecord, error) { + rec := SFlowExtendedIpv4TunnelEgressRecord{} + var fdf SFlowFlowDataFormat + + *data, fdf = (*data)[4:], SFlowFlowDataFormat(binary.BigEndian.Uint32((*data)[:4])) + rec.EnterpriseID, rec.Format = fdf.decode() + *data, rec.FlowDataLength = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + rec.SFlowIpv4Record, _ = decodeSFlowIpv4Record(data) + + return rec, nil +} + +// ************************************************** +// Extended IPv4 Tunnel Ingress +// ************************************************** + +// 0 15 31 +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | 20 bit Interprise (0) |12 bit format | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | record length | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// / Packet IP version 4 Record / +// / / +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +type SFlowExtendedIpv4TunnelIngressRecord struct { + SFlowBaseFlowRecord + SFlowIpv4Record SFlowIpv4Record +} + +func decodeExtendedIpv4TunnelIngress(data *[]byte) (SFlowExtendedIpv4TunnelIngressRecord, error) { + rec := SFlowExtendedIpv4TunnelIngressRecord{} + var fdf SFlowFlowDataFormat + + *data, fdf = (*data)[4:], SFlowFlowDataFormat(binary.BigEndian.Uint32((*data)[:4])) + rec.EnterpriseID, rec.Format = fdf.decode() + *data, rec.FlowDataLength = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + rec.SFlowIpv4Record, _ = decodeSFlowIpv4Record(data) + + return rec, nil +} + +// ************************************************** +// Extended IPv6 Tunnel Egress +// ************************************************** + +// 0 15 31 +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | 20 bit Interprise (0) |12 bit format | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | record length | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// / Packet IP version 6 Record / +// / / +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +type SFlowExtendedIpv6TunnelEgressRecord struct { + SFlowBaseFlowRecord + SFlowIpv6Record +} + +func decodeExtendedIpv6TunnelEgress(data *[]byte) (SFlowExtendedIpv6TunnelEgressRecord, error) { + rec := SFlowExtendedIpv6TunnelEgressRecord{} + var fdf SFlowFlowDataFormat + + *data, fdf = (*data)[4:], SFlowFlowDataFormat(binary.BigEndian.Uint32((*data)[:4])) + rec.EnterpriseID, rec.Format = fdf.decode() + *data, rec.FlowDataLength = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + rec.SFlowIpv6Record, _ = decodeSFlowIpv6Record(data) + + return rec, nil +} + +// ************************************************** +// Extended IPv6 Tunnel Ingress +// ************************************************** + +// 0 15 31 +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | 20 bit Interprise (0) |12 bit format | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | record length | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// / Packet IP version 6 Record / +// / / +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +type SFlowExtendedIpv6TunnelIngressRecord struct { + SFlowBaseFlowRecord + SFlowIpv6Record +} + +func decodeExtendedIpv6TunnelIngress(data *[]byte) (SFlowExtendedIpv6TunnelIngressRecord, error) { + rec := SFlowExtendedIpv6TunnelIngressRecord{} + var fdf SFlowFlowDataFormat + + *data, fdf = (*data)[4:], SFlowFlowDataFormat(binary.BigEndian.Uint32((*data)[:4])) + rec.EnterpriseID, rec.Format = fdf.decode() + *data, rec.FlowDataLength = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + rec.SFlowIpv6Record, _ = decodeSFlowIpv6Record(data) + + return rec, nil +} + +// ************************************************** +// Extended Decapsulate Egress +// ************************************************** + +// 0 15 31 +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | 20 bit Interprise (0) |12 bit format | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | record length | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | Inner Header Offset | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +type SFlowExtendedDecapsulateEgressRecord struct { + SFlowBaseFlowRecord + InnerHeaderOffset uint32 +} + +func decodeExtendedDecapsulateEgress(data *[]byte) (SFlowExtendedDecapsulateEgressRecord, error) { + rec := SFlowExtendedDecapsulateEgressRecord{} + var fdf SFlowFlowDataFormat + + *data, fdf = (*data)[4:], SFlowFlowDataFormat(binary.BigEndian.Uint32((*data)[:4])) + rec.EnterpriseID, rec.Format = fdf.decode() + *data, rec.FlowDataLength = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, rec.InnerHeaderOffset = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + + return rec, nil +} + +// ************************************************** +// Extended Decapsulate Ingress +// ************************************************** + +// 0 15 31 +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | 20 bit Interprise (0) |12 bit format | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | record length | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | Inner Header Offset | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +type SFlowExtendedDecapsulateIngressRecord struct { + SFlowBaseFlowRecord + InnerHeaderOffset uint32 +} + +func decodeExtendedDecapsulateIngress(data *[]byte) (SFlowExtendedDecapsulateIngressRecord, error) { + rec := SFlowExtendedDecapsulateIngressRecord{} + var fdf SFlowFlowDataFormat + + *data, fdf = (*data)[4:], SFlowFlowDataFormat(binary.BigEndian.Uint32((*data)[:4])) + rec.EnterpriseID, rec.Format = fdf.decode() + *data, rec.FlowDataLength = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, rec.InnerHeaderOffset = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + + return rec, nil +} + +// ************************************************** +// Extended VNI Egress +// ************************************************** + +// 0 15 31 +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | 20 bit Interprise (0) |12 bit format | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | record length | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | VNI | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +type SFlowExtendedVniEgressRecord struct { + SFlowBaseFlowRecord + VNI uint32 +} + +func decodeExtendedVniEgress(data *[]byte) (SFlowExtendedVniEgressRecord, error) { + rec := SFlowExtendedVniEgressRecord{} + var fdf SFlowFlowDataFormat + + *data, fdf = (*data)[4:], SFlowFlowDataFormat(binary.BigEndian.Uint32((*data)[:4])) + rec.EnterpriseID, rec.Format = fdf.decode() + *data, rec.FlowDataLength = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, rec.VNI = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + + return rec, nil +} + +// ************************************************** +// Extended VNI Ingress +// ************************************************** + +// 0 15 31 +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | 20 bit Interprise (0) |12 bit format | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | record length | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | VNI | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +type SFlowExtendedVniIngressRecord struct { + SFlowBaseFlowRecord + VNI uint32 +} + +func decodeExtendedVniIngress(data *[]byte) (SFlowExtendedVniIngressRecord, error) { + rec := SFlowExtendedVniIngressRecord{} + var fdf SFlowFlowDataFormat + + *data, fdf = (*data)[4:], SFlowFlowDataFormat(binary.BigEndian.Uint32((*data)[:4])) + rec.EnterpriseID, rec.Format = fdf.decode() + *data, rec.FlowDataLength = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, rec.VNI = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + + return rec, nil +} + +// ************************************************** +// Counter Record +// ************************************************** + +// 0 15 31 +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | 20 bit Interprise (0) |12 bit format | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | counter length | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// / counter data / +// / / +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + +type SFlowBaseCounterRecord struct { + EnterpriseID SFlowEnterpriseID + Format SFlowCounterRecordType + FlowDataLength uint32 +} + +func (bcr SFlowBaseCounterRecord) GetType() SFlowCounterRecordType { + switch bcr.Format { + case SFlowTypeGenericInterfaceCounters: + return SFlowTypeGenericInterfaceCounters + case SFlowTypeEthernetInterfaceCounters: + return SFlowTypeEthernetInterfaceCounters + case SFlowTypeTokenRingInterfaceCounters: + return SFlowTypeTokenRingInterfaceCounters + case SFlowType100BaseVGInterfaceCounters: + return SFlowType100BaseVGInterfaceCounters + case SFlowTypeVLANCounters: + return SFlowTypeVLANCounters + case SFlowTypeProcessorCounters: + return SFlowTypeProcessorCounters + + } + unrecognized := fmt.Sprint("Unrecognized counter record type:", bcr.Format) + panic(unrecognized) +} + +// ************************************************** +// Counter Record +// ************************************************** + +// 0 15 31 +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | 20 bit Interprise (0) |12 bit format | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | counter length | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | IfIndex | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | IfType | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | IfSpeed | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | IfDirection | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | IfStatus | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | IFInOctets | +// | | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | IfInUcastPkts | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | IfInMulticastPkts | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | IfInBroadcastPkts | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | IfInDiscards | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | InInErrors | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | IfInUnknownProtos | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | IfOutOctets | +// | | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | IfOutUcastPkts | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | IfOutMulticastPkts | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | IfOutBroadcastPkts | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | IfOutDiscards | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | IfOUtErrors | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | IfPromiscouousMode | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + +type SFlowGenericInterfaceCounters struct { + SFlowBaseCounterRecord + IfIndex uint32 + IfType uint32 + IfSpeed uint64 + IfDirection uint32 + IfStatus uint32 + IfInOctets uint64 + IfInUcastPkts uint32 + IfInMulticastPkts uint32 + IfInBroadcastPkts uint32 + IfInDiscards uint32 + IfInErrors uint32 + IfInUnknownProtos uint32 + IfOutOctets uint64 + IfOutUcastPkts uint32 + IfOutMulticastPkts uint32 + IfOutBroadcastPkts uint32 + IfOutDiscards uint32 + IfOutErrors uint32 + IfPromiscuousMode uint32 +} + +func decodeGenericInterfaceCounters(data *[]byte) (SFlowGenericInterfaceCounters, error) { + gic := SFlowGenericInterfaceCounters{} + var cdf SFlowCounterDataFormat + + *data, cdf = (*data)[4:], SFlowCounterDataFormat(binary.BigEndian.Uint32((*data)[:4])) + gic.EnterpriseID, gic.Format = cdf.decode() + *data, gic.FlowDataLength = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, gic.IfIndex = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, gic.IfType = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, gic.IfSpeed = (*data)[8:], binary.BigEndian.Uint64((*data)[:8]) + *data, gic.IfDirection = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, gic.IfStatus = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, gic.IfInOctets = (*data)[8:], binary.BigEndian.Uint64((*data)[:8]) + *data, gic.IfInUcastPkts = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, gic.IfInMulticastPkts = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, gic.IfInBroadcastPkts = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, gic.IfInDiscards = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, gic.IfInErrors = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, gic.IfInUnknownProtos = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, gic.IfOutOctets = (*data)[8:], binary.BigEndian.Uint64((*data)[:8]) + *data, gic.IfOutUcastPkts = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, gic.IfOutMulticastPkts = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, gic.IfOutBroadcastPkts = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, gic.IfOutDiscards = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, gic.IfOutErrors = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, gic.IfPromiscuousMode = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + return gic, nil +} + +// ************************************************** +// Counter Record +// ************************************************** + +// 0 15 31 +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | 20 bit Interprise (0) |12 bit format | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | counter length | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// / counter data / +// / / +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + +type SFlowEthernetCounters struct { + SFlowBaseCounterRecord + AlignmentErrors uint32 + FCSErrors uint32 + SingleCollisionFrames uint32 + MultipleCollisionFrames uint32 + SQETestErrors uint32 + DeferredTransmissions uint32 + LateCollisions uint32 + ExcessiveCollisions uint32 + InternalMacTransmitErrors uint32 + CarrierSenseErrors uint32 + FrameTooLongs uint32 + InternalMacReceiveErrors uint32 + SymbolErrors uint32 +} + +func decodeEthernetCounters(data *[]byte) (SFlowEthernetCounters, error) { + ec := SFlowEthernetCounters{} + var cdf SFlowCounterDataFormat + + *data, cdf = (*data)[4:], SFlowCounterDataFormat(binary.BigEndian.Uint32((*data)[:4])) + ec.EnterpriseID, ec.Format = cdf.decode() + *data, ec.FlowDataLength = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, ec.AlignmentErrors = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, ec.FCSErrors = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, ec.SingleCollisionFrames = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, ec.MultipleCollisionFrames = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, ec.SQETestErrors = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, ec.DeferredTransmissions = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, ec.LateCollisions = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, ec.ExcessiveCollisions = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, ec.InternalMacTransmitErrors = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, ec.CarrierSenseErrors = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, ec.FrameTooLongs = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, ec.InternalMacReceiveErrors = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, ec.SymbolErrors = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + return ec, nil +} + +// ************************************************** +// Processor Counter Record +// ************************************************** +// 0 15 31 +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | 20 bit Interprise (0) |12 bit format | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | counter length | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | FiveSecCpu | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | OneMinCpu | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | GiveMinCpu | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | TotalMemory | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +// | FreeMemory | +// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + +type SFlowProcessorCounters struct { + SFlowBaseCounterRecord + FiveSecCpu uint32 // 5 second average CPU utilization + OneMinCpu uint32 // 1 minute average CPU utilization + FiveMinCpu uint32 // 5 minute average CPU utilization + TotalMemory uint64 // total memory (in bytes) + FreeMemory uint64 // free memory (in bytes) +} + +func decodeProcessorCounters(data *[]byte) (SFlowProcessorCounters, error) { + pc := SFlowProcessorCounters{} + var cdf SFlowCounterDataFormat + var high32, low32 uint32 + + *data, cdf = (*data)[4:], SFlowCounterDataFormat(binary.BigEndian.Uint32((*data)[:4])) + pc.EnterpriseID, pc.Format = cdf.decode() + *data, pc.FlowDataLength = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + + *data, pc.FiveSecCpu = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, pc.OneMinCpu = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, pc.FiveMinCpu = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, high32 = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, low32 = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + pc.TotalMemory = (uint64(high32) << 32) + uint64(low32) + *data, high32 = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + *data, low32 = (*data)[4:], binary.BigEndian.Uint32((*data)[:4]) + pc.FreeMemory = (uint64(high32)) + uint64(low32) + + return pc, nil +} diff --git a/vendor/github.com/google/gopacket/layers/sflow_test.go b/vendor/github.com/google/gopacket/layers/sflow_test.go new file mode 100644 index 0000000..ca0f2ab --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/sflow_test.go @@ -0,0 +1,1246 @@ +// Copyright 2014 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 layers + +import ( + "github.com/google/gopacket" + "net" + "reflect" + "testing" +) + +// Test packet collected from live network. See the test below for contents +var SFlowTestPacket1 = []byte{ + 0x84, 0x2b, 0x2b, 0x16, 0x8b, 0x62, 0xf0, 0x50, 0x56, 0x85, 0x3a, 0xfd, 0x08, 0x00, 0x45, 0x00, + 0x05, 0xbc, 0x9c, 0x04, 0x40, 0x00, 0xff, 0x11, 0xc7, 0x00, 0x0a, 0x01, 0xff, 0x0e, 0x0a, 0x01, + 0x00, 0x1b, 0xc7, 0x57, 0x18, 0xc7, 0x05, 0xa8, 0x22, 0x3b, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, + 0x00, 0x01, 0x0a, 0x01, 0xf8, 0x16, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x9d, 0xfb, 0x40, 0x49, + 0xc6, 0xcd, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x26, + 0x27, 0xe8, 0x00, 0x00, 0x02, 0x13, 0x00, 0x00, 0x3e, 0x80, 0x50, 0xbd, 0xe5, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x05, 0xd2, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0x3c, 0x8a, 0xb0, 0xe7, 0x54, 0x41, 0xb8, 0xca, 0x3a, 0x6d, + 0xf0, 0x40, 0x08, 0x00, 0x45, 0x00, 0x05, 0xc0, 0x6b, 0xaa, 0x40, 0x00, 0x40, 0x06, 0x8f, 0x41, + 0x0a, 0x01, 0x0e, 0x16, 0x36, 0xf0, 0xeb, 0x45, 0x76, 0xfd, 0x00, 0x50, 0xca, 0x77, 0xef, 0x96, + 0xfc, 0x28, 0x63, 0x40, 0x50, 0x10, 0x00, 0x3c, 0x64, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0xf4, 0x00, 0x00, 0x02, 0x77, 0x00, 0x00, 0x00, 0xfd, 0x3b, 0x8c, 0xe7, 0x04, 0x4a, 0x2d, 0xb2, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x48, 0xcc, 0x11, 0x0d, 0xe3, 0x00, + 0x26, 0x85, 0x30, 0x00, 0x00, 0x07, 0x66, 0x00, 0x02, 0xd0, 0x8a, 0x00, 0x02, 0xce, 0xf0, 0x00, + 0x29, 0x7e, 0x80, 0x00, 0x02, 0xd0, 0x98, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x26, 0x85, 0x30, 0x00, + 0x00, 0x00, 0xf4, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0xe9, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0xd0, 0x01, 0x5e, 0x5c, 0x1e, 0x00, 0x00, 0x02, 0x57, 0x00, 0x00, + 0x07, 0xd0, 0xb1, 0x2f, 0xa2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x57, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x05, 0xee, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0x3c, 0x8a, + 0xb0, 0xe7, 0x54, 0x41, 0xb8, 0xca, 0x3a, 0x6f, 0xbe, 0xd8, 0x08, 0x00, 0x45, 0x00, 0x05, 0xdc, + 0x9f, 0xfd, 0x40, 0x00, 0x40, 0x06, 0x6a, 0xfa, 0x0a, 0x01, 0x0e, 0x10, 0x0a, 0x01, 0x08, 0x13, + 0x23, 0x84, 0xb7, 0x22, 0x8a, 0xc9, 0x50, 0xb5, 0x4e, 0x10, 0x2a, 0x87, 0x80, 0x10, 0x06, 0x01, + 0x10, 0xa6, 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0xef, 0x1f, 0xf4, 0x07, 0x99, 0x3a, 0xd8, 0x5b, + 0x01, 0x46, 0x09, 0x00, 0x0c, 0x00, 0x0c, 0x3c, 0xac, 0x4a, 0x1b, 0x06, 0x04, 0x78, 0x78, 0x4e, + 0xc2, 0x05, 0x46, 0x43, 0x06, 0x04, 0x78, 0x78, 0xee, 0x9c, 0x00, 0x41, 0xef, 0x05, 0x81, 0x32, + 0x1b, 0x06, 0x04, 0x78, 0x78, 0x56, 0x72, 0x05, 0x4e, 0x92, 0x00, 0x96, 0x39, 0x00, 0xea, 0x3f, + 0x01, 0x15, 0xa3, 0x08, 0x04, 0x42, 0x6a, 0x82, 0x87, 0x08, 0x05, 0xcc, 0x00, 0x04, 0x00, 0x00, + 0x03, 0xe9, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xd0, 0x01, 0x5a, + 0xcd, 0xd0, 0x00, 0x00, 0x02, 0x55, 0x00, 0x00, 0x07, 0xd0, 0x95, 0x67, 0xe1, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x46, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0x3c, 0x8a, 0xb0, 0xe7, 0x54, 0x41, 0xb8, 0xca, 0x3a, 0x6f, + 0x11, 0x28, 0x08, 0x00, 0x45, 0x00, 0x04, 0x34, 0xdb, 0x36, 0x40, 0x00, 0x40, 0x06, 0x38, 0xac, + 0x0a, 0x01, 0x0e, 0x11, 0x0a, 0x01, 0x00, 0xcf, 0x23, 0x84, 0xa0, 0x3f, 0x3c, 0xce, 0xd5, 0x4a, + 0x72, 0x0b, 0x5d, 0x1a, 0x80, 0x10, 0x06, 0x01, 0x8a, 0x50, 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, + 0xef, 0x1f, 0xa2, 0xba, 0xe6, 0xfa, 0xae, 0xb3, 0xfe, 0xcf, 0x00, 0x19, 0xcf, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0xb9, 0x79, 0xdd, 0x42, 0x00, 0x00, 0x02, 0x84, 0x9b, 0xa9, 0x02, 0xe2, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x32, 0x39, 0x35, 0x34, 0x33, 0x36, 0x00, 0x00, 0x02, 0x70, 0xcd, + 0x16, 0x40, 0xa6, 0x98, 0x88, 0x24, 0x06, 0x50, 0xb0, 0xf4, 0xee, 0x03, 0xa6, 0xfa, 0x87, 0xaf, + 0xc1, 0x99, 0x52, 0x0d, 0x07, 0xa8, 0x00, 0x00, 0x03, 0xe9, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x20, 0xf2, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x02, 0x54, 0x0b, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x01, 0x29, 0x82, 0x6d, 0xb0, 0x6c, 0x0b, 0xcb, 0x0d, 0xdd, 0x96, 0x00, 0x06, + 0xa8, 0xc6, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x34, 0x02, 0x35, 0x58, 0x7c, 0x9e, 0x56, 0x64, 0x25, 0x71, 0x00, 0x70, + 0x5a, 0xc4, 0x00, 0x09, 0x08, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0xd0, 0x01, 0x5e, 0x5c, 0x1f, 0x00, 0x00, 0x02, 0x57, 0x00, 0x00, + 0x07, 0xd0, 0xb1, 0x2f, 0xaa, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x57, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x05, 0xee, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0x3c, 0x8a, + 0xb0, 0xe7, 0x54, 0x41, 0xb8, 0xca, 0x3a, 0x6f, 0xbe, 0xd8, 0x08, 0x00, 0x45, 0x00, 0x05, 0xdc, + 0x0f, 0xba, 0x40, 0x00, 0x40, 0x06, 0xf4, 0x3f, 0x0a, 0x01, 0x0e, 0x10, 0x0a, 0x01, 0x0f, 0x11, + 0x23, 0x84, 0xcd, 0xc0, 0xf4, 0x0e, 0x90, 0x23, 0xd7, 0x32, 0x8b, 0x31, 0x80, 0x10, 0x00, 0x1d, + 0x6b, 0x12, 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0xef, 0x1f, 0xf4, 0x28, 0xef, 0x1f, 0xec, 0x76, + 0xaa, 0x25, 0x01, 0x04, 0xc0, 0xac, 0xfe, 0x25, 0x01, 0x8e, 0x25, 0x01, 0x16, 0xc7, 0x28, 0xfe, + 0x7e, 0x70, 0xfe, 0x7e, 0x70, 0x52, 0x7e, 0x70, 0x15, 0x9b, 0xfe, 0x35, 0x01, 0xfe, 0x35, 0x01, + 0x42, 0x35, 0x01, 0xfe, 0x95, 0x77, 0xfe, 0x95, 0x77, 0xfe, 0x95, 0x77, 0x52, 0x95, 0x77, 0x00, + 0xd2, 0xfe, 0x70, 0x02, 0x92, 0x70, 0x02, 0x16, 0x60, 0x22, 0x00, 0x7e, 0xb2, 0x15, 0x00, 0x00, + 0x03, 0xe9, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xd0, 0x01, 0x5a, + 0xcd, 0xd1, 0x00, 0x00, 0x02, 0x55, 0x00, 0x00, 0x07, 0xd0, 0x95, 0x67, 0xe9, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x55, 0x00, 0x00, 0x02, 0x57, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x05, 0xee, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0xb8, 0xca, 0x3a, 0x6f, 0xbe, 0xd8, 0xb8, 0xca, 0x3a, 0x6f, + 0x11, 0x28, 0x08, 0x00, 0x45, 0x00, 0x05, 0xdc, 0xfe, 0x05, 0x40, 0x00, 0x40, 0x06, 0x06, 0xf4, + 0x0a, 0x01, 0x0e, 0x11, 0x0a, 0x01, 0x0e, 0x10, 0x23, 0x84, 0xfa, 0x29, 0xae, 0xd4, 0x95, 0x03, + 0x99, 0xb8, 0x77, 0xd0, 0x80, 0x10, 0x00, 0x1d, 0x6f, 0x4f, 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, + 0xef, 0x1f, 0xa2, 0xcc, 0xef, 0x1f, 0xf4, 0x2c, 0xfe, 0xdb, 0x05, 0xa1, 0xdb, 0x04, 0x9e, 0xc0, + 0xfe, 0x30, 0x08, 0xb2, 0x30, 0x08, 0xda, 0x2b, 0xbd, 0xfe, 0x2a, 0x01, 0xfe, 0x2a, 0x01, 0x21, + 0x2a, 0x00, 0xb2, 0xfe, 0x57, 0xb0, 0xb6, 0x57, 0xb0, 0x14, 0x74, 0xf4, 0xf0, 0x4c, 0x05, 0x68, + 0xfe, 0x54, 0x02, 0xfe, 0x54, 0x02, 0xd2, 0x54, 0x02, 0x00, 0xbe, 0xfe, 0x32, 0x0f, 0xb6, 0x32, + 0x0f, 0x14, 0x2e, 0x16, 0xaf, 0x47, 0x00, 0x00, 0x03, 0xe9, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x94, 0x01, 0x5e, 0x5c, 0x20, 0x00, 0x00, 0x02, 0x57, 0x00, 0x00, + 0x07, 0xd0, 0xb1, 0x2f, 0xb2, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x57, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x42, 0x3c, 0x8a, + 0xb0, 0xe7, 0x54, 0x41, 0xb8, 0xca, 0x3a, 0x6f, 0xbe, 0xd8, 0x08, 0x00, 0x45, 0x00, 0x00, 0x34, + 0xa8, 0x23, 0x40, 0x00, 0x40, 0x06, 0x61, 0x7f, 0x0a, 0x01, 0x0e, 0x10, 0x0a, 0x01, 0x0f, 0x10, + 0x97, 0x91, 0x23, 0x84, 0x24, 0xfa, 0x91, 0xf7, 0xb4, 0xe8, 0xf3, 0x2d, 0x80, 0x10, 0x00, 0xab, + 0x7b, 0x7d, 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0xef, 0x1f, 0xf4, 0x36, 0xef, 0x1f, 0xdc, 0xde, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xe9, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +} + +// Test collected from the SFlow reference agent. Contains dummy data for several record types +// that wern't available on an actual network for sampling. +var SFlowTestPacket2 = []byte{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, + 0x04, 0x88, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 0x38, 0x63, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00, + 0x00, 0x01, 0xdc, 0xb8, 0x18, 0xc7, 0x04, 0x74, 0x02, 0x88, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, + 0x00, 0x01, 0xc0, 0xa8, 0x5b, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x3a, 0x00, 0x00, + 0xcb, 0x20, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x54, 0x00, 0x02, + 0x1f, 0x6e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x1f, 0x6e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x3f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x03, 0xed, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x6f, + 0x72, 0x67, 0x00, 0x00, 0x00, 0x0f, 0x68, 0x6f, 0x73, 0x74, 0x31, 0x2e, 0x73, 0x66, 0x6c, 0x6f, + 0x77, 0x2e, 0x6f, 0x72, 0x67, 0x06, 0x00, 0x00, 0x03, 0xec, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, + 0x00, 0x6a, 0x00, 0x00, 0x00, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x75, 0x73, 0x65, + 0x72, 0xdc, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x10, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x73, 0x65, 0x72, 0x00, 0x00, 0x03, 0xeb, 0x00, 0x00, + 0x00, 0x64, 0x00, 0x00, 0x00, 0x01, 0x0d, 0x0c, 0x0b, 0x0a, 0x00, 0x00, 0xfd, 0xe9, 0x00, 0x00, + 0x00, 0x7b, 0x00, 0x00, 0x03, 0xe7, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x00, 0x01, 0xc8, 0x00, 0x00, 0x03, 0x15, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x2b, 0x67, 0x00, 0x00, 0x56, 0xce, 0x00, 0x00, + 0x82, 0x35, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x09, 0x00, 0x00, + 0x03, 0x78, 0x00, 0x00, 0x03, 0xe7, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, + 0x00, 0x0d, 0x00, 0x00, 0x01, 0xb0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x42, 0x00, 0x0c, + 0x29, 0x67, 0xa0, 0xe5, 0x00, 0x50, 0x56, 0xc0, 0x00, 0x09, 0x08, 0x00, 0x45, 0x10, 0x00, 0x34, + 0x92, 0xc3, 0x40, 0x00, 0x40, 0x06, 0x70, 0x8d, 0xc0, 0xa8, 0x5b, 0x01, 0xc0, 0xa8, 0x5b, 0x11, + 0xd3, 0xdd, 0x00, 0x16, 0xe3, 0x2e, 0x84, 0x77, 0x13, 0x6d, 0xc5, 0x53, 0x80, 0x10, 0x1f, 0xf7, + 0xe7, 0x7d, 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0x2e, 0xc6, 0x70, 0x3a, 0x00, 0x0f, 0x84, 0x7a, + 0xbc, 0xd2, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x90, 0x00, 0x02, 0x1f, 0x6f, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x1f, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xed, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x6f, 0x72, 0x67, 0x00, 0x00, + 0x00, 0x0f, 0x68, 0x6f, 0x73, 0x74, 0x31, 0x2e, 0x73, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x6f, 0x72, + 0x67, 0x03, 0x00, 0x00, 0x03, 0xec, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, + 0x00, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x77, 0x00, 0x00, + 0x00, 0x6a, 0x00, 0x00, 0x00, 0x10, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x75, 0x73, 0x65, 0x72, 0x00, 0x00, 0x03, 0xeb, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, + 0x00, 0x01, 0x0d, 0x0c, 0x0b, 0x0a, 0x00, 0x00, 0xfd, 0xe9, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x00, + 0x03, 0xe7, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x7b, 0x00, 0x00, 0x01, 0xc8, 0x00, 0x00, 0x03, 0x15, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x2b, 0x67, 0x00, 0x00, 0x56, 0xce, 0x00, 0x00, 0x82, 0x35, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x09, 0x00, 0x00, 0x03, 0x78, 0x00, 0x00, + 0x03, 0xe7, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, + 0x01, 0xb0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x01, 0x86, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0x00, 0x50, 0x56, 0xc0, 0x00, 0x09, + 0x00, 0x0c, 0x29, 0x67, 0xa0, 0xe5, 0x08, 0x00, 0x45, 0x10, 0x01, 0x74, 0xbb, 0xfa, 0x40, 0x00, + 0x40, 0x06, 0x46, 0x16, 0xc0, 0xa8, 0x5b, 0x11, 0xc0, 0xa8, 0x5b, 0x01, 0x00, 0x16, 0xd3, 0xdd, + 0x13, 0x6d, 0xc5, 0x53, 0xe3, 0x2e, 0x84, 0x77, 0x80, 0x18, 0x01, 0x10, 0x38, 0xca, 0x00, 0x00, + 0x01, 0x01, 0x08, 0x0a, 0x00, 0x0f, 0x84, 0x7d, 0x2e, 0xc6, 0x70, 0x3a, 0xe3, 0x92, 0x97, 0x1a, + 0x67, 0x3b, 0xac, 0xec, 0xfa, 0x43, 0x71, 0x5e, 0x36, 0xa1, 0x0a, 0xc6, 0x1a, 0x6a, 0xed, 0x08, + 0xac, 0xf4, 0xbe, 0xd8, 0x36, 0x59, 0xf6, 0xe2, 0x3d, 0x34, 0x26, 0xf2, 0x42, 0xbd, 0x32, 0xd3, + 0x37, 0x52, 0xb8, 0xf4, 0x38, 0xf0, 0xf4, 0xeb, 0x76, 0x3b, 0xda, 0x23, 0xf1, 0x92, 0x96, 0xca, + 0xbb, 0x9c, 0x20, 0x0a, 0x38, 0x37, 0x6f, 0xd9, 0x26, 0xe6, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x01, 0x54, 0x00, 0x02, 0x1f, 0x70, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, + 0x1f, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x3f, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x03, 0xed, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x14, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x66, 0x6c, + 0x6f, 0x77, 0x2e, 0x6f, 0x72, 0x67, 0x00, 0x00, 0x00, 0x0f, 0x68, 0x6f, 0x73, 0x74, 0x31, 0x2e, + 0x73, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x6f, 0x72, 0x67, 0xff, 0x00, 0x00, 0x03, 0xec, 0x00, 0x00, + 0x00, 0x2c, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x20, 0x75, 0x73, 0x65, 0x72, 0x77, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x10, 0x64, 0x65, + 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x73, 0x65, 0x72, 0x00, 0x00, + 0x03, 0xeb, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x01, 0x0d, 0x0c, 0x0b, 0x0a, 0x00, 0x00, + 0xfd, 0xe9, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x00, 0x03, 0xe7, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x00, 0x01, 0xc8, 0x00, 0x00, + 0x03, 0x15, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x2b, 0x67, 0x00, 0x00, + 0x56, 0xce, 0x00, 0x00, 0x82, 0x35, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x03, 0x09, 0x00, 0x00, 0x03, 0x78, 0x00, 0x00, 0x03, 0xe7, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x01, 0xb0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x42, 0x00, 0x0c, 0x29, 0x67, 0xa0, 0xe5, 0x00, 0x50, 0x56, 0xc0, 0x00, 0x09, 0x08, 0x00, + 0x45, 0x10, 0x00, 0x34, 0x65, 0x7d, 0x40, 0x00, 0x40, 0x06, 0x9d, 0xd3, 0xc0, 0xa8, 0x5b, 0x01, + 0xc0, 0xa8, 0x5b, 0x11, 0xd3, 0xdd, 0x00, 0x16, 0xe3, 0x2e, 0x84, 0x77, 0x13, 0x6d, 0xc6, 0x93, + 0x80, 0x10, 0x1f, 0xec, 0xe6, 0x43, 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0x2e, 0xc6, 0x70, 0x3c, + 0x00, 0x0f, 0x84, 0x7d, 0x00, 0x50, +} + +// processor counter sample +var SFlowTestPacket3 = []byte{ + 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, + 0x0a, 0x14, 0x04, 0x00, 0x00, 0x00, 0x00, 0x64, + 0x00, 0x01, 0x78, 0xe0, 0x73, 0x03, 0x48, 0x78, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x34, 0x00, 0x01, 0x78, 0xe0, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xe9, + 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x05, 0xaa, + 0x00, 0x00, 0x05, 0x5a, 0x00, 0x00, 0x05, 0x32, + 0x00, 0x00, 0x00, 0x00, 0xe7, 0x8d, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x55, 0xe7, 0x70, 0x00, +} + +// expanded flow sample - extended switch flow record +var SFlowTestPacket4 = []byte{ + 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, + 0xc0, 0xa8, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x7e, 0x32, 0xe0, 0xe4, 0x7c, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x01, 0x23, + 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x03, 0x37, 0x00, 0x00, 0x56, 0x23, + 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xe9, + 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x05, + 0xff, 0xff, 0xff, 0xff, +} + +// expanded flow sample - extended router flow record +var SFlowTestPacket5 = []byte{ + 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, + 0xc0, 0xa8, 0x01, 0x12, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x7e, 0x32, 0xe0, 0xe4, 0x7c, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x01, 0x23, + 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x03, 0x34, 0x00, 0x00, 0x56, 0x02, + 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xea, + 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, + 0xc0, 0xa8, 0x01, 0x21, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, +} + +// expanded flow sample - Ipv4 Tunnel Ingress record +var SFlowTestPacket6 = []byte{ + 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x7f, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x00, 0x01, 0xbd, 0x50, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x48, + 0x00, 0x00, 0x00, 0x74, 0x02, 0x00, 0x03, 0xe8, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, + 0xc0, 0xa8, 0x00, 0x54, 0xc0, 0xa8, 0x00, 0x53, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +} + +// expanded flow sample - Ipv4 Tunnel Egress record +var SFlowTestPacket7 = []byte{ + 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x7f, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x42, 0x68, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x48, + 0x00, 0x00, 0x00, 0x12, 0x02, 0x00, 0x03, 0xe9, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, + 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x03, 0xff, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xa8, 0x00, 0x54, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, +} + +// expanded flow sample - extended router flow record IPv6 next hop +var SFlowTestPacket8 = []byte{ + 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, + 0xc0, 0xa8, 0x01, 0x12, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x7e, 0x32, 0xe0, 0xe4, 0x7c, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x01, 0x23, + 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x03, 0x34, 0x00, 0x00, 0x56, 0x02, + 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xea, + 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x02, + 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, +} + +func TestDecodeUDPSFlow(t *testing.T) { + p := gopacket.NewPacket(SFlowTestPacket1, LayerTypeEthernet, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeEthernet, LayerTypeIPv4, LayerTypeUDP, LayerTypeSFlow}, t) + if got, ok := p.TransportLayer().(*UDP); ok { + want := &UDP{ + BaseLayer: BaseLayer{SFlowTestPacket1[34:42], SFlowTestPacket1[42:]}, + sPort: []byte{199, 87}, + dPort: []byte{24, 199}, + SrcPort: 51031, + DstPort: 6343, + Checksum: 8763, + Length: 1448, + } + if !reflect.DeepEqual(want, got) { + t.Errorf("UDP layer mismatch, \nwant %#v\ngot %#v\n", want, got) + } + } else { + t.Error("Transport layer packet not UDP") + } +} + +func TestDecodeSFlowDatagram(t *testing.T) { + p := gopacket.NewPacket(SFlowTestPacket1, LayerTypeEthernet, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeEthernet, LayerTypeIPv4, LayerTypeUDP, LayerTypeSFlow}, t) + if got, ok := p.ApplicationLayer().(*SFlowDatagram); ok { + want := &SFlowDatagram{ + DatagramVersion: uint32(5), + AgentAddress: []byte{0xa, 0x1, 0xf8, 0x16}, + SubAgentID: uint32(17), + SequenceNumber: uint32(40443), + AgentUptime: uint32(1078576845), + SampleCount: uint32(7), + FlowSamples: []SFlowFlowSample{ + SFlowFlowSample{ + EnterpriseID: 0x0, + Format: 0x1, + SampleLength: 0xd0, + SequenceNumber: 0x2627e8, + SourceIDClass: 0x0, + SourceIDIndex: 0x213, + SamplingRate: 0x3e80, + SamplePool: 0x50bde580, + Dropped: 0x0, + InputInterface: 0x213, + OutputInterface: 0x0, + RecordCount: 0x2, + Records: []SFlowRecord{ + SFlowRawPacketFlowRecord{ + SFlowBaseFlowRecord: SFlowBaseFlowRecord{ + EnterpriseID: 0x0, + Format: 0x1, + FlowDataLength: 0x90, + }, + HeaderProtocol: 0x1, + FrameLength: 0x5d2, + PayloadRemoved: 0x4, + HeaderLength: 0x80, + Header: gopacket.NewPacket(SFlowTestPacket1[134:262], LayerTypeEthernet, gopacket.Default), + }, + SFlowExtendedSwitchFlowRecord{ + SFlowBaseFlowRecord: SFlowBaseFlowRecord{ + EnterpriseID: 0x0, + Format: 0x3e9, + FlowDataLength: 0x10, + }, + IncomingVLAN: 0x202, + IncomingVLANPriority: 0x0, + OutgoingVLAN: 0x0, + OutgoingVLANPriority: 0x0, + }, + }, + }, + SFlowFlowSample{ + EnterpriseID: 0x0, + Format: 0x1, + SampleLength: 0xd0, + SequenceNumber: 0x15e5c1e, + SourceIDClass: 0x0, + SourceIDIndex: 0x257, + SamplingRate: 0x7d0, + SamplePool: 0xb12fa290, + Dropped: 0x0, + InputInterface: 0x257, + OutputInterface: 0x0, + RecordCount: 0x2, + Records: []SFlowRecord{ + SFlowRawPacketFlowRecord{ + SFlowBaseFlowRecord: SFlowBaseFlowRecord{ + EnterpriseID: 0x0, + Format: 0x1, + FlowDataLength: 0x90, + }, + HeaderProtocol: 0x1, + FrameLength: 0x5ee, + PayloadRemoved: 0x4, + HeaderLength: 0x80, + Header: gopacket.NewPacket(SFlowTestPacket1[350:478], LayerTypeEthernet, gopacket.Default), + }, + SFlowExtendedSwitchFlowRecord{ + SFlowBaseFlowRecord: SFlowBaseFlowRecord{ + EnterpriseID: 0x0, + Format: 0x3e9, + FlowDataLength: 0x10, + }, + IncomingVLAN: 0x202, + IncomingVLANPriority: 0x0, + OutgoingVLAN: 0x0, + OutgoingVLANPriority: 0x0, + }, + }, + }, + SFlowFlowSample{ + EnterpriseID: 0x0, + Format: 0x1, + SampleLength: 0xd0, + SequenceNumber: 0x15acdd0, + SourceIDClass: 0x0, + SourceIDIndex: 0x255, + SamplingRate: 0x7d0, + SamplePool: 0x9567e130, + Dropped: 0x0, + InputInterface: 0x255, + OutputInterface: 0x0, + RecordCount: 0x2, + Records: []SFlowRecord{ + SFlowRawPacketFlowRecord{ + SFlowBaseFlowRecord: SFlowBaseFlowRecord{ + EnterpriseID: 0x0, + Format: 0x1, + FlowDataLength: 0x90, + }, + HeaderProtocol: 0x1, + FrameLength: 0x446, + PayloadRemoved: 0x4, + HeaderLength: 0x80, + Header: gopacket.NewPacket(SFlowTestPacket1[566:694], LayerTypeEthernet, gopacket.Default), + }, + SFlowExtendedSwitchFlowRecord{ + SFlowBaseFlowRecord: SFlowBaseFlowRecord{ + EnterpriseID: 0x0, + Format: 0x3e9, + FlowDataLength: 0x10, + }, + IncomingVLAN: 0x202, + IncomingVLANPriority: 0x0, + OutgoingVLAN: 0x0, + OutgoingVLANPriority: 0x0, + }, + }, + }, + SFlowFlowSample{ + EnterpriseID: 0x0, + Format: 0x1, + SampleLength: 0xd0, + SequenceNumber: 0x15e5c1f, + SourceIDClass: 0x0, + SourceIDIndex: 0x257, + SamplingRate: 0x7d0, + SamplePool: 0xb12faa60, + Dropped: 0x0, + InputInterface: 0x257, + OutputInterface: 0x0, + RecordCount: 0x2, + Records: []SFlowRecord{ + SFlowRawPacketFlowRecord{ + SFlowBaseFlowRecord: SFlowBaseFlowRecord{ + EnterpriseID: 0x0, + Format: 0x1, + FlowDataLength: 0x90, + }, + HeaderProtocol: 0x1, + FrameLength: 0x5ee, + PayloadRemoved: 0x4, + HeaderLength: 0x80, + Header: gopacket.NewPacket(SFlowTestPacket1[958:1086], LayerTypeEthernet, gopacket.Default), + }, + SFlowExtendedSwitchFlowRecord{ + SFlowBaseFlowRecord: SFlowBaseFlowRecord{ + EnterpriseID: 0x0, + Format: 0x3e9, + FlowDataLength: 0x10, + }, + IncomingVLAN: 0x202, + IncomingVLANPriority: 0x0, + OutgoingVLAN: 0x0, + OutgoingVLANPriority: 0x0, + }, + }, + }, + SFlowFlowSample{ + EnterpriseID: 0x0, + Format: 0x1, + SampleLength: 0xd0, + SequenceNumber: 0x15acdd1, + SourceIDClass: 0x0, + SourceIDIndex: 0x255, + SamplingRate: 0x7d0, + SamplePool: 0x9567e900, + Dropped: 0x0, + InputInterface: 0x255, + OutputInterface: 0x257, + RecordCount: 0x2, + Records: []SFlowRecord{ + SFlowRawPacketFlowRecord{ + SFlowBaseFlowRecord: SFlowBaseFlowRecord{ + EnterpriseID: 0x0, + Format: 0x1, + FlowDataLength: 0x90, + }, + HeaderProtocol: 0x1, + FrameLength: 0x5ee, + PayloadRemoved: 0x4, + HeaderLength: 0x80, + Header: gopacket.NewPacket(SFlowTestPacket1[1174:1302], LayerTypeEthernet, gopacket.Default), + }, + SFlowExtendedSwitchFlowRecord{ + SFlowBaseFlowRecord: SFlowBaseFlowRecord{ + EnterpriseID: 0x0, + Format: 0x3e9, + FlowDataLength: 0x10, + }, + IncomingVLAN: 0x202, + IncomingVLANPriority: 0x0, + OutgoingVLAN: 0x202, + OutgoingVLANPriority: 0x0, + }, + }, + }, + SFlowFlowSample{ + EnterpriseID: 0x0, + Format: 0x1, + SampleLength: 0x94, + SequenceNumber: 0x15e5c20, + SourceIDClass: 0x0, + SourceIDIndex: 0x257, + SamplingRate: 0x7d0, + SamplePool: 0xb12fb230, + Dropped: 0x0, + InputInterface: 0x257, + OutputInterface: 0x0, + RecordCount: 0x2, + Records: []SFlowRecord{ + SFlowRawPacketFlowRecord{ + SFlowBaseFlowRecord: SFlowBaseFlowRecord{ + EnterpriseID: 0x0, + Format: 0x1, + FlowDataLength: 0x54, + }, + HeaderProtocol: 0x1, + FrameLength: 0x46, + PayloadRemoved: 0x4, + HeaderLength: 0x42, + Header: gopacket.NewPacket(SFlowTestPacket1[1390:1458], LayerTypeEthernet, gopacket.Default), + }, + SFlowExtendedSwitchFlowRecord{ + SFlowBaseFlowRecord: SFlowBaseFlowRecord{ + EnterpriseID: 0x0, + Format: 0x3e9, + FlowDataLength: 0x10, + }, + IncomingVLAN: 0x202, + IncomingVLANPriority: 0x0, + OutgoingVLAN: 0x0, + OutgoingVLANPriority: 0x0, + }, + }, + }, + }, + CounterSamples: []SFlowCounterSample{ + SFlowCounterSample{ + Format: 0x2, + SampleLength: 0xa8, + SequenceNumber: 0x20f2, + SourceIDClass: 0x0, + SourceIDIndex: 0x20a, + RecordCount: 0x2, + Records: []SFlowRecord{ + SFlowGenericInterfaceCounters{ + SFlowBaseCounterRecord: SFlowBaseCounterRecord{ + EnterpriseID: 0x0, + Format: 0x1, + FlowDataLength: 0x58, + }, + IfIndex: 0x20a, + IfType: 0x6, + IfSpeed: 0x2540be400, + IfDirection: 0x1, + IfStatus: 0x3, + IfInOctets: 0x129826db06c0b, + IfInUcastPkts: 0xcb0ddd96, + IfInMulticastPkts: 0x6a8c6, + IfInBroadcastPkts: 0x7b, + IfInDiscards: 0x0, + IfInErrors: 0x0, + IfInUnknownProtos: 0x0, + IfOutOctets: 0x340235587c9e, + IfOutUcastPkts: 0x56642571, + IfOutMulticastPkts: 0x705ac4, + IfOutBroadcastPkts: 0x908f1, + IfOutDiscards: 0x0, + IfOutErrors: 0x0, + IfPromiscuousMode: 0x0, + }, + SFlowEthernetCounters{ + SFlowBaseCounterRecord: SFlowBaseCounterRecord{ + EnterpriseID: 0x0, + Format: 0x2, + FlowDataLength: 0x34, + }, + AlignmentErrors: 0x0, + FCSErrors: 0x0, + SingleCollisionFrames: 0x0, + MultipleCollisionFrames: 0x0, + SQETestErrors: 0x0, + DeferredTransmissions: 0x0, + LateCollisions: 0x0, + ExcessiveCollisions: 0x0, + InternalMacTransmitErrors: 0x0, + CarrierSenseErrors: 0x0, + FrameTooLongs: 0x0, + InternalMacReceiveErrors: 0x0, + SymbolErrors: 0x0, + }, + }, + }, + }, + } + if !reflect.DeepEqual(want, got) { + t.Errorf("SFlow layer mismatch, \nwant:\n\n%#v\ngot:\n\n\n%#v\n\n", want, got) + } + } else { + t.Error("Application layer packet not UDP") + } +} + +func TestPacketPacket0(t *testing.T) { + p := gopacket.NewPacket(SFlowTestPacket2, LinkTypeEthernet, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeEthernet, LayerTypeIPv4, LayerTypeUDP, LayerTypeSFlow}, t) + if got, ok := p.ApplicationLayer().(*SFlowDatagram); ok { + want := &SFlowDatagram{ + DatagramVersion: uint32(5), + AgentAddress: []byte{192, 168, 91, 17}, + SubAgentID: uint32(0), + SequenceNumber: uint32(46394), + AgentUptime: uint32(52000), + SampleCount: uint32(3), + FlowSamples: []SFlowFlowSample{ + SFlowFlowSample{ + EnterpriseID: 0x0, + Format: 0x1, + SampleLength: 340, + SequenceNumber: 139118, + SourceIDClass: 0, + SourceIDIndex: 3, + SamplingRate: 1, + SamplePool: 139118, + Dropped: 0, + InputInterface: 3, + OutputInterface: 1073741823, + RecordCount: 4, + Records: []SFlowRecord{ + SFlowExtendedURLRecord{ + SFlowBaseFlowRecord: SFlowBaseFlowRecord{ + EnterpriseID: 0, + Format: 1005, + FlowDataLength: 48, + }, + Direction: SFlowURLsrc, + URL: "http://www.sflow.org", + Host: "host1.sflow.org", + }, + SFlowExtendedUserFlow{ + SFlowBaseFlowRecord: SFlowBaseFlowRecord{ + EnterpriseID: 0, + Format: 1004, + FlowDataLength: 44, + }, + SourceCharSet: SFlowCSUTF8, + SourceUserID: "source user", + DestinationCharSet: SFlowCSUTF8, + DestinationUserID: "destination user", + }, + SFlowExtendedGatewayFlowRecord{ + SFlowBaseFlowRecord: SFlowBaseFlowRecord{ + EnterpriseID: 0, + Format: 1003, + FlowDataLength: 100, + }, + NextHop: []byte{0x0d, 0x0c, 0x0b, 0x0a}, + AS: 65001, + SourceAS: 123, + PeerAS: 999, + ASPathCount: 3, + ASPath: []SFlowASDestination{ + SFlowASDestination{ + Type: SFlowASSequence, + Count: 3, + Members: []uint32{123, 456, 789}, + }, + SFlowASDestination{ + Type: SFlowASSet, + Count: 3, + Members: []uint32{11111, 22222, 33333}, + }, + SFlowASDestination{ + Type: SFlowASSequence, + Count: 3, + Members: []uint32{777, 888, 999}, + }, + }, + Communities: []uint32{12, 13}, + LocalPref: 432, + }, + SFlowRawPacketFlowRecord{ + SFlowBaseFlowRecord: SFlowBaseFlowRecord{ + EnterpriseID: 0x0, + Format: 0x1, + FlowDataLength: 84, + }, + HeaderProtocol: 1, + FrameLength: 70, + PayloadRemoved: 4, + HeaderLength: 0x42, + Header: gopacket.NewPacket(SFlowTestPacket2[350:418], LayerTypeEthernet, gopacket.Default), + }, + }, + }, + SFlowFlowSample{ + EnterpriseID: 0x0, + Format: 0x1, + SampleLength: 400, + SequenceNumber: 139119, + SourceIDClass: 0, + SourceIDIndex: 3, + SamplingRate: 1, + SamplePool: 139119, + Dropped: 0, + InputInterface: 1073741823, + OutputInterface: 3, + RecordCount: 4, + Records: []SFlowRecord{ + SFlowExtendedURLRecord{ + SFlowBaseFlowRecord: SFlowBaseFlowRecord{ + EnterpriseID: 0, + Format: 1005, + FlowDataLength: 48, + }, + Direction: SFlowURLsrc, + URL: "http://www.sflow.org", + Host: "host1.sflow.org", + }, + SFlowExtendedUserFlow{ + SFlowBaseFlowRecord: SFlowBaseFlowRecord{ + EnterpriseID: 0, + Format: 1004, + FlowDataLength: 44, + }, + SourceCharSet: SFlowCSUTF8, + SourceUserID: "source user", + DestinationCharSet: SFlowCSUTF8, + DestinationUserID: "destination user", + }, + SFlowExtendedGatewayFlowRecord{ + SFlowBaseFlowRecord: SFlowBaseFlowRecord{ + EnterpriseID: 0, + Format: 1003, + FlowDataLength: 100, + }, + NextHop: []byte{0x0d, 0x0c, 0x0b, 0x0a}, + AS: 65001, + SourceAS: 123, + PeerAS: 999, + ASPathCount: 3, + ASPath: []SFlowASDestination{ + SFlowASDestination{ + Type: SFlowASSequence, + Count: 3, + Members: []uint32{123, 456, 789}, + }, + SFlowASDestination{ + Type: SFlowASSet, + Count: 3, + Members: []uint32{11111, 22222, 33333}, + }, + SFlowASDestination{ + Type: SFlowASSequence, + Count: 3, + Members: []uint32{777, 888, 999}, + }, + }, + Communities: []uint32{12, 13}, + LocalPref: 432, + }, + SFlowRawPacketFlowRecord{ + SFlowBaseFlowRecord: SFlowBaseFlowRecord{ + EnterpriseID: 0x0, + Format: 0x1, + FlowDataLength: 144, + }, + HeaderProtocol: 1, + FrameLength: 390, + PayloadRemoved: 4, + HeaderLength: 0x80, + Header: gopacket.NewPacket(SFlowTestPacket2[698:826], LayerTypeEthernet, gopacket.Default), + }, + }, + }, + SFlowFlowSample{ + EnterpriseID: 0x0, + Format: 0x1, + SampleLength: 340, + SequenceNumber: 139120, + SourceIDClass: 0, + SourceIDIndex: 3, + SamplingRate: 1, + SamplePool: 139120, + Dropped: 0, + InputInterface: 3, + OutputInterface: 1073741823, + RecordCount: 4, + Records: []SFlowRecord{ + SFlowExtendedURLRecord{ + SFlowBaseFlowRecord: SFlowBaseFlowRecord{ + EnterpriseID: 0, + Format: 1005, + FlowDataLength: 48, + }, + Direction: SFlowURLsrc, + URL: "http://www.sflow.org", + Host: "host1.sflow.org", + }, + SFlowExtendedUserFlow{ + SFlowBaseFlowRecord: SFlowBaseFlowRecord{ + EnterpriseID: 0, + Format: 1004, + FlowDataLength: 44, + }, + SourceCharSet: SFlowCSUTF8, + SourceUserID: "source user", + DestinationCharSet: SFlowCSUTF8, + DestinationUserID: "destination user", + }, + SFlowExtendedGatewayFlowRecord{ + SFlowBaseFlowRecord: SFlowBaseFlowRecord{ + EnterpriseID: 0, + Format: 1003, + FlowDataLength: 100, + }, + NextHop: []byte{0x0d, 0x0c, 0x0b, 0x0a}, + AS: 65001, + SourceAS: 123, + PeerAS: 999, + ASPathCount: 3, + ASPath: []SFlowASDestination{ + SFlowASDestination{ + Type: SFlowASSequence, + Count: 3, + Members: []uint32{123, 456, 789}, + }, + SFlowASDestination{ + Type: SFlowASSet, + Count: 3, + Members: []uint32{11111, 22222, 33333}, + }, + SFlowASDestination{ + Type: SFlowASSequence, + Count: 3, + Members: []uint32{777, 888, 999}, + }, + }, + Communities: []uint32{12, 13}, + LocalPref: 432, + }, + SFlowRawPacketFlowRecord{ + SFlowBaseFlowRecord: SFlowBaseFlowRecord{ + EnterpriseID: 0x0, + Format: 0x1, + FlowDataLength: 84, + }, + HeaderProtocol: 1, + FrameLength: 70, + PayloadRemoved: 4, + HeaderLength: 0x42, + Header: gopacket.NewPacket(SFlowTestPacket2[1106:1174], LayerTypeEthernet, gopacket.Default), + }, + }, + }, + }, + } + if !reflect.DeepEqual(want, got) { + t.Errorf("SFlow layer mismatch, \nwant:\n\n%#v\ngot:\n\n\n%#v\n\n", want, got) + } + } else { + t.Error("Application layer packet not UDP") + } +} + +func TestDecodeProcessorCounter(t *testing.T) { + p := gopacket.NewPacket(SFlowTestPacket3, LayerTypeSFlow, gopacket.Default) + + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeSFlow}, t) + + got := p.ApplicationLayer().(*SFlowDatagram) + + want := &SFlowDatagram{ + DatagramVersion: uint32(5), + AgentAddress: []byte{0x0a, 0x14, 0x04, 0x00}, + SubAgentID: uint32(0x64), + SequenceNumber: uint32(96480), + AgentUptime: uint32(1929595000), + SampleCount: uint32(1), + CounterSamples: []SFlowCounterSample{ + SFlowCounterSample{ + Format: SFlowTypeExpandedCounterSample, + SampleLength: 0x34, + SequenceNumber: 0x0178e0, + SourceIDClass: 0x00, + SourceIDIndex: 0x01, + RecordCount: 0x01, + Records: []SFlowRecord{ + SFlowProcessorCounters{ + SFlowBaseCounterRecord: SFlowBaseCounterRecord{ + EnterpriseID: 0x0, + Format: SFlowTypeProcessorCounters, + FlowDataLength: 0x1c, + }, + FiveSecCpu: 0x05aa, + OneMinCpu: 0x055a, + FiveMinCpu: 0x0532, + TotalMemory: 0xe78d7000, + FreeMemory: 0x55e77000, + }, + }, + }, + }, + } + if !reflect.DeepEqual(want, got) { + t.Errorf("SFlow layer mismatch, \nwant:\n\n%#v\ngot:\n\n\n%#v\n\n", want, got) + } +} + +func TestDecodeExtendedSwitchFlow(t *testing.T) { + p := gopacket.NewPacket(SFlowTestPacket4, LayerTypeSFlow, gopacket.Default) + + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeSFlow}, t) + + got := p.ApplicationLayer().(*SFlowDatagram) + + want := &SFlowDatagram{ + DatagramVersion: uint32(5), + AgentAddress: []byte{0xc0, 0xa8, 0x01, 0x07}, + SubAgentID: uint32(0x00), + SequenceNumber: uint32(0x027e), + AgentUptime: uint32(0x32e0e47c), + SampleCount: uint32(1), + FlowSamples: []SFlowFlowSample{ + SFlowFlowSample{ + Format: SFlowTypeFlowSample, + SampleLength: 0x38, + SequenceNumber: 0x123, + SourceIDClass: 0x00, + SourceIDIndex: 0x1d, + SamplingRate: 0x100, + SamplePool: 0x337, + Dropped: 0x5623, + InputInterfaceFormat: 0x00, + InputInterface: 0x1d, + OutputInterfaceFormat: 0x00, + OutputInterface: 0x04, + RecordCount: 0x01, + Records: []SFlowRecord{ + SFlowExtendedSwitchFlowRecord{ + SFlowBaseFlowRecord: SFlowBaseFlowRecord{ + EnterpriseID: 0x0, + Format: SFlowTypeExtendedSwitchFlow, + FlowDataLength: 0x10, + }, + IncomingVLAN: 0x03, + IncomingVLANPriority: 0x02, + OutgoingVLAN: 0x05, + OutgoingVLANPriority: 0xffffffff, + }, + }, + }, + }, + } + if !reflect.DeepEqual(want, got) { + t.Errorf("SFlow layer mismatch, \nwant:\n\n%#v\ngot:\n\n\n%#v\n\n", want, got) + } +} + +func TestDecodeExtendedRouterFlow(t *testing.T) { + p := gopacket.NewPacket(SFlowTestPacket5, LayerTypeSFlow, gopacket.Default) + + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeSFlow}, t) + + got := p.ApplicationLayer().(*SFlowDatagram) + + want := &SFlowDatagram{ + DatagramVersion: uint32(5), + AgentAddress: []byte{0xc0, 0xa8, 0x01, 0x12}, + SubAgentID: uint32(0x00), + SequenceNumber: uint32(0x027e), + AgentUptime: uint32(0x32e0e47c), + SampleCount: uint32(1), + FlowSamples: []SFlowFlowSample{ + SFlowFlowSample{ + Format: SFlowTypeFlowSample, + SampleLength: 0x34, + SequenceNumber: 0x123, + SourceIDClass: 0x00, + SourceIDIndex: 0x1d, + SamplingRate: 0x100, + SamplePool: 0x334, + Dropped: 0x5602, + InputInterfaceFormat: 0x00, + InputInterface: 0x1d, + OutputInterfaceFormat: 0x00, + OutputInterface: 0x04, + RecordCount: 0x01, + Records: []SFlowRecord{ + SFlowExtendedRouterFlowRecord{ + SFlowBaseFlowRecord: SFlowBaseFlowRecord{ + EnterpriseID: 0x0, + Format: SFlowTypeExtendedRouterFlow, + FlowDataLength: 0x10, + }, + NextHop: []byte{0xc0, 0xa8, 0x01, 0x21}, + NextHopSourceMask: 0xffffffff, + NextHopDestinationMask: 0xffffff80, + }, + }, + }, + }, + } + if !reflect.DeepEqual(want, got) { + t.Errorf("SFlow layer mismatch, \nwant:\n\n%#v\ngot:\n\n\n%#v\n\n", want, got) + } +} + +func TestDecodeExtendedRouterFlowIPv6(t *testing.T) { + p := gopacket.NewPacket(SFlowTestPacket8, LayerTypeSFlow, gopacket.Default) + + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeSFlow}, t) + + got := p.ApplicationLayer().(*SFlowDatagram) + + want := &SFlowDatagram{ + DatagramVersion: uint32(5), + AgentAddress: []byte{0xc0, 0xa8, 0x01, 0x12}, + SubAgentID: uint32(0x00), + SequenceNumber: uint32(0x027e), + AgentUptime: uint32(0x32e0e47c), + SampleCount: uint32(1), + FlowSamples: []SFlowFlowSample{ + SFlowFlowSample{ + Format: SFlowTypeFlowSample, + SampleLength: 0x34, + SequenceNumber: 0x123, + SourceIDClass: 0x00, + SourceIDIndex: 0x1d, + SamplingRate: 0x100, + SamplePool: 0x334, + Dropped: 0x5602, + InputInterfaceFormat: 0x00, + InputInterface: 0x1d, + OutputInterfaceFormat: 0x00, + OutputInterface: 0x04, + RecordCount: 0x01, + Records: []SFlowRecord{ + SFlowExtendedRouterFlowRecord{ + SFlowBaseFlowRecord: SFlowBaseFlowRecord{ + EnterpriseID: 0x0, + Format: SFlowTypeExtendedRouterFlow, + FlowDataLength: 0x1c, + }, + NextHop: []byte{0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + NextHopSourceMask: 0xffffffff, + NextHopDestinationMask: 0xffffff80, + }, + }, + }, + }, + } + if !reflect.DeepEqual(want, got) { + t.Errorf("SFlow layer mismatch, \nwant:\n\n%#v\ngot:\n\n\n%#v\n\n", want, got) + } +} + +func TestDecodeExtendedIpv4TunnelIngressFlow(t *testing.T) { + p := gopacket.NewPacket(SFlowTestPacket6, LayerTypeSFlow, gopacket.Default) + + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeSFlow}, t) + + got := p.ApplicationLayer().(*SFlowDatagram) + + want := &SFlowDatagram{ + DatagramVersion: uint32(5), + AgentAddress: []byte{0x7f, 0x0, 0x0, 0x1}, + SubAgentID: uint32(0), + SequenceNumber: uint32(0x72), + AgentUptime: uint32(0x1bd50), + SampleCount: uint32(1), + FlowSamples: []SFlowFlowSample{ + SFlowFlowSample{ + Format: SFlowTypeFlowSample, + SampleLength: 0x48, + SequenceNumber: 0x74, + SourceIDClass: 0x0, + SourceIDIndex: 0x20003e8, + SamplingRate: 0x1, + SamplePool: 0x74, + Dropped: 0x0, + InputInterfaceFormat: 0x0, + InputInterface: 0x0, + OutputInterfaceFormat: 0x0, + OutputInterface: 0x80000001, + RecordCount: 0x1, + Records: []SFlowRecord{ + SFlowExtendedIpv4TunnelIngressRecord{ + SFlowBaseFlowRecord: SFlowBaseFlowRecord{ + EnterpriseID: 0x0, + Format: SFlowTypeExtendedIpv4TunnelIngressFlow, + FlowDataLength: 0x20, + }, + SFlowIpv4Record: SFlowIpv4Record{ + Length: 0x0, + Protocol: 0x2f, + IPSrc: net.IP{0xc0, 0xa8, 0x0, 0x54}, + IPDst: net.IP{0xc0, 0xa8, 0x0, 0x53}, + PortSrc: 0x0, + PortDst: 0x0, + TCPFlags: 0x0, + TOS: 0x0, + }, + }, + }, + }, + }, + } + if !reflect.DeepEqual(want, got) { + t.Errorf("SFlow layer mismatch, \nwant:\n\n%#v\ngot:\n\n\n%#v\n\n", want, got) + } +} + +func TestDecodeExtendedIpv4TunnelEgressFlow(t *testing.T) { + p := gopacket.NewPacket(SFlowTestPacket7, LayerTypeSFlow, gopacket.Default) + + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeSFlow}, t) + + got := p.ApplicationLayer().(*SFlowDatagram) + + want := &SFlowDatagram{ + DatagramVersion: uint32(5), + AgentAddress: []byte{0x7f, 0x0, 0x0, 0x1}, + SubAgentID: uint32(1), + SequenceNumber: uint32(0x12), + AgentUptime: uint32(0x4268), + SampleCount: uint32(1), + FlowSamples: []SFlowFlowSample{ + SFlowFlowSample{ + Format: SFlowTypeFlowSample, + SampleLength: 0x48, + SequenceNumber: 0x12, + SourceIDClass: 0x0, + SourceIDIndex: 0x20003e9, + SamplingRate: 0x1, + SamplePool: 0x12, + Dropped: 0x0, + InputInterfaceFormat: 0x0, + InputInterface: 0x6c, + OutputInterfaceFormat: 0x0, + OutputInterface: 0x80000001, + RecordCount: 0x1, + Records: []SFlowRecord{ + SFlowExtendedIpv4TunnelEgressRecord{ + SFlowBaseFlowRecord: SFlowBaseFlowRecord{ + EnterpriseID: 0x0, + Format: SFlowTypeExtendedIpv4TunnelEgressFlow, + FlowDataLength: 0x20, + }, + SFlowIpv4Record: SFlowIpv4Record{ + Length: 0x0, + Protocol: 0x0, + IPSrc: net.IP{0x0, 0x0, 0x0, 0x0}, + IPDst: net.IP{0xc0, 0xa8, 0x0, 0x54}, + PortSrc: 0x0, + PortDst: 0x0, + TCPFlags: 0x0, + TOS: 0x0, + }, + }, + }, + }, + }, + } + if !reflect.DeepEqual(want, got) { + t.Errorf("SFlow layer mismatch, \nwant:\n\n%#v\ngot:\n\n\n%#v\n\n", want, got) + } +} + +func BenchmarkDecodeSFlowPacket1(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(SFlowTestPacket1, LinkTypeEthernet, gopacket.NoCopy) + } +} + +func BenchmarkDecodeSFlowPacket2(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(SFlowTestPacket2, LinkTypeEthernet, gopacket.NoCopy) + } +} + +func BenchmarkDecodeSFlowPacket3(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(SFlowTestPacket3, LinkTypeEthernet, gopacket.NoCopy) + } +} + +func BenchmarkDecodeSFlowPacket4(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(SFlowTestPacket4, LinkTypeEthernet, gopacket.NoCopy) + } +} + +func BenchmarkDecodeSFlowLayerPacket1(b *testing.B) { + var sflow SFlowDatagram + for i := 0; i < b.N; i++ { + sflow.DecodeFromBytes(SFlowTestPacket1[ /*eth*/ 14+ /*ipv4*/ 20+ /*udp*/ 8:], gopacket.NilDecodeFeedback) + } +} + +func BenchmarkDecodeSFlowLayerPacket2(b *testing.B) { + var sflow SFlowDatagram + for i := 0; i < b.N; i++ { + sflow.DecodeFromBytes(SFlowTestPacket2[ /*eth*/ 14+ /*ipv4*/ 20+ /*udp*/ 8:], gopacket.NilDecodeFeedback) + } +} diff --git a/vendor/github.com/google/gopacket/layers/stp.go b/vendor/github.com/google/gopacket/layers/stp.go new file mode 100644 index 0000000..bde7d7c --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/stp.go @@ -0,0 +1,27 @@ +// Copyright 2017 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 layers + +import ( + "github.com/google/gopacket" +) + +// STP decode spanning tree protocol packets to transport BPDU (bridge protocol data unit) message. +type STP struct { + BaseLayer +} + +// LayerType returns gopacket.LayerTypeSTP. +func (s *STP) LayerType() gopacket.LayerType { return LayerTypeSTP } + +func decodeSTP(data []byte, p gopacket.PacketBuilder) error { + stp := &STP{} + stp.Contents = data[:] + // TODO: parse the STP protocol into actual subfields. + p.AddLayer(stp) + return nil +} diff --git a/vendor/github.com/google/gopacket/layers/tcp.go b/vendor/github.com/google/gopacket/layers/tcp.go new file mode 100644 index 0000000..fb731da --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/tcp.go @@ -0,0 +1,327 @@ +// Copyright 2012 Google, Inc. All rights reserved. +// Copyright 2009-2011 Andreas Krennmair. 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 layers + +import ( + "encoding/binary" + "encoding/hex" + "errors" + "fmt" + + "github.com/google/gopacket" +) + +// TCP is the layer for TCP headers. +type TCP struct { + BaseLayer + SrcPort, DstPort TCPPort + Seq uint32 + Ack uint32 + DataOffset uint8 + FIN, SYN, RST, PSH, ACK, URG, ECE, CWR, NS bool + Window uint16 + Checksum uint16 + Urgent uint16 + sPort, dPort []byte + Options []TCPOption + Padding []byte + opts [4]TCPOption + tcpipchecksum +} + +// TCPOptionKind represents a TCP option code. +type TCPOptionKind uint8 + +const ( + TCPOptionKindEndList = 0 + TCPOptionKindNop = 1 + TCPOptionKindMSS = 2 // len = 4 + TCPOptionKindWindowScale = 3 // len = 3 + TCPOptionKindSACKPermitted = 4 // len = 2 + TCPOptionKindSACK = 5 // len = n + TCPOptionKindEcho = 6 // len = 6, obsolete + TCPOptionKindEchoReply = 7 // len = 6, obsolete + TCPOptionKindTimestamps = 8 // len = 10 + TCPOptionKindPartialOrderConnectionPermitted = 9 // len = 2, obsolete + TCPOptionKindPartialOrderServiceProfile = 10 // len = 3, obsolete + TCPOptionKindCC = 11 // obsolete + TCPOptionKindCCNew = 12 // obsolete + TCPOptionKindCCEcho = 13 // obsolete + TCPOptionKindAltChecksum = 14 // len = 3, obsolete + TCPOptionKindAltChecksumData = 15 // len = n, obsolete +) + +func (k TCPOptionKind) String() string { + switch k { + case TCPOptionKindEndList: + return "EndList" + case TCPOptionKindNop: + return "NOP" + case TCPOptionKindMSS: + return "MSS" + case TCPOptionKindWindowScale: + return "WindowScale" + case TCPOptionKindSACKPermitted: + return "SACKPermitted" + case TCPOptionKindSACK: + return "SACK" + case TCPOptionKindEcho: + return "Echo" + case TCPOptionKindEchoReply: + return "EchoReply" + case TCPOptionKindTimestamps: + return "Timestamps" + case TCPOptionKindPartialOrderConnectionPermitted: + return "PartialOrderConnectionPermitted" + case TCPOptionKindPartialOrderServiceProfile: + return "PartialOrderServiceProfile" + case TCPOptionKindCC: + return "CC" + case TCPOptionKindCCNew: + return "CCNew" + case TCPOptionKindCCEcho: + return "CCEcho" + case TCPOptionKindAltChecksum: + return "AltChecksum" + case TCPOptionKindAltChecksumData: + return "AltChecksumData" + default: + return fmt.Sprintf("Unknown(%d)", k) + } +} + +type TCPOption struct { + OptionType TCPOptionKind + OptionLength uint8 + OptionData []byte +} + +func (t TCPOption) String() string { + hd := hex.EncodeToString(t.OptionData) + if len(hd) > 0 { + hd = " 0x" + hd + } + switch t.OptionType { + case TCPOptionKindMSS: + return fmt.Sprintf("TCPOption(%s:%v%s)", + t.OptionType, + binary.BigEndian.Uint16(t.OptionData), + hd) + + case TCPOptionKindTimestamps: + if len(t.OptionData) == 8 { + return fmt.Sprintf("TCPOption(%s:%v/%v%s)", + t.OptionType, + binary.BigEndian.Uint32(t.OptionData[:4]), + binary.BigEndian.Uint32(t.OptionData[4:8]), + hd) + } + } + return fmt.Sprintf("TCPOption(%s:%s)", t.OptionType, hd) +} + +// LayerType returns gopacket.LayerTypeTCP +func (t *TCP) LayerType() gopacket.LayerType { return LayerTypeTCP } + +// SerializeTo writes the serialized form of this layer into the +// SerializationBuffer, implementing gopacket.SerializableLayer. +// See the docs for gopacket.SerializableLayer for more info. +func (t *TCP) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + var optionLength int + for _, o := range t.Options { + switch o.OptionType { + case 0, 1: + optionLength += 1 + default: + optionLength += 2 + len(o.OptionData) + } + } + if opts.FixLengths { + if rem := optionLength % 4; rem != 0 { + t.Padding = lotsOfZeros[:4-rem] + } + t.DataOffset = uint8((len(t.Padding) + optionLength + 20) / 4) + } + bytes, err := b.PrependBytes(20 + optionLength + len(t.Padding)) + if err != nil { + return err + } + binary.BigEndian.PutUint16(bytes, uint16(t.SrcPort)) + binary.BigEndian.PutUint16(bytes[2:], uint16(t.DstPort)) + binary.BigEndian.PutUint32(bytes[4:], t.Seq) + binary.BigEndian.PutUint32(bytes[8:], t.Ack) + binary.BigEndian.PutUint16(bytes[12:], t.flagsAndOffset()) + binary.BigEndian.PutUint16(bytes[14:], t.Window) + binary.BigEndian.PutUint16(bytes[18:], t.Urgent) + start := 20 + for _, o := range t.Options { + bytes[start] = byte(o.OptionType) + switch o.OptionType { + case 0, 1: + start++ + default: + if opts.FixLengths { + o.OptionLength = uint8(len(o.OptionData) + 2) + } + bytes[start+1] = o.OptionLength + copy(bytes[start+2:start+len(o.OptionData)+2], o.OptionData) + start += int(o.OptionLength) + } + } + copy(bytes[start:], t.Padding) + if opts.ComputeChecksums { + // zero out checksum bytes in current serialization. + bytes[16] = 0 + bytes[17] = 0 + csum, err := t.computeChecksum(b.Bytes(), IPProtocolTCP) + if err != nil { + return err + } + t.Checksum = csum + } + binary.BigEndian.PutUint16(bytes[16:], t.Checksum) + return nil +} + +func (t *TCP) ComputeChecksum() (uint16, error) { + return t.computeChecksum(append(t.Contents, t.Payload...), IPProtocolTCP) +} + +func (t *TCP) flagsAndOffset() uint16 { + f := uint16(t.DataOffset) << 12 + if t.FIN { + f |= 0x0001 + } + if t.SYN { + f |= 0x0002 + } + if t.RST { + f |= 0x0004 + } + if t.PSH { + f |= 0x0008 + } + if t.ACK { + f |= 0x0010 + } + if t.URG { + f |= 0x0020 + } + if t.ECE { + f |= 0x0040 + } + if t.CWR { + f |= 0x0080 + } + if t.NS { + f |= 0x0100 + } + return f +} + +func (tcp *TCP) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + tcp.SrcPort = TCPPort(binary.BigEndian.Uint16(data[0:2])) + tcp.sPort = data[0:2] + tcp.DstPort = TCPPort(binary.BigEndian.Uint16(data[2:4])) + tcp.dPort = data[2:4] + tcp.Seq = binary.BigEndian.Uint32(data[4:8]) + tcp.Ack = binary.BigEndian.Uint32(data[8:12]) + tcp.DataOffset = data[12] >> 4 + tcp.FIN = data[13]&0x01 != 0 + tcp.SYN = data[13]&0x02 != 0 + tcp.RST = data[13]&0x04 != 0 + tcp.PSH = data[13]&0x08 != 0 + tcp.ACK = data[13]&0x10 != 0 + tcp.URG = data[13]&0x20 != 0 + tcp.ECE = data[13]&0x40 != 0 + tcp.CWR = data[13]&0x80 != 0 + tcp.NS = data[12]&0x01 != 0 + tcp.Window = binary.BigEndian.Uint16(data[14:16]) + tcp.Checksum = binary.BigEndian.Uint16(data[16:18]) + tcp.Urgent = binary.BigEndian.Uint16(data[18:20]) + tcp.Options = tcp.opts[:0] + if tcp.DataOffset < 5 { + return fmt.Errorf("Invalid TCP data offset %d < 5", tcp.DataOffset) + } + dataStart := int(tcp.DataOffset) * 4 + if dataStart > len(data) { + df.SetTruncated() + tcp.Payload = nil + tcp.Contents = data + return errors.New("TCP data offset greater than packet length") + } + tcp.Contents = data[:dataStart] + tcp.Payload = data[dataStart:] + // From here on, data points just to the header options. + data = data[20:dataStart] + for len(data) > 0 { + if tcp.Options == nil { + // Pre-allocate to avoid allocating a slice. + tcp.Options = tcp.opts[:0] + } + tcp.Options = append(tcp.Options, TCPOption{OptionType: TCPOptionKind(data[0])}) + opt := &tcp.Options[len(tcp.Options)-1] + switch opt.OptionType { + case TCPOptionKindEndList: // End of options + opt.OptionLength = 1 + tcp.Padding = data[1:] + break + case TCPOptionKindNop: // 1 byte padding + opt.OptionLength = 1 + default: + opt.OptionLength = data[1] + if opt.OptionLength < 2 { + return fmt.Errorf("Invalid TCP option length %d < 2", opt.OptionLength) + } else if int(opt.OptionLength) > len(data) { + return fmt.Errorf("Invalid TCP option length %d exceeds remaining %d bytes", opt.OptionLength, len(data)) + } + opt.OptionData = data[2:opt.OptionLength] + } + data = data[opt.OptionLength:] + } + return nil +} + +func (t *TCP) CanDecode() gopacket.LayerClass { + return LayerTypeTCP +} + +func (t *TCP) NextLayerType() gopacket.LayerType { + lt := t.DstPort.LayerType() + if lt == gopacket.LayerTypePayload { + lt = t.SrcPort.LayerType() + } + return lt +} + +func decodeTCP(data []byte, p gopacket.PacketBuilder) error { + tcp := &TCP{} + err := tcp.DecodeFromBytes(data, p) + p.AddLayer(tcp) + p.SetTransportLayer(tcp) + if err != nil { + return err + } + if p.DecodeOptions().DecodeStreamsAsDatagrams { + return p.NextDecoder(tcp.NextLayerType()) + } else { + return p.NextDecoder(gopacket.LayerTypePayload) + } +} + +func (t *TCP) TransportFlow() gopacket.Flow { + return gopacket.NewFlow(EndpointTCPPort, t.sPort, t.dPort) +} + +// For testing only +func (t *TCP) SetInternalPortsForTesting() { + t.sPort = make([]byte, 2) + t.dPort = make([]byte, 2) + binary.BigEndian.PutUint16(t.sPort, uint16(t.SrcPort)) + binary.BigEndian.PutUint16(t.dPort, uint16(t.DstPort)) +} diff --git a/vendor/github.com/google/gopacket/layers/tcp_test.go b/vendor/github.com/google/gopacket/layers/tcp_test.go new file mode 100644 index 0000000..56a6aaa --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/tcp_test.go @@ -0,0 +1,60 @@ +// Copyright 2016, 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 layers + +import ( + "testing" + + "github.com/google/gopacket" +) + +func TestTCPOptionKindString(t *testing.T) { + testData := []struct { + o *TCPOption + s string + }{ + {&TCPOption{ + OptionType: TCPOptionKindNop, + OptionLength: 1, + }, + "TCPOption(NOP:)"}, + {&TCPOption{ + OptionType: TCPOptionKindMSS, + OptionLength: 4, + OptionData: []byte{0x12, 0x34}, + }, + "TCPOption(MSS:4660 0x1234)"}, + {&TCPOption{ + OptionType: TCPOptionKindTimestamps, + OptionLength: 10, + OptionData: []byte{0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01}, + }, + "TCPOption(Timestamps:2/1 0x0000000200000001)"}} + + for _, tc := range testData { + if s := tc.o.String(); s != tc.s { + t.Errorf("expected %#v string to be %s, got %s", tc.o, tc.s, s) + } + } +} + +func TestTCPSerializePadding(t *testing.T) { + tcp := &TCP{} + tcp.Options = append(tcp.Options, TCPOption{ + OptionType: TCPOptionKindNop, + OptionLength: 1, + }) + buf := gopacket.NewSerializeBuffer() + opts := gopacket.SerializeOptions{FixLengths: true} + err := gopacket.SerializeLayers(buf, opts, tcp) + if err != nil { + t.Fatal(err) + } + if len(buf.Bytes())%4 != 0 { + t.Errorf("TCP data of len %d not padding to 32 bit boundary", len(buf.Bytes())) + } +} diff --git a/vendor/github.com/google/gopacket/layers/tcpip.go b/vendor/github.com/google/gopacket/layers/tcpip.go new file mode 100644 index 0000000..64ba51c --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/tcpip.go @@ -0,0 +1,104 @@ +// Copyright 2012 Google, Inc. All rights reserved. +// Copyright 2009-2011 Andreas Krennmair. 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 layers + +import ( + "errors" + "fmt" + + "github.com/google/gopacket" +) + +// Checksum computation for TCP/UDP. +type tcpipchecksum struct { + pseudoheader tcpipPseudoHeader +} + +type tcpipPseudoHeader interface { + pseudoheaderChecksum() (uint32, error) +} + +func (ip *IPv4) pseudoheaderChecksum() (csum uint32, err error) { + if err := ip.AddressTo4(); err != nil { + return 0, err + } + csum += (uint32(ip.SrcIP[0]) + uint32(ip.SrcIP[2])) << 8 + csum += uint32(ip.SrcIP[1]) + uint32(ip.SrcIP[3]) + csum += (uint32(ip.DstIP[0]) + uint32(ip.DstIP[2])) << 8 + csum += uint32(ip.DstIP[1]) + uint32(ip.DstIP[3]) + return csum, nil +} + +func (ip *IPv6) pseudoheaderChecksum() (csum uint32, err error) { + if err := ip.AddressTo16(); err != nil { + return 0, err + } + for i := 0; i < 16; i += 2 { + csum += uint32(ip.SrcIP[i]) << 8 + csum += uint32(ip.SrcIP[i+1]) + csum += uint32(ip.DstIP[i]) << 8 + csum += uint32(ip.DstIP[i+1]) + } + return csum, nil +} + +// Calculate the TCP/IP checksum defined in rfc1071. The passed-in csum is any +// initial checksum data that's already been computed. +func tcpipChecksum(data []byte, csum uint32) uint16 { + // to handle odd lengths, we loop to length - 1, incrementing by 2, then + // handle the last byte specifically by checking against the original + // length. + length := len(data) - 1 + for i := 0; i < length; i += 2 { + // For our test packet, doing this manually is about 25% faster + // (740 ns vs. 1000ns) than doing it by calling binary.BigEndian.Uint16. + csum += uint32(data[i]) << 8 + csum += uint32(data[i+1]) + } + if len(data)%2 == 1 { + csum += uint32(data[length]) << 8 + } + for csum > 0xffff { + csum = (csum >> 16) + (csum & 0xffff) + } + return ^uint16(csum) +} + +// computeChecksum computes a TCP or UDP checksum. headerAndPayload is the +// serialized TCP or UDP header plus its payload, with the checksum zero'd +// out. headerProtocol is the IP protocol number of the upper-layer header. +func (c *tcpipchecksum) computeChecksum(headerAndPayload []byte, headerProtocol IPProtocol) (uint16, error) { + if c.pseudoheader == nil { + return 0, errors.New("TCP/IP layer 4 checksum cannot be computed without network layer... call SetNetworkLayerForChecksum to set which layer to use") + } + length := uint32(len(headerAndPayload)) + csum, err := c.pseudoheader.pseudoheaderChecksum() + if err != nil { + return 0, err + } + csum += uint32(headerProtocol) + csum += length & 0xffff + csum += length >> 16 + return tcpipChecksum(headerAndPayload, csum), nil +} + +// SetNetworkLayerForChecksum tells this layer which network layer is wrapping it. +// This is needed for computing the checksum when serializing, since TCP/IP transport +// layer checksums depends on fields in the IPv4 or IPv6 layer that contains it. +// The passed in layer must be an *IPv4 or *IPv6. +func (i *tcpipchecksum) SetNetworkLayerForChecksum(l gopacket.NetworkLayer) error { + switch v := l.(type) { + case *IPv4: + i.pseudoheader = v + case *IPv6: + i.pseudoheader = v + default: + return fmt.Errorf("cannot use layer type %v for tcp checksum network layer", l.LayerType()) + } + return nil +} diff --git a/vendor/github.com/google/gopacket/layers/tcpip_test.go b/vendor/github.com/google/gopacket/layers/tcpip_test.go new file mode 100644 index 0000000..c002e84 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/tcpip_test.go @@ -0,0 +1,185 @@ +// Copyright 2014, 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 layers + +import ( + "github.com/google/gopacket" + "net" + "testing" +) + +const ( + ipv4UDPChecksum = uint16(0xbc5f) // Wireshark + ipv6UDPChecksumWithIPv6DstOpts = uint16(0x4d21) // Wireshark + ipv6UDPChecksumJumbogram = uint16(0xcda8) +) + +func createIPv4ChecksumTestLayer() (ip4 *IPv4) { + ip4 = &IPv4{} + ip4.Version = 4 + ip4.TTL = 64 + ip4.SrcIP = net.ParseIP("192.0.2.1") + ip4.DstIP = net.ParseIP("198.51.100.1") + return +} + +func createIPv6ChecksumTestLayer() (ip6 *IPv6) { + ip6 = &IPv6{} + ip6.Version = 6 + ip6.NextHeader = IPProtocolNoNextHeader + ip6.HopLimit = 64 + ip6.SrcIP = net.ParseIP("2001:db8::1") + ip6.DstIP = net.ParseIP("2001:db8::2") + return +} + +func createIPv6DestinationChecksumTestLayer() (dst *IPv6Destination) { + tlv := &IPv6DestinationOption{} + tlv.OptionType = 0x01 //PadN + tlv.OptionData = []byte{0x00, 0x00, 0x00, 0x00} + dst = &IPv6Destination{} + dst.Options = append(dst.Options, tlv) + dst.NextHeader = IPProtocolNoNextHeader + return +} + +func createUDPChecksumTestLayer() (udp *UDP) { + udp = &UDP{} + udp.SrcPort = UDPPort(12345) + udp.DstPort = UDPPort(9999) + return +} + +func TestIPv4UDPChecksum(t *testing.T) { + var serialize []gopacket.SerializableLayer = make([]gopacket.SerializableLayer, 0, 2) + var u *UDP + var err error + + ip4 := createIPv4ChecksumTestLayer() + ip4.Protocol = IPProtocolUDP + serialize = append(serialize, ip4) + + udp := createUDPChecksumTestLayer() + udp.SetNetworkLayerForChecksum(ip4) + serialize = append(serialize, udp) + + buf := gopacket.NewSerializeBuffer() + opts := gopacket.SerializeOptions{FixLengths: true, ComputeChecksums: true} + err = gopacket.SerializeLayers(buf, opts, serialize...) + if err != nil { + t.Fatal(err) + } + + p := gopacket.NewPacket(buf.Bytes(), LinkTypeRaw, gopacket.Default) + if p.ErrorLayer() != nil { + t.Fatal("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeIPv4, LayerTypeUDP}, t) + + if l, ok := p.Layer(LayerTypeUDP).(*UDP); !ok { + t.Fatal("No UDP layer type found in packet") + } else { + u = l + } + got := u.Checksum + want := ipv4UDPChecksum + if got != want { + t.Errorf("Bad checksum:\ngot:\n%#v\n\nwant:\n%#v\n\n", got, want) + } +} + +func TestIPv6UDPChecksumWithIPv6DstOpts(t *testing.T) { + var serialize []gopacket.SerializableLayer = make([]gopacket.SerializableLayer, 0, 3) + var u *UDP + var err error + + ip6 := createIPv6ChecksumTestLayer() + ip6.NextHeader = IPProtocolIPv6Destination + serialize = append(serialize, ip6) + + dst := createIPv6DestinationChecksumTestLayer() + dst.NextHeader = IPProtocolUDP + serialize = append(serialize, dst) + + udp := createUDPChecksumTestLayer() + udp.SetNetworkLayerForChecksum(ip6) + serialize = append(serialize, udp) + + buf := gopacket.NewSerializeBuffer() + opts := gopacket.SerializeOptions{FixLengths: true, ComputeChecksums: true} + err = gopacket.SerializeLayers(buf, opts, serialize...) + if err != nil { + t.Fatal(err) + } + + p := gopacket.NewPacket(buf.Bytes(), LinkTypeRaw, gopacket.Default) + if p.ErrorLayer() != nil { + t.Fatal("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeIPv6, LayerTypeIPv6Destination, LayerTypeUDP}, t) + + if l, ok := p.Layer(LayerTypeUDP).(*UDP); !ok { + t.Fatal("No UDP layer type found in packet") + } else { + u = l + } + got := u.Checksum + want := ipv6UDPChecksumWithIPv6DstOpts + if got != want { + t.Errorf("Bad checksum:\ngot:\n%#v\n\nwant:\n%#v\n\n", got, want) + } +} + +func TestIPv6JumbogramUDPChecksum(t *testing.T) { + var serialize []gopacket.SerializableLayer = make([]gopacket.SerializableLayer, 0, 4) + var u *UDP + var err error + + ip6 := &IPv6{} + ip6.Version = 6 + ip6.NextHeader = IPProtocolUDP + ip6.HopLimit = 64 + ip6.SrcIP = net.ParseIP("2001:db8::1") + ip6.DstIP = net.ParseIP("2001:db8::2") + serialize = append(serialize, ip6) + + udp := &UDP{} + udp.SrcPort = UDPPort(12345) + udp.DstPort = UDPPort(9999) + udp.SetNetworkLayerForChecksum(ip6) + serialize = append(serialize, udp) + + payload := make([]byte, ipv6MaxPayloadLength+1) + for i := range payload { + payload[i] = 0xfe + } + serialize = append(serialize, gopacket.Payload(payload)) + + buf := gopacket.NewSerializeBuffer() + opts := gopacket.SerializeOptions{FixLengths: true, ComputeChecksums: true} + err = gopacket.SerializeLayers(buf, opts, serialize...) + if err != nil { + t.Fatal(err) + } + + p := gopacket.NewPacket(buf.Bytes(), LinkTypeRaw, gopacket.Default) + if p.ErrorLayer() != nil { + t.Fatal("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeIPv6, LayerTypeIPv6HopByHop, LayerTypeUDP, gopacket.LayerTypePayload}, t) + + if l, ok := p.Layer(LayerTypeUDP).(*UDP); !ok { + t.Fatal("No UDP layer type found in packet") + } else { + u = l + } + got := u.Checksum + want := ipv6UDPChecksumJumbogram + if got != want { + t.Errorf("Bad checksum:\ngot:\n%#v\n\nwant:\n%#v\n\n", got, want) + } +} diff --git a/vendor/github.com/google/gopacket/layers/test_creator.py b/vendor/github.com/google/gopacket/layers/test_creator.py new file mode 100755 index 0000000..c92d276 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/test_creator.py @@ -0,0 +1,103 @@ +#!/usr/bin/python +# Copyright 2012 Google, Inc. All rights reserved. + +"""TestCreator creates test templates from pcap files.""" + +import argparse +import base64 +import glob +import re +import string +import subprocess +import sys + + +class Packet(object): + """Helper class encapsulating packet from a pcap file.""" + + def __init__(self, packet_lines): + self.packet_lines = packet_lines + self.data = self._DecodeText(packet_lines) + + @classmethod + def _DecodeText(cls, packet_lines): + packet_bytes = [] + # First line is timestamp and stuff, skip it. + # Format: 0x0010: 0000 0020 3aff 3ffe 0000 0000 0000 0000 ....:.?......... + + for line in packet_lines[1:]: + m = re.match(r'\s+0x[a-f\d]+:\s+((?:[\da-f]{2,4}\s)*)', line, re.IGNORECASE) + if m is None: continue + for hexpart in m.group(1).split(): + packet_bytes.append(base64.b16decode(hexpart.upper())) + return ''.join(packet_bytes) + + def Test(self, name, link_type): + """Yields a test using this packet, as a set of lines.""" + yield '// testPacket%s is the packet:' % name + for line in self.packet_lines: + yield '// ' + line + yield 'var testPacket%s = []byte{' % name + data = list(self.data) + while data: + linebytes, data = data[:16], data[16:] + yield ''.join(['\t'] + ['0x%02x, ' % ord(c) for c in linebytes]) + yield '}' + yield 'func TestPacket%s(t *testing.T) {' % name + yield '\tp := gopacket.NewPacket(testPacket%s, LinkType%s, gopacket.Default)' % (name, link_type) + yield '\tif p.ErrorLayer() != nil {' + yield '\t\tt.Error("Failed to decode packet:", p.ErrorLayer().Error())' + yield '\t}' + yield '\tcheckLayers(p, []gopacket.LayerType{LayerType%s, FILL_ME_IN_WITH_ACTUAL_LAYERS}, t)' % link_type + yield '}' + yield 'func BenchmarkDecodePacket%s(b *testing.B) {' % name + yield '\tfor i := 0; i < b.N; i++ {' + yield '\t\tgopacket.NewPacket(testPacket%s, LinkType%s, gopacket.NoCopy)' % (name, link_type) + yield '\t}' + yield '}' + + + +def GetTcpdumpOutput(filename): + """Runs tcpdump on the given file, returning output as string.""" + return subprocess.check_output( + ['tcpdump', '-XX', '-s', '0', '-n', '-r', filename]) + + +def TcpdumpOutputToPackets(output): + """Reads a pcap file with TCPDump, yielding Packet objects.""" + pdata = [] + for line in output.splitlines(): + if line[0] not in string.whitespace and pdata: + yield Packet(pdata) + pdata = [] + pdata.append(line) + if pdata: + yield Packet(pdata) + + +def main(): + class CustomHelpFormatter(argparse.ArgumentDefaultsHelpFormatter): + def _format_usage(self, usage, actions, groups, prefix=None): + header =('TestCreator creates gopacket tests using a pcap file.\n\n' + 'Tests are written to standard out... they can then be \n' + 'copied into the file of your choice and modified as \n' + 'you see.\n\n') + return header + argparse.ArgumentDefaultsHelpFormatter._format_usage( + self, usage, actions, groups, prefix) + + parser = argparse.ArgumentParser(formatter_class=CustomHelpFormatter) + parser.add_argument('--link_type', default='Ethernet', help='the link type (default: %(default)s)') + parser.add_argument('--name', default='Packet%d', help='the layer type, must have "%d" inside it') + parser.add_argument('files', metavar='file.pcap', type=str, nargs='+', help='the files to process') + + args = parser.parse_args() + + for arg in args.files: + for path in glob.glob(arg): + for i, packet in enumerate(TcpdumpOutputToPackets(GetTcpdumpOutput(path))): + print '\n'.join(packet.Test( + args.name % i, args.link_type)) + +if __name__ == '__main__': + main() diff --git a/vendor/github.com/google/gopacket/layers/udp.go b/vendor/github.com/google/gopacket/layers/udp.go new file mode 100644 index 0000000..20f8c50 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/udp.go @@ -0,0 +1,120 @@ +// Copyright 2012 Google, Inc. All rights reserved. +// Copyright 2009-2011 Andreas Krennmair. 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 layers + +import ( + "encoding/binary" + "fmt" + "github.com/google/gopacket" +) + +// UDP is the layer for UDP headers. +type UDP struct { + BaseLayer + SrcPort, DstPort UDPPort + Length uint16 + Checksum uint16 + sPort, dPort []byte + tcpipchecksum +} + +// LayerType returns gopacket.LayerTypeUDP +func (u *UDP) LayerType() gopacket.LayerType { return LayerTypeUDP } + +func (udp *UDP) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + udp.SrcPort = UDPPort(binary.BigEndian.Uint16(data[0:2])) + udp.sPort = data[0:2] + udp.DstPort = UDPPort(binary.BigEndian.Uint16(data[2:4])) + udp.dPort = data[2:4] + udp.Length = binary.BigEndian.Uint16(data[4:6]) + udp.Checksum = binary.BigEndian.Uint16(data[6:8]) + udp.BaseLayer = BaseLayer{Contents: data[:8]} + switch { + case udp.Length >= 8: + hlen := int(udp.Length) + if hlen > len(data) { + df.SetTruncated() + hlen = len(data) + } + udp.Payload = data[8:hlen] + case udp.Length == 0: // Jumbogram, use entire rest of data + udp.Payload = data[8:] + default: + return fmt.Errorf("UDP packet too small: %d bytes", udp.Length) + } + return nil +} + +// SerializeTo writes the serialized form of this layer into the +// SerializationBuffer, implementing gopacket.SerializableLayer. +// See the docs for gopacket.SerializableLayer for more info. +func (u *UDP) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + var jumbo bool + + payload := b.Bytes() + if _, ok := u.pseudoheader.(*IPv6); ok { + if len(payload)+8 > 65535 { + jumbo = true + } + } + bytes, err := b.PrependBytes(8) + if err != nil { + return err + } + binary.BigEndian.PutUint16(bytes, uint16(u.SrcPort)) + binary.BigEndian.PutUint16(bytes[2:], uint16(u.DstPort)) + if opts.FixLengths { + if jumbo { + u.Length = 0 + } else { + u.Length = uint16(len(payload)) + 8 + } + } + binary.BigEndian.PutUint16(bytes[4:], u.Length) + if opts.ComputeChecksums { + // zero out checksum bytes + bytes[6] = 0 + bytes[7] = 0 + csum, err := u.computeChecksum(b.Bytes(), IPProtocolUDP) + if err != nil { + return err + } + u.Checksum = csum + } + binary.BigEndian.PutUint16(bytes[6:], u.Checksum) + return nil +} + +func (u *UDP) CanDecode() gopacket.LayerClass { + return LayerTypeUDP +} + +// NextLayerType use the destination port to select the +// right next decoder. It tries first to decode via the +// destination port, then the source port. +func (u *UDP) NextLayerType() gopacket.LayerType { + if lt := u.DstPort.LayerType(); lt != gopacket.LayerTypePayload { + return lt + } + return u.SrcPort.LayerType() +} + +func decodeUDP(data []byte, p gopacket.PacketBuilder) error { + udp := &UDP{} + err := udp.DecodeFromBytes(data, p) + p.AddLayer(udp) + p.SetTransportLayer(udp) + if err != nil { + return err + } + return p.NextDecoder(udp.NextLayerType()) +} + +func (u *UDP) TransportFlow() gopacket.Flow { + return gopacket.NewFlow(EndpointUDPPort, u.sPort, u.dPort) +} diff --git a/vendor/github.com/google/gopacket/layers/udp_test.go b/vendor/github.com/google/gopacket/layers/udp_test.go new file mode 100644 index 0000000..e71236c --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/udp_test.go @@ -0,0 +1,372 @@ +// Copyright 2012, Google, Inc. All rights reserved. +// Copyright 2009-2011 Andreas Krennmair. 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 layers + +import ( + "reflect" + "testing" + + "github.com/google/gopacket" +) + +// testUDPPacketDNS is the packet: +// 10:33:07.883637 IP 172.16.255.1.53 > 172.29.20.15.35181: 47320 7/0/0 MX ALT2.ASPMX.L.GOOGLE.com. 20, MX ASPMX2.GOOGLEMAIL.com. 30, MX ASPMX3.GOOGLEMAIL.com. 30, MX ASPMX4.GOOGLEMAIL.com. 30, MX ASPMX5.GOOGLEMAIL.com. 30, MX ASPMX.L.GOOGLE.com. 10, MX ALT1.ASPMX.L.GOOGLE.com. 20 (202) +// 0x0000: 24be 0527 0b17 001f cab3 75c0 0800 4500 $..'......u...E. +// 0x0010: 00e6 68cf 0000 3f11 a6f9 ac10 ff01 ac1d ..h...?......... +// 0x0020: 140f 0035 896d 00d2 754a b8d8 8180 0001 ...5.m..uJ...... +// 0x0030: 0007 0000 0000 0478 6b63 6403 636f 6d00 .......xkcd.com. +// 0x0040: 000f 0001 c00c 000f 0001 0000 0258 0018 .............X.. +// 0x0050: 0014 0441 4c54 3205 4153 504d 5801 4c06 ...ALT2.ASPMX.L. +// 0x0060: 474f 4f47 4c45 c011 c00c 000f 0001 0000 GOOGLE.......... +// 0x0070: 0258 0016 001e 0641 5350 4d58 320a 474f .X.....ASPMX2.GO +// 0x0080: 4f47 4c45 4d41 494c c011 c00c 000f 0001 OGLEMAIL........ +// 0x0090: 0000 0258 000b 001e 0641 5350 4d58 33c0 ...X.....ASPMX3. +// 0x00a0: 53c0 0c00 0f00 0100 0002 5800 0b00 1e06 S.........X..... +// 0x00b0: 4153 504d 5834 c053 c00c 000f 0001 0000 ASPMX4.S........ +// 0x00c0: 0258 000b 001e 0641 5350 4d58 35c0 53c0 .X.....ASPMX5.S. +// 0x00d0: 0c00 0f00 0100 0002 5800 0400 0ac0 2dc0 ........X.....-. +// 0x00e0: 0c00 0f00 0100 0002 5800 0900 1404 414c ........X.....AL +// 0x00f0: 5431 c02d T1.- +// Packet generated by doing DNS query for 'xkcd.com' +var testUDPPacketDNS = []byte{ + 0x24, 0xbe, 0x05, 0x27, 0x0b, 0x17, 0x00, 0x1f, 0xca, 0xb3, 0x75, 0xc0, 0x08, 0x00, 0x45, 0x00, + 0x00, 0xe6, 0x68, 0xcf, 0x00, 0x00, 0x3f, 0x11, 0xa6, 0xf9, 0xac, 0x10, 0xff, 0x01, 0xac, 0x1d, + 0x14, 0x0f, 0x00, 0x35, 0x89, 0x6d, 0x00, 0xd2, 0x75, 0x4a, 0xb8, 0xd8, 0x81, 0x80, 0x00, 0x01, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x04, 0x78, 0x6b, 0x63, 0x64, 0x03, 0x63, 0x6f, 0x6d, 0x00, + 0x00, 0x0f, 0x00, 0x01, 0xc0, 0x0c, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x02, 0x58, 0x00, 0x18, + 0x00, 0x14, 0x04, 0x41, 0x4c, 0x54, 0x32, 0x05, 0x41, 0x53, 0x50, 0x4d, 0x58, 0x01, 0x4c, 0x06, + 0x47, 0x4f, 0x4f, 0x47, 0x4c, 0x45, 0xc0, 0x11, 0xc0, 0x0c, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, + 0x02, 0x58, 0x00, 0x16, 0x00, 0x1e, 0x06, 0x41, 0x53, 0x50, 0x4d, 0x58, 0x32, 0x0a, 0x47, 0x4f, + 0x4f, 0x47, 0x4c, 0x45, 0x4d, 0x41, 0x49, 0x4c, 0xc0, 0x11, 0xc0, 0x0c, 0x00, 0x0f, 0x00, 0x01, + 0x00, 0x00, 0x02, 0x58, 0x00, 0x0b, 0x00, 0x1e, 0x06, 0x41, 0x53, 0x50, 0x4d, 0x58, 0x33, 0xc0, + 0x53, 0xc0, 0x0c, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x02, 0x58, 0x00, 0x0b, 0x00, 0x1e, 0x06, + 0x41, 0x53, 0x50, 0x4d, 0x58, 0x34, 0xc0, 0x53, 0xc0, 0x0c, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, + 0x02, 0x58, 0x00, 0x0b, 0x00, 0x1e, 0x06, 0x41, 0x53, 0x50, 0x4d, 0x58, 0x35, 0xc0, 0x53, 0xc0, + 0x0c, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x02, 0x58, 0x00, 0x04, 0x00, 0x0a, 0xc0, 0x2d, 0xc0, + 0x0c, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x02, 0x58, 0x00, 0x09, 0x00, 0x14, 0x04, 0x41, 0x4c, + 0x54, 0x31, 0xc0, 0x2d, +} + +func TestUDPPacketDNS(t *testing.T) { + p := gopacket.NewPacket(testUDPPacketDNS, LinkTypeEthernet, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeEthernet, LayerTypeIPv4, LayerTypeUDP, LayerTypeDNS}, t) + if got, ok := p.TransportLayer().(*UDP); ok { + want := &UDP{ + BaseLayer: BaseLayer{ + Contents: []byte{0x0, 0x35, 0x89, 0x6d, 0x0, 0xd2, 0x75, 0x4a}, + Payload: []byte{0xb8, 0xd8, 0x81, 0x80, 0x0, 0x1, 0x0, + 0x7, 0x0, 0x0, 0x0, 0x0, 0x4, 0x78, 0x6b, 0x63, 0x64, 0x3, 0x63, 0x6f, + 0x6d, 0x0, 0x0, 0xf, 0x0, 0x1, 0xc0, 0xc, 0x0, 0xf, 0x0, 0x1, 0x0, 0x0, + 0x2, 0x58, 0x0, 0x18, 0x0, 0x14, 0x4, 0x41, 0x4c, 0x54, 0x32, 0x5, 0x41, + 0x53, 0x50, 0x4d, 0x58, 0x1, 0x4c, 0x6, 0x47, 0x4f, 0x4f, 0x47, 0x4c, + 0x45, 0xc0, 0x11, 0xc0, 0xc, 0x0, 0xf, 0x0, 0x1, 0x0, 0x0, 0x2, 0x58, 0x0, + 0x16, 0x0, 0x1e, 0x6, 0x41, 0x53, 0x50, 0x4d, 0x58, 0x32, 0xa, 0x47, 0x4f, + 0x4f, 0x47, 0x4c, 0x45, 0x4d, 0x41, 0x49, 0x4c, 0xc0, 0x11, 0xc0, 0xc, + 0x0, 0xf, 0x0, 0x1, 0x0, 0x0, 0x2, 0x58, 0x0, 0xb, 0x0, 0x1e, 0x6, 0x41, + 0x53, 0x50, 0x4d, 0x58, 0x33, 0xc0, 0x53, 0xc0, 0xc, 0x0, 0xf, 0x0, 0x1, + 0x0, 0x0, 0x2, 0x58, 0x0, 0xb, 0x0, 0x1e, 0x6, 0x41, 0x53, 0x50, 0x4d, + 0x58, 0x34, 0xc0, 0x53, 0xc0, 0xc, 0x0, 0xf, 0x0, 0x1, 0x0, 0x0, 0x2, + 0x58, 0x0, 0xb, 0x0, 0x1e, 0x6, 0x41, 0x53, 0x50, 0x4d, 0x58, 0x35, 0xc0, + 0x53, 0xc0, 0xc, 0x0, 0xf, 0x0, 0x1, 0x0, 0x0, 0x2, 0x58, 0x0, 0x4, 0x0, + 0xa, 0xc0, 0x2d, 0xc0, 0xc, 0x0, 0xf, 0x0, 0x1, 0x0, 0x0, 0x2, 0x58, 0x0, + 0x9, 0x0, 0x14, 0x4, 0x41, 0x4c, 0x54, 0x31, 0xc0, 0x2d}, + }, + SrcPort: 53, + DstPort: 35181, + Length: 210, + Checksum: 30026, + sPort: []byte{0x0, 0x35}, + dPort: []byte{0x89, 0x6d}, + } + if !reflect.DeepEqual(got, want) { + t.Errorf("UDP packet mismatch:\ngot :\n%#v\n\nwant :\n%#v\n\n", got, want) + } + } else { + t.Error("Transport layer packet not UDP") + } +} + +func loadDNS(dnspacket []byte, t *testing.T) *DNS { + p := gopacket.NewPacket(dnspacket, LinkTypeEthernet, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeEthernet, LayerTypeIPv4, + LayerTypeUDP, LayerTypeDNS}, t) + + dnsL := p.Layer(LayerTypeDNS) + if dnsL == nil { + t.Error("No DNS Layer found") + } + + dns, ok := dnsL.(*DNS) + if !ok { + return nil + } + return dns +} + +var testDNSQueryA = []byte{ + 0xfe, 0x54, 0x00, 0x3e, 0x00, 0x96, 0x52, 0x54, /* .T.>..RT */ + 0x00, 0xbd, 0x1c, 0x70, 0x08, 0x00, 0x45, 0x00, /* ...p..E. */ + 0x00, 0x3c, 0x22, 0xe0, 0x00, 0x00, 0x40, 0x11, /* .<"...@. */ + 0xe2, 0x38, 0xc0, 0xa8, 0x7a, 0x46, 0xc0, 0xa8, /* .8..zF.. */ + 0x7a, 0x01, 0xc3, 0x35, 0x00, 0x35, 0x00, 0x28, /* z..5.5.( */ + 0x75, 0xd2, 0x52, 0x41, 0x01, 0x00, 0x00, 0x01, /* u.RA.... */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x77, /* .......w */ + 0x77, 0x77, 0x06, 0x67, 0x6f, 0x6f, 0x67, 0x6c, /* ww.googl */ + 0x65, 0x03, 0x63, 0x6f, 0x6d, 0x00, 0x00, 0x01, /* e.com... */ + 0x00, 0x01, /* .. */ +} + +func TestDNSQueryA(t *testing.T) { + dns := loadDNS(testDNSQueryA, t) + if dns == nil { + t.Fatal("Failed to get a pointer to DNS struct") + } + + if uint16(len(dns.Questions)) != dns.QDCount { + t.Fatal("Invalid query decoding, not the right number of questions") + } + + if string(dns.Questions[0].Name) != "www.google.com" { + t.Errorf("Invalid query decoding, expecting 'www.google.com', got '%s'", + dns.Questions[0].Name) + } + if dns.Questions[0].Class != DNSClassIN { + t.Errorf("Invalid query decoding, expecting Class IN, got '%d'", + dns.Questions[0].Class) + } + + if dns.Questions[0].Type != DNSTypeA { + t.Errorf("Invalid query decoding, expecting Type A, got '%d'", + dns.Questions[0].Type) + } +} + +var testDNSRRA = []byte{ + 0x52, 0x54, 0x00, 0xbd, 0x1c, 0x70, 0xfe, 0x54, /* RT...p.T */ + 0x00, 0x3e, 0x00, 0x96, 0x08, 0x00, 0x45, 0x00, /* .>....E. */ + 0x01, 0x24, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, /* .$..@.@. */ + 0xc4, 0x30, 0xc0, 0xa8, 0x7a, 0x01, 0xc0, 0xa8, /* .0..z... */ + 0x7a, 0x46, 0x00, 0x35, 0xc3, 0x35, 0x01, 0x10, /* zF.5.5.. */ + 0x76, 0xba, 0x52, 0x41, 0x81, 0x80, 0x00, 0x01, /* v.RA.... */ + 0x00, 0x06, 0x00, 0x04, 0x00, 0x04, 0x03, 0x77, /* .......w */ + 0x77, 0x77, 0x06, 0x67, 0x6f, 0x6f, 0x67, 0x6c, /* ww.googl */ + 0x65, 0x03, 0x63, 0x6f, 0x6d, 0x00, 0x00, 0x01, /* e.com... */ + 0x00, 0x01, 0xc0, 0x0c, 0x00, 0x01, 0x00, 0x01, /* ........ */ + 0x00, 0x00, 0x01, 0x2c, 0x00, 0x04, 0x4a, 0x7d, /* ...,..J} */ + 0xc3, 0x67, 0xc0, 0x0c, 0x00, 0x01, 0x00, 0x01, /* .g...... */ + 0x00, 0x00, 0x01, 0x2c, 0x00, 0x04, 0x4a, 0x7d, /* ...,..J} */ + 0xc3, 0x68, 0xc0, 0x0c, 0x00, 0x01, 0x00, 0x01, /* .h...... */ + 0x00, 0x00, 0x01, 0x2c, 0x00, 0x04, 0x4a, 0x7d, /* ...,..J} */ + 0xc3, 0x69, 0xc0, 0x0c, 0x00, 0x01, 0x00, 0x01, /* .i...... */ + 0x00, 0x00, 0x01, 0x2c, 0x00, 0x04, 0x4a, 0x7d, /* ...,..J} */ + 0xc3, 0x6a, 0xc0, 0x0c, 0x00, 0x01, 0x00, 0x01, /* .j...... */ + 0x00, 0x00, 0x01, 0x2c, 0x00, 0x04, 0x4a, 0x7d, /* ...,..J} */ + 0xc3, 0x93, 0xc0, 0x0c, 0x00, 0x01, 0x00, 0x01, /* ........ */ + 0x00, 0x00, 0x01, 0x2c, 0x00, 0x04, 0x4a, 0x7d, /* ...,..J} */ + 0xc3, 0x63, 0xc0, 0x10, 0x00, 0x02, 0x00, 0x01, /* .c...... */ + 0x00, 0x02, 0xa3, 0x00, 0x00, 0x06, 0x03, 0x6e, /* .......n */ + 0x73, 0x32, 0xc0, 0x10, 0xc0, 0x10, 0x00, 0x02, /* s2...... */ + 0x00, 0x01, 0x00, 0x02, 0xa3, 0x00, 0x00, 0x06, /* ........ */ + 0x03, 0x6e, 0x73, 0x33, 0xc0, 0x10, 0xc0, 0x10, /* .ns3.... */ + 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0xa3, 0x00, /* ........ */ + 0x00, 0x06, 0x03, 0x6e, 0x73, 0x31, 0xc0, 0x10, /* ...ns1.. */ + 0xc0, 0x10, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, /* ........ */ + 0xa3, 0x00, 0x00, 0x06, 0x03, 0x6e, 0x73, 0x34, /* .....ns4 */ + 0xc0, 0x10, 0xc0, 0xb0, 0x00, 0x01, 0x00, 0x01, /* ........ */ + 0x00, 0x02, 0xa3, 0x00, 0x00, 0x04, 0xd8, 0xef, /* ........ */ + 0x20, 0x0a, 0xc0, 0x8c, 0x00, 0x01, 0x00, 0x01, /* ....... */ + 0x00, 0x02, 0xa3, 0x00, 0x00, 0x04, 0xd8, 0xef, /* ........ */ + 0x22, 0x0a, 0xc0, 0x9e, 0x00, 0x01, 0x00, 0x01, /* "....... */ + 0x00, 0x02, 0xa3, 0x00, 0x00, 0x04, 0xd8, 0xef, /* ........ */ + 0x24, 0x0a, 0xc0, 0xc2, 0x00, 0x01, 0x00, 0x01, /* $....... */ + 0x00, 0x02, 0xa3, 0x00, 0x00, 0x04, 0xd8, 0xef, /* ........ */ + 0x26, 0x0a, /* &. */ +} + +func TestDNSRRA(t *testing.T) { + dns := loadDNS(testDNSRRA, t) + if dns == nil { + t.Fatal("Failed to get a pointer to DNS struct") + return + } + + if uint16(len(dns.Questions)) != dns.QDCount { + t.Fatal("Invalid query decoding, not the right number of questions") + } else if uint16(len(dns.Answers)) != dns.ANCount { + t.Fatal("Invalid query decoding, not the right number of answers") + } else if uint16(len(dns.Authorities)) != dns.NSCount { + t.Fatal("Invalid query decoding, not the right number of authorities") + } else if uint16(len(dns.Additionals)) != dns.ARCount { + t.Fatal("Invalid query decoding, not the right number of additionals info") + } + + if string(dns.Questions[0].Name) != "www.google.com" { + t.Errorf("Invalid query decoding, expecting 'www.google.com', got '%s'", + dns.Questions[0].Name) + } + if string(dns.Answers[0].Name) != "www.google.com" { + t.Errorf("Invalid query decoding, expecting 'www.google.com', got '%d'", + dns.Questions[0].Class) + } + if dns.Answers[0].Class != DNSClassIN { + t.Errorf("Invalid query decoding, expecting Class IN, got '%d'", + dns.Questions[0].Class) + } + if dns.Answers[0].Type != DNSTypeA { + t.Errorf("Invalid query decoding, expecting Type A, got '%d'", + dns.Questions[0].Type) + } + if !dns.Answers[0].IP.Equal([]byte{74, 125, 195, 103}) { + t.Errorf("Invalid query decoding, invalid IP address,"+ + " expecting '74.125.195.103', got '%s'", + dns.Answers[0].IP.String()) + } + if len(dns.Answers) != 6 { + t.Errorf("No correct number of answers, expecting 6, go '%d'", + len(dns.Answers)) + } + if len(dns.Authorities) != 4 { + t.Errorf("No correct number of answers, expecting 4, go '%d'", + len(dns.Answers)) + } + if len(dns.Additionals) != 4 { + t.Errorf("No correct number of answers, expecting 4, go '%d'", + len(dns.Answers)) + } else { + for i, want := range []string{ + "ns1.google.com", + "ns2.google.com", + "ns3.google.com", + "ns4.google.com", + } { + if got := string(dns.Additionals[i].Name); got != want { + t.Errorf("got %q want %q", got, want) + } + } + } +} + +var testDNSAAAA = []byte{ + 0x52, 0x54, 0x00, 0xbd, 0x1c, 0x70, 0xfe, 0x54, /* RT...p.T */ + 0x00, 0x3e, 0x00, 0x96, 0x08, 0x00, 0x45, 0x00, /* .>....E. */ + 0x00, 0xe0, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, /* ....@.@. */ + 0xc4, 0x74, 0xc0, 0xa8, 0x7a, 0x01, 0xc0, 0xa8, /* .t..z... */ + 0x7a, 0x46, 0x00, 0x35, 0xdb, 0x13, 0x00, 0xcc, /* zF.5.... */ + 0x76, 0x76, 0xf3, 0x03, 0x81, 0x80, 0x00, 0x01, /* vv...... */ + 0x00, 0x01, 0x00, 0x04, 0x00, 0x04, 0x03, 0x77, /* .......w */ + 0x77, 0x77, 0x06, 0x67, 0x6f, 0x6f, 0x67, 0x6c, /* ww.googl */ + 0x65, 0x03, 0x63, 0x6f, 0x6d, 0x00, 0x00, 0x1c, /* e.com... */ + 0x00, 0x01, 0xc0, 0x0c, 0x00, 0x1c, 0x00, 0x01, /* ........ */ + 0x00, 0x00, 0x01, 0x2c, 0x00, 0x10, 0x2a, 0x00, /* ...,..*. */ + 0x14, 0x50, 0x40, 0x0c, 0x0c, 0x01, 0x00, 0x00, /* .P@..... */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0xc0, 0x10, /* .....i.. */ + 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0xa3, 0x00, /* ........ */ + 0x00, 0x06, 0x03, 0x6e, 0x73, 0x34, 0xc0, 0x10, /* ...ns4.. */ + 0xc0, 0x10, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, /* ........ */ + 0xa3, 0x00, 0x00, 0x06, 0x03, 0x6e, 0x73, 0x32, /* .....ns2 */ + 0xc0, 0x10, 0xc0, 0x10, 0x00, 0x02, 0x00, 0x01, /* ........ */ + 0x00, 0x02, 0xa3, 0x00, 0x00, 0x06, 0x03, 0x6e, /* .......n */ + 0x73, 0x31, 0xc0, 0x10, 0xc0, 0x10, 0x00, 0x02, /* s1...... */ + 0x00, 0x01, 0x00, 0x02, 0xa3, 0x00, 0x00, 0x06, /* ........ */ + 0x03, 0x6e, 0x73, 0x33, 0xc0, 0x10, 0xc0, 0x6c, /* .ns3...l */ + 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0xa3, 0x00, /* ........ */ + 0x00, 0x04, 0xd8, 0xef, 0x20, 0x0a, 0xc0, 0x5a, /* .... ..Z */ + 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0xa3, 0x00, /* ........ */ + 0x00, 0x04, 0xd8, 0xef, 0x22, 0x0a, 0xc0, 0x7e, /* ...."..~ */ + 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0xa3, 0x00, /* ........ */ + 0x00, 0x04, 0xd8, 0xef, 0x24, 0x0a, 0xc0, 0x48, /* ....$..H */ + 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0xa3, 0x00, /* ........ */ + 0x00, 0x04, 0xd8, 0xef, 0x26, 0x0a, /* ....&. */ +} + +func TestDNSAAAA(t *testing.T) { + dns := loadDNS(testDNSAAAA, t) + if dns == nil { + t.Error("Failed to get a pointer to DNS struct") + return + } + + if len(dns.Questions) != 1 { + t.Error("Invalid number of question") + return + } + if dns.Questions[0].Type != DNSTypeAAAA { + t.Errorf("Invalid question, Type is not AAAA, found %d", + dns.Questions[0].Type) + } + + if len(dns.Answers) != 1 { + t.Error("Invalid number of answers") + } + if !dns.Answers[0].IP.Equal([]byte{0x2a, 0x00, 0x14, 0x50, 0x40, + 0x0c, 0x0c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69}) { + t.Error("Invalid IP address, found ", + dns.Answers[0].IP.String()) + } +} + +var testDNSMXSOA = []byte{ + 0x52, 0x54, 0x00, 0xbd, 0x1c, 0x70, 0xfe, 0x54, /* RT...p.T */ + 0x00, 0x3e, 0x00, 0x96, 0x08, 0x00, 0x45, 0x00, /* .>....E. */ + 0x00, 0x6e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, /* .n..@.@. */ + 0xc4, 0xe6, 0xc0, 0xa8, 0x7a, 0x01, 0xc0, 0xa8, /* ....z... */ + 0x7a, 0x46, 0x00, 0x35, 0x9c, 0x60, 0x00, 0x5a, /* zF.5.`.Z */ + 0x76, 0x04, 0xfc, 0x7a, 0x81, 0x80, 0x00, 0x01, /* v..z.... */ + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x77, /* .......w */ + 0x77, 0x77, 0x06, 0x67, 0x6f, 0x6f, 0x67, 0x6c, /* ww.googl */ + 0x65, 0x03, 0x63, 0x6f, 0x6d, 0x00, 0x00, 0x0f, /* e.com... */ + 0x00, 0x01, 0xc0, 0x10, 0x00, 0x06, 0x00, 0x01, /* ........ */ + 0x00, 0x00, 0x00, 0x3c, 0x00, 0x26, 0x03, 0x6e, /* ...<.&.n */ + 0x73, 0x31, 0xc0, 0x10, 0x09, 0x64, 0x6e, 0x73, /* s1...dns */ + 0x2d, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0xc0, 0x10, /* -admin.. */ + 0x00, 0x17, 0x9f, 0x64, 0x00, 0x00, 0x1c, 0x20, /* ...d... */ + 0x00, 0x00, 0x07, 0x08, 0x00, 0x12, 0x75, 0x00, /* ......u. */ + 0x00, 0x00, 0x01, 0x2c, /* ..., */ +} + +func TestDNSMXSOA(t *testing.T) { + dns := loadDNS(testDNSMXSOA, t) + if dns == nil { + t.Error("Failed to get a pointer to DNS struct") + return + } + + if len(dns.Authorities) != 1 { + t.Error("Invalid number of authoritative answers, found ", + len(dns.Authorities)) + return + } +} + +func BenchmarkDecodeDNS(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testDNSQueryA, LinkTypeEthernet, gopacket.NoCopy) + } +} +func BenchmarkDecodeDNSLayer(b *testing.B) { + var dns DNS + for i := 0; i < b.N; i++ { + dns.DecodeFromBytes(testDNSAAAA[ /*eth*/ 14+ /*ipv4*/ 20+ /*udp*/ 8:], gopacket.NilDecodeFeedback) + } +} +func TestDNSDoesNotMalloc(t *testing.T) { + var dns DNS + if n := testing.AllocsPerRun(1000, func() { + if err := dns.DecodeFromBytes(testDNSAAAA[ /*eth*/ 14+ /*ipv4*/ 20+ /*udp*/ 8:], gopacket.NilDecodeFeedback); err != nil { + t.Fatal(err) + } + }); n > 0 { + t.Error(n, "mallocs decoding DNS") + } +} diff --git a/vendor/github.com/google/gopacket/layers/udplite.go b/vendor/github.com/google/gopacket/layers/udplite.go new file mode 100644 index 0000000..7d84c51 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/udplite.go @@ -0,0 +1,44 @@ +// Copyright 2012 Google, Inc. All rights reserved. +// Copyright 2009-2011 Andreas Krennmair. 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 layers + +import ( + "encoding/binary" + "github.com/google/gopacket" +) + +// UDPLite is the layer for UDP-Lite headers (rfc 3828). +type UDPLite struct { + BaseLayer + SrcPort, DstPort UDPLitePort + ChecksumCoverage uint16 + Checksum uint16 + sPort, dPort []byte +} + +// LayerType returns gopacket.LayerTypeUDPLite +func (u *UDPLite) LayerType() gopacket.LayerType { return LayerTypeUDPLite } + +func decodeUDPLite(data []byte, p gopacket.PacketBuilder) error { + udp := &UDPLite{ + SrcPort: UDPLitePort(binary.BigEndian.Uint16(data[0:2])), + sPort: data[0:2], + DstPort: UDPLitePort(binary.BigEndian.Uint16(data[2:4])), + dPort: data[2:4], + ChecksumCoverage: binary.BigEndian.Uint16(data[4:6]), + Checksum: binary.BigEndian.Uint16(data[6:8]), + BaseLayer: BaseLayer{data[:8], data[8:]}, + } + p.AddLayer(udp) + p.SetTransportLayer(udp) + return p.NextDecoder(gopacket.LayerTypePayload) +} + +func (u *UDPLite) TransportFlow() gopacket.Flow { + return gopacket.NewFlow(EndpointUDPLitePort, u.sPort, u.dPort) +} diff --git a/vendor/github.com/google/gopacket/layers/usb.go b/vendor/github.com/google/gopacket/layers/usb.go new file mode 100644 index 0000000..d4f483c --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/usb.go @@ -0,0 +1,308 @@ +// Copyright 2014 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 layers + +import ( + "encoding/binary" + "github.com/google/gopacket" +) + +type USBEventType uint8 + +const ( + USBEventTypeSubmit USBEventType = 'S' + USBEventTypeComplete USBEventType = 'C' + USBEventTypeError USBEventType = 'E' +) + +func (a USBEventType) String() string { + switch a { + case USBEventTypeSubmit: + return "SUBMIT" + case USBEventTypeComplete: + return "COMPLETE" + case USBEventTypeError: + return "ERROR" + default: + return "Unknown event type" + } +} + +type USBRequestBlockSetupRequest uint8 + +const ( + USBRequestBlockSetupRequestGetStatus USBRequestBlockSetupRequest = 0x00 + USBRequestBlockSetupRequestClearFeature USBRequestBlockSetupRequest = 0x01 + USBRequestBlockSetupRequestSetFeature USBRequestBlockSetupRequest = 0x03 + USBRequestBlockSetupRequestSetAddress USBRequestBlockSetupRequest = 0x05 + USBRequestBlockSetupRequestGetDescriptor USBRequestBlockSetupRequest = 0x06 + USBRequestBlockSetupRequestSetDescriptor USBRequestBlockSetupRequest = 0x07 + USBRequestBlockSetupRequestGetConfiguration USBRequestBlockSetupRequest = 0x08 + USBRequestBlockSetupRequestSetConfiguration USBRequestBlockSetupRequest = 0x09 + USBRequestBlockSetupRequestSetIdle USBRequestBlockSetupRequest = 0x0a +) + +func (a USBRequestBlockSetupRequest) String() string { + switch a { + case USBRequestBlockSetupRequestGetStatus: + return "GET_STATUS" + case USBRequestBlockSetupRequestClearFeature: + return "CLEAR_FEATURE" + case USBRequestBlockSetupRequestSetFeature: + return "SET_FEATURE" + case USBRequestBlockSetupRequestSetAddress: + return "SET_ADDRESS" + case USBRequestBlockSetupRequestGetDescriptor: + return "GET_DESCRIPTOR" + case USBRequestBlockSetupRequestSetDescriptor: + return "SET_DESCRIPTOR" + case USBRequestBlockSetupRequestGetConfiguration: + return "GET_CONFIGURATION" + case USBRequestBlockSetupRequestSetConfiguration: + return "SET_CONFIGURATION" + case USBRequestBlockSetupRequestSetIdle: + return "SET_IDLE" + default: + return "UNKNOWN" + } +} + +type USBTransportType uint8 + +const ( + USBTransportTypeTransferIn USBTransportType = 0x80 // Indicates send or receive + USBTransportTypeIsochronous USBTransportType = 0x00 // Isochronous transfers occur continuously and periodically. They typically contain time sensitive information, such as an audio or video stream. + USBTransportTypeInterrupt USBTransportType = 0x01 // Interrupt transfers are typically non-periodic, small device "initiated" communication requiring bounded latency, such as pointing devices or keyboards. + USBTransportTypeControl USBTransportType = 0x02 // Control transfers are typically used for command and status operations. + USBTransportTypeBulk USBTransportType = 0x03 // Bulk transfers can be used for large bursty data, using all remaining available bandwidth, no guarantees on bandwidth or latency, such as file transfers. +) + +func (a USBTransportType) LayerType() gopacket.LayerType { + return USBTypeMetadata[a].LayerType +} + +func (a USBTransportType) String() string { + switch a { + case USBTransportTypeTransferIn: + return "Transfer In" + case USBTransportTypeIsochronous: + return "Isochronous" + case USBTransportTypeInterrupt: + return "Interrupt" + case USBTransportTypeControl: + return "Control" + case USBTransportTypeBulk: + return "Bulk" + default: + return "Unknown transport type" + } +} + +type USBDirectionType uint8 + +const ( + USBDirectionTypeUnknown USBDirectionType = iota + USBDirectionTypeIn + USBDirectionTypeOut +) + +func (a USBDirectionType) String() string { + switch a { + case USBDirectionTypeIn: + return "In" + case USBDirectionTypeOut: + return "Out" + default: + return "Unknown direction type" + } +} + +// The reference at http://www.beyondlogic.org/usbnutshell/usb1.shtml contains more information about the protocol. +type USB struct { + BaseLayer + ID uint64 + EventType USBEventType + TransferType USBTransportType + Direction USBDirectionType + EndpointNumber uint8 + DeviceAddress uint8 + BusID uint16 + TimestampSec int64 + TimestampUsec int32 + Setup bool + Data bool + Status int32 + UrbLength uint32 + UrbDataLength uint32 + + UrbInterval uint32 + UrbStartFrame uint32 + UrbCopyOfTransferFlags uint32 + IsoNumDesc uint32 +} + +func (u *USB) LayerType() gopacket.LayerType { return LayerTypeUSB } + +func (m *USB) NextLayerType() gopacket.LayerType { + if m.Setup { + return LayerTypeUSBRequestBlockSetup + } else if m.Data { + } + + return m.TransferType.LayerType() +} + +func decodeUSB(data []byte, p gopacket.PacketBuilder) error { + d := &USB{} + + return decodingLayerDecoder(d, data, p) +} + +func (m *USB) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + m.ID = binary.LittleEndian.Uint64(data[0:8]) + m.EventType = USBEventType(data[8]) + m.TransferType = USBTransportType(data[9]) + + m.EndpointNumber = data[10] & 0x7f + if data[10]&uint8(USBTransportTypeTransferIn) > 0 { + m.Direction = USBDirectionTypeIn + } else { + m.Direction = USBDirectionTypeOut + } + + m.DeviceAddress = data[11] + m.BusID = binary.LittleEndian.Uint16(data[12:14]) + + if uint(data[14]) == 0 { + m.Setup = true + } + + if uint(data[15]) == 0 { + m.Data = true + } + + m.TimestampSec = int64(binary.LittleEndian.Uint64(data[16:24])) + m.TimestampUsec = int32(binary.LittleEndian.Uint32(data[24:28])) + m.Status = int32(binary.LittleEndian.Uint32(data[28:32])) + m.UrbLength = binary.LittleEndian.Uint32(data[32:36]) + m.UrbDataLength = binary.LittleEndian.Uint32(data[36:40]) + + m.Contents = data[:40] + m.Payload = data[40:] + + if m.Setup { + m.Payload = data[40:] + } else if m.Data { + m.Payload = data[uint32(len(data))-m.UrbDataLength:] + } + + // if 64 bit, dissect_linux_usb_pseudo_header_ext + if false { + m.UrbInterval = binary.LittleEndian.Uint32(data[40:44]) + m.UrbStartFrame = binary.LittleEndian.Uint32(data[44:48]) + m.UrbDataLength = binary.LittleEndian.Uint32(data[48:52]) + m.IsoNumDesc = binary.LittleEndian.Uint32(data[52:56]) + m.Contents = data[:56] + m.Payload = data[56:] + } + + // crc5 or crc16 + // eop (end of packet) + + return nil +} + +type USBRequestBlockSetup struct { + BaseLayer + RequestType uint8 + Request USBRequestBlockSetupRequest + Value uint16 + Index uint16 + Length uint16 +} + +func (u *USBRequestBlockSetup) LayerType() gopacket.LayerType { return LayerTypeUSBRequestBlockSetup } + +func (m *USBRequestBlockSetup) NextLayerType() gopacket.LayerType { + return gopacket.LayerTypePayload +} + +func (m *USBRequestBlockSetup) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + m.RequestType = data[0] + m.Request = USBRequestBlockSetupRequest(data[1]) + m.Value = binary.LittleEndian.Uint16(data[2:4]) + m.Index = binary.LittleEndian.Uint16(data[4:6]) + m.Length = binary.LittleEndian.Uint16(data[6:8]) + m.Contents = data[:8] + m.Payload = data[8:] + return nil +} + +func decodeUSBRequestBlockSetup(data []byte, p gopacket.PacketBuilder) error { + d := &USBRequestBlockSetup{} + return decodingLayerDecoder(d, data, p) +} + +type USBControl struct { + BaseLayer +} + +func (u *USBControl) LayerType() gopacket.LayerType { return LayerTypeUSBControl } + +func (m *USBControl) NextLayerType() gopacket.LayerType { + return gopacket.LayerTypePayload +} + +func (m *USBControl) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + m.Contents = data + return nil +} + +func decodeUSBControl(data []byte, p gopacket.PacketBuilder) error { + d := &USBControl{} + return decodingLayerDecoder(d, data, p) +} + +type USBInterrupt struct { + BaseLayer +} + +func (u *USBInterrupt) LayerType() gopacket.LayerType { return LayerTypeUSBInterrupt } + +func (m *USBInterrupt) NextLayerType() gopacket.LayerType { + return gopacket.LayerTypePayload +} + +func (m *USBInterrupt) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + m.Contents = data + return nil +} + +func decodeUSBInterrupt(data []byte, p gopacket.PacketBuilder) error { + d := &USBInterrupt{} + return decodingLayerDecoder(d, data, p) +} + +type USBBulk struct { + BaseLayer +} + +func (u *USBBulk) LayerType() gopacket.LayerType { return LayerTypeUSBBulk } + +func (m *USBBulk) NextLayerType() gopacket.LayerType { + return gopacket.LayerTypePayload +} + +func (m *USBBulk) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + m.Contents = data + return nil +} + +func decodeUSBBulk(data []byte, p gopacket.PacketBuilder) error { + d := &USBBulk{} + return decodingLayerDecoder(d, data, p) +} diff --git a/vendor/github.com/google/gopacket/layers/usb_test.go b/vendor/github.com/google/gopacket/layers/usb_test.go new file mode 100644 index 0000000..35e9c70 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/usb_test.go @@ -0,0 +1,73 @@ +// Copyright 2014, 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 layers + +import ( + _ "fmt" + "github.com/google/gopacket" + "reflect" + "testing" +) + +// Generator python layers/test_creator.py --link_type USB --name USB dongle.pcap +// http://wiki.wireshark.org/SampleCaptures#Sample_Captures + +// testPacketUSB0 is the packet: +// 02:41:04.689546 INTERRUPT COMPLETE to 2:1:1 +// 0x0000: 0038 4a3b 0088 ffff 4301 8101 0200 2d00 .8J;....C.....-. +// 0x0010: c0d3 5b50 0000 0000 8a85 0a00 0000 0000 ..[P............ +// 0x0020: 0100 0000 0100 0000 0000 0000 0000 0000 ................ +// 0x0030: 8000 0000 0000 0000 0002 0000 0000 0000 ................ +// 0x0040: 04 . +var testPacketUSB0 = []byte{ + 0x00, 0x38, 0x4a, 0x3b, 0x00, 0x88, 0xff, 0xff, 0x43, 0x01, 0x81, 0x01, 0x02, 0x00, 0x2d, 0x00, + 0xc0, 0xd3, 0x5b, 0x50, 0x00, 0x00, 0x00, 0x00, 0x8a, 0x85, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, +} + +func TestPacketUSB0(t *testing.T) { + p := gopacket.NewPacket(testPacketUSB0, LinkTypeLinuxUSB, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeUSB, LayerTypeUSBInterrupt}, t) + + if got, ok := p.Layer(LayerTypeUSB).(*USB); ok { + want := &USB{ + BaseLayer: BaseLayer{ + Contents: []uint8{0x0, 0x38, 0x4a, 0x3b, 0x0, 0x88, 0xff, 0xff, 0x43, 0x1, 0x81, 0x1, 0x2, 0x0, 0x2d, 0x0, 0xc0, 0xd3, 0x5b, 0x50, 0x0, 0x0, 0x0, 0x0, 0x8a, 0x85, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0}, + Payload: []uint8{0x4}, + }, + ID: 0xffff88003b4a3800, + EventType: USBEventTypeComplete, + TransferType: USBTransportTypeInterrupt, + Direction: 0x1, + EndpointNumber: 0x1, + DeviceAddress: 0x1, + BusID: 0x2, + TimestampSec: 1348195264, + TimestampUsec: 689546, + Setup: false, + Data: true, + Status: 0, + UrbLength: 0x1, + UrbDataLength: 0x1, + } + + if !reflect.DeepEqual(got, want) { + t.Errorf("USB packet processing failed:\ngot :\n%#v\n\nwant :\n%#v\n\n", got, want) + } + } + +} +func BenchmarkDecodePacketUSB0(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testPacketUSB0, LinkTypeLinuxUSB, gopacket.NoCopy) + } +} diff --git a/vendor/github.com/google/gopacket/layers/vrrp.go b/vendor/github.com/google/gopacket/layers/vrrp.go new file mode 100644 index 0000000..ffaafe6 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/vrrp.go @@ -0,0 +1,156 @@ +// Copyright 2016 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 layers + +import ( + "encoding/binary" + "errors" + "net" + + "github.com/google/gopacket" +) + +/* + This layer provides decoding for Virtual Router Redundancy Protocol (VRRP) v2. + https://tools.ietf.org/html/rfc3768#section-5 + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |Version| Type | Virtual Rtr ID| Priority | Count IP Addrs| + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Auth Type | Adver Int | Checksum | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | IP Address (1) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | . | + | . | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | IP Address (n) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Authentication Data (1) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Authentication Data (2) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +*/ + +type VRRPv2Type uint8 +type VRRPv2AuthType uint8 + +const ( + VRRPv2Advertisement VRRPv2Type = 0x01 // router advertisement +) + +// String conversions for VRRP message types +func (v VRRPv2Type) String() string { + switch v { + case VRRPv2Advertisement: + return "VRRPv2 Advertisement" + default: + return "" + } +} + +const ( + VRRPv2AuthNoAuth VRRPv2AuthType = 0x00 // No Authentication + VRRPv2AuthReserved1 VRRPv2AuthType = 0x01 // Reserved field 1 + VRRPv2AuthReserved2 VRRPv2AuthType = 0x02 // Reserved field 2 +) + +func (v VRRPv2AuthType) String() string { + switch v { + case VRRPv2AuthNoAuth: + return "No Authentication" + case VRRPv2AuthReserved1: + return "Reserved" + case VRRPv2AuthReserved2: + return "Reserved" + default: + return "" + } +} + +// VRRPv2 represents an VRRP v2 message. +type VRRPv2 struct { + BaseLayer + Version uint8 // The version field specifies the VRRP protocol version of this packet (v2) + Type VRRPv2Type // The type field specifies the type of this VRRP packet. The only type defined in v2 is ADVERTISEMENT + VirtualRtrID uint8 // identifies the virtual router this packet is reporting status for + Priority uint8 // specifies the sending VRRP router's priority for the virtual router (100 = default) + CountIPAddr uint8 // The number of IP addresses contained in this VRRP advertisement. + AuthType VRRPv2AuthType // identifies the authentication method being utilized + AdverInt uint8 // The Advertisement interval indicates the time interval (in seconds) between ADVERTISEMENTS. The default is 1 second + Checksum uint16 // used to detect data corruption in the VRRP message. + IPAddress []net.IP // one or more IP addresses associated with the virtual router. Specified in the CountIPAddr field. +} + +// LayerType returns LayerTypeVRRP for VRRP v2 message. +func (v *VRRPv2) LayerType() gopacket.LayerType { return LayerTypeVRRP } + +func (v *VRRPv2) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + + v.BaseLayer = BaseLayer{Contents: data[:len(data)]} + v.Version = data[0] >> 4 // high nibble == VRRP version. We're expecting v2 + + v.Type = VRRPv2Type(data[0] & 0x0F) // low nibble == VRRP type. Expecting 1 (advertisement) + if v.Type != 1 { + // rfc3768: A packet with unknown type MUST be discarded. + return errors.New("Unrecognized VRRPv2 type field.") + } + + v.VirtualRtrID = data[1] + v.Priority = data[2] + + v.CountIPAddr = data[3] + if v.CountIPAddr < 1 { + return errors.New("VRRPv2 number of IP addresses is not valid.") + } + + v.AuthType = VRRPv2AuthType(data[4]) + v.AdverInt = uint8(data[5]) + v.Checksum = binary.BigEndian.Uint16(data[6:8]) + + // populate the IPAddress field. The number of addresses is specified in the v.CountIPAddr field + // offset references the starting byte containing the list of ip addresses + offset := 8 + for i := uint8(0); i < v.CountIPAddr; i++ { + v.IPAddress = append(v.IPAddress, data[offset:offset+4]) + offset += 4 + } + + // any trailing packets here may be authentication data and *should* be ignored in v2 as per RFC + // + // 5.3.10. Authentication Data + // + // The authentication string is currently only used to maintain + // backwards compatibility with RFC 2338. It SHOULD be set to zero on + // transmission and ignored on reception. + return nil +} + +// CanDecode specifies the layer type in which we are attempting to unwrap. +func (v *VRRPv2) CanDecode() gopacket.LayerClass { + return LayerTypeVRRP +} + +// NextLayerType specifies the next layer that should be decoded. VRRP does not contain any further payload, so we set to 0 +func (v *VRRPv2) NextLayerType() gopacket.LayerType { + return gopacket.LayerTypeZero +} + +// The VRRP packet does not include payload data. Setting byte slice to nil +func (v *VRRPv2) Payload() []byte { + return nil +} + +// decodeVRRP will parse VRRP v2 +func decodeVRRP(data []byte, p gopacket.PacketBuilder) error { + if len(data) < 8 { + return errors.New("Not a valid VRRP packet. Packet length is too small.") + } + v := &VRRPv2{} + return decodingLayerDecoder(v, data, p) +} diff --git a/vendor/github.com/google/gopacket/layers/vrrp_test.go b/vendor/github.com/google/gopacket/layers/vrrp_test.go new file mode 100644 index 0000000..bc6b7e4 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/vrrp_test.go @@ -0,0 +1,55 @@ +// Copyright 2016 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 layers + +import ( + "github.com/google/gopacket" + "testing" +) + +// vrrpPacketPriority100 is the packet: +// 06:12:21.813317 IP 192.168.0.30 > 224.0.0.18: VRRPv2, Advertisement, vrid 1, prio 100, authtype none, intvl 1s, length 20 +// 0x0000: 0100 5e00 0012 0000 5e00 0101 0800 45c0 ..^.....^.....E. +// 0x0010: 0028 0000 0000 ff70 19cd c0a8 001e e000 .(.....p........ +// 0x0020: 0012 2101 6401 0001 ba52 c0a8 0001 0000 ..!.d....R...... +// 0x0030: 0000 0000 0000 0000 0000 0000 ............ +var vrrpPacketPriority100 = []byte{ + 0x01, 0x00, 0x5e, 0x00, 0x00, 0x12, 0x00, 0x00, 0x5e, 0x00, 0x01, 0x01, 0x08, 0x00, 0x45, 0xc0, + 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0xff, 0x70, 0x19, 0xcd, 0xc0, 0xa8, 0x00, 0x1e, 0xe0, 0x00, + 0x00, 0x12, 0x21, 0x01, 0x64, 0x01, 0x00, 0x01, 0xba, 0x52, 0xc0, 0xa8, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +} + +func TestVRRPPacketPacket0(t *testing.T) { + p := gopacket.NewPacket(vrrpPacketPriority100, LinkTypeEthernet, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeEthernet, LayerTypeIPv4, LayerTypeVRRP}, t) + + // Version=2 Type=VRRPv2 Advertisement VirtualRtrID=1 Priority=100 + vrrp := p.Layer(LayerTypeVRRP).(*VRRPv2) + if vrrp.Version != 2 { + t.Fatalf("Unable to decode VRRPv2 version. Received %d, expected %d", vrrp.Version, 2) + } + + if vrrp.Type != 1 { + t.Fatalf("Unable to decode VRRPv2 type. Received %d, expected %d", vrrp.Type, 1) + } + + if vrrp.Priority != 100 { + t.Fatalf("Unable to decode VRRPv2 priority. Received %d, expected %d", vrrp.Priority, 100) + } + + if vrrp.Checksum != 47698 { + t.Fatalf("Unable to decode VRRPv2 checksum. Received %d, expected %d", vrrp.Checksum, 47698) + } +} +func BenchmarkDecodeVRRPPacket0(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(vrrpPacketPriority100, LayerTypeEthernet, gopacket.NoCopy) + } +} diff --git a/vendor/github.com/google/gopacket/layers/vxlan.go b/vendor/github.com/google/gopacket/layers/vxlan.go new file mode 100644 index 0000000..08f1ecb --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/vxlan.go @@ -0,0 +1,94 @@ +// Copyright 2016 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 layers + +import ( + "encoding/binary" + "fmt" + "github.com/google/gopacket" +) + +// VXLAN is specifed in RFC 7348 https://tools.ietf.org/html/rfc7348 +// G, D, A, Group Policy ID from https://tools.ietf.org/html/draft-smith-vxlan-group-policy-00 +// 0 1 2 3 +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// 0 8 16 24 32 +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// |G|R|R|R|I|R|R|R|R|D|R|R|A|R|R|R| Group Policy ID | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | 24 bit VXLAN Network Identifier | Reserved | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +// VXLAN is a VXLAN packet header +type VXLAN struct { + BaseLayer + ValidIDFlag bool // 'I' bit per RFC 7348 + VNI uint32 // 'VXLAN Network Identifier' 24 bits per RFC 7348 + GBPExtension bool // 'G' bit per Group Policy https://tools.ietf.org/html/draft-smith-vxlan-group-policy-00 + GBPDontLearn bool // 'D' bit per Group Policy + GBPApplied bool // 'A' bit per Group Policy + GBPGroupPolicyID uint16 // 'Group Policy ID' 16 bits per Group Policy +} + +// LayerType returns LayerTypeVXLAN +func (vx *VXLAN) LayerType() gopacket.LayerType { return LayerTypeVXLAN } + +func decodeVXLAN(data []byte, p gopacket.PacketBuilder) error { + vx := &VXLAN{} + + // VNI is a 24bit number, Uint32 requires 32 bits + var buf [4]byte + copy(buf[1:], data[4:7]) + + // RFC 7348 https://tools.ietf.org/html/rfc7348 + vx.ValidIDFlag = data[0]&0x08 > 0 // 'I' bit per RFC7348 + vx.VNI = binary.BigEndian.Uint32(buf[:]) // VXLAN Network Identifier per RFC7348 + + // Group Based Policy https://tools.ietf.org/html/draft-smith-vxlan-group-policy-00 + vx.GBPExtension = data[0]&0x80 > 0 // 'G' bit per the group policy draft + vx.GBPDontLearn = data[1]&0x40 > 0 // 'D' bit - the egress VTEP MUST NOT learn the source address of the encapsulated frame. + vx.GBPApplied = data[1]&0x80 > 0 // 'A' bit - indicates that the group policy has already been applied to this packet. + vx.GBPGroupPolicyID = binary.BigEndian.Uint16(data[2:4]) // Policy ID as per the group policy draft + + // Layer information + const vxlanLength = 8 + vx.Contents = data[:vxlanLength] + vx.Payload = data[vxlanLength:] + + p.AddLayer(vx) + return p.NextDecoder(LinkTypeEthernet) +} + +// SerializeTo writes the serialized form of this layer into the +// SerializationBuffer, implementing gopacket.SerializableLayer. +// See the docs for gopacket.SerializableLayer for more info. +func (vx *VXLAN) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + bytes, err := b.PrependBytes(8) + if err != nil { + return err + } + + if vx.ValidIDFlag { + bytes[0] |= 0x08 + } + if vx.GBPExtension { + bytes[0] |= 0x80 + } + if vx.GBPDontLearn { + bytes[1] |= 0x40 + } + if vx.GBPApplied { + bytes[1] |= 0x80 + } + + binary.BigEndian.PutUint16(bytes[2:4], vx.GBPGroupPolicyID) + if vx.VNI >= 1<<24 { + return fmt.Errorf("Virtual Network Identifier = %x exceeds max for 24-bit uint", vx.VNI) + } + binary.BigEndian.PutUint32(bytes[4:8], vx.VNI<<8) + return nil +} diff --git a/vendor/github.com/google/gopacket/layers/vxlan_test.go b/vendor/github.com/google/gopacket/layers/vxlan_test.go new file mode 100644 index 0000000..a02d934 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/vxlan_test.go @@ -0,0 +1,108 @@ +// Copyright 2016 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 layers + +import ( + "github.com/google/gopacket" + "reflect" + "testing" +) + +// VXLAN is specifed in RFC 7348 +// 0 1 2 3 +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// 0 8 16 24 32 +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// |G|R|R|R|I|R|R|R|R|D|R|R|A|R|R|R| Group Policy ID | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | 24 bit VXLAN Network Identifier | Reserved | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +// Ethernet[IP[UDP[VXLAN[Ethernet[IP[ICMP]]]]]] + +// testPacketVXLAN +// 0000 00 16 3e 08 71 cf 36 dc 85 1e b3 40 08 00 45 00 ..>.q.6....@..E. +// 0010 00 86 d2 c0 40 00 40 11 51 52 c0 a8 cb 01 c0 a8 ....@.@.QR...... +// 0020 ca 01 b0 5d 12 b5 00 72 00 00 08 00 00 00 00 00 ...]...r........ +// 0030 00 00 00 30 88 01 00 02 00 16 3e 37 f6 04 08 00 ...0......>7.... +// 0040 45 00 00 54 00 00 40 00 40 01 23 4f c0 a8 cb 03 E..T..@.@.#O.... +// 0050 c0 a8 cb 05 08 00 f6 f2 05 0c 00 01 fc e2 97 51 ...............Q +// 0060 00 00 00 00 a6 f8 02 00 00 00 00 00 10 11 12 13 ................ +// 0070 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 ............ !"# +// 0080 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 $%&'()*+,-./0123 +// 0090 34 35 36 37 4567 ./01234567 +var testPacketVXLAN = []byte{ + 0x00, 0x16, 0x3e, 0x08, 0x71, 0xcf, 0x36, 0xdc, 0x85, 0x1e, 0xb3, 0x40, 0x08, 0x00, 0x45, 0x00, + 0x00, 0x86, 0xd2, 0xc0, 0x40, 0x00, 0x40, 0x11, 0x51, 0x52, 0xc0, 0xa8, 0xcb, 0x01, 0xc0, 0xa8, + 0xca, 0x01, 0xb0, 0x5d, 0x12, 0xb5, 0x00, 0x72, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x30, 0x88, 0x01, 0x00, 0x02, 0x00, 0x16, 0x3e, 0x37, 0xf6, 0x04, 0x08, 0x00, + 0x45, 0x00, 0x00, 0x54, 0x00, 0x00, 0x40, 0x00, 0x40, 0x01, 0x23, 0x4f, 0xc0, 0xa8, 0xcb, 0x03, + 0xc0, 0xa8, 0xcb, 0x05, 0x08, 0x00, 0xf6, 0xf2, 0x05, 0x0c, 0x00, 0x01, 0xfc, 0xe2, 0x97, 0x51, + 0x00, 0x00, 0x00, 0x00, 0xa6, 0xf8, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x11, 0x12, 0x13, + 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, + 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, + 0x34, 0x35, 0x36, 0x37, +} + +func TestPacketVXLAN(t *testing.T) { + p := gopacket.NewPacket(testPacketVXLAN, LinkTypeEthernet, gopacket.Default) + if p.ErrorLayer() != nil { + t.Error("Failed to decode packet:", p.ErrorLayer().Error()) + } + checkLayers(p, []gopacket.LayerType{LayerTypeEthernet, LayerTypeIPv4, LayerTypeUDP, LayerTypeVXLAN, LayerTypeEthernet, LayerTypeIPv4, LayerTypeICMPv4, gopacket.LayerTypePayload}, t) + if got, ok := p.Layer(LayerTypeVXLAN).(*VXLAN); ok { + want := &VXLAN{ + BaseLayer: BaseLayer{ + Contents: []byte{0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00}, + Payload: []byte{0x00, 0x30, 0x88, 0x01, 0x00, 0x02, 0x00, 0x16, 0x3e, 0x37, 0xf6, 0x04, 0x08, 0x00, + 0x45, 0x00, 0x00, 0x54, 0x00, 0x00, 0x40, 0x00, 0x40, 0x01, 0x23, 0x4f, 0xc0, 0xa8, 0xcb, 0x03, + 0xc0, 0xa8, 0xcb, 0x05, 0x08, 0x00, 0xf6, 0xf2, 0x05, 0x0c, 0x00, 0x01, 0xfc, 0xe2, 0x97, 0x51, + 0x00, 0x00, 0x00, 0x00, 0xa6, 0xf8, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x11, 0x12, 0x13, + 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, + 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, + 0x34, 0x35, 0x36, 0x37}, + }, + ValidIDFlag: true, + VNI: 255, + GBPExtension: false, + GBPApplied: false, + GBPDontLearn: false, + GBPGroupPolicyID: 0, + } + if !reflect.DeepEqual(want, got) { + t.Errorf("VXLAN layer mismatch, \nwant %#v\ngot %#v\n", want, got) + } + } +} + +func BenchmarkDecodePacketVXLAN(b *testing.B) { + for i := 0; i < b.N; i++ { + gopacket.NewPacket(testPacketVXLAN, LinkTypeEthernet, gopacket.NoCopy) + } +} + +func TestIsomorphicPacketVXLAN(t *testing.T) { + vx := &VXLAN{ + ValidIDFlag: true, + VNI: 255, + GBPExtension: true, + GBPApplied: true, + GBPDontLearn: true, + GBPGroupPolicyID: 777, + } + + b := gopacket.NewSerializeBuffer() + vx.SerializeTo(b, gopacket.SerializeOptions{}) + + p := gopacket.NewPacket(b.Bytes(), gopacket.DecodeFunc(decodeVXLAN), gopacket.Default) + vxTranslated := p.Layer(LayerTypeVXLAN).(*VXLAN) + vxTranslated.BaseLayer = BaseLayer{} + + if !reflect.DeepEqual(vx, vxTranslated) { + t.Errorf("VXLAN isomorph mismatch, \nwant %#v\ngot %#v\n", vx, vxTranslated) + } +} diff --git a/vendor/github.com/google/gopacket/layertype.go b/vendor/github.com/google/gopacket/layertype.go new file mode 100644 index 0000000..3abfee1 --- /dev/null +++ b/vendor/github.com/google/gopacket/layertype.go @@ -0,0 +1,111 @@ +// 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 gopacket + +import ( + "fmt" + "strconv" +) + +// LayerType is a unique identifier for each type of layer. This enumeration +// does not match with any externally available numbering scheme... it's solely +// usable/useful within this library as a means for requesting layer types +// (see Packet.Layer) and determining which types of layers have been decoded. +// +// New LayerTypes may be created by calling gopacket.RegisterLayerType. +type LayerType int64 + +// LayerTypeMetadata contains metadata associated with each LayerType. +type LayerTypeMetadata struct { + // Name is the string returned by each layer type's String method. + Name string + // Decoder is the decoder to use when the layer type is passed in as a + // Decoder. + Decoder Decoder +} + +type layerTypeMetadata struct { + inUse bool + LayerTypeMetadata +} + +// DecodersByLayerName maps layer names to decoders for those layers. +// This allows users to specify decoders by name to a program and have that +// program pick the correct decoder accordingly. +var DecodersByLayerName = map[string]Decoder{} + +const maxLayerType = 2000 + +var ltMeta [maxLayerType]layerTypeMetadata +var ltMetaMap = map[LayerType]layerTypeMetadata{} + +// RegisterLayerType creates a new layer type and registers it globally. +// The number passed in must be unique, or a runtime panic will occur. Numbers +// 0-999 are reserved for the gopacket library. Numbers 1000-1999 should be +// used for common application-specific types, and are very fast. Any other +// number (negative or >= 2000) may be used for uncommon application-specific +// types, and are somewhat slower (they require a map lookup over an array +// index). +func RegisterLayerType(num int, meta LayerTypeMetadata) LayerType { + if 0 <= num && num < maxLayerType { + if ltMeta[num].inUse { + panic("Layer type already exists") + } + } else { + if ltMetaMap[LayerType(num)].inUse { + panic("Layer type already exists") + } + } + return OverrideLayerType(num, meta) +} + +// OverrideLayerType acts like RegisterLayerType, except that if the layer type +// has already been registered, it overrides the metadata with the passed-in +// metadata intead of panicing. +func OverrideLayerType(num int, meta LayerTypeMetadata) LayerType { + if 0 <= num && num < maxLayerType { + ltMeta[num] = layerTypeMetadata{ + inUse: true, + LayerTypeMetadata: meta, + } + } else { + ltMetaMap[LayerType(num)] = layerTypeMetadata{ + inUse: true, + LayerTypeMetadata: meta, + } + } + DecodersByLayerName[meta.Name] = meta.Decoder + return LayerType(num) +} + +// Decode decodes the given data using the decoder registered with the layer +// type. +func (t LayerType) Decode(data []byte, c PacketBuilder) error { + var d Decoder + if 0 <= int(t) && int(t) < maxLayerType { + d = ltMeta[int(t)].Decoder + } else { + d = ltMetaMap[t].Decoder + } + if d != nil { + return d.Decode(data, c) + } + return fmt.Errorf("Layer type %v has no associated decoder", t) +} + +// String returns the string associated with this layer type. +func (t LayerType) String() (s string) { + if 0 <= int(t) && int(t) < maxLayerType { + s = ltMeta[int(t)].Name + } else { + s = ltMetaMap[t].Name + } + if s == "" { + s = strconv.Itoa(int(t)) + } + return +} diff --git a/vendor/github.com/google/gopacket/macs/benchmark_test.go b/vendor/github.com/google/gopacket/macs/benchmark_test.go new file mode 100644 index 0000000..33af5c2 --- /dev/null +++ b/vendor/github.com/google/gopacket/macs/benchmark_test.go @@ -0,0 +1,18 @@ +// 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 + +import ( + "testing" +) + +func BenchmarkCheckEthernetPrefix(b *testing.B) { + key := [3]byte{5, 5, 5} + for i := 0; i < b.N; i++ { + _ = ValidMACPrefixMap[key] + } +} diff --git a/vendor/github.com/google/gopacket/macs/doc.go b/vendor/github.com/google/gopacket/macs/doc.go new file mode 100644 index 0000000..c0d32a8 --- /dev/null +++ b/vendor/github.com/google/gopacket/macs/doc.go @@ -0,0 +1,12 @@ +// 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 provides an in-memory mapping of all valid Ethernet MAC address +// prefixes to their associated organization. +// +// The ValidMACPrefixMap map maps 3-byte prefixes to organization strings. It +// can be updated using 'go run gen.go' in this directory. +package macs 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("}") +} diff --git a/vendor/github.com/google/gopacket/macs/valid_mac_prefixes.go b/vendor/github.com/google/gopacket/macs/valid_mac_prefixes.go new file mode 100644 index 0000000..0a93cad --- /dev/null +++ b/vendor/github.com/google/gopacket/macs/valid_mac_prefixes.go @@ -0,0 +1,23946 @@ +// 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 2017-09-19 13:06:19.654271144 -0600 MDT +// Fetched from "http://standards.ieee.org/develop/regauth/oui/oui.txt" + +// 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{ + [3]byte{0, 0, 0}: "XEROX CORPORATION", + [3]byte{0, 0, 1}: "XEROX CORPORATION", + [3]byte{0, 0, 2}: "XEROX CORPORATION", + [3]byte{0, 0, 3}: "XEROX CORPORATION", + [3]byte{0, 0, 4}: "XEROX CORPORATION", + [3]byte{0, 0, 5}: "XEROX CORPORATION", + [3]byte{0, 0, 6}: "XEROX CORPORATION", + [3]byte{0, 0, 7}: "XEROX CORPORATION", + [3]byte{0, 0, 8}: "XEROX CORPORATION", + [3]byte{0, 0, 9}: "XEROX CORPORATION", + [3]byte{0, 0, 10}: "OMRON TATEISI ELECTRONICS CO.", + [3]byte{0, 0, 11}: "MATRIX CORPORATION", + [3]byte{0, 0, 12}: "Cisco Systems, Inc", + [3]byte{0, 0, 13}: "FIBRONICS LTD.", + [3]byte{0, 0, 14}: "FUJITSU LIMITED", + [3]byte{0, 0, 15}: "NEXT, INC.", + [3]byte{0, 0, 16}: "SYTEK INC.", + [3]byte{0, 0, 17}: "NORMEREL SYSTEMES", + [3]byte{0, 0, 18}: "INFORMATION TECHNOLOGY LIMITED", + [3]byte{0, 0, 19}: "CAMEX", + [3]byte{0, 0, 20}: "NETRONIX", + [3]byte{0, 0, 21}: "DATAPOINT CORPORATION", + [3]byte{0, 0, 22}: "DU PONT PIXEL SYSTEMS .", + [3]byte{0, 0, 23}: "Oracle", + [3]byte{0, 0, 24}: "WEBSTER COMPUTER CORPORATION", + [3]byte{0, 0, 25}: "APPLIED DYNAMICS INTERNATIONAL", + [3]byte{0, 0, 26}: "ADVANCED MICRO DEVICES", + [3]byte{0, 0, 27}: "Novell, Inc.", + [3]byte{0, 0, 28}: "BELL TECHNOLOGIES", + [3]byte{0, 0, 29}: "Cabletron Systems, Inc.", + [3]byte{0, 0, 30}: "TELSIST INDUSTRIA ELECTRONICA", + [3]byte{0, 0, 31}: "Telco Systems, Inc.", + [3]byte{0, 0, 32}: "DATAINDUSTRIER DIAB AB", + [3]byte{0, 0, 33}: "SUREMAN COMP. & COMMUN. CORP.", + [3]byte{0, 0, 34}: "VISUAL TECHNOLOGY INC.", + [3]byte{0, 0, 35}: "ABB INDUSTRIAL SYSTEMS AB", + [3]byte{0, 0, 36}: "CONNECT AS", + [3]byte{0, 0, 37}: "RAMTEK CORP.", + [3]byte{0, 0, 38}: "SHA-KEN CO., LTD.", + [3]byte{0, 0, 39}: "JAPAN RADIO COMPANY", + [3]byte{0, 0, 40}: "PRODIGY SYSTEMS CORPORATION", + [3]byte{0, 0, 41}: "IMC NETWORKS CORP.", + [3]byte{0, 0, 42}: "TRW - SEDD/INP", + [3]byte{0, 0, 43}: "CRISP AUTOMATION, INC", + [3]byte{0, 0, 44}: "AUTOTOTE LIMITED", + [3]byte{0, 0, 45}: "CHROMATICS INC", + [3]byte{0, 0, 46}: "SOCIETE EVIRA", + [3]byte{0, 0, 47}: "TIMEPLEX INC.", + [3]byte{0, 0, 48}: "VG LABORATORY SYSTEMS LTD", + [3]byte{0, 0, 49}: "QPSX COMMUNICATIONS, LTD.", + [3]byte{0, 0, 50}: "Marconi plc", + [3]byte{0, 0, 51}: "EGAN MACHINERY COMPANY", + [3]byte{0, 0, 52}: "NETWORK RESOURCES CORPORATION", + [3]byte{0, 0, 53}: "SPECTRAGRAPHICS CORPORATION", + [3]byte{0, 0, 54}: "ATARI CORPORATION", + [3]byte{0, 0, 55}: "OXFORD METRICS LIMITED", + [3]byte{0, 0, 56}: "CSS LABS", + [3]byte{0, 0, 57}: "TOSHIBA CORPORATION", + [3]byte{0, 0, 58}: "CHYRON CORPORATION", + [3]byte{0, 0, 59}: "i Controls, Inc.", + [3]byte{0, 0, 60}: "AUSPEX SYSTEMS INC.", + [3]byte{0, 0, 61}: "UNISYS", + [3]byte{0, 0, 62}: "SIMPACT", + [3]byte{0, 0, 63}: "SYNTREX, INC.", + [3]byte{0, 0, 64}: "APPLICON, INC.", + [3]byte{0, 0, 65}: "ICE CORPORATION", + [3]byte{0, 0, 66}: "METIER MANAGEMENT SYSTEMS LTD.", + [3]byte{0, 0, 67}: "MICRO TECHNOLOGY", + [3]byte{0, 0, 68}: "CASTELLE CORPORATION", + [3]byte{0, 0, 69}: "FORD AEROSPACE & COMM. CORP.", + [3]byte{0, 0, 70}: "OLIVETTI NORTH AMERICA", + [3]byte{0, 0, 71}: "NICOLET INSTRUMENTS CORP.", + [3]byte{0, 0, 72}: "Seiko Epson Corporation", + [3]byte{0, 0, 73}: "APRICOT COMPUTERS, LTD", + [3]byte{0, 0, 74}: "ADC CODENOLL TECHNOLOGY CORP.", + [3]byte{0, 0, 75}: "ICL DATA OY", + [3]byte{0, 0, 76}: "NEC CORPORATION", + [3]byte{0, 0, 77}: "DCI CORPORATION", + [3]byte{0, 0, 78}: "AMPEX CORPORATION", + [3]byte{0, 0, 79}: "LOGICRAFT, INC.", + [3]byte{0, 0, 80}: "RADISYS CORPORATION", + [3]byte{0, 0, 81}: "HOB ELECTRONIC GMBH & CO. KG", + [3]byte{0, 0, 82}: "Intrusion.com, Inc.", + [3]byte{0, 0, 83}: "COMPUCORP", + [3]byte{0, 0, 84}: "Schneider Electric", + [3]byte{0, 0, 85}: "COMMISSARIAT A L`ENERGIE ATOM.", + [3]byte{0, 0, 86}: "DR. B. STRUCK", + [3]byte{0, 0, 87}: "SCITEX CORPORATION LTD.", + [3]byte{0, 0, 88}: "RACORE COMPUTER PRODUCTS INC.", + [3]byte{0, 0, 89}: "Hellige GMBH", + [3]byte{0, 0, 90}: "SysKonnect GmbH", + [3]byte{0, 0, 91}: "ELTEC ELEKTRONIK AG", + [3]byte{0, 0, 92}: "TELEMATICS INTERNATIONAL INC.", + [3]byte{0, 0, 93}: "CS TELECOM", + [3]byte{0, 0, 94}: "ICANN, IANA Department", + [3]byte{0, 0, 95}: "Sumitomo Electric Industries,Ltd", + [3]byte{0, 0, 96}: "KONTRON ELEKTRONIK GMBH", + [3]byte{0, 0, 97}: "GATEWAY COMMUNICATIONS", + [3]byte{0, 0, 98}: "BULL HN INFORMATION SYSTEMS", + [3]byte{0, 0, 99}: "BARCO CONTROL ROOMS GMBH", + [3]byte{0, 0, 100}: "Yokogawa Digital Computer Corporation", + [3]byte{0, 0, 101}: "Network General Corporation", + [3]byte{0, 0, 102}: "TALARIS SYSTEMS, INC.", + [3]byte{0, 0, 103}: "SOFT * RITE, INC.", + [3]byte{0, 0, 104}: "ROSEMOUNT CONTROLS", + [3]byte{0, 0, 105}: "CONCORD COMMUNICATIONS INC", + [3]byte{0, 0, 106}: "COMPUTER CONSOLES INC.", + [3]byte{0, 0, 107}: "SILICON GRAPHICS INC./MIPS", + [3]byte{0, 0, 108}: "Private", + [3]byte{0, 0, 109}: "CRAY COMMUNICATIONS, LTD.", + [3]byte{0, 0, 110}: "Artisoft Inc.", + [3]byte{0, 0, 111}: "Madge Ltd.", + [3]byte{0, 0, 112}: "HCL LIMITED", + [3]byte{0, 0, 113}: "ADRA SYSTEMS INC.", + [3]byte{0, 0, 114}: "MINIWARE TECHNOLOGY", + [3]byte{0, 0, 115}: "SIECOR CORPORATION", + [3]byte{0, 0, 116}: "RICOH COMPANY LTD.", + [3]byte{0, 0, 117}: "Nortel Networks", + [3]byte{0, 0, 118}: "ABEKAS VIDEO SYSTEM", + [3]byte{0, 0, 119}: "INTERPHASE CORPORATION", + [3]byte{0, 0, 120}: "LABTAM LIMITED", + [3]byte{0, 0, 121}: "NETWORTH INCORPORATED", + [3]byte{0, 0, 122}: "DANA COMPUTER INC.", + [3]byte{0, 0, 123}: "RESEARCH MACHINES", + [3]byte{0, 0, 124}: "AMPERE INCORPORATED", + [3]byte{0, 0, 125}: "Oracle Corporation", + [3]byte{0, 0, 126}: "CLUSTRIX CORPORATION", + [3]byte{0, 0, 127}: "LINOTYPE-HELL AG", + [3]byte{0, 0, 128}: "CRAY COMMUNICATIONS A/S", + [3]byte{0, 0, 129}: "Bay Networks", + [3]byte{0, 0, 130}: "LECTRA SYSTEMES SA", + [3]byte{0, 0, 131}: "TADPOLE TECHNOLOGY PLC", + [3]byte{0, 0, 132}: "SUPERNET", + [3]byte{0, 0, 133}: "CANON INC.", + [3]byte{0, 0, 134}: "MEGAHERTZ CORPORATION", + [3]byte{0, 0, 135}: "HITACHI, LTD.", + [3]byte{0, 0, 136}: "Brocade Communications Systems, Inc.", + [3]byte{0, 0, 137}: "CAYMAN SYSTEMS INC.", + [3]byte{0, 0, 138}: "DATAHOUSE INFORMATION SYSTEMS", + [3]byte{0, 0, 139}: "INFOTRON", + [3]byte{0, 0, 140}: "Alloy Computer Products (Australia) Pty Ltd", + [3]byte{0, 0, 141}: "Cryptek Inc.", + [3]byte{0, 0, 142}: "SOLBOURNE COMPUTER, INC.", + [3]byte{0, 0, 143}: "Raytheon", + [3]byte{0, 0, 144}: "MICROCOM", + [3]byte{0, 0, 145}: "ANRITSU CORPORATION", + [3]byte{0, 0, 146}: "COGENT DATA TECHNOLOGIES", + [3]byte{0, 0, 147}: "PROTEON INC.", + [3]byte{0, 0, 148}: "ASANTE TECHNOLOGIES", + [3]byte{0, 0, 149}: "SONY TEKTRONIX CORP.", + [3]byte{0, 0, 150}: "MARCONI ELECTRONICS LTD.", + [3]byte{0, 0, 151}: "Dell EMC", + [3]byte{0, 0, 152}: "CROSSCOMM CORPORATION", + [3]byte{0, 0, 153}: "MTX, INC.", + [3]byte{0, 0, 154}: "RC COMPUTER A/S", + [3]byte{0, 0, 155}: "INFORMATION INTERNATIONAL, INC", + [3]byte{0, 0, 156}: "ROLM MIL-SPEC COMPUTERS", + [3]byte{0, 0, 157}: "LOCUS COMPUTING CORPORATION", + [3]byte{0, 0, 158}: "MARLI S.A.", + [3]byte{0, 0, 159}: "AMERISTAR TECHNOLOGIES INC.", + [3]byte{0, 0, 160}: "SANYO Electric Co., Ltd.", + [3]byte{0, 0, 161}: "MARQUETTE ELECTRIC CO.", + [3]byte{0, 0, 162}: "Bay Networks", + [3]byte{0, 0, 163}: "NETWORK APPLICATION TECHNOLOGY", + [3]byte{0, 0, 164}: "ACORN COMPUTERS LIMITED", + [3]byte{0, 0, 165}: "Tattile SRL", + [3]byte{0, 0, 166}: "NETWORK GENERAL CORPORATION", + [3]byte{0, 0, 167}: "NETWORK COMPUTING DEVICES INC.", + [3]byte{0, 0, 168}: "STRATUS COMPUTER INC.", + [3]byte{0, 0, 169}: "NETWORK SYSTEMS CORP.", + [3]byte{0, 0, 170}: "XEROX CORPORATION", + [3]byte{0, 0, 171}: "LOGIC MODELING CORPORATION", + [3]byte{0, 0, 172}: "CONWARE COMPUTER CONSULTING", + [3]byte{0, 0, 173}: "BRUKER INSTRUMENTS INC.", + [3]byte{0, 0, 174}: "DASSAULT ELECTRONIQUE", + [3]byte{0, 0, 175}: "Canberra Industries, Inc.", + [3]byte{0, 0, 176}: "RND-RAD NETWORK DEVICES", + [3]byte{0, 0, 177}: "Alpha Micro", + [3]byte{0, 0, 178}: "TELEVIDEO SYSTEMS, INC.", + [3]byte{0, 0, 179}: "CIMLINC INCORPORATED", + [3]byte{0, 0, 180}: "Edimax Technology Co. Ltd.", + [3]byte{0, 0, 181}: "DATABILITY SOFTWARE SYS. INC.", + [3]byte{0, 0, 182}: "MICRO-MATIC RESEARCH", + [3]byte{0, 0, 183}: "DOVE COMPUTER CORPORATION", + [3]byte{0, 0, 184}: "SEIKOSHA CO., LTD.", + [3]byte{0, 0, 185}: "MCDONNELL DOUGLAS COMPUTER SYS", + [3]byte{0, 0, 186}: "SIIG, INC.", + [3]byte{0, 0, 187}: "TRI-DATA", + [3]byte{0, 0, 188}: "Rockwell Automation", + [3]byte{0, 0, 189}: "MITSUBISHI CABLE COMPANY", + [3]byte{0, 0, 190}: "THE NTI GROUP", + [3]byte{0, 0, 191}: "SYMMETRIC COMPUTER SYSTEMS", + [3]byte{0, 0, 192}: "WESTERN DIGITAL CORPORATION", + [3]byte{0, 0, 193}: "Madge Ltd.", + [3]byte{0, 0, 194}: "INFORMATION PRESENTATION TECH.", + [3]byte{0, 0, 195}: "HARRIS CORP COMPUTER SYS DIV", + [3]byte{0, 0, 196}: "WATERS DIV. OF MILLIPORE", + [3]byte{0, 0, 197}: "ARRIS Group, Inc.", + [3]byte{0, 0, 198}: "EON SYSTEMS", + [3]byte{0, 0, 199}: "ARIX CORPORATION", + [3]byte{0, 0, 200}: "ALTOS COMPUTER SYSTEMS", + [3]byte{0, 0, 201}: "Emulex Corporation", + [3]byte{0, 0, 202}: "ARRIS Group, Inc.", + [3]byte{0, 0, 203}: "COMPU-SHACK ELECTRONIC GMBH", + [3]byte{0, 0, 204}: "DENSAN CO., LTD.", + [3]byte{0, 0, 205}: "Allied Telesis Labs Ltd", + [3]byte{0, 0, 206}: "MEGADATA CORP.", + [3]byte{0, 0, 207}: "HAYES MICROCOMPUTER PRODUCTS", + [3]byte{0, 0, 208}: "DEVELCON ELECTRONICS LTD.", + [3]byte{0, 0, 209}: "ADAPTEC INCORPORATED", + [3]byte{0, 0, 210}: "SBE, INC.", + [3]byte{0, 0, 211}: "WANG LABORATORIES INC.", + [3]byte{0, 0, 212}: "PURE DATA LTD.", + [3]byte{0, 0, 213}: "MICROGNOSIS INTERNATIONAL", + [3]byte{0, 0, 214}: "PUNCH LINE HOLDING", + [3]byte{0, 0, 215}: "DARTMOUTH COLLEGE", + [3]byte{0, 0, 216}: "Novell, Inc.", + [3]byte{0, 0, 217}: "NIPPON TELEGRAPH & TELEPHONE", + [3]byte{0, 0, 218}: "ATEX", + [3]byte{0, 0, 219}: "British Telecommunications plc", + [3]byte{0, 0, 220}: "HAYES MICROCOMPUTER PRODUCTS", + [3]byte{0, 0, 221}: "TCL INCORPORATED", + [3]byte{0, 0, 222}: "CETIA", + [3]byte{0, 0, 223}: "BELL & HOWELL PUB SYS DIV", + [3]byte{0, 0, 224}: "QUADRAM CORP.", + [3]byte{0, 0, 225}: "GRID SYSTEMS", + [3]byte{0, 0, 226}: "ACER TECHNOLOGIES CORP.", + [3]byte{0, 0, 227}: "INTEGRATED MICRO PRODUCTS LTD", + [3]byte{0, 0, 228}: "IN2 GROUPE INTERTECHNIQUE", + [3]byte{0, 0, 229}: "SIGMEX LTD.", + [3]byte{0, 0, 230}: "APTOR PRODUITS DE COMM INDUST", + [3]byte{0, 0, 231}: "Star Gate Technologies", + [3]byte{0, 0, 232}: "ACCTON TECHNOLOGY CORP.", + [3]byte{0, 0, 233}: "ISICAD, INC.", + [3]byte{0, 0, 234}: "UPNOD AB", + [3]byte{0, 0, 235}: "MATSUSHITA COMM. IND. CO. LTD.", + [3]byte{0, 0, 236}: "MICROPROCESS", + [3]byte{0, 0, 237}: "APRIL", + [3]byte{0, 0, 238}: "NETWORK DESIGNERS, LTD.", + [3]byte{0, 0, 239}: "KTI", + [3]byte{0, 0, 240}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 0, 241}: "MAGNA COMPUTER CORPORATION", + [3]byte{0, 0, 242}: "SPIDER COMMUNICATIONS", + [3]byte{0, 0, 243}: "GANDALF DATA LIMITED", + [3]byte{0, 0, 244}: "Allied Telesis, Inc.", + [3]byte{0, 0, 245}: "DIAMOND SALES LIMITED", + [3]byte{0, 0, 246}: "APPLIED MICROSYSTEMS CORP.", + [3]byte{0, 0, 247}: "YOUTH KEEP ENTERPRISE CO LTD", + [3]byte{0, 0, 248}: "DIGITAL EQUIPMENT CORPORATION", + [3]byte{0, 0, 249}: "QUOTRON SYSTEMS INC.", + [3]byte{0, 0, 250}: "MICROSAGE COMPUTER SYSTEMS INC", + [3]byte{0, 0, 251}: "RECHNER ZUR KOMMUNIKATION", + [3]byte{0, 0, 252}: "MEIKO", + [3]byte{0, 0, 253}: "HIGH LEVEL HARDWARE", + [3]byte{0, 0, 254}: "Annapolis Micro Systems, Inc.", + [3]byte{0, 0, 255}: "CAMTEC ELECTRONICS LTD.", + [3]byte{0, 1, 0}: "EQUIP'TRANS", + [3]byte{0, 1, 1}: "Private", + [3]byte{0, 1, 2}: "3COM CORPORATION", + [3]byte{0, 1, 3}: "3COM CORPORATION", + [3]byte{0, 1, 4}: "DVICO Co., Ltd.", + [3]byte{0, 1, 5}: "Beckhoff Automation GmbH", + [3]byte{0, 1, 6}: "Tews Datentechnik GmbH", + [3]byte{0, 1, 7}: "Leiser GmbH", + [3]byte{0, 1, 8}: "AVLAB Technology, Inc.", + [3]byte{0, 1, 9}: "Nagano Japan Radio Co., Ltd.", + [3]byte{0, 1, 10}: "CIS TECHNOLOGY INC.", + [3]byte{0, 1, 11}: "Space CyberLink, Inc.", + [3]byte{0, 1, 12}: "System Talks Inc.", + [3]byte{0, 1, 13}: "Teledyne DALSA Inc.", + [3]byte{0, 1, 14}: "Bri-Link Technologies Co., Ltd", + [3]byte{0, 1, 15}: "Brocade Communications Systems, Inc.", + [3]byte{0, 1, 16}: "Gotham Networks", + [3]byte{0, 1, 17}: "iDigm Inc.", + [3]byte{0, 1, 18}: "Shark Multimedia Inc.", + [3]byte{0, 1, 19}: "OLYMPUS CORPORATION", + [3]byte{0, 1, 20}: "KANDA TSUSHIN KOGYO CO., LTD.", + [3]byte{0, 1, 21}: "EXTRATECH CORPORATION", + [3]byte{0, 1, 22}: "Netspect Technologies, Inc.", + [3]byte{0, 1, 23}: "Canal +", + [3]byte{0, 1, 24}: "EZ Digital Co., Ltd.", + [3]byte{0, 1, 25}: "RTUnet (Australia)", + [3]byte{0, 1, 26}: "Hoffmann und Burmeister GbR", + [3]byte{0, 1, 27}: "Unizone Technologies, Inc.", + [3]byte{0, 1, 28}: "Universal Talkware Corporation", + [3]byte{0, 1, 29}: "Centillium Communications", + [3]byte{0, 1, 30}: "Precidia Technologies, Inc.", + [3]byte{0, 1, 31}: "RC Networks, Inc.", + [3]byte{0, 1, 32}: "OSCILLOQUARTZ S.A.", + [3]byte{0, 1, 33}: "Watchguard Technologies, Inc.", + [3]byte{0, 1, 34}: "Trend Communications, Ltd.", + [3]byte{0, 1, 35}: "Schneider Electric Japan Holdings Ltd.", + [3]byte{0, 1, 36}: "Acer Incorporated", + [3]byte{0, 1, 37}: "YAESU MUSEN CO., LTD.", + [3]byte{0, 1, 38}: "PAC Labs", + [3]byte{0, 1, 39}: "OPEN Networks Pty Ltd", + [3]byte{0, 1, 40}: "EnjoyWeb, Inc.", + [3]byte{0, 1, 41}: "DFI Inc.", + [3]byte{0, 1, 42}: "Telematica Sistems Inteligente", + [3]byte{0, 1, 43}: "TELENET Co., Ltd.", + [3]byte{0, 1, 44}: "Aravox Technologies, Inc.", + [3]byte{0, 1, 45}: "Komodo Technology", + [3]byte{0, 1, 46}: "PC Partner Ltd.", + [3]byte{0, 1, 47}: "Twinhead International Corp", + [3]byte{0, 1, 48}: "Extreme Networks, Inc.", + [3]byte{0, 1, 49}: "Bosch Security Systems, Inc.", + [3]byte{0, 1, 50}: "Dranetz - BMI", + [3]byte{0, 1, 51}: "KYOWA Electronic Instruments C", + [3]byte{0, 1, 52}: "Selectron Systems AG", + [3]byte{0, 1, 53}: "KDC Corp.", + [3]byte{0, 1, 54}: "CyberTAN Technology Inc.", + [3]byte{0, 1, 55}: "IT Farm Corporation", + [3]byte{0, 1, 56}: "XAVi Technologies Corp.", + [3]byte{0, 1, 57}: "Point Multimedia Systems", + [3]byte{0, 1, 58}: "SHELCAD COMMUNICATIONS, LTD.", + [3]byte{0, 1, 59}: "BNA SYSTEMS", + [3]byte{0, 1, 60}: "TIW SYSTEMS", + [3]byte{0, 1, 61}: "RiscStation Ltd.", + [3]byte{0, 1, 62}: "Ascom Tateco AB", + [3]byte{0, 1, 63}: "Neighbor World Co., Ltd.", + [3]byte{0, 1, 64}: "Sendtek Corporation", + [3]byte{0, 1, 65}: "CABLE PRINT", + [3]byte{0, 1, 66}: "Cisco Systems, Inc", + [3]byte{0, 1, 67}: "Cisco Systems, Inc", + [3]byte{0, 1, 68}: "Dell EMC", + [3]byte{0, 1, 69}: "WINSYSTEMS, INC.", + [3]byte{0, 1, 70}: "Tesco Controls, Inc.", + [3]byte{0, 1, 71}: "Zhone Technologies", + [3]byte{0, 1, 72}: "X-traWeb Inc.", + [3]byte{0, 1, 73}: "T.D.T. Transfer Data Test GmbH", + [3]byte{0, 1, 74}: "Sony Corporation", + [3]byte{0, 1, 75}: "Ennovate Networks, Inc.", + [3]byte{0, 1, 76}: "Berkeley Process Control", + [3]byte{0, 1, 77}: "Shin Kin Enterprises Co., Ltd", + [3]byte{0, 1, 78}: "WIN Enterprises, Inc.", + [3]byte{0, 1, 79}: "Adtran Inc", + [3]byte{0, 1, 80}: "GILAT COMMUNICATIONS, LTD.", + [3]byte{0, 1, 81}: "Ensemble Communications", + [3]byte{0, 1, 82}: "CHROMATEK INC.", + [3]byte{0, 1, 83}: "ARCHTEK TELECOM CORPORATION", + [3]byte{0, 1, 84}: "G3M Corporation", + [3]byte{0, 1, 85}: "Promise Technology, Inc.", + [3]byte{0, 1, 86}: "FIREWIREDIRECT.COM, INC.", + [3]byte{0, 1, 87}: "SYSWAVE CO., LTD", + [3]byte{0, 1, 88}: "Electro Industries/Gauge Tech", + [3]byte{0, 1, 89}: "S1 Corporation", + [3]byte{0, 1, 90}: "Digital Video Broadcasting", + [3]byte{0, 1, 91}: "ITALTEL S.p.A/RF-UP-I", + [3]byte{0, 1, 92}: "CADANT INC.", + [3]byte{0, 1, 93}: "Oracle Corporation", + [3]byte{0, 1, 94}: "BEST TECHNOLOGY CO., LTD.", + [3]byte{0, 1, 95}: "DIGITAL DESIGN GmbH", + [3]byte{0, 1, 96}: "ELMEX Co., LTD.", + [3]byte{0, 1, 97}: "Meta Machine Technology", + [3]byte{0, 1, 98}: "Cygnet Technologies, Inc.", + [3]byte{0, 1, 99}: "Cisco Systems, Inc", + [3]byte{0, 1, 100}: "Cisco Systems, Inc", + [3]byte{0, 1, 101}: "AirSwitch Corporation", + [3]byte{0, 1, 102}: "TC GROUP A/S", + [3]byte{0, 1, 103}: "HIOKI E.E. CORPORATION", + [3]byte{0, 1, 104}: "VITANA CORPORATION", + [3]byte{0, 1, 105}: "Celestix Networks Pte Ltd.", + [3]byte{0, 1, 106}: "ALITEC", + [3]byte{0, 1, 107}: "LightChip, Inc.", + [3]byte{0, 1, 108}: "FOXCONN", + [3]byte{0, 1, 109}: "CarrierComm Inc.", + [3]byte{0, 1, 110}: "Conklin Corporation", + [3]byte{0, 1, 111}: "Inkel Corp.", + [3]byte{0, 1, 112}: "ESE Embedded System Engineer'g", + [3]byte{0, 1, 113}: "Allied Data Technologies", + [3]byte{0, 1, 114}: "TechnoLand Co., LTD.", + [3]byte{0, 1, 115}: "AMCC", + [3]byte{0, 1, 116}: "CyberOptics Corporation", + [3]byte{0, 1, 117}: "Radiant Communications Corp.", + [3]byte{0, 1, 118}: "Orient Silver Enterprises", + [3]byte{0, 1, 119}: "EDSL", + [3]byte{0, 1, 120}: "MARGI Systems, Inc.", + [3]byte{0, 1, 121}: "WIRELESS TECHNOLOGY, INC.", + [3]byte{0, 1, 122}: "Chengdu Maipu Electric Industrial Co., Ltd.", + [3]byte{0, 1, 123}: "Heidelberger Druckmaschinen AG", + [3]byte{0, 1, 124}: "AG-E GmbH", + [3]byte{0, 1, 125}: "ThermoQuest", + [3]byte{0, 1, 126}: "ADTEK System Science Co., Ltd.", + [3]byte{0, 1, 127}: "Experience Music Project", + [3]byte{0, 1, 128}: "AOpen, Inc.", + [3]byte{0, 1, 129}: "Nortel Networks", + [3]byte{0, 1, 130}: "DICA TECHNOLOGIES AG", + [3]byte{0, 1, 131}: "ANITE TELECOMS", + [3]byte{0, 1, 132}: "SIEB & MEYER AG", + [3]byte{0, 1, 133}: "Hitachi Aloka Medical, Ltd.", + [3]byte{0, 1, 134}: "Uwe Disch", + [3]byte{0, 1, 135}: "I2SE GmbH", + [3]byte{0, 1, 136}: "LXCO Technologies ag", + [3]byte{0, 1, 137}: "Refraction Technology, Inc.", + [3]byte{0, 1, 138}: "ROI COMPUTER AG", + [3]byte{0, 1, 139}: "NetLinks Co., Ltd.", + [3]byte{0, 1, 140}: "Mega Vision", + [3]byte{0, 1, 141}: "AudeSi Technologies", + [3]byte{0, 1, 142}: "Logitec Corporation", + [3]byte{0, 1, 143}: "Kenetec, Inc.", + [3]byte{0, 1, 144}: "SMK-M", + [3]byte{0, 1, 145}: "SYRED Data Systems", + [3]byte{0, 1, 146}: "Texas Digital Systems", + [3]byte{0, 1, 147}: "Hanbyul Telecom Co., Ltd.", + [3]byte{0, 1, 148}: "Capital Equipment Corporation", + [3]byte{0, 1, 149}: "Sena Technologies, Inc.", + [3]byte{0, 1, 150}: "Cisco Systems, Inc", + [3]byte{0, 1, 151}: "Cisco Systems, Inc", + [3]byte{0, 1, 152}: "Darim Vision", + [3]byte{0, 1, 153}: "HeiSei Electronics", + [3]byte{0, 1, 154}: "LEUNIG GmbH", + [3]byte{0, 1, 155}: "Kyoto Microcomputer Co., Ltd.", + [3]byte{0, 1, 156}: "JDS Uniphase Inc.", + [3]byte{0, 1, 157}: "E-Control Systems, Inc.", + [3]byte{0, 1, 158}: "ESS Technology, Inc.", + [3]byte{0, 1, 159}: "ReadyNet", + [3]byte{0, 1, 160}: "Infinilink Corporation", + [3]byte{0, 1, 161}: "Mag-Tek, Inc.", + [3]byte{0, 1, 162}: "Logical Co., Ltd.", + [3]byte{0, 1, 163}: "GENESYS LOGIC, INC.", + [3]byte{0, 1, 164}: "Microlink Corporation", + [3]byte{0, 1, 165}: "Nextcomm, Inc.", + [3]byte{0, 1, 166}: "Scientific-Atlanta Arcodan A/S", + [3]byte{0, 1, 167}: "UNEX TECHNOLOGY CORPORATION", + [3]byte{0, 1, 168}: "Welltech Computer Co., Ltd.", + [3]byte{0, 1, 169}: "BMW AG", + [3]byte{0, 1, 170}: "Airspan Communications, Ltd.", + [3]byte{0, 1, 171}: "Main Street Networks", + [3]byte{0, 1, 172}: "Sitara Networks, Inc.", + [3]byte{0, 1, 173}: "Coach Master International d.b.a. CMI Worldwide, Inc.", + [3]byte{0, 1, 174}: "Trex Enterprises", + [3]byte{0, 1, 175}: "Artesyn Embedded Technologies", + [3]byte{0, 1, 176}: "Fulltek Technology Co., Ltd.", + [3]byte{0, 1, 177}: "General Bandwidth", + [3]byte{0, 1, 178}: "Digital Processing Systems, Inc.", + [3]byte{0, 1, 179}: "Precision Electronic Manufacturing", + [3]byte{0, 1, 180}: "Wayport, Inc.", + [3]byte{0, 1, 181}: "Turin Networks, Inc.", + [3]byte{0, 1, 182}: "SAEJIN T&M Co., Ltd.", + [3]byte{0, 1, 183}: "Centos, Inc.", + [3]byte{0, 1, 184}: "Netsensity, Inc.", + [3]byte{0, 1, 185}: "SKF Condition Monitoring", + [3]byte{0, 1, 186}: "IC-Net, Inc.", + [3]byte{0, 1, 187}: "Frequentis", + [3]byte{0, 1, 188}: "Brains Corporation", + [3]byte{0, 1, 189}: "Peterson Electro-Musical Products, Inc.", + [3]byte{0, 1, 190}: "Gigalink Co., Ltd.", + [3]byte{0, 1, 191}: "Teleforce Co., Ltd.", + [3]byte{0, 1, 192}: "CompuLab, Ltd.", + [3]byte{0, 1, 193}: "Vitesse Semiconductor Corporation", + [3]byte{0, 1, 194}: "ARK Research Corp.", + [3]byte{0, 1, 195}: "Acromag, Inc.", + [3]byte{0, 1, 196}: "NeoWave, Inc.", + [3]byte{0, 1, 197}: "Simpler Networks", + [3]byte{0, 1, 198}: "Quarry Technologies", + [3]byte{0, 1, 199}: "Cisco Systems, Inc", + [3]byte{0, 1, 200}: "THOMAS CONRAD CORP.", + [3]byte{0, 1, 200}: "CONRAD CORP.", + [3]byte{0, 1, 201}: "Cisco Systems, Inc", + [3]byte{0, 1, 202}: "Geocast Network Systems, Inc.", + [3]byte{0, 1, 203}: "EVR", + [3]byte{0, 1, 204}: "Japan Total Design Communication Co., Ltd.", + [3]byte{0, 1, 205}: "ARtem", + [3]byte{0, 1, 206}: "Custom Micro Products, Ltd.", + [3]byte{0, 1, 207}: "Alpha Data Parallel Systems, Ltd.", + [3]byte{0, 1, 208}: "VitalPoint, Inc.", + [3]byte{0, 1, 209}: "CoNet Communications, Inc.", + [3]byte{0, 1, 210}: "inXtron, Inc.", + [3]byte{0, 1, 211}: "PAXCOMM, Inc.", + [3]byte{0, 1, 212}: "Leisure Time, Inc.", + [3]byte{0, 1, 213}: "HAEDONG INFO & COMM CO., LTD", + [3]byte{0, 1, 214}: "manroland AG", + [3]byte{0, 1, 215}: "F5 Networks, Inc.", + [3]byte{0, 1, 216}: "Teltronics, Inc.", + [3]byte{0, 1, 217}: "Sigma, Inc.", + [3]byte{0, 1, 218}: "WINCOMM Corporation", + [3]byte{0, 1, 219}: "Freecom Technologies GmbH", + [3]byte{0, 1, 220}: "Activetelco", + [3]byte{0, 1, 221}: "Avail Networks", + [3]byte{0, 1, 222}: "Trango Systems, Inc.", + [3]byte{0, 1, 223}: "ISDN Communications, Ltd.", + [3]byte{0, 1, 224}: "Fast Systems, Inc.", + [3]byte{0, 1, 225}: "Kinpo Electronics, Inc.", + [3]byte{0, 1, 226}: "Ando Electric Corporation", + [3]byte{0, 1, 227}: "Siemens AG", + [3]byte{0, 1, 228}: "Sitera, Inc.", + [3]byte{0, 1, 229}: "Supernet, Inc.", + [3]byte{0, 1, 230}: "Hewlett Packard", + [3]byte{0, 1, 231}: "Hewlett Packard", + [3]byte{0, 1, 232}: "Force10 Networks, Inc.", + [3]byte{0, 1, 233}: "Litton Marine Systems B.V.", + [3]byte{0, 1, 234}: "Cirilium Corp.", + [3]byte{0, 1, 235}: "C-COM Corporation", + [3]byte{0, 1, 236}: "Ericsson Group", + [3]byte{0, 1, 237}: "SETA Corp.", + [3]byte{0, 1, 238}: "Comtrol Europe, Ltd.", + [3]byte{0, 1, 239}: "Camtel Technology Corp.", + [3]byte{0, 1, 240}: "Tridium, Inc.", + [3]byte{0, 1, 241}: "Innovative Concepts, Inc.", + [3]byte{0, 1, 242}: "Mark of the Unicorn, Inc.", + [3]byte{0, 1, 243}: "QPS, Inc.", + [3]byte{0, 1, 244}: "Enterasys", + [3]byte{0, 1, 245}: "ERIM S.A.", + [3]byte{0, 1, 246}: "Association of Musical Electronics Industry", + [3]byte{0, 1, 247}: "Image Display Systems, Inc.", + [3]byte{0, 1, 248}: "TEXIO TECHNOLOGY CORPORATION", + [3]byte{0, 1, 249}: "TeraGlobal Communications Corp.", + [3]byte{0, 1, 250}: "HOROSCAS", + [3]byte{0, 1, 251}: "DoTop Technology, Inc.", + [3]byte{0, 1, 252}: "Keyence Corporation", + [3]byte{0, 1, 253}: "Digital Voice Systems, Inc.", + [3]byte{0, 1, 254}: "DIGITAL EQUIPMENT CORPORATION", + [3]byte{0, 1, 255}: "Data Direct Networks, Inc.", + [3]byte{0, 2, 0}: "Net & Sys Co., Ltd.", + [3]byte{0, 2, 1}: "IFM Electronic gmbh", + [3]byte{0, 2, 2}: "Amino Communications, Ltd.", + [3]byte{0, 2, 3}: "Woonsang Telecom, Inc.", + [3]byte{0, 2, 4}: "Bodmann Industries Elektronik GmbH", + [3]byte{0, 2, 5}: "Hitachi Denshi, Ltd.", + [3]byte{0, 2, 6}: "Telital R&D Denmark A/S", + [3]byte{0, 2, 7}: "VisionGlobal Network Corp.", + [3]byte{0, 2, 8}: "Unify Networks, Inc.", + [3]byte{0, 2, 9}: "Shenzhen SED Information Technology Co., Ltd.", + [3]byte{0, 2, 10}: "Gefran Spa", + [3]byte{0, 2, 11}: "Native Networks, Inc.", + [3]byte{0, 2, 12}: "Metro-Optix", + [3]byte{0, 2, 13}: "Micronpc.com", + [3]byte{0, 2, 14}: "ECI Telecom Ltd.", + [3]byte{0, 2, 15}: "AATR", + [3]byte{0, 2, 16}: "Fenecom", + [3]byte{0, 2, 17}: "Nature Worldwide Technology Corp.", + [3]byte{0, 2, 18}: "SierraCom", + [3]byte{0, 2, 19}: "S.D.E.L.", + [3]byte{0, 2, 20}: "DTVRO", + [3]byte{0, 2, 21}: "Cotas Computer Technology A/B", + [3]byte{0, 2, 22}: "Cisco Systems, Inc", + [3]byte{0, 2, 23}: "Cisco Systems, Inc", + [3]byte{0, 2, 24}: "Advanced Scientific Corp", + [3]byte{0, 2, 25}: "Paralon Technologies", + [3]byte{0, 2, 26}: "Zuma Networks", + [3]byte{0, 2, 27}: "Kollmorgen-Servotronix", + [3]byte{0, 2, 28}: "Network Elements, Inc.", + [3]byte{0, 2, 29}: "Data General Communication Ltd.", + [3]byte{0, 2, 30}: "SIMTEL S.R.L.", + [3]byte{0, 2, 31}: "Aculab PLC", + [3]byte{0, 2, 32}: "CANON FINETECH INC.", + [3]byte{0, 2, 33}: "DSP Application, Ltd.", + [3]byte{0, 2, 34}: "Chromisys, Inc.", + [3]byte{0, 2, 35}: "ClickTV", + [3]byte{0, 2, 36}: "C-COR", + [3]byte{0, 2, 37}: "One Stop Systems", + [3]byte{0, 2, 38}: "XESystems, Inc.", + [3]byte{0, 2, 39}: "ESD Electronic System Design GmbH", + [3]byte{0, 2, 40}: "Necsom, Ltd.", + [3]byte{0, 2, 41}: "Adtec Corporation", + [3]byte{0, 2, 42}: "Asound Electronic", + [3]byte{0, 2, 43}: "SAXA, Inc.", + [3]byte{0, 2, 44}: "ABB Bomem, Inc.", + [3]byte{0, 2, 45}: "Agere Systems", + [3]byte{0, 2, 46}: "TEAC Corp. R& D", + [3]byte{0, 2, 47}: "P-Cube, Ltd.", + [3]byte{0, 2, 48}: "Intersoft Electronics", + [3]byte{0, 2, 49}: "Ingersoll-Rand", + [3]byte{0, 2, 50}: "Avision, Inc.", + [3]byte{0, 2, 51}: "Mantra Communications, Inc.", + [3]byte{0, 2, 52}: "Imperial Technology, Inc.", + [3]byte{0, 2, 53}: "Paragon Networks International", + [3]byte{0, 2, 54}: "INIT GmbH", + [3]byte{0, 2, 55}: "Cosmo Research Corp.", + [3]byte{0, 2, 56}: "Serome Technology, Inc.", + [3]byte{0, 2, 57}: "Visicom", + [3]byte{0, 2, 58}: "ZSK Stickmaschinen GmbH", + [3]byte{0, 2, 59}: "Ericsson", + [3]byte{0, 2, 60}: "Creative Technology, Ltd.", + [3]byte{0, 2, 61}: "Cisco Systems, Inc", + [3]byte{0, 2, 62}: "Selta Telematica S.p.a", + [3]byte{0, 2, 63}: "COMPAL ELECTRONICS, INC.", + [3]byte{0, 2, 64}: "Seedek Co., Ltd.", + [3]byte{0, 2, 65}: "Amer.com", + [3]byte{0, 2, 66}: "Videoframe Systems", + [3]byte{0, 2, 67}: "Raysis Co., Ltd.", + [3]byte{0, 2, 68}: "SURECOM Technology Co.", + [3]byte{0, 2, 69}: "Lampus Co, Ltd.", + [3]byte{0, 2, 70}: "All-Win Tech Co., Ltd.", + [3]byte{0, 2, 71}: "Great Dragon Information Technology (Group) Co., Ltd.", + [3]byte{0, 2, 72}: "Pilz GmbH & Co.", + [3]byte{0, 2, 73}: "Aviv Infocom Co, Ltd.", + [3]byte{0, 2, 74}: "Cisco Systems, Inc", + [3]byte{0, 2, 75}: "Cisco Systems, Inc", + [3]byte{0, 2, 76}: "SiByte, Inc.", + [3]byte{0, 2, 77}: "Mannesman Dematic Colby Pty. Ltd.", + [3]byte{0, 2, 78}: "Datacard Group", + [3]byte{0, 2, 79}: "IPM Datacom S.R.L.", + [3]byte{0, 2, 80}: "Geyser Networks, Inc.", + [3]byte{0, 2, 81}: "Soma Networks, Inc.", + [3]byte{0, 2, 82}: "Carrier Corporation", + [3]byte{0, 2, 83}: "Televideo, Inc.", + [3]byte{0, 2, 84}: "WorldGate", + [3]byte{0, 2, 85}: "IBM Corp", + [3]byte{0, 2, 86}: "Alpha Processor, Inc.", + [3]byte{0, 2, 87}: "Microcom Corp.", + [3]byte{0, 2, 88}: "Flying Packets Communications", + [3]byte{0, 2, 89}: "Tsann Kuen China (Shanghai)Enterprise Co., Ltd. IT Group", + [3]byte{0, 2, 90}: "Catena Networks", + [3]byte{0, 2, 91}: "Cambridge Silicon Radio", + [3]byte{0, 2, 92}: "SCI Systems (Kunshan) Co., Ltd.", + [3]byte{0, 2, 93}: "Calix Networks", + [3]byte{0, 2, 94}: "High Technology Ltd", + [3]byte{0, 2, 95}: "Nortel Networks", + [3]byte{0, 2, 96}: "Accordion Networks, Inc.", + [3]byte{0, 2, 97}: "Tilgin AB", + [3]byte{0, 2, 98}: "Soyo Group Soyo Com Tech Co., Ltd", + [3]byte{0, 2, 99}: "UPS Manufacturing SRL", + [3]byte{0, 2, 100}: "AudioRamp.com", + [3]byte{0, 2, 101}: "Virditech Co. Ltd.", + [3]byte{0, 2, 102}: "Thermalogic Corporation", + [3]byte{0, 2, 103}: "NODE RUNNER, INC.", + [3]byte{0, 2, 104}: "Harris Government Communications", + [3]byte{0, 2, 105}: "Nadatel Co., Ltd", + [3]byte{0, 2, 106}: "Cocess Telecom Co., Ltd.", + [3]byte{0, 2, 107}: "BCM Computers Co., Ltd.", + [3]byte{0, 2, 108}: "Philips CFT", + [3]byte{0, 2, 109}: "Adept Telecom", + [3]byte{0, 2, 110}: "NeGeN Access, Inc.", + [3]byte{0, 2, 111}: "Senao International Co., Ltd.", + [3]byte{0, 2, 112}: "Crewave Co., Ltd.", + [3]byte{0, 2, 113}: "Zhone Technologies", + [3]byte{0, 2, 114}: "CC&C Technologies, Inc.", + [3]byte{0, 2, 115}: "Coriolis Networks", + [3]byte{0, 2, 116}: "Tommy Technologies Corp.", + [3]byte{0, 2, 117}: "SMART Technologies, Inc.", + [3]byte{0, 2, 118}: "Primax Electronics Ltd.", + [3]byte{0, 2, 119}: "Cash Systemes Industrie", + [3]byte{0, 2, 120}: "SAMSUNG ELECTRO MECHANICS CO., LTD.", + [3]byte{0, 2, 121}: "Control Applications, Ltd.", + [3]byte{0, 2, 122}: "IOI Technology Corporation", + [3]byte{0, 2, 123}: "Amplify Net, Inc.", + [3]byte{0, 2, 124}: "Trilithic, Inc.", + [3]byte{0, 2, 125}: "Cisco Systems, Inc", + [3]byte{0, 2, 126}: "Cisco Systems, Inc", + [3]byte{0, 2, 127}: "ask-technologies.com", + [3]byte{0, 2, 128}: "Mu Net, Inc.", + [3]byte{0, 2, 129}: "Madge Ltd.", + [3]byte{0, 2, 130}: "ViaClix, Inc.", + [3]byte{0, 2, 131}: "Spectrum Controls, Inc.", + [3]byte{0, 2, 132}: "AREVA T&D", + [3]byte{0, 2, 133}: "Riverstone Networks", + [3]byte{0, 2, 134}: "Occam Networks", + [3]byte{0, 2, 135}: "Adapcom", + [3]byte{0, 2, 136}: "GLOBAL VILLAGE COMMUNICATION", + [3]byte{0, 2, 137}: "DNE Technologies", + [3]byte{0, 2, 138}: "Ambit Microsystems Corporation", + [3]byte{0, 2, 139}: "VDSL Systems OY", + [3]byte{0, 2, 140}: "Micrel-Synergy Semiconductor", + [3]byte{0, 2, 141}: "Movita Technologies, Inc.", + [3]byte{0, 2, 142}: "Rapid 5 Networks, Inc.", + [3]byte{0, 2, 143}: "Globetek, Inc.", + [3]byte{0, 2, 144}: "Woorigisool, Inc.", + [3]byte{0, 2, 145}: "Open Network Co., Ltd.", + [3]byte{0, 2, 146}: "Logic Innovations, Inc.", + [3]byte{0, 2, 147}: "Solid Data Systems", + [3]byte{0, 2, 148}: "Tokyo Sokushin Co., Ltd.", + [3]byte{0, 2, 149}: "IP.Access Limited", + [3]byte{0, 2, 150}: "Lectron Co,. Ltd.", + [3]byte{0, 2, 151}: "C-COR.net", + [3]byte{0, 2, 152}: "Broadframe Corporation", + [3]byte{0, 2, 153}: "Apex, Inc.", + [3]byte{0, 2, 154}: "Storage Apps", + [3]byte{0, 2, 155}: "Kreatel Communications AB", + [3]byte{0, 2, 156}: "3COM", + [3]byte{0, 2, 157}: "Merix Corp.", + [3]byte{0, 2, 158}: "Information Equipment Co., Ltd.", + [3]byte{0, 2, 159}: "L-3 Communication Aviation Recorders", + [3]byte{0, 2, 160}: "Flatstack Ltd.", + [3]byte{0, 2, 161}: "World Wide Packets", + [3]byte{0, 2, 162}: "Hilscher GmbH", + [3]byte{0, 2, 163}: "ABB Switzerland Ltd, Power Systems", + [3]byte{0, 2, 164}: "AddPac Technology Co., Ltd.", + [3]byte{0, 2, 165}: "Hewlett Packard", + [3]byte{0, 2, 166}: "Effinet Systems Co., Ltd.", + [3]byte{0, 2, 167}: "Vivace Networks", + [3]byte{0, 2, 168}: "Air Link Technology", + [3]byte{0, 2, 169}: "RACOM, s.r.o.", + [3]byte{0, 2, 170}: "PLcom Co., Ltd.", + [3]byte{0, 2, 171}: "CTC Union Technologies Co., Ltd.", + [3]byte{0, 2, 172}: "3PAR data", + [3]byte{0, 2, 173}: "HOYA Corporation", + [3]byte{0, 2, 174}: "Scannex Electronics Ltd.", + [3]byte{0, 2, 175}: "TeleCruz Technology, Inc.", + [3]byte{0, 2, 176}: "Hokubu Communication & Industrial Co., Ltd.", + [3]byte{0, 2, 177}: "Anritsu, Ltd.", + [3]byte{0, 2, 178}: "Cablevision", + [3]byte{0, 2, 179}: "Intel Corporation", + [3]byte{0, 2, 180}: "DAPHNE", + [3]byte{0, 2, 181}: "Avnet, Inc.", + [3]byte{0, 2, 182}: "Acrosser Technology Co., Ltd.", + [3]byte{0, 2, 183}: "Watanabe Electric Industry Co., Ltd.", + [3]byte{0, 2, 184}: "WHI KONSULT AB", + [3]byte{0, 2, 185}: "Cisco Systems, Inc", + [3]byte{0, 2, 186}: "Cisco Systems, Inc", + [3]byte{0, 2, 187}: "Continuous Computing Corp", + [3]byte{0, 2, 188}: "LVL 7 Systems, Inc.", + [3]byte{0, 2, 189}: "Bionet Co., Ltd.", + [3]byte{0, 2, 190}: "Totsu Engineering, Inc.", + [3]byte{0, 2, 191}: "dotRocket, Inc.", + [3]byte{0, 2, 192}: "Bencent Tzeng Industry Co., Ltd.", + [3]byte{0, 2, 193}: "Innovative Electronic Designs, Inc.", + [3]byte{0, 2, 194}: "Net Vision Telecom", + [3]byte{0, 2, 195}: "Arelnet Ltd.", + [3]byte{0, 2, 196}: "Vector International BVBA", + [3]byte{0, 2, 197}: "Evertz Microsystems Ltd.", + [3]byte{0, 2, 198}: "Data Track Technology PLC", + [3]byte{0, 2, 199}: "ALPS ELECTRIC CO.,LTD.", + [3]byte{0, 2, 200}: "Technocom Communications Technology (pte) Ltd", + [3]byte{0, 2, 201}: "Mellanox Technologies, Inc.", + [3]byte{0, 2, 202}: "EndPoints, Inc.", + [3]byte{0, 2, 203}: "TriState Ltd.", + [3]byte{0, 2, 204}: "M.C.C.I", + [3]byte{0, 2, 205}: "TeleDream, Inc.", + [3]byte{0, 2, 206}: "FoxJet, Inc.", + [3]byte{0, 2, 207}: "ZyGate Communications, Inc.", + [3]byte{0, 2, 208}: "Comdial Corporation", + [3]byte{0, 2, 209}: "Vivotek, Inc.", + [3]byte{0, 2, 210}: "Workstation AG", + [3]byte{0, 2, 211}: "NetBotz, Inc.", + [3]byte{0, 2, 212}: "PDA Peripherals, Inc.", + [3]byte{0, 2, 213}: "ACR", + [3]byte{0, 2, 214}: "NICE Systems", + [3]byte{0, 2, 215}: "EMPEG Ltd", + [3]byte{0, 2, 216}: "BRECIS Communications Corporation", + [3]byte{0, 2, 217}: "Reliable Controls", + [3]byte{0, 2, 218}: "ExiO Communications, Inc.", + [3]byte{0, 2, 219}: "NETSEC", + [3]byte{0, 2, 220}: "Fujitsu General Limited", + [3]byte{0, 2, 221}: "Bromax Communications, Ltd.", + [3]byte{0, 2, 222}: "Astrodesign, Inc.", + [3]byte{0, 2, 223}: "Net Com Systems, Inc.", + [3]byte{0, 2, 224}: "ETAS GmbH", + [3]byte{0, 2, 225}: "Integrated Network Corporation", + [3]byte{0, 2, 226}: "NDC Infared Engineering", + [3]byte{0, 2, 227}: "LITE-ON Communications, Inc.", + [3]byte{0, 2, 228}: "JC HYUN Systems, Inc.", + [3]byte{0, 2, 229}: "Timeware Ltd.", + [3]byte{0, 2, 230}: "Gould Instrument Systems, Inc.", + [3]byte{0, 2, 231}: "CAB GmbH & Co KG", + [3]byte{0, 2, 232}: "E.D.&A.", + [3]byte{0, 2, 233}: "CS Systemes De Securite - C3S", + [3]byte{0, 2, 234}: "Focus Enhancements", + [3]byte{0, 2, 235}: "Pico Communications", + [3]byte{0, 2, 236}: "Maschoff Design Engineering", + [3]byte{0, 2, 237}: "DXO Telecom Co., Ltd.", + [3]byte{0, 2, 238}: "Nokia Danmark A/S", + [3]byte{0, 2, 239}: "CCC Network Systems Group Ltd.", + [3]byte{0, 2, 240}: "AME Optimedia Technology Co., Ltd.", + [3]byte{0, 2, 241}: "Pinetron Co., Ltd.", + [3]byte{0, 2, 242}: "eDevice, Inc.", + [3]byte{0, 2, 243}: "Media Serve Co., Ltd.", + [3]byte{0, 2, 244}: "PCTEL, Inc.", + [3]byte{0, 2, 245}: "VIVE Synergies, Inc.", + [3]byte{0, 2, 246}: "Equipe Communications", + [3]byte{0, 2, 247}: "ARM", + [3]byte{0, 2, 248}: "SEAKR Engineering, Inc.", + [3]byte{0, 2, 249}: "MIMOS Berhad", + [3]byte{0, 2, 250}: "DX Antenna Co., Ltd.", + [3]byte{0, 2, 251}: "Baumuller Aulugen-Systemtechnik GmbH", + [3]byte{0, 2, 252}: "Cisco Systems, Inc", + [3]byte{0, 2, 253}: "Cisco Systems, Inc", + [3]byte{0, 2, 254}: "Viditec, Inc.", + [3]byte{0, 2, 255}: "Handan BroadInfoCom", + [3]byte{0, 3, 0}: "Barracuda Networks, Inc.", + [3]byte{0, 3, 1}: "EXFO", + [3]byte{0, 3, 2}: "Charles Industries, Ltd.", + [3]byte{0, 3, 3}: "JAMA Electronics Co., Ltd.", + [3]byte{0, 3, 4}: "Pacific Broadband Communications", + [3]byte{0, 3, 5}: "MSC Vertriebs GmbH", + [3]byte{0, 3, 6}: "Fusion In Tech Co., Ltd.", + [3]byte{0, 3, 7}: "Secure Works, Inc.", + [3]byte{0, 3, 8}: "AM Communications, Inc.", + [3]byte{0, 3, 9}: "Texcel Technology PLC", + [3]byte{0, 3, 10}: "Argus Technologies", + [3]byte{0, 3, 11}: "Hunter Technology, Inc.", + [3]byte{0, 3, 12}: "Telesoft Technologies Ltd.", + [3]byte{0, 3, 13}: "Uniwill Computer Corp.", + [3]byte{0, 3, 14}: "Core Communications Co., Ltd.", + [3]byte{0, 3, 15}: "Digital China (Shanghai) Networks Ltd.", + [3]byte{0, 3, 16}: "E-Globaledge Corporation", + [3]byte{0, 3, 17}: "Micro Technology Co., Ltd.", + [3]byte{0, 3, 18}: "TR-Systemtechnik GmbH", + [3]byte{0, 3, 19}: "Access Media SPA", + [3]byte{0, 3, 20}: "Teleware Network Systems", + [3]byte{0, 3, 21}: "Cidco Incorporated", + [3]byte{0, 3, 22}: "Nobell Communications, Inc.", + [3]byte{0, 3, 23}: "Merlin Systems, Inc.", + [3]byte{0, 3, 24}: "Cyras Systems, Inc.", + [3]byte{0, 3, 25}: "Infineon AG", + [3]byte{0, 3, 26}: "Beijing Broad Telecom Ltd., China", + [3]byte{0, 3, 27}: "Cellvision Systems, Inc.", + [3]byte{0, 3, 28}: "Svenska Hardvarufabriken AB", + [3]byte{0, 3, 29}: "Taiwan Commate Computer, Inc.", + [3]byte{0, 3, 30}: "Optranet, Inc.", + [3]byte{0, 3, 31}: "Condev Ltd.", + [3]byte{0, 3, 32}: "Xpeed, Inc.", + [3]byte{0, 3, 33}: "Reco Research Co., Ltd.", + [3]byte{0, 3, 34}: "IDIS Co., Ltd.", + [3]byte{0, 3, 35}: "Cornet Technology, Inc.", + [3]byte{0, 3, 36}: "SANYO Consumer Electronics Co., Ltd.", + [3]byte{0, 3, 37}: "Arima Computer Corp.", + [3]byte{0, 3, 38}: "Iwasaki Information Systems Co., Ltd.", + [3]byte{0, 3, 39}: "ACT'L", + [3]byte{0, 3, 40}: "Mace Group, Inc.", + [3]byte{0, 3, 41}: "F3, Inc.", + [3]byte{0, 3, 42}: "UniData Communication Systems, Inc.", + [3]byte{0, 3, 43}: "GAI Datenfunksysteme GmbH", + [3]byte{0, 3, 44}: "ABB Switzerland Ltd", + [3]byte{0, 3, 45}: "IBASE Technology, Inc.", + [3]byte{0, 3, 46}: "Scope Information Management, Ltd.", + [3]byte{0, 3, 47}: "Global Sun Technology, Inc.", + [3]byte{0, 3, 48}: "Imagenics, Co., Ltd.", + [3]byte{0, 3, 49}: "Cisco Systems, Inc", + [3]byte{0, 3, 50}: "Cisco Systems, Inc", + [3]byte{0, 3, 51}: "Digitel Co., Ltd.", + [3]byte{0, 3, 52}: "Newport Electronics", + [3]byte{0, 3, 53}: "Mirae Technology", + [3]byte{0, 3, 54}: "Zetes Technologies", + [3]byte{0, 3, 55}: "Vaone, Inc.", + [3]byte{0, 3, 56}: "Oak Technology", + [3]byte{0, 3, 57}: "Eurologic Systems, Ltd.", + [3]byte{0, 3, 58}: "Silicon Wave, Inc.", + [3]byte{0, 3, 59}: "TAMI Tech Co., Ltd.", + [3]byte{0, 3, 60}: "Daiden Co., Ltd.", + [3]byte{0, 3, 61}: "ILSHin Lab", + [3]byte{0, 3, 62}: "Tateyama System Laboratory Co., Ltd.", + [3]byte{0, 3, 63}: "BigBand Networks, Ltd.", + [3]byte{0, 3, 64}: "Floware Wireless Systems, Ltd.", + [3]byte{0, 3, 65}: "Axon Digital Design", + [3]byte{0, 3, 66}: "Nortel Networks", + [3]byte{0, 3, 67}: "Martin Professional A/S", + [3]byte{0, 3, 68}: "Tietech.Co., Ltd.", + [3]byte{0, 3, 69}: "Routrek Networks Corporation", + [3]byte{0, 3, 70}: "Hitachi Kokusai Electric, Inc.", + [3]byte{0, 3, 71}: "Intel Corporation", + [3]byte{0, 3, 72}: "Norscan Instruments, Ltd.", + [3]byte{0, 3, 73}: "Vidicode Datacommunicatie B.V.", + [3]byte{0, 3, 74}: "RIAS Corporation", + [3]byte{0, 3, 75}: "Nortel Networks", + [3]byte{0, 3, 76}: "Shanghai DigiVision Technology Co., Ltd.", + [3]byte{0, 3, 77}: "Chiaro Networks, Ltd.", + [3]byte{0, 3, 78}: "Pos Data Company, Ltd.", + [3]byte{0, 3, 79}: "Sur-Gard Security", + [3]byte{0, 3, 80}: "BTICINO SPA", + [3]byte{0, 3, 81}: "Diebold, Inc.", + [3]byte{0, 3, 82}: "Colubris Networks", + [3]byte{0, 3, 83}: "Mitac, Inc.", + [3]byte{0, 3, 84}: "Fiber Logic Communications", + [3]byte{0, 3, 85}: "TeraBeam Internet Systems", + [3]byte{0, 3, 86}: "Wincor Nixdorf International GmbH", + [3]byte{0, 3, 87}: "Intervoice-Brite, Inc.", + [3]byte{0, 3, 88}: "Hanyang Digitech Co.Ltd", + [3]byte{0, 3, 89}: "DigitalSis", + [3]byte{0, 3, 90}: "Photron Limited", + [3]byte{0, 3, 91}: "BridgeWave Communications", + [3]byte{0, 3, 92}: "Saint Song Corp.", + [3]byte{0, 3, 93}: "Bosung Hi-Net Co., Ltd.", + [3]byte{0, 3, 94}: "Metropolitan Area Networks, Inc.", + [3]byte{0, 3, 95}: "Prüftechnik Condition Monitoring GmbH & Co. KG", + [3]byte{0, 3, 96}: "PAC Interactive Technology, Inc.", + [3]byte{0, 3, 97}: "Widcomm, Inc.", + [3]byte{0, 3, 98}: "Vodtel Communications, Inc.", + [3]byte{0, 3, 99}: "Miraesys Co., Ltd.", + [3]byte{0, 3, 100}: "Scenix Semiconductor, Inc.", + [3]byte{0, 3, 101}: "Kira Information & Communications, Ltd.", + [3]byte{0, 3, 102}: "ASM Pacific Technology", + [3]byte{0, 3, 103}: "Jasmine Networks, Inc.", + [3]byte{0, 3, 104}: "Embedone Co., Ltd.", + [3]byte{0, 3, 105}: "Nippon Antenna Co., Ltd.", + [3]byte{0, 3, 106}: "Mainnet, Ltd.", + [3]byte{0, 3, 107}: "Cisco Systems, Inc", + [3]byte{0, 3, 108}: "Cisco Systems, Inc", + [3]byte{0, 3, 109}: "Runtop, Inc.", + [3]byte{0, 3, 110}: "Nicon Systems (Pty) Limited", + [3]byte{0, 3, 111}: "Telsey SPA", + [3]byte{0, 3, 112}: "NXTV, Inc.", + [3]byte{0, 3, 113}: "Acomz Networks Corp.", + [3]byte{0, 3, 114}: "ULAN", + [3]byte{0, 3, 115}: "Aselsan A.S", + [3]byte{0, 3, 116}: "Control Microsystems", + [3]byte{0, 3, 117}: "NetMedia, Inc.", + [3]byte{0, 3, 118}: "Graphtec Technology, Inc.", + [3]byte{0, 3, 119}: "Gigabit Wireless", + [3]byte{0, 3, 120}: "HUMAX Co., Ltd.", + [3]byte{0, 3, 121}: "Proscend Communications, Inc.", + [3]byte{0, 3, 122}: "Taiyo Yuden Co., Ltd.", + [3]byte{0, 3, 123}: "IDEC IZUMI Corporation", + [3]byte{0, 3, 124}: "Coax Media", + [3]byte{0, 3, 125}: "Stellcom", + [3]byte{0, 3, 126}: "PORTech Communications, Inc.", + [3]byte{0, 3, 127}: "Atheros Communications, Inc.", + [3]byte{0, 3, 128}: "SSH Communications Security Corp.", + [3]byte{0, 3, 129}: "Ingenico International", + [3]byte{0, 3, 130}: "A-One Co., Ltd.", + [3]byte{0, 3, 131}: "Metera Networks, Inc.", + [3]byte{0, 3, 132}: "AETA", + [3]byte{0, 3, 133}: "Actelis Networks, Inc.", + [3]byte{0, 3, 134}: "Ho Net, Inc.", + [3]byte{0, 3, 135}: "Blaze Network Products", + [3]byte{0, 3, 136}: "Fastfame Technology Co., Ltd.", + [3]byte{0, 3, 137}: "PLANTRONICS, INC.", + [3]byte{0, 3, 138}: "America Online, Inc.", + [3]byte{0, 3, 139}: "PLUS-ONE I&T, Inc.", + [3]byte{0, 3, 140}: "Total Impact", + [3]byte{0, 3, 141}: "PCS Revenue Control Systems, Inc.", + [3]byte{0, 3, 142}: "Atoga Systems, Inc.", + [3]byte{0, 3, 143}: "Weinschel Corporation", + [3]byte{0, 3, 144}: "Digital Video Communications, Inc.", + [3]byte{0, 3, 145}: "Advanced Digital Broadcast, Ltd.", + [3]byte{0, 3, 146}: "Hyundai Teletek Co., Ltd.", + [3]byte{0, 3, 147}: "Apple, Inc.", + [3]byte{0, 3, 148}: "Connect One", + [3]byte{0, 3, 149}: "California Amplifier", + [3]byte{0, 3, 150}: "EZ Cast Co., Ltd.", + [3]byte{0, 3, 151}: "Watchfront Limited", + [3]byte{0, 3, 152}: "WISI", + [3]byte{0, 3, 153}: "Dongju Informations & Communications Co., Ltd.", + [3]byte{0, 3, 154}: "SiConnect", + [3]byte{0, 3, 155}: "NetChip Technology, Inc.", + [3]byte{0, 3, 156}: "OptiMight Communications, Inc.", + [3]byte{0, 3, 157}: "Qisda Corporation", + [3]byte{0, 3, 158}: "Tera System Co., Ltd.", + [3]byte{0, 3, 159}: "Cisco Systems, Inc", + [3]byte{0, 3, 160}: "Cisco Systems, Inc", + [3]byte{0, 3, 161}: "HIPER Information & Communication, Inc.", + [3]byte{0, 3, 162}: "Catapult Communications", + [3]byte{0, 3, 163}: "MAVIX, Ltd.", + [3]byte{0, 3, 164}: "Imation Corp.", + [3]byte{0, 3, 165}: "Medea Corporation", + [3]byte{0, 3, 166}: "Traxit Technology, Inc.", + [3]byte{0, 3, 167}: "Unixtar Technology, Inc.", + [3]byte{0, 3, 168}: "IDOT Computers, Inc.", + [3]byte{0, 3, 169}: "AXCENT Media AG", + [3]byte{0, 3, 170}: "Watlow", + [3]byte{0, 3, 171}: "Bridge Information Systems", + [3]byte{0, 3, 172}: "Fronius Schweissmaschinen", + [3]byte{0, 3, 173}: "Emerson Energy Systems AB", + [3]byte{0, 3, 174}: "Allied Advanced Manufacturing Pte, Ltd.", + [3]byte{0, 3, 175}: "Paragea Communications", + [3]byte{0, 3, 176}: "Xsense Technology Corp.", + [3]byte{0, 3, 177}: "Hospira Inc.", + [3]byte{0, 3, 178}: "Radware", + [3]byte{0, 3, 179}: "IA Link Systems Co., Ltd.", + [3]byte{0, 3, 180}: "Macrotek International Corp.", + [3]byte{0, 3, 181}: "Entra Technology Co.", + [3]byte{0, 3, 182}: "QSI Corporation", + [3]byte{0, 3, 183}: "ZACCESS Systems", + [3]byte{0, 3, 184}: "NetKit Solutions, LLC", + [3]byte{0, 3, 185}: "Hualong Telecom Co., Ltd.", + [3]byte{0, 3, 186}: "Oracle Corporation", + [3]byte{0, 3, 187}: "Signal Communications Limited", + [3]byte{0, 3, 188}: "COT GmbH", + [3]byte{0, 3, 189}: "OmniCluster Technologies, Inc.", + [3]byte{0, 3, 190}: "Netility", + [3]byte{0, 3, 191}: "Centerpoint Broadband Technologies, Inc.", + [3]byte{0, 3, 192}: "RFTNC Co., Ltd.", + [3]byte{0, 3, 193}: "Packet Dynamics Ltd", + [3]byte{0, 3, 194}: "Solphone K.K.", + [3]byte{0, 3, 195}: "Micronik Multimedia", + [3]byte{0, 3, 196}: "Tomra Systems ASA", + [3]byte{0, 3, 197}: "Mobotix AG", + [3]byte{0, 3, 198}: "ICUE Systems, Inc.", + [3]byte{0, 3, 199}: "hopf Elektronik GmbH", + [3]byte{0, 3, 200}: "CML Emergency Services", + [3]byte{0, 3, 201}: "TECOM Co., Ltd.", + [3]byte{0, 3, 202}: "MTS Systems Corp.", + [3]byte{0, 3, 203}: "Nippon Systems Development Co., Ltd.", + [3]byte{0, 3, 204}: "Momentum Computer, Inc.", + [3]byte{0, 3, 205}: "Clovertech, Inc.", + [3]byte{0, 3, 206}: "ETEN Technologies, Inc.", + [3]byte{0, 3, 207}: "Muxcom, Inc.", + [3]byte{0, 3, 208}: "KOANKEISO Co., Ltd.", + [3]byte{0, 3, 209}: "Takaya Corporation", + [3]byte{0, 3, 210}: "Crossbeam Systems, Inc.", + [3]byte{0, 3, 211}: "Internet Energy Systems, Inc.", + [3]byte{0, 3, 212}: "Alloptic, Inc.", + [3]byte{0, 3, 213}: "Advanced Communications Co., Ltd.", + [3]byte{0, 3, 214}: "RADVision, Ltd.", + [3]byte{0, 3, 215}: "NextNet Wireless, Inc.", + [3]byte{0, 3, 216}: "iMPath Networks, Inc.", + [3]byte{0, 3, 217}: "Secheron SA", + [3]byte{0, 3, 218}: "Takamisawa Cybernetics Co., Ltd.", + [3]byte{0, 3, 219}: "Apogee Electronics Corp.", + [3]byte{0, 3, 220}: "Lexar Media, Inc.", + [3]byte{0, 3, 221}: "Comark Interactive Solutions", + [3]byte{0, 3, 222}: "OTC Wireless", + [3]byte{0, 3, 223}: "Desana Systems", + [3]byte{0, 3, 224}: "ARRIS Group, Inc.", + [3]byte{0, 3, 225}: "Winmate Communication, Inc.", + [3]byte{0, 3, 226}: "Comspace Corporation", + [3]byte{0, 3, 227}: "Cisco Systems, Inc", + [3]byte{0, 3, 228}: "Cisco Systems, Inc", + [3]byte{0, 3, 229}: "Hermstedt SG", + [3]byte{0, 3, 230}: "Entone, Inc.", + [3]byte{0, 3, 231}: "Logostek Co. Ltd.", + [3]byte{0, 3, 232}: "Wavelength Digital Limited", + [3]byte{0, 3, 233}: "Akara Canada, Inc.", + [3]byte{0, 3, 234}: "Mega System Technologies, Inc.", + [3]byte{0, 3, 235}: "Atrica", + [3]byte{0, 3, 236}: "ICG Research, Inc.", + [3]byte{0, 3, 237}: "Shinkawa Electric Co., Ltd.", + [3]byte{0, 3, 238}: "MKNet Corporation", + [3]byte{0, 3, 239}: "Oneline AG", + [3]byte{0, 3, 240}: "Redfern Broadband Networks", + [3]byte{0, 3, 241}: "Cicada Semiconductor, Inc.", + [3]byte{0, 3, 242}: "Seneca Networks", + [3]byte{0, 3, 243}: "Dazzle Multimedia, Inc.", + [3]byte{0, 3, 244}: "NetBurner", + [3]byte{0, 3, 245}: "Chip2Chip", + [3]byte{0, 3, 246}: "Allegro Networks, Inc.", + [3]byte{0, 3, 247}: "Plast-Control GmbH", + [3]byte{0, 3, 248}: "SanCastle Technologies, Inc.", + [3]byte{0, 3, 249}: "Pleiades Communications, Inc.", + [3]byte{0, 3, 250}: "TiMetra Networks", + [3]byte{0, 3, 251}: "ENEGATE Co.,Ltd.", + [3]byte{0, 3, 252}: "Intertex Data AB", + [3]byte{0, 3, 253}: "Cisco Systems, Inc", + [3]byte{0, 3, 254}: "Cisco Systems, Inc", + [3]byte{0, 3, 255}: "Microsoft Corporation", + [3]byte{0, 4, 0}: "LEXMARK INTERNATIONAL, INC.", + [3]byte{0, 4, 1}: "Osaki Electric Co., Ltd.", + [3]byte{0, 4, 2}: "Nexsan Technologies, Ltd.", + [3]byte{0, 4, 3}: "Nexsi Corporation", + [3]byte{0, 4, 4}: "Makino Milling Machine Co., Ltd.", + [3]byte{0, 4, 5}: "ACN Technologies", + [3]byte{0, 4, 6}: "Fa. Metabox AG", + [3]byte{0, 4, 7}: "Topcon Positioning Systems, Inc.", + [3]byte{0, 4, 8}: "Sanko Electronics Co., Ltd.", + [3]byte{0, 4, 9}: "Cratos Networks", + [3]byte{0, 4, 10}: "Sage Systems", + [3]byte{0, 4, 11}: "3COM EUROPE LTD.", + [3]byte{0, 4, 12}: "Kanno Works, Ltd.", + [3]byte{0, 4, 13}: "Avaya Inc", + [3]byte{0, 4, 14}: "AVM GmbH", + [3]byte{0, 4, 15}: "Asus Network Technologies, Inc.", + [3]byte{0, 4, 16}: "Spinnaker Networks, Inc.", + [3]byte{0, 4, 17}: "Inkra Networks, Inc.", + [3]byte{0, 4, 18}: "WaveSmith Networks, Inc.", + [3]byte{0, 4, 19}: "SNOM Technology AG", + [3]byte{0, 4, 20}: "Umezawa Musen Denki Co., Ltd.", + [3]byte{0, 4, 21}: "Rasteme Systems Co., Ltd.", + [3]byte{0, 4, 22}: "Parks S/A Comunicacoes Digitais", + [3]byte{0, 4, 23}: "ELAU AG", + [3]byte{0, 4, 24}: "Teltronic S.A.U.", + [3]byte{0, 4, 25}: "Fibercycle Networks, Inc.", + [3]byte{0, 4, 26}: "Ines Test and Measurement GmbH & CoKG", + [3]byte{0, 4, 27}: "Bridgeworks Ltd.", + [3]byte{0, 4, 28}: "ipDialog, Inc.", + [3]byte{0, 4, 29}: "Corega of America", + [3]byte{0, 4, 30}: "Shikoku Instrumentation Co., Ltd.", + [3]byte{0, 4, 31}: "Sony Interactive Entertainment Inc.", + [3]byte{0, 4, 32}: "Slim Devices, Inc.", + [3]byte{0, 4, 33}: "Ocular Networks", + [3]byte{0, 4, 34}: "Studio Technologies, Inc", + [3]byte{0, 4, 35}: "Intel Corporation", + [3]byte{0, 4, 36}: "TMC s.r.l.", + [3]byte{0, 4, 37}: "Atmel Corporation", + [3]byte{0, 4, 38}: "Autosys", + [3]byte{0, 4, 39}: "Cisco Systems, Inc", + [3]byte{0, 4, 40}: "Cisco Systems, Inc", + [3]byte{0, 4, 41}: "Pixord Corporation", + [3]byte{0, 4, 42}: "Wireless Networks, Inc.", + [3]byte{0, 4, 43}: "IT Access Co., Ltd.", + [3]byte{0, 4, 44}: "Minet, Inc.", + [3]byte{0, 4, 45}: "Sarian Systems, Ltd.", + [3]byte{0, 4, 46}: "Netous Technologies, Ltd.", + [3]byte{0, 4, 47}: "International Communications Products, Inc.", + [3]byte{0, 4, 48}: "Netgem", + [3]byte{0, 4, 49}: "GlobalStreams, Inc.", + [3]byte{0, 4, 50}: "Voyetra Turtle Beach, Inc.", + [3]byte{0, 4, 51}: "Cyberboard A/S", + [3]byte{0, 4, 52}: "Accelent Systems, Inc.", + [3]byte{0, 4, 53}: "InfiNet LLC", + [3]byte{0, 4, 54}: "ELANsat Technologies, Inc.", + [3]byte{0, 4, 55}: "Powin Information Technology, Inc.", + [3]byte{0, 4, 56}: "Nortel Networks", + [3]byte{0, 4, 57}: "Rosco Entertainment Technology, Inc.", + [3]byte{0, 4, 58}: "Intelligent Telecommunications, Inc.", + [3]byte{0, 4, 59}: "Lava Computer Mfg., Inc.", + [3]byte{0, 4, 60}: "SONOS Co., Ltd.", + [3]byte{0, 4, 61}: "INDEL AG", + [3]byte{0, 4, 62}: "Telencomm", + [3]byte{0, 4, 63}: "ESTeem Wireless Modems, Inc", + [3]byte{0, 4, 64}: "cyberPIXIE, Inc.", + [3]byte{0, 4, 65}: "Half Dome Systems, Inc.", + [3]byte{0, 4, 66}: "NACT", + [3]byte{0, 4, 67}: "Agilent Technologies, Inc.", + [3]byte{0, 4, 68}: "Western Multiplex Corporation", + [3]byte{0, 4, 69}: "LMS Skalar Instruments GmbH", + [3]byte{0, 4, 70}: "CYZENTECH Co., Ltd.", + [3]byte{0, 4, 71}: "Acrowave Systems Co., Ltd.", + [3]byte{0, 4, 72}: "Polaroid Corporation", + [3]byte{0, 4, 73}: "Mapletree Networks", + [3]byte{0, 4, 74}: "iPolicy Networks, Inc.", + [3]byte{0, 4, 75}: "NVIDIA", + [3]byte{0, 4, 76}: "JENOPTIK", + [3]byte{0, 4, 77}: "Cisco Systems, Inc", + [3]byte{0, 4, 78}: "Cisco Systems, Inc", + [3]byte{0, 4, 79}: "Schubert System Elektronik Gmbh", + [3]byte{0, 4, 80}: "DMD Computers SRL", + [3]byte{0, 4, 81}: "Medrad, Inc.", + [3]byte{0, 4, 82}: "RocketLogix, Inc.", + [3]byte{0, 4, 83}: "YottaYotta, Inc.", + [3]byte{0, 4, 84}: "Quadriga UK", + [3]byte{0, 4, 85}: "ANTARA.net", + [3]byte{0, 4, 86}: "Cambium Networks Limited", + [3]byte{0, 4, 87}: "Universal Access Technology, Inc.", + [3]byte{0, 4, 88}: "Fusion X Co., Ltd.", + [3]byte{0, 4, 89}: "Veristar Corporation", + [3]byte{0, 4, 90}: "The Linksys Group, Inc.", + [3]byte{0, 4, 91}: "Techsan Electronics Co., Ltd.", + [3]byte{0, 4, 92}: "Mobiwave Pte Ltd", + [3]byte{0, 4, 93}: "BEKA Elektronik", + [3]byte{0, 4, 94}: "PolyTrax Information Technology AG", + [3]byte{0, 4, 95}: "Avalue Technology, Inc.", + [3]byte{0, 4, 96}: "Knilink Technology, Inc.", + [3]byte{0, 4, 97}: "EPOX Computer Co., Ltd.", + [3]byte{0, 4, 98}: "DAKOS Data & Communication Co., Ltd.", + [3]byte{0, 4, 99}: "Bosch Security Systems", + [3]byte{0, 4, 100}: "Pulse-Link Inc", + [3]byte{0, 4, 101}: "i.s.t isdn-support technik GmbH", + [3]byte{0, 4, 102}: "ARMITEL Co.", + [3]byte{0, 4, 103}: "Wuhan Research Institute of MII", + [3]byte{0, 4, 104}: "Vivity, Inc.", + [3]byte{0, 4, 105}: "Innocom, Inc.", + [3]byte{0, 4, 106}: "Navini Networks", + [3]byte{0, 4, 107}: "Palm Wireless, Inc.", + [3]byte{0, 4, 108}: "Cyber Technology Co., Ltd.", + [3]byte{0, 4, 109}: "Cisco Systems, Inc", + [3]byte{0, 4, 110}: "Cisco Systems, Inc", + [3]byte{0, 4, 111}: "Digitel S/A Industria Eletronica", + [3]byte{0, 4, 112}: "ipUnplugged AB", + [3]byte{0, 4, 113}: "IPrad", + [3]byte{0, 4, 114}: "Telelynx, Inc.", + [3]byte{0, 4, 115}: "Photonex Corporation", + [3]byte{0, 4, 116}: "LEGRAND", + [3]byte{0, 4, 117}: "3 Com Corporation", + [3]byte{0, 4, 118}: "3 Com Corporation", + [3]byte{0, 4, 119}: "Scalant Systems, Inc.", + [3]byte{0, 4, 120}: "G. Star Technology Corporation", + [3]byte{0, 4, 121}: "Radius Co., Ltd.", + [3]byte{0, 4, 122}: "AXXESSIT ASA", + [3]byte{0, 4, 123}: "Schlumberger", + [3]byte{0, 4, 124}: "Skidata AG", + [3]byte{0, 4, 125}: "Pelco", + [3]byte{0, 4, 126}: "Siqura B.V.", + [3]byte{0, 4, 127}: "Chr. Mayr GmbH & Co. KG", + [3]byte{0, 4, 128}: "Brocade Communications Systems, Inc.", + [3]byte{0, 4, 129}: "Econolite Control Products, Inc.", + [3]byte{0, 4, 130}: "Medialogic Corp.", + [3]byte{0, 4, 131}: "Deltron Technology, Inc.", + [3]byte{0, 4, 132}: "Amann GmbH", + [3]byte{0, 4, 133}: "PicoLight", + [3]byte{0, 4, 134}: "ITTC, University of Kansas", + [3]byte{0, 4, 135}: "Cogency Semiconductor, Inc.", + [3]byte{0, 4, 136}: "Eurotherm Controls", + [3]byte{0, 4, 137}: "YAFO Networks, Inc.", + [3]byte{0, 4, 138}: "Temia Vertriebs GmbH", + [3]byte{0, 4, 139}: "Poscon Corporation", + [3]byte{0, 4, 140}: "Nayna Networks, Inc.", + [3]byte{0, 4, 141}: "Teo Technologies, Inc", + [3]byte{0, 4, 142}: "Ohm Tech Labs, Inc.", + [3]byte{0, 4, 143}: "TD Systems Corporation", + [3]byte{0, 4, 144}: "Optical Access", + [3]byte{0, 4, 145}: "Technovision, Inc.", + [3]byte{0, 4, 146}: "Hive Internet, Ltd.", + [3]byte{0, 4, 147}: "Tsinghua Unisplendour Co., Ltd.", + [3]byte{0, 4, 148}: "Breezecom, Ltd.", + [3]byte{0, 4, 149}: "Tejas Networks India Limited", + [3]byte{0, 4, 150}: "Extreme Networks, Inc.", + [3]byte{0, 4, 151}: "MacroSystem Digital Video AG", + [3]byte{0, 4, 152}: "Mahi Networks", + [3]byte{0, 4, 153}: "Chino Corporation", + [3]byte{0, 4, 154}: "Cisco Systems, Inc", + [3]byte{0, 4, 155}: "Cisco Systems, Inc", + [3]byte{0, 4, 156}: "Surgient Networks, Inc.", + [3]byte{0, 4, 157}: "Ipanema Technologies", + [3]byte{0, 4, 158}: "Wirelink Co., Ltd.", + [3]byte{0, 4, 159}: "Freescale Semiconductor", + [3]byte{0, 4, 160}: "Verity Instruments, Inc.", + [3]byte{0, 4, 161}: "Pathway Connectivity", + [3]byte{0, 4, 162}: "L.S.I. Japan Co., Ltd.", + [3]byte{0, 4, 163}: "Microchip Technology Inc.", + [3]byte{0, 4, 164}: "NetEnabled, Inc.", + [3]byte{0, 4, 165}: "Barco Projection Systems NV", + [3]byte{0, 4, 166}: "SAF Tehnika Ltd.", + [3]byte{0, 4, 167}: "FabiaTech Corporation", + [3]byte{0, 4, 168}: "Broadmax Technologies, Inc.", + [3]byte{0, 4, 169}: "SandStream Technologies, Inc.", + [3]byte{0, 4, 170}: "Jetstream Communications", + [3]byte{0, 4, 171}: "Comverse Network Systems, Inc.", + [3]byte{0, 4, 172}: "IBM Corp", + [3]byte{0, 4, 173}: "Malibu Networks", + [3]byte{0, 4, 174}: "Sullair Corporation", + [3]byte{0, 4, 175}: "Digital Fountain, Inc.", + [3]byte{0, 4, 176}: "ELESIGN Co., Ltd.", + [3]byte{0, 4, 177}: "Signal Technology, Inc.", + [3]byte{0, 4, 178}: "ESSEGI SRL", + [3]byte{0, 4, 179}: "Videotek, Inc.", + [3]byte{0, 4, 180}: "CIAC", + [3]byte{0, 4, 181}: "Equitrac Corporation", + [3]byte{0, 4, 182}: "Stratex Networks, Inc.", + [3]byte{0, 4, 183}: "AMB i.t. Holding", + [3]byte{0, 4, 184}: "Kumahira Co., Ltd.", + [3]byte{0, 4, 185}: "S.I. Soubou, Inc.", + [3]byte{0, 4, 186}: "KDD Media Will Corporation", + [3]byte{0, 4, 187}: "Bardac Corporation", + [3]byte{0, 4, 188}: "Giantec, Inc.", + [3]byte{0, 4, 189}: "ARRIS Group, Inc.", + [3]byte{0, 4, 190}: "OptXCon, Inc.", + [3]byte{0, 4, 191}: "VersaLogic Corp.", + [3]byte{0, 4, 192}: "Cisco Systems, Inc", + [3]byte{0, 4, 193}: "Cisco Systems, Inc", + [3]byte{0, 4, 194}: "Magnipix, Inc.", + [3]byte{0, 4, 195}: "CASTOR Informatique", + [3]byte{0, 4, 196}: "Allen & Heath Limited", + [3]byte{0, 4, 197}: "ASE Technologies, USA", + [3]byte{0, 4, 198}: "YAMAHA MOTOR CO.,LTD", + [3]byte{0, 4, 199}: "NetMount", + [3]byte{0, 4, 200}: "LIBA Maschinenfabrik GmbH", + [3]byte{0, 4, 201}: "Micro Electron Co., Ltd.", + [3]byte{0, 4, 202}: "FreeMs Corp.", + [3]byte{0, 4, 203}: "Tdsoft Communication, Ltd.", + [3]byte{0, 4, 204}: "Peek Traffic B.V.", + [3]byte{0, 4, 205}: "Extenway Solutions Inc", + [3]byte{0, 4, 206}: "Patria Ailon", + [3]byte{0, 4, 207}: "Seagate Technology", + [3]byte{0, 4, 208}: "Softlink s.r.o.", + [3]byte{0, 4, 209}: "Drew Technologies, Inc.", + [3]byte{0, 4, 210}: "Adcon Telemetry GmbH", + [3]byte{0, 4, 211}: "Toyokeiki Co., Ltd.", + [3]byte{0, 4, 212}: "Proview Electronics Co., Ltd.", + [3]byte{0, 4, 213}: "Hitachi Information & Communication Engineering, Ltd.", + [3]byte{0, 4, 214}: "Takagi Industrial Co., Ltd.", + [3]byte{0, 4, 215}: "Omitec Instrumentation Ltd.", + [3]byte{0, 4, 216}: "IPWireless, Inc.", + [3]byte{0, 4, 217}: "Titan Electronics, Inc.", + [3]byte{0, 4, 218}: "Relax Technology, Inc.", + [3]byte{0, 4, 219}: "Tellus Group Corp.", + [3]byte{0, 4, 220}: "Nortel Networks", + [3]byte{0, 4, 221}: "Cisco Systems, Inc", + [3]byte{0, 4, 222}: "Cisco Systems, Inc", + [3]byte{0, 4, 223}: "Teracom Telematica Ltda.", + [3]byte{0, 4, 224}: "Procket Networks", + [3]byte{0, 4, 225}: "Infinior Microsystems", + [3]byte{0, 4, 226}: "SMC Networks, Inc.", + [3]byte{0, 4, 227}: "Accton Technology Corp", + [3]byte{0, 4, 228}: "Daeryung Ind., Inc.", + [3]byte{0, 4, 229}: "Glonet Systems, Inc.", + [3]byte{0, 4, 230}: "Banyan Network Private Limited", + [3]byte{0, 4, 231}: "Lightpointe Communications, Inc", + [3]byte{0, 4, 232}: "IER, Inc.", + [3]byte{0, 4, 233}: "Infiniswitch Corporation", + [3]byte{0, 4, 234}: "Hewlett Packard", + [3]byte{0, 4, 235}: "Paxonet Communications, Inc.", + [3]byte{0, 4, 236}: "Memobox SA", + [3]byte{0, 4, 237}: "Billion Electric Co., Ltd.", + [3]byte{0, 4, 238}: "Lincoln Electric Company", + [3]byte{0, 4, 239}: "Polestar Corp.", + [3]byte{0, 4, 240}: "International Computers, Ltd", + [3]byte{0, 4, 241}: "WhereNet", + [3]byte{0, 4, 242}: "Polycom", + [3]byte{0, 4, 243}: "FS FORTH-SYSTEME GmbH", + [3]byte{0, 4, 244}: "Infinite Electronics Inc.", + [3]byte{0, 4, 245}: "SnowShore Networks, Inc.", + [3]byte{0, 4, 246}: "Amphus", + [3]byte{0, 4, 247}: "Omega Band, Inc.", + [3]byte{0, 4, 248}: "QUALICABLE TV Industria E Com., Ltda", + [3]byte{0, 4, 249}: "Xtera Communications, Inc.", + [3]byte{0, 4, 250}: "NBS Technologies Inc.", + [3]byte{0, 4, 251}: "Commtech, Inc.", + [3]byte{0, 4, 252}: "Stratus Computer (DE), Inc.", + [3]byte{0, 4, 253}: "Japan Control Engineering Co., Ltd.", + [3]byte{0, 4, 254}: "Pelago Networks", + [3]byte{0, 4, 255}: "Acronet Co., Ltd.", + [3]byte{0, 5, 0}: "Cisco Systems, Inc", + [3]byte{0, 5, 1}: "Cisco Systems, Inc", + [3]byte{0, 5, 2}: "Apple, Inc.", + [3]byte{0, 5, 3}: "ICONAG", + [3]byte{0, 5, 4}: "Naray Information & Communication Enterprise", + [3]byte{0, 5, 5}: "Systems Integration Solutions, Inc.", + [3]byte{0, 5, 6}: "Reddo Networks AB", + [3]byte{0, 5, 7}: "Fine Appliance Corp.", + [3]byte{0, 5, 8}: "Inetcam, Inc.", + [3]byte{0, 5, 9}: "AVOC Nishimura Ltd.", + [3]byte{0, 5, 10}: "ICS Spa", + [3]byte{0, 5, 11}: "SICOM Systems, Inc.", + [3]byte{0, 5, 12}: "Network Photonics, Inc.", + [3]byte{0, 5, 13}: "Midstream Technologies, Inc.", + [3]byte{0, 5, 14}: "3ware, Inc.", + [3]byte{0, 5, 15}: "Tanaka S/S Ltd.", + [3]byte{0, 5, 16}: "Infinite Shanghai Communication Terminals Ltd.", + [3]byte{0, 5, 17}: "Complementary Technologies Ltd", + [3]byte{0, 5, 18}: "Zebra Technologies Inc", + [3]byte{0, 5, 19}: "VTLinx Multimedia Systems, Inc.", + [3]byte{0, 5, 20}: "KDT Systems Co., Ltd.", + [3]byte{0, 5, 21}: "Nuark Co., Ltd.", + [3]byte{0, 5, 22}: "SMART Modular Technologies", + [3]byte{0, 5, 23}: "Shellcomm, Inc.", + [3]byte{0, 5, 24}: "Jupiters Technology", + [3]byte{0, 5, 25}: "Siemens Building Technologies AG,", + [3]byte{0, 5, 26}: "3COM EUROPE LTD.", + [3]byte{0, 5, 27}: "Magic Control Technology Corporation", + [3]byte{0, 5, 28}: "Xnet Technology Corp.", + [3]byte{0, 5, 29}: "Airocon, Inc.", + [3]byte{0, 5, 30}: "Brocade Communications Systems, Inc.", + [3]byte{0, 5, 31}: "Taijin Media Co., Ltd.", + [3]byte{0, 5, 32}: "Smartronix, Inc.", + [3]byte{0, 5, 33}: "Control Microsystems", + [3]byte{0, 5, 34}: "LEA*D Corporation, Inc.", + [3]byte{0, 5, 35}: "AVL List GmbH", + [3]byte{0, 5, 36}: "BTL System (HK) Limited", + [3]byte{0, 5, 37}: "Puretek Industrial Co., Ltd.", + [3]byte{0, 5, 38}: "IPAS GmbH", + [3]byte{0, 5, 39}: "SJ Tek Co. Ltd", + [3]byte{0, 5, 40}: "New Focus, Inc.", + [3]byte{0, 5, 41}: "Shanghai Broadan Communication Technology Co., Ltd", + [3]byte{0, 5, 42}: "Ikegami Tsushinki Co., Ltd.", + [3]byte{0, 5, 43}: "HORIBA, Ltd.", + [3]byte{0, 5, 44}: "Supreme Magic Corporation", + [3]byte{0, 5, 45}: "Zoltrix International Limited", + [3]byte{0, 5, 46}: "Cinta Networks", + [3]byte{0, 5, 47}: "Leviton Network Solutions", + [3]byte{0, 5, 48}: "Andiamo Systems, Inc.", + [3]byte{0, 5, 49}: "Cisco Systems, Inc", + [3]byte{0, 5, 50}: "Cisco Systems, Inc", + [3]byte{0, 5, 51}: "Brocade Communications Systems, Inc.", + [3]byte{0, 5, 52}: "Northstar Engineering Ltd.", + [3]byte{0, 5, 53}: "Chip PC Ltd.", + [3]byte{0, 5, 54}: "Danam Communications, Inc.", + [3]byte{0, 5, 55}: "Nets Technology Co., Ltd.", + [3]byte{0, 5, 56}: "Merilus, Inc.", + [3]byte{0, 5, 57}: "A Brand New World in Sweden AB", + [3]byte{0, 5, 58}: "Willowglen Services Pte Ltd", + [3]byte{0, 5, 59}: "Harbour Networks Ltd., Co. Beijing", + [3]byte{0, 5, 60}: "XIRCOM", + [3]byte{0, 5, 61}: "Agere Systems", + [3]byte{0, 5, 62}: "KID Systeme GmbH", + [3]byte{0, 5, 63}: "VisionTek, Inc.", + [3]byte{0, 5, 64}: "FAST Corporation", + [3]byte{0, 5, 65}: "Advanced Systems Co., Ltd.", + [3]byte{0, 5, 66}: "Otari, Inc.", + [3]byte{0, 5, 67}: "IQ Wireless GmbH", + [3]byte{0, 5, 68}: "Valley Technologies, Inc.", + [3]byte{0, 5, 69}: "Internet Photonics", + [3]byte{0, 5, 70}: "KDDI Network & Solultions Inc.", + [3]byte{0, 5, 71}: "Starent Networks", + [3]byte{0, 5, 72}: "Disco Corporation", + [3]byte{0, 5, 73}: "Salira Optical Network Systems", + [3]byte{0, 5, 74}: "Ario Data Networks, Inc.", + [3]byte{0, 5, 75}: "Eaton Automation AG", + [3]byte{0, 5, 76}: "RF Innovations Pty Ltd", + [3]byte{0, 5, 77}: "Brans Technologies, Inc.", + [3]byte{0, 5, 78}: "Philips", + [3]byte{0, 5, 79}: "Garmin International", + [3]byte{0, 5, 80}: "Vcomms Connect Limited", + [3]byte{0, 5, 81}: "F & S Elektronik Systeme GmbH", + [3]byte{0, 5, 82}: "Xycotec Computer GmbH", + [3]byte{0, 5, 83}: "DVC Company, Inc.", + [3]byte{0, 5, 84}: "Rangestar Wireless", + [3]byte{0, 5, 85}: "Japan Cash Machine Co., Ltd.", + [3]byte{0, 5, 86}: "360 Systems", + [3]byte{0, 5, 87}: "Agile TV Corporation", + [3]byte{0, 5, 88}: "Synchronous, Inc.", + [3]byte{0, 5, 89}: "Intracom S.A.", + [3]byte{0, 5, 90}: "Power Dsine Ltd.", + [3]byte{0, 5, 91}: "Charles Industries, Ltd.", + [3]byte{0, 5, 92}: "Kowa Company, Ltd.", + [3]byte{0, 5, 93}: "D-LINK SYSTEMS, INC.", + [3]byte{0, 5, 94}: "Cisco Systems, Inc", + [3]byte{0, 5, 95}: "Cisco Systems, Inc", + [3]byte{0, 5, 96}: "LEADER COMM.CO., LTD", + [3]byte{0, 5, 97}: "nac Image Technology, Inc.", + [3]byte{0, 5, 98}: "Digital View Limited", + [3]byte{0, 5, 99}: "J-Works, Inc.", + [3]byte{0, 5, 100}: "Tsinghua Bitway Co., Ltd.", + [3]byte{0, 5, 101}: "Tailyn Communication Company Ltd.", + [3]byte{0, 5, 102}: "Secui.com Corporation", + [3]byte{0, 5, 103}: "Etymonic Design, Inc.", + [3]byte{0, 5, 104}: "Piltofish Networks AB", + [3]byte{0, 5, 105}: "VMware, Inc.", + [3]byte{0, 5, 106}: "Heuft Systemtechnik GmbH", + [3]byte{0, 5, 107}: "C.P. Technology Co., Ltd.", + [3]byte{0, 5, 108}: "Hung Chang Co., Ltd.", + [3]byte{0, 5, 109}: "Pacific Corporation", + [3]byte{0, 5, 110}: "National Enhance Technology, Inc.", + [3]byte{0, 5, 111}: "Innomedia Technologies Pvt. Ltd.", + [3]byte{0, 5, 112}: "Baydel Ltd.", + [3]byte{0, 5, 113}: "Seiwa Electronics Co.", + [3]byte{0, 5, 114}: "Deonet Co., Ltd.", + [3]byte{0, 5, 115}: "Cisco Systems, Inc", + [3]byte{0, 5, 116}: "Cisco Systems, Inc", + [3]byte{0, 5, 117}: "CDS-Electronics BV", + [3]byte{0, 5, 118}: "NSM Technology Ltd.", + [3]byte{0, 5, 119}: "SM Information & Communication", + [3]byte{0, 5, 120}: "Private", + [3]byte{0, 5, 121}: "Universal Control Solution Corp.", + [3]byte{0, 5, 122}: "Overture Networks", + [3]byte{0, 5, 123}: "Chung Nam Electronic Co., Ltd.", + [3]byte{0, 5, 124}: "RCO Security AB", + [3]byte{0, 5, 125}: "Sun Communications, Inc.", + [3]byte{0, 5, 126}: "Eckelmann Steuerungstechnik GmbH", + [3]byte{0, 5, 127}: "Acqis Technology", + [3]byte{0, 5, 128}: "FibroLAN Ltd.", + [3]byte{0, 5, 129}: "Snell", + [3]byte{0, 5, 130}: "ClearCube Technology", + [3]byte{0, 5, 131}: "ImageCom Limited", + [3]byte{0, 5, 132}: "AbsoluteValue Systems, Inc.", + [3]byte{0, 5, 133}: "Juniper Networks", + [3]byte{0, 5, 134}: "Lucent Technologies", + [3]byte{0, 5, 135}: "Locus, Incorporated", + [3]byte{0, 5, 136}: "Sensoria Corp.", + [3]byte{0, 5, 137}: "National Datacomputer", + [3]byte{0, 5, 138}: "Netcom Co., Ltd.", + [3]byte{0, 5, 139}: "IPmental, Inc.", + [3]byte{0, 5, 140}: "Opentech Inc.", + [3]byte{0, 5, 141}: "Lynx Photonic Networks, Inc.", + [3]byte{0, 5, 142}: "Flextronics International GmbH & Co. Nfg. KG", + [3]byte{0, 5, 143}: "CLCsoft co.", + [3]byte{0, 5, 144}: "Swissvoice Ltd.", + [3]byte{0, 5, 145}: "Active Silicon Ltd", + [3]byte{0, 5, 146}: "Pultek Corp.", + [3]byte{0, 5, 147}: "Grammar Engine Inc.", + [3]byte{0, 5, 148}: "HMS Industrial Networks", + [3]byte{0, 5, 149}: "Alesis Corporation", + [3]byte{0, 5, 150}: "Genotech Co., Ltd.", + [3]byte{0, 5, 151}: "Eagle Traffic Control Systems", + [3]byte{0, 5, 152}: "CRONOS S.r.l.", + [3]byte{0, 5, 153}: "DRS Test and Energy Management or DRS-TEM", + [3]byte{0, 5, 154}: "Cisco Systems, Inc", + [3]byte{0, 5, 155}: "Cisco Systems, Inc", + [3]byte{0, 5, 156}: "Kleinknecht GmbH, Ing. Büro", + [3]byte{0, 5, 157}: "Daniel Computing Systems, Inc.", + [3]byte{0, 5, 158}: "Zinwell Corporation", + [3]byte{0, 5, 159}: "Yotta Networks, Inc.", + [3]byte{0, 5, 160}: "MOBILINE Kft.", + [3]byte{0, 5, 161}: "Zenocom", + [3]byte{0, 5, 162}: "CELOX Networks", + [3]byte{0, 5, 163}: "QEI, Inc.", + [3]byte{0, 5, 164}: "Lucid Voice Ltd.", + [3]byte{0, 5, 165}: "KOTT", + [3]byte{0, 5, 166}: "Extron Electronics", + [3]byte{0, 5, 167}: "HYPERCHIP Inc.", + [3]byte{0, 5, 168}: "WYLE ELECTRONICS", + [3]byte{0, 5, 169}: "Princeton Networks, Inc.", + [3]byte{0, 5, 170}: "Moore Industries International Inc.", + [3]byte{0, 5, 171}: "Cyber Fone, Inc.", + [3]byte{0, 5, 172}: "Northern Digital, Inc.", + [3]byte{0, 5, 173}: "Topspin Communications, Inc.", + [3]byte{0, 5, 174}: "Mediaport USA", + [3]byte{0, 5, 175}: "InnoScan Computing A/S", + [3]byte{0, 5, 176}: "Korea Computer Technology Co., Ltd.", + [3]byte{0, 5, 177}: "ASB Technology BV", + [3]byte{0, 5, 178}: "Medison Co., Ltd.", + [3]byte{0, 5, 179}: "Asahi-Engineering Co., Ltd.", + [3]byte{0, 5, 180}: "Aceex Corporation", + [3]byte{0, 5, 181}: "Broadcom Technologies", + [3]byte{0, 5, 182}: "INSYS Microelectronics GmbH", + [3]byte{0, 5, 183}: "Arbor Technology Corp.", + [3]byte{0, 5, 184}: "Electronic Design Associates, Inc.", + [3]byte{0, 5, 185}: "Airvana, Inc.", + [3]byte{0, 5, 186}: "Area Netwoeks, Inc.", + [3]byte{0, 5, 187}: "Myspace AB", + [3]byte{0, 5, 188}: "Resource Data Management Ltd", + [3]byte{0, 5, 189}: "ROAX BV", + [3]byte{0, 5, 190}: "Kongsberg Seatex AS", + [3]byte{0, 5, 191}: "JustEzy Technology, Inc.", + [3]byte{0, 5, 192}: "Digital Network Alacarte Co., Ltd.", + [3]byte{0, 5, 193}: "A-Kyung Motion, Inc.", + [3]byte{0, 5, 194}: "Soronti, Inc.", + [3]byte{0, 5, 195}: "Pacific Instruments, Inc.", + [3]byte{0, 5, 196}: "Telect, Inc.", + [3]byte{0, 5, 197}: "Flaga HF", + [3]byte{0, 5, 198}: "Triz Communications", + [3]byte{0, 5, 199}: "I/F-COM A/S", + [3]byte{0, 5, 200}: "VERYTECH", + [3]byte{0, 5, 201}: "LG Innotek Co., Ltd.", + [3]byte{0, 5, 202}: "Hitron Technology, Inc.", + [3]byte{0, 5, 203}: "ROIS Technologies, Inc.", + [3]byte{0, 5, 204}: "Sumtel Communications, Inc.", + [3]byte{0, 5, 205}: "D&M Holdings Inc.", + [3]byte{0, 5, 206}: "Prolink Microsystems Corporation", + [3]byte{0, 5, 207}: "Thunder River Technologies, Inc.", + [3]byte{0, 5, 208}: "Solinet Systems", + [3]byte{0, 5, 209}: "Metavector Technologies", + [3]byte{0, 5, 210}: "DAP Technologies", + [3]byte{0, 5, 211}: "eProduction Solutions, Inc.", + [3]byte{0, 5, 212}: "FutureSmart Networks, Inc.", + [3]byte{0, 5, 213}: "Speedcom Wireless", + [3]byte{0, 5, 214}: "L-3 Linkabit", + [3]byte{0, 5, 215}: "Vista Imaging, Inc.", + [3]byte{0, 5, 216}: "Arescom, Inc.", + [3]byte{0, 5, 217}: "Techno Valley, Inc.", + [3]byte{0, 5, 218}: "Apex Automationstechnik", + [3]byte{0, 5, 219}: "PSI Nentec GmbH", + [3]byte{0, 5, 220}: "Cisco Systems, Inc", + [3]byte{0, 5, 221}: "Cisco Systems, Inc", + [3]byte{0, 5, 222}: "Gi Fone Korea, Inc.", + [3]byte{0, 5, 223}: "Electronic Innovation, Inc.", + [3]byte{0, 5, 224}: "Empirix Corp.", + [3]byte{0, 5, 225}: "Trellis Photonics, Ltd.", + [3]byte{0, 5, 226}: "Creativ Network Technologies", + [3]byte{0, 5, 227}: "LightSand Communications, Inc.", + [3]byte{0, 5, 228}: "Red Lion Controls Inc.", + [3]byte{0, 5, 229}: "Renishaw PLC", + [3]byte{0, 5, 230}: "Egenera, Inc.", + [3]byte{0, 5, 231}: "Netrake an AudioCodes Company", + [3]byte{0, 5, 232}: "TurboWave, Inc.", + [3]byte{0, 5, 233}: "Unicess Network, Inc.", + [3]byte{0, 5, 234}: "Rednix", + [3]byte{0, 5, 235}: "Blue Ridge Networks, Inc.", + [3]byte{0, 5, 236}: "Mosaic Systems Inc.", + [3]byte{0, 5, 237}: "Technikum Joanneum GmbH", + [3]byte{0, 5, 238}: "Vanderbilt International (SWE) AB", + [3]byte{0, 5, 239}: "ADOIR Digital Technology", + [3]byte{0, 5, 240}: "SATEC", + [3]byte{0, 5, 241}: "Vrcom, Inc.", + [3]byte{0, 5, 242}: "Power R, Inc.", + [3]byte{0, 5, 243}: "Webyn", + [3]byte{0, 5, 244}: "System Base Co., Ltd.", + [3]byte{0, 5, 245}: "Geospace Technologies", + [3]byte{0, 5, 246}: "Young Chang Co. Ltd.", + [3]byte{0, 5, 247}: "Analog Devices, Inc.", + [3]byte{0, 5, 248}: "Real Time Access, Inc.", + [3]byte{0, 5, 249}: "TOA Corporation", + [3]byte{0, 5, 250}: "IPOptical, Inc.", + [3]byte{0, 5, 251}: "ShareGate, Inc.", + [3]byte{0, 5, 252}: "Schenck Pegasus Corp.", + [3]byte{0, 5, 253}: "PacketLight Networks Ltd.", + [3]byte{0, 5, 254}: "Traficon N.V.", + [3]byte{0, 5, 255}: "SNS Solutions, Inc.", + [3]byte{0, 6, 0}: "Toshiba Teli Corporation", + [3]byte{0, 6, 1}: "Otanikeiki Co., Ltd.", + [3]byte{0, 6, 2}: "Cirkitech Electronics Co.", + [3]byte{0, 6, 3}: "Baker Hughes Inc.", + [3]byte{0, 6, 4}: "@Track Communications, Inc.", + [3]byte{0, 6, 5}: "Inncom International, Inc.", + [3]byte{0, 6, 6}: "RapidWAN, Inc.", + [3]byte{0, 6, 7}: "Omni Directional Control Technology Inc.", + [3]byte{0, 6, 8}: "At-Sky SAS", + [3]byte{0, 6, 9}: "Crossport Systems", + [3]byte{0, 6, 10}: "Blue2space", + [3]byte{0, 6, 11}: "Artesyn Embedded Technologies", + [3]byte{0, 6, 12}: "Melco Industries, Inc.", + [3]byte{0, 6, 13}: "Wave7 Optics", + [3]byte{0, 6, 14}: "IGYS Systems, Inc.", + [3]byte{0, 6, 15}: "Narad Networks Inc", + [3]byte{0, 6, 16}: "Abeona Networks Inc", + [3]byte{0, 6, 17}: "Zeus Wireless, Inc.", + [3]byte{0, 6, 18}: "Accusys, Inc.", + [3]byte{0, 6, 19}: "Kawasaki Microelectronics Incorporated", + [3]byte{0, 6, 20}: "Prism Holdings", + [3]byte{0, 6, 21}: "Kimoto Electric Co., Ltd.", + [3]byte{0, 6, 22}: "Tel Net Co., Ltd.", + [3]byte{0, 6, 23}: "Redswitch Inc.", + [3]byte{0, 6, 24}: "DigiPower Manufacturing Inc.", + [3]byte{0, 6, 25}: "Connection Technology Systems", + [3]byte{0, 6, 26}: "Zetari Inc.", + [3]byte{0, 6, 27}: "Notebook Development Lab. Lenovo Japan Ltd.", + [3]byte{0, 6, 28}: "Hoshino Metal Industries, Ltd.", + [3]byte{0, 6, 29}: "MIP Telecom, Inc.", + [3]byte{0, 6, 30}: "Maxan Systems", + [3]byte{0, 6, 31}: "Vision Components GmbH", + [3]byte{0, 6, 32}: "Serial System Ltd.", + [3]byte{0, 6, 33}: "Hinox, Co., Ltd.", + [3]byte{0, 6, 34}: "Chung Fu Chen Yeh Enterprise Corp.", + [3]byte{0, 6, 35}: "MGE UPS Systems France", + [3]byte{0, 6, 36}: "Gentner Communications Corp.", + [3]byte{0, 6, 37}: "The Linksys Group, Inc.", + [3]byte{0, 6, 38}: "MWE GmbH", + [3]byte{0, 6, 39}: "Uniwide Technologies, Inc.", + [3]byte{0, 6, 40}: "Cisco Systems, Inc", + [3]byte{0, 6, 41}: "IBM Corp", + [3]byte{0, 6, 42}: "Cisco Systems, Inc", + [3]byte{0, 6, 43}: "INTRASERVER TECHNOLOGY", + [3]byte{0, 6, 44}: "Bivio Networks", + [3]byte{0, 6, 45}: "TouchStar Technologies, L.L.C.", + [3]byte{0, 6, 46}: "Aristos Logic Corp.", + [3]byte{0, 6, 47}: "Pivotech Systems Inc.", + [3]byte{0, 6, 48}: "Adtranz Sweden", + [3]byte{0, 6, 49}: "Calix Inc.", + [3]byte{0, 6, 50}: "Mesco Engineering GmbH", + [3]byte{0, 6, 51}: "Cross Match Technologies GmbH", + [3]byte{0, 6, 52}: "GTE Airfone Inc.", + [3]byte{0, 6, 53}: "PacketAir Networks, Inc.", + [3]byte{0, 6, 54}: "Jedai Broadband Networks", + [3]byte{0, 6, 55}: "Toptrend-Meta Information (ShenZhen) Inc.", + [3]byte{0, 6, 56}: "Sungjin C&C Co., Ltd.", + [3]byte{0, 6, 57}: "Newtec", + [3]byte{0, 6, 58}: "Dura Micro, Inc.", + [3]byte{0, 6, 59}: "Arcturus Networks Inc.", + [3]byte{0, 6, 60}: "Intrinsyc Software International Inc.", + [3]byte{0, 6, 61}: "Microwave Data Systems Inc.", + [3]byte{0, 6, 62}: "Opthos Inc.", + [3]byte{0, 6, 63}: "Everex Communications Inc.", + [3]byte{0, 6, 64}: "White Rock Networks", + [3]byte{0, 6, 65}: "ITCN", + [3]byte{0, 6, 66}: "Genetel Systems Inc.", + [3]byte{0, 6, 67}: "SONO Computer Co., Ltd.", + [3]byte{0, 6, 68}: "neix,Inc", + [3]byte{0, 6, 69}: "Meisei Electric Co. Ltd.", + [3]byte{0, 6, 70}: "ShenZhen XunBao Network Technology Co Ltd", + [3]byte{0, 6, 71}: "Etrali S.A.", + [3]byte{0, 6, 72}: "Seedsware, Inc.", + [3]byte{0, 6, 73}: "3M Deutschland GmbH", + [3]byte{0, 6, 74}: "Honeywell Co., Ltd. (KOREA)", + [3]byte{0, 6, 75}: "Alexon Co., Ltd.", + [3]byte{0, 6, 76}: "Invicta Networks, Inc.", + [3]byte{0, 6, 77}: "Sencore", + [3]byte{0, 6, 78}: "Broad Net Technology Inc.", + [3]byte{0, 6, 79}: "PRO-NETS Technology Corporation", + [3]byte{0, 6, 80}: "Tiburon Networks, Inc.", + [3]byte{0, 6, 81}: "Aspen Networks Inc.", + [3]byte{0, 6, 82}: "Cisco Systems, Inc", + [3]byte{0, 6, 83}: "Cisco Systems, Inc", + [3]byte{0, 6, 84}: "Winpresa Building Automation Technologies GmbH", + [3]byte{0, 6, 85}: "Yipee, Inc.", + [3]byte{0, 6, 86}: "Tactel AB", + [3]byte{0, 6, 87}: "Market Central, Inc.", + [3]byte{0, 6, 88}: "Helmut Fischer GmbH Institut für Elektronik und Messtechnik", + [3]byte{0, 6, 89}: "EAL (Apeldoorn) B.V.", + [3]byte{0, 6, 90}: "Strix Systems", + [3]byte{0, 6, 91}: "Dell Inc.", + [3]byte{0, 6, 92}: "Malachite Technologies, Inc.", + [3]byte{0, 6, 93}: "Heidelberg Web Systems", + [3]byte{0, 6, 94}: "Photuris, Inc.", + [3]byte{0, 6, 95}: "ECI Telecom Ltd.", + [3]byte{0, 6, 96}: "NADEX Co., Ltd.", + [3]byte{0, 6, 97}: "NIA Home Technologies Corp.", + [3]byte{0, 6, 98}: "MBM Technology Ltd.", + [3]byte{0, 6, 99}: "Human Technology Co., Ltd.", + [3]byte{0, 6, 100}: "Fostex Corporation", + [3]byte{0, 6, 101}: "Sunny Giken, Inc.", + [3]byte{0, 6, 102}: "Roving Networks", + [3]byte{0, 6, 103}: "Tripp Lite", + [3]byte{0, 6, 104}: "Vicon Industries Inc.", + [3]byte{0, 6, 105}: "Datasound Laboratories Ltd", + [3]byte{0, 6, 106}: "InfiniCon Systems, Inc.", + [3]byte{0, 6, 107}: "Sysmex Corporation", + [3]byte{0, 6, 108}: "Robinson Corporation", + [3]byte{0, 6, 109}: "Compuprint S.P.A.", + [3]byte{0, 6, 110}: "Delta Electronics, Inc.", + [3]byte{0, 6, 111}: "Korea Data Systems", + [3]byte{0, 6, 112}: "Upponetti Oy", + [3]byte{0, 6, 113}: "Softing AG", + [3]byte{0, 6, 114}: "Netezza", + [3]byte{0, 6, 115}: "TKH Security Solutions USA", + [3]byte{0, 6, 116}: "Spectrum Control, Inc.", + [3]byte{0, 6, 117}: "Banderacom, Inc.", + [3]byte{0, 6, 118}: "Novra Technologies Inc.", + [3]byte{0, 6, 119}: "SICK AG", + [3]byte{0, 6, 120}: "D&M Holdings Inc.", + [3]byte{0, 6, 121}: "Konami Corporation", + [3]byte{0, 6, 122}: "JMP Systems", + [3]byte{0, 6, 123}: "Toplink C&C Corporation", + [3]byte{0, 6, 124}: "Cisco Systems, Inc", + [3]byte{0, 6, 125}: "Takasago Ltd.", + [3]byte{0, 6, 126}: "WinCom Systems, Inc.", + [3]byte{0, 6, 127}: "Digeo, Inc.", + [3]byte{0, 6, 128}: "Card Access, Inc.", + [3]byte{0, 6, 129}: "Goepel Electronic GmbH", + [3]byte{0, 6, 130}: "Convedia", + [3]byte{0, 6, 131}: "Bravara Communications, Inc.", + [3]byte{0, 6, 132}: "Biacore AB", + [3]byte{0, 6, 133}: "NetNearU Corporation", + [3]byte{0, 6, 134}: "ZARDCOM Co., Ltd.", + [3]byte{0, 6, 135}: "Omnitron Systems Technology, Inc.", + [3]byte{0, 6, 136}: "Telways Communication Co., Ltd.", + [3]byte{0, 6, 137}: "yLez Technologies Pte Ltd", + [3]byte{0, 6, 138}: "NeuronNet Co. Ltd. R&D Center", + [3]byte{0, 6, 139}: "AirRunner Technologies, Inc.", + [3]byte{0, 6, 140}: "3COM CORPORATION", + [3]byte{0, 6, 141}: "SEPATON, Inc.", + [3]byte{0, 6, 142}: "HID Corporation", + [3]byte{0, 6, 143}: "Telemonitor, Inc.", + [3]byte{0, 6, 144}: "Euracom Communication GmbH", + [3]byte{0, 6, 145}: "PT Inovacao", + [3]byte{0, 6, 146}: "Intruvert Networks, Inc.", + [3]byte{0, 6, 147}: "Flexus Computer Technology, Inc.", + [3]byte{0, 6, 148}: "Mobillian Corporation", + [3]byte{0, 6, 149}: "Ensure Technologies, Inc.", + [3]byte{0, 6, 150}: "Advent Networks", + [3]byte{0, 6, 151}: "R & D Center", + [3]byte{0, 6, 152}: "egnite GmbH", + [3]byte{0, 6, 153}: "Vida Design Co.", + [3]byte{0, 6, 154}: "e & Tel", + [3]byte{0, 6, 155}: "AVT Audio Video Technologies GmbH", + [3]byte{0, 6, 156}: "Transmode Systems AB", + [3]byte{0, 6, 157}: "Petards Ltd", + [3]byte{0, 6, 158}: "UNIQA, Inc.", + [3]byte{0, 6, 159}: "Kuokoa Networks", + [3]byte{0, 6, 160}: "Mx Imaging", + [3]byte{0, 6, 161}: "Celsian Technologies, Inc.", + [3]byte{0, 6, 162}: "Microtune, Inc.", + [3]byte{0, 6, 163}: "Bitran Corporation", + [3]byte{0, 6, 164}: "INNOWELL Corp.", + [3]byte{0, 6, 165}: "PINON Corp.", + [3]byte{0, 6, 166}: "Artistic Licence Engineering Ltd", + [3]byte{0, 6, 167}: "Primarion", + [3]byte{0, 6, 168}: "KC Technology, Inc.", + [3]byte{0, 6, 169}: "Universal Instruments Corp.", + [3]byte{0, 6, 170}: "VT Miltope", + [3]byte{0, 6, 171}: "W-Link Systems, Inc.", + [3]byte{0, 6, 172}: "Intersoft Co.", + [3]byte{0, 6, 173}: "KB Electronics Ltd.", + [3]byte{0, 6, 174}: "Himachal Futuristic Communications Ltd", + [3]byte{0, 6, 175}: "Xalted Networks", + [3]byte{0, 6, 176}: "Comtech EF Data Corp.", + [3]byte{0, 6, 177}: "Sonicwall", + [3]byte{0, 6, 178}: "Linxtek Co.", + [3]byte{0, 6, 179}: "Diagraph Corporation", + [3]byte{0, 6, 180}: "Vorne Industries, Inc.", + [3]byte{0, 6, 181}: "Source Photonics, Inc.", + [3]byte{0, 6, 182}: "Nir-Or Israel Ltd.", + [3]byte{0, 6, 183}: "TELEM GmbH", + [3]byte{0, 6, 184}: "Bandspeed Pty Ltd", + [3]byte{0, 6, 185}: "A5TEK Corp.", + [3]byte{0, 6, 186}: "Westwave Communications", + [3]byte{0, 6, 187}: "ATI Technologies Inc.", + [3]byte{0, 6, 188}: "Macrolink, Inc.", + [3]byte{0, 6, 189}: "BNTECHNOLOGY Co., Ltd.", + [3]byte{0, 6, 190}: "Baumer Optronic GmbH", + [3]byte{0, 6, 191}: "Accella Technologies Co., Ltd.", + [3]byte{0, 6, 192}: "United Internetworks, Inc.", + [3]byte{0, 6, 193}: "Cisco Systems, Inc", + [3]byte{0, 6, 194}: "Smartmatic Corporation", + [3]byte{0, 6, 195}: "Schindler Elevator Ltd.", + [3]byte{0, 6, 196}: "Piolink Inc.", + [3]byte{0, 6, 197}: "INNOVI Technologies Limited", + [3]byte{0, 6, 198}: "lesswire AG", + [3]byte{0, 6, 199}: "RFNET Technologies Pte Ltd (S)", + [3]byte{0, 6, 200}: "Sumitomo Metal Micro Devices, Inc.", + [3]byte{0, 6, 201}: "Technical Marketing Research, Inc.", + [3]byte{0, 6, 202}: "American Computer & Digital Components, Inc. (ACDC)", + [3]byte{0, 6, 203}: "Jotron Electronics A/S", + [3]byte{0, 6, 204}: "JMI Electronics Co., Ltd.", + [3]byte{0, 6, 205}: "Leaf Imaging Ltd.", + [3]byte{0, 6, 206}: "DATENO", + [3]byte{0, 6, 207}: "Thales Avionics In-Flight Systems, LLC", + [3]byte{0, 6, 208}: "Elgar Electronics Corp.", + [3]byte{0, 6, 209}: "Tahoe Networks, Inc.", + [3]byte{0, 6, 210}: "Tundra Semiconductor Corp.", + [3]byte{0, 6, 211}: "Alpha Telecom, Inc. U.S.A.", + [3]byte{0, 6, 212}: "Interactive Objects, Inc.", + [3]byte{0, 6, 213}: "Diamond Systems Corp.", + [3]byte{0, 6, 214}: "Cisco Systems, Inc", + [3]byte{0, 6, 215}: "Cisco Systems, Inc", + [3]byte{0, 6, 216}: "Maple Optical Systems", + [3]byte{0, 6, 217}: "IPM-Net S.p.A.", + [3]byte{0, 6, 218}: "ITRAN Communications Ltd.", + [3]byte{0, 6, 219}: "ICHIPS Co., Ltd.", + [3]byte{0, 6, 220}: "Syabas Technology (Amquest)", + [3]byte{0, 6, 221}: "AT & T Laboratories - Cambridge Ltd", + [3]byte{0, 6, 222}: "Flash Technology", + [3]byte{0, 6, 223}: "AIDONIC Corporation", + [3]byte{0, 6, 224}: "MAT Co., Ltd.", + [3]byte{0, 6, 225}: "Techno Trade s.a", + [3]byte{0, 6, 226}: "Ceemax Technology Co., Ltd.", + [3]byte{0, 6, 227}: "Quantitative Imaging Corporation", + [3]byte{0, 6, 228}: "Citel Technologies Ltd.", + [3]byte{0, 6, 229}: "Fujian Newland Computer Ltd. Co.", + [3]byte{0, 6, 230}: "DongYang Telecom Co., Ltd.", + [3]byte{0, 6, 231}: "Bit Blitz Communications Inc.", + [3]byte{0, 6, 232}: "Optical Network Testing, Inc.", + [3]byte{0, 6, 233}: "Intime Corp.", + [3]byte{0, 6, 234}: "ELZET80 Mikrocomputer GmbH&Co. KG", + [3]byte{0, 6, 235}: "Global Data", + [3]byte{0, 6, 236}: "Harris Corporation", + [3]byte{0, 6, 237}: "Inara Networks", + [3]byte{0, 6, 238}: "Shenyang Neu-era Information & Technology Stock Co., Ltd", + [3]byte{0, 6, 239}: "Maxxan Systems, Inc.", + [3]byte{0, 6, 240}: "Digeo, Inc.", + [3]byte{0, 6, 241}: "Optillion", + [3]byte{0, 6, 242}: "Platys Communications", + [3]byte{0, 6, 243}: "AcceLight Networks", + [3]byte{0, 6, 244}: "Prime Electronics & Satellitics Inc.", + [3]byte{0, 6, 245}: "ALPS ELECTRIC CO.,LTD.", + [3]byte{0, 6, 246}: "Cisco Systems, Inc", + [3]byte{0, 6, 247}: "ALPS ELECTRIC CO.,LTD.", + [3]byte{0, 6, 248}: "The Boeing Company", + [3]byte{0, 6, 249}: "Mitsui Zosen Systems Research Inc.", + [3]byte{0, 6, 250}: "IP SQUARE Co, Ltd.", + [3]byte{0, 6, 251}: "Hitachi Printing Solutions, Ltd.", + [3]byte{0, 6, 252}: "Fnet Co., Ltd.", + [3]byte{0, 6, 253}: "Comjet Information Systems Corp.", + [3]byte{0, 6, 254}: "Ambrado, Inc", + [3]byte{0, 6, 255}: "Sheba Systems Co., Ltd.", + [3]byte{0, 7, 0}: "Zettamedia Korea", + [3]byte{0, 7, 1}: "RACAL-DATACOM", + [3]byte{0, 7, 2}: "Varian Medical Systems", + [3]byte{0, 7, 3}: "CSEE Transport", + [3]byte{0, 7, 4}: "ALPS ELECTRIC CO.,LTD.", + [3]byte{0, 7, 5}: "Endress & Hauser GmbH & Co", + [3]byte{0, 7, 6}: "Sanritz Corporation", + [3]byte{0, 7, 7}: "Interalia Inc.", + [3]byte{0, 7, 8}: "Bitrage Inc.", + [3]byte{0, 7, 9}: "Westerstrand Urfabrik AB", + [3]byte{0, 7, 10}: "Unicom Automation Co., Ltd.", + [3]byte{0, 7, 11}: "Novabase SGPS, SA", + [3]byte{0, 7, 12}: "SVA-Intrusion.com Co. Ltd.", + [3]byte{0, 7, 13}: "Cisco Systems, Inc", + [3]byte{0, 7, 14}: "Cisco Systems, Inc", + [3]byte{0, 7, 15}: "Fujant, Inc.", + [3]byte{0, 7, 16}: "Adax, Inc.", + [3]byte{0, 7, 17}: "Acterna", + [3]byte{0, 7, 18}: "JAL Information Technology", + [3]byte{0, 7, 19}: "IP One, Inc.", + [3]byte{0, 7, 20}: "Brightcom", + [3]byte{0, 7, 21}: "General Research of Electronics, Inc.", + [3]byte{0, 7, 22}: "J & S Marine Ltd.", + [3]byte{0, 7, 23}: "Wieland Electric GmbH", + [3]byte{0, 7, 24}: "iCanTek Co., Ltd.", + [3]byte{0, 7, 25}: "Mobiis Co., Ltd.", + [3]byte{0, 7, 26}: "Finedigital Inc.", + [3]byte{0, 7, 27}: "CDVI Americas Ltd", + [3]byte{0, 7, 28}: "AT&T", + [3]byte{0, 7, 29}: "Satelsa Sistemas Y Aplicaciones De Telecomunicaciones, S.A.", + [3]byte{0, 7, 30}: "Tri-M Engineering / Nupak Dev. Corp.", + [3]byte{0, 7, 31}: "European Systems Integration", + [3]byte{0, 7, 32}: "Trutzschler GmbH & Co. KG", + [3]byte{0, 7, 33}: "Formac Elektronik GmbH", + [3]byte{0, 7, 34}: "The Nielsen Company", + [3]byte{0, 7, 35}: "ELCON Systemtechnik GmbH", + [3]byte{0, 7, 36}: "Telemax Co., Ltd.", + [3]byte{0, 7, 37}: "Bematech International Corp.", + [3]byte{0, 7, 38}: "SHENZHEN GONGJIN ELECTRONICS CO.,LT", + [3]byte{0, 7, 39}: "Zi Corporation (HK) Ltd.", + [3]byte{0, 7, 40}: "Neo Telecom", + [3]byte{0, 7, 41}: "Kistler Instrumente AG", + [3]byte{0, 7, 42}: "Innovance Networks", + [3]byte{0, 7, 43}: "Jung Myung Telecom Co., Ltd.", + [3]byte{0, 7, 44}: "Fabricom", + [3]byte{0, 7, 45}: "CNSystems", + [3]byte{0, 7, 46}: "North Node AB", + [3]byte{0, 7, 47}: "Intransa, Inc.", + [3]byte{0, 7, 48}: "Hutchison OPTEL Telecom Technology Co., Ltd.", + [3]byte{0, 7, 49}: "Ophir-Spiricon LLC", + [3]byte{0, 7, 50}: "AAEON Technology Inc.", + [3]byte{0, 7, 51}: "DANCONTROL Engineering", + [3]byte{0, 7, 52}: "ONStor, Inc.", + [3]byte{0, 7, 53}: "Flarion Technologies, Inc.", + [3]byte{0, 7, 54}: "Data Video Technologies Co., Ltd.", + [3]byte{0, 7, 55}: "Soriya Co. Ltd.", + [3]byte{0, 7, 56}: "Young Technology Co., Ltd.", + [3]byte{0, 7, 57}: "Scotty Group Austria Gmbh", + [3]byte{0, 7, 58}: "Inventel Systemes", + [3]byte{0, 7, 59}: "Tenovis GmbH & Co KG", + [3]byte{0, 7, 60}: "Telecom Design", + [3]byte{0, 7, 61}: "Nanjing Postel Telecommunications Co., Ltd.", + [3]byte{0, 7, 62}: "China Great-Wall Computer Shenzhen Co., Ltd.", + [3]byte{0, 7, 63}: "Woojyun Systec Co., Ltd.", + [3]byte{0, 7, 64}: "BUFFALO.INC", + [3]byte{0, 7, 65}: "Sierra Automated Systems", + [3]byte{0, 7, 66}: "Ormazabal", + [3]byte{0, 7, 67}: "Chelsio Communications", + [3]byte{0, 7, 68}: "Unico, Inc.", + [3]byte{0, 7, 69}: "Radlan Computer Communications Ltd.", + [3]byte{0, 7, 70}: "TURCK, Inc.", + [3]byte{0, 7, 71}: "Mecalc", + [3]byte{0, 7, 72}: "The Imaging Source Europe", + [3]byte{0, 7, 73}: "CENiX Inc.", + [3]byte{0, 7, 74}: "Carl Valentin GmbH", + [3]byte{0, 7, 75}: "Daihen Corporation", + [3]byte{0, 7, 76}: "Beicom Inc.", + [3]byte{0, 7, 77}: "Zebra Technologies Corp.", + [3]byte{0, 7, 78}: "IPFRONT Inc", + [3]byte{0, 7, 79}: "Cisco Systems, Inc", + [3]byte{0, 7, 80}: "Cisco Systems, Inc", + [3]byte{0, 7, 81}: "m-u-t AG", + [3]byte{0, 7, 82}: "Rhythm Watch Co., Ltd.", + [3]byte{0, 7, 83}: "Beijing Qxcomm Technology Co., Ltd.", + [3]byte{0, 7, 84}: "Xyterra Computing, Inc.", + [3]byte{0, 7, 85}: "Lafon", + [3]byte{0, 7, 86}: "Juyoung Telecom", + [3]byte{0, 7, 87}: "Topcall International AG", + [3]byte{0, 7, 88}: "Dragonwave", + [3]byte{0, 7, 89}: "Boris Manufacturing Corp.", + [3]byte{0, 7, 90}: "Air Products and Chemicals, Inc.", + [3]byte{0, 7, 91}: "Gibson Guitars", + [3]byte{0, 7, 92}: "Eastman Kodak Company", + [3]byte{0, 7, 93}: "Celleritas Inc.", + [3]byte{0, 7, 94}: "Ametek Power Instruments", + [3]byte{0, 7, 95}: "VCS Video Communication Systems AG", + [3]byte{0, 7, 96}: "TOMIS Information & Telecom Corp.", + [3]byte{0, 7, 97}: "29530", + [3]byte{0, 7, 98}: "Group Sense Limited", + [3]byte{0, 7, 99}: "Sunniwell Cyber Tech. Co., Ltd.", + [3]byte{0, 7, 100}: "YoungWoo Telecom Co. Ltd.", + [3]byte{0, 7, 101}: "Jade Quantum Technologies, Inc.", + [3]byte{0, 7, 102}: "Chou Chin Industrial Co., Ltd.", + [3]byte{0, 7, 103}: "Yuxing Electronics Company Limited", + [3]byte{0, 7, 104}: "Danfoss A/S", + [3]byte{0, 7, 105}: "Italiana Macchi SpA", + [3]byte{0, 7, 106}: "NEXTEYE Co., Ltd.", + [3]byte{0, 7, 107}: "Stralfors AB", + [3]byte{0, 7, 108}: "Daehanet, Inc.", + [3]byte{0, 7, 109}: "Flexlight Networks", + [3]byte{0, 7, 110}: "Sinetica Corporation Limited", + [3]byte{0, 7, 111}: "Synoptics Limited", + [3]byte{0, 7, 112}: "Ubiquoss Inc", + [3]byte{0, 7, 113}: "Embedded System Corporation", + [3]byte{0, 7, 114}: "Alcatel-Lucent Shanghai Bell Co., Ltd", + [3]byte{0, 7, 115}: "Ascom Powerline Communications Ltd.", + [3]byte{0, 7, 116}: "GuangZhou Thinker Technology Co. Ltd.", + [3]byte{0, 7, 117}: "Valence Semiconductor, Inc.", + [3]byte{0, 7, 118}: "Federal APD", + [3]byte{0, 7, 119}: "Motah Ltd.", + [3]byte{0, 7, 120}: "GERSTEL GmbH & Co. KG", + [3]byte{0, 7, 121}: "Sungil Telecom Co., Ltd.", + [3]byte{0, 7, 122}: "Infoware System Co., Ltd.", + [3]byte{0, 7, 123}: "Millimetrix Broadband Networks", + [3]byte{0, 7, 124}: "Westermo Teleindustri AB", + [3]byte{0, 7, 125}: "Cisco Systems, Inc", + [3]byte{0, 7, 126}: "Elrest GmbH", + [3]byte{0, 7, 127}: "J Communications Co., Ltd.", + [3]byte{0, 7, 128}: "Bluegiga Technologies OY", + [3]byte{0, 7, 129}: "Itron Inc.", + [3]byte{0, 7, 130}: "Oracle Corporation", + [3]byte{0, 7, 131}: "SynCom Network, Inc.", + [3]byte{0, 7, 132}: "Cisco Systems, Inc", + [3]byte{0, 7, 133}: "Cisco Systems, Inc", + [3]byte{0, 7, 134}: "Wireless Networks Inc.", + [3]byte{0, 7, 135}: "Idea System Co., Ltd.", + [3]byte{0, 7, 136}: "Clipcomm, Inc.", + [3]byte{0, 7, 137}: "DONGWON SYSTEMS", + [3]byte{0, 7, 138}: "Mentor Data System Inc.", + [3]byte{0, 7, 139}: "Wegener Communications, Inc.", + [3]byte{0, 7, 140}: "Elektronikspecialisten i Borlange AB", + [3]byte{0, 7, 141}: "NetEngines Ltd.", + [3]byte{0, 7, 142}: "Garz & Friche GmbH", + [3]byte{0, 7, 143}: "Emkay Innovative Products", + [3]byte{0, 7, 144}: "Tri-M Technologies (s) Limited", + [3]byte{0, 7, 145}: "International Data Communications, Inc.", + [3]byte{0, 7, 146}: "Sütron Electronic GmbH", + [3]byte{0, 7, 147}: "Shin Satellite Public Company Limited", + [3]byte{0, 7, 148}: "Simple Devices, Inc.", + [3]byte{0, 7, 149}: "Elitegroup Computer Systems Co.,Ltd.", + [3]byte{0, 7, 150}: "LSI Systems, Inc.", + [3]byte{0, 7, 151}: "Netpower Co., Ltd.", + [3]byte{0, 7, 152}: "Selea SRL", + [3]byte{0, 7, 153}: "Tipping Point Technologies, Inc.", + [3]byte{0, 7, 154}: "Verint Systems Inc", + [3]byte{0, 7, 155}: "Aurora Networks", + [3]byte{0, 7, 156}: "Golden Electronics Technology Co., Ltd.", + [3]byte{0, 7, 157}: "Musashi Co., Ltd.", + [3]byte{0, 7, 158}: "Ilinx Co., Ltd.", + [3]byte{0, 7, 159}: "Action Digital Inc.", + [3]byte{0, 7, 160}: "e-Watch Inc.", + [3]byte{0, 7, 161}: "VIASYS Healthcare GmbH", + [3]byte{0, 7, 162}: "Opteon Corporation", + [3]byte{0, 7, 163}: "Ositis Software, Inc.", + [3]byte{0, 7, 164}: "GN Netcom Ltd.", + [3]byte{0, 7, 165}: "Y.D.K Co. Ltd.", + [3]byte{0, 7, 166}: "Leviton Manufacturing Co., Inc.", + [3]byte{0, 7, 167}: "A-Z Inc.", + [3]byte{0, 7, 168}: "Haier Group Technologies Ltd.", + [3]byte{0, 7, 169}: "Novasonics", + [3]byte{0, 7, 170}: "Quantum Data Inc.", + [3]byte{0, 7, 171}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 7, 172}: "Eolring", + [3]byte{0, 7, 173}: "Pentacon GmbH Foto-und Feinwerktechnik", + [3]byte{0, 7, 174}: "Britestream Networks, Inc.", + [3]byte{0, 7, 175}: "Red Lion Controls, LP", + [3]byte{0, 7, 176}: "Office Details, Inc.", + [3]byte{0, 7, 177}: "Equator Technologies", + [3]byte{0, 7, 178}: "Transaccess S.A.", + [3]byte{0, 7, 179}: "Cisco Systems, Inc", + [3]byte{0, 7, 180}: "Cisco Systems, Inc", + [3]byte{0, 7, 181}: "Any One Wireless Ltd.", + [3]byte{0, 7, 182}: "Telecom Technology Ltd.", + [3]byte{0, 7, 183}: "Samurai Ind. Prods Eletronicos Ltda", + [3]byte{0, 7, 184}: "Corvalent Corporation", + [3]byte{0, 7, 185}: "Ginganet Corporation", + [3]byte{0, 7, 186}: "UTStarcom Inc", + [3]byte{0, 7, 187}: "Candera Inc.", + [3]byte{0, 7, 188}: "Identix Inc.", + [3]byte{0, 7, 189}: "Radionet Ltd.", + [3]byte{0, 7, 190}: "DataLogic SpA", + [3]byte{0, 7, 191}: "Armillaire Technologies, Inc.", + [3]byte{0, 7, 192}: "NetZerver Inc.", + [3]byte{0, 7, 193}: "Overture Networks, Inc.", + [3]byte{0, 7, 194}: "Netsys Telecom", + [3]byte{0, 7, 195}: "Thomson", + [3]byte{0, 7, 196}: "JEAN Co. Ltd.", + [3]byte{0, 7, 197}: "Gcom, Inc.", + [3]byte{0, 7, 198}: "VDS Vosskuhler GmbH", + [3]byte{0, 7, 199}: "Synectics Systems Limited", + [3]byte{0, 7, 200}: "Brain21, Inc.", + [3]byte{0, 7, 201}: "Technol Seven Co., Ltd.", + [3]byte{0, 7, 202}: "Creatix Polymedia Ges Fur Kommunikaitonssysteme", + [3]byte{0, 7, 203}: "FREEBOX SAS", + [3]byte{0, 7, 204}: "Kaba Benzing GmbH", + [3]byte{0, 7, 205}: "Kumoh Electronic Co, Ltd", + [3]byte{0, 7, 206}: "Cabletime Limited", + [3]byte{0, 7, 207}: "Anoto AB", + [3]byte{0, 7, 208}: "Automat Engenharia de Automação Ltda.", + [3]byte{0, 7, 209}: "Spectrum Signal Processing Inc.", + [3]byte{0, 7, 210}: "Logopak Systeme GmbH & Co. KG", + [3]byte{0, 7, 211}: "SPGPrints B.V.", + [3]byte{0, 7, 212}: "Zhejiang Yutong Network Communication Co Ltd.", + [3]byte{0, 7, 213}: "3e Technologies Int;., Inc.", + [3]byte{0, 7, 214}: "Commil Ltd.", + [3]byte{0, 7, 215}: "Caporis Networks AG", + [3]byte{0, 7, 216}: "Hitron Technologies. Inc", + [3]byte{0, 7, 217}: "Splicecom", + [3]byte{0, 7, 218}: "Neuro Telecom Co., Ltd.", + [3]byte{0, 7, 219}: "Kirana Networks, Inc.", + [3]byte{0, 7, 220}: "Atek Co, Ltd.", + [3]byte{0, 7, 221}: "Cradle Technologies", + [3]byte{0, 7, 222}: "eCopilt AB", + [3]byte{0, 7, 223}: "Vbrick Systems Inc.", + [3]byte{0, 7, 224}: "Palm Inc.", + [3]byte{0, 7, 225}: "WIS Communications Co. Ltd.", + [3]byte{0, 7, 226}: "Bitworks, Inc.", + [3]byte{0, 7, 227}: "Navcom Technology, Inc.", + [3]byte{0, 7, 228}: "SoftRadio Co., Ltd.", + [3]byte{0, 7, 229}: "Coup Corporation", + [3]byte{0, 7, 230}: "edgeflow Canada Inc.", + [3]byte{0, 7, 231}: "FreeWave Technologies", + [3]byte{0, 7, 232}: "EdgeWave", + [3]byte{0, 7, 233}: "Intel Corporation", + [3]byte{0, 7, 234}: "Massana, Inc.", + [3]byte{0, 7, 235}: "Cisco Systems, Inc", + [3]byte{0, 7, 236}: "Cisco Systems, Inc", + [3]byte{0, 7, 237}: "Altera Corporation", + [3]byte{0, 7, 238}: "telco Informationssysteme GmbH", + [3]byte{0, 7, 239}: "Lockheed Martin Tactical Systems", + [3]byte{0, 7, 240}: "LogiSync LLC", + [3]byte{0, 7, 241}: "TeraBurst Networks Inc.", + [3]byte{0, 7, 242}: "IOA Corporation", + [3]byte{0, 7, 243}: "Thinkengine Networks", + [3]byte{0, 7, 244}: "Eletex Co., Ltd.", + [3]byte{0, 7, 245}: "Bridgeco Co AG", + [3]byte{0, 7, 246}: "Qqest Software Systems", + [3]byte{0, 7, 247}: "Galtronics", + [3]byte{0, 7, 248}: "ITDevices, Inc.", + [3]byte{0, 7, 249}: "Sensaphone", + [3]byte{0, 7, 250}: "ITT Co., Ltd.", + [3]byte{0, 7, 251}: "Giga Stream UMTS Technologies GmbH", + [3]byte{0, 7, 252}: "Adept Systems Inc.", + [3]byte{0, 7, 253}: "LANergy Ltd.", + [3]byte{0, 7, 254}: "Rigaku Corporation", + [3]byte{0, 7, 255}: "Gluon Networks", + [3]byte{0, 8, 0}: "MULTITECH SYSTEMS, INC.", + [3]byte{0, 8, 1}: "HighSpeed Surfing Inc.", + [3]byte{0, 8, 2}: "Hewlett Packard", + [3]byte{0, 8, 3}: "Cos Tron", + [3]byte{0, 8, 4}: "ICA Inc.", + [3]byte{0, 8, 5}: "Techno-Holon Corporation", + [3]byte{0, 8, 6}: "Raonet Systems, Inc.", + [3]byte{0, 8, 7}: "Access Devices Limited", + [3]byte{0, 8, 8}: "PPT Vision, Inc.", + [3]byte{0, 8, 9}: "Systemonic AG", + [3]byte{0, 8, 10}: "Espera-Werke GmbH", + [3]byte{0, 8, 11}: "Birka BPA Informationssystem AB", + [3]byte{0, 8, 12}: "VDA Elettronica spa", + [3]byte{0, 8, 13}: "Toshiba", + [3]byte{0, 8, 14}: "ARRIS Group, Inc.", + [3]byte{0, 8, 15}: "Proximion Fiber Optics AB", + [3]byte{0, 8, 16}: "Key Technology, Inc.", + [3]byte{0, 8, 17}: "VOIX Corporation", + [3]byte{0, 8, 18}: "GM-2 Corporation", + [3]byte{0, 8, 19}: "Diskbank, Inc.", + [3]byte{0, 8, 20}: "TIL Technologies", + [3]byte{0, 8, 21}: "CATS Co., Ltd.", + [3]byte{0, 8, 22}: "Bluelon ApS", + [3]byte{0, 8, 23}: "EmergeCore Networks LLC", + [3]byte{0, 8, 24}: "Pixelworks, Inc.", + [3]byte{0, 8, 25}: "Banksys", + [3]byte{0, 8, 26}: "Sanrad Intelligence Storage Communications (2000) Ltd.", + [3]byte{0, 8, 27}: "Windigo Systems", + [3]byte{0, 8, 28}: "@pos.com", + [3]byte{0, 8, 29}: "Ipsil, Incorporated", + [3]byte{0, 8, 30}: "Repeatit AB", + [3]byte{0, 8, 31}: "Pou Yuen Tech Corp. Ltd.", + [3]byte{0, 8, 32}: "Cisco Systems, Inc", + [3]byte{0, 8, 33}: "Cisco Systems, Inc", + [3]byte{0, 8, 34}: "InPro Comm", + [3]byte{0, 8, 35}: "Texa Corp.", + [3]byte{0, 8, 36}: "Nuance Document Imaging", + [3]byte{0, 8, 37}: "Acme Packet", + [3]byte{0, 8, 38}: "Colorado Med Tech", + [3]byte{0, 8, 39}: "ADB Broadband Italia", + [3]byte{0, 8, 40}: "Koei Engineering Ltd.", + [3]byte{0, 8, 41}: "Aval Nagasaki Corporation", + [3]byte{0, 8, 42}: "Powerwallz Network Security", + [3]byte{0, 8, 43}: "Wooksung Electronics, Inc.", + [3]byte{0, 8, 44}: "Homag AG", + [3]byte{0, 8, 45}: "Indus Teqsite Private Limited", + [3]byte{0, 8, 46}: "Multitone Electronics PLC", + [3]byte{0, 8, 47}: "Cisco Systems, Inc", + [3]byte{0, 8, 48}: "Cisco Systems, Inc", + [3]byte{0, 8, 49}: "Cisco Systems, Inc", + [3]byte{0, 8, 50}: "Cisco Systems, Inc", + [3]byte{0, 8, 78}: "DivergeNet, Inc.", + [3]byte{0, 8, 79}: "Qualstar Corporation", + [3]byte{0, 8, 80}: "Arizona Instrument Corp.", + [3]byte{0, 8, 81}: "Canadian Bank Note Company, Ltd.", + [3]byte{0, 8, 82}: "Davolink Co. Inc.", + [3]byte{0, 8, 83}: "Schleicher GmbH & Co. Relaiswerke KG", + [3]byte{0, 8, 84}: "Netronix, Inc.", + [3]byte{0, 8, 85}: "NASA-Goddard Space Flight Center", + [3]byte{0, 8, 86}: "Gamatronic Electronic Industries Ltd.", + [3]byte{0, 8, 87}: "Polaris Networks, Inc.", + [3]byte{0, 8, 88}: "Novatechnology Inc.", + [3]byte{0, 8, 89}: "ShenZhen Unitone Electronics Co., Ltd.", + [3]byte{0, 8, 90}: "IntiGate Inc.", + [3]byte{0, 8, 91}: "Hanbit Electronics Co., Ltd.", + [3]byte{0, 8, 92}: "Shanghai Dare Technologies Co. Ltd.", + [3]byte{0, 8, 93}: "Aastra", + [3]byte{0, 8, 94}: "PCO AG", + [3]byte{0, 8, 95}: "Picanol N.V.", + [3]byte{0, 8, 96}: "LodgeNet Entertainment Corp.", + [3]byte{0, 8, 97}: "SoftEnergy Co., Ltd.", + [3]byte{0, 8, 98}: "NEC Eluminant Technologies, Inc.", + [3]byte{0, 8, 99}: "Entrisphere Inc.", + [3]byte{0, 8, 100}: "Fasy S.p.A.", + [3]byte{0, 8, 101}: "JASCOM CO., LTD", + [3]byte{0, 8, 102}: "DSX Access Systems, Inc.", + [3]byte{0, 8, 103}: "Uptime Devices", + [3]byte{0, 8, 104}: "PurOptix", + [3]byte{0, 8, 105}: "Command-e Technology Co.,Ltd.", + [3]byte{0, 8, 106}: "Securiton Gmbh", + [3]byte{0, 8, 107}: "MIPSYS", + [3]byte{0, 8, 108}: "Plasmon LMS", + [3]byte{0, 8, 109}: "Missouri FreeNet", + [3]byte{0, 8, 110}: "Hyglo AB", + [3]byte{0, 8, 111}: "Resources Computer Network Ltd.", + [3]byte{0, 8, 112}: "Rasvia Systems, Inc.", + [3]byte{0, 8, 113}: "NORTHDATA Co., Ltd.", + [3]byte{0, 8, 114}: "Sorenson Communications", + [3]byte{0, 8, 115}: "DapTechnology B.V.", + [3]byte{0, 8, 116}: "Dell Inc.", + [3]byte{0, 8, 117}: "Acorp Electronics Corp.", + [3]byte{0, 8, 118}: "SDSystem", + [3]byte{0, 8, 119}: "Liebert-Hiross Spa", + [3]byte{0, 8, 120}: "Benchmark Storage Innovations", + [3]byte{0, 8, 121}: "CEM Corporation", + [3]byte{0, 8, 122}: "Wipotec GmbH", + [3]byte{0, 8, 123}: "RTX Telecom A/S", + [3]byte{0, 8, 124}: "Cisco Systems, Inc", + [3]byte{0, 8, 125}: "Cisco Systems, Inc", + [3]byte{0, 8, 126}: "Bon Electro-Telecom Inc.", + [3]byte{0, 8, 127}: "SPAUN electronic GmbH & Co. KG", + [3]byte{0, 8, 128}: "BroadTel Canada Communications inc.", + [3]byte{0, 8, 129}: "DIGITAL HANDS CO.,LTD.", + [3]byte{0, 8, 130}: "SIGMA CORPORATION", + [3]byte{0, 8, 131}: "Hewlett Packard", + [3]byte{0, 8, 132}: "Index Braille AB", + [3]byte{0, 8, 133}: "EMS Dr. Thomas Wünsche", + [3]byte{0, 8, 134}: "Hansung Teliann, Inc.", + [3]byte{0, 8, 135}: "Maschinenfabrik Reinhausen GmbH", + [3]byte{0, 8, 136}: "OULLIM Information Technology Inc,.", + [3]byte{0, 8, 137}: "Echostar Technologies Corp", + [3]byte{0, 8, 138}: "Minds@Work", + [3]byte{0, 8, 139}: "Tropic Networks Inc.", + [3]byte{0, 8, 140}: "Quanta Network Systems Inc.", + [3]byte{0, 8, 141}: "Sigma-Links Inc.", + [3]byte{0, 8, 142}: "Nihon Computer Co., Ltd.", + [3]byte{0, 8, 143}: "ADVANCED DIGITAL TECHNOLOGY", + [3]byte{0, 8, 144}: "AVILINKS SA", + [3]byte{0, 8, 145}: "Lyan Inc.", + [3]byte{0, 8, 146}: "EM Solutions", + [3]byte{0, 8, 147}: "LE INFORMATION COMMUNICATION INC.", + [3]byte{0, 8, 148}: "InnoVISION Multimedia Ltd.", + [3]byte{0, 8, 149}: "DIRC Technologie GmbH & Co.KG", + [3]byte{0, 8, 150}: "Printronix, Inc.", + [3]byte{0, 8, 151}: "Quake Technologies", + [3]byte{0, 8, 152}: "Gigabit Optics Corporation", + [3]byte{0, 8, 153}: "Netbind, Inc.", + [3]byte{0, 8, 154}: "Alcatel Microelectronics", + [3]byte{0, 8, 155}: "ICP Electronics Inc.", + [3]byte{0, 8, 156}: "Elecs Industry Co., Ltd.", + [3]byte{0, 8, 157}: "UHD-Elektronik", + [3]byte{0, 8, 158}: "Beijing Enter-Net co.LTD", + [3]byte{0, 8, 159}: "EFM Networks", + [3]byte{0, 8, 160}: "Stotz Feinmesstechnik GmbH", + [3]byte{0, 8, 161}: "CNet Technology Inc.", + [3]byte{0, 8, 162}: "ADI Engineering, Inc.", + [3]byte{0, 8, 163}: "Cisco Systems, Inc", + [3]byte{0, 8, 164}: "Cisco Systems, Inc", + [3]byte{0, 8, 165}: "Peninsula Systems Inc.", + [3]byte{0, 8, 166}: "Multiware & Image Co., Ltd.", + [3]byte{0, 8, 167}: "iLogic Inc.", + [3]byte{0, 8, 168}: "Systec Co., Ltd.", + [3]byte{0, 8, 169}: "SangSang Technology, Inc.", + [3]byte{0, 8, 170}: "KARAM", + [3]byte{0, 8, 171}: "EnerLinx.com, Inc.", + [3]byte{0, 8, 172}: "Eltromat GmbH", + [3]byte{0, 8, 173}: "Toyo-Linx Co., Ltd.", + [3]byte{0, 8, 174}: "PacketFront Network Products AB", + [3]byte{0, 8, 175}: "Novatec Corporation", + [3]byte{0, 8, 176}: "BKtel communications GmbH", + [3]byte{0, 8, 177}: "ProQuent Systems", + [3]byte{0, 8, 178}: "SHENZHEN COMPASS TECHNOLOGY DEVELOPMENT CO.,LTD", + [3]byte{0, 8, 179}: "Fastwel", + [3]byte{0, 8, 180}: "SYSPOL", + [3]byte{0, 8, 181}: "TAI GUEN ENTERPRISE CO., LTD", + [3]byte{0, 8, 182}: "RouteFree, Inc.", + [3]byte{0, 8, 183}: "HIT Incorporated", + [3]byte{0, 8, 184}: "E.F. Johnson", + [3]byte{0, 8, 185}: "Kaonmedia CO., LTD.", + [3]byte{0, 8, 186}: "Erskine Systems Ltd", + [3]byte{0, 8, 187}: "NetExcell", + [3]byte{0, 8, 188}: "Ilevo AB", + [3]byte{0, 8, 189}: "TEPG-US", + [3]byte{0, 8, 190}: "XENPAK MSA Group", + [3]byte{0, 8, 191}: "Aptus Elektronik AB", + [3]byte{0, 8, 192}: "ASA SYSTEMS", + [3]byte{0, 8, 193}: "Avistar Communications Corporation", + [3]byte{0, 8, 194}: "Cisco Systems, Inc", + [3]byte{0, 8, 195}: "Contex A/S", + [3]byte{0, 8, 196}: "Hikari Co.,Ltd.", + [3]byte{0, 8, 197}: "Liontech Co., Ltd.", + [3]byte{0, 8, 198}: "Philips Consumer Communications", + [3]byte{0, 8, 199}: "Hewlett Packard", + [3]byte{0, 8, 200}: "Soneticom, Inc.", + [3]byte{0, 8, 201}: "TechniSat Digital GmbH Daun", + [3]byte{0, 8, 202}: "TwinHan Technology Co.,Ltd", + [3]byte{0, 8, 203}: "Zeta Broadband Inc.", + [3]byte{0, 8, 204}: "Remotec, Inc.", + [3]byte{0, 8, 205}: "With-Net Inc", + [3]byte{0, 8, 206}: "IPMobileNet Inc.", + [3]byte{0, 8, 207}: "Nippon Koei Power Systems Co., Ltd.", + [3]byte{0, 8, 208}: "Musashi Engineering Co., LTD.", + [3]byte{0, 8, 209}: "KAREL INC.", + [3]byte{0, 8, 210}: "ZOOM Networks Inc.", + [3]byte{0, 8, 211}: "Hercules Technologies S.A.S.", + [3]byte{0, 8, 212}: "IneoQuest Technologies, Inc", + [3]byte{0, 8, 213}: "Vanguard Networks Solutions, LLC", + [3]byte{0, 8, 214}: "HASSNET Inc.", + [3]byte{0, 8, 215}: "HOW CORPORATION", + [3]byte{0, 8, 216}: "Dowkey Microwave", + [3]byte{0, 8, 217}: "Mitadenshi Co.,LTD", + [3]byte{0, 8, 218}: "SofaWare Technologies Ltd.", + [3]byte{0, 8, 219}: "Corrigent Systems", + [3]byte{0, 8, 220}: "Wiznet", + [3]byte{0, 8, 221}: "Telena Communications, Inc.", + [3]byte{0, 8, 222}: "3UP Systems", + [3]byte{0, 8, 223}: "Alistel Inc.", + [3]byte{0, 8, 224}: "ATO Technology Ltd.", + [3]byte{0, 8, 225}: "Barix AG", + [3]byte{0, 8, 226}: "Cisco Systems, Inc", + [3]byte{0, 8, 227}: "Cisco Systems, Inc", + [3]byte{0, 8, 228}: "Envenergy Inc", + [3]byte{0, 8, 229}: "IDK Corporation", + [3]byte{0, 8, 230}: "Littlefeet", + [3]byte{0, 8, 231}: "SHI ControlSystems,Ltd.", + [3]byte{0, 8, 232}: "Excel Master Ltd.", + [3]byte{0, 8, 233}: "NextGig", + [3]byte{0, 8, 234}: "Motion Control Engineering, Inc", + [3]byte{0, 8, 235}: "ROMWin Co.,Ltd.", + [3]byte{0, 8, 236}: "Optical Zonu Corporation", + [3]byte{0, 8, 237}: "ST&T Instrument Corp.", + [3]byte{0, 8, 238}: "Logic Product Development", + [3]byte{0, 8, 239}: "DIBAL,S.A.", + [3]byte{0, 8, 240}: "Next Generation Systems, Inc.", + [3]byte{0, 8, 241}: "Voltaire", + [3]byte{0, 8, 242}: "C&S Technology", + [3]byte{0, 8, 243}: "WANY", + [3]byte{0, 8, 244}: "Bluetake Technology Co., Ltd.", + [3]byte{0, 8, 245}: "YESTECHNOLOGY Co.,Ltd.", + [3]byte{0, 8, 246}: "Sumitomo Electric Industries,Ltd", + [3]byte{0, 8, 247}: "Hitachi Ltd, Semiconductor & Integrated Circuits Gr", + [3]byte{0, 8, 248}: "UTC CCS", + [3]byte{0, 8, 249}: "Artesyn Embedded Technologies", + [3]byte{0, 8, 250}: "KEB Automation KG", + [3]byte{0, 8, 251}: "SonoSite, Inc.", + [3]byte{0, 8, 252}: "Gigaphoton Inc.", + [3]byte{0, 8, 253}: "BlueKorea Co., Ltd.", + [3]byte{0, 8, 254}: "UNIK C&C Co.,Ltd.", + [3]byte{0, 8, 255}: "Trilogy Communications Ltd", + [3]byte{0, 9, 0}: "TMT", + [3]byte{0, 9, 1}: "Shenzhen Shixuntong Information & Technoligy Co", + [3]byte{0, 9, 2}: "Redline Communications Inc.", + [3]byte{0, 9, 3}: "Panasas, Inc", + [3]byte{0, 9, 4}: "MONDIAL electronic", + [3]byte{0, 9, 5}: "iTEC Technologies Ltd.", + [3]byte{0, 9, 6}: "Esteem Networks", + [3]byte{0, 9, 7}: "Chrysalis Development", + [3]byte{0, 9, 8}: "VTech Technology Corp.", + [3]byte{0, 9, 9}: "Telenor Connect A/S", + [3]byte{0, 9, 10}: "SnedFar Technology Co., Ltd.", + [3]byte{0, 9, 11}: "MTL Instruments PLC", + [3]byte{0, 9, 12}: "Mayekawa Mfg. Co. Ltd.", + [3]byte{0, 9, 13}: "LEADER ELECTRONICS CORP.", + [3]byte{0, 9, 14}: "Helix Technology Inc.", + [3]byte{0, 9, 15}: "Fortinet Inc.", + [3]byte{0, 9, 16}: "Simple Access Inc.", + [3]byte{0, 9, 17}: "Cisco Systems, Inc", + [3]byte{0, 9, 18}: "Cisco Systems, Inc", + [3]byte{0, 9, 19}: "SystemK Corporation", + [3]byte{0, 9, 20}: "COMPUTROLS INC.", + [3]byte{0, 9, 21}: "CAS Corp.", + [3]byte{0, 9, 22}: "Listman Home Technologies, Inc.", + [3]byte{0, 9, 23}: "WEM Technology Inc", + [3]byte{0, 9, 24}: "SAMSUNG TECHWIN CO.,LTD", + [3]byte{0, 9, 25}: "MDS Gateways", + [3]byte{0, 9, 26}: "Macat Optics & Electronics Co., Ltd.", + [3]byte{0, 9, 27}: "Digital Generation Inc.", + [3]byte{0, 9, 28}: "CacheVision, Inc", + [3]byte{0, 9, 29}: "Proteam Computer Corporation", + [3]byte{0, 9, 30}: "Firstech Technology Corp.", + [3]byte{0, 9, 31}: "A&D Co., Ltd.", + [3]byte{0, 9, 32}: "EpoX COMPUTER CO.,LTD.", + [3]byte{0, 9, 33}: "Planmeca Oy", + [3]byte{0, 9, 34}: "TST Biometrics GmbH", + [3]byte{0, 9, 35}: "Heaman System Co., Ltd", + [3]byte{0, 9, 36}: "Telebau GmbH", + [3]byte{0, 9, 37}: "VSN Systemen BV", + [3]byte{0, 9, 38}: "YODA COMMUNICATIONS, INC.", + [3]byte{0, 9, 39}: "TOYOKEIKI CO.,LTD.", + [3]byte{0, 9, 40}: "Telecore", + [3]byte{0, 9, 41}: "Sanyo Industries (UK) Limited", + [3]byte{0, 9, 42}: "MYTECS Co.,Ltd.", + [3]byte{0, 9, 43}: "iQstor Networks, Inc.", + [3]byte{0, 9, 44}: "Hitpoint Inc.", + [3]byte{0, 9, 45}: "HTC Corporation", + [3]byte{0, 9, 46}: "B&Tech System Inc.", + [3]byte{0, 9, 47}: "Akom Technology Corporation", + [3]byte{0, 9, 48}: "AeroConcierge Inc.", + [3]byte{0, 9, 49}: "Future Internet, Inc.", + [3]byte{0, 9, 50}: "Omnilux", + [3]byte{0, 9, 51}: "Ophit Co.Ltd.", + [3]byte{0, 9, 52}: "Dream-Multimedia-Tv GmbH", + [3]byte{0, 9, 53}: "Sandvine Incorporated", + [3]byte{0, 9, 54}: "Ipetronik GmbH & Co. KG", + [3]byte{0, 9, 55}: "Inventec Appliance Corp", + [3]byte{0, 9, 56}: "Allot Communications", + [3]byte{0, 9, 57}: "ShibaSoku Co.,Ltd.", + [3]byte{0, 9, 58}: "Molex", + [3]byte{0, 9, 59}: "HYUNDAI NETWORKS INC.", + [3]byte{0, 9, 60}: "Jacques Technologies P/L", + [3]byte{0, 9, 61}: "Newisys,Inc.", + [3]byte{0, 9, 62}: "C&I Technologies", + [3]byte{0, 9, 63}: "Double-Win Enterpirse CO., LTD", + [3]byte{0, 9, 64}: "AGFEO GmbH & Co. KG", + [3]byte{0, 9, 65}: "Allied Telesis R&D Center K.K.", + [3]byte{0, 9, 66}: "Wireless Technologies, Inc", + [3]byte{0, 9, 67}: "Cisco Systems, Inc", + [3]byte{0, 9, 68}: "Cisco Systems, Inc", + [3]byte{0, 9, 69}: "Palmmicro Communications Inc", + [3]byte{0, 9, 70}: "Cluster Labs GmbH", + [3]byte{0, 9, 71}: "Aztek, Inc.", + [3]byte{0, 9, 72}: "Vista Control Systems, Corp.", + [3]byte{0, 9, 73}: "Glyph Technologies Inc.", + [3]byte{0, 9, 74}: "Homenet Communications", + [3]byte{0, 9, 75}: "FillFactory NV", + [3]byte{0, 9, 76}: "Communication Weaver Co.,Ltd.", + [3]byte{0, 9, 77}: "Braintree Communications Pty Ltd", + [3]byte{0, 9, 78}: "BARTECH SYSTEMS INTERNATIONAL, INC", + [3]byte{0, 9, 79}: "elmegt GmbH & Co. KG", + [3]byte{0, 9, 80}: "Independent Storage Corporation", + [3]byte{0, 9, 81}: "Apogee Imaging Systems", + [3]byte{0, 9, 82}: "Auerswald GmbH & Co. KG", + [3]byte{0, 9, 83}: "Linkage System Integration Co.Ltd.", + [3]byte{0, 9, 84}: "AMiT spol. s. r. o.", + [3]byte{0, 9, 85}: "Young Generation International Corp.", + [3]byte{0, 9, 86}: "Network Systems Group, Ltd. (NSG)", + [3]byte{0, 9, 87}: "Supercaller, Inc.", + [3]byte{0, 9, 88}: "INTELNET S.A.", + [3]byte{0, 9, 89}: "Sitecsoft", + [3]byte{0, 9, 90}: "RACEWOOD TECHNOLOGY", + [3]byte{0, 9, 91}: "NETGEAR", + [3]byte{0, 9, 92}: "Philips Medical Systems - Cardiac and Monitoring Systems (CM", + [3]byte{0, 9, 93}: "Dialogue Technology Corp.", + [3]byte{0, 9, 94}: "Masstech Group Inc.", + [3]byte{0, 9, 95}: "Telebyte, Inc.", + [3]byte{0, 9, 96}: "YOZAN Inc.", + [3]byte{0, 9, 97}: "Switchgear and Instrumentation Ltd", + [3]byte{0, 9, 98}: "Sonitor Technologies AS", + [3]byte{0, 9, 99}: "Dominion Lasercom Inc.", + [3]byte{0, 9, 100}: "Hi-Techniques, Inc.", + [3]byte{0, 9, 101}: "HyunJu Computer Co., Ltd.", + [3]byte{0, 9, 102}: "TRIMBLE EUROPE BV", + [3]byte{0, 9, 103}: "Tachyon, Inc", + [3]byte{0, 9, 104}: "TECHNOVENTURE, INC.", + [3]byte{0, 9, 105}: "Meret Optical Communications", + [3]byte{0, 9, 106}: "Cloverleaf Communications Inc.", + [3]byte{0, 9, 107}: "IBM Corp", + [3]byte{0, 9, 108}: "Imedia Semiconductor Corp.", + [3]byte{0, 9, 109}: "Powernet Technologies Corp.", + [3]byte{0, 9, 110}: "GIANT ELECTRONICS LTD.", + [3]byte{0, 9, 111}: "Beijing Zhongqing Elegant Tech. Corp.,Limited", + [3]byte{0, 9, 112}: "Vibration Research Corporation", + [3]byte{0, 9, 113}: "Time Management, Inc.", + [3]byte{0, 9, 114}: "Securebase,Inc", + [3]byte{0, 9, 115}: "Lenten Technology Co., Ltd.", + [3]byte{0, 9, 116}: "Innopia Technologies, Inc.", + [3]byte{0, 9, 117}: "fSONA Communications Corporation", + [3]byte{0, 9, 118}: "Datasoft ISDN Systems GmbH", + [3]byte{0, 9, 119}: "Brunner Elektronik AG", + [3]byte{0, 9, 120}: "AIJI System Co., Ltd.", + [3]byte{0, 9, 121}: "Advanced Television Systems Committee, Inc.", + [3]byte{0, 9, 122}: "Louis Design Labs.", + [3]byte{0, 9, 123}: "Cisco Systems, Inc", + [3]byte{0, 9, 124}: "Cisco Systems, Inc", + [3]byte{0, 9, 125}: "SecWell Networks Oy", + [3]byte{0, 9, 126}: "IMI TECHNOLOGY CO., LTD", + [3]byte{0, 9, 127}: "Vsecure 2000 LTD.", + [3]byte{0, 9, 128}: "Power Zenith Inc.", + [3]byte{0, 9, 129}: "Newport Networks", + [3]byte{0, 9, 130}: "Loewe Opta GmbH", + [3]byte{0, 9, 131}: "GlobalTop Technology, Inc.", + [3]byte{0, 9, 132}: "MyCasa Network Inc.", + [3]byte{0, 9, 133}: "Auto Telecom Company", + [3]byte{0, 9, 134}: "Metalink LTD.", + [3]byte{0, 9, 135}: "NISHI NIPPON ELECTRIC WIRE & CABLE CO.,LTD.", + [3]byte{0, 9, 136}: "Nudian Electron Co., Ltd.", + [3]byte{0, 9, 137}: "VividLogic Inc.", + [3]byte{0, 9, 138}: "EqualLogic Inc", + [3]byte{0, 9, 139}: "Entropic Communications, Inc.", + [3]byte{0, 9, 140}: "Option Wireless Sweden", + [3]byte{0, 9, 141}: "Velocity Semiconductor", + [3]byte{0, 9, 142}: "ipcas GmbH", + [3]byte{0, 9, 143}: "Cetacean Networks", + [3]byte{0, 9, 144}: "ACKSYS Communications & systems", + [3]byte{0, 9, 145}: "GE Fanuc Automation Manufacturing, Inc.", + [3]byte{0, 9, 146}: "InterEpoch Technology,INC.", + [3]byte{0, 9, 147}: "Visteon Corporation", + [3]byte{0, 9, 148}: "Cronyx Engineering", + [3]byte{0, 9, 149}: "Castle Technology Ltd", + [3]byte{0, 9, 150}: "RDI", + [3]byte{0, 9, 151}: "Nortel Networks", + [3]byte{0, 9, 152}: "Capinfo Company Limited", + [3]byte{0, 9, 153}: "CP GEORGES RENAULT", + [3]byte{0, 9, 154}: "ELMO COMPANY, LIMITED", + [3]byte{0, 9, 155}: "Western Telematic Inc.", + [3]byte{0, 9, 156}: "Naval Research Laboratory", + [3]byte{0, 9, 157}: "Haliplex Communications", + [3]byte{0, 9, 158}: "Testech, Inc.", + [3]byte{0, 9, 159}: "VIDEX INC.", + [3]byte{0, 9, 160}: "Microtechno Corporation", + [3]byte{0, 9, 161}: "Telewise Communications, Inc.", + [3]byte{0, 9, 162}: "Interface Co., Ltd.", + [3]byte{0, 9, 163}: "Leadfly Techologies Corp. Ltd.", + [3]byte{0, 9, 164}: "HARTEC Corporation", + [3]byte{0, 9, 165}: "HANSUNG ELETRONIC INDUSTRIES DEVELOPMENT CO., LTD", + [3]byte{0, 9, 166}: "Ignis Optics, Inc.", + [3]byte{0, 9, 167}: "Bang & Olufsen A/S", + [3]byte{0, 9, 168}: "Eastmode Pte Ltd", + [3]byte{0, 9, 169}: "Ikanos Communications", + [3]byte{0, 9, 170}: "Data Comm for Business, Inc.", + [3]byte{0, 9, 171}: "Netcontrol Oy", + [3]byte{0, 9, 172}: "LANVOICE", + [3]byte{0, 9, 173}: "HYUNDAI SYSCOMM, INC.", + [3]byte{0, 9, 174}: "OKANO ELECTRIC CO.,LTD", + [3]byte{0, 9, 175}: "e-generis", + [3]byte{0, 9, 176}: "Onkyo Corporation", + [3]byte{0, 9, 177}: "Kanematsu Electronics, Ltd.", + [3]byte{0, 9, 178}: "L&F Inc.", + [3]byte{0, 9, 179}: "MCM Systems Ltd", + [3]byte{0, 9, 180}: "KISAN TELECOM CO., LTD.", + [3]byte{0, 9, 181}: "3J Tech. Co., Ltd.", + [3]byte{0, 9, 182}: "Cisco Systems, Inc", + [3]byte{0, 9, 183}: "Cisco Systems, Inc", + [3]byte{0, 9, 184}: "Entise Systems", + [3]byte{0, 9, 185}: "Action Imaging Solutions", + [3]byte{0, 9, 186}: "MAKU Informationstechik GmbH", + [3]byte{0, 9, 187}: "MathStar, Inc.", + [3]byte{0, 9, 188}: "Utility, Inc", + [3]byte{0, 9, 189}: "Epygi Technologies, Ltd.", + [3]byte{0, 9, 190}: "Mamiya-OP Co.,Ltd.", + [3]byte{0, 9, 191}: "Nintendo Co., Ltd.", + [3]byte{0, 9, 192}: "6WIND", + [3]byte{0, 9, 193}: "PROCES-DATA A/S", + [3]byte{0, 9, 194}: "Onity, Inc.", + [3]byte{0, 9, 195}: "NETAS", + [3]byte{0, 9, 196}: "Medicore Co., Ltd", + [3]byte{0, 9, 197}: "KINGENE Technology Corporation", + [3]byte{0, 9, 198}: "Visionics Corporation", + [3]byte{0, 9, 199}: "Movistec", + [3]byte{0, 9, 200}: "SINAGAWA TSUSHIN KEISOU SERVICE", + [3]byte{0, 9, 201}: "BlueWINC Co., Ltd.", + [3]byte{0, 9, 202}: "iMaxNetworks(Shenzhen)Limited.", + [3]byte{0, 9, 203}: "HBrain", + [3]byte{0, 9, 204}: "Moog GmbH", + [3]byte{0, 9, 205}: "HUDSON SOFT CO.,LTD.", + [3]byte{0, 9, 206}: "SpaceBridge Semiconductor Corp.", + [3]byte{0, 9, 207}: "iAd GmbH", + [3]byte{0, 9, 208}: "Solacom Technologies Inc.", + [3]byte{0, 9, 209}: "SERANOA NETWORKS INC", + [3]byte{0, 9, 210}: "Mai Logic Inc.", + [3]byte{0, 9, 211}: "Western DataCom Co., Inc.", + [3]byte{0, 9, 212}: "Transtech Networks", + [3]byte{0, 9, 213}: "Signal Communication, Inc.", + [3]byte{0, 9, 214}: "KNC One GmbH", + [3]byte{0, 9, 215}: "DC Security Products", + [3]byte{0, 9, 216}: "Fält Communications AB", + [3]byte{0, 9, 217}: "Neoscale Systems, Inc", + [3]byte{0, 9, 218}: "Control Module Inc.", + [3]byte{0, 9, 219}: "eSpace", + [3]byte{0, 9, 220}: "Galaxis Technology AG", + [3]byte{0, 9, 221}: "Mavin Technology Inc.", + [3]byte{0, 9, 222}: "Samjin Information & Communications Co., Ltd.", + [3]byte{0, 9, 223}: "Vestel Komunikasyon Sanayi ve Ticaret A.S.", + [3]byte{0, 9, 224}: "XEMICS S.A.", + [3]byte{0, 9, 225}: "Gemtek Technology Co., Ltd.", + [3]byte{0, 9, 226}: "Sinbon Electronics Co., Ltd.", + [3]byte{0, 9, 227}: "Angel Iglesias S.A.", + [3]byte{0, 9, 228}: "K Tech Infosystem Inc.", + [3]byte{0, 9, 229}: "Hottinger Baldwin Messtechnik GmbH", + [3]byte{0, 9, 230}: "Cyber Switching Inc.", + [3]byte{0, 9, 231}: "ADC Techonology", + [3]byte{0, 9, 232}: "Cisco Systems, Inc", + [3]byte{0, 9, 233}: "Cisco Systems, Inc", + [3]byte{0, 9, 234}: "YEM Inc.", + [3]byte{0, 9, 235}: "HuMANDATA LTD.", + [3]byte{0, 9, 236}: "Daktronics, Inc.", + [3]byte{0, 9, 237}: "CipherOptics", + [3]byte{0, 9, 238}: "MEIKYO ELECTRIC CO.,LTD", + [3]byte{0, 9, 239}: "Vocera Communications", + [3]byte{0, 9, 240}: "Shimizu Technology Inc.", + [3]byte{0, 9, 241}: "Yamaki Electric Corporation", + [3]byte{0, 9, 242}: "Cohu, Inc., Electronics Division", + [3]byte{0, 9, 243}: "WELL Communication Corp.", + [3]byte{0, 9, 244}: "Alcon Laboratories, Inc.", + [3]byte{0, 9, 245}: "Emerson Network Power Co.,Ltd", + [3]byte{0, 9, 246}: "Shenzhen Eastern Digital Tech Ltd.", + [3]byte{0, 9, 247}: "SED, a division of Calian", + [3]byte{0, 9, 248}: "UNIMO TECHNOLOGY CO., LTD.", + [3]byte{0, 9, 249}: "ART JAPAN CO., LTD.", + [3]byte{0, 9, 251}: "Philips Patient Monitoring", + [3]byte{0, 9, 252}: "IPFLEX Inc.", + [3]byte{0, 9, 253}: "Ubinetics Limited", + [3]byte{0, 9, 254}: "Daisy Technologies, Inc.", + [3]byte{0, 9, 255}: "X.net 2000 GmbH", + [3]byte{0, 10, 0}: "Mediatek Corp.", + [3]byte{0, 10, 1}: "SOHOware, Inc.", + [3]byte{0, 10, 2}: "ANNSO CO., LTD.", + [3]byte{0, 10, 3}: "ENDESA SERVICIOS, S.L.", + [3]byte{0, 10, 4}: "3Com Ltd", + [3]byte{0, 10, 5}: "Widax Corp.", + [3]byte{0, 10, 6}: "Teledex LLC", + [3]byte{0, 10, 7}: "WebWayOne Ltd", + [3]byte{0, 10, 8}: "Alpine Electronics, Inc.", + [3]byte{0, 10, 9}: "TaraCom Integrated Products, Inc.", + [3]byte{0, 10, 10}: "SUNIX Co., Ltd.", + [3]byte{0, 10, 11}: "Sealevel Systems, Inc.", + [3]byte{0, 10, 12}: "Scientific Research Corporation", + [3]byte{0, 10, 13}: "FCI Deutschland GmbH", + [3]byte{0, 10, 14}: "Invivo Research Inc.", + [3]byte{0, 10, 15}: "Ilryung Telesys, Inc", + [3]byte{0, 10, 16}: "FAST media integrations AG", + [3]byte{0, 10, 17}: "ExPet Technologies, Inc", + [3]byte{0, 10, 18}: "Azylex Technology, Inc", + [3]byte{0, 10, 19}: "Honeywell Video Systems", + [3]byte{0, 10, 20}: "TECO a.s.", + [3]byte{0, 10, 21}: "Silicon Data, Inc", + [3]byte{0, 10, 22}: "Lassen Research", + [3]byte{0, 10, 23}: "NESTAR COMMUNICATIONS, INC", + [3]byte{0, 10, 24}: "Vichel Inc.", + [3]byte{0, 10, 25}: "Valere Power, Inc.", + [3]byte{0, 10, 26}: "Imerge Ltd", + [3]byte{0, 10, 27}: "Stream Labs", + [3]byte{0, 10, 28}: "Bridge Information Co., Ltd.", + [3]byte{0, 10, 29}: "Optical Communications Products Inc.", + [3]byte{0, 10, 30}: "Red-M Products Limited", + [3]byte{0, 10, 31}: "ART WARE Telecommunication Co., Ltd.", + [3]byte{0, 10, 32}: "SVA Networks, Inc.", + [3]byte{0, 10, 33}: "Integra Telecom Co. Ltd", + [3]byte{0, 10, 34}: "Amperion Inc", + [3]byte{0, 10, 35}: "Parama Networks Inc", + [3]byte{0, 10, 36}: "Octave Communications", + [3]byte{0, 10, 37}: "CERAGON NETWORKS", + [3]byte{0, 10, 38}: "CEIA S.p.A.", + [3]byte{0, 10, 39}: "Apple, Inc.", + [3]byte{0, 10, 40}: "Motorola", + [3]byte{0, 10, 41}: "Pan Dacom Networking AG", + [3]byte{0, 10, 42}: "QSI Systems Inc.", + [3]byte{0, 10, 43}: "Etherstuff", + [3]byte{0, 10, 44}: "Active Tchnology Corporation", + [3]byte{0, 10, 45}: "Cabot Communications Limited", + [3]byte{0, 10, 46}: "MAPLE NETWORKS CO., LTD", + [3]byte{0, 10, 47}: "Artnix Inc.", + [3]byte{0, 10, 48}: "Visteon Corporation", + [3]byte{0, 10, 49}: "HCV Consulting", + [3]byte{0, 10, 50}: "Xsido Corporation", + [3]byte{0, 10, 51}: "Emulex Corporation", + [3]byte{0, 10, 52}: "Identicard Systems Incorporated", + [3]byte{0, 10, 53}: "Xilinx", + [3]byte{0, 10, 54}: "Synelec Telecom Multimedia", + [3]byte{0, 10, 55}: "Procera Networks, Inc.", + [3]byte{0, 10, 56}: "Apani Networks", + [3]byte{0, 10, 57}: "LoPA Information Technology", + [3]byte{0, 10, 58}: "J-THREE INTERNATIONAL Holding Co., Ltd.", + [3]byte{0, 10, 59}: "GCT Semiconductor, Inc", + [3]byte{0, 10, 60}: "Enerpoint Ltd.", + [3]byte{0, 10, 61}: "Elo Sistemas Eletronicos S.A.", + [3]byte{0, 10, 62}: "EADS Telecom", + [3]byte{0, 10, 63}: "Data East Corporation", + [3]byte{0, 10, 64}: "Crown Audio -- Harmanm International", + [3]byte{0, 10, 65}: "Cisco Systems, Inc", + [3]byte{0, 10, 66}: "Cisco Systems, Inc", + [3]byte{0, 10, 67}: "Chunghwa Telecom Co., Ltd.", + [3]byte{0, 10, 68}: "Avery Dennison Deutschland GmbH", + [3]byte{0, 10, 69}: "Audio-Technica Corp.", + [3]byte{0, 10, 70}: "ARO WELDING TECHNOLOGIES SAS", + [3]byte{0, 10, 71}: "Allied Vision Technologies", + [3]byte{0, 10, 72}: "Albatron Technology", + [3]byte{0, 10, 73}: "F5 Networks, Inc.", + [3]byte{0, 10, 74}: "Targa Systems Ltd.", + [3]byte{0, 10, 75}: "DataPower Technology, Inc.", + [3]byte{0, 10, 76}: "Molecular Devices Corporation", + [3]byte{0, 10, 77}: "Noritz Corporation", + [3]byte{0, 10, 78}: "UNITEK Electronics INC.", + [3]byte{0, 10, 79}: "Brain Boxes Limited", + [3]byte{0, 10, 80}: "REMOTEK CORPORATION", + [3]byte{0, 10, 81}: "GyroSignal Technology Co., Ltd.", + [3]byte{0, 10, 82}: "AsiaRF Ltd.", + [3]byte{0, 10, 83}: "Intronics, Incorporated", + [3]byte{0, 10, 84}: "Laguna Hills, Inc.", + [3]byte{0, 10, 85}: "MARKEM Corporation", + [3]byte{0, 10, 86}: "HITACHI Maxell Ltd.", + [3]byte{0, 10, 87}: "Hewlett Packard", + [3]byte{0, 10, 88}: "Freyer & Siegel Elektronik GmbH & Co. KG", + [3]byte{0, 10, 89}: "HW server", + [3]byte{0, 10, 90}: "GreenNET Technologies Co.,Ltd.", + [3]byte{0, 10, 91}: "Power-One as", + [3]byte{0, 10, 92}: "Carel s.p.a.", + [3]byte{0, 10, 93}: "FingerTec Worldwide Sdn Bhd", + [3]byte{0, 10, 94}: "3COM Corporation", + [3]byte{0, 10, 95}: "almedio inc.", + [3]byte{0, 10, 96}: "Autostar Technology Pte Ltd", + [3]byte{0, 10, 97}: "Cellinx Systems Inc.", + [3]byte{0, 10, 98}: "Crinis Networks, Inc.", + [3]byte{0, 10, 99}: "DHD GmbH", + [3]byte{0, 10, 100}: "Eracom Technologies", + [3]byte{0, 10, 101}: "GentechMedia.co.,ltd.", + [3]byte{0, 10, 102}: "MITSUBISHI ELECTRIC SYSTEM & SERVICE CO.,LTD.", + [3]byte{0, 10, 103}: "OngCorp", + [3]byte{0, 10, 104}: "Solarflare Communications Inc", + [3]byte{0, 10, 105}: "SUNNY bell Technology Co., Ltd.", + [3]byte{0, 10, 106}: "SVM Microwaves s.r.o.", + [3]byte{0, 10, 107}: "Tadiran Telecom Business Systems LTD", + [3]byte{0, 10, 108}: "Walchem Corporation", + [3]byte{0, 10, 109}: "EKS Elektronikservice GmbH", + [3]byte{0, 10, 110}: "Harmonic, Inc", + [3]byte{0, 10, 111}: "ZyFLEX Technologies Inc", + [3]byte{0, 10, 112}: "MPLS Forum", + [3]byte{0, 10, 113}: "Avrio Technologies, Inc", + [3]byte{0, 10, 114}: "STEC, INC.", + [3]byte{0, 10, 115}: "Scientific Atlanta", + [3]byte{0, 10, 116}: "Manticom Networks Inc.", + [3]byte{0, 10, 117}: "Caterpillar, Inc", + [3]byte{0, 10, 118}: "Beida Jade Bird Huaguang Technology Co.,Ltd", + [3]byte{0, 10, 119}: "Bluewire Technologies LLC", + [3]byte{0, 10, 120}: "OLITEC", + [3]byte{0, 10, 121}: "corega K.K", + [3]byte{0, 10, 122}: "Kyoritsu Electric Co., Ltd.", + [3]byte{0, 10, 123}: "Cornelius Consult", + [3]byte{0, 10, 124}: "Tecton Ltd", + [3]byte{0, 10, 125}: "Valo, Inc.", + [3]byte{0, 10, 126}: "The Advantage Group", + [3]byte{0, 10, 127}: "Teradon Industries, Inc", + [3]byte{0, 10, 128}: "Telkonet Inc.", + [3]byte{0, 10, 129}: "TEIMA Audiotex S.L.", + [3]byte{0, 10, 130}: "TATSUTA SYSTEM ELECTRONICS CO.,LTD.", + [3]byte{0, 10, 131}: "SALTO SYSTEMS S.L.", + [3]byte{0, 10, 132}: "Rainsun Enterprise Co., Ltd.", + [3]byte{0, 10, 133}: "PLAT'C2,Inc", + [3]byte{0, 10, 134}: "Lenze", + [3]byte{0, 10, 135}: "Integrated Micromachines Inc.", + [3]byte{0, 10, 136}: "InCypher S.A.", + [3]byte{0, 10, 137}: "Creval Systems, Inc.", + [3]byte{0, 10, 138}: "Cisco Systems, Inc", + [3]byte{0, 10, 139}: "Cisco Systems, Inc", + [3]byte{0, 10, 140}: "Guardware Systems Ltd.", + [3]byte{0, 10, 141}: "EUROTHERM LIMITED", + [3]byte{0, 10, 142}: "Invacom Ltd", + [3]byte{0, 10, 143}: "Aska International Inc.", + [3]byte{0, 10, 144}: "Bayside Interactive, Inc.", + [3]byte{0, 10, 145}: "HemoCue AB", + [3]byte{0, 10, 146}: "Presonus Corporation", + [3]byte{0, 10, 147}: "W2 Networks, Inc.", + [3]byte{0, 10, 148}: "ShangHai cellink CO., LTD", + [3]byte{0, 10, 149}: "Apple, Inc.", + [3]byte{0, 10, 150}: "MEWTEL TECHNOLOGY INC.", + [3]byte{0, 10, 151}: "SONICblue, Inc.", + [3]byte{0, 10, 152}: "M+F Gwinner GmbH & Co", + [3]byte{0, 10, 153}: "Calamp Wireless Networks Inc", + [3]byte{0, 10, 154}: "Aiptek International Inc", + [3]byte{0, 10, 155}: "TB Group Inc", + [3]byte{0, 10, 156}: "Server Technology, Inc.", + [3]byte{0, 10, 157}: "King Young Technology Co. Ltd.", + [3]byte{0, 10, 158}: "BroadWeb Corportation", + [3]byte{0, 10, 159}: "Pannaway Technologies, Inc.", + [3]byte{0, 10, 160}: "Cedar Point Communications", + [3]byte{0, 10, 161}: "V V S Limited", + [3]byte{0, 10, 162}: "SYSTEK INC.", + [3]byte{0, 10, 163}: "SHIMAFUJI ELECTRIC CO.,LTD.", + [3]byte{0, 10, 164}: "SHANGHAI SURVEILLANCE TECHNOLOGY CO,LTD", + [3]byte{0, 10, 165}: "MAXLINK INDUSTRIES LIMITED", + [3]byte{0, 10, 166}: "Hochiki Corporation", + [3]byte{0, 10, 167}: "FEI Electron Optics", + [3]byte{0, 10, 168}: "ePipe Pty. Ltd.", + [3]byte{0, 10, 169}: "Brooks Automation GmbH", + [3]byte{0, 10, 170}: "AltiGen Communications Inc.", + [3]byte{0, 10, 171}: "Toyota Technical Development Corporation", + [3]byte{0, 10, 172}: "TerraTec Electronic GmbH", + [3]byte{0, 10, 173}: "Stargames Corporation", + [3]byte{0, 10, 174}: "Rosemount Process Analytical", + [3]byte{0, 10, 175}: "Pipal Systems", + [3]byte{0, 10, 176}: "LOYTEC electronics GmbH", + [3]byte{0, 10, 177}: "GENETEC Corporation", + [3]byte{0, 10, 178}: "Fresnel Wireless Systems", + [3]byte{0, 10, 179}: "Fa. GIRA", + [3]byte{0, 10, 180}: "ETIC Telecommunications", + [3]byte{0, 10, 181}: "Digital Electronic Network", + [3]byte{0, 10, 182}: "COMPUNETIX, INC", + [3]byte{0, 10, 183}: "Cisco Systems, Inc", + [3]byte{0, 10, 184}: "Cisco Systems, Inc", + [3]byte{0, 10, 185}: "Astera Technologies Corp.", + [3]byte{0, 10, 186}: "Arcon Technology Limited", + [3]byte{0, 10, 187}: "Taiwan Secom Co,. Ltd", + [3]byte{0, 10, 188}: "Seabridge Ltd.", + [3]byte{0, 10, 189}: "Rupprecht & Patashnick Co.", + [3]byte{0, 10, 190}: "OPNET Technologies CO., LTD.", + [3]byte{0, 10, 191}: "HIROTA SS", + [3]byte{0, 10, 192}: "Fuyoh Video Industry CO., LTD.", + [3]byte{0, 10, 193}: "Futuretel", + [3]byte{0, 10, 194}: "Wuhan FiberHome Digital Technology Co.,Ltd.", + [3]byte{0, 10, 195}: "eM Technics Co., Ltd.", + [3]byte{0, 10, 196}: "Daewoo Teletech Co., Ltd", + [3]byte{0, 10, 197}: "Color Kinetics", + [3]byte{0, 10, 198}: "Overture Networks.", + [3]byte{0, 10, 199}: "Unication Group", + [3]byte{0, 10, 200}: "ZPSYS CO.,LTD. (Planning&Management)", + [3]byte{0, 10, 201}: "Zambeel Inc", + [3]byte{0, 10, 202}: "YOKOYAMA SHOKAI CO.,Ltd.", + [3]byte{0, 10, 203}: "XPAK MSA Group", + [3]byte{0, 10, 204}: "Winnow Networks, Inc.", + [3]byte{0, 10, 205}: "Sunrich Technology Limited", + [3]byte{0, 10, 206}: "RADIANTECH, INC.", + [3]byte{0, 10, 207}: "PROVIDEO Multimedia Co. Ltd.", + [3]byte{0, 10, 208}: "Niigata Develoment Center, F.I.T. Co., Ltd.", + [3]byte{0, 10, 209}: "MWS", + [3]byte{0, 10, 210}: "JEPICO Corporation", + [3]byte{0, 10, 211}: "INITECH Co., Ltd", + [3]byte{0, 10, 212}: "CoreBell Systems Inc.", + [3]byte{0, 10, 213}: "Brainchild Electronic Co., Ltd.", + [3]byte{0, 10, 214}: "BeamReach Networks", + [3]byte{0, 10, 215}: "Origin ELECTRIC CO.,LTD.", + [3]byte{0, 10, 216}: "IPCserv Technology Corp.", + [3]byte{0, 10, 217}: "Sony Mobile Communications AB", + [3]byte{0, 10, 218}: "Vindicator Technologies", + [3]byte{0, 10, 219}: "SkyPilot Network, Inc", + [3]byte{0, 10, 220}: "RuggedCom Inc.", + [3]byte{0, 10, 221}: "Allworx Corp.", + [3]byte{0, 10, 222}: "Happy Communication Co., Ltd.", + [3]byte{0, 10, 223}: "Gennum Corporation", + [3]byte{0, 10, 224}: "Fujitsu Softek", + [3]byte{0, 10, 225}: "EG Technology", + [3]byte{0, 10, 226}: "Binatone Electronics International, Ltd", + [3]byte{0, 10, 227}: "YANG MEI TECHNOLOGY CO., LTD", + [3]byte{0, 10, 228}: "Wistron Corporation", + [3]byte{0, 10, 229}: "ScottCare Corporation", + [3]byte{0, 10, 230}: "Elitegroup Computer Systems Co.,Ltd.", + [3]byte{0, 10, 231}: "ELIOP S.A.", + [3]byte{0, 10, 232}: "Cathay Roxus Information Technology Co. LTD", + [3]byte{0, 10, 233}: "AirVast Technology Inc.", + [3]byte{0, 10, 234}: "ADAM ELEKTRONIK LTD. ŞTI", + [3]byte{0, 10, 235}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{0, 10, 236}: "Koatsu Gas Kogyo Co., Ltd.", + [3]byte{0, 10, 237}: "HARTING Electronics GmbH", + [3]byte{0, 10, 238}: "GCD Hard- & Software GmbH", + [3]byte{0, 10, 239}: "OTRUM ASA", + [3]byte{0, 10, 240}: "SHIN-OH ELECTRONICS CO., LTD. R&D", + [3]byte{0, 10, 241}: "Clarity Design, Inc.", + [3]byte{0, 10, 242}: "NeoAxiom Corp.", + [3]byte{0, 10, 243}: "Cisco Systems, Inc", + [3]byte{0, 10, 244}: "Cisco Systems, Inc", + [3]byte{0, 10, 245}: "Airgo Networks, Inc.", + [3]byte{0, 10, 246}: "Emerson Climate Technologies Retail Solutions, Inc.", + [3]byte{0, 10, 247}: "Broadcom", + [3]byte{0, 10, 248}: "American Telecare Inc.", + [3]byte{0, 10, 249}: "HiConnect, Inc.", + [3]byte{0, 10, 250}: "Traverse Technologies Australia", + [3]byte{0, 10, 251}: "Ambri Limited", + [3]byte{0, 10, 252}: "Core Tec Communications, LLC", + [3]byte{0, 10, 253}: "Kentec Electronics", + [3]byte{0, 10, 254}: "NovaPal Ltd", + [3]byte{0, 10, 255}: "Kilchherr Elektronik AG", + [3]byte{0, 11, 0}: "FUJIAN START COMPUTER EQUIPMENT CO.,LTD", + [3]byte{0, 11, 1}: "DAIICHI ELECTRONICS CO., LTD.", + [3]byte{0, 11, 2}: "Dallmeier electronic", + [3]byte{0, 11, 3}: "Taekwang Industrial Co., Ltd", + [3]byte{0, 11, 4}: "Volktek Corporation", + [3]byte{0, 11, 5}: "Pacific Broadband Networks", + [3]byte{0, 11, 6}: "ARRIS Group, Inc.", + [3]byte{0, 11, 7}: "Voxpath Networks", + [3]byte{0, 11, 8}: "Pillar Data Systems", + [3]byte{0, 11, 9}: "Ifoundry Systems Singapore", + [3]byte{0, 11, 10}: "dBm Optics", + [3]byte{0, 11, 11}: "Corrent Corporation", + [3]byte{0, 11, 12}: "Agile Systems Inc.", + [3]byte{0, 11, 13}: "Air2U, Inc.", + [3]byte{0, 11, 14}: "Trapeze Networks", + [3]byte{0, 11, 15}: "Bosch Rexroth", + [3]byte{0, 11, 16}: "11wave Technonlogy Co.,Ltd", + [3]byte{0, 11, 17}: "HIMEJI ABC TRADING CO.,LTD.", + [3]byte{0, 11, 18}: "NURI Telecom Co., Ltd.", + [3]byte{0, 11, 19}: "ZETRON INC", + [3]byte{0, 11, 20}: "ViewSonic Corporation", + [3]byte{0, 11, 21}: "Platypus Technology", + [3]byte{0, 11, 22}: "Communication Machinery Corporation", + [3]byte{0, 11, 23}: "MKS Instruments", + [3]byte{0, 11, 24}: "Private", + [3]byte{0, 11, 25}: "Vernier Networks, Inc.", + [3]byte{0, 11, 26}: "Industrial Defender, Inc.", + [3]byte{0, 11, 27}: "Systronix, Inc.", + [3]byte{0, 11, 28}: "SIBCO bv", + [3]byte{0, 11, 29}: "LayerZero Power Systems, Inc.", + [3]byte{0, 11, 30}: "KAPPA opto-electronics GmbH", + [3]byte{0, 11, 31}: "I CON Computer Co.", + [3]byte{0, 11, 32}: "Hirata corporation", + [3]byte{0, 11, 33}: "G-Star Communications Inc.", + [3]byte{0, 11, 34}: "Environmental Systems and Services", + [3]byte{0, 11, 35}: "Siemens Subscriber Networks", + [3]byte{0, 11, 36}: "AirLogic", + [3]byte{0, 11, 37}: "Aeluros", + [3]byte{0, 11, 38}: "Wetek Corporation", + [3]byte{0, 11, 39}: "Scion Corporation", + [3]byte{0, 11, 40}: "Quatech Inc.", + [3]byte{0, 11, 41}: "LS(LG) Industrial Systems co.,Ltd", + [3]byte{0, 11, 42}: "HOWTEL Co., Ltd.", + [3]byte{0, 11, 43}: "HOSTNET CORPORATION", + [3]byte{0, 11, 44}: "Eiki Industrial Co. Ltd.", + [3]byte{0, 11, 45}: "Danfoss Inc.", + [3]byte{0, 11, 46}: "Cal-Comp Electronics & Communications Company Ltd.", + [3]byte{0, 11, 47}: "bplan GmbH", + [3]byte{0, 11, 48}: "Beijing Gongye Science & Technology Co.,Ltd", + [3]byte{0, 11, 49}: "Yantai ZhiYang Scientific and technology industry CO., LTD", + [3]byte{0, 11, 50}: "VORMETRIC, INC.", + [3]byte{0, 11, 51}: "Vivato Technologies", + [3]byte{0, 11, 52}: "ShangHai Broadband Technologies CO.LTD", + [3]byte{0, 11, 53}: "Quad Bit System co., Ltd.", + [3]byte{0, 11, 54}: "Productivity Systems, Inc.", + [3]byte{0, 11, 55}: "MANUFACTURE DES MONTRES ROLEX SA", + [3]byte{0, 11, 56}: "Knürr GmbH", + [3]byte{0, 11, 57}: "Keisoku Giken Co.,Ltd.", + [3]byte{0, 11, 58}: "QuStream Corporation", + [3]byte{0, 11, 59}: "devolo AG", + [3]byte{0, 11, 60}: "Cygnal Integrated Products, Inc.", + [3]byte{0, 11, 61}: "CONTAL OK Ltd.", + [3]byte{0, 11, 62}: "BittWare, Inc", + [3]byte{0, 11, 63}: "Anthology Solutions Inc.", + [3]byte{0, 11, 64}: "Oclaro", + [3]byte{0, 11, 65}: "Ing. Büro Dr. Beutlhauser", + [3]byte{0, 11, 66}: "commax Co., Ltd.", + [3]byte{0, 11, 67}: "Microscan Systems, Inc.", + [3]byte{0, 11, 68}: "Concord IDea Corp.", + [3]byte{0, 11, 69}: "Cisco Systems, Inc", + [3]byte{0, 11, 70}: "Cisco Systems, Inc", + [3]byte{0, 11, 71}: "Advanced Energy", + [3]byte{0, 11, 72}: "sofrel", + [3]byte{0, 11, 73}: "RF-Link System Inc.", + [3]byte{0, 11, 74}: "Visimetrics (UK) Ltd", + [3]byte{0, 11, 75}: "VISIOWAVE SA", + [3]byte{0, 11, 76}: "Clarion (M) Sdn Bhd", + [3]byte{0, 11, 77}: "Emuzed", + [3]byte{0, 11, 78}: "VertexRSI, General Dynamics SatCOM Technologies, Inc.", + [3]byte{0, 11, 79}: "Verifone", + [3]byte{0, 11, 80}: "Oxygnet", + [3]byte{0, 11, 81}: "Micetek International Inc.", + [3]byte{0, 11, 82}: "JOYMAX ELECTRONICS CO. LTD.", + [3]byte{0, 11, 83}: "INITIUM Co., Ltd.", + [3]byte{0, 11, 84}: "BiTMICRO Networks, Inc.", + [3]byte{0, 11, 85}: "ADInstruments", + [3]byte{0, 11, 86}: "Cybernetics", + [3]byte{0, 11, 87}: "Silicon Laboratories", + [3]byte{0, 11, 88}: "Astronautics C.A LTD", + [3]byte{0, 11, 89}: "ScriptPro, LLC", + [3]byte{0, 11, 90}: "HyperEdge", + [3]byte{0, 11, 91}: "Rincon Research Corporation", + [3]byte{0, 11, 92}: "Newtech Co.,Ltd", + [3]byte{0, 11, 93}: "FUJITSU LIMITED", + [3]byte{0, 11, 94}: "Audio Engineering Society Inc.", + [3]byte{0, 11, 95}: "Cisco Systems, Inc", + [3]byte{0, 11, 96}: "Cisco Systems, Inc", + [3]byte{0, 11, 97}: "Friedrich Lütze GmbH & Co. KG", + [3]byte{0, 11, 98}: "ib-mohnen KG", + [3]byte{0, 11, 99}: "Kaleidescape", + [3]byte{0, 11, 100}: "Kieback & Peter GmbH & Co KG", + [3]byte{0, 11, 101}: "Sy.A.C. srl", + [3]byte{0, 11, 102}: "Teralink Communications", + [3]byte{0, 11, 103}: "Topview Technology Corporation", + [3]byte{0, 11, 104}: "Addvalue Communications Pte Ltd", + [3]byte{0, 11, 105}: "Franke Finland Oy", + [3]byte{0, 11, 106}: "Asiarock Technology Limited", + [3]byte{0, 11, 107}: "Wistron Neweb Corporation", + [3]byte{0, 11, 108}: "Sychip Inc.", + [3]byte{0, 11, 109}: "SOLECTRON JAPAN NAKANIIDA", + [3]byte{0, 11, 110}: "Neff Instrument Corp.", + [3]byte{0, 11, 111}: "Media Streaming Networks Inc", + [3]byte{0, 11, 112}: "Load Technology, Inc.", + [3]byte{0, 11, 113}: "Litchfield Communications Inc.", + [3]byte{0, 11, 114}: "Lawo AG", + [3]byte{0, 11, 115}: "Kodeos Communications", + [3]byte{0, 11, 116}: "Kingwave Technology Co., Ltd.", + [3]byte{0, 11, 117}: "Iosoft Ltd.", + [3]byte{0, 11, 118}: "ET&T Technology Co. Ltd.", + [3]byte{0, 11, 119}: "Cogent Systems, Inc.", + [3]byte{0, 11, 120}: "TAIFATECH INC.", + [3]byte{0, 11, 121}: "X-COM, Inc.", + [3]byte{0, 11, 122}: "L-3 Linkabit", + [3]byte{0, 11, 123}: "Test-Um Inc.", + [3]byte{0, 11, 124}: "Telex Communications", + [3]byte{0, 11, 125}: "SOLOMON EXTREME INTERNATIONAL LTD.", + [3]byte{0, 11, 126}: "SAGINOMIYA Seisakusho Inc.", + [3]byte{0, 11, 127}: "Align Engineering LLC", + [3]byte{0, 11, 128}: "Lycium Networks", + [3]byte{0, 11, 129}: "Kaparel Corporation", + [3]byte{0, 11, 130}: "Grandstream Networks, Inc.", + [3]byte{0, 11, 131}: "DATAWATT B.V.", + [3]byte{0, 11, 132}: "BODET", + [3]byte{0, 11, 133}: "Cisco Systems, Inc", + [3]byte{0, 11, 134}: "Aruba Networks", + [3]byte{0, 11, 135}: "American Reliance Inc.", + [3]byte{0, 11, 136}: "Vidisco ltd.", + [3]byte{0, 11, 137}: "Top Global Technology, Ltd.", + [3]byte{0, 11, 138}: "MITEQ Inc.", + [3]byte{0, 11, 139}: "KERAJET, S.A.", + [3]byte{0, 11, 140}: "Flextronics", + [3]byte{0, 11, 141}: "Avvio Networks", + [3]byte{0, 11, 142}: "Ascent Corporation", + [3]byte{0, 11, 143}: "AKITA ELECTRONICS SYSTEMS CO.,LTD.", + [3]byte{0, 11, 144}: "ADVA Optical Networking Ltd.", + [3]byte{0, 11, 145}: "Aglaia Gesellschaft für Bildverarbeitung und Kommunikation mbH", + [3]byte{0, 11, 146}: "Ascom Danmark A/S", + [3]byte{0, 11, 147}: "Ritter Elektronik", + [3]byte{0, 11, 148}: "Digital Monitoring Products, Inc.", + [3]byte{0, 11, 149}: "eBet Gaming Systems Pty Ltd", + [3]byte{0, 11, 150}: "Innotrac Diagnostics Oy", + [3]byte{0, 11, 151}: "Matsushita Electric Industrial Co.,Ltd.", + [3]byte{0, 11, 152}: "NiceTechVision", + [3]byte{0, 11, 153}: "SensAble Technologies, Inc.", + [3]byte{0, 11, 154}: "Shanghai Ulink Telecom Equipment Co. Ltd.", + [3]byte{0, 11, 155}: "Sirius System Co, Ltd.", + [3]byte{0, 11, 156}: "TriBeam Technologies, Inc.", + [3]byte{0, 11, 157}: "TwinMOS Technologies Inc.", + [3]byte{0, 11, 158}: "Yasing Technology Corp.", + [3]byte{0, 11, 159}: "Neue ELSA GmbH", + [3]byte{0, 11, 160}: "T&L Information Inc.", + [3]byte{0, 11, 161}: "Fujikura Solutions Ltd.", + [3]byte{0, 11, 162}: "Sumitomo Electric Industries,Ltd", + [3]byte{0, 11, 163}: "Siemens AG, I&S", + [3]byte{0, 11, 164}: "Shiron Satellite Communications Ltd. (1996)", + [3]byte{0, 11, 165}: "Quasar Cipta Mandiri, PT", + [3]byte{0, 11, 166}: "Miyakawa Electric Works Ltd.", + [3]byte{0, 11, 167}: "Maranti Networks", + [3]byte{0, 11, 168}: "HANBACK ELECTRONICS CO., LTD.", + [3]byte{0, 11, 169}: "CloudShield Technologies, Inc.", + [3]byte{0, 11, 170}: "Aiphone co.,Ltd", + [3]byte{0, 11, 171}: "Advantech Technology (CHINA) Co., Ltd.", + [3]byte{0, 11, 172}: "3Com Ltd", + [3]byte{0, 11, 173}: "PC-PoS Inc.", + [3]byte{0, 11, 174}: "Vitals System Inc.", + [3]byte{0, 11, 175}: "WOOJU COMMUNICATIONS Co,.Ltd", + [3]byte{0, 11, 176}: "Sysnet Telematica srl", + [3]byte{0, 11, 177}: "Super Star Technology Co., Ltd.", + [3]byte{0, 11, 178}: "SMALLBIG TECHNOLOGY", + [3]byte{0, 11, 179}: "RiT technologies Ltd.", + [3]byte{0, 11, 180}: "RDC Semiconductor Inc.,", + [3]byte{0, 11, 181}: "nStor Technologies, Inc.", + [3]byte{0, 11, 182}: "Metalligence Technology Corp.", + [3]byte{0, 11, 183}: "Micro Systems Co.,Ltd.", + [3]byte{0, 11, 184}: "Kihoku Electronic Co.", + [3]byte{0, 11, 185}: "Imsys AB", + [3]byte{0, 11, 186}: "Harmonic, Inc", + [3]byte{0, 11, 187}: "Etin Systems Co., Ltd", + [3]byte{0, 11, 188}: "En Garde Systems, Inc.", + [3]byte{0, 11, 189}: "Connexionz Limited", + [3]byte{0, 11, 190}: "Cisco Systems, Inc", + [3]byte{0, 11, 191}: "Cisco Systems, Inc", + [3]byte{0, 11, 192}: "China IWNComm Co., Ltd.", + [3]byte{0, 11, 193}: "Bay Microsystems, Inc.", + [3]byte{0, 11, 194}: "Corinex Communication Corp.", + [3]byte{0, 11, 195}: "Multiplex, Inc.", + [3]byte{0, 11, 196}: "BIOTRONIK GmbH & Co", + [3]byte{0, 11, 197}: "SMC Networks, Inc.", + [3]byte{0, 11, 198}: "ISAC, Inc.", + [3]byte{0, 11, 199}: "ICET S.p.A.", + [3]byte{0, 11, 200}: "AirFlow Networks", + [3]byte{0, 11, 201}: "Electroline Equipment", + [3]byte{0, 11, 202}: "DATAVAN TC", + [3]byte{0, 11, 203}: "Fagor Automation , S. Coop", + [3]byte{0, 11, 204}: "JUSAN, S.A.", + [3]byte{0, 11, 205}: "Hewlett Packard", + [3]byte{0, 11, 206}: "Free2move AB", + [3]byte{0, 11, 207}: "AGFA NDT INC.", + [3]byte{0, 11, 208}: "XiMeta Technology Americas Inc.", + [3]byte{0, 11, 209}: "Aeronix, Inc.", + [3]byte{0, 11, 210}: "Remopro Technology Inc.", + [3]byte{0, 11, 211}: "cd3o", + [3]byte{0, 11, 212}: "Beijing Wise Technology & Science Development Co.Ltd", + [3]byte{0, 11, 213}: "Nvergence, Inc.", + [3]byte{0, 11, 214}: "Paxton Access Ltd", + [3]byte{0, 11, 215}: "DORMA Time + Access GmbH", + [3]byte{0, 11, 216}: "Industrial Scientific Corp.", + [3]byte{0, 11, 217}: "General Hydrogen", + [3]byte{0, 11, 218}: "EyeCross Co.,Inc.", + [3]byte{0, 11, 219}: "Dell Inc.", + [3]byte{0, 11, 220}: "AKCP", + [3]byte{0, 11, 221}: "TOHOKU RICOH Co., LTD.", + [3]byte{0, 11, 222}: "TELDIX GmbH", + [3]byte{0, 11, 223}: "Shenzhen RouterD Networks Limited", + [3]byte{0, 11, 224}: "SercoNet Ltd.", + [3]byte{0, 11, 225}: "Nokia NET Product Operations", + [3]byte{0, 11, 226}: "Lumenera Corporation", + [3]byte{0, 11, 227}: "Key Stream Co., Ltd.", + [3]byte{0, 11, 228}: "Hosiden Corporation", + [3]byte{0, 11, 229}: "HIMS International Corporation", + [3]byte{0, 11, 230}: "Datel Electronics", + [3]byte{0, 11, 231}: "COMFLUX TECHNOLOGY INC.", + [3]byte{0, 11, 232}: "AOIP", + [3]byte{0, 11, 233}: "Actel Corporation", + [3]byte{0, 11, 234}: "Zultys Technologies", + [3]byte{0, 11, 235}: "Systegra AG", + [3]byte{0, 11, 236}: "NIPPON ELECTRIC INSTRUMENT, INC.", + [3]byte{0, 11, 237}: "ELM Inc.", + [3]byte{0, 11, 238}: "inc.jet, Incorporated", + [3]byte{0, 11, 239}: "Code Corporation", + [3]byte{0, 11, 240}: "MoTEX Products Co., Ltd.", + [3]byte{0, 11, 241}: "LAP Laser Applikations", + [3]byte{0, 11, 242}: "Chih-Kan Technology Co., Ltd.", + [3]byte{0, 11, 243}: "BAE SYSTEMS", + [3]byte{0, 11, 244}: "Private", + [3]byte{0, 11, 245}: "Shanghai Sibo Telecom Technology Co.,Ltd", + [3]byte{0, 11, 246}: "Nitgen Co., Ltd", + [3]byte{0, 11, 247}: "NIDEK CO.,LTD", + [3]byte{0, 11, 248}: "Infinera", + [3]byte{0, 11, 249}: "Gemstone Communications, Inc.", + [3]byte{0, 11, 250}: "EXEMYS SRL", + [3]byte{0, 11, 251}: "D-NET International Corporation", + [3]byte{0, 11, 252}: "Cisco Systems, Inc", + [3]byte{0, 11, 253}: "Cisco Systems, Inc", + [3]byte{0, 11, 254}: "CASTEL Broadband Limited", + [3]byte{0, 11, 255}: "Berkeley Camera Engineering", + [3]byte{0, 12, 0}: "BEB Industrie-Elektronik AG", + [3]byte{0, 12, 1}: "Abatron AG", + [3]byte{0, 12, 2}: "ABB Oy", + [3]byte{0, 12, 3}: "HDMI Licensing, LLC", + [3]byte{0, 12, 4}: "Tecnova", + [3]byte{0, 12, 5}: "RPA Reserch Co., Ltd.", + [3]byte{0, 12, 6}: "Nixvue Systems Pte Ltd", + [3]byte{0, 12, 7}: "Iftest AG", + [3]byte{0, 12, 8}: "HUMEX Technologies Corp.", + [3]byte{0, 12, 9}: "Hitachi IE Systems Co., Ltd", + [3]byte{0, 12, 10}: "Guangdong Province Electronic Technology Research Institute", + [3]byte{0, 12, 11}: "Broadbus Technologies", + [3]byte{0, 12, 12}: "APPRO TECHNOLOGY INC.", + [3]byte{0, 12, 13}: "Communications & Power Industries / Satcom Division", + [3]byte{0, 12, 14}: "XtremeSpectrum, Inc.", + [3]byte{0, 12, 15}: "Techno-One Co., Ltd", + [3]byte{0, 12, 16}: "PNI Corporation", + [3]byte{0, 12, 17}: "NIPPON DEMPA CO.,LTD.", + [3]byte{0, 12, 18}: "Micro-Optronic-Messtechnik GmbH", + [3]byte{0, 12, 19}: "MediaQ", + [3]byte{0, 12, 20}: "Diagnostic Instruments, Inc.", + [3]byte{0, 12, 21}: "CyberPower Systems, Inc.", + [3]byte{0, 12, 22}: "Concorde Microsystems Inc.", + [3]byte{0, 12, 23}: "AJA Video Systems Inc", + [3]byte{0, 12, 24}: "Zenisu Keisoku Inc.", + [3]byte{0, 12, 25}: "Telio Communications GmbH", + [3]byte{0, 12, 26}: "Quest Technical Solutions Inc.", + [3]byte{0, 12, 27}: "ORACOM Co, Ltd.", + [3]byte{0, 12, 28}: "MicroWeb Co., Ltd.", + [3]byte{0, 12, 29}: "Mettler & Fuchs AG", + [3]byte{0, 12, 30}: "Global Cache", + [3]byte{0, 12, 31}: "Glimmerglass Networks", + [3]byte{0, 12, 32}: "Fi WIn, Inc.", + [3]byte{0, 12, 33}: "Faculty of Science and Technology, Keio University", + [3]byte{0, 12, 34}: "Double D Electronics Ltd", + [3]byte{0, 12, 35}: "Beijing Lanchuan Tech. Co., Ltd.", + [3]byte{0, 12, 36}: "ANATOR", + [3]byte{0, 12, 37}: "Allied Telesis Labs, Inc.", + [3]byte{0, 12, 38}: "Weintek Labs. Inc.", + [3]byte{0, 12, 39}: "Sammy Corporation", + [3]byte{0, 12, 40}: "RIFATRON", + [3]byte{0, 12, 41}: "VMware, Inc.", + [3]byte{0, 12, 42}: "OCTTEL Communication Co., Ltd.", + [3]byte{0, 12, 43}: "ELIAS Technology, Inc.", + [3]byte{0, 12, 44}: "Enwiser Inc.", + [3]byte{0, 12, 45}: "FullWave Technology Co., Ltd.", + [3]byte{0, 12, 46}: "Openet information technology(shenzhen) Co., Ltd.", + [3]byte{0, 12, 47}: "SeorimTechnology Co.,Ltd.", + [3]byte{0, 12, 48}: "Cisco Systems, Inc", + [3]byte{0, 12, 49}: "Cisco Systems, Inc", + [3]byte{0, 12, 50}: "Avionic Design Development GmbH", + [3]byte{0, 12, 51}: "Compucase Enterprise Co. Ltd.", + [3]byte{0, 12, 52}: "Vixen Co., Ltd.", + [3]byte{0, 12, 53}: "KaVo Dental GmbH & Co. KG", + [3]byte{0, 12, 54}: "SHARP TAKAYA ELECTRONICS INDUSTRY CO.,LTD.", + [3]byte{0, 12, 55}: "Geomation, Inc.", + [3]byte{0, 12, 56}: "TelcoBridges Inc.", + [3]byte{0, 12, 57}: "Sentinel Wireless Inc.", + [3]byte{0, 12, 58}: "Oxance", + [3]byte{0, 12, 59}: "Orion Electric Co., Ltd.", + [3]byte{0, 12, 60}: "MediaChorus, Inc.", + [3]byte{0, 12, 61}: "Glsystech Co., Ltd.", + [3]byte{0, 12, 62}: "Crest Audio", + [3]byte{0, 12, 63}: "Cogent Defence & Security Networks,", + [3]byte{0, 12, 64}: "Altech Controls", + [3]byte{0, 12, 65}: "Cisco-Linksys, LLC", + [3]byte{0, 12, 66}: "Routerboard.com", + [3]byte{0, 12, 67}: "Ralink Technology, Corp.", + [3]byte{0, 12, 68}: "Automated Interfaces, Inc.", + [3]byte{0, 12, 69}: "Animation Technologies Inc.", + [3]byte{0, 12, 70}: "Allied Telesyn Inc.", + [3]byte{0, 12, 71}: "SK Teletech(R&D Planning Team)", + [3]byte{0, 12, 72}: "QoStek Corporation", + [3]byte{0, 12, 73}: "Dangaard Telecom Denmark A/S", + [3]byte{0, 12, 74}: "Cygnus Microsystems (P) Limited", + [3]byte{0, 12, 75}: "Cheops Elektronik", + [3]byte{0, 12, 76}: "Arcor AG&Co.", + [3]byte{0, 12, 77}: "Curtiss-Wright Controls Avionics & Electronics", + [3]byte{0, 12, 78}: "Winbest Technology CO,LT", + [3]byte{0, 12, 79}: "UDTech Japan Corporation", + [3]byte{0, 12, 80}: "Seagate Technology", + [3]byte{0, 12, 81}: "Scientific Technologies Inc.", + [3]byte{0, 12, 82}: "Roll Systems Inc.", + [3]byte{0, 12, 83}: "Private", + [3]byte{0, 12, 84}: "Pedestal Networks, Inc", + [3]byte{0, 12, 85}: "Microlink Communications Inc.", + [3]byte{0, 12, 86}: "Megatel Computer (1986) Corp.", + [3]byte{0, 12, 87}: "MACKIE Engineering Services Belgium BVBA", + [3]byte{0, 12, 88}: "M&S Systems", + [3]byte{0, 12, 89}: "Indyme Electronics, Inc.", + [3]byte{0, 12, 90}: "IBSmm Embedded Electronics Consulting", + [3]byte{0, 12, 91}: "HANWANG TECHNOLOGY CO.,LTD", + [3]byte{0, 12, 92}: "GTN Systems B.V.", + [3]byte{0, 12, 93}: "CHIC TECHNOLOGY (CHINA) CORP.", + [3]byte{0, 12, 94}: "Calypso Medical", + [3]byte{0, 12, 95}: "Avtec, Inc.", + [3]byte{0, 12, 96}: "ACM Systems", + [3]byte{0, 12, 97}: "AC Tech corporation DBA Advanced Digital", + [3]byte{0, 12, 98}: "ABB AB, Cewe-Control", + [3]byte{0, 12, 99}: "Zenith Electronics Corporation", + [3]byte{0, 12, 100}: "X2 MSA Group", + [3]byte{0, 12, 101}: "Sunin Telecom", + [3]byte{0, 12, 102}: "Pronto Networks Inc", + [3]byte{0, 12, 103}: "OYO ELECTRIC CO.,LTD", + [3]byte{0, 12, 104}: "SigmaTel, Inc.", + [3]byte{0, 12, 105}: "National Radio Astronomy Observatory", + [3]byte{0, 12, 106}: "MBARI", + [3]byte{0, 12, 107}: "Kurz Industrie-Elektronik GmbH", + [3]byte{0, 12, 108}: "Elgato Systems LLC", + [3]byte{0, 12, 109}: "Edwards Ltd.", + [3]byte{0, 12, 110}: "ASUSTek COMPUTER INC.", + [3]byte{0, 12, 111}: "Amtek system co.,LTD.", + [3]byte{0, 12, 112}: "ACC GmbH", + [3]byte{0, 12, 113}: "Wybron, Inc", + [3]byte{0, 12, 114}: "Tempearl Industrial Co., Ltd.", + [3]byte{0, 12, 115}: "TELSON ELECTRONICS CO., LTD", + [3]byte{0, 12, 116}: "RIVERTEC CORPORATION", + [3]byte{0, 12, 117}: "Oriental integrated electronics. LTD", + [3]byte{0, 12, 118}: "MICRO-STAR INTERNATIONAL CO., LTD.", + [3]byte{0, 12, 119}: "Life Racing Ltd", + [3]byte{0, 12, 120}: "In-Tech Electronics Limited", + [3]byte{0, 12, 121}: "Extel Communications P/L", + [3]byte{0, 12, 122}: "DaTARIUS Technologies GmbH", + [3]byte{0, 12, 123}: "ALPHA PROJECT Co.,Ltd.", + [3]byte{0, 12, 124}: "Internet Information Image Inc.", + [3]byte{0, 12, 125}: "TEIKOKU ELECTRIC MFG. CO., LTD", + [3]byte{0, 12, 126}: "Tellium Incorporated", + [3]byte{0, 12, 127}: "synertronixx GmbH", + [3]byte{0, 12, 128}: "Opelcomm Inc.", + [3]byte{0, 12, 129}: "Schneider Electric (Australia)", + [3]byte{0, 12, 130}: "NETWORK TECHNOLOGIES INC", + [3]byte{0, 12, 131}: "Logical Solutions", + [3]byte{0, 12, 132}: "Eazix, Inc.", + [3]byte{0, 12, 133}: "Cisco Systems, Inc", + [3]byte{0, 12, 134}: "Cisco Systems, Inc", + [3]byte{0, 12, 135}: "AMD", + [3]byte{0, 12, 136}: "Apache Micro Peripherals, Inc.", + [3]byte{0, 12, 137}: "AC Electric Vehicles, Ltd.", + [3]byte{0, 12, 138}: "Bose Corporation", + [3]byte{0, 12, 139}: "Connect Tech Inc", + [3]byte{0, 12, 140}: "KODICOM CO.,LTD.", + [3]byte{0, 12, 141}: "MATRIX VISION GmbH", + [3]byte{0, 12, 142}: "Mentor Engineering Inc", + [3]byte{0, 12, 143}: "Nergal s.r.l.", + [3]byte{0, 12, 144}: "Octasic Inc.", + [3]byte{0, 12, 145}: "Riverhead Networks Inc.", + [3]byte{0, 12, 146}: "WolfVision Gmbh", + [3]byte{0, 12, 147}: "Xeline Co., Ltd.", + [3]byte{0, 12, 148}: "United Electronic Industries, Inc. (EUI)", + [3]byte{0, 12, 149}: "PrimeNet", + [3]byte{0, 12, 150}: "OQO, Inc.", + [3]byte{0, 12, 151}: "NV ADB TTV Technologies SA", + [3]byte{0, 12, 152}: "LETEK Communications Inc.", + [3]byte{0, 12, 153}: "HITEL LINK Co.,Ltd", + [3]byte{0, 12, 154}: "Hitech Electronics Corp.", + [3]byte{0, 12, 155}: "EE Solutions, Inc", + [3]byte{0, 12, 156}: "Chongho information & communications", + [3]byte{0, 12, 157}: "UbeeAirWalk, Inc.", + [3]byte{0, 12, 158}: "MemoryLink Corp.", + [3]byte{0, 12, 159}: "NKE Corporation", + [3]byte{0, 12, 160}: "StorCase Technology, Inc.", + [3]byte{0, 12, 161}: "SIGMACOM Co., LTD.", + [3]byte{0, 12, 162}: "Harmonic Video Network", + [3]byte{0, 12, 163}: "Rancho Technology, Inc.", + [3]byte{0, 12, 164}: "Prompttec Product Management GmbH", + [3]byte{0, 12, 165}: "Naman NZ LTd", + [3]byte{0, 12, 166}: "Mintera Corporation", + [3]byte{0, 12, 167}: "Metro (Suzhou) Technologies Co., Ltd.", + [3]byte{0, 12, 168}: "Garuda Networks Corporation", + [3]byte{0, 12, 169}: "Ebtron Inc.", + [3]byte{0, 12, 170}: "Cubic Transportation Systems Inc", + [3]byte{0, 12, 171}: "Commend International GmbH", + [3]byte{0, 12, 172}: "Citizen Watch Co., Ltd.", + [3]byte{0, 12, 173}: "BTU International", + [3]byte{0, 12, 174}: "Ailocom Oy", + [3]byte{0, 12, 175}: "TRI TERM CO.,LTD.", + [3]byte{0, 12, 176}: "Star Semiconductor Corporation", + [3]byte{0, 12, 177}: "Salland Engineering (Europe) BV", + [3]byte{0, 12, 178}: "UNION co., ltd.", + [3]byte{0, 12, 179}: "ROUND Co.,Ltd.", + [3]byte{0, 12, 180}: "AutoCell Laboratories, Inc.", + [3]byte{0, 12, 181}: "Premier Technolgies, Inc", + [3]byte{0, 12, 182}: "NANJING SEU MOBILE & INTERNET TECHNOLOGY CO.,LTD", + [3]byte{0, 12, 183}: "Nanjing Huazhuo Electronics Co., Ltd.", + [3]byte{0, 12, 184}: "MEDION AG", + [3]byte{0, 12, 185}: "LEA", + [3]byte{0, 12, 186}: "Jamex, Inc.", + [3]byte{0, 12, 187}: "ISKRAEMECO", + [3]byte{0, 12, 188}: "Iscutum", + [3]byte{0, 12, 189}: "Interface Masters, Inc", + [3]byte{0, 12, 190}: "Innominate Security Technologies AG", + [3]byte{0, 12, 191}: "Holy Stone Ent. Co., Ltd.", + [3]byte{0, 12, 192}: "Genera Oy", + [3]byte{0, 12, 193}: "Eaton Corporation", + [3]byte{0, 12, 194}: "ControlNet (India) Private Limited", + [3]byte{0, 12, 195}: "BeWAN systems", + [3]byte{0, 12, 196}: "Tiptel AG", + [3]byte{0, 12, 197}: "Nextlink Co., Ltd.", + [3]byte{0, 12, 198}: "Ka-Ro electronics GmbH", + [3]byte{0, 12, 199}: "Intelligent Computer Solutions Inc.", + [3]byte{0, 12, 200}: "Xytronix Research & Design, Inc.", + [3]byte{0, 12, 201}: "ILWOO DATA & TECHNOLOGY CO.,LTD", + [3]byte{0, 12, 202}: "HGST a Western Digital Company", + [3]byte{0, 12, 203}: "Design Combus Ltd", + [3]byte{0, 12, 204}: "Aeroscout Ltd.", + [3]byte{0, 12, 205}: "IEC - TC57", + [3]byte{0, 12, 206}: "Cisco Systems, Inc", + [3]byte{0, 12, 207}: "Cisco Systems, Inc", + [3]byte{0, 12, 208}: "Symetrix", + [3]byte{0, 12, 209}: "SFOM Technology Corp.", + [3]byte{0, 12, 210}: "Schaffner EMV AG", + [3]byte{0, 12, 211}: "Prettl Elektronik Radeberg GmbH", + [3]byte{0, 12, 212}: "Positron Public Safety Systems inc.", + [3]byte{0, 12, 213}: "Passave Inc.", + [3]byte{0, 12, 214}: "PARTNER TECH", + [3]byte{0, 12, 215}: "Nallatech Ltd", + [3]byte{0, 12, 216}: "M. K. Juchheim GmbH & Co", + [3]byte{0, 12, 217}: "Itcare Co., Ltd", + [3]byte{0, 12, 218}: "FreeHand Systems, Inc.", + [3]byte{0, 12, 219}: "Brocade Communications Systems, Inc.", + [3]byte{0, 12, 220}: "BECS Technology, Inc", + [3]byte{0, 12, 221}: "AOS technologies AG", + [3]byte{0, 12, 222}: "ABB STOTZ-KONTAKT GmbH", + [3]byte{0, 12, 223}: "PULNiX America, Inc", + [3]byte{0, 12, 224}: "Trek Diagnostics Inc.", + [3]byte{0, 12, 225}: "The Open Group", + [3]byte{0, 12, 226}: "Rolls-Royce", + [3]byte{0, 12, 227}: "Option International N.V.", + [3]byte{0, 12, 228}: "NeuroCom International, Inc.", + [3]byte{0, 12, 229}: "ARRIS Group, Inc.", + [3]byte{0, 12, 230}: "Meru Networks Inc", + [3]byte{0, 12, 231}: "MediaTek Inc.", + [3]byte{0, 12, 232}: "GuangZhou AnJuBao Co., Ltd", + [3]byte{0, 12, 233}: "BLOOMBERG L.P.", + [3]byte{0, 12, 234}: "aphona Kommunikationssysteme", + [3]byte{0, 12, 235}: "CNMP Networks, Inc.", + [3]byte{0, 12, 236}: "Spectracom Corp.", + [3]byte{0, 12, 237}: "Real Digital Media", + [3]byte{0, 12, 238}: "jp-embedded", + [3]byte{0, 12, 239}: "Open Networks Engineering Ltd", + [3]byte{0, 12, 240}: "M & N GmbH", + [3]byte{0, 12, 241}: "Intel Corporation", + [3]byte{0, 12, 242}: "GAMESA Eólica", + [3]byte{0, 12, 243}: "CALL IMAGE SA", + [3]byte{0, 12, 244}: "AKATSUKI ELECTRIC MFG.CO.,LTD.", + [3]byte{0, 12, 245}: "InfoExpress", + [3]byte{0, 12, 246}: "Sitecom Europe BV", + [3]byte{0, 12, 247}: "Nortel Networks", + [3]byte{0, 12, 248}: "Nortel Networks", + [3]byte{0, 12, 249}: "Xylem Water Solutions", + [3]byte{0, 12, 250}: "Digital Systems Corp", + [3]byte{0, 12, 251}: "Korea Network Systems", + [3]byte{0, 12, 252}: "S2io Technologies Corp", + [3]byte{0, 12, 253}: "Hyundai ImageQuest Co.,Ltd.", + [3]byte{0, 12, 254}: "Grand Electronic Co., Ltd", + [3]byte{0, 12, 255}: "MRO-TEK LIMITED", + [3]byte{0, 13, 0}: "Seaway Networks Inc.", + [3]byte{0, 13, 1}: "P&E Microcomputer Systems, Inc.", + [3]byte{0, 13, 2}: "NEC Platforms, Ltd.", + [3]byte{0, 13, 3}: "Matrics, Inc.", + [3]byte{0, 13, 4}: "Foxboro Eckardt Development GmbH", + [3]byte{0, 13, 5}: "cybernet manufacturing inc.", + [3]byte{0, 13, 6}: "Compulogic Limited", + [3]byte{0, 13, 7}: "Calrec Audio Ltd", + [3]byte{0, 13, 8}: "AboveCable, Inc.", + [3]byte{0, 13, 9}: "Yuehua(Zhuhai) Electronic CO. LTD", + [3]byte{0, 13, 10}: "Projectiondesign as", + [3]byte{0, 13, 11}: "BUFFALO.INC", + [3]byte{0, 13, 12}: "MDI Security Systems", + [3]byte{0, 13, 13}: "ITSupported, LLC", + [3]byte{0, 13, 14}: "Inqnet Systems, Inc.", + [3]byte{0, 13, 15}: "Finlux Ltd", + [3]byte{0, 13, 16}: "Embedtronics Oy", + [3]byte{0, 13, 17}: "DENTSPLY - Gendex", + [3]byte{0, 13, 18}: "AXELL Corporation", + [3]byte{0, 13, 19}: "Wilhelm Rutenbeck GmbH&Co.KG", + [3]byte{0, 13, 20}: "Vtech Innovation LP dba Advanced American Telephones", + [3]byte{0, 13, 21}: "Voipac s.r.o.", + [3]byte{0, 13, 22}: "UHS Systems Pty Ltd", + [3]byte{0, 13, 23}: "Turbo Networks Co.Ltd", + [3]byte{0, 13, 24}: "Mega-Trend Electronics CO., LTD.", + [3]byte{0, 13, 25}: "ROBE Show lighting", + [3]byte{0, 13, 26}: "Mustek System Inc.", + [3]byte{0, 13, 27}: "Kyoto Electronics Manufacturing Co., Ltd.", + [3]byte{0, 13, 28}: "Amesys Defense", + [3]byte{0, 13, 29}: "HIGH-TEK HARNESS ENT. CO., LTD.", + [3]byte{0, 13, 30}: "Control Techniques", + [3]byte{0, 13, 31}: "AV Digital", + [3]byte{0, 13, 32}: "ASAHIKASEI TECHNOSYSTEM CO.,LTD.", + [3]byte{0, 13, 33}: "WISCORE Inc.", + [3]byte{0, 13, 34}: "Unitronics LTD", + [3]byte{0, 13, 35}: "Smart Solution, Inc", + [3]byte{0, 13, 36}: "SENTEC E&E CO., LTD.", + [3]byte{0, 13, 37}: "SANDEN CORPORATION", + [3]byte{0, 13, 38}: "Primagraphics Limited", + [3]byte{0, 13, 39}: "MICROPLEX Printware AG", + [3]byte{0, 13, 40}: "Cisco Systems, Inc", + [3]byte{0, 13, 41}: "Cisco Systems, Inc", + [3]byte{0, 13, 42}: "Scanmatic AS", + [3]byte{0, 13, 43}: "Racal Instruments", + [3]byte{0, 13, 44}: "Net2Edge Limited", + [3]byte{0, 13, 45}: "NCT Deutschland GmbH", + [3]byte{0, 13, 46}: "Matsushita Avionics Systems Corporation", + [3]byte{0, 13, 47}: "AIN Comm.Tech.Co., LTD", + [3]byte{0, 13, 48}: "IceFyre Semiconductor", + [3]byte{0, 13, 49}: "Compellent Technologies, Inc.", + [3]byte{0, 13, 50}: "DispenseSource, Inc.", + [3]byte{0, 13, 51}: "Prediwave Corp.", + [3]byte{0, 13, 52}: "Shell International Exploration and Production, Inc.", + [3]byte{0, 13, 53}: "PAC International Ltd", + [3]byte{0, 13, 54}: "Wu Han Routon Electronic Co., Ltd", + [3]byte{0, 13, 55}: "WIPLUG", + [3]byte{0, 13, 56}: "NISSIN INC.", + [3]byte{0, 13, 57}: "Network Electronics", + [3]byte{0, 13, 58}: "Microsoft Corp.", + [3]byte{0, 13, 59}: "Microelectronics Technology Inc.", + [3]byte{0, 13, 60}: "i.Tech Dynamic Ltd", + [3]byte{0, 13, 61}: "Hammerhead Systems, Inc.", + [3]byte{0, 13, 62}: "APLUX Communications Ltd.", + [3]byte{0, 13, 63}: "VTI Instruments Corporation", + [3]byte{0, 13, 64}: "Verint Loronix Video Solutions", + [3]byte{0, 13, 65}: "Siemens AG ICM MP UC RD IT KLF1", + [3]byte{0, 13, 66}: "Newbest Development Limited", + [3]byte{0, 13, 67}: "DRS Tactical Systems Inc.", + [3]byte{0, 13, 68}: "Audio BU - Logitech", + [3]byte{0, 13, 69}: "Tottori SANYO Electric Co., Ltd.", + [3]byte{0, 13, 70}: "Parker SSD Drives", + [3]byte{0, 13, 71}: "Collex", + [3]byte{0, 13, 72}: "AEWIN Technologies Co., Ltd.", + [3]byte{0, 13, 73}: "Triton Systems of Delaware, Inc.", + [3]byte{0, 13, 74}: "Steag ETA-Optik", + [3]byte{0, 13, 75}: "Roku, Inc.", + [3]byte{0, 13, 76}: "Outline Electronics Ltd.", + [3]byte{0, 13, 77}: "Ninelanes", + [3]byte{0, 13, 78}: "NDR Co.,LTD.", + [3]byte{0, 13, 79}: "Kenwood Corporation", + [3]byte{0, 13, 80}: "Galazar Networks", + [3]byte{0, 13, 81}: "DIVR Systems, Inc.", + [3]byte{0, 13, 82}: "Comart system", + [3]byte{0, 13, 83}: "Beijing 5w Communication Corp.", + [3]byte{0, 13, 84}: "3Com Ltd", + [3]byte{0, 13, 85}: "SANYCOM Technology Co.,Ltd", + [3]byte{0, 13, 86}: "Dell Inc.", + [3]byte{0, 13, 87}: "Fujitsu I-Network Systems Limited.", + [3]byte{0, 13, 88}: "Private", + [3]byte{0, 13, 89}: "Amity Systems, Inc.", + [3]byte{0, 13, 90}: "Tiesse SpA", + [3]byte{0, 13, 91}: "Smart Empire Investments Limited", + [3]byte{0, 13, 92}: "Robert Bosch GmbH, VT-ATMO", + [3]byte{0, 13, 93}: "Raritan Computer, Inc", + [3]byte{0, 13, 94}: "NEC Personal Products", + [3]byte{0, 13, 95}: "Minds Inc", + [3]byte{0, 13, 96}: "IBM Corp", + [3]byte{0, 13, 97}: "Giga-Byte Technology Co., Ltd.", + [3]byte{0, 13, 98}: "Funkwerk Dabendorf GmbH", + [3]byte{0, 13, 99}: "DENT Instruments, Inc.", + [3]byte{0, 13, 100}: "COMAG Handels AG", + [3]byte{0, 13, 101}: "Cisco Systems, Inc", + [3]byte{0, 13, 102}: "Cisco Systems, Inc", + [3]byte{0, 13, 103}: "Ericsson", + [3]byte{0, 13, 104}: "Vinci Systems, Inc.", + [3]byte{0, 13, 105}: "TMT&D Corporation", + [3]byte{0, 13, 106}: "Redwood Technologies LTD", + [3]byte{0, 13, 107}: "Mita-Teknik A/S", + [3]byte{0, 13, 108}: "M-Audio", + [3]byte{0, 13, 109}: "K-Tech Devices Corp.", + [3]byte{0, 13, 110}: "K-Patents Oy", + [3]byte{0, 13, 111}: "Ember Corporation", + [3]byte{0, 13, 112}: "Datamax Corporation", + [3]byte{0, 13, 113}: "boca systems", + [3]byte{0, 13, 114}: "2Wire Inc", + [3]byte{0, 13, 115}: "Technical Support, Inc.", + [3]byte{0, 13, 116}: "Sand Network Systems, Inc.", + [3]byte{0, 13, 117}: "Kobian Pte Ltd - Taiwan Branch", + [3]byte{0, 13, 118}: "Hokuto Denshi Co,. Ltd.", + [3]byte{0, 13, 119}: "FalconStor Software", + [3]byte{0, 13, 120}: "Engineering & Security", + [3]byte{0, 13, 121}: "Dynamic Solutions Co,.Ltd.", + [3]byte{0, 13, 122}: "DiGATTO Asia Pacific Pte Ltd", + [3]byte{0, 13, 123}: "Consensys Computers Inc.", + [3]byte{0, 13, 124}: "Codian Ltd", + [3]byte{0, 13, 125}: "Afco Systems", + [3]byte{0, 13, 126}: "Axiowave Networks, Inc.", + [3]byte{0, 13, 127}: "MIDAS COMMUNICATION TECHNOLOGIES PTE LTD ( Foreign Branch)", + [3]byte{0, 13, 128}: "Online Development Inc", + [3]byte{0, 13, 129}: "Pepperl+Fuchs GmbH", + [3]byte{0, 13, 130}: "PHS srl", + [3]byte{0, 13, 131}: "Sanmina-SCI Hungary Ltd.", + [3]byte{0, 13, 132}: "Makus Inc.", + [3]byte{0, 13, 133}: "Tapwave, Inc.", + [3]byte{0, 13, 134}: "Huber + Suhner AG", + [3]byte{0, 13, 135}: "Elitegroup Computer Systems Co.,Ltd.", + [3]byte{0, 13, 136}: "D-Link Corporation", + [3]byte{0, 13, 137}: "Bils Technology Inc", + [3]byte{0, 13, 138}: "Winners Electronics Co., Ltd.", + [3]byte{0, 13, 139}: "T&D Corporation", + [3]byte{0, 13, 140}: "Shanghai Wedone Digital Ltd. CO.", + [3]byte{0, 13, 141}: "Prosoft Technology, Inc", + [3]byte{0, 13, 142}: "Koden Electronics Co., Ltd.", + [3]byte{0, 13, 143}: "King Tsushin Kogyo Co., LTD.", + [3]byte{0, 13, 144}: "Factum Electronics AB", + [3]byte{0, 13, 145}: "Eclipse (HQ Espana) S.L.", + [3]byte{0, 13, 146}: "ARIMA Communications Corp.", + [3]byte{0, 13, 147}: "Apple, Inc.", + [3]byte{0, 13, 148}: "AFAR Communications,Inc", + [3]byte{0, 13, 149}: "Opti-cell, Inc.", + [3]byte{0, 13, 150}: "Vtera Technology Inc.", + [3]byte{0, 13, 151}: "ABB Inc./Tropos", + [3]byte{0, 13, 152}: "S.W.A.C. Schmitt-Walter Automation Consult GmbH", + [3]byte{0, 13, 153}: "Orbital Sciences Corp.; Launch Systems Group", + [3]byte{0, 13, 154}: "INFOTEC LTD", + [3]byte{0, 13, 155}: "Heraeus Electro-Nite International N.V.", + [3]byte{0, 13, 156}: "Elan GmbH & Co KG", + [3]byte{0, 13, 157}: "Hewlett Packard", + [3]byte{0, 13, 158}: "TOKUDEN OHIZUMI SEISAKUSYO Co.,Ltd.", + [3]byte{0, 13, 159}: "RF Micro Devices", + [3]byte{0, 13, 160}: "NEDAP N.V.", + [3]byte{0, 13, 161}: "MIRAE ITS Co.,LTD.", + [3]byte{0, 13, 162}: "Infrant Technologies, Inc.", + [3]byte{0, 13, 163}: "Emerging Technologies Limited", + [3]byte{0, 13, 164}: "DOSCH & AMAND SYSTEMS AG", + [3]byte{0, 13, 165}: "Fabric7 Systems, Inc", + [3]byte{0, 13, 166}: "Universal Switching Corporation", + [3]byte{0, 13, 167}: "Private", + [3]byte{0, 13, 168}: "Teletronics Technology Corporation", + [3]byte{0, 13, 169}: "T.E.A.M. S.L.", + [3]byte{0, 13, 170}: "S.A.Tehnology co.,Ltd.", + [3]byte{0, 13, 171}: "Parker Hannifin GmbH Electromechanical Division Europe", + [3]byte{0, 13, 172}: "Japan CBM Corporation", + [3]byte{0, 13, 173}: "Dataprobe, Inc.", + [3]byte{0, 13, 174}: "SAMSUNG HEAVY INDUSTRIES CO., LTD.", + [3]byte{0, 13, 175}: "Plexus Corp (UK) Ltd", + [3]byte{0, 13, 176}: "Olym-tech Co.,Ltd.", + [3]byte{0, 13, 177}: "Japan Network Service Co., Ltd.", + [3]byte{0, 13, 178}: "Ammasso, Inc.", + [3]byte{0, 13, 179}: "SDO Communication Corperation", + [3]byte{0, 13, 180}: "NETASQ", + [3]byte{0, 13, 181}: "GLOBALSAT TECHNOLOGY CORPORATION", + [3]byte{0, 13, 182}: "Broadcom", + [3]byte{0, 13, 183}: "SANKO ELECTRIC CO,.LTD", + [3]byte{0, 13, 184}: "SCHILLER AG", + [3]byte{0, 13, 185}: "PC Engines GmbH", + [3]byte{0, 13, 186}: "Océ Document Technologies GmbH", + [3]byte{0, 13, 187}: "Nippon Dentsu Co.,Ltd.", + [3]byte{0, 13, 188}: "Cisco Systems, Inc", + [3]byte{0, 13, 189}: "Cisco Systems, Inc", + [3]byte{0, 13, 190}: "Bel Fuse Europe Ltd.,UK", + [3]byte{0, 13, 191}: "TekTone Sound & Signal Mfg., Inc.", + [3]byte{0, 13, 192}: "Spagat AS", + [3]byte{0, 13, 193}: "SafeWeb Inc", + [3]byte{0, 13, 194}: "Private", + [3]byte{0, 13, 195}: "First Communication, Inc.", + [3]byte{0, 13, 196}: "Emcore Corporation", + [3]byte{0, 13, 197}: "EchoStar Global B.V.", + [3]byte{0, 13, 198}: "DigiRose Technology Co., Ltd.", + [3]byte{0, 13, 199}: "COSMIC ENGINEERING INC.", + [3]byte{0, 13, 200}: "AirMagnet, Inc", + [3]byte{0, 13, 201}: "THALES Elektronik Systeme GmbH", + [3]byte{0, 13, 202}: "Tait Electronics", + [3]byte{0, 13, 203}: "Petcomkorea Co., Ltd.", + [3]byte{0, 13, 204}: "NEOSMART Corp.", + [3]byte{0, 13, 205}: "GROUPE TXCOM", + [3]byte{0, 13, 206}: "Dynavac Technology Pte Ltd", + [3]byte{0, 13, 207}: "Cidra Corp.", + [3]byte{0, 13, 208}: "TetraTec Instruments GmbH", + [3]byte{0, 13, 209}: "Stryker Corporation", + [3]byte{0, 13, 210}: "Simrad Optronics ASA", + [3]byte{0, 13, 211}: "SAMWOO Telecommunication Co.,Ltd.", + [3]byte{0, 13, 212}: "Symantec Corporation", + [3]byte{0, 13, 213}: "O'RITE TECHNOLOGY CO.,LTD", + [3]byte{0, 13, 214}: "ITI LTD", + [3]byte{0, 13, 215}: "Bright", + [3]byte{0, 13, 216}: "BBN", + [3]byte{0, 13, 217}: "Anton Paar GmbH", + [3]byte{0, 13, 218}: "ALLIED TELESIS K.K.", + [3]byte{0, 13, 219}: "AIRWAVE TECHNOLOGIES INC.", + [3]byte{0, 13, 220}: "VAC", + [3]byte{0, 13, 221}: "Profilo Telra Elektronik Sanayi ve Ticaret. A.Ş", + [3]byte{0, 13, 222}: "Joyteck Co., Ltd.", + [3]byte{0, 13, 223}: "Japan Image & Network Inc.", + [3]byte{0, 13, 224}: "ICPDAS Co.,LTD", + [3]byte{0, 13, 225}: "Control Products, Inc.", + [3]byte{0, 13, 226}: "CMZ Sistemi Elettronici", + [3]byte{0, 13, 227}: "AT Sweden AB", + [3]byte{0, 13, 228}: "DIGINICS, Inc.", + [3]byte{0, 13, 229}: "Samsung Thales", + [3]byte{0, 13, 230}: "YOUNGBO ENGINEERING CO.,LTD", + [3]byte{0, 13, 231}: "Snap-on OEM Group", + [3]byte{0, 13, 232}: "Nasaco Electronics Pte. Ltd", + [3]byte{0, 13, 233}: "Napatech Aps", + [3]byte{0, 13, 234}: "Kingtel Telecommunication Corp.", + [3]byte{0, 13, 235}: "CompXs Limited", + [3]byte{0, 13, 236}: "Cisco Systems, Inc", + [3]byte{0, 13, 237}: "Cisco Systems, Inc", + [3]byte{0, 13, 238}: "Andrew RF Power Amplifier Group", + [3]byte{0, 13, 239}: "Soc. Coop. Bilanciai", + [3]byte{0, 13, 240}: "QCOM TECHNOLOGY INC.", + [3]byte{0, 13, 241}: "IONIX INC.", + [3]byte{0, 13, 242}: "Private", + [3]byte{0, 13, 243}: "Asmax Solutions", + [3]byte{0, 13, 244}: "Watertek Co.", + [3]byte{0, 13, 245}: "Teletronics International Inc.", + [3]byte{0, 13, 246}: "Technology Thesaurus Corp.", + [3]byte{0, 13, 247}: "Space Dynamics Lab", + [3]byte{0, 13, 248}: "ORGA Kartensysteme GmbH", + [3]byte{0, 13, 249}: "NDS Limited", + [3]byte{0, 13, 250}: "Micro Control Systems Ltd.", + [3]byte{0, 13, 251}: "Komax AG", + [3]byte{0, 13, 252}: "ITFOR Inc.", + [3]byte{0, 13, 253}: "Huges Hi-Tech Inc.,", + [3]byte{0, 13, 254}: "Hauppauge Computer Works, Inc.", + [3]byte{0, 13, 255}: "CHENMING MOLD INDUSTRY CORP.", + [3]byte{0, 14, 0}: "Atrie", + [3]byte{0, 14, 1}: "ASIP Technologies Inc.", + [3]byte{0, 14, 2}: "Advantech AMT Inc.", + [3]byte{0, 14, 3}: "Emulex Corporation", + [3]byte{0, 14, 4}: "CMA/Microdialysis AB", + [3]byte{0, 14, 5}: "WIRELESS MATRIX CORP.", + [3]byte{0, 14, 6}: "Team Simoco Ltd", + [3]byte{0, 14, 7}: "Sony Mobile Communications AB", + [3]byte{0, 14, 8}: "Cisco-Linksys, LLC", + [3]byte{0, 14, 9}: "Shenzhen Coship Software Co.,LTD.", + [3]byte{0, 14, 10}: "SAKUMA DESIGN OFFICE", + [3]byte{0, 14, 11}: "Netac Technology Co., Ltd.", + [3]byte{0, 14, 12}: "Intel Corporation", + [3]byte{0, 14, 13}: "Hesch Schröder GmbH", + [3]byte{0, 14, 14}: "ESA elettronica S.P.A.", + [3]byte{0, 14, 15}: "ERMME", + [3]byte{0, 14, 16}: "C-guys, Inc.", + [3]byte{0, 14, 17}: "BDT Büro und Datentechnik GmbH & Co.KG", + [3]byte{0, 14, 18}: "Adaptive Micro Systems Inc.", + [3]byte{0, 14, 19}: "Accu-Sort Systems inc.", + [3]byte{0, 14, 20}: "Visionary Solutions, Inc.", + [3]byte{0, 14, 21}: "Tadlys LTD", + [3]byte{0, 14, 22}: "SouthWing S.L.", + [3]byte{0, 14, 23}: "Private", + [3]byte{0, 14, 24}: "MyA Technology", + [3]byte{0, 14, 25}: "LogicaCMG Pty Ltd", + [3]byte{0, 14, 26}: "JPS Communications", + [3]byte{0, 14, 27}: "IAV GmbH", + [3]byte{0, 14, 28}: "Hach Company", + [3]byte{0, 14, 29}: "ARION Technology Inc.", + [3]byte{0, 14, 30}: "QLogic Corporation", + [3]byte{0, 14, 31}: "TCL Networks Equipment Co., Ltd.", + [3]byte{0, 14, 32}: "ACCESS Systems Americas, Inc.", + [3]byte{0, 14, 33}: "MTU Friedrichshafen GmbH", + [3]byte{0, 14, 34}: "Private", + [3]byte{0, 14, 35}: "Incipient, Inc.", + [3]byte{0, 14, 36}: "Huwell Technology Inc.", + [3]byte{0, 14, 37}: "Hannae Technology Co., Ltd", + [3]byte{0, 14, 38}: "Gincom Technology Corp.", + [3]byte{0, 14, 39}: "Crere Networks, Inc.", + [3]byte{0, 14, 40}: "Dynamic Ratings P/L", + [3]byte{0, 14, 41}: "Shester Communications Inc", + [3]byte{0, 14, 42}: "Private", + [3]byte{0, 14, 43}: "Safari Technologies", + [3]byte{0, 14, 44}: "Netcodec co.", + [3]byte{0, 14, 45}: "Hyundai Digital Technology Co.,Ltd.", + [3]byte{0, 14, 46}: "Edimax Technology Co. Ltd.", + [3]byte{0, 14, 47}: "Roche Diagnostics GmbH", + [3]byte{0, 14, 48}: "AERAS Networks, Inc.", + [3]byte{0, 14, 49}: "Olympus Soft Imaging Solutions GmbH", + [3]byte{0, 14, 50}: "Kontron Medical", + [3]byte{0, 14, 51}: "Shuko Electronics Co.,Ltd", + [3]byte{0, 14, 52}: "NexGen City, LP", + [3]byte{0, 14, 53}: "Intel Corporation", + [3]byte{0, 14, 54}: "HEINESYS, Inc.", + [3]byte{0, 14, 55}: "Harms & Wende GmbH & Co.KG", + [3]byte{0, 14, 56}: "Cisco Systems, Inc", + [3]byte{0, 14, 57}: "Cisco Systems, Inc", + [3]byte{0, 14, 58}: "Cirrus Logic", + [3]byte{0, 14, 59}: "Hawking Technologies, Inc.", + [3]byte{0, 14, 60}: "Transact Technologies Inc", + [3]byte{0, 14, 61}: "Televic N.V.", + [3]byte{0, 14, 62}: "Sun Optronics Inc", + [3]byte{0, 14, 63}: "Soronti, Inc.", + [3]byte{0, 14, 64}: "Nortel Networks", + [3]byte{0, 14, 65}: "NIHON MECHATRONICS CO.,LTD.", + [3]byte{0, 14, 66}: "Motic Incoporation Ltd.", + [3]byte{0, 14, 67}: "G-Tek Electronics Sdn. Bhd.", + [3]byte{0, 14, 68}: "Digital 5, Inc.", + [3]byte{0, 14, 69}: "Beijing Newtry Electronic Technology Ltd", + [3]byte{0, 14, 70}: "Niigata Seimitsu Co.,Ltd.", + [3]byte{0, 14, 71}: "NCI System Co.,Ltd.", + [3]byte{0, 14, 72}: "Lipman TransAction Solutions", + [3]byte{0, 14, 73}: "Forsway Scandinavia AB", + [3]byte{0, 14, 74}: "Changchun Huayu WEBPAD Co.,LTD", + [3]byte{0, 14, 75}: "atrium c and i", + [3]byte{0, 14, 76}: "Bermai Inc.", + [3]byte{0, 14, 77}: "Numesa Inc.", + [3]byte{0, 14, 78}: "Waveplus Technology Co., Ltd.", + [3]byte{0, 14, 79}: "Trajet GmbH", + [3]byte{0, 14, 80}: "Thomson Telecom Belgium", + [3]byte{0, 14, 81}: "tecna elettronica srl", + [3]byte{0, 14, 82}: "Optium Corporation", + [3]byte{0, 14, 83}: "AV TECH CORPORATION", + [3]byte{0, 14, 84}: "AlphaCell Wireless Ltd.", + [3]byte{0, 14, 85}: "AUVITRAN", + [3]byte{0, 14, 86}: "4G Systems GmbH & Co. KG", + [3]byte{0, 14, 87}: "Iworld Networking, Inc.", + [3]byte{0, 14, 88}: "Sonos, Inc.", + [3]byte{0, 14, 89}: "Sagemcom Broadband SAS", + [3]byte{0, 14, 90}: "TELEFIELD inc.", + [3]byte{0, 14, 91}: "ParkerVision - Direct2Data", + [3]byte{0, 14, 92}: "ARRIS Group, Inc.", + [3]byte{0, 14, 93}: "Triple Play Technologies A/S", + [3]byte{0, 14, 94}: "Raisecom Technology", + [3]byte{0, 14, 95}: "activ-net GmbH & Co. KG", + [3]byte{0, 14, 96}: "360SUN Digital Broadband Corporation", + [3]byte{0, 14, 97}: "MICROTROL LIMITED", + [3]byte{0, 14, 98}: "Nortel Networks", + [3]byte{0, 14, 99}: "Lemke Diagnostics GmbH", + [3]byte{0, 14, 100}: "Elphel, Inc", + [3]byte{0, 14, 101}: "TransCore", + [3]byte{0, 14, 102}: "Hitachi Industry & Control Solutions, Ltd.", + [3]byte{0, 14, 103}: "Eltis Microelectronics Ltd.", + [3]byte{0, 14, 104}: "E-TOP Network Technology Inc.", + [3]byte{0, 14, 105}: "China Electric Power Research Institute", + [3]byte{0, 14, 106}: "3Com Ltd", + [3]byte{0, 14, 107}: "Janitza electronics GmbH", + [3]byte{0, 14, 108}: "Device Drivers Limited", + [3]byte{0, 14, 109}: "Murata Manufacturing Co., Ltd.", + [3]byte{0, 14, 110}: "MAT S.A. (Mircrelec Advanced Technology)", + [3]byte{0, 14, 111}: "IRIS Corporation Berhad", + [3]byte{0, 14, 112}: "in2 Networks", + [3]byte{0, 14, 113}: "Gemstar Technology Development Ltd.", + [3]byte{0, 14, 114}: "CTS electronics", + [3]byte{0, 14, 115}: "Tpack A/S", + [3]byte{0, 14, 116}: "Solar Telecom. Tech", + [3]byte{0, 14, 117}: "New York Air Brake Corp.", + [3]byte{0, 14, 118}: "GEMSOC INNOVISION INC.", + [3]byte{0, 14, 119}: "Decru, Inc.", + [3]byte{0, 14, 120}: "Amtelco", + [3]byte{0, 14, 121}: "Ample Communications Inc.", + [3]byte{0, 14, 122}: "GemWon Communications Co., Ltd.", + [3]byte{0, 14, 123}: "Toshiba", + [3]byte{0, 14, 124}: "Televes S.A.", + [3]byte{0, 14, 125}: "Electronics Line 3000 Ltd.", + [3]byte{0, 14, 126}: "ionSign Oy", + [3]byte{0, 14, 127}: "Hewlett Packard", + [3]byte{0, 14, 128}: "Thomson Technology Inc", + [3]byte{0, 14, 129}: "Devicescape Software, Inc.", + [3]byte{0, 14, 130}: "Commtech Wireless", + [3]byte{0, 14, 131}: "Cisco Systems, Inc", + [3]byte{0, 14, 132}: "Cisco Systems, Inc", + [3]byte{0, 14, 133}: "Catalyst Enterprises, Inc.", + [3]byte{0, 14, 134}: "Alcatel North America", + [3]byte{0, 14, 135}: "adp Gauselmann GmbH", + [3]byte{0, 14, 136}: "VIDEOTRON CORP.", + [3]byte{0, 14, 137}: "CLEMATIC", + [3]byte{0, 14, 138}: "Avara Technologies Pty. Ltd.", + [3]byte{0, 14, 139}: "Astarte Technology Co, Ltd.", + [3]byte{0, 14, 140}: "Siemens AG A&D ET", + [3]byte{0, 14, 141}: "Systems in Progress Holding GmbH", + [3]byte{0, 14, 142}: "SparkLAN Communications, Inc.", + [3]byte{0, 14, 143}: "Sercomm Corp.", + [3]byte{0, 14, 144}: "PONICO CORP.", + [3]byte{0, 14, 145}: "Navico Auckland Ltd", + [3]byte{0, 14, 146}: "Open Telecom", + [3]byte{0, 14, 147}: "Milénio 3 Sistemas Electrónicos, Lda.", + [3]byte{0, 14, 148}: "Maas International BV", + [3]byte{0, 14, 149}: "Fujiya Denki Seisakusho Co.,Ltd.", + [3]byte{0, 14, 150}: "Cubic Defense Applications, Inc.", + [3]byte{0, 14, 151}: "Ultracker Technology CO., Inc", + [3]byte{0, 14, 152}: "HME Clear-Com LTD.", + [3]byte{0, 14, 153}: "Spectrum Digital, Inc", + [3]byte{0, 14, 154}: "BOE TECHNOLOGY GROUP CO.,LTD", + [3]byte{0, 14, 155}: "Ambit Microsystems Corporation", + [3]byte{0, 14, 156}: "Benchmark Electronics", + [3]byte{0, 14, 157}: "Tiscali UK Ltd", + [3]byte{0, 14, 158}: "Topfield Co., Ltd", + [3]byte{0, 14, 159}: "TEMIC SDS GmbH", + [3]byte{0, 14, 160}: "NetKlass Technology Inc.", + [3]byte{0, 14, 161}: "Formosa Teletek Corporation", + [3]byte{0, 14, 162}: "McAfee, Inc", + [3]byte{0, 14, 163}: "CNCR-IT CO.,LTD,HangZhou P.R.CHINA", + [3]byte{0, 14, 164}: "Certance Inc.", + [3]byte{0, 14, 165}: "BLIP Systems", + [3]byte{0, 14, 166}: "ASUSTek COMPUTER INC.", + [3]byte{0, 14, 167}: "Endace Technology", + [3]byte{0, 14, 168}: "United Technologists Europe Limited", + [3]byte{0, 14, 169}: "Shanghai Xun Shi Communications Equipment Ltd. Co.", + [3]byte{0, 14, 170}: "Scalent Systems, Inc.", + [3]byte{0, 14, 171}: "Cray Inc", + [3]byte{0, 14, 172}: "MINTRON ENTERPRISE CO., LTD.", + [3]byte{0, 14, 173}: "Metanoia Technologies, Inc.", + [3]byte{0, 14, 174}: "GAWELL TECHNOLOGIES CORP.", + [3]byte{0, 14, 175}: "CASTEL", + [3]byte{0, 14, 176}: "Solutions Radio BV", + [3]byte{0, 14, 177}: "Newcotech,Ltd", + [3]byte{0, 14, 178}: "Micro-Research Finland Oy", + [3]byte{0, 14, 179}: "Hewlett Packard", + [3]byte{0, 14, 180}: "GUANGZHOU GAOKE COMMUNICATIONS TECHNOLOGY CO.LTD.", + [3]byte{0, 14, 181}: "Ecastle Electronics Co., Ltd.", + [3]byte{0, 14, 182}: "Riverbed Technology, Inc.", + [3]byte{0, 14, 183}: "Knovative, Inc.", + [3]byte{0, 14, 184}: "Iiga co.,Ltd", + [3]byte{0, 14, 185}: "HASHIMOTO Electronics Industry Co.,Ltd.", + [3]byte{0, 14, 186}: "HANMI SEMICONDUCTOR CO., LTD.", + [3]byte{0, 14, 187}: "Everbee Networks", + [3]byte{0, 14, 188}: "Paragon Fidelity GmbH", + [3]byte{0, 14, 189}: "Burdick, a Quinton Compny", + [3]byte{0, 14, 190}: "B&B Electronics Manufacturing Co.", + [3]byte{0, 14, 191}: "Remsdaq Limited", + [3]byte{0, 14, 192}: "Nortel Networks", + [3]byte{0, 14, 193}: "MYNAH Technologies", + [3]byte{0, 14, 194}: "Lowrance Electronics, Inc.", + [3]byte{0, 14, 195}: "Logic Controls, Inc.", + [3]byte{0, 14, 196}: "Iskra Transmission d.d.", + [3]byte{0, 14, 197}: "Digital Multitools Inc", + [3]byte{0, 14, 198}: "ASIX ELECTRONICS CORP.", + [3]byte{0, 14, 199}: "Motorola Korea", + [3]byte{0, 14, 200}: "Zoran Corporation", + [3]byte{0, 14, 201}: "YOKO Technology Corp.", + [3]byte{0, 14, 202}: "WTSS Inc", + [3]byte{0, 14, 203}: "VineSys Technology", + [3]byte{0, 14, 204}: "Tableau, LLC", + [3]byte{0, 14, 205}: "SKOV A/S", + [3]byte{0, 14, 206}: "S.I.T.T.I. S.p.A.", + [3]byte{0, 14, 207}: "PROFIBUS Nutzerorganisation e.V.", + [3]byte{0, 14, 208}: "Privaris, Inc.", + [3]byte{0, 14, 209}: "Osaka Micro Computer.", + [3]byte{0, 14, 210}: "Filtronic plc", + [3]byte{0, 14, 211}: "Epicenter, Inc.", + [3]byte{0, 14, 212}: "CRESITT INDUSTRIE", + [3]byte{0, 14, 213}: "COPAN Systems Inc.", + [3]byte{0, 14, 214}: "Cisco Systems, Inc", + [3]byte{0, 14, 215}: "Cisco Systems, Inc", + [3]byte{0, 14, 216}: "Positron Access Solutions Corp", + [3]byte{0, 14, 217}: "Aksys, Ltd.", + [3]byte{0, 14, 218}: "C-TECH UNITED CORP.", + [3]byte{0, 14, 219}: "XiNCOM Corp.", + [3]byte{0, 14, 220}: "Tellion INC.", + [3]byte{0, 14, 221}: "SHURE INCORPORATED", + [3]byte{0, 14, 222}: "REMEC, Inc.", + [3]byte{0, 14, 223}: "PLX Technology", + [3]byte{0, 14, 224}: "Mcharge", + [3]byte{0, 14, 225}: "ExtremeSpeed Inc.", + [3]byte{0, 14, 226}: "Custom Engineering", + [3]byte{0, 14, 227}: "Chiyu Technology Co.,Ltd", + [3]byte{0, 14, 228}: "BOE TECHNOLOGY GROUP CO.,LTD", + [3]byte{0, 14, 229}: "bitWallet, Inc.", + [3]byte{0, 14, 230}: "Adimos Systems LTD", + [3]byte{0, 14, 231}: "AAC ELECTRONICS CORP.", + [3]byte{0, 14, 232}: "Zioncom Electronics (Shenzhen) Ltd.", + [3]byte{0, 14, 233}: "WayTech Development, Inc.", + [3]byte{0, 14, 234}: "Shadong Luneng Jicheng Electronics,Co.,Ltd", + [3]byte{0, 14, 235}: "Sandmartin(zhong shan)Electronics Co.,Ltd", + [3]byte{0, 14, 236}: "Orban", + [3]byte{0, 14, 237}: "Nokia Danmark A/S", + [3]byte{0, 14, 238}: "Muco Industrie BV", + [3]byte{0, 14, 239}: "Private", + [3]byte{0, 14, 240}: "Festo AG & Co. KG", + [3]byte{0, 14, 241}: "EZQUEST INC.", + [3]byte{0, 14, 242}: "Infinico Corporation", + [3]byte{0, 14, 243}: "Smarthome", + [3]byte{0, 14, 244}: "Kasda Networks Inc", + [3]byte{0, 14, 245}: "iPAC Technology Co., Ltd.", + [3]byte{0, 14, 246}: "E-TEN Information Systems Co., Ltd.", + [3]byte{0, 14, 247}: "Vulcan Portals Inc", + [3]byte{0, 14, 248}: "SBC ASI", + [3]byte{0, 14, 249}: "REA Elektronik GmbH", + [3]byte{0, 14, 250}: "Optoway Technology Incorporation", + [3]byte{0, 14, 251}: "Macey Enterprises", + [3]byte{0, 14, 252}: "JTAG Technologies B.V.", + [3]byte{0, 14, 253}: "FUJINON CORPORATION", + [3]byte{0, 14, 254}: "EndRun Technologies LLC", + [3]byte{0, 14, 255}: "Megasolution,Inc.", + [3]byte{0, 15, 0}: "Legra Systems, Inc.", + [3]byte{0, 15, 1}: "DIGITALKS INC", + [3]byte{0, 15, 2}: "Digicube Technology Co., Ltd", + [3]byte{0, 15, 3}: "COM&C CO., LTD", + [3]byte{0, 15, 4}: "cim-usa inc", + [3]byte{0, 15, 5}: "3B SYSTEM INC.", + [3]byte{0, 15, 6}: "Nortel Networks", + [3]byte{0, 15, 7}: "Mangrove Systems, Inc.", + [3]byte{0, 15, 8}: "Indagon Oy", + [3]byte{0, 15, 9}: "Private", + [3]byte{0, 15, 10}: "Clear Edge Networks", + [3]byte{0, 15, 11}: "Kentima Technologies AB", + [3]byte{0, 15, 12}: "SYNCHRONIC ENGINEERING", + [3]byte{0, 15, 13}: "Hunt Electronic Co., Ltd.", + [3]byte{0, 15, 14}: "WaveSplitter Technologies, Inc.", + [3]byte{0, 15, 15}: "Real ID Technology Co., Ltd.", + [3]byte{0, 15, 16}: "RDM Corporation", + [3]byte{0, 15, 17}: "Prodrive B.V.", + [3]byte{0, 15, 18}: "Panasonic Europe Ltd.", + [3]byte{0, 15, 19}: "Nisca corporation", + [3]byte{0, 15, 20}: "Mindray Co., Ltd.", + [3]byte{0, 15, 21}: "Kjaerulff1 A/S", + [3]byte{0, 15, 22}: "JAY HOW TECHNOLOGY CO.,", + [3]byte{0, 15, 23}: "Insta Elektro GmbH", + [3]byte{0, 15, 24}: "Industrial Control Systems", + [3]byte{0, 15, 25}: "Boston Scientific", + [3]byte{0, 15, 26}: "Gaming Support B.V.", + [3]byte{0, 15, 27}: "Ego Systems Inc.", + [3]byte{0, 15, 28}: "DigitAll World Co., Ltd", + [3]byte{0, 15, 29}: "Cosmo Techs Co., Ltd.", + [3]byte{0, 15, 30}: "Chengdu KT Electric Co.of High & New Technology", + [3]byte{0, 15, 31}: "Dell Inc.", + [3]byte{0, 15, 32}: "Hewlett Packard", + [3]byte{0, 15, 33}: "Scientific Atlanta, Inc", + [3]byte{0, 15, 34}: "Helius, Inc.", + [3]byte{0, 15, 35}: "Cisco Systems, Inc", + [3]byte{0, 15, 36}: "Cisco Systems, Inc", + [3]byte{0, 15, 37}: "AimValley B.V.", + [3]byte{0, 15, 38}: "WorldAccxx LLC", + [3]byte{0, 15, 39}: "TEAL Electronics, Inc.", + [3]byte{0, 15, 40}: "Itronix Corporation", + [3]byte{0, 15, 41}: "Augmentix Corporation", + [3]byte{0, 15, 42}: "Cableware Electronics", + [3]byte{0, 15, 43}: "GREENBELL SYSTEMS", + [3]byte{0, 15, 44}: "Uplogix, Inc.", + [3]byte{0, 15, 45}: "CHUNG-HSIN ELECTRIC & MACHINERY MFG.CORP.", + [3]byte{0, 15, 46}: "Megapower International Corp.", + [3]byte{0, 15, 47}: "W-LINX TECHNOLOGY CO., LTD.", + [3]byte{0, 15, 48}: "Raza Microelectronics Inc", + [3]byte{0, 15, 49}: "Allied Vision Technologies Canada Inc", + [3]byte{0, 15, 50}: "Lootom Telcovideo Network Wuxi Co Ltd", + [3]byte{0, 15, 51}: "DUALi Inc.", + [3]byte{0, 15, 52}: "Cisco Systems, Inc", + [3]byte{0, 15, 53}: "Cisco Systems, Inc", + [3]byte{0, 15, 54}: "Accurate Techhnologies, Inc.", + [3]byte{0, 15, 55}: "Xambala Incorporated", + [3]byte{0, 15, 56}: "Netstar", + [3]byte{0, 15, 57}: "IRIS SENSORS", + [3]byte{0, 15, 58}: "HISHARP", + [3]byte{0, 15, 59}: "Fuji System Machines Co., Ltd.", + [3]byte{0, 15, 60}: "Endeleo Limited", + [3]byte{0, 15, 61}: "D-Link Corporation", + [3]byte{0, 15, 62}: "CardioNet, Inc", + [3]byte{0, 15, 63}: "Big Bear Networks", + [3]byte{0, 15, 64}: "Optical Internetworking Forum", + [3]byte{0, 15, 65}: "Zipher Ltd", + [3]byte{0, 15, 66}: "Xalyo Systems", + [3]byte{0, 15, 67}: "Wasabi Systems Inc.", + [3]byte{0, 15, 68}: "Tivella Inc.", + [3]byte{0, 15, 69}: "Stretch, Inc.", + [3]byte{0, 15, 70}: "SINAR AG", + [3]byte{0, 15, 71}: "ROBOX SPA", + [3]byte{0, 15, 72}: "Polypix Inc.", + [3]byte{0, 15, 73}: "Northover Solutions Limited", + [3]byte{0, 15, 74}: "Kyushu-kyohan co.,ltd", + [3]byte{0, 15, 75}: "Oracle Corporation", + [3]byte{0, 15, 76}: "Elextech INC", + [3]byte{0, 15, 77}: "TalkSwitch", + [3]byte{0, 15, 78}: "Cellink", + [3]byte{0, 15, 79}: "PCS Systemtechnik GmbH", + [3]byte{0, 15, 80}: "StreamScale Limited", + [3]byte{0, 15, 81}: "Azul Systems, Inc.", + [3]byte{0, 15, 82}: "YORK Refrigeration, Marine & Controls", + [3]byte{0, 15, 83}: "Solarflare Communications Inc", + [3]byte{0, 15, 84}: "Entrelogic Corporation", + [3]byte{0, 15, 85}: "Datawire Communication Networks Inc.", + [3]byte{0, 15, 86}: "Continuum Photonics Inc", + [3]byte{0, 15, 87}: "CABLELOGIC Co., Ltd.", + [3]byte{0, 15, 88}: "Adder Technology Limited", + [3]byte{0, 15, 89}: "Phonak AG", + [3]byte{0, 15, 90}: "Peribit Networks", + [3]byte{0, 15, 91}: "Delta Information Systems, Inc.", + [3]byte{0, 15, 92}: "Day One Digital Media Limited", + [3]byte{0, 15, 93}: "Genexis BV", + [3]byte{0, 15, 94}: "Veo", + [3]byte{0, 15, 95}: "Nicety Technologies Inc. (NTS)", + [3]byte{0, 15, 96}: "Lifetron Co.,Ltd", + [3]byte{0, 15, 97}: "Hewlett Packard", + [3]byte{0, 15, 98}: "Alcatel Bell Space N.V.", + [3]byte{0, 15, 99}: "Obzerv Technologies", + [3]byte{0, 15, 100}: "D&R Electronica Weesp BV", + [3]byte{0, 15, 101}: "icube Corp.", + [3]byte{0, 15, 102}: "Cisco-Linksys, LLC", + [3]byte{0, 15, 103}: "West Instruments", + [3]byte{0, 15, 104}: "Vavic Network Technology, Inc.", + [3]byte{0, 15, 105}: "SEW Eurodrive GmbH & Co. KG", + [3]byte{0, 15, 106}: "Nortel Networks", + [3]byte{0, 15, 107}: "GateWare Communications GmbH", + [3]byte{0, 15, 108}: "ADDI-DATA GmbH", + [3]byte{0, 15, 109}: "Midas Engineering", + [3]byte{0, 15, 110}: "BBox", + [3]byte{0, 15, 111}: "FTA Communication Technologies", + [3]byte{0, 15, 112}: "Wintec Industries, inc.", + [3]byte{0, 15, 113}: "Sanmei Electronics Co.,Ltd", + [3]byte{0, 15, 114}: "Sandburst", + [3]byte{0, 15, 115}: "RS Automation Co., Ltd", + [3]byte{0, 15, 116}: "Qamcom Technology AB", + [3]byte{0, 15, 117}: "First Silicon Solutions", + [3]byte{0, 15, 118}: "Digital Keystone, Inc.", + [3]byte{0, 15, 119}: "DENTUM CO.,LTD", + [3]byte{0, 15, 120}: "Datacap Systems Inc", + [3]byte{0, 15, 121}: "Bluetooth Interest Group Inc.", + [3]byte{0, 15, 122}: "BeiJing NuQX Technology CO.,LTD", + [3]byte{0, 15, 123}: "Arce Sistemas, S.A.", + [3]byte{0, 15, 124}: "ACTi Corporation", + [3]byte{0, 15, 125}: "Xirrus", + [3]byte{0, 15, 126}: "Ablerex Electronics Co., LTD", + [3]byte{0, 15, 127}: "UBSTORAGE Co.,Ltd.", + [3]byte{0, 15, 128}: "Trinity Security Systems,Inc.", + [3]byte{0, 15, 129}: "PAL Pacific Inc.", + [3]byte{0, 15, 130}: "Mortara Instrument, Inc.", + [3]byte{0, 15, 131}: "Brainium Technologies Inc.", + [3]byte{0, 15, 132}: "Astute Networks, Inc.", + [3]byte{0, 15, 133}: "ADDO-Japan Corporation", + [3]byte{0, 15, 134}: "BlackBerry RTS", + [3]byte{0, 15, 135}: "Maxcess International", + [3]byte{0, 15, 136}: "AMETEK, Inc.", + [3]byte{0, 15, 137}: "Winnertec System Co., Ltd.", + [3]byte{0, 15, 138}: "WideView", + [3]byte{0, 15, 139}: "Orion MultiSystems Inc", + [3]byte{0, 15, 140}: "Gigawavetech Pte Ltd", + [3]byte{0, 15, 141}: "FAST TV-Server AG", + [3]byte{0, 15, 142}: "DONGYANG TELECOM CO.,LTD.", + [3]byte{0, 15, 143}: "Cisco Systems, Inc", + [3]byte{0, 15, 144}: "Cisco Systems, Inc", + [3]byte{0, 15, 145}: "Aerotelecom Co.,Ltd.", + [3]byte{0, 15, 146}: "Microhard Systems Inc.", + [3]byte{0, 15, 147}: "Landis+Gyr Ltd.", + [3]byte{0, 15, 148}: "Genexis BV", + [3]byte{0, 15, 149}: "ELECOM Co.,LTD Laneed Division", + [3]byte{0, 15, 150}: "Telco Systems, Inc.", + [3]byte{0, 15, 151}: "Avanex Corporation", + [3]byte{0, 15, 152}: "Avamax Co. Ltd.", + [3]byte{0, 15, 153}: "APAC opto Electronics Inc.", + [3]byte{0, 15, 154}: "Synchrony, Inc.", + [3]byte{0, 15, 155}: "Ross Video Limited", + [3]byte{0, 15, 156}: "Panduit Corp", + [3]byte{0, 15, 157}: "DisplayLink (UK) Ltd", + [3]byte{0, 15, 158}: "Murrelektronik GmbH", + [3]byte{0, 15, 159}: "ARRIS Group, Inc.", + [3]byte{0, 15, 160}: "CANON KOREA BUSINESS SOLUTIONS INC.", + [3]byte{0, 15, 161}: "Gigabit Systems Inc.", + [3]byte{0, 15, 162}: "2xWireless", + [3]byte{0, 15, 163}: "Alpha Networks Inc.", + [3]byte{0, 15, 164}: "Sprecher Automation GmbH", + [3]byte{0, 15, 165}: "BWA Technology GmbH", + [3]byte{0, 15, 166}: "S2 Security Corporation", + [3]byte{0, 15, 167}: "Raptor Networks Technology", + [3]byte{0, 15, 168}: "Photometrics, Inc.", + [3]byte{0, 15, 169}: "PC Fabrik", + [3]byte{0, 15, 170}: "Nexus Technologies", + [3]byte{0, 15, 171}: "Kyushu Electronics Systems Inc.", + [3]byte{0, 15, 172}: "IEEE 802.11", + [3]byte{0, 15, 173}: "FMN communications GmbH", + [3]byte{0, 15, 174}: "E2O Communications", + [3]byte{0, 15, 175}: "Dialog Inc.", + [3]byte{0, 15, 176}: "COMPAL ELECTRONICS, INC.", + [3]byte{0, 15, 177}: "Cognio Inc.", + [3]byte{0, 15, 178}: "Broadband Pacenet (India) Pvt. Ltd.", + [3]byte{0, 15, 179}: "Actiontec Electronics, Inc", + [3]byte{0, 15, 180}: "Timespace Technology", + [3]byte{0, 15, 181}: "NETGEAR", + [3]byte{0, 15, 182}: "Europlex Technologies", + [3]byte{0, 15, 183}: "Cavium", + [3]byte{0, 15, 184}: "CallURL Inc.", + [3]byte{0, 15, 185}: "Adaptive Instruments", + [3]byte{0, 15, 186}: "Tevebox AB", + [3]byte{0, 15, 187}: "Nokia Siemens Networks GmbH & Co. KG.", + [3]byte{0, 15, 188}: "Onkey Technologies, Inc.", + [3]byte{0, 15, 189}: "MRV Communications (Networks) LTD", + [3]byte{0, 15, 190}: "e-w/you Inc.", + [3]byte{0, 15, 191}: "DGT Sp. z o.o.", + [3]byte{0, 15, 192}: "DELCOMp", + [3]byte{0, 15, 193}: "WAVE Corporation", + [3]byte{0, 15, 194}: "Uniwell Corporation", + [3]byte{0, 15, 195}: "PalmPalm Technology, Inc.", + [3]byte{0, 15, 196}: "NST co.,LTD.", + [3]byte{0, 15, 197}: "KeyMed Ltd", + [3]byte{0, 15, 198}: "Eurocom Industries A/S", + [3]byte{0, 15, 199}: "Dionica R&D Ltd.", + [3]byte{0, 15, 200}: "Chantry Networks", + [3]byte{0, 15, 201}: "Allnet GmbH", + [3]byte{0, 15, 202}: "A-JIN TECHLINE CO, LTD", + [3]byte{0, 15, 203}: "3Com Ltd", + [3]byte{0, 15, 204}: "ARRIS Group, Inc.", + [3]byte{0, 15, 205}: "Nortel Networks", + [3]byte{0, 15, 206}: "Kikusui Electronics Corp.", + [3]byte{0, 15, 207}: "DataWind Research", + [3]byte{0, 15, 208}: "ASTRI", + [3]byte{0, 15, 209}: "Applied Wireless Identifications Group, Inc.", + [3]byte{0, 15, 210}: "EWA Technologies, Inc.", + [3]byte{0, 15, 211}: "Digium", + [3]byte{0, 15, 212}: "Soundcraft", + [3]byte{0, 15, 213}: "Schwechat - RISE", + [3]byte{0, 15, 214}: "Sarotech Co., Ltd", + [3]byte{0, 15, 215}: "Harman Music Group", + [3]byte{0, 15, 216}: "Force, Inc.", + [3]byte{0, 15, 217}: "FlexDSL Telecommunications AG", + [3]byte{0, 15, 218}: "YAZAKI CORPORATION", + [3]byte{0, 15, 219}: "Westell Technologies Inc.", + [3]byte{0, 15, 220}: "Ueda Japan Radio Co., Ltd.", + [3]byte{0, 15, 221}: "SORDIN AB", + [3]byte{0, 15, 222}: "Sony Mobile Communications AB", + [3]byte{0, 15, 223}: "SOLOMON Technology Corp.", + [3]byte{0, 15, 224}: "NComputing Co.,Ltd.", + [3]byte{0, 15, 225}: "ID DIGITAL CORPORATION", + [3]byte{0, 15, 226}: "Hangzhou H3C Technologies Co., Limited", + [3]byte{0, 15, 227}: "Damm Cellular Systems A/S", + [3]byte{0, 15, 228}: "Pantech Co.,Ltd", + [3]byte{0, 15, 229}: "MERCURY SECURITY CORPORATION", + [3]byte{0, 15, 230}: "MBTech Systems, Inc.", + [3]byte{0, 15, 231}: "Lutron Electronics Co., Inc.", + [3]byte{0, 15, 232}: "Lobos, Inc.", + [3]byte{0, 15, 233}: "GW TECHNOLOGIES CO.,LTD.", + [3]byte{0, 15, 234}: "Giga-Byte Technology Co.,LTD.", + [3]byte{0, 15, 235}: "Cylon Controls", + [3]byte{0, 15, 236}: "ARKUS Inc.", + [3]byte{0, 15, 237}: "Anam Electronics Co., Ltd", + [3]byte{0, 15, 238}: "XTec, Incorporated", + [3]byte{0, 15, 239}: "Thales e-Transactions GmbH", + [3]byte{0, 15, 240}: "Sunray Co. Ltd.", + [3]byte{0, 15, 241}: "nex-G Systems Pte.Ltd", + [3]byte{0, 15, 242}: "Loud Technologies Inc.", + [3]byte{0, 15, 243}: "Jung Myoung Communications&Technology", + [3]byte{0, 15, 244}: "Guntermann & Drunck GmbH", + [3]byte{0, 15, 245}: "GN&S company", + [3]byte{0, 15, 246}: "DARFON LIGHTING CORP", + [3]byte{0, 15, 247}: "Cisco Systems, Inc", + [3]byte{0, 15, 248}: "Cisco Systems, Inc", + [3]byte{0, 15, 249}: "Valcretec, Inc.", + [3]byte{0, 15, 250}: "Optinel Systems, Inc.", + [3]byte{0, 15, 251}: "Nippon Denso Industry Co., Ltd.", + [3]byte{0, 15, 252}: "Merit Li-Lin Ent.", + [3]byte{0, 15, 253}: "Glorytek Network Inc.", + [3]byte{0, 15, 254}: "G-PRO COMPUTER", + [3]byte{0, 15, 255}: "Control4", + [3]byte{0, 16, 0}: "CABLE TELEVISION LABORATORIES, INC.", + [3]byte{0, 16, 1}: "Citel", + [3]byte{0, 16, 2}: "ACTIA", + [3]byte{0, 16, 3}: "IMATRON, INC.", + [3]byte{0, 16, 4}: "THE BRANTLEY COILE COMPANY,INC", + [3]byte{0, 16, 5}: "UEC COMMERCIAL", + [3]byte{0, 16, 6}: "Thales Contact Solutions Ltd.", + [3]byte{0, 16, 7}: "Cisco Systems, Inc", + [3]byte{0, 16, 8}: "VIENNA SYSTEMS CORPORATION", + [3]byte{0, 16, 9}: "HORANET", + [3]byte{0, 16, 10}: "WILLIAMS COMMUNICATIONS GROUP", + [3]byte{0, 16, 11}: "Cisco Systems, Inc", + [3]byte{0, 16, 12}: "ITO CO., LTD.", + [3]byte{0, 16, 13}: "Cisco Systems, Inc", + [3]byte{0, 16, 14}: "MICRO LINEAR COPORATION", + [3]byte{0, 16, 15}: "INDUSTRIAL CPU SYSTEMS", + [3]byte{0, 16, 16}: "INITIO CORPORATION", + [3]byte{0, 16, 17}: "Cisco Systems, Inc", + [3]byte{0, 16, 18}: "PROCESSOR SYSTEMS (I) PVT LTD", + [3]byte{0, 16, 19}: "Kontron America, Inc.", + [3]byte{0, 16, 20}: "Cisco Systems, Inc", + [3]byte{0, 16, 21}: "OOmon Inc.", + [3]byte{0, 16, 22}: "T.SQWARE", + [3]byte{0, 16, 23}: "Bosch Access Systems GmbH", + [3]byte{0, 16, 24}: "Broadcom", + [3]byte{0, 16, 25}: "SIRONA DENTAL SYSTEMS GmbH & Co. KG", + [3]byte{0, 16, 26}: "PictureTel Corp.", + [3]byte{0, 16, 27}: "CORNET TECHNOLOGY, INC.", + [3]byte{0, 16, 28}: "OHM TECHNOLOGIES INTL, LLC", + [3]byte{0, 16, 29}: "WINBOND ELECTRONICS CORP.", + [3]byte{0, 16, 30}: "MATSUSHITA ELECTRONIC INSTRUMENTS CORP.", + [3]byte{0, 16, 31}: "Cisco Systems, Inc", + [3]byte{0, 16, 32}: "Hand Held Products Inc", + [3]byte{0, 16, 33}: "ENCANTO NETWORKS, INC.", + [3]byte{0, 16, 34}: "SatCom Media Corporation", + [3]byte{0, 16, 35}: "Network Equipment Technologies", + [3]byte{0, 16, 36}: "NAGOYA ELECTRIC WORKS CO., LTD", + [3]byte{0, 16, 37}: "Grayhill, Inc", + [3]byte{0, 16, 38}: "ACCELERATED NETWORKS, INC.", + [3]byte{0, 16, 39}: "L-3 COMMUNICATIONS EAST", + [3]byte{0, 16, 40}: "COMPUTER TECHNICA, INC.", + [3]byte{0, 16, 41}: "Cisco Systems, Inc", + [3]byte{0, 16, 42}: "ZF MICROSYSTEMS, INC.", + [3]byte{0, 16, 43}: "UMAX DATA SYSTEMS, INC.", + [3]byte{0, 16, 44}: "Lasat Networks A/S", + [3]byte{0, 16, 45}: "HITACHI SOFTWARE ENGINEERING", + [3]byte{0, 16, 46}: "NETWORK SYSTEMS & TECHNOLOGIES PVT. LTD.", + [3]byte{0, 16, 47}: "Cisco Systems, Inc", + [3]byte{0, 16, 48}: "EION Inc.", + [3]byte{0, 16, 49}: "OBJECTIVE COMMUNICATIONS, INC.", + [3]byte{0, 16, 50}: "ALTA TECHNOLOGY", + [3]byte{0, 16, 51}: "ACCESSLAN COMMUNICATIONS, INC.", + [3]byte{0, 16, 52}: "GNP Computers", + [3]byte{0, 16, 53}: "Elitegroup Computer Systems Co.,Ltd.", + [3]byte{0, 16, 54}: "INTER-TEL INTEGRATED SYSTEMS", + [3]byte{0, 16, 55}: "CYQ've Technology Co., Ltd.", + [3]byte{0, 16, 56}: "MICRO RESEARCH INSTITUTE, INC.", + [3]byte{0, 16, 57}: "Vectron Systems AG", + [3]byte{0, 16, 58}: "DIAMOND NETWORK TECH", + [3]byte{0, 16, 59}: "HIPPI NETWORKING FORUM", + [3]byte{0, 16, 60}: "IC ENSEMBLE, INC.", + [3]byte{0, 16, 61}: "PHASECOM, LTD.", + [3]byte{0, 16, 62}: "NETSCHOOLS CORPORATION", + [3]byte{0, 16, 63}: "TOLLGRADE COMMUNICATIONS, INC.", + [3]byte{0, 16, 64}: "INTERMEC CORPORATION", + [3]byte{0, 16, 65}: "BRISTOL BABCOCK, INC.", + [3]byte{0, 16, 66}: "Alacritech, Inc.", + [3]byte{0, 16, 67}: "A2 CORPORATION", + [3]byte{0, 16, 68}: "InnoLabs Corporation", + [3]byte{0, 16, 69}: "Nortel Networks", + [3]byte{0, 16, 70}: "ALCORN MCBRIDE INC.", + [3]byte{0, 16, 71}: "ECHO ELETRIC CO. LTD.", + [3]byte{0, 16, 72}: "HTRC AUTOMATION, INC.", + [3]byte{0, 16, 73}: "ShoreTel, Inc", + [3]byte{0, 16, 74}: "The Parvus Corporation", + [3]byte{0, 16, 75}: "3COM CORPORATION", + [3]byte{0, 16, 76}: "Teledyne LeCroy, Inc", + [3]byte{0, 16, 77}: "SURTEC INDUSTRIES, INC.", + [3]byte{0, 16, 78}: "CEOLOGIC", + [3]byte{0, 16, 79}: "Oracle Corporation", + [3]byte{0, 16, 80}: "RION CO., LTD.", + [3]byte{0, 16, 81}: "CMICRO CORPORATION", + [3]byte{0, 16, 82}: "METTLER-TOLEDO (ALBSTADT) GMBH", + [3]byte{0, 16, 83}: "COMPUTER TECHNOLOGY CORP.", + [3]byte{0, 16, 84}: "Cisco Systems, Inc", + [3]byte{0, 16, 85}: "FUJITSU MICROELECTRONICS, INC.", + [3]byte{0, 16, 86}: "SODICK CO., LTD.", + [3]byte{0, 16, 87}: "Rebel.com, Inc.", + [3]byte{0, 16, 88}: "ArrowPoint Communications", + [3]byte{0, 16, 89}: "DIABLO RESEARCH CO. LLC", + [3]byte{0, 16, 90}: "3COM CORPORATION", + [3]byte{0, 16, 91}: "NET INSIGHT AB", + [3]byte{0, 16, 92}: "QUANTUM DESIGNS (H.K.) LTD.", + [3]byte{0, 16, 93}: "Draeger Medical", + [3]byte{0, 16, 94}: "Spirent plc, Service Assurance Broadband", + [3]byte{0, 16, 95}: "ZODIAC DATA SYSTEMS", + [3]byte{0, 16, 96}: "BILLIONTON SYSTEMS, INC.", + [3]byte{0, 16, 97}: "HOSTLINK CORP.", + [3]byte{0, 16, 98}: "NX SERVER, ILNC.", + [3]byte{0, 16, 99}: "STARGUIDE DIGITAL NETWORKS", + [3]byte{0, 16, 100}: "DNPG, LLC", + [3]byte{0, 16, 101}: "RADYNE CORPORATION", + [3]byte{0, 16, 102}: "ADVANCED CONTROL SYSTEMS, INC.", + [3]byte{0, 16, 103}: "Ericsson", + [3]byte{0, 16, 104}: "COMOS TELECOM", + [3]byte{0, 16, 105}: "HELIOSS COMMUNICATIONS, INC.", + [3]byte{0, 16, 106}: "DIGITAL MICROWAVE CORPORATION", + [3]byte{0, 16, 107}: "SONUS NETWORKS, INC.", + [3]byte{0, 16, 108}: "EDNT GmbH", + [3]byte{0, 16, 109}: "Axxcelera Broadband Wireless", + [3]byte{0, 16, 110}: "TADIRAN COM. LTD.", + [3]byte{0, 16, 111}: "TRENTON TECHNOLOGY INC.", + [3]byte{0, 16, 112}: "CARADON TREND LTD.", + [3]byte{0, 16, 113}: "ADVANET INC.", + [3]byte{0, 16, 114}: "GVN TECHNOLOGIES, INC.", + [3]byte{0, 16, 115}: "TECHNOBOX, INC.", + [3]byte{0, 16, 116}: "ATEN INTERNATIONAL CO., LTD.", + [3]byte{0, 16, 117}: "Segate Technology LLC", + [3]byte{0, 16, 118}: "EUREM GmbH", + [3]byte{0, 16, 119}: "SAF DRIVE SYSTEMS, LTD.", + [3]byte{0, 16, 120}: "NUERA COMMUNICATIONS, INC.", + [3]byte{0, 16, 121}: "Cisco Systems, Inc", + [3]byte{0, 16, 122}: "AmbiCom, Inc.", + [3]byte{0, 16, 123}: "Cisco Systems, Inc", + [3]byte{0, 16, 124}: "P-COM, INC.", + [3]byte{0, 16, 125}: "AURORA COMMUNICATIONS, LTD.", + [3]byte{0, 16, 126}: "BACHMANN ELECTRONIC GmbH", + [3]byte{0, 16, 127}: "CRESTRON ELECTRONICS, INC.", + [3]byte{0, 16, 128}: "METAWAVE COMMUNICATIONS", + [3]byte{0, 16, 129}: "DPS, INC.", + [3]byte{0, 16, 130}: "JNA TELECOMMUNICATIONS LIMITED", + [3]byte{0, 16, 131}: "Hewlett Packard", + [3]byte{0, 16, 132}: "K-BOT COMMUNICATIONS", + [3]byte{0, 16, 133}: "POLARIS COMMUNICATIONS, INC.", + [3]byte{0, 16, 134}: "ATTO Technology, Inc.", + [3]byte{0, 16, 135}: "XSTREAMIS PLC", + [3]byte{0, 16, 136}: "AMERICAN NETWORKS INC.", + [3]byte{0, 16, 137}: "WebSonic", + [3]byte{0, 16, 138}: "TeraLogic, Inc.", + [3]byte{0, 16, 139}: "LASERANIMATION SOLLINGER GMBH", + [3]byte{0, 16, 140}: "Fujitsu Services Ltd", + [3]byte{0, 16, 141}: "Johnson Controls, Inc.", + [3]byte{0, 16, 142}: "HUGH SYMONS CONCEPT Technologies Ltd.", + [3]byte{0, 16, 143}: "RAPTOR SYSTEMS", + [3]byte{0, 16, 144}: "CIMETRICS, INC.", + [3]byte{0, 16, 145}: "NO WIRES NEEDED BV", + [3]byte{0, 16, 146}: "NETCORE INC.", + [3]byte{0, 16, 147}: "CMS COMPUTERS, LTD.", + [3]byte{0, 16, 148}: "Performance Analysis Broadband, Spirent plc", + [3]byte{0, 16, 149}: "Thomson Inc.", + [3]byte{0, 16, 150}: "TRACEWELL SYSTEMS, INC.", + [3]byte{0, 16, 151}: "WinNet Metropolitan Communications Systems, Inc.", + [3]byte{0, 16, 152}: "STARNET TECHNOLOGIES, INC.", + [3]byte{0, 16, 153}: "InnoMedia, Inc.", + [3]byte{0, 16, 154}: "NETLINE", + [3]byte{0, 16, 155}: "Emulex Corporation", + [3]byte{0, 16, 156}: "M-SYSTEM CO., LTD.", + [3]byte{0, 16, 157}: "CLARINET SYSTEMS, INC.", + [3]byte{0, 16, 158}: "AWARE, INC.", + [3]byte{0, 16, 159}: "PAVO, INC.", + [3]byte{0, 16, 160}: "INNOVEX TECHNOLOGIES, INC.", + [3]byte{0, 16, 161}: "KENDIN SEMICONDUCTOR, INC.", + [3]byte{0, 16, 162}: "TNS", + [3]byte{0, 16, 163}: "OMNITRONIX, INC.", + [3]byte{0, 16, 164}: "XIRCOM", + [3]byte{0, 16, 165}: "OXFORD INSTRUMENTS", + [3]byte{0, 16, 166}: "Cisco Systems, Inc", + [3]byte{0, 16, 167}: "UNEX TECHNOLOGY CORPORATION", + [3]byte{0, 16, 168}: "RELIANCE COMPUTER CORP.", + [3]byte{0, 16, 169}: "ADHOC TECHNOLOGIES", + [3]byte{0, 16, 170}: "MEDIA4, INC.", + [3]byte{0, 16, 171}: "KOITO ELECTRIC INDUSTRIES, LTD.", + [3]byte{0, 16, 172}: "IMCI TECHNOLOGIES", + [3]byte{0, 16, 173}: "SOFTRONICS USB, INC.", + [3]byte{0, 16, 174}: "SHINKO ELECTRIC INDUSTRIES CO.", + [3]byte{0, 16, 175}: "TAC SYSTEMS, INC.", + [3]byte{0, 16, 176}: "MERIDIAN TECHNOLOGY CORP.", + [3]byte{0, 16, 177}: "FOR-A CO., LTD.", + [3]byte{0, 16, 178}: "COACTIVE AESTHETICS", + [3]byte{0, 16, 179}: "NOKIA MULTIMEDIA TERMINALS", + [3]byte{0, 16, 180}: "ATMOSPHERE NETWORKS", + [3]byte{0, 16, 181}: "Accton Technology Corp", + [3]byte{0, 16, 182}: "ENTRATA COMMUNICATIONS CORP.", + [3]byte{0, 16, 183}: "COYOTE TECHNOLOGIES, LLC", + [3]byte{0, 16, 184}: "ISHIGAKI COMPUTER SYSTEM CO.", + [3]byte{0, 16, 185}: "MAXTOR CORP.", + [3]byte{0, 16, 186}: "MARTINHO-DAVIS SYSTEMS, INC.", + [3]byte{0, 16, 187}: "DATA & INFORMATION TECHNOLOGY", + [3]byte{0, 16, 188}: "Aastra Telecom", + [3]byte{0, 16, 189}: "THE TELECOMMUNICATION TECHNOLOGY COMMITTEE (TTC)", + [3]byte{0, 16, 190}: "MARCH NETWORKS CORPORATION", + [3]byte{0, 16, 191}: "InterAir Wireless", + [3]byte{0, 16, 192}: "ARMA, Inc.", + [3]byte{0, 16, 193}: "OI ELECTRIC CO.,LTD", + [3]byte{0, 16, 194}: "WILLNET, INC.", + [3]byte{0, 16, 195}: "CSI-CONTROL SYSTEMS", + [3]byte{0, 16, 196}: "MEDIA GLOBAL LINKS CO., LTD.", + [3]byte{0, 16, 197}: "PROTOCOL TECHNOLOGIES, INC.", + [3]byte{0, 16, 198}: "Universal Global Scientific Industrial Co., Ltd.", + [3]byte{0, 16, 199}: "DATA TRANSMISSION NETWORK", + [3]byte{0, 16, 200}: "COMMUNICATIONS ELECTRONICS SECURITY GROUP", + [3]byte{0, 16, 201}: "MITSUBISHI ELECTRONICS LOGISTIC SUPPORT CO.", + [3]byte{0, 16, 202}: "Telco Systems, Inc.", + [3]byte{0, 16, 203}: "FACIT K.K.", + [3]byte{0, 16, 204}: "CLP COMPUTER LOGISTIK PLANUNG GmbH", + [3]byte{0, 16, 205}: "INTERFACE CONCEPT", + [3]byte{0, 16, 206}: "VOLAMP, LTD.", + [3]byte{0, 16, 207}: "FIBERLANE COMMUNICATIONS", + [3]byte{0, 16, 208}: "WITCOM, LTD.", + [3]byte{0, 16, 209}: "Top Layer Networks, Inc.", + [3]byte{0, 16, 210}: "NITTO TSUSHINKI CO., LTD", + [3]byte{0, 16, 211}: "GRIPS ELECTRONIC GMBH", + [3]byte{0, 16, 212}: "STORAGE COMPUTER CORPORATION", + [3]byte{0, 16, 213}: "IMASDE CANARIAS, S.A.", + [3]byte{0, 16, 214}: "Exelis", + [3]byte{0, 16, 215}: "ARGOSY RESEARCH INC.", + [3]byte{0, 16, 216}: "CALISTA", + [3]byte{0, 16, 217}: "IBM JAPAN, FUJISAWA MT+D", + [3]byte{0, 16, 218}: "Kollmorgen Corp", + [3]byte{0, 16, 219}: "Juniper Networks", + [3]byte{0, 16, 220}: "MICRO-STAR INTERNATIONAL CO., LTD.", + [3]byte{0, 16, 221}: "ENABLE SEMICONDUCTOR, INC.", + [3]byte{0, 16, 222}: "INTERNATIONAL DATACASTING CORPORATION", + [3]byte{0, 16, 223}: "RISE COMPUTER INC.", + [3]byte{0, 16, 224}: "Oracle Corporation", + [3]byte{0, 16, 225}: "S.I. TECH, INC.", + [3]byte{0, 16, 226}: "ArrayComm, Inc.", + [3]byte{0, 16, 227}: "Hewlett Packard", + [3]byte{0, 16, 228}: "NSI CORPORATION", + [3]byte{0, 16, 229}: "SOLECTRON TEXAS", + [3]byte{0, 16, 230}: "APPLIED INTELLIGENT SYSTEMS, INC.", + [3]byte{0, 16, 231}: "Breezecom, Ltd.", + [3]byte{0, 16, 232}: "TELOCITY, INCORPORATED", + [3]byte{0, 16, 233}: "RAIDTEC LTD.", + [3]byte{0, 16, 234}: "ADEPT TECHNOLOGY", + [3]byte{0, 16, 235}: "SELSIUS SYSTEMS, INC.", + [3]byte{0, 16, 236}: "RPCG, LLC", + [3]byte{0, 16, 237}: "SUNDANCE TECHNOLOGY, INC.", + [3]byte{0, 16, 238}: "CTI PRODUCTS, INC.", + [3]byte{0, 16, 239}: "DBTEL INCORPORATED", + [3]byte{0, 16, 240}: "RITTAL-WERK RUDOLF LOH GmbH & Co.", + [3]byte{0, 16, 241}: "I-O CORPORATION", + [3]byte{0, 16, 242}: "ANTEC", + [3]byte{0, 16, 243}: "Nexcom International Co., Ltd.", + [3]byte{0, 16, 244}: "Vertical Communications", + [3]byte{0, 16, 245}: "AMHERST SYSTEMS, INC.", + [3]byte{0, 16, 246}: "Cisco Systems, Inc", + [3]byte{0, 16, 247}: "IRIICHI TECHNOLOGIES Inc.", + [3]byte{0, 16, 248}: "TEXIO TECHNOLOGY CORPORATION", + [3]byte{0, 16, 249}: "UNIQUE SYSTEMS, INC.", + [3]byte{0, 16, 250}: "Apple, Inc.", + [3]byte{0, 16, 251}: "ZIDA TECHNOLOGIES LIMITED", + [3]byte{0, 16, 252}: "BROADBAND NETWORKS, INC.", + [3]byte{0, 16, 253}: "COCOM A/S", + [3]byte{0, 16, 254}: "DIGITAL EQUIPMENT CORPORATION", + [3]byte{0, 16, 255}: "Cisco Systems, Inc", + [3]byte{0, 17, 0}: "Schneider Electric", + [3]byte{0, 17, 1}: "CET Technologies Pte Ltd", + [3]byte{0, 17, 2}: "Aurora Multimedia Corp.", + [3]byte{0, 17, 3}: "kawamura electric inc.", + [3]byte{0, 17, 4}: "TELEXY", + [3]byte{0, 17, 5}: "Sunplus Technology Co., Ltd.", + [3]byte{0, 17, 6}: "Siemens NV (Belgium)", + [3]byte{0, 17, 7}: "RGB Networks Inc.", + [3]byte{0, 17, 8}: "Orbital Data Corporation", + [3]byte{0, 17, 9}: "Micro-Star International", + [3]byte{0, 17, 10}: "Hewlett Packard", + [3]byte{0, 17, 11}: "Franklin Technology Systems", + [3]byte{0, 17, 12}: "Atmark Techno, Inc.", + [3]byte{0, 17, 13}: "SANBlaze Technology, Inc.", + [3]byte{0, 17, 14}: "Tsurusaki Sealand Transportation Co. Ltd.", + [3]byte{0, 17, 15}: "netplat,Inc.", + [3]byte{0, 17, 16}: "Maxanna Technology Co., Ltd.", + [3]byte{0, 17, 17}: "Intel Corporation", + [3]byte{0, 17, 18}: "Honeywell CMSS", + [3]byte{0, 17, 19}: "Fraunhofer FOKUS", + [3]byte{0, 17, 20}: "EverFocus Electronics Corp.", + [3]byte{0, 17, 21}: "EPIN Technologies, Inc.", + [3]byte{0, 17, 22}: "COTEAU VERT CO., LTD.", + [3]byte{0, 17, 23}: "CESNET", + [3]byte{0, 17, 24}: "BLX IC Design Corp., Ltd.", + [3]byte{0, 17, 25}: "Solteras, Inc.", + [3]byte{0, 17, 26}: "ARRIS Group, Inc.", + [3]byte{0, 17, 27}: "Targa Systems Div L-3 Communications", + [3]byte{0, 17, 28}: "Pleora Technologies Inc.", + [3]byte{0, 17, 29}: "Hectrix Limited", + [3]byte{0, 17, 30}: "EPSG (Ethernet Powerlink Standardization Group)", + [3]byte{0, 17, 31}: "Doremi Labs, Inc.", + [3]byte{0, 17, 32}: "Cisco Systems, Inc", + [3]byte{0, 17, 33}: "Cisco Systems, Inc", + [3]byte{0, 17, 34}: "CIMSYS Inc", + [3]byte{0, 17, 35}: "Appointech, Inc.", + [3]byte{0, 17, 36}: "Apple, Inc.", + [3]byte{0, 17, 37}: "IBM Corp", + [3]byte{0, 17, 38}: "Venstar Inc.", + [3]byte{0, 17, 39}: "TASI, Inc", + [3]byte{0, 17, 40}: "Streamit", + [3]byte{0, 17, 41}: "Paradise Datacom Ltd.", + [3]byte{0, 17, 42}: "Niko NV", + [3]byte{0, 17, 43}: "NetModule AG", + [3]byte{0, 17, 44}: "IZT GmbH", + [3]byte{0, 17, 45}: "iPulse Systems", + [3]byte{0, 17, 46}: "CEICOM", + [3]byte{0, 17, 47}: "ASUSTek COMPUTER INC.", + [3]byte{0, 17, 48}: "Allied Telesis (Hong Kong) Ltd.", + [3]byte{0, 17, 49}: "UNATECH. CO.,LTD", + [3]byte{0, 17, 50}: "Synology Incorporated", + [3]byte{0, 17, 51}: "Siemens Austria SIMEA", + [3]byte{0, 17, 52}: "MediaCell, Inc.", + [3]byte{0, 17, 53}: "Grandeye Ltd", + [3]byte{0, 17, 54}: "Goodrich Sensor Systems", + [3]byte{0, 17, 55}: "AICHI ELECTRIC CO., LTD.", + [3]byte{0, 17, 56}: "TAISHIN CO., LTD.", + [3]byte{0, 17, 57}: "STOEBER ANTRIEBSTECHNIK GmbH + Co. KG.", + [3]byte{0, 17, 58}: "SHINBORAM", + [3]byte{0, 17, 59}: "Micronet Communications Inc.", + [3]byte{0, 17, 60}: "Micronas GmbH", + [3]byte{0, 17, 61}: "KN SOLTEC CO.,LTD.", + [3]byte{0, 17, 62}: "JL Corporation", + [3]byte{0, 17, 63}: "Alcatel DI", + [3]byte{0, 17, 64}: "Nanometrics Inc.", + [3]byte{0, 17, 65}: "GoodMan Corporation", + [3]byte{0, 17, 66}: "e-SMARTCOM INC.", + [3]byte{0, 17, 67}: "Dell Inc.", + [3]byte{0, 17, 68}: "Assurance Technology Corp", + [3]byte{0, 17, 69}: "ValuePoint Networks", + [3]byte{0, 17, 70}: "Telecard-Pribor Ltd", + [3]byte{0, 17, 71}: "Secom-Industry co.LTD.", + [3]byte{0, 17, 72}: "Prolon Control Systems", + [3]byte{0, 17, 73}: "Proliphix Inc.", + [3]byte{0, 17, 74}: "KAYABA INDUSTRY Co,.Ltd.", + [3]byte{0, 17, 75}: "Francotyp-Postalia GmbH", + [3]byte{0, 17, 76}: "caffeina applied research ltd.", + [3]byte{0, 17, 77}: "Atsumi Electric Co.,LTD.", + [3]byte{0, 17, 78}: "690885 Ontario Inc.", + [3]byte{0, 17, 79}: "US Digital Television, Inc", + [3]byte{0, 17, 80}: "Belkin Corporation", + [3]byte{0, 17, 81}: "Mykotronx", + [3]byte{0, 17, 82}: "Eidsvoll Electronics AS", + [3]byte{0, 17, 83}: "Trident Tek, Inc.", + [3]byte{0, 17, 84}: "Webpro Technologies Inc.", + [3]byte{0, 17, 85}: "Sevis Systems", + [3]byte{0, 17, 86}: "Pharos Systems NZ", + [3]byte{0, 17, 87}: "Oki Electric Industry Co., Ltd.", + [3]byte{0, 17, 88}: "Nortel Networks", + [3]byte{0, 17, 89}: "MATISSE NETWORKS INC", + [3]byte{0, 17, 90}: "Ivoclar Vivadent AG", + [3]byte{0, 17, 91}: "Elitegroup Computer Systems Co.,Ltd.", + [3]byte{0, 17, 92}: "Cisco Systems, Inc", + [3]byte{0, 17, 93}: "Cisco Systems, Inc", + [3]byte{0, 17, 94}: "ProMinent Dosiertechnik GmbH", + [3]byte{0, 17, 95}: "ITX Security Co., Ltd.", + [3]byte{0, 17, 96}: "ARTDIO Company Co., LTD", + [3]byte{0, 17, 97}: "NetStreams, LLC", + [3]byte{0, 17, 98}: "STAR MICRONICS CO.,LTD.", + [3]byte{0, 17, 99}: "SYSTEM SPA DEPT. ELECTRONICS", + [3]byte{0, 17, 100}: "ACARD Technology Corp.", + [3]byte{0, 17, 101}: "ZNYX Networks, Inc.", + [3]byte{0, 17, 102}: "Taelim Electronics Co., Ltd.", + [3]byte{0, 17, 103}: "Integrated System Solution Corp.", + [3]byte{0, 17, 104}: "HomeLogic LLC", + [3]byte{0, 17, 105}: "EMS Satcom", + [3]byte{0, 17, 106}: "Domo Ltd", + [3]byte{0, 17, 107}: "Digital Data Communications Asia Co.,Ltd", + [3]byte{0, 17, 108}: "Nanwang Multimedia Inc.,Ltd", + [3]byte{0, 17, 109}: "American Time and Signal", + [3]byte{0, 17, 110}: "Peplink International Ltd.", + [3]byte{0, 17, 111}: "Netforyou Co., LTD.", + [3]byte{0, 17, 112}: "GSC SRL", + [3]byte{0, 17, 113}: "DEXTER Communications, Inc.", + [3]byte{0, 17, 114}: "COTRON CORPORATION", + [3]byte{0, 17, 115}: "SMART Storage Systems", + [3]byte{0, 17, 116}: "Mojo Networks, Inc.", + [3]byte{0, 17, 117}: "Intel Corporation", + [3]byte{0, 17, 118}: "Intellambda Systems, Inc.", + [3]byte{0, 17, 119}: "Coaxial Networks, Inc.", + [3]byte{0, 17, 120}: "Chiron Technology Ltd", + [3]byte{0, 17, 121}: "Singular Technology Co. Ltd.", + [3]byte{0, 17, 122}: "Singim International Corp.", + [3]byte{0, 17, 123}: "Büchi Labortechnik AG", + [3]byte{0, 17, 124}: "e-zy.net", + [3]byte{0, 17, 125}: "ZMD America, Inc.", + [3]byte{0, 17, 126}: "Midmark Corp", + [3]byte{0, 17, 127}: "Neotune Information Technology Corporation,.LTD", + [3]byte{0, 17, 128}: "ARRIS Group, Inc.", + [3]byte{0, 17, 129}: "InterEnergy Co.Ltd,", + [3]byte{0, 17, 130}: "IMI Norgren Ltd", + [3]byte{0, 17, 131}: "Datalogic ADC, Inc.", + [3]byte{0, 17, 132}: "Humo Laboratory,Ltd.", + [3]byte{0, 17, 133}: "Hewlett Packard", + [3]byte{0, 17, 134}: "Prime Systems, Inc.", + [3]byte{0, 17, 135}: "Category Solutions, Inc", + [3]byte{0, 17, 136}: "Enterasys", + [3]byte{0, 17, 137}: "Aerotech Inc", + [3]byte{0, 17, 138}: "Viewtran Technology Limited", + [3]byte{0, 17, 139}: "Alcatel-Lucent Enterprise", + [3]byte{0, 17, 140}: "Missouri Department of Transportation", + [3]byte{0, 17, 141}: "Hanchang System Corp.", + [3]byte{0, 17, 142}: "Halytech Mace", + [3]byte{0, 17, 143}: "EUTECH INSTRUMENTS PTE. LTD.", + [3]byte{0, 17, 144}: "Digital Design Corporation", + [3]byte{0, 17, 145}: "CTS-Clima Temperatur Systeme GmbH", + [3]byte{0, 17, 146}: "Cisco Systems, Inc", + [3]byte{0, 17, 147}: "Cisco Systems, Inc", + [3]byte{0, 17, 148}: "Chi Mei Communication Systems, Inc.", + [3]byte{0, 17, 149}: "D-Link Corporation", + [3]byte{0, 17, 150}: "Actuality Systems, Inc.", + [3]byte{0, 17, 151}: "Monitoring Technologies Limited", + [3]byte{0, 17, 152}: "Prism Media Products Limited", + [3]byte{0, 17, 153}: "2wcom Systems GmbH", + [3]byte{0, 17, 154}: "Alkeria srl", + [3]byte{0, 17, 155}: "Telesynergy Research Inc.", + [3]byte{0, 17, 156}: "EP&T Energy", + [3]byte{0, 17, 157}: "Diginfo Technology Corporation", + [3]byte{0, 17, 158}: "Solectron Brazil", + [3]byte{0, 17, 159}: "Nokia Danmark A/S", + [3]byte{0, 17, 160}: "Vtech Engineering Canada Ltd", + [3]byte{0, 17, 161}: "VISION NETWARE CO.,LTD", + [3]byte{0, 17, 162}: "Manufacturing Technology Inc", + [3]byte{0, 17, 163}: "LanReady Technologies Inc.", + [3]byte{0, 17, 164}: "JStream Technologies Inc.", + [3]byte{0, 17, 165}: "Fortuna Electronic Corp.", + [3]byte{0, 17, 166}: "Sypixx Networks", + [3]byte{0, 17, 167}: "Infilco Degremont Inc.", + [3]byte{0, 17, 168}: "Quest Technologies", + [3]byte{0, 17, 169}: "MOIMSTONE Co., LTD", + [3]byte{0, 17, 170}: "Uniclass Technology, Co., LTD", + [3]byte{0, 17, 171}: "TRUSTABLE TECHNOLOGY CO.,LTD.", + [3]byte{0, 17, 172}: "Simtec Electronics", + [3]byte{0, 17, 173}: "Shanghai Ruijie Technology", + [3]byte{0, 17, 174}: "ARRIS Group, Inc.", + [3]byte{0, 17, 175}: "Medialink-i,Inc", + [3]byte{0, 17, 176}: "Fortelink Inc.", + [3]byte{0, 17, 177}: "BlueExpert Technology Corp.", + [3]byte{0, 17, 178}: "2001 Technology Inc.", + [3]byte{0, 17, 179}: "YOSHIMIYA CO.,LTD.", + [3]byte{0, 17, 180}: "Westermo Teleindustri AB", + [3]byte{0, 17, 181}: "Shenzhen Powercom Co.,Ltd", + [3]byte{0, 17, 182}: "Open Systems International", + [3]byte{0, 17, 183}: "Octalix B.V.", + [3]byte{0, 17, 184}: "Liebherr - Elektronik GmbH", + [3]byte{0, 17, 185}: "Inner Range Pty. Ltd.", + [3]byte{0, 17, 186}: "Elexol Pty Ltd", + [3]byte{0, 17, 187}: "Cisco Systems, Inc", + [3]byte{0, 17, 188}: "Cisco Systems, Inc", + [3]byte{0, 17, 189}: "Bombardier Transportation", + [3]byte{0, 17, 190}: "AGP Telecom Co. Ltd", + [3]byte{0, 17, 191}: "AESYS S.p.A.", + [3]byte{0, 17, 192}: "Aday Technology Inc", + [3]byte{0, 17, 193}: "4P MOBILE DATA PROCESSING", + [3]byte{0, 17, 194}: "United Fiber Optic Communication", + [3]byte{0, 17, 195}: "Transceiving System Technology Corporation", + [3]byte{0, 17, 196}: "Terminales de Telecomunicacion Terrestre, S.L.", + [3]byte{0, 17, 197}: "TEN Technology", + [3]byte{0, 17, 198}: "Seagate Technology", + [3]byte{0, 17, 199}: "Raymarine UK Ltd", + [3]byte{0, 17, 200}: "Powercom Co., Ltd.", + [3]byte{0, 17, 201}: "MTT Corporation", + [3]byte{0, 17, 202}: "Long Range Systems, Inc.", + [3]byte{0, 17, 203}: "Jacobsons AB", + [3]byte{0, 17, 204}: "Guangzhou Jinpeng Group Co.,Ltd.", + [3]byte{0, 17, 205}: "Axsun Technologies", + [3]byte{0, 17, 206}: "Ubisense Limited", + [3]byte{0, 17, 207}: "Thrane & Thrane A/S", + [3]byte{0, 17, 208}: "Tandberg Data ASA", + [3]byte{0, 17, 209}: "Soft Imaging System GmbH", + [3]byte{0, 17, 210}: "Perception Digital Ltd", + [3]byte{0, 17, 211}: "NextGenTel Holding ASA", + [3]byte{0, 17, 212}: "NetEnrich, Inc", + [3]byte{0, 17, 213}: "Hangzhou Sunyard System Engineering Co.,Ltd.", + [3]byte{0, 17, 214}: "HandEra, Inc.", + [3]byte{0, 17, 215}: "eWerks Inc", + [3]byte{0, 17, 216}: "ASUSTek COMPUTER INC.", + [3]byte{0, 17, 217}: "TiVo", + [3]byte{0, 17, 218}: "Vivaas Technology Inc.", + [3]byte{0, 17, 219}: "Land-Cellular Corporation", + [3]byte{0, 17, 220}: "Glunz & Jensen", + [3]byte{0, 17, 221}: "FROMUS TEC. Co., Ltd.", + [3]byte{0, 17, 222}: "EURILOGIC", + [3]byte{0, 17, 223}: "Current Energy", + [3]byte{0, 17, 224}: "U-MEDIA Communications, Inc.", + [3]byte{0, 17, 225}: "Arcelik A.S", + [3]byte{0, 17, 226}: "Hua Jung Components Co., Ltd.", + [3]byte{0, 17, 227}: "Thomson, Inc.", + [3]byte{0, 17, 228}: "Danelec Electronics A/S", + [3]byte{0, 17, 229}: "KCodes Corporation", + [3]byte{0, 17, 230}: "Scientific Atlanta", + [3]byte{0, 17, 231}: "WORLDSAT - Texas de France", + [3]byte{0, 17, 232}: "Tixi.Com", + [3]byte{0, 17, 233}: "STARNEX CO., LTD.", + [3]byte{0, 17, 234}: "IWICS Inc.", + [3]byte{0, 17, 235}: "Innovative Integration", + [3]byte{0, 17, 236}: "AVIX INC.", + [3]byte{0, 17, 237}: "802 Global", + [3]byte{0, 17, 238}: "Estari, Inc.", + [3]byte{0, 17, 239}: "Conitec Datensysteme GmbH", + [3]byte{0, 17, 240}: "Wideful Limited", + [3]byte{0, 17, 241}: "QinetiQ Ltd", + [3]byte{0, 17, 242}: "Institute of Network Technologies", + [3]byte{0, 17, 243}: "NeoMedia Europe AG", + [3]byte{0, 17, 244}: "woori-net", + [3]byte{0, 17, 245}: "ASKEY COMPUTER CORP", + [3]byte{0, 17, 246}: "Asia Pacific Microsystems , Inc.", + [3]byte{0, 17, 247}: "Shenzhen Forward Industry Co., Ltd", + [3]byte{0, 17, 248}: "AIRAYA Corp", + [3]byte{0, 17, 249}: "Nortel Networks", + [3]byte{0, 17, 250}: "Rane Corporation", + [3]byte{0, 17, 251}: "Heidelberg Engineering GmbH", + [3]byte{0, 17, 252}: "HARTING Electronics GmbH", + [3]byte{0, 17, 253}: "KORG INC.", + [3]byte{0, 17, 254}: "Keiyo System Research, Inc.", + [3]byte{0, 17, 255}: "Digitro Tecnologia Ltda", + [3]byte{0, 18, 0}: "Cisco Systems, Inc", + [3]byte{0, 18, 1}: "Cisco Systems, Inc", + [3]byte{0, 18, 2}: "Decrane Aerospace - Audio International Inc.", + [3]byte{0, 18, 3}: "ActivNetworks", + [3]byte{0, 18, 4}: "u10 Networks, Inc.", + [3]byte{0, 18, 5}: "Terrasat Communications, Inc.", + [3]byte{0, 18, 6}: "iQuest (NZ) Ltd", + [3]byte{0, 18, 7}: "Head Strong International Limited", + [3]byte{0, 18, 8}: "Gantner Instruments GmbH", + [3]byte{0, 18, 9}: "Fastrax Ltd", + [3]byte{0, 18, 10}: "Emerson Climate Technologies GmbH", + [3]byte{0, 18, 11}: "Chinasys Technologies Limited", + [3]byte{0, 18, 12}: "CE-Infosys Pte Ltd", + [3]byte{0, 18, 13}: "Advanced Telecommunication Technologies, Inc.", + [3]byte{0, 18, 14}: "AboCom", + [3]byte{0, 18, 15}: "IEEE 802.3", + [3]byte{0, 18, 16}: "WideRay Corp", + [3]byte{0, 18, 17}: "Protechna Herbst GmbH & Co. KG", + [3]byte{0, 18, 18}: "PLUS Corporation", + [3]byte{0, 18, 19}: "Metrohm AG", + [3]byte{0, 18, 20}: "Koenig & Bauer AG", + [3]byte{0, 18, 21}: "iStor Networks, Inc.", + [3]byte{0, 18, 22}: "ICP Internet Communication Payment AG", + [3]byte{0, 18, 23}: "Cisco-Linksys, LLC", + [3]byte{0, 18, 24}: "ARUZE Corporation", + [3]byte{0, 18, 25}: "General Datacomm LLC", + [3]byte{0, 18, 26}: "Techno Soft Systemnics Inc.", + [3]byte{0, 18, 27}: "Sound Devices, LLC", + [3]byte{0, 18, 28}: "PARROT SA", + [3]byte{0, 18, 29}: "Netfabric Corporation", + [3]byte{0, 18, 30}: "Juniper Networks", + [3]byte{0, 18, 31}: "Harding Instruments", + [3]byte{0, 18, 32}: "Cadco Systems", + [3]byte{0, 18, 33}: "B.Braun Melsungen AG", + [3]byte{0, 18, 34}: "Skardin (UK) Ltd", + [3]byte{0, 18, 35}: "Pixim", + [3]byte{0, 18, 36}: "NexQL Corporation", + [3]byte{0, 18, 37}: "ARRIS Group, Inc.", + [3]byte{0, 18, 38}: "Japan Direx Corporation", + [3]byte{0, 18, 39}: "Franklin Electric Co., Inc.", + [3]byte{0, 18, 40}: "Data Ltd.", + [3]byte{0, 18, 41}: "BroadEasy Technologies Co.,Ltd", + [3]byte{0, 18, 42}: "VTech Telecommunications Ltd.", + [3]byte{0, 18, 43}: "Virbiage Pty Ltd", + [3]byte{0, 18, 44}: "Soenen Controls N.V.", + [3]byte{0, 18, 45}: "SiNett Corporation", + [3]byte{0, 18, 46}: "Signal Technology - AISD", + [3]byte{0, 18, 47}: "Sanei Electric Inc.", + [3]byte{0, 18, 48}: "Picaso Infocommunication CO., LTD.", + [3]byte{0, 18, 49}: "Motion Control Systems, Inc.", + [3]byte{0, 18, 50}: "LeWiz Communications Inc.", + [3]byte{0, 18, 51}: "JRC TOKKI Co.,Ltd.", + [3]byte{0, 18, 52}: "Camille Bauer", + [3]byte{0, 18, 53}: "Andrew Corporation", + [3]byte{0, 18, 54}: "ConSentry Networks", + [3]byte{0, 18, 55}: "Texas Instruments", + [3]byte{0, 18, 56}: "SetaBox Technology Co., Ltd.", + [3]byte{0, 18, 57}: "S Net Systems Inc.", + [3]byte{0, 18, 58}: "Posystech Inc., Co.", + [3]byte{0, 18, 59}: "KeRo Systems ApS", + [3]byte{0, 18, 60}: "Second Rule LLC", + [3]byte{0, 18, 61}: "GES Co, Ltd", + [3]byte{0, 18, 62}: "ERUNE technology Co., Ltd.", + [3]byte{0, 18, 63}: "Dell Inc.", + [3]byte{0, 18, 64}: "AMOI ELECTRONICS CO.,LTD", + [3]byte{0, 18, 65}: "a2i marketing center", + [3]byte{0, 18, 66}: "Millennial Net", + [3]byte{0, 18, 67}: "Cisco Systems, Inc", + [3]byte{0, 18, 68}: "Cisco Systems, Inc", + [3]byte{0, 18, 69}: "Zellweger Analytics, Inc.", + [3]byte{0, 18, 70}: "T.O.M TECHNOLOGY INC..", + [3]byte{0, 18, 71}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 18, 72}: "Dell EMC", + [3]byte{0, 18, 73}: "Delta Elettronica S.p.A.", + [3]byte{0, 18, 74}: "Dedicated Devices, Inc.", + [3]byte{0, 18, 75}: "Texas Instruments", + [3]byte{0, 18, 76}: "BBWM Corporation", + [3]byte{0, 18, 77}: "Inducon BV", + [3]byte{0, 18, 78}: "XAC AUTOMATION CORP.", + [3]byte{0, 18, 79}: "Pentair Thermal Management", + [3]byte{0, 18, 80}: "Tokyo Aircaft Instrument Co., Ltd.", + [3]byte{0, 18, 81}: "SILINK", + [3]byte{0, 18, 82}: "Citronix, LLC", + [3]byte{0, 18, 83}: "AudioDev AB", + [3]byte{0, 18, 84}: "Spectra Technologies Holdings Company Ltd", + [3]byte{0, 18, 85}: "NetEffect Incorporated", + [3]byte{0, 18, 86}: "LG INFORMATION & COMM.", + [3]byte{0, 18, 87}: "LeapComm Communication Technologies Inc.", + [3]byte{0, 18, 88}: "Activis Polska", + [3]byte{0, 18, 89}: "THERMO ELECTRON KARLSRUHE", + [3]byte{0, 18, 90}: "Microsoft Corporation", + [3]byte{0, 18, 91}: "KAIMEI ELECTRONI", + [3]byte{0, 18, 92}: "Green Hills Software, Inc.", + [3]byte{0, 18, 93}: "CyberNet Inc.", + [3]byte{0, 18, 94}: "CAEN", + [3]byte{0, 18, 95}: "AWIND Inc.", + [3]byte{0, 18, 96}: "Stanton Magnetics,inc.", + [3]byte{0, 18, 97}: "Adaptix, Inc", + [3]byte{0, 18, 98}: "Nokia Danmark A/S", + [3]byte{0, 18, 99}: "Data Voice Technologies GmbH", + [3]byte{0, 18, 100}: "daum electronic gmbh", + [3]byte{0, 18, 101}: "Enerdyne Technologies, Inc.", + [3]byte{0, 18, 102}: "Swisscom Hospitality Services SA", + [3]byte{0, 18, 103}: "Panasonic Corporation", + [3]byte{0, 18, 104}: "IPS d.o.o.", + [3]byte{0, 18, 105}: "Value Electronics", + [3]byte{0, 18, 106}: "OPTOELECTRONICS Co., Ltd.", + [3]byte{0, 18, 107}: "Ascalade Communications Limited", + [3]byte{0, 18, 108}: "Visonic Technologies 1993 Ltd.", + [3]byte{0, 18, 109}: "University of California, Berkeley", + [3]byte{0, 18, 110}: "Seidel Elektronik GmbH Nfg.KG", + [3]byte{0, 18, 111}: "Rayson Technology Co., Ltd.", + [3]byte{0, 18, 112}: "NGES Denro Systems", + [3]byte{0, 18, 113}: "Measurement Computing Corp", + [3]byte{0, 18, 114}: "Redux Communications Ltd.", + [3]byte{0, 18, 115}: "Stoke Inc", + [3]byte{0, 18, 116}: "NIT lab", + [3]byte{0, 18, 117}: "Sentilla Corporation", + [3]byte{0, 18, 118}: "CG Power Systems Ireland Limited", + [3]byte{0, 18, 119}: "Korenix Technologies Co., Ltd.", + [3]byte{0, 18, 120}: "International Bar Code", + [3]byte{0, 18, 121}: "Hewlett Packard", + [3]byte{0, 18, 122}: "Sanyu Industry Co.,Ltd.", + [3]byte{0, 18, 123}: "VIA Networking Technologies, Inc.", + [3]byte{0, 18, 124}: "SWEGON AB", + [3]byte{0, 18, 125}: "MobileAria", + [3]byte{0, 18, 126}: "Digital Lifestyles Group, Inc.", + [3]byte{0, 18, 127}: "Cisco Systems, Inc", + [3]byte{0, 18, 128}: "Cisco Systems, Inc", + [3]byte{0, 18, 129}: "March Networks S.p.A.", + [3]byte{0, 18, 130}: "Qovia", + [3]byte{0, 18, 131}: "Nortel Networks", + [3]byte{0, 18, 132}: "Lab33 Srl", + [3]byte{0, 18, 133}: "Gizmondo Europe Ltd", + [3]byte{0, 18, 134}: "ENDEVCO CORP", + [3]byte{0, 18, 135}: "Digital Everywhere Unterhaltungselektronik GmbH", + [3]byte{0, 18, 136}: "2Wire Inc", + [3]byte{0, 18, 137}: "Advance Sterilization Products", + [3]byte{0, 18, 138}: "ARRIS Group, Inc.", + [3]byte{0, 18, 139}: "Sensory Networks Inc", + [3]byte{0, 18, 140}: "Woodward Governor", + [3]byte{0, 18, 141}: "STB Datenservice GmbH", + [3]byte{0, 18, 142}: "Q-Free ASA", + [3]byte{0, 18, 143}: "Montilio", + [3]byte{0, 18, 144}: "KYOWA Electric & Machinery Corp.", + [3]byte{0, 18, 145}: "KWS Computersysteme GmbH", + [3]byte{0, 18, 146}: "Griffin Technology", + [3]byte{0, 18, 147}: "GE Energy", + [3]byte{0, 18, 148}: "SUMITOMO ELECTRIC DEVICE INNOVATIONS, INC", + [3]byte{0, 18, 149}: "Aiware Inc.", + [3]byte{0, 18, 150}: "Addlogix", + [3]byte{0, 18, 151}: "O2Micro, Inc.", + [3]byte{0, 18, 152}: "MICO ELECTRIC(SHENZHEN) LIMITED", + [3]byte{0, 18, 153}: "Ktech Telecommunications Inc", + [3]byte{0, 18, 154}: "IRT Electronics Pty Ltd", + [3]byte{0, 18, 155}: "E2S Electronic Engineering Solutions, S.L.", + [3]byte{0, 18, 156}: "Yulinet", + [3]byte{0, 18, 157}: "First International Computer do Brasil", + [3]byte{0, 18, 158}: "Surf Communications Inc.", + [3]byte{0, 18, 159}: "RAE Systems", + [3]byte{0, 18, 160}: "NeoMeridian Sdn Bhd", + [3]byte{0, 18, 161}: "BluePacket Communications Co., Ltd.", + [3]byte{0, 18, 162}: "VITA", + [3]byte{0, 18, 163}: "Trust International B.V.", + [3]byte{0, 18, 164}: "ThingMagic, LLC", + [3]byte{0, 18, 165}: "Stargen, Inc.", + [3]byte{0, 18, 166}: "Dolby Australia", + [3]byte{0, 18, 167}: "ISR TECHNOLOGIES Inc", + [3]byte{0, 18, 168}: "intec GmbH", + [3]byte{0, 18, 169}: "3Com Ltd", + [3]byte{0, 18, 170}: "IEE, Inc.", + [3]byte{0, 18, 171}: "WiLife, Inc.", + [3]byte{0, 18, 172}: "ONTIMETEK INC.", + [3]byte{0, 18, 173}: "IDS GmbH", + [3]byte{0, 18, 174}: "HLS HARD-LINE Solutions Inc.", + [3]byte{0, 18, 175}: "ELPRO Technologies", + [3]byte{0, 18, 176}: "Efore Oyj (Plc)", + [3]byte{0, 18, 177}: "Dai Nippon Printing Co., Ltd", + [3]byte{0, 18, 178}: "AVOLITES LTD.", + [3]byte{0, 18, 179}: "Advance Wireless Technology Corp.", + [3]byte{0, 18, 180}: "Work Microwave GmbH", + [3]byte{0, 18, 181}: "Vialta, Inc.", + [3]byte{0, 18, 182}: "Santa Barbara Infrared, Inc.", + [3]byte{0, 18, 183}: "PTW Freiburg", + [3]byte{0, 18, 184}: "G2 Microsystems", + [3]byte{0, 18, 185}: "Fusion Digital Technology", + [3]byte{0, 18, 186}: "FSI Systems, Inc.", + [3]byte{0, 18, 187}: "Telecommunications Industry Association TR-41 Committee", + [3]byte{0, 18, 188}: "Echolab LLC", + [3]byte{0, 18, 189}: "Avantec Manufacturing Limited", + [3]byte{0, 18, 190}: "Astek Corporation", + [3]byte{0, 18, 191}: "Arcadyan Technology Corporation", + [3]byte{0, 18, 192}: "HotLava Systems, Inc.", + [3]byte{0, 18, 193}: "Check Point Software Technologies", + [3]byte{0, 18, 194}: "Apex Electronics Factory", + [3]byte{0, 18, 195}: "WIT S.A.", + [3]byte{0, 18, 196}: "Viseon, Inc.", + [3]byte{0, 18, 197}: "V-Show Technology (China) Co.,Ltd", + [3]byte{0, 18, 198}: "TGC America, Inc", + [3]byte{0, 18, 199}: "SECURAY Technologies Ltd.Co.", + [3]byte{0, 18, 200}: "Perfect tech", + [3]byte{0, 18, 201}: "ARRIS Group, Inc.", + [3]byte{0, 18, 202}: "Mechatronic Brick Aps", + [3]byte{0, 18, 203}: "CSS Inc.", + [3]byte{0, 18, 204}: "Bitatek CO., LTD", + [3]byte{0, 18, 205}: "ASEM SpA", + [3]byte{0, 18, 206}: "Advanced Cybernetics Group", + [3]byte{0, 18, 207}: "Accton Technology Corp", + [3]byte{0, 18, 208}: "Gossen-Metrawatt-GmbH", + [3]byte{0, 18, 209}: "Texas Instruments", + [3]byte{0, 18, 210}: "Texas Instruments", + [3]byte{0, 18, 211}: "Zetta Systems, Inc.", + [3]byte{0, 18, 212}: "Princeton Technology, Ltd", + [3]byte{0, 18, 213}: "Motion Reality Inc.", + [3]byte{0, 18, 214}: "Jiangsu Yitong High-Tech Co.,Ltd", + [3]byte{0, 18, 215}: "Invento Networks, Inc.", + [3]byte{0, 18, 216}: "International Games System Co., Ltd.", + [3]byte{0, 18, 217}: "Cisco Systems, Inc", + [3]byte{0, 18, 218}: "Cisco Systems, Inc", + [3]byte{0, 18, 219}: "ZIEHL industrie-elektronik GmbH + Co KG", + [3]byte{0, 18, 220}: "SunCorp Industrial Limited", + [3]byte{0, 18, 221}: "Shengqu Information Technology (Shanghai) Co., Ltd.", + [3]byte{0, 18, 222}: "Radio Components Sweden AB", + [3]byte{0, 18, 223}: "Novomatic AG", + [3]byte{0, 18, 224}: "Codan Limited", + [3]byte{0, 18, 225}: "Alliant Networks, Inc", + [3]byte{0, 18, 226}: "ALAXALA Networks Corporation", + [3]byte{0, 18, 227}: "Agat-RT, Ltd.", + [3]byte{0, 18, 228}: "ZIEHL industrie-electronik GmbH + Co KG", + [3]byte{0, 18, 229}: "Time America, Inc.", + [3]byte{0, 18, 230}: "SPECTEC COMPUTER CO., LTD.", + [3]byte{0, 18, 231}: "Projectek Networking Electronics Corp.", + [3]byte{0, 18, 232}: "Fraunhofer IMS", + [3]byte{0, 18, 233}: "Abbey Systems Ltd", + [3]byte{0, 18, 234}: "Trane", + [3]byte{0, 18, 235}: "PDH Solutions, LLC", + [3]byte{0, 18, 236}: "Movacolor b.v.", + [3]byte{0, 18, 237}: "AVG Advanced Technologies", + [3]byte{0, 18, 238}: "Sony Mobile Communications AB", + [3]byte{0, 18, 239}: "OneAccess SA", + [3]byte{0, 18, 240}: "Intel Corporate", + [3]byte{0, 18, 241}: "IFOTEC", + [3]byte{0, 18, 242}: "Brocade Communications Systems, Inc.", + [3]byte{0, 18, 243}: "connectBlue AB", + [3]byte{0, 18, 244}: "Belco International Co.,Ltd.", + [3]byte{0, 18, 245}: "Imarda New Zealand Limited", + [3]byte{0, 18, 246}: "MDK CO.,LTD.", + [3]byte{0, 18, 247}: "Xiamen Xinglian Electronics Co., Ltd.", + [3]byte{0, 18, 248}: "WNI Resources, LLC", + [3]byte{0, 18, 249}: "URYU SEISAKU, LTD.", + [3]byte{0, 18, 250}: "THX LTD", + [3]byte{0, 18, 251}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 18, 252}: "PLANET System Co.,LTD", + [3]byte{0, 18, 253}: "OPTIMUS IC S.A.", + [3]byte{0, 18, 254}: "Lenovo Mobile Communication Technology Ltd.", + [3]byte{0, 18, 255}: "Lely Industries N.V.", + [3]byte{0, 19, 0}: "IT-FACTORY, INC.", + [3]byte{0, 19, 1}: "IronGate S.L.", + [3]byte{0, 19, 2}: "Intel Corporate", + [3]byte{0, 19, 3}: "GateConnect", + [3]byte{0, 19, 4}: "Flaircomm Technologies Co. LTD", + [3]byte{0, 19, 5}: "Epicom, Inc.", + [3]byte{0, 19, 6}: "Always On Wireless", + [3]byte{0, 19, 7}: "Paravirtual Corporation", + [3]byte{0, 19, 8}: "Nuvera Fuel Cells", + [3]byte{0, 19, 9}: "Ocean Broadband Networks", + [3]byte{0, 19, 10}: "Nortel Networks", + [3]byte{0, 19, 11}: "Mextal B.V.", + [3]byte{0, 19, 12}: "HF System Corporation", + [3]byte{0, 19, 13}: "GALILEO AVIONICA", + [3]byte{0, 19, 14}: "Focusrite Audio Engineering Limited", + [3]byte{0, 19, 15}: "EGEMEN Bilgisayar Muh San ve Tic LTD STI", + [3]byte{0, 19, 16}: "Cisco-Linksys, LLC", + [3]byte{0, 19, 17}: "ARRIS Group, Inc.", + [3]byte{0, 19, 18}: "Amedia Networks Inc.", + [3]byte{0, 19, 19}: "GuangZhou Post & Telecom Equipment ltd", + [3]byte{0, 19, 20}: "Asiamajor Inc.", + [3]byte{0, 19, 21}: "Sony Interactive Entertainment Inc.", + [3]byte{0, 19, 22}: "L-S-B Broadcast Technologies GmbH", + [3]byte{0, 19, 23}: "GN Netcom A/S", + [3]byte{0, 19, 24}: "DGSTATION Co., Ltd.", + [3]byte{0, 19, 25}: "Cisco Systems, Inc", + [3]byte{0, 19, 26}: "Cisco Systems, Inc", + [3]byte{0, 19, 27}: "BeCell Innovations Corp.", + [3]byte{0, 19, 28}: "LiteTouch, Inc.", + [3]byte{0, 19, 29}: "Scanvaegt International A/S", + [3]byte{0, 19, 30}: "Peiker acustic GmbH & Co. KG", + [3]byte{0, 19, 31}: "NxtPhase T&D, Corp.", + [3]byte{0, 19, 32}: "Intel Corporate", + [3]byte{0, 19, 33}: "Hewlett Packard", + [3]byte{0, 19, 34}: "DAQ Electronics, Inc.", + [3]byte{0, 19, 35}: "Cap Co., Ltd.", + [3]byte{0, 19, 36}: "Schneider Electric Ultra Terminal", + [3]byte{0, 19, 37}: "Cortina Systems Inc", + [3]byte{0, 19, 38}: "ECM Systems Ltd", + [3]byte{0, 19, 39}: "Data Acquisitions limited", + [3]byte{0, 19, 40}: "Westech Korea Inc.,", + [3]byte{0, 19, 41}: "VSST Co., LTD", + [3]byte{0, 19, 42}: "Sitronics Telecom Solutions", + [3]byte{0, 19, 43}: "Phoenix Digital", + [3]byte{0, 19, 44}: "MAZ Brandenburg GmbH", + [3]byte{0, 19, 45}: "iWise Communications", + [3]byte{0, 19, 46}: "ITian Coporation", + [3]byte{0, 19, 47}: "Interactek", + [3]byte{0, 19, 48}: "EURO PROTECTION SURVEILLANCE", + [3]byte{0, 19, 49}: "CellPoint Connect", + [3]byte{0, 19, 50}: "Beijing Topsec Network Security Technology Co., Ltd.", + [3]byte{0, 19, 51}: "BaudTec Corporation", + [3]byte{0, 19, 52}: "Arkados, Inc.", + [3]byte{0, 19, 53}: "VS Industry Berhad", + [3]byte{0, 19, 54}: "Tianjin 712 Communication Broadcasting co., ltd.", + [3]byte{0, 19, 55}: "Orient Power Home Network Ltd.", + [3]byte{0, 19, 56}: "FRESENIUS-VIAL", + [3]byte{0, 19, 57}: "CCV Deutschland GmbH", + [3]byte{0, 19, 58}: "VadaTech Inc.", + [3]byte{0, 19, 59}: "Speed Dragon Multimedia Limited", + [3]byte{0, 19, 60}: "QUINTRON SYSTEMS INC.", + [3]byte{0, 19, 61}: "Micro Memory Curtiss Wright Co", + [3]byte{0, 19, 62}: "MetaSwitch", + [3]byte{0, 19, 63}: "Eppendorf Instrumente GmbH", + [3]byte{0, 19, 64}: "AD.EL s.r.l.", + [3]byte{0, 19, 65}: "Shandong New Beiyang Information Technology Co.,Ltd", + [3]byte{0, 19, 66}: "Vision Research, Inc.", + [3]byte{0, 19, 67}: "Matsushita Electronic Components (Europe) GmbH", + [3]byte{0, 19, 68}: "Fargo Electronics Inc.", + [3]byte{0, 19, 69}: "Eaton Corporation", + [3]byte{0, 19, 70}: "D-Link Corporation", + [3]byte{0, 19, 71}: "Red Lion Controls, LP", + [3]byte{0, 19, 72}: "Artila Electronics Co., Ltd.", + [3]byte{0, 19, 73}: "Zyxel Communications Corporation", + [3]byte{0, 19, 74}: "Engim, Inc.", + [3]byte{0, 19, 75}: "ToGoldenNet Technology Inc.", + [3]byte{0, 19, 76}: "YDT Technology International", + [3]byte{0, 19, 77}: "Inepro BV", + [3]byte{0, 19, 78}: "Valox Systems, Inc.", + [3]byte{0, 19, 79}: "Tranzeo Wireless Technologies Inc.", + [3]byte{0, 19, 80}: "Silver Spring Networks, Inc", + [3]byte{0, 19, 81}: "Niles Audio Corporation", + [3]byte{0, 19, 82}: "Naztec, Inc.", + [3]byte{0, 19, 83}: "HYDAC Filtertechnik GMBH", + [3]byte{0, 19, 84}: "Zcomax Technologies, Inc.", + [3]byte{0, 19, 85}: "TOMEN Cyber-business Solutions, Inc.", + [3]byte{0, 19, 86}: "FLIR Radiation Inc", + [3]byte{0, 19, 87}: "Soyal Technology Co., Ltd.", + [3]byte{0, 19, 88}: "Realm Systems, Inc.", + [3]byte{0, 19, 89}: "ProTelevision Technologies A/S", + [3]byte{0, 19, 90}: "Project T&E Limited", + [3]byte{0, 19, 91}: "PanelLink Cinema, LLC", + [3]byte{0, 19, 92}: "OnSite Systems, Inc.", + [3]byte{0, 19, 93}: "NTTPC Communications, Inc.", + [3]byte{0, 19, 94}: "EAB/RWI/K", + [3]byte{0, 19, 95}: "Cisco Systems, Inc", + [3]byte{0, 19, 96}: "Cisco Systems, Inc", + [3]byte{0, 19, 97}: "Biospace Co., Ltd.", + [3]byte{0, 19, 98}: "ShinHeung Precision Co., Ltd.", + [3]byte{0, 19, 99}: "Verascape, Inc.", + [3]byte{0, 19, 100}: "Paradigm Technology Inc..", + [3]byte{0, 19, 101}: "Nortel Networks", + [3]byte{0, 19, 102}: "Neturity Technologies Inc.", + [3]byte{0, 19, 103}: "Narayon. Co., Ltd.", + [3]byte{0, 19, 104}: "Saab Danmark A/S", + [3]byte{0, 19, 105}: "Honda Electron Co., LED.", + [3]byte{0, 19, 106}: "Hach Lange Sarl", + [3]byte{0, 19, 107}: "E-TEC", + [3]byte{0, 19, 108}: "TomTom", + [3]byte{0, 19, 109}: "Tentaculus AB", + [3]byte{0, 19, 110}: "Techmetro Corp.", + [3]byte{0, 19, 111}: "PacketMotion, Inc.", + [3]byte{0, 19, 112}: "Nokia Danmark A/S", + [3]byte{0, 19, 113}: "ARRIS Group, Inc.", + [3]byte{0, 19, 114}: "Dell Inc.", + [3]byte{0, 19, 115}: "BLwave Electronics Co., Ltd", + [3]byte{0, 19, 116}: "Atheros Communications, Inc.", + [3]byte{0, 19, 117}: "American Security Products Co.", + [3]byte{0, 19, 118}: "Tabor Electronics Ltd.", + [3]byte{0, 19, 119}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 19, 120}: "Qsan Technology, Inc.", + [3]byte{0, 19, 121}: "PONDER INFORMATION INDUSTRIES LTD.", + [3]byte{0, 19, 122}: "Netvox Technology Co., Ltd.", + [3]byte{0, 19, 123}: "Movon Corporation", + [3]byte{0, 19, 124}: "Kaicom co., Ltd.", + [3]byte{0, 19, 125}: "Dynalab, Inc.", + [3]byte{0, 19, 126}: "CorEdge Networks, Inc.", + [3]byte{0, 19, 127}: "Cisco Systems, Inc", + [3]byte{0, 19, 128}: "Cisco Systems, Inc", + [3]byte{0, 19, 129}: "CHIPS & Systems, Inc.", + [3]byte{0, 19, 130}: "Cetacea Networks Corporation", + [3]byte{0, 19, 131}: "Application Technologies and Engineering Research Laboratory", + [3]byte{0, 19, 132}: "Advanced Motion Controls", + [3]byte{0, 19, 133}: "Add-On Technology Co., LTD.", + [3]byte{0, 19, 134}: "ABB Inc./Totalflow", + [3]byte{0, 19, 135}: "27M Technologies AB", + [3]byte{0, 19, 136}: "WiMedia Alliance", + [3]byte{0, 19, 137}: "Redes de Telefonía Móvil S.A.", + [3]byte{0, 19, 138}: "QINGDAO GOERTEK ELECTRONICS CO.,LTD.", + [3]byte{0, 19, 139}: "Phantom Technologies LLC", + [3]byte{0, 19, 140}: "Kumyoung.Co.Ltd", + [3]byte{0, 19, 141}: "Kinghold", + [3]byte{0, 19, 142}: "FOAB Elektronik AB", + [3]byte{0, 19, 143}: "Asiarock Technology Limited", + [3]byte{0, 19, 144}: "Termtek Computer Co., Ltd", + [3]byte{0, 19, 145}: "OUEN CO.,LTD.", + [3]byte{0, 19, 146}: "Ruckus Wireless", + [3]byte{0, 19, 147}: "Panta Systems, Inc.", + [3]byte{0, 19, 148}: "Infohand Co.,Ltd", + [3]byte{0, 19, 149}: "congatec AG", + [3]byte{0, 19, 150}: "Acbel Polytech Inc.", + [3]byte{0, 19, 151}: "Oracle Corporation", + [3]byte{0, 19, 152}: "TrafficSim Co.,Ltd", + [3]byte{0, 19, 153}: "STAC Corporation.", + [3]byte{0, 19, 154}: "K-ubique ID Corp.", + [3]byte{0, 19, 155}: "ioIMAGE Ltd.", + [3]byte{0, 19, 156}: "Exavera Technologies, Inc.", + [3]byte{0, 19, 157}: "MaxLinear Hispania S.L.U.", + [3]byte{0, 19, 158}: "Ciara Technologies Inc.", + [3]byte{0, 19, 159}: "Electronics Design Services, Co., Ltd.", + [3]byte{0, 19, 160}: "ALGOSYSTEM Co., Ltd.", + [3]byte{0, 19, 161}: "Crow Electronic Engeneering", + [3]byte{0, 19, 162}: "MaxStream, Inc", + [3]byte{0, 19, 163}: "Siemens Com CPE Devices", + [3]byte{0, 19, 164}: "KeyEye Communications", + [3]byte{0, 19, 165}: "General Solutions, LTD.", + [3]byte{0, 19, 166}: "Extricom Ltd", + [3]byte{0, 19, 167}: "BATTELLE MEMORIAL INSTITUTE", + [3]byte{0, 19, 168}: "Tanisys Technology", + [3]byte{0, 19, 169}: "Sony Corporation", + [3]byte{0, 19, 170}: "ALS & TEC Ltd.", + [3]byte{0, 19, 171}: "Telemotive AG", + [3]byte{0, 19, 172}: "Sunmyung Electronics Co., LTD", + [3]byte{0, 19, 173}: "Sendo Ltd", + [3]byte{0, 19, 174}: "Radiance Technologies, Inc.", + [3]byte{0, 19, 175}: "NUMA Technology,Inc.", + [3]byte{0, 19, 176}: "Jablotron", + [3]byte{0, 19, 177}: "Intelligent Control Systems (Asia) Pte Ltd", + [3]byte{0, 19, 178}: "Carallon Limited", + [3]byte{0, 19, 179}: "Ecom Communications Technology Co., Ltd.", + [3]byte{0, 19, 180}: "Appear TV", + [3]byte{0, 19, 181}: "Wavesat", + [3]byte{0, 19, 182}: "Sling Media, Inc.", + [3]byte{0, 19, 183}: "Scantech ID", + [3]byte{0, 19, 184}: "RyCo Electronic Systems Limited", + [3]byte{0, 19, 185}: "BM SPA", + [3]byte{0, 19, 186}: "ReadyLinks Inc", + [3]byte{0, 19, 187}: "Smartvue Corporation", + [3]byte{0, 19, 188}: "Artimi Ltd", + [3]byte{0, 19, 189}: "HYMATOM SA", + [3]byte{0, 19, 190}: "Virtual Conexions", + [3]byte{0, 19, 191}: "Media System Planning Corp.", + [3]byte{0, 19, 192}: "Trix Tecnologia Ltda.", + [3]byte{0, 19, 193}: "Asoka USA Corporation", + [3]byte{0, 19, 194}: "WACOM Co.,Ltd", + [3]byte{0, 19, 195}: "Cisco Systems, Inc", + [3]byte{0, 19, 196}: "Cisco Systems, Inc", + [3]byte{0, 19, 197}: "LIGHTRON FIBER-OPTIC DEVICES INC.", + [3]byte{0, 19, 198}: "OpenGear, Inc", + [3]byte{0, 19, 199}: "IONOS Co.,Ltd.", + [3]byte{0, 19, 200}: "ADB Broadband Italia", + [3]byte{0, 19, 201}: "Beyond Achieve Enterprises Ltd.", + [3]byte{0, 19, 202}: "Pico Digital", + [3]byte{0, 19, 203}: "Zenitel Norway AS", + [3]byte{0, 19, 204}: "Tall Maple Systems", + [3]byte{0, 19, 205}: "MTI co. LTD", + [3]byte{0, 19, 206}: "Intel Corporate", + [3]byte{0, 19, 207}: "4Access Communications", + [3]byte{0, 19, 208}: "t+ Medical Ltd", + [3]byte{0, 19, 209}: "KIRK telecom A/S", + [3]byte{0, 19, 210}: "PAGE IBERICA, S.A.", + [3]byte{0, 19, 211}: "MICRO-STAR INTERNATIONAL CO., LTD.", + [3]byte{0, 19, 212}: "ASUSTek COMPUTER INC.", + [3]byte{0, 19, 213}: "RuggedCom", + [3]byte{0, 19, 214}: "TII NETWORK TECHNOLOGIES, INC.", + [3]byte{0, 19, 215}: "SPIDCOM Technologies SA", + [3]byte{0, 19, 216}: "Princeton Instruments", + [3]byte{0, 19, 217}: "Matrix Product Development, Inc.", + [3]byte{0, 19, 218}: "Diskware Co., Ltd", + [3]byte{0, 19, 219}: "SHOEI Electric Co.,Ltd", + [3]byte{0, 19, 220}: "IBTEK INC.", + [3]byte{0, 19, 221}: "Abbott Diagnostics", + [3]byte{0, 19, 222}: "Adapt4, LLC", + [3]byte{0, 19, 223}: "Ryvor Corp.", + [3]byte{0, 19, 224}: "Murata Manufacturing Co., Ltd.", + [3]byte{0, 19, 225}: "Iprobe AB", + [3]byte{0, 19, 226}: "GeoVision Inc.", + [3]byte{0, 19, 227}: "CoVi Technologies, Inc.", + [3]byte{0, 19, 228}: "YANGJAE SYSTEMS CORP.", + [3]byte{0, 19, 229}: "TENOSYS, INC.", + [3]byte{0, 19, 230}: "Technolution", + [3]byte{0, 19, 231}: "Halcro", + [3]byte{0, 19, 232}: "Intel Corporate", + [3]byte{0, 19, 233}: "VeriWave, Inc.", + [3]byte{0, 19, 234}: "Kamstrup A/S", + [3]byte{0, 19, 235}: "Sysmaster Corporation", + [3]byte{0, 19, 236}: "Netsnapper Technologies SARL", + [3]byte{0, 19, 237}: "PSIA", + [3]byte{0, 19, 238}: "JBX Designs Inc.", + [3]byte{0, 19, 239}: "Kingjon Digital Technology Co.,Ltd", + [3]byte{0, 19, 240}: "Wavefront Semiconductor", + [3]byte{0, 19, 241}: "AMOD Technology Co., Ltd.", + [3]byte{0, 19, 242}: "Klas Ltd", + [3]byte{0, 19, 243}: "Giga-byte Communications Inc.", + [3]byte{0, 19, 244}: "Psitek (Pty) Ltd", + [3]byte{0, 19, 245}: "Akimbi Systems", + [3]byte{0, 19, 246}: "Cintech", + [3]byte{0, 19, 247}: "SMC Networks, Inc.", + [3]byte{0, 19, 248}: "Dex Security Solutions", + [3]byte{0, 19, 249}: "Cavera Systems", + [3]byte{0, 19, 250}: "LifeSize Communications, Inc", + [3]byte{0, 19, 251}: "RKC INSTRUMENT INC.", + [3]byte{0, 19, 252}: "SiCortex, Inc", + [3]byte{0, 19, 253}: "Nokia Danmark A/S", + [3]byte{0, 19, 254}: "GRANDTEC ELECTRONIC CORP.", + [3]byte{0, 19, 255}: "Dage-MTI of MC, Inc.", + [3]byte{0, 20, 0}: "MINERVA KOREA CO., LTD", + [3]byte{0, 20, 1}: "Rivertree Networks Corp.", + [3]byte{0, 20, 2}: "kk-electronic a/s", + [3]byte{0, 20, 3}: "Renasis, LLC", + [3]byte{0, 20, 4}: "ARRIS Group, Inc.", + [3]byte{0, 20, 5}: "OpenIB, Inc.", + [3]byte{0, 20, 6}: "Go Networks", + [3]byte{0, 20, 7}: "Sperian Protection Instrumentation", + [3]byte{0, 20, 8}: "Eka Systems Inc.", + [3]byte{0, 20, 9}: "MAGNETI MARELLI S.E. S.p.A.", + [3]byte{0, 20, 10}: "WEPIO Co., Ltd.", + [3]byte{0, 20, 11}: "FIRST INTERNATIONAL COMPUTER, INC.", + [3]byte{0, 20, 12}: "GKB CCTV CO., LTD.", + [3]byte{0, 20, 13}: "Nortel Networks", + [3]byte{0, 20, 14}: "Nortel Networks", + [3]byte{0, 20, 15}: "Federal State Unitary Enterprise Leningrad R&D Institute of", + [3]byte{0, 20, 16}: "Suzhou Keda Technology CO.,Ltd", + [3]byte{0, 20, 17}: "Deutschmann Automation GmbH & Co. KG", + [3]byte{0, 20, 18}: "S-TEC electronics AG", + [3]byte{0, 20, 19}: "Trebing & Himstedt Prozeßautomation GmbH & Co. KG", + [3]byte{0, 20, 20}: "Jumpnode Systems LLC.", + [3]byte{0, 20, 21}: "Intec Automation inc.", + [3]byte{0, 20, 22}: "Scosche Industries, Inc.", + [3]byte{0, 20, 23}: "RSE Informations Technologie GmbH", + [3]byte{0, 20, 24}: "C4Line", + [3]byte{0, 20, 25}: "SIDSA", + [3]byte{0, 20, 26}: "DEICY CORPORATION", + [3]byte{0, 20, 27}: "Cisco Systems, Inc", + [3]byte{0, 20, 28}: "Cisco Systems, Inc", + [3]byte{0, 20, 29}: "LTi DRIVES GmbH", + [3]byte{0, 20, 30}: "P.A. Semi, Inc.", + [3]byte{0, 20, 31}: "SunKwang Electronics Co., Ltd", + [3]byte{0, 20, 32}: "G-Links networking company", + [3]byte{0, 20, 33}: "Total Wireless Technologies Pte. Ltd.", + [3]byte{0, 20, 34}: "Dell Inc.", + [3]byte{0, 20, 35}: "J-S Co. NEUROCOM", + [3]byte{0, 20, 36}: "Merry Electrics CO., LTD.", + [3]byte{0, 20, 37}: "Galactic Computing Corp.", + [3]byte{0, 20, 38}: "NL Technology", + [3]byte{0, 20, 39}: "JazzMutant", + [3]byte{0, 20, 40}: "Vocollect Inc", + [3]byte{0, 20, 41}: "V Center Technologies Co., Ltd.", + [3]byte{0, 20, 42}: "Elitegroup Computer Systems Co.,Ltd.", + [3]byte{0, 20, 43}: "Edata Communication Inc.", + [3]byte{0, 20, 44}: "Koncept International, Inc.", + [3]byte{0, 20, 45}: "Toradex AG", + [3]byte{0, 20, 46}: "77 Elektronika Kft.", + [3]byte{0, 20, 47}: "Savvius", + [3]byte{0, 20, 48}: "ViPowER, Inc", + [3]byte{0, 20, 49}: "PDL Electronics Ltd", + [3]byte{0, 20, 50}: "Tarallax Wireless, Inc.", + [3]byte{0, 20, 51}: "Empower Technologies(Canada) Inc.", + [3]byte{0, 20, 52}: "Keri Systems, Inc", + [3]byte{0, 20, 53}: "CityCom Corp.", + [3]byte{0, 20, 54}: "Qwerty Elektronik AB", + [3]byte{0, 20, 55}: "GSTeletech Co.,Ltd.", + [3]byte{0, 20, 56}: "Hewlett Packard Enterprise", + [3]byte{0, 20, 57}: "Blonder Tongue Laboratories, Inc", + [3]byte{0, 20, 58}: "RAYTALK INTERNATIONAL SRL", + [3]byte{0, 20, 59}: "Sensovation AG", + [3]byte{0, 20, 60}: "Rheinmetall Canada Inc.", + [3]byte{0, 20, 61}: "Aevoe Inc.", + [3]byte{0, 20, 62}: "AirLink Communications, Inc.", + [3]byte{0, 20, 63}: "Hotway Technology Corporation", + [3]byte{0, 20, 64}: "ATOMIC Corporation", + [3]byte{0, 20, 65}: "Innovation Sound Technology Co., LTD.", + [3]byte{0, 20, 66}: "ATTO CORPORATION", + [3]byte{0, 20, 67}: "Consultronics Europe Ltd", + [3]byte{0, 20, 68}: "Grundfos Holding", + [3]byte{0, 20, 69}: "Telefon-Gradnja d.o.o.", + [3]byte{0, 20, 70}: "SuperVision Solutions LLC", + [3]byte{0, 20, 71}: "BOAZ Inc.", + [3]byte{0, 20, 72}: "Inventec Multimedia & Telecom Corporation", + [3]byte{0, 20, 73}: "Sichuan Changhong Electric Ltd.", + [3]byte{0, 20, 74}: "Taiwan Thick-Film Ind. Corp.", + [3]byte{0, 20, 75}: "Hifn, Inc.", + [3]byte{0, 20, 76}: "General Meters Corp.", + [3]byte{0, 20, 77}: "Intelligent Systems", + [3]byte{0, 20, 78}: "SRISA", + [3]byte{0, 20, 79}: "Oracle Corporation", + [3]byte{0, 20, 80}: "Heim Systems GmbH", + [3]byte{0, 20, 81}: "Apple, Inc.", + [3]byte{0, 20, 82}: "CALCULEX,INC.", + [3]byte{0, 20, 83}: "ADVANTECH TECHNOLOGIES CO.,LTD", + [3]byte{0, 20, 84}: "Symwave", + [3]byte{0, 20, 85}: "Coder Electronics Corporation", + [3]byte{0, 20, 86}: "Edge Products", + [3]byte{0, 20, 87}: "T-VIPS AS", + [3]byte{0, 20, 88}: "HS Automatic ApS", + [3]byte{0, 20, 89}: "Moram Co., Ltd.", + [3]byte{0, 20, 90}: "Neratec Solutions AG", + [3]byte{0, 20, 91}: "SeekerNet Inc.", + [3]byte{0, 20, 92}: "Intronics B.V.", + [3]byte{0, 20, 93}: "WJ Communications, Inc.", + [3]byte{0, 20, 94}: "IBM Corp", + [3]byte{0, 20, 95}: "ADITEC CO. LTD", + [3]byte{0, 20, 96}: "Kyocera Wireless Corp.", + [3]byte{0, 20, 97}: "CORONA CORPORATION", + [3]byte{0, 20, 98}: "Digiwell Technology, inc", + [3]byte{0, 20, 99}: "IDCS N.V.", + [3]byte{0, 20, 100}: "Cryptosoft", + [3]byte{0, 20, 101}: "Novo Nordisk A/S", + [3]byte{0, 20, 102}: "Kleinhenz Elektronik GmbH", + [3]byte{0, 20, 103}: "ArrowSpan Inc.", + [3]byte{0, 20, 104}: "CelPlan International, Inc.", + [3]byte{0, 20, 105}: "Cisco Systems, Inc", + [3]byte{0, 20, 106}: "Cisco Systems, Inc", + [3]byte{0, 20, 107}: "Anagran, Inc.", + [3]byte{0, 20, 108}: "NETGEAR", + [3]byte{0, 20, 109}: "RF Technologies", + [3]byte{0, 20, 110}: "H. Stoll GmbH & Co. KG", + [3]byte{0, 20, 111}: "Kohler Co", + [3]byte{0, 20, 112}: "Prokom Software SA", + [3]byte{0, 20, 113}: "Eastern Asia Technology Limited", + [3]byte{0, 20, 114}: "China Broadband Wireless IP Standard Group", + [3]byte{0, 20, 115}: "Bookham Inc", + [3]byte{0, 20, 116}: "K40 Electronics", + [3]byte{0, 20, 117}: "Wiline Networks, Inc.", + [3]byte{0, 20, 118}: "MultiCom Industries Limited", + [3]byte{0, 20, 119}: "Nertec Inc.", + [3]byte{0, 20, 120}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{0, 20, 121}: "NEC Magnus Communications,Ltd.", + [3]byte{0, 20, 122}: "Eubus GmbH", + [3]byte{0, 20, 123}: "Iteris, Inc.", + [3]byte{0, 20, 124}: "3Com Ltd", + [3]byte{0, 20, 125}: "Aeon Digital International", + [3]byte{0, 20, 126}: "InnerWireless", + [3]byte{0, 20, 127}: "Thomson Telecom Belgium", + [3]byte{0, 20, 128}: "Hitachi-LG Data Storage Korea, Inc", + [3]byte{0, 20, 129}: "Multilink Inc", + [3]byte{0, 20, 130}: "Aurora Networks", + [3]byte{0, 20, 131}: "eXS Inc.", + [3]byte{0, 20, 132}: "Cermate Technologies Inc.", + [3]byte{0, 20, 133}: "Giga-Byte", + [3]byte{0, 20, 134}: "Echo Digital Audio Corporation", + [3]byte{0, 20, 135}: "American Technology Integrators", + [3]byte{0, 20, 136}: "Akorri", + [3]byte{0, 20, 137}: "B15402100 - JANDEI, S.L.", + [3]byte{0, 20, 138}: "Elin Ebg Traction Gmbh", + [3]byte{0, 20, 139}: "Globo Electronic GmbH & Co. KG", + [3]byte{0, 20, 140}: "General Dynamics Mission Systems", + [3]byte{0, 20, 141}: "Cubic Defense Simulation Systems", + [3]byte{0, 20, 142}: "Tele Power Inc.", + [3]byte{0, 20, 143}: "Protronic (Far East) Ltd.", + [3]byte{0, 20, 144}: "ASP Corporation", + [3]byte{0, 20, 145}: "Daniels Electronics Ltd. dbo Codan Rado Communications", + [3]byte{0, 20, 146}: "Liteon, Mobile Media Solution SBU", + [3]byte{0, 20, 147}: "Systimax Solutions", + [3]byte{0, 20, 148}: "ESU AG", + [3]byte{0, 20, 149}: "2Wire Inc", + [3]byte{0, 20, 150}: "Phonic Corp.", + [3]byte{0, 20, 151}: "ZHIYUAN Eletronics co.,ltd.", + [3]byte{0, 20, 152}: "Viking Design Technology", + [3]byte{0, 20, 153}: "Helicomm Inc", + [3]byte{0, 20, 154}: "ARRIS Group, Inc.", + [3]byte{0, 20, 155}: "Nokota Communications, LLC", + [3]byte{0, 20, 156}: "HF Company", + [3]byte{0, 20, 157}: "Sound ID Inc.", + [3]byte{0, 20, 158}: "UbONE Co., Ltd", + [3]byte{0, 20, 159}: "System and Chips, Inc.", + [3]byte{0, 20, 160}: "Accsense, Inc.", + [3]byte{0, 20, 161}: "Synchronous Communication Corp", + [3]byte{0, 20, 162}: "Core Micro Systems Inc.", + [3]byte{0, 20, 163}: "Vitelec BV", + [3]byte{0, 20, 164}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{0, 20, 165}: "Gemtek Technology Co., Ltd.", + [3]byte{0, 20, 166}: "Teranetics, Inc.", + [3]byte{0, 20, 167}: "Nokia Danmark A/S", + [3]byte{0, 20, 168}: "Cisco Systems, Inc", + [3]byte{0, 20, 169}: "Cisco Systems, Inc", + [3]byte{0, 20, 170}: "Ashly Audio, Inc.", + [3]byte{0, 20, 171}: "Senhai Electronic Technology Co., Ltd.", + [3]byte{0, 20, 172}: "Bountiful WiFi", + [3]byte{0, 20, 173}: "Gassner Wiege- und Meßtechnik GmbH", + [3]byte{0, 20, 174}: "Wizlogics Co., Ltd.", + [3]byte{0, 20, 175}: "Datasym POS Inc.", + [3]byte{0, 20, 176}: "Naeil Community", + [3]byte{0, 20, 177}: "Axell Wireless Limited", + [3]byte{0, 20, 178}: "mCubelogics Corporation", + [3]byte{0, 20, 179}: "CoreStar International Corp", + [3]byte{0, 20, 180}: "General Dynamics United Kingdom Ltd", + [3]byte{0, 20, 181}: "PHYSIOMETRIX,INC", + [3]byte{0, 20, 182}: "Enswer Technology Inc.", + [3]byte{0, 20, 183}: "AR Infotek Inc.", + [3]byte{0, 20, 184}: "Hill-Rom", + [3]byte{0, 20, 185}: "MSTAR SEMICONDUCTOR", + [3]byte{0, 20, 186}: "Carvers SA de CV", + [3]byte{0, 20, 187}: "Open Interface North America", + [3]byte{0, 20, 188}: "SYNECTIC TELECOM EXPORTS PVT. LTD.", + [3]byte{0, 20, 189}: "incNETWORKS, Inc", + [3]byte{0, 20, 190}: "Wink communication technology CO.LTD", + [3]byte{0, 20, 191}: "Cisco-Linksys, LLC", + [3]byte{0, 20, 192}: "Symstream Technology Group Ltd", + [3]byte{0, 20, 193}: "U.S. Robotics Corporation", + [3]byte{0, 20, 194}: "Hewlett Packard", + [3]byte{0, 20, 195}: "Seagate Technology", + [3]byte{0, 20, 196}: "Vitelcom Mobile Technology", + [3]byte{0, 20, 197}: "Alive Technologies Pty Ltd", + [3]byte{0, 20, 198}: "Quixant Ltd", + [3]byte{0, 20, 199}: "Nortel Networks", + [3]byte{0, 20, 200}: "Contemporary Research Corp", + [3]byte{0, 20, 201}: "Brocade Communications Systems, Inc.", + [3]byte{0, 20, 202}: "Key Radio Systems Limited", + [3]byte{0, 20, 203}: "LifeSync Corporation", + [3]byte{0, 20, 204}: "Zetec, Inc.", + [3]byte{0, 20, 205}: "DigitalZone Co., Ltd.", + [3]byte{0, 20, 206}: "NF CORPORATION", + [3]byte{0, 20, 207}: "INVISIO Communications", + [3]byte{0, 20, 208}: "BTI Systems Inc.", + [3]byte{0, 20, 209}: "TRENDnet, Inc.", + [3]byte{0, 20, 210}: "Kyuden Technosystems Corporation", + [3]byte{0, 20, 211}: "SEPSA", + [3]byte{0, 20, 212}: "K Technology Corporation", + [3]byte{0, 20, 213}: "Datang Telecom Technology CO. , LCD,Optical Communication Br", + [3]byte{0, 20, 214}: "Jeongmin Electronics Co.,Ltd.", + [3]byte{0, 20, 215}: "Datastore Technology Corp", + [3]byte{0, 20, 216}: "bio-logic SA", + [3]byte{0, 20, 217}: "IP Fabrics, Inc.", + [3]byte{0, 20, 218}: "Huntleigh Healthcare", + [3]byte{0, 20, 219}: "Elma Trenew Electronic GmbH", + [3]byte{0, 20, 220}: "Communication System Design & Manufacturing (CSDM)", + [3]byte{0, 20, 221}: "Covergence Inc.", + [3]byte{0, 20, 222}: "Sage Instruments Inc.", + [3]byte{0, 20, 223}: "HI-P Tech Corporation", + [3]byte{0, 20, 224}: "LET'S Corporation", + [3]byte{0, 20, 225}: "Data Display AG", + [3]byte{0, 20, 226}: "datacom systems inc.", + [3]byte{0, 20, 227}: "mm-lab GmbH", + [3]byte{0, 20, 228}: "infinias, LLC", + [3]byte{0, 20, 229}: "Alticast", + [3]byte{0, 20, 230}: "AIM Infrarotmodule GmbH", + [3]byte{0, 20, 231}: "Stolinx,. Inc", + [3]byte{0, 20, 232}: "ARRIS Group, Inc.", + [3]byte{0, 20, 233}: "Nortech International", + [3]byte{0, 20, 234}: "S Digm Inc. (Safe Paradigm Inc.)", + [3]byte{0, 20, 235}: "AwarePoint Corporation", + [3]byte{0, 20, 236}: "Acro Telecom", + [3]byte{0, 20, 237}: "Airak, Inc.", + [3]byte{0, 20, 238}: "Western Digital Technologies, Inc.", + [3]byte{0, 20, 239}: "TZero Technologies, Inc.", + [3]byte{0, 20, 240}: "Business Security OL AB", + [3]byte{0, 20, 241}: "Cisco Systems, Inc", + [3]byte{0, 20, 242}: "Cisco Systems, Inc", + [3]byte{0, 20, 243}: "ViXS Systems Inc", + [3]byte{0, 20, 244}: "DekTec Digital Video B.V.", + [3]byte{0, 20, 245}: "OSI Security Devices", + [3]byte{0, 20, 246}: "Juniper Networks", + [3]byte{0, 20, 247}: "CREVIS Co., LTD", + [3]byte{0, 20, 248}: "Scientific Atlanta", + [3]byte{0, 20, 249}: "Vantage Controls", + [3]byte{0, 20, 250}: "AsGa S.A.", + [3]byte{0, 20, 251}: "Technical Solutions Inc.", + [3]byte{0, 20, 252}: "Extandon, Inc.", + [3]byte{0, 20, 253}: "Thecus Technology Corp.", + [3]byte{0, 20, 254}: "Artech Electronics", + [3]byte{0, 20, 255}: "Precise Automation, Inc.", + [3]byte{0, 21, 0}: "Intel Corporate", + [3]byte{0, 21, 1}: "LexBox", + [3]byte{0, 21, 2}: "BETA tech", + [3]byte{0, 21, 3}: "PROFIcomms s.r.o.", + [3]byte{0, 21, 4}: "GAME PLUS CO., LTD.", + [3]byte{0, 21, 5}: "Actiontec Electronics, Inc", + [3]byte{0, 21, 6}: "Neo Photonics", + [3]byte{0, 21, 7}: "Renaissance Learning Inc", + [3]byte{0, 21, 8}: "Global Target Enterprise Inc", + [3]byte{0, 21, 9}: "Plus Technology Co., Ltd", + [3]byte{0, 21, 10}: "Sonoa Systems, Inc", + [3]byte{0, 21, 11}: "SAGE INFOTECH LTD.", + [3]byte{0, 21, 12}: "AVM GmbH", + [3]byte{0, 21, 13}: "Hoana Medical, Inc.", + [3]byte{0, 21, 14}: "OPENBRAIN TECHNOLOGIES CO., LTD.", + [3]byte{0, 21, 15}: "mingjong", + [3]byte{0, 21, 16}: "Techsphere Co., Ltd", + [3]byte{0, 21, 17}: "Data Center Systems", + [3]byte{0, 21, 18}: "Zurich University of Applied Sciences", + [3]byte{0, 21, 19}: "EFS sas", + [3]byte{0, 21, 20}: "Hu Zhou NAVA Networks&Electronics Ltd.", + [3]byte{0, 21, 21}: "Leipold+Co.GmbH", + [3]byte{0, 21, 22}: "URIEL SYSTEMS INC.", + [3]byte{0, 21, 23}: "Intel Corporate", + [3]byte{0, 21, 24}: "Shenzhen 10MOONS Technology Development CO.,Ltd", + [3]byte{0, 21, 25}: "StoreAge Networking Technologies", + [3]byte{0, 21, 26}: "Hunter Engineering Company", + [3]byte{0, 21, 27}: "Isilon Systems Inc.", + [3]byte{0, 21, 28}: "LENECO", + [3]byte{0, 21, 29}: "M2I CORPORATION", + [3]byte{0, 21, 30}: "Ethernet Powerlink Standardization Group (EPSG)", + [3]byte{0, 21, 31}: "Multivision Intelligent Surveillance (Hong Kong) Ltd", + [3]byte{0, 21, 32}: "Radiocrafts AS", + [3]byte{0, 21, 33}: "Horoquartz", + [3]byte{0, 21, 34}: "Dea Security", + [3]byte{0, 21, 35}: "Meteor Communications Corporation", + [3]byte{0, 21, 36}: "Numatics, Inc.", + [3]byte{0, 21, 37}: "Chamberlain Access Solutions", + [3]byte{0, 21, 38}: "Remote Technologies Inc", + [3]byte{0, 21, 39}: "Balboa Instruments", + [3]byte{0, 21, 40}: "Beacon Medical Products LLC d.b.a. BeaconMedaes", + [3]byte{0, 21, 41}: "N3 Corporation", + [3]byte{0, 21, 42}: "Nokia Corporation", + [3]byte{0, 21, 43}: "Cisco Systems, Inc", + [3]byte{0, 21, 44}: "Cisco Systems, Inc", + [3]byte{0, 21, 45}: "TenX Networks, LLC", + [3]byte{0, 21, 46}: "PacketHop, Inc.", + [3]byte{0, 21, 47}: "ARRIS Group, Inc.", + [3]byte{0, 21, 48}: "Dell EMC", + [3]byte{0, 21, 49}: "KOCOM", + [3]byte{0, 21, 50}: "Consumer Technologies Group, LLC", + [3]byte{0, 21, 51}: "NADAM.CO.,LTD", + [3]byte{0, 21, 52}: "A Beltrónica-Companhia de Comunicações, Lda", + [3]byte{0, 21, 53}: "OTE Spa", + [3]byte{0, 21, 54}: "Powertech co.,Ltd", + [3]byte{0, 21, 55}: "Ventus Networks", + [3]byte{0, 21, 56}: "RFID, Inc.", + [3]byte{0, 21, 57}: "Technodrive srl", + [3]byte{0, 21, 58}: "Shenzhen Syscan Technology Co.,Ltd.", + [3]byte{0, 21, 59}: "EMH metering GmbH & Co. KG", + [3]byte{0, 21, 60}: "Kprotech Co., Ltd.", + [3]byte{0, 21, 61}: "ELIM PRODUCT CO.", + [3]byte{0, 21, 62}: "Q-Matic Sweden AB", + [3]byte{0, 21, 63}: "Alcatel Alenia Space Italia", + [3]byte{0, 21, 64}: "Nortel Networks", + [3]byte{0, 21, 65}: "StrataLight Communications, Inc.", + [3]byte{0, 21, 66}: "MICROHARD S.R.L.", + [3]byte{0, 21, 67}: "Aberdeen Test Center", + [3]byte{0, 21, 68}: "coM.s.a.t. AG", + [3]byte{0, 21, 69}: "SEECODE Co., Ltd.", + [3]byte{0, 21, 70}: "ITG Worldwide Sdn Bhd", + [3]byte{0, 21, 71}: "AiZen Solutions Inc.", + [3]byte{0, 21, 72}: "CUBE TECHNOLOGIES", + [3]byte{0, 21, 73}: "Dixtal Biomedica Ind. Com. Ltda", + [3]byte{0, 21, 74}: "WANSHIH ELECTRONIC CO., LTD", + [3]byte{0, 21, 75}: "Wonde Proud Technology Co., Ltd", + [3]byte{0, 21, 76}: "Saunders Electronics", + [3]byte{0, 21, 77}: "Netronome Systems, Inc.", + [3]byte{0, 21, 78}: "IEC", + [3]byte{0, 21, 79}: "one RF Technology", + [3]byte{0, 21, 80}: "Nits Technology Inc", + [3]byte{0, 21, 81}: "RadioPulse Inc.", + [3]byte{0, 21, 82}: "Wi-Gear Inc.", + [3]byte{0, 21, 83}: "Cytyc Corporation", + [3]byte{0, 21, 84}: "Atalum Wireless S.A.", + [3]byte{0, 21, 85}: "DFM GmbH", + [3]byte{0, 21, 86}: "Sagemcom Broadband SAS", + [3]byte{0, 21, 87}: "Olivetti", + [3]byte{0, 21, 88}: "FOXCONN", + [3]byte{0, 21, 89}: "Securaplane Technologies, Inc.", + [3]byte{0, 21, 90}: "DAINIPPON PHARMACEUTICAL CO., LTD.", + [3]byte{0, 21, 91}: "Sampo Corporation", + [3]byte{0, 21, 92}: "Dresser Wayne", + [3]byte{0, 21, 93}: "Microsoft Corporation", + [3]byte{0, 21, 94}: "Morgan Stanley", + [3]byte{0, 21, 95}: "GreenPeak Technologies", + [3]byte{0, 21, 96}: "Hewlett Packard", + [3]byte{0, 21, 97}: "JJPlus Corporation", + [3]byte{0, 21, 98}: "Cisco Systems, Inc", + [3]byte{0, 21, 99}: "Cisco Systems, Inc", + [3]byte{0, 21, 100}: "BEHRINGER Spezielle Studiotechnik GmbH", + [3]byte{0, 21, 101}: "XIAMEN YEALINK NETWORK TECHNOLOGY CO.,LTD", + [3]byte{0, 21, 102}: "A-First Technology Co., Ltd.", + [3]byte{0, 21, 103}: "RADWIN Inc.", + [3]byte{0, 21, 104}: "Dilithium Networks", + [3]byte{0, 21, 105}: "PECO II, Inc.", + [3]byte{0, 21, 106}: "DG2L Technologies Pvt. Ltd.", + [3]byte{0, 21, 107}: "Perfisans Networks Corp.", + [3]byte{0, 21, 108}: "SANE SYSTEM CO., LTD", + [3]byte{0, 21, 109}: "Ubiquiti Networks Inc.", + [3]byte{0, 21, 110}: "A. W. Communication Systems Ltd", + [3]byte{0, 21, 111}: "Xiranet Communications GmbH", + [3]byte{0, 21, 112}: "Zebra Technologies Inc", + [3]byte{0, 21, 113}: "Nolan Systems", + [3]byte{0, 21, 114}: "Red-Lemon", + [3]byte{0, 21, 115}: "NewSoft Technology Corporation", + [3]byte{0, 21, 116}: "Horizon Semiconductors Ltd.", + [3]byte{0, 21, 117}: "Nevis Networks Inc.", + [3]byte{0, 21, 118}: "LABiTec - Labor Biomedical Technologies GmbH", + [3]byte{0, 21, 119}: "Allied Telesis, Inc.", + [3]byte{0, 21, 120}: "Audio / Video Innovations", + [3]byte{0, 21, 121}: "Lunatone Industrielle Elektronik GmbH", + [3]byte{0, 21, 122}: "Telefin S.p.A.", + [3]byte{0, 21, 123}: "Leuze electronic GmbH + Co. KG", + [3]byte{0, 21, 124}: "Dave Networks, Inc.", + [3]byte{0, 21, 125}: "POSDATA", + [3]byte{0, 21, 126}: "Weidmüller Interface GmbH & Co. KG", + [3]byte{0, 21, 127}: "ChuanG International Holding CO.,LTD.", + [3]byte{0, 21, 128}: "U-WAY CORPORATION", + [3]byte{0, 21, 129}: "MAKUS Inc.", + [3]byte{0, 21, 130}: "Pulse Eight Limited", + [3]byte{0, 21, 131}: "IVT corporation", + [3]byte{0, 21, 132}: "Schenck Process GmbH", + [3]byte{0, 21, 133}: "Aonvision Technolopy Corp.", + [3]byte{0, 21, 134}: "Xiamen Overseas Chinese Electronic Co., Ltd.", + [3]byte{0, 21, 135}: "Takenaka Seisakusho Co.,Ltd", + [3]byte{0, 21, 136}: "Salutica Allied Solutions Sdn Bhd", + [3]byte{0, 21, 137}: "D-MAX Technology Co.,Ltd", + [3]byte{0, 21, 138}: "SURECOM Technology Corp.", + [3]byte{0, 21, 139}: "Park Air Systems Ltd", + [3]byte{0, 21, 140}: "Liab ApS", + [3]byte{0, 21, 141}: "Jennic Ltd", + [3]byte{0, 21, 142}: "Plustek.INC", + [3]byte{0, 21, 143}: "NTT Advanced Technology Corporation", + [3]byte{0, 21, 144}: "Hectronic GmbH", + [3]byte{0, 21, 145}: "RLW Inc.", + [3]byte{0, 21, 146}: "Facom UK Ltd (Melksham)", + [3]byte{0, 21, 147}: "U4EA Technologies Inc.", + [3]byte{0, 21, 148}: "BIXOLON CO.,LTD", + [3]byte{0, 21, 149}: "Quester Tangent Corporation", + [3]byte{0, 21, 150}: "ARRIS Group, Inc.", + [3]byte{0, 21, 151}: "AETA AUDIO SYSTEMS", + [3]byte{0, 21, 152}: "Kolektor group", + [3]byte{0, 21, 153}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 21, 154}: "ARRIS Group, Inc.", + [3]byte{0, 21, 155}: "Nortel Networks", + [3]byte{0, 21, 156}: "B-KYUNG SYSTEM Co.,Ltd.", + [3]byte{0, 21, 157}: "Tripp Lite", + [3]byte{0, 21, 158}: "Mad Catz Interactive Inc", + [3]byte{0, 21, 159}: "Terascala, Inc.", + [3]byte{0, 21, 160}: "Nokia Danmark A/S", + [3]byte{0, 21, 161}: "ECA-SINTERS", + [3]byte{0, 21, 162}: "ARRIS Group, Inc.", + [3]byte{0, 21, 163}: "ARRIS Group, Inc.", + [3]byte{0, 21, 164}: "ARRIS Group, Inc.", + [3]byte{0, 21, 165}: "DCI Co., Ltd.", + [3]byte{0, 21, 166}: "Digital Electronics Products Ltd.", + [3]byte{0, 21, 167}: "Robatech AG", + [3]byte{0, 21, 168}: "ARRIS Group, Inc.", + [3]byte{0, 21, 169}: "KWANG WOO I&C CO.,LTD", + [3]byte{0, 21, 170}: "Rextechnik International Co.,", + [3]byte{0, 21, 171}: "PRO CO SOUND INC", + [3]byte{0, 21, 172}: "Capelon AB", + [3]byte{0, 21, 173}: "Accedian Networks", + [3]byte{0, 21, 174}: "kyung il", + [3]byte{0, 21, 175}: "AzureWave Technology Inc.", + [3]byte{0, 21, 176}: "AUTOTELENET CO.,LTD", + [3]byte{0, 21, 177}: "Ambient Corporation", + [3]byte{0, 21, 178}: "Advanced Industrial Computer, Inc.", + [3]byte{0, 21, 179}: "Caretech AB", + [3]byte{0, 21, 180}: "Polymap Wireless LLC", + [3]byte{0, 21, 181}: "CI Network Corp.", + [3]byte{0, 21, 182}: "ShinMaywa Industries, Ltd.", + [3]byte{0, 21, 183}: "Toshiba", + [3]byte{0, 21, 184}: "Tahoe", + [3]byte{0, 21, 185}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 21, 186}: "iba AG", + [3]byte{0, 21, 187}: "SMA Solar Technology AG", + [3]byte{0, 21, 188}: "Develco", + [3]byte{0, 21, 189}: "Group 4 Technology Ltd", + [3]byte{0, 21, 190}: "Iqua Ltd.", + [3]byte{0, 21, 191}: "technicob", + [3]byte{0, 21, 192}: "DIGITAL TELEMEDIA CO.,LTD.", + [3]byte{0, 21, 193}: "Sony Interactive Entertainment Inc.", + [3]byte{0, 21, 194}: "3M Germany", + [3]byte{0, 21, 195}: "Ruf Telematik AG", + [3]byte{0, 21, 196}: "FLOVEL CO., LTD.", + [3]byte{0, 21, 197}: "Dell Inc.", + [3]byte{0, 21, 198}: "Cisco Systems, Inc", + [3]byte{0, 21, 199}: "Cisco Systems, Inc", + [3]byte{0, 21, 200}: "FlexiPanel Ltd", + [3]byte{0, 21, 201}: "Gumstix, Inc", + [3]byte{0, 21, 202}: "TeraRecon, Inc.", + [3]byte{0, 21, 203}: "Surf Communication Solutions Ltd.", + [3]byte{0, 21, 204}: "UQUEST, LTD.", + [3]byte{0, 21, 205}: "Exartech International Corp.", + [3]byte{0, 21, 206}: "ARRIS Group, Inc.", + [3]byte{0, 21, 207}: "ARRIS Group, Inc.", + [3]byte{0, 21, 208}: "ARRIS Group, Inc.", + [3]byte{0, 21, 209}: "ARRIS Group, Inc.", + [3]byte{0, 21, 210}: "Xantech Corporation", + [3]byte{0, 21, 211}: "Pantech&Curitel Communications, Inc.", + [3]byte{0, 21, 212}: "Emitor AB", + [3]byte{0, 21, 213}: "NICEVT", + [3]byte{0, 21, 214}: "OSLiNK Sp. z o.o.", + [3]byte{0, 21, 215}: "Reti Corporation", + [3]byte{0, 21, 216}: "Interlink Electronics", + [3]byte{0, 21, 217}: "PKC Electronics Oy", + [3]byte{0, 21, 218}: "IRITEL A.D.", + [3]byte{0, 21, 219}: "Canesta Inc.", + [3]byte{0, 21, 220}: "KT&C Co., Ltd.", + [3]byte{0, 21, 221}: "IP Control Systems Ltd.", + [3]byte{0, 21, 222}: "Nokia Danmark A/S", + [3]byte{0, 21, 223}: "Clivet S.p.A.", + [3]byte{0, 21, 224}: "Ericsson", + [3]byte{0, 21, 225}: "Picochip Ltd", + [3]byte{0, 21, 226}: "Dr.Ing. Herbert Knauer GmbH", + [3]byte{0, 21, 227}: "Dream Technologies Corporation", + [3]byte{0, 21, 228}: "Zimmer Elektromedizin", + [3]byte{0, 21, 229}: "Cheertek Inc.", + [3]byte{0, 21, 230}: "MOBILE TECHNIKA Inc.", + [3]byte{0, 21, 231}: "Quantec Tontechnik", + [3]byte{0, 21, 232}: "Nortel Networks", + [3]byte{0, 21, 233}: "D-Link Corporation", + [3]byte{0, 21, 234}: "Tellumat (Pty) Ltd", + [3]byte{0, 21, 235}: "zte corporation", + [3]byte{0, 21, 236}: "Boca Devices LLC", + [3]byte{0, 21, 237}: "Fulcrum Microsystems, Inc.", + [3]byte{0, 21, 238}: "Omnex Control Systems", + [3]byte{0, 21, 239}: "NEC TOKIN Corporation", + [3]byte{0, 21, 240}: "EGO BV", + [3]byte{0, 21, 241}: "KYLINK Communications Corp.", + [3]byte{0, 21, 242}: "ASUSTek COMPUTER INC.", + [3]byte{0, 21, 243}: "PELTOR AB", + [3]byte{0, 21, 244}: "Eventide", + [3]byte{0, 21, 245}: "Sustainable Energy Systems", + [3]byte{0, 21, 246}: "SCIENCE AND ENGINEERING SERVICES, INC.", + [3]byte{0, 21, 247}: "Wintecronics Ltd.", + [3]byte{0, 21, 248}: "Kingtronics Industrial Co. Ltd.", + [3]byte{0, 21, 249}: "Cisco Systems, Inc", + [3]byte{0, 21, 250}: "Cisco Systems, Inc", + [3]byte{0, 21, 251}: "setex schermuly textile computer gmbh", + [3]byte{0, 21, 252}: "Littelfuse Startco", + [3]byte{0, 21, 253}: "Complete Media Systems", + [3]byte{0, 21, 254}: "SCHILLING ROBOTICS LLC", + [3]byte{0, 21, 255}: "Novatel Wireless Solutions, Inc.", + [3]byte{0, 22, 0}: "CelleBrite Mobile Synchronization", + [3]byte{0, 22, 1}: "BUFFALO.INC", + [3]byte{0, 22, 2}: "CEYON TECHNOLOGY CO.,LTD.", + [3]byte{0, 22, 3}: "COOLKSKY Co., LTD", + [3]byte{0, 22, 4}: "Sigpro", + [3]byte{0, 22, 5}: "YORKVILLE SOUND INC.", + [3]byte{0, 22, 6}: "Ideal Industries", + [3]byte{0, 22, 7}: "Curves International Inc.", + [3]byte{0, 22, 8}: "Sequans Communications", + [3]byte{0, 22, 9}: "Unitech electronics co., ltd.", + [3]byte{0, 22, 10}: "SWEEX Europe BV", + [3]byte{0, 22, 11}: "TVWorks LLC", + [3]byte{0, 22, 12}: "LPL DEVELOPMENT S.A. DE C.V", + [3]byte{0, 22, 13}: "Be Here Corporation", + [3]byte{0, 22, 14}: "Optica Technologies Inc.", + [3]byte{0, 22, 15}: "BADGER METER INC", + [3]byte{0, 22, 16}: "Carina Technology", + [3]byte{0, 22, 17}: "Altecon Srl", + [3]byte{0, 22, 18}: "Otsuka Electronics Co., Ltd.", + [3]byte{0, 22, 19}: "LibreStream Technologies Inc.", + [3]byte{0, 22, 20}: "Picosecond Pulse Labs", + [3]byte{0, 22, 21}: "Nittan Company, Limited", + [3]byte{0, 22, 22}: "BROWAN COMMUNICATION INC.", + [3]byte{0, 22, 23}: "MSI", + [3]byte{0, 22, 24}: "HIVION Co., Ltd.", + [3]byte{0, 22, 25}: "Lancelan Technologies S.L.", + [3]byte{0, 22, 26}: "Dametric AB", + [3]byte{0, 22, 27}: "Micronet Corporation", + [3]byte{0, 22, 28}: "e:cue", + [3]byte{0, 22, 29}: "Innovative Wireless Technologies, Inc.", + [3]byte{0, 22, 30}: "Woojinnet", + [3]byte{0, 22, 31}: "SUNWAVETEC Co., Ltd.", + [3]byte{0, 22, 32}: "Sony Mobile Communications AB", + [3]byte{0, 22, 33}: "Colorado Vnet", + [3]byte{0, 22, 34}: "BBH SYSTEMS GMBH", + [3]byte{0, 22, 35}: "Interval Media", + [3]byte{0, 22, 36}: "Teneros, Inc.", + [3]byte{0, 22, 37}: "Impinj, Inc.", + [3]byte{0, 22, 38}: "ARRIS Group, Inc.", + [3]byte{0, 22, 39}: "embedded-logic DESIGN AND MORE GmbH", + [3]byte{0, 22, 40}: "Magicard Ltd", + [3]byte{0, 22, 41}: "Nivus GmbH", + [3]byte{0, 22, 42}: "Antik computers & communications s.r.o.", + [3]byte{0, 22, 43}: "Togami Electric Mfg.co.,Ltd.", + [3]byte{0, 22, 44}: "Xanboo", + [3]byte{0, 22, 45}: "STNet Co., Ltd.", + [3]byte{0, 22, 46}: "Space Shuttle Hi-Tech Co., Ltd.", + [3]byte{0, 22, 47}: "Geutebrück GmbH", + [3]byte{0, 22, 48}: "Vativ Technologies", + [3]byte{0, 22, 49}: "Xteam", + [3]byte{0, 22, 50}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 22, 51}: "Oxford Diagnostics Ltd.", + [3]byte{0, 22, 52}: "Mathtech, Inc.", + [3]byte{0, 22, 53}: "Hewlett Packard", + [3]byte{0, 22, 54}: "QUANTA COMPUTER INC.", + [3]byte{0, 22, 55}: "CITEL SpA", + [3]byte{0, 22, 56}: "TECOM Co., Ltd.", + [3]byte{0, 22, 57}: "Ubiquam Co., Ltd.", + [3]byte{0, 22, 58}: "YVES TECHNOLOGY CO., LTD.", + [3]byte{0, 22, 59}: "VertexRSI/General Dynamics", + [3]byte{0, 22, 60}: "Rebox B.V.", + [3]byte{0, 22, 61}: "Tsinghua Tongfang Legend Silicon Tech. Co., Ltd.", + [3]byte{0, 22, 62}: "Xensource, Inc.", + [3]byte{0, 22, 63}: "CReTE SYSTEMS Inc.", + [3]byte{0, 22, 64}: "Asmobile Communication Inc.", + [3]byte{0, 22, 65}: "Universal Global Scientific Industrial Co., Ltd.", + [3]byte{0, 22, 66}: "Pangolin", + [3]byte{0, 22, 67}: "Sunhillo Corporation", + [3]byte{0, 22, 68}: "LITE-ON Technology Corp.", + [3]byte{0, 22, 69}: "Power Distribution, Inc.", + [3]byte{0, 22, 70}: "Cisco Systems, Inc", + [3]byte{0, 22, 71}: "Cisco Systems, Inc", + [3]byte{0, 22, 72}: "SSD Company Limited", + [3]byte{0, 22, 73}: "SetOne GmbH", + [3]byte{0, 22, 74}: "Vibration Technology Limited", + [3]byte{0, 22, 75}: "Quorion Data Systems GmbH", + [3]byte{0, 22, 76}: "PLANET INT Co., Ltd", + [3]byte{0, 22, 77}: "Alcatel-Lucent IPD", + [3]byte{0, 22, 78}: "Nokia Danmark A/S", + [3]byte{0, 22, 79}: "World Ethnic Broadcastin Inc.", + [3]byte{0, 22, 80}: "Kratos EPD", + [3]byte{0, 22, 81}: "Exeo Systems", + [3]byte{0, 22, 82}: "Hoatech Technologies, Inc.", + [3]byte{0, 22, 83}: "LEGO System A/S IE Electronics Division", + [3]byte{0, 22, 84}: "Flex-P Industries Sdn. Bhd.", + [3]byte{0, 22, 85}: "FUHO TECHNOLOGY Co., LTD", + [3]byte{0, 22, 86}: "Nintendo Co., Ltd.", + [3]byte{0, 22, 87}: "Aegate Ltd", + [3]byte{0, 22, 88}: "Fusiontech Technologies Inc.", + [3]byte{0, 22, 89}: "Z.M.P. RADWAG", + [3]byte{0, 22, 90}: "Harman Specialty Group", + [3]byte{0, 22, 91}: "Grip Audio", + [3]byte{0, 22, 92}: "Trackflow Ltd", + [3]byte{0, 22, 93}: "AirDefense, Inc.", + [3]byte{0, 22, 94}: "Precision I/O", + [3]byte{0, 22, 95}: "Fairmount Automation", + [3]byte{0, 22, 96}: "Nortel Networks", + [3]byte{0, 22, 97}: "Novatium Solutions (P) Ltd", + [3]byte{0, 22, 98}: "Liyuh Technology Ltd.", + [3]byte{0, 22, 99}: "KBT Mobile", + [3]byte{0, 22, 100}: "Prod-El SpA", + [3]byte{0, 22, 101}: "Cellon France", + [3]byte{0, 22, 102}: "Quantier Communication Inc.", + [3]byte{0, 22, 103}: "A-TEC Subsystem INC.", + [3]byte{0, 22, 104}: "Eishin Electronics", + [3]byte{0, 22, 105}: "MRV Communication (Networks) LTD", + [3]byte{0, 22, 106}: "TPS", + [3]byte{0, 22, 107}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 22, 108}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 22, 109}: "Yulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd", + [3]byte{0, 22, 110}: "Arbitron Inc.", + [3]byte{0, 22, 111}: "Intel Corporate", + [3]byte{0, 22, 112}: "SKNET Corporation", + [3]byte{0, 22, 113}: "Symphox Information Co.", + [3]byte{0, 22, 114}: "Zenway enterprise ltd", + [3]byte{0, 22, 115}: "Bury GmbH & Co. KG", + [3]byte{0, 22, 116}: "EuroCB (Phils.), Inc.", + [3]byte{0, 22, 117}: "ARRIS Group, Inc.", + [3]byte{0, 22, 118}: "Intel Corporate", + [3]byte{0, 22, 119}: "Bihl + Wiedemann GmbH", + [3]byte{0, 22, 120}: "SHENZHEN BAOAN GAOKE ELECTRONICS CO., LTD", + [3]byte{0, 22, 121}: "eOn Communications", + [3]byte{0, 22, 122}: "Skyworth Overseas Development Ltd.", + [3]byte{0, 22, 123}: "Haver&Boecker", + [3]byte{0, 22, 124}: "iRex Technologies BV", + [3]byte{0, 22, 125}: "Sky-Line Information Co., Ltd.", + [3]byte{0, 22, 126}: "DIBOSS.CO.,LTD", + [3]byte{0, 22, 127}: "Bluebird Soft Inc.", + [3]byte{0, 22, 128}: "Bally Gaming + Systems", + [3]byte{0, 22, 129}: "Vector Informatik GmbH", + [3]byte{0, 22, 130}: "Pro Dex, Inc", + [3]byte{0, 22, 131}: "WEBIO International Co.,.Ltd.", + [3]byte{0, 22, 132}: "Donjin Co.,Ltd.", + [3]byte{0, 22, 133}: "Elisa Oyj", + [3]byte{0, 22, 134}: "Karl Storz Imaging", + [3]byte{0, 22, 135}: "Chubb CSC-Vendor AP", + [3]byte{0, 22, 136}: "ServerEngines LLC", + [3]byte{0, 22, 137}: "Pilkor Electronics Co., Ltd", + [3]byte{0, 22, 138}: "id-Confirm Inc", + [3]byte{0, 22, 139}: "Paralan Corporation", + [3]byte{0, 22, 140}: "DSL Partner AS", + [3]byte{0, 22, 141}: "KORWIN CO., Ltd.", + [3]byte{0, 22, 142}: "Vimicro corporation", + [3]byte{0, 22, 143}: "GN Netcom A/S", + [3]byte{0, 22, 144}: "J-TEK INCORPORATION", + [3]byte{0, 22, 145}: "Moser-Baer AG", + [3]byte{0, 22, 146}: "Scientific-Atlanta, Inc.", + [3]byte{0, 22, 147}: "PowerLink Technology Inc.", + [3]byte{0, 22, 148}: "Sennheiser Communications A/S", + [3]byte{0, 22, 149}: "AVC Technology (International) Limited", + [3]byte{0, 22, 150}: "QDI Technology (H.K.) Limited", + [3]byte{0, 22, 151}: "NEC Corporation", + [3]byte{0, 22, 152}: "T&A Mobile Phones", + [3]byte{0, 22, 153}: "Tonic DVB Marketing Ltd", + [3]byte{0, 22, 154}: "Quadrics Ltd", + [3]byte{0, 22, 155}: "Alstom Transport", + [3]byte{0, 22, 156}: "Cisco Systems, Inc", + [3]byte{0, 22, 157}: "Cisco Systems, Inc", + [3]byte{0, 22, 158}: "TV One Ltd", + [3]byte{0, 22, 159}: "Vimtron Electronics Co., Ltd.", + [3]byte{0, 22, 160}: "Auto-Maskin", + [3]byte{0, 22, 161}: "3Leaf Networks", + [3]byte{0, 22, 162}: "CentraLite Systems, Inc.", + [3]byte{0, 22, 163}: "Ingeteam Transmission&Distribution, S.A.", + [3]byte{0, 22, 164}: "Ezurio Ltd", + [3]byte{0, 22, 165}: "Tandberg Storage ASA", + [3]byte{0, 22, 166}: "Dovado FZ-LLC", + [3]byte{0, 22, 167}: "AWETA G&P", + [3]byte{0, 22, 168}: "CWT CO., LTD.", + [3]byte{0, 22, 169}: "2EI", + [3]byte{0, 22, 170}: "Kei Communication Technology Inc.", + [3]byte{0, 22, 171}: "Dansensor A/S", + [3]byte{0, 22, 172}: "Toho Technology Corp.", + [3]byte{0, 22, 173}: "BT-Links Company Limited", + [3]byte{0, 22, 174}: "INVENTEL", + [3]byte{0, 22, 175}: "Shenzhen Union Networks Equipment Co.,Ltd.", + [3]byte{0, 22, 176}: "VK Corporation", + [3]byte{0, 22, 177}: "KBS", + [3]byte{0, 22, 178}: "DriveCam Inc", + [3]byte{0, 22, 179}: "Photonicbridges (China) Co., Ltd.", + [3]byte{0, 22, 180}: "Private", + [3]byte{0, 22, 181}: "ARRIS Group, Inc.", + [3]byte{0, 22, 182}: "Cisco-Linksys, LLC", + [3]byte{0, 22, 183}: "Seoul Commtech", + [3]byte{0, 22, 184}: "Sony Mobile Communications AB", + [3]byte{0, 22, 185}: "ProCurve Networking by HP", + [3]byte{0, 22, 186}: "WEATHERNEWS INC.", + [3]byte{0, 22, 187}: "Law-Chain Computer Technology Co Ltd", + [3]byte{0, 22, 188}: "Nokia Danmark A/S", + [3]byte{0, 22, 189}: "ATI Industrial Automation", + [3]byte{0, 22, 190}: "INFRANET, Inc.", + [3]byte{0, 22, 191}: "PaloDEx Group Oy", + [3]byte{0, 22, 192}: "Semtech Corporation", + [3]byte{0, 22, 193}: "Eleksen Ltd", + [3]byte{0, 22, 194}: "Avtec Systems Inc", + [3]byte{0, 22, 195}: "BA Systems Inc", + [3]byte{0, 22, 196}: "SiRF Technology, Inc.", + [3]byte{0, 22, 197}: "Shenzhen Xing Feng Industry Co.,Ltd", + [3]byte{0, 22, 198}: "North Atlantic Industries", + [3]byte{0, 22, 199}: "Cisco Systems, Inc", + [3]byte{0, 22, 200}: "Cisco Systems, Inc", + [3]byte{0, 22, 201}: "NAT Seattle, Inc.", + [3]byte{0, 22, 202}: "Nortel Networks", + [3]byte{0, 22, 203}: "Apple, Inc.", + [3]byte{0, 22, 204}: "Xcute Mobile Corp.", + [3]byte{0, 22, 205}: "HIJI HIGH-TECH CO., LTD.", + [3]byte{0, 22, 206}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{0, 22, 207}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{0, 22, 208}: "ATech elektronika d.o.o.", + [3]byte{0, 22, 209}: "ZAT a.s.", + [3]byte{0, 22, 210}: "Caspian", + [3]byte{0, 22, 211}: "Wistron Corporation", + [3]byte{0, 22, 212}: "Compal Communications, Inc.", + [3]byte{0, 22, 213}: "Synccom Co., Ltd", + [3]byte{0, 22, 214}: "TDA Tech Pty Ltd", + [3]byte{0, 22, 215}: "Sunways AG", + [3]byte{0, 22, 216}: "Senea AB", + [3]byte{0, 22, 217}: "NINGBO BIRD CO.,LTD.", + [3]byte{0, 22, 218}: "Futronic Technology Co. Ltd.", + [3]byte{0, 22, 219}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 22, 220}: "ARCHOS", + [3]byte{0, 22, 221}: "Gigabeam Corporation", + [3]byte{0, 22, 222}: "FAST Inc", + [3]byte{0, 22, 223}: "Lundinova AB", + [3]byte{0, 22, 224}: "3Com Ltd", + [3]byte{0, 22, 225}: "SiliconStor, Inc.", + [3]byte{0, 22, 226}: "American Fibertek, Inc.", + [3]byte{0, 22, 227}: "ASKEY COMPUTER CORP", + [3]byte{0, 22, 228}: "VANGUARD SECURITY ENGINEERING CORP.", + [3]byte{0, 22, 229}: "FORDLEY DEVELOPMENT LIMITED", + [3]byte{0, 22, 230}: "GIGA-BYTE TECHNOLOGY CO.,LTD.", + [3]byte{0, 22, 231}: "Dynamix Promotions Limited", + [3]byte{0, 22, 232}: "Sigma Designs, Inc.", + [3]byte{0, 22, 233}: "Tiba Medical Inc", + [3]byte{0, 22, 234}: "Intel Corporate", + [3]byte{0, 22, 235}: "Intel Corporate", + [3]byte{0, 22, 236}: "Elitegroup Computer Systems Co.,Ltd.", + [3]byte{0, 22, 237}: "Utility, Inc", + [3]byte{0, 22, 238}: "Royaldigital Inc.", + [3]byte{0, 22, 239}: "Koko Fitness, Inc.", + [3]byte{0, 22, 240}: "Dell", + [3]byte{0, 22, 241}: "OmniSense, LLC", + [3]byte{0, 22, 242}: "Dmobile System Co., Ltd.", + [3]byte{0, 22, 243}: "CAST Information Co., Ltd", + [3]byte{0, 22, 244}: "Eidicom Co., Ltd.", + [3]byte{0, 22, 245}: "Dalian Golden Hualu Digital Technology Co.,Ltd", + [3]byte{0, 22, 246}: "Video Products Group", + [3]byte{0, 22, 247}: "L-3 Communications, Aviation Recorders", + [3]byte{0, 22, 248}: "AVIQTECH TECHNOLOGY CO., LTD.", + [3]byte{0, 22, 249}: "CETRTA POT, d.o.o., Kranj", + [3]byte{0, 22, 250}: "ECI Telecom Ltd.", + [3]byte{0, 22, 251}: "SHENZHEN MTC CO LTD", + [3]byte{0, 22, 252}: "TOHKEN CO.,LTD.", + [3]byte{0, 22, 253}: "Jaty Electronics", + [3]byte{0, 22, 254}: "ALPS ELECTRIC CO.,LTD.", + [3]byte{0, 22, 255}: "Wamin Optocomm Mfg Corp", + [3]byte{0, 23, 0}: "ARRIS Group, Inc.", + [3]byte{0, 23, 1}: "KDE, Inc.", + [3]byte{0, 23, 2}: "Osung Midicom Co., Ltd", + [3]byte{0, 23, 3}: "MOSDAN Internation Co.,Ltd", + [3]byte{0, 23, 4}: "Shinco Electronics Group Co.,Ltd", + [3]byte{0, 23, 5}: "Methode Electronics", + [3]byte{0, 23, 6}: "Techfaithwireless Communication Technology Limited.", + [3]byte{0, 23, 7}: "InGrid, Inc", + [3]byte{0, 23, 8}: "Hewlett Packard", + [3]byte{0, 23, 9}: "Exalt Communications", + [3]byte{0, 23, 10}: "INEW DIGITAL COMPANY", + [3]byte{0, 23, 11}: "Contela, Inc.", + [3]byte{0, 23, 12}: "Twig Com Ltd.", + [3]byte{0, 23, 13}: "Dust Networks Inc.", + [3]byte{0, 23, 14}: "Cisco Systems, Inc", + [3]byte{0, 23, 15}: "Cisco Systems, Inc", + [3]byte{0, 23, 16}: "Casa Systems Inc.", + [3]byte{0, 23, 17}: "GE Healthcare Bio-Sciences AB", + [3]byte{0, 23, 18}: "ISCO International", + [3]byte{0, 23, 19}: "Tiger NetCom", + [3]byte{0, 23, 20}: "BR Controls Nederland bv", + [3]byte{0, 23, 21}: "Qstik", + [3]byte{0, 23, 22}: "Qno Technology Inc.", + [3]byte{0, 23, 23}: "Leica Geosystems AG", + [3]byte{0, 23, 24}: "Vansco Electronics Oy", + [3]byte{0, 23, 25}: "Audiocodes USA, Inc", + [3]byte{0, 23, 26}: "Winegard Company", + [3]byte{0, 23, 27}: "Innovation Lab Corp.", + [3]byte{0, 23, 28}: "NT MicroSystems, Inc.", + [3]byte{0, 23, 29}: "DIGIT", + [3]byte{0, 23, 30}: "Theo Benning GmbH & Co. KG", + [3]byte{0, 23, 31}: "IMV Corporation", + [3]byte{0, 23, 32}: "Image Sensing Systems, Inc.", + [3]byte{0, 23, 33}: "FITRE S.p.A.", + [3]byte{0, 23, 34}: "Hanazeder Electronic GmbH", + [3]byte{0, 23, 35}: "Summit Data Communications", + [3]byte{0, 23, 36}: "Studer Professional Audio GmbH", + [3]byte{0, 23, 37}: "Liquid Computing", + [3]byte{0, 23, 38}: "m2c Electronic Technology Ltd.", + [3]byte{0, 23, 39}: "Thermo Ramsey Italia s.r.l.", + [3]byte{0, 23, 40}: "Selex Communications", + [3]byte{0, 23, 41}: "Ubicod Co.LTD", + [3]byte{0, 23, 42}: "Proware Technology Corp.(By Unifosa)", + [3]byte{0, 23, 43}: "Global Technologies Inc.", + [3]byte{0, 23, 44}: "TAEJIN INFOTECH", + [3]byte{0, 23, 45}: "Axcen Photonics Corporation", + [3]byte{0, 23, 46}: "FXC Inc.", + [3]byte{0, 23, 47}: "NeuLion Incorporated", + [3]byte{0, 23, 48}: "Automation Electronics", + [3]byte{0, 23, 49}: "ASUSTek COMPUTER INC.", + [3]byte{0, 23, 50}: "Science-Technical Center RISSA", + [3]byte{0, 23, 51}: "SFR", + [3]byte{0, 23, 52}: "ADC Telecommunications", + [3]byte{0, 23, 53}: "Intel Wireless Network Group", + [3]byte{0, 23, 54}: "iiTron Inc.", + [3]byte{0, 23, 55}: "Industrie Dial Face S.p.A.", + [3]byte{0, 23, 56}: "International Business Machines", + [3]byte{0, 23, 57}: "Bright Headphone Electronics Company", + [3]byte{0, 23, 58}: "Cloudastructure Inc", + [3]byte{0, 23, 59}: "Cisco Systems, Inc", + [3]byte{0, 23, 60}: "Extreme Engineering Solutions", + [3]byte{0, 23, 61}: "Neology", + [3]byte{0, 23, 62}: "LeucotronEquipamentos Ltda.", + [3]byte{0, 23, 63}: "Belkin International Inc.", + [3]byte{0, 23, 64}: "Bluberi Gaming Technologies Inc", + [3]byte{0, 23, 65}: "DEFIDEV", + [3]byte{0, 23, 66}: "FUJITSU LIMITED", + [3]byte{0, 23, 67}: "Deck Srl", + [3]byte{0, 23, 68}: "Araneo Ltd.", + [3]byte{0, 23, 69}: "INNOTZ CO., Ltd", + [3]byte{0, 23, 70}: "Freedom9 Inc.", + [3]byte{0, 23, 71}: "Trimble", + [3]byte{0, 23, 72}: "Neokoros Brasil Ltda", + [3]byte{0, 23, 73}: "HYUNDAE YONG-O-SA CO.,LTD", + [3]byte{0, 23, 74}: "SOCOMEC", + [3]byte{0, 23, 75}: "Nokia Danmark A/S", + [3]byte{0, 23, 76}: "Millipore", + [3]byte{0, 23, 77}: "DYNAMIC NETWORK FACTORY, INC.", + [3]byte{0, 23, 78}: "Parama-tech Co.,Ltd.", + [3]byte{0, 23, 79}: "iCatch Inc.", + [3]byte{0, 23, 80}: "GSI Group, MicroE Systems", + [3]byte{0, 23, 81}: "Online Corporation", + [3]byte{0, 23, 82}: "DAGS, Inc", + [3]byte{0, 23, 83}: "nFore Technology Inc.", + [3]byte{0, 23, 84}: "Arkino HiTOP Corporation Limited", + [3]byte{0, 23, 85}: "GE Security", + [3]byte{0, 23, 86}: "Vinci Labs Oy", + [3]byte{0, 23, 87}: "RIX TECHNOLOGY LIMITED", + [3]byte{0, 23, 88}: "ThruVision Ltd", + [3]byte{0, 23, 89}: "Cisco Systems, Inc", + [3]byte{0, 23, 90}: "Cisco Systems, Inc", + [3]byte{0, 23, 91}: "ACS Solutions Switzerland Ltd.", + [3]byte{0, 23, 92}: "SHARP CORPORATION", + [3]byte{0, 23, 93}: "Dongseo system.", + [3]byte{0, 23, 94}: "Zed-3", + [3]byte{0, 23, 95}: "XENOLINK Communications Co., Ltd.", + [3]byte{0, 23, 96}: "Naito Densei Machida MFG.CO.,LTD", + [3]byte{0, 23, 97}: "Private", + [3]byte{0, 23, 98}: "Solar Technology, Inc.", + [3]byte{0, 23, 99}: "Essentia S.p.A.", + [3]byte{0, 23, 100}: "ATMedia GmbH", + [3]byte{0, 23, 101}: "Nortel Networks", + [3]byte{0, 23, 102}: "Accense Technology, Inc.", + [3]byte{0, 23, 103}: "Earforce AS", + [3]byte{0, 23, 104}: "Zinwave Ltd", + [3]byte{0, 23, 105}: "Cymphonix Corp", + [3]byte{0, 23, 106}: "Avago Technologies", + [3]byte{0, 23, 107}: "Kiyon, Inc.", + [3]byte{0, 23, 108}: "Pivot3, Inc.", + [3]byte{0, 23, 109}: "CORE CORPORATION", + [3]byte{0, 23, 110}: "DUCATI SISTEMI", + [3]byte{0, 23, 111}: "PAX Computer Technology(Shenzhen) Ltd.", + [3]byte{0, 23, 112}: "Arti Industrial Electronics Ltd.", + [3]byte{0, 23, 113}: "APD Communications Ltd", + [3]byte{0, 23, 114}: "ASTRO Strobel Kommunikationssysteme GmbH", + [3]byte{0, 23, 115}: "Laketune Technologies Co. Ltd", + [3]byte{0, 23, 116}: "Elesta GmbH", + [3]byte{0, 23, 117}: "TTE Germany GmbH", + [3]byte{0, 23, 118}: "Meso Scale Diagnostics, LLC", + [3]byte{0, 23, 119}: "Obsidian Research Corporation", + [3]byte{0, 23, 120}: "Central Music Co.", + [3]byte{0, 23, 121}: "QuickTel", + [3]byte{0, 23, 122}: "ASSA ABLOY AB", + [3]byte{0, 23, 123}: "Azalea Networks inc", + [3]byte{0, 23, 124}: "Smartlink Network Systems Limited", + [3]byte{0, 23, 125}: "IDT Technology Limited", + [3]byte{0, 23, 126}: "Meshcom Technologies Inc.", + [3]byte{0, 23, 127}: "Worldsmart Retech", + [3]byte{0, 23, 128}: "Applied Biosystems B.V.", + [3]byte{0, 23, 129}: "Greystone Data System, Inc.", + [3]byte{0, 23, 130}: "LoBenn Inc.", + [3]byte{0, 23, 131}: "Texas Instruments", + [3]byte{0, 23, 132}: "ARRIS Group, Inc.", + [3]byte{0, 23, 133}: "Sparr Electronics Ltd", + [3]byte{0, 23, 134}: "wisembed", + [3]byte{0, 23, 135}: "Brother, Brother & Sons ApS", + [3]byte{0, 23, 136}: "Philips Lighting BV", + [3]byte{0, 23, 137}: "Zenitron Corporation", + [3]byte{0, 23, 138}: "DARTS TECHNOLOGIES CORP.", + [3]byte{0, 23, 139}: "Teledyne Technologies Incorporated", + [3]byte{0, 23, 140}: "Independent Witness, Inc", + [3]byte{0, 23, 141}: "Checkpoint Systems, Inc.", + [3]byte{0, 23, 142}: "Gunnebo Cash Automation AB", + [3]byte{0, 23, 143}: "NINGBO YIDONG ELECTRONIC CO.,LTD.", + [3]byte{0, 23, 144}: "HYUNDAI DIGITECH Co, Ltd.", + [3]byte{0, 23, 145}: "LinTech GmbH", + [3]byte{0, 23, 146}: "Falcom Wireless Comunications Gmbh", + [3]byte{0, 23, 147}: "Tigi Corporation", + [3]byte{0, 23, 148}: "Cisco Systems, Inc", + [3]byte{0, 23, 149}: "Cisco Systems, Inc", + [3]byte{0, 23, 150}: "Rittmeyer AG", + [3]byte{0, 23, 151}: "Telsy Elettronica S.p.A.", + [3]byte{0, 23, 152}: "Azonic Technology Co., LTD", + [3]byte{0, 23, 153}: "SmarTire Systems Inc.", + [3]byte{0, 23, 154}: "D-Link Corporation", + [3]byte{0, 23, 155}: "CHANT SINCERE CO.,LTD", + [3]byte{0, 23, 156}: "DEPRAG SCHULZ GMBH u. CO.", + [3]byte{0, 23, 157}: "Kelman Limited", + [3]byte{0, 23, 158}: "Sirit Inc", + [3]byte{0, 23, 159}: "Apricorn", + [3]byte{0, 23, 160}: "RoboTech srl", + [3]byte{0, 23, 161}: "3soft inc.", + [3]byte{0, 23, 162}: "Camrivox Ltd.", + [3]byte{0, 23, 163}: "MIX s.r.l.", + [3]byte{0, 23, 164}: "Hewlett Packard", + [3]byte{0, 23, 165}: "Ralink Technology Corp", + [3]byte{0, 23, 166}: "YOSIN ELECTRONICS CO., LTD.", + [3]byte{0, 23, 167}: "Mobile Computing Promotion Consortium", + [3]byte{0, 23, 168}: "EDM Corporation", + [3]byte{0, 23, 169}: "Sentivision", + [3]byte{0, 23, 170}: "elab-experience inc.", + [3]byte{0, 23, 171}: "Nintendo Co., Ltd.", + [3]byte{0, 23, 172}: "O'Neil Product Development Inc.", + [3]byte{0, 23, 173}: "AceNet Corporation", + [3]byte{0, 23, 174}: "GAI-Tronics", + [3]byte{0, 23, 175}: "Enermet", + [3]byte{0, 23, 176}: "Nokia Danmark A/S", + [3]byte{0, 23, 177}: "ACIST Medical Systems, Inc.", + [3]byte{0, 23, 178}: "SK Telesys", + [3]byte{0, 23, 179}: "Aftek Infosys Limited", + [3]byte{0, 23, 180}: "Remote Security Systems, LLC", + [3]byte{0, 23, 181}: "Peerless Systems Corporation", + [3]byte{0, 23, 182}: "Aquantia", + [3]byte{0, 23, 183}: "Tonze Technology Co.", + [3]byte{0, 23, 184}: "NOVATRON CO., LTD.", + [3]byte{0, 23, 185}: "Gambro Lundia AB", + [3]byte{0, 23, 186}: "SEDO CO., LTD.", + [3]byte{0, 23, 187}: "Syrinx Industrial Electronics", + [3]byte{0, 23, 188}: "Touchtunes Music Corporation", + [3]byte{0, 23, 189}: "Tibetsystem", + [3]byte{0, 23, 190}: "Tratec Telecom B.V.", + [3]byte{0, 23, 191}: "Coherent Research Limited", + [3]byte{0, 23, 192}: "PureTech Systems, Inc.", + [3]byte{0, 23, 193}: "CM Precision Technology LTD.", + [3]byte{0, 23, 194}: "ADB Broadband Italia", + [3]byte{0, 23, 195}: "KTF Technologies Inc.", + [3]byte{0, 23, 196}: "Quanta Microsystems, INC.", + [3]byte{0, 23, 197}: "SonicWALL", + [3]byte{0, 23, 198}: "Cross Match Technologies Inc", + [3]byte{0, 23, 199}: "MARA Systems Consulting AB", + [3]byte{0, 23, 200}: "KYOCERA Display Corporation", + [3]byte{0, 23, 201}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 23, 202}: "Qisda Corporation", + [3]byte{0, 23, 203}: "Juniper Networks", + [3]byte{0, 23, 204}: "Alcatel-Lucent", + [3]byte{0, 23, 205}: "CEC Wireless R&D Ltd.", + [3]byte{0, 23, 206}: "Screen Service Spa", + [3]byte{0, 23, 207}: "iMCA-GmbH", + [3]byte{0, 23, 208}: "Opticom Communications, LLC", + [3]byte{0, 23, 209}: "Nortel Networks", + [3]byte{0, 23, 210}: "THINLINX PTY LTD", + [3]byte{0, 23, 211}: "Etymotic Research, Inc.", + [3]byte{0, 23, 212}: "Monsoon Multimedia, Inc", + [3]byte{0, 23, 213}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 23, 214}: "Bluechips Microhouse Co.,Ltd.", + [3]byte{0, 23, 215}: "ION Geophysical Corporation Inc.", + [3]byte{0, 23, 216}: "Magnum Semiconductor, Inc.", + [3]byte{0, 23, 217}: "AAI Corporation", + [3]byte{0, 23, 218}: "Spans Logic", + [3]byte{0, 23, 219}: "CANKO TECHNOLOGIES INC.", + [3]byte{0, 23, 220}: "DAEMYUNG ZERO1", + [3]byte{0, 23, 221}: "Clipsal Australia", + [3]byte{0, 23, 222}: "Advantage Six Ltd", + [3]byte{0, 23, 223}: "Cisco Systems, Inc", + [3]byte{0, 23, 224}: "Cisco Systems, Inc", + [3]byte{0, 23, 225}: "DACOS Technologies Co., Ltd.", + [3]byte{0, 23, 226}: "ARRIS Group, Inc.", + [3]byte{0, 23, 227}: "Texas Instruments", + [3]byte{0, 23, 228}: "Texas Instruments", + [3]byte{0, 23, 229}: "Texas Instruments", + [3]byte{0, 23, 230}: "Texas Instruments", + [3]byte{0, 23, 231}: "Texas Instruments", + [3]byte{0, 23, 232}: "Texas Instruments", + [3]byte{0, 23, 233}: "Texas Instruments", + [3]byte{0, 23, 234}: "Texas Instruments", + [3]byte{0, 23, 235}: "Texas Instruments", + [3]byte{0, 23, 236}: "Texas Instruments", + [3]byte{0, 23, 237}: "WooJooIT Ltd.", + [3]byte{0, 23, 238}: "ARRIS Group, Inc.", + [3]byte{0, 23, 239}: "IBM Corp", + [3]byte{0, 23, 240}: "SZCOM Broadband Network Technology Co.,Ltd", + [3]byte{0, 23, 241}: "Renu Electronics Pvt Ltd", + [3]byte{0, 23, 242}: "Apple, Inc.", + [3]byte{0, 23, 243}: "Harris Corparation", + [3]byte{0, 23, 244}: "ZERON ALLIANCE", + [3]byte{0, 23, 245}: "LIG NEOPTEK", + [3]byte{0, 23, 246}: "Pyramid Meriden Inc.", + [3]byte{0, 23, 247}: "CEM Solutions Pvt Ltd", + [3]byte{0, 23, 248}: "Motech Industries Inc.", + [3]byte{0, 23, 249}: "Forcom Sp. z o.o.", + [3]byte{0, 23, 250}: "Microsoft Corporation", + [3]byte{0, 23, 251}: "FA", + [3]byte{0, 23, 252}: "Suprema Inc.", + [3]byte{0, 23, 253}: "Amulet Hotkey", + [3]byte{0, 23, 254}: "TALOS SYSTEM INC.", + [3]byte{0, 23, 255}: "PLAYLINE Co.,Ltd.", + [3]byte{0, 24, 0}: "UNIGRAND LTD", + [3]byte{0, 24, 1}: "Actiontec Electronics, Inc", + [3]byte{0, 24, 2}: "Alpha Networks Inc.", + [3]byte{0, 24, 3}: "ArcSoft Shanghai Co. LTD", + [3]byte{0, 24, 4}: "E-TEK DIGITAL TECHNOLOGY LIMITED", + [3]byte{0, 24, 5}: "Beijing InHand Networking Technology Co.,Ltd.", + [3]byte{0, 24, 6}: "Hokkei Industries Co., Ltd.", + [3]byte{0, 24, 7}: "Fanstel Corp.", + [3]byte{0, 24, 8}: "SightLogix, Inc.", + [3]byte{0, 24, 9}: "CRESYN", + [3]byte{0, 24, 10}: "Cisco Meraki", + [3]byte{0, 24, 11}: "Brilliant Telecommunications", + [3]byte{0, 24, 12}: "Optelian Access Networks", + [3]byte{0, 24, 13}: "Terabytes Server Storage Tech Corp", + [3]byte{0, 24, 14}: "Avega Systems", + [3]byte{0, 24, 15}: "Nokia Danmark A/S", + [3]byte{0, 24, 16}: "IPTrade S.A.", + [3]byte{0, 24, 17}: "Neuros Technology International, LLC.", + [3]byte{0, 24, 18}: "Beijing Xinwei Telecom Technology Co., Ltd.", + [3]byte{0, 24, 19}: "Sony Mobile Communications AB", + [3]byte{0, 24, 20}: "Mitutoyo Corporation", + [3]byte{0, 24, 21}: "GZ Technologies, Inc.", + [3]byte{0, 24, 22}: "Ubixon Co., Ltd.", + [3]byte{0, 24, 23}: "D. E. Shaw Research, LLC", + [3]byte{0, 24, 24}: "Cisco Systems, Inc", + [3]byte{0, 24, 25}: "Cisco Systems, Inc", + [3]byte{0, 24, 26}: "AVerMedia Information Inc.", + [3]byte{0, 24, 27}: "TaiJin Metal Co., Ltd.", + [3]byte{0, 24, 28}: "Exterity Limited", + [3]byte{0, 24, 29}: "ASIA ELECTRONICS CO.,LTD", + [3]byte{0, 24, 30}: "GDX Technologies Ltd.", + [3]byte{0, 24, 31}: "Palmmicro Communications", + [3]byte{0, 24, 32}: "w5networks", + [3]byte{0, 24, 33}: "SINDORICOH", + [3]byte{0, 24, 34}: "CEC TELECOM CO.,LTD.", + [3]byte{0, 24, 35}: "Delta Electronics, Inc.", + [3]byte{0, 24, 36}: "Kimaldi Electronics, S.L.", + [3]byte{0, 24, 37}: "Private", + [3]byte{0, 24, 38}: "Cale Access AB", + [3]byte{0, 24, 39}: "NEC UNIFIED SOLUTIONS NEDERLAND B.V.", + [3]byte{0, 24, 40}: "e2v technologies (UK) ltd.", + [3]byte{0, 24, 41}: "Gatsometer", + [3]byte{0, 24, 42}: "Taiwan Video & Monitor", + [3]byte{0, 24, 43}: "Softier", + [3]byte{0, 24, 44}: "Ascend Networks, Inc.", + [3]byte{0, 24, 45}: "Artec Design", + [3]byte{0, 24, 46}: "XStreamHD", + [3]byte{0, 24, 47}: "Texas Instruments", + [3]byte{0, 24, 48}: "Texas Instruments", + [3]byte{0, 24, 49}: "Texas Instruments", + [3]byte{0, 24, 50}: "Texas Instruments", + [3]byte{0, 24, 51}: "Texas Instruments", + [3]byte{0, 24, 52}: "Texas Instruments", + [3]byte{0, 24, 53}: "Thoratec / ITC", + [3]byte{0, 24, 54}: "Reliance Electric Limited", + [3]byte{0, 24, 55}: "Universal ABIT Co., Ltd.", + [3]byte{0, 24, 56}: "PanAccess Communications,Inc.", + [3]byte{0, 24, 57}: "Cisco-Linksys, LLC", + [3]byte{0, 24, 58}: "Westell Technologies Inc.", + [3]byte{0, 24, 59}: "CENITS Co., Ltd.", + [3]byte{0, 24, 60}: "Encore Software Limited", + [3]byte{0, 24, 61}: "Vertex Link Corporation", + [3]byte{0, 24, 62}: "Digilent, Inc", + [3]byte{0, 24, 63}: "2Wire Inc", + [3]byte{0, 24, 64}: "3 Phoenix, Inc.", + [3]byte{0, 24, 65}: "High Tech Computer Corp", + [3]byte{0, 24, 66}: "Nokia Danmark A/S", + [3]byte{0, 24, 67}: "Dawevision Ltd", + [3]byte{0, 24, 68}: "Heads Up Technologies, Inc.", + [3]byte{0, 24, 69}: "Pulsar-Telecom LLC.", + [3]byte{0, 24, 70}: "Crypto S.A.", + [3]byte{0, 24, 71}: "AceNet Technology Inc.", + [3]byte{0, 24, 72}: "Vecima Networks Inc.", + [3]byte{0, 24, 73}: "Pigeon Point Systems LLC", + [3]byte{0, 24, 74}: "Catcher, Inc.", + [3]byte{0, 24, 75}: "Las Vegas Gaming, Inc.", + [3]byte{0, 24, 76}: "Bogen Communications", + [3]byte{0, 24, 77}: "NETGEAR", + [3]byte{0, 24, 78}: "Lianhe Technologies, Inc.", + [3]byte{0, 24, 79}: "8 Ways Technology Corp.", + [3]byte{0, 24, 80}: "Secfone Kft", + [3]byte{0, 24, 81}: "SWsoft", + [3]byte{0, 24, 82}: "StorLink Semiconductors, Inc.", + [3]byte{0, 24, 83}: "Atera Networks LTD.", + [3]byte{0, 24, 84}: "Argard Co., Ltd", + [3]byte{0, 24, 85}: "Aeromaritime Systembau GmbH", + [3]byte{0, 24, 86}: "EyeFi, Inc", + [3]byte{0, 24, 87}: "Unilever R&D", + [3]byte{0, 24, 88}: "TagMaster AB", + [3]byte{0, 24, 89}: "Strawberry Linux Co.,Ltd.", + [3]byte{0, 24, 90}: "uControl, Inc.", + [3]byte{0, 24, 91}: "Network Chemistry, Inc", + [3]byte{0, 24, 92}: "EDSLAB Technologies", + [3]byte{0, 24, 93}: "TAIGUEN TECHNOLOGY (SHEN-ZHEN) CO., LTD.", + [3]byte{0, 24, 94}: "Nexterm Inc.", + [3]byte{0, 24, 95}: "TAC Inc.", + [3]byte{0, 24, 96}: "SIM Technology Group Shanghai Simcom Ltd.,", + [3]byte{0, 24, 97}: "Ooma, Inc.", + [3]byte{0, 24, 98}: "Seagate Technology", + [3]byte{0, 24, 99}: "Veritech Electronics Limited", + [3]byte{0, 24, 100}: "Eaton Corporation", + [3]byte{0, 24, 101}: "Siemens Healthcare Diagnostics Manufacturing Ltd", + [3]byte{0, 24, 102}: "Leutron Vision", + [3]byte{0, 24, 103}: "Datalogic ADC", + [3]byte{0, 24, 104}: "Cisco SPVTG", + [3]byte{0, 24, 105}: "KINGJIM", + [3]byte{0, 24, 106}: "Global Link Digital Technology Co,.LTD", + [3]byte{0, 24, 107}: "Sambu Communics CO., LTD.", + [3]byte{0, 24, 108}: "Neonode AB", + [3]byte{0, 24, 109}: "Zhenjiang Sapphire Electronic Industry CO.", + [3]byte{0, 24, 110}: "3Com Ltd", + [3]byte{0, 24, 111}: "Setha Industria Eletronica LTDA", + [3]byte{0, 24, 112}: "E28 Shanghai Limited", + [3]byte{0, 24, 113}: "Hewlett Packard", + [3]byte{0, 24, 114}: "Expertise Engineering", + [3]byte{0, 24, 115}: "Cisco Systems, Inc", + [3]byte{0, 24, 116}: "Cisco Systems, Inc", + [3]byte{0, 24, 117}: "AnaCise Testnology Pte Ltd", + [3]byte{0, 24, 118}: "WowWee Ltd.", + [3]byte{0, 24, 119}: "Amplex A/S", + [3]byte{0, 24, 120}: "Mackware GmbH", + [3]byte{0, 24, 121}: "dSys", + [3]byte{0, 24, 122}: "Wiremold", + [3]byte{0, 24, 123}: "4NSYS Co. Ltd.", + [3]byte{0, 24, 124}: "INTERCROSS, LLC", + [3]byte{0, 24, 125}: "Armorlink Co .Ltd", + [3]byte{0, 24, 126}: "RGB Spectrum", + [3]byte{0, 24, 127}: "ZODIANET", + [3]byte{0, 24, 128}: "Maxim Integrated Products", + [3]byte{0, 24, 129}: "Buyang Electronics Industrial Co., Ltd", + [3]byte{0, 24, 130}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{0, 24, 131}: "FORMOSA21 INC.", + [3]byte{0, 24, 132}: "Fon Technology S.L.", + [3]byte{0, 24, 133}: "Avigilon Corporation", + [3]byte{0, 24, 134}: "EL-TECH, INC.", + [3]byte{0, 24, 135}: "Metasystem SpA", + [3]byte{0, 24, 136}: "GOTIVE a.s.", + [3]byte{0, 24, 137}: "WinNet Solutions Limited", + [3]byte{0, 24, 138}: "Infinova LLC", + [3]byte{0, 24, 139}: "Dell Inc.", + [3]byte{0, 24, 140}: "Mobile Action Technology Inc.", + [3]byte{0, 24, 141}: "Nokia Danmark A/S", + [3]byte{0, 24, 142}: "Ekahau, Inc.", + [3]byte{0, 24, 143}: "Montgomery Technology, Inc.", + [3]byte{0, 24, 144}: "RadioCOM, s.r.o.", + [3]byte{0, 24, 145}: "Zhongshan General K-mate Electronics Co., Ltd", + [3]byte{0, 24, 146}: "ads-tec GmbH", + [3]byte{0, 24, 147}: "SHENZHEN PHOTON BROADBAND TECHNOLOGY CO.,LTD", + [3]byte{0, 24, 148}: "NPCore, Inc.", + [3]byte{0, 24, 149}: "Hansun Technologies Inc.", + [3]byte{0, 24, 150}: "Great Well Electronic LTD", + [3]byte{0, 24, 151}: "JESS-LINK PRODUCTS Co., LTD", + [3]byte{0, 24, 152}: "KINGSTATE ELECTRONICS CORPORATION", + [3]byte{0, 24, 153}: "ShenZhen jieshun Science&Technology Industry CO,LTD.", + [3]byte{0, 24, 154}: "HANA Micron Inc.", + [3]byte{0, 24, 155}: "Thomson Inc.", + [3]byte{0, 24, 156}: "Weldex Corporation", + [3]byte{0, 24, 157}: "Navcast Inc.", + [3]byte{0, 24, 158}: "OMNIKEY GmbH.", + [3]byte{0, 24, 159}: "Lenntek Corporation", + [3]byte{0, 24, 160}: "Cierma Ascenseurs", + [3]byte{0, 24, 161}: "Tiqit Computers, Inc.", + [3]byte{0, 24, 162}: "XIP Technology AB", + [3]byte{0, 24, 163}: "ZIPPY TECHNOLOGY CORP.", + [3]byte{0, 24, 164}: "ARRIS Group, Inc.", + [3]byte{0, 24, 165}: "ADigit Technologies Corp.", + [3]byte{0, 24, 166}: "Persistent Systems, LLC", + [3]byte{0, 24, 167}: "Yoggie Security Systems LTD.", + [3]byte{0, 24, 168}: "AnNeal Technology Inc.", + [3]byte{0, 24, 169}: "Ethernet Direct Corporation", + [3]byte{0, 24, 170}: "Protec Fire Detection plc", + [3]byte{0, 24, 171}: "BEIJING LHWT MICROELECTRONICS INC.", + [3]byte{0, 24, 172}: "Shanghai Jiao Da HISYS Technology Co. Ltd.", + [3]byte{0, 24, 173}: "NIDEC SANKYO CORPORATION", + [3]byte{0, 24, 174}: "TVT CO.,LTD", + [3]byte{0, 24, 175}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 24, 176}: "Nortel Networks", + [3]byte{0, 24, 177}: "IBM Corp", + [3]byte{0, 24, 178}: "ADEUNIS RF", + [3]byte{0, 24, 179}: "TEC WizHome Co., Ltd.", + [3]byte{0, 24, 180}: "Dawon Media Inc.", + [3]byte{0, 24, 181}: "Magna Carta", + [3]byte{0, 24, 182}: "S3C, Inc.", + [3]byte{0, 24, 183}: "D3 LED, LLC", + [3]byte{0, 24, 184}: "New Voice International AG", + [3]byte{0, 24, 185}: "Cisco Systems, Inc", + [3]byte{0, 24, 186}: "Cisco Systems, Inc", + [3]byte{0, 24, 187}: "Eliwell Controls srl", + [3]byte{0, 24, 188}: "ZAO NVP Bolid", + [3]byte{0, 24, 189}: "SHENZHEN DVBWORLD TECHNOLOGY CO., LTD.", + [3]byte{0, 24, 190}: "ANSA Corporation", + [3]byte{0, 24, 191}: "Essence Technology Solution, Inc.", + [3]byte{0, 24, 192}: "ARRIS Group, Inc.", + [3]byte{0, 24, 193}: "Almitec Informática e Comércio", + [3]byte{0, 24, 194}: "Firetide, Inc", + [3]byte{0, 24, 195}: "CS Corporation", + [3]byte{0, 24, 196}: "Raba Technologies LLC", + [3]byte{0, 24, 197}: "Nokia Danmark A/S", + [3]byte{0, 24, 198}: "OPW Fuel Management Systems", + [3]byte{0, 24, 199}: "Real Time Automation", + [3]byte{0, 24, 200}: "ISONAS Inc.", + [3]byte{0, 24, 201}: "EOps Technology Limited", + [3]byte{0, 24, 202}: "Viprinet GmbH", + [3]byte{0, 24, 203}: "Tecobest Technology Limited", + [3]byte{0, 24, 204}: "AXIOHM SAS", + [3]byte{0, 24, 205}: "Erae Electronics Industry Co., Ltd", + [3]byte{0, 24, 206}: "Dreamtech Co., Ltd", + [3]byte{0, 24, 207}: "Baldor Electric Company", + [3]byte{0, 24, 208}: "AtRoad, A Trimble Company", + [3]byte{0, 24, 209}: "Siemens Home & Office Comm. Devices", + [3]byte{0, 24, 210}: "High-Gain Antennas LLC", + [3]byte{0, 24, 211}: "TEAMCAST", + [3]byte{0, 24, 212}: "Unified Display Interface SIG", + [3]byte{0, 24, 213}: "REIGNCOM", + [3]byte{0, 24, 214}: "Swirlnet A/S", + [3]byte{0, 24, 215}: "JAVAD GNSS, Inc.", + [3]byte{0, 24, 216}: "ARCH METER Corporation", + [3]byte{0, 24, 217}: "Santosha Internatonal, Inc", + [3]byte{0, 24, 218}: "AMBER wireless GmbH", + [3]byte{0, 24, 219}: "EPL Technology Ltd", + [3]byte{0, 24, 220}: "Prostar Co., Ltd.", + [3]byte{0, 24, 221}: "Silicondust Engineering Ltd", + [3]byte{0, 24, 222}: "Intel Corporate", + [3]byte{0, 24, 223}: "The Morey Corporation", + [3]byte{0, 24, 224}: "ANAVEO", + [3]byte{0, 24, 225}: "Verkerk Service Systemen", + [3]byte{0, 24, 226}: "Topdata Sistemas de Automacao Ltda", + [3]byte{0, 24, 227}: "Visualgate Systems, Inc.", + [3]byte{0, 24, 228}: "YIGUANG", + [3]byte{0, 24, 229}: "Adhoco AG", + [3]byte{0, 24, 230}: "Computer Hardware Design SIA", + [3]byte{0, 24, 231}: "Cameo Communications, INC.", + [3]byte{0, 24, 232}: "Hacetron Corporation", + [3]byte{0, 24, 233}: "Numata Corporation", + [3]byte{0, 24, 234}: "Alltec GmbH", + [3]byte{0, 24, 235}: "Blue Zen Enterprises Private Limited", + [3]byte{0, 24, 236}: "Welding Technology Corporation", + [3]byte{0, 24, 237}: "Accutech Ultrasystems Co., Ltd.", + [3]byte{0, 24, 238}: "Videology Imaging Solutions, Inc.", + [3]byte{0, 24, 239}: "Escape Communications, Inc.", + [3]byte{0, 24, 240}: "JOYTOTO Co., Ltd.", + [3]byte{0, 24, 241}: "Chunichi Denshi Co.,LTD.", + [3]byte{0, 24, 242}: "Beijing Tianyu Communication Equipment Co., Ltd", + [3]byte{0, 24, 243}: "ASUSTek COMPUTER INC.", + [3]byte{0, 24, 244}: "EO TECHNICS Co., Ltd.", + [3]byte{0, 24, 245}: "Shenzhen Streaming Video Technology Company Limited", + [3]byte{0, 24, 246}: "Thomson Telecom Belgium", + [3]byte{0, 24, 247}: "Kameleon Technologies", + [3]byte{0, 24, 248}: "Cisco-Linksys, LLC", + [3]byte{0, 24, 249}: "VVOND, Inc.", + [3]byte{0, 24, 250}: "Yushin Precision Equipment Co.,Ltd.", + [3]byte{0, 24, 251}: "Compro Technology", + [3]byte{0, 24, 252}: "Altec Electronic AG", + [3]byte{0, 24, 253}: "Optimal Technologies International Inc.", + [3]byte{0, 24, 254}: "Hewlett Packard", + [3]byte{0, 24, 255}: "PowerQuattro Co.", + [3]byte{0, 25, 0}: "Intelliverese - DBA Voicecom", + [3]byte{0, 25, 1}: "F1MEDIA", + [3]byte{0, 25, 2}: "Cambridge Consultants Ltd", + [3]byte{0, 25, 3}: "Bigfoot Networks Inc", + [3]byte{0, 25, 4}: "WB Electronics Sp. z o.o.", + [3]byte{0, 25, 5}: "SCHRACK Seconet AG", + [3]byte{0, 25, 6}: "Cisco Systems, Inc", + [3]byte{0, 25, 7}: "Cisco Systems, Inc", + [3]byte{0, 25, 8}: "Duaxes Corporation", + [3]byte{0, 25, 9}: "DEVI - Danfoss A/S", + [3]byte{0, 25, 10}: "HASWARE INC.", + [3]byte{0, 25, 11}: "Southern Vision Systems, Inc.", + [3]byte{0, 25, 12}: "Encore Electronics, Inc.", + [3]byte{0, 25, 13}: "IEEE 1394c", + [3]byte{0, 25, 14}: "Atech Technology Co., Ltd.", + [3]byte{0, 25, 15}: "Advansus Corp.", + [3]byte{0, 25, 16}: "Knick Elektronische Messgeraete GmbH & Co. KG", + [3]byte{0, 25, 17}: "Just In Mobile Information Technologies (Shanghai) Co., Ltd.", + [3]byte{0, 25, 18}: "Welcat Inc", + [3]byte{0, 25, 19}: "Chuang-Yi Network Equipment Co.Ltd.", + [3]byte{0, 25, 20}: "Winix Co., Ltd", + [3]byte{0, 25, 21}: "TECOM Co., Ltd.", + [3]byte{0, 25, 22}: "PayTec AG", + [3]byte{0, 25, 23}: "Posiflex Inc.", + [3]byte{0, 25, 24}: "Interactive Wear AG", + [3]byte{0, 25, 25}: "ASTEL Inc.", + [3]byte{0, 25, 26}: "IRLINK", + [3]byte{0, 25, 27}: "Sputnik Engineering AG", + [3]byte{0, 25, 28}: "Sensicast Systems", + [3]byte{0, 25, 29}: "Nintendo Co., Ltd.", + [3]byte{0, 25, 30}: "Beyondwiz Co., Ltd.", + [3]byte{0, 25, 31}: "Microlink communications Inc.", + [3]byte{0, 25, 32}: "KUME electric Co.,Ltd.", + [3]byte{0, 25, 33}: "Elitegroup Computer Systems Co.,Ltd.", + [3]byte{0, 25, 34}: "CM Comandos Lineares", + [3]byte{0, 25, 35}: "Phonex Korea Co., LTD.", + [3]byte{0, 25, 36}: "LBNL Engineering", + [3]byte{0, 25, 37}: "Intelicis Corporation", + [3]byte{0, 25, 38}: "BitsGen Co., Ltd.", + [3]byte{0, 25, 39}: "ImCoSys Ltd", + [3]byte{0, 25, 40}: "Siemens AG, Transportation Systems", + [3]byte{0, 25, 41}: "2M2B Montadora de Maquinas Bahia Brasil LTDA", + [3]byte{0, 25, 42}: "Antiope Associates", + [3]byte{0, 25, 43}: "Aclara RF Systems Inc.", + [3]byte{0, 25, 44}: "ARRIS Group, Inc.", + [3]byte{0, 25, 45}: "Nokia Corporation", + [3]byte{0, 25, 46}: "Spectral Instruments, Inc.", + [3]byte{0, 25, 47}: "Cisco Systems, Inc", + [3]byte{0, 25, 48}: "Cisco Systems, Inc", + [3]byte{0, 25, 49}: "Balluff GmbH", + [3]byte{0, 25, 50}: "Gude Analog- und Digialsysteme GmbH", + [3]byte{0, 25, 51}: "Strix Systems, Inc.", + [3]byte{0, 25, 52}: "TRENDON TOUCH TECHNOLOGY CORP.", + [3]byte{0, 25, 53}: "DUERR DENTAL AG", + [3]byte{0, 25, 54}: "STERLITE OPTICAL TECHNOLOGIES LIMITED", + [3]byte{0, 25, 55}: "CommerceGuard AB", + [3]byte{0, 25, 56}: "UMB Communications Co., Ltd.", + [3]byte{0, 25, 57}: "Gigamips", + [3]byte{0, 25, 58}: "OESOLUTIONS", + [3]byte{0, 25, 59}: "Wilibox Deliberant Group LLC", + [3]byte{0, 25, 60}: "HighPoint Technologies Incorporated", + [3]byte{0, 25, 61}: "GMC Guardian Mobility Corp.", + [3]byte{0, 25, 62}: "ADB Broadband Italia", + [3]byte{0, 25, 63}: "RDI technology(Shenzhen) Co.,LTD", + [3]byte{0, 25, 64}: "Rackable Systems", + [3]byte{0, 25, 65}: "Pitney Bowes, Inc", + [3]byte{0, 25, 66}: "ON SOFTWARE INTERNATIONAL LIMITED", + [3]byte{0, 25, 67}: "Belden", + [3]byte{0, 25, 68}: "Fossil Partners, L.P.", + [3]byte{0, 25, 69}: "RF COncepts, LLC", + [3]byte{0, 25, 70}: "Cianet Industria e Comercio S/A", + [3]byte{0, 25, 71}: "Cisco SPVTG", + [3]byte{0, 25, 72}: "AireSpider Networks", + [3]byte{0, 25, 73}: "TENTEL COMTECH CO., LTD.", + [3]byte{0, 25, 74}: "TESTO AG", + [3]byte{0, 25, 75}: "Sagemcom Broadband SAS", + [3]byte{0, 25, 76}: "Fujian Stelcom information & Technology CO.,Ltd", + [3]byte{0, 25, 77}: "Avago Technologies Sdn Bhd", + [3]byte{0, 25, 78}: "Ultra Electronics - TCS (Tactical Communication Systems)", + [3]byte{0, 25, 79}: "Nokia Danmark A/S", + [3]byte{0, 25, 80}: "Harman Multimedia", + [3]byte{0, 25, 81}: "NETCONS, s.r.o.", + [3]byte{0, 25, 82}: "ACOGITO Co., Ltd", + [3]byte{0, 25, 83}: "Chainleader Communications Corp.", + [3]byte{0, 25, 84}: "Leaf Corporation.", + [3]byte{0, 25, 85}: "Cisco Systems, Inc", + [3]byte{0, 25, 86}: "Cisco Systems, Inc", + [3]byte{0, 25, 87}: "Saafnet Canada Inc.", + [3]byte{0, 25, 88}: "Bluetooth SIG, Inc.", + [3]byte{0, 25, 89}: "Staccato Communications Inc.", + [3]byte{0, 25, 90}: "Jenaer Antriebstechnik GmbH", + [3]byte{0, 25, 91}: "D-Link Corporation", + [3]byte{0, 25, 92}: "Innotech Corporation", + [3]byte{0, 25, 93}: "ShenZhen XinHuaTong Opto Electronics Co.,Ltd", + [3]byte{0, 25, 94}: "ARRIS Group, Inc.", + [3]byte{0, 25, 95}: "Valemount Networks Corporation", + [3]byte{0, 25, 96}: "DoCoMo Systems, Inc.", + [3]byte{0, 25, 97}: "Blaupunkt Embedded Systems GmbH", + [3]byte{0, 25, 98}: "Commerciant, LP", + [3]byte{0, 25, 99}: "Sony Mobile Communications AB", + [3]byte{0, 25, 100}: "Doorking Inc.", + [3]byte{0, 25, 101}: "YuHua TelTech (ShangHai) Co., Ltd.", + [3]byte{0, 25, 102}: "Asiarock Technology Limited", + [3]byte{0, 25, 103}: "TELDAT Sp.J.", + [3]byte{0, 25, 104}: "Digital Video Networks(Shanghai) CO. LTD.", + [3]byte{0, 25, 105}: "Nortel Networks", + [3]byte{0, 25, 106}: "MikroM GmbH", + [3]byte{0, 25, 107}: "Danpex Corporation", + [3]byte{0, 25, 108}: "ETROVISION TECHNOLOGY", + [3]byte{0, 25, 109}: "Raybit Systems Korea, Inc", + [3]byte{0, 25, 110}: "Metacom (Pty) Ltd.", + [3]byte{0, 25, 111}: "SensoPart GmbH", + [3]byte{0, 25, 112}: "Z-Com, Inc.", + [3]byte{0, 25, 113}: "Guangzhou Unicomp Technology Co.,Ltd", + [3]byte{0, 25, 114}: "Plexus (Xiamen) Co.,ltd.", + [3]byte{0, 25, 115}: "Zeugma Systems", + [3]byte{0, 25, 116}: "16063", + [3]byte{0, 25, 117}: "Beijing Huisen networks technology Inc", + [3]byte{0, 25, 118}: "Xipher Technologies, LLC", + [3]byte{0, 25, 119}: "Aerohive Networks Inc.", + [3]byte{0, 25, 120}: "Datum Systems, Inc.", + [3]byte{0, 25, 121}: "Nokia Danmark A/S", + [3]byte{0, 25, 122}: "MAZeT GmbH", + [3]byte{0, 25, 123}: "Picotest Corp.", + [3]byte{0, 25, 124}: "Riedel Communications GmbH", + [3]byte{0, 25, 125}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{0, 25, 126}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{0, 25, 127}: "PLANTRONICS, INC.", + [3]byte{0, 25, 128}: "Gridpoint Systems", + [3]byte{0, 25, 129}: "Vivox Inc", + [3]byte{0, 25, 130}: "SmarDTV", + [3]byte{0, 25, 131}: "CCT R&D Limited", + [3]byte{0, 25, 132}: "ESTIC Corporation", + [3]byte{0, 25, 133}: "IT Watchdogs, Inc", + [3]byte{0, 25, 134}: "Cheng Hongjian", + [3]byte{0, 25, 135}: "Panasonic Mobile Communications Co.,Ltd.", + [3]byte{0, 25, 136}: "Wi2Wi, Inc", + [3]byte{0, 25, 137}: "Sonitrol Corporation", + [3]byte{0, 25, 138}: "Northrop Grumman Systems Corp.", + [3]byte{0, 25, 139}: "Novera Optics Korea, Inc.", + [3]byte{0, 25, 140}: "iXSea", + [3]byte{0, 25, 141}: "Ocean Optics, Inc.", + [3]byte{0, 25, 142}: "Oticon A/S", + [3]byte{0, 25, 143}: "Alcatel Bell N.V.", + [3]byte{0, 25, 144}: "ELM DATA Co., Ltd.", + [3]byte{0, 25, 145}: "avinfo", + [3]byte{0, 25, 146}: "Adtran Inc", + [3]byte{0, 25, 147}: "Changshu Switchgear MFG. Co.,Ltd. (Former Changshu Switchgea", + [3]byte{0, 25, 148}: "Jorjin Technologies Inc.", + [3]byte{0, 25, 149}: "Jurong Hi-Tech (Suzhou)Co.ltd", + [3]byte{0, 25, 150}: "TurboChef Technologies Inc.", + [3]byte{0, 25, 151}: "Soft Device Sdn Bhd", + [3]byte{0, 25, 152}: "SATO CORPORATION", + [3]byte{0, 25, 153}: "Fujitsu Technology Solutions GmbH", + [3]byte{0, 25, 154}: "EDO-EVI", + [3]byte{0, 25, 155}: "Diversified Technical Systems, Inc.", + [3]byte{0, 25, 156}: "CTRING", + [3]byte{0, 25, 157}: "Vizio, Inc", + [3]byte{0, 25, 158}: "Nifty", + [3]byte{0, 25, 159}: "DKT A/S", + [3]byte{0, 25, 160}: "NIHON DATA SYSTENS, INC.", + [3]byte{0, 25, 161}: "LG INFORMATION & COMM.", + [3]byte{0, 25, 162}: "ORDYN TECHNOLOGIES", + [3]byte{0, 25, 163}: "asteel electronique atlantique", + [3]byte{0, 25, 164}: "Austar Technology (hang zhou) Co.,Ltd", + [3]byte{0, 25, 165}: "RadarFind Corporation", + [3]byte{0, 25, 166}: "ARRIS Group, Inc.", + [3]byte{0, 25, 167}: "ITU-T", + [3]byte{0, 25, 168}: "WiQuest Communications", + [3]byte{0, 25, 169}: "Cisco Systems, Inc", + [3]byte{0, 25, 170}: "Cisco Systems, Inc", + [3]byte{0, 25, 171}: "Raycom CO ., LTD", + [3]byte{0, 25, 172}: "GSP SYSTEMS Inc.", + [3]byte{0, 25, 173}: "BOBST SA", + [3]byte{0, 25, 174}: "Hopling Technologies b.v.", + [3]byte{0, 25, 175}: "Rigol Technologies, Inc.", + [3]byte{0, 25, 176}: "HanYang System", + [3]byte{0, 25, 177}: "Arrow7 Corporation", + [3]byte{0, 25, 178}: "XYnetsoft Co.,Ltd", + [3]byte{0, 25, 179}: "Stanford Research Systems", + [3]byte{0, 25, 180}: "Intellio Ltd", + [3]byte{0, 25, 181}: "Famar Fueguina S.A.", + [3]byte{0, 25, 182}: "Euro Emme s.r.l.", + [3]byte{0, 25, 183}: "Nokia Danmark A/S", + [3]byte{0, 25, 184}: "Boundary Devices", + [3]byte{0, 25, 185}: "Dell Inc.", + [3]byte{0, 25, 186}: "Paradox Security Systems Ltd", + [3]byte{0, 25, 187}: "Hewlett Packard", + [3]byte{0, 25, 188}: "ELECTRO CHANCE SRL", + [3]byte{0, 25, 189}: "New Media Life", + [3]byte{0, 25, 190}: "Altai Technologies Limited", + [3]byte{0, 25, 191}: "Citiway technology Co.,ltd", + [3]byte{0, 25, 192}: "ARRIS Group, Inc.", + [3]byte{0, 25, 193}: "ALPS ELECTRIC CO.,LTD.", + [3]byte{0, 25, 194}: "Equustek Solutions, Inc.", + [3]byte{0, 25, 195}: "Qualitrol", + [3]byte{0, 25, 196}: "Infocrypt Inc.", + [3]byte{0, 25, 197}: "Sony Interactive Entertainment Inc.", + [3]byte{0, 25, 198}: "zte corporation", + [3]byte{0, 25, 199}: "Cambridge Industries(Group) Co.,Ltd.", + [3]byte{0, 25, 200}: "AnyDATA Corporation", + [3]byte{0, 25, 201}: "S&C ELECTRIC COMPANY", + [3]byte{0, 25, 202}: "Broadata Communications, Inc", + [3]byte{0, 25, 203}: "Zyxel Communications Corporation", + [3]byte{0, 25, 204}: "RCG (HK) Ltd", + [3]byte{0, 25, 205}: "Chengdu ethercom information technology Ltd.", + [3]byte{0, 25, 206}: "Progressive Gaming International", + [3]byte{0, 25, 207}: "SALICRU, S.A.", + [3]byte{0, 25, 208}: "Cathexis", + [3]byte{0, 25, 209}: "Intel Corporate", + [3]byte{0, 25, 210}: "Intel Corporate", + [3]byte{0, 25, 211}: "TRAK Microwave", + [3]byte{0, 25, 212}: "ICX Technologies", + [3]byte{0, 25, 213}: "IP Innovations, Inc.", + [3]byte{0, 25, 214}: "LS Cable and System Ltd.", + [3]byte{0, 25, 215}: "FORTUNETEK CO., LTD", + [3]byte{0, 25, 216}: "MAXFOR", + [3]byte{0, 25, 217}: "Zeutschel GmbH", + [3]byte{0, 25, 218}: "Welltrans O&E Technology Co. , Ltd.", + [3]byte{0, 25, 219}: "MICRO-STAR INTERNATIONAL CO., LTD.", + [3]byte{0, 25, 220}: "ENENSYS Technologies", + [3]byte{0, 25, 221}: "FEI-Zyfer, Inc.", + [3]byte{0, 25, 222}: "MOBITEK", + [3]byte{0, 25, 223}: "Thomson Inc.", + [3]byte{0, 25, 224}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{0, 25, 225}: "Nortel Networks", + [3]byte{0, 25, 226}: "Juniper Networks", + [3]byte{0, 25, 227}: "Apple, Inc.", + [3]byte{0, 25, 228}: "2Wire Inc", + [3]byte{0, 25, 229}: "Lynx Studio Technology, Inc.", + [3]byte{0, 25, 230}: "TOYO MEDIC CO.,LTD.", + [3]byte{0, 25, 231}: "Cisco Systems, Inc", + [3]byte{0, 25, 232}: "Cisco Systems, Inc", + [3]byte{0, 25, 233}: "S-Information Technolgy, Co., Ltd.", + [3]byte{0, 25, 234}: "TeraMage Technologies Co., Ltd.", + [3]byte{0, 25, 235}: "Pyronix Ltd", + [3]byte{0, 25, 236}: "Sagamore Systems, Inc.", + [3]byte{0, 25, 237}: "Axesstel Inc.", + [3]byte{0, 25, 238}: "CARLO GAVAZZI CONTROLS SPA-Controls Division", + [3]byte{0, 25, 239}: "SHENZHEN LINNKING ELECTRONICS CO.,LTD", + [3]byte{0, 25, 240}: "UNIONMAN TECHNOLOGY CO.,LTD", + [3]byte{0, 25, 241}: "Star Communication Network Technology Co.,Ltd", + [3]byte{0, 25, 242}: "Teradyne K.K.", + [3]byte{0, 25, 243}: "Cetis, Inc", + [3]byte{0, 25, 244}: "Convergens Oy Ltd", + [3]byte{0, 25, 245}: "Imagination Technologies Ltd", + [3]byte{0, 25, 246}: "Acconet (PTE) Ltd", + [3]byte{0, 25, 247}: "Onset Computer Corporation", + [3]byte{0, 25, 248}: "Embedded Systems Design, Inc.", + [3]byte{0, 25, 249}: "TDK-Lambda", + [3]byte{0, 25, 250}: "Cable Vision Electronics CO., LTD.", + [3]byte{0, 25, 251}: "BSkyB Ltd", + [3]byte{0, 25, 252}: "PT. Ufoakses Sukses Luarbiasa", + [3]byte{0, 25, 253}: "Nintendo Co., Ltd.", + [3]byte{0, 25, 254}: "SHENZHEN SEECOMM TECHNOLOGY CO.,LTD.", + [3]byte{0, 25, 255}: "Finnzymes", + [3]byte{0, 26, 0}: "MATRIX INC.", + [3]byte{0, 26, 1}: "Smiths Medical", + [3]byte{0, 26, 2}: "SECURE CARE PRODUCTS, INC", + [3]byte{0, 26, 3}: "Angel Electronics Co., Ltd.", + [3]byte{0, 26, 4}: "Interay Solutions BV", + [3]byte{0, 26, 5}: "OPTIBASE LTD", + [3]byte{0, 26, 6}: "OpVista, Inc.", + [3]byte{0, 26, 7}: "Arecont Vision", + [3]byte{0, 26, 8}: "Simoco Ltd.", + [3]byte{0, 26, 9}: "Wayfarer Transit Systems Ltd", + [3]byte{0, 26, 10}: "Adaptive Micro-Ware Inc.", + [3]byte{0, 26, 11}: "BONA TECHNOLOGY INC.", + [3]byte{0, 26, 12}: "Swe-Dish Satellite Systems AB", + [3]byte{0, 26, 13}: "HandHeld entertainment, Inc.", + [3]byte{0, 26, 14}: "Cheng Uei Precision Industry Co.,Ltd", + [3]byte{0, 26, 15}: "Sistemas Avanzados de Control, S.A.", + [3]byte{0, 26, 16}: "LUCENT TRANS ELECTRONICS CO.,LTD", + [3]byte{0, 26, 17}: "Google, Inc.", + [3]byte{0, 26, 18}: "Essilor", + [3]byte{0, 26, 19}: "Wanlida Group Co., LTD", + [3]byte{0, 26, 20}: "Xin Hua Control Engineering Co.,Ltd.", + [3]byte{0, 26, 21}: "gemalto e-Payment", + [3]byte{0, 26, 22}: "Nokia Danmark A/S", + [3]byte{0, 26, 23}: "Teak Technologies, Inc.", + [3]byte{0, 26, 24}: "Advanced Simulation Technology inc.", + [3]byte{0, 26, 25}: "Computer Engineering Limited", + [3]byte{0, 26, 26}: "Gentex Corporation/Electro-Acoustic Products", + [3]byte{0, 26, 27}: "ARRIS Group, Inc.", + [3]byte{0, 26, 28}: "GT&T Engineering Pte Ltd", + [3]byte{0, 26, 29}: "PChome Online Inc.", + [3]byte{0, 26, 30}: "Aruba Networks", + [3]byte{0, 26, 31}: "Coastal Environmental Systems", + [3]byte{0, 26, 32}: "CMOTECH Co. Ltd.", + [3]byte{0, 26, 33}: "Brookhuis Applied Technologies BV", + [3]byte{0, 26, 34}: "eQ-3 Entwicklung GmbH", + [3]byte{0, 26, 35}: "Ice Qube, Inc", + [3]byte{0, 26, 36}: "Galaxy Telecom Technologies Ltd", + [3]byte{0, 26, 37}: "DELTA DORE", + [3]byte{0, 26, 38}: "Deltanode Solutions AB", + [3]byte{0, 26, 39}: "Ubistar", + [3]byte{0, 26, 40}: "ASWT Co., LTD. Taiwan Branch H.K.", + [3]byte{0, 26, 41}: "Johnson Outdoors Marine Electronics d/b/a Minnkota", + [3]byte{0, 26, 42}: "Arcadyan Technology Corporation", + [3]byte{0, 26, 43}: "Ayecom Technology Co., Ltd.", + [3]byte{0, 26, 44}: "SATEC Co.,LTD", + [3]byte{0, 26, 45}: "The Navvo Group", + [3]byte{0, 26, 46}: "Ziova Coporation", + [3]byte{0, 26, 47}: "Cisco Systems, Inc", + [3]byte{0, 26, 48}: "Cisco Systems, Inc", + [3]byte{0, 26, 49}: "SCAN COIN Industries AB", + [3]byte{0, 26, 50}: "ACTIVA MULTIMEDIA", + [3]byte{0, 26, 51}: "ASI Communications, Inc.", + [3]byte{0, 26, 52}: "Konka Group Co., Ltd.", + [3]byte{0, 26, 53}: "BARTEC GmbH", + [3]byte{0, 26, 54}: "Aipermon GmbH & Co. KG", + [3]byte{0, 26, 55}: "Lear Corporation", + [3]byte{0, 26, 56}: "Sanmina-SCI", + [3]byte{0, 26, 57}: "Merten GmbH&CoKG", + [3]byte{0, 26, 58}: "Dongahelecomm", + [3]byte{0, 26, 59}: "Doah Elecom Inc.", + [3]byte{0, 26, 60}: "Technowave Ltd.", + [3]byte{0, 26, 61}: "Ajin Vision Co.,Ltd", + [3]byte{0, 26, 62}: "Faster Technology LLC", + [3]byte{0, 26, 63}: "intelbras", + [3]byte{0, 26, 64}: "A-FOUR TECH CO., LTD.", + [3]byte{0, 26, 65}: "INOCOVA Co.,Ltd", + [3]byte{0, 26, 66}: "Techcity Technology co., Ltd.", + [3]byte{0, 26, 67}: "Logical Link Communications", + [3]byte{0, 26, 68}: "JWTrading Co., Ltd", + [3]byte{0, 26, 69}: "GN Netcom A/S", + [3]byte{0, 26, 70}: "Digital Multimedia Technology Co., Ltd", + [3]byte{0, 26, 71}: "Agami Systems, Inc.", + [3]byte{0, 26, 72}: "Takacom Corporation", + [3]byte{0, 26, 73}: "Micro Vision Co.,LTD", + [3]byte{0, 26, 74}: "Qumranet Inc.", + [3]byte{0, 26, 75}: "Hewlett Packard", + [3]byte{0, 26, 76}: "Crossbow Technology, Inc", + [3]byte{0, 26, 77}: "GIGA-BYTE TECHNOLOGY CO.,LTD.", + [3]byte{0, 26, 78}: "NTI AG / LinMot", + [3]byte{0, 26, 79}: "AVM GmbH", + [3]byte{0, 26, 80}: "PheeNet Technology Corp.", + [3]byte{0, 26, 81}: "Alfred Mann Foundation", + [3]byte{0, 26, 82}: "Meshlinx Wireless Inc.", + [3]byte{0, 26, 83}: "Zylaya", + [3]byte{0, 26, 84}: "Hip Shing Electronics Ltd.", + [3]byte{0, 26, 85}: "ACA-Digital Corporation", + [3]byte{0, 26, 86}: "ViewTel Co,. Ltd.", + [3]byte{0, 26, 87}: "Matrix Design Group, LLC", + [3]byte{0, 26, 88}: "CCV Deutschland GmbH - Celectronic eHealth Div.", + [3]byte{0, 26, 89}: "Ircona", + [3]byte{0, 26, 90}: "Korea Electric Power Data Network (KDN) Co., Ltd", + [3]byte{0, 26, 91}: "NetCare Service Co., Ltd.", + [3]byte{0, 26, 92}: "Euchner GmbH+Co. KG", + [3]byte{0, 26, 93}: "Mobinnova Corp.", + [3]byte{0, 26, 94}: "Thincom Technology Co.,Ltd", + [3]byte{0, 26, 95}: "KitWorks.fi Ltd.", + [3]byte{0, 26, 96}: "Wave Electronics Co.,Ltd.", + [3]byte{0, 26, 97}: "PacStar Corp.", + [3]byte{0, 26, 98}: "Data Robotics, Incorporated", + [3]byte{0, 26, 99}: "Elster Solutions, LLC,", + [3]byte{0, 26, 100}: "IBM Corp", + [3]byte{0, 26, 101}: "Seluxit", + [3]byte{0, 26, 102}: "ARRIS Group, Inc.", + [3]byte{0, 26, 103}: "Infinite QL Sdn Bhd", + [3]byte{0, 26, 104}: "Weltec Enterprise Co., Ltd.", + [3]byte{0, 26, 105}: "Wuhan Yangtze Optical Technology CO.,Ltd.", + [3]byte{0, 26, 106}: "Tranzas, Inc.", + [3]byte{0, 26, 107}: "Universal Global Scientific Industrial Co., Ltd.", + [3]byte{0, 26, 108}: "Cisco Systems, Inc", + [3]byte{0, 26, 109}: "Cisco Systems, Inc", + [3]byte{0, 26, 110}: "Impro Technologies", + [3]byte{0, 26, 111}: "MI.TEL s.r.l.", + [3]byte{0, 26, 112}: "Cisco-Linksys, LLC", + [3]byte{0, 26, 113}: "Diostech Co., Ltd.", + [3]byte{0, 26, 114}: "Mosart Semiconductor Corp.", + [3]byte{0, 26, 115}: "Gemtek Technology Co., Ltd.", + [3]byte{0, 26, 116}: "Procare International Co", + [3]byte{0, 26, 117}: "Sony Mobile Communications AB", + [3]byte{0, 26, 118}: "SDT information Technology Co.,LTD.", + [3]byte{0, 26, 119}: "ARRIS Group, Inc.", + [3]byte{0, 26, 120}: "ubtos", + [3]byte{0, 26, 121}: "TELECOMUNICATION TECHNOLOGIES LTD.", + [3]byte{0, 26, 122}: "Lismore Instruments Limited", + [3]byte{0, 26, 123}: "Teleco, Inc.", + [3]byte{0, 26, 124}: "Hirschmann Multimedia B.V.", + [3]byte{0, 26, 125}: "cyber-blue(HK)Ltd", + [3]byte{0, 26, 126}: "LN Srithai Comm Ltd.", + [3]byte{0, 26, 127}: "GCI Science & Technology Co.,LTD", + [3]byte{0, 26, 128}: "Sony Corporation", + [3]byte{0, 26, 129}: "Zelax", + [3]byte{0, 26, 130}: "PROBA Building Automation Co.,LTD", + [3]byte{0, 26, 131}: "Pegasus Technologies Inc.", + [3]byte{0, 26, 132}: "V One Multimedia Pte Ltd", + [3]byte{0, 26, 133}: "NV Michel Van de Wiele", + [3]byte{0, 26, 134}: "AdvancedIO Systems Inc", + [3]byte{0, 26, 135}: "Canhold International Limited", + [3]byte{0, 26, 136}: "Venergy,Co,Ltd", + [3]byte{0, 26, 137}: "Nokia Danmark A/S", + [3]byte{0, 26, 138}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 26, 139}: "CHUNIL ELECTRIC IND., CO.", + [3]byte{0, 26, 140}: "Sophos Ltd", + [3]byte{0, 26, 141}: "AVECS Bergen GmbH", + [3]byte{0, 26, 142}: "3Way Networks Ltd", + [3]byte{0, 26, 143}: "Nortel Networks", + [3]byte{0, 26, 144}: "Trópico Sistemas e Telecomunicações da Amazônia LTDA.", + [3]byte{0, 26, 145}: "FusionDynamic Ltd.", + [3]byte{0, 26, 146}: "ASUSTek COMPUTER INC.", + [3]byte{0, 26, 147}: "ERCO Leuchten GmbH", + [3]byte{0, 26, 148}: "Votronic GmbH", + [3]byte{0, 26, 149}: "Hisense Mobile Communications Technoligy Co.,Ltd.", + [3]byte{0, 26, 150}: "ECLER S.A.", + [3]byte{0, 26, 151}: "fitivision technology Inc.", + [3]byte{0, 26, 152}: "Asotel Communication Limited Taiwan Branch", + [3]byte{0, 26, 153}: "Smarty (HZ) Information Electronics Co., Ltd", + [3]byte{0, 26, 154}: "Skyworth Digital Technology(Shenzhen) Co.,Ltd", + [3]byte{0, 26, 155}: "ADEC & Parter AG", + [3]byte{0, 26, 156}: "RightHand Technologies, Inc.", + [3]byte{0, 26, 157}: "Skipper Wireless, Inc.", + [3]byte{0, 26, 158}: "ICON Digital International Limited", + [3]byte{0, 26, 159}: "A-Link Ltd", + [3]byte{0, 26, 160}: "Dell Inc.", + [3]byte{0, 26, 161}: "Cisco Systems, Inc", + [3]byte{0, 26, 162}: "Cisco Systems, Inc", + [3]byte{0, 26, 163}: "DELORME", + [3]byte{0, 26, 164}: "Future University-Hakodate", + [3]byte{0, 26, 165}: "BRN Phoenix", + [3]byte{0, 26, 166}: "Telefunken Radio Communication Systems GmbH &CO.KG", + [3]byte{0, 26, 167}: "Torian Wireless", + [3]byte{0, 26, 168}: "Mamiya Digital Imaging Co., Ltd.", + [3]byte{0, 26, 169}: "FUJIAN STAR-NET COMMUNICATION CO.,LTD", + [3]byte{0, 26, 170}: "Analogic Corp.", + [3]byte{0, 26, 171}: "eWings s.r.l.", + [3]byte{0, 26, 172}: "Corelatus AB", + [3]byte{0, 26, 173}: "ARRIS Group, Inc.", + [3]byte{0, 26, 174}: "Savant Systems LLC", + [3]byte{0, 26, 175}: "BLUSENS TECHNOLOGY", + [3]byte{0, 26, 176}: "Signal Networks Pvt. Ltd.,", + [3]byte{0, 26, 177}: "Asia Pacific Satellite Industries Co., Ltd.", + [3]byte{0, 26, 178}: "Cyber Solutions Inc.", + [3]byte{0, 26, 179}: "VISIONITE INC.", + [3]byte{0, 26, 180}: "FFEI Ltd.", + [3]byte{0, 26, 181}: "Home Network System", + [3]byte{0, 26, 182}: "Texas Instruments", + [3]byte{0, 26, 183}: "Ethos Networks LTD.", + [3]byte{0, 26, 184}: "Anseri Corporation", + [3]byte{0, 26, 185}: "PMC", + [3]byte{0, 26, 186}: "Caton Overseas Limited", + [3]byte{0, 26, 187}: "Fontal Technology Incorporation", + [3]byte{0, 26, 188}: "U4EA Technologies Ltd", + [3]byte{0, 26, 189}: "Impatica Inc.", + [3]byte{0, 26, 190}: "COMPUTER HI-TECH INC.", + [3]byte{0, 26, 191}: "TRUMPF Laser Marking Systems AG", + [3]byte{0, 26, 192}: "JOYBIEN TECHNOLOGIES CO., LTD.", + [3]byte{0, 26, 193}: "3Com Ltd", + [3]byte{0, 26, 194}: "YEC Co.,Ltd.", + [3]byte{0, 26, 195}: "Scientific-Atlanta, Inc", + [3]byte{0, 26, 196}: "2Wire Inc", + [3]byte{0, 26, 197}: "BreakingPoint Systems, Inc.", + [3]byte{0, 26, 198}: "Micro Control Designs", + [3]byte{0, 26, 199}: "UNIPOINT", + [3]byte{0, 26, 200}: "ISL (Instrumentation Scientifique de Laboratoire)", + [3]byte{0, 26, 201}: "SUZUKEN CO.,LTD", + [3]byte{0, 26, 202}: "Tilera Corporation", + [3]byte{0, 26, 203}: "Autocom Products Ltd", + [3]byte{0, 26, 204}: "Celestial Semiconductor, Ltd", + [3]byte{0, 26, 205}: "Tidel Engineering LP", + [3]byte{0, 26, 206}: "YUPITERU CORPORATION", + [3]byte{0, 26, 207}: "C.T. ELETTRONICA", + [3]byte{0, 26, 208}: "Albis Technologies AG", + [3]byte{0, 26, 209}: "FARGO CO., LTD.", + [3]byte{0, 26, 210}: "Eletronica Nitron Ltda", + [3]byte{0, 26, 211}: "Vamp Ltd.", + [3]byte{0, 26, 212}: "iPOX Technology Co., Ltd.", + [3]byte{0, 26, 213}: "KMC CHAIN INDUSTRIAL CO., LTD.", + [3]byte{0, 26, 214}: "JIAGNSU AETNA ELECTRIC CO.,LTD", + [3]byte{0, 26, 215}: "Christie Digital Systems, Inc.", + [3]byte{0, 26, 216}: "AlsterAero GmbH", + [3]byte{0, 26, 217}: "International Broadband Electric Communications, Inc.", + [3]byte{0, 26, 218}: "Biz-2-Me Inc.", + [3]byte{0, 26, 219}: "ARRIS Group, Inc.", + [3]byte{0, 26, 220}: "Nokia Danmark A/S", + [3]byte{0, 26, 221}: "PePWave Ltd", + [3]byte{0, 26, 222}: "ARRIS Group, Inc.", + [3]byte{0, 26, 223}: "Interactivetv Pty Limited", + [3]byte{0, 26, 224}: "Mythology Tech Express Inc.", + [3]byte{0, 26, 225}: "EDGE ACCESS INC", + [3]byte{0, 26, 226}: "Cisco Systems, Inc", + [3]byte{0, 26, 227}: "Cisco Systems, Inc", + [3]byte{0, 26, 228}: "Medicis Technologies Corporation", + [3]byte{0, 26, 229}: "Mvox Technologies Inc.", + [3]byte{0, 26, 230}: "Atlanta Advanced Communications Holdings Limited", + [3]byte{0, 26, 231}: "Aztek Networks, Inc.", + [3]byte{0, 26, 232}: "Unify Software and Solutions GmbH & Co. KG", + [3]byte{0, 26, 233}: "Nintendo Co., Ltd.", + [3]byte{0, 26, 234}: "Radio Terminal Systems Pty Ltd", + [3]byte{0, 26, 235}: "Allied Telesis R&D Center K.K.", + [3]byte{0, 26, 236}: "Keumbee Electronics Co.,Ltd.", + [3]byte{0, 26, 237}: "INCOTEC GmbH", + [3]byte{0, 26, 238}: "Shenztech Ltd", + [3]byte{0, 26, 239}: "Loopcomm Technology, Inc.", + [3]byte{0, 26, 240}: "Alcatel-Lucent IPD", + [3]byte{0, 26, 241}: "Embedded Artists AB", + [3]byte{0, 26, 242}: "Dynavisions Schweiz AG", + [3]byte{0, 26, 243}: "Samyoung Electronics", + [3]byte{0, 26, 244}: "Handreamnet", + [3]byte{0, 26, 245}: "PENTAONE. CO., LTD.", + [3]byte{0, 26, 246}: "Woven Systems, Inc.", + [3]byte{0, 26, 247}: "dataschalt e+a GmbH", + [3]byte{0, 26, 248}: "Copley Controls Corporation", + [3]byte{0, 26, 249}: "AeroVIronment (AV Inc)", + [3]byte{0, 26, 250}: "Welch Allyn, Inc.", + [3]byte{0, 26, 251}: "Joby Inc.", + [3]byte{0, 26, 252}: "ModusLink Corporation", + [3]byte{0, 26, 253}: "EVOLIS", + [3]byte{0, 26, 254}: "SOFACREAL", + [3]byte{0, 26, 255}: "Wizyoung Tech.", + [3]byte{0, 27, 0}: "Neopost Technologies", + [3]byte{0, 27, 1}: "Applied Radio Technologies", + [3]byte{0, 27, 2}: "ED Co.Ltd", + [3]byte{0, 27, 3}: "Action Technology (SZ) Co., Ltd", + [3]byte{0, 27, 4}: "Affinity International S.p.a", + [3]byte{0, 27, 5}: "YMC AG", + [3]byte{0, 27, 6}: "Ateliers R. LAUMONIER", + [3]byte{0, 27, 7}: "Mendocino Software", + [3]byte{0, 27, 8}: "Danfoss Drives A/S", + [3]byte{0, 27, 9}: "Matrix Telecom Pvt. Ltd.", + [3]byte{0, 27, 10}: "Intelligent Distributed Controls Ltd", + [3]byte{0, 27, 11}: "Phidgets Inc.", + [3]byte{0, 27, 12}: "Cisco Systems, Inc", + [3]byte{0, 27, 13}: "Cisco Systems, Inc", + [3]byte{0, 27, 14}: "InoTec GmbH Organisationssysteme", + [3]byte{0, 27, 15}: "Petratec", + [3]byte{0, 27, 16}: "ShenZhen Kang Hui Technology Co.,ltd", + [3]byte{0, 27, 17}: "D-Link Corporation", + [3]byte{0, 27, 18}: "Apprion", + [3]byte{0, 27, 19}: "Icron Technologies Corporation", + [3]byte{0, 27, 20}: "Carex Lighting Equipment Factory", + [3]byte{0, 27, 21}: "Voxtel, Inc.", + [3]byte{0, 27, 22}: "Celtro Ltd.", + [3]byte{0, 27, 23}: "Palo Alto Networks", + [3]byte{0, 27, 24}: "Tsuken Electric Ind. Co.,Ltd", + [3]byte{0, 27, 25}: "IEEE I&M Society TC9", + [3]byte{0, 27, 26}: "e-trees Japan, Inc.", + [3]byte{0, 27, 27}: "Siemens AG,", + [3]byte{0, 27, 28}: "Coherent", + [3]byte{0, 27, 29}: "Phoenix International Co., Ltd", + [3]byte{0, 27, 30}: "HART Communication Foundation", + [3]byte{0, 27, 31}: "DELTA - Danish Electronics, Light & Acoustics", + [3]byte{0, 27, 32}: "TPine Technology", + [3]byte{0, 27, 33}: "Intel Corporate", + [3]byte{0, 27, 34}: "Palit Microsystems ( H.K.) Ltd.", + [3]byte{0, 27, 35}: "SimpleComTools", + [3]byte{0, 27, 36}: "QUANTA COMPUTER INC.", + [3]byte{0, 27, 37}: "Nortel Networks", + [3]byte{0, 27, 38}: "RON-Telecom ZAO", + [3]byte{0, 27, 39}: "Merlin CSI", + [3]byte{0, 27, 40}: "POLYGON, JSC", + [3]byte{0, 27, 41}: "Avantis.Co.,Ltd", + [3]byte{0, 27, 42}: "Cisco Systems, Inc", + [3]byte{0, 27, 43}: "Cisco Systems, Inc", + [3]byte{0, 27, 44}: "ATRON electronic GmbH", + [3]byte{0, 27, 45}: "Med-Eng Systems Inc.", + [3]byte{0, 27, 46}: "Sinkyo Electron Inc", + [3]byte{0, 27, 47}: "NETGEAR", + [3]byte{0, 27, 48}: "Solitech Inc.", + [3]byte{0, 27, 49}: "Neural Image. Co. Ltd.", + [3]byte{0, 27, 50}: "QLogic Corporation", + [3]byte{0, 27, 51}: "Nokia Danmark A/S", + [3]byte{0, 27, 52}: "Focus System Inc.", + [3]byte{0, 27, 53}: "ChongQing JINOU Science & Technology Development CO.,Ltd", + [3]byte{0, 27, 54}: "Tsubata Engineering Co.,Ltd. (Head Office)", + [3]byte{0, 27, 55}: "Computec Oy", + [3]byte{0, 27, 56}: "COMPAL INFORMATION (KUNSHAN) CO., LTD.", + [3]byte{0, 27, 57}: "Proxicast", + [3]byte{0, 27, 58}: "SIMS Corp.", + [3]byte{0, 27, 59}: "Yi-Qing CO., LTD", + [3]byte{0, 27, 60}: "Software Technologies Group,Inc.", + [3]byte{0, 27, 61}: "EuroTel Spa", + [3]byte{0, 27, 62}: "Curtis, Inc.", + [3]byte{0, 27, 63}: "ProCurve Networking by HP", + [3]byte{0, 27, 64}: "Network Automation mxc AB", + [3]byte{0, 27, 65}: "General Infinity Co.,Ltd.", + [3]byte{0, 27, 66}: "Wise & Blue", + [3]byte{0, 27, 67}: "Beijing DG Telecommunications equipment Co.,Ltd", + [3]byte{0, 27, 68}: "SanDisk Corporation", + [3]byte{0, 27, 69}: "ABB AS, Division Automation Products", + [3]byte{0, 27, 70}: "Blueone Technology Co.,Ltd", + [3]byte{0, 27, 71}: "Futarque A/S", + [3]byte{0, 27, 72}: "Shenzhen Lantech Electronics Co., Ltd.", + [3]byte{0, 27, 73}: "Roberts Radio limited", + [3]byte{0, 27, 74}: "W&W Communications, Inc.", + [3]byte{0, 27, 75}: "SANION Co., Ltd.", + [3]byte{0, 27, 76}: "Signtech", + [3]byte{0, 27, 77}: "Areca Technology Corporation", + [3]byte{0, 27, 78}: "Navman New Zealand", + [3]byte{0, 27, 79}: "Avaya Inc", + [3]byte{0, 27, 80}: "Nizhny Novgorod Factory named after M.Frunze, FSUE (NZiF)", + [3]byte{0, 27, 81}: "Vector Technology Corp.", + [3]byte{0, 27, 82}: "ARRIS Group, Inc.", + [3]byte{0, 27, 83}: "Cisco Systems, Inc", + [3]byte{0, 27, 84}: "Cisco Systems, Inc", + [3]byte{0, 27, 85}: "Hurco Automation Ltd.", + [3]byte{0, 27, 86}: "Tehuti Networks Ltd.", + [3]byte{0, 27, 87}: "SEMINDIA SYSTEMS PRIVATE LIMITED", + [3]byte{0, 27, 88}: "ACE CAD Enterprise Co., Ltd.", + [3]byte{0, 27, 89}: "Sony Mobile Communications AB", + [3]byte{0, 27, 90}: "Apollo Imaging Technologies, Inc.", + [3]byte{0, 27, 91}: "2Wire Inc", + [3]byte{0, 27, 92}: "Azuretec Co., Ltd.", + [3]byte{0, 27, 93}: "Vololink Pty Ltd", + [3]byte{0, 27, 94}: "BPL Limited", + [3]byte{0, 27, 95}: "Alien Technology", + [3]byte{0, 27, 96}: "NAVIGON AG", + [3]byte{0, 27, 97}: "Digital Acoustics, LLC", + [3]byte{0, 27, 98}: "JHT Optoelectronics Co.,Ltd.", + [3]byte{0, 27, 99}: "Apple, Inc.", + [3]byte{0, 27, 100}: "IsaacLandKorea Co., Ltd,", + [3]byte{0, 27, 101}: "China Gridcom Co., Ltd", + [3]byte{0, 27, 102}: "Sennheiser electronic GmbH & Co. KG", + [3]byte{0, 27, 103}: "Cisco Systems Inc", + [3]byte{0, 27, 104}: "Modnnet Co., Ltd", + [3]byte{0, 27, 105}: "Equaline Corporation", + [3]byte{0, 27, 106}: "Powerwave Technologies Sweden AB", + [3]byte{0, 27, 107}: "Swyx Solutions AG", + [3]byte{0, 27, 108}: "LookX Digital Media BV", + [3]byte{0, 27, 109}: "Midtronics, Inc.", + [3]byte{0, 27, 110}: "Anue Systems, Inc.", + [3]byte{0, 27, 111}: "Teletrak Ltd", + [3]byte{0, 27, 112}: "IRI Ubiteq, INC.", + [3]byte{0, 27, 113}: "Telular Corp.", + [3]byte{0, 27, 114}: "Sicep s.p.a.", + [3]byte{0, 27, 115}: "DTL Broadcast Ltd", + [3]byte{0, 27, 116}: "MiraLink Corporation", + [3]byte{0, 27, 117}: "Hypermedia Systems", + [3]byte{0, 27, 118}: "Ripcode, Inc.", + [3]byte{0, 27, 119}: "Intel Corporate", + [3]byte{0, 27, 120}: "Hewlett Packard", + [3]byte{0, 27, 121}: "FAIVELEY TRANSPORT", + [3]byte{0, 27, 122}: "Nintendo Co., Ltd.", + [3]byte{0, 27, 123}: "The Tintometer Ltd", + [3]byte{0, 27, 124}: "A & R Cambridge", + [3]byte{0, 27, 125}: "CXR Anderson Jacobson", + [3]byte{0, 27, 126}: "Beckmann GmbH", + [3]byte{0, 27, 127}: "TMN Technologies Telecomunicacoes Ltda", + [3]byte{0, 27, 128}: "LORD Corporation", + [3]byte{0, 27, 129}: "DATAQ Instruments, Inc.", + [3]byte{0, 27, 130}: "Taiwan Semiconductor Co., Ltd.", + [3]byte{0, 27, 131}: "Finsoft Ltd", + [3]byte{0, 27, 132}: "Scan Engineering Telecom", + [3]byte{0, 27, 133}: "MAN Diesel SE", + [3]byte{0, 27, 134}: "Bosch Access Systems GmbH", + [3]byte{0, 27, 135}: "Deepsound Tech. Co., Ltd", + [3]byte{0, 27, 136}: "Divinet Access Technologies Ltd", + [3]byte{0, 27, 137}: "EMZA Visual Sense Ltd.", + [3]byte{0, 27, 138}: "2M Electronic A/S", + [3]byte{0, 27, 139}: "NEC Platforms, Ltd.", + [3]byte{0, 27, 140}: "JMicron Technology Corp.", + [3]byte{0, 27, 141}: "Electronic Computer Systems, Inc.", + [3]byte{0, 27, 142}: "Hulu Sweden AB", + [3]byte{0, 27, 143}: "Cisco Systems, Inc", + [3]byte{0, 27, 144}: "Cisco Systems, Inc", + [3]byte{0, 27, 145}: "EFKON AG", + [3]byte{0, 27, 146}: "l-acoustics", + [3]byte{0, 27, 147}: "JC Decaux SA DNT", + [3]byte{0, 27, 148}: "T.E.M.A. S.p.A.", + [3]byte{0, 27, 149}: "VIDEO SYSTEMS SRL", + [3]byte{0, 27, 150}: "General Sensing", + [3]byte{0, 27, 151}: "Violin Technologies", + [3]byte{0, 27, 152}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 27, 153}: "KS System GmbH", + [3]byte{0, 27, 154}: "Apollo Fire Detectors Ltd", + [3]byte{0, 27, 155}: "Hose-McCann Communications", + [3]byte{0, 27, 156}: "SATEL sp. z o.o.", + [3]byte{0, 27, 157}: "Novus Security Sp. z o.o.", + [3]byte{0, 27, 158}: "ASKEY COMPUTER CORP", + [3]byte{0, 27, 159}: "Calyptech Pty Ltd", + [3]byte{0, 27, 160}: "Awox", + [3]byte{0, 27, 161}: "Åmic AB", + [3]byte{0, 27, 162}: "IDS Imaging Development Systems GmbH", + [3]byte{0, 27, 163}: "Flexit Group GmbH", + [3]byte{0, 27, 164}: "S.A.E Afikim", + [3]byte{0, 27, 165}: "MyungMin Systems, Inc.", + [3]byte{0, 27, 166}: "intotech inc.", + [3]byte{0, 27, 167}: "Lorica Solutions", + [3]byte{0, 27, 168}: "UBI&MOBI,.Inc", + [3]byte{0, 27, 169}: "Brother industries, LTD.", + [3]byte{0, 27, 170}: "XenICs nv", + [3]byte{0, 27, 171}: "Telchemy, Incorporated", + [3]byte{0, 27, 172}: "Curtiss Wright Controls Embedded Computing", + [3]byte{0, 27, 173}: "iControl Incorporated", + [3]byte{0, 27, 174}: "Micro Control Systems, Inc", + [3]byte{0, 27, 175}: "Nokia Danmark A/S", + [3]byte{0, 27, 176}: "BHARAT ELECTRONICS", + [3]byte{0, 27, 177}: "Wistron Neweb Corporation", + [3]byte{0, 27, 178}: "Intellect International NV", + [3]byte{0, 27, 179}: "Condalo GmbH", + [3]byte{0, 27, 180}: "Airvod Limited", + [3]byte{0, 27, 181}: "Cherry GmbH", + [3]byte{0, 27, 182}: "Bird Electronic Corp.", + [3]byte{0, 27, 183}: "Alta Heights Technology Corp.", + [3]byte{0, 27, 184}: "BLUEWAY ELECTRONIC CO;LTD", + [3]byte{0, 27, 185}: "Elitegroup Computer Systems Co.,Ltd.", + [3]byte{0, 27, 186}: "Nortel Networks", + [3]byte{0, 27, 187}: "RFTech Co.,Ltd", + [3]byte{0, 27, 188}: "Silver Peak Systems, Inc.", + [3]byte{0, 27, 189}: "FMC Kongsberg Subsea AS", + [3]byte{0, 27, 190}: "ICOP Digital", + [3]byte{0, 27, 191}: "Sagemcom Broadband SAS", + [3]byte{0, 27, 192}: "Juniper Networks", + [3]byte{0, 27, 193}: "HOLUX Technology, Inc.", + [3]byte{0, 27, 194}: "Integrated Control Technology Limitied", + [3]byte{0, 27, 195}: "Mobisolution Co.,Ltd", + [3]byte{0, 27, 196}: "Ultratec, Inc.", + [3]byte{0, 27, 197}: "IEEE Registration Authority", + [3]byte{0, 27, 198}: "Strato Rechenzentrum AG", + [3]byte{0, 27, 199}: "StarVedia Technology Inc.", + [3]byte{0, 27, 200}: "MIURA CO.,LTD", + [3]byte{0, 27, 201}: "FSN DISPLAY INC", + [3]byte{0, 27, 202}: "Beijing Run Technology LTD. Company", + [3]byte{0, 27, 203}: "PEMPEK SYSTEMS PTY LTD", + [3]byte{0, 27, 204}: "KINGTEK CCTV ALLIANCE CO., LTD.", + [3]byte{0, 27, 205}: "DAVISCOMMS (S) PTE LTD", + [3]byte{0, 27, 206}: "Measurement Devices Ltd", + [3]byte{0, 27, 207}: "Dataupia Corporation", + [3]byte{0, 27, 208}: "IDENTEC SOLUTIONS", + [3]byte{0, 27, 209}: "SOGESTMATIC", + [3]byte{0, 27, 210}: "ULTRA-X ASIA PACIFIC Inc.", + [3]byte{0, 27, 211}: "Panasonic Corporation AVC Networks Company", + [3]byte{0, 27, 212}: "Cisco Systems, Inc", + [3]byte{0, 27, 213}: "Cisco Systems, Inc", + [3]byte{0, 27, 214}: "Kelvin Hughes Ltd", + [3]byte{0, 27, 215}: "Cisco SPVTG", + [3]byte{0, 27, 216}: "DVTel LTD", + [3]byte{0, 27, 217}: "Edgewater Computer Systems", + [3]byte{0, 27, 218}: "UTStarcom Inc", + [3]byte{0, 27, 219}: "Valeo VECS", + [3]byte{0, 27, 220}: "Vencer Co., Ltd.", + [3]byte{0, 27, 221}: "ARRIS Group, Inc.", + [3]byte{0, 27, 222}: "Renkus-Heinz, Inc.", + [3]byte{0, 27, 223}: "Iskra Sistemi d.d.", + [3]byte{0, 27, 224}: "TELENOT ELECTRONIC GmbH", + [3]byte{0, 27, 225}: "ViaLogy", + [3]byte{0, 27, 226}: "AhnLab,Inc.", + [3]byte{0, 27, 227}: "Health Hero Network, Inc.", + [3]byte{0, 27, 228}: "TOWNET SRL", + [3]byte{0, 27, 229}: "802automation Limited", + [3]byte{0, 27, 230}: "VR AG", + [3]byte{0, 27, 231}: "Postek Electronics Co., Ltd.", + [3]byte{0, 27, 232}: "Ultratronik GmbH", + [3]byte{0, 27, 233}: "Broadcom", + [3]byte{0, 27, 234}: "Nintendo Co., Ltd.", + [3]byte{0, 27, 235}: "DMP Electronics INC.", + [3]byte{0, 27, 236}: "Netio Technologies Co., Ltd", + [3]byte{0, 27, 237}: "Brocade Communications Systems, Inc.", + [3]byte{0, 27, 238}: "Nokia Danmark A/S", + [3]byte{0, 27, 239}: "Blossoms Digital Technology Co.,Ltd.", + [3]byte{0, 27, 240}: "Value Platforms Limited", + [3]byte{0, 27, 241}: "Nanjing SilverNet Software Co., Ltd.", + [3]byte{0, 27, 242}: "KWORLD COMPUTER CO., LTD", + [3]byte{0, 27, 243}: "TRANSRADIO SenderSysteme Berlin AG", + [3]byte{0, 27, 244}: "KENWIN INDUSTRIAL(HK) LTD.", + [3]byte{0, 27, 245}: "Tellink Sistemas de Telecomunicación S.L.", + [3]byte{0, 27, 246}: "CONWISE Technology Corporation Ltd.", + [3]byte{0, 27, 247}: "Lund IP Products AB", + [3]byte{0, 27, 248}: "Digitrax Inc.", + [3]byte{0, 27, 249}: "Intellitect Water Ltd", + [3]byte{0, 27, 250}: "G.i.N. mbH", + [3]byte{0, 27, 251}: "ALPS ELECTRIC CO.,LTD.", + [3]byte{0, 27, 252}: "ASUSTek COMPUTER INC.", + [3]byte{0, 27, 253}: "Dignsys Inc.", + [3]byte{0, 27, 254}: "Zavio Inc.", + [3]byte{0, 27, 255}: "Millennia Media inc.", + [3]byte{0, 28, 0}: "Entry Point, LLC", + [3]byte{0, 28, 1}: "ABB Oy Drives", + [3]byte{0, 28, 2}: "Pano Logic", + [3]byte{0, 28, 3}: "Betty TV Technology AG", + [3]byte{0, 28, 4}: "Airgain, Inc.", + [3]byte{0, 28, 5}: "Nonin Medical Inc.", + [3]byte{0, 28, 6}: "Siemens Numerical Control Ltd., Nanjing", + [3]byte{0, 28, 7}: "Cwlinux Limited", + [3]byte{0, 28, 8}: "Echo360, Inc.", + [3]byte{0, 28, 9}: "SAE Electronic Co.,Ltd.", + [3]byte{0, 28, 10}: "Shenzhen AEE Technology Co.,Ltd.", + [3]byte{0, 28, 11}: "SmartAnt Telecom", + [3]byte{0, 28, 12}: "TANITA Corporation", + [3]byte{0, 28, 13}: "G-Technology, Inc.", + [3]byte{0, 28, 14}: "Cisco Systems, Inc", + [3]byte{0, 28, 15}: "Cisco Systems, Inc", + [3]byte{0, 28, 16}: "Cisco-Linksys, LLC", + [3]byte{0, 28, 17}: "ARRIS Group, Inc.", + [3]byte{0, 28, 18}: "ARRIS Group, Inc.", + [3]byte{0, 28, 19}: "OPTSYS TECHNOLOGY CO., LTD.", + [3]byte{0, 28, 20}: "VMware, Inc.", + [3]byte{0, 28, 21}: "iPhotonix LLC", + [3]byte{0, 28, 22}: "ThyssenKrupp Elevator", + [3]byte{0, 28, 23}: "Nortel Networks", + [3]byte{0, 28, 24}: "Sicert S.r.L.", + [3]byte{0, 28, 25}: "secunet Security Networks AG", + [3]byte{0, 28, 26}: "Thomas Instrumentation, Inc", + [3]byte{0, 28, 27}: "Hyperstone GmbH", + [3]byte{0, 28, 28}: "Center Communication Systems GmbH", + [3]byte{0, 28, 29}: "CHENZHOU GOSPELL DIGITAL TECHNOLOGY CO.,LTD", + [3]byte{0, 28, 30}: "emtrion GmbH", + [3]byte{0, 28, 31}: "Quest Retail Technology Pty Ltd", + [3]byte{0, 28, 32}: "CLB Benelux", + [3]byte{0, 28, 33}: "Nucsafe Inc.", + [3]byte{0, 28, 34}: "Aeris Elettronica s.r.l.", + [3]byte{0, 28, 35}: "Dell Inc.", + [3]byte{0, 28, 36}: "Formosa Wireless Systems Corp.", + [3]byte{0, 28, 37}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{0, 28, 38}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{0, 28, 39}: "Sunell Electronics Co.", + [3]byte{0, 28, 40}: "Sphairon Technologies GmbH", + [3]byte{0, 28, 41}: "CORE DIGITAL ELECTRONICS CO., LTD", + [3]byte{0, 28, 42}: "Envisacor Technologies Inc.", + [3]byte{0, 28, 43}: "Alertme.com Limited", + [3]byte{0, 28, 44}: "Synapse", + [3]byte{0, 28, 45}: "FlexRadio Systems", + [3]byte{0, 28, 46}: "HPN Supply Chain", + [3]byte{0, 28, 47}: "Pfister GmbH", + [3]byte{0, 28, 48}: "Mode Lighting (UK ) Ltd.", + [3]byte{0, 28, 49}: "Mobile XP Technology Co., LTD", + [3]byte{0, 28, 50}: "Telian Corporation", + [3]byte{0, 28, 51}: "Sutron", + [3]byte{0, 28, 52}: "HUEY CHIAO INTERNATIONAL CO., LTD.", + [3]byte{0, 28, 53}: "Nokia Danmark A/S", + [3]byte{0, 28, 54}: "iNEWiT NV", + [3]byte{0, 28, 55}: "Callpod, Inc.", + [3]byte{0, 28, 56}: "Bio-Rad Laboratories, Inc.", + [3]byte{0, 28, 57}: "S Netsystems Inc.", + [3]byte{0, 28, 58}: "Element Labs, Inc.", + [3]byte{0, 28, 59}: "AmRoad Technology Inc.", + [3]byte{0, 28, 60}: "Seon Design Inc.", + [3]byte{0, 28, 61}: "WaveStorm", + [3]byte{0, 28, 62}: "ECKey Corporation", + [3]byte{0, 28, 63}: "International Police Technologies, Inc.", + [3]byte{0, 28, 64}: "VDG-Security bv", + [3]byte{0, 28, 65}: "scemtec Transponder Technology GmbH", + [3]byte{0, 28, 66}: "Parallels, Inc.", + [3]byte{0, 28, 67}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 28, 68}: "Bosch Security Systems BV", + [3]byte{0, 28, 69}: "Chenbro Micom Co., Ltd.", + [3]byte{0, 28, 70}: "QTUM", + [3]byte{0, 28, 71}: "Hangzhou Hollysys Automation Co., Ltd", + [3]byte{0, 28, 72}: "WiDeFi, Inc.", + [3]byte{0, 28, 73}: "Zoltan Technology Inc.", + [3]byte{0, 28, 74}: "AVM GmbH", + [3]byte{0, 28, 75}: "Gener8, Inc.", + [3]byte{0, 28, 76}: "Petrotest Instruments", + [3]byte{0, 28, 77}: "Aplix IP Holdings Corporation", + [3]byte{0, 28, 78}: "TASA International Limited", + [3]byte{0, 28, 79}: "MACAB AB", + [3]byte{0, 28, 80}: "TCL Technoly Electronics (Huizhou) Co., Ltd.", + [3]byte{0, 28, 81}: "Celeno Communications", + [3]byte{0, 28, 82}: "VISIONEE SRL", + [3]byte{0, 28, 83}: "Synergy Lighting Controls", + [3]byte{0, 28, 84}: "Hillstone Networks Inc", + [3]byte{0, 28, 85}: "Shenzhen Kaifa Technology Co.", + [3]byte{0, 28, 86}: "Pado Systems, Inc.", + [3]byte{0, 28, 87}: "Cisco Systems, Inc", + [3]byte{0, 28, 88}: "Cisco Systems, Inc", + [3]byte{0, 28, 89}: "DEVON IT", + [3]byte{0, 28, 90}: "Advanced Relay Corporation", + [3]byte{0, 28, 91}: "Chubb Electronic Security Systems Ltd", + [3]byte{0, 28, 92}: "Integrated Medical Systems, Inc.", + [3]byte{0, 28, 93}: "Leica Microsystems", + [3]byte{0, 28, 94}: "ASTON France", + [3]byte{0, 28, 95}: "Winland Electronics, Inc.", + [3]byte{0, 28, 96}: "CSP Frontier Technologies,Inc.", + [3]byte{0, 28, 97}: "Galaxy Microsystems LImited", + [3]byte{0, 28, 98}: "LG Electronics (Mobile Communications)", + [3]byte{0, 28, 99}: "TRUEN", + [3]byte{0, 28, 100}: "Landis+Gyr", + [3]byte{0, 28, 101}: "JoeScan, Inc.", + [3]byte{0, 28, 102}: "UCAMP CO.,LTD", + [3]byte{0, 28, 103}: "Pumpkin Networks, Inc.", + [3]byte{0, 28, 104}: "Anhui Sun Create Electronics Co., Ltd", + [3]byte{0, 28, 105}: "Packet Vision Ltd", + [3]byte{0, 28, 106}: "Weiss Engineering Ltd.", + [3]byte{0, 28, 107}: "COVAX Co. Ltd", + [3]byte{0, 28, 108}: "30805", + [3]byte{0, 28, 109}: "KYOHRITSU ELECTRONIC INDUSTRY CO., LTD.", + [3]byte{0, 28, 110}: "Newbury Networks, Inc.", + [3]byte{0, 28, 111}: "Emfit Ltd", + [3]byte{0, 28, 112}: "NOVACOMM LTDA", + [3]byte{0, 28, 113}: "Emergent Electronics", + [3]byte{0, 28, 114}: "Mayer & Cie GmbH & Co KG", + [3]byte{0, 28, 115}: "Arista Networks", + [3]byte{0, 28, 116}: "Syswan Technologies Inc.", + [3]byte{0, 28, 117}: "Segnet Ltd.", + [3]byte{0, 28, 118}: "The Wandsworth Group Ltd", + [3]byte{0, 28, 119}: "Prodys", + [3]byte{0, 28, 120}: "WYPLAY SAS", + [3]byte{0, 28, 121}: "Cohesive Financial Technologies LLC", + [3]byte{0, 28, 122}: "Perfectone Netware Company Ltd", + [3]byte{0, 28, 123}: "Castlenet Technology Inc.", + [3]byte{0, 28, 124}: "PERQ SYSTEMS CORPORATION", + [3]byte{0, 28, 125}: "Excelpoint Manufacturing Pte Ltd", + [3]byte{0, 28, 126}: "Toshiba", + [3]byte{0, 28, 127}: "Check Point Software Technologies", + [3]byte{0, 28, 128}: "New Business Division/Rhea-Information CO., LTD.", + [3]byte{0, 28, 129}: "NextGen Venturi LTD", + [3]byte{0, 28, 130}: "Genew Technologies", + [3]byte{0, 28, 131}: "New Level Telecom Co., Ltd.", + [3]byte{0, 28, 132}: "STL Solution Co.,Ltd.", + [3]byte{0, 28, 133}: "Eunicorn", + [3]byte{0, 28, 134}: "Cranite Systems, Inc.", + [3]byte{0, 28, 135}: "Uriver Inc.", + [3]byte{0, 28, 136}: "TRANSYSTEM INC.", + [3]byte{0, 28, 137}: "Force Communications, Inc.", + [3]byte{0, 28, 138}: "Cirrascale Corporation", + [3]byte{0, 28, 139}: "MJ Innovations Ltd.", + [3]byte{0, 28, 140}: "DIAL TECHNOLOGY LTD.", + [3]byte{0, 28, 141}: "Mesa Imaging", + [3]byte{0, 28, 142}: "Alcatel-Lucent IPD", + [3]byte{0, 28, 143}: "Advanced Electronic Design, Inc.", + [3]byte{0, 28, 144}: "Empacket Corporation", + [3]byte{0, 28, 145}: "Gefen Inc.", + [3]byte{0, 28, 146}: "Tervela", + [3]byte{0, 28, 147}: "ExaDigm Inc", + [3]byte{0, 28, 148}: "LI-COR Biosciences", + [3]byte{0, 28, 149}: "Opticomm Corporation", + [3]byte{0, 28, 150}: "Linkwise Technology Pte Ltd", + [3]byte{0, 28, 151}: "Enzytek Technology Inc.,", + [3]byte{0, 28, 152}: "LUCKY TECHNOLOGY (HK) COMPANY LIMITED", + [3]byte{0, 28, 153}: "Shunra Software Ltd.", + [3]byte{0, 28, 154}: "Nokia Danmark A/S", + [3]byte{0, 28, 155}: "FEIG ELECTRONIC GmbH", + [3]byte{0, 28, 156}: "Nortel Networks", + [3]byte{0, 28, 157}: "Liecthi AG", + [3]byte{0, 28, 158}: "Dualtech IT AB", + [3]byte{0, 28, 159}: "Razorstream, LLC", + [3]byte{0, 28, 160}: "Production Resource Group, LLC", + [3]byte{0, 28, 161}: "AKAMAI TECHNOLOGIES, INC.", + [3]byte{0, 28, 162}: "ADB Broadband Italia", + [3]byte{0, 28, 163}: "Terra", + [3]byte{0, 28, 164}: "Sony Mobile Communications AB", + [3]byte{0, 28, 165}: "Zygo Corporation", + [3]byte{0, 28, 166}: "Win4NET", + [3]byte{0, 28, 167}: "International Quartz Limited", + [3]byte{0, 28, 168}: "AirTies Wireless Networks", + [3]byte{0, 28, 169}: "Audiomatica Srl", + [3]byte{0, 28, 170}: "Bellon Pty Ltd", + [3]byte{0, 28, 171}: "Meyer Sound Laboratories, Inc.", + [3]byte{0, 28, 172}: "Qniq Technology Corp.", + [3]byte{0, 28, 173}: "Wuhan Telecommunication Devices Co.,Ltd", + [3]byte{0, 28, 174}: "WiChorus, Inc.", + [3]byte{0, 28, 175}: "Plato Networks Inc.", + [3]byte{0, 28, 176}: "Cisco Systems, Inc", + [3]byte{0, 28, 177}: "Cisco Systems, Inc", + [3]byte{0, 28, 178}: "BPT SPA", + [3]byte{0, 28, 179}: "Apple, Inc.", + [3]byte{0, 28, 180}: "Iridium Satellite LLC", + [3]byte{0, 28, 181}: "Neihua Network Technology Co.,LTD.(NHN)", + [3]byte{0, 28, 182}: "Duzon CNT Co., Ltd.", + [3]byte{0, 28, 183}: "USC DigiArk Corporation", + [3]byte{0, 28, 184}: "CBC Co., Ltd", + [3]byte{0, 28, 185}: "KWANG SUNG ELECTRONICS CO., LTD.", + [3]byte{0, 28, 186}: "VerScient, Inc.", + [3]byte{0, 28, 187}: "MusicianLink", + [3]byte{0, 28, 188}: "CastGrabber, LLC", + [3]byte{0, 28, 189}: "Ezze Mobile Tech., Inc.", + [3]byte{0, 28, 190}: "Nintendo Co., Ltd.", + [3]byte{0, 28, 191}: "Intel Corporate", + [3]byte{0, 28, 192}: "Intel Corporate", + [3]byte{0, 28, 193}: "ARRIS Group, Inc.", + [3]byte{0, 28, 194}: "Part II Research, Inc.", + [3]byte{0, 28, 195}: "ARRIS Group, Inc.", + [3]byte{0, 28, 196}: "Hewlett Packard", + [3]byte{0, 28, 197}: "3Com Ltd", + [3]byte{0, 28, 198}: "ProStor Systems", + [3]byte{0, 28, 199}: "Rembrandt Technologies, LLC d/b/a REMSTREAM", + [3]byte{0, 28, 200}: "INDUSTRONIC Industrie-Electronic GmbH & Co. KG", + [3]byte{0, 28, 201}: "Kaise Electronic Technology Co., Ltd.", + [3]byte{0, 28, 202}: "Shanghai Gaozhi Science & Technology Development Co.", + [3]byte{0, 28, 203}: "Forth Corporation Public Company Limited", + [3]byte{0, 28, 204}: "BlackBerry RTS", + [3]byte{0, 28, 205}: "Alektrona Corporation", + [3]byte{0, 28, 206}: "By Techdesign", + [3]byte{0, 28, 207}: "LIMETEK", + [3]byte{0, 28, 208}: "Circleone Co.,Ltd.", + [3]byte{0, 28, 209}: "Waves Audio LTD", + [3]byte{0, 28, 210}: "King Champion (Hong Kong) Limited", + [3]byte{0, 28, 211}: "ZP Engineering SEL", + [3]byte{0, 28, 212}: "Nokia Danmark A/S", + [3]byte{0, 28, 213}: "ZeeVee, Inc.", + [3]byte{0, 28, 214}: "Nokia Danmark A/S", + [3]byte{0, 28, 215}: "Harman/Becker Automotive Systems GmbH", + [3]byte{0, 28, 216}: "BlueAnt Wireless", + [3]byte{0, 28, 217}: "GlobalTop Technology Inc.", + [3]byte{0, 28, 218}: "Exegin Technologies Limited", + [3]byte{0, 28, 219}: "CARPOINT CO.,LTD", + [3]byte{0, 28, 220}: "Custom Computer Services, Inc.", + [3]byte{0, 28, 221}: "COWBELL ENGINEERING CO., LTD.", + [3]byte{0, 28, 222}: "Interactive Multimedia eXchange Inc.", + [3]byte{0, 28, 223}: "Belkin International Inc.", + [3]byte{0, 28, 224}: "DASAN TPS", + [3]byte{0, 28, 225}: "INDRA SISTEMAS, S.A.", + [3]byte{0, 28, 226}: "Attero Tech, LLC.", + [3]byte{0, 28, 227}: "Optimedical Systems", + [3]byte{0, 28, 228}: "EleSy JSC", + [3]byte{0, 28, 229}: "MBS Electronic Systems GmbH", + [3]byte{0, 28, 230}: "INNES", + [3]byte{0, 28, 231}: "Rocon PLC Research Centre", + [3]byte{0, 28, 232}: "Cummins Inc", + [3]byte{0, 28, 233}: "Galaxy Technology Limited", + [3]byte{0, 28, 234}: "Scientific-Atlanta, Inc", + [3]byte{0, 28, 235}: "Nortel Networks", + [3]byte{0, 28, 236}: "Mobilesoft (Aust.) Pty Ltd", + [3]byte{0, 28, 237}: "ENVIRONNEMENT SA", + [3]byte{0, 28, 238}: "SHARP Corporation", + [3]byte{0, 28, 239}: "Primax Electronics Ltd.", + [3]byte{0, 28, 240}: "D-Link Corporation", + [3]byte{0, 28, 241}: "SUPoX Technology Co. , LTD.", + [3]byte{0, 28, 242}: "Tenlon Technology Co.,Ltd.", + [3]byte{0, 28, 243}: "EVS BROADCAST EQUIPMENT", + [3]byte{0, 28, 244}: "Media Technology Systems Inc", + [3]byte{0, 28, 245}: "Wiseblue Technology Limited", + [3]byte{0, 28, 246}: "Cisco Systems, Inc", + [3]byte{0, 28, 247}: "AudioScience", + [3]byte{0, 28, 248}: "Parade Technologies, Ltd.", + [3]byte{0, 28, 249}: "Cisco Systems, Inc", + [3]byte{0, 28, 250}: "Alarm.com", + [3]byte{0, 28, 251}: "ARRIS Group, Inc.", + [3]byte{0, 28, 252}: "Sumitomo Electric Industries,Ltd", + [3]byte{0, 28, 253}: "Universal Electronics, Inc.", + [3]byte{0, 28, 254}: "Quartics Inc", + [3]byte{0, 28, 255}: "Napera Networks Inc", + [3]byte{0, 29, 0}: "Brivo Systems, LLC", + [3]byte{0, 29, 1}: "Neptune Digital", + [3]byte{0, 29, 2}: "Cybertech Telecom Development", + [3]byte{0, 29, 3}: "Design Solutions Inc.", + [3]byte{0, 29, 4}: "Zipit Wireless, Inc.", + [3]byte{0, 29, 5}: "Eaton Corporation", + [3]byte{0, 29, 6}: "HM Electronics, Inc.", + [3]byte{0, 29, 7}: "Shenzhen Sang Fei Consumer Communications Co.,Ltd", + [3]byte{0, 29, 8}: "Jiangsu Yinhe Electronics Co.,Ltd.", + [3]byte{0, 29, 9}: "Dell Inc.", + [3]byte{0, 29, 10}: "Davis Instruments, Inc.", + [3]byte{0, 29, 11}: "Power Standards Lab", + [3]byte{0, 29, 12}: "MobileCompia", + [3]byte{0, 29, 13}: "Sony Interactive Entertainment Inc.", + [3]byte{0, 29, 14}: "Agapha Technology co., Ltd.", + [3]byte{0, 29, 15}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{0, 29, 16}: "LightHaus Logic, Inc.", + [3]byte{0, 29, 17}: "Analogue & Micro Ltd", + [3]byte{0, 29, 18}: "ROHM CO., LTD.", + [3]byte{0, 29, 19}: "NextGTV", + [3]byte{0, 29, 20}: "SPERADTONE INFORMATION TECHNOLOGY LIMITED", + [3]byte{0, 29, 21}: "Shenzhen Dolphin Electronic Co., Ltd", + [3]byte{0, 29, 22}: "SFR", + [3]byte{0, 29, 23}: "Digital Sky Corporation", + [3]byte{0, 29, 24}: "Power Innovation GmbH", + [3]byte{0, 29, 25}: "Arcadyan Technology Corporation", + [3]byte{0, 29, 26}: "OvisLink S.A.", + [3]byte{0, 29, 27}: "Sangean Electronics Inc.", + [3]byte{0, 29, 28}: "Gennet s.a.", + [3]byte{0, 29, 29}: "Inter-M Corporation", + [3]byte{0, 29, 30}: "KYUSHU TEN CO.,LTD", + [3]byte{0, 29, 31}: "Siauliu Tauro Televizoriai, JSC", + [3]byte{0, 29, 32}: "Comtrend Corporation", + [3]byte{0, 29, 33}: "Alcad SL", + [3]byte{0, 29, 34}: "Foss Analytical A/S", + [3]byte{0, 29, 35}: "SENSUS", + [3]byte{0, 29, 36}: "Aclara Power-Line Systems Inc.", + [3]byte{0, 29, 37}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 29, 38}: "Rockridgesound Technology Co.", + [3]byte{0, 29, 39}: "NAC-INTERCOM", + [3]byte{0, 29, 40}: "Sony Mobile Communications AB", + [3]byte{0, 29, 41}: "Doro AB", + [3]byte{0, 29, 42}: "SHENZHEN BUL-TECH CO.,LTD.", + [3]byte{0, 29, 43}: "Wuhan Pont Technology CO. , LTD", + [3]byte{0, 29, 44}: "Wavetrend Technologies (Pty) Limited", + [3]byte{0, 29, 45}: "Pylone, Inc.", + [3]byte{0, 29, 46}: "Ruckus Wireless", + [3]byte{0, 29, 47}: "QuantumVision Corporation", + [3]byte{0, 29, 48}: "YX Wireless S.A.", + [3]byte{0, 29, 49}: "HIGHPRO INTERNATIONAL R&D CO,.LTD.", + [3]byte{0, 29, 50}: "Longkay Communication & Technology (Shanghai) Co. Ltd", + [3]byte{0, 29, 51}: "Maverick Systems Inc.", + [3]byte{0, 29, 52}: "SYRIS Technology Corp", + [3]byte{0, 29, 53}: "Viconics Electronics Inc.", + [3]byte{0, 29, 54}: "ELECTRONICS CORPORATION OF INDIA LIMITED", + [3]byte{0, 29, 55}: "Thales-Panda Transportation System", + [3]byte{0, 29, 56}: "Seagate Technology", + [3]byte{0, 29, 57}: "MOOHADIGITAL CO., LTD", + [3]byte{0, 29, 58}: "mh acoustics LLC", + [3]byte{0, 29, 59}: "Nokia Danmark A/S", + [3]byte{0, 29, 60}: "Muscle Corporation", + [3]byte{0, 29, 61}: "Avidyne Corporation", + [3]byte{0, 29, 62}: "SAKA TECHNO SCIENCE CO.,LTD", + [3]byte{0, 29, 63}: "Mitron Pty Ltd", + [3]byte{0, 29, 64}: "Intel – GE Care Innovations LLC", + [3]byte{0, 29, 65}: "Hardy Instruments", + [3]byte{0, 29, 66}: "Nortel Networks", + [3]byte{0, 29, 67}: "Shenzhen G-link Digital Technology Co., Ltd.", + [3]byte{0, 29, 68}: "Krohne", + [3]byte{0, 29, 69}: "Cisco Systems, Inc", + [3]byte{0, 29, 70}: "Cisco Systems, Inc", + [3]byte{0, 29, 71}: "Covote GmbH & Co KG", + [3]byte{0, 29, 72}: "Sensor-Technik Wiedemann GmbH", + [3]byte{0, 29, 73}: "Innovation Wireless Inc.", + [3]byte{0, 29, 74}: "Carestream Health, Inc.", + [3]byte{0, 29, 75}: "Grid Connect Inc.", + [3]byte{0, 29, 76}: "Alcatel-Lucent", + [3]byte{0, 29, 77}: "Adaptive Recognition Hungary, Inc", + [3]byte{0, 29, 78}: "TCM Mobile LLC", + [3]byte{0, 29, 79}: "Apple, Inc.", + [3]byte{0, 29, 80}: "SPINETIX SA", + [3]byte{0, 29, 81}: "Babcock & Wilcox Power Generation Group, Inc", + [3]byte{0, 29, 82}: "Defzone B.V.", + [3]byte{0, 29, 83}: "S&O Electronics (Malaysia) Sdn. Bhd.", + [3]byte{0, 29, 84}: "Sunnic Technology & Merchandise INC.", + [3]byte{0, 29, 85}: "ZANTAZ, Inc", + [3]byte{0, 29, 86}: "Kramer Electronics Ltd.", + [3]byte{0, 29, 87}: "CAETEC Messtechnik", + [3]byte{0, 29, 88}: "CQ Inc", + [3]byte{0, 29, 89}: "Mitra Energy & Infrastructure", + [3]byte{0, 29, 90}: "2Wire Inc", + [3]byte{0, 29, 91}: "Tecvan Informática Ltda", + [3]byte{0, 29, 92}: "Tom Communication Industrial Co.,Ltd.", + [3]byte{0, 29, 93}: "Control Dynamics Pty. Ltd.", + [3]byte{0, 29, 94}: "COMING MEDIA CORP.", + [3]byte{0, 29, 95}: "OverSpeed SARL", + [3]byte{0, 29, 96}: "ASUSTek COMPUTER INC.", + [3]byte{0, 29, 97}: "BIJ Corporation", + [3]byte{0, 29, 98}: "InPhase Technologies", + [3]byte{0, 29, 99}: "Miele & Cie. KG", + [3]byte{0, 29, 100}: "Adam Communications Systems Int Ltd", + [3]byte{0, 29, 101}: "Microwave Radio Communications", + [3]byte{0, 29, 102}: "Hyundai Telecom", + [3]byte{0, 29, 103}: "AMEC", + [3]byte{0, 29, 104}: "Thomson Telecom Belgium", + [3]byte{0, 29, 105}: "Knorr-Bremse IT-Services GmbH", + [3]byte{0, 29, 106}: "Alpha Networks Inc.", + [3]byte{0, 29, 107}: "ARRIS Group, Inc.", + [3]byte{0, 29, 108}: "ClariPhy Communications, Inc.", + [3]byte{0, 29, 109}: "Confidant International LLC", + [3]byte{0, 29, 110}: "Nokia Danmark A/S", + [3]byte{0, 29, 111}: "Chainzone Technology Co., Ltd", + [3]byte{0, 29, 112}: "Cisco Systems, Inc", + [3]byte{0, 29, 113}: "Cisco Systems, Inc", + [3]byte{0, 29, 114}: "Wistron Corporation", + [3]byte{0, 29, 115}: "BUFFALO.INC", + [3]byte{0, 29, 116}: "Tianjin China-Silicon Microelectronics Co., Ltd.", + [3]byte{0, 29, 117}: "Radioscape PLC", + [3]byte{0, 29, 118}: "Eyeheight Ltd.", + [3]byte{0, 29, 119}: "NSGate", + [3]byte{0, 29, 120}: "Invengo Information Technology Co.,Ltd", + [3]byte{0, 29, 121}: "SIGNAMAX LLC", + [3]byte{0, 29, 122}: "Wideband Semiconductor, Inc.", + [3]byte{0, 29, 123}: "Ice Energy, Inc.", + [3]byte{0, 29, 124}: "ABE Elettronica S.p.A.", + [3]byte{0, 29, 125}: "GIGA-BYTE TECHNOLOGY CO.,LTD.", + [3]byte{0, 29, 126}: "Cisco-Linksys, LLC", + [3]byte{0, 29, 127}: "Tekron International Ltd", + [3]byte{0, 29, 128}: "Beijing Huahuan Eletronics Co.,Ltd", + [3]byte{0, 29, 129}: "GUANGZHOU GATEWAY ELECTRONICS CO., LTD", + [3]byte{0, 29, 130}: "GN Netcom A/S", + [3]byte{0, 29, 131}: "Emitech Corporation", + [3]byte{0, 29, 132}: "Gateway, Inc.", + [3]byte{0, 29, 133}: "Call Direct Cellular Solutions", + [3]byte{0, 29, 134}: "Shinwa Industries(China) Ltd.", + [3]byte{0, 29, 135}: "VigTech Labs Sdn Bhd", + [3]byte{0, 29, 136}: "Clearwire", + [3]byte{0, 29, 137}: "VaultStor Corporation", + [3]byte{0, 29, 138}: "TechTrex Inc", + [3]byte{0, 29, 139}: "ADB Broadband Italia", + [3]byte{0, 29, 140}: "La Crosse Technology LTD", + [3]byte{0, 29, 141}: "Raytek GmbH", + [3]byte{0, 29, 142}: "Alereon, Inc.", + [3]byte{0, 29, 143}: "PureWave Networks", + [3]byte{0, 29, 144}: "EMCO Flow Systems", + [3]byte{0, 29, 145}: "Digitize, Inc", + [3]byte{0, 29, 146}: "MICRO-STAR INT'L CO.,LTD.", + [3]byte{0, 29, 147}: "Modacom", + [3]byte{0, 29, 148}: "Climax Technology Co., Ltd", + [3]byte{0, 29, 149}: "Flash, Inc.", + [3]byte{0, 29, 150}: "WatchGuard Video", + [3]byte{0, 29, 151}: "Alertus Technologies LLC", + [3]byte{0, 29, 152}: "Nokia Danmark A/S", + [3]byte{0, 29, 153}: "Cyan Optic, Inc.", + [3]byte{0, 29, 154}: "GODEX INTERNATIONAL CO., LTD", + [3]byte{0, 29, 155}: "Hokuyo Automatic Co., Ltd.", + [3]byte{0, 29, 156}: "Rockwell Automation", + [3]byte{0, 29, 157}: "ARTJOY INTERNATIONAL LIMITED", + [3]byte{0, 29, 158}: "AXION TECHNOLOGIES", + [3]byte{0, 29, 159}: "MATT R.P.Traczynscy Sp.J.", + [3]byte{0, 29, 160}: "Heng Yu Electronic Manufacturing Company Limited", + [3]byte{0, 29, 161}: "Cisco Systems, Inc", + [3]byte{0, 29, 162}: "Cisco Systems, Inc", + [3]byte{0, 29, 163}: "SabiOso", + [3]byte{0, 29, 164}: "Hangzhou System Technology CO., LTD", + [3]byte{0, 29, 165}: "WB Electronics", + [3]byte{0, 29, 166}: "Media Numerics Limited", + [3]byte{0, 29, 167}: "Seamless Internet", + [3]byte{0, 29, 168}: "Takahata Electronics Co.,Ltd", + [3]byte{0, 29, 169}: "Castles Technology, Co., LTD", + [3]byte{0, 29, 170}: "DrayTek Corp.", + [3]byte{0, 29, 171}: "SwissQual License AG", + [3]byte{0, 29, 172}: "Gigamon Systems LLC", + [3]byte{0, 29, 173}: "Sinotech Engineering Consultants, Inc. Geotechnical Enginee", + [3]byte{0, 29, 174}: "CHANG TSENG TECHNOLOGY CO., LTD", + [3]byte{0, 29, 175}: "Nortel Networks", + [3]byte{0, 29, 176}: "FuJian HengTong Information Technology Co.,Ltd", + [3]byte{0, 29, 177}: "Crescendo Networks", + [3]byte{0, 29, 178}: "HOKKAIDO ELECTRIC ENGINEERING CO.,LTD.", + [3]byte{0, 29, 179}: "HPN Supply Chain", + [3]byte{0, 29, 180}: "KUMHO ENG CO.,LTD", + [3]byte{0, 29, 181}: "Juniper Networks", + [3]byte{0, 29, 182}: "BestComm Networks, Inc.", + [3]byte{0, 29, 183}: "Tendril Networks, Inc.", + [3]byte{0, 29, 184}: "Intoto Inc.", + [3]byte{0, 29, 185}: "Wellspring Wireless", + [3]byte{0, 29, 186}: "Sony Corporation", + [3]byte{0, 29, 187}: "Dynamic System Electronics Corp.", + [3]byte{0, 29, 188}: "Nintendo Co., Ltd.", + [3]byte{0, 29, 189}: "Versamed Inc.", + [3]byte{0, 29, 190}: "ARRIS Group, Inc.", + [3]byte{0, 29, 191}: "Radiient Technologies, Inc.", + [3]byte{0, 29, 192}: "Enphase Energy", + [3]byte{0, 29, 193}: "Audinate Pty L", + [3]byte{0, 29, 194}: "XORTEC OY", + [3]byte{0, 29, 195}: "RIKOR TV, Ltd", + [3]byte{0, 29, 196}: "AIOI Systems Co., Ltd.", + [3]byte{0, 29, 197}: "Beijing Jiaxun Feihong Electricial Co., Ltd.", + [3]byte{0, 29, 198}: "SNR Inc.", + [3]byte{0, 29, 199}: "L-3 Communications Geneva Aerospace", + [3]byte{0, 29, 200}: "Navionics Research Inc., dba SCADAmetrics", + [3]byte{0, 29, 201}: "GainSpan Corp.", + [3]byte{0, 29, 202}: "PAV Electronics Limited", + [3]byte{0, 29, 203}: "Exéns Development Oy", + [3]byte{0, 29, 204}: "Ayon Cyber Security, Inc", + [3]byte{0, 29, 205}: "ARRIS Group, Inc.", + [3]byte{0, 29, 206}: "ARRIS Group, Inc.", + [3]byte{0, 29, 207}: "ARRIS Group, Inc.", + [3]byte{0, 29, 208}: "ARRIS Group, Inc.", + [3]byte{0, 29, 209}: "ARRIS Group, Inc.", + [3]byte{0, 29, 210}: "ARRIS Group, Inc.", + [3]byte{0, 29, 211}: "ARRIS Group, Inc.", + [3]byte{0, 29, 212}: "ARRIS Group, Inc.", + [3]byte{0, 29, 213}: "ARRIS Group, Inc.", + [3]byte{0, 29, 214}: "ARRIS Group, Inc.", + [3]byte{0, 29, 215}: "Algolith", + [3]byte{0, 29, 216}: "Microsoft Corporation", + [3]byte{0, 29, 217}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{0, 29, 218}: "Mikroelektronika spol. s r. o.", + [3]byte{0, 29, 219}: "C-BEL Corporation", + [3]byte{0, 29, 220}: "HangZhou DeChangLong Tech&Info Co.,Ltd", + [3]byte{0, 29, 221}: "DAT H.K. LIMITED", + [3]byte{0, 29, 222}: "Zhejiang Broadcast&Television Technology Co.,Ltd.", + [3]byte{0, 29, 223}: "Sunitec Enterprise Co., Ltd.", + [3]byte{0, 29, 224}: "Intel Corporate", + [3]byte{0, 29, 225}: "Intel Corporate", + [3]byte{0, 29, 226}: "Radionor Communications", + [3]byte{0, 29, 227}: "Intuicom", + [3]byte{0, 29, 228}: "Visioneered Image Systems", + [3]byte{0, 29, 229}: "Cisco Systems, Inc", + [3]byte{0, 29, 230}: "Cisco Systems, Inc", + [3]byte{0, 29, 231}: "Marine Sonic Technology, Ltd.", + [3]byte{0, 29, 232}: "Nikko Denki Tsushin Corporation(NDTC)", + [3]byte{0, 29, 233}: "Nokia Danmark A/S", + [3]byte{0, 29, 234}: "Commtest Instruments Ltd", + [3]byte{0, 29, 235}: "DINEC International", + [3]byte{0, 29, 236}: "Marusys", + [3]byte{0, 29, 237}: "Grid Net, Inc.", + [3]byte{0, 29, 238}: "NEXTVISION SISTEMAS DIGITAIS DE TELEVISÃO LTDA.", + [3]byte{0, 29, 239}: "TRIMM, INC.", + [3]byte{0, 29, 240}: "Vidient Systems, Inc.", + [3]byte{0, 29, 241}: "Intego Systems, Inc.", + [3]byte{0, 29, 242}: "Netflix, Inc.", + [3]byte{0, 29, 243}: "SBS Science & Technology Co., Ltd", + [3]byte{0, 29, 244}: "Magellan Technology Pty Limited", + [3]byte{0, 29, 245}: "Sunshine Co,LTD", + [3]byte{0, 29, 246}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 29, 247}: "R. STAHL Schaltgeräte GmbH", + [3]byte{0, 29, 248}: "Webpro Vision Technology Corporation", + [3]byte{0, 29, 249}: "Cybiotronics (Far East) Limited", + [3]byte{0, 29, 250}: "Fujian LANDI Commercial Equipment Co.,Ltd", + [3]byte{0, 29, 251}: "NETCLEUS Systems Corporation", + [3]byte{0, 29, 252}: "KSIC", + [3]byte{0, 29, 253}: "Nokia Danmark A/S", + [3]byte{0, 29, 254}: "Palm, Inc", + [3]byte{0, 29, 255}: "Network Critical Solutions Ltd", + [3]byte{0, 30, 0}: "Shantou Institute of Ultrasonic Instruments", + [3]byte{0, 30, 1}: "Renesas Technology Sales Co., Ltd.", + [3]byte{0, 30, 2}: "Sougou Keikaku Kougyou Co.,Ltd.", + [3]byte{0, 30, 3}: "LiComm Co., Ltd.", + [3]byte{0, 30, 4}: "Hanson Research Corporation", + [3]byte{0, 30, 5}: "Xseed Technologies & Computing", + [3]byte{0, 30, 6}: "WIBRAIN", + [3]byte{0, 30, 7}: "Winy Technology Co., Ltd.", + [3]byte{0, 30, 8}: "Centec Networks Inc", + [3]byte{0, 30, 9}: "ZEFATEK Co.,LTD", + [3]byte{0, 30, 10}: "Syba Tech Limited", + [3]byte{0, 30, 11}: "Hewlett Packard", + [3]byte{0, 30, 12}: "Sherwood Information Partners, Inc.", + [3]byte{0, 30, 13}: "Micran Ltd.", + [3]byte{0, 30, 14}: "MAXI VIEW HOLDINGS LIMITED", + [3]byte{0, 30, 15}: "Briot International", + [3]byte{0, 30, 16}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{0, 30, 17}: "ELELUX INTERNATIONAL LTD", + [3]byte{0, 30, 18}: "Ecolab", + [3]byte{0, 30, 19}: "Cisco Systems, Inc", + [3]byte{0, 30, 20}: "Cisco Systems, Inc", + [3]byte{0, 30, 21}: "Beech Hill Electronics", + [3]byte{0, 30, 22}: "Keytronix", + [3]byte{0, 30, 23}: "STN BV", + [3]byte{0, 30, 24}: "Radio Activity srl", + [3]byte{0, 30, 25}: "GTRI", + [3]byte{0, 30, 26}: "Best Source Taiwan Inc.", + [3]byte{0, 30, 27}: "Digital Stream Technology, Inc.", + [3]byte{0, 30, 28}: "SWS Australia Pty Limited", + [3]byte{0, 30, 29}: "East Coast Datacom, Inc.", + [3]byte{0, 30, 30}: "Honeywell Life Safety", + [3]byte{0, 30, 31}: "Nortel Networks", + [3]byte{0, 30, 32}: "Intertain Inc.", + [3]byte{0, 30, 33}: "Qisda Corporation", + [3]byte{0, 30, 34}: "ARVOO Imaging Products BV", + [3]byte{0, 30, 35}: "Electronic Educational Devices, Inc", + [3]byte{0, 30, 36}: "Zhejiang Bell Technology Co.,ltd", + [3]byte{0, 30, 37}: "INTEK DIGITAL", + [3]byte{0, 30, 38}: "Digifriends Co. Ltd", + [3]byte{0, 30, 39}: "SBN TECH Co.,Ltd.", + [3]byte{0, 30, 40}: "Lumexis Corporation", + [3]byte{0, 30, 41}: "Hypertherm Inc", + [3]byte{0, 30, 42}: "NETGEAR", + [3]byte{0, 30, 43}: "Radio Systems Design, Inc.", + [3]byte{0, 30, 44}: "CyVerse Corporation", + [3]byte{0, 30, 45}: "STIM", + [3]byte{0, 30, 46}: "SIRTI S.p.A.", + [3]byte{0, 30, 47}: "DiMoto Pty Ltd", + [3]byte{0, 30, 48}: "Shireen Inc", + [3]byte{0, 30, 49}: "INFOMARK CO.,LTD.", + [3]byte{0, 30, 50}: "Zensys", + [3]byte{0, 30, 51}: "INVENTEC Corporation", + [3]byte{0, 30, 52}: "CryptoMetrics", + [3]byte{0, 30, 53}: "Nintendo Co., Ltd.", + [3]byte{0, 30, 54}: "IPTE", + [3]byte{0, 30, 55}: "Universal Global Scientific Industrial Co., Ltd.", + [3]byte{0, 30, 56}: "Bluecard Software Technology Co., Ltd.", + [3]byte{0, 30, 57}: "Comsys Communication Ltd.", + [3]byte{0, 30, 58}: "Nokia Danmark A/S", + [3]byte{0, 30, 59}: "Nokia Danmark A/S", + [3]byte{0, 30, 60}: "Lyngbox Media AB", + [3]byte{0, 30, 61}: "ALPS ELECTRIC CO.,LTD.", + [3]byte{0, 30, 62}: "KMW Inc.", + [3]byte{0, 30, 63}: "TrellisWare Technologies, Inc.", + [3]byte{0, 30, 64}: "Shanghai DareGlobal Technologies Co.,Ltd", + [3]byte{0, 30, 65}: "Microwave Communication & Component, Inc.", + [3]byte{0, 30, 66}: "Teltonika", + [3]byte{0, 30, 67}: "AISIN AW CO.,LTD.", + [3]byte{0, 30, 68}: "SANTEC", + [3]byte{0, 30, 69}: "Sony Mobile Communications AB", + [3]byte{0, 30, 70}: "ARRIS Group, Inc.", + [3]byte{0, 30, 71}: "PT. Hariff Daya Tunggal Engineering", + [3]byte{0, 30, 72}: "Wi-Links", + [3]byte{0, 30, 73}: "Cisco Systems, Inc", + [3]byte{0, 30, 74}: "Cisco Systems, Inc", + [3]byte{0, 30, 75}: "City Theatrical", + [3]byte{0, 30, 76}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{0, 30, 77}: "Welkin Sciences, LLC", + [3]byte{0, 30, 78}: "DAKO EDV-Ingenieur- und Systemhaus GmbH", + [3]byte{0, 30, 79}: "Dell Inc.", + [3]byte{0, 30, 80}: "BATTISTONI RESEARCH", + [3]byte{0, 30, 81}: "Converter Industry Srl", + [3]byte{0, 30, 82}: "Apple, Inc.", + [3]byte{0, 30, 83}: "Further Tech Co., LTD", + [3]byte{0, 30, 84}: "TOYO ELECTRIC Corporation", + [3]byte{0, 30, 85}: "COWON SYSTEMS,Inc.", + [3]byte{0, 30, 86}: "Bally Wulff Entertainment GmbH", + [3]byte{0, 30, 87}: "ALCOMA, spol. s r.o.", + [3]byte{0, 30, 88}: "D-Link Corporation", + [3]byte{0, 30, 89}: "Silicon Turnkey Express, LLC", + [3]byte{0, 30, 90}: "ARRIS Group, Inc.", + [3]byte{0, 30, 91}: "Unitron Company, Inc.", + [3]byte{0, 30, 92}: "RB GeneralEkonomik", + [3]byte{0, 30, 93}: "Holosys d.o.o.", + [3]byte{0, 30, 94}: "COmputime Ltd.", + [3]byte{0, 30, 95}: "KwikByte, LLC", + [3]byte{0, 30, 96}: "Digital Lighting Systems, Inc", + [3]byte{0, 30, 97}: "ITEC GmbH", + [3]byte{0, 30, 98}: "Siemon", + [3]byte{0, 30, 99}: "Vibro-Meter SA", + [3]byte{0, 30, 100}: "Intel Corporate", + [3]byte{0, 30, 101}: "Intel Corporate", + [3]byte{0, 30, 102}: "RESOL Elektronische Regelungen GmbH", + [3]byte{0, 30, 103}: "Intel Corporate", + [3]byte{0, 30, 104}: "QUANTA COMPUTER INC.", + [3]byte{0, 30, 105}: "Thomson Inc.", + [3]byte{0, 30, 106}: "Beijing Bluexon Technology Co.,Ltd", + [3]byte{0, 30, 107}: "Cisco SPVTG", + [3]byte{0, 30, 108}: "Opaque Systems", + [3]byte{0, 30, 109}: "IT R&D Center", + [3]byte{0, 30, 110}: "Shenzhen First Mile Communications Ltd", + [3]byte{0, 30, 111}: "Magna-Power Electronics, Inc.", + [3]byte{0, 30, 112}: "Cobham Defence Communications Ltd", + [3]byte{0, 30, 113}: "MIrcom Group of Companies", + [3]byte{0, 30, 114}: "PCS", + [3]byte{0, 30, 115}: "zte corporation", + [3]byte{0, 30, 116}: "Sagemcom Broadband SAS", + [3]byte{0, 30, 117}: "LG Electronics (Mobile Communications)", + [3]byte{0, 30, 118}: "Thermo Fisher Scientific", + [3]byte{0, 30, 119}: "Air2App", + [3]byte{0, 30, 120}: "Owitek Technology Ltd.,", + [3]byte{0, 30, 121}: "Cisco Systems, Inc", + [3]byte{0, 30, 122}: "Cisco Systems, Inc", + [3]byte{0, 30, 123}: "R.I.CO. S.r.l.", + [3]byte{0, 30, 124}: "Taiwick Limited", + [3]byte{0, 30, 125}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 30, 126}: "Nortel Networks", + [3]byte{0, 30, 127}: "CBM of America", + [3]byte{0, 30, 128}: "Last Mile Ltd.", + [3]byte{0, 30, 129}: "CNB Technology Inc.", + [3]byte{0, 30, 130}: "SanDisk Corporation", + [3]byte{0, 30, 131}: "LAN/MAN Standards Association (LMSC)", + [3]byte{0, 30, 132}: "Pika Technologies Inc.", + [3]byte{0, 30, 133}: "Lagotek Corporation", + [3]byte{0, 30, 134}: "MEL Co.,Ltd.", + [3]byte{0, 30, 135}: "Realease Limited", + [3]byte{0, 30, 136}: "ANDOR SYSTEM SUPPORT CO., LTD.", + [3]byte{0, 30, 137}: "CRFS Limited", + [3]byte{0, 30, 138}: "eCopy, Inc", + [3]byte{0, 30, 139}: "Infra Access Korea Co., Ltd.", + [3]byte{0, 30, 140}: "ASUSTek COMPUTER INC.", + [3]byte{0, 30, 141}: "ARRIS Group, Inc.", + [3]byte{0, 30, 142}: "Hunkeler AG", + [3]byte{0, 30, 143}: "CANON INC.", + [3]byte{0, 30, 144}: "Elitegroup Computer Systems Co.,Ltd.", + [3]byte{0, 30, 145}: "KIMIN Electronic Co., Ltd.", + [3]byte{0, 30, 146}: "JEULIN S.A.", + [3]byte{0, 30, 147}: "CiriTech Systems Inc", + [3]byte{0, 30, 148}: "SUPERCOM TECHNOLOGY CORPORATION", + [3]byte{0, 30, 149}: "SIGMALINK", + [3]byte{0, 30, 150}: "Sepura Plc", + [3]byte{0, 30, 151}: "Medium Link System Technology CO., LTD,", + [3]byte{0, 30, 152}: "GreenLine Communications", + [3]byte{0, 30, 153}: "Vantanol Industrial Corporation", + [3]byte{0, 30, 154}: "HAMILTON Bonaduz AG", + [3]byte{0, 30, 155}: "San-Eisha, Ltd.", + [3]byte{0, 30, 156}: "Fidustron INC", + [3]byte{0, 30, 157}: "Recall Technologies, Inc.", + [3]byte{0, 30, 158}: "ddm hopt + schuler Gmbh + Co. KG", + [3]byte{0, 30, 159}: "Visioneering Systems, Inc.", + [3]byte{0, 30, 160}: "XLN-t", + [3]byte{0, 30, 161}: "Brunata a/s", + [3]byte{0, 30, 162}: "Symx Systems, Inc.", + [3]byte{0, 30, 163}: "Nokia Danmark A/S", + [3]byte{0, 30, 164}: "Nokia Danmark A/S", + [3]byte{0, 30, 165}: "ROBOTOUS, Inc.", + [3]byte{0, 30, 166}: "Best IT World (India) Pvt. Ltd.", + [3]byte{0, 30, 167}: "Actiontec Electronics, Inc", + [3]byte{0, 30, 168}: "Datang Mobile Communications Equipment CO.,LTD", + [3]byte{0, 30, 169}: "Nintendo Co., Ltd.", + [3]byte{0, 30, 170}: "E-Senza Technologies GmbH", + [3]byte{0, 30, 171}: "TeleWell Oy", + [3]byte{0, 30, 172}: "Armadeus Systems", + [3]byte{0, 30, 173}: "Wingtech Group Limited", + [3]byte{0, 30, 174}: "Continental Automotive Systems Inc.", + [3]byte{0, 30, 175}: "Ophir Optronics Ltd", + [3]byte{0, 30, 176}: "ImesD Electronica S.L.", + [3]byte{0, 30, 177}: "Cryptsoft Pty Ltd", + [3]byte{0, 30, 178}: "LG innotek", + [3]byte{0, 30, 179}: "Primex Wireless", + [3]byte{0, 30, 180}: "UNIFAT TECHNOLOGY LTD.", + [3]byte{0, 30, 181}: "Ever Sparkle Technologies Ltd", + [3]byte{0, 30, 182}: "TAG Heuer SA", + [3]byte{0, 30, 183}: "TBTech, Co., Ltd.", + [3]byte{0, 30, 184}: "Fortis, Inc.", + [3]byte{0, 30, 185}: "Sing Fai Technology Limited", + [3]byte{0, 30, 186}: "High Density Devices AS", + [3]byte{0, 30, 187}: "BLUELIGHT TECHNOLOGY INC.", + [3]byte{0, 30, 188}: "WINTECH AUTOMATION CO.,LTD.", + [3]byte{0, 30, 189}: "Cisco Systems, Inc", + [3]byte{0, 30, 190}: "Cisco Systems, Inc", + [3]byte{0, 30, 191}: "Haas Automation Inc.", + [3]byte{0, 30, 192}: "Microchip Technology Inc.", + [3]byte{0, 30, 193}: "3COM EUROPE LTD", + [3]byte{0, 30, 194}: "Apple, Inc.", + [3]byte{0, 30, 195}: "Kozio, Inc.", + [3]byte{0, 30, 196}: "Celio Corp", + [3]byte{0, 30, 197}: "Middle Atlantic Products Inc", + [3]byte{0, 30, 198}: "Obvius Holdings LLC", + [3]byte{0, 30, 199}: "2Wire Inc", + [3]byte{0, 30, 200}: "Rapid Mobile (Pty) Ltd", + [3]byte{0, 30, 201}: "Dell Inc.", + [3]byte{0, 30, 202}: "Nortel Networks", + [3]byte{0, 30, 203}: "RPC Energoautomatika Ltd", + [3]byte{0, 30, 204}: "CDVI", + [3]byte{0, 30, 205}: "KYLAND Technology Co. LTD", + [3]byte{0, 30, 206}: "BISA Technologies (Hong Kong) Limited", + [3]byte{0, 30, 207}: "PHILIPS ELECTRONICS UK LTD", + [3]byte{0, 30, 208}: "Ingespace", + [3]byte{0, 30, 209}: "Keyprocessor B.V.", + [3]byte{0, 30, 210}: "Ray Shine Video Technology Inc", + [3]byte{0, 30, 211}: "Dot Technology Int'l Co., Ltd.", + [3]byte{0, 30, 212}: "Doble Engineering", + [3]byte{0, 30, 213}: "Tekon-Automatics", + [3]byte{0, 30, 214}: "Alentec & Orion AB", + [3]byte{0, 30, 215}: "H-Stream Wireless, Inc.", + [3]byte{0, 30, 216}: "Digital United Inc.", + [3]byte{0, 30, 217}: "Mitsubishi Precision Co.,LTd.", + [3]byte{0, 30, 218}: "Wesemann Elektrotechniek B.V.", + [3]byte{0, 30, 219}: "Giken Trastem Co., Ltd.", + [3]byte{0, 30, 220}: "Sony Mobile Communications AB", + [3]byte{0, 30, 221}: "WASKO S.A.", + [3]byte{0, 30, 222}: "BYD COMPANY LIMITED", + [3]byte{0, 30, 223}: "Master Industrialization Center Kista", + [3]byte{0, 30, 224}: "Urmet Domus SpA", + [3]byte{0, 30, 225}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 30, 226}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 30, 227}: "T&W Electronics (ShenZhen) Co.,Ltd", + [3]byte{0, 30, 228}: "ACS Solutions France", + [3]byte{0, 30, 229}: "Cisco-Linksys, LLC", + [3]byte{0, 30, 230}: "Shenzhen Advanced Video Info-Tech Co., Ltd.", + [3]byte{0, 30, 231}: "Epic Systems Inc", + [3]byte{0, 30, 232}: "Mytek", + [3]byte{0, 30, 233}: "Stoneridge Electronics AB", + [3]byte{0, 30, 234}: "Sensor Switch, Inc.", + [3]byte{0, 30, 235}: "Talk-A-Phone Co.", + [3]byte{0, 30, 236}: "COMPAL INFORMATION (KUNSHAN) CO., LTD.", + [3]byte{0, 30, 237}: "Adventiq Ltd.", + [3]byte{0, 30, 238}: "ETL Systems Ltd", + [3]byte{0, 30, 239}: "Cantronic International Limited", + [3]byte{0, 30, 240}: "Gigafin Networks", + [3]byte{0, 30, 241}: "Servimat", + [3]byte{0, 30, 242}: "Micro Motion Inc", + [3]byte{0, 30, 243}: "From2", + [3]byte{0, 30, 244}: "L-3 Communications Display Systems", + [3]byte{0, 30, 245}: "Hitek Automated Inc.", + [3]byte{0, 30, 246}: "Cisco Systems, Inc", + [3]byte{0, 30, 247}: "Cisco Systems, Inc", + [3]byte{0, 30, 248}: "Emfinity Inc.", + [3]byte{0, 30, 249}: "Pascom Kommunikations systeme GmbH.", + [3]byte{0, 30, 250}: "PROTEI Ltd.", + [3]byte{0, 30, 251}: "Trio Motion Technology Ltd", + [3]byte{0, 30, 252}: "JSC MASSA-K", + [3]byte{0, 30, 253}: "Microbit 2.0 AB", + [3]byte{0, 30, 254}: "LEVEL s.r.o.", + [3]byte{0, 30, 255}: "Mueller-Elektronik GmbH & Co. KG", + [3]byte{0, 31, 0}: "Nokia Danmark A/S", + [3]byte{0, 31, 1}: "Nokia Danmark A/S", + [3]byte{0, 31, 2}: "Pixelmetrix Corporation Pte Ltd", + [3]byte{0, 31, 3}: "NUM AG", + [3]byte{0, 31, 4}: "Granch Ltd.", + [3]byte{0, 31, 5}: "iTAS Technology Corp.", + [3]byte{0, 31, 6}: "Integrated Dispatch Solutions", + [3]byte{0, 31, 7}: "AZTEQ Mobile", + [3]byte{0, 31, 8}: "RISCO LTD", + [3]byte{0, 31, 9}: "Jastec", + [3]byte{0, 31, 10}: "Nortel Networks", + [3]byte{0, 31, 11}: "Federal State Unitary Enterprise Industrial UnionElectropribor", + [3]byte{0, 31, 12}: "Intelligent Digital Services GmbH", + [3]byte{0, 31, 13}: "L3 Communications - Telemetry West", + [3]byte{0, 31, 14}: "Japan Kyastem Co., Ltd", + [3]byte{0, 31, 15}: "Select Engineered Systems", + [3]byte{0, 31, 16}: "TOLEDO DO BRASIL INDUSTRIA DE BALANCAS LTDA", + [3]byte{0, 31, 17}: "OPENMOKO, INC.", + [3]byte{0, 31, 18}: "Juniper Networks", + [3]byte{0, 31, 19}: "S.& A.S. Ltd.", + [3]byte{0, 31, 20}: "NexG", + [3]byte{0, 31, 21}: "Bioscrypt Inc", + [3]byte{0, 31, 22}: "Wistron Corporation", + [3]byte{0, 31, 23}: "IDX Company, Ltd.", + [3]byte{0, 31, 24}: "Hakusan.Mfg.Co,.Ltd", + [3]byte{0, 31, 25}: "BEN-RI ELECTRONICA S.A.", + [3]byte{0, 31, 26}: "Prominvest", + [3]byte{0, 31, 27}: "RoyalTek Company Ltd.", + [3]byte{0, 31, 28}: "KOBISHI ELECTRIC Co.,Ltd.", + [3]byte{0, 31, 29}: "Atlas Material Testing Technology LLC", + [3]byte{0, 31, 30}: "Astec Technology Co., Ltd", + [3]byte{0, 31, 31}: "Edimax Technology Co. Ltd.", + [3]byte{0, 31, 32}: "Logitech Europe SA", + [3]byte{0, 31, 33}: "Inner Mongolia Yin An Science & Technology Development Co.,L", + [3]byte{0, 31, 34}: "Source Photonics, Inc.", + [3]byte{0, 31, 35}: "Interacoustics", + [3]byte{0, 31, 36}: "DIGITVIEW TECHNOLOGY CO., LTD.", + [3]byte{0, 31, 37}: "MBS GmbH", + [3]byte{0, 31, 38}: "Cisco Systems, Inc", + [3]byte{0, 31, 39}: "Cisco Systems, Inc", + [3]byte{0, 31, 40}: "HPN Supply Chain", + [3]byte{0, 31, 41}: "Hewlett Packard", + [3]byte{0, 31, 42}: "ACCM", + [3]byte{0, 31, 43}: "Orange Logic", + [3]byte{0, 31, 44}: "Starbridge Networks", + [3]byte{0, 31, 45}: "Electro-Optical Imaging, Inc.", + [3]byte{0, 31, 46}: "Triangle Research Int'l Pte Ltd", + [3]byte{0, 31, 47}: "Berker GmbH & Co. KG", + [3]byte{0, 31, 48}: "Travelping", + [3]byte{0, 31, 49}: "Radiocomp", + [3]byte{0, 31, 50}: "Nintendo Co., Ltd.", + [3]byte{0, 31, 51}: "NETGEAR", + [3]byte{0, 31, 52}: "Lung Hwa Electronics Co., Ltd.", + [3]byte{0, 31, 53}: "AIR802 LLC", + [3]byte{0, 31, 54}: "Bellwin Information Co. Ltd.,", + [3]byte{0, 31, 55}: "Genesis I&C", + [3]byte{0, 31, 56}: "POSITRON", + [3]byte{0, 31, 57}: "Construcciones y Auxiliar de Ferrocarriles, S.A.", + [3]byte{0, 31, 58}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{0, 31, 59}: "Intel Corporate", + [3]byte{0, 31, 60}: "Intel Corporate", + [3]byte{0, 31, 61}: "Qbit GmbH", + [3]byte{0, 31, 62}: "RP-Technik e.K.", + [3]byte{0, 31, 63}: "AVM GmbH", + [3]byte{0, 31, 64}: "Speakercraft Inc.", + [3]byte{0, 31, 65}: "Ruckus Wireless", + [3]byte{0, 31, 66}: "Etherstack plc", + [3]byte{0, 31, 67}: "ENTES ELEKTRONIK", + [3]byte{0, 31, 68}: "GE Transportation Systems", + [3]byte{0, 31, 69}: "Enterasys", + [3]byte{0, 31, 70}: "Nortel Networks", + [3]byte{0, 31, 71}: "MCS Logic Inc.", + [3]byte{0, 31, 72}: "Mojix Inc.", + [3]byte{0, 31, 73}: "Manhattan TV Ltd", + [3]byte{0, 31, 74}: "Albentia Systems S.A.", + [3]byte{0, 31, 75}: "Lineage Power", + [3]byte{0, 31, 76}: "Roseman Engineering Ltd", + [3]byte{0, 31, 77}: "Segnetics LLC", + [3]byte{0, 31, 78}: "ConMed Linvatec", + [3]byte{0, 31, 79}: "Thinkware Co. Ltd.", + [3]byte{0, 31, 80}: "Swissdis AG", + [3]byte{0, 31, 81}: "HD Communications Corp", + [3]byte{0, 31, 82}: "UVT Unternehmensberatung fur Verkehr und Technik GmbH", + [3]byte{0, 31, 83}: "GEMAC Gesellschaft für Mikroelektronikanwendung Chemnitz mbH", + [3]byte{0, 31, 84}: "Lorex Technology Inc.", + [3]byte{0, 31, 85}: "Honeywell Security (China) Co., Ltd.", + [3]byte{0, 31, 86}: "DIGITAL FORECAST", + [3]byte{0, 31, 87}: "Phonik Innovation Co.,LTD", + [3]byte{0, 31, 88}: "EMH Energiemesstechnik GmbH", + [3]byte{0, 31, 89}: "Kronback Tracers", + [3]byte{0, 31, 90}: "Beckwith Electric Co.", + [3]byte{0, 31, 91}: "Apple, Inc.", + [3]byte{0, 31, 92}: "Nokia Danmark A/S", + [3]byte{0, 31, 93}: "Nokia Danmark A/S", + [3]byte{0, 31, 94}: "Dyna Technology Co.,Ltd.", + [3]byte{0, 31, 95}: "Blatand GmbH", + [3]byte{0, 31, 96}: "COMPASS SYSTEMS CORP.", + [3]byte{0, 31, 97}: "Talent Communication Networks Inc.", + [3]byte{0, 31, 98}: "JSC Stilsoft", + [3]byte{0, 31, 99}: "JSC Goodwin-Europa", + [3]byte{0, 31, 100}: "Beijing Autelan Technology Inc.", + [3]byte{0, 31, 101}: "KOREA ELECTRIC TERMINAL CO., LTD.", + [3]byte{0, 31, 102}: "PLANAR LLC", + [3]byte{0, 31, 103}: "Hitachi,Ltd.", + [3]byte{0, 31, 104}: "Martinsson Elektronik AB", + [3]byte{0, 31, 105}: "Pingood Technology Co., Ltd.", + [3]byte{0, 31, 106}: "PacketFlux Technologies, Inc.", + [3]byte{0, 31, 107}: "LG Electronics (Mobile Communications)", + [3]byte{0, 31, 108}: "Cisco Systems, Inc", + [3]byte{0, 31, 109}: "Cisco Systems, Inc", + [3]byte{0, 31, 110}: "Vtech Engineering Corporation", + [3]byte{0, 31, 111}: "Fujian Sunnada Communication Co.,Ltd.", + [3]byte{0, 31, 112}: "Botik Technologies LTD", + [3]byte{0, 31, 113}: "xG Technology, Inc.", + [3]byte{0, 31, 114}: "QingDao Hiphone Technology Co,.Ltd", + [3]byte{0, 31, 115}: "Teraview Technology Co., Ltd.", + [3]byte{0, 31, 116}: "Eigen Development", + [3]byte{0, 31, 117}: "GiBahn Media", + [3]byte{0, 31, 118}: "AirLogic Systems Inc.", + [3]byte{0, 31, 119}: "HEOL DESIGN", + [3]byte{0, 31, 120}: "Blue Fox Porini Textile", + [3]byte{0, 31, 121}: "Lodam Electronics A/S", + [3]byte{0, 31, 122}: "WiWide Inc.", + [3]byte{0, 31, 123}: "TechNexion Ltd.", + [3]byte{0, 31, 124}: "Witelcom AS", + [3]byte{0, 31, 125}: "Embedded Wireless GmbH", + [3]byte{0, 31, 126}: "ARRIS Group, Inc.", + [3]byte{0, 31, 127}: "Phabrix Limited", + [3]byte{0, 31, 128}: "Lucas Holding bv", + [3]byte{0, 31, 129}: "Accel Semiconductor Corp", + [3]byte{0, 31, 130}: "Cal-Comp Electronics & Communications Company Ltd.", + [3]byte{0, 31, 131}: "Teleplan Technology Services Sdn Bhd", + [3]byte{0, 31, 132}: "Gigle Semiconductor", + [3]byte{0, 31, 133}: "Apriva ISS, LLC", + [3]byte{0, 31, 134}: "digEcor", + [3]byte{0, 31, 135}: "Skydigital Inc.", + [3]byte{0, 31, 136}: "FMS Force Measuring Systems AG", + [3]byte{0, 31, 137}: "Signalion GmbH", + [3]byte{0, 31, 138}: "Ellion Digital Inc.", + [3]byte{0, 31, 139}: "Cache IQ", + [3]byte{0, 31, 140}: "CCS Inc.", + [3]byte{0, 31, 141}: "Ingenieurbuero Stark GmbH und Ko. KG", + [3]byte{0, 31, 142}: "Metris USA Inc.", + [3]byte{0, 31, 143}: "Shanghai Bellmann Digital Source Co.,Ltd.", + [3]byte{0, 31, 144}: "Actiontec Electronics, Inc", + [3]byte{0, 31, 145}: "DBS Lodging Technologies, LLC", + [3]byte{0, 31, 146}: "Avigilon Corporation", + [3]byte{0, 31, 147}: "Xiotech Corporation", + [3]byte{0, 31, 148}: "Lascar Electronics Ltd", + [3]byte{0, 31, 149}: "Sagemcom Broadband SAS", + [3]byte{0, 31, 150}: "APROTECH CO.LTD", + [3]byte{0, 31, 151}: "BERTANA srl", + [3]byte{0, 31, 152}: "DAIICHI-DENTSU LTD.", + [3]byte{0, 31, 153}: "SERONICS co.ltd", + [3]byte{0, 31, 154}: "Nortel Networks", + [3]byte{0, 31, 155}: "POSBRO", + [3]byte{0, 31, 156}: "LEDCO", + [3]byte{0, 31, 157}: "Cisco Systems, Inc", + [3]byte{0, 31, 158}: "Cisco Systems, Inc", + [3]byte{0, 31, 159}: "Thomson Telecom Belgium", + [3]byte{0, 31, 160}: "A10 Networks", + [3]byte{0, 31, 161}: "Gtran Inc", + [3]byte{0, 31, 162}: "Datron World Communications, Inc.", + [3]byte{0, 31, 163}: "T&W Electronics(Shenzhen)Co.,Ltd.", + [3]byte{0, 31, 164}: "SHENZHEN GONGJIN ELECTRONICS CO.,LT", + [3]byte{0, 31, 165}: "Blue-White Industries", + [3]byte{0, 31, 166}: "Stilo srl", + [3]byte{0, 31, 167}: "Sony Interactive Entertainment Inc.", + [3]byte{0, 31, 168}: "Smart Energy Instruments Inc.", + [3]byte{0, 31, 169}: "Atlanta DTH, Inc.", + [3]byte{0, 31, 170}: "Taseon, Inc.", + [3]byte{0, 31, 171}: "I.S HIGH TECH.INC", + [3]byte{0, 31, 172}: "Goodmill Systems Ltd", + [3]byte{0, 31, 173}: "Brown Innovations, Inc", + [3]byte{0, 31, 174}: "Blick South Africa (Pty) Ltd", + [3]byte{0, 31, 175}: "NextIO, Inc.", + [3]byte{0, 31, 176}: "TimeIPS, Inc.", + [3]byte{0, 31, 177}: "Cybertech Inc.", + [3]byte{0, 31, 178}: "Sontheim Industrie Elektronik GmbH", + [3]byte{0, 31, 179}: "2Wire Inc", + [3]byte{0, 31, 180}: "SmartShare Systems", + [3]byte{0, 31, 181}: "I/O Interconnect Inc.", + [3]byte{0, 31, 182}: "Chi Lin Technology Co., Ltd.", + [3]byte{0, 31, 183}: "WiMate Technologies Corp.", + [3]byte{0, 31, 184}: "Universal Remote Control, Inc.", + [3]byte{0, 31, 185}: "Paltronics", + [3]byte{0, 31, 186}: "Boyoung Tech", + [3]byte{0, 31, 187}: "Xenatech Co.,LTD", + [3]byte{0, 31, 188}: "EVGA Corporation", + [3]byte{0, 31, 189}: "Kyocera Wireless Corp.", + [3]byte{0, 31, 190}: "Shenzhen Mopnet Industrial Co.,Ltd", + [3]byte{0, 31, 191}: "Fulhua Microelectronics Corp. Taiwan Branch", + [3]byte{0, 31, 192}: "Control Express Finland Oy", + [3]byte{0, 31, 193}: "Hanlong Technology Co.,LTD", + [3]byte{0, 31, 194}: "Jow Tong Technology Co Ltd", + [3]byte{0, 31, 195}: "SmartSynch, Inc", + [3]byte{0, 31, 196}: "ARRIS Group, Inc.", + [3]byte{0, 31, 197}: "Nintendo Co., Ltd.", + [3]byte{0, 31, 198}: "ASUSTek COMPUTER INC.", + [3]byte{0, 31, 199}: "Casio Hitachi Mobile Communications Co., Ltd.", + [3]byte{0, 31, 200}: "Up-Today Industrial Co., Ltd.", + [3]byte{0, 31, 201}: "Cisco Systems, Inc", + [3]byte{0, 31, 202}: "Cisco Systems, Inc", + [3]byte{0, 31, 203}: "NIW Solutions", + [3]byte{0, 31, 204}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 31, 205}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 31, 206}: "QTECH LLC", + [3]byte{0, 31, 207}: "MSI Technology GmbH", + [3]byte{0, 31, 208}: "GIGA-BYTE TECHNOLOGY CO.,LTD.", + [3]byte{0, 31, 209}: "OPTEX CO.,LTD.", + [3]byte{0, 31, 210}: "COMMTECH TECHNOLOGY MACAO COMMERCIAL OFFSHORE LTD.", + [3]byte{0, 31, 211}: "RIVA Networks Inc.", + [3]byte{0, 31, 212}: "4IPNET, INC.", + [3]byte{0, 31, 213}: "MICRORISC s.r.o.", + [3]byte{0, 31, 214}: "Shenzhen Allywll", + [3]byte{0, 31, 215}: "TELERAD SA", + [3]byte{0, 31, 216}: "A-TRUST COMPUTER CORPORATION", + [3]byte{0, 31, 217}: "RSD Communications Ltd", + [3]byte{0, 31, 218}: "Nortel Networks", + [3]byte{0, 31, 219}: "Network Supply Corp.,", + [3]byte{0, 31, 220}: "Mobile Safe Track Ltd", + [3]byte{0, 31, 221}: "GDI LLC", + [3]byte{0, 31, 222}: "Nokia Danmark A/S", + [3]byte{0, 31, 223}: "Nokia Danmark A/S", + [3]byte{0, 31, 224}: "EdgeVelocity Corp", + [3]byte{0, 31, 225}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{0, 31, 226}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{0, 31, 227}: "LG Electronics (Mobile Communications)", + [3]byte{0, 31, 228}: "Sony Mobile Communications AB", + [3]byte{0, 31, 229}: "In-Circuit GmbH", + [3]byte{0, 31, 230}: "Alphion Corporation", + [3]byte{0, 31, 231}: "Simet", + [3]byte{0, 31, 232}: "KURUSUGAWA Electronics Industry Inc,.", + [3]byte{0, 31, 233}: "Printrex, Inc.", + [3]byte{0, 31, 234}: "Applied Media Technologies Corporation", + [3]byte{0, 31, 235}: "Trio Datacom Pty Ltd", + [3]byte{0, 31, 236}: "Synapse Électronique", + [3]byte{0, 31, 237}: "Tecan Systems Inc.", + [3]byte{0, 31, 238}: "ubisys technologies GmbH", + [3]byte{0, 31, 239}: "SHINSEI INDUSTRIES CO.,LTD", + [3]byte{0, 31, 240}: "Audio Partnership", + [3]byte{0, 31, 241}: "Paradox Hellas S.A.", + [3]byte{0, 31, 242}: "VIA Technologies, Inc.", + [3]byte{0, 31, 243}: "Apple, Inc.", + [3]byte{0, 31, 244}: "Power Monitors, Inc.", + [3]byte{0, 31, 245}: "Kongsberg Defence & Aerospace", + [3]byte{0, 31, 246}: "PS Audio International", + [3]byte{0, 31, 247}: "Nakajima All Precision Co., Ltd.", + [3]byte{0, 31, 248}: "Siemens AG, Sector Industry, Drive Technologies, Motion Control Systems", + [3]byte{0, 31, 249}: "Advanced Knowledge Associates", + [3]byte{0, 31, 250}: "Coretree, Co, Ltd", + [3]byte{0, 31, 251}: "Green Packet Bhd", + [3]byte{0, 31, 252}: "Riccius+Sohn GmbH", + [3]byte{0, 31, 253}: "Indigo Mobile Technologies Corp.", + [3]byte{0, 31, 254}: "HPN Supply Chain", + [3]byte{0, 31, 255}: "Respironics, Inc.", + [3]byte{0, 32, 0}: "LEXMARK INTERNATIONAL, INC.", + [3]byte{0, 32, 1}: "DSP SOLUTIONS, INC.", + [3]byte{0, 32, 2}: "SERITECH ENTERPRISE CO., LTD.", + [3]byte{0, 32, 3}: "PIXEL POWER LTD.", + [3]byte{0, 32, 4}: "YAMATAKE-HONEYWELL CO., LTD.", + [3]byte{0, 32, 5}: "SIMPLE TECHNOLOGY", + [3]byte{0, 32, 6}: "GARRETT COMMUNICATIONS, INC.", + [3]byte{0, 32, 7}: "SFA, INC.", + [3]byte{0, 32, 8}: "CABLE & COMPUTER TECHNOLOGY", + [3]byte{0, 32, 9}: "PACKARD BELL ELEC., INC.", + [3]byte{0, 32, 10}: "SOURCE-COMM CORP.", + [3]byte{0, 32, 11}: "OCTAGON SYSTEMS CORP.", + [3]byte{0, 32, 12}: "ADASTRA SYSTEMS CORP.", + [3]byte{0, 32, 13}: "CARL ZEISS", + [3]byte{0, 32, 14}: "SATELLITE TECHNOLOGY MGMT, INC", + [3]byte{0, 32, 15}: "EBRAINS Inc", + [3]byte{0, 32, 16}: "JEOL SYSTEM TECHNOLOGY CO. LTD", + [3]byte{0, 32, 17}: "CANOPUS CO., LTD.", + [3]byte{0, 32, 18}: "CAMTRONICS MEDICAL SYSTEMS", + [3]byte{0, 32, 19}: "DIVERSIFIED TECHNOLOGY, INC.", + [3]byte{0, 32, 20}: "GLOBAL VIEW CO., LTD.", + [3]byte{0, 32, 21}: "ACTIS COMPUTER SA", + [3]byte{0, 32, 22}: "SHOWA ELECTRIC WIRE & CABLE CO", + [3]byte{0, 32, 23}: "ORBOTECH", + [3]byte{0, 32, 24}: "CIS TECHNOLOGY INC.", + [3]byte{0, 32, 25}: "OHLER GMBH", + [3]byte{0, 32, 26}: "MRV Communications, Inc.", + [3]byte{0, 32, 27}: "NORTHERN TELECOM/NETWORK", + [3]byte{0, 32, 28}: "EXCEL, INC.", + [3]byte{0, 32, 29}: "KATANA PRODUCTS", + [3]byte{0, 32, 30}: "NETQUEST CORPORATION", + [3]byte{0, 32, 31}: "BEST POWER TECHNOLOGY, INC.", + [3]byte{0, 32, 32}: "MEGATRON COMPUTER INDUSTRIES PTY, LTD.", + [3]byte{0, 32, 33}: "ALGORITHMS SOFTWARE PVT. LTD.", + [3]byte{0, 32, 34}: "NMS Communications", + [3]byte{0, 32, 35}: "T.C. TECHNOLOGIES PTY. LTD", + [3]byte{0, 32, 36}: "PACIFIC COMMUNICATION SCIENCES", + [3]byte{0, 32, 37}: "CONTROL TECHNOLOGY, INC.", + [3]byte{0, 32, 38}: "AMKLY SYSTEMS, INC.", + [3]byte{0, 32, 39}: "MING FORTUNE INDUSTRY CO., LTD", + [3]byte{0, 32, 40}: "WEST EGG SYSTEMS, INC.", + [3]byte{0, 32, 41}: "TELEPROCESSING PRODUCTS, INC.", + [3]byte{0, 32, 42}: "N.V. DZINE", + [3]byte{0, 32, 43}: "ADVANCED TELECOMMUNICATIONS MODULES, LTD.", + [3]byte{0, 32, 44}: "WELLTRONIX CO., LTD.", + [3]byte{0, 32, 45}: "TAIYO CORPORATION", + [3]byte{0, 32, 46}: "DAYSTAR DIGITAL", + [3]byte{0, 32, 47}: "ZETA COMMUNICATIONS, LTD.", + [3]byte{0, 32, 48}: "ANALOG & DIGITAL SYSTEMS", + [3]byte{0, 32, 49}: "Tattile SRL", + [3]byte{0, 32, 50}: "ALCATEL TAISEL", + [3]byte{0, 32, 51}: "SYNAPSE TECHNOLOGIES, INC.", + [3]byte{0, 32, 52}: "ROTEC INDUSTRIEAUTOMATION GMBH", + [3]byte{0, 32, 53}: "IBM Corp", + [3]byte{0, 32, 54}: "BMC SOFTWARE", + [3]byte{0, 32, 55}: "Seagate Technology", + [3]byte{0, 32, 56}: "VME MICROSYSTEMS INTERNATIONAL CORPORATION", + [3]byte{0, 32, 57}: "SCINETS", + [3]byte{0, 32, 58}: "DIGITAL BI0METRICS INC.", + [3]byte{0, 32, 59}: "WISDM LTD.", + [3]byte{0, 32, 60}: "EUROTIME AB", + [3]byte{0, 32, 61}: "Honeywell ECC", + [3]byte{0, 32, 62}: "LogiCan Technologies, Inc.", + [3]byte{0, 32, 63}: "JUKI CORPORATION", + [3]byte{0, 32, 64}: "ARRIS Group, Inc.", + [3]byte{0, 32, 65}: "DATA NET", + [3]byte{0, 32, 66}: "DATAMETRICS CORP.", + [3]byte{0, 32, 67}: "NEURON COMPANY LIMITED", + [3]byte{0, 32, 68}: "GENITECH PTY LTD", + [3]byte{0, 32, 69}: "ION Networks, Inc.", + [3]byte{0, 32, 70}: "CIPRICO, INC.", + [3]byte{0, 32, 71}: "STEINBRECHER CORP.", + [3]byte{0, 32, 72}: "Marconi Communications", + [3]byte{0, 32, 73}: "COMTRON, INC.", + [3]byte{0, 32, 74}: "PRONET GMBH", + [3]byte{0, 32, 75}: "AUTOCOMPUTER CO., LTD.", + [3]byte{0, 32, 76}: "MITRON COMPUTER PTE LTD.", + [3]byte{0, 32, 77}: "INOVIS GMBH", + [3]byte{0, 32, 78}: "NETWORK SECURITY SYSTEMS, INC.", + [3]byte{0, 32, 79}: "DEUTSCHE AEROSPACE AG", + [3]byte{0, 32, 80}: "KOREA COMPUTER INC.", + [3]byte{0, 32, 81}: "Verilink Corporation", + [3]byte{0, 32, 82}: "RAGULA SYSTEMS", + [3]byte{0, 32, 83}: "HUNTSVILLE MICROSYSTEMS, INC.", + [3]byte{0, 32, 84}: "Sycamore Networks", + [3]byte{0, 32, 85}: "ALTECH CO., LTD.", + [3]byte{0, 32, 86}: "NEOPRODUCTS", + [3]byte{0, 32, 87}: "TITZE DATENTECHNIK GmbH", + [3]byte{0, 32, 88}: "ALLIED SIGNAL INC.", + [3]byte{0, 32, 89}: "MIRO COMPUTER PRODUCTS AG", + [3]byte{0, 32, 90}: "COMPUTER IDENTICS", + [3]byte{0, 32, 91}: "Kentrox, LLC", + [3]byte{0, 32, 92}: "InterNet Systems of Florida, Inc.", + [3]byte{0, 32, 93}: "NANOMATIC OY", + [3]byte{0, 32, 94}: "CASTLE ROCK, INC.", + [3]byte{0, 32, 95}: "GAMMADATA COMPUTER GMBH", + [3]byte{0, 32, 96}: "ALCATEL ITALIA S.p.A.", + [3]byte{0, 32, 97}: "GarrettCom, Inc.", + [3]byte{0, 32, 98}: "SCORPION LOGIC, LTD.", + [3]byte{0, 32, 99}: "WIPRO INFOTECH LTD.", + [3]byte{0, 32, 100}: "PROTEC MICROSYSTEMS, INC.", + [3]byte{0, 32, 101}: "SUPERNET NETWORKING INC.", + [3]byte{0, 32, 102}: "GENERAL MAGIC, INC.", + [3]byte{0, 32, 103}: "Private", + [3]byte{0, 32, 104}: "ISDYNE", + [3]byte{0, 32, 105}: "ISDN SYSTEMS CORPORATION", + [3]byte{0, 32, 106}: "OSAKA COMPUTER CORP.", + [3]byte{0, 32, 107}: "KONICA MINOLTA HOLDINGS, INC.", + [3]byte{0, 32, 108}: "EVERGREEN TECHNOLOGY CORP.", + [3]byte{0, 32, 109}: "DATA RACE, INC.", + [3]byte{0, 32, 110}: "XACT, INC.", + [3]byte{0, 32, 111}: "FLOWPOINT CORPORATION", + [3]byte{0, 32, 112}: "HYNET, LTD.", + [3]byte{0, 32, 113}: "IBR GMBH", + [3]byte{0, 32, 114}: "WORKLINK INNOVATIONS", + [3]byte{0, 32, 115}: "FUSION SYSTEMS CORPORATION", + [3]byte{0, 32, 116}: "SUNGWOON SYSTEMS", + [3]byte{0, 32, 117}: "MOTOROLA COMMUNICATION ISRAEL", + [3]byte{0, 32, 118}: "REUDO CORPORATION", + [3]byte{0, 32, 119}: "KARDIOS SYSTEMS CORP.", + [3]byte{0, 32, 120}: "RUNTOP, INC.", + [3]byte{0, 32, 121}: "MIKRON GMBH", + [3]byte{0, 32, 122}: "WiSE Communications, Inc.", + [3]byte{0, 32, 123}: "Intel Corporation", + [3]byte{0, 32, 124}: "AUTEC GMBH", + [3]byte{0, 32, 125}: "ADVANCED COMPUTER APPLICATIONS", + [3]byte{0, 32, 126}: "FINECOM CO., LTD.", + [3]byte{0, 32, 127}: "KYOEI SANGYO CO., LTD.", + [3]byte{0, 32, 128}: "SYNERGY (UK) LTD.", + [3]byte{0, 32, 129}: "TITAN ELECTRONICS", + [3]byte{0, 32, 130}: "ONEAC CORPORATION", + [3]byte{0, 32, 131}: "PRESTICOM INCORPORATED", + [3]byte{0, 32, 132}: "OCE PRINTING SYSTEMS, GMBH", + [3]byte{0, 32, 133}: "Eaton Corporation", + [3]byte{0, 32, 134}: "MICROTECH ELECTRONICS LIMITED", + [3]byte{0, 32, 135}: "MEMOTEC, INC.", + [3]byte{0, 32, 136}: "GLOBAL VILLAGE COMMUNICATION", + [3]byte{0, 32, 137}: "T3PLUS NETWORKING, INC.", + [3]byte{0, 32, 138}: "SONIX COMMUNICATIONS, LTD.", + [3]byte{0, 32, 139}: "LAPIS TECHNOLOGIES, INC.", + [3]byte{0, 32, 140}: "GALAXY NETWORKS, INC.", + [3]byte{0, 32, 141}: "CMD TECHNOLOGY", + [3]byte{0, 32, 142}: "CHEVIN SOFTWARE ENG. LTD.", + [3]byte{0, 32, 143}: "ECI Telecom Ltd.", + [3]byte{0, 32, 144}: "ADVANCED COMPRESSION TECHNOLOGY, INC.", + [3]byte{0, 32, 145}: "J125, NATIONAL SECURITY AGENCY", + [3]byte{0, 32, 146}: "CHESS ENGINEERING B.V.", + [3]byte{0, 32, 147}: "LANDINGS TECHNOLOGY CORP.", + [3]byte{0, 32, 148}: "CUBIX CORPORATION", + [3]byte{0, 32, 149}: "RIVA ELECTRONICS", + [3]byte{0, 32, 150}: "Invensys", + [3]byte{0, 32, 151}: "APPLIED SIGNAL TECHNOLOGY", + [3]byte{0, 32, 152}: "HECTRONIC AB", + [3]byte{0, 32, 153}: "BON ELECTRIC CO., LTD.", + [3]byte{0, 32, 154}: "THE 3DO COMPANY", + [3]byte{0, 32, 155}: "ERSAT ELECTRONIC GMBH", + [3]byte{0, 32, 156}: "PRIMARY ACCESS CORP.", + [3]byte{0, 32, 157}: "LIPPERT AUTOMATIONSTECHNIK", + [3]byte{0, 32, 158}: "BROWN'S OPERATING SYSTEM SERVICES, LTD.", + [3]byte{0, 32, 159}: "MERCURY COMPUTER SYSTEMS, INC.", + [3]byte{0, 32, 160}: "OA LABORATORY CO., LTD.", + [3]byte{0, 32, 161}: "DOVATRON", + [3]byte{0, 32, 162}: "GALCOM NETWORKING LTD.", + [3]byte{0, 32, 163}: "Harmonic, Inc", + [3]byte{0, 32, 164}: "MULTIPOINT NETWORKS", + [3]byte{0, 32, 165}: "API ENGINEERING", + [3]byte{0, 32, 166}: "Proxim Wireless", + [3]byte{0, 32, 167}: "PAIRGAIN TECHNOLOGIES, INC.", + [3]byte{0, 32, 168}: "SAST TECHNOLOGY CORP.", + [3]byte{0, 32, 169}: "WHITE HORSE INDUSTRIAL", + [3]byte{0, 32, 170}: "Ericsson Television Limited", + [3]byte{0, 32, 171}: "MICRO INDUSTRIES CORP.", + [3]byte{0, 32, 172}: "INTERFLEX DATENSYSTEME GMBH", + [3]byte{0, 32, 173}: "LINQ SYSTEMS", + [3]byte{0, 32, 174}: "ORNET DATA COMMUNICATION TECH.", + [3]byte{0, 32, 175}: "3COM CORPORATION", + [3]byte{0, 32, 176}: "GATEWAY DEVICES, INC.", + [3]byte{0, 32, 177}: "COMTECH RESEARCH INC.", + [3]byte{0, 32, 178}: "GKD Gesellschaft Fur Kommunikation Und Datentechnik", + [3]byte{0, 32, 179}: "Tattile SRL", + [3]byte{0, 32, 180}: "TERMA ELEKTRONIK AS", + [3]byte{0, 32, 181}: "YASKAWA ELECTRIC CORPORATION", + [3]byte{0, 32, 182}: "AGILE NETWORKS, INC.", + [3]byte{0, 32, 183}: "NAMAQUA COMPUTERWARE", + [3]byte{0, 32, 184}: "PRIME OPTION, INC.", + [3]byte{0, 32, 185}: "METRICOM, INC.", + [3]byte{0, 32, 186}: "CENTER FOR HIGH PERFORMANCE", + [3]byte{0, 32, 187}: "ZAX CORPORATION", + [3]byte{0, 32, 188}: "Long Reach Networks Pty Ltd", + [3]byte{0, 32, 189}: "NIOBRARA R & D CORPORATION", + [3]byte{0, 32, 190}: "LAN ACCESS CORP.", + [3]byte{0, 32, 191}: "AEHR TEST SYSTEMS", + [3]byte{0, 32, 192}: "PULSE ELECTRONICS, INC.", + [3]byte{0, 32, 193}: "SAXA, Inc.", + [3]byte{0, 32, 194}: "TEXAS MEMORY SYSTEMS, INC.", + [3]byte{0, 32, 195}: "COUNTER SOLUTIONS LTD.", + [3]byte{0, 32, 196}: "INET,INC.", + [3]byte{0, 32, 197}: "EAGLE TECHNOLOGY", + [3]byte{0, 32, 198}: "NECTEC", + [3]byte{0, 32, 199}: "AKAI Professional M.I. Corp.", + [3]byte{0, 32, 200}: "LARSCOM INCORPORATED", + [3]byte{0, 32, 201}: "VICTRON BV", + [3]byte{0, 32, 202}: "DIGITAL OCEAN", + [3]byte{0, 32, 203}: "PRETEC ELECTRONICS CORP.", + [3]byte{0, 32, 204}: "DIGITAL SERVICES, LTD.", + [3]byte{0, 32, 205}: "HYBRID NETWORKS, INC.", + [3]byte{0, 32, 206}: "LOGICAL DESIGN GROUP, INC.", + [3]byte{0, 32, 207}: "TEST & MEASUREMENT SYSTEMS INC", + [3]byte{0, 32, 208}: "VERSALYNX CORPORATION", + [3]byte{0, 32, 209}: "MICROCOMPUTER SYSTEMS (M) SDN.", + [3]byte{0, 32, 210}: "RAD DATA COMMUNICATIONS, LTD.", + [3]byte{0, 32, 211}: "OST (OUEST STANDARD TELEMATIQU", + [3]byte{0, 32, 212}: "Cabletron Systems, Inc.", + [3]byte{0, 32, 213}: "VIPA GMBH", + [3]byte{0, 32, 214}: "Breezecom, Ltd.", + [3]byte{0, 32, 215}: "JAPAN MINICOMPUTER SYSTEMS CO., Ltd.", + [3]byte{0, 32, 216}: "Nortel Networks", + [3]byte{0, 32, 217}: "PANASONIC TECHNOLOGIES, INC./MIECO-US", + [3]byte{0, 32, 218}: "Alcatel-Lucent Enterprise", + [3]byte{0, 32, 219}: "XNET TECHNOLOGY, INC.", + [3]byte{0, 32, 220}: "DENSITRON TAIWAN LTD.", + [3]byte{0, 32, 221}: "Cybertec Pty Ltd", + [3]byte{0, 32, 222}: "JAPAN DIGITAL LABORAT'Y CO.LTD", + [3]byte{0, 32, 223}: "KYOSAN ELECTRIC MFG. CO., LTD.", + [3]byte{0, 32, 224}: "Actiontec Electronics, Inc", + [3]byte{0, 32, 225}: "ALAMAR ELECTRONICS", + [3]byte{0, 32, 226}: "INFORMATION RESOURCE ENGINEERING", + [3]byte{0, 32, 227}: "MCD KENCOM CORPORATION", + [3]byte{0, 32, 228}: "HSING TECH ENTERPRISE CO., LTD", + [3]byte{0, 32, 229}: "APEX DATA, INC.", + [3]byte{0, 32, 230}: "LIDKOPING MACHINE TOOLS AB", + [3]byte{0, 32, 231}: "B&W NUCLEAR SERVICE COMPANY", + [3]byte{0, 32, 232}: "DATATREK CORPORATION", + [3]byte{0, 32, 233}: "DANTEL", + [3]byte{0, 32, 234}: "EFFICIENT NETWORKS, INC.", + [3]byte{0, 32, 235}: "CINCINNATI MICROWAVE, INC.", + [3]byte{0, 32, 236}: "TECHWARE SYSTEMS CORP.", + [3]byte{0, 32, 237}: "GIGA-BYTE TECHNOLOGY CO., LTD.", + [3]byte{0, 32, 238}: "GTECH CORPORATION", + [3]byte{0, 32, 239}: "USC CORPORATION", + [3]byte{0, 32, 240}: "UNIVERSAL MICROELECTRONICS CO.", + [3]byte{0, 32, 241}: "ALTOS INDIA LIMITED", + [3]byte{0, 32, 242}: "Oracle Corporation", + [3]byte{0, 32, 243}: "RAYNET CORPORATION", + [3]byte{0, 32, 244}: "SPECTRIX CORPORATION", + [3]byte{0, 32, 245}: "PANDATEL AG", + [3]byte{0, 32, 246}: "NET TEK AND KARLNET, INC.", + [3]byte{0, 32, 247}: "CYBERDATA CORPORATION", + [3]byte{0, 32, 248}: "CARRERA COMPUTERS, INC.", + [3]byte{0, 32, 249}: "PARALINK NETWORKS, INC.", + [3]byte{0, 32, 250}: "GDE SYSTEMS, INC.", + [3]byte{0, 32, 251}: "OCTEL COMMUNICATIONS CORP.", + [3]byte{0, 32, 252}: "MATROX", + [3]byte{0, 32, 253}: "ITV TECHNOLOGIES, INC.", + [3]byte{0, 32, 254}: "TOPWARE INC. / GRAND COMPUTER", + [3]byte{0, 32, 255}: "SYMMETRICAL TECHNOLOGIES", + [3]byte{0, 33, 0}: "Gemtek Technology Co., Ltd.", + [3]byte{0, 33, 1}: "Aplicaciones Electronicas Quasar (AEQ)", + [3]byte{0, 33, 2}: "UpdateLogic Inc.", + [3]byte{0, 33, 3}: "GHI Electronics, LLC", + [3]byte{0, 33, 4}: "Gigaset Communications GmbH", + [3]byte{0, 33, 5}: "Alcatel-Lucent IPD", + [3]byte{0, 33, 6}: "RIM Testing Services", + [3]byte{0, 33, 7}: "Seowonintech Co Ltd.", + [3]byte{0, 33, 8}: "Nokia Danmark A/S", + [3]byte{0, 33, 9}: "Nokia Danmark A/S", + [3]byte{0, 33, 10}: "byd:sign Corporation", + [3]byte{0, 33, 11}: "GEMINI TRAZE RFID PVT. LTD.", + [3]byte{0, 33, 12}: "Cymtec Systems, Inc.", + [3]byte{0, 33, 13}: "SAMSIN INNOTEC", + [3]byte{0, 33, 14}: "Orpak Systems L.T.D.", + [3]byte{0, 33, 15}: "Cernium Corp", + [3]byte{0, 33, 16}: "Clearbox Systems", + [3]byte{0, 33, 17}: "Uniphone Inc.", + [3]byte{0, 33, 18}: "WISCOM SYSTEM CO.,LTD", + [3]byte{0, 33, 19}: "Padtec S/A", + [3]byte{0, 33, 20}: "Hylab Technology Inc.", + [3]byte{0, 33, 21}: "PHYWE Systeme GmbH & Co. KG", + [3]byte{0, 33, 22}: "Transcon Electronic Systems, spol. s r. o.", + [3]byte{0, 33, 23}: "Tellord", + [3]byte{0, 33, 24}: "Athena Tech, Inc.", + [3]byte{0, 33, 25}: "SAMSUNG ELECTRO MECHANICS CO., LTD.", + [3]byte{0, 33, 26}: "LInTech Corporation", + [3]byte{0, 33, 27}: "Cisco Systems, Inc", + [3]byte{0, 33, 28}: "Cisco Systems, Inc", + [3]byte{0, 33, 29}: "Dataline AB", + [3]byte{0, 33, 30}: "ARRIS Group, Inc.", + [3]byte{0, 33, 31}: "SHINSUNG DELTATECH CO.,LTD.", + [3]byte{0, 33, 32}: "Sequel Technologies", + [3]byte{0, 33, 33}: "VRmagic GmbH", + [3]byte{0, 33, 34}: "Chip-pro Ltd.", + [3]byte{0, 33, 35}: "Aerosat Avionics", + [3]byte{0, 33, 36}: "Optos Plc", + [3]byte{0, 33, 37}: "KUK JE TONG SHIN Co.,LTD", + [3]byte{0, 33, 38}: "Shenzhen Torch Equipment Co., Ltd.", + [3]byte{0, 33, 39}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{0, 33, 40}: "Oracle Corporation", + [3]byte{0, 33, 41}: "Cisco-Linksys, LLC", + [3]byte{0, 33, 42}: "Audiovox Corporation", + [3]byte{0, 33, 43}: "MSA Auer", + [3]byte{0, 33, 44}: "SemIndia System Private Limited", + [3]byte{0, 33, 45}: "SCIMOLEX CORPORATION", + [3]byte{0, 33, 46}: "dresden-elektronik", + [3]byte{0, 33, 47}: "Phoebe Micro Inc.", + [3]byte{0, 33, 48}: "Keico Hightech Inc.", + [3]byte{0, 33, 49}: "Blynke Inc.", + [3]byte{0, 33, 50}: "Masterclock, Inc.", + [3]byte{0, 33, 51}: "Building B, Inc", + [3]byte{0, 33, 52}: "Brandywine Communications", + [3]byte{0, 33, 53}: "ALCATEL-LUCENT", + [3]byte{0, 33, 54}: "ARRIS Group, Inc.", + [3]byte{0, 33, 55}: "Bay Controls, LLC", + [3]byte{0, 33, 56}: "Cepheid", + [3]byte{0, 33, 57}: "Escherlogic Inc.", + [3]byte{0, 33, 58}: "Winchester Systems Inc.", + [3]byte{0, 33, 59}: "Berkshire Products, Inc", + [3]byte{0, 33, 60}: "AliphCom", + [3]byte{0, 33, 61}: "Cermetek Microelectronics, Inc.", + [3]byte{0, 33, 62}: "TomTom", + [3]byte{0, 33, 63}: "A-Team Technology Ltd.", + [3]byte{0, 33, 64}: "EN Technologies Inc.", + [3]byte{0, 33, 65}: "RADLIVE", + [3]byte{0, 33, 66}: "Advanced Control Systems doo", + [3]byte{0, 33, 67}: "ARRIS Group, Inc.", + [3]byte{0, 33, 68}: "SS Telecoms", + [3]byte{0, 33, 69}: "Semptian Technologies Ltd.", + [3]byte{0, 33, 70}: "Sanmina-SCI", + [3]byte{0, 33, 71}: "Nintendo Co., Ltd.", + [3]byte{0, 33, 72}: "Kaco Solar Korea", + [3]byte{0, 33, 73}: "China Daheng Group ,Inc.", + [3]byte{0, 33, 74}: "Pixel Velocity, Inc", + [3]byte{0, 33, 75}: "Shenzhen HAMP Science & Technology Co.,Ltd", + [3]byte{0, 33, 76}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 33, 77}: "Guangzhou Skytone Transmission Technology Com. Ltd.", + [3]byte{0, 33, 78}: "GS Yuasa Power Supply Ltd.", + [3]byte{0, 33, 79}: "ALPS ELECTRIC CO.,LTD.", + [3]byte{0, 33, 80}: "EYEVIEW ELECTRONICS", + [3]byte{0, 33, 81}: "Millinet Co., Ltd.", + [3]byte{0, 33, 82}: "General Satellite Research & Development Limited", + [3]byte{0, 33, 83}: "SeaMicro Inc.", + [3]byte{0, 33, 84}: "D-TACQ Solutions Ltd", + [3]byte{0, 33, 85}: "Cisco Systems, Inc", + [3]byte{0, 33, 86}: "Cisco Systems, Inc", + [3]byte{0, 33, 87}: "National Datacast, Inc.", + [3]byte{0, 33, 88}: "Style Flying Technology Co.", + [3]byte{0, 33, 89}: "Juniper Networks", + [3]byte{0, 33, 90}: "Hewlett Packard", + [3]byte{0, 33, 91}: "SenseAnywhere", + [3]byte{0, 33, 92}: "Intel Corporate", + [3]byte{0, 33, 93}: "Intel Corporate", + [3]byte{0, 33, 94}: "IBM Corp", + [3]byte{0, 33, 95}: "IHSE GmbH", + [3]byte{0, 33, 96}: "Hidea Solutions Co. Ltd.", + [3]byte{0, 33, 97}: "Yournet Inc.", + [3]byte{0, 33, 98}: "Nortel Networks", + [3]byte{0, 33, 99}: "ASKEY COMPUTER CORP", + [3]byte{0, 33, 100}: "Special Design Bureau for Seismic Instrumentation", + [3]byte{0, 33, 101}: "Presstek Inc.", + [3]byte{0, 33, 102}: "NovAtel Inc.", + [3]byte{0, 33, 103}: "HWA JIN T&I Corp.", + [3]byte{0, 33, 104}: "iVeia, LLC", + [3]byte{0, 33, 105}: "Prologix, LLC.", + [3]byte{0, 33, 106}: "Intel Corporate", + [3]byte{0, 33, 107}: "Intel Corporate", + [3]byte{0, 33, 108}: "ODVA", + [3]byte{0, 33, 109}: "Soltech Co., Ltd.", + [3]byte{0, 33, 110}: "Function ATI (Huizhou) Telecommunications Co., Ltd.", + [3]byte{0, 33, 111}: "SymCom, Inc.", + [3]byte{0, 33, 112}: "Dell Inc.", + [3]byte{0, 33, 113}: "Wesung TNC Co., Ltd.", + [3]byte{0, 33, 114}: "Seoultek Valley", + [3]byte{0, 33, 115}: "Ion Torrent Systems, Inc.", + [3]byte{0, 33, 116}: "AvaLAN Wireless", + [3]byte{0, 33, 117}: "Pacific Satellite International Ltd.", + [3]byte{0, 33, 118}: "YMax Telecom Ltd.", + [3]byte{0, 33, 119}: "W. L. Gore & Associates", + [3]byte{0, 33, 120}: "Matuschek Messtechnik GmbH", + [3]byte{0, 33, 121}: "IOGEAR, Inc.", + [3]byte{0, 33, 122}: "Sejin Electron, Inc.", + [3]byte{0, 33, 123}: "Bastec AB", + [3]byte{0, 33, 124}: "2Wire Inc", + [3]byte{0, 33, 125}: "PYXIS S.R.L.", + [3]byte{0, 33, 126}: "Telit Communication s.p.a", + [3]byte{0, 33, 127}: "Intraco Technology Pte Ltd", + [3]byte{0, 33, 128}: "ARRIS Group, Inc.", + [3]byte{0, 33, 129}: "Si2 Microsystems Limited", + [3]byte{0, 33, 130}: "SandLinks Systems, Ltd.", + [3]byte{0, 33, 131}: "ANDRITZ HYDRO GmbH", + [3]byte{0, 33, 132}: "POWERSOFT SRL", + [3]byte{0, 33, 133}: "MICRO-STAR INT'L CO.,LTD.", + [3]byte{0, 33, 134}: "Universal Global Scientific Industrial Co., Ltd.", + [3]byte{0, 33, 135}: "Imacs GmbH", + [3]byte{0, 33, 136}: "EMC Corporation", + [3]byte{0, 33, 137}: "AppTech, Inc.", + [3]byte{0, 33, 138}: "Electronic Design and Manufacturing Company", + [3]byte{0, 33, 139}: "Wescon Technology, Inc.", + [3]byte{0, 33, 140}: "TopControl GMBH", + [3]byte{0, 33, 141}: "AP Router Ind. Eletronica LTDA", + [3]byte{0, 33, 142}: "MEKICS CO., LTD.", + [3]byte{0, 33, 143}: "Avantgarde Acoustic Lautsprechersysteme GmbH", + [3]byte{0, 33, 144}: "Goliath Solutions", + [3]byte{0, 33, 145}: "D-Link Corporation", + [3]byte{0, 33, 146}: "Baoding Galaxy Electronic Technology Co.,Ltd", + [3]byte{0, 33, 147}: "Videofon MV", + [3]byte{0, 33, 148}: "Ping Communication", + [3]byte{0, 33, 149}: "GWD Media Limited", + [3]byte{0, 33, 150}: "Telsey S.p.A.", + [3]byte{0, 33, 151}: "Elitegroup Computer Systems Co.,Ltd.", + [3]byte{0, 33, 152}: "Thai Radio Co, LTD", + [3]byte{0, 33, 153}: "Vacon Plc", + [3]byte{0, 33, 154}: "Cambridge Visual Networks Ltd", + [3]byte{0, 33, 155}: "Dell Inc.", + [3]byte{0, 33, 156}: "Honeywld Technology Corp.", + [3]byte{0, 33, 157}: "Adesys BV", + [3]byte{0, 33, 158}: "Sony Mobile Communications AB", + [3]byte{0, 33, 159}: "SATEL OY", + [3]byte{0, 33, 160}: "Cisco Systems, Inc", + [3]byte{0, 33, 161}: "Cisco Systems, Inc", + [3]byte{0, 33, 162}: "EKE-Electronics Ltd.", + [3]byte{0, 33, 163}: "Micromint", + [3]byte{0, 33, 164}: "Dbii Networks", + [3]byte{0, 33, 165}: "ERLPhase Power Technologies Ltd.", + [3]byte{0, 33, 166}: "Videotec Spa", + [3]byte{0, 33, 167}: "Hantle System Co., Ltd.", + [3]byte{0, 33, 168}: "Telephonics Corporation", + [3]byte{0, 33, 169}: "Mobilink Telecom Co.,Ltd", + [3]byte{0, 33, 170}: "Nokia Danmark A/S", + [3]byte{0, 33, 171}: "Nokia Danmark A/S", + [3]byte{0, 33, 172}: "Infrared Integrated Systems Ltd", + [3]byte{0, 33, 173}: "Nordic ID Oy", + [3]byte{0, 33, 174}: "ALCATEL-LUCENT FRANCE - WTD", + [3]byte{0, 33, 175}: "Radio Frequency Systems", + [3]byte{0, 33, 176}: "Tyco Telecommunications", + [3]byte{0, 33, 177}: "DIGITAL SOLUTIONS LTD", + [3]byte{0, 33, 178}: "Fiberblaze A/S", + [3]byte{0, 33, 179}: "Ross Controls", + [3]byte{0, 33, 180}: "APRO MEDIA CO., LTD", + [3]byte{0, 33, 181}: "Galvanic Ltd", + [3]byte{0, 33, 182}: "Triacta Power Technologies Inc.", + [3]byte{0, 33, 183}: "Lexmark International Inc.", + [3]byte{0, 33, 184}: "Inphi Corporation", + [3]byte{0, 33, 185}: "Universal Devices Inc.", + [3]byte{0, 33, 186}: "Texas Instruments", + [3]byte{0, 33, 187}: "Riken Keiki Co., Ltd.", + [3]byte{0, 33, 188}: "ZALA COMPUTER", + [3]byte{0, 33, 189}: "Nintendo Co., Ltd.", + [3]byte{0, 33, 190}: "Cisco SPVTG", + [3]byte{0, 33, 191}: "Hitachi High-Tech Control Systems Corporation", + [3]byte{0, 33, 192}: "Mobile Appliance, Inc.", + [3]byte{0, 33, 193}: "ABB Oy / Medium Voltage Products", + [3]byte{0, 33, 194}: "GL Communications Inc", + [3]byte{0, 33, 195}: "CORNELL Communications, Inc.", + [3]byte{0, 33, 196}: "Consilium AB", + [3]byte{0, 33, 197}: "3DSP Corp", + [3]byte{0, 33, 198}: "CSJ Global, Inc.", + [3]byte{0, 33, 199}: "Russound", + [3]byte{0, 33, 200}: "LOHUIS Networks", + [3]byte{0, 33, 201}: "Wavecom Asia Pacific Limited", + [3]byte{0, 33, 202}: "ART System Co., Ltd.", + [3]byte{0, 33, 203}: "SMS TECNOLOGIA ELETRONICA LTDA", + [3]byte{0, 33, 204}: "Flextronics International", + [3]byte{0, 33, 205}: "LiveTV", + [3]byte{0, 33, 206}: "NTC-Metrotek", + [3]byte{0, 33, 207}: "The Crypto Group", + [3]byte{0, 33, 208}: "Global Display Solutions Spa", + [3]byte{0, 33, 209}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 33, 210}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 33, 211}: "BOCOM SECURITY(ASIA PACIFIC) LIMITED", + [3]byte{0, 33, 212}: "Vollmer Werke GmbH", + [3]byte{0, 33, 213}: "X2E GmbH", + [3]byte{0, 33, 214}: "LXI Consortium", + [3]byte{0, 33, 215}: "Cisco Systems, Inc", + [3]byte{0, 33, 216}: "Cisco Systems, Inc", + [3]byte{0, 33, 217}: "SEKONIC CORPORATION", + [3]byte{0, 33, 218}: "Automation Products Group Inc.", + [3]byte{0, 33, 219}: "Santachi Video Technology (Shenzhen) Co., Ltd.", + [3]byte{0, 33, 220}: "TECNOALARM S.r.l.", + [3]byte{0, 33, 221}: "Northstar Systems Corp", + [3]byte{0, 33, 222}: "Firepro Wireless", + [3]byte{0, 33, 223}: "Martin Christ GmbH", + [3]byte{0, 33, 224}: "CommAgility Ltd", + [3]byte{0, 33, 225}: "Nortel Networks", + [3]byte{0, 33, 226}: "visago Systems & Controls GmbH & Co. KG", + [3]byte{0, 33, 227}: "SerialTek LLC", + [3]byte{0, 33, 228}: "I-WIN", + [3]byte{0, 33, 229}: "Display Solution AG", + [3]byte{0, 33, 230}: "Starlight Video Limited", + [3]byte{0, 33, 231}: "Informatics Services Corporation", + [3]byte{0, 33, 232}: "Murata Manufacturing Co., Ltd.", + [3]byte{0, 33, 233}: "Apple, Inc.", + [3]byte{0, 33, 234}: "Bystronic Laser AG", + [3]byte{0, 33, 235}: "ESP SYSTEMS, LLC", + [3]byte{0, 33, 236}: "Solutronic GmbH", + [3]byte{0, 33, 237}: "Telegesis", + [3]byte{0, 33, 238}: "Full Spectrum Inc.", + [3]byte{0, 33, 239}: "Kapsys", + [3]byte{0, 33, 240}: "EW3 Technologies LLC", + [3]byte{0, 33, 241}: "Tutus Data AB", + [3]byte{0, 33, 242}: "EASY3CALL Technology Limited", + [3]byte{0, 33, 243}: "Si14 SpA", + [3]byte{0, 33, 244}: "INRange Systems, Inc", + [3]byte{0, 33, 245}: "Western Engravers Supply, Inc.", + [3]byte{0, 33, 246}: "Oracle Corporation", + [3]byte{0, 33, 247}: "HPN Supply Chain", + [3]byte{0, 33, 248}: "Enseo, Inc.", + [3]byte{0, 33, 249}: "WIRECOM Technologies", + [3]byte{0, 33, 250}: "A4SP Technologies Ltd.", + [3]byte{0, 33, 251}: "LG Electronics (Mobile Communications)", + [3]byte{0, 33, 252}: "Nokia Danmark A/S", + [3]byte{0, 33, 253}: "LACROIX TRAFFIC S.A.U", + [3]byte{0, 33, 254}: "Nokia Danmark A/S", + [3]byte{0, 33, 255}: "Cyfrowy Polsat SA", + [3]byte{0, 34, 0}: "IBM Corp", + [3]byte{0, 34, 1}: "Aksys Networks Inc", + [3]byte{0, 34, 2}: "Excito Elektronik i Skåne AB", + [3]byte{0, 34, 3}: "Glensound Electronics Ltd", + [3]byte{0, 34, 4}: "KORATEK", + [3]byte{0, 34, 5}: "WeLink Solutions, Inc.", + [3]byte{0, 34, 6}: "Cyberdyne Inc.", + [3]byte{0, 34, 7}: "Inteno Broadband Technology AB", + [3]byte{0, 34, 8}: "Certicom Corp", + [3]byte{0, 34, 9}: "Omron Healthcare Co., Ltd", + [3]byte{0, 34, 10}: "OnLive, Inc", + [3]byte{0, 34, 11}: "National Source Coding Center", + [3]byte{0, 34, 12}: "Cisco Systems, Inc", + [3]byte{0, 34, 13}: "Cisco Systems, Inc", + [3]byte{0, 34, 14}: "Indigo Security Co., Ltd.", + [3]byte{0, 34, 15}: "MoCA (Multimedia over Coax Alliance)", + [3]byte{0, 34, 16}: "ARRIS Group, Inc.", + [3]byte{0, 34, 17}: "Rohati Systems", + [3]byte{0, 34, 18}: "CAI Networks, Inc.", + [3]byte{0, 34, 19}: "PCI CORPORATION", + [3]byte{0, 34, 20}: "RINNAI KOREA", + [3]byte{0, 34, 21}: "ASUSTek COMPUTER INC.", + [3]byte{0, 34, 22}: "SHIBAURA VENDING MACHINE CORPORATION", + [3]byte{0, 34, 23}: "Neat Electronics", + [3]byte{0, 34, 24}: "Verivue Inc.", + [3]byte{0, 34, 25}: "Dell Inc.", + [3]byte{0, 34, 26}: "Audio Precision", + [3]byte{0, 34, 27}: "Morega Systems", + [3]byte{0, 34, 28}: "Private", + [3]byte{0, 34, 29}: "Freegene Technology LTD", + [3]byte{0, 34, 30}: "Media Devices Co., Ltd.", + [3]byte{0, 34, 31}: "eSang Technologies Co., Ltd.", + [3]byte{0, 34, 32}: "Mitac Technology Corp", + [3]byte{0, 34, 33}: "ITOH DENKI CO,LTD.", + [3]byte{0, 34, 34}: "Schaffner Deutschland GmbH", + [3]byte{0, 34, 35}: "TimeKeeping Systems, Inc.", + [3]byte{0, 34, 36}: "Good Will Instrument Co., Ltd.", + [3]byte{0, 34, 37}: "Thales Avionics Ltd", + [3]byte{0, 34, 38}: "Avaak, Inc.", + [3]byte{0, 34, 39}: "uv-electronic GmbH", + [3]byte{0, 34, 40}: "Breeze Innovations Ltd.", + [3]byte{0, 34, 41}: "Compumedics Ltd", + [3]byte{0, 34, 42}: "SoundEar A/S", + [3]byte{0, 34, 43}: "Nucomm, Inc.", + [3]byte{0, 34, 44}: "Ceton Corp", + [3]byte{0, 34, 45}: "SMC Networks Inc.", + [3]byte{0, 34, 46}: "maintech GmbH", + [3]byte{0, 34, 47}: "Open Grid Computing, Inc.", + [3]byte{0, 34, 48}: "FutureLogic Inc.", + [3]byte{0, 34, 49}: "SMT&C Co., Ltd.", + [3]byte{0, 34, 50}: "Design Design Technology Ltd", + [3]byte{0, 34, 51}: "ADB Broadband Italia", + [3]byte{0, 34, 52}: "Corventis Inc.", + [3]byte{0, 34, 53}: "Strukton Systems bv", + [3]byte{0, 34, 54}: "VECTOR SP. Z O.O.", + [3]byte{0, 34, 55}: "Shinhint Group", + [3]byte{0, 34, 56}: "LOGIPLUS", + [3]byte{0, 34, 57}: "Indiana Life Sciences Incorporated", + [3]byte{0, 34, 58}: "Cisco SPVTG", + [3]byte{0, 34, 59}: "Communication Networks, LLC", + [3]byte{0, 34, 60}: "RATIO Entwicklungen GmbH", + [3]byte{0, 34, 61}: "JumpGen Systems, LLC", + [3]byte{0, 34, 62}: "IRTrans GmbH", + [3]byte{0, 34, 63}: "NETGEAR", + [3]byte{0, 34, 64}: "Universal Telecom S/A", + [3]byte{0, 34, 65}: "Apple, Inc.", + [3]byte{0, 34, 66}: "Alacron Inc.", + [3]byte{0, 34, 67}: "AzureWave Technology Inc.", + [3]byte{0, 34, 68}: "Chengdu Linkon Communications Device Co., Ltd", + [3]byte{0, 34, 69}: "Leine & Linde AB", + [3]byte{0, 34, 70}: "Evoc Intelligent Technology Co.,Ltd.", + [3]byte{0, 34, 71}: "DAC ENGINEERING CO., LTD.", + [3]byte{0, 34, 72}: "Microsoft Corporation", + [3]byte{0, 34, 73}: "HOME MULTIENERGY SL", + [3]byte{0, 34, 74}: "RAYLASE AG", + [3]byte{0, 34, 75}: "AIRTECH TECHNOLOGIES, INC.", + [3]byte{0, 34, 76}: "Nintendo Co., Ltd.", + [3]byte{0, 34, 77}: "MITAC INTERNATIONAL CORP.", + [3]byte{0, 34, 78}: "SEEnergy Corp.", + [3]byte{0, 34, 79}: "Byzoro Networks Ltd.", + [3]byte{0, 34, 80}: "Point Six Wireless, LLC", + [3]byte{0, 34, 81}: "Lumasense Technologies", + [3]byte{0, 34, 82}: "ZOLL Lifecor Corporation", + [3]byte{0, 34, 83}: "Entorian Technologies", + [3]byte{0, 34, 84}: "Bigelow Aerospace", + [3]byte{0, 34, 85}: "Cisco Systems, Inc", + [3]byte{0, 34, 86}: "Cisco Systems, Inc", + [3]byte{0, 34, 87}: "3COM EUROPE LTD", + [3]byte{0, 34, 88}: "Taiyo Yuden Co., Ltd.", + [3]byte{0, 34, 89}: "Guangzhou New Postcom Equipment Co.,Ltd.", + [3]byte{0, 34, 90}: "Garde Security AB", + [3]byte{0, 34, 91}: "Teradici Corporation", + [3]byte{0, 34, 92}: "Multimedia & Communication Technology", + [3]byte{0, 34, 93}: "Digicable Network India Pvt. Ltd.", + [3]byte{0, 34, 94}: "Uwin Technologies Co.,LTD", + [3]byte{0, 34, 95}: "Liteon Technology Corporation", + [3]byte{0, 34, 96}: "AFREEY Inc.", + [3]byte{0, 34, 97}: "Frontier Silicon Ltd", + [3]byte{0, 34, 98}: "BEP Marine", + [3]byte{0, 34, 99}: "Koos Technical Services, Inc.", + [3]byte{0, 34, 100}: "Hewlett Packard", + [3]byte{0, 34, 101}: "Nokia Danmark A/S", + [3]byte{0, 34, 102}: "Nokia Danmark A/S", + [3]byte{0, 34, 103}: "Nortel Networks", + [3]byte{0, 34, 104}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{0, 34, 105}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{0, 34, 106}: "Honeywell", + [3]byte{0, 34, 107}: "Cisco-Linksys, LLC", + [3]byte{0, 34, 108}: "LinkSprite Technologies, Inc.", + [3]byte{0, 34, 109}: "Shenzhen GIEC Electronics Co., Ltd.", + [3]byte{0, 34, 110}: "Gowell Electronic Limited", + [3]byte{0, 34, 111}: "3onedata Technology Co. Ltd.", + [3]byte{0, 34, 112}: "ABK North America, LLC", + [3]byte{0, 34, 113}: "Jäger Computergesteuerte Meßtechnik GmbH.", + [3]byte{0, 34, 114}: "American Micro-Fuel Device Corp.", + [3]byte{0, 34, 115}: "Techway", + [3]byte{0, 34, 116}: "FamilyPhone AB", + [3]byte{0, 34, 117}: "Belkin International Inc.", + [3]byte{0, 34, 118}: "Triple EYE B.V.", + [3]byte{0, 34, 119}: "NEC Australia Pty Ltd", + [3]byte{0, 34, 120}: "Shenzhen Tongfang Multimedia Technology Co.,Ltd.", + [3]byte{0, 34, 121}: "Nippon Conlux Co., Ltd.", + [3]byte{0, 34, 122}: "Telecom Design", + [3]byte{0, 34, 123}: "Apogee Labs, Inc.", + [3]byte{0, 34, 124}: "Woori SMT Co.,ltd", + [3]byte{0, 34, 125}: "YE DATA INC.", + [3]byte{0, 34, 126}: "Chengdu 30Kaitian Communication Industry Co.Ltd", + [3]byte{0, 34, 127}: "Ruckus Wireless", + [3]byte{0, 34, 128}: "A2B Electronics AB", + [3]byte{0, 34, 129}: "Daintree Networks Pty", + [3]byte{0, 34, 130}: "8086 Consultancy", + [3]byte{0, 34, 131}: "Juniper Networks", + [3]byte{0, 34, 132}: "DESAY A&V SCIENCE AND TECHNOLOGY CO.,LTD", + [3]byte{0, 34, 133}: "NOMUS COMM SYSTEMS", + [3]byte{0, 34, 134}: "ASTRON", + [3]byte{0, 34, 135}: "Titan Wireless LLC", + [3]byte{0, 34, 136}: "Sagrad, Inc.", + [3]byte{0, 34, 137}: "Optosecurity Inc.", + [3]byte{0, 34, 138}: "Teratronik elektronische systeme gmbh", + [3]byte{0, 34, 139}: "Kensington Computer Products Group", + [3]byte{0, 34, 140}: "Photon Europe GmbH", + [3]byte{0, 34, 141}: "GBS Laboratories LLC", + [3]byte{0, 34, 142}: "TV-NUMERIC", + [3]byte{0, 34, 143}: "CNRS", + [3]byte{0, 34, 144}: "Cisco Systems, Inc", + [3]byte{0, 34, 145}: "Cisco Systems, Inc", + [3]byte{0, 34, 146}: "Cinetal", + [3]byte{0, 34, 147}: "zte corporation", + [3]byte{0, 34, 148}: "KYOCERA CORPORATION", + [3]byte{0, 34, 149}: "SGM Technology for lighting spa", + [3]byte{0, 34, 150}: "LinoWave Corporation", + [3]byte{0, 34, 151}: "XMOS Semiconductor", + [3]byte{0, 34, 152}: "Sony Mobile Communications AB", + [3]byte{0, 34, 153}: "SeaMicro Inc.", + [3]byte{0, 34, 154}: "Lastar, Inc.", + [3]byte{0, 34, 155}: "AverLogic Technologies, Inc.", + [3]byte{0, 34, 156}: "Verismo Networks Inc", + [3]byte{0, 34, 157}: "PYUNG-HWA IND.CO.,LTD", + [3]byte{0, 34, 158}: "Social Aid Research Co., Ltd.", + [3]byte{0, 34, 159}: "Sensys Traffic AB", + [3]byte{0, 34, 160}: "Delphi Corporation", + [3]byte{0, 34, 161}: "Huawei Symantec Technologies Co.,Ltd.", + [3]byte{0, 34, 162}: "Xtramus Technologies", + [3]byte{0, 34, 163}: "California Eastern Laboratories", + [3]byte{0, 34, 164}: "2Wire Inc", + [3]byte{0, 34, 165}: "Texas Instruments", + [3]byte{0, 34, 166}: "Sony Computer Entertainment America", + [3]byte{0, 34, 167}: "Tyco Electronics AMP GmbH", + [3]byte{0, 34, 168}: "Ouman Oy", + [3]byte{0, 34, 169}: "LG Electronics (Mobile Communications)", + [3]byte{0, 34, 170}: "Nintendo Co., Ltd.", + [3]byte{0, 34, 171}: "Shenzhen Turbosight Technology Ltd", + [3]byte{0, 34, 172}: "Hangzhou Siyuan Tech. Co., Ltd", + [3]byte{0, 34, 173}: "TELESIS TECHNOLOGIES, INC.", + [3]byte{0, 34, 174}: "Mattel Inc.", + [3]byte{0, 34, 175}: "Safety Vision", + [3]byte{0, 34, 176}: "D-Link Corporation", + [3]byte{0, 34, 177}: "Elbit Systems Ltd.", + [3]byte{0, 34, 178}: "4RF Communications Ltd", + [3]byte{0, 34, 179}: "Sei S.p.A.", + [3]byte{0, 34, 180}: "ARRIS Group, Inc.", + [3]byte{0, 34, 181}: "NOVITA", + [3]byte{0, 34, 182}: "Superflow Technologies Group", + [3]byte{0, 34, 183}: "GSS Grundig SAT-Systems GmbH", + [3]byte{0, 34, 184}: "Norcott", + [3]byte{0, 34, 185}: "Analogix Seminconductor, Inc", + [3]byte{0, 34, 186}: "HUTH Elektronik Systeme GmbH", + [3]byte{0, 34, 187}: "beyerdynamic GmbH & Co. KG", + [3]byte{0, 34, 188}: "JDSU France SAS", + [3]byte{0, 34, 189}: "Cisco Systems, Inc", + [3]byte{0, 34, 190}: "Cisco Systems, Inc", + [3]byte{0, 34, 191}: "SieAmp Group of Companies", + [3]byte{0, 34, 192}: "Shenzhen Forcelink Electronic Co, Ltd", + [3]byte{0, 34, 193}: "Active Storage Inc.", + [3]byte{0, 34, 194}: "Proview Eletrônica do Brasil LTDA", + [3]byte{0, 34, 195}: "Zeeport Technology Inc.", + [3]byte{0, 34, 196}: "epro GmbH", + [3]byte{0, 34, 197}: "INFORSON Co,Ltd.", + [3]byte{0, 34, 198}: "Sutus Inc", + [3]byte{0, 34, 199}: "SEGGER Microcontroller GmbH & Co. KG", + [3]byte{0, 34, 200}: "Applied Instruments B.V.", + [3]byte{0, 34, 201}: "Lenord, Bauer & Co GmbH", + [3]byte{0, 34, 202}: "Anviz Biometric Tech. Co., Ltd.", + [3]byte{0, 34, 203}: "IONODES Inc.", + [3]byte{0, 34, 204}: "SciLog, Inc.", + [3]byte{0, 34, 205}: "Ared Technology Co., Ltd.", + [3]byte{0, 34, 206}: "Cisco SPVTG", + [3]byte{0, 34, 207}: "PLANEX COMMUNICATIONS INC.", + [3]byte{0, 34, 208}: "Polar Electro Oy", + [3]byte{0, 34, 209}: "Albrecht Jung GmbH & Co. KG", + [3]byte{0, 34, 210}: "All Earth Comércio de Eletrônicos LTDA.", + [3]byte{0, 34, 211}: "Hub-Tech", + [3]byte{0, 34, 212}: "ComWorth Co., Ltd.", + [3]byte{0, 34, 213}: "Eaton Corp. Electrical Group Data Center Solutions - Pulizzi", + [3]byte{0, 34, 214}: "Cypak AB", + [3]byte{0, 34, 215}: "Nintendo Co., Ltd.", + [3]byte{0, 34, 216}: "Shenzhen GST Security and Safety Technology Limited", + [3]byte{0, 34, 217}: "Fortex Industrial Ltd.", + [3]byte{0, 34, 218}: "ANATEK, LLC", + [3]byte{0, 34, 219}: "Translogic Corporation", + [3]byte{0, 34, 220}: "Vigil Health Solutions Inc.", + [3]byte{0, 34, 221}: "Protecta Electronics Ltd", + [3]byte{0, 34, 222}: "OPPO Digital, Inc.", + [3]byte{0, 34, 223}: "TAMUZ Monitors", + [3]byte{0, 34, 224}: "Atlantic Software Technologies S.r.L.", + [3]byte{0, 34, 225}: "ZORT Labs, LLC.", + [3]byte{0, 34, 226}: "WABTEC Transit Division", + [3]byte{0, 34, 227}: "Amerigon", + [3]byte{0, 34, 228}: "APASS TECHNOLOGY CO., LTD.", + [3]byte{0, 34, 229}: "Fisher-Rosemount Systems Inc.", + [3]byte{0, 34, 230}: "Intelligent Data", + [3]byte{0, 34, 231}: "WPS Parking Systems", + [3]byte{0, 34, 232}: "Applition Co., Ltd.", + [3]byte{0, 34, 233}: "ProVision Communications", + [3]byte{0, 34, 234}: "Rustelcom Inc.", + [3]byte{0, 34, 235}: "Data Respons A/S", + [3]byte{0, 34, 236}: "IDEALBT TECHNOLOGY CORPORATION", + [3]byte{0, 34, 237}: "TSI Power Corporation", + [3]byte{0, 34, 238}: "Algo Communication Products Ltd", + [3]byte{0, 34, 239}: "iWDL Technologies", + [3]byte{0, 34, 240}: "3 Greens Aviation Limited", + [3]byte{0, 34, 241}: "Private", + [3]byte{0, 34, 242}: "SunPower Corp", + [3]byte{0, 34, 243}: "SHARP Corporation", + [3]byte{0, 34, 244}: "AMPAK Technology, Inc.", + [3]byte{0, 34, 245}: "Advanced Realtime Tracking GmbH", + [3]byte{0, 34, 246}: "Syracuse Research Corporation", + [3]byte{0, 34, 247}: "Conceptronic", + [3]byte{0, 34, 248}: "PIMA Electronic Systems Ltd.", + [3]byte{0, 34, 249}: "Pollin Electronic GmbH", + [3]byte{0, 34, 250}: "Intel Corporate", + [3]byte{0, 34, 251}: "Intel Corporate", + [3]byte{0, 34, 252}: "Nokia Danmark A/S", + [3]byte{0, 34, 253}: "Nokia Danmark A/S", + [3]byte{0, 34, 254}: "Advanced Illumination", + [3]byte{0, 34, 255}: "NIVIS LLC", + [3]byte{0, 35, 0}: "Cayee Computer Ltd.", + [3]byte{0, 35, 1}: "Witron Technology Limited", + [3]byte{0, 35, 2}: "Cobalt Digital, Inc.", + [3]byte{0, 35, 3}: "LITE-ON IT Corporation", + [3]byte{0, 35, 4}: "Cisco Systems, Inc", + [3]byte{0, 35, 5}: "Cisco Systems, Inc", + [3]byte{0, 35, 6}: "ALPS ELECTRIC CO.,LTD.", + [3]byte{0, 35, 7}: "FUTURE INNOVATION TECH CO.,LTD", + [3]byte{0, 35, 8}: "Arcadyan Technology Corporation", + [3]byte{0, 35, 9}: "Janam Technologies LLC", + [3]byte{0, 35, 10}: "ARBURG GmbH & Co KG", + [3]byte{0, 35, 11}: "ARRIS Group, Inc.", + [3]byte{0, 35, 12}: "CLOVER ELECTRONICS CO.,LTD.", + [3]byte{0, 35, 13}: "Nortel Networks", + [3]byte{0, 35, 14}: "Gorba AG", + [3]byte{0, 35, 15}: "Hirsch Electronics Corporation", + [3]byte{0, 35, 16}: "LNC Technology Co., Ltd.", + [3]byte{0, 35, 17}: "Gloscom Co., Ltd.", + [3]byte{0, 35, 18}: "Apple, Inc.", + [3]byte{0, 35, 19}: "Qool Technologies Ltd.", + [3]byte{0, 35, 20}: "Intel Corporate", + [3]byte{0, 35, 21}: "Intel Corporate", + [3]byte{0, 35, 22}: "KISAN ELECTRONICS CO", + [3]byte{0, 35, 23}: "Lasercraft Inc", + [3]byte{0, 35, 24}: "Toshiba", + [3]byte{0, 35, 25}: "Sielox LLC", + [3]byte{0, 35, 26}: "ITF Co., Ltd.", + [3]byte{0, 35, 27}: "Danaher Motion - Kollmorgen", + [3]byte{0, 35, 28}: "Fourier Systems Ltd.", + [3]byte{0, 35, 29}: "Deltacom Electronics Ltd", + [3]byte{0, 35, 30}: "Cezzer Multimedia Technologies", + [3]byte{0, 35, 31}: "Guangda Electronic & Telecommunication Technology Development Co., Ltd.", + [3]byte{0, 35, 32}: "Nicira Networks", + [3]byte{0, 35, 33}: "Avitech International Corp", + [3]byte{0, 35, 34}: "KISS Teknical Solutions, Inc.", + [3]byte{0, 35, 35}: "Zylin AS", + [3]byte{0, 35, 36}: "G-PRO COMPUTER", + [3]byte{0, 35, 37}: "IOLAN Holding", + [3]byte{0, 35, 38}: "FUJITSU LIMITED", + [3]byte{0, 35, 39}: "Shouyo Electronics CO., LTD", + [3]byte{0, 35, 40}: "ALCON TELECOMMUNICATIONS CO., LTD.", + [3]byte{0, 35, 41}: "DDRdrive LLC", + [3]byte{0, 35, 42}: "eonas IT-Beratung und -Entwicklung GmbH", + [3]byte{0, 35, 43}: "IRD A/S", + [3]byte{0, 35, 44}: "Senticare", + [3]byte{0, 35, 45}: "SandForce", + [3]byte{0, 35, 46}: "Kedah Electronics Engineering, LLC", + [3]byte{0, 35, 47}: "Advanced Card Systems Ltd.", + [3]byte{0, 35, 48}: "DIZIPIA, INC.", + [3]byte{0, 35, 49}: "Nintendo Co., Ltd.", + [3]byte{0, 35, 50}: "Apple, Inc.", + [3]byte{0, 35, 51}: "Cisco Systems, Inc", + [3]byte{0, 35, 52}: "Cisco Systems, Inc", + [3]byte{0, 35, 53}: "Linkflex Co.,Ltd", + [3]byte{0, 35, 54}: "METEL s.r.o.", + [3]byte{0, 35, 55}: "Global Star Solutions ULC", + [3]byte{0, 35, 56}: "OJ-Electronics A/S", + [3]byte{0, 35, 57}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 35, 58}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 35, 59}: "C-Matic Systems Ltd", + [3]byte{0, 35, 60}: "Alflex", + [3]byte{0, 35, 61}: "Novero holding B.V.", + [3]byte{0, 35, 62}: "Alcatel-Lucent IPD", + [3]byte{0, 35, 63}: "Purechoice Inc", + [3]byte{0, 35, 64}: "MiXTelematics", + [3]byte{0, 35, 65}: "Vanderbilt International (SWE) AB", + [3]byte{0, 35, 66}: "Coffee Equipment Company", + [3]byte{0, 35, 67}: "TEM AG", + [3]byte{0, 35, 68}: "Objective Interface Systems, Inc.", + [3]byte{0, 35, 69}: "Sony Mobile Communications AB", + [3]byte{0, 35, 70}: "Vestac", + [3]byte{0, 35, 71}: "ProCurve Networking by HP", + [3]byte{0, 35, 72}: "Sagemcom Broadband SAS", + [3]byte{0, 35, 73}: "Helmholtz Centre Berlin for Material and Energy", + [3]byte{0, 35, 74}: "Private", + [3]byte{0, 35, 75}: "Inyuan Technology Inc.", + [3]byte{0, 35, 76}: "KTC AB", + [3]byte{0, 35, 77}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{0, 35, 78}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{0, 35, 79}: "Luminous Power Technologies Pvt. Ltd.", + [3]byte{0, 35, 80}: "LynTec", + [3]byte{0, 35, 81}: "2Wire Inc", + [3]byte{0, 35, 82}: "DATASENSOR S.p.A.", + [3]byte{0, 35, 83}: "F E T Elettronica snc", + [3]byte{0, 35, 84}: "ASUSTek COMPUTER INC.", + [3]byte{0, 35, 85}: "Kinco Automation(Shanghai) Ltd.", + [3]byte{0, 35, 86}: "Packet Forensics LLC", + [3]byte{0, 35, 87}: "Pitronot Technologies and Engineering P.T.E. Ltd.", + [3]byte{0, 35, 88}: "SYSTEL SA", + [3]byte{0, 35, 89}: "Benchmark Electronics ( Thailand ) Public Company Limited", + [3]byte{0, 35, 90}: "COMPAL INFORMATION (KUNSHAN) CO., LTD.", + [3]byte{0, 35, 91}: "Gulfstream", + [3]byte{0, 35, 92}: "Aprius, Inc.", + [3]byte{0, 35, 93}: "Cisco Systems, Inc", + [3]byte{0, 35, 94}: "Cisco Systems, Inc", + [3]byte{0, 35, 95}: "Silicon Micro Sensors GmbH", + [3]byte{0, 35, 96}: "Lookit Technology Co., Ltd", + [3]byte{0, 35, 97}: "Unigen Corporation", + [3]byte{0, 35, 98}: "Goldline Controls", + [3]byte{0, 35, 99}: "Zhuhai Raysharp Technology Co.,Ltd", + [3]byte{0, 35, 100}: "Power Instruments Pte Ltd", + [3]byte{0, 35, 101}: "Insta Elektro GmbH", + [3]byte{0, 35, 102}: "Beijing Siasun Electronic System Co.,Ltd.", + [3]byte{0, 35, 103}: "UniControls a.s.", + [3]byte{0, 35, 104}: "Zebra Technologies Inc", + [3]byte{0, 35, 105}: "Cisco-Linksys, LLC", + [3]byte{0, 35, 106}: "SmartRG Inc", + [3]byte{0, 35, 107}: "Xembedded, Inc.", + [3]byte{0, 35, 108}: "Apple, Inc.", + [3]byte{0, 35, 109}: "ResMed Ltd", + [3]byte{0, 35, 110}: "Burster GmbH & Co KG", + [3]byte{0, 35, 111}: "DAQ System", + [3]byte{0, 35, 112}: "Snell", + [3]byte{0, 35, 113}: "SOAM Systel", + [3]byte{0, 35, 114}: "MORE STAR INDUSTRIAL GROUP LIMITED", + [3]byte{0, 35, 115}: "GridIron Systems, Inc.", + [3]byte{0, 35, 116}: "ARRIS Group, Inc.", + [3]byte{0, 35, 117}: "ARRIS Group, Inc.", + [3]byte{0, 35, 118}: "HTC Corporation", + [3]byte{0, 35, 119}: "Isotek Electronics Ltd", + [3]byte{0, 35, 120}: "GN Netcom A/S", + [3]byte{0, 35, 121}: "Union Business Machines Co. Ltd.", + [3]byte{0, 35, 122}: "RIM", + [3]byte{0, 35, 123}: "WHDI LLC", + [3]byte{0, 35, 124}: "NEOTION", + [3]byte{0, 35, 125}: "Hewlett Packard", + [3]byte{0, 35, 126}: "ELSTER GMBH", + [3]byte{0, 35, 127}: "PLANTRONICS, INC.", + [3]byte{0, 35, 128}: "Nanoteq", + [3]byte{0, 35, 129}: "Lengda Technology(Xiamen) Co.,Ltd.", + [3]byte{0, 35, 130}: "Lih Rong electronic Enterprise Co., Ltd.", + [3]byte{0, 35, 131}: "InMage Systems Inc", + [3]byte{0, 35, 132}: "GGH Engineering s.r.l.", + [3]byte{0, 35, 133}: "ANTIPODE", + [3]byte{0, 35, 134}: "Tour & Andersson AB", + [3]byte{0, 35, 135}: "ThinkFlood, Inc.", + [3]byte{0, 35, 136}: "V.T. Telematica S.p.a.", + [3]byte{0, 35, 137}: "Hangzhou H3C Technologies Co., Limited", + [3]byte{0, 35, 138}: "Ciena Corporation", + [3]byte{0, 35, 139}: "QUANTA COMPUTER INC.", + [3]byte{0, 35, 140}: "Private", + [3]byte{0, 35, 141}: "Techno Design Co., Ltd.", + [3]byte{0, 35, 142}: "ADB Broadband Italia", + [3]byte{0, 35, 143}: "NIDEC COPAL CORPORATION", + [3]byte{0, 35, 144}: "Algolware Corporation", + [3]byte{0, 35, 145}: "Maxian", + [3]byte{0, 35, 146}: "Proteus Industries Inc.", + [3]byte{0, 35, 147}: "AJINEXTEK", + [3]byte{0, 35, 148}: "Samjeon", + [3]byte{0, 35, 149}: "ARRIS Group, Inc.", + [3]byte{0, 35, 150}: "ANDES TECHNOLOGY CORPORATION", + [3]byte{0, 35, 151}: "Westell Technologies Inc.", + [3]byte{0, 35, 152}: "Vutlan sro", + [3]byte{0, 35, 153}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 35, 154}: "EasyData Hardware GmbH", + [3]byte{0, 35, 155}: "Elster Solutions, LLC", + [3]byte{0, 35, 156}: "Juniper Networks", + [3]byte{0, 35, 157}: "Mapower Electronics Co., Ltd", + [3]byte{0, 35, 158}: "Jiangsu Lemote Technology Corporation Limited", + [3]byte{0, 35, 159}: "Institut für Prüftechnik", + [3]byte{0, 35, 160}: "Hana CNS Co., LTD.", + [3]byte{0, 35, 161}: "Trend Electronics Ltd", + [3]byte{0, 35, 162}: "ARRIS Group, Inc.", + [3]byte{0, 35, 163}: "ARRIS Group, Inc.", + [3]byte{0, 35, 164}: "New Concepts Development Corp.", + [3]byte{0, 35, 165}: "SageTV, LLC", + [3]byte{0, 35, 166}: "E-Mon", + [3]byte{0, 35, 167}: "Redpine Signals, Inc.", + [3]byte{0, 35, 168}: "Marshall Electronics", + [3]byte{0, 35, 169}: "Beijing Detianquan Electromechanical Equipment Co., Ltd", + [3]byte{0, 35, 170}: "HFR, Inc.", + [3]byte{0, 35, 171}: "Cisco Systems, Inc", + [3]byte{0, 35, 172}: "Cisco Systems, Inc", + [3]byte{0, 35, 173}: "Xmark Corporation", + [3]byte{0, 35, 174}: "Dell Inc.", + [3]byte{0, 35, 175}: "ARRIS Group, Inc.", + [3]byte{0, 35, 176}: "COMXION Technology Inc.", + [3]byte{0, 35, 177}: "Longcheer Technology (Singapore) Pte Ltd", + [3]byte{0, 35, 178}: "Intelligent Mechatronic Systems Inc", + [3]byte{0, 35, 179}: "Lyyn AB", + [3]byte{0, 35, 180}: "Nokia Danmark A/S", + [3]byte{0, 35, 181}: "ORTANA LTD", + [3]byte{0, 35, 182}: "SECURITE COMMUNICATIONS / HONEYWELL", + [3]byte{0, 35, 183}: "Q-Light Co., Ltd.", + [3]byte{0, 35, 184}: "Sichuan Jiuzhou Electronic Technology Co.,Ltd", + [3]byte{0, 35, 185}: "Airbus Defence and Space Deutschland GmbH", + [3]byte{0, 35, 186}: "Chroma", + [3]byte{0, 35, 187}: "Schmitt Industries", + [3]byte{0, 35, 188}: "EQ-SYS GmbH", + [3]byte{0, 35, 189}: "Digital Ally, Inc.", + [3]byte{0, 35, 190}: "Cisco SPVTG", + [3]byte{0, 35, 191}: "Mainpine, Inc.", + [3]byte{0, 35, 192}: "Broadway Networks", + [3]byte{0, 35, 193}: "Securitas Direct AB", + [3]byte{0, 35, 194}: "SAMSUNG Electronics. Co. LTD", + [3]byte{0, 35, 195}: "LogMeIn, Inc.", + [3]byte{0, 35, 196}: "Lux Lumen", + [3]byte{0, 35, 197}: "Radiation Safety and Control Services Inc", + [3]byte{0, 35, 198}: "SMC Corporation", + [3]byte{0, 35, 199}: "AVSystem", + [3]byte{0, 35, 200}: "TEAM-R", + [3]byte{0, 35, 201}: "Sichuan Tianyi Information Science & Technology Stock CO.,LTD", + [3]byte{0, 35, 202}: "Behind The Set, LLC", + [3]byte{0, 35, 203}: "Shenzhen Full-join Technology Co.,Ltd", + [3]byte{0, 35, 204}: "Nintendo Co., Ltd.", + [3]byte{0, 35, 205}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{0, 35, 206}: "KITA DENSHI CORPORATION", + [3]byte{0, 35, 207}: "CUMMINS-ALLISON CORP.", + [3]byte{0, 35, 208}: "Uniloc USA Inc.", + [3]byte{0, 35, 209}: "TRG", + [3]byte{0, 35, 210}: "Inhand Electronics, Inc.", + [3]byte{0, 35, 211}: "AirLink WiFi Networking Corp.", + [3]byte{0, 35, 212}: "Texas Instruments", + [3]byte{0, 35, 213}: "WAREMA electronic GmbH", + [3]byte{0, 35, 214}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 35, 215}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 35, 216}: "Ball-It Oy", + [3]byte{0, 35, 217}: "Banner Engineering", + [3]byte{0, 35, 218}: "Industrial Computer Source (Deutschland)GmbH", + [3]byte{0, 35, 219}: "saxnet gmbh", + [3]byte{0, 35, 220}: "Benein, Inc", + [3]byte{0, 35, 221}: "ELGIN S.A.", + [3]byte{0, 35, 222}: "Ansync Inc.", + [3]byte{0, 35, 223}: "Apple, Inc.", + [3]byte{0, 35, 224}: "INO Therapeutics LLC", + [3]byte{0, 35, 225}: "Cavena Image Products AB", + [3]byte{0, 35, 226}: "SEA Signalisation", + [3]byte{0, 35, 227}: "Microtronic AG", + [3]byte{0, 35, 228}: "IPnect co. ltd.", + [3]byte{0, 35, 229}: "IPaXiom Networks", + [3]byte{0, 35, 230}: "Pirkus, Inc.", + [3]byte{0, 35, 231}: "Hinke A/S", + [3]byte{0, 35, 232}: "Demco Corp.", + [3]byte{0, 35, 233}: "F5 Networks, Inc.", + [3]byte{0, 35, 234}: "Cisco Systems, Inc", + [3]byte{0, 35, 235}: "Cisco Systems, Inc", + [3]byte{0, 35, 236}: "Algorithmix GmbH", + [3]byte{0, 35, 237}: "ARRIS Group, Inc.", + [3]byte{0, 35, 238}: "ARRIS Group, Inc.", + [3]byte{0, 35, 239}: "Zuend Systemtechnik AG", + [3]byte{0, 35, 240}: "Shanghai Jinghan Weighing Apparatus Co. Ltd.", + [3]byte{0, 35, 241}: "Sony Mobile Communications AB", + [3]byte{0, 35, 242}: "TVLogic", + [3]byte{0, 35, 243}: "Glocom, Inc.", + [3]byte{0, 35, 244}: "Masternaut", + [3]byte{0, 35, 245}: "WILO SE", + [3]byte{0, 35, 246}: "Softwell Technology Co., Ltd.", + [3]byte{0, 35, 247}: "Private", + [3]byte{0, 35, 248}: "Zyxel Communications Corporation", + [3]byte{0, 35, 249}: "Double-Take Software, INC.", + [3]byte{0, 35, 250}: "RG Nets, Inc.", + [3]byte{0, 35, 251}: "IP Datatel, LLC.", + [3]byte{0, 35, 252}: "Ultra Stereo Labs, Inc", + [3]byte{0, 35, 253}: "AFT Atlas Fahrzeugtechnik GmbH", + [3]byte{0, 35, 254}: "Biodevices, SA", + [3]byte{0, 35, 255}: "Beijing HTTC Technology Ltd.", + [3]byte{0, 36, 0}: "Nortel Networks", + [3]byte{0, 36, 1}: "D-Link Corporation", + [3]byte{0, 36, 2}: "Op-Tection GmbH", + [3]byte{0, 36, 3}: "Nokia Danmark A/S", + [3]byte{0, 36, 4}: "Nokia Danmark A/S", + [3]byte{0, 36, 5}: "Dilog Nordic AB", + [3]byte{0, 36, 6}: "Pointmobile", + [3]byte{0, 36, 7}: "TELEM SAS", + [3]byte{0, 36, 8}: "Pacific Biosciences", + [3]byte{0, 36, 9}: "The Toro Company", + [3]byte{0, 36, 10}: "US Beverage Net", + [3]byte{0, 36, 11}: "Virtual Computer Inc.", + [3]byte{0, 36, 12}: "DELEC GmbH", + [3]byte{0, 36, 13}: "OnePath Networks LTD.", + [3]byte{0, 36, 14}: "Inventec Besta Co., Ltd.", + [3]byte{0, 36, 15}: "Ishii Tool & Engineering Corporation", + [3]byte{0, 36, 16}: "NUETEQ Technology,Inc.", + [3]byte{0, 36, 17}: "PharmaSmart LLC", + [3]byte{0, 36, 18}: "Benign Technologies Co, Ltd.", + [3]byte{0, 36, 19}: "Cisco Systems, Inc", + [3]byte{0, 36, 20}: "Cisco Systems, Inc", + [3]byte{0, 36, 21}: "Magnetic Autocontrol GmbH", + [3]byte{0, 36, 22}: "Any Use", + [3]byte{0, 36, 23}: "Thomson Telecom Belgium", + [3]byte{0, 36, 24}: "Nextwave Semiconductor", + [3]byte{0, 36, 25}: "Private", + [3]byte{0, 36, 26}: "Red Beetle Inc.", + [3]byte{0, 36, 27}: "iWOW Communications Pte Ltd", + [3]byte{0, 36, 28}: "FuGang Electronic (DG) Co.,Ltd", + [3]byte{0, 36, 29}: "GIGA-BYTE TECHNOLOGY CO.,LTD.", + [3]byte{0, 36, 30}: "Nintendo Co., Ltd.", + [3]byte{0, 36, 31}: "DCT-Delta GmbH", + [3]byte{0, 36, 32}: "NetUP Inc.", + [3]byte{0, 36, 33}: "MICRO-STAR INT'L CO., LTD.", + [3]byte{0, 36, 34}: "Knapp Logistik Automation GmbH", + [3]byte{0, 36, 35}: "AzureWave Technologies (Shanghai) Inc.", + [3]byte{0, 36, 36}: "Ace Axis Limited", + [3]byte{0, 36, 37}: "Shenzhenshi chuangzhicheng Technology Co.,Ltd", + [3]byte{0, 36, 38}: "NOHMI BOSAI LTD.", + [3]byte{0, 36, 39}: "SSI COMPUTER CORP", + [3]byte{0, 36, 40}: "EnergyICT", + [3]byte{0, 36, 41}: "MK MASTER INC.", + [3]byte{0, 36, 42}: "Hittite Microwave Corporation", + [3]byte{0, 36, 43}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{0, 36, 44}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{0, 36, 46}: "Datastrip Inc.", + [3]byte{0, 36, 47}: "Micron", + [3]byte{0, 36, 48}: "Ruby Tech Corp.", + [3]byte{0, 36, 49}: "Uni-v co.,ltd", + [3]byte{0, 36, 50}: "Neostar Technology Co.,LTD", + [3]byte{0, 36, 51}: "ALPS ELECTRIC CO.,LTD.", + [3]byte{0, 36, 52}: "Lectrosonics, Inc.", + [3]byte{0, 36, 53}: "WIDE CORPORATION", + [3]byte{0, 36, 54}: "Apple, Inc.", + [3]byte{0, 36, 55}: "Motorola - BSG", + [3]byte{0, 36, 56}: "Brocade Communications Systems, Inc.", + [3]byte{0, 36, 57}: "Digital Barriers Advanced Technologies", + [3]byte{0, 36, 58}: "Ludl Electronic Products", + [3]byte{0, 36, 59}: "CSSI (S) Pte Ltd", + [3]byte{0, 36, 60}: "S.A.A.A.", + [3]byte{0, 36, 61}: "Emerson Appliance Motors and Controls", + [3]byte{0, 36, 63}: "Storwize, Inc.", + [3]byte{0, 36, 64}: "Halo Monitoring, Inc.", + [3]byte{0, 36, 65}: "Wanzl Metallwarenfabrik GmbH", + [3]byte{0, 36, 66}: "Axona Limited", + [3]byte{0, 36, 67}: "Nortel Networks", + [3]byte{0, 36, 68}: "Nintendo Co., Ltd.", + [3]byte{0, 36, 69}: "Adtran Inc", + [3]byte{0, 36, 70}: "MMB Research Inc.", + [3]byte{0, 36, 71}: "Kaztek Systems", + [3]byte{0, 36, 72}: "SpiderCloud Wireless, Inc", + [3]byte{0, 36, 73}: "Shen Zhen Lite Star Electronics Technology Co., Ltd", + [3]byte{0, 36, 74}: "Voyant International", + [3]byte{0, 36, 75}: "PERCEPTRON INC", + [3]byte{0, 36, 76}: "Solartron Metrology Ltd", + [3]byte{0, 36, 77}: "Hokkaido Electronics Corporation", + [3]byte{0, 36, 78}: "RadChips, Inc.", + [3]byte{0, 36, 79}: "Asantron Technologies Ltd.", + [3]byte{0, 36, 80}: "Cisco Systems, Inc", + [3]byte{0, 36, 81}: "Cisco Systems, Inc", + [3]byte{0, 36, 82}: "Silicon Software GmbH", + [3]byte{0, 36, 83}: "Initra d.o.o.", + [3]byte{0, 36, 84}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 36, 85}: "MuLogic BV", + [3]byte{0, 36, 86}: "2Wire Inc", + [3]byte{0, 36, 88}: "PA Bastion CC", + [3]byte{0, 36, 89}: "ABB Automation products GmbH", + [3]byte{0, 36, 90}: "Nanjing Panda Electronics Company Limited", + [3]byte{0, 36, 91}: "RAIDON TECHNOLOGY, INC.", + [3]byte{0, 36, 92}: "Design-Com Technologies Pty. Ltd.", + [3]byte{0, 36, 93}: "Terberg besturingstechniek B.V.", + [3]byte{0, 36, 94}: "Hivision Co.,ltd", + [3]byte{0, 36, 95}: "Vine Telecom CO.,Ltd.", + [3]byte{0, 36, 96}: "Giaval Science Development Co. Ltd.", + [3]byte{0, 36, 97}: "Shin Wang Tech.", + [3]byte{0, 36, 98}: "Rayzone Corporation", + [3]byte{0, 36, 99}: "Phybridge Inc", + [3]byte{0, 36, 100}: "Bridge Technologies Co AS", + [3]byte{0, 36, 101}: "Elentec", + [3]byte{0, 36, 102}: "Unitron nv", + [3]byte{0, 36, 103}: "AOC International (Europe) GmbH", + [3]byte{0, 36, 104}: "Sumavision Technologies Co.,Ltd", + [3]byte{0, 36, 105}: "Smart Doorphones", + [3]byte{0, 36, 106}: "Solid Year Co., Ltd.", + [3]byte{0, 36, 107}: "Covia, Inc.", + [3]byte{0, 36, 108}: "Aruba Networks", + [3]byte{0, 36, 109}: "Weinzierl Engineering GmbH", + [3]byte{0, 36, 110}: "Phihong USA Corp.", + [3]byte{0, 36, 111}: "Onda Communication spa", + [3]byte{0, 36, 112}: "AUROTECH ultrasound AS.", + [3]byte{0, 36, 113}: "Fusion MultiSystems dba Fusion-io", + [3]byte{0, 36, 114}: "ReDriven Power Inc.", + [3]byte{0, 36, 115}: "3COM EUROPE LTD", + [3]byte{0, 36, 116}: "Autronica Fire And Securirty", + [3]byte{0, 36, 117}: "Compass System(Embedded Dept.)", + [3]byte{0, 36, 118}: "TAP.tv", + [3]byte{0, 36, 119}: "Tibbo Technology", + [3]byte{0, 36, 120}: "Mag Tech Electronics Co Limited", + [3]byte{0, 36, 121}: "Optec Displays, Inc.", + [3]byte{0, 36, 122}: "FU YI CHENG Technology Co., Ltd.", + [3]byte{0, 36, 123}: "Actiontec Electronics, Inc", + [3]byte{0, 36, 124}: "Nokia Danmark A/S", + [3]byte{0, 36, 125}: "Nokia Danmark A/S", + [3]byte{0, 36, 126}: "Universal Global Scientific Industrial Co., Ltd.", + [3]byte{0, 36, 127}: "Nortel Networks", + [3]byte{0, 36, 128}: "Meteocontrol GmbH", + [3]byte{0, 36, 129}: "Hewlett Packard", + [3]byte{0, 36, 130}: "Ruckus Wireless", + [3]byte{0, 36, 131}: "LG Electronics (Mobile Communications)", + [3]byte{0, 36, 132}: "Bang and Olufsen Medicom a/s", + [3]byte{0, 36, 133}: "ConteXtream Ltd", + [3]byte{0, 36, 134}: "DesignArt Networks", + [3]byte{0, 36, 135}: "Blackboard Inc.", + [3]byte{0, 36, 136}: "Centre For Development Of Telematics", + [3]byte{0, 36, 137}: "Vodafone Omnitel N.V.", + [3]byte{0, 36, 138}: "Kaga Electronics Co., Ltd.", + [3]byte{0, 36, 139}: "HYBUS CO., LTD.", + [3]byte{0, 36, 140}: "ASUSTek COMPUTER INC.", + [3]byte{0, 36, 141}: "Sony Interactive Entertainment Inc.", + [3]byte{0, 36, 142}: "Infoware ZRt.", + [3]byte{0, 36, 143}: "DO-MONIX", + [3]byte{0, 36, 144}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 36, 145}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 36, 146}: "Motorola, Broadband Solutions Group", + [3]byte{0, 36, 147}: "ARRIS Group, Inc.", + [3]byte{0, 36, 148}: "Shenzhen Baoxin Tech CO., Ltd.", + [3]byte{0, 36, 149}: "ARRIS Group, Inc.", + [3]byte{0, 36, 150}: "Ginzinger electronic systems", + [3]byte{0, 36, 151}: "Cisco Systems, Inc", + [3]byte{0, 36, 152}: "Cisco Systems, Inc", + [3]byte{0, 36, 153}: "Aquila Technologies", + [3]byte{0, 36, 154}: "Beijing Zhongchuang Telecommunication Test Co., Ltd.", + [3]byte{0, 36, 155}: "Action Star Enterprise Co., Ltd.", + [3]byte{0, 36, 156}: "Bimeng Comunication System Co. Ltd", + [3]byte{0, 36, 157}: "NES Technology Inc.", + [3]byte{0, 36, 158}: "ADC-Elektronik GmbH", + [3]byte{0, 36, 159}: "RIM Testing Services", + [3]byte{0, 36, 160}: "ARRIS Group, Inc.", + [3]byte{0, 36, 161}: "ARRIS Group, Inc.", + [3]byte{0, 36, 162}: "Hong Kong Middleware Technology Limited", + [3]byte{0, 36, 163}: "Sonim Technologies Inc", + [3]byte{0, 36, 164}: "Siklu Communication", + [3]byte{0, 36, 165}: "BUFFALO.INC", + [3]byte{0, 36, 166}: "TELESTAR DIGITAL GmbH", + [3]byte{0, 36, 167}: "Advanced Video Communications Inc.", + [3]byte{0, 36, 168}: "ProCurve Networking by HP", + [3]byte{0, 36, 169}: "Ag Leader Technology", + [3]byte{0, 36, 170}: "Dycor Technologies Ltd.", + [3]byte{0, 36, 171}: "A7 Engineering, Inc.", + [3]byte{0, 36, 172}: "Hangzhou DPtech Technologies Co., Ltd.", + [3]byte{0, 36, 173}: "Adolf Thies Gmbh & Co. KG", + [3]byte{0, 36, 174}: "Morpho", + [3]byte{0, 36, 175}: "Echostar Technologies Corp", + [3]byte{0, 36, 176}: "ESAB AB", + [3]byte{0, 36, 177}: "Coulomb Technologies", + [3]byte{0, 36, 178}: "NETGEAR", + [3]byte{0, 36, 179}: "Graf-Syteco GmbH & Co. KG", + [3]byte{0, 36, 180}: "ESCATRONIC GmbH", + [3]byte{0, 36, 181}: "Nortel Networks", + [3]byte{0, 36, 182}: "Seagate Technology", + [3]byte{0, 36, 183}: "GridPoint, Inc.", + [3]byte{0, 36, 184}: "free alliance sdn bhd", + [3]byte{0, 36, 185}: "Wuhan Higheasy Electronic Technology Development Co.Ltd", + [3]byte{0, 36, 186}: "Texas Instruments", + [3]byte{0, 36, 187}: "CENTRAL Corporation", + [3]byte{0, 36, 188}: "HuRob Co.,Ltd", + [3]byte{0, 36, 189}: "Hainzl Industriesysteme GmbH", + [3]byte{0, 36, 190}: "Sony Corporation", + [3]byte{0, 36, 191}: "CIAT", + [3]byte{0, 36, 192}: "NTI COMODO INC", + [3]byte{0, 36, 193}: "ARRIS Group, Inc.", + [3]byte{0, 36, 194}: "Asumo Co.,Ltd.", + [3]byte{0, 36, 195}: "Cisco Systems, Inc", + [3]byte{0, 36, 196}: "Cisco Systems, Inc", + [3]byte{0, 36, 197}: "Meridian Audio Limited", + [3]byte{0, 36, 198}: "Hager Electro SAS", + [3]byte{0, 36, 199}: "Mobilarm Ltd", + [3]byte{0, 36, 200}: "Broadband Solutions Group", + [3]byte{0, 36, 201}: "Broadband Solutions Group", + [3]byte{0, 36, 202}: "Tobii Technology AB", + [3]byte{0, 36, 203}: "Autonet Mobile", + [3]byte{0, 36, 204}: "Fascinations Toys and Gifts, Inc.", + [3]byte{0, 36, 205}: "Willow Garage, Inc.", + [3]byte{0, 36, 206}: "Exeltech Inc", + [3]byte{0, 36, 207}: "Inscape Data Corporation", + [3]byte{0, 36, 208}: "Shenzhen SOGOOD Industry CO.,LTD.", + [3]byte{0, 36, 209}: "Thomson Inc.", + [3]byte{0, 36, 210}: "ASKEY COMPUTER CORP", + [3]byte{0, 36, 211}: "QUALICA Inc.", + [3]byte{0, 36, 212}: "FREEBOX SAS", + [3]byte{0, 36, 213}: "Winward Industrial Limited", + [3]byte{0, 36, 214}: "Intel Corporate", + [3]byte{0, 36, 215}: "Intel Corporate", + [3]byte{0, 36, 216}: "IlSung Precision", + [3]byte{0, 36, 217}: "BICOM, Inc.", + [3]byte{0, 36, 218}: "Innovar Systems Limited", + [3]byte{0, 36, 219}: "Alcohol Monitoring Systems", + [3]byte{0, 36, 220}: "Juniper Networks", + [3]byte{0, 36, 221}: "Centrak, Inc.", + [3]byte{0, 36, 222}: "GLOBAL Technology Inc.", + [3]byte{0, 36, 223}: "Digitalbox Europe GmbH", + [3]byte{0, 36, 224}: "DS Tech, LLC", + [3]byte{0, 36, 225}: "Convey Computer Corp.", + [3]byte{0, 36, 226}: "HASEGAWA ELECTRIC CO.,LTD.", + [3]byte{0, 36, 227}: "CAO Group", + [3]byte{0, 36, 228}: "Withings", + [3]byte{0, 36, 229}: "Seer Technology, Inc", + [3]byte{0, 36, 230}: "In Motion Technology Inc.", + [3]byte{0, 36, 231}: "Plaster Networks", + [3]byte{0, 36, 232}: "Dell Inc.", + [3]byte{0, 36, 233}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 36, 234}: "iris-GmbH infrared & intelligent sensors", + [3]byte{0, 36, 235}: "ClearPath Networks, Inc.", + [3]byte{0, 36, 236}: "United Information Technology Co.,Ltd.", + [3]byte{0, 36, 237}: "YT Elec. Co,.Ltd.", + [3]byte{0, 36, 238}: "Wynmax Inc.", + [3]byte{0, 36, 239}: "Sony Mobile Communications AB", + [3]byte{0, 36, 240}: "Seanodes", + [3]byte{0, 36, 241}: "Shenzhen Fanhai Sanjiang Electronics Co., Ltd.", + [3]byte{0, 36, 242}: "Uniphone Telecommunication Co., Ltd.", + [3]byte{0, 36, 243}: "Nintendo Co., Ltd.", + [3]byte{0, 36, 244}: "Kaminario, Ltd.", + [3]byte{0, 36, 245}: "NDS Surgical Imaging", + [3]byte{0, 36, 246}: "MIYOSHI ELECTRONICS CORPORATION", + [3]byte{0, 36, 247}: "Cisco Systems, Inc", + [3]byte{0, 36, 248}: "Technical Solutions Company Ltd.", + [3]byte{0, 36, 249}: "Cisco Systems, Inc", + [3]byte{0, 36, 250}: "Hilger u. Kern GMBH", + [3]byte{0, 36, 251}: "Private", + [3]byte{0, 36, 252}: "QuoPin Co., Ltd.", + [3]byte{0, 36, 253}: "Accedian Networks Inc", + [3]byte{0, 36, 254}: "AVM GmbH", + [3]byte{0, 36, 255}: "QLogic Corporation", + [3]byte{0, 37, 0}: "Apple, Inc.", + [3]byte{0, 37, 1}: "JSC Supertel", + [3]byte{0, 37, 2}: "NaturalPoint", + [3]byte{0, 37, 3}: "IBM Corp", + [3]byte{0, 37, 4}: "Valiant Communications Limited", + [3]byte{0, 37, 5}: "eks Engel GmbH & Co. KG", + [3]byte{0, 37, 6}: "A.I. ANTITACCHEGGIO ITALIA SRL", + [3]byte{0, 37, 7}: "ASTAK Inc.", + [3]byte{0, 37, 8}: "Maquet Cardiopulmonary AG", + [3]byte{0, 37, 9}: "SHARETRONIC Group LTD", + [3]byte{0, 37, 10}: "Security Expert Co. Ltd", + [3]byte{0, 37, 11}: "CENTROFACTOR INC", + [3]byte{0, 37, 12}: "Enertrac", + [3]byte{0, 37, 13}: "GZT Telkom-Telmor sp. z o.o.", + [3]byte{0, 37, 14}: "gt german telematics gmbh", + [3]byte{0, 37, 15}: "On-Ramp Wireless, Inc.", + [3]byte{0, 37, 16}: "Pico-Tesla Magnetic Therapies", + [3]byte{0, 37, 17}: "Elitegroup Computer Systems Co.,Ltd.", + [3]byte{0, 37, 18}: "zte corporation", + [3]byte{0, 37, 19}: "CXP DIGITAL BV", + [3]byte{0, 37, 20}: "PC Worth Int'l Co., Ltd.", + [3]byte{0, 37, 21}: "SFR", + [3]byte{0, 37, 22}: "Integrated Design Tools, Inc.", + [3]byte{0, 37, 23}: "Venntis, LLC", + [3]byte{0, 37, 24}: "Power PLUS Communications AG", + [3]byte{0, 37, 25}: "Viaas Inc", + [3]byte{0, 37, 26}: "Psiber Data Systems Inc.", + [3]byte{0, 37, 27}: "Philips CareServant", + [3]byte{0, 37, 28}: "EDT", + [3]byte{0, 37, 29}: "DSA Encore, LLC", + [3]byte{0, 37, 30}: "ROTEL TECHNOLOGIES", + [3]byte{0, 37, 31}: "ZYNUS VISION INC.", + [3]byte{0, 37, 32}: "SMA Railway Technology GmbH", + [3]byte{0, 37, 33}: "Logitek Electronic Systems, Inc.", + [3]byte{0, 37, 34}: "ASRock Incorporation", + [3]byte{0, 37, 35}: "OCP Inc.", + [3]byte{0, 37, 36}: "Lightcomm Technology Co., Ltd", + [3]byte{0, 37, 37}: "CTERA Networks Ltd.", + [3]byte{0, 37, 38}: "Genuine Technologies Co., Ltd.", + [3]byte{0, 37, 39}: "Bitrode Corp.", + [3]byte{0, 37, 40}: "Daido Signal Co., Ltd.", + [3]byte{0, 37, 41}: "COMELIT GROUP S.P.A", + [3]byte{0, 37, 42}: "Chengdu GeeYa Technology Co.,LTD", + [3]byte{0, 37, 43}: "Stirling Energy Systems", + [3]byte{0, 37, 44}: "Entourage Systems, Inc.", + [3]byte{0, 37, 45}: "Kiryung Electronics", + [3]byte{0, 37, 46}: "Cisco SPVTG", + [3]byte{0, 37, 47}: "Energy, Inc.", + [3]byte{0, 37, 48}: "Aetas Systems Inc.", + [3]byte{0, 37, 49}: "Cloud Engines, Inc.", + [3]byte{0, 37, 50}: "Digital Recorders", + [3]byte{0, 37, 51}: "WITTENSTEIN AG", + [3]byte{0, 37, 53}: "Minimax GmbH & Co KG", + [3]byte{0, 37, 54}: "Oki Electric Industry Co., Ltd.", + [3]byte{0, 37, 55}: "Runcom Technologies Ltd.", + [3]byte{0, 37, 56}: "Samsung Electronics Co., Ltd., Memory Division", + [3]byte{0, 37, 57}: "IfTA GmbH", + [3]byte{0, 37, 58}: "CEVA, Ltd.", + [3]byte{0, 37, 59}: "din Dietmar Nocker Facilitymanagement GmbH", + [3]byte{0, 37, 60}: "2Wire Inc", + [3]byte{0, 37, 61}: "DRS Consolidated Controls", + [3]byte{0, 37, 62}: "Sensus Metering Systems", + [3]byte{0, 37, 64}: "Quasar Technologies, Inc.", + [3]byte{0, 37, 65}: "Maquet Critical Care AB", + [3]byte{0, 37, 66}: "Pittasoft", + [3]byte{0, 37, 67}: "MONEYTECH", + [3]byte{0, 37, 68}: "LoJack Corporation", + [3]byte{0, 37, 69}: "Cisco Systems, Inc", + [3]byte{0, 37, 70}: "Cisco Systems, Inc", + [3]byte{0, 37, 71}: "Nokia Danmark A/S", + [3]byte{0, 37, 72}: "Nokia Danmark A/S", + [3]byte{0, 37, 73}: "Jeorich Tech. Co.,Ltd.", + [3]byte{0, 37, 74}: "RingCube Technologies, Inc.", + [3]byte{0, 37, 75}: "Apple, Inc.", + [3]byte{0, 37, 76}: "Videon Central, Inc.", + [3]byte{0, 37, 77}: "Singapore Technologies Electronics Limited", + [3]byte{0, 37, 78}: "Vertex Wireless Co., Ltd.", + [3]byte{0, 37, 79}: "ELETTROLAB Srl", + [3]byte{0, 37, 80}: "Riverbed Technology, Inc.", + [3]byte{0, 37, 81}: "SE-Elektronic GmbH", + [3]byte{0, 37, 82}: "VXi Corporation", + [3]byte{0, 37, 83}: "ADB Broadband Italia", + [3]byte{0, 37, 84}: "Pixel8 Networks", + [3]byte{0, 37, 85}: "Visonic Technologies 1993 Ltd.", + [3]byte{0, 37, 86}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{0, 37, 87}: "BlackBerry RTS", + [3]byte{0, 37, 88}: "MPEDIA", + [3]byte{0, 37, 89}: "Syphan Technologies Ltd", + [3]byte{0, 37, 90}: "Tantalus Systems Corp.", + [3]byte{0, 37, 91}: "CoachComm, LLC", + [3]byte{0, 37, 92}: "NEC Corporation", + [3]byte{0, 37, 93}: "Morningstar Corporation", + [3]byte{0, 37, 94}: "Shanghai Dare Technologies Co.,Ltd.", + [3]byte{0, 37, 95}: "SenTec AG", + [3]byte{0, 37, 96}: "Ibridge Networks & Communications Ltd.", + [3]byte{0, 37, 97}: "ProCurve Networking by HP", + [3]byte{0, 37, 98}: "interbro Co. Ltd.", + [3]byte{0, 37, 99}: "Luxtera Inc", + [3]byte{0, 37, 100}: "Dell Inc.", + [3]byte{0, 37, 101}: "Vizimax Inc.", + [3]byte{0, 37, 102}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 37, 103}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 37, 104}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{0, 37, 105}: "Sagemcom Broadband SAS", + [3]byte{0, 37, 106}: "inIT - Institut Industrial IT", + [3]byte{0, 37, 107}: "ATENIX E.E. s.r.l.", + [3]byte{0, 37, 108}: "Azimut Production Association JSC", + [3]byte{0, 37, 109}: "Broadband Forum", + [3]byte{0, 37, 110}: "Van Breda B.V.", + [3]byte{0, 37, 111}: "Dantherm Power", + [3]byte{0, 37, 112}: "Eastern Communications Company Limited", + [3]byte{0, 37, 113}: "Zhejiang Tianle Digital Electric Co.,Ltd", + [3]byte{0, 37, 114}: "Nemo-Q International AB", + [3]byte{0, 37, 115}: "ST Electronics (Info-Security) Pte Ltd", + [3]byte{0, 37, 116}: "KUNIMI MEDIA DEVICE Co., Ltd.", + [3]byte{0, 37, 117}: "FiberPlex Technologies, LLC", + [3]byte{0, 37, 118}: "NELI TECHNOLOGIES", + [3]byte{0, 37, 119}: "D-BOX Technologies", + [3]byte{0, 37, 120}: "JSC Concern Sozvezdie", + [3]byte{0, 37, 121}: "J & F Labs", + [3]byte{0, 37, 122}: "CAMCO Produktions- und Vertriebs-GmbH für Beschallungs- und Beleuchtungsanlagen", + [3]byte{0, 37, 123}: "STJ ELECTRONICS PVT LTD", + [3]byte{0, 37, 124}: "Huachentel Technology Development Co., Ltd", + [3]byte{0, 37, 125}: "PointRed Telecom Private Ltd.", + [3]byte{0, 37, 126}: "NEW POS Technology Limited", + [3]byte{0, 37, 127}: "CallTechSolution Co.,Ltd", + [3]byte{0, 37, 128}: "Equipson S.A.", + [3]byte{0, 37, 129}: "x-star networks Inc.", + [3]byte{0, 37, 130}: "Maksat Technologies (P) Ltd", + [3]byte{0, 37, 131}: "Cisco Systems, Inc", + [3]byte{0, 37, 132}: "Cisco Systems, Inc", + [3]byte{0, 37, 133}: "KOKUYO S&T Co., Ltd.", + [3]byte{0, 37, 134}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{0, 37, 135}: "Vitality, Inc.", + [3]byte{0, 37, 136}: "Genie Industries, Inc.", + [3]byte{0, 37, 137}: "Hills Industries Limited", + [3]byte{0, 37, 138}: "Pole/Zero Corporation", + [3]byte{0, 37, 139}: "Mellanox Technologies, Inc.", + [3]byte{0, 37, 140}: "ESUS ELEKTRONIK SAN. VE DIS. TIC. LTD. STI.", + [3]byte{0, 37, 141}: "Haier", + [3]byte{0, 37, 142}: "The Weather Channel", + [3]byte{0, 37, 143}: "Trident Microsystems, Inc.", + [3]byte{0, 37, 144}: "Super Micro Computer, Inc.", + [3]byte{0, 37, 145}: "NEXTEK, Inc.", + [3]byte{0, 37, 146}: "Guangzhou Shirui Electronic Co., Ltd", + [3]byte{0, 37, 147}: "DatNet Informatikai Kft.", + [3]byte{0, 37, 148}: "Eurodesign BG LTD", + [3]byte{0, 37, 149}: "Northwest Signal Supply, Inc", + [3]byte{0, 37, 150}: "GIGAVISION srl", + [3]byte{0, 37, 151}: "Kalki Communication Technologies", + [3]byte{0, 37, 152}: "Zhong Shan City Litai Electronic Industrial Co. Ltd", + [3]byte{0, 37, 153}: "Hedon e.d. B.V.", + [3]byte{0, 37, 154}: "CEStronics GmbH", + [3]byte{0, 37, 155}: "Beijing PKUNITY Microsystems Technology Co., Ltd", + [3]byte{0, 37, 156}: "Cisco-Linksys, LLC", + [3]byte{0, 37, 157}: "Private", + [3]byte{0, 37, 158}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{0, 37, 159}: "TechnoDigital Technologies GmbH", + [3]byte{0, 37, 160}: "Nintendo Co., Ltd.", + [3]byte{0, 37, 161}: "Enalasys", + [3]byte{0, 37, 162}: "Alta Definicion LINCEO S.L.", + [3]byte{0, 37, 163}: "Trimax Wireless, Inc.", + [3]byte{0, 37, 164}: "EuroDesign embedded technologies GmbH", + [3]byte{0, 37, 165}: "Walnut Media Network", + [3]byte{0, 37, 166}: "Central Network Solution Co., Ltd.", + [3]byte{0, 37, 167}: "Comverge, Inc.", + [3]byte{0, 37, 168}: "Kontron (BeiJing) Technology Co.,Ltd", + [3]byte{0, 37, 169}: "Shanghai Embedway Information Technologies Co.,Ltd", + [3]byte{0, 37, 170}: "Beijing Soul Technology Co.,Ltd.", + [3]byte{0, 37, 171}: "AIO LCD PC BU / TPV", + [3]byte{0, 37, 172}: "I-Tech corporation", + [3]byte{0, 37, 173}: "Manufacturing Resources International", + [3]byte{0, 37, 174}: "Microsoft Corporation", + [3]byte{0, 37, 175}: "COMFILE Technology", + [3]byte{0, 37, 176}: "Schmartz Inc", + [3]byte{0, 37, 177}: "Maya-Creation Corporation", + [3]byte{0, 37, 178}: "MBDA Deutschland GmbH", + [3]byte{0, 37, 179}: "Hewlett Packard", + [3]byte{0, 37, 180}: "Cisco Systems, Inc", + [3]byte{0, 37, 181}: "Cisco Systems, Inc", + [3]byte{0, 37, 182}: "Telecom FM", + [3]byte{0, 37, 183}: "Costar electronics, inc.,", + [3]byte{0, 37, 184}: "Agile Communications, Inc.", + [3]byte{0, 37, 185}: "Cypress Solutions Inc", + [3]byte{0, 37, 186}: "Alcatel-Lucent IPD", + [3]byte{0, 37, 187}: "INNERINT Co., Ltd.", + [3]byte{0, 37, 188}: "Apple, Inc.", + [3]byte{0, 37, 189}: "Italdata Ingegneria dell'Idea S.p.A.", + [3]byte{0, 37, 190}: "Tektrap Systems Inc.", + [3]byte{0, 37, 191}: "Wireless Cables Inc.", + [3]byte{0, 37, 192}: "ZillionTV Corporation", + [3]byte{0, 37, 193}: "Nawoo Korea Corp.", + [3]byte{0, 37, 194}: "RingBell Co.,Ltd.", + [3]byte{0, 37, 195}: "21168", + [3]byte{0, 37, 196}: "Ruckus Wireless", + [3]byte{0, 37, 197}: "Star Link Communication Pvt. Ltd.", + [3]byte{0, 37, 198}: "kasercorp, ltd", + [3]byte{0, 37, 199}: "altek Corporation", + [3]byte{0, 37, 200}: "S-Access GmbH", + [3]byte{0, 37, 201}: "SHENZHEN HUAPU DIGITAL CO., LTD", + [3]byte{0, 37, 202}: "LS Research, LLC", + [3]byte{0, 37, 203}: "Reiner SCT", + [3]byte{0, 37, 204}: "Mobile Communications Korea Incorporated", + [3]byte{0, 37, 205}: "Skylane Optics", + [3]byte{0, 37, 206}: "InnerSpace", + [3]byte{0, 37, 207}: "Nokia Danmark A/S", + [3]byte{0, 37, 208}: "Nokia Danmark A/S", + [3]byte{0, 37, 209}: "Eastern Asia Technology Limited", + [3]byte{0, 37, 210}: "InpegVision Co., Ltd", + [3]byte{0, 37, 211}: "AzureWave Technology Inc.", + [3]byte{0, 37, 212}: "General Dynamics Mission Systems", + [3]byte{0, 37, 213}: "Robonica (Pty) Ltd", + [3]byte{0, 37, 214}: "The Kroger Co.", + [3]byte{0, 37, 215}: "CEDO", + [3]byte{0, 37, 216}: "KOREA MAINTENANCE", + [3]byte{0, 37, 217}: "DataFab Systems Inc.", + [3]byte{0, 37, 218}: "Secura Key", + [3]byte{0, 37, 219}: "ATI Electronics(Shenzhen) Co., LTD", + [3]byte{0, 37, 220}: "Sumitomo Electric Industries,Ltd", + [3]byte{0, 37, 221}: "SUNNYTEK INFORMATION CO., LTD.", + [3]byte{0, 37, 222}: "Probits Co., LTD.", + [3]byte{0, 37, 223}: "Private", + [3]byte{0, 37, 224}: "CeedTec Sdn Bhd", + [3]byte{0, 37, 225}: "SHANGHAI SEEYOO ELECTRONIC & TECHNOLOGY CO., LTD", + [3]byte{0, 37, 226}: "Everspring Industry Co., Ltd.", + [3]byte{0, 37, 227}: "Hanshinit Inc.", + [3]byte{0, 37, 228}: "OMNI-WiFi, LLC", + [3]byte{0, 37, 229}: "LG Electronics (Mobile Communications)", + [3]byte{0, 37, 230}: "Belgian Monitoring Systems bvba", + [3]byte{0, 37, 231}: "Sony Mobile Communications AB", + [3]byte{0, 37, 232}: "Idaho Technology", + [3]byte{0, 37, 233}: "i-mate Development, Inc.", + [3]byte{0, 37, 234}: "Iphion BV", + [3]byte{0, 37, 235}: "Reutech Radar Systems (PTY) Ltd", + [3]byte{0, 37, 236}: "Humanware", + [3]byte{0, 37, 237}: "NuVo Technologies LLC", + [3]byte{0, 37, 238}: "Avtex Ltd", + [3]byte{0, 37, 239}: "I-TEC Co., Ltd.", + [3]byte{0, 37, 240}: "Suga Electronics Limited", + [3]byte{0, 37, 241}: "ARRIS Group, Inc.", + [3]byte{0, 37, 242}: "ARRIS Group, Inc.", + [3]byte{0, 37, 243}: "Nordwestdeutsche Zählerrevision", + [3]byte{0, 37, 244}: "KoCo Connector AG", + [3]byte{0, 37, 245}: "DVS Korea, Co., Ltd", + [3]byte{0, 37, 246}: "netTALK.com, Inc.", + [3]byte{0, 37, 247}: "Ansaldo STS USA", + [3]byte{0, 37, 249}: "GMK electronic design GmbH", + [3]byte{0, 37, 250}: "J&M Analytik AG", + [3]byte{0, 37, 251}: "Tunstall Healthcare A/S", + [3]byte{0, 37, 252}: "ENDA ENDUSTRIYEL ELEKTRONIK LTD. STI.", + [3]byte{0, 37, 253}: "OBR Centrum Techniki Morskiej S.A.", + [3]byte{0, 37, 254}: "Pilot Electronics Corporation", + [3]byte{0, 37, 255}: "CreNova Multimedia Co., Ltd", + [3]byte{0, 38, 0}: "TEAC Australia Pty Ltd.", + [3]byte{0, 38, 1}: "Cutera Inc", + [3]byte{0, 38, 2}: "SMART Temps LLC", + [3]byte{0, 38, 3}: "Shenzhen Wistar Technology Co., Ltd", + [3]byte{0, 38, 4}: "Audio Processing Technology Ltd", + [3]byte{0, 38, 5}: "CC Systems AB", + [3]byte{0, 38, 6}: "RAUMFELD GmbH", + [3]byte{0, 38, 7}: "Enabling Technology Pty Ltd", + [3]byte{0, 38, 8}: "Apple, Inc.", + [3]byte{0, 38, 9}: "Phyllis Co., Ltd.", + [3]byte{0, 38, 10}: "Cisco Systems, Inc", + [3]byte{0, 38, 11}: "Cisco Systems, Inc", + [3]byte{0, 38, 12}: "Dataram", + [3]byte{0, 38, 13}: "Mercury Systems, Inc.", + [3]byte{0, 38, 14}: "Ablaze Systems, LLC", + [3]byte{0, 38, 15}: "Linn Products Ltd", + [3]byte{0, 38, 16}: "Apacewave Technologies", + [3]byte{0, 38, 17}: "Licera AB", + [3]byte{0, 38, 18}: "Space Exploration Technologies", + [3]byte{0, 38, 19}: "Engel Axil S.L.", + [3]byte{0, 38, 20}: "KTNF", + [3]byte{0, 38, 21}: "Teracom Limited", + [3]byte{0, 38, 22}: "Rosemount Inc.", + [3]byte{0, 38, 23}: "OEM Worldwide", + [3]byte{0, 38, 24}: "ASUSTek COMPUTER INC.", + [3]byte{0, 38, 25}: "FRC", + [3]byte{0, 38, 26}: "Femtocomm System Technology Corp.", + [3]byte{0, 38, 27}: "LAUREL BANK MACHINES CO., LTD.", + [3]byte{0, 38, 28}: "NEOVIA INC.", + [3]byte{0, 38, 29}: "COP SECURITY SYSTEM CORP.", + [3]byte{0, 38, 30}: "QINGBANG ELEC(SZ) CO., LTD", + [3]byte{0, 38, 31}: "SAE Magnetics (H.K.) Ltd.", + [3]byte{0, 38, 32}: "ISGUS GmbH", + [3]byte{0, 38, 33}: "InteliCloud Technology Inc.", + [3]byte{0, 38, 34}: "COMPAL INFORMATION (KUNSHAN) CO., LTD.", + [3]byte{0, 38, 35}: "JRD Communication Inc", + [3]byte{0, 38, 36}: "Thomson Inc.", + [3]byte{0, 38, 37}: "MediaSputnik", + [3]byte{0, 38, 38}: "Geophysical Survey Systems, Inc.", + [3]byte{0, 38, 39}: "Truesell", + [3]byte{0, 38, 40}: "companytec automação e controle ltda.", + [3]byte{0, 38, 41}: "Juphoon System Software Inc.", + [3]byte{0, 38, 42}: "Proxense, LLC", + [3]byte{0, 38, 43}: "Wongs Electronics Co. Ltd.", + [3]byte{0, 38, 44}: "IKT Advanced Technologies s.r.o.", + [3]byte{0, 38, 45}: "Wistron Corporation", + [3]byte{0, 38, 46}: "Chengdu Jiuzhou Electronic Technology Inc", + [3]byte{0, 38, 47}: "HAMAMATSU TOA ELECTRONICS", + [3]byte{0, 38, 48}: "ACOREL S.A.S", + [3]byte{0, 38, 49}: "COMMTACT LTD", + [3]byte{0, 38, 50}: "Instrumentation Technologies d.d.", + [3]byte{0, 38, 51}: "MIR - Medical International Research", + [3]byte{0, 38, 52}: "Infineta Systems, Inc", + [3]byte{0, 38, 53}: "Bluetechnix GmbH", + [3]byte{0, 38, 54}: "ARRIS Group, Inc.", + [3]byte{0, 38, 55}: "SAMSUNG ELECTRO MECHANICS CO., LTD.", + [3]byte{0, 38, 56}: "Xia Men Joyatech Co., Ltd.", + [3]byte{0, 38, 57}: "T.M. Electronics, Inc.", + [3]byte{0, 38, 58}: "Digitec Systems", + [3]byte{0, 38, 59}: "Onbnetech", + [3]byte{0, 38, 60}: "Bachmann Technology GmbH & Co. KG", + [3]byte{0, 38, 61}: "MIA Corporation", + [3]byte{0, 38, 62}: "Trapeze Networks", + [3]byte{0, 38, 63}: "LIOS Technology GmbH", + [3]byte{0, 38, 64}: "Baustem Broadband Technologies, Ltd.", + [3]byte{0, 38, 65}: "ARRIS Group, Inc.", + [3]byte{0, 38, 66}: "ARRIS Group, Inc.", + [3]byte{0, 38, 67}: "ALPS ELECTRIC CO.,LTD.", + [3]byte{0, 38, 68}: "Thomson Telecom Belgium", + [3]byte{0, 38, 69}: "Circontrol S.A.", + [3]byte{0, 38, 70}: "SHENYANG TONGFANG MULTIMEDIA TECHNOLOGY COMPANY LIMITED", + [3]byte{0, 38, 71}: "WFE TECHNOLOGY CORP.", + [3]byte{0, 38, 72}: "Emitech Corp.", + [3]byte{0, 38, 74}: "Apple, Inc.", + [3]byte{0, 38, 76}: "Shanghai DigiVision Technology Co., Ltd.", + [3]byte{0, 38, 77}: "Arcadyan Technology Corporation", + [3]byte{0, 38, 78}: "Rail & Road Protec GmbH", + [3]byte{0, 38, 79}: "Krüger &Gothe GmbH", + [3]byte{0, 38, 80}: "2Wire Inc", + [3]byte{0, 38, 81}: "Cisco Systems, Inc", + [3]byte{0, 38, 82}: "Cisco Systems, Inc", + [3]byte{0, 38, 83}: "DaySequerra Corporation", + [3]byte{0, 38, 84}: "3Com Corporation", + [3]byte{0, 38, 85}: "Hewlett Packard", + [3]byte{0, 38, 86}: "Sansonic Electronics USA", + [3]byte{0, 38, 87}: "OOO NPP EKRA", + [3]byte{0, 38, 88}: "T-Platforms (Cyprus) Limited", + [3]byte{0, 38, 89}: "Nintendo Co., Ltd.", + [3]byte{0, 38, 90}: "D-Link Corporation", + [3]byte{0, 38, 91}: "Hitron Technologies. Inc", + [3]byte{0, 38, 92}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{0, 38, 93}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 38, 94}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{0, 38, 95}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 38, 96}: "Logiways", + [3]byte{0, 38, 97}: "Irumtek Co., Ltd.", + [3]byte{0, 38, 98}: "Actiontec Electronics, Inc", + [3]byte{0, 38, 99}: "Shenzhen Huitaiwei Tech. Ltd, co.", + [3]byte{0, 38, 100}: "Core System Japan", + [3]byte{0, 38, 101}: "ProtectedLogic Corporation", + [3]byte{0, 38, 102}: "EFM Networks", + [3]byte{0, 38, 103}: "CARECOM CO.,LTD.", + [3]byte{0, 38, 104}: "Nokia Danmark A/S", + [3]byte{0, 38, 105}: "Nokia Danmark A/S", + [3]byte{0, 38, 106}: "ESSENSIUM NV", + [3]byte{0, 38, 107}: "SHINE UNION ENTERPRISE LIMITED", + [3]byte{0, 38, 108}: "INVENTEC Corporation", + [3]byte{0, 38, 109}: "MobileAccess Networks", + [3]byte{0, 38, 110}: "Nissho-denki Co.,LTD.", + [3]byte{0, 38, 111}: "Coordiwise Technology Corp.", + [3]byte{0, 38, 112}: "Cinch Connectors", + [3]byte{0, 38, 113}: "AUTOVISION Co., Ltd", + [3]byte{0, 38, 114}: "AAMP of America", + [3]byte{0, 38, 115}: "RICOH COMPANY,LTD.", + [3]byte{0, 38, 116}: "Electronic Solutions, Inc.", + [3]byte{0, 38, 117}: "Aztech Electronics Pte Ltd", + [3]byte{0, 38, 118}: "COMMidt AS", + [3]byte{0, 38, 119}: "DEIF A/S", + [3]byte{0, 38, 120}: "Logic Instrument SA", + [3]byte{0, 38, 121}: "Euphonic Technologies, Inc.", + [3]byte{0, 38, 122}: "wuhan hongxin telecommunication technologies co.,ltd", + [3]byte{0, 38, 123}: "GSI Helmholtzzentrum für Schwerionenforschung GmbH", + [3]byte{0, 38, 124}: "Metz-Werke GmbH & Co KG", + [3]byte{0, 38, 125}: "A-Max Technology Macao Commercial Offshore Company Limited", + [3]byte{0, 38, 126}: "PARROT SA", + [3]byte{0, 38, 127}: "Zenterio AB", + [3]byte{0, 38, 128}: "SIL3 Pty.Ltd", + [3]byte{0, 38, 129}: "Interspiro AB", + [3]byte{0, 38, 130}: "Gemtek Technology Co., Ltd.", + [3]byte{0, 38, 131}: "Ajoho Enterprise Co., Ltd.", + [3]byte{0, 38, 132}: "KISAN SYSTEM", + [3]byte{0, 38, 133}: "Digital Innovation", + [3]byte{0, 38, 134}: "Quantenna Communcations, Inc.", + [3]byte{0, 38, 135}: "corega K.K", + [3]byte{0, 38, 136}: "Juniper Networks", + [3]byte{0, 38, 137}: "General Dynamics Robotic Systems", + [3]byte{0, 38, 138}: "Terrier SC Ltd", + [3]byte{0, 38, 139}: "Guangzhou Escene Computer Technology Limited", + [3]byte{0, 38, 140}: "StarLeaf Ltd.", + [3]byte{0, 38, 141}: "CellTel S.p.A.", + [3]byte{0, 38, 142}: "Alta Solutions, Inc.", + [3]byte{0, 38, 143}: "MTA SpA", + [3]byte{0, 38, 144}: "I DO IT", + [3]byte{0, 38, 145}: "Sagemcom Broadband SAS", + [3]byte{0, 38, 146}: "Mitsubishi Electric Corporation", + [3]byte{0, 38, 147}: "QVidium Technologies, Inc.", + [3]byte{0, 38, 148}: "Senscient Ltd", + [3]byte{0, 38, 149}: "ZT Group Int'l Inc", + [3]byte{0, 38, 150}: "NOOLIX Co., Ltd", + [3]byte{0, 38, 151}: "Alpha Technologies Inc.", + [3]byte{0, 38, 152}: "Cisco Systems, Inc", + [3]byte{0, 38, 153}: "Cisco Systems, Inc", + [3]byte{0, 38, 154}: "Carina System Co., Ltd.", + [3]byte{0, 38, 155}: "SOKRAT Ltd.", + [3]byte{0, 38, 156}: "ITUS JAPAN CO. LTD", + [3]byte{0, 38, 157}: "M2Mnet Co., Ltd.", + [3]byte{0, 38, 158}: "QUANTA COMPUTER INC.", + [3]byte{0, 38, 159}: "Private", + [3]byte{0, 38, 160}: "moblic", + [3]byte{0, 38, 161}: "Megger", + [3]byte{0, 38, 162}: "Instrumentation Technology Systems", + [3]byte{0, 38, 163}: "FQ Ingenieria Electronica S.A.", + [3]byte{0, 38, 164}: "Novus Produtos Eletronicos Ltda", + [3]byte{0, 38, 165}: "MICROROBOT.CO.,LTD", + [3]byte{0, 38, 166}: "TRIXELL", + [3]byte{0, 38, 167}: "CONNECT SRL", + [3]byte{0, 38, 168}: "DAEHAP HYPER-TECH", + [3]byte{0, 38, 169}: "Strong Technologies Pty Ltd", + [3]byte{0, 38, 170}: "Kenmec Mechanical Engineering Co., Ltd.", + [3]byte{0, 38, 171}: "Seiko Epson Corporation", + [3]byte{0, 38, 172}: "Shanghai LUSTER Teraband photonic Co., Ltd.", + [3]byte{0, 38, 173}: "Arada Systems, Inc.", + [3]byte{0, 38, 174}: "Wireless Measurement Ltd", + [3]byte{0, 38, 175}: "Duelco A/S", + [3]byte{0, 38, 176}: "Apple, Inc.", + [3]byte{0, 38, 177}: "Navis Auto Motive Systems, Inc.", + [3]byte{0, 38, 178}: "Setrix GmbH", + [3]byte{0, 38, 179}: "Thales Communications Inc", + [3]byte{0, 38, 180}: "Ford Motor Company", + [3]byte{0, 38, 181}: "ICOMM Tele Ltd", + [3]byte{0, 38, 182}: "ASKEY COMPUTER CORP", + [3]byte{0, 38, 183}: "Kingston Technology Company, Inc.", + [3]byte{0, 38, 184}: "Actiontec Electronics, Inc", + [3]byte{0, 38, 185}: "Dell Inc.", + [3]byte{0, 38, 186}: "ARRIS Group, Inc.", + [3]byte{0, 38, 187}: "Apple, Inc.", + [3]byte{0, 38, 188}: "General Jack Technology Ltd.", + [3]byte{0, 38, 189}: "JTEC Card & Communication Co., Ltd.", + [3]byte{0, 38, 190}: "Schoonderbeek Elektronica Systemen B.V.", + [3]byte{0, 38, 191}: "ShenZhen Temobi Science&Tech Development Co.,Ltd", + [3]byte{0, 38, 192}: "EnergyHub", + [3]byte{0, 38, 193}: "ARTRAY CO., LTD.", + [3]byte{0, 38, 194}: "SCDI Co. LTD", + [3]byte{0, 38, 195}: "Insightek Corp.", + [3]byte{0, 38, 196}: "Cadmos microsystems S.r.l.", + [3]byte{0, 38, 197}: "Guangdong Gosun Telecommunications Co.,Ltd", + [3]byte{0, 38, 198}: "Intel Corporate", + [3]byte{0, 38, 199}: "Intel Corporate", + [3]byte{0, 38, 200}: "System Sensor", + [3]byte{0, 38, 201}: "Proventix Systems, Inc.", + [3]byte{0, 38, 202}: "Cisco Systems, Inc", + [3]byte{0, 38, 203}: "Cisco Systems, Inc", + [3]byte{0, 38, 204}: "Nokia Danmark A/S", + [3]byte{0, 38, 205}: "PurpleComm, Inc.", + [3]byte{0, 38, 206}: "Kozumi USA Corp.", + [3]byte{0, 38, 207}: "DEKA R&D", + [3]byte{0, 38, 208}: "Semihalf", + [3]byte{0, 38, 209}: "S Squared Innovations Inc.", + [3]byte{0, 38, 210}: "Pcube Systems, Inc.", + [3]byte{0, 38, 211}: "Zeno Information System", + [3]byte{0, 38, 212}: "IRCA SpA", + [3]byte{0, 38, 213}: "Ory Solucoes em Comercio de Informatica Ltda.", + [3]byte{0, 38, 214}: "Ningbo Andy Optoelectronic Co., Ltd.", + [3]byte{0, 38, 215}: "KM Electornic Technology Co., Ltd.", + [3]byte{0, 38, 216}: "Magic Point Inc.", + [3]byte{0, 38, 217}: "ARRIS Group, Inc.", + [3]byte{0, 38, 218}: "Universal Media Corporation /Slovakia/ s.r.o.", + [3]byte{0, 38, 219}: "Ionics EMS Inc.", + [3]byte{0, 38, 220}: "Optical Systems Design", + [3]byte{0, 38, 221}: "Fival Science & Technology Co.,Ltd.", + [3]byte{0, 38, 222}: "FDI MATELEC", + [3]byte{0, 38, 223}: "TaiDoc Technology Corp.", + [3]byte{0, 38, 224}: "ASITEQ", + [3]byte{0, 38, 225}: "Stanford University, OpenFlow Group", + [3]byte{0, 38, 226}: "LG Electronics (Mobile Communications)", + [3]byte{0, 38, 227}: "DTI", + [3]byte{0, 38, 228}: "Canal +", + [3]byte{0, 38, 229}: "AEG Power Solutions", + [3]byte{0, 38, 230}: "Visionhitech Co., Ltd.", + [3]byte{0, 38, 231}: "Shanghai ONLAN Communication Tech. Co., Ltd.", + [3]byte{0, 38, 232}: "Murata Manufacturing Co., Ltd.", + [3]byte{0, 38, 233}: "SP Corp", + [3]byte{0, 38, 234}: "Cheerchip Electronic Technology (ShangHai) Co., Ltd.", + [3]byte{0, 38, 235}: "Advanced Spectrum Technology Co., Ltd.", + [3]byte{0, 38, 236}: "Legrand Home Systems, Inc", + [3]byte{0, 38, 237}: "zte corporation", + [3]byte{0, 38, 238}: "TKM GmbH", + [3]byte{0, 38, 239}: "Technology Advancement Group, Inc.", + [3]byte{0, 38, 240}: "cTrixs International GmbH.", + [3]byte{0, 38, 241}: "ProCurve Networking by HP", + [3]byte{0, 38, 242}: "NETGEAR", + [3]byte{0, 38, 243}: "SMC Networks", + [3]byte{0, 38, 244}: "Nesslab", + [3]byte{0, 38, 245}: "XRPLUS Inc.", + [3]byte{0, 38, 246}: "Military Communication Institute", + [3]byte{0, 38, 247}: "Nivetti Systems Pvt. Ltd.", + [3]byte{0, 38, 248}: "Golden Highway Industry Development Co., Ltd.", + [3]byte{0, 38, 249}: "S.E.M. srl", + [3]byte{0, 38, 250}: "BandRich Inc.", + [3]byte{0, 38, 251}: "AirDio Wireless, Inc.", + [3]byte{0, 38, 252}: "AcSiP Technology Corp.", + [3]byte{0, 38, 253}: "Interactive Intelligence", + [3]byte{0, 38, 254}: "MKD Technology Inc.", + [3]byte{0, 38, 255}: "BlackBerry RTS", + [3]byte{0, 39, 0}: "Shenzhen Siglent Technology Co., Ltd.", + [3]byte{0, 39, 1}: "INCOstartec GmbH", + [3]byte{0, 39, 2}: "SolarEdge Technologies", + [3]byte{0, 39, 3}: "Testech Electronics Pte Ltd", + [3]byte{0, 39, 4}: "Accelerated Concepts, Inc", + [3]byte{0, 39, 5}: "Sectronic", + [3]byte{0, 39, 6}: "YOISYS", + [3]byte{0, 39, 7}: "Lift Complex DS, JSC", + [3]byte{0, 39, 8}: "Nordiag ASA", + [3]byte{0, 39, 9}: "Nintendo Co., Ltd.", + [3]byte{0, 39, 10}: "IEE S.A.", + [3]byte{0, 39, 11}: "Adura Technologies", + [3]byte{0, 39, 12}: "Cisco Systems, Inc", + [3]byte{0, 39, 13}: "Cisco Systems, Inc", + [3]byte{0, 39, 14}: "Intel Corporate", + [3]byte{0, 39, 15}: "Envisionnovation Inc", + [3]byte{0, 39, 16}: "Intel Corporate", + [3]byte{0, 39, 17}: "LanPro Inc", + [3]byte{0, 39, 18}: "MaxVision LLC", + [3]byte{0, 39, 19}: "Universal Global Scientific Industrial Co., Ltd.", + [3]byte{0, 39, 20}: "Grainmustards, Co,ltd.", + [3]byte{0, 39, 21}: "Rebound Telecom. Co., Ltd", + [3]byte{0, 39, 22}: "Adachi-Syokai Co., Ltd.", + [3]byte{0, 39, 23}: "CE Digital(Zhenjiang)Co.,Ltd", + [3]byte{0, 39, 24}: "Suzhou NEW SEAUNION Video Technology Co.,Ltd", + [3]byte{0, 39, 25}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{0, 39, 26}: "Geenovo Technology Ltd.", + [3]byte{0, 39, 27}: "Alec Sicherheitssysteme GmbH", + [3]byte{0, 39, 28}: "MERCURY CORPORATION", + [3]byte{0, 39, 29}: "Comba Telecom Systems (China) Ltd.", + [3]byte{0, 39, 30}: "Xagyl Communications", + [3]byte{0, 39, 31}: "MIPRO Electronics Co., Ltd", + [3]byte{0, 39, 32}: "NEW-SOL COM", + [3]byte{0, 39, 33}: "Shenzhen Baoan Fenda Industrial Co., Ltd", + [3]byte{0, 39, 34}: "Ubiquiti Networks Inc.", + [3]byte{0, 39, 144}: "Cisco Systems, Inc", + [3]byte{0, 39, 227}: "Cisco Systems, Inc", + [3]byte{0, 39, 248}: "Brocade Communications Systems, Inc.", + [3]byte{0, 40, 159}: "Semptian Co., Ltd.", + [3]byte{0, 40, 248}: "Intel Corporate", + [3]byte{0, 41, 38}: "Applied Optoelectronics, Inc Taiwan Branch", + [3]byte{0, 42, 16}: "Cisco Systems, Inc", + [3]byte{0, 42, 106}: "Cisco Systems, Inc", + [3]byte{0, 42, 175}: "LARsys-Automation GmbH", + [3]byte{0, 44, 200}: "Cisco Systems, Inc", + [3]byte{0, 45, 118}: "TITECH GmbH", + [3]byte{0, 46, 199}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{0, 48, 0}: "ALLWELL TECHNOLOGY CORP.", + [3]byte{0, 48, 1}: "SMP", + [3]byte{0, 48, 2}: "Expand Networks", + [3]byte{0, 48, 3}: "Phasys Ltd.", + [3]byte{0, 48, 4}: "LEADTEK RESEARCH INC.", + [3]byte{0, 48, 5}: "Fujitsu Siemens Computers", + [3]byte{0, 48, 6}: "SUPERPOWER COMPUTER", + [3]byte{0, 48, 7}: "OPTI, INC.", + [3]byte{0, 48, 8}: "AVIO DIGITAL, INC.", + [3]byte{0, 48, 9}: "Tachion Networks, Inc.", + [3]byte{0, 48, 10}: "Aztech Electronics Pte Ltd", + [3]byte{0, 48, 11}: "mPHASE Technologies, Inc.", + [3]byte{0, 48, 12}: "CONGRUENCY, LTD.", + [3]byte{0, 48, 13}: "MMC Technology, Inc.", + [3]byte{0, 48, 14}: "Klotz Digital AG", + [3]byte{0, 48, 15}: "IMT - Information Management T", + [3]byte{0, 48, 16}: "VISIONETICS INTERNATIONAL", + [3]byte{0, 48, 17}: "HMS Industrial Networks", + [3]byte{0, 48, 18}: "DIGITAL ENGINEERING LTD.", + [3]byte{0, 48, 19}: "NEC Corporation", + [3]byte{0, 48, 20}: "DIVIO, INC.", + [3]byte{0, 48, 21}: "CP CLARE CORP.", + [3]byte{0, 48, 22}: "ISHIDA CO., LTD.", + [3]byte{0, 48, 23}: "BlueArc UK Ltd", + [3]byte{0, 48, 24}: "Jetway Information Co., Ltd.", + [3]byte{0, 48, 25}: "Cisco Systems, Inc", + [3]byte{0, 48, 26}: "SMARTBRIDGES PTE. LTD.", + [3]byte{0, 48, 27}: "SHUTTLE, INC.", + [3]byte{0, 48, 28}: "ALTVATER AIRDATA SYSTEMS", + [3]byte{0, 48, 29}: "SKYSTREAM, INC.", + [3]byte{0, 48, 30}: "3COM EUROPE LTD.", + [3]byte{0, 48, 31}: "OPTICAL NETWORKS, INC.", + [3]byte{0, 48, 32}: "TSI, Inc..", + [3]byte{0, 48, 33}: "HSING TECH. ENTERPRISE CO.,LTD", + [3]byte{0, 48, 34}: "Fong Kai Industrial Co., Ltd.", + [3]byte{0, 48, 35}: "COGENT COMPUTER SYSTEMS, INC.", + [3]byte{0, 48, 36}: "Cisco Systems, Inc", + [3]byte{0, 48, 37}: "CHECKOUT COMPUTER SYSTEMS, LTD", + [3]byte{0, 48, 38}: "HeiTel Digital Video GmbH", + [3]byte{0, 48, 39}: "KERBANGO, INC.", + [3]byte{0, 48, 40}: "FASE Saldatura srl", + [3]byte{0, 48, 41}: "OPICOM", + [3]byte{0, 48, 42}: "SOUTHERN INFORMATION", + [3]byte{0, 48, 43}: "INALP NETWORKS, INC.", + [3]byte{0, 48, 44}: "SYLANTRO SYSTEMS CORPORATION", + [3]byte{0, 48, 45}: "QUANTUM BRIDGE COMMUNICATIONS", + [3]byte{0, 48, 46}: "Hoft & Wessel AG", + [3]byte{0, 48, 47}: "GE Aviation System", + [3]byte{0, 48, 48}: "HARMONIX CORPORATION", + [3]byte{0, 48, 49}: "LIGHTWAVE COMMUNICATIONS, INC.", + [3]byte{0, 48, 50}: "MagicRam, Inc.", + [3]byte{0, 48, 51}: "ORIENT TELECOM CO., LTD.", + [3]byte{0, 48, 52}: "SET ENGINEERING", + [3]byte{0, 48, 53}: "Corning Incorporated", + [3]byte{0, 48, 54}: "RMP ELEKTRONIKSYSTEME GMBH", + [3]byte{0, 48, 55}: "Packard Bell Nec Services", + [3]byte{0, 48, 56}: "XCP, INC.", + [3]byte{0, 48, 57}: "SOFTBOOK PRESS", + [3]byte{0, 48, 58}: "MAATEL", + [3]byte{0, 48, 59}: "PowerCom Technology", + [3]byte{0, 48, 60}: "ONNTO CORP.", + [3]byte{0, 48, 61}: "IVA CORPORATION", + [3]byte{0, 48, 62}: "Radcom Ltd.", + [3]byte{0, 48, 63}: "TurboComm Tech Inc.", + [3]byte{0, 48, 64}: "Cisco Systems, Inc", + [3]byte{0, 48, 65}: "SAEJIN T & M CO., LTD.", + [3]byte{0, 48, 66}: "DeTeWe-Deutsche Telephonwerke", + [3]byte{0, 48, 67}: "IDREAM TECHNOLOGIES, PTE. LTD.", + [3]byte{0, 48, 68}: "CradlePoint, Inc", + [3]byte{0, 48, 69}: "Village Networks, Inc. (VNI)", + [3]byte{0, 48, 70}: "Controlled Electronic Manageme", + [3]byte{0, 48, 71}: "NISSEI ELECTRIC CO., LTD.", + [3]byte{0, 48, 72}: "Super Micro Computer, Inc.", + [3]byte{0, 48, 73}: "BRYANT TECHNOLOGY, LTD.", + [3]byte{0, 48, 74}: "Fraunhofer IPMS", + [3]byte{0, 48, 75}: "ORBACOM SYSTEMS, INC.", + [3]byte{0, 48, 76}: "APPIAN COMMUNICATIONS, INC.", + [3]byte{0, 48, 77}: "ESI", + [3]byte{0, 48, 78}: "BUSTEC PRODUCTION LTD.", + [3]byte{0, 48, 79}: "PLANET Technology Corporation", + [3]byte{0, 48, 80}: "Versa Technology", + [3]byte{0, 48, 81}: "ORBIT AVIONIC & COMMUNICATION", + [3]byte{0, 48, 82}: "ELASTIC NETWORKS", + [3]byte{0, 48, 83}: "Basler AG", + [3]byte{0, 48, 84}: "CASTLENET TECHNOLOGY, INC.", + [3]byte{0, 48, 85}: "Renesas Technology America, Inc.", + [3]byte{0, 48, 86}: "Beck IPC GmbH", + [3]byte{0, 48, 87}: "QTelNet, Inc.", + [3]byte{0, 48, 88}: "API MOTION", + [3]byte{0, 48, 89}: "KONTRON COMPACT COMPUTERS AG", + [3]byte{0, 48, 90}: "TELGEN CORPORATION", + [3]byte{0, 48, 91}: "Toko Inc.", + [3]byte{0, 48, 92}: "SMAR Laboratories Corp.", + [3]byte{0, 48, 93}: "DIGITRA SYSTEMS, INC.", + [3]byte{0, 48, 94}: "Abelko Innovation", + [3]byte{0, 48, 95}: "Hasselblad", + [3]byte{0, 48, 96}: "Powerfile, Inc.", + [3]byte{0, 48, 97}: "MobyTEL", + [3]byte{0, 48, 98}: "IP Video Networks Inc", + [3]byte{0, 48, 99}: "SANTERA SYSTEMS, INC.", + [3]byte{0, 48, 100}: "ADLINK TECHNOLOGY, INC.", + [3]byte{0, 48, 101}: "Apple, Inc.", + [3]byte{0, 48, 102}: "RFM", + [3]byte{0, 48, 103}: "BIOSTAR Microtech Int'l Corp.", + [3]byte{0, 48, 104}: "CYBERNETICS TECH. CO., LTD.", + [3]byte{0, 48, 105}: "IMPACCT TECHNOLOGY CORP.", + [3]byte{0, 48, 106}: "PENTA MEDIA CO., LTD.", + [3]byte{0, 48, 107}: "CMOS SYSTEMS, INC.", + [3]byte{0, 48, 108}: "Hitex Holding GmbH", + [3]byte{0, 48, 109}: "LUCENT TECHNOLOGIES", + [3]byte{0, 48, 110}: "Hewlett Packard", + [3]byte{0, 48, 111}: "SEYEON TECH. CO., LTD.", + [3]byte{0, 48, 112}: "1Net Corporation", + [3]byte{0, 48, 113}: "Cisco Systems, Inc", + [3]byte{0, 48, 114}: "Intellibyte Inc.", + [3]byte{0, 48, 115}: "International Microsystems, In", + [3]byte{0, 48, 116}: "EQUIINET LTD.", + [3]byte{0, 48, 117}: "ADTECH", + [3]byte{0, 48, 118}: "Akamba Corporation", + [3]byte{0, 48, 119}: "ONPREM NETWORKS", + [3]byte{0, 48, 120}: "Cisco Systems, Inc", + [3]byte{0, 48, 121}: "CQOS, INC.", + [3]byte{0, 48, 122}: "Advanced Technology & Systems", + [3]byte{0, 48, 123}: "Cisco Systems, Inc", + [3]byte{0, 48, 124}: "ADID SA", + [3]byte{0, 48, 125}: "GRE AMERICA, INC.", + [3]byte{0, 48, 126}: "Redflex Communication Systems", + [3]byte{0, 48, 127}: "IRLAN LTD.", + [3]byte{0, 48, 128}: "Cisco Systems, Inc", + [3]byte{0, 48, 129}: "ALTOS C&C", + [3]byte{0, 48, 130}: "TAIHAN ELECTRIC WIRE CO., LTD.", + [3]byte{0, 48, 131}: "Ivron Systems", + [3]byte{0, 48, 132}: "ALLIED TELESYN INTERNAIONAL", + [3]byte{0, 48, 133}: "Cisco Systems, Inc", + [3]byte{0, 48, 134}: "Transistor Devices, Inc.", + [3]byte{0, 48, 135}: "VEGA GRIESHABER KG", + [3]byte{0, 48, 136}: "Ericsson", + [3]byte{0, 48, 137}: "Spectrapoint Wireless, LLC", + [3]byte{0, 48, 138}: "NICOTRA SISTEMI S.P.A", + [3]byte{0, 48, 139}: "Brix Networks", + [3]byte{0, 48, 140}: "Quantum Corporation", + [3]byte{0, 48, 141}: "Pinnacle Systems, Inc.", + [3]byte{0, 48, 142}: "CROSS MATCH TECHNOLOGIES, INC.", + [3]byte{0, 48, 143}: "MICRILOR, Inc.", + [3]byte{0, 48, 144}: "CYRA TECHNOLOGIES, INC.", + [3]byte{0, 48, 145}: "TAIWAN FIRST LINE ELEC. CORP.", + [3]byte{0, 48, 146}: "ModuNORM GmbH", + [3]byte{0, 48, 147}: "Sonnet Technologies, Inc", + [3]byte{0, 48, 148}: "Cisco Systems, Inc", + [3]byte{0, 48, 149}: "Procomp Informatics, Ltd.", + [3]byte{0, 48, 150}: "Cisco Systems, Inc", + [3]byte{0, 48, 151}: "AB Regin", + [3]byte{0, 48, 152}: "Global Converging Technologies", + [3]byte{0, 48, 153}: "BOENIG UND KALLENBACH OHG", + [3]byte{0, 48, 154}: "ASTRO TERRA CORP.", + [3]byte{0, 48, 155}: "Smartware", + [3]byte{0, 48, 156}: "Timing Applications, Inc.", + [3]byte{0, 48, 157}: "Nimble Microsystems, Inc.", + [3]byte{0, 48, 158}: "WORKBIT CORPORATION.", + [3]byte{0, 48, 159}: "AMBER NETWORKS", + [3]byte{0, 48, 160}: "TYCO SUBMARINE SYSTEMS, LTD.", + [3]byte{0, 48, 161}: "WEBGATE Inc.", + [3]byte{0, 48, 162}: "Lightner Engineering", + [3]byte{0, 48, 163}: "Cisco Systems, Inc", + [3]byte{0, 48, 164}: "Woodwind Communications System", + [3]byte{0, 48, 165}: "ACTIVE POWER", + [3]byte{0, 48, 166}: "VIANET TECHNOLOGIES, LTD.", + [3]byte{0, 48, 167}: "SCHWEITZER ENGINEERING", + [3]byte{0, 48, 168}: "OL'E COMMUNICATIONS, INC.", + [3]byte{0, 48, 169}: "Netiverse, Inc.", + [3]byte{0, 48, 170}: "AXUS MICROSYSTEMS, INC.", + [3]byte{0, 48, 171}: "DELTA NETWORKS, INC.", + [3]byte{0, 48, 172}: "Systeme Lauer GmbH & Co., Ltd.", + [3]byte{0, 48, 173}: "SHANGHAI COMMUNICATION", + [3]byte{0, 48, 174}: "Times N System, Inc.", + [3]byte{0, 48, 175}: "Honeywell GmbH", + [3]byte{0, 48, 176}: "Convergenet Technologies", + [3]byte{0, 48, 177}: "TrunkNet", + [3]byte{0, 48, 178}: "L-3 Sonoma EO", + [3]byte{0, 48, 179}: "San Valley Systems, Inc.", + [3]byte{0, 48, 180}: "INTERSIL CORP.", + [3]byte{0, 48, 181}: "Tadiran Microwave Networks", + [3]byte{0, 48, 182}: "Cisco Systems, Inc", + [3]byte{0, 48, 183}: "Teletrol Systems, Inc.", + [3]byte{0, 48, 184}: "RiverDelta Networks", + [3]byte{0, 48, 185}: "ECTEL", + [3]byte{0, 48, 186}: "AC&T SYSTEM CO., LTD.", + [3]byte{0, 48, 187}: "CacheFlow, Inc.", + [3]byte{0, 48, 188}: "Optronic AG", + [3]byte{0, 48, 189}: "BELKIN COMPONENTS", + [3]byte{0, 48, 190}: "City-Net Technology, Inc.", + [3]byte{0, 48, 191}: "MULTIDATA GMBH", + [3]byte{0, 48, 192}: "Lara Technology, Inc.", + [3]byte{0, 48, 193}: "Hewlett Packard", + [3]byte{0, 48, 194}: "COMONE", + [3]byte{0, 48, 195}: "FLUECKIGER ELEKTRONIK AG", + [3]byte{0, 48, 196}: "Canon Imaging Systems Inc.", + [3]byte{0, 48, 197}: "CADENCE DESIGN SYSTEMS, INC.", + [3]byte{0, 48, 198}: "CONTROL SOLUTIONS, INC.", + [3]byte{0, 48, 199}: "Macromate Corp.", + [3]byte{0, 48, 200}: "GAD LINE, LTD.", + [3]byte{0, 48, 201}: "LuxN, N", + [3]byte{0, 48, 202}: "Discovery Com", + [3]byte{0, 48, 203}: "OMNI FLOW COMPUTERS, INC.", + [3]byte{0, 48, 204}: "Tenor Networks, Inc.", + [3]byte{0, 48, 205}: "CONEXANT SYSTEMS, INC.", + [3]byte{0, 48, 206}: "Zaffire", + [3]byte{0, 48, 207}: "TWO TECHNOLOGIES, INC.", + [3]byte{0, 48, 208}: "Tellabs", + [3]byte{0, 48, 209}: "INOVA CORPORATION", + [3]byte{0, 48, 210}: "WIN TECHNOLOGIES, CO., LTD.", + [3]byte{0, 48, 211}: "Agilent Technologies, Inc.", + [3]byte{0, 48, 212}: "AAE Systems, Inc.", + [3]byte{0, 48, 213}: "DResearch GmbH", + [3]byte{0, 48, 214}: "MSC VERTRIEBS GMBH", + [3]byte{0, 48, 215}: "Innovative Systems, L.L.C.", + [3]byte{0, 48, 216}: "SITEK", + [3]byte{0, 48, 217}: "DATACORE SOFTWARE CORP.", + [3]byte{0, 48, 218}: "Comtrend Corporation", + [3]byte{0, 48, 219}: "Mindready Solutions, Inc.", + [3]byte{0, 48, 220}: "RIGHTECH CORPORATION", + [3]byte{0, 48, 221}: "INDIGITA CORPORATION", + [3]byte{0, 48, 222}: "WAGO Kontakttechnik GmbH", + [3]byte{0, 48, 223}: "KB/TEL TELECOMUNICACIONES", + [3]byte{0, 48, 224}: "OXFORD SEMICONDUCTOR LTD.", + [3]byte{0, 48, 225}: "Network Equipment Technologies, Inc.", + [3]byte{0, 48, 226}: "GARNET SYSTEMS CO., LTD.", + [3]byte{0, 48, 227}: "SEDONA NETWORKS CORP.", + [3]byte{0, 48, 228}: "CHIYODA SYSTEM RIKEN", + [3]byte{0, 48, 229}: "Amper Datos S.A.", + [3]byte{0, 48, 230}: "Draeger Medical Systems, Inc.", + [3]byte{0, 48, 231}: "CNF MOBILE SOLUTIONS, INC.", + [3]byte{0, 48, 232}: "ENSIM CORP.", + [3]byte{0, 48, 233}: "GMA COMMUNICATION MANUFACT'G", + [3]byte{0, 48, 234}: "TeraForce Technology Corporation", + [3]byte{0, 48, 235}: "TURBONET COMMUNICATIONS, INC.", + [3]byte{0, 48, 236}: "BORGARDT", + [3]byte{0, 48, 237}: "Expert Magnetics Corp.", + [3]byte{0, 48, 238}: "DSG Technology, Inc.", + [3]byte{0, 48, 239}: "NEON TECHNOLOGY, INC.", + [3]byte{0, 48, 240}: "Uniform Industrial Corp.", + [3]byte{0, 48, 241}: "Accton Technology Corp", + [3]byte{0, 48, 242}: "Cisco Systems, Inc", + [3]byte{0, 48, 243}: "At Work Computers", + [3]byte{0, 48, 244}: "STARDOT TECHNOLOGIES", + [3]byte{0, 48, 245}: "Wild Lab. Ltd.", + [3]byte{0, 48, 246}: "SECURELOGIX CORPORATION", + [3]byte{0, 48, 247}: "RAMIX INC.", + [3]byte{0, 48, 248}: "Dynapro Systems, Inc.", + [3]byte{0, 48, 249}: "Sollae Systems Co., Ltd.", + [3]byte{0, 48, 250}: "TELICA, INC.", + [3]byte{0, 48, 251}: "AZS Technology AG", + [3]byte{0, 48, 252}: "Terawave Communications, Inc.", + [3]byte{0, 48, 253}: "INTEGRATED SYSTEMS DESIGN", + [3]byte{0, 48, 254}: "DSA GmbH", + [3]byte{0, 48, 255}: "DataFab Systems Inc.", + [3]byte{0, 49, 70}: "Juniper Networks", + [3]byte{0, 50, 58}: "so-logic", + [3]byte{0, 51, 108}: "SynapSense Corporation", + [3]byte{0, 52, 218}: "LG Electronics (Mobile Communications)", + [3]byte{0, 52, 241}: "Radicom Research, Inc.", + [3]byte{0, 52, 254}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{0, 53, 26}: "Cisco Systems, Inc", + [3]byte{0, 53, 50}: "Electro-Metrics Corporation", + [3]byte{0, 53, 96}: "Rosen Aviation", + [3]byte{0, 54, 118}: "ARRIS Group, Inc.", + [3]byte{0, 54, 248}: "Conti Temic microelectronic GmbH", + [3]byte{0, 54, 254}: "SuperVision", + [3]byte{0, 55, 109}: "Murata Manufacturing Co., Ltd.", + [3]byte{0, 55, 183}: "Sagemcom Broadband SAS", + [3]byte{0, 56, 223}: "Cisco Systems, Inc", + [3]byte{0, 58, 125}: "Cisco Systems, Inc", + [3]byte{0, 58, 152}: "Cisco Systems, Inc", + [3]byte{0, 58, 153}: "Cisco Systems, Inc", + [3]byte{0, 58, 154}: "Cisco Systems, Inc", + [3]byte{0, 58, 155}: "Cisco Systems, Inc", + [3]byte{0, 58, 156}: "Cisco Systems, Inc", + [3]byte{0, 58, 157}: "NEC Platforms, Ltd.", + [3]byte{0, 58, 175}: "BlueBit Ltd.", + [3]byte{0, 60, 197}: "WONWOO Engineering Co., Ltd", + [3]byte{0, 61, 65}: "Hatteland Computer AS", + [3]byte{0, 62, 225}: "Apple, Inc.", + [3]byte{0, 64, 0}: "PCI COMPONENTES DA AMZONIA LTD", + [3]byte{0, 64, 1}: "Zero One Technology Co. Ltd.", + [3]byte{0, 64, 2}: "PERLE SYSTEMS LIMITED", + [3]byte{0, 64, 3}: "Emerson Process Management Power & Water Solutions, Inc.", + [3]byte{0, 64, 4}: "ICM CO. LTD.", + [3]byte{0, 64, 5}: "ANI COMMUNICATIONS INC.", + [3]byte{0, 64, 6}: "SAMPO TECHNOLOGY CORPORATION", + [3]byte{0, 64, 7}: "TELMAT INFORMATIQUE", + [3]byte{0, 64, 8}: "A PLUS INFO CORPORATION", + [3]byte{0, 64, 9}: "TACHIBANA TECTRON CO., LTD.", + [3]byte{0, 64, 10}: "PIVOTAL TECHNOLOGIES, INC.", + [3]byte{0, 64, 11}: "Cisco Systems, Inc", + [3]byte{0, 64, 12}: "GENERAL MICRO SYSTEMS, INC.", + [3]byte{0, 64, 13}: "LANNET DATA COMMUNICATIONS,LTD", + [3]byte{0, 64, 14}: "MEMOTEC, INC.", + [3]byte{0, 64, 15}: "DATACOM TECHNOLOGIES", + [3]byte{0, 64, 16}: "SONIC SYSTEMS, INC.", + [3]byte{0, 64, 17}: "ANDOVER CONTROLS CORPORATION", + [3]byte{0, 64, 18}: "WINDATA, INC.", + [3]byte{0, 64, 19}: "NTT DATA COMM. SYSTEMS CORP.", + [3]byte{0, 64, 20}: "COMSOFT GMBH", + [3]byte{0, 64, 21}: "ASCOM INFRASYS AG", + [3]byte{0, 64, 22}: "ADC - Global Connectivity Solutions Division", + [3]byte{0, 64, 23}: "Silex Technology America", + [3]byte{0, 64, 24}: "ADOBE SYSTEMS, INC.", + [3]byte{0, 64, 25}: "AEON SYSTEMS, INC.", + [3]byte{0, 64, 26}: "FUJI ELECTRIC CO., LTD.", + [3]byte{0, 64, 27}: "PRINTER SYSTEMS CORP.", + [3]byte{0, 64, 28}: "AST RESEARCH, INC.", + [3]byte{0, 64, 29}: "INVISIBLE SOFTWARE, INC.", + [3]byte{0, 64, 30}: "ICC", + [3]byte{0, 64, 31}: "COLORGRAPH LTD", + [3]byte{0, 64, 32}: "CommScope Inc", + [3]byte{0, 64, 33}: "RASTER GRAPHICS", + [3]byte{0, 64, 34}: "KLEVER COMPUTERS, INC.", + [3]byte{0, 64, 35}: "LOGIC CORPORATION", + [3]byte{0, 64, 36}: "COMPAC INC.", + [3]byte{0, 64, 37}: "MOLECULAR DYNAMICS", + [3]byte{0, 64, 38}: "BUFFALO.INC", + [3]byte{0, 64, 39}: "SMC MASSACHUSETTS, INC.", + [3]byte{0, 64, 40}: "NETCOMM LIMITED", + [3]byte{0, 64, 41}: "Compex", + [3]byte{0, 64, 42}: "Canoga Perkins Corporation", + [3]byte{0, 64, 43}: "TRIGEM COMPUTER, INC.", + [3]byte{0, 64, 44}: "ISIS DISTRIBUTED SYSTEMS, INC.", + [3]byte{0, 64, 45}: "HARRIS ADACOM CORPORATION", + [3]byte{0, 64, 46}: "PRECISION SOFTWARE, INC.", + [3]byte{0, 64, 47}: "XLNT DESIGNS INC.", + [3]byte{0, 64, 48}: "GK COMPUTER", + [3]byte{0, 64, 49}: "KOKUSAI ELECTRIC CO., LTD", + [3]byte{0, 64, 50}: "DIGITAL COMMUNICATIONS", + [3]byte{0, 64, 51}: "ADDTRON TECHNOLOGY CO., LTD.", + [3]byte{0, 64, 52}: "BUSTEK CORPORATION", + [3]byte{0, 64, 53}: "OPCOM", + [3]byte{0, 64, 54}: "Zoom Telephonics, Inc", + [3]byte{0, 64, 55}: "SEA-ILAN, INC.", + [3]byte{0, 64, 56}: "TALENT ELECTRIC INCORPORATED", + [3]byte{0, 64, 57}: "OPTEC DAIICHI DENKO CO., LTD.", + [3]byte{0, 64, 58}: "IMPACT TECHNOLOGIES", + [3]byte{0, 64, 59}: "SYNERJET INTERNATIONAL CORP.", + [3]byte{0, 64, 60}: "FORKS, INC.", + [3]byte{0, 64, 61}: "Teradata Corporation", + [3]byte{0, 64, 62}: "RASTER OPS CORPORATION", + [3]byte{0, 64, 63}: "SSANGYONG COMPUTER SYSTEMS", + [3]byte{0, 64, 64}: "RING ACCESS, INC.", + [3]byte{0, 64, 65}: "FUJIKURA LTD.", + [3]byte{0, 64, 66}: "N.A.T. GMBH", + [3]byte{0, 64, 67}: "Nokia Siemens Networks GmbH & Co. KG.", + [3]byte{0, 64, 68}: "QNIX COMPUTER CO., LTD.", + [3]byte{0, 64, 69}: "TWINHEAD CORPORATION", + [3]byte{0, 64, 70}: "UDC RESEARCH LIMITED", + [3]byte{0, 64, 71}: "WIND RIVER SYSTEMS", + [3]byte{0, 64, 72}: "SMD INFORMATICA S.A.", + [3]byte{0, 64, 73}: "Roche Diagnostics International Ltd.", + [3]byte{0, 64, 74}: "WEST AUSTRALIAN DEPARTMENT", + [3]byte{0, 64, 75}: "MAPLE COMPUTER SYSTEMS", + [3]byte{0, 64, 76}: "HYPERTEC PTY LTD.", + [3]byte{0, 64, 77}: "TELECOMMUNICATIONS TECHNIQUES", + [3]byte{0, 64, 78}: "FLUENT, INC.", + [3]byte{0, 64, 79}: "SPACE & NAVAL WARFARE SYSTEMS", + [3]byte{0, 64, 80}: "IRONICS, INCORPORATED", + [3]byte{0, 64, 81}: "GRACILIS, INC.", + [3]byte{0, 64, 82}: "STAR TECHNOLOGIES, INC.", + [3]byte{0, 64, 83}: "AMPRO COMPUTERS", + [3]byte{0, 64, 84}: "CONNECTION MACHINES SERVICES", + [3]byte{0, 64, 85}: "METRONIX GMBH", + [3]byte{0, 64, 86}: "MCM JAPAN LTD.", + [3]byte{0, 64, 87}: "LOCKHEED - SANDERS", + [3]byte{0, 64, 88}: "KRONOS, INC.", + [3]byte{0, 64, 89}: "YOSHIDA KOGYO K. K.", + [3]byte{0, 64, 90}: "GOLDSTAR INFORMATION & COMM.", + [3]byte{0, 64, 91}: "FUNASSET LIMITED", + [3]byte{0, 64, 92}: "FUTURE SYSTEMS, INC.", + [3]byte{0, 64, 93}: "STAR-TEK, INC.", + [3]byte{0, 64, 94}: "NORTH HILLS ISRAEL", + [3]byte{0, 64, 95}: "AFE COMPUTERS LTD.", + [3]byte{0, 64, 96}: "COMENDEC LTD", + [3]byte{0, 64, 97}: "DATATECH ENTERPRISES CO., LTD.", + [3]byte{0, 64, 98}: "E-SYSTEMS, INC./GARLAND DIV.", + [3]byte{0, 64, 99}: "VIA TECHNOLOGIES, INC.", + [3]byte{0, 64, 100}: "KLA INSTRUMENTS CORPORATION", + [3]byte{0, 64, 101}: "GTE SPACENET", + [3]byte{0, 64, 102}: "APRESIA Systems Ltd", + [3]byte{0, 64, 103}: "OMNIBYTE CORPORATION", + [3]byte{0, 64, 104}: "EXTENDED SYSTEMS", + [3]byte{0, 64, 105}: "LEMCOM SYSTEMS, INC.", + [3]byte{0, 64, 106}: "KENTEK INFORMATION SYSTEMS,INC", + [3]byte{0, 64, 107}: "SYSGEN", + [3]byte{0, 64, 108}: "COPERNIQUE", + [3]byte{0, 64, 109}: "LANCO, INC.", + [3]byte{0, 64, 110}: "COROLLARY, INC.", + [3]byte{0, 64, 111}: "SYNC RESEARCH INC.", + [3]byte{0, 64, 112}: "INTERWARE CO., LTD.", + [3]byte{0, 64, 113}: "ATM COMPUTER GMBH", + [3]byte{0, 64, 114}: "Applied Innovation Inc.", + [3]byte{0, 64, 115}: "BASS ASSOCIATES", + [3]byte{0, 64, 116}: "CABLE AND WIRELESS", + [3]byte{0, 64, 117}: "Tattile SRL", + [3]byte{0, 64, 118}: "Sun Conversion Technologies", + [3]byte{0, 64, 119}: "MAXTON TECHNOLOGY CORPORATION", + [3]byte{0, 64, 120}: "WEARNES AUTOMATION PTE LTD", + [3]byte{0, 64, 121}: "JUKO MANUFACTURE COMPANY, LTD.", + [3]byte{0, 64, 122}: "SOCIETE D'EXPLOITATION DU CNIT", + [3]byte{0, 64, 123}: "SCIENTIFIC ATLANTA", + [3]byte{0, 64, 124}: "QUME CORPORATION", + [3]byte{0, 64, 125}: "EXTENSION TECHNOLOGY CORP.", + [3]byte{0, 64, 126}: "EVERGREEN SYSTEMS, INC.", + [3]byte{0, 64, 127}: "FLIR Systems", + [3]byte{0, 64, 128}: "ATHENIX CORPORATION", + [3]byte{0, 64, 129}: "MANNESMANN SCANGRAPHIC GMBH", + [3]byte{0, 64, 130}: "LABORATORY EQUIPMENT CORP.", + [3]byte{0, 64, 131}: "TDA INDUSTRIA DE PRODUTOS", + [3]byte{0, 64, 132}: "HONEYWELL ACS", + [3]byte{0, 64, 133}: "SAAB INSTRUMENTS AB", + [3]byte{0, 64, 134}: "MICHELS & KLEBERHOFF COMPUTER", + [3]byte{0, 64, 135}: "UBITREX CORPORATION", + [3]byte{0, 64, 136}: "MOBIUS TECHNOLOGIES, INC.", + [3]byte{0, 64, 137}: "MEIDENSHA CORPORATION", + [3]byte{0, 64, 138}: "TPS TELEPROCESSING SYS. GMBH", + [3]byte{0, 64, 139}: "RAYLAN CORPORATION", + [3]byte{0, 64, 140}: "AXIS COMMUNICATIONS AB", + [3]byte{0, 64, 141}: "THE GOODYEAR TIRE & RUBBER CO.", + [3]byte{0, 64, 142}: "Tattile SRL", + [3]byte{0, 64, 143}: "WM-DATA MINFO AB", + [3]byte{0, 64, 144}: "ANSEL COMMUNICATIONS", + [3]byte{0, 64, 145}: "PROCOMP INDUSTRIA ELETRONICA", + [3]byte{0, 64, 146}: "ASP COMPUTER PRODUCTS, INC.", + [3]byte{0, 64, 147}: "PAXDATA NETWORKS LTD.", + [3]byte{0, 64, 148}: "SHOGRAPHICS, INC.", + [3]byte{0, 64, 149}: "R.P.T. INTERGROUPS INT'L LTD.", + [3]byte{0, 64, 150}: "Cisco Systems, Inc", + [3]byte{0, 64, 151}: "DATEX DIVISION OF", + [3]byte{0, 64, 152}: "DRESSLER GMBH & CO.", + [3]byte{0, 64, 153}: "NEWGEN SYSTEMS CORP.", + [3]byte{0, 64, 154}: "NETWORK EXPRESS, INC.", + [3]byte{0, 64, 155}: "HAL COMPUTER SYSTEMS INC.", + [3]byte{0, 64, 156}: "TRANSWARE", + [3]byte{0, 64, 157}: "DIGIBOARD, INC.", + [3]byte{0, 64, 158}: "CONCURRENT TECHNOLOGIES LTD.", + [3]byte{0, 64, 159}: "Telco Systems, Inc.", + [3]byte{0, 64, 160}: "GOLDSTAR CO., LTD.", + [3]byte{0, 64, 161}: "ERGO COMPUTING", + [3]byte{0, 64, 162}: "KINGSTAR TECHNOLOGY INC.", + [3]byte{0, 64, 163}: "MICROUNITY SYSTEMS ENGINEERING", + [3]byte{0, 64, 164}: "ROSE ELECTRONICS", + [3]byte{0, 64, 165}: "CLINICOMP INTL.", + [3]byte{0, 64, 166}: "Cray, Inc.", + [3]byte{0, 64, 167}: "ITAUTEC PHILCO S.A.", + [3]byte{0, 64, 168}: "IMF INTERNATIONAL LTD.", + [3]byte{0, 64, 169}: "DATACOM INC.", + [3]byte{0, 64, 170}: "Valmet Automation", + [3]byte{0, 64, 171}: "ROLAND DG CORPORATION", + [3]byte{0, 64, 172}: "SUPER WORKSTATION, INC.", + [3]byte{0, 64, 173}: "SMA REGELSYSTEME GMBH", + [3]byte{0, 64, 174}: "DELTA CONTROLS, INC.", + [3]byte{0, 64, 175}: "DIGITAL PRODUCTS, INC.", + [3]byte{0, 64, 176}: "BYTEX CORPORATION, ENGINEERING", + [3]byte{0, 64, 177}: "CODONICS INC.", + [3]byte{0, 64, 178}: "SYSTEMFORSCHUNG", + [3]byte{0, 64, 179}: "ParTech Inc.", + [3]byte{0, 64, 180}: "NEXTCOM K.K.", + [3]byte{0, 64, 181}: "VIDEO TECHNOLOGY COMPUTERS LTD", + [3]byte{0, 64, 182}: "COMPUTERM CORPORATION", + [3]byte{0, 64, 183}: "STEALTH COMPUTER SYSTEMS", + [3]byte{0, 64, 184}: "IDEA ASSOCIATES", + [3]byte{0, 64, 185}: "MACQ ELECTRONIQUE SA", + [3]byte{0, 64, 186}: "ALLIANT COMPUTER SYSTEMS CORP.", + [3]byte{0, 64, 187}: "GOLDSTAR CABLE CO., LTD.", + [3]byte{0, 64, 188}: "ALGORITHMICS LTD.", + [3]byte{0, 64, 189}: "STARLIGHT NETWORKS, INC.", + [3]byte{0, 64, 190}: "BOEING DEFENSE & SPACE", + [3]byte{0, 64, 191}: "CHANNEL SYSTEMS INTERN'L INC.", + [3]byte{0, 64, 192}: "VISTA CONTROLS CORPORATION", + [3]byte{0, 64, 193}: "BIZERBA-WERKE WILHEIM KRAUT", + [3]byte{0, 64, 194}: "APPLIED COMPUTING DEVICES", + [3]byte{0, 64, 195}: "FISCHER AND PORTER CO.", + [3]byte{0, 64, 196}: "KINKEI SYSTEM CORPORATION", + [3]byte{0, 64, 197}: "MICOM COMMUNICATIONS INC.", + [3]byte{0, 64, 198}: "FIBERNET RESEARCH, INC.", + [3]byte{0, 64, 199}: "RUBY TECH CORPORATION", + [3]byte{0, 64, 200}: "MILAN TECHNOLOGY CORPORATION", + [3]byte{0, 64, 201}: "NCUBE", + [3]byte{0, 64, 202}: "FIRST INTERNAT'L COMPUTER, INC", + [3]byte{0, 64, 203}: "LANWAN TECHNOLOGIES", + [3]byte{0, 64, 204}: "SILCOM MANUF'G TECHNOLOGY INC.", + [3]byte{0, 64, 205}: "TERA MICROSYSTEMS, INC.", + [3]byte{0, 64, 206}: "NET-SOURCE, INC.", + [3]byte{0, 64, 207}: "STRAWBERRY TREE, INC.", + [3]byte{0, 64, 208}: "MITAC INTERNATIONAL CORP.", + [3]byte{0, 64, 209}: "FUKUDA DENSHI CO., LTD.", + [3]byte{0, 64, 210}: "PAGINE CORPORATION", + [3]byte{0, 64, 211}: "KIMPSION INTERNATIONAL CORP.", + [3]byte{0, 64, 212}: "GAGE TALKER CORP.", + [3]byte{0, 64, 213}: "Sartorius Mechatronics T&H GmbH", + [3]byte{0, 64, 214}: "LOCAMATION B.V.", + [3]byte{0, 64, 215}: "STUDIO GEN INC.", + [3]byte{0, 64, 216}: "OCEAN OFFICE AUTOMATION LTD.", + [3]byte{0, 64, 217}: "AMERICAN MEGATRENDS INC.", + [3]byte{0, 64, 218}: "TELSPEC LTD", + [3]byte{0, 64, 219}: "ADVANCED TECHNICAL SOLUTIONS", + [3]byte{0, 64, 220}: "TRITEC ELECTRONIC GMBH", + [3]byte{0, 64, 221}: "HONG TECHNOLOGIES", + [3]byte{0, 64, 222}: "Elsag Datamat spa", + [3]byte{0, 64, 223}: "DIGALOG SYSTEMS, INC.", + [3]byte{0, 64, 224}: "ATOMWIDE LTD.", + [3]byte{0, 64, 225}: "MARNER INTERNATIONAL, INC.", + [3]byte{0, 64, 226}: "MESA RIDGE TECHNOLOGIES, INC.", + [3]byte{0, 64, 227}: "QUIN SYSTEMS LTD", + [3]byte{0, 64, 228}: "E-M TECHNOLOGY, INC.", + [3]byte{0, 64, 229}: "SYBUS CORPORATION", + [3]byte{0, 64, 230}: "C.A.E.N.", + [3]byte{0, 64, 231}: "ARNOS INSTRUMENTS & COMPUTER", + [3]byte{0, 64, 232}: "CHARLES RIVER DATA SYSTEMS,INC", + [3]byte{0, 64, 233}: "ACCORD SYSTEMS, INC.", + [3]byte{0, 64, 234}: "PLAIN TREE SYSTEMS INC", + [3]byte{0, 64, 235}: "MARTIN MARIETTA CORPORATION", + [3]byte{0, 64, 236}: "MIKASA SYSTEM ENGINEERING", + [3]byte{0, 64, 237}: "NETWORK CONTROLS INT'NATL INC.", + [3]byte{0, 64, 238}: "OPTIMEM", + [3]byte{0, 64, 239}: "HYPERCOM, INC.", + [3]byte{0, 64, 240}: "MicroBrain,Inc.", + [3]byte{0, 64, 241}: "CHUO ELECTRONICS CO., LTD.", + [3]byte{0, 64, 242}: "JANICH & KLASS COMPUTERTECHNIK", + [3]byte{0, 64, 243}: "NETCOR", + [3]byte{0, 64, 244}: "CAMEO COMMUNICATIONS, INC.", + [3]byte{0, 64, 245}: "OEM ENGINES", + [3]byte{0, 64, 246}: "KATRON COMPUTERS INC.", + [3]byte{0, 64, 247}: "Polaroid Corporation", + [3]byte{0, 64, 248}: "SYSTEMHAUS DISCOM", + [3]byte{0, 64, 249}: "COMBINET", + [3]byte{0, 64, 250}: "MICROBOARDS, INC.", + [3]byte{0, 64, 251}: "CASCADE COMMUNICATIONS", + [3]byte{0, 64, 252}: "IBR COMPUTER TECHNIK GMBH", + [3]byte{0, 64, 253}: "LXE", + [3]byte{0, 64, 254}: "SYMPLEX COMMUNICATIONS", + [3]byte{0, 64, 255}: "TELEBIT CORPORATION", + [3]byte{0, 65, 180}: "Wuxi Zhongxing Optoelectronics Technology Co.,Ltd.", + [3]byte{0, 65, 210}: "Cisco Systems, Inc", + [3]byte{0, 66, 82}: "RLX Technologies", + [3]byte{0, 66, 90}: "Cisco Systems, Inc", + [3]byte{0, 66, 104}: "Cisco Systems, Inc", + [3]byte{0, 67, 255}: "KETRON S.R.L.", + [3]byte{0, 69, 1}: "Versus Technology, Inc.", + [3]byte{0, 70, 75}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{0, 74, 119}: "zte corporation", + [3]byte{0, 75, 243}: "SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.", + [3]byte{0, 77, 50}: "Andon Health Co.,Ltd.", + [3]byte{0, 80, 0}: "NEXO COMMUNICATIONS, INC.", + [3]byte{0, 80, 1}: "YAMASHITA SYSTEMS CORP.", + [3]byte{0, 80, 2}: "OMNISEC AG", + [3]byte{0, 80, 3}: "Xrite Inc", + [3]byte{0, 80, 4}: "3COM CORPORATION", + [3]byte{0, 80, 6}: "TAC AB", + [3]byte{0, 80, 7}: "SIEMENS TELECOMMUNICATION SYSTEMS LIMITED", + [3]byte{0, 80, 8}: "TIVA MICROCOMPUTER CORP. (TMC)", + [3]byte{0, 80, 9}: "PHILIPS BROADBAND NETWORKS", + [3]byte{0, 80, 10}: "IRIS TECHNOLOGIES, INC.", + [3]byte{0, 80, 11}: "Cisco Systems, Inc", + [3]byte{0, 80, 12}: "e-Tek Labs, Inc.", + [3]byte{0, 80, 13}: "SATORI ELECTORIC CO., LTD.", + [3]byte{0, 80, 14}: "CHROMATIS NETWORKS, INC.", + [3]byte{0, 80, 15}: "Cisco Systems, Inc", + [3]byte{0, 80, 16}: "NovaNET Learning, Inc.", + [3]byte{0, 80, 18}: "CBL - GMBH", + [3]byte{0, 80, 19}: "Seagate Cloud Systems Inc", + [3]byte{0, 80, 20}: "Cisco Systems, Inc", + [3]byte{0, 80, 21}: "BRIGHT STAR ENGINEERING", + [3]byte{0, 80, 22}: "Molex Canada Ltd", + [3]byte{0, 80, 23}: "RSR S.R.L.", + [3]byte{0, 80, 24}: "AMIT, Inc.", + [3]byte{0, 80, 25}: "SPRING TIDE NETWORKS, INC.", + [3]byte{0, 80, 26}: "IQinVision", + [3]byte{0, 80, 27}: "ABL CANADA, INC.", + [3]byte{0, 80, 28}: "JATOM SYSTEMS, INC.", + [3]byte{0, 80, 30}: "Grass Valley, A Belden Brand", + [3]byte{0, 80, 31}: "MRG SYSTEMS, LTD.", + [3]byte{0, 80, 32}: "MEDIASTAR CO., LTD.", + [3]byte{0, 80, 33}: "EIS INTERNATIONAL, INC.", + [3]byte{0, 80, 34}: "ZONET TECHNOLOGY, INC.", + [3]byte{0, 80, 35}: "PG DESIGN ELECTRONICS, INC.", + [3]byte{0, 80, 36}: "NAVIC SYSTEMS, INC.", + [3]byte{0, 80, 38}: "COSYSTEMS, INC.", + [3]byte{0, 80, 39}: "GENICOM CORPORATION", + [3]byte{0, 80, 40}: "AVAL COMMUNICATIONS", + [3]byte{0, 80, 41}: "1394 PRINTER WORKING GROUP", + [3]byte{0, 80, 42}: "Cisco Systems, Inc", + [3]byte{0, 80, 43}: "GENRAD LTD.", + [3]byte{0, 80, 44}: "SOYO COMPUTER, INC.", + [3]byte{0, 80, 45}: "ACCEL, INC.", + [3]byte{0, 80, 46}: "CAMBEX CORPORATION", + [3]byte{0, 80, 47}: "TollBridge Technologies, Inc.", + [3]byte{0, 80, 48}: "FUTURE PLUS SYSTEMS", + [3]byte{0, 80, 49}: "AEROFLEX LABORATORIES, INC.", + [3]byte{0, 80, 50}: "PICAZO COMMUNICATIONS, INC.", + [3]byte{0, 80, 51}: "MAYAN NETWORKS", + [3]byte{0, 80, 54}: "NETCAM, LTD.", + [3]byte{0, 80, 55}: "KOGA ELECTRONICS CO.", + [3]byte{0, 80, 56}: "DAIN TELECOM CO., LTD.", + [3]byte{0, 80, 57}: "MARINER NETWORKS", + [3]byte{0, 80, 58}: "DATONG ELECTRONICS LTD.", + [3]byte{0, 80, 59}: "MEDIAFIRE CORPORATION", + [3]byte{0, 80, 60}: "TSINGHUA NOVEL ELECTRONICS", + [3]byte{0, 80, 62}: "Cisco Systems, Inc", + [3]byte{0, 80, 63}: "ANCHOR GAMES", + [3]byte{0, 80, 64}: "Panasonic Electric Works Co., Ltd.", + [3]byte{0, 80, 65}: "Coretronic Corporation", + [3]byte{0, 80, 66}: "SCI MANUFACTURING SINGAPORE PTE, LTD.", + [3]byte{0, 80, 67}: "MARVELL SEMICONDUCTOR, INC.", + [3]byte{0, 80, 68}: "ASACA CORPORATION", + [3]byte{0, 80, 69}: "RIOWORKS SOLUTIONS, INC.", + [3]byte{0, 80, 70}: "MENICX INTERNATIONAL CO., LTD.", + [3]byte{0, 80, 71}: "Private", + [3]byte{0, 80, 72}: "INFOLIBRIA", + [3]byte{0, 80, 73}: "Arbor Networks Inc", + [3]byte{0, 80, 74}: "ELTECO A.S.", + [3]byte{0, 80, 75}: "BARCONET N.V.", + [3]byte{0, 80, 76}: "Galil Motion Control", + [3]byte{0, 80, 77}: "Tokyo Electron Device Limited", + [3]byte{0, 80, 78}: "SIERRA MONITOR CORP.", + [3]byte{0, 80, 79}: "OLENCOM ELECTRONICS", + [3]byte{0, 80, 80}: "Cisco Systems, Inc", + [3]byte{0, 80, 81}: "IWATSU ELECTRIC CO., LTD.", + [3]byte{0, 80, 82}: "TIARA NETWORKS, INC.", + [3]byte{0, 80, 83}: "Cisco Systems, Inc", + [3]byte{0, 80, 84}: "Cisco Systems, Inc", + [3]byte{0, 80, 85}: "DOMS A/S", + [3]byte{0, 80, 86}: "VMware, Inc.", + [3]byte{0, 80, 87}: "BROADBAND ACCESS SYSTEMS", + [3]byte{0, 80, 88}: "Sangoma Technologies", + [3]byte{0, 80, 89}: "iBAHN", + [3]byte{0, 80, 90}: "NETWORK ALCHEMY, INC.", + [3]byte{0, 80, 91}: "KAWASAKI LSI U.S.A., INC.", + [3]byte{0, 80, 92}: "TUNDO CORPORATION", + [3]byte{0, 80, 94}: "DIGITEK MICROLOGIC S.A.", + [3]byte{0, 80, 95}: "BRAND INNOVATORS", + [3]byte{0, 80, 96}: "TANDBERG TELECOM AS", + [3]byte{0, 80, 98}: "KOUWELL ELECTRONICS CORP. **", + [3]byte{0, 80, 99}: "OY COMSEL SYSTEM AB", + [3]byte{0, 80, 100}: "CAE ELECTRONICS", + [3]byte{0, 80, 101}: "TDK-Lambda Corporation", + [3]byte{0, 80, 102}: "AtecoM GmbH advanced telecomunication modules", + [3]byte{0, 80, 103}: "AEROCOMM, INC.", + [3]byte{0, 80, 104}: "ELECTRONIC INDUSTRIES ASSOCIATION", + [3]byte{0, 80, 105}: "PixStream Incorporated", + [3]byte{0, 80, 106}: "EDEVA, INC.", + [3]byte{0, 80, 107}: "SPX-ATEG", + [3]byte{0, 80, 108}: "Beijer Electronics Products AB", + [3]byte{0, 80, 109}: "VIDEOJET SYSTEMS", + [3]byte{0, 80, 110}: "CORDER ENGINEERING CORPORATION", + [3]byte{0, 80, 111}: "G-CONNECT", + [3]byte{0, 80, 112}: "CHAINTECH COMPUTER CO., LTD.", + [3]byte{0, 80, 113}: "AIWA CO., LTD.", + [3]byte{0, 80, 114}: "CORVIS CORPORATION", + [3]byte{0, 80, 115}: "Cisco Systems, Inc", + [3]byte{0, 80, 116}: "ADVANCED HI-TECH CORP.", + [3]byte{0, 80, 117}: "KESTREL SOLUTIONS", + [3]byte{0, 80, 118}: "IBM Corp", + [3]byte{0, 80, 119}: "PROLIFIC TECHNOLOGY, INC.", + [3]byte{0, 80, 120}: "MEGATON HOUSE, LTD.", + [3]byte{0, 80, 121}: "Private", + [3]byte{0, 80, 122}: "XPEED, INC.", + [3]byte{0, 80, 123}: "MERLOT COMMUNICATIONS", + [3]byte{0, 80, 124}: "VIDEOCON AG", + [3]byte{0, 80, 125}: "IFP", + [3]byte{0, 80, 126}: "NEWER TECHNOLOGY", + [3]byte{0, 80, 127}: "DrayTek Corp.", + [3]byte{0, 80, 128}: "Cisco Systems, Inc", + [3]byte{0, 80, 129}: "MURATA MACHINERY, LTD.", + [3]byte{0, 80, 130}: "FORESSON CORPORATION", + [3]byte{0, 80, 131}: "GILBARCO, INC.", + [3]byte{0, 80, 132}: "ATL PRODUCTS", + [3]byte{0, 80, 134}: "TELKOM SA, LTD.", + [3]byte{0, 80, 135}: "TERASAKI ELECTRIC CO., LTD.", + [3]byte{0, 80, 136}: "AMANO CORPORATION", + [3]byte{0, 80, 137}: "SAFETY MANAGEMENT SYSTEMS", + [3]byte{0, 80, 139}: "Hewlett Packard", + [3]byte{0, 80, 140}: "RSI SYSTEMS", + [3]byte{0, 80, 141}: "ABIT COMPUTER CORPORATION", + [3]byte{0, 80, 142}: "OPTIMATION, INC.", + [3]byte{0, 80, 143}: "ASITA TECHNOLOGIES INT'L LTD.", + [3]byte{0, 80, 144}: "DCTRI", + [3]byte{0, 80, 145}: "NETACCESS, INC.", + [3]byte{0, 80, 146}: "Rigaku Corporation Osaka Plant", + [3]byte{0, 80, 147}: "BOEING", + [3]byte{0, 80, 148}: "ARRIS Group, Inc.", + [3]byte{0, 80, 149}: "PERACOM NETWORKS", + [3]byte{0, 80, 150}: "SALIX TECHNOLOGIES, INC.", + [3]byte{0, 80, 151}: "MMC-EMBEDDED COMPUTERTECHNIK GmbH", + [3]byte{0, 80, 152}: "GLOBALOOP, LTD.", + [3]byte{0, 80, 153}: "3COM EUROPE, LTD.", + [3]byte{0, 80, 154}: "TAG ELECTRONIC SYSTEMS", + [3]byte{0, 80, 155}: "SWITCHCORE AB", + [3]byte{0, 80, 156}: "BETA RESEARCH", + [3]byte{0, 80, 157}: "THE INDUSTREE B.V.", + [3]byte{0, 80, 158}: "Les Technologies SoftAcoustik Inc.", + [3]byte{0, 80, 159}: "HORIZON COMPUTER", + [3]byte{0, 80, 160}: "DELTA COMPUTER SYSTEMS, INC.", + [3]byte{0, 80, 161}: "CARLO GAVAZZI, INC.", + [3]byte{0, 80, 162}: "Cisco Systems, Inc", + [3]byte{0, 80, 163}: "TransMedia Communications, Inc.", + [3]byte{0, 80, 164}: "IO TECH, INC.", + [3]byte{0, 80, 165}: "CAPITOL BUSINESS SYSTEMS, LTD.", + [3]byte{0, 80, 166}: "OPTRONICS", + [3]byte{0, 80, 167}: "Cisco Systems, Inc", + [3]byte{0, 80, 168}: "OpenCon Systems, Inc.", + [3]byte{0, 80, 169}: "MOLDAT WIRELESS TECHNOLGIES", + [3]byte{0, 80, 170}: "KONICA MINOLTA HOLDINGS, INC.", + [3]byte{0, 80, 171}: "NALTEC, Inc.", + [3]byte{0, 80, 172}: "MAPLE COMPUTER CORPORATION", + [3]byte{0, 80, 173}: "CommUnique Wireless Corp.", + [3]byte{0, 80, 174}: "FDK Co., Ltd", + [3]byte{0, 80, 175}: "INTERGON, INC.", + [3]byte{0, 80, 176}: "TECHNOLOGY ATLANTA CORPORATION", + [3]byte{0, 80, 177}: "GIDDINGS & LEWIS", + [3]byte{0, 80, 178}: "BRODEL GmbH", + [3]byte{0, 80, 179}: "VOICEBOARD CORPORATION", + [3]byte{0, 80, 180}: "SATCHWELL CONTROL SYSTEMS, LTD", + [3]byte{0, 80, 181}: "FICHET SECURITE ELECTRONIQUE", + [3]byte{0, 80, 182}: "GOOD WAY IND. CO., LTD.", + [3]byte{0, 80, 183}: "BOSER TECHNOLOGY CO., LTD.", + [3]byte{0, 80, 184}: "INOVA COMPUTERS GMBH & CO. KG", + [3]byte{0, 80, 185}: "XITRON TECHNOLOGIES, INC.", + [3]byte{0, 80, 186}: "D-Link Corporation", + [3]byte{0, 80, 187}: "CMS TECHNOLOGIES", + [3]byte{0, 80, 188}: "HAMMER STORAGE SOLUTIONS", + [3]byte{0, 80, 189}: "Cisco Systems, Inc", + [3]byte{0, 80, 190}: "FAST MULTIMEDIA AG", + [3]byte{0, 80, 191}: "Metalligence Technology Corp.", + [3]byte{0, 80, 192}: "GATAN, INC.", + [3]byte{0, 80, 193}: "GEMFLEX NETWORKS, LTD.", + [3]byte{0, 80, 194}: "IEEE Registration Authority", + [3]byte{0, 80, 196}: "IMD", + [3]byte{0, 80, 197}: "ADS Technologies, Inc", + [3]byte{0, 80, 198}: "LOOP TELECOMMUNICATION INTERNATIONAL, INC.", + [3]byte{0, 80, 199}: "Private", + [3]byte{0, 80, 200}: "Addonics Technologies, Inc.", + [3]byte{0, 80, 201}: "MASPRO DENKOH CORP.", + [3]byte{0, 80, 202}: "NET TO NET TECHNOLOGIES", + [3]byte{0, 80, 203}: "JETTER", + [3]byte{0, 80, 204}: "Seagate Cloud Systems Inc", + [3]byte{0, 80, 205}: "DIGIANSWER A/S", + [3]byte{0, 80, 206}: "LG INTERNATIONAL CORP.", + [3]byte{0, 80, 207}: "VANLINK COMMUNICATION TECHNOLOGY RESEARCH INSTITUTE", + [3]byte{0, 80, 208}: "MINERVA SYSTEMS", + [3]byte{0, 80, 209}: "Cisco Systems, Inc", + [3]byte{0, 80, 210}: "CMC Electronics Inc", + [3]byte{0, 80, 211}: "DIGITAL AUDIO PROCESSING PTY. LTD.", + [3]byte{0, 80, 212}: "JOOHONG INFORMATION &", + [3]byte{0, 80, 213}: "AD SYSTEMS CORP.", + [3]byte{0, 80, 214}: "ATLAS COPCO TOOLS AB", + [3]byte{0, 80, 215}: "TELSTRAT", + [3]byte{0, 80, 216}: "UNICORN COMPUTER CORP.", + [3]byte{0, 80, 217}: "ENGETRON-ENGENHARIA ELETRONICA IND. e COM. LTDA", + [3]byte{0, 80, 218}: "3COM CORPORATION", + [3]byte{0, 80, 219}: "CONTEMPORARY CONTROL", + [3]byte{0, 80, 220}: "TAS TELEFONBAU A. SCHWABE GMBH & CO. KG", + [3]byte{0, 80, 221}: "SERRA SOLDADURA, S.A.", + [3]byte{0, 80, 222}: "SIGNUM SYSTEMS CORP.", + [3]byte{0, 80, 223}: "AirFiber, Inc.", + [3]byte{0, 80, 225}: "NS TECH ELECTRONICS SDN BHD", + [3]byte{0, 80, 226}: "Cisco Systems, Inc", + [3]byte{0, 80, 227}: "ARRIS Group, Inc.", + [3]byte{0, 80, 228}: "Apple, Inc.", + [3]byte{0, 80, 230}: "HAKUSAN CORPORATION", + [3]byte{0, 80, 231}: "PARADISE INNOVATIONS (ASIA)", + [3]byte{0, 80, 232}: "NOMADIX INC.", + [3]byte{0, 80, 234}: "XEL COMMUNICATIONS, INC.", + [3]byte{0, 80, 235}: "ALPHA-TOP CORPORATION", + [3]byte{0, 80, 236}: "OLICOM A/S", + [3]byte{0, 80, 237}: "ANDA NETWORKS", + [3]byte{0, 80, 238}: "TEK DIGITEL CORPORATION", + [3]byte{0, 80, 239}: "SPE Systemhaus GmbH", + [3]byte{0, 80, 240}: "Cisco Systems, Inc", + [3]byte{0, 80, 241}: "Intel Corporation", + [3]byte{0, 80, 242}: "MICROSOFT CORP.", + [3]byte{0, 80, 243}: "GLOBAL NET INFORMATION CO., Ltd.", + [3]byte{0, 80, 244}: "SIGMATEK GMBH & CO. KG", + [3]byte{0, 80, 246}: "PAN-INTERNATIONAL INDUSTRIAL CORP.", + [3]byte{0, 80, 247}: "VENTURE MANUFACTURING (SINGAPORE) LTD.", + [3]byte{0, 80, 248}: "ENTREGA TECHNOLOGIES, INC.", + [3]byte{0, 80, 249}: "Sensormatic Electronics LLC", + [3]byte{0, 80, 250}: "OXTEL, LTD.", + [3]byte{0, 80, 251}: "VSK ELECTRONICS", + [3]byte{0, 80, 252}: "Edimax Technology Co. Ltd.", + [3]byte{0, 80, 253}: "VISIONCOMM CO., LTD.", + [3]byte{0, 80, 254}: "PCTVnet ASA", + [3]byte{0, 80, 255}: "HAKKO ELECTRONICS CO., LTD.", + [3]byte{0, 82, 24}: "Wuxi Keboda Electron Co.Ltd", + [3]byte{0, 84, 159}: "Avaya Inc", + [3]byte{0, 84, 175}: "Continental Automotive Systems Inc.", + [3]byte{0, 84, 189}: "Swelaser AB", + [3]byte{0, 85, 218}: "IEEE Registration Authority", + [3]byte{0, 86, 43}: "Cisco Systems, Inc", + [3]byte{0, 86, 205}: "Apple, Inc.", + [3]byte{0, 87, 210}: "Cisco Systems, Inc", + [3]byte{0, 89, 7}: "LenovoEMC Products USA, LLC", + [3]byte{0, 89, 121}: "Networked Energy Services", + [3]byte{0, 89, 172}: "KPN. B.V.", + [3]byte{0, 89, 220}: "Cisco Systems, Inc", + [3]byte{0, 90, 19}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{0, 90, 57}: "SHENZHEN FAST TECHNOLOGIES CO.,LTD", + [3]byte{0, 91, 161}: "shanghai huayuan chuangxin software CO., LTD.", + [3]byte{0, 92, 134}: "SHENZHEN FAST TECHNOLOGIES CO.,LTD", + [3]byte{0, 92, 177}: "Gospell DIGITAL TECHNOLOGY CO., LTD", + [3]byte{0, 93, 3}: "Xilinx, Inc", + [3]byte{0, 93, 115}: "Cisco Systems, Inc", + [3]byte{0, 95, 134}: "Cisco Systems, Inc", + [3]byte{0, 96, 0}: "XYCOM INC.", + [3]byte{0, 96, 1}: "InnoSys, Inc.", + [3]byte{0, 96, 2}: "SCREEN SUBTITLING SYSTEMS, LTD", + [3]byte{0, 96, 3}: "TERAOKA WEIGH SYSTEM PTE, LTD.", + [3]byte{0, 96, 4}: "COMPUTADORES MODULARES SA", + [3]byte{0, 96, 5}: "FEEDBACK DATA LTD.", + [3]byte{0, 96, 6}: "SOTEC CO., LTD", + [3]byte{0, 96, 7}: "ACRES GAMING, INC.", + [3]byte{0, 96, 8}: "3COM CORPORATION", + [3]byte{0, 96, 9}: "Cisco Systems, Inc", + [3]byte{0, 96, 10}: "SORD COMPUTER CORPORATION", + [3]byte{0, 96, 11}: "LOGWARE GmbH", + [3]byte{0, 96, 12}: "Eurotech Inc.", + [3]byte{0, 96, 13}: "Digital Logic GmbH", + [3]byte{0, 96, 14}: "WAVENET INTERNATIONAL, INC.", + [3]byte{0, 96, 15}: "Westell Technologies Inc.", + [3]byte{0, 96, 16}: "NETWORK MACHINES, INC.", + [3]byte{0, 96, 17}: "CRYSTAL SEMICONDUCTOR CORP.", + [3]byte{0, 96, 18}: "POWER COMPUTING CORPORATION", + [3]byte{0, 96, 19}: "NETSTAL MASCHINEN AG", + [3]byte{0, 96, 20}: "EDEC CO., LTD.", + [3]byte{0, 96, 21}: "NET2NET CORPORATION", + [3]byte{0, 96, 22}: "CLARIION", + [3]byte{0, 96, 23}: "TOKIMEC INC.", + [3]byte{0, 96, 24}: "STELLAR ONE CORPORATION", + [3]byte{0, 96, 25}: "Roche Diagnostics", + [3]byte{0, 96, 26}: "KEITHLEY INSTRUMENTS", + [3]byte{0, 96, 27}: "MESA ELECTRONICS", + [3]byte{0, 96, 28}: "TELXON CORPORATION", + [3]byte{0, 96, 29}: "LUCENT TECHNOLOGIES", + [3]byte{0, 96, 30}: "SOFTLAB, INC.", + [3]byte{0, 96, 31}: "STALLION TECHNOLOGIES", + [3]byte{0, 96, 32}: "PIVOTAL NETWORKING, INC.", + [3]byte{0, 96, 33}: "DSC CORPORATION", + [3]byte{0, 96, 34}: "VICOM SYSTEMS, INC.", + [3]byte{0, 96, 35}: "PERICOM SEMICONDUCTOR CORP.", + [3]byte{0, 96, 36}: "GRADIENT TECHNOLOGIES, INC.", + [3]byte{0, 96, 37}: "ACTIVE IMAGING PLC", + [3]byte{0, 96, 38}: "VIKING Modular Solutions", + [3]byte{0, 96, 39}: "Superior Modular Products", + [3]byte{0, 96, 40}: "MACROVISION CORPORATION", + [3]byte{0, 96, 41}: "CARY PERIPHERALS INC.", + [3]byte{0, 96, 42}: "SYMICRON COMPUTER COMMUNICATIONS, LTD.", + [3]byte{0, 96, 43}: "PEAK AUDIO", + [3]byte{0, 96, 44}: "LINX Data Terminals, Inc.", + [3]byte{0, 96, 45}: "ALERTON TECHNOLOGIES, INC.", + [3]byte{0, 96, 46}: "CYCLADES CORPORATION", + [3]byte{0, 96, 47}: "Cisco Systems, Inc", + [3]byte{0, 96, 48}: "VILLAGE TRONIC ENTWICKLUNG", + [3]byte{0, 96, 49}: "HRK SYSTEMS", + [3]byte{0, 96, 50}: "I-CUBE, INC.", + [3]byte{0, 96, 51}: "ACUITY IMAGING, INC.", + [3]byte{0, 96, 52}: "ROBERT BOSCH GmbH", + [3]byte{0, 96, 53}: "DALLAS SEMICONDUCTOR, INC.", + [3]byte{0, 96, 54}: "AIT Austrian Institute of Technology GmbH", + [3]byte{0, 96, 55}: "NXP Semiconductors", + [3]byte{0, 96, 56}: "Nortel Networks", + [3]byte{0, 96, 57}: "SanCom Technology, Inc.", + [3]byte{0, 96, 58}: "QUICK CONTROLS LTD.", + [3]byte{0, 96, 59}: "AMTEC spa", + [3]byte{0, 96, 60}: "HAGIWARA SYS-COM CO., LTD.", + [3]byte{0, 96, 61}: "3CX", + [3]byte{0, 96, 62}: "Cisco Systems, Inc", + [3]byte{0, 96, 63}: "PATAPSCO DESIGNS", + [3]byte{0, 96, 64}: "NETRO CORP.", + [3]byte{0, 96, 65}: "Yokogawa Digital Computer Corporation", + [3]byte{0, 96, 66}: "TKS (USA), INC.", + [3]byte{0, 96, 67}: "iDirect, INC.", + [3]byte{0, 96, 68}: "LITTON/POLY-SCIENTIFIC", + [3]byte{0, 96, 69}: "PATHLIGHT TECHNOLOGIES", + [3]byte{0, 96, 70}: "VMETRO, INC.", + [3]byte{0, 96, 71}: "Cisco Systems, Inc", + [3]byte{0, 96, 72}: "Dell EMC", + [3]byte{0, 96, 73}: "VINA TECHNOLOGIES", + [3]byte{0, 96, 74}: "SAIC IDEAS GROUP", + [3]byte{0, 96, 75}: "Safe-com GmbH & Co. KG", + [3]byte{0, 96, 76}: "Sagemcom Broadband SAS", + [3]byte{0, 96, 77}: "MMC NETWORKS, INC.", + [3]byte{0, 96, 78}: "CYCLE COMPUTER CORPORATION, INC.", + [3]byte{0, 96, 79}: "Tattile SRL", + [3]byte{0, 96, 80}: "INTERNIX INC.", + [3]byte{0, 96, 81}: "QUALITY SEMICONDUCTOR", + [3]byte{0, 96, 82}: "PERIPHERALS ENTERPRISE CO., Ltd.", + [3]byte{0, 96, 83}: "TOYODA MACHINE WORKS, LTD.", + [3]byte{0, 96, 84}: "CONTROLWARE GMBH", + [3]byte{0, 96, 85}: "CORNELL UNIVERSITY", + [3]byte{0, 96, 86}: "NETWORK TOOLS, INC.", + [3]byte{0, 96, 87}: "Murata Manufacturing Co., Ltd.", + [3]byte{0, 96, 88}: "COPPER MOUNTAIN COMMUNICATIONS, INC.", + [3]byte{0, 96, 89}: "TECHNICAL COMMUNICATIONS CORP.", + [3]byte{0, 96, 90}: "CELCORE, INC.", + [3]byte{0, 96, 91}: "IntraServer Technology, Inc.", + [3]byte{0, 96, 92}: "Cisco Systems, Inc", + [3]byte{0, 96, 93}: "SCANIVALVE CORP.", + [3]byte{0, 96, 94}: "LIBERTY TECHNOLOGY NETWORKING", + [3]byte{0, 96, 95}: "NIPPON UNISOFT CORPORATION", + [3]byte{0, 96, 96}: "Data Innovations North America", + [3]byte{0, 96, 97}: "WHISTLE COMMUNICATIONS CORP.", + [3]byte{0, 96, 98}: "TELESYNC, INC.", + [3]byte{0, 96, 99}: "PSION DACOM PLC.", + [3]byte{0, 96, 100}: "NETCOMM LIMITED", + [3]byte{0, 96, 101}: "BERNECKER & RAINER INDUSTRIE-ELEKTRONIC GmbH", + [3]byte{0, 96, 102}: "LACROIX Trafic", + [3]byte{0, 96, 103}: "ACER NETXUS INC.", + [3]byte{0, 96, 104}: "Dialogic Corporation", + [3]byte{0, 96, 105}: "Brocade Communications Systems, Inc.", + [3]byte{0, 96, 106}: "MITSUBISHI WIRELESS COMMUNICATIONS. INC.", + [3]byte{0, 96, 107}: "Synclayer Inc.", + [3]byte{0, 96, 108}: "ARESCOM", + [3]byte{0, 96, 109}: "DIGITAL EQUIPMENT CORP.", + [3]byte{0, 96, 110}: "DAVICOM SEMICONDUCTOR, INC.", + [3]byte{0, 96, 111}: "CLARION CORPORATION OF AMERICA", + [3]byte{0, 96, 112}: "Cisco Systems, Inc", + [3]byte{0, 96, 113}: "MIDAS LAB, INC.", + [3]byte{0, 96, 114}: "VXL INSTRUMENTS, LIMITED", + [3]byte{0, 96, 115}: "REDCREEK COMMUNICATIONS, INC.", + [3]byte{0, 96, 116}: "QSC LLC", + [3]byte{0, 96, 117}: "PENTEK, INC.", + [3]byte{0, 96, 118}: "SCHLUMBERGER TECHNOLOGIES RETAIL PETROLEUM SYSTEMS", + [3]byte{0, 96, 119}: "PRISA NETWORKS", + [3]byte{0, 96, 120}: "POWER MEASUREMENT LTD.", + [3]byte{0, 96, 121}: "Mainstream Data, Inc.", + [3]byte{0, 96, 122}: "DVS GMBH", + [3]byte{0, 96, 123}: "FORE SYSTEMS, INC.", + [3]byte{0, 96, 124}: "WaveAccess, Ltd.", + [3]byte{0, 96, 125}: "SENTIENT NETWORKS INC.", + [3]byte{0, 96, 126}: "GIGALABS, INC.", + [3]byte{0, 96, 127}: "AURORA TECHNOLOGIES, INC.", + [3]byte{0, 96, 128}: "MICROTRONIX DATACOM LTD.", + [3]byte{0, 96, 129}: "TV/COM INTERNATIONAL", + [3]byte{0, 96, 130}: "NOVALINK TECHNOLOGIES, INC.", + [3]byte{0, 96, 131}: "Cisco Systems, Inc", + [3]byte{0, 96, 132}: "DIGITAL VIDEO", + [3]byte{0, 96, 133}: "Storage Concepts", + [3]byte{0, 96, 134}: "LOGIC REPLACEMENT TECH. LTD.", + [3]byte{0, 96, 135}: "KANSAI ELECTRIC CO., LTD.", + [3]byte{0, 96, 136}: "Analog Devices, Inc.", + [3]byte{0, 96, 137}: "XATA", + [3]byte{0, 96, 138}: "CITADEL COMPUTER", + [3]byte{0, 96, 139}: "ConferTech International", + [3]byte{0, 96, 140}: "3COM CORPORATION", + [3]byte{0, 96, 141}: "UNIPULSE CORP.", + [3]byte{0, 96, 142}: "HE ELECTRONICS, TECHNOLOGIE & SYSTEMTECHNIK GmbH", + [3]byte{0, 96, 143}: "TEKRAM TECHNOLOGY CO., LTD.", + [3]byte{0, 96, 144}: "Artiza Networks Inc", + [3]byte{0, 96, 145}: "FIRST PACIFIC NETWORKS, INC.", + [3]byte{0, 96, 146}: "MICRO/SYS, INC.", + [3]byte{0, 96, 147}: "VARIAN", + [3]byte{0, 96, 148}: "IBM Corp", + [3]byte{0, 96, 149}: "ACCU-TIME SYSTEMS, INC.", + [3]byte{0, 96, 150}: "T.S. MICROTECH INC.", + [3]byte{0, 96, 151}: "3COM CORPORATION", + [3]byte{0, 96, 152}: "HT COMMUNICATIONS", + [3]byte{0, 96, 153}: "SBE, Inc.", + [3]byte{0, 96, 154}: "NJK TECHNO CO.", + [3]byte{0, 96, 155}: "AstroNova, Inc", + [3]byte{0, 96, 156}: "Perkin-Elmer Incorporated", + [3]byte{0, 96, 157}: "PMI FOOD EQUIPMENT GROUP", + [3]byte{0, 96, 158}: "ASC X3 - INFORMATION TECHNOLOGY STANDARDS SECRETARIATS", + [3]byte{0, 96, 159}: "PHAST CORPORATION", + [3]byte{0, 96, 160}: "SWITCHED NETWORK TECHNOLOGIES, INC.", + [3]byte{0, 96, 161}: "VPNet, Inc.", + [3]byte{0, 96, 162}: "NIHON UNISYS LIMITED CO.", + [3]byte{0, 96, 163}: "CONTINUUM TECHNOLOGY CORP.", + [3]byte{0, 96, 164}: "GEW Technologies (PTY)Ltd", + [3]byte{0, 96, 165}: "PERFORMANCE TELECOM CORP.", + [3]byte{0, 96, 166}: "PARTICLE MEASURING SYSTEMS", + [3]byte{0, 96, 167}: "MICROSENS GmbH & CO. KG", + [3]byte{0, 96, 168}: "TIDOMAT AB", + [3]byte{0, 96, 169}: "GESYTEC MBH", + [3]byte{0, 96, 170}: "INTELLIGENT DEVICES INC. (IDI)", + [3]byte{0, 96, 171}: "LARSCOM INCORPORATED", + [3]byte{0, 96, 172}: "RESILIENCE CORPORATION", + [3]byte{0, 96, 173}: "MegaChips Corporation", + [3]byte{0, 96, 174}: "TRIO INFORMATION SYSTEMS AB", + [3]byte{0, 96, 175}: "PACIFIC MICRO DATA, INC.", + [3]byte{0, 96, 176}: "Hewlett Packard", + [3]byte{0, 96, 177}: "Input/Output, Inc.", + [3]byte{0, 96, 178}: "PROCESS CONTROL CORP.", + [3]byte{0, 96, 179}: "Z-COM, INC.", + [3]byte{0, 96, 180}: "GLENAYRE R&D INC.", + [3]byte{0, 96, 181}: "KEBA GmbH", + [3]byte{0, 96, 182}: "LAND COMPUTER CO., LTD.", + [3]byte{0, 96, 183}: "CHANNELMATIC, INC.", + [3]byte{0, 96, 184}: "CORELIS Inc.", + [3]byte{0, 96, 185}: "NEC Platforms, Ltd", + [3]byte{0, 96, 186}: "SAHARA NETWORKS, INC.", + [3]byte{0, 96, 187}: "Cabletron Systems, Inc.", + [3]byte{0, 96, 188}: "KeunYoung Electronics & Communication Co., Ltd.", + [3]byte{0, 96, 189}: "Enginuity Communications", + [3]byte{0, 96, 190}: "WEBTRONICS", + [3]byte{0, 96, 191}: "MACRAIGOR SYSTEMS, INC.", + [3]byte{0, 96, 192}: "Nera Networks AS", + [3]byte{0, 96, 193}: "WaveSpan Corporation", + [3]byte{0, 96, 194}: "MPL AG", + [3]byte{0, 96, 195}: "NETVISION CORPORATION", + [3]byte{0, 96, 196}: "SOLITON SYSTEMS K.K.", + [3]byte{0, 96, 197}: "ANCOT CORP.", + [3]byte{0, 96, 198}: "DCS AG", + [3]byte{0, 96, 199}: "AMATI COMMUNICATIONS CORP.", + [3]byte{0, 96, 200}: "KUKA WELDING SYSTEMS & ROBOTS", + [3]byte{0, 96, 201}: "ControlNet, Inc.", + [3]byte{0, 96, 202}: "HARMONIC SYSTEMS INCORPORATED", + [3]byte{0, 96, 203}: "HITACHI ZOSEN CORPORATION", + [3]byte{0, 96, 204}: "EMTRAK, INCORPORATED", + [3]byte{0, 96, 205}: "VideoServer, Inc.", + [3]byte{0, 96, 206}: "ACCLAIM COMMUNICATIONS", + [3]byte{0, 96, 207}: "ALTEON NETWORKS, INC.", + [3]byte{0, 96, 208}: "SNMP RESEARCH INCORPORATED", + [3]byte{0, 96, 209}: "CASCADE COMMUNICATIONS", + [3]byte{0, 96, 210}: "LUCENT TECHNOLOGIES TAIWAN TELECOMMUNICATIONS CO., LTD.", + [3]byte{0, 96, 211}: "AT&T", + [3]byte{0, 96, 212}: "ELDAT COMMUNICATION LTD.", + [3]byte{0, 96, 213}: "AMADA MIYACHI Co., Ltd", + [3]byte{0, 96, 214}: "NovAtel Inc.", + [3]byte{0, 96, 215}: "ECOLE POLYTECHNIQUE FEDERALE DE LAUSANNE (EPFL)", + [3]byte{0, 96, 216}: "ELMIC SYSTEMS, INC.", + [3]byte{0, 96, 217}: "TRANSYS NETWORKS INC.", + [3]byte{0, 96, 218}: "Red Lion Controls, LP", + [3]byte{0, 96, 219}: "NTP ELEKTRONIK A/S", + [3]byte{0, 96, 220}: "NEC Magnus Communications,Ltd.", + [3]byte{0, 96, 221}: "MYRICOM, INC.", + [3]byte{0, 96, 222}: "Kayser-Threde GmbH", + [3]byte{0, 96, 223}: "Brocade Communications Systems, Inc.", + [3]byte{0, 96, 224}: "AXIOM TECHNOLOGY CO., LTD.", + [3]byte{0, 96, 225}: "ORCKIT COMMUNICATIONS LTD.", + [3]byte{0, 96, 226}: "QUEST ENGINEERING & DEVELOPMENT", + [3]byte{0, 96, 227}: "ARBIN INSTRUMENTS", + [3]byte{0, 96, 228}: "COMPUSERVE, INC.", + [3]byte{0, 96, 229}: "FUJI AUTOMATION CO., LTD.", + [3]byte{0, 96, 230}: "SHOMITI SYSTEMS INCORPORATED", + [3]byte{0, 96, 231}: "RANDATA", + [3]byte{0, 96, 232}: "HITACHI COMPUTER PRODUCTS (AMERICA), INC.", + [3]byte{0, 96, 233}: "ATOP TECHNOLOGIES, INC.", + [3]byte{0, 96, 234}: "StreamLogic", + [3]byte{0, 96, 235}: "FOURTHTRACK SYSTEMS", + [3]byte{0, 96, 236}: "HERMARY OPTO ELECTRONICS INC.", + [3]byte{0, 96, 237}: "RICARDO TEST AUTOMATION LTD.", + [3]byte{0, 96, 238}: "APOLLO", + [3]byte{0, 96, 239}: "FLYTECH TECHNOLOGY CO., LTD.", + [3]byte{0, 96, 240}: "JOHNSON & JOHNSON MEDICAL, INC", + [3]byte{0, 96, 241}: "EXP COMPUTER, INC.", + [3]byte{0, 96, 242}: "LASERGRAPHICS, INC.", + [3]byte{0, 96, 243}: "Performance Analysis Broadband, Spirent plc", + [3]byte{0, 96, 244}: "ADVANCED COMPUTER SOLUTIONS, Inc.", + [3]byte{0, 96, 245}: "ICON WEST, INC.", + [3]byte{0, 96, 246}: "NEXTEST COMMUNICATIONS PRODUCTS, INC.", + [3]byte{0, 96, 247}: "DATAFUSION SYSTEMS", + [3]byte{0, 96, 248}: "Loran International Technologies Inc.", + [3]byte{0, 96, 249}: "DIAMOND LANE COMMUNICATIONS", + [3]byte{0, 96, 250}: "EDUCATIONAL TECHNOLOGY RESOURCES, INC.", + [3]byte{0, 96, 251}: "PACKETEER, INC.", + [3]byte{0, 96, 252}: "CONSERVATION THROUGH INNOVATION LTD.", + [3]byte{0, 96, 253}: "NetICs, Inc.", + [3]byte{0, 96, 254}: "LYNX SYSTEM DEVELOPERS, INC.", + [3]byte{0, 96, 255}: "QuVis, Inc.", + [3]byte{0, 97, 113}: "Apple, Inc.", + [3]byte{0, 98, 236}: "Cisco Systems, Inc", + [3]byte{0, 100, 64}: "Cisco Systems, Inc", + [3]byte{0, 100, 166}: "Maquet CardioVascular", + [3]byte{0, 102, 75}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{0, 107, 142}: "Shanghai Feixun Communication Co.,Ltd.", + [3]byte{0, 107, 158}: "Vizio, Inc", + [3]byte{0, 107, 160}: "SHENZHEN UNIVERSAL INTELLISYS PTE LTD", + [3]byte{0, 107, 241}: "Cisco Systems, Inc", + [3]byte{0, 108, 188}: "Cisco Systems, Inc", + [3]byte{0, 108, 253}: "Sichuan Changhong Electric Ltd.", + [3]byte{0, 109, 82}: "Apple, Inc.", + [3]byte{0, 109, 251}: "Vutrix Technologies Ltd", + [3]byte{0, 111, 100}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 112, 176}: "M/A-COM INC. COMPANIES", + [3]byte{0, 112, 179}: "DATA RECALL LTD.", + [3]byte{0, 113, 194}: "PEGATRON CORPORATION", + [3]byte{0, 113, 204}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{0, 114, 99}: "Netcore Technology Inc.", + [3]byte{0, 115, 141}: "Shenzhen TINNO Mobile Technology Corp.", + [3]byte{0, 115, 224}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 116, 156}: "Ruijie Networks Co.,LTD", + [3]byte{0, 117, 50}: "INID BV", + [3]byte{0, 117, 225}: "Ampt, LLC", + [3]byte{0, 118, 134}: "Cisco Systems, Inc", + [3]byte{0, 118, 177}: "Somfy-Protect By Myfox SAS", + [3]byte{0, 120, 136}: "Cisco Systems, Inc", + [3]byte{0, 120, 158}: "Sagemcom Broadband SAS", + [3]byte{0, 120, 205}: "Ignition Design Labs", + [3]byte{0, 123, 24}: "SENTRY Co., LTD.", + [3]byte{0, 125, 250}: "Volkswagen Group of America", + [3]byte{0, 126, 86}: "China Dragon Technology Limited", + [3]byte{0, 127, 40}: "Actiontec Electronics, Inc", + [3]byte{0, 128, 0}: "MULTITECH SYSTEMS, INC.", + [3]byte{0, 128, 1}: "PERIPHONICS CORPORATION", + [3]byte{0, 128, 2}: "SATELCOM (UK) LTD", + [3]byte{0, 128, 3}: "HYTEC ELECTRONICS LTD.", + [3]byte{0, 128, 4}: "ANTLOW COMMUNICATIONS, LTD.", + [3]byte{0, 128, 5}: "CACTUS COMPUTER INC.", + [3]byte{0, 128, 6}: "COMPUADD CORPORATION", + [3]byte{0, 128, 7}: "DLOG NC-SYSTEME", + [3]byte{0, 128, 8}: "DYNATECH COMPUTER SYSTEMS", + [3]byte{0, 128, 9}: "JUPITER SYSTEMS, INC.", + [3]byte{0, 128, 10}: "JAPAN COMPUTER CORP.", + [3]byte{0, 128, 11}: "CSK CORPORATION", + [3]byte{0, 128, 12}: "VIDECOM LIMITED", + [3]byte{0, 128, 13}: "VOSSWINKEL F.U.", + [3]byte{0, 128, 14}: "ATLANTIX CORPORATION", + [3]byte{0, 128, 15}: "STANDARD MICROSYSTEMS", + [3]byte{0, 128, 16}: "COMMODORE INTERNATIONAL", + [3]byte{0, 128, 17}: "DIGITAL SYSTEMS INT'L. INC.", + [3]byte{0, 128, 18}: "INTEGRATED MEASUREMENT SYSTEMS", + [3]byte{0, 128, 19}: "THOMAS-CONRAD CORPORATION", + [3]byte{0, 128, 20}: "ESPRIT SYSTEMS", + [3]byte{0, 128, 21}: "SEIKO SYSTEMS, INC.", + [3]byte{0, 128, 22}: "WANDEL AND GOLTERMANN", + [3]byte{0, 128, 23}: "PFU LIMITED", + [3]byte{0, 128, 24}: "KOBE STEEL, LTD.", + [3]byte{0, 128, 25}: "DAYNA COMMUNICATIONS, INC.", + [3]byte{0, 128, 26}: "BELL ATLANTIC", + [3]byte{0, 128, 27}: "KODIAK TECHNOLOGY", + [3]byte{0, 128, 28}: "NEWPORT SYSTEMS SOLUTIONS", + [3]byte{0, 128, 29}: "INTEGRATED INFERENCE MACHINES", + [3]byte{0, 128, 30}: "XINETRON, INC.", + [3]byte{0, 128, 31}: "KRUPP ATLAS ELECTRONIK GMBH", + [3]byte{0, 128, 32}: "NETWORK PRODUCTS", + [3]byte{0, 128, 33}: "Alcatel Canada Inc.", + [3]byte{0, 128, 34}: "SCAN-OPTICS", + [3]byte{0, 128, 35}: "INTEGRATED BUSINESS NETWORKS", + [3]byte{0, 128, 36}: "KALPANA, INC.", + [3]byte{0, 128, 37}: "Telit Wireless Solutions GmbH", + [3]byte{0, 128, 38}: "NETWORK PRODUCTS CORPORATION", + [3]byte{0, 128, 39}: "ADAPTIVE SYSTEMS, INC.", + [3]byte{0, 128, 40}: "TRADPOST (HK) LTD", + [3]byte{0, 128, 41}: "EAGLE TECHNOLOGY, INC.", + [3]byte{0, 128, 42}: "TEST SYSTEMS & SIMULATIONS INC", + [3]byte{0, 128, 43}: "INTEGRATED MARKETING CO", + [3]byte{0, 128, 44}: "THE SAGE GROUP PLC", + [3]byte{0, 128, 45}: "XYLOGICS INC", + [3]byte{0, 128, 46}: "CASTLE ROCK COMPUTING", + [3]byte{0, 128, 47}: "NATIONAL INSTRUMENTS CORP.", + [3]byte{0, 128, 48}: "NEXUS ELECTRONICS", + [3]byte{0, 128, 49}: "BASYS, CORP.", + [3]byte{0, 128, 50}: "ACCESS CO., LTD.", + [3]byte{0, 128, 51}: "EMS Aviation, Inc.", + [3]byte{0, 128, 52}: "SMT GOUPIL", + [3]byte{0, 128, 53}: "TECHNOLOGY WORKS, INC.", + [3]byte{0, 128, 54}: "REFLEX MANUFACTURING SYSTEMS", + [3]byte{0, 128, 55}: "Ericsson Group", + [3]byte{0, 128, 56}: "DATA RESEARCH & APPLICATIONS", + [3]byte{0, 128, 57}: "ALCATEL STC AUSTRALIA", + [3]byte{0, 128, 58}: "VARITYPER, INC.", + [3]byte{0, 128, 59}: "APT COMMUNICATIONS, INC.", + [3]byte{0, 128, 60}: "TVS ELECTRONICS LTD", + [3]byte{0, 128, 61}: "SURIGIKEN CO., LTD.", + [3]byte{0, 128, 62}: "SYNERNETICS", + [3]byte{0, 128, 63}: "TATUNG COMPANY", + [3]byte{0, 128, 64}: "JOHN FLUKE MANUFACTURING CO.", + [3]byte{0, 128, 65}: "VEB KOMBINAT ROBOTRON", + [3]byte{0, 128, 66}: "Artesyn Embedded Technologies", + [3]byte{0, 128, 67}: "NETWORLD, INC.", + [3]byte{0, 128, 68}: "SYSTECH COMPUTER CORP.", + [3]byte{0, 128, 69}: "MATSUSHITA ELECTRIC IND. CO", + [3]byte{0, 128, 70}: "Tattile SRL", + [3]byte{0, 128, 71}: "IN-NET CORP.", + [3]byte{0, 128, 72}: "COMPEX INCORPORATED", + [3]byte{0, 128, 73}: "NISSIN ELECTRIC CO., LTD.", + [3]byte{0, 128, 74}: "PRO-LOG", + [3]byte{0, 128, 75}: "EAGLE TECHNOLOGIES PTY.LTD.", + [3]byte{0, 128, 76}: "CONTEC CO., LTD.", + [3]byte{0, 128, 77}: "CYCLONE MICROSYSTEMS, INC.", + [3]byte{0, 128, 78}: "APEX COMPUTER COMPANY", + [3]byte{0, 128, 79}: "DAIKIN INDUSTRIES, LTD.", + [3]byte{0, 128, 80}: "ZIATECH CORPORATION", + [3]byte{0, 128, 81}: "FIBERMUX", + [3]byte{0, 128, 82}: "TECHNICALLY ELITE CONCEPTS", + [3]byte{0, 128, 83}: "INTELLICOM, INC.", + [3]byte{0, 128, 84}: "FRONTIER TECHNOLOGIES CORP.", + [3]byte{0, 128, 85}: "FERMILAB", + [3]byte{0, 128, 86}: "SPHINX Electronics GmbH & Co KG", + [3]byte{0, 128, 87}: "ADSOFT, LTD.", + [3]byte{0, 128, 88}: "PRINTER SYSTEMS CORP.", + [3]byte{0, 128, 89}: "STANLEY ELECTRIC CO., LTD", + [3]byte{0, 128, 90}: "TULIP COMPUTERS INTERNAT'L B.V", + [3]byte{0, 128, 91}: "CONDOR SYSTEMS, INC.", + [3]byte{0, 128, 92}: "AGILIS CORPORATION", + [3]byte{0, 128, 93}: "CANSTAR", + [3]byte{0, 128, 94}: "LSI LOGIC CORPORATION", + [3]byte{0, 128, 95}: "Hewlett Packard", + [3]byte{0, 128, 96}: "NETWORK INTERFACE CORPORATION", + [3]byte{0, 128, 97}: "LITTON SYSTEMS, INC.", + [3]byte{0, 128, 98}: "INTERFACE CO.", + [3]byte{0, 128, 99}: "Hirschmann Automation and Control GmbH", + [3]byte{0, 128, 100}: "WYSE TECHNOLOGY LLC", + [3]byte{0, 128, 101}: "CYBERGRAPHIC SYSTEMS PTY LTD.", + [3]byte{0, 128, 102}: "ARCOM CONTROL SYSTEMS, LTD.", + [3]byte{0, 128, 103}: "SQUARE D COMPANY", + [3]byte{0, 128, 104}: "YAMATECH SCIENTIFIC LTD.", + [3]byte{0, 128, 105}: "COMPUTONE SYSTEMS", + [3]byte{0, 128, 106}: "ERI (EMPAC RESEARCH INC.)", + [3]byte{0, 128, 107}: "SCHMID TELECOMMUNICATION", + [3]byte{0, 128, 108}: "Secure Systems & Services", + [3]byte{0, 128, 109}: "CENTURY SYSTEMS CORP.", + [3]byte{0, 128, 110}: "NIPPON STEEL CORPORATION", + [3]byte{0, 128, 111}: "ONELAN LTD.", + [3]byte{0, 128, 112}: "COMPUTADORAS MICRON", + [3]byte{0, 128, 113}: "SAI TECHNOLOGY", + [3]byte{0, 128, 114}: "MICROPLEX SYSTEMS LTD.", + [3]byte{0, 128, 115}: "DWB ASSOCIATES", + [3]byte{0, 128, 116}: "FISHER CONTROLS", + [3]byte{0, 128, 117}: "PARSYTEC GMBH", + [3]byte{0, 128, 118}: "MCNC", + [3]byte{0, 128, 119}: "Brother industries, LTD.", + [3]byte{0, 128, 120}: "PRACTICAL PERIPHERALS, INC.", + [3]byte{0, 128, 121}: "MICROBUS DESIGNS LTD.", + [3]byte{0, 128, 122}: "AITECH SYSTEMS LTD.", + [3]byte{0, 128, 123}: "ARTEL COMMUNICATIONS CORP.", + [3]byte{0, 128, 124}: "FIBERCOM, INC.", + [3]byte{0, 128, 125}: "EQUINOX SYSTEMS INC.", + [3]byte{0, 128, 126}: "SOUTHERN PACIFIC LTD.", + [3]byte{0, 128, 127}: "DY-4 INCORPORATED", + [3]byte{0, 128, 128}: "DATAMEDIA CORPORATION", + [3]byte{0, 128, 129}: "KENDALL SQUARE RESEARCH CORP.", + [3]byte{0, 128, 130}: "PEP MODULAR COMPUTERS GMBH", + [3]byte{0, 128, 131}: "AMDAHL", + [3]byte{0, 128, 132}: "THE CLOUD INC.", + [3]byte{0, 128, 133}: "H-THREE SYSTEMS CORPORATION", + [3]byte{0, 128, 134}: "COMPUTER GENERATION INC.", + [3]byte{0, 128, 135}: "OKI ELECTRIC INDUSTRY CO., LTD", + [3]byte{0, 128, 136}: "VICTOR COMPANY OF JAPAN, LTD.", + [3]byte{0, 128, 137}: "TECNETICS (PTY) LTD.", + [3]byte{0, 128, 138}: "SUMMIT MICROSYSTEMS CORP.", + [3]byte{0, 128, 139}: "DACOLL LIMITED", + [3]byte{0, 128, 140}: "NetScout Systems, Inc.", + [3]byte{0, 128, 141}: "WESTCOAST TECHNOLOGY B.V.", + [3]byte{0, 128, 142}: "RADSTONE TECHNOLOGY", + [3]byte{0, 128, 143}: "C. ITOH ELECTRONICS, INC.", + [3]byte{0, 128, 144}: "MICROTEK INTERNATIONAL, INC.", + [3]byte{0, 128, 145}: "TOKYO ELECTRIC CO.,LTD", + [3]byte{0, 128, 146}: "Silex Technology, Inc.", + [3]byte{0, 128, 147}: "XYRON CORPORATION", + [3]byte{0, 128, 148}: "ALFA LAVAL AUTOMATION AB", + [3]byte{0, 128, 149}: "BASIC MERTON HANDELSGES.M.B.H.", + [3]byte{0, 128, 150}: "HUMAN DESIGNED SYSTEMS, INC.", + [3]byte{0, 128, 151}: "CENTRALP AUTOMATISMES", + [3]byte{0, 128, 152}: "TDK CORPORATION", + [3]byte{0, 128, 153}: "Eaton Industries GmbH", + [3]byte{0, 128, 154}: "NOVUS NETWORKS LTD", + [3]byte{0, 128, 155}: "JUSTSYSTEM CORPORATION", + [3]byte{0, 128, 156}: "LUXCOM, INC.", + [3]byte{0, 128, 157}: "Commscraft Ltd.", + [3]byte{0, 128, 158}: "DATUS GMBH", + [3]byte{0, 128, 159}: "ALE International", + [3]byte{0, 128, 160}: "Hewlett Packard", + [3]byte{0, 128, 161}: "MICROTEST, INC.", + [3]byte{0, 128, 162}: "CREATIVE ELECTRONIC SYSTEMS", + [3]byte{0, 128, 163}: "Lantronix", + [3]byte{0, 128, 164}: "LIBERTY ELECTRONICS", + [3]byte{0, 128, 165}: "SPEED INTERNATIONAL", + [3]byte{0, 128, 166}: "REPUBLIC TECHNOLOGY, INC.", + [3]byte{0, 128, 167}: "Honeywell International Inc", + [3]byte{0, 128, 168}: "VITACOM CORPORATION", + [3]byte{0, 128, 169}: "CLEARPOINT RESEARCH", + [3]byte{0, 128, 170}: "MAXPEED", + [3]byte{0, 128, 171}: "DUKANE NETWORK INTEGRATION", + [3]byte{0, 128, 172}: "IMLOGIX, DIVISION OF GENESYS", + [3]byte{0, 128, 173}: "CNET TECHNOLOGY, INC.", + [3]byte{0, 128, 174}: "HUGHES NETWORK SYSTEMS", + [3]byte{0, 128, 175}: "ALLUMER CO., LTD.", + [3]byte{0, 128, 176}: "ADVANCED INFORMATION", + [3]byte{0, 128, 177}: "SOFTCOM A/S", + [3]byte{0, 128, 178}: "NETWORK EQUIPMENT TECHNOLOGIES", + [3]byte{0, 128, 179}: "AVAL DATA CORPORATION", + [3]byte{0, 128, 180}: "SOPHIA SYSTEMS", + [3]byte{0, 128, 181}: "UNITED NETWORKS INC.", + [3]byte{0, 128, 182}: "THEMIS COMPUTER", + [3]byte{0, 128, 183}: "STELLAR COMPUTER", + [3]byte{0, 128, 184}: "DMG MORI B.U.G. CO., LTD.", + [3]byte{0, 128, 185}: "ARCHE TECHNOLIGIES INC.", + [3]byte{0, 128, 186}: "SPECIALIX (ASIA) PTE, LTD", + [3]byte{0, 128, 187}: "HUGHES LAN SYSTEMS", + [3]byte{0, 128, 188}: "HITACHI ENGINEERING CO., LTD", + [3]byte{0, 128, 189}: "THE FURUKAWA ELECTRIC CO., LTD", + [3]byte{0, 128, 190}: "ARIES RESEARCH", + [3]byte{0, 128, 191}: "TAKAOKA ELECTRIC MFG. CO. LTD.", + [3]byte{0, 128, 192}: "PENRIL DATACOMM", + [3]byte{0, 128, 193}: "LANEX CORPORATION", + [3]byte{0, 128, 194}: "IEEE 802.1 Working Group", + [3]byte{0, 128, 195}: "BICC INFORMATION SYSTEMS & SVC", + [3]byte{0, 128, 196}: "DOCUMENT TECHNOLOGIES, INC.", + [3]byte{0, 128, 197}: "NOVELLCO DE MEXICO", + [3]byte{0, 128, 198}: "NATIONAL DATACOMM CORPORATION", + [3]byte{0, 128, 199}: "XIRCOM", + [3]byte{0, 128, 200}: "D-LINK SYSTEMS, INC.", + [3]byte{0, 128, 201}: "ALBERTA MICROELECTRONIC CENTRE", + [3]byte{0, 128, 202}: "NETCOM RESEARCH INCORPORATED", + [3]byte{0, 128, 203}: "FALCO DATA PRODUCTS", + [3]byte{0, 128, 204}: "MICROWAVE BYPASS SYSTEMS", + [3]byte{0, 128, 205}: "MICRONICS COMPUTER, INC.", + [3]byte{0, 128, 206}: "BROADCAST TELEVISION SYSTEMS", + [3]byte{0, 128, 207}: "EMBEDDED PERFORMANCE INC.", + [3]byte{0, 128, 208}: "COMPUTER PERIPHERALS, INC.", + [3]byte{0, 128, 209}: "KIMTRON CORPORATION", + [3]byte{0, 128, 210}: "SHINNIHONDENKO CO., LTD.", + [3]byte{0, 128, 211}: "SHIVA CORP.", + [3]byte{0, 128, 212}: "CHASE RESEARCH LTD.", + [3]byte{0, 128, 213}: "CADRE TECHNOLOGIES", + [3]byte{0, 128, 214}: "NUVOTECH, INC.", + [3]byte{0, 128, 215}: "Fantum Engineering", + [3]byte{0, 128, 216}: "NETWORK PERIPHERALS INC.", + [3]byte{0, 128, 217}: "EMK Elektronik GmbH & Co. KG", + [3]byte{0, 128, 218}: "Bruel & Kjaer Sound & Vibration Measurement A/S", + [3]byte{0, 128, 219}: "GRAPHON CORPORATION", + [3]byte{0, 128, 220}: "PICKER INTERNATIONAL", + [3]byte{0, 128, 221}: "GMX INC/GIMIX", + [3]byte{0, 128, 222}: "GIPSI S.A.", + [3]byte{0, 128, 223}: "ADC CODENOLL TECHNOLOGY CORP.", + [3]byte{0, 128, 224}: "XTP SYSTEMS, INC.", + [3]byte{0, 128, 225}: "STMicroelectronics SRL", + [3]byte{0, 128, 226}: "T.D.I. CO., LTD.", + [3]byte{0, 128, 227}: "CORAL NETWORK CORPORATION", + [3]byte{0, 128, 228}: "NORTHWEST DIGITAL SYSTEMS, INC", + [3]byte{0, 128, 229}: "NetApp", + [3]byte{0, 128, 230}: "PEER NETWORKS, INC.", + [3]byte{0, 128, 231}: "Leonardo Tactical Systems.", + [3]byte{0, 128, 232}: "CUMULUS CORPORATIION", + [3]byte{0, 128, 233}: "Madge Ltd.", + [3]byte{0, 128, 234}: "ADVA Optical Networking Ltd.", + [3]byte{0, 128, 235}: "COMPCONTROL B.V.", + [3]byte{0, 128, 236}: "SUPERCOMPUTING SOLUTIONS, INC.", + [3]byte{0, 128, 237}: "IQ TECHNOLOGIES, INC.", + [3]byte{0, 128, 238}: "THOMSON CSF", + [3]byte{0, 128, 239}: "RATIONAL", + [3]byte{0, 128, 240}: "Panasonic Communications Co., Ltd.", + [3]byte{0, 128, 241}: "OPUS SYSTEMS", + [3]byte{0, 128, 242}: "RAYCOM SYSTEMS INC", + [3]byte{0, 128, 243}: "SUN ELECTRONICS CORP.", + [3]byte{0, 128, 244}: "TELEMECANIQUE ELECTRIQUE", + [3]byte{0, 128, 245}: "Quantel Ltd", + [3]byte{0, 128, 246}: "SYNERGY MICROSYSTEMS", + [3]byte{0, 128, 247}: "Zenith Electronics Corporation", + [3]byte{0, 128, 248}: "MIZAR, INC.", + [3]byte{0, 128, 249}: "HEURIKON CORPORATION", + [3]byte{0, 128, 250}: "RWT GMBH", + [3]byte{0, 128, 251}: "BVM LIMITED", + [3]byte{0, 128, 252}: "AVATAR CORPORATION", + [3]byte{0, 128, 253}: "EXSCEED CORPRATION", + [3]byte{0, 128, 254}: "AZURE TECHNOLOGIES, INC.", + [3]byte{0, 128, 255}: "SOC. DE TELEINFORMATIQUE RTC", + [3]byte{0, 129, 196}: "Cisco Systems, Inc", + [3]byte{0, 129, 249}: "Texas Instruments", + [3]byte{0, 132, 237}: "Private", + [3]byte{0, 134, 156}: "Palo Alto Networks", + [3]byte{0, 134, 160}: "Private", + [3]byte{0, 135, 1}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 135, 49}: "Cisco Systems, Inc", + [3]byte{0, 136, 101}: "Apple, Inc.", + [3]byte{0, 138, 150}: "Cisco Systems, Inc", + [3]byte{0, 139, 67}: "RFTECH", + [3]byte{0, 139, 252}: "mixi,Inc.", + [3]byte{0, 140, 16}: "Black Box Corp.", + [3]byte{0, 140, 84}: "ADB Broadband Italia", + [3]byte{0, 140, 250}: "INVENTEC Corporation", + [3]byte{0, 141, 78}: "CJSC NII STT", + [3]byte{0, 141, 218}: "Link One Co., Ltd.", + [3]byte{0, 142, 115}: "Cisco Systems, Inc", + [3]byte{0, 142, 242}: "NETGEAR", + [3]byte{0, 144, 0}: "DIAMOND MULTIMEDIA", + [3]byte{0, 144, 1}: "NISHIMU ELECTRONICS INDUSTRIES CO., LTD.", + [3]byte{0, 144, 2}: "ALLGON AB", + [3]byte{0, 144, 3}: "APLIO", + [3]byte{0, 144, 4}: "3COM EUROPE LTD.", + [3]byte{0, 144, 5}: "PROTECH SYSTEMS CO., LTD.", + [3]byte{0, 144, 6}: "Hamamatsu Photonics K.K.", + [3]byte{0, 144, 7}: "DOMEX TECHNOLOGY CORP.", + [3]byte{0, 144, 8}: "HanA Systems Inc.", + [3]byte{0, 144, 9}: "I Controls, Inc.", + [3]byte{0, 144, 10}: "PROTON ELECTRONIC INDUSTRIAL CO., LTD.", + [3]byte{0, 144, 11}: "LANNER ELECTRONICS, INC.", + [3]byte{0, 144, 12}: "Cisco Systems, Inc", + [3]byte{0, 144, 13}: "Overland Storage Inc.", + [3]byte{0, 144, 14}: "HANDLINK TECHNOLOGIES, INC.", + [3]byte{0, 144, 15}: "KAWASAKI HEAVY INDUSTRIES, LTD", + [3]byte{0, 144, 16}: "SIMULATION LABORATORIES, INC.", + [3]byte{0, 144, 17}: "WAVTrace, Inc.", + [3]byte{0, 144, 18}: "GLOBESPAN SEMICONDUCTOR, INC.", + [3]byte{0, 144, 19}: "SAMSAN CORP.", + [3]byte{0, 144, 20}: "ROTORK INSTRUMENTS, LTD.", + [3]byte{0, 144, 21}: "CENTIGRAM COMMUNICATIONS CORP.", + [3]byte{0, 144, 22}: "ZAC", + [3]byte{0, 144, 23}: "Zypcom, Inc", + [3]byte{0, 144, 24}: "ITO ELECTRIC INDUSTRY CO, LTD.", + [3]byte{0, 144, 25}: "HERMES ELECTRONICS CO., LTD.", + [3]byte{0, 144, 26}: "UNISPHERE SOLUTIONS", + [3]byte{0, 144, 27}: "DIGITAL CONTROLS", + [3]byte{0, 144, 28}: "mps Software Gmbh", + [3]byte{0, 144, 29}: "PEC (NZ) LTD.", + [3]byte{0, 144, 30}: "Selesta Ingegneria S.p.A.", + [3]byte{0, 144, 31}: "ADTEC PRODUCTIONS, INC.", + [3]byte{0, 144, 32}: "PHILIPS ANALYTICAL X-RAY B.V.", + [3]byte{0, 144, 33}: "Cisco Systems, Inc", + [3]byte{0, 144, 34}: "IVEX", + [3]byte{0, 144, 35}: "ZILOG INC.", + [3]byte{0, 144, 36}: "PIPELINKS, INC.", + [3]byte{0, 144, 37}: "BAE Systems Australia (Electronic Systems) Pty Ltd", + [3]byte{0, 144, 38}: "ADVANCED SWITCHING COMMUNICATIONS, INC.", + [3]byte{0, 144, 39}: "Intel Corporation", + [3]byte{0, 144, 40}: "NIPPON SIGNAL CO., LTD.", + [3]byte{0, 144, 41}: "CRYPTO AG", + [3]byte{0, 144, 42}: "COMMUNICATION DEVICES, INC.", + [3]byte{0, 144, 43}: "Cisco Systems, Inc", + [3]byte{0, 144, 44}: "DATA & CONTROL EQUIPMENT LTD.", + [3]byte{0, 144, 45}: "DATA ELECTRONICS (AUST.) PTY, LTD.", + [3]byte{0, 144, 46}: "NAMCO LIMITED", + [3]byte{0, 144, 47}: "NETCORE SYSTEMS, INC.", + [3]byte{0, 144, 48}: "HONEYWELL-DATING", + [3]byte{0, 144, 49}: "MYSTICOM, LTD.", + [3]byte{0, 144, 50}: "PELCOMBE GROUP LTD.", + [3]byte{0, 144, 51}: "INNOVAPHONE AG", + [3]byte{0, 144, 52}: "IMAGIC, INC.", + [3]byte{0, 144, 53}: "ALPHA TELECOM, INC.", + [3]byte{0, 144, 54}: "ens, inc.", + [3]byte{0, 144, 55}: "ACUCOMM, INC.", + [3]byte{0, 144, 56}: "FOUNTAIN TECHNOLOGIES, INC.", + [3]byte{0, 144, 57}: "SHASTA NETWORKS", + [3]byte{0, 144, 58}: "NIHON MEDIA TOOL INC.", + [3]byte{0, 144, 59}: "TriEMS Research Lab, Inc.", + [3]byte{0, 144, 60}: "ATLANTIC NETWORK SYSTEMS", + [3]byte{0, 144, 61}: "BIOPAC SYSTEMS, INC.", + [3]byte{0, 144, 62}: "N.V. PHILIPS INDUSTRIAL ACTIVITIES", + [3]byte{0, 144, 63}: "AZTEC RADIOMEDIA", + [3]byte{0, 144, 64}: "Siemens Network Convergence LLC", + [3]byte{0, 144, 65}: "APPLIED DIGITAL ACCESS", + [3]byte{0, 144, 66}: "ECCS, Inc.", + [3]byte{0, 144, 67}: "Tattile SRL", + [3]byte{0, 144, 68}: "ASSURED DIGITAL, INC.", + [3]byte{0, 144, 69}: "Marconi Communications", + [3]byte{0, 144, 70}: "DEXDYNE, LTD.", + [3]byte{0, 144, 71}: "GIGA FAST E. LTD.", + [3]byte{0, 144, 72}: "ZEAL CORPORATION", + [3]byte{0, 144, 73}: "ENTRIDIA CORPORATION", + [3]byte{0, 144, 74}: "CONCUR SYSTEM TECHNOLOGIES", + [3]byte{0, 144, 75}: "Gemtek Technology Co., Ltd.", + [3]byte{0, 144, 76}: "Epigram, Inc.", + [3]byte{0, 144, 77}: "SPEC S.A.", + [3]byte{0, 144, 78}: "DELEM BV", + [3]byte{0, 144, 79}: "ABB POWER T&D COMPANY, INC.", + [3]byte{0, 144, 80}: "Teleste Corporation", + [3]byte{0, 144, 81}: "ULTIMATE TECHNOLOGY CORP.", + [3]byte{0, 144, 82}: "SELCOM ELETTRONICA S.R.L.", + [3]byte{0, 144, 83}: "DAEWOO ELECTRONICS CO., LTD.", + [3]byte{0, 144, 84}: "INNOVATIVE SEMICONDUCTORS, INC", + [3]byte{0, 144, 85}: "PARKER HANNIFIN CORPORATION COMPUMOTOR DIVISION", + [3]byte{0, 144, 86}: "TELESTREAM, INC.", + [3]byte{0, 144, 87}: "AANetcom, Inc.", + [3]byte{0, 144, 88}: "Ultra Electronics Command & Control Systems", + [3]byte{0, 144, 89}: "TELECOM DEVICE K.K.", + [3]byte{0, 144, 90}: "DEARBORN GROUP, INC.", + [3]byte{0, 144, 91}: "RAYMOND AND LAE ENGINEERING", + [3]byte{0, 144, 92}: "EDMI", + [3]byte{0, 144, 93}: "NETCOM SICHERHEITSTECHNIK GMBH", + [3]byte{0, 144, 94}: "RAULAND-BORG CORPORATION", + [3]byte{0, 144, 95}: "Cisco Systems, Inc", + [3]byte{0, 144, 96}: "SYSTEM CREATE CORP.", + [3]byte{0, 144, 97}: "PACIFIC RESEARCH & ENGINEERING CORPORATION", + [3]byte{0, 144, 98}: "ICP VORTEX COMPUTERSYSTEME GmbH", + [3]byte{0, 144, 99}: "COHERENT COMMUNICATIONS SYSTEMS CORPORATION", + [3]byte{0, 144, 100}: "Thomson Inc.", + [3]byte{0, 144, 101}: "FINISAR CORPORATION", + [3]byte{0, 144, 102}: "Troika Networks, Inc.", + [3]byte{0, 144, 103}: "WalkAbout Computers, Inc.", + [3]byte{0, 144, 104}: "DVT CORP.", + [3]byte{0, 144, 105}: "Juniper Networks", + [3]byte{0, 144, 106}: "TURNSTONE SYSTEMS, INC.", + [3]byte{0, 144, 107}: "APPLIED RESOURCES, INC.", + [3]byte{0, 144, 108}: "Sartorius Hamburg GmbH", + [3]byte{0, 144, 109}: "Cisco Systems, Inc", + [3]byte{0, 144, 110}: "PRAXON, INC.", + [3]byte{0, 144, 111}: "Cisco Systems, Inc", + [3]byte{0, 144, 112}: "NEO NETWORKS, INC.", + [3]byte{0, 144, 113}: "Applied Innovation Inc.", + [3]byte{0, 144, 114}: "SIMRAD AS", + [3]byte{0, 144, 115}: "GAIO TECHNOLOGY", + [3]byte{0, 144, 116}: "ARGON NETWORKS, INC.", + [3]byte{0, 144, 117}: "NEC DO BRASIL S.A.", + [3]byte{0, 144, 118}: "FMT AIRCRAFT GATE SUPPORT SYSTEMS AB", + [3]byte{0, 144, 119}: "ADVANCED FIBRE COMMUNICATIONS", + [3]byte{0, 144, 120}: "MER TELEMANAGEMENT SOLUTIONS, LTD.", + [3]byte{0, 144, 121}: "ClearOne, Inc.", + [3]byte{0, 144, 122}: "Spectralink, Inc", + [3]byte{0, 144, 123}: "E-TECH, INC.", + [3]byte{0, 144, 124}: "DIGITALCAST, INC.", + [3]byte{0, 144, 125}: "Lake Communications", + [3]byte{0, 144, 126}: "VETRONIX CORP.", + [3]byte{0, 144, 127}: "WatchGuard Technologies, Inc.", + [3]byte{0, 144, 128}: "NOT LIMITED, INC.", + [3]byte{0, 144, 129}: "ALOHA NETWORKS, INC.", + [3]byte{0, 144, 130}: "FORCE INSTITUTE", + [3]byte{0, 144, 131}: "TURBO COMMUNICATION, INC.", + [3]byte{0, 144, 132}: "ATECH SYSTEM", + [3]byte{0, 144, 133}: "GOLDEN ENTERPRISES, INC.", + [3]byte{0, 144, 134}: "Cisco Systems, Inc", + [3]byte{0, 144, 135}: "ITIS", + [3]byte{0, 144, 136}: "BAXALL SECURITY LTD.", + [3]byte{0, 144, 137}: "SOFTCOM MICROSYSTEMS, INC.", + [3]byte{0, 144, 138}: "BAYLY COMMUNICATIONS, INC.", + [3]byte{0, 144, 139}: "Tattile SRL", + [3]byte{0, 144, 140}: "ETREND ELECTRONICS, INC.", + [3]byte{0, 144, 141}: "VICKERS ELECTRONICS SYSTEMS", + [3]byte{0, 144, 142}: "Nortel Networks Broadband Access", + [3]byte{0, 144, 143}: "AUDIO CODES LTD.", + [3]byte{0, 144, 144}: "I-BUS", + [3]byte{0, 144, 145}: "DigitalScape, Inc.", + [3]byte{0, 144, 146}: "Cisco Systems, Inc", + [3]byte{0, 144, 147}: "NANAO CORPORATION", + [3]byte{0, 144, 148}: "OSPREY TECHNOLOGIES, INC.", + [3]byte{0, 144, 149}: "UNIVERSAL AVIONICS", + [3]byte{0, 144, 150}: "ASKEY COMPUTER CORP", + [3]byte{0, 144, 151}: "Sycamore Networks", + [3]byte{0, 144, 152}: "SBC DESIGNS, INC.", + [3]byte{0, 144, 153}: "ALLIED TELESIS, K.K.", + [3]byte{0, 144, 154}: "ONE WORLD SYSTEMS, INC.", + [3]byte{0, 144, 155}: "MARKEM-IMAJE", + [3]byte{0, 144, 156}: "ARRIS Group, Inc.", + [3]byte{0, 144, 157}: "NovaTech Process Solutions, LLC", + [3]byte{0, 144, 158}: "Critical IO, LLC", + [3]byte{0, 144, 159}: "DIGI-DATA CORPORATION", + [3]byte{0, 144, 160}: "8X8 INC.", + [3]byte{0, 144, 161}: "Flying Pig Systems/High End Systems Inc.", + [3]byte{0, 144, 162}: "CyberTAN Technology Inc.", + [3]byte{0, 144, 163}: "Corecess Inc.", + [3]byte{0, 144, 164}: "ALTIGA NETWORKS", + [3]byte{0, 144, 165}: "SPECTRA LOGIC", + [3]byte{0, 144, 166}: "Cisco Systems, Inc", + [3]byte{0, 144, 167}: "CLIENTEC CORPORATION", + [3]byte{0, 144, 168}: "NineTiles Networks, Ltd.", + [3]byte{0, 144, 169}: "WESTERN DIGITAL", + [3]byte{0, 144, 170}: "INDIGO ACTIVE VISION SYSTEMS LIMITED", + [3]byte{0, 144, 171}: "Cisco Systems, Inc", + [3]byte{0, 144, 172}: "OPTIVISION, INC.", + [3]byte{0, 144, 173}: "ASPECT ELECTRONICS, INC.", + [3]byte{0, 144, 174}: "ITALTEL S.p.A/RF-UP-I", + [3]byte{0, 144, 175}: "J. MORITA MFG. CORP.", + [3]byte{0, 144, 176}: "VADEM", + [3]byte{0, 144, 177}: "Cisco Systems, Inc", + [3]byte{0, 144, 178}: "AVICI SYSTEMS INC.", + [3]byte{0, 144, 179}: "AGRANAT SYSTEMS", + [3]byte{0, 144, 180}: "WILLOWBROOK TECHNOLOGIES", + [3]byte{0, 144, 181}: "NIKON CORPORATION", + [3]byte{0, 144, 182}: "FIBEX SYSTEMS", + [3]byte{0, 144, 183}: "DIGITAL LIGHTWAVE, INC.", + [3]byte{0, 144, 184}: "ROHDE & SCHWARZ GMBH & CO. KG", + [3]byte{0, 144, 185}: "BERAN INSTRUMENTS LTD.", + [3]byte{0, 144, 186}: "VALID NETWORKS, INC.", + [3]byte{0, 144, 187}: "TAINET COMMUNICATION SYSTEM Corp.", + [3]byte{0, 144, 188}: "TELEMANN CO., LTD.", + [3]byte{0, 144, 189}: "OMNIA COMMUNICATIONS, INC.", + [3]byte{0, 144, 190}: "IBC/INTEGRATED BUSINESS COMPUTERS", + [3]byte{0, 144, 191}: "Cisco Systems, Inc", + [3]byte{0, 144, 192}: "K.J. LAW ENGINEERS, INC.", + [3]byte{0, 144, 193}: "Peco II, Inc.", + [3]byte{0, 144, 194}: "JK microsystems, Inc.", + [3]byte{0, 144, 195}: "TOPIC SEMICONDUCTOR CORP.", + [3]byte{0, 144, 196}: "JAVELIN SYSTEMS, INC.", + [3]byte{0, 144, 197}: "INTERNET MAGIC, INC.", + [3]byte{0, 144, 198}: "OPTIM SYSTEMS, INC.", + [3]byte{0, 144, 199}: "ICOM INC.", + [3]byte{0, 144, 200}: "WAVERIDER COMMUNICATIONS (CANADA) INC.", + [3]byte{0, 144, 201}: "DPAC Technologies", + [3]byte{0, 144, 202}: "ACCORD VIDEO TELECOMMUNICATIONS, LTD.", + [3]byte{0, 144, 203}: "Wireless OnLine, Inc.", + [3]byte{0, 144, 204}: "PLANEX COMMUNICATIONS INC.", + [3]byte{0, 144, 205}: "ENT-EMPRESA NACIONAL DE TELECOMMUNICACOES, S.A.", + [3]byte{0, 144, 206}: "TETRA GmbH", + [3]byte{0, 144, 207}: "NORTEL", + [3]byte{0, 144, 208}: "Thomson Telecom Belgium", + [3]byte{0, 144, 209}: "LEICHU ENTERPRISE CO., LTD.", + [3]byte{0, 144, 210}: "ARTEL VIDEO SYSTEMS", + [3]byte{0, 144, 211}: "GIESECKE & DEVRIENT GmbH", + [3]byte{0, 144, 212}: "BindView Development Corp.", + [3]byte{0, 144, 213}: "EUPHONIX, INC.", + [3]byte{0, 144, 214}: "Crystal Group, Inc.", + [3]byte{0, 144, 215}: "NetBoost Corp.", + [3]byte{0, 144, 216}: "WHITECROSS SYSTEMS", + [3]byte{0, 144, 217}: "Cisco Systems, Inc", + [3]byte{0, 144, 218}: "DYNARC, INC.", + [3]byte{0, 144, 219}: "NEXT LEVEL COMMUNICATIONS", + [3]byte{0, 144, 220}: "TECO INFORMATION SYSTEMS", + [3]byte{0, 144, 221}: "MIHARU COMMUNICATIONS Inc", + [3]byte{0, 144, 222}: "CARDKEY SYSTEMS, INC.", + [3]byte{0, 144, 223}: "MITSUBISHI CHEMICAL AMERICA, INC.", + [3]byte{0, 144, 224}: "SYSTRAN CORP.", + [3]byte{0, 144, 225}: "TELENA S.P.A.", + [3]byte{0, 144, 226}: "DISTRIBUTED PROCESSING TECHNOLOGY", + [3]byte{0, 144, 227}: "AVEX ELECTRONICS INC.", + [3]byte{0, 144, 228}: "NEC AMERICA, INC.", + [3]byte{0, 144, 229}: "TEKNEMA, INC.", + [3]byte{0, 144, 230}: "ALi Corporation", + [3]byte{0, 144, 231}: "HORSCH ELEKTRONIK AG", + [3]byte{0, 144, 232}: "MOXA TECHNOLOGIES CORP., LTD.", + [3]byte{0, 144, 233}: "JANZ COMPUTER AG", + [3]byte{0, 144, 234}: "ALPHA TECHNOLOGIES, INC.", + [3]byte{0, 144, 235}: "SENTRY TELECOM SYSTEMS", + [3]byte{0, 144, 236}: "PYRESCOM", + [3]byte{0, 144, 237}: "CENTRAL SYSTEM RESEARCH CO., LTD.", + [3]byte{0, 144, 238}: "PERSONAL COMMUNICATIONS TECHNOLOGIES", + [3]byte{0, 144, 239}: "INTEGRIX, INC.", + [3]byte{0, 144, 240}: "Harmonic Video Systems Ltd.", + [3]byte{0, 144, 241}: "Seagate Cloud Systems Inc", + [3]byte{0, 144, 242}: "Cisco Systems, Inc", + [3]byte{0, 144, 243}: "ASPECT COMMUNICATIONS", + [3]byte{0, 144, 244}: "LIGHTNING INSTRUMENTATION", + [3]byte{0, 144, 245}: "CLEVO CO.", + [3]byte{0, 144, 246}: "ESCALATE NETWORKS, INC.", + [3]byte{0, 144, 247}: "NBASE COMMUNICATIONS LTD.", + [3]byte{0, 144, 248}: "MEDIATRIX TELECOM", + [3]byte{0, 144, 249}: "Imagine Communications", + [3]byte{0, 144, 250}: "Emulex Corporation", + [3]byte{0, 144, 251}: "PORTWELL, INC.", + [3]byte{0, 144, 252}: "NETWORK COMPUTING DEVICES", + [3]byte{0, 144, 253}: "CopperCom, Inc.", + [3]byte{0, 144, 254}: "ELECOM CO., LTD. (LANEED DIV.)", + [3]byte{0, 144, 255}: "TELLUS TECHNOLOGY INC.", + [3]byte{0, 145, 214}: "Crystal Group, Inc.", + [3]byte{0, 145, 250}: "Synapse Product Development", + [3]byte{0, 146, 250}: "SHENZHEN WISKY TECHNOLOGY CO.,LTD", + [3]byte{0, 147, 99}: "Uni-Link Technology Co., Ltd.", + [3]byte{0, 148, 161}: "F5 Networks, Inc.", + [3]byte{0, 149, 105}: "LSD Science and Technology Co.,Ltd.", + [3]byte{0, 151, 255}: "Heimann Sensor GmbH", + [3]byte{0, 154, 205}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{0, 154, 210}: "Cisco Systems, Inc", + [3]byte{0, 156, 2}: "Hewlett Packard", + [3]byte{0, 157, 142}: "CARDIAC RECORDERS, INC.", + [3]byte{0, 158, 30}: "Cisco Systems, Inc", + [3]byte{0, 158, 200}: "Xiaomi Communications Co Ltd", + [3]byte{0, 160, 0}: "CENTILLION NETWORKS, INC.", + [3]byte{0, 160, 1}: "DRS Signal Solutions", + [3]byte{0, 160, 2}: "LEEDS & NORTHRUP AUSTRALIA PTY LTD", + [3]byte{0, 160, 3}: "Siemens Switzerland Ltd., I B T HVP", + [3]byte{0, 160, 4}: "NETPOWER, INC.", + [3]byte{0, 160, 5}: "DANIEL INSTRUMENTS, LTD.", + [3]byte{0, 160, 6}: "IMAGE DATA PROCESSING SYSTEM GROUP", + [3]byte{0, 160, 7}: "APEXX TECHNOLOGY, INC.", + [3]byte{0, 160, 8}: "NETCORP", + [3]byte{0, 160, 9}: "WHITETREE NETWORK", + [3]byte{0, 160, 10}: "Airspan", + [3]byte{0, 160, 11}: "COMPUTEX CO., LTD.", + [3]byte{0, 160, 12}: "KINGMAX TECHNOLOGY, INC.", + [3]byte{0, 160, 13}: "THE PANDA PROJECT", + [3]byte{0, 160, 14}: "NetScout Systems, Inc.", + [3]byte{0, 160, 15}: "Broadband Technologies", + [3]byte{0, 160, 16}: "SYSLOGIC DATENTECHNIK AG", + [3]byte{0, 160, 17}: "MUTOH INDUSTRIES LTD.", + [3]byte{0, 160, 18}: "Telco Systems, Inc.", + [3]byte{0, 160, 19}: "TELTREND LTD.", + [3]byte{0, 160, 20}: "CSIR", + [3]byte{0, 160, 21}: "WYLE", + [3]byte{0, 160, 22}: "MICROPOLIS CORP.", + [3]byte{0, 160, 23}: "J B M CORPORATION", + [3]byte{0, 160, 24}: "CREATIVE CONTROLLERS, INC.", + [3]byte{0, 160, 25}: "NEBULA CONSULTANTS, INC.", + [3]byte{0, 160, 26}: "BINAR ELEKTRONIK AB", + [3]byte{0, 160, 27}: "PREMISYS COMMUNICATIONS, INC.", + [3]byte{0, 160, 28}: "NASCENT NETWORKS CORPORATION", + [3]byte{0, 160, 29}: "Red Lion Controls, LP", + [3]byte{0, 160, 30}: "EST CORPORATION", + [3]byte{0, 160, 31}: "TRICORD SYSTEMS, INC.", + [3]byte{0, 160, 32}: "CITICORP/TTI", + [3]byte{0, 160, 33}: "General Dynamics", + [3]byte{0, 160, 34}: "CENTRE FOR DEVELOPMENT OF ADVANCED COMPUTING", + [3]byte{0, 160, 35}: "APPLIED CREATIVE TECHNOLOGY, INC.", + [3]byte{0, 160, 36}: "3COM CORPORATION", + [3]byte{0, 160, 37}: "REDCOM LABS INC.", + [3]byte{0, 160, 38}: "TELDAT, S.A.", + [3]byte{0, 160, 39}: "FIREPOWER SYSTEMS, INC.", + [3]byte{0, 160, 40}: "CONNER PERIPHERALS", + [3]byte{0, 160, 41}: "COULTER CORPORATION", + [3]byte{0, 160, 42}: "TRANCELL SYSTEMS", + [3]byte{0, 160, 43}: "TRANSITIONS RESEARCH CORP.", + [3]byte{0, 160, 44}: "interWAVE Communications", + [3]byte{0, 160, 45}: "1394 Trade Association", + [3]byte{0, 160, 46}: "BRAND COMMUNICATIONS, LTD.", + [3]byte{0, 160, 47}: "ADB Broadband Italia", + [3]byte{0, 160, 48}: "CAPTOR NV/SA", + [3]byte{0, 160, 49}: "HAZELTINE CORPORATION, MS 1-17", + [3]byte{0, 160, 50}: "GES SINGAPORE PTE. LTD.", + [3]byte{0, 160, 51}: "imc MeBsysteme GmbH", + [3]byte{0, 160, 52}: "AXEL", + [3]byte{0, 160, 53}: "CYLINK CORPORATION", + [3]byte{0, 160, 54}: "APPLIED NETWORK TECHNOLOGY", + [3]byte{0, 160, 55}: "Mindray DS USA, Inc.", + [3]byte{0, 160, 56}: "EMAIL ELECTRONICS", + [3]byte{0, 160, 57}: "ROSS TECHNOLOGY, INC.", + [3]byte{0, 160, 58}: "KUBOTEK CORPORATION", + [3]byte{0, 160, 59}: "TOSHIN ELECTRIC CO., LTD.", + [3]byte{0, 160, 60}: "EG&G NUCLEAR INSTRUMENTS", + [3]byte{0, 160, 61}: "OPTO-22", + [3]byte{0, 160, 62}: "ATM FORUM", + [3]byte{0, 160, 63}: "COMPUTER SOCIETY MICROPROCESSOR & MICROPROCESSOR STANDARDS C", + [3]byte{0, 160, 64}: "Apple, Inc.", + [3]byte{0, 160, 65}: "INFICON", + [3]byte{0, 160, 66}: "SPUR PRODUCTS CORP.", + [3]byte{0, 160, 67}: "AMERICAN TECHNOLOGY LABS, INC.", + [3]byte{0, 160, 68}: "NTT IT CO., LTD.", + [3]byte{0, 160, 69}: "PHOENIX CONTACT Electronics GmbH", + [3]byte{0, 160, 70}: "SCITEX CORP. LTD.", + [3]byte{0, 160, 71}: "INTEGRATED FITNESS CORP.", + [3]byte{0, 160, 72}: "QUESTECH, LTD.", + [3]byte{0, 160, 73}: "DIGITECH INDUSTRIES, INC.", + [3]byte{0, 160, 74}: "NISSHIN ELECTRIC CO., LTD.", + [3]byte{0, 160, 75}: "TFL LAN INC.", + [3]byte{0, 160, 76}: "INNOVATIVE SYSTEMS & TECHNOLOGIES, INC.", + [3]byte{0, 160, 77}: "EDA INSTRUMENTS, INC.", + [3]byte{0, 160, 78}: "VOELKER TECHNOLOGIES, INC.", + [3]byte{0, 160, 79}: "AMERITEC CORP.", + [3]byte{0, 160, 80}: "CYPRESS SEMICONDUCTOR", + [3]byte{0, 160, 81}: "ANGIA COMMUNICATIONS. INC.", + [3]byte{0, 160, 82}: "STANILITE ELECTRONICS PTY. LTD", + [3]byte{0, 160, 83}: "COMPACT DEVICES, INC.", + [3]byte{0, 160, 84}: "Private", + [3]byte{0, 160, 85}: "Data Device Corporation", + [3]byte{0, 160, 86}: "MICROPROSS", + [3]byte{0, 160, 87}: "LANCOM Systems GmbH", + [3]byte{0, 160, 88}: "GLORY, LTD.", + [3]byte{0, 160, 89}: "HAMILTON HALLMARK", + [3]byte{0, 160, 90}: "KOFAX IMAGE PRODUCTS", + [3]byte{0, 160, 91}: "MARQUIP, INC.", + [3]byte{0, 160, 92}: "INVENTORY CONVERSION, INC./", + [3]byte{0, 160, 93}: "CS COMPUTER SYSTEME GmbH", + [3]byte{0, 160, 94}: "MYRIAD LOGIC INC.", + [3]byte{0, 160, 95}: "BTG Electronics Design BV", + [3]byte{0, 160, 96}: "ACER PERIPHERALS, INC.", + [3]byte{0, 160, 97}: "PURITAN BENNETT", + [3]byte{0, 160, 98}: "AES PRODATA", + [3]byte{0, 160, 99}: "JRL SYSTEMS, INC.", + [3]byte{0, 160, 100}: "KVB/ANALECT", + [3]byte{0, 160, 101}: "Symantec Corporation", + [3]byte{0, 160, 102}: "ISA CO., LTD.", + [3]byte{0, 160, 103}: "NETWORK SERVICES GROUP", + [3]byte{0, 160, 104}: "BHP LIMITED", + [3]byte{0, 160, 105}: "Symmetricom, Inc.", + [3]byte{0, 160, 106}: "Verilink Corporation", + [3]byte{0, 160, 107}: "DMS DORSCH MIKROSYSTEM GMBH", + [3]byte{0, 160, 108}: "SHINDENGEN ELECTRIC MFG. CO., LTD.", + [3]byte{0, 160, 109}: "MANNESMANN TALLY CORPORATION", + [3]byte{0, 160, 110}: "AUSTRON, INC.", + [3]byte{0, 160, 111}: "Color Sentinel Systems, LLC", + [3]byte{0, 160, 112}: "COASTCOM", + [3]byte{0, 160, 113}: "VIDEO LOTTERY TECHNOLOGIES,INC", + [3]byte{0, 160, 114}: "OVATION SYSTEMS LTD.", + [3]byte{0, 160, 115}: "COM21, INC.", + [3]byte{0, 160, 116}: "PERCEPTION TECHNOLOGY", + [3]byte{0, 160, 117}: "MICRON TECHNOLOGY, INC.", + [3]byte{0, 160, 118}: "CARDWARE LAB, INC.", + [3]byte{0, 160, 119}: "FUJITSU NEXION, INC.", + [3]byte{0, 160, 120}: "Marconi Communications", + [3]byte{0, 160, 121}: "ALPS ELECTRIC (USA), INC.", + [3]byte{0, 160, 122}: "ADVANCED PERIPHERALS TECHNOLOGIES, INC.", + [3]byte{0, 160, 123}: "DAWN COMPUTER INCORPORATION", + [3]byte{0, 160, 124}: "TONYANG NYLON CO., LTD.", + [3]byte{0, 160, 125}: "SEEQ TECHNOLOGY, INC.", + [3]byte{0, 160, 126}: "AVID TECHNOLOGY, INC.", + [3]byte{0, 160, 127}: "GSM-SYNTEL, LTD.", + [3]byte{0, 160, 128}: "Tattile SRL", + [3]byte{0, 160, 129}: "ALCATEL DATA NETWORKS", + [3]byte{0, 160, 130}: "NKT ELEKTRONIK A/S", + [3]byte{0, 160, 131}: "ASIMMPHONY TURKEY", + [3]byte{0, 160, 132}: "Dataplex Pty Ltd", + [3]byte{0, 160, 133}: "Private", + [3]byte{0, 160, 134}: "AMBER WAVE SYSTEMS, INC.", + [3]byte{0, 160, 135}: "Microsemi Corporation", + [3]byte{0, 160, 136}: "ESSENTIAL COMMUNICATIONS", + [3]byte{0, 160, 137}: "XPOINT TECHNOLOGIES, INC.", + [3]byte{0, 160, 138}: "BROOKTROUT TECHNOLOGY, INC.", + [3]byte{0, 160, 139}: "ASTON ELECTRONIC DESIGNS LTD.", + [3]byte{0, 160, 140}: "MultiMedia LANs, Inc.", + [3]byte{0, 160, 141}: "JACOMO CORPORATION", + [3]byte{0, 160, 142}: "Check Point Software Technologies", + [3]byte{0, 160, 143}: "DESKNET SYSTEMS, INC.", + [3]byte{0, 160, 144}: "TimeStep Corporation", + [3]byte{0, 160, 145}: "APPLICOM INTERNATIONAL", + [3]byte{0, 160, 146}: "H. BOLLMANN MANUFACTURERS, LTD", + [3]byte{0, 160, 147}: "B/E AEROSPACE, Inc.", + [3]byte{0, 160, 148}: "COMSAT CORPORATION", + [3]byte{0, 160, 149}: "ACACIA NETWORKS, INC.", + [3]byte{0, 160, 150}: "MITSUMI ELECTRIC CO.,LTD.", + [3]byte{0, 160, 151}: "JC INFORMATION SYSTEMS", + [3]byte{0, 160, 152}: "NetApp", + [3]byte{0, 160, 153}: "K-NET LTD.", + [3]byte{0, 160, 154}: "NIHON KOHDEN AMERICA", + [3]byte{0, 160, 155}: "QPSX COMMUNICATIONS, LTD.", + [3]byte{0, 160, 156}: "Xyplex, Inc.", + [3]byte{0, 160, 157}: "JOHNATHON FREEMAN TECHNOLOGIES", + [3]byte{0, 160, 158}: "ICTV", + [3]byte{0, 160, 159}: "COMMVISION CORP.", + [3]byte{0, 160, 160}: "COMPACT DATA, LTD.", + [3]byte{0, 160, 161}: "EPIC DATA INC.", + [3]byte{0, 160, 162}: "DIGICOM S.P.A.", + [3]byte{0, 160, 163}: "RELIABLE POWER METERS", + [3]byte{0, 160, 164}: "Oracle Corporation", + [3]byte{0, 160, 165}: "TEKNOR MICROSYSTEME, INC.", + [3]byte{0, 160, 166}: "M.I. SYSTEMS, K.K.", + [3]byte{0, 160, 167}: "VORAX CORPORATION", + [3]byte{0, 160, 168}: "RENEX CORPORATION", + [3]byte{0, 160, 169}: "NAVTEL COMMUNICATIONS INC.", + [3]byte{0, 160, 170}: "SPACELABS MEDICAL", + [3]byte{0, 160, 171}: "NETCS INFORMATIONSTECHNIK GMBH", + [3]byte{0, 160, 172}: "GILAT SATELLITE NETWORKS, LTD.", + [3]byte{0, 160, 173}: "MARCONI SPA", + [3]byte{0, 160, 174}: "NUCOM SYSTEMS, INC.", + [3]byte{0, 160, 175}: "WMS INDUSTRIES", + [3]byte{0, 160, 176}: "I-O DATA DEVICE, INC.", + [3]byte{0, 160, 177}: "FIRST VIRTUAL CORPORATION", + [3]byte{0, 160, 178}: "SHIMA SEIKI", + [3]byte{0, 160, 179}: "ZYKRONIX", + [3]byte{0, 160, 180}: "TEXAS MICROSYSTEMS, INC.", + [3]byte{0, 160, 181}: "3H TECHNOLOGY", + [3]byte{0, 160, 182}: "SANRITZ AUTOMATION CO., LTD.", + [3]byte{0, 160, 183}: "CORDANT, INC.", + [3]byte{0, 160, 184}: "NetApp", + [3]byte{0, 160, 185}: "EAGLE TECHNOLOGY, INC.", + [3]byte{0, 160, 186}: "PATTON ELECTRONICS CO.", + [3]byte{0, 160, 187}: "HILAN GMBH", + [3]byte{0, 160, 188}: "VIASAT, INCORPORATED", + [3]byte{0, 160, 189}: "I-TECH CORP.", + [3]byte{0, 160, 190}: "INTEGRATED CIRCUIT SYSTEMS, INC. COMMUNICATIONS GROUP", + [3]byte{0, 160, 191}: "WIRELESS DATA GROUP MOTOROLA", + [3]byte{0, 160, 192}: "DIGITAL LINK CORP.", + [3]byte{0, 160, 193}: "ORTIVUS MEDICAL AB", + [3]byte{0, 160, 194}: "R.A. SYSTEMS CO., LTD.", + [3]byte{0, 160, 195}: "UNICOMPUTER GMBH", + [3]byte{0, 160, 196}: "CRISTIE ELECTRONICS LTD.", + [3]byte{0, 160, 197}: "Zyxel Communications Corporation", + [3]byte{0, 160, 198}: "Qualcomm Inc.", + [3]byte{0, 160, 199}: "TADIRAN TELECOMMUNICATIONS", + [3]byte{0, 160, 200}: "Adtran Inc", + [3]byte{0, 160, 201}: "Intel Corporation", + [3]byte{0, 160, 202}: "FUJITSU DENSO LTD.", + [3]byte{0, 160, 203}: "ARK TELECOMMUNICATIONS, INC.", + [3]byte{0, 160, 204}: "LITE-ON COMMUNICATIONS, INC.", + [3]byte{0, 160, 205}: "DR. JOHANNES HEIDENHAIN GmbH", + [3]byte{0, 160, 206}: "Ecessa", + [3]byte{0, 160, 207}: "SOTAS, INC.", + [3]byte{0, 160, 208}: "TEN X TECHNOLOGY, INC.", + [3]byte{0, 160, 209}: "INVENTEC CORPORATION", + [3]byte{0, 160, 210}: "ALLIED TELESIS INTERNATIONAL CORPORATION", + [3]byte{0, 160, 211}: "INSTEM COMPUTER SYSTEMS, LTD.", + [3]byte{0, 160, 212}: "RADIOLAN, INC.", + [3]byte{0, 160, 213}: "SIERRA WIRELESS INC.", + [3]byte{0, 160, 214}: "SBE, Inc.", + [3]byte{0, 160, 215}: "KASTEN CHASE APPLIED RESEARCH", + [3]byte{0, 160, 216}: "SPECTRA - TEK", + [3]byte{0, 160, 217}: "CONVEX COMPUTER CORPORATION", + [3]byte{0, 160, 218}: "INTEGRATED SYSTEMS Technology, Inc.", + [3]byte{0, 160, 219}: "FISHER & PAYKEL PRODUCTION", + [3]byte{0, 160, 220}: "O.N. ELECTRONIC CO., LTD.", + [3]byte{0, 160, 221}: "AZONIX CORPORATION", + [3]byte{0, 160, 222}: "YAMAHA CORPORATION", + [3]byte{0, 160, 223}: "STS TECHNOLOGIES, INC.", + [3]byte{0, 160, 224}: "TENNYSON TECHNOLOGIES PTY LTD", + [3]byte{0, 160, 225}: "WESTPORT RESEARCH ASSOCIATES, INC.", + [3]byte{0, 160, 226}: "Keisokugiken Corporation", + [3]byte{0, 160, 227}: "XKL SYSTEMS CORP.", + [3]byte{0, 160, 228}: "OPTIQUEST", + [3]byte{0, 160, 229}: "NHC COMMUNICATIONS", + [3]byte{0, 160, 230}: "DIALOGIC CORPORATION", + [3]byte{0, 160, 231}: "CENTRAL DATA CORPORATION", + [3]byte{0, 160, 232}: "REUTERS HOLDINGS PLC", + [3]byte{0, 160, 233}: "ELECTRONIC RETAILING SYSTEMS INTERNATIONAL", + [3]byte{0, 160, 234}: "ETHERCOM CORP.", + [3]byte{0, 160, 235}: "Encore Networks, Inc.", + [3]byte{0, 160, 236}: "TRANSMITTON LTD.", + [3]byte{0, 160, 237}: "Brooks Automation, Inc.", + [3]byte{0, 160, 238}: "NASHOBA NETWORKS", + [3]byte{0, 160, 239}: "LUCIDATA LTD.", + [3]byte{0, 160, 240}: "TORONTO MICROELECTRONICS INC.", + [3]byte{0, 160, 241}: "MTI", + [3]byte{0, 160, 242}: "INFOTEK COMMUNICATIONS, INC.", + [3]byte{0, 160, 243}: "STAUBLI", + [3]byte{0, 160, 244}: "GE", + [3]byte{0, 160, 245}: "RADGUARD LTD.", + [3]byte{0, 160, 246}: "AutoGas Systems Inc.", + [3]byte{0, 160, 247}: "V.I COMPUTER CORP.", + [3]byte{0, 160, 248}: "Zebra Technologies Inc", + [3]byte{0, 160, 249}: "BINTEC COMMUNICATIONS GMBH", + [3]byte{0, 160, 250}: "Marconi Communication GmbH", + [3]byte{0, 160, 251}: "TORAY ENGINEERING CO., LTD.", + [3]byte{0, 160, 252}: "IMAGE SCIENCES, INC.", + [3]byte{0, 160, 253}: "SCITEX DIGITAL PRINTING, INC.", + [3]byte{0, 160, 254}: "BOSTON TECHNOLOGY, INC.", + [3]byte{0, 160, 255}: "TELLABS OPERATIONS, INC.", + [3]byte{0, 161, 222}: "ShenZhen ShiHua Technology CO.,LTD", + [3]byte{0, 162, 137}: "Cisco Systems, Inc", + [3]byte{0, 162, 218}: "INAT GmbH", + [3]byte{0, 162, 238}: "Cisco Systems, Inc", + [3]byte{0, 162, 245}: "Guangzhou Yuanyun Network Technology Co.,Ltd", + [3]byte{0, 162, 255}: "abatec group AG", + [3]byte{0, 163, 142}: "Cisco Systems, Inc", + [3]byte{0, 163, 209}: "Cisco Systems, Inc", + [3]byte{0, 165, 9}: "WigWag Inc.", + [3]byte{0, 166, 202}: "Cisco Systems, Inc", + [3]byte{0, 167, 66}: "Cisco Systems, Inc", + [3]byte{0, 167, 132}: "ITX security", + [3]byte{0, 170, 0}: "Intel Corporation", + [3]byte{0, 170, 1}: "Intel Corporation", + [3]byte{0, 170, 2}: "Intel Corporation", + [3]byte{0, 170, 60}: "OLIVETTI TELECOM SPA (OLTECO)", + [3]byte{0, 170, 112}: "LG Electronics (Mobile Communications)", + [3]byte{0, 172, 224}: "ARRIS Group, Inc.", + [3]byte{0, 174, 205}: "Pensando Systems", + [3]byte{0, 174, 250}: "Murata Manufacturing Co., Ltd.", + [3]byte{0, 175, 31}: "Cisco Systems, Inc", + [3]byte{0, 176, 9}: "Grass Valley, A Belden Brand", + [3]byte{0, 176, 23}: "InfoGear Technology Corp.", + [3]byte{0, 176, 25}: "UTC CCS", + [3]byte{0, 176, 28}: "Westport Technologies", + [3]byte{0, 176, 30}: "Rantic Labs, Inc.", + [3]byte{0, 176, 42}: "ORSYS GmbH", + [3]byte{0, 176, 45}: "ViaGate Technologies, Inc.", + [3]byte{0, 176, 51}: "OAO Izhevskiy radiozavod", + [3]byte{0, 176, 59}: "HiQ Networks", + [3]byte{0, 176, 72}: "Marconi Communications Inc.", + [3]byte{0, 176, 74}: "Cisco Systems, Inc", + [3]byte{0, 176, 82}: "Atheros Communications", + [3]byte{0, 176, 100}: "Cisco Systems, Inc", + [3]byte{0, 176, 105}: "Honewell Oy", + [3]byte{0, 176, 109}: "Jones Futurex Inc.", + [3]byte{0, 176, 128}: "Mannesmann Ipulsys B.V.", + [3]byte{0, 176, 134}: "LocSoft Limited", + [3]byte{0, 176, 142}: "Cisco Systems, Inc", + [3]byte{0, 176, 145}: "Transmeta Corp.", + [3]byte{0, 176, 148}: "Alaris, Inc.", + [3]byte{0, 176, 154}: "Morrow Technologies Corp.", + [3]byte{0, 176, 157}: "Point Grey Research Inc.", + [3]byte{0, 176, 172}: "SIAE-Microelettronica S.p.A.", + [3]byte{0, 176, 174}: "Symmetricom", + [3]byte{0, 176, 179}: "XSTREAMIS PLC", + [3]byte{0, 176, 194}: "Cisco Systems, Inc", + [3]byte{0, 176, 199}: "Tellabs Operations, Inc.", + [3]byte{0, 176, 206}: "Viveris Technologies", + [3]byte{0, 176, 208}: "Dell Inc.", + [3]byte{0, 176, 219}: "Nextcell, Inc.", + [3]byte{0, 176, 223}: "Starboard Storage Systems", + [3]byte{0, 176, 225}: "Cisco Systems, Inc", + [3]byte{0, 176, 231}: "British Federal Ltd.", + [3]byte{0, 176, 236}: "EACEM", + [3]byte{0, 176, 238}: "Ajile Systems, Inc.", + [3]byte{0, 176, 240}: "CALY NETWORKS", + [3]byte{0, 176, 245}: "NetWorth Technologies, Inc.", + [3]byte{0, 179, 56}: "Kontron Design Manufacturing Services (M) Sdn. Bhd", + [3]byte{0, 179, 66}: "MacroSAN Technologies Co., Ltd.", + [3]byte{0, 179, 98}: "Apple, Inc.", + [3]byte{0, 181, 109}: "David Electronics Co., LTD.", + [3]byte{0, 181, 214}: "Omnibit Inc.", + [3]byte{0, 182, 159}: "Latch", + [3]byte{0, 183, 141}: "Nanjing Shining Electric Automation Co., Ltd", + [3]byte{0, 185, 246}: "Shenzhen Super Rich Electronics Co.,Ltd", + [3]byte{0, 186, 192}: "Biometric Access Company", + [3]byte{0, 187, 1}: "OCTOTHORPE CORP.", + [3]byte{0, 187, 58}: "Private", + [3]byte{0, 187, 142}: "HME Co., Ltd.", + [3]byte{0, 187, 193}: "CANON INC.", + [3]byte{0, 187, 240}: "UNGERMANN-BASS INC.", + [3]byte{0, 189, 39}: "Exar Corp.", + [3]byte{0, 189, 58}: "Nokia Corporation", + [3]byte{0, 189, 130}: "Shenzhen YOUHUA Technology Co., Ltd", + [3]byte{0, 190, 158}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{0, 191, 21}: "Genetec Inc.", + [3]byte{0, 191, 97}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 192, 0}: "LANOPTICS, LTD.", + [3]byte{0, 192, 1}: "DIATEK PATIENT MANAGMENT", + [3]byte{0, 192, 2}: "SERCOMM CORPORATION", + [3]byte{0, 192, 3}: "GLOBALNET COMMUNICATIONS", + [3]byte{0, 192, 4}: "JAPAN BUSINESS COMPUTER CO.LTD", + [3]byte{0, 192, 5}: "LIVINGSTON ENTERPRISES, INC.", + [3]byte{0, 192, 6}: "NIPPON AVIONICS CO., LTD.", + [3]byte{0, 192, 7}: "PINNACLE DATA SYSTEMS, INC.", + [3]byte{0, 192, 8}: "SECO SRL", + [3]byte{0, 192, 9}: "KT TECHNOLOGY (S) PTE LTD", + [3]byte{0, 192, 10}: "MICRO CRAFT", + [3]byte{0, 192, 11}: "NORCONTROL A.S.", + [3]byte{0, 192, 12}: "RELIA TECHNOLGIES", + [3]byte{0, 192, 13}: "ADVANCED LOGIC RESEARCH, INC.", + [3]byte{0, 192, 14}: "PSITECH, INC.", + [3]byte{0, 192, 15}: "QUANTUM SOFTWARE SYSTEMS LTD.", + [3]byte{0, 192, 16}: "HIRAKAWA HEWTECH CORP.", + [3]byte{0, 192, 17}: "INTERACTIVE COMPUTING DEVICES", + [3]byte{0, 192, 18}: "NETSPAN CORPORATION", + [3]byte{0, 192, 19}: "NETRIX", + [3]byte{0, 192, 20}: "TELEMATICS CALABASAS INT'L,INC", + [3]byte{0, 192, 21}: "NEW MEDIA CORPORATION", + [3]byte{0, 192, 22}: "ELECTRONIC THEATRE CONTROLS", + [3]byte{0, 192, 23}: "NetScout Systems, Inc.", + [3]byte{0, 192, 24}: "LANART CORPORATION", + [3]byte{0, 192, 25}: "LEAP TECHNOLOGY, INC.", + [3]byte{0, 192, 26}: "COROMETRICS MEDICAL SYSTEMS", + [3]byte{0, 192, 27}: "SOCKET COMMUNICATIONS, INC.", + [3]byte{0, 192, 28}: "INTERLINK COMMUNICATIONS LTD.", + [3]byte{0, 192, 29}: "GRAND JUNCTION NETWORKS, INC.", + [3]byte{0, 192, 30}: "LA FRANCAISE DES JEUX", + [3]byte{0, 192, 31}: "S.E.R.C.E.L.", + [3]byte{0, 192, 32}: "ARCO ELECTRONIC, CONTROL LTD.", + [3]byte{0, 192, 33}: "NETEXPRESS", + [3]byte{0, 192, 34}: "LASERMASTER TECHNOLOGIES, INC.", + [3]byte{0, 192, 35}: "TUTANKHAMON ELECTRONICS", + [3]byte{0, 192, 36}: "EDEN SISTEMAS DE COMPUTACAO SA", + [3]byte{0, 192, 37}: "DATAPRODUCTS CORPORATION", + [3]byte{0, 192, 38}: "LANS TECHNOLOGY CO., LTD.", + [3]byte{0, 192, 39}: "CIPHER SYSTEMS, INC.", + [3]byte{0, 192, 40}: "JASCO CORPORATION", + [3]byte{0, 192, 41}: "Nexans Deutschland GmbH - ANS", + [3]byte{0, 192, 42}: "OHKURA ELECTRIC CO., LTD.", + [3]byte{0, 192, 43}: "GERLOFF GESELLSCHAFT FUR", + [3]byte{0, 192, 44}: "CENTRUM COMMUNICATIONS, INC.", + [3]byte{0, 192, 45}: "FUJI PHOTO FILM CO., LTD.", + [3]byte{0, 192, 46}: "NETWIZ", + [3]byte{0, 192, 47}: "OKUMA CORPORATION", + [3]byte{0, 192, 48}: "INTEGRATED ENGINEERING B. V.", + [3]byte{0, 192, 49}: "DESIGN RESEARCH SYSTEMS, INC.", + [3]byte{0, 192, 50}: "I-CUBED LIMITED", + [3]byte{0, 192, 51}: "TELEBIT COMMUNICATIONS APS", + [3]byte{0, 192, 52}: "TRANSACTION NETWORK", + [3]byte{0, 192, 53}: "QUINTAR COMPANY", + [3]byte{0, 192, 54}: "RAYTECH ELECTRONIC CORP.", + [3]byte{0, 192, 55}: "DYNATEM", + [3]byte{0, 192, 56}: "RASTER IMAGE PROCESSING SYSTEM", + [3]byte{0, 192, 57}: "Teridian Semiconductor Corporation", + [3]byte{0, 192, 58}: "MEN-MIKRO ELEKTRONIK GMBH", + [3]byte{0, 192, 59}: "MULTIACCESS COMPUTING CORP.", + [3]byte{0, 192, 60}: "TOWER TECH S.R.L.", + [3]byte{0, 192, 61}: "WIESEMANN & THEIS GMBH", + [3]byte{0, 192, 62}: "FA. GEBR. HELLER GMBH", + [3]byte{0, 192, 63}: "STORES AUTOMATED SYSTEMS, INC.", + [3]byte{0, 192, 64}: "ECCI", + [3]byte{0, 192, 65}: "DIGITAL TRANSMISSION SYSTEMS", + [3]byte{0, 192, 66}: "DATALUX CORP.", + [3]byte{0, 192, 67}: "STRATACOM", + [3]byte{0, 192, 68}: "EMCOM CORPORATION", + [3]byte{0, 192, 69}: "ISOLATION SYSTEMS, LTD.", + [3]byte{0, 192, 70}: "Blue Chip Technology Ltd", + [3]byte{0, 192, 71}: "UNIMICRO SYSTEMS, INC.", + [3]byte{0, 192, 72}: "BAY TECHNICAL ASSOCIATES", + [3]byte{0, 192, 73}: "U.S. ROBOTICS, INC.", + [3]byte{0, 192, 74}: "GROUP 2000 AG", + [3]byte{0, 192, 75}: "CREATIVE MICROSYSTEMS", + [3]byte{0, 192, 76}: "DEPARTMENT OF FOREIGN AFFAIRS", + [3]byte{0, 192, 77}: "MITEC, INC.", + [3]byte{0, 192, 78}: "COMTROL CORPORATION", + [3]byte{0, 192, 79}: "Dell Inc.", + [3]byte{0, 192, 80}: "TOYO DENKI SEIZO K.K.", + [3]byte{0, 192, 81}: "ADVANCED INTEGRATION RESEARCH", + [3]byte{0, 192, 82}: "BURR-BROWN", + [3]byte{0, 192, 83}: "Aspect Software Inc.", + [3]byte{0, 192, 84}: "NETWORK PERIPHERALS, LTD.", + [3]byte{0, 192, 85}: "MODULAR COMPUTING TECHNOLOGIES", + [3]byte{0, 192, 86}: "SOMELEC", + [3]byte{0, 192, 87}: "MYCO ELECTRONICS", + [3]byte{0, 192, 88}: "DATAEXPERT CORP.", + [3]byte{0, 192, 89}: "DENSO CORPORATION", + [3]byte{0, 192, 90}: "SEMAPHORE COMMUNICATIONS CORP.", + [3]byte{0, 192, 91}: "NETWORKS NORTHWEST, INC.", + [3]byte{0, 192, 92}: "ELONEX PLC", + [3]byte{0, 192, 93}: "L&N TECHNOLOGIES", + [3]byte{0, 192, 94}: "VARI-LITE, INC.", + [3]byte{0, 192, 95}: "FINE-PAL COMPANY LIMITED", + [3]byte{0, 192, 96}: "ID SCANDINAVIA AS", + [3]byte{0, 192, 97}: "SOLECTEK CORPORATION", + [3]byte{0, 192, 98}: "IMPULSE TECHNOLOGY", + [3]byte{0, 192, 99}: "MORNING STAR TECHNOLOGIES, INC", + [3]byte{0, 192, 100}: "General Datacomm LLC", + [3]byte{0, 192, 101}: "SCOPE COMMUNICATIONS, INC.", + [3]byte{0, 192, 102}: "DOCUPOINT, INC.", + [3]byte{0, 192, 103}: "UNITED BARCODE INDUSTRIES", + [3]byte{0, 192, 104}: "HME Clear-Com LTD.", + [3]byte{0, 192, 105}: "Axxcelera Broadband Wireless", + [3]byte{0, 192, 106}: "ZAHNER-ELEKTRIK GMBH & CO. KG", + [3]byte{0, 192, 107}: "OSI PLUS CORPORATION", + [3]byte{0, 192, 108}: "SVEC COMPUTER CORP.", + [3]byte{0, 192, 109}: "BOCA RESEARCH, INC.", + [3]byte{0, 192, 110}: "HAFT TECHNOLOGY, INC.", + [3]byte{0, 192, 111}: "KOMATSU LTD.", + [3]byte{0, 192, 112}: "SECTRA SECURE-TRANSMISSION AB", + [3]byte{0, 192, 113}: "AREANEX COMMUNICATIONS, INC.", + [3]byte{0, 192, 114}: "KNX LTD.", + [3]byte{0, 192, 115}: "XEDIA CORPORATION", + [3]byte{0, 192, 116}: "TOYODA AUTOMATIC LOOM", + [3]byte{0, 192, 117}: "XANTE CORPORATION", + [3]byte{0, 192, 118}: "I-DATA INTERNATIONAL A-S", + [3]byte{0, 192, 119}: "DAEWOO TELECOM LTD.", + [3]byte{0, 192, 120}: "COMPUTER SYSTEMS ENGINEERING", + [3]byte{0, 192, 121}: "FONSYS CO.,LTD.", + [3]byte{0, 192, 122}: "PRIVA B.V.", + [3]byte{0, 192, 123}: "ASCEND COMMUNICATIONS, INC.", + [3]byte{0, 192, 124}: "HIGHTECH INFORMATION", + [3]byte{0, 192, 125}: "RISC DEVELOPMENTS LTD.", + [3]byte{0, 192, 126}: "KUBOTA CORPORATION ELECTRONIC", + [3]byte{0, 192, 127}: "NUPON COMPUTING CORP.", + [3]byte{0, 192, 128}: "NETSTAR, INC.", + [3]byte{0, 192, 129}: "METRODATA LTD.", + [3]byte{0, 192, 130}: "MOORE PRODUCTS CO.", + [3]byte{0, 192, 131}: "TRACE MOUNTAIN PRODUCTS, INC.", + [3]byte{0, 192, 132}: "DATA LINK CORP. LTD.", + [3]byte{0, 192, 133}: "ELECTRONICS FOR IMAGING, INC.", + [3]byte{0, 192, 134}: "THE LYNK CORPORATION", + [3]byte{0, 192, 135}: "UUNET TECHNOLOGIES, INC.", + [3]byte{0, 192, 136}: "EKF ELEKTRONIK GMBH", + [3]byte{0, 192, 137}: "TELINDUS DISTRIBUTION", + [3]byte{0, 192, 138}: "Lauterbach GmbH", + [3]byte{0, 192, 139}: "RISQ MODULAR SYSTEMS, INC.", + [3]byte{0, 192, 140}: "PERFORMANCE TECHNOLOGIES, INC.", + [3]byte{0, 192, 141}: "TRONIX PRODUCT DEVELOPMENT", + [3]byte{0, 192, 142}: "NETWORK INFORMATION TECHNOLOGY", + [3]byte{0, 192, 143}: "Panasonic Electric Works Co., Ltd.", + [3]byte{0, 192, 144}: "PRAIM S.R.L.", + [3]byte{0, 192, 145}: "JABIL CIRCUIT, INC.", + [3]byte{0, 192, 146}: "MENNEN MEDICAL INC.", + [3]byte{0, 192, 147}: "ALTA RESEARCH CORP.", + [3]byte{0, 192, 148}: "VMX INC.", + [3]byte{0, 192, 149}: "ZNYX Networks, Inc.", + [3]byte{0, 192, 150}: "TAMURA CORPORATION", + [3]byte{0, 192, 151}: "ARCHIPEL SA", + [3]byte{0, 192, 152}: "CHUNTEX ELECTRONIC CO., LTD.", + [3]byte{0, 192, 153}: "YOSHIKI INDUSTRIAL CO.,LTD.", + [3]byte{0, 192, 154}: "PHOTONICS CORPORATION", + [3]byte{0, 192, 155}: "RELIANCE COMM/TEC, R-TEC", + [3]byte{0, 192, 156}: "HIOKI E.E. CORPORATION", + [3]byte{0, 192, 157}: "DISTRIBUTED SYSTEMS INT'L, INC", + [3]byte{0, 192, 158}: "CACHE COMPUTERS, INC.", + [3]byte{0, 192, 159}: "QUANTA COMPUTER INC.", + [3]byte{0, 192, 160}: "ADVANCE MICRO RESEARCH, INC.", + [3]byte{0, 192, 161}: "TOKYO DENSHI SEKEI CO.", + [3]byte{0, 192, 162}: "INTERMEDIUM A/S", + [3]byte{0, 192, 163}: "DUAL ENTERPRISES CORPORATION", + [3]byte{0, 192, 164}: "UNIGRAF OY", + [3]byte{0, 192, 165}: "DICKENS DATA SYSTEMS", + [3]byte{0, 192, 166}: "EXICOM AUSTRALIA PTY. LTD", + [3]byte{0, 192, 167}: "SEEL LTD.", + [3]byte{0, 192, 168}: "GVC CORPORATION", + [3]byte{0, 192, 169}: "BARRON MCCANN LTD.", + [3]byte{0, 192, 170}: "SILICON VALLEY COMPUTER", + [3]byte{0, 192, 171}: "Telco Systems, Inc.", + [3]byte{0, 192, 172}: "GAMBIT COMPUTER COMMUNICATIONS", + [3]byte{0, 192, 173}: "MARBEN COMMUNICATION SYSTEMS", + [3]byte{0, 192, 174}: "TOWERCOM CO. INC. DBA PC HOUSE", + [3]byte{0, 192, 175}: "TEKLOGIX INC.", + [3]byte{0, 192, 176}: "GCC TECHNOLOGIES,INC.", + [3]byte{0, 192, 177}: "GENIUS NET CO.", + [3]byte{0, 192, 178}: "NORAND CORPORATION", + [3]byte{0, 192, 179}: "COMSTAT DATACOMM CORPORATION", + [3]byte{0, 192, 180}: "MYSON TECHNOLOGY, INC.", + [3]byte{0, 192, 181}: "CORPORATE NETWORK SYSTEMS,INC.", + [3]byte{0, 192, 182}: "Overland Storage, Inc.", + [3]byte{0, 192, 183}: "AMERICAN POWER CONVERSION CORP", + [3]byte{0, 192, 184}: "FRASER'S HILL LTD.", + [3]byte{0, 192, 185}: "FUNK SOFTWARE, INC.", + [3]byte{0, 192, 186}: "NETVANTAGE", + [3]byte{0, 192, 187}: "FORVAL CREATIVE, INC.", + [3]byte{0, 192, 188}: "TELECOM AUSTRALIA/CSSC", + [3]byte{0, 192, 189}: "INEX TECHNOLOGIES, INC.", + [3]byte{0, 192, 190}: "ALCATEL - SEL", + [3]byte{0, 192, 191}: "TECHNOLOGY CONCEPTS, LTD.", + [3]byte{0, 192, 192}: "SHORE MICROSYSTEMS, INC.", + [3]byte{0, 192, 193}: "QUAD/GRAPHICS, INC.", + [3]byte{0, 192, 194}: "INFINITE NETWORKS LTD.", + [3]byte{0, 192, 195}: "ACUSON COMPUTED SONOGRAPHY", + [3]byte{0, 192, 196}: "COMPUTER OPERATIONAL", + [3]byte{0, 192, 197}: "SID INFORMATICA", + [3]byte{0, 192, 198}: "PERSONAL MEDIA CORP.", + [3]byte{0, 192, 199}: "SPARKTRUM MICROSYSTEMS, INC.", + [3]byte{0, 192, 200}: "MICRO BYTE PTY. LTD.", + [3]byte{0, 192, 201}: "ELSAG BAILEY PROCESS", + [3]byte{0, 192, 202}: "ALFA, INC.", + [3]byte{0, 192, 203}: "CONTROL TECHNOLOGY CORPORATION", + [3]byte{0, 192, 204}: "TELESCIENCES CO SYSTEMS, INC.", + [3]byte{0, 192, 205}: "COMELTA, S.A.", + [3]byte{0, 192, 206}: "CEI SYSTEMS & ENGINEERING PTE", + [3]byte{0, 192, 207}: "IMATRAN VOIMA OY", + [3]byte{0, 192, 208}: "RATOC SYSTEM INC.", + [3]byte{0, 192, 209}: "COMTREE TECHNOLOGY CORPORATION", + [3]byte{0, 192, 210}: "SYNTELLECT, INC.", + [3]byte{0, 192, 211}: "OLYMPUS IMAGE SYSTEMS, INC.", + [3]byte{0, 192, 212}: "AXON NETWORKS, INC.", + [3]byte{0, 192, 213}: "Werbeagentur Jürgen Siebert", + [3]byte{0, 192, 214}: "J1 SYSTEMS, INC.", + [3]byte{0, 192, 215}: "TAIWAN TRADING CENTER DBA", + [3]byte{0, 192, 216}: "UNIVERSAL DATA SYSTEMS", + [3]byte{0, 192, 217}: "QUINTE NETWORK CONFIDENTIALITY", + [3]byte{0, 192, 218}: "NICE SYSTEMS LTD.", + [3]byte{0, 192, 219}: "IPC CORPORATION (PTE) LTD.", + [3]byte{0, 192, 220}: "EOS TECHNOLOGIES, INC.", + [3]byte{0, 192, 221}: "QLogic Corporation", + [3]byte{0, 192, 222}: "ZCOMM, INC.", + [3]byte{0, 192, 223}: "KYE Systems Corp.", + [3]byte{0, 192, 224}: "DSC COMMUNICATION CORP.", + [3]byte{0, 192, 225}: "SONIC SOLUTIONS", + [3]byte{0, 192, 226}: "CALCOMP, INC.", + [3]byte{0, 192, 227}: "OSITECH COMMUNICATIONS, INC.", + [3]byte{0, 192, 228}: "SIEMENS BUILDING", + [3]byte{0, 192, 229}: "GESPAC, S.A.", + [3]byte{0, 192, 230}: "Verilink Corporation", + [3]byte{0, 192, 231}: "FIBERDATA AB", + [3]byte{0, 192, 232}: "PLEXCOM, INC.", + [3]byte{0, 192, 233}: "OAK SOLUTIONS, LTD.", + [3]byte{0, 192, 234}: "ARRAY TECHNOLOGY LTD.", + [3]byte{0, 192, 235}: "SEH COMPUTERTECHNIK GMBH", + [3]byte{0, 192, 236}: "DAUPHIN TECHNOLOGY", + [3]byte{0, 192, 237}: "US ARMY ELECTRONIC", + [3]byte{0, 192, 238}: "KYOCERA Display Corporation", + [3]byte{0, 192, 239}: "ABIT CORPORATION", + [3]byte{0, 192, 240}: "Kingston Technology Company, Inc.", + [3]byte{0, 192, 241}: "SHINKO ELECTRIC CO., LTD.", + [3]byte{0, 192, 242}: "TRANSITION NETWORKS", + [3]byte{0, 192, 243}: "NETWORK COMMUNICATIONS CORP.", + [3]byte{0, 192, 244}: "INTERLINK SYSTEM CO., LTD.", + [3]byte{0, 192, 245}: "METACOMP, INC.", + [3]byte{0, 192, 246}: "CELAN TECHNOLOGY INC.", + [3]byte{0, 192, 247}: "ENGAGE COMMUNICATION, INC.", + [3]byte{0, 192, 248}: "ABOUT COMPUTING INC.", + [3]byte{0, 192, 249}: "Artesyn Embedded Technologies", + [3]byte{0, 192, 250}: "CANARY COMMUNICATIONS, INC.", + [3]byte{0, 192, 251}: "ADVANCED TECHNOLOGY LABS", + [3]byte{0, 192, 252}: "ELASTIC REALITY, INC.", + [3]byte{0, 192, 253}: "PROSUM", + [3]byte{0, 192, 254}: "APTEC COMPUTER SYSTEMS, INC.", + [3]byte{0, 192, 255}: "Seagate Cloud Systems Inc", + [3]byte{0, 193, 79}: "DDL Co,.ltd.", + [3]byte{0, 193, 100}: "Cisco Systems, Inc", + [3]byte{0, 193, 177}: "Cisco Systems, Inc", + [3]byte{0, 194, 198}: "Intel Corporate", + [3]byte{0, 197, 219}: "Datatech Sistemas Digitales Avanzados SL", + [3]byte{0, 198, 16}: "Apple, Inc.", + [3]byte{0, 200, 139}: "Cisco Systems, Inc", + [3]byte{0, 202, 229}: "Cisco Systems, Inc", + [3]byte{0, 203, 0}: "Private", + [3]byte{0, 203, 189}: "Cambridge Broadband Networks Ltd.", + [3]byte{0, 204, 252}: "Cisco Systems, Inc", + [3]byte{0, 205, 144}: "MAS Elektronik AG", + [3]byte{0, 205, 254}: "Apple, Inc.", + [3]byte{0, 207, 28}: "Communication Machinery Corporation", + [3]byte{0, 208, 0}: "FERRAN SCIENTIFIC, INC.", + [3]byte{0, 208, 1}: "VST TECHNOLOGIES, INC.", + [3]byte{0, 208, 2}: "DITECH CORPORATION", + [3]byte{0, 208, 3}: "COMDA ENTERPRISES CORP.", + [3]byte{0, 208, 4}: "PENTACOM LTD.", + [3]byte{0, 208, 5}: "ZHS ZEITMANAGEMENTSYSTEME", + [3]byte{0, 208, 6}: "Cisco Systems, Inc", + [3]byte{0, 208, 7}: "MIC ASSOCIATES, INC.", + [3]byte{0, 208, 8}: "MACTELL CORPORATION", + [3]byte{0, 208, 9}: "HSING TECH. ENTERPRISE CO. LTD", + [3]byte{0, 208, 10}: "LANACCESS TELECOM S.A.", + [3]byte{0, 208, 11}: "RHK TECHNOLOGY, INC.", + [3]byte{0, 208, 12}: "SNIJDER MICRO SYSTEMS", + [3]byte{0, 208, 13}: "MICROMERITICS INSTRUMENT", + [3]byte{0, 208, 14}: "PLURIS, INC.", + [3]byte{0, 208, 15}: "SPEECH DESIGN GMBH", + [3]byte{0, 208, 16}: "CONVERGENT NETWORKS, INC.", + [3]byte{0, 208, 17}: "PRISM VIDEO, INC.", + [3]byte{0, 208, 18}: "GATEWORKS CORP.", + [3]byte{0, 208, 19}: "PRIMEX AEROSPACE COMPANY", + [3]byte{0, 208, 20}: "ROOT, INC.", + [3]byte{0, 208, 21}: "UNIVEX MICROTECHNOLOGY CORP.", + [3]byte{0, 208, 22}: "SCM MICROSYSTEMS, INC.", + [3]byte{0, 208, 23}: "SYNTECH INFORMATION CO., LTD.", + [3]byte{0, 208, 24}: "QWES. COM, INC.", + [3]byte{0, 208, 25}: "DAINIPPON SCREEN CORPORATE", + [3]byte{0, 208, 26}: "URMET TLC S.P.A.", + [3]byte{0, 208, 27}: "MIMAKI ENGINEERING CO., LTD.", + [3]byte{0, 208, 28}: "SBS TECHNOLOGIES,", + [3]byte{0, 208, 29}: "FURUNO ELECTRIC CO., LTD.", + [3]byte{0, 208, 30}: "PINGTEL CORP.", + [3]byte{0, 208, 31}: "Senetas Corporation Ltd", + [3]byte{0, 208, 32}: "AIM SYSTEM, INC.", + [3]byte{0, 208, 33}: "REGENT ELECTRONICS CORP.", + [3]byte{0, 208, 34}: "INCREDIBLE TECHNOLOGIES, INC.", + [3]byte{0, 208, 35}: "INFORTREND TECHNOLOGY, INC.", + [3]byte{0, 208, 36}: "Cognex Corporation", + [3]byte{0, 208, 37}: "XROSSTECH, INC.", + [3]byte{0, 208, 38}: "HIRSCHMANN AUSTRIA GMBH", + [3]byte{0, 208, 39}: "APPLIED AUTOMATION, INC.", + [3]byte{0, 208, 40}: "Harmonic, Inc", + [3]byte{0, 208, 41}: "WAKEFERN FOOD CORPORATION", + [3]byte{0, 208, 42}: "Voxent Systems Ltd.", + [3]byte{0, 208, 43}: "JETCELL, INC.", + [3]byte{0, 208, 44}: "CAMPBELL SCIENTIFIC, INC.", + [3]byte{0, 208, 45}: "ADEMCO", + [3]byte{0, 208, 46}: "COMMUNICATION AUTOMATION CORP.", + [3]byte{0, 208, 47}: "VLSI TECHNOLOGY INC.", + [3]byte{0, 208, 48}: "Safetran Systems Corp", + [3]byte{0, 208, 49}: "INDUSTRIAL LOGIC CORPORATION", + [3]byte{0, 208, 50}: "YANO ELECTRIC CO., LTD.", + [3]byte{0, 208, 51}: "DALIAN DAXIAN NETWORK", + [3]byte{0, 208, 52}: "ORMEC SYSTEMS CORP.", + [3]byte{0, 208, 53}: "BEHAVIOR TECH. COMPUTER CORP.", + [3]byte{0, 208, 54}: "TECHNOLOGY ATLANTA CORP.", + [3]byte{0, 208, 55}: "ARRIS Group, Inc.", + [3]byte{0, 208, 56}: "FIVEMERE, LTD.", + [3]byte{0, 208, 57}: "UTILICOM, INC.", + [3]byte{0, 208, 58}: "ZONEWORX, INC.", + [3]byte{0, 208, 59}: "VISION PRODUCTS PTY. LTD.", + [3]byte{0, 208, 60}: "Vieo, Inc.", + [3]byte{0, 208, 61}: "GALILEO TECHNOLOGY, LTD.", + [3]byte{0, 208, 62}: "ROCKETCHIPS, INC.", + [3]byte{0, 208, 63}: "AMERICAN COMMUNICATION", + [3]byte{0, 208, 64}: "SYSMATE CO., LTD.", + [3]byte{0, 208, 65}: "AMIGO TECHNOLOGY CO., LTD.", + [3]byte{0, 208, 66}: "MAHLO GMBH & CO. UG", + [3]byte{0, 208, 67}: "ZONAL RETAIL DATA SYSTEMS", + [3]byte{0, 208, 68}: "ALIDIAN NETWORKS, INC.", + [3]byte{0, 208, 69}: "KVASER AB", + [3]byte{0, 208, 70}: "DOLBY LABORATORIES, INC.", + [3]byte{0, 208, 71}: "XN TECHNOLOGIES", + [3]byte{0, 208, 72}: "ECTON, INC.", + [3]byte{0, 208, 73}: "IMPRESSTEK CO., LTD.", + [3]byte{0, 208, 74}: "PRESENCE TECHNOLOGY GMBH", + [3]byte{0, 208, 75}: "LA CIE GROUP S.A.", + [3]byte{0, 208, 76}: "EUROTEL TELECOM LTD.", + [3]byte{0, 208, 77}: "DIV OF RESEARCH & STATISTICS", + [3]byte{0, 208, 78}: "LOGIBAG", + [3]byte{0, 208, 79}: "BITRONICS, INC.", + [3]byte{0, 208, 80}: "ISKRATEL", + [3]byte{0, 208, 81}: "O2 MICRO, INC.", + [3]byte{0, 208, 82}: "ASCEND COMMUNICATIONS, INC.", + [3]byte{0, 208, 83}: "CONNECTED SYSTEMS", + [3]byte{0, 208, 84}: "SAS INSTITUTE INC.", + [3]byte{0, 208, 85}: "KATHREIN-WERKE KG", + [3]byte{0, 208, 86}: "SOMAT CORPORATION", + [3]byte{0, 208, 87}: "ULTRAK, INC.", + [3]byte{0, 208, 88}: "Cisco Systems, Inc", + [3]byte{0, 208, 89}: "AMBIT MICROSYSTEMS CORP.", + [3]byte{0, 208, 90}: "SYMBIONICS, LTD.", + [3]byte{0, 208, 91}: "ACROLOOP MOTION CONTROL", + [3]byte{0, 208, 92}: "KATHREIN TechnoTrend GmbH", + [3]byte{0, 208, 93}: "INTELLIWORXX, INC.", + [3]byte{0, 208, 94}: "STRATABEAM TECHNOLOGY, INC.", + [3]byte{0, 208, 95}: "VALCOM, INC.", + [3]byte{0, 208, 96}: "Panasonic Europe Ltd.", + [3]byte{0, 208, 97}: "TREMON ENTERPRISES CO., LTD.", + [3]byte{0, 208, 98}: "DIGIGRAM", + [3]byte{0, 208, 99}: "Cisco Systems, Inc", + [3]byte{0, 208, 100}: "MULTITEL", + [3]byte{0, 208, 101}: "TOKO ELECTRIC", + [3]byte{0, 208, 102}: "WINTRISS ENGINEERING CORP.", + [3]byte{0, 208, 103}: "CAMPIO COMMUNICATIONS", + [3]byte{0, 208, 104}: "IWILL CORPORATION", + [3]byte{0, 208, 105}: "TECHNOLOGIC SYSTEMS", + [3]byte{0, 208, 106}: "LINKUP SYSTEMS CORPORATION", + [3]byte{0, 208, 107}: "SR TELECOM INC.", + [3]byte{0, 208, 108}: "SHAREWAVE, INC.", + [3]byte{0, 208, 109}: "ACRISON, INC.", + [3]byte{0, 208, 110}: "TRENDVIEW RECORDERS LTD.", + [3]byte{0, 208, 111}: "KMC CONTROLS", + [3]byte{0, 208, 112}: "LONG WELL ELECTRONICS CORP.", + [3]byte{0, 208, 113}: "ECHELON CORP.", + [3]byte{0, 208, 114}: "BROADLOGIC", + [3]byte{0, 208, 115}: "ACN ADVANCED COMMUNICATIONS", + [3]byte{0, 208, 116}: "TAQUA SYSTEMS, INC.", + [3]byte{0, 208, 117}: "ALARIS MEDICAL SYSTEMS, INC.", + [3]byte{0, 208, 118}: "Bank of America", + [3]byte{0, 208, 119}: "LUCENT TECHNOLOGIES", + [3]byte{0, 208, 120}: "Eltex of Sweden AB", + [3]byte{0, 208, 121}: "Cisco Systems, Inc", + [3]byte{0, 208, 122}: "AMAQUEST COMPUTER CORP.", + [3]byte{0, 208, 123}: "COMCAM INTERNATIONAL INC", + [3]byte{0, 208, 124}: "KOYO ELECTRONICS INC. CO.,LTD.", + [3]byte{0, 208, 125}: "COSINE COMMUNICATIONS", + [3]byte{0, 208, 126}: "KEYCORP LTD.", + [3]byte{0, 208, 127}: "STRATEGY & TECHNOLOGY, LIMITED", + [3]byte{0, 208, 128}: "EXABYTE CORPORATION", + [3]byte{0, 208, 129}: "RTD Embedded Technologies, Inc.", + [3]byte{0, 208, 130}: "IOWAVE INC.", + [3]byte{0, 208, 131}: "INVERTEX, INC.", + [3]byte{0, 208, 132}: "NEXCOMM SYSTEMS, INC.", + [3]byte{0, 208, 133}: "OTIS ELEVATOR COMPANY", + [3]byte{0, 208, 134}: "FOVEON, INC.", + [3]byte{0, 208, 135}: "MICROFIRST INC.", + [3]byte{0, 208, 136}: "ARRIS Group, Inc.", + [3]byte{0, 208, 137}: "DYNACOLOR, INC.", + [3]byte{0, 208, 138}: "PHOTRON USA", + [3]byte{0, 208, 139}: "ADVA Optical Networking Ltd.", + [3]byte{0, 208, 140}: "GENOA TECHNOLOGY, INC.", + [3]byte{0, 208, 141}: "PHOENIX GROUP, INC.", + [3]byte{0, 208, 142}: "Grass Valley, A Belden Brand", + [3]byte{0, 208, 143}: "ARDENT TECHNOLOGIES, INC.", + [3]byte{0, 208, 144}: "Cisco Systems, Inc", + [3]byte{0, 208, 145}: "SMARTSAN SYSTEMS, INC.", + [3]byte{0, 208, 146}: "GLENAYRE WESTERN MULTIPLEX", + [3]byte{0, 208, 147}: "TQ - COMPONENTS GMBH", + [3]byte{0, 208, 148}: "Seeion Control LLC", + [3]byte{0, 208, 149}: "Alcatel-Lucent Enterprise", + [3]byte{0, 208, 150}: "3COM EUROPE LTD.", + [3]byte{0, 208, 151}: "Cisco Systems, Inc", + [3]byte{0, 208, 152}: "Photon Dynamics Canada Inc.", + [3]byte{0, 208, 153}: "Elcard Wireless Systems Oy", + [3]byte{0, 208, 154}: "FILANET CORPORATION", + [3]byte{0, 208, 155}: "SPECTEL LTD.", + [3]byte{0, 208, 156}: "KAPADIA COMMUNICATIONS", + [3]byte{0, 208, 157}: "VERIS INDUSTRIES", + [3]byte{0, 208, 158}: "2Wire Inc", + [3]byte{0, 208, 159}: "NOVTEK TEST SYSTEMS", + [3]byte{0, 208, 160}: "MIPS DENMARK", + [3]byte{0, 208, 161}: "OSKAR VIERLING GMBH + CO. KG", + [3]byte{0, 208, 162}: "INTEGRATED DEVICE", + [3]byte{0, 208, 163}: "VOCAL DATA, INC.", + [3]byte{0, 208, 164}: "ALANTRO COMMUNICATIONS", + [3]byte{0, 208, 165}: "AMERICAN ARIUM", + [3]byte{0, 208, 166}: "LANBIRD TECHNOLOGY CO., LTD.", + [3]byte{0, 208, 167}: "TOKYO SOKKI KENKYUJO CO., LTD.", + [3]byte{0, 208, 168}: "NETWORK ENGINES, INC.", + [3]byte{0, 208, 169}: "SHINANO KENSHI CO., LTD.", + [3]byte{0, 208, 170}: "CHASE COMMUNICATIONS", + [3]byte{0, 208, 171}: "DELTAKABEL TELECOM CV", + [3]byte{0, 208, 172}: "Commscope, Inc", + [3]byte{0, 208, 173}: "TL INDUSTRIES", + [3]byte{0, 208, 174}: "ORESIS COMMUNICATIONS, INC.", + [3]byte{0, 208, 175}: "CUTLER-HAMMER, INC.", + [3]byte{0, 208, 176}: "BITSWITCH LTD.", + [3]byte{0, 208, 177}: "OMEGA ELECTRONICS SA", + [3]byte{0, 208, 178}: "Xiotech Corporation", + [3]byte{0, 208, 179}: "DRS Technologies Canada Ltd", + [3]byte{0, 208, 180}: "KATSUJIMA CO., LTD.", + [3]byte{0, 208, 181}: "IPricot formerly DotCom", + [3]byte{0, 208, 182}: "CRESCENT NETWORKS, INC.", + [3]byte{0, 208, 183}: "Intel Corporation", + [3]byte{0, 208, 184}: "Iomega Corporation", + [3]byte{0, 208, 185}: "MICROTEK INTERNATIONAL, INC.", + [3]byte{0, 208, 186}: "Cisco Systems, Inc", + [3]byte{0, 208, 187}: "Cisco Systems, Inc", + [3]byte{0, 208, 188}: "Cisco Systems, Inc", + [3]byte{0, 208, 189}: "Lattice Semiconductor Corp. (LPA)", + [3]byte{0, 208, 190}: "EMUTEC INC.", + [3]byte{0, 208, 191}: "PIVOTAL TECHNOLOGIES", + [3]byte{0, 208, 192}: "Cisco Systems, Inc", + [3]byte{0, 208, 193}: "HARMONIC DATA SYSTEMS, LTD.", + [3]byte{0, 208, 194}: "BALTHAZAR TECHNOLOGY AB", + [3]byte{0, 208, 195}: "VIVID TECHNOLOGY PTE, LTD.", + [3]byte{0, 208, 196}: "TERATECH CORPORATION", + [3]byte{0, 208, 197}: "COMPUTATIONAL SYSTEMS, INC.", + [3]byte{0, 208, 198}: "THOMAS & BETTS CORP.", + [3]byte{0, 208, 199}: "PATHWAY, INC.", + [3]byte{0, 208, 200}: "Prevas A/S", + [3]byte{0, 208, 201}: "ADVANTECH CO., LTD.", + [3]byte{0, 208, 202}: "Intrinsyc Software International Inc.", + [3]byte{0, 208, 203}: "DASAN CO., LTD.", + [3]byte{0, 208, 204}: "TECHNOLOGIES LYRE INC.", + [3]byte{0, 208, 205}: "ATAN TECHNOLOGY INC.", + [3]byte{0, 208, 206}: "ASYST ELECTRONIC", + [3]byte{0, 208, 207}: "MORETON BAY", + [3]byte{0, 208, 208}: "ZHONGXING TELECOM LTD.", + [3]byte{0, 208, 209}: "Sycamore Networks", + [3]byte{0, 208, 210}: "EPILOG CORPORATION", + [3]byte{0, 208, 211}: "Cisco Systems, Inc", + [3]byte{0, 208, 212}: "V-BITS, INC.", + [3]byte{0, 208, 213}: "GRUNDIG AG", + [3]byte{0, 208, 214}: "AETHRA TELECOMUNICAZIONI", + [3]byte{0, 208, 215}: "B2C2, INC.", + [3]byte{0, 208, 216}: "3Com Corporation", + [3]byte{0, 208, 217}: "DEDICATED MICROCOMPUTERS", + [3]byte{0, 208, 218}: "TAICOM DATA SYSTEMS CO., LTD.", + [3]byte{0, 208, 219}: "MCQUAY INTERNATIONAL", + [3]byte{0, 208, 220}: "MODULAR MINING SYSTEMS, INC.", + [3]byte{0, 208, 221}: "SUNRISE TELECOM, INC.", + [3]byte{0, 208, 222}: "PHILIPS MULTIMEDIA NETWORK", + [3]byte{0, 208, 223}: "KUZUMI ELECTRONICS, INC.", + [3]byte{0, 208, 224}: "DOOIN ELECTRONICS CO.", + [3]byte{0, 208, 225}: "AVIONITEK ISRAEL INC.", + [3]byte{0, 208, 226}: "MRT MICRO, INC.", + [3]byte{0, 208, 227}: "ELE-CHEM ENGINEERING CO., LTD.", + [3]byte{0, 208, 228}: "Cisco Systems, Inc", + [3]byte{0, 208, 229}: "SOLIDUM SYSTEMS CORP.", + [3]byte{0, 208, 230}: "IBOND INC.", + [3]byte{0, 208, 231}: "VCON TELECOMMUNICATION LTD.", + [3]byte{0, 208, 232}: "MAC SYSTEM CO., LTD.", + [3]byte{0, 208, 233}: "Advantage Century Telecommunication Corp.", + [3]byte{0, 208, 234}: "NEXTONE COMMUNICATIONS, INC.", + [3]byte{0, 208, 235}: "LIGHTERA NETWORKS, INC.", + [3]byte{0, 208, 236}: "NAKAYO Inc", + [3]byte{0, 208, 237}: "XIOX", + [3]byte{0, 208, 238}: "DICTAPHONE CORPORATION", + [3]byte{0, 208, 239}: "IGT", + [3]byte{0, 208, 240}: "CONVISION TECHNOLOGY GMBH", + [3]byte{0, 208, 241}: "SEGA ENTERPRISES, LTD.", + [3]byte{0, 208, 242}: "MONTEREY NETWORKS", + [3]byte{0, 208, 243}: "SOLARI DI UDINE SPA", + [3]byte{0, 208, 244}: "CARINTHIAN TECH INSTITUTE", + [3]byte{0, 208, 245}: "ORANGE MICRO, INC.", + [3]byte{0, 208, 246}: "Nokia", + [3]byte{0, 208, 247}: "NEXT NETS CORPORATION", + [3]byte{0, 208, 248}: "FUJIAN STAR TERMINAL", + [3]byte{0, 208, 249}: "ACUTE COMMUNICATIONS CORP.", + [3]byte{0, 208, 250}: "Thales e-Security Ltd.", + [3]byte{0, 208, 251}: "TEK MICROSYSTEMS, INCORPORATED", + [3]byte{0, 208, 252}: "GRANITE MICROSYSTEMS", + [3]byte{0, 208, 253}: "OPTIMA TELE.COM, INC.", + [3]byte{0, 208, 254}: "ASTRAL POINT", + [3]byte{0, 208, 255}: "Cisco Systems, Inc", + [3]byte{0, 209, 28}: "ACETEL", + [3]byte{0, 211, 24}: "SPG Controls", + [3]byte{0, 211, 141}: "Hotel Technology Next Generation", + [3]byte{0, 214, 50}: "GE Energy", + [3]byte{0, 215, 143}: "Cisco Systems, Inc", + [3]byte{0, 217, 209}: "Sony Interactive Entertainment Inc.", + [3]byte{0, 218, 85}: "Cisco Systems, Inc", + [3]byte{0, 219, 30}: "Albedo Telecom SL", + [3]byte{0, 219, 69}: "THAMWAY CO.,LTD.", + [3]byte{0, 219, 112}: "Apple, Inc.", + [3]byte{0, 219, 223}: "Intel Corporate", + [3]byte{0, 221, 0}: "UNGERMANN-BASS INC.", + [3]byte{0, 221, 1}: "UNGERMANN-BASS INC.", + [3]byte{0, 221, 2}: "UNGERMANN-BASS INC.", + [3]byte{0, 221, 3}: "UNGERMANN-BASS INC.", + [3]byte{0, 221, 4}: "UNGERMANN-BASS INC.", + [3]byte{0, 221, 5}: "UNGERMANN-BASS INC.", + [3]byte{0, 221, 6}: "UNGERMANN-BASS INC.", + [3]byte{0, 221, 7}: "UNGERMANN-BASS INC.", + [3]byte{0, 221, 8}: "UNGERMANN-BASS INC.", + [3]byte{0, 221, 9}: "UNGERMANN-BASS INC.", + [3]byte{0, 221, 10}: "UNGERMANN-BASS INC.", + [3]byte{0, 221, 11}: "UNGERMANN-BASS INC.", + [3]byte{0, 221, 12}: "UNGERMANN-BASS INC.", + [3]byte{0, 221, 13}: "UNGERMANN-BASS INC.", + [3]byte{0, 221, 14}: "UNGERMANN-BASS INC.", + [3]byte{0, 221, 15}: "UNGERMANN-BASS INC.", + [3]byte{0, 222, 251}: "Cisco Systems, Inc", + [3]byte{0, 224, 0}: "FUJITSU LIMITED", + [3]byte{0, 224, 1}: "STRAND LIGHTING LIMITED", + [3]byte{0, 224, 2}: "CROSSROADS SYSTEMS, INC.", + [3]byte{0, 224, 3}: "NOKIA WIRELESS BUSINESS COMMUN", + [3]byte{0, 224, 4}: "PMC-SIERRA, INC.", + [3]byte{0, 224, 5}: "TECHNICAL CORP.", + [3]byte{0, 224, 6}: "SILICON INTEGRATED SYS. CORP.", + [3]byte{0, 224, 7}: "Avaya ECS Ltd", + [3]byte{0, 224, 8}: "AMAZING CONTROLS! INC.", + [3]byte{0, 224, 9}: "MARATHON TECHNOLOGIES CORP.", + [3]byte{0, 224, 10}: "DIBA, INC.", + [3]byte{0, 224, 11}: "ROOFTOP COMMUNICATIONS CORP.", + [3]byte{0, 224, 12}: "MOTOROLA", + [3]byte{0, 224, 13}: "RADIANT SYSTEMS", + [3]byte{0, 224, 14}: "AVALON IMAGING SYSTEMS, INC.", + [3]byte{0, 224, 15}: "Shanghai Baud Data Communication Co.,Ltd.", + [3]byte{0, 224, 16}: "HESS SB-AUTOMATENBAU GmbH", + [3]byte{0, 224, 17}: "UNIDEN CORPORATION", + [3]byte{0, 224, 18}: "PLUTO TECHNOLOGIES INTERNATIONAL INC.", + [3]byte{0, 224, 19}: "EASTERN ELECTRONIC CO., LTD.", + [3]byte{0, 224, 20}: "Cisco Systems, Inc", + [3]byte{0, 224, 21}: "HEIWA CORPORATION", + [3]byte{0, 224, 22}: "RAPID CITY COMMUNICATIONS", + [3]byte{0, 224, 23}: "EXXACT GmbH", + [3]byte{0, 224, 24}: "ASUSTek COMPUTER INC.", + [3]byte{0, 224, 25}: "ING. GIORDANO ELETTRONICA", + [3]byte{0, 224, 26}: "COMTEC SYSTEMS. CO., LTD.", + [3]byte{0, 224, 27}: "SPHERE COMMUNICATIONS, INC.", + [3]byte{0, 224, 28}: "Cradlepoint, Inc", + [3]byte{0, 224, 29}: "WebTV NETWORKS, INC.", + [3]byte{0, 224, 30}: "Cisco Systems, Inc", + [3]byte{0, 224, 31}: "AVIDIA Systems, Inc.", + [3]byte{0, 224, 32}: "TECNOMEN OY", + [3]byte{0, 224, 33}: "FREEGATE CORP.", + [3]byte{0, 224, 34}: "Analog Devices, Inc.", + [3]byte{0, 224, 35}: "TELRAD", + [3]byte{0, 224, 36}: "GADZOOX NETWORKS", + [3]byte{0, 224, 37}: "dit Co., Ltd.", + [3]byte{0, 224, 38}: "Redlake MASD LLC", + [3]byte{0, 224, 39}: "DUX, INC.", + [3]byte{0, 224, 40}: "APTIX CORPORATION", + [3]byte{0, 224, 41}: "STANDARD MICROSYSTEMS CORP.", + [3]byte{0, 224, 42}: "TANDBERG TELEVISION AS", + [3]byte{0, 224, 43}: "Extreme Networks, Inc.", + [3]byte{0, 224, 44}: "AST COMPUTER", + [3]byte{0, 224, 45}: "InnoMediaLogic, Inc.", + [3]byte{0, 224, 46}: "SPC ELECTRONICS CORPORATION", + [3]byte{0, 224, 47}: "MCNS HOLDINGS, L.P.", + [3]byte{0, 224, 48}: "MELITA INTERNATIONAL CORP.", + [3]byte{0, 224, 49}: "HAGIWARA ELECTRIC CO., LTD.", + [3]byte{0, 224, 50}: "MISYS FINANCIAL SYSTEMS, LTD.", + [3]byte{0, 224, 51}: "E.E.P.D. GmbH", + [3]byte{0, 224, 52}: "Cisco Systems, Inc", + [3]byte{0, 224, 53}: "Artesyn Embedded Technologies", + [3]byte{0, 224, 54}: "PIONEER CORPORATION", + [3]byte{0, 224, 55}: "CENTURY CORPORATION", + [3]byte{0, 224, 56}: "PROXIMA CORPORATION", + [3]byte{0, 224, 57}: "PARADYNE CORP.", + [3]byte{0, 224, 58}: "Cabletron Systems, Inc.", + [3]byte{0, 224, 59}: "PROMINET CORPORATION", + [3]byte{0, 224, 60}: "AdvanSys", + [3]byte{0, 224, 61}: "FOCON ELECTRONIC SYSTEMS A/S", + [3]byte{0, 224, 62}: "ALFATECH, INC.", + [3]byte{0, 224, 63}: "JATON CORPORATION", + [3]byte{0, 224, 64}: "DeskStation Technology, Inc.", + [3]byte{0, 224, 65}: "CSPI", + [3]byte{0, 224, 66}: "Pacom Systems Ltd.", + [3]byte{0, 224, 67}: "VitalCom", + [3]byte{0, 224, 68}: "LSICS CORPORATION", + [3]byte{0, 224, 69}: "TOUCHWAVE, INC.", + [3]byte{0, 224, 70}: "BENTLY NEVADA CORP.", + [3]byte{0, 224, 71}: "InFocus Corporation", + [3]byte{0, 224, 72}: "SDL COMMUNICATIONS, INC.", + [3]byte{0, 224, 73}: "MICROWI ELECTRONIC GmbH", + [3]byte{0, 224, 74}: "ZX Technologies, Inc", + [3]byte{0, 224, 75}: "JUMP INDUSTRIELLE COMPUTERTECHNIK GmbH", + [3]byte{0, 224, 76}: "REALTEK SEMICONDUCTOR CORP.", + [3]byte{0, 224, 77}: "INTERNET INITIATIVE JAPAN, INC", + [3]byte{0, 224, 78}: "SANYO DENKI CO., LTD.", + [3]byte{0, 224, 79}: "Cisco Systems, Inc", + [3]byte{0, 224, 80}: "EXECUTONE INFORMATION SYSTEMS, INC.", + [3]byte{0, 224, 81}: "TALX CORPORATION", + [3]byte{0, 224, 82}: "Brocade Communications Systems, Inc.", + [3]byte{0, 224, 83}: "CELLPORT LABS, INC.", + [3]byte{0, 224, 84}: "KODAI HITEC CO., LTD.", + [3]byte{0, 224, 85}: "INGENIERIA ELECTRONICA COMERCIAL INELCOM S.A.", + [3]byte{0, 224, 86}: "HOLONTECH CORPORATION", + [3]byte{0, 224, 87}: "HAN MICROTELECOM. CO., LTD.", + [3]byte{0, 224, 88}: "PHASE ONE DENMARK A/S", + [3]byte{0, 224, 89}: "CONTROLLED ENVIRONMENTS, LTD.", + [3]byte{0, 224, 90}: "GALEA NETWORK SECURITY", + [3]byte{0, 224, 91}: "WEST END SYSTEMS CORP.", + [3]byte{0, 224, 92}: "Panasonic Healthcare Co., Ltd.", + [3]byte{0, 224, 93}: "UNITEC CO., LTD.", + [3]byte{0, 224, 94}: "JAPAN AVIATION ELECTRONICS INDUSTRY, LTD.", + [3]byte{0, 224, 95}: "e-Net, Inc.", + [3]byte{0, 224, 96}: "SHERWOOD", + [3]byte{0, 224, 97}: "EdgePoint Networks, Inc.", + [3]byte{0, 224, 98}: "HOST ENGINEERING", + [3]byte{0, 224, 99}: "Cabletron Systems, Inc.", + [3]byte{0, 224, 100}: "SAMSUNG ELECTRONICS", + [3]byte{0, 224, 101}: "OPTICAL ACCESS INTERNATIONAL", + [3]byte{0, 224, 102}: "ProMax Systems, Inc.", + [3]byte{0, 224, 103}: "eac AUTOMATION-CONSULTING GmbH", + [3]byte{0, 224, 104}: "MERRIMAC SYSTEMS INC.", + [3]byte{0, 224, 105}: "JAYCOR", + [3]byte{0, 224, 106}: "KAPSCH AG", + [3]byte{0, 224, 107}: "W&G SPECIAL PRODUCTS", + [3]byte{0, 224, 108}: "Ultra Electronics Command & Control Systems", + [3]byte{0, 224, 109}: "COMPUWARE CORPORATION", + [3]byte{0, 224, 110}: "FAR SYSTEMS S.p.A.", + [3]byte{0, 224, 111}: "ARRIS Group, Inc.", + [3]byte{0, 224, 112}: "DH TECHNOLOGY", + [3]byte{0, 224, 113}: "EPIS MICROCOMPUTER", + [3]byte{0, 224, 114}: "LYNK", + [3]byte{0, 224, 115}: "NATIONAL AMUSEMENT NETWORK, INC.", + [3]byte{0, 224, 116}: "TIERNAN COMMUNICATIONS, INC.", + [3]byte{0, 224, 117}: "Verilink Corporation", + [3]byte{0, 224, 118}: "DEVELOPMENT CONCEPTS, INC.", + [3]byte{0, 224, 119}: "WEBGEAR, INC.", + [3]byte{0, 224, 120}: "BERKELEY NETWORKS", + [3]byte{0, 224, 121}: "A.T.N.R.", + [3]byte{0, 224, 122}: "MIKRODIDAKT AB", + [3]byte{0, 224, 123}: "BAY NETWORKS", + [3]byte{0, 224, 124}: "METTLER-TOLEDO, INC.", + [3]byte{0, 224, 125}: "NETRONIX, INC.", + [3]byte{0, 224, 126}: "WALT DISNEY IMAGINEERING", + [3]byte{0, 224, 127}: "LOGISTISTEM s.r.l.", + [3]byte{0, 224, 128}: "CONTROL RESOURCES CORPORATION", + [3]byte{0, 224, 129}: "TYAN COMPUTER CORP.", + [3]byte{0, 224, 130}: "ANERMA", + [3]byte{0, 224, 131}: "JATO TECHNOLOGIES, INC.", + [3]byte{0, 224, 132}: "COMPULITE R&D", + [3]byte{0, 224, 133}: "GLOBAL MAINTECH, INC.", + [3]byte{0, 224, 134}: "Emerson Network Power, Avocent Division", + [3]byte{0, 224, 135}: "LeCroy - Networking Productions Division", + [3]byte{0, 224, 136}: "LTX-Credence CORPORATION", + [3]byte{0, 224, 137}: "ION Networks, Inc.", + [3]byte{0, 224, 138}: "GEC AVERY, LTD.", + [3]byte{0, 224, 139}: "QLogic Corporation", + [3]byte{0, 224, 140}: "NEOPARADIGM LABS, INC.", + [3]byte{0, 224, 141}: "PRESSURE SYSTEMS, INC.", + [3]byte{0, 224, 142}: "UTSTARCOM", + [3]byte{0, 224, 143}: "Cisco Systems, Inc", + [3]byte{0, 224, 144}: "BECKMAN LAB. AUTOMATION DIV.", + [3]byte{0, 224, 145}: "LG Electronics", + [3]byte{0, 224, 146}: "ADMTEK INCORPORATED", + [3]byte{0, 224, 147}: "ACKFIN NETWORKS", + [3]byte{0, 224, 148}: "OSAI SRL", + [3]byte{0, 224, 149}: "ADVANCED-VISION TECHNOLGIES CORP.", + [3]byte{0, 224, 150}: "SHIMADZU CORPORATION", + [3]byte{0, 224, 151}: "CARRIER ACCESS CORPORATION", + [3]byte{0, 224, 152}: "AboCom", + [3]byte{0, 224, 153}: "SAMSON AG", + [3]byte{0, 224, 154}: "Positron Inc.", + [3]byte{0, 224, 155}: "ENGAGE NETWORKS, INC.", + [3]byte{0, 224, 156}: "MII", + [3]byte{0, 224, 157}: "SARNOFF CORPORATION", + [3]byte{0, 224, 158}: "Quantum Corporation", + [3]byte{0, 224, 159}: "PIXEL VISION", + [3]byte{0, 224, 160}: "WILTRON CO.", + [3]byte{0, 224, 161}: "HIMA PAUL HILDEBRANDT GmbH Co. KG", + [3]byte{0, 224, 162}: "MICROSLATE INC.", + [3]byte{0, 224, 163}: "Cisco Systems, Inc", + [3]byte{0, 224, 164}: "ESAOTE S.p.A.", + [3]byte{0, 224, 165}: "ComCore Semiconductor, Inc.", + [3]byte{0, 224, 166}: "TELOGY NETWORKS, INC.", + [3]byte{0, 224, 167}: "IPC INFORMATION SYSTEMS, INC.", + [3]byte{0, 224, 168}: "SAT GmbH & Co.", + [3]byte{0, 224, 169}: "FUNAI ELECTRIC CO., LTD.", + [3]byte{0, 224, 170}: "ELECTROSONIC LTD.", + [3]byte{0, 224, 171}: "DIMAT S.A.", + [3]byte{0, 224, 172}: "MIDSCO, INC.", + [3]byte{0, 224, 173}: "EES TECHNOLOGY, LTD.", + [3]byte{0, 224, 174}: "XAQTI CORPORATION", + [3]byte{0, 224, 175}: "GENERAL DYNAMICS INFORMATION SYSTEMS", + [3]byte{0, 224, 176}: "Cisco Systems, Inc", + [3]byte{0, 224, 177}: "Alcatel-Lucent Enterprise", + [3]byte{0, 224, 178}: "TELMAX COMMUNICATIONS CORP.", + [3]byte{0, 224, 179}: "EtherWAN Systems, Inc.", + [3]byte{0, 224, 180}: "TECHNO SCOPE CO., LTD.", + [3]byte{0, 224, 181}: "ARDENT COMMUNICATIONS CORP.", + [3]byte{0, 224, 182}: "Entrada Networks", + [3]byte{0, 224, 183}: "PI GROUP, LTD.", + [3]byte{0, 224, 184}: "GATEWAY 2000", + [3]byte{0, 224, 185}: "BYAS SYSTEMS", + [3]byte{0, 224, 186}: "BERGHOF AUTOMATIONSTECHNIK GmbH", + [3]byte{0, 224, 187}: "NBX CORPORATION", + [3]byte{0, 224, 188}: "SYMON COMMUNICATIONS, INC.", + [3]byte{0, 224, 189}: "INTERFACE SYSTEMS, INC.", + [3]byte{0, 224, 190}: "GENROCO INTERNATIONAL, INC.", + [3]byte{0, 224, 191}: "TORRENT NETWORKING TECHNOLOGIES CORP.", + [3]byte{0, 224, 192}: "SEIWA ELECTRIC MFG. CO., LTD.", + [3]byte{0, 224, 193}: "MEMOREX TELEX JAPAN, LTD.", + [3]byte{0, 224, 194}: "NECSY S.p.A.", + [3]byte{0, 224, 195}: "SAKAI SYSTEM DEVELOPMENT CORP.", + [3]byte{0, 224, 196}: "HORNER ELECTRIC, INC.", + [3]byte{0, 224, 197}: "BCOM ELECTRONICS INC.", + [3]byte{0, 224, 198}: "LINK2IT, L.L.C.", + [3]byte{0, 224, 199}: "EUROTECH SRL", + [3]byte{0, 224, 200}: "VIRTUAL ACCESS, LTD.", + [3]byte{0, 224, 201}: "AutomatedLogic Corporation", + [3]byte{0, 224, 202}: "BEST DATA PRODUCTS", + [3]byte{0, 224, 203}: "RESON, INC.", + [3]byte{0, 224, 204}: "HERO SYSTEMS, LTD.", + [3]byte{0, 224, 205}: "SAAB SENSIS CORPORATION", + [3]byte{0, 224, 206}: "ARN", + [3]byte{0, 224, 207}: "INTEGRATED DEVICE", + [3]byte{0, 224, 208}: "NETSPEED, INC.", + [3]byte{0, 224, 209}: "TELSIS LIMITED", + [3]byte{0, 224, 210}: "VERSANET COMMUNICATIONS, INC.", + [3]byte{0, 224, 211}: "DATENTECHNIK GmbH", + [3]byte{0, 224, 212}: "EXCELLENT COMPUTER", + [3]byte{0, 224, 213}: "Emulex Corporation", + [3]byte{0, 224, 214}: "COMPUTER & COMMUNICATION RESEARCH LAB.", + [3]byte{0, 224, 215}: "SUNSHINE ELECTRONICS, INC.", + [3]byte{0, 224, 216}: "LANBit Computer, Inc.", + [3]byte{0, 224, 217}: "TAZMO CO., LTD.", + [3]byte{0, 224, 218}: "Alcatel-Lucent Enterprise", + [3]byte{0, 224, 219}: "ViaVideo Communications, Inc.", + [3]byte{0, 224, 220}: "NEXWARE CORP.", + [3]byte{0, 224, 221}: "Zenith Electronics Corporation", + [3]byte{0, 224, 222}: "DATAX NV", + [3]byte{0, 224, 223}: "KEYMILE GmbH", + [3]byte{0, 224, 224}: "SI ELECTRONICS, LTD.", + [3]byte{0, 224, 225}: "G2 NETWORKS, INC.", + [3]byte{0, 224, 226}: "INNOVA CORP.", + [3]byte{0, 224, 227}: "SK-ELEKTRONIK GMBH", + [3]byte{0, 224, 228}: "FANUC ROBOTICS NORTH AMERICA, Inc.", + [3]byte{0, 224, 229}: "CINCO NETWORKS, INC.", + [3]byte{0, 224, 230}: "INCAA Computers", + [3]byte{0, 224, 231}: "RAYTHEON E-SYSTEMS, INC.", + [3]byte{0, 224, 232}: "GRETACODER Data Systems AG", + [3]byte{0, 224, 233}: "DATA LABS, INC.", + [3]byte{0, 224, 234}: "INNOVAT COMMUNICATIONS, INC.", + [3]byte{0, 224, 235}: "DIGICOM SYSTEMS, INCORPORATED", + [3]byte{0, 224, 236}: "CELESTICA INC.", + [3]byte{0, 224, 237}: "SILICOM, LTD.", + [3]byte{0, 224, 238}: "MAREL HF", + [3]byte{0, 224, 239}: "DIONEX", + [3]byte{0, 224, 240}: "ABLER TECHNOLOGY, INC.", + [3]byte{0, 224, 241}: "THAT CORPORATION", + [3]byte{0, 224, 242}: "ARLOTTO COMNET, INC.", + [3]byte{0, 224, 243}: "WebSprint Communications, Inc.", + [3]byte{0, 224, 244}: "INSIDE Technology A/S", + [3]byte{0, 224, 245}: "TELES AG", + [3]byte{0, 224, 246}: "DECISION EUROPE", + [3]byte{0, 224, 247}: "Cisco Systems, Inc", + [3]byte{0, 224, 248}: "DICNA CONTROL AB", + [3]byte{0, 224, 249}: "Cisco Systems, Inc", + [3]byte{0, 224, 250}: "TRL TECHNOLOGY, LTD.", + [3]byte{0, 224, 251}: "LEIGHTRONIX, INC.", + [3]byte{0, 224, 252}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{0, 224, 253}: "A-TREND TECHNOLOGY CO., LTD.", + [3]byte{0, 224, 254}: "Cisco Systems, Inc", + [3]byte{0, 224, 255}: "SECURITY DYNAMICS TECHNOLOGIES, Inc.", + [3]byte{0, 225, 109}: "Cisco Systems, Inc", + [3]byte{0, 225, 117}: "AK-Systems Ltd", + [3]byte{0, 225, 140}: "Intel Corporate", + [3]byte{0, 227, 178}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 228, 0}: "Sichuan Changhong Electric Ltd.", + [3]byte{0, 230, 102}: "ARIMA Communications Corp.", + [3]byte{0, 230, 211}: "NIXDORF COMPUTER CORP.", + [3]byte{0, 230, 232}: "Netzin Technology Corporation,.Ltd.", + [3]byte{0, 232, 171}: "Meggitt Training Systems, Inc.", + [3]byte{0, 235, 45}: "Sony Mobile Communications AB", + [3]byte{0, 235, 213}: "Cisco Systems, Inc", + [3]byte{0, 236, 10}: "Xiaomi Communications Co Ltd", + [3]byte{0, 238, 189}: "HTC Corporation", + [3]byte{0, 240, 81}: "KWB Gmbh", + [3]byte{0, 242, 44}: "Shanghai B-star Technology Co.,Ltd.", + [3]byte{0, 242, 139}: "Cisco Systems, Inc", + [3]byte{0, 243, 219}: "WOO Sports", + [3]byte{0, 244, 3}: "Orbis Systems Oy", + [3]byte{0, 244, 111}: "Samsung Electronics Co.,Ltd", + [3]byte{0, 244, 185}: "Apple, Inc.", + [3]byte{0, 246, 99}: "Cisco Systems, Inc", + [3]byte{0, 247, 111}: "Apple, Inc.", + [3]byte{0, 248, 28}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{0, 248, 44}: "Cisco Systems, Inc", + [3]byte{0, 248, 96}: "PT. Panggung Electric Citrabuana", + [3]byte{0, 248, 113}: "DGS Denmark A/S", + [3]byte{0, 250, 59}: "CLOOS ELECTRONIC GMBH", + [3]byte{0, 252, 88}: "WebSilicon Ltd.", + [3]byte{0, 252, 112}: "Intrepid Control Systems, Inc.", + [3]byte{0, 252, 139}: "Amazon Technologies Inc.", + [3]byte{0, 252, 141}: "Hitron Technologies. Inc", + [3]byte{0, 253, 69}: "Hewlett Packard Enterprise", + [3]byte{0, 253, 76}: "NEVATEC", + [3]byte{0, 254, 200}: "Cisco Systems, Inc", + [3]byte{2, 7, 1}: "RACAL-DATACOM", + [3]byte{2, 28, 124}: "PERQ SYSTEMS CORPORATION", + [3]byte{2, 96, 134}: "LOGIC REPLACEMENT TECH. LTD.", + [3]byte{2, 96, 140}: "3COM CORPORATION", + [3]byte{2, 112, 1}: "RACAL-DATACOM", + [3]byte{2, 112, 176}: "M/A-COM INC. COMPANIES", + [3]byte{2, 112, 179}: "DATA RECALL LTD.", + [3]byte{2, 157, 142}: "CARDIAC RECORDERS, INC.", + [3]byte{2, 170, 60}: "OLIVETTI TELECOMM SPA (OLTECO)", + [3]byte{2, 187, 1}: "OCTOTHORPE CORP.", + [3]byte{2, 192, 140}: "3COM CORPORATION", + [3]byte{2, 207, 28}: "Communication Machinery Corporation", + [3]byte{2, 230, 211}: "NIXDORF COMPUTER CORP.", + [3]byte{4, 2, 31}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{4, 3, 214}: "Nintendo Co.,Ltd", + [3]byte{4, 4, 234}: "Valens Semiconductor Ltd.", + [3]byte{4, 10, 131}: "Alcatel-Lucent", + [3]byte{4, 10, 224}: "XMIT AG COMPUTER NETWORKS", + [3]byte{4, 12, 206}: "Apple, Inc.", + [3]byte{4, 14, 194}: "ViewSonic Mobile China Limited", + [3]byte{4, 21, 82}: "Apple, Inc.", + [3]byte{4, 24, 15}: "Samsung Electronics Co.,Ltd", + [3]byte{4, 24, 182}: "Private", + [3]byte{4, 24, 214}: "Ubiquiti Networks Inc.", + [3]byte{4, 25, 127}: "Grasphere Japan", + [3]byte{4, 26, 4}: "WaveIP", + [3]byte{4, 27, 109}: "LG Electronics (Mobile Communications)", + [3]byte{4, 27, 148}: "Host Mobility AB", + [3]byte{4, 27, 186}: "Samsung Electronics Co.,Ltd", + [3]byte{4, 29, 16}: "Dream Ware Inc.", + [3]byte{4, 30, 100}: "Apple, Inc.", + [3]byte{4, 30, 122}: "DSPWorks", + [3]byte{4, 32, 154}: "Panasonic Corporation AVC Networks Company", + [3]byte{4, 33, 76}: "Insight Energy Ventures LLC", + [3]byte{4, 34, 52}: "Wireless Standard Extensions", + [3]byte{4, 37, 197}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{4, 38, 5}: "GFR Gesellschaft für Regelungstechnik und Energieeinsparung mbH", + [3]byte{4, 38, 101}: "Apple, Inc.", + [3]byte{4, 39, 88}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{4, 42, 226}: "Cisco Systems, Inc", + [3]byte{4, 43, 187}: "PicoCELA, Inc.", + [3]byte{4, 45, 180}: "First Property (Beijing) Co., Ltd Modern MOMA Branch", + [3]byte{4, 47, 86}: "ATOCS (Shenzhen) LTD", + [3]byte{4, 49, 16}: "Inspur Group Co., Ltd.", + [3]byte{4, 50, 244}: "Partron", + [3]byte{4, 51, 137}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{4, 54, 4}: "Gyeyoung I&T", + [3]byte{4, 58, 13}: "SM Optics S.r.l.", + [3]byte{4, 61, 152}: "ChongQing QingJia Electronics CO.,LTD", + [3]byte{4, 65, 105}: "GoPro", + [3]byte{4, 68, 161}: "TELECON GALICIA,S.A.", + [3]byte{4, 70, 101}: "Murata Manufacturing Co., Ltd.", + [3]byte{4, 72, 154}: "Apple, Inc.", + [3]byte{4, 74, 80}: "Ramaxel Technology (Shenzhen) limited company", + [3]byte{4, 75, 237}: "Apple, Inc.", + [3]byte{4, 75, 255}: "GuangZhou Hedy Digital Technology Co., Ltd", + [3]byte{4, 76, 239}: "Fujian Sanao Technology Co.,Ltd", + [3]byte{4, 78, 6}: "Ericsson AB", + [3]byte{4, 78, 90}: "ARRIS Group, Inc.", + [3]byte{4, 79, 76}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{4, 79, 139}: "Adapteva, Inc.", + [3]byte{4, 79, 170}: "Ruckus Wireless", + [3]byte{4, 80, 218}: "Qiku Internet Network Scientific (Shenzhen) Co., Ltd", + [3]byte{4, 82, 199}: "Bose Corporation", + [3]byte{4, 82, 243}: "Apple, Inc.", + [3]byte{4, 83, 213}: "Sysorex Global Holdings", + [3]byte{4, 84, 83}: "Apple, Inc.", + [3]byte{4, 85, 202}: "BriView (Xiamen) Corp.", + [3]byte{4, 86, 4}: "Gionee Communication Equipment Co.,Ltd.", + [3]byte{4, 87, 47}: "Sertel Electronics UK Ltd", + [3]byte{4, 88, 111}: "Sichuan Whayer information industry Co.,LTD", + [3]byte{4, 90, 149}: "Nokia Corporation", + [3]byte{4, 92, 6}: "Zmodo Technology Corporation", + [3]byte{4, 92, 142}: "gosund GROUP CO.,LTD", + [3]byte{4, 93, 75}: "Sony Corporation", + [3]byte{4, 93, 86}: "camtron industrial inc.", + [3]byte{4, 95, 167}: "Shenzhen Yichen Technology Development Co.,LTD", + [3]byte{4, 97, 105}: "MEDIA GLOBAL LINKS CO., LTD.", + [3]byte{4, 98, 115}: "Cisco Systems, Inc", + [3]byte{4, 98, 215}: "ALSTOM HYDRO FRANCE", + [3]byte{4, 99, 224}: "Nome Oy", + [3]byte{4, 101, 101}: "Testop", + [3]byte{4, 103, 133}: "scemtec Hard- und Software fuer Mess- und Steuerungstechnik GmbH", + [3]byte{4, 105, 248}: "Apple, Inc.", + [3]byte{4, 108, 157}: "Cisco Systems, Inc", + [3]byte{4, 109, 66}: "Bryston Ltd.", + [3]byte{4, 110, 2}: "OpenRTLS Group", + [3]byte{4, 110, 73}: "TaiYear Electronic Technology (Suzhou) Co., Ltd", + [3]byte{4, 112, 188}: "Globalstar Inc.", + [3]byte{4, 113, 75}: "IEEE Registration Authority", + [3]byte{4, 116, 161}: "Aligera Equipamentos Digitais Ltda", + [3]byte{4, 117, 3}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{4, 117, 245}: "CSST", + [3]byte{4, 118, 110}: "ALPS ELECTRIC CO.,LTD.", + [3]byte{4, 120, 99}: "Shanghai MXCHIP Information Technology Co., Ltd.", + [3]byte{4, 125, 80}: "Shenzhen Kang Ying Technology Co.Ltd.", + [3]byte{4, 125, 123}: "QUANTA COMPUTER INC.", + [3]byte{4, 126, 74}: "moobox CO., Ltd.", + [3]byte{4, 129, 174}: "Clack Corporation", + [3]byte{4, 132, 138}: "7INOVA TECHNOLOGY LIMITED", + [3]byte{4, 136, 140}: "Eifelwerk Butler Systeme GmbH", + [3]byte{4, 136, 226}: "Beats Electronics LLC", + [3]byte{4, 138, 21}: "Avaya Inc", + [3]byte{4, 139, 66}: "Skspruce Technologies", + [3]byte{4, 140, 3}: "ThinPAD Technology (Shenzhen)CO.,LTD", + [3]byte{4, 141, 56}: "Netcore Technology Inc.", + [3]byte{4, 146, 238}: "iway AG", + [3]byte{4, 148, 107}: "TECNO MOBILE LIMITED", + [3]byte{4, 148, 161}: "CATCH THE WIND INC", + [3]byte{4, 149, 115}: "zte corporation", + [3]byte{4, 149, 230}: "Tenda Technology Co.,Ltd.Dongguan branch", + [3]byte{4, 150, 69}: "WUXI SKY CHIP INTERCONNECTION TECHNOLOGY CO.,LTD.", + [3]byte{4, 151, 144}: "Lartech telecom LLC", + [3]byte{4, 152, 243}: "ALPS ELECTRIC CO.,LTD.", + [3]byte{4, 153, 230}: "Shenzhen Yoostar Technology Co., Ltd", + [3]byte{4, 155, 156}: "Eadingcore Intelligent Technology Co., Ltd.", + [3]byte{4, 156, 98}: "BMT Medical Technology s.r.o.", + [3]byte{4, 159, 6}: "Smobile Co., Ltd.", + [3]byte{4, 159, 129}: "NetScout Systems, Inc.", + [3]byte{4, 159, 202}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{4, 161, 81}: "NETGEAR", + [3]byte{4, 163, 22}: "Texas Instruments", + [3]byte{4, 163, 243}: "Emicon", + [3]byte{4, 168, 42}: "Nokia Corporation", + [3]byte{4, 176, 231}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{4, 177, 103}: "Xiaomi Communications Co Ltd", + [3]byte{4, 179, 182}: "Seamap (UK) Ltd", + [3]byte{4, 180, 102}: "BSP Co., Ltd.", + [3]byte{4, 182, 72}: "ZENNER", + [3]byte{4, 186, 54}: "Li Seng Technology Ltd", + [3]byte{4, 187, 249}: "Pavilion Data Systems Inc", + [3]byte{4, 189, 112}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{4, 189, 136}: "Aruba Networks", + [3]byte{4, 191, 109}: "Zyxel Communications Corporation", + [3]byte{4, 191, 168}: "ISB Corporation", + [3]byte{4, 192, 91}: "Tigo Energy", + [3]byte{4, 192, 111}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{4, 192, 156}: "Tellabs Inc.", + [3]byte{4, 193, 3}: "Clover Network, Inc.", + [3]byte{4, 193, 185}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{4, 194, 62}: "HTC Corporation", + [3]byte{4, 197, 164}: "Cisco Systems, Inc", + [3]byte{4, 200, 128}: "Samtec Inc", + [3]byte{4, 201, 145}: "Phistek INC.", + [3]byte{4, 201, 217}: "Echostar Technologies Corp", + [3]byte{4, 203, 29}: "Traka plc", + [3]byte{4, 206, 20}: "Wilocity LTD.", + [3]byte{4, 207, 37}: "MANYCOLORS, INC.", + [3]byte{4, 211, 207}: "Apple, Inc.", + [3]byte{4, 212, 55}: "ZNV", + [3]byte{4, 214, 170}: "SAMSUNG ELECTRO-MECHANICS(THAILAND)", + [3]byte{4, 215, 131}: "Y&H E&C Co.,LTD.", + [3]byte{4, 218, 210}: "Cisco Systems, Inc", + [3]byte{4, 219, 86}: "Apple, Inc.", + [3]byte{4, 219, 138}: "Suntech International Ltd.", + [3]byte{4, 221, 76}: "Velocytech", + [3]byte{4, 222, 219}: "Rockport Networks Inc", + [3]byte{4, 222, 242}: "Shenzhen ECOM Technology Co. Ltd", + [3]byte{4, 223, 105}: "Car Connectivity Consortium", + [3]byte{4, 224, 176}: "Shenzhen YOUHUA Technology Co., Ltd", + [3]byte{4, 224, 196}: "TRIUMPH-ADLER AG", + [3]byte{4, 225, 200}: "IMS Soluções em Energia Ltda.", + [3]byte{4, 226, 248}: "AEP Ticketing solutions srl", + [3]byte{4, 228, 81}: "Texas Instruments", + [3]byte{4, 229, 54}: "Apple, Inc.", + [3]byte{4, 229, 72}: "Cohda Wireless Pty Ltd", + [3]byte{4, 230, 98}: "Acroname Inc.", + [3]byte{4, 230, 118}: "AMPAK Technology, Inc.", + [3]byte{4, 233, 229}: "PJRC.COM, LLC", + [3]byte{4, 238, 145}: "x-fabric GmbH", + [3]byte{4, 240, 33}: "Compex Systems Pte Ltd", + [3]byte{4, 241, 40}: "HMD Global Oy", + [3]byte{4, 241, 62}: "Apple, Inc.", + [3]byte{4, 241, 125}: "Tarana Wireless", + [3]byte{4, 244, 188}: "Xena Networks", + [3]byte{4, 247, 228}: "Apple, Inc.", + [3]byte{4, 248, 194}: "Flaircomm Microelectronics, Inc.", + [3]byte{4, 249, 56}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{4, 250, 63}: "Opticore Inc.", + [3]byte{4, 254, 49}: "Samsung Electronics Co.,Ltd", + [3]byte{4, 254, 127}: "Cisco Systems, Inc", + [3]byte{4, 254, 141}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{4, 254, 161}: "Fihonest communication co.,Ltd", + [3]byte{4, 255, 81}: "NOVAMEDIA INNOVISION SP. Z O.O.", + [3]byte{8, 0, 1}: "COMPUTERVISION CORPORATION", + [3]byte{8, 0, 2}: "BRIDGE COMMUNICATIONS INC.", + [3]byte{8, 0, 3}: "ADVANCED COMPUTER COMM.", + [3]byte{8, 0, 4}: "CROMEMCO INCORPORATED", + [3]byte{8, 0, 5}: "SYMBOLICS INC.", + [3]byte{8, 0, 6}: "SIEMENS AG", + [3]byte{8, 0, 7}: "Apple, Inc.", + [3]byte{8, 0, 8}: "BOLT BERANEK AND NEWMAN INC.", + [3]byte{8, 0, 9}: "Hewlett Packard", + [3]byte{8, 0, 10}: "NESTAR SYSTEMS INCORPORATED", + [3]byte{8, 0, 11}: "UNISYS CORPORATION", + [3]byte{8, 0, 12}: "MIKLYN DEVELOPMENT CO.", + [3]byte{8, 0, 13}: "International Computers, Ltd", + [3]byte{8, 0, 14}: "NCR CORPORATION", + [3]byte{8, 0, 15}: "MITEL CORPORATION", + [3]byte{8, 0, 17}: "TEKTRONIX INC.", + [3]byte{8, 0, 18}: "BELL ATLANTIC INTEGRATED SYST.", + [3]byte{8, 0, 19}: "Exxon", + [3]byte{8, 0, 20}: "EXCELAN", + [3]byte{8, 0, 21}: "STC BUSINESS SYSTEMS", + [3]byte{8, 0, 22}: "BARRISTER INFO SYS CORP", + [3]byte{8, 0, 23}: "NATIONAL SEMICONDUCTOR", + [3]byte{8, 0, 24}: "PIRELLI FOCOM NETWORKS", + [3]byte{8, 0, 25}: "GENERAL ELECTRIC CORPORATION", + [3]byte{8, 0, 26}: "TIARA/ 10NET", + [3]byte{8, 0, 27}: "Dell EMC", + [3]byte{8, 0, 28}: "KDD-KOKUSAI DEBNSIN DENWA CO.", + [3]byte{8, 0, 29}: "ABLE COMMUNICATIONS INC.", + [3]byte{8, 0, 30}: "APOLLO COMPUTER INC.", + [3]byte{8, 0, 31}: "SHARP CORPORATION", + [3]byte{8, 0, 32}: "Oracle Corporation", + [3]byte{8, 0, 33}: "3M COMPANY", + [3]byte{8, 0, 34}: "NBI INC.", + [3]byte{8, 0, 35}: "Panasonic Communications Co., Ltd.", + [3]byte{8, 0, 36}: "10NET COMMUNICATIONS/DCA", + [3]byte{8, 0, 37}: "CONTROL DATA", + [3]byte{8, 0, 38}: "NORSK DATA A.S.", + [3]byte{8, 0, 39}: "PCS Systemtechnik GmbH", + [3]byte{8, 0, 40}: "Texas Instruments", + [3]byte{8, 0, 41}: "Megatek Corporation", + [3]byte{8, 0, 42}: "MOSAIC TECHNOLOGIES INC.", + [3]byte{8, 0, 43}: "DIGITAL EQUIPMENT CORPORATION", + [3]byte{8, 0, 44}: "BRITTON LEE INC.", + [3]byte{8, 0, 45}: "LAN-TEC INC.", + [3]byte{8, 0, 46}: "METAPHOR COMPUTER SYSTEMS", + [3]byte{8, 0, 47}: "PRIME COMPUTER INC.", + [3]byte{8, 0, 48}: "CERN", + [3]byte{8, 0, 48}: "NETWORK RESEARCH CORPORATION", + [3]byte{8, 0, 48}: "ROYAL MELBOURNE INST OF TECH", + [3]byte{8, 0, 49}: "LITTLE MACHINES INC.", + [3]byte{8, 0, 50}: "TIGAN INCORPORATED", + [3]byte{8, 0, 51}: "BAUSCH & LOMB", + [3]byte{8, 0, 52}: "FILENET CORPORATION", + [3]byte{8, 0, 53}: "MICROFIVE CORPORATION", + [3]byte{8, 0, 54}: "INTERGRAPH CORPORATION", + [3]byte{8, 0, 55}: "FUJI-XEROX CO. LTD.", + [3]byte{8, 0, 56}: "BULL S.A.S.", + [3]byte{8, 0, 57}: "SPIDER SYSTEMS LIMITED", + [3]byte{8, 0, 58}: "ORCATECH INC.", + [3]byte{8, 0, 59}: "TORUS SYSTEMS LIMITED", + [3]byte{8, 0, 60}: "SCHLUMBERGER WELL SERVICES", + [3]byte{8, 0, 61}: "CADNETIX CORPORATIONS", + [3]byte{8, 0, 62}: "CODEX CORPORATION", + [3]byte{8, 0, 63}: "FRED KOSCHARA ENTERPRISES", + [3]byte{8, 0, 64}: "FERRANTI COMPUTER SYS. LIMITED", + [3]byte{8, 0, 65}: "RACAL-MILGO INFORMATION SYS..", + [3]byte{8, 0, 66}: "JAPAN MACNICS CORP.", + [3]byte{8, 0, 67}: "PIXEL COMPUTER INC.", + [3]byte{8, 0, 68}: "DAVID SYSTEMS INC.", + [3]byte{8, 0, 69}: "CONCURRENT COMPUTER CORP.", + [3]byte{8, 0, 70}: "Sony Corporation", + [3]byte{8, 0, 71}: "SEQUENT COMPUTER SYSTEMS INC.", + [3]byte{8, 0, 72}: "EUROTHERM GAUGING SYSTEMS", + [3]byte{8, 0, 73}: "UNIVATION", + [3]byte{8, 0, 74}: "BANYAN SYSTEMS INC.", + [3]byte{8, 0, 75}: "Planning Research Corp.", + [3]byte{8, 0, 76}: "HYDRA COMPUTER SYSTEMS INC.", + [3]byte{8, 0, 77}: "CORVUS SYSTEMS INC.", + [3]byte{8, 0, 78}: "3COM EUROPE LTD.", + [3]byte{8, 0, 79}: "CYGNET SYSTEMS", + [3]byte{8, 0, 80}: "DAISY SYSTEMS CORP.", + [3]byte{8, 0, 81}: "ExperData", + [3]byte{8, 0, 82}: "INSYSTEC", + [3]byte{8, 0, 83}: "MIDDLE EAST TECH. UNIVERSITY", + [3]byte{8, 0, 85}: "STANFORD TELECOMM. INC.", + [3]byte{8, 0, 86}: "STANFORD LINEAR ACCEL. CENTER", + [3]byte{8, 0, 87}: "Evans & Sutherland", + [3]byte{8, 0, 88}: "SYSTEMS CONCEPTS", + [3]byte{8, 0, 89}: "A/S MYCRON", + [3]byte{8, 0, 90}: "IBM Corp", + [3]byte{8, 0, 91}: "VTA TECHNOLOGIES INC.", + [3]byte{8, 0, 92}: "FOUR PHASE SYSTEMS", + [3]byte{8, 0, 93}: "GOULD INC.", + [3]byte{8, 0, 94}: "COUNTERPOINT COMPUTER INC.", + [3]byte{8, 0, 95}: "SABER TECHNOLOGY CORP.", + [3]byte{8, 0, 96}: "INDUSTRIAL NETWORKING INC.", + [3]byte{8, 0, 97}: "JAROGATE LTD.", + [3]byte{8, 0, 98}: "General Dynamics", + [3]byte{8, 0, 99}: "PLESSEY", + [3]byte{8, 0, 100}: "Sitasys AG", + [3]byte{8, 0, 101}: "GENRAD INC.", + [3]byte{8, 0, 102}: "AGFA CORPORATION", + [3]byte{8, 0, 103}: "ComDesign", + [3]byte{8, 0, 104}: "RIDGE COMPUTERS", + [3]byte{8, 0, 105}: "SILICON GRAPHICS INC.", + [3]byte{8, 0, 106}: "AT&T", + [3]byte{8, 0, 107}: "ACCEL TECHNOLOGIES INC.", + [3]byte{8, 0, 108}: "SUNTEK TECHNOLOGY INT'L", + [3]byte{8, 0, 109}: "WHITECHAPEL COMPUTER WORKS", + [3]byte{8, 0, 110}: "MASSCOMP", + [3]byte{8, 0, 111}: "PHILIPS APELDOORN B.V.", + [3]byte{8, 0, 112}: "Mitsubishi Precision Co.,LTd.", + [3]byte{8, 0, 113}: "MATRA (DSIE)", + [3]byte{8, 0, 114}: "XEROX CORP UNIV GRANT PROGRAM", + [3]byte{8, 0, 115}: "TECMAR INC.", + [3]byte{8, 0, 116}: "CASIO COMPUTER CO. LTD.", + [3]byte{8, 0, 117}: "DANSK DATA ELECTRONIK", + [3]byte{8, 0, 118}: "PC LAN TECHNOLOGIES", + [3]byte{8, 0, 119}: "TSL COMMUNICATIONS LTD.", + [3]byte{8, 0, 120}: "ACCELL CORPORATION", + [3]byte{8, 0, 121}: "THE DROID WORKS", + [3]byte{8, 0, 122}: "INDATA", + [3]byte{8, 0, 123}: "SANYO ELECTRIC CO. LTD.", + [3]byte{8, 0, 124}: "VITALINK COMMUNICATIONS CORP.", + [3]byte{8, 0, 126}: "AMALGAMATED WIRELESS(AUS) LTD", + [3]byte{8, 0, 127}: "CARNEGIE-MELLON UNIVERSITY", + [3]byte{8, 0, 128}: "AES DATA INC.", + [3]byte{8, 0, 129}: "ASTECH INC.", + [3]byte{8, 0, 130}: "VERITAS SOFTWARE", + [3]byte{8, 0, 131}: "Seiko Instruments Inc.", + [3]byte{8, 0, 132}: "TOMEN ELECTRONICS CORP.", + [3]byte{8, 0, 133}: "ELXSI", + [3]byte{8, 0, 134}: "KONICA MINOLTA HOLDINGS, INC.", + [3]byte{8, 0, 135}: "Xyplex, Inc.", + [3]byte{8, 0, 136}: "Brocade Communications Systems, Inc.", + [3]byte{8, 0, 137}: "Kinetics", + [3]byte{8, 0, 138}: "PerfTech, Inc.", + [3]byte{8, 0, 139}: "PYRAMID TECHNOLOGY CORP.", + [3]byte{8, 0, 140}: "NETWORK RESEARCH CORPORATION", + [3]byte{8, 0, 141}: "XYVISION INC.", + [3]byte{8, 0, 142}: "Tandem Computers", + [3]byte{8, 0, 143}: "CHIPCOM CORPORATION", + [3]byte{8, 0, 144}: "SONOMA SYSTEMS", + [3]byte{8, 1, 15}: "SICHUAN TIANYI COMHEART TELECOMCO.,LTD", + [3]byte{8, 2, 142}: "NETGEAR", + [3]byte{8, 3, 113}: "KRG CORPORATE", + [3]byte{8, 5, 129}: "Roku, Inc.", + [3]byte{8, 5, 205}: "DongGuang EnMai Electronic Product Co.Ltd.", + [3]byte{8, 8, 194}: "Samsung Electronics Co.,Ltd", + [3]byte{8, 8, 234}: "AMSC", + [3]byte{8, 9, 182}: "Masimo Corp", + [3]byte{8, 10, 78}: "Planet Bingo® — 3rd Rock Gaming®", + [3]byte{8, 12, 11}: "SysMik GmbH Dresden", + [3]byte{8, 12, 201}: "Mission Technology Group, dba Magma", + [3]byte{8, 13, 132}: "GECO, Inc.", + [3]byte{8, 14, 168}: "Velex s.r.l.", + [3]byte{8, 15, 250}: "KSP INC.", + [3]byte{8, 17, 94}: "Bitel Co., Ltd.", + [3]byte{8, 17, 150}: "Intel Corporate", + [3]byte{8, 20, 67}: "UNIBRAIN S.A.", + [3]byte{8, 21, 47}: "Samsung Electronics Co., Ltd. ARTIK", + [3]byte{8, 22, 81}: "SHENZHEN SEA STAR TECHNOLOGY CO.,LTD", + [3]byte{8, 23, 53}: "Cisco Systems, Inc", + [3]byte{8, 23, 244}: "IBM Corp", + [3]byte{8, 24, 26}: "zte corporation", + [3]byte{8, 24, 76}: "A. S. Thomas, Inc.", + [3]byte{8, 25, 166}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{8, 29, 251}: "Shanghai Mexon Communication Technology Co.,Ltd", + [3]byte{8, 31, 63}: "WondaLink Inc.", + [3]byte{8, 31, 113}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{8, 31, 235}: "BinCube", + [3]byte{8, 31, 243}: "Cisco Systems, Inc", + [3]byte{8, 33, 239}: "Samsung Electronics Co.,Ltd", + [3]byte{8, 35, 178}: "vivo Mobile Communication Co., Ltd.", + [3]byte{8, 37, 34}: "ADVANSEE", + [3]byte{8, 39, 25}: "APS systems/electronic AG", + [3]byte{8, 39, 206}: "NAGANO KEIKI CO., LTD.", + [3]byte{8, 42, 208}: "SRD Innovations Inc.", + [3]byte{8, 44, 176}: "Network Instruments", + [3]byte{8, 46, 95}: "Hewlett Packard", + [3]byte{8, 48, 107}: "Palo Alto Networks", + [3]byte{8, 53, 113}: "CASwell INC.", + [3]byte{8, 53, 178}: "CoreEdge Networks Co., Ltd", + [3]byte{8, 55, 61}: "Samsung Electronics Co.,Ltd", + [3]byte{8, 55, 156}: "Topaz Co. LTD.", + [3]byte{8, 56, 165}: "Funkwerk plettac electronic GmbH", + [3]byte{8, 58, 92}: "Junilab, Inc.", + [3]byte{8, 58, 184}: "Shinoda Plasma Co., Ltd.", + [3]byte{8, 61, 136}: "Samsung Electronics Co.,Ltd", + [3]byte{8, 62, 12}: "ARRIS Group, Inc.", + [3]byte{8, 62, 93}: "Sagemcom Broadband SAS", + [3]byte{8, 62, 142}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{8, 63, 62}: "WSH GmbH", + [3]byte{8, 63, 118}: "Intellian Technologies, Inc.", + [3]byte{8, 63, 188}: "zte corporation", + [3]byte{8, 64, 39}: "Gridstore Inc.", + [3]byte{8, 64, 243}: "Tenda Technology Co.,Ltd.Dongguan branch", + [3]byte{8, 70, 86}: "VEO-LABS", + [3]byte{8, 72, 44}: "Raycore Taiwan Co., LTD.", + [3]byte{8, 74, 207}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{8, 78, 28}: "H2A Systems, LLC", + [3]byte{8, 78, 191}: "Broad Net Mux Corporation", + [3]byte{8, 81, 20}: "QINGDAO TOPSCOMM COMMUNICATION CO., LTD", + [3]byte{8, 81, 46}: "Orion Diagnostica Oy", + [3]byte{8, 82, 64}: "EbV Elektronikbau- und Vertriebs GmbH", + [3]byte{8, 87, 0}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{8, 90, 224}: "Recovision Technology Co., Ltd.", + [3]byte{8, 91, 14}: "Fortinet, Inc.", + [3]byte{8, 91, 218}: "CliniCare LTD", + [3]byte{8, 93, 221}: "MERCURY CORPORATION", + [3]byte{8, 96, 110}: "ASUSTek COMPUTER INC.", + [3]byte{8, 98, 102}: "ASUSTek COMPUTER INC.", + [3]byte{8, 99, 97}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{8, 102, 31}: "Palo Alto Networks", + [3]byte{8, 102, 152}: "Apple, Inc.", + [3]byte{8, 103, 78}: "Hisense broadband multimedia technology Co.,Ltd", + [3]byte{8, 104, 208}: "Japan System Design", + [3]byte{8, 104, 234}: "EITO ELECTRONICS CO., LTD.", + [3]byte{8, 106, 10}: "ASKEY COMPUTER CORP", + [3]byte{8, 109, 65}: "Apple, Inc.", + [3]byte{8, 109, 242}: "Shenzhen MIMOWAVE Technology Co.,Ltd", + [3]byte{8, 112, 69}: "Apple, Inc.", + [3]byte{8, 116, 2}: "Apple, Inc.", + [3]byte{8, 116, 246}: "Winterhalter Gastronom GmbH", + [3]byte{8, 117, 114}: "Obelux Oy", + [3]byte{8, 118, 24}: "ViE Technologies Sdn. Bhd.", + [3]byte{8, 118, 149}: "Auto Industrial Co., Ltd.", + [3]byte{8, 118, 255}: "Thomson Telecom Belgium", + [3]byte{8, 120, 8}: "Samsung Electronics Co.,Ltd", + [3]byte{8, 121, 153}: "AIM GmbH", + [3]byte{8, 122, 76}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{8, 123, 170}: "SVYAZKOMPLEKTSERVICE, LLC", + [3]byte{8, 124, 190}: "Quintic Corp.", + [3]byte{8, 125, 33}: "Altasec technology corporation", + [3]byte{8, 128, 57}: "Cisco SPVTG", + [3]byte{8, 129, 188}: "HongKong Ipro Technology Co., Limited", + [3]byte{8, 129, 244}: "Juniper Networks", + [3]byte{8, 132, 102}: "Novartis Pharma AG", + [3]byte{8, 134, 32}: "TECNO MOBILE LIMITED", + [3]byte{8, 134, 59}: "Belkin International Inc.", + [3]byte{8, 140, 44}: "Samsung Electronics Co.,Ltd", + [3]byte{8, 141, 200}: "Ryowa Electronics Co.,Ltd", + [3]byte{8, 142, 79}: "SF Software Solutions", + [3]byte{8, 143, 44}: "Hills Sound Vision & Lighting", + [3]byte{8, 148, 239}: "Wistron Infocomm (Zhongshan) Corporation", + [3]byte{8, 149, 42}: "Technicolor CH USA Inc.", + [3]byte{8, 150, 173}: "Cisco Systems, Inc", + [3]byte{8, 150, 215}: "AVM GmbH", + [3]byte{8, 151, 88}: "Shenzhen Strong Rising Electronics Co.,Ltd DongGuan Subsidiary", + [3]byte{8, 155, 75}: "iKuai Networks", + [3]byte{8, 158, 1}: "QUANTA COMPUTER INC.", + [3]byte{8, 158, 8}: "Google, Inc.", + [3]byte{8, 159, 151}: "LEROY AUTOMATION", + [3]byte{8, 161, 43}: "ShenZhen EZL Technology Co., Ltd", + [3]byte{8, 165, 200}: "Sunnovo International Limited", + [3]byte{8, 168, 161}: "Cyclotronics Power Concepts, Inc", + [3]byte{8, 169, 90}: "AzureWave Technology Inc.", + [3]byte{8, 172, 165}: "Benu Video, Inc.", + [3]byte{8, 175, 120}: "Totus Solutions, Inc.", + [3]byte{8, 178, 88}: "Juniper Networks", + [3]byte{8, 178, 163}: "Cynny Italia S.r.L.", + [3]byte{8, 180, 207}: "Abicom International", + [3]byte{8, 183, 56}: "Lite-On Technogy Corp.", + [3]byte{8, 183, 236}: "Wireless Seismic", + [3]byte{8, 186, 34}: "Swaive Corporation", + [3]byte{8, 187, 204}: "AK-NORD EDV VERTRIEBSGES. mbH", + [3]byte{8, 188, 32}: "Hangzhou Royal Cloud Technology Co., Ltd", + [3]byte{8, 189, 67}: "NETGEAR", + [3]byte{8, 190, 9}: "Astrol Electronic AG", + [3]byte{8, 190, 119}: "Green Electronics", + [3]byte{8, 190, 172}: "Edimax Technology Co. Ltd.", + [3]byte{8, 192, 33}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{8, 198, 179}: "QTECH LLC", + [3]byte{8, 202, 69}: "Toyou Feiji Electronics Co., Ltd.", + [3]byte{8, 204, 104}: "Cisco Systems, Inc", + [3]byte{8, 204, 167}: "Cisco Systems, Inc", + [3]byte{8, 205, 155}: "samtec automotive electronics & software GmbH", + [3]byte{8, 208, 159}: "Cisco Systems, Inc", + [3]byte{8, 208, 183}: "Qingdao Hisense Communications Co.,Ltd.", + [3]byte{8, 210, 154}: "Proformatique", + [3]byte{8, 211, 75}: "Techman Electronics (Changshu) Co., Ltd.", + [3]byte{8, 212, 12}: "Intel Corporate", + [3]byte{8, 212, 43}: "Samsung Electronics Co.,Ltd", + [3]byte{8, 213, 192}: "Seers Technology Co., Ltd", + [3]byte{8, 216, 51}: "Shenzhen RF Technology Co., Ltd", + [3]byte{8, 223, 31}: "Bose Corporation", + [3]byte{8, 229, 218}: "NANJING FUJITSU COMPUTER PRODUCTS CO.,LTD.", + [3]byte{8, 230, 114}: "JEBSEE ELECTRONICS CO.,LTD.", + [3]byte{8, 232, 79}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{8, 234, 64}: "SHENZHEN BILIAN ELECTRONIC CO.,LTD", + [3]byte{8, 234, 68}: "Aerohive Networks Inc.", + [3]byte{8, 235, 41}: "Jiangsu Huitong Group Co.,Ltd.", + [3]byte{8, 235, 116}: "HUMAX Co., Ltd.", + [3]byte{8, 235, 237}: "World Elite Technology Co.,LTD", + [3]byte{8, 236, 169}: "Samsung Electronics Co.,Ltd", + [3]byte{8, 237, 2}: "IEEE Registration Authority", + [3]byte{8, 237, 185}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{8, 238, 139}: "Samsung Electronics Co.,Ltd", + [3]byte{8, 239, 59}: "MCS Logic Inc.", + [3]byte{8, 239, 171}: "SAYME WIRELESS SENSOR NETWORK", + [3]byte{8, 241, 183}: "Towerstream Corpration", + [3]byte{8, 242, 244}: "Net One Partners Co.,Ltd.", + [3]byte{8, 244, 171}: "Apple, Inc.", + [3]byte{8, 246, 248}: "GET Engineering", + [3]byte{8, 247, 40}: "GLOBO Multimedia Sp. z o.o. Sp.k.", + [3]byte{8, 250, 224}: "Fohhn Audio AG", + [3]byte{8, 252, 82}: "OpenXS BV", + [3]byte{8, 252, 136}: "Samsung Electronics Co.,Ltd", + [3]byte{8, 253, 14}: "Samsung Electronics Co.,Ltd", + [3]byte{12, 2, 39}: "Technicolor CH USA Inc.", + [3]byte{12, 4, 0}: "Jantar d.o.o.", + [3]byte{12, 5, 53}: "Juniper Systems", + [3]byte{12, 17, 5}: "Ringslink (Xiamen) Network Communication Technologies Co., Ltd", + [3]byte{12, 17, 103}: "Cisco Systems, Inc", + [3]byte{12, 18, 98}: "zte corporation", + [3]byte{12, 19, 11}: "Uniqoteq Ltd.", + [3]byte{12, 20, 32}: "Samsung Electronics Co.,Ltd", + [3]byte{12, 21, 57}: "Apple, Inc.", + [3]byte{12, 21, 197}: "SDTEC Co., Ltd.", + [3]byte{12, 23, 241}: "TELECSYS", + [3]byte{12, 25, 31}: "Inform Electronik", + [3]byte{12, 26, 16}: "Acoustic Stream", + [3]byte{12, 28, 32}: "Kakao Corp", + [3]byte{12, 29, 175}: "Xiaomi Communications Co Ltd", + [3]byte{12, 29, 194}: "SeAH Networks", + [3]byte{12, 32, 38}: "noax Technologies AG", + [3]byte{12, 37, 118}: "LONGCHEER TELECOMMUNICATION LIMITED", + [3]byte{12, 39, 36}: "Cisco Systems, Inc", + [3]byte{12, 39, 85}: "Valuable Techologies Limited", + [3]byte{12, 42, 105}: "electric imp, incorporated", + [3]byte{12, 42, 231}: "Beijing General Research Institute of Mining and Metallurgy", + [3]byte{12, 45, 137}: "QiiQ Communications Inc.", + [3]byte{12, 48, 33}: "Apple, Inc.", + [3]byte{12, 55, 71}: "zte corporation", + [3]byte{12, 55, 220}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{12, 56, 62}: "Fanvil Technology Co., Ltd.", + [3]byte{12, 57, 86}: "Observator instruments", + [3]byte{12, 60, 101}: "Dome Imaging Inc", + [3]byte{12, 60, 205}: "Universal Global Scientific Industrial Co., Ltd.", + [3]byte{12, 62, 159}: "Apple, Inc.", + [3]byte{12, 65, 62}: "Microsoft Corporation", + [3]byte{12, 69, 186}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{12, 70, 157}: "MS Sedco", + [3]byte{12, 71, 61}: "Hitron Technologies. Inc", + [3]byte{12, 71, 201}: "Amazon Technologies Inc.", + [3]byte{12, 72, 133}: "LG Electronics (Mobile Communications)", + [3]byte{12, 73, 51}: "Sichuan Jiuzhou Electronic Technology Co., Ltd.", + [3]byte{12, 75, 84}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{12, 76, 57}: "MitraStar Technology Corp.", + [3]byte{12, 77, 233}: "Apple, Inc.", + [3]byte{12, 79, 90}: "ASA-RT s.r.l.", + [3]byte{12, 81, 1}: "Apple, Inc.", + [3]byte{12, 81, 247}: "CHAUVIN ARNOUX", + [3]byte{12, 82, 3}: "AGM GROUP LIMITED", + [3]byte{12, 84, 165}: "PEGATRON CORPORATION", + [3]byte{12, 84, 185}: "Nokia", + [3]byte{12, 85, 33}: "Axiros GmbH", + [3]byte{12, 86, 92}: "HyBroad Vision (Hong Kong) Technology Co Ltd", + [3]byte{12, 87, 235}: "Mueller Systems", + [3]byte{12, 88, 66}: "DME Micro", + [3]byte{12, 90, 25}: "Axtion Sdn Bhd", + [3]byte{12, 90, 158}: "Wi-SUN Alliance", + [3]byte{12, 92, 216}: "DOLI Elektronik GmbH", + [3]byte{12, 95, 53}: "Niagara Video Corporation", + [3]byte{12, 96, 118}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{12, 97, 17}: "Anda Technologies SAC", + [3]byte{12, 97, 39}: "Actiontec Electronics, Inc", + [3]byte{12, 97, 207}: "Texas Instruments", + [3]byte{12, 99, 252}: "Nanjing Signway Technology Co., Ltd", + [3]byte{12, 104, 3}: "Cisco Systems, Inc", + [3]byte{12, 106, 230}: "Stanley Security Solutions", + [3]byte{12, 110, 79}: "PrimeVOLT Co., Ltd.", + [3]byte{12, 111, 156}: "Shaw Communications Inc.", + [3]byte{12, 113, 93}: "Samsung Electronics Co.,Ltd", + [3]byte{12, 114, 44}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{12, 114, 217}: "zte corporation", + [3]byte{12, 115, 190}: "Dongguan Haimai Electronie Technology Co.,Ltd", + [3]byte{12, 116, 194}: "Apple, Inc.", + [3]byte{12, 117, 35}: "BEIJING GEHUA CATV NETWORK CO.,LTD", + [3]byte{12, 117, 108}: "Anaren Microwave, Inc.", + [3]byte{12, 117, 189}: "Cisco Systems, Inc", + [3]byte{12, 119, 26}: "Apple, Inc.", + [3]byte{12, 125, 124}: "Kexiang Information Technology Co, Ltd.", + [3]byte{12, 129, 18}: "Private", + [3]byte{12, 130, 48}: "SHENZHEN MAGNUS TECHNOLOGIES CO.,LTD", + [3]byte{12, 130, 104}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{12, 130, 106}: "Wuhan Huagong Genuine Optics Technology Co., Ltd", + [3]byte{12, 132, 17}: "A.O. Smith Water Products", + [3]byte{12, 132, 132}: "Zenovia Electronics Inc.", + [3]byte{12, 132, 220}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{12, 133, 37}: "Cisco Systems, Inc", + [3]byte{12, 134, 16}: "Juniper Networks", + [3]byte{12, 137, 16}: "Samsung Electronics Co.,Ltd", + [3]byte{12, 138, 135}: "AgLogica Holdings, Inc", + [3]byte{12, 139, 253}: "Intel Corporate", + [3]byte{12, 140, 143}: "Kamo Technology Limited", + [3]byte{12, 140, 220}: "Suunto Oy", + [3]byte{12, 141, 152}: "TOP EIGHT IND CORP", + [3]byte{12, 141, 219}: "Cisco Meraki", + [3]byte{12, 143, 255}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{12, 145, 96}: "Hui Zhou Gaoshengda Technology Co.,LTD", + [3]byte{12, 146, 78}: "Rice Lake Weighing Systems", + [3]byte{12, 147, 1}: "PT. Prasimax Inovasi Teknologi", + [3]byte{12, 147, 251}: "BNS Solutions", + [3]byte{12, 150, 191}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{12, 152, 56}: "Xiaomi Communications Co Ltd", + [3]byte{12, 155, 19}: "Shanghai Magic Mobile Telecommunication Co.Ltd.", + [3]byte{12, 157, 86}: "Consort Controls Ltd", + [3]byte{12, 158, 145}: "Sankosha Corporation", + [3]byte{12, 161, 56}: "Blinq Wireless Inc.", + [3]byte{12, 162, 244}: "Chameleon Technology (UK) Limited", + [3]byte{12, 164, 2}: "Alcatel-Lucent IPD", + [3]byte{12, 164, 42}: "OB Telecom Electronic Technology Co., Ltd", + [3]byte{12, 166, 148}: "Sunitec Enterprise Co.,Ltd", + [3]byte{12, 172, 5}: "Unitend Technologies Inc.", + [3]byte{12, 175, 90}: "GENUS POWER INFRASTRUCTURES LIMITED", + [3]byte{12, 178, 183}: "Texas Instruments", + [3]byte{12, 179, 25}: "Samsung Electronics Co.,Ltd", + [3]byte{12, 180, 89}: "Marketech International Corp.", + [3]byte{12, 180, 239}: "Digience Co.,Ltd.", + [3]byte{12, 181, 222}: "Alcatel Lucent", + [3]byte{12, 185, 18}: "JM-DATA GmbH", + [3]byte{12, 185, 55}: "Ubee Interactive Co., Limited", + [3]byte{12, 188, 159}: "Apple, Inc.", + [3]byte{12, 189, 81}: "TCT mobile ltd", + [3]byte{12, 191, 21}: "Genetec Inc.", + [3]byte{12, 191, 63}: "Shenzhen Lencotion Technology Co.,Ltd", + [3]byte{12, 192, 192}: "MAGNETI MARELLI SISTEMAS ELECTRONICOS MEXICO", + [3]byte{12, 195, 167}: "Meritec", + [3]byte{12, 196, 122}: "Super Micro Computer, Inc.", + [3]byte{12, 196, 126}: "EUCAST Co., Ltd.", + [3]byte{12, 198, 85}: "Wuxi YSTen Technology Co.,Ltd.", + [3]byte{12, 198, 106}: "Nokia Corporation", + [3]byte{12, 198, 172}: "DAGS", + [3]byte{12, 199, 49}: "Currant, Inc.", + [3]byte{12, 200, 31}: "Summer Infant, Inc.", + [3]byte{12, 201, 198}: "Samwin Hong Kong Limited", + [3]byte{12, 203, 141}: "ASCO Numatics GmbH", + [3]byte{12, 204, 38}: "Airenetworks", + [3]byte{12, 205, 211}: "EASTRIVER TECHNOLOGY CO., LTD.", + [3]byte{12, 205, 251}: "EDIC Systems Inc.", + [3]byte{12, 206, 246}: "Guizhou Fortuneship Technology Co., Ltd", + [3]byte{12, 207, 209}: "SPRINGWAVE Co., Ltd", + [3]byte{12, 210, 146}: "Intel Corporate", + [3]byte{12, 210, 181}: "Binatone Telecommunication Pvt. Ltd", + [3]byte{12, 213, 2}: "Westell Technologies Inc.", + [3]byte{12, 214, 150}: "Amimon Ltd", + [3]byte{12, 214, 189}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{12, 215, 70}: "Apple, Inc.", + [3]byte{12, 215, 194}: "Axium Technologies, Inc.", + [3]byte{12, 216, 108}: "SHENZHEN FAST TECHNOLOGIES CO.,LTD", + [3]byte{12, 217, 150}: "Cisco Systems, Inc", + [3]byte{12, 217, 193}: "Visteon Corporation", + [3]byte{12, 218, 65}: "Hangzhou H3C Technologies Co., Limited", + [3]byte{12, 220, 204}: "Inala Technologies", + [3]byte{12, 221, 239}: "Nokia Corporation", + [3]byte{12, 223, 164}: "Samsung Electronics Co.,Ltd", + [3]byte{12, 224, 228}: "PLANTRONICS, INC.", + [3]byte{12, 229, 211}: "DH electronics GmbH", + [3]byte{12, 231, 9}: "Fox Crypto B.V.", + [3]byte{12, 231, 37}: "Microsoft Corporation", + [3]byte{12, 232, 47}: "Bonfiglioli Vectron GmbH", + [3]byte{12, 233, 54}: "ELIMOS srl", + [3]byte{12, 234, 201}: "ARRIS Group, Inc.", + [3]byte{12, 238, 230}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{12, 239, 124}: "AnaCom Inc", + [3]byte{12, 239, 175}: "IEEE Registration Authority", + [3]byte{12, 240, 25}: "Malgn Technology Co., Ltd.", + [3]byte{12, 240, 180}: "Globalsat International Technology Ltd", + [3]byte{12, 243, 97}: "Java Information", + [3]byte{12, 243, 238}: "EM Microelectronic", + [3]byte{12, 244, 5}: "Beijing Signalway Technologies Co.,Ltd", + [3]byte{12, 244, 213}: "Ruckus Wireless", + [3]byte{12, 245, 164}: "Cisco Systems, Inc", + [3]byte{12, 248, 147}: "ARRIS Group, Inc.", + [3]byte{12, 249, 192}: "BSkyB Ltd", + [3]byte{12, 252, 131}: "Airoha Technology Corp.,", + [3]byte{12, 253, 55}: "SUSE Linux GmbH", + [3]byte{12, 254, 69}: "Sony Interactive Entertainment Inc.", + [3]byte{16, 0, 0}: "Private", + [3]byte{16, 0, 90}: "IBM Corp", + [3]byte{16, 0, 232}: "NATIONAL SEMICONDUCTOR", + [3]byte{16, 0, 253}: "LaonPeople", + [3]byte{16, 1, 202}: "Ashley Butterworth", + [3]byte{16, 2, 181}: "Intel Corporate", + [3]byte{16, 5, 1}: "PEGATRON CORPORATION", + [3]byte{16, 5, 177}: "ARRIS Group, Inc.", + [3]byte{16, 5, 202}: "Cisco Systems, Inc", + [3]byte{16, 7, 35}: "IEEE Registration Authority", + [3]byte{16, 7, 182}: "Samsung Electronics Co.,Ltd", + [3]byte{16, 8, 177}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{16, 9, 12}: "Janome Sewing Machine Co., Ltd.", + [3]byte{16, 11, 169}: "Intel Corporate", + [3]byte{16, 12, 36}: "pomdevices, LLC", + [3]byte{16, 13, 47}: "Online Security Pty. Ltd.", + [3]byte{16, 13, 50}: "Embedian, Inc.", + [3]byte{16, 13, 127}: "NETGEAR", + [3]byte{16, 14, 43}: "NEC CASIO Mobile Communications", + [3]byte{16, 14, 126}: "Juniper Networks", + [3]byte{16, 15, 24}: "Fu Gang Electronic(KunShan)CO.,LTD", + [3]byte{16, 16, 182}: "McCain Inc", + [3]byte{16, 18, 18}: "Vivo International Corporation Pty Ltd", + [3]byte{16, 18, 24}: "Korins Inc.", + [3]byte{16, 18, 72}: "ITG, Inc.", + [3]byte{16, 18, 80}: "Integrated Device Technology (Malaysia) Sdn. Bhd.", + [3]byte{16, 19, 49}: "Technicolor", + [3]byte{16, 19, 238}: "Justec International Technology INC.", + [3]byte{16, 24, 158}: "Elmo Motion Control", + [3]byte{16, 27, 84}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{16, 28, 12}: "Apple, Inc.", + [3]byte{16, 29, 81}: "ON-Q LLC dba ON-Q Mesh Networks", + [3]byte{16, 29, 192}: "Samsung Electronics Co.,Ltd", + [3]byte{16, 31, 116}: "Hewlett Packard", + [3]byte{16, 34, 121}: "ZeroDesktop, Inc.", + [3]byte{16, 39, 190}: "TVIP", + [3]byte{16, 40, 49}: "Morion Inc.", + [3]byte{16, 42, 179}: "Xiaomi Communications Co Ltd", + [3]byte{16, 44, 131}: "XIMEA", + [3]byte{16, 45, 150}: "Looxcie Inc.", + [3]byte{16, 46, 175}: "Texas Instruments", + [3]byte{16, 47, 107}: "Microsoft Corporation", + [3]byte{16, 48, 52}: "Cara Systems", + [3]byte{16, 48, 71}: "Samsung Electronics Co.,Ltd", + [3]byte{16, 51, 120}: "FLECTRON Co., LTD", + [3]byte{16, 55, 17}: "Simlink AS", + [3]byte{16, 59, 89}: "Samsung Electronics Co.,Ltd", + [3]byte{16, 61, 234}: "HFC Technology (Beijing) Ltd. Co.", + [3]byte{16, 64, 243}: "Apple, Inc.", + [3]byte{16, 65, 127}: "Apple, Inc.", + [3]byte{16, 67, 105}: "Soundmax Electronic Limited", + [3]byte{16, 68, 0}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{16, 68, 90}: "Shaanxi Hitech Electronic Co., LTD", + [3]byte{16, 69, 190}: "Norphonic AS", + [3]byte{16, 69, 248}: "LNT-Automation GmbH", + [3]byte{16, 70, 180}: "FormericaOE", + [3]byte{16, 71, 128}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{16, 72, 177}: "Beijing Duokan Technology Limited", + [3]byte{16, 73, 99}: "HARTING K.K.", + [3]byte{16, 74, 125}: "Intel Corporate", + [3]byte{16, 75, 70}: "Mitsubishi Electric Corporation", + [3]byte{16, 77, 119}: "Innovative Computer Engineering", + [3]byte{16, 78, 7}: "Shanghai Genvision Industries Co.,Ltd", + [3]byte{16, 78, 137}: "Garmin International", + [3]byte{16, 79, 168}: "Sony Corporation", + [3]byte{16, 81, 114}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{16, 86, 17}: "ARRIS Group, Inc.", + [3]byte{16, 86, 202}: "Peplink International Ltd.", + [3]byte{16, 88, 135}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{16, 90, 247}: "ADB Italia", + [3]byte{16, 92, 59}: "Perma-Pipe, Inc.", + [3]byte{16, 92, 191}: "DuroByte Inc", + [3]byte{16, 95, 6}: "Actiontec Electronics, Inc", + [3]byte{16, 95, 73}: "Cisco SPVTG", + [3]byte{16, 96, 75}: "Hewlett Packard", + [3]byte{16, 98, 201}: "Adatis GmbH & Co. KG", + [3]byte{16, 98, 208}: "Technicolor CH USA Inc.", + [3]byte{16, 98, 235}: "D-Link International", + [3]byte{16, 100, 226}: "ADFweb.com s.r.l.", + [3]byte{16, 101, 163}: "Core Brands LLC", + [3]byte{16, 101, 207}: "IQSIM", + [3]byte{16, 102, 130}: "NEC Platforms, Ltd.", + [3]byte{16, 104, 63}: "LG Electronics (Mobile Communications)", + [3]byte{16, 111, 63}: "BUFFALO.INC", + [3]byte{16, 111, 239}: "Ad-Sol Nissin Corp", + [3]byte{16, 113, 249}: "Cloud Telecomputers, LLC", + [3]byte{16, 114, 35}: "TELLESCOM INDUSTRIA E COMERCIO EM TELECOMUNICACAO", + [3]byte{16, 118, 138}: "EoCell", + [3]byte{16, 119, 176}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{16, 119, 177}: "Samsung Electronics Co.,Ltd", + [3]byte{16, 120, 91}: "Actiontec Electronics, Inc", + [3]byte{16, 120, 115}: "Shenzhen Jinkeyi Communication Co., Ltd.", + [3]byte{16, 120, 206}: "Hanvit SI, Inc.", + [3]byte{16, 120, 210}: "Elitegroup Computer Systems Co.,Ltd.", + [3]byte{16, 122, 134}: "U&U ENGINEERING INC.", + [3]byte{16, 123, 68}: "ASUSTek COMPUTER INC.", + [3]byte{16, 123, 239}: "Zyxel Communications Corporation", + [3]byte{16, 125, 26}: "Dell Inc.", + [3]byte{16, 131, 210}: "Microseven Systems, LLC", + [3]byte{16, 134, 140}: "ARRIS Group, Inc.", + [3]byte{16, 136, 15}: "Daruma Telecomunicações e Informática S.A.", + [3]byte{16, 136, 206}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{16, 138, 27}: "RAONIX Inc.", + [3]byte{16, 140, 207}: "Cisco Systems, Inc", + [3]byte{16, 146, 102}: "Samsung Electronics Co.,Ltd", + [3]byte{16, 147, 233}: "Apple, Inc.", + [3]byte{16, 149, 75}: "Megabyte Ltd.", + [3]byte{16, 152, 54}: "Dell Inc.", + [3]byte{16, 154, 185}: "Tosibox Oy", + [3]byte{16, 154, 221}: "Apple, Inc.", + [3]byte{16, 159, 169}: "Actiontec Electronics, Inc", + [3]byte{16, 161, 59}: "FUJIKURA RUBBER LTD.", + [3]byte{16, 164, 190}: "SHENZHEN BILIAN ELECTRONIC CO.,LTD", + [3]byte{16, 165, 208}: "Murata Manufacturing Co., Ltd.", + [3]byte{16, 166, 89}: "Mobile Create Co.,Ltd.", + [3]byte{16, 167, 67}: "SK Mtek Limited", + [3]byte{16, 169, 50}: "Beijing Cyber Cloud Technology Co. ,Ltd.", + [3]byte{16, 174, 96}: "Private", + [3]byte{16, 175, 120}: "Shenzhen ATUE Technology Co., Ltd", + [3]byte{16, 177, 248}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{16, 178, 107}: "base Co.,Ltd.", + [3]byte{16, 183, 19}: "Private", + [3]byte{16, 183, 246}: "Plastoform Industries Ltd.", + [3]byte{16, 185, 254}: "Lika srl", + [3]byte{16, 186, 165}: "GANA I&C CO., LTD", + [3]byte{16, 189, 24}: "Cisco Systems, Inc", + [3]byte{16, 189, 85}: "Q-Lab Corporation", + [3]byte{16, 190, 245}: "D-Link International", + [3]byte{16, 191, 72}: "ASUSTek COMPUTER INC.", + [3]byte{16, 192, 124}: "Blu-ray Disc Association", + [3]byte{16, 194, 186}: "UTT Co., Ltd.", + [3]byte{16, 195, 123}: "ASUSTek COMPUTER INC.", + [3]byte{16, 197, 134}: "BIO SOUND LAB CO., LTD.", + [3]byte{16, 198, 12}: "Domino UK Ltd", + [3]byte{16, 198, 31}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{16, 198, 126}: "SHENZHEN JUCHIN TECHNOLOGY CO., LTD", + [3]byte{16, 198, 252}: "Garmin International", + [3]byte{16, 199, 63}: "Midas Klark Teknik Ltd", + [3]byte{16, 202, 129}: "PRECIA", + [3]byte{16, 204, 27}: "Liverock technologies,INC", + [3]byte{16, 204, 219}: "AXIMUM PRODUITS ELECTRONIQUES", + [3]byte{16, 205, 174}: "Avaya Inc", + [3]byte{16, 205, 182}: "Essential Products, Inc.", + [3]byte{16, 206, 169}: "Texas Instruments", + [3]byte{16, 208, 122}: "AMPAK Technology, Inc.", + [3]byte{16, 208, 171}: "zte corporation", + [3]byte{16, 209, 220}: "INSTAR Deutschland GmbH", + [3]byte{16, 211, 138}: "Samsung Electronics Co.,Ltd", + [3]byte{16, 213, 66}: "Samsung Electronics Co.,Ltd", + [3]byte{16, 218, 67}: "NETGEAR", + [3]byte{16, 221, 177}: "Apple, Inc.", + [3]byte{16, 221, 244}: "Maxway Electronics CO.,LTD", + [3]byte{16, 222, 228}: "automationNEXT GmbH", + [3]byte{16, 223, 139}: "Shenzhen CareDear Communication Technology Co.,Ltd", + [3]byte{16, 226, 213}: "Qi Hardware Inc.", + [3]byte{16, 227, 199}: "Seohwa Telecom", + [3]byte{16, 228, 175}: "APR, LLC", + [3]byte{16, 230, 143}: "KWANGSUNG ELECTRONICS KOREA CO.,LTD.", + [3]byte{16, 230, 174}: "Source Technologies, LLC", + [3]byte{16, 232, 120}: "Nokia", + [3]byte{16, 232, 238}: "PhaseSpace", + [3]byte{16, 234, 89}: "Cisco SPVTG", + [3]byte{16, 238, 217}: "Canoga Perkins Corporation", + [3]byte{16, 240, 5}: "Intel Corporate", + [3]byte{16, 241, 99}: "TNK CO.,LTD", + [3]byte{16, 241, 242}: "LG Electronics (Mobile Communications)", + [3]byte{16, 243, 17}: "Cisco Systems, Inc", + [3]byte{16, 243, 219}: "Gridco Systems, Inc.", + [3]byte{16, 244, 154}: "T3 Innovation", + [3]byte{16, 246, 129}: "vivo Mobile Communication Co., Ltd.", + [3]byte{16, 249, 111}: "LG Electronics (Mobile Communications)", + [3]byte{16, 249, 238}: "Nokia Corporation", + [3]byte{16, 250, 206}: "Reacheng Communication Technology Co.,Ltd", + [3]byte{16, 251, 240}: "KangSheng LTD.", + [3]byte{16, 252, 84}: "Shany Electronic Co., Ltd.", + [3]byte{16, 252, 182}: "mirusystems CO.,LTD", + [3]byte{16, 254, 237}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{17, 0, 170}: "Private", + [3]byte{17, 17, 17}: "Private", + [3]byte{20, 2, 236}: "Hewlett Packard Enterprise", + [3]byte{20, 4, 103}: "SNK Technologies Co.,Ltd.", + [3]byte{20, 7, 8}: "Private", + [3]byte{20, 7, 224}: "Abrantix AG", + [3]byte{20, 12, 91}: "PLNetworks", + [3]byte{20, 12, 118}: "FREEBOX SAS", + [3]byte{20, 13, 79}: "Flextronics International", + [3]byte{20, 16, 159}: "Apple, Inc.", + [3]byte{20, 19, 48}: "Anakreon UK LLP", + [3]byte{20, 19, 87}: "ATP Electronics, Inc.", + [3]byte{20, 20, 75}: "Ruijie Networks Co.,LTD", + [3]byte{20, 20, 230}: "Ningbo Sanhe Digital Co.,Ltd", + [3]byte{20, 21, 124}: "TOKYO COSMOS ELECTRIC CO.,LTD.", + [3]byte{20, 24, 119}: "Dell Inc.", + [3]byte{20, 26, 81}: "Treetech Sistemas Digitais", + [3]byte{20, 26, 163}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{20, 27, 189}: "Volex Inc.", + [3]byte{20, 27, 240}: "Intellimedia Systems Ltd", + [3]byte{20, 31, 120}: "Samsung Electronics Co.,Ltd", + [3]byte{20, 31, 186}: "IEEE Registration Authority", + [3]byte{20, 34, 219}: "eero inc.", + [3]byte{20, 35, 215}: "EUTRONIX CO., LTD.", + [3]byte{20, 40, 130}: "MIDICOM ELECTRONICS CO.LTD", + [3]byte{20, 41, 113}: "NEMOA ELECTRONICS (HK) CO. LTD", + [3]byte{20, 43, 210}: "Armtel Ltd.", + [3]byte{20, 43, 214}: "Guangdong Appscomm Co.,Ltd", + [3]byte{20, 45, 39}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{20, 45, 139}: "Incipio Technologies, Inc", + [3]byte{20, 45, 245}: "Amphitech", + [3]byte{20, 47, 253}: "LT SECURITY INC", + [3]byte{20, 48, 4}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{20, 48, 122}: "Avermetrics", + [3]byte{20, 48, 198}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{20, 50, 209}: "Samsung Electronics Co.,Ltd", + [3]byte{20, 51, 101}: "TEM Mobile Limited", + [3]byte{20, 53, 139}: "Mediabridge Products, LLC.", + [3]byte{20, 53, 179}: "Future Designs, Inc.", + [3]byte{20, 54, 5}: "Nokia Corporation", + [3]byte{20, 54, 198}: "Lenovo Mobile Communication Technology Ltd.", + [3]byte{20, 55, 59}: "PROCOM Systems", + [3]byte{20, 58, 234}: "Dynapower Company LLC", + [3]byte{20, 61, 242}: "Beijing Shidai Hongyuan Network Communication Co.,Ltd", + [3]byte{20, 62, 96}: "Nokia", + [3]byte{20, 62, 191}: "zte corporation", + [3]byte{20, 63, 39}: "Noccela Oy", + [3]byte{20, 65, 70}: "Honeywell (China) Co., LTD", + [3]byte{20, 65, 226}: "Monaco Enterprises, Inc.", + [3]byte{20, 67, 25}: "Creative&Link Technology Limited", + [3]byte{20, 68, 74}: "Apollo Seiko Ltd.", + [3]byte{20, 70, 228}: "AVISTEL", + [3]byte{20, 72, 139}: "Shenzhen Doov Technology Co.,Ltd", + [3]byte{20, 73, 120}: "Digital Control Incorporated", + [3]byte{20, 73, 224}: "SAMSUNG ELECTRO-MECHANICS(THAILAND)", + [3]byte{20, 76, 26}: "Max Communication GmbH", + [3]byte{20, 77, 103}: "Zioncom Electronics (Shenzhen) Ltd.", + [3]byte{20, 79, 215}: "IEEE Registration Authority", + [3]byte{20, 84, 18}: "Entis Co., Ltd.", + [3]byte{20, 86, 69}: "Savitech Corp.", + [3]byte{20, 86, 142}: "Samsung Electronics Co.,Ltd", + [3]byte{20, 88, 208}: "Hewlett Packard", + [3]byte{20, 90, 5}: "Apple, Inc.", + [3]byte{20, 90, 131}: "Logi-D inc", + [3]byte{20, 91, 209}: "ARRIS Group, Inc.", + [3]byte{20, 91, 225}: "nyantec GmbH", + [3]byte{20, 94, 69}: "Kaleao Limited", + [3]byte{20, 95, 148}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{20, 96, 128}: "zte corporation", + [3]byte{20, 97, 2}: "Alpine Electronics, Inc.", + [3]byte{20, 97, 47}: "Avaya Inc", + [3]byte{20, 99, 8}: "JABIL CIRCUIT (SHANGHAI) LTD.", + [3]byte{20, 106, 11}: "Cypress Electronics Limited", + [3]byte{20, 107, 114}: "Shenzhen Fortune Ship Technology Co., Ltd.", + [3]byte{20, 110, 10}: "Private", + [3]byte{20, 115, 115}: "TUBITAK UEKAE", + [3]byte{20, 116, 17}: "RIM", + [3]byte{20, 117, 144}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{20, 120, 11}: "PerkinElmer Technologies GmbH & Co. KG", + [3]byte{20, 121, 243}: "China Mobile Group Device Co.,Ltd.", + [3]byte{20, 125, 179}: "JOA TELECOM.CO.,LTD", + [3]byte{20, 125, 197}: "Murata Manufacturing Co., Ltd.", + [3]byte{20, 130, 91}: "Hefei Radio Communication Technology Co., Ltd", + [3]byte{20, 134, 146}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{20, 137, 62}: "VIXTEL TECHNOLOGIES LIMTED", + [3]byte{20, 137, 81}: "LCFC(HeFei) Electronics Technology co., ltd", + [3]byte{20, 137, 253}: "Samsung Electronics Co.,Ltd", + [3]byte{20, 138, 112}: "ADS GmbH", + [3]byte{20, 143, 33}: "Garmin International", + [3]byte{20, 143, 198}: "Apple, Inc.", + [3]byte{20, 144, 144}: "KongTop industrial(shen zhen)CO.,LTD", + [3]byte{20, 145, 130}: "Belkin International Inc.", + [3]byte{20, 147, 70}: "PNI sensor corporation", + [3]byte{20, 148, 72}: "BLU CASTLE S.A.", + [3]byte{20, 152, 125}: "Technicolor CH USA Inc.", + [3]byte{20, 153, 226}: "Apple, Inc.", + [3]byte{20, 154, 16}: "Microsoft Corporation", + [3]byte{20, 157, 9}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{20, 158, 207}: "Dell Inc.", + [3]byte{20, 159, 60}: "Samsung Electronics Co.,Ltd", + [3]byte{20, 159, 182}: "GUANGDONG GENIUS TECHNOLOGY CO.,LTD.", + [3]byte{20, 159, 232}: "Lenovo Mobile Communication Technology Ltd.", + [3]byte{20, 160, 248}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{20, 163, 100}: "Samsung Electronics Co.,Ltd", + [3]byte{20, 165, 26}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{20, 166, 44}: "S.M. Dezac S.A.", + [3]byte{20, 167, 139}: "Zhejiang Dahua Technology Co., Ltd.", + [3]byte{20, 168, 107}: "ShenZhen Telacom Science&Technology Co., Ltd", + [3]byte{20, 169, 227}: "MST CORPORATION", + [3]byte{20, 171, 197}: "Intel Corporate", + [3]byte{20, 171, 240}: "ARRIS Group, Inc.", + [3]byte{20, 174, 219}: "VTech Telecommunications Ltd.", + [3]byte{20, 177, 38}: "Industrial Software Co", + [3]byte{20, 177, 200}: "InfiniWing, Inc.", + [3]byte{20, 179, 31}: "Dell Inc.", + [3]byte{20, 179, 112}: "Gigaset Digital Technology (Shenzhen) Co., Ltd.", + [3]byte{20, 180, 132}: "Samsung Electronics Co.,Ltd", + [3]byte{20, 183, 61}: "ARCHEAN Technologies", + [3]byte{20, 183, 248}: "Technicolor CH USA Inc.", + [3]byte{20, 184, 55}: "Shenzhen YOUHUA Technology Co., Ltd", + [3]byte{20, 185, 104}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{20, 187, 110}: "Samsung Electronics Co.,Ltd", + [3]byte{20, 189, 97}: "Apple, Inc.", + [3]byte{20, 192, 137}: "DUNE HD LTD", + [3]byte{20, 193, 38}: "Nokia Corporation", + [3]byte{20, 193, 255}: "ShenZhen QianHai Comlan communication Co.,LTD", + [3]byte{20, 194, 29}: "Sabtech Industries", + [3]byte{20, 195, 194}: "K.A. Schmersal GmbH & Co. KG", + [3]byte{20, 201, 19}: "LG Electronics", + [3]byte{20, 204, 32}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{20, 207, 141}: "OHSUNG", + [3]byte{20, 207, 146}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{20, 207, 226}: "ARRIS Group, Inc.", + [3]byte{20, 209, 31}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{20, 212, 254}: "ARRIS Group, Inc.", + [3]byte{20, 214, 77}: "D-Link International", + [3]byte{20, 215, 110}: "CONCH ELECTRONIC Co.,Ltd", + [3]byte{20, 218, 233}: "ASUSTek COMPUTER INC.", + [3]byte{20, 219, 133}: "S NET MEDIA", + [3]byte{20, 221, 169}: "ASUSTek COMPUTER INC.", + [3]byte{20, 221, 229}: "MPMKVVCL", + [3]byte{20, 228, 236}: "mLogic LLC", + [3]byte{20, 230, 228}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{20, 231, 200}: "Integrated Device Technology (Malaysia) Sdn. Bhd.", + [3]byte{20, 235, 51}: "BSMediasoft Co., Ltd.", + [3]byte{20, 237, 165}: "Wächter GmbH Sicherheitssysteme", + [3]byte{20, 237, 187}: "2Wire Inc", + [3]byte{20, 237, 228}: "Kaiam Corporation", + [3]byte{20, 238, 157}: "AirNav Systems LLC", + [3]byte{20, 240, 197}: "Xtremio Ltd.", + [3]byte{20, 242, 142}: "ShenYang ZhongKe-Allwin Technology Co.LTD", + [3]byte{20, 244, 42}: "Samsung Electronics Co.,Ltd", + [3]byte{20, 246, 90}: "Xiaomi Communications Co Ltd", + [3]byte{20, 248, 147}: "Wuhan FiberHome Digital Technology Co.,Ltd.", + [3]byte{20, 254, 175}: "SAGITTAR LIMITED", + [3]byte{20, 254, 181}: "Dell Inc.", + [3]byte{24, 0, 45}: "Sony Mobile Communications AB", + [3]byte{24, 0, 219}: "Fitbit Inc.", + [3]byte{24, 1, 125}: "Harbin Arteor technology co., LTD", + [3]byte{24, 1, 227}: "Bittium Wireless Ltd", + [3]byte{24, 3, 115}: "Dell Inc.", + [3]byte{24, 3, 250}: "IBT Interfaces", + [3]byte{24, 6, 117}: "Dilax Intelcom GmbH", + [3]byte{24, 6, 255}: "Acer Computer(Shanghai) Limited.", + [3]byte{24, 11, 82}: "Nanotron Technologies GmbH", + [3]byte{24, 12, 20}: "iSonea Limited", + [3]byte{24, 12, 119}: "Westinghouse Electric Company, LLC", + [3]byte{24, 12, 172}: "CANON INC.", + [3]byte{24, 16, 78}: "CEDINT-UPM", + [3]byte{24, 18, 18}: "Cepton Technologies", + [3]byte{24, 20, 32}: "TEB SAS", + [3]byte{24, 20, 86}: "Nokia Corporation", + [3]byte{24, 22, 201}: "Samsung Electronics Co.,Ltd", + [3]byte{24, 23, 20}: "DAEWOOIS", + [3]byte{24, 23, 37}: "Cameo Communications, Inc.", + [3]byte{24, 25, 63}: "Tamtron Oy", + [3]byte{24, 27, 235}: "Actiontec Electronics, Inc", + [3]byte{24, 30, 120}: "Sagemcom Broadband SAS", + [3]byte{24, 30, 176}: "Samsung Electronics Co.,Ltd", + [3]byte{24, 32, 18}: "Aztech Associates Inc.", + [3]byte{24, 32, 50}: "Apple, Inc.", + [3]byte{24, 32, 76}: "Kummler+Matter AG", + [3]byte{24, 32, 166}: "Sage Co., Ltd.", + [3]byte{24, 33, 149}: "Samsung Electronics Co.,Ltd", + [3]byte{24, 34, 126}: "Samsung Electronics Co.,Ltd", + [3]byte{24, 38, 102}: "Samsung Electronics Co.,Ltd", + [3]byte{24, 40, 97}: "AirTies Wireless Networks", + [3]byte{24, 42, 123}: "Nintendo Co., Ltd.", + [3]byte{24, 43, 5}: "8D Technologies", + [3]byte{24, 44, 145}: "Concept Development, Inc.", + [3]byte{24, 44, 180}: "Nectarsoft Co., Ltd.", + [3]byte{24, 45, 152}: "Jinwoo Industrial system", + [3]byte{24, 48, 9}: "Woojin Industrial Systems Co., Ltd.", + [3]byte{24, 50, 162}: "LAON TECHNOLOGY CO., LTD.", + [3]byte{24, 51, 157}: "Cisco Systems, Inc", + [3]byte{24, 52, 81}: "Apple, Inc.", + [3]byte{24, 53, 209}: "ARRIS Group, Inc.", + [3]byte{24, 54, 252}: "Elecsys International Corporation", + [3]byte{24, 56, 37}: "Wuhan Lingjiu High-tech Co.,Ltd.", + [3]byte{24, 56, 100}: "CAP-TECH INTERNATIONAL CO., LTD.", + [3]byte{24, 57, 25}: "Unicoi Systems", + [3]byte{24, 57, 110}: "SUNSEA TELECOMMUNICATIONS CO.,LTD.", + [3]byte{24, 58, 45}: "Samsung Electronics Co.,Ltd", + [3]byte{24, 59, 210}: "BYD Precision Manufacture Company Ltd.", + [3]byte{24, 61, 162}: "Intel Corporate", + [3]byte{24, 63, 71}: "Samsung Electronics Co.,Ltd", + [3]byte{24, 64, 164}: "Shenzhen Trylong Smart Science and Technology Co., Ltd.", + [3]byte{24, 66, 29}: "Private", + [3]byte{24, 66, 47}: "Alcatel Lucent", + [3]byte{24, 68, 98}: "Riava Networks, Inc.", + [3]byte{24, 68, 230}: "zte corporation", + [3]byte{24, 70, 23}: "Samsung Electronics Co.,Ltd", + [3]byte{24, 72, 216}: "Fastback Networks", + [3]byte{24, 74, 111}: "Alcatel-Lucent Shanghai Bell Co., Ltd", + [3]byte{24, 78, 148}: "MESSOA TECHNOLOGIES INC.", + [3]byte{24, 79, 50}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{24, 82, 7}: "SICHUAN TIANYI COMHEART TELECOMCO., LTD", + [3]byte{24, 82, 83}: "Pixord Corporation", + [3]byte{24, 82, 130}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{24, 83, 224}: "Hanyang Digitech Co.Ltd", + [3]byte{24, 85, 15}: "Cisco SPVTG", + [3]byte{24, 89, 51}: "Cisco SPVTG", + [3]byte{24, 89, 54}: "Xiaomi Communications Co Ltd", + [3]byte{24, 90, 232}: "Zenotech.Co.,Ltd", + [3]byte{24, 93, 154}: "BobjGear LLC", + [3]byte{24, 94, 15}: "Intel Corporate", + [3]byte{24, 96, 36}: "Hewlett Packard", + [3]byte{24, 97, 199}: "lemonbeat GmbH", + [3]byte{24, 98, 44}: "Sagemcom Broadband SAS", + [3]byte{24, 100, 114}: "Aruba Networks", + [3]byte{24, 101, 113}: "Top Victory Electronics (Taiwan) Co., Ltd.", + [3]byte{24, 101, 144}: "Apple, Inc.", + [3]byte{24, 102, 218}: "Dell Inc.", + [3]byte{24, 102, 227}: "Veros Systems, Inc.", + [3]byte{24, 103, 63}: "Hanover Displays Limited", + [3]byte{24, 103, 81}: "KOMEG Industrielle Messtechnik GmbH", + [3]byte{24, 103, 176}: "Samsung Electronics Co.,Ltd", + [3]byte{24, 104, 106}: "zte corporation", + [3]byte{24, 104, 130}: "Beward R&D Co., Ltd.", + [3]byte{24, 104, 203}: "Hangzhou Hikvision Digital Technology Co.,Ltd.", + [3]byte{24, 109, 153}: "Adanis Inc.", + [3]byte{24, 113, 23}: "eta plus electronic gmbh", + [3]byte{24, 116, 46}: "Amazon Technologies Inc.", + [3]byte{24, 117, 50}: "SICHUAN TIANYI COMHEART TELECOMCO., LTD", + [3]byte{24, 121, 162}: "GMJ ELECTRIC LIMITED", + [3]byte{24, 122, 147}: "AMICCOM Electronics Corporation", + [3]byte{24, 124, 129}: "Valeo Vision Systems", + [3]byte{24, 126, 213}: "shenzhen kaism technology Co. Ltd", + [3]byte{24, 128, 144}: "Cisco Systems, Inc", + [3]byte{24, 128, 206}: "Barberry Solutions Ltd", + [3]byte{24, 128, 245}: "Alcatel-Lucent Shanghai Bell Co., Ltd", + [3]byte{24, 130, 25}: "Alibaba Cloud Computing Ltd.", + [3]byte{24, 131, 49}: "Samsung Electronics Co.,Ltd", + [3]byte{24, 131, 191}: "Arcadyan Technology Corporation", + [3]byte{24, 132, 16}: "CoreTrust Inc.", + [3]byte{24, 134, 58}: "DIGITAL ART SYSTEM", + [3]byte{24, 134, 172}: "Nokia Danmark A/S", + [3]byte{24, 135, 150}: "HTC Corporation", + [3]byte{24, 136, 87}: "Beijing Jinhong Xi-Dian Information Technology Corp.", + [3]byte{24, 137, 91}: "Samsung Electronics Co.,Ltd", + [3]byte{24, 137, 223}: "CerebrEX Inc.", + [3]byte{24, 139, 21}: "ShenZhen ZhongRuiJing Technology co.,LTD", + [3]byte{24, 139, 69}: "Cisco Systems, Inc", + [3]byte{24, 139, 157}: "Cisco Systems, Inc", + [3]byte{24, 142, 213}: "TP Vision Belgium N.V. - innovation site Brugge", + [3]byte{24, 142, 249}: "G2C Co. Ltd.", + [3]byte{24, 144, 216}: "Sagemcom Broadband SAS", + [3]byte{24, 146, 44}: "Virtual Instruments", + [3]byte{24, 147, 215}: "Texas Instruments", + [3]byte{24, 151, 255}: "TechFaith Wireless Technology Limited", + [3]byte{24, 153, 245}: "Sichuan Changhong Electric Ltd.", + [3]byte{24, 154, 103}: "CSE-Servelec Limited", + [3]byte{24, 155, 165}: "IEEE Registration Authority", + [3]byte{24, 156, 93}: "Cisco Systems, Inc", + [3]byte{24, 158, 252}: "Apple, Inc.", + [3]byte{24, 163, 232}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{24, 166, 247}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{24, 169, 5}: "Hewlett Packard", + [3]byte{24, 169, 88}: "PROVISION THAI CO., LTD.", + [3]byte{24, 169, 155}: "Dell Inc.", + [3]byte{24, 170, 69}: "Fon Technology", + [3]byte{24, 171, 245}: "Ultra Electronics Electrics", + [3]byte{24, 173, 77}: "Polostar Technology Corporation", + [3]byte{24, 174, 187}: "Siemens Convergence Creators GmbH&Co.KG", + [3]byte{24, 175, 97}: "Apple, Inc.", + [3]byte{24, 175, 143}: "Apple, Inc.", + [3]byte{24, 175, 159}: "DIGITRONIC Automationsanlagen GmbH", + [3]byte{24, 177, 105}: "Sonicwall", + [3]byte{24, 178, 9}: "Torrey Pines Logic, Inc", + [3]byte{24, 179, 186}: "Netlogic AB", + [3]byte{24, 180, 48}: "Nest Labs Inc.", + [3]byte{24, 181, 145}: "I-Storm", + [3]byte{24, 183, 158}: "Invoxia", + [3]byte{24, 184, 31}: "ARRIS Group, Inc.", + [3]byte{24, 188, 90}: "Zhejiang Tmall Technology Co., Ltd.", + [3]byte{24, 189, 173}: "L-TECH CORPORATION", + [3]byte{24, 192, 134}: "Broadcom", + [3]byte{24, 193, 157}: "Integrated Device Technology (Malaysia) Sdn. Bhd.", + [3]byte{24, 196, 81}: "Tucson Embedded Systems", + [3]byte{24, 197, 1}: "SHENZHEN GONGJIN ELECTRONICS CO.,LT", + [3]byte{24, 197, 138}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{24, 200, 231}: "Shenzhen Hualistone Technology Co.,Ltd", + [3]byte{24, 204, 35}: "Philio Technology Corporation", + [3]byte{24, 204, 136}: "Hitachi Johnson Controls Air", + [3]byte{24, 207, 94}: "Liteon Technology Corporation", + [3]byte{24, 208, 113}: "DASAN CO., LTD.", + [3]byte{24, 210, 37}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{24, 210, 118}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{24, 213, 182}: "SMG Holdings LLC", + [3]byte{24, 214, 106}: "Inmarsat", + [3]byte{24, 214, 199}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{24, 214, 207}: "Kurth Electronic GmbH", + [3]byte{24, 217, 73}: "Qvis Labs, LLC", + [3]byte{24, 219, 242}: "Dell Inc.", + [3]byte{24, 220, 86}: "Yulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd", + [3]byte{24, 222, 215}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{24, 226, 136}: "STT Condigi", + [3]byte{24, 226, 159}: "vivo Mobile Communication Co., Ltd.", + [3]byte{24, 226, 194}: "Samsung Electronics Co.,Ltd", + [3]byte{24, 227, 188}: "TCT mobile ltd", + [3]byte{24, 231, 40}: "Cisco Systems, Inc", + [3]byte{24, 231, 244}: "Apple, Inc.", + [3]byte{24, 232, 15}: "Viking Electronics Inc.", + [3]byte{24, 232, 221}: "MODULETEK", + [3]byte{24, 238, 105}: "Apple, Inc.", + [3]byte{24, 239, 99}: "Cisco Systems, Inc", + [3]byte{24, 240, 228}: "Xiaomi Communications Co Ltd", + [3]byte{24, 241, 69}: "NetComm Wireless Limited", + [3]byte{24, 242, 146}: "Shannon Systems", + [3]byte{24, 244, 106}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{24, 246, 67}: "Apple, Inc.", + [3]byte{24, 246, 80}: "Multimedia Pacific Limited", + [3]byte{24, 247, 107}: "Zhejiang Winsight Technology CO.,LTD", + [3]byte{24, 248, 122}: "i3 International Inc.", + [3]byte{24, 250, 111}: "ISC applied systems corp", + [3]byte{24, 251, 123}: "Dell Inc.", + [3]byte{24, 252, 159}: "Changhe Electronics Co., Ltd.", + [3]byte{24, 254, 52}: "Espressif Inc.", + [3]byte{24, 255, 15}: "Intel Corporate", + [3]byte{24, 255, 46}: "Shenzhen Rui Ying Da Technology Co., Ltd", + [3]byte{28, 6, 86}: "IDY Corporation", + [3]byte{28, 8, 193}: "Lg Innotek", + [3]byte{28, 11, 82}: "EPICOM S.A", + [3]byte{28, 15, 175}: "Lucid Vision Labs", + [3]byte{28, 15, 207}: "Sypro Optics GmbH", + [3]byte{28, 17, 225}: "Wartsila Finland Oy", + [3]byte{28, 18, 157}: "IEEE PES PSRC/SUB", + [3]byte{28, 20, 72}: "ARRIS Group, Inc.", + [3]byte{28, 20, 179}: "Airwire Technologies", + [3]byte{28, 21, 31}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{28, 23, 211}: "Cisco Systems, Inc", + [3]byte{28, 24, 74}: "ShenZhen RicherLink Technologies Co.,LTD", + [3]byte{28, 25, 222}: "eyevis GmbH", + [3]byte{28, 26, 192}: "Apple, Inc.", + [3]byte{28, 27, 13}: "GIGA-BYTE TECHNOLOGY CO.,LTD.", + [3]byte{28, 27, 104}: "ARRIS Group, Inc.", + [3]byte{28, 28, 253}: "Dalian Hi-Think Computer Technology, Corp", + [3]byte{28, 29, 103}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{28, 29, 134}: "Cisco Systems, Inc", + [3]byte{28, 30, 227}: "Hui Zhou Gaoshengda Technology Co.,LTD", + [3]byte{28, 31, 212}: "LifeBEAM Technologies LTD", + [3]byte{28, 33, 209}: "IEEE Registration Authority", + [3]byte{28, 35, 44}: "Samsung Electronics Co.,Ltd", + [3]byte{28, 35, 79}: "EDMI Europe Ltd", + [3]byte{28, 37, 225}: "China Mobile IOT Company Limited", + [3]byte{28, 39, 221}: "Datang Gohighsec(zhejiang)Information Technology Co.,Ltd.", + [3]byte{28, 51, 14}: "PernixData", + [3]byte{28, 51, 77}: "ITS Telecom", + [3]byte{28, 52, 119}: "Innovation Wireless", + [3]byte{28, 53, 241}: "NEW Lift Neue Elektronische Wege Steuerungsbau GmbH", + [3]byte{28, 54, 187}: "Apple, Inc.", + [3]byte{28, 55, 191}: "Cloudium Systems Ltd.", + [3]byte{28, 57, 71}: "COMPAL INFORMATION (KUNSHAN) CO., LTD.", + [3]byte{28, 57, 138}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{28, 58, 79}: "AccuSpec Electronics, LLC", + [3]byte{28, 58, 222}: "Samsung Electronics Co.,Ltd", + [3]byte{28, 61, 231}: "Sigma Koki Co.,Ltd.", + [3]byte{28, 62, 132}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{28, 64, 36}: "Dell Inc.", + [3]byte{28, 64, 232}: "SHENZHEN PROGRESS&WIN TECHNOLOGY CO.,LTD", + [3]byte{28, 65, 88}: "Gemalto M2M GmbH", + [3]byte{28, 67, 236}: "JAPAN CIRCUIT CO.,LTD", + [3]byte{28, 68, 25}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{28, 69, 147}: "Texas Instruments", + [3]byte{28, 72, 64}: "IMS Messsysteme GmbH", + [3]byte{28, 72, 206}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{28, 72, 249}: "GN Netcom A/S", + [3]byte{28, 73, 123}: "Gemtek Technology Co., Ltd.", + [3]byte{28, 74, 247}: "AMON INC", + [3]byte{28, 75, 185}: "SMG ENTERPRISE, LLC", + [3]byte{28, 75, 214}: "AzureWave Technology Inc.", + [3]byte{28, 77, 112}: "Intel Corporate", + [3]byte{28, 81, 181}: "Techaya LTD", + [3]byte{28, 82, 22}: "DONGGUAN HELE ELECTRONICS CO., LTD", + [3]byte{28, 82, 214}: "FLAT DISPLAY TECHNOLOGY CORPORATION", + [3]byte{28, 85, 58}: "QianGua Corp.", + [3]byte{28, 86, 254}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{28, 87, 216}: "Kraftway Corporation PLC", + [3]byte{28, 90, 11}: "Tegile Systems", + [3]byte{28, 90, 62}: "Samsung Electronics Co.,Ltd", + [3]byte{28, 90, 107}: "Philips Electronics Nederland BV", + [3]byte{28, 92, 85}: "PRIMA Cinema, Inc", + [3]byte{28, 92, 96}: "Shenzhen Belzon Technology Co.,LTD.", + [3]byte{28, 92, 242}: "Apple, Inc.", + [3]byte{28, 95, 43}: "D-Link International", + [3]byte{28, 95, 255}: "Beijing Ereneben Information Technology Co.,Ltd Shenzhen Branch", + [3]byte{28, 96, 222}: "SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.", + [3]byte{28, 98, 184}: "Samsung Electronics Co.,Ltd", + [3]byte{28, 99, 183}: "OpenProducts 237 AB", + [3]byte{28, 101, 157}: "Liteon Technology Corporation", + [3]byte{28, 102, 109}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{28, 102, 170}: "Samsung Electronics Co.,Ltd", + [3]byte{28, 103, 88}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{28, 105, 165}: "BlackBerry RTS", + [3]byte{28, 106, 122}: "Cisco Systems, Inc", + [3]byte{28, 107, 202}: "Mitsunami Co., Ltd.", + [3]byte{28, 110, 76}: "Logistic Service & Engineering Co.,Ltd", + [3]byte{28, 110, 118}: "Quarion Technology Inc", + [3]byte{28, 111, 101}: "GIGA-BYTE TECHNOLOGY CO.,LTD.", + [3]byte{28, 112, 34}: "Murata Manufacturing Co., Ltd.", + [3]byte{28, 115, 40}: "Connected Home", + [3]byte{28, 115, 112}: "Neotech", + [3]byte{28, 116, 13}: "Zyxel Communications Corporation", + [3]byte{28, 117, 8}: "COMPAL INFORMATION (KUNSHAN) CO., LTD.", + [3]byte{28, 118, 202}: "Terasic Technologies Inc.", + [3]byte{28, 119, 246}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{28, 120, 57}: "Shenzhen Tencent Computer System Co., Ltd.", + [3]byte{28, 123, 33}: "Sony Mobile Communications AB", + [3]byte{28, 123, 35}: "Qingdao Hisense Communications Co.,Ltd.", + [3]byte{28, 124, 17}: "EID", + [3]byte{28, 124, 69}: "Vitek Industrial Video Products, Inc.", + [3]byte{28, 124, 199}: "Coriant GmbH", + [3]byte{28, 125, 34}: "Fuji Xerox Co., Ltd.", + [3]byte{28, 126, 81}: "3bumen.com", + [3]byte{28, 126, 229}: "D-Link International", + [3]byte{28, 131, 65}: "Hefei Bitland Information Technology Co.Ltd", + [3]byte{28, 131, 176}: "Linked IP GmbH", + [3]byte{28, 132, 100}: "FORMOSA WIRELESS COMMUNICATION CORP.", + [3]byte{28, 134, 173}: "MCT CO., LTD.", + [3]byte{28, 135, 44}: "ASUSTek COMPUTER INC.", + [3]byte{28, 142, 92}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{28, 142, 142}: "DB Communication & Systems Co., ltd.", + [3]byte{28, 143, 138}: "Phase Motion Control SpA", + [3]byte{28, 145, 72}: "Apple, Inc.", + [3]byte{28, 145, 121}: "Integrated System Technologies Ltd", + [3]byte{28, 148, 146}: "RUAG Schweiz AG", + [3]byte{28, 149, 93}: "I-LAX ELECTRONICS INC.", + [3]byte{28, 149, 159}: "Veethree Electronics And Marine LLC", + [3]byte{28, 150, 90}: "Weifang GoerTek Technology Co.,Ltd.", + [3]byte{28, 151, 61}: "PRICOM Design", + [3]byte{28, 152, 236}: "Hewlett Packard Enterprise", + [3]byte{28, 153, 76}: "Murata Manufacturing Co., Ltd.", + [3]byte{28, 156, 38}: "Zoovel Technologies", + [3]byte{28, 157, 62}: "Integrated Device Technology (Malaysia) Sdn. Bhd.", + [3]byte{28, 158, 70}: "Apple, Inc.", + [3]byte{28, 158, 203}: "Beijing Nari Smartchip Microelectronics Company Limited", + [3]byte{28, 160, 211}: "IEEE Registration Authority", + [3]byte{28, 162, 177}: "ruwido austria gmbh", + [3]byte{28, 165, 50}: "SHENZHEN GONGJIN ELECTRONICS CO.,LT", + [3]byte{28, 167, 112}: "SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD", + [3]byte{28, 170, 7}: "Cisco Systems, Inc", + [3]byte{28, 171, 1}: "Innovolt", + [3]byte{28, 171, 52}: "New H3C Technologies Co., Ltd", + [3]byte{28, 171, 167}: "Apple, Inc.", + [3]byte{28, 171, 192}: "Hitron Technologies. Inc", + [3]byte{28, 173, 209}: "Bosung Electronics Co., Ltd.", + [3]byte{28, 175, 5}: "Samsung Electronics Co.,Ltd", + [3]byte{28, 175, 247}: "D-Link International", + [3]byte{28, 176, 148}: "HTC Corporation", + [3]byte{28, 177, 127}: "NEC Platforms, Ltd.", + [3]byte{28, 178, 67}: "TDC A/S", + [3]byte{28, 183, 44}: "ASUSTek COMPUTER INC.", + [3]byte{28, 184, 87}: "Becon Technologies Co,.Ltd.", + [3]byte{28, 185, 196}: "Ruckus Wireless", + [3]byte{28, 186, 140}: "Texas Instruments", + [3]byte{28, 187, 168}: "OJSC Ufimskiy Zavod Promsvyaz", + [3]byte{28, 189, 14}: "Amplified Engineering Pty Ltd", + [3]byte{28, 189, 185}: "D-Link International", + [3]byte{28, 192, 53}: "PLANEX COMMUNICATIONS INC.", + [3]byte{28, 192, 225}: "IEEE Registration Authority", + [3]byte{28, 193, 26}: "Wavetronix", + [3]byte{28, 193, 222}: "Hewlett Packard", + [3]byte{28, 195, 22}: "MileSight Technology Co., Ltd.", + [3]byte{28, 197, 134}: "Absolute Acoustics", + [3]byte{28, 198, 60}: "Arcadyan Technology Corporation", + [3]byte{28, 199, 45}: "Shenzhen Huapu Digital CO.,Ltd", + [3]byte{28, 202, 227}: "IEEE Registration Authority", + [3]byte{28, 203, 153}: "TCT mobile ltd", + [3]byte{28, 205, 229}: "Shanghai Wind Technologies Co.,Ltd", + [3]byte{28, 212, 12}: "Kriwan Industrie-Elektronik GmbH", + [3]byte{28, 214, 189}: "LEEDARSON LIGHTING CO., LTD.", + [3]byte{28, 218, 39}: "vivo Mobile Communication Co., Ltd.", + [3]byte{28, 221, 234}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{28, 222, 167}: "Cisco Systems, Inc", + [3]byte{28, 223, 15}: "Cisco Systems, Inc", + [3]byte{28, 223, 82}: "Texas Instruments", + [3]byte{28, 225, 101}: "Marshal Corporation", + [3]byte{28, 225, 146}: "Qisda Corporation", + [3]byte{28, 226, 204}: "Texas Instruments", + [3]byte{28, 230, 43}: "Apple, Inc.", + [3]byte{28, 230, 199}: "Cisco Systems, Inc", + [3]byte{28, 232, 93}: "Cisco Systems, Inc", + [3]byte{28, 234, 27}: "Nokia", + [3]byte{28, 238, 201}: "Elo touch solutions", + [3]byte{28, 238, 232}: "Ilshin Elecom", + [3]byte{28, 239, 206}: "bebro electronic GmbH", + [3]byte{28, 240, 62}: "Wearhaus Inc.", + [3]byte{28, 240, 97}: "SCAPS GmbH", + [3]byte{28, 244, 202}: "Private", + [3]byte{28, 245, 231}: "Turtle Industry Co., Ltd.", + [3]byte{28, 250, 104}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{28, 252, 187}: "Realfiction ApS", + [3]byte{28, 254, 167}: "IDentytech Solutins Ltd.", + [3]byte{32, 1, 79}: "Linea Research Ltd", + [3]byte{32, 2, 175}: "Murata Manufacturing Co., Ltd.", + [3]byte{32, 4, 15}: "Dell Inc.", + [3]byte{32, 5, 5}: "RADMAX COMMUNICATION PRIVATE LIMITED", + [3]byte{32, 5, 232}: "OOO InProMedia", + [3]byte{32, 8, 237}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{32, 10, 94}: "Xiangshan Giant Eagle Technology Developing Co., Ltd.", + [3]byte{32, 11, 199}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{32, 12, 200}: "NETGEAR", + [3]byte{32, 14, 149}: "IEC – TC9 WG43", + [3]byte{32, 16, 122}: "Gemtek Technology Co., Ltd.", + [3]byte{32, 18, 87}: "Most Lucky Trading Ltd", + [3]byte{32, 18, 213}: "Scientech Materials Corporation", + [3]byte{32, 19, 224}: "Samsung Electronics Co.,Ltd", + [3]byte{32, 22, 216}: "Liteon Technology Corporation", + [3]byte{32, 24, 14}: "Shenzhen Sunchip Technology Co., Ltd", + [3]byte{32, 26, 6}: "COMPAL INFORMATION (KUNSHAN) CO., LTD.", + [3]byte{32, 29, 3}: "Elatec GmbH", + [3]byte{32, 33, 165}: "LG Electronics (Mobile Communications)", + [3]byte{32, 37, 100}: "PEGATRON CORPORATION", + [3]byte{32, 37, 152}: "Teleview", + [3]byte{32, 40, 188}: "Visionscape Co,. Ltd.", + [3]byte{32, 43, 193}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{32, 44, 183}: "Kong Yue Electronics & Information Industry (Xinhui) Ltd.", + [3]byte{32, 45, 7}: "Samsung Electronics Co.,Ltd", + [3]byte{32, 45, 248}: "Digital Media Cartridge Ltd.", + [3]byte{32, 49, 235}: "HDSN", + [3]byte{32, 55, 6}: "Cisco Systems, Inc", + [3]byte{32, 55, 188}: "Kuipers Electronic Engineering BV", + [3]byte{32, 58, 7}: "Cisco Systems, Inc", + [3]byte{32, 58, 239}: "Sivantos GmbH", + [3]byte{32, 60, 174}: "Apple, Inc.", + [3]byte{32, 61, 102}: "ARRIS Group, Inc.", + [3]byte{32, 61, 178}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{32, 64, 5}: "feno GmbH", + [3]byte{32, 65, 90}: "Smarteh d.o.o.", + [3]byte{32, 68, 58}: "Schneider Electric Asia Pacific Ltd", + [3]byte{32, 70, 161}: "VECOW Co., Ltd", + [3]byte{32, 70, 249}: "Advanced Network Devices (dba:AND)", + [3]byte{32, 71, 71}: "Dell Inc.", + [3]byte{32, 71, 237}: "BSkyB Ltd", + [3]byte{32, 74, 170}: "Hanscan Spain S.A.", + [3]byte{32, 76, 3}: "Aruba Networks", + [3]byte{32, 76, 109}: "Hugo Brennenstuhl Gmbh & Co. KG.", + [3]byte{32, 76, 158}: "Cisco Systems, Inc", + [3]byte{32, 78, 107}: "Axxana(israel) ltd", + [3]byte{32, 78, 113}: "Juniper Networks", + [3]byte{32, 78, 127}: "NETGEAR", + [3]byte{32, 83, 202}: "Risk Technology Ltd", + [3]byte{32, 84, 118}: "Sony Mobile Communications AB", + [3]byte{32, 84, 250}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{32, 85, 49}: "Samsung Electronics Co.,Ltd", + [3]byte{32, 85, 50}: "Gotech International Technology Limited", + [3]byte{32, 87, 33}: "Salix Technology CO., Ltd.", + [3]byte{32, 87, 175}: "Shenzhen FH-NET OPTOELECTRONICS CO.,LTD", + [3]byte{32, 89, 160}: "Paragon Technologies Inc.", + [3]byte{32, 90, 0}: "Coval", + [3]byte{32, 91, 42}: "Private", + [3]byte{32, 91, 94}: "Shenzhen Wonhe Technology Co., Ltd", + [3]byte{32, 92, 250}: "Yangzhou ChangLian Network Technology Co,ltd.", + [3]byte{32, 93, 71}: "vivo Mobile Communication Co., Ltd.", + [3]byte{32, 94, 247}: "Samsung Electronics Co.,Ltd", + [3]byte{32, 98, 116}: "Microsoft Corporation", + [3]byte{32, 99, 95}: "Abeeway", + [3]byte{32, 100, 50}: "SAMSUNG ELECTRO MECHANICS CO., LTD.", + [3]byte{32, 103, 177}: "Pluto inc.", + [3]byte{32, 104, 157}: "Liteon Technology Corporation", + [3]byte{32, 106, 138}: "Wistron Infocomm (Zhongshan) Corporation", + [3]byte{32, 106, 255}: "Atlas Elektronik UK Limited", + [3]byte{32, 107, 231}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{32, 108, 138}: "Aerohive Networks Inc.", + [3]byte{32, 110, 156}: "Samsung Electronics Co.,Ltd", + [3]byte{32, 111, 236}: "Braemac CA LLC", + [3]byte{32, 113, 158}: "SF Technology Co.,Ltd", + [3]byte{32, 115, 85}: "ARRIS Group, Inc.", + [3]byte{32, 116, 207}: "Shenzhen Voxtech Co.,Ltd", + [3]byte{32, 118, 0}: "Actiontec Electronics, Inc", + [3]byte{32, 118, 143}: "Apple, Inc.", + [3]byte{32, 118, 147}: "Lenovo (Beijing) Limited.", + [3]byte{32, 120, 11}: "Delta Faucet Company", + [3]byte{32, 120, 82}: "Nokia", + [3]byte{32, 120, 240}: "Apple, Inc.", + [3]byte{32, 124, 143}: "Quanta Microsystems,Inc.", + [3]byte{32, 125, 116}: "Apple, Inc.", + [3]byte{32, 130, 192}: "Xiaomi Communications Co Ltd", + [3]byte{32, 133, 140}: "Assa", + [3]byte{32, 135, 86}: "SIEMENS AG", + [3]byte{32, 135, 172}: "AES motomation", + [3]byte{32, 137, 111}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{32, 137, 132}: "COMPAL INFORMATION (KUNSHAN) CO., LTD.", + [3]byte{32, 137, 134}: "zte corporation", + [3]byte{32, 139, 55}: "Skyworth Digital Technology(Shenzhen) Co.,Ltd", + [3]byte{32, 144, 111}: "Shenzhen Tencent Computer System Co., Ltd.", + [3]byte{32, 145, 72}: "Texas Instruments", + [3]byte{32, 145, 138}: "PROFALUX", + [3]byte{32, 145, 217}: "I'M SPA", + [3]byte{32, 147, 77}: "FUJIAN STAR-NET COMMUNICATION CO.,LTD", + [3]byte{32, 154, 233}: "Volacomm Co., Ltd", + [3]byte{32, 155, 165}: "JIAXING GLEAD Electronics Co.,Ltd", + [3]byte{32, 155, 205}: "Apple, Inc.", + [3]byte{32, 162, 228}: "Apple, Inc.", + [3]byte{32, 162, 231}: "Lee-Dickens Ltd", + [3]byte{32, 166, 128}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{32, 166, 205}: "Hewlett Packard Enterprise", + [3]byte{32, 167, 131}: "miControl GmbH", + [3]byte{32, 167, 135}: "Bointec Taiwan Corporation Limited", + [3]byte{32, 168, 185}: "Siemens", + [3]byte{32, 169, 14}: "TCT mobile ltd", + [3]byte{32, 169, 155}: "Microsoft Corporation", + [3]byte{32, 170, 37}: "IP-NET LLC", + [3]byte{32, 170, 75}: "Cisco-Linksys, LLC", + [3]byte{32, 171, 55}: "Apple, Inc.", + [3]byte{32, 176, 247}: "Enclustra GmbH", + [3]byte{32, 179, 153}: "Enterasys", + [3]byte{32, 181, 198}: "Mimosa Networks", + [3]byte{32, 183, 192}: "OMICRON electronics GmbH", + [3]byte{32, 187, 118}: "COL GIOVANNI PAOLO SpA", + [3]byte{32, 187, 192}: "Cisco Systems, Inc", + [3]byte{32, 187, 198}: "Jabil Circuit Hungary Ltd.", + [3]byte{32, 191, 219}: "DVL", + [3]byte{32, 192, 71}: "Verizon", + [3]byte{32, 192, 109}: "SHENZHEN SPACETEK TECHNOLOGY CO.,LTD", + [3]byte{32, 193, 175}: "i Wit Digital Co., Limited", + [3]byte{32, 195, 143}: "Texas Instruments", + [3]byte{32, 195, 164}: "RetailNext", + [3]byte{32, 198, 13}: "Shanghai annijie Information technology Co.,LTD", + [3]byte{32, 198, 235}: "Panasonic Corporation AVC Networks Company", + [3]byte{32, 200, 179}: "SHENZHEN BUL-TECH CO.,LTD.", + [3]byte{32, 201, 208}: "Apple, Inc.", + [3]byte{32, 205, 57}: "Texas Instruments", + [3]byte{32, 206, 196}: "Peraso Technologies", + [3]byte{32, 207, 48}: "ASUSTek COMPUTER INC.", + [3]byte{32, 209, 96}: "Private", + [3]byte{32, 210, 31}: "Wincal Technology Corp.", + [3]byte{32, 210, 95}: "SmartCap Technologies", + [3]byte{32, 211, 144}: "Samsung Electronics Co.,Ltd", + [3]byte{32, 213, 171}: "Korea Infocom Co.,Ltd.", + [3]byte{32, 213, 191}: "Samsung Electronics Co.,Ltd", + [3]byte{32, 214, 7}: "Nokia Corporation", + [3]byte{32, 215, 90}: "Posh Mobile Limited", + [3]byte{32, 217, 6}: "Iota, Inc.", + [3]byte{32, 219, 171}: "Samsung Electronics Co., Ltd.", + [3]byte{32, 220, 147}: "Cheetah Hi-Tech, Inc.", + [3]byte{32, 220, 230}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{32, 223, 63}: "Nanjing SAC Power Grid Automation Co., Ltd.", + [3]byte{32, 223, 185}: "Google, Inc.", + [3]byte{32, 224, 156}: "Nokia", + [3]byte{32, 228, 7}: "Spark srl", + [3]byte{32, 229, 42}: "NETGEAR", + [3]byte{32, 229, 100}: "ARRIS Group, Inc.", + [3]byte{32, 231, 145}: "Siemens Healthcare Diagnostics, Inc", + [3]byte{32, 234, 199}: "SHENZHEN RIOPINE ELECTRONICS CO., LTD", + [3]byte{32, 237, 116}: "Ability enterprise co.,Ltd.", + [3]byte{32, 238, 40}: "Apple, Inc.", + [3]byte{32, 238, 198}: "Elefirst Science & Tech Co ., ltd", + [3]byte{32, 240, 2}: "MTData Developments Pty. Ltd.", + [3]byte{32, 241, 124}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{32, 241, 158}: "ARRIS Group, Inc.", + [3]byte{32, 243, 163}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{32, 244, 27}: "Shenzhen Bilian electronic CO.,LTD", + [3]byte{32, 244, 82}: "Shanghai IUV Software Development Co. Ltd", + [3]byte{32, 245, 16}: "Codex Digital Limited", + [3]byte{32, 245, 67}: "Hui Zhou Gaoshengda Technology Co.,LTD", + [3]byte{32, 248, 94}: "Delta Electronics", + [3]byte{32, 250, 187}: "Cambridge Executive Limited", + [3]byte{32, 253, 241}: "3COM EUROPE LTD", + [3]byte{32, 254, 205}: "System In Frontier Inc.", + [3]byte{32, 254, 219}: "M2M Solution S.A.S.", + [3]byte{36, 0, 186}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{36, 1, 199}: "Cisco Systems, Inc", + [3]byte{36, 5, 15}: "MTN Electronic Co. Ltd", + [3]byte{36, 5, 245}: "Integrated Device Technology (Malaysia) Sdn. Bhd.", + [3]byte{36, 9, 23}: "Devlin Electronics Limited", + [3]byte{36, 9, 149}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{36, 10, 17}: "TCT mobile ltd", + [3]byte{36, 10, 100}: "AzureWave Technology Inc.", + [3]byte{36, 10, 196}: "Espressif Inc.", + [3]byte{36, 11, 10}: "Palo Alto Networks", + [3]byte{36, 11, 42}: "Viettel Group", + [3]byte{36, 11, 177}: "KOSTAL Industrie Elektrik GmbH", + [3]byte{36, 13, 101}: "Shenzhen Vsun Communication Technology Co., Ltd.", + [3]byte{36, 13, 108}: "SMND", + [3]byte{36, 13, 194}: "TCT mobile ltd", + [3]byte{36, 16, 100}: "Shenzhen Ecsino Tecnical Co. Ltd", + [3]byte{36, 17, 37}: "Hutek Co., Ltd.", + [3]byte{36, 17, 72}: "Entropix, LLC", + [3]byte{36, 17, 208}: "Chongqing Ehs Science and Technology Development Co.,Ltd.", + [3]byte{36, 26, 140}: "Squarehead Technology AS", + [3]byte{36, 27, 19}: "Shanghai Nutshell Electronic Co., Ltd.", + [3]byte{36, 27, 68}: "Hangzhou Tuners Electronics Co., Ltd", + [3]byte{36, 28, 4}: "SHENZHEN JEHE TECHNOLOGY DEVELOPMENT CO., LTD.", + [3]byte{36, 30, 235}: "Apple, Inc.", + [3]byte{36, 31, 44}: "Calsys, Inc.", + [3]byte{36, 31, 160}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{36, 32, 199}: "Sagemcom Broadband SAS", + [3]byte{36, 33, 171}: "Sony Mobile Communications AB", + [3]byte{36, 36, 14}: "Apple, Inc.", + [3]byte{36, 38, 66}: "SHARP Corporation.", + [3]byte{36, 47, 250}: "Toshiba Global Commerce Solutions", + [3]byte{36, 49, 132}: "SHARP Corporation", + [3]byte{36, 51, 108}: "Private", + [3]byte{36, 53, 204}: "Zhongshan Scinan Internet of Things Co.,Ltd.", + [3]byte{36, 55, 76}: "Cisco SPVTG", + [3]byte{36, 55, 239}: "EMC Electronic Media Communication SA", + [3]byte{36, 60, 32}: "Dynamode Group", + [3]byte{36, 66, 188}: "Alinco,incorporated", + [3]byte{36, 68, 39}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{36, 69, 151}: "GEMUE Gebr. Mueller Apparatebau", + [3]byte{36, 71, 14}: "PentronicAB", + [3]byte{36, 73, 123}: "Innovative Converged Devices Inc", + [3]byte{36, 75, 3}: "Samsung Electronics Co.,Ltd", + [3]byte{36, 75, 129}: "Samsung Electronics Co.,Ltd", + [3]byte{36, 76, 7}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{36, 78, 123}: "IEEE Registration Authority", + [3]byte{36, 79, 29}: "iRule LLC", + [3]byte{36, 88, 128}: "VIZEO", + [3]byte{36, 89, 11}: "White Sky Inc. Limited", + [3]byte{36, 91, 167}: "Apple, Inc.", + [3]byte{36, 91, 240}: "Liteon, Inc.", + [3]byte{36, 92, 191}: "NCSE", + [3]byte{36, 92, 203}: "AXIe Consortium, Inc.", + [3]byte{36, 94, 190}: "QNAP Systems, Inc.", + [3]byte{36, 95, 223}: "KYOCERA CORPORATION", + [3]byte{36, 96, 129}: "razberi technologies", + [3]byte{36, 97, 90}: "China Mobile Group Device Co.,Ltd.", + [3]byte{36, 98, 120}: "sysmocom - systems for mobile communications GmbH", + [3]byte{36, 100, 239}: "CYG SUNRI CO.,LTD.", + [3]byte{36, 101, 17}: "AVM GmbH", + [3]byte{36, 104, 128}: "Braveridge.co.,ltd.", + [3]byte{36, 105, 62}: "innodisk Corporation", + [3]byte{36, 105, 74}: "Jasmine Systems Inc.", + [3]byte{36, 105, 104}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{36, 105, 165}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{36, 106, 171}: "IT-IS International", + [3]byte{36, 108, 138}: "YUKAI Engineering", + [3]byte{36, 110, 150}: "Dell Inc.", + [3]byte{36, 113, 137}: "Texas Instruments", + [3]byte{36, 114, 96}: "IOTTECH Corp", + [3]byte{36, 118, 86}: "Shanghai Net Miles Fiber Optics Technology Co., LTD.", + [3]byte{36, 118, 125}: "Cisco SPVTG", + [3]byte{36, 119, 3}: "Intel Corporate", + [3]byte{36, 121, 42}: "Ruckus Wireless", + [3]byte{36, 124, 76}: "Herman Miller", + [3]byte{36, 127, 32}: "Sagemcom Broadband SAS", + [3]byte{36, 127, 60}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{36, 128, 0}: "Westcontrol AS", + [3]byte{36, 129, 170}: "KSH International Co., Ltd.", + [3]byte{36, 130, 138}: "Prowave Technologies Ltd.", + [3]byte{36, 134, 244}: "Ctek, Inc.", + [3]byte{36, 135, 7}: "SEnergy Corporation", + [3]byte{36, 136, 148}: "shenzhen lensun Communication Technology LTD", + [3]byte{36, 138, 7}: "Mellanox Technologies, Inc.", + [3]byte{36, 139, 224}: "SICHUAN TIANYI COMHEART TELECOMCO., LTD", + [3]byte{36, 146, 14}: "Samsung Electronics Co.,Ltd", + [3]byte{36, 147, 202}: "Voxtronic Technology Computer-Systeme GmbH", + [3]byte{36, 148, 66}: "OPEN ROAD SOLUTIONS , INC.", + [3]byte{36, 149, 4}: "SFR", + [3]byte{36, 151, 237}: "Techvision Intelligent Technology Limited", + [3]byte{36, 158, 171}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{36, 160, 116}: "Apple, Inc.", + [3]byte{36, 162, 225}: "Apple, Inc.", + [3]byte{36, 164, 44}: "KOUKAAM a.s.", + [3]byte{36, 164, 60}: "Ubiquiti Networks Inc.", + [3]byte{36, 164, 149}: "Thales Canada Inc.", + [3]byte{36, 165, 52}: "SynTrust Tech International Ltd.", + [3]byte{36, 167, 220}: "BSkyB Ltd", + [3]byte{36, 168, 125}: "Panasonic Automotive Systems Asia Pacific(Thailand)Co.,Ltd.", + [3]byte{36, 169, 55}: "PURE Storage", + [3]byte{36, 171, 129}: "Apple, Inc.", + [3]byte{36, 175, 74}: "Alcatel-Lucent IPD", + [3]byte{36, 175, 84}: "NEXGEN Mediatech Inc.", + [3]byte{36, 176, 169}: "Shanghai Mobiletek Communication Ltd.", + [3]byte{36, 178, 9}: "Avaya Inc", + [3]byte{36, 178, 222}: "Espressif Inc.", + [3]byte{36, 182, 87}: "Cisco Systems, Inc", + [3]byte{36, 182, 184}: "FRIEM SPA", + [3]byte{36, 182, 253}: "Dell Inc.", + [3]byte{36, 184, 140}: "Crenus Co.,Ltd.", + [3]byte{36, 184, 210}: "Opzoon Technology Co.,Ltd.", + [3]byte{36, 186, 19}: "RISO KAGAKU CORPORATION", + [3]byte{36, 186, 48}: "Technical Consumer Products, Inc.", + [3]byte{36, 187, 193}: "Absolute Analysis", + [3]byte{36, 188, 130}: "Dali Wireless, Inc.", + [3]byte{36, 188, 248}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{36, 190, 5}: "Hewlett Packard", + [3]byte{36, 191, 116}: "Private", + [3]byte{36, 192, 179}: "RSF", + [3]byte{36, 193, 189}: "CRRC DALIAN R&D CO.,LTD.", + [3]byte{36, 195, 249}: "Securitas Direct AB", + [3]byte{36, 196, 47}: "Philips Lifeline", + [3]byte{36, 196, 74}: "zte corporation", + [3]byte{36, 198, 150}: "Samsung Electronics Co.,Ltd", + [3]byte{36, 200, 72}: "mywerk system GmbH", + [3]byte{36, 200, 110}: "Chaney Instrument Co.", + [3]byte{36, 201, 161}: "Ruckus Wireless", + [3]byte{36, 201, 222}: "Genoray", + [3]byte{36, 203, 231}: "MYK, Inc.", + [3]byte{36, 207, 33}: "Shenzhen State Micro Technology Co., Ltd", + [3]byte{36, 209, 63}: "MEXUS CO.,LTD", + [3]byte{36, 210, 204}: "SmartDrive Systems Inc.", + [3]byte{36, 213, 28}: "Zhongtian broadband technology co., LTD", + [3]byte{36, 217, 33}: "Avaya Inc", + [3]byte{36, 218, 17}: "NO NDA Inc", + [3]byte{36, 218, 155}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{36, 218, 182}: "Sistemas de Gestión Energética S.A. de C.V", + [3]byte{36, 219, 172}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{36, 219, 173}: "ShopperTrak RCT Corporation", + [3]byte{36, 219, 237}: "Samsung Electronics Co.,Ltd", + [3]byte{36, 222, 198}: "Aruba Networks", + [3]byte{36, 223, 106}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{36, 225, 36}: "Xiamen Ursaconn Technology Co. , Ltd.", + [3]byte{36, 226, 113}: "Qingdao Hisense Communications Co.,Ltd.", + [3]byte{36, 227, 20}: "Apple, Inc.", + [3]byte{36, 228, 63}: "Wenzhou Kunmei Communication Technology Co.,Ltd.", + [3]byte{36, 229, 170}: "Philips Oral Healthcare, Inc.", + [3]byte{36, 230, 186}: "JSC Zavod im. Kozitsky", + [3]byte{36, 233, 179}: "Cisco Systems, Inc", + [3]byte{36, 234, 64}: "Helmholz GmbH & Co. KG", + [3]byte{36, 235, 101}: "SAET I.S. S.r.l.", + [3]byte{36, 236, 153}: "ASKEY COMPUTER CORP", + [3]byte{36, 236, 214}: "CSG Science & Technology Co.,Ltd.Hefei", + [3]byte{36, 238, 58}: "Chengdu Yingji Electronic Hi-tech Co Ltd", + [3]byte{36, 240, 148}: "Apple, Inc.", + [3]byte{36, 240, 255}: "GHT Co., Ltd.", + [3]byte{36, 242, 127}: "Hewlett Packard Enterprise", + [3]byte{36, 242, 221}: "Radiant Zemax LLC", + [3]byte{36, 245, 126}: "HWH CO., LTD.", + [3]byte{36, 245, 162}: "Belkin International Inc.", + [3]byte{36, 245, 170}: "Samsung Electronics Co.,Ltd", + [3]byte{36, 246, 119}: "Apple, Inc.", + [3]byte{36, 253, 82}: "Liteon Technology Corporation", + [3]byte{36, 253, 91}: "SmartThings, Inc.", + [3]byte{40, 4, 224}: "FERMAX ELECTRONICA S.A.U.", + [3]byte{40, 6, 30}: "NINGBO GLOBAL USEFUL ELECTRIC CO.,LTD", + [3]byte{40, 6, 141}: "ITL, LLC", + [3]byte{40, 7, 13}: "GUANGZHOU WINSOUND INFORMATION TECHNOLOGY CO.,LTD.", + [3]byte{40, 11, 92}: "Apple, Inc.", + [3]byte{40, 12, 40}: "Unigen DataStorage Corporation", + [3]byte{40, 12, 184}: "Mikrosay Yazilim ve Elektronik A.S.", + [3]byte{40, 13, 252}: "Sony Interactive Entertainment Inc.", + [3]byte{40, 14, 139}: "Beijing Spirit Technology Development Co., Ltd.", + [3]byte{40, 16, 27}: "MagnaCom", + [3]byte{40, 16, 123}: "D-Link International", + [3]byte{40, 20, 113}: "Lantis co., LTD.", + [3]byte{40, 22, 46}: "2Wire Inc", + [3]byte{40, 22, 173}: "Intel Corporate", + [3]byte{40, 23, 206}: "Omnisense Ltd", + [3]byte{40, 24, 120}: "Microsoft Corporation", + [3]byte{40, 24, 253}: "Aditya Infotech Ltd.", + [3]byte{40, 34, 70}: "Beijing Sinoix Communication Co., LTD", + [3]byte{40, 35, 115}: "Digita", + [3]byte{40, 36, 255}: "Wistron Neweb Corporation", + [3]byte{40, 37, 54}: "SHENZHEN HOLATEK CO.,LTD", + [3]byte{40, 38, 166}: "PBR electronics GmbH", + [3]byte{40, 39, 191}: "Samsung Electronics Co.,Ltd", + [3]byte{40, 40, 93}: "Zyxel Communications Corporation", + [3]byte{40, 41, 134}: "APC by Schneider Electric", + [3]byte{40, 41, 204}: "Corsa Technology Incorporated", + [3]byte{40, 41, 217}: "GlobalBeiMing technology (Beijing)Co. Ltd", + [3]byte{40, 44, 178}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{40, 47, 194}: "Automotive Data Solutions", + [3]byte{40, 48, 172}: "Frontiir Co. Ltd.", + [3]byte{40, 49, 82}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{40, 50, 197}: "HUMAX Co., Ltd.", + [3]byte{40, 52, 16}: "Enigma Diagnostics Limited", + [3]byte{40, 52, 162}: "Cisco Systems, Inc", + [3]byte{40, 53, 69}: "SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD", + [3]byte{40, 54, 56}: "IEEE Registration Authority", + [3]byte{40, 55, 19}: "Shenzhen 3Nod Digital Technology Co., Ltd.", + [3]byte{40, 55, 55}: "Apple, Inc.", + [3]byte{40, 56, 207}: "Gen2wave", + [3]byte{40, 57, 94}: "Samsung Electronics Co.,Ltd", + [3]byte{40, 57, 231}: "Preceno Technology Pte.Ltd.", + [3]byte{40, 59, 150}: "Cool Control LTD", + [3]byte{40, 60, 228}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{40, 63, 105}: "Sony Mobile Communications AB", + [3]byte{40, 64, 26}: "C8 MediSensors, Inc.", + [3]byte{40, 65, 33}: "OptiSense Network, LLC", + [3]byte{40, 68, 48}: "GenesisTechnical Systems (UK) Ltd", + [3]byte{40, 71, 170}: "Nokia Corporation", + [3]byte{40, 72, 70}: "GridCentric Inc.", + [3]byte{40, 76, 83}: "Intune Networks", + [3]byte{40, 77, 146}: "Luminator", + [3]byte{40, 78, 215}: "OutSmart Power Systems, Inc.", + [3]byte{40, 79, 206}: "Liaoning Wontel Science and Technology Development Co.,Ltd.", + [3]byte{40, 81, 50}: "Shenzhen Prayfly Technology Co.,Ltd", + [3]byte{40, 82, 97}: "Cisco Systems, Inc", + [3]byte{40, 82, 224}: "Layon international Electronic & Telecom Co.,Ltd", + [3]byte{40, 86, 90}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{40, 86, 193}: "Harman International", + [3]byte{40, 87, 103}: "Echostar Technologies Corp", + [3]byte{40, 87, 190}: "Hangzhou Hikvision Digital Technology Co.,Ltd.", + [3]byte{40, 90, 235}: "Apple, Inc.", + [3]byte{40, 95, 47}: "RNware Co.,Ltd.", + [3]byte{40, 95, 219}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{40, 96, 70}: "Lantech Communications Global, Inc.", + [3]byte{40, 96, 148}: "CAPELEC", + [3]byte{40, 99, 54}: "Siemens AG - Industrial Automation - EWA", + [3]byte{40, 101, 107}: "Keystone Microtech Corporation", + [3]byte{40, 106, 184}: "Apple, Inc.", + [3]byte{40, 106, 186}: "Apple, Inc.", + [3]byte{40, 108, 7}: "XIAOMI Electronics,CO.,LTD", + [3]byte{40, 109, 151}: "SAMJIN Co., Ltd.", + [3]byte{40, 110, 212}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{40, 111, 127}: "Cisco Systems, Inc", + [3]byte{40, 113, 132}: "Spire Payments", + [3]byte{40, 114, 197}: "Smartmatic Corp", + [3]byte{40, 114, 240}: "ATHENA", + [3]byte{40, 118, 16}: "IgniteNet", + [3]byte{40, 118, 205}: "Funshion Online Technologies Co.,Ltd", + [3]byte{40, 121, 148}: "Realplay Digital Technology(Shenzhen) Co.,Ltd", + [3]byte{40, 122, 238}: "ARRIS Group, Inc.", + [3]byte{40, 123, 9}: "zte corporation", + [3]byte{40, 124, 219}: "Hefei Toycloud Technology Co.,ltd", + [3]byte{40, 128, 35}: "Hewlett Packard", + [3]byte{40, 128, 162}: "Novatel Wireless Solutions, Inc.", + [3]byte{40, 131, 53}: "Samsung Electronics Co.,Ltd", + [3]byte{40, 132, 14}: "silicon valley immigration service", + [3]byte{40, 132, 250}: "SHARP Corporation", + [3]byte{40, 133, 45}: "Touch Networks", + [3]byte{40, 137, 21}: "CashGuard Sverige AB", + [3]byte{40, 138, 28}: "Juniper Networks", + [3]byte{40, 140, 184}: "zte corporation", + [3]byte{40, 145, 208}: "Stage Tec Entwicklungsgesellschaft für professionelle Audiotechnik mbH", + [3]byte{40, 146, 74}: "Hewlett Packard", + [3]byte{40, 147, 254}: "Cisco Systems, Inc", + [3]byte{40, 148, 15}: "Cisco Systems, Inc", + [3]byte{40, 148, 175}: "Samhwa Telecom", + [3]byte{40, 152, 123}: "Samsung Electronics Co.,Ltd", + [3]byte{40, 153, 58}: "Arista Networks", + [3]byte{40, 154, 75}: "SteelSeries ApS", + [3]byte{40, 154, 250}: "TCT mobile ltd", + [3]byte{40, 158, 223}: "Danfoss Turbocor Compressors, Inc", + [3]byte{40, 160, 43}: "Apple, Inc.", + [3]byte{40, 161, 131}: "ALPS ELECTRIC CO.,LTD.", + [3]byte{40, 161, 134}: "enblink", + [3]byte{40, 161, 146}: "GERP Solution", + [3]byte{40, 161, 235}: "ETEK TECHNOLOGY (SHENZHEN) CO.,LTD", + [3]byte{40, 162, 65}: "exlar corp", + [3]byte{40, 162, 75}: "Juniper Networks", + [3]byte{40, 165, 116}: "Miller Electric Mfg. Co.", + [3]byte{40, 165, 238}: "Shenzhen SDGI CATV Co., Ltd", + [3]byte{40, 166, 172}: "seca gmbh & co. kg", + [3]byte{40, 166, 219}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{40, 172, 103}: "Mach Power, Rappresentanze Internazionali s.r.l.", + [3]byte{40, 173, 62}: "Shenzhen TONG BO WEI Technology CO.,LTD", + [3]byte{40, 175, 10}: "Sirius XM Radio Inc", + [3]byte{40, 176, 204}: "Xenya d.o.o.", + [3]byte{40, 178, 189}: "Intel Corporate", + [3]byte{40, 179, 171}: "Genmark Automation", + [3]byte{40, 180, 72}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{40, 185, 217}: "Radisys Corporation", + [3]byte{40, 186, 24}: "NextNav, LLC", + [3]byte{40, 186, 181}: "Samsung Electronics Co.,Ltd", + [3]byte{40, 187, 89}: "RNET Technologies, Inc.", + [3]byte{40, 188, 24}: "SourcingOverseas Co. Ltd", + [3]byte{40, 188, 86}: "EMAC, Inc.", + [3]byte{40, 190, 3}: "TCT mobile ltd", + [3]byte{40, 190, 155}: "Technicolor CH USA Inc.", + [3]byte{40, 191, 137}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{40, 192, 218}: "Juniper Networks", + [3]byte{40, 193, 60}: "Hon Hai Precision Ind. Co., Ltd.", + [3]byte{40, 194, 221}: "AzureWave Technology Inc.", + [3]byte{40, 198, 63}: "Intel Corporate", + [3]byte{40, 198, 113}: "Yota Devices OY", + [3]byte{40, 198, 142}: "NETGEAR", + [3]byte{40, 199, 24}: "Altierre", + [3]byte{40, 199, 206}: "Cisco Systems, Inc", + [3]byte{40, 200, 37}: "DellKing Industrial Co., Ltd", + [3]byte{40, 200, 122}: "ARRIS Group, Inc.", + [3]byte{40, 201, 20}: "Taimag Corporation", + [3]byte{40, 202, 9}: "ThyssenKrupp Elevators (Shanghai) Co.,Ltd", + [3]byte{40, 203, 235}: "One", + [3]byte{40, 204, 1}: "Samsung Electronics Co.,Ltd", + [3]byte{40, 204, 255}: "Corporacion Empresarial Altra SL", + [3]byte{40, 205, 28}: "Espotel Oy", + [3]byte{40, 205, 76}: "Individual Computers GmbH", + [3]byte{40, 205, 156}: "Shenzhen Dynamax Software Development Co.,Ltd.", + [3]byte{40, 207, 8}: "ESSYS", + [3]byte{40, 207, 218}: "Apple, Inc.", + [3]byte{40, 207, 233}: "Apple, Inc.", + [3]byte{40, 209, 175}: "Nokia Corporation", + [3]byte{40, 210, 68}: "LCFC(HeFei) Electronics Technology Co., Ltd.", + [3]byte{40, 212, 54}: "Jiangsu dewosi electric co., LTD", + [3]byte{40, 213, 118}: "Premier Wireless, Inc.", + [3]byte{40, 217, 62}: "Telecor Inc.", + [3]byte{40, 217, 138}: "Hangzhou Konke Technology Co.,Ltd.", + [3]byte{40, 217, 151}: "Yuduan Mobile Co., Ltd.", + [3]byte{40, 219, 129}: "Shanghai Guao Electronic Technology Co., Ltd", + [3]byte{40, 222, 246}: "bioMerieux Inc.", + [3]byte{40, 224, 44}: "Apple, Inc.", + [3]byte{40, 225, 76}: "Apple, Inc.", + [3]byte{40, 226, 151}: "Shanghai InfoTM Microelectronics Co.,Ltd.", + [3]byte{40, 227, 31}: "Xiaomi Communications Co Ltd", + [3]byte{40, 227, 71}: "Liteon Technology Corporation", + [3]byte{40, 228, 118}: "Pi-Coral", + [3]byte{40, 230, 8}: "Tokheim", + [3]byte{40, 230, 233}: "SIS Sat Internet Services GmbH", + [3]byte{40, 231, 148}: "Microtime Computer Inc.", + [3]byte{40, 231, 207}: "Apple, Inc.", + [3]byte{40, 237, 88}: "JAG Jakob AG", + [3]byte{40, 237, 106}: "Apple, Inc.", + [3]byte{40, 238, 44}: "Frontline Test Equipment", + [3]byte{40, 238, 82}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{40, 238, 211}: "Shenzhen Super D Technology Co., Ltd", + [3]byte{40, 239, 1}: "Private", + [3]byte{40, 240, 118}: "Apple, Inc.", + [3]byte{40, 241, 14}: "Dell Inc.", + [3]byte{40, 243, 88}: "2C - Trifonov & Co", + [3]byte{40, 243, 102}: "Shenzhen Bilian electronic CO.,LTD", + [3]byte{40, 245, 50}: "ADD-Engineering BV", + [3]byte{40, 245, 55}: "IEEE Registration Authority", + [3]byte{40, 246, 6}: "Syes srl", + [3]byte{40, 250, 160}: "vivo Mobile Communication Co., Ltd.", + [3]byte{40, 251, 211}: "Ragentek Technology Group", + [3]byte{40, 252, 81}: "The Electric Controller and Manufacturing Co., LLC", + [3]byte{40, 252, 246}: "Shenzhen Xin KingBrand enterprises Co.,Ltd", + [3]byte{40, 253, 128}: "IEEE Registration Authority", + [3]byte{40, 254, 205}: "Lemobile Information Technology (Beijing) Co., Ltd.", + [3]byte{40, 255, 62}: "zte corporation", + [3]byte{44, 0, 44}: "UNOWHY", + [3]byte{44, 0, 51}: "EControls, LLC", + [3]byte{44, 0, 247}: "XOS", + [3]byte{44, 1, 11}: "NASCENT Technology, LLC - RemKon", + [3]byte{44, 2, 159}: "3ALogics", + [3]byte{44, 6, 35}: "Win Leader Inc.", + [3]byte{44, 7, 60}: "DEVLINE LIMITED", + [3]byte{44, 8, 28}: "OVH", + [3]byte{44, 8, 140}: "HUMAX Co., Ltd.", + [3]byte{44, 9, 77}: "Raptor Engineering, LLC", + [3]byte{44, 9, 203}: "COBS AB", + [3]byte{44, 11, 233}: "Cisco Systems, Inc", + [3]byte{44, 14, 61}: "SAMSUNG ELECTRO-MECHANICS(THAILAND)", + [3]byte{44, 16, 193}: "Nintendo Co., Ltd.", + [3]byte{44, 24, 174}: "Trend Electronics Co., Ltd.", + [3]byte{44, 25, 132}: "IDN Telecom, Inc.", + [3]byte{44, 26, 49}: "Electronics Company Limited", + [3]byte{44, 27, 200}: "Hunan Topview Network System CO.,LTD", + [3]byte{44, 29, 184}: "ARRIS Group, Inc.", + [3]byte{44, 30, 234}: "AERODEV", + [3]byte{44, 31, 35}: "Apple, Inc.", + [3]byte{44, 32, 11}: "Apple, Inc.", + [3]byte{44, 33, 49}: "Juniper Networks", + [3]byte{44, 33, 114}: "Juniper Networks", + [3]byte{44, 33, 215}: "IMAX Corporation", + [3]byte{44, 34, 139}: "CTR SRL", + [3]byte{44, 35, 58}: "Hewlett Packard", + [3]byte{44, 36, 95}: "Babolat VS", + [3]byte{44, 38, 23}: "Oculus VR, LLC", + [3]byte{44, 38, 95}: "IEEE Registration Authority", + [3]byte{44, 38, 197}: "zte corporation", + [3]byte{44, 39, 158}: "IEEE Registration Authority", + [3]byte{44, 39, 215}: "Hewlett Packard", + [3]byte{44, 40, 45}: "BBK EDUCATIONAL ELECTRONICS CORP.,LTD.", + [3]byte{44, 41, 151}: "Microsoft Corporation", + [3]byte{44, 45, 72}: "bct electronic GesmbH", + [3]byte{44, 48, 51}: "NETGEAR", + [3]byte{44, 48, 104}: "Pantech Co.,Ltd", + [3]byte{44, 49, 36}: "Cisco Systems, Inc", + [3]byte{44, 51, 17}: "Cisco Systems, Inc", + [3]byte{44, 51, 97}: "Apple, Inc.", + [3]byte{44, 51, 122}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{44, 52, 39}: "ERCO & GENER", + [3]byte{44, 53, 87}: "ELLIY Power CO..Ltd", + [3]byte{44, 54, 160}: "Capisco Limited", + [3]byte{44, 54, 248}: "Cisco Systems, Inc", + [3]byte{44, 55, 49}: "SHENZHEN YIFANG DIGITAL TECHNOLOGY CO.,LTD.", + [3]byte{44, 55, 150}: "CYBO CO.,LTD.", + [3]byte{44, 55, 197}: "Qingdao Haier Intelligent Home Appliance Technology Co.,Ltd", + [3]byte{44, 57, 150}: "Sagemcom Broadband SAS", + [3]byte{44, 57, 193}: "Ciena Corporation", + [3]byte{44, 58, 40}: "Fagor Electrónica", + [3]byte{44, 58, 232}: "Espressif Inc.", + [3]byte{44, 59, 253}: "Netstor Technology Co., Ltd.", + [3]byte{44, 62, 207}: "Cisco Systems, Inc", + [3]byte{44, 63, 56}: "Cisco Systems, Inc", + [3]byte{44, 63, 62}: "Alge-Timing GmbH", + [3]byte{44, 64, 43}: "Smart iBlue Technology Limited", + [3]byte{44, 64, 83}: "Samsung Electronics Co.,Ltd", + [3]byte{44, 65, 56}: "Hewlett Packard", + [3]byte{44, 65, 161}: "Bose Corporation", + [3]byte{44, 66, 5}: "Lytx", + [3]byte{44, 67, 26}: "Shenzhen YOUHUA Technology Co., Ltd", + [3]byte{44, 68, 1}: "Samsung Electronics Co.,Ltd", + [3]byte{44, 68, 27}: "Spectrum Medical Limited", + [3]byte{44, 68, 253}: "Hewlett Packard", + [3]byte{44, 77, 84}: "ASUSTek COMPUTER INC.", + [3]byte{44, 77, 121}: "Weifang GoerTek Technology Co.,Ltd.", + [3]byte{44, 80, 137}: "Shenzhen Kaixuan Visual Technology Co.,Limited", + [3]byte{44, 83, 74}: "Shenzhen Winyao Electronic Limited", + [3]byte{44, 84, 45}: "Cisco Systems, Inc", + [3]byte{44, 84, 145}: "Microsoft Corporation", + [3]byte{44, 84, 207}: "LG Electronics (Mobile Communications)", + [3]byte{44, 85, 60}: "Gainspeed, Inc.", + [3]byte{44, 85, 211}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{44, 86, 220}: "ASUSTek COMPUTER INC.", + [3]byte{44, 87, 49}: "Wingtech Group (HongKong)Limited", + [3]byte{44, 89, 138}: "LG Electronics (Mobile Communications)", + [3]byte{44, 89, 229}: "Hewlett Packard", + [3]byte{44, 90, 5}: "Nokia Corporation", + [3]byte{44, 90, 15}: "Cisco Systems, Inc", + [3]byte{44, 90, 141}: "SYSTRONIK Elektronik u. Systemtechnik GmbH", + [3]byte{44, 90, 163}: "PROMATE ELECTRONIC CO.LTD", + [3]byte{44, 91, 184}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{44, 91, 225}: "Centripetal Networks, Inc", + [3]byte{44, 93, 147}: "Ruckus Wireless", + [3]byte{44, 95, 243}: "Pertronic Industries", + [3]byte{44, 96, 12}: "QUANTA COMPUTER INC.", + [3]byte{44, 98, 90}: "Finest Security Systems Co., Ltd", + [3]byte{44, 98, 137}: "Regenersis (Glenrothes) Ltd", + [3]byte{44, 99, 115}: "SICHUAN TIANYI COMHEART TELECOMCO., LTD", + [3]byte{44, 103, 152}: "InTalTech Ltd.", + [3]byte{44, 103, 251}: "ShenZhen Zhengjili Electronics Co., LTD", + [3]byte{44, 105, 186}: "RF Controls, LLC", + [3]byte{44, 106, 111}: "IEEE Registration Authority", + [3]byte{44, 107, 125}: "Texas Instruments", + [3]byte{44, 107, 245}: "Juniper Networks", + [3]byte{44, 110, 133}: "Intel Corporate", + [3]byte{44, 111, 201}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{44, 113, 85}: "HiveMotion", + [3]byte{44, 114, 195}: "Soundmatters", + [3]byte{44, 115, 96}: "Earda Technologies co Ltd", + [3]byte{44, 117, 15}: "Shanghai Dongzhou-Lawton Communication Technology Co. Ltd.", + [3]byte{44, 118, 138}: "Hewlett Packard", + [3]byte{44, 123, 90}: "Milper Ltd", + [3]byte{44, 123, 132}: "OOO Petr Telegin", + [3]byte{44, 126, 129}: "ARRIS Group, Inc.", + [3]byte{44, 126, 207}: "Onzo Ltd", + [3]byte{44, 128, 101}: "HARTING Inc. of North America", + [3]byte{44, 129, 88}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{44, 134, 210}: "Cisco Systems, Inc", + [3]byte{44, 138, 114}: "HTC Corporation", + [3]byte{44, 139, 242}: "Hitachi Metals America Ltd", + [3]byte{44, 145, 39}: "Eintechno Corporation", + [3]byte{44, 146, 44}: "Kishu Giken Kogyou Company Ltd,.", + [3]byte{44, 148, 100}: "Cincoze Co., Ltd.", + [3]byte{44, 149, 127}: "zte corporation", + [3]byte{44, 150, 98}: "Invenit BV", + [3]byte{44, 151, 23}: "I.C.Y. B.V.", + [3]byte{44, 153, 36}: "ARRIS Group, Inc.", + [3]byte{44, 154, 164}: "Eolo SpA", + [3]byte{44, 157, 30}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{44, 158, 95}: "ARRIS Group, Inc.", + [3]byte{44, 158, 236}: "Jabil Circuit Penang", + [3]byte{44, 158, 252}: "CANON INC.", + [3]byte{44, 161, 87}: "acromate, Inc.", + [3]byte{44, 161, 125}: "ARRIS Group, Inc.", + [3]byte{44, 162, 180}: "Fortify Technologies, LLC", + [3]byte{44, 163, 14}: "POWER DRAGON DEVELOPMENT LIMITED", + [3]byte{44, 165, 57}: "Parallel Wireless, Inc", + [3]byte{44, 167, 128}: "True Technologies Inc.", + [3]byte{44, 168, 53}: "RIM", + [3]byte{44, 171, 0}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{44, 171, 37}: "SHENZHEN GONGJIN ELECTRONICS CO.,LT", + [3]byte{44, 171, 164}: "Cisco SPVTG", + [3]byte{44, 171, 235}: "Cisco Systems, Inc", + [3]byte{44, 172, 68}: "CONEXTOP", + [3]byte{44, 173, 19}: "SHENZHEN ZHILU TECHNOLOGY CO.,LTD", + [3]byte{44, 174, 43}: "Samsung Electronics Co.,Ltd", + [3]byte{44, 176, 93}: "NETGEAR", + [3]byte{44, 176, 223}: "Soliton Technologies Pvt Ltd", + [3]byte{44, 177, 21}: "Integrated Device Technology (Malaysia) Sdn. Bhd.", + [3]byte{44, 178, 26}: "Phicomm (Shanghai) Co., Ltd.", + [3]byte{44, 180, 58}: "Apple, Inc.", + [3]byte{44, 182, 147}: "Radware", + [3]byte{44, 182, 157}: "RED Digital Cinema", + [3]byte{44, 186, 186}: "Samsung Electronics Co.,Ltd", + [3]byte{44, 190, 8}: "Apple, Inc.", + [3]byte{44, 190, 151}: "Ingenieurbuero Bickele und Buehler GmbH", + [3]byte{44, 194, 96}: "Oracle Corporation", + [3]byte{44, 197, 72}: "IAdea Corporation", + [3]byte{44, 197, 211}: "Ruckus Wireless", + [3]byte{44, 204, 21}: "Nokia Corporation", + [3]byte{44, 205, 39}: "Precor Inc", + [3]byte{44, 205, 67}: "Summit Technology Group", + [3]byte{44, 205, 105}: "Aqavi.com", + [3]byte{44, 207, 88}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{44, 208, 45}: "Cisco Systems, Inc", + [3]byte{44, 208, 90}: "Liteon Technology Corporation", + [3]byte{44, 209, 65}: "IEEE Registration Authority", + [3]byte{44, 209, 218}: "Sanjole, Inc.", + [3]byte{44, 210, 231}: "Nokia Corporation", + [3]byte{44, 212, 68}: "FUJITSU LIMITED", + [3]byte{44, 220, 173}: "Wistron Neweb Corporation", + [3]byte{44, 221, 12}: "Discovergy GmbH", + [3]byte{44, 221, 149}: "Taicang T&W Electronics", + [3]byte{44, 221, 163}: "Point Grey Research Inc.", + [3]byte{44, 226, 168}: "DeviceDesign", + [3]byte{44, 228, 18}: "Sagemcom Broadband SAS", + [3]byte{44, 230, 204}: "Ruckus Wireless", + [3]byte{44, 232, 113}: "Alert Metalguard ApS", + [3]byte{44, 237, 235}: "Alpheus Digital Company Limited", + [3]byte{44, 238, 38}: "Petroleum Geo-Services", + [3]byte{44, 240, 162}: "Apple, Inc.", + [3]byte{44, 240, 238}: "Apple, Inc.", + [3]byte{44, 242, 3}: "EMKO ELEKTRONIK SAN VE TIC AS", + [3]byte{44, 244, 197}: "Avaya Inc", + [3]byte{44, 247, 241}: "Seeed Technology Inc.", + [3]byte{44, 250, 162}: "Alcatel-Lucent Enterprise", + [3]byte{44, 252, 228}: "CTEK Sweden AB", + [3]byte{44, 253, 55}: "Blue Calypso, Inc.", + [3]byte{44, 253, 161}: "ASUSTek COMPUTER INC.", + [3]byte{44, 253, 171}: "Motorola (Wuhan) Mobility Technologies Communication Co., Ltd.", + [3]byte{44, 255, 101}: "Oki Electric Industry Co., Ltd.", + [3]byte{48, 5, 63}: "JTI Co.,Ltd.", + [3]byte{48, 5, 92}: "Brother industries, LTD.", + [3]byte{48, 7, 77}: "SAMSUNG ELECTRO-MECHANICS(THAILAND)", + [3]byte{48, 11, 156}: "Delta Mobile Systems, Inc.", + [3]byte{48, 12, 35}: "zte corporation", + [3]byte{48, 13, 42}: "Zhejiang Wellcom Technology Co.,Ltd.", + [3]byte{48, 13, 67}: "Microsoft Mobile Oy", + [3]byte{48, 14, 213}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{48, 14, 227}: "Aquantia Corporation", + [3]byte{48, 16, 179}: "Liteon Technology Corporation", + [3]byte{48, 16, 228}: "Apple, Inc.", + [3]byte{48, 20, 45}: "Piciorgros GmbH", + [3]byte{48, 20, 74}: "Wistron Neweb Corporation", + [3]byte{48, 21, 24}: "Ubiquitous Communication Co. ltd.", + [3]byte{48, 22, 141}: "ProLon", + [3]byte{48, 23, 200}: "Sony Mobile Communications AB", + [3]byte{48, 24, 207}: "DEOS control systems GmbH", + [3]byte{48, 25, 102}: "Samsung Electronics Co.,Ltd", + [3]byte{48, 26, 40}: "Mako Networks Ltd", + [3]byte{48, 33, 91}: "Shenzhen Ostar Display Electronic Co.,Ltd", + [3]byte{48, 41, 190}: "Shanghai MRDcom Co.,Ltd", + [3]byte{48, 45, 232}: "JDA, LLC (JDA Systems)", + [3]byte{48, 50, 148}: "W-IE-NE-R Plein & Baus GmbH", + [3]byte{48, 50, 212}: "Hanilstm Co., Ltd.", + [3]byte{48, 51, 53}: "Boosty", + [3]byte{48, 52, 210}: "Availink, Inc.", + [3]byte{48, 53, 173}: "Apple, Inc.", + [3]byte{48, 55, 166}: "Cisco Systems, Inc", + [3]byte{48, 56, 85}: "Nokia Corporation", + [3]byte{48, 57, 38}: "Sony Mobile Communications AB", + [3]byte{48, 57, 85}: "Shenzhen Jinhengjia Electronic Co., Ltd.", + [3]byte{48, 57, 242}: "ADB Broadband Italia", + [3]byte{48, 58, 100}: "Intel Corporate", + [3]byte{48, 61, 8}: "GLINTT TES S.A.", + [3]byte{48, 62, 173}: "Sonavox Canada Inc", + [3]byte{48, 65, 116}: "ALTEC LANSING LLC", + [3]byte{48, 66, 37}: "BURG-WÄCHTER KG", + [3]byte{48, 68, 73}: "PLATH GmbH", + [3]byte{48, 68, 135}: "Hefei Radio Communication Technology Co., Ltd", + [3]byte{48, 68, 161}: "Shanghai Nanchao Information Technology", + [3]byte{48, 70, 154}: "NETGEAR", + [3]byte{48, 73, 59}: "Nanjing Z-Com Wireless Co.,Ltd", + [3]byte{48, 76, 126}: "Panasonic Electric Works Automation Controls Techno Co.,Ltd.", + [3]byte{48, 78, 195}: "Tianjin Techua Technology Co., Ltd.", + [3]byte{48, 81, 248}: "BYK-Gardner GmbH", + [3]byte{48, 82, 90}: "NST Co., LTD", + [3]byte{48, 82, 203}: "Liteon Technology Corporation", + [3]byte{48, 85, 237}: "Trex Network LLC", + [3]byte{48, 87, 172}: "IRLAB LTD.", + [3]byte{48, 88, 144}: "Frontier Silicon Ltd", + [3]byte{48, 89, 91}: "streamnow AG", + [3]byte{48, 89, 183}: "Microsoft", + [3]byte{48, 90, 58}: "ASUSTek COMPUTER INC.", + [3]byte{48, 93, 56}: "Beissbarth", + [3]byte{48, 96, 35}: "ARRIS Group, Inc.", + [3]byte{48, 97, 18}: "PAV GmbH", + [3]byte{48, 97, 24}: "Paradom Inc.", + [3]byte{48, 99, 107}: "Apple, Inc.", + [3]byte{48, 101, 236}: "Wistron (ChongQing)", + [3]byte{48, 104, 140}: "Reach Technology Inc.", + [3]byte{48, 105, 75}: "RIM", + [3]byte{48, 108, 190}: "Skymotion Technology (HK) Limited", + [3]byte{48, 110, 92}: "Validus Technologies", + [3]byte{48, 113, 178}: "Hangzhou Prevail Optoelectronic Equipment Co.,LTD.", + [3]byte{48, 115, 80}: "Inpeco SA", + [3]byte{48, 116, 150}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{48, 117, 18}: "Sony Mobile Communications AB", + [3]byte{48, 118, 111}: "LG Electronics (Mobile Communications)", + [3]byte{48, 119, 203}: "Maike Industry(Shenzhen)CO.,LTD", + [3]byte{48, 120, 92}: "Partow Tamas Novin (Parman)", + [3]byte{48, 120, 107}: "TIANJIN Golden Pentagon Electronics Co., Ltd.", + [3]byte{48, 120, 194}: "Innowireless, Co. Ltd.", + [3]byte{48, 124, 48}: "RIM", + [3]byte{48, 124, 94}: "Juniper Networks", + [3]byte{48, 124, 178}: "ANOV FRANCE", + [3]byte{48, 126, 203}: "SFR", + [3]byte{48, 132, 84}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{48, 133, 169}: "ASUSTek COMPUTER INC.", + [3]byte{48, 135, 48}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{48, 135, 217}: "Ruckus Wireless", + [3]byte{48, 137, 118}: "DALIAN LAMBA TECHNOLOGY CO.,LTD", + [3]byte{48, 137, 153}: "Guangdong East Power Co.,", + [3]byte{48, 137, 211}: "HONGKONG UCLOUDLINK NETWORK TECHNOLOGY LIMITED", + [3]byte{48, 140, 251}: "Dropcam", + [3]byte{48, 141, 153}: "Hewlett Packard", + [3]byte{48, 144, 171}: "Apple, Inc.", + [3]byte{48, 145, 143}: "Technicolor", + [3]byte{48, 146, 246}: "SHANGHAI SUNMON COMMUNICATION TECHNOGY CO.,LTD", + [3]byte{48, 149, 227}: "SHANGHAI SIMCOM LIMITED", + [3]byte{48, 150, 251}: "Samsung Electronics Co.,Ltd", + [3]byte{48, 153, 53}: "zte corporation", + [3]byte{48, 155, 173}: "BBK EDUCATIONAL ELECTRONICS CORP.,LTD.", + [3]byte{48, 156, 35}: "Micro-Star INTL CO., LTD.", + [3]byte{48, 159, 251}: "Ardomus Networks Corporation", + [3]byte{48, 162, 32}: "ARG Telecom", + [3]byte{48, 162, 67}: "Shenzhen Prifox Innovation Technology Co., Ltd.", + [3]byte{48, 168, 219}: "Sony Mobile Communications AB", + [3]byte{48, 169, 222}: "LG Innotek", + [3]byte{48, 170, 189}: "Shanghai Reallytek Information Technology Co.,Ltd", + [3]byte{48, 174, 123}: "Deqing Dusun Electron CO., LTD", + [3]byte{48, 174, 164}: "Espressif Inc.", + [3]byte{48, 174, 246}: "Radio Mobile Access", + [3]byte{48, 177, 100}: "Power Electronics International Inc.", + [3]byte{48, 178, 22}: "Hytec Geraetebau GmbH", + [3]byte{48, 179, 162}: "Shenzhen Heguang Measurement & Control Technology Co.,Ltd", + [3]byte{48, 180, 158}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{48, 180, 184}: "LG Electronics", + [3]byte{48, 181, 194}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{48, 181, 241}: "Aitexin Technology Co., Ltd", + [3]byte{48, 182, 45}: "Mojo Networks, Inc.", + [3]byte{48, 182, 79}: "Juniper Networks", + [3]byte{48, 192, 27}: "Shenzhen Jingxun Software Telecommunication Technology Co.,Ltd", + [3]byte{48, 195, 217}: "ALPS ELECTRIC CO.,LTD.", + [3]byte{48, 197, 7}: "ECI Telecom Ltd.", + [3]byte{48, 199, 80}: "MIC Technology Group", + [3]byte{48, 199, 174}: "Samsung Electronics Co.,Ltd", + [3]byte{48, 200, 42}: "WI-BIZ srl", + [3]byte{48, 203, 248}: "Samsung Electronics Co.,Ltd", + [3]byte{48, 205, 167}: "Samsung Electronics Co.,Ltd", + [3]byte{48, 209, 126}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{48, 211, 45}: "devolo AG", + [3]byte{48, 211, 87}: "Logosol, Inc.", + [3]byte{48, 211, 134}: "zte corporation", + [3]byte{48, 212, 106}: "Autosales Incorporated", + [3]byte{48, 213, 135}: "Samsung Electronics Co.,Ltd", + [3]byte{48, 214, 201}: "Samsung Electronics Co.,Ltd", + [3]byte{48, 222, 134}: "Cedac Software S.r.l.", + [3]byte{48, 224, 144}: "Linctronix Ltd,", + [3]byte{48, 225, 113}: "Hewlett Packard", + [3]byte{48, 227, 122}: "Intel Corporate", + [3]byte{48, 228, 142}: "Vodafone UK", + [3]byte{48, 228, 219}: "Cisco Systems, Inc", + [3]byte{48, 235, 31}: "Skylab M&C Technology Co.,Ltd", + [3]byte{48, 235, 37}: "INTEK DIGITAL", + [3]byte{48, 239, 209}: "Alstom Strongwish (Shenzhen) Co., Ltd.", + [3]byte{48, 243, 29}: "zte corporation", + [3]byte{48, 243, 53}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{48, 243, 58}: "+plugg srl", + [3]byte{48, 244, 47}: "ESP", + [3]byte{48, 246, 185}: "Ecocentric Energy", + [3]byte{48, 247, 13}: "Cisco Systems, Inc", + [3]byte{48, 247, 114}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{48, 247, 127}: "S Mobile Devices Limited", + [3]byte{48, 247, 197}: "Apple, Inc.", + [3]byte{48, 247, 215}: "Thread Technology Co., Ltd", + [3]byte{48, 249, 237}: "Sony Corporation", + [3]byte{48, 250, 183}: "Tunai Creative", + [3]byte{48, 251, 148}: "Shanghai Fangzhiwei Information Technology CO.,Ltd.", + [3]byte{48, 252, 104}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{48, 253, 17}: "MACROTECH (USA) INC.", + [3]byte{48, 254, 49}: "Nokia", + [3]byte{48, 255, 246}: "HangZhou KuoHeng Technology Co.,ltd", + [3]byte{52, 0, 138}: "IEEE Registration Authority", + [3]byte{52, 0, 163}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{52, 2, 134}: "Intel Corporate", + [3]byte{52, 2, 155}: "CloudBerry Technologies Private Limited", + [3]byte{52, 4, 158}: "IEEE Registration Authority", + [3]byte{52, 7, 79}: "AccelStor, Inc.", + [3]byte{52, 7, 251}: "Ericsson AB", + [3]byte{52, 8, 4}: "D-Link Corporation", + [3]byte{52, 8, 188}: "Apple, Inc.", + [3]byte{52, 10, 34}: "TOP-ACCESS ELECTRONICS CO LTD", + [3]byte{52, 10, 255}: "Qingdao Hisense Communications Co.,Ltd.", + [3]byte{52, 11, 64}: "MIOS ELETTRONICA SRL", + [3]byte{52, 12, 237}: "Moduel AB", + [3]byte{52, 18, 144}: "Treeview Co.,Ltd.", + [3]byte{52, 18, 152}: "Apple, Inc.", + [3]byte{52, 19, 168}: "Mediplan Limited", + [3]byte{52, 19, 232}: "Intel Corporate", + [3]byte{52, 20, 95}: "Samsung Electronics Co.,Ltd", + [3]byte{52, 21, 19}: "Texas Instruments", + [3]byte{52, 21, 158}: "Apple, Inc.", + [3]byte{52, 23, 235}: "Dell Inc.", + [3]byte{52, 26, 53}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{52, 26, 76}: "SHENZHEN WEIBU ELECTRONICS CO.,LTD.", + [3]byte{52, 27, 34}: "Grandbeing Technology Co., Ltd", + [3]byte{52, 30, 107}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{52, 31, 228}: "ARRIS Group, Inc.", + [3]byte{52, 33, 9}: "Jensen Scandinavia AS", + [3]byte{52, 35, 135}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{52, 35, 186}: "SAMSUNG ELECTRO-MECHANICS(THAILAND)", + [3]byte{52, 37, 93}: "Shenzhen Loadcom Technology Co.,Ltd", + [3]byte{52, 38, 6}: "CarePredict, Inc.", + [3]byte{52, 40, 240}: "ATN International Limited", + [3]byte{52, 41, 143}: "IEEE Registration Authority", + [3]byte{52, 41, 234}: "MCD ELECTRONICS SP. Z O.O.", + [3]byte{52, 42, 241}: "Texas Instruments", + [3]byte{52, 45, 13}: "Samsung Electronics Co.,Ltd", + [3]byte{52, 47, 110}: "Anywire corporation", + [3]byte{52, 49, 17}: "Samsung Electronics Co.,Ltd", + [3]byte{52, 49, 196}: "AVM GmbH", + [3]byte{52, 50, 230}: "Panasonic Industrial Devices Europe GmbH", + [3]byte{52, 54, 59}: "Apple, Inc.", + [3]byte{52, 55, 89}: "zte corporation", + [3]byte{52, 56, 175}: "Inlab Software GmbH", + [3]byte{52, 56, 183}: "HUMAX Co., Ltd.", + [3]byte{52, 61, 152}: "JinQianMao Technology Co.,Ltd.", + [3]byte{52, 61, 196}: "BUFFALO.INC", + [3]byte{52, 64, 181}: "IBM", + [3]byte{52, 65, 93}: "Intel Corporate", + [3]byte{52, 70, 111}: "HiTEM Engineering", + [3]byte{52, 75, 61}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{52, 75, 80}: "zte corporation", + [3]byte{52, 76, 164}: "amazipoint technology Ltd.", + [3]byte{52, 76, 200}: "Echodyne Corp", + [3]byte{52, 77, 234}: "zte corporation", + [3]byte{52, 77, 247}: "LG Electronics (Mobile Communications)", + [3]byte{52, 79, 63}: "IO-Power Technology Co., Ltd.", + [3]byte{52, 79, 92}: "R&M AG", + [3]byte{52, 79, 105}: "EKINOPS SAS", + [3]byte{52, 81, 170}: "JID GLOBAL", + [3]byte{52, 81, 201}: "Apple, Inc.", + [3]byte{52, 84, 60}: "TAKAOKA TOKO CO.,LTD.", + [3]byte{52, 86, 254}: "Cisco Meraki", + [3]byte{52, 87, 96}: "MitraStar Technology Corp.", + [3]byte{52, 91, 17}: "EVI HEAT AB", + [3]byte{52, 91, 187}: "GD Midea Air-Conditioning Equipment Co.,Ltd.", + [3]byte{52, 92, 64}: "Cargt Holdings LLC", + [3]byte{52, 93, 16}: "Wytek", + [3]byte{52, 97, 120}: "The Boeing Company", + [3]byte{52, 98, 136}: "Cisco Systems, Inc", + [3]byte{52, 100, 169}: "Hewlett Packard", + [3]byte{52, 104, 74}: "Teraworks Co., Ltd.", + [3]byte{52, 104, 149}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{52, 105, 135}: "zte corporation", + [3]byte{52, 106, 194}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{52, 107, 211}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{52, 108, 15}: "Pramod Telecom Pvt. Ltd", + [3]byte{52, 110, 138}: "Ecosense", + [3]byte{52, 110, 157}: "Ericsson AB", + [3]byte{52, 111, 144}: "Cisco Systems, Inc", + [3]byte{52, 111, 146}: "White Rodgers Division", + [3]byte{52, 111, 237}: "Enovation Controls", + [3]byte{52, 117, 199}: "Avaya Inc", + [3]byte{52, 118, 197}: "I-O DATA DEVICE, INC.", + [3]byte{52, 120, 119}: "O-Net Communications (Shenzhen) Limited", + [3]byte{52, 120, 215}: "Gionee Communication Equipment Co.,Ltd.", + [3]byte{52, 122, 96}: "ARRIS Group, Inc.", + [3]byte{52, 126, 57}: "Nokia Danmark A/S", + [3]byte{52, 128, 179}: "Xiaomi Communications Co Ltd", + [3]byte{52, 129, 55}: "UNICARD SA", + [3]byte{52, 129, 196}: "AVM GmbH", + [3]byte{52, 129, 244}: "SST Taiwan Ltd.", + [3]byte{52, 130, 222}: "Kiio Inc", + [3]byte{52, 131, 2}: "iFORCOM Co., Ltd", + [3]byte{52, 132, 70}: "Ericsson AB", + [3]byte{52, 133, 132}: "Aerohive Networks Inc.", + [3]byte{52, 134, 42}: "Heinz Lackmann GmbH & Co KG", + [3]byte{52, 135, 61}: "Quectel Wireless Solution Co.,Ltd.", + [3]byte{52, 136, 93}: "Logitech Far East", + [3]byte{52, 138, 123}: "Samsung Electronics Co.,Ltd", + [3]byte{52, 138, 174}: "Sagemcom Broadband SAS", + [3]byte{52, 143, 39}: "Ruckus Wireless", + [3]byte{52, 149, 219}: "Logitec Corporation", + [3]byte{52, 150, 114}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{52, 151, 246}: "ASUSTek COMPUTER INC.", + [3]byte{52, 151, 251}: "ADVANCED RF TECHNOLOGIES INC", + [3]byte{52, 153, 111}: "VPI Engineering", + [3]byte{52, 153, 113}: "Quanta Storage Inc.", + [3]byte{52, 153, 215}: "Universal Flow Monitors, Inc.", + [3]byte{52, 154, 13}: "ZBD Displays Ltd", + [3]byte{52, 155, 91}: "Maquet GmbH", + [3]byte{52, 157, 144}: "Heinzmann GmbH & CO. KG", + [3]byte{52, 158, 52}: "Evervictory Electronic Co.Ltd", + [3]byte{52, 161, 131}: "AWare, Inc", + [3]byte{52, 162, 162}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{52, 163, 149}: "Apple, Inc.", + [3]byte{52, 163, 191}: "Terewave. Inc.", + [3]byte{52, 165, 93}: "TECHNOSOFT INTERNATIONAL SRL", + [3]byte{52, 165, 225}: "Sensorist ApS", + [3]byte{52, 166, 140}: "Shine Profit Development Limited", + [3]byte{52, 167, 9}: "Trevil srl", + [3]byte{52, 167, 186}: "Fischer International Systems Corporation", + [3]byte{52, 168, 67}: "KYOCERA Display Corporation", + [3]byte{52, 168, 78}: "Cisco Systems, Inc", + [3]byte{52, 170, 139}: "Samsung Electronics Co.,Ltd", + [3]byte{52, 170, 153}: "Nokia", + [3]byte{52, 170, 238}: "Mikrovisatos Servisas UAB", + [3]byte{52, 171, 55}: "Apple, Inc.", + [3]byte{52, 173, 228}: "Shanghai Chint Power Systems Co., Ltd.", + [3]byte{52, 175, 44}: "Nintendo Co., Ltd.", + [3]byte{52, 177, 247}: "Texas Instruments", + [3]byte{52, 179, 84}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{52, 181, 113}: "PLDS", + [3]byte{52, 183, 253}: "Guangzhou Younghead Electronic Technology Co.,Ltd", + [3]byte{52, 186, 56}: "PAL MOHAN ELECTRONICS PVT LTD", + [3]byte{52, 186, 81}: "Se-Kure Controls, Inc.", + [3]byte{52, 186, 117}: "Tembo Systems, Inc.", + [3]byte{52, 186, 154}: "Asiatelco Technologies Co.", + [3]byte{52, 187, 31}: "BlackBerry RTS", + [3]byte{52, 187, 38}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{52, 188, 166}: "Beijing Ding Qing Technology, Ltd.", + [3]byte{52, 189, 200}: "Cisco Systems, Inc", + [3]byte{52, 189, 249}: "Shanghai WDK Industrial Co.,Ltd.", + [3]byte{52, 189, 250}: "Cisco SPVTG", + [3]byte{52, 190, 0}: "Samsung Electronics Co.,Ltd", + [3]byte{52, 191, 144}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{52, 192, 89}: "Apple, Inc.", + [3]byte{52, 192, 249}: "Rockwell Automation", + [3]byte{52, 195, 172}: "Samsung Electronics Co.,Ltd", + [3]byte{52, 195, 210}: "FN-LINK TECHNOLOGY LIMITED", + [3]byte{52, 197, 208}: "Hagleitner Hygiene International GmbH", + [3]byte{52, 198, 154}: "Enecsys Ltd", + [3]byte{52, 199, 49}: "ALPS ELECTRIC CO.,LTD.", + [3]byte{52, 200, 3}: "Nokia Corporation", + [3]byte{52, 201, 157}: "EIDOLON COMMUNICATIONS TECHNOLOGY CO. LTD.", + [3]byte{52, 201, 240}: "LM Technologies Ltd", + [3]byte{52, 204, 40}: "Nexpring Co. LTD.,", + [3]byte{52, 205, 109}: "CommSky Technologies", + [3]byte{52, 205, 190}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{52, 206, 0}: "XIAOMI Electronics,CO.,LTD", + [3]byte{52, 206, 148}: "Parsec (Pty) Ltd", + [3]byte{52, 208, 155}: "MobilMAX Technology Inc.", + [3]byte{52, 208, 184}: "IEEE Registration Authority", + [3]byte{52, 210, 112}: "Amazon Technologies Inc.", + [3]byte{52, 210, 196}: "RENA GmbH Print Systeme", + [3]byte{52, 215, 180}: "Tributary Systems, Inc.", + [3]byte{52, 217, 84}: "WiBotic Inc.", + [3]byte{52, 219, 253}: "Cisco Systems, Inc", + [3]byte{52, 222, 26}: "Intel Corporate", + [3]byte{52, 222, 52}: "zte corporation", + [3]byte{52, 223, 42}: "Fujikon Industrial Co.,Limited", + [3]byte{52, 224, 207}: "zte corporation", + [3]byte{52, 224, 215}: "DONGGUAN QISHENG ELECTRONICS INDUSTRIAL CO., LTD", + [3]byte{52, 226, 253}: "Apple, Inc.", + [3]byte{52, 227, 128}: "Genexis B.V.", + [3]byte{52, 228, 42}: "Automatic Bar Controls Inc.", + [3]byte{52, 230, 173}: "Intel Corporate", + [3]byte{52, 230, 215}: "Dell Inc.", + [3]byte{52, 231, 11}: "HAN Networks Co., Ltd", + [3]byte{52, 231, 28}: "Shenzhen YOUHUA Technology Co., Ltd", + [3]byte{52, 233, 17}: "vivo Mobile Communication Co., Ltd.", + [3]byte{52, 234, 52}: "HangZhou Gubei Electronics Technology Co.,Ltd", + [3]byte{52, 237, 11}: "Shanghai XZ-COM.CO.,Ltd.", + [3]byte{52, 239, 68}: "2Wire Inc", + [3]byte{52, 239, 139}: "NTT Communications Corporation", + [3]byte{52, 240, 202}: "Shenzhen Linghangyuan Digital Technology Co.,Ltd.", + [3]byte{52, 243, 154}: "Intel Corporate", + [3]byte{52, 243, 155}: "WizLAN Ltd.", + [3]byte{52, 246, 45}: "SHARP Corporation", + [3]byte{52, 246, 75}: "Intel Corporate", + [3]byte{52, 246, 210}: "Panasonic Taiwan Co.,Ltd.", + [3]byte{52, 249, 104}: "ATEK Products, LLC", + [3]byte{52, 250, 64}: "Guangzhou Robustel Technologies Co., Limited", + [3]byte{52, 250, 159}: "Ruckus Wireless", + [3]byte{52, 252, 111}: "ALCEA", + [3]byte{52, 252, 185}: "Hewlett Packard Enterprise", + [3]byte{52, 252, 239}: "LG Electronics (Mobile Communications)", + [3]byte{56, 1, 149}: "Samsung Electronics Co.,Ltd", + [3]byte{56, 1, 151}: "TSST Global,Inc", + [3]byte{56, 1, 159}: "SHENZHEN FAST TECHNOLOGIES CO.,LTD", + [3]byte{56, 5, 70}: "Foctek Photonics, Inc.", + [3]byte{56, 5, 172}: "Piller Group GmbH", + [3]byte{56, 6, 180}: "A.D.C. GmbH", + [3]byte{56, 7, 212}: "Zeppelin Systems GmbH", + [3]byte{56, 8, 253}: "Silca Spa", + [3]byte{56, 9, 164}: "Firefly Integrations", + [3]byte{56, 10, 10}: "Sky-City Communication and Electronics Limited Company", + [3]byte{56, 10, 148}: "Samsung Electronics Co.,Ltd", + [3]byte{56, 10, 171}: "Formlabs", + [3]byte{56, 11, 64}: "Samsung Electronics Co.,Ltd", + [3]byte{56, 13, 212}: "Primax Electronics Ltd.", + [3]byte{56, 14, 77}: "Cisco Systems, Inc", + [3]byte{56, 14, 123}: "V.P.S. Thai Co., Ltd", + [3]byte{56, 15, 74}: "Apple, Inc.", + [3]byte{56, 15, 228}: "Dedicated Network Partners Oy", + [3]byte{56, 16, 213}: "AVM Audiovisuelles Marketing und Computersysteme GmbH", + [3]byte{56, 22, 209}: "Samsung Electronics Co.,Ltd", + [3]byte{56, 23, 102}: "PROMZAKAZ LTD.", + [3]byte{56, 23, 195}: "Hewlett Packard Enterprise", + [3]byte{56, 23, 225}: "Technicolor CH USA Inc.", + [3]byte{56, 25, 47}: "Nokia Corporation", + [3]byte{56, 28, 26}: "Cisco Systems, Inc", + [3]byte{56, 28, 35}: "Hilan Technology CO.,LTD", + [3]byte{56, 28, 74}: "SIMCom Wireless Solutions Co.,Ltd.", + [3]byte{56, 29, 217}: "FN-LINK TECHNOLOGY LIMITED", + [3]byte{56, 32, 86}: "Cisco Systems, Inc", + [3]byte{56, 32, 168}: "ColorTokens, Inc.", + [3]byte{56, 33, 135}: "Midea Group Co., Ltd.", + [3]byte{56, 34, 157}: "ADB Broadband Italia", + [3]byte{56, 34, 214}: "Hangzhou H3C Technologies Co., Limited", + [3]byte{56, 37, 107}: "Microsoft Mobile Oy", + [3]byte{56, 38, 43}: "UTran Technology", + [3]byte{56, 38, 205}: "ANDTEK", + [3]byte{56, 40, 234}: "Fujian Netcom Technology Co., LTD", + [3]byte{56, 41, 90}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{56, 41, 221}: "ONvocal Inc", + [3]byte{56, 43, 120}: "ECO PLUGS ENTERPRISE CO., LTD", + [3]byte{56, 44, 74}: "ASUSTek COMPUTER INC.", + [3]byte{56, 45, 209}: "Samsung Electronics Co.,Ltd", + [3]byte{56, 45, 232}: "Samsung Electronics Co.,Ltd", + [3]byte{56, 49, 172}: "WEG", + [3]byte{56, 55, 139}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{56, 58, 33}: "IEEE Registration Authority", + [3]byte{56, 59, 200}: "2Wire Inc", + [3]byte{56, 63, 16}: "DBL Technology Ltd.", + [3]byte{56, 66, 51}: "Wildeboer Bauteile GmbH", + [3]byte{56, 66, 166}: "Ingenieurbuero Stahlkopf", + [3]byte{56, 67, 105}: "Patrol Products Consortium LLC", + [3]byte{56, 67, 125}: "Compal Broadband Networks, Inc.", + [3]byte{56, 69, 76}: "Light Labs, Inc.", + [3]byte{56, 69, 140}: "MyCloud Technology corporation", + [3]byte{56, 70, 8}: "zte corporation", + [3]byte{56, 72, 76}: "Apple, Inc.", + [3]byte{56, 75, 118}: "AIRTAME ApS", + [3]byte{56, 76, 79}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{56, 76, 144}: "ARRIS Group, Inc.", + [3]byte{56, 79, 73}: "Juniper Networks", + [3]byte{56, 79, 240}: "AzureWave Technology Inc.", + [3]byte{56, 82, 26}: "Nokia", + [3]byte{56, 86, 16}: "CANDY HOUSE, Inc.", + [3]byte{56, 88, 12}: "Panaccess Systems GmbH", + [3]byte{56, 89, 248}: "MindMade Sp. z o.o.", + [3]byte{56, 89, 249}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{56, 90, 168}: "Beijing Zhongdun Security Technology Development Co.", + [3]byte{56, 95, 102}: "Cisco SPVTG", + [3]byte{56, 95, 195}: "Yu Jeong System, Co.Ltd", + [3]byte{56, 96, 119}: "PEGATRON CORPORATION", + [3]byte{56, 99, 187}: "Hewlett Packard", + [3]byte{56, 99, 246}: "3NOD MULTIMEDIA(SHENZHEN)CO.,LTD", + [3]byte{56, 102, 69}: "OOSIC Technology CO.,Ltd", + [3]byte{56, 102, 240}: "Apple, Inc.", + [3]byte{56, 103, 147}: "Asia Optical Co., Inc.", + [3]byte{56, 107, 28}: "SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.", + [3]byte{56, 107, 187}: "ARRIS Group, Inc.", + [3]byte{56, 108, 155}: "Ivy Biomedical", + [3]byte{56, 110, 33}: "Wasion Group Ltd.", + [3]byte{56, 110, 162}: "vivo Mobile Communication Co., Ltd.", + [3]byte{56, 112, 12}: "ARRIS Group, Inc.", + [3]byte{56, 113, 222}: "Apple, Inc.", + [3]byte{56, 114, 192}: "Comtrend Corporation", + [3]byte{56, 115, 234}: "IEEE Registration Authority", + [3]byte{56, 118, 202}: "Shenzhen Smart Intelligent Technology Co.Ltd", + [3]byte{56, 118, 209}: "Euronda SpA", + [3]byte{56, 123, 71}: "AKELA, Inc.", + [3]byte{56, 131, 69}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{56, 134, 2}: "Flexoptix GmbH", + [3]byte{56, 137, 220}: "Opticon Sensors Europe B.V.", + [3]byte{56, 138, 183}: "ITC Networks", + [3]byte{56, 140, 80}: "LG Electronics", + [3]byte{56, 142, 231}: "Fanhattan LLC", + [3]byte{56, 144, 165}: "Cisco Systems, Inc", + [3]byte{56, 145, 213}: "Hangzhou H3C Technologies Co., Limited", + [3]byte{56, 145, 251}: "Xenox Holding BV", + [3]byte{56, 148, 150}: "Samsung Electronics Co.,Ltd", + [3]byte{56, 148, 224}: "Syrotech Networks. Ltd.", + [3]byte{56, 149, 146}: "Beijing Tendyron Corporation", + [3]byte{56, 151, 214}: "Hangzhou H3C Technologies Co., Limited", + [3]byte{56, 152, 216}: "MERITECH CO.,LTD", + [3]byte{56, 154, 246}: "Samsung Electronics Co.,Ltd", + [3]byte{56, 157, 146}: "Seiko Epson Corporation", + [3]byte{56, 159, 90}: "C-Kur TV Inc.", + [3]byte{56, 159, 131}: "OTN Systems N.V.", + [3]byte{56, 162, 140}: "SHENZHEN RF-LINK TECHNOLOGY CO.,LTD.", + [3]byte{56, 164, 237}: "Xiaomi Communications Co Ltd", + [3]byte{56, 165, 60}: "COMECER Netherlands", + [3]byte{56, 165, 182}: "SHENZHEN MEGMEET ELECTRICAL CO.,LTD", + [3]byte{56, 166, 206}: "BSkyB Ltd", + [3]byte{56, 168, 81}: "Moog, Ing", + [3]byte{56, 168, 107}: "Orga BV", + [3]byte{56, 169, 95}: "Actifio Inc", + [3]byte{56, 170, 60}: "SAMSUNG ELECTRO MECHANICS CO., LTD.", + [3]byte{56, 172, 61}: "Nephos Inc", + [3]byte{56, 173, 142}: "New H3C Technologies Co., Ltd", + [3]byte{56, 173, 190}: "New H3C Technologies Co., Ltd", + [3]byte{56, 175, 215}: "FUJITSU LIMITED", + [3]byte{56, 177, 45}: "Sonotronic Nagel GmbH", + [3]byte{56, 177, 219}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{56, 181, 77}: "Apple, Inc.", + [3]byte{56, 181, 189}: "E.G.O. Elektro-Ger", + [3]byte{56, 183, 37}: "Wistron Infocomm (Zhongshan) Corporation", + [3]byte{56, 183, 77}: "Fijowave Limited", + [3]byte{56, 184, 235}: "IEEE Registration Authority", + [3]byte{56, 187, 35}: "OzVision America LLC", + [3]byte{56, 187, 60}: "Avaya Inc", + [3]byte{56, 188, 1}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{56, 188, 26}: "MEIZU Technology Co., Ltd.", + [3]byte{56, 191, 47}: "Espec Corp.", + [3]byte{56, 191, 51}: "NEC CASIO Mobile Communications", + [3]byte{56, 192, 150}: "ALPS ELECTRIC CO.,LTD.", + [3]byte{56, 199, 10}: "WiFiSong", + [3]byte{56, 199, 186}: "CS Services Co.,Ltd.", + [3]byte{56, 200, 92}: "Cisco SPVTG", + [3]byte{56, 201, 134}: "Apple, Inc.", + [3]byte{56, 201, 169}: "SMART High Reliability Solutions, Inc.", + [3]byte{56, 202, 151}: "Contour Design LLC", + [3]byte{56, 202, 218}: "Apple, Inc.", + [3]byte{56, 205, 7}: "Beijing FaceCam Technology Co., Ltd.", + [3]byte{56, 209, 53}: "EasyIO Corporation Sdn. Bhd.", + [3]byte{56, 210, 105}: "Texas Instruments", + [3]byte{56, 212, 11}: "Samsung Electronics Co.,Ltd", + [3]byte{56, 213, 71}: "ASUSTek COMPUTER INC.", + [3]byte{56, 214, 32}: "Limidea Concept Pte. Ltd.", + [3]byte{56, 215, 202}: "7HUGS LABS", + [3]byte{56, 216, 47}: "zte corporation", + [3]byte{56, 219, 187}: "Sunbow Telecom Co., Ltd.", + [3]byte{56, 222, 96}: "Mohlenhoff GmbH", + [3]byte{56, 224, 142}: "Mitsubishi Electric Corporation", + [3]byte{56, 226, 221}: "zte corporation", + [3]byte{56, 227, 197}: "Taicang T&W Electronics", + [3]byte{56, 229, 149}: "SHENZHEN GONGJIN ELECTRONICS CO.,LT", + [3]byte{56, 231, 216}: "HTC Corporation", + [3]byte{56, 232, 223}: "b gmbh medien + datenbanken", + [3]byte{56, 233, 140}: "Reco S.p.A.", + [3]byte{56, 234, 167}: "Hewlett Packard", + [3]byte{56, 236, 17}: "Novatek Microelectronics Corp.", + [3]byte{56, 236, 228}: "Samsung Electronics Co.,Ltd", + [3]byte{56, 237, 24}: "Cisco Systems, Inc", + [3]byte{56, 238, 157}: "Anedo Ltd.", + [3]byte{56, 240, 152}: "Vapor Stone Rail Systems", + [3]byte{56, 240, 200}: "Livestream", + [3]byte{56, 241, 53}: "SensorTec-Canada", + [3]byte{56, 242, 62}: "Microsoft Mobile Oy", + [3]byte{56, 243, 63}: "TATSUNO CORPORATION", + [3]byte{56, 245, 87}: "JOLATA, INC.", + [3]byte{56, 245, 151}: "home2net GmbH", + [3]byte{56, 247, 8}: "National Resource Management, Inc.", + [3]byte{56, 247, 61}: "Amazon Technologies Inc.", + [3]byte{56, 247, 178}: "SEOJUN ELECTRIC", + [3]byte{56, 248, 137}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{56, 248, 183}: "V2COM PARTICIPACOES S.A.", + [3]byte{56, 248, 202}: "OWIN Inc.", + [3]byte{56, 250, 202}: "Skyworth Digital Technology(Shenzhen) Co.,Ltd", + [3]byte{56, 253, 254}: "IEEE Registration Authority", + [3]byte{56, 254, 197}: "Ellips B.V.", + [3]byte{56, 255, 54}: "Ruckus Wireless", + [3]byte{60, 2, 177}: "Creation Technologies LP", + [3]byte{60, 4, 191}: "PRAVIS SYSTEMS Co.Ltd.,", + [3]byte{60, 5, 24}: "Samsung Electronics Co.,Ltd", + [3]byte{60, 5, 171}: "Product Creation Studio", + [3]byte{60, 7, 84}: "Apple, Inc.", + [3]byte{60, 7, 113}: "Sony Corporation", + [3]byte{60, 8, 30}: "Beijing Yupont Electric Power Technology Co.,Ltd", + [3]byte{60, 8, 246}: "Cisco Systems, Inc", + [3]byte{60, 9, 109}: "Powerhouse Dynamics", + [3]byte{60, 12, 72}: "Servergy, Inc.", + [3]byte{60, 12, 219}: "UNIONMAN TECHNOLOGY CO.,LTD", + [3]byte{60, 14, 35}: "Cisco Systems, Inc", + [3]byte{60, 15, 193}: "KBC Networks", + [3]byte{60, 16, 64}: "daesung network", + [3]byte{60, 16, 111}: "ALBAHITH TECHNOLOGIES", + [3]byte{60, 16, 230}: "PHAZR Inc.", + [3]byte{60, 17, 178}: "Fraunhofer FIT", + [3]byte{60, 21, 194}: "Apple, Inc.", + [3]byte{60, 21, 234}: "TESCOM CO., LTD.", + [3]byte{60, 24, 159}: "Nokia Corporation", + [3]byte{60, 24, 160}: "Luxshare Precision Industry Company Limited", + [3]byte{60, 25, 21}: "GFI Chrono Time", + [3]byte{60, 25, 125}: "Ericsson AB", + [3]byte{60, 26, 15}: "ClearSky Data", + [3]byte{60, 26, 87}: "Cardiopulmonary Corp", + [3]byte{60, 26, 121}: "Huayuan Technology CO.,LTD", + [3]byte{60, 28, 190}: "JADAK LLC", + [3]byte{60, 30, 4}: "D-Link International", + [3]byte{60, 30, 19}: "HANGZHOU SUNRISE TECHNOLOGY CO., LTD", + [3]byte{60, 37, 215}: "Nokia Corporation", + [3]byte{60, 38, 213}: "Sotera Wireless", + [3]byte{60, 39, 99}: "SLE quality engineering GmbH & Co. KG", + [3]byte{60, 42, 244}: "Brother Industries, LTD.", + [3]byte{60, 44, 148}: "杭州德澜科技有限公司(HangZhou Delan Technology Co.,Ltd)", + [3]byte{60, 44, 153}: "Edgecore Networks Corporation", + [3]byte{60, 45, 183}: "Texas Instruments", + [3]byte{60, 46, 249}: "Apple, Inc.", + [3]byte{60, 46, 255}: "Apple, Inc.", + [3]byte{60, 47, 58}: "SFORZATO Corp.", + [3]byte{60, 48, 12}: "Dewar Electronics Pty Ltd", + [3]byte{60, 49, 120}: "Qolsys Inc.", + [3]byte{60, 51, 0}: "Shenzhen Bilian electronic CO.,LTD", + [3]byte{60, 53, 86}: "Cognitec Systems GmbH", + [3]byte{60, 54, 61}: "Nokia Corporation", + [3]byte{60, 54, 228}: "ARRIS Group, Inc.", + [3]byte{60, 56, 136}: "ConnectQuest, llc", + [3]byte{60, 57, 195}: "JW Electronics Co., Ltd.", + [3]byte{60, 57, 231}: "IEEE Registration Authority", + [3]byte{60, 58, 115}: "Avaya Inc", + [3]byte{60, 63, 81}: "2CRSI", + [3]byte{60, 64, 79}: "GUANGDONG PISEN ELECTRONICS CO.,LTD", + [3]byte{60, 67, 142}: "ARRIS Group, Inc.", + [3]byte{60, 70, 216}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{60, 71, 17}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{60, 73, 55}: "ASSMANN Electronic GmbH", + [3]byte{60, 74, 146}: "Hewlett Packard", + [3]byte{60, 76, 105}: "Infinity System S.L.", + [3]byte{60, 76, 208}: "CERAGON NETWORKS", + [3]byte{60, 78, 71}: "Etronic A/S", + [3]byte{60, 82, 130}: "Hewlett Packard", + [3]byte{60, 87, 189}: "Kessler Crane Inc.", + [3]byte{60, 87, 213}: "FiveCo", + [3]byte{60, 89, 30}: "TCL King Electrical Appliances (Huizhou) Co., Ltd", + [3]byte{60, 90, 55}: "Samsung Electronics Co.,Ltd", + [3]byte{60, 90, 180}: "Google, Inc.", + [3]byte{60, 92, 195}: "Shenzhen First Blue Chip Technology Ltd", + [3]byte{60, 94, 195}: "Cisco Systems, Inc", + [3]byte{60, 95, 1}: "Synerchip Co., Ltd.", + [3]byte{60, 97, 4}: "Juniper Networks", + [3]byte{60, 98, 0}: "Samsung Electronics Co.,Ltd", + [3]byte{60, 98, 120}: "SHENZHEN JETNET TECHNOLOGY CO.,LTD.", + [3]byte{60, 103, 22}: "Lily Robotics", + [3]byte{60, 103, 44}: "Sciovid Inc.", + [3]byte{60, 103, 140}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{60, 104, 22}: "VXi Corporation", + [3]byte{60, 106, 125}: "Niigata Power Systems Co., Ltd.", + [3]byte{60, 106, 157}: "Dexatek Technology LTD.", + [3]byte{60, 110, 99}: "Mitron OY", + [3]byte{60, 111, 69}: "Fiberpro Inc.", + [3]byte{60, 111, 234}: "Panasonic India Pvt. Ltd.", + [3]byte{60, 111, 247}: "EnTek Systems, Inc.", + [3]byte{60, 112, 89}: "MakerBot Industries", + [3]byte{60, 116, 55}: "RIM", + [3]byte{60, 117, 74}: "ARRIS Group, Inc.", + [3]byte{60, 119, 230}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{60, 120, 67}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{60, 120, 115}: "Airsonics", + [3]byte{60, 122, 138}: "ARRIS Group, Inc.", + [3]byte{60, 125, 177}: "Texas Instruments", + [3]byte{60, 127, 111}: "Telechips, Inc.", + [3]byte{60, 128, 170}: "Ransnet Singapore Pte Ltd", + [3]byte{60, 129, 216}: "Sagemcom Broadband SAS", + [3]byte{60, 131, 30}: "CKD Corporation", + [3]byte{60, 131, 117}: "Microsoft Corporation", + [3]byte{60, 131, 181}: "Advance Vision Electronics Co. Ltd.", + [3]byte{60, 134, 168}: "Sangshin elecom .co,, LTD", + [3]byte{60, 137, 112}: "Neosfar", + [3]byte{60, 137, 166}: "KAPELSE", + [3]byte{60, 138, 176}: "Juniper Networks", + [3]byte{60, 138, 229}: "Tensun Information Technology(Hangzhou) Co.,LTD", + [3]byte{60, 139, 205}: "Alcatel-Lucent Shanghai Bell Co., Ltd", + [3]byte{60, 139, 254}: "Samsung Electronics Co.,Ltd", + [3]byte{60, 140, 64}: "Hangzhou H3C Technologies Co., Limited", + [3]byte{60, 140, 248}: "TRENDnet, Inc.", + [3]byte{60, 144, 102}: "SmartRG, Inc.", + [3]byte{60, 145, 43}: "Vexata Inc", + [3]byte{60, 145, 87}: "Yulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd", + [3]byte{60, 145, 116}: "ALONG COMMUNICATION TECHNOLOGY", + [3]byte{60, 146, 220}: "Octopod Technology Co. Ltd.", + [3]byte{60, 148, 213}: "Juniper Networks", + [3]byte{60, 149, 9}: "Liteon Technology Corporation", + [3]byte{60, 151, 14}: "Wistron InfoComm(Kunshan)Co.,Ltd.", + [3]byte{60, 151, 126}: "IPS Technology Limited", + [3]byte{60, 152, 191}: "Quest Controls, Inc.", + [3]byte{60, 153, 247}: "Lansentechnology AB", + [3]byte{60, 154, 119}: "Technicolor CH USA Inc.", + [3]byte{60, 159, 129}: "Shenzhen CATIC Bit Communications Technology Co.,Ltd", + [3]byte{60, 160, 103}: "Liteon Technology Corporation", + [3]byte{60, 161, 13}: "Samsung Electronics Co.,Ltd", + [3]byte{60, 163, 8}: "Texas Instruments", + [3]byte{60, 163, 21}: "Bless Information & Communications Co., Ltd", + [3]byte{60, 163, 26}: "Oilfind International LLC", + [3]byte{60, 163, 72}: "vivo Mobile Communication Co., Ltd.", + [3]byte{60, 165, 129}: "vivo Mobile Communication Co., Ltd.", + [3]byte{60, 166, 22}: "vivo Mobile Communication Co., Ltd.", + [3]byte{60, 167, 43}: "MRV Communications (Networks) LTD", + [3]byte{60, 168, 42}: "Hewlett Packard", + [3]byte{60, 169, 244}: "Intel Corporate", + [3]byte{60, 170, 63}: "iKey, Ltd.", + [3]byte{60, 171, 142}: "Apple, Inc.", + [3]byte{60, 174, 105}: "ESA Elektroschaltanlagen Grimma GmbH", + [3]byte{60, 177, 91}: "Avaya Inc", + [3]byte{60, 177, 127}: "Wattwatchers Pty Ld", + [3]byte{60, 182, 183}: "vivo Mobile Communication Co., Ltd.", + [3]byte{60, 183, 43}: "PLUMgrid Inc", + [3]byte{60, 183, 146}: "Hitachi Maxell, Ltd., Optronics Division", + [3]byte{60, 184, 122}: "Private", + [3]byte{60, 185, 166}: "Belden Deutschland GmbH", + [3]byte{60, 187, 115}: "Shenzhen Xinguodu Technology Co., Ltd.", + [3]byte{60, 187, 253}: "Samsung Electronics Co.,Ltd", + [3]byte{60, 189, 62}: "Beijing Xiaomi Electronics Co., Ltd.", + [3]byte{60, 189, 216}: "LG ELECTRONICS INC", + [3]byte{60, 190, 225}: "NIKON CORPORATION", + [3]byte{60, 192, 121}: "Shenzhen One-Nine Intelligent Electronic Science and Technology Co., Ltd", + [3]byte{60, 192, 198}: "d&b audiotechnik GmbH", + [3]byte{60, 193, 44}: "AES Corporation", + [3]byte{60, 193, 246}: "Melange Systems Pvt. Ltd.", + [3]byte{60, 194, 67}: "Nokia Corporation", + [3]byte{60, 194, 225}: "XINHUA CONTROL ENGINEERING CO.,LTD", + [3]byte{60, 201, 158}: "Huiyang Technology Co., Ltd", + [3]byte{60, 202, 135}: "Iders Incorporated", + [3]byte{60, 203, 124}: "TCT mobile ltd", + [3]byte{60, 205, 90}: "Technische Alternative GmbH", + [3]byte{60, 205, 147}: "LG ELECTRONICS INC", + [3]byte{60, 206, 21}: "Mercedes-Benz USA, LLC", + [3]byte{60, 206, 115}: "Cisco Systems, Inc", + [3]byte{60, 207, 91}: "ICOMM HK LIMITED", + [3]byte{60, 208, 248}: "Apple, Inc.", + [3]byte{60, 209, 110}: "Telepower Communication Co., Ltd", + [3]byte{60, 212, 214}: "WirelessWERX, Inc", + [3]byte{60, 215, 218}: "SK Mtek microelectronics(shenzhen)limited", + [3]byte{60, 217, 43}: "Hewlett Packard", + [3]byte{60, 217, 206}: "Eclipse WiFi", + [3]byte{60, 218, 42}: "zte corporation", + [3]byte{60, 221, 137}: "SOMO HOLDINGS & TECH. CO.,LTD.", + [3]byte{60, 223, 30}: "Cisco Systems, Inc", + [3]byte{60, 223, 169}: "ARRIS Group, Inc.", + [3]byte{60, 223, 189}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{60, 224, 114}: "Apple, Inc.", + [3]byte{60, 229, 166}: "Hangzhou H3C Technologies Co., Limited", + [3]byte{60, 229, 180}: "KIDASEN INDUSTRIA E COMERCIO DE ANTENAS LTDA", + [3]byte{60, 230, 36}: "LG Display", + [3]byte{60, 234, 79}: "2Wire Inc", + [3]byte{60, 234, 251}: "NSE AG", + [3]byte{60, 239, 140}: "Zhejiang Dahua Technology Co., Ltd.", + [3]byte{60, 243, 146}: "Virtualtek. Co. Ltd", + [3]byte{60, 245, 44}: "DSPECIALISTS GmbH", + [3]byte{60, 245, 145}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{60, 247, 42}: "Nokia Corporation", + [3]byte{60, 247, 72}: "Shenzhen Linsn Technology Development Co.,Ltd", + [3]byte{60, 247, 164}: "Samsung Electronics Co.,Ltd", + [3]byte{60, 248, 8}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{60, 248, 98}: "Intel Corporate", + [3]byte{60, 250, 67}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{60, 251, 150}: "Emcraft Systems LLC", + [3]byte{60, 253, 254}: "Intel Corporate", + [3]byte{64, 0, 224}: "Derek(Shaoguan)Limited", + [3]byte{64, 1, 7}: "Arista Corp", + [3]byte{64, 1, 122}: "Cisco Systems, Inc", + [3]byte{64, 1, 198}: "3COM EUROPE LTD", + [3]byte{64, 4, 12}: "A&T", + [3]byte{64, 7, 192}: "Railtec Systems GmbH", + [3]byte{64, 13, 16}: "ARRIS Group, Inc.", + [3]byte{64, 14, 103}: "Tremol Ltd.", + [3]byte{64, 14, 133}: "SAMSUNG ELECTRO-MECHANICS(THAILAND)", + [3]byte{64, 17, 220}: "Sonance", + [3]byte{64, 18, 228}: "Compass-EOS", + [3]byte{64, 19, 217}: "Global ES", + [3]byte{64, 21, 151}: "Protect America, Inc.", + [3]byte{64, 22, 59}: "Samsung Electronics Co.,Ltd", + [3]byte{64, 22, 126}: "ASUSTek COMPUTER INC.", + [3]byte{64, 22, 159}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{64, 22, 250}: "EKM Metering", + [3]byte{64, 24, 177}: "Aerohive Networks Inc.", + [3]byte{64, 24, 215}: "Smartronix, Inc.", + [3]byte{64, 27, 95}: "Weifang GoerTek Technology Co.,Ltd.", + [3]byte{64, 29, 89}: "Biometric Associates, LP", + [3]byte{64, 34, 237}: "Digital Projection Ltd", + [3]byte{64, 37, 194}: "Intel Corporate", + [3]byte{64, 39, 11}: "Mobileeco Co., Ltd", + [3]byte{64, 40, 20}: "RFI Engineering", + [3]byte{64, 43, 161}: "Sony Mobile Communications AB", + [3]byte{64, 44, 244}: "Universal Global Scientific Industrial Co., Ltd.", + [3]byte{64, 46, 40}: "MiXTelematics", + [3]byte{64, 48, 4}: "Apple, Inc.", + [3]byte{64, 48, 103}: "Conlog (Pty) Ltd", + [3]byte{64, 51, 26}: "Apple, Inc.", + [3]byte{64, 51, 108}: "Godrej & Boyce Mfg. co. ltd", + [3]byte{64, 55, 173}: "Macro Image Technology, Inc.", + [3]byte{64, 60, 252}: "Apple, Inc.", + [3]byte{64, 61, 236}: "HUMAX Co., Ltd.", + [3]byte{64, 63, 140}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{64, 64, 34}: "ZIV", + [3]byte{64, 64, 107}: "Icomera", + [3]byte{64, 64, 167}: "Sony Mobile Communications AB", + [3]byte{64, 66, 41}: "Layer3TV, Inc", + [3]byte{64, 69, 218}: "Spreadtrum Communications (Shanghai) Co., Ltd.", + [3]byte{64, 71, 106}: "AG Acquisition Corp. d.b.a. ASTRO Gaming", + [3]byte{64, 72, 253}: "IEEE Registration Authority", + [3]byte{64, 73, 15}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{64, 73, 138}: "Synapticon GmbH", + [3]byte{64, 74, 3}: "Zyxel Communications Corporation", + [3]byte{64, 74, 24}: "Addrek Smart Solutions", + [3]byte{64, 74, 212}: "Widex A/S", + [3]byte{64, 77, 127}: "Apple, Inc.", + [3]byte{64, 77, 142}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{64, 78, 54}: "HTC Corporation", + [3]byte{64, 78, 235}: "Higher Way Electronic Co., Ltd.", + [3]byte{64, 80, 224}: "Milton Security Group LLC", + [3]byte{64, 81, 108}: "Grandex International Corporation", + [3]byte{64, 82, 13}: "Pico Technology", + [3]byte{64, 84, 228}: "Wearsafe Labs Inc", + [3]byte{64, 85, 57}: "Cisco Systems, Inc", + [3]byte{64, 86, 12}: "In Home Displays Ltd", + [3]byte{64, 86, 45}: "Smartron India Pvt ltd", + [3]byte{64, 90, 155}: "ANOVO", + [3]byte{64, 92, 253}: "Dell Inc.", + [3]byte{64, 93, 130}: "NETGEAR", + [3]byte{64, 94, 225}: "Shenzhen H&T Intelligent Control Co.,Ltd.", + [3]byte{64, 95, 190}: "RIM", + [3]byte{64, 95, 194}: "Texas Instruments", + [3]byte{64, 96, 90}: "Hawkeye Tech Co. Ltd", + [3]byte{64, 97, 134}: "MICRO-STAR INT'L CO.,LTD", + [3]byte{64, 97, 142}: "Stella-Green Co", + [3]byte{64, 98, 182}: "Tele system communication", + [3]byte{64, 101, 163}: "Sagemcom Broadband SAS", + [3]byte{64, 102, 122}: "mediola - connected living AG", + [3]byte{64, 104, 38}: "Thales UK Limited", + [3]byte{64, 106, 142}: "Hangzhou Puwell OE Tech Ltd.", + [3]byte{64, 106, 171}: "RIM", + [3]byte{64, 108, 143}: "Apple, Inc.", + [3]byte{64, 111, 42}: "BlackBerry RTS", + [3]byte{64, 112, 9}: "ARRIS Group, Inc.", + [3]byte{64, 112, 74}: "Power Idea Technology Limited", + [3]byte{64, 112, 116}: "Life Technology (China) Co., Ltd", + [3]byte{64, 113, 131}: "Juniper Networks", + [3]byte{64, 116, 150}: "aFUN TECHNOLOGY INC.", + [3]byte{64, 120, 106}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{64, 120, 117}: "IMBEL - Industria de Material Belico do Brasil", + [3]byte{64, 122, 128}: "Nokia Corporation", + [3]byte{64, 123, 27}: "Mettle Networks Inc.", + [3]byte{64, 124, 125}: "Nokia", + [3]byte{64, 125, 15}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{64, 127, 224}: "Glory Star Technics (ShenZhen) Limited", + [3]byte{64, 130, 86}: "Continental Automotive GmbH", + [3]byte{64, 131, 222}: "Zebra Technologies Inc", + [3]byte{64, 132, 147}: "Clavister AB", + [3]byte{64, 134, 46}: "JDM MOBILE INTERNET SOLUTION CO., LTD.", + [3]byte{64, 136, 5}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{64, 136, 224}: "Beijing Ereneben Information Technology Limited Shenzhen Branch", + [3]byte{64, 138, 154}: "TITENG CO., Ltd.", + [3]byte{64, 139, 7}: "Actiontec Electronics, Inc", + [3]byte{64, 139, 246}: "Shenzhen TCL New Technology Co., Ltd", + [3]byte{64, 141, 92}: "GIGA-BYTE TECHNOLOGY CO.,LTD.", + [3]byte{64, 149, 88}: "Aisino Corporation", + [3]byte{64, 149, 189}: "NTmore.Co.,Ltd", + [3]byte{64, 151, 209}: "BK Electronics cc", + [3]byte{64, 152, 76}: "Casacom Solutions AG", + [3]byte{64, 152, 78}: "Texas Instruments", + [3]byte{64, 152, 123}: "Aisino Corporation", + [3]byte{64, 153, 34}: "AzureWave Technology Inc.", + [3]byte{64, 155, 13}: "Shenzhen Yourf Kwan Industrial Co., Ltd", + [3]byte{64, 155, 205}: "D-Link International", + [3]byte{64, 156, 40}: "Apple, Inc.", + [3]byte{64, 159, 56}: "AzureWave Technology Inc.", + [3]byte{64, 159, 135}: "Jide Technology (Hong Kong) Limited", + [3]byte{64, 159, 199}: "BAEKCHUN I&C Co., Ltd.", + [3]byte{64, 163, 204}: "Intel Corporate", + [3]byte{64, 165, 239}: "Shenzhen Four Seas Global Link Network Technology Co., Ltd.", + [3]byte{64, 166, 119}: "Juniper Networks", + [3]byte{64, 166, 164}: "PassivSystems Ltd", + [3]byte{64, 166, 217}: "Apple, Inc.", + [3]byte{64, 166, 232}: "Cisco Systems, Inc", + [3]byte{64, 168, 240}: "Hewlett Packard", + [3]byte{64, 169, 63}: "Private", + [3]byte{64, 172, 141}: "Data Management, Inc.", + [3]byte{64, 176, 52}: "Hewlett Packard", + [3]byte{64, 176, 250}: "LG Electronics (Mobile Communications)", + [3]byte{64, 178, 200}: "Nortel Networks", + [3]byte{64, 179, 149}: "Apple, Inc.", + [3]byte{64, 179, 205}: "Chiyoda Electronics Co.,Ltd.", + [3]byte{64, 179, 252}: "Logital Co. Limited", + [3]byte{64, 180, 205}: "Amazon Technologies Inc.", + [3]byte{64, 180, 240}: "Juniper Networks", + [3]byte{64, 182, 136}: "LEGIC Identsystems AG", + [3]byte{64, 182, 177}: "SUNGSAM CO,.Ltd", + [3]byte{64, 183, 243}: "ARRIS Group, Inc.", + [3]byte{64, 184, 55}: "Sony Mobile Communications AB", + [3]byte{64, 184, 154}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{64, 185, 60}: "Hewlett Packard Enterprise", + [3]byte{64, 186, 97}: "ARIMA Communications Corp.", + [3]byte{64, 188, 115}: "Cronoplast S.L.", + [3]byte{64, 188, 139}: "itelio GmbH", + [3]byte{64, 189, 158}: "Physio-Control, Inc", + [3]byte{64, 191, 23}: "Digistar Telecom. SA", + [3]byte{64, 194, 69}: "Shenzhen Hexicom Technology Co., Ltd.", + [3]byte{64, 196, 214}: "ChongQing Camyu Technology Development Co.,Ltd.", + [3]byte{64, 198, 42}: "Shanghai Jing Ren Electronic Technology Co., Ltd.", + [3]byte{64, 199, 41}: "Sagemcom Broadband SAS", + [3]byte{64, 199, 201}: "Naviit Inc.", + [3]byte{64, 200, 203}: "AM Telecom co., Ltd.", + [3]byte{64, 203, 168}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{64, 205, 58}: "Z3 Technology", + [3]byte{64, 206, 36}: "Cisco Systems, Inc", + [3]byte{64, 210, 138}: "Nintendo Co., Ltd.", + [3]byte{64, 211, 45}: "Apple, Inc.", + [3]byte{64, 211, 87}: "Ison Technology Co., Ltd.", + [3]byte{64, 211, 174}: "Samsung Electronics Co.,Ltd", + [3]byte{64, 212, 14}: "Biodata Ltd", + [3]byte{64, 213, 89}: "MICRO S.E.R.I.", + [3]byte{64, 214, 60}: "Equitech Industrial(DongGuan)Co.,Ltd", + [3]byte{64, 216, 85}: "IEEE Registration Authority", + [3]byte{64, 226, 48}: "AzureWave Technology Inc.", + [3]byte{64, 227, 214}: "Aruba Networks", + [3]byte{64, 231, 48}: "DEY Storage Systems, Inc.", + [3]byte{64, 231, 147}: "Shenzhen Siviton Technology Co.,Ltd", + [3]byte{64, 234, 206}: "FOUNDER BROADBAND NETWORK SERVICE CO.,LTD", + [3]byte{64, 236, 248}: "Siemens AG", + [3]byte{64, 237, 152}: "IEEE Registration Authority", + [3]byte{64, 239, 76}: "Fihonest communication co.,Ltd", + [3]byte{64, 240, 47}: "Liteon Technology Corporation", + [3]byte{64, 241, 76}: "ISE Europe SPRL", + [3]byte{64, 242, 1}: "Sagemcom Broadband SAS", + [3]byte{64, 242, 233}: "IBM", + [3]byte{64, 243, 8}: "Murata Manufacturing Co., Ltd.", + [3]byte{64, 243, 133}: "IEEE Registration Authority", + [3]byte{64, 244, 7}: "Nintendo Co., Ltd.", + [3]byte{64, 244, 19}: "Rubezh", + [3]byte{64, 244, 32}: "SICHUAN TIANYI COMHEART TELECOMCO.,LTD", + [3]byte{64, 244, 236}: "Cisco Systems, Inc", + [3]byte{64, 245, 46}: "Leica Microsystems (Schweiz) AG", + [3]byte{64, 250, 127}: "Preh Car Connect GmbH", + [3]byte{64, 252, 137}: "ARRIS Group, Inc.", + [3]byte{64, 254, 13}: "MAXIO", + [3]byte{68, 0, 16}: "Apple, Inc.", + [3]byte{68, 3, 44}: "Intel Corporate", + [3]byte{68, 3, 167}: "Cisco Systems, Inc", + [3]byte{68, 4, 68}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{68, 9, 184}: "Salcomp (Shenzhen) CO., LTD.", + [3]byte{68, 12, 253}: "NetMan Co., Ltd.", + [3]byte{68, 17, 2}: "EDMI Europe Ltd", + [3]byte{68, 17, 194}: "Telegartner Karl Gartner GmbH", + [3]byte{68, 19, 25}: "WKK TECHNOLOGY LTD.", + [3]byte{68, 20, 65}: "AudioControl Inc.", + [3]byte{68, 24, 79}: "Fitview", + [3]byte{68, 25, 182}: "Hangzhou Hikvision Digital Technology Co.,Ltd.", + [3]byte{68, 28, 168}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{68, 30, 145}: "ARVIDA Intelligent Electronics Technology Co.,Ltd.", + [3]byte{68, 30, 161}: "Hewlett Packard", + [3]byte{68, 35, 170}: "Farmage Co., Ltd.", + [3]byte{68, 37, 187}: "Bamboo Entertainment Corporation", + [3]byte{68, 41, 56}: "NietZsche enterprise Co.Ltd.", + [3]byte{68, 42, 96}: "Apple, Inc.", + [3]byte{68, 42, 255}: "E3 Technology, Inc.", + [3]byte{68, 43, 3}: "Cisco Systems, Inc", + [3]byte{68, 44, 5}: "AMPAK Technology, Inc.", + [3]byte{68, 49, 146}: "Hewlett Packard", + [3]byte{68, 50, 42}: "Avaya Inc", + [3]byte{68, 50, 200}: "Technicolor CH USA Inc.", + [3]byte{68, 51, 76}: "Shenzhen Bilian electronic CO.,LTD", + [3]byte{68, 52, 143}: "MXT INDUSTRIAL LTDA", + [3]byte{68, 53, 111}: "Neterix", + [3]byte{68, 55, 8}: "MRV Comunications", + [3]byte{68, 55, 25}: "2 Save Energy Ltd", + [3]byte{68, 55, 111}: "Young Electric Sign Co", + [3]byte{68, 55, 230}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{68, 56, 57}: "Cumulus Networks, inc", + [3]byte{68, 57, 196}: "Universal Global Scientific Industrial Co., Ltd.", + [3]byte{68, 60, 156}: "Pintsch Tiefenbach GmbH", + [3]byte{68, 61, 33}: "Nuvolt", + [3]byte{68, 62, 178}: "DEOTRON Co., LTD.", + [3]byte{68, 68, 80}: "OttoQ", + [3]byte{68, 72, 145}: "HDMI Licensing, LLC", + [3]byte{68, 72, 193}: "Hewlett Packard Enterprise", + [3]byte{68, 74, 101}: "Silverflare Ltd.", + [3]byte{68, 74, 176}: "Zhejiang Moorgen Intelligence Technology Co., Ltd", + [3]byte{68, 76, 12}: "Apple, Inc.", + [3]byte{68, 76, 168}: "Arista Networks", + [3]byte{68, 78, 26}: "Samsung Electronics Co.,Ltd", + [3]byte{68, 78, 109}: "AVM Audiovisuelles Marketing und Computersysteme GmbH", + [3]byte{68, 79, 94}: "Pan Studios Co.,Ltd.", + [3]byte{68, 81, 219}: "Raytheon BBN Technologies", + [3]byte{68, 84, 192}: "Thompson Aerospace", + [3]byte{68, 85, 177}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{68, 86, 141}: "PNC Technologies Co., Ltd.", + [3]byte{68, 86, 183}: "Spawn Labs, Inc", + [3]byte{68, 88, 41}: "Cisco SPVTG", + [3]byte{68, 89, 159}: "Criticare Systems, Inc", + [3]byte{68, 94, 205}: "Razer Inc", + [3]byte{68, 94, 243}: "Tonalite Holding B.V.", + [3]byte{68, 95, 122}: "Shihlin Electric & Engineering Corp.", + [3]byte{68, 95, 140}: "Intercel Group Limited", + [3]byte{68, 97, 50}: "ecobee inc", + [3]byte{68, 97, 156}: "FONsystem co. ltd.", + [3]byte{68, 98, 70}: "Comat AG", + [3]byte{68, 101, 13}: "Amazon Technologies Inc.", + [3]byte{68, 101, 106}: "Mega Video Electronic(HK) Industry Co., Ltd", + [3]byte{68, 102, 110}: "IP-LINE", + [3]byte{68, 103, 85}: "Orbit Irrigation", + [3]byte{68, 104, 171}: "JUIN COMPANY, LIMITED", + [3]byte{68, 106, 46}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{68, 106, 183}: "ARRIS Group, Inc.", + [3]byte{68, 108, 36}: "Reallin Electronic Co.,Ltd", + [3]byte{68, 109, 87}: "Liteon Technology Corporation", + [3]byte{68, 109, 108}: "Samsung Electronics Co.,Ltd", + [3]byte{68, 110, 229}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{68, 112, 11}: "IFFU", + [3]byte{68, 112, 152}: "MING HONG TECHNOLOGY (SHEN ZHEN) LIMITED", + [3]byte{68, 115, 214}: "Logitech", + [3]byte{68, 116, 108}: "Sony Mobile Communications AB", + [3]byte{68, 120, 62}: "Samsung Electronics Co.,Ltd", + [3]byte{68, 123, 187}: "Shenzhen YOUHUA Technology Co., Ltd", + [3]byte{68, 123, 196}: "DualShine Technology(SZ)Co.,Ltd", + [3]byte{68, 124, 127}: "Innolight Technology Corporation", + [3]byte{68, 125, 165}: "VTION INFORMATION TECHNOLOGY (FUJIAN) CO.,LTD", + [3]byte{68, 126, 118}: "Trek Technology (S) Pte Ltd", + [3]byte{68, 126, 149}: "Alpha and Omega, Inc", + [3]byte{68, 127, 119}: "Connected Home", + [3]byte{68, 128, 235}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{68, 130, 229}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{68, 131, 18}: "Star-Net", + [3]byte{68, 133, 0}: "Intel Corporate", + [3]byte{68, 134, 193}: "Siemens Low Voltage & Products", + [3]byte{68, 135, 35}: "HOYA SERVICE CORPORATION", + [3]byte{68, 135, 252}: "Elitegroup Computer Systems Co.,Ltd.", + [3]byte{68, 136, 203}: "Camco Technologies NV", + [3]byte{68, 138, 91}: "Micro-Star INT'L CO., LTD.", + [3]byte{68, 140, 82}: "KTIS CO., Ltd", + [3]byte{68, 142, 18}: "DT Research, Inc.", + [3]byte{68, 142, 129}: "VIG", + [3]byte{68, 143, 23}: "Samsung Electronics Co., Ltd. ARTIK", + [3]byte{68, 145, 96}: "Murata Manufacturing Co., Ltd.", + [3]byte{68, 145, 219}: "Shanghai Huaqin Telecom Technology Co.,Ltd", + [3]byte{68, 148, 252}: "NETGEAR", + [3]byte{68, 149, 250}: "Qingdao Santong Digital Technology Co.Ltd", + [3]byte{68, 150, 43}: "Aidon Oy", + [3]byte{68, 151, 90}: "SHENZHEN FAST TECHNOLOGIES CO.,LTD", + [3]byte{68, 155, 120}: "The Now Factory", + [3]byte{68, 156, 181}: "Alcomp, Inc", + [3]byte{68, 159, 127}: "DataCore Software Corporation", + [3]byte{68, 164, 45}: "TCT mobile ltd", + [3]byte{68, 166, 137}: "PROMAX ELECTRONICA SA", + [3]byte{68, 166, 229}: "THINKING TECHNOLOGY CO.,LTD", + [3]byte{68, 167, 207}: "Murata Manufacturing Co., Ltd.", + [3]byte{68, 168, 66}: "Dell Inc.", + [3]byte{68, 168, 194}: "SEWOO TECH CO., LTD", + [3]byte{68, 170, 39}: "udworks Co., Ltd.", + [3]byte{68, 170, 80}: "Juniper Networks", + [3]byte{68, 170, 232}: "Nanotec Electronic GmbH & Co. KG", + [3]byte{68, 170, 245}: "ARRIS Group, Inc.", + [3]byte{68, 173, 25}: "XINGFEI (H.K)LIMITED", + [3]byte{68, 173, 217}: "Cisco Systems, Inc", + [3]byte{68, 179, 45}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{68, 179, 130}: "Kuang-chi Institute of Advanced Technology", + [3]byte{68, 180, 18}: "SIUS AG", + [3]byte{68, 186, 70}: "SICHUAN TIANYI COMHEART TELECOMCO.,LTD", + [3]byte{68, 191, 227}: "Shenzhen Longtech Electronics Co.,Ltd", + [3]byte{68, 193, 92}: "Texas Instruments", + [3]byte{68, 194, 51}: "Guangzhou Comet Technology Development Co.Ltd", + [3]byte{68, 195, 6}: "SIFROM Inc.", + [3]byte{68, 195, 70}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{68, 195, 155}: "OOO RUBEZH NPO", + [3]byte{68, 196, 169}: "Opticom Communication, LLC", + [3]byte{68, 197, 111}: "NGN Easy Satfinder (Tianjin) Electronic Co., Ltd", + [3]byte{68, 198, 155}: "Wuhan Feng Tian Information Network CO.,LTD", + [3]byte{68, 200, 116}: "China Mobile Group Device Co.,Ltd.", + [3]byte{68, 201, 162}: "Greenwald Industries", + [3]byte{68, 205, 14}: "FLEXTRONICS MANUFACTURING(ZHUHAI)CO.,LTD.", + [3]byte{68, 206, 125}: "SFR", + [3]byte{68, 209, 94}: "Shanghai Kingto Information Technology Ltd", + [3]byte{68, 209, 250}: "Shenzhen Yunlink Technology Co., Ltd", + [3]byte{68, 210, 68}: "Seiko Epson Corporation", + [3]byte{68, 210, 202}: "Anvia TV Oy", + [3]byte{68, 211, 202}: "Cisco Systems, Inc", + [3]byte{68, 212, 55}: "Inteno Broadband Technology AB", + [3]byte{68, 212, 224}: "Sony Mobile Communications AB", + [3]byte{68, 213, 165}: "AddOn Computer", + [3]byte{68, 214, 61}: "Talari Networks", + [3]byte{68, 214, 225}: "Snuza International Pty. Ltd.", + [3]byte{68, 216, 50}: "AzureWave Technology Inc.", + [3]byte{68, 216, 132}: "Apple, Inc.", + [3]byte{68, 217, 231}: "Ubiquiti Networks Inc.", + [3]byte{68, 220, 145}: "PLANEX COMMUNICATIONS INC.", + [3]byte{68, 220, 203}: "SEMINDIA SYSTEMS PVT LTD", + [3]byte{68, 224, 142}: "Cisco SPVTG", + [3]byte{68, 225, 55}: "ARRIS Group, Inc.", + [3]byte{68, 228, 154}: "OMNITRONICS PTY LTD", + [3]byte{68, 228, 217}: "Cisco Systems, Inc", + [3]byte{68, 232, 165}: "Myreka Technologies Sdn. Bhd.", + [3]byte{68, 233, 221}: "Sagemcom Broadband SAS", + [3]byte{68, 234, 75}: "Actlas Inc.", + [3]byte{68, 234, 216}: "Texas Instruments", + [3]byte{68, 237, 87}: "Longicorn, inc.", + [3]byte{68, 238, 2}: "MTI Ltd.", + [3]byte{68, 238, 48}: "Budelmann Elektronik GmbH", + [3]byte{68, 240, 52}: "Kaonmedia CO., LTD.", + [3]byte{68, 244, 54}: "zte corporation", + [3]byte{68, 244, 89}: "Samsung Electronics Co.,Ltd", + [3]byte{68, 244, 119}: "Juniper Networks", + [3]byte{68, 248, 73}: "Union Pacific Railroad", + [3]byte{68, 251, 66}: "Apple, Inc.", + [3]byte{68, 253, 163}: "Everysight LTD.", + [3]byte{72, 0, 49}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{72, 0, 51}: "Technicolor CH USA Inc.", + [3]byte{72, 2, 42}: "B-Link Electronic Limited", + [3]byte{72, 3, 98}: "DESAY ELECTRONICS(HUIZHOU)CO.,LTD", + [3]byte{72, 6, 106}: "Tempered Networks, Inc.", + [3]byte{72, 12, 73}: "NAKAYO Inc", + [3]byte{72, 14, 236}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{72, 15, 207}: "Hewlett Packard", + [3]byte{72, 16, 99}: "NTT Innovation Institute, Inc.", + [3]byte{72, 18, 73}: "Luxcom Technologies Inc.", + [3]byte{72, 19, 126}: "Samsung Electronics Co.,Ltd", + [3]byte{72, 19, 243}: "BBK EDUCATIONAL ELECTRONICS CORP.,LTD.", + [3]byte{72, 23, 76}: "MicroPower technologies", + [3]byte{72, 24, 66}: "Shanghai Winaas Co. Equipment Co. Ltd.", + [3]byte{72, 26, 132}: "Pointer Telocation Ltd", + [3]byte{72, 27, 210}: "Intron Scientific co., ltd.", + [3]byte{72, 29, 112}: "Cisco SPVTG", + [3]byte{72, 38, 232}: "Tek-Air Systems, Inc.", + [3]byte{72, 39, 234}: "Samsung Electronics Co.,Ltd", + [3]byte{72, 40, 47}: "zte corporation", + [3]byte{72, 44, 234}: "Motorola Inc Business Light Radios", + [3]byte{72, 51, 221}: "ZENNIO AVANCE Y TECNOLOGIA, S.L.", + [3]byte{72, 52, 61}: "IEP GmbH", + [3]byte{72, 54, 95}: "Wintecronics Ltd.", + [3]byte{72, 57, 116}: "Proware Technologies Co., Ltd.", + [3]byte{72, 59, 56}: "Apple, Inc.", + [3]byte{72, 60, 12}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{72, 61, 50}: "Syscor Controls & Automation", + [3]byte{72, 67, 90}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{72, 67, 124}: "Apple, Inc.", + [3]byte{72, 68, 135}: "Cisco SPVTG", + [3]byte{72, 68, 247}: "Samsung Electronics Co.,Ltd", + [3]byte{72, 69, 32}: "Intel Corporate", + [3]byte{72, 70, 241}: "Uros Oy", + [3]byte{72, 70, 251}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{72, 73, 199}: "Samsung Electronics Co.,Ltd", + [3]byte{72, 75, 170}: "Apple, Inc.", + [3]byte{72, 77, 126}: "Dell Inc.", + [3]byte{72, 80, 115}: "Microsoft Corporation", + [3]byte{72, 81, 183}: "Intel Corporate", + [3]byte{72, 82, 97}: "SOREEL", + [3]byte{72, 84, 21}: "NET RULES TECNOLOGIA EIRELI", + [3]byte{72, 85, 92}: "Wu Qi Technologies,Inc.", + [3]byte{72, 85, 95}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{72, 87, 221}: "Facebook Inc", + [3]byte{72, 89, 41}: "LG Electronics (Mobile Communications)", + [3]byte{72, 89, 164}: "zte corporation", + [3]byte{72, 90, 63}: "WISOL", + [3]byte{72, 90, 182}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{72, 91, 57}: "ASUSTek COMPUTER INC.", + [3]byte{72, 93, 54}: "Verizon", + [3]byte{72, 93, 96}: "AzureWave Technology Inc.", + [3]byte{72, 96, 188}: "Apple, Inc.", + [3]byte{72, 97, 163}: "Concern Axion JSC", + [3]byte{72, 98, 118}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{72, 101, 238}: "IEEE Registration Authority", + [3]byte{72, 107, 44}: "BBK EDUCATIONAL ELECTRONICS CORP.,LTD.", + [3]byte{72, 107, 145}: "Fleetwood Group Inc.", + [3]byte{72, 109, 187}: "Vestel Elektronik San ve Tic. A.Ş.", + [3]byte{72, 110, 115}: "Pica8, Inc.", + [3]byte{72, 110, 251}: "Davit System Technology Co., Ltd.", + [3]byte{72, 111, 210}: "StorSimple Inc", + [3]byte{72, 113, 25}: "SGB GROUP LTD.", + [3]byte{72, 116, 110}: "Apple, Inc.", + [3]byte{72, 118, 4}: "Private", + [3]byte{72, 122, 85}: "ALE International", + [3]byte{72, 122, 218}: "Hangzhou H3C Technologies Co., Limited", + [3]byte{72, 123, 107}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{72, 125, 46}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{72, 130, 68}: "Life Fitness / Div. of Brunswick", + [3]byte{72, 130, 242}: "Appel Elektronik GmbH", + [3]byte{72, 131, 199}: "Sagemcom Broadband SAS", + [3]byte{72, 134, 232}: "Microsoft Corporation", + [3]byte{72, 136, 3}: "ManTechnology Inc.", + [3]byte{72, 136, 202}: "Motorola (Wuhan) Mobility Technologies Communication Co., Ltd.", + [3]byte{72, 138, 210}: "SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.", + [3]byte{72, 141, 54}: "Arcadyan Corporation", + [3]byte{72, 142, 66}: "DIGALOG GmbH", + [3]byte{72, 142, 239}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{72, 145, 83}: "Weinmann Geräte für Medizin GmbH + Co. KG", + [3]byte{72, 145, 246}: "Shenzhen Reach software technology CO.,LTD", + [3]byte{72, 154, 66}: "Technomate Ltd", + [3]byte{72, 155, 226}: "SCI Innovations Ltd", + [3]byte{72, 157, 24}: "Flashbay Limited", + [3]byte{72, 157, 36}: "BlackBerry RTS", + [3]byte{72, 161, 149}: "Apple, Inc.", + [3]byte{72, 162, 45}: "Shenzhen Huaxuchang Telecom Technology Co.,Ltd", + [3]byte{72, 162, 183}: "Kodofon JSC", + [3]byte{72, 163, 128}: "Gionee Communication Equipment Co.,Ltd.", + [3]byte{72, 166, 210}: "GJsun Optical Science and Tech Co.,Ltd.", + [3]byte{72, 167, 78}: "zte corporation", + [3]byte{72, 169, 210}: "Wistron Neweb Corporation", + [3]byte{72, 170, 93}: "Store Electronic Systems", + [3]byte{72, 173, 8}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{72, 178, 83}: "Marketaxess Corporation", + [3]byte{72, 181, 167}: "Glory Horse Industries Ltd.", + [3]byte{72, 182, 32}: "ROLI Ltd.", + [3]byte{72, 184, 222}: "HOMEWINS TECHNOLOGY CO.,LTD.", + [3]byte{72, 185, 119}: "PulseOn Oy", + [3]byte{72, 185, 194}: "Teletics Inc.", + [3]byte{72, 186, 78}: "Hewlett Packard", + [3]byte{72, 188, 166}: "\u200bASUNG TECHNO CO.,Ltd", + [3]byte{72, 190, 45}: "Symanitron", + [3]byte{72, 191, 107}: "Apple, Inc.", + [3]byte{72, 191, 116}: "Baicells Technologies Co.,LTD", + [3]byte{72, 192, 73}: "Broad Telecom SA", + [3]byte{72, 192, 147}: "Xirrus, Inc.", + [3]byte{72, 193, 172}: "PLANTRONICS, INC.", + [3]byte{72, 197, 141}: "Lear Corporation GmbH", + [3]byte{72, 198, 99}: "GTO Access Systems LLC", + [3]byte{72, 200, 98}: "Simo Wireless,Inc.", + [3]byte{72, 200, 182}: "SysTec GmbH", + [3]byte{72, 203, 110}: "Cello Electronics (UK) Ltd", + [3]byte{72, 208, 207}: "Universal Electronics, Inc.", + [3]byte{72, 209, 142}: "Metis Communication Co.,Ltd", + [3]byte{72, 210, 36}: "Liteon Technology Corporation", + [3]byte{72, 211, 67}: "ARRIS Group, Inc.", + [3]byte{72, 211, 93}: "Private", + [3]byte{72, 213, 57}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{72, 213, 76}: "Jeda Networks", + [3]byte{72, 214, 213}: "Google, Inc.", + [3]byte{72, 215, 5}: "Apple, Inc.", + [3]byte{72, 215, 255}: "BLANKOM Antennentechnik GmbH", + [3]byte{72, 216, 85}: "Telvent", + [3]byte{72, 216, 254}: "ClarIDy Solutions, Inc.", + [3]byte{72, 218, 150}: "Eddy Smart Home Solutions Inc.", + [3]byte{72, 219, 80}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{72, 220, 251}: "Nokia Corporation", + [3]byte{72, 223, 28}: "Wuhan NEC Fibre Optic Communications industry Co. Ltd", + [3]byte{72, 223, 55}: "Hewlett Packard Enterprise", + [3]byte{72, 225, 175}: "Vity", + [3]byte{72, 226, 68}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{72, 233, 241}: "Apple, Inc.", + [3]byte{72, 234, 99}: "Zhejiang Uniview Technologies Co., Ltd.", + [3]byte{72, 235, 48}: "ETERNA TECHNOLOGY, INC.", + [3]byte{72, 236, 91}: "Nokia", + [3]byte{72, 237, 128}: "daesung eltec", + [3]byte{72, 238, 7}: "Silver Palm Technologies LLC", + [3]byte{72, 238, 12}: "D-Link International", + [3]byte{72, 238, 134}: "UTStarcom (China) Co.,Ltd", + [3]byte{72, 240, 123}: "ALPS ELECTRIC CO.,LTD.", + [3]byte{72, 242, 48}: "Ubizcore Co.,LTD", + [3]byte{72, 243, 23}: "Private", + [3]byte{72, 244, 125}: "TechVision Holding Internation Limited", + [3]byte{72, 247, 192}: "Technicolor CH USA Inc.", + [3]byte{72, 247, 241}: "Nokia", + [3]byte{72, 248, 179}: "Cisco-Linksys, LLC", + [3]byte{72, 248, 225}: "Nokia", + [3]byte{72, 249, 37}: "Maestronic", + [3]byte{72, 249, 124}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{72, 252, 182}: "LAVA INTERNATIONAL(H.K) LIMITED", + [3]byte{72, 252, 184}: "Woodstream Corporation", + [3]byte{72, 253, 142}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{72, 254, 234}: "HOMA B.V.", + [3]byte{76, 0, 130}: "Cisco Systems, Inc", + [3]byte{76, 2, 46}: "CMR KOREA CO., LTD", + [3]byte{76, 2, 137}: "LEX COMPUTECH CO., LTD", + [3]byte{76, 6, 138}: "Basler Electric Company", + [3]byte{76, 7, 201}: "COMPUTER OFFICE Co.,Ltd.", + [3]byte{76, 9, 180}: "zte corporation", + [3]byte{76, 9, 212}: "Arcadyan Technology Corporation", + [3]byte{76, 11, 58}: "TCT mobile ltd", + [3]byte{76, 11, 190}: "Microsoft", + [3]byte{76, 13, 238}: "JABIL CIRCUIT (SHANGHAI) LTD.", + [3]byte{76, 15, 110}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{76, 15, 199}: "Earda Electronics Co.,Ltd", + [3]byte{76, 17, 191}: "Zhejiang Dahua Technology Co., Ltd.", + [3]byte{76, 19, 101}: "Emplus Technologies", + [3]byte{76, 20, 128}: "NOREGON SYSTEMS, INC", + [3]byte{76, 20, 163}: "TCL Technoly Electronics (Huizhou) Co., Ltd.", + [3]byte{76, 22, 148}: "shenzhen sibituo Technology Co., Ltd", + [3]byte{76, 22, 241}: "zte corporation", + [3]byte{76, 22, 252}: "Juniper Networks", + [3]byte{76, 23, 235}: "Sagemcom Broadband SAS", + [3]byte{76, 24, 154}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{76, 26, 58}: "PRIMA Research And Production Enterprise Ltd.", + [3]byte{76, 26, 61}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{76, 26, 149}: "Novakon Co., Ltd.", + [3]byte{76, 31, 204}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{76, 33, 208}: "Sony Mobile Communications AB", + [3]byte{76, 34, 88}: "cozybit, Inc.", + [3]byte{76, 37, 120}: "Nokia Corporation", + [3]byte{76, 38, 231}: "Welgate Co., Ltd.", + [3]byte{76, 44, 128}: "Beijing Skyway Technologies Co.,Ltd", + [3]byte{76, 44, 131}: "Zhejiang KaNong Network Technology Co.,Ltd.", + [3]byte{76, 47, 157}: "ICM Controls", + [3]byte{76, 48, 137}: "Thales Transportation Systems GmbH", + [3]byte{76, 50, 45}: "TELEDATA NETWORKS", + [3]byte{76, 50, 117}: "Apple, Inc.", + [3]byte{76, 50, 217}: "M Rutty Holdings Pty. Ltd.", + [3]byte{76, 51, 78}: "HIGHTECH", + [3]byte{76, 52, 136}: "Intel Corporate", + [3]byte{76, 56, 213}: "MITAC COMPUTING TECHNOLOGY CORPORATION", + [3]byte{76, 56, 216}: "ARRIS Group, Inc.", + [3]byte{76, 57, 9}: "HPL Electric & Power Private Limited", + [3]byte{76, 57, 16}: "Newtek Electronics co., Ltd.", + [3]byte{76, 59, 116}: "VOGTEC(H.K.) Co., Ltd", + [3]byte{76, 60, 22}: "Samsung Electronics Co.,Ltd", + [3]byte{76, 72, 218}: "Beijing Autelan Technology Co.,Ltd", + [3]byte{76, 73, 227}: "Xiaomi Communications Co Ltd", + [3]byte{76, 75, 104}: "Mobile Device, Inc.", + [3]byte{76, 78, 3}: "TCT mobile ltd", + [3]byte{76, 78, 53}: "Cisco Systems, Inc", + [3]byte{76, 82, 98}: "Fujitsu Technology Solutions GmbH", + [3]byte{76, 84, 39}: "Linepro Sp. z o.o.", + [3]byte{76, 84, 153}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{76, 85, 133}: "Hamilton Systems", + [3]byte{76, 85, 184}: "Turkcell Teknoloji", + [3]byte{76, 85, 204}: "Zentri Pty Ltd", + [3]byte{76, 87, 202}: "Apple, Inc.", + [3]byte{76, 93, 205}: "Oy Finnish Electric Vehicle Technologies Ltd", + [3]byte{76, 94, 12}: "Routerboard.com", + [3]byte{76, 95, 210}: "Alcatel-Lucent", + [3]byte{76, 96, 213}: "airPointe of New Hampshire", + [3]byte{76, 96, 222}: "NETGEAR", + [3]byte{76, 98, 85}: "SANMINA-SCI SYSTEM DE MEXICO S.A. DE C.V.", + [3]byte{76, 99, 235}: "Application Solutions (Electronics and Vision) Ltd", + [3]byte{76, 100, 217}: "Guangdong Leawin Group Co., Ltd", + [3]byte{76, 101, 168}: "IEEE Registration Authority", + [3]byte{76, 102, 65}: "SAMSUNG ELECTRO-MECHANICS(THAILAND)", + [3]byte{76, 110, 110}: "Comnect Technology CO.,LTD", + [3]byte{76, 114, 185}: "PEGATRON CORPORATION", + [3]byte{76, 115, 103}: "Genius Bytes Software Solutions GmbH", + [3]byte{76, 115, 165}: "KOVE", + [3]byte{76, 116, 3}: "BQ", + [3]byte{76, 116, 135}: "Leader Phone Communication Technology Co., Ltd.", + [3]byte{76, 116, 191}: "Apple, Inc.", + [3]byte{76, 118, 37}: "Dell Inc.", + [3]byte{76, 119, 79}: "Embedded Wireless Labs", + [3]byte{76, 120, 114}: "Cav. Uff. Giacomo Cimberio S.p.A.", + [3]byte{76, 120, 151}: "Arrowhead Alarm Products Ltd", + [3]byte{76, 121, 186}: "Intel Corporate", + [3]byte{76, 124, 95}: "Apple, Inc.", + [3]byte{76, 127, 98}: "Nokia Corporation", + [3]byte{76, 128, 79}: "Armstrong Monitoring Corp", + [3]byte{76, 128, 147}: "Intel Corporate", + [3]byte{76, 129, 32}: "Taicang T&W Electronics", + [3]byte{76, 130, 207}: "Echostar Technologies Corp", + [3]byte{76, 131, 222}: "Cisco SPVTG", + [3]byte{76, 139, 48}: "Actiontec Electronics, Inc", + [3]byte{76, 139, 85}: "Grupo Digicon", + [3]byte{76, 139, 239}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{76, 141, 121}: "Apple, Inc.", + [3]byte{76, 142, 204}: "SILKAN SA", + [3]byte{76, 143, 165}: "Jastec", + [3]byte{76, 145, 12}: "Lanix Internacional, S.A. de C.V.", + [3]byte{76, 150, 20}: "Juniper Networks", + [3]byte{76, 152, 239}: "Zeo", + [3]byte{76, 158, 128}: "KYOKKO ELECTRIC Co., Ltd.", + [3]byte{76, 158, 228}: "Hanyang Navicom Co.,Ltd.", + [3]byte{76, 158, 255}: "Zyxel Communications Corporation", + [3]byte{76, 160, 3}: "T-21 Technologies LLC", + [3]byte{76, 161, 97}: "Rain Bird Corporation", + [3]byte{76, 165, 21}: "Baikal Electronics JSC", + [3]byte{76, 165, 109}: "Samsung Electronics Co.,Ltd", + [3]byte{76, 167, 75}: "Alcatel Lucent", + [3]byte{76, 169, 40}: "Insensi", + [3]byte{76, 170, 22}: "AzureWave Technologies (Shanghai) Inc.", + [3]byte{76, 171, 51}: "KST technology", + [3]byte{76, 172, 10}: "zte corporation", + [3]byte{76, 174, 28}: "SaiNXT Technologies LLP", + [3]byte{76, 174, 49}: "ShengHai Electronics (Shenzhen) Ltd", + [3]byte{76, 176, 8}: "Shenzhen Gwelltimes Technology Co.,Ltd", + [3]byte{76, 176, 232}: "Beijing RongZhi xinghua technology co., LTD", + [3]byte{76, 177, 108}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{76, 177, 153}: "Apple, Inc.", + [3]byte{76, 178, 28}: "Maxphotonics Co.,Ltd", + [3]byte{76, 180, 74}: "NANOWAVE Technologies Inc.", + [3]byte{76, 180, 234}: "HRD (S) PTE., LTD.", + [3]byte{76, 183, 109}: "Novi Security", + [3]byte{76, 184, 28}: "SAM Electronics GmbH", + [3]byte{76, 184, 44}: "Cambridge Mobile Telematics, Inc.", + [3]byte{76, 184, 181}: "Shenzhen YOUHUA Technology Co., Ltd", + [3]byte{76, 185, 200}: "CONET CO., LTD.", + [3]byte{76, 186, 163}: "Bison Electronics Inc.", + [3]byte{76, 187, 88}: "Chicony Electronics Co., Ltd.", + [3]byte{76, 188, 66}: "Shenzhen Hangsheng Electronics Co.,Ltd.", + [3]byte{76, 188, 165}: "Samsung Electronics Co.,Ltd", + [3]byte{76, 189, 143}: "Hangzhou Hikvision Digital Technology Co.,Ltd.", + [3]byte{76, 196, 82}: "Shang Hai Tyd. Electon Technology Ltd.", + [3]byte{76, 198, 2}: "Radios, Inc.", + [3]byte{76, 198, 129}: "Shenzhen Aisat Electronic Co., Ltd.", + [3]byte{76, 201, 79}: "Nokia", + [3]byte{76, 202, 83}: "Skyera, Inc.", + [3]byte{76, 203, 245}: "zte corporation", + [3]byte{76, 204, 52}: "Motorola Solutions Inc.", + [3]byte{76, 204, 106}: "Micro-Star INTL CO., LTD.", + [3]byte{76, 208, 138}: "HUMAX Co., Ltd.", + [3]byte{76, 214, 55}: "Qsono Electronics Co., Ltd", + [3]byte{76, 215, 182}: "Helmer Scientific", + [3]byte{76, 217, 196}: "Magneti Marelli Automotive Electronics (Guangzhou) Co. Ltd", + [3]byte{76, 223, 61}: "TEAM ENGINEERS ADVANCE TECHNOLOGIES INDIA PVT LTD", + [3]byte{76, 225, 115}: "IEEE Registration Authority", + [3]byte{76, 225, 187}: "Zhuhai HiFocus Technology Co., Ltd.", + [3]byte{76, 226, 241}: "sclak srl", + [3]byte{76, 230, 118}: "BUFFALO.INC", + [3]byte{76, 233, 51}: "RailComm, LLC", + [3]byte{76, 235, 66}: "Intel Corporate", + [3]byte{76, 236, 239}: "Soraa, Inc.", + [3]byte{76, 237, 222}: "ASKEY COMPUTER CORP", + [3]byte{76, 238, 176}: "SHC Netzwerktechnik GmbH", + [3]byte{76, 240, 46}: "Vifa Denmark A/S", + [3]byte{76, 242, 191}: "Cambridge Industries(Group) Co.,Ltd.", + [3]byte{76, 244, 91}: "Blue Clover Devices", + [3]byte{76, 245, 160}: "Scalable Network Technologies Inc", + [3]byte{76, 247, 55}: "SamJi Electronics Co., Ltd", + [3]byte{76, 249, 93}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{76, 250, 202}: "Cambridge Industries(Group) Co.,Ltd.", + [3]byte{76, 251, 69}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{76, 255, 18}: "Fuze Entertainment Co., ltd", + [3]byte{80, 0, 140}: "Hong Kong Telecommunications (HKT) Limited", + [3]byte{80, 1, 107}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{80, 1, 187}: "Samsung Electronics Co.,Ltd", + [3]byte{80, 1, 217}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{80, 4, 184}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{80, 5, 61}: "CyWee Group Ltd", + [3]byte{80, 6, 4}: "Cisco Systems, Inc", + [3]byte{80, 6, 171}: "Cisco Systems, Inc", + [3]byte{80, 9, 89}: "Technicolor CH USA Inc.", + [3]byte{80, 11, 50}: "Foxda Technology Industrial(ShenZhen)Co.,LTD", + [3]byte{80, 11, 145}: "IEEE Registration Authority", + [3]byte{80, 14, 109}: "TrafficCast International", + [3]byte{80, 15, 128}: "Cisco Systems, Inc", + [3]byte{80, 15, 245}: "Tenda Technology Co.,Ltd.Dongguan branch", + [3]byte{80, 17, 235}: "SilverNet Ltd", + [3]byte{80, 20, 181}: "Richfit Information Technology Co., Ltd", + [3]byte{80, 23, 255}: "Cisco Systems, Inc", + [3]byte{80, 24, 76}: "Platina Systems Inc.", + [3]byte{80, 26, 165}: "GN Netcom A/S", + [3]byte{80, 26, 197}: "Microsoft", + [3]byte{80, 28, 191}: "Cisco Systems, Inc", + [3]byte{80, 30, 45}: "StreamUnlimited Engineering GmbH", + [3]byte{80, 32, 107}: "Emerson Climate Technologies Transportation Solutions", + [3]byte{80, 34, 103}: "PixeLINK", + [3]byte{80, 37, 43}: "Nethra Imaging Incorporated", + [3]byte{80, 38, 144}: "FUJITSU LIMITED", + [3]byte{80, 39, 199}: "TECHNART Co.,Ltd", + [3]byte{80, 41, 77}: "NANJING IOT SENSOR TECHNOLOGY CO,LTD", + [3]byte{80, 42, 126}: "Smart electronic GmbH", + [3]byte{80, 42, 139}: "Telekom Research and Development Sdn Bhd", + [3]byte{80, 43, 115}: "Tenda Technology Co.,Ltd.Dongguan branch", + [3]byte{80, 45, 29}: "Nokia Corporation", + [3]byte{80, 45, 162}: "Intel Corporate", + [3]byte{80, 45, 244}: "Phytec Messtechnik GmbH", + [3]byte{80, 46, 92}: "HTC Corporation", + [3]byte{80, 46, 206}: "Asahi Electronics Co.,Ltd", + [3]byte{80, 49, 173}: "ABB Global Industries and Services Private Limited", + [3]byte{80, 50, 55}: "Apple, Inc.", + [3]byte{80, 50, 117}: "Samsung Electronics Co.,Ltd", + [3]byte{80, 51, 139}: "Texas Instruments", + [3]byte{80, 51, 240}: "YICHEN (SHENZHEN) TECHNOLOGY CO.LTD", + [3]byte{80, 57, 85}: "Cisco SPVTG", + [3]byte{80, 58, 125}: "AlphaTech PLC Int’l Co., Ltd.", + [3]byte{80, 58, 160}: "SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.", + [3]byte{80, 60, 196}: "Lenovo Mobile Communication Technology Ltd.", + [3]byte{80, 60, 234}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{80, 61, 161}: "Samsung Electronics Co.,Ltd", + [3]byte{80, 61, 229}: "Cisco Systems, Inc", + [3]byte{80, 62, 170}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{80, 63, 86}: "Syncmold Enterprise Corp", + [3]byte{80, 63, 152}: "CMITECH", + [3]byte{80, 64, 97}: "Nokia", + [3]byte{80, 69, 247}: "Liuhe Intelligence Technology Ltd.", + [3]byte{80, 70, 93}: "ASUSTek COMPUTER INC.", + [3]byte{80, 72, 235}: "BEIJING HAIHEJINSHENG NETWORK TECHNOLOGY CO. LTD.", + [3]byte{80, 74, 94}: "Masimo Corporation", + [3]byte{80, 74, 110}: "NETGEAR", + [3]byte{80, 75, 91}: "CONTROLtronic GmbH", + [3]byte{80, 78, 220}: "Ping Communication", + [3]byte{80, 79, 148}: "Loxone Electronics GmbH", + [3]byte{80, 80, 42}: "Egardia", + [3]byte{80, 80, 101}: "TAKT Corporation", + [3]byte{80, 82, 210}: "Hangzhou Telin Technologies Co., Limited", + [3]byte{80, 85, 39}: "LG Electronics (Mobile Communications)", + [3]byte{80, 86, 99}: "Texas Instruments", + [3]byte{80, 86, 168}: "Jolla Ltd", + [3]byte{80, 86, 191}: "Samsung Electronics Co.,Ltd", + [3]byte{80, 87, 168}: "Cisco Systems, Inc", + [3]byte{80, 88, 0}: "WyTec International, Inc.", + [3]byte{80, 88, 79}: "waytotec,Inc.", + [3]byte{80, 90, 198}: "GUANGDONG SUPER TELECOM CO.,LTD.", + [3]byte{80, 96, 40}: "Xirrus Inc.", + [3]byte{80, 97, 132}: "Avaya Inc", + [3]byte{80, 97, 214}: "Indu-Sol GmbH", + [3]byte{80, 99, 19}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{80, 100, 43}: "XIAOMI Electronics,CO.,LTD", + [3]byte{80, 100, 65}: "Greenlee", + [3]byte{80, 101, 131}: "Texas Instruments", + [3]byte{80, 101, 243}: "Hewlett Packard", + [3]byte{80, 103, 135}: "Planet Networks", + [3]byte{80, 103, 174}: "Cisco Systems, Inc", + [3]byte{80, 103, 240}: "Zyxel Communications Corporation", + [3]byte{80, 104, 10}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{80, 106, 3}: "NETGEAR", + [3]byte{80, 107, 141}: "Nutanix", + [3]byte{80, 110, 146}: "Innocent Technology Co., Ltd.", + [3]byte{80, 111, 152}: "Sehaj Synergy Technologies Private Limited", + [3]byte{80, 111, 154}: "Wi-Fi Alliance", + [3]byte{80, 112, 229}: "He Shan World Fair Electronics Technology Limited", + [3]byte{80, 114, 36}: "Texas Instruments", + [3]byte{80, 114, 77}: "BEG Brueck Electronic GmbH", + [3]byte{80, 118, 145}: "Tekpea, Inc.", + [3]byte{80, 118, 166}: "Ecil Informatica Ind. Com. Ltda", + [3]byte{80, 119, 5}: "Samsung Electronics Co.,Ltd", + [3]byte{80, 121, 91}: "Interexport Telecomunicaciones S.A.", + [3]byte{80, 122, 85}: "Apple, Inc.", + [3]byte{80, 123, 157}: "LCFC(HeFei) Electronics Technology co., ltd", + [3]byte{80, 125, 2}: "BIODIT", + [3]byte{80, 126, 93}: "Arcadyan Technology Corporation", + [3]byte{80, 130, 213}: "Apple, Inc.", + [3]byte{80, 133, 105}: "Samsung Electronics Co.,Ltd", + [3]byte{80, 135, 137}: "Cisco Systems, Inc", + [3]byte{80, 135, 184}: "Nuvyyo Inc", + [3]byte{80, 137, 101}: "SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.", + [3]byte{80, 138, 15}: "SHENZHEN FISE TECHNOLOGY HOLDING CO.,LTD.", + [3]byte{80, 138, 66}: "Uptmate Technology Co., LTD", + [3]byte{80, 138, 203}: "SHENZHEN MAXMADE TECHNOLOGY CO., LTD.", + [3]byte{80, 140, 119}: "DIRMEIER Schanktechnik GmbH &Co KG", + [3]byte{80, 140, 177}: "Texas Instruments", + [3]byte{80, 141, 111}: "CHAHOO Limited", + [3]byte{80, 143, 76}: "Xiaomi Communications Co Ltd", + [3]byte{80, 146, 185}: "Samsung Electronics Co.,Ltd", + [3]byte{80, 147, 79}: "Gradual Tecnologia Ltda.", + [3]byte{80, 151, 114}: "Westinghouse Digital", + [3]byte{80, 152, 113}: "Inventum Technologies Private Limited", + [3]byte{80, 152, 243}: "Rheem Australia Pty Ltd", + [3]byte{80, 154, 76}: "Dell Inc.", + [3]byte{80, 158, 167}: "Samsung Electronics Co.,Ltd", + [3]byte{80, 159, 39}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{80, 159, 59}: "OI ELECTRIC CO.,LTD", + [3]byte{80, 160, 84}: "Actineon", + [3]byte{80, 160, 191}: "Alba Fiber Systems Inc.", + [3]byte{80, 164, 200}: "Samsung Electronics Co.,Ltd", + [3]byte{80, 164, 208}: "IEEE Registration Authority", + [3]byte{80, 166, 227}: "David Clark Company", + [3]byte{80, 167, 21}: "Aboundi, Inc.", + [3]byte{80, 167, 43}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{80, 167, 51}: "Ruckus Wireless", + [3]byte{80, 168, 58}: "S Mobile Devices Limited", + [3]byte{80, 169, 222}: "Smartcom - Bulgaria AD", + [3]byte{80, 171, 62}: "Qibixx AG", + [3]byte{80, 171, 191}: "Hoseo Telecom", + [3]byte{80, 173, 213}: "Dynalec Corporation", + [3]byte{80, 175, 115}: "Shenzhen Bitland Information Technology Co., Ltd.", + [3]byte{80, 179, 99}: "Digitron da Amazonia S/A", + [3]byte{80, 182, 149}: "Micropoint Biotechnologies,Inc.", + [3]byte{80, 183, 195}: "Samsung Electronics Co.,Ltd", + [3]byte{80, 184, 136}: "wi2be Tecnologia S/A", + [3]byte{80, 184, 162}: "ImTech Technologies LLC,", + [3]byte{80, 189, 95}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{80, 192, 6}: "Carmanah Signs", + [3]byte{80, 194, 113}: "SECURETECH INC", + [3]byte{80, 197, 141}: "Juniper Networks", + [3]byte{80, 199, 191}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{80, 200, 229}: "Samsung Electronics Co.,Ltd", + [3]byte{80, 201, 113}: "GN Netcom A/S", + [3]byte{80, 201, 160}: "SKIPPER AS", + [3]byte{80, 204, 248}: "SAMSUNG ELECTRO MECHANICS CO., LTD.", + [3]byte{80, 205, 34}: "Avaya Inc", + [3]byte{80, 205, 50}: "NanJing Chaoran Science & Technology Co.,Ltd.", + [3]byte{80, 206, 117}: "Measy Electronics Co., Ltd.", + [3]byte{80, 210, 19}: "CviLux Corporation", + [3]byte{80, 210, 116}: "Steffes Corporation", + [3]byte{80, 211, 127}: "Yu Fly Mikly Way Science and Technology Co., Ltd.", + [3]byte{80, 213, 156}: "Thai Habel Industrial Co., Ltd.", + [3]byte{80, 214, 215}: "Takahata Precision", + [3]byte{80, 215, 83}: "CONELCOM GmbH", + [3]byte{80, 218, 0}: "Hangzhou H3C Technologies Co., Limited", + [3]byte{80, 221, 79}: "Automation Components, Inc", + [3]byte{80, 223, 149}: "Lytx", + [3]byte{80, 224, 199}: "TurControlSystme AG", + [3]byte{80, 225, 74}: "Private", + [3]byte{80, 229, 73}: "GIGA-BYTE TECHNOLOGY CO.,LTD.", + [3]byte{80, 230, 102}: "Shenzhen Techtion Electronics Co., Ltd.", + [3]byte{80, 233, 113}: "Jibo, Inc.", + [3]byte{80, 234, 214}: "Apple, Inc.", + [3]byte{80, 235, 26}: "Brocade Communications Systems, Inc.", + [3]byte{80, 237, 120}: "Changzhou Yongse Infotech Co.,Ltd", + [3]byte{80, 237, 148}: "EGATEL SL", + [3]byte{80, 240, 3}: "Open Stack, Inc.", + [3]byte{80, 240, 211}: "Samsung Electronics Co.,Ltd", + [3]byte{80, 241, 74}: "Texas Instruments", + [3]byte{80, 244, 60}: "Leeo Inc", + [3]byte{80, 245, 32}: "Samsung Electronics Co.,Ltd", + [3]byte{80, 245, 218}: "Amazon Technologies Inc.", + [3]byte{80, 246, 26}: "Kunshan JADE Technologies co., Ltd.", + [3]byte{80, 247, 34}: "Cisco Systems, Inc", + [3]byte{80, 250, 132}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{80, 250, 171}: "L-tek d.o.o.", + [3]byte{80, 252, 48}: "Treehouse Labs", + [3]byte{80, 252, 159}: "Samsung Electronics Co.,Ltd", + [3]byte{80, 254, 242}: "Sify Technologies Ltd", + [3]byte{80, 255, 32}: "Keenetic Limited", + [3]byte{80, 255, 153}: "IEEE Registration Authority", + [3]byte{84, 2, 55}: "Teltronic AG", + [3]byte{84, 3, 132}: "Hangkong Nano IC Technologies Co., Ltd", + [3]byte{84, 3, 245}: "EBN Technology Corp.", + [3]byte{84, 4, 150}: "Gigawave LTD", + [3]byte{84, 4, 166}: "ASUSTek COMPUTER INC.", + [3]byte{84, 5, 54}: "Vivago Oy", + [3]byte{84, 5, 95}: "Alcatel Lucent", + [3]byte{84, 5, 147}: "WOORI ELEC Co.,Ltd", + [3]byte{84, 9, 85}: "zte corporation", + [3]byte{84, 9, 141}: "deister electronic GmbH", + [3]byte{84, 16, 236}: "Microchip Technology Inc.", + [3]byte{84, 17, 47}: "Sulzer Pump Solutions Finland Oy", + [3]byte{84, 17, 95}: "Atamo Pty Ltd", + [3]byte{84, 19, 121}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{84, 20, 115}: "Wingtech Group (HongKong)Limited", + [3]byte{84, 20, 253}: "Orbbec 3D Technology International", + [3]byte{84, 25, 200}: "vivo Mobile Communication Co., Ltd.", + [3]byte{84, 27, 93}: "Techno-Innov", + [3]byte{84, 29, 251}: "Freestyle Energy Ltd", + [3]byte{84, 30, 86}: "Juniper Networks", + [3]byte{84, 31, 213}: "Advantage Electronics", + [3]byte{84, 32, 24}: "Tely Labs", + [3]byte{84, 33, 96}: "Resolution Products", + [3]byte{84, 34, 248}: "zte corporation", + [3]byte{84, 37, 234}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{84, 38, 150}: "Apple, Inc.", + [3]byte{84, 39, 30}: "AzureWave Technology Inc.", + [3]byte{84, 39, 88}: "Motorola (Wuhan) Mobility Technologies Communication Co., Ltd.", + [3]byte{84, 39, 108}: "Jiangsu Houge Technology Corp.", + [3]byte{84, 42, 156}: "LSY Defense, LLC.", + [3]byte{84, 42, 162}: "Alpha Networks Inc.", + [3]byte{84, 43, 87}: "Night Owl SP", + [3]byte{84, 44, 234}: "PROTECTRON", + [3]byte{84, 47, 137}: "Euclid Laboratories, Inc.", + [3]byte{84, 47, 138}: "TELLESCOM INDUSTRIA E COMERCIO EM TELECOMUNICACAO", + [3]byte{84, 49, 49}: "Raster Vision Ltd", + [3]byte{84, 51, 203}: "Apple, Inc.", + [3]byte{84, 53, 48}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{84, 53, 223}: "Symeo GmbH", + [3]byte{84, 54, 155}: "1Verge Internet Technology (Beijing) Co., Ltd.", + [3]byte{84, 57, 104}: "Edgewater Networks Inc", + [3]byte{84, 57, 223}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{84, 59, 48}: "duagon AG", + [3]byte{84, 61, 55}: "Ruckus Wireless", + [3]byte{84, 64, 173}: "Samsung Electronics Co.,Ltd", + [3]byte{84, 66, 73}: "Sony Corporation", + [3]byte{84, 68, 8}: "Nokia Corporation", + [3]byte{84, 70, 107}: "Shenzhen CZTIC Electronic Technology Co., Ltd", + [3]byte{84, 72, 156}: "CDOUBLES ELECTRONICS CO. LTD.", + [3]byte{84, 74, 0}: "Cisco Systems, Inc", + [3]byte{84, 74, 5}: "wenglor sensoric gmbh", + [3]byte{84, 74, 22}: "Texas Instruments", + [3]byte{84, 75, 140}: "Juniper Networks", + [3]byte{84, 78, 69}: "Private", + [3]byte{84, 78, 144}: "Apple, Inc.", + [3]byte{84, 81, 27}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{84, 81, 70}: "AMG Systems Ltd.", + [3]byte{84, 83, 237}: "Sony Corporation", + [3]byte{84, 84, 20}: "Digital RF Corea, Inc", + [3]byte{84, 84, 207}: "PROBEDIGITAL CO.,LTD", + [3]byte{84, 90, 166}: "Espressif Inc.", + [3]byte{84, 94, 189}: "NL Technologies", + [3]byte{84, 95, 169}: "Teracom Limited", + [3]byte{84, 96, 9}: "Google, Inc.", + [3]byte{84, 97, 114}: "ZODIAC AEROSPACE SAS", + [3]byte{84, 97, 234}: "Zaplox AB", + [3]byte{84, 100, 217}: "Sagemcom Broadband SAS", + [3]byte{84, 101, 222}: "ARRIS Group, Inc.", + [3]byte{84, 102, 108}: "Shenzhen YOUHUA Technology Co., Ltd", + [3]byte{84, 103, 81}: "Compal Broadband Networks, Inc.", + [3]byte{84, 108, 14}: "Texas Instruments", + [3]byte{84, 109, 82}: "TOPVIEW OPTRONICS CORP.", + [3]byte{84, 114, 79}: "Apple, Inc.", + [3]byte{84, 115, 152}: "Toyo Electronics Corporation", + [3]byte{84, 116, 230}: "Webtech Wireless", + [3]byte{84, 117, 149}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{84, 117, 208}: "Cisco Systems, Inc", + [3]byte{84, 120, 26}: "Cisco Systems, Inc", + [3]byte{84, 121, 117}: "Nokia Corporation", + [3]byte{84, 122, 82}: "CTE International srl", + [3]byte{84, 124, 105}: "Cisco Systems, Inc", + [3]byte{84, 125, 205}: "Texas Instruments", + [3]byte{84, 127, 84}: "INGENICO", + [3]byte{84, 127, 168}: "TELCO systems, s.r.o.", + [3]byte{84, 127, 238}: "Cisco Systems, Inc", + [3]byte{84, 129, 173}: "Eagle Research Corporation", + [3]byte{84, 132, 123}: "Digital Devices GmbH", + [3]byte{84, 136, 14}: "SAMSUNG ELECTRO-MECHANICS(THAILAND)", + [3]byte{84, 137, 34}: "Zelfy Inc", + [3]byte{84, 137, 152}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{84, 140, 160}: "Liteon Technology Corporation", + [3]byte{84, 146, 190}: "Samsung Electronics Co.,Ltd", + [3]byte{84, 147, 89}: "SHENZHEN TWOWING TECHNOLOGIES CO.,LTD.", + [3]byte{84, 148, 120}: "Silvershore Technology Partners", + [3]byte{84, 154, 17}: "IEEE Registration Authority", + [3]byte{84, 154, 22}: "Uzushio Electric Co.,Ltd.", + [3]byte{84, 154, 76}: "GUANGDONG HOMECARE TECHNOLOGY CO.,LTD.", + [3]byte{84, 155, 18}: "Samsung Electronics Co.,Ltd", + [3]byte{84, 157, 133}: "EnerAccess inc", + [3]byte{84, 159, 19}: "Apple, Inc.", + [3]byte{84, 159, 53}: "Dell Inc.", + [3]byte{84, 160, 79}: "t-mac Technologies Ltd", + [3]byte{84, 160, 80}: "ASUSTek COMPUTER INC.", + [3]byte{84, 162, 116}: "Cisco Systems, Inc", + [3]byte{84, 163, 27}: "Shenzhen Linkworld Technology Co,.LTD", + [3]byte{84, 163, 250}: "BQT Solutions (Australia)Pty Ltd", + [3]byte{84, 165, 27}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{84, 165, 75}: "NSC Communications Siberia Ltd", + [3]byte{84, 166, 25}: "Alcatel-Lucent Shanghai Bell Co., Ltd", + [3]byte{84, 169, 212}: "Minibar Systems", + [3]byte{84, 171, 58}: "QUANTA COMPUTER INC.", + [3]byte{84, 174, 39}: "Apple, Inc.", + [3]byte{84, 177, 33}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{84, 181, 108}: "Xi'an NovaStar Tech Co., Ltd", + [3]byte{84, 182, 32}: "SUHDOL E&C Co.Ltd.", + [3]byte{84, 183, 83}: "Hunan Fenghui Yinjia Science And Technology Co.,Ltd", + [3]byte{84, 184, 10}: "D-Link International", + [3]byte{84, 189, 121}: "Samsung Electronics Co.,Ltd", + [3]byte{84, 190, 83}: "zte corporation", + [3]byte{84, 190, 247}: "PEGATRON CORPORATION", + [3]byte{84, 196, 21}: "Hangzhou Hikvision Digital Technology Co.,Ltd.", + [3]byte{84, 197, 122}: "Sunnovo International Limited", + [3]byte{84, 200, 15}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{84, 201, 223}: "FN-LINK TECHNOLOGY LIMITED", + [3]byte{84, 205, 16}: "Panasonic Mobile Communications Co.,Ltd.", + [3]byte{84, 205, 167}: "Fujian Shenzhou Electronic Co.,Ltd", + [3]byte{84, 205, 238}: "ShenZhen Apexis Electronic Co.,Ltd", + [3]byte{84, 208, 180}: "Xiamen Four-Faith Communication Technology Co.,Ltd", + [3]byte{84, 208, 237}: "AXIM Communications", + [3]byte{84, 209, 99}: "MAX-TECH,INC", + [3]byte{84, 209, 176}: "Universal Laser Systems, Inc", + [3]byte{84, 210, 114}: "Nuki Home Solutions GmbH", + [3]byte{84, 212, 111}: "Cisco SPVTG", + [3]byte{84, 215, 81}: "Proximus", + [3]byte{84, 217, 228}: "BRILLIANTTS CO., LTD", + [3]byte{84, 220, 29}: "Yulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd", + [3]byte{84, 223, 0}: "Ulterius Technologies, LLC", + [3]byte{84, 223, 36}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{84, 223, 99}: "Intrakey technologies GmbH", + [3]byte{84, 224, 50}: "Juniper Networks", + [3]byte{84, 224, 97}: "SICHUAN TIANYI COMHEART TELECOMCO., LTD", + [3]byte{84, 225, 64}: "INGENICO", + [3]byte{84, 225, 173}: "LCFC(HeFei) Electronics Technology co., ltd", + [3]byte{84, 226, 200}: "Dongguan Aoyuan Electronics Technology Co., Ltd", + [3]byte{84, 226, 224}: "ARRIS Group, Inc.", + [3]byte{84, 227, 176}: "JVL Industri Elektronik", + [3]byte{84, 227, 246}: "Alcatel-Lucent", + [3]byte{84, 228, 58}: "Apple, Inc.", + [3]byte{84, 228, 189}: "FN-LINK TECHNOLOGY LIMITED", + [3]byte{84, 230, 63}: "ShenZhen LingKeWeiEr Technology Co., Ltd.", + [3]byte{84, 230, 252}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{84, 234, 168}: "Apple, Inc.", + [3]byte{84, 237, 163}: "Navdy, Inc.", + [3]byte{84, 238, 117}: "Wistron InfoComm(Kunshan)Co.,Ltd.", + [3]byte{84, 239, 146}: "Shenzhen Elink Technology Co., LTD", + [3]byte{84, 239, 254}: "Fullpower Technologies, Inc.", + [3]byte{84, 242, 1}: "Samsung Electronics Co.,Ltd", + [3]byte{84, 245, 182}: "ORIENTAL PACIFIC INTERNATIONAL LIMITED", + [3]byte{84, 246, 102}: "Berthold Technologies GmbH and Co.KG", + [3]byte{84, 246, 197}: "FUJIAN STAR-NET COMMUNICATION CO.,LTD", + [3]byte{84, 248, 118}: "ABB AG", + [3]byte{84, 250, 62}: "Samsung Electronics Co.,Ltd", + [3]byte{84, 250, 150}: "Nokia", + [3]byte{84, 251, 88}: "WISEWARE, Lda", + [3]byte{84, 253, 191}: "Scheidt & Bachmann GmbH", + [3]byte{84, 255, 130}: "Davit Solution co.", + [3]byte{84, 255, 207}: "Mopria Alliance", + [3]byte{88, 0, 187}: "Juniper Networks", + [3]byte{88, 0, 227}: "Liteon Technology Corporation", + [3]byte{88, 4, 84}: "ICOMM HK LIMITED", + [3]byte{88, 4, 203}: "Tianjin Huisun Technology Co.,Ltd.", + [3]byte{88, 5, 40}: "LABRIS NETWORKS", + [3]byte{88, 5, 86}: "Elettronica GF S.r.L.", + [3]byte{88, 8, 250}: "Fiber Optic & telecommunication INC.", + [3]byte{88, 9, 67}: "Private", + [3]byte{88, 9, 229}: "Kivic Inc.", + [3]byte{88, 10, 32}: "Cisco Systems, Inc", + [3]byte{88, 16, 140}: "Intelbras", + [3]byte{88, 18, 67}: "AcSiP Technology Corp.", + [3]byte{88, 22, 38}: "Avaya Inc", + [3]byte{88, 23, 12}: "Sony Mobile Communications AB", + [3]byte{88, 25, 248}: "ARRIS Group, Inc.", + [3]byte{88, 28, 189}: "Affinegy", + [3]byte{88, 29, 145}: "Advanced Mobile Telecom co.,ltd.", + [3]byte{88, 31, 40}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{88, 31, 103}: "Open-m technology limited", + [3]byte{88, 31, 170}: "Apple, Inc.", + [3]byte{88, 31, 239}: "Tuttnaer LTD", + [3]byte{88, 32, 177}: "Hewlett Packard", + [3]byte{88, 33, 54}: "KMB systems, s.r.o.", + [3]byte{88, 35, 140}: "Technicolor CH USA Inc.", + [3]byte{88, 42, 247}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{88, 43, 219}: "Pax AB", + [3]byte{88, 46, 254}: "Lighting Science Group", + [3]byte{88, 47, 66}: "Universal Electric Corporation", + [3]byte{88, 49, 18}: "DRUST", + [3]byte{88, 50, 119}: "Reliance Communications LLC", + [3]byte{88, 52, 59}: "Glovast Technology Ltd.", + [3]byte{88, 53, 217}: "Cisco Systems, Inc", + [3]byte{88, 56, 121}: "RICOH COMPANY, LTD.", + [3]byte{88, 60, 198}: "Omneality Ltd.", + [3]byte{88, 63, 84}: "LG Electronics (Mobile Communications)", + [3]byte{88, 64, 78}: "Apple, Inc.", + [3]byte{88, 66, 228}: "Baxter International Inc", + [3]byte{88, 68, 152}: "Xiaomi Communications Co Ltd", + [3]byte{88, 70, 143}: "Koncar Electronics and Informatics", + [3]byte{88, 70, 225}: "Baxter International Inc", + [3]byte{88, 71, 4}: "Shenzhen Webridge Technology Co.,Ltd", + [3]byte{88, 72, 34}: "Sony Mobile Communications AB", + [3]byte{88, 72, 192}: "COFLEC", + [3]byte{88, 73, 37}: "E3 Enterprise", + [3]byte{88, 73, 59}: "Palo Alto Networks", + [3]byte{88, 73, 186}: "Chitai Electronic Corp.", + [3]byte{88, 76, 25}: "Chongqing Guohong Technology Development Company Limited", + [3]byte{88, 76, 238}: "Digital One Technologies, Limited", + [3]byte{88, 80, 118}: "Linear Equipamentos Eletronicos SA", + [3]byte{88, 80, 171}: "TLS Corporation", + [3]byte{88, 80, 230}: "Best Buy Corporation", + [3]byte{88, 82, 138}: "Mitsubishi Electric Corporation", + [3]byte{88, 83, 192}: "Beijing Guang Runtong Technology Development Company co.,Ltd", + [3]byte{88, 85, 202}: "Apple, Inc.", + [3]byte{88, 86, 232}: "ARRIS Group, Inc.", + [3]byte{88, 87, 13}: "Danfoss Solar Inverters", + [3]byte{88, 96, 95}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{88, 97, 99}: "Quantum Networks (SG) Pte. Ltd.", + [3]byte{88, 99, 86}: "FN-LINK TECHNOLOGY LIMITED", + [3]byte{88, 99, 154}: "TPL SYSTEMES", + [3]byte{88, 101, 230}: "INFOMARK CO., LTD.", + [3]byte{88, 102, 186}: "Hangzhou H3C Technologies Co., Limited", + [3]byte{88, 103, 26}: "Barnes&Noble", + [3]byte{88, 103, 127}: "Clare Controls Inc.", + [3]byte{88, 104, 93}: "Tempo Australia Pty Ltd", + [3]byte{88, 105, 108}: "Ruijie Networks Co.,LTD", + [3]byte{88, 105, 249}: "Fusion Transactive Ltd.", + [3]byte{88, 106, 177}: "Hangzhou H3C Technologies Co., Limited", + [3]byte{88, 109, 143}: "Cisco-Linksys, LLC", + [3]byte{88, 110, 214}: "Private", + [3]byte{88, 112, 198}: "Shanghai Xiaoyi Technology Co., Ltd.", + [3]byte{88, 117, 33}: "CJSC RTSoft", + [3]byte{88, 118, 117}: "Beijing ECHO Technologies Co.,Ltd", + [3]byte{88, 118, 197}: "DIGI I'S LTD", + [3]byte{88, 122, 77}: "Stonesoft Corporation", + [3]byte{88, 122, 98}: "Texas Instruments", + [3]byte{88, 123, 233}: "AirPro Technology India Pvt. Ltd", + [3]byte{88, 126, 97}: "Qingdao Hisense Communications Co.,Ltd.", + [3]byte{88, 127, 87}: "Apple, Inc.", + [3]byte{88, 127, 102}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{88, 127, 183}: "SONAR INDUSTRIAL CO., LTD.", + [3]byte{88, 127, 200}: "S2M", + [3]byte{88, 130, 29}: "H. Schomäcker GmbH", + [3]byte{88, 130, 168}: "Microsoft", + [3]byte{88, 132, 228}: "IP500 Alliance e.V.", + [3]byte{88, 133, 110}: "QSC AG", + [3]byte{88, 135, 76}: "LITE-ON CLEAN ENERGY TECHNOLOGY CORP.", + [3]byte{88, 135, 226}: "Shenzhen Coship Electronics Co., Ltd.", + [3]byte{88, 138, 90}: "Dell Inc.", + [3]byte{88, 139, 243}: "Zyxel Communications Corporation", + [3]byte{88, 141, 9}: "Cisco Systems, Inc", + [3]byte{88, 141, 100}: "Xi'an Clevbee Technology Co.,Ltd", + [3]byte{88, 144, 67}: "Sagemcom Broadband SAS", + [3]byte{88, 145, 207}: "Intel Corporate", + [3]byte{88, 146, 13}: "Kinetic Avionics Limited", + [3]byte{88, 147, 150}: "Ruckus Wireless", + [3]byte{88, 148, 107}: "Intel Corporate", + [3]byte{88, 148, 207}: "Vertex Standard LMR, Inc.", + [3]byte{88, 151, 30}: "Cisco Systems, Inc", + [3]byte{88, 151, 189}: "Cisco Systems, Inc", + [3]byte{88, 152, 53}: "Technicolor", + [3]byte{88, 152, 111}: "Revolution Display", + [3]byte{88, 155, 11}: "Shineway Technologies, Inc.", + [3]byte{88, 156, 252}: "FreeBSD Foundation", + [3]byte{88, 160, 203}: "TrackNet, Inc", + [3]byte{88, 162, 181}: "LG Electronics (Mobile Communications)", + [3]byte{88, 167, 111}: "iD corporation", + [3]byte{88, 168, 57}: "Intel Corporate", + [3]byte{88, 172, 120}: "Cisco Systems, Inc", + [3]byte{88, 176, 53}: "Apple, Inc.", + [3]byte{88, 176, 212}: "ZuniData Systems Inc.", + [3]byte{88, 180, 45}: "YSTen Technology Co.,Ltd", + [3]byte{88, 182, 51}: "Ruckus Wireless", + [3]byte{88, 185, 97}: "SOLEM Electronique", + [3]byte{88, 185, 225}: "Crystalfontz America, Inc.", + [3]byte{88, 188, 39}: "Cisco Systems, Inc", + [3]byte{88, 188, 143}: "Cognitive Systems Corp.", + [3]byte{88, 189, 163}: "Nintendo Co., Ltd.", + [3]byte{88, 189, 249}: "Sigrand", + [3]byte{88, 191, 234}: "Cisco Systems, Inc", + [3]byte{88, 193, 122}: "Cambium Networks Limited", + [3]byte{88, 194, 50}: "NEC Corporation", + [3]byte{88, 195, 139}: "Samsung Electronics Co.,Ltd", + [3]byte{88, 197, 131}: "ITEL MOBILE LIMITED", + [3]byte{88, 197, 203}: "Samsung Electronics Co.,Ltd", + [3]byte{88, 201, 53}: "Chiun Mai Communication Systems, Inc", + [3]byte{88, 207, 75}: "Lufkin Industries", + [3]byte{88, 208, 113}: "BW Broadcast", + [3]byte{88, 208, 143}: "IEEE 1904.1 Working Group", + [3]byte{88, 214, 122}: "TCPlink", + [3]byte{88, 214, 211}: "Dairy Cheq Inc", + [3]byte{88, 217, 213}: "Tenda Technology Co.,Ltd.Dongguan branch", + [3]byte{88, 219, 141}: "Fast Co., Ltd.", + [3]byte{88, 220, 109}: "Exceptional Innovation, Inc.", + [3]byte{88, 224, 44}: "Micro Technic A/S", + [3]byte{88, 225, 108}: "Ying Hua Information Technology (Shanghai)Co., LTD", + [3]byte{88, 226, 143}: "Apple, Inc.", + [3]byte{88, 227, 38}: "Compass Technologies Inc.", + [3]byte{88, 228, 118}: "CENTRON COMMUNICATIONS TECHNOLOGIES FUJIAN CO.,LTD", + [3]byte{88, 230, 54}: "EVRsafe Technologies", + [3]byte{88, 231, 71}: "Deltanet AG", + [3]byte{88, 232, 8}: "AUTONICS CORPORATION", + [3]byte{88, 232, 118}: "IEEE Registration Authority", + [3]byte{88, 235, 20}: "Proteus Digital Health", + [3]byte{88, 236, 225}: "Newport Corporation", + [3]byte{88, 238, 206}: "Icon Time Systems", + [3]byte{88, 239, 104}: "Belkin International Inc.", + [3]byte{88, 241, 2}: "BLU Products Inc.", + [3]byte{88, 243, 135}: "HCCP", + [3]byte{88, 243, 156}: "Cisco Systems, Inc", + [3]byte{88, 244, 150}: "Source Chain", + [3]byte{88, 246, 123}: "Xia Men UnionCore Technology LTD.", + [3]byte{88, 246, 191}: "Kyoto University", + [3]byte{88, 249, 142}: "SECUDOS GmbH", + [3]byte{88, 251, 132}: "Intel Corporate", + [3]byte{88, 252, 115}: "Arria Live Media, Inc.", + [3]byte{88, 252, 219}: "IEEE Registration Authority", + [3]byte{88, 253, 32}: "Bravida Sakerhet AB", + [3]byte{92, 2, 106}: "Applied Vision Corporation", + [3]byte{92, 3, 57}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{92, 7, 111}: "Thought Creator", + [3]byte{92, 9, 121}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{92, 10, 91}: "SAMSUNG ELECTRO MECHANICS CO., LTD.", + [3]byte{92, 12, 14}: "Guizhou Huaxintong Semiconductor Technology Co Ltd", + [3]byte{92, 12, 187}: "CELIZION Inc.", + [3]byte{92, 14, 139}: "Extreme Networks, Inc.", + [3]byte{92, 17, 147}: "Seal One AG", + [3]byte{92, 20, 55}: "Thyssenkrupp Aufzugswerke GmbH", + [3]byte{92, 21, 21}: "ADVAN", + [3]byte{92, 21, 225}: "AIDC TECHNOLOGY (S) PTE LTD", + [3]byte{92, 22, 199}: "Big Switch Networks", + [3]byte{92, 23, 55}: "I-View Now, LLC.", + [3]byte{92, 23, 211}: "LGE", + [3]byte{92, 24, 181}: "Talon Communications", + [3]byte{92, 26, 111}: "Cambridge Industries(Group) Co.,Ltd.", + [3]byte{92, 32, 208}: "Asoni Communication Co., Ltd.", + [3]byte{92, 34, 196}: "DAE EUN ELETRONICS CO., LTD", + [3]byte{92, 36, 67}: "O-Sung Telecom Co., Ltd.", + [3]byte{92, 36, 121}: "Baltech AG", + [3]byte{92, 37, 76}: "Avire Global Pte Ltd", + [3]byte{92, 38, 10}: "Dell Inc.", + [3]byte{92, 42, 239}: "Open Access Pty Ltd", + [3]byte{92, 43, 245}: "Vivint Wireless Inc.", + [3]byte{92, 46, 89}: "Samsung Electronics Co.,Ltd", + [3]byte{92, 46, 210}: "ABC(XiSheng) Electronics Co.,Ltd", + [3]byte{92, 49, 62}: "Texas Instruments", + [3]byte{92, 51, 39}: "Spazio Italia srl", + [3]byte{92, 51, 92}: "Swissphone Telecom AG", + [3]byte{92, 51, 142}: "Alpha Networks Inc.", + [3]byte{92, 53, 59}: "Compal Broadband Networks, Inc.", + [3]byte{92, 53, 218}: "There Corporation Oy", + [3]byte{92, 54, 184}: "TCL King Electrical Appliances (Huizhou) Co., Ltd", + [3]byte{92, 56, 224}: "Shanghai Super Electronics Technology Co.,LTD", + [3]byte{92, 59, 53}: "Gehirn Inc.", + [3]byte{92, 60, 39}: "Samsung Electronics Co.,Ltd", + [3]byte{92, 64, 88}: "Jefferson Audio Video Systems, Inc.", + [3]byte{92, 65, 231}: "Wiatec International Ltd.", + [3]byte{92, 67, 210}: "HAZEMEYER", + [3]byte{92, 69, 39}: "Juniper Networks", + [3]byte{92, 73, 121}: "AVM Audiovisuelles Marketing und Computersysteme GmbH", + [3]byte{92, 73, 125}: "Samsung Electronics Co.,Ltd", + [3]byte{92, 74, 31}: "SICHUAN TIANYI COMHEART TELECOMCO., LTD", + [3]byte{92, 74, 38}: "Enguity Technology Corp", + [3]byte{92, 76, 169}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{92, 80, 21}: "Cisco Systems, Inc", + [3]byte{92, 81, 79}: "Intel Corporate", + [3]byte{92, 81, 129}: "Samsung Electronics Co.,Ltd", + [3]byte{92, 81, 136}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{92, 82, 30}: "Nintendo Co.,Ltd", + [3]byte{92, 84, 109}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{92, 86, 237}: "3pleplay Electronics Private Limited", + [3]byte{92, 87, 26}: "ARRIS Group, Inc.", + [3]byte{92, 87, 200}: "Nokia Corporation", + [3]byte{92, 88, 25}: "Jingsheng Technology Co., Ltd.", + [3]byte{92, 89, 72}: "Apple, Inc.", + [3]byte{92, 91, 53}: "Mist Systems, Inc.", + [3]byte{92, 91, 194}: "YIK Corporation", + [3]byte{92, 94, 171}: "Juniper Networks", + [3]byte{92, 95, 103}: "Intel Corporate", + [3]byte{92, 99, 191}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{92, 103, 118}: "IDS Imaging Development Systems GmbH", + [3]byte{92, 105, 132}: "NUVICO", + [3]byte{92, 106, 125}: "KENTKART EGE ELEKTRONIK SAN. VE TIC. LTD. STI.", + [3]byte{92, 106, 128}: "Zyxel Communications Corporation", + [3]byte{92, 107, 50}: "Texas Instruments", + [3]byte{92, 107, 79}: "Hello Inc.", + [3]byte{92, 109, 32}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{92, 111, 79}: "S.A. SISTEL", + [3]byte{92, 112, 163}: "LG Electronics (Mobile Communications)", + [3]byte{92, 119, 87}: "Haivision Network Video", + [3]byte{92, 119, 118}: "TCT mobile ltd", + [3]byte{92, 125, 94}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{92, 129, 167}: "Network Devices Pty Ltd", + [3]byte{92, 131, 143}: "Cisco Systems, Inc", + [3]byte{92, 132, 134}: "Brightsource Industries Israel LTD", + [3]byte{92, 134, 19}: "Beijing Zhoenet Technology Co., Ltd", + [3]byte{92, 134, 74}: "Secret Labs LLC", + [3]byte{92, 134, 92}: "Samsung Electronics Co.,Ltd", + [3]byte{92, 134, 193}: "DONGGUAN SOLUM ELECTRONICS CO.,LTD", + [3]byte{92, 135, 120}: "Cybertelbridge co.,ltd", + [3]byte{92, 137, 154}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{92, 137, 212}: "Beijing Banner Electric Co.,Ltd", + [3]byte{92, 138, 56}: "Hewlett Packard", + [3]byte{92, 141, 45}: "Shanghai Wellpay Information Technology Co., Ltd", + [3]byte{92, 141, 78}: "Apple, Inc.", + [3]byte{92, 143, 224}: "ARRIS Group, Inc.", + [3]byte{92, 147, 162}: "Liteon Technology Corporation", + [3]byte{92, 149, 174}: "Apple, Inc.", + [3]byte{92, 150, 86}: "AzureWave Technology Inc.", + [3]byte{92, 150, 106}: "RTNET", + [3]byte{92, 150, 157}: "Apple, Inc.", + [3]byte{92, 151, 243}: "Apple, Inc.", + [3]byte{92, 153, 96}: "Samsung Electronics Co.,Ltd", + [3]byte{92, 154, 216}: "FUJITSU LIMITED", + [3]byte{92, 161, 118}: "SICHUAN TIANYI COMHEART TELECOMCO., LTD", + [3]byte{92, 161, 120}: "TableTop Media (dba Ziosk)", + [3]byte{92, 163, 157}: "SAMSUNG ELECTRO MECHANICS CO., LTD.", + [3]byte{92, 163, 235}: "Lokel s.r.o.", + [3]byte{92, 164, 138}: "Cisco Systems, Inc", + [3]byte{92, 168, 106}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{92, 169, 51}: "Luma Home", + [3]byte{92, 170, 253}: "Sonos, Inc.", + [3]byte{92, 172, 76}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{92, 173, 118}: "Shenzhen TCL New Technology Co., Ltd", + [3]byte{92, 173, 207}: "Apple, Inc.", + [3]byte{92, 175, 6}: "LG Electronics (Mobile Communications)", + [3]byte{92, 176, 102}: "ARRIS Group, Inc.", + [3]byte{92, 179, 149}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{92, 180, 62}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{92, 181, 36}: "Sony Mobile Communications AB", + [3]byte{92, 181, 89}: "CNEX Labs", + [3]byte{92, 182, 204}: "NovaComm Technologies Inc.", + [3]byte{92, 184, 203}: "Allis Communications", + [3]byte{92, 185, 1}: "Hewlett Packard", + [3]byte{92, 186, 55}: "Microsoft Corporation", + [3]byte{92, 189, 158}: "HONGKONG MIRACLE EAGLE TECHNOLOGY(GROUP) LIMITED", + [3]byte{92, 194, 19}: "Fr. Sauter AG", + [3]byte{92, 195, 7}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{92, 197, 212}: "Intel Corporate", + [3]byte{92, 198, 208}: "Skyworth Digital Technology(Shenzhen) Co.,Ltd", + [3]byte{92, 198, 233}: "Edifier International", + [3]byte{92, 199, 215}: "AZROAD TECHNOLOGY COMPANY LIMITED", + [3]byte{92, 201, 211}: "PALLADIUM ENERGY ELETRONICA DA AMAZONIA LTDA", + [3]byte{92, 202, 26}: "Microsoft Mobile Oy", + [3]byte{92, 202, 50}: "Theben AG", + [3]byte{92, 204, 160}: "Gridwiz Inc.", + [3]byte{92, 204, 255}: "Techroutes Network Pvt Ltd", + [3]byte{92, 206, 173}: "CDYNE Corporation", + [3]byte{92, 207, 127}: "Espressif Inc.", + [3]byte{92, 209, 53}: "Xtreme Power Systems", + [3]byte{92, 210, 228}: "Intel Corporate", + [3]byte{92, 212, 27}: "UCZOON Technology Co., LTD", + [3]byte{92, 212, 171}: "Zektor", + [3]byte{92, 214, 31}: "Qardio, Inc", + [3]byte{92, 217, 152}: "D-Link Corporation", + [3]byte{92, 218, 212}: "Murata Manufacturing Co., Ltd.", + [3]byte{92, 220, 150}: "Arcadyan Technology Corporation", + [3]byte{92, 221, 112}: "Hangzhou H3C Technologies Co., Limited", + [3]byte{92, 224, 197}: "Intel Corporate", + [3]byte{92, 224, 202}: "FeiTian United (Beijing) System Technology Co., Ltd.", + [3]byte{92, 224, 246}: "NIC.br- Nucleo de Informacao e Coordenacao do Ponto BR", + [3]byte{92, 226, 35}: "Delphin Technology AG", + [3]byte{92, 226, 134}: "Nortel Networks", + [3]byte{92, 226, 140}: "Zyxel Communications Corporation", + [3]byte{92, 226, 244}: "AcSiP Technology Corp.", + [3]byte{92, 227, 14}: "ARRIS Group, Inc.", + [3]byte{92, 227, 182}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{92, 231, 191}: "New Singularity International Technical Development Co.,Ltd", + [3]byte{92, 232, 183}: "Oraimo Technology Limited", + [3]byte{92, 232, 235}: "Samsung Electronics Co.,Ltd", + [3]byte{92, 234, 29}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{92, 235, 78}: "R. STAHL HMI Systems GmbH", + [3]byte{92, 235, 104}: "Cheerstar Technology Co., Ltd", + [3]byte{92, 238, 121}: "Global Digitech Co LTD", + [3]byte{92, 242, 7}: "Speco Technologies", + [3]byte{92, 242, 134}: "IEEE Registration Authority", + [3]byte{92, 243, 112}: "CC&C Technologies, Inc", + [3]byte{92, 243, 252}: "IBM Corp", + [3]byte{92, 244, 171}: "Zyxel Communications Corporation", + [3]byte{92, 245, 13}: "Institute of microelectronic applications", + [3]byte{92, 245, 218}: "Apple, Inc.", + [3]byte{92, 246, 220}: "Samsung Electronics Co.,Ltd", + [3]byte{92, 247, 195}: "SYNTECH (HK) TECHNOLOGY LIMITED", + [3]byte{92, 247, 230}: "Apple, Inc.", + [3]byte{92, 248, 33}: "Texas Instruments", + [3]byte{92, 248, 161}: "Murata Manufacturing Co., Ltd.", + [3]byte{92, 249, 56}: "Apple, Inc.", + [3]byte{92, 249, 106}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{92, 249, 221}: "Dell Inc.", + [3]byte{92, 249, 240}: "Atomos Engineering P/L", + [3]byte{92, 252, 102}: "Cisco Systems, Inc", + [3]byte{92, 255, 53}: "Wistron Corporation", + [3]byte{92, 255, 255}: "Shenzhen Kezhonglong Optoelectronic Technology Co., Ltd", + [3]byte{96, 1, 148}: "Espressif Inc.", + [3]byte{96, 2, 146}: "PEGATRON CORPORATION", + [3]byte{96, 2, 180}: "Wistron Neweb Corporation", + [3]byte{96, 3, 8}: "Apple, Inc.", + [3]byte{96, 3, 71}: "Billion Electric Co. Ltd.", + [3]byte{96, 4, 23}: "POSBANK CO.,LTD", + [3]byte{96, 8, 16}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{96, 8, 55}: "ivvi Scientific(Nanchang)Co.Ltd", + [3]byte{96, 11, 3}: "Hangzhou H3C Technologies Co., Limited", + [3]byte{96, 15, 119}: "SilverPlus, Inc", + [3]byte{96, 17, 153}: "Siama Systems Inc", + [3]byte{96, 18, 131}: "TSB REAL TIME LOCATION SYSTEMS S.L.", + [3]byte{96, 18, 139}: "CANON INC.", + [3]byte{96, 20, 102}: "zte corporation", + [3]byte{96, 20, 179}: "CyberTAN Technology Inc.", + [3]byte{96, 21, 199}: "IdaTech", + [3]byte{96, 24, 3}: "Daikin Air-conditioning (Shanghai) Co., Ltd.", + [3]byte{96, 24, 46}: "ShenZhen Protruly Electronic Ltd co.", + [3]byte{96, 24, 136}: "zte corporation", + [3]byte{96, 25, 12}: "RRAMAC", + [3]byte{96, 25, 41}: "VOLTRONIC POWER TECHNOLOGY(SHENZHEN) CORP.", + [3]byte{96, 25, 112}: "HUIZHOU QIAOXING ELECTRONICS TECHNOLOGY CO., LTD.", + [3]byte{96, 25, 113}: "ARRIS Group, Inc.", + [3]byte{96, 29, 15}: "Midnite Solar", + [3]byte{96, 30, 2}: "EltexAlatau", + [3]byte{96, 33, 1}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{96, 33, 3}: "I4VINE, INC", + [3]byte{96, 33, 192}: "Murata Manufacturing Co., Ltd.", + [3]byte{96, 36, 193}: "Jiangsu Zhongxun Electronic Technology Co., Ltd", + [3]byte{96, 39, 28}: "VIDEOR E. Hartig GmbH", + [3]byte{96, 42, 84}: "CardioTek B.V.", + [3]byte{96, 42, 208}: "Cisco SPVTG", + [3]byte{96, 46, 32}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{96, 49, 59}: "Sunnovo International Limited", + [3]byte{96, 49, 151}: "Zyxel Communications Corporation", + [3]byte{96, 50, 240}: "Mplus technology", + [3]byte{96, 51, 75}: "Apple, Inc.", + [3]byte{96, 53, 83}: "Buwon Technology", + [3]byte{96, 54, 150}: "The Sapling Company", + [3]byte{96, 54, 221}: "Intel Corporate", + [3]byte{96, 56, 14}: "ALPS ELECTRIC CO.,LTD.", + [3]byte{96, 56, 224}: "Belkin International Inc.", + [3]byte{96, 57, 31}: "ABB Ltd", + [3]byte{96, 61, 38}: "Technicolor CH USA Inc.", + [3]byte{96, 62, 123}: "Gafachi, Inc.", + [3]byte{96, 62, 202}: "Cambridge Medical Robotics Ltd", + [3]byte{96, 63, 197}: "COX CO., LTD", + [3]byte{96, 66, 127}: "SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD", + [3]byte{96, 68, 245}: "Easy Digital Ltd.", + [3]byte{96, 69, 94}: "Liptel s.r.o.", + [3]byte{96, 69, 189}: "Microsoft", + [3]byte{96, 69, 203}: "ASUSTek COMPUTER INC.", + [3]byte{96, 70, 22}: "XIAMEN VANN INTELLIGENT CO., LTD", + [3]byte{96, 71, 98}: "Beijing Sensoro Technology Co.,Ltd.", + [3]byte{96, 71, 212}: "FORICS Electronic Technology Co., Ltd.", + [3]byte{96, 72, 38}: "Newbridge Technologies Int. Ltd.", + [3]byte{96, 73, 193}: "Avaya Inc", + [3]byte{96, 74, 28}: "SUYIN Corporation", + [3]byte{96, 75, 170}: "Private", + [3]byte{96, 80, 193}: "Kinetek Sports", + [3]byte{96, 81, 44}: "TCT mobile ltd", + [3]byte{96, 82, 208}: "FACTS Engineering", + [3]byte{96, 83, 23}: "Sandstone Technologies", + [3]byte{96, 84, 100}: "Eyedro Green Solutions Inc.", + [3]byte{96, 87, 24}: "Intel Corporate", + [3]byte{96, 91, 180}: "AzureWave Technology Inc.", + [3]byte{96, 96, 31}: "SZ DJI TECHNOLOGY CO.,LTD", + [3]byte{96, 99, 249}: "Ciholas, Inc.", + [3]byte{96, 99, 253}: "Transcend Communication Beijing Co.,Ltd.", + [3]byte{96, 100, 5}: "Texas Instruments", + [3]byte{96, 100, 83}: "AOD Co.,Ltd.", + [3]byte{96, 100, 161}: "RADiflow Ltd.", + [3]byte{96, 103, 32}: "Intel Corporate", + [3]byte{96, 105, 68}: "Apple, Inc.", + [3]byte{96, 105, 155}: "isepos GmbH", + [3]byte{96, 107, 189}: "Samsung Electronics Co.,Ltd", + [3]byte{96, 108, 102}: "Intel Corporate", + [3]byte{96, 109, 60}: "Luxshare Precision Industry Company Limited", + [3]byte{96, 109, 199}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{96, 114, 11}: "BLU Products Inc", + [3]byte{96, 115, 92}: "Cisco Systems, Inc", + [3]byte{96, 115, 188}: "zte corporation", + [3]byte{96, 116, 141}: "Atmaca Elektronik", + [3]byte{96, 118, 136}: "Velodyne", + [3]byte{96, 119, 226}: "Samsung Electronics Co.,Ltd", + [3]byte{96, 126, 221}: "Microsoft Mobile Oy", + [3]byte{96, 129, 43}: "Custom Control Concepts", + [3]byte{96, 129, 249}: "Helium Systems, Inc", + [3]byte{96, 131, 52}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{96, 131, 178}: "GkWare e.K.", + [3]byte{96, 132, 59}: "Soladigm, Inc.", + [3]byte{96, 134, 69}: "Avery Weigh-Tronix, LLC", + [3]byte{96, 137, 60}: "Thermo Fisher Scientific P.O.A.", + [3]byte{96, 137, 177}: "Key Digital Systems", + [3]byte{96, 137, 183}: "KAEL MÜHENDİSLİK ELEKTRONİK TİCARET SANAYİ LİMİTED ŞİRKETİ", + [3]byte{96, 140, 43}: "Hanson Technology", + [3]byte{96, 140, 230}: "ARRIS Group, Inc.", + [3]byte{96, 141, 23}: "Sentrus Government Systems Division, Inc", + [3]byte{96, 142, 8}: "Samsung Electronics Co.,Ltd", + [3]byte{96, 143, 92}: "Samsung Electronics Co.,Ltd", + [3]byte{96, 144, 132}: "DSSD Inc", + [3]byte{96, 145, 243}: "vivo Mobile Communication Co., Ltd.", + [3]byte{96, 146, 23}: "Apple, Inc.", + [3]byte{96, 150, 32}: "Private", + [3]byte{96, 153, 209}: "Vuzix / Lenovo", + [3]byte{96, 154, 164}: "GVI SECURITY INC.", + [3]byte{96, 154, 193}: "Apple, Inc.", + [3]byte{96, 155, 200}: "Hipad Intelligent Technology Co., Ltd.", + [3]byte{96, 156, 159}: "Brocade Communications Systems, Inc.", + [3]byte{96, 158, 100}: "Vivonic GmbH", + [3]byte{96, 159, 157}: "CloudSwitch", + [3]byte{96, 161, 10}: "Samsung Electronics Co.,Ltd", + [3]byte{96, 163, 125}: "Apple, Inc.", + [3]byte{96, 164, 76}: "ASUSTek COMPUTER INC.", + [3]byte{96, 164, 208}: "Samsung Electronics Co.,Ltd", + [3]byte{96, 168, 254}: "Nokia", + [3]byte{96, 169, 176}: "Merchandising Technologies, Inc", + [3]byte{96, 172, 200}: "KunTeng Inc.", + [3]byte{96, 175, 109}: "Samsung Electronics Co.,Ltd", + [3]byte{96, 177, 133}: "ATH system", + [3]byte{96, 179, 135}: "Synergics Technologies GmbH", + [3]byte{96, 179, 196}: "Elber Srl", + [3]byte{96, 180, 247}: "Plume Design Inc", + [3]byte{96, 182, 6}: "Phorus", + [3]byte{96, 182, 23}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{96, 185, 51}: "Deutron Electronics Corp.", + [3]byte{96, 185, 130}: "RO.VE.R. Laboratories S.p.A.", + [3]byte{96, 186, 24}: "nextLAP GmbH", + [3]byte{96, 187, 12}: "Beijing HuaqinWorld Technology Co,Ltd", + [3]byte{96, 188, 76}: "EWM Hightec Welding GmbH", + [3]byte{96, 189, 145}: "Move Innovation", + [3]byte{96, 190, 181}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{96, 192, 191}: "ON Semiconductor", + [3]byte{96, 193, 203}: "Fujian Great Power PLC Equipment Co.,Ltd", + [3]byte{96, 195, 151}: "2Wire Inc", + [3]byte{96, 197, 71}: "Apple, Inc.", + [3]byte{96, 197, 168}: "Beijing LT Honway Technology Co.,Ltd", + [3]byte{96, 197, 173}: "Samsung Electronics Co.,Ltd", + [3]byte{96, 198, 88}: "PHYTRONIX Co.,Ltd.", + [3]byte{96, 199, 152}: "Verifone", + [3]byte{96, 201, 128}: "Trymus", + [3]byte{96, 203, 251}: "AirScape Inc.", + [3]byte{96, 205, 169}: "Abloomy", + [3]byte{96, 205, 197}: "Taiwan Carol Electronics., Ltd", + [3]byte{96, 208, 169}: "Samsung Electronics Co.,Ltd", + [3]byte{96, 209, 170}: "Vishal Telecommunications Pvt Ltd", + [3]byte{96, 210, 98}: "Tzukuri Pty Ltd", + [3]byte{96, 210, 185}: "REALAND BIO CO., LTD.", + [3]byte{96, 211, 10}: "Quatius Limited", + [3]byte{96, 215, 227}: "IEEE Registration Authority", + [3]byte{96, 216, 25}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{96, 217, 160}: "Lenovo Mobile Communication Technology Ltd.", + [3]byte{96, 217, 199}: "Apple, Inc.", + [3]byte{96, 218, 35}: "Estech Co.,Ltd", + [3]byte{96, 218, 131}: "Hangzhou H3C Technologies Co., Limited", + [3]byte{96, 219, 42}: "HNS", + [3]byte{96, 222, 68}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{96, 224, 14}: "SHINSEI ELECTRONICS CO LTD", + [3]byte{96, 227, 39}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{96, 227, 172}: "LG Electronics (Mobile Communications)", + [3]byte{96, 230, 188}: "Sino-Telecom Technology Co.,Ltd.", + [3]byte{96, 231, 1}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{96, 231, 138}: "UNISEM", + [3]byte{96, 233, 86}: "Ayla Networks, Inc", + [3]byte{96, 235, 105}: "QUANTA COMPUTER INC.", + [3]byte{96, 238, 92}: "SHENZHEN FAST TECHNOLOGIES CO.,LTD", + [3]byte{96, 239, 198}: "Shenzhen Chima Technologies Co Limited", + [3]byte{96, 241, 61}: "JABLOCOM s.r.o.", + [3]byte{96, 241, 137}: "Murata Manufacturing Co., Ltd.", + [3]byte{96, 242, 129}: "TRANWO TECHNOLOGY CO., LTD.", + [3]byte{96, 242, 239}: "VisionVera International Co., Ltd.", + [3]byte{96, 243, 218}: "Logic Way GmbH", + [3]byte{96, 244, 69}: "Apple, Inc.", + [3]byte{96, 244, 148}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{96, 245, 156}: "CRU-Dataport", + [3]byte{96, 246, 115}: "TERUMO CORPORATION", + [3]byte{96, 246, 119}: "Intel Corporate", + [3]byte{96, 248, 29}: "Apple, Inc.", + [3]byte{96, 250, 205}: "Apple, Inc.", + [3]byte{96, 251, 66}: "Apple, Inc.", + [3]byte{96, 253, 86}: "WOORISYSTEMS CO., Ltd", + [3]byte{96, 254, 30}: "China Palms Telecom.Ltd", + [3]byte{96, 254, 32}: "2Wire Inc", + [3]byte{96, 254, 197}: "Apple, Inc.", + [3]byte{96, 254, 249}: "Thomas & Betts", + [3]byte{96, 255, 221}: "C.E. ELECTRONICS, INC", + [3]byte{100, 0, 45}: "Powerlinq Co., LTD", + [3]byte{100, 0, 106}: "Dell Inc.", + [3]byte{100, 0, 241}: "Cisco Systems, Inc", + [3]byte{100, 5, 190}: "NEW LIGHT LED", + [3]byte{100, 5, 233}: "Shenzhen WayOS Technology Crop., Ltd.", + [3]byte{100, 9, 76}: "Beijing Superbee Wireless Technology Co.,Ltd", + [3]byte{100, 9, 128}: "Xiaomi Communications Co Ltd", + [3]byte{100, 11, 74}: "Digital Telecom Technology Limited", + [3]byte{100, 13, 206}: "SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.", + [3]byte{100, 13, 230}: "Petra Systems", + [3]byte{100, 14, 54}: "TAZTAG", + [3]byte{100, 14, 148}: "Pluribus Networks, Inc.", + [3]byte{100, 15, 40}: "2Wire Inc", + [3]byte{100, 16, 132}: "HEXIUM Technical Development Co., Ltd.", + [3]byte{100, 18, 37}: "Cisco Systems, Inc", + [3]byte{100, 18, 105}: "ARRIS Group, Inc.", + [3]byte{100, 19, 108}: "zte corporation", + [3]byte{100, 22, 102}: "Nest Labs Inc.", + [3]byte{100, 22, 127}: "Polycom", + [3]byte{100, 22, 141}: "Cisco Systems, Inc", + [3]byte{100, 22, 240}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{100, 26, 34}: "Heliospectra AB", + [3]byte{100, 28, 103}: "DIGIBRAS INDUSTRIA DO BRASILS/A", + [3]byte{100, 30, 129}: "Dowslake Microsystems", + [3]byte{100, 32, 12}: "Apple, Inc.", + [3]byte{100, 32, 159}: "Tilgin AB", + [3]byte{100, 33, 132}: "Nippon Denki Kagaku Co.,LTD", + [3]byte{100, 34, 22}: "Shandong Taixin Electronic co.,Ltd", + [3]byte{100, 36, 0}: "Xorcom Ltd.", + [3]byte{100, 39, 55}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{100, 43, 138}: "ALL BEST Industrial Co., Ltd.", + [3]byte{100, 45, 183}: "SEUNGIL ELECTRONICS", + [3]byte{100, 49, 80}: "Hewlett Packard", + [3]byte{100, 49, 126}: "Dexin Corporation", + [3]byte{100, 50, 168}: "Intel Corporate", + [3]byte{100, 52, 9}: "BITwave Pte Ltd", + [3]byte{100, 53, 28}: "e-CON SYSTEMS INDIA PVT LTD", + [3]byte{100, 58, 177}: "SICHUAN TIANYI COMHEART TELECOMCO.,LTD", + [3]byte{100, 62, 140}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{100, 63, 95}: "Exablaze", + [3]byte{100, 66, 20}: "Swisscom Energy Solutions AG", + [3]byte{100, 67, 70}: "GuangDong Quick Network Computer CO.,LTD", + [3]byte{100, 71, 224}: "Feitian Technologies Co., Ltd", + [3]byte{100, 75, 195}: "Shanghai WOASiS Telecommunications Ltd., Co.", + [3]byte{100, 75, 240}: "CalDigit, Inc", + [3]byte{100, 77, 112}: "dSPACE GmbH", + [3]byte{100, 79, 116}: "LENUS Co., Ltd.", + [3]byte{100, 79, 176}: "Hyunjin.com", + [3]byte{100, 81, 6}: "Hewlett Packard", + [3]byte{100, 81, 126}: "LONG BEN (DONGGUAN) ELECTRONIC TECHNOLOGY CO.,LTD.", + [3]byte{100, 82, 153}: "The Chamberlain Group, Inc", + [3]byte{100, 83, 93}: "Frauscher Sensortechnik", + [3]byte{100, 84, 34}: "Equinox Payments", + [3]byte{100, 85, 99}: "Intelight Inc.", + [3]byte{100, 85, 127}: "NSFOCUS Information Technology Co., Ltd.", + [3]byte{100, 85, 177}: "ARRIS Group, Inc.", + [3]byte{100, 86, 1}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{100, 89, 248}: "Vodafone Omnitel B.V.", + [3]byte{100, 90, 4}: "Chicony Electronics Co., Ltd.", + [3]byte{100, 93, 146}: "SICHUAN TIANYI COMHEART TELECOMCO.,LTD", + [3]byte{100, 93, 215}: "Shenzhen Lifesense Medical Electronics Co., Ltd.", + [3]byte{100, 94, 190}: "Yahoo! JAPAN", + [3]byte{100, 95, 255}: "Nicolet Neuro", + [3]byte{100, 97, 132}: "VELUX", + [3]byte{100, 98, 35}: "Cellient Co., Ltd.", + [3]byte{100, 100, 155}: "Juniper Networks", + [3]byte{100, 101, 192}: "Nuvon, Inc", + [3]byte{100, 102, 179}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{100, 103, 7}: "Beijing Omnific Technology, Ltd.", + [3]byte{100, 104, 12}: "Comtrend Corporation", + [3]byte{100, 105, 188}: "Hytera Communications Co .,ltd", + [3]byte{100, 106, 82}: "Avaya Inc", + [3]byte{100, 106, 116}: "AUTH-SERVERS, LLC", + [3]byte{100, 108, 178}: "Samsung Electronics Co.,Ltd", + [3]byte{100, 110, 105}: "Liteon Technology Corporation", + [3]byte{100, 110, 108}: "Radio Datacom LLC", + [3]byte{100, 110, 234}: "Iskratel d.o.o.", + [3]byte{100, 112, 2}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{100, 114, 216}: "GooWi Technology Co.,Limited", + [3]byte{100, 115, 226}: "Arbiter Systems, Inc.", + [3]byte{100, 116, 246}: "Shooter Detection Systems", + [3]byte{100, 118, 87}: "Innovative Security Designs", + [3]byte{100, 118, 186}: "Apple, Inc.", + [3]byte{100, 119, 125}: "Hitron Technologies. Inc", + [3]byte{100, 119, 145}: "Samsung Electronics Co.,Ltd", + [3]byte{100, 121, 167}: "Phison Electronics Corp.", + [3]byte{100, 123, 212}: "Texas Instruments", + [3]byte{100, 124, 52}: "Ubee Interactive Co., Limited", + [3]byte{100, 125, 129}: "YOKOTA INDUSTRIAL CO,.LTD", + [3]byte{100, 127, 218}: "TEKTELIC Communications Inc.", + [3]byte{100, 128, 139}: "VG Controls, Inc.", + [3]byte{100, 128, 153}: "Intel Corporate", + [3]byte{100, 129, 37}: "Alphatron Marine BV", + [3]byte{100, 135, 136}: "Juniper Networks", + [3]byte{100, 135, 215}: "ADB Broadband Italia", + [3]byte{100, 136, 255}: "Sichuan Changhong Electric Ltd.", + [3]byte{100, 137, 154}: "LG Electronics (Mobile Communications)", + [3]byte{100, 141, 158}: "IVT Electronic Co.,Ltd", + [3]byte{100, 153, 93}: "LGE", + [3]byte{100, 153, 104}: "Elentec", + [3]byte{100, 153, 160}: "AG Elektronik AB", + [3]byte{100, 154, 8}: "Shenzhen SuperElectron Technology Co.,LTD", + [3]byte{100, 154, 18}: "P2 Mobile Technologies Limited", + [3]byte{100, 154, 190}: "Apple, Inc.", + [3]byte{100, 155, 36}: "V Technology Co., Ltd.", + [3]byte{100, 156, 129}: "Qualcomm Inc.", + [3]byte{100, 156, 142}: "Texas Instruments", + [3]byte{100, 158, 243}: "Cisco Systems, Inc", + [3]byte{100, 159, 247}: "Kone OYj", + [3]byte{100, 160, 231}: "Cisco Systems, Inc", + [3]byte{100, 162, 50}: "OOO Samlight", + [3]byte{100, 163, 65}: "Wonderlan (Beijing) Technology Co., Ltd.", + [3]byte{100, 163, 203}: "Apple, Inc.", + [3]byte{100, 165, 195}: "Apple, Inc.", + [3]byte{100, 166, 81}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{100, 166, 143}: "Zhongshan Readboy Electronics Co.,Ltd", + [3]byte{100, 167, 105}: "HTC Corporation", + [3]byte{100, 167, 221}: "Avaya Inc", + [3]byte{100, 168, 55}: "Juni Korea Co., Ltd", + [3]byte{100, 174, 12}: "Cisco Systems, Inc", + [3]byte{100, 174, 136}: "Polytec GmbH", + [3]byte{100, 176, 166}: "Apple, Inc.", + [3]byte{100, 178, 29}: "Chengdu Phycom Tech Co., Ltd.", + [3]byte{100, 179, 16}: "Samsung Electronics Co.,Ltd", + [3]byte{100, 179, 112}: "PowerComm Solutions LLC", + [3]byte{100, 180, 115}: "Xiaomi Communications Co Ltd", + [3]byte{100, 181, 198}: "Nintendo Co.,Ltd", + [3]byte{100, 182, 74}: "ViVOtech, Inc.", + [3]byte{100, 184, 83}: "Samsung Electronics Co.,Ltd", + [3]byte{100, 185, 232}: "Apple, Inc.", + [3]byte{100, 186, 189}: "SDJ Technologies, Inc.", + [3]byte{100, 188, 12}: "LG Electronics (Mobile Communications)", + [3]byte{100, 188, 17}: "CombiQ AB", + [3]byte{100, 195, 84}: "Avaya Inc", + [3]byte{100, 197, 170}: "South African Broadcasting Corporation", + [3]byte{100, 198, 103}: "Barnes&Noble", + [3]byte{100, 198, 175}: "AXERRA Networks Ltd", + [3]byte{100, 201, 68}: "LARK Technologies, Inc", + [3]byte{100, 203, 163}: "Pointmobile", + [3]byte{100, 204, 46}: "Xiaomi Communications Co Ltd", + [3]byte{100, 207, 217}: "Texas Instruments", + [3]byte{100, 208, 45}: "Next Generation Integration (NGI)", + [3]byte{100, 209, 84}: "Routerboard.com", + [3]byte{100, 209, 163}: "Sitecom Europe BV", + [3]byte{100, 210, 65}: "Keith & Koep GmbH", + [3]byte{100, 212, 189}: "ALPS ELECTRIC CO.,LTD.", + [3]byte{100, 212, 218}: "Intel Corporate", + [3]byte{100, 216, 20}: "Cisco Systems, Inc", + [3]byte{100, 217, 18}: "Solidica, Inc.", + [3]byte{100, 217, 84}: "Taicang T&W Electronics", + [3]byte{100, 217, 137}: "Cisco Systems, Inc", + [3]byte{100, 218, 160}: "Robert Bosch Smart Home GmbH", + [3]byte{100, 219, 24}: "OpenPattern", + [3]byte{100, 219, 67}: "Motorola (Wuhan) Mobility Technologies Communication Co., Ltd.", + [3]byte{100, 219, 129}: "Syszone Co., Ltd.", + [3]byte{100, 219, 160}: "Select Comfort", + [3]byte{100, 220, 1}: "Static Systems Group PLC", + [3]byte{100, 222, 28}: "Kingnetic Pte Ltd", + [3]byte{100, 223, 233}: "ATEME", + [3]byte{100, 225, 97}: "DEP Corp.", + [3]byte{100, 229, 153}: "EFM Networks", + [3]byte{100, 230, 37}: "Woxu Wireless Co., Ltd", + [3]byte{100, 230, 130}: "Apple, Inc.", + [3]byte{100, 232, 79}: "Serialway Communication Technology Co. Ltd", + [3]byte{100, 232, 146}: "Morio Denki Co., Ltd.", + [3]byte{100, 232, 230}: "global moisture management system", + [3]byte{100, 233, 80}: "Cisco Systems, Inc", + [3]byte{100, 234, 197}: "SiboTech Automation Co., Ltd.", + [3]byte{100, 235, 140}: "Seiko Epson Corporation", + [3]byte{100, 237, 87}: "ARRIS Group, Inc.", + [3]byte{100, 237, 98}: "WOORI SYSTEMS Co., Ltd", + [3]byte{100, 242, 66}: "Gerdes Aktiengesellschaft", + [3]byte{100, 245, 14}: "Kinion Technology Company Limited", + [3]byte{100, 246, 157}: "Cisco Systems, Inc", + [3]byte{100, 248, 138}: "China Mobile IOT Company Limited", + [3]byte{100, 249, 112}: "Kenade Electronics Technology Co.,LTD.", + [3]byte{100, 249, 135}: "Avvasi Inc.", + [3]byte{100, 251, 80}: "RoomReady/Zdi, Inc.", + [3]byte{100, 251, 129}: "IEEE Registration Authority", + [3]byte{100, 252, 140}: "Zonar Systems", + [3]byte{104, 2, 53}: "Konten Networks Inc.", + [3]byte{104, 5, 113}: "Samsung Electronics Co.,Ltd", + [3]byte{104, 5, 202}: "Intel Corporate", + [3]byte{104, 7, 21}: "Intel Corporate", + [3]byte{104, 9, 39}: "Apple, Inc.", + [3]byte{104, 10, 215}: "Yancheng Kecheng Optoelectronic Technology Co., Ltd", + [3]byte{104, 18, 45}: "Special Instrument Development Co., Ltd.", + [3]byte{104, 18, 149}: "Lupine Lighting Systems GmbH", + [3]byte{104, 20, 1}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{104, 21, 144}: "Sagemcom Broadband SAS", + [3]byte{104, 21, 211}: "Zaklady Elektroniki i Mechaniki Precyzyjnej R&G S.A.", + [3]byte{104, 22, 5}: "Systems And Electronic Development FZCO", + [3]byte{104, 23, 41}: "Intel Corporate", + [3]byte{104, 25, 63}: "Digital Airways", + [3]byte{104, 26, 178}: "zte corporation", + [3]byte{104, 28, 162}: "Rosewill Inc.", + [3]byte{104, 29, 100}: "Sunwave Communications Co., Ltd", + [3]byte{104, 29, 239}: "Shenzhen CYX Technology Co., Ltd.", + [3]byte{104, 30, 139}: "InfoSight Corporation", + [3]byte{104, 31, 64}: "Blu Wireless Technology Ltd", + [3]byte{104, 31, 216}: "Siemens Industry, Inc.", + [3]byte{104, 35, 75}: "Nihon Dengyo Kousaku", + [3]byte{104, 38, 42}: "SICHUAN TIANYI COMHEART TELECOMCO., LTD", + [3]byte{104, 39, 55}: "Samsung Electronics Co.,Ltd", + [3]byte{104, 40, 186}: "Dejai", + [3]byte{104, 40, 246}: "Vubiq Networks, Inc.", + [3]byte{104, 45, 220}: "Wuhan Changjiang Electro-Communication Equipment CO.,LTD", + [3]byte{104, 49, 254}: "Teladin Co.,Ltd.", + [3]byte{104, 53, 99}: "SHENZHEN LIOWN ELECTRONICS CO.,LTD.", + [3]byte{104, 54, 181}: "DriveScale, Inc.", + [3]byte{104, 55, 233}: "Amazon Technologies Inc.", + [3]byte{104, 59, 30}: "Countwise LTD", + [3]byte{104, 60, 125}: "Magic Intelligence Technology Limited", + [3]byte{104, 62, 2}: "SIEMENS AG, Digital Factory, Motion Control System", + [3]byte{104, 62, 52}: "MEIZU Technology Co., Ltd.", + [3]byte{104, 62, 236}: "ERECA", + [3]byte{104, 67, 82}: "Bhuu Limited", + [3]byte{104, 72, 152}: "Samsung Electronics Co.,Ltd", + [3]byte{104, 75, 136}: "Galtronics Telemetry Inc.", + [3]byte{104, 76, 168}: "Shenzhen Herotel Tech. Co., Ltd.", + [3]byte{104, 81, 183}: "PowerCloud Systems, Inc.", + [3]byte{104, 83, 108}: "SPnS Co.,Ltd", + [3]byte{104, 83, 136}: "P&S Technology", + [3]byte{104, 84, 193}: "ColorTokens, Inc.", + [3]byte{104, 84, 237}: "Alcatel-Lucent", + [3]byte{104, 84, 245}: "enLighted Inc", + [3]byte{104, 84, 253}: "Amazon Technologies Inc.", + [3]byte{104, 88, 197}: "ZF TRW Automotive", + [3]byte{104, 89, 127}: "Alcatel Lucent", + [3]byte{104, 91, 53}: "Apple, Inc.", + [3]byte{104, 91, 54}: "POWERTECH INDUSTRIAL CO., LTD.", + [3]byte{104, 93, 67}: "Intel Corporate", + [3]byte{104, 94, 107}: "PowerRay Co., Ltd.", + [3]byte{104, 99, 89}: "Advanced Digital Broadcast SA", + [3]byte{104, 100, 75}: "Apple, Inc.", + [3]byte{104, 105, 46}: "Zycoo Co.,Ltd", + [3]byte{104, 105, 117}: "Angler Labs Inc", + [3]byte{104, 105, 242}: "ComAp s.r.o.", + [3]byte{104, 110, 35}: "Wi3 Inc.", + [3]byte{104, 110, 72}: "Prophet Electronic Technology Corp.,Ltd", + [3]byte{104, 114, 81}: "Ubiquiti Networks Inc.", + [3]byte{104, 114, 220}: "CETORY.TV Company Limited", + [3]byte{104, 118, 79}: "Sony Mobile Communications AB", + [3]byte{104, 120, 72}: "Westunitis Co., Ltd.", + [3]byte{104, 120, 76}: "Nortel Networks", + [3]byte{104, 121, 36}: "ELS-GmbH & Co. KG", + [3]byte{104, 121, 237}: "SHARP Corporation", + [3]byte{104, 124, 200}: "Measurement Systems S. de R.L.", + [3]byte{104, 124, 213}: "Y Soft Corporation, a.s.", + [3]byte{104, 127, 116}: "Cisco-Linksys, LLC", + [3]byte{104, 131, 26}: "Pandora Mobility Corporation", + [3]byte{104, 132, 112}: "eSSys Co.,Ltd", + [3]byte{104, 133, 64}: "IGI Mobile, Inc.", + [3]byte{104, 133, 106}: "OuterLink Corporation", + [3]byte{104, 134, 167}: "Cisco Systems, Inc", + [3]byte{104, 134, 231}: "Orbotix, Inc.", + [3]byte{104, 135, 107}: "INQ Mobile Limited", + [3]byte{104, 137, 193}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{104, 138, 181}: "EDP Servicos", + [3]byte{104, 138, 240}: "zte corporation", + [3]byte{104, 141, 182}: "AETEK INC.", + [3]byte{104, 143, 132}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{104, 145, 208}: "IEEE Registration Authority", + [3]byte{104, 146, 52}: "Ruckus Wireless", + [3]byte{104, 147, 97}: "Integrated Device Technology (Malaysia) Sdn. Bhd.", + [3]byte{104, 148, 35}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{104, 150, 123}: "Apple, Inc.", + [3]byte{104, 151, 75}: "Shenzhen Costar Electronics Co. Ltd.", + [3]byte{104, 151, 232}: "Society of Motion Picture & Television Engineers", + [3]byte{104, 153, 205}: "Cisco Systems, Inc", + [3]byte{104, 154, 183}: "Atelier Vision Corporation", + [3]byte{104, 156, 94}: "AcSiP Technology Corp.", + [3]byte{104, 156, 112}: "Apple, Inc.", + [3]byte{104, 156, 226}: "Cisco Systems, Inc", + [3]byte{104, 158, 25}: "Texas Instruments", + [3]byte{104, 159, 240}: "zte corporation", + [3]byte{104, 160, 246}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{104, 161, 183}: "Honghao Mingchuan Technology (Beijing) CO.,Ltd.", + [3]byte{104, 163, 120}: "FREEBOX SAS", + [3]byte{104, 163, 196}: "Liteon Technology Corporation", + [3]byte{104, 164, 14}: "BSH Hausgeräte GmbH", + [3]byte{104, 166, 130}: "Shenzhen YOUHUA Technology Co., Ltd", + [3]byte{104, 168, 40}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{104, 168, 109}: "Apple, Inc.", + [3]byte{104, 170, 210}: "DATECS LTD.,", + [3]byte{104, 171, 138}: "RF IDeas", + [3]byte{104, 174, 32}: "Apple, Inc.", + [3]byte{104, 175, 19}: "Futura Mobility", + [3]byte{104, 176, 148}: "INESA ELECTRON CO.,LTD", + [3]byte{104, 179, 94}: "Shenzhen Neostra Technology Co.Ltd", + [3]byte{104, 180, 58}: "WaterFurnace International, Inc.", + [3]byte{104, 181, 153}: "Hewlett Packard", + [3]byte{104, 182, 252}: "Hitron Technologies. Inc", + [3]byte{104, 184, 217}: "Act KDE, Inc.", + [3]byte{104, 185, 131}: "b-plus GmbH", + [3]byte{104, 188, 12}: "Cisco Systems, Inc", + [3]byte{104, 189, 171}: "Cisco Systems, Inc", + [3]byte{104, 196, 77}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{104, 198, 58}: "Espressif Inc.", + [3]byte{104, 201, 11}: "Texas Instruments", + [3]byte{104, 202, 0}: "Octopus Systems Limited", + [3]byte{104, 204, 110}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{104, 204, 156}: "Mine Site Technologies", + [3]byte{104, 205, 15}: "U Tek Company Limited", + [3]byte{104, 206, 78}: "L-3 Communications Infrared Products", + [3]byte{104, 209, 253}: "Shenzhen Trimax Technology Co.,Ltd", + [3]byte{104, 210, 71}: "Portalis LC", + [3]byte{104, 217, 37}: "ProSys Development Services", + [3]byte{104, 217, 60}: "Apple, Inc.", + [3]byte{104, 219, 84}: "Phicomm (Shanghai) Co., Ltd.", + [3]byte{104, 219, 103}: "Nantong Coship Electronics Co., Ltd", + [3]byte{104, 219, 150}: "OPWILL Technologies CO .,LTD", + [3]byte{104, 219, 202}: "Apple, Inc.", + [3]byte{104, 220, 232}: "PacketStorm Communications", + [3]byte{104, 223, 221}: "Xiaomi Communications Co Ltd", + [3]byte{104, 225, 102}: "Private", + [3]byte{104, 228, 31}: "Unglaube Identech GmbH", + [3]byte{104, 232, 235}: "Linktel Technologies Co.,Ltd", + [3]byte{104, 235, 174}: "Samsung Electronics Co.,Ltd", + [3]byte{104, 235, 197}: "Angstrem Telecom", + [3]byte{104, 236, 98}: "YODO Technology Corp. Ltd.", + [3]byte{104, 236, 197}: "Intel Corporate", + [3]byte{104, 237, 67}: "BlackBerry RTS", + [3]byte{104, 237, 164}: "Shenzhen Seavo Technology Co.,Ltd", + [3]byte{104, 238, 150}: "Cisco SPVTG", + [3]byte{104, 239, 189}: "Cisco Systems, Inc", + [3]byte{104, 240, 109}: "ALONG INDUSTRIAL CO., LIMITED", + [3]byte{104, 240, 188}: "Shenzhen LiWiFi Technology Co., Ltd", + [3]byte{104, 241, 37}: "Data Controls Inc.", + [3]byte{104, 247, 40}: "LCFC(HeFei) Electronics Technology co., ltd", + [3]byte{104, 248, 149}: "Redflow Limited", + [3]byte{104, 249, 86}: "Objetivos y Servicio de Valor Añadido", + [3]byte{104, 251, 126}: "Apple, Inc.", + [3]byte{104, 251, 149}: "Generalplus Technology Inc.", + [3]byte{104, 252, 179}: "Next Level Security Systems, Inc.", + [3]byte{108, 2, 115}: "Shenzhen Jin Yun Video Equipment Co., Ltd.", + [3]byte{108, 4, 96}: "RBH Access Technologies Inc.", + [3]byte{108, 5, 213}: "Ethertronics Inc", + [3]byte{108, 9, 10}: "GEMATICA SRL", + [3]byte{108, 9, 214}: "Digiquest Electronics LTD", + [3]byte{108, 11, 132}: "Universal Global Scientific Industrial Co., Ltd.", + [3]byte{108, 14, 13}: "Sony Mobile Communications AB", + [3]byte{108, 14, 230}: "Chengdu Xiyida Electronic Technology Co,.Ltd", + [3]byte{108, 15, 106}: "JDC Tech Co., Ltd.", + [3]byte{108, 20, 247}: "Erhardt+Leimer GmbH", + [3]byte{108, 21, 249}: "Nautronix Limited", + [3]byte{108, 22, 14}: "ShotTracker", + [3]byte{108, 24, 17}: "Decatur Electronics", + [3]byte{108, 25, 143}: "D-Link International", + [3]byte{108, 25, 192}: "Apple, Inc.", + [3]byte{108, 30, 112}: "Guangzhou YBDS IT Co.,Ltd", + [3]byte{108, 30, 144}: "Hansol Technics Co., Ltd.", + [3]byte{108, 32, 86}: "Cisco Systems, Inc", + [3]byte{108, 34, 171}: "Ainsworth Game Technology", + [3]byte{108, 35, 185}: "Sony Mobile Communications AB", + [3]byte{108, 36, 131}: "Microsoft Mobile Oy", + [3]byte{108, 37, 185}: "BBK EDUCATIONAL ELECTRONICS CORP.,LTD.", + [3]byte{108, 39, 121}: "Microsoft Mobile Oy", + [3]byte{108, 41, 149}: "Intel Corporate", + [3]byte{108, 42, 203}: "Paxton Access Ltd", + [3]byte{108, 44, 6}: "OOO NPP Systemotechnika-NN", + [3]byte{108, 46, 51}: "Accelink Technologies Co.,Ltd.", + [3]byte{108, 46, 114}: "B&B EXPORTING LIMITED", + [3]byte{108, 46, 133}: "Sagemcom Broadband SAS", + [3]byte{108, 47, 44}: "Samsung Electronics Co.,Ltd", + [3]byte{108, 50, 222}: "Indieon Technologies Pvt. Ltd.", + [3]byte{108, 51, 169}: "Magicjack LP", + [3]byte{108, 56, 161}: "Ubee Interactive Co., Limited", + [3]byte{108, 57, 29}: "Beijing ZhongHuaHun Network Information center", + [3]byte{108, 58, 132}: "Shenzhen Aero-Startech. Co.Ltd", + [3]byte{108, 59, 107}: "Routerboard.com", + [3]byte{108, 59, 229}: "Hewlett Packard", + [3]byte{108, 60, 83}: "SoundHawk Corp", + [3]byte{108, 62, 109}: "Apple, Inc.", + [3]byte{108, 62, 156}: "KE Knestel Elektronik GmbH", + [3]byte{108, 64, 8}: "Apple, Inc.", + [3]byte{108, 64, 198}: "Nimbus Data Systems, Inc.", + [3]byte{108, 65, 106}: "Cisco Systems, Inc", + [3]byte{108, 68, 24}: "Zappware", + [3]byte{108, 69, 152}: "Antex Electronic Corp.", + [3]byte{108, 73, 193}: "o2ones Co., Ltd.", + [3]byte{108, 74, 57}: "BITA", + [3]byte{108, 75, 127}: "Vossloh-Schwabe Deutschland GmbH", + [3]byte{108, 75, 144}: "LiteON", + [3]byte{108, 78, 134}: "Third Millennium Systems Ltd.", + [3]byte{108, 80, 77}: "Cisco Systems, Inc", + [3]byte{108, 86, 151}: "Amazon Technologies Inc.", + [3]byte{108, 87, 121}: "Aclima, Inc.", + [3]byte{108, 89, 64}: "SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.", + [3]byte{108, 89, 118}: "Shanghai Tricheer Technology Co.,Ltd.", + [3]byte{108, 90, 52}: "Shenzhen Haitianxiong Electronic Co., Ltd.", + [3]byte{108, 90, 181}: "TCL Technoly Electronics (Huizhou) Co., Ltd.", + [3]byte{108, 92, 20}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{108, 92, 222}: "SunReports, Inc.", + [3]byte{108, 93, 99}: "ShenZhen Rapoo Technology Co., Ltd.", + [3]byte{108, 94, 122}: "Ubiquitous Internet Telecom Co., Ltd", + [3]byte{108, 95, 28}: "Lenovo Mobile Communication Technology Ltd.", + [3]byte{108, 96, 235}: "ZHI YUAN ELECTRONICS CO., LIMITED", + [3]byte{108, 97, 38}: "Rinicom Holdings", + [3]byte{108, 98, 109}: "Micro-Star INT'L CO., LTD", + [3]byte{108, 100, 26}: "Penguin Computing", + [3]byte{108, 110, 254}: "Core Logic Inc.", + [3]byte{108, 111, 24}: "Stereotaxis, Inc.", + [3]byte{108, 112, 57}: "Novar GmbH", + [3]byte{108, 112, 159}: "Apple, Inc.", + [3]byte{108, 113, 189}: "EZELINK TELECOM", + [3]byte{108, 113, 217}: "AzureWave Technology Inc.", + [3]byte{108, 114, 32}: "D-Link International", + [3]byte{108, 114, 231}: "Apple, Inc.", + [3]byte{108, 117, 13}: "WiFiSONG", + [3]byte{108, 118, 96}: "KYOCERA CORPORATION", + [3]byte{108, 129, 254}: "Mitsuba Corporation", + [3]byte{108, 131, 54}: "Samsung Electronics Co.,Ltd", + [3]byte{108, 131, 102}: "Nanjing SAC Power Grid Automation Co., Ltd.", + [3]byte{108, 134, 134}: "Technonia", + [3]byte{108, 136, 20}: "Intel Corporate", + [3]byte{108, 139, 47}: "zte corporation", + [3]byte{108, 140, 219}: "Otus Technologies Ltd", + [3]byte{108, 141, 101}: "Wireless Glue Networks, Inc.", + [3]byte{108, 141, 193}: "Apple, Inc.", + [3]byte{108, 143, 181}: "Microsoft Mobile Oy", + [3]byte{108, 144, 177}: "SanLogic Inc", + [3]byte{108, 146, 191}: "Inspur Electronic Information Industry Co.,Ltd.", + [3]byte{108, 147, 84}: "Yaojin Technology (Shenzhen) Co., LTD.", + [3]byte{108, 148, 248}: "Apple, Inc.", + [3]byte{108, 149, 34}: "Scalys", + [3]byte{108, 150, 207}: "Apple, Inc.", + [3]byte{108, 152, 235}: "Riverbed Technology, Inc.", + [3]byte{108, 153, 137}: "Cisco Systems, Inc", + [3]byte{108, 154, 201}: "Valentine Research, Inc.", + [3]byte{108, 155, 2}: "Nokia Corporation", + [3]byte{108, 156, 233}: "Nimble Storage", + [3]byte{108, 156, 237}: "Cisco Systems, Inc", + [3]byte{108, 161, 0}: "Intel Corporate", + [3]byte{108, 166, 130}: "EDAM information & communications", + [3]byte{108, 167, 95}: "zte corporation", + [3]byte{108, 167, 128}: "Nokia Corporation", + [3]byte{108, 167, 250}: "YOUNGBO ENGINEERING INC.", + [3]byte{108, 168, 73}: "Avaya Inc", + [3]byte{108, 168, 88}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{108, 169, 6}: "Telefield Ltd", + [3]byte{108, 169, 111}: "TransPacket AS", + [3]byte{108, 170, 179}: "Ruckus Wireless", + [3]byte{108, 171, 49}: "Apple, Inc.", + [3]byte{108, 171, 77}: "Digital Payment Technologies", + [3]byte{108, 172, 96}: "Venetex Corp", + [3]byte{108, 173, 63}: "Hubbell Building Automation, Inc.", + [3]byte{108, 173, 239}: "KZ Broadband Technologies, Ltd.", + [3]byte{108, 173, 248}: "AzureWave Technology Inc.", + [3]byte{108, 174, 139}: "IBM Corporation", + [3]byte{108, 176, 206}: "NETGEAR", + [3]byte{108, 178, 39}: "Sony Video & Sound Products Inc.", + [3]byte{108, 178, 174}: "Cisco Systems, Inc", + [3]byte{108, 179, 17}: "Shenzhen Lianrui Electronics Co.,Ltd", + [3]byte{108, 179, 80}: "Anhui comhigher tech co.,ltd", + [3]byte{108, 180, 167}: "Landauer, Inc.", + [3]byte{108, 181, 107}: "HUMAX Co., Ltd.", + [3]byte{108, 183, 73}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{108, 183, 244}: "Samsung Electronics Co.,Ltd", + [3]byte{108, 185, 197}: "Delta Networks, Inc.", + [3]byte{108, 190, 233}: "Alcatel-Lucent IPD", + [3]byte{108, 191, 181}: "Noon Technology Co., Ltd", + [3]byte{108, 193, 71}: "Xiamen Hanin Electronic Technology Co., Ltd", + [3]byte{108, 193, 210}: "ARRIS Group, Inc.", + [3]byte{108, 194, 23}: "Hewlett Packard", + [3]byte{108, 194, 107}: "Apple, Inc.", + [3]byte{108, 202, 8}: "ARRIS Group, Inc.", + [3]byte{108, 208, 50}: "LG Electronics", + [3]byte{108, 209, 70}: "Smartek d.o.o.", + [3]byte{108, 209, 176}: "WING SING ELECTRONICS HONG KONG LIMITED", + [3]byte{108, 214, 138}: "LG Electronics (Mobile Communications)", + [3]byte{108, 220, 106}: "Promethean Limited", + [3]byte{108, 221, 48}: "Cisco Systems, Inc", + [3]byte{108, 224, 30}: "Modcam AB", + [3]byte{108, 224, 176}: "SOUND4", + [3]byte{108, 227, 182}: "Nera Telecommunications Ltd.", + [3]byte{108, 228, 206}: "Villiger Security Solutions AG", + [3]byte{108, 232, 115}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{108, 233, 7}: "Nokia Corporation", + [3]byte{108, 233, 131}: "Gastron Co., LTD.", + [3]byte{108, 235, 178}: "Dongguan Sen DongLv Electronics Co.,Ltd", + [3]byte{108, 236, 90}: "Hon Hai Precision Ind. CO.,Ltd.", + [3]byte{108, 236, 161}: "SHENZHEN CLOU ELECTRONICS CO. LTD.", + [3]byte{108, 236, 235}: "Texas Instruments", + [3]byte{108, 239, 198}: "SHENZHEN TWOWING TECHNOLOGIES CO.,LTD.", + [3]byte{108, 240, 73}: "GIGA-BYTE TECHNOLOGY CO.,LTD.", + [3]byte{108, 243, 115}: "Samsung Electronics Co.,Ltd", + [3]byte{108, 243, 127}: "Aruba Networks", + [3]byte{108, 245, 232}: "Mooredoll Inc.", + [3]byte{108, 249, 124}: "Nanoptix Inc.", + [3]byte{108, 249, 210}: "Chengdu Goods for the Road Electronic Technology C", + [3]byte{108, 250, 88}: "Avaya Inc", + [3]byte{108, 250, 137}: "Cisco Systems, Inc", + [3]byte{108, 250, 167}: "AMPAK Technology, Inc.", + [3]byte{108, 253, 185}: "Proware Technologies Co Ltd.", + [3]byte{108, 255, 190}: "MPB Communications Inc.", + [3]byte{112, 1, 54}: "FATEK Automation Corporation", + [3]byte{112, 2, 88}: "01DB-METRAVIB", + [3]byte{112, 5, 20}: "LG Electronics (Mobile Communications)", + [3]byte{112, 11, 192}: "Dewav Technology Company", + [3]byte{112, 15, 199}: "SHENZHEN IKINLOOP TECHNOLOGY CO.,LTD.", + [3]byte{112, 15, 236}: "Poindus Systems Corp.", + [3]byte{112, 16, 92}: "Cisco Systems, Inc", + [3]byte{112, 16, 111}: "Hewlett Packard Enterprise", + [3]byte{112, 17, 36}: "Apple, Inc.", + [3]byte{112, 17, 174}: "Music Life LTD", + [3]byte{112, 20, 4}: "Limited Liability Company", + [3]byte{112, 20, 166}: "Apple, Inc.", + [3]byte{112, 24, 139}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{112, 26, 4}: "Liteon Technology Corporation", + [3]byte{112, 26, 237}: "ADVAS CO., LTD.", + [3]byte{112, 28, 231}: "Intel Corporate", + [3]byte{112, 29, 127}: "Comtech Technology Co., Ltd.", + [3]byte{112, 29, 196}: "NorthStar Battery Company, LLC", + [3]byte{112, 31, 83}: "Cisco Systems, Inc", + [3]byte{112, 32, 132}: "Hon Hai Precision Ind. Co., Ltd.", + [3]byte{112, 35, 147}: "fos4X GmbH", + [3]byte{112, 37, 38}: "Nokia", + [3]byte{112, 37, 89}: "CyberTAN Technology Inc.", + [3]byte{112, 38, 5}: "SONY Visual Products Inc.", + [3]byte{112, 40, 139}: "Samsung Electronics Co.,Ltd", + [3]byte{112, 41, 0}: "Shenzhen ChipTrip Technology Co,Ltd", + [3]byte{112, 42, 125}: "EpSpot AB", + [3]byte{112, 43, 29}: "E-Domus International Limited", + [3]byte{112, 44, 31}: "Wisol", + [3]byte{112, 45, 132}: "i4C Innovations", + [3]byte{112, 45, 209}: "Newings Communication CO., LTD.", + [3]byte{112, 46, 34}: "zte corporation", + [3]byte{112, 47, 75}: "PolyVision Inc.", + [3]byte{112, 47, 151}: "Aava Mobile Oy", + [3]byte{112, 48, 24}: "Avaya Inc", + [3]byte{112, 48, 93}: "Ubiquoss Inc", + [3]byte{112, 48, 94}: "Nanjing Zhongke Menglian Information Technology Co.,LTD", + [3]byte{112, 49, 135}: "ACX GmbH", + [3]byte{112, 50, 213}: "Athena Wireless Communications Inc", + [3]byte{112, 56, 17}: "Invensys Rail", + [3]byte{112, 56, 180}: "Low Tech Solutions", + [3]byte{112, 56, 238}: "Avaya Inc", + [3]byte{112, 58, 14}: "Aruba Networks", + [3]byte{112, 58, 203}: "Google, Inc.", + [3]byte{112, 58, 216}: "Shenzhen Afoundry Electronic Co., Ltd", + [3]byte{112, 60, 3}: "RadiAnt Co.,Ltd", + [3]byte{112, 60, 57}: "SEAWING Kft", + [3]byte{112, 61, 21}: "Hangzhou H3C Technologies Co., Limited", + [3]byte{112, 62, 172}: "Apple, Inc.", + [3]byte{112, 65, 183}: "Edwards Lifesciences LLC", + [3]byte{112, 70, 66}: "CHYNG HONG ELECTRONIC CO., LTD.", + [3]byte{112, 71, 233}: "vivo Mobile Communication Co., Ltd.", + [3]byte{112, 72, 15}: "Apple, Inc.", + [3]byte{112, 74, 174}: "Xstream Flow (Pty) Ltd", + [3]byte{112, 74, 228}: "Rinstrum Pty Ltd", + [3]byte{112, 76, 165}: "Fortinet, Inc.", + [3]byte{112, 76, 237}: "TMRG, Inc.", + [3]byte{112, 77, 123}: "ASUSTek COMPUTER INC.", + [3]byte{112, 78, 1}: "KWANGWON TECH CO., LTD.", + [3]byte{112, 78, 102}: "SHENZHEN FAST TECHNOLOGIES CO.,LTD", + [3]byte{112, 79, 87}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{112, 80, 175}: "BSkyB Ltd", + [3]byte{112, 82, 197}: "Avaya Inc", + [3]byte{112, 83, 63}: "Alfa Instrumentos Eletronicos Ltda.", + [3]byte{112, 84, 210}: "PEGATRON CORPORATION", + [3]byte{112, 84, 245}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{112, 86, 129}: "Apple, Inc.", + [3]byte{112, 88, 18}: "Panasonic Corporation AVC Networks Company", + [3]byte{112, 88, 150}: "InShow Technology", + [3]byte{112, 89, 87}: "Medallion Instrumentation Systems", + [3]byte{112, 89, 134}: "OOO TTV", + [3]byte{112, 90, 15}: "Hewlett Packard", + [3]byte{112, 90, 158}: "Technicolor CH USA Inc.", + [3]byte{112, 90, 182}: "COMPAL INFORMATION (KUNSHAN) CO., LTD.", + [3]byte{112, 91, 46}: "M2Communication Inc.", + [3]byte{112, 92, 173}: "Konami Gaming Inc", + [3]byte{112, 94, 170}: "Action Target, Inc.", + [3]byte{112, 96, 222}: "LaVision GmbH", + [3]byte{112, 97, 115}: "Calantec GmbH", + [3]byte{112, 98, 184}: "D-Link International", + [3]byte{112, 100, 23}: "ORBIS TECNOLOGIA ELECTRICA S.A.", + [3]byte{112, 101, 130}: "Suzhou Hanming Technologies Co., Ltd.", + [3]byte{112, 101, 163}: "Kandao lightforge Co., Ltd.", + [3]byte{112, 102, 27}: "Sonova AG", + [3]byte{112, 104, 121}: "Saijo Denki International Co., Ltd.", + [3]byte{112, 107, 185}: "Cisco Systems, Inc", + [3]byte{112, 109, 236}: "Wifi-soft LLC", + [3]byte{112, 110, 109}: "Cisco Systems, Inc", + [3]byte{112, 111, 129}: "Private", + [3]byte{112, 112, 13}: "Apple, Inc.", + [3]byte{112, 112, 76}: "Purple Communications, Inc", + [3]byte{112, 112, 139}: "Cisco Systems, Inc", + [3]byte{112, 113, 179}: "Brain Corporation", + [3]byte{112, 113, 188}: "PEGATRON CORPORATION", + [3]byte{112, 114, 13}: "Lenovo Mobile Communication Technology Ltd.", + [3]byte{112, 114, 60}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{112, 114, 207}: "EdgeCore Networks", + [3]byte{112, 115, 203}: "Apple, Inc.", + [3]byte{112, 118, 48}: "ARRIS Group, Inc.", + [3]byte{112, 118, 221}: "Oxyguard International A/S", + [3]byte{112, 118, 240}: "LevelOne Communications (India) Private Limited", + [3]byte{112, 118, 255}: "KERLINK", + [3]byte{112, 119, 129}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{112, 120, 139}: "vivo Mobile Communication Co., Ltd.", + [3]byte{112, 121, 56}: "Wuxi Zhanrui Electronic Technology Co.,LTD", + [3]byte{112, 121, 144}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{112, 123, 232}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{112, 124, 24}: "ADATA Technology Co., Ltd", + [3]byte{112, 124, 105}: "Avaya Inc", + [3]byte{112, 125, 149}: "Shenzhen City LinwlanTechnology Co. Ltd.", + [3]byte{112, 125, 185}: "Cisco Systems, Inc", + [3]byte{112, 126, 67}: "ARRIS Group, Inc.", + [3]byte{112, 126, 222}: "NASTEC LTD.", + [3]byte{112, 129, 5}: "Cisco Systems, Inc", + [3]byte{112, 129, 235}: "Apple, Inc.", + [3]byte{112, 130, 14}: "as electronics GmbH", + [3]byte{112, 130, 142}: "OleumTech Corporation", + [3]byte{112, 133, 194}: "ASRock Incorporation", + [3]byte{112, 133, 198}: "ARRIS Group, Inc.", + [3]byte{112, 134, 193}: "Texas Instruments", + [3]byte{112, 136, 77}: "JAPAN RADIO CO., LTD.", + [3]byte{112, 138, 9}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{112, 139, 120}: "citygrow technology co., ltd", + [3]byte{112, 139, 205}: "ASUSTek COMPUTER INC.", + [3]byte{112, 141, 9}: "Nokia Corporation", + [3]byte{112, 145, 143}: "Weber-Stephen Products LLC", + [3]byte{112, 145, 243}: "Universal Electronics, Inc.", + [3]byte{112, 147, 131}: "Intelligent Optical Network High Tech CO.,LTD.", + [3]byte{112, 147, 248}: "Space Monkey, Inc.", + [3]byte{112, 151, 86}: "Happyelectronics Co.,Ltd", + [3]byte{112, 153, 28}: "Shenzhen Honesty Electronics Co.,Ltd", + [3]byte{112, 154, 11}: "Italian Institute of Technology", + [3]byte{112, 155, 165}: "Shenzhen Y&D Electronics Co.,LTD.", + [3]byte{112, 155, 252}: "Bryton Inc.", + [3]byte{112, 156, 143}: "Nero AG", + [3]byte{112, 158, 41}: "Sony Interactive Entertainment Inc.", + [3]byte{112, 158, 134}: "X6D Limited", + [3]byte{112, 159, 45}: "zte corporation", + [3]byte{112, 161, 145}: "Trendsetter Medical, LLC", + [3]byte{112, 162, 179}: "Apple, Inc.", + [3]byte{112, 164, 28}: "Advanced Wireless Dynamics S.L.", + [3]byte{112, 166, 106}: "Prox Dynamics AS", + [3]byte{112, 168, 76}: "MONAD., Inc.", + [3]byte{112, 168, 227}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{112, 170, 178}: "BlackBerry RTS", + [3]byte{112, 173, 84}: "Malvern Instruments Ltd", + [3]byte{112, 175, 36}: "TP Vision Belgium NV", + [3]byte{112, 175, 37}: "Nishiyama Industry Co.,LTD.", + [3]byte{112, 175, 106}: "SHENZHEN FENGLIAN TECHNOLOGY CO., LTD.", + [3]byte{112, 176, 53}: "Shenzhen Zowee Technology Co., Ltd", + [3]byte{112, 176, 140}: "Shenou Communication Equipment Co.,Ltd", + [3]byte{112, 177, 78}: "ARRIS Group, Inc.", + [3]byte{112, 178, 101}: "Hiltron s.r.l.", + [3]byte{112, 179, 213}: "IEEE Registration Authority", + [3]byte{112, 181, 153}: "Embedded Technologies s.r.o.", + [3]byte{112, 183, 226}: "Jiangsu Miter Technology Co.,Ltd.", + [3]byte{112, 185, 33}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{112, 186, 239}: "Hangzhou H3C Technologies Co., Limited", + [3]byte{112, 191, 62}: "Charles River Laboratories", + [3]byte{112, 198, 172}: "Bosch Automotive Aftermarket", + [3]byte{112, 199, 111}: "INNO S", + [3]byte{112, 202, 77}: "Shenzhen lnovance Technology Co.,Ltd.", + [3]byte{112, 202, 155}: "Cisco Systems, Inc", + [3]byte{112, 205, 96}: "Apple, Inc.", + [3]byte{112, 211, 121}: "Cisco Systems, Inc", + [3]byte{112, 212, 242}: "RIM", + [3]byte{112, 213, 126}: "Scalar Corporation", + [3]byte{112, 213, 231}: "Wellcore Corporation", + [3]byte{112, 214, 182}: "Metrum Technologies", + [3]byte{112, 216, 128}: "Upos System sp. z o.o.", + [3]byte{112, 217, 35}: "vivo Mobile Communication Co., Ltd.", + [3]byte{112, 217, 49}: "Cambridge Industries(Group) Co.,Ltd.", + [3]byte{112, 218, 156}: "TECSEN", + [3]byte{112, 219, 152}: "Cisco Systems, Inc", + [3]byte{112, 221, 161}: "Tellabs", + [3]byte{112, 222, 226}: "Apple, Inc.", + [3]byte{112, 222, 249}: "FAI WAH INTERNATIONAL (HONG KONG) LIMITED", + [3]byte{112, 223, 47}: "Cisco Systems, Inc", + [3]byte{112, 224, 39}: "HONGYU COMMUNICATION TECHNOLOGY LIMITED", + [3]byte{112, 225, 57}: "3view Ltd", + [3]byte{112, 225, 253}: "FLEXTRONICS", + [3]byte{112, 226, 76}: "SAE IT-systems GmbH & Co. KG", + [3]byte{112, 226, 132}: "Wistron Infocomm (Zhongshan) Corporation", + [3]byte{112, 228, 34}: "Cisco Systems, Inc", + [3]byte{112, 229, 110}: "Texas Instruments", + [3]byte{112, 231, 44}: "Apple, Inc.", + [3]byte{112, 232, 67}: "Beijing C&W Optical Communication Technology Co.,Ltd.", + [3]byte{112, 236, 228}: "Apple, Inc.", + [3]byte{112, 238, 80}: "Netatmo", + [3]byte{112, 238, 163}: "Eoptolink Technology Inc. Ltd,", + [3]byte{112, 240, 135}: "Apple, Inc.", + [3]byte{112, 241, 28}: "Shenzhen Ogemray Technology Co.,Ltd", + [3]byte{112, 241, 118}: "Data Modul AG", + [3]byte{112, 241, 150}: "Actiontec Electronics, Inc", + [3]byte{112, 241, 161}: "Liteon Technology Corporation", + [3]byte{112, 241, 229}: "Xetawave LLC", + [3]byte{112, 243, 90}: "Cisco Systems, Inc", + [3]byte{112, 243, 149}: "Universal Global Scientific Industrial Co., Ltd.", + [3]byte{112, 248, 231}: "IEEE Registration Authority", + [3]byte{112, 249, 39}: "Samsung Electronics Co.,Ltd", + [3]byte{112, 249, 109}: "Hangzhou H3C Technologies Co., Limited", + [3]byte{112, 252, 140}: "OneAccess SA", + [3]byte{112, 255, 92}: "Cheerzing Communication(Xiamen)Technology Co.,Ltd", + [3]byte{112, 255, 118}: "Texas Instruments", + [3]byte{116, 3, 189}: "BUFFALO.INC", + [3]byte{116, 4, 43}: "Lenovo Mobile Communication (Wuhan) Company Limited", + [3]byte{116, 10, 188}: "LightwaveRF Technology Ltd", + [3]byte{116, 14, 219}: "Optowiz Co., Ltd", + [3]byte{116, 20, 137}: "SRT Wireless", + [3]byte{116, 21, 226}: "Tri-Sen Systems Corporation", + [3]byte{116, 24, 101}: "Shanghai DareGlobal Technologies Co.,Ltd", + [3]byte{116, 25, 248}: "IEEE Registration Authority", + [3]byte{116, 26, 224}: "IEEE Registration Authority", + [3]byte{116, 27, 178}: "Apple, Inc.", + [3]byte{116, 28, 39}: "ITEL MOBILE LIMITED", + [3]byte{116, 30, 147}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{116, 31, 74}: "Hangzhou H3C Technologies Co., Limited", + [3]byte{116, 35, 68}: "Xiaomi Communications Co Ltd", + [3]byte{116, 37, 138}: "Hangzhou H3C Technologies Co., Limited", + [3]byte{116, 38, 172}: "Cisco Systems, Inc", + [3]byte{116, 39, 60}: "ChangYang Technology (Nanjing) Co., LTD", + [3]byte{116, 39, 234}: "Elitegroup Computer Systems Co.,Ltd.", + [3]byte{116, 40, 87}: "Mayfield Robotics", + [3]byte{116, 41, 175}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{116, 43, 15}: "Infinidat Ltd.", + [3]byte{116, 43, 98}: "FUJITSU LIMITED", + [3]byte{116, 45, 10}: "Norfolk Elektronik AG", + [3]byte{116, 46, 252}: "DirectPacket Research, Inc,", + [3]byte{116, 47, 104}: "AzureWave Technology Inc.", + [3]byte{116, 49, 112}: "Arcadyan Technology Corporation", + [3]byte{116, 50, 86}: "NT-ware Systemprg GmbH", + [3]byte{116, 55, 47}: "Tongfang Shenzhen Cloudcomputing Technology Co.,Ltd", + [3]byte{116, 55, 59}: "UNINET Co.,Ltd.", + [3]byte{116, 56, 137}: "ANNAX Anzeigesysteme GmbH", + [3]byte{116, 58, 101}: "NEC Corporation", + [3]byte{116, 62, 43}: "Ruckus Wireless", + [3]byte{116, 62, 203}: "Gentrice tech", + [3]byte{116, 68, 1}: "NETGEAR", + [3]byte{116, 69, 138}: "Samsung Electronics Co.,Ltd", + [3]byte{116, 70, 160}: "Hewlett Packard", + [3]byte{116, 74, 164}: "zte corporation", + [3]byte{116, 75, 233}: "EXPLORER HYPERTECH CO.,LTD", + [3]byte{116, 77, 121}: "Arrive Systems Inc.", + [3]byte{116, 81, 186}: "Xiaomi Communications Co Ltd", + [3]byte{116, 83, 39}: "COMMSEN CO., LIMITED", + [3]byte{116, 84, 39}: "SHENZHEN FAST TECHNOLOGIES CO.,LTD", + [3]byte{116, 84, 125}: "Cisco SPVTG", + [3]byte{116, 86, 18}: "ARRIS Group, Inc.", + [3]byte{116, 87, 152}: "TRUMPF Laser GmbH + Co. KG", + [3]byte{116, 90, 170}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{116, 92, 75}: "GN Audio A/S", + [3]byte{116, 92, 159}: "TCT mobile ltd", + [3]byte{116, 94, 28}: "PIONEER CORPORATION", + [3]byte{116, 95, 0}: "Samsung Semiconductor Inc.", + [3]byte{116, 95, 174}: "TSL PPL", + [3]byte{116, 97, 75}: "Chongqing Huijiatong Information Technology Co., Ltd.", + [3]byte{116, 99, 223}: "VTS GmbH", + [3]byte{116, 101, 209}: "Atlinks", + [3]byte{116, 102, 48}: "T:mi Ytti", + [3]byte{116, 103, 247}: "Extreme Networks, Inc.", + [3]byte{116, 106, 58}: "Aperi Corporation", + [3]byte{116, 106, 137}: "Rezolt Corporation", + [3]byte{116, 106, 143}: "VS Vision Systems GmbH", + [3]byte{116, 107, 130}: "MOVEK", + [3]byte{116, 110, 228}: "Asia Vital Components Co.,Ltd.", + [3]byte{116, 111, 25}: "ICARVISIONS (SHENZHEN) TECHNOLOGY CO., LTD.", + [3]byte{116, 111, 61}: "Contec GmbH", + [3]byte{116, 111, 247}: "Wistron Neweb Corporation", + [3]byte{116, 114, 176}: "Guangzhou Shiyuan Electronics Co., Ltd.", + [3]byte{116, 114, 242}: "Chipsip Technology Co., Ltd.", + [3]byte{116, 115, 54}: "MICRODIGTAL Inc", + [3]byte{116, 117, 72}: "Amazon Technologies Inc.", + [3]byte{116, 120, 24}: "Jurumani Solutions", + [3]byte{116, 123, 122}: "ETH Inc.", + [3]byte{116, 125, 36}: "Phicomm (Shanghai) Co., Ltd.", + [3]byte{116, 125, 182}: "Aliwei Communications, Inc", + [3]byte{116, 126, 26}: "Red Embedded Design Limited", + [3]byte{116, 126, 45}: "Beijing Thomson CITIC Digital Technology Co. LTD.", + [3]byte{116, 129, 20}: "Apple, Inc.", + [3]byte{116, 129, 154}: "PT. Hartono Istana Teknologi", + [3]byte{116, 131, 239}: "Arista Networks", + [3]byte{116, 133, 42}: "PEGATRON CORPORATION", + [3]byte{116, 134, 11}: "Cisco Systems, Inc", + [3]byte{116, 134, 122}: "Dell Inc.", + [3]byte{116, 135, 169}: "OCT Technology Co., Ltd.", + [3]byte{116, 136, 42}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{116, 136, 139}: "ADB Broadband Italia", + [3]byte{116, 138, 105}: "Korea Image Technology Co., Ltd", + [3]byte{116, 141, 8}: "Apple, Inc.", + [3]byte{116, 142, 8}: "Bestek Corp.", + [3]byte{116, 142, 248}: "Brocade Communications Systems, Inc.", + [3]byte{116, 143, 27}: "MasterImage 3D", + [3]byte{116, 143, 77}: "MEN Mikro Elektronik GmbH", + [3]byte{116, 144, 80}: "Renesas Electronics Corporation", + [3]byte{116, 145, 26}: "Ruckus Wireless", + [3]byte{116, 145, 189}: "Four systems Co.,Ltd.", + [3]byte{116, 147, 164}: "Zebra Technologies Corp.", + [3]byte{116, 148, 61}: "AgJunction", + [3]byte{116, 149, 236}: "ALPS ELECTRIC CO.,LTD.", + [3]byte{116, 150, 55}: "Todaair Electronic Co., Ltd", + [3]byte{116, 151, 129}: "zte corporation", + [3]byte{116, 153, 117}: "IBM Corporation", + [3]byte{116, 156, 82}: "Huizhou Desay SV Automotive Co., Ltd.", + [3]byte{116, 156, 227}: "KodaCloud Canada, Inc", + [3]byte{116, 157, 143}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{116, 157, 220}: "2Wire Inc", + [3]byte{116, 160, 47}: "Cisco Systems, Inc", + [3]byte{116, 160, 99}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{116, 162, 230}: "Cisco Systems, Inc", + [3]byte{116, 163, 74}: "ZIMI CORPORATION", + [3]byte{116, 164, 167}: "QRS Music Technologies, Inc.", + [3]byte{116, 164, 181}: "Powerleader Science and Technology Co. Ltd.", + [3]byte{116, 165, 40}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{116, 167, 34}: "LG Electronics (Mobile Communications)", + [3]byte{116, 167, 142}: "zte corporation", + [3]byte{116, 172, 95}: "Qiku Internet Network Scientific (Shenzhen) Co., Ltd.", + [3]byte{116, 173, 183}: "China Mobile Group Device Co.,Ltd.", + [3]byte{116, 174, 118}: "iNovo Broadband, Inc.", + [3]byte{116, 176, 12}: "Network Video Technologies, Inc", + [3]byte{116, 180, 114}: "CIESSE", + [3]byte{116, 181, 126}: "zte corporation", + [3]byte{116, 185, 235}: "JinQianMao Technology Co.,Ltd.", + [3]byte{116, 186, 219}: "Longconn Electornics(shenzhen)Co.,Ltd", + [3]byte{116, 187, 211}: "Shenzhen xeme Communication Co., Ltd.", + [3]byte{116, 190, 8}: "ATEK Products, LLC", + [3]byte{116, 191, 161}: "HYUNTECK", + [3]byte{116, 191, 183}: "Nusoft Corporation", + [3]byte{116, 194, 70}: "Amazon Technologies Inc.", + [3]byte{116, 195, 48}: "SHENZHEN FAST TECHNOLOGIES CO.,LTD", + [3]byte{116, 198, 33}: "Zhejiang Hite Renewable Energy Co.,LTD", + [3]byte{116, 198, 59}: "AzureWave Technology Inc.", + [3]byte{116, 201, 154}: "Ericsson AB", + [3]byte{116, 201, 163}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{116, 202, 37}: "Calxeda, Inc.", + [3]byte{116, 204, 57}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{116, 205, 12}: "Smith Myers Communications Ltd.", + [3]byte{116, 206, 86}: "Packet Force Technology Limited Company", + [3]byte{116, 208, 43}: "ASUSTek COMPUTER INC.", + [3]byte{116, 208, 220}: "Ericsson AB", + [3]byte{116, 210, 29}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{116, 212, 53}: "GIGA-BYTE TECHNOLOGY CO.,LTD.", + [3]byte{116, 214, 117}: "WYMA Tecnologia", + [3]byte{116, 214, 234}: "Texas Instruments", + [3]byte{116, 215, 202}: "Panasonic Corporation Automotive", + [3]byte{116, 216, 80}: "Evrisko Systems", + [3]byte{116, 218, 56}: "Edimax Technology Co. Ltd.", + [3]byte{116, 218, 218}: "D-Link International", + [3]byte{116, 218, 234}: "Texas Instruments", + [3]byte{116, 219, 209}: "Ebay Inc", + [3]byte{116, 222, 43}: "Liteon Technology Corporation", + [3]byte{116, 223, 191}: "Liteon Technology Corporation", + [3]byte{116, 224, 110}: "Ergophone GmbH", + [3]byte{116, 225, 74}: "IEEE Registration Authority", + [3]byte{116, 225, 154}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{116, 225, 182}: "Apple, Inc.", + [3]byte{116, 226, 119}: "Vizmonet Pte Ltd", + [3]byte{116, 226, 140}: "Microsoft Corporation", + [3]byte{116, 226, 245}: "Apple, Inc.", + [3]byte{116, 228, 36}: "APISTE CORPORATION", + [3]byte{116, 229, 11}: "Intel Corporate", + [3]byte{116, 229, 55}: "RADSPIN", + [3]byte{116, 229, 67}: "Liteon Technology Corporation", + [3]byte{116, 229, 249}: "Intel Corporate", + [3]byte{116, 230, 15}: "TECNO MOBILE LIMITED", + [3]byte{116, 230, 226}: "Dell Inc.", + [3]byte{116, 231, 198}: "ARRIS Group, Inc.", + [3]byte{116, 234, 58}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{116, 234, 200}: "New H3C Technologies Co., Ltd", + [3]byte{116, 234, 203}: "New H3C Technologies Co., Ltd", + [3]byte{116, 234, 232}: "ARRIS Group, Inc.", + [3]byte{116, 236, 241}: "Acumen", + [3]byte{116, 240, 109}: "AzureWave Technology Inc.", + [3]byte{116, 240, 125}: "BnCOM Co.,Ltd", + [3]byte{116, 241, 2}: "Beijing HCHCOM Technology Co., Ltd", + [3]byte{116, 244, 19}: "Maxwell Forest", + [3]byte{116, 246, 18}: "ARRIS Group, Inc.", + [3]byte{116, 246, 28}: "HTC Corporation", + [3]byte{116, 246, 97}: "Schneider Electric Fire & Security Oy", + [3]byte{116, 247, 38}: "Neuron Robotics", + [3]byte{116, 248, 93}: "Berkeley Nucleonics Corp", + [3]byte{116, 248, 219}: "IEEE Registration Authority", + [3]byte{116, 249, 26}: "Onface", + [3]byte{116, 253, 160}: "Compupal (Group) Corporation", + [3]byte{116, 254, 72}: "ADVANTECH CO., LTD.", + [3]byte{116, 255, 76}: "Skyworth Digital Technology(Shenzhen) Co.,Ltd", + [3]byte{116, 255, 125}: "Wren Sound Systems, LLC", + [3]byte{120, 0, 158}: "Samsung Electronics Co.,Ltd", + [3]byte{120, 2, 143}: "Adaptive Spectrum and Signal Alignment (ASSIA), Inc.", + [3]byte{120, 2, 177}: "Cisco Systems, Inc", + [3]byte{120, 2, 183}: "ShenZhen Ultra Easy Technology CO.,LTD", + [3]byte{120, 2, 248}: "Xiaomi Communications Co Ltd", + [3]byte{120, 5, 65}: "Queclink Wireless Solutions Co., Ltd", + [3]byte{120, 7, 56}: "Z.U.K. Elzab S.A.", + [3]byte{120, 10, 199}: "Baofeng TV Co., Ltd.", + [3]byte{120, 12, 184}: "Intel Corporate", + [3]byte{120, 17, 133}: "NBS Payment Solutions Inc.", + [3]byte{120, 17, 220}: "XIAOMI Electronics,CO.,LTD", + [3]byte{120, 18, 184}: "ORANTEK LIMITED", + [3]byte{120, 24, 129}: "AzureWave Technology Inc.", + [3]byte{120, 25, 46}: "NASCENT Technology", + [3]byte{120, 25, 247}: "Juniper Networks", + [3]byte{120, 28, 90}: "SHARP Corporation", + [3]byte{120, 29, 186}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{120, 29, 253}: "Jabil Inc", + [3]byte{120, 31, 219}: "Samsung Electronics Co.,Ltd", + [3]byte{120, 32, 121}: "ID Tech", + [3]byte{120, 34, 61}: "Affirmed Networks", + [3]byte{120, 35, 174}: "ARRIS Group, Inc.", + [3]byte{120, 36, 175}: "ASUSTek COMPUTER INC.", + [3]byte{120, 37, 68}: "Omnima Limited", + [3]byte{120, 37, 173}: "Samsung Electronics Co.,Ltd", + [3]byte{120, 40, 202}: "Sonos, Inc.", + [3]byte{120, 43, 203}: "Dell Inc.", + [3]byte{120, 45, 126}: "TRENDnet, Inc.", + [3]byte{120, 46, 239}: "Nokia Corporation", + [3]byte{120, 48, 59}: "Stephen Technologies Co.,Limited", + [3]byte{120, 48, 225}: "UltraClenz, LLC", + [3]byte{120, 49, 43}: "zte corporation", + [3]byte{120, 49, 193}: "Apple, Inc.", + [3]byte{120, 50, 27}: "D-Link International", + [3]byte{120, 50, 79}: "Millennium Group, Inc.", + [3]byte{120, 54, 144}: "Yulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd", + [3]byte{120, 58, 132}: "Apple, Inc.", + [3]byte{120, 60, 227}: "Kai-EE", + [3]byte{120, 61, 91}: "TELNET Redes Inteligentes S.A.", + [3]byte{120, 62, 83}: "BSkyB Ltd", + [3]byte{120, 63, 21}: "EasySYNC Ltd.", + [3]byte{120, 64, 228}: "Samsung Electronics Co.,Ltd", + [3]byte{120, 68, 5}: "FUJITU(HONG KONG) ELECTRONIC Co.,LTD.", + [3]byte{120, 68, 118}: "Zioncom Electronics (Shenzhen) Ltd.", + [3]byte{120, 68, 253}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{120, 69, 1}: "Biamp Systems", + [3]byte{120, 69, 97}: "CyberTAN Technology Inc.", + [3]byte{120, 69, 196}: "Dell Inc.", + [3]byte{120, 70, 196}: "DAEHAP HYPER-TECH", + [3]byte{120, 71, 29}: "Samsung Electronics Co.,Ltd", + [3]byte{120, 72, 89}: "Hewlett Packard", + [3]byte{120, 73, 29}: "The Will-Burt Company", + [3]byte{120, 75, 8}: "f.robotics acquisitions ltd", + [3]byte{120, 75, 135}: "Murata Manufacturing Co., Ltd.", + [3]byte{120, 79, 67}: "Apple, Inc.", + [3]byte{120, 81, 12}: "LiveU Ltd.", + [3]byte{120, 82, 26}: "Samsung Electronics Co.,Ltd", + [3]byte{120, 82, 98}: "Shenzhen Hojy Software Co., Ltd.", + [3]byte{120, 83, 242}: "ROXTON Ltd.", + [3]byte{120, 84, 46}: "D-Link International", + [3]byte{120, 85, 23}: "SankyuElectronics", + [3]byte{120, 87, 18}: "Mobile Integration Workgroup", + [3]byte{120, 88, 243}: "Vachen Co.,Ltd", + [3]byte{120, 89, 62}: "RAFI GmbH & Co.KG", + [3]byte{120, 89, 94}: "Samsung Electronics Co.,Ltd", + [3]byte{120, 89, 104}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{120, 92, 40}: "Prime Motion Inc.", + [3]byte{120, 92, 114}: "Hioso Technology Co., Ltd.", + [3]byte{120, 95, 76}: "Argox Information Co., Ltd.", + [3]byte{120, 97, 124}: "MITSUMI ELECTRIC CO.,LTD.", + [3]byte{120, 98, 86}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{120, 100, 230}: "Green Motive Technology Limited", + [3]byte{120, 102, 174}: "ZTEC Instruments, Inc.", + [3]byte{120, 103, 215}: "Apple, Inc.", + [3]byte{120, 104, 247}: "YSTen Technology Co.,Ltd", + [3]byte{120, 106, 137}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{120, 108, 28}: "Apple, Inc.", + [3]byte{120, 109, 148}: "Palo Alto Networks", + [3]byte{120, 113, 156}: "ARRIS Group, Inc.", + [3]byte{120, 123, 138}: "Apple, Inc.", + [3]byte{120, 125, 72}: "ITEL MOBILE LIMITED", + [3]byte{120, 126, 97}: "Apple, Inc.", + [3]byte{120, 127, 98}: "GiK mbH", + [3]byte{120, 128, 56}: "FUNAI ELECTRIC CO., LTD.", + [3]byte{120, 129, 2}: "Sercomm Corporation.", + [3]byte{120, 129, 143}: "Server Racks Australia Pty Ltd", + [3]byte{120, 132, 60}: "Sony Corporation", + [3]byte{120, 132, 238}: "INDRA ESPACIO S.A.", + [3]byte{120, 135, 13}: "Unifiedgateways India Private Limited", + [3]byte{120, 136, 109}: "Apple, Inc.", + [3]byte{120, 136, 138}: "CDR Sp. z o.o. Sp. k.", + [3]byte{120, 137, 115}: "CMC", + [3]byte{120, 138, 32}: "Ubiquiti Networks Inc.", + [3]byte{120, 139, 119}: "Standar Telecom", + [3]byte{120, 140, 77}: "Indyme Solutions, LLC", + [3]byte{120, 140, 84}: "Eltek Technologies LTD", + [3]byte{120, 141, 247}: "Hitron Technologies. Inc", + [3]byte{120, 142, 51}: "Jiangsu SEUIC Technology Co.,Ltd", + [3]byte{120, 146, 62}: "Nokia Corporation", + [3]byte{120, 146, 156}: "Intel Corporate", + [3]byte{120, 148, 180}: "Sercomm Corporation.", + [3]byte{120, 150, 130}: "zte corporation", + [3]byte{120, 150, 132}: "ARRIS Group, Inc.", + [3]byte{120, 152, 253}: "Q9 Networks Inc.", + [3]byte{120, 153, 92}: "Nationz Technologies Inc", + [3]byte{120, 153, 102}: "Musilab Electronics (DongGuan)Co.,Ltd.", + [3]byte{120, 153, 143}: "MEDILINE ITALIA SRL", + [3]byte{120, 156, 133}: "August Home, Inc.", + [3]byte{120, 156, 231}: "Shenzhen Aikede Technology Co., Ltd", + [3]byte{120, 158, 208}: "Samsung Electronics Co.,Ltd", + [3]byte{120, 159, 76}: "HOERBIGER Elektronik GmbH", + [3]byte{120, 159, 112}: "Apple, Inc.", + [3]byte{120, 159, 135}: "Siemens AG I IA PP PRM", + [3]byte{120, 160, 81}: "iiNet Labs Pty Ltd", + [3]byte{120, 161, 6}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{120, 161, 131}: "Advidia", + [3]byte{120, 162, 160}: "Nintendo Co., Ltd.", + [3]byte{120, 163, 81}: "SHENZHEN ZHIBOTONG ELECTRONICS CO.,LTD", + [3]byte{120, 163, 228}: "Apple, Inc.", + [3]byte{120, 165, 4}: "Texas Instruments", + [3]byte{120, 165, 221}: "Shenzhen Smarteye Digital Electronics Co., Ltd", + [3]byte{120, 166, 131}: "Precidata", + [3]byte{120, 166, 189}: "DAEYEON Control&Instrument Co,.Ltd", + [3]byte{120, 166, 225}: "Brocade Communications Systems, Inc.", + [3]byte{120, 167, 20}: "Amphenol", + [3]byte{120, 168, 115}: "Samsung Electronics Co.,Ltd", + [3]byte{120, 171, 96}: "ABB Australia", + [3]byte{120, 171, 187}: "Samsung Electronics Co.,Ltd", + [3]byte{120, 172, 191}: "Igneous Systems", + [3]byte{120, 172, 192}: "Hewlett Packard", + [3]byte{120, 174, 12}: "Far South Networks", + [3]byte{120, 175, 88}: "GIMASI SA", + [3]byte{120, 178, 141}: "Beijing Tengling Technology CO.Ltd", + [3]byte{120, 179, 185}: "ShangHai sunup lighting CO.,LTD", + [3]byte{120, 179, 206}: "Elo touch solutions", + [3]byte{120, 181, 210}: "Ever Treasure Industrial Limited", + [3]byte{120, 182, 193}: "AOBO Telecom Co.,Ltd", + [3]byte{120, 184, 26}: "INTER SALES A/S", + [3]byte{120, 184, 75}: "SICHUAN TIANYI COMHEART TELECOMCO.,LTD", + [3]byte{120, 186, 208}: "Shinybow Technology Co. Ltd.", + [3]byte{120, 186, 249}: "Cisco Systems, Inc", + [3]byte{120, 188, 26}: "Cisco Systems, Inc", + [3]byte{120, 189, 188}: "Samsung Electronics Co.,Ltd", + [3]byte{120, 190, 182}: "Enhanced Vision", + [3]byte{120, 190, 189}: "STULZ GmbH", + [3]byte{120, 193, 167}: "zte corporation", + [3]byte{120, 194, 192}: "IEEE Registration Authority", + [3]byte{120, 195, 233}: "Samsung Electronics Co.,Ltd", + [3]byte{120, 196, 14}: "H&D Wireless", + [3]byte{120, 196, 171}: "Shenzhen Runsil Technology Co.,Ltd", + [3]byte{120, 197, 229}: "Texas Instruments", + [3]byte{120, 198, 187}: "Innovasic, Inc.", + [3]byte{120, 202, 4}: "Nokia Corporation", + [3]byte{120, 202, 57}: "Apple, Inc.", + [3]byte{120, 202, 94}: "ELNO", + [3]byte{120, 202, 131}: "IEEE Registration Authority", + [3]byte{120, 203, 51}: "DHC Software Co.,Ltd", + [3]byte{120, 203, 104}: "DAEHAP HYPER-TECH", + [3]byte{120, 205, 142}: "SMC Networks Inc", + [3]byte{120, 208, 4}: "Neousys Technology Inc.", + [3]byte{120, 209, 41}: "Vicos", + [3]byte{120, 211, 79}: "Pace-O-Matic, Inc.", + [3]byte{120, 211, 141}: "HONGKONG YUNLINK TECHNOLOGY LIMITED", + [3]byte{120, 213, 181}: "NAVIELEKTRO KY", + [3]byte{120, 214, 111}: "Aristocrat Technologies Australia Pty. Ltd.", + [3]byte{120, 214, 178}: "Toshiba", + [3]byte{120, 214, 240}: "SAMSUNG ELECTRO MECHANICS CO., LTD.", + [3]byte{120, 215, 82}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{120, 215, 95}: "Apple, Inc.", + [3]byte{120, 216, 0}: "IEEE Registration Authority", + [3]byte{120, 217, 159}: "NuCom HK Ltd.", + [3]byte{120, 218, 110}: "Cisco Systems, Inc", + [3]byte{120, 218, 179}: "GBO Technology", + [3]byte{120, 221, 8}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{120, 221, 214}: "c-scape", + [3]byte{120, 221, 217}: "Guangzhou Shiyuan Electronics Co., Ltd.", + [3]byte{120, 222, 228}: "Texas Instruments", + [3]byte{120, 225, 3}: "Amazon Technologies Inc.", + [3]byte{120, 227, 181}: "Hewlett Packard", + [3]byte{120, 228, 0}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{120, 231, 209}: "Hewlett Packard", + [3]byte{120, 232, 182}: "zte corporation", + [3]byte{120, 233, 128}: "RainUs Co.,Ltd", + [3]byte{120, 235, 20}: "SHENZHEN FAST TECHNOLOGIES CO.,LTD", + [3]byte{120, 235, 57}: "Instituto Nacional de Tecnología Industrial", + [3]byte{120, 236, 34}: "Shanghai Qihui Telecom Technology Co., LTD", + [3]byte{120, 236, 116}: "Kyland-USA", + [3]byte{120, 239, 76}: "Unetconvergence Co., Ltd.", + [3]byte{120, 242, 158}: "PEGATRON CORPORATION", + [3]byte{120, 245, 87}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{120, 245, 229}: "BEGA Gantenbrink-Leuchten KG", + [3]byte{120, 245, 253}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{120, 247, 190}: "Samsung Electronics Co.,Ltd", + [3]byte{120, 247, 208}: "Silverbrook Research", + [3]byte{120, 248, 130}: "LG Electronics (Mobile Communications)", + [3]byte{120, 249, 68}: "Private", + [3]byte{120, 252, 20}: "Family Zone Cyber Safety Ltd", + [3]byte{120, 253, 148}: "Apple, Inc.", + [3]byte{120, 254, 61}: "Juniper Networks", + [3]byte{120, 254, 65}: "Socus networks", + [3]byte{120, 254, 226}: "Shanghai Diveo Technology Co., Ltd", + [3]byte{120, 255, 87}: "Intel Corporate", + [3]byte{120, 255, 202}: "TECNO MOBILE LIMITED", + [3]byte{124, 1, 10}: "Texas Instruments", + [3]byte{124, 1, 135}: "Curtis Instruments, Inc.", + [3]byte{124, 1, 145}: "Apple, Inc.", + [3]byte{124, 2, 188}: "Hansung Electronics Co. LTD", + [3]byte{124, 3, 76}: "Sagemcom Broadband SAS", + [3]byte{124, 3, 201}: "Shenzhen YOUHUA Technology Co., Ltd", + [3]byte{124, 3, 216}: "Sagemcom Broadband SAS", + [3]byte{124, 4, 208}: "Apple, Inc.", + [3]byte{124, 5, 7}: "PEGATRON CORPORATION", + [3]byte{124, 5, 30}: "RAFAEL LTD.", + [3]byte{124, 6, 35}: "Ultra Electronics Sonar System Division", + [3]byte{124, 8, 217}: "Shanghai B-Star Technology Co", + [3]byte{124, 9, 43}: "Bekey A/S", + [3]byte{124, 10, 80}: "J-MEX Inc.", + [3]byte{124, 11, 198}: "Samsung Electronics Co.,Ltd", + [3]byte{124, 14, 206}: "Cisco Systems, Inc", + [3]byte{124, 16, 21}: "Brilliant Home Technology, Inc.", + [3]byte{124, 17, 190}: "Apple, Inc.", + [3]byte{124, 17, 203}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{124, 17, 205}: "QianTang Technology", + [3]byte{124, 20, 118}: "Damall Technologies SAS", + [3]byte{124, 22, 13}: "Saia-Burgess Controls AG", + [3]byte{124, 24, 205}: "E-TRON Co.,Ltd.", + [3]byte{124, 26, 3}: "8Locations Co., Ltd.", + [3]byte{124, 26, 252}: "Dalian Co-Edifice Video Technology Co., Ltd", + [3]byte{124, 28, 78}: "LG Innotek", + [3]byte{124, 28, 104}: "Samsung Electronics Co.,Ltd", + [3]byte{124, 28, 241}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{124, 29, 217}: "Xiaomi Communications Co Ltd", + [3]byte{124, 30, 82}: "Microsoft", + [3]byte{124, 30, 179}: "2N TELEKOMUNIKACE a.s.", + [3]byte{124, 32, 72}: "KoamTac", + [3]byte{124, 32, 100}: "Alcatel-Lucent IPD", + [3]byte{124, 37, 135}: "chaowifi.com", + [3]byte{124, 38, 52}: "ARRIS Group, Inc.", + [3]byte{124, 38, 100}: "Sagemcom Broadband SAS", + [3]byte{124, 43, 225}: "Shenzhen Ferex Electrical Co.,Ltd", + [3]byte{124, 44, 243}: "Secure Electrans Ltd", + [3]byte{124, 46, 13}: "Blackmagic Design", + [3]byte{124, 46, 221}: "Samsung Electronics Co.,Ltd", + [3]byte{124, 47, 128}: "Gigaset Communications GmbH", + [3]byte{124, 51, 110}: "MEG Electronics Inc.", + [3]byte{124, 53, 72}: "Transcend Information", + [3]byte{124, 56, 102}: "Texas Instruments", + [3]byte{124, 56, 108}: "Real Time Logic", + [3]byte{124, 57, 32}: "SSOMA SECURITY", + [3]byte{124, 59, 213}: "Imago Group", + [3]byte{124, 60, 182}: "Shenzhen Homecare Technology Co.,Ltd.", + [3]byte{124, 62, 157}: "PATECH", + [3]byte{124, 67, 143}: "E-Band Communications Corp.", + [3]byte{124, 68, 76}: "Entertainment Solutions, S.L.", + [3]byte{124, 70, 133}: "Motorola (Wuhan) Mobility Technologies Communication Co., Ltd.", + [3]byte{124, 71, 124}: "IEEE Registration Authority", + [3]byte{124, 73, 185}: "Plexus Manufacturing Sdn Bhd", + [3]byte{124, 74, 130}: "Portsmith LLC", + [3]byte{124, 74, 168}: "MindTree Wireless PVT Ltd", + [3]byte{124, 75, 120}: "Red Sun Synthesis Pte Ltd", + [3]byte{124, 76, 88}: "Scale Computing, Inc.", + [3]byte{124, 76, 165}: "BSkyB Ltd", + [3]byte{124, 79, 125}: "Sawwave", + [3]byte{124, 79, 181}: "Arcadyan Technology Corporation", + [3]byte{124, 80, 73}: "Apple, Inc.", + [3]byte{124, 83, 74}: "Metamako", + [3]byte{124, 85, 231}: "YSI, Inc.", + [3]byte{124, 87, 78}: "COBI GmbH", + [3]byte{124, 90, 28}: "Sophos Ltd", + [3]byte{124, 90, 103}: "JNC Systems, Inc.", + [3]byte{124, 92, 248}: "Intel Corporate", + [3]byte{124, 96, 151}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{124, 97, 147}: "HTC Corporation", + [3]byte{124, 100, 86}: "Samsung Electronics Co.,Ltd", + [3]byte{124, 102, 157}: "Texas Instruments", + [3]byte{124, 103, 162}: "Intel Corporate", + [3]byte{124, 105, 246}: "Cisco Systems, Inc", + [3]byte{124, 106, 179}: "IBC TECHNOLOGIES INC.", + [3]byte{124, 106, 195}: "GatesAir, Inc", + [3]byte{124, 106, 219}: "SafeTone Technology Co.,Ltd", + [3]byte{124, 106, 243}: "Integrated Device Technology (Malaysia) Sdn. Bhd.", + [3]byte{124, 107, 51}: "Tenyu Tech Co. Ltd.", + [3]byte{124, 107, 82}: "Tigaro Wireless", + [3]byte{124, 107, 247}: "NTI co., ltd.", + [3]byte{124, 108, 57}: "PIXSYS SRL", + [3]byte{124, 108, 143}: "AMS NEVE LTD", + [3]byte{124, 109, 98}: "Apple, Inc.", + [3]byte{124, 109, 248}: "Apple, Inc.", + [3]byte{124, 111, 6}: "Caterpillar Trimble Control Technologies", + [3]byte{124, 111, 248}: "ShenZhen ACTO Digital Video Technology Co.,Ltd.", + [3]byte{124, 112, 188}: "IEEE Registration Authority", + [3]byte{124, 113, 118}: "Wuxi iData Technology Company Ltd.", + [3]byte{124, 114, 228}: "Unikey Technologies", + [3]byte{124, 115, 139}: "Cocoon Alarm Ltd", + [3]byte{124, 118, 48}: "Shenzhen YOUHUA Technology Co., Ltd", + [3]byte{124, 118, 53}: "Intel Corporate", + [3]byte{124, 118, 115}: "ENMAS GmbH", + [3]byte{124, 120, 126}: "Samsung Electronics Co.,Ltd", + [3]byte{124, 121, 232}: "PayRange Inc.", + [3]byte{124, 122, 83}: "Phytrex Technology Corp.", + [3]byte{124, 122, 145}: "Intel Corporate", + [3]byte{124, 123, 139}: "Control Concepts, Inc.", + [3]byte{124, 123, 228}: "Z'SEDAI KENKYUSHO CORPORATION", + [3]byte{124, 125, 61}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{124, 125, 65}: "Jinmuyu Electronics Co., Ltd.", + [3]byte{124, 130, 45}: "Nortec", + [3]byte{124, 130, 116}: "Shenzhen Hikeen Technology CO.,LTD", + [3]byte{124, 131, 6}: "Glen Dimplex Nordic as", + [3]byte{124, 139, 202}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{124, 141, 145}: "Shanghai Hongzhuo Information Technology co.,LTD", + [3]byte{124, 142, 228}: "Texas Instruments", + [3]byte{124, 145, 34}: "Samsung Electronics Co.,Ltd", + [3]byte{124, 148, 178}: "Philips Healthcare PCCI", + [3]byte{124, 149, 177}: "Aerohive Networks Inc.", + [3]byte{124, 149, 243}: "Cisco Systems, Inc", + [3]byte{124, 151, 99}: "Openmatics s.r.o.", + [3]byte{124, 154, 155}: "VSE valencia smart energy", + [3]byte{124, 161, 93}: "GN ReSound A/S", + [3]byte{124, 162, 55}: "King Slide Technology CO., LTD.", + [3]byte{124, 162, 62}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{124, 162, 155}: "D.SignT GmbH & Co. KG", + [3]byte{124, 166, 29}: "MHL, LLC", + [3]byte{124, 169, 125}: "Objenious", + [3]byte{124, 171, 37}: "MESMO TECHNOLOGY INC.", + [3]byte{124, 172, 178}: "Bosch Software Innovations GmbH", + [3]byte{124, 173, 116}: "Cisco Systems, Inc", + [3]byte{124, 176, 62}: "OSRAM GmbH", + [3]byte{124, 176, 194}: "Intel Corporate", + [3]byte{124, 177, 93}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{124, 177, 119}: "Satelco AG", + [3]byte{124, 178, 27}: "Cisco SPVTG", + [3]byte{124, 178, 50}: "Hui Zhou Gaoshengda Technology Co.,LTD", + [3]byte{124, 178, 92}: "Acacia Communications", + [3]byte{124, 181, 66}: "ACES Technology", + [3]byte{124, 183, 51}: "ASKEY COMPUTER CORP", + [3]byte{124, 183, 123}: "Paradigm Electronics Inc", + [3]byte{124, 185, 96}: "Shanghai X-Cheng telecom LTD", + [3]byte{124, 186, 204}: "IEEE Registration Authority", + [3]byte{124, 187, 111}: "Cosco Electronics Co., Ltd.", + [3]byte{124, 187, 138}: "Nintendo Co., Ltd.", + [3]byte{124, 189, 6}: "AE REFUsol", + [3]byte{124, 191, 136}: "Mobilicom LTD", + [3]byte{124, 191, 177}: "ARRIS Group, Inc.", + [3]byte{124, 195, 161}: "Apple, Inc.", + [3]byte{124, 196, 239}: "Devialet", + [3]byte{124, 197, 55}: "Apple, Inc.", + [3]byte{124, 198, 196}: "Kolff Computer Supplies b.v.", + [3]byte{124, 199, 9}: "SHENZHEN RF-LINK TECHNOLOGY CO.,LTD.", + [3]byte{124, 200, 171}: "Acro Associates, Inc.", + [3]byte{124, 200, 208}: "TIANJIN YAAN TECHNOLOGY CO., LTD.", + [3]byte{124, 200, 215}: "Damalisk", + [3]byte{124, 201, 90}: "Dell EMC", + [3]byte{124, 203, 13}: "Antaira Technologies, LLC", + [3]byte{124, 203, 226}: "IEEE Registration Authority", + [3]byte{124, 204, 31}: "SICHUAN TIANYI COMHEART TELECOMCO.,LTD", + [3]byte{124, 204, 184}: "Intel Corporate", + [3]byte{124, 205, 17}: "MS-Magnet", + [3]byte{124, 205, 60}: "Guangzhou Juzing Technology Co., Ltd", + [3]byte{124, 207, 207}: "Shanghai SEARI Intelligent System Co., Ltd", + [3]byte{124, 209, 195}: "Apple, Inc.", + [3]byte{124, 211, 10}: "INVENTEC Corporation", + [3]byte{124, 215, 98}: "Freestyle Technology Pty Ltd", + [3]byte{124, 216, 68}: "Enmotus Inc", + [3]byte{124, 217, 254}: "New Cosmos Electric Co., Ltd.", + [3]byte{124, 218, 132}: "Dongnian Networks Inc.", + [3]byte{124, 221, 17}: "Chongqing MAS SCI&TECH.Co.,Ltd", + [3]byte{124, 221, 32}: "IOXOS Technologies S.A.", + [3]byte{124, 221, 118}: "Suzhou Hanming Technologies Co., Ltd.", + [3]byte{124, 221, 144}: "Shenzhen Ogemray Technology Co., Ltd.", + [3]byte{124, 224, 68}: "NEON Inc", + [3]byte{124, 225, 255}: "Computer Performance, Inc. DBA Digital Loggers, Inc.", + [3]byte{124, 226, 202}: "Juniper Networks", + [3]byte{124, 228, 170}: "Private", + [3]byte{124, 229, 36}: "Quirky, Inc.", + [3]byte{124, 229, 107}: "ESEN Optoelectronics Technology Co.,Ltd.", + [3]byte{124, 233, 124}: "ITEL MOBILE LIMITED", + [3]byte{124, 233, 211}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{124, 235, 127}: "Dmet Products Corp.", + [3]byte{124, 235, 174}: "Ridgeline Instruments", + [3]byte{124, 235, 234}: "ASCT", + [3]byte{124, 236, 121}: "Texas Instruments", + [3]byte{124, 237, 141}: "Microsoft", + [3]byte{124, 239, 24}: "Creative Product Design Pty. Ltd.", + [3]byte{124, 239, 138}: "Inhon International Ltd.", + [3]byte{124, 240, 95}: "Apple, Inc.", + [3]byte{124, 240, 152}: "Bee Beans Technologies, Inc.", + [3]byte{124, 240, 186}: "Linkwell Telesystems Pvt Ltd", + [3]byte{124, 244, 41}: "NUUO Inc.", + [3]byte{124, 248, 84}: "Samsung Electronics Co.,Ltd", + [3]byte{124, 249, 14}: "Samsung Electronics Co.,Ltd", + [3]byte{124, 249, 92}: "U.I. Lapp GmbH", + [3]byte{124, 250, 223}: "Apple, Inc.", + [3]byte{124, 252, 60}: "Visteon Corporation", + [3]byte{124, 254, 40}: "Salutron Inc.", + [3]byte{124, 254, 78}: "Shenzhen Safe vision Technology Co.,LTD", + [3]byte{124, 254, 144}: "Mellanox Technologies, Inc.", + [3]byte{124, 255, 98}: "Huizhou Super Electron Technology Co.,Ltd.", + [3]byte{128, 0, 11}: "Intel Corporate", + [3]byte{128, 0, 16}: "AT&T", + [3]byte{128, 0, 110}: "Apple, Inc.", + [3]byte{128, 1, 132}: "HTC Corporation", + [3]byte{128, 2, 223}: "ORA Inc.", + [3]byte{128, 5, 223}: "Montage Technology Group Limited", + [3]byte{128, 7, 162}: "Esson Technology Inc.", + [3]byte{128, 9, 2}: "Keysight Technologies, Inc.", + [3]byte{128, 10, 6}: "COMTEC co.,ltd", + [3]byte{128, 10, 128}: "IEEE Registration Authority", + [3]byte{128, 11, 81}: "Chengdu XGimi Technology Co.,Ltd", + [3]byte{128, 13, 215}: "Latticework, Inc", + [3]byte{128, 14, 36}: "ForgetBox", + [3]byte{128, 19, 130}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{128, 20, 64}: "Sunlit System Technology Corp", + [3]byte{128, 20, 168}: "Guangzhou V-SOLUTION Electronic Technology Co., Ltd.", + [3]byte{128, 22, 183}: "Brunel University", + [3]byte{128, 23, 125}: "Nortel Networks", + [3]byte{128, 24, 68}: "Dell Inc.", + [3]byte{128, 24, 167}: "Samsung Electronics Co.,Ltd", + [3]byte{128, 25, 52}: "Intel Corporate", + [3]byte{128, 25, 103}: "Shanghai Reallytek Information Technology Co.,Ltd", + [3]byte{128, 25, 254}: "JianLing Technology CO., LTD", + [3]byte{128, 29, 170}: "Avaya Inc", + [3]byte{128, 31, 2}: "Edimax Technology Co. Ltd.", + [3]byte{128, 32, 175}: "Trade FIDES, a.s.", + [3]byte{128, 34, 117}: "Beijing Beny Wave Technology Co Ltd", + [3]byte{128, 38, 137}: "D-Link International", + [3]byte{128, 41, 148}: "Technicolor CH USA Inc.", + [3]byte{128, 42, 168}: "Ubiquiti Networks Inc.", + [3]byte{128, 42, 250}: "Germaneers GmbH", + [3]byte{128, 45, 225}: "Solarbridge Technologies", + [3]byte{128, 46, 20}: "azeti Networks AG", + [3]byte{128, 47, 222}: "Zurich Instruments AG", + [3]byte{128, 48, 220}: "Texas Instruments", + [3]byte{128, 52, 87}: "OT Systems Limited", + [3]byte{128, 55, 115}: "NETGEAR", + [3]byte{128, 56, 150}: "SHARP Corporation", + [3]byte{128, 56, 188}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{128, 56, 253}: "LeapFrog Enterprises, Inc.", + [3]byte{128, 57, 229}: "PATLITE CORPORATION", + [3]byte{128, 58, 10}: "Integrated Device Technology (Malaysia) Sdn. Bhd.", + [3]byte{128, 58, 89}: "AT&T", + [3]byte{128, 59, 42}: "ABB Xiamen Low Voltage Equipment Co.,Ltd.", + [3]byte{128, 59, 154}: "ghe-ces electronic ag", + [3]byte{128, 59, 246}: "LOOK EASY INTERNATIONAL LIMITED", + [3]byte{128, 63, 93}: "Winstars Technology Ltd", + [3]byte{128, 63, 214}: "bytes at work AG", + [3]byte{128, 65, 78}: "BBK EDUCATIONAL ELECTRONICS CORP.,LTD.", + [3]byte{128, 66, 124}: "Adolf Tedsen GmbH & Co. KG", + [3]byte{128, 71, 49}: "Packet Design, Inc.", + [3]byte{128, 72, 165}: "SICHUAN TIANYI COMHEART TELECOMCO.,LTD", + [3]byte{128, 73, 113}: "Apple, Inc.", + [3]byte{128, 75, 32}: "Ventilation Control", + [3]byte{128, 78, 129}: "Samsung Electronics Co.,Ltd", + [3]byte{128, 79, 88}: "ThinkEco, Inc.", + [3]byte{128, 80, 27}: "Nokia Corporation", + [3]byte{128, 80, 103}: "W & D TECHNOLOGY CORPORATION", + [3]byte{128, 86, 242}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{128, 87, 25}: "Samsung Electronics Co.,Ltd", + [3]byte{128, 88, 197}: "NovaTec Kommunikationstechnik GmbH", + [3]byte{128, 88, 248}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{128, 89, 253}: "Noviga", + [3]byte{128, 90, 4}: "LG Electronics (Mobile Communications)", + [3]byte{128, 94, 12}: "YEALINK(XIAMEN) NETWORK TECHNOLOGY CO.,LTD.", + [3]byte{128, 94, 192}: "YEALINK(XIAMEN) NETWORK TECHNOLOGY CO.,LTD.", + [3]byte{128, 96, 7}: "RIM", + [3]byte{128, 97, 95}: "Beijing Sinead Technology Co., Ltd.", + [3]byte{128, 97, 143}: "Shenzhen sangfei consumer communications co.,ltd", + [3]byte{128, 100, 89}: "Nimbus Inc.", + [3]byte{128, 101, 109}: "Samsung Electronics Co.,Ltd", + [3]byte{128, 101, 233}: "BenQ Corporation", + [3]byte{128, 102, 41}: "Prescope Technologies CO.,LTD.", + [3]byte{128, 106, 176}: "Shenzhen TINNO Mobile Technology Corp.", + [3]byte{128, 108, 27}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{128, 108, 139}: "KAESER KOMPRESSOREN AG", + [3]byte{128, 108, 188}: "NET New Electronic Technology GmbH", + [3]byte{128, 113, 31}: "Juniper Networks", + [3]byte{128, 113, 122}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{128, 115, 159}: "KYOCERA CORPORATION", + [3]byte{128, 116, 89}: "K's Co.,Ltd.", + [3]byte{128, 118, 147}: "Newag SA", + [3]byte{128, 121, 174}: "ShanDong Tecsunrise Co.,Ltd", + [3]byte{128, 122, 127}: "ABB Genway Xiamen Electrical Equipment CO., LTD", + [3]byte{128, 122, 191}: "HTC Corporation", + [3]byte{128, 123, 30}: "Corsair Components", + [3]byte{128, 123, 133}: "IEEE Registration Authority", + [3]byte{128, 125, 27}: "Neosystem Co. Ltd.", + [3]byte{128, 125, 227}: "Chongqing Sichuan Instrument Microcircuit Co.LTD.", + [3]byte{128, 129, 165}: "TONGQING COMMUNICATION EQUIPMENT (SHENZHEN) Co.,Ltd", + [3]byte{128, 130, 135}: "ATCOM Technology Co.Ltd.", + [3]byte{128, 134, 152}: "Netronics Technologies Inc.", + [3]byte{128, 134, 242}: "Intel Corporate", + [3]byte{128, 137, 23}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{128, 139, 92}: "Shenzhen Runhuicheng Technology Co., Ltd", + [3]byte{128, 140, 151}: "Kaonmedia CO., LTD.", + [3]byte{128, 141, 183}: "Hewlett Packard Enterprise", + [3]byte{128, 145, 42}: "Lih Rong electronic Enterprise Co., Ltd.", + [3]byte{128, 145, 192}: "AgileMesh, Inc.", + [3]byte{128, 146, 159}: "Apple, Inc.", + [3]byte{128, 147, 147}: "Xapt GmbH", + [3]byte{128, 148, 108}: "TOKYO RADAR CORPORATION", + [3]byte{128, 150, 177}: "ARRIS Group, Inc.", + [3]byte{128, 150, 202}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{128, 151, 27}: "Altenergy Power System,Inc.", + [3]byte{128, 155, 32}: "Intel Corporate", + [3]byte{128, 159, 171}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{128, 160, 54}: "Shanghai MXCHIP Information Technology Co., Ltd.", + [3]byte{128, 161, 171}: "Intellisis", + [3]byte{128, 161, 215}: "Shanghai DareGlobal Technologies Co.,Ltd", + [3]byte{128, 165, 137}: "AzureWave Technology Inc.", + [3]byte{128, 168, 93}: "Osterhout Design Group", + [3]byte{128, 170, 164}: "USAG", + [3]byte{128, 172, 172}: "Juniper Networks", + [3]byte{128, 173, 103}: "Kasda Networks Inc", + [3]byte{128, 176, 61}: "Apple, Inc.", + [3]byte{128, 178, 25}: "ELEKTRON TECHNOLOGY UK LIMITED", + [3]byte{128, 178, 52}: "Technicolor CH USA Inc.", + [3]byte{128, 178, 137}: "Forworld Electronics Ltd.", + [3]byte{128, 179, 42}: "Alstom Grid", + [3]byte{128, 182, 134}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{128, 183, 8}: "Blue Danube Systems, Inc", + [3]byte{128, 183, 9}: "Viptela, Inc", + [3]byte{128, 185, 92}: "ELFTECH Co., Ltd.", + [3]byte{128, 186, 172}: "TeleAdapt Ltd", + [3]byte{128, 186, 230}: "Neets", + [3]byte{128, 187, 235}: "Satmap Systems Ltd", + [3]byte{128, 190, 5}: "Apple, Inc.", + [3]byte{128, 193, 110}: "Hewlett Packard", + [3]byte{128, 197, 230}: "Microsoft Corporation", + [3]byte{128, 197, 242}: "AzureWave Technology Inc.", + [3]byte{128, 198, 63}: "Remec Broadband Wireless , LLC", + [3]byte{128, 198, 171}: "Technicolor CH USA Inc.", + [3]byte{128, 198, 202}: "Endian s.r.l.", + [3]byte{128, 199, 85}: "Panasonic Appliances Company", + [3]byte{128, 200, 98}: "Openpeak, Inc", + [3]byte{128, 206, 177}: "Theissen Training Systems GmbH", + [3]byte{128, 207, 65}: "Lenovo Mobile Communication Technology Ltd.", + [3]byte{128, 208, 25}: "Embed, Inc", + [3]byte{128, 208, 155}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{128, 209, 96}: "Integrated Device Technology (Malaysia) Sdn. Bhd.", + [3]byte{128, 209, 139}: "Hangzhou I'converge Technology Co.,Ltd", + [3]byte{128, 210, 29}: "AzureWave Technology Inc.", + [3]byte{128, 212, 51}: "LzLabs GmbH", + [3]byte{128, 212, 165}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{128, 214, 5}: "Apple, Inc.", + [3]byte{128, 215, 51}: "QSR Automations, Inc.", + [3]byte{128, 219, 49}: "Power Quotient International Co., Ltd.", + [3]byte{128, 224, 29}: "Cisco Systems, Inc", + [3]byte{128, 228, 218}: "IEEE Registration Authority", + [3]byte{128, 230, 80}: "Apple, Inc.", + [3]byte{128, 232, 111}: "Cisco Systems, Inc", + [3]byte{128, 234, 35}: "Wistron Neweb Corporation", + [3]byte{128, 234, 150}: "Apple, Inc.", + [3]byte{128, 234, 202}: "Dialog Semiconductor Hellas SA", + [3]byte{128, 235, 119}: "Wistron Corporation", + [3]byte{128, 237, 44}: "Apple, Inc.", + [3]byte{128, 238, 115}: "Shuttle Inc.", + [3]byte{128, 242, 94}: "Kyynel", + [3]byte{128, 245, 3}: "ARRIS Group, Inc.", + [3]byte{128, 245, 147}: "IRCO Sistemas de Telecomunicación S.A.", + [3]byte{128, 246, 46}: "Hangzhou H3C Technologies Co., Limited", + [3]byte{128, 248, 235}: "RayTight", + [3]byte{128, 250, 91}: "CLEVO CO.", + [3]byte{128, 251, 6}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{128, 255, 168}: "UNIDIS", + [3]byte{132, 0, 45}: "PEGATRON CORPORATION", + [3]byte{132, 0, 210}: "Sony Mobile Communications AB", + [3]byte{132, 1, 167}: "Greyware Automation Products, Inc", + [3]byte{132, 4, 210}: "Kirale Technologies SL", + [3]byte{132, 11, 45}: "SAMSUNG ELECTRO MECHANICS CO., LTD.", + [3]byte{132, 15, 69}: "Shanghai GMT Digital Technologies Co., Ltd", + [3]byte{132, 16, 13}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{132, 17, 158}: "Samsung Electronics Co.,Ltd", + [3]byte{132, 22, 249}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{132, 23, 21}: "GP Electronics (HK) Ltd.", + [3]byte{132, 23, 102}: "Weifang GoerTek Technology Co.,Ltd.", + [3]byte{132, 24, 38}: "Osram GmbH", + [3]byte{132, 24, 58}: "Ruckus Wireless", + [3]byte{132, 24, 136}: "Juniper Networks", + [3]byte{132, 27, 56}: "Shenzhen Excelsecu Data Technology Co.,Ltd", + [3]byte{132, 27, 94}: "NETGEAR", + [3]byte{132, 30, 38}: "KERNEL-I Co.,LTD", + [3]byte{132, 32, 150}: "SHENZHEN RF-LINK TECHNOLOGY CO.,LTD.", + [3]byte{132, 33, 65}: "Shenzhen Ginwave Technologies Ltd.", + [3]byte{132, 33, 241}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{132, 36, 141}: "Zebra Technologies Inc", + [3]byte{132, 37, 25}: "Samsung Electronics", + [3]byte{132, 37, 63}: "silex technology, Inc.", + [3]byte{132, 37, 164}: "Tariox Limited", + [3]byte{132, 37, 219}: "Samsung Electronics Co.,Ltd", + [3]byte{132, 38, 21}: "ADB Broadband Italia", + [3]byte{132, 38, 43}: "Nokia", + [3]byte{132, 38, 144}: "BEIJING THOUGHT SCIENCE CO.,LTD.", + [3]byte{132, 39, 206}: "Corporation of the Presiding Bishop of The Church of Jesus Christ of Latter-day Saints", + [3]byte{132, 40, 90}: "Saffron Solutions Inc", + [3]byte{132, 41, 20}: "EMPORIA TELECOM Produktions- und VertriebsgesmbH & Co KG", + [3]byte{132, 41, 153}: "Apple, Inc.", + [3]byte{132, 43, 43}: "Dell Inc.", + [3]byte{132, 43, 80}: "Huria Co.,Ltd.", + [3]byte{132, 43, 188}: "Modelleisenbahn GmbH", + [3]byte{132, 44, 128}: "Sichuan Changhong Electric Ltd.", + [3]byte{132, 46, 39}: "Samsung Electronics Co.,Ltd", + [3]byte{132, 47, 117}: "Innokas Group", + [3]byte{132, 48, 229}: "SkyHawke Technologies, LLC", + [3]byte{132, 50, 234}: "ANHUI WANZTEN P&T CO., LTD", + [3]byte{132, 52, 151}: "Hewlett Packard", + [3]byte{132, 54, 17}: "hyungseul publishing networks", + [3]byte{132, 56, 53}: "Apple, Inc.", + [3]byte{132, 56, 56}: "SAMSUNG ELECTRO-MECHANICS(THAILAND)", + [3]byte{132, 58, 75}: "Intel Corporate", + [3]byte{132, 61, 198}: "Cisco Systems, Inc", + [3]byte{132, 63, 78}: "Tri-Tech Manufacturing, Inc.", + [3]byte{132, 64, 118}: "Drivenets", + [3]byte{132, 65, 103}: "Apple, Inc.", + [3]byte{132, 68, 100}: "ServerU Inc", + [3]byte{132, 71, 101}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{132, 72, 35}: "WOXTER TECHNOLOGY Co. Ltd", + [3]byte{132, 73, 21}: "vArmour Networks, Inc.", + [3]byte{132, 75, 183}: "Beijing Sankuai Online Technology Co.,Ltd", + [3]byte{132, 75, 245}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{132, 79, 3}: "Ablelink Electronics Ltd", + [3]byte{132, 80, 154}: "Easy Soft TV Co., Ltd", + [3]byte{132, 81, 129}: "Samsung Electronics Co.,Ltd", + [3]byte{132, 85, 165}: "Samsung Electronics Co.,Ltd", + [3]byte{132, 86, 156}: "Coho Data, Inc.,", + [3]byte{132, 87, 135}: "DVR C&C Co., Ltd.", + [3]byte{132, 90, 129}: "ffly4u", + [3]byte{132, 91, 18}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{132, 92, 147}: "Chabrier Services", + [3]byte{132, 93, 215}: "Shenzhen Netcom Electronics Co.,Ltd", + [3]byte{132, 97, 160}: "ARRIS Group, Inc.", + [3]byte{132, 98, 35}: "Shenzhen Coship Electronics Co., Ltd.", + [3]byte{132, 98, 166}: "EuroCB (Phils), Inc.", + [3]byte{132, 99, 214}: "Microsoft Corporation", + [3]byte{132, 104, 62}: "Intel Corporate", + [3]byte{132, 106, 237}: "Wireless Tsukamoto.,co.LTD", + [3]byte{132, 110, 177}: "Park Assist LLC", + [3]byte{132, 114, 7}: "I&C Technology", + [3]byte{132, 115, 3}: "Letv Mobile and Intelligent Information Technology (Beijing) Corporation Ltd.", + [3]byte{132, 116, 42}: "zte corporation", + [3]byte{132, 118, 22}: "Addat s.r.o.", + [3]byte{132, 119, 120}: "Cochlear Limited", + [3]byte{132, 120, 139}: "Apple, Inc.", + [3]byte{132, 120, 172}: "Cisco Systems, Inc", + [3]byte{132, 121, 51}: "profichip GmbH", + [3]byte{132, 121, 115}: "Shanghai Baud Data Communication Co.,Ltd.", + [3]byte{132, 122, 136}: "HTC Corporation", + [3]byte{132, 123, 235}: "Dell Inc.", + [3]byte{132, 125, 80}: "Holley Metering Limited", + [3]byte{132, 126, 64}: "Texas Instruments", + [3]byte{132, 128, 45}: "Cisco Systems, Inc", + [3]byte{132, 130, 244}: "Beijing Huasun Unicreate Technology Co., Ltd", + [3]byte{132, 131, 25}: "Hangzhou Zero Zero Technology Co., Ltd.", + [3]byte{132, 131, 54}: "Newrun", + [3]byte{132, 131, 113}: "Avaya Inc", + [3]byte{132, 132, 51}: "Paradox Engineering SA", + [3]byte{132, 133, 6}: "Apple, Inc.", + [3]byte{132, 133, 10}: "Hella Sonnen- und Wetterschutztechnik GmbH", + [3]byte{132, 134, 243}: "Greenvity Communications", + [3]byte{132, 137, 173}: "Apple, Inc.", + [3]byte{132, 141, 132}: "Rajant Corporation", + [3]byte{132, 141, 199}: "Cisco SPVTG", + [3]byte{132, 142, 12}: "Apple, Inc.", + [3]byte{132, 142, 150}: "Embertec Pty Ltd", + [3]byte{132, 142, 223}: "Sony Mobile Communications AB", + [3]byte{132, 143, 105}: "Dell Inc.", + [3]byte{132, 144, 0}: "Arnold & Richter Cine Technik", + [3]byte{132, 147, 12}: "InCoax Networks Europe AB", + [3]byte{132, 148, 140}: "Hitron Technologies. Inc", + [3]byte{132, 150, 129}: "Cathay Communication Co.,Ltd", + [3]byte{132, 150, 216}: "ARRIS Group, Inc.", + [3]byte{132, 151, 184}: "Memjet Inc.", + [3]byte{132, 152, 102}: "Samsung Electronics Co.,Ltd", + [3]byte{132, 156, 166}: "Arcadyan Technology Corporation", + [3]byte{132, 157, 100}: "SMC Corporation", + [3]byte{132, 157, 197}: "Centera Photonics Inc.", + [3]byte{132, 159, 181}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{132, 161, 52}: "Apple, Inc.", + [3]byte{132, 161, 209}: "Sagemcom Broadband SAS", + [3]byte{132, 164, 35}: "Sagemcom Broadband SAS", + [3]byte{132, 164, 102}: "Samsung Electronics Co.,Ltd", + [3]byte{132, 166, 200}: "Intel Corporate", + [3]byte{132, 167, 131}: "Alcatel Lucent", + [3]byte{132, 167, 136}: "Perples", + [3]byte{132, 168, 228}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{132, 169, 145}: "Cyber Trans Japan Co.,Ltd.", + [3]byte{132, 169, 196}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{132, 170, 156}: "MitraStar Technology Corp.", + [3]byte{132, 172, 164}: "Beijing Novel Super Digital TV Technology Co., Ltd", + [3]byte{132, 172, 251}: "Crouzet Automatismes", + [3]byte{132, 173, 88}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{132, 175, 31}: "Beat System Service Co,. Ltd.", + [3]byte{132, 175, 236}: "BUFFALO.INC", + [3]byte{132, 177, 83}: "Apple, Inc.", + [3]byte{132, 178, 97}: "Cisco Systems, Inc", + [3]byte{132, 181, 23}: "Cisco Systems, Inc", + [3]byte{132, 181, 65}: "Samsung Electronics Co.,Ltd", + [3]byte{132, 181, 156}: "Juniper Networks", + [3]byte{132, 184, 2}: "Cisco Systems, Inc", + [3]byte{132, 186, 59}: "CANON INC.", + [3]byte{132, 190, 82}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{132, 192, 239}: "Samsung Electronics Co.,Ltd", + [3]byte{132, 193, 193}: "Juniper Networks", + [3]byte{132, 194, 228}: "Jiangsu Qinheng Co., Ltd.", + [3]byte{132, 195, 232}: "Vaillant GmbH", + [3]byte{132, 199, 39}: "Gnodal Ltd", + [3]byte{132, 199, 169}: "C3PO S.A.", + [3]byte{132, 199, 234}: "Sony Mobile Communications AB", + [3]byte{132, 200, 177}: "Incognito Software Systems Inc.", + [3]byte{132, 201, 178}: "D-Link International", + [3]byte{132, 205, 98}: "ShenZhen IDWELL Technology CO.,Ltd", + [3]byte{132, 207, 191}: "Fairphone", + [3]byte{132, 211, 42}: "IEEE 1905.1", + [3]byte{132, 212, 126}: "Aruba Networks", + [3]byte{132, 212, 200}: "Widex A/S", + [3]byte{132, 214, 208}: "Amazon Technologies Inc.", + [3]byte{132, 217, 49}: "Hangzhou H3C Technologies Co., Limited", + [3]byte{132, 217, 200}: "Unipattern Co.,", + [3]byte{132, 219, 47}: "Sierra Wireless Inc", + [3]byte{132, 219, 172}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{132, 219, 252}: "Nokia", + [3]byte{132, 221, 32}: "Texas Instruments", + [3]byte{132, 221, 183}: "Cilag GmbH International", + [3]byte{132, 222, 61}: "Crystal Vision Ltd", + [3]byte{132, 223, 12}: "NET2GRID BV", + [3]byte{132, 223, 25}: "Chuango Security Technology Corporation", + [3]byte{132, 224, 88}: "ARRIS Group, Inc.", + [3]byte{132, 224, 244}: "IEEE Registration Authority", + [3]byte{132, 227, 35}: "Green Wave Telecommunication SDN BHD", + [3]byte{132, 227, 39}: "TAILYN TECHNOLOGIES INC", + [3]byte{132, 228, 217}: "Shenzhen NEED technology Ltd.", + [3]byte{132, 230, 41}: "Bluwan SA", + [3]byte{132, 231, 20}: "Liang Herng Enterprise,Co.Ltd.", + [3]byte{132, 234, 153}: "Vieworks", + [3]byte{132, 235, 24}: "Texas Instruments", + [3]byte{132, 237, 51}: "BBMC Co.,Ltd", + [3]byte{132, 239, 24}: "Intel Corporate", + [3]byte{132, 241, 41}: "Metrascale Inc.", + [3]byte{132, 244, 147}: "OMS spol. s.r.o.", + [3]byte{132, 246, 76}: "Cross Point BV", + [3]byte{132, 246, 250}: "Miovision Technologies Incorporated", + [3]byte{132, 252, 172}: "Apple, Inc.", + [3]byte{132, 252, 254}: "Apple, Inc.", + [3]byte{132, 254, 158}: "RTC Industries, Inc.", + [3]byte{132, 254, 220}: "Borqs Beijing Ltd.", + [3]byte{136, 1, 242}: "Vitec System Engineering Inc.", + [3]byte{136, 3, 85}: "Arcadyan Technology Corporation", + [3]byte{136, 7, 75}: "LG Electronics (Mobile Communications)", + [3]byte{136, 9, 5}: "MTMCommunications", + [3]byte{136, 9, 175}: "Masimo Corporation", + [3]byte{136, 15, 16}: "Huami Information Technology Co.,Ltd.", + [3]byte{136, 15, 182}: "Jabil Circuits India Pvt Ltd,-EHTP unit", + [3]byte{136, 16, 54}: "Panodic(ShenZhen) Electronics Limted", + [3]byte{136, 18, 78}: "Qualcomm Inc.", + [3]byte{136, 20, 43}: "Protonic Holland", + [3]byte{136, 21, 68}: "Cisco Meraki", + [3]byte{136, 24, 174}: "Tamron Co., Ltd", + [3]byte{136, 27, 153}: "SHENZHEN XIN FEI JIA ELECTRONIC CO. LTD.", + [3]byte{136, 29, 252}: "Cisco Systems, Inc", + [3]byte{136, 31, 161}: "Apple, Inc.", + [3]byte{136, 32, 18}: "LMI Technologies", + [3]byte{136, 33, 227}: "Nebusens, S.L.", + [3]byte{136, 35, 100}: "Watchnet DVR Inc", + [3]byte{136, 35, 254}: "TTTech Computertechnik AG", + [3]byte{136, 37, 44}: "Arcadyan Technology Corporation", + [3]byte{136, 37, 147}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{136, 40, 179}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{136, 41, 80}: "Dalian Netmoon Tech Develop Co.,Ltd", + [3]byte{136, 43, 215}: "ADDÉNERGIE TECHNOLOGIES", + [3]byte{136, 46, 90}: "storONE", + [3]byte{136, 48, 138}: "Murata Manufacturing Co., Ltd.", + [3]byte{136, 50, 155}: "SAMSUNG ELECTRO-MECHANICS(THAILAND)", + [3]byte{136, 51, 20}: "Texas Instruments", + [3]byte{136, 51, 190}: "Ivenix, Inc.", + [3]byte{136, 53, 76}: "Transics", + [3]byte{136, 54, 18}: "SRC Computers, LLC", + [3]byte{136, 54, 95}: "LG Electronics (Mobile Communications)", + [3]byte{136, 54, 108}: "EFM Networks", + [3]byte{136, 59, 139}: "Cheering Connection Co. Ltd.", + [3]byte{136, 60, 28}: "MERCURY CORPORATION", + [3]byte{136, 63, 211}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{136, 65, 87}: "Shenzhen Atsmart Technology Co.,Ltd.", + [3]byte{136, 65, 193}: "ORBISAT DA AMAZONIA IND E AEROL SA", + [3]byte{136, 65, 252}: "AirTies Wireless Networks", + [3]byte{136, 67, 225}: "Cisco Systems, Inc", + [3]byte{136, 68, 119}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{136, 68, 246}: "Nokia Corporation", + [3]byte{136, 70, 42}: "Telechips Inc.", + [3]byte{136, 74, 234}: "Texas Instruments", + [3]byte{136, 75, 57}: "Siemens AG, Healthcare Sector", + [3]byte{136, 76, 207}: "Pulzze Systems, Inc", + [3]byte{136, 80, 221}: "Infiniband Trade Association", + [3]byte{136, 81, 251}: "Hewlett Packard", + [3]byte{136, 83, 46}: "Intel Corporate", + [3]byte{136, 83, 149}: "Apple, Inc.", + [3]byte{136, 83, 212}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{136, 87, 109}: "XTA Electronics Ltd", + [3]byte{136, 87, 238}: "BUFFALO.INC", + [3]byte{136, 90, 146}: "Cisco Systems, Inc", + [3]byte{136, 91, 221}: "Aerohive Networks Inc.", + [3]byte{136, 92, 71}: "Alcatel Lucent", + [3]byte{136, 93, 144}: "IEEE Registration Authority", + [3]byte{136, 93, 251}: "zte corporation", + [3]byte{136, 97, 90}: "Siano Mobile Silicon Ltd.", + [3]byte{136, 99, 223}: "Apple, Inc.", + [3]byte{136, 102, 57}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{136, 102, 165}: "Apple, Inc.", + [3]byte{136, 104, 92}: "Shenzhen ChuangDao & Perpetual Eternal Technology Co.,Ltd", + [3]byte{136, 106, 177}: "vivo Mobile Communication Co., Ltd.", + [3]byte{136, 106, 227}: "Alpha Networks Inc.", + [3]byte{136, 107, 15}: "Bluegiga Technologies OY", + [3]byte{136, 107, 68}: "Sunnovo International Limited", + [3]byte{136, 107, 110}: "Apple, Inc.", + [3]byte{136, 107, 118}: "CHINA HOPEFUL GROUP HOPEFUL ELECTRIC CO.,LTD", + [3]byte{136, 112, 51}: "Hangzhou Silan Microelectronic Inc", + [3]byte{136, 112, 140}: "Lenovo Mobile Communication Technology Ltd.", + [3]byte{136, 112, 239}: "SC Professional Trading Co., Ltd.", + [3]byte{136, 113, 229}: "Amazon Technologies Inc.", + [3]byte{136, 115, 132}: "Toshiba", + [3]byte{136, 115, 152}: "K2E Tekpoint", + [3]byte{136, 117, 86}: "Cisco Systems, Inc", + [3]byte{136, 117, 152}: "Samsung Electronics Co.,Ltd", + [3]byte{136, 120, 115}: "Intel Corporate", + [3]byte{136, 120, 156}: "Game Technologies SA", + [3]byte{136, 121, 91}: "Konka Group Co., Ltd.", + [3]byte{136, 121, 126}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{136, 122, 49}: "Velankani Electronics Pvt. Ltd.", + [3]byte{136, 127, 3}: "Comper Technology Investment Limited", + [3]byte{136, 130, 121}: "Shenzhen RB-LINK Intelligent Technology Co.Ltd", + [3]byte{136, 131, 34}: "Samsung Electronics Co.,Ltd", + [3]byte{136, 131, 93}: "FN-LINK TECHNOLOGY LIMITED", + [3]byte{136, 134, 3}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{136, 134, 160}: "Simton Technologies, Ltd.", + [3]byte{136, 134, 194}: "STABILO International GmbH", + [3]byte{136, 135, 23}: "CANON INC.", + [3]byte{136, 135, 221}: "DarbeeVision Inc.", + [3]byte{136, 137, 20}: "All Components Incorporated", + [3]byte{136, 137, 100}: "GSI Electronics Inc.", + [3]byte{136, 139, 93}: "Storage Appliance Corporation", + [3]byte{136, 140, 25}: "Brady Corp Asia Pacific Ltd", + [3]byte{136, 144, 141}: "Cisco Systems, Inc", + [3]byte{136, 145, 102}: "Viewcooper Corp.", + [3]byte{136, 145, 221}: "Racktivity", + [3]byte{136, 148, 113}: "Brocade Communications Systems, Inc.", + [3]byte{136, 148, 126}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{136, 148, 249}: "Gemicom Technology, Inc.", + [3]byte{136, 149, 185}: "Unified Packet Systems Crop", + [3]byte{136, 150, 118}: "TTC MARCONI s.r.o.", + [3]byte{136, 150, 182}: "Global Fire Equipment S.A.", + [3]byte{136, 150, 242}: "Valeo Schalter und Sensoren GmbH", + [3]byte{136, 151, 223}: "Entrypass Corporation Sdn. Bhd.", + [3]byte{136, 152, 33}: "TERAON", + [3]byte{136, 155, 57}: "Samsung Electronics Co.,Ltd", + [3]byte{136, 156, 166}: "BTB Korea INC", + [3]byte{136, 159, 250}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{136, 160, 132}: "Formation Data Systems", + [3]byte{136, 162, 94}: "Juniper Networks", + [3]byte{136, 162, 215}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{136, 163, 204}: "Amatis Controls", + [3]byte{136, 165, 189}: "QPCOM INC.", + [3]byte{136, 166, 198}: "Sagemcom Broadband SAS", + [3]byte{136, 167, 60}: "Ragentek Technology Group", + [3]byte{136, 172, 193}: "Generiton Co., Ltd.", + [3]byte{136, 173, 67}: "PEGATRON CORPORATION", + [3]byte{136, 173, 210}: "Samsung Electronics Co.,Ltd", + [3]byte{136, 174, 29}: "COMPAL INFORMATION (KUNSHAN) CO., LTD.", + [3]byte{136, 177, 17}: "Intel Corporate", + [3]byte{136, 177, 104}: "Delta Control GmbH", + [3]byte{136, 177, 225}: "Mojo Networks, Inc.", + [3]byte{136, 180, 166}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{136, 182, 39}: "Gembird Europe BV", + [3]byte{136, 184, 208}: "Dongguan Koppo Electronic Co.,Ltd", + [3]byte{136, 186, 127}: "Qfiednet Co., Ltd.", + [3]byte{136, 189, 120}: "Flaircomm Microelectronics,Inc.", + [3]byte{136, 191, 213}: "Simple Audio Ltd", + [3]byte{136, 194, 66}: "Poynt Co.", + [3]byte{136, 194, 85}: "Texas Instruments", + [3]byte{136, 195, 110}: "Beijing Ereneben lnformation Technology Limited", + [3]byte{136, 195, 179}: "SOVICO", + [3]byte{136, 198, 38}: "Logitech, Inc", + [3]byte{136, 198, 99}: "Apple, Inc.", + [3]byte{136, 201, 208}: "LG Electronics (Mobile Communications)", + [3]byte{136, 203, 135}: "Apple, Inc.", + [3]byte{136, 203, 165}: "Suzhou Torchstar Intelligent Technology Co.,Ltd", + [3]byte{136, 204, 69}: "Skyworth Digital Technology(Shenzhen) Co.,Ltd", + [3]byte{136, 206, 250}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{136, 207, 152}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{136, 208, 57}: "TCL Technoly Electronics(Huizhou).,Ltd", + [3]byte{136, 209, 113}: "BEGHELLI S.P.A", + [3]byte{136, 210, 116}: "zte corporation", + [3]byte{136, 211, 123}: "FirmTek, LLC", + [3]byte{136, 213, 12}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{136, 215, 188}: "DEP Company", + [3]byte{136, 215, 246}: "ASUSTek COMPUTER INC.", + [3]byte{136, 217, 98}: "Canopus Systems US LLC", + [3]byte{136, 218, 26}: "Redpine Signals, Inc.", + [3]byte{136, 220, 150}: "SENAO Networks, Inc.", + [3]byte{136, 221, 121}: "Voltaire", + [3]byte{136, 222, 169}: "Roku, Inc.", + [3]byte{136, 224, 160}: "Shenzhen VisionSTOR Technologies Co., Ltd", + [3]byte{136, 224, 243}: "Juniper Networks", + [3]byte{136, 225, 97}: "Art Beijing Science and Technology Development Co., Ltd.", + [3]byte{136, 227, 171}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{136, 230, 3}: "Avotek corporation", + [3]byte{136, 230, 40}: "Shenzhen Kezhonglong Optoelectronic Technology Co.,Ltd", + [3]byte{136, 231, 18}: "Whirlpool Corporation", + [3]byte{136, 231, 166}: "iKnowledge Integration Corp.", + [3]byte{136, 232, 127}: "Apple, Inc.", + [3]byte{136, 232, 248}: "YONG TAI ELECTRONIC (DONGGUAN) LTD.", + [3]byte{136, 233, 23}: "Tamaggo", + [3]byte{136, 237, 28}: "Cudo Communication Co., Ltd.", + [3]byte{136, 240, 49}: "Cisco Systems, Inc", + [3]byte{136, 240, 119}: "Cisco Systems, Inc", + [3]byte{136, 244, 136}: "cellon communications technology(shenzhen)Co.,Ltd.", + [3]byte{136, 244, 144}: "Jetmobile Pte Ltd", + [3]byte{136, 247, 199}: "Technicolor CH USA Inc.", + [3]byte{136, 253, 21}: "LINEEYE CO., LTD", + [3]byte{136, 254, 214}: "ShangHai WangYong Software Co., Ltd.", + [3]byte{140, 0, 109}: "Apple, Inc.", + [3]byte{140, 4, 255}: "Technicolor CH USA Inc.", + [3]byte{140, 5, 81}: "Koubachi AG", + [3]byte{140, 7, 140}: "FLOW DATA INC", + [3]byte{140, 8, 139}: "Remote Solution", + [3]byte{140, 9, 244}: "ARRIS Group, Inc.", + [3]byte{140, 12, 144}: "Ruckus Wireless", + [3]byte{140, 12, 163}: "Amper", + [3]byte{140, 13, 118}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{140, 14, 227}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{140, 15, 111}: "PEGATRON CORPORATION", + [3]byte{140, 15, 131}: "Angie Hospitality LLC", + [3]byte{140, 16, 212}: "Sagemcom Broadband SAS", + [3]byte{140, 17, 203}: "ABUS Security-Center GmbH & Co. KG", + [3]byte{140, 20, 125}: "IEEE Registration Authority", + [3]byte{140, 24, 217}: "Shenzhen RF Technology Co., Ltd", + [3]byte{140, 25, 45}: "IEEE Registration Authority", + [3]byte{140, 26, 191}: "Samsung Electronics Co.,Ltd", + [3]byte{140, 31, 148}: "RF Surgical System Inc.", + [3]byte{140, 33, 10}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{140, 37, 5}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{140, 39, 29}: "QuantHouse", + [3]byte{140, 39, 138}: "Vocollect Inc", + [3]byte{140, 41, 55}: "Apple, Inc.", + [3]byte{140, 45, 170}: "Apple, Inc.", + [3]byte{140, 47, 57}: "IBA Dosimetry GmbH", + [3]byte{140, 47, 166}: "Solid Optics B.V.", + [3]byte{140, 51, 48}: "EmFirst Co., Ltd.", + [3]byte{140, 51, 87}: "HiteVision Digital Media Technology Co.,Ltd.", + [3]byte{140, 52, 253}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{140, 57, 92}: "Bit4id Srl", + [3]byte{140, 58, 227}: "LG Electronics (Mobile Communications)", + [3]byte{140, 59, 173}: "NETGEAR", + [3]byte{140, 60, 7}: "Skiva Technologies, Inc.", + [3]byte{140, 60, 74}: "NAKAYO Inc", + [3]byte{140, 65, 242}: "RDA Technologies Ltd.", + [3]byte{140, 68, 53}: "Shanghai BroadMobi Communication Technology Co., Ltd.", + [3]byte{140, 69, 0}: "Murata Manufacturing Co., Ltd.", + [3]byte{140, 74, 238}: "GIGA TMS INC", + [3]byte{140, 75, 89}: "3D Imaging & Simulations Corp", + [3]byte{140, 76, 220}: "PLANEX COMMUNICATIONS INC.", + [3]byte{140, 77, 185}: "Unmonday Ltd", + [3]byte{140, 77, 234}: "Cerio Corporation", + [3]byte{140, 81, 5}: "Shenzhen ireadygo Information Technology CO.,LTD.", + [3]byte{140, 83, 247}: "A&D ENGINEERING CO., LTD.", + [3]byte{140, 84, 29}: "LGE", + [3]byte{140, 86, 157}: "Imaging Solutions Group", + [3]byte{140, 86, 197}: "Nintendo Co., Ltd.", + [3]byte{140, 87, 155}: "Wistron Neweb Corporation", + [3]byte{140, 87, 253}: "LVX Western", + [3]byte{140, 88, 119}: "Apple, Inc.", + [3]byte{140, 89, 139}: "C Technologies AB", + [3]byte{140, 89, 195}: "ADB Italia", + [3]byte{140, 90, 240}: "Exeltech Solar Products", + [3]byte{140, 91, 240}: "ARRIS Group, Inc.", + [3]byte{140, 92, 161}: "d-broad,INC", + [3]byte{140, 93, 96}: "UCI Corporation Co.,Ltd.", + [3]byte{140, 95, 72}: "Continental Intelligent Transportation Systems LLC", + [3]byte{140, 95, 223}: "Beijing Railway Signal Factory", + [3]byte{140, 96, 79}: "Cisco Systems, Inc", + [3]byte{140, 96, 231}: "MPGIO CO.,LTD", + [3]byte{140, 97, 2}: "Beijing Baofengmojing Technologies Co., Ltd", + [3]byte{140, 100, 11}: "Beyond Devices d.o.o.", + [3]byte{140, 100, 34}: "Sony Mobile Communications AB", + [3]byte{140, 104, 120}: "Nortek-AS", + [3]byte{140, 106, 228}: "Viogem Limited", + [3]byte{140, 109, 80}: "SHENZHEN MTC CO LTD", + [3]byte{140, 112, 90}: "Intel Corporate", + [3]byte{140, 113, 248}: "Samsung Electronics Co.,Ltd", + [3]byte{140, 115, 110}: "FUJITSU LIMITED", + [3]byte{140, 118, 193}: "Goden Tech Limited", + [3]byte{140, 119, 18}: "Samsung Electronics Co.,Ltd", + [3]byte{140, 119, 22}: "LONGCHEER TELECOMMUNICATION LIMITED", + [3]byte{140, 120, 215}: "SHENZHEN FAST TECHNOLOGIES CO.,LTD", + [3]byte{140, 121, 103}: "zte corporation", + [3]byte{140, 123, 157}: "Apple, Inc.", + [3]byte{140, 124, 146}: "Apple, Inc.", + [3]byte{140, 124, 181}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{140, 124, 255}: "Brocade Communications Systems, Inc.", + [3]byte{140, 126, 179}: "Lytro, Inc.", + [3]byte{140, 127, 59}: "ARRIS Group, Inc.", + [3]byte{140, 130, 168}: "Insigma Technology Co.,Ltd", + [3]byte{140, 131, 157}: "SHENZHEN XINYUPENG ELECTRONIC TECHNOLOGY CO., LTD", + [3]byte{140, 132, 1}: "Private", + [3]byte{140, 133, 128}: "Smart Innovation LLC", + [3]byte{140, 133, 144}: "Apple, Inc.", + [3]byte{140, 135, 59}: "Leica Camera AG", + [3]byte{140, 137, 122}: "AUGTEK", + [3]byte{140, 137, 165}: "Micro-Star INT'L CO., LTD", + [3]byte{140, 138, 110}: "ESTUN AUTOMATION TECHNOLOY CO., LTD", + [3]byte{140, 138, 187}: "Beijing Orient View Technology Co., Ltd.", + [3]byte{140, 139, 131}: "Texas Instruments", + [3]byte{140, 142, 118}: "taskit GmbH", + [3]byte{140, 142, 242}: "Apple, Inc.", + [3]byte{140, 143, 233}: "Apple, Inc.", + [3]byte{140, 144, 211}: "Nokia", + [3]byte{140, 145, 9}: "Toyoshima Electric Technoeogy(Suzhou) Co.,Ltd.", + [3]byte{140, 146, 54}: "Aus.Linx Technology Co., Ltd.", + [3]byte{140, 147, 81}: "Jigowatts Inc.", + [3]byte{140, 148, 207}: "Encell Technology, Inc.", + [3]byte{140, 153, 230}: "TCT mobile ltd", + [3]byte{140, 159, 59}: "Qingdao Hisense Communications Co.,Ltd.", + [3]byte{140, 160, 72}: "Beijing NeTopChip Technology Co.,LTD", + [3]byte{140, 162, 253}: "Starry, Inc.", + [3]byte{140, 165, 161}: "Oregano Systems - Design & Consulting GmbH", + [3]byte{140, 166, 223}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{140, 169, 130}: "Intel Corporate", + [3]byte{140, 171, 142}: "Shanghai Feixun Communication Co.,Ltd.", + [3]byte{140, 174, 76}: "Plugable Technologies", + [3]byte{140, 174, 137}: "Y-cam Solutions Ltd", + [3]byte{140, 176, 148}: "Airtech I&C Co., Ltd", + [3]byte{140, 182, 79}: "Cisco Systems, Inc", + [3]byte{140, 183, 247}: "Shenzhen UniStrong Science & Technology Co., Ltd", + [3]byte{140, 184, 44}: "IPitomy Communications", + [3]byte{140, 184, 100}: "AcSiP Technology Corp.", + [3]byte{140, 190, 190}: "Xiaomi Communications Co Ltd", + [3]byte{140, 191, 157}: "Shanghai Xinyou Information Technology Ltd. Co.", + [3]byte{140, 191, 166}: "Samsung Electronics Co.,Ltd", + [3]byte{140, 193, 33}: "Panasonic Corporation AVC Networks Company", + [3]byte{140, 197, 225}: "ShenZhen Konka Telecommunication Technology Co.,Ltd", + [3]byte{140, 198, 97}: "Current, powered by GE", + [3]byte{140, 199, 170}: "Radinet Communications Inc.", + [3]byte{140, 199, 208}: "zhejiang ebang communication co.,ltd", + [3]byte{140, 200, 205}: "Samsung Electronics Co.,Ltd", + [3]byte{140, 200, 244}: "IEEE Registration Authority", + [3]byte{140, 205, 162}: "ACTP, Inc.", + [3]byte{140, 205, 232}: "Nintendo Co., Ltd.", + [3]byte{140, 207, 9}: "Dell EMC", + [3]byte{140, 207, 92}: "BEFEGA GmbH", + [3]byte{140, 209, 123}: "CG Mobile", + [3]byte{140, 210, 233}: "YOKOTE SEIKO CO., LTD.", + [3]byte{140, 211, 162}: "VisSim AS", + [3]byte{140, 212, 142}: "ITEL MOBILE LIMITED", + [3]byte{140, 214, 40}: "Ikor Metering", + [3]byte{140, 219, 37}: "ESG Solutions", + [3]byte{140, 220, 212}: "Hewlett Packard", + [3]byte{140, 221, 141}: "Wifly-City System Inc.", + [3]byte{140, 222, 82}: "ISSC Technologies Corp.", + [3]byte{140, 222, 153}: "Comlab Inc.", + [3]byte{140, 223, 157}: "NEC Corporation", + [3]byte{140, 224, 129}: "zte corporation", + [3]byte{140, 225, 23}: "zte corporation", + [3]byte{140, 226, 218}: "Circle Media Inc", + [3]byte{140, 227, 142}: "Toshiba Memory Corporation", + [3]byte{140, 231, 72}: "Private", + [3]byte{140, 231, 140}: "DK Networks", + [3]byte{140, 231, 179}: "Sonardyne International Ltd", + [3]byte{140, 234, 27}: "Edgecore Networks Corporation", + [3]byte{140, 235, 198}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{140, 236, 75}: "Dell Inc.", + [3]byte{140, 238, 198}: "Precepscion Pty. Ltd.", + [3]byte{140, 242, 40}: "SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.", + [3]byte{140, 245, 163}: "SAMSUNG ELECTRO-MECHANICS(THAILAND)", + [3]byte{140, 248, 19}: "ORANGE POLSKA", + [3]byte{140, 249, 69}: "Power Automation pte Ltd", + [3]byte{140, 249, 201}: "MESADA Technology Co.,Ltd.", + [3]byte{140, 250, 186}: "Apple, Inc.", + [3]byte{140, 253, 240}: "Qualcomm Inc.", + [3]byte{140, 254, 180}: "VSOONTECH ELECTRONICS CO., LIMITED", + [3]byte{144, 0, 78}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{144, 0, 219}: "Samsung Electronics Co.,Ltd", + [3]byte{144, 1, 59}: "Sagemcom Broadband SAS", + [3]byte{144, 2, 138}: "Shenzhen Shidean Legrand Electronic Products Co.,Ltd", + [3]byte{144, 2, 169}: "Zhejiang Dahua Technology Co., Ltd.", + [3]byte{144, 3, 37}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{144, 3, 183}: "PARROT SA", + [3]byte{144, 6, 40}: "Samsung Electronics Co.,Ltd", + [3]byte{144, 9, 23}: "Far-sighted mobile", + [3]byte{144, 10, 26}: "Taicang T&W Electronics", + [3]byte{144, 10, 57}: "Wiio, Inc.", + [3]byte{144, 10, 58}: "PSG Plastic Service GmbH", + [3]byte{144, 11, 193}: "Sprocomm Technologies CO.,Ltd", + [3]byte{144, 12, 180}: "Alinket Electronic Technology Co., Ltd", + [3]byte{144, 13, 102}: "Digimore Electronics Co., Ltd", + [3]byte{144, 13, 203}: "ARRIS Group, Inc.", + [3]byte{144, 14, 131}: "Monico Monitoring, Inc.", + [3]byte{144, 23, 17}: "Hagenuk Marinekommunikation GmbH", + [3]byte{144, 23, 155}: "Nanomegas", + [3]byte{144, 23, 172}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{144, 24, 94}: "Apex Tool Group GmbH & Co OHG", + [3]byte{144, 24, 124}: "SAMSUNG ELECTRO MECHANICS CO., LTD.", + [3]byte{144, 24, 174}: "Shanghai Meridian Technologies, Co. Ltd.", + [3]byte{144, 25, 0}: "SCS SA", + [3]byte{144, 26, 202}: "ARRIS Group, Inc.", + [3]byte{144, 27, 14}: "Fujitsu Technology Solutions GmbH", + [3]byte{144, 29, 39}: "zte corporation", + [3]byte{144, 30, 221}: "GREAT COMPUTER CORPORATION", + [3]byte{144, 32, 58}: "BYD Precision Manufacture Co.,Ltd", + [3]byte{144, 32, 131}: "General Engine Management Systems Ltd.", + [3]byte{144, 33, 6}: "BSkyB Ltd", + [3]byte{144, 33, 85}: "HTC Corporation", + [3]byte{144, 33, 129}: "Shanghai Huaqin Telecom Technology Co.,Ltd", + [3]byte{144, 35, 236}: "Availink, Inc.", + [3]byte{144, 39, 228}: "Apple, Inc.", + [3]byte{144, 43, 52}: "GIGA-BYTE TECHNOLOGY CO.,LTD.", + [3]byte{144, 44, 199}: "C-MAX Asia Limited", + [3]byte{144, 46, 28}: "Intel Corporate", + [3]byte{144, 46, 135}: "LabJack", + [3]byte{144, 49, 205}: "Onyx Healthcare Inc.", + [3]byte{144, 50, 75}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{144, 52, 43}: "Gatekeeper Systems, Inc.", + [3]byte{144, 52, 252}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{144, 53, 110}: "Vodafone Omnitel N.V.", + [3]byte{144, 56, 9}: "Ericsson AB", + [3]byte{144, 56, 223}: "Changzhou Tiannengbo System Co. Ltd.", + [3]byte{144, 58, 160}: "Nokia", + [3]byte{144, 58, 230}: "PARROT SA", + [3]byte{144, 60, 146}: "Apple, Inc.", + [3]byte{144, 60, 174}: "Yunnan KSEC Digital Technology Co.,Ltd.", + [3]byte{144, 61, 90}: "Shenzhen Wision Technology Holding Limited", + [3]byte{144, 61, 107}: "Zicon Technology Corp.", + [3]byte{144, 61, 189}: "SECURE METERS LIMITED", + [3]byte{144, 62, 171}: "ARRIS Group, Inc.", + [3]byte{144, 69, 6}: "Tokyo Boeki Medisys Inc.", + [3]byte{144, 70, 162}: "Tedipay UK Ltd", + [3]byte{144, 70, 183}: "Vadaro Pte Ltd", + [3]byte{144, 71, 22}: "RORZE CORPORATION", + [3]byte{144, 72, 154}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{144, 73, 250}: "Intel Corporate", + [3]byte{144, 76, 229}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{144, 77, 74}: "Sagemcom Broadband SAS", + [3]byte{144, 78, 43}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{144, 78, 145}: "IEEE Registration Authority", + [3]byte{144, 80, 90}: "unGlue, Inc", + [3]byte{144, 80, 123}: "Advanced PANMOBIL Systems GmbH & Co. KG", + [3]byte{144, 80, 202}: "Hitron Technologies. Inc", + [3]byte{144, 81, 63}: "Elettronica Santerno SpA", + [3]byte{144, 84, 70}: "TES ELECTRONIC SOLUTIONS", + [3]byte{144, 85, 174}: "Ericsson, EAB/RWI/K", + [3]byte{144, 86, 130}: "Lenbrook Industries Limited", + [3]byte{144, 86, 146}: "Autotalks Ltd.", + [3]byte{144, 89, 175}: "Texas Instruments", + [3]byte{144, 92, 68}: "Compal Broadband Networks, Inc.", + [3]byte{144, 95, 46}: "TCT mobile ltd", + [3]byte{144, 95, 141}: "modas GmbH", + [3]byte{144, 96, 241}: "Apple, Inc.", + [3]byte{144, 97, 12}: "Fida International (S) Pte Ltd", + [3]byte{144, 97, 174}: "Intel Corporate", + [3]byte{144, 103, 23}: "Alphion India Private Limited", + [3]byte{144, 103, 28}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{144, 103, 181}: "Alcatel-Lucent", + [3]byte{144, 103, 243}: "Alcatel Lucent", + [3]byte{144, 104, 195}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{144, 108, 172}: "Fortinet, Inc.", + [3]byte{144, 109, 200}: "DLG Automação Industrial Ltda", + [3]byte{144, 110, 187}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{144, 111, 24}: "Private", + [3]byte{144, 111, 169}: "NANJING PUTIAN TELECOMMUNICATIONS TECHNOLOGY CO.,LTD.", + [3]byte{144, 112, 37}: "Garea Microsys Co.,Ltd.", + [3]byte{144, 112, 101}: "Texas Instruments", + [3]byte{144, 114, 64}: "Apple, Inc.", + [3]byte{144, 114, 130}: "Sagemcom Broadband SAS", + [3]byte{144, 121, 144}: "Benchmark Electronics Romania SRL", + [3]byte{144, 122, 10}: "Gebr. Bode GmbH & Co KG", + [3]byte{144, 122, 40}: "Beijing Morncloud Information And Technology Co. Ltd.", + [3]byte{144, 122, 241}: "Wally", + [3]byte{144, 126, 186}: "UTEK TECHNOLOGY (SHENZHEN) CO.,LTD", + [3]byte{144, 127, 97}: "Chicony Electronics Co., Ltd.", + [3]byte{144, 130, 96}: "IEEE 1904.1 Working Group", + [3]byte{144, 131, 122}: "General Electric Water & Process Technologies", + [3]byte{144, 132, 13}: "Apple, Inc.", + [3]byte{144, 132, 43}: "LEGO System A/S", + [3]byte{144, 134, 116}: "SICHUAN TIANYI COMHEART TELECOMCO., LTD", + [3]byte{144, 136, 162}: "IONICS TECHNOLOGY ME LTDA", + [3]byte{144, 140, 9}: "Total Phase", + [3]byte{144, 140, 68}: "H.K ZONGMU TECHNOLOGY CO., LTD.", + [3]byte{144, 140, 99}: "GZ Weedong Networks Technology Co. , Ltd", + [3]byte{144, 141, 29}: "GH Technologies", + [3]byte{144, 141, 108}: "Apple, Inc.", + [3]byte{144, 141, 120}: "D-Link International", + [3]byte{144, 143, 207}: "UNO System Co., Ltd", + [3]byte{144, 144, 60}: "TRISON TECHNOLOGY CORPORATION", + [3]byte{144, 144, 96}: "RSI VIDEO TECHNOLOGIES", + [3]byte{144, 146, 180}: "Diehl BGT Defence GmbH & Co. KG", + [3]byte{144, 148, 228}: "D-Link International", + [3]byte{144, 151, 213}: "Espressif Inc.", + [3]byte{144, 151, 243}: "Samsung Electronics Co.,Ltd", + [3]byte{144, 152, 100}: "Impex-Sat GmbH&Co KG", + [3]byte{144, 153, 22}: "ELVEES NeoTek OJSC", + [3]byte{144, 157, 125}: "ARRIS Group, Inc.", + [3]byte{144, 157, 224}: "Newland Design + Assoc. Inc.", + [3]byte{144, 159, 51}: "EFM Networks", + [3]byte{144, 159, 67}: "Accutron Instruments Inc.", + [3]byte{144, 162, 16}: "United Telecoms Ltd", + [3]byte{144, 162, 218}: "GHEO SA", + [3]byte{144, 163, 101}: "HMD Global Oy", + [3]byte{144, 164, 106}: "SISNET CO., LTD", + [3]byte{144, 164, 222}: "Wistron Neweb Corporation", + [3]byte{144, 166, 47}: "NAVER", + [3]byte{144, 167, 131}: "JSW PACIFIC CORPORATION", + [3]byte{144, 167, 193}: "Pakedge Device and Software Inc.", + [3]byte{144, 172, 63}: "BrightSign LLC", + [3]byte{144, 173, 247}: "vivo Mobile Communication Co., Ltd.", + [3]byte{144, 174, 27}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{144, 176, 237}: "Apple, Inc.", + [3]byte{144, 177, 28}: "Dell Inc.", + [3]byte{144, 177, 52}: "ARRIS Group, Inc.", + [3]byte{144, 177, 224}: "Beijing Nebula Link Technology Co., Ltd", + [3]byte{144, 178, 31}: "Apple, Inc.", + [3]byte{144, 182, 134}: "Murata Manufacturing Co., Ltd.", + [3]byte{144, 184, 208}: "Joyent, Inc.", + [3]byte{144, 185, 49}: "Apple, Inc.", + [3]byte{144, 185, 125}: "Johnson Outdoors Marine Electronics d/b/a Minnkota", + [3]byte{144, 193, 21}: "Sony Mobile Communications AB", + [3]byte{144, 193, 198}: "Apple, Inc.", + [3]byte{144, 195, 95}: "Nanjing Jiahao Technology Co., Ltd.", + [3]byte{144, 198, 130}: "IEEE Registration Authority", + [3]byte{144, 199, 146}: "ARRIS Group, Inc.", + [3]byte{144, 199, 216}: "zte corporation", + [3]byte{144, 201, 155}: "Recore Systems", + [3]byte{144, 204, 36}: "Synaptics, Inc", + [3]byte{144, 205, 182}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{144, 207, 21}: "Nokia Corporation", + [3]byte{144, 207, 111}: "Dlogixs Co Ltd", + [3]byte{144, 207, 125}: "Qingdao Hisense Communications Co.,Ltd.", + [3]byte{144, 209, 27}: "Palomar Medical Technologies", + [3]byte{144, 215, 79}: "Bookeen", + [3]byte{144, 215, 190}: "Wavelab Global Inc.", + [3]byte{144, 215, 235}: "Texas Instruments", + [3]byte{144, 216, 82}: "Comtec Co., Ltd.", + [3]byte{144, 216, 243}: "zte corporation", + [3]byte{144, 217, 44}: "HUG-WITSCHI AG", + [3]byte{144, 218, 78}: "AVANU", + [3]byte{144, 218, 106}: "FOCUS H&S Co., Ltd.", + [3]byte{144, 219, 70}: "E-LEAD ELECTRONIC CO., LTD", + [3]byte{144, 223, 183}: "s.m.s smart microwave sensors GmbH", + [3]byte{144, 223, 251}: "HOMERIDER SYSTEMS", + [3]byte{144, 224, 240}: "IEEE 1722a Working Group", + [3]byte{144, 226, 186}: "Intel Corporate", + [3]byte{144, 230, 186}: "ASUSTek COMPUTER INC.", + [3]byte{144, 231, 196}: "HTC Corporation", + [3]byte{144, 234, 96}: "SPI Lasers Ltd", + [3]byte{144, 236, 80}: "C.O.B.O. SPA", + [3]byte{144, 238, 217}: "UNIVERSAL DE DESARROLLOS ELECTRÓNICOS, SA", + [3]byte{144, 239, 104}: "Zyxel Communications Corporation", + [3]byte{144, 240, 82}: "MEIZU Technology Co., Ltd.", + [3]byte{144, 241, 170}: "Samsung Electronics Co.,Ltd", + [3]byte{144, 241, 176}: "Hangzhou Anheng Info&Tech CO.,LTD", + [3]byte{144, 242, 120}: "Radius Gateway", + [3]byte{144, 243, 5}: "HUMAX Co., Ltd.", + [3]byte{144, 243, 183}: "Kirisun Communications Co., Ltd.", + [3]byte{144, 244, 193}: "Rand McNally", + [3]byte{144, 246, 82}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{144, 247, 47}: "Phillips Machine & Welding Co., Inc.", + [3]byte{144, 251, 91}: "Avaya Inc", + [3]byte{144, 251, 166}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{144, 253, 97}: "Apple, Inc.", + [3]byte{144, 253, 159}: "Silicon Laboratories", + [3]byte{144, 255, 121}: "Metro Ethernet Forum", + [3]byte{148, 0, 6}: "jinyoung", + [3]byte{148, 0, 112}: "Nokia Corporation", + [3]byte{148, 1, 73}: "AutoHotBox", + [3]byte{148, 1, 194}: "Samsung Electronics Co.,Ltd", + [3]byte{148, 4, 156}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{148, 5, 182}: "Liling FullRiver Electronics & Technology Ltd", + [3]byte{148, 9, 55}: "HUMAX Co., Ltd.", + [3]byte{148, 11, 45}: "NetView Technologies(Shenzhen) Co., Ltd", + [3]byte{148, 11, 213}: "Himax Technologies, Inc", + [3]byte{148, 12, 109}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{148, 14, 107}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{148, 16, 62}: "Belkin International Inc.", + [3]byte{148, 17, 218}: "ITF Fröschl GmbH", + [3]byte{148, 20, 122}: "vivo Mobile Communication Co., Ltd.", + [3]byte{148, 22, 115}: "Point Core SARL", + [3]byte{148, 24, 130}: "Hewlett Packard Enterprise", + [3]byte{148, 29, 28}: "TLab West Systems AB", + [3]byte{148, 32, 83}: "Nokia Corporation", + [3]byte{148, 33, 151}: "Stalmart Technology Limited", + [3]byte{148, 35, 110}: "Shenzhen Junlan Electronic Ltd", + [3]byte{148, 40, 46}: "New H3C Technologies Co., Ltd", + [3]byte{148, 42, 63}: "Diversey Inc", + [3]byte{148, 44, 179}: "HUMAX Co., Ltd.", + [3]byte{148, 46, 23}: "Schneider Electric Canada Inc", + [3]byte{148, 46, 99}: "Finsécur", + [3]byte{148, 49, 155}: "Alphatronics BV", + [3]byte{148, 51, 221}: "Taco Inc", + [3]byte{148, 53, 10}: "Samsung Electronics Co.,Ltd", + [3]byte{148, 54, 224}: "Sichuan Bihong Broadcast & Television New Technologies Co.,Ltd", + [3]byte{148, 57, 229}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{148, 58, 240}: "Nokia Corporation", + [3]byte{148, 59, 177}: "Kaonmedia CO., LTD.", + [3]byte{148, 61, 201}: "Asahi Net, Inc.", + [3]byte{148, 63, 194}: "Hewlett Packard Enterprise", + [3]byte{148, 64, 162}: "Anywave Communication Technologies, Inc.", + [3]byte{148, 65, 193}: "Mini-Cam Limited", + [3]byte{148, 68, 68}: "LG Innotek", + [3]byte{148, 68, 82}: "Belkin International Inc.", + [3]byte{148, 70, 150}: "BaudTec Corporation", + [3]byte{148, 73, 150}: "WiSilica Inc", + [3]byte{148, 74, 9}: "BitWise Controls", + [3]byte{148, 74, 12}: "Sercomm Corporation", + [3]byte{148, 80, 71}: "Rechnerbetriebsgruppe", + [3]byte{148, 80, 137}: "SimonsVoss Technologies GmbH", + [3]byte{148, 81, 3}: "Samsung Electronics Co.,Ltd", + [3]byte{148, 81, 61}: "iSmart Alarm, Inc.", + [3]byte{148, 81, 191}: "Hyundai ESG", + [3]byte{148, 83, 48}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{148, 84, 147}: "Rigado, LLC", + [3]byte{148, 87, 165}: "Hewlett Packard", + [3]byte{148, 89, 7}: "Shanghai HITE-BELDEN Network Technology Co., Ltd.", + [3]byte{148, 89, 45}: "EKE Building Technology Systems Ltd", + [3]byte{148, 91, 126}: "TRILOBIT LTDA.", + [3]byte{148, 97, 30}: "Wata Electronics Co.,Ltd.", + [3]byte{148, 97, 36}: "Pason Systems", + [3]byte{148, 98, 105}: "ARRIS Group, Inc.", + [3]byte{148, 99, 209}: "Samsung Electronics Co.,Ltd", + [3]byte{148, 101, 45}: "OnePlus Technology (Shenzhen) Co., Ltd", + [3]byte{148, 101, 156}: "Intel Corporate", + [3]byte{148, 102, 231}: "WOM Engineering", + [3]byte{148, 112, 210}: "WINFIRM TECHNOLOGY", + [3]byte{148, 113, 172}: "TCT mobile ltd", + [3]byte{148, 117, 110}: "QinetiQ North America", + [3]byte{148, 118, 183}: "Samsung Electronics Co.,Ltd", + [3]byte{148, 119, 43}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{148, 123, 190}: "Ubicquia", + [3]byte{148, 123, 231}: "Samsung Electronics Co.,Ltd", + [3]byte{148, 124, 62}: "Polewall Norge AS", + [3]byte{148, 126, 185}: "National Narrowband Network Communications Pty Ltd", + [3]byte{148, 129, 164}: "Azuray Technologies", + [3]byte{148, 133, 122}: "Evantage Industries Corp", + [3]byte{148, 134, 205}: "SEOUL ELECTRONICS&TELECOM", + [3]byte{148, 134, 212}: "Surveillance Pro Corporation", + [3]byte{148, 135, 124}: "ARRIS Group, Inc.", + [3]byte{148, 136, 21}: "Infinique Worldwide Inc", + [3]byte{148, 136, 84}: "Texas Instruments", + [3]byte{148, 136, 94}: "Surfilter Network Technology Co., Ltd.", + [3]byte{148, 139, 3}: "EAGET Innovation and Technology Co., Ltd.", + [3]byte{148, 139, 193}: "Samsung Electronics Co.,Ltd", + [3]byte{148, 141, 80}: "Beamex Oy Ab", + [3]byte{148, 142, 137}: "INDUSTRIAS UNIDAS SA DE CV", + [3]byte{148, 143, 238}: "Verizon Telematics", + [3]byte{148, 146, 188}: "SYNTECH(HK) TECHNOLOGY LIMITED", + [3]byte{148, 148, 38}: "Apple, Inc.", + [3]byte{148, 149, 160}: "Google, Inc.", + [3]byte{148, 152, 162}: "Shanghai LISTEN TECH.LTD", + [3]byte{148, 153, 1}: "Shenzhen YITOA Digital Appliance CO.,LTD", + [3]byte{148, 154, 169}: "Microsoft Corporation", + [3]byte{148, 155, 253}: "Trans New Technology, Inc.", + [3]byte{148, 156, 85}: "Alta Data Technologies", + [3]byte{148, 159, 62}: "Sonos, Inc.", + [3]byte{148, 159, 63}: "Optek Digital Technology company limited", + [3]byte{148, 159, 180}: "ChengDu JiaFaAnTai Technology Co.,Ltd", + [3]byte{148, 160, 78}: "Bostex Technology Co., LTD", + [3]byte{148, 161, 162}: "AMPAK Technology, Inc.", + [3]byte{148, 167, 183}: "zte corporation", + [3]byte{148, 167, 188}: "BodyMedia, Inc.", + [3]byte{148, 170, 184}: "Joview(Beijing) Technology Co. Ltd.", + [3]byte{148, 171, 222}: "OMX Technology - FZE", + [3]byte{148, 172, 202}: "trivum technologies GmbH", + [3]byte{148, 174, 97}: "Alcatel Lucent", + [3]byte{148, 174, 227}: "Belden Hirschmann Industries (Suzhou) Ltd.", + [3]byte{148, 177, 10}: "Samsung Electronics Co.,Ltd", + [3]byte{148, 178, 204}: "PIONEER CORPORATION", + [3]byte{148, 180, 15}: "Aruba Networks", + [3]byte{148, 184, 25}: "Nokia", + [3]byte{148, 184, 197}: "RuggedCom Inc.", + [3]byte{148, 185, 180}: "Aptos Technology", + [3]byte{148, 186, 49}: "Visiontec da Amazônia Ltda.", + [3]byte{148, 186, 86}: "Shenzhen Coship Electronics Co., Ltd.", + [3]byte{148, 187, 174}: "Husqvarna AB", + [3]byte{148, 191, 30}: "eflow Inc. / Smart Device Planning and Development Division", + [3]byte{148, 191, 149}: "Shenzhen Coship Electronics Co., Ltd", + [3]byte{148, 192, 20}: "Sorter Sp. j. Konrad Grzeszczyk MichaA, Ziomek", + [3]byte{148, 192, 56}: "Tallac Networks", + [3]byte{148, 193, 80}: "2Wire Inc", + [3]byte{148, 195, 228}: "SCA Schucker Gmbh & Co KG", + [3]byte{148, 196, 233}: "PowerLayer Microsystems HongKong Limited", + [3]byte{148, 198, 145}: "EliteGroup Computer Systems Co., LTD", + [3]byte{148, 198, 235}: "NOVA electronics, Inc.", + [3]byte{148, 199, 175}: "Raylios Technology", + [3]byte{148, 201, 96}: "Zhongshan B&T technology.co.,ltd", + [3]byte{148, 201, 98}: "Teseq AG", + [3]byte{148, 202, 15}: "Honeywell Analytics", + [3]byte{148, 204, 185}: "ARRIS Group, Inc.", + [3]byte{148, 205, 172}: "Creowave Oy", + [3]byte{148, 206, 44}: "Sony Mobile Communications AB", + [3]byte{148, 206, 49}: "CTS Limited", + [3]byte{148, 208, 25}: "Cydle Corp.", + [3]byte{148, 208, 41}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{148, 212, 23}: "GPI KOREA INC.", + [3]byte{148, 212, 105}: "Cisco Systems, Inc", + [3]byte{148, 214, 14}: "shenzhen yunmao information technologies co., ltd", + [3]byte{148, 215, 35}: "Shanghai DareGlobal Technologies Co.,Ltd", + [3]byte{148, 215, 113}: "Samsung Electronics Co.,Ltd", + [3]byte{148, 216, 89}: "TCT mobile ltd", + [3]byte{148, 217, 60}: "ENELPS", + [3]byte{148, 217, 179}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{148, 219, 73}: "SITCORP", + [3]byte{148, 219, 201}: "AzureWave Technology Inc.", + [3]byte{148, 219, 218}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{148, 221, 63}: "A+V Link Technologies, Corp.", + [3]byte{148, 222, 14}: "SmartOptics AS", + [3]byte{148, 222, 128}: "GIGA-BYTE TECHNOLOGY CO.,LTD.", + [3]byte{148, 223, 78}: "Wistron InfoComm(Kunshan)Co.,Ltd.", + [3]byte{148, 223, 88}: "IJ Electron CO.,Ltd.", + [3]byte{148, 224, 208}: "HealthStream Taiwan Inc.", + [3]byte{148, 226, 38}: "D. ORtiz Consulting, LLC", + [3]byte{148, 226, 253}: "Boge Kompressoren OTTO Boge GmbH & Co. KG", + [3]byte{148, 227, 109}: "Texas Instruments", + [3]byte{148, 231, 17}: "Xirka Dama Persada PT", + [3]byte{148, 232, 72}: "FYLDE MICRO LTD", + [3]byte{148, 232, 197}: "ARRIS Group, Inc.", + [3]byte{148, 233, 106}: "Apple, Inc.", + [3]byte{148, 233, 121}: "Liteon Technology Corporation", + [3]byte{148, 233, 140}: "Nokia", + [3]byte{148, 235, 44}: "Google, Inc.", + [3]byte{148, 235, 205}: "BlackBerry RTS", + [3]byte{148, 241, 40}: "Hewlett Packard Enterprise", + [3]byte{148, 241, 158}: "HUIZHOU MAORONG INTELLIGENT TECHNOLOGY CO.,LTD", + [3]byte{148, 242, 120}: "Elma Electronic", + [3]byte{148, 245, 81}: "Cadi Scientific Pte Ltd", + [3]byte{148, 246, 101}: "Ruckus Wireless", + [3]byte{148, 246, 146}: "Geminico co.,Ltd.", + [3]byte{148, 246, 163}: "Apple, Inc.", + [3]byte{148, 247, 32}: "Tianjin Deviser Electronics Instrument Co., Ltd", + [3]byte{148, 250, 232}: "Shenzhen Eycom Technology Co., Ltd", + [3]byte{148, 251, 41}: "Zebra Technologies Inc.", + [3]byte{148, 251, 178}: "SHENZHEN GONGJIN ELECTRONICS CO.,LT", + [3]byte{148, 253, 29}: "WhereWhen Corp", + [3]byte{148, 253, 46}: "Shanghai Uniscope Technologies Co.,Ltd", + [3]byte{148, 254, 34}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{148, 254, 244}: "Sagemcom Broadband SAS", + [3]byte{152, 0, 116}: "Raisecom Technology CO., LTD", + [3]byte{152, 0, 193}: "GuangZhou CREATOR Technology Co.,Ltd.(CHINA)", + [3]byte{152, 0, 198}: "Apple, Inc.", + [3]byte{152, 1, 167}: "Apple, Inc.", + [3]byte{152, 2, 132}: "Theobroma Systems GmbH", + [3]byte{152, 2, 216}: "IEEE Registration Authority", + [3]byte{152, 3, 160}: "ABB n.v. Power Quality Products", + [3]byte{152, 3, 216}: "Apple, Inc.", + [3]byte{152, 7, 45}: "Texas Instruments", + [3]byte{152, 12, 130}: "SAMSUNG ELECTRO MECHANICS CO., LTD.", + [3]byte{152, 12, 165}: "Motorola (Wuhan) Mobility Technologies Communication Co., Ltd.", + [3]byte{152, 13, 46}: "HTC Corporation", + [3]byte{152, 14, 228}: "Private", + [3]byte{152, 16, 148}: "Shenzhen Vsun communication technology Co.,ltd", + [3]byte{152, 16, 232}: "Apple, Inc.", + [3]byte{152, 19, 51}: "zte corporation", + [3]byte{152, 22, 236}: "IC Intracom", + [3]byte{152, 29, 250}: "Samsung Electronics Co.,Ltd", + [3]byte{152, 30, 15}: "Jeelan (Shanghai Jeelan Technology Information Inc", + [3]byte{152, 31, 177}: "Shenzhen Lemon Network Technology Co.,Ltd", + [3]byte{152, 32, 142}: "Definium Technologies", + [3]byte{152, 34, 239}: "Liteon Technology Corporation", + [3]byte{152, 35, 78}: "Micromedia AG", + [3]byte{152, 38, 42}: "Applied Research Associates, Inc", + [3]byte{152, 40, 166}: "COMPAL INFORMATION (KUNSHAN) CO., LTD.", + [3]byte{152, 41, 29}: "Jaguar de Mexico, SA de CV", + [3]byte{152, 41, 63}: "Fujian Start Computer Equipment Co.,Ltd", + [3]byte{152, 41, 166}: "COMPAL INFORMATION (KUNSHAN) CO., LTD.", + [3]byte{152, 44, 190}: "2Wire Inc", + [3]byte{152, 45, 86}: "Resolution Audio", + [3]byte{152, 45, 104}: "Samsung Electronics Co., Ltd", + [3]byte{152, 45, 186}: "Fibergate Inc.", + [3]byte{152, 47, 60}: "Sichuan Changhong Electric Ltd.", + [3]byte{152, 48, 0}: "Beijing KEMACOM Technologies Co., Ltd.", + [3]byte{152, 48, 113}: "DAIKYUNG VASCOM", + [3]byte{152, 52, 157}: "Krauss Maffei Technologies GmbH", + [3]byte{152, 53, 113}: "Sub10 Systems Ltd", + [3]byte{152, 53, 184}: "Assembled Products Corporation", + [3]byte{152, 55, 19}: "PT.Navicom Indonesia", + [3]byte{152, 57, 142}: "Samsung Electronics Co.,Ltd", + [3]byte{152, 59, 22}: "AMPAK Technology, Inc.", + [3]byte{152, 63, 159}: "China SSJ (Suzhou) Network Technology Inc.", + [3]byte{152, 64, 187}: "Dell Inc.", + [3]byte{152, 66, 70}: "SOL INDUSTRY PTE., LTD", + [3]byte{152, 67, 218}: "INTERTECH", + [3]byte{152, 71, 60}: "SHANGHAI SUNMON COMMUNICATION TECHNOGY CO.,LTD", + [3]byte{152, 74, 71}: "CHG Hospital Beds", + [3]byte{152, 75, 74}: "ARRIS Group, Inc.", + [3]byte{152, 75, 225}: "Hewlett Packard", + [3]byte{152, 76, 4}: "Zhangzhou Keneng Electrical Equipment Co Ltd", + [3]byte{152, 76, 211}: "Mantis Deposition", + [3]byte{152, 78, 151}: "Starlight Marketing (H. K.) Ltd.", + [3]byte{152, 79, 238}: "Intel Corporate", + [3]byte{152, 82, 177}: "Samsung Electronics Co.,Ltd", + [3]byte{152, 84, 27}: "Intel Corporate", + [3]byte{152, 87, 211}: "HON HAI-CCPBG PRECISION IND.CO.,LTD.", + [3]byte{152, 88, 138}: "SYSGRATION Ltd.", + [3]byte{152, 89, 69}: "Texas Instruments", + [3]byte{152, 90, 235}: "Apple, Inc.", + [3]byte{152, 91, 176}: "KMDATA INC.", + [3]byte{152, 92, 147}: "SBG Systems SAS", + [3]byte{152, 93, 70}: "PeopleNet Communication", + [3]byte{152, 93, 173}: "Texas Instruments", + [3]byte{152, 94, 27}: "ConversDigital Co., Ltd.", + [3]byte{152, 95, 211}: "Microsoft Corporation", + [3]byte{152, 96, 34}: "EMW Co., Ltd.", + [3]byte{152, 102, 234}: "Industrial Control Communications, Inc.", + [3]byte{152, 107, 61}: "ARRIS Group, Inc.", + [3]byte{152, 108, 92}: "Jiangxi Gosun Guard Security Co.,Ltd", + [3]byte{152, 108, 245}: "zte corporation", + [3]byte{152, 109, 53}: "IEEE Registration Authority", + [3]byte{152, 109, 200}: "TOSHIBA MITSUBISHI-ELECTRIC INDUSTRIAL SYSTEMS CORPORATION", + [3]byte{152, 111, 96}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{152, 112, 232}: "INNATECH SDN BHD", + [3]byte{152, 115, 196}: "Sage Electronic Engineering LLC", + [3]byte{152, 116, 61}: "Shenzhen Jun Kai Hengye Technology Co. Ltd", + [3]byte{152, 116, 218}: "Infinix mobility limited", + [3]byte{152, 118, 182}: "Adafruit", + [3]byte{152, 119, 112}: "Pep Digital Technology (Guangzhou) Co., Ltd", + [3]byte{152, 123, 243}: "Texas Instruments", + [3]byte{152, 126, 70}: "Emizon Networks Limited", + [3]byte{152, 130, 23}: "Disruptive Ltd", + [3]byte{152, 131, 137}: "Samsung Electronics Co.,Ltd", + [3]byte{152, 132, 227}: "Texas Instruments", + [3]byte{152, 134, 177}: "Flyaudio corporation (China)", + [3]byte{152, 135, 68}: "Wuxi Hongda Science and Technology Co.,LTD", + [3]byte{152, 137, 237}: "Anadem Information Inc.", + [3]byte{152, 139, 93}: "Sagemcom Broadband SAS", + [3]byte{152, 139, 173}: "Corintech Ltd.", + [3]byte{152, 142, 52}: "ZHEJIANG BOXSAM ELECTRONIC CO.,LTD", + [3]byte{152, 142, 74}: "NOXUS(BEIJING) TECHNOLOGY CO.,LTD", + [3]byte{152, 142, 221}: "TE Connectivity Limerick", + [3]byte{152, 144, 128}: "Linkpower Network System Inc Ltd.", + [3]byte{152, 144, 150}: "Dell Inc.", + [3]byte{152, 147, 204}: "LG ELECTRONICS INC", + [3]byte{152, 148, 73}: "Skyworth Wireless Technology Ltd.", + [3]byte{152, 151, 209}: "MitraStar Technology Corp.", + [3]byte{152, 156, 87}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{152, 158, 99}: "Apple, Inc.", + [3]byte{152, 164, 14}: "Snap, Inc.", + [3]byte{152, 167, 176}: "MCST ZAO", + [3]byte{152, 170, 60}: "Will i-tech Co., Ltd.", + [3]byte{152, 170, 215}: "BLUE WAVE NETWORKING CO LTD", + [3]byte{152, 170, 252}: "IEEE Registration Authority", + [3]byte{152, 176, 57}: "Nokia", + [3]byte{152, 182, 233}: "Nintendo Co.,Ltd", + [3]byte{152, 184, 227}: "Apple, Inc.", + [3]byte{152, 187, 30}: "BYD Precision Manufacture Company Ltd.", + [3]byte{152, 188, 87}: "SVA TECHNOLOGIES CO.LTD", + [3]byte{152, 188, 153}: "Edeltech Co.,Ltd.", + [3]byte{152, 190, 148}: "IBM", + [3]byte{152, 192, 235}: "Global Regency Ltd", + [3]byte{152, 197, 219}: "Ericsson AB", + [3]byte{152, 200, 69}: "PacketAccess", + [3]byte{152, 203, 39}: "Galore Networks Pvt. Ltd.", + [3]byte{152, 205, 180}: "Virident Systems, Inc.", + [3]byte{152, 207, 83}: "BBK EDUCATIONAL ELECTRONICS CORP.,LTD.", + [3]byte{152, 210, 147}: "Google, Inc.", + [3]byte{152, 211, 49}: "Shenzhen Bolutek Technology Co.,Ltd.", + [3]byte{152, 211, 210}: "MEKRA Lang GmbH & Co. KG", + [3]byte{152, 214, 134}: "Chyi Lee industry Co., ltd.", + [3]byte{152, 214, 187}: "Apple, Inc.", + [3]byte{152, 214, 247}: "LG Electronics (Mobile Communications)", + [3]byte{152, 216, 140}: "Nortel Networks", + [3]byte{152, 218, 146}: "Vuzix Corporation", + [3]byte{152, 220, 217}: "UNITEC Co., Ltd.", + [3]byte{152, 221, 234}: "Infinix mobility limited", + [3]byte{152, 222, 208}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{152, 224, 217}: "Apple, Inc.", + [3]byte{152, 225, 101}: "Accutome", + [3]byte{152, 228, 118}: "Zentan", + [3]byte{152, 231, 154}: "Foxconn(NanJing) Communication Co.,Ltd.", + [3]byte{152, 231, 244}: "Hewlett Packard", + [3]byte{152, 231, 245}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{152, 232, 72}: "Axiim", + [3]byte{152, 236, 101}: "Cosesy ApS", + [3]byte{152, 238, 203}: "Wistron Infocomm (Zhongshan) Corporation", + [3]byte{152, 239, 155}: "OHSUNG", + [3]byte{152, 240, 88}: "Lynxspring, Incl.", + [3]byte{152, 240, 171}: "Apple, Inc.", + [3]byte{152, 241, 112}: "Murata Manufacturing Co., Ltd.", + [3]byte{152, 241, 153}: "NEC Platforms, Ltd.", + [3]byte{152, 242, 179}: "Hewlett Packard Enterprise", + [3]byte{152, 244, 40}: "zte corporation", + [3]byte{152, 245, 55}: "zte corporation", + [3]byte{152, 245, 169}: "OHSUNG", + [3]byte{152, 247, 215}: "ARRIS Group, Inc.", + [3]byte{152, 248, 193}: "IDT Technology Limited", + [3]byte{152, 248, 219}: "Marini Impianti Industriali s.r.l.", + [3]byte{152, 250, 227}: "Xiaomi Communications Co Ltd", + [3]byte{152, 251, 18}: "Grand Electronics (HK) Ltd", + [3]byte{152, 252, 17}: "Cisco-Linksys, LLC", + [3]byte{152, 253, 116}: "ACT.CO.LTD", + [3]byte{152, 253, 180}: "Primax Electronics Ltd.", + [3]byte{152, 254, 3}: "Ericsson - North America", + [3]byte{152, 254, 148}: "Apple, Inc.", + [3]byte{152, 255, 106}: "OTEC(Shanghai)Technology Co.,Ltd.", + [3]byte{152, 255, 208}: "Lenovo Mobile Communication Technology Ltd.", + [3]byte{156, 1, 17}: "Shenzhen Newabel Electronic Co., Ltd.", + [3]byte{156, 2, 152}: "Samsung Electronics Co.,Ltd", + [3]byte{156, 3, 158}: "Beijing Winchannel Software Technology Co., Ltd", + [3]byte{156, 4, 115}: "Tecmobile (International) Ltd.", + [3]byte{156, 4, 235}: "Apple, Inc.", + [3]byte{156, 6, 27}: "Hangzhou H3C Technologies Co., Limited", + [3]byte{156, 6, 110}: "Hytera Communications Corporation Limited", + [3]byte{156, 13, 172}: "Tymphany HK Limited", + [3]byte{156, 14, 74}: "Shenzhen Vastking Electronic Co.,Ltd.", + [3]byte{156, 19, 171}: "Chanson Water Co., Ltd.", + [3]byte{156, 20, 101}: "Edata Elektronik San. ve Tic. A.Ş.", + [3]byte{156, 24, 116}: "Nokia Danmark A/S", + [3]byte{156, 28, 18}: "Aruba Networks", + [3]byte{156, 29, 88}: "Texas Instruments", + [3]byte{156, 30, 149}: "Actiontec Electronics, Inc", + [3]byte{156, 31, 221}: "Accupix Inc.", + [3]byte{156, 32, 123}: "Apple, Inc.", + [3]byte{156, 33, 106}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{156, 34, 14}: "TASCAN Systems GmbH", + [3]byte{156, 40, 64}: "Discovery Technology,LTD..", + [3]byte{156, 40, 191}: "Continental Automotive Czech Republic s.r.o.", + [3]byte{156, 40, 239}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{156, 41, 63}: "Apple, Inc.", + [3]byte{156, 42, 112}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{156, 42, 131}: "Samsung Electronics Co.,Ltd", + [3]byte{156, 48, 91}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{156, 48, 102}: "RWE Effizienz GmbH", + [3]byte{156, 49, 120}: "Foshan Huadian Intelligent Communications Teachnologies Co.,Ltd", + [3]byte{156, 49, 182}: "Kulite Semiconductor Products Inc", + [3]byte{156, 50, 169}: "SICHUAN TIANYI COMHEART TELECOMCO., LTD", + [3]byte{156, 52, 38}: "ARRIS Group, Inc.", + [3]byte{156, 53, 131}: "Nipro Diagnostics, Inc", + [3]byte{156, 53, 235}: "Apple, Inc.", + [3]byte{156, 55, 244}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{156, 58, 175}: "Samsung Electronics Co.,Ltd", + [3]byte{156, 61, 207}: "NETGEAR", + [3]byte{156, 62, 170}: "EnvyLogic Co.,Ltd.", + [3]byte{156, 65, 124}: "Hame Technology Co., Limited", + [3]byte{156, 68, 61}: "CHENGDU XUGUANG TECHNOLOGY CO, LTD", + [3]byte{156, 68, 166}: "SwiftTest, Inc.", + [3]byte{156, 69, 99}: "DIMEP Sistemas", + [3]byte{156, 74, 123}: "Nokia Corporation", + [3]byte{156, 76, 174}: "Mesa Labs", + [3]byte{156, 78, 32}: "Cisco Systems, Inc", + [3]byte{156, 78, 54}: "Intel Corporate", + [3]byte{156, 78, 142}: "ALT Systems Ltd", + [3]byte{156, 78, 191}: "BoxCast", + [3]byte{156, 79, 207}: "TCT mobile ltd", + [3]byte{156, 79, 218}: "Apple, Inc.", + [3]byte{156, 80, 238}: "Cambridge Industries(Group) Co.,Ltd.", + [3]byte{156, 82, 248}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{156, 83, 205}: "ENGICAM s.r.l.", + [3]byte{156, 84, 28}: "Shenzhen My-power Technology Co.,Ltd", + [3]byte{156, 84, 202}: "Zhengzhou VCOM Science and Technology Co.,Ltd", + [3]byte{156, 85, 180}: "I.S.E. S.r.l.", + [3]byte{156, 87, 17}: "Feitian Xunda(Beijing) Aeronautical Information Technology Co., Ltd.", + [3]byte{156, 87, 173}: "Cisco Systems, Inc", + [3]byte{156, 91, 150}: "NMR Corporation", + [3]byte{156, 92, 141}: "FIREMAX INDÚSTRIA E COMÉRCIO DE PRODUTOS ELETRÔNICOS LTDA", + [3]byte{156, 92, 142}: "ASUSTek COMPUTER INC.", + [3]byte{156, 92, 249}: "Sony Mobile Communications AB", + [3]byte{156, 93, 18}: "Aerohive Networks Inc.", + [3]byte{156, 93, 149}: "VTC Electronics Corp.", + [3]byte{156, 94, 115}: "Calibre UK LTD", + [3]byte{156, 97, 29}: "Omni-ID USA, Inc.", + [3]byte{156, 97, 33}: "SICHUAN TIANYI COMHEART TELECOMCO.,LTD", + [3]byte{156, 98, 171}: "Sumavision Technologies Co.,Ltd", + [3]byte{156, 99, 237}: "zte corporation", + [3]byte{156, 100, 94}: "Harman Consumer Group", + [3]byte{156, 101, 176}: "Samsung Electronics Co.,Ltd", + [3]byte{156, 101, 238}: "DASAN Network Solutions", + [3]byte{156, 101, 249}: "AcSiP Technology Corp.", + [3]byte{156, 102, 80}: "Glodio Technolies Co.,Ltd Tianjin Branch", + [3]byte{156, 104, 91}: "Octonion SA", + [3]byte{156, 106, 190}: "QEES ApS.", + [3]byte{156, 108, 21}: "Microsoft Corporation", + [3]byte{156, 111, 82}: "zte corporation", + [3]byte{156, 116, 26}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{156, 117, 20}: "Wildix srl", + [3]byte{156, 119, 170}: "NADASNV", + [3]byte{156, 121, 172}: "Suntec Software(Shanghai) Co., Ltd.", + [3]byte{156, 122, 3}: "Ciena Corporation", + [3]byte{156, 123, 210}: "NEOLAB Convergence", + [3]byte{156, 125, 163}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{156, 128, 125}: "SYSCABLE Korea Inc.", + [3]byte{156, 128, 223}: "Arcadyan Technology Corporation", + [3]byte{156, 131, 191}: "PRO-VISION, Inc.", + [3]byte{156, 132, 191}: "Apple, Inc.", + [3]byte{156, 134, 218}: "Phoenix Geophysics Ltd.", + [3]byte{156, 136, 136}: "Simac Techniek NV", + [3]byte{156, 136, 173}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{156, 139, 160}: "Apple, Inc.", + [3]byte{156, 139, 241}: "The Warehouse Limited", + [3]byte{156, 140, 110}: "Samsung Electronics Co.,Ltd", + [3]byte{156, 141, 26}: "INTEG process group inc", + [3]byte{156, 141, 124}: "ALPS ELECTRIC CO.,LTD.", + [3]byte{156, 141, 211}: "Leonton Technologies", + [3]byte{156, 142, 153}: "Hewlett Packard", + [3]byte{156, 142, 205}: "Amcrest Technologies", + [3]byte{156, 142, 220}: "Teracom Limited", + [3]byte{156, 147, 78}: "Xerox Corporation", + [3]byte{156, 147, 228}: "Private", + [3]byte{156, 149, 248}: "SmartDoor Systems, LLC", + [3]byte{156, 151, 38}: "Technicolor", + [3]byte{156, 152, 17}: "Guangzhou Sunrise Electronics Development Co., Ltd", + [3]byte{156, 153, 160}: "Xiaomi Communications Co Ltd", + [3]byte{156, 156, 29}: "Starkey Labs Inc.", + [3]byte{156, 156, 64}: "SICHUAN TIANYI COMHEART TELECOMCO., LTD", + [3]byte{156, 157, 93}: "Raden Inc", + [3]byte{156, 161, 10}: "SCLE SFE", + [3]byte{156, 161, 52}: "Nike, Inc.", + [3]byte{156, 163, 169}: "Guangzhou Juan Optical and Electronical Tech Joint Stock Co., Ltd", + [3]byte{156, 163, 186}: "SAKURA Internet Inc.", + [3]byte{156, 165, 119}: "Osorno Enterprises Inc.", + [3]byte{156, 165, 192}: "vivo Mobile Communication Co., Ltd.", + [3]byte{156, 166, 157}: "Whaley Technology Co.Ltd", + [3]byte{156, 169, 228}: "zte corporation", + [3]byte{156, 172, 109}: "Universal Electronics, Inc.", + [3]byte{156, 173, 151}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{156, 173, 239}: "Obihai Technology, Inc.", + [3]byte{156, 174, 211}: "Seiko Epson Corporation", + [3]byte{156, 175, 111}: "ITEL MOBILE LIMITED", + [3]byte{156, 175, 202}: "Cisco Systems, Inc", + [3]byte{156, 176, 8}: "Ubiquitous Computing Technology Corporation", + [3]byte{156, 178, 6}: "PROCENTEC", + [3]byte{156, 178, 178}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{156, 182, 84}: "Hewlett Packard", + [3]byte{156, 182, 208}: "Rivet Networks", + [3]byte{156, 183, 13}: "Liteon Technology Corporation", + [3]byte{156, 183, 147}: "Creatcomm Technology Inc.", + [3]byte{156, 187, 152}: "Shen Zhen RND Electronic Co.,LTD", + [3]byte{156, 189, 157}: "SkyDisk, Inc.", + [3]byte{156, 190, 224}: "Biosoundlab Co., Ltd.", + [3]byte{156, 192, 119}: "PrintCounts, LLC", + [3]byte{156, 192, 210}: "Conductix-Wampfler GmbH", + [3]byte{156, 193, 114}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{156, 199, 166}: "AVM GmbH", + [3]byte{156, 199, 209}: "SHARP Corporation", + [3]byte{156, 200, 174}: "Becton, Dickinson and Company", + [3]byte{156, 202, 217}: "Nokia Corporation", + [3]byte{156, 204, 131}: "Juniper Networks", + [3]byte{156, 205, 130}: "CHENG UEI PRECISION INDUSTRY CO.,LTD", + [3]byte{156, 210, 30}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{156, 210, 75}: "zte corporation", + [3]byte{156, 211, 50}: "PLC Technology Ltd", + [3]byte{156, 211, 91}: "Samsung Electronics Co.,Ltd", + [3]byte{156, 211, 109}: "NETGEAR", + [3]byte{156, 212, 139}: "Innolux Technology Europe BV", + [3]byte{156, 214, 67}: "D-Link International", + [3]byte{156, 217, 23}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{156, 217, 203}: "Lesira Manufacturing Pty Ltd", + [3]byte{156, 218, 62}: "Intel Corporate", + [3]byte{156, 220, 113}: "Hewlett Packard Enterprise", + [3]byte{156, 221, 31}: "Intelligent Steward Co.,Ltd", + [3]byte{156, 223, 3}: "Harman/Becker Automotive Systems GmbH", + [3]byte{156, 223, 177}: "Shenzhen Crave Communication Co., LTD", + [3]byte{156, 224, 99}: "Samsung Electronics Co.,Ltd", + [3]byte{156, 225, 14}: "NCTech Ltd", + [3]byte{156, 225, 214}: "Junger Audio-Studiotechnik GmbH", + [3]byte{156, 226, 48}: "JULONG CO,.LTD.", + [3]byte{156, 227, 63}: "Apple, Inc.", + [3]byte{156, 227, 116}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{156, 230, 53}: "Nintendo Co., Ltd.", + [3]byte{156, 230, 231}: "Samsung Electronics Co.,Ltd", + [3]byte{156, 231, 189}: "Winduskorea co., Ltd", + [3]byte{156, 233, 81}: "Shenzhen Sang Fei Consumer Communications Ltd., Co.", + [3]byte{156, 235, 232}: "BizLink (Kunshan) Co.,Ltd", + [3]byte{156, 239, 213}: "Panda Wireless, Inc.", + [3]byte{156, 243, 135}: "Apple, Inc.", + [3]byte{156, 244, 142}: "Apple, Inc.", + [3]byte{156, 246, 26}: "UTC Fire and Security", + [3]byte{156, 246, 125}: "Ricardo Prague, s.r.o.", + [3]byte{156, 248, 219}: "shenzhen eyunmei technology co,.ltd", + [3]byte{156, 249, 56}: "AREVA NP GmbH", + [3]byte{156, 251, 213}: "vivo Mobile Communication Co., Ltd.", + [3]byte{156, 251, 241}: "MESOMATIC GmbH & Co.KG", + [3]byte{156, 252, 1}: "Apple, Inc.", + [3]byte{156, 252, 209}: "Aetheris Technology (Shanghai) Co., Ltd.", + [3]byte{156, 255, 190}: "OTSL Inc.", + [3]byte{160, 2, 220}: "Amazon Technologies Inc.", + [3]byte{160, 3, 99}: "Robert Bosch Healthcare GmbH", + [3]byte{160, 4, 62}: "Parker Hannifin Manufacturing Germany GmbH & Co. KG", + [3]byte{160, 4, 96}: "NETGEAR", + [3]byte{160, 6, 39}: "NEXPA System", + [3]byte{160, 7, 152}: "Samsung Electronics Co.,Ltd", + [3]byte{160, 7, 182}: "Advanced Technical Support, Inc.", + [3]byte{160, 8, 111}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{160, 9, 76}: "CenturyLink", + [3]byte{160, 9, 237}: "Avaya Inc", + [3]byte{160, 10, 191}: "Wieson Technologies Co., Ltd.", + [3]byte{160, 11, 186}: "SAMSUNG ELECTRO MECHANICS CO., LTD.", + [3]byte{160, 12, 161}: "SKTB SKiT", + [3]byte{160, 16, 129}: "Samsung Electronics Co.,Ltd", + [3]byte{160, 18, 144}: "Avaya Inc", + [3]byte{160, 18, 219}: "TABUCHI ELECTRIC CO.,LTD", + [3]byte{160, 19, 59}: "HiTi Digital, Inc.", + [3]byte{160, 19, 203}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{160, 20, 61}: "PARROT SA", + [3]byte{160, 22, 92}: "Triteka LTD", + [3]byte{160, 24, 40}: "Apple, Inc.", + [3]byte{160, 24, 89}: "Shenzhen Yidashi Electronics Co Ltd", + [3]byte{160, 25, 23}: "Bertel S.p.a.", + [3]byte{160, 27, 41}: "Sagemcom Broadband SAS", + [3]byte{160, 28, 5}: "NIMAX TELECOM CO.,LTD.", + [3]byte{160, 29, 72}: "Hewlett Packard", + [3]byte{160, 30, 11}: "MINIX Technology Limited", + [3]byte{160, 32, 166}: "Espressif Inc.", + [3]byte{160, 33, 149}: "Samsung Electronics Co.,Ltd", + [3]byte{160, 33, 183}: "NETGEAR", + [3]byte{160, 35, 27}: "TeleComp R&D Corp.", + [3]byte{160, 35, 159}: "Cisco Systems, Inc", + [3]byte{160, 43, 184}: "Hewlett Packard", + [3]byte{160, 44, 54}: "FN-LINK TECHNOLOGY LIMITED", + [3]byte{160, 46, 243}: "United Integrated Services Co., Led.", + [3]byte{160, 50, 153}: "Lenovo (Beijing) Co., Ltd.", + [3]byte{160, 52, 27}: "TrackR, Inc", + [3]byte{160, 54, 159}: "Intel Corporate", + [3]byte{160, 54, 240}: "Comprehensive Power", + [3]byte{160, 54, 250}: "Ettus Research LLC", + [3]byte{160, 57, 247}: "LG Electronics (Mobile Communications)", + [3]byte{160, 58, 117}: "PSS Belgium N.V.", + [3]byte{160, 59, 27}: "Inspire Tech", + [3]byte{160, 59, 227}: "Apple, Inc.", + [3]byte{160, 61, 111}: "Cisco Systems, Inc", + [3]byte{160, 62, 107}: "IEEE Registration Authority", + [3]byte{160, 64, 37}: "Actioncable, Inc.", + [3]byte{160, 64, 65}: "SAMWONFA Co.,Ltd.", + [3]byte{160, 64, 160}: "NETGEAR", + [3]byte{160, 65, 94}: "Opsens Solution Inc.", + [3]byte{160, 65, 167}: "NL Ministry of Defense", + [3]byte{160, 66, 63}: "Tyan Computer Corp", + [3]byte{160, 67, 219}: "Sitael S.p.A.", + [3]byte{160, 72, 28}: "Hewlett Packard", + [3]byte{160, 76, 91}: "Shenzhen TINNO Mobile Technology Corp.", + [3]byte{160, 76, 193}: "Helixtech Corp.", + [3]byte{160, 78, 1}: "CENTRAL ENGINEERING co.,ltd.", + [3]byte{160, 78, 4}: "Nokia Corporation", + [3]byte{160, 78, 167}: "Apple, Inc.", + [3]byte{160, 79, 212}: "ADB Broadband Italia", + [3]byte{160, 81, 198}: "Avaya Inc", + [3]byte{160, 85, 79}: "Cisco Systems, Inc", + [3]byte{160, 85, 222}: "ARRIS Group, Inc.", + [3]byte{160, 86, 178}: "Harman/Becker Automotive Systems GmbH", + [3]byte{160, 89, 58}: "V.D.S. Video Display Systems srl", + [3]byte{160, 90, 164}: "Grand Products Nevada, Inc.", + [3]byte{160, 91, 33}: "ENVINET GmbH", + [3]byte{160, 93, 193}: "TMCT Co., LTD.", + [3]byte{160, 93, 231}: "DIRECTV, Inc.", + [3]byte{160, 94, 107}: "MELPER Co., Ltd.", + [3]byte{160, 96, 144}: "Samsung Electronics Co.,Ltd", + [3]byte{160, 99, 145}: "NETGEAR", + [3]byte{160, 100, 143}: "ASKEY COMPUTER CORP", + [3]byte{160, 101, 24}: "VNPT TECHNOLOGY", + [3]byte{160, 103, 190}: "Sicon srl", + [3]byte{160, 105, 134}: "Wellav Technologies Ltd", + [3]byte{160, 106, 0}: "Verilink Corporation", + [3]byte{160, 106, 68}: "Vizio, Inc", + [3]byte{160, 108, 236}: "RIM", + [3]byte{160, 109, 9}: "Intelcan Technosystems Inc.", + [3]byte{160, 110, 80}: "Nanotek Elektronik Sistemler Ltd. Sti.", + [3]byte{160, 111, 170}: "LG Innotek", + [3]byte{160, 112, 153}: "Beijing Huacan Electronics Co., Ltd", + [3]byte{160, 113, 169}: "Nokia Corporation", + [3]byte{160, 114, 44}: "HUMAX Co., Ltd.", + [3]byte{160, 114, 228}: "NJ SYSTEM CO.,LTD", + [3]byte{160, 115, 50}: "Cashmaster International Limited", + [3]byte{160, 115, 252}: "Rancore Technologies Private Limited", + [3]byte{160, 117, 145}: "Samsung Electronics Co.,Ltd", + [3]byte{160, 119, 113}: "Vialis BV", + [3]byte{160, 120, 186}: "Pantech Co., Ltd.", + [3]byte{160, 130, 31}: "Samsung Electronics Co.,Ltd", + [3]byte{160, 130, 172}: "Linear DMS Solutions Sdn. Bhd.", + [3]byte{160, 130, 199}: "P.T.I Co.,LTD", + [3]byte{160, 132, 203}: "SonicSensory,Inc.", + [3]byte{160, 134, 29}: "Chengdu Fuhuaxin Technology co.,Ltd", + [3]byte{160, 134, 198}: "Xiaomi Communications Co Ltd", + [3]byte{160, 134, 236}: "SAEHAN HITEC Co., Ltd", + [3]byte{160, 136, 105}: "Intel Corporate", + [3]byte{160, 136, 180}: "Intel Corporate", + [3]byte{160, 137, 228}: "Skyworth Digital Technology(Shenzhen) Co.,Ltd", + [3]byte{160, 138, 135}: "HuiZhou KaiYue Electronic Co.,Ltd", + [3]byte{160, 140, 21}: "Gerhard D. Wempe KG", + [3]byte{160, 140, 155}: "Xtreme Technologies Corp", + [3]byte{160, 140, 248}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{160, 140, 253}: "Hewlett Packard", + [3]byte{160, 141, 22}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{160, 142, 120}: "Sagemcom Broadband SAS", + [3]byte{160, 144, 222}: "VEEDIMS,LLC", + [3]byte{160, 145, 105}: "LG Electronics (Mobile Communications)", + [3]byte{160, 145, 200}: "zte corporation", + [3]byte{160, 147, 71}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{160, 149, 12}: "China Mobile IOTCompany Limited", + [3]byte{160, 152, 5}: "OpenVox Communication Co Ltd", + [3]byte{160, 152, 237}: "Shandong Intelligent Optical Communication Development Co., Ltd.", + [3]byte{160, 153, 155}: "Apple, Inc.", + [3]byte{160, 154, 90}: "Time Domain", + [3]byte{160, 155, 189}: "Total Aviation Solutions Pty Ltd", + [3]byte{160, 157, 134}: "Alcatel-Lucent Shanghai Bell Co., Ltd", + [3]byte{160, 157, 145}: "SoundBridge", + [3]byte{160, 157, 193}: "China Dragon Technology Limited", + [3]byte{160, 158, 26}: "Polar Electro Oy", + [3]byte{160, 161, 48}: "DLI Taiwan Branch office", + [3]byte{160, 162, 60}: "GPMS", + [3]byte{160, 163, 59}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{160, 163, 226}: "Actiontec Electronics, Inc", + [3]byte{160, 166, 92}: "Supercomputing Systems AG", + [3]byte{160, 167, 99}: "Polytron Vertrieb GmbH", + [3]byte{160, 168, 205}: "Intel Corporate", + [3]byte{160, 170, 253}: "EraThink Technologies Corp.", + [3]byte{160, 171, 27}: "D-Link International", + [3]byte{160, 173, 161}: "JMR Electronics, Inc", + [3]byte{160, 175, 189}: "Intel Corporate", + [3]byte{160, 177, 0}: "ShenZhen Cando Electronics Co.,Ltd", + [3]byte{160, 179, 204}: "Hewlett Packard", + [3]byte{160, 180, 55}: "GD Mission Systems", + [3]byte{160, 180, 165}: "Samsung Electronics Co.,Ltd", + [3]byte{160, 181, 218}: "HongKong THTF Co., Ltd", + [3]byte{160, 182, 98}: "Acutvista Innovation Co., Ltd.", + [3]byte{160, 184, 248}: "Amgen U.S.A. Inc.", + [3]byte{160, 185, 237}: "Skytap", + [3]byte{160, 186, 184}: "Pixon Imaging", + [3]byte{160, 187, 62}: "IEEE Registration Authority", + [3]byte{160, 189, 205}: "BSkyB Ltd", + [3]byte{160, 191, 80}: "S.C. ADD-PRODUCTION S.R.L.", + [3]byte{160, 191, 165}: "CORESYS", + [3]byte{160, 194, 222}: "Costar Video Systems", + [3]byte{160, 195, 222}: "Triton Electronic Systems Ltd.", + [3]byte{160, 196, 165}: "SYGN HOUSE CO.,LTD", + [3]byte{160, 197, 98}: "ARRIS Group, Inc.", + [3]byte{160, 197, 137}: "Intel Corporate", + [3]byte{160, 197, 242}: "IEEE Registration Authority", + [3]byte{160, 198, 236}: "ShenZhen ANYK Technology Co.,LTD", + [3]byte{160, 201, 160}: "Murata Manufacturing Co., Ltd.", + [3]byte{160, 203, 253}: "Samsung Electronics Co.,Ltd", + [3]byte{160, 204, 43}: "Murata Manufacturing Co., Ltd.", + [3]byte{160, 206, 200}: "CE LINK LIMITED", + [3]byte{160, 207, 91}: "Cisco Systems, Inc", + [3]byte{160, 209, 42}: "AXPRO Technology Inc.", + [3]byte{160, 211, 122}: "Intel Corporate", + [3]byte{160, 211, 133}: "AUMA Riester GmbH & Co. KG", + [3]byte{160, 211, 193}: "Hewlett Packard", + [3]byte{160, 215, 149}: "Apple, Inc.", + [3]byte{160, 216, 111}: "Private", + [3]byte{160, 218, 146}: "Nanjing Glarun Atten Technology Co. Ltd.", + [3]byte{160, 220, 4}: "Becker-Antriebe GmbH", + [3]byte{160, 221, 151}: "PolarLink Technologies, Ltd", + [3]byte{160, 221, 229}: "SHARP Corporation", + [3]byte{160, 222, 5}: "JSC Irbis-T", + [3]byte{160, 224, 175}: "Cisco Systems, Inc", + [3]byte{160, 226, 1}: "AVTrace Ltd.(China)", + [3]byte{160, 226, 90}: "Amicus SK, s.r.o.", + [3]byte{160, 226, 149}: "DAT System Co.,Ltd", + [3]byte{160, 228, 83}: "Sony Mobile Communications AB", + [3]byte{160, 228, 203}: "Zyxel Communications Corporation", + [3]byte{160, 229, 52}: "Stratec Biomedical AG", + [3]byte{160, 229, 233}: "enimai Inc", + [3]byte{160, 230, 248}: "Texas Instruments", + [3]byte{160, 233, 219}: "Ningbo FreeWings Technologies Co.,Ltd", + [3]byte{160, 235, 118}: "AirCUVE Inc.", + [3]byte{160, 236, 128}: "zte corporation", + [3]byte{160, 236, 249}: "Cisco Systems, Inc", + [3]byte{160, 237, 205}: "Apple, Inc.", + [3]byte{160, 239, 132}: "Seine Image Int'l Co., Ltd", + [3]byte{160, 242, 23}: "GE Medical System(China) Co., Ltd.", + [3]byte{160, 243, 193}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{160, 243, 228}: "Alcatel-Lucent IPD", + [3]byte{160, 244, 25}: "Nokia Corporation", + [3]byte{160, 244, 80}: "HTC Corporation", + [3]byte{160, 244, 89}: "FN-LINK TECHNOLOGY LIMITED", + [3]byte{160, 244, 121}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{160, 246, 253}: "Texas Instruments", + [3]byte{160, 248, 73}: "Cisco Systems, Inc", + [3]byte{160, 248, 149}: "Shenzhen TINNO Mobile Technology Corp.", + [3]byte{160, 249, 224}: "VIVATEL COMPANY LIMITED", + [3]byte{160, 252, 110}: "Telegrafia a.s.", + [3]byte{160, 254, 97}: "Vivint Wireless Inc.", + [3]byte{160, 254, 145}: "AVAT Automation GmbH", + [3]byte{164, 1, 48}: "ABIsystems Co., LTD", + [3]byte{164, 2, 185}: "Intel Corporate", + [3]byte{164, 4, 80}: "nFore Technology Inc.", + [3]byte{164, 5, 158}: "STA Infinity LLP", + [3]byte{164, 7, 182}: "Samsung Electronics Co.,Ltd", + [3]byte{164, 8, 234}: "Murata Manufacturing Co., Ltd.", + [3]byte{164, 8, 245}: "Sagemcom Broadband SAS", + [3]byte{164, 9, 203}: "Alfred Kaercher GmbH & Co KG", + [3]byte{164, 11, 237}: "Carry Technology Co.,Ltd", + [3]byte{164, 12, 195}: "Cisco Systems, Inc", + [3]byte{164, 13, 188}: "Xiamen Intretech Inc.", + [3]byte{164, 14, 43}: "Facebook Inc", + [3]byte{164, 17, 21}: "Robert Bosch Engineering and Business Solutions pvt. Ltd.", + [3]byte{164, 17, 99}: "IEEE Registration Authority", + [3]byte{164, 18, 66}: "NEC Platforms, Ltd.", + [3]byte{164, 19, 78}: "Luxul", + [3]byte{164, 20, 55}: "Hangzhou Hikvision Digital Technology Co.,Ltd.", + [3]byte{164, 21, 102}: "Weifang GoerTek Technology Co.,Ltd.", + [3]byte{164, 21, 136}: "ARRIS Group, Inc.", + [3]byte{164, 23, 49}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{164, 24, 117}: "Cisco Systems, Inc", + [3]byte{164, 27, 192}: "Fastec Imaging Corporation", + [3]byte{164, 31, 114}: "Dell Inc.", + [3]byte{164, 33, 138}: "Nortel Networks", + [3]byte{164, 35, 5}: "Open Networking Laboratory", + [3]byte{164, 36, 179}: "FlatFrog Laboratories AB", + [3]byte{164, 36, 221}: "Cambrionix Ltd", + [3]byte{164, 37, 27}: "Avaya Inc", + [3]byte{164, 41, 64}: "Shenzhen YOUHUA Technology Co., Ltd", + [3]byte{164, 41, 131}: "Boeing Defence Australia", + [3]byte{164, 41, 183}: "bluesky", + [3]byte{164, 43, 140}: "NETGEAR", + [3]byte{164, 43, 176}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{164, 44, 8}: "Masterwork Automodules", + [3]byte{164, 49, 17}: "ZIV", + [3]byte{164, 49, 53}: "Apple, Inc.", + [3]byte{164, 51, 209}: "Fibrlink Communications Co.,Ltd.", + [3]byte{164, 52, 18}: "Thales Alenia Space", + [3]byte{164, 52, 217}: "Intel Corporate", + [3]byte{164, 52, 241}: "Texas Instruments", + [3]byte{164, 56, 49}: "RF elements s.r.o.", + [3]byte{164, 56, 252}: "Plastic Logic", + [3]byte{164, 58, 105}: "Vers Inc", + [3]byte{164, 59, 250}: "IEEE Registration Authority", + [3]byte{164, 61, 120}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{164, 62, 81}: "ANOV FRANCE", + [3]byte{164, 68, 209}: "Wingtech Group (HongKong)Limited", + [3]byte{164, 70, 107}: "EOC Technology", + [3]byte{164, 70, 250}: "AmTRAN Video Corporation", + [3]byte{164, 74, 211}: "ST Electronics(Shanghai) Co.,Ltd", + [3]byte{164, 75, 21}: "Sun Cupid Technology (HK) LTD", + [3]byte{164, 76, 17}: "Cisco Systems, Inc", + [3]byte{164, 76, 200}: "Dell Inc.", + [3]byte{164, 78, 45}: "Adaptive Wireless Solutions, LLC", + [3]byte{164, 78, 49}: "Intel Corporate", + [3]byte{164, 79, 41}: "IEEE Registration Authority", + [3]byte{164, 80, 85}: "busware.de", + [3]byte{164, 81, 111}: "Microsoft Mobile Oy", + [3]byte{164, 82, 111}: "ADB Broadband Italia", + [3]byte{164, 83, 133}: "Weifang GoerTek Technology Co.,Ltd.", + [3]byte{164, 86, 2}: "fenglian Technology Co.,Ltd.", + [3]byte{164, 86, 27}: "MCOT Corporation", + [3]byte{164, 86, 48}: "Cisco Systems, Inc", + [3]byte{164, 88, 15}: "IEEE Registration Authority", + [3]byte{164, 90, 28}: "smart-electronic GmbH", + [3]byte{164, 92, 39}: "Nintendo Co., Ltd.", + [3]byte{164, 93, 54}: "Hewlett Packard", + [3]byte{164, 93, 161}: "ADB Broadband Italia", + [3]byte{164, 94, 96}: "Apple, Inc.", + [3]byte{164, 96, 17}: "Verifone", + [3]byte{164, 96, 50}: "MRV Communications (Networks) LTD", + [3]byte{164, 98, 223}: "DS Global. Co., LTD", + [3]byte{164, 103, 6}: "Apple, Inc.", + [3]byte{164, 104, 188}: "Private", + [3]byte{164, 108, 42}: "Cisco Systems, Inc", + [3]byte{164, 108, 193}: "LTi REEnergy GmbH", + [3]byte{164, 110, 121}: "DFT System Co.Ltd", + [3]byte{164, 112, 214}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{164, 113, 116}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{164, 119, 51}: "Google, Inc.", + [3]byte{164, 119, 88}: "Ningbo Freewings Technologies Co.,Ltd", + [3]byte{164, 119, 96}: "Nokia Corporation", + [3]byte{164, 120, 134}: "Avaya Inc", + [3]byte{164, 121, 228}: "KLINFO Corp", + [3]byte{164, 122, 164}: "ARRIS Group, Inc.", + [3]byte{164, 122, 207}: "VIBICOM COMMUNICATIONS INC.", + [3]byte{164, 123, 44}: "Nokia", + [3]byte{164, 123, 133}: "ULTIMEDIA Co Ltd,", + [3]byte{164, 123, 157}: "Espressif Inc.", + [3]byte{164, 124, 20}: "ChargeStorm AB", + [3]byte{164, 124, 31}: "Cobham plc", + [3]byte{164, 126, 57}: "zte corporation", + [3]byte{164, 129, 238}: "Nokia Corporation", + [3]byte{164, 130, 105}: "Datrium, Inc.", + [3]byte{164, 132, 49}: "Samsung Electronics Co.,Ltd", + [3]byte{164, 133, 107}: "Q Electronics Ltd", + [3]byte{164, 134, 174}: "Quectel Wireless Solutions", + [3]byte{164, 137, 91}: "ARK INFOSOLUTIONS PVT LTD", + [3]byte{164, 140, 219}: "Lenovo", + [3]byte{164, 141, 59}: "Vizio, Inc", + [3]byte{164, 142, 10}: "DeLaval International AB", + [3]byte{164, 144, 5}: "CHINA GREATWALL COMPUTER SHENZHEN CO.,LTD", + [3]byte{164, 145, 177}: "Technicolor", + [3]byte{164, 147, 76}: "Cisco Systems, Inc", + [3]byte{164, 151, 187}: "Hitachi Industrial Equipment Systems Co.,Ltd", + [3]byte{164, 153, 71}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{164, 153, 129}: "FuJian Elite Power Tech CO.,LTD.", + [3]byte{164, 154, 88}: "Samsung Electronics Co.,Ltd", + [3]byte{164, 155, 19}: "Digital Check", + [3]byte{164, 155, 245}: "Hybridserver Tec GmbH", + [3]byte{164, 157, 73}: "Ketra, Inc.", + [3]byte{164, 158, 219}: "AutoCrib, Inc.", + [3]byte{164, 159, 133}: "Lyve Minds, Inc", + [3]byte{164, 159, 137}: "Shanghai Rui Rui Communication Technology Co.Ltd.", + [3]byte{164, 161, 194}: "Ericsson AB", + [3]byte{164, 161, 228}: "Innotube, Inc.", + [3]byte{164, 162, 74}: "Cisco SPVTG", + [3]byte{164, 164, 211}: "Bluebank Communication Technology Co.Ltd", + [3]byte{164, 166, 169}: "Private", + [3]byte{164, 168, 15}: "Shenzhen Coship Electronics Co., Ltd.", + [3]byte{164, 173, 0}: "Ragsdale Technology", + [3]byte{164, 173, 184}: "Vitec Group, Camera Dynamics Ltd", + [3]byte{164, 174, 154}: "Maestro Wireless Solutions ltd.", + [3]byte{164, 177, 33}: "Arantia 2010 S.L.", + [3]byte{164, 177, 151}: "Apple, Inc.", + [3]byte{164, 177, 233}: "Technicolor", + [3]byte{164, 177, 238}: "H. ZANDER GmbH & Co. KG", + [3]byte{164, 178, 167}: "Adaxys Solutions AG", + [3]byte{164, 179, 106}: "JSC SDO Chromatec", + [3]byte{164, 181, 46}: "Integrated Device Technology (Malaysia) Sdn. Bhd.", + [3]byte{164, 184, 5}: "Apple, Inc.", + [3]byte{164, 184, 24}: "PENTA Gesellschaft für elektronische Industriedatenverarbeitung mbH", + [3]byte{164, 185, 128}: "Parking BOXX Inc.", + [3]byte{164, 186, 118}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{164, 186, 219}: "Dell Inc.", + [3]byte{164, 187, 175}: "Lime Instruments", + [3]byte{164, 190, 97}: "EutroVision System, Inc.", + [3]byte{164, 191, 1}: "Intel Corporate", + [3]byte{164, 192, 199}: "ShenZhen Hitom Communication Technology Co..LTD", + [3]byte{164, 192, 225}: "Nintendo Co., Ltd.", + [3]byte{164, 193, 56}: "Telink Semiconductor (Taipei) Co. Ltd.", + [3]byte{164, 194, 171}: "Hangzhou LEAD-IT Information & Technology Co.,Ltd", + [3]byte{164, 195, 97}: "Apple, Inc.", + [3]byte{164, 196, 148}: "Intel Corporate", + [3]byte{164, 198, 79}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{164, 199, 222}: "Cambridge Industries(Group) Co.,Ltd.", + [3]byte{164, 202, 160}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{164, 204, 50}: "Inficomm Co., Ltd", + [3]byte{164, 208, 148}: "Erwin Peters Systemtechnik GmbH", + [3]byte{164, 209, 140}: "Apple, Inc.", + [3]byte{164, 209, 143}: "Shenzhen Skyee Optical Fiber Communication Technology Ltd.", + [3]byte{164, 209, 209}: "ECOtality North America", + [3]byte{164, 209, 210}: "Apple, Inc.", + [3]byte{164, 211, 181}: "GLITEL Stropkov, s.r.o.", + [3]byte{164, 213, 120}: "Texas Instruments", + [3]byte{164, 216, 86}: "Gimbal, Inc", + [3]byte{164, 216, 202}: "HONG KONG WATER WORLD TECHNOLOGY CO. LIMITED", + [3]byte{164, 217, 164}: "neXus ID Solutions AB", + [3]byte{164, 218, 63}: "Bionics Corp.", + [3]byte{164, 219, 46}: "Kingspan Environmental Ltd", + [3]byte{164, 219, 48}: "Liteon Technology Corporation", + [3]byte{164, 220, 190}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{164, 222, 80}: "Total Walther GmbH", + [3]byte{164, 222, 201}: "QLove Mobile Intelligence Information Technology (W.H.) Co. Ltd.", + [3]byte{164, 224, 230}: "FILIZOLA S.A. PESAGEM E AUTOMACAO", + [3]byte{164, 227, 46}: "Silicon & Software Systems Ltd.", + [3]byte{164, 227, 145}: "DENY FONTAINE", + [3]byte{164, 228, 184}: "BlackBerry RTS", + [3]byte{164, 229, 151}: "Gessler GmbH", + [3]byte{164, 230, 177}: "Shanghai Joindata Technology Co.,Ltd.", + [3]byte{164, 231, 49}: "Nokia Corporation", + [3]byte{164, 231, 228}: "Connex GmbH", + [3]byte{164, 233, 117}: "Apple, Inc.", + [3]byte{164, 233, 145}: "SISTEMAS AUDIOVISUALES ITELSIS S.L.", + [3]byte{164, 233, 163}: "Honest Technology Co., Ltd", + [3]byte{164, 235, 211}: "Samsung Electronics Co.,Ltd", + [3]byte{164, 237, 78}: "ARRIS Group, Inc.", + [3]byte{164, 238, 87}: "Seiko Epson Corporation", + [3]byte{164, 239, 82}: "Telewave Co., Ltd.", + [3]byte{164, 241, 232}: "Apple, Inc.", + [3]byte{164, 243, 193}: "Open Source Robotics Foundation, Inc.", + [3]byte{164, 243, 231}: "Integrated Device Technology (Malaysia) Sdn. Bhd.", + [3]byte{164, 244, 194}: "VNPT TECHNOLOGY", + [3]byte{164, 245, 34}: "CHOFU SEISAKUSHO CO.,LTD", + [3]byte{164, 247, 208}: "LAN Accessories Co., Ltd.", + [3]byte{164, 251, 141}: "Hangzhou Dunchong Technology Co.Ltd", + [3]byte{164, 252, 206}: "Security Expert Ltd.", + [3]byte{168, 1, 128}: "IMAGO Technologies GmbH", + [3]byte{168, 6, 0}: "Samsung Electronics Co.,Ltd", + [3]byte{168, 12, 13}: "Cisco Systems, Inc", + [3]byte{168, 12, 99}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{168, 12, 202}: "Shenzhen Sundray Technologies Company Limited", + [3]byte{168, 17, 252}: "ARRIS Group, Inc.", + [3]byte{168, 19, 116}: "Panasonic Corporation AVC Networks Company", + [3]byte{168, 21, 77}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{168, 21, 89}: "Breathometer, Inc.", + [3]byte{168, 21, 214}: "Shenzhen Meione Technology CO., LTD", + [3]byte{168, 22, 178}: "LG Electronics (Mobile Communications)", + [3]byte{168, 23, 88}: "Elektronik System i Umeå AB", + [3]byte{168, 27, 24}: "XTS CORP", + [3]byte{168, 27, 90}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{168, 27, 93}: "Foxtel Management Pty Ltd", + [3]byte{168, 27, 106}: "Texas Instruments", + [3]byte{168, 29, 22}: "AzureWave Technology Inc.", + [3]byte{168, 30, 132}: "QUANTA COMPUTER INC.", + [3]byte{168, 31, 175}: "KRYPTON POLSKA", + [3]byte{168, 32, 102}: "Apple, Inc.", + [3]byte{168, 36, 235}: "ZAO NPO Introtest", + [3]byte{168, 37, 235}: "Cambridge Industries(Group) Co.,Ltd.", + [3]byte{168, 38, 217}: "HTC Corporation", + [3]byte{168, 41, 76}: "Precision Optical Transceivers, Inc.", + [3]byte{168, 43, 181}: "Edgecore Networks Corporation", + [3]byte{168, 43, 214}: "Shina System Co., Ltd", + [3]byte{168, 48, 173}: "Weifang GoerTek Technology Co.,Ltd.", + [3]byte{168, 50, 154}: "Digicom Futuristic Technologies Ltd.", + [3]byte{168, 57, 68}: "Actiontec Electronics, Inc", + [3]byte{168, 64, 65}: "Dragino Technology Co., Limited", + [3]byte{168, 68, 129}: "Nokia Corporation", + [3]byte{168, 69, 205}: "Siselectron Technology LTD.", + [3]byte{168, 69, 233}: "Firich Enterprises CO., LTD.", + [3]byte{168, 71, 74}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{168, 73, 165}: "Lisantech Co., Ltd.", + [3]byte{168, 78, 63}: "Hitron Technologies. Inc", + [3]byte{168, 84, 178}: "Wistron Neweb Corporation", + [3]byte{168, 85, 106}: "Pocketnet Technology Inc.", + [3]byte{168, 87, 78}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{168, 88, 64}: "Cambridge Industries(Group) Co.,Ltd.", + [3]byte{168, 91, 120}: "Apple, Inc.", + [3]byte{168, 91, 176}: "Shenzhen Dehoo Technology Co.,Ltd", + [3]byte{168, 91, 243}: "Audivo GmbH", + [3]byte{168, 92, 44}: "Apple, Inc.", + [3]byte{168, 94, 228}: "12Sided Technology, LLC", + [3]byte{168, 96, 182}: "Apple, Inc.", + [3]byte{168, 97, 170}: "Cloudview Limited", + [3]byte{168, 98, 162}: "JIWUMEDIA CO., LTD.", + [3]byte{168, 99, 223}: "DISPLAIRE CORPORATION", + [3]byte{168, 99, 242}: "Texas Instruments", + [3]byte{168, 100, 5}: "nimbus 9, Inc", + [3]byte{168, 101, 178}: "DONGGUAN YISHANG ELECTRONIC TECHNOLOGY CO., LIMITED", + [3]byte{168, 102, 127}: "Apple, Inc.", + [3]byte{168, 106, 111}: "RIM", + [3]byte{168, 106, 193}: "HanbitEDS Co., Ltd.", + [3]byte{168, 107, 124}: "SHENZHEN FENGLIAN TECHNOLOGY CO., LTD.", + [3]byte{168, 107, 173}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{168, 112, 165}: "UniComm Inc.", + [3]byte{168, 114, 133}: "IDT, INC.", + [3]byte{168, 116, 29}: "PHOENIX CONTACT Electronics GmbH", + [3]byte{168, 117, 214}: "FreeTek International Co., Ltd.", + [3]byte{168, 117, 226}: "Aventura Technologies, Inc.", + [3]byte{168, 119, 111}: "Zonoff", + [3]byte{168, 123, 57}: "Nokia Corporation", + [3]byte{168, 124, 1}: "Samsung Electronics Co.,Ltd", + [3]byte{168, 126, 51}: "Nokia Danmark A/S", + [3]byte{168, 128, 56}: "ShenZhen MovingComm Technology Co., Limited", + [3]byte{168, 129, 149}: "Samsung Electronics Co.,Ltd", + [3]byte{168, 129, 241}: "BMEYE B.V.", + [3]byte{168, 130, 0}: "Hisense Electric Co.,Ltd", + [3]byte{168, 130, 127}: "CIBN Oriental Network(Beijing) CO.,Ltd", + [3]byte{168, 134, 221}: "Apple, Inc.", + [3]byte{168, 135, 146}: "Broadband Antenna Tracking Systems", + [3]byte{168, 135, 237}: "ARC Wireless LLC", + [3]byte{168, 136, 8}: "Apple, Inc.", + [3]byte{168, 140, 238}: "MicroMade Galka i Drozdz sp.j.", + [3]byte{168, 141, 123}: "SunDroid Global limited.", + [3]byte{168, 142, 36}: "Apple, Inc.", + [3]byte{168, 144, 8}: "Beijing Yuecheng Technology Co. Ltd.", + [3]byte{168, 146, 44}: "LG Electronics (Mobile Communications)", + [3]byte{168, 147, 82}: "SHANGHAI ZHONGMI COMMUNICATION TECHNOLOGY CO.,LTD", + [3]byte{168, 147, 230}: "JIANGXI JINGGANGSHAN CKING COMMUNICATION TECHNOLOGY CO.,LTD", + [3]byte{168, 149, 176}: "Aker Subsea Ltd", + [3]byte{168, 150, 117}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{168, 150, 138}: "Apple, Inc.", + [3]byte{168, 151, 220}: "IBM", + [3]byte{168, 152, 198}: "Shinbo Co., Ltd.", + [3]byte{168, 153, 92}: "aizo ag", + [3]byte{168, 155, 16}: "inMotion Ltd.", + [3]byte{168, 157, 33}: "Cisco Systems, Inc", + [3]byte{168, 157, 210}: "Shanghai DareGlobal Technologies Co.,Ltd", + [3]byte{168, 159, 186}: "Samsung Electronics Co.,Ltd", + [3]byte{168, 159, 236}: "ARRIS Group, Inc.", + [3]byte{168, 160, 137}: "Tactical Communications", + [3]byte{168, 161, 152}: "TCT mobile ltd", + [3]byte{168, 165, 226}: "MSF-Vathauer Antriebstechnik GmbH & Co KG", + [3]byte{168, 166, 72}: "Qingdao Hisense Communications Co.,Ltd.", + [3]byte{168, 166, 104}: "zte corporation", + [3]byte{168, 167, 149}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{168, 173, 61}: "Alcatel-Lucent Shanghai Bell Co., Ltd", + [3]byte{168, 176, 174}: "LEONI", + [3]byte{168, 177, 212}: "Cisco Systems, Inc", + [3]byte{168, 178, 218}: "FUJITSU LIMITED", + [3]byte{168, 184, 110}: "LG Electronics (Mobile Communications)", + [3]byte{168, 185, 179}: "ESSYS", + [3]byte{168, 187, 80}: "WiZ IoT Company Limited", + [3]byte{168, 187, 207}: "Apple, Inc.", + [3]byte{168, 189, 26}: "Honey Bee (Hong Kong) Limited", + [3]byte{168, 189, 39}: "Hewlett Packard Enterprise", + [3]byte{168, 189, 58}: "UNIONMAN TECHNOLOGY CO.,LTD", + [3]byte{168, 190, 39}: "Apple, Inc.", + [3]byte{168, 194, 34}: "TM-Research Inc.", + [3]byte{168, 200, 58}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{168, 200, 127}: "Roqos, Inc.", + [3]byte{168, 202, 123}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{168, 203, 149}: "EAST BEST CO., LTD.", + [3]byte{168, 204, 197}: "Saab AB (publ)", + [3]byte{168, 206, 144}: "CVC", + [3]byte{168, 208, 227}: "Systech Electronics Ltd.", + [3]byte{168, 208, 229}: "Juniper Networks", + [3]byte{168, 210, 54}: "Lightware Visual Engineering", + [3]byte{168, 211, 200}: "Topcon Electronics GmbH & Co. KG", + [3]byte{168, 211, 247}: "Arcadyan Technology Corporation", + [3]byte{168, 212, 9}: "USA 111 Inc", + [3]byte{168, 213, 121}: "Beijing Chushang Science and Technology Co.,Ltd", + [3]byte{168, 216, 40}: "Ascensia Diabetes Care", + [3]byte{168, 216, 138}: "Wyconn", + [3]byte{168, 224, 24}: "Nokia Corporation", + [3]byte{168, 227, 238}: "Sony Interactive Entertainment Inc.", + [3]byte{168, 229, 57}: "Moimstone Co.,Ltd", + [3]byte{168, 231, 5}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{168, 232, 36}: "INIM ELECTRONICS S.R.L.", + [3]byte{168, 238, 198}: "Muuselabs NV/SA", + [3]byte{168, 239, 38}: "Tritonwave", + [3]byte{168, 240, 56}: "SHEN ZHEN SHI JIN HUA TAI ELECTRONICS CO.,LTD", + [3]byte{168, 242, 116}: "Samsung Electronics Co.,Ltd", + [3]byte{168, 244, 112}: "Fujian Newland Communication Science Technologies Co.,Ltd.", + [3]byte{168, 247, 224}: "PLANET Technology Corporation", + [3]byte{168, 249, 75}: "Eltex Enterprise Ltd.", + [3]byte{168, 250, 216}: "Apple, Inc.", + [3]byte{168, 251, 112}: "WiseSec L.t.d", + [3]byte{168, 252, 183}: "Consolidated Resource Imaging", + [3]byte{170, 0, 0}: "DIGITAL EQUIPMENT CORPORATION", + [3]byte{170, 0, 1}: "DIGITAL EQUIPMENT CORPORATION", + [3]byte{170, 0, 2}: "DIGITAL EQUIPMENT CORPORATION", + [3]byte{170, 0, 3}: "DIGITAL EQUIPMENT CORPORATION", + [3]byte{170, 0, 4}: "DIGITAL EQUIPMENT CORPORATION", + [3]byte{172, 1, 66}: "Uriel Technologies SIA", + [3]byte{172, 2, 202}: "HI Solutions, Inc.", + [3]byte{172, 2, 207}: "RW Tecnologia Industria e Comercio Ltda", + [3]byte{172, 2, 239}: "Comsis", + [3]byte{172, 4, 11}: "Peloton Interactive, Inc", + [3]byte{172, 4, 129}: "Jiangsu Huaxing Electronics Co., Ltd.", + [3]byte{172, 6, 19}: "Senselogix Ltd", + [3]byte{172, 6, 199}: "ServerNet S.r.l.", + [3]byte{172, 10, 97}: "Labor S.r.L.", + [3]byte{172, 13, 27}: "LG Electronics (Mobile Communications)", + [3]byte{172, 13, 254}: "Ekon GmbH - myGEKKO", + [3]byte{172, 17, 211}: "Suzhou HOTEK Video Technology Co. Ltd", + [3]byte{172, 20, 97}: "ATAW Co., Ltd.", + [3]byte{172, 20, 210}: "wi-daq, inc.", + [3]byte{172, 22, 45}: "Hewlett Packard", + [3]byte{172, 23, 2}: "Fibar Group sp. z o.o.", + [3]byte{172, 24, 38}: "Seiko Epson Corporation", + [3]byte{172, 25, 159}: "SUNGROW POWER SUPPLY CO.,LTD.", + [3]byte{172, 29, 223}: "IEEE Registration Authority", + [3]byte{172, 31, 107}: "Super Micro Computer, Inc.", + [3]byte{172, 31, 116}: "Apple, Inc.", + [3]byte{172, 31, 215}: "Real Vision Technology Co.,Ltd.", + [3]byte{172, 32, 46}: "Hitron Technologies. Inc", + [3]byte{172, 32, 62}: "Wuhan Tianyu Information Industry Co., Ltd.", + [3]byte{172, 32, 170}: "DMATEK Co., Ltd.", + [3]byte{172, 34, 5}: "Compal Broadband Networks, Inc.", + [3]byte{172, 34, 11}: "ASUSTek COMPUTER INC.", + [3]byte{172, 35, 63}: "Shenzhen Minew Technologies Co., Ltd.", + [3]byte{172, 41, 58}: "Apple, Inc.", + [3]byte{172, 42, 12}: "CSR ZHUZHOU INSTITUTE CO.,LTD.", + [3]byte{172, 43, 110}: "Intel Corporate", + [3]byte{172, 45, 163}: "TXTR GmbH", + [3]byte{172, 47, 168}: "Humannix Co.,Ltd.", + [3]byte{172, 49, 157}: "Shenzhen TG-NET Botone Technology Co.,Ltd.", + [3]byte{172, 52, 203}: "Shanhai GBCOM Communication Technology Co. Ltd", + [3]byte{172, 54, 19}: "Samsung Electronics Co.,Ltd", + [3]byte{172, 55, 67}: "HTC Corporation", + [3]byte{172, 56, 112}: "Lenovo Mobile Communication Technology Ltd.", + [3]byte{172, 58, 122}: "Roku, Inc.", + [3]byte{172, 60, 11}: "Apple, Inc.", + [3]byte{172, 60, 180}: "Nilan A/S", + [3]byte{172, 61, 5}: "Instorescreen Aisa", + [3]byte{172, 61, 117}: "HANGZHOU ZHIWAY TECHNOLOGIES CO.,LTD.", + [3]byte{172, 63, 164}: "TAIYO YUDEN CO.,LTD", + [3]byte{172, 64, 234}: "C&T Solution Inc.", + [3]byte{172, 65, 34}: "Eclipse Electronic Systems Inc.", + [3]byte{172, 68, 242}: "YAMAHA CORPORATION", + [3]byte{172, 71, 35}: "Genelec", + [3]byte{172, 72, 45}: "Ralinwi Nanjing Electronic Technology Co., Ltd.", + [3]byte{172, 74, 254}: "Hisense Broadband Multimedia Technology Co.,Ltd.", + [3]byte{172, 75, 200}: "Juniper Networks", + [3]byte{172, 78, 46}: "Shenzhen JingHanDa Electronics Co.Ltd", + [3]byte{172, 78, 145}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{172, 79, 252}: "SVS-VISTEK GmbH", + [3]byte{172, 80, 54}: "Pi-Coral Inc", + [3]byte{172, 81, 44}: "Infinix mobility limited", + [3]byte{172, 81, 53}: "MPI TECH", + [3]byte{172, 81, 238}: "Cambridge Communication Systems Ltd", + [3]byte{172, 84, 236}: "IEEE P1823 Standards Working Group", + [3]byte{172, 86, 44}: "LAVA INTERNATIONAL(H.K) LIMITED", + [3]byte{172, 88, 59}: "Human Assembler, Inc.", + [3]byte{172, 88, 123}: "JCT Healthcare", + [3]byte{172, 90, 20}: "Samsung Electronics Co.,Ltd", + [3]byte{172, 93, 16}: "Pace Americas", + [3]byte{172, 94, 140}: "Utillink", + [3]byte{172, 95, 62}: "SAMSUNG ELECTRO-MECHANICS(THAILAND)", + [3]byte{172, 96, 182}: "Ericsson AB", + [3]byte{172, 97, 35}: "Drivven, Inc.", + [3]byte{172, 97, 117}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{172, 97, 234}: "Apple, Inc.", + [3]byte{172, 98, 13}: "Jabil Circuit(Wuxi) Co.,Ltd", + [3]byte{172, 99, 190}: "Amazon Technologies Inc.", + [3]byte{172, 100, 23}: "Siemens AG - Industrial Automation - EWA", + [3]byte{172, 100, 98}: "zte corporation", + [3]byte{172, 100, 221}: "IEEE Registration Authority", + [3]byte{172, 103, 6}: "Ruckus Wireless", + [3]byte{172, 103, 111}: "Electrocompaniet A.S.", + [3]byte{172, 107, 15}: "CADENCE DESIGN SYSTEMS INC", + [3]byte{172, 107, 172}: "Jenny Science AG", + [3]byte{172, 110, 26}: "SHENZHEN GONGJIN ELECTRONICS CO.,LT", + [3]byte{172, 111, 79}: "Enspert Inc", + [3]byte{172, 111, 187}: "TATUNG Technology Inc.", + [3]byte{172, 111, 217}: "Valueplus Inc.", + [3]byte{172, 114, 54}: "Lexking Technology Co., Ltd.", + [3]byte{172, 114, 137}: "Intel Corporate", + [3]byte{172, 116, 9}: "Hangzhou H3C Technologies Co., Limited", + [3]byte{172, 122, 66}: "iConnectivity", + [3]byte{172, 122, 77}: "ALPS ELECTRIC CO.,LTD.", + [3]byte{172, 123, 161}: "Intel Corporate", + [3]byte{172, 126, 138}: "Cisco Systems, Inc", + [3]byte{172, 127, 62}: "Apple, Inc.", + [3]byte{172, 128, 214}: "Hexatronic AB", + [3]byte{172, 129, 18}: "Gemtek Technology Co., Ltd.", + [3]byte{172, 129, 243}: "Nokia Corporation", + [3]byte{172, 131, 23}: "Shenzhen Furtunetel Communication Co., Ltd", + [3]byte{172, 131, 240}: "ImmediaTV Corporation", + [3]byte{172, 131, 243}: "AMPAK Technology, Inc.", + [3]byte{172, 132, 198}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{172, 132, 201}: "Sagemcom Broadband SAS", + [3]byte{172, 133, 61}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{172, 134, 116}: "Open Mesh, Inc.", + [3]byte{172, 134, 126}: "Create New Technology (HK) Limited Company", + [3]byte{172, 135, 163}: "Apple, Inc.", + [3]byte{172, 137, 149}: "AzureWave Technology Inc.", + [3]byte{172, 138, 205}: "ROGER D.Wensker, G.Wensker sp.j.", + [3]byte{172, 141, 20}: "Smartrove Inc", + [3]byte{172, 147, 47}: "Nokia Corporation", + [3]byte{172, 148, 3}: "Envision Peripherals Inc", + [3]byte{172, 154, 34}: "NXP Semiconductors", + [3]byte{172, 154, 150}: "Lantiq Deutschland GmbH", + [3]byte{172, 155, 10}: "Sony Corporation", + [3]byte{172, 155, 132}: "Smak Tecnologia e Automacao", + [3]byte{172, 156, 228}: "Alcatel-Lucent Shanghai Bell Co., Ltd", + [3]byte{172, 158, 23}: "ASUSTek COMPUTER INC.", + [3]byte{172, 160, 22}: "Cisco Systems, Inc", + [3]byte{172, 162, 19}: "Shenzhen Bilian electronic CO.,LTD", + [3]byte{172, 162, 44}: "Baycity Technologies Ltd", + [3]byte{172, 163, 30}: "Aruba Networks", + [3]byte{172, 164, 48}: "Peerless AV", + [3]byte{172, 166, 103}: "Electronic Systems Protection, Inc.", + [3]byte{172, 169, 25}: "TrekStor GmbH", + [3]byte{172, 169, 160}: "Audioengine, Ltd.", + [3]byte{172, 171, 46}: "Beijing LasNubes Technology Co., Ltd.", + [3]byte{172, 171, 141}: "Lyngso Marine A/S", + [3]byte{172, 171, 191}: "AthenTek Inc.", + [3]byte{172, 175, 185}: "Samsung Electronics Co.,Ltd", + [3]byte{172, 179, 19}: "ARRIS Group, Inc.", + [3]byte{172, 181, 125}: "Liteon Technology Corporation", + [3]byte{172, 183, 79}: "METEL s.r.o.", + [3]byte{172, 184, 89}: "Uniband Electronic Corp,", + [3]byte{172, 188, 50}: "Apple, Inc.", + [3]byte{172, 189, 11}: "IMAC CO.,LTD", + [3]byte{172, 190, 117}: "Ufine Technologies Co.,Ltd.", + [3]byte{172, 190, 182}: "Visualedge Technology Co., Ltd.", + [3]byte{172, 193, 238}: "Xiaomi Communications Co Ltd", + [3]byte{172, 194, 236}: "CLT INT'L IND. CORP.", + [3]byte{172, 195, 58}: "Samsung Electronics Co.,Ltd", + [3]byte{172, 197, 27}: "Zhuhai Pantum Electronics Co., Ltd.", + [3]byte{172, 197, 149}: "Graphite Systems", + [3]byte{172, 198, 98}: "MitraStar Technology Corp.", + [3]byte{172, 198, 152}: "Kohzu Precision Co., Ltd.", + [3]byte{172, 199, 63}: "VITSMO CO., LTD.", + [3]byte{172, 201, 53}: "Ness Corporation", + [3]byte{172, 202, 84}: "Telldus Technologies AB", + [3]byte{172, 202, 142}: "ODA Technologies", + [3]byte{172, 202, 171}: "Virtual Electric Inc", + [3]byte{172, 202, 186}: "Midokura Co., Ltd.", + [3]byte{172, 203, 9}: "Hefcom Metering (Pty) Ltd", + [3]byte{172, 204, 142}: "Axis Communications AB", + [3]byte{172, 206, 143}: "HWA YAO TECHNOLOGIES CO., LTD", + [3]byte{172, 207, 35}: "Hi-flying electronics technology Co.,Ltd", + [3]byte{172, 207, 92}: "Apple, Inc.", + [3]byte{172, 207, 133}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{172, 208, 116}: "Espressif Inc.", + [3]byte{172, 209, 128}: "Crexendo Business Solutions, Inc.", + [3]byte{172, 209, 184}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{172, 211, 100}: "ABB SPA, ABB SACE DIV.", + [3]byte{172, 214, 87}: "Shaanxi GuoLian Digital TV Technology Co.,Ltd.", + [3]byte{172, 217, 214}: "tci GmbH", + [3]byte{172, 219, 218}: "Shenzhen Geniatech Inc, Ltd", + [3]byte{172, 220, 229}: "Procter & Gamble Company", + [3]byte{172, 222, 72}: "Private", + [3]byte{172, 224, 16}: "Liteon Technology Corporation", + [3]byte{172, 224, 105}: "ISAAC Instruments", + [3]byte{172, 226, 21}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{172, 226, 211}: "Hewlett Packard", + [3]byte{172, 227, 72}: "MadgeTech, Inc", + [3]byte{172, 228, 46}: "SK hynix", + [3]byte{172, 228, 181}: "Apple, Inc.", + [3]byte{172, 229, 240}: "Doppler Labs", + [3]byte{172, 230, 75}: "Shenzhen Baojia Battery Technology Co., Ltd.", + [3]byte{172, 231, 123}: "SICHUAN TIANYI COMHEART TELECOMCO.,LTD", + [3]byte{172, 232, 123}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{172, 232, 126}: "Bytemark Computer Consulting Ltd", + [3]byte{172, 233, 127}: "IoT Tech Limited", + [3]byte{172, 233, 170}: "Hay Systems Ltd", + [3]byte{172, 234, 106}: "GENIX INFOCOMM CO., LTD.", + [3]byte{172, 236, 128}: "ARRIS Group, Inc.", + [3]byte{172, 237, 92}: "Intel Corporate", + [3]byte{172, 238, 59}: "6harmonics Inc", + [3]byte{172, 238, 158}: "Samsung Electronics Co.,Ltd", + [3]byte{172, 240, 178}: "Becker Electronics Taiwan Ltd.", + [3]byte{172, 241, 223}: "D-Link International", + [3]byte{172, 242, 197}: "Cisco Systems, Inc", + [3]byte{172, 247, 243}: "Xiaomi Communications Co Ltd", + [3]byte{172, 248, 92}: "Private", + [3]byte{172, 249, 126}: "ELESYS INC.", + [3]byte{172, 253, 147}: "Weifang GoerTek Technology Co.,Ltd.", + [3]byte{172, 253, 206}: "Intel Corporate", + [3]byte{172, 253, 236}: "Apple, Inc.", + [3]byte{176, 0, 180}: "Cisco Systems, Inc", + [3]byte{176, 5, 148}: "Liteon Technology Corporation", + [3]byte{176, 8, 191}: "Vital Connect, Inc.", + [3]byte{176, 9, 211}: "Avizia", + [3]byte{176, 9, 218}: "Ring Solutions", + [3]byte{176, 16, 65}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{176, 18, 3}: "Dynamics Hong Kong Limited", + [3]byte{176, 18, 102}: "Futaba-Kikaku", + [3]byte{176, 20, 8}: "LIGHTSPEED INTERNATIONAL CO.", + [3]byte{176, 23, 67}: "EDISON GLOBAL CIRCUITS LLC", + [3]byte{176, 25, 198}: "Apple, Inc.", + [3]byte{176, 27, 124}: "Ontrol A.S.", + [3]byte{176, 27, 210}: "Le Shi Zhi Xin Electronic Technology (Tianjin) Limited", + [3]byte{176, 28, 145}: "Elim Co", + [3]byte{176, 31, 41}: "Helvetia INC.", + [3]byte{176, 31, 129}: "IEEE Registration Authority", + [3]byte{176, 36, 243}: "Progeny Systems", + [3]byte{176, 37, 170}: "Private", + [3]byte{176, 38, 40}: "Broadcom Limited", + [3]byte{176, 52, 149}: "Apple, Inc.", + [3]byte{176, 53, 11}: "MOBIWIRE MOBILES (NINGBO) CO.,LTD", + [3]byte{176, 53, 141}: "Nokia Corporation", + [3]byte{176, 53, 159}: "Intel Corporate", + [3]byte{176, 56, 41}: "Siliconware Precision Industries Co., Ltd.", + [3]byte{176, 56, 80}: "Nanjing CAS-ZDC IOT SYSTEM CO.,LTD", + [3]byte{176, 57, 86}: "NETGEAR", + [3]byte{176, 61, 150}: "Vision Valley FZ LLC", + [3]byte{176, 62, 176}: "MICRODIA Ltd.", + [3]byte{176, 64, 137}: "Senient Systems LTD", + [3]byte{176, 65, 29}: "ITTIM Technologies", + [3]byte{176, 67, 93}: "NuLEDs, Inc.", + [3]byte{176, 69, 21}: "mira fitness,LLC.", + [3]byte{176, 69, 25}: "TCT mobile ltd", + [3]byte{176, 69, 69}: "YACOUB Automation GmbH", + [3]byte{176, 70, 252}: "MitraStar Technology Corp.", + [3]byte{176, 71, 191}: "Samsung Electronics Co.,Ltd", + [3]byte{176, 72, 26}: "Apple, Inc.", + [3]byte{176, 72, 122}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{176, 73, 95}: "OMRON HEALTHCARE Co., Ltd.", + [3]byte{176, 75, 191}: "PT HAN SUNG ELECTORONICS INDONESIA", + [3]byte{176, 76, 5}: "Fresenius Medical Care Deutschland GmbH", + [3]byte{176, 78, 38}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{176, 80, 188}: "SHENZHEN BASICOM ELECTRONIC CO.,LTD.", + [3]byte{176, 81, 142}: "Holl technology CO.Ltd.", + [3]byte{176, 82, 22}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{176, 85, 8}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{176, 87, 6}: "Vallox Oy", + [3]byte{176, 88, 196}: "Broadcast Microwave Services, Inc", + [3]byte{176, 89, 71}: "Shenzhen Qihu Intelligent Technology Company Limited", + [3]byte{176, 90, 218}: "Hewlett Packard", + [3]byte{176, 91, 31}: "THERMO FISHER SCIENTIFIC S.P.A.", + [3]byte{176, 91, 103}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{176, 92, 229}: "Nokia Corporation", + [3]byte{176, 97, 199}: "Ericsson-LG Enterprise", + [3]byte{176, 101, 99}: "Shanghai Railway Communication Factory", + [3]byte{176, 101, 189}: "Apple, Inc.", + [3]byte{176, 104, 182}: "Hangzhou OYE Technology Co. Ltd", + [3]byte{176, 105, 113}: "DEI Sales, Inc.", + [3]byte{176, 108, 191}: "3ality Digital Systems GmbH", + [3]byte{176, 110, 191}: "ASUSTek COMPUTER INC.", + [3]byte{176, 112, 45}: "Apple, Inc.", + [3]byte{176, 114, 191}: "Murata Manufacturing Co., Ltd.", + [3]byte{176, 117, 12}: "QA Cafe", + [3]byte{176, 117, 77}: "Nokia", + [3]byte{176, 117, 213}: "zte corporation", + [3]byte{176, 119, 172}: "ARRIS Group, Inc.", + [3]byte{176, 120, 112}: "Wi-NEXT, Inc.", + [3]byte{176, 120, 240}: "Beijing HuaqinWorld Technology Co.,Ltd.", + [3]byte{176, 121, 8}: "Cummings Engineering", + [3]byte{176, 121, 60}: "Revolv Inc", + [3]byte{176, 121, 148}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{176, 125, 71}: "Cisco Systems, Inc", + [3]byte{176, 125, 98}: "Dipl.-Ing. H. Horstmann GmbH", + [3]byte{176, 126, 112}: "Zadara Storage Ltd.", + [3]byte{176, 127, 185}: "NETGEAR", + [3]byte{176, 128, 140}: "Laser Light Engines", + [3]byte{176, 129, 216}: "I-sys Corp", + [3]byte{176, 131, 254}: "Dell Inc.", + [3]byte{176, 134, 158}: "Chloride S.r.L", + [3]byte{176, 136, 7}: "Strata Worldwide", + [3]byte{176, 137, 0}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{176, 137, 145}: "LGE", + [3]byte{176, 137, 194}: "Zyptonite", + [3]byte{176, 142, 26}: "URadio Systems Co., Ltd", + [3]byte{176, 144, 116}: "Fulan Electronics Limited", + [3]byte{176, 144, 212}: "Shenzhen Hoin Internet Technology Co., Ltd", + [3]byte{176, 145, 34}: "Texas Instruments", + [3]byte{176, 145, 52}: "Taleo", + [3]byte{176, 145, 55}: "ISis ImageStream Internet Solutions, Inc", + [3]byte{176, 147, 91}: "ARRIS Group, Inc.", + [3]byte{176, 149, 142}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{176, 150, 108}: "Lanbowan Technology Ltd.", + [3]byte{176, 151, 58}: "E-Fuel Corporation", + [3]byte{176, 152, 43}: "Sagemcom Broadband SAS", + [3]byte{176, 152, 159}: "LG CNS", + [3]byte{176, 153, 40}: "FUJITSU LIMITED", + [3]byte{176, 154, 226}: "STEMMER IMAGING GmbH", + [3]byte{176, 155, 212}: "GNH Software India Private Limited", + [3]byte{176, 159, 186}: "Apple, Inc.", + [3]byte{176, 161, 10}: "Pivotal Systems Corporation", + [3]byte{176, 162, 231}: "Shenzhen TINNO Mobile Technology Corp.", + [3]byte{176, 163, 126}: "Qingdao Haier Telecom Co.,Ltd", + [3]byte{176, 167, 42}: "Ensemble Designs, Inc.", + [3]byte{176, 167, 55}: "Roku, Inc.", + [3]byte{176, 168, 110}: "Juniper Networks", + [3]byte{176, 170, 54}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{176, 170, 119}: "Cisco Systems, Inc", + [3]byte{176, 172, 250}: "FUJITSU LIMITED", + [3]byte{176, 173, 170}: "Avaya Inc", + [3]byte{176, 178, 143}: "Sagemcom Broadband SAS", + [3]byte{176, 178, 220}: "Zyxel Communications Corporation", + [3]byte{176, 179, 43}: "Slican Sp. z o.o.", + [3]byte{176, 180, 72}: "Texas Instruments", + [3]byte{176, 184, 213}: "Nanjing Nengrui Auto Equipment CO.,Ltd", + [3]byte{176, 185, 138}: "NETGEAR", + [3]byte{176, 189, 109}: "Echostreams Innovative Solutions", + [3]byte{176, 189, 161}: "ZAKLAD ELEKTRONICZNY SIMS", + [3]byte{176, 191, 153}: "WIZITDONGDO", + [3]byte{176, 192, 144}: "Chicony Electronics Co., Ltd.", + [3]byte{176, 193, 40}: "Adler ELREHA GmbH", + [3]byte{176, 193, 158}: "zte corporation", + [3]byte{176, 194, 5}: "BIONIME", + [3]byte{176, 194, 135}: "Technicolor CH USA Inc.", + [3]byte{176, 196, 108}: "Senseit", + [3]byte{176, 196, 231}: "Samsung Electronics Co.,Ltd", + [3]byte{176, 197, 84}: "D-Link International", + [3]byte{176, 197, 89}: "Samsung Electronics Co.,Ltd", + [3]byte{176, 197, 202}: "IEEE Registration Authority", + [3]byte{176, 198, 154}: "Juniper Networks", + [3]byte{176, 199, 69}: "BUFFALO.INC", + [3]byte{176, 200, 63}: "Jiangsu Cynray IOT Co., Ltd.", + [3]byte{176, 200, 173}: "People Power Company", + [3]byte{176, 201, 91}: "Beijing Symtech CO.,LTD", + [3]byte{176, 202, 104}: "Apple, Inc.", + [3]byte{176, 206, 24}: "Zhejiang shenghui lighting co.,Ltd", + [3]byte{176, 207, 77}: "MI-Zone Technology Ireland", + [3]byte{176, 208, 156}: "Samsung Electronics Co.,Ltd", + [3]byte{176, 210, 245}: "Vello Systems, Inc.", + [3]byte{176, 213, 157}: "Shenzhen Zowee Technology Co., Ltd", + [3]byte{176, 213, 204}: "Texas Instruments", + [3]byte{176, 215, 197}: "Logipix Ltd", + [3]byte{176, 215, 204}: "Tridonic GmbH & Co KG", + [3]byte{176, 218, 0}: "CERA ELECTRONIQUE", + [3]byte{176, 218, 249}: "ARRIS Group, Inc.", + [3]byte{176, 223, 58}: "Samsung Electronics Co.,Ltd", + [3]byte{176, 223, 193}: "Tenda Technology Co.,Ltd.Dongguan branch", + [3]byte{176, 224, 60}: "TCT mobile ltd", + [3]byte{176, 225, 126}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{176, 226, 53}: "Xiaomi Communications Co Ltd", + [3]byte{176, 226, 229}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{176, 227, 157}: "CAT SYSTEM CO.,LTD.", + [3]byte{176, 229, 14}: "NRG SYSTEMS INC", + [3]byte{176, 229, 237}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{176, 231, 84}: "2Wire Inc", + [3]byte{176, 232, 146}: "Seiko Epson Corporation", + [3]byte{176, 233, 126}: "Advanced Micro Peripherals", + [3]byte{176, 234, 188}: "ASKEY COMPUTER CORP", + [3]byte{176, 236, 113}: "Samsung Electronics Co.,Ltd", + [3]byte{176, 236, 143}: "GMX SAS", + [3]byte{176, 236, 225}: "Private", + [3]byte{176, 238, 69}: "AzureWave Technology Inc.", + [3]byte{176, 238, 123}: "Roku, Inc", + [3]byte{176, 241, 163}: "Fengfan (BeiJing) Technology Co., Ltd.", + [3]byte{176, 241, 188}: "Dhemax Ingenieros Ltda", + [3]byte{176, 241, 236}: "AMPAK Technology, Inc.", + [3]byte{176, 248, 147}: "Shanghai MXCHIP Information Technology Co., Ltd.", + [3]byte{176, 249, 99}: "Hangzhou H3C Technologies Co., Limited", + [3]byte{176, 250, 235}: "Cisco Systems, Inc", + [3]byte{176, 252, 54}: "CyberTAN Technology Inc.", + [3]byte{176, 254, 189}: "Private", + [3]byte{180, 0, 22}: "INGENICO TERMINALS SAS", + [3]byte{180, 0, 156}: "CableWorld Ltd.", + [3]byte{180, 1, 66}: "GCI Science & Technology Co.,LTD", + [3]byte{180, 4, 24}: "Smartchip Integrated Inc.", + [3]byte{180, 5, 102}: "SP Best Corporation Co., LTD.", + [3]byte{180, 7, 249}: "SAMSUNG ELECTRO MECHANICS CO., LTD.", + [3]byte{180, 8, 50}: "TC Communications", + [3]byte{180, 10, 198}: "DEXON Systems Ltd.", + [3]byte{180, 11, 68}: "Smartisan Technology Co., Ltd.", + [3]byte{180, 11, 122}: "Brusa Elektronik AG", + [3]byte{180, 12, 37}: "Palo Alto Networks", + [3]byte{180, 14, 150}: "HERAN", + [3]byte{180, 14, 220}: "LG-Ericsson Co.,Ltd.", + [3]byte{180, 15, 59}: "Tenda Technology Co.,Ltd.Dongguan branch", + [3]byte{180, 20, 137}: "Cisco Systems, Inc", + [3]byte{180, 21, 19}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{180, 23, 128}: "DTI Group Ltd", + [3]byte{180, 24, 209}: "Apple, Inc.", + [3]byte{180, 29, 239}: "Internet Laboratories, Inc.", + [3]byte{180, 33, 29}: "Beijing GuangXin Technology Co., Ltd", + [3]byte{180, 33, 138}: "Dog Hunter LLC", + [3]byte{180, 36, 231}: "Codetek Technology Co.,Ltd", + [3]byte{180, 40, 241}: "E-Prime Co., Ltd.", + [3]byte{180, 41, 61}: "Shenzhen Urovo Technology Co.,Ltd.", + [3]byte{180, 42, 14}: "Technicolor CH USA Inc.", + [3]byte{180, 42, 57}: "ORBIT MERRET, spol. s r. o.", + [3]byte{180, 44, 146}: "Zhejiang Weirong Electronic Co., Ltd", + [3]byte{180, 44, 190}: "Direct Payment Solutions Limited", + [3]byte{180, 45, 86}: "Extreme Networks, Inc.", + [3]byte{180, 48, 82}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{180, 48, 192}: "York Instruments Ltd", + [3]byte{180, 49, 184}: "Aviwest", + [3]byte{180, 52, 108}: "MATSUNICHI DIGITAL TECHNOLOGY (HONG KONG) LIMITED", + [3]byte{180, 53, 100}: "Fujian Tian Cheng Electron Science & Technical Development Co.,Ltd.", + [3]byte{180, 53, 247}: "Zhejiang Pearmain Electronics Co.ltd.", + [3]byte{180, 54, 169}: "Fibocom Wireless Inc.", + [3]byte{180, 54, 227}: "KBVISION GROUP", + [3]byte{180, 55, 65}: "Consert, Inc.", + [3]byte{180, 55, 209}: "IEEE Registration Authority", + [3]byte{180, 57, 52}: "Pen Generations, Inc.", + [3]byte{180, 57, 214}: "ProCurve Networking by HP", + [3]byte{180, 58, 40}: "Samsung Electronics Co.,Ltd", + [3]byte{180, 61, 178}: "Degreane Horizon", + [3]byte{180, 62, 59}: "Viableware, Inc", + [3]byte{180, 65, 122}: "SHENZHEN GONGJIN ELECTRONICS CO.,LT", + [3]byte{180, 67, 13}: "Broadlink Pty Ltd", + [3]byte{180, 71, 94}: "Avaya Inc", + [3]byte{180, 75, 210}: "Apple, Inc.", + [3]byte{180, 76, 194}: "NR ELECTRIC CO., LTD", + [3]byte{180, 79, 150}: "Zhejiang Xinzailing Technology co., ltd", + [3]byte{180, 81, 249}: "NB Software", + [3]byte{180, 82, 83}: "Seagate Technology", + [3]byte{180, 82, 125}: "Sony Mobile Communications AB", + [3]byte{180, 82, 126}: "Sony Mobile Communications AB", + [3]byte{180, 85, 112}: "Borea", + [3]byte{180, 86, 185}: "Teraspek Technologies Co.,Ltd", + [3]byte{180, 88, 97}: "CRemote, LLC", + [3]byte{180, 92, 164}: "Thing-talk Wireless Communication Technologies Corporation Limited", + [3]byte{180, 93, 80}: "Aruba Networks", + [3]byte{180, 97, 255}: "Lumigon A/S", + [3]byte{180, 98, 56}: "Exablox", + [3]byte{180, 98, 147}: "Samsung Electronics Co.,Ltd", + [3]byte{180, 98, 173}: "Elysia Germany GmbH", + [3]byte{180, 102, 152}: "Zealabs srl", + [3]byte{180, 103, 233}: "Qingdao GoerTek Technology Co., Ltd.", + [3]byte{180, 109, 53}: "Dalian Seasky Automation Co;Ltd", + [3]byte{180, 109, 131}: "Intel Corporate", + [3]byte{180, 115, 86}: "Hangzhou Treebear Networking Co., Ltd.", + [3]byte{180, 116, 67}: "Samsung Electronics Co.,Ltd", + [3]byte{180, 116, 71}: "CoreOS", + [3]byte{180, 116, 159}: "ASKEY COMPUTER CORP", + [3]byte{180, 117, 14}: "Belkin International Inc.", + [3]byte{180, 121, 167}: "SAMSUNG ELECTRO-MECHANICS(THAILAND)", + [3]byte{180, 124, 41}: "Shenzhen Guzidi Technology Co.,Ltd", + [3]byte{180, 124, 156}: "Amazon Technologies Inc.", + [3]byte{180, 127, 94}: "Foresight Manufacture (S) Pte Ltd", + [3]byte{180, 130, 85}: "Research Products Corporation", + [3]byte{180, 130, 123}: "AKG Acoustics GmbH", + [3]byte{180, 130, 197}: "Relay2, Inc.", + [3]byte{180, 130, 254}: "ASKEY COMPUTER CORP", + [3]byte{180, 133, 71}: "Amptown System Company GmbH", + [3]byte{180, 137, 16}: "Coster T.E. S.P.A.", + [3]byte{180, 139, 25}: "Apple, Inc.", + [3]byte{180, 148, 78}: "WeTelecom Co., Ltd.", + [3]byte{180, 150, 145}: "Intel Corporate", + [3]byte{180, 152, 66}: "zte corporation", + [3]byte{180, 153, 76}: "Texas Instruments", + [3]byte{180, 153, 186}: "Hewlett Packard", + [3]byte{180, 156, 223}: "Apple, Inc.", + [3]byte{180, 157, 11}: "BQ", + [3]byte{180, 157, 180}: "Axion Technologies Inc.", + [3]byte{180, 158, 172}: "Imagik Int'l Corp", + [3]byte{180, 158, 230}: "SHENZHEN TECHNOLOGY CO LTD", + [3]byte{180, 163, 130}: "Hangzhou Hikvision Digital Technology Co.,Ltd.", + [3]byte{180, 164, 181}: "Zen Eye Co.,Ltd", + [3]byte{180, 164, 227}: "Cisco Systems, Inc", + [3]byte{180, 165, 169}: "MODI GmbH", + [3]byte{180, 165, 239}: "Sercomm Corporation.", + [3]byte{180, 168, 40}: "Shenzhen Concox Information Technology Co., Ltd", + [3]byte{180, 168, 43}: "Histar Digital Electronics Co., Ltd.", + [3]byte{180, 169, 90}: "Avaya Inc", + [3]byte{180, 169, 132}: "Symantec Corporation", + [3]byte{180, 169, 254}: "GHIA Technology (Shenzhen) LTD", + [3]byte{180, 170, 77}: "Ensequence, Inc.", + [3]byte{180, 171, 44}: "MtM Technology Corporation", + [3]byte{180, 174, 43}: "Microsoft", + [3]byte{180, 174, 111}: "Circle Reliance, Inc DBA Cranberry Networks", + [3]byte{180, 176, 23}: "Avaya Inc", + [3]byte{180, 177, 90}: "Siemens AG Energy Management Division", + [3]byte{180, 178, 101}: "DAEHO I&T", + [3]byte{180, 179, 98}: "zte corporation", + [3]byte{180, 179, 132}: "ShenZhen Figigantic Electronic Co.,Ltd", + [3]byte{180, 181, 47}: "Hewlett Packard", + [3]byte{180, 181, 66}: "Hubbell Power Systems, Inc.", + [3]byte{180, 181, 175}: "Minsung Electronics", + [3]byte{180, 182, 118}: "Intel Corporate", + [3]byte{180, 184, 89}: "Texa Spa", + [3]byte{180, 184, 141}: "Thuh Company", + [3]byte{180, 191, 246}: "Samsung Electronics Co.,Ltd", + [3]byte{180, 193, 112}: "Yi chip Microelectronics (Hangzhou) Co., Ltd", + [3]byte{180, 196, 78}: "VXL eTech Pvt Ltd", + [3]byte{180, 198, 248}: "Axilspot Communication", + [3]byte{180, 199, 153}: "Extreme Networks, Inc.", + [3]byte{180, 200, 16}: "UMPI Elettronica", + [3]byte{180, 204, 233}: "PROSYST", + [3]byte{180, 206, 246}: "HTC Corporation", + [3]byte{180, 207, 219}: "Shenzhen Jiuzhou Electric Co.,LTD", + [3]byte{180, 209, 53}: "Cloudistics", + [3]byte{180, 213, 189}: "Intel Corporate", + [3]byte{180, 214, 78}: "Caldero Limited", + [3]byte{180, 216, 169}: "BetterBots", + [3]byte{180, 216, 222}: "iota Computing, Inc.", + [3]byte{180, 221, 21}: "ControlThings Oy Ab", + [3]byte{180, 223, 59}: "Chromlech", + [3]byte{180, 223, 250}: "Litemax Electronics Inc.", + [3]byte{180, 224, 205}: "Fusion-io, Inc", + [3]byte{180, 225, 15}: "Dell Inc.", + [3]byte{180, 225, 196}: "Microsoft Mobile Oy", + [3]byte{180, 225, 235}: "Private", + [3]byte{180, 230, 42}: "LG Innotek", + [3]byte{180, 231, 130}: "Vivalnk", + [3]byte{180, 233, 176}: "Cisco Systems, Inc", + [3]byte{180, 237, 25}: "Pie Digital, Inc.", + [3]byte{180, 237, 84}: "Wohler Technologies", + [3]byte{180, 238, 180}: "ASKEY COMPUTER CORP", + [3]byte{180, 238, 212}: "Texas Instruments", + [3]byte{180, 239, 4}: "DAIHAN Scientific Co., Ltd.", + [3]byte{180, 239, 57}: "Samsung Electronics Co.,Ltd", + [3]byte{180, 239, 250}: "Lemobile Information Technology (Beijing) Co., Ltd.", + [3]byte{180, 240, 171}: "Apple, Inc.", + [3]byte{180, 241, 218}: "LG Electronics (Mobile Communications)", + [3]byte{180, 242, 232}: "ARRIS Group, Inc.", + [3]byte{180, 243, 35}: "PETATEL INC.", + [3]byte{180, 246, 28}: "Apple, Inc.", + [3]byte{180, 248, 30}: "Kinova", + [3]byte{180, 251, 228}: "Ubiquiti Networks Inc.", + [3]byte{180, 252, 117}: "SEMA Electronics(HK) CO.,LTD", + [3]byte{180, 254, 140}: "Centro Sicurezza Italia SpA", + [3]byte{184, 0, 24}: "Htel", + [3]byte{184, 3, 5}: "Intel Corporate", + [3]byte{184, 4, 21}: "Bayan Audio", + [3]byte{184, 5, 171}: "zte corporation", + [3]byte{184, 7, 22}: "vivo Mobile Communication Co., Ltd.", + [3]byte{184, 8, 207}: "Intel Corporate", + [3]byte{184, 8, 215}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{184, 9, 138}: "Apple, Inc.", + [3]byte{184, 11, 157}: "ROPEX Industrie-Elektronik GmbH", + [3]byte{184, 19, 233}: "Trace Live Network", + [3]byte{184, 20, 19}: "Keen High Holding(HK) Ltd.", + [3]byte{184, 22, 25}: "ARRIS Group, Inc.", + [3]byte{184, 22, 219}: "CHANT SINCERE CO.,LTD", + [3]byte{184, 23, 194}: "Apple, Inc.", + [3]byte{184, 24, 111}: "ORIENTAL MOTOR CO., LTD.", + [3]byte{184, 25, 153}: "Nesys", + [3]byte{184, 29, 170}: "LG Electronics (Mobile Communications)", + [3]byte{184, 32, 231}: "Guangzhou Horizontal Information & Network Integration Co. Ltd", + [3]byte{184, 34, 79}: "SICHUAN TIANYI COMHEART TELECOMCO., LTD", + [3]byte{184, 36, 16}: "Magneti Marelli Slovakia s.r.o.", + [3]byte{184, 36, 26}: "SWEDA INFORMATICA LTDA", + [3]byte{184, 36, 240}: "SOYO Technology Development Co., Ltd.", + [3]byte{184, 38, 108}: "ANOV France", + [3]byte{184, 38, 212}: "Furukawa Industrial S.A. Produtos Elétricos", + [3]byte{184, 39, 235}: "Raspberry Pi Foundation", + [3]byte{184, 40, 139}: "Parker Hannifin Manufacturing (UK) Ltd", + [3]byte{184, 41, 247}: "Blaster Tech", + [3]byte{184, 42, 114}: "Dell Inc.", + [3]byte{184, 42, 220}: "EFR Europäische Funk-Rundsteuerung GmbH", + [3]byte{184, 44, 160}: "Honeywell HomMed", + [3]byte{184, 48, 168}: "Road-Track Telematics Development", + [3]byte{184, 50, 65}: "Wuhan Tianyu Information Industry Co., Ltd.", + [3]byte{184, 54, 216}: "Videoswitch", + [3]byte{184, 55, 101}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{184, 56, 97}: "Cisco Systems, Inc", + [3]byte{184, 56, 202}: "Kyokko Tsushin System CO.,LTD", + [3]byte{184, 58, 8}: "Tenda Technology Co.,Ltd.Dongguan branch", + [3]byte{184, 58, 123}: "Worldplay (Canada) Inc.", + [3]byte{184, 58, 157}: "Alarm.com", + [3]byte{184, 61, 78}: "Shenzhen Cultraview Digital Technology Co.,Ltd Shanghai Branch", + [3]byte{184, 62, 89}: "Roku, Inc.", + [3]byte{184, 65, 95}: "ASP AG", + [3]byte{184, 67, 228}: "Vlatacom", + [3]byte{184, 68, 217}: "Apple, Inc.", + [3]byte{184, 71, 198}: "SanJet Technology Corp.", + [3]byte{184, 79, 213}: "Microsoft Corporation", + [3]byte{184, 80, 1}: "Extreme Networks, Inc.", + [3]byte{184, 83, 172}: "Apple, Inc.", + [3]byte{184, 85, 16}: "Zioncom Electronics (Shenzhen) Ltd.", + [3]byte{184, 86, 189}: "ITT LLC", + [3]byte{184, 87, 216}: "Samsung Electronics Co.,Ltd", + [3]byte{184, 88, 16}: "NUMERA, INC.", + [3]byte{184, 90, 115}: "Samsung Electronics Co.,Ltd", + [3]byte{184, 90, 247}: "Ouya, Inc", + [3]byte{184, 90, 254}: "Handaer Communication Technology (Beijing) Co., Ltd", + [3]byte{184, 94, 123}: "Samsung Electronics Co.,Ltd", + [3]byte{184, 96, 145}: "Onnet Technologies and Innovations LLC", + [3]byte{184, 97, 111}: "Accton Technology Corp", + [3]byte{184, 98, 31}: "Cisco Systems, Inc", + [3]byte{184, 99, 77}: "Apple, Inc.", + [3]byte{184, 99, 188}: "ROBOTIS, Co, Ltd", + [3]byte{184, 100, 145}: "CK Telecom Ltd", + [3]byte{184, 101, 59}: "Bolymin, Inc.", + [3]byte{184, 105, 194}: "Sunitec Enterprise Co., Ltd.", + [3]byte{184, 107, 35}: "Toshiba", + [3]byte{184, 108, 232}: "Samsung Electronics Co.,Ltd", + [3]byte{184, 112, 244}: "COMPAL INFORMATION (KUNSHAN) CO., LTD.", + [3]byte{184, 116, 36}: "Viessmann Elektronik GmbH", + [3]byte{184, 116, 71}: "Convergence Technologies", + [3]byte{184, 117, 192}: "PayPal, Inc.", + [3]byte{184, 118, 63}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{184, 119, 195}: "METER Group", + [3]byte{184, 120, 46}: "Apple, Inc.", + [3]byte{184, 120, 121}: "Roche Diagnostics GmbH", + [3]byte{184, 121, 126}: "Secure Meters (UK) Limited", + [3]byte{184, 122, 201}: "Siemens Ltd.", + [3]byte{184, 124, 242}: "Aerohive Networks Inc.", + [3]byte{184, 129, 152}: "Intel Corporate", + [3]byte{184, 134, 135}: "Liteon Technology Corporation", + [3]byte{184, 135, 30}: "Good Mind Industries Co., Ltd.", + [3]byte{184, 135, 168}: "Step Ahead Innovations Inc.", + [3]byte{184, 136, 227}: "COMPAL INFORMATION (KUNSHAN) CO., LTD.", + [3]byte{184, 137, 129}: "Chengdu InnoThings Technology Co., Ltd.", + [3]byte{184, 137, 202}: "ILJIN ELECTRIC Co., Ltd.", + [3]byte{184, 138, 96}: "Intel Corporate", + [3]byte{184, 141, 18}: "Apple, Inc.", + [3]byte{184, 142, 58}: "Infinite Technologies JLT", + [3]byte{184, 142, 198}: "Stateless Networks", + [3]byte{184, 142, 223}: "Zencheer Communication Technology Co., Ltd.", + [3]byte{184, 143, 20}: "Analytica GmbH", + [3]byte{184, 146, 29}: "BG T&A", + [3]byte{184, 148, 210}: "Retail Innovation HTT AB", + [3]byte{184, 150, 116}: "AllDSP GmbH & Co. KG", + [3]byte{184, 151, 90}: "BIOSTAR Microtech Int'l Corp.", + [3]byte{184, 152, 176}: "Atlona Inc.", + [3]byte{184, 152, 247}: "Gionee Communication Equipment Co,Ltd.ShenZhen", + [3]byte{184, 153, 25}: "7signal Solutions, Inc", + [3]byte{184, 153, 176}: "Cohere Technologies", + [3]byte{184, 154, 205}: "ELITE OPTOELECTRONIC(ASIA)CO.,LTD", + [3]byte{184, 154, 237}: "OceanServer Technology, Inc", + [3]byte{184, 155, 201}: "SMC Networks Inc", + [3]byte{184, 155, 228}: "ABB Power Systems Power Generation", + [3]byte{184, 161, 117}: "Roku, Inc.", + [3]byte{184, 163, 134}: "D-Link International", + [3]byte{184, 163, 224}: "BenRui Technology Co.,Ltd", + [3]byte{184, 168, 175}: "Logic S.p.A.", + [3]byte{184, 172, 111}: "Dell Inc.", + [3]byte{184, 173, 62}: "BLUECOM", + [3]byte{184, 174, 110}: "Nintendo Co., Ltd.", + [3]byte{184, 174, 237}: "Elitegroup Computer Systems Co.,Ltd.", + [3]byte{184, 175, 103}: "Hewlett Packard", + [3]byte{184, 177, 199}: "BT&COM CO.,LTD", + [3]byte{184, 178, 235}: "Googol Technology (HK) Limited", + [3]byte{184, 179, 220}: "DEREK (SHAOGUAN) LIMITED", + [3]byte{184, 180, 46}: "Gionee Communication Equipment Co,Ltd.ShenZhen", + [3]byte{184, 183, 215}: "2GIG Technologies", + [3]byte{184, 184, 30}: "Intel Corporate", + [3]byte{184, 185, 78}: "Shenzhen iBaby Labs, Inc.", + [3]byte{184, 186, 104}: "Xi'an Jizhong Digital Communication Co.,Ltd", + [3]byte{184, 186, 114}: "Cynove", + [3]byte{184, 187, 35}: "Guangdong Nufront CSC Co., Ltd", + [3]byte{184, 187, 109}: "ENERES Co.,Ltd.", + [3]byte{184, 187, 175}: "Samsung Electronics Co.,Ltd", + [3]byte{184, 188, 27}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{184, 189, 121}: "TrendPoint Systems", + [3]byte{184, 190, 191}: "Cisco Systems, Inc", + [3]byte{184, 191, 131}: "Intel Corporate", + [3]byte{184, 193, 17}: "Apple, Inc.", + [3]byte{184, 193, 162}: "Dragon Path Technologies Co., Limited", + [3]byte{184, 195, 191}: "Henan Chengshi NetWork Technology Co.,Ltd", + [3]byte{184, 196, 111}: "PRIMMCON INDUSTRIES INC", + [3]byte{184, 198, 142}: "Samsung Electronics Co.,Ltd", + [3]byte{184, 199, 22}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{184, 199, 93}: "Apple, Inc.", + [3]byte{184, 200, 85}: "Shanghai GBCOM Communication Technology Co.,Ltd.", + [3]byte{184, 200, 235}: "ITEL MOBILE LIMITED", + [3]byte{184, 202, 4}: "Holtek Semiconductor Inc.", + [3]byte{184, 202, 58}: "Dell Inc.", + [3]byte{184, 205, 147}: "Penetek, Inc", + [3]byte{184, 205, 167}: "Maxeler Technologies Ltd.", + [3]byte{184, 208, 111}: "GUANGZHOU HKUST FOK YING TUNG RESEARCH INSTITUTE", + [3]byte{184, 212, 157}: "M Seven System Ltd.", + [3]byte{184, 213, 11}: "Sunitec Enterprise Co.,Ltd", + [3]byte{184, 215, 175}: "Murata Manufacturing Co., Ltd.", + [3]byte{184, 216, 18}: "IEEE Registration Authority", + [3]byte{184, 217, 77}: "Sagemcom Broadband SAS", + [3]byte{184, 217, 206}: "Samsung Electronics Co.,Ltd", + [3]byte{184, 218, 241}: "Strahlenschutz- Entwicklungs- und Ausruestungsgesellschaft mbH", + [3]byte{184, 218, 247}: "Advanced Photonics, Inc.", + [3]byte{184, 219, 28}: "Integrated Device Technology (Malaysia) Sdn. Bhd.", + [3]byte{184, 220, 135}: "IAI Corporation", + [3]byte{184, 223, 107}: "SpotCam Co., Ltd.", + [3]byte{184, 229, 137}: "Payter BV", + [3]byte{184, 230, 37}: "2Wire Inc", + [3]byte{184, 231, 121}: "9Solutions Oy", + [3]byte{184, 232, 86}: "Apple, Inc.", + [3]byte{184, 233, 55}: "Sonos, Inc.", + [3]byte{184, 234, 170}: "ICG NETWORKS CO.,ltd", + [3]byte{184, 236, 163}: "Zyxel Communications Corporation", + [3]byte{184, 238, 14}: "Sagemcom Broadband SAS", + [3]byte{184, 238, 101}: "Liteon Technology Corporation", + [3]byte{184, 238, 121}: "YWire Technologies, Inc.", + [3]byte{184, 240, 128}: "SPS, INC.", + [3]byte{184, 243, 23}: "iSun Smasher Communications Private Limited", + [3]byte{184, 244, 208}: "Herrmann Ultraschalltechnik GmbH & Co. Kg", + [3]byte{184, 245, 231}: "WayTools, LLC", + [3]byte{184, 246, 177}: "Apple, Inc.", + [3]byte{184, 247, 50}: "Aryaka Networks Inc", + [3]byte{184, 247, 74}: "RCNTEC", + [3]byte{184, 248, 40}: "Changshu Gaoshida Optoelectronic Technology Co. Ltd.", + [3]byte{184, 248, 131}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{184, 248, 190}: "BLUECOM", + [3]byte{184, 249, 52}: "Sony Mobile Communications AB", + [3]byte{184, 252, 154}: "Le Shi Zhi Xin Electronic Technology (Tianjin) Limited", + [3]byte{184, 253, 50}: "Zhejiang ROICX Microelectronics", + [3]byte{184, 255, 97}: "Apple, Inc.", + [3]byte{184, 255, 111}: "Shanghai Typrotech Technology Co.Ltd", + [3]byte{184, 255, 179}: "MitraStar Technology Corp.", + [3]byte{184, 255, 254}: "Texas Instruments", + [3]byte{188, 2, 0}: "Stewart Audio", + [3]byte{188, 2, 74}: "HMD Global Oy", + [3]byte{188, 5, 67}: "AVM GmbH", + [3]byte{188, 13, 165}: "Texas Instruments", + [3]byte{188, 15, 43}: "FORTUNE TECHGROUP CO.,LTD", + [3]byte{188, 15, 100}: "Intel Corporate", + [3]byte{188, 18, 94}: "Beijing WisVideo INC.", + [3]byte{188, 20, 1}: "Hitron Technologies. Inc", + [3]byte{188, 20, 133}: "Samsung Electronics Co.,Ltd", + [3]byte{188, 20, 239}: "ITON Technology Limited", + [3]byte{188, 21, 166}: "Taiwan Jantek Electronics,Ltd.", + [3]byte{188, 21, 172}: "Vodafone Italia S.p.A.", + [3]byte{188, 22, 101}: "Cisco Systems, Inc", + [3]byte{188, 22, 245}: "Cisco Systems, Inc", + [3]byte{188, 26, 103}: "YF Technology Co., Ltd", + [3]byte{188, 28, 129}: "Sichuan iLink Technology Co., Ltd.", + [3]byte{188, 32, 164}: "Samsung Electronics Co.,Ltd", + [3]byte{188, 32, 186}: "Inspur (Shandong) Electronic Information Co., Ltd", + [3]byte{188, 37, 224}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{188, 37, 240}: "3D Display Technologies Co., Ltd.", + [3]byte{188, 38, 29}: "HONG KONG TECON TECHNOLOGY", + [3]byte{188, 40, 44}: "e-Smart Systems Pvt. Ltd", + [3]byte{188, 40, 70}: "NextBIT Computing Pvt. Ltd.", + [3]byte{188, 40, 214}: "Rowley Associates Limited", + [3]byte{188, 43, 107}: "Beijing Haier IC Design Co.,Ltd", + [3]byte{188, 43, 215}: "Revogi Innovation Co., Ltd.", + [3]byte{188, 44, 85}: "Bear Flag Design, Inc.", + [3]byte{188, 45, 152}: "ThinGlobal LLC", + [3]byte{188, 46, 72}: "ARRIS Group, Inc.", + [3]byte{188, 47, 61}: "vivo Mobile Communication Co., Ltd.", + [3]byte{188, 48, 91}: "Dell Inc.", + [3]byte{188, 48, 125}: "Wistron Neweb Corporation", + [3]byte{188, 48, 126}: "Wistron Neweb Corporation", + [3]byte{188, 52, 0}: "IEEE Registration Authority", + [3]byte{188, 53, 229}: "Hydro Systems Company", + [3]byte{188, 56, 210}: "Pandachip Limited", + [3]byte{188, 57, 166}: "CSUN System Technology Co.,LTD", + [3]byte{188, 57, 217}: "Z-TEC", + [3]byte{188, 58, 234}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{188, 59, 175}: "Apple, Inc.", + [3]byte{188, 61, 133}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{188, 62, 19}: "Accordance Systems Inc.", + [3]byte{188, 63, 143}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{188, 65, 0}: "CODACO ELECTRONIC s.r.o.", + [3]byte{188, 65, 1}: "Shenzhen TINNO Mobile Technology Corp.", + [3]byte{188, 67, 119}: "Hang Zhou Huite Technology Co.,ltd.", + [3]byte{188, 68, 52}: "Shenzhen TINNO Mobile Technology Corp.", + [3]byte{188, 68, 134}: "Samsung Electronics Co.,Ltd", + [3]byte{188, 68, 176}: "Elastifile", + [3]byte{188, 69, 46}: "Knowledge Development for POF S.L.", + [3]byte{188, 70, 153}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{188, 71, 96}: "Samsung Electronics Co.,Ltd", + [3]byte{188, 75, 121}: "SensingTek", + [3]byte{188, 76, 196}: "Apple, Inc.", + [3]byte{188, 77, 251}: "Hitron Technologies. Inc", + [3]byte{188, 78, 60}: "CORE STAFF CO., LTD.", + [3]byte{188, 78, 93}: "ZhongMiao Technology Co., Ltd.", + [3]byte{188, 81, 254}: "Swann communications Pty Ltd", + [3]byte{188, 82, 180}: "Nokia", + [3]byte{188, 82, 183}: "Apple, Inc.", + [3]byte{188, 84, 54}: "Apple, Inc.", + [3]byte{188, 84, 81}: "Samsung Electronics Co.,Ltd", + [3]byte{188, 84, 249}: "Drogoo Technology Co., Ltd.", + [3]byte{188, 84, 252}: "SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.", + [3]byte{188, 92, 76}: "ELECOM CO.,LTD.", + [3]byte{188, 95, 244}: "ASRock Incorporation", + [3]byte{188, 95, 246}: "SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.", + [3]byte{188, 96, 16}: "Qingdao Hisense Communications Co.,Ltd.", + [3]byte{188, 96, 167}: "Sony Interactive Entertainment Inc.", + [3]byte{188, 98, 14}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{188, 98, 159}: "Telenet Systems P. Ltd.", + [3]byte{188, 100, 75}: "ARRIS Group, Inc.", + [3]byte{188, 102, 65}: "IEEE Registration Authority", + [3]byte{188, 102, 222}: "Shadow Creator Information Technology Co.,Ltd.", + [3]byte{188, 103, 28}: "Cisco Systems, Inc", + [3]byte{188, 103, 120}: "Apple, Inc.", + [3]byte{188, 103, 132}: "Environics Oy", + [3]byte{188, 106, 22}: "tdvine", + [3]byte{188, 106, 41}: "Texas Instruments", + [3]byte{188, 106, 47}: "Henge Docks LLC", + [3]byte{188, 106, 68}: "Commend International GmbH", + [3]byte{188, 107, 77}: "Nokia", + [3]byte{188, 108, 33}: "Apple, Inc.", + [3]byte{188, 110, 100}: "Sony Mobile Communications AB", + [3]byte{188, 110, 118}: "Green Energy Options Ltd", + [3]byte{188, 113, 193}: "XTrillion, Inc.", + [3]byte{188, 114, 177}: "Samsung Electronics Co.,Ltd", + [3]byte{188, 116, 215}: "HangZhou JuRu Technology CO.,LTD", + [3]byte{188, 117, 116}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{188, 118, 78}: "Rackspace US, Inc.", + [3]byte{188, 118, 94}: "Samsung Electronics Co.,Ltd", + [3]byte{188, 118, 112}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{188, 119, 55}: "Intel Corporate", + [3]byte{188, 119, 159}: "SBM Co., Ltd.", + [3]byte{188, 121, 173}: "Samsung Electronics Co.,Ltd", + [3]byte{188, 125, 209}: "Radio Data Comms", + [3]byte{188, 129, 31}: "Ingate Systems", + [3]byte{188, 129, 153}: "BASIC Co.,Ltd.", + [3]byte{188, 130, 93}: "MITSUMI ELECTRIC CO.,LTD.", + [3]byte{188, 131, 133}: "Microsoft Corporation", + [3]byte{188, 131, 167}: "SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD", + [3]byte{188, 133, 31}: "Samsung Electronics Co.,Ltd", + [3]byte{188, 133, 86}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{188, 136, 147}: "VILLBAU Ltd.", + [3]byte{188, 136, 195}: "Ningbo Dooya Mechanic & Electronic Technology Co., Ltd", + [3]byte{188, 138, 163}: "NHN Entertainment", + [3]byte{188, 138, 232}: "QING DAO HAIER TELECOM CO.,LTD.", + [3]byte{188, 139, 85}: "NPP ELIKS America Inc. DBA T&M Atlantic", + [3]byte{188, 140, 205}: "SAMSUNG ELECTRO-MECHANICS(THAILAND)", + [3]byte{188, 141, 14}: "Nokia", + [3]byte{188, 144, 58}: "Robert Bosch GmbH", + [3]byte{188, 145, 181}: "Infinix mobility limited", + [3]byte{188, 146, 107}: "Apple, Inc.", + [3]byte{188, 150, 128}: "SHENZHEN GONGJIN ELECTRONICS CO.,LT", + [3]byte{188, 152, 137}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{188, 153, 188}: "FonSee Technology Inc.", + [3]byte{188, 156, 49}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{188, 156, 197}: "Beijing Huafei Technology Co., Ltd.", + [3]byte{188, 157, 165}: "DASCOM Europe GmbH", + [3]byte{188, 159, 239}: "Apple, Inc.", + [3]byte{188, 160, 66}: "SHANGHAI FLYCO ELECTRICAL APPLIANCE CO.,LTD", + [3]byte{188, 164, 225}: "Nabto", + [3]byte{188, 168, 166}: "Intel Corporate", + [3]byte{188, 169, 32}: "Apple, Inc.", + [3]byte{188, 169, 214}: "Cyber-Rain, Inc.", + [3]byte{188, 173, 40}: "Hangzhou Hikvision Digital Technology Co.,Ltd.", + [3]byte{188, 173, 171}: "Avaya Inc", + [3]byte{188, 174, 197}: "ASUSTek COMPUTER INC.", + [3]byte{188, 177, 129}: "SHARP CORPORATION", + [3]byte{188, 177, 243}: "Samsung Electronics Co.,Ltd", + [3]byte{188, 179, 8}: "HONGKONG RAGENTEK COMMUNICATION TECHNOLOGY CO.,LIMITED", + [3]byte{188, 184, 82}: "Cybera, Inc.", + [3]byte{188, 186, 225}: "AREC Inc.", + [3]byte{188, 187, 201}: "Kellendonk Elektronik GmbH", + [3]byte{188, 188, 70}: "SKS Welding Systems GmbH", + [3]byte{188, 192, 15}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{188, 193, 104}: "DinBox Sverige AB", + [3]byte{188, 194, 58}: "Thomson Video Networks", + [3]byte{188, 195, 27}: "Kygo Life AS", + [3]byte{188, 195, 66}: "Panasonic Communications Co., Ltd.", + [3]byte{188, 196, 147}: "Cisco Systems, Inc", + [3]byte{188, 198, 26}: "SPECTRA EMBEDDED SYSTEMS", + [3]byte{188, 198, 219}: "Nokia Corporation", + [3]byte{188, 200, 16}: "Cisco SPVTG", + [3]byte{188, 202, 181}: "ARRIS Group, Inc.", + [3]byte{188, 205, 69}: "VOISMART", + [3]byte{188, 207, 204}: "HTC Corporation", + [3]byte{188, 209, 31}: "Samsung Electronics Co.,Ltd", + [3]byte{188, 209, 101}: "Cisco SPVTG", + [3]byte{188, 209, 119}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{188, 209, 211}: "Shenzhen TINNO Mobile Technology Corp.", + [3]byte{188, 213, 182}: "d2d technologies", + [3]byte{188, 215, 19}: "Owl Labs", + [3]byte{188, 217, 64}: "ASR Co,.Ltd.", + [3]byte{188, 224, 157}: "Eoslink", + [3]byte{188, 229, 159}: "WATERWORLD Technology Co.,LTD", + [3]byte{188, 230, 63}: "Samsung Electronics Co.,Ltd", + [3]byte{188, 231, 103}: "Quanzhou TDX Electronics Co., Ltd", + [3]byte{188, 234, 43}: "CityCom GmbH", + [3]byte{188, 234, 250}: "Hewlett Packard", + [3]byte{188, 235, 95}: "Fujian Beifeng Telecom Technology Co., Ltd.", + [3]byte{188, 236, 35}: "SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD", + [3]byte{188, 236, 93}: "Apple, Inc.", + [3]byte{188, 238, 123}: "ASUSTek COMPUTER INC.", + [3]byte{188, 241, 242}: "Cisco Systems, Inc", + [3]byte{188, 242, 146}: "PLANTRONICS, INC.", + [3]byte{188, 242, 175}: "devolo AG", + [3]byte{188, 245, 172}: "LG Electronics (Mobile Communications)", + [3]byte{188, 246, 28}: "Geomodeling Wuxi Technology Co. Ltd.", + [3]byte{188, 246, 133}: "D-Link International", + [3]byte{188, 248, 17}: "Xiamen DNAKE Technology Co.,Ltd", + [3]byte{188, 254, 140}: "Altronic, LLC", + [3]byte{188, 255, 172}: "TOPCON CORPORATION", + [3]byte{188, 255, 235}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{192, 2, 141}: "WINSTAR Display CO.,Ltd", + [3]byte{192, 5, 194}: "ARRIS Group, Inc.", + [3]byte{192, 13, 126}: "Additech, Inc.", + [3]byte{192, 17, 115}: "Samsung Electronics Co.,Ltd", + [3]byte{192, 17, 166}: "Fort-Telecom ltd.", + [3]byte{192, 18, 66}: "Alpha Security Products", + [3]byte{192, 20, 61}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{192, 23, 77}: "Samsung Electronics Co.,Ltd", + [3]byte{192, 24, 133}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{192, 26, 218}: "Apple, Inc.", + [3]byte{192, 30, 155}: "Pixavi AS", + [3]byte{192, 33, 13}: "SHENZHEN RF-LINK TECHNOLOGY CO.,LTD.", + [3]byte{192, 34, 80}: "Private", + [3]byte{192, 37, 6}: "AVM GmbH", + [3]byte{192, 37, 92}: "Cisco Systems, Inc", + [3]byte{192, 37, 103}: "Nexxt Solutions", + [3]byte{192, 37, 162}: "NEC Platforms, Ltd.", + [3]byte{192, 37, 233}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{192, 39, 185}: "Beijing National Railway Research & Design Institute of Signal & Communication Co., Ltd.", + [3]byte{192, 40, 141}: "Logitech, Inc", + [3]byte{192, 41, 115}: "Audyssey Laboratories Inc.", + [3]byte{192, 41, 243}: "XySystem", + [3]byte{192, 43, 252}: "iNES. applied informatics GmbH", + [3]byte{192, 44, 122}: "Shenzhen Horn Audio Co.,Ltd.", + [3]byte{192, 45, 238}: "Cuff", + [3]byte{192, 47, 241}: "Volta Networks", + [3]byte{192, 51, 94}: "Microsoft", + [3]byte{192, 52, 180}: "Gigastone Corporation", + [3]byte{192, 53, 128}: "A&R TECH", + [3]byte{192, 53, 189}: "Velocytech Aps", + [3]byte{192, 53, 197}: "Prosoft Systems LTD", + [3]byte{192, 56, 150}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{192, 56, 249}: "Nokia Danmark A/S", + [3]byte{192, 59, 143}: "Minicom Digital Signage", + [3]byte{192, 61, 70}: "Shanghai Sango Network Technology Co.,Ltd", + [3]byte{192, 62, 15}: "BSkyB Ltd", + [3]byte{192, 63, 14}: "NETGEAR", + [3]byte{192, 63, 42}: "Biscotti, Inc.", + [3]byte{192, 63, 213}: "Elitegroup Computer Systems Co.,Ltd.", + [3]byte{192, 65, 246}: "LG ELECTRONICS INC", + [3]byte{192, 67, 1}: "Epec Oy", + [3]byte{192, 68, 227}: "Shenzhen Sinkna Electronics Co., LTD", + [3]byte{192, 73, 61}: "MAITRISE TECHNOLOGIQUE", + [3]byte{192, 74, 0}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{192, 74, 9}: "Zhejiang Everbright Communication Equip. Co,. Ltd", + [3]byte{192, 77, 247}: "SERELEC", + [3]byte{192, 86, 39}: "Belkin International Inc.", + [3]byte{192, 86, 227}: "Hangzhou Hikvision Digital Technology Co.,Ltd.", + [3]byte{192, 87, 188}: "Avaya Inc", + [3]byte{192, 88, 167}: "Pico Systems Co., Ltd.", + [3]byte{192, 94, 111}: "V. Stonkaus firma Kodinis Raktas", + [3]byte{192, 94, 121}: "SHENZHEN HUAXUN ARK TECHNOLOGIES CO.,LTD", + [3]byte{192, 97, 24}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{192, 98, 107}: "Cisco Systems, Inc", + [3]byte{192, 99, 148}: "Apple, Inc.", + [3]byte{192, 100, 198}: "Nokia Corporation", + [3]byte{192, 101, 153}: "Samsung Electronics Co.,Ltd", + [3]byte{192, 103, 175}: "Cisco Systems, Inc", + [3]byte{192, 108, 15}: "Dobbs Stanford", + [3]byte{192, 108, 109}: "MagneMotion, Inc.", + [3]byte{192, 109, 26}: "Tianjin Henxinhuifeng Technology Co.,Ltd.", + [3]byte{192, 112, 9}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{192, 116, 43}: "SHENZHEN XUNLONG SOFTWARE CO.,LIMITED", + [3]byte{192, 123, 188}: "Cisco Systems, Inc", + [3]byte{192, 124, 209}: "PEGATRON CORPORATION", + [3]byte{192, 126, 64}: "SHENZHEN XDK COMMUNICATION EQUIPMENT CO.,LTD", + [3]byte{192, 129, 112}: "Effigis GeoSolutions", + [3]byte{192, 131, 10}: "2Wire Inc", + [3]byte{192, 132, 122}: "Apple, Inc.", + [3]byte{192, 132, 136}: "Finis Inc", + [3]byte{192, 133, 76}: "Ragentek Technology Group", + [3]byte{192, 135, 235}: "Samsung Electronics Co.,Ltd", + [3]byte{192, 136, 91}: "SnD Tech Co., Ltd.", + [3]byte{192, 137, 151}: "Samsung Electronics Co.,Ltd", + [3]byte{192, 138, 222}: "Ruckus Wireless", + [3]byte{192, 139, 111}: "S I Sistemas Inteligentes Eletrônicos Ltda", + [3]byte{192, 140, 96}: "Cisco Systems, Inc", + [3]byte{192, 145, 50}: "Patriot Memory", + [3]byte{192, 145, 52}: "ProCurve Networking by HP", + [3]byte{192, 151, 39}: "SAMSUNG ELECTRO-MECHANICS(THAILAND)", + [3]byte{192, 152, 121}: "Acer Inc.", + [3]byte{192, 152, 229}: "University of Michigan", + [3]byte{192, 154, 113}: "XIAMEN MEITU MOBILE TECHNOLOGY CO.LTD", + [3]byte{192, 156, 4}: "Shaanxi GuoLian Digital TV Technology Co.,Ltd.", + [3]byte{192, 156, 146}: "COBY", + [3]byte{192, 157, 38}: "Topicon HK Lmd.", + [3]byte{192, 159, 5}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{192, 159, 66}: "Apple, Inc.", + [3]byte{192, 160, 13}: "ARRIS Group, Inc.", + [3]byte{192, 160, 187}: "D-Link International", + [3]byte{192, 160, 199}: "FAIRFIELD INDUSTRIES", + [3]byte{192, 160, 222}: "Multi Touch Oy", + [3]byte{192, 160, 226}: "Eden Innovations", + [3]byte{192, 161, 162}: "MarqMetrix", + [3]byte{192, 162, 109}: "Abbott Point of Care", + [3]byte{192, 163, 100}: "3D Systems Massachusetts", + [3]byte{192, 163, 158}: "EarthCam, Inc.", + [3]byte{192, 165, 62}: "Apple, Inc.", + [3]byte{192, 165, 221}: "SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.", + [3]byte{192, 170, 104}: "OSASI Technos Inc.", + [3]byte{192, 172, 84}: "Sagemcom Broadband SAS", + [3]byte{192, 179, 57}: "Comigo Ltd.", + [3]byte{192, 179, 87}: "Yoshiki Electronics Industry Ltd.", + [3]byte{192, 183, 19}: "Beijing Xiaoyuer Technology Co. Ltd.", + [3]byte{192, 184, 177}: "BitBox Ltd", + [3]byte{192, 186, 230}: "Application Solutions (Electronics and Vision) Ltd", + [3]byte{192, 189, 66}: "ZPA Smart Energy a.s.", + [3]byte{192, 189, 209}: "SAMSUNG ELECTRO-MECHANICS(THAILAND)", + [3]byte{192, 191, 192}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{192, 193, 192}: "Cisco-Linksys, LLC", + [3]byte{192, 195, 182}: "Automatic Systems", + [3]byte{192, 197, 32}: "Ruckus Wireless", + [3]byte{192, 197, 34}: "ARRIS Group, Inc.", + [3]byte{192, 197, 105}: "SHANGHAI LYNUC CNC TECHNOLOGY CO.,LTD", + [3]byte{192, 198, 135}: "Cisco SPVTG", + [3]byte{192, 201, 70}: "MITSUYA LABORATORIES INC.", + [3]byte{192, 201, 118}: "Shenzhen TINNO Mobile Technology Corp.", + [3]byte{192, 203, 56}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{192, 204, 248}: "Apple, Inc.", + [3]byte{192, 206, 205}: "Apple, Inc.", + [3]byte{192, 207, 163}: "Creative Electronics & Software, Inc.", + [3]byte{192, 208, 18}: "Apple, Inc.", + [3]byte{192, 208, 68}: "Sagemcom Broadband SAS", + [3]byte{192, 211, 145}: "IEEE Registration Authority", + [3]byte{192, 211, 192}: "Samsung Electronics Co.,Ltd", + [3]byte{192, 217, 98}: "ASKEY COMPUTER CORP", + [3]byte{192, 217, 247}: "ShanDong Domor Intelligent S&T CO.,Ltd", + [3]byte{192, 218, 116}: "Hangzhou Sunyard Technology Co., Ltd.", + [3]byte{192, 220, 106}: "Qingdao Eastsoft Communication Technology Co.,LTD", + [3]byte{192, 223, 119}: "Conrad Electronic SE", + [3]byte{192, 228, 34}: "Texas Instruments", + [3]byte{192, 228, 45}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{192, 229, 78}: "ARIES Embedded GmbH", + [3]byte{192, 234, 228}: "Sonicwall", + [3]byte{192, 238, 64}: "Laird Technologies", + [3]byte{192, 238, 251}: "OnePlus Tech (Shenzhen) Ltd", + [3]byte{192, 241, 196}: "Pacidal Corporation Ltd.", + [3]byte{192, 242, 251}: "Apple, Inc.", + [3]byte{192, 246, 54}: "Hangzhou Kuaiyue Technologies, Ltd.", + [3]byte{192, 247, 157}: "Powercode", + [3]byte{192, 248, 218}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{192, 249, 69}: "Toshiba Toko Meter Systems Co., LTD.", + [3]byte{192, 249, 145}: "GME Standard Communications P/L", + [3]byte{192, 255, 212}: "NETGEAR", + [3]byte{196, 0, 6}: "Lipi Data Systems Ltd.", + [3]byte{196, 0, 73}: "Kamama", + [3]byte{196, 1, 66}: "MaxMedia Technology Limited", + [3]byte{196, 1, 124}: "Ruckus Wireless", + [3]byte{196, 1, 177}: "SeekTech INC", + [3]byte{196, 1, 206}: "PRESITION (2000) CO., LTD.", + [3]byte{196, 4, 21}: "NETGEAR", + [3]byte{196, 4, 123}: "Shenzhen YOUHUA Technology Co., Ltd", + [3]byte{196, 5, 40}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{196, 7, 47}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{196, 8, 74}: "Nokia", + [3]byte{196, 8, 128}: "Shenzhen UTEPO Tech Co., Ltd.", + [3]byte{196, 9, 56}: "FUJIAN STAR-NET COMMUNICATION CO.,LTD", + [3]byte{196, 10, 203}: "Cisco Systems, Inc", + [3]byte{196, 11, 203}: "Xiaomi Communications Co Ltd", + [3]byte{196, 14, 69}: "ACK Networks,Inc.", + [3]byte{196, 15, 9}: "Hermes electronic GmbH", + [3]byte{196, 16, 138}: "Ruckus Wireless", + [3]byte{196, 17, 224}: "Bull Group Co., Ltd", + [3]byte{196, 18, 245}: "D-Link International", + [3]byte{196, 19, 226}: "Aerohive Networks Inc.", + [3]byte{196, 20, 60}: "Cisco Systems, Inc", + [3]byte{196, 22, 250}: "Prysm Inc", + [3]byte{196, 23, 254}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{196, 25, 139}: "Dominion Voting Systems Corporation", + [3]byte{196, 25, 236}: "Qualisys AB", + [3]byte{196, 28, 255}: "Vizio, Inc", + [3]byte{196, 30, 206}: "HMI Sources Ltd.", + [3]byte{196, 33, 200}: "KYOCERA CORPORATION", + [3]byte{196, 35, 122}: "WhizNets Inc.", + [3]byte{196, 36, 46}: "Galvanic Applied Sciences Inc", + [3]byte{196, 38, 40}: "Airo Wireless", + [3]byte{196, 39, 149}: "Technicolor CH USA Inc.", + [3]byte{196, 40, 45}: "Embedded Intellect Pty Ltd", + [3]byte{196, 41, 29}: "KLEMSAN ELEKTRIK ELEKTRONIK SAN.VE TIC.AS.", + [3]byte{196, 44, 3}: "Apple, Inc.", + [3]byte{196, 47, 144}: "Hangzhou Hikvision Digital Technology Co.,Ltd.", + [3]byte{196, 48, 24}: "MCS Logic Inc.", + [3]byte{196, 52, 107}: "Hewlett Packard", + [3]byte{196, 54, 85}: "Shenzhen Fenglian Technology Co., Ltd.", + [3]byte{196, 54, 108}: "LG Innotek", + [3]byte{196, 54, 218}: "Rusteletech Ltd.", + [3]byte{196, 56, 211}: "TAGATEC CO.,LTD", + [3]byte{196, 57, 58}: "SMC Networks Inc", + [3]byte{196, 58, 159}: "Siconix Inc.", + [3]byte{196, 58, 190}: "Sony Mobile Communications AB", + [3]byte{196, 60, 60}: "CYBELEC SA", + [3]byte{196, 61, 199}: "NETGEAR", + [3]byte{196, 64, 68}: "RackTop Systems Inc.", + [3]byte{196, 66, 2}: "Samsung Electronics Co.,Ltd", + [3]byte{196, 67, 143}: "LG Electronics (Mobile Communications)", + [3]byte{196, 68, 160}: "Cisco Systems, Inc", + [3]byte{196, 69, 103}: "SAMBON PRECISON and ELECTRONICS", + [3]byte{196, 69, 236}: "Shanghai Yali Electron Co.,LTD", + [3]byte{196, 70, 25}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{196, 71, 63}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{196, 72, 56}: "Satcom Direct, Inc.", + [3]byte{196, 73, 187}: "MITSUMI ELECTRIC CO.,LTD.", + [3]byte{196, 74, 208}: "FIREFLIES SYSTEMS", + [3]byte{196, 75, 68}: "Omniprint Inc.", + [3]byte{196, 75, 209}: "Wallys Communications Teachnologies Co.,Ltd.", + [3]byte{196, 78, 31}: "BlueN", + [3]byte{196, 78, 172}: "Shenzhen Shiningworth Technology Co., Ltd.", + [3]byte{196, 80, 6}: "Samsung Electronics Co.,Ltd", + [3]byte{196, 84, 68}: "QUANTA COMPUTER INC.", + [3]byte{196, 85, 166}: "Cadac Holdings Ltd", + [3]byte{196, 85, 194}: "Bach-Simpson", + [3]byte{196, 86, 0}: "Galleon Embedded Computing", + [3]byte{196, 86, 254}: "Lava International Ltd.", + [3]byte{196, 87, 31}: "June Life Inc", + [3]byte{196, 87, 110}: "Samsung Electronics Co.,Ltd", + [3]byte{196, 88, 194}: "Shenzhen TATFOOK Technology Co., Ltd.", + [3]byte{196, 89, 118}: "Fugoo Coorporation", + [3]byte{196, 93, 216}: "HDMI Forum", + [3]byte{196, 96, 68}: "Everex Electronics Limited", + [3]byte{196, 98, 107}: "ZPT Vigantice", + [3]byte{196, 98, 234}: "Samsung Electronics Co.,Ltd", + [3]byte{196, 99, 84}: "U-Raku, Inc.", + [3]byte{196, 100, 19}: "Cisco Systems, Inc", + [3]byte{196, 102, 153}: "vivo Mobile Communication Co., Ltd.", + [3]byte{196, 103, 181}: "Libratone A/S", + [3]byte{196, 104, 208}: "VTech Telecommunications Ltd.", + [3]byte{196, 105, 62}: "Turbulence Design Inc.", + [3]byte{196, 106, 183}: "Xiaomi Communications Co Ltd", + [3]byte{196, 107, 180}: "myIDkey", + [3]byte{196, 109, 241}: "DataGravity", + [3]byte{196, 110, 31}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{196, 112, 11}: "GUANGZHOU CHIP TECHNOLOGIES CO.,LTD", + [3]byte{196, 113, 48}: "Fon Technology S.L.", + [3]byte{196, 113, 84}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{196, 113, 254}: "Cisco Systems, Inc", + [3]byte{196, 114, 149}: "Cisco Systems, Inc", + [3]byte{196, 115, 30}: "Samsung Electronics Co.,Ltd", + [3]byte{196, 119, 171}: "Beijing ASU Tech Co.,Ltd", + [3]byte{196, 119, 175}: "Advanced Digital Broadcast SA", + [3]byte{196, 123, 47}: "Beijing JoinHope Image Technology Ltd.", + [3]byte{196, 123, 163}: "NAVIS Inc.", + [3]byte{196, 124, 141}: "IEEE Registration Authority", + [3]byte{196, 125, 70}: "FUJITSU LIMITED", + [3]byte{196, 125, 79}: "Cisco Systems, Inc", + [3]byte{196, 125, 204}: "Zebra Technologies Inc", + [3]byte{196, 125, 254}: "A.N. Solutions GmbH", + [3]byte{196, 127, 81}: "Inventek Systems", + [3]byte{196, 130, 63}: "Fujian Newland Auto-ID Tech. Co,.Ltd.", + [3]byte{196, 130, 78}: "Changzhou Uchip Electronics Co., LTD.", + [3]byte{196, 131, 111}: "Ciena Corporation", + [3]byte{196, 133, 8}: "Intel Corporate", + [3]byte{196, 134, 233}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{196, 136, 229}: "Samsung Electronics Co.,Ltd", + [3]byte{196, 142, 143}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{196, 143, 7}: "Shenzhen Yihao Hulian Science and Technology Co., Ltd.", + [3]byte{196, 145, 58}: "Shenzhen Sanland Electronic Co., ltd.", + [3]byte{196, 146, 76}: "KEISOKUKI CENTER CO.,LTD.", + [3]byte{196, 147, 0}: "8Devices", + [3]byte{196, 147, 19}: "100fio networks technology llc", + [3]byte{196, 147, 128}: "Speedytel technology", + [3]byte{196, 149, 162}: "SHENZHEN WEIJIU INDUSTRY AND TRADE DEVELOPMENT CO., LTD", + [3]byte{196, 152, 5}: "Minieum Networks, Inc", + [3]byte{196, 154, 2}: "LG Electronics (Mobile Communications)", + [3]byte{196, 157, 237}: "Microsoft Corporation", + [3]byte{196, 158, 65}: "G24 Power Limited", + [3]byte{196, 159, 243}: "Mciao Technologies, Inc.", + [3]byte{196, 163, 102}: "zte corporation", + [3]byte{196, 168, 29}: "D-Link International", + [3]byte{196, 170, 161}: "SUMMIT DEVELOPMENT, spol.s r.o.", + [3]byte{196, 171, 178}: "vivo Mobile Communication Co., Ltd.", + [3]byte{196, 173, 33}: "MEDIAEDGE Corporation", + [3]byte{196, 173, 241}: "GOPEACE Inc.", + [3]byte{196, 174, 18}: "Samsung Electronics Co.,Ltd", + [3]byte{196, 179, 1}: "Apple, Inc.", + [3]byte{196, 181, 18}: "General Electric Digital Energy", + [3]byte{196, 185, 205}: "Cisco Systems, Inc", + [3]byte{196, 186, 153}: "I+ME Actia Informatik und Mikro-Elektronik GmbH", + [3]byte{196, 186, 163}: "Beijing Winicssec Technologies Co., Ltd.", + [3]byte{196, 187, 76}: "Zebra Information Tech Co. Ltd", + [3]byte{196, 187, 234}: "Pakedge Device and Software Inc", + [3]byte{196, 189, 106}: "SKF GmbH", + [3]byte{196, 190, 132}: "Texas Instruments", + [3]byte{196, 190, 212}: "Avaya Inc", + [3]byte{196, 192, 174}: "MIDORI ELECTRONIC CO., LTD.", + [3]byte{196, 193, 159}: "National Oilwell Varco Instrumentation, Monitoring, and Optimization (NOV IMO)", + [3]byte{196, 197, 99}: "TECNO MOBILE LIMITED", + [3]byte{196, 199, 85}: "Beijing HuaqinWorld Technology Co.,Ltd", + [3]byte{196, 201, 25}: "Energy Imports Ltd", + [3]byte{196, 201, 236}: "Gugaoo HK Limited", + [3]byte{196, 202, 217}: "Hangzhou H3C Technologies Co., Limited", + [3]byte{196, 203, 107}: "Airista Flow, Inc.", + [3]byte{196, 205, 69}: "Beijing Boomsense Technology CO.,LTD.", + [3]byte{196, 205, 130}: "Hangzhou Lowan Information Technology Co., Ltd.", + [3]byte{196, 209, 151}: "Ventia Utility Services", + [3]byte{196, 212, 137}: "JiangSu Joyque Information Industry Co.,Ltd", + [3]byte{196, 214, 85}: "Tercel technology co.,ltd", + [3]byte{196, 217, 135}: "Intel Corporate", + [3]byte{196, 218, 38}: "NOBLEX SA", + [3]byte{196, 218, 125}: "Ivium Technologies B.V.", + [3]byte{196, 224, 50}: "IEEE 1904.1 Working Group", + [3]byte{196, 225, 124}: "U2S co.", + [3]byte{196, 229, 16}: "Mechatro, Inc.", + [3]byte{196, 231, 190}: "SCSpro Co.,Ltd", + [3]byte{196, 233, 47}: "AB Sciex", + [3]byte{196, 233, 132}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{196, 234, 29}: "Technicolor", + [3]byte{196, 235, 227}: "RRCN SAS", + [3]byte{196, 237, 186}: "Texas Instruments", + [3]byte{196, 238, 174}: "VSS Monitoring", + [3]byte{196, 238, 245}: "II-VI Incorporated", + [3]byte{196, 239, 112}: "Home Skinovations", + [3]byte{196, 240, 129}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{196, 241, 209}: "BEIJING SOGOU TECHNOLOGY DEVELOPMENT CO., LTD.", + [3]byte{196, 243, 18}: "Texas Instruments", + [3]byte{196, 244, 100}: "Spica international", + [3]byte{196, 245, 124}: "Brocade Communications Systems, Inc.", + [3]byte{196, 245, 165}: "Kumalift Co., Ltd.", + [3]byte{196, 252, 228}: "DishTV NZ Ltd", + [3]byte{196, 255, 31}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{200, 0, 132}: "Cisco Systems, Inc", + [3]byte{200, 2, 16}: "LG Innotek", + [3]byte{200, 2, 88}: "ITW GSE ApS", + [3]byte{200, 2, 143}: "Nova Electronics (Shanghai) Co., Ltd.", + [3]byte{200, 2, 166}: "Beijing Newmine Technology", + [3]byte{200, 7, 24}: "TDSi", + [3]byte{200, 8, 233}: "LG Electronics", + [3]byte{200, 10, 169}: "QUANTA COMPUTER INC.", + [3]byte{200, 12, 200}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{200, 14, 20}: "AVM Audiovisuelles Marketing und Computersysteme GmbH", + [3]byte{200, 14, 119}: "Le Shi Zhi Xin Electronic Technology (Tianjin) Limited", + [3]byte{200, 14, 149}: "OmniLync Inc.", + [3]byte{200, 16, 115}: "CENTURY OPTICOMM CO.,LTD", + [3]byte{200, 20, 81}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{200, 20, 121}: "Samsung Electronics Co.,Ltd", + [3]byte{200, 22, 165}: "Masimo Corporation", + [3]byte{200, 22, 189}: "Qingdao Hisense Communications Co.,Ltd.", + [3]byte{200, 25, 247}: "Samsung Electronics Co.,Ltd", + [3]byte{200, 26, 254}: "DLOGIC GmbH", + [3]byte{200, 27, 92}: "BCTech", + [3]byte{200, 27, 107}: "Innova Security", + [3]byte{200, 30, 142}: "ADV Security (S) Pte Ltd", + [3]byte{200, 30, 231}: "Apple, Inc.", + [3]byte{200, 31, 102}: "Dell Inc.", + [3]byte{200, 31, 190}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{200, 31, 234}: "Avaya Inc", + [3]byte{200, 32, 142}: "Storagedata", + [3]byte{200, 33, 88}: "Intel Corporate", + [3]byte{200, 37, 225}: "Lemobile Information Technology (Beijing) Co., Ltd", + [3]byte{200, 41, 42}: "Barun Electronics", + [3]byte{200, 42, 20}: "Apple, Inc.", + [3]byte{200, 46, 148}: "Halfa Enterprise Co., Ltd.", + [3]byte{200, 49, 104}: "eZEX corporation", + [3]byte{200, 50, 50}: "Hunting Innova", + [3]byte{200, 51, 75}: "Apple, Inc.", + [3]byte{200, 52, 142}: "Intel Corporate", + [3]byte{200, 53, 184}: "Ericsson, EAB/RWI/K", + [3]byte{200, 56, 112}: "Samsung Electronics Co.,Ltd", + [3]byte{200, 58, 53}: "Tenda Technology Co., Ltd.", + [3]byte{200, 58, 107}: "Roku, Inc", + [3]byte{200, 59, 69}: "JRI", + [3]byte{200, 60, 133}: "Apple, Inc.", + [3]byte{200, 61, 151}: "Nokia Corporation", + [3]byte{200, 61, 212}: "CyberTAN Technology Inc.", + [3]byte{200, 61, 252}: "Pioneer DJ Corporation", + [3]byte{200, 62, 153}: "Texas Instruments", + [3]byte{200, 62, 167}: "KUNBUS GmbH", + [3]byte{200, 63, 38}: "Microsoft Corporation", + [3]byte{200, 63, 180}: "ARRIS Group, Inc.", + [3]byte{200, 64, 41}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{200, 69, 41}: "IMK Networks Co.,Ltd", + [3]byte{200, 69, 68}: "Asia Pacific CIS (Wuxi) Co, Ltd", + [3]byte{200, 69, 143}: "Wyler AG", + [3]byte{200, 71, 140}: "Beken Corporation", + [3]byte{200, 72, 245}: "MEDISON Xray Co., Ltd", + [3]byte{200, 76, 117}: "Cisco Systems, Inc", + [3]byte{200, 80, 233}: "Raisecom Technology CO., LTD", + [3]byte{200, 81, 149}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{200, 86, 69}: "Intermas France", + [3]byte{200, 86, 99}: "Sunflex Europe GmbH", + [3]byte{200, 91, 118}: "LCFC(HeFei) Electronics Technology co., ltd", + [3]byte{200, 96, 0}: "ASUSTek COMPUTER INC.", + [3]byte{200, 99, 241}: "Sony Interactive Entertainment Inc.", + [3]byte{200, 100, 199}: "zte corporation", + [3]byte{200, 102, 44}: "Beijing Haitai Fangyuan High Technology Co,.Ltd.", + [3]byte{200, 102, 93}: "Aerohive Networks Inc.", + [3]byte{200, 103, 94}: "Aerohive Networks Inc.", + [3]byte{200, 105, 205}: "Apple, Inc.", + [3]byte{200, 108, 30}: "Display Systems Ltd", + [3]byte{200, 108, 135}: "Zyxel Communications Corporation", + [3]byte{200, 108, 182}: "Optcom Co., Ltd.", + [3]byte{200, 111, 29}: "Apple, Inc.", + [3]byte{200, 114, 72}: "Aplicom Oy", + [3]byte{200, 115, 36}: "Sow Cheng Technology Co. Ltd.", + [3]byte{200, 117, 91}: "Quantify Technology Pty. Ltd.", + [3]byte{200, 119, 139}: "Themis Computer", + [3]byte{200, 123, 91}: "zte corporation", + [3]byte{200, 124, 188}: "Valink Co., Ltd.", + [3]byte{200, 125, 119}: "Shenzhen Kingtech Communication Equipment Co.,Ltd", + [3]byte{200, 126, 117}: "Samsung Electronics Co.,Ltd", + [3]byte{200, 132, 57}: "Sunrise Technologies", + [3]byte{200, 132, 71}: "Beautiful Enterprise Co., Ltd", + [3]byte{200, 133, 80}: "Apple, Inc.", + [3]byte{200, 135, 34}: "Lumenpulse", + [3]byte{200, 135, 59}: "Net Optics", + [3]byte{200, 138, 131}: "Dongguan HuaHong Electronics Co.,Ltd", + [3]byte{200, 139, 71}: "Nolangroup S.P.A con Socio Unico", + [3]byte{200, 141, 131}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{200, 142, 209}: "IEEE Registration Authority", + [3]byte{200, 144, 62}: "Pakton Technologies", + [3]byte{200, 145, 249}: "Sagemcom Broadband SAS", + [3]byte{200, 147, 70}: "MXCHIP Company Limited", + [3]byte{200, 147, 131}: "Embedded Automation, Inc.", + [3]byte{200, 148, 187}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{200, 148, 210}: "Jiangsu Datang Electronic Products Co., Ltd", + [3]byte{200, 151, 159}: "Nokia Corporation", + [3]byte{200, 156, 29}: "Cisco Systems, Inc", + [3]byte{200, 156, 220}: "Elitegroup Computer Systems Co.,Ltd.", + [3]byte{200, 159, 29}: "SHENZHEN COMMUNICATION TECHNOLOGIES CO.,LTD", + [3]byte{200, 159, 66}: "VDII Innovation AB", + [3]byte{200, 160, 48}: "Texas Instruments", + [3]byte{200, 161, 182}: "Shenzhen Longway Technologies Co., Ltd", + [3]byte{200, 161, 186}: "Neul Ltd", + [3]byte{200, 162, 206}: "Oasis Media Systems LLC", + [3]byte{200, 166, 32}: "Nebula, Inc", + [3]byte{200, 167, 10}: "Verizon Business", + [3]byte{200, 167, 41}: "SYStronics Co., Ltd.", + [3]byte{200, 168, 35}: "Samsung Electronics Co.,Ltd", + [3]byte{200, 169, 252}: "Goyoo Networks Inc.", + [3]byte{200, 170, 33}: "ARRIS Group, Inc.", + [3]byte{200, 170, 85}: "Hunan Comtom Electronic Incorporated Co.,Ltd", + [3]byte{200, 170, 204}: "Private", + [3]byte{200, 174, 156}: "Shanghai TYD Elecronic Technology Co. Ltd", + [3]byte{200, 175, 64}: "marco Systemanalyse und Entwicklung GmbH", + [3]byte{200, 175, 227}: "Hefei Radio Communication Technology Co., Ltd", + [3]byte{200, 178, 30}: "CHIPSEA TECHNOLOGIES (SHENZHEN) CORP.", + [3]byte{200, 179, 115}: "Cisco-Linksys, LLC", + [3]byte{200, 181, 173}: "Hewlett Packard Enterprise", + [3]byte{200, 181, 183}: "Apple, Inc.", + [3]byte{200, 186, 148}: "SAMSUNG ELECTRO-MECHANICS(THAILAND)", + [3]byte{200, 187, 211}: "Embrane", + [3]byte{200, 188, 200}: "Apple, Inc.", + [3]byte{200, 190, 25}: "D-Link International", + [3]byte{200, 193, 38}: "ZPM Industria e Comercio Ltda", + [3]byte{200, 193, 60}: "RuggedTek Hangzhou Co., Ltd", + [3]byte{200, 194, 198}: "Shanghai Airm2m Communication Technology Co., Ltd", + [3]byte{200, 197, 14}: "Shenzhen Primestone Network Technologies.Co., Ltd.", + [3]byte{200, 199, 145}: "Zero1.tv GmbH", + [3]byte{200, 203, 184}: "Hewlett Packard", + [3]byte{200, 205, 114}: "Sagemcom Broadband SAS", + [3]byte{200, 208, 25}: "Shanghai Tigercel Communication Technology Co.,Ltd", + [3]byte{200, 209, 11}: "Nokia Corporation", + [3]byte{200, 209, 42}: "Comtrend Corporation", + [3]byte{200, 209, 94}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{200, 209, 209}: "AGAiT Technology Corporation", + [3]byte{200, 210, 193}: "Jetlun (Shenzhen) Corporation", + [3]byte{200, 211, 163}: "D-Link International", + [3]byte{200, 211, 255}: "Hewlett Packard", + [3]byte{200, 212, 41}: "Muehlbauer AG", + [3]byte{200, 213, 144}: "FLIGHT DATA SYSTEMS", + [3]byte{200, 213, 254}: "Shenzhen Zowee Technology Co., Ltd", + [3]byte{200, 215, 25}: "Cisco-Linksys, LLC", + [3]byte{200, 215, 121}: "Qingdao Haier Telecom Co.,Ltd", + [3]byte{200, 215, 176}: "Samsung Electronics Co.,Ltd", + [3]byte{200, 219, 38}: "Logitech", + [3]byte{200, 221, 201}: "Lenovo Mobile Communication Technology Ltd.", + [3]byte{200, 222, 81}: "IntegraOptics", + [3]byte{200, 222, 201}: "Coriant", + [3]byte{200, 223, 124}: "Nokia Corporation", + [3]byte{200, 223, 132}: "Texas Instruments", + [3]byte{200, 224, 235}: "Apple, Inc.", + [3]byte{200, 225, 48}: "Milkyway Group Ltd", + [3]byte{200, 225, 167}: "Vertu Corporation Limited", + [3]byte{200, 228, 47}: "Technical Research Design and Development", + [3]byte{200, 231, 118}: "PTCOM Technology", + [3]byte{200, 231, 216}: "SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.", + [3]byte{200, 231, 240}: "Juniper Networks", + [3]byte{200, 238, 8}: "TANGTOP TECHNOLOGY CO.,LTD", + [3]byte{200, 238, 117}: "Pishion International Co. Ltd", + [3]byte{200, 238, 166}: "Shenzhen SHX Technology Co., Ltd", + [3]byte{200, 239, 46}: "Beijing Gefei Tech. Co., Ltd", + [3]byte{200, 242, 48}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{200, 243, 107}: "Yamato Scale Co.,Ltd.", + [3]byte{200, 243, 134}: "Shenzhen Xiaoniao Technology Co.,Ltd", + [3]byte{200, 244, 6}: "Avaya Inc", + [3]byte{200, 246, 80}: "Apple, Inc.", + [3]byte{200, 246, 141}: "S.E.TECHNOLOGIES LIMITED", + [3]byte{200, 247, 4}: "Building Block Video", + [3]byte{200, 247, 51}: "Intel Corporate", + [3]byte{200, 248, 109}: "Alcatel-Lucent Shanghai Bell Co., Ltd", + [3]byte{200, 249, 70}: "LOCOSYS Technology Inc.", + [3]byte{200, 249, 129}: "Seneca s.r.l.", + [3]byte{200, 249, 200}: "NewSharp Technology(SuZhou)Co,Ltd", + [3]byte{200, 249, 249}: "Cisco Systems, Inc", + [3]byte{200, 251, 38}: "Cisco SPVTG", + [3]byte{200, 253, 25}: "Texas Instruments", + [3]byte{200, 254, 48}: "Bejing DAYO Mobile Communication Technology Ltd.", + [3]byte{200, 255, 40}: "Liteon Technology Corporation", + [3]byte{200, 255, 119}: "Dyson Limited", + [3]byte{204, 0, 128}: "BETTINI SRL", + [3]byte{204, 3, 217}: "Cisco Meraki", + [3]byte{204, 3, 250}: "Technicolor CH USA Inc.", + [3]byte{204, 4, 124}: "G-WAY Microwave", + [3]byte{204, 4, 180}: "Select Comfort", + [3]byte{204, 5, 27}: "Samsung Electronics Co.,Ltd", + [3]byte{204, 6, 119}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{204, 7, 171}: "Samsung Electronics Co.,Ltd", + [3]byte{204, 7, 228}: "Lenovo Mobile Communication Technology Ltd.", + [3]byte{204, 8, 141}: "Apple, Inc.", + [3]byte{204, 8, 224}: "Apple, Inc.", + [3]byte{204, 9, 200}: "IMAQLIQ LTD", + [3]byte{204, 12, 218}: "Miljovakt AS", + [3]byte{204, 13, 236}: "Cisco SPVTG", + [3]byte{204, 16, 163}: "Beijing Nan Bao Technology Co., Ltd.", + [3]byte{204, 20, 166}: "Yichun MyEnergy Domain, Inc", + [3]byte{204, 22, 126}: "Cisco Systems, Inc", + [3]byte{204, 24, 123}: "Manzanita Systems, Inc.", + [3]byte{204, 25, 168}: "PT Inovação e Sistemas SA", + [3]byte{204, 26, 250}: "zte corporation", + [3]byte{204, 27, 224}: "IEEE Registration Authority", + [3]byte{204, 30, 255}: "Metrological Group BV", + [3]byte{204, 31, 196}: "InVue", + [3]byte{204, 32, 232}: "Apple, Inc.", + [3]byte{204, 34, 24}: "InnoDigital Co., Ltd.", + [3]byte{204, 34, 55}: "IEEE Registration Authority", + [3]byte{204, 37, 239}: "Apple, Inc.", + [3]byte{204, 38, 45}: "Verifi, LLC", + [3]byte{204, 41, 245}: "Apple, Inc.", + [3]byte{204, 42, 128}: "Micro-Biz intelligence solutions Co.,Ltd", + [3]byte{204, 45, 33}: "Tenda Technology Co.,Ltd.Dongguan branch", + [3]byte{204, 45, 131}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{204, 45, 140}: "LG ELECTRONICS INC", + [3]byte{204, 45, 224}: "Routerboard.com", + [3]byte{204, 47, 113}: "Intel Corporate", + [3]byte{204, 48, 128}: "VAIO Corporation", + [3]byte{204, 51, 187}: "Sagemcom Broadband SAS", + [3]byte{204, 52, 41}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{204, 52, 215}: "GEWISS S.P.A.", + [3]byte{204, 53, 64}: "Technicolor CH USA Inc.", + [3]byte{204, 55, 171}: "Edgecore Networks Corportation", + [3]byte{204, 57, 140}: "Shiningtek", + [3]byte{204, 58, 97}: "SAMSUNG ELECTRO MECHANICS CO., LTD.", + [3]byte{204, 58, 223}: "Private", + [3]byte{204, 59, 62}: "Lester Electrical", + [3]byte{204, 60, 63}: "SA.S.S. Datentechnik AG", + [3]byte{204, 61, 130}: "Intel Corporate", + [3]byte{204, 62, 95}: "Hewlett Packard", + [3]byte{204, 63, 29}: "Intesis Software SL", + [3]byte{204, 64, 208}: "NETGEAR", + [3]byte{204, 67, 227}: "Trump s.a.", + [3]byte{204, 68, 99}: "Apple, Inc.", + [3]byte{204, 70, 57}: "WAAV, Inc.", + [3]byte{204, 70, 214}: "Cisco Systems, Inc", + [3]byte{204, 71, 3}: "Intercon Systems Co., Ltd.", + [3]byte{204, 74, 225}: "fourtec -Fourier Technologies", + [3]byte{204, 75, 115}: "AMPAK Technology, Inc.", + [3]byte{204, 75, 251}: "Hellberg Safety AB", + [3]byte{204, 78, 36}: "Brocade Communications Systems, Inc.", + [3]byte{204, 78, 236}: "HUMAX Co., Ltd.", + [3]byte{204, 80, 10}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{204, 80, 28}: "KVH Industries, Inc.", + [3]byte{204, 80, 118}: "Ocom Communications, Inc.", + [3]byte{204, 82, 175}: "Universal Global Scientific Industrial Co., Ltd.", + [3]byte{204, 83, 181}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{204, 84, 89}: "OnTime Networks AS", + [3]byte{204, 85, 173}: "RIM", + [3]byte{204, 89, 62}: "TOUMAZ LTD", + [3]byte{204, 90, 83}: "Cisco Systems, Inc", + [3]byte{204, 92, 117}: "Weightech Com. Imp. Exp. Equip. Pesagem Ltda", + [3]byte{204, 93, 78}: "Zyxel Communications Corporation", + [3]byte{204, 93, 87}: "Information System Research Institute,Inc.", + [3]byte{204, 95, 191}: "Topwise 3G Communication Co., Ltd.", + [3]byte{204, 96, 187}: "Empower RF Systems", + [3]byte{204, 97, 229}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{204, 101, 173}: "ARRIS Group, Inc.", + [3]byte{204, 102, 178}: "Nokia", + [3]byte{204, 105, 176}: "Global Traffic Technologies, LLC", + [3]byte{204, 107, 152}: "Minetec Wireless Technologies", + [3]byte{204, 107, 241}: "Sound Masking Inc.", + [3]byte{204, 109, 160}: "Roku, Inc.", + [3]byte{204, 109, 239}: "TJK Tietolaite Oy", + [3]byte{204, 110, 164}: "Samsung Electronics Co.,Ltd", + [3]byte{204, 114, 15}: "Viscount Systems Inc.", + [3]byte{204, 115, 20}: "HONG KONG WHEATEK TECHNOLOGY LIMITED", + [3]byte{204, 116, 152}: "Filmetrics Inc.", + [3]byte{204, 118, 105}: "SEETECH", + [3]byte{204, 120, 95}: "Apple, Inc.", + [3]byte{204, 120, 171}: "Texas Instruments", + [3]byte{204, 121, 74}: "BLU Products Inc.", + [3]byte{204, 121, 207}: "SHENZHEN RF-LINK TECHNOLOGY CO.,LTD.", + [3]byte{204, 122, 48}: "CMAX Wireless Co., Ltd.", + [3]byte{204, 123, 53}: "zte corporation", + [3]byte{204, 125, 55}: "ARRIS Group, Inc.", + [3]byte{204, 126, 231}: "Panasonic Corporation AVC Networks Company", + [3]byte{204, 129, 218}: "Phicomm (Shanghai) Co., Ltd.", + [3]byte{204, 130, 235}: "KYOCERA CORPORATION", + [3]byte{204, 133, 108}: "SHENZHEN MDK DIGITAL TECHNOLOGY CO.,LTD", + [3]byte{204, 137, 253}: "Nokia Corporation", + [3]byte{204, 140, 218}: "Shenzhen Wei Da Intelligent Technology Go.,Ltd", + [3]byte{204, 140, 227}: "Texas Instruments", + [3]byte{204, 144, 147}: "Hansong Tehnologies", + [3]byte{204, 144, 232}: "Shenzhen YOUHUA Technology Co., Ltd", + [3]byte{204, 145, 43}: "TE Connectivity Touch Solutions", + [3]byte{204, 148, 74}: "Pfeiffer Vacuum GmbH", + [3]byte{204, 148, 112}: "Kinestral Technologies, Inc.", + [3]byte{204, 149, 215}: "Vizio, Inc", + [3]byte{204, 150, 53}: "LVS Co.,Ltd.", + [3]byte{204, 150, 160}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{204, 152, 145}: "Cisco Systems, Inc", + [3]byte{204, 158, 0}: "Nintendo Co., Ltd.", + [3]byte{204, 159, 53}: "Transbit Sp. z o.o.", + [3]byte{204, 159, 122}: "Chiun Mai Communication Systems, Inc", + [3]byte{204, 160, 229}: "DZG Metering GmbH", + [3]byte{204, 162, 25}: "SHENZHEN ALONG INVESTMENT CO.,LTD", + [3]byte{204, 162, 35}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{204, 162, 96}: "SICHUAN TIANYI COMHEART TELECOMCO.,LTD", + [3]byte{204, 163, 116}: "Guangdong Guanglian Electronic Technology Co.Ltd", + [3]byte{204, 164, 98}: "ARRIS Group, Inc.", + [3]byte{204, 164, 175}: "Shenzhen Sowell Technology Co., LTD", + [3]byte{204, 166, 20}: "AIFA TECHNOLOGY CORP.", + [3]byte{204, 175, 120}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{204, 176, 218}: "Liteon Technology Corporation", + [3]byte{204, 177, 26}: "Samsung Electronics Co.,Ltd", + [3]byte{204, 178, 85}: "D-Link International", + [3]byte{204, 179, 171}: "shenzhen Biocare Bio-Medical Equipment Co.,Ltd.", + [3]byte{204, 179, 248}: "FUJITSU ISOTEC LIMITED", + [3]byte{204, 181, 90}: "Fraunhofer ITWM", + [3]byte{204, 182, 145}: "NECMagnusCommunications", + [3]byte{204, 184, 136}: "AnB Securite s.a.", + [3]byte{204, 184, 168}: "AMPAK Technology, Inc.", + [3]byte{204, 184, 241}: "EAGLE KINGDOM TECHNOLOGIES LIMITED", + [3]byte{204, 189, 53}: "Steinel GmbH", + [3]byte{204, 189, 211}: "Ultimaker B.V.", + [3]byte{204, 190, 89}: "Calix Inc.", + [3]byte{204, 190, 113}: "OptiLogix BV", + [3]byte{204, 193, 4}: "Applied Technical Systems", + [3]byte{204, 195, 234}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{204, 197, 10}: "SHENZHEN DAJIAHAO TECHNOLOGY CO.,LTD", + [3]byte{204, 197, 239}: "Co-Comm Servicios Telecomunicaciones S.L.", + [3]byte{204, 198, 43}: "Tri-Systems Corporation", + [3]byte{204, 199, 96}: "Apple, Inc.", + [3]byte{204, 200, 215}: "CIAS Elettronica srl", + [3]byte{204, 204, 78}: "Sun Fountainhead USA. Corp", + [3]byte{204, 204, 129}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{204, 205, 100}: "SM-Electronic GmbH", + [3]byte{204, 206, 30}: "AVM Audiovisuelles Marketing und Computersysteme GmbH", + [3]byte{204, 206, 64}: "Janteq Corp", + [3]byte{204, 210, 155}: "Shenzhen Bopengfa Elec&Technology CO.,Ltd", + [3]byte{204, 211, 30}: "IEEE Registration Authority", + [3]byte{204, 211, 226}: "Jiangsu Yinhe Electronics Co.,Ltd.", + [3]byte{204, 213, 57}: "Cisco Systems, Inc", + [3]byte{204, 216, 17}: "Aiconn Technology Corporation", + [3]byte{204, 216, 193}: "Cisco Systems, Inc", + [3]byte{204, 217, 233}: "SCR Engineers Ltd.", + [3]byte{204, 224, 195}: "Mangstor, Inc.", + [3]byte{204, 225, 127}: "Juniper Networks", + [3]byte{204, 225, 213}: "BUFFALO.INC", + [3]byte{204, 231, 152}: "My Social Stuff", + [3]byte{204, 231, 223}: "American Magnetics, Inc.", + [3]byte{204, 232, 172}: "SOYEA Technology Co.,Ltd.", + [3]byte{204, 234, 28}: "DCONWORKS Co., Ltd", + [3]byte{204, 238, 217}: "VAHLE DETO GmbH", + [3]byte{204, 239, 72}: "Cisco Systems, Inc", + [3]byte{204, 243, 165}: "Chi Mei Communication Systems, Inc", + [3]byte{204, 244, 7}: "EUKREA ELECTROMATIQUE SARL", + [3]byte{204, 245, 56}: "3isysnetworks", + [3]byte{204, 246, 122}: "Ayecka Communication Systems LTD", + [3]byte{204, 248, 65}: "Lumewave", + [3]byte{204, 248, 240}: "Xi'an HISU Multimedia Technology Co.,Ltd.", + [3]byte{204, 249, 84}: "Avaya Inc", + [3]byte{204, 249, 87}: "u-blox AG", + [3]byte{204, 249, 232}: "Samsung Electronics Co.,Ltd", + [3]byte{204, 250, 0}: "LG Electronics (Mobile Communications)", + [3]byte{204, 251, 101}: "Nintendo Co., Ltd.", + [3]byte{204, 252, 109}: "RIZ TRANSMITTERS", + [3]byte{204, 252, 177}: "Wireless Technology, Inc.", + [3]byte{204, 253, 23}: "TCT mobile ltd", + [3]byte{204, 254, 60}: "Samsung Electronics Co.,Ltd", + [3]byte{208, 3, 75}: "Apple, Inc.", + [3]byte{208, 4, 1}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{208, 4, 146}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{208, 5, 42}: "Arcadyan Corporation", + [3]byte{208, 7, 144}: "Texas Instruments", + [3]byte{208, 7, 202}: "Juniper Networks", + [3]byte{208, 10, 171}: "Yokogawa Digital Computer Corporation", + [3]byte{208, 14, 164}: "Porsche Cars North America", + [3]byte{208, 14, 217}: "Taicang T&W Electronics", + [3]byte{208, 15, 109}: "T&W Electronics Company", + [3]byte{208, 18, 66}: "BIOS Corporation", + [3]byte{208, 19, 30}: "Sunrex Technology Corp", + [3]byte{208, 19, 253}: "LG Electronics (Mobile Communications)", + [3]byte{208, 21, 74}: "zte corporation", + [3]byte{208, 23, 106}: "Samsung Electronics Co.,Ltd", + [3]byte{208, 23, 194}: "ASUSTek COMPUTER INC.", + [3]byte{208, 26, 167}: "UniPrint", + [3]byte{208, 28, 187}: "Beijing Ctimes Digital Technology Co., Ltd.", + [3]byte{208, 34, 18}: "IEEE Registration Authority", + [3]byte{208, 34, 190}: "SAMSUNG ELECTRO-MECHANICS(THAILAND)", + [3]byte{208, 35, 219}: "Apple, Inc.", + [3]byte{208, 37, 22}: "SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.", + [3]byte{208, 37, 68}: "SAMSUNG ELECTRO-MECHANICS(THAILAND)", + [3]byte{208, 37, 152}: "Apple, Inc.", + [3]byte{208, 39, 136}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{208, 44, 69}: "littleBits Electronics, Inc.", + [3]byte{208, 45, 179}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{208, 49, 16}: "Ingenic Semiconductor Co.,Ltd", + [3]byte{208, 49, 105}: "Samsung Electronics Co.,Ltd", + [3]byte{208, 51, 17}: "Apple, Inc.", + [3]byte{208, 55, 66}: "Yulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd", + [3]byte{208, 55, 97}: "Texas Instruments", + [3]byte{208, 57, 114}: "Texas Instruments", + [3]byte{208, 57, 179}: "ARRIS Group, Inc.", + [3]byte{208, 61, 195}: "AQ Corporation", + [3]byte{208, 62, 92}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{208, 67, 30}: "Dell Inc.", + [3]byte{208, 70, 220}: "Southwest Research Institute", + [3]byte{208, 72, 243}: "DATTUS Inc", + [3]byte{208, 73, 139}: "ZOOM SERVER", + [3]byte{208, 76, 193}: "SINTRONES Technology Corp.", + [3]byte{208, 77, 44}: "Roku, Inc.", + [3]byte{208, 79, 126}: "Apple, Inc.", + [3]byte{208, 80, 153}: "ASRock Incorporation", + [3]byte{208, 81, 98}: "Sony Mobile Communications AB", + [3]byte{208, 82, 168}: "Physical Graph Corporation", + [3]byte{208, 83, 73}: "Liteon Technology Corporation", + [3]byte{208, 84, 45}: "Cambridge Industries(Group) Co.,Ltd.", + [3]byte{208, 85, 178}: "Integrated Device Technology (Malaysia) Sdn. Bhd.", + [3]byte{208, 87, 76}: "Cisco Systems, Inc", + [3]byte{208, 87, 123}: "Intel Corporate", + [3]byte{208, 87, 133}: "Pantech Co., Ltd.", + [3]byte{208, 87, 161}: "Werma Signaltechnik GmbH & Co. KG", + [3]byte{208, 88, 117}: "Active Control Technology Inc.", + [3]byte{208, 88, 168}: "zte corporation", + [3]byte{208, 89, 149}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{208, 89, 195}: "CeraMicro Technology Corporation", + [3]byte{208, 89, 228}: "Samsung Electronics Co.,Ltd", + [3]byte{208, 90, 0}: "Technicolor CH USA Inc.", + [3]byte{208, 90, 15}: "I-BT DIGITAL CO.,LTD", + [3]byte{208, 90, 241}: "Shenzhen Pulier Tech CO.,Ltd", + [3]byte{208, 91, 168}: "zte corporation", + [3]byte{208, 92, 122}: "Sartura d.o.o.", + [3]byte{208, 95, 184}: "Texas Instruments", + [3]byte{208, 95, 206}: "Hitachi Data Systems", + [3]byte{208, 96, 140}: "zte corporation", + [3]byte{208, 98, 160}: "China Essence Technology (Zhumadian) Co., Ltd.", + [3]byte{208, 99, 77}: "Meiko Maschinenbau GmbH & Co. KG", + [3]byte{208, 99, 180}: "SolidRun Ltd.", + [3]byte{208, 101, 202}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{208, 102, 109}: "Shenzhen Bus-Lan Technology Co., Ltd.", + [3]byte{208, 102, 123}: "Samsung Electronics Co.,Ltd", + [3]byte{208, 103, 38}: "Hewlett Packard Enterprise", + [3]byte{208, 103, 229}: "Dell Inc.", + [3]byte{208, 105, 158}: "LUMINEX Lighting Control Equipment", + [3]byte{208, 105, 208}: "Verto Medical Solutions, LLC", + [3]byte{208, 106, 31}: "BSE CO.,LTD.", + [3]byte{208, 111, 74}: "TOPWELL INTERNATIONAL HOLDINGS LIMITED", + [3]byte{208, 111, 130}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{208, 113, 196}: "zte corporation", + [3]byte{208, 114, 220}: "Cisco Systems, Inc", + [3]byte{208, 115, 127}: "Mini-Circuits", + [3]byte{208, 115, 142}: "DONG OH PRECISION CO., LTD.", + [3]byte{208, 115, 213}: "LIFI LABS MANAGEMENT PTY LTD", + [3]byte{208, 117, 190}: "Reno A&E", + [3]byte{208, 118, 80}: "IEEE Registration Authority", + [3]byte{208, 122, 181}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{208, 124, 45}: "Leie IOT technology Co., Ltd", + [3]byte{208, 125, 229}: "Forward Pay Systems, Inc.", + [3]byte{208, 126, 40}: "Hewlett Packard", + [3]byte{208, 126, 53}: "Intel Corporate", + [3]byte{208, 127, 196}: "Ou Wei Technology Co.,Ltd. of Shenzhen City", + [3]byte{208, 131, 212}: "Xtel Wireless ApS", + [3]byte{208, 132, 176}: "Sagemcom Broadband SAS", + [3]byte{208, 135, 226}: "Samsung Electronics Co.,Ltd", + [3]byte{208, 137, 153}: "APCON, Inc.", + [3]byte{208, 138, 85}: "Skullcandy", + [3]byte{208, 139, 126}: "Passif Semiconductor", + [3]byte{208, 140, 181}: "Texas Instruments", + [3]byte{208, 140, 255}: "UPWIS AB", + [3]byte{208, 146, 158}: "Microsoft Corporation", + [3]byte{208, 147, 128}: "Ducere Technologies Pvt. Ltd.", + [3]byte{208, 147, 248}: "Stonestreet One LLC", + [3]byte{208, 148, 102}: "Dell Inc.", + [3]byte{208, 149, 199}: "Pantech Co., Ltd.", + [3]byte{208, 150, 251}: "DASAN Network Solutions", + [3]byte{208, 153, 213}: "Alcatel-Lucent", + [3]byte{208, 155, 5}: "Emtronix", + [3]byte{208, 156, 48}: "Foster Electric Company, Limited", + [3]byte{208, 157, 10}: "LINKCOM", + [3]byte{208, 157, 171}: "TCT mobile ltd", + [3]byte{208, 160, 214}: "Chengdu TD Tech Ltd.", + [3]byte{208, 163, 17}: "Neuberger Gebäudeautomation GmbH", + [3]byte{208, 164, 177}: "Sonifex Ltd.", + [3]byte{208, 165, 166}: "Cisco Systems, Inc", + [3]byte{208, 166, 55}: "Apple, Inc.", + [3]byte{208, 174, 236}: "Alpha Networks Inc.", + [3]byte{208, 175, 182}: "Linktop Technology Co., LTD", + [3]byte{208, 176, 205}: "Moen", + [3]byte{208, 177, 40}: "Samsung Electronics Co.,Ltd", + [3]byte{208, 178, 196}: "Technicolor CH USA Inc.", + [3]byte{208, 179, 63}: "Shenzhen TINNO Mobile Technology Corp.", + [3]byte{208, 180, 152}: "Robert Bosch LLC Automotive Electronics", + [3]byte{208, 181, 35}: "Bestcare Cloucal Corp.", + [3]byte{208, 181, 61}: "SEPRO ROBOTIQUE", + [3]byte{208, 181, 194}: "Texas Instruments", + [3]byte{208, 186, 228}: "Shanghai MXCHIP Information Technology Co., Ltd.", + [3]byte{208, 187, 128}: "SHL Telemedicine International Ltd.", + [3]byte{208, 189, 1}: "DS International", + [3]byte{208, 190, 44}: "CNSLink Co., Ltd.", + [3]byte{208, 191, 156}: "Hewlett Packard", + [3]byte{208, 192, 191}: "Actions Microelectronics Co., Ltd", + [3]byte{208, 193, 147}: "SKYBELL, INC", + [3]byte{208, 193, 177}: "Samsung Electronics Co.,Ltd", + [3]byte{208, 194, 130}: "Cisco Systems, Inc", + [3]byte{208, 196, 47}: "Tamagawa Seiki Co.,Ltd.", + [3]byte{208, 197, 243}: "Apple, Inc.", + [3]byte{208, 199, 137}: "Cisco Systems, Inc", + [3]byte{208, 199, 192}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{208, 205, 225}: "Scientech Electronics", + [3]byte{208, 207, 94}: "Energy Micro AS", + [3]byte{208, 208, 75}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{208, 208, 253}: "Cisco Systems, Inc", + [3]byte{208, 210, 18}: "K2NET Co.,Ltd.", + [3]byte{208, 210, 134}: "Beckman Coulter K.K.", + [3]byte{208, 210, 176}: "Apple, Inc.", + [3]byte{208, 211, 252}: "Mios, Ltd.", + [3]byte{208, 212, 18}: "ADB Broadband Italia", + [3]byte{208, 212, 113}: "MVTECH co., Ltd", + [3]byte{208, 214, 204}: "Wintop", + [3]byte{208, 217, 79}: "IEEE Registration Authority", + [3]byte{208, 219, 50}: "Nokia Corporation", + [3]byte{208, 223, 154}: "Liteon Technology Corporation", + [3]byte{208, 223, 178}: "Genie Networks Limited", + [3]byte{208, 223, 199}: "Samsung Electronics Co.,Ltd", + [3]byte{208, 225, 64}: "Apple, Inc.", + [3]byte{208, 227, 71}: "Yoga", + [3]byte{208, 228, 11}: "Wearable Inc.", + [3]byte{208, 228, 74}: "Murata Manufacturing Co., Ltd.", + [3]byte{208, 229, 77}: "ARRIS Group, Inc.", + [3]byte{208, 231, 130}: "AzureWave Technology Inc.", + [3]byte{208, 235, 3}: "Zhehua technology limited", + [3]byte{208, 235, 158}: "Seowoo Inc.", + [3]byte{208, 240, 219}: "Ericsson", + [3]byte{208, 242, 127}: "SteadyServ Technoligies, LLC", + [3]byte{208, 247, 59}: "Helmut Mauell GmbH Werk Weida", + [3]byte{208, 248, 140}: "Motorola (Wuhan) Mobility Technologies Communication Co., Ltd.", + [3]byte{208, 250, 29}: "Qihoo 360 Technology Co.,Ltd", + [3]byte{208, 252, 204}: "Samsung Electronics Co.,Ltd", + [3]byte{208, 255, 80}: "Texas Instruments", + [3]byte{208, 255, 152}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{212, 0, 13}: "Phoenix Broadband Technologies, LLC.", + [3]byte{212, 0, 87}: "MC Technologies GmbH", + [3]byte{212, 1, 41}: "Broadcom", + [3]byte{212, 1, 109}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{212, 2, 74}: "Delphian Systems LLC", + [3]byte{212, 4, 205}: "ARRIS Group, Inc.", + [3]byte{212, 4, 255}: "Juniper Networks", + [3]byte{212, 5, 152}: "ARRIS Group, Inc.", + [3]byte{212, 10, 169}: "ARRIS Group, Inc.", + [3]byte{212, 11, 26}: "HTC Corporation", + [3]byte{212, 11, 185}: "Solid Semecs bv.", + [3]byte{212, 15, 178}: "Applied Micro Electronics AME bv", + [3]byte{212, 16, 144}: "iNFORM Systems AG", + [3]byte{212, 16, 207}: "Huanshun Network Science and Technology Co., Ltd.", + [3]byte{212, 17, 214}: "ShotSpotter, Inc.", + [3]byte{212, 18, 150}: "Anobit Technologies Ltd.", + [3]byte{212, 18, 187}: "Quadrant Components Inc. Ltd", + [3]byte{212, 19, 111}: "Asia Pacific Brands", + [3]byte{212, 26, 63}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{212, 28, 28}: "RCF S.P.A.", + [3]byte{212, 29, 113}: "Palo Alto Networks", + [3]byte{212, 30, 53}: "TOHO Electronics INC.", + [3]byte{212, 31, 12}: "JAI Oy", + [3]byte{212, 32, 109}: "HTC Corporation", + [3]byte{212, 33, 34}: "Sercomm Corporation", + [3]byte{212, 34, 63}: "Lenovo Mobile Communication Technology Ltd.", + [3]byte{212, 34, 78}: "Alcatel Lucent", + [3]byte{212, 37, 139}: "Intel Corporate", + [3]byte{212, 39, 81}: "Infopia Co., Ltd", + [3]byte{212, 40, 178}: "ioBridge, Inc.", + [3]byte{212, 40, 213}: "TCT mobile ltd", + [3]byte{212, 41, 234}: "Zimory GmbH", + [3]byte{212, 44, 15}: "ARRIS Group, Inc.", + [3]byte{212, 44, 61}: "Sky Light Digital Limited", + [3]byte{212, 44, 68}: "Cisco Systems, Inc", + [3]byte{212, 47, 35}: "Akenori PTE Ltd", + [3]byte{212, 49, 157}: "Sinwatec", + [3]byte{212, 50, 102}: "Fike Corporation", + [3]byte{212, 54, 57}: "Texas Instruments", + [3]byte{212, 54, 219}: "Jiangsu Toppower Automotive Electronics Co., Ltd", + [3]byte{212, 55, 215}: "zte corporation", + [3]byte{212, 56, 156}: "Sony Mobile Communications AB", + [3]byte{212, 58, 101}: "IGRS Engineering Lab Ltd.", + [3]byte{212, 58, 233}: "DONGGUAN ipt INDUSTRIAL CO., LTD", + [3]byte{212, 61, 103}: "Carma Industries Inc.", + [3]byte{212, 61, 126}: "Micro-Star Int'l Co, Ltd", + [3]byte{212, 64, 240}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{212, 65, 101}: "SICHUAN TIANYI COMHEART TELECOMCO.,LTD", + [3]byte{212, 67, 168}: "Changzhou Haojie Electric Co., Ltd.", + [3]byte{212, 69, 232}: "Jiangxi Hongpai Technology Co., Ltd.", + [3]byte{212, 75, 94}: "TAIYO YUDEN CO., LTD.", + [3]byte{212, 76, 36}: "Vuppalamritha Magnetic Components LTD", + [3]byte{212, 76, 156}: "Shenzhen YOOBAO Technology Co.Ltd", + [3]byte{212, 76, 167}: "Informtekhnika & Communication, LLC", + [3]byte{212, 79, 128}: "Kemper Digital GmbH", + [3]byte{212, 80, 63}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{212, 80, 122}: "CEIVA Logic, Inc", + [3]byte{212, 82, 42}: "TangoWiFi.com", + [3]byte{212, 82, 81}: "IBT Ingenieurbureau Broennimann Thun", + [3]byte{212, 82, 151}: "nSTREAMS Technologies, Inc.", + [3]byte{212, 83, 175}: "VIGO System S.A.", + [3]byte{212, 85, 86}: "Fiber Mountain Inc.", + [3]byte{212, 85, 190}: "SHENZHEN FAST TECHNOLOGIES CO.,LTD", + [3]byte{212, 90, 178}: "Galleon Systems", + [3]byte{212, 92, 112}: "Wi-Fi Alliance", + [3]byte{212, 93, 66}: "Nokia Corporation", + [3]byte{212, 93, 223}: "PEGATRON CORPORATION", + [3]byte{212, 95, 37}: "Shenzhen YOUHUA Technology Co., Ltd", + [3]byte{212, 97, 46}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{212, 97, 50}: "Pro Concept Manufacturer Co.,Ltd.", + [3]byte{212, 97, 157}: "Apple, Inc.", + [3]byte{212, 97, 254}: "Hangzhou H3C Technologies Co., Limited", + [3]byte{212, 99, 198}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{212, 99, 254}: "Arcadyan Corporation", + [3]byte{212, 100, 247}: "CHENGDU USEE DIGITAL TECHNOLOGY CO., LTD", + [3]byte{212, 102, 168}: "Riedo Networks GmbH", + [3]byte{212, 103, 97}: "SAHAB TECHNOLOGY", + [3]byte{212, 103, 231}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{212, 104, 77}: "Ruckus Wireless", + [3]byte{212, 104, 103}: "Neoventus Design Group", + [3]byte{212, 104, 186}: "Shenzhen Sundray Technologies Company Limited", + [3]byte{212, 106, 106}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{212, 106, 145}: "Snap AV", + [3]byte{212, 106, 168}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{212, 108, 191}: "Goodrich ISR", + [3]byte{212, 108, 218}: "CSM GmbH", + [3]byte{212, 109, 80}: "Cisco Systems, Inc", + [3]byte{212, 110, 14}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{212, 110, 92}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{212, 111, 66}: "WAXESS USA Inc", + [3]byte{212, 114, 8}: "Bragi GmbH", + [3]byte{212, 118, 234}: "zte corporation", + [3]byte{212, 120, 86}: "Avaya Inc", + [3]byte{212, 121, 195}: "Cameronet GmbH & Co. KG", + [3]byte{212, 122, 226}: "Samsung Electronics Co.,Ltd", + [3]byte{212, 123, 53}: "NEO Monitors AS", + [3]byte{212, 123, 117}: "HARTING Electronics GmbH", + [3]byte{212, 123, 176}: "ASKEY COMPUTER CORP", + [3]byte{212, 125, 252}: "TECNO MOBILE LIMITED", + [3]byte{212, 129, 202}: "iDevices, LLC", + [3]byte{212, 129, 215}: "Dell Inc.", + [3]byte{212, 130, 62}: "Argosy Technologies, Ltd.", + [3]byte{212, 131, 4}: "SHENZHEN FAST TECHNOLOGIES CO.,LTD", + [3]byte{212, 133, 100}: "Hewlett Packard", + [3]byte{212, 135, 216}: "Samsung Electronics Co.,Ltd", + [3]byte{212, 136, 63}: "HDPRO CO., LTD.", + [3]byte{212, 136, 144}: "Samsung Electronics Co.,Ltd", + [3]byte{212, 140, 181}: "Cisco Systems, Inc", + [3]byte{212, 141, 217}: "Meld Technology, Inc", + [3]byte{212, 143, 51}: "Microsoft Corporation", + [3]byte{212, 143, 170}: "Sogecam Industrial, S.A.", + [3]byte{212, 144, 224}: "Topcon Electronics GmbH & Co. KG", + [3]byte{212, 145, 175}: "Electroacustica General Iberica, S.A.", + [3]byte{212, 147, 152}: "Nokia Corporation", + [3]byte{212, 147, 160}: "Fidelix Oy", + [3]byte{212, 148, 90}: "COSMO CO., LTD", + [3]byte{212, 148, 161}: "Texas Instruments", + [3]byte{212, 148, 232}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{212, 149, 36}: "Clover Network, Inc.", + [3]byte{212, 150, 223}: "SUNGJIN C&T CO.,LTD", + [3]byte{212, 151, 11}: "Xiaomi Communications Co Ltd", + [3]byte{212, 154, 32}: "Apple, Inc.", + [3]byte{212, 155, 92}: "Chongqing Miedu Technology Co., Ltd.", + [3]byte{212, 156, 40}: "JayBird LLC", + [3]byte{212, 156, 142}: "University of FUKUI", + [3]byte{212, 158, 109}: "Wuhan Zhongyuan Huadian Science & Technology Co.,", + [3]byte{212, 160, 42}: "Cisco Systems, Inc", + [3]byte{212, 161, 72}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{212, 164, 37}: "SMAX Technology Co., Ltd.", + [3]byte{212, 164, 153}: "InView Technology Corporation", + [3]byte{212, 169, 40}: "GreenWave Reality Inc", + [3]byte{212, 170, 255}: "MICRO WORLD", + [3]byte{212, 172, 78}: "BODi rS, LLC", + [3]byte{212, 173, 45}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{212, 174, 5}: "Samsung Electronics Co.,Ltd", + [3]byte{212, 174, 82}: "Dell Inc.", + [3]byte{212, 177, 16}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{212, 177, 105}: "Le Shi Zhi Xin Electronic Technology (Tianjin) Limited", + [3]byte{212, 178, 122}: "ARRIS Group, Inc.", + [3]byte{212, 180, 62}: "Messcomp Datentechnik GmbH", + [3]byte{212, 184, 255}: "Home Control Singapore Pte Ltd", + [3]byte{212, 190, 217}: "Dell Inc.", + [3]byte{212, 191, 45}: "SE Controls Asia Pacific Ltd", + [3]byte{212, 191, 127}: "UPVEL", + [3]byte{212, 193, 200}: "zte corporation", + [3]byte{212, 193, 252}: "Nokia Corporation", + [3]byte{212, 199, 102}: "Acentic GmbH", + [3]byte{212, 200, 176}: "Prime Electronics & Satellitics Inc.", + [3]byte{212, 201, 178}: "Quanergy Systems Inc", + [3]byte{212, 201, 239}: "Hewlett Packard", + [3]byte{212, 202, 109}: "Routerboard.com", + [3]byte{212, 202, 110}: "u-blox AG", + [3]byte{212, 203, 175}: "Nokia Corporation", + [3]byte{212, 206, 184}: "Enatel LTD", + [3]byte{212, 207, 55}: "Symbolic IO", + [3]byte{212, 207, 249}: "Shenzhen Sen5 Technology Co., Ltd.", + [3]byte{212, 209, 132}: "ADB Broadband Italia", + [3]byte{212, 210, 73}: "Power Ethernet", + [3]byte{212, 210, 229}: "BKAV Corporation", + [3]byte{212, 213, 13}: "Southwest Microwave, Inc", + [3]byte{212, 215, 72}: "Cisco Systems, Inc", + [3]byte{212, 215, 169}: "Shanghai Kaixiang Info Tech LTD", + [3]byte{212, 216, 152}: "Korea CNO Tech Co., Ltd", + [3]byte{212, 217, 25}: "GoPro", + [3]byte{212, 220, 205}: "Apple, Inc.", + [3]byte{212, 223, 87}: "Alpinion Medical Systems", + [3]byte{212, 224, 142}: "ValueHD Corporation", + [3]byte{212, 227, 44}: "S. Siedle & Sohne", + [3]byte{212, 227, 63}: "Nokia", + [3]byte{212, 232, 178}: "Samsung Electronics Co.,Ltd", + [3]byte{212, 233, 11}: "CVT CO.,LTD", + [3]byte{212, 234, 14}: "Avaya Inc", + [3]byte{212, 236, 12}: "Harley-Davidson Motor Company", + [3]byte{212, 236, 134}: "LinkedHope Intelligent Technologies Co., Ltd", + [3]byte{212, 238, 7}: "HIWIFI Co., Ltd.", + [3]byte{212, 240, 39}: "Navetas Energy Management", + [3]byte{212, 240, 180}: "Napco Security Technologies", + [3]byte{212, 241, 67}: "IPROAD.,Inc", + [3]byte{212, 242, 7}: "DIAODIAO(Beijing)Technology CO.,Ltd", + [3]byte{212, 244, 111}: "Apple, Inc.", + [3]byte{212, 244, 190}: "Palo Alto Networks", + [3]byte{212, 245, 19}: "Texas Instruments", + [3]byte{212, 246, 63}: "IEA S.R.L.", + [3]byte{212, 249, 161}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{216, 0, 77}: "Apple, Inc.", + [3]byte{216, 5, 46}: "Skyviia Corporation", + [3]byte{216, 6, 209}: "Honeywell Fire System (Shanghai) Co,. Ltd.", + [3]byte{216, 8, 49}: "Samsung Electronics Co.,Ltd", + [3]byte{216, 8, 245}: "Arcadia Networks Co. Ltd.", + [3]byte{216, 9, 195}: "Cercacor Labs", + [3]byte{216, 12, 207}: "C.G.V. S.A.S.", + [3]byte{216, 13, 227}: "FXI TECHNOLOGIES AS", + [3]byte{216, 15, 153}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{216, 20, 214}: "SURE SYSTEM Co Ltd", + [3]byte{216, 21, 13}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{216, 22, 10}: "Nippon Electro-Sensory Devices", + [3]byte{216, 22, 193}: "DEWAV (HK) ELECTRONICS LIMITED", + [3]byte{216, 24, 43}: "Conti Temic Microelectronic GmbH", + [3]byte{216, 25, 122}: "Nuheara Ltd", + [3]byte{216, 25, 206}: "Telesquare", + [3]byte{216, 27, 254}: "TWINLINX CORPORATION", + [3]byte{216, 28, 20}: "Compacta International, Ltd.", + [3]byte{216, 29, 114}: "Apple, Inc.", + [3]byte{216, 30, 222}: "B&W Group Ltd", + [3]byte{216, 31, 204}: "Brocade Communications Systems, Inc.", + [3]byte{216, 32, 159}: "Cubro Acronet GesmbH", + [3]byte{216, 34, 244}: "Avnet Silica", + [3]byte{216, 36, 189}: "Cisco Systems, Inc", + [3]byte{216, 37, 34}: "ARRIS Group, Inc.", + [3]byte{216, 37, 176}: "Rockeetech Systems Co.,Ltd.", + [3]byte{216, 38, 185}: "Guangdong Coagent Electronics S&T Co.,Ltd.", + [3]byte{216, 39, 12}: "MaxTronic International Co., Ltd.", + [3]byte{216, 40, 201}: "General Electric Consumer and Industrial", + [3]byte{216, 41, 22}: "Ascent Communication Technology", + [3]byte{216, 41, 134}: "Best Wish Technology LTD", + [3]byte{216, 42, 21}: "Leitner SpA", + [3]byte{216, 42, 126}: "Nokia Corporation", + [3]byte{216, 45, 155}: "Shenzhen G.Credit Communication Technology Co., Ltd", + [3]byte{216, 45, 225}: "Tricascade Inc.", + [3]byte{216, 48, 98}: "Apple, Inc.", + [3]byte{216, 49, 207}: "Samsung Electronics Co.,Ltd", + [3]byte{216, 50, 20}: "Tenda Technology Co.,Ltd.Dongguan branch", + [3]byte{216, 50, 90}: "Shenzhen YOUHUA Technology Co., Ltd", + [3]byte{216, 51, 127}: "Office FA.com Co.,Ltd.", + [3]byte{216, 55, 190}: "SHENZHEN GONGJIN ELECTRONICS CO.,LT", + [3]byte{216, 56, 13}: "SHENZHEN IP-COM Network Co.,Ltd", + [3]byte{216, 56, 252}: "Ruckus Wireless", + [3]byte{216, 60, 105}: "Shenzhen TINNO Mobile Technology Corp.", + [3]byte{216, 66, 172}: "Shanghai Feixun Communication Co.,Ltd.", + [3]byte{216, 66, 226}: "Canary Connect, Inc.", + [3]byte{216, 67, 237}: "Suzuken", + [3]byte{216, 69, 43}: "Integrated Device Technology (Malaysia) Sdn. Bhd.", + [3]byte{216, 70, 6}: "Silicon Valley Global Marketing", + [3]byte{216, 71, 16}: "Sichuan Changhong Electric Ltd.", + [3]byte{216, 72, 238}: "Hangzhou Xueji Technology Co., Ltd.", + [3]byte{216, 73, 11}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{216, 73, 47}: "CANON INC.", + [3]byte{216, 74, 135}: "OI ELECTRIC CO.,LTD", + [3]byte{216, 75, 42}: "Cognitas Technologies, Inc.", + [3]byte{216, 79, 184}: "LG ELECTRONICS", + [3]byte{216, 80, 230}: "ASUSTek COMPUTER INC.", + [3]byte{216, 84, 58}: "Texas Instruments", + [3]byte{216, 84, 162}: "Aerohive Networks Inc.", + [3]byte{216, 85, 163}: "zte corporation", + [3]byte{216, 87, 239}: "Samsung Electronics Co.,Ltd", + [3]byte{216, 88, 215}: "CZ.NIC, z.s.p.o.", + [3]byte{216, 91, 42}: "Samsung Electronics Co.,Ltd", + [3]byte{216, 93, 76}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{216, 93, 132}: "CAx soft GmbH", + [3]byte{216, 93, 226}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{216, 93, 239}: "Busch-Jaeger Elektro GmbH", + [3]byte{216, 93, 251}: "Private", + [3]byte{216, 96, 176}: "bioMérieux Italia S.p.A.", + [3]byte{216, 96, 179}: "Guangdong Global Electronic Technology CO.,LTD", + [3]byte{216, 97, 98}: "Wistron Neweb Corporation", + [3]byte{216, 97, 148}: "Objetivos y Sevicios de Valor Añadido", + [3]byte{216, 98, 219}: "Eno Inc.", + [3]byte{216, 99, 117}: "Xiaomi Communications Co Ltd", + [3]byte{216, 101, 149}: "Toy's Myth Inc.", + [3]byte{216, 102, 198}: "Shenzhen Daystar Technology Co.,ltd", + [3]byte{216, 102, 238}: "BOXIN COMMUNICATION CO.,LTD.", + [3]byte{216, 103, 217}: "Cisco Systems, Inc", + [3]byte{216, 105, 96}: "Steinsvik", + [3]byte{216, 107, 247}: "Nintendo Co., Ltd.", + [3]byte{216, 108, 2}: "Huaqin Telecom Technology Co.,Ltd", + [3]byte{216, 108, 99}: "Google, Inc.", + [3]byte{216, 108, 233}: "Sagemcom Broadband SAS", + [3]byte{216, 113, 87}: "Lenovo Mobile Communication Technology Ltd.", + [3]byte{216, 116, 149}: "zte corporation", + [3]byte{216, 117, 51}: "Nokia Corporation", + [3]byte{216, 118, 10}: "Escort, Inc.", + [3]byte{216, 120, 229}: "KUHN SA", + [3]byte{216, 121, 136}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{216, 124, 221}: "SANIX INCORPORATED", + [3]byte{216, 126, 177}: "x.o.ware, inc.", + [3]byte{216, 128, 57}: "Microchip Technology Inc.", + [3]byte{216, 128, 60}: "Anhui Huami Information Technology Company Limited", + [3]byte{216, 129, 206}: "AHN INC.", + [3]byte{216, 132, 102}: "Extreme Networks, Inc.", + [3]byte{216, 135, 213}: "Leadcore Technology CO.,LTD", + [3]byte{216, 136, 206}: "RF Technology Pty Ltd", + [3]byte{216, 138, 59}: "UNIT-EM", + [3]byte{216, 139, 76}: "KingTing Tech.", + [3]byte{216, 141, 92}: "Elentec", + [3]byte{216, 143, 118}: "Apple, Inc.", + [3]byte{216, 144, 232}: "Samsung Electronics Co.,Ltd", + [3]byte{216, 147, 65}: "General Electric Global Research", + [3]byte{216, 148, 3}: "Hewlett Packard Enterprise", + [3]byte{216, 149, 47}: "Texas Instruments", + [3]byte{216, 150, 133}: "GoPro", + [3]byte{216, 150, 149}: "Apple, Inc.", + [3]byte{216, 150, 224}: "Alibaba Cloud Computing Ltd.", + [3]byte{216, 151, 59}: "Artesyn Embedded Technologies", + [3]byte{216, 151, 96}: "C2 Development, Inc.", + [3]byte{216, 151, 124}: "Grey Innovation", + [3]byte{216, 151, 186}: "PEGATRON CORPORATION", + [3]byte{216, 154, 52}: "Beijing SHENQI Technology Co., Ltd.", + [3]byte{216, 157, 103}: "Hewlett Packard", + [3]byte{216, 157, 185}: "eMegatech International Corp.", + [3]byte{216, 158, 63}: "Apple, Inc.", + [3]byte{216, 158, 243}: "Dell Inc.", + [3]byte{216, 160, 29}: "Espressif Inc.", + [3]byte{216, 161, 5}: "Syslane, Co., Ltd.", + [3]byte{216, 162, 94}: "Apple, Inc.", + [3]byte{216, 165, 52}: "Spectronix Corporation", + [3]byte{216, 173, 221}: "Sonavation, Inc.", + [3]byte{216, 174, 144}: "Itibia Technologies", + [3]byte{216, 175, 59}: "Hangzhou Bigbright Integrated communications system Co.,Ltd", + [3]byte{216, 175, 241}: "Panasonic Appliances Company", + [3]byte{216, 176, 46}: "Guangzhou Zonerich Business Machine Co., LTD.", + [3]byte{216, 176, 76}: "Jinan USR IOT Technology Co., Ltd.", + [3]byte{216, 177, 34}: "Juniper Networks", + [3]byte{216, 177, 42}: "Panasonic Mobile Communications Co.,Ltd.", + [3]byte{216, 177, 144}: "Cisco Systems, Inc", + [3]byte{216, 179, 119}: "HTC Corporation", + [3]byte{216, 182, 183}: "Comtrend Corporation", + [3]byte{216, 182, 193}: "NetworkAccountant, Inc.", + [3]byte{216, 182, 214}: "Blu Tether Limited", + [3]byte{216, 184, 246}: "Nantworks", + [3]byte{216, 185, 14}: "Triple Domain Vision Co.,Ltd.", + [3]byte{216, 187, 44}: "Apple, Inc.", + [3]byte{216, 191, 76}: "Victory Concept Electronics Limited", + [3]byte{216, 192, 104}: "Netgenetech.co.,ltd.", + [3]byte{216, 192, 106}: "Hunantv.com Interactive Entertainment Media Co.,Ltd.", + [3]byte{216, 195, 251}: "DETRACOM", + [3]byte{216, 196, 106}: "Murata Manufacturing Co., Ltd.", + [3]byte{216, 196, 151}: "Quanta Computer Inc.", + [3]byte{216, 196, 233}: "Samsung Electronics Co.,Ltd", + [3]byte{216, 198, 145}: "Hichan Technology Corp.", + [3]byte{216, 199, 113}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{216, 199, 200}: "Aruba Networks", + [3]byte{216, 200, 233}: "Phicomm (Shanghai) Co., Ltd.", + [3]byte{216, 201, 157}: "EA DISPLAY LIMITED", + [3]byte{216, 203, 138}: "Micro-Star INTL CO., LTD.", + [3]byte{216, 207, 156}: "Apple, Inc.", + [3]byte{216, 209, 203}: "Apple, Inc.", + [3]byte{216, 210, 124}: "JEMA ENERGY, SA", + [3]byte{216, 211, 133}: "Hewlett Packard", + [3]byte{216, 212, 60}: "Sony Corporation", + [3]byte{216, 213, 185}: "Rainforest Automation, Inc.", + [3]byte{216, 214, 126}: "GSK CNC EQUIPMENT CO.,LTD", + [3]byte{216, 215, 35}: "IDS, Inc", + [3]byte{216, 216, 102}: "SHENZHEN TOZED TECHNOLOGIES CO.,LTD.", + [3]byte{216, 218, 82}: "APATOR S.A.", + [3]byte{216, 220, 233}: "Kunshan Erlab ductless filtration system Co.,Ltd", + [3]byte{216, 221, 95}: "BALMUDA Inc.", + [3]byte{216, 221, 253}: "Texas Instruments", + [3]byte{216, 222, 206}: "ISUNG CO.,LTD", + [3]byte{216, 223, 13}: "beroNet GmbH", + [3]byte{216, 223, 122}: "Quest Software, Inc.", + [3]byte{216, 224, 4}: "Vodia Networks Inc", + [3]byte{216, 224, 184}: "BULAT LLC", + [3]byte{216, 224, 225}: "Samsung Electronics Co.,Ltd", + [3]byte{216, 227, 174}: "CIRTEC MEDICAL SYSTEMS", + [3]byte{216, 229, 109}: "TCT mobile ltd", + [3]byte{216, 231, 43}: "NetScout Systems, Inc.", + [3]byte{216, 231, 67}: "Wush, Inc", + [3]byte{216, 233, 82}: "KEOPSYS", + [3]byte{216, 235, 151}: "TRENDnet, Inc.", + [3]byte{216, 237, 28}: "Magna Technology SL", + [3]byte{216, 238, 120}: "Moog Protokraft", + [3]byte{216, 239, 205}: "Nokia", + [3]byte{216, 240, 242}: "Zeebo Inc", + [3]byte{216, 241, 240}: "Pepxim International Limited", + [3]byte{216, 247, 16}: "Libre Wireless Technologies Inc.", + [3]byte{216, 251, 17}: "AXACORE", + [3]byte{216, 251, 94}: "ASKEY COMPUTER CORP", + [3]byte{216, 251, 104}: "Cloud Corner Ltd.", + [3]byte{216, 252, 56}: "Giantec Semiconductor Inc", + [3]byte{216, 252, 147}: "Intel Corporate", + [3]byte{216, 254, 143}: "IDFone Co., Ltd.", + [3]byte{216, 254, 227}: "D-Link International", + [3]byte{220, 0, 119}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{220, 2, 101}: "Meditech Kft", + [3]byte{220, 2, 142}: "zte corporation", + [3]byte{220, 5, 47}: "National Products Inc.", + [3]byte{220, 5, 117}: "SIEMENS ENERGY AUTOMATION", + [3]byte{220, 5, 237}: "Nabtesco Corporation", + [3]byte{220, 7, 193}: "HangZhou QiYang Technology Co.,Ltd.", + [3]byte{220, 8, 86}: "Alcatel-Lucent Enterprise", + [3]byte{220, 9, 20}: "Talk-A-Phone Co.", + [3]byte{220, 9, 76}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{220, 11, 26}: "ADB Broadband Italia", + [3]byte{220, 11, 52}: "LG Electronics (Mobile Communications)", + [3]byte{220, 12, 45}: "WEIFANG GOERTEK ELECTRONICS CO.,LTD", + [3]byte{220, 12, 92}: "Apple, Inc.", + [3]byte{220, 13, 48}: "Shenzhen Feasycom Technology Co., Ltd.", + [3]byte{220, 14, 161}: "COMPAL INFORMATION (KUNSHAN) CO., LTD.", + [3]byte{220, 21, 219}: "Ge Ruili Intelligent Technology ( Beijing ) Co., Ltd.", + [3]byte{220, 22, 162}: "Medtronic Diabetes", + [3]byte{220, 23, 90}: "Hitachi High-Technologies Corporation", + [3]byte{220, 23, 146}: "Captivate Network", + [3]byte{220, 26, 1}: "Ecoliv Technology ( Shenzhen ) Ltd.", + [3]byte{220, 26, 197}: "vivo Mobile Communication Co., Ltd.", + [3]byte{220, 29, 159}: "U & B tech", + [3]byte{220, 29, 212}: "Microstep-MIS spol. s r.o.", + [3]byte{220, 30, 163}: "Accensus LLC", + [3]byte{220, 32, 8}: "ASD Electronics Ltd", + [3]byte{220, 40, 52}: "HAKKO Corporation", + [3]byte{220, 41, 58}: "Shenzhen Nuoshi Technology Co., LTD.", + [3]byte{220, 42, 20}: "Shanghai Longjing Technology Co.", + [3]byte{220, 43, 42}: "Apple, Inc.", + [3]byte{220, 43, 97}: "Apple, Inc.", + [3]byte{220, 43, 102}: "InfoBLOCK S.A. de C.V.", + [3]byte{220, 43, 202}: "Zera GmbH", + [3]byte{220, 44, 38}: "Iton Technology Limited", + [3]byte{220, 45, 203}: "Beijing Unis HengYue Technology Co., Ltd.", + [3]byte{220, 46, 106}: "HCT. Co., Ltd.", + [3]byte{220, 47, 3}: "Step forward Group Co., Ltd.", + [3]byte{220, 48, 156}: "Heyrex Limited", + [3]byte{220, 51, 13}: "Qingdao Haier Telecom Co.,Ltd", + [3]byte{220, 51, 80}: "TechSAT GmbH", + [3]byte{220, 53, 241}: "Positivo Informática SA.", + [3]byte{220, 55, 20}: "Apple, Inc.", + [3]byte{220, 55, 82}: "GE", + [3]byte{220, 55, 210}: "Hunan HKT Electronic Technology Co., Ltd", + [3]byte{220, 56, 225}: "Juniper Networks", + [3]byte{220, 57, 121}: "Skyport Systems", + [3]byte{220, 58, 94}: "Roku, Inc.", + [3]byte{220, 60, 46}: "Manufacturing System Insights, Inc.", + [3]byte{220, 60, 132}: "Ticom Geomatics, Inc.", + [3]byte{220, 60, 246}: "Atomic Rules LLC", + [3]byte{220, 62, 81}: "Solberg & Andersen AS", + [3]byte{220, 62, 248}: "Nokia Corporation", + [3]byte{220, 65, 95}: "Apple, Inc.", + [3]byte{220, 68, 39}: "IEEE Registration Authority", + [3]byte{220, 68, 109}: "Allwinner Technology Co., Ltd", + [3]byte{220, 68, 182}: "Samsung Electronics Co.,Ltd", + [3]byte{220, 69, 23}: "ARRIS Group, Inc.", + [3]byte{220, 72, 178}: "Baraja Pty. Ltd.", + [3]byte{220, 73, 201}: "CASCO SIGNAL LTD", + [3]byte{220, 74, 62}: "Hewlett Packard", + [3]byte{220, 77, 35}: "MRV Comunications", + [3]byte{220, 78, 222}: "SHINYEI TECHNOLOGY CO., LTD.", + [3]byte{220, 79, 34}: "Espressif Inc.", + [3]byte{220, 83, 96}: "Intel Corporate", + [3]byte{220, 83, 124}: "Compal Broadband Networks, Inc.", + [3]byte{220, 85, 131}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{220, 86, 230}: "Shenzhen Bococom Technology Co.,LTD", + [3]byte{220, 87, 38}: "Power-One", + [3]byte{220, 94, 54}: "Paterson Technology", + [3]byte{220, 96, 161}: "Teledyne DALSA Professional Imaging", + [3]byte{220, 100, 124}: "C.R.S. iiMotion GmbH", + [3]byte{220, 100, 184}: "Shenzhen JingHanDa Electronics Co.Ltd", + [3]byte{220, 102, 58}: "Apacer Technology Inc.", + [3]byte{220, 102, 114}: "Samsung Electronics Co.,Ltd", + [3]byte{220, 104, 235}: "Nintendo Co.,Ltd", + [3]byte{220, 106, 234}: "Infinix mobility limited", + [3]byte{220, 109, 205}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{220, 111, 0}: "Livescribe, Inc.", + [3]byte{220, 111, 8}: "Bay Storage Technology", + [3]byte{220, 112, 20}: "Private", + [3]byte{220, 113, 68}: "SAMSUNG ELECTRO MECHANICS CO., LTD.", + [3]byte{220, 116, 168}: "Samsung Electronics Co.,Ltd", + [3]byte{220, 120, 52}: "LOGICOM SA", + [3]byte{220, 123, 148}: "Cisco Systems, Inc", + [3]byte{220, 127, 164}: "2Wire Inc", + [3]byte{220, 130, 91}: "JANUS, spol. s r.o.", + [3]byte{220, 130, 246}: "iPort", + [3]byte{220, 133, 222}: "AzureWave Technology Inc.", + [3]byte{220, 134, 216}: "Apple, Inc.", + [3]byte{220, 154, 142}: "Nanjing Cocomm electronics co., LTD", + [3]byte{220, 155, 30}: "Intercom, Inc.", + [3]byte{220, 155, 156}: "Apple, Inc.", + [3]byte{220, 156, 82}: "Sapphire Technology Limited.", + [3]byte{220, 156, 159}: "Shenzhen YOUHUA Technology Co., Ltd", + [3]byte{220, 159, 164}: "Nokia Corporation", + [3]byte{220, 159, 219}: "Ubiquiti Networks Inc.", + [3]byte{220, 163, 172}: "RBcloudtech", + [3]byte{220, 164, 202}: "Apple, Inc.", + [3]byte{220, 165, 244}: "Cisco Systems, Inc", + [3]byte{220, 166, 189}: "Beijing Lanbo Technology Co., Ltd.", + [3]byte{220, 167, 217}: "Compressor Controls Corp", + [3]byte{220, 168, 207}: "New Spin Golf, LLC.", + [3]byte{220, 169, 4}: "Apple, Inc.", + [3]byte{220, 169, 113}: "Intel Corporate", + [3]byte{220, 169, 137}: "MACANDC", + [3]byte{220, 173, 158}: "GreenPriz", + [3]byte{220, 174, 4}: "CELOXICA Ltd", + [3]byte{220, 176, 88}: "Bürkert Werke GmbH", + [3]byte{220, 179, 180}: "Honeywell Environmental & Combustion Controls (Tianjin) Co., Ltd.", + [3]byte{220, 180, 196}: "Microsoft XCG", + [3]byte{220, 190, 122}: "Zhejiang Nurotron Biotechnology Co.", + [3]byte{220, 191, 144}: "HUIZHOU QIAOXING TELECOMMUNICATION INDUSTRY CO.,LTD.", + [3]byte{220, 191, 233}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{220, 192, 219}: "Shenzhen Kaiboer Technology Co., Ltd.", + [3]byte{220, 192, 235}: "ASSA ABLOY CÔTE PICARDE", + [3]byte{220, 193, 1}: "SOLiD Technologies, Inc.", + [3]byte{220, 196, 34}: "Systembase Limited", + [3]byte{220, 198, 34}: "BUHEUNG SYSTEM", + [3]byte{220, 198, 75}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{220, 199, 147}: "Nokia Corporation", + [3]byte{220, 200, 245}: "Shanghai UMEinfo CO.,LTD.", + [3]byte{220, 203, 168}: "Explora Technologies Inc", + [3]byte{220, 206, 65}: "FE GLOBAL HONG KONG LIMITED", + [3]byte{220, 206, 188}: "Shenzhen JSR Technology Co.,Ltd.", + [3]byte{220, 206, 193}: "Cisco Systems, Inc", + [3]byte{220, 207, 148}: "Beijing Rongcheng Hutong Technology Co., Ltd.", + [3]byte{220, 207, 150}: "Samsung Electronics Co.,Ltd", + [3]byte{220, 208, 247}: "Bentek Systems Ltd.", + [3]byte{220, 210, 85}: "Kinpo Electronics, Inc.", + [3]byte{220, 210, 252}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{220, 211, 33}: "HUMAX Co., Ltd.", + [3]byte{220, 213, 42}: "Sunny Heart Limited", + [3]byte{220, 216, 124}: "Beijing Jingdong Century Trading Co., LTD.", + [3]byte{220, 216, 127}: "Shenzhen JoinCyber Telecom Equipment Ltd", + [3]byte{220, 217, 22}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{220, 218, 79}: "GETCK TECHNOLOGY, INC", + [3]byte{220, 219, 112}: "Tonfunk Systementwicklung und Service GmbH", + [3]byte{220, 220, 7}: "TRP Systems BV", + [3]byte{220, 222, 202}: "Akyllor", + [3]byte{220, 224, 38}: "Patrol Tag, Inc", + [3]byte{220, 225, 173}: "Shenzhen Wintop Photoelectric Technology Co., Ltd", + [3]byte{220, 226, 172}: "Lumens Digital Optics Inc.", + [3]byte{220, 229, 120}: "Experimental Factory of Scientific Engineering and Special Design Department", + [3]byte{220, 231, 28}: "AUG Elektronik GmbH", + [3]byte{220, 232, 56}: "CK Telecom (Shenzhen) Limited", + [3]byte{220, 235, 83}: "Wuhan QianXiao Elecronic Technology CO.,LTD", + [3]byte{220, 235, 148}: "Cisco Systems, Inc", + [3]byte{220, 236, 6}: "Heimi Network Technology Co., Ltd.", + [3]byte{220, 238, 6}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{220, 239, 9}: "NETGEAR", + [3]byte{220, 239, 202}: "Murata Manufacturing Co., Ltd.", + [3]byte{220, 240, 93}: "Letta Teknoloji", + [3]byte{220, 240, 144}: "Nubia Technology Co.,Ltd.", + [3]byte{220, 241, 16}: "Nokia Corporation", + [3]byte{220, 247, 85}: "SITRONIK", + [3]byte{220, 248, 88}: "Lorent Networks, Inc.", + [3]byte{220, 250, 213}: "STRONG Ges.m.b.H.", + [3]byte{220, 251, 2}: "BUFFALO.INC", + [3]byte{220, 254, 7}: "PEGATRON CORPORATION", + [3]byte{220, 254, 24}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{224, 3, 112}: "ShenZhen Continental Wireless Technology Co., Ltd.", + [3]byte{224, 5, 197}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{224, 6, 230}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{224, 7, 27}: "Hewlett Packard Enterprise", + [3]byte{224, 11, 40}: "Inovonics", + [3]byte{224, 12, 127}: "Nintendo Co., Ltd.", + [3]byte{224, 13, 185}: "Cree, Inc.", + [3]byte{224, 14, 218}: "Cisco Systems, Inc", + [3]byte{224, 16, 127}: "Ruckus Wireless", + [3]byte{224, 20, 62}: "Modoosis Inc.", + [3]byte{224, 24, 119}: "FUJITSU LIMITED", + [3]byte{224, 25, 29}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{224, 26, 234}: "Allied Telesis, Inc.", + [3]byte{224, 28, 65}: "Aerohive Networks Inc.", + [3]byte{224, 28, 238}: "Bravo Tech, Inc.", + [3]byte{224, 29, 56}: "Beijing HuaqinWorld Technology Co.,Ltd", + [3]byte{224, 29, 59}: "Cambridge Industries(Group) Co.,Ltd.", + [3]byte{224, 30, 7}: "Anite Telecoms US. Inc", + [3]byte{224, 31, 10}: "Xslent Energy Technologies. LLC", + [3]byte{224, 34, 2}: "ARRIS Group, Inc.", + [3]byte{224, 36, 127}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{224, 37, 56}: "Titan Pet Products", + [3]byte{224, 38, 48}: "Intrigue Technologies, Inc.", + [3]byte{224, 38, 54}: "Nortel Networks", + [3]byte{224, 39, 26}: "TTC Next-generation Home Network System WG", + [3]byte{224, 40, 97}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{224, 40, 109}: "AVM Audiovisuelles Marketing und Computersysteme GmbH", + [3]byte{224, 42, 130}: "Universal Global Scientific Industrial Co., Ltd.", + [3]byte{224, 44, 178}: "Lenovo Mobile Communication (Wuhan) Company Limited", + [3]byte{224, 44, 243}: "MRS Electronic GmbH", + [3]byte{224, 47, 109}: "Cisco Systems, Inc", + [3]byte{224, 48, 5}: "Alcatel-Lucent Shanghai Bell Co., Ltd", + [3]byte{224, 49, 158}: "Valve Corporation", + [3]byte{224, 49, 208}: "SZ Telstar CO., LTD", + [3]byte{224, 52, 228}: "Feit Electric Company, Inc.", + [3]byte{224, 53, 96}: "Challenger Supply Holdings, LLC", + [3]byte{224, 54, 118}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{224, 54, 227}: "Stage One International Co., Ltd.", + [3]byte{224, 55, 191}: "Wistron Neweb Corporation", + [3]byte{224, 57, 215}: "Plexxi, Inc.", + [3]byte{224, 60, 91}: "SHENZHEN JIAXINJIE ELECTRON CO.,LTD", + [3]byte{224, 62, 68}: "Broadcom", + [3]byte{224, 62, 74}: "Cavanagh Group International", + [3]byte{224, 62, 125}: "data-complex GmbH", + [3]byte{224, 63, 73}: "ASUSTek COMPUTER INC.", + [3]byte{224, 65, 54}: "MitraStar Technology Corp.", + [3]byte{224, 67, 219}: "Shenzhen ViewAt Technology Co.,Ltd.", + [3]byte{224, 70, 154}: "NETGEAR", + [3]byte{224, 72, 175}: "Premietech Limited", + [3]byte{224, 72, 211}: "MOBIWIRE MOBILES (NINGBO) CO.,LTD", + [3]byte{224, 75, 69}: "Hi-P Electronics Pte Ltd", + [3]byte{224, 79, 67}: "Universal Global Scientific Industrial Co., Ltd.", + [3]byte{224, 79, 189}: "SICHUAN TIANYI COMHEART TELECOMCO.,LTD", + [3]byte{224, 80, 139}: "Zhejiang Dahua Technology Co., Ltd.", + [3]byte{224, 81, 36}: "NXP Semiconductors", + [3]byte{224, 81, 99}: "Arcadyan Corporation", + [3]byte{224, 85, 61}: "Cisco Meraki", + [3]byte{224, 85, 151}: "Emergent Vision Technologies Inc.", + [3]byte{224, 86, 244}: "AxesNetwork Solutions inc.", + [3]byte{224, 88, 158}: "Laerdal Medical", + [3]byte{224, 91, 112}: "Innovid, Co., Ltd.", + [3]byte{224, 93, 166}: "Detlef Fink Elektronik & Softwareentwicklung", + [3]byte{224, 95, 69}: "Apple, Inc.", + [3]byte{224, 95, 185}: "Cisco Systems, Inc", + [3]byte{224, 96, 102}: "Sercomm Corporation", + [3]byte{224, 96, 137}: "Cloudleaf, Inc.", + [3]byte{224, 97, 178}: "HANGZHOU ZENOINTEL TECHNOLOGY CO., LTD", + [3]byte{224, 98, 144}: "Jinan Jovision Science & Technology Co., Ltd.", + [3]byte{224, 99, 229}: "Sony Mobile Communications AB", + [3]byte{224, 100, 187}: "DigiView S.r.l.", + [3]byte{224, 102, 120}: "Apple, Inc.", + [3]byte{224, 103, 179}: "C-Data Technology Co., Ltd", + [3]byte{224, 104, 109}: "Raybased AB", + [3]byte{224, 105, 149}: "PEGATRON CORPORATION", + [3]byte{224, 117, 10}: "ALPS ELECTRIC CO.,LTD.", + [3]byte{224, 117, 125}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{224, 118, 208}: "AMPAK Technology, Inc.", + [3]byte{224, 120, 163}: "Shanghai Winner Information Technology Co.,Inc", + [3]byte{224, 124, 19}: "zte corporation", + [3]byte{224, 124, 98}: "Whistle Labs, Inc.", + [3]byte{224, 127, 83}: "TECHBOARD SRL", + [3]byte{224, 127, 136}: "EVIDENCE Network SIA", + [3]byte{224, 129, 119}: "GreenBytes, Inc.", + [3]byte{224, 132, 243}: "High Grade Controls Corporation", + [3]byte{224, 135, 177}: "Nata-Info Ltd.", + [3]byte{224, 136, 93}: "Technicolor CH USA Inc.", + [3]byte{224, 137, 157}: "Cisco Systems, Inc", + [3]byte{224, 138, 126}: "Exponent", + [3]byte{224, 142, 60}: "Aztech Electronics Pte Ltd", + [3]byte{224, 143, 236}: "REPOTEC CO., LTD.", + [3]byte{224, 145, 83}: "XAVi Technologies Corp.", + [3]byte{224, 145, 245}: "NETGEAR", + [3]byte{224, 148, 103}: "Intel Corporate", + [3]byte{224, 149, 121}: "ORTHOsoft inc, d/b/a Zimmer CAS", + [3]byte{224, 151, 150}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{224, 151, 242}: "Atomax Inc.", + [3]byte{224, 152, 97}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{224, 153, 113}: "Samsung Electronics Co.,Ltd", + [3]byte{224, 157, 49}: "Intel Corporate", + [3]byte{224, 157, 184}: "PLANEX COMMUNICATIONS INC.", + [3]byte{224, 157, 250}: "Wanan Hongsheng Electronic Co.Ltd", + [3]byte{224, 161, 152}: "NOJA Power Switchgear Pty Ltd", + [3]byte{224, 161, 215}: "SFR", + [3]byte{224, 163, 15}: "Pevco", + [3]byte{224, 163, 172}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{224, 166, 112}: "Nokia Corporation", + [3]byte{224, 167, 0}: "Verkada Inc", + [3]byte{224, 168, 184}: "Le Shi Zhi Xin Electronic Technology (Tianjin) Limited", + [3]byte{224, 170, 150}: "Samsung Electronics Co.,Ltd", + [3]byte{224, 170, 176}: "GENERAL VISION ELECTRONICS CO. LTD.", + [3]byte{224, 170, 219}: "Nanjing PANENG Technology Development Co.,Ltd", + [3]byte{224, 171, 254}: "Orb Networks, Inc.", + [3]byte{224, 172, 203}: "Apple, Inc.", + [3]byte{224, 172, 241}: "Cisco Systems, Inc", + [3]byte{224, 174, 94}: "ALPS ELECTRIC CO.,LTD.", + [3]byte{224, 174, 178}: "Bender GmbH & Co.KG", + [3]byte{224, 174, 237}: "LOENK", + [3]byte{224, 175, 75}: "Pluribus Networks, Inc.", + [3]byte{224, 178, 241}: "FN-LINK TECHNOLOGY LIMITED", + [3]byte{224, 181, 45}: "Apple, Inc.", + [3]byte{224, 182, 245}: "IEEE Registration Authority", + [3]byte{224, 183, 10}: "ARRIS Group, Inc.", + [3]byte{224, 183, 177}: "ARRIS Group, Inc.", + [3]byte{224, 185, 77}: "SHENZHEN BILIAN ELECTRONIC CO.,LTD", + [3]byte{224, 185, 165}: "AzureWave Technology Inc.", + [3]byte{224, 185, 186}: "Apple, Inc.", + [3]byte{224, 185, 229}: "Technicolor", + [3]byte{224, 188, 67}: "C2 Microsystems, Inc.", + [3]byte{224, 192, 209}: "CK Telecom (Shenzhen) Limited", + [3]byte{224, 194, 134}: "Aisai Communication Technology Co., Ltd.", + [3]byte{224, 194, 183}: "Masimo Corporation", + [3]byte{224, 195, 243}: "zte corporation", + [3]byte{224, 198, 179}: "MilDef AB", + [3]byte{224, 199, 103}: "Apple, Inc.", + [3]byte{224, 199, 157}: "Texas Instruments", + [3]byte{224, 200, 106}: "SHENZHEN TW-SCIE Co., Ltd", + [3]byte{224, 201, 34}: "Jireh Energy Tech., Ltd.", + [3]byte{224, 201, 122}: "Apple, Inc.", + [3]byte{224, 202, 77}: "Shenzhen Unistar Communication Co.,LTD", + [3]byte{224, 202, 148}: "ASKEY COMPUTER CORP", + [3]byte{224, 203, 29}: "Private", + [3]byte{224, 203, 78}: "ASUSTek COMPUTER INC.", + [3]byte{224, 203, 188}: "Cisco Meraki", + [3]byte{224, 203, 238}: "Samsung Electronics Co.,Ltd", + [3]byte{224, 205, 253}: "Beijing E3Control Technology Co, LTD", + [3]byte{224, 206, 195}: "ASKEY COMPUTER CORP", + [3]byte{224, 207, 45}: "Gemintek Corporation", + [3]byte{224, 209, 10}: "Katoudenkikougyousyo co ltd", + [3]byte{224, 209, 115}: "Cisco Systems, Inc", + [3]byte{224, 209, 230}: "Aliph dba Jawbone", + [3]byte{224, 211, 26}: "EQUES Technology Co., Limited", + [3]byte{224, 213, 94}: "GIGA-BYTE TECHNOLOGY CO.,LTD.", + [3]byte{224, 215, 186}: "Texas Instruments", + [3]byte{224, 216, 72}: "Dell Inc.", + [3]byte{224, 217, 162}: "Hippih aps", + [3]byte{224, 217, 227}: "Eltex Enterprise Ltd.", + [3]byte{224, 218, 220}: "JVC KENWOOD Corporation", + [3]byte{224, 219, 16}: "Samsung Electronics Co.,Ltd", + [3]byte{224, 219, 85}: "Dell Inc.", + [3]byte{224, 219, 136}: "Open Standard Digital-IF Interface for SATCOM Systems", + [3]byte{224, 220, 160}: "Siemens Industrial Automation Products Ltd Chengdu", + [3]byte{224, 221, 192}: "vivo Mobile Communication Co., Ltd.", + [3]byte{224, 229, 207}: "Texas Instruments", + [3]byte{224, 230, 49}: "SNB TECHNOLOGIES LIMITED", + [3]byte{224, 231, 81}: "Nintendo Co., Ltd.", + [3]byte{224, 231, 187}: "Nureva, Inc.", + [3]byte{224, 232, 232}: "Olive Telecommunication Pvt. Ltd", + [3]byte{224, 237, 26}: "vastriver Technology Co., Ltd", + [3]byte{224, 237, 199}: "Shenzhen Friendcom Technology Development Co., Ltd", + [3]byte{224, 238, 27}: "Panasonic Automotive Systems Company of America", + [3]byte{224, 239, 37}: "Lintes Technology Co., Ltd.", + [3]byte{224, 242, 17}: "Digitalwatt", + [3]byte{224, 243, 121}: "Vaddio", + [3]byte{224, 245, 198}: "Apple, Inc.", + [3]byte{224, 245, 202}: "CHENG UEI PRECISION INDUSTRY CO.,LTD.", + [3]byte{224, 248, 71}: "Apple, Inc.", + [3]byte{224, 249, 190}: "Cloudena Corp.", + [3]byte{224, 250, 236}: "Platan sp. z o.o. sp. k.", + [3]byte{224, 255, 247}: "Softiron Inc.", + [3]byte{228, 2, 155}: "Intel Corporate", + [3]byte{228, 4, 57}: "TomTom Software Ltd", + [3]byte{228, 17, 91}: "Hewlett Packard", + [3]byte{228, 18, 24}: "ShenZhen Rapoo Technology Co., Ltd.", + [3]byte{228, 18, 29}: "Samsung Electronics Co.,Ltd", + [3]byte{228, 18, 137}: "topsystem Systemhaus GmbH", + [3]byte{228, 23, 216}: "8BITDO TECHNOLOGY HK LIMITED", + [3]byte{228, 24, 107}: "Zyxel Communications Corporation", + [3]byte{228, 26, 44}: "ZPE Systems, Inc.", + [3]byte{228, 28, 75}: "V2 TECHNOLOGY, INC.", + [3]byte{228, 29, 45}: "Mellanox Technologies, Inc.", + [3]byte{228, 31, 19}: "IBM Corp", + [3]byte{228, 34, 165}: "PLANTRONICS, INC.", + [3]byte{228, 35, 84}: "SHENZHEN FUZHI SOFTWARE TECHNOLOGY CO.,LTD", + [3]byte{228, 37, 231}: "Apple, Inc.", + [3]byte{228, 37, 233}: "Color-Chip", + [3]byte{228, 39, 113}: "Smartlabs", + [3]byte{228, 42, 211}: "Magneti Marelli S.p.A. Powertrain", + [3]byte{228, 43, 52}: "Apple, Inc.", + [3]byte{228, 44, 86}: "Lilee Systems, Ltd.", + [3]byte{228, 45, 2}: "TCT mobile ltd", + [3]byte{228, 47, 38}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{228, 47, 86}: "OptoMET GmbH", + [3]byte{228, 47, 246}: "Unicore communication Inc.", + [3]byte{228, 50, 203}: "Samsung Electronics Co.,Ltd", + [3]byte{228, 53, 147}: "Hangzhou GoTo technology Co.Ltd", + [3]byte{228, 53, 200}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{228, 53, 251}: "Sabre Technology (Hull) Ltd", + [3]byte{228, 55, 215}: "HENRI DEPAEPE S.A.S.", + [3]byte{228, 56, 242}: "Advantage Controls", + [3]byte{228, 58, 110}: "Shenzhen Zeroone Technology CO.,LTD", + [3]byte{228, 62, 215}: "Arcadyan Corporation", + [3]byte{228, 63, 162}: "Wuxi DSP Technologies Inc.", + [3]byte{228, 64, 226}: "Samsung Electronics Co.,Ltd", + [3]byte{228, 65, 230}: "Ottec Technology GmbH", + [3]byte{228, 66, 166}: "Intel Corporate", + [3]byte{228, 70, 189}: "C&C TECHNIC TAIWAN CO., LTD.", + [3]byte{228, 70, 218}: "Xiaomi Communications Co Ltd", + [3]byte{228, 71, 144}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{228, 72, 199}: "Cisco SPVTG", + [3]byte{228, 76, 108}: "Shenzhen Guo Wei Electronic Co,. Ltd.", + [3]byte{228, 78, 24}: "Gardasoft VisionLimited", + [3]byte{228, 79, 41}: "MA Lighting Technology GmbH", + [3]byte{228, 79, 95}: "EDS Elektronik Destek San.Tic.Ltd.Sti", + [3]byte{228, 80, 154}: "HW Communications Ltd", + [3]byte{228, 85, 234}: "Dedicated Computing", + [3]byte{228, 86, 20}: "Suttle Apparatus", + [3]byte{228, 87, 64}: "ARRIS Group, Inc.", + [3]byte{228, 87, 168}: "Stuart Manufacturing, Inc.", + [3]byte{228, 88, 184}: "Samsung Electronics Co.,Ltd", + [3]byte{228, 88, 231}: "Samsung Electronics Co.,Ltd", + [3]byte{228, 90, 162}: "vivo Mobile Communication Co., Ltd.", + [3]byte{228, 93, 81}: "SFR", + [3]byte{228, 93, 82}: "Avaya Inc", + [3]byte{228, 93, 117}: "Samsung Electronics Co.,Ltd", + [3]byte{228, 98, 81}: "HAO CHENG GROUP LIMITED", + [3]byte{228, 100, 73}: "ARRIS Group, Inc.", + [3]byte{228, 103, 186}: "Danish Interpretation Systems A/S", + [3]byte{228, 104, 163}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{228, 105, 90}: "Dictum Health, Inc.", + [3]byte{228, 108, 33}: "messMa GmbH", + [3]byte{228, 111, 19}: "D-Link International", + [3]byte{228, 112, 184}: "Intel Corporate", + [3]byte{228, 113, 133}: "Securifi Ltd", + [3]byte{228, 114, 226}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{228, 117, 30}: "Getinge Sterilization AB", + [3]byte{228, 119, 35}: "zte corporation", + [3]byte{228, 119, 107}: "AARTESYS AG", + [3]byte{228, 119, 212}: "Minrray Industry Co.,Ltd", + [3]byte{228, 123, 63}: "BEIJING CO-CLOUD TECHNOLOGY LTD.", + [3]byte{228, 124, 249}: "Samsung Electronics Co.,Ltd", + [3]byte{228, 125, 90}: "Beijing Hanbang Technology Corp.", + [3]byte{228, 125, 189}: "Samsung Electronics Co.,Ltd", + [3]byte{228, 125, 235}: "Shanghai Notion Information Technology CO.,LTD.", + [3]byte{228, 126, 102}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{228, 127, 178}: "FUJITSU LIMITED", + [3]byte{228, 129, 132}: "Nokia", + [3]byte{228, 129, 179}: "Shenzhen ACT Industrial Co.,Ltd.", + [3]byte{228, 131, 153}: "ARRIS Group, Inc.", + [3]byte{228, 133, 1}: "Geberit International AG", + [3]byte{228, 138, 213}: "RF WINDOW CO., LTD.", + [3]byte{228, 139, 127}: "Apple, Inc.", + [3]byte{228, 140, 15}: "Discovery Insure", + [3]byte{228, 141, 140}: "Routerboard.com", + [3]byte{228, 143, 52}: "Vodafone Italia S.p.A.", + [3]byte{228, 144, 105}: "Rockwell Automation", + [3]byte{228, 144, 126}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{228, 146, 231}: "Gridlink Tech. Co.,Ltd.", + [3]byte{228, 146, 251}: "Samsung Electronics Co.,Ltd", + [3]byte{228, 149, 110}: "IEEE Registration Authority", + [3]byte{228, 150, 174}: "ALTOGRAPHICS Inc.", + [3]byte{228, 151, 240}: "Shanghai VLC Technologies Ltd. Co.", + [3]byte{228, 152, 209}: "Microsoft Mobile Oy", + [3]byte{228, 152, 214}: "Apple, Inc.", + [3]byte{228, 154, 121}: "Apple, Inc.", + [3]byte{228, 154, 220}: "Apple, Inc.", + [3]byte{228, 158, 18}: "FREEBOX SAS", + [3]byte{228, 161, 230}: "Alcatel-Lucent Shanghai Bell Co., Ltd", + [3]byte{228, 163, 47}: "Shanghai Artimen Technology Co., Ltd.", + [3]byte{228, 163, 135}: "Control Solutions LLC", + [3]byte{228, 164, 113}: "Intel Corporate", + [3]byte{228, 165, 239}: "TRON LINK ELECTRONICS CO., LTD.", + [3]byte{228, 167, 73}: "Palo Alto Networks", + [3]byte{228, 167, 160}: "Intel Corporate", + [3]byte{228, 167, 197}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{228, 167, 253}: "Cellco Partnership", + [3]byte{228, 168, 182}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{228, 170, 93}: "Cisco Systems, Inc", + [3]byte{228, 171, 70}: "UAB Selteka", + [3]byte{228, 173, 125}: "SCL Elements", + [3]byte{228, 175, 161}: "HES-SO", + [3]byte{228, 176, 5}: "Beijing IQIYI Science & Technology Co., Ltd.", + [3]byte{228, 176, 33}: "Samsung Electronics Co.,Ltd", + [3]byte{228, 179, 24}: "Intel Corporate", + [3]byte{228, 186, 217}: "360 Fly Inc.", + [3]byte{228, 189, 75}: "zte corporation", + [3]byte{228, 190, 237}: "Netcore Technology Inc.", + [3]byte{228, 193, 70}: "Objetivos y Servicios de Valor A", + [3]byte{228, 193, 241}: "SHENZHEN SPOTMAU INFORMATION TECHNOLIGY CO., Ltd", + [3]byte{228, 194, 209}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{228, 198, 43}: "Airware", + [3]byte{228, 198, 61}: "Apple, Inc.", + [3]byte{228, 198, 230}: "Mophie, LLC", + [3]byte{228, 199, 34}: "Cisco Systems, Inc", + [3]byte{228, 200, 1}: "BLU Products Inc", + [3]byte{228, 200, 6}: "Ceiec Electric Technology Inc.", + [3]byte{228, 206, 2}: "WyreStorm Technologies Ltd", + [3]byte{228, 206, 112}: "Health & Life co., Ltd.", + [3]byte{228, 206, 143}: "Apple, Inc.", + [3]byte{228, 211, 50}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{228, 211, 241}: "Cisco Systems, Inc", + [3]byte{228, 213, 61}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{228, 215, 29}: "Oraya Therapeutics", + [3]byte{228, 221, 121}: "En-Vision America, Inc.", + [3]byte{228, 224, 197}: "Samsung Electronics Co.,Ltd", + [3]byte{228, 228, 9}: "LEIFHEIT AG", + [3]byte{228, 228, 171}: "Apple, Inc.", + [3]byte{228, 236, 16}: "Nokia Corporation", + [3]byte{228, 238, 253}: "MR&D Manufacturing", + [3]byte{228, 240, 4}: "Dell Inc.", + [3]byte{228, 240, 66}: "Google, Inc.", + [3]byte{228, 243, 101}: "Time-O-Matic, Inc.", + [3]byte{228, 243, 227}: "Shanghai iComhome Co.,Ltd.", + [3]byte{228, 243, 245}: "SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.", + [3]byte{228, 244, 198}: "NETGEAR", + [3]byte{228, 247, 161}: "Datafox GmbH", + [3]byte{228, 248, 156}: "Intel Corporate", + [3]byte{228, 248, 239}: "Samsung Electronics Co.,Ltd", + [3]byte{228, 249, 57}: "Minxon Hotel Technology INC.", + [3]byte{228, 250, 29}: "PAD Peripheral Advanced Design Inc.", + [3]byte{228, 250, 237}: "Samsung Electronics Co.,Ltd", + [3]byte{228, 250, 253}: "Intel Corporate", + [3]byte{228, 251, 93}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{228, 251, 143}: "MOBIWIRE MOBILES (NINGBO) CO.,LTD", + [3]byte{228, 254, 217}: "EDMI Europe Ltd", + [3]byte{228, 255, 221}: "ELECTRON INDIA", + [3]byte{232, 0, 54}: "Befs co,. ltd", + [3]byte{232, 3, 154}: "Samsung Electronics Co.,Ltd", + [3]byte{232, 4, 11}: "Apple, Inc.", + [3]byte{232, 4, 16}: "Private", + [3]byte{232, 4, 98}: "Cisco Systems, Inc", + [3]byte{232, 4, 243}: "Throughtek Co., Ltd.", + [3]byte{232, 5, 109}: "Nortel Networks", + [3]byte{232, 6, 136}: "Apple, Inc.", + [3]byte{232, 7, 52}: "Champion Optical Network Engineering, LLC", + [3]byte{232, 7, 191}: "SHENZHEN BOOMTECH INDUSTRY CO.,LTD", + [3]byte{232, 8, 139}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{232, 9, 69}: "Integrated Device Technology (Malaysia) Sdn. Bhd.", + [3]byte{232, 9, 89}: "Guoguang Electric Co.,Ltd", + [3]byte{232, 11, 19}: "Akib Systems Taiwan, INC", + [3]byte{232, 12, 56}: "DAEYOUNG INFORMATION SYSTEM CO., LTD", + [3]byte{232, 12, 117}: "Syncbak, Inc.", + [3]byte{232, 16, 46}: "Really Simple Software, Inc", + [3]byte{232, 17, 50}: "Samsung Electronics Co.,Ltd", + [3]byte{232, 17, 202}: "SHANDONG KAER ELECTRIC.CO.,LTD", + [3]byte{232, 19, 36}: "GuangZhou Bonsoninfo System CO.,LTD", + [3]byte{232, 19, 99}: "Comstock RD, Inc.", + [3]byte{232, 19, 103}: "AIRSOUND Inc.", + [3]byte{232, 21, 14}: "Nokia Corporation", + [3]byte{232, 22, 43}: "IDEO Security Co., Ltd.", + [3]byte{232, 23, 252}: "Fujitsu Cloud Technologies Limited", + [3]byte{232, 24, 99}: "IEEE Registration Authority", + [3]byte{232, 29, 168}: "Ruckus Wireless", + [3]byte{232, 32, 226}: "HUMAX Co., Ltd.", + [3]byte{232, 40, 119}: "TMY Co., Ltd.", + [3]byte{232, 40, 213}: "Cots Technology", + [3]byte{232, 42, 68}: "Liteon Technology Corporation", + [3]byte{232, 42, 234}: "Intel Corporate", + [3]byte{232, 46, 36}: "Out of the Fog Research LLC", + [3]byte{232, 51, 129}: "ARRIS Group, Inc.", + [3]byte{232, 52, 62}: "Beijing Infosec Technologies Co., LTD.", + [3]byte{232, 54, 29}: "Sense Labs, Inc.", + [3]byte{232, 55, 122}: "Zyxel Communications Corporation", + [3]byte{232, 57, 53}: "Hewlett Packard", + [3]byte{232, 57, 223}: "ASKEY COMPUTER CORP", + [3]byte{232, 58, 18}: "Samsung Electronics Co.,Ltd", + [3]byte{232, 58, 151}: "Toshiba Corporation", + [3]byte{232, 62, 182}: "RIM", + [3]byte{232, 62, 251}: "GEODESIC LTD.", + [3]byte{232, 62, 252}: "ARRIS Group, Inc.", + [3]byte{232, 64, 64}: "Cisco Systems, Inc", + [3]byte{232, 64, 242}: "PEGATRON CORPORATION", + [3]byte{232, 67, 182}: "QNAP Systems, Inc.", + [3]byte{232, 68, 126}: "Bitdefender SRL", + [3]byte{232, 72, 31}: "Advanced Automotive Antennas", + [3]byte{232, 77, 208}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{232, 78, 6}: "EDUP INTERNATIONAL (HK) CO., LTD", + [3]byte{232, 78, 132}: "Samsung Electronics Co.,Ltd", + [3]byte{232, 78, 206}: "Nintendo Co., Ltd.", + [3]byte{232, 80, 139}: "SAMSUNG ELECTRO-MECHANICS(THAILAND)", + [3]byte{232, 81, 110}: "TSMART Inc.", + [3]byte{232, 81, 157}: "Yeonhab Precision Co.,LTD", + [3]byte{232, 84, 132}: "NEO Information Systems Co., Ltd.", + [3]byte{232, 85, 180}: "SAI Technology Inc.", + [3]byte{232, 86, 89}: "Advanced-Connectek Inc.", + [3]byte{232, 86, 214}: "NCTech Ltd", + [3]byte{232, 90, 167}: "LLC Emzior", + [3]byte{232, 91, 91}: "LG ELECTRONICS INC", + [3]byte{232, 91, 240}: "Imaging Diagnostics", + [3]byte{232, 93, 107}: "Luminate Wireless", + [3]byte{232, 94, 83}: "Infratec Datentechnik GmbH", + [3]byte{232, 97, 31}: "Dawning Information Industry Co.,Ltd", + [3]byte{232, 97, 126}: "Liteon Technology Corporation", + [3]byte{232, 97, 131}: "Black Diamond Advanced Technology, LLC", + [3]byte{232, 97, 190}: "Melec Inc.", + [3]byte{232, 101, 73}: "Cisco Systems, Inc", + [3]byte{232, 101, 212}: "Tenda Technology Co.,Ltd.Dongguan branch", + [3]byte{232, 102, 196}: "Diamanti", + [3]byte{232, 104, 25}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{232, 108, 218}: "Supercomputers and Neurocomputers Research Center", + [3]byte{232, 109, 82}: "ARRIS Group, Inc.", + [3]byte{232, 109, 84}: "Digit Mobile Inc", + [3]byte{232, 109, 101}: "AUDIO MOBIL Elektronik GmbH", + [3]byte{232, 109, 110}: "voestalpine SIGNALING Fareham Ltd.", + [3]byte{232, 111, 242}: "Actiontec Electronics, Inc", + [3]byte{232, 113, 141}: "Elsys Equipamentos Eletronicos Ltda", + [3]byte{232, 116, 230}: "ADB Broadband Italia", + [3]byte{232, 117, 127}: "FIRS Technologies(Shenzhen) Co., Ltd", + [3]byte{232, 120, 161}: "BEOVIEW INTERCOM DOO", + [3]byte{232, 122, 243}: "S5 Tech S.r.l.", + [3]byte{232, 128, 46}: "Apple, Inc.", + [3]byte{232, 128, 216}: "GNTEK Electronics Co.,Ltd.", + [3]byte{232, 130, 91}: "ARRIS Group, Inc.", + [3]byte{232, 135, 163}: "Loxley Public Company Limited", + [3]byte{232, 136, 108}: "Shenzhen SC Technologies Co.,LTD", + [3]byte{232, 137, 44}: "ARRIS Group, Inc.", + [3]byte{232, 141, 40}: "Apple, Inc.", + [3]byte{232, 141, 245}: "ZNYX Networks, Inc.", + [3]byte{232, 142, 96}: "NSD Corporation", + [3]byte{232, 145, 32}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{232, 146, 24}: "Arcontia International AB", + [3]byte{232, 146, 164}: "LG Electronics (Mobile Communications)", + [3]byte{232, 147, 9}: "Samsung Electronics Co.,Ltd", + [3]byte{232, 148, 76}: "Cogent Healthcare Systems Ltd", + [3]byte{232, 148, 246}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{232, 150, 6}: "testo Instruments (Shenzhen) Co., Ltd.", + [3]byte{232, 153, 90}: "PiiGAB, Processinformation i Goteborg AB", + [3]byte{232, 153, 196}: "HTC Corporation", + [3]byte{232, 154, 143}: "QUANTA COMPUTER INC.", + [3]byte{232, 154, 255}: "Fujian Landi Commercial Equipment Co.,Ltd", + [3]byte{232, 157, 135}: "Toshiba", + [3]byte{232, 158, 12}: "Private", + [3]byte{232, 158, 180}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{232, 159, 236}: "CHENGDU KT ELECTRONIC HI-TECH CO.,LTD", + [3]byte{232, 163, 100}: "Signal Path International / Peachtree Audio", + [3]byte{232, 164, 193}: "Deep Sea Electronics PLC", + [3]byte{232, 167, 242}: "sTraffic", + [3]byte{232, 171, 250}: "Shenzhen Reecam Tech.Ltd.", + [3]byte{232, 177, 252}: "Intel Corporate", + [3]byte{232, 178, 172}: "Apple, Inc.", + [3]byte{232, 180, 174}: "Shenzhen C&D Electronics Co.,Ltd", + [3]byte{232, 180, 200}: "Samsung Electronics Co.,Ltd", + [3]byte{232, 182, 194}: "Juniper Networks", + [3]byte{232, 183, 72}: "Cisco Systems, Inc", + [3]byte{232, 186, 112}: "Cisco Systems, Inc", + [3]byte{232, 187, 61}: "Sino Prime-Tech Limited", + [3]byte{232, 187, 168}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{232, 189, 209}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{232, 190, 129}: "Sagemcom Broadband SAS", + [3]byte{232, 193, 215}: "Philips", + [3]byte{232, 194, 41}: "H-Displays (MSC) Bhd", + [3]byte{232, 195, 32}: "Austco Communication Systems Pty Ltd", + [3]byte{232, 199, 79}: "Liteon Technology Corporation", + [3]byte{232, 203, 161}: "Nokia Corporation", + [3]byte{232, 204, 24}: "D-Link International", + [3]byte{232, 204, 50}: "Micronet LTD", + [3]byte{232, 205, 45}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{232, 206, 6}: "SkyHawke Technologies, LLC.", + [3]byte{232, 208, 250}: "MKS Instruments Deutschland GmbH", + [3]byte{232, 209, 27}: "ASKEY COMPUTER CORP", + [3]byte{232, 212, 131}: "ULTIMATE Europe Transportation Equipment GmbH", + [3]byte{232, 212, 224}: "Beijing BenyWave Technology Co., Ltd.", + [3]byte{232, 216, 25}: "AzureWave Technology Inc.", + [3]byte{232, 218, 150}: "Zhuhai Tianrui Electrical Power Tech. Co., Ltd.", + [3]byte{232, 218, 170}: "VideoHome Technology Corp.", + [3]byte{232, 222, 39}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{232, 222, 142}: "Integrated Device Technology (Malaysia) Sdn. Bhd.", + [3]byte{232, 222, 214}: "Intrising Networks, Inc.", + [3]byte{232, 223, 112}: "AVM Audiovisuelles Marketing und Computersysteme GmbH", + [3]byte{232, 223, 242}: "PRF Co., Ltd.", + [3]byte{232, 224, 143}: "GRAVOTECH MARKING SAS", + [3]byte{232, 224, 183}: "Toshiba", + [3]byte{232, 225, 225}: "Gemtek Technology Co., Ltd.", + [3]byte{232, 225, 226}: "Energotest", + [3]byte{232, 229, 214}: "Samsung Electronics Co.,Ltd", + [3]byte{232, 231, 50}: "Alcatel-Lucent Enterprise", + [3]byte{232, 231, 112}: "Warp9 Tech Design, Inc.", + [3]byte{232, 231, 118}: "Shenzhen Kootion Technology Co., Ltd", + [3]byte{232, 232, 117}: "iS5 Communications Inc.", + [3]byte{232, 234, 106}: "StarTech.com", + [3]byte{232, 234, 218}: "Denkovi Assembly Electronics LTD", + [3]byte{232, 235, 17}: "Texas Instruments", + [3]byte{232, 237, 5}: "ARRIS Group, Inc.", + [3]byte{232, 237, 243}: "Cisco Systems, Inc", + [3]byte{232, 239, 137}: "OPMEX Tech.", + [3]byte{232, 241, 176}: "Sagemcom Broadband SAS", + [3]byte{232, 242, 38}: "MILLSON CUSTOM SOLUTIONS INC.", + [3]byte{232, 242, 226}: "LG Innotek", + [3]byte{232, 242, 227}: "Starcor Beijing Co.,Limited", + [3]byte{232, 247, 36}: "Hewlett Packard Enterprise", + [3]byte{232, 249, 40}: "RFTECH SRL", + [3]byte{232, 252, 96}: "ELCOM Innovations Private Limited", + [3]byte{232, 252, 175}: "NETGEAR", + [3]byte{232, 253, 114}: "SHANGHAI LINGUO TECHNOLOGY CO., LTD.", + [3]byte{232, 253, 144}: "Turbostor", + [3]byte{232, 253, 232}: "CeLa Link Corporation", + [3]byte{236, 1, 51}: "TRINUS SYSTEMS INC.", + [3]byte{236, 1, 226}: "FOXCONN INTERCONNECT TECHNOLOGY", + [3]byte{236, 1, 238}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{236, 4, 65}: "ShenZhen TIGO Semiconductor Co., Ltd.", + [3]byte{236, 8, 107}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{236, 13, 154}: "Mellanox Technologies, Inc.", + [3]byte{236, 14, 196}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{236, 14, 214}: "ITECH INSTRUMENTS SAS", + [3]byte{236, 16, 123}: "Samsung Electronics Co.,Ltd", + [3]byte{236, 17, 32}: "FloDesign Wind Turbine Corporation", + [3]byte{236, 17, 39}: "Texas Instruments", + [3]byte{236, 19, 178}: "Netonix", + [3]byte{236, 19, 219}: "Juniper Networks", + [3]byte{236, 20, 246}: "BioControl AS", + [3]byte{236, 23, 47}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{236, 23, 102}: "Research Centre Module", + [3]byte{236, 26, 89}: "Belkin International Inc.", + [3]byte{236, 29, 127}: "zte corporation", + [3]byte{236, 29, 139}: "Cisco Systems, Inc", + [3]byte{236, 31, 114}: "SAMSUNG ELECTRO-MECHANICS(THAILAND)", + [3]byte{236, 33, 159}: "VidaBox LLC", + [3]byte{236, 33, 229}: "Toshiba", + [3]byte{236, 34, 87}: "JiangSu NanJing University Electronic Information Technology Co.,Ltd", + [3]byte{236, 34, 128}: "D-Link International", + [3]byte{236, 35, 61}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{236, 35, 104}: "IntelliVoice Co.,Ltd.", + [3]byte{236, 35, 123}: "zte corporation", + [3]byte{236, 36, 184}: "Texas Instruments", + [3]byte{236, 38, 202}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{236, 38, 251}: "TECC CO.,LTD.", + [3]byte{236, 42, 240}: "Ypsomed AG", + [3]byte{236, 44, 73}: "University of Tokyo", + [3]byte{236, 46, 78}: "HITACHI-LG DATA STORAGE INC", + [3]byte{236, 48, 145}: "Cisco Systems, Inc", + [3]byte{236, 53, 134}: "Apple, Inc.", + [3]byte{236, 54, 63}: "Markov Corporation", + [3]byte{236, 56, 143}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{236, 59, 240}: "NovelSat", + [3]byte{236, 60, 90}: "SHEN ZHEN HENG SHENG HUI DIGITAL TECHNOLOGY CO.,LTD", + [3]byte{236, 60, 136}: "MCNEX Co.,Ltd.", + [3]byte{236, 61, 253}: "SHENZHEN BILIAN ELECTRONIC CO.,LTD", + [3]byte{236, 62, 9}: "PERFORMANCE DESIGNED PRODUCTS, LLC", + [3]byte{236, 62, 247}: "Juniper Networks", + [3]byte{236, 63, 5}: "Institute 706, The Second Academy China Aerospace Science & Industry Corp", + [3]byte{236, 66, 180}: "ADC Corporation", + [3]byte{236, 66, 240}: "ADL Embedded Solutions, Inc.", + [3]byte{236, 67, 139}: "YAPTV", + [3]byte{236, 67, 230}: "AWCER Ltd.", + [3]byte{236, 67, 246}: "Zyxel Communications Corporation", + [3]byte{236, 68, 118}: "Cisco Systems, Inc", + [3]byte{236, 70, 68}: "TTK SAS", + [3]byte{236, 70, 112}: "Meinberg Funkuhren GmbH & Co. KG", + [3]byte{236, 71, 60}: "Redwire, LLC", + [3]byte{236, 73, 147}: "Qihan Technology Co., Ltd", + [3]byte{236, 76, 77}: "ZAO NPK RoTeK", + [3]byte{236, 77, 71}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{236, 79, 130}: "Calix Inc.", + [3]byte{236, 81, 188}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{236, 82, 220}: "WORLD MEDIA AND TECHNOLOGY Corp.", + [3]byte{236, 84, 46}: "Shanghai XiMei Electronic Technology Co. Ltd", + [3]byte{236, 85, 249}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{236, 89, 231}: "Microsoft Corporation", + [3]byte{236, 90, 134}: "Yulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd", + [3]byte{236, 92, 105}: "MITSUBISHI HEAVY INDUSTRIES MECHATRONICS SYSTEMS,LTD.", + [3]byte{236, 95, 35}: "Qinghai Kimascend Electronics Technology Co. Ltd.", + [3]byte{236, 96, 224}: "AVI-ON LABS", + [3]byte{236, 98, 100}: "Global411 Internet Services, LLC", + [3]byte{236, 99, 229}: "ePBoard Design LLC", + [3]byte{236, 100, 231}: "MOCACARE Corporation", + [3]byte{236, 102, 209}: "B&W Group LTD", + [3]byte{236, 104, 129}: "Palo Alto Networks", + [3]byte{236, 108, 159}: "Chengdu Volans Technology CO.,LTD", + [3]byte{236, 112, 151}: "ARRIS Group, Inc.", + [3]byte{236, 113, 219}: "Shenzhen Baichuan Digital Technology Co., Ltd.", + [3]byte{236, 116, 186}: "Hirschmann Automation and Control GmbH", + [3]byte{236, 124, 116}: "Justone Technologies Co., Ltd.", + [3]byte{236, 125, 17}: "vivo Mobile Communication Co., Ltd.", + [3]byte{236, 125, 157}: "MEI", + [3]byte{236, 128, 9}: "NovaSparks", + [3]byte{236, 129, 147}: "Logitech, Inc", + [3]byte{236, 131, 80}: "Microsoft Corporation", + [3]byte{236, 131, 108}: "RM Tech Co., Ltd.", + [3]byte{236, 133, 47}: "Apple, Inc.", + [3]byte{236, 136, 143}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{236, 136, 146}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{236, 137, 245}: "Lenovo Mobile Communication Technology Ltd.", + [3]byte{236, 138, 76}: "zte corporation", + [3]byte{236, 138, 199}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{236, 140, 162}: "Ruckus Wireless", + [3]byte{236, 142, 173}: "DLX", + [3]byte{236, 142, 174}: "Nagravision SA", + [3]byte{236, 142, 181}: "Hewlett Packard", + [3]byte{236, 146, 51}: "Eddyfi NDT Inc", + [3]byte{236, 147, 39}: "MEMMERT GmbH + Co. KG", + [3]byte{236, 147, 237}: "DDoS-Guard LTD", + [3]byte{236, 150, 129}: "2276427 Ontario Inc", + [3]byte{236, 152, 108}: "Lufft Mess- und Regeltechnik GmbH", + [3]byte{236, 152, 193}: "Beijing Risbo Network Technology Co.,Ltd", + [3]byte{236, 154, 116}: "Hewlett Packard", + [3]byte{236, 155, 91}: "Nokia Corporation", + [3]byte{236, 155, 243}: "SAMSUNG ELECTRO-MECHANICS(THAILAND)", + [3]byte{236, 158, 205}: "Artesyn Embedded Technologies", + [3]byte{236, 159, 13}: "IEEE Registration Authority", + [3]byte{236, 162, 155}: "Kemppi Oy", + [3]byte{236, 168, 107}: "Elitegroup Computer Systems Co.,Ltd.", + [3]byte{236, 169, 250}: "GUANGDONG GENIUS TECHNOLOGY CO.,LTD.", + [3]byte{236, 170, 160}: "PEGATRON CORPORATION", + [3]byte{236, 173, 184}: "Apple, Inc.", + [3]byte{236, 176, 225}: "Ciena Corporation", + [3]byte{236, 177, 6}: "Acuro Networks, Inc", + [3]byte{236, 177, 215}: "Hewlett Packard", + [3]byte{236, 181, 65}: "SHINANO E and E Co.Ltd.", + [3]byte{236, 181, 250}: "Philips Lighting BV", + [3]byte{236, 184, 112}: "Beijing Heweinet Technology Co.,Ltd.", + [3]byte{236, 185, 7}: "CloudGenix Inc", + [3]byte{236, 186, 254}: "GIROPTIC", + [3]byte{236, 187, 174}: "Digivoice Tecnologia em Eletronica Ltda", + [3]byte{236, 189, 9}: "FUSION Electronics Ltd", + [3]byte{236, 189, 29}: "Cisco Systems, Inc", + [3]byte{236, 192, 106}: "PowerChord Group Limited", + [3]byte{236, 195, 138}: "Accuenergy (CANADA) Inc", + [3]byte{236, 200, 130}: "Cisco Systems, Inc", + [3]byte{236, 203, 48}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{236, 205, 109}: "Allied Telesis, Inc.", + [3]byte{236, 208, 14}: "MiraeRecognition Co., Ltd.", + [3]byte{236, 208, 64}: "GEA Farm Technologies GmbH", + [3]byte{236, 208, 159}: "Xiaomi Communications Co Ltd", + [3]byte{236, 209, 154}: "Zhuhai Liming Industries Co., Ltd", + [3]byte{236, 214, 138}: "Shenzhen JMicron Intelligent Technology Developmen", + [3]byte{236, 217, 37}: "RAMI", + [3]byte{236, 217, 80}: "IRT SA", + [3]byte{236, 217, 209}: "Shenzhen TG-NET Botone Technology Co.,Ltd.", + [3]byte{236, 222, 61}: "Lamprey Networks, Inc.", + [3]byte{236, 223, 58}: "vivo Mobile Communication Co., Ltd.", + [3]byte{236, 224, 155}: "Samsung Electronics Co.,Ltd", + [3]byte{236, 225, 84}: "Beijing Unisound Information Technology Co.,Ltd.", + [3]byte{236, 225, 169}: "Cisco Systems, Inc", + [3]byte{236, 226, 253}: "SKG Electric Group(Thailand) Co., Ltd.", + [3]byte{236, 229, 18}: "tado GmbH", + [3]byte{236, 229, 85}: "Hirschmann Automation", + [3]byte{236, 231, 68}: "Omntec mfg. inc", + [3]byte{236, 233, 11}: "SISTEMA SOLUCOES ELETRONICAS LTDA - EASYTECH", + [3]byte{236, 233, 21}: "STI Ltd", + [3]byte{236, 233, 248}: "Guang Zhou TRI-SUN Electronics Technology Co., Ltd", + [3]byte{236, 234, 3}: "DARFON LIGHTING CORP", + [3]byte{236, 235, 184}: "Hewlett Packard Enterprise", + [3]byte{236, 238, 216}: "ZTLX Network Technology Co.,Ltd", + [3]byte{236, 240, 14}: "AboCom", + [3]byte{236, 242, 54}: "NEOMONTANA ELECTRONICS", + [3]byte{236, 243, 66}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{236, 243, 91}: "Nokia Corporation", + [3]byte{236, 244, 81}: "Arcadyan Corporation", + [3]byte{236, 244, 187}: "Dell Inc.", + [3]byte{236, 247, 43}: "HD DIGITAL TECH CO., LTD.", + [3]byte{236, 248, 235}: "SICHUAN TIANYI COMHEART TELECOMCO., LTD", + [3]byte{236, 250, 3}: "FCA", + [3]byte{236, 250, 170}: "The IMS Company", + [3]byte{236, 250, 188}: "Espressif Inc.", + [3]byte{236, 250, 244}: "SenRa Tech Pvt. Ltd", + [3]byte{236, 252, 85}: "A. Eberle GmbH & Co. KG", + [3]byte{236, 254, 126}: "BlueRadios, Inc.", + [3]byte{240, 0, 127}: "Janz - Contadores de Energia, SA", + [3]byte{240, 2, 43}: "Chrontel", + [3]byte{240, 2, 72}: "SmarteBuilding", + [3]byte{240, 3, 140}: "AzureWave Technology Inc.", + [3]byte{240, 7, 134}: "Shandong Bittel Electronics Co., Ltd", + [3]byte{240, 8, 241}: "Samsung Electronics Co.,Ltd", + [3]byte{240, 13, 92}: "JinQianMao Technology Co.,Ltd.", + [3]byte{240, 19, 195}: "SHENZHEN FENDA TECHNOLOGY CO., LTD", + [3]byte{240, 21, 160}: "KyungDong One Co., Ltd.", + [3]byte{240, 21, 185}: "PlayFusion Limited", + [3]byte{240, 24, 43}: "LG Chem", + [3]byte{240, 27, 108}: "vivo Mobile Communication Co., Ltd.", + [3]byte{240, 28, 19}: "LG Electronics (Mobile Communications)", + [3]byte{240, 28, 45}: "Juniper Networks", + [3]byte{240, 29, 188}: "Microsoft Corporation", + [3]byte{240, 30, 52}: "ORICO Technologies Co., Ltd", + [3]byte{240, 31, 175}: "Dell Inc.", + [3]byte{240, 33, 157}: "Cal-Comp Electronics & Communications Company Ltd.", + [3]byte{240, 34, 78}: "Esan electronic co.", + [3]byte{240, 35, 41}: "SHOWA DENKI CO.,LTD.", + [3]byte{240, 35, 185}: "IEEE Registration Authority", + [3]byte{240, 36, 5}: "OPUS High Technology Corporation", + [3]byte{240, 36, 8}: "Talaris (Sweden) AB", + [3]byte{240, 36, 117}: "Apple, Inc.", + [3]byte{240, 37, 114}: "Cisco Systems, Inc", + [3]byte{240, 37, 183}: "SAMSUNG ELECTRO-MECHANICS(THAILAND)", + [3]byte{240, 38, 36}: "WAFA TECHNOLOGIES CO., LTD.", + [3]byte{240, 38, 76}: "Dr. Sigrist AG", + [3]byte{240, 39, 45}: "Amazon Technologies Inc.", + [3]byte{240, 39, 69}: "F-Secure Corporation", + [3]byte{240, 39, 101}: "Murata Manufacturing Co., Ltd.", + [3]byte{240, 41, 41}: "Cisco Systems, Inc", + [3]byte{240, 42, 35}: "Creative Next Design", + [3]byte{240, 42, 97}: "Waldo Networks, Inc.", + [3]byte{240, 47, 167}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{240, 47, 216}: "Bi2-Vision", + [3]byte{240, 50, 26}: "Mita-Teknik A/S", + [3]byte{240, 52, 4}: "TCT mobile ltd", + [3]byte{240, 55, 161}: "Huike Electronics (SHENZHEN) CO., LTD.", + [3]byte{240, 58, 75}: "Bloombase, Inc.", + [3]byte{240, 58, 85}: "Omega Elektronik AS", + [3]byte{240, 61, 3}: "TECNO MOBILE LIMITED", + [3]byte{240, 61, 41}: "Actility", + [3]byte{240, 62, 144}: "Ruckus Wireless", + [3]byte{240, 62, 191}: "GOGORO TAIWAN LIMITED", + [3]byte{240, 63, 248}: "R L Drake", + [3]byte{240, 64, 123}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{240, 66, 28}: "Intel Corporate", + [3]byte{240, 67, 53}: "DVN(Shanghai)Ltd.", + [3]byte{240, 67, 71}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{240, 69, 218}: "Texas Instruments", + [3]byte{240, 74, 43}: "PYRAMID Computer GmbH", + [3]byte{240, 75, 106}: "Scientific Production Association Siberian Arsenal, Ltd.", + [3]byte{240, 75, 242}: "JTECH Communications, Inc.", + [3]byte{240, 77, 162}: "Dell Inc.", + [3]byte{240, 79, 124}: "Private", + [3]byte{240, 88, 73}: "CareView Communications", + [3]byte{240, 90, 9}: "Samsung Electronics Co.,Ltd", + [3]byte{240, 91, 123}: "Samsung Electronics Co.,Ltd", + [3]byte{240, 92, 25}: "Aruba Networks", + [3]byte{240, 93, 137}: "Dycon Limited", + [3]byte{240, 93, 200}: "Duracell Powermat", + [3]byte{240, 95, 90}: "Getriebebau NORD GmbH and Co. KG", + [3]byte{240, 97, 48}: "Advantage Pharmacy Services, LLC", + [3]byte{240, 98, 13}: "Shenzhen Egreat Tech Corp.,Ltd", + [3]byte{240, 98, 129}: "ProCurve Networking by HP", + [3]byte{240, 101, 194}: "Yanfeng Visteon Electronics Technology (Shanghai) Co.,Ltd.", + [3]byte{240, 101, 221}: "Primax Electronics Ltd.", + [3]byte{240, 104, 83}: "Integrated Corporation", + [3]byte{240, 107, 202}: "Samsung Electronics Co.,Ltd", + [3]byte{240, 109, 120}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{240, 110, 11}: "Microsoft Corporation", + [3]byte{240, 110, 50}: "MICROTEL INNOVATION S.R.L.", + [3]byte{240, 114, 140}: "Samsung Electronics Co.,Ltd", + [3]byte{240, 115, 174}: "PEAK-System Technik", + [3]byte{240, 116, 133}: "NGD Systems, Inc.", + [3]byte{240, 116, 228}: "Thundercomm Technology Co., Ltd", + [3]byte{240, 118, 28}: "COMPAL INFORMATION (KUNSHAN) CO., LTD.", + [3]byte{240, 119, 101}: "Sourcefire, Inc", + [3]byte{240, 119, 208}: "Xcellen", + [3]byte{240, 120, 22}: "Cisco Systems, Inc", + [3]byte{240, 121, 89}: "ASUSTek COMPUTER INC.", + [3]byte{240, 121, 96}: "Apple, Inc.", + [3]byte{240, 121, 232}: "GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD", + [3]byte{240, 123, 203}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{240, 125, 104}: "D-Link Corporation", + [3]byte{240, 127, 6}: "Cisco Systems, Inc", + [3]byte{240, 127, 12}: "Leopold Kostal GmbH &Co. KG", + [3]byte{240, 129, 175}: "IRZ AUTOMATION TECHNOLOGIES LTD", + [3]byte{240, 130, 97}: "Sagemcom Broadband SAS", + [3]byte{240, 132, 47}: "ADB Broadband Italia", + [3]byte{240, 132, 201}: "zte corporation", + [3]byte{240, 133, 193}: "SHENZHEN RF-LINK TECHNOLOGY CO.,LTD.", + [3]byte{240, 138, 40}: "JIANGSU HENGSION ELECTRONIC S and T CO.,LTD", + [3]byte{240, 139, 254}: "COSTEL.,CO.LTD", + [3]byte{240, 140, 251}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{240, 142, 219}: "VeloCloud Networks", + [3]byte{240, 146, 28}: "Hewlett Packard", + [3]byte{240, 146, 180}: "SICHUAN TIANYI COMHEART TELECOMCO., LTD", + [3]byte{240, 147, 58}: "NxtConect", + [3]byte{240, 147, 197}: "Garland Technology", + [3]byte{240, 151, 229}: "TAMIO, INC", + [3]byte{240, 152, 56}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{240, 152, 157}: "Apple, Inc.", + [3]byte{240, 153, 191}: "Apple, Inc.", + [3]byte{240, 154, 81}: "Shanghai Viroyal Electronic Technology Company Limited", + [3]byte{240, 156, 187}: "RaonThink Inc.", + [3]byte{240, 156, 233}: "Aerohive Networks Inc.", + [3]byte{240, 158, 99}: "Cisco Systems, Inc", + [3]byte{240, 159, 194}: "Ubiquiti Networks Inc.", + [3]byte{240, 162, 37}: "Private", + [3]byte{240, 167, 100}: "GST Co., Ltd.", + [3]byte{240, 171, 84}: "MITSUMI ELECTRIC CO.,LTD.", + [3]byte{240, 172, 164}: "HBC-radiomatic", + [3]byte{240, 172, 215}: "IEEE Registration Authority", + [3]byte{240, 173, 78}: "Globalscale Technologies, Inc.", + [3]byte{240, 174, 81}: "Xi3 Corp", + [3]byte{240, 176, 82}: "Ruckus Wireless", + [3]byte{240, 176, 231}: "Apple, Inc.", + [3]byte{240, 178, 229}: "Cisco Systems, Inc", + [3]byte{240, 180, 41}: "Xiaomi Communications Co Ltd", + [3]byte{240, 180, 121}: "Apple, Inc.", + [3]byte{240, 182, 235}: "Poslab Technology Co., Ltd.", + [3]byte{240, 188, 200}: "MaxID (Pty) Ltd", + [3]byte{240, 189, 46}: "H+S Polatis Ltd", + [3]byte{240, 189, 241}: "Sipod Inc.", + [3]byte{240, 191, 151}: "Sony Corporation", + [3]byte{240, 193, 241}: "Apple, Inc.", + [3]byte{240, 194, 76}: "Zhejiang FeiYue Digital Technology Co., Ltd", + [3]byte{240, 194, 124}: "Mianyang Netop Telecom Equipment Co.,Ltd.", + [3]byte{240, 199, 127}: "Texas Instruments", + [3]byte{240, 200, 80}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{240, 200, 140}: "LeddarTech Inc.", + [3]byte{240, 203, 161}: "Apple, Inc.", + [3]byte{240, 209, 79}: "LINEAR LLC", + [3]byte{240, 209, 169}: "Apple, Inc.", + [3]byte{240, 209, 184}: "LEDVANCE", + [3]byte{240, 210, 241}: "Amazon Technologies Inc.", + [3]byte{240, 211, 167}: "CobaltRay Co., Ltd", + [3]byte{240, 211, 231}: "Sensometrix SA", + [3]byte{240, 212, 246}: "Lars Thrane A/S", + [3]byte{240, 213, 191}: "Intel Corporate", + [3]byte{240, 214, 87}: "ECHOSENS", + [3]byte{240, 215, 103}: "Axema Passagekontroll AB", + [3]byte{240, 215, 170}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{240, 217, 178}: "EXO S.A.", + [3]byte{240, 218, 124}: "RLH INDUSTRIES,INC.", + [3]byte{240, 219, 48}: "Yottabyte", + [3]byte{240, 219, 226}: "Apple, Inc.", + [3]byte{240, 219, 248}: "Apple, Inc.", + [3]byte{240, 220, 226}: "Apple, Inc.", + [3]byte{240, 222, 113}: "Shanghai EDO Technologies Co.,Ltd.", + [3]byte{240, 222, 185}: "ShangHai Y&Y Electronics Co., Ltd", + [3]byte{240, 222, 241}: "Wistron Infocomm (Zhongshan) Corporation", + [3]byte{240, 229, 195}: "Drägerwerk AG & Co. KG aA", + [3]byte{240, 231, 126}: "Samsung Electronics Co.,Ltd", + [3]byte{240, 235, 208}: "Shanghai Feixun Communication Co.,Ltd.", + [3]byte{240, 236, 57}: "Essec", + [3]byte{240, 237, 30}: "Bilkon Bilgisayar Kontrollu Cih. Im.Ltd.", + [3]byte{240, 238, 16}: "Samsung Electronics Co.,Ltd", + [3]byte{240, 238, 88}: "PACE Telematics GmbH", + [3]byte{240, 238, 187}: "VIPAR GmbH", + [3]byte{240, 239, 210}: "TF PAYMENT SERVICE CO., LTD", + [3]byte{240, 240, 2}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{240, 242, 73}: "Hitron Technologies. Inc", + [3]byte{240, 242, 96}: "Mobitec AB", + [3]byte{240, 243, 54}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{240, 245, 174}: "Adaptrum Inc.", + [3]byte{240, 246, 28}: "Apple, Inc.", + [3]byte{240, 246, 68}: "Whitesky Science & Technology Co.,Ltd.", + [3]byte{240, 246, 105}: "Motion Analysis Corporation", + [3]byte{240, 247, 85}: "Cisco Systems, Inc", + [3]byte{240, 247, 179}: "Phorm", + [3]byte{240, 248, 66}: "KEEBOX, Inc.", + [3]byte{240, 248, 242}: "Texas Instruments", + [3]byte{240, 249, 247}: "IES GmbH & Co. KG", + [3]byte{240, 253, 160}: "Acurix Networks Pty Ltd", + [3]byte{240, 254, 107}: "Shanghai High-Flying Electronics Technology Co., Ltd", + [3]byte{244, 3, 4}: "Google, Inc.", + [3]byte{244, 3, 33}: "BeNeXt B.V.", + [3]byte{244, 3, 47}: "Reduxio Systems", + [3]byte{244, 3, 67}: "Hewlett Packard Enterprise", + [3]byte{244, 4, 76}: "ValenceTech Limited", + [3]byte{244, 6, 105}: "Intel Corporate", + [3]byte{244, 6, 141}: "devolo AG", + [3]byte{244, 6, 165}: "Hangzhou Bianfeng Networking Technology Co., Ltd.", + [3]byte{244, 9, 216}: "SAMSUNG ELECTRO-MECHANICS(THAILAND)", + [3]byte{244, 10, 74}: "INDUSNET Communication Technology Co.,LTD", + [3]byte{244, 11, 147}: "BlackBerry RTS", + [3]byte{244, 14, 17}: "IEEE Registration Authority", + [3]byte{244, 14, 34}: "Samsung Electronics Co.,Ltd", + [3]byte{244, 14, 131}: "ARRIS Group, Inc.", + [3]byte{244, 15, 27}: "Cisco Systems, Inc", + [3]byte{244, 15, 36}: "Apple, Inc.", + [3]byte{244, 15, 155}: "WAVELINK", + [3]byte{244, 21, 53}: "SPON Communication Technology Co.,Ltd", + [3]byte{244, 21, 99}: "F5 Networks, Inc.", + [3]byte{244, 21, 253}: "Shanghai Pateo Electronic Equipment Manufacturing Co., Ltd.", + [3]byte{244, 23, 184}: "AirTies Wireless Networks", + [3]byte{244, 27, 161}: "Apple, Inc.", + [3]byte{244, 30, 38}: "Simon-Kaloi Engineering", + [3]byte{244, 30, 94}: "RtBrick Inc.", + [3]byte{244, 31, 11}: "YAMABISHI Corporation", + [3]byte{244, 31, 136}: "zte corporation", + [3]byte{244, 31, 194}: "Cisco Systems, Inc", + [3]byte{244, 32, 18}: "Cuciniale GmbH", + [3]byte{244, 40, 51}: "MMPC Inc.", + [3]byte{244, 40, 83}: "Zioncom Electronics (Shenzhen) Ltd.", + [3]byte{244, 40, 150}: "SPECTO PAINEIS ELETRONICOS LTDA", + [3]byte{244, 41, 129}: "vivo Mobile Communication Co., Ltd.", + [3]byte{244, 43, 72}: "Ubiqam", + [3]byte{244, 44, 86}: "SENOR TECH CO LTD", + [3]byte{244, 48, 185}: "Hewlett Packard", + [3]byte{244, 49, 195}: "Apple, Inc.", + [3]byte{244, 54, 225}: "Abilis Systems SARL", + [3]byte{244, 55, 183}: "Apple, Inc.", + [3]byte{244, 56, 20}: "Shanghai Howell Electronic Co.,Ltd", + [3]byte{244, 61, 128}: "FAG Industrial Services GmbH", + [3]byte{244, 62, 97}: "SHENZHEN GONGJIN ELECTRONICS CO.,LT", + [3]byte{244, 62, 157}: "Benu Networks, Inc.", + [3]byte{244, 65, 86}: "Arrikto Inc.", + [3]byte{244, 66, 39}: "S & S Research Inc.", + [3]byte{244, 66, 143}: "Samsung Electronics Co.,Ltd", + [3]byte{244, 68, 80}: "BND Co., Ltd.", + [3]byte{244, 69, 237}: "Portable Innovation Technology Ltd.", + [3]byte{244, 71, 19}: "Leading Public Performance Co., Ltd.", + [3]byte{244, 71, 42}: "Nanjing Rousing Sci. and Tech. Industrial Co., Ltd", + [3]byte{244, 72, 72}: "Amscreen Group Ltd", + [3]byte{244, 73, 239}: "EMSTONE", + [3]byte{244, 75, 42}: "Cisco SPVTG", + [3]byte{244, 76, 112}: "Skyworth Digital Technology(Shenzhen) Co.,Ltd", + [3]byte{244, 76, 127}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{244, 77, 23}: "GOLDCARD HIGH-TECH CO.,LTD.", + [3]byte{244, 77, 48}: "Elitegroup Computer Systems Co.,Ltd.", + [3]byte{244, 78, 5}: "Cisco Systems, Inc", + [3]byte{244, 78, 253}: "Actions Semiconductor Co.,Ltd.(Cayman Islands)", + [3]byte{244, 80, 235}: "Telechips Inc", + [3]byte{244, 82, 20}: "Mellanox Technologies, Inc.", + [3]byte{244, 84, 51}: "Rockwell Automation", + [3]byte{244, 85, 149}: "HENGBAO Corporation LTD.", + [3]byte{244, 85, 156}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{244, 85, 224}: "Niceway CNC Technology Co.,Ltd.Hunan Province", + [3]byte{244, 87, 62}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{244, 88, 66}: "Boxx TV Ltd", + [3]byte{244, 91, 115}: "Wanjiaan Interconnected Technology Co., Ltd", + [3]byte{244, 92, 137}: "Apple, Inc.", + [3]byte{244, 94, 171}: "Texas Instruments", + [3]byte{244, 95, 105}: "Matsufu Electronics distribution Company", + [3]byte{244, 95, 212}: "Cisco SPVTG", + [3]byte{244, 95, 247}: "DQ Technology Inc.", + [3]byte{244, 96, 13}: "Panoptic Technology, Inc", + [3]byte{244, 98, 208}: "Not for Radio, LLC", + [3]byte{244, 99, 73}: "Diffon Corporation", + [3]byte{244, 100, 93}: "Toshiba", + [3]byte{244, 103, 45}: "ShenZhen Topstar Technology Company", + [3]byte{244, 106, 146}: "SHENZHEN FAST TECHNOLOGIES CO.,LTD", + [3]byte{244, 106, 188}: "Adonit Corp. Ltd.", + [3]byte{244, 107, 239}: "Sagemcom Broadband SAS", + [3]byte{244, 109, 4}: "ASUSTek COMPUTER INC.", + [3]byte{244, 109, 226}: "zte corporation", + [3]byte{244, 110, 36}: "NEC Personal Computers, Ltd.", + [3]byte{244, 112, 171}: "vivo Mobile Communication Co., Ltd.", + [3]byte{244, 115, 202}: "Conversion Sound Inc.", + [3]byte{244, 118, 38}: "Viltechmeda UAB", + [3]byte{244, 122, 78}: "Woojeon&Handan", + [3]byte{244, 122, 204}: "SolidFire, Inc.", + [3]byte{244, 123, 94}: "Samsung Electronics Co.,Ltd", + [3]byte{244, 127, 53}: "Cisco Systems, Inc", + [3]byte{244, 129, 57}: "CANON INC.", + [3]byte{244, 131, 205}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{244, 131, 225}: "Shanghai Clouder Semiconductor Co.,Ltd", + [3]byte{244, 133, 198}: "FDT Technologies", + [3]byte{244, 135, 113}: "Infoblox", + [3]byte{244, 139, 50}: "Xiaomi Communications Co Ltd", + [3]byte{244, 140, 80}: "Intel Corporate", + [3]byte{244, 142, 9}: "Nokia Corporation", + [3]byte{244, 142, 56}: "Dell Inc.", + [3]byte{244, 142, 146}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{244, 144, 202}: "Tensorcom", + [3]byte{244, 144, 234}: "Deciso B.V.", + [3]byte{244, 145, 30}: "ZHUHAI EWPE INFORMATION TECHNOLOGY INC", + [3]byte{244, 147, 159}: "Hon Hai Precision Ind. Co., Ltd.", + [3]byte{244, 148, 97}: "NexGen Storage", + [3]byte{244, 148, 102}: "CountMax, ltd", + [3]byte{244, 150, 52}: "Intel Corporate", + [3]byte{244, 150, 81}: "NAKAYO Inc", + [3]byte{244, 153, 172}: "WEBER Schraubautomaten GmbH", + [3]byte{244, 158, 239}: "Taicang T&W Electronics", + [3]byte{244, 159, 84}: "Samsung Electronics Co.,Ltd", + [3]byte{244, 159, 243}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{244, 162, 148}: "EAGLE WORLD DEVELOPMENT CO., LIMITED", + [3]byte{244, 165, 42}: "Hawa Technologies Inc", + [3]byte{244, 167, 57}: "Juniper Networks", + [3]byte{244, 169, 151}: "CANON INC.", + [3]byte{244, 172, 193}: "Cisco Systems, Inc", + [3]byte{244, 177, 100}: "Lightning Telecommunications Technology Co. Ltd", + [3]byte{244, 179, 129}: "WindowMaster A/S", + [3]byte{244, 181, 32}: "Biostar Microtech international corp.", + [3]byte{244, 181, 47}: "Juniper Networks", + [3]byte{244, 181, 73}: "Xiamen Yeastar Information Technology Co., Ltd.", + [3]byte{244, 182, 229}: "TerraSem Co.,Ltd", + [3]byte{244, 183, 42}: "TIME INTERCONNECT LTD", + [3]byte{244, 183, 179}: "vivo Mobile Communication Co., Ltd.", + [3]byte{244, 183, 226}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{244, 184, 94}: "Texas Instruments", + [3]byte{244, 184, 167}: "zte corporation", + [3]byte{244, 189, 124}: "Chengdu jinshi communication Co., LTD", + [3]byte{244, 196, 71}: "Coagent International Enterprise Limited", + [3]byte{244, 196, 214}: "Shenzhen Xinfa Electronic Co.,ltd", + [3]byte{244, 198, 19}: "Alcatel-Lucent Shanghai Bell Co., Ltd", + [3]byte{244, 198, 215}: "blackned GmbH", + [3]byte{244, 199, 20}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{244, 199, 149}: "WEY Elektronik AG", + [3]byte{244, 202, 36}: "FreeBit Co., Ltd.", + [3]byte{244, 202, 229}: "FREEBOX SAS", + [3]byte{244, 203, 82}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{244, 204, 85}: "Juniper Networks", + [3]byte{244, 205, 144}: "Vispiron Rotec GmbH", + [3]byte{244, 206, 70}: "Hewlett Packard", + [3]byte{244, 207, 226}: "Cisco Systems, Inc", + [3]byte{244, 208, 50}: "Yunnan Ideal Information&Technology.,Ltd", + [3]byte{244, 210, 97}: "SEMOCON Co., Ltd", + [3]byte{244, 215, 178}: "LGS Innovations, LLC", + [3]byte{244, 217, 251}: "Samsung Electronics Co.,Ltd", + [3]byte{244, 220, 65}: "YOUNGZONE CULTURE (SHANGHAI) CORP", + [3]byte{244, 220, 77}: "Beijing CCD Digital Technology Co., Ltd", + [3]byte{244, 220, 218}: "Zhuhai Jiahe Communication Technology Co., limited", + [3]byte{244, 220, 249}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{244, 221, 158}: "GoPro", + [3]byte{244, 222, 12}: "ESPOD Ltd.", + [3]byte{244, 225, 66}: "Delta Elektronika BV", + [3]byte{244, 226, 4}: "Traqueur", + [3]byte{244, 227, 251}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{244, 228, 173}: "zte corporation", + [3]byte{244, 230, 215}: "Solar Power Technologies, Inc.", + [3]byte{244, 233, 38}: "Tianjin Zanpu Technology Inc.", + [3]byte{244, 233, 212}: "QLogic Corporation", + [3]byte{244, 234, 103}: "Cisco Systems, Inc", + [3]byte{244, 234, 181}: "Aerohive Networks Inc.", + [3]byte{244, 235, 56}: "Sagemcom Broadband SAS", + [3]byte{244, 236, 56}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{244, 237, 95}: "SHENZHEN KTC TECHNOLOGY GROUP", + [3]byte{244, 238, 20}: "SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.", + [3]byte{244, 239, 158}: "SGSG SCIENCE & TECHNOLOGY CO. LTD", + [3]byte{244, 241, 90}: "Apple, Inc.", + [3]byte{244, 241, 225}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{244, 242, 109}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{244, 243, 170}: "JBL GmbH & Co. KG", + [3]byte{244, 245, 36}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{244, 245, 165}: "Nokia Corporation", + [3]byte{244, 245, 216}: "Google, Inc.", + [3]byte{244, 245, 219}: "Xiaomi Communications Co Ltd", + [3]byte{244, 245, 232}: "Google, Inc.", + [3]byte{244, 246, 70}: "Dediprog Technology Co. Ltd.", + [3]byte{244, 249, 81}: "Apple, Inc.", + [3]byte{244, 252, 50}: "Texas Instruments", + [3]byte{244, 252, 177}: "JJ Corp", + [3]byte{244, 253, 43}: "ZOYI Company", + [3]byte{248, 1, 19}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{248, 2, 120}: "IEEE Registration Authority", + [3]byte{248, 3, 50}: "Khomp", + [3]byte{248, 3, 119}: "Apple, Inc.", + [3]byte{248, 4, 46}: "SAMSUNG ELECTRO-MECHANICS(THAILAND)", + [3]byte{248, 5, 28}: "DRS Imaging and Targeting Solutions", + [3]byte{248, 11, 190}: "ARRIS Group, Inc.", + [3]byte{248, 11, 203}: "Cisco Systems, Inc", + [3]byte{248, 11, 208}: "Datang Telecom communication terminal (Tianjin) Co., Ltd.", + [3]byte{248, 12, 243}: "LG Electronics (Mobile Communications)", + [3]byte{248, 13, 67}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{248, 13, 96}: "CANON INC.", + [3]byte{248, 13, 234}: "ZyCast Technology Inc.", + [3]byte{248, 15, 65}: "Wistron Infocomm (Zhongshan) Corporation", + [3]byte{248, 15, 132}: "Natural Security SAS", + [3]byte{248, 16, 55}: "Atopia Systems, LP", + [3]byte{248, 21, 71}: "Avaya Inc", + [3]byte{248, 22, 84}: "Intel Corporate", + [3]byte{248, 24, 151}: "2Wire Inc", + [3]byte{248, 26, 103}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{248, 28, 229}: "Telefonbau Behnke GmbH", + [3]byte{248, 29, 15}: "Hitron Technologies. Inc", + [3]byte{248, 29, 120}: "IEEE Registration Authority", + [3]byte{248, 29, 144}: "Solidwintech", + [3]byte{248, 29, 147}: "Longdhua(Beijing) Controls Technology Co.,Ltd", + [3]byte{248, 30, 223}: "Apple, Inc.", + [3]byte{248, 32, 85}: "Green Information System", + [3]byte{248, 34, 133}: "Cypress Technology CO., LTD.", + [3]byte{248, 35, 178}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{248, 36, 65}: "Yeelink", + [3]byte{248, 39, 147}: "Apple, Inc.", + [3]byte{248, 40, 25}: "Liteon Technology Corporation", + [3]byte{248, 43, 200}: "Jiangsu Switter Co., Ltd", + [3]byte{248, 44, 24}: "2Wire Inc", + [3]byte{248, 46, 219}: "RTW GmbH & Co. KG", + [3]byte{248, 47, 8}: "Molex", + [3]byte{248, 47, 91}: "eGauge Systems LLC", + [3]byte{248, 47, 168}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{248, 48, 148}: "Alcatel-Lucent Telecom Limited", + [3]byte{248, 49, 62}: "endeavour GmbH", + [3]byte{248, 50, 228}: "ASUSTek COMPUTER INC.", + [3]byte{248, 51, 118}: "Good Mind Innovation Co., Ltd.", + [3]byte{248, 52, 65}: "Intel Corporate", + [3]byte{248, 53, 83}: "Magenta Research Ltd.", + [3]byte{248, 53, 221}: "Gemtek Technology Co., Ltd.", + [3]byte{248, 61, 78}: "Softlink Automation System Co., Ltd", + [3]byte{248, 61, 255}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{248, 63, 81}: "Samsung Electronics Co.,Ltd", + [3]byte{248, 66, 251}: "Yasuda Joho Co.,ltd.", + [3]byte{248, 68, 227}: "Taicang T&W Electronics", + [3]byte{248, 69, 173}: "Konka Group Co., Ltd.", + [3]byte{248, 70, 28}: "Sony Interactive Entertainment Inc.", + [3]byte{248, 70, 45}: "SYNTEC Incorporation", + [3]byte{248, 71, 45}: "X2gen Digital Corp. Ltd", + [3]byte{248, 72, 151}: "Hitachi, Ltd.", + [3]byte{248, 74, 115}: "EUMTECH CO., LTD", + [3]byte{248, 74, 127}: "Innometriks Inc", + [3]byte{248, 74, 191}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{248, 79, 87}: "Cisco Systems, Inc", + [3]byte{248, 80, 99}: "Verathon", + [3]byte{248, 81, 109}: "Denwa Technology Corp.", + [3]byte{248, 82, 223}: "VNL Europe AB", + [3]byte{248, 84, 175}: "ECI Telecom Ltd.", + [3]byte{248, 87, 46}: "Core Brands, LLC", + [3]byte{248, 89, 113}: "Intel Corporate", + [3]byte{248, 90, 0}: "Sanford LP", + [3]byte{248, 91, 156}: "SB SYSTEMS Co.,Ltd", + [3]byte{248, 91, 201}: "M-Cube Spa", + [3]byte{248, 92, 69}: "IC Nexus Co. Ltd.", + [3]byte{248, 92, 77}: "NOKIA", + [3]byte{248, 95, 42}: "Nokia Corporation", + [3]byte{248, 98, 20}: "Apple, Inc.", + [3]byte{248, 98, 170}: "xn systems", + [3]byte{248, 99, 63}: "Intel Corporate", + [3]byte{248, 100, 101}: "Anova Applied Electronics, Inc.", + [3]byte{248, 102, 1}: "Suzhou Chi-tek information technology Co., Ltd", + [3]byte{248, 102, 209}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{248, 102, 242}: "Cisco Systems, Inc", + [3]byte{248, 105, 113}: "Seibu Electric Co.,", + [3]byte{248, 108, 225}: "Taicang T&W Electronics", + [3]byte{248, 110, 207}: "Arcx Inc", + [3]byte{248, 110, 238}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{248, 113, 254}: "The Goldman Sachs Group, Inc.", + [3]byte{248, 114, 234}: "Cisco Systems, Inc", + [3]byte{248, 115, 148}: "NETGEAR", + [3]byte{248, 115, 162}: "Avaya Inc", + [3]byte{248, 117, 136}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{248, 118, 155}: "Neopis Co., Ltd.", + [3]byte{248, 119, 184}: "Samsung Electronics Co.,Ltd", + [3]byte{248, 122, 239}: "Rosonix Technology, Inc.", + [3]byte{248, 123, 32}: "Cisco Systems, Inc", + [3]byte{248, 123, 98}: "FASTWEL INTERNATIONAL CO., LTD. Taiwan Branch", + [3]byte{248, 123, 122}: "ARRIS Group, Inc.", + [3]byte{248, 123, 140}: "Amped Wireless", + [3]byte{248, 128, 150}: "Elsys Equipamentos Eletrônicos Ltda", + [3]byte{248, 129, 26}: "OVERKIZ", + [3]byte{248, 132, 121}: "Yaojin Technology(Shenzhen)Co.,Ltd", + [3]byte{248, 132, 242}: "Samsung Electronics Co.,Ltd", + [3]byte{248, 138, 60}: "IEEE Registration Authority", + [3]byte{248, 140, 28}: "KAISHUN ELECTRONIC TECHNOLOGY CO., LTD. BEIJING", + [3]byte{248, 141, 239}: "Tenebraex", + [3]byte{248, 142, 133}: "Comtrend Corporation", + [3]byte{248, 143, 202}: "Google, Inc.", + [3]byte{248, 145, 42}: "GLP German Light Products GmbH", + [3]byte{248, 147, 243}: "VOLANS", + [3]byte{248, 148, 194}: "Intel Corporate", + [3]byte{248, 149, 80}: "Proton Products Chengdu Ltd", + [3]byte{248, 149, 199}: "LG Electronics (Mobile Communications)", + [3]byte{248, 151, 207}: "DAESHIN-INFORMATION TECHNOLOGY CO., LTD.", + [3]byte{248, 152, 58}: "Leeman International (HongKong) Limited", + [3]byte{248, 152, 185}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{248, 153, 85}: "Fortress Technology Inc", + [3]byte{248, 157, 13}: "Control Technology Inc.", + [3]byte{248, 157, 187}: "Tintri", + [3]byte{248, 159, 184}: "YAZAKI Energy System Corporation", + [3]byte{248, 160, 61}: "Dinstar Technologies Co., Ltd.", + [3]byte{248, 160, 151}: "ARRIS Group, Inc.", + [3]byte{248, 161, 136}: "LED Roadway Lighting", + [3]byte{248, 162, 180}: "RHEWA-WAAGENFABRIK August Freudewald GmbH &Co. KG", + [3]byte{248, 163, 79}: "zte corporation", + [3]byte{248, 164, 95}: "Xiaomi Communications Co Ltd", + [3]byte{248, 165, 197}: "Cisco Systems, Inc", + [3]byte{248, 169, 99}: "COMPAL INFORMATION (KUNSHAN) CO., LTD.", + [3]byte{248, 169, 208}: "LG Electronics (Mobile Communications)", + [3]byte{248, 169, 222}: "PUISSANCE PLUS", + [3]byte{248, 170, 138}: "Axview Technology (Shenzhen) Co.,Ltd", + [3]byte{248, 171, 5}: "Sagemcom Broadband SAS", + [3]byte{248, 172, 109}: "Deltenna Ltd", + [3]byte{248, 177, 86}: "Dell Inc.", + [3]byte{248, 178, 243}: "GUANGZHOU BOSMA TECHNOLOGY CO.,LTD", + [3]byte{248, 181, 104}: "IEEE Registration Authority", + [3]byte{248, 181, 153}: "Guangzhou CHNAVS Digital Technology Co.,Ltd", + [3]byte{248, 183, 226}: "Cisco Systems, Inc", + [3]byte{248, 187, 191}: "eero inc.", + [3]byte{248, 188, 18}: "Dell Inc.", + [3]byte{248, 188, 65}: "Rosslare Enterprises Limited", + [3]byte{248, 190, 13}: "A2UICT Co.,Ltd.", + [3]byte{248, 191, 9}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{248, 192, 1}: "Juniper Networks", + [3]byte{248, 192, 145}: "Highgates Technology", + [3]byte{248, 194, 136}: "Cisco Systems, Inc", + [3]byte{248, 195, 114}: "TSUZUKI DENKI", + [3]byte{248, 195, 151}: "NZXT Corp. Ltd.", + [3]byte{248, 198, 120}: "Carefusion", + [3]byte{248, 201, 108}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{248, 202, 184}: "Dell Inc.", + [3]byte{248, 207, 197}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{248, 208, 39}: "Seiko Epson Corporation", + [3]byte{248, 208, 172}: "Sony Interactive Entertainment Inc.", + [3]byte{248, 208, 189}: "Samsung Electronics Co.,Ltd", + [3]byte{248, 209, 17}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{248, 211, 169}: "AXAN Networks", + [3]byte{248, 212, 98}: "Pumatronix Equipamentos Eletronicos Ltda.", + [3]byte{248, 215, 86}: "Simm Tronic Limited", + [3]byte{248, 215, 191}: "REV Ritter GmbH", + [3]byte{248, 218, 12}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{248, 218, 223}: "EcoTech, Inc.", + [3]byte{248, 218, 226}: "Beta LaserMike", + [3]byte{248, 218, 244}: "Taishan Online Technology Co., Ltd.", + [3]byte{248, 219, 76}: "PNY Technologies, INC.", + [3]byte{248, 219, 127}: "HTC Corporation", + [3]byte{248, 219, 136}: "Dell Inc.", + [3]byte{248, 220, 122}: "Variscite LTD", + [3]byte{248, 223, 168}: "zte corporation", + [3]byte{248, 224, 121}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{248, 228, 251}: "Actiontec Electronics, Inc", + [3]byte{248, 230, 26}: "Samsung Electronics Co.,Ltd", + [3]byte{248, 231, 30}: "Ruckus Wireless", + [3]byte{248, 231, 181}: "µTech Tecnologia LTDA", + [3]byte{248, 232, 17}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{248, 233, 3}: "D-Link International", + [3]byte{248, 233, 104}: "Egker Kft.", + [3]byte{248, 234, 10}: "Dipl.-Math. Michael Rauch", + [3]byte{248, 237, 165}: "ARRIS Group, Inc.", + [3]byte{248, 240, 5}: "Newport Media Inc.", + [3]byte{248, 240, 20}: "RackWare Inc.", + [3]byte{248, 240, 130}: "NAG LLC", + [3]byte{248, 241, 182}: "Motorola Mobility LLC, a Lenovo Company", + [3]byte{248, 242, 30}: "Intel Corporate", + [3]byte{248, 242, 90}: "G-Lab GmbH", + [3]byte{248, 244, 100}: "Rawe Electonic GmbH", + [3]byte{248, 247, 211}: "International Communications Corporation", + [3]byte{248, 247, 255}: "SYN-TECH SYSTEMS INC", + [3]byte{248, 251, 47}: "Santur Corporation", + [3]byte{248, 254, 92}: "Reciprocal Labs Corp", + [3]byte{248, 254, 168}: "Technico Japan Corporation", + [3]byte{248, 255, 11}: "Electronic Technology Inc.", + [3]byte{248, 255, 95}: "Shenzhen Communication Technology Co.,Ltd", + [3]byte{252, 0, 18}: "Toshiba Samsung Storage Technolgoy Korea Corporation", + [3]byte{252, 1, 124}: "Hon Hai Precision Ind. Co.,Ltd.", + [3]byte{252, 1, 158}: "VIEVU", + [3]byte{252, 1, 205}: "FUNDACION TEKNIKER", + [3]byte{252, 6, 71}: "Cortland Research, LLC", + [3]byte{252, 6, 237}: "M2Motive Technology Inc.", + [3]byte{252, 7, 160}: "LRE Medical GmbH", + [3]byte{252, 8, 74}: "FUJITSU LIMITED", + [3]byte{252, 8, 119}: "Prentke Romich Company", + [3]byte{252, 9, 216}: "ACTEON Group", + [3]byte{252, 9, 246}: "GUANGDONG TONZE ELECTRIC CO.,LTD", + [3]byte{252, 10, 129}: "Extreme Networks, Inc.", + [3]byte{252, 15, 75}: "Texas Instruments", + [3]byte{252, 15, 230}: "Sony Interactive Entertainment Inc.", + [3]byte{252, 16, 189}: "Control Sistematizado S.A.", + [3]byte{252, 16, 198}: "Taicang T&W Electronics", + [3]byte{252, 17, 134}: "Logic3 plc", + [3]byte{252, 19, 73}: "Global Apps Corp.", + [3]byte{252, 21, 180}: "Hewlett Packard", + [3]byte{252, 22, 7}: "Taian Technology(Wuxi) Co.,Ltd.", + [3]byte{252, 23, 148}: "InterCreative Co., Ltd", + [3]byte{252, 25, 16}: "Samsung Electronics Co.,Ltd", + [3]byte{252, 25, 208}: "Cloud Vision Networks Technology Co.,Ltd.", + [3]byte{252, 26, 17}: "vivo Mobile Communication Co., Ltd.", + [3]byte{252, 27, 255}: "V-ZUG AG", + [3]byte{252, 29, 89}: "I Smart Cities HK Ltd", + [3]byte{252, 29, 132}: "Autobase", + [3]byte{252, 30, 22}: "IPEVO corp", + [3]byte{252, 31, 25}: "SAMSUNG ELECTRO MECHANICS CO., LTD.", + [3]byte{252, 31, 192}: "EURECAM", + [3]byte{252, 34, 156}: "Han Kyung I Net Co.,Ltd.", + [3]byte{252, 35, 37}: "EosTek (Shenzhen) Co., Ltd.", + [3]byte{252, 37, 63}: "Apple, Inc.", + [3]byte{252, 39, 162}: "TRANS ELECTRIC CO., LTD.", + [3]byte{252, 42, 84}: "Connected Data, Inc.", + [3]byte{252, 45, 94}: "zte corporation", + [3]byte{252, 46, 45}: "Lorom Industrial Co.LTD.", + [3]byte{252, 47, 64}: "Calxeda, Inc.", + [3]byte{252, 47, 107}: "Everspin Technologies, Inc.", + [3]byte{252, 47, 170}: "Nokia", + [3]byte{252, 47, 239}: "UTT Technologies Co., Ltd.", + [3]byte{252, 50, 136}: "CELOT Wireless Co., Ltd", + [3]byte{252, 51, 95}: "Polyera", + [3]byte{252, 53, 152}: "Favite Inc.", + [3]byte{252, 53, 230}: "Visteon corp", + [3]byte{252, 55, 43}: "SICHUAN TIANYI COMHEART TELECOMCO.,LTD", + [3]byte{252, 60, 233}: "Tsingtong Technologies Co, Ltd.", + [3]byte{252, 61, 147}: "LONGCHEER TELECOMMUNICATION LIMITED", + [3]byte{252, 63, 124}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{252, 63, 171}: "Henan Lanxin Technology Co., Ltd", + [3]byte{252, 63, 219}: "Hewlett Packard", + [3]byte{252, 66, 3}: "Samsung Electronics Co.,Ltd", + [3]byte{252, 68, 99}: "Universal Audio, Inc", + [3]byte{252, 68, 153}: "Swarco LEA d.o.o.", + [3]byte{252, 69, 95}: "JIANGXI SHANSHUI OPTOELECTRONIC TECHNOLOGY CO.,LTD", + [3]byte{252, 69, 150}: "COMPAL INFORMATION (KUNSHAN) CO., LTD.", + [3]byte{252, 72, 239}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{252, 74, 233}: "Castlenet Technology Inc.", + [3]byte{252, 75, 28}: "INTERSENSOR S.R.L.", + [3]byte{252, 75, 188}: "Sunplus Technology Co., Ltd.", + [3]byte{252, 77, 140}: "SHENZHEN PANTE ELECTRONICS TECHNOLOGY CO., LTD", + [3]byte{252, 77, 212}: "Universal Global Scientific Industrial Co., Ltd.", + [3]byte{252, 80, 144}: "SIMEX Sp. z o.o.", + [3]byte{252, 81, 164}: "ARRIS Group, Inc.", + [3]byte{252, 82, 141}: "Technicolor CH USA Inc.", + [3]byte{252, 82, 206}: "Control iD", + [3]byte{252, 83, 158}: "Shanghai Wind Technologies Co.,Ltd", + [3]byte{252, 85, 220}: "Baltic Latvian Universal Electronics LLC", + [3]byte{252, 88, 250}: "Shen Zhen Shi Xin Zhong Xin Technology Co.,Ltd.", + [3]byte{252, 90, 29}: "Hitron Technologies. Inc", + [3]byte{252, 91, 36}: "Weibel Scientific A/S", + [3]byte{252, 91, 38}: "MikroBits", + [3]byte{252, 91, 57}: "Cisco Systems, Inc", + [3]byte{252, 96, 24}: "Zhejiang Kangtai Electric Co., Ltd.", + [3]byte{252, 97, 152}: "NEC Personal Products, Ltd", + [3]byte{252, 98, 110}: "Beijing MDC Telecom", + [3]byte{252, 98, 185}: "ALPS ELECTRIC CO.,LTD.", + [3]byte{252, 100, 186}: "Xiaomi Communications Co Ltd", + [3]byte{252, 101, 222}: "Amazon Technologies Inc.", + [3]byte{252, 104, 62}: "Directed Perception, Inc", + [3]byte{252, 108, 49}: "LXinstruments GmbH", + [3]byte{252, 109, 192}: "BME CORPORATION", + [3]byte{252, 111, 183}: "ARRIS Group, Inc.", + [3]byte{252, 117, 22}: "D-Link International", + [3]byte{252, 117, 230}: "Handreamnet", + [3]byte{252, 121, 11}: "Hitachi High Technologies America, Inc.", + [3]byte{252, 124, 231}: "FCI USA LLC", + [3]byte{252, 127, 86}: "CoSyst Control Systems GmbH", + [3]byte{252, 131, 41}: "Trei technics", + [3]byte{252, 131, 153}: "Avaya Inc", + [3]byte{252, 131, 198}: "N-Radio Technologies Co., Ltd.", + [3]byte{252, 139, 151}: "SHENZHEN GONGJIN ELECTRONICS CO.,LT", + [3]byte{252, 142, 126}: "ARRIS Group, Inc.", + [3]byte{252, 143, 144}: "Samsung Electronics Co.,Ltd", + [3]byte{252, 143, 196}: "Intelligent Technology Inc.", + [3]byte{252, 145, 20}: "Technicolor CH USA Inc.", + [3]byte{252, 146, 59}: "Nokia Corporation", + [3]byte{252, 148, 108}: "UBIVELOX", + [3]byte{252, 148, 227}: "Technicolor CH USA Inc.", + [3]byte{252, 153, 71}: "Cisco Systems, Inc", + [3]byte{252, 154, 250}: "Motus Global Inc.", + [3]byte{252, 157, 216}: "Beijing TongTongYiLian Science and Technology Ltd.", + [3]byte{252, 159, 174}: "Fidus Systems Inc", + [3]byte{252, 159, 225}: "CONWIN.Tech. Ltd", + [3]byte{252, 161, 62}: "Samsung Electronics Co.,Ltd", + [3]byte{252, 162, 42}: "PT. Callysta Multi Engineering", + [3]byte{252, 163, 134}: "SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD", + [3]byte{252, 166, 103}: "Amazon Technologies Inc.", + [3]byte{252, 168, 65}: "Avaya Inc", + [3]byte{252, 168, 154}: "Sunitec Enterprise Co.,Ltd", + [3]byte{252, 169, 176}: "MIARTECH (SHANGHAI),INC.", + [3]byte{252, 170, 20}: "GIGA-BYTE TECHNOLOGY CO.,LTD.", + [3]byte{252, 173, 15}: "QTS NETWORKS", + [3]byte{252, 175, 106}: "Qulsar Inc", + [3]byte{252, 175, 172}: "Socionext Inc.", + [3]byte{252, 176, 196}: "Shanghai DareGlobal Technologies Co.,Ltd", + [3]byte{252, 180, 230}: "ASKEY COMPUTER CORP", + [3]byte{252, 181, 138}: "Wapice Ltd.", + [3]byte{252, 182, 152}: "Cambridge Industries(Group) Co.,Ltd.", + [3]byte{252, 187, 161}: "Shenzhen Minicreate Technology Co.,Ltd", + [3]byte{252, 188, 156}: "Vimar Spa", + [3]byte{252, 194, 51}: "Private", + [3]byte{252, 194, 61}: "Atmel Corporation", + [3]byte{252, 194, 222}: "Murata Manufacturing Co., Ltd.", + [3]byte{252, 199, 52}: "Samsung Electronics Co.,Ltd", + [3]byte{252, 200, 151}: "zte corporation", + [3]byte{252, 202, 196}: "LifeHealth, LLC", + [3]byte{252, 204, 228}: "Ascon Ltd.", + [3]byte{252, 207, 67}: "HUIZHOU CITY HUIYANG DISTRICT MEISIQI INDUSTRY DEVELOPMENT CO,.LTD", + [3]byte{252, 207, 98}: "IBM Corp", + [3]byte{252, 212, 242}: "The Coca Cola Company", + [3]byte{252, 212, 246}: "Messana Air.Ray Conditioning s.r.l.", + [3]byte{252, 213, 217}: "Shenzhen SDMC Technology Co., Ltd.", + [3]byte{252, 214, 189}: "Robert Bosch GmbH", + [3]byte{252, 215, 51}: "TP-LINK TECHNOLOGIES CO.,LTD.", + [3]byte{252, 216, 23}: "Beijing Hesun Technologies Co.Ltd.", + [3]byte{252, 216, 72}: "Apple, Inc.", + [3]byte{252, 219, 150}: "ENERVALLEY CO., LTD", + [3]byte{252, 219, 179}: "Murata Manufacturing Co., Ltd.", + [3]byte{252, 220, 74}: "G-Wearables Corp.", + [3]byte{252, 221, 85}: "Shenzhen WeWins wireless Co.,Ltd", + [3]byte{252, 225, 134}: "A3M Co., LTD", + [3]byte{252, 225, 146}: "Sichuan Jinwangtong Electronic Science&Technology Co,.Ltd", + [3]byte{252, 225, 217}: "Stable Imaging Solutions LLC", + [3]byte{252, 225, 251}: "Array Networks", + [3]byte{252, 226, 63}: "CLAY PAKY SPA", + [3]byte{252, 227, 60}: "HUAWEI TECHNOLOGIES CO.,LTD", + [3]byte{252, 229, 87}: "Nokia Corporation", + [3]byte{252, 232, 146}: "Hangzhou Lancable Technology Co.,Ltd", + [3]byte{252, 233, 152}: "Apple, Inc.", + [3]byte{252, 236, 218}: "Ubiquiti Networks Inc.", + [3]byte{252, 237, 185}: "Arrayent", + [3]byte{252, 238, 230}: "FORMIKE ELECTRONIC CO., LTD", + [3]byte{252, 241, 54}: "Samsung Electronics Co.,Ltd", + [3]byte{252, 241, 82}: "Sony Corporation", + [3]byte{252, 241, 205}: "OPTEX-FA CO.,LTD.", + [3]byte{252, 245, 40}: "Zyxel Communications Corporation", + [3]byte{252, 246, 71}: "Fiberhome Telecommunication Technologies Co.,LTD", + [3]byte{252, 248, 174}: "Intel Corporate", + [3]byte{252, 248, 183}: "TRONTEQ Electronic", + [3]byte{252, 250, 247}: "Shanghai Baud Data Communication Co.,Ltd.", + [3]byte{252, 251, 251}: "Cisco Systems, Inc", + [3]byte{252, 252, 72}: "Apple, Inc.", + [3]byte{252, 254, 119}: "Hitachi Reftechno, Inc.", + [3]byte{252, 254, 194}: "Invensys Controls UK Limited", + [3]byte{252, 255, 170}: "IEEE Registration Authority", +} diff --git a/vendor/github.com/google/gopacket/packet.go b/vendor/github.com/google/gopacket/packet.go new file mode 100644 index 0000000..76b62d8 --- /dev/null +++ b/vendor/github.com/google/gopacket/packet.go @@ -0,0 +1,838 @@ +// 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 gopacket + +import ( + "bytes" + "encoding/hex" + "errors" + "fmt" + "io" + "os" + "reflect" + "runtime/debug" + "strings" + "time" +) + +// CaptureInfo provides standardized information about a packet captured off +// the wire or read from a file. +type CaptureInfo struct { + // Timestamp is the time the packet was captured, if that is known. + Timestamp time.Time + // CaptureLength is the total number of bytes read off of the wire. + CaptureLength int + // Length is the size of the original packet. Should always be >= + // CaptureLength. + Length int + // InterfaceIndex + InterfaceIndex int +} + +// PacketMetadata contains metadata for a packet. +type PacketMetadata struct { + CaptureInfo + // Truncated is true if packet decoding logic detects that there are fewer + // bytes in the packet than are detailed in various headers (for example, if + // the number of bytes in the IPv4 contents/payload is less than IPv4.Length). + // This is also set automatically for packets captured off the wire if + // CaptureInfo.CaptureLength < CaptureInfo.Length. + Truncated bool +} + +// Packet is the primary object used by gopacket. Packets are created by a +// Decoder's Decode call. A packet is made up of a set of Data, which +// is broken into a number of Layers as it is decoded. +type Packet interface { + //// Functions for outputting the packet as a human-readable string: + //// ------------------------------------------------------------------ + // String returns a human-readable string representation of the packet. + // It uses LayerString on each layer to output the layer. + String() string + // Dump returns a verbose human-readable string representation of the packet, + // including a hex dump of all layers. It uses LayerDump on each layer to + // output the layer. + Dump() string + + //// Functions for accessing arbitrary packet layers: + //// ------------------------------------------------------------------ + // Layers returns all layers in this packet, computing them as necessary + Layers() []Layer + // Layer returns the first layer in this packet of the given type, or nil + Layer(LayerType) Layer + // LayerClass returns the first layer in this packet of the given class, + // or nil. + LayerClass(LayerClass) Layer + + //// Functions for accessing specific types of packet layers. These functions + //// return the first layer of each type found within the packet. + //// ------------------------------------------------------------------ + // LinkLayer returns the first link layer in the packet + LinkLayer() LinkLayer + // NetworkLayer returns the first network layer in the packet + NetworkLayer() NetworkLayer + // TransportLayer returns the first transport layer in the packet + TransportLayer() TransportLayer + // ApplicationLayer returns the first application layer in the packet + ApplicationLayer() ApplicationLayer + // ErrorLayer is particularly useful, since it returns nil if the packet + // was fully decoded successfully, and non-nil if an error was encountered + // in decoding and the packet was only partially decoded. Thus, its output + // can be used to determine if the entire packet was able to be decoded. + ErrorLayer() ErrorLayer + + //// Functions for accessing data specific to the packet: + //// ------------------------------------------------------------------ + // Data returns the set of bytes that make up this entire packet. + Data() []byte + // Metadata returns packet metadata associated with this packet. + Metadata() *PacketMetadata +} + +// packet contains all the information we need to fulfill the Packet interface, +// and its two "subclasses" (yes, no such thing in Go, bear with me), +// eagerPacket and lazyPacket, provide eager and lazy decoding logic around the +// various functions needed to access this information. +type packet struct { + // data contains the entire packet data for a packet + data []byte + // initialLayers is space for an initial set of layers already created inside + // the packet. + initialLayers [6]Layer + // layers contains each layer we've already decoded + layers []Layer + // last is the last layer added to the packet + last Layer + // metadata is the PacketMetadata for this packet + metadata PacketMetadata + + decodeOptions DecodeOptions + + // Pointers to the various important layers + link LinkLayer + network NetworkLayer + transport TransportLayer + application ApplicationLayer + failure ErrorLayer +} + +func (p *packet) SetTruncated() { + p.metadata.Truncated = true +} + +func (p *packet) SetLinkLayer(l LinkLayer) { + if p.link == nil { + p.link = l + } +} + +func (p *packet) SetNetworkLayer(l NetworkLayer) { + if p.network == nil { + p.network = l + } +} + +func (p *packet) SetTransportLayer(l TransportLayer) { + if p.transport == nil { + p.transport = l + } +} + +func (p *packet) SetApplicationLayer(l ApplicationLayer) { + if p.application == nil { + p.application = l + } +} + +func (p *packet) SetErrorLayer(l ErrorLayer) { + if p.failure == nil { + p.failure = l + } +} + +func (p *packet) AddLayer(l Layer) { + p.layers = append(p.layers, l) + p.last = l +} + +func (p *packet) DumpPacketData() { + fmt.Fprint(os.Stderr, p.packetDump()) + os.Stderr.Sync() +} + +func (p *packet) Metadata() *PacketMetadata { + return &p.metadata +} + +func (p *packet) Data() []byte { + return p.data +} + +func (p *packet) DecodeOptions() *DecodeOptions { + return &p.decodeOptions +} + +func (p *packet) addFinalDecodeError(err error, stack []byte) { + fail := &DecodeFailure{err: err, stack: stack} + if p.last == nil { + fail.data = p.data + } else { + fail.data = p.last.LayerPayload() + } + p.AddLayer(fail) + p.SetErrorLayer(fail) +} + +func (p *packet) recoverDecodeError() { + if !p.decodeOptions.SkipDecodeRecovery { + if r := recover(); r != nil { + p.addFinalDecodeError(fmt.Errorf("%v", r), debug.Stack()) + } + } +} + +// LayerString outputs an individual layer as a string. The layer is output +// in a single line, with no trailing newline. This function is specifically +// designed to do the right thing for most layers... it follows the following +// rules: +// * If the Layer has a String function, just output that. +// * Otherwise, output all exported fields in the layer, recursing into +// exported slices and structs. +// NOTE: This is NOT THE SAME AS fmt's "%#v". %#v will output both exported +// and unexported fields... many times packet layers contain unexported stuff +// that would just mess up the output of the layer, see for example the +// Payload layer and it's internal 'data' field, which contains a large byte +// array that would really mess up formatting. +func LayerString(l Layer) string { + return fmt.Sprintf("%v\t%s", l.LayerType(), layerString(reflect.ValueOf(l), false, false)) +} + +// Dumper dumps verbose information on a value. If a layer type implements +// Dumper, then its LayerDump() string will include the results in its output. +type Dumper interface { + Dump() string +} + +// LayerDump outputs a very verbose string representation of a layer. Its +// output is a concatenation of LayerString(l) and hex.Dump(l.LayerContents()). +// It contains newlines and ends with a newline. +func LayerDump(l Layer) string { + var b bytes.Buffer + b.WriteString(LayerString(l)) + b.WriteByte('\n') + if d, ok := l.(Dumper); ok { + dump := d.Dump() + if dump != "" { + b.WriteString(dump) + if dump[len(dump)-1] != '\n' { + b.WriteByte('\n') + } + } + } + b.WriteString(hex.Dump(l.LayerContents())) + return b.String() +} + +// layerString outputs, recursively, a layer in a "smart" way. See docs for +// LayerString for more details. +// +// Params: +// i - value to write out +// anonymous: if we're currently recursing an anonymous member of a struct +// writeSpace: if we've already written a value in a struct, and need to +// write a space before writing more. This happens when we write various +// anonymous values, and need to keep writing more. +func layerString(v reflect.Value, anonymous bool, writeSpace bool) string { + // Let String() functions take precedence. + if v.CanInterface() { + if s, ok := v.Interface().(fmt.Stringer); ok { + return s.String() + } + } + // Reflect, and spit out all the exported fields as key=value. + switch v.Type().Kind() { + case reflect.Interface, reflect.Ptr: + if v.IsNil() { + return "nil" + } + r := v.Elem() + return layerString(r, anonymous, writeSpace) + case reflect.Struct: + var b bytes.Buffer + typ := v.Type() + if !anonymous { + b.WriteByte('{') + } + for i := 0; i < v.NumField(); i++ { + // Check if this is upper-case. + ftype := typ.Field(i) + f := v.Field(i) + if ftype.Anonymous { + anonStr := layerString(f, true, writeSpace) + writeSpace = writeSpace || anonStr != "" + b.WriteString(anonStr) + } else if ftype.PkgPath == "" { // exported + if writeSpace { + b.WriteByte(' ') + } + writeSpace = true + fmt.Fprintf(&b, "%s=%s", typ.Field(i).Name, layerString(f, false, writeSpace)) + } + } + if !anonymous { + b.WriteByte('}') + } + return b.String() + case reflect.Slice: + var b bytes.Buffer + b.WriteByte('[') + if v.Len() > 4 { + fmt.Fprintf(&b, "..%d..", v.Len()) + } else { + for j := 0; j < v.Len(); j++ { + if j != 0 { + b.WriteString(", ") + } + b.WriteString(layerString(v.Index(j), false, false)) + } + } + b.WriteByte(']') + return b.String() + } + return fmt.Sprintf("%v", v.Interface()) +} + +const ( + longBytesLength = 128 +) + +// LongBytesGoString returns a string representation of the byte slice shortened +// using the format '<type>{<truncated slice> ... (<n> bytes)}' if it +// exceeds a predetermined length. Can be used to avoid filling the display with +// very long byte strings. +func LongBytesGoString(buf []byte) string { + if len(buf) < longBytesLength { + return fmt.Sprintf("%#v", buf) + } + s := fmt.Sprintf("%#v", buf[:longBytesLength-1]) + s = strings.TrimSuffix(s, "}") + return fmt.Sprintf("%s ... (%d bytes)}", s, len(buf)) +} + +func baseLayerString(value reflect.Value) string { + t := value.Type() + content := value.Field(0) + c := make([]byte, content.Len()) + for i := range c { + c[i] = byte(content.Index(i).Uint()) + } + payload := value.Field(1) + p := make([]byte, payload.Len()) + for i := range p { + p[i] = byte(payload.Index(i).Uint()) + } + return fmt.Sprintf("%s{Contents:%s, Payload:%s}", t.String(), + LongBytesGoString(c), + LongBytesGoString(p)) +} + +func layerGoString(i interface{}, b *bytes.Buffer) { + if s, ok := i.(fmt.GoStringer); ok { + b.WriteString(s.GoString()) + return + } + + var v reflect.Value + var ok bool + if v, ok = i.(reflect.Value); !ok { + v = reflect.ValueOf(i) + } + switch v.Kind() { + case reflect.Ptr, reflect.Interface: + if v.Kind() == reflect.Ptr { + b.WriteByte('&') + } + layerGoString(v.Elem().Interface(), b) + case reflect.Struct: + t := v.Type() + b.WriteString(t.String()) + b.WriteByte('{') + for i := 0; i < v.NumField(); i++ { + if i > 0 { + b.WriteString(", ") + } + if t.Field(i).Name == "BaseLayer" { + fmt.Fprintf(b, "BaseLayer:%s", baseLayerString(v.Field(i))) + } else if v.Field(i).Kind() == reflect.Struct { + fmt.Fprintf(b, "%s:", t.Field(i).Name) + layerGoString(v.Field(i), b) + } else if v.Field(i).Kind() == reflect.Ptr { + b.WriteByte('&') + layerGoString(v.Field(i), b) + } else { + fmt.Fprintf(b, "%s:%#v", t.Field(i).Name, v.Field(i)) + } + } + b.WriteByte('}') + default: + fmt.Fprintf(b, "%#v", i) + } +} + +// LayerGoString returns a representation of the layer in Go syntax, +// taking care to shorten "very long" BaseLayer byte slices +func LayerGoString(l Layer) string { + b := new(bytes.Buffer) + layerGoString(l, b) + return b.String() +} + +func (p *packet) packetString() string { + var b bytes.Buffer + fmt.Fprintf(&b, "PACKET: %d bytes", len(p.Data())) + if p.metadata.Truncated { + b.WriteString(", truncated") + } + if p.metadata.Length > 0 { + fmt.Fprintf(&b, ", wire length %d cap length %d", p.metadata.Length, p.metadata.CaptureLength) + } + if !p.metadata.Timestamp.IsZero() { + fmt.Fprintf(&b, " @ %v", p.metadata.Timestamp) + } + b.WriteByte('\n') + for i, l := range p.layers { + fmt.Fprintf(&b, "- Layer %d (%02d bytes) = %s\n", i+1, len(l.LayerContents()), LayerString(l)) + } + return b.String() +} + +func (p *packet) packetDump() string { + var b bytes.Buffer + fmt.Fprintf(&b, "-- FULL PACKET DATA (%d bytes) ------------------------------------\n%s", len(p.data), hex.Dump(p.data)) + for i, l := range p.layers { + fmt.Fprintf(&b, "--- Layer %d ---\n%s", i+1, LayerDump(l)) + } + return b.String() +} + +// eagerPacket is a packet implementation that does eager decoding. Upon +// initial construction, it decodes all the layers it can from packet data. +// eagerPacket implements Packet and PacketBuilder. +type eagerPacket struct { + packet +} + +var errNilDecoder = errors.New("NextDecoder passed nil decoder, probably an unsupported decode type") + +func (p *eagerPacket) NextDecoder(next Decoder) error { + if next == nil { + return errNilDecoder + } + if p.last == nil { + return errors.New("NextDecoder called, but no layers added yet") + } + d := p.last.LayerPayload() + if len(d) == 0 { + return nil + } + // Since we're eager, immediately call the next decoder. + return next.Decode(d, p) +} +func (p *eagerPacket) initialDecode(dec Decoder) { + defer p.recoverDecodeError() + err := dec.Decode(p.data, p) + if err != nil { + p.addFinalDecodeError(err, nil) + } +} +func (p *eagerPacket) LinkLayer() LinkLayer { + return p.link +} +func (p *eagerPacket) NetworkLayer() NetworkLayer { + return p.network +} +func (p *eagerPacket) TransportLayer() TransportLayer { + return p.transport +} +func (p *eagerPacket) ApplicationLayer() ApplicationLayer { + return p.application +} +func (p *eagerPacket) ErrorLayer() ErrorLayer { + return p.failure +} +func (p *eagerPacket) Layers() []Layer { + return p.layers +} +func (p *eagerPacket) Layer(t LayerType) Layer { + for _, l := range p.layers { + if l.LayerType() == t { + return l + } + } + return nil +} +func (p *eagerPacket) LayerClass(lc LayerClass) Layer { + for _, l := range p.layers { + if lc.Contains(l.LayerType()) { + return l + } + } + return nil +} +func (p *eagerPacket) String() string { return p.packetString() } +func (p *eagerPacket) Dump() string { return p.packetDump() } + +// lazyPacket does lazy decoding on its packet data. On construction it does +// no initial decoding. For each function call, it decodes only as many layers +// as are necessary to compute the return value for that function. +// lazyPacket implements Packet and PacketBuilder. +type lazyPacket struct { + packet + next Decoder +} + +func (p *lazyPacket) NextDecoder(next Decoder) error { + if next == nil { + return errNilDecoder + } + p.next = next + return nil +} +func (p *lazyPacket) decodeNextLayer() { + if p.next == nil { + return + } + d := p.data + if p.last != nil { + d = p.last.LayerPayload() + } + next := p.next + p.next = nil + // We've just set p.next to nil, so if we see we have no data, this should be + // the final call we get to decodeNextLayer if we return here. + if len(d) == 0 { + return + } + defer p.recoverDecodeError() + err := next.Decode(d, p) + if err != nil { + p.addFinalDecodeError(err, nil) + } +} +func (p *lazyPacket) LinkLayer() LinkLayer { + for p.link == nil && p.next != nil { + p.decodeNextLayer() + } + return p.link +} +func (p *lazyPacket) NetworkLayer() NetworkLayer { + for p.network == nil && p.next != nil { + p.decodeNextLayer() + } + return p.network +} +func (p *lazyPacket) TransportLayer() TransportLayer { + for p.transport == nil && p.next != nil { + p.decodeNextLayer() + } + return p.transport +} +func (p *lazyPacket) ApplicationLayer() ApplicationLayer { + for p.application == nil && p.next != nil { + p.decodeNextLayer() + } + return p.application +} +func (p *lazyPacket) ErrorLayer() ErrorLayer { + for p.failure == nil && p.next != nil { + p.decodeNextLayer() + } + return p.failure +} +func (p *lazyPacket) Layers() []Layer { + for p.next != nil { + p.decodeNextLayer() + } + return p.layers +} +func (p *lazyPacket) Layer(t LayerType) Layer { + for _, l := range p.layers { + if l.LayerType() == t { + return l + } + } + numLayers := len(p.layers) + for p.next != nil { + p.decodeNextLayer() + for _, l := range p.layers[numLayers:] { + if l.LayerType() == t { + return l + } + } + numLayers = len(p.layers) + } + return nil +} +func (p *lazyPacket) LayerClass(lc LayerClass) Layer { + for _, l := range p.layers { + if lc.Contains(l.LayerType()) { + return l + } + } + numLayers := len(p.layers) + for p.next != nil { + p.decodeNextLayer() + for _, l := range p.layers[numLayers:] { + if lc.Contains(l.LayerType()) { + return l + } + } + numLayers = len(p.layers) + } + return nil +} +func (p *lazyPacket) String() string { p.Layers(); return p.packetString() } +func (p *lazyPacket) Dump() string { p.Layers(); return p.packetDump() } + +// DecodeOptions tells gopacket how to decode a packet. +type DecodeOptions struct { + // Lazy decoding decodes the minimum number of layers needed to return data + // for a packet at each function call. Be careful using this with concurrent + // packet processors, as each call to packet.* could mutate the packet, and + // two concurrent function calls could interact poorly. + Lazy bool + // NoCopy decoding doesn't copy its input buffer into storage that's owned by + // the packet. If you can guarantee that the bytes underlying the slice + // passed into NewPacket aren't going to be modified, this can be faster. If + // there's any chance that those bytes WILL be changed, this will invalidate + // your packets. + NoCopy bool + // SkipDecodeRecovery skips over panic recovery during packet decoding. + // Normally, when packets decode, if a panic occurs, that panic is captured + // by a recover(), and a DecodeFailure layer is added to the packet detailing + // the issue. If this flag is set, panics are instead allowed to continue up + // the stack. + SkipDecodeRecovery bool + // DecodeStreamsAsDatagrams enables routing of application-level layers in the TCP + // decoder. If true, we should try to decode layers after TCP in single packets. + // This is disabled by default because the reassembly package drives the decoding + // of TCP payload data after reassembly. + DecodeStreamsAsDatagrams bool +} + +// Default decoding provides the safest (but slowest) method for decoding +// packets. It eagerly processes all layers (so it's concurrency-safe) and it +// copies its input buffer upon creation of the packet (so the packet remains +// valid if the underlying slice is modified. Both of these take time, +// though, so beware. If you can guarantee that the packet will only be used +// by one goroutine at a time, set Lazy decoding. If you can guarantee that +// the underlying slice won't change, set NoCopy decoding. +var Default = DecodeOptions{} + +// Lazy is a DecodeOptions with just Lazy set. +var Lazy = DecodeOptions{Lazy: true} + +// NoCopy is a DecodeOptions with just NoCopy set. +var NoCopy = DecodeOptions{NoCopy: true} + +// DecodeStreamsAsDatagrams is a DecodeOptions with just DecodeStreamsAsDatagrams set. +var DecodeStreamsAsDatagrams = DecodeOptions{DecodeStreamsAsDatagrams: true} + +// NewPacket creates a new Packet object from a set of bytes. The +// firstLayerDecoder tells it how to interpret the first layer from the bytes, +// future layers will be generated from that first layer automatically. +func NewPacket(data []byte, firstLayerDecoder Decoder, options DecodeOptions) Packet { + if !options.NoCopy { + dataCopy := make([]byte, len(data)) + copy(dataCopy, data) + data = dataCopy + } + if options.Lazy { + p := &lazyPacket{ + packet: packet{data: data, decodeOptions: options}, + next: firstLayerDecoder, + } + p.layers = p.initialLayers[:0] + // Crazy craziness: + // If the following return statemet is REMOVED, and Lazy is FALSE, then + // eager packet processing becomes 17% FASTER. No, there is no logical + // explanation for this. However, it's such a hacky micro-optimization that + // we really can't rely on it. It appears to have to do with the size the + // compiler guesses for this function's stack space, since one symptom is + // that with the return statement in place, we more than double calls to + // runtime.morestack/runtime.lessstack. We'll hope the compiler gets better + // over time and we get this optimization for free. Until then, we'll have + // to live with slower packet processing. + return p + } + p := &eagerPacket{ + packet: packet{data: data, decodeOptions: options}, + } + p.layers = p.initialLayers[:0] + p.initialDecode(firstLayerDecoder) + return p +} + +// PacketDataSource is an interface for some source of packet data. Users may +// create their own implementations, or use the existing implementations in +// gopacket/pcap (libpcap, allows reading from live interfaces or from +// pcap files) or gopacket/pfring (PF_RING, allows reading from live +// interfaces). +type PacketDataSource interface { + // ReadPacketData returns the next packet available from this data source. + // It returns: + // data: The bytes of an individual packet. + // ci: Metadata about the capture + // err: An error encountered while reading packet data. If err != nil, + // then data/ci will be ignored. + ReadPacketData() (data []byte, ci CaptureInfo, err error) +} + +// ConcatFinitePacketDataSources returns a PacketDataSource that wraps a set +// of internal PacketDataSources, each of which will stop with io.EOF after +// reading a finite number of packets. The returned PacketDataSource will +// return all packets from the first finite source, followed by all packets from +// the second, etc. Once all finite sources have returned io.EOF, the returned +// source will as well. +func ConcatFinitePacketDataSources(pds ...PacketDataSource) PacketDataSource { + c := concat(pds) + return &c +} + +type concat []PacketDataSource + +func (c *concat) ReadPacketData() (data []byte, ci CaptureInfo, err error) { + for len(*c) > 0 { + data, ci, err = (*c)[0].ReadPacketData() + if err == io.EOF { + *c = (*c)[1:] + continue + } + return + } + return nil, CaptureInfo{}, io.EOF +} + +// ZeroCopyPacketDataSource is an interface to pull packet data from sources +// that allow data to be returned without copying to a user-controlled buffer. +// It's very similar to PacketDataSource, except that the caller must be more +// careful in how the returned buffer is handled. +type ZeroCopyPacketDataSource interface { + // ZeroCopyReadPacketData returns the next packet available from this data source. + // It returns: + // data: The bytes of an individual packet. Unlike with + // PacketDataSource's ReadPacketData, the slice returned here points + // to a buffer owned by the data source. In particular, the bytes in + // this buffer may be changed by future calls to + // ZeroCopyReadPacketData. Do not use the returned buffer after + // subsequent ZeroCopyReadPacketData calls. + // ci: Metadata about the capture + // err: An error encountered while reading packet data. If err != nil, + // then data/ci will be ignored. + ZeroCopyReadPacketData() (data []byte, ci CaptureInfo, err error) +} + +// PacketSource reads in packets from a PacketDataSource, decodes them, and +// returns them. +// +// There are currently two different methods for reading packets in through +// a PacketSource: +// +// Reading With Packets Function +// +// This method is the most convenient and easiest to code, but lacks +// flexibility. Packets returns a 'chan Packet', then asynchronously writes +// packets into that channel. Packets uses a blocking channel, and closes +// it if an io.EOF is returned by the underlying PacketDataSource. All other +// PacketDataSource errors are ignored and discarded. +// for packet := range packetSource.Packets() { +// ... +// } +// +// Reading With NextPacket Function +// +// This method is the most flexible, and exposes errors that may be +// encountered by the underlying PacketDataSource. It's also the fastest +// in a tight loop, since it doesn't have the overhead of a channel +// read/write. However, it requires the user to handle errors, most +// importantly the io.EOF error in cases where packets are being read from +// a file. +// for { +// packet, err := packetSource.NextPacket() +// if err == io.EOF { +// break +// } else if err != nil { +// log.Println("Error:", err) +// continue +// } +// handlePacket(packet) // Do something with each packet. +// } +type PacketSource struct { + source PacketDataSource + decoder Decoder + // DecodeOptions is the set of options to use for decoding each piece + // of packet data. This can/should be changed by the user to reflect the + // way packets should be decoded. + DecodeOptions + c chan Packet +} + +// NewPacketSource creates a packet data source. +func NewPacketSource(source PacketDataSource, decoder Decoder) *PacketSource { + return &PacketSource{ + source: source, + decoder: decoder, + } +} + +// NextPacket returns the next decoded packet from the PacketSource. On error, +// it returns a nil packet and a non-nil error. +func (p *PacketSource) NextPacket() (Packet, error) { + data, ci, err := p.source.ReadPacketData() + if err != nil { + return nil, err + } + packet := NewPacket(data, p.decoder, p.DecodeOptions) + m := packet.Metadata() + m.CaptureInfo = ci + m.Truncated = m.Truncated || ci.CaptureLength < ci.Length + return packet, nil +} + +// packetsToChannel reads in all packets from the packet source and sends them +// to the given channel. When it receives an error, it ignores it. When it +// receives an io.EOF, it closes the channel. +func (p *PacketSource) packetsToChannel() { + defer close(p.c) + for { + packet, err := p.NextPacket() + if err == io.EOF { + return + } else if err == nil { + p.c <- packet + } + } +} + +// Packets returns a channel of packets, allowing easy iterating over +// packets. Packets will be asynchronously read in from the underlying +// PacketDataSource and written to the returned channel. If the underlying +// PacketDataSource returns an io.EOF error, the channel will be closed. +// If any other error is encountered, it is ignored. +// +// for packet := range packetSource.Packets() { +// handlePacket(packet) // Do something with each packet. +// } +// +// If called more than once, returns the same channel. +func (p *PacketSource) Packets() chan Packet { + if p.c == nil { + p.c = make(chan Packet, 1000) + go p.packetsToChannel() + } + return p.c +} diff --git a/vendor/github.com/google/gopacket/packet_test.go b/vendor/github.com/google/gopacket/packet_test.go new file mode 100644 index 0000000..bd05448 --- /dev/null +++ b/vendor/github.com/google/gopacket/packet_test.go @@ -0,0 +1,62 @@ +// 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 gopacket + +import ( + "io" + "reflect" + "testing" +) + +type embedded struct { + A, B int +} + +type embedding struct { + embedded + C, D int +} + +func TestDumpEmbedded(t *testing.T) { + e := embedding{embedded: embedded{A: 1, B: 2}, C: 3, D: 4} + if got, want := layerString(reflect.ValueOf(e), false, false), "{A=1 B=2 C=3 D=4}"; got != want { + t.Errorf("embedded dump mismatch:\n got: %v\n want: %v", got, want) + } +} + +type singlePacketSource [1][]byte + +func (s *singlePacketSource) ReadPacketData() ([]byte, CaptureInfo, error) { + if (*s)[0] == nil { + return nil, CaptureInfo{}, io.EOF + } + out := (*s)[0] + (*s)[0] = nil + return out, CaptureInfo{}, nil +} + +func TestConcatPacketSources(t *testing.T) { + sourceA := &singlePacketSource{[]byte{1}} + sourceB := &singlePacketSource{[]byte{2}} + sourceC := &singlePacketSource{[]byte{3}} + concat := ConcatFinitePacketDataSources(sourceA, sourceB, sourceC) + a, _, err := concat.ReadPacketData() + if err != nil || len(a) != 1 || a[0] != 1 { + t.Errorf("expected [1], got %v/%v", a, err) + } + b, _, err := concat.ReadPacketData() + if err != nil || len(b) != 1 || b[0] != 2 { + t.Errorf("expected [2], got %v/%v", b, err) + } + c, _, err := concat.ReadPacketData() + if err != nil || len(c) != 1 || c[0] != 3 { + t.Errorf("expected [3], got %v/%v", c, err) + } + if _, _, err := concat.ReadPacketData(); err != io.EOF { + t.Errorf("expected io.EOF, got %v", err) + } +} diff --git a/vendor/github.com/google/gopacket/parser.go b/vendor/github.com/google/gopacket/parser.go new file mode 100644 index 0000000..f786834 --- /dev/null +++ b/vendor/github.com/google/gopacket/parser.go @@ -0,0 +1,198 @@ +// 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 gopacket + +import ( + "fmt" +) + +// DecodingLayer is an interface for packet layers that can decode themselves. +// +// The important part of DecodingLayer is that they decode themselves in-place. +// Calling DecodeFromBytes on a DecodingLayer totally resets the entire layer to +// the new state defined by the data passed in. A returned error leaves the +// DecodingLayer in an unknown intermediate state, thus its fields should not be +// trusted. +// +// Because the DecodingLayer is resetting its own fields, a call to +// DecodeFromBytes should normally not require any memory allocation. +type DecodingLayer interface { + // DecodeFromBytes resets the internal state of this layer to the state + // defined by the passed-in bytes. Slices in the DecodingLayer may + // reference the passed-in data, so care should be taken to copy it + // first should later modification of data be required before the + // DecodingLayer is discarded. + DecodeFromBytes(data []byte, df DecodeFeedback) error + // CanDecode returns the set of LayerTypes this DecodingLayer can + // decode. For Layers that are also DecodingLayers, this will most + // often be that Layer's LayerType(). + CanDecode() LayerClass + // NextLayerType returns the LayerType which should be used to decode + // the LayerPayload. + NextLayerType() LayerType + // LayerPayload is the set of bytes remaining to decode after a call to + // DecodeFromBytes. + LayerPayload() []byte +} + +// DecodingLayerParser parses a given set of layer types. See DecodeLayers for +// more information on how DecodingLayerParser should be used. +type DecodingLayerParser struct { + // DecodingLayerParserOptions is the set of options available to the + // user to define the parser's behavior. + DecodingLayerParserOptions + first LayerType + decoders map[LayerType]DecodingLayer + df DecodeFeedback + // Truncated is set when a decode layer detects that the packet has been + // truncated. + Truncated bool +} + +// AddDecodingLayer adds a decoding layer to the parser. This adds support for +// the decoding layer's CanDecode layers to the parser... should they be +// encountered, they'll be parsed. +func (l *DecodingLayerParser) AddDecodingLayer(d DecodingLayer) { + for _, typ := range d.CanDecode().LayerTypes() { + l.decoders[typ] = d + } +} + +// SetTruncated is used by DecodingLayers to set the Truncated boolean in the +// DecodingLayerParser. Users should simply read Truncated after calling +// DecodeLayers. +func (l *DecodingLayerParser) SetTruncated() { + l.Truncated = true +} + +// NewDecodingLayerParser creates a new DecodingLayerParser and adds in all +// of the given DecodingLayers with AddDecodingLayer. +// +// Each call to DecodeLayers will attempt to decode the given bytes first by +// treating them as a 'first'-type layer, then by using NextLayerType on +// subsequently decoded layers to find the next relevant decoder. Should a +// deoder not be available for the layer type returned by NextLayerType, +// decoding will stop. +func NewDecodingLayerParser(first LayerType, decoders ...DecodingLayer) *DecodingLayerParser { + dlp := &DecodingLayerParser{ + decoders: make(map[LayerType]DecodingLayer), + first: first, + } + dlp.df = dlp // Cast this once to the interface + for _, d := range decoders { + dlp.AddDecodingLayer(d) + } + return dlp +} + +// DecodeLayers decodes as many layers as possible from the given data. It +// initially treats the data as layer type 'typ', then uses NextLayerType on +// each subsequent decoded layer until it gets to a layer type it doesn't know +// how to parse. +// +// For each layer successfully decoded, DecodeLayers appends the layer type to +// the decoded slice. DecodeLayers truncates the 'decoded' slice initially, so +// there's no need to empty it yourself. +// +// This decoding method is about an order of magnitude faster than packet +// decoding, because it only decodes known layers that have already been +// allocated. This means it doesn't need to allocate each layer it returns... +// instead it overwrites the layers that already exist. +// +// Example usage: +// func main() { +// var eth layers.Ethernet +// var ip4 layers.IPv4 +// var ip6 layers.IPv6 +// var tcp layers.TCP +// var udp layers.UDP +// var payload gopacket.Payload +// parser := gopacket.NewDecodingLayerParser(layers.LayerTypeEthernet, ð, &ip4, &ip6, &tcp, &udp, &payload) +// var source gopacket.PacketDataSource = getMyDataSource() +// decodedLayers := make([]gopacket.LayerType, 0, 10) +// for { +// data, _, err := source.ReadPacketData() +// if err == nil { +// fmt.Println("Error reading packet data: ", err) +// continue +// } +// fmt.Println("Decoding packet") +// err = parser.DecodeLayers(data, &decodedLayers) +// for _, typ := range decodedLayers { +// fmt.Println(" Successfully decoded layer type", typ) +// switch typ { +// case layers.LayerTypeEthernet: +// fmt.Println(" Eth ", eth.SrcMAC, eth.DstMAC) +// case layers.LayerTypeIPv4: +// fmt.Println(" IP4 ", ip4.SrcIP, ip4.DstIP) +// case layers.LayerTypeIPv6: +// fmt.Println(" IP6 ", ip6.SrcIP, ip6.DstIP) +// case layers.LayerTypeTCP: +// fmt.Println(" TCP ", tcp.SrcPort, tcp.DstPort) +// case layers.LayerTypeUDP: +// fmt.Println(" UDP ", udp.SrcPort, udp.DstPort) +// } +// } +// if decodedLayers.Truncated { +// fmt.Println(" Packet has been truncated") +// } +// if err != nil { +// fmt.Println(" Error encountered:", err) +// } +// } +// } +// +// If DecodeLayers is unable to decode the next layer type, it will return the +// error UnsupportedLayerType. +func (l *DecodingLayerParser) DecodeLayers(data []byte, decoded *[]LayerType) (err error) { + l.Truncated = false + if !l.IgnorePanic { + defer panicToError(&err) + } + typ := l.first + *decoded = (*decoded)[:0] // Truncated decoded layers. + for len(data) > 0 { + decoder, ok := l.decoders[typ] + if !ok { + return UnsupportedLayerType(typ) + } else if err = decoder.DecodeFromBytes(data, l.df); err != nil { + return err + } + *decoded = append(*decoded, typ) + typ = decoder.NextLayerType() + data = decoder.LayerPayload() + } + return nil +} + +// UnsupportedLayerType is returned by DecodingLayerParser if DecodeLayers +// encounters a layer type that the DecodingLayerParser has no decoder for. +type UnsupportedLayerType LayerType + +// Error implements the error interface, returning a string to say that the +// given layer type is unsupported. +func (e UnsupportedLayerType) Error() string { + return fmt.Sprintf("No decoder for layer type %v", LayerType(e)) +} + +func panicToError(e *error) { + if r := recover(); r != nil { + *e = fmt.Errorf("panic: %v", r) + } +} + +// DecodingLayerParserOptions provides options to affect the behavior of a given +// DecodingLayerParser. +type DecodingLayerParserOptions struct { + // IgnorePanic determines whether a DecodingLayerParser should stop + // panics on its own (by returning them as an error from DecodeLayers) + // or should allow them to raise up the stack. Handling errors does add + // latency to the process of decoding layers, but is much safer for + // callers. IgnorePanic defaults to false, thus if the caller does + // nothing decode panics will be returned as errors. + IgnorePanic bool +} diff --git a/vendor/github.com/google/gopacket/pcap/doc.go b/vendor/github.com/google/gopacket/pcap/doc.go new file mode 100644 index 0000000..5bf8d86 --- /dev/null +++ b/vendor/github.com/google/gopacket/pcap/doc.go @@ -0,0 +1,106 @@ +// 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 pcap allows users of gopacket to read packets off the wire or from +pcap files. + +This package is meant to be used with its parent, +http://github.com/google/gopacket, although it can also be used independently +if you just want to get packet data from the wire. + +Reading PCAP Files + +The following code can be used to read in data from a pcap file. + + if handle, err := pcap.OpenOffline("/path/to/my/file"); err != nil { + panic(err) + } else { + packetSource := gopacket.NewPacketSource(handle, handle.LinkType()) + for packet := range packetSource.Packets() { + handlePacket(packet) // Do something with a packet here. + } + } + +Reading Live Packets + +The following code can be used to read in data from a live device, in this case +"eth0". + + if handle, err := pcap.OpenLive("eth0", 1600, true, pcap.BlockForever); err != nil { + panic(err) + } else if err := handle.SetBPFFilter("tcp and port 80"); err != nil { // optional + panic(err) + } else { + packetSource := gopacket.NewPacketSource(handle, handle.LinkType()) + for packet := range packetSource.Packets() { + handlePacket(packet) // Do something with a packet here. + } + } + +Inactive Handles + +Newer PCAP functionality requires the concept of an 'inactive' PCAP handle. +Instead of constantly adding new arguments to pcap_open_live, users now call +pcap_create to create a handle, set it up with a bunch of optional function +calls, then call pcap_activate to activate it. This library mirrors that +mechanism, for those that want to expose/use these new features: + + inactive, err := pcap.NewInactiveHandle(deviceName) + if err != nil { + log.Fatal(err) + } + defer inactive.CleanUp() + + // Call various functions on inactive to set it up the way you'd like: + if err = inactive.SetTimeout(time.Minute); err != nil { + log.Fatal(err) + } else if err = inactive.SetTimestampSource("foo"); err != nil { + log.Fatal(err) + } + + // Finally, create the actual handle by calling Activate: + handle, err := inactive.Activate() // after this, inactive is no longer valid + if err != nil { + log.Fatal(err) + } + defer handle.Close() + + // Now use your handle as you see fit. + +PCAP Timeouts + +pcap.OpenLive and pcap.SetTimeout both take timeouts. +If you don't care about timeouts, just pass in BlockForever, +which should do what you expect with minimal fuss. + +A timeout of 0 is not recommended. Some platforms, like Macs +(http://www.manpages.info/macosx/pcap.3.html) say: + The read timeout is used to arrange that the read not necessarily return + immediately when a packet is seen, but that it wait for some amount of time + to allow more packets to arrive and to read multiple packets from the OS + kernel in one operation. +This means that if you only capture one packet, the kernel might decide to wait +'timeout' for more packets to batch with it before returning. A timeout of +0, then, means 'wait forever for more packets', which is... not good. + +To get around this, we've introduced the following behavior: if a negative +timeout is passed in, we set the positive timeout in the handle, then loop +internally in ReadPacketData/ZeroCopyReadPacketData when we see timeout +errors. + +PCAP File Writing + +This package does not implement PCAP file writing. However, gopacket/pcapgo +does! Look there if you'd like to write PCAP files. + +Note For Windows 10 Users + +If you're trying to use 64-bit winpcap on Windows 10, you might have to do +the crazy hijinks detailed at +http://stackoverflow.com/questions/38047858/compile-gopacket-on-windows-64bit +*/ +package pcap diff --git a/vendor/github.com/google/gopacket/pcap/gopacket_benchmark/benchmark.go b/vendor/github.com/google/gopacket/pcap/gopacket_benchmark/benchmark.go new file mode 100644 index 0000000..cbcae17 --- /dev/null +++ b/vendor/github.com/google/gopacket/pcap/gopacket_benchmark/benchmark.go @@ -0,0 +1,247 @@ +// 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. + +// This benchmark reads in file <tempdir>/gopacket_benchmark.pcap and measures +// the time it takes to decode all packets from that file. If the file doesn't +// exist, it's pulled down from a publicly available location. However, you can +// feel free to substitute your own file at that location, in which case the +// benchmark will run on your own data. +// +// It's also useful for figuring out which packets may be causing errors. Pass +// in the --printErrors flag, and it'll print out error layers for each packet +// that has them. This includes any packets that it's just unable to decode, +// which is a great way to find new protocols to decode, and get test packets to +// write tests for them. +package main + +import ( + "compress/gzip" + "encoding/hex" + "flag" + "fmt" + "github.com/google/gopacket" + "github.com/google/gopacket/layers" + "github.com/google/gopacket/pcap" + "github.com/google/gopacket/tcpassembly" + "io" + "io/ioutil" + "net/http" + "os" + "runtime" + "runtime/pprof" + "time" +) + +var decodeLazy *bool = flag.Bool("lazy", false, "If true, use lazy decoding") +var decodeNoCopy *bool = flag.Bool("nocopy", true, "If true, avoid an extra copy when decoding packets") +var printErrors *bool = flag.Bool("printErrors", false, "If true, check for and print error layers.") +var printLayers *bool = flag.Bool("printLayers", false, "If true, print out the layers of each packet") +var repeat *int = flag.Int("repeat", 5, "Read over the file N times") +var cpuProfile *string = flag.String("cpuprofile", "", "If set, write CPU profile to filename") +var url *string = flag.String("url", "http://www.ll.mit.edu/mission/communications/cyber/CSTcorpora/ideval/data/1999/training/week1/tuesday/inside.tcpdump.gz", "URL to gzip'd pcap file") + +type BufferPacketSource struct { + index int + data [][]byte + ci []gopacket.CaptureInfo +} + +func NewBufferPacketSource(p gopacket.PacketDataSource) *BufferPacketSource { + start := time.Now() + b := &BufferPacketSource{} + for { + data, ci, err := p.ReadPacketData() + if err == io.EOF { + break + } + b.data = append(b.data, data) + b.ci = append(b.ci, ci) + } + duration := time.Since(start) + fmt.Printf("Reading packet data into memory: %d packets in %v, %v per packet\n", len(b.data), duration, duration/time.Duration(len(b.data))) + return b +} + +func (b *BufferPacketSource) ReadPacketData() (data []byte, ci gopacket.CaptureInfo, err error) { + if b.index >= len(b.data) { + err = io.EOF + return + } + data = b.data[b.index] + ci = b.ci[b.index] + b.index++ + return +} + +func (b *BufferPacketSource) Reset() { + runtime.GC() + b.index = 0 +} + +func main() { + flag.Parse() + filename := os.TempDir() + string(os.PathSeparator) + "gopacket_benchmark.pcap" + if _, err := os.Stat(filename); err != nil { + // This URL points to a publicly available packet data set from a DARPA + // intrusion detection evaluation. See + // http://www.ll.mit.edu/mission/communications/cyber/CSTcorpora/ideval/data/1999/training/week1/index.html + // for more details. + fmt.Println("Local pcap file", filename, "doesn't exist, reading from", *url) + if resp, err := http.Get(*url); err != nil { + panic(err) + } else if out, err := os.Create(filename); err != nil { + panic(err) + } else if gz, err := gzip.NewReader(resp.Body); err != nil { + panic(err) + } else if n, err := io.Copy(out, gz); err != nil { + panic(err) + } else if err := gz.Close(); err != nil { + panic(err) + } else if err := out.Close(); err != nil { + panic(err) + } else { + fmt.Println("Successfully read", n, "bytes from url, unzipped to local storage") + } + } + fmt.Println("Reading file once through to hopefully cache most of it") + if f, err := os.Open(filename); err != nil { + panic(err) + } else if n, err := io.Copy(ioutil.Discard, f); err != nil { + panic(err) + } else if err := f.Close(); err != nil { + panic(err) + } else { + fmt.Println("Read in file", filename, ", total of", n, "bytes") + } + if *cpuProfile != "" { + if cpu, err := os.Create(*cpuProfile); err != nil { + panic(err) + } else if err := pprof.StartCPUProfile(cpu); err != nil { + panic(err) + } else { + defer func() { + pprof.StopCPUProfile() + cpu.Close() + }() + } + } + var packetDataSource *BufferPacketSource + var packetSource *gopacket.PacketSource + fmt.Printf("Opening file %q for read\n", filename) + if h, err := pcap.OpenOffline(filename); err != nil { + panic(err) + } else { + fmt.Println("Reading all packets into memory with BufferPacketSource.") + start := time.Now() + packetDataSource = NewBufferPacketSource(h) + duration := time.Since(start) + fmt.Printf("Time to read packet data into memory from file: %v\n", duration) + packetSource = gopacket.NewPacketSource(packetDataSource, h.LinkType()) + packetSource.DecodeOptions.Lazy = *decodeLazy + packetSource.DecodeOptions.NoCopy = *decodeNoCopy + } + fmt.Println() + for i := 0; i < *repeat; i++ { + packetDataSource.Reset() + fmt.Printf("Benchmarking decode %d/%d\n", i+1, *repeat) + benchmarkPacketDecode(packetSource) + } + fmt.Println() + for i := 0; i < *repeat; i++ { + packetDataSource.Reset() + fmt.Printf("Benchmarking decoding layer parser %d/%d\n", i+1, *repeat) + benchmarkLayerDecode(packetDataSource, false) + } + fmt.Println() + for i := 0; i < *repeat; i++ { + packetDataSource.Reset() + fmt.Printf("Benchmarking decoding layer parser with assembly %d/%d\n", i+1, *repeat) + benchmarkLayerDecode(packetDataSource, true) + } +} + +func benchmarkPacketDecode(packetSource *gopacket.PacketSource) { + count, errors := 0, 0 + start := time.Now() + for packet, err := packetSource.NextPacket(); err != io.EOF; packet, err = packetSource.NextPacket() { + if err != nil { + fmt.Println("Error reading in packet:", err) + continue + } + count++ + var hasError bool + if *printErrors && packet.ErrorLayer() != nil { + fmt.Println("\n\n\nError decoding packet:", packet.ErrorLayer().Error()) + fmt.Println(hex.Dump(packet.Data())) + fmt.Printf("%#v\n", packet.Data()) + errors++ + hasError = true + } + if *printLayers || hasError { + fmt.Printf("\n=== PACKET %d ===\n", count) + for _, l := range packet.Layers() { + fmt.Printf("--- LAYER %v ---\n%#v\n\n", l.LayerType(), l) + } + fmt.Println() + } + } + duration := time.Since(start) + fmt.Printf("\tRead in %v packets in %v, %v per packet\n", count, duration, duration/time.Duration(count)) + if *printErrors { + fmt.Printf("%v errors, successfully decoded %.02f%%\n", errors, float64(count-errors)*100.0/float64(count)) + } +} + +type streamFactory struct { +} + +func (s *streamFactory) New(netFlow, tcpFlow gopacket.Flow) tcpassembly.Stream { + return s +} +func (s *streamFactory) Reassembled([]tcpassembly.Reassembly) { +} +func (s *streamFactory) ReassemblyComplete() { +} + +func benchmarkLayerDecode(source *BufferPacketSource, assemble bool) { + var tcp layers.TCP + var ip layers.IPv4 + var eth layers.Ethernet + var udp layers.UDP + var icmp layers.ICMPv4 + var payload gopacket.Payload + parser := gopacket.NewDecodingLayerParser( + layers.LayerTypeEthernet, + ð, &ip, &icmp, &tcp, &udp, &payload) + pool := tcpassembly.NewStreamPool(&streamFactory{}) + assembler := tcpassembly.NewAssembler(pool) + var decoded []gopacket.LayerType + start := time.Now() + packets, decodedlayers, assembled := 0, 0, 0 + for { + packets++ + data, ci, err := source.ReadPacketData() + if err == io.EOF { + break + } else if err != nil { + fmt.Println("Error reading packet: ", err) + continue + } + err = parser.DecodeLayers(data, &decoded) + for _, typ := range decoded { + decodedlayers++ + if typ == layers.LayerTypeTCP && assemble { + assembled++ + assembler.AssembleWithTimestamp(ip.NetworkFlow(), &tcp, ci.Timestamp) + } + } + } + if assemble { + assembler.FlushAll() + } + duration := time.Since(start) + fmt.Printf("\tRead in %d packets in %v, decoded %v layers, assembled %v packets: %v per packet\n", packets, duration, decodedlayers, assembled, duration/time.Duration(packets)) +} diff --git a/vendor/github.com/google/gopacket/pcap/pcap.go b/vendor/github.com/google/gopacket/pcap/pcap.go new file mode 100644 index 0000000..1ecdf03 --- /dev/null +++ b/vendor/github.com/google/gopacket/pcap/pcap.go @@ -0,0 +1,1005 @@ +// Copyright 2012 Google, Inc. All rights reserved. +// Copyright 2009-2011 Andreas Krennmair. 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 pcap + +/* +#cgo solaris LDFLAGS: -L /opt/local/lib -lpcap +#cgo linux LDFLAGS: -lpcap +#cgo dragonfly LDFLAGS: -lpcap +#cgo freebsd LDFLAGS: -lpcap +#cgo openbsd LDFLAGS: -lpcap +#cgo netbsd LDFLAGS: -lpcap +#cgo darwin LDFLAGS: -lpcap +#cgo windows CFLAGS: -I C:/WpdPack/Include +#cgo windows,386 LDFLAGS: -L C:/WpdPack/Lib -lwpcap +#cgo windows,amd64 LDFLAGS: -L C:/WpdPack/Lib/x64 -lwpcap +#include <stdlib.h> +#include <pcap.h> + +// Some old versions of pcap don't define this constant. +#ifndef PCAP_NETMASK_UNKNOWN +#define PCAP_NETMASK_UNKNOWN 0xffffffff +#endif + +// libpcap doesn't actually export its version in a #define-guardable way, +// so we have to use other defined things to differentiate versions. +// We assume at least libpcap v1.1 at the moment. +// See http://upstream-tracker.org/versions/libpcap.html + +#ifndef PCAP_ERROR_TSTAMP_PRECISION_NOTSUP // < v1.5 + +int pcap_set_immediate_mode(pcap_t *p, int mode) { + return PCAP_ERROR; +} + +#ifndef PCAP_TSTAMP_HOST // < v1.2 + +int pcap_set_tstamp_type(pcap_t* p, int t) { return -1; } +int pcap_list_tstamp_types(pcap_t* p, int** t) { return 0; } +void pcap_free_tstamp_types(int *tstamp_types) {} +const char* pcap_tstamp_type_val_to_name(int t) { + return "pcap timestamp types not supported"; +} +int pcap_tstamp_type_name_to_val(const char* t) { + return PCAP_ERROR; +} + +#endif // < v1.2 +#endif // < v1.5 + +#ifndef PCAP_ERROR_PROMISC_PERM_DENIED +#define PCAP_ERROR_PROMISC_PERM_DENIED -11 +#endif + +// WinPcap doesn't export a pcap_statustostr, so use the less-specific +// pcap_strerror. Note that linking against something like cygwin libpcap +// may result is less-specific error messages. +#ifdef WIN32 +#define pcap_statustostr pcap_strerror + +// WinPcap also doesn't export pcap_can_set_rfmon and pcap_set_rfmon, +// as those are handled by separate libraries (airpcap). +// https://www.winpcap.org/docs/docs_412/html/group__wpcapfunc.html +// Stub out those functions here, returning values that indicate rfmon +// setting is unavailable/unsuccessful. +int pcap_can_set_rfmon(pcap_t *p) { + return 0; +} + +int pcap_set_rfmon(pcap_t *p, int rfmon) { + return PCAP_ERROR; +} +#endif + +// Windows, Macs, and Linux all use different time types. Joy. +#ifdef WIN32 +#define gopacket_time_secs_t long +#define gopacket_time_usecs_t long +#elif __APPLE__ +#define gopacket_time_secs_t __darwin_time_t +#define gopacket_time_usecs_t __darwin_suseconds_t +#elif __GLIBC__ +#define gopacket_time_secs_t __time_t +#define gopacket_time_usecs_t __suseconds_t +#else // Some form of linux/bsd/etc... +#include <sys/param.h> +#ifdef __OpenBSD__ +#define gopacket_time_secs_t u_int32_t +#define gopacket_time_usecs_t u_int32_t +#else +#define gopacket_time_secs_t time_t +#define gopacket_time_usecs_t suseconds_t +#endif +#endif +*/ +import "C" + +import ( + "errors" + "fmt" + "io" + "net" + "reflect" + "runtime" + "strconv" + "sync" + "sync/atomic" + "syscall" + "time" + "unsafe" + + "github.com/google/gopacket" + "github.com/google/gopacket/layers" +) + +const errorBufferSize = 256 + +// MaxBpfInstructions is the maximum number of BPF instructions supported (BPF_MAXINSNS), +// taken from Linux kernel: include/uapi/linux/bpf_common.h +// +// https://github.com/torvalds/linux/blob/master/include/uapi/linux/bpf_common.h +const MaxBpfInstructions = 4096 + +// 8 bytes per instruction, max 4096 instructions +const bpfInstructionBufferSize = 8 * MaxBpfInstructions + +// Handle provides a connection to a pcap handle, allowing users to read packets +// off the wire (Next), inject packets onto the wire (Inject), and +// perform a number of other functions to affect and understand packet output. +// +// Handles are already pcap_activate'd +type Handle struct { + // cptr is the handle for the actual pcap C object. + cptr *C.pcap_t + timeout time.Duration + device string + deviceIndex int + mu sync.Mutex + closeMu sync.Mutex + // stop is set to a non-zero value by Handle.Close to signal to + // getNextBufPtrLocked to stop trying to read packets + stop uint64 + + // Since pointers to these objects are passed into a C function, if + // they're declared locally then the Go compiler thinks they may have + // escaped into C-land, so it allocates them on the heap. This causes a + // huge memory hit, so to handle that we store them here instead. + pkthdr *C.struct_pcap_pkthdr + bufptr *C.u_char +} + +// Stats contains statistics on how many packets were handled by a pcap handle, +// and what was done with those packets. +type Stats struct { + PacketsReceived int + PacketsDropped int + PacketsIfDropped int +} + +// Interface describes a single network interface on a machine. +type Interface struct { + Name string + Description string + Addresses []InterfaceAddress + // TODO: add more elements +} + +// Datalink describes the datalink +type Datalink struct { + Name string + Description string +} + +// InterfaceAddress describes an address associated with an Interface. +// Currently, it's IPv4/6 specific. +type InterfaceAddress struct { + IP net.IP + Netmask net.IPMask // Netmask may be nil if we were unable to retrieve it. + // TODO: add broadcast + PtP dst ? +} + +// BPF is a compiled filter program, useful for offline packet matching. +type BPF struct { + orig string + bpf _Ctype_struct_bpf_program // takes a finalizer, not overriden by outsiders +} + +// BPFInstruction is a byte encoded structure holding a BPF instruction +type BPFInstruction struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +// BlockForever causes it to block forever waiting for packets, when passed +// into SetTimeout or OpenLive, while still returning incoming packets to userland relatively +// quickly. +const BlockForever = -time.Millisecond * 10 + +func timeoutMillis(timeout time.Duration) C.int { + // Flip sign if necessary. See package docs on timeout for reasoning behind this. + if timeout < 0 { + timeout *= -1 + } + // Round up + if timeout != 0 && timeout < time.Millisecond { + timeout = time.Millisecond + } + return C.int(timeout / time.Millisecond) +} + +// OpenLive opens a device and returns a *Handle. +// It takes as arguments the name of the device ("eth0"), the maximum size to +// read for each packet (snaplen), whether to put the interface in promiscuous +// mode, and a timeout. +// +// See the package documentation for important details regarding 'timeout'. +func OpenLive(device string, snaplen int32, promisc bool, timeout time.Duration) (handle *Handle, _ error) { + buf := (*C.char)(C.calloc(errorBufferSize, 1)) + defer C.free(unsafe.Pointer(buf)) + + var pro C.int + if promisc { + pro = 1 + } + p := &Handle{timeout: timeout, device: device} + + ifc, err := net.InterfaceByName(device) + if err != nil { + // The device wasn't found in the OS, but could be "any" + // Set index to 0 + p.deviceIndex = 0 + } else { + p.deviceIndex = ifc.Index + } + + dev := C.CString(device) + defer C.free(unsafe.Pointer(dev)) + + p.cptr = C.pcap_open_live(dev, C.int(snaplen), pro, timeoutMillis(timeout), buf) + if p.cptr == nil { + return nil, errors.New(C.GoString(buf)) + } + + if err := p.openLive(); err != nil { + C.pcap_close(p.cptr) + return nil, err + } + + return p, nil +} + +// OpenOffline opens a file and returns its contents as a *Handle. +func OpenOffline(file string) (handle *Handle, err error) { + buf := (*C.char)(C.calloc(errorBufferSize, 1)) + defer C.free(unsafe.Pointer(buf)) + cf := C.CString(file) + defer C.free(unsafe.Pointer(cf)) + + cptr := C.pcap_open_offline(cf, buf) + if cptr == nil { + return nil, errors.New(C.GoString(buf)) + } + return &Handle{cptr: cptr}, nil +} + +// NextError is the return code from a call to Next. +type NextError int32 + +// NextError implements the error interface. +func (n NextError) Error() string { + switch n { + case NextErrorOk: + return "OK" + case NextErrorTimeoutExpired: + return "Timeout Expired" + case NextErrorReadError: + return "Read Error" + case NextErrorNoMorePackets: + return "No More Packets In File" + case NextErrorNotActivated: + return "Not Activated" + } + return strconv.Itoa(int(n)) +} + +// NextError values. +const ( + NextErrorOk NextError = 1 + NextErrorTimeoutExpired NextError = 0 + NextErrorReadError NextError = -1 + // NextErrorNoMorePackets is returned when reading from a file (OpenOffline) and + // EOF is reached. When this happens, Next() returns io.EOF instead of this. + NextErrorNoMorePackets NextError = -2 + NextErrorNotActivated NextError = -3 +) + +// ReadPacketData returns the next packet read from the pcap handle, along with an error +// code associated with that packet. If the packet is read successfully, the +// returned error is nil. +func (p *Handle) ReadPacketData() (data []byte, ci gopacket.CaptureInfo, err error) { + p.mu.Lock() + err = p.getNextBufPtrLocked(&ci) + if err == nil { + data = C.GoBytes(unsafe.Pointer(p.bufptr), C.int(ci.CaptureLength)) + } + p.mu.Unlock() + if err == NextErrorTimeoutExpired { + runtime.Gosched() + } + return +} + +type activateError C.int + +const ( + aeNoError = 0 + aeActivated = C.PCAP_ERROR_ACTIVATED + aePromisc = C.PCAP_WARNING_PROMISC_NOTSUP + aeNoSuchDevice = C.PCAP_ERROR_NO_SUCH_DEVICE + aeDenied = C.PCAP_ERROR_PERM_DENIED + aeNotUp = C.PCAP_ERROR_IFACE_NOT_UP +) + +func (a activateError) Error() string { + switch a { + case aeNoError: + return "No Error" + case aeActivated: + return "Already Activated" + case aePromisc: + return "Cannot set as promisc" + case aeNoSuchDevice: + return "No Such Device" + case aeDenied: + return "Permission Denied" + case aeNotUp: + return "Interface Not Up" + default: + return fmt.Sprintf("unknown activated error: %d", a) + } +} + +// getNextBufPtrLocked is shared code for ReadPacketData and +// ZeroCopyReadPacketData. +func (p *Handle) getNextBufPtrLocked(ci *gopacket.CaptureInfo) error { + if p.cptr == nil { + return io.EOF + } + + for atomic.LoadUint64(&p.stop) == 0 { + // try to read a packet if one is immediately available + result := NextError(C.pcap_next_ex(p.cptr, &p.pkthdr, &p.bufptr)) + + switch result { + case NextErrorOk: + // got a packet, set capture info and return + sec := int64(p.pkthdr.ts.tv_sec) + // convert micros to nanos + nanos := int64(p.pkthdr.ts.tv_usec) * 1000 + + ci.Timestamp = time.Unix(sec, nanos) + ci.CaptureLength = int(p.pkthdr.caplen) + ci.Length = int(p.pkthdr.len) + ci.InterfaceIndex = p.deviceIndex + + return nil + case NextErrorNoMorePackets: + // no more packets, return EOF rather than libpcap-specific error + return io.EOF + case NextErrorTimeoutExpired: + // Negative timeout means to loop forever, instead of actually returning + // the timeout error. + if p.timeout < 0 { + // must have had a timeout... wait before trying again + p.waitForPacket() + continue + } + default: + return result + } + } + + // stop must be set + return io.EOF +} + +// ZeroCopyReadPacketData reads the next packet off the wire, and returns its data. +// The slice returned by ZeroCopyReadPacketData points to bytes owned by the +// the Handle. Each call to ZeroCopyReadPacketData invalidates any data previously +// returned by ZeroCopyReadPacketData. Care must be taken not to keep pointers +// to old bytes when using ZeroCopyReadPacketData... if you need to keep data past +// the next time you call ZeroCopyReadPacketData, use ReadPacketData, which copies +// the bytes into a new buffer for you. +// data1, _, _ := handle.ZeroCopyReadPacketData() +// // do everything you want with data1 here, copying bytes out of it if you'd like to keep them around. +// data2, _, _ := handle.ZeroCopyReadPacketData() // invalidates bytes in data1 +func (p *Handle) ZeroCopyReadPacketData() (data []byte, ci gopacket.CaptureInfo, err error) { + p.mu.Lock() + err = p.getNextBufPtrLocked(&ci) + if err == nil { + slice := (*reflect.SliceHeader)(unsafe.Pointer(&data)) + slice.Data = uintptr(unsafe.Pointer(p.bufptr)) + slice.Len = ci.CaptureLength + slice.Cap = ci.CaptureLength + } + p.mu.Unlock() + if err == NextErrorTimeoutExpired { + runtime.Gosched() + } + return +} + +// Close closes the underlying pcap handle. +func (p *Handle) Close() { + p.closeMu.Lock() + defer p.closeMu.Unlock() + + if p.cptr == nil { + return + } + + atomic.StoreUint64(&p.stop, 1) + + // wait for packet reader to stop + p.mu.Lock() + defer p.mu.Unlock() + + C.pcap_close(p.cptr) + p.cptr = nil +} + +// Error returns the current error associated with a pcap handle (pcap_geterr). +func (p *Handle) Error() error { + return errors.New(C.GoString(C.pcap_geterr(p.cptr))) +} + +// Stats returns statistics on the underlying pcap handle. +func (p *Handle) Stats() (stat *Stats, err error) { + var cstats _Ctype_struct_pcap_stat + if -1 == C.pcap_stats(p.cptr, &cstats) { + return nil, p.Error() + } + return &Stats{ + PacketsReceived: int(cstats.ps_recv), + PacketsDropped: int(cstats.ps_drop), + PacketsIfDropped: int(cstats.ps_ifdrop), + }, nil +} + +// ListDataLinks obtains a list of all possible data link types supported for an interface. +func (p *Handle) ListDataLinks() (datalinks []Datalink, err error) { + var dltbuf *C.int + + n := int(C.pcap_list_datalinks(p.cptr, &dltbuf)) + if -1 == n { + return nil, p.Error() + } + + defer C.pcap_free_datalinks(dltbuf) + + datalinks = make([]Datalink, n) + + dltArray := (*[100]C.int)(unsafe.Pointer(dltbuf)) + + for i := 0; i < n; i++ { + expr := C.pcap_datalink_val_to_name((*dltArray)[i]) + datalinks[i].Name = C.GoString(expr) + + expr = C.pcap_datalink_val_to_description((*dltArray)[i]) + datalinks[i].Description = C.GoString(expr) + } + + return datalinks, nil +} + +// pcap_compile is NOT thread-safe, so protect it. +var pcapCompileMu sync.Mutex + +// compileBPFFilter always returns an allocated _Ctype_struct_bpf_program +// It is the callers responsibility to free the memory again, e.g. +// +// C.pcap_freecode(&bpf) +// +func (p *Handle) compileBPFFilter(expr string) (_Ctype_struct_bpf_program, error) { + errorBuf := (*C.char)(C.calloc(errorBufferSize, 1)) + defer C.free(unsafe.Pointer(errorBuf)) + + var netp uint32 + var maskp uint32 + + // Only do the lookup on network interfaces. + // No device indicates we're handling a pcap file. + if len(p.device) > 0 { + dev := C.CString(p.device) + defer C.free(unsafe.Pointer(dev)) + if -1 == C.pcap_lookupnet( + dev, + (*C.bpf_u_int32)(unsafe.Pointer(&netp)), + (*C.bpf_u_int32)(unsafe.Pointer(&maskp)), + errorBuf, + ) { + // We can't lookup the network, but that could be because the interface + // doesn't have an IPv4. + } + } + + var bpf _Ctype_struct_bpf_program + cexpr := C.CString(expr) + defer C.free(unsafe.Pointer(cexpr)) + + pcapCompileMu.Lock() + defer pcapCompileMu.Unlock() + if -1 == C.pcap_compile(p.cptr, &bpf, cexpr, 1, C.bpf_u_int32(maskp)) { + return bpf, p.Error() + } + + return bpf, nil +} + +// CompileBPFFilter compiles and returns a BPF filter with given a link type and capture length. +func CompileBPFFilter(linkType layers.LinkType, captureLength int, expr string) ([]BPFInstruction, error) { + cptr := C.pcap_open_dead(C.int(linkType), C.int(captureLength)) + if cptr == nil { + return nil, errors.New("error opening dead capture") + } + + h := Handle{cptr: cptr} + defer h.Close() + return h.CompileBPFFilter(expr) +} + +// CompileBPFFilter compiles and returns a BPF filter for the pcap handle. +func (p *Handle) CompileBPFFilter(expr string) ([]BPFInstruction, error) { + bpf, err := p.compileBPFFilter(expr) + defer C.pcap_freecode(&bpf) + if err != nil { + return nil, err + } + + bpfInsn := (*[bpfInstructionBufferSize]_Ctype_struct_bpf_insn)(unsafe.Pointer(bpf.bf_insns))[0:bpf.bf_len:bpf.bf_len] + bpfInstruction := make([]BPFInstruction, len(bpfInsn), len(bpfInsn)) + + for i, v := range bpfInsn { + bpfInstruction[i].Code = uint16(v.code) + bpfInstruction[i].Jt = uint8(v.jt) + bpfInstruction[i].Jf = uint8(v.jf) + bpfInstruction[i].K = uint32(v.k) + } + + return bpfInstruction, nil +} + +// SetBPFFilter compiles and sets a BPF filter for the pcap handle. +func (p *Handle) SetBPFFilter(expr string) (err error) { + bpf, err := p.compileBPFFilter(expr) + defer C.pcap_freecode(&bpf) + if err != nil { + return err + } + + if -1 == C.pcap_setfilter(p.cptr, &bpf) { + return p.Error() + } + + return nil +} + +// SetBPFInstructionFilter may be used to apply a filter in BPF asm byte code format. +// +// Simplest way to generate BPF asm byte code is with tcpdump: +// tcpdump -dd 'udp' +// +// The output may be used directly to add a filter, e.g.: +// bpfInstructions := []pcap.BpfInstruction{ +// {0x28, 0, 0, 0x0000000c}, +// {0x15, 0, 9, 0x00000800}, +// {0x30, 0, 0, 0x00000017}, +// {0x15, 0, 7, 0x00000006}, +// {0x28, 0, 0, 0x00000014}, +// {0x45, 5, 0, 0x00001fff}, +// {0xb1, 0, 0, 0x0000000e}, +// {0x50, 0, 0, 0x0000001b}, +// {0x54, 0, 0, 0x00000012}, +// {0x15, 0, 1, 0x00000012}, +// {0x6, 0, 0, 0x0000ffff}, +// {0x6, 0, 0, 0x00000000}, +// } +// +// An other posibility is to write the bpf code in bpf asm. +// Documentation: https://www.kernel.org/doc/Documentation/networking/filter.txt +// +// To compile the code use bpf_asm from +// https://github.com/torvalds/linux/tree/master/tools/net +// +// The following command may be used to convert bpf_asm output to c/go struct, usable for SetBPFFilterByte: +// bpf_asm -c tcp.bpf +func (p *Handle) SetBPFInstructionFilter(bpfInstructions []BPFInstruction) (err error) { + bpf, err := bpfInstructionFilter(bpfInstructions) + if err != nil { + return err + } + + if -1 == C.pcap_setfilter(p.cptr, &bpf) { + C.pcap_freecode(&bpf) + return p.Error() + } + + C.pcap_freecode(&bpf) + + return nil +} +func bpfInstructionFilter(bpfInstructions []BPFInstruction) (bpf _Ctype_struct_bpf_program, err error) { + if len(bpfInstructions) < 1 { + return bpf, errors.New("bpfInstructions must not be empty") + } + + if len(bpfInstructions) > MaxBpfInstructions { + return bpf, fmt.Errorf("bpfInstructions must not be larger than %d", MaxBpfInstructions) + } + + bpf.bf_len = C.u_int(len(bpfInstructions)) + cbpfInsns := C.calloc(C.size_t(len(bpfInstructions)), C.size_t(unsafe.Sizeof(bpfInstructions[0]))) + + copy((*[bpfInstructionBufferSize]BPFInstruction)(cbpfInsns)[0:len(bpfInstructions)], bpfInstructions) + bpf.bf_insns = (*_Ctype_struct_bpf_insn)(cbpfInsns) + + return +} + +// NewBPF compiles the given string into a new filter program. +// +// BPF filters need to be created from activated handles, because they need to +// know the underlying link type to correctly compile their offsets. +func (p *Handle) NewBPF(expr string) (*BPF, error) { + bpf := &BPF{orig: expr} + cexpr := C.CString(expr) + defer C.free(unsafe.Pointer(cexpr)) + + pcapCompileMu.Lock() + defer pcapCompileMu.Unlock() + if C.pcap_compile(p.cptr, &bpf.bpf, cexpr /* optimize */, 1, C.PCAP_NETMASK_UNKNOWN) != 0 { + return nil, p.Error() + } + + runtime.SetFinalizer(bpf, destroyBPF) + return bpf, nil +} + +// NewBPFInstructionFilter sets the given BPFInstructions as new filter program. +// +// More details see func SetBPFInstructionFilter +// +// BPF filters need to be created from activated handles, because they need to +// know the underlying link type to correctly compile their offsets. +func (p *Handle) NewBPFInstructionFilter(bpfInstructions []BPFInstruction) (*BPF, error) { + var err error + bpf := &BPF{orig: "BPF Instruction Filter"} + + bpf.bpf, err = bpfInstructionFilter(bpfInstructions) + if err != nil { + return nil, err + } + + runtime.SetFinalizer(bpf, destroyBPF) + return bpf, nil +} +func destroyBPF(bpf *BPF) { + C.pcap_freecode(&bpf.bpf) +} + +// String returns the original string this BPF filter was compiled from. +func (b *BPF) String() string { + return b.orig +} + +// Matches returns true if the given packet data matches this filter. +func (b *BPF) Matches(ci gopacket.CaptureInfo, data []byte) bool { + var hdr C.struct_pcap_pkthdr + hdr.ts.tv_sec = C.gopacket_time_secs_t(ci.Timestamp.Unix()) + hdr.ts.tv_usec = C.gopacket_time_usecs_t(ci.Timestamp.Nanosecond() / 1000) + hdr.caplen = C.bpf_u_int32(len(data)) // Trust actual length over ci.Length. + hdr.len = C.bpf_u_int32(ci.Length) + dataptr := (*C.u_char)(unsafe.Pointer(&data[0])) + return C.pcap_offline_filter(&b.bpf, &hdr, dataptr) != 0 +} + +// Version returns pcap_lib_version. +func Version() string { + return C.GoString(C.pcap_lib_version()) +} + +// LinkType returns pcap_datalink, as a layers.LinkType. +func (p *Handle) LinkType() layers.LinkType { + return layers.LinkType(C.pcap_datalink(p.cptr)) +} + +// SetLinkType calls pcap_set_datalink on the pcap handle. +func (p *Handle) SetLinkType(dlt layers.LinkType) error { + if -1 == C.pcap_set_datalink(p.cptr, C.int(dlt)) { + return p.Error() + } + return nil +} + +// FindAllDevs attempts to enumerate all interfaces on the current machine. +func FindAllDevs() (ifs []Interface, err error) { + var buf *C.char + buf = (*C.char)(C.calloc(errorBufferSize, 1)) + defer C.free(unsafe.Pointer(buf)) + var alldevsp *C.pcap_if_t + + if -1 == C.pcap_findalldevs((**C.pcap_if_t)(&alldevsp), buf) { + return nil, errors.New(C.GoString(buf)) + } + defer C.pcap_freealldevs((*C.pcap_if_t)(alldevsp)) + dev := alldevsp + var i uint32 + for i = 0; dev != nil; dev = (*C.pcap_if_t)(dev.next) { + i++ + } + ifs = make([]Interface, i) + dev = alldevsp + for j := uint32(0); dev != nil; dev = (*C.pcap_if_t)(dev.next) { + var iface Interface + iface.Name = C.GoString(dev.name) + iface.Description = C.GoString(dev.description) + iface.Addresses = findalladdresses(dev.addresses) + // TODO: add more elements + ifs[j] = iface + j++ + } + return +} + +func findalladdresses(addresses *_Ctype_struct_pcap_addr) (retval []InterfaceAddress) { + // TODO - make it support more than IPv4 and IPv6? + retval = make([]InterfaceAddress, 0, 1) + for curaddr := addresses; curaddr != nil; curaddr = (*_Ctype_struct_pcap_addr)(curaddr.next) { + // Strangely, it appears that in some cases, we get a pcap address back from + // pcap_findalldevs with a nil .addr. It appears that we can skip over + // these. + if curaddr.addr == nil { + continue + } + var a InterfaceAddress + var err error + if a.IP, err = sockaddrToIP((*syscall.RawSockaddr)(unsafe.Pointer(curaddr.addr))); err != nil { + continue + } + // To be safe, we'll also check for netmask. + if curaddr.netmask == nil { + continue + } + if a.Netmask, err = sockaddrToIP((*syscall.RawSockaddr)(unsafe.Pointer(curaddr.netmask))); err != nil { + // If we got an IP address but we can't get a netmask, just return the IP + // address. + a.Netmask = nil + } + retval = append(retval, a) + } + return +} + +func sockaddrToIP(rsa *syscall.RawSockaddr) (IP []byte, err error) { + switch rsa.Family { + case syscall.AF_INET: + pp := (*syscall.RawSockaddrInet4)(unsafe.Pointer(rsa)) + IP = make([]byte, 4) + for i := 0; i < len(IP); i++ { + IP[i] = pp.Addr[i] + } + return + case syscall.AF_INET6: + pp := (*syscall.RawSockaddrInet6)(unsafe.Pointer(rsa)) + IP = make([]byte, 16) + for i := 0; i < len(IP); i++ { + IP[i] = pp.Addr[i] + } + return + } + err = errors.New("Unsupported address type") + return +} + +// WritePacketData calls pcap_sendpacket, injecting the given data into the pcap handle. +func (p *Handle) WritePacketData(data []byte) (err error) { + if -1 == C.pcap_sendpacket(p.cptr, (*C.u_char)(&data[0]), (C.int)(len(data))) { + err = p.Error() + } + return +} + +// Direction is used by Handle.SetDirection. +type Direction uint8 + +// Direction values for Handle.SetDirection. +const ( + DirectionIn Direction = C.PCAP_D_IN + DirectionOut Direction = C.PCAP_D_OUT + DirectionInOut Direction = C.PCAP_D_INOUT +) + +// SetDirection sets the direction for which packets will be captured. +func (p *Handle) SetDirection(direction Direction) error { + if direction != DirectionIn && direction != DirectionOut && direction != DirectionInOut { + return fmt.Errorf("Invalid direction: %v", direction) + } + if status := C.pcap_setdirection(p.cptr, (C.pcap_direction_t)(direction)); status < 0 { + return statusError(status) + } + return nil +} + +// TimestampSource tells PCAP which type of timestamp to use for packets. +type TimestampSource C.int + +// String returns the timestamp type as a human-readable string. +func (t TimestampSource) String() string { + return C.GoString(C.pcap_tstamp_type_val_to_name(C.int(t))) +} + +// TimestampSourceFromString translates a string into a timestamp type, case +// insensitive. +func TimestampSourceFromString(s string) (TimestampSource, error) { + cs := C.CString(s) + defer C.free(unsafe.Pointer(cs)) + t := C.pcap_tstamp_type_name_to_val(cs) + if t < 0 { + return 0, statusError(t) + } + return TimestampSource(t), nil +} + +func statusError(status C.int) error { + return errors.New(C.GoString(C.pcap_statustostr(status))) +} + +// InactiveHandle allows you to call pre-pcap_activate functions on your pcap +// handle to set it up just the way you'd like. +type InactiveHandle struct { + // cptr is the handle for the actual pcap C object. + cptr *C.pcap_t + device string + deviceIndex int + timeout time.Duration +} + +// Activate activates the handle. The current InactiveHandle becomes invalid +// and all future function calls on it will fail. +func (p *InactiveHandle) Activate() (*Handle, error) { + err := activateError(C.pcap_activate(p.cptr)) + if err != aeNoError { + return nil, err + } + h := &Handle{ + cptr: p.cptr, + timeout: p.timeout, + device: p.device, + deviceIndex: p.deviceIndex, + } + p.cptr = nil + return h, nil +} + +// CleanUp cleans up any stuff left over from a successful or failed building +// of a handle. +func (p *InactiveHandle) CleanUp() { + if p.cptr != nil { + C.pcap_close(p.cptr) + } +} + +// NewInactiveHandle creates a new InactiveHandle, which wraps an un-activated PCAP handle. +// Callers of NewInactiveHandle should immediately defer 'CleanUp', as in: +// inactive := NewInactiveHandle("eth0") +// defer inactive.CleanUp() +func NewInactiveHandle(device string) (*InactiveHandle, error) { + buf := (*C.char)(C.calloc(errorBufferSize, 1)) + defer C.free(unsafe.Pointer(buf)) + dev := C.CString(device) + defer C.free(unsafe.Pointer(dev)) + + // Try to get the interface index, but iy could be something like "any" + // in which case use 0, which doesn't exist in nature + deviceIndex := 0 + ifc, err := net.InterfaceByName(device) + if err == nil { + deviceIndex = ifc.Index + } + + // This copies a bunch of the pcap_open_live implementation from pcap.c: + cptr := C.pcap_create(dev, buf) + if cptr == nil { + return nil, errors.New(C.GoString(buf)) + } + return &InactiveHandle{cptr: cptr, device: device, deviceIndex: deviceIndex}, nil +} + +// SetSnapLen sets the snap length (max bytes per packet to capture). +func (p *InactiveHandle) SetSnapLen(snaplen int) error { + if status := C.pcap_set_snaplen(p.cptr, C.int(snaplen)); status < 0 { + return statusError(status) + } + return nil +} + +// SetPromisc sets the handle to either be promiscuous (capture packets +// unrelated to this host) or not. +func (p *InactiveHandle) SetPromisc(promisc bool) error { + var pro C.int + if promisc { + pro = 1 + } + if status := C.pcap_set_promisc(p.cptr, pro); status < 0 { + return statusError(status) + } + return nil +} + +// SetTimeout sets the read timeout for the handle. +// +// See the package documentation for important details regarding 'timeout'. +func (p *InactiveHandle) SetTimeout(timeout time.Duration) error { + if status := C.pcap_set_timeout(p.cptr, timeoutMillis(timeout)); status < 0 { + return statusError(status) + } + p.timeout = timeout + return nil +} + +// SupportedTimestamps returns a list of supported timstamp types for this +// handle. +func (p *InactiveHandle) SupportedTimestamps() (out []TimestampSource) { + var types *C.int + n := int(C.pcap_list_tstamp_types(p.cptr, &types)) + defer C.pcap_free_tstamp_types(types) + typesArray := (*[100]C.int)(unsafe.Pointer(types)) + for i := 0; i < n; i++ { + out = append(out, TimestampSource((*typesArray)[i])) + } + return +} + +// SetTimestampSource sets the type of timestamp generator PCAP uses when +// attaching timestamps to packets. +func (p *InactiveHandle) SetTimestampSource(t TimestampSource) error { + if status := C.pcap_set_tstamp_type(p.cptr, C.int(t)); status < 0 { + return statusError(status) + } + return nil +} + +// CannotSetRFMon is returned by SetRFMon if the handle does not allow +// setting RFMon because pcap_can_set_rfmon returns 0. +var CannotSetRFMon = errors.New("Cannot set rfmon for this handle") + +// SetRFMon turns on radio monitoring mode, similar to promiscuous mode but for +// wireless networks. If this mode is enabled, the interface will not need to +// associate with an access point before it can receive traffic. +func (p *InactiveHandle) SetRFMon(monitor bool) error { + var mon C.int + if monitor { + mon = 1 + } + switch canset := C.pcap_can_set_rfmon(p.cptr); canset { + case 0: + return CannotSetRFMon + case 1: + // success + default: + return statusError(canset) + } + if status := C.pcap_set_rfmon(p.cptr, mon); status != 0 { + return statusError(status) + } + return nil +} + +// SetBufferSize sets the buffer size (in bytes) of the handle. +func (p *InactiveHandle) SetBufferSize(bufferSize int) error { + if status := C.pcap_set_buffer_size(p.cptr, C.int(bufferSize)); status < 0 { + return statusError(status) + } + return nil +} + +// SetImmediateMode sets (or unsets) the immediate mode of the +// handle. In immediate mode, packets are delivered to the application +// as soon as they arrive. In other words, this overrides SetTimeout. +func (p *InactiveHandle) SetImmediateMode(mode bool) error { + var md C.int + if mode { + md = 1 + } + if status := C.pcap_set_immediate_mode(p.cptr, md); status < 0 { + return statusError(status) + } + return nil +} diff --git a/vendor/github.com/google/gopacket/pcap/pcap_test.go b/vendor/github.com/google/gopacket/pcap/pcap_test.go new file mode 100644 index 0000000..04f1812 --- /dev/null +++ b/vendor/github.com/google/gopacket/pcap/pcap_test.go @@ -0,0 +1,308 @@ +// 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 pcap + +import ( + "fmt" + "io" + "io/ioutil" + "log" + "os" + "testing" + + "github.com/google/gopacket" + "github.com/google/gopacket/layers" +) + +func TestPcapNonexistentFile(t *testing.T) { + handle, err := OpenOffline("/path/to/nonexistent/file") + if err == nil { + t.Error("No error returned for nonexistent file open") + } else { + t.Logf("Error returned for nonexistent file: %v", err) + } + if handle != nil { + t.Error("Non-nil handle returned for nonexistent file open") + } +} + +func TestPcapFileRead(t *testing.T) { + invalidData := []byte{ + 0xAB, 0xAD, 0x1D, 0xEA, + } + + invalidPcap, err := ioutil.TempFile("", "invalid.pcap") + if err != nil { + t.Fatal(err) + } + defer os.Remove(invalidPcap.Name()) + + err = ioutil.WriteFile(invalidPcap.Name(), invalidData, 0644) + if err != nil { + t.Fatal(err) + } + defer invalidPcap.Close() + + for _, file := range []struct { + filename string + num int + expectedLayers []gopacket.LayerType + err string + }{ + {filename: "test_loopback.pcap", + num: 24, + expectedLayers: []gopacket.LayerType{ + layers.LayerTypeLoopback, + layers.LayerTypeIPv6, + layers.LayerTypeTCP, + }, + }, + {filename: "test_ethernet.pcap", + num: 16, + expectedLayers: []gopacket.LayerType{ + layers.LayerTypeEthernet, + layers.LayerTypeIPv4, + layers.LayerTypeTCP, + }, + }, + {filename: "test_dns.pcap", + num: 10, + expectedLayers: []gopacket.LayerType{ + layers.LayerTypeEthernet, + layers.LayerTypeIPv4, + layers.LayerTypeUDP, + layers.LayerTypeDNS, + }, + }, + {filename: invalidPcap.Name(), + num: 0, + err: "unknown file format", + }, + } { + t.Logf("\n\n\n\nProcessing file %s\n\n\n\n", file.filename) + + packets := []gopacket.Packet{} + if handle, err := OpenOffline(file.filename); err != nil { + if file.err != "" { + if err.Error() != file.err { + t.Errorf("expected message %q; got %q", file.err, err.Error()) + } + } else { + t.Fatal(err) + } + } else { + if file.err != "" { + t.Fatalf("Expected error, got none") + } + packetSource := gopacket.NewPacketSource(handle, handle.LinkType()) + for packet := range packetSource.Packets() { + packets = append(packets, packet) + } + } + if len(packets) != file.num { + t.Fatal("Incorrect number of packets, want", file.num, "got", len(packets)) + } + for i, p := range packets { + t.Log(p.Dump()) + for _, layertype := range file.expectedLayers { + if p.Layer(layertype) == nil { + t.Fatal("Packet", i, "has no layer type\n%s", layertype, p.Dump()) + } + } + } + } +} + +func TestBPF(t *testing.T) { + handle, err := OpenOffline("test_ethernet.pcap") + if err != nil { + t.Fatal(err) + } + + for _, expected := range []struct { + expr string + Error bool + Result bool + }{ + {"foobar", true, false}, + {"tcp[tcpflags] & (tcp-syn|tcp-ack) == (tcp-syn|tcp-ack)", false, true}, + {"tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-ack", false, true}, + {"udp", false, false}, + } { + data, ci, err := handle.ReadPacketData() + if err != nil { + t.Fatal(err) + } + t.Log("Testing filter", expected.expr) + if bpf, err := handle.NewBPF(expected.expr); err != nil { + if !expected.Error { + t.Error(err, "while compiling filter was unexpected") + } + } else if expected.Error { + t.Error("expected error but didn't see one") + } else if matches := bpf.Matches(ci, data); matches != expected.Result { + t.Error("Filter result was", matches, "but should be", expected.Result) + } + } +} + +func TestBPFInstruction(t *testing.T) { + handle, err := OpenOffline("test_ethernet.pcap") + if err != nil { + t.Fatal(err) + } + + cntr := 0 + oversizedBpfInstructionBuffer := [MaxBpfInstructions + 1]BPFInstruction{} + + for _, expected := range []struct { + Filter string + BpfInstruction []BPFInstruction + Error bool + Result bool + }{ + // {"foobar", true, false}, + {"foobar", []BPFInstruction{}, true, false}, + + // tcpdump -dd 'tcp[tcpflags] & (tcp-syn|tcp-ack) == (tcp-syn|tcp-ack)' + {"tcp[tcpflags] & (tcp-syn|tcp-ack) == (tcp-syn|tcp-ack)", + []BPFInstruction{ + {0x28, 0, 0, 0x0000000c}, + {0x15, 0, 9, 0x00000800}, + {0x30, 0, 0, 0x00000017}, + {0x15, 0, 7, 0x00000006}, + {0x28, 0, 0, 0x00000014}, + {0x45, 5, 0, 0x00001fff}, + {0xb1, 0, 0, 0x0000000e}, + {0x50, 0, 0, 0x0000001b}, + {0x54, 0, 0, 0x00000012}, + {0x15, 0, 1, 0x00000012}, + {0x6, 0, 0, 0x0000ffff}, + {0x6, 0, 0, 0x00000000}, + }, false, true}, + + // tcpdump -dd 'tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-ack' + {"tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-ack", + []BPFInstruction{ + {0x28, 0, 0, 0x0000000c}, + {0x15, 0, 9, 0x00000800}, + {0x30, 0, 0, 0x00000017}, + {0x15, 0, 7, 0x00000006}, + {0x28, 0, 0, 0x00000014}, + {0x45, 5, 0, 0x00001fff}, + {0xb1, 0, 0, 0x0000000e}, + {0x50, 0, 0, 0x0000001b}, + {0x54, 0, 0, 0x00000012}, + {0x15, 0, 1, 0x00000010}, + {0x6, 0, 0, 0x0000ffff}, + {0x6, 0, 0, 0x00000000}, + }, false, true}, + + // tcpdump -dd 'udp' + {"udp", + []BPFInstruction{ + {0x28, 0, 0, 0x0000000c}, + {0x15, 0, 5, 0x000086dd}, + {0x30, 0, 0, 0x00000014}, + {0x15, 6, 0, 0x00000011}, + {0x15, 0, 6, 0x0000002c}, + {0x30, 0, 0, 0x00000036}, + {0x15, 3, 4, 0x00000011}, + {0x15, 0, 3, 0x00000800}, + {0x30, 0, 0, 0x00000017}, + {0x15, 0, 1, 0x00000011}, + {0x6, 0, 0, 0x0000ffff}, + {0x6, 0, 0, 0x00000000}, + }, false, false}, + + {"", oversizedBpfInstructionBuffer[:], true, false}, + } { + cntr++ + data, ci, err := handle.ReadPacketData() + if err != nil { + t.Fatal(err) + } + + t.Log("Testing BpfInstruction filter", cntr) + if bpf, err := handle.NewBPFInstructionFilter(expected.BpfInstruction); err != nil { + if !expected.Error { + t.Error(err, "while compiling filter was unexpected") + } + } else if expected.Error { + t.Error("expected error but didn't see one") + } else if matches := bpf.Matches(ci, data); matches != expected.Result { + t.Error("Filter result was", matches, "but should be", expected.Result) + } + + if expected.Filter != "" { + t.Log("Testing dead bpf filter", cntr) + if bpf, err := CompileBPFFilter(layers.LinkTypeEthernet, 65535, expected.Filter); err != nil { + if !expected.Error { + t.Error(err, "while compiling filter was unexpected") + } + } else if expected.Error { + t.Error("expected error but didn't see one") + } else { + if len(bpf) != len(expected.BpfInstruction) { + t.Errorf("expected %d instructions, got %d", len(expected.BpfInstruction), len(bpf)) + } + for i := 0; i < len(bpf); i++ { + if bpf[i] != expected.BpfInstruction[i] { + t.Errorf("expected instruction %d = %d, got %d", i, expected.BpfInstruction[i], bpf[i]) + } + } + } + } + } +} + +func ExampleBPF() { + handle, err := OpenOffline("test_ethernet.pcap") + if err != nil { + log.Fatal(err) + } + synack, err := handle.NewBPF("tcp[tcpflags] & (tcp-syn|tcp-ack) == (tcp-syn|tcp-ack)") + if err != nil { + log.Fatal(err) + } + syn, err := handle.NewBPF("tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn") + if err != nil { + log.Fatal(err) + } + for { + data, ci, err := handle.ReadPacketData() + switch { + case err == io.EOF: + return + case err != nil: + log.Fatal(err) + case synack.Matches(ci, data): + fmt.Println("SYN/ACK packet") + case syn.Matches(ci, data): + fmt.Println("SYN packet") + default: + fmt.Println("SYN flag not set") + } + } + // Output: + // SYN packet + // SYN/ACK packet + // SYN flag not set + // SYN flag not set + // SYN flag not set + // SYN flag not set + // SYN flag not set + // SYN flag not set + // SYN flag not set + // SYN flag not set + // SYN flag not set + // SYN flag not set + // SYN flag not set + // SYN flag not set + // SYN flag not set + // SYN flag not set +} diff --git a/vendor/github.com/google/gopacket/pcap/pcap_tester.go b/vendor/github.com/google/gopacket/pcap/pcap_tester.go new file mode 100644 index 0000000..ee32690 --- /dev/null +++ b/vendor/github.com/google/gopacket/pcap/pcap_tester.go @@ -0,0 +1,109 @@ +// 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 tests that PCAP packet capture is working correctly by issuing +// HTTP requests, then making sure we actually capture data off the wire. +package main + +import ( + "errors" + "flag" + "fmt" + "log" + "net" + "net/http" + "os" + "time" + + "github.com/google/gopacket/pcap" +) + +var mode = flag.String("mode", "basic", "One of: basic,filtered,timestamp") + +func generatePackets() { + if resp, err := http.Get("http://code.google.com"); err != nil { + log.Printf("Could not get HTTP: %v", err) + } else { + resp.Body.Close() + } +} + +func main() { + flag.Parse() + ifaces, err := net.Interfaces() + if err != nil { + log.Fatal(err) + } + for _, iface := range ifaces { + log.Printf("Trying capture on %q", iface.Name) + if err := tryCapture(iface); err != nil { + log.Printf("Error capturing on %q: %v", iface.Name, err) + } else { + log.Printf("Successfully captured on %q", iface.Name) + return + } + } + os.Exit(1) +} + +func tryCapture(iface net.Interface) error { + if iface.Name[:2] == "lo" { + return errors.New("skipping loopback") + } + var h *pcap.Handle + var err error + switch *mode { + case "basic": + h, err = pcap.OpenLive(iface.Name, 65536, false, time.Second*3) + if err != nil { + return fmt.Errorf("openlive: %v", err) + } + defer h.Close() + case "filtered": + h, err = pcap.OpenLive(iface.Name, 65536, false, time.Second*3) + if err != nil { + return fmt.Errorf("openlive: %v", err) + } + defer h.Close() + if err := h.SetBPFFilter("port 80 or port 443"); err != nil { + return fmt.Errorf("setbpf: %v", err) + } + case "timestamp": + u, err := pcap.NewInactiveHandle(iface.Name) + if err != nil { + return err + } + defer u.CleanUp() + if err = u.SetSnapLen(65536); err != nil { + return err + } else if err = u.SetPromisc(false); err != nil { + return err + } else if err = u.SetTimeout(time.Second * 3); err != nil { + return err + } + sources := u.SupportedTimestamps() + if len(sources) == 0 { + return errors.New("no supported timestamp sources") + } else if err := u.SetTimestampSource(sources[0]); err != nil { + return fmt.Errorf("settimestampsource(%v): %v", sources[0], err) + } else if h, err = u.Activate(); err != nil { + return fmt.Errorf("could not activate: %v", err) + } + defer h.Close() + default: + panic("Invalid --mode: " + *mode) + } + go generatePackets() + h.ReadPacketData() // Do one dummy read to clear any timeouts. + data, ci, err := h.ReadPacketData() + if err != nil { + return fmt.Errorf("readpacketdata: %v", err) + } + log.Printf("Read packet, %v bytes, CI: %+v", len(data), ci) + return nil +} diff --git a/vendor/github.com/google/gopacket/pcap/pcap_unix.go b/vendor/github.com/google/gopacket/pcap/pcap_unix.go new file mode 100644 index 0000000..b2a6dcd --- /dev/null +++ b/vendor/github.com/google/gopacket/pcap/pcap_unix.go @@ -0,0 +1,71 @@ +// Copyright 2012 Google, Inc. All rights reserved. +// Copyright 2009-2011 Andreas Krennmair. 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 !windows + +package pcap + +/* +#include <stdlib.h> +#include <pcap.h> + +// pcap_wait returns when the next packet is available or the timeout expires. +// Since it uses pcap_get_selectable_fd, it will not work in Windows. +int pcap_wait(pcap_t *p, int usec) { + fd_set fds; + int fd; + struct timeval tv; + + fd = pcap_get_selectable_fd(p); + if(fd < 0) { + return fd; + } + + FD_ZERO(&fds); + FD_SET(fd, &fds); + + tv.tv_sec = 0; + tv.tv_usec = usec; + + if(usec != 0) { + return select(fd+1, &fds, NULL, NULL, &tv); + } + + // block indefinitely if no timeout provided + return select(fd+1, &fds, NULL, NULL, NULL); +} +*/ +import "C" + +import ( + "errors" + "unsafe" +) + +func (p *Handle) openLive() error { + buf := (*C.char)(C.calloc(errorBufferSize, 1)) + defer C.free(unsafe.Pointer(buf)) + + // Change the device to non-blocking, we'll use pcap_wait to wait until the + // handle is ready to read. + if v := C.pcap_setnonblock(p.cptr, 1, buf); v == -1 { + return errors.New(C.GoString(buf)) + } + + return nil +} + +// waitForPacket waits for a packet or for the timeout to expire. +func (p *Handle) waitForPacket() { + // need to wait less than the read timeout according to pcap documentation. + // timeoutMillis rounds up to at least one millisecond so we can safely + // subtract up to a millisecond. + usec := timeoutMillis(p.timeout) * 1000 + usec -= 100 + + C.pcap_wait(p.cptr, usec) +} diff --git a/vendor/github.com/google/gopacket/pcap/pcap_windows.go b/vendor/github.com/google/gopacket/pcap/pcap_windows.go new file mode 100644 index 0000000..e3df123 --- /dev/null +++ b/vendor/github.com/google/gopacket/pcap/pcap_windows.go @@ -0,0 +1,23 @@ +// Copyright 2012 Google, Inc. All rights reserved. +// Copyright 2009-2011 Andreas Krennmair. 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 pcap + +import ( + "runtime" +) + +func (p *Handle) openLive() error { + // do nothing + return nil +} + +// waitForPacket waits for a packet or for the timeout to expire. +func (p *Handle) waitForPacket() { + // can't use select() so instead just switch goroutines + runtime.Gosched() +} diff --git a/vendor/github.com/google/gopacket/pcap/pcapgo_test.go b/vendor/github.com/google/gopacket/pcap/pcapgo_test.go new file mode 100644 index 0000000..4de018a --- /dev/null +++ b/vendor/github.com/google/gopacket/pcap/pcapgo_test.go @@ -0,0 +1,56 @@ +// 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 pcap + +import ( + "bytes" + "github.com/google/gopacket" + "github.com/google/gopacket/layers" + "github.com/google/gopacket/pcapgo" + "io/ioutil" + "reflect" + "testing" + "time" +) + +func TestPCAPGoWrite(t *testing.T) { + f, err := ioutil.TempFile("", "pcapgo") + if err != nil { + t.Fatal(err) + } + data := []byte{0xab, 0xcd, 0xef, 0x01, 0x02, 0x03, 0x04} + ci := gopacket.CaptureInfo{ + Timestamp: time.Unix(12345667, 1234567000), + Length: 700, + CaptureLength: len(data), + } + func() { + defer f.Close() + w := pcapgo.NewWriter(f) + if err := w.WriteFileHeader(65536, layers.LinkTypeEthernet); err != nil { + t.Fatal(err) + } + if err := w.WritePacket(ci, data); err != nil { + t.Fatal(err) + } + }() + h, err := OpenOffline(f.Name()) + if err != nil { + t.Fatal(err) + } + defer h.Close() + gotData, gotCI, err := h.ReadPacketData() + if err != nil { + t.Fatal("could not read first packet:", err) + } + if !bytes.Equal(gotData, data) { + t.Errorf("byte mismatch:\nwant: %v\n got: %v", data, gotData) + } + if !reflect.DeepEqual(ci, gotCI) { + t.Errorf("CI mismatch:\nwant: %v\n got: %v", ci, gotCI) + } +} diff --git a/vendor/github.com/google/gopacket/pcap/test_dns.pcap b/vendor/github.com/google/gopacket/pcap/test_dns.pcap Binary files differnew file mode 100644 index 0000000..3a79f92 --- /dev/null +++ b/vendor/github.com/google/gopacket/pcap/test_dns.pcap diff --git a/vendor/github.com/google/gopacket/pcap/test_ethernet.pcap b/vendor/github.com/google/gopacket/pcap/test_ethernet.pcap Binary files differnew file mode 100644 index 0000000..1f8a87c --- /dev/null +++ b/vendor/github.com/google/gopacket/pcap/test_ethernet.pcap diff --git a/vendor/github.com/google/gopacket/pcap/test_loopback.pcap b/vendor/github.com/google/gopacket/pcap/test_loopback.pcap Binary files differnew file mode 100644 index 0000000..ddeb82c --- /dev/null +++ b/vendor/github.com/google/gopacket/pcap/test_loopback.pcap diff --git a/vendor/github.com/google/gopacket/pcapgo/read.go b/vendor/github.com/google/gopacket/pcapgo/read.go new file mode 100644 index 0000000..5acd06f --- /dev/null +++ b/vendor/github.com/google/gopacket/pcapgo/read.go @@ -0,0 +1,155 @@ +// Copyright 2014 Damjan Cvetko. 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 pcapgo + +import ( + "encoding/binary" + "errors" + "fmt" + "io" + "time" + + "bufio" + "compress/gzip" + "github.com/google/gopacket" + "github.com/google/gopacket/layers" +) + +// Reader wraps an underlying io.Reader to read packet data in PCAP +// format. See http://wiki.wireshark.org/Development/LibpcapFileFormat +// for information on the file format. +// +// We currenty read v2.4 file format with nanosecond and microsecdond +// timestamp resolution in little-endian and big-endian encoding. +// +// If the PCAP data is gzip compressed it is transparently uncompressed +// by wrapping the given io.Reader with a gzip.Reader. +type Reader struct { + r io.Reader + byteOrder binary.ByteOrder + nanoSecsFactor uint32 + versionMajor uint16 + versionMinor uint16 + // timezone + // sigfigs + snaplen uint32 + linkType layers.LinkType + // reusable buffer + buf [16]byte +} + +const magicNanoseconds = 0xA1B23C4D +const magicMicrosecondsBigendian = 0xD4C3B2A1 +const magicNanosecondsBigendian = 0x4D3CB2A1 + +const magicGzip1 = 0x1f +const magicGzip2 = 0x8b + +// NewReader returns a new reader object, for reading packet data from +// the given reader. The reader must be open and header data is +// read from it at this point. +// If the file format is not supported an error is returned +// +// // Create new reader: +// f, _ := os.Open("/tmp/file.pcap") +// defer f.Close() +// r, err := NewReader(f) +// data, ci, err := r.ReadPacketData() +func NewReader(r io.Reader) (*Reader, error) { + ret := Reader{r: r} + if err := ret.readHeader(); err != nil { + return nil, err + } + return &ret, nil +} + +func (r *Reader) readHeader() error { + br := bufio.NewReader(r.r) + gzipMagic, err := br.Peek(2) + if err != nil { + return err + } + + if gzipMagic[0] == magicGzip1 && gzipMagic[1] == magicGzip2 { + if r.r, err = gzip.NewReader(br); err != nil { + return err + } + } else { + r.r = br + } + + buf := make([]byte, 24) + if n, err := io.ReadFull(r.r, buf); err != nil { + return err + } else if n < 24 { + return errors.New("Not enough data for read") + } + if magic := binary.LittleEndian.Uint32(buf[0:4]); magic == magicNanoseconds { + r.byteOrder = binary.LittleEndian + r.nanoSecsFactor = 1 + } else if magic == magicNanosecondsBigendian { + r.byteOrder = binary.BigEndian + r.nanoSecsFactor = 1 + } else if magic == magicMicroseconds { + r.byteOrder = binary.LittleEndian + r.nanoSecsFactor = 1000 + } else if magic == magicMicrosecondsBigendian { + r.byteOrder = binary.BigEndian + r.nanoSecsFactor = 1000 + } else { + return fmt.Errorf("Unknown magic %x", magic) + } + if r.versionMajor = r.byteOrder.Uint16(buf[4:6]); r.versionMajor != versionMajor { + return fmt.Errorf("Unknown major version %d", r.versionMajor) + } + if r.versionMinor = r.byteOrder.Uint16(buf[6:8]); r.versionMinor != versionMinor { + return fmt.Errorf("Unknown minor version %d", r.versionMinor) + } + // ignore timezone 8:12 and sigfigs 12:16 + r.snaplen = r.byteOrder.Uint32(buf[16:20]) + r.linkType = layers.LinkType(r.byteOrder.Uint32(buf[20:24])) + return nil +} + +// ReadPacketData reads next packet from file. +func (r *Reader) ReadPacketData() (data []byte, ci gopacket.CaptureInfo, err error) { + if ci, err = r.readPacketHeader(); err != nil { + return + } + if ci.CaptureLength > int(r.snaplen) { + err = fmt.Errorf("capture length exceeds snap length: %d > %d", 16+ci.CaptureLength, r.snaplen) + return + } + data = make([]byte, ci.CaptureLength) + _, err = io.ReadFull(r.r, data) + return data, ci, err +} + +func (r *Reader) readPacketHeader() (ci gopacket.CaptureInfo, err error) { + if _, err = io.ReadFull(r.r, r.buf[:]); err != nil { + return + } + ci.Timestamp = time.Unix(int64(r.byteOrder.Uint32(r.buf[0:4])), int64(r.byteOrder.Uint32(r.buf[4:8])*r.nanoSecsFactor)).UTC() + ci.CaptureLength = int(r.byteOrder.Uint32(r.buf[8:12])) + ci.Length = int(r.byteOrder.Uint32(r.buf[12:16])) + return +} + +// LinkType returns network, as a layers.LinkType. +func (r *Reader) LinkType() layers.LinkType { + return r.linkType +} + +// Snaplen returns the snapshot length of the capture file. +func (r *Reader) Snaplen() uint32 { + return r.snaplen +} + +// Reader formater +func (r *Reader) String() string { + return fmt.Sprintf("PcapFile maj: %x min: %x snaplen: %d linktype: %s", r.versionMajor, r.versionMinor, r.snaplen, r.linkType) +} diff --git a/vendor/github.com/google/gopacket/pcapgo/read_test.go b/vendor/github.com/google/gopacket/pcapgo/read_test.go new file mode 100644 index 0000000..87bf7ab --- /dev/null +++ b/vendor/github.com/google/gopacket/pcapgo/read_test.go @@ -0,0 +1,203 @@ +// Copyright 2014 Damjan Cvetko. 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 pcapgo + +import ( + "bytes" + "testing" + "time" +) + +// test header read +func TestCreatePcapReader(t *testing.T) { + test := []byte{ + 0xd4, 0xc3, 0xb2, 0xa1, 0x02, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + } + buf := bytes.NewBuffer(test) + _, err := NewReader(buf) + if err != nil { + t.Error(err) + t.FailNow() + } +} + +// test big endian file read +func TestCreatePcapReaderBigEndian(t *testing.T) { + test := []byte{ + 0xa1, 0xb2, 0xc3, 0xd4, 0x00, 0x02, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, + } + buf := bytes.NewBuffer(test) + _, err := NewReader(buf) + if err != nil { + t.Error(err) + t.FailNow() + } +} + +// test opening invalid data +func TestCreatePcapReaderFail(t *testing.T) { + test := []byte{ + 0xd0, 0xc3, 0xb2, 0xa1, 0x02, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + } + buf := bytes.NewBuffer(test) + _, err := NewReader(buf) + if err == nil { + t.Error("Should fail but did not") + t.FailNow() + } +} + +func TestPacket(t *testing.T) { + test := []byte{ + 0xd4, 0xc3, 0xb2, 0xa1, 0x02, 0x00, 0x04, 0x00, // magic, maj, min + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // tz, sigfigs + 0xff, 0xff, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, // snaplen, linkType + 0x5A, 0xCC, 0x1A, 0x54, 0x01, 0x00, 0x00, 0x00, // sec, usec + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, // cap len, full len + 0x01, 0x02, 0x03, 0x04, // data + } + + buf := bytes.NewBuffer(test) + r, err := NewReader(buf) + + data, ci, err := r.ReadPacketData() + if err != nil { + t.Error(err) + t.FailNow() + } + if !ci.Timestamp.Equal(time.Date(2014, 9, 18, 12, 13, 14, 1000, time.UTC)) { + t.Error("Invalid time read") + t.FailNow() + } + if ci.CaptureLength != 4 || ci.Length != 8 { + t.Error("Invalid CapLen or Len") + } + want := []byte{1, 2, 3, 4} + if !bytes.Equal(data, want) { + t.Errorf("buf mismatch:\nwant: %+v\ngot: %+v", want, data) + } +} + +func TestPacketNano(t *testing.T) { + test := []byte{ + 0x4d, 0x3c, 0xb2, 0xa1, 0x02, 0x00, 0x04, 0x00, // magic, maj, min + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // tz, sigfigs + 0xff, 0xff, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, // snaplen, linkType + 0x5A, 0xCC, 0x1A, 0x54, 0x01, 0x00, 0x00, 0x00, // sec, usec + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, // cap len, full len + 0x01, 0x02, 0x03, 0x04, // data + } + + buf := bytes.NewBuffer(test) + r, err := NewReader(buf) + + data, ci, err := r.ReadPacketData() + if err != nil { + t.Error(err) + t.FailNow() + } + if !ci.Timestamp.Equal(time.Date(2014, 9, 18, 12, 13, 14, 1, time.UTC)) { + t.Error("Invalid time read") + t.FailNow() + } + if ci.CaptureLength != 4 || ci.Length != 8 { + t.Error("Invalid CapLen or Len") + } + want := []byte{1, 2, 3, 4} + if !bytes.Equal(data, want) { + t.Errorf("buf mismatch:\nwant: %+v\ngot: %+v", want, data) + } +} + +func TestGzipPacket(t *testing.T) { + test := []byte{ + 0x1f, 0x8b, 0x08, 0x08, 0x92, 0x4d, 0x81, 0x57, + 0x00, 0x03, 0x74, 0x65, 0x73, 0x74, 0x00, 0xbb, + 0x72, 0x78, 0xd3, 0x42, 0x26, 0x06, 0x16, 0x06, + 0x18, 0xf8, 0xff, 0x9f, 0x81, 0x81, 0x11, 0x48, + 0x47, 0x9d, 0x91, 0x0a, 0x01, 0xd1, 0x20, 0x19, + 0x0e, 0x20, 0x66, 0x64, 0x62, 0x66, 0x01, 0x00, + 0xe4, 0x76, 0x9b, 0x75, 0x2c, 0x00, 0x00, 0x00, + } + buf := bytes.NewBuffer(test) + r, err := NewReader(buf) + if err != nil { + t.Error("Unexpected error returned:", err) + t.FailNow() + } + + data, ci, err := r.ReadPacketData() + if err != nil { + t.Error(err) + t.FailNow() + } + if !ci.Timestamp.Equal(time.Date(2014, 9, 18, 12, 13, 14, 1000, time.UTC)) { + t.Error("Invalid time read") + t.FailNow() + } + if ci.CaptureLength != 4 || ci.Length != 8 { + t.Error("Invalid CapLen or Len") + } + want := []byte{1, 2, 3, 4} + if !bytes.Equal(data, want) { + t.Errorf("buf mismatch:\nwant: %+v\ngot: %+v", want, data) + } +} + +func TestTruncatedGzipPacket(t *testing.T) { + test := []byte{ + 0x1f, 0x8b, 0x08, + } + buf := bytes.NewBuffer(test) + _, err := NewReader(buf) + if err == nil { + t.Error("Should fail but did not") + t.FailNow() + } +} + +func TestPacketBufferReuse(t *testing.T) { + test := []byte{ + 0xd4, 0xc3, 0xb2, 0xa1, 0x02, 0x00, 0x04, 0x00, // magic, maj, min + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // tz, sigfigs + 0xff, 0xff, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, // snaplen, linkType + 0x5A, 0xCC, 0x1A, 0x54, 0x01, 0x00, 0x00, 0x00, // sec, usec + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, // cap len, full len + 0x01, 0x02, 0x03, 0x04, // data + 0x5A, 0xCC, 0x1A, 0x54, 0x01, 0x00, 0x00, 0x00, // sec, usec + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, // cap len, full len + 0x01, 0x02, 0x03, 0x04, // data + } + + buf := bytes.NewBuffer(test) + r, err := NewReader(buf) + + data1, _, err := r.ReadPacketData() + if err != nil { + t.Error(err) + t.FailNow() + } + if want := []byte{1, 2, 3, 4}; !bytes.Equal(data1, want) { + t.Errorf("buf mismatch:\nwant: %+v\ngot: %+v", want, data1) + } + data2, _, err := r.ReadPacketData() + if err != nil { + t.Error(err) + t.FailNow() + } + for i := range data1 { + data1[i] = 0xff // modify data1 after getting data2, make sure we don't overlap buffers. + } + if want := []byte{1, 2, 3, 4}; !bytes.Equal(data2, want) { + t.Errorf("buf mismatch:\nwant: %+v\ngot: %+v", want, data2) + } +} diff --git a/vendor/github.com/google/gopacket/pcapgo/write.go b/vendor/github.com/google/gopacket/pcapgo/write.go new file mode 100644 index 0000000..bfc312f --- /dev/null +++ b/vendor/github.com/google/gopacket/pcapgo/write.go @@ -0,0 +1,103 @@ +// 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 pcapgo provides some native PCAP support, not requiring +// C libpcap to be installed. +package pcapgo + +import ( + "encoding/binary" + "fmt" + "io" + "time" + + "github.com/google/gopacket" + "github.com/google/gopacket/layers" +) + +// Writer wraps an underlying io.Writer to write packet data in PCAP +// format. See http://wiki.wireshark.org/Development/LibpcapFileFormat +// for information on the file format. +// +// For those that care, we currently write v2.4 files with nanosecond +// timestamp resolution and little-endian encoding. +type Writer struct { + w io.Writer +} + +const magicMicroseconds = 0xA1B2C3D4 +const versionMajor = 2 +const versionMinor = 4 + +// NewWriter returns a new writer object, for writing packet data out +// to the given writer. If this is a new empty writer (as opposed to +// an append), you must call WriteFileHeader before WritePacket. +// +// // Write a new file: +// f, _ := os.Create("/tmp/file.pcap") +// w := pcapgo.NewWriter(f) +// w.WriteFileHeader(65536, layers.LinkTypeEthernet) // new file, must do this. +// w.WritePacket(gopacket.CaptureInfo{...}, data1) +// f.Close() +// // Append to existing file (must have same snaplen and linktype) +// f2, _ := os.OpenFile("/tmp/file.pcap", os.O_APPEND, 0700) +// w2 := pcapgo.NewWriter(f2) +// // no need for file header, it's already written. +// w2.WritePacket(gopacket.CaptureInfo{...}, data2) +// f2.Close() +func NewWriter(w io.Writer) *Writer { + return &Writer{w: w} +} + +// WriteFileHeader writes a file header out to the writer. +// This must be called exactly once per output. +func (w *Writer) WriteFileHeader(snaplen uint32, linktype layers.LinkType) error { + var buf [24]byte + binary.LittleEndian.PutUint32(buf[0:4], magicMicroseconds) + binary.LittleEndian.PutUint16(buf[4:6], versionMajor) + binary.LittleEndian.PutUint16(buf[6:8], versionMinor) + // bytes 8:12 stay 0 (timezone = UTC) + // bytes 12:16 stay 0 (sigfigs is always set to zero, according to + // http://wiki.wireshark.org/Development/LibpcapFileFormat + binary.LittleEndian.PutUint32(buf[16:20], snaplen) + binary.LittleEndian.PutUint32(buf[20:24], uint32(linktype)) + _, err := w.w.Write(buf[:]) + return err +} + +const nanosPerMicro = 1000 + +func (w *Writer) writePacketHeader(ci gopacket.CaptureInfo) error { + var buf [16]byte + + t := ci.Timestamp + if t.IsZero() { + t = time.Now() + } + secs := t.Unix() + usecs := t.Nanosecond() / nanosPerMicro + binary.LittleEndian.PutUint32(buf[0:4], uint32(secs)) + binary.LittleEndian.PutUint32(buf[4:8], uint32(usecs)) + binary.LittleEndian.PutUint32(buf[8:12], uint32(ci.CaptureLength)) + binary.LittleEndian.PutUint32(buf[12:16], uint32(ci.Length)) + _, err := w.w.Write(buf[:]) + return err +} + +// WritePacket writes the given packet data out to the file. +func (w *Writer) WritePacket(ci gopacket.CaptureInfo, data []byte) error { + if ci.CaptureLength != len(data) { + return fmt.Errorf("capture length %d does not match data length %d", ci.CaptureLength, len(data)) + } + if ci.CaptureLength > ci.Length { + return fmt.Errorf("invalid capture info %+v: capture length > length", ci) + } + if err := w.writePacketHeader(ci); err != nil { + return fmt.Errorf("error writing packet header: %v", err) + } + _, err := w.w.Write(data) + return err +} diff --git a/vendor/github.com/google/gopacket/pcapgo/write_test.go b/vendor/github.com/google/gopacket/pcapgo/write_test.go new file mode 100644 index 0000000..5b87d6a --- /dev/null +++ b/vendor/github.com/google/gopacket/pcapgo/write_test.go @@ -0,0 +1,71 @@ +// 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 pcapgo + +import ( + "bytes" + "github.com/google/gopacket" + "testing" + "time" +) + +func TestWriteHeader(t *testing.T) { + var buf bytes.Buffer + w := NewWriter(&buf) + w.WriteFileHeader(0x1234, 0x56) + want := []byte{ + 0xd4, 0xc3, 0xb2, 0xa1, 0x02, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x34, 0x12, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, + } + if got := buf.Bytes(); !bytes.Equal(got, want) { + t.Errorf("buf mismatch:\nwant: %+v\ngot: %+v", want, got) + } +} + +func TestWritePacket(t *testing.T) { + ci := gopacket.CaptureInfo{ + Timestamp: time.Unix(0x01020304, 0xAA*1000), + Length: 0xABCD, + CaptureLength: 10, + } + data := []byte{9, 8, 7, 6, 5, 4, 3, 2, 1, 0} + var buf bytes.Buffer + w := NewWriter(&buf) + w.WritePacket(ci, data) + want := []byte{ + 0x04, 0x03, 0x02, 0x01, 0xAA, 0x00, 0x00, 0x00, + 0x0A, 0x00, 0x00, 0x00, 0xCD, 0xAB, 0x00, 0x00, + 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, + } + if got := buf.Bytes(); !bytes.Equal(got, want) { + t.Errorf("buf mismatch:\nwant: %+v\ngot: %+v", want, got) + } +} + +func TestCaptureInfoErrors(t *testing.T) { + data := []byte{1, 2, 3, 4} + ts := time.Unix(0, 0) + for _, test := range []gopacket.CaptureInfo{ + gopacket.CaptureInfo{ + Timestamp: ts, + Length: 5, + CaptureLength: 5, + }, + gopacket.CaptureInfo{ + Timestamp: ts, + Length: 3, + CaptureLength: 4, + }, + } { + var buf bytes.Buffer + w := NewWriter(&buf) + if err := w.WritePacket(test, data); err == nil { + t.Errorf("CaptureInfo %+v should have error", test) + } + } +} diff --git a/vendor/github.com/google/gopacket/pfring/doc.go b/vendor/github.com/google/gopacket/pfring/doc.go new file mode 100644 index 0000000..32baaf6 --- /dev/null +++ b/vendor/github.com/google/gopacket/pfring/doc.go @@ -0,0 +1,58 @@ +// 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 pfring wraps the PF_RING C library for Go. + +PF_RING is a high-performance packet capture library written by ntop.org (see +http://www.ntop.org/products/pf_ring/). This library allows you to utilize the +PF_RING library with gopacket to read packet data and decode it. + +This package is meant to be used with its parent, +http://github.com/google/gopacket, although it can also be used independently +if you just want to get packet data from the wire. + +Simple Example + +This is probably the simplest code you can use to start getting packets through +pfring: + + if ring, err := pfring.NewRing("eth0", 65536, pfring.FlagPromisc); err != nil { + panic(err) + } else if err := ring.SetBPFFilter("tcp and port 80"); err != nil { // optional + panic(err) + } else if err := ring.Enable(); err != nil { // Must do this!, or you get no packets! + panic(err) + } else { + packetSource := gopacket.NewPacketSource(ring, layers.LinkTypeEthernet) + for packet := range packetSource.Packets() { + handlePacket(packet) // Do something with a packet here. + } + } + +Pfring Tweaks + +PF_RING has a ton of optimizations and tweaks to make sure you get just the +packets you want. For example, if you're only using pfring to read packets, +consider running: + + ring.SetSocketMode(pfring.ReadOnly) + +If you only care about packets received on your interface (not those transmitted +by the interface), you can run: + + ring.SetDirection(pfring.ReceiveOnly) + +Pfring Clusters + +PF_RING has an idea of 'clusters', where multiple applications can all read from +the same cluster, and PF_RING will multiplex packets over that cluster such that +only one application receives each packet. We won't discuss this mechanism in +too much more detail (see the ntop.org docs for more info), but here's how to +utilize this with the pfring go library: + + ring.SetCluster(1, pfring.ClusterPerFlow5Tuple) +*/ +package pfring diff --git a/vendor/github.com/google/gopacket/pfring/pfring.go b/vendor/github.com/google/gopacket/pfring/pfring.go new file mode 100644 index 0000000..1d2fa68 --- /dev/null +++ b/vendor/github.com/google/gopacket/pfring/pfring.go @@ -0,0 +1,343 @@ +// Copyright 2012 Google, Inc. All rights reserved. +// Copyright 2009-2011 Andreas Krennmair. 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 pfring + +/* +#cgo LDFLAGS: -lpfring -lpcap +#include <stdlib.h> +#include <pfring.h> +#include <linux/pf_ring.h> + +int pfring_readpacketdatato_wrapper( + pfring* ring, + u_char* buffer, + u_int buffer_len, + struct pfring_pkthdr* hdr) { + // We can't pass a Go pointer to a Go pointer which means we can't pass + // buffer as a uchar**, like pfring_recv wants, for ReadPacketDataTo. So, + // this wrapper does the pointer conversion in C code. Since this isn't + // zero-copy, it turns out that the pointer-to-pointer part of things isn't + // actually used anyway. + return pfring_recv(ring, &buffer, buffer_len, hdr, 1); +} +*/ +import "C" + +// NOTE: If you install PF_RING with non-standard options, you may also need +// to use LDFLAGS -lnuma and/or -lrt. Both have been reported necessary if +// PF_RING is configured with --disable-bpf. + +import ( + "fmt" + "net" + "os" + "strconv" + "sync" + "time" + "unsafe" + + "github.com/google/gopacket" +) + +const errorBufferSize = 256 + +// Ring provides a handle to a pf_ring. +type Ring struct { + // cptr is the handle for the actual pcap C object. + cptr *C.pfring + snaplen int + useExtendedPacketHeader bool + interfaceIndex int + mu sync.Mutex + // Since pointers to these objects are passed into a C function, if + // they're declared locally then the Go compiler thinks they may have + // escaped into C-land, so it allocates them on the heap. This causes a + // huge memory hit, so to handle that we store them here instead. + pkthdr C.struct_pfring_pkthdr + bufPtr *C.u_char +} + +// Flag provides a set of boolean flags to use when creating a new ring. +type Flag uint32 + +// Set of flags that can be passed (OR'd together) to NewRing. +const ( + FlagReentrant Flag = C.PF_RING_REENTRANT + FlagLongHeader Flag = C.PF_RING_LONG_HEADER + FlagPromisc Flag = C.PF_RING_PROMISC + FlagDNASymmetricRSS Flag = C.PF_RING_DNA_SYMMETRIC_RSS + FlagTimestamp Flag = C.PF_RING_TIMESTAMP + FlagHWTimestamp Flag = C.PF_RING_HW_TIMESTAMP +) + +// NewRing creates a new PFRing. Note that when the ring is initially created, +// it is disabled. The caller must call Enable to start receiving packets. +// The caller should call Close on the given ring when finished with it. +func NewRing(device string, snaplen uint32, flags Flag) (ring *Ring, _ error) { + dev := C.CString(device) + defer C.free(unsafe.Pointer(dev)) + + cptr, err := C.pfring_open(dev, C.u_int32_t(snaplen), C.u_int32_t(flags)) + if cptr == nil || err != nil { + return nil, fmt.Errorf("pfring NewRing error: %v", err) + } + ring = &Ring{cptr: cptr, snaplen: int(snaplen)} + + if flags&FlagLongHeader == FlagLongHeader { + ring.useExtendedPacketHeader = true + } else { + ifc, err := net.InterfaceByName(device) + if err == nil { + ring.interfaceIndex = ifc.Index + } + } + ring.SetApplicationName(os.Args[0]) + return +} + +// Close closes the given Ring. After this call, the Ring should no longer be +// used. +func (r *Ring) Close() { + C.pfring_close(r.cptr) +} + +// NextResult is the return code from a call to Next. +type NextResult int32 + +// Set of results that could be returned from a call to get another packet. +const ( + NextNoPacketNonblocking NextResult = 0 + NextError NextResult = -1 + NextOk NextResult = 1 + NextNotEnabled NextResult = -7 +) + +// NextResult implements the error interface. +func (n NextResult) Error() string { + switch n { + case NextNoPacketNonblocking: + return "No packet available, nonblocking socket" + case NextError: + return "Generic error" + case NextOk: + return "Success (not an error)" + case NextNotEnabled: + return "Ring not enabled" + } + return strconv.Itoa(int(n)) +} + +// ReadPacketDataTo reads packet data into a user-supplied buffer. +// This function ignores snaplen and instead reads up to the length of the +// passed-in slice. +// The number of bytes read into data will be returned in ci.CaptureLength. +func (r *Ring) ReadPacketDataTo(data []byte) (ci gopacket.CaptureInfo, err error) { + // This tricky bufPtr points to the start of our slice data, so pfring_recv + // will actually write directly into our Go slice. Nice! + r.mu.Lock() + r.bufPtr = (*C.u_char)(unsafe.Pointer(&data[0])) + result := NextResult(C.pfring_readpacketdatato_wrapper(r.cptr, r.bufPtr, C.u_int(len(data)), &r.pkthdr)) + if result != NextOk { + err = result + r.mu.Unlock() + return + } + ci.Timestamp = time.Unix(int64(r.pkthdr.ts.tv_sec), + int64(r.pkthdr.ts.tv_usec)*1000) // convert micros to nanos + ci.CaptureLength = int(r.pkthdr.caplen) + ci.Length = int(r.pkthdr.len) + if r.useExtendedPacketHeader { + ci.InterfaceIndex = int(r.pkthdr.extended_hdr.if_index) + } else { + ci.InterfaceIndex = r.interfaceIndex + } + r.mu.Unlock() + return +} + +// ReadPacketData returns the next packet read from the pcap handle, along with an error +// code associated with that packet. If the packet is read successfully, the +// returned error is nil. +func (r *Ring) ReadPacketData() (data []byte, ci gopacket.CaptureInfo, err error) { + data = make([]byte, r.snaplen) + ci, err = r.ReadPacketDataTo(data) + if err != nil { + data = nil + return + } + data = data[:ci.CaptureLength] + return +} + +// ClusterType is a type of clustering used when balancing across multiple +// rings. +type ClusterType C.cluster_type + +const ( + // ClusterPerFlow clusters by <src ip, src port, dst ip, dst port, proto, + // vlan> + ClusterPerFlow ClusterType = C.cluster_per_flow + // ClusterRoundRobin round-robins packets between applications, ignoring + // packet information. + ClusterRoundRobin ClusterType = C.cluster_round_robin + // ClusterPerFlow2Tuple clusters by <src ip, dst ip> + ClusterPerFlow2Tuple ClusterType = C.cluster_per_flow_2_tuple + // ClusterPerFlow4Tuple clusters by <src ip, src port, dst ip, dst port> + ClusterPerFlow4Tuple ClusterType = C.cluster_per_flow_4_tuple + // ClusterPerFlow5Tuple clusters by <src ip, src port, dst ip, dst port, + // proto> + ClusterPerFlow5Tuple ClusterType = C.cluster_per_flow_5_tuple + // ClusterPerFlowTCP5Tuple acts like ClusterPerFlow5Tuple for TCP packets and + // like ClusterPerFlow2Tuple for all other packets. + ClusterPerFlowTCP5Tuple ClusterType = C.cluster_per_flow_tcp_5_tuple +) + +// SetCluster sets which cluster the ring should be part of, and the cluster +// type to use. +func (r *Ring) SetCluster(cluster int, typ ClusterType) error { + if rv := C.pfring_set_cluster(r.cptr, C.u_int(cluster), C.cluster_type(typ)); rv != 0 { + return fmt.Errorf("Unable to set cluster, got error code %d", rv) + } + return nil +} + +// RemoveFromCluster removes the ring from the cluster it was put in with +// SetCluster. +func (r *Ring) RemoveFromCluster() error { + if rv := C.pfring_remove_from_cluster(r.cptr); rv != 0 { + return fmt.Errorf("Unable to remove from cluster, got error code %d", rv) + } + return nil +} + +// SetSamplingRate sets the sampling rate to 1/<rate>. +func (r *Ring) SetSamplingRate(rate int) error { + if rv := C.pfring_set_sampling_rate(r.cptr, C.u_int32_t(rate)); rv != 0 { + return fmt.Errorf("Unable to set sampling rate, got error code %d", rv) + } + return nil +} + +// SetBPFFilter sets the BPF filter for the ring. +func (r *Ring) SetBPFFilter(bpfFilter string) error { + filter := C.CString(bpfFilter) + defer C.free(unsafe.Pointer(filter)) + if rv := C.pfring_set_bpf_filter(r.cptr, filter); rv != 0 { + return fmt.Errorf("Unable to set BPF filter, got error code %d", rv) + } + return nil +} + +// RemoveBPFFilter removes the BPF filter from the ring. +func (r *Ring) RemoveBPFFilter() error { + if rv := C.pfring_remove_bpf_filter(r.cptr); rv != 0 { + return fmt.Errorf("Unable to remove BPF filter, got error code %d", rv) + } + return nil +} + +// WritePacketData uses the ring to send raw packet data to the interface. +func (r *Ring) WritePacketData(data []byte) error { + buf := (*C.char)(unsafe.Pointer(&data[0])) + if rv := C.pfring_send(r.cptr, buf, C.u_int(len(data)), 1); rv < 0 { + return fmt.Errorf("Unable to send packet data, got error code %d", rv) + } + return nil +} + +// Enable enables the given ring. This function MUST be called on each new +// ring after it has been set up, or that ring will NOT receive packets. +func (r *Ring) Enable() error { + if rv := C.pfring_enable_ring(r.cptr); rv != 0 { + return fmt.Errorf("Unable to enable ring, got error code %d", rv) + } + return nil +} + +// Disable disables the given ring. After this call, it will no longer receive +// packets. +func (r *Ring) Disable() error { + if rv := C.pfring_disable_ring(r.cptr); rv != 0 { + return fmt.Errorf("Unable to disable ring, got error code %d", rv) + } + return nil +} + +// Stats provides simple statistics on a ring. +type Stats struct { + Received, Dropped uint64 +} + +// Stats returns statistsics for the ring. +func (r *Ring) Stats() (s Stats, err error) { + var stats C.pfring_stat + if rv := C.pfring_stats(r.cptr, &stats); rv != 0 { + err = fmt.Errorf("Unable to get ring stats, got error code %d", rv) + return + } + s.Received = uint64(stats.recv) + s.Dropped = uint64(stats.drop) + return +} + +// Direction is a simple enum to set which packets (TX, RX, or both) a ring +// captures. +type Direction C.packet_direction + +const ( + // TransmitOnly will only capture packets transmitted by the ring's + // interface(s). + TransmitOnly Direction = C.tx_only_direction + // ReceiveOnly will only capture packets received by the ring's + // interface(s). + ReceiveOnly Direction = C.rx_only_direction + // ReceiveAndTransmit will capture both received and transmitted packets on + // the ring's interface(s). + ReceiveAndTransmit Direction = C.rx_and_tx_direction +) + +// SetDirection sets which packets should be captured by the ring. +func (r *Ring) SetDirection(d Direction) error { + if rv := C.pfring_set_direction(r.cptr, C.packet_direction(d)); rv != 0 { + return fmt.Errorf("Unable to set ring direction, got error code %d", rv) + } + return nil +} + +// SocketMode is an enum for setting whether a ring should read, write, or both. +type SocketMode C.socket_mode + +const ( + // WriteOnly sets up the ring to only send packets (Inject), not read them. + WriteOnly SocketMode = C.send_only_mode + // ReadOnly sets up the ring to only receive packets (ReadPacketData), not + // send them. + ReadOnly SocketMode = C.recv_only_mode + // WriteAndRead sets up the ring to both send and receive packets. + WriteAndRead SocketMode = C.send_and_recv_mode +) + +// SetSocketMode sets the mode of the ring socket to send, receive, or both. +func (r *Ring) SetSocketMode(s SocketMode) error { + if rv := C.pfring_set_socket_mode(r.cptr, C.socket_mode(s)); rv != 0 { + return fmt.Errorf("Unable to set socket mode, got error code %d", rv) + } + return nil +} + +// SetApplicationName sets a string name to the ring. This name is available in +// /proc stats for pf_ring. By default, NewRing automatically calls this with +// argv[0]. +func (r *Ring) SetApplicationName(name string) error { + buf := C.CString(name) + defer C.free(unsafe.Pointer(buf)) + if rv := C.pfring_set_application_name(r.cptr, buf); rv != 0 { + return fmt.Errorf("Unable to set ring application name, got error code %d", rv) + } + return nil +} diff --git a/vendor/github.com/google/gopacket/reassembly/cap2test.go b/vendor/github.com/google/gopacket/reassembly/cap2test.go new file mode 100644 index 0000000..1d43f1d --- /dev/null +++ b/vendor/github.com/google/gopacket/reassembly/cap2test.go @@ -0,0 +1,105 @@ +// 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 + +package main + +import ( + "bytes" + "flag" + "fmt" + "log" + "os" + "strings" + + "github.com/google/gopacket" + "github.com/google/gopacket/layers" + "github.com/google/gopacket/pcap" +) + +var input = flag.String("i", "", "Input filename") + +func main() { + var handler *pcap.Handle + var err error + flag.Parse() + if *input == "" { + log.Fatalf("Please specify input filename") + } + if handler, err = pcap.OpenOffline(*input); err != nil { + log.Fatalf("Failed to open: %s: %s", *input, err) + } + args := flag.Args() + if len(args) > 0 { + filter := strings.Join(args, " ") + if err := handler.SetBPFFilter(filter); err != nil { + log.Fatalf("Failed to set BPF filter \"%s\": %s", filter, err) + } + handler.Stats() + } + var decoder gopacket.Decoder + var ok bool + linkType := fmt.Sprintf("%s", handler.LinkType()) + if decoder, ok = gopacket.DecodersByLayerName[linkType]; !ok { + log.Fatalf("Failed to find decoder to pcap's linktype %s", linkType) + } + source := gopacket.NewPacketSource(handler, decoder) + count := uint64(0) + pktNonTcp := uint64(0) + pktTcp := uint64(0) + fmt.Println("test([]testSequence{") + for packet := range source.Packets() { + count++ + tcp := packet.Layer(layers.LayerTypeTCP) + if tcp == nil { + pktNonTcp++ + continue + } else { + pktTcp++ + tcp := tcp.(*layers.TCP) + //fmt.Printf("packet: %s\n", tcp) + var b bytes.Buffer + b.WriteString("{\n") + // TCP + b.WriteString("tcp: layers.TCP{\n") + if tcp.SYN { + b.WriteString(" SYN: true,\n") + } + if tcp.ACK { + b.WriteString(" ACK: true,\n") + } + if tcp.RST { + b.WriteString(" RST: true,\n") + } + if tcp.FIN { + b.WriteString(" FIN: true,\n") + } + b.WriteString(fmt.Sprintf(" SrcPort: %d,\n", tcp.SrcPort)) + b.WriteString(fmt.Sprintf(" DstPort: %d,\n", tcp.DstPort)) + b.WriteString(fmt.Sprintf(" Seq: %d,\n", tcp.Seq)) + b.WriteString(fmt.Sprintf(" Ack: %d,\n", tcp.Ack)) + b.WriteString(" BaseLayer: layers.BaseLayer{Payload: []byte{") + for _, p := range tcp.Payload { + b.WriteString(fmt.Sprintf("%d,", p)) + } + b.WriteString("}},\n") + b.WriteString("},\n") + // CaptureInfo + b.WriteString("ci: gopacket.CaptureInfo{\n") + ts := packet.Metadata().CaptureInfo.Timestamp + b.WriteString(fmt.Sprintf(" Timestamp: time.Unix(%d,%d),\n", ts.Unix(), ts.Nanosecond())) + b.WriteString("},\n") + // Struct + b.WriteString("},\n") + fmt.Print(b.String()) + } + + } + fmt.Println("})") + + fmt.Fprintf(os.Stderr, "Total: %d, TCP: %d, non-TCP: %d\n", count, pktTcp, pktNonTcp) +} diff --git a/vendor/github.com/google/gopacket/reassembly/memory.go b/vendor/github.com/google/gopacket/reassembly/memory.go new file mode 100644 index 0000000..c1b2ae7 --- /dev/null +++ b/vendor/github.com/google/gopacket/reassembly/memory.go @@ -0,0 +1,254 @@ +// 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 reassembly + +import ( + "flag" + "log" + "sync" + "time" + + "github.com/google/gopacket/layers" +) + +var memLog = flag.Bool("assembly_memuse_log", defaultDebug, "If true, the github.com/google/gopacket/reassembly library will log information regarding its memory use every once in a while.") + +/* + * pageCache + */ +// pageCache is a concurrency-unsafe store of page objects we use to avoid +// memory allocation as much as we can. +type pageCache struct { + free []*page + pcSize int + size, used int + pageRequests int64 + ops int + nextShrink int +} + +const initialAllocSize = 1024 + +func newPageCache() *pageCache { + pc := &pageCache{ + free: make([]*page, 0, initialAllocSize), + pcSize: initialAllocSize, + } + pc.grow() + return pc +} + +// grow exponentially increases the size of our page cache as much as necessary. +func (c *pageCache) grow() { + pages := make([]page, c.pcSize) + c.size += c.pcSize + for i := range pages { + c.free = append(c.free, &pages[i]) + } + if *memLog { + log.Println("PageCache: created", c.pcSize, "new pages, size:", c.size, "cap:", cap(c.free), "len:", len(c.free)) + } + // control next shrink attempt + c.nextShrink = c.pcSize + c.ops = 0 + // prepare for next alloc + c.pcSize *= 2 +} + +// Remove references to unused pages to let GC collect them +// Note: memory used by c.free itself it not collected. +func (c *pageCache) tryShrink() { + var min = c.pcSize / 2 + if min < initialAllocSize { + min = initialAllocSize + } + if len(c.free) <= min { + return + } + for i := range c.free[min:] { + c.free[min+i] = nil + } + c.size -= len(c.free) - min + c.free = c.free[:min] + c.pcSize = min +} + +// next returns a clean, ready-to-use page object. +func (c *pageCache) next(ts time.Time) (p *page) { + if *memLog { + c.pageRequests++ + if c.pageRequests&0xFFFF == 0 { + log.Println("PageCache:", c.pageRequests, "requested,", c.used, "used,", len(c.free), "free") + } + } + if len(c.free) == 0 { + c.grow() + } + i := len(c.free) - 1 + p, c.free = c.free[i], c.free[:i] + p.seen = ts + p.bytes = p.buf[:0] + c.used++ + if *memLog { + log.Printf("allocator returns %s\n", p) + } + c.ops++ + if c.ops > c.nextShrink { + c.ops = 0 + c.tryShrink() + } + + return p +} + +// replace replaces a page into the pageCache. +func (c *pageCache) replace(p *page) { + c.used-- + if *memLog { + log.Printf("replacing %s\n", p) + } + p.prev = nil + p.next = nil + c.free = append(c.free, p) +} + +/* + * StreamPool + */ + +// StreamPool stores all streams created by Assemblers, allowing multiple +// assemblers to work together on stream processing while enforcing the fact +// that a single stream receives its data serially. It is safe +// for concurrency, usable by multiple Assemblers at once. +// +// StreamPool handles the creation and storage of Stream objects used by one or +// more Assembler objects. When a new TCP stream is found by an Assembler, it +// creates an associated Stream by calling its StreamFactory's New method. +// Thereafter (until the stream is closed), that Stream object will receive +// assembled TCP data via Assembler's calls to the stream's Reassembled +// function. +// +// Like the Assembler, StreamPool attempts to minimize allocation. Unlike the +// Assembler, though, it does have to do some locking to make sure that the +// connection objects it stores are accessible to multiple Assemblers. +type StreamPool struct { + conns map[key]*connection + users int + mu sync.RWMutex + factory StreamFactory + free []*connection + all [][]connection + nextAlloc int + newConnectionCount int64 +} + +func (p *StreamPool) grow() { + conns := make([]connection, p.nextAlloc) + p.all = append(p.all, conns) + for i := range conns { + p.free = append(p.free, &conns[i]) + } + if *memLog { + log.Println("StreamPool: created", p.nextAlloc, "new connections") + } + p.nextAlloc *= 2 +} + +// Dump logs all connections +func (p *StreamPool) Dump() { + p.mu.Lock() + defer p.mu.Unlock() + log.Printf("Remaining %d connections: ", len(p.conns)) + for _, conn := range p.conns { + log.Printf("%v %s", conn.key, conn) + } +} + +func (p *StreamPool) remove(conn *connection) { + p.mu.Lock() + if _, ok := p.conns[conn.key]; ok { + delete(p.conns, conn.key) + p.free = append(p.free, conn) + } + p.mu.Unlock() +} + +// NewStreamPool creates a new connection pool. Streams will +// be created as necessary using the passed-in StreamFactory. +func NewStreamPool(factory StreamFactory) *StreamPool { + return &StreamPool{ + conns: make(map[key]*connection, initialAllocSize), + free: make([]*connection, 0, initialAllocSize), + factory: factory, + nextAlloc: initialAllocSize, + } +} + +func (p *StreamPool) connections() []*connection { + p.mu.RLock() + conns := make([]*connection, 0, len(p.conns)) + for _, conn := range p.conns { + conns = append(conns, conn) + } + p.mu.RUnlock() + return conns +} + +func (p *StreamPool) newConnection(k key, s Stream, ts time.Time) (c *connection, h *halfconnection, r *halfconnection) { + if *memLog { + p.newConnectionCount++ + if p.newConnectionCount&0x7FFF == 0 { + log.Println("StreamPool:", p.newConnectionCount, "requests,", len(p.conns), "used,", len(p.free), "free") + } + } + if len(p.free) == 0 { + p.grow() + } + index := len(p.free) - 1 + c, p.free = p.free[index], p.free[:index] + c.reset(k, s, ts) + return c, &c.c2s, &c.s2c +} + +func (p *StreamPool) getHalf(k key) (*connection, *halfconnection, *halfconnection) { + conn := p.conns[k] + if conn != nil { + return conn, &conn.c2s, &conn.s2c + } + rk := k.Reverse() + conn = p.conns[rk] + if conn != nil { + return conn, &conn.s2c, &conn.c2s + } + return nil, nil, nil +} + +// getConnection returns a connection. If end is true and a connection +// does not already exist, returns nil. This allows us to check for a +// connection without actually creating one if it doesn't already exist. +func (p *StreamPool) getConnection(k key, end bool, ts time.Time, tcp *layers.TCP, ac AssemblerContext) (*connection, *halfconnection, *halfconnection) { + p.mu.RLock() + conn, half, rev := p.getHalf(k) + p.mu.RUnlock() + if end || conn != nil { + return conn, half, rev + } + s := p.factory.New(k[0], k[1], tcp, ac) + p.mu.Lock() + defer p.mu.Unlock() + conn, half, rev = p.newConnection(k, s, ts) + conn2, half2, rev2 := p.getHalf(k) + if conn2 != nil { + if conn2.key != k { + panic("FIXME: other dir added in the meantime...") + } + // FIXME: delete s ? + return conn2, half2, rev2 + } + p.conns[k] = conn + return conn, half, rev +} diff --git a/vendor/github.com/google/gopacket/reassembly/tcpassembly.go b/vendor/github.com/google/gopacket/reassembly/tcpassembly.go new file mode 100644 index 0000000..bdf0deb --- /dev/null +++ b/vendor/github.com/google/gopacket/reassembly/tcpassembly.go @@ -0,0 +1,1311 @@ +// 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 reassembly provides TCP stream re-assembly. +// +// The reassembly package implements uni-directional TCP reassembly, for use in +// packet-sniffing applications. The caller reads packets off the wire, then +// presents them to an Assembler in the form of gopacket layers.TCP packets +// (github.com/google/gopacket, github.com/google/gopacket/layers). +// +// The Assembler uses a user-supplied +// StreamFactory to create a user-defined Stream interface, then passes packet +// data in stream order to that object. A concurrency-safe StreamPool keeps +// track of all current Streams being reassembled, so multiple Assemblers may +// run at once to assemble packets while taking advantage of multiple cores. +// +// TODO: Add simplest example +package reassembly + +import ( + "encoding/hex" + "flag" + "fmt" + "log" + "sync" + "time" + + "github.com/google/gopacket" + "github.com/google/gopacket/layers" +) + +// TODO: +// - push to Stream on Ack +// - implement chunked (cheap) reads and Reader() interface +// - better organize file: split files: 'mem', 'misc' (seq + flow) + +var defaultDebug = false + +var debugLog = flag.Bool("assembly_debug_log", defaultDebug, "If true, the github.com/google/gopacket/reassembly library will log verbose debugging information (at least one line per packet)") + +const invalidSequence = -1 +const uint32Max = 0xFFFFFFFF + +// Sequence is a TCP sequence number. It provides a few convenience functions +// for handling TCP wrap-around. The sequence should always be in the range +// [0,0xFFFFFFFF]... its other bits are simply used in wrap-around calculations +// and should never be set. +type Sequence int64 + +// Difference defines an ordering for comparing TCP sequences that's safe for +// roll-overs. It returns: +// > 0 : if t comes after s +// < 0 : if t comes before s +// 0 : if t == s +// The number returned is the sequence difference, so 4.Difference(8) will +// return 4. +// +// It handles rollovers by considering any sequence in the first quarter of the +// uint32 space to be after any sequence in the last quarter of that space, thus +// wrapping the uint32 space. +func (s Sequence) Difference(t Sequence) int { + if s > uint32Max-uint32Max/4 && t < uint32Max/4 { + t += uint32Max + } else if t > uint32Max-uint32Max/4 && s < uint32Max/4 { + s += uint32Max + } + return int(t - s) +} + +// Add adds an integer to a sequence and returns the resulting sequence. +func (s Sequence) Add(t int) Sequence { + return (s + Sequence(t)) & uint32Max +} + +// TCPAssemblyStats provides some figures for a ScatterGather +type TCPAssemblyStats struct { + // For this ScatterGather + Chunks int + Packets int + // For the half connection, since last call to ReassembledSG() + QueuedBytes int + QueuedPackets int + OverlapBytes int + OverlapPackets int +} + +// ScatterGather is used to pass reassembled data and metadata of reassembled +// packets to a Stream via ReassembledSG +type ScatterGather interface { + // Returns the length of available bytes and saved bytes + Lengths() (int, int) + // Returns the bytes up to length (shall be <= available bytes) + Fetch(length int) []byte + // Tell to keep from offset + KeepFrom(offset int) + // Return CaptureInfo of packet corresponding to given offset + CaptureInfo(offset int) gopacket.CaptureInfo + // Return some info about the reassembled chunks + Info() (direction TCPFlowDirection, start bool, end bool, skip int) + // Return some stats regarding the state of the stream + Stats() TCPAssemblyStats +} + +// byteContainer is either a page or a livePacket +type byteContainer interface { + getBytes() []byte + length() int + convertToPages(*pageCache, int, AssemblerContext) (*page, *page, int) + captureInfo() gopacket.CaptureInfo + assemblerContext() AssemblerContext + release(*pageCache) int + isStart() bool + isEnd() bool + getSeq() Sequence + isPacket() bool +} + +// Implements a ScatterGather +type reassemblyObject struct { + all []byteContainer + Skip int + Direction TCPFlowDirection + saved int + toKeep int + // stats + queuedBytes int + queuedPackets int + overlapBytes int + overlapPackets int +} + +func (rl *reassemblyObject) Lengths() (int, int) { + l := 0 + for _, r := range rl.all { + l += r.length() + } + return l, rl.saved +} + +func (rl *reassemblyObject) Fetch(l int) []byte { + if l <= rl.all[0].length() { + return rl.all[0].getBytes()[:l] + } + bytes := make([]byte, 0, l) + for _, bc := range rl.all { + bytes = append(bytes, bc.getBytes()...) + } + return bytes[:l] +} + +func (rl *reassemblyObject) KeepFrom(offset int) { + rl.toKeep = offset +} + +func (rl *reassemblyObject) CaptureInfo(offset int) gopacket.CaptureInfo { + current := 0 + for _, r := range rl.all { + if current >= offset { + return r.captureInfo() + } + current += r.length() + } + // Invalid offset + return gopacket.CaptureInfo{} +} + +func (rl *reassemblyObject) Info() (TCPFlowDirection, bool, bool, int) { + return rl.Direction, rl.all[0].isStart(), rl.all[len(rl.all)-1].isEnd(), rl.Skip +} + +func (rl *reassemblyObject) Stats() TCPAssemblyStats { + packets := int(0) + for _, r := range rl.all { + if r.isPacket() { + packets++ + } + } + return TCPAssemblyStats{ + Chunks: len(rl.all), + Packets: packets, + QueuedBytes: rl.queuedBytes, + QueuedPackets: rl.queuedPackets, + OverlapBytes: rl.overlapBytes, + OverlapPackets: rl.overlapPackets, + } +} + +const pageBytes = 1900 + +// TCPFlowDirection distinguish the two half-connections directions. +// +// TCPDirClientToServer is assigned to half-connection for the first received +// packet, hence might be wrong if packets are not received in order. +// It's up to the caller (e.g. in Accept()) to decide if the direction should +// be interpretted differently. +type TCPFlowDirection bool + +// Value are not really useful +const ( + TCPDirClientToServer TCPFlowDirection = false + TCPDirServerToClient TCPFlowDirection = true +) + +func (dir TCPFlowDirection) String() string { + switch dir { + case TCPDirClientToServer: + return "client->server" + case TCPDirServerToClient: + return "server->client" + } + return "" +} + +// Reverse returns the reversed direction +func (dir TCPFlowDirection) Reverse() TCPFlowDirection { + return !dir +} + +/* page: implements a byteContainer */ + +// page is used to store TCP data we're not ready for yet (out-of-order +// packets). Unused pages are stored in and returned from a pageCache, which +// avoids memory allocation. Used pages are stored in a doubly-linked list in +// a connection. +type page struct { + bytes []byte + seq Sequence + prev, next *page + buf [pageBytes]byte + ac AssemblerContext // only set for the first page of a packet + seen time.Time + start, end bool +} + +func (p *page) getBytes() []byte { + return p.bytes +} +func (p *page) captureInfo() gopacket.CaptureInfo { + return p.ac.GetCaptureInfo() +} +func (p *page) assemblerContext() AssemblerContext { + return p.ac +} +func (p *page) convertToPages(pc *pageCache, skip int, ac AssemblerContext) (*page, *page, int) { + if skip != 0 { + p.bytes = p.bytes[skip:] + p.seq = p.seq.Add(skip) + } + p.prev, p.next = nil, nil + return p, p, 1 +} +func (p *page) length() int { + return len(p.bytes) +} +func (p *page) release(pc *pageCache) int { + pc.replace(p) + return 1 +} +func (p *page) isStart() bool { + return p.start +} +func (p *page) isEnd() bool { + return p.end +} +func (p *page) getSeq() Sequence { + return p.seq +} +func (p *page) isPacket() bool { + return p.ac != nil +} +func (p *page) String() string { + return fmt.Sprintf("page@%p{seq: %v, bytes:%d, -> nextSeq:%v} (prev:%p, next:%p)", p, p.seq, len(p.bytes), p.seq+Sequence(len(p.bytes)), p.prev, p.next) +} + +/* livePacket: implements a byteContainer */ +type livePacket struct { + bytes []byte + start bool + end bool + ci gopacket.CaptureInfo + ac AssemblerContext + seq Sequence +} + +func (lp *livePacket) getBytes() []byte { + return lp.bytes +} +func (lp *livePacket) captureInfo() gopacket.CaptureInfo { + return lp.ci +} +func (lp *livePacket) assemblerContext() AssemblerContext { + return lp.ac +} +func (lp *livePacket) length() int { + return len(lp.bytes) +} +func (lp *livePacket) isStart() bool { + return lp.start +} +func (lp *livePacket) isEnd() bool { + return lp.end +} +func (lp *livePacket) getSeq() Sequence { + return lp.seq +} +func (lp *livePacket) isPacket() bool { + return true +} + +// Creates a page (or set of pages) from a TCP packet: returns the first and last +// page in its doubly-linked list of new pages. +func (lp *livePacket) convertToPages(pc *pageCache, skip int, ac AssemblerContext) (*page, *page, int) { + ts := lp.ci.Timestamp + first := pc.next(ts) + current := first + current.prev = nil + first.ac = ac + numPages := 1 + seq, bytes := lp.seq.Add(skip), lp.bytes[skip:] + for { + length := min(len(bytes), pageBytes) + current.bytes = current.buf[:length] + copy(current.bytes, bytes) + current.seq = seq + bytes = bytes[length:] + if len(bytes) == 0 { + current.end = lp.isEnd() + current.next = nil + break + } + seq = seq.Add(length) + current.next = pc.next(ts) + current.next.prev = current + current = current.next + current.ac = nil + numPages++ + } + return first, current, numPages +} +func (lp *livePacket) estimateNumberOfPages() int { + return (len(lp.bytes) + pageBytes + 1) / pageBytes +} + +func (lp *livePacket) release(*pageCache) int { + return 0 +} + +// Stream is implemented by the caller to handle incoming reassembled +// TCP data. Callers create a StreamFactory, then StreamPool uses +// it to create a new Stream for every TCP stream. +// +// assembly will, in order: +// 1) Create the stream via StreamFactory.New +// 2) Call ReassembledSG 0 or more times, passing in reassembled TCP data in order +// 3) Call ReassemblyComplete one time, after which the stream is dereferenced by assembly. +type Stream interface { + // Tell whether the TCP packet should be accepted, start could be modified to force a start even if no SYN have been seen + Accept(tcp *layers.TCP, ci gopacket.CaptureInfo, dir TCPFlowDirection, ackSeq Sequence, start *bool, ac AssemblerContext) bool + + // ReassembledSG is called zero or more times. + // ScatterGather is reused after each Reassembled call, + // so it's important to copy anything you need out of it, + // especially bytes (or use KeepFrom()) + ReassembledSG(sg ScatterGather, ac AssemblerContext) + + // ReassemblyComplete is called when assembly decides there is + // no more data for this Stream, either because a FIN or RST packet + // was seen, or because the stream has timed out without any new + // packet data (due to a call to FlushCloseOlderThan). + // It should return true if the connection should be removed from the pool + // It can return false if it want to see subsequent packets with Accept(), e.g. to + // see FIN-ACK, for deeper state-machine analysis. + ReassemblyComplete(ac AssemblerContext) bool +} + +// StreamFactory is used by assembly to create a new stream for each +// new TCP session. +type StreamFactory interface { + // New should return a new stream for the given TCP key. + New(netFlow, tcpFlow gopacket.Flow, tcp *layers.TCP, ac AssemblerContext) Stream +} + +type key [2]gopacket.Flow + +func (k *key) String() string { + return fmt.Sprintf("%s:%s", k[0], k[1]) +} + +func (k *key) Reverse() key { + return key{ + k[0].Reverse(), + k[1].Reverse(), + } +} + +const assemblerReturnValueInitialSize = 16 + +/* one-way connection, i.e. halfconnection */ +type halfconnection struct { + dir TCPFlowDirection + pages int // Number of pages used (both in first/last and saved) + saved *page // Doubly-linked list of in-order pages (seq < nextSeq) already given to Stream who told us to keep + first, last *page // Doubly-linked list of out-of-order pages (seq > nextSeq) + nextSeq Sequence // sequence number of in-order received bytes + ackSeq Sequence + created, lastSeen time.Time + stream Stream + closed bool + // for stats + queuedBytes int + queuedPackets int + overlapBytes int + overlapPackets int +} + +func (half *halfconnection) String() string { + closed := "" + if half.closed { + closed = "closed " + } + return fmt.Sprintf("%screated:%v, last:%v", closed, half.created, half.lastSeen) +} + +// Dump returns a string (crypticly) describing the halfconnction +func (half *halfconnection) Dump() string { + s := fmt.Sprintf("pages: %d\n"+ + "nextSeq: %d\n"+ + "ackSeq: %d\n"+ + "Seen : %s\n"+ + "dir: %s\n", half.pages, half.nextSeq, half.ackSeq, half.lastSeen, half.dir) + nb := 0 + for p := half.first; p != nil; p = p.next { + s += fmt.Sprintf(" Page[%d] %s len: %d\n", nb, p, len(p.bytes)) + nb++ + } + return s +} + +/* Bi-directionnal connection */ + +type connection struct { + key key // client->server + c2s, s2c halfconnection + mu sync.Mutex +} + +func (c *connection) reset(k key, s Stream, ts time.Time) { + c.key = k + base := halfconnection{ + nextSeq: invalidSequence, + ackSeq: invalidSequence, + created: ts, + lastSeen: ts, + stream: s, + } + c.c2s, c.s2c = base, base + c.c2s.dir, c.s2c.dir = TCPDirClientToServer, TCPDirServerToClient +} + +func (c *connection) String() string { + return fmt.Sprintf("c2s: %s, s2c: %s", &c.c2s, &c.s2c) +} + +/* + * Assembler + */ + +// DefaultAssemblerOptions provides default options for an assembler. +// These options are used by default when calling NewAssembler, so if +// modified before a NewAssembler call they'll affect the resulting Assembler. +// +// Note that the default options can result in ever-increasing memory usage +// unless one of the Flush* methods is called on a regular basis. +var DefaultAssemblerOptions = AssemblerOptions{ + MaxBufferedPagesPerConnection: 0, // unlimited + MaxBufferedPagesTotal: 0, // unlimited +} + +// AssemblerOptions controls the behavior of each assembler. Modify the +// options of each assembler you create to change their behavior. +type AssemblerOptions struct { + // MaxBufferedPagesTotal is an upper limit on the total number of pages to + // buffer while waiting for out-of-order packets. Once this limit is + // reached, the assembler will degrade to flushing every connection it + // gets a packet for. If <= 0, this is ignored. + MaxBufferedPagesTotal int + // MaxBufferedPagesPerConnection is an upper limit on the number of pages + // buffered for a single connection. Should this limit be reached for a + // particular connection, the smallest sequence number will be flushed, along + // with any contiguous data. If <= 0, this is ignored. + MaxBufferedPagesPerConnection int +} + +// Assembler handles reassembling TCP streams. It is not safe for +// concurrency... after passing a packet in via the Assemble call, the caller +// must wait for that call to return before calling Assemble again. Callers can +// get around this by creating multiple assemblers that share a StreamPool. In +// that case, each individual stream will still be handled serially (each stream +// has an individual mutex associated with it), however multiple assemblers can +// assemble different connections concurrently. +// +// The Assembler provides (hopefully) fast TCP stream re-assembly for sniffing +// applications written in Go. The Assembler uses the following methods to be +// as fast as possible, to keep packet processing speedy: +// +// Avoids Lock Contention +// +// Assemblers locks connections, but each connection has an individual lock, and +// rarely will two Assemblers be looking at the same connection. Assemblers +// lock the StreamPool when looking up connections, but they use Reader +// locks initially, and only force a write lock if they need to create a new +// connection or close one down. These happen much less frequently than +// individual packet handling. +// +// Each assembler runs in its own goroutine, and the only state shared between +// goroutines is through the StreamPool. Thus all internal Assembler state +// can be handled without any locking. +// +// NOTE: If you can guarantee that packets going to a set of Assemblers will +// contain information on different connections per Assembler (for example, +// they're already hashed by PF_RING hashing or some other hashing mechanism), +// then we recommend you use a seperate StreamPool per Assembler, thus +// avoiding all lock contention. Only when different Assemblers could receive +// packets for the same Stream should a StreamPool be shared between them. +// +// Avoids Memory Copying +// +// In the common case, handling of a single TCP packet should result in zero +// memory allocations. The Assembler will look up the connection, figure out +// that the packet has arrived in order, and immediately pass that packet on to +// the appropriate connection's handling code. Only if a packet arrives out of +// order is its contents copied and stored in memory for later. +// +// Avoids Memory Allocation +// +// Assemblers try very hard to not use memory allocation unless absolutely +// necessary. Packet data for sequential packets is passed directly to streams +// with no copying or allocation. Packet data for out-of-order packets is +// copied into reusable pages, and new pages are only allocated rarely when the +// page cache runs out. Page caches are Assembler-specific, thus not used +// concurrently and requiring no locking. +// +// Internal representations for connection objects are also reused over time. +// Because of this, the most common memory allocation done by the Assembler is +// generally what's done by the caller in StreamFactory.New. If no allocation +// is done there, then very little allocation is done ever, mostly to handle +// large increases in bandwidth or numbers of connections. +// +// TODO: The page caches used by an Assembler will grow to the size necessary +// to handle a workload, and currently will never shrink. This means that +// traffic spikes can result in large memory usage which isn't garbage +// collected when typical traffic levels return. +type Assembler struct { + AssemblerOptions + ret []byteContainer + pc *pageCache + connPool *StreamPool + cacheLP livePacket + cacheSG reassemblyObject + start bool +} + +// NewAssembler creates a new assembler. Pass in the StreamPool +// to use, may be shared across assemblers. +// +// This sets some sane defaults for the assembler options, +// see DefaultAssemblerOptions for details. +func NewAssembler(pool *StreamPool) *Assembler { + pool.mu.Lock() + pool.users++ + pool.mu.Unlock() + return &Assembler{ + ret: make([]byteContainer, assemblerReturnValueInitialSize), + pc: newPageCache(), + connPool: pool, + AssemblerOptions: DefaultAssemblerOptions, + } +} + +// Dump returns a short string describing the page usage of the Assembler +func (a *Assembler) Dump() string { + s := "" + s += fmt.Sprintf("pageCache: used: %d, size: %d, free: %d", a.pc.used, a.pc.size, len(a.pc.free)) + return s +} + +// AssemblerContext provides method to get metadata +type AssemblerContext interface { + GetCaptureInfo() gopacket.CaptureInfo +} + +// Implements AssemblerContext for Assemble() +type assemblerSimpleContext gopacket.CaptureInfo + +func (asc *assemblerSimpleContext) GetCaptureInfo() gopacket.CaptureInfo { + return gopacket.CaptureInfo(*asc) +} + +// Assemble calls AssembleWithContext with the current timestamp, useful for +// packets being read directly off the wire. +func (a *Assembler) Assemble(netFlow gopacket.Flow, t *layers.TCP) { + ctx := assemblerSimpleContext(gopacket.CaptureInfo{Timestamp: time.Now()}) + a.AssembleWithContext(netFlow, t, &ctx) +} + +type assemblerAction struct { + nextSeq Sequence + queue bool +} + +// AssembleWithContext reassembles the given TCP packet into its appropriate +// stream. +// +// The timestamp passed in must be the timestamp the packet was seen. +// For packets read off the wire, time.Now() should be fine. For packets read +// from PCAP files, CaptureInfo.Timestamp should be passed in. This timestamp +// will affect which streams are flushed by a call to FlushCloseOlderThan. +// +// Each AssembleWithContext call results in, in order: +// +// zero or one call to StreamFactory.New, creating a stream +// zero or one call to ReassembledSG on a single stream +// zero or one call to ReassemblyComplete on the same stream +func (a *Assembler) AssembleWithContext(netFlow gopacket.Flow, t *layers.TCP, ac AssemblerContext) { + var conn *connection + var half *halfconnection + var rev *halfconnection + + a.ret = a.ret[:0] + key := key{netFlow, t.TransportFlow()} + ci := ac.GetCaptureInfo() + timestamp := ci.Timestamp + + conn, half, rev = a.connPool.getConnection(key, false, timestamp, t, ac) + if conn == nil { + if *debugLog { + log.Printf("%v got empty packet on otherwise empty connection", key) + } + return + } + conn.mu.Lock() + defer conn.mu.Unlock() + if half.lastSeen.Before(timestamp) { + half.lastSeen = timestamp + } + a.start = half.nextSeq == invalidSequence && t.SYN + if !half.stream.Accept(t, ci, half.dir, rev.ackSeq, &a.start, ac) { + if *debugLog { + log.Printf("Ignoring packet") + } + return + } + if half.closed { + // this way is closed + return + } + + seq, ack, bytes := Sequence(t.Seq), Sequence(t.Ack), t.Payload + if t.ACK { + half.ackSeq = ack + } + // TODO: push when Ack is seen ?? + action := assemblerAction{ + nextSeq: Sequence(invalidSequence), + queue: true, + } + a.dump("AssembleWithContext()", half) + if half.nextSeq == invalidSequence { + if t.SYN { + if *debugLog { + log.Printf("%v saw first SYN packet, returning immediately, seq=%v", key, seq) + } + seq = seq.Add(1) + half.nextSeq = seq + action.queue = false + } else if a.start { + if *debugLog { + log.Printf("%v start forced", key) + } + half.nextSeq = seq + action.queue = false + } else { + if *debugLog { + log.Printf("%v waiting for start, storing into connection", key) + } + } + } else { + diff := half.nextSeq.Difference(seq) + if diff > 0 { + if *debugLog { + log.Printf("%v gap in sequence numbers (%v, %v) diff %v, storing into connection", key, half.nextSeq, seq, diff) + } + } else { + if *debugLog { + log.Printf("%v found contiguous data (%v, %v), returning immediately: len:%d", key, seq, half.nextSeq, len(bytes)) + } + action.queue = false + } + } + + action = a.handleBytes(bytes, seq, half, ci, t.SYN, t.RST || t.FIN, action, ac) + if len(a.ret) > 0 { + action.nextSeq = a.sendToConnection(conn, half, ac) + } + if action.nextSeq != invalidSequence { + half.nextSeq = action.nextSeq + if t.FIN { + half.nextSeq = half.nextSeq.Add(1) + } + } + if *debugLog { + log.Printf("%v nextSeq:%d", key, half.nextSeq) + } +} + +// Overlap strategies: +// - new packet overlaps with sent packets: +// 1) discard new overlapping part +// 2) overwrite old overlapped (TODO) +// - new packet overlaps existing queued packets: +// a) consider "age" by timestamp (TODO) +// b) consider "age" by being present +// Then +// 1) discard new overlapping part +// 2) overwrite queued part + +func (a *Assembler) checkOverlap(half *halfconnection, queue bool, ac AssemblerContext) { + var next *page + cur := half.last + bytes := a.cacheLP.bytes + start := a.cacheLP.seq + end := start.Add(len(bytes)) + + a.dump("before checkOverlap", half) + + // [s6 : e6] + // [s1:e1][s2:e2] -- [s3:e3] -- [s4:e4][s5:e5] + // [s <--ds-- : --de--> e] + for cur != nil { + + if *debugLog { + log.Printf("cur = %p (%s)\n", cur, cur) + } + + // end < cur.start: continue (5) + if end.Difference(cur.seq) > 0 { + if *debugLog { + log.Printf("case 5\n") + } + next = cur + cur = cur.prev + continue + } + + curEnd := cur.seq.Add(len(cur.bytes)) + // start > cur.end: stop (1) + if start.Difference(curEnd) <= 0 { + if *debugLog { + log.Printf("case 1\n") + } + break + } + + diffStart := start.Difference(cur.seq) + diffEnd := end.Difference(curEnd) + + // end > cur.end && start < cur.start: drop (3) + if diffEnd <= 0 && diffStart >= 0 { + if *debugLog { + log.Printf("case 3\n") + } + if cur.isPacket() { + half.overlapPackets++ + } + half.overlapBytes += len(cur.bytes) + // update links + if cur.prev != nil { + cur.prev.next = cur.next + } else { + half.first = cur.next + } + if cur.next != nil { + cur.next.prev = cur.prev + } else { + half.last = cur.prev + } + tmp := cur.prev + half.pages -= cur.release(a.pc) + cur = tmp + continue + } + + // end > cur.end && start < cur.end: drop cur's end (2) + if diffEnd < 0 && start.Difference(curEnd) > 0 { + if *debugLog { + log.Printf("case 2\n") + } + cur.bytes = cur.bytes[:-start.Difference(cur.seq)] + break + } else + + // start < cur.start && end > cur.start: drop cur's start (4) + if diffStart > 0 && end.Difference(cur.seq) < 0 { + if *debugLog { + log.Printf("case 4\n") + } + cur.bytes = cur.bytes[-end.Difference(cur.seq):] + cur.seq = cur.seq.Add(-end.Difference(cur.seq)) + next = cur + } else + + // end < cur.end && start > cur.start: replace bytes inside cur (6) + if diffEnd > 0 && diffStart < 0 { + if *debugLog { + log.Printf("case 6\n") + } + copy(cur.bytes[-diffStart:-diffStart+len(bytes)], bytes) + bytes = bytes[:0] + } else { + if *debugLog { + log.Printf("no overlap\n") + } + next = cur + } + cur = cur.prev + } + + // Split bytes into pages, and insert in queue + a.cacheLP.bytes = bytes + a.cacheLP.seq = start + if len(bytes) > 0 && queue { + p, p2, numPages := a.cacheLP.convertToPages(a.pc, 0, ac) + half.queuedPackets++ + half.queuedBytes += len(bytes) + half.pages += numPages + if cur != nil { + if *debugLog { + log.Printf("adding %s after %s", p, cur) + } + cur.next = p + p.prev = cur + } else { + if *debugLog { + log.Printf("adding %s as first", p) + } + half.first = p + } + if next != nil { + if *debugLog { + log.Printf("setting %s as next of new %s", next, p2) + } + p2.next = next + next.prev = p2 + } else { + if *debugLog { + log.Printf("setting %s as last", p2) + } + half.last = p2 + } + } + a.dump("After checkOverlap", half) +} + +// Warning: this is a low-level dumper, i.e. a.ret or a.cacheSG might +// be strange, but it could be ok. +func (a *Assembler) dump(text string, half *halfconnection) { + if !*debugLog { + return + } + log.Printf("%s: dump\n", text) + if half != nil { + p := half.first + if p == nil { + log.Printf(" * half.first = %p, no chunks queued\n", p) + } else { + s := 0 + nb := 0 + log.Printf(" * half.first = %p, queued chunks:", p) + for p != nil { + log.Printf("\t%s bytes:%s\n", p, hex.EncodeToString(p.bytes)) + s += len(p.bytes) + nb++ + p = p.next + } + log.Printf("\t%d chunks for %d bytes", nb, s) + } + log.Printf(" * half.last = %p\n", half.last) + log.Printf(" * half.saved = %p\n", half.saved) + p = half.saved + for p != nil { + log.Printf("\tseq:%d %s bytes:%s\n", p.getSeq(), p, hex.EncodeToString(p.bytes)) + p = p.next + } + } + log.Printf(" * a.ret\n") + for i, r := range a.ret { + log.Printf("\t%d: %s b:%s\n", i, r.captureInfo(), hex.EncodeToString(r.getBytes())) + } + log.Printf(" * a.cacheSG.all\n") + for i, r := range a.cacheSG.all { + log.Printf("\t%d: %s b:%s\n", i, r.captureInfo(), hex.EncodeToString(r.getBytes())) + } +} + +func (a *Assembler) overlapExisting(half *halfconnection, start, end Sequence, bytes []byte) ([]byte, Sequence) { + if half.nextSeq == invalidSequence { + // no start yet + return bytes, start + } + diff := start.Difference(half.nextSeq) + if diff == 0 { + return bytes, start + } + s := 0 + e := len(bytes) + // TODO: depending on strategy, we might want to shrink half.saved if possible + if e != 0 { + if *debugLog { + log.Printf("Overlap detected: ignoring current packet's first %d bytes", diff) + } + half.overlapPackets++ + half.overlapBytes += diff + } + start = start.Add(diff) + s += diff + if s >= e { + // Completely included in sent + s = e + } + bytes = bytes[s:] + e -= diff + return bytes, start +} + +// Prepare send or queue +func (a *Assembler) handleBytes(bytes []byte, seq Sequence, half *halfconnection, ci gopacket.CaptureInfo, start bool, end bool, action assemblerAction, ac AssemblerContext) assemblerAction { + a.cacheLP.bytes = bytes + a.cacheLP.start = start + a.cacheLP.end = end + a.cacheLP.seq = seq + a.cacheLP.ci = ci + a.cacheLP.ac = ac + + if action.queue { + a.checkOverlap(half, true, ac) + if (a.MaxBufferedPagesPerConnection > 0 && half.pages >= a.MaxBufferedPagesPerConnection) || + (a.MaxBufferedPagesTotal > 0 && a.pc.used >= a.MaxBufferedPagesTotal) { + if *debugLog { + log.Printf("hit max buffer size: %+v, %v, %v", a.AssemblerOptions, half.pages, a.pc.used) + } + action.queue = false + a.addNextFromConn(half) + } + a.dump("handleBytes after queue", half) + } else { + a.cacheLP.bytes, a.cacheLP.seq = a.overlapExisting(half, seq, seq.Add(len(bytes)), a.cacheLP.bytes) + a.checkOverlap(half, false, ac) + if len(a.cacheLP.bytes) != 0 || end || start { + a.ret = append(a.ret, &a.cacheLP) + } + a.dump("handleBytes after no queue", half) + } + return action +} + +func (a *Assembler) setStatsToSG(half *halfconnection) { + a.cacheSG.queuedBytes = half.queuedBytes + half.queuedBytes = 0 + a.cacheSG.queuedPackets = half.queuedPackets + half.queuedPackets = 0 + a.cacheSG.overlapBytes = half.overlapBytes + half.overlapBytes = 0 + a.cacheSG.overlapPackets = half.overlapPackets + half.overlapPackets = 0 +} + +// Build the ScatterGather object, i.e. prepend saved bytes and +// append continuous bytes. +func (a *Assembler) buildSG(half *halfconnection) (bool, Sequence) { + // find if there are skipped bytes + skip := -1 + if half.nextSeq != invalidSequence { + skip = half.nextSeq.Difference(a.ret[0].getSeq()) + } + last := a.ret[0].getSeq().Add(a.ret[0].length()) + // Prepend saved bytes + saved := a.addPending(half, a.ret[0].getSeq()) + // Append continuous bytes + nextSeq := a.addContiguous(half, last) + a.cacheSG.all = a.ret + a.cacheSG.Direction = half.dir + a.cacheSG.Skip = skip + a.cacheSG.saved = saved + a.cacheSG.toKeep = -1 + a.setStatsToSG(half) + a.dump("after buildSG", half) + return a.ret[len(a.ret)-1].isEnd(), nextSeq +} + +func (a *Assembler) cleanSG(half *halfconnection, ac AssemblerContext) { + cur := 0 + ndx := 0 + skip := 0 + + a.dump("cleanSG(start)", half) + + var r byteContainer + // Find first page to keep + if a.cacheSG.toKeep < 0 { + ndx = len(a.cacheSG.all) + } else { + skip = a.cacheSG.toKeep + found := false + for ndx, r = range a.cacheSG.all { + if a.cacheSG.toKeep < cur+r.length() { + found = true + break + } + cur += r.length() + if skip >= r.length() { + skip -= r.length() + } + } + if !found { + ndx++ + } + } + // Release consumed pages + for _, r := range a.cacheSG.all[:ndx] { + if r == half.saved { + if half.saved.next != nil { + half.saved.next.prev = nil + } + half.saved = half.saved.next + } else if r == half.first { + if half.first.next != nil { + half.first.next.prev = nil + } + if half.first == half.last { + half.first, half.last = nil, nil + } else { + half.first = half.first.next + } + } + half.pages -= r.release(a.pc) + } + a.dump("after consumed release", half) + // Keep un-consumed pages + nbKept := 0 + half.saved = nil + var saved *page + for _, r := range a.cacheSG.all[ndx:] { + first, last, nb := r.convertToPages(a.pc, skip, ac) + if half.saved == nil { + half.saved = first + } else { + saved.next = first + first.prev = saved + } + saved = last + nbKept += nb + } + if *debugLog { + log.Printf("Remaining %d chunks in SG\n", nbKept) + log.Printf("%s\n", a.Dump()) + a.dump("after cleanSG()", half) + } +} + +// sendToConnection sends the current values in a.ret to the connection, closing +// the connection if the last thing sent had End set. +func (a *Assembler) sendToConnection(conn *connection, half *halfconnection, ac AssemblerContext) Sequence { + if *debugLog { + log.Printf("sendToConnection\n") + } + end, nextSeq := a.buildSG(half) + half.stream.ReassembledSG(&a.cacheSG, ac) + a.cleanSG(half, ac) + if end { + a.closeHalfConnection(conn, half) + } + if *debugLog { + log.Printf("after sendToConnection: nextSeq: %d\n", nextSeq) + } + return nextSeq +} + +// +func (a *Assembler) addPending(half *halfconnection, firstSeq Sequence) int { + if half.saved == nil { + return 0 + } + s := 0 + ret := []byteContainer{} + for p := half.saved; p != nil; p = p.next { + if *debugLog { + log.Printf("adding pending @%p %s (%s)\n", p, p, hex.EncodeToString(p.bytes)) + } + ret = append(ret, p) + s += len(p.bytes) + } + if half.saved.seq.Add(s) != firstSeq { + // non-continuous saved: drop them + var next *page + for p := half.saved; p != nil; p = next { + next = p.next + p.release(a.pc) + } + half.saved = nil + ret = []byteContainer{} + s = 0 + } + + a.ret = append(ret, a.ret...) + return s +} + +// addContiguous adds contiguous byte-sets to a connection. +func (a *Assembler) addContiguous(half *halfconnection, lastSeq Sequence) Sequence { + page := half.first + if page == nil { + if *debugLog { + log.Printf("addContiguous(%d): no pages\n", lastSeq) + } + return lastSeq + } + if lastSeq == invalidSequence { + lastSeq = page.seq + } + for page != nil && lastSeq.Difference(page.seq) == 0 { + if *debugLog { + log.Printf("addContiguous: lastSeq: %d, first.seq=%d, page.seq=%d\n", half.nextSeq, half.first.seq, page.seq) + } + lastSeq = lastSeq.Add(len(page.bytes)) + a.ret = append(a.ret, page) + half.first = page.next + if half.first == nil { + half.last = nil + } + if page.next != nil { + page.next.prev = nil + } + page = page.next + } + return lastSeq +} + +// skipFlush skips the first set of bytes we're waiting for and returns the +// first set of bytes we have. If we have no bytes saved, it closes the +// connection. +func (a *Assembler) skipFlush(conn *connection, half *halfconnection) { + if *debugLog { + log.Printf("skipFlush %v\n", half.nextSeq) + } + // Well, it's embarassing it there is still something in half.saved + // FIXME: change API to give back saved + new/no packets + if half.first == nil { + a.closeHalfConnection(conn, half) + return + } + a.ret = a.ret[:0] + a.addNextFromConn(half) + nextSeq := a.sendToConnection(conn, half, a.ret[0].assemblerContext()) + if nextSeq != invalidSequence { + half.nextSeq = nextSeq + } +} + +func (a *Assembler) closeHalfConnection(conn *connection, half *halfconnection) { + if *debugLog { + log.Printf("%v closing", conn) + } + half.closed = true + for p := half.first; p != nil; p = p.next { + // FIXME: it should be already empty + a.pc.replace(p) + half.pages-- + } + if conn.s2c.closed && conn.c2s.closed { + if half.stream.ReassemblyComplete(nil) { //FIXME: which context to pass ? + a.connPool.remove(conn) + } + } +} + +// addNextFromConn pops the first page from a connection off and adds it to the +// return array. +func (a *Assembler) addNextFromConn(conn *halfconnection) { + if conn.first == nil { + return + } + if *debugLog { + log.Printf(" adding from conn (%v, %v) %v (%d)\n", conn.first.seq, conn.nextSeq, conn.nextSeq-conn.first.seq, len(conn.first.bytes)) + } + a.ret = append(a.ret, conn.first) + conn.first = conn.first.next + if conn.first != nil { + conn.first.prev = nil + } else { + conn.last = nil + } +} + +// FlushOptions provide options for flushing connections. +type FlushOptions struct { + T time.Time // If nonzero, only connections with data older than T are flushed + TC time.Time // If nonzero, only connections with data older than TC are closed (if no FIN/RST received) +} + +// FlushWithOptions finds any streams waiting for packets older than +// the given time T, and pushes through the data they have (IE: tells +// them to stop waiting and skip the data they're waiting for). +// +// It also closes streams older than TC (that can be set to zero, to keep +// long-lived stream alive, but to flush data anyway). +// +// Each Stream maintains a list of zero or more sets of bytes it has received +// out-of-order. For example, if it has processed up through sequence number +// 10, it might have bytes [15-20), [20-25), [30,50) in its list. Each set of +// bytes also has the timestamp it was originally viewed. A flush call will +// look at the smallest subsequent set of bytes, in this case [15-20), and if +// its timestamp is older than the passed-in time, it will push it and all +// contiguous byte-sets out to the Stream's Reassembled function. In this case, +// it will push [15-20), but also [20-25), since that's contiguous. It will +// only push [30-50) if its timestamp is also older than the passed-in time, +// otherwise it will wait until the next FlushCloseOlderThan to see if bytes +// [25-30) come in. +// +// Returns the number of connections flushed, and of those, the number closed +// because of the flush. +func (a *Assembler) FlushWithOptions(opt FlushOptions) (flushed, closed int) { + conns := a.connPool.connections() + closes := 0 + flushes := 0 + for _, conn := range conns { + remove := false + conn.mu.Lock() + for _, half := range []*halfconnection{&conn.s2c, &conn.c2s} { + flushed, closed := a.flushClose(conn, half, opt.T, opt.TC) + if flushed { + flushes++ + } + if closed { + closes++ + } + } + if conn.s2c.closed && conn.c2s.closed && conn.s2c.lastSeen.Before(opt.TC) && conn.c2s.lastSeen.Before(opt.TC) { + remove = true + } + conn.mu.Unlock() + if remove { + a.connPool.remove(conn) + } + } + return flushes, closes +} + +// FlushCloseOlderThan flushes and closes streams older than given time +func (a *Assembler) FlushCloseOlderThan(t time.Time) (flushed, closed int) { + return a.FlushWithOptions(FlushOptions{T: t, TC: t}) +} + +func (a *Assembler) flushClose(conn *connection, half *halfconnection, t time.Time, tc time.Time) (bool, bool) { + flushed, closed := false, false + if half.closed { + return flushed, closed + } + for half.first != nil && half.first.seen.Before(t) { + flushed = true + a.skipFlush(conn, half) + if half.closed { + closed = true + } + } + if !half.closed && half.first == nil && half.lastSeen.Before(tc) { + a.closeHalfConnection(conn, half) + closed = true + } + return flushed, closed +} + +// FlushAll flushes all remaining data into all remaining connections and closes +// those connections. It returns the total number of connections flushed/closed +// by the call. +func (a *Assembler) FlushAll() (closed int) { + conns := a.connPool.connections() + closed = len(conns) + for _, conn := range conns { + conn.mu.Lock() + for _, half := range []*halfconnection{&conn.s2c, &conn.c2s} { + for !half.closed { + a.skipFlush(conn, half) + } + if !half.closed { + a.closeHalfConnection(conn, half) + } + } + conn.mu.Unlock() + } + return +} + +func min(a, b int) int { + if a < b { + return a + } + return b +} diff --git a/vendor/github.com/google/gopacket/reassembly/tcpassembly_test.go b/vendor/github.com/google/gopacket/reassembly/tcpassembly_test.go new file mode 100644 index 0000000..b29cf2f --- /dev/null +++ b/vendor/github.com/google/gopacket/reassembly/tcpassembly_test.go @@ -0,0 +1,1660 @@ +// 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 reassembly + +import ( + "encoding/hex" + "fmt" + "net" + "reflect" + "runtime" + "testing" + "time" + + "github.com/google/gopacket" + "github.com/google/gopacket/layers" +) + +var netFlow gopacket.Flow + +var testDebug = false + +func init() { + netFlow, _ = gopacket.FlowFromEndpoints( + layers.NewIPEndpoint(net.IP{1, 2, 3, 4}), + layers.NewIPEndpoint(net.IP{5, 6, 7, 8})) +} + +type Reassembly struct { + Bytes []byte + Start bool + End bool + Skip int +} + +type testSequence struct { + in layers.TCP + want []Reassembly +} + +/* For benchmark: do nothing */ +type testFactoryBench struct { +} + +func (t *testFactoryBench) New(a, b gopacket.Flow, tcp *layers.TCP, ac AssemblerContext) Stream { + return t +} +func (t *testFactoryBench) Accept(tcp *layers.TCP, ci gopacket.CaptureInfo, dir TCPFlowDirection, seq Sequence, start *bool, ac AssemblerContext) bool { + return true +} +func (t *testFactoryBench) ReassembledSG(sg ScatterGather, ac AssemblerContext) { +} +func (t *testFactoryBench) ReassemblyComplete(ac AssemblerContext) bool { + return true +} + +/* For tests: append bytes */ +type testFactory struct { + reassembly []Reassembly +} + +func (t *testFactory) New(a, b gopacket.Flow, tcp *layers.TCP, ac AssemblerContext) Stream { + return t +} +func (t *testFactory) Reassembled(r []Reassembly) { + t.reassembly = r + for i := 0; i < len(r); i++ { + //t.reassembly[i].Seen = time.Time{} + } +} +func (t *testFactory) ReassembledSG(sg ScatterGather, ac AssemblerContext) { + _, start, end, skip := sg.Info() + l, _ := sg.Lengths() + t.reassembly = append(t.reassembly, Reassembly{ + Bytes: sg.Fetch(l), + Skip: skip, + Start: start, + End: end, + }) +} + +func (t *testFactory) ReassemblyComplete(ac AssemblerContext) bool { + return true +} + +func (t *testFactory) Accept(tcp *layers.TCP, ci gopacket.CaptureInfo, dir TCPFlowDirection, seq Sequence, start *bool, ac AssemblerContext) bool { + return true +} + +/* For memory checks: counts bytes */ +type testMemoryFactory struct { + bytes int +} + +func (tf *testMemoryFactory) New(a, b gopacket.Flow, tcp *layers.TCP, ac AssemblerContext) Stream { + return tf +} +func (tf *testMemoryFactory) Accept(tcp *layers.TCP, ci gopacket.CaptureInfo, dir TCPFlowDirection, seq Sequence, start *bool, ac AssemblerContext) bool { + return true +} +func (tf *testMemoryFactory) ReassembledSG(sg ScatterGather, ac AssemblerContext) { + bytes, _ := sg.Lengths() + tf.bytes += bytes +} +func (tf *testMemoryFactory) ReassemblyComplete(ac AssemblerContext) bool { + return true +} + +/* + * Tests + */ + +func test(t *testing.T, s []testSequence) { + fact := &testFactory{} + p := NewStreamPool(fact) + a := NewAssembler(p) + a.MaxBufferedPagesPerConnection = 4 + for i, test := range s { + fact.reassembly = []Reassembly{} + if testDebug { + fmt.Printf("#### test: #%d: sending:%s\n", i, hex.EncodeToString(test.in.BaseLayer.Payload)) + } + a.Assemble(netFlow, &test.in) + final := []Reassembly{} + if len(test.want) > 0 { + final = append(final, Reassembly{}) + for _, w := range test.want { + final[0].Bytes = append(final[0].Bytes, w.Bytes...) + if w.End { + final[0].End = true + } + if w.Start { + final[0].Start = true + } + if w.Skip != 0 { + final[0].Skip = w.Skip + } + } + } + if !reflect.DeepEqual(fact.reassembly, final) { + t.Fatalf("test %v:\nwant: %v\n got: %v\n", i, final, fact.reassembly) + } + if testDebug { + fmt.Printf("test %v passing...(%s)\n", i, final) + } + } +} + +func TestReorder(t *testing.T) { + test(t, []testSequence{ + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1001, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3}}, + }, + want: []Reassembly{}, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1004, + BaseLayer: layers.BaseLayer{Payload: []byte{4, 5, 6}}, + }, + want: []Reassembly{}, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1010, + BaseLayer: layers.BaseLayer{Payload: []byte{10, 11, 12}}, + }, + want: []Reassembly{}, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1007, + BaseLayer: layers.BaseLayer{Payload: []byte{7, 8, 9}}, + }, + want: []Reassembly{ + Reassembly{ + Skip: -1, + Bytes: []byte{1, 2, 3}, + }, + Reassembly{ + Bytes: []byte{4, 5, 6}, + }, + Reassembly{ + Bytes: []byte{7, 8, 9}, + }, + Reassembly{ + Bytes: []byte{10, 11, 12}, + }, + }, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1016, + BaseLayer: layers.BaseLayer{Payload: []byte{2, 2, 3}}, + }, + want: []Reassembly{}, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1019, + BaseLayer: layers.BaseLayer{Payload: []byte{3, 2, 3}}, + }, + want: []Reassembly{}, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1013, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3}}, + }, + want: []Reassembly{ + Reassembly{ + Bytes: []byte{1, 2, 3}, + }, + Reassembly{ + Bytes: []byte{2, 2, 3}, + }, + Reassembly{ + Bytes: []byte{3, 2, 3}, + }, + }, + }, + }) +} + +func TestMaxPerSkip(t *testing.T) { + test(t, []testSequence{ + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1000, + SYN: true, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3}}, + }, + want: []Reassembly{ + Reassembly{ + Start: true, + Bytes: []byte{1, 2, 3}, + }, + }, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1007, + BaseLayer: layers.BaseLayer{Payload: []byte{3, 2, 3}}, + }, + want: []Reassembly{}, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1010, + BaseLayer: layers.BaseLayer{Payload: []byte{4, 2, 3}}, + }, + want: []Reassembly{}, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1013, + BaseLayer: layers.BaseLayer{Payload: []byte{5, 2, 3}}, + }, + want: []Reassembly{}, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1016, + BaseLayer: layers.BaseLayer{Payload: []byte{6, 2, 3}}, + }, + want: []Reassembly{ + Reassembly{ + Skip: 3, + Bytes: []byte{3, 2, 3}, + }, + Reassembly{ + Bytes: []byte{4, 2, 3}, + }, + Reassembly{ + Bytes: []byte{5, 2, 3}, + }, + Reassembly{ + Bytes: []byte{6, 2, 3}, + }, + }, + }, + }) +} + +func TestReorderFast(t *testing.T) { + test(t, []testSequence{ + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + SYN: true, + Seq: 1000, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3}}, + }, + want: []Reassembly{ + Reassembly{ + Start: true, + Bytes: []byte{1, 2, 3}, + }, + }, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1007, + BaseLayer: layers.BaseLayer{Payload: []byte{3, 2, 3}}, + }, + want: []Reassembly{}, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1004, + BaseLayer: layers.BaseLayer{Payload: []byte{2, 2, 3}}, + }, + want: []Reassembly{ + Reassembly{ + Bytes: []byte{2, 2, 3}, + }, + Reassembly{ + Bytes: []byte{3, 2, 3}, + }, + }, + }, + }) +} + +func TestOverlap(t *testing.T) { + test(t, []testSequence{ + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + SYN: true, + Seq: 1000, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}}, + }, + want: []Reassembly{ + Reassembly{ + Start: true, + Bytes: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, + }, + }, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1007, + BaseLayer: layers.BaseLayer{Payload: []byte{7, 8, 9, 0, 1, 2, 3, 4, 5}}, + }, + want: []Reassembly{ + Reassembly{ + Bytes: []byte{1, 2, 3, 4, 5}, + }, + }, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1010, + BaseLayer: layers.BaseLayer{Payload: []byte{0, 1, 2, 3, 4, 5, 6, 7}}, + }, + want: []Reassembly{ + Reassembly{ + Bytes: []byte{6, 7}, + }, + }, + }, + }) +} + +func TestBufferedOverlap1(t *testing.T) { + test(t, []testSequence{ + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1007, + BaseLayer: layers.BaseLayer{Payload: []byte{7, 8, 9, 0, 1, 2, 3, 4, 5}}, + }, + want: []Reassembly{}, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1010, + BaseLayer: layers.BaseLayer{Payload: []byte{0, 1, 2, 3, 4, 5, 6, 7}}, + }, + want: []Reassembly{}, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + SYN: true, + Seq: 1000, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}}, + }, + want: []Reassembly{ + Reassembly{ + Start: true, + Bytes: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, + }, + Reassembly{ + Bytes: []byte{1, 2, 3, 4, 5}, + }, + Reassembly{ + Bytes: []byte{6, 7}, + }, + }, + }, + }) +} + +func TestBufferedOverlapCase6(t *testing.T) { + test(t, []testSequence{ + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1007, + BaseLayer: layers.BaseLayer{Payload: []byte{7, 8, 9, 0, 1, 2, 3, 4, 5}}, + }, + want: []Reassembly{}, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1010, + BaseLayer: layers.BaseLayer{Payload: []byte{10, 11, 12, 13, 14}}, + }, + want: []Reassembly{}, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + SYN: true, + Seq: 1000, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}}, + }, + want: []Reassembly{ + Reassembly{ + Start: true, + Bytes: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, + }, + Reassembly{ + Bytes: []byte{11, 12, 13, 14, 5}, + }, + }, + }, + }) +} + +func TestBufferedOverlapExisting(t *testing.T) { + test(t, []testSequence{ + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1000, + SYN: true, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7}}, + }, + want: []Reassembly{ + Reassembly{ + Start: true, + Bytes: []byte{1, 2, 3, 4, 5, 6, 7}, + }, + }, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1005, + BaseLayer: layers.BaseLayer{Payload: []byte{5, 6, 7, 8, 9, 10}}, + }, + want: []Reassembly{ + Reassembly{ + Bytes: []byte{8, 9, 10}, + }, + }, + }, + }) +} + +func TestBufferedOverlapReemit(t *testing.T) { + test(t, []testSequence{ + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1000, + SYN: true, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7}}, + }, + want: []Reassembly{ + Reassembly{ + Start: true, + Bytes: []byte{1, 2, 3, 4, 5, 6, 7}, + }, + }, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1003, + BaseLayer: layers.BaseLayer{Payload: []byte{3, 4, 5}}, + }, + want: []Reassembly{}, + }, + }) +} + +func TestReorderRetransmission2(t *testing.T) { + test(t, []testSequence{ + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1001, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3}}, + }, + want: []Reassembly{}, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1007, + BaseLayer: layers.BaseLayer{Payload: []byte{2, 2, 3}}, + }, + want: []Reassembly{}, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1007, + BaseLayer: layers.BaseLayer{Payload: []byte{2, 2, 3}}, + }, + want: []Reassembly{}, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1010, + BaseLayer: layers.BaseLayer{Payload: []byte{10, 11}}, + }, + want: []Reassembly{}, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1004, + BaseLayer: layers.BaseLayer{Payload: []byte{6, 6, 6, 2, 2}}, + }, + want: []Reassembly{ + Reassembly{ + Skip: -1, + Bytes: []byte{1, 2, 3}, + }, + Reassembly{ + Bytes: []byte{6, 6, 6}, + }, + Reassembly{ + Bytes: []byte{2, 2, 3}, + }, + Reassembly{ + Bytes: []byte{10, 11}, + }, + }, + }, + }) +} + +func TestOverrun1(t *testing.T) { + test(t, []testSequence{ + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + SYN: true, + Seq: 0xFFFFFFFF, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}}, + }, + want: []Reassembly{ + Reassembly{ + Start: true, + Bytes: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, + }, + }, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 10, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4}}, + }, + want: []Reassembly{ + Reassembly{ + Bytes: []byte{1, 2, 3, 4}, + }, + }, + }, + }) +} + +func TestOverrun2(t *testing.T) { + test(t, []testSequence{ + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 10, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4}}, + }, + want: []Reassembly{}, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + SYN: true, + Seq: 0xFFFFFFFF, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}}, + }, + want: []Reassembly{ + Reassembly{ + Start: true, + Bytes: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, + }, + Reassembly{ + Bytes: []byte{1, 2, 3, 4}, + }, + }, + }, + }) +} + +func TestCacheLargePacket(t *testing.T) { + data := make([]byte, pageBytes*3) + test(t, []testSequence{ + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1001, + BaseLayer: layers.BaseLayer{Payload: data}, + }, + want: []Reassembly{}, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1000, + SYN: true, + BaseLayer: layers.BaseLayer{Payload: []byte{}}, + }, + want: []Reassembly{ + Reassembly{ + Start: true, + Bytes: []byte{}, + }, + Reassembly{ + Bytes: data[:pageBytes], + }, + Reassembly{ + Bytes: data[pageBytes : pageBytes*2], + }, + Reassembly{ + Bytes: data[pageBytes*2 : pageBytes*3], + }, + }, + }, + }) +} + +/* + * Keep + */ +type testKeepFactory struct { + keep int + bytes []byte + skipped int + t *testing.T +} + +func (tkf *testKeepFactory) New(a, b gopacket.Flow, tcp *layers.TCP, ac AssemblerContext) Stream { + return tkf +} +func (tkf *testKeepFactory) ReassembledSG(sg ScatterGather, ac AssemblerContext) { + l, _ := sg.Lengths() + _, _, _, tkf.skipped = sg.Info() + tkf.bytes = sg.Fetch(l) + sg.KeepFrom(tkf.keep) +} +func (tkf *testKeepFactory) ReassemblyComplete(ac AssemblerContext) bool { + return true +} + +func (tkf *testKeepFactory) Accept(tcp *layers.TCP, ci gopacket.CaptureInfo, dir TCPFlowDirection, seq Sequence, start *bool, ac AssemblerContext) bool { + return true +} + +type testKeepSequence struct { + tcp layers.TCP + keep int + want []byte + skipped int +} + +func testKeep(t *testing.T, s []testKeepSequence) { + fact := &testKeepFactory{t: t} + p := NewStreamPool(fact) + a := NewAssembler(p) + a.MaxBufferedPagesPerConnection = 4 + port := layers.TCPPort(0) + for i, test := range s { + // Fake some values according to ports + flow := netFlow + dir := TCPDirClientToServer + if port == 0 { + port = test.tcp.SrcPort + } + if port != test.tcp.SrcPort { + dir = dir.Reverse() + flow = flow.Reverse() + } + test.tcp.SetInternalPortsForTesting() + fact.keep = test.keep + fact.bytes = []byte{} + if testDebug { + fmt.Printf("#### testKeep: #%d: sending:%s\n", i, hex.EncodeToString(test.tcp.BaseLayer.Payload)) + } + a.Assemble(flow, &test.tcp) + if !reflect.DeepEqual(fact.bytes, test.want) { + t.Fatalf("#%d: invalid bytes: got %v, expected %v", i, fact.bytes, test.want) + } + if fact.skipped != test.skipped { + t.Fatalf("#%d: expecting %d skipped bytes, got %d", i, test.skipped, fact.skipped) + } + if testDebug { + fmt.Printf("#### testKeep: #%d: bytes: %s\n", i, hex.EncodeToString(fact.bytes)) + } + } +} + +func TestKeepSimpleOnBoundary(t *testing.T) { + testKeep(t, []testKeepSequence{ + { + tcp: layers.TCP{ + SrcPort: 1, + DstPort: 2, + SYN: true, + Seq: 1000, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}}, + }, + keep: 0, + want: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, + }, + { + tcp: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1007, + BaseLayer: layers.BaseLayer{Payload: []byte{7, 8, 9, 0, 1, 2, 3, 4, 5}}, + }, + want: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5}, + }, + }) +} + +func TestKeepSimpleNotBoundaryLive(t *testing.T) { + testKeep(t, []testKeepSequence{ + { + tcp: layers.TCP{ + SrcPort: 1, + DstPort: 2, + SYN: true, + Seq: 1000, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}}, + }, + keep: 1, + want: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, + }, + { + tcp: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1007, + BaseLayer: layers.BaseLayer{Payload: []byte{7, 8, 9, 0, 1, 2, 3, 4, 5}}, + }, + want: []byte{2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5}, + }, + }) +} + +func TestKeepSimpleNotBoundaryAlreadyKept(t *testing.T) { + testKeep(t, []testKeepSequence{ + { + tcp: layers.TCP{ + SrcPort: 1, + DstPort: 2, + SYN: true, + Seq: 1000, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0x10}}, + }, + keep: 0, // 1→10 + want: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0x10}, + }, + { + tcp: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1007, + BaseLayer: layers.BaseLayer{Payload: []byte{7, 8, 9, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15}}, + }, + keep: 11, // 12→15 + want: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15}, + }, + { + tcp: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1016, + BaseLayer: layers.BaseLayer{Payload: []byte{0x16, 0x17, 0x18}}, + }, + want: []byte{0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18}, + }, + }) +} + +func TestKeepLonger(t *testing.T) { + testKeep(t, []testKeepSequence{ + { + tcp: layers.TCP{ + SrcPort: 1, + DstPort: 2, + SYN: true, + Seq: 1000, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}, + }, + keep: 0, + want: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, + }, + { + tcp: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1007, + BaseLayer: layers.BaseLayer{Payload: []byte{7, 8, 9, 10, 11, 12, 13, 14, 15}}, + }, + keep: 0, + want: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, + }, + { + tcp: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1010, + BaseLayer: layers.BaseLayer{Payload: []byte{10, 11, 12, 13, 14, 15, 16, 17}}, + }, + want: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17}, + }, + }) +} + +func TestKeepWithFlush(t *testing.T) { + testKeep(t, []testKeepSequence{ + { + tcp: layers.TCP{ + SrcPort: 1, + DstPort: 2, + SYN: true, + Seq: 1000, + BaseLayer: layers.BaseLayer{Payload: []byte{1}}, + }, + keep: 1, + want: []byte{1}, + }, + { + tcp: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1003, + BaseLayer: layers.BaseLayer{Payload: []byte{3}}, + }, + keep: 0, + want: []byte{}, + }, + { + tcp: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1004, + BaseLayer: layers.BaseLayer{Payload: []byte{4}}, + }, + keep: 0, + want: []byte{}, + }, + { + tcp: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1006, + BaseLayer: layers.BaseLayer{Payload: []byte{6}}, + }, + keep: 0, + want: []byte{}, + }, + // Exceeding 4 pages: flushing first continuous pages + { + tcp: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1008, + BaseLayer: layers.BaseLayer{Payload: []byte{8}}, + }, + keep: 0, + skipped: 1, + want: []byte{3, 4}, + }, + { + tcp: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1010, + BaseLayer: layers.BaseLayer{Payload: []byte{10}}, + }, + keep: 0, + skipped: 1, + want: []byte{6}, + }, + { + tcp: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1012, + BaseLayer: layers.BaseLayer{Payload: []byte{12}}, + }, + keep: 0, + skipped: 1, + want: []byte{8}, + }, + }) +} + +/* + * FSM tests + */ +/* For FSM: bump nb on accepted packet */ +type testFSMFactory struct { + nb int + fsm TCPSimpleFSM +} + +func (t *testFSMFactory) New(a, b gopacket.Flow, tcp *layers.TCP, ac AssemblerContext) Stream { + return t +} +func (t *testFSMFactory) ReassembledSG(sg ScatterGather, ac AssemblerContext) { +} +func (t *testFSMFactory) ReassemblyComplete(ac AssemblerContext) bool { + return false +} + +func (t *testFSMFactory) Accept(tcp *layers.TCP, ci gopacket.CaptureInfo, dir TCPFlowDirection, seq Sequence, start *bool, ac AssemblerContext) bool { + ok := t.fsm.CheckState(tcp, dir) + if ok { + t.nb++ + } + return ok +} + +type testFSMSequence struct { + tcp layers.TCP + ci gopacket.CaptureInfo + nb int +} + +func (seq *testFSMSequence) GetCaptureInfo() gopacket.CaptureInfo { + return seq.ci +} + +func testFSM(t *testing.T, s []testFSMSequence) { + fact := &testFSMFactory{} + p := NewStreamPool(fact) + a := NewAssembler(p) + //a.MaxBufferedPagesPerConnection = 4 + fact.nb = 0 + port := layers.TCPPort(0) + for i, test := range s { + // Fake some values according to ports + flow := netFlow + dir := TCPDirClientToServer + if port == 0 { + port = test.tcp.SrcPort + } + if port != test.tcp.SrcPort { + dir = dir.Reverse() + flow = flow.Reverse() + } + test.tcp.SetInternalPortsForTesting() + a.AssembleWithContext(flow, &test.tcp, &test) + if fact.nb != test.nb { + t.Fatalf("#%d: packet rejected: got %d, expected %d", i, fact.nb, test.nb) + } + } +} + +func TestFSMnormalFlow(t *testing.T) { + testFSM(t, []testFSMSequence{ + { + tcp: layers.TCP{ + SYN: true, + SrcPort: 54842, + DstPort: 53, + Seq: 374511116, + Ack: 0, + BaseLayer: layers.BaseLayer{Payload: []byte{}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 566690000), + }, + nb: 1, + }, + { + tcp: layers.TCP{ + SYN: true, + ACK: true, + SrcPort: 53, + DstPort: 54842, + Seq: 3465787765, + Ack: 374511117, + BaseLayer: layers.BaseLayer{Payload: []byte{}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 590332000), + }, + nb: 2, + }, + { + tcp: layers.TCP{ + ACK: true, + SrcPort: 54842, + DstPort: 53, + Seq: 374511117, + Ack: 3465787766, + BaseLayer: layers.BaseLayer{Payload: []byte{}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 590346000), + }, + nb: 3, + }, + { + tcp: layers.TCP{ + ACK: true, + SrcPort: 54842, + DstPort: 53, + Seq: 374511117, + Ack: 3465787766, + BaseLayer: layers.BaseLayer{Payload: []byte{0, 31, 104, 196, 0, 32, 0, 1, 0, 0, 0, 0, 0, 1, 2, 85, 83, 0, 0, 6, 0, 1, 0, 0, 41, 16, 0, 0, 0, 128, 0, 0, 0}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 590387000), + }, + nb: 4, + }, + { + tcp: layers.TCP{ + ACK: true, + SrcPort: 53, + DstPort: 54842, + Seq: 3465787766, + Ack: 374511150, + BaseLayer: layers.BaseLayer{Payload: []byte{}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 613687000), + }, + nb: 5, + }, + { + tcp: layers.TCP{ + ACK: true, + SrcPort: 53, + DstPort: 54842, + Seq: 3465787766, + Ack: 374511150, + BaseLayer: layers.BaseLayer{Payload: []byte{8, 133, 104, 196, 132, 0, 0, 1, 0, 2, 0, 7, 0, 19, 2, 85, 83, 0, 0, 6, 0, 1, 2, 117, 115, 0, 0, 6, 0, 1, 0, 0, 3, 132, 0, 54, 1, 97, 5, 99, 99, 116, 108, 100, 192, 20, 10, 104, 111, 115, 116, 109, 97, 115, 116, 101, 114, 7, 110, 101, 117, 115, 116, 97, 114, 3, 98, 105, 122, 0, 120, 18, 40, 205, 0, 0, 3, 132, 0, 0, 3, 132, 0, 9, 58, 128, 0, 1, 81, 128, 192, 20, 0, 46, 0, 1, 0, 0, 3, 132, 0, 150, 0, 6, 5, 1, 0, 0, 3, 132, 85, 138, 90, 146, 85, 98, 191, 130, 27, 78, 2, 117, 115, 0, 69, 13, 35, 189, 141, 225, 107, 238, 108, 182, 207, 44, 105, 31, 212, 103, 32, 93, 217, 108, 20, 231, 188, 28, 241, 237, 104, 182, 117, 121, 195, 112, 64, 96, 237, 248, 6, 181, 186, 96, 60, 6, 18, 29, 188, 96, 201, 140, 251, 61, 71, 177, 108, 156, 9, 83, 125, 172, 188, 75, 81, 67, 218, 55, 93, 131, 243, 15, 190, 75, 4, 165, 226, 124, 49, 67, 142, 131, 239, 240, 76, 225, 10, 242, 68, 88, 240, 200, 27, 97, 102, 73, 92, 73, 133, 170, 175, 198, 99, 109, 90, 16, 162, 101, 95, 96, 102, 250, 91, 74, 80, 3, 87, 167, 50, 230, 9, 213, 7, 222, 197, 87, 183, 190, 148, 247, 207, 204, 192, 118, 0, 2, 0, 1, 0, 7, 233, 0, 0, 10, 1, 102, 5, 99, 99, 116, 108, 100, 192, 12, 192, 118, 0, 2, 0, 1, 0, 7, 233, 0, 0, 4, 1, 97, 193, 8, 192, 118, 0, 2, 0, 1, 0, 7, 233, 0, 0, 4, 1, 98, 193, 8, 192, 118, 0, 2, 0, 1, 0, 7, 233, 0, 0, 4, 1, 99, 193, 8, 192, 118, 0, 2, 0, 1, 0, 7, 233, 0, 0, 4, 1, 101, 193, 8, 192, 118, 0, 2, 0, 1, 0, 7, 233, 0, 0, 4, 1, 107, 193, 8, 192, 118, 0, 46, 0, 1, 0, 7, 233, 0, 0, 150, 0, 2, 5, 1, 0, 7, 233, 0, 85, 127, 33, 92, 85, 87, 134, 98, 27, 78, 2, 117, 115, 0, 19, 227, 175, 75, 88, 245, 164, 158, 150, 198, 57, 253, 150, 179, 161, 52, 24, 56, 229, 176, 175, 40, 45, 232, 188, 171, 131, 197, 107, 125, 218, 192, 78, 221, 146, 33, 114, 55, 43, 12, 131, 213, 51, 98, 37, 2, 102, 161, 232, 115, 177, 210, 51, 169, 215, 133, 56, 190, 91, 75, 8, 222, 231, 202, 139, 28, 187, 249, 72, 21, 23, 56, 63, 72, 126, 142, 242, 195, 242, 64, 208, 134, 100, 157, 197, 159, 43, 148, 20, 70, 117, 152, 159, 35, 200, 220, 49, 234, 173, 210, 91, 34, 210, 192, 7, 197, 112, 117, 208, 234, 42, 49, 133, 237, 197, 14, 244, 149, 191, 142, 36, 252, 42, 48, 182, 189, 9, 68, 1, 65, 5, 67, 67, 84, 76, 68, 193, 126, 0, 1, 0, 1, 0, 0, 28, 32, 0, 4, 156, 154, 124, 70, 1, 66, 194, 4, 0, 1, 0, 1, 0, 0, 28, 32, 0, 4, 156, 154, 125, 70, 194, 26, 0, 28, 0, 1, 0, 0, 28, 32, 0, 16, 32, 1, 5, 3, 209, 174, 255, 255, 255, 255, 255, 255, 255, 255, 255, 126, 1, 67, 194, 4, 0, 1, 0, 1, 0, 0, 28, 32, 0, 4, 156, 154, 127, 70, 1, 69, 194, 4, 0, 1, 0, 1, 0, 0, 28, 32, 0, 4, 156, 154, 126, 70, 1, 70, 194, 4, 0, 1, 0, 1, 0, 0, 28, 32, 0, 4, 209, 173, 58, 70, 194, 108, 0, 28, 0, 1, 0, 0, 28, 32, 0, 16, 32, 1, 5, 0, 54, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 1, 75, 194, 4, 0, 1, 0, 1, 0, 0, 28, 32, 0, 4, 156, 154, 128, 70, 194, 154, 0, 28, 0, 1, 0, 0, 28, 32, 0, 16, 32, 1, 5, 3, 226, 57, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 194, 2, 0, 46, 0, 1, 0, 0, 28, 32, 0, 150, 0, 1, 5, 3, 0, 0, 28, 32, 85, 112, 230, 49, 85, 73, 83, 2, 27, 78, 2, 117, 115, 0, 82, 36, 11, 141, 74, 85, 70, 98, 179, 63, 173, 83, 8, 70, 155, 41, 102, 166, 140, 62, 71, 178, 130, 38, 171, 200, 180, 68, 2, 215, 45, 6, 43, 59, 171, 146, 223, 215, 9, 77, 5, 104, 167, 42, 237, 170, 30, 114, 205, 129, 59, 225, 152, 224, 79, 1, 65, 68, 208, 153, 121, 237, 199, 87, 2, 251, 100, 105, 59, 24, 73, 226, 169, 121, 250, 91, 41, 124, 14, 23, 135, 52, 2, 86, 72, 224, 100, 135, 70, 216, 16, 107, 84, 59, 13, 168, 58, 187, 54, 98, 230, 167, 246, 42, 46, 156, 206, 238, 120, 199, 25, 144, 98, 249, 70, 162, 34, 43, 145, 114, 186, 233, 47, 42, 75, 95, 152, 235, 194, 26, 0, 46, 0, 1, 0, 0, 28, 32, 0, 150, 0, 1, 5, 3, 0, 0, 28, 32, 85, 112, 190, 140, 85, 73, 36, 78, 27, 78, 2, 117, 115, 0, 160, 95, 100, 37, 167, 82, 93, 165, 126, 247, 147, 173, 238, 154, 206, 174, 96, 175, 209, 7, 8, 169, 171, 223, 29, 201, 161, 177, 98, 54, 94, 62, 70, 127, 142, 109, 206, 42, 179, 109, 156, 160, 156, 20, 59, 24, 147, 164, 13, 121, 192, 84, 157, 26, 56, 177, 151, 210, 7, 197, 229, 110, 60, 58, 224, 42, 77, 5, 59, 80, 216, 221, 248, 19, 66, 102, 74, 199, 238, 120, 231, 201, 187, 29, 11, 46, 195, 164, 8, 221, 128, 25, 205, 42, 247, 152, 112, 176, 14, 117, 150, 223, 245, 32, 212, 107, 4, 245, 27, 126, 224, 216, 0, 89, 106, 238, 185, 206, 44, 56, 204, 175, 7, 139, 233, 228, 127, 175, 194, 26, 0, 46, 0, 1, 0, 0, 28, 32, 0, 150, 0, 28, 5, 3, 0, 0, 28, 32, 85, 108, 217, 174, 85, 69, 70, 242, 27, 78, 2, 117, 115, 0, 172, 117, 89, 89, 73, 249, 245, 211, 100, 127, 48, 135, 224, 97, 172, 146, 128, 30, 190, 72, 199, 170, 97, 179, 136, 109, 86, 110, 235, 214, 47, 50, 115, 11, 226, 168, 56, 198, 24, 212, 205, 207, 2, 116, 104, 112, 99, 234, 236, 44, 70, 19, 19, 215, 127, 200, 162, 215, 142, 45, 135, 91, 219, 217, 86, 231, 154, 87, 222, 161, 32, 66, 196, 55, 117, 20, 186, 9, 134, 252, 249, 219, 9, 196, 128, 8, 222, 201, 131, 210, 182, 232, 142, 72, 160, 171, 95, 231, 232, 156, 28, 34, 54, 94, 73, 183, 38, 160, 123, 175, 157, 21, 163, 8, 214, 155, 172, 237, 169, 28, 15, 138, 105, 107, 251, 109, 131, 240, 194, 72, 0, 46, 0, 1, 0, 0, 28, 32, 0, 150, 0, 1, 5, 3, 0, 0, 28, 32, 85, 112, 190, 140, 85, 73, 36, 78, 27, 78, 2, 117, 115, 0, 77, 207, 197, 130, 236, 138, 192, 241, 225, 114, 8, 22, 76, 54, 43, 121, 42, 44, 9, 92, 56, 253, 224, 179, 191, 131, 40, 176, 94, 61, 33, 12, 43, 82, 156, 236, 211, 29, 187, 100, 220, 243, 24, 134, 42, 204, 46, 161, 214, 91, 68, 119, 40, 252, 53, 54, 146, 136, 196, 168, 204, 195, 131, 110, 6, 73, 16, 161, 86, 35, 150, 153, 162, 185, 227, 65, 228, 160, 203, 42, 250, 121, 14, 42, 115, 221, 232, 96, 99, 164, 230, 29, 195, 149, 85, 206, 41, 1, 252, 77, 188, 88, 8, 182, 37, 249, 6, 158, 6, 244, 158, 254, 141, 203, 6, 158, 198, 103, 130, 98, 123, 34, 245, 44, 126, 77, 24, 187, 194, 90, 0, 46, 0, 1, 0, 0, 28, 32, 0, 150, 0, 1, 5, 3, 0, 0, 28, 32, 85, 108, 194, 203, 85, 69, 51, 125, 27, 78, 2, 117, 115, 0, 86, 26, 187, 56, 252, 194, 199, 140, 229, 133, 186, 187, 20, 174, 26, 48, 212, 129, 10, 20, 167, 179, 53, 72, 176, 92, 153, 48, 146, 15, 163, 182, 80, 138, 181, 135, 98, 129, 17, 66, 55, 184, 76, 225, 72, 104, 7, 221, 40, 71, 41, 202, 246, 154, 166, 199, 74, 175, 146, 54, 25, 56, 115, 243}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 621198000), + }, + nb: 6, + }, + { + tcp: layers.TCP{ + ACK: true, + SrcPort: 54842, + DstPort: 53, + Seq: 374511150, + Ack: 3465789226, + BaseLayer: layers.BaseLayer{Payload: []byte{}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 621220000), + }, + nb: 7, + }, + { + tcp: layers.TCP{ + ACK: true, + SrcPort: 53, + DstPort: 54842, + Seq: 3465789226, + Ack: 374511150, + BaseLayer: layers.BaseLayer{Payload: []byte{153, 141, 101, 187, 110, 15, 63, 42, 81, 100, 95, 68, 241, 85, 160, 227, 3, 1, 12, 80, 166, 1, 98, 2, 44, 98, 63, 203, 70, 164, 99, 195, 23, 152, 223, 253, 208, 10, 12, 19, 66, 121, 9, 158, 205, 96, 218, 0, 80, 70, 58, 95, 41, 124, 216, 13, 122, 135, 102, 200, 181, 233, 129, 174, 194, 108, 0, 46, 0, 1, 0, 0, 28, 32, 0, 150, 0, 1, 5, 3, 0, 0, 28, 32, 85, 108, 223, 157, 85, 69, 74, 55, 27, 78, 2, 117, 115, 0, 149, 71, 215, 149, 16, 165, 115, 229, 141, 136, 187, 158, 88, 225, 131, 231, 182, 218, 235, 27, 48, 65, 244, 77, 186, 135, 72, 18, 87, 52, 180, 128, 130, 67, 75, 173, 160, 243, 104, 178, 103, 117, 96, 209, 36, 51, 108, 47, 232, 214, 254, 15, 208, 182, 218, 174, 248, 237, 88, 150, 35, 190, 239, 249, 171, 151, 9, 236, 2, 252, 255, 13, 79, 190, 147, 36, 161, 210, 202, 80, 209, 136, 167, 180, 186, 68, 246, 249, 48, 123, 46, 11, 132, 103, 132, 207, 186, 68, 110, 133, 142, 109, 194, 19, 122, 57, 203, 217, 120, 93, 67, 168, 91, 252, 87, 38, 33, 228, 229, 162, 190, 170, 23, 188, 89, 15, 241, 71, 194, 108, 0, 46, 0, 1, 0, 0, 28, 32, 0, 150, 0, 28, 5, 3, 0, 0, 28, 32, 85, 108, 217, 174, 85, 69, 70, 242, 27, 78, 2, 117, 115, 0, 206, 97, 120, 37, 255, 252, 7, 156, 162, 192, 43, 84, 105, 94, 125, 55, 13, 247, 234, 9, 25, 100, 246, 25, 77, 168, 199, 208, 187, 209, 164, 123, 234, 138, 238, 15, 86, 45, 163, 108, 162, 117, 247, 128, 3, 187, 100, 185, 193, 191, 134, 86, 161, 254, 236, 99, 66, 66, 35, 173, 91, 243, 175, 3, 175, 94, 79, 68, 246, 109, 200, 154, 209, 185, 11, 210, 50, 147, 136, 213, 158, 81, 111, 17, 149, 239, 110, 114, 25, 234, 247, 158, 233, 33, 36, 181, 66, 84, 189, 37, 207, 58, 9, 171, 143, 66, 69, 137, 192, 6, 187, 59, 16, 51, 80, 56, 89, 170, 12, 195, 69, 133, 188, 110, 171, 17, 17, 213, 194, 154, 0, 46, 0, 1, 0, 0, 28, 32, 0, 150, 0, 1, 5, 3, 0, 0, 28, 32, 85, 112, 190, 140, 85, 73, 36, 78, 27, 78, 2, 117, 115, 0, 123, 36, 154, 4, 158, 41, 96, 252, 116, 114, 16, 137, 28, 177, 206, 33, 192, 88, 89, 1, 69, 252, 206, 88, 89, 152, 210, 179, 248, 44, 202, 239, 95, 131, 126, 147, 249, 93, 57, 166, 215, 184, 211, 164, 196, 71, 170, 3, 25, 18, 177, 214, 94, 147, 181, 148, 197, 11, 171, 219, 107, 48, 105, 81, 239, 110, 249, 140, 68, 127, 193, 146, 176, 161, 246, 108, 75, 141, 205, 211, 73, 247, 125, 205, 120, 156, 82, 55, 130, 250, 26, 15, 44, 214, 91, 115, 11, 103, 22, 83, 184, 96, 107, 138, 2, 127, 168, 191, 92, 102, 137, 161, 63, 225, 134, 17, 178, 242, 11, 43, 8, 30, 164, 28, 140, 195, 83, 121, 194, 154, 0, 46, 0, 1, 0, 0, 28, 32, 0, 150, 0, 28, 5, 3, 0, 0, 28, 32, 85, 112, 190, 140, 85, 73, 36, 78, 27, 78, 2, 117, 115, 0, 189, 98, 234, 251, 237, 24, 143, 210, 30, 242, 97, 66, 50, 211, 47, 109, 110, 121, 244, 239, 89, 0, 39, 92, 218, 155, 71, 5, 23, 136, 231, 107, 95, 52, 231, 118, 253, 206, 250, 178, 209, 136, 13, 36, 36, 54, 157, 237, 35, 110, 134, 253, 80, 237, 162, 163, 38, 21, 54, 241, 240, 253, 73, 33, 191, 128, 32, 6, 198, 165, 35, 203, 244, 15, 166, 250, 159, 67, 149, 56, 19, 243, 230, 87, 6, 44, 150, 90, 79, 107, 18, 121, 112, 23, 176, 104, 50, 110, 176, 138, 250, 6, 209, 22, 41, 73, 234, 4, 124, 233, 208, 218, 236, 117, 232, 217, 10, 172, 18, 215, 143, 119, 193, 113, 10, 59, 255, 221, 0, 0, 41, 16, 0, 0, 0, 128, 0, 0, 0}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 622508000), + }, + nb: 8, + }, + { + tcp: layers.TCP{ + ACK: true, + SrcPort: 54842, + DstPort: 53, + Seq: 374511150, + Ack: 3465789949, + BaseLayer: layers.BaseLayer{Payload: []byte{}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 622531000), + }, + nb: 9, + }, + { + tcp: layers.TCP{ + ACK: true, + FIN: true, + SrcPort: 54842, + DstPort: 53, + Seq: 374511150, + Ack: 3465789949, + BaseLayer: layers.BaseLayer{Payload: []byte{}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 622907000), + }, + nb: 10, + }, + { + tcp: layers.TCP{ + ACK: true, + FIN: true, + SrcPort: 53, + DstPort: 54842, + Seq: 3465789949, + Ack: 374511151, + BaseLayer: layers.BaseLayer{Payload: []byte{}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 652784000), + }, + nb: 11, + }, + { + tcp: layers.TCP{ + ACK: true, + SrcPort: 54842, + DstPort: 53, + Seq: 374511151, + Ack: 3465789950, + BaseLayer: layers.BaseLayer{Payload: []byte{}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 652809000), + }, + nb: 12, + }, + }) +} + +func TestFSMearlyRST(t *testing.T) { + testFSM(t, []testFSMSequence{ + { + tcp: layers.TCP{ + SYN: true, + SrcPort: 54842, + DstPort: 53, + Seq: 374511116, + Ack: 0, + BaseLayer: layers.BaseLayer{Payload: []byte{}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 566690000), + }, + nb: 1, + }, + { + tcp: layers.TCP{ + SYN: true, + ACK: true, + SrcPort: 53, + DstPort: 54842, + Seq: 3465787765, + Ack: 374511117, + BaseLayer: layers.BaseLayer{Payload: []byte{}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 590332000), + }, + nb: 2, + }, + { + tcp: layers.TCP{ + RST: true, + SrcPort: 54842, + DstPort: 53, + Seq: 374511117, + Ack: 3465787766, + BaseLayer: layers.BaseLayer{Payload: []byte{}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 590346000), + }, + nb: 3, + }, + { + tcp: layers.TCP{ + ACK: true, + SrcPort: 54842, + DstPort: 53, + Seq: 374511117, + Ack: 3465787766, + BaseLayer: layers.BaseLayer{Payload: []byte{0, 31, 104, 196, 0, 32, 0, 1, 0, 0, 0, 0, 0, 1, 2, 85, 83, 0, 0, 6, 0, 1, 0, 0, 41, 16, 0, 0, 0, 128, 0, 0, 0}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 590387000), + }, + nb: 3, + }, + { + tcp: layers.TCP{ + ACK: true, + SrcPort: 53, + DstPort: 54842, + Seq: 3465787766, + Ack: 374511150, + BaseLayer: layers.BaseLayer{Payload: []byte{}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 613687000), + }, + nb: 3, + }, + }) +} + +func TestFSMestablishedThenRST(t *testing.T) { + testFSM(t, []testFSMSequence{ + { + tcp: layers.TCP{ + SYN: true, + SrcPort: 54842, + DstPort: 53, + Seq: 374511116, + Ack: 0, + BaseLayer: layers.BaseLayer{Payload: []byte{}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 566690000), + }, + nb: 1, + }, + { + tcp: layers.TCP{ + SYN: true, + ACK: true, + SrcPort: 53, + DstPort: 54842, + Seq: 3465787765, + Ack: 374511117, + BaseLayer: layers.BaseLayer{Payload: []byte{}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 590332000), + }, + nb: 2, + }, + { + tcp: layers.TCP{ + ACK: true, + SrcPort: 54842, + DstPort: 53, + Seq: 374511117, + Ack: 3465787766, + BaseLayer: layers.BaseLayer{Payload: []byte{}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 590346000), + }, + nb: 3, + }, + { + tcp: layers.TCP{ + ACK: true, + SrcPort: 54842, + DstPort: 53, + Seq: 374511117, + Ack: 3465787766, + BaseLayer: layers.BaseLayer{Payload: []byte{0, 31, 104, 196, 0, 32, 0, 1, 0, 0, 0, 0, 0, 1, 2, 85, 83, 0, 0, 6, 0, 1, 0, 0, 41, 16, 0, 0, 0, 128, 0, 0, 0}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 590387000), + }, + nb: 4, + }, + { + tcp: layers.TCP{ + RST: true, + SrcPort: 53, + DstPort: 54842, + Seq: 3465787766, + Ack: 374511150, + BaseLayer: layers.BaseLayer{Payload: []byte{}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 613687000), + }, + nb: 5, + }, + { + tcp: layers.TCP{ + ACK: true, + SrcPort: 53, + DstPort: 54842, + Seq: 3465787766, + Ack: 374511150, + BaseLayer: layers.BaseLayer{Payload: []byte{8, 133, 104, 196, 132, 0, 0, 1, 0, 2, 0, 7, 0, 19, 2, 85, 83, 0, 0, 6, 0, 1, 2, 117, 115, 0, 0, 6, 0, 1, 0, 0, 3, 132, 0, 54, 1, 97, 5, 99, 99, 116, 108, 100, 192, 20, 10, 104, 111, 115, 116, 109, 97, 115, 116, 101, 114, 7, 110, 101, 117, 115, 116, 97, 114, 3, 98, 105, 122, 0, 120, 18, 40, 205, 0, 0, 3, 132, 0, 0, 3, 132, 0, 9, 58, 128, 0, 1, 81, 128, 192, 20, 0, 46, 0, 1, 0, 0, 3, 132, 0, 150, 0, 6, 5, 1, 0, 0, 3, 132, 85, 138, 90, 146, 85, 98, 191, 130, 27, 78, 2, 117, 115, 0, 69, 13, 35, 189, 141, 225, 107, 238, 108, 182, 207, 44, 105, 31, 212, 103, 32, 93, 217, 108, 20, 231, 188, 28, 241, 237, 104, 182, 117, 121, 195, 112, 64, 96, 237, 248, 6, 181, 186, 96, 60, 6, 18, 29, 188, 96, 201, 140, 251, 61, 71, 177, 108, 156, 9, 83, 125, 172, 188, 75, 81, 67, 218, 55, 93, 131, 243, 15, 190, 75, 4, 165, 226, 124, 49, 67, 142, 131, 239, 240, 76, 225, 10, 242, 68, 88, 240, 200, 27, 97, 102, 73, 92, 73, 133, 170, 175, 198, 99, 109, 90, 16, 162, 101, 95, 96, 102, 250, 91, 74, 80, 3, 87, 167, 50, 230, 9, 213, 7, 222, 197, 87, 183, 190, 148, 247, 207, 204, 192, 118, 0, 2, 0, 1, 0, 7, 233, 0, 0, 10, 1, 102, 5, 99, 99, 116, 108, 100, 192, 12, 192, 118, 0, 2, 0, 1, 0, 7, 233, 0, 0, 4, 1, 97, 193, 8, 192, 118, 0, 2, 0, 1, 0, 7, 233, 0, 0, 4, 1, 98, 193, 8, 192, 118, 0, 2, 0, 1, 0, 7, 233, 0, 0, 4, 1, 99, 193, 8, 192, 118, 0, 2, 0, 1, 0, 7, 233, 0, 0, 4, 1, 101, 193, 8, 192, 118, 0, 2, 0, 1, 0, 7, 233, 0, 0, 4, 1, 107, 193, 8, 192, 118, 0, 46, 0, 1, 0, 7, 233, 0, 0, 150, 0, 2, 5, 1, 0, 7, 233, 0, 85, 127, 33, 92, 85, 87, 134, 98, 27, 78, 2, 117, 115, 0, 19, 227, 175, 75, 88, 245, 164, 158, 150, 198, 57, 253, 150, 179, 161, 52, 24, 56, 229, 176, 175, 40, 45, 232, 188, 171, 131, 197, 107, 125, 218, 192, 78, 221, 146, 33, 114, 55, 43, 12, 131, 213, 51, 98, 37, 2, 102, 161, 232, 115, 177, 210, 51, 169, 215, 133, 56, 190, 91, 75, 8, 222, 231, 202, 139, 28, 187, 249, 72, 21, 23, 56, 63, 72, 126, 142, 242, 195, 242, 64, 208, 134, 100, 157, 197, 159, 43, 148, 20, 70, 117, 152, 159, 35, 200, 220, 49, 234, 173, 210, 91, 34, 210, 192, 7, 197, 112, 117, 208, 234, 42, 49, 133, 237, 197, 14, 244, 149, 191, 142, 36, 252, 42, 48, 182, 189, 9, 68, 1, 65, 5, 67, 67, 84, 76, 68, 193, 126, 0, 1, 0, 1, 0, 0, 28, 32, 0, 4, 156, 154, 124, 70, 1, 66, 194, 4, 0, 1, 0, 1, 0, 0, 28, 32, 0, 4, 156, 154, 125, 70, 194, 26, 0, 28, 0, 1, 0, 0, 28, 32, 0, 16, 32, 1, 5, 3, 209, 174, 255, 255, 255, 255, 255, 255, 255, 255, 255, 126, 1, 67, 194, 4, 0, 1, 0, 1, 0, 0, 28, 32, 0, 4, 156, 154, 127, 70, 1, 69, 194, 4, 0, 1, 0, 1, 0, 0, 28, 32, 0, 4, 156, 154, 126, 70, 1, 70, 194, 4, 0, 1, 0, 1, 0, 0, 28, 32, 0, 4, 209, 173, 58, 70, 194, 108, 0, 28, 0, 1, 0, 0, 28, 32, 0, 16, 32, 1, 5, 0, 54, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 1, 75, 194, 4, 0, 1, 0, 1, 0, 0, 28, 32, 0, 4, 156, 154, 128, 70, 194, 154, 0, 28, 0, 1, 0, 0, 28, 32, 0, 16, 32, 1, 5, 3, 226, 57, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 194, 2, 0, 46, 0, 1, 0, 0, 28, 32, 0, 150, 0, 1, 5, 3, 0, 0, 28, 32, 85, 112, 230, 49, 85, 73, 83, 2, 27, 78, 2, 117, 115, 0, 82, 36, 11, 141, 74, 85, 70, 98, 179, 63, 173, 83, 8, 70, 155, 41, 102, 166, 140, 62, 71, 178, 130, 38, 171, 200, 180, 68, 2, 215, 45, 6, 43, 59, 171, 146, 223, 215, 9, 77, 5, 104, 167, 42, 237, 170, 30, 114, 205, 129, 59, 225, 152, 224, 79, 1, 65, 68, 208, 153, 121, 237, 199, 87, 2, 251, 100, 105, 59, 24, 73, 226, 169, 121, 250, 91, 41, 124, 14, 23, 135, 52, 2, 86, 72, 224, 100, 135, 70, 216, 16, 107, 84, 59, 13, 168, 58, 187, 54, 98, 230, 167, 246, 42, 46, 156, 206, 238, 120, 199, 25, 144, 98, 249, 70, 162, 34, 43, 145, 114, 186, 233, 47, 42, 75, 95, 152, 235, 194, 26, 0, 46, 0, 1, 0, 0, 28, 32, 0, 150, 0, 1, 5, 3, 0, 0, 28, 32, 85, 112, 190, 140, 85, 73, 36, 78, 27, 78, 2, 117, 115, 0, 160, 95, 100, 37, 167, 82, 93, 165, 126, 247, 147, 173, 238, 154, 206, 174, 96, 175, 209, 7, 8, 169, 171, 223, 29, 201, 161, 177, 98, 54, 94, 62, 70, 127, 142, 109, 206, 42, 179, 109, 156, 160, 156, 20, 59, 24, 147, 164, 13, 121, 192, 84, 157, 26, 56, 177, 151, 210, 7, 197, 229, 110, 60, 58, 224, 42, 77, 5, 59, 80, 216, 221, 248, 19, 66, 102, 74, 199, 238, 120, 231, 201, 187, 29, 11, 46, 195, 164, 8, 221, 128, 25, 205, 42, 247, 152, 112, 176, 14, 117, 150, 223, 245, 32, 212, 107, 4, 245, 27, 126, 224, 216, 0, 89, 106, 238, 185, 206, 44, 56, 204, 175, 7, 139, 233, 228, 127, 175, 194, 26, 0, 46, 0, 1, 0, 0, 28, 32, 0, 150, 0, 28, 5, 3, 0, 0, 28, 32, 85, 108, 217, 174, 85, 69, 70, 242, 27, 78, 2, 117, 115, 0, 172, 117, 89, 89, 73, 249, 245, 211, 100, 127, 48, 135, 224, 97, 172, 146, 128, 30, 190, 72, 199, 170, 97, 179, 136, 109, 86, 110, 235, 214, 47, 50, 115, 11, 226, 168, 56, 198, 24, 212, 205, 207, 2, 116, 104, 112, 99, 234, 236, 44, 70, 19, 19, 215, 127, 200, 162, 215, 142, 45, 135, 91, 219, 217, 86, 231, 154, 87, 222, 161, 32, 66, 196, 55, 117, 20, 186, 9, 134, 252, 249, 219, 9, 196, 128, 8, 222, 201, 131, 210, 182, 232, 142, 72, 160, 171, 95, 231, 232, 156, 28, 34, 54, 94, 73, 183, 38, 160, 123, 175, 157, 21, 163, 8, 214, 155, 172, 237, 169, 28, 15, 138, 105, 107, 251, 109, 131, 240, 194, 72, 0, 46, 0, 1, 0, 0, 28, 32, 0, 150, 0, 1, 5, 3, 0, 0, 28, 32, 85, 112, 190, 140, 85, 73, 36, 78, 27, 78, 2, 117, 115, 0, 77, 207, 197, 130, 236, 138, 192, 241, 225, 114, 8, 22, 76, 54, 43, 121, 42, 44, 9, 92, 56, 253, 224, 179, 191, 131, 40, 176, 94, 61, 33, 12, 43, 82, 156, 236, 211, 29, 187, 100, 220, 243, 24, 134, 42, 204, 46, 161, 214, 91, 68, 119, 40, 252, 53, 54, 146, 136, 196, 168, 204, 195, 131, 110, 6, 73, 16, 161, 86, 35, 150, 153, 162, 185, 227, 65, 228, 160, 203, 42, 250, 121, 14, 42, 115, 221, 232, 96, 99, 164, 230, 29, 195, 149, 85, 206, 41, 1, 252, 77, 188, 88, 8, 182, 37, 249, 6, 158, 6, 244, 158, 254, 141, 203, 6, 158, 198, 103, 130, 98, 123, 34, 245, 44, 126, 77, 24, 187, 194, 90, 0, 46, 0, 1, 0, 0, 28, 32, 0, 150, 0, 1, 5, 3, 0, 0, 28, 32, 85, 108, 194, 203, 85, 69, 51, 125, 27, 78, 2, 117, 115, 0, 86, 26, 187, 56, 252, 194, 199, 140, 229, 133, 186, 187, 20, 174, 26, 48, 212, 129, 10, 20, 167, 179, 53, 72, 176, 92, 153, 48, 146, 15, 163, 182, 80, 138, 181, 135, 98, 129, 17, 66, 55, 184, 76, 225, 72, 104, 7, 221, 40, 71, 41, 202, 246, 154, 166, 199, 74, 175, 146, 54, 25, 56, 115, 243}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 621198000), + }, + nb: 5, + }, + { + tcp: layers.TCP{ + ACK: true, + SrcPort: 54842, + DstPort: 53, + Seq: 374511150, + Ack: 3465789226, + BaseLayer: layers.BaseLayer{Payload: []byte{}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 621220000), + }, + nb: 5, + }, + }) +} + +func TestFSMmissingSYNACK(t *testing.T) { + testFSM(t, []testFSMSequence{ + { + tcp: layers.TCP{ + SYN: true, + SrcPort: 54842, + DstPort: 53, + Seq: 374511116, + Ack: 0, + BaseLayer: layers.BaseLayer{Payload: []byte{}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 566690000), + }, + nb: 1, + }, + { + tcp: layers.TCP{ + ACK: true, + SrcPort: 54842, + DstPort: 53, + Seq: 374511117, + Ack: 3465787766, + BaseLayer: layers.BaseLayer{Payload: []byte{}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 590346000), + }, + nb: 1, + }, + { + tcp: layers.TCP{ + ACK: true, + SrcPort: 54842, + DstPort: 53, + Seq: 374511117, + Ack: 3465787766, + BaseLayer: layers.BaseLayer{Payload: []byte{0, 31, 104, 196, 0, 32, 0, 1, 0, 0, 0, 0, 0, 1, 2, 85, 83, 0, 0, 6, 0, 1, 0, 0, 41, 16, 0, 0, 0, 128, 0, 0, 0}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 590387000), + }, + nb: 1, + }, + }) +} + +/* + * Memory test + */ +func TestMemoryShrink(t *testing.T) { + tcp := layers.TCP{ + SrcPort: 1, + DstPort: 2, + SYN: true, + Seq: 999, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}}, + } + a := NewAssembler(NewStreamPool(&testFactoryBench{})) + var before runtime.MemStats + runtime.GC() + runtime.ReadMemStats(&before) + run := 1050 + // Allocate > initial + for i := 0; i < run; i++ { + a.Assemble(netFlow, &tcp) + if tcp.SYN { + tcp.SYN = false + tcp.Seq += 1 + 1 + } + tcp.Seq += 10 + } + var after runtime.MemStats + a.FlushAll() + runtime.GC() + runtime.ReadMemStats(&after) + if after.HeapAlloc < before.HeapAlloc { + t.Fatalf("Nothing allocated for %d run: before: %d, after: %d", run, before.HeapAlloc, after.HeapAlloc) + } + before = after + // Do ~ initial allocs+free() + run *= 2 + for i := 0; i < run; i++ { + a.Assemble(netFlow, &tcp) + if i%50 == 0 { + a.FlushAll() + } + tcp.Seq += 10 + } + runtime.GC() + runtime.ReadMemStats(&after) + if after.HeapAlloc >= before.HeapAlloc { + t.Fatalf("Nothing freed for %d run: before: %d, after: %d", run, before.HeapAlloc, after.HeapAlloc) + } +} + +/* + * Benchmark tests + */ +func BenchmarkSingleStreamNo(b *testing.B) { + t := layers.TCP{ + SrcPort: 1, + DstPort: 2, + SYN: true, + Seq: 1000, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}}, + } + a := NewAssembler(NewStreamPool(&testFactoryBench{})) + for i := 0; i < b.N; i++ { + a.Assemble(netFlow, &t) + if t.SYN { + t.SYN = false + t.Seq++ + } + t.Seq += 10 + } +} + +func BenchmarkSingleStreamSkips(b *testing.B) { + t := layers.TCP{ + SrcPort: 1, + DstPort: 2, + SYN: true, + Seq: 1000, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}}, + } + a := NewAssembler(NewStreamPool(&testFactoryBench{})) + skipped := false + for i := 0; i < b.N; i++ { + if i%10 == 9 { + t.Seq += 10 + skipped = true + } else if skipped { + t.Seq -= 20 + } + a.Assemble(netFlow, &t) + if t.SYN { + t.SYN = false + t.Seq++ + } + t.Seq += 10 + if skipped { + t.Seq += 10 + skipped = false + } + } +} + +func BenchmarkSingleStreamLoss(b *testing.B) { + t := layers.TCP{ + SrcPort: 1, + DstPort: 2, + SYN: true, + Seq: 1000, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}}, + } + a := NewAssembler(NewStreamPool(&testFactoryBench{})) + for i := 0; i < b.N; i++ { + a.Assemble(netFlow, &t) + t.SYN = false + t.Seq += 11 + } +} + +func BenchmarkMultiStreamGrow(b *testing.B) { + t := layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 0, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}}, + } + a := NewAssembler(NewStreamPool(&testFactoryBench{})) + for i := 0; i < b.N; i++ { + t.SrcPort = layers.TCPPort(i) + a.Assemble(netFlow, &t) + t.Seq += 10 + } +} + +func BenchmarkMultiStreamConn(b *testing.B) { + t := layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 0, + SYN: true, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}}, + } + a := NewAssembler(NewStreamPool(&testFactoryBench{})) + for i := 0; i < b.N; i++ { + t.SrcPort = layers.TCPPort(i) + a.Assemble(netFlow, &t) + if i%65536 == 65535 { + if t.SYN { + t.SYN = false + t.Seq++ + } + t.Seq += 10 + } + } +} + +type testMemoryContext struct{} + +func (t *testMemoryContext) GetCaptureInfo() gopacket.CaptureInfo { + return gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 590387000), + } +} + +func TestFullyOrderedAndCompleteStreamDoesNotAlloc(t *testing.T) { + c2s := layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 0, + SYN: true, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}}, + } + s2c := layers.TCP{ + SrcPort: c2s.DstPort, + DstPort: c2s.SrcPort, + Seq: 0, + SYN: true, + ACK: true, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}}, + } + tf := testMemoryFactory{} + a := NewAssembler(NewStreamPool(&tf)) + + ctx := &testMemoryContext{} + // First packet + a.AssembleWithContext(netFlow, &c2s, ctx) + a.AssembleWithContext(netFlow.Reverse(), &s2c, ctx) + c2s.SYN, s2c.SYN = false, false + c2s.ACK = true + c2s.Seq++ + s2c.Seq++ + N := 1000 + if n := testing.AllocsPerRun(N, func() { + c2s.Seq += 10 + s2c.Seq += 10 + c2s.Ack += 10 + s2c.Ack += 10 + a.AssembleWithContext(netFlow, &c2s, ctx) + a.AssembleWithContext(netFlow.Reverse(), &s2c, ctx) + }); n > 0 { + t.Error(n, "mallocs for normal TCP stream") + } + // Ensure all bytes have been through the stream + // +1 for first packet and +1 because AllocsPerRun seems to run fun N+1 times. + if tf.bytes != 10*2*(N+1+1) { + t.Error(tf.bytes, "bytes handled, expected", 10*2*(N+1+1)) + } +} diff --git a/vendor/github.com/google/gopacket/reassembly/tcpcheck.go b/vendor/github.com/google/gopacket/reassembly/tcpcheck.go new file mode 100644 index 0000000..4b52aba --- /dev/null +++ b/vendor/github.com/google/gopacket/reassembly/tcpcheck.go @@ -0,0 +1,246 @@ +// 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 reassembly + +import ( + "encoding/binary" + "fmt" + + "github.com/google/gopacket" + "github.com/google/gopacket/layers" +) + +/* + * Check TCP packet against options (window, MSS) + */ + +type tcpStreamOptions struct { + mss int + scale int + receiveWindow uint +} + +// TCPOptionCheck contains options for the two directions +type TCPOptionCheck struct { + options [2]tcpStreamOptions +} + +func (t *TCPOptionCheck) getOptions(dir TCPFlowDirection) *tcpStreamOptions { + if dir == TCPDirClientToServer { + return &t.options[0] + } + return &t.options[1] +} + +// NewTCPOptionCheck creates default options +func NewTCPOptionCheck() TCPOptionCheck { + return TCPOptionCheck{ + options: [2]tcpStreamOptions{ + tcpStreamOptions{ + mss: 0, + scale: -1, + receiveWindow: 0, + }, tcpStreamOptions{ + mss: 0, + scale: -1, + receiveWindow: 0, + }, + }, + } +} + +// Accept checks whether the packet should be accepted by checking TCP options +func (t *TCPOptionCheck) Accept(tcp *layers.TCP, ci gopacket.CaptureInfo, dir TCPFlowDirection, acked Sequence, start *bool) error { + options := t.getOptions(dir) + if tcp.SYN { + mss := -1 + scale := -1 + for _, o := range tcp.Options { + // MSS + if o.OptionType == 2 { + if len(o.OptionData) != 2 { + return fmt.Errorf("MSS option data length expected 2, got %d", len(o.OptionData)) + } + mss = int(binary.BigEndian.Uint16(o.OptionData[:2])) + } + // Window scaling + if o.OptionType == 3 { + if len(o.OptionData) != 1 { + return fmt.Errorf("Window scaling length expected: 1, got %d", len(o.OptionData)) + } + scale = int(o.OptionData[0]) + } + } + options.mss = mss + options.scale = scale + } else { + if acked != invalidSequence { + revOptions := t.getOptions(dir.Reverse()) + length := len(tcp.Payload) + + // Check packet is in the correct window + diff := acked.Difference(Sequence(tcp.Seq)) + if diff == -1 && (length == 1 || length == 0) { + // This is probably a Keep-alive + // TODO: check byte is ok + } else if diff < 0 { + return fmt.Errorf("Re-emitted packet (diff:%d,seq:%d,rev-ack:%d)", diff, + tcp.Seq, acked) + } else if revOptions.mss > 0 && length > revOptions.mss { + return fmt.Errorf("%d > mss (%d)", length, revOptions.mss) + } else if revOptions.receiveWindow != 0 && revOptions.scale < 0 && diff > int(revOptions.receiveWindow) { + return fmt.Errorf("%d > receiveWindow(%d)", diff, revOptions.receiveWindow) + } + } + } + // Compute receiveWindow + options.receiveWindow = uint(tcp.Window) + if options.scale > 0 { + options.receiveWindow = options.receiveWindow << (uint(options.scale)) + } + return nil +} + +// TCPSimpleFSM implements a very simple TCP state machine +// +// Usage: +// When implementing a Stream interface and to avoid to consider packets that +// would be rejected due to client/server's TCP stack, the Accept() can call +// TCPSimpleFSM.CheckState(). +// +// Limitations: +// - packet should be received in-order. +// - no check on sequence number is performed +// - no RST +type TCPSimpleFSM struct { + dir TCPFlowDirection + state int + options TCPSimpleFSMOptions +} + +// TCPSimpleFSMOptions holds options for TCPSimpleFSM +type TCPSimpleFSMOptions struct { + SupportMissingEstablishment bool // Allow missing SYN, SYN+ACK, ACK +} + +// Internal values of state machine +const ( + TCPStateClosed = 0 + TCPStateSynSent = 1 + TCPStateEstablished = 2 + TCPStateCloseWait = 3 + TCPStateLastAck = 4 + TCPStateReset = 5 +) + +// NewTCPSimpleFSM creates a new TCPSimpleFSM +func NewTCPSimpleFSM(options TCPSimpleFSMOptions) *TCPSimpleFSM { + return &TCPSimpleFSM{ + state: TCPStateClosed, + options: options, + } +} + +func (t *TCPSimpleFSM) String() string { + switch t.state { + case TCPStateClosed: + return "Closed" + case TCPStateSynSent: + return "SynSent" + case TCPStateEstablished: + return "Established" + case TCPStateCloseWait: + return "CloseWait" + case TCPStateLastAck: + return "LastAck" + case TCPStateReset: + return "Reset" + } + return "?" +} + +// CheckState returns false if tcp is invalid wrt current state or update the state machine's state +func (t *TCPSimpleFSM) CheckState(tcp *layers.TCP, dir TCPFlowDirection) bool { + if t.state == TCPStateClosed && t.options.SupportMissingEstablishment && !(tcp.SYN && !tcp.ACK) { + /* try to figure out state */ + switch true { + case tcp.SYN && tcp.ACK: + t.state = TCPStateSynSent + t.dir = dir.Reverse() + case tcp.FIN && !tcp.ACK: + t.state = TCPStateEstablished + case tcp.FIN && tcp.ACK: + t.state = TCPStateCloseWait + t.dir = dir.Reverse() + default: + t.state = TCPStateEstablished + } + } + + switch t.state { + /* openning connection */ + case TCPStateClosed: + if tcp.SYN && !tcp.ACK { + t.dir = dir + t.state = TCPStateSynSent + return true + } + case TCPStateSynSent: + if tcp.RST { + t.state = TCPStateReset + return true + } + + if tcp.SYN && tcp.ACK && dir == t.dir.Reverse() { + t.state = TCPStateEstablished + return true + } + if tcp.SYN && !tcp.ACK && dir == t.dir { + // re-transmission + return true + } + /* established */ + case TCPStateEstablished: + if tcp.RST { + t.state = TCPStateReset + return true + } + + if tcp.FIN { + t.state = TCPStateCloseWait + t.dir = dir + return true + } + // accept any packet + return true + /* closing connection */ + case TCPStateCloseWait: + if tcp.RST { + t.state = TCPStateReset + return true + } + + if tcp.FIN && tcp.ACK && dir == t.dir.Reverse() { + t.state = TCPStateLastAck + return true + } + if tcp.ACK { + return true + } + case TCPStateLastAck: + if tcp.RST { + t.state = TCPStateReset + return true + } + + if tcp.ACK && t.dir == dir { + t.state = TCPStateClosed + return true + } + } + return false +} diff --git a/vendor/github.com/google/gopacket/reassembly/tcpcheck_test.go b/vendor/github.com/google/gopacket/reassembly/tcpcheck_test.go new file mode 100644 index 0000000..4c2391d --- /dev/null +++ b/vendor/github.com/google/gopacket/reassembly/tcpcheck_test.go @@ -0,0 +1,249 @@ +// 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 reassembly + +import ( + "testing" + "time" + + "github.com/google/gopacket" + "github.com/google/gopacket/layers" +) + +// netFlow declared in tcpassembly_test + +/* + * FSM tests + */ + +type testCheckFSMSequence struct { + tcp layers.TCP + ci gopacket.CaptureInfo + expected bool +} + +func testCheckFSM(t *testing.T, options TCPSimpleFSMOptions, s []testCheckFSMSequence) { + fsm := NewTCPSimpleFSM(options) + port := layers.TCPPort(0) + for i, test := range s { + // Fake some values according to ports + flow := netFlow + dir := TCPDirClientToServer + if port == 0 { + port = test.tcp.SrcPort + } + if port != test.tcp.SrcPort { + dir = dir.Reverse() + flow = flow.Reverse() + } + res := fsm.CheckState(&test.tcp, dir) + if res != test.expected { + t.Fatalf("#%d: packet rejected (%s): got %s, expected %s. State:%s", i, gopacket.LayerDump(&test.tcp), res, test.expected, fsm.String()) + } + } +} + +func TestCheckFSM(t *testing.T) { + testCheckFSM(t, TCPSimpleFSMOptions{}, []testCheckFSMSequence{ + { + tcp: layers.TCP{ + SYN: true, + SrcPort: 54842, + DstPort: 53, + Seq: 374511116, + Ack: 0, + BaseLayer: layers.BaseLayer{Payload: []byte{}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 566690000), + }, + expected: true, + }, + { + tcp: layers.TCP{ + SYN: true, + ACK: true, + SrcPort: 53, + DstPort: 54842, + Seq: 3465787765, + Ack: 374511117, + BaseLayer: layers.BaseLayer{Payload: []byte{}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 590332000), + }, + expected: true, + }, + { + tcp: layers.TCP{ + ACK: true, + SrcPort: 54842, + DstPort: 53, + Seq: 374511117, + Ack: 3465787766, + BaseLayer: layers.BaseLayer{Payload: []byte{}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 590346000), + }, + expected: true, + }, + { + tcp: layers.TCP{ + ACK: true, + SrcPort: 54842, + DstPort: 53, + Seq: 374511117, + Ack: 3465787766, + BaseLayer: layers.BaseLayer{Payload: []byte{0, 31, 104, 196, 0, 32, 0, 1, 0, 0, 0, 0, 0, 1, 2, 85, 83, 0, 0, 6, 0, 1, 0, 0, 41, 16, 0, 0, 0, 128, 0, 0, 0}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 590387000), + }, + expected: true, + }, + { + tcp: layers.TCP{ + ACK: true, + SrcPort: 53, + DstPort: 54842, + Seq: 3465787766, + Ack: 374511150, + BaseLayer: layers.BaseLayer{Payload: []byte{}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 613687000), + }, + expected: true, + }, + { + tcp: layers.TCP{ + ACK: true, + SrcPort: 53, + DstPort: 54842, + Seq: 3465787766, + Ack: 374511150, + BaseLayer: layers.BaseLayer{Payload: []byte{8, 133, 104, 196, 132, 0, 0, 1, 0, 2, 0, 7, 0, 19, 2, 85, 83, 0, 0, 6, 0, 1, 2, 117, 115, 0, 0, 6, 0, 1, 0, 0, 3, 132, 0, 54, 1, 97, 5, 99, 99, 116, 108, 100, 192, 20, 10, 104, 111, 115, 116, 109, 97, 115, 116, 101, 114, 7, 110, 101, 117, 115, 116, 97, 114, 3, 98, 105, 122, 0, 120, 18, 40, 205, 0, 0, 3, 132, 0, 0, 3, 132, 0, 9, 58, 128, 0, 1, 81, 128, 192, 20, 0, 46, 0, 1, 0, 0, 3, 132, 0, 150, 0, 6, 5, 1, 0, 0, 3, 132, 85, 138, 90, 146, 85, 98, 191, 130, 27, 78, 2, 117, 115, 0, 69, 13, 35, 189, 141, 225, 107, 238, 108, 182, 207, 44, 105, 31, 212, 103, 32, 93, 217, 108, 20, 231, 188, 28, 241, 237, 104, 182, 117, 121, 195, 112, 64, 96, 237, 248, 6, 181, 186, 96, 60, 6, 18, 29, 188, 96, 201, 140, 251, 61, 71, 177, 108, 156, 9, 83, 125, 172, 188, 75, 81, 67, 218, 55, 93, 131, 243, 15, 190, 75, 4, 165, 226, 124, 49, 67, 142, 131, 239, 240, 76, 225, 10, 242, 68, 88, 240, 200, 27, 97, 102, 73, 92, 73, 133, 170, 175, 198, 99, 109, 90, 16, 162, 101, 95, 96, 102, 250, 91, 74, 80, 3, 87, 167, 50, 230, 9, 213, 7, 222, 197, 87, 183, 190, 148, 247, 207, 204, 192, 118, 0, 2, 0, 1, 0, 7, 233, 0, 0, 10, 1, 102, 5, 99, 99, 116, 108, 100, 192, 12, 192, 118, 0, 2, 0, 1, 0, 7, 233, 0, 0, 4, 1, 97, 193, 8, 192, 118, 0, 2, 0, 1, 0, 7, 233, 0, 0, 4, 1, 98, 193, 8, 192, 118, 0, 2, 0, 1, 0, 7, 233, 0, 0, 4, 1, 99, 193, 8, 192, 118, 0, 2, 0, 1, 0, 7, 233, 0, 0, 4, 1, 101, 193, 8, 192, 118, 0, 2, 0, 1, 0, 7, 233, 0, 0, 4, 1, 107, 193, 8, 192, 118, 0, 46, 0, 1, 0, 7, 233, 0, 0, 150, 0, 2, 5, 1, 0, 7, 233, 0, 85, 127, 33, 92, 85, 87, 134, 98, 27, 78, 2, 117, 115, 0, 19, 227, 175, 75, 88, 245, 164, 158, 150, 198, 57, 253, 150, 179, 161, 52, 24, 56, 229, 176, 175, 40, 45, 232, 188, 171, 131, 197, 107, 125, 218, 192, 78, 221, 146, 33, 114, 55, 43, 12, 131, 213, 51, 98, 37, 2, 102, 161, 232, 115, 177, 210, 51, 169, 215, 133, 56, 190, 91, 75, 8, 222, 231, 202, 139, 28, 187, 249, 72, 21, 23, 56, 63, 72, 126, 142, 242, 195, 242, 64, 208, 134, 100, 157, 197, 159, 43, 148, 20, 70, 117, 152, 159, 35, 200, 220, 49, 234, 173, 210, 91, 34, 210, 192, 7, 197, 112, 117, 208, 234, 42, 49, 133, 237, 197, 14, 244, 149, 191, 142, 36, 252, 42, 48, 182, 189, 9, 68, 1, 65, 5, 67, 67, 84, 76, 68, 193, 126, 0, 1, 0, 1, 0, 0, 28, 32, 0, 4, 156, 154, 124, 70, 1, 66, 194, 4, 0, 1, 0, 1, 0, 0, 28, 32, 0, 4, 156, 154, 125, 70, 194, 26, 0, 28, 0, 1, 0, 0, 28, 32, 0, 16, 32, 1, 5, 3, 209, 174, 255, 255, 255, 255, 255, 255, 255, 255, 255, 126, 1, 67, 194, 4, 0, 1, 0, 1, 0, 0, 28, 32, 0, 4, 156, 154, 127, 70, 1, 69, 194, 4, 0, 1, 0, 1, 0, 0, 28, 32, 0, 4, 156, 154, 126, 70, 1, 70, 194, 4, 0, 1, 0, 1, 0, 0, 28, 32, 0, 4, 209, 173, 58, 70, 194, 108, 0, 28, 0, 1, 0, 0, 28, 32, 0, 16, 32, 1, 5, 0, 54, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 1, 75, 194, 4, 0, 1, 0, 1, 0, 0, 28, 32, 0, 4, 156, 154, 128, 70, 194, 154, 0, 28, 0, 1, 0, 0, 28, 32, 0, 16, 32, 1, 5, 3, 226, 57, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 194, 2, 0, 46, 0, 1, 0, 0, 28, 32, 0, 150, 0, 1, 5, 3, 0, 0, 28, 32, 85, 112, 230, 49, 85, 73, 83, 2, 27, 78, 2, 117, 115, 0, 82, 36, 11, 141, 74, 85, 70, 98, 179, 63, 173, 83, 8, 70, 155, 41, 102, 166, 140, 62, 71, 178, 130, 38, 171, 200, 180, 68, 2, 215, 45, 6, 43, 59, 171, 146, 223, 215, 9, 77, 5, 104, 167, 42, 237, 170, 30, 114, 205, 129, 59, 225, 152, 224, 79, 1, 65, 68, 208, 153, 121, 237, 199, 87, 2, 251, 100, 105, 59, 24, 73, 226, 169, 121, 250, 91, 41, 124, 14, 23, 135, 52, 2, 86, 72, 224, 100, 135, 70, 216, 16, 107, 84, 59, 13, 168, 58, 187, 54, 98, 230, 167, 246, 42, 46, 156, 206, 238, 120, 199, 25, 144, 98, 249, 70, 162, 34, 43, 145, 114, 186, 233, 47, 42, 75, 95, 152, 235, 194, 26, 0, 46, 0, 1, 0, 0, 28, 32, 0, 150, 0, 1, 5, 3, 0, 0, 28, 32, 85, 112, 190, 140, 85, 73, 36, 78, 27, 78, 2, 117, 115, 0, 160, 95, 100, 37, 167, 82, 93, 165, 126, 247, 147, 173, 238, 154, 206, 174, 96, 175, 209, 7, 8, 169, 171, 223, 29, 201, 161, 177, 98, 54, 94, 62, 70, 127, 142, 109, 206, 42, 179, 109, 156, 160, 156, 20, 59, 24, 147, 164, 13, 121, 192, 84, 157, 26, 56, 177, 151, 210, 7, 197, 229, 110, 60, 58, 224, 42, 77, 5, 59, 80, 216, 221, 248, 19, 66, 102, 74, 199, 238, 120, 231, 201, 187, 29, 11, 46, 195, 164, 8, 221, 128, 25, 205, 42, 247, 152, 112, 176, 14, 117, 150, 223, 245, 32, 212, 107, 4, 245, 27, 126, 224, 216, 0, 89, 106, 238, 185, 206, 44, 56, 204, 175, 7, 139, 233, 228, 127, 175, 194, 26, 0, 46, 0, 1, 0, 0, 28, 32, 0, 150, 0, 28, 5, 3, 0, 0, 28, 32, 85, 108, 217, 174, 85, 69, 70, 242, 27, 78, 2, 117, 115, 0, 172, 117, 89, 89, 73, 249, 245, 211, 100, 127, 48, 135, 224, 97, 172, 146, 128, 30, 190, 72, 199, 170, 97, 179, 136, 109, 86, 110, 235, 214, 47, 50, 115, 11, 226, 168, 56, 198, 24, 212, 205, 207, 2, 116, 104, 112, 99, 234, 236, 44, 70, 19, 19, 215, 127, 200, 162, 215, 142, 45, 135, 91, 219, 217, 86, 231, 154, 87, 222, 161, 32, 66, 196, 55, 117, 20, 186, 9, 134, 252, 249, 219, 9, 196, 128, 8, 222, 201, 131, 210, 182, 232, 142, 72, 160, 171, 95, 231, 232, 156, 28, 34, 54, 94, 73, 183, 38, 160, 123, 175, 157, 21, 163, 8, 214, 155, 172, 237, 169, 28, 15, 138, 105, 107, 251, 109, 131, 240, 194, 72, 0, 46, 0, 1, 0, 0, 28, 32, 0, 150, 0, 1, 5, 3, 0, 0, 28, 32, 85, 112, 190, 140, 85, 73, 36, 78, 27, 78, 2, 117, 115, 0, 77, 207, 197, 130, 236, 138, 192, 241, 225, 114, 8, 22, 76, 54, 43, 121, 42, 44, 9, 92, 56, 253, 224, 179, 191, 131, 40, 176, 94, 61, 33, 12, 43, 82, 156, 236, 211, 29, 187, 100, 220, 243, 24, 134, 42, 204, 46, 161, 214, 91, 68, 119, 40, 252, 53, 54, 146, 136, 196, 168, 204, 195, 131, 110, 6, 73, 16, 161, 86, 35, 150, 153, 162, 185, 227, 65, 228, 160, 203, 42, 250, 121, 14, 42, 115, 221, 232, 96, 99, 164, 230, 29, 195, 149, 85, 206, 41, 1, 252, 77, 188, 88, 8, 182, 37, 249, 6, 158, 6, 244, 158, 254, 141, 203, 6, 158, 198, 103, 130, 98, 123, 34, 245, 44, 126, 77, 24, 187, 194, 90, 0, 46, 0, 1, 0, 0, 28, 32, 0, 150, 0, 1, 5, 3, 0, 0, 28, 32, 85, 108, 194, 203, 85, 69, 51, 125, 27, 78, 2, 117, 115, 0, 86, 26, 187, 56, 252, 194, 199, 140, 229, 133, 186, 187, 20, 174, 26, 48, 212, 129, 10, 20, 167, 179, 53, 72, 176, 92, 153, 48, 146, 15, 163, 182, 80, 138, 181, 135, 98, 129, 17, 66, 55, 184, 76, 225, 72, 104, 7, 221, 40, 71, 41, 202, 246, 154, 166, 199, 74, 175, 146, 54, 25, 56, 115, 243}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 621198000), + }, + expected: true, + }, + { + tcp: layers.TCP{ + ACK: true, + SrcPort: 54842, + DstPort: 53, + Seq: 374511150, + Ack: 3465789226, + BaseLayer: layers.BaseLayer{Payload: []byte{}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 621220000), + }, + expected: true, + }, + }) +} + +func TestCheckFSMmissingSYNACK(t *testing.T) { + testCheckFSM(t, TCPSimpleFSMOptions{}, []testCheckFSMSequence{ + { + tcp: layers.TCP{ + SYN: true, + SrcPort: 54842, + DstPort: 53, + Seq: 374511116, + Ack: 0, + BaseLayer: layers.BaseLayer{Payload: []byte{}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 566690000), + }, + expected: true, + }, + { + tcp: layers.TCP{ + ACK: true, + SrcPort: 54842, + DstPort: 53, + Seq: 374511117, + Ack: 3465787766, + BaseLayer: layers.BaseLayer{Payload: []byte{}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 590346000), + }, + expected: false, + }, + { + tcp: layers.TCP{ + ACK: true, + SrcPort: 54842, + DstPort: 53, + Seq: 374511117, + Ack: 3465787766, + BaseLayer: layers.BaseLayer{Payload: []byte{0, 31, 104, 196, 0, 32, 0, 1, 0, 0, 0, 0, 0, 1, 2, 85, 83, 0, 0, 6, 0, 1, 0, 0, 41, 16, 0, 0, 0, 128, 0, 0, 0}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 590387000), + }, + expected: false, + }, + }) +} + +// Support packets w/o SYN (+SYN+ACK) depending on option +func TestCheckFSMmissingSYN(t *testing.T) { + for _, val := range []bool{false, true} { + testCheckFSM(t, TCPSimpleFSMOptions{SupportMissingEstablishment: val}, []testCheckFSMSequence{ + { + tcp: layers.TCP{ + ACK: true, + SrcPort: 54842, + DstPort: 53, + Seq: 12, + Ack: 1012, + BaseLayer: layers.BaseLayer{Payload: []byte{1}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 566690000), + }, + expected: val, + }, + { + tcp: layers.TCP{ + ACK: true, + SrcPort: 53, + DstPort: 54842, + Seq: 1012, + Ack: 13, + BaseLayer: layers.BaseLayer{Payload: []byte{2}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 590346000), + }, + expected: val, + }, + { + tcp: layers.TCP{ + ACK: true, + SrcPort: 53, + DstPort: 54842, + Seq: 1013, + Ack: 13, + BaseLayer: layers.BaseLayer{Payload: []byte{3}}, + }, + ci: gopacket.CaptureInfo{ + Timestamp: time.Unix(1432538521, 590387000), + }, + expected: val, + }, + }) + } +} diff --git a/vendor/github.com/google/gopacket/routing/common.go b/vendor/github.com/google/gopacket/routing/common.go new file mode 100644 index 0000000..a6746d4 --- /dev/null +++ b/vendor/github.com/google/gopacket/routing/common.go @@ -0,0 +1,36 @@ +// 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 routing + +import ( + "net" +) + +// Router implements simple IPv4/IPv6 routing based on the kernel's routing +// table. This routing library has very few features and may actually route +// incorrectly in some cases, but it should work the majority of the time. +type Router interface { + // Route returns where to route a packet based on the packet's source + // and destination IP address. + // + // Callers may pass in nil for src, in which case the src is treated as + // either 0.0.0.0 or ::, depending on whether dst is a v4 or v6 address. + // + // It returns the interface on which to send the packet, the gateway IP + // to send the packet to (if necessary), the preferred src IP to use (if + // available). If the preferred src address is not given in the routing + // table, the first IP address of the interface is provided. + // + // If an error is encountered, iface, geteway, and + // preferredSrc will be nil, and err will be set. + Route(dst net.IP) (iface *net.Interface, gateway, preferredSrc net.IP, err error) + + // RouteWithSrc routes based on source information as well as destination + // information. Either or both of input/src can be nil. If both are, this + // should behave exactly like Route(dst) + RouteWithSrc(input net.HardwareAddr, src, dst net.IP) (iface *net.Interface, gateway, preferredSrc net.IP, err error) +} diff --git a/vendor/github.com/google/gopacket/routing/other.go b/vendor/github.com/google/gopacket/routing/other.go new file mode 100644 index 0000000..b53fea9 --- /dev/null +++ b/vendor/github.com/google/gopacket/routing/other.go @@ -0,0 +1,15 @@ +// 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 !linux + +// Package routing is currently only supported in Linux, but the build system requires a valid go file for all architectures. + +package routing + +func New() (Router, error) { + panic("router only implemented in linux") +} diff --git a/vendor/github.com/google/gopacket/routing/routing.go b/vendor/github.com/google/gopacket/routing/routing.go new file mode 100644 index 0000000..cbbeb6e --- /dev/null +++ b/vendor/github.com/google/gopacket/routing/routing.go @@ -0,0 +1,241 @@ +// 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 linux + +// Package routing provides a very basic but mostly functional implementation of +// a routing table for IPv4/IPv6 addresses. It uses a routing table pulled from +// the kernel via netlink to find the correct interface, gateway, and preferred +// source IP address for packets destined to a particular location. +// +// The routing package is meant to be used with applications that are sending +// raw packet data, which don't have the benefit of having the kernel route +// packets for them. +package routing + +import ( + "bytes" + "errors" + "fmt" + "net" + "sort" + "strings" + "syscall" + "unsafe" +) + +// Pulled from http://man7.org/linux/man-pages/man7/rtnetlink.7.html +// See the section on RTM_NEWROUTE, specifically 'struct rtmsg'. +type routeInfoInMemory struct { + Family byte + DstLen byte + SrcLen byte + TOS byte + + Table byte + Protocol byte + Scope byte + Type byte + + Flags uint32 +} + +// rtInfo contains information on a single route. +type rtInfo struct { + Src, Dst *net.IPNet + Gateway, PrefSrc net.IP + // We currently ignore the InputIface. + InputIface, OutputIface uint32 + Priority uint32 +} + +// routeSlice implements sort.Interface to sort routes by Priority. +type routeSlice []*rtInfo + +func (r routeSlice) Len() int { + return len(r) +} +func (r routeSlice) Less(i, j int) bool { + return r[i].Priority < r[j].Priority +} +func (r routeSlice) Swap(i, j int) { + r[i], r[j] = r[j], r[i] +} + +type router struct { + ifaces []net.Interface + addrs []ipAddrs + v4, v6 routeSlice +} + +func (r *router) String() string { + strs := []string{"ROUTER", "--- V4 ---"} + for _, route := range r.v4 { + strs = append(strs, fmt.Sprintf("%+v", *route)) + } + strs = append(strs, "--- V6 ---") + for _, route := range r.v6 { + strs = append(strs, fmt.Sprintf("%+v", *route)) + } + return strings.Join(strs, "\n") +} + +type ipAddrs struct { + v4, v6 net.IP +} + +func (r *router) Route(dst net.IP) (iface *net.Interface, gateway, preferredSrc net.IP, err error) { + return r.RouteWithSrc(nil, nil, dst) +} + +func (r *router) RouteWithSrc(input net.HardwareAddr, src, dst net.IP) (iface *net.Interface, gateway, preferredSrc net.IP, err error) { + var ifaceIndex int + switch { + case dst.To4() != nil: + ifaceIndex, gateway, preferredSrc, err = r.route(r.v4, input, src, dst) + case dst.To16() != nil: + ifaceIndex, gateway, preferredSrc, err = r.route(r.v6, input, src, dst) + default: + err = errors.New("IP is not valid as IPv4 or IPv6") + return + } + + // Interfaces are 1-indexed, but we store them in a 0-indexed array. + ifaceIndex-- + + iface = &r.ifaces[ifaceIndex] + if preferredSrc == nil { + switch { + case dst.To4() != nil: + preferredSrc = r.addrs[ifaceIndex].v4 + case dst.To16() != nil: + preferredSrc = r.addrs[ifaceIndex].v6 + } + } + return +} + +func (r *router) route(routes routeSlice, input net.HardwareAddr, src, dst net.IP) (iface int, gateway, preferredSrc net.IP, err error) { + var inputIndex uint32 + if input != nil { + for i, iface := range r.ifaces { + if bytes.Equal(input, iface.HardwareAddr) { + // Convert from zero- to one-indexed. + inputIndex = uint32(i + 1) + break + } + } + } + for _, rt := range routes { + if rt.InputIface != 0 && rt.InputIface != inputIndex { + continue + } + if rt.Src != nil && !rt.Src.Contains(src) { + continue + } + if rt.Dst != nil && !rt.Dst.Contains(dst) { + continue + } + return int(rt.OutputIface), rt.Gateway, rt.PrefSrc, nil + } + err = fmt.Errorf("no route found for %v", dst) + return +} + +// New creates a new router object. The router returned by New currently does +// not update its routes after construction... care should be taken for +// long-running programs to call New() regularly to take into account any +// changes to the routing table which have occurred since the last New() call. +func New() (Router, error) { + rtr := &router{} + tab, err := syscall.NetlinkRIB(syscall.RTM_GETROUTE, syscall.AF_UNSPEC) + if err != nil { + return nil, err + } + msgs, err := syscall.ParseNetlinkMessage(tab) + if err != nil { + return nil, err + } +loop: + for _, m := range msgs { + switch m.Header.Type { + case syscall.NLMSG_DONE: + break loop + case syscall.RTM_NEWROUTE: + rt := (*routeInfoInMemory)(unsafe.Pointer(&m.Data[0])) + routeInfo := rtInfo{} + attrs, err := syscall.ParseNetlinkRouteAttr(&m) + if err != nil { + return nil, err + } + switch rt.Family { + case syscall.AF_INET: + rtr.v4 = append(rtr.v4, &routeInfo) + case syscall.AF_INET6: + rtr.v6 = append(rtr.v6, &routeInfo) + default: + continue loop + } + for _, attr := range attrs { + switch attr.Attr.Type { + case syscall.RTA_DST: + routeInfo.Dst = &net.IPNet{ + IP: net.IP(attr.Value), + Mask: net.CIDRMask(int(rt.DstLen), len(attr.Value)*8), + } + case syscall.RTA_SRC: + routeInfo.Src = &net.IPNet{ + IP: net.IP(attr.Value), + Mask: net.CIDRMask(int(rt.SrcLen), len(attr.Value)*8), + } + case syscall.RTA_GATEWAY: + routeInfo.Gateway = net.IP(attr.Value) + case syscall.RTA_PREFSRC: + routeInfo.PrefSrc = net.IP(attr.Value) + case syscall.RTA_IIF: + routeInfo.InputIface = *(*uint32)(unsafe.Pointer(&attr.Value[0])) + case syscall.RTA_OIF: + routeInfo.OutputIface = *(*uint32)(unsafe.Pointer(&attr.Value[0])) + case syscall.RTA_PRIORITY: + routeInfo.Priority = *(*uint32)(unsafe.Pointer(&attr.Value[0])) + } + } + } + } + sort.Sort(rtr.v4) + sort.Sort(rtr.v6) + ifaces, err := net.Interfaces() + if err != nil { + return nil, err + } + for i, iface := range ifaces { + if i != iface.Index-1 { + return nil, fmt.Errorf("out of order iface %d = %v", i, iface) + } + rtr.ifaces = append(rtr.ifaces, iface) + var addrs ipAddrs + ifaceAddrs, err := iface.Addrs() + if err != nil { + return nil, err + } + for _, addr := range ifaceAddrs { + if inet, ok := addr.(*net.IPNet); ok { + // Go has a nasty habit of giving you IPv4s as ::ffff:1.2.3.4 instead of 1.2.3.4. + // We want to use mapped v4 addresses as v4 preferred addresses, never as v6 + // preferred addresses. + if v4 := inet.IP.To4(); v4 != nil { + if addrs.v4 == nil { + addrs.v4 = v4 + } + } else if addrs.v6 == nil { + addrs.v6 = inet.IP + } + } + } + rtr.addrs = append(rtr.addrs, addrs) + } + return rtr, nil +} diff --git a/vendor/github.com/google/gopacket/tcpassembly/assembly.go b/vendor/github.com/google/gopacket/tcpassembly/assembly.go new file mode 100644 index 0000000..50f6487 --- /dev/null +++ b/vendor/github.com/google/gopacket/tcpassembly/assembly.go @@ -0,0 +1,788 @@ +// 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 tcpassembly provides TCP stream re-assembly. +// +// The tcpassembly package implements uni-directional TCP reassembly, for use in +// packet-sniffing applications. The caller reads packets off the wire, then +// presents them to an Assembler in the form of gopacket layers.TCP packets +// (github.com/google/gopacket, github.com/google/gopacket/layers). +// +// The Assembler uses a user-supplied +// StreamFactory to create a user-defined Stream interface, then passes packet +// data in stream order to that object. A concurrency-safe StreamPool keeps +// track of all current Streams being reassembled, so multiple Assemblers may +// run at once to assemble packets while taking advantage of multiple cores. +package tcpassembly + +import ( + "flag" + "fmt" + "github.com/google/gopacket" + "github.com/google/gopacket/layers" + "log" + "sync" + "time" +) + +var memLog = flag.Bool("assembly_memuse_log", false, "If true, the github.com/google/gopacket/tcpassembly library will log information regarding its memory use every once in a while.") +var debugLog = flag.Bool("assembly_debug_log", false, "If true, the github.com/google/gopacket/tcpassembly library will log verbose debugging information (at least one line per packet)") + +const invalidSequence = -1 +const uint32Max = 0xFFFFFFFF + +// Sequence is a TCP sequence number. It provides a few convenience functions +// for handling TCP wrap-around. The sequence should always be in the range +// [0,0xFFFFFFFF]... its other bits are simply used in wrap-around calculations +// and should never be set. +type Sequence int64 + +// Difference defines an ordering for comparing TCP sequences that's safe for +// roll-overs. It returns: +// > 0 : if t comes after s +// < 0 : if t comes before s +// 0 : if t == s +// The number returned is the sequence difference, so 4.Difference(8) will +// return 4. +// +// It handles rollovers by considering any sequence in the first quarter of the +// uint32 space to be after any sequence in the last quarter of that space, thus +// wrapping the uint32 space. +func (s Sequence) Difference(t Sequence) int { + if s > uint32Max-uint32Max/4 && t < uint32Max/4 { + t += uint32Max + } else if t > uint32Max-uint32Max/4 && s < uint32Max/4 { + s += uint32Max + } + return int(t - s) +} + +// Add adds an integer to a sequence and returns the resulting sequence. +func (s Sequence) Add(t int) Sequence { + return (s + Sequence(t)) & uint32Max +} + +// Reassembly objects are passed by an Assembler into Streams using the +// Reassembled call. Callers should not need to create these structs themselves +// except for testing. +type Reassembly struct { + // Bytes is the next set of bytes in the stream. May be empty. + Bytes []byte + // Skip is set to non-zero if bytes were skipped between this and the + // last Reassembly. If this is the first packet in a connection and we + // didn't see the start, we have no idea how many bytes we skipped, so + // we set it to -1. Otherwise, it's set to the number of bytes skipped. + Skip int + // Start is set if this set of bytes has a TCP SYN accompanying it. + Start bool + // End is set if this set of bytes has a TCP FIN or RST accompanying it. + End bool + // Seen is the timestamp this set of bytes was pulled off the wire. + Seen time.Time +} + +const pageBytes = 1900 + +// page is used to store TCP data we're not ready for yet (out-of-order +// packets). Unused pages are stored in and returned from a pageCache, which +// avoids memory allocation. Used pages are stored in a doubly-linked list in +// a connection. +type page struct { + Reassembly + seq Sequence + index int + prev, next *page + buf [pageBytes]byte +} + +// pageCache is a concurrency-unsafe store of page objects we use to avoid +// memory allocation as much as we can. It grows but never shrinks. +type pageCache struct { + free []*page + pcSize int + size, used int + pages [][]page + pageRequests int64 +} + +const initialAllocSize = 1024 + +func newPageCache() *pageCache { + pc := &pageCache{ + free: make([]*page, 0, initialAllocSize), + pcSize: initialAllocSize, + } + pc.grow() + return pc +} + +// grow exponentially increases the size of our page cache as much as necessary. +func (c *pageCache) grow() { + pages := make([]page, c.pcSize) + c.pages = append(c.pages, pages) + c.size += c.pcSize + for i := range pages { + c.free = append(c.free, &pages[i]) + } + if *memLog { + log.Println("PageCache: created", c.pcSize, "new pages") + } + c.pcSize *= 2 +} + +// next returns a clean, ready-to-use page object. +func (c *pageCache) next(ts time.Time) (p *page) { + if *memLog { + c.pageRequests++ + if c.pageRequests&0xFFFF == 0 { + log.Println("PageCache:", c.pageRequests, "requested,", c.used, "used,", len(c.free), "free") + } + } + if len(c.free) == 0 { + c.grow() + } + i := len(c.free) - 1 + p, c.free = c.free[i], c.free[:i] + p.prev = nil + p.next = nil + p.Seen = ts + p.Bytes = p.buf[:0] + c.used++ + return p +} + +// replace replaces a page into the pageCache. +func (c *pageCache) replace(p *page) { + c.used-- + c.free = append(c.free, p) +} + +// Stream is implemented by the caller to handle incoming reassembled +// TCP data. Callers create a StreamFactory, then StreamPool uses +// it to create a new Stream for every TCP stream. +// +// assembly will, in order: +// 1) Create the stream via StreamFactory.New +// 2) Call Reassembled 0 or more times, passing in reassembled TCP data in order +// 3) Call ReassemblyComplete one time, after which the stream is dereferenced by assembly. +type Stream interface { + // Reassembled is called zero or more times. assembly guarantees + // that the set of all Reassembly objects passed in during all + // calls are presented in the order they appear in the TCP stream. + // Reassembly objects are reused after each Reassembled call, + // so it's important to copy anything you need out of them + // (specifically out of Reassembly.Bytes) that you need to stay + // around after you return from the Reassembled call. + Reassembled([]Reassembly) + // ReassemblyComplete is called when assembly decides there is + // no more data for this Stream, either because a FIN or RST packet + // was seen, or because the stream has timed out without any new + // packet data (due to a call to FlushOlderThan). + ReassemblyComplete() +} + +// StreamFactory is used by assembly to create a new stream for each +// new TCP session. +type StreamFactory interface { + // New should return a new stream for the given TCP key. + New(netFlow, tcpFlow gopacket.Flow) Stream +} + +func (p *StreamPool) connections() []*connection { + p.mu.RLock() + conns := make([]*connection, 0, len(p.conns)) + for _, conn := range p.conns { + conns = append(conns, conn) + } + p.mu.RUnlock() + return conns +} + +// FlushOptions provide options for flushing connections. +type FlushOptions struct { + T time.Time // If nonzero, only connections with data older than T are flushed + CloseAll bool // If true, ALL connections are closed post flush, not just those that correctly see FIN/RST. +} + +// FlushWithOptions finds any streams waiting for packets older than +// the given time, and pushes through the data they have (IE: tells +// them to stop waiting and skip the data they're waiting for). +// +// Each Stream maintains a list of zero or more sets of bytes it has received +// out-of-order. For example, if it has processed up through sequence number +// 10, it might have bytes [15-20), [20-25), [30,50) in its list. Each set of +// bytes also has the timestamp it was originally viewed. A flush call will +// look at the smallest subsequent set of bytes, in this case [15-20), and if +// its timestamp is older than the passed-in time, it will push it and all +// contiguous byte-sets out to the Stream's Reassembled function. In this case, +// it will push [15-20), but also [20-25), since that's contiguous. It will +// only push [30-50) if its timestamp is also older than the passed-in time, +// otherwise it will wait until the next FlushOlderThan to see if bytes [25-30) +// come in. +// +// If it pushes all bytes (or there were no sets of bytes to begin with) +// AND the connection has not received any bytes since the passed-in time, +// the connection will be closed. +// +// If CloseAll is set, it will close out connections that have been drained. +// Regardless of the CloseAll setting, connections stale for the specified +// time will be closed. +// +// Returns the number of connections flushed, and of those, the number closed +// because of the flush. +func (a *Assembler) FlushWithOptions(opt FlushOptions) (flushed, closed int) { + conns := a.connPool.connections() + closes := 0 + flushes := 0 + for _, conn := range conns { + flushed := false + conn.mu.Lock() + if conn.closed { + // Already closed connection, nothing to do here. + conn.mu.Unlock() + continue + } + for conn.first != nil && conn.first.Seen.Before(opt.T) { + a.skipFlush(conn) + flushed = true + if conn.closed { + closes++ + break + } + } + if opt.CloseAll && !conn.closed && conn.first == nil && conn.lastSeen.Before(opt.T) { + flushed = true + a.closeConnection(conn) + closes++ + } + if flushed { + flushes++ + } + conn.mu.Unlock() + } + return flushes, closes +} + +// FlushOlderThan calls FlushWithOptions with the CloseAll option set to true. +func (a *Assembler) FlushOlderThan(t time.Time) (flushed, closed int) { + return a.FlushWithOptions(FlushOptions{CloseAll: true, T: t}) +} + +// FlushAll flushes all remaining data into all remaining connections, closing +// those connections. It returns the total number of connections flushed/closed +// by the call. +func (a *Assembler) FlushAll() (closed int) { + conns := a.connPool.connections() + closed = len(conns) + for _, conn := range conns { + conn.mu.Lock() + for !conn.closed { + a.skipFlush(conn) + } + conn.mu.Unlock() + } + return +} + +type key [2]gopacket.Flow + +func (k *key) String() string { + return fmt.Sprintf("%s:%s", k[0], k[1]) +} + +// StreamPool stores all streams created by Assemblers, allowing multiple +// assemblers to work together on stream processing while enforcing the fact +// that a single stream receives its data serially. It is safe +// for concurrency, usable by multiple Assemblers at once. +// +// StreamPool handles the creation and storage of Stream objects used by one or +// more Assembler objects. When a new TCP stream is found by an Assembler, it +// creates an associated Stream by calling its StreamFactory's New method. +// Thereafter (until the stream is closed), that Stream object will receive +// assembled TCP data via Assembler's calls to the stream's Reassembled +// function. +// +// Like the Assembler, StreamPool attempts to minimize allocation. Unlike the +// Assembler, though, it does have to do some locking to make sure that the +// connection objects it stores are accessible to multiple Assemblers. +type StreamPool struct { + conns map[key]*connection + users int + mu sync.RWMutex + factory StreamFactory + free []*connection + all [][]connection + nextAlloc int + newConnectionCount int64 +} + +func (p *StreamPool) grow() { + conns := make([]connection, p.nextAlloc) + p.all = append(p.all, conns) + for i := range conns { + p.free = append(p.free, &conns[i]) + } + if *memLog { + log.Println("StreamPool: created", p.nextAlloc, "new connections") + } + p.nextAlloc *= 2 +} + +// NewStreamPool creates a new connection pool. Streams will +// be created as necessary using the passed-in StreamFactory. +func NewStreamPool(factory StreamFactory) *StreamPool { + return &StreamPool{ + conns: make(map[key]*connection, initialAllocSize), + free: make([]*connection, 0, initialAllocSize), + factory: factory, + nextAlloc: initialAllocSize, + } +} + +const assemblerReturnValueInitialSize = 16 + +// NewAssembler creates a new assembler. Pass in the StreamPool +// to use, may be shared across assemblers. +// +// This sets some sane defaults for the assembler options, +// see DefaultAssemblerOptions for details. +func NewAssembler(pool *StreamPool) *Assembler { + pool.mu.Lock() + pool.users++ + pool.mu.Unlock() + return &Assembler{ + ret: make([]Reassembly, assemblerReturnValueInitialSize), + pc: newPageCache(), + connPool: pool, + AssemblerOptions: DefaultAssemblerOptions, + } +} + +// DefaultAssemblerOptions provides default options for an assembler. +// These options are used by default when calling NewAssembler, so if +// modified before a NewAssembler call they'll affect the resulting Assembler. +// +// Note that the default options can result in ever-increasing memory usage +// unless one of the Flush* methods is called on a regular basis. +var DefaultAssemblerOptions = AssemblerOptions{ + MaxBufferedPagesPerConnection: 0, // unlimited + MaxBufferedPagesTotal: 0, // unlimited +} + +type connection struct { + key key + pages int + first, last *page + nextSeq Sequence + created, lastSeen time.Time + stream Stream + closed bool + mu sync.Mutex +} + +func (c *connection) reset(k key, s Stream, ts time.Time) { + c.key = k + c.pages = 0 + c.first, c.last = nil, nil + c.nextSeq = invalidSequence + c.created = ts + c.stream = s + c.closed = false +} + +// AssemblerOptions controls the behavior of each assembler. Modify the +// options of each assembler you create to change their behavior. +type AssemblerOptions struct { + // MaxBufferedPagesTotal is an upper limit on the total number of pages to + // buffer while waiting for out-of-order packets. Once this limit is + // reached, the assembler will degrade to flushing every connection it + // gets a packet for. If <= 0, this is ignored. + MaxBufferedPagesTotal int + // MaxBufferedPagesPerConnection is an upper limit on the number of pages + // buffered for a single connection. Should this limit be reached for a + // particular connection, the smallest sequence number will be flushed, along + // with any contiguous data. If <= 0, this is ignored. + MaxBufferedPagesPerConnection int +} + +// Assembler handles reassembling TCP streams. It is not safe for +// concurrency... after passing a packet in via the Assemble call, the caller +// must wait for that call to return before calling Assemble again. Callers can +// get around this by creating multiple assemblers that share a StreamPool. In +// that case, each individual stream will still be handled serially (each stream +// has an individual mutex associated with it), however multiple assemblers can +// assemble different connections concurrently. +// +// The Assembler provides (hopefully) fast TCP stream re-assembly for sniffing +// applications written in Go. The Assembler uses the following methods to be +// as fast as possible, to keep packet processing speedy: +// +// Avoids Lock Contention +// +// Assemblers locks connections, but each connection has an individual lock, and +// rarely will two Assemblers be looking at the same connection. Assemblers +// lock the StreamPool when looking up connections, but they use Reader +// locks initially, and only force a write lock if they need to create a new +// connection or close one down. These happen much less frequently than +// individual packet handling. +// +// Each assembler runs in its own goroutine, and the only state shared between +// goroutines is through the StreamPool. Thus all internal Assembler state +// can be handled without any locking. +// +// NOTE: If you can guarantee that packets going to a set of Assemblers will +// contain information on different connections per Assembler (for example, +// they're already hashed by PF_RING hashing or some other hashing mechanism), +// then we recommend you use a seperate StreamPool per Assembler, thus +// avoiding all lock contention. Only when different Assemblers could receive +// packets for the same Stream should a StreamPool be shared between them. +// +// Avoids Memory Copying +// +// In the common case, handling of a single TCP packet should result in zero +// memory allocations. The Assembler will look up the connection, figure out +// that the packet has arrived in order, and immediately pass that packet on to +// the appropriate connection's handling code. Only if a packet arrives out of +// order is its contents copied and stored in memory for later. +// +// Avoids Memory Allocation +// +// Assemblers try very hard to not use memory allocation unless absolutely +// necessary. Packet data for sequential packets is passed directly to streams +// with no copying or allocation. Packet data for out-of-order packets is +// copied into reusable pages, and new pages are only allocated rarely when the +// page cache runs out. Page caches are Assembler-specific, thus not used +// concurrently and requiring no locking. +// +// Internal representations for connection objects are also reused over time. +// Because of this, the most common memory allocation done by the Assembler is +// generally what's done by the caller in StreamFactory.New. If no allocation +// is done there, then very little allocation is done ever, mostly to handle +// large increases in bandwidth or numbers of connections. +// +// TODO: The page caches used by an Assembler will grow to the size necessary +// to handle a workload, and currently will never shrink. This means that +// traffic spikes can result in large memory usage which isn't garbage +// collected when typical traffic levels return. +type Assembler struct { + AssemblerOptions + ret []Reassembly + pc *pageCache + connPool *StreamPool +} + +func (p *StreamPool) newConnection(k key, s Stream, ts time.Time) (c *connection) { + if *memLog { + p.newConnectionCount++ + if p.newConnectionCount&0x7FFF == 0 { + log.Println("StreamPool:", p.newConnectionCount, "requests,", len(p.conns), "used,", len(p.free), "free") + } + } + if len(p.free) == 0 { + p.grow() + } + index := len(p.free) - 1 + c, p.free = p.free[index], p.free[:index] + c.reset(k, s, ts) + return c +} + +// getConnection returns a connection. If end is true and a connection +// does not already exist, returns nil. This allows us to check for a +// connection without actually creating one if it doesn't already exist. +func (p *StreamPool) getConnection(k key, end bool, ts time.Time) *connection { + p.mu.RLock() + conn := p.conns[k] + p.mu.RUnlock() + if end || conn != nil { + return conn + } + s := p.factory.New(k[0], k[1]) + p.mu.Lock() + conn = p.newConnection(k, s, ts) + if conn2 := p.conns[k]; conn2 != nil { + p.mu.Unlock() + return conn2 + } + p.conns[k] = conn + p.mu.Unlock() + return conn +} + +// Assemble calls AssembleWithTimestamp with the current timestamp, useful for +// packets being read directly off the wire. +func (a *Assembler) Assemble(netFlow gopacket.Flow, t *layers.TCP) { + a.AssembleWithTimestamp(netFlow, t, time.Now()) +} + +// AssembleWithTimestamp reassembles the given TCP packet into its appropriate +// stream. +// +// The timestamp passed in must be the timestamp the packet was seen. +// For packets read off the wire, time.Now() should be fine. For packets read +// from PCAP files, CaptureInfo.Timestamp should be passed in. This timestamp +// will affect which streams are flushed by a call to FlushOlderThan. +// +// Each Assemble call results in, in order: +// +// zero or one calls to StreamFactory.New, creating a stream +// zero or one calls to Reassembled on a single stream +// zero or one calls to ReassemblyComplete on the same stream +func (a *Assembler) AssembleWithTimestamp(netFlow gopacket.Flow, t *layers.TCP, timestamp time.Time) { + // Ignore empty TCP packets + if !t.SYN && !t.FIN && !t.RST && len(t.LayerPayload()) == 0 { + if *debugLog { + log.Println("ignoring useless packet") + } + return + } + + a.ret = a.ret[:0] + key := key{netFlow, t.TransportFlow()} + var conn *connection + // This for loop handles a race condition where a connection will close, lock + // the connection pool, and remove itself, but before it locked the connection + // pool it's returned to another Assemble statement. This should loop 0-1 + // times for the VAST majority of cases. + for { + conn = a.connPool.getConnection( + key, !t.SYN && len(t.LayerPayload()) == 0, timestamp) + if conn == nil { + if *debugLog { + log.Printf("%v got empty packet on otherwise empty connection", key) + } + return + } + conn.mu.Lock() + if !conn.closed { + break + } + conn.mu.Unlock() + } + if conn.lastSeen.Before(timestamp) { + conn.lastSeen = timestamp + } + seq, bytes := Sequence(t.Seq), t.Payload + if conn.nextSeq == invalidSequence { + if t.SYN { + if *debugLog { + log.Printf("%v saw first SYN packet, returning immediately, seq=%v", key, seq) + } + a.ret = append(a.ret, Reassembly{ + Bytes: bytes, + Skip: 0, + Start: true, + Seen: timestamp, + }) + conn.nextSeq = seq.Add(len(bytes) + 1) + } else { + if *debugLog { + log.Printf("%v waiting for start, storing into connection", key) + } + a.insertIntoConn(t, conn, timestamp) + } + } else if diff := conn.nextSeq.Difference(seq); diff > 0 { + if *debugLog { + log.Printf("%v gap in sequence numbers (%v, %v) diff %v, storing into connection", key, conn.nextSeq, seq, diff) + } + a.insertIntoConn(t, conn, timestamp) + } else { + bytes, conn.nextSeq = byteSpan(conn.nextSeq, seq, bytes) + if *debugLog { + log.Printf("%v found contiguous data (%v, %v), returning immediately", key, seq, conn.nextSeq) + } + a.ret = append(a.ret, Reassembly{ + Bytes: bytes, + Skip: 0, + End: t.RST || t.FIN, + Seen: timestamp, + }) + } + if len(a.ret) > 0 { + a.sendToConnection(conn) + } + conn.mu.Unlock() +} + +func byteSpan(expected, received Sequence, bytes []byte) (toSend []byte, next Sequence) { + if expected == invalidSequence { + return bytes, received.Add(len(bytes)) + } + span := int(received.Difference(expected)) + if span <= 0 { + return bytes, received.Add(len(bytes)) + } else if len(bytes) < span { + return nil, expected + } + return bytes[span:], expected.Add(len(bytes) - span) +} + +// sendToConnection sends the current values in a.ret to the connection, closing +// the connection if the last thing sent had End set. +func (a *Assembler) sendToConnection(conn *connection) { + a.addContiguous(conn) + if conn.stream == nil { + panic("why?") + } + conn.stream.Reassembled(a.ret) + if a.ret[len(a.ret)-1].End { + a.closeConnection(conn) + } +} + +// addContiguous adds contiguous byte-sets to a connection. +func (a *Assembler) addContiguous(conn *connection) { + for conn.first != nil && conn.nextSeq.Difference(conn.first.seq) <= 0 { + a.addNextFromConn(conn) + } +} + +// skipFlush skips the first set of bytes we're waiting for and returns the +// first set of bytes we have. If we have no bytes pending, it closes the +// connection. +func (a *Assembler) skipFlush(conn *connection) { + if *debugLog { + log.Printf("%v skipFlush %v", conn.key, conn.nextSeq) + } + if conn.first == nil { + a.closeConnection(conn) + return + } + a.ret = a.ret[:0] + a.addNextFromConn(conn) + a.addContiguous(conn) + a.sendToConnection(conn) +} + +func (p *StreamPool) remove(conn *connection) { + p.mu.Lock() + delete(p.conns, conn.key) + p.free = append(p.free, conn) + p.mu.Unlock() +} + +func (a *Assembler) closeConnection(conn *connection) { + if *debugLog { + log.Printf("%v closing", conn.key) + } + conn.stream.ReassemblyComplete() + conn.closed = true + a.connPool.remove(conn) + for p := conn.first; p != nil; p = p.next { + a.pc.replace(p) + } +} + +// traverseConn traverses our doubly-linked list of pages for the correct +// position to put the given sequence number. Note that it traverses backwards, +// starting at the highest sequence number and going down, since we assume the +// common case is that TCP packets for a stream will appear in-order, with +// minimal loss or packet reordering. +func (c *connection) traverseConn(seq Sequence) (prev, current *page) { + prev = c.last + for prev != nil && prev.seq.Difference(seq) < 0 { + current = prev + prev = current.prev + } + return +} + +// pushBetween inserts the doubly-linked list first-...-last in between the +// nodes prev-next in another doubly-linked list. If prev is nil, makes first +// the new first page in the connection's list. If next is nil, makes last the +// new last page in the list. first/last may point to the same page. +func (c *connection) pushBetween(prev, next, first, last *page) { + // Maintain our doubly linked list + if next == nil || c.last == nil { + c.last = last + } else { + last.next = next + next.prev = last + } + if prev == nil || c.first == nil { + c.first = first + } else { + first.prev = prev + prev.next = first + } +} + +func (a *Assembler) insertIntoConn(t *layers.TCP, conn *connection, ts time.Time) { + if conn.first != nil && conn.first.seq == conn.nextSeq { + panic("wtf") + } + p, p2, numPages := a.pagesFromTCP(t, ts) + prev, current := conn.traverseConn(Sequence(t.Seq)) + conn.pushBetween(prev, current, p, p2) + conn.pages += numPages + if (a.MaxBufferedPagesPerConnection > 0 && conn.pages >= a.MaxBufferedPagesPerConnection) || + (a.MaxBufferedPagesTotal > 0 && a.pc.used >= a.MaxBufferedPagesTotal) { + if *debugLog { + log.Printf("%v hit max buffer size: %+v, %v, %v", conn.key, a.AssemblerOptions, conn.pages, a.pc.used) + } + a.addNextFromConn(conn) + } +} + +// pagesFromTCP creates a page (or set of pages) from a TCP packet. Note that +// it should NEVER receive a SYN packet, as it doesn't handle sequences +// correctly. +// +// It returns the first and last page in its doubly-linked list of new pages. +func (a *Assembler) pagesFromTCP(t *layers.TCP, ts time.Time) (p, p2 *page, numPages int) { + first := a.pc.next(ts) + current := first + numPages++ + seq, bytes := Sequence(t.Seq), t.Payload + for { + length := min(len(bytes), pageBytes) + current.Bytes = current.buf[:length] + copy(current.Bytes, bytes) + current.seq = seq + bytes = bytes[length:] + if len(bytes) == 0 { + break + } + seq = seq.Add(length) + current.next = a.pc.next(ts) + current.next.prev = current + current = current.next + numPages++ + } + current.End = t.RST || t.FIN + return first, current, numPages +} + +// addNextFromConn pops the first page from a connection off and adds it to the +// return array. +func (a *Assembler) addNextFromConn(conn *connection) { + if conn.nextSeq == invalidSequence { + conn.first.Skip = -1 + } else if diff := conn.nextSeq.Difference(conn.first.seq); diff > 0 { + conn.first.Skip = int(diff) + } + conn.first.Bytes, conn.nextSeq = byteSpan(conn.nextSeq, conn.first.seq, conn.first.Bytes) + if *debugLog { + log.Printf("%v adding from conn (%v, %v)", conn.key, conn.first.seq, conn.nextSeq) + } + a.ret = append(a.ret, conn.first.Reassembly) + a.pc.replace(conn.first) + if conn.first == conn.last { + conn.first = nil + conn.last = nil + } else { + conn.first = conn.first.next + conn.first.prev = nil + } + conn.pages-- +} + +func min(a, b int) int { + if a < b { + return a + } + return b +} diff --git a/vendor/github.com/google/gopacket/tcpassembly/assembly_test.go b/vendor/github.com/google/gopacket/tcpassembly/assembly_test.go new file mode 100644 index 0000000..1bd2842 --- /dev/null +++ b/vendor/github.com/google/gopacket/tcpassembly/assembly_test.go @@ -0,0 +1,562 @@ +// 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 tcpassembly + +import ( + "github.com/google/gopacket" + "github.com/google/gopacket/layers" + "net" + "reflect" + "testing" + "time" +) + +var netFlow gopacket.Flow + +func init() { + netFlow, _ = gopacket.FlowFromEndpoints( + layers.NewIPEndpoint(net.IP{1, 2, 3, 4}), + layers.NewIPEndpoint(net.IP{5, 6, 7, 8})) +} + +type testSequence struct { + in layers.TCP + want []Reassembly +} + +type testFactory struct { + reassembly []Reassembly +} + +func (t *testFactory) New(a, b gopacket.Flow) Stream { + return t +} +func (t *testFactory) Reassembled(r []Reassembly) { + t.reassembly = r + for i := 0; i < len(r); i++ { + t.reassembly[i].Seen = time.Time{} + } +} +func (t *testFactory) ReassemblyComplete() { +} + +func test(t *testing.T, s []testSequence) { + fact := &testFactory{} + p := NewStreamPool(fact) + a := NewAssembler(p) + a.MaxBufferedPagesPerConnection = 4 + for i, test := range s { + fact.reassembly = []Reassembly{} + a.Assemble(netFlow, &test.in) + if !reflect.DeepEqual(fact.reassembly, test.want) { + t.Fatalf("test %v:\nwant: %v\n got: %v\n", i, test.want, fact.reassembly) + } + } +} + +func TestReorder(t *testing.T) { + test(t, []testSequence{ + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1001, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3}}, + }, + want: []Reassembly{}, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1004, + BaseLayer: layers.BaseLayer{Payload: []byte{2, 2, 3}}, + }, + want: []Reassembly{}, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1010, + BaseLayer: layers.BaseLayer{Payload: []byte{4, 2, 3}}, + }, + want: []Reassembly{}, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1007, + BaseLayer: layers.BaseLayer{Payload: []byte{3, 2, 3}}, + }, + want: []Reassembly{ + Reassembly{ + Skip: -1, + Bytes: []byte{1, 2, 3}, + }, + Reassembly{ + Bytes: []byte{2, 2, 3}, + }, + Reassembly{ + Bytes: []byte{3, 2, 3}, + }, + Reassembly{ + Bytes: []byte{4, 2, 3}, + }, + }, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1016, + BaseLayer: layers.BaseLayer{Payload: []byte{2, 2, 3}}, + }, + want: []Reassembly{}, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1019, + BaseLayer: layers.BaseLayer{Payload: []byte{3, 2, 3}}, + }, + want: []Reassembly{}, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1013, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3}}, + }, + want: []Reassembly{ + Reassembly{ + Bytes: []byte{1, 2, 3}, + }, + Reassembly{ + Bytes: []byte{2, 2, 3}, + }, + Reassembly{ + Bytes: []byte{3, 2, 3}, + }, + }, + }, + }) +} + +func TestMaxPerSkip(t *testing.T) { + test(t, []testSequence{ + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1000, + SYN: true, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3}}, + }, + want: []Reassembly{ + Reassembly{ + Start: true, + Bytes: []byte{1, 2, 3}, + }, + }, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1007, + BaseLayer: layers.BaseLayer{Payload: []byte{3, 2, 3}}, + }, + want: []Reassembly{}, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1010, + BaseLayer: layers.BaseLayer{Payload: []byte{4, 2, 3}}, + }, + want: []Reassembly{}, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1013, + BaseLayer: layers.BaseLayer{Payload: []byte{5, 2, 3}}, + }, + want: []Reassembly{}, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1016, + BaseLayer: layers.BaseLayer{Payload: []byte{6, 2, 3}}, + }, + want: []Reassembly{ + Reassembly{ + Skip: 3, + Bytes: []byte{3, 2, 3}, + }, + Reassembly{ + Bytes: []byte{4, 2, 3}, + }, + Reassembly{ + Bytes: []byte{5, 2, 3}, + }, + Reassembly{ + Bytes: []byte{6, 2, 3}, + }, + }, + }, + }) +} + +func TestReorderFast(t *testing.T) { + test(t, []testSequence{ + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + SYN: true, + Seq: 1000, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3}}, + }, + want: []Reassembly{ + Reassembly{ + Start: true, + Bytes: []byte{1, 2, 3}, + }, + }, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1007, + BaseLayer: layers.BaseLayer{Payload: []byte{3, 2, 3}}, + }, + want: []Reassembly{}, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1004, + BaseLayer: layers.BaseLayer{Payload: []byte{2, 2, 3}}, + }, + want: []Reassembly{ + Reassembly{ + Bytes: []byte{2, 2, 3}, + }, + Reassembly{ + Bytes: []byte{3, 2, 3}, + }, + }, + }, + }) +} + +func TestOverlap(t *testing.T) { + test(t, []testSequence{ + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + SYN: true, + Seq: 1000, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}}, + }, + want: []Reassembly{ + Reassembly{ + Start: true, + Bytes: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, + }, + }, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1007, + BaseLayer: layers.BaseLayer{Payload: []byte{7, 8, 9, 0, 1, 2, 3, 4, 5}}, + }, + want: []Reassembly{ + Reassembly{ + Bytes: []byte{1, 2, 3, 4, 5}, + }, + }, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1010, + BaseLayer: layers.BaseLayer{Payload: []byte{0, 1, 2, 3, 4, 5, 6, 7}}, + }, + want: []Reassembly{ + Reassembly{ + Bytes: []byte{6, 7}, + }, + }, + }, + }) +} + +func TestBufferedOverlap(t *testing.T) { + test(t, []testSequence{ + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1007, + BaseLayer: layers.BaseLayer{Payload: []byte{7, 8, 9, 0, 1, 2, 3, 4, 5}}, + }, + want: []Reassembly{}, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1010, + BaseLayer: layers.BaseLayer{Payload: []byte{0, 1, 2, 3, 4, 5, 6, 7}}, + }, + want: []Reassembly{}, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + SYN: true, + Seq: 1000, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}}, + }, + want: []Reassembly{ + Reassembly{ + Start: true, + Bytes: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, + }, + Reassembly{ + Bytes: []byte{1, 2, 3, 4, 5}, + }, + Reassembly{ + Bytes: []byte{6, 7}, + }, + }, + }, + }) +} + +func TestOverrun1(t *testing.T) { + test(t, []testSequence{ + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + SYN: true, + Seq: 0xFFFFFFFF, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}}, + }, + want: []Reassembly{ + Reassembly{ + Start: true, + Bytes: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, + }, + }, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 10, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4}}, + }, + want: []Reassembly{ + Reassembly{ + Bytes: []byte{1, 2, 3, 4}, + }, + }, + }, + }) +} + +func TestOverrun2(t *testing.T) { + test(t, []testSequence{ + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 10, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4}}, + }, + want: []Reassembly{}, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + SYN: true, + Seq: 0xFFFFFFFF, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}}, + }, + want: []Reassembly{ + Reassembly{ + Start: true, + Bytes: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, + }, + Reassembly{ + Bytes: []byte{1, 2, 3, 4}, + }, + }, + }, + }) +} + +func TestCacheLargePacket(t *testing.T) { + data := make([]byte, pageBytes*3) + test(t, []testSequence{ + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1001, + BaseLayer: layers.BaseLayer{Payload: data}, + }, + want: []Reassembly{}, + }, + { + in: layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 1000, + SYN: true, + BaseLayer: layers.BaseLayer{Payload: []byte{}}, + }, + want: []Reassembly{ + Reassembly{ + Start: true, + Bytes: []byte{}, + }, + Reassembly{ + Bytes: data[:pageBytes], + }, + Reassembly{ + Bytes: data[pageBytes : pageBytes*2], + }, + Reassembly{ + Bytes: data[pageBytes*2 : pageBytes*3], + }, + }, + }, + }) +} + +func BenchmarkSingleStream(b *testing.B) { + t := layers.TCP{ + SrcPort: 1, + DstPort: 2, + SYN: true, + Seq: 1000, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}}, + } + a := NewAssembler(NewStreamPool(&testFactory{})) + for i := 0; i < b.N; i++ { + a.Assemble(netFlow, &t) + if t.SYN { + t.SYN = false + t.Seq++ + } + t.Seq += 10 + } +} + +func BenchmarkSingleStreamSkips(b *testing.B) { + t := layers.TCP{ + SrcPort: 1, + DstPort: 2, + SYN: true, + Seq: 1000, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}}, + } + a := NewAssembler(NewStreamPool(&testFactory{})) + skipped := false + for i := 0; i < b.N; i++ { + if i%10 == 9 { + t.Seq += 10 + skipped = true + } else if skipped { + t.Seq -= 20 + } + a.Assemble(netFlow, &t) + if t.SYN { + t.SYN = false + t.Seq++ + } + t.Seq += 10 + if skipped { + t.Seq += 10 + skipped = false + } + } +} + +func BenchmarkSingleStreamLoss(b *testing.B) { + t := layers.TCP{ + SrcPort: 1, + DstPort: 2, + SYN: true, + Seq: 1000, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}}, + } + a := NewAssembler(NewStreamPool(&testFactory{})) + for i := 0; i < b.N; i++ { + a.Assemble(netFlow, &t) + t.SYN = false + t.Seq += 11 + } +} + +func BenchmarkMultiStreamGrow(b *testing.B) { + t := layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 0, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}}, + } + a := NewAssembler(NewStreamPool(&testFactory{})) + for i := 0; i < b.N; i++ { + t.SrcPort = layers.TCPPort(i) + a.Assemble(netFlow, &t) + t.Seq += 10 + } +} + +func BenchmarkMultiStreamConn(b *testing.B) { + t := layers.TCP{ + SrcPort: 1, + DstPort: 2, + Seq: 0, + SYN: true, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}}, + } + a := NewAssembler(NewStreamPool(&testFactory{})) + for i := 0; i < b.N; i++ { + t.SrcPort = layers.TCPPort(i) + a.Assemble(netFlow, &t) + if i%65536 == 65535 { + if t.SYN { + t.SYN = false + t.Seq++ + } + t.Seq += 10 + } + } +} diff --git a/vendor/github.com/google/gopacket/tcpassembly/tcpreader/reader.go b/vendor/github.com/google/gopacket/tcpassembly/tcpreader/reader.go new file mode 100644 index 0000000..092b811 --- /dev/null +++ b/vendor/github.com/google/gopacket/tcpassembly/tcpreader/reader.go @@ -0,0 +1,210 @@ +// 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 tcpreader provides an implementation for tcpassembly.Stream which presents +// the caller with an io.Reader for easy processing. +// +// The assembly package handles packet data reordering, but its output is +// library-specific, thus not usable by the majority of external Go libraries. +// The io.Reader interface, on the other hand, is used throughout much of Go +// code as an easy mechanism for reading in data streams and decoding them. For +// example, the net/http package provides the ReadRequest function, which can +// parase an HTTP request from a live data stream, just what we'd want when +// sniffing HTTP traffic. Using ReaderStream, this is relatively easy to set +// up: +// +// // Create our StreamFactory +// type httpStreamFactory struct {} +// func (f *httpStreamFactory) New(a, b gopacket.Flow) { +// r := tcpreader.NewReaderStream(false) +// go printRequests(r) +// return &r +// } +// func printRequests(r io.Reader) { +// // Convert to bufio, since that's what ReadRequest wants. +// buf := bufio.NewReader(r) +// for { +// if req, err := http.ReadRequest(buf); err == io.EOF { +// return +// } else if err != nil { +// log.Println("Error parsing HTTP requests:", err) +// } else { +// fmt.Println("HTTP REQUEST:", req) +// fmt.Println("Body contains", tcpreader.DiscardBytesToEOF(req.Body), "bytes") +// } +// } +// } +// +// Using just this code, we're able to reference a powerful, built-in library +// for HTTP request parsing to do all the dirty-work of parsing requests from +// the wire in real-time. Pass this stream factory to an tcpassembly.StreamPool, +// start up an tcpassembly.Assembler, and you're good to go! +package tcpreader + +import ( + "errors" + "github.com/google/gopacket/tcpassembly" + "io" +) + +var discardBuffer = make([]byte, 4096) + +// DiscardBytesToFirstError will read in all bytes up to the first error +// reported by the given reader, then return the number of bytes discarded +// and the error encountered. +func DiscardBytesToFirstError(r io.Reader) (discarded int, err error) { + for { + n, e := r.Read(discardBuffer) + discarded += n + if e != nil { + return discarded, e + } + } +} + +// DiscardBytesToEOF will read in all bytes from a Reader until it +// encounters an io.EOF, then return the number of bytes. Be careful +// of this... if used on a Reader that returns a non-io.EOF error +// consistently, this will loop forever discarding that error while +// it waits for an EOF. +func DiscardBytesToEOF(r io.Reader) (discarded int) { + for { + n, e := DiscardBytesToFirstError(r) + discarded += n + if e == io.EOF { + return + } + } +} + +// ReaderStream implements both tcpassembly.Stream and io.Reader. You can use it +// as a building block to make simple, easy stream handlers. +// +// IMPORTANT: If you use a ReaderStream, you MUST read ALL BYTES from it, +// quickly. Not reading available bytes will block TCP stream reassembly. It's +// a common pattern to do this by starting a goroutine in the factory's New +// method: +// +// type myStreamHandler struct { +// r ReaderStream +// } +// func (m *myStreamHandler) run() { +// // Do something here that reads all of the ReaderStream, or your assembly +// // will block. +// fmt.Println(tcpreader.DiscardBytesToEOF(&m.r)) +// } +// func (f *myStreamFactory) New(a, b gopacket.Flow) tcpassembly.Stream { +// s := &myStreamHandler{} +// go s.run() +// // Return the ReaderStream as the stream that assembly should populate. +// return &s.r +// } +type ReaderStream struct { + ReaderStreamOptions + reassembled chan []tcpassembly.Reassembly + done chan bool + current []tcpassembly.Reassembly + closed bool + lossReported bool + first bool + initiated bool +} + +// ReaderStreamOptions provides user-resettable options for a ReaderStream. +type ReaderStreamOptions struct { + // LossErrors determines whether this stream will return + // ReaderStreamDataLoss errors from its Read function whenever it + // determines data has been lost. + LossErrors bool +} + +// NewReaderStream returns a new ReaderStream object. +func NewReaderStream() ReaderStream { + r := ReaderStream{ + reassembled: make(chan []tcpassembly.Reassembly), + done: make(chan bool), + first: true, + initiated: true, + } + return r +} + +// Reassembled implements tcpassembly.Stream's Reassembled function. +func (r *ReaderStream) Reassembled(reassembly []tcpassembly.Reassembly) { + if !r.initiated { + panic("ReaderStream not created via NewReaderStream") + } + r.reassembled <- reassembly + <-r.done +} + +// ReassemblyComplete implements tcpassembly.Stream's ReassemblyComplete function. +func (r *ReaderStream) ReassemblyComplete() { + close(r.reassembled) + close(r.done) +} + +// stripEmpty strips empty reassembly slices off the front of its current set of +// slices. +func (r *ReaderStream) stripEmpty() { + for len(r.current) > 0 && len(r.current[0].Bytes) == 0 { + r.current = r.current[1:] + r.lossReported = false + } +} + +// DataLost is returned by the ReaderStream's Read function when it encounters +// a Reassembly with Skip != 0. +var DataLost = errors.New("lost data") + +// Read implements io.Reader's Read function. +// Given a byte slice, it will either copy a non-zero number of bytes into +// that slice and return the number of bytes and a nil error, or it will +// leave slice p as is and return 0, io.EOF. +func (r *ReaderStream) Read(p []byte) (int, error) { + if !r.initiated { + panic("ReaderStream not created via NewReaderStream") + } + var ok bool + r.stripEmpty() + for !r.closed && len(r.current) == 0 { + if r.first { + r.first = false + } else { + r.done <- true + } + if r.current, ok = <-r.reassembled; ok { + r.stripEmpty() + } else { + r.closed = true + } + } + if len(r.current) > 0 { + current := &r.current[0] + if r.LossErrors && !r.lossReported && current.Skip != 0 { + r.lossReported = true + return 0, DataLost + } + length := copy(p, current.Bytes) + current.Bytes = current.Bytes[length:] + return length, nil + } + return 0, io.EOF +} + +// Close implements io.Closer's Close function, making ReaderStream a +// io.ReadCloser. It discards all remaining bytes in the reassembly in a +// manner that's safe for the assembler (IE: it doesn't block). +func (r *ReaderStream) Close() error { + r.current = nil + r.closed = true + for { + if _, ok := <-r.reassembled; !ok { + return nil + } + r.done <- true + } +} diff --git a/vendor/github.com/google/gopacket/tcpassembly/tcpreader/reader_test.go b/vendor/github.com/google/gopacket/tcpassembly/tcpreader/reader_test.go new file mode 100644 index 0000000..7da9fd9 --- /dev/null +++ b/vendor/github.com/google/gopacket/tcpassembly/tcpreader/reader_test.go @@ -0,0 +1,129 @@ +// 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 tcpreader + +import ( + "bytes" + "fmt" + "github.com/google/gopacket" + "github.com/google/gopacket/layers" + "github.com/google/gopacket/tcpassembly" + "io" + "net" + "testing" +) + +var netFlow gopacket.Flow + +func init() { + netFlow, _ = gopacket.FlowFromEndpoints( + layers.NewIPEndpoint(net.IP{1, 2, 3, 4}), + layers.NewIPEndpoint(net.IP{5, 6, 7, 8})) +} + +type readReturn struct { + data []byte + err error +} +type readSequence struct { + in []layers.TCP + want []readReturn +} +type testReaderFactory struct { + lossErrors bool + readSize int + ReaderStream + output chan []byte +} + +func (t *testReaderFactory) New(a, b gopacket.Flow) tcpassembly.Stream { + return &t.ReaderStream +} + +func testReadSequence(t *testing.T, lossErrors bool, readSize int, seq readSequence) { + f := &testReaderFactory{ReaderStream: NewReaderStream()} + f.ReaderStream.LossErrors = lossErrors + p := tcpassembly.NewStreamPool(f) + a := tcpassembly.NewAssembler(p) + buf := make([]byte, readSize) + go func() { + for i, test := range seq.in { + fmt.Println("Assembling", i) + a.Assemble(netFlow, &test) + fmt.Println("Assembly done") + } + }() + for i, test := range seq.want { + fmt.Println("Waiting for read", i) + n, err := f.Read(buf[:]) + fmt.Println("Got read") + if n != len(test.data) { + t.Errorf("test %d want %d bytes, got %d bytes", i, len(test.data), n) + } else if err != test.err { + t.Errorf("test %d want err %v, got err %v", i, test.err, err) + } else if !bytes.Equal(buf[:n], test.data) { + t.Errorf("test %d\nwant: %v\n got: %v\n", i, test.data, buf[:n]) + } + } + fmt.Println("All done reads") +} + +func TestRead(t *testing.T) { + testReadSequence(t, false, 10, readSequence{ + in: []layers.TCP{ + { + SYN: true, + SrcPort: 1, + DstPort: 2, + Seq: 1000, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3}}, + }, + { + FIN: true, + SrcPort: 1, + DstPort: 2, + Seq: 1004, + }, + }, + want: []readReturn{ + {data: []byte{1, 2, 3}}, + {err: io.EOF}, + }, + }) +} + +func TestReadSmallChunks(t *testing.T) { + testReadSequence(t, false, 2, readSequence{ + in: []layers.TCP{ + { + SYN: true, + SrcPort: 1, + DstPort: 2, + Seq: 1000, + BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3}}, + }, + { + FIN: true, + SrcPort: 1, + DstPort: 2, + Seq: 1004, + }, + }, + want: []readReturn{ + {data: []byte{1, 2}}, + {data: []byte{3}}, + {err: io.EOF}, + }, + }) +} + +func ExampleDiscardBytesToEOF() { + b := bytes.NewBuffer([]byte{1, 2, 3, 4, 5}) + fmt.Println(DiscardBytesToEOF(b)) + // Output: + // 5 +} diff --git a/vendor/github.com/google/gopacket/writer.go b/vendor/github.com/google/gopacket/writer.go new file mode 100644 index 0000000..9e85a92 --- /dev/null +++ b/vendor/github.com/google/gopacket/writer.go @@ -0,0 +1,213 @@ +// 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 gopacket + +import ( + "fmt" +) + +// SerializableLayer allows its implementations to be written out as a set of bytes, +// so those bytes may be sent on the wire or otherwise used by the caller. +// SerializableLayer is implemented by certain Layer types, and can be encoded to +// bytes using the LayerWriter object. +type SerializableLayer interface { + // SerializeTo writes this layer to a slice, growing that slice if necessary + // to make it fit the layer's data. + // Args: + // b: SerializeBuffer to write this layer on to. When called, b.Bytes() + // is the payload this layer should wrap, if any. Note that this + // layer can either prepend itself (common), append itself + // (uncommon), or both (sometimes padding or footers are required at + // the end of packet data). It's also possible (though probably very + // rarely needed) to overwrite any bytes in the current payload. + // After this call, b.Bytes() should return the byte encoding of + // this layer wrapping the original b.Bytes() payload. + // opts: options to use while writing out data. + // Returns: + // error if a problem was encountered during encoding. If an error is + // returned, the bytes in data should be considered invalidated, and + // not used. + // + // SerializeTo calls SHOULD entirely ignore LayerContents and + // LayerPayload. It just serializes based on struct fields, neither + // modifying nor using contents/payload. + SerializeTo(b SerializeBuffer, opts SerializeOptions) error +} + +// SerializeOptions provides options for behaviors that SerializableLayers may want to +// implement. +type SerializeOptions struct { + // FixLengths determines whether, during serialization, layers should fix + // the values for any length field that depends on the payload. + FixLengths bool + // ComputeChecksums determines whether, during serialization, layers + // should recompute checksums based on their payloads. + ComputeChecksums bool +} + +// SerializeBuffer is a helper used by gopacket for writing out packet layers. +// SerializeBuffer starts off as an empty []byte. Subsequent calls to PrependBytes +// return byte slices before the current Bytes(), AppendBytes returns byte +// slices after. +// +// Byte slices returned by PrependBytes/AppendBytes are NOT zero'd out, so if +// you want to make sure they're all zeros, set them as such. +// +// SerializeBuffer is specifically designed to handle packet writing, where unlike +// with normal writes it's easier to start writing at the inner-most layer and +// work out, meaning that we often need to prepend bytes. This runs counter to +// typical writes to byte slices using append(), where we only write at the end +// of the buffer. +// +// It can be reused via Clear. Note, however, that a Clear call will invalidate the +// byte slices returned by any previous Bytes() call (the same buffer is +// reused). +// +// 1) Reusing a write buffer is generally much faster than creating a new one, +// and with the default implementation it avoids additional memory allocations. +// 2) If a byte slice from a previous Bytes() call will continue to be used, +// it's better to create a new SerializeBuffer. +// +// The Clear method is specifically designed to minimize memory allocations for +// similar later workloads on the SerializeBuffer. IE: if you make a set of +// Prepend/Append calls, then clear, then make the same calls with the same +// sizes, the second round (and all future similar rounds) shouldn't allocate +// any new memory. +type SerializeBuffer interface { + // Bytes returns the contiguous set of bytes collected so far by Prepend/Append + // calls. The slice returned by Bytes will be modified by future Clear calls, + // so if you're planning on clearing this SerializeBuffer, you may want to copy + // Bytes somewhere safe first. + Bytes() []byte + // PrependBytes returns a set of bytes which prepends the current bytes in this + // buffer. These bytes start in an indeterminate state, so they should be + // overwritten by the caller. The caller must only call PrependBytes if they + // know they're going to immediately overwrite all bytes returned. + PrependBytes(num int) ([]byte, error) + // AppendBytes returns a set of bytes which appends the current bytes in this + // buffer. These bytes start in an indeterminate state, so they should be + // overwritten by the caller. The caller must only call AppendBytes if they + // know they're going to immediately overwrite all bytes returned. + AppendBytes(num int) ([]byte, error) + // Clear resets the SerializeBuffer to a new, empty buffer. After a call to clear, + // the byte slice returned by any previous call to Bytes() for this buffer + // should be considered invalidated. + Clear() error +} + +type serializeBuffer struct { + data []byte + start int + prepended, appended int +} + +// NewSerializeBuffer creates a new instance of the default implementation of +// the SerializeBuffer interface. +func NewSerializeBuffer() SerializeBuffer { + return &serializeBuffer{} +} + +// NewSerializeBufferExpectedSize creates a new buffer for serialization, optimized for an +// expected number of bytes prepended/appended. This tends to decrease the +// number of memory allocations made by the buffer during writes. +func NewSerializeBufferExpectedSize(expectedPrependLength, expectedAppendLength int) SerializeBuffer { + return &serializeBuffer{ + data: make([]byte, expectedPrependLength, expectedPrependLength+expectedAppendLength), + start: expectedPrependLength, + prepended: expectedPrependLength, + appended: expectedAppendLength, + } +} + +func (w *serializeBuffer) Bytes() []byte { + return w.data[w.start:] +} + +func (w *serializeBuffer) PrependBytes(num int) ([]byte, error) { + if num < 0 { + panic("num < 0") + } + if w.start < num { + toPrepend := w.prepended + if toPrepend < num { + toPrepend = num + } + w.prepended += toPrepend + length := cap(w.data) + toPrepend + newData := make([]byte, length) + newStart := w.start + toPrepend + copy(newData[newStart:], w.data[w.start:]) + w.start = newStart + w.data = newData[:toPrepend+len(w.data)] + } + w.start -= num + return w.data[w.start : w.start+num], nil +} + +func (w *serializeBuffer) AppendBytes(num int) ([]byte, error) { + if num < 0 { + panic("num < 0") + } + initialLength := len(w.data) + if cap(w.data)-initialLength < num { + toAppend := w.appended + if toAppend < num { + toAppend = num + } + w.appended += toAppend + newData := make([]byte, cap(w.data)+toAppend) + copy(newData[w.start:], w.data[w.start:]) + w.data = newData[:initialLength] + } + // Grow the buffer. We know it'll be under capacity given above. + w.data = w.data[:initialLength+num] + return w.data[initialLength:], nil +} + +func (w *serializeBuffer) Clear() error { + w.start = w.prepended + w.data = w.data[:w.start] + return nil +} + +// SerializeLayers clears the given write buffer, then writes all layers into it so +// they correctly wrap each other. Note that by clearing the buffer, it +// invalidates all slices previously returned by w.Bytes() +// +// Example: +// buf := gopacket.NewSerializeBuffer() +// opts := gopacket.SerializeOptions{} +// gopacket.SerializeLayers(buf, opts, a, b, c) +// firstPayload := buf.Bytes() // contains byte representation of a(b(c)) +// gopacket.SerializeLayers(buf, opts, d, e, f) +// secondPayload := buf.Bytes() // contains byte representation of d(e(f)). firstPayload is now invalidated, since the SerializeLayers call Clears buf. +func SerializeLayers(w SerializeBuffer, opts SerializeOptions, layers ...SerializableLayer) error { + w.Clear() + for i := len(layers) - 1; i >= 0; i-- { + layer := layers[i] + err := layer.SerializeTo(w, opts) + if err != nil { + return err + } + } + return nil +} + +// SerializePacket is a convenience function that calls SerializeLayers +// on packet's Layers(). +// It returns an error if one of the packet layers is not a SerializebleLayer. +func SerializePacket(buf SerializeBuffer, opts SerializeOptions, packet Packet) error { + sls := []SerializableLayer{} + for _, layer := range packet.Layers() { + sl, ok := layer.(SerializableLayer) + if !ok { + return fmt.Errorf("layer %s is not serializable", layer.LayerType().String()) + } + sls = append(sls, sl) + } + return SerializeLayers(buf, opts, sls...) +} diff --git a/vendor/github.com/google/gopacket/writer_test.go b/vendor/github.com/google/gopacket/writer_test.go new file mode 100644 index 0000000..e19069b --- /dev/null +++ b/vendor/github.com/google/gopacket/writer_test.go @@ -0,0 +1,94 @@ +// 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 gopacket + +import ( + "fmt" + "testing" +) + +func TestExponentialSizeIncreasePrepend(t *testing.T) { + var b serializeBuffer + for i, test := range []struct { + prepend, size int + }{ + {2, 2}, + {2, 4}, + {2, 8}, + {2, 8}, + {2, 16}, + {2, 16}, + {2, 16}, + {2, 16}, + {2, 32}, + } { + b.PrependBytes(test.prepend) + if test.size != cap(b.data) { + t.Error(i, "size want", test.size, "got", cap(b.data)) + } + } + b.Clear() + if b.start != 32 { + t.Error(b.start) + } +} + +func TestExponentialSizeIncreaseAppend(t *testing.T) { + var b serializeBuffer + for i, test := range []struct { + appnd, size int + }{ + {2, 2}, + {2, 4}, + {2, 8}, + {2, 8}, + {2, 16}, + {2, 16}, + {2, 16}, + {2, 16}, + {2, 32}, + } { + b.AppendBytes(test.appnd) + if test.size != cap(b.data) { + t.Error(i, "size want", test.size, "got", cap(b.data)) + } + } + b.Clear() + if b.start != 0 { + t.Error(b.start) + } +} + +func ExampleSerializeBuffer() { + b := NewSerializeBuffer() + fmt.Println("1:", b.Bytes()) + bytes, _ := b.PrependBytes(3) + copy(bytes, []byte{1, 2, 3}) + fmt.Println("2:", b.Bytes()) + bytes, _ = b.AppendBytes(2) + copy(bytes, []byte{4, 5}) + fmt.Println("3:", b.Bytes()) + bytes, _ = b.PrependBytes(1) + copy(bytes, []byte{0}) + fmt.Println("4:", b.Bytes()) + bytes, _ = b.AppendBytes(3) + copy(bytes, []byte{6, 7, 8}) + fmt.Println("5:", b.Bytes()) + b.Clear() + fmt.Println("6:", b.Bytes()) + bytes, _ = b.PrependBytes(2) + copy(bytes, []byte{9, 9}) + fmt.Println("7:", b.Bytes()) + // Output: + // 1: [] + // 2: [1 2 3] + // 3: [1 2 3 4 5] + // 4: [0 1 2 3 4 5] + // 5: [0 1 2 3 4 5 6 7 8] + // 6: [] + // 7: [9 9] +} |