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_
|
|||
|
|
|||
|
|
|||
|
|