static IDhcpOption ParseDhcpOption( byte optionCode, byte length, byte[] srcBuffer, int offset) { byte type = optionCode; switch (optionCode) { case DhcpSubnetMask.OptionCode: return(DhcpIPv4Option.Parse(type, length, srcBuffer, offset)); case DhcpTimeOffset.OptionCode: return(DhcpDWordOption.Parse(type, length, srcBuffer, offset)); case DhcpRouter.OptionCode: return(DhcpMultiIPv4Option.Parse(type, length, srcBuffer, offset)); case DhcpTimeServer.OptionCode: return(DhcpMultiIPv4Option.Parse(type, length, srcBuffer, offset)); case DhcpNameServer.OptionCode: return(DhcpMultiIPv4Option.Parse(type, length, srcBuffer, offset)); case DhcpDomainNameServer.OptionCode: return(DhcpMultiIPv4Option.Parse(type, length, srcBuffer, offset)); case DhcpLogServer.OptionCode: return(DhcpMultiIPv4Option.Parse(type, length, srcBuffer, offset)); case DhcpCookieServer.OptionCode: return(DhcpMultiIPv4Option.Parse(type, length, srcBuffer, offset)); case DhcpLprServer.OptionCode: return(DhcpMultiIPv4Option.Parse(type, length, srcBuffer, offset)); case DhcpImpressServer.OptionCode: return(DhcpMultiIPv4Option.Parse(type, length, srcBuffer, offset)); case DhcpResourceLocationServer.OptionCode: return(DhcpMultiIPv4Option.Parse(type, length, srcBuffer, offset)); case DhcpHostName.OptionCode: return(DhcpStringOption.Parse(type, length, srcBuffer, offset)); case DhcpBootFileSize.OptionCode: return(DhcpWordOption.Parse(type, length, srcBuffer, offset)); case DhcpMeritDumpFile.OptionCode: return(DhcpStringOption.Parse(type, length, srcBuffer, offset)); case DhcpDomainName.OptionCode: return(DhcpStringOption.Parse(type, length, srcBuffer, offset)); case DhcpSwapServer.OptionCode: return(DhcpIPv4Option.Parse(type, length, srcBuffer, offset)); case DhcpRootPath.OptionCode: return(DhcpStringOption.Parse(type, length, srcBuffer, offset)); case DhcpExtensionsPath.OptionCode: return(DhcpStringOption.Parse(type, length, srcBuffer, offset)); case DhcpIPForwarding.OptionCode: return(DhcpByteOption.Parse(type, length, srcBuffer, offset)); case DhcpForwardRemoteSourceRoute.OptionCode: return(DhcpByteOption.Parse(type, length, srcBuffer, offset)); case DhcpPolicyFilter.OptionCode: return(DhcpMultiIPv4Option.Parse(type, length, srcBuffer, offset)); case DhcpMaximumDatagramReassembly.OptionCode: return(DhcpWordOption.Parse(type, length, srcBuffer, offset)); case DhcpDefaultTtl.OptionCode: return(DhcpByteOption.Parse(type, length, srcBuffer, offset)); case DhcpPathMtuAgingTimeout.OptionCode: return(DhcpDWordOption.Parse(type, length, srcBuffer, offset)); case DhcpPathMtuPlateauTable.OptionCode: return(DhcpMultiWordOption.Parse(type, length, srcBuffer, offset)); case DhcpInterfaceMtu.OptionCode: return(DhcpWordOption.Parse(type, length, srcBuffer, offset)); case DhcpAllSubnetsLocal.OptionCode: return(DhcpByteOption.Parse(type, length, srcBuffer, offset)); case DhcpBroadcastAddress.OptionCode: return(DhcpIPv4Option.Parse(type, length, srcBuffer, offset)); case DhcpMaskDiscovery.OptionCode: return(DhcpByteOption.Parse(type, length, srcBuffer, offset)); case DhcpMaskSupplier.OptionCode: return(DhcpByteOption.Parse(type, length, srcBuffer, offset)); case DhcpRouterDiscovery.OptionCode: return(DhcpByteOption.Parse(type, length, srcBuffer, offset)); case DhcpRouterSolicitationAddress.OptionCode: return(DhcpIPv4Option.Parse(type, length, srcBuffer, offset)); case DhcpStaticRoutes.OptionCode: return(DhcpMultiIPv4Option.Parse(type, length, srcBuffer, offset)); case DhcpTrailerEncapsulate.OptionCode: return(DhcpByteOption.Parse(type, length, srcBuffer, offset)); case DhcpArpCacheTimeout.OptionCode: return(DhcpDWordOption.Parse(type, length, srcBuffer, offset)); case DhcpEthernetEncapsulation.OptionCode: return(DhcpByteOption.Parse(type, length, srcBuffer, offset)); case DhcpTcpDefaultTtl.OptionCode: return(DhcpByteOption.Parse(type, length, srcBuffer, offset)); case DhcpTcpKeepalive.OptionCode: return(DhcpByteOption.Parse(type, length, srcBuffer, offset)); case DhcpTcpKeepaliveGarbage.OptionCode: return(DhcpByteOption.Parse(type, length, srcBuffer, offset)); case DhcpNisDomain.OptionCode: return(DhcpStringOption.Parse(type, length, srcBuffer, offset)); case DhcpNisServers.OptionCode: return(DhcpMultiIPv4Option.Parse(type, length, srcBuffer, offset)); case DhcpNtpServers.OptionCode: return(DhcpMultiIPv4Option.Parse(type, length, srcBuffer, offset)); case DhcpVendorSpecific.OptionCode: return(DhcpMultiByteOption.Parse(type, length, srcBuffer, offset)); case DhcpNetBiosNameServer.OptionCode: return(DhcpMultiIPv4Option.Parse(type, length, srcBuffer, offset)); case DhcpNetBiosDistributionServer.OptionCode: return(DhcpMultiIPv4Option.Parse(type, length, srcBuffer, offset)); case DhcpNetBiosType.OptionCode: return(DhcpByteOption.Parse(type, length, srcBuffer, offset)); case DhcpNetBiosScope.OptionCode: return(DhcpMultiDWordOption.Parse(type, length, srcBuffer, offset)); case DhcpXWindowsFontServer.OptionCode: return(DhcpMultiIPv4Option.Parse(type, length, srcBuffer, offset)); case DhcpXWindowsDisplayManager.OptionCode: return(DhcpMultiIPv4Option.Parse(type, length, srcBuffer, offset)); case DhcpRequestedIPAddress.OptionCode: return(DhcpIPv4Option.Parse(type, length, srcBuffer, offset)); case DhcpIPAddressLeaseTime.OptionCode: return(DhcpDWordOption.Parse(type, length, srcBuffer, offset)); case DhcpOverloadIndicator.OptionCode: return(DhcpByteOption.Parse(type, length, srcBuffer, offset)); case DhcpMessageType.OptionCode: return(DhcpByteOption.Parse(type, length, srcBuffer, offset)); case DhcpServerID.OptionCode: return(DhcpIPv4Option.Parse(type, length, srcBuffer, offset)); case DhcpParameterRequest.OptionCode: return(DhcpMultiByteOption.Parse(type, length, srcBuffer, offset)); case DhcpMessage.OptionCode: return(DhcpStringOption.Parse(type, length, srcBuffer, offset)); case DhcpMaximumMessageSize.OptionCode: return(DhcpWordOption.Parse(type, length, srcBuffer, offset)); case DhcpRenewalTime.OptionCode: return(DhcpDWordOption.Parse(type, length, srcBuffer, offset)); case DhcpRebindingTime.OptionCode: return(DhcpDWordOption.Parse(type, length, srcBuffer, offset)); case DhcpClassID.OptionCode: return(DhcpStringOption.Parse(type, length, srcBuffer, offset)); case DhcpClientID.OptionCode: return(DhcpMultiByteOption.Parse(type, length, srcBuffer, offset)); case DhcpAutoConfigure.OptionCode: return(DhcpByteOption.Parse(type, length, srcBuffer, offset)); default: return(null); } }
public static SortedList Parse(byte[] data, int offset, int length) { const byte PadByte = 0; const byte EndByte = 255; SortedList dhcpOptions = new SortedList(); while (offset != length) { // skip padding while (data[offset] == PadByte) { offset++; if (offset == length) { goto finished_options; } } if (data[offset] == EndByte) { break; } byte @opt = data[offset++]; byte optlen = data[offset++]; if (optlen == 0) { // Unknown, ignore continue; } if (optlen + offset > length) { break; } // Remove any outstanding option with the same option number // before adding option to list of those already parsed to // prevent SortedList::Add from throwing ArgumentException dhcpOptions.Remove(opt); try { object name = ParserName(opt); if (name != null) { dhcpOptions.Add( opt, ParseDhcpOption(@opt, optlen, data, offset) ); } else { // For unknowns fall back to multi-byte parser dhcpOptions.Add( @opt, DhcpMultiByteOption.Parse(@opt, optlen, data, offset) ); } } catch (InvalidDhcpOptionLength) { } offset += optlen; } finished_options: return(dhcpOptions); }