windows-nt/Source/XPSP1/NT/net/sfm/atalk/sys/arap.h
2020-09-26 16:20:57 +08:00

844 lines
41 KiB
C

/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
arap.h
Abstract:
This module has defines, prototypes etc. specific to ARAP functionality
Author:
Shirish Koti
Revision History:
15 Nov 1996 Initial Version
--*/
//
// enable asserts when running checked stack on free builds
//
#if DBG
#ifdef ASSERT
#undef ASSERT
#endif
#define ASSERT(exp) \
{ \
if (!(exp)) \
{ \
DbgPrint( "\n*** Assertion failed: %s (File %s, line %ld)\n", \
(exp),__FILE__, __LINE__); \
\
DbgBreakPoint(); \
} \
}
#endif
#define ATALK_CC_METHOD(_ControlCode) ((_ControlCode) & 0x03)
//
// Possible states for the connection (State field in ARAPCONN structure)
// IMPORTANT: order of these states matters! (comparisons other than == used)
//
#define MNP_IDLE 0 // creation state, after Ndiswan Line_Up
#define MNP_REQUEST 1 // this state never reached (client-side only)
#define MNP_RESPONSE 2 // sent LR response to the client
#define MNP_UP 3 // MNP connection is in data-phase
#define MNP_LDISCONNECTING 4 // disconnect from local (user ioctl)
#define MNP_RDISC_RCVD 5 // disconnect from remote received
#define MNP_RDISCONNECTING 6 // cleanup underway because of MNP_RDISC_RCVD
#define MNP_DISCONNECTED 7 // cleanup done, waiting for Ndiswan Line_Down
//
// possible header types (from the v42 alternative procedure spec)
//
#define MNP_LR 0x1
#define MNP_LD 0x2
#define MNP_LT 0x4
#define MNP_LT_V20CLIENT 0x84
#define MNP_LA 0x5
#define MNP_LN 0x6
#define MNP_LNA 0x7
#define MNP_MINPKT_SIZE 64
#define MNP_MAXPKT_SIZE 256
#define MNP_LR_CONST1 2
// type values for the various "variable" parms
#define MNP_LR_CONST2 1
#define MNP_LR_FRAMING 2
#define MNP_LR_NUMLTFRMS 3
#define MNP_LR_INFOLEN 4
#define MNP_LR_DATAOPT 8
#define MNP_LR_V42BIS 14
#define MNP_FRMMODE_OCTET 2
#define MNP_FRMMODE_BIT 3
#define MNP_FRMTYPE_OFFSET 4
#define ARAP_DGROUP_OFFSET 2
#define ARAP_DATA_OFFSET 3
// bit 6 is set for appletalk data, is clear for arap data
#define ARAP_SFLAG_PKT_DATA 0x40
#define ARAP_SFLAG_LAST_GROUP 0x10
//
// Flags bits (in ARAPCONN structure)
//
#define MNP_OPTIMIZED_DATA 0x00000001 // MNP negotiated for optimized data
#define MNP_V42BIS_NEGOTIATED 0x00000002 // MNP negotiated v42bis compression
#define ARAP_V20_CONNECTION 0x00000004 // v2.0 if bit set, v1.0 otherwise
#define ARAP_NODE_IN_USE 0x00000008 // used while acquiring node (dynamic mode)
#define ARAP_FINDING_NODE 0x00000010 // used while acquiring node (dynamic mode)
#define ARAP_CALLBACK_MODE 0x00000020 // used if we are calling back
#define ARAP_CONNECTION_UP 0x00000040 // ARAP connection is up, data phase entered
#define ARAP_DATA_WAITING 0x00000080 // data arrived, but no irp to fill it in
#define ARAP_REMOTE_DISCONN 0x00000100 // remote side issued the disconnect
#define DISCONNECT_NO_IRP 0x00000200 // waiting for irp to tell dll about disc.
#define RETRANSMIT_TIMER_ON 0x00000400 // retransmit timer is running
#define ARAP_LINK_DOWN 0x00000800 // link went down
#define ARAP_GOING_AWAY 0x00001000 // the connection is about to be freed!
// BUGBUG: currently set to be 200ms (1 => 100 ms)
#define ARAP_TIMER_INTERVAL 2
#define ARAP_MAX_RETRANSMITS 12
#define ARAP_HALF_MAX_RETRANSMITS (ARAP_MAX_RETRANSMITS/2)
// retry time will depend on link speed (also on how many retranmits of the
// same send have happened so far), but we'll fix min (1sec) and max (5sec)
#define ARAP_MIN_RETRY_INTERVAL 10
#define ARAP_MAX_RETRY_INTERVAL 50
// our limits (in bytes) for outstanding sends that are sitting on the queue
#define ARAP_SENDQ_LOWER_LIMIT 10000
#define ARAP_SENDQ_UPPER_LIMIT 12000
// our limits (in bytes) for outstanding recvs that are sitting on the queue
#define ARAP_RECVQ_LOWER_LIMIT 20000
#define ARAP_RECVQ_UPPER_LIMIT 30000
// on low-priority sends, we wait until we collect at least these many bytes
#define ARAP_SEND_COALESCE_SIZE_LIMIT 150
// max number of SRPs we will put in a low-priority MNP send
#define ARAP_SEND_COALESCE_SRP_LIMIT 200
// on low-priority sends, we wait until so much time has passed (in 100ms units)
#define ARAP_SEND_COALESCE_TIME_LIMIT 10
// BUGBUG: adjust these numbers for optimum usage/perf
#define ARAP_SMPKT_SIZE 100
#define ARAP_MDPKT_SIZE 300
#define ARAP_LGPKT_SIZE ARAP_MAXPKT_SIZE_INCOMING+10
#define ARAP_SENDBUF_SIZE 1000
#define ARAP_LGBUF_SIZE 4000
#define ARAP_HGBUF_SIZE 8100
// LAP src byte, LAP dest byte, LAP type byte
#define ARAP_LAP_HDRSIZE 3
// 2 srplen bytes, 1 Dgroup byte
#define ARAP_HDRSIZE 3
#define ARAP_NBP_BRRQ 0x11
#define ARAP_NBP_LKRQ 0x21
// 3rd and 4th bytes in the NBP pkt are the source network bytes
#define ARAP_NBP_SRCNET_OFFSET LDDP_DGRAM_OFFSET + 2
#define ARAP_NBP_OBJLEN_OFFSET LDDP_DGRAM_OFFSET + 7
#define ARAP_FAKE_ETHNET_HDRLEN 14
#define MNP_START_FLAG_LEN 3
#define MNP_STOP_FLAG_LEN 2
#define MNP_LT_HDR_LN(_pCon) ((_pCon->Flags & MNP_OPTIMIZED_DATA)? 3 : 5)
#define ARAP_SEND_PRIORITY_HIGH 1
#define ARAP_SEND_PRIORITY_MED 2
#define ARAP_SEND_PRIORITY_LOW 3
#define MNP_OVERHD(_pConn) \
( ARAP_FAKE_ETHNET_HDRLEN + \
MNP_START_FLAG_LEN + \
MNP_LT_HDR_LN(_pConn) + \
MNP_STOP_FLAG_LEN )
#define ADD_ONE(_x) (_x) = (((_x) == 0xff) ? 0 : ((_x)+1))
// seq num on LT frame: 5th byte if it's an Optimized data phase: 7th otherwise
#define LT_SEQ_NUM(_p, _pCon) \
(((_pCon)->Flags & MNP_OPTIMIZED_DATA) ? (_p)[5] : (_p)[7])
#define LT_SEQ_OFFSET(_pCon) (((_pCon)->Flags & MNP_OPTIMIZED_DATA) ? 5: 7)
#define LT_SRP_OFFSET(_pCon) (((_pCon)->Flags & MNP_OPTIMIZED_DATA) ? 6: 8)
// this includes 2 bytes of crc bytes
#define LT_OVERHEAD(_pCon) (((_pCon)->Flags & MNP_OPTIMIZED_DATA) ? 10 : 12)
// BUGBUG modify this to include any packet in the window
#define LT_OK_TO_ACCEPT(_sq, _pCon, _ok) \
(_ok = (_sq == _pCon->MnpState.NextToReceive))
//
// basically, (a > b)? except that a,b are seq numbers and wrap at 255
// Within a window of 8 pkts either side of 0, we have special cases
// we have assumed windowsize to be 8 here. Even if a different window
// size is negotiated, this should work just fine
// BUGBUG: should we use a bigger range, just to be sure?
//
#define LT_GREATER_THAN(_a,_b,_result) \
{ \
if ( (_a) >= 248 && (_b) >= 0 && (_b) < 8 ) \
{ \
_result = FALSE; \
} \
else if ( (_a) >= 0 && (_a) < 8 && (_b) >= 248 ) \
{ \
_result = TRUE; \
} \
else \
{ \
_result = ((_a) > (_b)); \
} \
}
#define LT_LESS_OR_EQUAL(_x,_y,_rslt) \
{ \
LT_GREATER_THAN(_x,_y,_rslt); \
_rslt = !(_rslt); \
}
#define LT_MIN_LENGTH(_pCon) (((_pCon)->Flags & MNP_OPTIMIZED_DATA) ? 6 : 8)
#define LA_MIN_LENGTH(_pCon) (((_pCon)->Flags & MNP_OPTIMIZED_DATA) ? 7 : 9)
#define LN_MIN_LENGTH 8
// seq num on LA frame: 5th byte if it's an Optimized data phase: 7th otherwise
#define LA_SEQ_NUM(_p, _pCon) \
(((_pCon)->Flags & MNP_OPTIMIZED_DATA) ? (_p)[5] : (_p)[7])
// rcv credit on LA frame: 6th byte if it's an Optimized data phase: 8th otherwise
#define LA_CREDIT(_p, _pCon) \
(((_pCon)->Flags & MNP_OPTIMIZED_DATA) ? (_p)[6] : (_p)[8])
// overhead for LT (optimized): 8 = 3(start flag)+3(LT hdr)+2(stop flag)
// (nonoptimized): 10 = 3(start flag)+5(LT hdr)+2(stop flag)
#define LN_ATTN_TYPE(_p) ((_p)[7])
#define LN_ATTN_SEQ(_p) ((_p)[4])
#define LN_DESTRUCTIVE 1
#define LN_NON_D_E 2
#define LN_NON_D_NON_E 3
// The states that the stack can assume (with respect to ARAP)
//
// ARAP_STATE_INIT -- arap engine (dll) hasn't open the stack
// ARAP_STATE_INACTIVE_WAITING -- stack inactive, but engine not notified yet
// ARAP_STATE_INACTIVE -- stack inactive, and engine notified
// ARAP_STATE_ACTIVE_WAITING -- stack ready, engine not notified yet (select not available)
// ARAP_STATE_ACTIVE -- stack ready, engine notified about it (via select)
//
#define ARAP_STATE_INACTIVE_WAITING 1
#define ARAP_STATE_INACTIVE 2
#define ARAP_STATE_ACTIVE_WAITING 3
#define ARAP_STATE_ACTIVE 4
#define ARAP_PORT_READY ( (AtalkDefaultPort != NULL) && \
(AtalkDefaultPort->pd_Flags & PD_ACTIVE) && \
(RasPortDesc != NULL) && \
(RasPortDesc->pd_Flags & PD_ACTIVE) )
#define ARAP_PNP_IN_PROGRESS ( ((AtalkDefaultPort != NULL) && \
(AtalkDefaultPort->pd_Flags & PD_PNP_RECONFIGURE)) || \
((RasPortDesc != NULL) && \
(RasPortDesc->pd_Flags & PD_PNP_RECONFIGURE)) )
#define ARAP_INVALID_CONTEXT (PVOID)0x01020304
#define ARAP_GET_SNIFF_IRP(_pIrp) \
{ \
KIRQL _OldIrqlX; \
\
ACQUIRE_SPIN_LOCK(&ArapSpinLock, &_OldIrqlX); \
*(_pIrp) = ArapSniffIrp; \
ArapSniffIrp = NULL; \
RELEASE_SPIN_LOCK(&ArapSpinLock, _OldIrqlX); \
}
#if DBG
#define ARAP_COMPLETE_IRP(_pIrp, _dwBytesToDll, _status, _returnStatus) \
{ \
PIO_STACK_LOCATION _pIrpSp; \
ULONG _IoControlCode; \
\
_pIrpSp = IoGetCurrentIrpStackLocation(_pIrp); \
_IoControlCode = _pIrpSp->Parameters.DeviceIoControl.IoControlCode; \
\
_pIrp->IoStatus.Information = _dwBytesToDll; \
_pIrp->IoStatus.Status = _status; \
\
DBGPRINT(DBG_COMP_RAS, DBG_LEVEL_INFO, \
("Arap: completing pIrp %lx, Ioctl %lx, Status=%ld, DataLen=%ld\n", \
_pIrp,_IoControlCode,_status,_dwBytesToDll)); \
\
_pIrp->CancelRoutine = NULL; \
*_returnStatus = _pIrp->IoStatus.Status; \
IoCompleteRequest(_pIrp,IO_NETWORK_INCREMENT); \
}
#else
#define ARAP_COMPLETE_IRP(_pIrp, _dwBytesToDll, _status, _returnStatus) \
{ \
PIO_STACK_LOCATION _pIrpSp; \
\
_pIrpSp = IoGetCurrentIrpStackLocation(_pIrp); \
\
_pIrp->IoStatus.Information = _dwBytesToDll; \
_pIrp->IoStatus.Status = _status; \
\
\
_pIrp->CancelRoutine = NULL; \
*_returnStatus= _pIrp->IoStatus.Status; \
IoCompleteRequest(_pIrp,IO_NETWORK_INCREMENT); \
}
#endif
#define ARAP_SET_NDIS_CONTEXT(_pSndBuf,_pSndContxt) \
{ \
PPROTOCOL_RESD _pResd; \
PNDIS_PACKET _nPkt; \
\
_nPkt = (_pSndBuf)->sb_BuffHdr.bh_NdisPkt; \
_pResd = (PPROTOCOL_RESD)&_nPkt->ProtocolReserved; \
\
_pResd->Send.pr_Port = RasPortDesc; \
_pResd->Send.pr_SendCompletion = ArapNdisSendComplete; \
_pResd->Send.pr_BufferDesc = (PBUFFER_DESC)(_pSndBuf); \
if ((_pSndContxt) != NULL) \
{ \
RtlCopyMemory(&_pResd->Send.pr_SendInfo, \
(_pSndContxt), \
sizeof(SEND_COMPL_INFO)); \
} \
else \
{ \
RtlZeroMemory(&_pResd->Send.pr_SendInfo, sizeof(SEND_COMPL_INFO)); \
} \
}
//
// we take a very simplistic view!
//
#define ARAP_ADJUST_RECVCREDIT(_pConn) \
{ \
if (_pConn->RecvsPending >= ARAP_RECVQ_UPPER_LIMIT) \
{ \
DBGPRINT(DBG_COMP_RAS, DBG_LEVEL_ERR, \
("ARAP (%lx): recv credit dropped to 0 (%d)\n",_pConn,_pConn->RecvsPending));\
\
_pConn->MnpState.RecvCredit = 0; \
} \
else if (_pConn->RecvsPending >= ARAP_RECVQ_LOWER_LIMIT) \
{ \
DBGPRINT(DBG_COMP_RAS, DBG_LEVEL_ERR, \
("ARAP (%lx): recv credit dropped to 1 (%d)\n",_pConn,_pConn->RecvsPending));\
\
_pConn->MnpState.RecvCredit = 1; \
} \
else \
{ \
_pConn->MnpState.RecvCredit = _pConn->MnpState.WindowSize; \
} \
}
#if DBG
#define ARAP_GET_RIGHTSIZE_RCVBUF(_size, _ppNewBuf) \
{ \
UCHAR _BlkId; \
PARAPBUF _pRcvBuf; \
USHORT _BufSize; \
DWORD _Signature; \
\
*(_ppNewBuf) = NULL; \
_pRcvBuf = NULL; \
\
if ((_size) <= ARAP_SMPKT_SIZE) \
{ \
_BlkId = BLKID_ARAP_SMPKT; \
_BufSize = ARAP_SMPKT_SIZE; \
_Signature = ARAPSMPKT_SIGNATURE; \
} \
else if ((_size) <= ARAP_MDPKT_SIZE) \
{ \
_BlkId = BLKID_ARAP_MDPKT; \
_BufSize = ARAP_MDPKT_SIZE; \
_Signature = ARAPMDPKT_SIGNATURE; \
} \
else if ((_size) <= ARAP_LGPKT_SIZE) \
{ \
_BlkId = BLKID_ARAP_LGPKT; \
_BufSize = ARAP_LGPKT_SIZE; \
_Signature = ARAPLGPKT_SIGNATURE; \
} \
else if ((_size) <= ARAP_LGBUF_SIZE) \
{ \
_BlkId = BLKID_ARAP_LGBUF; \
_BufSize = ARAP_LGBUF_SIZE; \
_Signature = ARAPLGBUF_SIGNATURE; \
} \
else \
{ \
_BlkId = ARAP_UNLMTD_BUFF_ID; \
_BufSize = (USHORT)(_size); \
_Signature = ARAPUNLMTD_SIGNATURE; \
} \
\
if (_BlkId == ARAP_UNLMTD_BUFF_ID) \
{ \
if ((_size) > 5000) \
{ \
DBGPRINT(DBG_COMP_RAS, DBG_LEVEL_ERR, \
("Arap: allocating %ld bytes rcv buf\n",_size)); \
} \
\
_pRcvBuf = (PARAPBUF)AtalkAllocMemory((_size) + sizeof(ARAPBUF)); \
} \
else \
{ \
_pRcvBuf = (PARAPBUF)AtalkBPAllocBlock(_BlkId); \
} \
\
if (_pRcvBuf != NULL) \
{ \
_pRcvBuf->Signature = _Signature; \
_pRcvBuf->BlockId = _BlkId; \
_pRcvBuf->BufferSize = _BufSize; \
_pRcvBuf->DataSize = 0; \
_pRcvBuf->CurrentBuffer = &(_pRcvBuf->Buffer[0]); \
*(_ppNewBuf) = _pRcvBuf; \
} \
}
#define ARAP_FREE_RCVBUF(_pBuf) \
{ \
ASSERT( (_pBuf->Signature == ARAPSMPKT_SIGNATURE) || \
(_pBuf->Signature == ARAPMDPKT_SIGNATURE) || \
(_pBuf->Signature == ARAPLGPKT_SIGNATURE) || \
(_pBuf->Signature == ARAPLGBUF_SIGNATURE) || \
(_pBuf->Signature == ARAPUNLMTD_SIGNATURE) ); \
\
_pBuf->Signature -= 0x10210000; \
if (_pBuf->BlockId == ARAP_UNLMTD_BUFF_ID) \
{ \
AtalkFreeMemory(_pBuf); \
} \
else \
{ \
AtalkBPFreeBlock(_pBuf); \
} \
}
#define ARAP_CHECK_RCVQ_INTEGRITY(_pConn) \
{ \
ASSERT( (DbgChkRcvQIntegrity(_pConn)) ); \
}
#define MNP_DBG_TRACE(_pConn,_Seq,_FrmType) \
{ \
ArapDbgMnpHist(_pConn,_Seq,(_FrmType)); \
} \
#define ARAP_DBG_TRACE(_pConn,_Loc,_Ptr,_D1,_D2,_D3) \
{ \
ArapDbgTrace(_pConn,_Loc,_Ptr,_D1,_D2,_D3); \
}
#define ARAP_DUMP_DBG_TRACE(_pConn) ArapDumpSniffInfo(_pConn)
#else
#define ARAP_GET_RIGHTSIZE_RCVBUF(_size, _ppNewBuf) \
{ \
UCHAR _BlkId; \
PARAPBUF _pRcvBuf; \
USHORT _BufSize; \
\
*(_ppNewBuf) = NULL; \
_pRcvBuf = NULL; \
\
if ((_size) <= ARAP_SMPKT_SIZE) \
{ \
_BlkId = BLKID_ARAP_SMPKT; \
_BufSize = ARAP_SMPKT_SIZE; \
} \
else if ((_size) <= ARAP_MDPKT_SIZE) \
{ \
_BlkId = BLKID_ARAP_MDPKT; \
_BufSize = ARAP_MDPKT_SIZE; \
} \
else if ((_size) <= ARAP_LGPKT_SIZE) \
{ \
_BlkId = BLKID_ARAP_LGPKT; \
_BufSize = ARAP_LGPKT_SIZE; \
} \
else if ((_size) <= ARAP_LGBUF_SIZE) \
{ \
_BlkId = BLKID_ARAP_LGBUF; \
_BufSize = ARAP_LGBUF_SIZE; \
} \
else \
{ \
_BlkId = ARAP_UNLMTD_BUFF_ID; \
_BufSize = (USHORT)(_size); \
} \
\
if (_BlkId == ARAP_UNLMTD_BUFF_ID) \
{ \
_pRcvBuf = (PARAPBUF)AtalkAllocMemory((_size) + sizeof(ARAPBUF)); \
} \
else \
{ \
_pRcvBuf = (PARAPBUF)AtalkBPAllocBlock(_BlkId); \
} \
\
if (_pRcvBuf != NULL) \
{ \
_pRcvBuf->BlockId = _BlkId; \
_pRcvBuf->BufferSize = _BufSize; \
_pRcvBuf->DataSize = 0; \
_pRcvBuf->CurrentBuffer = &(_pRcvBuf->Buffer[0]); \
*(_ppNewBuf) = _pRcvBuf; \
} \
}
#define ARAP_FREE_RCVBUF(_pBuf) \
{ \
if (_pBuf->BlockId == ARAP_UNLMTD_BUFF_ID) \
{ \
AtalkFreeMemory(_pBuf); \
} \
else \
{ \
AtalkBPFreeBlock(_pBuf); \
} \
}
#define ARAP_CHECK_RCVQ_INTEGRITY(_pConn)
#define MNP_DBG_TRACE(_pConn,_Seq,_FrmType)
#define ARAP_DBG_TRACE(_pConn,_Loc,_Ptr,_D1,_D2,_D3)
#define ARAP_DUMP_DBG_TRACE(_pConn)
#endif // #if DBG
#define ARAP_BYTES_ON_RECVQ(_pConn,_BytesOnQ) \
{ \
DWORD _BytesSoFar=0; \
PLIST_ENTRY _pList; \
PARAPBUF _pArapBuf; \
\
*(_BytesOnQ) = 0; \
\
_pList = _pConn->ReceiveQ.Flink; \
while (_pList != &_pConn->ReceiveQ) \
{ \
_pArapBuf = CONTAINING_RECORD(_pList, ARAPBUF, Linkage); \
_BytesSoFar += _pArapBuf->DataSize; \
\
_pList = _pArapBuf->Linkage.Flink; \
} \
\
*(_BytesOnQ) = _BytesSoFar; \
}
#if DBG
#define ARAPTRACE(_x) DBGPRINT(DBG_COMP_RAS, DBG_LEVEL_INFO, _x)
#define DBGDUMPBYTES(_a,_b,_c,_d) DbgDumpBytes(_a,_b,_c,_d)
#define DBGTRACK_SEND_SIZE(_pConn,_Size) DbgTrackInfo(_pConn,_Size,1)
#else
#define ARAPTRACE(_x)
#define DBGDUMPBYTES(_a,_b,_c,_d)
#define DBGTRACK_SEND_SIZE(_pConn,_Size)
#endif
#define ARAPACTION_COMPLETE_IRP 1
#define ARAPACTION_CALL_COMPLETION 2
typedef struct _ADDRMGMT
{
struct _ADDRMGMT * Next;
USHORT Network;
BYTE NodeBitMap[32]; // 255 nodes per net
}ADDRMGMT, *PADDRMGMT;
typedef struct _ARAPGLOB
{
DWORD LowVersion;
DWORD HighVersion;
DWORD MnpInactiveTime; // tell dll after Mnp is inactive for this time
BOOLEAN V42bisEnabled; //
BOOLEAN SmartBuffEnabled; //
BOOLEAN NetworkAccess; // if FALSE, no routing (only this machine)
BOOLEAN DynamicMode; // we want the stack to get node address
NETWORKRANGE NetRange;
PADDRMGMT pAddrMgmt; // addr allocation to clients (in static mode)
USHORT OurNetwkNum; // Network number of our default port
BYTE MaxLTFrames; // max LT frames outstanding (rcv window)
BOOLEAN SniffMode; // if TRUE, all pkts will be given to ARAP to "sniff"
BOOLEAN RouteAdded; // if in static mode, have we added a route?
} ARAPGLOB, *PARAPGLOB;
typedef struct _ARAPSTATS
{
DWORD SendPreCompMax; // largest packet we have sent (before comp)
DWORD SendPostCompMax; // largest packet we have sent (after comp)
DWORD SendPreCompMin; // smallest packet we have sent (before comp)
DWORD SendPostCompMin; // smallest packet we have sent (after comp)
DWORD RecvPostDecompMax; // largest packet we have received (after decomp)
DWORD RecvPostDecomMin; // smallest packet we have received (after decomp)
} ARAPSTATS, *PARAPSTATS;
typedef VOID (*PARAP_SEND_COMPLETION)(
struct _MNPSENDBUF * pMnpSendBuf,
DWORD Status
);
typedef struct _MNPSTATE
{
// sequence numbers when we are receiving
BYTE NextToReceive; // next frame we expect to receive
BYTE LastSeqRcvd; // seq num of last pkt we successfully rcvd
BYTE LastAckSent; // seq num for which we sent the last ack
BYTE UnAckedRecvs; // how many packets we've recvd but not acked yet
BYTE RecvCredit; // how many more we can receive
BYTE HoleInSeq; // TRUE when we get a hole in receive sequence
BYTE ReceivingDup; // TRUE the moment we start receiving dup(s)
BYTE FirstDupSeq; // seq num where we started getting dup's
BYTE DupSeqBitMap; // bitmap of which seq nums we've got dups for
// BUGBUG: if we ever want windowsize of more than 8,
// we must make this a DWORD or something!
// sequence numbers when we are sending
BYTE LastAckRcvd; // last frame we have received ack for
BYTE NextToSend; // next frame we will send
BYTE SendCredit; // how many more we can send
BYTE UnAckedSends; // basically, number of sends on retransmitQ
BYTE MustRetransmit; // TRUE when we want retransmission to occur
BYTE RetransmitMode; // TRUE if we are in retransmit mode
// when we are processing the receives
BYTE NextToProcess; // next sequence we will process
BYTE MustAck; // if TRUE, send ack
// static info that we negotiated at connection time
BYTE WindowSize; // max pkts we can buffer (parm k)
BYTE UnAckedLimit; // num of unacked pkts after which we must ack
USHORT MaxPktSize; // N401 parm: this can be max 256
BYTE SynByte;
BYTE DleByte;
BYTE StxByte;
BYTE EtxByte;
BYTE LTByte;
} MNPSTATE, *PMNPSTATE;
typedef struct _ARAPDBGHISTORY
{
USHORT TimeStamp; // when did this happen (relative to prev event)
USHORT Location; // where did this happen
BYTE Info[1]; // info specific to what/where happened
} ARAPDBGHISTORY, *PARAPDBGHISTORY;
#define DBG_HISTORY_BUF_SIZE 4000
typedef struct _DBGMNPHIST
{
DWORD TimeStamp;
DWORD FrameInfo;
} DBGMNPHIST, *PDBGMNPHIST;
#define DBG_MNP_HISTORY_SIZE 80
typedef struct _ARAPCONN
{
LIST_ENTRY Linkage;
#if DBG
DWORD Signature;
#endif
DWORD State; // connected, connecting etc
DWORD RefCount; // memory freed when this goes to 0
MNPSTATE MnpState; // MNP state info
DWORD Flags; // general flag kind of info
ATALK_NODEADDR NetAddr; // network address of the Arap client
PVOID pDllContext; // Araps context
PIRP pIoctlIrp; // irp sent down by the ARAP dll
PIRP pRecvIoctlIrp; // receive irp from ARAP dll
LIST_ENTRY MiscPktsQ; // pkts other than LT queued here
LIST_ENTRY ReceiveQ; // data indicated but not yet processed
LIST_ENTRY ArapDataQ; // data that's waiting for an irp from Arap
LIST_ENTRY HighPriSendQ; // high priority sends
LIST_ENTRY MedPriSendQ; // medium priority sends
LIST_ENTRY LowPriSendQ; // low priority sends
LIST_ENTRY SendAckedQ; // got ack, need to complete this send
LIST_ENTRY RetransmitQ; // data sent out, but not acked yet
DWORD SendsPending; // unacked/unsent sends (bytes) pending
DWORD RecvsPending; // rcvs (bytes) yet to be delivered
TIMERLIST RetryTimer; // the 401 timer (retransmit timer)
LONG LATimer; // the 402 timer
LONG T402Duration; // timer value for the 402 timer
LONG InactivityTimer; // the 403 timer
LONG T403Duration; // timer value for the 403 timer
LONG FlowControlTimer; // the 404 timer
LONG T404Duration; // timer value for the 404 timer
BYTE NdiswanHeader[14]; // 14 byte ethernet-like header
BYTE BlockId; // basically what size sends to use
BYTE UnUsed;
ULONG LinkSpeed; // link speed in 100 bps units
STAT_INFO StatInfo; // statistics for this connection
LONG SendRetryTime; // send timer to fire after how much time
LONG SendRetryBaseTime; // send timer interval at init
ATALK_SPIN_LOCK SpinLock;
KEVENT NodeAcquireEvent; // use while acquiring node (dynamic mode)
LONG LastNpbBrrq; // time we sent out a NBP_BRRQ pkt last
v42bis_connection_t *pV42bis;
#if DBG
LARGE_INTEGER LastTimeStamp; // when did we last record history
DWORD DbgMnpIndex;
DBGMNPHIST DbgMnpHist[DBG_MNP_HISTORY_SIZE];
PBYTE pDbgTraceBuffer; // where the sniff buffer starts
PBYTE pDbgCurrPtr; // currently pointing here in sniff buf
DWORD SniffedBytes; // how much does sniff buffer contain
#endif
} ARAPCONN, *PARAPCONN;
typedef struct _ARAPSNIFF
{
DWORD Signature;
DWORD TimeStamp;
USHORT Length;
BYTE StartSeq;
BYTE EndSeq;
DWORD UncompBytesSoFar;
} ARAPSNIFF, *PARAPSNIFF;
typedef struct _ARAPQITEM
{
WORK_QUEUE_ITEM WorkQItem;
DWORD Action;
PVOID Context1;
PVOID Context2;
} ARAPQITEM, *PARAPQITEM;
#if DBG
#define DBG_ARAP_CHECK_PAGED_CODE() \
{ \
if (AtalkPgLkSection[ARAP_SECTION].ls_LockCount <= 0) \
{ \
DbgPrint("Arap code section not locked, count=%d\n", \
AtalkPgLkSection[ARAP_SECTION].ls_LockCount); \
ASSERT(0); \
} \
}
#define DBG_PPP_CHECK_PAGED_CODE() \
{ \
if (AtalkPgLkSection[PPP_SECTION].ls_LockCount <= 0) \
{ \
DbgPrint("PPP code section not locked, count=%d\n", \
AtalkPgLkSection[PPP_SECTION].ls_LockCount); \
ASSERT(0); \
} \
}
#else
#define DBG_ARAP_CHECK_PAGED_CODE()
#define DBG_PPP_CHECK_PAGED_CODE()
#endif
#define ARAP_ID_BYTE1 0xAA
#define ARAP_ID_BYTE2 0xBB
#define PPP_ID_BYTE1 0xCC
#define PPP_ID_BYTE2 0xDD
typedef struct _ATCPCONN
{
LIST_ENTRY Linkage;
#if DBG
DWORD Signature;
#endif
DWORD Flags; // general flag kind of info
DWORD RefCount; // memory freed when this goes to 0
ATALK_NODEADDR NetAddr; // network address of the Arap client
PVOID pDllContext; // Araps context
BYTE NdiswanHeader[14]; // 14 byte ethernet-like header
ATALK_SPIN_LOCK SpinLock;
KEVENT NodeAcquireEvent; // use while acquiring node (dynamic mode)
} ATCPCONN, *PATCPCONN;
#define ATCP_NODE_IN_USE 0x1
#define ATCP_FINDING_NODE 0x2
#define ATCP_SUPPRESS_RTMP 0x4
#define ATCP_SUPPRESS_ALLBCAST 0x8
#define ATCP_DLL_SETUP_DONE 0x10
#define ATCP_LINE_UP_DONE 0x20
#define ATCP_CONNECTION_UP 0x40
#define ATCP_CONNECTION_CLOSING 0x80
// globals
extern struct _PORT_DESCRIPTOR *RasPortDesc;
// spinlock to guard the all the Arap global things
extern ATALK_SPIN_LOCK ArapSpinLock;
// global configuration info
extern ARAPGLOB ArapGlobs;
extern PIRP ArapSelectIrp;
extern DWORD ArapConnections;
extern DWORD ArapStackState;
extern DWORD PPPConnections;
#if DBG
extern PIRP ArapSniffIrp;
extern ARAPSTATS ArapStatistics;
extern DWORD ArapDumpLevel;
extern DWORD ArapDumpLen;
extern DWORD ArapDbgMnpSendSizes[30];
extern DWORD ArapDbgMnpRecvSizes[30];
extern DWORD ArapDbgArapSendSizes[15];
extern DWORD ArapDbgArapRecvSizes[15];
extern LARGE_INTEGER ArapDbgLastTraceTime;
extern UCHAR ArapDbgLRPacket[30];
#endif