示例#1
0
        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);
            }
        }
示例#2
0
        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);
        }