Ejemplo n.º 1
0
 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.");
 }
Ejemplo n.º 2
0
 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
         });
     }
 }
Ejemplo n.º 3
0
 // override method for broadcast
 private void SendDhcpMessage(DhcpMessgeType msgType, DhcpData data, OwnedIpAddress newClient)
 {
     SendDhcpMessage(IPAddress.Broadcast.ToString(), msgType, data, newClient);
 }
Ejemplo n.º 4
0
        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}");
            }
        }
Ejemplo n.º 5
0
        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;
            }
        }