summaryrefslogtreecommitdiffstats
path: root/private/ntos/tdi/tcpip/tcp/tcp.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--private/ntos/tdi/tcpip/tcp/tcp.h426
1 files changed, 426 insertions, 0 deletions
diff --git a/private/ntos/tdi/tcpip/tcp/tcp.h b/private/ntos/tdi/tcpip/tcp/tcp.h
new file mode 100644
index 000000000..d88d3443e
--- /dev/null
+++ b/private/ntos/tdi/tcpip/tcp/tcp.h
@@ -0,0 +1,426 @@
+/********************************************************************/
+/** Microsoft LAN Manager **/
+/** Copyright(c) Microsoft Corp., 1990-1993 **/
+/********************************************************************/
+/* :ts=4 */
+
+#ifndef _TCP_INCLUDED_
+#define _TCP_INCLUDED_
+
+//** TCP.H - TCP definitions.
+//
+// This file contains the definitions of TCP protocol specific options, such
+// as the sequence numbers and TCB.
+//
+
+#define PROTOCOL_TCP 6
+#define MAX_REMOTE_MSS 536
+
+//* Timer stuff. We keep timers as ticks.
+#define MS_PER_TICK 100
+#define MS_TO_TICKS(m) ((m) / MS_PER_TICK)
+#define MIN_RETRAN_TICKS 3
+
+#define DEL_ACK_TICKS 2
+// Define MAX_REXMIT_TO to be number of ticks in 2MSL (=240 seconds)
+
+#define MAX_REXMIT_TO ((ushort)FinWait2TO)
+
+#define SWS_TO MS_TO_TICKS(5000)
+
+#define FIN_WAIT2_TO 240
+#define PUSH_TO MS_TO_TICKS(500)
+
+typedef ulong TCP_TIME;
+#define MAX_CONN_TO_TICKS 0xffff
+#define INFINITE_CONN_TO(t) ((t) == 0)
+#define TCP_TIME_TO_TICKS(t) (((t)/MS_PER_TICK)+1)
+
+
+// Sequence numbers are kept as signed 32 bit quantities, with macros
+// defined to do wraparound comparisons on them.
+
+typedef int SeqNum; // A sequence number.
+
+//* Macros for comparions on sequence numbers.
+
+#define SEQ_GT(a, b) (((a) - (b)) > 0)
+#define SEQ_GTE(a, b) (((a) - (b)) >= 0)
+#define SEQ_LT(a, b) (((a) - (b)) < 0)
+#define SEQ_LTE(a, b) (((a) - (b)) <= 0)
+#define SEQ_EQ(a, b) ((a) == (b))
+
+//* The TCB - transport control block structure. This is the
+// structure that contains all of the state for the transport
+// connection, including sequence numbers, flow control information,
+// pending sends and receives, etc.
+
+#define tcb_signature 0x20424354 // 'TCB '
+
+struct TCB {
+
+#ifdef DEBUG
+ ulong tcb_sig; // Debug signature.
+#endif
+ struct TCB *tcb_next; // Next pointer in TCB table.
+ DEFINE_LOCK_STRUCTURE(tcb_lock)
+ // Send sequence variables.
+ SeqNum tcb_senduna; // Sequence number of first unack'd
+ // data.
+ SeqNum tcb_sendnext; // Sequence number of next byte to
+ // send.
+ SeqNum tcb_sendmax; // Max value of sendnext this
+ // epoch.
+ uint tcb_sendwin; // Send window.
+ uint tcb_unacked; // Total number of bytes of unacked
+ // data.
+ uint tcb_maxwin; // Max send window seen.
+ uint tcb_cwin; // Congestion window.
+ uint tcb_ssthresh; // Slow start threshold.
+ uint tcb_phxsum; // Precomputed pseudo-header xsum.
+ struct TCPSendReq *tcb_cursend; // Current send in use.
+ PNDIS_BUFFER tcb_sendbuf; // Current buffer chain being sent.
+ uint tcb_sendofs; // Offset into start of chain.
+ uint tcb_sendsize; // Number of bytes unsent in current
+ // send.
+ Queue tcb_sendq; // Queue of send requests.
+
+ // Receive sequence variables.
+ SeqNum tcb_rcvnext; // Next byte we expect to receive.
+ int tcb_rcvwin; // Receive window we're offering.
+ SeqNum tcb_sendwl1; // Window update sequence number.
+ SeqNum tcb_sendwl2; // Window update ack number.
+ struct TCPRcvReq *tcb_currcv; // Current receive buffer.
+ uint tcb_indicated; // Bytes of data indicated.
+ uint tcb_flags; // Flags for this TCB.
+ uint tcb_fastchk; // Fast receive path check field.
+ uint (*tcb_rcvhndlr)(struct TCB *, uint,
+ struct IPRcvBuf *, uint Size);
+ // Addressing info.
+ IPAddr tcb_daddr; // Destination IP address.
+ IPAddr tcb_saddr; // Source IP address.
+ ushort tcb_dport; // Destination port.
+ ushort tcb_sport; // Source port.
+
+ ushort tcb_mss; // MSS for this connection.
+ ushort tcb_rexmit; // Rexmit value.
+ uint tcb_refcnt; // Reference count for TCB.
+ SeqNum tcb_rttseq; // Sequence number being measured
+ // for RTT.
+
+ // Retransmit timer information. These are stored as ticks, where by
+ // default each tick is 100ms.
+ ushort tcb_smrtt; // Smoothed rtt value.
+ ushort tcb_delta; // Delta value.
+
+ ushort tcb_remmss; // MSS advertised by peer.
+ uchar tcb_slowcount; // Count of reasons why we're on
+ // the slow path.
+ uchar tcb_pushtimer; // The 'push' timer.
+
+ // State information.
+ uchar tcb_state; // State of this TCB.
+ uchar tcb_rexmitcnt; // Count of rexmits on this TCB.
+ uchar tcb_pending; // Pending actions on this TCB.
+ uchar tcb_kacount; // Count of keep alive probes sent.
+ IP_STATUS tcb_error; // Last error we heard about from
+ // IP.
+
+ uint tcb_rtt; // Current round trip time TS.
+
+ ushort tcb_rexmittimer; // Timer for rexmit.
+ ushort tcb_delacktimer; // Timer for delayed ack.
+
+
+ uint tcb_defaultwin; // Default rcv. window.
+ uint tcb_alive; // Keep alive time value.
+
+ struct TCPRAHdr *tcb_raq; // Reassembly queue.
+ struct TCPRcvReq *tcb_rcvhead; // Head of recv. buffer queue.
+ struct TCPRcvReq *tcb_rcvtail; // Tail of recv. buffer queue.
+ uint tcb_pendingcnt; // Bytes waiting to be received.
+ struct IPRcvBuf *tcb_pendhead; // Head of pending recv. queue.
+ struct IPRcvBuf *tcb_pendtail; // Tail of pending recv. queue.
+
+ struct TCPConnReq *tcb_connreq; // Connection-type request for
+ // this connection.
+ void *tcb_conncontext; // Connection context for this
+ // connection.
+
+ uint tcb_bcountlow; // Low part of byte count.
+ uint tcb_bcounthi; // High part of bytecount.
+ uint tcb_totaltime; // Total number of ticks spent
+ // sending.
+ struct TCB *tcb_aonext; // Next pointer on AddrObj.
+ struct TCPConn *tcb_conn; // Back pointer to conn for TCB.
+ Queue tcb_delayq; // Queue linkage for delay queue.
+ uchar tcb_closereason; // Reason we're closing.
+ uchar tcb_bhprobecnt; // BH probe count.
+ ushort tcb_swstimer; // Timer for SWS override.
+ void *tcb_rcvind; // Receive indication handler.
+ void *tcb_ricontext; // Receive indication context.
+ // Miscellaneous info, for IP.
+ IPOptInfo tcb_opt; // Option information.
+ RouteCacheEntry *tcb_rce; // RCE for this connection.
+ struct TCPConnReq *tcb_discwait; // Disc-Wait req., if there is one.
+ struct TCPRcvReq *tcb_exprcv; // Head of expedited recv. buffer
+ // queue.
+ struct IPRcvBuf *tcb_urgpending; // Urgent data queue.
+ uint tcb_urgcnt; // Byte count of data on urgent q.
+ uint tcb_urgind; // Urgent bytes indicated.
+ SeqNum tcb_urgstart; // Start of urgent data.
+ SeqNum tcb_urgend; // End of urgent data.
+ uint tcb_walkcount; // Count of number of people
+ // 'walking' this TCB.
+#if FAST_RETRANSMIT
+ ushort tcb_dup; // For Fast recovery algorithm
+ ushort tcb_force; // Force next send after fast send
+#endif
+
+};
+
+//* Definitions for TCP states.
+#define TCB_CLOSED 0 // Closed.
+#define TCB_LISTEN 1 // Listening.
+#define TCB_SYN_SENT 2 // SYN Sent.
+#define TCB_SYN_RCVD 3 // SYN received.
+#define TCB_ESTAB 4 // Established.
+#define TCB_FIN_WAIT1 5 // FIN-WAIT-1
+#define TCB_FIN_WAIT2 6 // FIN-WAIT-2
+#define TCB_CLOSE_WAIT 7 // Close waiting.
+#define TCB_CLOSING 8 // Closing state.
+#define TCB_LAST_ACK 9 // Last ack state.
+#define TCB_TIME_WAIT 10 // Time wait state.
+
+typedef struct TCB TCB;
+
+#define SYNC_STATE(s) ((s) > TCB_SYN_RCVD)
+#define GRACEFUL_CLOSED_STATE(s) ((s) >= TCB_LAST_ACK)
+#define DATA_RCV_STATE(s) ((s) >= TCB_ESTAB && (s) <= TCB_FIN_WAIT2)
+#define DATA_SEND_STATE(s) ((s) == TCB_ESTAB || (s) == TCB_CLOSE_WAIT)
+
+//* Definitions for flags.
+#define WINDOW_SET 0x00000001 // Window explictly set.
+#define CLIENT_OPTIONS 0x00000002 // Have client IP options on conn.
+#define CONN_ACCEPTED 0x00000004 // Connection was accepted.
+#define ACTIVE_OPEN 0x00000008 // Connection came from an active
+ // open.
+#define DISC_NOTIFIED 0x00000010 // Client has been notified of a
+ // disconnect.
+#define IN_DELAY_Q 0x00000020 // We're in the delayed action Q.
+#define RCV_CMPLTING 0x00000040 // We're completeing rcvs.
+#define IN_RCV_IND 0x00000080 // We're calling a rcv. indicate
+ // handler.
+#define NEED_RCV_CMPLT 0x00000100 // We need to have recvs. completed.
+#define NEED_ACK 0x00000200 // We need to send an ACK.
+#define NEED_OUTPUT 0x00000400 // We need to output.
+
+#define DELAYED_FLAGS (NEED_RCV_CMPLT | NEED_ACK | NEED_OUTPUT)
+
+
+#define ACK_DELAYED 0x00000800 // We've delayed sending an ACK.
+
+#define PMTU_BH_PROBE 0x00001000 // We're probing for a PMTU BH.
+#define BSD_URGENT 0x00002000 // We're using BSD urgent semantics.
+#define IN_DELIV_URG 0x00004000 // We're in the DeliverUrgent routine.
+#define URG_VALID 0x00008000 // We've seen urgent data, and
+ // the urgent data fields are valid.
+
+#define FIN_NEEDED 0x00010000 // We need to send a FIN.
+#define NAGLING 0x00020000 // We are using Nagle's algorithm.
+#define IN_TCP_SEND 0x00040000 // We're in TCPSend.
+#define FLOW_CNTLD 0x00080000 // We've received a zero window
+ // from our peer.
+#define DISC_PENDING 0x00100000 // A disconnect notification is
+ // pending.
+#define TW_PENDING 0x00200000 // We're waiting to finish going
+ // to TIME-WAIT.
+#define FORCE_OUTPUT 0x00400000 // Output is being forced.
+#define FORCE_OUT_SHIFT 22 // Shift to get FORCE_OUTPUT into
+ // low bit.
+#define SEND_AFTER_RCV 0x00800000 // We need to send after we get out
+ // of recv.
+#define GC_PENDING 0x01000000 // A graceful close is pending.
+#define KEEPALIVE 0x02000000 // Doing keepalives on this TCB.
+#define URG_INLINE 0x04000000 // Urgent data to be processed
+ // inline.
+
+#ifdef RASAUTODIAL
+#define ACD_CONN_NOTIF 0x08000000 // inform automatic connection
+ // driver about this connection
+#endif // RASAUTODIAL
+
+#define FIN_OUTSTANDING 0x10000000 // We've sent a FIN 'recently', i.e.
+ // since the last retransmit. When
+ // this flag is set sendnext ==
+ // sendmax.
+
+#define FIN_OUTS_SHIFT 28 // Shift to FIN_OUTSTANDING bit into
+ // low bit.
+#define FIN_SENT 0x20000000 // We've sent a FIN that hasn't
+ // been acknowledged. Once this
+ // bit has been turned on in
+ // FIN-WAIT-1 the sequence number
+ // of the FIN will be sendmax-1.
+#define NEED_RST 0x40000000 // We need to send a RST when
+ // closing.
+#define IN_TCB_TABLE 0x80000000 // TCB is in the TCB table.
+
+//* The defintion of the 'slow flags'. If any of these flags are set we'll
+// be forced off of the fast path.
+
+#define TCP_SLOW_FLAGS (URG_VALID | FLOW_CNTLD | GC_PENDING | \
+ TW_PENDING | DISC_NOTIFIED | IN_DELIV_URG | \
+ FIN_NEEDED | FIN_SENT | FIN_OUTSTANDING | \
+ DISC_PENDING | PMTU_BH_PROBE)
+
+//* Close reasons.
+#define TCB_CLOSE_RST 0x80 // Received a RST segment.
+#define TCB_CLOSE_ABORTED 0x40 // Had a local abort.
+#define TCB_CLOSE_TIMEOUT 0x20 // Connection timed out.
+#define TCB_CLOSE_REFUSED 0x10 // Connect attempt was refused.
+#define TCB_CLOSE_UNREACH 0x08 // Remote destination unreachable.
+#define TCB_CLOSE_SUCCESS 0x01 // Successfull close.
+
+//* TCB Timer macros.
+#define START_TCB_TIMER(t, v) (t) = (v)
+#define STOP_TCB_TIMER(t) (t) = 0
+#define TCB_TIMER_RUNNING(t) ((t) != 0)
+
+// Macro to compute retransmit timeout.
+#define REXMIT_TO(t) ((((t)->tcb_smrtt >> 2) + (t)->tcb_delta) >> 1)
+
+//* Definitons for pending actions. We define a PENDING_ACTION macro
+// that can be used to decide whether or not we can proceed with an
+// activity. The only pending action we really care about is DELETE - others
+// are low priority and can be put off.
+#define PENDING_ACTION(t) ((t)->tcb_pending & DEL_PENDING)
+#define DEL_PENDING 0x01 // Delete is pending.
+#define OPT_PENDING 0x02 // Option set is pending.
+
+//* Macro to see if a TCB is closing.
+#define CLOSING(t) ((t)->tcb_pending & DEL_PENDING)
+
+//* Structure of a TCP packet header.
+
+struct TCPHeader {
+ ushort tcp_src; // Source port.
+ ushort tcp_dest; // Destination port.
+ SeqNum tcp_seq; // Sequence number.
+ SeqNum tcp_ack; // Ack number.
+ ushort tcp_flags; // Flags and data offset.
+ ushort tcp_window; // Window offered.
+ ushort tcp_xsum; // Checksum.
+ ushort tcp_urgent; // Urgent pointer.
+};
+
+typedef struct TCPHeader TCPHeader;
+
+//* Definitions for header flags.
+#define TCP_FLAG_FIN 0x00000100
+#define TCP_FLAG_SYN 0x00000200
+#define TCP_FLAG_RST 0x00000400
+#define TCP_FLAG_PUSH 0x00000800
+#define TCP_FLAG_ACK 0x00001000
+#define TCP_FLAG_URG 0x00002000
+
+#define TCP_FLAGS_ALL (TCP_FLAG_FIN | TCP_FLAG_SYN | TCP_FLAG_RST | \
+ TCP_FLAG_ACK | TCP_FLAG_URG)
+
+//* Flags in the tcb_fastchk field that are not in the TCP header proper.
+// Setting these flags forces us off the fast path.
+#define TCP_FLAG_SLOW 0x00000001 // Need to be on slow path.
+#define TCP_FLAG_IN_RCV 0x00000002 // In recv. path already.
+
+#if FAST_RETRANSMIT
+#define TCP_FLAG_FASTREC 0x00000004 // This is used to mark tcb
+#endif // when Fast retransmit is in progress
+ // Debugging purpose only
+
+#define TCP_OFFSET_MASK 0xf0
+#define TCP_HDR_SIZE(t) (uint)(((*(uchar *)&(t)->tcp_flags) & TCP_OFFSET_MASK) >> 2)
+
+#define MAKE_TCP_FLAGS(o, f) ((f) | ((o) << 4))
+
+#define TCP_OPT_EOL 0
+#define TCP_OPT_NOP 1
+#define TCP_OPT_MSS 2
+#define MSS_OPT_SIZE 4
+
+//* Convenient byte swapped structure for receives.
+struct TCPRcvInfo {
+ SeqNum tri_seq; // Sequence number.
+ SeqNum tri_ack; // Ack number.
+ uint tri_window; // Window.
+ uint tri_urgent; // Urgent pointer.
+ uint tri_flags; // Flags.
+};
+
+typedef struct TCPRcvInfo TCPRcvInfo;
+
+
+
+//* General structure, at the start of all command specific request structures.
+
+#define tr_signature 0x20205254 // 'TR '
+
+struct TCPReq {
+#ifdef DEBUG
+ ulong tr_sig;
+#endif
+ struct Queue tr_q; // Q linkage.
+ CTEReqCmpltRtn tr_rtn; // Completion routine.
+ PVOID tr_context; // User context.
+ int tr_status; // Final complete status.
+};
+
+typedef struct TCPReq TCPReq;
+
+
+#ifdef NT
+
+#ifdef POOL_TAGGING
+
+#ifdef ExAllocatePool
+#undef ExAllocatePool
+#endif
+
+#define ExAllocatePool(type, size) ExAllocatePoolWithTag(type, size, 'tPCT')
+
+#ifndef CTEAllocMem
+#error "CTEAllocMem is not already defined - will override tagging"
+#else
+#undef CTEAllocMem
+#endif
+
+#define CTEAllocMem(size) ExAllocatePoolWithTag(NonPagedPool, size, 'tPCT')
+
+#endif // POOL_TAGGING
+
+//
+// TCP endpoint context structure allocated for each open of TCP/UDP.
+// A pointer to this structure is stored in FileObject->FsContext.
+//
+typedef struct _TCP_CONTEXT {
+ union {
+ HANDLE AddressHandle;
+ CONNECTION_CONTEXT ConnectionContext;
+ HANDLE ControlChannel;
+ } Handle;
+ ULONG ReferenceCount;
+ BOOLEAN CancelIrps;
+#if DBG
+ LIST_ENTRY PendingIrpList;
+ LIST_ENTRY CancelledIrpList;
+#endif
+ KEVENT CleanupEvent;
+} TCP_CONTEXT, *PTCP_CONTEXT;
+
+#endif // NT
+
+
+#include "tcpdeb.h"
+
+#endif // _TCP_INCLUDED_
+
+