Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

458 lines
11 KiB

//============================================================================
// Copyright (c) 1995, Microsoft Corporation
//
// File: api.h
//
// History:
// Abolade Gbadegesin August 31, 1995 Created
//
// Declarations for BOOTP Relay Agent's interface to Router Manager
//============================================================================
#ifndef _API_H_
#define _API_H_
//
// enum: IPBOOTP_STATUS_CODE
//
// these codes are the possible values for the BOOTP's status.
// they are used in the field IPBOOTP_GLOBALS::IG_Status, and
// when each API or worker-function is entered, the status
// determines whether the function will proceed.
//
typedef enum _IPBOOTP_STATUS_CODE {
IPBOOTP_STATUS_STARTING = 100,
IPBOOTP_STATUS_RUNNING = 101,
IPBOOTP_STATUS_STOPPING = 102,
IPBOOTP_STATUS_STOPPED = 103
} IPBOOTP_STATUS_CODE, *PIPBOOTP_STATUS_CODE;
//
// struct: IPBOOTP_GLOBALS
//
// When more than one lock must be acquired, the order must be as follows;
// locks for fields listed on the same line should never be owned at once
// by any given thread:
//
// IG_IfTable.IT_RWL
// IG_RWL
// IG_RecvQueue IG_EventQueue
// IG_CS
//
typedef struct _IPBOOTP_GLOBALS {
CRITICAL_SECTION IG_CS;
IPBOOTP_STATUS_CODE IG_Status;
READ_WRITE_LOCK IG_RWL;
DWORD IG_TraceID;
DWORD IG_LoggingLevel;
HANDLE IG_LoggingHandle;
PIPBOOTP_GLOBAL_CONFIG IG_Config;
PIF_TABLE IG_IfTable;
PSUPPORT_FUNCTIONS IG_FunctionTable;
HANDLE IG_EventEvent;
PLOCKED_LIST IG_EventQueue;
HANDLE IG_GlobalHeap;
HANDLE IG_InputEvent;
HANDLE IG_InputEventHandle;
PLOCKED_LIST IG_RecvQueue;
LONG IG_RecvQueueSize;
LONG IG_ActivityCount;
HANDLE IG_ActivitySemaphore;
DWORD IG_DhcpInformServer;
#if DBG
DWORD IG_MibTraceID;
HANDLE IG_MibTimerHandle;
HANDLE IG_TimerQueueHandle;
#endif
} IPBOOTP_GLOBALS, *PIPBOOTP_GLOBALS;
//
// external declaration of the global IPBOOTP struct
//
extern IPBOOTP_GLOBALS ig;
//
// config struct size macros
//
#define GC_SIZEOF(gc) (sizeof(IPBOOTP_GLOBAL_CONFIG) + \
(gc)->GC_ServerCount * sizeof(DWORD))
#define IC_SIZEOF(ic) sizeof(IPBOOTP_IF_CONFIG)
//
// IP address conversion macro
//
#define INET_NTOA(addr) inet_ntoa( *(PIN_ADDR)&(addr) )
//
// memory allocation macros
//
#define BOOTP_ALLOC(size) HeapAlloc(ig.IG_GlobalHeap, 0, size)
#define BOOTP_FREE(ptr) HeapFree(ig.IG_GlobalHeap, 0, ptr)
//
// macro invoked when entering API and worker functions
// returns TRUE if API should continue, FALSE otherwise;
//
#define ENTER_BOOTP_API() EnterBootpAPI()
#define ENTER_BOOTP_WORKER() EnterBootpWorker()
//
// macro invoked when leaving API and worker functions
//
#define LEAVE_BOOTP_API() LeaveBootpWorker()
#define LEAVE_BOOTP_WORKER() LeaveBootpWorker()
//
// Event logging macros
//
#define LOGLEVEL ig.IG_LoggingLevel
#define LOGHANDLE ig.IG_LoggingHandle
#define LOGERR RouterLogError
#define LOGWARN RouterLogWarning
#define LOGINFO RouterLogInformation
#define LOGWARNDATA RouterLogWarningData
// Error logging
#define LOGERR0(msg,err) \
if (LOGLEVEL >= IPBOOTP_LOGGING_ERROR) \
LOGERR(LOGHANDLE,IPBOOTPLOG_ ## msg,0,NULL,(err))
#define LOGERR1(msg,a,err) \
if (LOGLEVEL >= IPBOOTP_LOGGING_ERROR) \
LOGERR(LOGHANDLE,IPBOOTPLOG_ ## msg,1,&(a),(err))
#define LOGERR2(msg,a,b,err) \
if (LOGLEVEL >= IPBOOTP_LOGGING_ERROR) { \
LPSTR _asz[2] = { (a), (b) }; \
LOGERR(LOGHANDLE,IPBOOTPLOG_ ## msg,2,_asz,(err)); \
}
#define LOGERR3(msg,a,b,c,err) \
if (LOGLEVEL >= IPBOOTP_LOGGING_ERROR) { \
LPSTR _asz[3] = { (a), (b), (c) }; \
LOGERR(LOGHANDLE,IPBOOTPLOG_ ## msg,3,_asz,(err)); \
}
#define LOGERR4(msg,a,b,c,d,err) \
if (LOGLEVEL >= IPBOOTP_LOGGING_ERROR) { \
LPSTR _asz[4] = { (a), (b), (c), (d) }; \
LOGERR(LOGHANDLE,IPBOOTPLOG_ ## msg,4,_asz,(err)); \
}
// Warning logging
#define LOGWARN0(msg,err) \
if (LOGLEVEL >= IPBOOTP_LOGGING_WARN) \
LOGWARN(LOGHANDLE,IPBOOTPLOG_ ## msg,0,NULL,(err))
#define LOGWARN1(msg,a,err) \
if (LOGLEVEL >= IPBOOTP_LOGGING_WARN) \
LOGWARN(LOGHANDLE,IPBOOTPLOG_ ## msg,1,&(a),(err))
#define LOGWARN2(msg,a,b,err) \
if (LOGLEVEL >= IPBOOTP_LOGGING_WARN) { \
LPSTR _asz[2] = { (a), (b) }; \
LOGWARN(LOGHANDLE,IPBOOTPLOG_ ## msg,2,_asz,(err)); \
}
#define LOGWARN3(msg,a,b,c,err) \
if (LOGLEVEL >= IPBOOTP_LOGGING_WARN) { \
LPSTR _asz[3] = { (a), (b), (c) }; \
LOGWARN(LOGHANDLE,IPBOOTPLOG_ ## msg,3,_asz,(err)); \
}
#define LOGWARN4(msg,a,b,c,d,err) \
if (LOGLEVEL >= IPBOOTP_LOGGING_WARN) { \
LPSTR _asz[4] = { (a), (b), (c), (d) }; \
LOGWARN(LOGHANDLE,IPBOOTPLOG_ ## msg,4,_asz,(err)); \
}
#define LOGWARNDATA2(msg,a,b,dw,buf) \
if (LOGLEVEL >= IPBOOTP_LOGGING_WARN) { \
LPSTR _asz[2] = { (a), (b) }; \
LOGWARNDATA(LOGHANDLE,IPBOOTPLOG_ ## msg,2,_asz,(dw),(buf)); \
}
// Information logging
#define LOGINFO0(msg,err) \
if (LOGLEVEL >= IPBOOTP_LOGGING_INFO) \
LOGINFO(LOGHANDLE,IPBOOTPLOG_ ## msg,0,NULL,(err))
#define LOGINFO1(msg,a,err) \
if (LOGLEVEL >= IPBOOTP_LOGGING_INFO) \
LOGINFO(LOGHANDLE,IPBOOTPLOG_ ## msg,1,&(a),(err))
#define LOGINFO2(msg,a,b,err) \
if (LOGLEVEL >= IPBOOTP_LOGGING_INFO) { \
LPSTR _asz[2] = { (a), (b) }; \
LOGINFO(LOGHANDLE,IPBOOTPLOG_ ## msg,2,_asz,(err)); \
}
#define LOGINFO3(msg,a,b,c,err) \
if (LOGLEVEL >= IPBOOTP_LOGGING_INFO) { \
LPSTR _asz[3] = { (a), (b), (c) }; \
LOGINFO(LOGHANDLE,IPBOOTPLOG_ ## msg,3,_asz,(err)); \
}
#define LOGINFO4(msg,a,b,c,d,err) \
if (LOGLEVEL >= IPBOOTP_LOGGING_INFO) { \
LPSTR _asz[4] = { (a), (b), (c), (d) }; \
LOGINFO(LOGHANDLE,IPBOOTPLOG_ ## msg,4,_asz,(err)); \
}
//
// constants and macros used for tracing
//
#define IPBOOTP_TRACE_ANY ((DWORD)0xffff0000 | TRACE_USE_MASK)
#define IPBOOTP_TRACE_ENTER ((DWORD)0x00010000 | TRACE_USE_MASK)
#define IPBOOTP_TRACE_LEAVE ((DWORD)0x00020000 | TRACE_USE_MASK)
#define IPBOOTP_TRACE_IF ((DWORD)0x00040000 | TRACE_USE_MASK)
#define IPBOOTP_TRACE_SEND ((DWORD)0x00080000 | TRACE_USE_MASK)
#define IPBOOTP_TRACE_RECEIVE ((DWORD)0x00100000 | TRACE_USE_MASK)
#define IPBOOTP_TRACE_CONFIG ((DWORD)0x00200000 | TRACE_USE_MASK)
#define IPBOOTP_TRACE_REQUEST ((DWORD)0x00400000 | TRACE_USE_MASK)
#define IPBOOTP_TRACE_REPLY ((DWORD)0x00800000 | TRACE_USE_MASK)
#define IPBOOTP_TRACE_START ((DWORD)0x01000000 | TRACE_USE_MASK)
#define IPBOOTP_TRACE_STOP ((DWORD)0x02000000 | TRACE_USE_MASK)
#define TRACEID ig.IG_TraceID
//
// macros used to generate output; the first argument indicates the
// level of tracing with which the output is associated
//
#define TRACE0(l,a) \
if (TRACEID != INVALID_TRACEID) TracePrintfEx(TRACEID, IPBOOTP_TRACE_ ## l, a)
#define TRACE1(l,a,b) \
if (TRACEID != INVALID_TRACEID) TracePrintfEx(TRACEID, IPBOOTP_TRACE_ ## l, a, b)
#define TRACE2(l,a,b,c) \
if (TRACEID != INVALID_TRACEID) TracePrintfEx(TRACEID, IPBOOTP_TRACE_ ## l, a, b, c)
#define TRACE3(l,a,b,c,d) \
if (TRACEID != INVALID_TRACEID) TracePrintfEx(TRACEID, IPBOOTP_TRACE_ ## l, a, b, c, d)
#define TRACE4(l,a,b,c,d,e) \
if (TRACEID != INVALID_TRACEID) TracePrintfEx(TRACEID, IPBOOTP_TRACE_ ## l, a, b, c, d, e)
#define TRACE5(l,a,b,c,d,e,f) \
if (TRACEID != INVALID_TRACEID) TracePrintfEx(TRACEID, IPBOOTP_TRACE_ ## l, a, b, c, d, e, f)
//
// function declarations for router manager interface:
//
DWORD
APIENTRY
RegisterProtocol(
IN OUT PMPR_ROUTING_CHARACTERISTICS pRoutingChar,
IN OUT PMPR_SERVICE_CHARACTERISTICS pServiceChar
);
DWORD
WINAPI
StartProtocol (
HANDLE NotificationEvent,
SUPPORT_FUNCTIONS *SupportFunctions,
LPVOID GlobalInfo,
ULONG StructureVersion,
ULONG StructureSize,
ULONG StructureCount
);
DWORD
WINAPI
StartComplete (
VOID
);
DWORD
APIENTRY
StopProtocol(
VOID
);
DWORD WINAPI
GetGlobalInfo (
PVOID OutGlobalInfo,
PULONG GlobalInfoSize,
PULONG StructureVersion,
PULONG StructureSize,
PULONG StructureCount
);
DWORD WINAPI
SetGlobalInfo (
PVOID GlobalInfo,
ULONG StructureVersion,
ULONG StructureSize,
ULONG StructureCount
);
DWORD WINAPI
AddInterface (
PWCHAR pwszInterfaceName,
ULONG InterfaceIndex,
NET_INTERFACE_TYPE InterfaceType,
DWORD MediaType,
WORD AccessType,
WORD ConnectionType,
PVOID InterfaceInfo,
ULONG StructureVersion,
ULONG StructureSize,
ULONG StructureCount
);
DWORD
APIENTRY
DeleteInterface(
IN DWORD dwIndex
);
DWORD
APIENTRY
GetEventMessage(
OUT ROUTING_PROTOCOL_EVENTS *pEvent,
OUT MESSAGE *pResult
);
DWORD WINAPI
GetInterfaceConfigInfo (
ULONG InterfaceIndex,
PVOID OutInterfaceInfo,
PULONG InterfaceInfoSize,
PULONG StructureVersion,
PULONG StructureSize,
PULONG StructureCount
);
DWORD WINAPI
SetInterfaceConfigInfo (
ULONG InterfaceIndex,
PVOID InterfaceInfo,
ULONG StructureVersion,
ULONG StructureSize,
ULONG StructureCount
);
DWORD WINAPI
InterfaceStatus(
ULONG InterfaceIndex,
BOOL InterfaceActive,
DWORD StatusType,
PVOID StatusInfo
);
DWORD
APIENTRY
MibCreate(
IN DWORD dwInputSize,
IN PVOID pInputData
);
DWORD
APIENTRY
MibDelete(
IN DWORD dwInputSize,
IN PVOID pInputData
);
DWORD
APIENTRY
MibGet(
IN DWORD dwInputSize,
IN PVOID pInputData,
IN OUT PDWORD pdwOutputSize,
OUT PVOID pOutputData
);
DWORD
APIENTRY
MibSet(
IN DWORD dwInputSize,
IN PVOID pInputData
);
DWORD
APIENTRY
MibGetFirst(
IN DWORD dwInputSize,
IN PVOID pInputData,
IN OUT PDWORD pdwOutputSize,
OUT PVOID pOutputData
);
DWORD
APIENTRY
MibGetNext(
IN DWORD dwInputSize,
IN PVOID pInputData,
IN OUT PDWORD pdwOutputSize,
OUT PVOID pOutputData
);
DWORD
InputThread(
PVOID pvParam
);
DWORD
UpdateArpCache(
DWORD dwIfIndex,
DWORD dwAddress,
PBYTE pbMacAddr,
DWORD dwMacAddrLength,
BOOL bAddEntry,
SUPPORT_FUNCTIONS *pFunctions
);
DWORD
QueueBootpWorker(
WORKERFUNCTION pWorker,
PVOID pContext
);
BOOL
EnterBootpWorker(
);
VOID
LeaveBootpWorker(
);
BOOL
EnterBootpAPI(
);
#endif // _API_H_