github.com/gopacket/gopacket@v1.1.0/layers/dhcpv6_options.go (about)

     1  // Copyright 2018 The GoPacket Authors. All rights reserved.
     2  //
     3  // Use of this source code is governed by a BSD-style license
     4  // that can be found in the LICENSE file in the root of the source
     5  // tree.
     6  
     7  package layers
     8  
     9  import (
    10  	"bytes"
    11  	"encoding/binary"
    12  	"errors"
    13  	"fmt"
    14  
    15  	"github.com/gopacket/gopacket"
    16  )
    17  
    18  // DHCPv6Opt represents a DHCP option or parameter from RFC-3315
    19  type DHCPv6Opt uint16
    20  
    21  // Constants for the DHCPv6Opt options.
    22  const (
    23  	DHCPv6OptClientID           DHCPv6Opt = 1
    24  	DHCPv6OptServerID           DHCPv6Opt = 2
    25  	DHCPv6OptIANA               DHCPv6Opt = 3
    26  	DHCPv6OptIATA               DHCPv6Opt = 4
    27  	DHCPv6OptIAAddr             DHCPv6Opt = 5
    28  	DHCPv6OptOro                DHCPv6Opt = 6
    29  	DHCPv6OptPreference         DHCPv6Opt = 7
    30  	DHCPv6OptElapsedTime        DHCPv6Opt = 8
    31  	DHCPv6OptRelayMessage       DHCPv6Opt = 9
    32  	DHCPv6OptAuth               DHCPv6Opt = 11
    33  	DHCPv6OptUnicast            DHCPv6Opt = 12
    34  	DHCPv6OptStatusCode         DHCPv6Opt = 13
    35  	DHCPv6OptRapidCommit        DHCPv6Opt = 14
    36  	DHCPv6OptUserClass          DHCPv6Opt = 15
    37  	DHCPv6OptVendorClass        DHCPv6Opt = 16
    38  	DHCPv6OptVendorOpts         DHCPv6Opt = 17
    39  	DHCPv6OptInterfaceID        DHCPv6Opt = 18
    40  	DHCPv6OptReconfigureMessage DHCPv6Opt = 19
    41  	DHCPv6OptReconfigureAccept  DHCPv6Opt = 20
    42  
    43  	// RFC 3319 Session Initiation Protocol (SIP)
    44  	DHCPv6OptSIPServersDomainList  DHCPv6Opt = 21
    45  	DHCPv6OptSIPServersAddressList DHCPv6Opt = 22
    46  
    47  	// RFC 3646 DNS Configuration
    48  	DHCPv6OptDNSServers DHCPv6Opt = 23
    49  	DHCPv6OptDomainList DHCPv6Opt = 24
    50  
    51  	// RFC 3633 Prefix Delegation
    52  	DHCPv6OptIAPD     DHCPv6Opt = 25
    53  	DHCPv6OptIAPrefix DHCPv6Opt = 26
    54  
    55  	// RFC 3898 Network Information Service (NIS)
    56  	DHCPv6OptNISServers     DHCPv6Opt = 27
    57  	DHCPv6OptNISPServers    DHCPv6Opt = 28
    58  	DHCPv6OptNISDomainName  DHCPv6Opt = 29
    59  	DHCPv6OptNISPDomainName DHCPv6Opt = 30
    60  
    61  	// RFC 4075 Simple Network Time Protocol (SNTP)
    62  	DHCPv6OptSNTPServers DHCPv6Opt = 31
    63  
    64  	// RFC 4242 Information Refresh Time Option
    65  	DHCPv6OptInformationRefreshTime DHCPv6Opt = 32
    66  
    67  	// RFC 4280 Broadcast and Multicast Control Servers
    68  	DHCPv6OptBCMCSServerDomainNameList DHCPv6Opt = 33
    69  	DHCPv6OptBCMCSServerAddressList    DHCPv6Opt = 34
    70  
    71  	// RFC 4776 Civic Address ConfigurationOption
    72  	DHCPv6OptGeoconfCivic DHCPv6Opt = 36
    73  
    74  	// RFC 4649 Relay Agent Remote-ID
    75  	DHCPv6OptRemoteID DHCPv6Opt = 37
    76  
    77  	// RFC 4580 Relay Agent Subscriber-ID
    78  	DHCPv6OptSubscriberID DHCPv6Opt = 38
    79  
    80  	// RFC 4704 Client Full Qualified Domain Name (FQDN)
    81  	DHCPv6OptClientFQDN DHCPv6Opt = 39
    82  
    83  	// RFC 5192 Protocol for Carrying Authentication for Network Access (PANA)
    84  	DHCPv6OptPanaAgent DHCPv6Opt = 40
    85  
    86  	// RFC 4833 Timezone Options
    87  	DHCPv6OptNewPOSIXTimezone DHCPv6Opt = 41
    88  	DHCPv6OptNewTZDBTimezone  DHCPv6Opt = 42
    89  
    90  	// RFC 4994 Relay Agent Echo Request
    91  	DHCPv6OptEchoRequestOption DHCPv6Opt = 43
    92  
    93  	// RFC 5007 Leasequery
    94  	DHCPv6OptLQQuery      DHCPv6Opt = 44
    95  	DHCPv6OptCLTTime      DHCPv6Opt = 45
    96  	DHCPv6OptClientData   DHCPv6Opt = 46
    97  	DHCPv6OptLQRelayData  DHCPv6Opt = 47
    98  	DHCPv6OptLQClientLink DHCPv6Opt = 48
    99  
   100  	// RFC 6610 Home Information Discovery in Mobile IPv6 (MIPv6)
   101  	DHCPv6OptMIP6HNIDF DHCPv6Opt = 49
   102  	DHCPv6OptMIP6VDINF DHCPv6Opt = 50
   103  	DHCPv6OptMIP6IDINF DHCPv6Opt = 69
   104  	DHCPv6OptMIP6UDINF DHCPv6Opt = 70
   105  	DHCPv6OptMIP6HNP   DHCPv6Opt = 71
   106  	DHCPv6OptMIP6HAA   DHCPv6Opt = 72
   107  	DHCPv6OptMIP6HAF   DHCPv6Opt = 73
   108  
   109  	// RFC 5223 Discovering Location-to-Service Translation (LoST) Servers
   110  	DHCPv6OptV6LOST DHCPv6Opt = 51
   111  
   112  	// RFC 5417 Control And Provisioning of Wireless Access Points (CAPWAP)
   113  	DHCPv6OptCAPWAPACV6 DHCPv6Opt = 52
   114  
   115  	// RFC 5460 Bulk Leasequery
   116  	DHCPv6OptRelayID DHCPv6Opt = 53
   117  
   118  	// RFC 5678 IEEE 802.21 Mobility Services (MoS) Discovery
   119  	DHCPv6OptIPv6AddressMoS DHCPv6Opt = 54
   120  	DHCPv6OptIPv6FQDNMoS    DHCPv6Opt = 55
   121  
   122  	// RFC 5908 NTP Server Option
   123  	DHCPv6OptNTPServer DHCPv6Opt = 56
   124  
   125  	// RFC 5986 Discovering the Local Location Information Server (LIS)
   126  	DHCPv6OptV6AccessDomain DHCPv6Opt = 57
   127  
   128  	// RFC 5986 SIP User Agent
   129  	DHCPv6OptSIPUACSList DHCPv6Opt = 58
   130  
   131  	// RFC 5970 Options for Network Boot
   132  	DHCPv6OptBootFileURL    DHCPv6Opt = 59
   133  	DHCPv6OptBootFileParam  DHCPv6Opt = 60
   134  	DHCPv6OptClientArchType DHCPv6Opt = 61
   135  	DHCPv6OptNII            DHCPv6Opt = 62
   136  
   137  	// RFC 6225 Coordinate-Based Location Configuration Information
   138  	DHCPv6OptGeolocation DHCPv6Opt = 63
   139  
   140  	// RFC 6334 Dual-Stack Lite
   141  	DHCPv6OptAFTRName DHCPv6Opt = 64
   142  
   143  	// RFC 6440 EAP Re-authentication Protocol (ERP)
   144  	DHCPv6OptERPLocalDomainName DHCPv6Opt = 65
   145  
   146  	// RFC 6422 Relay-Supplied DHCP Options
   147  	DHCPv6OptRSOO DHCPv6Opt = 66
   148  
   149  	// RFC 6603 Prefix Exclude Option for DHCPv6-based Prefix Delegation
   150  	DHCPv6OptPDExclude DHCPv6Opt = 67
   151  
   152  	// RFC 6607 Virtual Subnet Selection
   153  	DHCPv6OptVSS DHCPv6Opt = 68
   154  
   155  	// RFC 6731 Improved Recursive DNS Server Selection for Multi-Interfaced Nodes
   156  	DHCPv6OptRDNSSSelection DHCPv6Opt = 74
   157  
   158  	// RFC 6784 Kerberos Options for DHCPv6
   159  	DHCPv6OptKRBPrincipalName DHCPv6Opt = 75
   160  	DHCPv6OptKRBRealmName     DHCPv6Opt = 76
   161  	DHCPv6OptKRBKDC           DHCPv6Opt = 77
   162  
   163  	// RFC 6939 Client Link-Layer Address Option
   164  	DHCPv6OptClientLinkLayerAddress DHCPv6Opt = 79
   165  
   166  	// RFC 6977 Triggering DHCPv6 Reconfiguration from Relay Agents
   167  	DHCPv6OptLinkAddress DHCPv6Opt = 80
   168  
   169  	// RFC 7037 RADIUS Option for the DHCPv6 Relay Agent
   170  	DHCPv6OptRADIUS DHCPv6Opt = 81
   171  
   172  	// RFC 7083 Modification to Default Values of SOL_MAX_RT and INF_MAX_RT
   173  	DHCPv6OptSolMaxRt DHCPv6Opt = 82
   174  	DHCPv6OptInfMaxRt DHCPv6Opt = 83
   175  
   176  	// RFC 7078 Distributing Address Selection Policy
   177  	DHCPv6OptAddrSel      DHCPv6Opt = 84
   178  	DHCPv6OptAddrSelTable DHCPv6Opt = 85
   179  
   180  	// RFC 7291 DHCP Options for the Port Control Protocol (PCP)
   181  	DHCPv6OptV6PCPServer DHCPv6Opt = 86
   182  
   183  	// RFC 7341 DHCPv4-over-DHCPv6 (DHCP 4o6) Transport
   184  	DHCPv6OptDHCPv4Message          DHCPv6Opt = 87
   185  	DHCPv6OptDHCPv4OverDHCPv6Server DHCPv6Opt = 88
   186  
   187  	// RFC 7598 Configuration of Softwire Address and Port-Mapped Clients
   188  	DHCPv6OptS46Rule           DHCPv6Opt = 89
   189  	DHCPv6OptS46BR             DHCPv6Opt = 90
   190  	DHCPv6OptS46DMR            DHCPv6Opt = 91
   191  	DHCPv6OptS46V4V4Bind       DHCPv6Opt = 92
   192  	DHCPv6OptS46PortParameters DHCPv6Opt = 93
   193  	DHCPv6OptS46ContMAPE       DHCPv6Opt = 94
   194  	DHCPv6OptS46ContMAPT       DHCPv6Opt = 95
   195  	DHCPv6OptS46ContLW         DHCPv6Opt = 96
   196  
   197  	// RFC 7600 IPv4 Residual Deployment via IPv6
   198  	DHCPv6Opt4RD           DHCPv6Opt = 97
   199  	DHCPv6Opt4RDMapRule    DHCPv6Opt = 98
   200  	DHCPv6Opt4RDNonMapRule DHCPv6Opt = 99
   201  
   202  	// RFC 7653 Active Leasequery
   203  	DHCPv6OptLQBaseTime  DHCPv6Opt = 100
   204  	DHCPv6OptLQStartTime DHCPv6Opt = 101
   205  	DHCPv6OptLQEndTime   DHCPv6Opt = 102
   206  
   207  	// RFC 7710 Captive-Portal Identification
   208  	DHCPv6OptCaptivePortal DHCPv6Opt = 103
   209  
   210  	// RFC 7774 Multicast Protocol for Low-Power and Lossy Networks (MPL) Parameter Configuration
   211  	DHCPv6OptMPLParameters DHCPv6Opt = 104
   212  
   213  	// RFC 7839 Access-Network-Identifier (ANI)
   214  	DHCPv6OptANIATT           DHCPv6Opt = 105
   215  	DHCPv6OptANINetworkName   DHCPv6Opt = 106
   216  	DHCPv6OptANIAPName        DHCPv6Opt = 107
   217  	DHCPv6OptANIAPBSSID       DHCPv6Opt = 108
   218  	DHCPv6OptANIOperatorID    DHCPv6Opt = 109
   219  	DHCPv6OptANIOperatorRealm DHCPv6Opt = 110
   220  
   221  	// RFC 8026 Unified IPv4-in-IPv6 Softwire Customer Premises Equipment (CPE)
   222  	DHCPv6OptS46Priority DHCPv6Opt = 111
   223  
   224  	// draft-ietf-opsawg-mud-25 Manufacturer Usage Description (MUD)
   225  	DHCPv6OptMUDURLV6 DHCPv6Opt = 112
   226  
   227  	// RFC 8115 IPv4-Embedded Multicast and Unicast IPv6 Prefixes
   228  	DHCPv6OptV6Prefix64 DHCPv6Opt = 113
   229  
   230  	// RFC 8156 DHCPv6 Failover Protocol
   231  	DHCPv6OptFBindingStatus           DHCPv6Opt = 114
   232  	DHCPv6OptFConnectFlags            DHCPv6Opt = 115
   233  	DHCPv6OptFDNSRemovalInfo          DHCPv6Opt = 116
   234  	DHCPv6OptFDNSHostName             DHCPv6Opt = 117
   235  	DHCPv6OptFDNSZoneName             DHCPv6Opt = 118
   236  	DHCPv6OptFDNSFlags                DHCPv6Opt = 119
   237  	DHCPv6OptFExpirationTime          DHCPv6Opt = 120
   238  	DHCPv6OptFMaxUnacknowledgedBNDUPD DHCPv6Opt = 121
   239  	DHCPv6OptFMCLT                    DHCPv6Opt = 122
   240  	DHCPv6OptFPartnerLifetime         DHCPv6Opt = 123
   241  	DHCPv6OptFPartnerLifetimeSent     DHCPv6Opt = 124
   242  	DHCPv6OptFPartnerDownTime         DHCPv6Opt = 125
   243  	DHCPv6OptFPartnerRawCltTime       DHCPv6Opt = 126
   244  	DHCPv6OptFProtocolVersion         DHCPv6Opt = 127
   245  	DHCPv6OptFKeepaliveTime           DHCPv6Opt = 128
   246  	DHCPv6OptFReconfigureData         DHCPv6Opt = 129
   247  	DHCPv6OptFRelationshipName        DHCPv6Opt = 130
   248  	DHCPv6OptFServerFlags             DHCPv6Opt = 131
   249  	DHCPv6OptFServerState             DHCPv6Opt = 132
   250  	DHCPv6OptFStartTimeOfState        DHCPv6Opt = 133
   251  	DHCPv6OptFStateExpirationTime     DHCPv6Opt = 134
   252  
   253  	// RFC 8357 Generalized UDP Source Port for DHCP Relay
   254  	DHCPv6OptRelayPort DHCPv6Opt = 135
   255  
   256  	// draft-ietf-netconf-zerotouch-25 Zero Touch Provisioning for Networking Devices
   257  	DHCPv6OptV6ZeroTouchRedirect DHCPv6Opt = 136
   258  
   259  	// RFC 6153 Access Network Discovery and Selection Function (ANDSF) Discovery
   260  	DHCPv6OptIPV6AddressANDSF DHCPv6Opt = 143
   261  )
   262  
   263  // String returns a string version of a DHCPv6Opt.
   264  func (o DHCPv6Opt) String() string {
   265  	switch o {
   266  	case DHCPv6OptClientID:
   267  		return "ClientID"
   268  	case DHCPv6OptServerID:
   269  		return "ServerID"
   270  	case DHCPv6OptIANA:
   271  		return "IA_NA"
   272  	case DHCPv6OptIATA:
   273  		return "IA_TA"
   274  	case DHCPv6OptIAAddr:
   275  		return "IAAddr"
   276  	case DHCPv6OptOro:
   277  		return "Oro"
   278  	case DHCPv6OptPreference:
   279  		return "Preference"
   280  	case DHCPv6OptElapsedTime:
   281  		return "ElapsedTime"
   282  	case DHCPv6OptRelayMessage:
   283  		return "RelayMessage"
   284  	case DHCPv6OptAuth:
   285  		return "Auth"
   286  	case DHCPv6OptUnicast:
   287  		return "Unicast"
   288  	case DHCPv6OptStatusCode:
   289  		return "StatusCode"
   290  	case DHCPv6OptRapidCommit:
   291  		return "RapidCommit"
   292  	case DHCPv6OptUserClass:
   293  		return "UserClass"
   294  	case DHCPv6OptVendorClass:
   295  		return "VendorClass"
   296  	case DHCPv6OptVendorOpts:
   297  		return "VendorOpts"
   298  	case DHCPv6OptInterfaceID:
   299  		return "InterfaceID"
   300  	case DHCPv6OptReconfigureMessage:
   301  		return "ReconfigureMessage"
   302  	case DHCPv6OptReconfigureAccept:
   303  		return "ReconfigureAccept"
   304  	case DHCPv6OptSIPServersDomainList:
   305  		return "SIPServersDomainList"
   306  	case DHCPv6OptSIPServersAddressList:
   307  		return "SIPServersAddressList"
   308  	case DHCPv6OptDNSServers:
   309  		return "DNSRecursiveNameServer"
   310  	case DHCPv6OptDomainList:
   311  		return "DomainSearchList"
   312  	case DHCPv6OptIAPD:
   313  		return "IdentityAssociationPrefixDelegation"
   314  	case DHCPv6OptIAPrefix:
   315  		return "IAPDPrefix"
   316  	case DHCPv6OptNISServers:
   317  		return "NISServers"
   318  	case DHCPv6OptNISPServers:
   319  		return "NISv2Servers"
   320  	case DHCPv6OptNISDomainName:
   321  		return "NISDomainName"
   322  	case DHCPv6OptNISPDomainName:
   323  		return "NISv2DomainName"
   324  	case DHCPv6OptSNTPServers:
   325  		return "SNTPServers"
   326  	case DHCPv6OptInformationRefreshTime:
   327  		return "InformationRefreshTime"
   328  	case DHCPv6OptBCMCSServerDomainNameList:
   329  		return "BCMCSControlServersDomainNameList"
   330  	case DHCPv6OptBCMCSServerAddressList:
   331  		return "BCMCSControlServersAddressList"
   332  	case DHCPv6OptGeoconfCivic:
   333  		return "CivicAddress"
   334  	case DHCPv6OptRemoteID:
   335  		return "RelayAgentRemoteID"
   336  	case DHCPv6OptSubscriberID:
   337  		return "RelayAgentSubscriberID"
   338  	case DHCPv6OptClientFQDN:
   339  		return "ClientFQDN"
   340  	case DHCPv6OptPanaAgent:
   341  		return "PANAAuthenticationAgent"
   342  	case DHCPv6OptNewPOSIXTimezone:
   343  		return "NewPOSIXTimezone"
   344  	case DHCPv6OptNewTZDBTimezone:
   345  		return "NewTZDBTimezone"
   346  	case DHCPv6OptEchoRequestOption:
   347  		return "EchoRequest"
   348  	case DHCPv6OptLQQuery:
   349  		return "LeasequeryQuery"
   350  	case DHCPv6OptClientData:
   351  		return "LeasequeryClientData"
   352  	case DHCPv6OptCLTTime:
   353  		return "LeasequeryClientLastTransactionTime"
   354  	case DHCPv6OptLQRelayData:
   355  		return "LeasequeryRelayData"
   356  	case DHCPv6OptLQClientLink:
   357  		return "LeasequeryClientLink"
   358  	case DHCPv6OptMIP6HNIDF:
   359  		return "MIPv6HomeNetworkIDFQDN"
   360  	case DHCPv6OptMIP6VDINF:
   361  		return "MIPv6VisitedHomeNetworkInformation"
   362  	case DHCPv6OptMIP6IDINF:
   363  		return "MIPv6IdentifiedHomeNetworkInformation"
   364  	case DHCPv6OptMIP6UDINF:
   365  		return "MIPv6UnrestrictedHomeNetworkInformation"
   366  	case DHCPv6OptMIP6HNP:
   367  		return "MIPv6HomeNetworkPrefix"
   368  	case DHCPv6OptMIP6HAA:
   369  		return "MIPv6HomeAgentAddress"
   370  	case DHCPv6OptMIP6HAF:
   371  		return "MIPv6HomeAgentFQDN"
   372  	case DHCPv6OptV6LOST:
   373  		return "LoST Server"
   374  	case DHCPv6OptCAPWAPACV6:
   375  		return "CAPWAPAccessControllerV6"
   376  	case DHCPv6OptRelayID:
   377  		return "LeasequeryRelayID"
   378  	case DHCPv6OptIPv6AddressMoS:
   379  		return "MoSIPv6Address"
   380  	case DHCPv6OptIPv6FQDNMoS:
   381  		return "MoSDomainNameList"
   382  	case DHCPv6OptNTPServer:
   383  		return "NTPServer"
   384  	case DHCPv6OptV6AccessDomain:
   385  		return "AccessNetworkDomainName"
   386  	case DHCPv6OptSIPUACSList:
   387  		return "SIPUserAgentConfigurationServiceDomains"
   388  	case DHCPv6OptBootFileURL:
   389  		return "BootFileURL"
   390  	case DHCPv6OptBootFileParam:
   391  		return "BootFileParameters"
   392  	case DHCPv6OptClientArchType:
   393  		return "ClientSystemArchitectureType"
   394  	case DHCPv6OptNII:
   395  		return "ClientNetworkInterfaceIdentifier"
   396  	case DHCPv6OptGeolocation:
   397  		return "Geolocation"
   398  	case DHCPv6OptAFTRName:
   399  		return "AFTRName"
   400  	case DHCPv6OptERPLocalDomainName:
   401  		return "AFTRName"
   402  	case DHCPv6OptRSOO:
   403  		return "RSOOption"
   404  	case DHCPv6OptPDExclude:
   405  		return "PrefixExclude"
   406  	case DHCPv6OptVSS:
   407  		return "VirtualSubnetSelection"
   408  	case DHCPv6OptRDNSSSelection:
   409  		return "RDNSSSelection"
   410  	case DHCPv6OptKRBPrincipalName:
   411  		return "KerberosPrincipalName"
   412  	case DHCPv6OptKRBRealmName:
   413  		return "KerberosRealmName"
   414  	case DHCPv6OptKRBKDC:
   415  		return "KerberosKDC"
   416  	case DHCPv6OptClientLinkLayerAddress:
   417  		return "ClientLinkLayerAddress"
   418  	case DHCPv6OptLinkAddress:
   419  		return "LinkAddress"
   420  	case DHCPv6OptRADIUS:
   421  		return "RADIUS"
   422  	case DHCPv6OptSolMaxRt:
   423  		return "SolMaxRt"
   424  	case DHCPv6OptInfMaxRt:
   425  		return "InfMaxRt"
   426  	case DHCPv6OptAddrSel:
   427  		return "AddressSelection"
   428  	case DHCPv6OptAddrSelTable:
   429  		return "AddressSelectionTable"
   430  	case DHCPv6OptV6PCPServer:
   431  		return "PCPServer"
   432  	case DHCPv6OptDHCPv4Message:
   433  		return "DHCPv4Message"
   434  	case DHCPv6OptDHCPv4OverDHCPv6Server:
   435  		return "DHCP4o6ServerAddress"
   436  	case DHCPv6OptS46Rule:
   437  		return "S46Rule"
   438  	case DHCPv6OptS46BR:
   439  		return "S46BR"
   440  	case DHCPv6OptS46DMR:
   441  		return "S46DMR"
   442  	case DHCPv6OptS46V4V4Bind:
   443  		return "S46IPv4IPv6AddressBinding"
   444  	case DHCPv6OptS46PortParameters:
   445  		return "S46PortParameters"
   446  	case DHCPv6OptS46ContMAPE:
   447  		return "S46MAPEContainer"
   448  	case DHCPv6OptS46ContMAPT:
   449  		return "S46MAPTContainer"
   450  	case DHCPv6OptS46ContLW:
   451  		return "S46Lightweight4Over6Container"
   452  	case DHCPv6Opt4RD:
   453  		return "4RD"
   454  	case DHCPv6Opt4RDMapRule:
   455  		return "4RDMapRule"
   456  	case DHCPv6Opt4RDNonMapRule:
   457  		return "4RDNonMapRule"
   458  	case DHCPv6OptLQBaseTime:
   459  		return "LQBaseTime"
   460  	case DHCPv6OptLQStartTime:
   461  		return "LQStartTime"
   462  	case DHCPv6OptLQEndTime:
   463  		return "LQEndTime"
   464  	case DHCPv6OptCaptivePortal:
   465  		return "CaptivePortal"
   466  	case DHCPv6OptMPLParameters:
   467  		return "MPLParameterConfiguration"
   468  	case DHCPv6OptANIATT:
   469  		return "ANIAccessTechnologyType"
   470  	case DHCPv6OptANINetworkName:
   471  		return "ANINetworkName"
   472  	case DHCPv6OptANIAPName:
   473  		return "ANIAccessPointName"
   474  	case DHCPv6OptANIAPBSSID:
   475  		return "ANIAccessPointBSSID"
   476  	case DHCPv6OptANIOperatorID:
   477  		return "ANIOperatorIdentifier"
   478  	case DHCPv6OptANIOperatorRealm:
   479  		return "ANIOperatorRealm"
   480  	case DHCPv6OptS46Priority:
   481  		return "S64Priority"
   482  	case DHCPv6OptMUDURLV6:
   483  		return "ManufacturerUsageDescriptionURL"
   484  	case DHCPv6OptV6Prefix64:
   485  		return "V6Prefix64"
   486  	case DHCPv6OptFBindingStatus:
   487  		return "FailoverBindingStatus"
   488  	case DHCPv6OptFConnectFlags:
   489  		return "FailoverConnectFlags"
   490  	case DHCPv6OptFDNSRemovalInfo:
   491  		return "FailoverDNSRemovalInfo"
   492  	case DHCPv6OptFDNSHostName:
   493  		return "FailoverDNSHostName"
   494  	case DHCPv6OptFDNSZoneName:
   495  		return "FailoverDNSZoneName"
   496  	case DHCPv6OptFDNSFlags:
   497  		return "FailoverDNSFlags"
   498  	case DHCPv6OptFExpirationTime:
   499  		return "FailoverExpirationTime"
   500  	case DHCPv6OptFMaxUnacknowledgedBNDUPD:
   501  		return "FailoverMaxUnacknowledgedBNDUPDMessages"
   502  	case DHCPv6OptFMCLT:
   503  		return "FailoverMaximumClientLeadTime"
   504  	case DHCPv6OptFPartnerLifetime:
   505  		return "FailoverPartnerLifetime"
   506  	case DHCPv6OptFPartnerLifetimeSent:
   507  		return "FailoverPartnerLifetimeSent"
   508  	case DHCPv6OptFPartnerDownTime:
   509  		return "FailoverPartnerDownTime"
   510  	case DHCPv6OptFPartnerRawCltTime:
   511  		return "FailoverPartnerRawClientLeadTime"
   512  	case DHCPv6OptFProtocolVersion:
   513  		return "FailoverProtocolVersion"
   514  	case DHCPv6OptFKeepaliveTime:
   515  		return "FailoverKeepaliveTime"
   516  	case DHCPv6OptFReconfigureData:
   517  		return "FailoverReconfigureData"
   518  	case DHCPv6OptFRelationshipName:
   519  		return "FailoverRelationshipName"
   520  	case DHCPv6OptFServerFlags:
   521  		return "FailoverServerFlags"
   522  	case DHCPv6OptFServerState:
   523  		return "FailoverServerState"
   524  	case DHCPv6OptFStartTimeOfState:
   525  		return "FailoverStartTimeOfState"
   526  	case DHCPv6OptFStateExpirationTime:
   527  		return "FailoverStateExpirationTime"
   528  	case DHCPv6OptRelayPort:
   529  		return "RelayPort"
   530  	case DHCPv6OptV6ZeroTouchRedirect:
   531  		return "ZeroTouch"
   532  	case DHCPv6OptIPV6AddressANDSF:
   533  		return "ANDSFIPv6Address"
   534  	default:
   535  		return fmt.Sprintf("Unknown(%d)", uint16(o))
   536  	}
   537  }
   538  
   539  // DHCPv6Options is used to get nicely printed option lists which would normally
   540  // be cut off after 5 options.
   541  type DHCPv6Options []DHCPv6Option
   542  
   543  // String returns a string version of the options list.
   544  func (o DHCPv6Options) String() string {
   545  	buf := &bytes.Buffer{}
   546  	buf.WriteByte('[')
   547  	for i, opt := range o {
   548  		buf.WriteString(opt.String())
   549  		if i+1 != len(o) {
   550  			buf.WriteString(", ")
   551  		}
   552  	}
   553  	buf.WriteByte(']')
   554  	return buf.String()
   555  }
   556  
   557  // DHCPv6Option rerpresents a DHCP option.
   558  type DHCPv6Option struct {
   559  	Code   DHCPv6Opt
   560  	Length uint16
   561  	Data   []byte
   562  }
   563  
   564  // String returns a string version of a DHCP Option.
   565  func (o DHCPv6Option) String() string {
   566  	switch o.Code {
   567  	case DHCPv6OptClientID, DHCPv6OptServerID:
   568  		duid, err := decodeDHCPv6DUID(o.Data)
   569  		if err != nil {
   570  			return fmt.Sprintf("Option(%s:INVALID)", o.Code)
   571  		}
   572  		return fmt.Sprintf("Option(%s:[%s])", o.Code, duid.String())
   573  	case DHCPv6OptOro:
   574  		options := ""
   575  		for i := 0; i < int(o.Length); i += 2 {
   576  			if options != "" {
   577  				options += ","
   578  			}
   579  			option := DHCPv6Opt(binary.BigEndian.Uint16(o.Data[i : i+2]))
   580  			options += option.String()
   581  		}
   582  		return fmt.Sprintf("Option(%s:[%s])", o.Code, options)
   583  	default:
   584  		return fmt.Sprintf("Option(%s:%v)", o.Code, o.Data)
   585  	}
   586  }
   587  
   588  // NewDHCPv6Option constructs a new DHCPv6Option with a given type and data.
   589  func NewDHCPv6Option(code DHCPv6Opt, data []byte) DHCPv6Option {
   590  	o := DHCPv6Option{Code: code}
   591  	if data != nil {
   592  		o.Data = data
   593  		o.Length = uint16(len(data))
   594  	}
   595  
   596  	return o
   597  }
   598  
   599  func (o *DHCPv6Option) encode(b []byte, opts gopacket.SerializeOptions) error {
   600  	binary.BigEndian.PutUint16(b[0:2], uint16(o.Code))
   601  	if opts.FixLengths {
   602  		binary.BigEndian.PutUint16(b[2:4], uint16(len(o.Data)))
   603  	} else {
   604  		binary.BigEndian.PutUint16(b[2:4], o.Length)
   605  	}
   606  	copy(b[4:], o.Data)
   607  
   608  	return nil
   609  }
   610  
   611  func (o *DHCPv6Option) decode(data []byte) error {
   612  	if len(data) < 4 {
   613  		return errors.New("not enough data to decode")
   614  	}
   615  	o.Code = DHCPv6Opt(binary.BigEndian.Uint16(data[0:2]))
   616  	o.Length = binary.BigEndian.Uint16(data[2:4])
   617  	if len(data) < 4+int(o.Length) {
   618  		return fmt.Errorf("dhcpv6 option size < length %d", 4+o.Length)
   619  	}
   620  	o.Data = data[4 : 4+o.Length]
   621  	return nil
   622  }