DEFS.H

/*++ 

Copyright (c) 1997 Microsoft Corporation

Module Name:

sample\ip\api.c

Abstract:
Functions exported by the Sample Routing Protocol DLL

Revision History:


--*/

#include "logtrdef.h"


#define PROTOCOL_STATE_STOPPED 0
#define PROTOCOL_STATE_STOPPING 1
#define PROTOCOL_STATE_RUNNING 2

#define NUM_STATES 3

#define BINDING_DOWN 0
#define BINDING_UP 1

#define QUERY_TYPE_GET 0
#define QUERY_TYPE_GET_NEXT 1
#define QUERY_TYPE_GET_FIRST 2
#define QUERY_TYPE_SET 3
#define QUERY_TYPE_CREATE 4
#define QUERY_TYPE_DELETE 5

#define NUM_WAIT_EVENTS 3

//
// Define this to be your compiler's ASSERTs
//

#define ASSERT( exp )

//
// VOID
// InitializeListHead(
// PLIST_ENTRY ListHead
// );
//

#define InitializeListHead(ListHead) (\
(ListHead)->Flink = (ListHead)->Blink = (ListHead))

//
// BOOLEAN
// IsListEmpty(
// PLIST_ENTRY ListHead
// );
//

#define IsListEmpty(ListHead) \
((ListHead)->Flink == (ListHead))

//
// PLIST_ENTRY
// RemoveHeadList(
// PLIST_ENTRY ListHead
// );
//

#define RemoveHeadList(ListHead) \
(ListHead)->Flink;\
{RemoveEntryList((ListHead)->Flink)}

//
// PLIST_ENTRY
// RemoveTailList(
// PLIST_ENTRY ListHead
// );
//

#define RemoveTailList(ListHead) \
(ListHead)->Blink;\
{RemoveEntryList((ListHead)->Blink)}

//
// VOID
// RemoveEntryList(
// PLIST_ENTRY Entry
// );
//

#define RemoveEntryList(Entry) {\
PLIST_ENTRY _EX_Blink;\
PLIST_ENTRY _EX_Flink;\
_EX_Flink = (Entry)->Flink;\
_EX_Blink = (Entry)->Blink;\
_EX_Blink->Flink = _EX_Flink;\
_EX_Flink->Blink = _EX_Blink;\
}

//
// VOID
// InsertTailList(
// PLIST_ENTRY ListHead,
// PLIST_ENTRY Entry
// );
//

#define InsertTailList(ListHead,Entry) {\
PLIST_ENTRY _EX_Blink;\
PLIST_ENTRY _EX_ListHead;\
_EX_ListHead = (ListHead);\
_EX_Blink = _EX_ListHead->Blink;\
(Entry)->Flink = _EX_ListHead;\
(Entry)->Blink = _EX_Blink;\
_EX_Blink->Flink = (Entry);\
_EX_ListHead->Blink = (Entry);\
}

//
// VOID
// InsertHeadList(
// PLIST_ENTRY ListHead,
// PLIST_ENTRY Entry
// );
//

#define InsertHeadList(ListHead,Entry) {\
PLIST_ENTRY _EX_Flink;\
PLIST_ENTRY _EX_ListHead;\
_EX_ListHead = (ListHead);\
_EX_Flink = _EX_ListHead->Flink;\
(Entry)->Flink = _EX_Flink;\
(Entry)->Blink = _EX_ListHead;\
_EX_Flink->Blink = (Entry);\
_EX_ListHead->Flink = (Entry);\
}

//
// Macros called each time an api is called and exited. This is to
// facilitate StopProtocol() functionality.
//

#define EnterProtocolApi() \
{ \
EnterCriticalSection(&g_csProtocolStateLock); \
\
if(g_dwProtocolState == PROTOCOL_STATE_RUNNING) \
{ \
g_dwProtocolRefCount++; \
LeaveCriticalSection(&g_csProtocolStateLock); \
} \
else \
{ \
LeaveCriticalSection(&g_csProtocolStateLock); \
return ERROR_CAN_NOT_COMPLETE; \
} \
}

#define ExitProtocolApi() \
{ \
EnterCriticalSection(&g_csProtocolStateLock); \
g_dwProtocolRefCount++; \
LeaveCriticalSection(&g_csProtocolStateLock); \
}

#define PRINT_ADDRESS(x) \
((x)&0x000000FF),(((x)&0x0000FF00)>>8),(((x)&0x00FF0000)>>16),(((x)&0xFF000000)>>24)

//
// VOID
// PrintRoute(PRTM_IP_ROUTE pRoute)
//

#define PrintRoute(FL,pRoute) \
{ \
Trace4(FL, \
"Dest: %d.%d.%d.%d(%d.%d.%d.%d) Nexthop: %d.%d.%d.%d(%d.%d.%d.%d)", \
PRINT_ADDRESS((pRoute)->RR_Network.N_NetNumber), \
PRINT_ADDRESS((pRoute)->RR_Network.N_NetMask), \
PRINT_ADDRESS((pRoute)->RR_NextHopAddress.N_NetNumber), \
PRINT_ADDRESS((pRoute)->RR_NextHopAddress.N_NetMask)); \
Trace5(FL,"I/F: %d Proto: %d Metric: %d Priority: %d Validity: %s.\n", \
(pRoute)->RR_InterfaceID, \
(pRoute)->RR_RoutingProtocol, \
(pRoute)->RR_FamilySpecificData.FSD_Metric, \
(pRoute)->RR_FamilySpecificData.FSD_Priority, \
(IsRouteValid((pRoute)))?"TRUE":"FALSE"); \
}