Ejemplo n.º 1
0
        private void SendNak(DhcpMessage message)
        {
            Trace.TraceInformation("{0} Sending Dhcp Negative Acknowledge.", Thread.CurrentThread.ManagedThreadId);

            var response = new DhcpMessage
            {
                Operation = DhcpOperation.BootReply,
                Hardware = HardwareType.Ethernet,
                HardwareAddressLength = 6,
                SecondsElapsed = message.SecondsElapsed,
                SessionId = message.SessionId,
                ClientHardwareAddress = message.ClientHardwareAddress
            };


            response.AddOption(DhcpOption.DhcpMessageType, (byte) DhcpMessageType.Nak);
            response.AddOption(DhcpOption.DhcpAddress, _mDhcpInterfaceAddress.GetAddressBytes());

            try
            {
                var clientIp = response.ClientAddress[0] + "." + response.ClientAddress[1] + "." +
                               response.ClientAddress[2] + "." + response.ClientAddress[3];
                _mDhcpSocket.SendTo(response.ToArray(), new IPEndPoint(IPAddress.Parse(clientIp), DhcpClientPort));
            }
            catch (Exception ex)
            {
                TraceException("Error Sending Dhcp Reply", ex);
                return;
            }
            Trace.TraceInformation("{0} Dhcp Negative Acknowledge Sent.", Thread.CurrentThread.ManagedThreadId);
        }
Ejemplo n.º 2
0
        private void SendOffer(DhcpMessage message)
        {
            Trace.TraceInformation("{0} Sending Dhcp Offer.", Thread.CurrentThread.ManagedThreadId);

            DhcpMessage response = new DhcpMessage();
            response.Operation = DhcpOperation.BootReply;
            response.Hardware = HardwareType.Ethernet;
            response.HardwareAddressLength = 6;
            response.SecondsElapsed = message.SecondsElapsed;
            response.SessionId = message.SessionId;
            response.Flags = message.Flags;

            Byte[] hardwareAddressData = new Byte[6];
            Array.Copy(message.ClientHardwareAddress, hardwareAddressData, 6);
            PhysicalAddress clientHardwareAddress = new PhysicalAddress(hardwareAddressData);

            response.NextServerAddress = this._mDhcpInterfaceAddress.GetAddressBytes();
            response.ClientHardwareAddress = message.ClientHardwareAddress;

            response.AddOption(DhcpOption.DhcpMessageType, (Byte)DhcpMessageType.Offer);
            response.AddOption(DhcpOption.ClassId, Encoding.UTF8.GetBytes("PXEClient"));

            Byte[] paramList = message.GetOptionData(DhcpOption.ParameterList);
            if (paramList != null)
            {
                response.OptionOrdering = paramList;
            }


            response.AddOption(DhcpOption.DhcpAddress, this._mDhcpInterfaceAddress.GetAddressBytes());

            try
            {
                this._mDhcpSocket.SendTo(response.ToArray(), new IPEndPoint(IPAddress.Broadcast, DhcpClientPort));
            }
            catch (Exception ex)
            {
                TraceException("Error Sending Dhcp Reply", ex);
                return;
            }

            Trace.TraceInformation("{0} Dhcp Offer Sent.", Thread.CurrentThread.ManagedThreadId);
        }
Ejemplo n.º 3
0
        private void SendAck(DhcpMessage message)
        {
            Trace.TraceInformation("{0} Sending Dhcp Acknowledge.", Thread.CurrentThread.ManagedThreadId);

            var response = new DhcpMessage
            {
                Operation = DhcpOperation.BootReply,
                Hardware = HardwareType.Ethernet,
                HardwareAddressLength = 6,
                SecondsElapsed = message.SecondsElapsed,
                SessionId = message.SessionId
            };

            var hardwareAddressData = new byte[6];
            Array.Copy(message.ClientHardwareAddress, hardwareAddressData, 6);
            var clientHardwareAddress = new PhysicalAddress(hardwareAddressData);


            if (_mReservations.ContainsKey(clientHardwareAddress))
            {
                response.NextServerAddress =
                    IPAddress.Parse(_dReservations[clientHardwareAddress].ReserveNextServer).GetAddressBytes();
                response.BootFileName = Encoding.UTF8.GetBytes(_dReservations[clientHardwareAddress].ReserveBootFile);
            }
            else
            {
                response.NextServerAddress = !string.IsNullOrEmpty(UserNextServer)
                    ? IPAddress.Parse(UserNextServer).GetAddressBytes()
                    : _mDhcpInterfaceAddress.GetAddressBytes();
                response.BootFileName = Encoding.UTF8.GetBytes(AppleBootFile);
            }

            response.ClientAddress = message.ClientAddress;
            response.ClientHardwareAddress = message.ClientHardwareAddress;
            response.AddOption(DhcpOption.DhcpMessageType, (byte) DhcpMessageType.Ack);
            response.AddOption(DhcpOption.ClassId, Encoding.UTF8.GetBytes("AAPLBSDPC"));
            response.AddOption(DhcpOption.VendorSpecificInformation, StringToByteArray(VendorInfo));
            response.AddOption(DhcpOption.RootPath, Encoding.UTF8.GetBytes(RootPath));
            response.SourcePort = message.SourcePort;
            response.AddOption(DhcpOption.DhcpAddress, _mDhcpInterfaceAddress.GetAddressBytes());

            try
            {
                var clientIp = response.ClientAddress[0] + "." + response.ClientAddress[1] + "." +
                               response.ClientAddress[2] + "." + response.ClientAddress[3];
                _mDhcpSocket.SendTo(response.ToArray(), new IPEndPoint(IPAddress.Parse(clientIp), DhcpClientPort));
            }
            catch (Exception ex)
            {
                TraceException("Error Sending Dhcp Reply", ex);
                return;
            }

            Trace.TraceInformation("{0} Dhcp Acknowledge Sent.", Thread.CurrentThread.ManagedThreadId);
        }
Ejemplo n.º 4
0
        private void SendReply(DhcpMessage response,bool success)
        {

            response.AddOption(DhcpOption.DhcpAddress, this.m_DhcpInterfaceAddress.GetAddressBytes());
            
            Byte[] sessionId = BitConverter.GetBytes(response.SessionId);

            if (success)
            {
                try
                {
                    if (response.SourcePort == "4011")
                    {
                        string clientIP = response.ClientAddress[0] + "." + response.ClientAddress[1] + "." + response.ClientAddress[2] + "." + response.ClientAddress[3];
                        this.m_DhcpSocket.SendTo(response.ToArray(), new IPEndPoint(IPAddress.Parse(clientIP), DhcpClientProxyPort));
                    }
                    else
                    {
                        string clientIP = response.ClientAddress[0] + "." + response.ClientAddress[1] + "." + response.ClientAddress[2] + "." + response.ClientAddress[3];
                        this.m_DhcpSocket.SendTo(response.ToArray(), new IPEndPoint(IPAddress.Parse(clientIP), DhcpClientPort));
                    }
                }
                catch (Exception ex)
                {
                    TraceException("Error Sending Dhcp Reply", ex);
                    return;
                }
            }
            else
            {
                try
                {
                    this.m_DhcpSocket.SendTo(response.ToArray(), new IPEndPoint(IPAddress.Broadcast, DhcpClientPort));
                }
                catch (Exception ex)
                {
                    TraceException("Error Sending Dhcp Reply", ex);
                    return;
                }
            }
        }