|
@@ -2318,6 +2318,20 @@ static inline bool tcp_need_reset(int state)
|
|
TCPF_FIN_WAIT2 | TCPF_SYN_RECV);
|
|
TCPF_FIN_WAIT2 | TCPF_SYN_RECV);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void tcp_write_queue_purge(struct sock *sk)
|
|
|
|
+{
|
|
|
|
+ struct sk_buff *skb;
|
|
|
|
+
|
|
|
|
+ tcp_chrono_stop(sk, TCP_CHRONO_BUSY);
|
|
|
|
+ while ((skb = __skb_dequeue(&sk->sk_write_queue)) != NULL) {
|
|
|
|
+ tcp_skb_tsorted_anchor_cleanup(skb);
|
|
|
|
+ sk_wmem_free_skb(sk, skb);
|
|
|
|
+ }
|
|
|
|
+ INIT_LIST_HEAD(&tcp_sk(sk)->tsorted_sent_queue);
|
|
|
|
+ sk_mem_reclaim(sk);
|
|
|
|
+ tcp_clear_all_retrans_hints(tcp_sk(sk));
|
|
|
|
+}
|
|
|
|
+
|
|
int tcp_disconnect(struct sock *sk, int flags)
|
|
int tcp_disconnect(struct sock *sk, int flags)
|
|
{
|
|
{
|
|
struct inet_sock *inet = inet_sk(sk);
|
|
struct inet_sock *inet = inet_sk(sk);
|