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.
 
 
 
 
 
 

708 lines
20 KiB

/*++
Copyright (c) 1995 Microsoft Corporation
Module Name:
ntos\tdi\isn\fwd\tables.h
Abstract:
IPX Forwarder Driver Tables
Author:
Vadim Eydelman
Revision History:
--*/
#ifndef _IPXFWD_TABLES_
#define _IPXFWD_TABLES_
// Ranges and defaults for registry configurable parameters
#define MIN_ROUTE_SEGMENT_SIZE PAGE_SIZE
#define MAX_ROUTE_SEGMENT_SIZE (PAGE_SIZE*8)
#define DEF_ROUTE_SEGMENT_SIZE MIN_ROUTE_SEGMENT_SIZE
#define MIN_INTERFACE_HASH_SIZE 31
#define MAX_INTERFACE_HASH_SIZE 257
#define DEF_INTERFACE_HASH_SIZE MAX_INTERFACE_HASH_SIZE
#define MIN_CLIENT_HASH_SIZE 31
#define MAX_CLIENT_HASH_SIZE 257
#define DEF_CLIENT_HASH_SIZE MAX_CLIENT_HASH_SIZE
#define MIN_NB_ROUTE_HASH_SIZE 31
#define MAX_NB_ROUTE_HASH_SIZE 1023
#define DEF_NB_ROUTE_HASH_SIZE 257
#define MAX_SEND_PKTS_QUEUED 256 // No defined range
#define NUM_INTERFACES_PER_SEGMENT 16 // Not configurable currently
#define NUM_NB_ROUTES_PER_SEGMENT 16 // Not configurable currently
// Special number reserved for routes that point to
// client on global net
#define GLOBAL_INTERFACE_REFERENCE ((PINTERFACE_CB)-1)
// All types of WAN are emulated as ETHERNET by NDIS
#define WAN_PACKET_SIZE 1500
#define INVALID_NETWORK_NUMBER 0xFFFFFFFF
#define INVALID_NIC_ID 0xFFFF
// Interface control block
struct _INTERFACE_CB;
typedef struct _INTERFACE_CB * PINTERFACE_CB;
struct _FWD_ROUTE;
typedef struct _FWD_ROUTE * PFWD_ROUTE;
struct _NB_ROUTE;
typedef struct _NB_ROUTE *PNB_ROUTE;
typedef struct _FWD_ROUTE {
ULONG FR_Network; // Dest network
USHORT FR_TickCount; // Route params
USHORT FR_HopCount; //
UCHAR FR_NextHopAddress[6]; // Next hop router
PINTERFACE_CB FR_InterfaceReference; // Associated if CB
// or NULL if global
// network for clients
LONG FR_ReferenceCount; // Number of external
// references for this
// block (must keep the
// it till all of them
// are released
PFWD_ROUTE FR_Next; // Next route in the
// table
} FWD_ROUTE;
typedef struct _INTERFACE_CB {
ULONG ICB_Index; // Unique ID
ULONG ICB_Network; // Network we boud to
union {
ULONGLONG ICB_ClientNode64[1];// For clients on
// global net (faster
// comparisons and
// hashing using 64
// bit support)
UCHAR ICB_RemoteNode[6]; // Peer node for demand
// dial connections
};
UCHAR ICB_LocalNode[6]; // Node we bound to
USHORT ICB_Flags;
#define FWD_IF_ENABLED 0x0001
#define SET_IF_ENABLED(ifCB) ifCB->ICB_Flags |= FWD_IF_ENABLED;
#define SET_IF_DISABLED(ifCB) ifCB->ICB_Flags &= ~FWD_IF_ENABLED;
#define IS_IF_ENABLED(ifCB) (ifCB->ICB_Flags&FWD_IF_ENABLED)
#define FWD_IF_CONNECTING 0x0002
#define SET_IF_CONNECTING(ifCB) ifCB->ICB_Flags |= FWD_IF_CONNECTING;
#define SET_IF_NOT_CONNECTING(ifCB) ifCB->ICB_Flags &= ~FWD_IF_CONNECTING;
#define IS_IF_CONNECTING(ifCB) (ifCB->ICB_Flags&FWD_IF_CONNECTING)
USHORT ICB_NicId; // Nic id we bound to
UCHAR ICB_InterfaceType;
UCHAR ICB_NetbiosDeliver;
BOOLEAN ICB_NetbiosAccept;
PNB_ROUTE ICB_NBRoutes; // Array of associated
// NB routes
ULONG ICB_NBRouteCount; // Number of nb routes
LONGLONG ICB_DisconnectTime; // Time when if was disconnected
FWD_IF_STATS ICB_Stats; // Accumulated
PFWD_ROUTE ICB_CashedRoute; // MRU dest route
PINTERFACE_CB ICB_CashedInterface;// MRU dest if
NIC_HANDLE ICB_AdapterContext; // IPX stack supplied
PVOID ICB_FilterInContext;
PVOID ICB_FilterOutContext;
LONG ICB_PendingQuota; // Remaining quota of
// packets that can be
// pending on
// the interface
LIST_ENTRY ICB_ExternalQueue; // Queue of external (received)
// packets
LIST_ENTRY ICB_InternalQueue; // Queue of internal (send)
// requests
#if DBG
LIST_ENTRY ICB_InSendQueue; // packets being
// sent by ipx
#endif
INT ICB_PacketListId; // ID of the packet list
// (for the max frame size
// on this interface)
LIST_ENTRY ICB_IndexHashLink; // Link in interface idx hash
LIST_ENTRY ICB_ConnectionLink; // Link in connection queue
PNDIS_PACKET ICB_ConnectionPacket; // Packet that caused connection
// request
PUCHAR ICB_ConnectionData; // Pointer into packet to
// place where actual data
// (header) starts
PINTERFACE_CB ICB_NodeHashLink; // Link in client node hash
ULONG ICB_ReferenceCount; // Number of routes that
// point to this CB
KSPIN_LOCK ICB_Lock; // Protects state,
// queues
} INTERFACE_CB;
#define InitICB(ifCB,IfIndex,IfType,NbAccept,NbDeliver) { \
(ifCB)->ICB_Index = IfIndex; \
(ifCB)->ICB_Network = INVALID_NETWORK_NUMBER; \
(ifCB)->ICB_Flags = 0; \
(ifCB)->ICB_NicId = INVALID_NIC_ID; \
(ifCB)->ICB_InterfaceType = IfType; \
(ifCB)->ICB_NetbiosAccept = NbAccept; \
(ifCB)->ICB_NetbiosDeliver = NbDeliver; \
memset (&(ifCB)->ICB_Stats, 0, sizeof (FWD_IF_STATS));\
KeInitializeSpinLock (&(ifCB)->ICB_Lock); \
(ifCB)->ICB_CashedInterface = NULL; \
(ifCB)->ICB_CashedRoute = NULL; \
(ifCB)->ICB_ReferenceCount = 0; \
(ifCB)->ICB_FilterInContext = NULL; \
(ifCB)->ICB_FilterOutContext = NULL; \
(ifCB)->ICB_ClientNode64[0] = 0; \
(ifCB)->ICB_NBRoutes = NULL; \
(ifCB)->ICB_PacketListId = -1; \
InitializeListHead (&(ifCB)->ICB_InternalQueue); \
InitializeListHead (&(ifCB)->ICB_ExternalQueue); \
(ifCB)->ICB_PendingQuota = MaxSendPktsQueued; \
switch ((ifCB)->ICB_InterfaceType) { \
case FWD_IF_PERMANENT: \
(ifCB)->ICB_Stats.OperationalState = FWD_OPER_STATE_DOWN;\
break; \
case FWD_IF_DEMAND_DIAL: \
case FWD_IF_LOCAL_WORKSTATION: \
case FWD_IF_REMOTE_WORKSTATION: \
(ifCB)->ICB_Stats.OperationalState = FWD_OPER_STATE_SLEEPING;\
KeQuerySystemTime ((PLARGE_INTEGER)&(ifCB)->ICB_DisconnectTime);\
(ifCB)->ICB_DisconnectTime -= (LONGLONG)SpoofingTimeout*10000000;\
break; \
} \
}
// Routes for netbios names (staticly seeded to reduce
// internet broadcast traffic)
typedef struct _NB_ROUTE {
union {
ULONGLONG NBR_Name128[2];
UCHAR NBR_Name[16]; // Netbios name of destination
};
PINTERFACE_CB NBR_Destination; // Interface to send to
PNB_ROUTE NBR_Next; // Next route in the name list
} NB_ROUTE;
// List used to allocate packets destined to WAN interfaces
extern INT WanPacketListId;
// Max number of outstanding sends
extern ULONG MaxSendPktsQueued;
// Segment sizes
extern ULONG RouteSegmentSize;
extern ULONG InterfaceSegmentSize;
extern ULONG NBNameSegementSize;
// Sizes of hash tables
extern ULONG RouteHashSize;
extern ULONG InterfaceHashSize;
extern ULONG ClientHashSize;
extern ULONG NBRouteHashSize;
// Number of global client network
extern ULONG GlobalNetwork;
// Interface reserved for internal network
extern PINTERFACE_CB InternalInterface;
/*++
*******************************************************************
C r e a t e T a b l e s
Routine Description:
Allocates and intializes all hash tables and related structures
Arguments:
None
Return Value:
STATUS_SUCCESS - tables were created ok
STATUS_INSUFFICIENT_RESOURCES - resource allocation failed
*******************************************************************
--*/
NTSTATUS
CreateTables (
void
);
/*++
*******************************************************************
D e l e t e T a b l e s
Routine Description:
Releases resources allocated for all hash tables
Arguments:
None
Return Value:
STATUS_SUCCESS - tables were freed ok
*******************************************************************
--*/
NTSTATUS
DeleteTables (
void
);
/*++
*******************************************************************
F r e e I n t e r f a c e
Routine Description:
Releases memory allocated for interface to interface memory
zone.
Arguments:
fwRoute - route block to release
Return Value:
None
*******************************************************************
--*/
VOID
FreeInterface (
PINTERFACE_CB ifCB
);
/*++
*******************************************************************
F r e e R o u t e
Routine Description:
Releases memory allocated for route to route memory
zone.
Arguments:
fwRoute - route block to release
Return Value:
None
*******************************************************************
--*/
VOID
FreeRoute (
PFWD_ROUTE fwRoute
);
/*++
*******************************************************************
A c q u i r e I n t e r f a c e R e f e r e n c e
Routine Description:
Increments refernce count of interface control block
ICB can't be freed until all references to it are released.
The caller of this routine should have already had a reference
to the interface or must hold an InterfaceLock
Arguments:
ifCB - interface control block to reference
Return Value:
None
*******************************************************************
--*/
//VOID
//AcquireInterfaceReference (
// PINTERFACE_CB ifCB
// );
#if DBG
#define AcquireInterfaceReference(ifCB) \
do { \
ASSERTMSG ("Referenced ifCB is dead ", \
InterlockedIncrement(&ifCB->ICB_ReferenceCount)>0); \
} while (0)
#else
#define AcquireInterfaceReference(ifCB) \
InterlockedIncrement(&ifCB->ICB_ReferenceCount)
#endif
/*++
*******************************************************************
R e l e a s e I n t e r f a c e R e f e r e n c e
Routine Description:
Decrements refernce count of interface control block
Arguments:
ifCB - interface control block to release
Return Value:
None
*******************************************************************
--*/
//PINTERFACE_CB
//ReleaseInterfaceReference (
// PINTERFACE_CB ifCB
// );
// if it drops below 0, it has alredy been removed from the table
#define ReleaseInterfaceReference(ifCB) ( \
(InterlockedDecrement (&ifCB->ICB_ReferenceCount)>=0) \
? ifCB \
: (FreeInterface (ifCB), (ifCB = NULL)) \
)
/*++
*******************************************************************
I n t e r f a c e C o n t e x t T o R e f e r e n c e
Routine Description:
Verifies that context supplied by the IPX stack is a valid
interface block and is still bound to the adapter with which
it is associated in the IPX stack
Arguments:
ifCB - interface control block to reference
NicId - id of the adapter to which interface is bound
Return Value:
None
*******************************************************************
--*/
//PINTERFACE_CB
//InterfaceContextToReference (
// PVOID Context
// );
#define InterfaceContextToReference(Context,NicId) ( \
(InterlockedIncrement(&((PINTERFACE_CB)Context)->ICB_ReferenceCount)>0) \
? ((NicId==((PINTERFACE_CB)Context)->ICB_NicId) \
? (PINTERFACE_CB)Context \
: (ReleaseInterfaceReference(((PINTERFACE_CB)Context)), NULL)) \
: NULL \
)
/*++
*******************************************************************
G e t I n t e r f a c e R e f e r e n c e
Routine Description:
Returns reference interface based on its index
Arguments:
InterfaceIndex - unique id of the interface
Return Value:
Pointer to interface control block if there is one in the table
NULL otherwise
*******************************************************************
--*/
PINTERFACE_CB
GetInterfaceReference (
ULONG InterfaceIndex
);
/*++
*******************************************************************
G e t N e x t I n t e r f a c e R e f e r e n c e
Routine Description:
Returns reference to the next interface in the table
Reference to the provided interface is released
Arguments:
ifCB - interface to start with or NULL to start from the
beginning of the interface table
Return Value:
Pointer to interface control block if thare are any more interfaces
in the table
NULL otherwise
*******************************************************************
--*/
PINTERFACE_CB
GetNextInterfaceReference (
PINTERFACE_CB ifCB
);
/*++
*******************************************************************
A d d I n t e r f a c e
Routine Description:
Adds interface control block to the table.
Arguments:
InterfaceIndex - unique if of the interface
Info - interface paramters
Return Value:
STATUS_SUCCESS - interface added ok
STATUS_UNSUCCESSFULL - interface is already in the table
STATUS_INSUFFICIENT_RESOURCES - can't allocate memory for
interface CB
*******************************************************************
--*/
NTSTATUS
AddInterface (
ULONG InterfaceIndex,
UCHAR InterfaceType,
BOOLEAN NetbiosAccept,
UCHAR NetbiosDeliver
);
/*++
*******************************************************************
A d d G l o b a l N e t C l i e n t
Routine Description:
Adds interface control block to the table of
clients on the global network (should be done when
client connects)
Arguments:
ifCB - interface control block to add to the table
Return Value:
STATUS_SUCCESS - interface was added ok
STATUS_UNSUCCESSFULL - another interface with the same
node address is already in the table
*******************************************************************
--*/
NTSTATUS
AddGlobalNetClient (
PINTERFACE_CB ifCB
);
/*++
*******************************************************************
D e l e t e G l o b a l N e t C l i e n t
Routine Description:
Removes interface control block from the table of
clients on the global network (should be done when
client disconnects)
Arguments:
ifCB - interface control block to remove from the table
Return Value:
STATUS_SUCCESS - interface was removed ok
*******************************************************************
--*/
NTSTATUS
DeleteGlobalNetClient (
PINTERFACE_CB ifCB
);
/*++
*******************************************************************
D e l e t e I n t e r f a c e
Routine Description:
Deletes interface control block (the block is not actually
disposed of until all references to it are released).
Arguments:
InterfaceIndex - unique if of the interface
Return Value:
STATUS_SUCCESS - interface info retreived ok
STATUS_UNSUCCESSFULL - interface is not in the table
*******************************************************************
--*/
NTSTATUS
DeleteInterface (
ULONG InterfaceIndex
);
/*++
*******************************************************************
A d d R o u t e
Routine Description:
Adds route to the hash table and finds and stores the reference
to the associated interface control block in the route.
Arguments:
Network - route's destination network
NextHopAddress - mac address of next hop router if network is not
directly connected
TickCount - ticks to reach the destination net
HopCount - hopss to reach the destination net
InterfaceIndex - index of the associated interface (through which
packets destined to the network are to be sent)
Return Value:
STATUS_SUCCESS - route was added ok
STATUS_UNSUCCESSFUL - route is already in the table
STATUS_INSUFFICIENT_RESOURCES - can't allocate memory for
route block
*******************************************************************
--*/
NTSTATUS
AddRoute (
ULONG Network,
UCHAR *NextHopAddress,
USHORT TickCount,
USHORT HopCount,
ULONG InterfaceIndex
);
/*++
*******************************************************************
D e l e t e R o u t e
Routine Description:
Deletes route from the hash table and releases the reference
to the interface control block associated with the route.
Arguments:
Network - route's destination network
Return Value:
STATUS_SUCCESS - route was deleted ok
STATUS_UNSUCCESSFUL - route is not in the table
*******************************************************************
--*/
NTSTATUS
DeleteRoute (
ULONG Network
);
/*++
*******************************************************************
U p d a t e R o u t e
Routine Description:
Updates route in the hash table
Arguments:
Network - route's destination network
NextHopAddress - mac address of next hop router if network is not
directly connected
TickCount - ticks to reach the destination net
HopCount - hopss to reach the destination net
InterfaceIndex - index of the associated interface (through which
packets destined to the network are to be sent)
Return Value:
STATUS_SUCCESS - interface info retreived ok
STATUS_UNSUCCESSFUL - interface is not in the table
*******************************************************************
--*/
NTSTATUS
UpdateRoute (
ULONG Network,
UCHAR *NextHopAddress,
USHORT TickCount,
USHORT HopCount,
ULONG InterfaceIndex
);
/*++
*******************************************************************
F i n d D e s t i n a t i o n
Routine Description:
Finds destination interface for IPX address and
returns reference to its control block.
Arguments:
Network - destination network
Node - destination node (needed in case of global client)
Route - buffer to place route reference
Return Value:
Reference to destination interface CB
NULL if route it not found
*******************************************************************
--*/
PINTERFACE_CB
FindDestination (
IN ULONG Network,
IN PUCHAR Node,
OUT PFWD_ROUTE *Route
);
/*++
*******************************************************************
A c q u i r e R o u t e R e f e r e n c e
Routine Description:
Increments refernce count of the route block
Route block can't be freed until all references to it are released.
The caller of this routine should have already had a reference
to the route or must hold an TableWriteLock
Arguments:
fwRoute - route block to reference
Return Value:
None
*******************************************************************
--*/
//VOID
//AcquireRouteReference (
// PFW+ROUTE fwRoute
// );
#define AcquireRouteReference(fwRoute) \
InterlockedIncrement(&fwRoute->FR_ReferenceCount)
/*++
*******************************************************************
R e l e a s e R o u t e R e f e r e n c e
Routine Description:
Decrements refernce count of route block
Arguments:
fwRoute - route block to release
Return Value:
None
*******************************************************************
--*/
//VOID
//ReleaseRouteReference (
// PFW_ROUTE fwRoute
// );
// if it drops below 0, it has alredy been removed from the table
#define ReleaseRouteReference(fwRoute) { \
if (InterlockedDecrement (&fwRoute->FR_ReferenceCount)<0) { \
FreeRoute (fwRoute); \
fwRoute = NULL; \
} \
}
/*++
*******************************************************************
A d d N B R o u t e s
Routine Description:
Adds netbios names associated with interface to netbios
route hash table
Arguments:
ifCB - interface with which names are associated
Names - array of names
Count - number of names in the array
routeArray - buffer to place pointer to allocated array of routes
Return Value:
STATUS_SUCCESS - names were added ok
STATUS_UNSUCCESSFUL - one of the names is already in the table
STATUS_INSUFFICIENT_RESOURCES - can't allocate memory for
route array
*******************************************************************
--*/
NTSTATUS
AddNBRoutes (
PINTERFACE_CB ifCB,
FWD_NB_NAME Names[],
ULONG Count,
PNB_ROUTE *routeArray
);
/*++
*******************************************************************
D e l e t e N B R o u t e s
Routine Description:
Deletes nb routes in the array from the route table and frees
the array
Arguments:
nbRoutes - array of routes
Count - number of routes in the array
Return Value:
STATUS_SUCCESS - route was deleted ok
STATUS_UNSUCCESSFUL - route is not in the table
*******************************************************************
--*/
NTSTATUS
DeleteNBRoutes (
PNB_ROUTE nbRoutes,
ULONG Count
);
/*++
*******************************************************************
F i n d N B D e s t i n a t i o n
Routine Description:
Finds destination interface for nb name and
returns reference to its control block.
Arguments:
Name - name to look for
Return Value:
Reference to destination interface CB
NULL if route it not found
*******************************************************************
--*/
PINTERFACE_CB
FindNBDestination (
IN PUCHAR Name
);
#endif