windows-nt/Source/XPSP1/NT/net/dhcp/client/inc/options.h
2020-09-26 16:20:57 +08:00

195 lines
10 KiB
C

//================================================================================
// Copyright (C) Microsoft Corporation 1997.
// Author: RameshV
// Date: 09-Sep-97 06:20
// Description: Manages the class-id and options information
//================================================================================
#ifndef OPTIONS_H
#define OPTIONS_H
#define MAX_DATA_LEN 255 // atmost 255 bytes for an option
typedef struct _DHCP_CLASSES { // common pool of class names
LIST_ENTRY ClassList; // global list of classes
LPBYTE ClassName; // name of the class
DWORD ClassLen; // # of bytes in class name
DWORD RefCount; // # of references to this
} DHCP_CLASSES, *LPDHCP_CLASSES, *PDHCP_CLASSES;
typedef struct _DHCP_OPTION { // list of options
LIST_ENTRY OptionList; // the fwd/back ptrs
DWORD OptionId; // the option value
BOOL IsVendor; // is this vendor specific
LPBYTE ClassName; // the class of this option
DWORD ClassLen; // the length of above option
time_t ExpiryTime; // when this option expires
LPBYTE Data; // the data value for this option
DWORD DataLen; // the # of bytes of above
DWORD ServerId; // the server from which the option came
OPTION_VERSION OptionVer; // specifies the format of the options
} DHCP_OPTION , *LPDHCP_OPTION , *PDHCP_OPTION ;
typedef struct _DHCP_OPTION_DEF {
LIST_ENTRY OptionDefList; // list of option definitions
DWORD OptionId; // the option id
BOOL IsVendor; // is this vendor specific?
LPBYTE ClassName; // the class this belongs to
DWORD ClassLen; // the size of above in bytes
LPWSTR RegSendLoc; // where is the info about sending this out
LPWSTR RegSaveLoc; // where is this option going to be stored?
DWORD RegValueType; // as what value should this be stored?
} DHCP_OPTION_DEF, *LPDHCP_OPTION_DEF, *PDHCP_OPTION_DEF;
//================================================================================
// exported functions classes
//================================================================================
//--------------------------------------------------------------------------------
// In all of the following functions, ClassesList is unprotected within the fn.
// Caller has to take a lock on it.
//--------------------------------------------------------------------------------
LPBYTE // data bytes, or NULL (no mem)
DhcpAddClass( // add a new class
IN OUT PLIST_ENTRY ClassesList, // list to add to
IN LPBYTE Data, // input class name
IN DWORD Len // # of bytes of above
); // Add the new class into the list or bump up ref count if already there
DWORD // status (FILE_NOT_FOUND => no such class)
DhcpDelClass( // de-refernce a class
IN OUT PLIST_ENTRY ClassesList, // the list to delete off
IN LPBYTE Data, // the data ptr
IN DWORD Len // the # of bytes of above
); // decrease refcount in the list and if becomes zero, free the struct
VOID // always succeeds
DhcpFreeAllClasses( // free each elt of the list
IN OUT PLIST_ENTRY ClassesList // input list of classes
); // free every class in the list
//--------------------------------------------------------------------------------
// In all the following functions, OptionsList is unprotected within the fn.
// Caller has to take a lock on it.
//--------------------------------------------------------------------------------
PDHCP_OPTION // the reqd structure or NULL
DhcpFindOption( // find a specific option
IN OUT PLIST_ENTRY OptionsList, // the list of options to search
IN DWORD OptionId, // the option id to search for
IN BOOL IsVendor, // is it vendor specific?
IN LPBYTE ClassName, // is there a class associated?
IN DWORD ClassLen, // # of bytes of above parameter
IN DWORD ServerId // match serverid also if not 0
); // search for the required option in the list, return NULL if not found
DWORD // status or ERROR_FILE_NOT_FOUND
DhcpDelOption( // remove a particular option
IN PDHCP_OPTION Option2Delete // delete this option
); // delete an existing option in the list, and free up space used
DWORD // status
DhcpAddOption( // add a new option
IN OUT PLIST_ENTRY OptionsList, // list to add to
IN DWORD OptionId, // option id to add
IN BOOL IsVendor, // is it vendor specific?
IN LPBYTE ClassName, // what is the class?
IN DWORD ClassLen, // size of above in bytes
IN DWORD ServerId, // server which gave this option
IN LPBYTE Data, // data for this option
IN DWORD DataLen, // # of bytes of above
IN time_t ExpiryTime // when the option expires
); // replace or add new option to the list. fail if not enough memory
PDHCP_OPTION // pointer to the duplicated option
DhcpDuplicateOption( // creates a copy of the source option
IN PDHCP_OPTION SrcOption // source option
);
VOID // always succeeds
DhcpFreeAllOptions( // frees all the options
IN OUT PLIST_ENTRY OptionsList // input list of options
); // free every option in the list
time_t // 0 || time for next expiry (absolute)
DhcpGetExpiredOptions( // delete all expired options
IN OUT PLIST_ENTRY OptionsList, // list to search frm
OUT PLIST_ENTRY ExpiredOptions // o/p list of expired options
); // move expired options between lists and return timer. 0 => switch off timer.
//--------------------------------------------------------------------------------
// In all the following functions, OptionsDefList is unprotected. Caller has
// to take a lock on it.
//--------------------------------------------------------------------------------
DWORD // status
DhcpAddOptionDef( // add a new option definition
IN OUT PLIST_ENTRY OptionDefList, // input list of options to add to
IN DWORD OptionId, // option to add
IN BOOL IsVendor, // is it vendor specific
IN LPBYTE ClassName, // name of class it belongs to
IN DWORD ClassLen, // the size of above in bytes
IN LPWSTR RegSendLoc, // where to get info about sending this out
IN LPWSTR RegSaveLoc, // where to get info about saving this
IN DWORD ValueType // what is the type when saving it?
);
PDHCP_OPTION_DEF // NULL, or requested option def
DhcpFindOptionDef( // search for a particular option
IN PLIST_ENTRY OptionDefList, // list to search in
IN DWORD OptionId, // the option id to search for
IN BOOL IsVendor, // is it vendor specific
IN LPBYTE ClassName, // the class, if one exists
IN DWORD ClassLen // # of bytes of class name
);
DWORD // status
DhcpDelOptionDef( // delete a particular option def
IN PLIST_ENTRY OptionDefList, // list to delete from
IN DWORD OptionId, // the option id to delete
IN BOOL IsVendor, // is it vendor specific
IN LPBYTE ClassName, // the class, if one exists
IN DWORD ClassLen // # of bytes of class name
);
VOID
DhcpFreeAllOptionDefs( // free each element of a list
IN OUT PLIST_ENTRY OptionDefList, // the list to free
IN OUT PLIST_ENTRY ClassesList // classes to de-ref off
);
BOOL // TRUE==>found..
DhcpOptionsFindDomain( // find the domain name option values
IN OUT PDHCP_CONTEXT DhcpContext, // for this adapter
OUT LPBYTE *Data, // fill this ptr up
OUT LPDWORD DataLen
);
BOOL
DhcpFindDwordOption(
IN PDHCP_CONTEXT DhcpContext,
IN ULONG OptId,
IN BOOL fVendor,
OUT PDWORD Result
);
BOOL
DhcpFindByteOption(
IN PDHCP_CONTEXT DhcpContext,
IN ULONG OptId,
IN BOOL fVendor,
OUT PBYTE Result
);
BOOL
RetreiveGatewaysList(
IN PDHCP_CONTEXT DhcpContext,
IN OUT ULONG *nGateways,
IN OUT DHCP_IP_ADDRESS UNALIGNED **Gateways
);
#endif OPTIONS_H