rxrpc: Fix use of Don't Fragment flag
[platform/kernel/linux-starfive.git] / net / rxrpc / local_object.c
index b8eaca5..34d3073 100644 (file)
@@ -37,6 +37,17 @@ static void rxrpc_encap_err_rcv(struct sock *sk, struct sk_buff *skb, int err,
 }
 
 /*
+ * Set or clear the Don't Fragment flag on a socket.
+ */
+void rxrpc_local_dont_fragment(const struct rxrpc_local *local, bool set)
+{
+       if (set)
+               ip_sock_set_mtu_discover(local->socket->sk, IP_PMTUDISC_DO);
+       else
+               ip_sock_set_mtu_discover(local->socket->sk, IP_PMTUDISC_DONT);
+}
+
+/*
  * Compare a local to an address.  Return -ve, 0 or +ve to indicate less than,
  * same or greater than.
  *
@@ -87,7 +98,7 @@ static void rxrpc_client_conn_reap_timeout(struct timer_list *timer)
        struct rxrpc_local *local =
                container_of(timer, struct rxrpc_local, client_conn_reap_timer);
 
-       if (local->kill_all_client_conns &&
+       if (!local->kill_all_client_conns &&
            test_and_set_bit(RXRPC_CLIENT_CONN_REAP_TIMER, &local->client_conn_flags))
                rxrpc_wake_up_io_thread(local);
 }
@@ -108,8 +119,10 @@ static struct rxrpc_local *rxrpc_alloc_local(struct net *net,
                local->net = net;
                local->rxnet = rxrpc_net(net);
                INIT_HLIST_NODE(&local->link);
-               init_rwsem(&local->defrag_sem);
                init_completion(&local->io_thread_ready);
+#ifdef CONFIG_AF_RXRPC_INJECT_RX_DELAY
+               skb_queue_head_init(&local->rx_delay_queue);
+#endif
                skb_queue_head_init(&local->rx_queue);
                INIT_LIST_HEAD(&local->conn_attend_q);
                INIT_LIST_HEAD(&local->call_attend_q);
@@ -201,7 +214,7 @@ static int rxrpc_open_socket(struct rxrpc_local *local, struct net *net)
                ip_sock_set_recverr(usk);
 
                /* we want to set the don't fragment bit */
-               ip_sock_set_mtu_discover(usk, IP_PMTUDISC_DO);
+               rxrpc_local_dont_fragment(local, true);
 
                /* We want receive timestamps. */
                sock_enable_timestamps(usk);
@@ -434,6 +447,9 @@ void rxrpc_destroy_local(struct rxrpc_local *local)
        /* At this point, there should be no more packets coming in to the
         * local endpoint.
         */
+#ifdef CONFIG_AF_RXRPC_INJECT_RX_DELAY
+       rxrpc_purge_queue(&local->rx_delay_queue);
+#endif
        rxrpc_purge_queue(&local->rx_queue);
        rxrpc_purge_client_connections(local);
 }