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 }