EM(rxrpc_propose_ack_client_tx_end,     "ClTxEnd") \
        EM(rxrpc_propose_ack_input_data,        "DataIn ") \
        EM(rxrpc_propose_ack_input_data_hole,   "DataInH") \
-       EM(rxrpc_propose_ack_ping_for_check_life, "ChkLife") \
        EM(rxrpc_propose_ack_ping_for_keepalive, "KeepAlv") \
        EM(rxrpc_propose_ack_ping_for_lost_ack, "LostAck") \
        EM(rxrpc_propose_ack_ping_for_lost_reply, "LostRpl") \
+       EM(rxrpc_propose_ack_ping_for_old_rtt,  "OldRtt ") \
        EM(rxrpc_propose_ack_ping_for_params,   "Params ") \
+       EM(rxrpc_propose_ack_ping_for_rtt,      "Rtt    ") \
        EM(rxrpc_propose_ack_processing_op,     "ProcOp ") \
        EM(rxrpc_propose_ack_respond_to_ack,    "Rsp2Ack") \
        EM(rxrpc_propose_ack_respond_to_ping,   "Rsp2Png") \
 
                rxrpc_send_ACK(call, RXRPC_ACK_IDLE, 0,
                               rxrpc_propose_ack_rx_idle);
 
-       if (atomic_read(&call->ackr_nr_unacked) > 2)
-               rxrpc_send_ACK(call, RXRPC_ACK_IDLE, 0,
-                              rxrpc_propose_ack_input_data);
+       if (atomic_read(&call->ackr_nr_unacked) > 2) {
+               if (call->peer->rtt_count < 3)
+                       rxrpc_send_ACK(call, RXRPC_ACK_PING, 0,
+                                      rxrpc_propose_ack_ping_for_rtt);
+               else if (ktime_before(ktime_add_ms(call->peer->rtt_last_req, 1000),
+                                     ktime_get_real()))
+                       rxrpc_send_ACK(call, RXRPC_ACK_PING, 0,
+                                      rxrpc_propose_ack_ping_for_old_rtt);
+               else
+                       rxrpc_send_ACK(call, RXRPC_ACK_IDLE, 0,
+                                      rxrpc_propose_ack_input_data);
+       }
 
        /* Make sure the timer is restarted */
        if (!__rxrpc_call_is_complete(call)) {
 
        iov_iter_kvec(&msg.msg_iter, WRITE, iov, 1, len);
        ret = do_udp_sendmsg(conn->local->socket, &msg, len);
        call->peer->last_tx_at = ktime_get_seconds();
-       if (ret < 0)
+       if (ret < 0) {
                trace_rxrpc_tx_fail(call->debug_id, serial, ret,
                                    rxrpc_tx_point_call_ack);
-       else
+       } else {
                trace_rxrpc_tx_packet(call->debug_id, &txb->wire,
                                      rxrpc_tx_point_call_ack);
+               if (txb->wire.flags & RXRPC_REQUEST_ACK)
+                       call->peer->rtt_last_req = ktime_get_real();
+       }
        rxrpc_tx_backoff(call, ret);
 
        if (!__rxrpc_call_is_complete(call)) {