|
@@ -4576,6 +4576,17 @@ err:
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void tcp_data_ready(struct sock *sk)
|
|
|
|
+{
|
|
|
|
+ const struct tcp_sock *tp = tcp_sk(sk);
|
|
|
|
+ int avail = tp->rcv_nxt - tp->copied_seq;
|
|
|
|
+
|
|
|
|
+ if (avail < sk->sk_rcvlowat && !sock_flag(sk, SOCK_DONE))
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ sk->sk_data_ready(sk);
|
|
|
|
+}
|
|
|
|
+
|
|
static void tcp_data_queue(struct sock *sk, struct sk_buff *skb)
|
|
static void tcp_data_queue(struct sock *sk, struct sk_buff *skb)
|
|
{
|
|
{
|
|
struct tcp_sock *tp = tcp_sk(sk);
|
|
struct tcp_sock *tp = tcp_sk(sk);
|
|
@@ -4633,7 +4644,7 @@ queue_and_out:
|
|
if (eaten > 0)
|
|
if (eaten > 0)
|
|
kfree_skb_partial(skb, fragstolen);
|
|
kfree_skb_partial(skb, fragstolen);
|
|
if (!sock_flag(sk, SOCK_DEAD))
|
|
if (!sock_flag(sk, SOCK_DEAD))
|
|
- sk->sk_data_ready(sk);
|
|
|
|
|
|
+ tcp_data_ready(sk);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -5434,7 +5445,7 @@ void tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
|
|
no_ack:
|
|
no_ack:
|
|
if (eaten)
|
|
if (eaten)
|
|
kfree_skb_partial(skb, fragstolen);
|
|
kfree_skb_partial(skb, fragstolen);
|
|
- sk->sk_data_ready(sk);
|
|
|
|
|
|
+ tcp_data_ready(sk);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|