internal Lease(LeaseType type, string hostName, DhcpMessageHardwareAddressType hardwareAddressType, string hardwareAddress, IPAddress address, string comments) : this(type, hostName, hardwareAddressType, ParseHardwareAddress(hardwareAddress), address, comments) { }
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) { }
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; }
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); } }
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; } } }
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; }