259 lines
6.3 KiB
C
259 lines
6.3 KiB
C
/*++
|
||
|
||
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_
|
||
|
||
|
||
|