Leaked source code of windows server 2003
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.
 
 
 
 
 
 

417 lines
9.0 KiB

/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
zip.h
Abstract:
This module contains information for the Zone Information Protocol.
Author:
Jameel Hyder ([email protected])
Nikhil Kamkolkar ([email protected])
Revision History:
19 Jun 1992 Initial Version
Notes: Tab stop: 4
--*/
#ifndef _ZIP_
#define _ZIP_
#define MAX_ZONE_LENGTH 32
#define MAX_ZONES_PER_NET 255 // AppleTalk phase 2
// ZIP specific data:
#define ZIP_QUERY 1
#define ZIP_REPLY 2
#define ZIP_TAKEDOWN 3
#define ZIP_BRINGUP 4
#define ZIP_GET_NETINFO 5
#define ZIP_NETINFO_REPLY 6
#define ZIP_NOTIFY 7
#define ZIP_EXT_REPLY 8
#define ZIP_ONEZONEQUERY_DDPSIZE 4
#define ZIP_GETZONELIST_DDPSIZE 8
// For GetZoneList and GetMyZone we're handling simple ATP packets:
#define ATP_ZIP_CMD_OFF (ATP_USER_BYTES_OFF + 0)
#define ATP_ZIP_LAST_FLAG_OFF (ATP_USER_BYTES_OFF + 0)
#define ATP_ZIP_START_INDEX_OFF (ATP_USER_BYTES_OFF + 2)
#define ATP_ZIP_ZONE_CNT_OFF (ATP_USER_BYTES_OFF + 2)
#define ATP_ZIP_FIRST_ZONE_OFF (ATP_USER_BYTES_OFF + 4)
// Offsets into the datagram
#define ZIP_CMD_OFF 0
#define ZIP_NW_CNT_OFF 1
#define ZIP_FLAGS_OFF 1
#define ZIP_FIRST_NET_OFF 2 // Zip Query/Reply
#define ZIP_FIRST_ZONELEN_OFF 4
#define ZIP_LAST_NET_OFF 4 // Zip Query/Reply
#define ZIP_FIRST_ZONENAME_OFF 5
#define ZIP_REQ_ZONELEN_OFF 6 // Zip Query/Reply
#define ZIP_REQ_ZONENAME_OFF 7 // Zip Query/Reply
#define ZIP_CABLE_RANGE_START_OFF 2 // Phase II Values
#define ZIP_CABLE_RANGE_END_OFF 4
#define ZIP_ZONELEN_OFF 6
#define ZIP_OLD_ZONELEN_OFF 6
#define ZIP_ZONENAME_OFF 7
#define ZIP_OLD_ZONENAME_OFF 7
// The three ZIP ATP commands:
#define ZIP_GET_MY_ZONE 7
#define ZIP_GET_ZONE_LIST 8
#define ZIP_GET_LOCAL_ZONES 9
// The ZIP NetInfoReply and Notify flags.
#define ZIP_ZONE_INVALID_FLAG 0x80
#define ZIP_USE_BROADCAST_FLAG 0x40
#define ZIP_ONLYONE_ZONE_FLAG 0x20
// When we're starting up (on extended networks) we send out a few NetGetInfo's
// to try to find out our zone name. This seems to be what phase II Macintosh
// nodes do (timing wise):
#define ZIP_GET_NETINFO_WAIT 500 // In Ms
#define ZIP_NUM_GETNET_INFOS 3
// When nodes are doing either GetMyZone (non-extended only) or GetZoneList
// (both flavours) the request is sent to A-ROUTER a few times:
#define ZIP_GET_ZONEINFO_TIMER 10 // In 100ms units
#define ZIP_GET_ZONEINFO_RETRIES 3
// The ZIP specific timer values:
#define ZIP_QUERY_TIMER 100 // In 100ms units
// When we're looking for the zone list of a network, when starting the
// router, how many zip queries? how fast?
#define ZIP_QUERY_WAIT 10 // In Ms
#define ZIP_NUM_QUERIES 30
#define ZIP_NUM_RETRIES 10
#define ZONE_NAMES 1
#define ZONE_NUM 2
// Zone structure
typedef struct _ZONE
{
struct _ZONE * zn_Next; // Next zone in the table
struct _ZONE ** zn_Prev; // Next zone in the table
LONG zn_RefCount; // Reference count
BYTE zn_ZoneLen; // Length of the zone name string
BYTE zn_Zone[1]; // Zone string, not null-terminated
} ZONE, *PZONE;
#define ZONES_EQUAL(pZ1, pZ2) AtalkFixedCompareCaseInsensitive( \
(pZ1)->zn_Zone, \
(pZ1)->zn_ZoneLen, \
(pZ2)->zn_Zone, \
(pZ1)->zn_ZoneLen) \
typedef struct _ZONE_LIST
{
struct _ZONE_LIST * zl_Next; // Next zone on the list
PZONE zl_pZone; // The zone itself
} ZONE_LIST, *PZONE_LIST;
#define NUM_ZONES_HASH_BUCKETS 23
extern ATALK_SPIN_LOCK AtalkZoneLock;
extern PZONE * AtalkZonesTable;
extern PZONE AtalkDesiredZone;
extern
ATALK_ERROR
AtalkZipInit(
IN BOOLEAN Init
);
extern
VOID
AtalkZipMulticastAddrForZone(
IN PPORT_DESCRIPTOR pPortDesc,
IN PBYTE pZone,
IN BYTE ZoneLen,
IN PBYTE MulticastAddr
);
extern
BOOLEAN
AtalkZipGetNetworkInfoForNode(
IN PPORT_DESCRIPTOR pPortDesc,
IN PATALK_NODEADDR pNode,
IN BOOLEAN FindDefZone
);
extern
VOID
AtalkZipPacketIn(
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
AtalkZipPacketInRouter(
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
);
BOOLEAN
AtalkInitZipStartProcessingOnPort(
IN PPORT_DESCRIPTOR pPortDesc,
IN PATALK_NODEADDR RouterNode
);
extern
ATALK_ERROR
AtalkZipGetMyZone(
IN PPORT_DESCRIPTOR pPortDesc,
IN BOOLEAN fDesired,
IN OUT PAMDL pAMdl,
IN INT Size,
IN struct _ActionReq * pActReq
);
extern
ATALK_ERROR
AtalkZipGetZoneList(
IN PPORT_DESCRIPTOR pPortDesc,
IN BOOLEAN fLocalZones,
IN OUT PAMDL pAMdl,
IN INT Size,
IN struct _ActionReq * pActReq
);
extern
PZONE
AtalkZoneReferenceByName(
IN PBYTE ZoneName,
IN BYTE ZoneLen
);
extern
VOID
AtalkZoneReferenceByPtr(
IN PZONE pZone
);
VOID
AtalkZoneDereference(
IN PZONE pZone
);
extern
VOID
AtalkZoneFreeList(
IN PZONE_LIST pZoneList
);
extern
ULONG
AtalkZoneNumOnList(
IN PZONE_LIST ZoneList
);
extern
PZONE_LIST
AtalkZoneAddToList(
IN PZONE_LIST ZoneList,
IN PBYTE Zone,
IN BYTE ZoneLen
);
extern
PZONE_LIST
AtalkZoneCopyList(
IN PZONE_LIST ZoneList
);
extern
BOOLEAN
AtalkZoneNameOnList(
IN PBYTE ZoneName,
IN BYTE ZoneLen,
IN PZONE_LIST pZoneList
);
extern
BOOLEAN
AtalkZoneOnList(
IN PZONE pZone,
IN PZONE_LIST pZoneList
);
extern TIMERLIST atalkZipQTimer;
extern BOOLEAN atalkZipQryTmrRunning;
LOCAL VOID
atalkZipHandleNetInfo(
IN PPORT_DESCRIPTOR pPortDesc,
IN PDDP_ADDROBJ pDdpAddr,
IN PATALK_ADDR pSrcAddr,
IN PATALK_ADDR pDstAddr,
IN PBYTE pPkt,
IN USHORT PktLen
);
LOCAL VOID
atalkZipHandleReply(
IN PDDP_ADDROBJ pDdpAddr,
IN PATALK_ADDR pSrcAddr,
IN PBYTE pPkt,
IN USHORT PktLen
);
LOCAL VOID
atalkZipHandleQuery(
IN PPORT_DESCRIPTOR pPortDesc,
IN PDDP_ADDROBJ pDdpAddr,
IN PATALK_ADDR pSrcAddr,
IN PBYTE pPkt,
IN USHORT PktLen
);
LOCAL VOID
atalkZipHandleAtpRequest(
IN PPORT_DESCRIPTOR pPortDesc,
IN PDDP_ADDROBJ pDdpAddr,
IN PATALK_ADDR pSrcAddr,
IN BYTE CmdType,
IN USHORT TrId,
IN USHORT StartIndex
);
LOCAL LONG FASTCALL
atalkZipQueryTimer(
IN PTIMERLIST pContext,
IN BOOLEAN TimerShuttingDown
);
LOCAL BOOLEAN
atalkZipGetZoneListForPort(
IN PPORT_DESCRIPTOR pPortDesc
);
// Control blocks from processing GetMyZone and GetZoneList calls
#define ZCI_SIGNATURE (*(PULONG)"ZCI")
#if DBG
#define VALID_ZCI(pZci) (((pZci) != NULL) && \
((pZci)->zci_Signature == ZCI_SIGNATURE))
#else
#define VALID_ZCI(pZci) ((pZci) != NULL)
#endif
typedef struct _ZipCompletionInfo
{
#if DBG
ULONG zci_Signature;
#endif
LONG zci_RefCount;
PPORT_DESCRIPTOR zci_pPortDesc;
PDDP_ADDROBJ zci_pDdpAddr;
DDPAO_HANDLER zci_Handler;
PAMDL zci_pAMdl;
INT zci_BufLen;
PACTREQ zci_pActReq;
ATALK_ADDR zci_Router;
TIMERLIST zci_Timer;
USHORT zci_NextZoneOff;
SHORT zci_ZoneCount;
SHORT zci_ExpirationCount;
SHORT zci_AtpRequestType;
ATALK_ERROR zci_FinalStatus;
BYTE zci_Datagram[ZIP_GETZONELIST_DDPSIZE];
ATALK_SPIN_LOCK zci_Lock;
} ZIPCOMPLETIONINFO, *PZIPCOMPLETIONINFO;
LOCAL VOID
atalkZipGetMyZoneReply(
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 PZIPCOMPLETIONINFO pZci,
IN BOOLEAN OptimizePath,
IN PVOID OptimizeCtx
);
LOCAL VOID
atalkZipGetZoneListReply(
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 PZIPCOMPLETIONINFO pZci,
IN BOOLEAN OptimizePath,
IN PVOID OptimizeCtx
);
LOCAL ATALK_ERROR
atalkZipSendPacket(
IN PZIPCOMPLETIONINFO pZci,
IN BOOLEAN TimerEnqueue
);
LOCAL VOID
atalkZipDereferenceZci(
IN PZIPCOMPLETIONINFO pZci
);
LOCAL LONG FASTCALL
atalkZipZoneInfoTimer(
IN PTIMERLIST pTimer,
IN BOOLEAN TimerShuttingDown
);
LOCAL VOID FASTCALL
atalkZipSendComplete(
IN NDIS_STATUS Status,
IN PSEND_COMPL_INFO pSendInfo
);
#endif // _ZIP_