Example #1
0
        private static uint HandleAddressOfferHook(IntPtr Packet, uint PacketSize, uint ControlCode, uint IpAddress, uint AltAddress, uint AddrType, uint LeaseTime, IntPtr Reserved, IntPtr PktContext)
        {
            var stopPropagation = false;

            var packet        = new DhcpServerPacket(Packet, (int)PacketSize);
            var controlCode   = (OfferAddressControlCodes)ControlCode;
            var serverAddress = DhcpServerIpAddress.FromNative(IpAddress);
            var leaseAddress  = DhcpServerIpAddress.FromNative(AltAddress);
            var addressType   = (OfferAddressTypes)AddrType;
            var leaseTime     = new TimeSpan(LeaseTime * 10_000_000L);

            foreach (var consumer in Consumers)
            {
                if (consumer.SupportFlags.HasFlag(CalloutConsumerSupportFlags.AddressOffer))
                {
                    try
                    {
                        consumer.Proxy.AddressOffer(packet, controlCode, serverAddress, leaseAddress, addressType, leaseTime, ref stopPropagation);
                    }
                    catch (Win32Exception ex)
                    {
                        return((uint)ex.NativeErrorCode);
                    }
                    catch (Exception)
                    {
                        return(0x1U); //ERROR_INVALID_FUNCTION
                    }

                    if (stopPropagation)
                    {
                        return(ERROR_SUCCESS);
                    }
                }
            }

            // chain
            if (!stopPropagation && ChainTable.DhcpAddressOfferHook != null)
            {
                return(ChainTable.DhcpAddressOfferHook(Packet, PacketSize, ControlCode, IpAddress, AltAddress, AddrType, LeaseTime, Reserved, PktContext));
            }

            return(ERROR_SUCCESS);
        }
Example #2
0
        private static uint HandleAddressDelHook(IntPtr Packet, uint PacketSize, uint ControlCode, uint IpAddress, uint AltAddress, IntPtr Reserved, IntPtr PktContext)
        {
            var stopPropagation = false;

            var packet        = new DhcpServerPacket(Packet, (int)PacketSize);
            var controlCode   = (AddressDeleteControlCodes)ControlCode;
            var serverAddress = DhcpServerIpAddress.FromNative(IpAddress);
            var leaseAddress  = DhcpServerIpAddress.FromNative(AltAddress);

            foreach (var consumer in Consumers)
            {
                if (consumer.SupportFlags.HasFlag(CalloutConsumerSupportFlags.AddressDelete))
                {
                    try
                    {
                        consumer.Proxy.AddressDelete(packet, controlCode, serverAddress, leaseAddress, ref stopPropagation);
                    }
                    catch (Win32Exception ex)
                    {
                        return((uint)ex.NativeErrorCode);
                    }
                    catch (Exception)
                    {
                        return(0x1U); //ERROR_INVALID_FUNCTION
                    }

                    // stop propagation if instructed
                    if (stopPropagation)
                    {
                        return(ERROR_SUCCESS);
                    }
                }
            }

            // chain
            if (!stopPropagation && ChainTable.DhcpAddressDelHook != null)
            {
                return(ChainTable.DhcpAddressDelHook(Packet, PacketSize, ControlCode, IpAddress, AltAddress, Reserved, PktContext));
            }

            return(ERROR_SUCCESS);
        }
Example #3
0
        private static uint HandleHandleOptionsHook(IntPtr Packet, uint PacketSize, IntPtr Reserved, IntPtr PktContext, IntPtr ServerOptions)
        {
            var stopPropagation = false;

            var packet        = new DhcpServerPacket(Packet, (int)PacketSize);
            var serverOptions = new DhcpServerPacketOptions(ServerOptions);

            foreach (var consumer in Consumers)
            {
                if (consumer.SupportFlags.HasFlag(CalloutConsumerSupportFlags.HandleOptions))
                {
                    try
                    {
                        consumer.Proxy.HandleOptions(packet, serverOptions, ref stopPropagation);
                    }
                    catch (Win32Exception ex)
                    {
                        return((uint)ex.NativeErrorCode);
                    }
                    catch (Exception)
                    {
                        return(0x1U); //ERROR_INVALID_FUNCTION
                    }

                    // stop propagation if instructed
                    if (stopPropagation)
                    {
                        return(ERROR_SUCCESS);
                    }
                }
            }

            // chain
            if (!stopPropagation && ChainTable.DhcpHandleOptionsHook != null)
            {
                return(ChainTable.DhcpHandleOptionsHook(Packet, PacketSize, Reserved, PktContext, ServerOptions));
            }

            return(ERROR_SUCCESS);
        }