Пример #1
0
 internal Lease(LeaseType type, string hostName, DhcpMessageHardwareAddressType hardwareAddressType, string hardwareAddress, IPAddress address, string comments)
     : this(type, hostName, hardwareAddressType, ParseHardwareAddress(hardwareAddress), address, comments)
 {
 }
Пример #2
0
 internal Lease(LeaseType type, string hostName, DhcpMessageHardwareAddressType hardwareAddressType, byte[] hardwareAddress, IPAddress address, string comments)
     : this(type, new ClientIdentifierOption((byte)hardwareAddressType, hardwareAddress), hostName, hardwareAddress, address, comments, 0)
 {
 }
Пример #3
0
        public DhcpMessage(DhcpMessageOpCode op, byte[] xid, byte[] secs, DhcpMessageFlags flags, IPAddress ciaddr, IPAddress yiaddr, IPAddress siaddr, IPAddress giaddr, byte[] clientHardwareAddress, IReadOnlyCollection <DhcpOption> options)
        {
            if (ciaddr.AddressFamily != AddressFamily.InterNetwork)
            {
                throw new ArgumentException("Address family not supported.", nameof(ciaddr));
            }

            if (yiaddr.AddressFamily != AddressFamily.InterNetwork)
            {
                throw new ArgumentException("Address family not supported.", nameof(yiaddr));
            }

            if (siaddr.AddressFamily != AddressFamily.InterNetwork)
            {
                throw new ArgumentException("Address family not supported.", nameof(siaddr));
            }

            if (giaddr.AddressFamily != AddressFamily.InterNetwork)
            {
                throw new ArgumentException("Address family not supported.", nameof(giaddr));
            }

            if ((clientHardwareAddress != null) && (clientHardwareAddress.Length != 6))
            {
                throw new ArgumentException("Value must be 6 bytes long for a valid Ethernet hardware address.", "chaddr");
            }

            if (xid.Length != 4)
            {
                throw new ArgumentException("Transaction ID must be 4 bytes.", nameof(xid));
            }

            if (secs.Length != 2)
            {
                throw new ArgumentException("Seconds elapsed must be 2 bytes.", nameof(secs));
            }

            _op    = op;
            _htype = DhcpMessageHardwareAddressType.Ethernet;
            _hlen  = 6;
            _hops  = 0;

            _xid = xid;

            _secs  = secs;
            _flags = flags;

            _ciaddr = ciaddr;
            _yiaddr = yiaddr;
            _siaddr = siaddr;
            _giaddr = giaddr;

            _clientHardwareAddress = clientHardwareAddress;
            _chaddr = new byte[16];
            Buffer.BlockCopy(_clientHardwareAddress, 0, _chaddr, 0, 6);

            _sname = new byte[64];
            _file  = new byte[128];

            _options = options;
        }
Пример #4
0
        public DhcpMessage(Stream s)
        {
            byte[] buffer = new byte[4];

            s.ReadBytes(buffer, 0, 4);
            _op    = (DhcpMessageOpCode)buffer[0];
            _htype = (DhcpMessageHardwareAddressType)buffer[1];
            _hlen  = buffer[2];
            _hops  = buffer[3];

            _xid = s.ReadBytes(4);

            s.ReadBytes(buffer, 0, 4);
            _secs = new byte[2];
            Buffer.BlockCopy(buffer, 0, _secs, 0, 2);
            Array.Reverse(buffer);
            _flags = (DhcpMessageFlags)BitConverter.ToUInt16(buffer, 0);

            s.ReadBytes(buffer, 0, 4);
            _ciaddr = new IPAddress(buffer);

            s.ReadBytes(buffer, 0, 4);
            _yiaddr = new IPAddress(buffer);

            s.ReadBytes(buffer, 0, 4);
            _siaddr = new IPAddress(buffer);

            s.ReadBytes(buffer, 0, 4);
            _giaddr = new IPAddress(buffer);

            _chaddr = s.ReadBytes(16);
            _clientHardwareAddress = new byte[_hlen];
            Buffer.BlockCopy(_chaddr, 0, _clientHardwareAddress, 0, _hlen);

            _sname = s.ReadBytes(64);
            _file  = s.ReadBytes(128);

            //read options
            List <DhcpOption> options = new List <DhcpOption>();

            _options = options;

            s.ReadBytes(buffer, 0, 4);
            uint magicCookie = BitConverter.ToUInt32(buffer, 0);

            if (magicCookie == MAGIC_COOKIE)
            {
                ParseOptions(s, options);

                if (_optionOverload != null)
                {
                    if (_optionOverload.Value.HasFlag(OptionOverloadValue.FileFieldUsed))
                    {
                        using (MemoryStream mS = new MemoryStream(_file))
                        {
                            ParseOptions(mS, options);
                        }
                    }

                    if (_optionOverload.Value.HasFlag(OptionOverloadValue.SnameFieldUsed))
                    {
                        using (MemoryStream mS = new MemoryStream(_sname))
                        {
                            ParseOptions(mS, options);
                        }
                    }
                }

                //parse all option values
                foreach (DhcpOption option in options)
                {
                    option.ParseOptionValue();
                }
            }

            if (_clientIdentifier == null)
            {
                _clientIdentifier = new ClientIdentifierOption((byte)_htype, _clientHardwareAddress);
            }

            if (_maximumDhcpMessageSize != null)
            {
                _maximumDhcpMessageSize = new MaximumDhcpMessageSizeOption(576);
            }
        }
Пример #5
0
        public DhcpMessage(DhcpMessageOpCode op, DhcpMessageHardwareAddressType hardwareAddressType, byte[] xid, byte[] secs, DhcpMessageFlags flags, IPAddress ciaddr, IPAddress yiaddr, IPAddress siaddr, IPAddress giaddr, byte[] clientHardwareAddress, string sname, string file, IReadOnlyCollection <DhcpOption> options)
        {
            if (ciaddr.AddressFamily != AddressFamily.InterNetwork)
            {
                throw new ArgumentException("Address family not supported.", nameof(ciaddr));
            }

            if (yiaddr.AddressFamily != AddressFamily.InterNetwork)
            {
                throw new ArgumentException("Address family not supported.", nameof(yiaddr));
            }

            if (siaddr.AddressFamily != AddressFamily.InterNetwork)
            {
                throw new ArgumentException("Address family not supported.", nameof(siaddr));
            }

            if (giaddr.AddressFamily != AddressFamily.InterNetwork)
            {
                throw new ArgumentException("Address family not supported.", nameof(giaddr));
            }

            if (clientHardwareAddress == null)
            {
                throw new ArgumentNullException(nameof(clientHardwareAddress));
            }

            if (clientHardwareAddress.Length > 16)
            {
                throw new ArgumentException("Client hardware address cannot exceed 16 bytes.", nameof(clientHardwareAddress));
            }

            if (xid.Length != 4)
            {
                throw new ArgumentException("Transaction ID must be 4 bytes.", nameof(xid));
            }

            if (secs.Length != 2)
            {
                throw new ArgumentException("Seconds elapsed must be 2 bytes.", nameof(secs));
            }

            _op    = op;
            _htype = hardwareAddressType;
            _hlen  = Convert.ToByte(clientHardwareAddress.Length);
            _hops  = 0;

            _xid = xid;

            _secs  = secs;
            _flags = flags;

            _ciaddr = ciaddr;
            _yiaddr = yiaddr;
            _siaddr = siaddr;
            _giaddr = giaddr;

            _clientHardwareAddress = clientHardwareAddress;
            _chaddr = new byte[16];
            Buffer.BlockCopy(_clientHardwareAddress, 0, _chaddr, 0, _clientHardwareAddress.Length);

            _sname = new byte[64];
            if (sname != null)
            {
                _serverHostName = sname;

                byte[] buffer = Encoding.ASCII.GetBytes(sname);
                if (buffer.Length >= 64)
                {
                    throw new ArgumentException("Server host name cannot exceed 63 bytes.", nameof(sname));
                }

                Buffer.BlockCopy(buffer, 0, _sname, 0, buffer.Length);
            }

            _file = new byte[128];
            if (file != null)
            {
                _bootFileName = file;

                byte[] buffer = Encoding.ASCII.GetBytes(file);
                if (buffer.Length >= 128)
                {
                    throw new ArgumentException("Boot file name cannot exceed 127 bytes.", nameof(file));
                }

                Buffer.BlockCopy(buffer, 0, _file, 0, buffer.Length);
            }

            _options = options;

            foreach (DhcpOption option in _options)
            {
                if (option.Code == DhcpOptionCode.ServerIdentifier)
                {
                    _serverIdentifier = option as ServerIdentifierOption;
                    break;
                }
            }
        }
Пример #6
0
        public DhcpMessage(DhcpMessageOpCode op, DhcpMessageHardwareAddressType hardwareAddressType, byte[] xid, byte[] secs, DhcpMessageFlags flags, IPAddress ciaddr, IPAddress yiaddr, IPAddress siaddr, IPAddress giaddr, byte[] clientHardwareAddress, IReadOnlyCollection <DhcpOption> options)
        {
            if (ciaddr.AddressFamily != AddressFamily.InterNetwork)
            {
                throw new ArgumentException("Address family not supported.", nameof(ciaddr));
            }

            if (yiaddr.AddressFamily != AddressFamily.InterNetwork)
            {
                throw new ArgumentException("Address family not supported.", nameof(yiaddr));
            }

            if (siaddr.AddressFamily != AddressFamily.InterNetwork)
            {
                throw new ArgumentException("Address family not supported.", nameof(siaddr));
            }

            if (giaddr.AddressFamily != AddressFamily.InterNetwork)
            {
                throw new ArgumentException("Address family not supported.", nameof(giaddr));
            }

            if (clientHardwareAddress == null)
            {
                throw new ArgumentNullException(nameof(clientHardwareAddress));
            }

            if (clientHardwareAddress.Length > 16)
            {
                throw new ArgumentException("Client hardware address cannot exceed 16 bytes.", "chaddr");
            }

            if (xid.Length != 4)
            {
                throw new ArgumentException("Transaction ID must be 4 bytes.", nameof(xid));
            }

            if (secs.Length != 2)
            {
                throw new ArgumentException("Seconds elapsed must be 2 bytes.", nameof(secs));
            }

            _op    = op;
            _htype = hardwareAddressType;
            _hlen  = Convert.ToByte(clientHardwareAddress.Length);
            _hops  = 0;

            _xid = xid;

            _secs  = secs;
            _flags = flags;

            _ciaddr = ciaddr;
            _yiaddr = yiaddr;
            _siaddr = siaddr;
            _giaddr = giaddr;

            _clientHardwareAddress = clientHardwareAddress;
            _chaddr = new byte[16];
            Buffer.BlockCopy(_clientHardwareAddress, 0, _chaddr, 0, _clientHardwareAddress.Length);

            _sname = new byte[64];
            _file  = new byte[128];

            _options = options;
        }