First Commit of Voltha-Go-Controller from Radisys
Change-Id: I8e2e908e7ab09a4fe3d86849da18b6d69dcf4ab0
diff --git a/vendor/github.com/google/gopacket/layers/dhcpv6_options.go b/vendor/github.com/google/gopacket/layers/dhcpv6_options.go
new file mode 100644
index 0000000..5a1f991
--- /dev/null
+++ b/vendor/github.com/google/gopacket/layers/dhcpv6_options.go
@@ -0,0 +1,621 @@
+// Copyright 2018 The GoPacket Authors. 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"
+ "github.com/google/gopacket"
+)
+
+// DHCPv6Opt represents a DHCP option or parameter from RFC-3315
+type DHCPv6Opt uint16
+
+// Constants for the DHCPv6Opt options.
+const (
+ DHCPv6OptClientID DHCPv6Opt = 1
+ DHCPv6OptServerID DHCPv6Opt = 2
+ DHCPv6OptIANA DHCPv6Opt = 3
+ DHCPv6OptIATA DHCPv6Opt = 4
+ DHCPv6OptIAAddr DHCPv6Opt = 5
+ DHCPv6OptOro DHCPv6Opt = 6
+ DHCPv6OptPreference DHCPv6Opt = 7
+ DHCPv6OptElapsedTime DHCPv6Opt = 8
+ DHCPv6OptRelayMessage DHCPv6Opt = 9
+ DHCPv6OptAuth DHCPv6Opt = 11
+ DHCPv6OptUnicast DHCPv6Opt = 12
+ DHCPv6OptStatusCode DHCPv6Opt = 13
+ DHCPv6OptRapidCommit DHCPv6Opt = 14
+ DHCPv6OptUserClass DHCPv6Opt = 15
+ DHCPv6OptVendorClass DHCPv6Opt = 16
+ DHCPv6OptVendorOpts DHCPv6Opt = 17
+ DHCPv6OptInterfaceID DHCPv6Opt = 18
+ DHCPv6OptReconfigureMessage DHCPv6Opt = 19
+ DHCPv6OptReconfigureAccept DHCPv6Opt = 20
+
+ // RFC 3319 Session Initiation Protocol (SIP)
+ DHCPv6OptSIPServersDomainList DHCPv6Opt = 21
+ DHCPv6OptSIPServersAddressList DHCPv6Opt = 22
+
+ // RFC 3646 DNS Configuration
+ DHCPv6OptDNSServers DHCPv6Opt = 23
+ DHCPv6OptDomainList DHCPv6Opt = 24
+
+ // RFC 3633 Prefix Delegation
+ DHCPv6OptIAPD DHCPv6Opt = 25
+ DHCPv6OptIAPrefix DHCPv6Opt = 26
+
+ // RFC 3898 Network Information Service (NIS)
+ DHCPv6OptNISServers DHCPv6Opt = 27
+ DHCPv6OptNISPServers DHCPv6Opt = 28
+ DHCPv6OptNISDomainName DHCPv6Opt = 29
+ DHCPv6OptNISPDomainName DHCPv6Opt = 30
+
+ // RFC 4075 Simple Network Time Protocol (SNTP)
+ DHCPv6OptSNTPServers DHCPv6Opt = 31
+
+ // RFC 4242 Information Refresh Time Option
+ DHCPv6OptInformationRefreshTime DHCPv6Opt = 32
+
+ // RFC 4280 Broadcast and Multicast Control Servers
+ DHCPv6OptBCMCSServerDomainNameList DHCPv6Opt = 33
+ DHCPv6OptBCMCSServerAddressList DHCPv6Opt = 34
+
+ // RFC 4776 Civic Address ConfigurationOption
+ DHCPv6OptGeoconfCivic DHCPv6Opt = 36
+
+ // RFC 4649 Relay Agent Remote-ID
+ DHCPv6OptRemoteID DHCPv6Opt = 37
+
+ // RFC 4580 Relay Agent Subscriber-ID
+ DHCPv6OptSubscriberID DHCPv6Opt = 38
+
+ // RFC 4704 Client Full Qualified Domain Name (FQDN)
+ DHCPv6OptClientFQDN DHCPv6Opt = 39
+
+ // RFC 5192 Protocol for Carrying Authentication for Network Access (PANA)
+ DHCPv6OptPanaAgent DHCPv6Opt = 40
+
+ // RFC 4833 Timezone Options
+ DHCPv6OptNewPOSIXTimezone DHCPv6Opt = 41
+ DHCPv6OptNewTZDBTimezone DHCPv6Opt = 42
+
+ // RFC 4994 Relay Agent Echo Request
+ DHCPv6OptEchoRequestOption DHCPv6Opt = 43
+
+ // RFC 5007 Leasequery
+ DHCPv6OptLQQuery DHCPv6Opt = 44
+ DHCPv6OptCLTTime DHCPv6Opt = 45
+ DHCPv6OptClientData DHCPv6Opt = 46
+ DHCPv6OptLQRelayData DHCPv6Opt = 47
+ DHCPv6OptLQClientLink DHCPv6Opt = 48
+
+ // RFC 6610 Home Information Discovery in Mobile IPv6 (MIPv6)
+ DHCPv6OptMIP6HNIDF DHCPv6Opt = 49
+ DHCPv6OptMIP6VDINF DHCPv6Opt = 50
+ DHCPv6OptMIP6IDINF DHCPv6Opt = 69
+ DHCPv6OptMIP6UDINF DHCPv6Opt = 70
+ DHCPv6OptMIP6HNP DHCPv6Opt = 71
+ DHCPv6OptMIP6HAA DHCPv6Opt = 72
+ DHCPv6OptMIP6HAF DHCPv6Opt = 73
+
+ // RFC 5223 Discovering Location-to-Service Translation (LoST) Servers
+ DHCPv6OptV6LOST DHCPv6Opt = 51
+
+ // RFC 5417 Control And Provisioning of Wireless Access Points (CAPWAP)
+ DHCPv6OptCAPWAPACV6 DHCPv6Opt = 52
+
+ // RFC 5460 Bulk Leasequery
+ DHCPv6OptRelayID DHCPv6Opt = 53
+
+ // RFC 5678 IEEE 802.21 Mobility Services (MoS) Discovery
+ DHCPv6OptIPv6AddressMoS DHCPv6Opt = 54
+ DHCPv6OptIPv6FQDNMoS DHCPv6Opt = 55
+
+ // RFC 5908 NTP Server Option
+ DHCPv6OptNTPServer DHCPv6Opt = 56
+
+ // RFC 5986 Discovering the Local Location Information Server (LIS)
+ DHCPv6OptV6AccessDomain DHCPv6Opt = 57
+
+ // RFC 5986 SIP User Agent
+ DHCPv6OptSIPUACSList DHCPv6Opt = 58
+
+ // RFC 5970 Options for Network Boot
+ DHCPv6OptBootFileURL DHCPv6Opt = 59
+ DHCPv6OptBootFileParam DHCPv6Opt = 60
+ DHCPv6OptClientArchType DHCPv6Opt = 61
+ DHCPv6OptNII DHCPv6Opt = 62
+
+ // RFC 6225 Coordinate-Based Location Configuration Information
+ DHCPv6OptGeolocation DHCPv6Opt = 63
+
+ // RFC 6334 Dual-Stack Lite
+ DHCPv6OptAFTRName DHCPv6Opt = 64
+
+ // RFC 6440 EAP Re-authentication Protocol (ERP)
+ DHCPv6OptERPLocalDomainName DHCPv6Opt = 65
+
+ // RFC 6422 Relay-Supplied DHCP Options
+ DHCPv6OptRSOO DHCPv6Opt = 66
+
+ // RFC 6603 Prefix Exclude Option for DHCPv6-based Prefix Delegation
+ DHCPv6OptPDExclude DHCPv6Opt = 67
+
+ // RFC 6607 Virtual Subnet Selection
+ DHCPv6OptVSS DHCPv6Opt = 68
+
+ // RFC 6731 Improved Recursive DNS Server Selection for Multi-Interfaced Nodes
+ DHCPv6OptRDNSSSelection DHCPv6Opt = 74
+
+ // RFC 6784 Kerberos Options for DHCPv6
+ DHCPv6OptKRBPrincipalName DHCPv6Opt = 75
+ DHCPv6OptKRBRealmName DHCPv6Opt = 76
+ DHCPv6OptKRBKDC DHCPv6Opt = 77
+
+ // RFC 6939 Client Link-Layer Address Option
+ DHCPv6OptClientLinkLayerAddress DHCPv6Opt = 79
+
+ // RFC 6977 Triggering DHCPv6 Reconfiguration from Relay Agents
+ DHCPv6OptLinkAddress DHCPv6Opt = 80
+
+ // RFC 7037 RADIUS Option for the DHCPv6 Relay Agent
+ DHCPv6OptRADIUS DHCPv6Opt = 81
+
+ // RFC 7083 Modification to Default Values of SOL_MAX_RT and INF_MAX_RT
+ DHCPv6OptSolMaxRt DHCPv6Opt = 82
+ DHCPv6OptInfMaxRt DHCPv6Opt = 83
+
+ // RFC 7078 Distributing Address Selection Policy
+ DHCPv6OptAddrSel DHCPv6Opt = 84
+ DHCPv6OptAddrSelTable DHCPv6Opt = 85
+
+ // RFC 7291 DHCP Options for the Port Control Protocol (PCP)
+ DHCPv6OptV6PCPServer DHCPv6Opt = 86
+
+ // RFC 7341 DHCPv4-over-DHCPv6 (DHCP 4o6) Transport
+ DHCPv6OptDHCPv4Message DHCPv6Opt = 87
+ DHCPv6OptDHCPv4OverDHCPv6Server DHCPv6Opt = 88
+
+ // RFC 7598 Configuration of Softwire Address and Port-Mapped Clients
+ DHCPv6OptS46Rule DHCPv6Opt = 89
+ DHCPv6OptS46BR DHCPv6Opt = 90
+ DHCPv6OptS46DMR DHCPv6Opt = 91
+ DHCPv6OptS46V4V4Bind DHCPv6Opt = 92
+ DHCPv6OptS46PortParameters DHCPv6Opt = 93
+ DHCPv6OptS46ContMAPE DHCPv6Opt = 94
+ DHCPv6OptS46ContMAPT DHCPv6Opt = 95
+ DHCPv6OptS46ContLW DHCPv6Opt = 96
+
+ // RFC 7600 IPv4 Residual Deployment via IPv6
+ DHCPv6Opt4RD DHCPv6Opt = 97
+ DHCPv6Opt4RDMapRule DHCPv6Opt = 98
+ DHCPv6Opt4RDNonMapRule DHCPv6Opt = 99
+
+ // RFC 7653 Active Leasequery
+ DHCPv6OptLQBaseTime DHCPv6Opt = 100
+ DHCPv6OptLQStartTime DHCPv6Opt = 101
+ DHCPv6OptLQEndTime DHCPv6Opt = 102
+
+ // RFC 7710 Captive-Portal Identification
+ DHCPv6OptCaptivePortal DHCPv6Opt = 103
+
+ // RFC 7774 Multicast Protocol for Low-Power and Lossy Networks (MPL) Parameter Configuration
+ DHCPv6OptMPLParameters DHCPv6Opt = 104
+
+ // RFC 7839 Access-Network-Identifier (ANI)
+ DHCPv6OptANIATT DHCPv6Opt = 105
+ DHCPv6OptANINetworkName DHCPv6Opt = 106
+ DHCPv6OptANIAPName DHCPv6Opt = 107
+ DHCPv6OptANIAPBSSID DHCPv6Opt = 108
+ DHCPv6OptANIOperatorID DHCPv6Opt = 109
+ DHCPv6OptANIOperatorRealm DHCPv6Opt = 110
+
+ // RFC 8026 Unified IPv4-in-IPv6 Softwire Customer Premises Equipment (CPE)
+ DHCPv6OptS46Priority DHCPv6Opt = 111
+
+ // draft-ietf-opsawg-mud-25 Manufacturer Usage Description (MUD)
+ DHCPv6OptMUDURLV6 DHCPv6Opt = 112
+
+ // RFC 8115 IPv4-Embedded Multicast and Unicast IPv6 Prefixes
+ DHCPv6OptV6Prefix64 DHCPv6Opt = 113
+
+ // RFC 8156 DHCPv6 Failover Protocol
+ DHCPv6OptFBindingStatus DHCPv6Opt = 114
+ DHCPv6OptFConnectFlags DHCPv6Opt = 115
+ DHCPv6OptFDNSRemovalInfo DHCPv6Opt = 116
+ DHCPv6OptFDNSHostName DHCPv6Opt = 117
+ DHCPv6OptFDNSZoneName DHCPv6Opt = 118
+ DHCPv6OptFDNSFlags DHCPv6Opt = 119
+ DHCPv6OptFExpirationTime DHCPv6Opt = 120
+ DHCPv6OptFMaxUnacknowledgedBNDUPD DHCPv6Opt = 121
+ DHCPv6OptFMCLT DHCPv6Opt = 122
+ DHCPv6OptFPartnerLifetime DHCPv6Opt = 123
+ DHCPv6OptFPartnerLifetimeSent DHCPv6Opt = 124
+ DHCPv6OptFPartnerDownTime DHCPv6Opt = 125
+ DHCPv6OptFPartnerRawCltTime DHCPv6Opt = 126
+ DHCPv6OptFProtocolVersion DHCPv6Opt = 127
+ DHCPv6OptFKeepaliveTime DHCPv6Opt = 128
+ DHCPv6OptFReconfigureData DHCPv6Opt = 129
+ DHCPv6OptFRelationshipName DHCPv6Opt = 130
+ DHCPv6OptFServerFlags DHCPv6Opt = 131
+ DHCPv6OptFServerState DHCPv6Opt = 132
+ DHCPv6OptFStartTimeOfState DHCPv6Opt = 133
+ DHCPv6OptFStateExpirationTime DHCPv6Opt = 134
+
+ // RFC 8357 Generalized UDP Source Port for DHCP Relay
+ DHCPv6OptRelayPort DHCPv6Opt = 135
+
+ // draft-ietf-netconf-zerotouch-25 Zero Touch Provisioning for Networking Devices
+ DHCPv6OptV6ZeroTouchRedirect DHCPv6Opt = 136
+
+ // RFC 6153 Access Network Discovery and Selection Function (ANDSF) Discovery
+ DHCPv6OptIPV6AddressANDSF DHCPv6Opt = 143
+)
+
+// String returns a string version of a DHCPv6Opt.
+func (o DHCPv6Opt) String() string {
+ switch o {
+ case DHCPv6OptClientID:
+ return "ClientID"
+ case DHCPv6OptServerID:
+ return "ServerID"
+ case DHCPv6OptIANA:
+ return "IA_NA"
+ case DHCPv6OptIATA:
+ return "IA_TA"
+ case DHCPv6OptIAAddr:
+ return "IAAddr"
+ case DHCPv6OptOro:
+ return "Oro"
+ case DHCPv6OptPreference:
+ return "Preference"
+ case DHCPv6OptElapsedTime:
+ return "ElapsedTime"
+ case DHCPv6OptRelayMessage:
+ return "RelayMessage"
+ case DHCPv6OptAuth:
+ return "Auth"
+ case DHCPv6OptUnicast:
+ return "Unicast"
+ case DHCPv6OptStatusCode:
+ return "StatusCode"
+ case DHCPv6OptRapidCommit:
+ return "RapidCommit"
+ case DHCPv6OptUserClass:
+ return "UserClass"
+ case DHCPv6OptVendorClass:
+ return "VendorClass"
+ case DHCPv6OptVendorOpts:
+ return "VendorOpts"
+ case DHCPv6OptInterfaceID:
+ return "InterfaceID"
+ case DHCPv6OptReconfigureMessage:
+ return "ReconfigureMessage"
+ case DHCPv6OptReconfigureAccept:
+ return "ReconfigureAccept"
+ case DHCPv6OptSIPServersDomainList:
+ return "SIPServersDomainList"
+ case DHCPv6OptSIPServersAddressList:
+ return "SIPServersAddressList"
+ case DHCPv6OptDNSServers:
+ return "DNSRecursiveNameServer"
+ case DHCPv6OptDomainList:
+ return "DomainSearchList"
+ case DHCPv6OptIAPD:
+ return "IdentityAssociationPrefixDelegation"
+ case DHCPv6OptIAPrefix:
+ return "IAPDPrefix"
+ case DHCPv6OptNISServers:
+ return "NISServers"
+ case DHCPv6OptNISPServers:
+ return "NISv2Servers"
+ case DHCPv6OptNISDomainName:
+ return "NISDomainName"
+ case DHCPv6OptNISPDomainName:
+ return "NISv2DomainName"
+ case DHCPv6OptSNTPServers:
+ return "SNTPServers"
+ case DHCPv6OptInformationRefreshTime:
+ return "InformationRefreshTime"
+ case DHCPv6OptBCMCSServerDomainNameList:
+ return "BCMCSControlServersDomainNameList"
+ case DHCPv6OptBCMCSServerAddressList:
+ return "BCMCSControlServersAddressList"
+ case DHCPv6OptGeoconfCivic:
+ return "CivicAddress"
+ case DHCPv6OptRemoteID:
+ return "RelayAgentRemoteID"
+ case DHCPv6OptSubscriberID:
+ return "RelayAgentSubscriberID"
+ case DHCPv6OptClientFQDN:
+ return "ClientFQDN"
+ case DHCPv6OptPanaAgent:
+ return "PANAAuthenticationAgent"
+ case DHCPv6OptNewPOSIXTimezone:
+ return "NewPOSIXTimezone"
+ case DHCPv6OptNewTZDBTimezone:
+ return "NewTZDBTimezone"
+ case DHCPv6OptEchoRequestOption:
+ return "EchoRequest"
+ case DHCPv6OptLQQuery:
+ return "LeasequeryQuery"
+ case DHCPv6OptClientData:
+ return "LeasequeryClientData"
+ case DHCPv6OptCLTTime:
+ return "LeasequeryClientLastTransactionTime"
+ case DHCPv6OptLQRelayData:
+ return "LeasequeryRelayData"
+ case DHCPv6OptLQClientLink:
+ return "LeasequeryClientLink"
+ case DHCPv6OptMIP6HNIDF:
+ return "MIPv6HomeNetworkIDFQDN"
+ case DHCPv6OptMIP6VDINF:
+ return "MIPv6VisitedHomeNetworkInformation"
+ case DHCPv6OptMIP6IDINF:
+ return "MIPv6IdentifiedHomeNetworkInformation"
+ case DHCPv6OptMIP6UDINF:
+ return "MIPv6UnrestrictedHomeNetworkInformation"
+ case DHCPv6OptMIP6HNP:
+ return "MIPv6HomeNetworkPrefix"
+ case DHCPv6OptMIP6HAA:
+ return "MIPv6HomeAgentAddress"
+ case DHCPv6OptMIP6HAF:
+ return "MIPv6HomeAgentFQDN"
+ case DHCPv6OptV6LOST:
+ return "LoST Server"
+ case DHCPv6OptCAPWAPACV6:
+ return "CAPWAPAccessControllerV6"
+ case DHCPv6OptRelayID:
+ return "LeasequeryRelayID"
+ case DHCPv6OptIPv6AddressMoS:
+ return "MoSIPv6Address"
+ case DHCPv6OptIPv6FQDNMoS:
+ return "MoSDomainNameList"
+ case DHCPv6OptNTPServer:
+ return "NTPServer"
+ case DHCPv6OptV6AccessDomain:
+ return "AccessNetworkDomainName"
+ case DHCPv6OptSIPUACSList:
+ return "SIPUserAgentConfigurationServiceDomains"
+ case DHCPv6OptBootFileURL:
+ return "BootFileURL"
+ case DHCPv6OptBootFileParam:
+ return "BootFileParameters"
+ case DHCPv6OptClientArchType:
+ return "ClientSystemArchitectureType"
+ case DHCPv6OptNII:
+ return "ClientNetworkInterfaceIdentifier"
+ case DHCPv6OptGeolocation:
+ return "Geolocation"
+ case DHCPv6OptAFTRName:
+ return "AFTRName"
+ case DHCPv6OptERPLocalDomainName:
+ return "AFTRName"
+ case DHCPv6OptRSOO:
+ return "RSOOption"
+ case DHCPv6OptPDExclude:
+ return "PrefixExclude"
+ case DHCPv6OptVSS:
+ return "VirtualSubnetSelection"
+ case DHCPv6OptRDNSSSelection:
+ return "RDNSSSelection"
+ case DHCPv6OptKRBPrincipalName:
+ return "KerberosPrincipalName"
+ case DHCPv6OptKRBRealmName:
+ return "KerberosRealmName"
+ case DHCPv6OptKRBKDC:
+ return "KerberosKDC"
+ case DHCPv6OptClientLinkLayerAddress:
+ return "ClientLinkLayerAddress"
+ case DHCPv6OptLinkAddress:
+ return "LinkAddress"
+ case DHCPv6OptRADIUS:
+ return "RADIUS"
+ case DHCPv6OptSolMaxRt:
+ return "SolMaxRt"
+ case DHCPv6OptInfMaxRt:
+ return "InfMaxRt"
+ case DHCPv6OptAddrSel:
+ return "AddressSelection"
+ case DHCPv6OptAddrSelTable:
+ return "AddressSelectionTable"
+ case DHCPv6OptV6PCPServer:
+ return "PCPServer"
+ case DHCPv6OptDHCPv4Message:
+ return "DHCPv4Message"
+ case DHCPv6OptDHCPv4OverDHCPv6Server:
+ return "DHCP4o6ServerAddress"
+ case DHCPv6OptS46Rule:
+ return "S46Rule"
+ case DHCPv6OptS46BR:
+ return "S46BR"
+ case DHCPv6OptS46DMR:
+ return "S46DMR"
+ case DHCPv6OptS46V4V4Bind:
+ return "S46IPv4IPv6AddressBinding"
+ case DHCPv6OptS46PortParameters:
+ return "S46PortParameters"
+ case DHCPv6OptS46ContMAPE:
+ return "S46MAPEContainer"
+ case DHCPv6OptS46ContMAPT:
+ return "S46MAPTContainer"
+ case DHCPv6OptS46ContLW:
+ return "S46Lightweight4Over6Container"
+ case DHCPv6Opt4RD:
+ return "4RD"
+ case DHCPv6Opt4RDMapRule:
+ return "4RDMapRule"
+ case DHCPv6Opt4RDNonMapRule:
+ return "4RDNonMapRule"
+ case DHCPv6OptLQBaseTime:
+ return "LQBaseTime"
+ case DHCPv6OptLQStartTime:
+ return "LQStartTime"
+ case DHCPv6OptLQEndTime:
+ return "LQEndTime"
+ case DHCPv6OptCaptivePortal:
+ return "CaptivePortal"
+ case DHCPv6OptMPLParameters:
+ return "MPLParameterConfiguration"
+ case DHCPv6OptANIATT:
+ return "ANIAccessTechnologyType"
+ case DHCPv6OptANINetworkName:
+ return "ANINetworkName"
+ case DHCPv6OptANIAPName:
+ return "ANIAccessPointName"
+ case DHCPv6OptANIAPBSSID:
+ return "ANIAccessPointBSSID"
+ case DHCPv6OptANIOperatorID:
+ return "ANIOperatorIdentifier"
+ case DHCPv6OptANIOperatorRealm:
+ return "ANIOperatorRealm"
+ case DHCPv6OptS46Priority:
+ return "S64Priority"
+ case DHCPv6OptMUDURLV6:
+ return "ManufacturerUsageDescriptionURL"
+ case DHCPv6OptV6Prefix64:
+ return "V6Prefix64"
+ case DHCPv6OptFBindingStatus:
+ return "FailoverBindingStatus"
+ case DHCPv6OptFConnectFlags:
+ return "FailoverConnectFlags"
+ case DHCPv6OptFDNSRemovalInfo:
+ return "FailoverDNSRemovalInfo"
+ case DHCPv6OptFDNSHostName:
+ return "FailoverDNSHostName"
+ case DHCPv6OptFDNSZoneName:
+ return "FailoverDNSZoneName"
+ case DHCPv6OptFDNSFlags:
+ return "FailoverDNSFlags"
+ case DHCPv6OptFExpirationTime:
+ return "FailoverExpirationTime"
+ case DHCPv6OptFMaxUnacknowledgedBNDUPD:
+ return "FailoverMaxUnacknowledgedBNDUPDMessages"
+ case DHCPv6OptFMCLT:
+ return "FailoverMaximumClientLeadTime"
+ case DHCPv6OptFPartnerLifetime:
+ return "FailoverPartnerLifetime"
+ case DHCPv6OptFPartnerLifetimeSent:
+ return "FailoverPartnerLifetimeSent"
+ case DHCPv6OptFPartnerDownTime:
+ return "FailoverPartnerDownTime"
+ case DHCPv6OptFPartnerRawCltTime:
+ return "FailoverPartnerRawClientLeadTime"
+ case DHCPv6OptFProtocolVersion:
+ return "FailoverProtocolVersion"
+ case DHCPv6OptFKeepaliveTime:
+ return "FailoverKeepaliveTime"
+ case DHCPv6OptFReconfigureData:
+ return "FailoverReconfigureData"
+ case DHCPv6OptFRelationshipName:
+ return "FailoverRelationshipName"
+ case DHCPv6OptFServerFlags:
+ return "FailoverServerFlags"
+ case DHCPv6OptFServerState:
+ return "FailoverServerState"
+ case DHCPv6OptFStartTimeOfState:
+ return "FailoverStartTimeOfState"
+ case DHCPv6OptFStateExpirationTime:
+ return "FailoverStateExpirationTime"
+ case DHCPv6OptRelayPort:
+ return "RelayPort"
+ case DHCPv6OptV6ZeroTouchRedirect:
+ return "ZeroTouch"
+ case DHCPv6OptIPV6AddressANDSF:
+ return "ANDSFIPv6Address"
+ default:
+ return fmt.Sprintf("Unknown(%d)", uint16(o))
+ }
+}
+
+// DHCPv6Options is used to get nicely printed option lists which would normally
+// be cut off after 5 options.
+type DHCPv6Options []DHCPv6Option
+
+// String returns a string version of the options list.
+func (o DHCPv6Options) 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()
+}
+
+// DHCPv6Option rerpresents a DHCP option.
+type DHCPv6Option struct {
+ Code DHCPv6Opt
+ Length uint16
+ Data []byte
+}
+
+// String returns a string version of a DHCP Option.
+func (o DHCPv6Option) String() string {
+ switch o.Code {
+ case DHCPv6OptClientID, DHCPv6OptServerID:
+ duid, err := decodeDHCPv6DUID(o.Data)
+ if err != nil {
+ return fmt.Sprintf("Option(%s:INVALID)", o.Code)
+ }
+ return fmt.Sprintf("Option(%s:[%s])", o.Code, duid.String())
+ case DHCPv6OptOro:
+ options := ""
+ for i := 0; i < int(o.Length); i += 2 {
+ if options != "" {
+ options += ","
+ }
+ option := DHCPv6Opt(binary.BigEndian.Uint16(o.Data[i : i+2]))
+ options += option.String()
+ }
+ return fmt.Sprintf("Option(%s:[%s])", o.Code, options)
+ default:
+ return fmt.Sprintf("Option(%s:%v)", o.Code, o.Data)
+ }
+}
+
+// NewDHCPv6Option constructs a new DHCPv6Option with a given type and data.
+func NewDHCPv6Option(code DHCPv6Opt, data []byte) DHCPv6Option {
+ o := DHCPv6Option{Code: code}
+ if data != nil {
+ o.Data = data
+ o.Length = uint16(len(data))
+ }
+
+ return o
+}
+
+func (o *DHCPv6Option) encode(b []byte, opts gopacket.SerializeOptions) error {
+ binary.BigEndian.PutUint16(b[0:2], uint16(o.Code))
+ if opts.FixLengths {
+ binary.BigEndian.PutUint16(b[2:4], uint16(len(o.Data)))
+ } else {
+ binary.BigEndian.PutUint16(b[2:4], o.Length)
+ }
+ copy(b[4:], o.Data)
+
+ return nil
+}
+
+func (o *DHCPv6Option) decode(data []byte) error {
+ if len(data) < 4 {
+ return errors.New("not enough data to decode")
+ }
+ o.Code = DHCPv6Opt(binary.BigEndian.Uint16(data[0:2]))
+ o.Length = binary.BigEndian.Uint16(data[2:4])
+ if len(data) < 4+int(o.Length) {
+ return fmt.Errorf("dhcpv6 option size < length %d", 4+o.Length)
+ }
+ o.Data = data[4 : 4+o.Length]
+ return nil
+}