[SCTP]: Implement SCTP-AUTH initializations.
[safe/jmp/linux-2.6] / net / ipv4 / tcp_output.c
index 3abe22e..d65d17b 100644 (file)
@@ -61,6 +61,18 @@ int sysctl_tcp_base_mss __read_mostly = 512;
 /* By default, RFC2861 behavior.  */
 int sysctl_tcp_slow_start_after_idle __read_mostly = 1;
 
+static inline void tcp_packets_out_inc(struct sock *sk,
+                                      const struct sk_buff *skb)
+{
+       struct tcp_sock *tp = tcp_sk(sk);
+       int orig = tp->packets_out;
+
+       tp->packets_out += tcp_skb_pcount(skb);
+       if (!orig)
+               inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS,
+                                         inet_csk(sk)->icsk_rto, TCP_RTO_MAX);
+}
+
 static void update_send_head(struct sock *sk, struct sk_buff *skb)
 {
        struct tcp_sock *tp = tcp_sk(sk);
@@ -634,11 +646,7 @@ static void tcp_set_skb_tso_segs(struct sock *sk, struct sk_buff *skb, unsigned
                skb_shinfo(skb)->gso_size = 0;
                skb_shinfo(skb)->gso_type = 0;
        } else {
-               unsigned int factor;
-
-               factor = skb->len + (mss_now - 1);
-               factor /= mss_now;
-               skb_shinfo(skb)->gso_segs = factor;
+               skb_shinfo(skb)->gso_segs = DIV_ROUND_UP(skb->len, mss_now);
                skb_shinfo(skb)->gso_size = mss_now;
                skb_shinfo(skb)->gso_type = sk->sk_gso_type;
        }
@@ -732,30 +740,22 @@ int tcp_fragment(struct sock *sk, struct sk_buff *skb, u32 len, unsigned int mss
                if (TCP_SKB_CB(skb)->sacked & TCPCB_SACKED_RETRANS)
                        tp->retrans_out -= diff;
 
-               if (TCP_SKB_CB(skb)->sacked & TCPCB_LOST) {
+               if (TCP_SKB_CB(skb)->sacked & TCPCB_LOST)
                        tp->lost_out -= diff;
-                       tp->left_out -= diff;
-               }
 
                if (diff > 0) {
                        /* Adjust Reno SACK estimate. */
-                       if (!tp->rx_opt.sack_ok) {
-                               tp->sacked_out -= diff;
-                               if ((int)tp->sacked_out < 0)
-                                       tp->sacked_out = 0;
-                               tcp_sync_left_out(tp);
+                       if (tcp_is_reno(tp)) {
+                               tcp_dec_pcount_approx_int(&tp->sacked_out, diff);
+                               tcp_verify_left_out(tp);
                        }
 
-                       tp->fackets_out -= diff;
-                       if ((int)tp->fackets_out < 0)
-                               tp->fackets_out = 0;
+                       tcp_dec_pcount_approx_int(&tp->fackets_out, diff);
                        /* SACK fastpath might overwrite it unless dealt with */
                        if (tp->fastpath_skb_hint != NULL &&
                            after(TCP_SKB_CB(tp->fastpath_skb_hint)->seq,
                                  TCP_SKB_CB(skb)->seq)) {
-                               tp->fastpath_cnt_hint -= diff;
-                               if ((int)tp->fastpath_cnt_hint < 0)
-                                       tp->fastpath_cnt_hint = 0;
+                               tcp_dec_pcount_approx_int(&tp->fastpath_cnt_hint, diff);
                        }
                }
        }
@@ -1733,21 +1733,17 @@ static void tcp_retrans_try_collapse(struct sock *sk, struct sk_buff *skb, int m
                TCP_SKB_CB(skb)->sacked |= TCP_SKB_CB(next_skb)->sacked&(TCPCB_EVER_RETRANS|TCPCB_AT_TAIL);
                if (TCP_SKB_CB(next_skb)->sacked&TCPCB_SACKED_RETRANS)
                        tp->retrans_out -= tcp_skb_pcount(next_skb);
-               if (TCP_SKB_CB(next_skb)->sacked&TCPCB_LOST) {
+               if (TCP_SKB_CB(next_skb)->sacked&TCPCB_LOST)
                        tp->lost_out -= tcp_skb_pcount(next_skb);
-                       tp->left_out -= tcp_skb_pcount(next_skb);
-               }
                /* Reno case is special. Sigh... */
-               if (!tp->rx_opt.sack_ok && tp->sacked_out) {
+               if (tcp_is_reno(tp) && tp->sacked_out)
                        tcp_dec_pcount_approx(&tp->sacked_out, next_skb);
-                       tp->left_out -= tcp_skb_pcount(next_skb);
-               }
 
                /* Not quite right: it can be > snd.fack, but
                 * it is better to underestimate fackets.
                 */
                tcp_dec_pcount_approx(&tp->fackets_out, next_skb);
-               tcp_packets_out_dec(tp, next_skb);
+               tp->packets_out -= tcp_skb_pcount(next_skb);
                sk_stream_free_skb(sk, next_skb);
        }
 }
@@ -1786,7 +1782,7 @@ void tcp_simple_retransmit(struct sock *sk)
        if (!lost)
                return;
 
-       tcp_sync_left_out(tp);
+       tcp_verify_left_out(tp);
 
        /* Don't muck with the congestion window here.
         * Reason is that we do not increase amount of _data_
@@ -1988,7 +1984,7 @@ void tcp_xmit_retransmit_queue(struct sock *sk)
                return;
 
        /* No forward retransmissions in Reno are possible. */
-       if (!tp->rx_opt.sack_ok)
+       if (tcp_is_reno(tp))
                return;
 
        /* Yeah, we have to make difficult choice between forward transmission