/*++

Copyright (c) 1994  Microsoft Corporation

Module Name:

    dhcpsrv.idl

Abstract:

    Contains the DHCP Server Service API.
    Also contains the RPC specific data structures for these API.

Author:

    Madan Appiah  (madana)  10-Sep-1993

Environment:

    User Mode - Win32 - MIDL

Revision History:

    Cheng Yang (t-cheny)  12-Jun-1996  superscope
    Cheng Yang (t-cheny)  17-Jul-1996  vendor specific information


Notes:

    Do not change this interface!!!  The stub code produced by this interface
    has been hand modified and checked in to fix bug #66798.  If you need to
    add new functions, create a v2 interface.  See #66798 for details.

--*/


//
// Interface Attributes
//

[
    uuid(6BFFD098-A112-3610-9833-46C3F874532D),
    version(1.0),
    pointer_default(unique)
]

//
// Interface Keyword
//

interface dhcpsrv


//
// Interface Body
//

{

import   "imports.idl";

//
// ---------------------------------------------------------------//
//


typedef [handle] LPWSTR DHCP_SRV_HANDLE;



//
// DHCP Server APIs
//

//
// Subnet APIs
//

DWORD
R_DhcpCreateSubnet(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in] DHCP_IP_ADDRESS SubnetAddress,
    [in, ref] LPDHCP_SUBNET_INFO SubnetInfo
    );

DWORD
R_DhcpSetSubnetInfo(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in] DHCP_IP_ADDRESS SubnetAddress,
    [in, ref] LPDHCP_SUBNET_INFO SubnetInfo
    );

DWORD
R_DhcpGetSubnetInfo(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in] DHCP_IP_ADDRESS SubnetAddress,
    [out] LPDHCP_SUBNET_INFO *SubnetInfo
    );

DWORD
R_DhcpEnumSubnets(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in, out] DHCP_RESUME_HANDLE *ResumeHandle,
    [in] DWORD PreferredMaximum,
    [out] LPDHCP_IP_ARRAY *EnumInfo,
    [out] DWORD *ElementsRead,
    [out] DWORD *ElementsTotal
    );

DWORD
R_DhcpAddSubnetElement(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in] DHCP_IP_ADDRESS SubnetAddress,
    [in, ref] LPDHCP_SUBNET_ELEMENT_DATA AddElementInfo
    );

DWORD
R_DhcpEnumSubnetElements(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in] DHCP_IP_ADDRESS SubnetAddress,
    [in] DHCP_SUBNET_ELEMENT_TYPE EnumElementType,
    [in, out] DHCP_RESUME_HANDLE *ResumeHandle,
    [in] DWORD PreferredMaximum,
    [out] LPDHCP_SUBNET_ELEMENT_INFO_ARRAY *EnumElementInfo,
    [out] DWORD *ElementsRead,
    [out] DWORD *ElementsTotal
    );

DWORD
R_DhcpRemoveSubnetElement(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in] DHCP_IP_ADDRESS SubnetAddress,
    [in, ref] LPDHCP_SUBNET_ELEMENT_DATA RemoveElementInfo,
    [in] DHCP_FORCE_FLAG ForceFlag
    );

DWORD
R_DhcpDeleteSubnet(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in] DHCP_IP_ADDRESS SubnetAddress,
    [in] DHCP_FORCE_FLAG ForceFlag
    );



//
// Option APIs
//

DWORD
R_DhcpCreateOption(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in] DHCP_OPTION_ID OptionID,
    [in, ref] LPDHCP_OPTION OptionInfo
    );

DWORD
R_DhcpSetOptionInfo(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in] DHCP_OPTION_ID OptionID,
    [in, ref] LPDHCP_OPTION OptionInfo
    );

DWORD
R_DhcpGetOptionInfo(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in] DHCP_OPTION_ID OptionID,
    [out] LPDHCP_OPTION *OptionInfo
    );

DWORD
R_DhcpRemoveOption(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in] DHCP_OPTION_ID OptionID
    );

DWORD
R_DhcpSetOptionValue(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in] DHCP_OPTION_ID OptionID,
    [in, ref] LPDHCP_OPTION_SCOPE_INFO ScopeInfo,
    [in, ref] LPDHCP_OPTION_DATA OptionValue
    );

DWORD
R_DhcpGetOptionValue(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in] DHCP_OPTION_ID OptionID,
    [in, ref] LPDHCP_OPTION_SCOPE_INFO ScopeInfo,
    [out] LPDHCP_OPTION_VALUE *OptionValue
    );


DWORD
R_DhcpEnumOptionValues(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in, ref] LPDHCP_OPTION_SCOPE_INFO ScopeInfo,
    [in, out] DHCP_RESUME_HANDLE *ResumeHandle,
    [in] DWORD PreferredMaximum,
    [out] LPDHCP_OPTION_VALUE_ARRAY *OptionValues,
    [out] DWORD *OptionsRead,
    [out] DWORD *OptionsTotal
    );

DWORD
R_DhcpRemoveOptionValue(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in] DHCP_OPTION_ID OptionID,
    [in, ref] LPDHCP_OPTION_SCOPE_INFO ScopeInfo
    );


//
// Client APIs
//

DWORD
R_DhcpCreateClientInfo(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in, ref] LPDHCP_CLIENT_INFO ClientInfo
    );

DWORD
R_DhcpSetClientInfo(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in, ref] LPDHCP_CLIENT_INFO ClientInfo
    );

DWORD
R_DhcpGetClientInfo(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in, ref] LPDHCP_SEARCH_INFO SearchInfo,
    [out] LPDHCP_CLIENT_INFO *ClientInfo
    );

DWORD
R_DhcpDeleteClientInfo(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in, ref] LPDHCP_SEARCH_INFO ClientInfo
    );

DWORD
R_DhcpEnumSubnetClients(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in] DHCP_IP_ADDRESS SubnetAddress,
    [in, out] DHCP_RESUME_HANDLE *ResumeHandle,
    [in] DWORD PreferredMaximum,
    [out] LPDHCP_CLIENT_INFO_ARRAY *ClientInfo,
    [out] DWORD *ClientsRead,
    [out] DWORD *ClientsTotal
    );

DWORD
R_DhcpGetClientOptions(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in] DHCP_IP_ADDRESS ClientIpAddress,
    [in] DHCP_IP_MASK ClientSubnetMask,
    [out] LPDHCP_OPTION_LIST *ClientOptions
    );

DWORD
R_DhcpGetMibInfo(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [out] LPDHCP_MIB_INFO *MibInfo
    );

DWORD
R_DhcpEnumOptions(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in, out] DHCP_RESUME_HANDLE  *ResumeHandle,
    [in] DWORD PreferredMaximum,
    [out] LPDHCP_OPTION_ARRAY *Options,
    [out] DWORD *OptionsRead,
    [out] DWORD *OptionsTotal
    );

DWORD
R_DhcpSetOptionValues(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in, ref] LPDHCP_OPTION_SCOPE_INFO ScopeInfo,
    [in, ref] LPDHCP_OPTION_VALUE_ARRAY OptionValues
    );

DWORD
R_DhcpServerSetConfig(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in] DWORD FieldsToSet,
    [in, ref] LPDHCP_SERVER_CONFIG_INFO ConfigInfo
    );

DWORD
R_DhcpServerGetConfig(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [out] LPDHCP_SERVER_CONFIG_INFO *ConfigInfo
    );

DWORD
R_DhcpScanDatabase(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in] DHCP_IP_ADDRESS SubnetAddress,
    [in] DWORD FixFlag,
    [out] LPDHCP_SCAN_LIST *ScanList
    );

DWORD
R_DhcpGetVersion(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [out] LPDWORD MajorVersion,
    [out] LPDWORD MinorVersion
    );




#ifdef VENDOR_SPECIFIC_OPTIONS_ENABLED

DWORD
R_DhcpSetOptionValueForVendor(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in] DHCP_OPTION_ID OptionID,
    [in, ref] LPDHCP_OPTION_SCOPE_INFO ScopeInfo,
    [in, ref] LPWSTR VendorName,
    [in, ref] LPDHCP_OPTION_DATA OptionValue
    );

DWORD
R_DhcpGetOptionValueForVendor(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in] DHCP_OPTION_ID OptionID,
    [in, ref] LPDHCP_OPTION_SCOPE_INFO ScopeInfo,
    [in, ref] LPWSTR VendorName,
    [out] LPDHCP_OPTION_VALUE *OptionValue
    );

#endif

//
// NT4 SP1 interface
//

//
// new subnet interface
//

DWORD
R_DhcpAddSubnetElementV4(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in] DHCP_IP_ADDRESS SubnetAddress,
    [in, ref] LPDHCP_SUBNET_ELEMENT_DATA_V4 AddElementInfo
    );

DWORD
R_DhcpEnumSubnetElementsV4(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in] DHCP_IP_ADDRESS SubnetAddress,
    [in] DHCP_SUBNET_ELEMENT_TYPE EnumElementType,
    [in, out] DHCP_RESUME_HANDLE *ResumeHandle,
    [in] DWORD PreferredMaximum,
    [out] LPDHCP_SUBNET_ELEMENT_INFO_ARRAY_V4 *EnumElementInfo,
    [out] DWORD *ElementsRead,
    [out] DWORD *ElementsTotal
    );


DWORD
R_DhcpRemoveSubnetElementV4(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in] DHCP_IP_ADDRESS SubnetAddress,
    [in, ref] LPDHCP_SUBNET_ELEMENT_DATA_V4 RemoveElementInfo,
    [in] DHCP_FORCE_FLAG ForceFlag
    );


//
// Client APIs
//

DWORD
R_DhcpCreateClientInfoV4(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in, ref] LPDHCP_CLIENT_INFO_V4 ClientInfo
    );

DWORD
R_DhcpSetClientInfoV4(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in, ref] LPDHCP_CLIENT_INFO_V4 ClientInfo
    );

DWORD
R_DhcpGetClientInfoV4(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in, ref] LPDHCP_SEARCH_INFO SearchInfo,
    [out] LPDHCP_CLIENT_INFO_V4 *ClientInfo
    );

DWORD
R_DhcpEnumSubnetClientsV4(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in] DHCP_IP_ADDRESS SubnetAddress,
    [in, out] DHCP_RESUME_HANDLE *ResumeHandle,
    [in] DWORD PreferredMaximum,
    [out] LPDHCP_CLIENT_INFO_ARRAY_V4 *ClientInfo,
    [out] DWORD *ClientsRead,
    [out] DWORD *ClientsTotal
    );



//
// Superscope support
//


DWORD
R_DhcpSetSuperScopeV4(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in] DHCP_IP_ADDRESS SubnetAddress,
    [in, unique, string] WCHAR *SuperScopeName,
    [in] BOOL ChangeExisting
    );

DWORD
R_DhcpGetSuperScopeInfoV4(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [out] LPDHCP_SUPER_SCOPE_TABLE *SuperScopeTable
    );

DWORD
R_DhcpDeleteSuperScopeV4(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in, ref, string] WCHAR *SuperScopeName
    );



//
// Global configuration
//


DWORD
R_DhcpServerSetConfigV4(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [in] DWORD FieldsToSet,
    [in, ref] LPDHCP_SERVER_CONFIG_INFO_V4 ConfigInfo
    );

DWORD
R_DhcpServerGetConfigV4(
    [in, unique, string] DHCP_SRV_HANDLE ServerIpAddress,
    [out] LPDHCP_SERVER_CONFIG_INFO_V4 *ConfigInfo
    );

}