266 lines
5.8 KiB
C
266 lines
5.8 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1992 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
rtmp.h
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module contains information for the Routing Table Maintainance Protocol.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Jameel Hyder (jameelh@microsoft.com)
|
|||
|
Nikhil Kamkolkar (nikhilk@microsoft.com)
|
|||
|
|
|||
|
Revision History:
|
|||
|
19 Jun 1992 Initial Version
|
|||
|
|
|||
|
Notes: Tab stop: 4
|
|||
|
--*/
|
|||
|
|
|||
|
#ifndef _RTMP_
|
|||
|
#define _RTMP_
|
|||
|
|
|||
|
// RTMP specific data.
|
|||
|
|
|||
|
#define RTMP_REQUEST 1
|
|||
|
#define RTMP_DATA_REQUEST 2
|
|||
|
#define RTMP_ENTIRE_DATA_REQUEST 3
|
|||
|
|
|||
|
#define RTMP_REQ_DATAGRAM_SIZE 1
|
|||
|
#define RTMP_DATA_MIN_SIZE_EXT 10
|
|||
|
#define RTMP_DATA_MIN_SIZE_NON_EXT 7
|
|||
|
|
|||
|
#define RTMP_RESPONSE_MAX_SIZE 10
|
|||
|
|
|||
|
#define RTMP_VERSION (BYTE)0x82
|
|||
|
|
|||
|
#define RTMP_TUPLE_WITHRANGE (BYTE)0x80
|
|||
|
#define RTMP_TUPLE_WITHOUTRANGE (BYTE)0x00
|
|||
|
#define RTMP_EXT_TUPLE_MASK 0x80
|
|||
|
#define RTMP_MAX_HOPS 0x0F
|
|||
|
#define RTMP_NUM_HOPS_MASK 0x1F
|
|||
|
|
|||
|
#define RTMP_EXT_TUPLE_SIZE 6
|
|||
|
|
|||
|
// When trying to find our network number on a non-extended port.
|
|||
|
|
|||
|
#define RTMP_REQUEST_WAIT 100 // MilliSeconds
|
|||
|
#define RTMP_NUM_REQUESTS 30
|
|||
|
|
|||
|
// The actual RTMP routing table. Entries are hashed by target network number
|
|||
|
// and contain the port number used to get to the target network, next bridge
|
|||
|
// used to get to the target network, the number of hops to that network,
|
|||
|
// and entry state (Good, Suspect, or Bad). Note that with AppleTalk phase II,
|
|||
|
// it takes two Validity timers to get from Suspect to Bad, so we let an entry
|
|||
|
// go through a PrettyBad state (we won't send these guys when the Send timer goes off).
|
|||
|
|
|||
|
#define GOOD 1
|
|||
|
#define SUSPECT 2
|
|||
|
#define BAD 3
|
|||
|
#define UGLY 4
|
|||
|
|
|||
|
extern ATALK_SPIN_LOCK AtalkRteLock;
|
|||
|
|
|||
|
#define RTE_ZONELIST_VALID 0x01
|
|||
|
#define RTE_DELETE 0x80
|
|||
|
|
|||
|
#define RTE_SIGNATURE *(PULONG)"RTMP"
|
|||
|
#if DBG
|
|||
|
#define VALID_RTE(pRte) ((pRte != NULL) && (pRte->rte_Signature == RTE_SIGNATURE))
|
|||
|
#else
|
|||
|
#define VALID_RTE(pRte) (pRte != NULL)
|
|||
|
#endif
|
|||
|
|
|||
|
typedef struct _RoutingTableEntry
|
|||
|
{
|
|||
|
#if DBG
|
|||
|
ULONG rte_Signature;
|
|||
|
#endif
|
|||
|
struct _RoutingTableEntry * rte_Next;
|
|||
|
// Hashed by first network number,
|
|||
|
// overflow buckets.
|
|||
|
PPORT_DESCRIPTOR rte_PortDesc; // Port used to access this network range
|
|||
|
LONG rte_RefCount; // Reference count
|
|||
|
BYTE rte_Flags;
|
|||
|
BYTE rte_State; // State of the rtmp entry
|
|||
|
BYTE rte_NumHops; // Hops to get to net
|
|||
|
ATALK_NETWORKRANGE rte_NwRange; // The network range that we represent
|
|||
|
ATALK_NODEADDR rte_NextRouter; // Node number of next router on
|
|||
|
// the way to this net range
|
|||
|
struct _ZONE_LIST * rte_ZoneList; // Valid zones for this net
|
|||
|
ATALK_SPIN_LOCK rte_Lock;
|
|||
|
} RTE, *PRTE;
|
|||
|
|
|||
|
#define NUM_RTMP_HASH_BUCKETS 15
|
|||
|
extern PRTE * AtalkRoutingTable;
|
|||
|
|
|||
|
// To decrease the odds of having to do a scan of the routing tables to
|
|||
|
// find where to route a packet, we keep a cache of "recently used routes".
|
|||
|
// This cache is checked before we use the "first network number" hash and
|
|||
|
// before we resort of a full scan of the routing tables. The size of this
|
|||
|
// cache may want to be increased to get a proportional increase in
|
|||
|
// "hit rate".
|
|||
|
|
|||
|
#define NUM_RECENT_ROUTES 63
|
|||
|
extern PRTE * AtalkRecentRoutes;
|
|||
|
|
|||
|
// RTMP timer values:
|
|||
|
#define RTMP_SEND_TIMER 100 // In 100ms units
|
|||
|
#define RTMP_VALIDITY_TIMER 200 // In 100ms units
|
|||
|
#define RTMP_AGING_TIMER 500 // In 100ms units
|
|||
|
|
|||
|
// RTMP Offsets into the Datagram
|
|||
|
#define RTMP_REQ_CMD_OFF 0
|
|||
|
#define RTMP_SENDER_NW_OFF 0
|
|||
|
#define RTMP_SENDER_IDLEN_OFF 2
|
|||
|
#define RTMP_SENDER_ID_OFF 3
|
|||
|
#define RTMP_VERSION_OFF_NE 6
|
|||
|
#define RTMP_RANGE_START_OFF 4
|
|||
|
#define RTMP_TUPLE_TYPE_OFF 6
|
|||
|
#define RTMP_RANGE_END_OFF 7
|
|||
|
#define RTMP_VERSION_OFF_EXT 9
|
|||
|
|
|||
|
ATALK_ERROR
|
|||
|
AtalkRtmpInit(
|
|||
|
IN BOOLEAN Init
|
|||
|
);
|
|||
|
|
|||
|
BOOLEAN
|
|||
|
AtalkInitRtmpStartProcessingOnPort(
|
|||
|
IN PPORT_DESCRIPTOR pPortDesc,
|
|||
|
IN PATALK_NODEADDR RouterNode
|
|||
|
);
|
|||
|
|
|||
|
extern
|
|||
|
VOID
|
|||
|
AtalkRtmpPacketIn(
|
|||
|
IN PPORT_DESCRIPTOR pPortDesc,
|
|||
|
IN PDDP_ADDROBJ pDdpAddr,
|
|||
|
IN PBYTE pPkt,
|
|||
|
IN USHORT PktLen,
|
|||
|
IN PATALK_ADDR pSrcAddr,
|
|||
|
IN PATALK_ADDR pDstAddr,
|
|||
|
IN ATALK_ERROR ErrorCode,
|
|||
|
IN BYTE DdpType,
|
|||
|
IN PVOID pHandlerCtx,
|
|||
|
IN BOOLEAN OptimizePath,
|
|||
|
IN PVOID OptimizeCtx
|
|||
|
);
|
|||
|
|
|||
|
extern
|
|||
|
VOID
|
|||
|
AtalkRtmpPacketInRouter(
|
|||
|
IN PPORT_DESCRIPTOR pPortDesc,
|
|||
|
IN PDDP_ADDROBJ pDdpAddr,
|
|||
|
IN PBYTE pPkt,
|
|||
|
IN USHORT PktLen,
|
|||
|
IN PATALK_ADDR pSrcAddr,
|
|||
|
IN PATALK_ADDR pDstAddr,
|
|||
|
IN ATALK_ERROR ErrorCode,
|
|||
|
IN BYTE DdpType,
|
|||
|
IN PVOID pHandlerCtx,
|
|||
|
IN BOOLEAN OptimizePath,
|
|||
|
IN PVOID OptimizeCtx
|
|||
|
);
|
|||
|
|
|||
|
extern
|
|||
|
PRTE
|
|||
|
AtalkRtmpReferenceRte(
|
|||
|
IN USHORT Network
|
|||
|
);
|
|||
|
|
|||
|
extern
|
|||
|
BOOLEAN
|
|||
|
atalkRtmpRemoveRte(
|
|||
|
IN USHORT Network
|
|||
|
);
|
|||
|
|
|||
|
extern
|
|||
|
VOID
|
|||
|
AtalkRtmpDereferenceRte(
|
|||
|
IN PRTE pRte,
|
|||
|
IN BOOLEAN LockHeld
|
|||
|
);
|
|||
|
|
|||
|
extern
|
|||
|
BOOLEAN
|
|||
|
atalkRtmpCreateRte(
|
|||
|
IN ATALK_NETWORKRANGE NwRange,
|
|||
|
IN PPORT_DESCRIPTOR pPortDesc,
|
|||
|
IN PATALK_NODEADDR pNextRouter,
|
|||
|
IN int NumHops
|
|||
|
);
|
|||
|
|
|||
|
LONG FASTCALL
|
|||
|
AtalkRtmpAgingTimer(
|
|||
|
IN PTIMERLIST pContext,
|
|||
|
IN BOOLEAN TimerShuttingDown
|
|||
|
);
|
|||
|
|
|||
|
VOID FASTCALL
|
|||
|
AtalkRtmpKillPortRtes(
|
|||
|
IN PPORT_DESCRIPTOR pPortDesc
|
|||
|
);
|
|||
|
|
|||
|
typedef struct _RtmpSendDataHdr
|
|||
|
{
|
|||
|
BYTE rsd_RouterNetwork[2];
|
|||
|
BYTE rsd_IdLength;
|
|||
|
} *PRTMPSENDDATAHDR;
|
|||
|
|
|||
|
typedef struct _RtmpTupleNonExt
|
|||
|
{
|
|||
|
BYTE rtne_Network[2];
|
|||
|
BYTE rtne_RangenDist;
|
|||
|
} *PRTMPTUPLE;
|
|||
|
|
|||
|
typedef struct _RtmpTupleExt
|
|||
|
{
|
|||
|
BYTE rtne_NetworkStart[2];
|
|||
|
BYTE rtne_RangenDist;
|
|||
|
BYTE rtne_NetworkEnd[2];
|
|||
|
BYTE rtne_Version;
|
|||
|
} *PRTMPTUPLEEXT;
|
|||
|
|
|||
|
extern TIMERLIST atalkRtmpVTimer;
|
|||
|
|
|||
|
extern BOOLEAN atalkRtmpVdtTmrRunning;
|
|||
|
|
|||
|
LOCAL VOID
|
|||
|
atalkRtmpSendRoutingData(
|
|||
|
IN PPORT_DESCRIPTOR pPortDesc,
|
|||
|
IN PATALK_ADDR pDstAddr,
|
|||
|
IN BOOLEAN fSplitHorizon
|
|||
|
);
|
|||
|
|
|||
|
LOCAL BOOLEAN
|
|||
|
atalkRtmpGetOrSetNetworkNumber(
|
|||
|
IN PPORT_DESCRIPTOR pPortDesc,
|
|||
|
IN USHORT SuggestedNetwork
|
|||
|
);
|
|||
|
|
|||
|
LOCAL LONG FASTCALL
|
|||
|
atalkRtmpSendTimer(
|
|||
|
IN PTIMERLIST pContext,
|
|||
|
IN BOOLEAN TimerShuttingDown
|
|||
|
);
|
|||
|
|
|||
|
LOCAL LONG FASTCALL
|
|||
|
atalkRtmpValidityTimer(
|
|||
|
IN PTIMERLIST pContext,
|
|||
|
IN BOOLEAN TimerShuttingDown
|
|||
|
);
|
|||
|
|
|||
|
LOCAL VOID FASTCALL
|
|||
|
atalkRtmpSendComplete(
|
|||
|
IN NDIS_STATUS Status,
|
|||
|
IN PSEND_COMPL_INFO pSendInfo
|
|||
|
);
|
|||
|
|
|||
|
#endif // _RTMP_
|
|||
|
|
|||
|
|