diff --git a/Gopkg.lock b/Gopkg.lock
index 2ac97cc..d1fc586 100644
--- a/Gopkg.lock
+++ b/Gopkg.lock
@@ -210,14 +210,6 @@
   version = "v1.0.0"
 
 [[projects]]
-  branch = "master"
-  digest = "1:34275a1f6f60d46dd507bf9b420c0abeff8bf71027fc06c6f6eda2b0c0a4bad4"
-  name = "github.com/mdlayher/ethernet"
-  packages = ["."]
-  pruneopts = "UT"
-  revision = "0394541c37b7f86a10e0b49492f6d4f605c34163"
-
-[[projects]]
   digest = "1:5d231480e1c64a726869bc4142d270184c419749d34f167646baa21008eb0a79"
   name = "github.com/mitchellh/go-homedir"
   packages = ["."]
@@ -538,7 +530,6 @@
   input-imports = [
     "github.com/gogo/protobuf/proto",
     "github.com/golang/protobuf/ptypes",
-    "github.com/mdlayher/ethernet",
     "github.com/opencord/voltha-go/adapters",
     "github.com/opencord/voltha-go/adapters/common",
     "github.com/opencord/voltha-go/common/log",
diff --git a/Gopkg.toml b/Gopkg.toml
index 7f6e5e6..413989e 100644
--- a/Gopkg.toml
+++ b/Gopkg.toml
@@ -45,10 +45,6 @@
   name = "google.golang.org/grpc"
   version = "1.19.1"
 
-[[constraint]]
-  branch = "master"
-  name = "github.com/mdlayher/ethernet"
-
 [[override]]
   branch = "master"
   name = "go.etcd.io/etcd"
diff --git a/adaptercore/device_handler.go b/adaptercore/device_handler.go
index b686c8d..e00f626 100644
--- a/adaptercore/device_handler.go
+++ b/adaptercore/device_handler.go
@@ -19,6 +19,7 @@
 
 import (
 	"context"
+	"encoding/hex"
 	"errors"
 	"fmt"
 	"io"
@@ -32,7 +33,6 @@
 
 	"github.com/gogo/protobuf/proto"
 	"github.com/golang/protobuf/ptypes"
-	"github.com/mdlayher/ethernet"
 	com "github.com/opencord/voltha-go/adapters/common"
 	"github.com/opencord/voltha-go/common/log"
 	rsrcMgr "github.com/opencord/voltha-openolt-adapter/adaptercore/resourcemanager"
@@ -1065,52 +1065,40 @@
 
 // PacketOut sends packet-out from VOLTHA to OLT on the egress port provided
 func (dh *DeviceHandler) PacketOut(egressPortNo int, packet *of.OfpPacketOut) error {
-	log.Debugw("PacketOut", log.Fields{"deviceID": dh.deviceID, "egress_port_no": egressPortNo, "pkt-length": len(packet.Data)})
-	var etherFrame ethernet.Frame
-	err := (&etherFrame).UnmarshalBinary(packet.Data)
-	if err != nil {
-		log.Errorw("Failed to unmarshal into ethernet frame", log.Fields{"err": err, "pkt-length": len(packet.Data)})
-		return err
-	}
-	log.Debugw("Ethernet Frame", log.Fields{"Frame": etherFrame})
+	log.Debugw("incoming-packet-out", log.Fields{"deviceID": dh.deviceID, "egress_port_no": egressPortNo,
+		"pkt-length": len(packet.Data), "packetData": hex.EncodeToString(packet.Data)})
+
 	egressPortType := IntfIDToPortTypeName(uint32(egressPortNo))
 	if egressPortType == voltha.Port_ETHERNET_UNI {
-		if etherFrame.VLAN != nil { // If double tag, remove the outer tag
-			nextEthType := (uint16(packet.Data[16]) << 8) | uint16(packet.Data[17])
-			if nextEthType == 0x8100 {
-				etherFrame.VLAN = nil
-				packet.Data, err = etherFrame.MarshalBinary()
-				if err != nil {
-					log.Errorw("failed to marshal frame:", log.Fields{"err": err, "etherFrame": etherFrame})
-					return err
-				}
-				if err := (&etherFrame).UnmarshalBinary(packet.Data); err != nil {
-					log.Errorw("failed to unmarshal frame:", log.Fields{"err": err, "packetData": packet.Data})
-					return err
-				}
-				log.Debug("Double tagged packet , removed outer vlan", log.Fields{"New frame": etherFrame})
+		outerEthType := (uint16(packet.Data[12]) << 8) | uint16(packet.Data[13])
+		innerEthType := (uint16(packet.Data[16]) << 8) | uint16(packet.Data[17])
+		if outerEthType == 0x88a8 || outerEthType == 0x8100 {
+			if innerEthType == 0x8100 {
+				// q-in-q 802.1ad or 802.1q double tagged packet.
+				// slice out the outer tag.
+				packet.Data = append(packet.Data[:12], packet.Data[16:]...)
+				log.Debugw("packet-now-single-tagged", log.Fields{"packetData": hex.EncodeToString(packet.Data)})
 			}
 		}
 		intfID := IntfIDFromUniPortNum(uint32(egressPortNo))
 		onuID := OnuIDFromPortNum(uint32(egressPortNo))
-		uniID := UniIDFromPortNum(uint32(egressPortNo))
-		/*gemPortId, err := dh.flowMgr.GetPacketOutGemPortId(intfID, onuID, uint32(egress_port_no))
-		  if err != nil{
-		      log.Errorw("Error while getting gemport to packet-out",log.Fields{"error": err})
-		      return err
-		  }*/
+		uniID := uint32(egressPortNo)
 		onuPkt := oop.OnuPacket{IntfId: intfID, OnuId: onuID, PortNo: uint32(egressPortNo), Pkt: packet.Data}
-		log.Debug("sending-packet-to-ONU", log.Fields{"egress_port_no": egressPortNo, "IntfId": intfID, "onuID": onuID,
-			"uniID": uniID, "packet": packet.Data})
+
+		log.Debugw("sending-packet-to-onu", log.Fields{"egress_port_no": egressPortNo, "IntfId": intfID, "onuID": onuID,
+			"uniID": uniID, "packet": hex.EncodeToString(packet.Data)})
+
 		if _, err := dh.Client.OnuPacketOut(context.Background(), &onuPkt); err != nil {
 			log.Errorw("Error while sending packet-out to ONU", log.Fields{"error": err})
 			return err
 		}
 	} else if egressPortType == voltha.Port_ETHERNET_NNI {
 		uplinkPkt := oop.UplinkPacket{IntfId: IntfIDFromNniPortNum(uint32(egressPortNo)), Pkt: packet.Data}
-		log.Debug("sending-packet-to-uplink", log.Fields{"uplink_pkt": uplinkPkt})
+
+		log.Debugw("sending-packet-to-nni", log.Fields{"uplink_pkt": uplinkPkt, "packet": hex.EncodeToString(packet.Data)})
+
 		if _, err := dh.Client.UplinkPacketOut(context.Background(), &uplinkPkt); err != nil {
-			log.Errorw("Error while sending packet-out to uplink", log.Fields{"error": err})
+			log.Errorw("Error while sending packet-out to NNI", log.Fields{"error": err})
 			return err
 		}
 	} else {
diff --git a/vendor/github.com/mdlayher/ethernet/.travis.yml b/vendor/github.com/mdlayher/ethernet/.travis.yml
deleted file mode 100644
index cc21599..0000000
--- a/vendor/github.com/mdlayher/ethernet/.travis.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-language: go
-go:
-  - 1.x
-os:
-  - linux
-before_install:
-  - go get golang.org/x/lint/golint
-  - go get honnef.co/go/tools/cmd/staticcheck
-  - go get -d ./...
-script:
-  - go build -tags=gofuzz ./...
-  - go vet ./...
-  - staticcheck ./...
-  - golint -set_exit_status ./...
-  - go test -v -race ./...
diff --git a/vendor/github.com/mdlayher/ethernet/LICENSE.md b/vendor/github.com/mdlayher/ethernet/LICENSE.md
deleted file mode 100644
index 75ed9de..0000000
--- a/vendor/github.com/mdlayher/ethernet/LICENSE.md
+++ /dev/null
@@ -1,10 +0,0 @@
-MIT License
-===========
-
-Copyright (C) 2015 Matt Layher
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/vendor/github.com/mdlayher/ethernet/README.md b/vendor/github.com/mdlayher/ethernet/README.md
deleted file mode 100644
index ec6f4fe..0000000
--- a/vendor/github.com/mdlayher/ethernet/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-ethernet [![Build Status](https://travis-ci.org/mdlayher/ethernet.svg?branch=master)](https://travis-ci.org/mdlayher/ethernet) [![GoDoc](https://godoc.org/github.com/mdlayher/ethernet?status.svg)](https://godoc.org/github.com/mdlayher/ethernet) [![Go Report Card](https://goreportcard.com/badge/github.com/mdlayher/ethernet)](https://goreportcard.com/report/github.com/mdlayher/ethernet)
-========
-
-Package `ethernet` implements marshaling and unmarshaling of IEEE 802.3
-Ethernet II frames and IEEE 802.1Q VLAN tags.  MIT Licensed.
-
-For more information about using Ethernet frames in Go, check out my blog
-post: [Network Protocol Breakdown: Ethernet and Go](https://medium.com/@mdlayher/network-protocol-breakdown-ethernet-and-go-de985d726cc1).
\ No newline at end of file
diff --git a/vendor/github.com/mdlayher/ethernet/ethernet.go b/vendor/github.com/mdlayher/ethernet/ethernet.go
deleted file mode 100644
index d150d8e..0000000
--- a/vendor/github.com/mdlayher/ethernet/ethernet.go
+++ /dev/null
@@ -1,301 +0,0 @@
-// Package ethernet implements marshaling and unmarshaling of IEEE 802.3
-// Ethernet II frames and IEEE 802.1Q VLAN tags.
-package ethernet
-
-import (
-	"encoding/binary"
-	"errors"
-	"fmt"
-	"hash/crc32"
-	"io"
-	"net"
-)
-
-//go:generate stringer -output=string.go -type=EtherType
-
-const (
-	// minPayload is the minimum payload size for an Ethernet frame, assuming
-	// that no 802.1Q VLAN tags are present.
-	minPayload = 46
-)
-
-var (
-	// Broadcast is a special hardware address which indicates a Frame should
-	// be sent to every device on a given LAN segment.
-	Broadcast = net.HardwareAddr{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}
-)
-
-var (
-	// ErrInvalidFCS is returned when Frame.UnmarshalFCS detects an incorrect
-	// Ethernet frame check sequence in a byte slice for a Frame.
-	ErrInvalidFCS = errors.New("invalid frame check sequence")
-)
-
-// An EtherType is a value used to identify an upper layer protocol
-// encapsulated in a Frame.
-//
-// A list of IANA-assigned EtherType values may be found here:
-// http://www.iana.org/assignments/ieee-802-numbers/ieee-802-numbers.xhtml.
-type EtherType uint16
-
-// Common EtherType values frequently used in a Frame.
-const (
-	EtherTypeIPv4 EtherType = 0x0800
-	EtherTypeARP  EtherType = 0x0806
-	EtherTypeIPv6 EtherType = 0x86DD
-
-	// EtherTypeVLAN and EtherTypeServiceVLAN are used as 802.1Q Tag Protocol
-	// Identifiers (TPIDs).
-	EtherTypeVLAN        EtherType = 0x8100
-	EtherTypeServiceVLAN EtherType = 0x88a8
-)
-
-// A Frame is an IEEE 802.3 Ethernet II frame.  A Frame contains information
-// such as source and destination hardware addresses, zero or more optional
-// 802.1Q VLAN tags, an EtherType, and payload data.
-type Frame struct {
-	// Destination specifies the destination hardware address for this Frame.
-	//
-	// If this address is set to Broadcast, the Frame will be sent to every
-	// device on a given LAN segment.
-	Destination net.HardwareAddr
-
-	// Source specifies the source hardware address for this Frame.
-	//
-	// Typically, this is the hardware address of the network interface used to
-	// send this Frame.
-	Source net.HardwareAddr
-
-	// ServiceVLAN specifies an optional 802.1Q service VLAN tag, for use with
-	// 802.1ad double tagging, or "Q-in-Q". If ServiceVLAN is not nil, VLAN must
-	// not be nil as well.
-	//
-	// Most users should leave this field set to nil and use VLAN instead.
-	ServiceVLAN *VLAN
-
-	// VLAN specifies an optional 802.1Q customer VLAN tag, which may or may
-	// not be present in a Frame.  It is important to note that the operating
-	// system may automatically strip VLAN tags before they can be parsed.
-	VLAN *VLAN
-
-	// EtherType is a value used to identify an upper layer protocol
-	// encapsulated in this Frame.
-	EtherType EtherType
-
-	// Payload is a variable length data payload encapsulated by this Frame.
-	Payload []byte
-}
-
-// MarshalBinary allocates a byte slice and marshals a Frame into binary form.
-func (f *Frame) MarshalBinary() ([]byte, error) {
-	b := make([]byte, f.length())
-	_, err := f.read(b)
-	return b, err
-}
-
-// MarshalFCS allocates a byte slice, marshals a Frame into binary form, and
-// finally calculates and places a 4-byte IEEE CRC32 frame check sequence at
-// the end of the slice.
-//
-// Most users should use MarshalBinary instead.  MarshalFCS is provided as a
-// convenience for rare occasions when the operating system cannot
-// automatically generate a frame check sequence for an Ethernet frame.
-func (f *Frame) MarshalFCS() ([]byte, error) {
-	// Frame length with 4 extra bytes for frame check sequence
-	b := make([]byte, f.length()+4)
-	if _, err := f.read(b); err != nil {
-		return nil, err
-	}
-
-	// Compute IEEE CRC32 checksum of frame bytes and place it directly
-	// in the last four bytes of the slice
-	binary.BigEndian.PutUint32(b[len(b)-4:], crc32.ChecksumIEEE(b[0:len(b)-4]))
-	return b, nil
-}
-
-// read reads data from a Frame into b.  read is used to marshal a Frame
-// into binary form, but does not allocate on its own.
-func (f *Frame) read(b []byte) (int, error) {
-	// S-VLAN must also have accompanying C-VLAN.
-	if f.ServiceVLAN != nil && f.VLAN == nil {
-		return 0, ErrInvalidVLAN
-	}
-
-	copy(b[0:6], f.Destination)
-	copy(b[6:12], f.Source)
-
-	// Marshal each non-nil VLAN tag into bytes, inserting the appropriate
-	// EtherType/TPID before each, so devices know that one or more VLANs
-	// are present.
-	vlans := []struct {
-		vlan *VLAN
-		tpid EtherType
-	}{
-		{vlan: f.ServiceVLAN, tpid: EtherTypeServiceVLAN},
-		{vlan: f.VLAN, tpid: EtherTypeVLAN},
-	}
-
-	n := 12
-	for _, vt := range vlans {
-		if vt.vlan == nil {
-			continue
-		}
-
-		// Add VLAN EtherType and VLAN bytes.
-		binary.BigEndian.PutUint16(b[n:n+2], uint16(vt.tpid))
-		if _, err := vt.vlan.read(b[n+2 : n+4]); err != nil {
-			return 0, err
-		}
-		n += 4
-	}
-
-	// Marshal actual EtherType after any VLANs, copy payload into
-	// output bytes.
-	binary.BigEndian.PutUint16(b[n:n+2], uint16(f.EtherType))
-	copy(b[n+2:], f.Payload)
-
-	return len(b), nil
-}
-
-// UnmarshalBinary unmarshals a byte slice into a Frame.
-func (f *Frame) UnmarshalBinary(b []byte) error {
-	// Verify that both hardware addresses and a single EtherType are present
-	if len(b) < 14 {
-		return io.ErrUnexpectedEOF
-	}
-
-	// Track offset in packet for reading data
-	n := 14
-
-	// Continue looping and parsing VLAN tags until no more VLAN EtherType
-	// values are detected
-	et := EtherType(binary.BigEndian.Uint16(b[n-2 : n]))
-	switch et {
-	case EtherTypeServiceVLAN, EtherTypeVLAN:
-		// VLAN type is hinted for further parsing.  An index is returned which
-		// indicates how many bytes were consumed by VLAN tags.
-		nn, err := f.unmarshalVLANs(et, b[n:])
-		if err != nil {
-			return err
-		}
-
-		n += nn
-	default:
-		// No VLANs detected.
-		f.EtherType = et
-	}
-
-	// Allocate single byte slice to store destination and source hardware
-	// addresses, and payload
-	bb := make([]byte, 6+6+len(b[n:]))
-	copy(bb[0:6], b[0:6])
-	f.Destination = bb[0:6]
-	copy(bb[6:12], b[6:12])
-	f.Source = bb[6:12]
-
-	// There used to be a minimum payload length restriction here, but as
-	// long as two hardware addresses and an EtherType are present, it
-	// doesn't really matter what is contained in the payload.  We will
-	// follow the "robustness principle".
-	copy(bb[12:], b[n:])
-	f.Payload = bb[12:]
-
-	return nil
-}
-
-// UnmarshalFCS computes the IEEE CRC32 frame check sequence of a Frame,
-// verifies it against the checksum present in the byte slice, and finally,
-// unmarshals a byte slice into a Frame.
-//
-// Most users should use UnmarshalBinary instead.  UnmarshalFCS is provided as
-// a convenience for rare occasions when the operating system cannot
-// automatically verify a frame check sequence for an Ethernet frame.
-func (f *Frame) UnmarshalFCS(b []byte) error {
-	// Must contain enough data for FCS, to avoid panics
-	if len(b) < 4 {
-		return io.ErrUnexpectedEOF
-	}
-
-	// Verify checksum in slice versus newly computed checksum
-	want := binary.BigEndian.Uint32(b[len(b)-4:])
-	got := crc32.ChecksumIEEE(b[0 : len(b)-4])
-	if want != got {
-		return ErrInvalidFCS
-	}
-
-	return f.UnmarshalBinary(b[0 : len(b)-4])
-}
-
-// length calculates the number of bytes required to store a Frame.
-func (f *Frame) length() int {
-	// If payload is less than the required minimum length, we zero-pad up to
-	// the required minimum length
-	pl := len(f.Payload)
-	if pl < minPayload {
-		pl = minPayload
-	}
-
-	// Add additional length if VLAN tags are needed.
-	var vlanLen int
-	switch {
-	case f.ServiceVLAN != nil && f.VLAN != nil:
-		vlanLen = 8
-	case f.VLAN != nil:
-		vlanLen = 4
-	}
-
-	// 6 bytes: destination hardware address
-	// 6 bytes: source hardware address
-	// N bytes: VLAN tags (if present)
-	// 2 bytes: EtherType
-	// N bytes: payload length (may be padded)
-	return 6 + 6 + vlanLen + 2 + pl
-}
-
-// unmarshalVLANs unmarshals S/C-VLAN tags.  It is assumed that tpid
-// is a valid S/C-VLAN TPID.
-func (f *Frame) unmarshalVLANs(tpid EtherType, b []byte) (int, error) {
-	// 4 or more bytes must remain for valid S/C-VLAN tag and EtherType.
-	if len(b) < 4 {
-		return 0, io.ErrUnexpectedEOF
-	}
-
-	// Track how many bytes are consumed by VLAN tags.
-	var n int
-
-	switch tpid {
-	case EtherTypeServiceVLAN:
-		vlan := new(VLAN)
-		if err := vlan.UnmarshalBinary(b[n : n+2]); err != nil {
-			return 0, err
-		}
-		f.ServiceVLAN = vlan
-
-		// Assume that a C-VLAN immediately trails an S-VLAN.
-		if EtherType(binary.BigEndian.Uint16(b[n+2:n+4])) != EtherTypeVLAN {
-			return 0, ErrInvalidVLAN
-		}
-
-		// 4 or more bytes must remain for valid C-VLAN tag and EtherType.
-		n += 4
-		if len(b[n:]) < 4 {
-			return 0, io.ErrUnexpectedEOF
-		}
-
-		// Continue to parse the C-VLAN.
-		fallthrough
-	case EtherTypeVLAN:
-		vlan := new(VLAN)
-		if err := vlan.UnmarshalBinary(b[n : n+2]); err != nil {
-			return 0, err
-		}
-
-		f.VLAN = vlan
-		f.EtherType = EtherType(binary.BigEndian.Uint16(b[n+2 : n+4]))
-		n += 4
-	default:
-		panic(fmt.Sprintf("unknown VLAN TPID: %04x", tpid))
-	}
-
-	return n, nil
-}
diff --git a/vendor/github.com/mdlayher/ethernet/fuzz.go b/vendor/github.com/mdlayher/ethernet/fuzz.go
deleted file mode 100644
index 5d22532..0000000
--- a/vendor/github.com/mdlayher/ethernet/fuzz.go
+++ /dev/null
@@ -1,24 +0,0 @@
-// +build gofuzz
-
-package ethernet
-
-func Fuzz(data []byte) int {
-	f := new(Frame)
-	if err := f.UnmarshalBinary(data); err != nil {
-		return 0
-	}
-
-	if _, err := f.MarshalBinary(); err != nil {
-		panic(err)
-	}
-
-	if err := f.UnmarshalFCS(data); err != nil {
-		return 0
-	}
-
-	if _, err := f.MarshalFCS(); err != nil {
-		panic(err)
-	}
-
-	return 1
-}
diff --git a/vendor/github.com/mdlayher/ethernet/go.mod b/vendor/github.com/mdlayher/ethernet/go.mod
deleted file mode 100644
index ffe3803..0000000
--- a/vendor/github.com/mdlayher/ethernet/go.mod
+++ /dev/null
@@ -1,10 +0,0 @@
-module github.com/mdlayher/ethernet
-
-go 1.12
-
-require (
-	github.com/google/go-cmp v0.3.0 // indirect
-	github.com/mdlayher/raw v0.0.0-20190606142536-fef19f00fc18
-	golang.org/x/net v0.0.0-20190603091049-60506f45cf65 // indirect
-	golang.org/x/sys v0.0.0-20190606122018-79a91cf218c4 // indirect
-)
diff --git a/vendor/github.com/mdlayher/ethernet/go.sum b/vendor/github.com/mdlayher/ethernet/go.sum
deleted file mode 100644
index 175e853..0000000
--- a/vendor/github.com/mdlayher/ethernet/go.sum
+++ /dev/null
@@ -1,15 +0,0 @@
-github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
-github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
-github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
-github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-github.com/mdlayher/raw v0.0.0-20190606142536-fef19f00fc18 h1:zwOa3e/13D6veNIz6zzuqrd3eZEMF0dzD0AQWKcYSs4=
-github.com/mdlayher/raw v0.0.0-20190606142536-fef19f00fc18/go.mod h1:7EpbotpCmVZcu+KCX4g9WaRNuu11uyhiW7+Le1dKawg=
-golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/net v0.0.0-20190419010253-1f3472d942ba/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190603091049-60506f45cf65 h1:+rhAzEzT3f4JtomfC371qB+0Ola2caSKcY69NUBZrRQ=
-golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
-golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190418153312-f0ce4c0180be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190606122018-79a91cf218c4 h1:3i7qG/aA9NUAzdnJHfhgxSKSmxbAebomYR5IZgFbC5Y=
-golang.org/x/sys v0.0.0-20190606122018-79a91cf218c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
diff --git a/vendor/github.com/mdlayher/ethernet/string.go b/vendor/github.com/mdlayher/ethernet/string.go
deleted file mode 100644
index 89a3e01..0000000
--- a/vendor/github.com/mdlayher/ethernet/string.go
+++ /dev/null
@@ -1,38 +0,0 @@
-// Code generated by "stringer -output=string.go -type=EtherType"; DO NOT EDIT.
-
-package ethernet
-
-import "fmt"
-
-const (
-	_EtherType_name_0 = "EtherTypeIPv4"
-	_EtherType_name_1 = "EtherTypeARP"
-	_EtherType_name_2 = "EtherTypeVLAN"
-	_EtherType_name_3 = "EtherTypeIPv6"
-	_EtherType_name_4 = "EtherTypeServiceVLAN"
-)
-
-var (
-	_EtherType_index_0 = [...]uint8{0, 13}
-	_EtherType_index_1 = [...]uint8{0, 12}
-	_EtherType_index_2 = [...]uint8{0, 13}
-	_EtherType_index_3 = [...]uint8{0, 13}
-	_EtherType_index_4 = [...]uint8{0, 20}
-)
-
-func (i EtherType) String() string {
-	switch {
-	case i == 2048:
-		return _EtherType_name_0
-	case i == 2054:
-		return _EtherType_name_1
-	case i == 33024:
-		return _EtherType_name_2
-	case i == 34525:
-		return _EtherType_name_3
-	case i == 34984:
-		return _EtherType_name_4
-	default:
-		return fmt.Sprintf("EtherType(%d)", i)
-	}
-}
diff --git a/vendor/github.com/mdlayher/ethernet/vlan.go b/vendor/github.com/mdlayher/ethernet/vlan.go
deleted file mode 100644
index 6ada6a9..0000000
--- a/vendor/github.com/mdlayher/ethernet/vlan.go
+++ /dev/null
@@ -1,129 +0,0 @@
-package ethernet
-
-import (
-	"encoding/binary"
-	"errors"
-	"io"
-)
-
-const (
-	// VLANNone is a special VLAN ID which indicates that no VLAN is being
-	// used in a Frame.  In this case, the VLAN's other fields may be used
-	// to indicate a Frame's priority.
-	VLANNone = 0x000
-
-	// VLANMax is a reserved VLAN ID which may indicate a wildcard in some
-	// management systems, but may not be configured or transmitted in a
-	// VLAN tag.
-	VLANMax = 0xfff
-)
-
-var (
-	// ErrInvalidVLAN is returned when a VLAN tag is invalid due to one of the
-	// following reasons:
-	//   - Priority of greater than 7 is detected
-	//   - ID of greater than 4094 (0xffe) is detected
-	//   - A customer VLAN does not follow a service VLAN (when using Q-in-Q)
-	ErrInvalidVLAN = errors.New("invalid VLAN")
-)
-
-// Priority is an IEEE P802.1p priority level.  Priority can be any value from
-// 0 to 7.
-//
-// It is important to note that priority 1 (PriorityBackground) actually has
-// a lower priority than 0 (PriorityBestEffort).  All other Priority constants
-// indicate higher priority as the integer values increase.
-type Priority uint8
-
-// IEEE P802.1p recommended priority levels.  Note that PriorityBackground has
-// a lower priority than PriorityBestEffort.
-const (
-	PriorityBackground           Priority = 1
-	PriorityBestEffort           Priority = 0
-	PriorityExcellentEffort      Priority = 2
-	PriorityCriticalApplications Priority = 3
-	PriorityVideo                Priority = 4
-	PriorityVoice                Priority = 5
-	PriorityInternetworkControl  Priority = 6
-	PriorityNetworkControl       Priority = 7
-)
-
-// A VLAN is an IEEE 802.1Q Virtual LAN (VLAN) tag.  A VLAN contains
-// information regarding traffic priority and a VLAN identifier for
-// a given Frame.
-type VLAN struct {
-	// Priority specifies a IEEE P802.1p priority level.  Priority can be any
-	// value from 0 to 7.
-	Priority Priority
-
-	// DropEligible indicates if a Frame is eligible to be dropped in the
-	// presence of network congestion.
-	DropEligible bool
-
-	// ID specifies the VLAN ID for a Frame.  ID can be any value from 0 to
-	// 4094 (0x000 to 0xffe), allowing up to 4094 VLANs.
-	//
-	// If ID is 0 (0x000, VLANNone), no VLAN is specified, and the other fields
-	// simply indicate a Frame's priority.
-	ID uint16
-}
-
-// MarshalBinary allocates a byte slice and marshals a VLAN into binary form.
-func (v *VLAN) MarshalBinary() ([]byte, error) {
-	b := make([]byte, 2)
-	_, err := v.read(b)
-	return b, err
-}
-
-// read reads data from a VLAN into b.  read is used to marshal a VLAN into
-// binary form, but does not allocate on its own.
-func (v *VLAN) read(b []byte) (int, error) {
-	// Check for VLAN priority in valid range
-	if v.Priority > PriorityNetworkControl {
-		return 0, ErrInvalidVLAN
-	}
-
-	// Check for VLAN ID in valid range
-	if v.ID >= VLANMax {
-		return 0, ErrInvalidVLAN
-	}
-
-	// 3 bits: priority
-	ub := uint16(v.Priority) << 13
-
-	// 1 bit: drop eligible
-	var drop uint16
-	if v.DropEligible {
-		drop = 1
-	}
-	ub |= drop << 12
-
-	// 12 bits: VLAN ID
-	ub |= v.ID
-
-	binary.BigEndian.PutUint16(b, ub)
-	return 2, nil
-}
-
-// UnmarshalBinary unmarshals a byte slice into a VLAN.
-func (v *VLAN) UnmarshalBinary(b []byte) error {
-	// VLAN tag is always 2 bytes
-	if len(b) != 2 {
-		return io.ErrUnexpectedEOF
-	}
-
-	//  3 bits: priority
-	//  1 bit : drop eligible
-	// 12 bits: VLAN ID
-	ub := binary.BigEndian.Uint16(b[0:2])
-	v.Priority = Priority(uint8(ub >> 13))
-	v.DropEligible = ub&0x1000 != 0
-	v.ID = ub & 0x0fff
-
-	// Check for VLAN ID in valid range
-	if v.ID >= VLANMax {
-		return ErrInvalidVLAN
-	}
-
-	return nil
-}
