mirror of https://github.com/tongzx/nt5src
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.
195 lines
6.2 KiB
195 lines
6.2 KiB
/*++
|
|
|
|
Copyright (c) 1997 - 98, Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
rtmchng.h
|
|
|
|
Abstract:
|
|
|
|
Contains defintions related to change
|
|
notification registrations to entities
|
|
registered with the RTM.
|
|
|
|
Author:
|
|
|
|
Chaitanya Kodeboyina (chaitk) 10-Sep-1998
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#ifndef __ROUTING_RTMCHNG_H__
|
|
#define __ROUTING_RTMCHNG_H__
|
|
|
|
//
|
|
// Constants used in change notification processing
|
|
//
|
|
|
|
#define TIMER_CALLBACK_FREQUENCY 1000
|
|
|
|
#define MAX_DESTS_TO_PROCESS_ONCE 16
|
|
|
|
//
|
|
// Change type info must be consistent
|
|
// with this information in rtmv2.h
|
|
//
|
|
|
|
// Change types that we support
|
|
|
|
#define RTM_CHANGE_TYPE_ID_ALL 0
|
|
#define RTM_CHANGE_TYPE_ID_BEST 1
|
|
#define RTM_CHANGE_TYPE_ID_FORWARDING 2
|
|
|
|
#define RTM_CHANGE_TYPES_MASK 0x0007
|
|
|
|
//
|
|
// Queue data structure used below
|
|
//
|
|
|
|
typedef struct _QUEUE
|
|
{
|
|
UINT Front;
|
|
UINT Rear;
|
|
UINT Size;
|
|
PVOID Array[1];
|
|
} QUEUE, *PQUEUE;
|
|
|
|
|
|
//
|
|
// Change Notification Info Block
|
|
//
|
|
|
|
typedef struct _NOTIFY_INFO
|
|
{
|
|
OPEN_HEADER NotifyHeader; // Signature, Type and Reference Count
|
|
|
|
PENTITY_INFO OwningEntity; // Entity that opened this notification
|
|
|
|
RTM_VIEW_SET TargetViews; // Views that we are interested in
|
|
|
|
UINT NumberOfViews; // Num. of views we are interested in
|
|
|
|
RTM_NOTIFY_FLAGS ChangeTypes; // Change types we are interested in
|
|
|
|
INT CNIndex; // Index for this CN registration
|
|
|
|
CRITICAL_SECTION NotifyLock; // Lock that serializes ops on CN
|
|
|
|
HANDLE NotifyContext; // Context for the new changes callback
|
|
|
|
QUEUE NotifyDests; // Dests to be notified to this CN
|
|
}
|
|
NOTIFY_INFO, *PNOTIFY_INFO;
|
|
|
|
|
|
|
|
//
|
|
// Macros for testing, setting and reseting CN related bits
|
|
//
|
|
|
|
#define IS_BIT_SET(Value, Bit) (Value & (1 << (Bit)))
|
|
|
|
#define SET_BIT(Value, Bit) (Value |= (1 << (Bit)))
|
|
|
|
#define RESET_BIT(Value, Bit) (Value &= ~(1 << (Bit)))
|
|
|
|
#define LOCKED_SET_BIT(Value, BitIndex) \
|
|
InterlockedExchangeAdd((PLONG) &(Value), +(1 << (BitIndex)))
|
|
|
|
#define LOCKED_RESET_BIT(Value, BitIndex) \
|
|
InterlockedExchangeAdd((PLONG) &(Value), -(1 << (BitIndex)))
|
|
|
|
//
|
|
// Macros for acquiring various locks defined in this file
|
|
//
|
|
|
|
#define ACQUIRE_CHANGE_NOTIFICATION_LOCK(Notification) \
|
|
ACQUIRE_LOCK(&Notification->NotifyLock)
|
|
|
|
#define RELEASE_CHANGE_NOTIFICATION_LOCK(Notification) \
|
|
RELEASE_LOCK(&Notification->NotifyLock)
|
|
|
|
//
|
|
// Other misc macros
|
|
//
|
|
|
|
#define CHANGE_LIST_TO_INSERT(Dest) \
|
|
(UINT)(((*(ULONG *)&Dest->DestAddress.AddrBits) >> 8) \
|
|
% NUM_CHANGED_DEST_LISTS) \
|
|
|
|
//
|
|
// Queue manipulation macros
|
|
//
|
|
|
|
#define InitializeQueue(Q, N) \
|
|
(Q)->Front = 0; \
|
|
(Q)->Rear = 0; \
|
|
(Q)->Size = (N); \
|
|
|
|
#define IsQueueEmpty(Q) \
|
|
((Q)->Front == (Q)->Rear) \
|
|
|
|
#define EnqueueItem(Q, I, S) \
|
|
{ \
|
|
UINT _R_; \
|
|
\
|
|
_R_ = ((Q)->Rear + 1) % (Q)->Size; \
|
|
\
|
|
if ((Q)->Front == (_R_)) \
|
|
{ \
|
|
(S) = TRUE; \
|
|
} \
|
|
else \
|
|
{ \
|
|
(Q)->Rear = (_R_); \
|
|
\
|
|
(Q)->Array[(Q)->Rear] = I; \
|
|
\
|
|
(S) = FALSE; \
|
|
} \
|
|
} \
|
|
|
|
#define DequeueItem(Q, I) \
|
|
\
|
|
if ((Q)->Front == (Q)->Rear) \
|
|
{ \
|
|
(*(I)) = NULL; \
|
|
} \
|
|
else \
|
|
{ \
|
|
((Q)->Front)++; \
|
|
\
|
|
((Q)->Front) %= (Q)->Size; \
|
|
\
|
|
(*(I)) = (Q)->Array[(Q)->Front]; \
|
|
} \
|
|
|
|
|
|
//
|
|
// Change Notification Helper Functions
|
|
//
|
|
|
|
DWORD
|
|
ComputeCNsToBeNotified (
|
|
IN PADDRFAM_INFO AddrFamInfo,
|
|
IN DWORD DestMarkedBits,
|
|
IN DWORD *ViewsForChangeType
|
|
);
|
|
|
|
DWORD
|
|
AddToChangedDestLists (
|
|
IN PADDRFAM_INFO AddrFamInfo,
|
|
IN PDEST_INFO Dest,
|
|
IN ULONG NotifyCNs
|
|
);
|
|
|
|
VOID
|
|
NTAPI
|
|
ProcessChangedDestLists (
|
|
IN PVOID Context,
|
|
IN BOOLEAN TimeOut
|
|
);
|
|
|
|
#endif //__ROUTING_RTMCHNG_H__
|