622 lines
18 KiB
Go
622 lines
18 KiB
Go
// 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
|
|
}
|