|
@@ -1836,7 +1836,7 @@ int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb)
|
|
|
{
|
|
|
struct tcp_sock *tp = tcp_sk(sk);
|
|
|
struct inet_connection_sock *icsk = inet_csk(sk);
|
|
|
- unsigned int cur_mss = tcp_current_mss(sk, 0);
|
|
|
+ unsigned int cur_mss;
|
|
|
int err;
|
|
|
|
|
|
/* Inconslusive MTU probe */
|
|
@@ -1858,6 +1858,11 @@ int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb)
|
|
|
return -ENOMEM;
|
|
|
}
|
|
|
|
|
|
+ if (inet_csk(sk)->icsk_af_ops->rebuild_header(sk))
|
|
|
+ return -EHOSTUNREACH; /* Routing failure or similar. */
|
|
|
+
|
|
|
+ cur_mss = tcp_current_mss(sk, 0);
|
|
|
+
|
|
|
/* If receiver has shrunk his window, and skb is out of
|
|
|
* new window, do not retransmit it. The exception is the
|
|
|
* case, when window is shrunk to zero. In this case
|
|
@@ -1884,9 +1889,6 @@ int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb)
|
|
|
(sysctl_tcp_retrans_collapse != 0))
|
|
|
tcp_retrans_try_collapse(sk, skb, cur_mss);
|
|
|
|
|
|
- if (inet_csk(sk)->icsk_af_ops->rebuild_header(sk))
|
|
|
- return -EHOSTUNREACH; /* Routing failure or similar. */
|
|
|
-
|
|
|
/* Some Solaris stacks overoptimize and ignore the FIN on a
|
|
|
* retransmit when old data is attached. So strip it off
|
|
|
* since it is cheap to do so and saves bytes on the network.
|