]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - net/ipv4/tcp_output.c
[INET]: Collect common frag sysctl variables together
[linux-2.6-omap-h63xx.git] / net / ipv4 / tcp_output.c
index cbb83acd830a89009ae88f522551340bcd267399..324b4207254ae411728dd8a3cc1740f5ac0ce267 100644 (file)
@@ -660,7 +660,7 @@ static void tcp_set_skb_tso_segs(struct sock *sk, struct sk_buff *skb, unsigned
 static void tcp_adjust_fackets_out(struct tcp_sock *tp, struct sk_buff *skb,
                                   int decr)
 {
-       if (!tp->sacked_out)
+       if (!tp->sacked_out || tcp_is_reno(tp))
                return;
 
        if (!before(tp->highest_sack, TCP_SKB_CB(skb)->seq))
@@ -712,7 +712,8 @@ int tcp_fragment(struct sock *sk, struct sk_buff *skb, u32 len, unsigned int mss
        TCP_SKB_CB(buff)->end_seq = TCP_SKB_CB(skb)->end_seq;
        TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(buff)->seq;
 
-       if (tp->sacked_out && (TCP_SKB_CB(skb)->seq == tp->highest_sack))
+       if (tcp_is_sack(tp) && tp->sacked_out &&
+           (TCP_SKB_CB(skb)->seq == tp->highest_sack))
                tp->highest_sack = TCP_SKB_CB(buff)->seq;
 
        /* PSH and FIN should only be set in the second packet. */
@@ -1718,6 +1719,10 @@ static void tcp_retrans_try_collapse(struct sock *sk, struct sk_buff *skb, int m
                BUG_ON(tcp_skb_pcount(skb) != 1 ||
                       tcp_skb_pcount(next_skb) != 1);
 
+               if (WARN_ON(tcp_is_sack(tp) && tp->sacked_out &&
+                   (TCP_SKB_CB(next_skb)->seq == tp->highest_sack)))
+                       return;
+
                /* Ok.  We will be able to collapse the packet. */
                tcp_unlink_write_queue(next_skb, sk);
 
@@ -1734,10 +1739,6 @@ static void tcp_retrans_try_collapse(struct sock *sk, struct sk_buff *skb, int m
                /* Update sequence range on original skb. */
                TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(next_skb)->end_seq;
 
-               if (WARN_ON(tp->sacked_out &&
-                   (TCP_SKB_CB(next_skb)->seq == tp->highest_sack)))
-                       return;
-
                /* Merge over control information. */
                flags |= TCP_SKB_CB(next_skb)->flags; /* This moves PSH/FIN etc. over */
                TCP_SKB_CB(skb)->flags = flags;
@@ -1754,14 +1755,16 @@ static void tcp_retrans_try_collapse(struct sock *sk, struct sk_buff *skb, int m
                if (tcp_is_reno(tp) && tp->sacked_out)
                        tcp_dec_pcount_approx(&tp->sacked_out, next_skb);
 
-               tcp_adjust_fackets_out(tp, skb, tcp_skb_pcount(next_skb));
+               tcp_adjust_fackets_out(tp, next_skb, tcp_skb_pcount(next_skb));
                tp->packets_out -= tcp_skb_pcount(next_skb);
 
                /* changed transmit queue under us so clear hints */
                tcp_clear_retrans_hints_partial(tp);
                /* manually tune sacktag skb hint */
-               if (tp->fastpath_skb_hint == next_skb)
+               if (tp->fastpath_skb_hint == next_skb) {
                        tp->fastpath_skb_hint = skb;
+                       tp->fastpath_cnt_hint -= tcp_skb_pcount(skb);
+               }
 
                sk_stream_free_skb(sk, next_skb);
        }
@@ -1911,6 +1914,8 @@ int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb)
                                printk(KERN_DEBUG "retrans_out leaked.\n");
                }
 #endif
+               if (!tp->retrans_out)
+                       tp->lost_retrans_low = tp->snd_nxt;
                TCP_SKB_CB(skb)->sacked |= TCPCB_RETRANS;
                tp->retrans_out += tcp_skb_pcount(skb);