package main import ( "time" ) type OptionCode byte // DHCPv4 Options const ( OptionPad OptionCode = 0 OptionSubnetMask OptionCode = 1 OptionTimeOffset OptionCode = 2 OptionRouter OptionCode = 3 OptionTimeServer OptionCode = 4 OptionNameServer OptionCode = 5 OptionDomainNameServer OptionCode = 6 OptionLogServer OptionCode = 7 OptionQuoteServer OptionCode = 8 OptionLPRServer OptionCode = 9 OptionImpressServer OptionCode = 10 OptionResourceLocationServer OptionCode = 11 OptionHostName OptionCode = 12 OptionBootFileSize OptionCode = 13 OptionMeritDumpFile OptionCode = 14 OptionDomainName OptionCode = 15 OptionSwapServer OptionCode = 16 OptionRootPath OptionCode = 17 OptionExtensionsPath OptionCode = 18 OptionIPForwarding OptionCode = 19 OptionNonLocalSourceRouting OptionCode = 20 OptionPolicyFilter OptionCode = 21 OptionMaximumDatagramAssemblySize OptionCode = 22 OptionDefaultIPTTL OptionCode = 23 OptionPathMTUAgingTimeout OptionCode = 24 OptionPathMTUPlateauTable OptionCode = 25 OptionInterfaceMTU OptionCode = 26 OptionAllSubnetsAreLocal OptionCode = 27 OptionBroadcastAddress OptionCode = 28 OptionPerformMaskDiscovery OptionCode = 29 OptionMaskSupplier OptionCode = 30 OptionPerformRouterDiscovery OptionCode = 31 OptionRouterSolicitationAddress OptionCode = 32 OptionStaticRoutingTable OptionCode = 33 OptionTrailerEncapsulation OptionCode = 34 OptionArpCacheTimeout OptionCode = 35 OptionEthernetEncapsulation OptionCode = 36 OptionDefaulTCPTTL OptionCode = 37 OptionTCPKeepaliveInterval OptionCode = 38 OptionTCPKeepaliveGarbage OptionCode = 39 OptionNetworkInformationServiceDomain OptionCode = 40 OptionNetworkInformationServers OptionCode = 41 OptionNTPServers OptionCode = 42 OptionVendorSpecificInformation OptionCode = 43 OptionNetBIOSOverTCPIPNameServer OptionCode = 44 OptionNetBIOSOverTCPIPDatagramDistributionServer OptionCode = 45 OptionNetBIOSOverTCPIPNodeType OptionCode = 46 OptionNetBIOSOverTCPIPScope OptionCode = 47 OptionXWindowSystemFontServer OptionCode = 48 OptionXWindowSystemDisplayManger OptionCode = 49 OptionRequestedIPAddress OptionCode = 50 OptionIPAddressLeaseTime OptionCode = 51 OptionOptionOverload OptionCode = 52 OptionDHCPMessageType OptionCode = 53 OptionServerIdentifier OptionCode = 54 OptionParameterRequestList OptionCode = 55 OptionMessage OptionCode = 56 OptionMaximumDHCPMessageSize OptionCode = 57 OptionRenewTimeValue OptionCode = 58 OptionRebindingTimeValue OptionCode = 59 OptionClassIdentifier OptionCode = 60 OptionClientIdentifier OptionCode = 61 OptionNetWareIPDomainName OptionCode = 62 OptionNetWareIPInformation OptionCode = 63 OptionNetworkInformationServicePlusDomain OptionCode = 64 OptionNetworkInformationServicePlusServers OptionCode = 65 OptionTFTPServerName OptionCode = 66 OptionBootfileName OptionCode = 67 OptionMobileIPHomeAgent OptionCode = 68 OptionSimpleMailTransportProtocolServer OptionCode = 69 OptionPostOfficeProtocolServer OptionCode = 70 OptionNetworkNewsTransportProtocolServer OptionCode = 71 OptionDefaultWorldWideWebServer OptionCode = 72 OptionDefaultFingerServer OptionCode = 73 OptionDefaultInternetRelayChatServer OptionCode = 74 OptionStreetTalkServer OptionCode = 75 OptionStreetTalkDirectoryAssistanceServer OptionCode = 76 OptionUserClassInformation OptionCode = 77 OptionSLPDirectoryAgent OptionCode = 78 OptionSLPServiceScope OptionCode = 79 OptionRapidCommit OptionCode = 80 OptionFQDN OptionCode = 81 OptionRelayAgentInformation OptionCode = 82 OptionInternetStorageNameService OptionCode = 83 // Option 84 returned in RFC 3679 OptionNDSServers OptionCode = 85 OptionNDSTreeName OptionCode = 86 OptionNDSContext OptionCode = 87 OptionBCMCSControllerDomainNameList OptionCode = 88 OptionBCMCSControllerIPv4AddressList OptionCode = 89 OptionAuthentication OptionCode = 90 OptionClientLastTransactionTime OptionCode = 91 OptionAssociatedIP OptionCode = 92 OptionClientSystemArchitectureType OptionCode = 93 OptionClientNetworkInterfaceIdentifier OptionCode = 94 OptionLDAP OptionCode = 95 // Option 96 returned in RFC 3679 OptionClientMachineIdentifier OptionCode = 97 OptionOpenGroupUserAuthentication OptionCode = 98 OptionGeoConfCivic OptionCode = 99 OptionIEEE10031TZString OptionCode = 100 OptionReferenceToTZDatabase OptionCode = 101 // Options 102-111 returned in RFC 3679 OptionNetInfoParentServerAddress OptionCode = 112 OptionNetInfoParentServerTag OptionCode = 113 OptionURL OptionCode = 114 // Option 115 returned in RFC 3679 OptionAutoConfigure OptionCode = 116 OptionNameServiceSearch OptionCode = 117 OptionSubnetSelection OptionCode = 118 OptionDNSDomainSearchList OptionCode = 119 OptionSIPServers OptionCode = 120 OptionClasslessStaticRoute OptionCode = 121 OptionCCC OptionCode = 122 OptionGeoConf OptionCode = 123 OptionVendorIdentifyingVendorClass OptionCode = 124 OptionVendorIdentifyingVendorSpecific OptionCode = 125 // Options 126-127 returned in RFC 3679 OptionTFTPServerIPAddress OptionCode = 128 OptionCallServerIPAddress OptionCode = 129 OptionDiscriminationString OptionCode = 130 OptionRemoteStatisticsServerIPAddress OptionCode = 131 Option8021PVLANID OptionCode = 132 Option8021QL2Priority OptionCode = 133 OptionDiffservCodePoint OptionCode = 134 OptionHTTPProxyForPhoneSpecificApplications OptionCode = 135 OptionPANAAuthenticationAgent OptionCode = 136 OptionLoSTServer OptionCode = 137 OptionCAPWAPAccessControllerAddresses OptionCode = 138 OptionOPTIONIPv4AddressMoS OptionCode = 139 OptionOPTIONIPv4FQDNMoS OptionCode = 140 OptionSIPUAConfigurationServiceDomains OptionCode = 141 OptionOPTIONIPv4AddressANDSF OptionCode = 142 OptionOPTIONIPv6AddressANDSF OptionCode = 143 // Options 144-149 returned in RFC 3679 OptionTFTPServerAddress OptionCode = 150 OptionStatusCode OptionCode = 151 OptionBaseTime OptionCode = 152 OptionStartTimeOfState OptionCode = 153 OptionQueryStartTime OptionCode = 154 OptionQueryEndTime OptionCode = 155 OptionDHCPState OptionCode = 156 OptionDataSource OptionCode = 157 // Options 158-174 returned in RFC 3679 OptionEtherboot OptionCode = 175 OptionIPTelephone OptionCode = 176 OptionEtherbootPacketCableAndCableHome OptionCode = 177 // Options 178-207 returned in RFC 3679 OptionPXELinuxMagicString OptionCode = 208 OptionPXELinuxConfigFile OptionCode = 209 OptionPXELinuxPathPrefix OptionCode = 210 OptionPXELinuxRebootTime OptionCode = 211 OptionOPTION6RD OptionCode = 212 OptionOPTIONv4AccessDomain OptionCode = 213 // Options 214-219 returned in RFC 3679 OptionSubnetAllocation OptionCode = 220 OptionVirtualSubnetAllocation OptionCode = 221 // Options 222-223 returned in RFC 3679 // Options 224-254 are reserved for private use OptionEnd OptionCode = 255 ) type DhcpOp byte const ( BOOTREQUEST DhcpOp = iota + 1 BOOTREPLY ) // MessageType represents the possible DHCP message types - DISCOVER, OFFER, etc type MessageType byte // DHCP message types const ( // MessageTypeNone is not a real message type, it is used by certain // functions to signal that no explicit message type is requested MessageTypeNone MessageType = iota MessageTypeDiscover MessageTypeOffer MessageTypeRequest MessageTypeDecline MessageTypeAck MessageTypeNak MessageTypeRelease MessageTypeInform ) type LeaseState uint8 type TxId [4]byte type Ipv4Addr [4]byte type HwAddr [16]byte var magic = [4]byte{0x63, 0x82, 0x53, 0x63} type DhcpMessage struct { Op DhcpOp Htype MessageType Hlen byte Hops byte Xid TxId Secs uint16 Flags uint16 Ciaddr Ipv4Addr Yiaddr Ipv4Addr Siaddr Ipv4Addr Giaddr Ipv4Addr Chaddr HwAddr Sname [64]byte File [128]byte Magic [4]byte } const ( Offered LeaseState = iota Requested ) type Lease struct { TransactionId TxId TTL time.Time State LeaseState ClientAddr HwAddr Address Ipv4Addr }