/*++ Copyright (c) 1998, Microsoft Corporation Module Name: dhcpif.h Abstract: This module contains declarations for the DHCP allocator's interface management. Author: Abolade Gbadegesin (aboladeg) 4-Mar-1998 Revision History: --*/ #ifndef _NATHLP_DHCPIF_H_ #define _NATHLP_DHCPIF_H_ // // Enumeration: DHCP_INTERFACE_TYPE // 4 Types of Interfaces possible: // (1) Private // (2) Boundary // (3) Firewalled // (4) Boundary + Firewalled // DHCP should be active only on the Private Interface // (A Public interface is simply a non-Private interface.) // typedef enum { DhcpInterfaceInvalid, DhcpInterfacePrivate, DhcpInterfaceBoundary, DhcpInterfaceFirewalled, DhcpInterfaceBoundaryFirewalled } DHCP_INTERFACE_TYPE; // // Structure: DHCP_BINDING // // This structure holds information used for I/O on a logical network. // Each interface's 'BindingArray' contains an entry for each binding-entry // supplied during 'BindInterface'. // The 'TimerPending' field is set when a receive-attempt fails on an interface // and a timer is queued to reattempt the receive later. // typedef struct _DHCP_BINDING { ULONG Address; ULONG Mask; SOCKET Socket; SOCKET ClientSocket; BOOLEAN TimerPending; } DHCP_BINDING, *PDHCP_BINDING; // // Structure: DHCP_INTERFACE // // This structure holds operational information for an interface. // // Each interface is inserted into the list of DHCP interfaces, // sorted by 'Index'. // // Synchronization on an interface makes use of an interface-list lock // ('DhcpInterfaceLock'), a per-interface reference count, and a per-interface // critical-section: // // Acquiring a reference to an interface guarantees the interface's existence; // acquiring the interface's lock guarantees the interface's consistency. // // To acquire a reference, first acquire the interface-list lock; // to traverse the interface-list, first acquire the interface-list lock. // // An interface's lock can only be acquired if // (a) a reference to the interface has been acquired, or // (b) the interface-list lock is currently held. // Note that holding the list lock alone does not guarantee consistency. // // Fields marked read-only can be read so long as the interface is referenced. // typedef struct _DHCP_INTERFACE { LIST_ENTRY Link; CRITICAL_SECTION Lock; ULONG ReferenceCount; ULONG Index; NET_INTERFACE_TYPE Type; DHCP_INTERFACE_TYPE DhcpInterfaceType; IP_AUTO_DHCP_INTERFACE_INFO Info; ULONG Flags; ULONG BindingCount; PDHCP_BINDING BindingArray; } DHCP_INTERFACE, *PDHCP_INTERFACE; // // Flags // #define DHCP_INTERFACE_FLAG_DELETED 0x80000000 #define DHCP_INTERFACE_DELETED(i) \ ((i)->Flags & DHCP_INTERFACE_FLAG_DELETED) #define DHCP_INTERFACE_FLAG_BOUND 0x40000000 #define DHCP_INTERFACE_BOUND(i) \ ((i)->Flags & DHCP_INTERFACE_FLAG_BOUND) #define DHCP_INTERFACE_FLAG_ENABLED 0x20000000 #define DHCP_INTERFACE_ENABLED(i) \ ((i)->Flags & DHCP_INTERFACE_FLAG_ENABLED) #define DHCP_INTERFACE_FLAG_CONFIGURED 0x10000000 #define DHCP_INTERFACE_CONFIGURED(i) \ ((i)->Flags & DHCP_INTERFACE_FLAG_CONFIGURED) #define DHCP_INTERFACE_FLAG_NAT_NONBOUNDARY 0x08000000 #define DHCP_INTERFACE_NAT_NONBOUNDARY(i) \ ((i)->Flags & DHCP_INTERFACE_FLAG_NAT_NONBOUNDARY) #define DHCP_INTERFACE_ACTIVE(i) \ (((i)->Flags & (DHCP_INTERFACE_FLAG_BOUND|DHCP_INTERFACE_FLAG_ENABLED)) \ == (DHCP_INTERFACE_FLAG_BOUND|DHCP_INTERFACE_FLAG_ENABLED)) #define DHCP_INTERFACE_ADMIN_DISABLED(i) \ ((i)->Flags & IP_AUTO_DHCP_INTERFACE_FLAG_DISABLED) // // Synchronization // #define DHCP_REFERENCE_INTERFACE(i) \ REFERENCE_OBJECT(i, DHCP_INTERFACE_DELETED) #define DHCP_DEREFERENCE_INTERFACE(i) \ DEREFERENCE_OBJECT(i, DhcpCleanupInterface) // // GLOBAL DATA DECLARATIONS // extern LIST_ENTRY DhcpInterfaceList; extern CRITICAL_SECTION DhcpInterfaceLock; // // FUNCTION DECLARATIONS // ULONG DhcpActivateInterface( PDHCP_INTERFACE Interfacep ); ULONG DhcpBindInterface( ULONG Index, PIP_ADAPTER_BINDING_INFO BindingInfo ); VOID DhcpCleanupInterface( PDHCP_INTERFACE Interfacep ); ULONG DhcpConfigureInterface( ULONG Index, PIP_AUTO_DHCP_INTERFACE_INFO InterfaceInfo ); ULONG DhcpCreateInterface( ULONG Index, NET_INTERFACE_TYPE Type, PIP_AUTO_DHCP_INTERFACE_INFO InterfaceInfo, PDHCP_INTERFACE* InterfaceCreated ); VOID DhcpDeactivateInterface( PDHCP_INTERFACE Interfacep ); VOID DhcpDeferReadInterface( PDHCP_INTERFACE Interfacep, SOCKET Socket ); ULONG DhcpDeleteInterface( ULONG Index ); ULONG DhcpDisableInterface( ULONG Index ); ULONG DhcpEnableInterface( ULONG Index ); ULONG DhcpInitializeInterfaceManagement( VOID ); BOOLEAN DhcpIsLocalHardwareAddress( PUCHAR HardwareAddress, ULONG HardwareAddressLength ); PDHCP_INTERFACE DhcpLookupInterface( ULONG Index, OUT PLIST_ENTRY* InsertionPoint OPTIONAL ); ULONG DhcpQueryInterface( ULONG Index, PVOID InterfaceInfo, PULONG InterfaceInfoSize ); VOID DhcpReactivateEveryInterface( VOID ); VOID DhcpShutdownInterfaceManagement( VOID ); VOID DhcpSignalNatInterface( ULONG Index, BOOLEAN Boundary ); ULONG DhcpUnbindInterface( ULONG Index ); ULONG DhcpGetPrivateInterfaceAddress( VOID ); #endif // _NATHLP_DHCPIF_H_