net/tls: remove false positive warning
authorJakub Kicinski <jakub.kicinski@netronome.com>
Mon, 3 Jun 2019 22:17:00 +0000 (15:17 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 4 Jun 2019 21:33:50 +0000 (14:33 -0700)
It's possible that TCP stack will decide to retransmit a packet
right when that packet's data gets acked, especially in presence
of packet reordering.  This means that packets may be in flight,
even though tls_device code has already freed their record state.
Make fill_sg_in() and in turn tls_sw_fallback() not generate a
warning in that case, and quietly proceed to drop such frames.

Make the exit path from tls_sw_fallback() drop monitor friendly,
for users to be able to troubleshoot dropped retransmissions.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: Dirk van der Merwe <dirk.vandermerwe@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Documentation/networking/tls-offload.rst
net/tls/tls_device_fallback.c

index cb85af559dff1b6ed2da3933e50939fa14122103..eb7c9b81ccf5630bca36f5b7fa5a4f6fde47f627 100644 (file)
@@ -379,7 +379,6 @@ by the driver:
    but did not arrive in the expected order
  * ``tx_tls_drop_no_sync_data`` - number of TX packets dropped because
    they arrived out of order and associated record could not be found
-   (see also :ref:`pre_tls_data`)
 
 Notable corner cases, exceptions and additional requirements
 ============================================================
@@ -462,21 +461,3 @@ Redirects leak clear text
 
 In the RX direction, if segment has already been decrypted by the device
 and it gets redirected or mirrored - clear text will be transmitted out.
-
-.. _pre_tls_data:
-
-Transmission of pre-TLS data
-----------------------------
-
-User can enqueue some already encrypted and framed records before enabling
-``ktls`` on the socket. Those records have to get sent as they are. This is
-perfectly easy to handle in the software case - such data will be waiting
-in the TCP layer, TLS ULP won't see it. In the offloaded case when pre-queued
-segment reaches transmission point it appears to be out of order (before the
-expected TCP sequence number) and the stack does not have a record information
-associated.
-
-All segments without record information cannot, however, be assumed to be
-pre-queued data, because a race condition exists between TCP stack queuing
-a retransmission, the driver seeing the retransmission and TCP ACK arriving
-for the retransmitted data.
index c3a5fe624b4e3818aa3df07e2640f2af65fd3285..5a087e1981c36a89a9b623481abe4e9508698ccc 100644 (file)
@@ -240,7 +240,6 @@ static int fill_sg_in(struct scatterlist *sg_in,
        record = tls_get_record(ctx, tcp_seq, rcd_sn);
        if (!record) {
                spin_unlock_irqrestore(&ctx->lock, flags);
-               WARN(1, "Record not found for seq %u\n", tcp_seq);
                return -EINVAL;
        }
 
@@ -409,7 +408,10 @@ put_sg:
                put_page(sg_page(&sg_in[--resync_sgs]));
        kfree(sg_in);
 free_orig:
-       kfree_skb(skb);
+       if (nskb)
+               consume_skb(skb);
+       else
+               kfree_skb(skb);
        return nskb;
 }