|
|
/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
nbp.h
Abstract:
This module contains NBP specific declarations.
Author:
Jameel Hyder (jameelh@microsoft.com) Nikhil Kamkolkar (nikhilk@microsoft.com)
Revision History: 25 Feb 1993 Initial Version
Notes: Tab stop: 4 --*/
#ifndef _NBP_
// Each "OpenSocket" structure has a "RegsiteredName" field which is the list
// of Network Visible Entities (NVE) available on that socket. Each NVE is
// made up of three fields: object, type, zone For example:
// "Sidhu:MailBox:Bandley3". We don't have to store the zone in the NVE
// structure because each entity must be registered in the zone that the node
// resides in.
// NBP entity multiple character wildcard.
#define NBP_WILD_CHARACTER 0xC5
// The largest "on the wire" NBP tuple
#define MAX_NBP_TUPLELENGTH (2 + 1 + 1 + 1 + \
3 * (MAX_ENTITY_LENGTH + 1))
#define MIN_NBP_TUPLELENGTH (2 + 1 + 1 + 1 + 3 * (1 + 1))
// Structure of NBP Header
typedef struct _NbpHeader { BYTE _CmdAndTupleCnt; BYTE _NbpId; } NBPHDR, *PNBPHDR;
// An internal representation of an NBP tuple. This structure is never
// actually put out on the wire so it can be in a convienient form to work
// with. See "Inside AppleTalk" for further information.
typedef struct { ATALK_ADDR tpl_Address; SHORT tpl_Enumerator; BYTE tpl_ObjectLen; BYTE tpl_Object[MAX_ENTITY_LENGTH]; BYTE tpl_TypeLen; BYTE tpl_Type [MAX_ENTITY_LENGTH]; BYTE tpl_ZoneLen; BYTE tpl_Zone [MAX_ENTITY_LENGTH]; } NBPTUPLE, *PNBPTUPLE;
// A registered name hangs off a open socket
#define RDN_SIGNATURE *(PULONG)"NBPR"
#if DBG
#define VALID_REGDNAME(pRegdName) (((pRegdName) != NULL) && \
((pRegdName)->rdn_Signature == RDN_SIGNATURE)) #else
#define VALID_REGDNAME(pRegdName) ((pRegdName) != NULL)
#endif
typedef struct _REGD_NAME { #if DBG
ULONG rdn_Signature; #endif
struct _REGD_NAME * rdn_Next; NBPTUPLE rdn_Tuple; } REGD_NAME, *PREGD_NAME;
#define FOR_REGISTER 1
#define FOR_CONFIRM 2
#define FOR_LOOKUP 3
#define PDN_FREE_REGDNAME 0x0001
#define PDN_CLOSING 0x8000
// When we're doing NBP registers, lookups, or confirms we need to have a
// concept of "pending" NVE's.
#define PDN_SIGNATURE *(PULONG)"NBPP"
#if DBG
#define VALID_PENDNAME(pPendName) (((pPendName) != NULL) && \
((pPendName)->pdn_Signature == PDN_SIGNATURE)) #else
#define VALID_PENDNAME(pPendName) ((pPendName) != NULL)
#endif
typedef struct _PEND_NAME { #if DBG
ULONG pdn_Signature; #endif
struct _PEND_NAME * pdn_Next; // Next in the chain
PREGD_NAME pdn_pRegdName; // This is moved to the open socket, if
// FOR_REGISTER and successful
PDDP_ADDROBJ pdn_pDdpAddr; // Socket that is registering,
// confiming or looking-up.
ATALK_ADDR pdn_ConfirmAddr; // The expected internet address
// that we're trying to confirm.
TIMERLIST pdn_Timer; // Broadcast timer
LONG pdn_RefCount; // Reference count
USHORT pdn_NbpId; // So we can sort out answers!
USHORT pdn_Flags; // PDN_xxx values
USHORT pdn_MaxTuples; // For lookup, what is the max # of
// tuples our client is expecting?
USHORT pdn_TotalTuples; // For lookup, how many tuples have we stored so far?
BYTE pdn_Reason; // Confirm,Lookup or Register
BYTE pdn_RemainingBroadcasts;// How many more till we assume we're finished?
USHORT pdn_DatagramLength; // Actual length of the datagram
USHORT pdn_MdlLength; // Length of user Mdl
PAMDL pdn_pAMdl; // Start of caller's "buffer" used to recieve tuples.
PACTREQ pdn_pActReq; // Passed on to the completion routine.
ATALK_ERROR pdn_Status; // Final status
ATALK_SPIN_LOCK pdn_Lock; // Lock for this pending name
CHAR pdn_Datagram[sizeof(NBPHDR) + MAX_NBP_TUPLELENGTH]; // The DDP datagram that we use to broadcast
// the request.
} PEND_NAME, *PPEND_NAME;
// Default values for NBP timers
#define NBP_BROADCAST_INTERVAL 10 // In 100ms units
#define NBP_NUM_BROADCASTS 10
// The three NBP command types
#define NBP_BROADCAST_REQUEST 1
#define NBP_LOOKUP 2
#define NBP_LOOKUP_REPLY 3
#define NBP_FORWARD_REQUEST 4
extern VOID AtalkNbpPacketIn( 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 ATALK_ERROR AtalkNbpAction( IN PDDP_ADDROBJ pDdpAddr, IN BYTE Reason, IN PNBPTUPLE pNbpTuple, OUT PAMDL pAMdl OPTIONAL, // FOR_LOOKUP
IN USHORT MaxTuples OPTIONAL, // FOR_LOOKUP
IN PACTREQ pActReq );
extern VOID AtalkNbpCloseSocket( IN PDDP_ADDROBJ pDdpAddr );
extern ATALK_ERROR AtalkNbpRemove( IN PDDP_ADDROBJ pDdpAddr, IN PNBPTUPLE pNbpTuple, IN PACTREQ pActReq );
LOCAL LONG FASTCALL atalkNbpTimer( IN PTIMERLIST pTimer, IN BOOLEAN TimerShuttingDown ); LOCAL VOID atalkNbpLookupNames( IN PPORT_DESCRIPTOR pPortDesc, IN PDDP_ADDROBJ pDdpAddr, IN PNBPTUPLE pNbpTuple, IN SHORT NbpId );
LOCAL BOOLEAN atalkNbpMatchWild( IN PBYTE WildString, IN BYTE WildStringLen, IN PBYTE String, IN BYTE StringLen );
LOCAL SHORT atalkNbpEncodeTuple( IN PNBPTUPLE pNbpTuple, IN PBYTE pZone OPTIONAL, IN BYTE ZoneLen OPTIONAL, IN BYTE Socket OPTIONAL, OUT PBYTE pBuffer );
LOCAL SHORT atalkNbpDecodeTuple( IN PBYTE pBuffer, IN USHORT PktLen, OUT PNBPTUPLE pNbpTuple );
LOCAL VOID atalkNbpLinkPendingNameInList( IN PDDP_ADDROBJ pDdpAddr, IN OUT PPEND_NAME pPendName );
LOCAL BOOLEAN atalkNbpSendRequest( IN PPEND_NAME pPendName );
LOCAL VOID atalkNbpSendLookupDatagram( IN PPORT_DESCRIPTOR pPortDesc, IN PDDP_ADDROBJ pDdpAddr, IN SHORT NbpId, IN PNBPTUPLE pNbpTuple );
LOCAL VOID atalkNbpSendForwardRequest( IN PDDP_ADDROBJ pDdpAddr, IN struct _RoutingTableEntry * pRte, IN SHORT NbpId, IN PNBPTUPLE pNbpTuple );
VOID atalkNbpDerefPendName( IN PPEND_NAME pPendName );
VOID FASTCALL atalkNbpSendComplete( IN NDIS_STATUS Status, IN PSEND_COMPL_INFO pSendInfo );
#endif // _NBP_
|