[VOL-1349] EPON OLT adapter (package B)

Change-Id: I634ef62c53813dcf4456f54948f13e06358e263c
diff --git a/internal/pkg/core/l2oam/msg_discovery_test.go b/internal/pkg/core/l2oam/msg_discovery_test.go
new file mode 100644
index 0000000..618c81a
--- /dev/null
+++ b/internal/pkg/core/l2oam/msg_discovery_test.go
@@ -0,0 +1,1409 @@
+/*
+ * Copyright 2020-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package l2oam
+
+import (
+	"encoding/binary"
+	"encoding/hex"
+	"fmt"
+	"reflect"
+	"testing"
+
+	"github.com/google/gopacket"
+	"github.com/google/gopacket/layers"
+)
+
+func TestGenerateDiscoverySOLICIT(t *testing.T) {
+	tests := []struct {
+		name string
+		want gopacket.SerializableLayer
+	}{
+		// TODO: Add test cases.
+		{
+			name: "GenerateDiscoverySOLICIT-1",
+			want: &DiscoverySolicit{
+				// IEEE 1904.2
+				Opcode:        0xfd,
+				DiscoveryType: 0x01,
+				// Vendor-specific
+				VendorType: 0xfe,
+				Length:     37,
+				// Vendor ID
+				VendorIDType:   0xfd,
+				VendorIDLength: 3,
+				VendorID:       []byte{0x2a, 0xea, 0x15},
+				// Controller Priority
+				CPType:   0x05,
+				CPLength: 1,
+				CPValue:  []byte{128},
+				//NetworkID
+				NWType:   0x06,
+				NWLength: 16,
+				NWValue:  []byte("tibitcom.com"),
+				//Device Type
+				DVType:   0x07,
+				DVLength: 1,
+				DVValue:  []byte{1},
+				//Supported CLient Protocols
+				SCPType:   0x08,
+				SCPLength: 1,
+				SCPValue:  []byte{0x03},
+				//Padding
+				PadType:   0xff,
+				PadLength: 1,
+				PadValue:  []byte{0},
+			},
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			if got := GenerateDiscoverySOLICIT(); !reflect.DeepEqual(got, tt.want) {
+				t.Errorf("GenerateDiscoverySOLICIT() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func TestDiscoverySolicit_String(t *testing.T) {
+	type fields struct {
+		BaseLayer      layers.BaseLayer
+		Opcode         uint8
+		DiscoveryType  uint8
+		VendorType     uint8
+		Length         uint16
+		VendorIDType   uint8
+		VendorIDLength uint16
+		VendorID       []byte
+		CPType         uint8
+		CPLength       uint16
+		CPValue        []byte
+		NWType         uint8
+		NWLength       uint16
+		NWValue        []byte
+		DVType         uint8
+		DVLength       uint16
+		DVValue        []byte
+		SCPType        uint8
+		SCPLength      uint16
+		SCPValue       []byte
+		PadType        uint8
+		PadLength      uint16
+		PadValue       []byte
+	}
+	tests := []struct {
+		name   string
+		fields fields
+		want   string
+	}{
+		// TODO: Add test cases.
+		{
+			name: "String-1",
+			fields: fields{
+				// IEEE 1904.2
+				Opcode:        0xfd,
+				DiscoveryType: 0x01,
+				// Vendor-specific
+				VendorType: 0xfe,
+				Length:     37,
+				// Vendor ID
+				VendorIDType:   0xfd,
+				VendorIDLength: 3,
+				VendorID:       []byte{0x2a, 0xea, 0x15},
+				// Controller Priority
+				CPType:   0x05,
+				CPLength: 1,
+				CPValue:  []byte{128},
+				//NetworkID
+				NWType:   0x06,
+				NWLength: 16,
+				NWValue:  []byte("tibitcom.com"),
+				//Device Type
+				DVType:   0x07,
+				DVLength: 1,
+				DVValue:  []byte{1},
+				//Supported CLient Protocols
+				SCPType:   0x08,
+				SCPLength: 1,
+				SCPValue:  []byte{0x03},
+				//Padding
+				PadType:   0xff,
+				PadLength: 1,
+				PadValue:  []byte{0},
+			},
+			want: fmt.Sprintf("Opcode:253, DiscoveryType:1, VendorType:254, Length:37, VendorIDType:253, VendorIDLength:3, VendorID:2aea15, CPType:5, CPLength:1, CPValue:80, NWType:6, NWLength:16, NWValue:%v, DVType:7, DVLength:1, DVValue:01, SCPType:8, SCPLength:1, SCPValue:03", hex.EncodeToString([]byte("tibitcom.com"))),
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			d := &DiscoverySolicit{
+				BaseLayer:      tt.fields.BaseLayer,
+				Opcode:         tt.fields.Opcode,
+				DiscoveryType:  tt.fields.DiscoveryType,
+				VendorType:     tt.fields.VendorType,
+				Length:         tt.fields.Length,
+				VendorIDType:   tt.fields.VendorIDType,
+				VendorIDLength: tt.fields.VendorIDLength,
+				VendorID:       tt.fields.VendorID,
+				CPType:         tt.fields.CPType,
+				CPLength:       tt.fields.CPLength,
+				CPValue:        tt.fields.CPValue,
+				NWType:         tt.fields.NWType,
+				NWLength:       tt.fields.NWLength,
+				NWValue:        tt.fields.NWValue,
+				DVType:         tt.fields.DVType,
+				DVLength:       tt.fields.DVLength,
+				DVValue:        tt.fields.DVValue,
+				SCPType:        tt.fields.SCPType,
+				SCPLength:      tt.fields.SCPLength,
+				SCPValue:       tt.fields.SCPValue,
+				PadType:        tt.fields.PadType,
+				PadLength:      tt.fields.PadLength,
+				PadValue:       tt.fields.PadValue,
+			}
+			if got := d.String(); got != tt.want {
+				t.Errorf("DiscoverySolicit.String() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func TestDiscoverySolicit_Len(t *testing.T) {
+	type fields struct {
+		BaseLayer      layers.BaseLayer
+		Opcode         uint8
+		DiscoveryType  uint8
+		VendorType     uint8
+		Length         uint16
+		VendorIDType   uint8
+		VendorIDLength uint16
+		VendorID       []byte
+		CPType         uint8
+		CPLength       uint16
+		CPValue        []byte
+		NWType         uint8
+		NWLength       uint16
+		NWValue        []byte
+		DVType         uint8
+		DVLength       uint16
+		DVValue        []byte
+		SCPType        uint8
+		SCPLength      uint16
+		SCPValue       []byte
+		PadType        uint8
+		PadLength      uint16
+		PadValue       []byte
+	}
+	tests := []struct {
+		name   string
+		fields fields
+		want   int
+	}{
+		// TODO: Add test cases.
+		{
+			name: "Len-1",
+			fields: fields{
+				// IEEE 1904.2
+				Opcode:        0xfd,
+				DiscoveryType: 0x01,
+				// Vendor-specific
+				VendorType: 0xfe,
+				Length:     37,
+				// Vendor ID
+				VendorIDType:   0xfd,
+				VendorIDLength: 3,
+				VendorID:       []byte{0x2a, 0xea, 0x15},
+				// Controller Priority
+				CPType:   0x05,
+				CPLength: 1,
+				CPValue:  []byte{128},
+				//NetworkID
+				NWType:   0x06,
+				NWLength: 16,
+				NWValue:  []byte("tibitcom.com"),
+				//Device Type
+				DVType:   0x07,
+				DVLength: 1,
+				DVValue:  []byte{1},
+				//Supported CLient Protocols
+				SCPType:   0x08,
+				SCPLength: 1,
+				SCPValue:  []byte{0x03},
+				//Padding
+				PadType:   0xff,
+				PadLength: 1,
+				PadValue:  []byte{0},
+			},
+			want: 46,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			d := &DiscoverySolicit{
+				BaseLayer:      tt.fields.BaseLayer,
+				Opcode:         tt.fields.Opcode,
+				DiscoveryType:  tt.fields.DiscoveryType,
+				VendorType:     tt.fields.VendorType,
+				Length:         tt.fields.Length,
+				VendorIDType:   tt.fields.VendorIDType,
+				VendorIDLength: tt.fields.VendorIDLength,
+				VendorID:       tt.fields.VendorID,
+				CPType:         tt.fields.CPType,
+				CPLength:       tt.fields.CPLength,
+				CPValue:        tt.fields.CPValue,
+				NWType:         tt.fields.NWType,
+				NWLength:       tt.fields.NWLength,
+				NWValue:        tt.fields.NWValue,
+				DVType:         tt.fields.DVType,
+				DVLength:       tt.fields.DVLength,
+				DVValue:        tt.fields.DVValue,
+				SCPType:        tt.fields.SCPType,
+				SCPLength:      tt.fields.SCPLength,
+				SCPValue:       tt.fields.SCPValue,
+				PadType:        tt.fields.PadType,
+				PadLength:      tt.fields.PadLength,
+				PadValue:       tt.fields.PadValue,
+			}
+			if got := d.Len(); got != tt.want {
+				t.Errorf("DiscoverySolicit.Len() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func TestDiscoverySolicit_LayerType(t *testing.T) {
+	type fields struct {
+		BaseLayer      layers.BaseLayer
+		Opcode         uint8
+		DiscoveryType  uint8
+		VendorType     uint8
+		Length         uint16
+		VendorIDType   uint8
+		VendorIDLength uint16
+		VendorID       []byte
+		CPType         uint8
+		CPLength       uint16
+		CPValue        []byte
+		NWType         uint8
+		NWLength       uint16
+		NWValue        []byte
+		DVType         uint8
+		DVLength       uint16
+		DVValue        []byte
+		SCPType        uint8
+		SCPLength      uint16
+		SCPValue       []byte
+		PadType        uint8
+		PadLength      uint16
+		PadValue       []byte
+	}
+	tests := []struct {
+		name   string
+		fields fields
+		want   gopacket.LayerType
+	}{
+		// TODO: Add test cases.
+		{
+			name: "LayerType-1",
+			want: layers.LayerTypeEthernet,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			d := &DiscoverySolicit{
+				BaseLayer:      tt.fields.BaseLayer,
+				Opcode:         tt.fields.Opcode,
+				DiscoveryType:  tt.fields.DiscoveryType,
+				VendorType:     tt.fields.VendorType,
+				Length:         tt.fields.Length,
+				VendorIDType:   tt.fields.VendorIDType,
+				VendorIDLength: tt.fields.VendorIDLength,
+				VendorID:       tt.fields.VendorID,
+				CPType:         tt.fields.CPType,
+				CPLength:       tt.fields.CPLength,
+				CPValue:        tt.fields.CPValue,
+				NWType:         tt.fields.NWType,
+				NWLength:       tt.fields.NWLength,
+				NWValue:        tt.fields.NWValue,
+				DVType:         tt.fields.DVType,
+				DVLength:       tt.fields.DVLength,
+				DVValue:        tt.fields.DVValue,
+				SCPType:        tt.fields.SCPType,
+				SCPLength:      tt.fields.SCPLength,
+				SCPValue:       tt.fields.SCPValue,
+				PadType:        tt.fields.PadType,
+				PadLength:      tt.fields.PadLength,
+				PadValue:       tt.fields.PadValue,
+			}
+			if got := d.LayerType(); !reflect.DeepEqual(got, tt.want) {
+				t.Errorf("DiscoverySolicit.LayerType() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func TestDiscoverySolicit_SerializeTo(t *testing.T) {
+	type fields struct {
+		BaseLayer      layers.BaseLayer
+		Opcode         uint8
+		DiscoveryType  uint8
+		VendorType     uint8
+		Length         uint16
+		VendorIDType   uint8
+		VendorIDLength uint16
+		VendorID       []byte
+		CPType         uint8
+		CPLength       uint16
+		CPValue        []byte
+		NWType         uint8
+		NWLength       uint16
+		NWValue        []byte
+		DVType         uint8
+		DVLength       uint16
+		DVValue        []byte
+		SCPType        uint8
+		SCPLength      uint16
+		SCPValue       []byte
+		PadType        uint8
+		PadLength      uint16
+		PadValue       []byte
+	}
+	type args struct {
+		b    gopacket.SerializeBuffer
+		opts gopacket.SerializeOptions
+	}
+	tests := []struct {
+		name    string
+		fields  fields
+		args    args
+		wantErr bool
+	}{
+		// TODO: Add test cases.
+		{
+			name: "SerializeTo-1",
+			fields: fields{
+				// IEEE 1904.2
+				Opcode:        0xfd,
+				DiscoveryType: 0x01,
+				// Vendor-specific
+				VendorType: 0xfe,
+				Length:     37,
+				// Vendor ID
+				VendorIDType:   0xfd,
+				VendorIDLength: 3,
+				VendorID:       []byte{0x2a, 0xea, 0x15},
+				// Controller Priority
+				CPType:   0x05,
+				CPLength: 1,
+				CPValue:  []byte{128},
+				//NetworkID
+				NWType:   0x06,
+				NWLength: 16,
+				NWValue:  []byte("tibitcom.com"),
+				//Device Type
+				DVType:   0x07,
+				DVLength: 1,
+				DVValue:  []byte{1},
+				//Supported CLient Protocols
+				SCPType:   0x08,
+				SCPLength: 1,
+				SCPValue:  []byte{0x03},
+				//Padding
+				PadType:   0xff,
+				PadLength: 1,
+				PadValue:  []byte{0},
+			},
+			args: args{
+				b:    gopacket.NewSerializeBufferExpectedSize(0, 36),
+				opts: gopacket.SerializeOptions{},
+			},
+			wantErr: false,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			d := &DiscoverySolicit{
+				BaseLayer:      tt.fields.BaseLayer,
+				Opcode:         tt.fields.Opcode,
+				DiscoveryType:  tt.fields.DiscoveryType,
+				VendorType:     tt.fields.VendorType,
+				Length:         tt.fields.Length,
+				VendorIDType:   tt.fields.VendorIDType,
+				VendorIDLength: tt.fields.VendorIDLength,
+				VendorID:       tt.fields.VendorID,
+				CPType:         tt.fields.CPType,
+				CPLength:       tt.fields.CPLength,
+				CPValue:        tt.fields.CPValue,
+				NWType:         tt.fields.NWType,
+				NWLength:       tt.fields.NWLength,
+				NWValue:        tt.fields.NWValue,
+				DVType:         tt.fields.DVType,
+				DVLength:       tt.fields.DVLength,
+				DVValue:        tt.fields.DVValue,
+				SCPType:        tt.fields.SCPType,
+				SCPLength:      tt.fields.SCPLength,
+				SCPValue:       tt.fields.SCPValue,
+				PadType:        tt.fields.PadType,
+				PadLength:      tt.fields.PadLength,
+				PadValue:       tt.fields.PadValue,
+			}
+			if err := d.SerializeTo(tt.args.b, tt.args.opts); (err != nil) != tt.wantErr {
+				t.Errorf("DiscoverySolicit.SerializeTo error = %v, wantErr %v", err, tt.wantErr)
+			}
+
+			data := tt.args.b.Bytes()
+			cnt := 0
+			digits := 0
+			if !reflect.DeepEqual(d.Opcode, data[cnt]) {
+				t.Error("DiscoverySolicit.SerializeTo Opcode error")
+			}
+			cnt++
+			if !reflect.DeepEqual(d.DiscoveryType, data[cnt]) {
+				t.Error("DiscoverySolicit.SerializeTo DiscoveryType error")
+			}
+			cnt++
+			if !reflect.DeepEqual(d.VendorType, data[cnt]) {
+				t.Error("DiscoverySolicit.SerializeTo VendorType error")
+			}
+			cnt++
+
+			if !reflect.DeepEqual(d.Length, binary.BigEndian.Uint16(data[cnt:cnt+2])) {
+				t.Error("DiscoverySolicit.SerializeTo Length error")
+			}
+			cnt += 2
+
+			if !reflect.DeepEqual(d.VendorIDType, data[cnt]) {
+				t.Error("DiscoverySolicit.SerializeTo VendorIDType error")
+			}
+			cnt++
+			if !reflect.DeepEqual(d.VendorIDLength, binary.BigEndian.Uint16(data[cnt:cnt+2])) {
+				t.Error("DiscoverySolicit.SerializeTo VendorIDLength error")
+			}
+			cnt += 2
+			digits = int(d.VendorIDLength)
+			if !reflect.DeepEqual(d.VendorID, data[cnt:cnt+digits]) {
+				t.Error("DiscoverySolicit.SerializeTo VendorID error")
+			}
+			cnt += digits
+			if !reflect.DeepEqual(d.CPType, data[cnt]) {
+				t.Error("DiscoverySolicit.SerializeTo CPType error")
+			}
+			cnt++
+			if !reflect.DeepEqual(d.CPLength, binary.BigEndian.Uint16(data[cnt:cnt+2])) {
+				t.Error("DiscoverySolicit.SerializeTo CPLength error")
+			}
+			cnt += 2
+			digits = int(d.CPLength)
+			if !reflect.DeepEqual(d.CPValue, data[cnt:cnt+digits]) {
+				t.Error("DiscoverySolicit.SerializeTo CPValue error")
+			}
+			cnt += digits
+			if !reflect.DeepEqual(d.NWType, data[cnt]) {
+				t.Error("DiscoverySolicit.SerializeTo NWType error")
+			}
+			cnt++
+			if !reflect.DeepEqual(d.NWLength, binary.BigEndian.Uint16(data[cnt:cnt+2])) {
+				t.Error("DiscoverySolicit.SerializeTo NWLength error")
+			}
+			cnt += 2
+			//digits = int(d.NWLength)
+			for _, dvalue := range d.NWValue {
+				if !reflect.DeepEqual(dvalue, data[cnt]) {
+					t.Error("DiscoverySolicit.SerializeTo NWValue error")
+				}
+				cnt++
+			}
+			// if !reflect.DeepEqual(string(d.NWValue), string(data[cnt:cnt+digits])) {
+			// 	t.Errorf("DiscoverySolicit.SerializeTo NWValue error %x %x", d.NWValue, data[cnt:cnt+digits])
+			// }
+			cnt += 4
+			if !reflect.DeepEqual(d.DVType, data[cnt]) {
+				t.Error("DiscoverySolicit.SerializeTo DVType error")
+			}
+			cnt++
+			if !reflect.DeepEqual(d.DVLength, binary.BigEndian.Uint16(data[cnt:cnt+2])) {
+				t.Error("DiscoverySolicit.SerializeTo DVLength error")
+			}
+			cnt += 2
+			digits = int(d.DVLength)
+			if !reflect.DeepEqual(d.DVValue, data[cnt:cnt+digits]) {
+				t.Error("DiscoverySolicit.SerializeTo DVValue error")
+			}
+			cnt += digits
+			if !reflect.DeepEqual(d.SCPType, data[cnt]) {
+				t.Error("DiscoverySolicit.SerializeTo SCPType error")
+			}
+			cnt++
+			if !reflect.DeepEqual(d.SCPLength, binary.BigEndian.Uint16(data[cnt:cnt+2])) {
+				t.Error("DiscoverySolicit.SerializeTo SCPLength error")
+			}
+			cnt += 2
+			digits = int(d.SCPLength)
+			if !reflect.DeepEqual(d.SCPValue, data[cnt:cnt+digits]) {
+				t.Error("DiscoverySolicit.SerializeTo SCPValue error")
+			}
+			cnt += digits
+			if !reflect.DeepEqual(d.PadType, data[cnt]) {
+				t.Error("DiscoverySolicit.SerializeTo PadType error")
+			}
+			cnt++
+			if !reflect.DeepEqual(d.PadLength, binary.BigEndian.Uint16(data[cnt:cnt+2])) {
+				t.Error("DiscoverySolicit.SerializeTo PadLength error")
+			}
+			cnt += 2
+			digits = int(d.PadLength)
+			if !reflect.DeepEqual(d.PadValue, data[cnt:cnt+digits]) {
+				t.Error("DiscoverySolicit.SerializeTo PadValue error")
+			}
+
+		})
+	}
+}
+
+func TestDiscoverySolicit_Decode(t *testing.T) {
+	type fields struct {
+		BaseLayer      layers.BaseLayer
+		Opcode         uint8
+		DiscoveryType  uint8
+		VendorType     uint8
+		Length         uint16
+		VendorIDType   uint8
+		VendorIDLength uint16
+		VendorID       []byte
+		CPType         uint8
+		CPLength       uint16
+		CPValue        []byte
+		NWType         uint8
+		NWLength       uint16
+		NWValue        []byte
+		DVType         uint8
+		DVLength       uint16
+		DVValue        []byte
+		SCPType        uint8
+		SCPLength      uint16
+		SCPValue       []byte
+		PadType        uint8
+		PadLength      uint16
+		PadValue       []byte
+	}
+	type args struct {
+		data []byte
+	}
+	tests := []struct {
+		name    string
+		fields  fields
+		args    args
+		wantErr bool
+	}{
+		// TODO: Add test cases.
+		{
+			name: "Decode-1",
+			args: args{
+				data: []byte{0xfd, 0x01, 0xfe, 0x00, 0x25, 0xfd, 0x00, 0x03, 0x2a, 0xea, 0x15, 0x05, 0x00, 0x01, 0x80, 0x06, 0x00, 0x10, 0x74, 0x69, 0x62, 0x69, 0x74, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x6f, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x01, 0x01, 0x08, 0x00, 0x01, 0x03, 0xff, 0x00, 0x01, 0x00},
+			},
+			wantErr: false,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			d := &DiscoverySolicit{
+				BaseLayer:      tt.fields.BaseLayer,
+				Opcode:         tt.fields.Opcode,
+				DiscoveryType:  tt.fields.DiscoveryType,
+				VendorType:     tt.fields.VendorType,
+				Length:         tt.fields.Length,
+				VendorIDType:   tt.fields.VendorIDType,
+				VendorIDLength: tt.fields.VendorIDLength,
+				VendorID:       tt.fields.VendorID,
+				CPType:         tt.fields.CPType,
+				CPLength:       tt.fields.CPLength,
+				CPValue:        tt.fields.CPValue,
+				NWType:         tt.fields.NWType,
+				NWLength:       tt.fields.NWLength,
+				NWValue:        tt.fields.NWValue,
+				DVType:         tt.fields.DVType,
+				DVLength:       tt.fields.DVLength,
+				DVValue:        tt.fields.DVValue,
+				SCPType:        tt.fields.SCPType,
+				SCPLength:      tt.fields.SCPLength,
+				SCPValue:       tt.fields.SCPValue,
+				PadType:        tt.fields.PadType,
+				PadLength:      tt.fields.PadLength,
+				PadValue:       tt.fields.PadValue,
+			}
+			if err := d.Decode(tt.args.data); (err != nil) != tt.wantErr {
+				t.Errorf("DiscoverySolicit.Decode error = %v, wantErr %v", err, tt.wantErr)
+			}
+
+			cnt := 0
+			digits := 0
+
+			if !reflect.DeepEqual(d.Opcode, tt.args.data[cnt]) {
+				t.Errorf("DiscoverySolicit.Decode Opcode error Opcode=%x,data=%x,cnt=%x", d.Opcode, tt.args.data[cnt:], cnt)
+			}
+			cnt++
+			if !reflect.DeepEqual(d.DiscoveryType, tt.args.data[cnt]) {
+				t.Errorf("DiscoverySolicit.Decode DiscoveryType error DiscoveryType=%X data=%x", d.DiscoveryType, tt.args.data[cnt:cnt+1])
+			}
+			cnt++
+			if !reflect.DeepEqual(d.VendorType, tt.args.data[cnt]) {
+				t.Errorf("DiscoverySolicit.Decode VendorType error %x %x", tt.args.data[cnt], d.VendorType)
+			}
+			cnt++
+
+			if !reflect.DeepEqual(d.Length, binary.BigEndian.Uint16(tt.args.data[cnt:cnt+2])) {
+				t.Errorf("DiscoverySolicit.Decode Length error Length=%x data[cnt:cnt+2]=%x", string(d.Length), string(binary.BigEndian.Uint16(tt.args.data[cnt:cnt+2])))
+			}
+			cnt += 2
+
+			if !reflect.DeepEqual(d.VendorIDType, tt.args.data[cnt]) {
+				t.Errorf("DiscoverySolicit.Decode VendorIDType error VendorIDType=%x data=%x", d.VendorIDType, tt.args.data[cnt])
+			}
+			cnt++
+			if !reflect.DeepEqual(d.VendorIDLength, binary.BigEndian.Uint16(tt.args.data[cnt:cnt+2])) {
+				t.Errorf("DiscoverySolicit.Decode VendorIDLength error VendorIDLength=%x data[cnt:cnt+2]=%x", d.VendorIDLength, tt.args.data[cnt:cnt+2])
+			}
+			cnt += 2
+			digits = int(d.VendorIDLength)
+			if !reflect.DeepEqual(d.VendorID, tt.args.data[cnt:cnt+digits]) {
+				t.Errorf("DiscoverySolicit.Decode VendorID error %v %v", d.VendorID, tt.args.data[cnt:cnt+3])
+			}
+			cnt += digits
+			if !reflect.DeepEqual(d.CPType, tt.args.data[cnt]) {
+				t.Error("DiscoverySolicit.Decode CPType error")
+			}
+			cnt++
+			if !reflect.DeepEqual(d.CPLength, binary.BigEndian.Uint16(tt.args.data[cnt:cnt+2])) {
+				t.Error("DiscoverySolicit.Decode CPLength error")
+			}
+			cnt += 2
+			digits = int(d.CPLength)
+			if !reflect.DeepEqual(d.CPValue, tt.args.data[cnt:cnt+digits]) {
+				t.Errorf("DiscoverySolicit.Decode CPValue error %x %x", tt.args.data[14:15], d.CPValue)
+			}
+			cnt += digits
+			if !reflect.DeepEqual(d.NWType, tt.args.data[cnt]) {
+				t.Error("DiscoverySolicit.Decode NWType error")
+			}
+			cnt++
+			if !reflect.DeepEqual(d.NWLength, binary.BigEndian.Uint16(tt.args.data[cnt:cnt+2])) {
+				t.Error("DiscoverySolicit.Decode NWLength error")
+			}
+			cnt += 2
+			//digits = int(d.NWLength)
+			for _, dvalue := range d.NWValue {
+				if !reflect.DeepEqual(dvalue, tt.args.data[cnt]) {
+					t.Errorf("DiscoverySolicit.Decode NWValue error %x %x", dvalue, tt.args.data[cnt])
+				}
+				cnt++
+			}
+			// if !reflect.DeepEqual(string(d.NWValue), string(tt.args.data[cnt:cnt+digits])) {
+			// 	t.Errorf("DiscoverySolicit.Decode NWValue error %x %x", d.NWValue, tt.args.data[cnt:cnt+digits])
+			// }
+			// cnt += 4
+			if !reflect.DeepEqual(d.DVType, tt.args.data[cnt]) {
+				t.Errorf("DiscoverySolicit.Decode DVType error %x %x", d.DVType, tt.args.data[cnt])
+			}
+			cnt++
+			if !reflect.DeepEqual(d.DVLength, binary.BigEndian.Uint16(tt.args.data[cnt:cnt+2])) {
+				t.Errorf("DiscoverySolicit.Decode DVLength error %x %x", d.DVLength, tt.args.data[cnt:cnt+2])
+			}
+			cnt += 2
+			digits = int(d.DVLength)
+			if !reflect.DeepEqual(d.DVValue, tt.args.data[cnt:cnt+digits]) {
+				t.Errorf("DiscoverySolicit.Decode DVValue error %x %x", d.DVValue, tt.args.data[cnt:cnt+digits])
+			}
+			cnt += digits
+			if !reflect.DeepEqual(d.SCPType, tt.args.data[cnt]) {
+				t.Errorf("DiscoverySolicit.Decode SCPType error %x %x", d.SCPType, tt.args.data[cnt])
+			}
+			cnt++
+			if !reflect.DeepEqual(d.SCPLength, binary.BigEndian.Uint16(tt.args.data[cnt:cnt+2])) {
+				t.Error("DiscoverySolicit.Decode SCPLength error")
+			}
+			cnt += 2
+			digits = int(d.SCPLength)
+			if !reflect.DeepEqual(d.SCPValue, tt.args.data[cnt:cnt+digits]) {
+				t.Errorf("DiscoverySolicit.Decode SCPValue error cnt= %x digits=%x", cnt, digits)
+			}
+			cnt += digits
+			if !reflect.DeepEqual(d.PadType, tt.args.data[cnt]) {
+				t.Error("DiscoverySolicit.Decode PadType error")
+			}
+			cnt++
+			if !reflect.DeepEqual(d.PadLength, binary.BigEndian.Uint16(tt.args.data[cnt:cnt+2])) {
+				t.Error("DiscoverySolicit.Decode PadLength error")
+			}
+			cnt += 2
+			digits = int(d.PadLength)
+			if !reflect.DeepEqual(d.PadValue, tt.args.data[cnt:cnt+digits]) {
+				t.Errorf("DiscoverySolicit.Decode PadValue error %x %x", d.PadValue, tt.args.data[cnt:cnt+digits])
+			}
+
+		})
+	}
+}
+
+func TestDiscoveryHello_String(t *testing.T) {
+	type fields struct {
+		BaseLayer      layers.BaseLayer
+		Opcode         uint8
+		DiscoveryType  uint8
+		VendorType     uint8
+		Length         uint16
+		VendorIDType   uint8
+		VendorIDLength uint16
+		VendorID       []byte
+		NWType         uint8
+		NWLength       uint16
+		NWValue        []byte
+		DVType         uint8
+		DVLength       uint16
+		DVValue        []byte
+		SCPType        uint8
+		SCPLength      uint16
+		SCPValue       []byte
+		TunnelType     uint8
+		TunnelLength   uint16
+		TunnelValue    []byte
+		PadType        uint8
+		PadLength      uint16
+		PadValue       []byte
+	}
+	tests := []struct {
+		name   string
+		fields fields
+		want   string
+	}{
+		// TODO: Add test cases.
+		{
+			name: "String-1",
+			fields: fields{
+				Opcode:         0xfd,
+				DiscoveryType:  0x01,
+				VendorType:     0xfe,
+				Length:         0x25,
+				VendorIDType:   0xfd,
+				VendorIDLength: 3,
+				VendorID:       []byte{0x2a, 0xea, 0x15},
+				NWType:         0x06,
+				NWLength:       16,
+				NWValue:        []byte{0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16},
+				DVType:         0x07,
+				DVLength:       1,
+				DVValue:        []byte{2},
+				SCPType:        0x08,
+				SCPLength:      1,
+				SCPValue:       []byte{0x03},
+				TunnelType:     0x0a,
+				TunnelLength:   2,
+				TunnelValue:    []byte{0x00, 0x01},
+				PadType:        0xff,
+				PadLength:      1,
+				PadValue:       []byte{0},
+			},
+			want: "Opcode:253, DiscoveryType:1, VendorType:254, Length:37, VendorIDType:253, VendorIDLength:3, VendorID:2aea15, NWType:6, NWLength:16, NWValue:01020304050607080910111213141516, DVType:7, DVLength:1, DVValue:02, SCPType:8, SCPLength:1, SCPValue:03, TunnelType:10, TunnelLength:2, TunnelValue:0001, PadType:255, PadLength:1, PadValue:00",
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			d := &DiscoveryHello{
+				BaseLayer:      tt.fields.BaseLayer,
+				Opcode:         tt.fields.Opcode,
+				DiscoveryType:  tt.fields.DiscoveryType,
+				VendorType:     tt.fields.VendorType,
+				Length:         tt.fields.Length,
+				VendorIDType:   tt.fields.VendorIDType,
+				VendorIDLength: tt.fields.VendorIDLength,
+				VendorID:       tt.fields.VendorID,
+				NWType:         tt.fields.NWType,
+				NWLength:       tt.fields.NWLength,
+				NWValue:        tt.fields.NWValue,
+				DVType:         tt.fields.DVType,
+				DVLength:       tt.fields.DVLength,
+				DVValue:        tt.fields.DVValue,
+				SCPType:        tt.fields.SCPType,
+				SCPLength:      tt.fields.SCPLength,
+				SCPValue:       tt.fields.SCPValue,
+				TunnelType:     tt.fields.TunnelType,
+				TunnelLength:   tt.fields.TunnelLength,
+				TunnelValue:    tt.fields.TunnelValue,
+				PadType:        tt.fields.PadType,
+				PadLength:      tt.fields.PadLength,
+				PadValue:       tt.fields.PadValue,
+			}
+			if got := d.String(); got != tt.want {
+				t.Errorf("DiscoveryHello.String() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func TestDiscoveryHello_Len(t *testing.T) {
+	type fields struct {
+		BaseLayer      layers.BaseLayer
+		Opcode         uint8
+		DiscoveryType  uint8
+		VendorType     uint8
+		Length         uint16
+		VendorIDType   uint8
+		VendorIDLength uint16
+		VendorID       []byte
+		NWType         uint8
+		NWLength       uint16
+		NWValue        []byte
+		DVType         uint8
+		DVLength       uint16
+		DVValue        []byte
+		SCPType        uint8
+		SCPLength      uint16
+		SCPValue       []byte
+		TunnelType     uint8
+		TunnelLength   uint16
+		TunnelValue    []byte
+		PadType        uint8
+		PadLength      uint16
+		PadValue       []byte
+	}
+	tests := []struct {
+		name   string
+		fields fields
+		want   int
+	}{
+		// TODO: Add test cases.
+		{
+			name: "Len-1",
+			fields: fields{
+				Opcode:         0xfd,
+				DiscoveryType:  0x01,
+				VendorType:     0xfe,
+				Length:         0x25,
+				VendorIDType:   0xfd,
+				VendorIDLength: 3,
+				VendorID:       []byte{0x2a, 0xea, 0x15},
+				NWType:         0x06,
+				NWLength:       16,
+				NWValue:        []byte{0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16},
+				DVType:         0x07,
+				DVLength:       1,
+				DVValue:        []byte{2},
+				SCPType:        0x08,
+				SCPLength:      1,
+				SCPValue:       []byte{0x03},
+				TunnelType:     0x0a,
+				TunnelLength:   2,
+				TunnelValue:    []byte{0x00, 0x01},
+				PadType:        0xff,
+				PadLength:      1,
+				PadValue:       []byte{0},
+			},
+			want: 46,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			d := &DiscoveryHello{
+				BaseLayer:      tt.fields.BaseLayer,
+				Opcode:         tt.fields.Opcode,
+				DiscoveryType:  tt.fields.DiscoveryType,
+				VendorType:     tt.fields.VendorType,
+				Length:         tt.fields.Length,
+				VendorIDType:   tt.fields.VendorIDType,
+				VendorIDLength: tt.fields.VendorIDLength,
+				VendorID:       tt.fields.VendorID,
+				NWType:         tt.fields.NWType,
+				NWLength:       tt.fields.NWLength,
+				NWValue:        tt.fields.NWValue,
+				DVType:         tt.fields.DVType,
+				DVLength:       tt.fields.DVLength,
+				DVValue:        tt.fields.DVValue,
+				SCPType:        tt.fields.SCPType,
+				SCPLength:      tt.fields.SCPLength,
+				SCPValue:       tt.fields.SCPValue,
+				TunnelType:     tt.fields.TunnelType,
+				TunnelLength:   tt.fields.TunnelLength,
+				TunnelValue:    tt.fields.TunnelValue,
+				PadType:        tt.fields.PadType,
+				PadLength:      tt.fields.PadLength,
+				PadValue:       tt.fields.PadValue,
+			}
+			if got := d.Len(); got != tt.want {
+				t.Errorf("DiscoveryHello.Len() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func TestDiscoveryHello_LayerType(t *testing.T) {
+	type fields struct {
+		BaseLayer      layers.BaseLayer
+		Opcode         uint8
+		DiscoveryType  uint8
+		VendorType     uint8
+		Length         uint16
+		VendorIDType   uint8
+		VendorIDLength uint16
+		VendorID       []byte
+		NWType         uint8
+		NWLength       uint16
+		NWValue        []byte
+		DVType         uint8
+		DVLength       uint16
+		DVValue        []byte
+		SCPType        uint8
+		SCPLength      uint16
+		SCPValue       []byte
+		TunnelType     uint8
+		TunnelLength   uint16
+		TunnelValue    []byte
+		PadType        uint8
+		PadLength      uint16
+		PadValue       []byte
+	}
+	tests := []struct {
+		name   string
+		fields fields
+		want   gopacket.LayerType
+	}{
+		// TODO: Add test cases.
+		{
+			name: "LayerType-1",
+			want: layers.LayerTypeEthernet,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			d := &DiscoveryHello{
+				BaseLayer:      tt.fields.BaseLayer,
+				Opcode:         tt.fields.Opcode,
+				DiscoveryType:  tt.fields.DiscoveryType,
+				VendorType:     tt.fields.VendorType,
+				Length:         tt.fields.Length,
+				VendorIDType:   tt.fields.VendorIDType,
+				VendorIDLength: tt.fields.VendorIDLength,
+				VendorID:       tt.fields.VendorID,
+				NWType:         tt.fields.NWType,
+				NWLength:       tt.fields.NWLength,
+				NWValue:        tt.fields.NWValue,
+				DVType:         tt.fields.DVType,
+				DVLength:       tt.fields.DVLength,
+				DVValue:        tt.fields.DVValue,
+				SCPType:        tt.fields.SCPType,
+				SCPLength:      tt.fields.SCPLength,
+				SCPValue:       tt.fields.SCPValue,
+				TunnelType:     tt.fields.TunnelType,
+				TunnelLength:   tt.fields.TunnelLength,
+				TunnelValue:    tt.fields.TunnelValue,
+				PadType:        tt.fields.PadType,
+				PadLength:      tt.fields.PadLength,
+				PadValue:       tt.fields.PadValue,
+			}
+			if got := d.LayerType(); !reflect.DeepEqual(got, tt.want) {
+				t.Errorf("DiscoveryHello.LayerType() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func TestDiscoveryHello_SerializeTo(t *testing.T) {
+	type fields struct {
+		BaseLayer      layers.BaseLayer
+		Opcode         uint8
+		DiscoveryType  uint8
+		VendorType     uint8
+		Length         uint16
+		VendorIDType   uint8
+		VendorIDLength uint16
+		VendorID       []byte
+		NWType         uint8
+		NWLength       uint16
+		NWValue        []byte
+		DVType         uint8
+		DVLength       uint16
+		DVValue        []byte
+		SCPType        uint8
+		SCPLength      uint16
+		SCPValue       []byte
+		TunnelType     uint8
+		TunnelLength   uint16
+		TunnelValue    []byte
+		PadType        uint8
+		PadLength      uint16
+		PadValue       []byte
+	}
+	type args struct {
+		b    gopacket.SerializeBuffer
+		opts gopacket.SerializeOptions
+	}
+	tests := []struct {
+		name    string
+		fields  fields
+		args    args
+		wantErr bool
+	}{
+		// TODO: Add test cases.
+		{
+			name: "SerializeTo-1",
+			fields: fields{
+				Opcode:         0xfd,
+				DiscoveryType:  0x01,
+				VendorType:     0xfe,
+				Length:         0x25,
+				VendorIDType:   0xfd,
+				VendorIDLength: 3,
+				VendorID:       []byte{0x2a, 0xea, 0x15},
+				NWType:         0x06,
+				NWLength:       16,
+				NWValue:        []byte{0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16},
+				DVType:         0x07,
+				DVLength:       1,
+				DVValue:        []byte{2},
+				SCPType:        0x08,
+				SCPLength:      1,
+				SCPValue:       []byte{0x03},
+				TunnelType:     0x0a,
+				TunnelLength:   2,
+				TunnelValue:    []byte{0x00, 0x01},
+				PadType:        0xff,
+				PadLength:      1,
+				PadValue:       []byte{0},
+			},
+			args: args{
+				b:    gopacket.NewSerializeBufferExpectedSize(0, 46),
+				opts: gopacket.SerializeOptions{},
+			},
+			wantErr: false,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			d := &DiscoveryHello{
+				BaseLayer:      tt.fields.BaseLayer,
+				Opcode:         tt.fields.Opcode,
+				DiscoveryType:  tt.fields.DiscoveryType,
+				VendorType:     tt.fields.VendorType,
+				Length:         tt.fields.Length,
+				VendorIDType:   tt.fields.VendorIDType,
+				VendorIDLength: tt.fields.VendorIDLength,
+				VendorID:       tt.fields.VendorID,
+				NWType:         tt.fields.NWType,
+				NWLength:       tt.fields.NWLength,
+				NWValue:        tt.fields.NWValue,
+				DVType:         tt.fields.DVType,
+				DVLength:       tt.fields.DVLength,
+				DVValue:        tt.fields.DVValue,
+				SCPType:        tt.fields.SCPType,
+				SCPLength:      tt.fields.SCPLength,
+				SCPValue:       tt.fields.SCPValue,
+				TunnelType:     tt.fields.TunnelType,
+				TunnelLength:   tt.fields.TunnelLength,
+				TunnelValue:    tt.fields.TunnelValue,
+				PadType:        tt.fields.PadType,
+				PadLength:      tt.fields.PadLength,
+				PadValue:       tt.fields.PadValue,
+			}
+			if err := d.SerializeTo(tt.args.b, tt.args.opts); (err != nil) != tt.wantErr {
+				t.Errorf("DiscoveryHello.SerializeTo() error = %v, wantErr %v", err, tt.wantErr)
+			}
+
+			data := tt.args.b.Bytes()
+			cnt := 0
+			digits := 0
+			if !reflect.DeepEqual(d.Opcode, data[cnt]) {
+				t.Errorf("DiscoverySolicit.SerializeTo Opcode error Opcode=%x,data=%x,cnt=%x", d.Opcode, data[cnt:], cnt)
+			}
+			cnt++
+			if !reflect.DeepEqual(d.DiscoveryType, data[cnt]) {
+				t.Errorf("DiscoverySolicit.SerializeTo DiscoveryType error DiscoveryType=%X data=%x", d.DiscoveryType, data[cnt:cnt+1])
+			}
+			cnt++
+			if !reflect.DeepEqual(d.VendorType, data[cnt]) {
+				t.Errorf("DiscoverySolicit.SerializeTo VendorType error %x %x", data[cnt], d.VendorType)
+			}
+			cnt++
+
+			if !reflect.DeepEqual(d.Length, binary.BigEndian.Uint16(data[cnt:cnt+2])) {
+				t.Errorf("DiscoverySolicit.SerializeTo Length error Length=%x data[cnt:cnt+2]=%x", string(d.Length), string(binary.BigEndian.Uint16(data[cnt:cnt+2])))
+			}
+			cnt += 2
+
+			if !reflect.DeepEqual(d.VendorIDType, data[cnt]) {
+				t.Errorf("DiscoverySolicit.SerializeTo VendorIDType error VendorIDType=%x data=%x", d.VendorIDType, data[cnt])
+			}
+			cnt++
+			if !reflect.DeepEqual(d.VendorIDLength, binary.BigEndian.Uint16(data[cnt:cnt+2])) {
+				t.Errorf("DiscoverySolicit.SerializeTo VendorIDLength error VendorIDLength=%x data[cnt:cnt+2]=%x", d.VendorIDLength, data[cnt:cnt+2])
+			}
+			cnt += 2
+			digits = int(d.VendorIDLength)
+			if !reflect.DeepEqual(d.VendorID, data[cnt:cnt+digits]) {
+				t.Errorf("DiscoverySolicit.SerializeTo VendorID error %v %v", d.VendorID, data[cnt:cnt+3])
+			}
+			cnt += digits
+			if !reflect.DeepEqual(d.NWType, data[cnt]) {
+				t.Error("DiscoverySolicit.SerializeTo NWType error")
+			}
+			cnt++
+			if !reflect.DeepEqual(d.NWLength, binary.BigEndian.Uint16(data[cnt:cnt+2])) {
+				t.Error("DiscoverySolicit.SerializeTo NWLength error")
+			}
+			cnt += 2
+			//digits = int(d.NWLength)
+			for _, dvalue := range d.NWValue {
+				if !reflect.DeepEqual(dvalue, data[cnt]) {
+					t.Errorf("DiscoverySolicit.SerializeTo NWValue error %x %x", dvalue, data[cnt])
+				}
+				cnt++
+			}
+			// if !reflect.DeepEqual(string(d.NWValue), string(data[cnt:cnt+digits])) {
+			// 	t.Errorf("DiscoverySolicit.SerializeTo NWValue error %x %x", d.NWValue, data[cnt:cnt+digits])
+			// }
+			// cnt += 16
+			if !reflect.DeepEqual(d.DVType, data[cnt]) {
+				t.Error("DiscoverySolicit.SerializeTo DVType error")
+			}
+			cnt++
+			if !reflect.DeepEqual(d.DVLength, binary.BigEndian.Uint16(data[cnt:cnt+2])) {
+				t.Error("DiscoverySolicit.SerializeTo DVLength error")
+			}
+			cnt += 2
+			digits = int(d.DVLength)
+			if !reflect.DeepEqual(d.DVValue, data[cnt:cnt+digits]) {
+				t.Error("DiscoverySolicit.SerializeTo DVValue error")
+			}
+			cnt += digits
+			if !reflect.DeepEqual(d.SCPType, data[cnt]) {
+				t.Error("DiscoverySolicit.SerializeTo SCPType error")
+			}
+			cnt++
+			if !reflect.DeepEqual(d.SCPLength, binary.BigEndian.Uint16(data[cnt:cnt+2])) {
+				t.Error("DiscoverySolicit.SerializeTo SCPLength error")
+			}
+			cnt += 2
+			digits = int(d.SCPLength)
+			if !reflect.DeepEqual(d.SCPValue, data[cnt:cnt+digits]) {
+				t.Error("DiscoverySolicit.SerializeTo SCPValue error")
+			}
+			cnt += digits
+			if !reflect.DeepEqual(d.TunnelType, data[cnt]) {
+				t.Error("DiscoverySolicit.SerializeTo TunnelType error")
+			}
+			cnt++
+			if !reflect.DeepEqual(d.TunnelLength, binary.BigEndian.Uint16(data[cnt:cnt+2])) {
+				t.Error("DiscoverySolicit.SerializeTo TunnelLength error")
+			}
+			cnt += 2
+			digits = int(d.TunnelLength)
+			if !reflect.DeepEqual(d.TunnelValue, data[cnt:cnt+digits]) {
+				t.Error("DiscoverySolicit.SerializeTo TunnelValue error")
+			}
+			cnt += digits
+			if !reflect.DeepEqual(d.PadType, data[cnt]) {
+				t.Error("DiscoverySolicit.SerializeTo PadType error")
+			}
+			cnt++
+			if !reflect.DeepEqual(d.PadLength, binary.BigEndian.Uint16(data[cnt:cnt+2])) {
+				t.Error("DiscoverySolicit.SerializeTo PadLength error")
+			}
+			cnt += 2
+			digits = int(d.PadLength)
+			if !reflect.DeepEqual(d.PadValue, data[cnt:cnt+digits]) {
+				t.Errorf("DiscoverySolicit.SerializeTo PadValue error %x %x", d.PadValue, data[cnt:cnt+digits])
+			}
+		})
+	}
+}
+
+func TestDiscoveryHello_Decode(t *testing.T) {
+	type fields struct {
+		BaseLayer      layers.BaseLayer
+		Opcode         uint8
+		DiscoveryType  uint8
+		VendorType     uint8
+		Length         uint16
+		VendorIDType   uint8
+		VendorIDLength uint16
+		VendorID       []byte
+		NWType         uint8
+		NWLength       uint16
+		NWValue        []byte
+		DVType         uint8
+		DVLength       uint16
+		DVValue        []byte
+		SCPType        uint8
+		SCPLength      uint16
+		SCPValue       []byte
+		TunnelType     uint8
+		TunnelLength   uint16
+		TunnelValue    []byte
+		PadType        uint8
+		PadLength      uint16
+		PadValue       []byte
+	}
+	type args struct {
+		data []byte
+	}
+	tests := []struct {
+		name    string
+		fields  fields
+		args    args
+		wantErr bool
+	}{
+		// TODO: Add test cases.
+		{
+			name: "Decode-1",
+			args: args{
+				data: []byte{0xfd, 0x02, 0xfe, 0x00, 0x26, 0xfd, 0x00, 0x03, 0x2a, 0xea, 0x15, 0x06, 0x00, 0x10, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x07, 0x00, 0x01, 0x02, 0x08, 0x00, 0x01, 0x03, 0x0a, 0x00, 0x02, 0x00, 0x01, 0xff, 0x00, 0x01, 0x00},
+			},
+			wantErr: false,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			d := &DiscoveryHello{
+				BaseLayer:      tt.fields.BaseLayer,
+				Opcode:         tt.fields.Opcode,
+				DiscoveryType:  tt.fields.DiscoveryType,
+				VendorType:     tt.fields.VendorType,
+				Length:         tt.fields.Length,
+				VendorIDType:   tt.fields.VendorIDType,
+				VendorIDLength: tt.fields.VendorIDLength,
+				VendorID:       tt.fields.VendorID,
+				NWType:         tt.fields.NWType,
+				NWLength:       tt.fields.NWLength,
+				NWValue:        tt.fields.NWValue,
+				DVType:         tt.fields.DVType,
+				DVLength:       tt.fields.DVLength,
+				DVValue:        tt.fields.DVValue,
+				SCPType:        tt.fields.SCPType,
+				SCPLength:      tt.fields.SCPLength,
+				SCPValue:       tt.fields.SCPValue,
+				TunnelType:     tt.fields.TunnelType,
+				TunnelLength:   tt.fields.TunnelLength,
+				TunnelValue:    tt.fields.TunnelValue,
+				PadType:        tt.fields.PadType,
+				PadLength:      tt.fields.PadLength,
+				PadValue:       tt.fields.PadValue,
+			}
+			if err := d.Decode(tt.args.data); (err != nil) != tt.wantErr {
+				t.Errorf("DiscoveryHello.Decode() error = %v, wantErr %v", err, tt.wantErr)
+			}
+
+			cnt := 0
+			digits := 0
+			if !reflect.DeepEqual(d.Opcode, tt.args.data[cnt]) {
+				t.Errorf("DiscoverySolicit.Decode Opcode error Opcode=%x,data=%x,cnt=%x", d.Opcode, tt.args.data[cnt:], cnt)
+			}
+			cnt++
+			if !reflect.DeepEqual(d.DiscoveryType, tt.args.data[cnt]) {
+				t.Errorf("DiscoverySolicit.Decode DiscoveryType error DiscoveryType=%X data=%x", d.DiscoveryType, tt.args.data[cnt:cnt+1])
+			}
+			cnt++
+			if !reflect.DeepEqual(d.VendorType, tt.args.data[cnt]) {
+				t.Errorf("DiscoverySolicit.Decode VendorType error %x %x", tt.args.data[cnt], d.VendorType)
+			}
+			cnt++
+
+			if !reflect.DeepEqual(d.Length, binary.BigEndian.Uint16(tt.args.data[cnt:cnt+2])) {
+				t.Errorf("DiscoverySolicit.Decode Length error Length=%x data[cnt:cnt+2]=%x", string(d.Length), string(binary.BigEndian.Uint16(tt.args.data[cnt:cnt+2])))
+			}
+			cnt += 2
+
+			if !reflect.DeepEqual(d.VendorIDType, tt.args.data[cnt]) {
+				t.Errorf("DiscoverySolicit.Decode VendorIDType error VendorIDType=%x data=%x", d.VendorIDType, tt.args.data[cnt])
+			}
+			cnt++
+			if !reflect.DeepEqual(d.VendorIDLength, binary.BigEndian.Uint16(tt.args.data[cnt:cnt+2])) {
+				t.Errorf("DiscoverySolicit.Decode VendorIDLength error VendorIDLength=%x data[cnt:cnt+2]=%x", d.VendorIDLength, tt.args.data[cnt:cnt+2])
+			}
+			cnt += 2
+			digits = int(d.VendorIDLength)
+			if !reflect.DeepEqual(d.VendorID, tt.args.data[cnt:cnt+digits]) {
+				t.Errorf("DiscoverySolicit.Decode VendorID error %v %v", d.VendorID, tt.args.data[cnt:cnt+3])
+			}
+			cnt += digits
+			if !reflect.DeepEqual(d.NWType, tt.args.data[cnt]) {
+				t.Error("DiscoverySolicit.Decode NWType error")
+			}
+			cnt++
+			if !reflect.DeepEqual(d.NWLength, binary.BigEndian.Uint16(tt.args.data[cnt:cnt+2])) {
+				t.Error("DiscoverySolicit.Decode NWLength error")
+			}
+			cnt += 2
+			//digits = int(d.NWLength)
+			for _, dvalue := range d.NWValue {
+				if !reflect.DeepEqual(dvalue, tt.args.data[cnt]) {
+					t.Errorf("DiscoverySolicit.Decode NWValue error %x %x", dvalue, tt.args.data[cnt])
+				}
+				cnt++
+			}
+			// if !reflect.DeepEqual(string(d.NWValue), string(tt.args.data[cnt:cnt+digits])) {
+			// 	t.Errorf("DiscoverySolicit.Decode NWValue error %x %x", d.NWValue, tt.args.data[cnt:cnt+digits])
+			// }
+			// cnt += 16
+			if !reflect.DeepEqual(d.DVType, tt.args.data[cnt]) {
+				t.Error("DiscoverySolicit.Decode DVType error")
+			}
+			cnt++
+			if !reflect.DeepEqual(d.DVLength, binary.BigEndian.Uint16(tt.args.data[cnt:cnt+2])) {
+				t.Error("DiscoverySolicit.Decode DVLength error")
+			}
+			cnt += 2
+			digits = int(d.DVLength)
+			if !reflect.DeepEqual(d.DVValue, tt.args.data[cnt:cnt+digits]) {
+				t.Error("DiscoverySolicit.Decode DVValue error")
+			}
+			cnt += digits
+			if !reflect.DeepEqual(d.SCPType, tt.args.data[cnt]) {
+				t.Error("DiscoverySolicit.Decode SCPType error")
+			}
+			cnt++
+			if !reflect.DeepEqual(d.SCPLength, binary.BigEndian.Uint16(tt.args.data[cnt:cnt+2])) {
+				t.Error("DiscoverySolicit.Decode SCPLength error")
+			}
+			cnt += 2
+			digits = int(d.SCPLength)
+			if !reflect.DeepEqual(d.SCPValue, tt.args.data[cnt:cnt+digits]) {
+				t.Error("DiscoverySolicit.Decode SCPValue error")
+			}
+			cnt += digits
+			if !reflect.DeepEqual(d.TunnelType, tt.args.data[cnt]) {
+				t.Error("DiscoverySolicit.Decode TunnelType error")
+			}
+			cnt++
+			if !reflect.DeepEqual(d.TunnelLength, binary.BigEndian.Uint16(tt.args.data[cnt:cnt+2])) {
+				t.Error("DiscoverySolicit.Decode TunnelLength error")
+			}
+			cnt += 2
+			digits = int(d.TunnelLength)
+			if !reflect.DeepEqual(d.TunnelValue, tt.args.data[cnt:cnt+digits]) {
+				t.Error("DiscoverySolicit.Decode TunnelValue error")
+			}
+			cnt += digits
+			if !reflect.DeepEqual(d.PadType, tt.args.data[cnt]) {
+				t.Error("DiscoverySolicit.Decode PadType error")
+			}
+			cnt++
+			if !reflect.DeepEqual(d.PadLength, binary.BigEndian.Uint16(tt.args.data[cnt:cnt+2])) {
+				t.Error("DiscoverySolicit.Decode PadLength error")
+			}
+			cnt += 2
+			digits = int(d.PadLength)
+			if !reflect.DeepEqual(d.PadValue, tt.args.data[cnt:cnt+digits]) {
+				t.Errorf("DiscoverySolicit.Decode PadValue error %x %x", d.PadValue, tt.args.data[cnt:cnt+digits])
+			}
+		})
+	}
+}