Updated Adapter to support to handle DHCP trap on NNI and packet-in/out and Bug Fixing.
Tested EAPOL/DHCP/HSIA functionality E2E with EdgeCore OLT and TWSH ONU KIT.
patch: PON port is derived from platform and sent to core and bug fixes
Retested EAPOL/DHCP/HSIA use case end to end with EdgeCore OLT and TWSH ONU KIT
Change-Id: I99df82fd7a1385c10878f6fe09ce0d30c48d8e99
diff --git a/vendor/github.com/mdlayher/ethernet/vlan.go b/vendor/github.com/mdlayher/ethernet/vlan.go
new file mode 100644
index 0000000..6ada6a9
--- /dev/null
+++ b/vendor/github.com/mdlayher/ethernet/vlan.go
@@ -0,0 +1,129 @@
+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
+}