102 lines
3.6 KiB
C
102 lines
3.6 KiB
C
|
// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil -*- (for GNU Emacs)
|
||
|
//
|
||
|
// Copyright (c) 1985-2000 Microsoft Corporation
|
||
|
//
|
||
|
// This file is part of the Microsoft Research IPv6 Network Protocol Stack.
|
||
|
// You should have received a copy of the Microsoft End-User License Agreement
|
||
|
// for this software along with this release; see the file "license.txt".
|
||
|
// If not, please see http://www.research.microsoft.com/msripv6/license.htm,
|
||
|
// or write to Microsoft Research, One Microsoft Way, Redmond, WA 98052-6399.
|
||
|
//
|
||
|
// Abstract:
|
||
|
//
|
||
|
// TCP send definitions.
|
||
|
//
|
||
|
|
||
|
|
||
|
#define NUM_TCP_HEADERS 32
|
||
|
#define NUM_TCP_BUFFERS 150
|
||
|
#define TCP_MAX_HDRS 0xffffffff
|
||
|
|
||
|
//#define SEND_DEBUG 1
|
||
|
|
||
|
#ifdef SEND_DEBUG
|
||
|
#define SEND_TICKS 10
|
||
|
extern KSPIN_LOCK SendUseLock;
|
||
|
extern struct TCPSendReq *SendUseList;
|
||
|
#endif
|
||
|
|
||
|
//
|
||
|
// Structure of a TCP send request.
|
||
|
//
|
||
|
#define tsr_signature 0x20525354 // 'TSR '
|
||
|
|
||
|
typedef struct TCPSendReq {
|
||
|
struct TCPReq tsr_req; // General request structure.
|
||
|
#if DBG
|
||
|
ulong tsr_sig;
|
||
|
#endif
|
||
|
uint tsr_size; // Size in bytes of data in send.
|
||
|
long tsr_refcnt; // Reference count for this send.
|
||
|
uchar tsr_flags; // Flags for this send.
|
||
|
uchar tsr_pad[3]; // Pad to dword boundary.
|
||
|
uint tsr_unasize; // Number of bytes unacked.
|
||
|
uint tsr_offset; // Offset into first buffer in chain
|
||
|
// of start of unacked data..
|
||
|
PNDIS_BUFFER tsr_buffer; // Pointer to start of unacked buffer chain.
|
||
|
PNDIS_BUFFER tsr_lastbuf; // Pointer to last buffer in chain.
|
||
|
// Valid iff we've sent directly from the
|
||
|
// buffer chain w/o doing an NdisCopyBuffer.
|
||
|
uint tsr_time; // TCP time this was received.
|
||
|
#ifdef SEND_DEBUG
|
||
|
struct TCPSendReq *tsr_next; // Debug next field.
|
||
|
uint tsr_timer; // Timer field.
|
||
|
uint tsr_cmplt; // Who completed it.
|
||
|
#endif
|
||
|
} TCPSendReq;
|
||
|
|
||
|
#define TSR_FLAG_URG 0x01 // Urgent data.
|
||
|
|
||
|
//
|
||
|
// Structure defining the context received during a send completes.
|
||
|
//
|
||
|
#define scc_signature 0x20434353 // 'SCC '
|
||
|
|
||
|
typedef struct SendCmpltContext {
|
||
|
#if DBG
|
||
|
ulong scc_sig;
|
||
|
#endif
|
||
|
TCPSendReq *scc_firstsend; // First send in this context.
|
||
|
uint scc_count; // Number of sends in count.
|
||
|
ushort scc_ubufcount; // Number of 'user' buffers in send.
|
||
|
ushort scc_tbufcount; // Number of transport buffers in send.
|
||
|
} SendCmpltContext;
|
||
|
|
||
|
extern KSPIN_LOCK TCPSendReqCompleteLock;
|
||
|
|
||
|
extern void InitSendState(struct TCB *NewTCB);
|
||
|
extern void SendSYN(struct TCB *SYNTcb, KIRQL);
|
||
|
extern void SendKA(struct TCB *KATCB, KIRQL Irql);
|
||
|
extern void SendRSTFromHeader(struct TCPHeader UNALIGNED *TCP, uint Length,
|
||
|
IPv6Addr *Dest, uint DestScopeId,
|
||
|
IPv6Addr *Src, uint SrcScopeId);
|
||
|
extern void SendACK(struct TCB *ACKTcb);
|
||
|
extern void SendRSTFromTCB(struct TCB *RSTTcb);
|
||
|
extern void GoToEstab(struct TCB *EstabTCB);
|
||
|
extern void FreeSendReq(TCPSendReq *FreedReq);
|
||
|
extern void FreeTCPHeader(PNDIS_BUFFER FreedBuffer);
|
||
|
|
||
|
extern int InitTCPSend(void);
|
||
|
extern void UnloadTCPSend(void);
|
||
|
|
||
|
extern void TCPSend(struct TCB *SendTCB, KIRQL Irql);
|
||
|
|
||
|
extern TDI_STATUS TdiSend(PTDI_REQUEST Request, ushort Flags, uint SendLength,
|
||
|
PNDIS_BUFFER SendBuffer);
|
||
|
extern uint RcvWin(struct TCB *WinTCB);
|
||
|
|
||
|
extern void ResetAndFastSend(TCB *SeqTCB, SeqNum NewSeq, uint NewCWin);
|
||
|
extern void TCPFastSend(TCB *SendTCB, PNDIS_BUFFER in_SendBuf, uint SendOfs,
|
||
|
TCPSendReq *CurSend, uint SendSize, SeqNum SendNext,
|
||
|
int in_ToBeSent);
|