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.
|
|
/*++
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__
|