459 lines
11 KiB
C
459 lines
11 KiB
C
//============================================================================
|
|
// 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_
|
|
|