417 lines
8.6 KiB
C
417 lines
8.6 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1992 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
zip.h
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module contains information for the Zone Information Protocol.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Jameel Hyder (jameelh@microsoft.com)
|
|||
|
Nikhil Kamkolkar (nikhilk@microsoft.com)
|
|||
|
|
|||
|
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_
|
|||
|
|
|||
|
|