/*++ 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_