1. 17 7月, 2018 18 次提交
  2. 16 7月, 2018 22 次提交
    • D
      Merge branch 'TLS-offload-rx-netdev-and-mlx5' · aea06eb2
      David S. Miller 提交于
      Boris Pismenny says:
      
      ====================
      TLS offload rx, netdev & mlx5
      
      The following series provides TLS RX inline crypto offload.
      
      v5->v4:
          - Remove the Kconfig to mutually exclude both IPsec and TLS
      
      v4->v3:
          - Remove the iov revert for zero copy send flow
      
      v2->v3:
          - Fix typo
          - Adjust cover letter
          - Fix bug in zero copy flows
          - Use network byte order for the record number in resync
          - Adjust the sequence provided in resync
      
      v1->v2:
          - Fix bisectability problems due to variable name changes
          - Fix potential uninitialized return value
      
      This series completes the generic infrastructure to offload TLS crypto to
      a network devices. It enables the kernel TLS socket to skip decryption and
      authentication operations for SKBs marked as decrypted on the receive
      side of the data path. Leaving those computationally expensive operations
      to the NIC.
      
      This infrastructure doesn't require a TCP offload engine. Instead, the
      NIC decrypts a packet's payload if the packet contains the expected TCP
      sequence number. The TLS record authentication tag remains unmodified
      regardless of decryption. If the packet is decrypted successfully and it
      contains an authentication tag, then the authentication check has passed.
      Otherwise, if the authentication fails, then the packet is provided
      unmodified and the KTLS layer is responsible for handling it.
      Out-Of-Order TCP packets are provided unmodified. As a result,
      in the slow path some of the SKBs are decrypted while others remain as
      ciphertext.
      
      The GRO and TCP layers must not coalesce decrypted and non-decrypted SKBs.
      At the worst case a received TLS record consists of both plaintext
      and ciphertext packets. These partially decrypted records must be
      reencrypted, only to be decrypted.
      
      The notable differences between SW KTLS and NIC offloaded TLS
      implementations are as follows:
      1. Partial decryption - Software must handle the case of a TLS record
      that was only partially decrypted by HW. This can happen due to packet
      reordering.
      2. Resynchronization - tls_read_size calls the device driver to
      resynchronize HW whenever it lost track of the TLS record framing in
      the TCP stream.
      
      The infrastructure should be extendable to support various NIC offload
      implementations.  However it is currently written with the
      implementation below in mind:
      The NIC identifies packets that should be offloaded according to
      the 5-tuple and the TCP sequence number. If these match and the
      packet is decrypted and authenticated successfully, then a syndrome
      is provided to software. Otherwise, the packet is unmodified.
      Decrypted and non-decrypted packets aren't coalesced by the network stack,
      and the KTLS layer decrypts and authenticates partially decrypted records.
      The NIC provides an indication whenever a resync is required. The resync
      operation is triggered by the KTLS layer while parsing TLS record headers.
      
      Finally, we measure the performance obtained by running single stream
      iperf with two Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz machines connected
      back-to-back with Innova TLS (40Gbps) NICs. We compare TCP (upper bound)
      and KTLS-Offload running both in Tx and Rx. The results show that the
      performance of offload is comparable to TCP.
      
                                | Bandwidth (Gbps) | CPU Tx (%) | CPU rx (%)
      TCP                       | 28.8             | 5          | 12
      KTLS-Offload-Tx-Rx 	  | 28.6	     | 7          | 14
      
      Paper: https://netdevconf.org/2.2/papers/pismenny-tlscrypto-talk.pdf
      ====================
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      aea06eb2
    • B
      net/mlx5e: IPsec, fix byte count in CQE · b3ccf978
      Boris Pismenny 提交于
      This patch fixes the byte count indication in CQE for processed IPsec
      packets that contain a metadata header.
      Signed-off-by: NBoris Pismenny <borisp@mellanox.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      b3ccf978
    • B
      net/mlx5: Accel, add common metadata functions · 10e71acc
      Boris Pismenny 提交于
      This patch adds common functions to handle mellanox metadata headers.
      These functions are used by IPsec and TLS to process FPGA metadata.
      Signed-off-by: NBoris Pismenny <borisp@mellanox.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      10e71acc
    • B
      net/mlx5e: TLS, build TLS netdev from capabilities · 790af90c
      Boris Pismenny 提交于
      This patch enables TLS Rx based on available HW capabilities.
      Signed-off-by: NBoris Pismenny <borisp@mellanox.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      790af90c
    • B
      net/mlx5e: TLS, add software statistics · afd3baaa
      Boris Pismenny 提交于
      This patch adds software statistics for TLS to count important
      events.
      Signed-off-by: NBoris Pismenny <borisp@mellanox.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      afd3baaa
    • B
      net/mlx5e: TLS, add Innova TLS rx data path · 00aebab2
      Boris Pismenny 提交于
      Implement the TLS rx offload data path according to the
      requirements of the TLS generic NIC offload infrastructure.
      
      Special metadata ethertype is used to pass information to
      the hardware.
      
      When hardware loses synchronization a special resync request
      metadata message is used to request resync.
      Signed-off-by: NBoris Pismenny <borisp@mellanox.com>
      Signed-off-by: NIlya Lesokhin <ilyal@mellanox.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      00aebab2
    • B
      net/mlx5e: TLS, add innova rx support · ca942c78
      Boris Pismenny 提交于
      Add the mlx5 implementation of the TLS Rx routines to add/del TLS
      contexts, also add the tls_dev_resync_rx routine
      to work with the TLS inline Rx crypto offload infrastructure.
      Signed-off-by: NBoris Pismenny <borisp@mellanox.com>
      Signed-off-by: NIlya Lesokhin <ilyal@mellanox.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      ca942c78
    • B
      net/mlx5: Accel, add TLS rx offload routines · ab412e1d
      Boris Pismenny 提交于
      In Innova TLS, TLS contexts are added or deleted
      via a command message over the SBU connection.
      The HW then sends a response message over the same connection.
      
      Complete the implementation for Innova TLS (FPGA-based) hardware by
      adding support for rx inline crypto offload.
      Signed-off-by: NBoris Pismenny <borisp@mellanox.com>
      Signed-off-by: NIlya Lesokhin <ilyal@mellanox.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      ab412e1d
    • B
      net/mlx5e: TLS, refactor variable names · 0aadb2fc
      Boris Pismenny 提交于
      For symmetry, we rename mlx5e_tls_offload_context to
      mlx5e_tls_offload_context_tx before we add mlx5e_tls_offload_context_rx.
      Signed-off-by: NBoris Pismenny <borisp@mellanox.com>
      Reviewed-by: NAviad Yehezkel <aviadye@mellanox.com>
      Reviewed-by: NTariq Toukan <tariqt@mellanox.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      0aadb2fc
    • B
      tls: Fix zerocopy_from_iter iov handling · 47187998
      Boris Pismenny 提交于
      zerocopy_from_iter iterates over the message, but it doesn't revert the
      updates made by the iov iteration. This patch fixes it. Now, the iov can
      be used after calling zerocopy_from_iter.
      
      Fixes: 3c4d7559 ("tls: kernel TLS support")
      Signed-off-by: NBoris Pismenny <borisp@mellanox.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      47187998
    • B
      tls: Add rx inline crypto offload · 4799ac81
      Boris Pismenny 提交于
      This patch completes the generic infrastructure to offload TLS crypto to a
      network device. It enables the kernel to skip decryption and
      authentication of some skbs marked as decrypted by the NIC. In the fast
      path, all packets received are decrypted by the NIC and the performance
      is comparable to plain TCP.
      
      This infrastructure doesn't require a TCP offload engine. Instead, the
      NIC only decrypts packets that contain the expected TCP sequence number.
      Out-Of-Order TCP packets are provided unmodified. As a result, at the
      worst case a received TLS record consists of both plaintext and ciphertext
      packets. These partially decrypted records must be reencrypted,
      only to be decrypted.
      
      The notable differences between SW KTLS Rx and this offload are as
      follows:
      1. Partial decryption - Software must handle the case of a TLS record
      that was only partially decrypted by HW. This can happen due to packet
      reordering.
      2. Resynchronization - tls_read_size calls the device driver to
      resynchronize HW after HW lost track of TLS record framing in
      the TCP stream.
      Signed-off-by: NBoris Pismenny <borisp@mellanox.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      4799ac81
    • B
      tls: Fill software context without allocation · b190a587
      Boris Pismenny 提交于
      This patch allows tls_set_sw_offload to fill the context in case it was
      already allocated previously.
      
      We will use it in TLS_DEVICE to fill the RX software context.
      Signed-off-by: NBoris Pismenny <borisp@mellanox.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      b190a587
    • B
      tls: Split tls_sw_release_resources_rx · 39f56e1a
      Boris Pismenny 提交于
      This patch splits tls_sw_release_resources_rx into two functions one
      which releases all inner software tls structures and another that also
      frees the containing structure.
      
      In TLS_DEVICE we will need to release the software structures without
      freeeing the containing structure, which contains other information.
      Signed-off-by: NBoris Pismenny <borisp@mellanox.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      39f56e1a
    • B
      tls: Split decrypt_skb to two functions · dafb67f3
      Boris Pismenny 提交于
      Previously, decrypt_skb also updated the TLS context.
      Now, decrypt_skb only decrypts the payload using the current context,
      while decrypt_skb_update also updates the state.
      
      Later, in the tls_device Rx flow, we will use decrypt_skb directly.
      Signed-off-by: NBoris Pismenny <borisp@mellanox.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      dafb67f3
    • B
      tls: Refactor tls_offload variable names · d80a1b9d
      Boris Pismenny 提交于
      For symmetry, we rename tls_offload_context to
      tls_offload_context_tx before we add tls_offload_context_rx.
      Signed-off-by: NBoris Pismenny <borisp@mellanox.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      d80a1b9d
    • B
      tcp: Don't coalesce decrypted and encrypted SKBs · 41ed9c04
      Boris Pismenny 提交于
      Prevent coalescing of decrypted and encrypted SKBs in GRO
      and TCP layer.
      Signed-off-by: NBoris Pismenny <borisp@mellanox.com>
      Signed-off-by: NIlya Lesokhin <ilyal@mellanox.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      41ed9c04
    • B
      net: Add TLS rx resync NDO · 16e4edc2
      Boris Pismenny 提交于
      Add new netdev tls op for resynchronizing HW tls context
      Signed-off-by: NBoris Pismenny <borisp@mellanox.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      16e4edc2
    • I
      net: Add TLS RX offload feature · 14136564
      Ilya Lesokhin 提交于
      This patch adds a netdev feature to configure TLS RX inline crypto offload.
      Signed-off-by: NIlya Lesokhin <ilyal@mellanox.com>
      Signed-off-by: NBoris Pismenny <borisp@mellanox.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      14136564
    • B
      net: Add decrypted field to skb · 784abe24
      Boris Pismenny 提交于
      The decrypted bit is propogated to cloned/copied skbs.
      This will be used later by the inline crypto receive side offload
      of tls.
      Signed-off-by: NBoris Pismenny <borisp@mellanox.com>
      Signed-off-by: NIlya Lesokhin <ilyal@mellanox.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      784abe24
    • D
      Merge branch 'mvpp2-add-debugfs-interface' · cc98419a
      David S. Miller 提交于
      Maxime Chevallier says:
      
      ====================
      net: mvpp2: add debugfs interface
      
      The PPv2 Header Parser and Classifier are not straightforward to debug,
      having easy access to some of the many lookup tables configuration is
      helpful during development and debug.
      
      This series adds a basic debugfs interface, allowing to read data from
      the Header Parser and some of the Classifier tables.
      
      For now, the interface is read-only, and contains only some basic info.
      
      This was actually used during RSS development, and might be useful to
      troubleshoot some issues we might find.
      
      The first patch of the series converts the mvpp2 files to SPDX, which
      eases adding the new debugfs dedicated file.
      
      The second patch adds the interface, and exposes basic Header Parser data.
      
      The 3rd patch adds a hit counter for the Header Parser TCAM.
      
      The 4th patch exposes classifier info.
      
      The 5th patch adds some hit counters for some of the classifier engines.
      
      Changes since V1:
      - Rebased on the lastest net-next
      - Made cls_flow_get non static so that it can be used in mvpp2_debugfs
      ====================
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      cc98419a
    • M
      net: mvpp2: debugfs: add classifier hit counters · f9d30d5b
      Maxime Chevallier 提交于
      The classification operations that are used for RSS make use of several
      lookup tables. Having hit counters for these tables is really helpful
      to determine what flows were matched by ingress traffic, and see the
      path of packets among all the classifier tables.
      
      This commit adds hit counters for the 3 tables used at the moment :
      
       - The decoding table (also called lookup_id table), that links flows
         identified by the Header Parser to the flow table.
      
         There's one entry per flow, located at :
         .../mvpp2/<controller>/flows/XX/dec_hits
      
         Note that there are 21 flows in the decoding table, whereas there are
         52 flows in the Header Parser. That's because there are several kind
         of traffic that will match a given flow. Reading the hit counter from
         one sub-flow will clear all hit counter that have the same flow_id.
      
         This also applies to the flow_hits.
      
       - The flow table, that contains all the different lookups to be
         performed by the classifier for each packet of a given flow. The match
         is done on the first entry of the flow sequence.
      
       - The C2 engine entries, that are used to assign the default rx queue,
         and enable or disable RSS for a given port.
      
         There's one entry per flow, located at:
         .../mvpp2/<controller>/flows/XX/flow_hits
      
         There is one C2 entry per port, so the c2 hit counter is located at :
         .../mvpp2/<controller>/ethX/c2_hits
      
      All hit counter values are 16-bits clear-on-read values.
      Signed-off-by: NMaxime Chevallier <maxime.chevallier@bootlin.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      f9d30d5b
    • M
      net: mvpp2: debugfs: add entries for classifier flows · dba1d918
      Maxime Chevallier 提交于
      The classifier configuration for RSS is quite complex, with several
      lookup tables being used. This commit adds useful info in debugfs to
      see how the different tables are configured :
      
      Added 2 new entries in the per-port directory :
      
        - .../eth0/default_rxq : The default rx queue on that port
        - .../eth0/rss_enable : Indicates if RSS is enabled in the C2 entry
      
      Added the 'flows' directory :
      
        It contains one entry per sub-flow. a 'sub-flow' is a unique path from
        Header Parser to the flow table. Multiple sub-flows can point to the
        same 'flow' (each flow has an id from 8 to 29, which is its index in the
        Lookup Id table) :
      
        - .../flows/00/...
                   /01/...
                   ...
                   /51/id : The flow id. There are 21 unique flows. There's one
                             flow per combination of the following parameters :
                             - L4 protocol (TCP, UDP, none)
                             - L3 protocol (IPv4, IPv6)
                             - L3 parameters (Fragmented or not)
                             - L2 parameters (Vlan tag presence or not)
                    .../type : The flow type. This is an even higher level flow,
                               that we manipulate with ethtool. It can be :
                               "udp4" "tcp4" "udp6" "tcp6" "ipv4" "ipv6" "other".
                    .../eth0/...
                    .../eth1/engine : The hash generation engine used for this
      	                        flow on the given port
                        .../hash_opts : The hash generation options indicating on
                                        what data we base the hash (vlan tag, src
                                        IP, src port, etc.)
      Signed-off-by: NMaxime Chevallier <maxime.chevallier@bootlin.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      dba1d918