protected virtual void ProcessRequest(byte[] data, UDPListener udpListener, IPEndPoint ipEndPoint, string listenerMAC, string dnsIPv6)
        {
            string       clientIP = ipEndPoint.Address.ToString();
            DHCPv6Packet packet   = new DHCPv6Packet(data);

            if (packet.Message?.MsgType == 1 || packet.Message?.MsgType == 3 || packet.Message?.MsgType == 5)
            {
                bool isMicrosoft = false;

                if (packet.Option16?.EnterpriseNumber == 311)
                {
                    isMicrosoft = true;
                }

                byte   msgType = 0;
                string leaseIP = "";

                switch (packet.Message.MsgType)
                {
                case 1:
                    msgType = 2;

                    break;

                case 3:
                {
                    byte[] renewIP = new DHCPv6Option5(packet.Option3.IANAOptions).IPv6Address;
                    leaseIP = new IPAddress(renewIP).ToString();
                    msgType = 7;
                }
                break;

                case 5:
                {
                    byte[] renewIP = new DHCPv6Option5(packet.Option3.IANAOptions).IPv6Address;
                    leaseIP = new IPAddress(renewIP).ToString();
                    msgType = 7;
                }
                break;
                }

                DHCPv6DUIDLL duid          = new DHCPv6DUIDLL(packet.Option1.DUID);
                byte[]       clientMACData = new DHCPv6DUIDLL(packet.Option1.DUID).LinkLayerAddress;

                if (duid.DUIDType == 1)
                {
                    clientMACData = new DHCPv6DUIDLLT(packet.Option1.DUID).LinkLayerAddress;
                }

                string clientMAC      = BitConverter.ToString(clientMACData).Replace("-", ":");
                string clientHostName = "";

                if (!String.IsNullOrEmpty(packet.Option39?.DomainName))
                {
                    clientHostName = packet.Option39.DomainName;
                }

                if (Check(clientMAC, clientHostName, listenerMAC, isMicrosoft, out string message))
                {
                    if (msgType == 2)
                    {
                        leaseIP = "fe80::" + this.Prefix + ":" + this.Index;
                        this.Index++;
                    }

                    byte[] buffer = new DHCPv6Packet().GetBytes(msgType, leaseIP, listenerMAC, dnsIPv6, this.DNSSuffix, this.Lifetime, packet);
                    SendTo(buffer, udpListener, ipEndPoint);
                }

                Output(packet.Message.MsgType, leaseIP, clientIP, clientMAC, clientHostName, message);
            }
        }
        internal static void ProcessDHCPv6Request(byte[] data, string clientIP, int clientPort, string sourceIP, int sourcePort)
        {
            DHCPv6Packet   packet   = new DHCPv6Packet(data);
            DHCPv6Listener listener = new DHCPv6Listener();

            if (packet.Message?.MsgType == 1 || packet.Message?.MsgType == 3 || packet.Message?.MsgType == 5)
            {
                bool isMicrosoft = false;

                if (packet.Option16?.EnterpriseNumber == 311)
                {
                    isMicrosoft = true;
                }

                byte   msgType = 0;
                string leaseIP = "";

                switch (packet.Message.MsgType)
                {
                case 1:
                    msgType = 2;
                    break;

                case 3:
                {
                    byte[] renewIP = new DHCPv6Option5(packet.Option3.IANAOptions).IPv6Address;
                    leaseIP = new IPAddress(renewIP).ToString();
                    msgType = 7;
                }
                break;

                case 5:
                {
                    byte[] renewIP = new DHCPv6Option5(packet.Option3.IANAOptions).IPv6Address;
                    leaseIP = new IPAddress(renewIP).ToString();
                    msgType = 7;
                }
                break;
                }

                DHCPv6DUIDLL duid          = new DHCPv6DUIDLL(packet.Option1.DUID);
                byte[]       clientMACData = new DHCPv6DUIDLL(packet.Option1.DUID).LinkLayerAddress;

                if (duid.DUIDType == 1)
                {
                    clientMACData = new DHCPv6DUIDLLT(packet.Option1.DUID).LinkLayerAddress;
                }

                string clientMAC      = BitConverter.ToString(clientMACData).Replace("-", ":");
                string clientHostName = "";

                if (!String.IsNullOrEmpty(packet.Option39?.DomainName))
                {
                    clientHostName = packet.Option39.DomainName;
                }

                if (listener.Check(clientMAC, clientHostName, Program.argMAC, isMicrosoft, out string message))
                {
                    if (msgType == 2)
                    {
                        leaseIP = "fe80::" + Program.dhcpv6Random + ":" + Program.dhcpv6IPIndex;
                        Program.dhcpv6IPIndex++;
                    }

                    byte[] buffer = new DHCPv6Packet().GetBytes(msgType, leaseIP, Program.argMAC, Program.argSpooferIPv6, Program.argDNSSuffix, uint.Parse(Program.argDHCPv6TTL), packet);

                    if (!Utilities.ArrayIsNullOrEmpty(buffer))
                    {
                        UDPSocket.SendTo(clientIP, clientPort, sourceIP, sourcePort, buffer, false);
                    }
                }

                Output.DHCPv6Output(packet.Message.MsgType, leaseIP, clientIP, clientMAC, clientHostName, message);
            }
        }