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); } }