internal byte[] BuildSendData(DhcpMessgeType msgType, IPAddress clientIp) { if (!IsBuiltTobeSent) { packet.ApplySettings(msgType, RelatedServer._settings, clientIp); IsBuiltTobeSent = true; return(packet.ToArray()); } throw new Exception("Dhcp packet data is already built."); }
private void SendDhcpMessage(string dest, DhcpMessgeType msgType, DhcpData data, OwnedIpAddress newClient) { try { var dataToSend = data.BuildSendData(msgType, newClient.Ip); udpListener.SendData(dest, dataToSend); } catch (Exception e) { ErrorRaised?.Invoke(this, new ErrorMessageEventArgs { Message = e.Message }); } }
// override method for broadcast private void SendDhcpMessage(DhcpMessgeType msgType, DhcpData data, OwnedIpAddress newClient) { SendDhcpMessage(IPAddress.Broadcast.ToString(), msgType, data, newClient); }
internal void ApplyOptionSettings(DhcpMessgeType messageType, DhcpServerSettings server) { try { var oldMsgType = GetDhcpMessageType(); //erase the options array, and set the message type to ack byte[] newOptions = null; CreateOptionElement(DhcpOptionType.DHCPMessageType, new byte[] { (byte)messageType }, ref newOptions); //server identifier, my IP var myIp = server.ServerIp.GetAddressBytes(); CreateOptionElement(DhcpOptionType.ServerIdentifier, myIp, ref newOptions); //lease time var leaseTime = new byte[4]; leaseTime[3] = (byte)(server.LeaseTime); leaseTime[2] = (byte)(server.LeaseTime >> 8); leaseTime[1] = (byte)(server.LeaseTime >> 16); leaseTime[0] = (byte)(server.LeaseTime >> 24); switch (messageType) { case DhcpMessgeType.DHCP_NAK: goto EndOption; case DhcpMessgeType.DHCP_OFFER: CreateOptionElement(DhcpOptionType.IPAddressLeaseTime, leaseTime, ref newOptions); CreateOptionElement(DhcpOptionType.RenewalTimeValue_T1, leaseTime, ref newOptions); CreateOptionElement(DhcpOptionType.RebindingTimeValue_T2, leaseTime, ref newOptions); break; case DhcpMessgeType.DHCP_ACK: if (oldMsgType == DhcpMessgeType.DHCP_INFORM) { break; } CreateOptionElement(DhcpOptionType.IPAddressLeaseTime, leaseTime, ref newOptions); CreateOptionElement(DhcpOptionType.RenewalTimeValue_T1, leaseTime, ref newOptions); CreateOptionElement(DhcpOptionType.RebindingTimeValue_T2, leaseTime, ref newOptions); break; } // look for the parameter request list var reqList = GetOptionData(DhcpOptionType.ParameterRequestList); // reqList contains the option data in a byte that is requested by the unit foreach (var i in reqList) { byte[] t1 = null; switch ((DhcpOptionType)i) { case DhcpOptionType.SubnetMask: t1 = server.SubnetMask.GetAddressBytes(); break; case DhcpOptionType.Router when server.RouterIp != null: t1 = server.RouterIp.GetAddressBytes(); break; case DhcpOptionType.DomainNameServer when server.DomainIp != null: t1 = server.DomainIp.GetAddressBytes(); break; case DhcpOptionType.DomainName when server.ServerName != null: t1 = Encoding.ASCII.GetBytes(server.ServerName); break; case DhcpOptionType.LogServer: break; case DhcpOptionType.NetBIOSoverTCPIPNameServer: break; case DhcpOptionType.Pad: break; case DhcpOptionType.TimeOffset: break; case DhcpOptionType.TimeServer: break; case DhcpOptionType.NameServer: break; case DhcpOptionType.CookieServer: break; case DhcpOptionType.LPRServer: break; case DhcpOptionType.ImpressServer: break; case DhcpOptionType.ResourceLocServer: break; case DhcpOptionType.HostName: break; case DhcpOptionType.BootFileSize: break; case DhcpOptionType.MeritDump: break; case DhcpOptionType.SwapServer: break; case DhcpOptionType.RootPath: break; case DhcpOptionType.ExtensionsPath: break; case DhcpOptionType.IpForwarding: break; case DhcpOptionType.NonLocalSourceRouting: break; case DhcpOptionType.PolicyFilter: break; case DhcpOptionType.MaximumDatagramReAssemblySize: break; case DhcpOptionType.DefaultIPTimeToLive: break; case DhcpOptionType.PathMTUAgingTimeout: break; case DhcpOptionType.PathMTUPlateauTable: break; case DhcpOptionType.InterfaceMTU: break; case DhcpOptionType.AllSubnetsAreLocal: break; case DhcpOptionType.BroadcastAddress: break; case DhcpOptionType.PerformMaskDiscovery: break; case DhcpOptionType.MaskSupplier: break; case DhcpOptionType.PerformRouterDiscovery: break; case DhcpOptionType.RouterSolicitationAddress: break; case DhcpOptionType.StaticRoute: break; case DhcpOptionType.TrailerEncapsulation: break; case DhcpOptionType.ARPCacheTimeout: break; case DhcpOptionType.EthernetEncapsulation: break; case DhcpOptionType.TCPDefaultTTL: break; case DhcpOptionType.TCPKeepaliveInterval: break; case DhcpOptionType.TCPKeepaliveGarbage: break; case DhcpOptionType.NetworkInformationServiceDomain: break; case DhcpOptionType.NetworkInformationServers: break; case DhcpOptionType.NetworkTimeProtocolServers: break; case DhcpOptionType.VendorSpecificInformation: break; case DhcpOptionType.NetBIOSoverTCPIPDatagramDistributionServer: break; case DhcpOptionType.NetBIOSoverTCPIPNodeType: break; case DhcpOptionType.NetBIOSoverTCPIPScope: break; case DhcpOptionType.XWindowSystemFontServer: break; case DhcpOptionType.XWindowSystemDisplayManager: break; case DhcpOptionType.RequestedIPAddress: break; case DhcpOptionType.IPAddressLeaseTime: break; case DhcpOptionType.OptionOverload: break; case DhcpOptionType.DHCPMessageType: break; case DhcpOptionType.ParameterRequestList: break; case DhcpOptionType.Message: break; case DhcpOptionType.MaximumDHCPMessageSize: break; case DhcpOptionType.RenewalTimeValue_T1: break; case DhcpOptionType.RebindingTimeValue_T2: break; case DhcpOptionType.Vendorclassidentifier: break; case DhcpOptionType.ClientIdentifier: break; case DhcpOptionType.NetworkInformationServicePlusDomain: break; case DhcpOptionType.NetworkInformationServicePlusServers: break; case DhcpOptionType.TFTPServerName: break; case DhcpOptionType.BootfileName: break; case DhcpOptionType.MobileIPHomeAgent: break; case DhcpOptionType.SMTPServer: break; case DhcpOptionType.POP3Server: break; case DhcpOptionType.NNTPServer: break; case DhcpOptionType.DefaultWWWServer: break; case DhcpOptionType.DefaultFingerServer: break; case DhcpOptionType.DefaultIRCServer: break; case DhcpOptionType.StreetTalkServer: break; case DhcpOptionType.STDAServer: break; case DhcpOptionType.End: break; } if (t1 != null) { CreateOptionElement((DhcpOptionType)i, t1, ref newOptions); } } EndOption: //create the end option Array.Resize(ref newOptions, newOptions.Length + 1); Array.Copy(new byte[] { (byte)DhcpOptionType.End }, 0, newOptions, newOptions.Length - 1, 1); options = newOptions; } catch (Exception e) { throw new Exception($@"{GetType().FullName}.{MethodBase.GetCurrentMethod()}:{e.Message}"); } }
public void ApplySettings(DhcpMessgeType msgType, DhcpServerSettings server, IPAddress clientIp) { switch (msgType) { case DhcpMessgeType.DHCP_OFFER: op = (byte)BootMessageType.BootReply; // htype // hlen hops = 0; // xid from client DHCPDISCOVER message secs.FillZero(); ciaddr.FillZero(); yiaddr = IPAddress.Parse(clientIp.ToString()).GetAddressBytes(); siaddr = IPAddress.Parse("0.0.0.0").GetAddressBytes(); // flags from client DHCPDISCOVER message // giaddr from client DHCPDISCOVER message // chaddr from client DHCPDISCOVER message sname.FillZero(); file.FillZero(); options.ApplyOptionSettings(msgType, server); break; case DhcpMessgeType.DHCP_ACK: op = (byte)BootMessageType.BootReply; // htype // hlen hops = 0; // xid from client DHCPREQUEST message secs.FillZero(); ciaddr.FillZero(); if (options.GetDhcpMessageType() == DhcpMessgeType.DHCP_INFORM) { yiaddr.FillZero(); } else { yiaddr = IPAddress.Parse(clientIp.ToString()).GetAddressBytes(); } siaddr = IPAddress.Parse("0.0.0.0").GetAddressBytes(); // flags from client DHCPREQUEST message // giaddr from client DHCPREQUEST message // chaddr from client DHCPREQUEST message sname.FillZero(); file.FillZero(); options.ApplyOptionSettings(msgType, server); break; case DhcpMessgeType.DHCP_NAK: op = (byte)BootMessageType.BootReply; // htype // hlen hops = 0; // xid from client DHCPREQUEST message secs.FillZero(); // ciaddr from client DHCPREQUEST message yiaddr.FillZero(); siaddr.FillZero(); // flags from client DHCPREQUEST message // giaddr from client DHCPREQUEST message // chaddr from client DHCPREQUEST message sname.FillZero(); file.FillZero(); options.ApplyOptionSettings(msgType, server); break; } }