212 lines
8.7 KiB
C
212 lines
8.7 KiB
C
/********************************************************************/
|
||
/** Microsoft LAN Manager **/
|
||
/** Copyright(c) Microsoft Corp., 1990-1993 **/
|
||
/********************************************************************/
|
||
/* :ts=4 */
|
||
|
||
//** ADDR.H - TDI address object definitions.
|
||
//
|
||
// This file contains the definitions of TDI address objects and related
|
||
// constants and structures.
|
||
|
||
#define ao_signature 0x20204F41 // 'AO '
|
||
|
||
#define AO_TABLE_SIZE 16 // Address object hash table size.
|
||
|
||
#define WILDCARD_PORT 0 // 0 means assign a port.
|
||
|
||
#define MIN_USER_PORT 1025 // Minimum value for a wildcard port
|
||
#define MAX_USER_PORT 5000 // Maximim value for a user port.
|
||
#define NUM_USER_PORTS (uint)(MaxUserPort - MIN_USER_PORT + 1)
|
||
|
||
#define NETBT_SESSION_PORT 139
|
||
|
||
typedef struct AddrObj AddrObj;
|
||
|
||
//* Datagram transport-specific send function.
|
||
typedef void (*DGSendProc)(AddrObj *SrcAO, void *SendReq);
|
||
|
||
//* Definition of the structure of an address object. Each object represents
|
||
// a local address, and the IP portion may be a wildcard.
|
||
|
||
struct AddrObj {
|
||
#ifdef DEBUG
|
||
ulong ao_sig;
|
||
#endif
|
||
struct AddrObj *ao_next; // Pointer to next address object in chain.
|
||
DEFINE_LOCK_STRUCTURE(ao_lock) // Lock for this object.
|
||
struct AORequest *ao_request;// Pointer to pending request.
|
||
Queue ao_sendq; // Queue of sends waiting for transmission.
|
||
Queue ao_pendq; // Linkage for pending queue.
|
||
Queue ao_rcvq; // Receive queue.
|
||
IPOptInfo ao_opt; // Opt info for this address object.
|
||
IPAddr ao_addr; // IP address for this address object.
|
||
ushort ao_port; // Local port for this address object.
|
||
ushort ao_flags; // Flags for this object.
|
||
uchar ao_prot; // Protocol for this AO.
|
||
uchar ao_index; // Index into table of this AO.
|
||
uchar ao_pad[2]; // PAD PAD PAD
|
||
uint ao_listencnt; // Number of listening connections.
|
||
ushort ao_usecnt; // Count of 'uses' on AO.
|
||
ushort ao_inst; // 'Instance' number of this AO.
|
||
IPOptInfo ao_mcastopt;// MCast opt info.
|
||
IPAddr ao_mcastaddr; // Source address for MCast from
|
||
// this addr object..
|
||
Queue ao_activeq; // Queue of active connections.
|
||
Queue ao_idleq; // Queue of inactive (no TCB) connections.
|
||
Queue ao_listenq; // Queue of listening connections.
|
||
CTEEvent ao_event; // Event to use for this AO.
|
||
PConnectEvent ao_connect; // Connect event handle.
|
||
PVOID ao_conncontext; // Receive DG context.
|
||
PDisconnectEvent ao_disconnect; // Disconnect event routine.
|
||
PVOID ao_disconncontext; // Disconnect event context.
|
||
PErrorEvent ao_error; // Error event routine.
|
||
PVOID ao_errcontext; // Error event context.
|
||
PRcvEvent ao_rcv; // Receive event handler
|
||
PVOID ao_rcvcontext; // Receive context.
|
||
PRcvDGEvent ao_rcvdg; // Receive DG event handler
|
||
PVOID ao_rcvdgcontext; // Receive DG context.
|
||
PRcvEvent ao_exprcv; // Expedited receive event handler
|
||
PVOID ao_exprcvcontext; // Expedited receive context.
|
||
struct AOMCastAddr *ao_mcastlist; // List of active multicast
|
||
// addresses.
|
||
DGSendProc ao_dgsend; // Datagram transport send function.
|
||
ushort ao_maxdgsize; // maximum user datagram size.
|
||
#ifdef SYN_ATTACK
|
||
BOOLEAN ConnLimitReached; //set when there are no
|
||
//connections left
|
||
#endif
|
||
}; /* AddrObj */
|
||
|
||
typedef struct AddrObj AddrObj;
|
||
|
||
#define AO_RAW_FLAG 0x0200 // AO is for a raw endpoint.
|
||
#define AO_DHCP_FLAG 0x0100 // AO is bound to real 0 address.
|
||
|
||
#define AO_VALID_FLAG 0x0080 // AddrObj is valid.
|
||
#define AO_BUSY_FLAG 0x0040 // AddrObj is busy (i.e., has it
|
||
// exclusive).
|
||
#define AO_OOR_FLAG 0x0020 // AddrObj is out of resources, and on
|
||
// either the pending or delayed queue.
|
||
#define AO_QUEUED_FLAG 0x0010 // AddrObj is on the pending queue.
|
||
|
||
|
||
#define AO_XSUM_FLAG 0x0008 // Xsums are used on this AO.
|
||
#define AO_SEND_FLAG 0x0004 // Send is pending.
|
||
#define AO_OPTIONS_FLAG 0x0002 // Option set pending.
|
||
#define AO_DELETE_FLAG 0x0001 // Delete pending.
|
||
|
||
|
||
#define AO_VALID(A) ((A)->ao_flags & AO_VALID_FLAG)
|
||
#define SET_AO_INVALID(A) (A)->ao_flags &= ~AO_VALID_FLAG
|
||
|
||
#define AO_BUSY(A) ((A)->ao_flags & AO_BUSY_FLAG)
|
||
#define SET_AO_BUSY(A) (A)->ao_flags |= AO_BUSY_FLAG
|
||
#define CLEAR_AO_BUSY(A) (A)->ao_flags &= ~AO_BUSY_FLAG
|
||
|
||
#define AO_OOR(A) ((A)->ao_flags & AO_OOR_FLAG)
|
||
#define SET_AO_OOR(A) (A)->ao_flags |= AO_OOR_FLAG
|
||
#define CLEAR_AO_OOR(A) (A)->ao_flags &= ~AO_OOR_FLAG
|
||
|
||
#define AO_QUEUED(A) ((A)->ao_flags & AO_QUEUED_FLAG)
|
||
#define SET_AO_QUEUED(A) (A)->ao_flags |= AO_QUEUED_FLAG
|
||
#define CLEAR_AO_QUEUED(A) (A)->ao_flags &= ~AO_QUEUED_FLAG
|
||
|
||
#define AO_XSUM(A) ((A)->ao_flags & AO_XSUM_FLAG)
|
||
#define SET_AO_XSUM(A) (A)->ao_flags |= AO_XSUM_FLAG
|
||
#define CLEAR_AO_XSUM(A) (A)->ao_flags &= ~AO_XSUM_FLAG
|
||
|
||
#define AO_REQUEST(A, f) ((A)->ao_flags & f##_FLAG)
|
||
#define SET_AO_REQUEST(A, f) (A)->ao_flags |= f##_FLAG
|
||
#define CLEAR_AO_REQUEST(A, f) (A)->ao_flags &= ~f##_FLAG
|
||
#define AO_PENDING(A) ((A)->ao_flags & (AO_DELETE_FLAG | AO_OPTIONS_FLAG | AO_SEND_FLAG))
|
||
|
||
//* Definition of an address object search context. This is a data structure used
|
||
// when the address object table is to be read sequentially.
|
||
|
||
struct AOSearchContext {
|
||
AddrObj *asc_previous; // Previous AO found.
|
||
IPAddr asc_addr; // IPAddress to be found.
|
||
ushort asc_port; // Port to be found.
|
||
uchar asc_prot; // Protocol
|
||
uchar asc_pad; // Pad to dword boundary.
|
||
}; /* AOSearchContext */
|
||
|
||
typedef struct AOSearchContext AOSearchContext;
|
||
|
||
//* Definition of an AO request structure. There structures are used only for
|
||
// queuing delete and option set requests.
|
||
|
||
#define aor_signature 0x20524F41
|
||
|
||
struct AORequest {
|
||
#ifdef DEBUG
|
||
ulong aor_sig;
|
||
#endif
|
||
struct AORequest *aor_next; // Next pointer in chain.
|
||
uint aor_id; // ID for the request.
|
||
uint aor_length; // Length of buffer.
|
||
void *aor_buffer; // Buffer for this request.
|
||
CTEReqCmpltRtn aor_rtn; // Request complete routine for this request.
|
||
PVOID aor_context; // Request context;
|
||
}; /* AORequest */
|
||
|
||
typedef struct AORequest AORequest;
|
||
|
||
typedef struct AOMCastAddr {
|
||
struct AOMCastAddr *ama_next; // Next in list.
|
||
IPAddr ama_addr; // The address.
|
||
IPAddr ama_if; // The interface.
|
||
} AOMCastAddr;
|
||
|
||
//* External declarations for exported functions.
|
||
|
||
extern AddrObj *GetAddrObj(IPAddr LocalAddr, ushort LocalPort, uchar Prot,
|
||
AddrObj *PreviousAO);
|
||
extern AddrObj *GetNextAddrObj(AOSearchContext *SearchContext);
|
||
extern AddrObj *GetFirstAddrObj(IPAddr LocalAddr, ushort LocalPort, uchar Prot,
|
||
AOSearchContext *SearchContext);
|
||
extern TDI_STATUS TdiOpenAddress(PTDI_REQUEST Request,
|
||
TRANSPORT_ADDRESS UNALIGNED *AddrList, uint Protocol,
|
||
void *Reuse);
|
||
extern TDI_STATUS TdiCloseAddress(PTDI_REQUEST Request);
|
||
extern TDI_STATUS SetAddrOptions(PTDI_REQUEST Request, uint ID, uint OptLength,
|
||
void *Options);
|
||
extern TDI_STATUS TdiSetEvent(PVOID Handle, int Type, PVOID Handler,
|
||
PVOID Context);
|
||
extern uchar GetAddress(TRANSPORT_ADDRESS UNALIGNED *AddrList,
|
||
IPAddr *Addr, ushort *Port);
|
||
extern int InitAddr(void);
|
||
extern void ProcessAORequests(AddrObj *RequestAO);
|
||
extern void DelayDerefAO(AddrObj *RequestAO);
|
||
extern void DerefAO(AddrObj *RequestAO);
|
||
extern void FreeAORequest(AORequest *FreedRequest);
|
||
#ifdef VXD
|
||
extern AddrObj *GetIndexedAO(uint Index);
|
||
#endif
|
||
extern uint ValidateAOContext(void *Context, uint *Valid);
|
||
extern uint ReadNextAO(void *Context, void *OutBuf);
|
||
extern void InvalidateAddrs(IPAddr Addr);
|
||
|
||
extern uint MCastAddrOnAO(AddrObj *AO, IPAddr Addr);
|
||
|
||
#define GetBestAddrObj(addr, port, prot) GetAddrObj(addr, port, prot, NULL)
|
||
|
||
#define REF_AO(a) (a)->ao_usecnt++
|
||
|
||
#define DELAY_DEREF_AO(a) DelayDerefAO((a))
|
||
#define DEREF_AO(a) DerefAO((a))
|
||
#define LOCKED_DELAY_DEREF_AO(a) (a)->ao_usecnt--; \
|
||
\
|
||
if (!(a)->ao_usecnt && !AO_BUSY((a)) && AO_PENDING((a))) { \
|
||
SET_AO_BUSY((a)); \
|
||
CTEScheduleEvent(&(a)->ao_event, (a)); \
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|