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); }
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); }
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); }
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; } } }
private void SendNak(DhcpMessage message) { Trace.TraceInformation("{0} Sending Dhcp Negative Acknowledge.", 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.ClientHardwareAddress = message.ClientHardwareAddress; response.AddOption(DhcpOption.DhcpMessageType, (Byte)DhcpMessageType.Nak); this.SendReply(response,false); Trace.TraceInformation("{0} Dhcp Negative Acknowledge Sent.", Thread.CurrentThread.ManagedThreadId); }
private void SendAck(DhcpMessage message) { Trace.TraceInformation("{0} Sending Dhcp Acknowledge.", 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; Byte[] hardwareAddressData = new Byte[6]; Array.Copy(message.ClientHardwareAddress, hardwareAddressData, 6); PhysicalAddress clientHardwareAddress = new PhysicalAddress(hardwareAddressData); if (this.m_Reservations.ContainsKey(clientHardwareAddress)) { response.NextServerAddress = IPAddress.Parse(this.m_Reservations[clientHardwareAddress].ReserveNextServer).GetAddressBytes(); response.BootFileName = Encoding.UTF8.GetBytes(this.m_Reservations[clientHardwareAddress].ReserveBootFile); } else { if (!string.IsNullOrEmpty(UserNextServer)) response.NextServerAddress = IPAddress.Parse(UserNextServer).GetAddressBytes(); else response.NextServerAddress = this.m_DhcpInterfaceAddress.GetAddressBytes(); switch (message.ClientArchitecture) { case "00000": response.BootFileName = Encoding.UTF8.GetBytes(BiosBootFile); break; case "00006": response.BootFileName = Encoding.UTF8.GetBytes(Efi32BootFile); break; case "00007": response.BootFileName = Encoding.UTF8.GetBytes(Efi64BootFile); break; case "00009": response.BootFileName = Encoding.UTF8.GetBytes(Efi64BootFile); break; default: response.BootFileName = Encoding.UTF8.GetBytes(BiosBootFile); break; } } response.ClientAddress = message.ClientAddress; response.ClientHardwareAddress = message.ClientHardwareAddress; response.AddOption(DhcpOption.DhcpMessageType, (Byte)DhcpMessageType.Ack); response.SourcePort = message.SourcePort; this.SendReply(response,true); Trace.TraceInformation("{0} Dhcp Acknowledge Sent.", Thread.CurrentThread.ManagedThreadId); }