Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6
[safe/jmp/linux-2.6] / include / linux / tcp.h
index 415193e..61723a7 100644 (file)
@@ -69,16 +69,16 @@ union tcp_word_hdr {
 #define tcp_flag_word(tp) ( ((union tcp_word_hdr *)(tp))->words [3]) 
 
 enum { 
-       TCP_FLAG_CWR = __constant_htonl(0x00800000), 
-       TCP_FLAG_ECE = __constant_htonl(0x00400000), 
-       TCP_FLAG_URG = __constant_htonl(0x00200000), 
-       TCP_FLAG_ACK = __constant_htonl(0x00100000), 
-       TCP_FLAG_PSH = __constant_htonl(0x00080000), 
-       TCP_FLAG_RST = __constant_htonl(0x00040000), 
-       TCP_FLAG_SYN = __constant_htonl(0x00020000), 
-       TCP_FLAG_FIN = __constant_htonl(0x00010000),
-       TCP_RESERVED_BITS = __constant_htonl(0x0F000000),
-       TCP_DATA_OFFSET = __constant_htonl(0xF0000000)
+       TCP_FLAG_CWR = __cpu_to_be32(0x00800000),
+       TCP_FLAG_ECE = __cpu_to_be32(0x00400000),
+       TCP_FLAG_URG = __cpu_to_be32(0x00200000),
+       TCP_FLAG_ACK = __cpu_to_be32(0x00100000),
+       TCP_FLAG_PSH = __cpu_to_be32(0x00080000),
+       TCP_FLAG_RST = __cpu_to_be32(0x00040000),
+       TCP_FLAG_SYN = __cpu_to_be32(0x00020000),
+       TCP_FLAG_FIN = __cpu_to_be32(0x00010000),
+       TCP_RESERVED_BITS = __cpu_to_be32(0x0F000000),
+       TCP_DATA_OFFSET = __cpu_to_be32(0xF0000000)
 }; 
 
 /* TCP socket options */
@@ -178,6 +178,21 @@ struct tcp_md5sig {
 #include <net/inet_connection_sock.h>
 #include <net/inet_timewait_sock.h>
 
+static inline struct tcphdr *tcp_hdr(const struct sk_buff *skb)
+{
+       return (struct tcphdr *)skb_transport_header(skb);
+}
+
+static inline unsigned int tcp_hdrlen(const struct sk_buff *skb)
+{
+       return tcp_hdr(skb)->doff * 4;
+}
+
+static inline unsigned int tcp_optlen(const struct sk_buff *skb)
+{
+       return (tcp_hdr(skb)->doff - 5) * 4;
+}
+
 /* This defines a selective acknowledgement block. */
 struct tcp_sack_block_wire {
        __be32  start_seq;
@@ -203,17 +218,22 @@ struct tcp_options_received {
                snd_wscale : 4, /* Window scaling received from sender  */
                rcv_wscale : 4; /* Window scaling to send to receiver   */
 /*     SACKs data      */
-       u8      eff_sacks;      /* Size of SACK array to send with next packet */
        u8      num_sacks;      /* Number of SACK blocks                */
        u16     user_mss;       /* mss requested by user in ioctl */
        u16     mss_clamp;      /* Maximal mss, negotiated at connection setup */
 };
 
+/* This is the max number of SACKS that we'll generate and process. It's safe
+ * to increse this, although since:
+ *   size = TCPOLEN_SACK_BASE_ALIGNED (4) + n * TCPOLEN_SACK_PERBLOCK (8)
+ * only four options will fit in a standard TCP header */
+#define TCP_NUM_SACKS 4
+
 struct tcp_request_sock {
        struct inet_request_sock        req;
 #ifdef CONFIG_TCP_MD5SIG
        /* Only used by TCP MD5 Signature so far. */
-       struct tcp_request_sock_ops     *af_specific;
+       const struct tcp_request_sock_ops *af_specific;
 #endif
        u32                             rcv_isn;
        u32                             snt_isn;
@@ -228,7 +248,7 @@ struct tcp_sock {
        /* inet_connection_sock has to be the first member of tcp_sock */
        struct inet_connection_sock     inet_conn;
        u16     tcp_header_len; /* Bytes of tcp header to send          */
-       u16     xmit_size_goal; /* Goal for segmenting output packets   */
+       u16     xmit_size_goal_segs; /* Goal for segmenting output packets */
 
 /*
  *     Header prediction flags
@@ -276,10 +296,9 @@ struct tcp_sock {
        u32     rcv_ssthresh;   /* Current window clamp                 */
 
        u32     frto_highmark;  /* snd_nxt when RTO occurred */
-       u8      reordering;     /* Packet reordering metric.            */
+       u16     advmss;         /* Advertised MSS                       */
        u8      frto_counter;   /* Number of new acks after RTO */
        u8      nonagle;        /* Disable Nagle algorithm?             */
-       u8      keepalive_probes; /* num of allowed keep alive probes   */
 
 /* RTT measurement */
        u32     srtt;           /* smoothed round trip time << 3        */
@@ -289,8 +308,14 @@ struct tcp_sock {
        u32     rtt_seq;        /* sequence number to update rttvar     */
 
        u32     packets_out;    /* Packets which are "in flight"        */
-       u32     left_out;       /* Packets which leaved network */
        u32     retrans_out;    /* Retransmitted packets out            */
+
+       u16     urg_data;       /* Saved octet of OOB data and control flags */
+       u8      ecn_flags;      /* ECN status bits.                     */
+       u8      reordering;     /* Packet reordering metric.            */
+       u32     snd_up;         /* Urgent pointer               */
+
+       u8      keepalive_probes; /* num of allowed keep alive probes   */
 /*
  *      Options received (usually on last packet, some only on SYN packets).
  */
@@ -301,41 +326,44 @@ struct tcp_sock {
  */
        u32     snd_ssthresh;   /* Slow start size threshold            */
        u32     snd_cwnd;       /* Sending congestion window            */
-       u16     snd_cwnd_cnt;   /* Linear increase counter              */
-       u16     snd_cwnd_clamp; /* Do not allow snd_cwnd to grow above this */
+       u32     snd_cwnd_cnt;   /* Linear increase counter              */
+       u32     snd_cwnd_clamp; /* Do not allow snd_cwnd to grow above this */
        u32     snd_cwnd_used;
        u32     snd_cwnd_stamp;
 
-       struct sk_buff_head     out_of_order_queue; /* Out of order segments go here */
-
        u32     rcv_wnd;        /* Current receiver window              */
        u32     write_seq;      /* Tail(+1) of data held in tcp send buffer */
        u32     pushed_seq;     /* Last pushed seq, required to talk to windows */
-
-/*     SACKs data      */
-       struct tcp_sack_block duplicate_sack[1]; /* D-SACK block */
-       struct tcp_sack_block selective_acks[4]; /* The SACKS themselves*/
-
-       struct tcp_sack_block_wire recv_sack_cache[4];
+       u32     lost_out;       /* Lost packets                 */
+       u32     sacked_out;     /* SACK'd packets                       */
+       u32     fackets_out;    /* FACK'd packets                       */
+       u32     tso_deferred;
+       u32     bytes_acked;    /* Appropriate Byte Counting - RFC3465 */
 
        /* from STCP, retrans queue hinting */
        struct sk_buff* lost_skb_hint;
-
        struct sk_buff *scoreboard_skb_hint;
        struct sk_buff *retransmit_skb_hint;
-       struct sk_buff *forward_skb_hint;
-       struct sk_buff *fastpath_skb_hint;
 
-       int     fastpath_cnt_hint;
+       struct sk_buff_head     out_of_order_queue; /* Out of order segments go here */
+
+       /* SACKs data, these 2 need to be together (see tcp_build_and_update_options) */
+       struct tcp_sack_block duplicate_sack[1]; /* D-SACK block */
+       struct tcp_sack_block selective_acks[4]; /* The SACKS themselves*/
+
+       struct tcp_sack_block recv_sack_cache[4];
+
+       struct sk_buff *highest_sack;   /* highest skb with SACK received
+                                        * (validity guaranteed only if
+                                        * sacked_out > 0)
+                                        */
+
        int     lost_cnt_hint;
-       int     retransmit_cnt_hint;
-       int     forward_cnt_hint;
+       u32     retransmit_high;        /* L-bits may be on up to this seqno */
 
-       u16     advmss;         /* Advertised MSS                       */
-       u16     prior_ssthresh; /* ssthresh saved at recovery start     */
-       u32     lost_out;       /* Lost packets                 */
-       u32     sacked_out;     /* SACK'd packets                       */
-       u32     fackets_out;    /* FACK'd packets                       */
+       u32     lost_retrans_low;       /* Sent seq after any rxmit (lowest) */
+
+       u32     prior_ssthresh; /* ssthresh saved at recovery start     */
        u32     high_seq;       /* snd_nxt at onset of congestion       */
 
        u32     retrans_stamp;  /* Timestamp of the last retransmit,
@@ -343,22 +371,13 @@ struct tcp_sock {
                                 * the first SYN. */
        u32     undo_marker;    /* tracking retrans started here. */
        int     undo_retrans;   /* number of undoable retransmissions. */
-       u32     urg_seq;        /* Seq of received urgent pointer */
-       u16     urg_data;       /* Saved octet of OOB data and control flags */
-       u8      urg_mode;       /* In urgent mode               */
-       u8      ecn_flags;      /* ECN status bits.                     */
-       u32     snd_up;         /* Urgent pointer               */
-
        u32     total_retrans;  /* Total retransmits for entire connection */
-       u32     bytes_acked;    /* Appropriate Byte Counting - RFC3465 */
 
+       u32     urg_seq;        /* Seq of received urgent pointer */
        unsigned int            keepalive_time;   /* time before keep alive takes place */
        unsigned int            keepalive_intvl;  /* time interval between keep alive probes */
-       int                     linger2;
 
-       unsigned long last_synq_overflow; 
-
-       u32     tso_deferred;
+       int                     linger2;
 
 /* Receiver side RTT estimation */
        struct {
@@ -382,9 +401,9 @@ struct tcp_sock {
 
 #ifdef CONFIG_TCP_MD5SIG
 /* TCP AF-Specific parts; only used by MD5 Signature support so far */
-       struct tcp_sock_af_ops  *af_specific;
+       const struct tcp_sock_af_ops    *af_specific;
 
-/* TCP MD5 Signagure Option information */
+/* TCP MD5 Signature Option information */
        struct tcp_md5sig_info  *md5sig_info;
 #endif
 };