/**********************************************************************/
/**			  Microsoft Windows/NT			     **/
/**                Copyright(c) Microsoft Corp., 1994                **/
/**********************************************************************/

/*
    dhcpinfo.h

    Dhcp information APIs and structures



    FILE HISTORY:
        Johnl       15-Dec-1993     Created

*/

#ifndef _DHCPINFO_H_
#define _DHCPINFO_H_

//
//  DhcpQueryOption - Retrieves a DHCP option for a specific IP address
//
//  IpAddr - Address in network order (like the IP driver returns) to
//      retrieve for or 0xffffffff to take the first matching option
//      found on any ip address.
//
//  OptionId - DHCP option ID to retrieve.  If this is a vendor specific
//      option, then the high word contains the vendor specific option
//      (low word will contain OPTION_VENDOR_SPEC_INFO - 43)
//
//  pBuff - Buffer to receive option
//
//  pSize - Input and output size of pBuff
//
//  Returns:
//      TDI_BUFFER_TOO_SMALL if no data was copied, pSize will contain
//         the required buffer size
//      TDI_BUFFER_OVERFLOW - Some data copied, pSize contains amount copied
//      TDI_INVALID_PARAMETER - Ip address not found, option not found etc.
//

TDI_STATUS DhcpQueryOption( ULONG     IpAddr,
                            UINT      OptionId,
                            PVOID     pBuff,
                            UINT *    pSize ) ;


//-------------------------------------------------------------------------
//
//  Set info stuff
//

typedef VOID (*PFNDhcpNotify)( PVOID pContext,
                               ULONG OldIpAddress,
                               ULONG NewIpAddress,
                               ULONG NewMask ) ;

typedef struct
{
    PFNDhcpNotify   dn_pfnNotifyRoutine ;
    PVOID           dn_pContext ;
} DHCPNotify, *PDHCPNotify ;


//
//  Sets a notify handler that is called when an IP address is about to change.
//  Addresses can change from a valid address to another, from a valid address
//  to zero (invalid) or from zero to a valid address.
//
//  The client passes in the IP Address they are interested in along with a
//  DHCPNotify structure.  If the client wants to be notified of any IP
//  address change, then pass zero for the IP address.  If the address is
//  not DHCPed, then TDI_BAD_ADDR will be returned.
//
//  If an IP address changes to a new address, the client will be notified when
//  the new address changes (i.e., address changes are tracked).
//
//  There currently is no way to track addresses that come up as zero (i.e.,
//  DHCP couldn't get a lease) except by the global notification method
//  (zero IP address).
//
#define DHCP_SET_NOTIFY_HANDLER                1
#define DHCP_PPP_PARAMETER_SET                2

typedef struct _NIC_INFO {
               ULONG IfIndex;            
               ULONG SubnetMask;
               ULONG OldIpAddress;
               } NIC_INFO, *PNIC_INFO;
//
//  Note: IpAddr should be in network order (like what the IP driver returns)
//

TDI_STATUS DhcpSetInfo( UINT      Type,
                        ULONG     IpAddr,
                        PVOID     pBuff,
                        UINT      Size ) ;

TDI_STATUS DhcpSetInfoR( UINT      Type,
                        ULONG     IpAddr,
                        PNIC_INFO pNicInfo,
                        PVOID     pBuff,
                        UINT      Size ) ;

TDI_STATUS DhcpSetInfoC( UINT      Type,
                        ULONG     IpAddr,
                        PNIC_INFO pNicInfo,
                        PVOID     pBuff,
                        UINT      Size ) ;

//
// define PPP parameter set info buffer structure.
//

typedef struct _PPP_SET_INFO {
    HARDWARE_ADDRESS HardwareAddress;
    DWORD ParameterOpCode;
    DWORD ParameterLength;
    BYTE RawParameter[1];
}  PPP_SET_INFO, *LP_PPP_SET_INFO;

#endif // _DHCPINFO_H_