123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621 |
- // 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) < 2 {
- return errors.New("not enough data to decode")
- }
- o.Code = DHCPv6Opt(binary.BigEndian.Uint16(data[0:2]))
- if len(data) < 3 {
- return errors.New("not enough data to decode")
- }
- o.Length = binary.BigEndian.Uint16(data[2:4])
- o.Data = data[4 : 4+o.Length]
- return nil
- }
|