windows-nt/Source/XPSP1/NT/net/sfm/atalk/sys/nbp.h

259 lines
6.3 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
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_