On 5/17/23 05:11, Mike Pattrick wrote:
> From: Flavio Leitner <[email protected]>
> 
> The netdev receiving packets is supposed to provide the flags
> indicating if the L4 checksum was verified and it is OK or BAD,
> otherwise the stack will check when appropriate by software.
> 
> If the packet comes with good checksum, then postpone the
> checksum calculation to the egress device if needed.
> 
> When encapsulate a packet with that flag, set the checksum
> of the inner L4 header since that is not yet supported.
> 
> Calculate the L4 checksum when the packet is going to be sent
> over a device that doesn't support the feature.
> 
> Linux tap devices allows enabling L3 and L4 offload, so this
> patch enables the feature. However, Linux socket interface
> remains disabled because the API doesn't allow enabling
> those two features without enabling TSO too.
> 
> Signed-off-by: Flavio Leitner <[email protected]>
> Co-authored-by: Mike Pattrick <[email protected]>
> Signed-off-by: Mike Pattrick <[email protected]>
> 
> ---
>  Since v9:
>   - Extended miniflow_extract changes into avx512 code
>   - Formatting changes
>   - Note that we cannot currently enable checksum offloading in
>     CONFIGURE_VETH_OFFLOADS for check-system-userspace as
>     netdev-linux.c currently only parses the vnet header if TSO
>     is enabled.
>  Since v10:
>   - No change
>  Since v11:
>   - Added AVX512 IPv6 checksum offload support.
>   - Improved error messages and logging.
>  Since v12:
>   - Added missing mutex annotations
> 
> Signed-off-by: Mike Pattrick <[email protected]>
> ---
>  lib/conntrack.c                  |  15 +-
>  lib/dp-packet.c                  |  25 ++++
>  lib/dp-packet.h                  |  78 +++++++++-
>  lib/dpif-netdev-extract-avx512.c |  62 +++++++-
>  lib/flow.c                       |  23 +++
>  lib/netdev-dpdk.c                | 176 +++++++++++++++-------
>  lib/netdev-linux.c               | 243 +++++++++++++++++++++----------
>  lib/netdev-native-tnl.c          |  32 +---
>  lib/netdev.c                     |  46 ++----
>  lib/odp-execute-avx512.c         |  88 ++++++-----
>  lib/packets.c                    | 175 +++++++++++++++++-----
>  lib/packets.h                    |   3 +
>  12 files changed, 688 insertions(+), 278 deletions(-)
> 

<snip>

> @@ -1403,7 +1409,6 @@ static int
>  netdev_linux_batch_rxq_recv_tap(struct netdev_rxq_linux *rx, int mtu,
>                                  struct dp_packet_batch *batch)
>  {
> -    int virtio_net_hdr_size;
>      ssize_t retval;
>      size_t std_len;
>      int iovlen;
> @@ -1413,16 +1418,14 @@ netdev_linux_batch_rxq_recv_tap(struct 
> netdev_rxq_linux *rx, int mtu,
>          /* Use the buffer from the allocated packet below to receive MTU
>           * sized packets and an aux_buf for extra TSO data. */
>          iovlen = IOV_TSO_SIZE;
> -        virtio_net_hdr_size = sizeof(struct virtio_net_hdr);
>      } else {
>          /* Use only the buffer from the allocated packet. */
>          iovlen = IOV_STD_SIZE;
> -        virtio_net_hdr_size = 0;
>      }
>  
>      /* The length here needs to be accounted in the same way when the
>       * aux_buf is allocated so that it can be prepended to TSO buffer. */
> -    std_len = virtio_net_hdr_size + VLAN_ETH_HEADER_LEN + mtu;
> +    std_len = sizeof(struct virtio_net_hdr) + VLAN_ETH_HEADER_LEN + mtu;
>      for (i = 0; i < NETDEV_MAX_BURST; i++) {
>          struct dp_packet *buffer;
>          struct dp_packet *pkt;
> @@ -1462,7 +1465,7 @@ netdev_linux_batch_rxq_recv_tap(struct netdev_rxq_linux 
> *rx, int mtu,
>              pkt = buffer;
>          }
>  
> -        if (virtio_net_hdr_size && netdev_linux_parse_vnet_hdr(pkt)) {
> +        if (netdev_linux_parse_vnet_hdr(pkt)) {

If TUNSETOFFLOAD failed, we will not have a vnet header, right?

>              struct netdev *netdev_ = netdev_rxq_get_netdev(&rx->up);
>              struct netdev_linux *netdev = netdev_linux_cast(netdev_);
>  
> @@ -1611,7 +1614,7 @@ netdev_linux_sock_batch_send(int sock, int ifindex, 
> bool tso, int mtu,
>   * on other interface types because we attach a socket filter to the rx
>   * socket. */
>  static int
> -netdev_linux_tap_batch_send(struct netdev *netdev_, bool tso, int mtu,
> +netdev_linux_tap_batch_send(struct netdev *netdev_, int mtu,
>                              struct dp_packet_batch *batch)
>  {
>      struct netdev_linux *netdev = netdev_linux_cast(netdev_);
> @@ -1632,9 +1635,7 @@ netdev_linux_tap_batch_send(struct netdev *netdev_, 
> bool tso, int mtu,
>          ssize_t retval;
>          int error;
>  
> -        if (tso) {
> -            netdev_linux_prepend_vnet_hdr(packet, mtu);
> -        }
> +        netdev_linux_prepend_vnet_hdr(packet, mtu);

Is it allowed to add vnet header if TUNSETOFFLOAD failed?

>  
>          size = dp_packet_size(packet);
>          do {
> @@ -1765,7 +1766,7 @@ netdev_linux_send(struct netdev *netdev_, int qid 
> OVS_UNUSED,
>  
>          error = netdev_linux_sock_batch_send(sock, ifindex, tso, mtu, batch);
>      } else {
> -        error = netdev_linux_tap_batch_send(netdev_, tso, mtu, batch);
> +        error = netdev_linux_tap_batch_send(netdev_, mtu, batch);
>      }
>      if (error) {
>          if (error == ENOBUFS) {

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to