From patchwork Tue Jun 14 22:13:08 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mike Pattrick X-Patchwork-Id: 1643437 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=hwfNHXDK; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=140.211.166.133; helo=smtp2.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Received: from smtp2.osuosl.org (smtp2.osuosl.org [140.211.166.133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4LN2lL1rkDz9vGJ for ; Wed, 15 Jun 2022 08:13:50 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by smtp2.osuosl.org (Postfix) with ESMTP id A67FC40BAA; Tue, 14 Jun 2022 22:13:48 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp2.osuosl.org ([127.0.0.1]) by localhost (smtp2.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id PIzMK_T7QV4w; Tue, 14 Jun 2022 22:13:47 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp2.osuosl.org (Postfix) with ESMTPS id 58F1140B7B; Tue, 14 Jun 2022 22:13:46 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id A004FC0084; Tue, 14 Jun 2022 22:13:44 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp4.osuosl.org (smtp4.osuosl.org [IPv6:2605:bc80:3010::137]) by lists.linuxfoundation.org (Postfix) with ESMTP id A987DC002D for ; Tue, 14 Jun 2022 22:13:42 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id 8846E40491 for ; Tue, 14 Jun 2022 22:13:42 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Authentication-Results: smtp4.osuosl.org (amavisd-new); dkim=pass (1024-bit key) header.d=redhat.com Received: from smtp4.osuosl.org ([127.0.0.1]) by localhost (smtp4.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Odeu5uiQjTlP for ; Tue, 14 Jun 2022 22:13:41 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.8.0 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by smtp4.osuosl.org (Postfix) with ESMTPS id C42C040323 for ; Tue, 14 Jun 2022 22:13:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1655244819; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=toK+0kZhea6yIwhJdAHhJ36LkLS+Ogcz48NmiMwCgrA=; b=hwfNHXDKzxqDAxWYTJGaHoWXsYzd1AlUGl3s13UxaUbA2Tt6zReE8UFTq6zksFVUOK+jsQ TIQ2coXD9aZFQWU6I9kkxMmOuHVEJhUa0eq27ApG0kq7jhLVLLe9dcVPINoxuve1A8eQD8 OjGYohVdNFm08C1+MvW6YT9HI9Xahxo= Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-567-Y-lsvtchO5OcQlJwwUR1fw-1; Tue, 14 Jun 2022 18:13:36 -0400 X-MC-Unique: Y-lsvtchO5OcQlJwwUR1fw-1 Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.rdu2.redhat.com [10.11.54.10]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id DCCDF3C01D81; Tue, 14 Jun 2022 22:13:35 +0000 (UTC) Received: from mpattric.remote.csb (unknown [10.22.18.26]) by smtp.corp.redhat.com (Postfix) with ESMTP id 2E261492C3B; Tue, 14 Jun 2022 22:13:35 +0000 (UTC) From: Mike Pattrick To: dev@openvswitch.org Date: Tue, 14 Jun 2022 18:13:08 -0400 Message-Id: <20220614221317.1028795-1-mkp@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.85 on 10.11.54.10 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=mkp@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Cc: Flavio Leitner , maxime.coquelin@redhat.com, david.marchand@redhat.com Subject: [ovs-dev] [PATCH 01/10] dp-packet: Rename flags with CKSUM to CSUM. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Flavio Leitner It seems csum is more common and shorter. Signed-off-by: Flavio Leitner Co-authored-by: Mike Pattrick Signed-off-by: Mike Pattrick Acked-by: Maxime Coquelin Reviewed-by: David Marchand --- v2: changed title per suggestion --- lib/dp-packet.h | 72 +++++++++++++++++++++---------------------- lib/netdev-dpdk.c | 16 +++++----- lib/netdev-linux.c | 8 ++--- lib/netdev-provider.h | 8 ++--- lib/netdev.c | 6 ++-- 5 files changed, 55 insertions(+), 55 deletions(-) diff --git a/lib/dp-packet.h b/lib/dp-packet.h index bddaa2b5d..3ba5b0665 100644 --- a/lib/dp-packet.h +++ b/lib/dp-packet.h @@ -62,14 +62,14 @@ enum dp_packet_offload_mask { /* Is the 'flow_mark' valid? */ DEF_OL_FLAG(DP_PACKET_OL_FLOW_MARK, RTE_MBUF_F_RX_FDIR_ID, 0x2), /* Bad L4 checksum in the packet. */ - DEF_OL_FLAG(DP_PACKET_OL_RX_L4_CKSUM_BAD, RTE_MBUF_F_RX_L4_CKSUM_BAD, 0x4), + DEF_OL_FLAG(DP_PACKET_OL_RX_L4_CSUM_BAD, RTE_MBUF_F_RX_L4_CKSUM_BAD, 0x4), /* Bad IP checksum in the packet. */ - DEF_OL_FLAG(DP_PACKET_OL_RX_IP_CKSUM_BAD, RTE_MBUF_F_RX_IP_CKSUM_BAD, 0x8), + DEF_OL_FLAG(DP_PACKET_OL_RX_IP_CSUM_BAD, RTE_MBUF_F_RX_IP_CKSUM_BAD, 0x8), /* Valid L4 checksum in the packet. */ - DEF_OL_FLAG(DP_PACKET_OL_RX_L4_CKSUM_GOOD, RTE_MBUF_F_RX_L4_CKSUM_GOOD, + DEF_OL_FLAG(DP_PACKET_OL_RX_L4_CSUM_GOOD, RTE_MBUF_F_RX_L4_CKSUM_GOOD, 0x10), /* Valid IP checksum in the packet. */ - DEF_OL_FLAG(DP_PACKET_OL_RX_IP_CKSUM_GOOD, RTE_MBUF_F_RX_IP_CKSUM_GOOD, + DEF_OL_FLAG(DP_PACKET_OL_RX_IP_CSUM_GOOD, RTE_MBUF_F_RX_IP_CKSUM_GOOD, 0x20), /* TCP Segmentation Offload. */ DEF_OL_FLAG(DP_PACKET_OL_TX_TCP_SEG, RTE_MBUF_F_TX_TCP_SEG, 0x40), @@ -78,34 +78,34 @@ enum dp_packet_offload_mask { /* Offloaded packet is IPv6. */ DEF_OL_FLAG(DP_PACKET_OL_TX_IPV6, RTE_MBUF_F_TX_IPV6, 0x100), /* Offload TCP checksum. */ - DEF_OL_FLAG(DP_PACKET_OL_TX_TCP_CKSUM, RTE_MBUF_F_TX_TCP_CKSUM, 0x200), + DEF_OL_FLAG(DP_PACKET_OL_TX_TCP_CSUM, RTE_MBUF_F_TX_TCP_CKSUM, 0x200), /* Offload UDP checksum. */ - DEF_OL_FLAG(DP_PACKET_OL_TX_UDP_CKSUM, RTE_MBUF_F_TX_UDP_CKSUM, 0x400), + DEF_OL_FLAG(DP_PACKET_OL_TX_UDP_CSUM, RTE_MBUF_F_TX_UDP_CKSUM, 0x400), /* Offload SCTP checksum. */ - DEF_OL_FLAG(DP_PACKET_OL_TX_SCTP_CKSUM, RTE_MBUF_F_TX_SCTP_CKSUM, 0x800), + DEF_OL_FLAG(DP_PACKET_OL_TX_SCTP_CSUM, RTE_MBUF_F_TX_SCTP_CKSUM, 0x800), /* Adding new field requires adding to DP_PACKET_OL_SUPPORTED_MASK. */ }; #define DP_PACKET_OL_SUPPORTED_MASK (DP_PACKET_OL_RSS_HASH | \ DP_PACKET_OL_FLOW_MARK | \ - DP_PACKET_OL_RX_L4_CKSUM_BAD | \ - DP_PACKET_OL_RX_IP_CKSUM_BAD | \ - DP_PACKET_OL_RX_L4_CKSUM_GOOD | \ - DP_PACKET_OL_RX_IP_CKSUM_GOOD | \ + DP_PACKET_OL_RX_L4_CSUM_BAD | \ + DP_PACKET_OL_RX_IP_CSUM_BAD | \ + DP_PACKET_OL_RX_L4_CSUM_GOOD | \ + DP_PACKET_OL_RX_IP_CSUM_GOOD | \ DP_PACKET_OL_TX_TCP_SEG | \ DP_PACKET_OL_TX_IPV4 | \ DP_PACKET_OL_TX_IPV6 | \ - DP_PACKET_OL_TX_TCP_CKSUM | \ - DP_PACKET_OL_TX_UDP_CKSUM | \ - DP_PACKET_OL_TX_SCTP_CKSUM) - -#define DP_PACKET_OL_TX_L4_MASK (DP_PACKET_OL_TX_TCP_CKSUM | \ - DP_PACKET_OL_TX_UDP_CKSUM | \ - DP_PACKET_OL_TX_SCTP_CKSUM) -#define DP_PACKET_OL_RX_IP_CKSUM_MASK (DP_PACKET_OL_RX_IP_CKSUM_GOOD | \ - DP_PACKET_OL_RX_IP_CKSUM_BAD) -#define DP_PACKET_OL_RX_L4_CKSUM_MASK (DP_PACKET_OL_RX_L4_CKSUM_GOOD | \ - DP_PACKET_OL_RX_L4_CKSUM_BAD) + DP_PACKET_OL_TX_TCP_CSUM | \ + DP_PACKET_OL_TX_UDP_CSUM | \ + DP_PACKET_OL_TX_SCTP_CSUM) + +#define DP_PACKET_OL_TX_L4_MASK (DP_PACKET_OL_TX_TCP_CSUM | \ + DP_PACKET_OL_TX_UDP_CSUM | \ + DP_PACKET_OL_TX_SCTP_CSUM) +#define DP_PACKET_OL_RX_IP_CSUM_MASK (DP_PACKET_OL_RX_IP_CSUM_GOOD | \ + DP_PACKET_OL_RX_IP_CSUM_BAD) +#define DP_PACKET_OL_RX_L4_CSUM_MASK (DP_PACKET_OL_RX_L4_CSUM_GOOD | \ + DP_PACKET_OL_RX_L4_CSUM_BAD) /* Buffer for holding packet data. A dp_packet is automatically reallocated * as necessary if it grows too large for the available memory. @@ -991,7 +991,7 @@ static inline bool dp_packet_hwol_l4_is_tcp(const struct dp_packet *b) { return (*dp_packet_ol_flags_ptr(b) & DP_PACKET_OL_TX_L4_MASK) == - DP_PACKET_OL_TX_TCP_CKSUM; + DP_PACKET_OL_TX_TCP_CSUM; } /* Returns 'true' if packet 'b' is marked for UDP checksum offloading. */ @@ -999,7 +999,7 @@ static inline bool dp_packet_hwol_l4_is_udp(struct dp_packet *b) { return (*dp_packet_ol_flags_ptr(b) & DP_PACKET_OL_TX_L4_MASK) == - DP_PACKET_OL_TX_UDP_CKSUM; + DP_PACKET_OL_TX_UDP_CSUM; } /* Returns 'true' if packet 'b' is marked for SCTP checksum offloading. */ @@ -1007,7 +1007,7 @@ static inline bool dp_packet_hwol_l4_is_sctp(struct dp_packet *b) { return (*dp_packet_ol_flags_ptr(b) & DP_PACKET_OL_TX_L4_MASK) == - DP_PACKET_OL_TX_SCTP_CKSUM; + DP_PACKET_OL_TX_SCTP_CSUM; } /* Mark packet 'b' for IPv4 checksum offloading. */ @@ -1029,7 +1029,7 @@ dp_packet_hwol_set_tx_ipv6(struct dp_packet *b) static inline void dp_packet_hwol_set_csum_tcp(struct dp_packet *b) { - *dp_packet_ol_flags_ptr(b) |= DP_PACKET_OL_TX_TCP_CKSUM; + *dp_packet_ol_flags_ptr(b) |= DP_PACKET_OL_TX_TCP_CSUM; } /* Mark packet 'b' for UDP checksum offloading. It implies that either @@ -1037,7 +1037,7 @@ dp_packet_hwol_set_csum_tcp(struct dp_packet *b) static inline void dp_packet_hwol_set_csum_udp(struct dp_packet *b) { - *dp_packet_ol_flags_ptr(b) |= DP_PACKET_OL_TX_UDP_CKSUM; + *dp_packet_ol_flags_ptr(b) |= DP_PACKET_OL_TX_UDP_CSUM; } /* Mark packet 'b' for SCTP checksum offloading. It implies that either @@ -1045,7 +1045,7 @@ dp_packet_hwol_set_csum_udp(struct dp_packet *b) static inline void dp_packet_hwol_set_csum_sctp(struct dp_packet *b) { - *dp_packet_ol_flags_ptr(b) |= DP_PACKET_OL_TX_SCTP_CKSUM; + *dp_packet_ol_flags_ptr(b) |= DP_PACKET_OL_TX_SCTP_CSUM; } /* Mark packet 'b' for TCP segmentation offloading. It implies that @@ -1060,29 +1060,29 @@ dp_packet_hwol_set_tcp_seg(struct dp_packet *b) static inline bool dp_packet_ip_checksum_valid(const struct dp_packet *p) { - return (*dp_packet_ol_flags_ptr(p) & DP_PACKET_OL_RX_IP_CKSUM_MASK) == - DP_PACKET_OL_RX_IP_CKSUM_GOOD; + return (*dp_packet_ol_flags_ptr(p) & DP_PACKET_OL_RX_IP_CSUM_MASK) == + DP_PACKET_OL_RX_IP_CSUM_GOOD; } static inline bool dp_packet_ip_checksum_bad(const struct dp_packet *p) { - return (*dp_packet_ol_flags_ptr(p) & DP_PACKET_OL_RX_IP_CKSUM_MASK) == - DP_PACKET_OL_RX_IP_CKSUM_BAD; + return (*dp_packet_ol_flags_ptr(p) & DP_PACKET_OL_RX_IP_CSUM_MASK) == + DP_PACKET_OL_RX_IP_CSUM_BAD; } static inline bool dp_packet_l4_checksum_valid(const struct dp_packet *p) { - return (*dp_packet_ol_flags_ptr(p) & DP_PACKET_OL_RX_L4_CKSUM_MASK) == - DP_PACKET_OL_RX_L4_CKSUM_GOOD; + return (*dp_packet_ol_flags_ptr(p) & DP_PACKET_OL_RX_L4_CSUM_MASK) == + DP_PACKET_OL_RX_L4_CSUM_GOOD; } static inline bool dp_packet_l4_checksum_bad(const struct dp_packet *p) { - return (*dp_packet_ol_flags_ptr(p) & DP_PACKET_OL_RX_L4_CKSUM_MASK) == - DP_PACKET_OL_RX_L4_CKSUM_BAD; + return (*dp_packet_ol_flags_ptr(p) & DP_PACKET_OL_RX_L4_CSUM_MASK) == + DP_PACKET_OL_RX_L4_CSUM_BAD; } static inline void ALWAYS_INLINE diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index f9535bfb4..d7350636e 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -4938,11 +4938,11 @@ netdev_dpdk_reconfigure(struct netdev *netdev) err = dpdk_eth_dev_init(dev); if (dev->hw_ol_features & NETDEV_TX_TSO_OFFLOAD) { netdev->ol_flags |= NETDEV_TX_OFFLOAD_TCP_TSO; - netdev->ol_flags |= NETDEV_TX_OFFLOAD_TCP_CKSUM; - netdev->ol_flags |= NETDEV_TX_OFFLOAD_UDP_CKSUM; - netdev->ol_flags |= NETDEV_TX_OFFLOAD_IPV4_CKSUM; + netdev->ol_flags |= NETDEV_TX_OFFLOAD_TCP_CSUM; + netdev->ol_flags |= NETDEV_TX_OFFLOAD_UDP_CSUM; + netdev->ol_flags |= NETDEV_TX_OFFLOAD_IPV4_CSUM; if (dev->hw_ol_features & NETDEV_TX_SCTP_CHECKSUM_OFFLOAD) { - netdev->ol_flags |= NETDEV_TX_OFFLOAD_SCTP_CKSUM; + netdev->ol_flags |= NETDEV_TX_OFFLOAD_SCTP_CSUM; } } @@ -5085,10 +5085,10 @@ netdev_dpdk_vhost_client_reconfigure(struct netdev *netdev) if (userspace_tso_enabled()) { netdev->ol_flags |= NETDEV_TX_OFFLOAD_TCP_TSO; - netdev->ol_flags |= NETDEV_TX_OFFLOAD_TCP_CKSUM; - netdev->ol_flags |= NETDEV_TX_OFFLOAD_UDP_CKSUM; - netdev->ol_flags |= NETDEV_TX_OFFLOAD_SCTP_CKSUM; - netdev->ol_flags |= NETDEV_TX_OFFLOAD_IPV4_CKSUM; + netdev->ol_flags |= NETDEV_TX_OFFLOAD_TCP_CSUM; + netdev->ol_flags |= NETDEV_TX_OFFLOAD_UDP_CSUM; + netdev->ol_flags |= NETDEV_TX_OFFLOAD_SCTP_CSUM; + netdev->ol_flags |= NETDEV_TX_OFFLOAD_IPV4_CSUM; vhost_unsup_flags = 1ULL << VIRTIO_NET_F_HOST_ECN | 1ULL << VIRTIO_NET_F_HOST_UFO; } else { diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c index 2766b3f2b..3cf02b76a 100644 --- a/lib/netdev-linux.c +++ b/lib/netdev-linux.c @@ -929,10 +929,10 @@ netdev_linux_common_construct(struct netdev *netdev_) if (userspace_tso_enabled()) { netdev_->ol_flags |= NETDEV_TX_OFFLOAD_TCP_TSO; - netdev_->ol_flags |= NETDEV_TX_OFFLOAD_TCP_CKSUM; - netdev_->ol_flags |= NETDEV_TX_OFFLOAD_UDP_CKSUM; - netdev_->ol_flags |= NETDEV_TX_OFFLOAD_SCTP_CKSUM; - netdev_->ol_flags |= NETDEV_TX_OFFLOAD_IPV4_CKSUM; + netdev_->ol_flags |= NETDEV_TX_OFFLOAD_TCP_CSUM; + netdev_->ol_flags |= NETDEV_TX_OFFLOAD_UDP_CSUM; + netdev_->ol_flags |= NETDEV_TX_OFFLOAD_SCTP_CSUM; + netdev_->ol_flags |= NETDEV_TX_OFFLOAD_IPV4_CSUM; } return 0; diff --git a/lib/netdev-provider.h b/lib/netdev-provider.h index b5420947d..08bf8b871 100644 --- a/lib/netdev-provider.h +++ b/lib/netdev-provider.h @@ -38,10 +38,10 @@ struct netdev_tnl_build_header_params; #define NETDEV_NUMA_UNSPEC OVS_NUMA_UNSPEC enum netdev_ol_flags { - NETDEV_TX_OFFLOAD_IPV4_CKSUM = 1 << 0, - NETDEV_TX_OFFLOAD_TCP_CKSUM = 1 << 1, - NETDEV_TX_OFFLOAD_UDP_CKSUM = 1 << 2, - NETDEV_TX_OFFLOAD_SCTP_CKSUM = 1 << 3, + NETDEV_TX_OFFLOAD_IPV4_CSUM = 1 << 0, + NETDEV_TX_OFFLOAD_TCP_CSUM = 1 << 1, + NETDEV_TX_OFFLOAD_UDP_CSUM = 1 << 2, + NETDEV_TX_OFFLOAD_SCTP_CSUM = 1 << 3, NETDEV_TX_OFFLOAD_TCP_TSO = 1 << 4, }; diff --git a/lib/netdev.c b/lib/netdev.c index 8305f6c42..e9b2bbe83 100644 --- a/lib/netdev.c +++ b/lib/netdev.c @@ -804,19 +804,19 @@ netdev_send_prepare_packet(const uint64_t netdev_flags, l4_mask = dp_packet_hwol_l4_mask(packet); if (l4_mask) { if (dp_packet_hwol_l4_is_tcp(packet)) { - if (!(netdev_flags & NETDEV_TX_OFFLOAD_TCP_CKSUM)) { + if (!(netdev_flags & NETDEV_TX_OFFLOAD_TCP_CSUM)) { /* Fall back to TCP csum in software. */ VLOG_ERR_BUF(errormsg, "No TCP checksum support"); return false; } } else if (dp_packet_hwol_l4_is_udp(packet)) { - if (!(netdev_flags & NETDEV_TX_OFFLOAD_UDP_CKSUM)) { + if (!(netdev_flags & NETDEV_TX_OFFLOAD_UDP_CSUM)) { /* Fall back to UDP csum in software. */ VLOG_ERR_BUF(errormsg, "No UDP checksum support"); return false; } } else if (dp_packet_hwol_l4_is_sctp(packet)) { - if (!(netdev_flags & NETDEV_TX_OFFLOAD_SCTP_CKSUM)) { + if (!(netdev_flags & NETDEV_TX_OFFLOAD_SCTP_CSUM)) { /* Fall back to SCTP csum in software. */ VLOG_ERR_BUF(errormsg, "No SCTP checksum support"); return false; From patchwork Tue Jun 14 22:13:09 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mike Pattrick X-Patchwork-Id: 1643443 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=ISlOkN8e; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=140.211.166.137; helo=smtp4.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Received: from smtp4.osuosl.org (smtp4.osuosl.org [140.211.166.137]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4LN2lg5B7Sz9vGL for ; Wed, 15 Jun 2022 08:14:07 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id 9A4C7418C9; Tue, 14 Jun 2022 22:14:03 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp4.osuosl.org ([127.0.0.1]) by localhost (smtp4.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id NUd05qtxxQTU; Tue, 14 Jun 2022 22:14:01 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp4.osuosl.org (Postfix) with ESMTPS id 1F549418C1; Tue, 14 Jun 2022 22:13:58 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 36549C008E; Tue, 14 Jun 2022 22:13:55 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp3.osuosl.org (smtp3.osuosl.org [140.211.166.136]) by lists.linuxfoundation.org (Postfix) with ESMTP id 53EDFC0081 for ; Tue, 14 Jun 2022 22:13:46 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp3.osuosl.org (Postfix) with ESMTP id 3D05F60AE3 for ; Tue, 14 Jun 2022 22:13:46 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Authentication-Results: smtp3.osuosl.org (amavisd-new); dkim=pass (1024-bit key) header.d=redhat.com Received: from smtp3.osuosl.org ([127.0.0.1]) by localhost (smtp3.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id LMCsApO4ou0e for ; Tue, 14 Jun 2022 22:13:45 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.8.0 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by smtp3.osuosl.org (Postfix) with ESMTPS id 54CFF60B54 for ; Tue, 14 Jun 2022 22:13:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1655244819; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=OsOnjOlEmtUL8dKaH0fy/xG7CyG+YWdtHrjmW9F+5k0=; b=ISlOkN8eGTakWGMeeOlEUuLK41GE6wTfruOmbGWxHEdVpR5vkr8yGKen5JK4h9TCnJ9WXN LyQeVJUMVtRb1HHSk7Z6J82csKH/2vVHAKVmWsiFJR7hVBbnBDHFT6fnlLjX3sGYBQ5l0r NjNvPedaywRxnHkz2xK4y09Fg2hJeJ4= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-644-q9Ttl6ZVNZe65fKRlomvWw-1; Tue, 14 Jun 2022 18:13:36 -0400 X-MC-Unique: q9Ttl6ZVNZe65fKRlomvWw-1 Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.rdu2.redhat.com [10.11.54.10]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 5FE1785A582; Tue, 14 Jun 2022 22:13:36 +0000 (UTC) Received: from mpattric.remote.csb (unknown [10.22.18.26]) by smtp.corp.redhat.com (Postfix) with ESMTP id EF9A0492C3B; Tue, 14 Jun 2022 22:13:35 +0000 (UTC) From: Mike Pattrick To: dev@openvswitch.org Date: Tue, 14 Jun 2022 18:13:09 -0400 Message-Id: <20220614221317.1028795-2-mkp@redhat.com> In-Reply-To: <20220614221317.1028795-1-mkp@redhat.com> References: <20220614221317.1028795-1-mkp@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.85 on 10.11.54.10 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=mkp@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Cc: Flavio Leitner , maxime.coquelin@redhat.com, david.marchand@redhat.com Subject: [ovs-dev] [PATCH 02/10] netdev: Prefix offload flags with NETDEV_OFFLOAD_ X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Flavio Leitner Use the 'NETDEV_OFFLOAD_' prefix in the flags to indicate we are talking about hardware offloading capabilities. Signed-off-by: Flavio Leitner Co-authored-by: Mike Pattrick Signed-off-by: Mike Pattrick Reviewed-by: David Marchand Acked-by: Maxime Coquelin --- v2: changed title per suggestion --- lib/netdev-dpdk.c | 20 ++++++++++---------- lib/netdev-linux.c | 10 +++++----- lib/netdev-provider.h | 10 +++++----- lib/netdev.c | 8 ++++---- 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index d7350636e..e9b539197 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -4937,12 +4937,12 @@ netdev_dpdk_reconfigure(struct netdev *netdev) err = dpdk_eth_dev_init(dev); if (dev->hw_ol_features & NETDEV_TX_TSO_OFFLOAD) { - netdev->ol_flags |= NETDEV_TX_OFFLOAD_TCP_TSO; - netdev->ol_flags |= NETDEV_TX_OFFLOAD_TCP_CSUM; - netdev->ol_flags |= NETDEV_TX_OFFLOAD_UDP_CSUM; - netdev->ol_flags |= NETDEV_TX_OFFLOAD_IPV4_CSUM; + netdev->ol_flags |= NETDEV_OFFLOAD_TX_TCP_TSO; + netdev->ol_flags |= NETDEV_OFFLOAD_TX_TCP_CSUM; + netdev->ol_flags |= NETDEV_OFFLOAD_TX_UDP_CSUM; + netdev->ol_flags |= NETDEV_OFFLOAD_TX_IPV4_CSUM; if (dev->hw_ol_features & NETDEV_TX_SCTP_CHECKSUM_OFFLOAD) { - netdev->ol_flags |= NETDEV_TX_OFFLOAD_SCTP_CSUM; + netdev->ol_flags |= NETDEV_OFFLOAD_TX_SCTP_CSUM; } } @@ -5084,11 +5084,11 @@ netdev_dpdk_vhost_client_reconfigure(struct netdev *netdev) } if (userspace_tso_enabled()) { - netdev->ol_flags |= NETDEV_TX_OFFLOAD_TCP_TSO; - netdev->ol_flags |= NETDEV_TX_OFFLOAD_TCP_CSUM; - netdev->ol_flags |= NETDEV_TX_OFFLOAD_UDP_CSUM; - netdev->ol_flags |= NETDEV_TX_OFFLOAD_SCTP_CSUM; - netdev->ol_flags |= NETDEV_TX_OFFLOAD_IPV4_CSUM; + netdev->ol_flags |= NETDEV_OFFLOAD_TX_TCP_TSO; + netdev->ol_flags |= NETDEV_OFFLOAD_TX_TCP_CSUM; + netdev->ol_flags |= NETDEV_OFFLOAD_TX_UDP_CSUM; + netdev->ol_flags |= NETDEV_OFFLOAD_TX_SCTP_CSUM; + netdev->ol_flags |= NETDEV_OFFLOAD_TX_IPV4_CSUM; vhost_unsup_flags = 1ULL << VIRTIO_NET_F_HOST_ECN | 1ULL << VIRTIO_NET_F_HOST_UFO; } else { diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c index 3cf02b76a..129043812 100644 --- a/lib/netdev-linux.c +++ b/lib/netdev-linux.c @@ -928,11 +928,11 @@ netdev_linux_common_construct(struct netdev *netdev_) ovs_mutex_init(&netdev->mutex); if (userspace_tso_enabled()) { - netdev_->ol_flags |= NETDEV_TX_OFFLOAD_TCP_TSO; - netdev_->ol_flags |= NETDEV_TX_OFFLOAD_TCP_CSUM; - netdev_->ol_flags |= NETDEV_TX_OFFLOAD_UDP_CSUM; - netdev_->ol_flags |= NETDEV_TX_OFFLOAD_SCTP_CSUM; - netdev_->ol_flags |= NETDEV_TX_OFFLOAD_IPV4_CSUM; + netdev_->ol_flags |= NETDEV_OFFLOAD_TX_TCP_TSO; + netdev_->ol_flags |= NETDEV_OFFLOAD_TX_TCP_CSUM; + netdev_->ol_flags |= NETDEV_OFFLOAD_TX_UDP_CSUM; + netdev_->ol_flags |= NETDEV_OFFLOAD_TX_SCTP_CSUM; + netdev_->ol_flags |= NETDEV_OFFLOAD_TX_IPV4_CSUM; } return 0; diff --git a/lib/netdev-provider.h b/lib/netdev-provider.h index 08bf8b871..0a8538615 100644 --- a/lib/netdev-provider.h +++ b/lib/netdev-provider.h @@ -38,11 +38,11 @@ struct netdev_tnl_build_header_params; #define NETDEV_NUMA_UNSPEC OVS_NUMA_UNSPEC enum netdev_ol_flags { - NETDEV_TX_OFFLOAD_IPV4_CSUM = 1 << 0, - NETDEV_TX_OFFLOAD_TCP_CSUM = 1 << 1, - NETDEV_TX_OFFLOAD_UDP_CSUM = 1 << 2, - NETDEV_TX_OFFLOAD_SCTP_CSUM = 1 << 3, - NETDEV_TX_OFFLOAD_TCP_TSO = 1 << 4, + NETDEV_OFFLOAD_TX_IPV4_CSUM = 1 << 0, + NETDEV_OFFLOAD_TX_TCP_CSUM = 1 << 1, + NETDEV_OFFLOAD_TX_UDP_CSUM = 1 << 2, + NETDEV_OFFLOAD_TX_SCTP_CSUM = 1 << 3, + NETDEV_OFFLOAD_TX_TCP_TSO = 1 << 4, }; /* A network device (e.g. an Ethernet device). diff --git a/lib/netdev.c b/lib/netdev.c index e9b2bbe83..a06138aca 100644 --- a/lib/netdev.c +++ b/lib/netdev.c @@ -795,7 +795,7 @@ netdev_send_prepare_packet(const uint64_t netdev_flags, uint64_t l4_mask; if (dp_packet_hwol_is_tso(packet) - && !(netdev_flags & NETDEV_TX_OFFLOAD_TCP_TSO)) { + && !(netdev_flags & NETDEV_OFFLOAD_TX_TCP_TSO)) { /* Fall back to GSO in software. */ VLOG_ERR_BUF(errormsg, "No TSO support"); return false; @@ -804,19 +804,19 @@ netdev_send_prepare_packet(const uint64_t netdev_flags, l4_mask = dp_packet_hwol_l4_mask(packet); if (l4_mask) { if (dp_packet_hwol_l4_is_tcp(packet)) { - if (!(netdev_flags & NETDEV_TX_OFFLOAD_TCP_CSUM)) { + if (!(netdev_flags & NETDEV_OFFLOAD_TX_TCP_CSUM)) { /* Fall back to TCP csum in software. */ VLOG_ERR_BUF(errormsg, "No TCP checksum support"); return false; } } else if (dp_packet_hwol_l4_is_udp(packet)) { - if (!(netdev_flags & NETDEV_TX_OFFLOAD_UDP_CSUM)) { + if (!(netdev_flags & NETDEV_OFFLOAD_TX_UDP_CSUM)) { /* Fall back to UDP csum in software. */ VLOG_ERR_BUF(errormsg, "No UDP checksum support"); return false; } } else if (dp_packet_hwol_l4_is_sctp(packet)) { - if (!(netdev_flags & NETDEV_TX_OFFLOAD_SCTP_CSUM)) { + if (!(netdev_flags & NETDEV_OFFLOAD_TX_SCTP_CSUM)) { /* Fall back to SCTP csum in software. */ VLOG_ERR_BUF(errormsg, "No SCTP checksum support"); return false; From patchwork Tue Jun 14 22:13:10 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mike Pattrick X-Patchwork-Id: 1643438 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=Qg3EHFwV; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=140.211.166.136; helo=smtp3.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Received: from smtp3.osuosl.org (smtp3.osuosl.org [140.211.166.136]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4LN2lP2sykz9vGJ for ; Wed, 15 Jun 2022 08:13:53 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by smtp3.osuosl.org (Postfix) with ESMTP id 05A5260FEE; Tue, 14 Jun 2022 22:13:50 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp3.osuosl.org ([127.0.0.1]) by localhost (smtp3.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id zdPPOCTR-bpc; Tue, 14 Jun 2022 22:13:48 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp3.osuosl.org (Postfix) with ESMTPS id 8CF0560F68; Tue, 14 Jun 2022 22:13:47 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id D40C3C0083; Tue, 14 Jun 2022 22:13:46 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp4.osuosl.org (smtp4.osuosl.org [140.211.166.137]) by lists.linuxfoundation.org (Postfix) with ESMTP id 57868C002D for ; Tue, 14 Jun 2022 22:13:43 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id 3559540323 for ; Tue, 14 Jun 2022 22:13:43 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Authentication-Results: smtp4.osuosl.org (amavisd-new); dkim=pass (1024-bit key) header.d=redhat.com Received: from smtp4.osuosl.org ([127.0.0.1]) by localhost (smtp4.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id um4PRYrzA50R for ; Tue, 14 Jun 2022 22:13:41 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.8.0 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by smtp4.osuosl.org (Postfix) with ESMTPS id 568C040327 for ; Tue, 14 Jun 2022 22:13:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1655244820; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=3ioLFcSCFStIBFaL/gMjTAE1CCgi7nFvyZngTjGfGQw=; b=Qg3EHFwVtb5avliACDPuz5wwZCudqbUVj1sDkMxgqNYSRIpaD/WDIfEauBokicuttQUkBz lW/tMZ06S7Nzzmv9BivsAPQi+HMSfx1sVmgBxBDB7/LFHBcnmnIeT4zgd7BIn9u7aOSeEs lRZq3XGS3tZHrLx0K4Y89vVhfHVj9O8= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-182-HKggSsJzP6CRY2cOYa4jsA-1; Tue, 14 Jun 2022 18:13:37 -0400 X-MC-Unique: HKggSsJzP6CRY2cOYa4jsA-1 Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.rdu2.redhat.com [10.11.54.10]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id EBFB9185A7B2; Tue, 14 Jun 2022 22:13:36 +0000 (UTC) Received: from mpattric.remote.csb (unknown [10.22.18.26]) by smtp.corp.redhat.com (Postfix) with ESMTP id 77960492C3B; Tue, 14 Jun 2022 22:13:36 +0000 (UTC) From: Mike Pattrick To: dev@openvswitch.org Date: Tue, 14 Jun 2022 18:13:10 -0400 Message-Id: <20220614221317.1028795-3-mkp@redhat.com> In-Reply-To: <20220614221317.1028795-2-mkp@redhat.com> References: <20220614221317.1028795-1-mkp@redhat.com> <20220614221317.1028795-2-mkp@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.85 on 10.11.54.10 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=mkp@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Cc: Flavio Leitner , maxime.coquelin@redhat.com, david.marchand@redhat.com Subject: [ovs-dev] [PATCH 03/10] dp-packet: Rename dp_packet_hwol to dp_packet_ol. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Flavio Leitner The name correlates better with the flag names. Signed-off-by: Flavio Leitner Co-authored-by: Mike Pattrick Signed-off-by: Mike Pattrick Acked-by: Maxime Coquelin Reviewed-by: David Marchand --- v2: changed title per suggestion --- lib/conntrack.c | 8 ++++---- lib/dp-packet.h | 28 ++++++++++++++-------------- lib/ipf.c | 6 +++--- lib/netdev-dpdk.c | 20 ++++++++++---------- lib/netdev-linux.c | 24 ++++++++++++------------ lib/netdev.c | 14 +++++++------- 6 files changed, 50 insertions(+), 50 deletions(-) diff --git a/lib/conntrack.c b/lib/conntrack.c index b243370d0..39dddefbf 100644 --- a/lib/conntrack.c +++ b/lib/conntrack.c @@ -2095,7 +2095,7 @@ conn_key_extract(struct conntrack *ct, struct dp_packet *pkt, ovs_be16 dl_type, COVERAGE_INC(conntrack_l3csum_err); } else { bool hwol_good_l3_csum = dp_packet_ip_checksum_valid(pkt) - || dp_packet_hwol_is_ipv4(pkt); + || dp_packet_ol_is_ipv4(pkt); /* Validate the checksum only when hwol is not supported. */ ok = extract_l3_ipv4(&ctx->key, l3, dp_packet_l3_size(pkt), NULL, !hwol_good_l3_csum); @@ -2110,7 +2110,7 @@ conn_key_extract(struct conntrack *ct, struct dp_packet *pkt, ovs_be16 dl_type, bool hwol_bad_l4_csum = dp_packet_l4_checksum_bad(pkt); if (!hwol_bad_l4_csum) { bool hwol_good_l4_csum = dp_packet_l4_checksum_valid(pkt) - || dp_packet_hwol_tx_l4_checksum(pkt); + || dp_packet_ol_tx_l4_checksum(pkt); /* Validate the checksum only when hwol is not supported. */ if (extract_l4(&ctx->key, l4, dp_packet_l4_size(pkt), &ctx->icmp_related, l3, !hwol_good_l4_csum, @@ -3402,7 +3402,7 @@ handle_ftp_ctl(struct conntrack *ct, const struct conn_lookup_ctx *ctx, } if (seq_skew) { ip_len = ntohs(l3_hdr->ip_tot_len) + seq_skew; - if (!dp_packet_hwol_is_ipv4(pkt)) { + if (!dp_packet_ol_is_ipv4(pkt)) { l3_hdr->ip_csum = recalc_csum16(l3_hdr->ip_csum, l3_hdr->ip_tot_len, htons(ip_len)); @@ -3424,7 +3424,7 @@ handle_ftp_ctl(struct conntrack *ct, const struct conn_lookup_ctx *ctx, } th->tcp_csum = 0; - if (!dp_packet_hwol_tx_l4_checksum(pkt)) { + if (!dp_packet_ol_tx_l4_checksum(pkt)) { if (ctx->key.dl_type == htons(ETH_TYPE_IPV6)) { th->tcp_csum = packet_csum_upperlayer6(nh6, th, ctx->key.nw_proto, dp_packet_l4_size(pkt)); diff --git a/lib/dp-packet.h b/lib/dp-packet.h index 3ba5b0665..968ec7534 100644 --- a/lib/dp-packet.h +++ b/lib/dp-packet.h @@ -960,35 +960,35 @@ dp_packet_set_flow_mark(struct dp_packet *p, uint32_t mark) /* Returns the L4 cksum offload bitmask. */ static inline uint64_t -dp_packet_hwol_l4_mask(const struct dp_packet *b) +dp_packet_ol_l4_mask(const struct dp_packet *b) { return *dp_packet_ol_flags_ptr(b) & DP_PACKET_OL_TX_L4_MASK; } /* Return true if the packet 'b' requested L4 checksum offload. */ static inline bool -dp_packet_hwol_tx_l4_checksum(const struct dp_packet *b) +dp_packet_ol_tx_l4_checksum(const struct dp_packet *b) { - return !!dp_packet_hwol_l4_mask(b); + return !!dp_packet_ol_l4_mask(b); } /* Returns 'true' if packet 'b' is marked for TCP segmentation offloading. */ static inline bool -dp_packet_hwol_is_tso(const struct dp_packet *b) +dp_packet_ol_is_tso(const struct dp_packet *b) { return !!(*dp_packet_ol_flags_ptr(b) & DP_PACKET_OL_TX_TCP_SEG); } /* Returns 'true' if packet 'b' is marked for IPv4 checksum offloading. */ static inline bool -dp_packet_hwol_is_ipv4(const struct dp_packet *b) +dp_packet_ol_is_ipv4(const struct dp_packet *b) { return !!(*dp_packet_ol_flags_ptr(b) & DP_PACKET_OL_TX_IPV4); } /* Returns 'true' if packet 'b' is marked for TCP checksum offloading. */ static inline bool -dp_packet_hwol_l4_is_tcp(const struct dp_packet *b) +dp_packet_ol_l4_is_tcp(const struct dp_packet *b) { return (*dp_packet_ol_flags_ptr(b) & DP_PACKET_OL_TX_L4_MASK) == DP_PACKET_OL_TX_TCP_CSUM; @@ -996,7 +996,7 @@ dp_packet_hwol_l4_is_tcp(const struct dp_packet *b) /* Returns 'true' if packet 'b' is marked for UDP checksum offloading. */ static inline bool -dp_packet_hwol_l4_is_udp(struct dp_packet *b) +dp_packet_ol_l4_is_udp(struct dp_packet *b) { return (*dp_packet_ol_flags_ptr(b) & DP_PACKET_OL_TX_L4_MASK) == DP_PACKET_OL_TX_UDP_CSUM; @@ -1004,7 +1004,7 @@ dp_packet_hwol_l4_is_udp(struct dp_packet *b) /* Returns 'true' if packet 'b' is marked for SCTP checksum offloading. */ static inline bool -dp_packet_hwol_l4_is_sctp(struct dp_packet *b) +dp_packet_ol_l4_is_sctp(struct dp_packet *b) { return (*dp_packet_ol_flags_ptr(b) & DP_PACKET_OL_TX_L4_MASK) == DP_PACKET_OL_TX_SCTP_CSUM; @@ -1012,14 +1012,14 @@ dp_packet_hwol_l4_is_sctp(struct dp_packet *b) /* Mark packet 'b' for IPv4 checksum offloading. */ static inline void -dp_packet_hwol_set_tx_ipv4(struct dp_packet *b) +dp_packet_ol_set_tx_ipv4(struct dp_packet *b) { *dp_packet_ol_flags_ptr(b) |= DP_PACKET_OL_TX_IPV4; } /* Mark packet 'b' for IPv6 checksum offloading. */ static inline void -dp_packet_hwol_set_tx_ipv6(struct dp_packet *b) +dp_packet_ol_set_tx_ipv6(struct dp_packet *b) { *dp_packet_ol_flags_ptr(b) |= DP_PACKET_OL_TX_IPV6; } @@ -1027,7 +1027,7 @@ dp_packet_hwol_set_tx_ipv6(struct dp_packet *b) /* Mark packet 'b' for TCP checksum offloading. It implies that either * the packet 'b' is marked for IPv4 or IPv6 checksum offloading. */ static inline void -dp_packet_hwol_set_csum_tcp(struct dp_packet *b) +dp_packet_ol_set_csum_tcp(struct dp_packet *b) { *dp_packet_ol_flags_ptr(b) |= DP_PACKET_OL_TX_TCP_CSUM; } @@ -1035,7 +1035,7 @@ dp_packet_hwol_set_csum_tcp(struct dp_packet *b) /* Mark packet 'b' for UDP checksum offloading. It implies that either * the packet 'b' is marked for IPv4 or IPv6 checksum offloading. */ static inline void -dp_packet_hwol_set_csum_udp(struct dp_packet *b) +dp_packet_ol_set_csum_udp(struct dp_packet *b) { *dp_packet_ol_flags_ptr(b) |= DP_PACKET_OL_TX_UDP_CSUM; } @@ -1043,7 +1043,7 @@ dp_packet_hwol_set_csum_udp(struct dp_packet *b) /* Mark packet 'b' for SCTP checksum offloading. It implies that either * the packet 'b' is marked for IPv4 or IPv6 checksum offloading. */ static inline void -dp_packet_hwol_set_csum_sctp(struct dp_packet *b) +dp_packet_ol_set_csum_sctp(struct dp_packet *b) { *dp_packet_ol_flags_ptr(b) |= DP_PACKET_OL_TX_SCTP_CSUM; } @@ -1052,7 +1052,7 @@ dp_packet_hwol_set_csum_sctp(struct dp_packet *b) * either the packet 'b' is marked for IPv4 or IPv6 checksum offloading * and also for TCP checksum offloading. */ static inline void -dp_packet_hwol_set_tcp_seg(struct dp_packet *b) +dp_packet_ol_set_tcp_seg(struct dp_packet *b) { *dp_packet_ol_flags_ptr(b) |= DP_PACKET_OL_TX_TCP_SEG; } diff --git a/lib/ipf.c b/lib/ipf.c index d45266374..df9dd01dd 100644 --- a/lib/ipf.c +++ b/lib/ipf.c @@ -433,7 +433,7 @@ ipf_reassemble_v4_frags(struct ipf_list *ipf_list) len += rest_len; l3 = dp_packet_l3(pkt); ovs_be16 new_ip_frag_off = l3->ip_frag_off & ~htons(IP_MORE_FRAGMENTS); - if (!dp_packet_hwol_is_ipv4(pkt)) { + if (!dp_packet_ol_is_ipv4(pkt)) { l3->ip_csum = recalc_csum16(l3->ip_csum, l3->ip_frag_off, new_ip_frag_off); l3->ip_csum = recalc_csum16(l3->ip_csum, l3->ip_tot_len, htons(len)); @@ -609,7 +609,7 @@ ipf_is_valid_v4_frag(struct ipf *ipf, struct dp_packet *pkt) } if (OVS_UNLIKELY(!dp_packet_ip_checksum_valid(pkt) - && !dp_packet_hwol_is_ipv4(pkt) + && !dp_packet_ol_is_ipv4(pkt) && csum(l3, ip_hdr_len) != 0)) { COVERAGE_INC(ipf_l3csum_err); goto invalid_pkt; @@ -1185,7 +1185,7 @@ ipf_post_execute_reass_pkts(struct ipf *ipf, } else { struct ip_header *l3_frag = dp_packet_l3(frag_i->pkt); struct ip_header *l3_reass = dp_packet_l3(pkt); - if (!dp_packet_hwol_is_ipv4(frag_i->pkt)) { + if (!dp_packet_ol_is_ipv4(frag_i->pkt)) { ovs_be32 reass_ip = get_16aligned_be32(&l3_reass->ip_src); ovs_be32 frag_ip = diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index e9b539197..3172c766b 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -206,7 +206,7 @@ struct netdev_dpdk_sw_stats { /* Packet drops in ingress policer processing. */ uint64_t rx_qos_drops; /* Packet drops in HWOL processing. */ - uint64_t tx_invalid_hwol_drops; + uint64_t tx_invalid_ol_drops; }; enum dpdk_dev_type { @@ -2141,7 +2141,7 @@ netdev_dpdk_rxq_dealloc(struct netdev_rxq *rxq) /* Prepare the packet for HWOL. * Return True if the packet is OK to continue. */ static bool -netdev_dpdk_prep_hwol_packet(struct netdev_dpdk *dev, struct rte_mbuf *mbuf) +netdev_dpdk_prep_ol_packet(struct netdev_dpdk *dev, struct rte_mbuf *mbuf) { struct dp_packet *pkt = CONTAINER_OF(mbuf, struct dp_packet, mbuf); @@ -2175,7 +2175,7 @@ netdev_dpdk_prep_hwol_packet(struct netdev_dpdk *dev, struct rte_mbuf *mbuf) /* Prepare a batch for HWOL. * Return the number of good packets in the batch. */ static int -netdev_dpdk_prep_hwol_batch(struct netdev_dpdk *dev, struct rte_mbuf **pkts, +netdev_dpdk_prep_ol_batch(struct netdev_dpdk *dev, struct rte_mbuf **pkts, int pkt_cnt) { int i = 0; @@ -2185,7 +2185,7 @@ netdev_dpdk_prep_hwol_batch(struct netdev_dpdk *dev, struct rte_mbuf **pkts, /* Prepare and filter bad HWOL packets. */ for (i = 0; i < pkt_cnt; i++) { pkt = pkts[i]; - if (!netdev_dpdk_prep_hwol_packet(dev, pkt)) { + if (!netdev_dpdk_prep_ol_packet(dev, pkt)) { rte_pktmbuf_free(pkt); continue; } @@ -2539,7 +2539,7 @@ netdev_dpdk_vhost_update_tx_counters(struct netdev_dpdk *dev, int dropped = sw_stats_add->tx_mtu_exceeded_drops + sw_stats_add->tx_qos_drops + sw_stats_add->tx_failure_drops + - sw_stats_add->tx_invalid_hwol_drops; + sw_stats_add->tx_invalid_ol_drops; struct netdev_stats *stats = &dev->stats; int sent = attempted - dropped; int i; @@ -2558,7 +2558,7 @@ netdev_dpdk_vhost_update_tx_counters(struct netdev_dpdk *dev, sw_stats->tx_failure_drops += sw_stats_add->tx_failure_drops; sw_stats->tx_mtu_exceeded_drops += sw_stats_add->tx_mtu_exceeded_drops; sw_stats->tx_qos_drops += sw_stats_add->tx_qos_drops; - sw_stats->tx_invalid_hwol_drops += sw_stats_add->tx_invalid_hwol_drops; + sw_stats->tx_invalid_ol_drops += sw_stats_add->tx_invalid_ol_drops; } } @@ -2719,8 +2719,8 @@ netdev_dpdk_common_send(struct netdev *netdev, struct dp_packet_batch *batch, /* Prepare each mbuf for hardware offloading. */ if (userspace_tso_enabled()) { - cnt = netdev_dpdk_prep_hwol_batch(dev, pkts, pkt_cnt); - stats->tx_invalid_hwol_drops += pkt_cnt - cnt; + cnt = netdev_dpdk_prep_ol_batch(dev, pkts, pkt_cnt); + stats->tx_invalid_ol_drops += pkt_cnt - cnt; pkt_cnt = cnt; } @@ -2842,7 +2842,7 @@ netdev_dpdk_eth_send(struct netdev *netdev, int qid, sw_stats->tx_failure_drops += stats.tx_failure_drops; sw_stats->tx_mtu_exceeded_drops += stats.tx_mtu_exceeded_drops; sw_stats->tx_qos_drops += stats.tx_qos_drops; - sw_stats->tx_invalid_hwol_drops += stats.tx_invalid_hwol_drops; + sw_stats->tx_invalid_ol_drops += stats.tx_invalid_ol_drops; rte_spinlock_unlock(&dev->stats_lock); } @@ -3173,7 +3173,7 @@ netdev_dpdk_get_sw_custom_stats(const struct netdev *netdev, SW_CSTAT(tx_mtu_exceeded_drops) \ SW_CSTAT(tx_qos_drops) \ SW_CSTAT(rx_qos_drops) \ - SW_CSTAT(tx_invalid_hwol_drops) + SW_CSTAT(tx_invalid_ol_drops) #define SW_CSTAT(NAME) + 1 custom_stats->size = SW_CSTATS; diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c index 129043812..8570195cd 100644 --- a/lib/netdev-linux.c +++ b/lib/netdev-linux.c @@ -6618,7 +6618,7 @@ netdev_linux_parse_l2(struct dp_packet *b, uint16_t *l4proto) } *l4proto = ip_hdr->ip_proto; - dp_packet_hwol_set_tx_ipv4(b); + dp_packet_ol_set_tx_ipv4(b); } else if (eth_type == htons(ETH_TYPE_IPV6)) { struct ovs_16aligned_ip6_hdr *nh6; @@ -6628,7 +6628,7 @@ netdev_linux_parse_l2(struct dp_packet *b, uint16_t *l4proto) } *l4proto = nh6->ip6_ctlun.ip6_un1.ip6_un1_nxt; - dp_packet_hwol_set_tx_ipv6(b); + dp_packet_ol_set_tx_ipv6(b); } return 0; @@ -6654,11 +6654,11 @@ netdev_linux_parse_vnet_hdr(struct dp_packet *b) if (vnet->flags == VIRTIO_NET_HDR_F_NEEDS_CSUM) { if (l4proto == IPPROTO_TCP) { - dp_packet_hwol_set_csum_tcp(b); + dp_packet_ol_set_csum_tcp(b); } else if (l4proto == IPPROTO_UDP) { - dp_packet_hwol_set_csum_udp(b); + dp_packet_ol_set_csum_udp(b); } else if (l4proto == IPPROTO_SCTP) { - dp_packet_hwol_set_csum_sctp(b); + dp_packet_ol_set_csum_sctp(b); } } @@ -6670,7 +6670,7 @@ netdev_linux_parse_vnet_hdr(struct dp_packet *b) if (type == VIRTIO_NET_HDR_GSO_TCPV4 || type == VIRTIO_NET_HDR_GSO_TCPV6) { - dp_packet_hwol_set_tcp_seg(b); + dp_packet_ol_set_tcp_seg(b); } } @@ -6682,13 +6682,13 @@ netdev_linux_prepend_vnet_hdr(struct dp_packet *b, int mtu) { struct virtio_net_hdr *vnet = dp_packet_push_zeros(b, sizeof *vnet); - if (dp_packet_hwol_is_tso(b)) { + if (dp_packet_ol_is_tso(b)) { uint16_t hdr_len = ((char *)dp_packet_l4(b) - (char *)dp_packet_eth(b)) + TCP_HEADER_LEN; vnet->hdr_len = (OVS_FORCE __virtio16)hdr_len; vnet->gso_size = (OVS_FORCE __virtio16)(mtu - hdr_len); - if (dp_packet_hwol_is_ipv4(b)) { + if (dp_packet_ol_is_ipv4(b)) { vnet->gso_type = VIRTIO_NET_HDR_GSO_TCPV4; } else { vnet->gso_type = VIRTIO_NET_HDR_GSO_TCPV6; @@ -6698,18 +6698,18 @@ netdev_linux_prepend_vnet_hdr(struct dp_packet *b, int mtu) vnet->flags = VIRTIO_NET_HDR_GSO_NONE; } - if (dp_packet_hwol_l4_mask(b)) { + if (dp_packet_ol_l4_mask(b)) { vnet->flags = VIRTIO_NET_HDR_F_NEEDS_CSUM; vnet->csum_start = (OVS_FORCE __virtio16)((char *)dp_packet_l4(b) - (char *)dp_packet_eth(b)); - if (dp_packet_hwol_l4_is_tcp(b)) { + if (dp_packet_ol_l4_is_tcp(b)) { vnet->csum_offset = (OVS_FORCE __virtio16) __builtin_offsetof( struct tcp_header, tcp_csum); - } else if (dp_packet_hwol_l4_is_udp(b)) { + } else if (dp_packet_ol_l4_is_udp(b)) { vnet->csum_offset = (OVS_FORCE __virtio16) __builtin_offsetof( struct udp_header, udp_csum); - } else if (dp_packet_hwol_l4_is_sctp(b)) { + } else if (dp_packet_ol_l4_is_sctp(b)) { vnet->csum_offset = (OVS_FORCE __virtio16) __builtin_offsetof( struct sctp_header, sctp_csum); } else { diff --git a/lib/netdev.c b/lib/netdev.c index a06138aca..d087929e5 100644 --- a/lib/netdev.c +++ b/lib/netdev.c @@ -794,28 +794,28 @@ netdev_send_prepare_packet(const uint64_t netdev_flags, { uint64_t l4_mask; - if (dp_packet_hwol_is_tso(packet) + if (dp_packet_ol_is_tso(packet) && !(netdev_flags & NETDEV_OFFLOAD_TX_TCP_TSO)) { /* Fall back to GSO in software. */ VLOG_ERR_BUF(errormsg, "No TSO support"); return false; } - l4_mask = dp_packet_hwol_l4_mask(packet); + l4_mask = dp_packet_ol_l4_mask(packet); if (l4_mask) { - if (dp_packet_hwol_l4_is_tcp(packet)) { + if (dp_packet_ol_l4_is_tcp(packet)) { if (!(netdev_flags & NETDEV_OFFLOAD_TX_TCP_CSUM)) { /* Fall back to TCP csum in software. */ VLOG_ERR_BUF(errormsg, "No TCP checksum support"); return false; } - } else if (dp_packet_hwol_l4_is_udp(packet)) { + } else if (dp_packet_ol_l4_is_udp(packet)) { if (!(netdev_flags & NETDEV_OFFLOAD_TX_UDP_CSUM)) { /* Fall back to UDP csum in software. */ VLOG_ERR_BUF(errormsg, "No UDP checksum support"); return false; } - } else if (dp_packet_hwol_l4_is_sctp(packet)) { + } else if (dp_packet_ol_l4_is_sctp(packet)) { if (!(netdev_flags & NETDEV_OFFLOAD_TX_SCTP_CSUM)) { /* Fall back to SCTP csum in software. */ VLOG_ERR_BUF(errormsg, "No SCTP checksum support"); @@ -960,8 +960,8 @@ netdev_push_header(const struct netdev *netdev, size_t i, size = dp_packet_batch_size(batch); DP_PACKET_BATCH_REFILL_FOR_EACH (i, size, packet, batch) { - if (OVS_UNLIKELY(dp_packet_hwol_is_tso(packet) - || dp_packet_hwol_l4_mask(packet))) { + if (OVS_UNLIKELY(dp_packet_ol_is_tso(packet) + || dp_packet_ol_l4_mask(packet))) { COVERAGE_INC(netdev_push_header_drops); dp_packet_delete(packet); VLOG_WARN_RL(&rl, "%s: Tunneling packets with HW offload flags is " From patchwork Tue Jun 14 22:13:11 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mike Pattrick X-Patchwork-Id: 1643444 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=ZeqCnNrW; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=140.211.166.133; helo=smtp2.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Received: from smtp2.osuosl.org (smtp2.osuosl.org [140.211.166.133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4LN2lg4DTCz9vGJ for ; Wed, 15 Jun 2022 08:14:07 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by smtp2.osuosl.org (Postfix) with ESMTP id B6F0940C44; Tue, 14 Jun 2022 22:14:05 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp2.osuosl.org ([127.0.0.1]) by localhost (smtp2.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id N34ZCS5tFV-X; Tue, 14 Jun 2022 22:13:55 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [IPv6:2605:bc80:3010:104::8cd3:938]) by smtp2.osuosl.org (Postfix) with ESMTPS id 4C5C440BB3; Tue, 14 Jun 2022 22:13:54 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id E1232C0088; Tue, 14 Jun 2022 22:13:51 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp3.osuosl.org (smtp3.osuosl.org [140.211.166.136]) by lists.linuxfoundation.org (Postfix) with ESMTP id 702ECC0086 for ; Tue, 14 Jun 2022 22:13:45 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp3.osuosl.org (Postfix) with ESMTP id 5155F60B35 for ; Tue, 14 Jun 2022 22:13:45 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Authentication-Results: smtp3.osuosl.org (amavisd-new); dkim=fail (1024-bit key) reason="fail (body has been altered)" header.d=redhat.com Received: from smtp3.osuosl.org ([127.0.0.1]) by localhost (smtp3.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 41RWLl1HHnHI for ; Tue, 14 Jun 2022 22:13:42 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.8.0 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by smtp3.osuosl.org (Postfix) with ESMTPS id 91EB960ABE for ; Tue, 14 Jun 2022 22:13:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1655244821; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=RV/vVfwQ+BxAhruoTWopgDsfBSe+lVouzufEZfMe/BU=; b=ZeqCnNrWyGhcmd7OsFp8Y8MOV853Um9wvzyIS05cnTPmGyndgXC1AhdEKNH3NUQ8NwDL9M +tOFhhZ4KxNJFjxV0aXhtEx5N4AkNvEU4N32ksmJjM51p1VA5sJbqzq3QXsoXI0AnkpYLz m95GyugjA5glfbjUhxffZCwbdBN38Gg= Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-612-N_D4ZeFdO96KIaeDUqQMXw-1; Tue, 14 Jun 2022 18:13:38 -0400 X-MC-Unique: N_D4ZeFdO96KIaeDUqQMXw-1 Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.rdu2.redhat.com [10.11.54.10]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id BC24C3804510; Tue, 14 Jun 2022 22:13:37 +0000 (UTC) Received: from mpattric.remote.csb (unknown [10.22.18.26]) by smtp.corp.redhat.com (Postfix) with ESMTP id 110A8492C3B; Tue, 14 Jun 2022 22:13:37 +0000 (UTC) From: Mike Pattrick To: dev@openvswitch.org Date: Tue, 14 Jun 2022 18:13:11 -0400 Message-Id: <20220614221317.1028795-4-mkp@redhat.com> In-Reply-To: <20220614221317.1028795-3-mkp@redhat.com> References: <20220614221317.1028795-1-mkp@redhat.com> <20220614221317.1028795-2-mkp@redhat.com> <20220614221317.1028795-3-mkp@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.85 on 10.11.54.10 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=mkp@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Cc: Flavio Leitner , maxime.coquelin@redhat.com, david.marchand@redhat.com Subject: [ovs-dev] [PATCH 04/10] dp-packet: Use p for packet and b for batch. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Flavio Leitner Currently 'p' and 'b' and used for packets, so use a convention that struct dp_packet is 'p' and struct dp_packet_batch is 'b'. Some comments needed new formatting to not pass the 80 column. Some variables were using 'p' or 'b' were renamed as well. There should be no functional change with this patch. Signed-off-by: Flavio Leitner Co-authored-by: Mike Pattrick Signed-off-by: Mike Pattrick Acked-by: Maxime Coquelin --- v2: Corrected missing conversion in packet.c --- lib/dp-packet.c | 345 +++++++++++++++---------------- lib/dp-packet.h | 504 ++++++++++++++++++++++----------------------- lib/netdev-dummy.c | 8 +- lib/netdev-linux.c | 56 ++--- lib/packets.c | 116 +++++------ 5 files changed, 515 insertions(+), 514 deletions(-) diff --git a/lib/dp-packet.c b/lib/dp-packet.c index 35c72542a..d390abbc3 100644 --- a/lib/dp-packet.c +++ b/lib/dp-packet.c @@ -25,58 +25,59 @@ #include "util.h" static void -dp_packet_init__(struct dp_packet *b, size_t allocated, enum dp_packet_source source) -{ - dp_packet_set_allocated(b, allocated); - b->source = source; - dp_packet_reset_offsets(b); - pkt_metadata_init(&b->md, 0); - dp_packet_reset_cutlen(b); - dp_packet_reset_offload(b); +dp_packet_init__(struct dp_packet *p, size_t allocated, + enum dp_packet_source source) +{ + dp_packet_set_allocated(p, allocated); + p->source = source; + dp_packet_reset_offsets(p); + pkt_metadata_init(&p->md, 0); + dp_packet_reset_cutlen(p); + dp_packet_reset_offload(p); /* Initialize implementation-specific fields of dp_packet. */ - dp_packet_init_specific(b); + dp_packet_init_specific(p); /* By default assume the packet type to be Ethernet. */ - b->packet_type = htonl(PT_ETH); + p->packet_type = htonl(PT_ETH); } static void -dp_packet_use__(struct dp_packet *b, void *base, size_t allocated, +dp_packet_use__(struct dp_packet *p, void *base, size_t allocated, enum dp_packet_source source) { - dp_packet_set_base(b, base); - dp_packet_set_data(b, base); - dp_packet_set_size(b, 0); + dp_packet_set_base(p, base); + dp_packet_set_data(p, base); + dp_packet_set_size(p, 0); - dp_packet_init__(b, allocated, source); + dp_packet_init__(p, allocated, source); } -/* Initializes 'b' as an empty dp_packet that contains the 'allocated' bytes of +/* Initializes 'p' as an empty dp_packet that contains the 'allocated' bytes of * memory starting at 'base'. 'base' should be the first byte of a region - * obtained from malloc(). It will be freed (with free()) if 'b' is resized or + * obtained from malloc(). It will be freed (with free()) if 'p' is resized or * freed. */ void -dp_packet_use(struct dp_packet *b, void *base, size_t allocated) +dp_packet_use(struct dp_packet *p, void *base, size_t allocated) { - dp_packet_use__(b, base, allocated, DPBUF_MALLOC); + dp_packet_use__(p, base, allocated, DPBUF_MALLOC); } #if HAVE_AF_XDP -/* Initialize 'b' as an empty dp_packet that contains +/* Initialize 'p' as an empty dp_packet that contains * memory starting at AF_XDP umem base. */ void -dp_packet_use_afxdp(struct dp_packet *b, void *data, size_t allocated, +dp_packet_use_afxdp(struct dp_packet *p, void *data, size_t allocated, size_t headroom) { - dp_packet_set_base(b, (char *)data - headroom); - dp_packet_set_data(b, data); - dp_packet_set_size(b, 0); + dp_packet_set_base(p, (char *) data - headroom); + dp_packet_set_data(p, data); + dp_packet_set_size(p, 0); - dp_packet_init__(b, allocated, DPBUF_AFXDP); + dp_packet_init__(p, allocated, DPBUF_AFXDP); } #endif -/* Initializes 'b' as an empty dp_packet that contains the 'allocated' bytes of +/* Initializes 'p' as an empty dp_packet that contains the 'allocated' bytes of * memory starting at 'base'. 'base' should point to a buffer on the stack. * (Nothing actually relies on 'base' being allocated on the stack. It could * be static or malloc()'d memory. But stack space is the most common use @@ -91,56 +92,56 @@ dp_packet_use_afxdp(struct dp_packet *b, void *data, size_t allocated, * on an dp_packet initialized by this function, so that if it expanded into the * heap, that memory is freed. */ void -dp_packet_use_stub(struct dp_packet *b, void *base, size_t allocated) +dp_packet_use_stub(struct dp_packet *p, void *base, size_t allocated) { - dp_packet_use__(b, base, allocated, DPBUF_STUB); + dp_packet_use__(p, base, allocated, DPBUF_STUB); } -/* Initializes 'b' as an dp_packet whose data starts at 'data' and continues for - * 'size' bytes. This is appropriate for an dp_packet that will be used to - * inspect existing data, without moving it around or reallocating it, and +/* Initializes 'p' as an dp_packet whose data starts at 'data' and continues + * for 'size' bytes. This is appropriate for an dp_packet that will be used + * to inspect existing data, without moving it around or reallocating it, and * generally without modifying it at all. * * An dp_packet operation that requires reallocating data will assert-fail if this * function was used to initialize it. */ void -dp_packet_use_const(struct dp_packet *b, const void *data, size_t size) +dp_packet_use_const(struct dp_packet *p, const void *data, size_t size) { - dp_packet_use__(b, CONST_CAST(void *, data), size, DPBUF_STACK); - dp_packet_set_size(b, size); + dp_packet_use__(p, CONST_CAST(void *, data), size, DPBUF_STACK); + dp_packet_set_size(p, size); } -/* Initializes 'b' as a DPDK dp-packet, which must have been allocated from a +/* Initializes 'p' as a DPDK dp-packet, which must have been allocated from a * DPDK memory pool. */ void -dp_packet_init_dpdk(struct dp_packet *b) +dp_packet_init_dpdk(struct dp_packet *p) { - b->source = DPBUF_DPDK; + p->source = DPBUF_DPDK; } -/* Initializes 'b' as an empty dp_packet with an initial capacity of 'size' +/* Initializes 'p' as an empty dp_packet with an initial capacity of 'size' * bytes. */ void -dp_packet_init(struct dp_packet *b, size_t size) +dp_packet_init(struct dp_packet *p, size_t size) { - dp_packet_use(b, size ? xmalloc(size) : NULL, size); + dp_packet_use(p, size ? xmalloc(size) : NULL, size); } -/* Frees memory that 'b' points to. */ +/* Frees memory that 'p' points to. */ void -dp_packet_uninit(struct dp_packet *b) +dp_packet_uninit(struct dp_packet *p) { - if (b) { - if (b->source == DPBUF_MALLOC) { - free(dp_packet_base(b)); - } else if (b->source == DPBUF_DPDK) { + if (p) { + if (p->source == DPBUF_MALLOC) { + free(dp_packet_base(p)); + } else if (p->source == DPBUF_DPDK) { #ifdef DPDK_NETDEV /* If this dp_packet was allocated by DPDK it must have been * created as a dp_packet */ - free_dpdk_buf((struct dp_packet*) b); + free_dpdk_buf((struct dp_packet *) p); #endif - } else if (b->source == DPBUF_AFXDP) { - free_afxdp_buf(b); + } else if (p->source == DPBUF_AFXDP) { + free_afxdp_buf(p); } } } @@ -150,9 +151,9 @@ dp_packet_uninit(struct dp_packet *b) struct dp_packet * dp_packet_new(size_t size) { - struct dp_packet *b = xmalloc(sizeof *b); - dp_packet_init(b, size); - return b; + struct dp_packet *p = xmalloc(sizeof *p); + dp_packet_init(p, size); + return p; } /* Creates and returns a new dp_packet with an initial capacity of 'size + @@ -160,45 +161,45 @@ dp_packet_new(size_t size) struct dp_packet * dp_packet_new_with_headroom(size_t size, size_t headroom) { - struct dp_packet *b = dp_packet_new(size + headroom); - dp_packet_reserve(b, headroom); - return b; + struct dp_packet *p = dp_packet_new(size + headroom); + dp_packet_reserve(p, headroom); + return p; } /* Creates and returns a new dp_packet that initially contains a copy of the - * 'dp_packet_size(buffer)' bytes of data starting at 'buffer->data' with no headroom or + * 'dp_packet_size(p)' bytes of data starting at 'p->data' with no headroom or * tailroom. */ struct dp_packet * -dp_packet_clone(const struct dp_packet *buffer) +dp_packet_clone(const struct dp_packet *p) { - return dp_packet_clone_with_headroom(buffer, 0); + return dp_packet_clone_with_headroom(p, 0); } -/* Creates and returns a new dp_packet whose data are copied from 'buffer'. +/* Creates and returns a new dp_packet whose data are copied from 'p'. * The returned dp_packet will additionally have 'headroom' bytes of * headroom. */ struct dp_packet * -dp_packet_clone_with_headroom(const struct dp_packet *buffer, size_t headroom) +dp_packet_clone_with_headroom(const struct dp_packet *p, size_t headroom) { struct dp_packet *new_buffer; uint32_t mark; - new_buffer = dp_packet_clone_data_with_headroom(dp_packet_data(buffer), - dp_packet_size(buffer), - headroom); + new_buffer = dp_packet_clone_data_with_headroom(dp_packet_data(p), + dp_packet_size(p), + headroom); /* Copy the following fields into the returned buffer: l2_pad_size, * l2_5_ofs, l3_ofs, l4_ofs, cutlen, packet_type and md. */ - memcpy(&new_buffer->l2_pad_size, &buffer->l2_pad_size, + memcpy(&new_buffer->l2_pad_size, &p->l2_pad_size, sizeof(struct dp_packet) - offsetof(struct dp_packet, l2_pad_size)); - *dp_packet_ol_flags_ptr(new_buffer) = *dp_packet_ol_flags_ptr(buffer); + *dp_packet_ol_flags_ptr(new_buffer) = *dp_packet_ol_flags_ptr(p); *dp_packet_ol_flags_ptr(new_buffer) &= DP_PACKET_OL_SUPPORTED_MASK; - if (dp_packet_rss_valid(buffer)) { - dp_packet_set_rss_hash(new_buffer, dp_packet_get_rss_hash(buffer)); + if (dp_packet_rss_valid(p)) { + dp_packet_set_rss_hash(new_buffer, dp_packet_get_rss_hash(p)); } - if (dp_packet_has_flow_mark(buffer, &mark)) { + if (dp_packet_has_flow_mark(p, &mark)) { dp_packet_set_flow_mark(new_buffer, mark); } @@ -219,47 +220,47 @@ dp_packet_clone_data(const void *data, size_t size) struct dp_packet * dp_packet_clone_data_with_headroom(const void *data, size_t size, size_t headroom) { - struct dp_packet *b = dp_packet_new_with_headroom(size, headroom); - dp_packet_put(b, data, size); - return b; + struct dp_packet *p = dp_packet_new_with_headroom(size, headroom); + dp_packet_put(p, data, size); + return p; } static void -dp_packet_copy__(struct dp_packet *b, uint8_t *new_base, +dp_packet_copy__(struct dp_packet *p, uint8_t *new_base, size_t new_headroom, size_t new_tailroom) { - const uint8_t *old_base = dp_packet_base(b); - size_t old_headroom = dp_packet_headroom(b); - size_t old_tailroom = dp_packet_tailroom(b); + const uint8_t *old_base = dp_packet_base(p); + size_t old_headroom = dp_packet_headroom(p); + size_t old_tailroom = dp_packet_tailroom(p); size_t copy_headroom = MIN(old_headroom, new_headroom); size_t copy_tailroom = MIN(old_tailroom, new_tailroom); memcpy(&new_base[new_headroom - copy_headroom], &old_base[old_headroom - copy_headroom], - copy_headroom + dp_packet_size(b) + copy_tailroom); + copy_headroom + dp_packet_size(p) + copy_tailroom); } -/* Reallocates 'b' so that it has exactly 'new_headroom' and 'new_tailroom' +/* Reallocates 'p' so that it has exactly 'new_headroom' and 'new_tailroom' * bytes of headroom and tailroom, respectively. */ void -dp_packet_resize(struct dp_packet *b, size_t new_headroom, size_t new_tailroom) +dp_packet_resize(struct dp_packet *p, size_t new_headroom, size_t new_tailroom) { void *new_base, *new_data; size_t new_allocated; - new_allocated = new_headroom + dp_packet_size(b) + new_tailroom; + new_allocated = new_headroom + dp_packet_size(p) + new_tailroom; - switch (b->source) { + switch (p->source) { case DPBUF_DPDK: OVS_NOT_REACHED(); case DPBUF_MALLOC: - if (new_headroom == dp_packet_headroom(b)) { - new_base = xrealloc(dp_packet_base(b), new_allocated); + if (new_headroom == dp_packet_headroom(p)) { + new_base = xrealloc(dp_packet_base(p), new_allocated); } else { new_base = xmalloc(new_allocated); - dp_packet_copy__(b, new_base, new_headroom, new_tailroom); - free(dp_packet_base(b)); + dp_packet_copy__(p, new_base, new_headroom, new_tailroom); + free(dp_packet_base(p)); } break; @@ -270,108 +271,108 @@ dp_packet_resize(struct dp_packet *b, size_t new_headroom, size_t new_tailroom) OVS_NOT_REACHED(); case DPBUF_STUB: - b->source = DPBUF_MALLOC; + p->source = DPBUF_MALLOC; new_base = xmalloc(new_allocated); - dp_packet_copy__(b, new_base, new_headroom, new_tailroom); + dp_packet_copy__(p, new_base, new_headroom, new_tailroom); break; default: OVS_NOT_REACHED(); } - dp_packet_set_allocated(b, new_allocated); - dp_packet_set_base(b, new_base); + dp_packet_set_allocated(p, new_allocated); + dp_packet_set_base(p, new_base); new_data = (char *) new_base + new_headroom; - if (dp_packet_data(b) != new_data) { - dp_packet_set_data(b, new_data); + if (dp_packet_data(p) != new_data) { + dp_packet_set_data(p, new_data); } } -/* Ensures that 'b' has room for at least 'size' bytes at its tail end, +/* Ensures that 'p' has room for at least 'size' bytes at its tail end, * reallocating and copying its data if necessary. Its headroom, if any, is * preserved. */ void -dp_packet_prealloc_tailroom(struct dp_packet *b, size_t size) +dp_packet_prealloc_tailroom(struct dp_packet *p, size_t size) { - if ((size && !dp_packet_base(b)) || (size > dp_packet_tailroom(b))) { - dp_packet_resize(b, dp_packet_headroom(b), MAX(size, 64)); + if ((size && !dp_packet_base(p)) || (size > dp_packet_tailroom(p))) { + dp_packet_resize(p, dp_packet_headroom(p), MAX(size, 64)); } } -/* Ensures that 'b' has room for at least 'size' bytes at its head, +/* Ensures that 'p' has room for at least 'size' bytes at its head, * reallocating and copying its data if necessary. Its tailroom, if any, is * preserved. */ void -dp_packet_prealloc_headroom(struct dp_packet *b, size_t size) +dp_packet_prealloc_headroom(struct dp_packet *p, size_t size) { - if (size > dp_packet_headroom(b)) { - dp_packet_resize(b, MAX(size, 64), dp_packet_tailroom(b)); + if (size > dp_packet_headroom(p)) { + dp_packet_resize(p, MAX(size, 64), dp_packet_tailroom(p)); } } -/* Shifts all of the data within the allocated space in 'b' by 'delta' bytes. +/* Shifts all of the data within the allocated space in 'p' by 'delta' bytes. * For example, a 'delta' of 1 would cause each byte of data to move one byte * forward (from address 'p' to 'p+1'), and a 'delta' of -1 would cause each * byte to move one byte backward (from 'p' to 'p-1'). */ void -dp_packet_shift(struct dp_packet *b, int delta) +dp_packet_shift(struct dp_packet *p, int delta) { - ovs_assert(delta > 0 ? delta <= dp_packet_tailroom(b) - : delta < 0 ? -delta <= dp_packet_headroom(b) + ovs_assert(delta > 0 ? delta <= dp_packet_tailroom(p) + : delta < 0 ? -delta <= dp_packet_headroom(p) : true); if (delta != 0) { - char *dst = (char *) dp_packet_data(b) + delta; - memmove(dst, dp_packet_data(b), dp_packet_size(b)); - dp_packet_set_data(b, dst); + char *dst = (char *) dp_packet_data(p) + delta; + memmove(dst, dp_packet_data(p), dp_packet_size(p)); + dp_packet_set_data(p, dst); } } -/* Appends 'size' bytes of data to the tail end of 'b', reallocating and +/* Appends 'size' bytes of data to the tail end of 'p', reallocating and * copying its data if necessary. Returns a pointer to the first byte of the * new data, which is left uninitialized. */ void * -dp_packet_put_uninit(struct dp_packet *b, size_t size) +dp_packet_put_uninit(struct dp_packet *p, size_t size) { - void *p; - dp_packet_prealloc_tailroom(b, size); - p = dp_packet_tail(b); - dp_packet_set_size(b, dp_packet_size(b) + size); - return p; + void *tail; + dp_packet_prealloc_tailroom(p, size); + tail = dp_packet_tail(p); + dp_packet_set_size(p, dp_packet_size(p) + size); + return tail; } -/* Appends 'size' zeroed bytes to the tail end of 'b'. Data in 'b' is +/* Appends 'size' zeroed bytes to the tail end of 'p'. Data in 'p' is * reallocated and copied if necessary. Returns a pointer to the first byte of * the data's location in the dp_packet. */ void * -dp_packet_put_zeros(struct dp_packet *b, size_t size) +dp_packet_put_zeros(struct dp_packet *p, size_t size) { - void *dst = dp_packet_put_uninit(b, size); + void *dst = dp_packet_put_uninit(p, size); memset(dst, 0, size); return dst; } -/* Appends the 'size' bytes of data in 'p' to the tail end of 'b'. Data in 'b' +/* Appends the 'size' bytes of data in 'p' to the tail end of 'p'. Data in 'p' * is reallocated and copied if necessary. Returns a pointer to the first * byte of the data's location in the dp_packet. */ void * -dp_packet_put(struct dp_packet *b, const void *p, size_t size) +dp_packet_put(struct dp_packet *p, const void *data, size_t size) { - void *dst = dp_packet_put_uninit(b, size); - memcpy(dst, p, size); + void *dst = dp_packet_put_uninit(p, size); + memcpy(dst, data, size); return dst; } /* Parses as many pairs of hex digits as possible (possibly separated by - * spaces) from the beginning of 's', appending bytes for their values to 'b'. + * spaces) from the beginning of 's', appending bytes for their values to 'p'. * Returns the first character of 's' that is not the first of a pair of hex - * digits. If 'n' is nonnull, stores the number of bytes added to 'b' in + * digits. If 'n' is nonnull, stores the number of bytes added to 'p' in * '*n'. */ char * -dp_packet_put_hex(struct dp_packet *b, const char *s, size_t *n) +dp_packet_put_hex(struct dp_packet *p, const char *s, size_t *n) { - size_t initial_size = dp_packet_size(b); + size_t initial_size = dp_packet_size(p); for (;;) { uint8_t byte; bool ok; @@ -380,12 +381,12 @@ dp_packet_put_hex(struct dp_packet *b, const char *s, size_t *n) byte = hexits_value(s, 2, &ok); if (!ok) { if (n) { - *n = dp_packet_size(b) - initial_size; + *n = dp_packet_size(p) - initial_size; } return CONST_CAST(char *, s); } - dp_packet_put(b, &byte, 1); + dp_packet_put(p, &byte, 1); s += 2; } } @@ -393,80 +394,80 @@ dp_packet_put_hex(struct dp_packet *b, const char *s, size_t *n) /* Reserves 'size' bytes of headroom so that they can be later allocated with * dp_packet_push_uninit() without reallocating the dp_packet. */ void -dp_packet_reserve(struct dp_packet *b, size_t size) +dp_packet_reserve(struct dp_packet *p, size_t size) { - ovs_assert(!dp_packet_size(b)); - dp_packet_prealloc_tailroom(b, size); - dp_packet_set_data(b, (char*)dp_packet_data(b) + size); + ovs_assert(!dp_packet_size(p)); + dp_packet_prealloc_tailroom(p, size); + dp_packet_set_data(p, (char *) dp_packet_data(p) + size); } /* Reserves 'headroom' bytes at the head and 'tailroom' at the end so that * they can be later allocated with dp_packet_push_uninit() or * dp_packet_put_uninit() without reallocating the dp_packet. */ void -dp_packet_reserve_with_tailroom(struct dp_packet *b, size_t headroom, +dp_packet_reserve_with_tailroom(struct dp_packet *p, size_t headroom, size_t tailroom) { - ovs_assert(!dp_packet_size(b)); - dp_packet_prealloc_tailroom(b, headroom + tailroom); - dp_packet_set_data(b, (char*)dp_packet_data(b) + headroom); + ovs_assert(!dp_packet_size(p)); + dp_packet_prealloc_tailroom(p, headroom + tailroom); + dp_packet_set_data(p, (char *) dp_packet_data(p) + headroom); } -/* Prefixes 'size' bytes to the head end of 'b', reallocating and copying its +/* Prefixes 'size' bytes to the head end of 'p', reallocating and copying its * data if necessary. Returns a pointer to the first byte of the data's * location in the dp_packet. The new data is left uninitialized. */ void * -dp_packet_push_uninit(struct dp_packet *b, size_t size) +dp_packet_push_uninit(struct dp_packet *p, size_t size) { - dp_packet_prealloc_headroom(b, size); - dp_packet_set_data(b, (char*)dp_packet_data(b) - size); - dp_packet_set_size(b, dp_packet_size(b) + size); - return dp_packet_data(b); + dp_packet_prealloc_headroom(p, size); + dp_packet_set_data(p, (char *) dp_packet_data(p) - size); + dp_packet_set_size(p, dp_packet_size(p) + size); + return dp_packet_data(p); } -/* Prefixes 'size' zeroed bytes to the head end of 'b', reallocating and +/* Prefixes 'size' zeroed bytes to the head end of 'p', reallocating and * copying its data if necessary. Returns a pointer to the first byte of the * data's location in the dp_packet. */ void * -dp_packet_push_zeros(struct dp_packet *b, size_t size) +dp_packet_push_zeros(struct dp_packet *p, size_t size) { - void *dst = dp_packet_push_uninit(b, size); + void *dst = dp_packet_push_uninit(p, size); memset(dst, 0, size); return dst; } -/* Copies the 'size' bytes starting at 'p' to the head end of 'b', reallocating - * and copying its data if necessary. Returns a pointer to the first byte of - * the data's location in the dp_packet. */ +/* Copies the 'size' bytes starting at 'data' to the head end of 'p', + * reallocating and copying its data if necessary. Returns a pointer to + * the first byte of the data's location in the dp_packet. */ void * -dp_packet_push(struct dp_packet *b, const void *p, size_t size) +dp_packet_push(struct dp_packet *p, const void *data, size_t size) { - void *dst = dp_packet_push_uninit(b, size); - memcpy(dst, p, size); + void *dst = dp_packet_push_uninit(p, size); + memcpy(dst, data, size); return dst; } -/* Returns the data in 'b' as a block of malloc()'d memory and frees the buffer - * within 'b'. (If 'b' itself was dynamically allocated, e.g. with +/* Returns the data in 'p' as a block of malloc()'d memory and frees the buffer + * within 'p'. (If 'p' itself was dynamically allocated, e.g. with * dp_packet_new(), then it should still be freed with, e.g., dp_packet_delete().) */ void * -dp_packet_steal_data(struct dp_packet *b) +dp_packet_steal_data(struct dp_packet *p) { - void *p; - ovs_assert(b->source != DPBUF_DPDK); - ovs_assert(b->source != DPBUF_AFXDP); + void *data; + ovs_assert(p->source != DPBUF_DPDK); + ovs_assert(p->source != DPBUF_AFXDP); - if (b->source == DPBUF_MALLOC && dp_packet_data(b) == dp_packet_base(b)) { - p = dp_packet_data(b); + if (p->source == DPBUF_MALLOC && dp_packet_data(p) == dp_packet_base(p)) { + data = dp_packet_data(p); } else { - p = xmemdup(dp_packet_data(b), dp_packet_size(b)); - if (b->source == DPBUF_MALLOC) { - free(dp_packet_base(b)); + data = xmemdup(dp_packet_data(p), dp_packet_size(p)); + if (p->source == DPBUF_MALLOC) { + free(dp_packet_base(p)); } } - dp_packet_set_base(b, NULL); - dp_packet_set_data(b, NULL); - return p; + dp_packet_set_base(p, NULL); + dp_packet_set_data(p, NULL); + return data; } static inline void @@ -481,28 +482,28 @@ dp_packet_adjust_layer_offset(uint16_t *offset, int increment) * pointer and the layer offsets. The caller is responsible for * modifying the contents. */ void * -dp_packet_resize_l2_5(struct dp_packet *b, int increment) +dp_packet_resize_l2_5(struct dp_packet *p, int increment) { if (increment >= 0) { - dp_packet_push_uninit(b, increment); + dp_packet_push_uninit(p, increment); } else { - dp_packet_pull(b, -increment); + dp_packet_pull(p, -increment); } /* Adjust layer offsets after l2_5. */ - dp_packet_adjust_layer_offset(&b->l3_ofs, increment); - dp_packet_adjust_layer_offset(&b->l4_ofs, increment); + dp_packet_adjust_layer_offset(&p->l3_ofs, increment); + dp_packet_adjust_layer_offset(&p->l4_ofs, increment); - return dp_packet_data(b); + return dp_packet_data(p); } /* Adjust the size of the l2 portion of the dp_packet, updating the l2 * pointer and the layer offsets. The caller is responsible for * modifying the contents. */ void * -dp_packet_resize_l2(struct dp_packet *b, int increment) +dp_packet_resize_l2(struct dp_packet *p, int increment) { - dp_packet_resize_l2_5(b, increment); - dp_packet_adjust_layer_offset(&b->l2_5_ofs, increment); - return dp_packet_data(b); + dp_packet_resize_l2_5(p, increment); + dp_packet_adjust_layer_offset(&p->l2_5_ofs, increment); + return dp_packet_data(p); } diff --git a/lib/dp-packet.h b/lib/dp-packet.h index 968ec7534..1b17ef263 100644 --- a/lib/dp-packet.h +++ b/lib/dp-packet.h @@ -198,7 +198,7 @@ struct dp_packet *dp_packet_clone_with_headroom(const struct dp_packet *, struct dp_packet *dp_packet_clone_data(const void *, size_t); struct dp_packet *dp_packet_clone_data_with_headroom(const void *, size_t, size_t headroom); -void dp_packet_resize(struct dp_packet *b, size_t new_headroom, +void dp_packet_resize(struct dp_packet *p, size_t new_headroom, size_t new_tailroom); static inline void dp_packet_delete(struct dp_packet *); static inline void dp_packet_swap(struct dp_packet *, struct dp_packet *); @@ -237,25 +237,25 @@ static inline bool dp_packet_equal(const struct dp_packet *, const struct dp_packet *); -/* Frees memory that 'b' points to, as well as 'b' itself. */ +/* Frees memory that 'p' points to, as well as 'p' itself. */ static inline void -dp_packet_delete(struct dp_packet *b) +dp_packet_delete(struct dp_packet *p) { - if (b) { - if (b->source == DPBUF_DPDK) { + if (p) { + if (p->source == DPBUF_DPDK) { /* If this dp_packet was allocated by DPDK it must have been * created as a dp_packet */ - free_dpdk_buf((struct dp_packet*) b); + free_dpdk_buf((struct dp_packet *) p); return; } - if (b->source == DPBUF_AFXDP) { - free_afxdp_buf(b); + if (p->source == DPBUF_AFXDP) { + free_afxdp_buf(p); return; } - dp_packet_uninit(b); - free(b); + dp_packet_uninit(p); + free(p); } } @@ -271,86 +271,86 @@ dp_packet_swap(struct dp_packet *a, struct dp_packet *b) *b = c; } -/* If 'b' contains at least 'offset + size' bytes of data, returns a pointer to +/* If 'p' contains at least 'offset + size' bytes of data, returns a pointer to * byte 'offset'. Otherwise, returns a null pointer. */ static inline void * -dp_packet_at(const struct dp_packet *b, size_t offset, size_t size) +dp_packet_at(const struct dp_packet *p, size_t offset, size_t size) { - return offset + size <= dp_packet_size(b) - ? (char *) dp_packet_data(b) + offset + return offset + size <= dp_packet_size(p) + ? (char *) dp_packet_data(p) + offset : NULL; } -/* Returns a pointer to byte 'offset' in 'b', which must contain at least +/* Returns a pointer to byte 'offset' in 'p', which must contain at least * 'offset + size' bytes of data. */ static inline void * -dp_packet_at_assert(const struct dp_packet *b, size_t offset, size_t size) +dp_packet_at_assert(const struct dp_packet *p, size_t offset, size_t size) { - ovs_assert(offset + size <= dp_packet_size(b)); - return ((char *) dp_packet_data(b)) + offset; + ovs_assert(offset + size <= dp_packet_size(p)); + return ((char *) dp_packet_data(p)) + offset; } -/* Returns a pointer to byte following the last byte of data in use in 'b'. */ +/* Returns a pointer to byte following the last byte of data in use in 'p'. */ static inline void * -dp_packet_tail(const struct dp_packet *b) +dp_packet_tail(const struct dp_packet *p) { - return (char *) dp_packet_data(b) + dp_packet_size(b); + return (char *) dp_packet_data(p) + dp_packet_size(p); } /* Returns a pointer to byte following the last byte allocated for use (but - * not necessarily in use) in 'b'. */ + * not necessarily in use) in 'p'. */ static inline void * -dp_packet_end(const struct dp_packet *b) +dp_packet_end(const struct dp_packet *p) { - return (char *) dp_packet_base(b) + dp_packet_get_allocated(b); + return (char *) dp_packet_base(p) + dp_packet_get_allocated(p); } -/* Returns the number of bytes of headroom in 'b', that is, the number of bytes - * of unused space in dp_packet 'b' before the data that is in use. (Most +/* Returns the number of bytes of headroom in 'p', that is, the number of bytes + * of unused space in dp_packet 'p' before the data that is in use. (Most * commonly, the data in a dp_packet is at its beginning, and thus the * dp_packet's headroom is 0.) */ static inline size_t -dp_packet_headroom(const struct dp_packet *b) +dp_packet_headroom(const struct dp_packet *p) { - return (char *) dp_packet_data(b) - (char *) dp_packet_base(b); + return (char *) dp_packet_data(p) - (char *) dp_packet_base(p); } /* Returns the number of bytes that may be appended to the tail end of - * dp_packet 'b' before the dp_packet must be reallocated. */ + * dp_packet 'p' before the dp_packet must be reallocated. */ static inline size_t -dp_packet_tailroom(const struct dp_packet *b) +dp_packet_tailroom(const struct dp_packet *p) { - return (char *) dp_packet_end(b) - (char *) dp_packet_tail(b); + return (char *) dp_packet_end(p) - (char *) dp_packet_tail(p); } -/* Clears any data from 'b'. */ +/* Clears any data from 'p'. */ static inline void -dp_packet_clear(struct dp_packet *b) +dp_packet_clear(struct dp_packet *p) { - dp_packet_set_data(b, dp_packet_base(b)); - dp_packet_set_size(b, 0); + dp_packet_set_data(p, dp_packet_base(p)); + dp_packet_set_size(p, 0); } -/* Removes 'size' bytes from the head end of 'b', which must contain at least +/* Removes 'size' bytes from the head end of 'p', which must contain at least * 'size' bytes of data. Returns the first byte of data removed. */ static inline void * -dp_packet_pull(struct dp_packet *b, size_t size) +dp_packet_pull(struct dp_packet *p, size_t size) { - void *data = dp_packet_data(b); - ovs_assert(dp_packet_size(b) - dp_packet_l2_pad_size(b) >= size); - dp_packet_set_data(b, (char *) dp_packet_data(b) + size); - dp_packet_set_size(b, dp_packet_size(b) - size); + void *data = dp_packet_data(p); + ovs_assert(dp_packet_size(p) - dp_packet_l2_pad_size(p) >= size); + dp_packet_set_data(p, (char *) dp_packet_data(p) + size); + dp_packet_set_size(p, dp_packet_size(p) - size); return data; } -/* If 'b' has at least 'size' bytes of data, removes that many bytes from the - * head end of 'b' and returns the first byte removed. Otherwise, returns a - * null pointer without modifying 'b'. */ +/* If 'p' has at least 'size' bytes of data, removes that many bytes from the + * head end of 'p' and returns the first byte removed. Otherwise, returns a + * null pointer without modifying 'p'. */ static inline void * -dp_packet_try_pull(struct dp_packet *b, size_t size) +dp_packet_try_pull(struct dp_packet *p, size_t size) { - return dp_packet_size(b) - dp_packet_l2_pad_size(b) >= size - ? dp_packet_pull(b, size) : NULL; + return dp_packet_size(p) - dp_packet_l2_pad_size(p) >= size + ? dp_packet_pull(p, size) : NULL; } static inline bool @@ -361,117 +361,117 @@ dp_packet_equal(const struct dp_packet *a, const struct dp_packet *b) } static inline bool -dp_packet_is_eth(const struct dp_packet *b) +dp_packet_is_eth(const struct dp_packet *p) { - return b->packet_type == htonl(PT_ETH); + return p->packet_type == htonl(PT_ETH); } /* Get the start of the Ethernet frame. 'l3_ofs' marks the end of the l2 * headers, so return NULL if it is not set. */ static inline void * -dp_packet_eth(const struct dp_packet *b) +dp_packet_eth(const struct dp_packet *p) { - return (dp_packet_is_eth(b) && b->l3_ofs != UINT16_MAX) - ? dp_packet_data(b) : NULL; + return (dp_packet_is_eth(p) && p->l3_ofs != UINT16_MAX) + ? dp_packet_data(p) : NULL; } /* Resets all layer offsets. 'l3' offset must be set before 'l2' can be * retrieved. */ static inline void -dp_packet_reset_offsets(struct dp_packet *b) +dp_packet_reset_offsets(struct dp_packet *p) { - b->l2_pad_size = 0; - b->l2_5_ofs = UINT16_MAX; - b->l3_ofs = UINT16_MAX; - b->l4_ofs = UINT16_MAX; + p->l2_pad_size = 0; + p->l2_5_ofs = UINT16_MAX; + p->l3_ofs = UINT16_MAX; + p->l4_ofs = UINT16_MAX; } static inline uint16_t -dp_packet_l2_pad_size(const struct dp_packet *b) +dp_packet_l2_pad_size(const struct dp_packet *p) { - return b->l2_pad_size; + return p->l2_pad_size; } static inline void -dp_packet_set_l2_pad_size(struct dp_packet *b, uint16_t pad_size) +dp_packet_set_l2_pad_size(struct dp_packet *p, uint16_t pad_size) { - ovs_assert(pad_size <= dp_packet_size(b)); - b->l2_pad_size = pad_size; + ovs_assert(pad_size <= dp_packet_size(p)); + p->l2_pad_size = pad_size; } static inline void * -dp_packet_l2_5(const struct dp_packet *b) +dp_packet_l2_5(const struct dp_packet *p) { - return b->l2_5_ofs != UINT16_MAX - ? (char *) dp_packet_data(b) + b->l2_5_ofs + return p->l2_5_ofs != UINT16_MAX + ? (char *) dp_packet_data(p) + p->l2_5_ofs : NULL; } static inline void -dp_packet_set_l2_5(struct dp_packet *b, void *l2_5) +dp_packet_set_l2_5(struct dp_packet *p, void *l2_5) { - b->l2_5_ofs = l2_5 - ? (char *) l2_5 - (char *) dp_packet_data(b) + p->l2_5_ofs = l2_5 + ? (char *) l2_5 - (char *) dp_packet_data(p) : UINT16_MAX; } static inline void * -dp_packet_l3(const struct dp_packet *b) +dp_packet_l3(const struct dp_packet *p) { - return b->l3_ofs != UINT16_MAX - ? (char *) dp_packet_data(b) + b->l3_ofs + return p->l3_ofs != UINT16_MAX + ? (char *) dp_packet_data(p) + p->l3_ofs : NULL; } static inline void -dp_packet_set_l3(struct dp_packet *b, void *l3) +dp_packet_set_l3(struct dp_packet *p, void *l3) { - b->l3_ofs = l3 ? (char *) l3 - (char *) dp_packet_data(b) : UINT16_MAX; + p->l3_ofs = l3 ? (char *) l3 - (char *) dp_packet_data(p) : UINT16_MAX; } static inline void * -dp_packet_l4(const struct dp_packet *b) +dp_packet_l4(const struct dp_packet *p) { - return b->l4_ofs != UINT16_MAX - ? (char *) dp_packet_data(b) + b->l4_ofs + return p->l4_ofs != UINT16_MAX + ? (char *) dp_packet_data(p) + p->l4_ofs : NULL; } static inline void -dp_packet_set_l4(struct dp_packet *b, void *l4) +dp_packet_set_l4(struct dp_packet *p, void *l4) { - b->l4_ofs = l4 ? (char *) l4 - (char *) dp_packet_data(b) : UINT16_MAX; + p->l4_ofs = l4 ? (char *) l4 - (char *) dp_packet_data(p) : UINT16_MAX; } /* Returns the size of the packet from the beginning of the L3 header to the * end of the L3 payload. Hence L2 padding is not included. */ static inline size_t -dp_packet_l3_size(const struct dp_packet *b) +dp_packet_l3_size(const struct dp_packet *p) { - return OVS_LIKELY(b->l3_ofs != UINT16_MAX) - ? (const char *)dp_packet_tail(b) - (const char *)dp_packet_l3(b) - - dp_packet_l2_pad_size(b) + return OVS_LIKELY(p->l3_ofs != UINT16_MAX) + ? (const char *) dp_packet_tail(p) - (const char *) dp_packet_l3(p) + - dp_packet_l2_pad_size(p) : 0; } /* Returns the size of the packet from the beginning of the L4 header to the * end of the L4 payload. Hence L2 padding is not included. */ static inline size_t -dp_packet_l4_size(const struct dp_packet *b) +dp_packet_l4_size(const struct dp_packet *p) { - return OVS_LIKELY(b->l4_ofs != UINT16_MAX) - ? (const char *)dp_packet_tail(b) - (const char *)dp_packet_l4(b) - - dp_packet_l2_pad_size(b) + return OVS_LIKELY(p->l4_ofs != UINT16_MAX) + ? (const char *) dp_packet_tail(p) - (const char *) dp_packet_l4(p) + - dp_packet_l2_pad_size(p) : 0; } static inline const void * -dp_packet_get_tcp_payload(const struct dp_packet *b) +dp_packet_get_tcp_payload(const struct dp_packet *p) { - size_t l4_size = dp_packet_l4_size(b); + size_t l4_size = dp_packet_l4_size(p); if (OVS_LIKELY(l4_size >= TCP_HEADER_LEN)) { - struct tcp_header *tcp = dp_packet_l4(b); + struct tcp_header *tcp = dp_packet_l4(p); int tcp_len = TCP_OFFSET(tcp->tcp_ctl) * 4; if (OVS_LIKELY(tcp_len >= TCP_HEADER_LEN && tcp_len <= l4_size)) { @@ -482,11 +482,11 @@ dp_packet_get_tcp_payload(const struct dp_packet *b) } static inline uint32_t -dp_packet_get_tcp_payload_length(const struct dp_packet *pkt) +dp_packet_get_tcp_payload_length(const struct dp_packet *p) { - const char *tcp_payload = dp_packet_get_tcp_payload(pkt); + const char *tcp_payload = dp_packet_get_tcp_payload(p); if (tcp_payload) { - return ((char *) dp_packet_tail(pkt) - dp_packet_l2_pad_size(pkt) + return ((char *) dp_packet_tail(p) - dp_packet_l2_pad_size(p) - tcp_payload); } else { return 0; @@ -494,69 +494,69 @@ dp_packet_get_tcp_payload_length(const struct dp_packet *pkt) } static inline const void * -dp_packet_get_udp_payload(const struct dp_packet *b) +dp_packet_get_udp_payload(const struct dp_packet *p) { - return OVS_LIKELY(dp_packet_l4_size(b) >= UDP_HEADER_LEN) - ? (const char *)dp_packet_l4(b) + UDP_HEADER_LEN : NULL; + return OVS_LIKELY(dp_packet_l4_size(p) >= UDP_HEADER_LEN) + ? (const char *) dp_packet_l4(p) + UDP_HEADER_LEN : NULL; } static inline const void * -dp_packet_get_sctp_payload(const struct dp_packet *b) +dp_packet_get_sctp_payload(const struct dp_packet *p) { - return OVS_LIKELY(dp_packet_l4_size(b) >= SCTP_HEADER_LEN) - ? (const char *)dp_packet_l4(b) + SCTP_HEADER_LEN : NULL; + return OVS_LIKELY(dp_packet_l4_size(p) >= SCTP_HEADER_LEN) + ? (const char *) dp_packet_l4(p) + SCTP_HEADER_LEN : NULL; } static inline const void * -dp_packet_get_icmp_payload(const struct dp_packet *b) +dp_packet_get_icmp_payload(const struct dp_packet *p) { - return OVS_LIKELY(dp_packet_l4_size(b) >= ICMP_HEADER_LEN) - ? (const char *)dp_packet_l4(b) + ICMP_HEADER_LEN : NULL; + return OVS_LIKELY(dp_packet_l4_size(p) >= ICMP_HEADER_LEN) + ? (const char *) dp_packet_l4(p) + ICMP_HEADER_LEN : NULL; } static inline const void * -dp_packet_get_nd_payload(const struct dp_packet *b) +dp_packet_get_nd_payload(const struct dp_packet *p) { - return OVS_LIKELY(dp_packet_l4_size(b) >= ND_MSG_LEN) - ? (const char *)dp_packet_l4(b) + ND_MSG_LEN : NULL; + return OVS_LIKELY(dp_packet_l4_size(p) >= ND_MSG_LEN) + ? (const char *) dp_packet_l4(p) + ND_MSG_LEN : NULL; } #ifdef DPDK_NETDEV static inline uint64_t * -dp_packet_ol_flags_ptr(const struct dp_packet *b) +dp_packet_ol_flags_ptr(const struct dp_packet *p) { - return CONST_CAST(uint64_t *, &b->mbuf.ol_flags); + return CONST_CAST(uint64_t *, &p->mbuf.ol_flags); } static inline uint32_t * -dp_packet_rss_ptr(const struct dp_packet *b) +dp_packet_rss_ptr(const struct dp_packet *p) { - return CONST_CAST(uint32_t *, &b->mbuf.hash.rss); + return CONST_CAST(uint32_t *, &p->mbuf.hash.rss); } static inline uint32_t * -dp_packet_flow_mark_ptr(const struct dp_packet *b) +dp_packet_flow_mark_ptr(const struct dp_packet *p) { - return CONST_CAST(uint32_t *, &b->mbuf.hash.fdir.hi); + return CONST_CAST(uint32_t *, &p->mbuf.hash.fdir.hi); } #else static inline uint32_t * -dp_packet_ol_flags_ptr(const struct dp_packet *b) +dp_packet_ol_flags_ptr(const struct dp_packet *p) { - return CONST_CAST(uint32_t *, &b->ol_flags); + return CONST_CAST(uint32_t *, &p->ol_flags); } static inline uint32_t * -dp_packet_rss_ptr(const struct dp_packet *b) +dp_packet_rss_ptr(const struct dp_packet *p) { - return CONST_CAST(uint32_t *, &b->rss_hash); + return CONST_CAST(uint32_t *, &p->rss_hash); } static inline uint32_t * -dp_packet_flow_mark_ptr(const struct dp_packet *b) +dp_packet_flow_mark_ptr(const struct dp_packet *p) { - return CONST_CAST(uint32_t *, &b->flow_mark); + return CONST_CAST(uint32_t *, &p->flow_mark); } #endif @@ -574,25 +574,25 @@ dp_packet_init_specific(struct dp_packet *p) } static inline void * -dp_packet_base(const struct dp_packet *b) +dp_packet_base(const struct dp_packet *p) { - return b->mbuf.buf_addr; + return p->mbuf.buf_addr; } static inline void -dp_packet_set_base(struct dp_packet *b, void *d) +dp_packet_set_base(struct dp_packet *p, void *d) { - b->mbuf.buf_addr = d; + p->mbuf.buf_addr = d; } static inline uint32_t -dp_packet_size(const struct dp_packet *b) +dp_packet_size(const struct dp_packet *p) { - return b->mbuf.pkt_len; + return p->mbuf.pkt_len; } static inline void -dp_packet_set_size(struct dp_packet *b, uint32_t v) +dp_packet_set_size(struct dp_packet *p, uint32_t v) { /* netdev-dpdk does not currently support segmentation; consequently, for * all intents and purposes, 'data_len' (16 bit) and 'pkt_len' (32 bit) may @@ -602,33 +602,33 @@ dp_packet_set_size(struct dp_packet *b, uint32_t v) * (and thus 'v') will always be <= UINT16_MAX; this means that there is no * loss of accuracy in assigning 'v' to 'data_len'. */ - b->mbuf.data_len = (uint16_t)v; /* Current seg length. */ - b->mbuf.pkt_len = v; /* Total length of all segments linked to + p->mbuf.data_len = (uint16_t) v; /* Current seg length. */ + p->mbuf.pkt_len = v; /* Total length of all segments linked to * this segment. */ } static inline uint16_t -__packet_data(const struct dp_packet *b) +__packet_data(const struct dp_packet *p) { - return b->mbuf.data_off; + return p->mbuf.data_off; } static inline void -__packet_set_data(struct dp_packet *b, uint16_t v) +__packet_set_data(struct dp_packet *p, uint16_t v) { - b->mbuf.data_off = v; + p->mbuf.data_off = v; } static inline uint16_t -dp_packet_get_allocated(const struct dp_packet *b) +dp_packet_get_allocated(const struct dp_packet *p) { - return b->mbuf.buf_len; + return p->mbuf.buf_len; } static inline void -dp_packet_set_allocated(struct dp_packet *b, uint16_t s) +dp_packet_set_allocated(struct dp_packet *p, uint16_t s) { - b->mbuf.buf_len = s; + p->mbuf.buf_len = s; } #else /* DPDK_NETDEV */ @@ -640,112 +640,112 @@ dp_packet_init_specific(struct dp_packet *p OVS_UNUSED) } static inline void * -dp_packet_base(const struct dp_packet *b) +dp_packet_base(const struct dp_packet *p) { - return b->base_; + return p->base_; } static inline void -dp_packet_set_base(struct dp_packet *b, void *d) +dp_packet_set_base(struct dp_packet *p, void *d) { - b->base_ = d; + p->base_ = d; } static inline uint32_t -dp_packet_size(const struct dp_packet *b) +dp_packet_size(const struct dp_packet *p) { - return b->size_; + return p->size_; } static inline void -dp_packet_set_size(struct dp_packet *b, uint32_t v) +dp_packet_set_size(struct dp_packet *p, uint32_t v) { - b->size_ = v; + p->size_ = v; } static inline uint16_t -__packet_data(const struct dp_packet *b) +__packet_data(const struct dp_packet *p) { - return b->data_ofs; + return p->data_ofs; } static inline void -__packet_set_data(struct dp_packet *b, uint16_t v) +__packet_set_data(struct dp_packet *p, uint16_t v) { - b->data_ofs = v; + p->data_ofs = v; } static inline uint16_t -dp_packet_get_allocated(const struct dp_packet *b) +dp_packet_get_allocated(const struct dp_packet *p) { - return b->allocated_; + return p->allocated_; } static inline void -dp_packet_set_allocated(struct dp_packet *b, uint16_t s) +dp_packet_set_allocated(struct dp_packet *p, uint16_t s) { - b->allocated_ = s; + p->allocated_ = s; } #endif /* DPDK_NETDEV */ static inline void -dp_packet_reset_cutlen(struct dp_packet *b) +dp_packet_reset_cutlen(struct dp_packet *p) { - b->cutlen = 0; + p->cutlen = 0; } static inline uint32_t -dp_packet_set_cutlen(struct dp_packet *b, uint32_t max_len) +dp_packet_set_cutlen(struct dp_packet *p, uint32_t max_len) { if (max_len < ETH_HEADER_LEN) { max_len = ETH_HEADER_LEN; } - if (max_len >= dp_packet_size(b)) { - b->cutlen = 0; + if (max_len >= dp_packet_size(p)) { + p->cutlen = 0; } else { - b->cutlen = dp_packet_size(b) - max_len; + p->cutlen = dp_packet_size(p) - max_len; } - return b->cutlen; + return p->cutlen; } static inline uint32_t -dp_packet_get_cutlen(const struct dp_packet *b) +dp_packet_get_cutlen(const struct dp_packet *p) { /* Always in valid range if user uses dp_packet_set_cutlen. */ - return b->cutlen; + return p->cutlen; } static inline uint32_t -dp_packet_get_send_len(const struct dp_packet *b) +dp_packet_get_send_len(const struct dp_packet *p) { - return dp_packet_size(b) - dp_packet_get_cutlen(b); + return dp_packet_size(p) - dp_packet_get_cutlen(p); } static inline void * -dp_packet_data(const struct dp_packet *b) +dp_packet_data(const struct dp_packet *p) { - return __packet_data(b) != UINT16_MAX - ? (char *) dp_packet_base(b) + __packet_data(b) : NULL; + return __packet_data(p) != UINT16_MAX + ? (char *) dp_packet_base(p) + __packet_data(p) : NULL; } static inline void -dp_packet_set_data(struct dp_packet *b, void *data) +dp_packet_set_data(struct dp_packet *p, void *data) { if (data) { - __packet_set_data(b, (char *) data - (char *) dp_packet_base(b)); + __packet_set_data(p, (char *) data - (char *) dp_packet_base(p)); } else { - __packet_set_data(b, UINT16_MAX); + __packet_set_data(p, UINT16_MAX); } } static inline void -dp_packet_reset_packet(struct dp_packet *b, int off) +dp_packet_reset_packet(struct dp_packet *p, int off) { - dp_packet_set_size(b, dp_packet_size(b) - off); - dp_packet_set_data(b, ((unsigned char *) dp_packet_data(b) + off)); - dp_packet_reset_offsets(b); + dp_packet_set_size(p, dp_packet_size(p) - off); + dp_packet_set_data(p, ((unsigned char *) dp_packet_data(p) + off)); + dp_packet_reset_offsets(p); } enum { NETDEV_MAX_BURST = 32 }; /* Maximum number packets in a batch. */ @@ -757,69 +757,69 @@ struct dp_packet_batch { }; static inline void -dp_packet_batch_init(struct dp_packet_batch *batch) +dp_packet_batch_init(struct dp_packet_batch *b) { - batch->count = 0; - batch->trunc = false; + b->count = 0; + b->trunc = false; } static inline void -dp_packet_batch_add__(struct dp_packet_batch *batch, - struct dp_packet *packet, size_t limit) +dp_packet_batch_add__(struct dp_packet_batch *b, + struct dp_packet *p, size_t limit) { - if (batch->count < limit) { - batch->packets[batch->count++] = packet; + if (b->count < limit) { + b->packets[b->count++] = p; } else { - dp_packet_delete(packet); + dp_packet_delete(p); } } -/* When the batch is full, 'packet' will be dropped and freed. */ +/* When the batch is full, 'p' will be dropped and freed. */ static inline void -dp_packet_batch_add(struct dp_packet_batch *batch, struct dp_packet *packet) +dp_packet_batch_add(struct dp_packet_batch *b, struct dp_packet *p) { - dp_packet_batch_add__(batch, packet, NETDEV_MAX_BURST); + dp_packet_batch_add__(b, p, NETDEV_MAX_BURST); } static inline size_t -dp_packet_batch_size(const struct dp_packet_batch *batch) +dp_packet_batch_size(const struct dp_packet_batch *b) { - return batch->count; + return b->count; } -/* Clear 'batch' for refill. Use dp_packet_batch_refill() to add - * packets back into the 'batch'. */ +/* Clear 'b' for refill. Use dp_packet_batch_refill() to add + * packets back into the 'b'. */ static inline void -dp_packet_batch_refill_init(struct dp_packet_batch *batch) +dp_packet_batch_refill_init(struct dp_packet_batch *b) { - batch->count = 0; + b->count = 0; }; static inline void -dp_packet_batch_refill(struct dp_packet_batch *batch, +dp_packet_batch_refill(struct dp_packet_batch *b, struct dp_packet *packet, size_t idx) { - dp_packet_batch_add__(batch, packet, MIN(NETDEV_MAX_BURST, idx + 1)); + dp_packet_batch_add__(b, packet, MIN(NETDEV_MAX_BURST, idx + 1)); } static inline void -dp_packet_batch_init_packet(struct dp_packet_batch *batch, struct dp_packet *p) +dp_packet_batch_init_packet(struct dp_packet_batch *b, struct dp_packet *p) { - dp_packet_batch_init(batch); - batch->count = 1; - batch->packets[0] = p; + dp_packet_batch_init(b); + b->count = 1; + b->packets[0] = p; } static inline bool -dp_packet_batch_is_empty(const struct dp_packet_batch *batch) +dp_packet_batch_is_empty(const struct dp_packet_batch *b) { - return !dp_packet_batch_size(batch); + return !dp_packet_batch_size(b); } static inline bool -dp_packet_batch_is_full(const struct dp_packet_batch *batch) +dp_packet_batch_is_full(const struct dp_packet_batch *b) { - return dp_packet_batch_size(batch) == NETDEV_MAX_BURST; + return dp_packet_batch_size(b) == NETDEV_MAX_BURST; } #define DP_PACKET_BATCH_FOR_EACH(IDX, PACKET, BATCH) \ @@ -863,53 +863,53 @@ dp_packet_batch_clone(struct dp_packet_batch *dst, } static inline void -dp_packet_delete_batch(struct dp_packet_batch *batch, bool should_steal) +dp_packet_delete_batch(struct dp_packet_batch *b, bool should_steal) { if (should_steal) { struct dp_packet *packet; - DP_PACKET_BATCH_FOR_EACH (i, packet, batch) { + DP_PACKET_BATCH_FOR_EACH (i, packet, b) { dp_packet_delete(packet); } - dp_packet_batch_init(batch); + dp_packet_batch_init(b); } } static inline void -dp_packet_batch_init_packet_fields(struct dp_packet_batch *batch) +dp_packet_batch_init_packet_fields(struct dp_packet_batch *b) { struct dp_packet *packet; - DP_PACKET_BATCH_FOR_EACH (i, packet, batch) { + DP_PACKET_BATCH_FOR_EACH (i, packet, b) { dp_packet_reset_cutlen(packet); packet->packet_type = htonl(PT_ETH); } } static inline void -dp_packet_batch_apply_cutlen(struct dp_packet_batch *batch) +dp_packet_batch_apply_cutlen(struct dp_packet_batch *b) { - if (batch->trunc) { + if (b->trunc) { struct dp_packet *packet; - DP_PACKET_BATCH_FOR_EACH (i, packet, batch) { + DP_PACKET_BATCH_FOR_EACH (i, packet, b) { dp_packet_set_size(packet, dp_packet_get_send_len(packet)); dp_packet_reset_cutlen(packet); } - batch->trunc = false; + b->trunc = false; } } static inline void -dp_packet_batch_reset_cutlen(struct dp_packet_batch *batch) +dp_packet_batch_reset_cutlen(struct dp_packet_batch *b) { - if (batch->trunc) { + if (b->trunc) { struct dp_packet *packet; - DP_PACKET_BATCH_FOR_EACH (i, packet, batch) { + DP_PACKET_BATCH_FOR_EACH (i, packet, b) { dp_packet_reset_cutlen(packet); } - batch->trunc = false; + b->trunc = false; } } @@ -960,101 +960,101 @@ dp_packet_set_flow_mark(struct dp_packet *p, uint32_t mark) /* Returns the L4 cksum offload bitmask. */ static inline uint64_t -dp_packet_ol_l4_mask(const struct dp_packet *b) +dp_packet_ol_l4_mask(const struct dp_packet *a) { - return *dp_packet_ol_flags_ptr(b) & DP_PACKET_OL_TX_L4_MASK; + return *dp_packet_ol_flags_ptr(a) & DP_PACKET_OL_TX_L4_MASK; } -/* Return true if the packet 'b' requested L4 checksum offload. */ +/* Return true if the packet 'a' requested L4 checksum offload. */ static inline bool -dp_packet_ol_tx_l4_checksum(const struct dp_packet *b) +dp_packet_ol_tx_l4_checksum(const struct dp_packet *a) { - return !!dp_packet_ol_l4_mask(b); + return !!dp_packet_ol_l4_mask(a); } -/* Returns 'true' if packet 'b' is marked for TCP segmentation offloading. */ +/* Returns 'true' if packet 'a' is marked for TCP segmentation offloading. */ static inline bool -dp_packet_ol_is_tso(const struct dp_packet *b) +dp_packet_ol_is_tso(const struct dp_packet *a) { - return !!(*dp_packet_ol_flags_ptr(b) & DP_PACKET_OL_TX_TCP_SEG); + return !!(*dp_packet_ol_flags_ptr(a) & DP_PACKET_OL_TX_TCP_SEG); } -/* Returns 'true' if packet 'b' is marked for IPv4 checksum offloading. */ +/* Returns 'true' if packet 'a' is marked for IPv4 checksum offloading. */ static inline bool -dp_packet_ol_is_ipv4(const struct dp_packet *b) +dp_packet_ol_is_ipv4(const struct dp_packet *a) { - return !!(*dp_packet_ol_flags_ptr(b) & DP_PACKET_OL_TX_IPV4); + return !!(*dp_packet_ol_flags_ptr(a) & DP_PACKET_OL_TX_IPV4); } -/* Returns 'true' if packet 'b' is marked for TCP checksum offloading. */ +/* Returns 'true' if packet 'a' is marked for TCP checksum offloading. */ static inline bool -dp_packet_ol_l4_is_tcp(const struct dp_packet *b) +dp_packet_ol_l4_is_tcp(const struct dp_packet *a) { - return (*dp_packet_ol_flags_ptr(b) & DP_PACKET_OL_TX_L4_MASK) == + return (*dp_packet_ol_flags_ptr(a) & DP_PACKET_OL_TX_L4_MASK) == DP_PACKET_OL_TX_TCP_CSUM; } -/* Returns 'true' if packet 'b' is marked for UDP checksum offloading. */ +/* Returns 'true' if packet 'a' is marked for UDP checksum offloading. */ static inline bool -dp_packet_ol_l4_is_udp(struct dp_packet *b) +dp_packet_ol_l4_is_udp(struct dp_packet *a) { - return (*dp_packet_ol_flags_ptr(b) & DP_PACKET_OL_TX_L4_MASK) == + return (*dp_packet_ol_flags_ptr(a) & DP_PACKET_OL_TX_L4_MASK) == DP_PACKET_OL_TX_UDP_CSUM; } -/* Returns 'true' if packet 'b' is marked for SCTP checksum offloading. */ +/* Returns 'true' if packet 'a' is marked for SCTP checksum offloading. */ static inline bool -dp_packet_ol_l4_is_sctp(struct dp_packet *b) +dp_packet_ol_l4_is_sctp(struct dp_packet *a) { - return (*dp_packet_ol_flags_ptr(b) & DP_PACKET_OL_TX_L4_MASK) == + return (*dp_packet_ol_flags_ptr(a) & DP_PACKET_OL_TX_L4_MASK) == DP_PACKET_OL_TX_SCTP_CSUM; } -/* Mark packet 'b' for IPv4 checksum offloading. */ +/* Mark packet 'a' for IPv4 checksum offloading. */ static inline void -dp_packet_ol_set_tx_ipv4(struct dp_packet *b) +dp_packet_ol_set_tx_ipv4(struct dp_packet *a) { - *dp_packet_ol_flags_ptr(b) |= DP_PACKET_OL_TX_IPV4; + *dp_packet_ol_flags_ptr(a) |= DP_PACKET_OL_TX_IPV4; } -/* Mark packet 'b' for IPv6 checksum offloading. */ +/* Mark packet 'a' for IPv6 checksum offloading. */ static inline void -dp_packet_ol_set_tx_ipv6(struct dp_packet *b) +dp_packet_ol_set_tx_ipv6(struct dp_packet *a) { - *dp_packet_ol_flags_ptr(b) |= DP_PACKET_OL_TX_IPV6; + *dp_packet_ol_flags_ptr(a) |= DP_PACKET_OL_TX_IPV6; } -/* Mark packet 'b' for TCP checksum offloading. It implies that either - * the packet 'b' is marked for IPv4 or IPv6 checksum offloading. */ +/* Mark packet 'a' for TCP checksum offloading. It implies that either + * the packet 'a' is marked for IPv4 or IPv6 checksum offloading. */ static inline void -dp_packet_ol_set_csum_tcp(struct dp_packet *b) +dp_packet_ol_set_csum_tcp(struct dp_packet *a) { - *dp_packet_ol_flags_ptr(b) |= DP_PACKET_OL_TX_TCP_CSUM; + *dp_packet_ol_flags_ptr(a) |= DP_PACKET_OL_TX_TCP_CSUM; } -/* Mark packet 'b' for UDP checksum offloading. It implies that either - * the packet 'b' is marked for IPv4 or IPv6 checksum offloading. */ +/* Mark packet 'a' for UDP checksum offloading. It implies that either + * the packet 'a' is marked for IPv4 or IPv6 checksum offloading. */ static inline void -dp_packet_ol_set_csum_udp(struct dp_packet *b) +dp_packet_ol_set_csum_udp(struct dp_packet *a) { - *dp_packet_ol_flags_ptr(b) |= DP_PACKET_OL_TX_UDP_CSUM; + *dp_packet_ol_flags_ptr(a) |= DP_PACKET_OL_TX_UDP_CSUM; } -/* Mark packet 'b' for SCTP checksum offloading. It implies that either - * the packet 'b' is marked for IPv4 or IPv6 checksum offloading. */ +/* Mark packet 'a' for SCTP checksum offloading. It implies that either + * the packet 'a' is marked for IPv4 or IPv6 checksum offloading. */ static inline void -dp_packet_ol_set_csum_sctp(struct dp_packet *b) +dp_packet_ol_set_csum_sctp(struct dp_packet *a) { - *dp_packet_ol_flags_ptr(b) |= DP_PACKET_OL_TX_SCTP_CSUM; + *dp_packet_ol_flags_ptr(a) |= DP_PACKET_OL_TX_SCTP_CSUM; } -/* Mark packet 'b' for TCP segmentation offloading. It implies that - * either the packet 'b' is marked for IPv4 or IPv6 checksum offloading +/* Mark packet 'a' for TCP segmentation offloading. It implies that + * either the packet 'a' is marked for IPv4 or IPv6 checksum offloading * and also for TCP checksum offloading. */ static inline void -dp_packet_ol_set_tcp_seg(struct dp_packet *b) +dp_packet_ol_set_tcp_seg(struct dp_packet *a) { - *dp_packet_ol_flags_ptr(b) |= DP_PACKET_OL_TX_TCP_SEG; + *dp_packet_ol_flags_ptr(a) |= DP_PACKET_OL_TX_TCP_SEG; } static inline bool diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c index 72cb95471..6e62447f1 100644 --- a/lib/netdev-dummy.c +++ b/lib/netdev-dummy.c @@ -224,14 +224,14 @@ static void dummy_packet_stream_send(struct dummy_packet_stream *s, const void *buffer, size_t size) { if (ovs_list_size(&s->txq) < NETDEV_DUMMY_MAX_QUEUE) { - struct dp_packet *b; + struct dp_packet *p; struct pkt_list_node *node; - b = dp_packet_clone_data_with_headroom(buffer, size, 2); - put_unaligned_be16(dp_packet_push_uninit(b, 2), htons(size)); + p = dp_packet_clone_data_with_headroom(buffer, size, 2); + put_unaligned_be16(dp_packet_push_uninit(p, 2), htons(size)); node = xmalloc(sizeof *node); - node->pkt = b; + node->pkt = p; ovs_list_push_back(&s->txq, &node->list_node); } } diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c index 8570195cd..490c751b6 100644 --- a/lib/netdev-linux.c +++ b/lib/netdev-linux.c @@ -522,8 +522,8 @@ static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 20); * changes in the device miimon status, so we can use atomic_count. */ static atomic_count miimon_cnt = ATOMIC_COUNT_INIT(0); -static int netdev_linux_parse_vnet_hdr(struct dp_packet *b); -static void netdev_linux_prepend_vnet_hdr(struct dp_packet *b, int mtu); +static int netdev_linux_parse_vnet_hdr(struct dp_packet *p); +static void netdev_linux_prepend_vnet_hdr(struct dp_packet *p, int mtu); static int netdev_linux_do_ethtool(const char *name, struct ethtool_cmd *, int cmd, const char *cmd_name); static int get_flags(const struct netdev *, unsigned int *flags); @@ -6586,13 +6586,13 @@ af_packet_sock(void) } static int -netdev_linux_parse_l2(struct dp_packet *b, uint16_t *l4proto) +netdev_linux_parse_l2(struct dp_packet *p, uint16_t *l4proto) { struct eth_header *eth_hdr; ovs_be16 eth_type; int l2_len; - eth_hdr = dp_packet_at(b, 0, ETH_HEADER_LEN); + eth_hdr = dp_packet_at(p, 0, ETH_HEADER_LEN); if (!eth_hdr) { return -EINVAL; } @@ -6600,7 +6600,7 @@ netdev_linux_parse_l2(struct dp_packet *b, uint16_t *l4proto) l2_len = ETH_HEADER_LEN; eth_type = eth_hdr->eth_type; if (eth_type_vlan(eth_type)) { - struct vlan_header *vlan = dp_packet_at(b, l2_len, VLAN_HEADER_LEN); + struct vlan_header *vlan = dp_packet_at(p, l2_len, VLAN_HEADER_LEN); if (!vlan) { return -EINVAL; @@ -6611,33 +6611,33 @@ netdev_linux_parse_l2(struct dp_packet *b, uint16_t *l4proto) } if (eth_type == htons(ETH_TYPE_IP)) { - struct ip_header *ip_hdr = dp_packet_at(b, l2_len, IP_HEADER_LEN); + struct ip_header *ip_hdr = dp_packet_at(p, l2_len, IP_HEADER_LEN); if (!ip_hdr) { return -EINVAL; } *l4proto = ip_hdr->ip_proto; - dp_packet_ol_set_tx_ipv4(b); + dp_packet_ol_set_tx_ipv4(p); } else if (eth_type == htons(ETH_TYPE_IPV6)) { struct ovs_16aligned_ip6_hdr *nh6; - nh6 = dp_packet_at(b, l2_len, IPV6_HEADER_LEN); + nh6 = dp_packet_at(p, l2_len, IPV6_HEADER_LEN); if (!nh6) { return -EINVAL; } *l4proto = nh6->ip6_ctlun.ip6_un1.ip6_un1_nxt; - dp_packet_ol_set_tx_ipv6(b); + dp_packet_ol_set_tx_ipv6(p); } return 0; } static int -netdev_linux_parse_vnet_hdr(struct dp_packet *b) +netdev_linux_parse_vnet_hdr(struct dp_packet *p) { - struct virtio_net_hdr *vnet = dp_packet_pull(b, sizeof *vnet); + struct virtio_net_hdr *vnet = dp_packet_pull(p, sizeof *vnet); uint16_t l4proto = 0; if (OVS_UNLIKELY(!vnet)) { @@ -6648,17 +6648,17 @@ netdev_linux_parse_vnet_hdr(struct dp_packet *b) return 0; } - if (netdev_linux_parse_l2(b, &l4proto)) { + if (netdev_linux_parse_l2(p, &l4proto)) { return -EINVAL; } if (vnet->flags == VIRTIO_NET_HDR_F_NEEDS_CSUM) { if (l4proto == IPPROTO_TCP) { - dp_packet_ol_set_csum_tcp(b); + dp_packet_ol_set_csum_tcp(p); } else if (l4proto == IPPROTO_UDP) { - dp_packet_ol_set_csum_udp(b); + dp_packet_ol_set_csum_udp(p); } else if (l4proto == IPPROTO_SCTP) { - dp_packet_ol_set_csum_sctp(b); + dp_packet_ol_set_csum_sctp(p); } } @@ -6670,7 +6670,7 @@ netdev_linux_parse_vnet_hdr(struct dp_packet *b) if (type == VIRTIO_NET_HDR_GSO_TCPV4 || type == VIRTIO_NET_HDR_GSO_TCPV6) { - dp_packet_ol_set_tcp_seg(b); + dp_packet_ol_set_tcp_seg(p); } } @@ -6678,17 +6678,17 @@ netdev_linux_parse_vnet_hdr(struct dp_packet *b) } static void -netdev_linux_prepend_vnet_hdr(struct dp_packet *b, int mtu) +netdev_linux_prepend_vnet_hdr(struct dp_packet *p, int mtu) { - struct virtio_net_hdr *vnet = dp_packet_push_zeros(b, sizeof *vnet); + struct virtio_net_hdr *vnet = dp_packet_push_zeros(p, sizeof *vnet); - if (dp_packet_ol_is_tso(b)) { - uint16_t hdr_len = ((char *)dp_packet_l4(b) - (char *)dp_packet_eth(b)) - + TCP_HEADER_LEN; + if (dp_packet_ol_is_tso(p)) { + uint16_t hdr_len = ((char *) dp_packet_l4(p) + - (char *) dp_packet_eth(p)) + TCP_HEADER_LEN; vnet->hdr_len = (OVS_FORCE __virtio16)hdr_len; vnet->gso_size = (OVS_FORCE __virtio16)(mtu - hdr_len); - if (dp_packet_ol_is_ipv4(b)) { + if (dp_packet_ol_is_ipv4(p)) { vnet->gso_type = VIRTIO_NET_HDR_GSO_TCPV4; } else { vnet->gso_type = VIRTIO_NET_HDR_GSO_TCPV6; @@ -6698,18 +6698,18 @@ netdev_linux_prepend_vnet_hdr(struct dp_packet *b, int mtu) vnet->flags = VIRTIO_NET_HDR_GSO_NONE; } - if (dp_packet_ol_l4_mask(b)) { + if (dp_packet_ol_l4_mask(p)) { vnet->flags = VIRTIO_NET_HDR_F_NEEDS_CSUM; - vnet->csum_start = (OVS_FORCE __virtio16)((char *)dp_packet_l4(b) - - (char *)dp_packet_eth(b)); + vnet->csum_start = (OVS_FORCE __virtio16)((char *) dp_packet_l4(p) + - (char *) dp_packet_eth(p)); - if (dp_packet_ol_l4_is_tcp(b)) { + if (dp_packet_ol_l4_is_tcp(p)) { vnet->csum_offset = (OVS_FORCE __virtio16) __builtin_offsetof( struct tcp_header, tcp_csum); - } else if (dp_packet_ol_l4_is_udp(b)) { + } else if (dp_packet_ol_l4_is_udp(p)) { vnet->csum_offset = (OVS_FORCE __virtio16) __builtin_offsetof( struct udp_header, udp_csum); - } else if (dp_packet_ol_l4_is_sctp(b)) { + } else if (dp_packet_ol_l4_is_sctp(p)) { vnet->csum_offset = (OVS_FORCE __virtio16) __builtin_offsetof( struct sctp_header, sctp_csum); } else { diff --git a/lib/packets.c b/lib/packets.c index d0fba8176..a1698d65b 100644 --- a/lib/packets.c +++ b/lib/packets.c @@ -192,28 +192,28 @@ eth_addr_from_string(const char *s, struct eth_addr *ea) } } -/* Fills 'b' with a Reverse ARP packet with Ethernet source address 'eth_src'. +/* Fills 'p' with a Reverse ARP packet with Ethernet source address 'eth_src'. * This function is used by Open vSwitch to compose packets in cases where * context is important but content doesn't (or shouldn't) matter. * * The returned packet has enough headroom to insert an 802.1Q VLAN header if * desired. */ void -compose_rarp(struct dp_packet *b, const struct eth_addr eth_src) +compose_rarp(struct dp_packet *p, const struct eth_addr eth_src) { struct eth_header *eth; struct arp_eth_header *arp; - dp_packet_clear(b); - dp_packet_prealloc_tailroom(b, 2 + ETH_HEADER_LEN + VLAN_HEADER_LEN + dp_packet_clear(p); + dp_packet_prealloc_tailroom(p, 2 + ETH_HEADER_LEN + VLAN_HEADER_LEN + ARP_ETH_HEADER_LEN); - dp_packet_reserve(b, 2 + VLAN_HEADER_LEN); - eth = dp_packet_put_uninit(b, sizeof *eth); + dp_packet_reserve(p, 2 + VLAN_HEADER_LEN); + eth = dp_packet_put_uninit(p, sizeof *eth); eth->eth_dst = eth_addr_broadcast; eth->eth_src = eth_src; eth->eth_type = htons(ETH_TYPE_RARP); - arp = dp_packet_put_uninit(b, sizeof *arp); + arp = dp_packet_put_uninit(p, sizeof *arp); arp->ar_hrd = htons(ARP_HRD_ETHERNET); arp->ar_pro = htons(ARP_PRO_IP); arp->ar_hln = sizeof arp->ar_sha; @@ -224,9 +224,9 @@ compose_rarp(struct dp_packet *b, const struct eth_addr eth_src) arp->ar_tha = eth_src; put_16aligned_be32(&arp->ar_tpa, htonl(0)); - dp_packet_reset_offsets(b); - dp_packet_set_l3(b, arp); - b->packet_type = htonl(PT_ETH); + dp_packet_reset_offsets(p); + dp_packet_set_l3(p, arp); + p->packet_type = htonl(PT_ETH); } /* Insert VLAN header according to given TCI. Packet passed must be Ethernet @@ -1082,17 +1082,17 @@ ipv6_is_cidr(const struct in6_addr *netmask) return true; } -/* Populates 'b' with an Ethernet II packet headed with the given 'eth_dst', +/* Populates 'p' with an Ethernet II packet headed with the given 'eth_dst', * 'eth_src' and 'eth_type' parameters. A payload of 'size' bytes is allocated - * in 'b' and returned. This payload may be populated with appropriate - * information by the caller. Sets 'b''s 'frame' pointer and 'l3' offset to + * in 'p' and returned. This payload may be populated with appropriate + * information by the caller. Sets 'p''s 'frame' pointer and 'l3' offset to * the Ethernet header and payload respectively. Aligns b->l3 on a 32-bit * boundary. * * The returned packet has enough headroom to insert an 802.1Q VLAN header if * desired. */ void * -eth_compose(struct dp_packet *b, const struct eth_addr eth_dst, +eth_compose(struct dp_packet *p, const struct eth_addr eth_dst, const struct eth_addr eth_src, uint16_t eth_type, size_t size) { @@ -1100,22 +1100,22 @@ eth_compose(struct dp_packet *b, const struct eth_addr eth_dst, struct eth_header *eth; - dp_packet_clear(b); + dp_packet_clear(p); /* The magic 2 here ensures that the L3 header (when it is added later) * will be 32-bit aligned. */ - dp_packet_prealloc_tailroom(b, 2 + ETH_HEADER_LEN + VLAN_HEADER_LEN + size); - dp_packet_reserve(b, 2 + VLAN_HEADER_LEN); - eth = dp_packet_put_uninit(b, ETH_HEADER_LEN); - data = dp_packet_put_zeros(b, size); + dp_packet_prealloc_tailroom(p, 2 + ETH_HEADER_LEN + VLAN_HEADER_LEN + size); + dp_packet_reserve(p, 2 + VLAN_HEADER_LEN); + eth = dp_packet_put_uninit(p, ETH_HEADER_LEN); + data = dp_packet_put_zeros(p, size); eth->eth_dst = eth_dst; eth->eth_src = eth_src; eth->eth_type = htons(eth_type); - b->packet_type = htonl(PT_ETH); - dp_packet_reset_offsets(b); - dp_packet_set_l3(b, data); + p->packet_type = htonl(PT_ETH); + dp_packet_reset_offsets(p); + dp_packet_set_l3(p, data); return data; } @@ -1648,23 +1648,23 @@ packet_format_tcp_flags(struct ds *s, uint16_t tcp_flags) #define ARP_PACKET_SIZE (2 + ETH_HEADER_LEN + VLAN_HEADER_LEN + \ ARP_ETH_HEADER_LEN) -/* Clears 'b' and replaces its contents by an ARP frame with the specified +/* Clears 'p' and replaces its contents by an ARP frame with the specified * 'arp_op', 'arp_sha', 'arp_tha', 'arp_spa', and 'arp_tpa'. The outer * Ethernet frame is initialized with Ethernet source 'arp_sha' and destination * 'arp_tha', except that destination ff:ff:ff:ff:ff:ff is used instead if * 'broadcast' is true. Points the L3 header to the ARP header. */ void -compose_arp(struct dp_packet *b, uint16_t arp_op, +compose_arp(struct dp_packet *p, uint16_t arp_op, const struct eth_addr arp_sha, const struct eth_addr arp_tha, bool broadcast, ovs_be32 arp_spa, ovs_be32 arp_tpa) { - compose_arp__(b); + compose_arp__(p); - struct eth_header *eth = dp_packet_eth(b); + struct eth_header *eth = dp_packet_eth(p); eth->eth_dst = broadcast ? eth_addr_broadcast : arp_tha; eth->eth_src = arp_sha; - struct arp_eth_header *arp = dp_packet_l3(b); + struct arp_eth_header *arp = dp_packet_l3(p); arp->ar_op = htons(arp_op); arp->ar_sha = arp_sha; arp->ar_tha = arp_tha; @@ -1672,30 +1672,30 @@ compose_arp(struct dp_packet *b, uint16_t arp_op, put_16aligned_be32(&arp->ar_tpa, arp_tpa); } -/* Clears 'b' and replaces its contents by an ARP frame. Sets the fields in +/* Clears 'p' and replaces its contents by an ARP frame. Sets the fields in * the Ethernet and ARP headers that are fixed for ARP frames to those fixed * values, and zeroes the other fields. Points the L3 header to the ARP * header. */ void -compose_arp__(struct dp_packet *b) +compose_arp__(struct dp_packet *p) { - dp_packet_clear(b); - dp_packet_prealloc_tailroom(b, ARP_PACKET_SIZE); - dp_packet_reserve(b, 2 + VLAN_HEADER_LEN); + dp_packet_clear(p); + dp_packet_prealloc_tailroom(p, ARP_PACKET_SIZE); + dp_packet_reserve(p, 2 + VLAN_HEADER_LEN); - struct eth_header *eth = dp_packet_put_zeros(b, sizeof *eth); + struct eth_header *eth = dp_packet_put_zeros(p, sizeof *eth); eth->eth_type = htons(ETH_TYPE_ARP); - struct arp_eth_header *arp = dp_packet_put_zeros(b, sizeof *arp); + struct arp_eth_header *arp = dp_packet_put_zeros(p, sizeof *arp); arp->ar_hrd = htons(ARP_HRD_ETHERNET); arp->ar_pro = htons(ARP_PRO_IP); arp->ar_hln = sizeof arp->ar_sha; arp->ar_pln = sizeof arp->ar_spa; - dp_packet_reset_offsets(b); - dp_packet_set_l3(b, arp); + dp_packet_reset_offsets(p); + dp_packet_set_l3(p, arp); - b->packet_type = htonl(PT_ETH); + p->packet_type = htonl(PT_ETH); } /* This function expects packet with ethernet header with correct @@ -1720,7 +1720,7 @@ compose_ipv6(struct dp_packet *packet, uint8_t proto, /* Compose an IPv6 Neighbor Discovery Neighbor Solicitation message. */ void -compose_nd_ns(struct dp_packet *b, const struct eth_addr eth_src, +compose_nd_ns(struct dp_packet *p, const struct eth_addr eth_src, const struct in6_addr *ipv6_src, const struct in6_addr *ipv6_dst) { struct in6_addr sn_addr; @@ -1732,8 +1732,8 @@ compose_nd_ns(struct dp_packet *b, const struct eth_addr eth_src, in6_addr_solicited_node(&sn_addr, ipv6_dst); ipv6_multicast_to_ethernet(ð_dst, &sn_addr); - eth_compose(b, eth_dst, eth_src, ETH_TYPE_IPV6, IPV6_HEADER_LEN); - ns = compose_ipv6(b, IPPROTO_ICMPV6, ipv6_src, &sn_addr, + eth_compose(p, eth_dst, eth_src, ETH_TYPE_IPV6, IPV6_HEADER_LEN); + ns = compose_ipv6(p, IPPROTO_ICMPV6, ipv6_src, &sn_addr, 0, 0, 255, ND_MSG_LEN + ND_LLA_OPT_LEN); ns->icmph.icmp6_type = ND_NEIGHBOR_SOLICIT; @@ -1744,17 +1744,17 @@ compose_nd_ns(struct dp_packet *b, const struct eth_addr eth_src, lla_opt->type = ND_OPT_SOURCE_LINKADDR; lla_opt->len = 1; - packet_set_nd(b, ipv6_dst, eth_src, eth_addr_zero); + packet_set_nd(p, ipv6_dst, eth_src, eth_addr_zero); ns->icmph.icmp6_cksum = 0; - icmp_csum = packet_csum_pseudoheader6(dp_packet_l3(b)); + icmp_csum = packet_csum_pseudoheader6(dp_packet_l3(p)); ns->icmph.icmp6_cksum = csum_finish( csum_continue(icmp_csum, ns, ND_MSG_LEN + ND_LLA_OPT_LEN)); } /* Compose an IPv6 Neighbor Discovery Neighbor Advertisement message. */ void -compose_nd_na(struct dp_packet *b, +compose_nd_na(struct dp_packet *p, const struct eth_addr eth_src, const struct eth_addr eth_dst, const struct in6_addr *ipv6_src, const struct in6_addr *ipv6_dst, ovs_be32 rso_flags) @@ -1763,8 +1763,8 @@ compose_nd_na(struct dp_packet *b, struct ovs_nd_lla_opt *lla_opt; uint32_t icmp_csum; - eth_compose(b, eth_dst, eth_src, ETH_TYPE_IPV6, IPV6_HEADER_LEN); - na = compose_ipv6(b, IPPROTO_ICMPV6, ipv6_src, ipv6_dst, + eth_compose(p, eth_dst, eth_src, ETH_TYPE_IPV6, IPV6_HEADER_LEN); + na = compose_ipv6(p, IPPROTO_ICMPV6, ipv6_src, ipv6_dst, 0, 0, 255, ND_MSG_LEN + ND_LLA_OPT_LEN); na->icmph.icmp6_type = ND_NEIGHBOR_ADVERT; @@ -1775,10 +1775,10 @@ compose_nd_na(struct dp_packet *b, lla_opt->type = ND_OPT_TARGET_LINKADDR; lla_opt->len = 1; - packet_set_nd(b, ipv6_src, eth_addr_zero, eth_src); + packet_set_nd(p, ipv6_src, eth_addr_zero, eth_src); na->icmph.icmp6_cksum = 0; - icmp_csum = packet_csum_pseudoheader6(dp_packet_l3(b)); + icmp_csum = packet_csum_pseudoheader6(dp_packet_l3(p)); na->icmph.icmp6_cksum = csum_finish(csum_continue( icmp_csum, na, ND_MSG_LEN + ND_LLA_OPT_LEN)); } @@ -1786,9 +1786,9 @@ compose_nd_na(struct dp_packet *b, /* Compose an IPv6 Neighbor Discovery Router Advertisement message with * Source Link-layer Address Option and MTU Option. * Caller can call packet_put_ra_prefix_opt to append Prefix Information - * Options to composed messags in 'b'. */ + * Options to composed messags in 'p'. */ void -compose_nd_ra(struct dp_packet *b, +compose_nd_ra(struct dp_packet *p, const struct eth_addr eth_src, const struct eth_addr eth_dst, const struct in6_addr *ipv6_src, const struct in6_addr *ipv6_dst, uint8_t cur_hop_limit, uint8_t mo_flags, @@ -1800,10 +1800,10 @@ compose_nd_ra(struct dp_packet *b, bool with_mtu = mtu != 0; size_t mtu_opt_len = with_mtu ? ND_MTU_OPT_LEN : 0; - eth_compose(b, eth_dst, eth_src, ETH_TYPE_IPV6, IPV6_HEADER_LEN); + eth_compose(p, eth_dst, eth_src, ETH_TYPE_IPV6, IPV6_HEADER_LEN); struct ovs_ra_msg *ra = compose_ipv6( - b, IPPROTO_ICMPV6, ipv6_src, ipv6_dst, 0, 0, 255, + p, IPPROTO_ICMPV6, ipv6_src, ipv6_dst, 0, 0, 255, RA_MSG_LEN + ND_LLA_OPT_LEN + mtu_opt_len); ra->icmph.icmp6_type = ND_ROUTER_ADVERT; ra->icmph.icmp6_code = 0; @@ -1829,7 +1829,7 @@ compose_nd_ra(struct dp_packet *b, } ra->icmph.icmp6_cksum = 0; - uint32_t icmp_csum = packet_csum_pseudoheader6(dp_packet_l3(b)); + uint32_t icmp_csum = packet_csum_pseudoheader6(dp_packet_l3(p)); ra->icmph.icmp6_cksum = csum_finish(csum_continue( icmp_csum, ra, RA_MSG_LEN + ND_LLA_OPT_LEN + mtu_opt_len)); } @@ -1837,17 +1837,17 @@ compose_nd_ra(struct dp_packet *b, /* Append an IPv6 Neighbor Discovery Prefix Information option to a * Router Advertisement message. */ void -packet_put_ra_prefix_opt(struct dp_packet *b, +packet_put_ra_prefix_opt(struct dp_packet *p, uint8_t plen, uint8_t la_flags, ovs_be32 valid_lifetime, ovs_be32 preferred_lifetime, const ovs_be128 prefix) { - size_t prev_l4_size = dp_packet_l4_size(b); - struct ip6_hdr *nh = dp_packet_l3(b); + size_t prev_l4_size = dp_packet_l4_size(p); + struct ip6_hdr *nh = dp_packet_l3(p); nh->ip6_plen = htons(prev_l4_size + ND_PREFIX_OPT_LEN); struct ovs_nd_prefix_opt *prefix_opt = - dp_packet_put_uninit(b, sizeof *prefix_opt); + dp_packet_put_uninit(p, sizeof *prefix_opt); prefix_opt->type = ND_OPT_PREFIX_INFORMATION; prefix_opt->len = 4; prefix_opt->prefix_len = plen; @@ -1857,9 +1857,9 @@ packet_put_ra_prefix_opt(struct dp_packet *b, put_16aligned_be32(&prefix_opt->reserved, 0); memcpy(prefix_opt->prefix.be32, prefix.be32, sizeof(ovs_be32[4])); - struct ovs_ra_msg *ra = dp_packet_l4(b); + struct ovs_ra_msg *ra = dp_packet_l4(p); ra->icmph.icmp6_cksum = 0; - uint32_t icmp_csum = packet_csum_pseudoheader6(dp_packet_l3(b)); + uint32_t icmp_csum = packet_csum_pseudoheader6(dp_packet_l3(p)); ra->icmph.icmp6_cksum = csum_finish(csum_continue( icmp_csum, ra, prev_l4_size + ND_PREFIX_OPT_LEN)); } From patchwork Tue Jun 14 22:13:12 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mike Pattrick X-Patchwork-Id: 1643436 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=iikzeGc1; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=2605:bc80:3010::138; helo=smtp1.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Received: from smtp1.osuosl.org (smtp1.osuosl.org [IPv6:2605:bc80:3010::138]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4LN2lH4ZYyz9vGJ for ; Wed, 15 Jun 2022 08:13:47 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by smtp1.osuosl.org (Postfix) with ESMTP id 6F3A281421; Tue, 14 Jun 2022 22:13:45 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp1.osuosl.org ([127.0.0.1]) by localhost (smtp1.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id ZBXQcDTEGFCH; Tue, 14 Jun 2022 22:13:44 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [IPv6:2605:bc80:3010:104::8cd3:938]) by smtp1.osuosl.org (Postfix) with ESMTPS id 9E79381342; Tue, 14 Jun 2022 22:13:43 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 6AEE4C007C; Tue, 14 Jun 2022 22:13:43 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp1.osuosl.org (smtp1.osuosl.org [IPv6:2605:bc80:3010::138]) by lists.linuxfoundation.org (Postfix) with ESMTP id EF921C002D for ; Tue, 14 Jun 2022 22:13:41 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp1.osuosl.org (Postfix) with ESMTP id DEEC8813A8 for ; Tue, 14 Jun 2022 22:13:41 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp1.osuosl.org ([127.0.0.1]) by localhost (smtp1.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Wyo9Ahgy1Mft for ; Tue, 14 Jun 2022 22:13:41 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.8.0 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by smtp1.osuosl.org (Postfix) with ESMTPS id E086B81342 for ; Tue, 14 Jun 2022 22:13:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1655244819; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=xJTxf+shbK5fpY2xd9ROnJWaeYLRHZJ8/MLMxzeHu8U=; b=iikzeGc1C1vD7iGiIQjb4YLKPVeuVG3PLstGNr3/6zAh19zaACi6jvA2HWUndoLtwIlvOU ZjWieDbjUxl6GKtggXDYyMk3kQrg2v2rcg3GbVMKQ7bgwX/AZMJEozaSw1hCZE8R7VGYVk dSlDZB20vpXKS4auL82G5bR+f0jQfyw= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-302-Y7yXL_MMPxGXmMMStxwYtw-1; Tue, 14 Jun 2022 18:13:38 -0400 X-MC-Unique: Y7yXL_MMPxGXmMMStxwYtw-1 Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.rdu2.redhat.com [10.11.54.10]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 34C8E85A581; Tue, 14 Jun 2022 22:13:38 +0000 (UTC) Received: from mpattric.remote.csb (unknown [10.22.18.26]) by smtp.corp.redhat.com (Postfix) with ESMTP id CE73C492C3B; Tue, 14 Jun 2022 22:13:37 +0000 (UTC) From: Mike Pattrick To: dev@openvswitch.org Date: Tue, 14 Jun 2022 18:13:12 -0400 Message-Id: <20220614221317.1028795-5-mkp@redhat.com> In-Reply-To: <20220614221317.1028795-4-mkp@redhat.com> References: <20220614221317.1028795-1-mkp@redhat.com> <20220614221317.1028795-2-mkp@redhat.com> <20220614221317.1028795-3-mkp@redhat.com> <20220614221317.1028795-4-mkp@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.85 on 10.11.54.10 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=mkp@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Cc: Flavio Leitner , maxime.coquelin@redhat.com, david.marchand@redhat.com Subject: [ovs-dev] [PATCH 05/10] dp-packet: Rename dp_packet_ol_tcp_seg X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Flavio Leitner Rename to dp_packet_ol_tcp_seg, because that is less redundant and allows other protocols. Signed-off-by: Flavio Leitner Co-authored-by: Mike Pattrick Signed-off-by: Mike Pattrick Acked-by: Maxime Coquelin --- lib/dp-packet.h | 2 +- lib/netdev-linux.c | 2 +- lib/netdev.c | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/dp-packet.h b/lib/dp-packet.h index 1b17ef263..fdc0882ab 100644 --- a/lib/dp-packet.h +++ b/lib/dp-packet.h @@ -974,7 +974,7 @@ dp_packet_ol_tx_l4_checksum(const struct dp_packet *a) /* Returns 'true' if packet 'a' is marked for TCP segmentation offloading. */ static inline bool -dp_packet_ol_is_tso(const struct dp_packet *a) +dp_packet_ol_tcp_seg(const struct dp_packet *a) { return !!(*dp_packet_ol_flags_ptr(a) & DP_PACKET_OL_TX_TCP_SEG); } diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c index 490c751b6..47765032c 100644 --- a/lib/netdev-linux.c +++ b/lib/netdev-linux.c @@ -6682,7 +6682,7 @@ netdev_linux_prepend_vnet_hdr(struct dp_packet *p, int mtu) { struct virtio_net_hdr *vnet = dp_packet_push_zeros(p, sizeof *vnet); - if (dp_packet_ol_is_tso(p)) { + if (dp_packet_ol_tcp_seg(p)) { uint16_t hdr_len = ((char *) dp_packet_l4(p) - (char *) dp_packet_eth(p)) + TCP_HEADER_LEN; diff --git a/lib/netdev.c b/lib/netdev.c index d087929e5..fb535ed7c 100644 --- a/lib/netdev.c +++ b/lib/netdev.c @@ -794,7 +794,7 @@ netdev_send_prepare_packet(const uint64_t netdev_flags, { uint64_t l4_mask; - if (dp_packet_ol_is_tso(packet) + if (dp_packet_ol_tcp_seg(packet) && !(netdev_flags & NETDEV_OFFLOAD_TX_TCP_TSO)) { /* Fall back to GSO in software. */ VLOG_ERR_BUF(errormsg, "No TSO support"); @@ -960,7 +960,7 @@ netdev_push_header(const struct netdev *netdev, size_t i, size = dp_packet_batch_size(batch); DP_PACKET_BATCH_REFILL_FOR_EACH (i, size, packet, batch) { - if (OVS_UNLIKELY(dp_packet_ol_is_tso(packet) + if (OVS_UNLIKELY(dp_packet_ol_tcp_seg(packet) || dp_packet_ol_l4_mask(packet))) { COVERAGE_INC(netdev_push_header_drops); dp_packet_delete(packet); From patchwork Tue Jun 14 22:13:13 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mike Pattrick X-Patchwork-Id: 1643439 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=YknKOEN7; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=2605:bc80:3010::137; helo=smtp4.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Received: from smtp4.osuosl.org (smtp4.osuosl.org [IPv6:2605:bc80:3010::137]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4LN2lS1zcgz9vGJ for ; Wed, 15 Jun 2022 08:13:56 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id DAE5641852; Tue, 14 Jun 2022 22:13:52 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp4.osuosl.org ([127.0.0.1]) by localhost (smtp4.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Au3AiZYGHuVX; Tue, 14 Jun 2022 22:13:51 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp4.osuosl.org (Postfix) with ESMTPS id 7D9D341893; Tue, 14 Jun 2022 22:13:49 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 87626C0086; Tue, 14 Jun 2022 22:13:47 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp3.osuosl.org (smtp3.osuosl.org [140.211.166.136]) by lists.linuxfoundation.org (Postfix) with ESMTP id EAD50C002D for ; Tue, 14 Jun 2022 22:13:43 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp3.osuosl.org (Postfix) with ESMTP id D734C60B4B for ; Tue, 14 Jun 2022 22:13:43 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Authentication-Results: smtp3.osuosl.org (amavisd-new); dkim=pass (1024-bit key) header.d=redhat.com Received: from smtp3.osuosl.org ([127.0.0.1]) by localhost (smtp3.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 0lfnDJwy0VH4 for ; Tue, 14 Jun 2022 22:13:43 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.8.0 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by smtp3.osuosl.org (Postfix) with ESMTPS id E4CAB60AE3 for ; Tue, 14 Jun 2022 22:13:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1655244821; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=3QHDPn+uKWb1+F7gNzjRqbw0vZw1Te62VS+YDJ7WjWM=; b=YknKOEN7sftTf4L/9/nsGNe8ucJzyTadScQp7iR2w+jl+ICWX6retd8qSvlRUhGoy3dP7A aPnnmDLJhqpmmEXpbSJY2fZRgAXceeawAUSh+d9D7HjMfUKLnbCT88Vyp0IRdCWd8wfk39 i00J+9bQJEBgQ3/r7J+X6eYNFNCYrzo= Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-655-FO2WGilANq2HNVP2zT6QSA-1; Tue, 14 Jun 2022 18:13:38 -0400 X-MC-Unique: FO2WGilANq2HNVP2zT6QSA-1 Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.rdu2.redhat.com [10.11.54.10]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id A1F633804510; Tue, 14 Jun 2022 22:13:38 +0000 (UTC) Received: from mpattric.remote.csb (unknown [10.22.18.26]) by smtp.corp.redhat.com (Postfix) with ESMTP id 48B1E492C3B; Tue, 14 Jun 2022 22:13:38 +0000 (UTC) From: Mike Pattrick To: dev@openvswitch.org Date: Tue, 14 Jun 2022 18:13:13 -0400 Message-Id: <20220614221317.1028795-6-mkp@redhat.com> In-Reply-To: <20220614221317.1028795-5-mkp@redhat.com> References: <20220614221317.1028795-1-mkp@redhat.com> <20220614221317.1028795-2-mkp@redhat.com> <20220614221317.1028795-3-mkp@redhat.com> <20220614221317.1028795-4-mkp@redhat.com> <20220614221317.1028795-5-mkp@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.85 on 10.11.54.10 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=mkp@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Cc: Flavio Leitner , maxime.coquelin@redhat.com, david.marchand@redhat.com Subject: [ovs-dev] [PATCH 06/10] dp-packet: Rename dp_packet_ol l4 functions. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Flavio Leitner Rename to better represent their flags. Signed-off-by: Flavio Leitner Co-authored-by: Mike Pattrick Signed-off-by: Mike Pattrick Acked-by: Maxime Coquelin Reviewed-by: David Marchand --- lib/conntrack.c | 4 ++-- lib/dp-packet.h | 14 +++++++------- lib/ipf.c | 6 +++--- lib/netdev-linux.c | 14 +++++++------- lib/netdev.c | 16 +++++++--------- 5 files changed, 26 insertions(+), 28 deletions(-) diff --git a/lib/conntrack.c b/lib/conntrack.c index 39dddefbf..52592301a 100644 --- a/lib/conntrack.c +++ b/lib/conntrack.c @@ -2095,7 +2095,7 @@ conn_key_extract(struct conntrack *ct, struct dp_packet *pkt, ovs_be16 dl_type, COVERAGE_INC(conntrack_l3csum_err); } else { bool hwol_good_l3_csum = dp_packet_ip_checksum_valid(pkt) - || dp_packet_ol_is_ipv4(pkt); + || dp_packet_ol_tx_ipv4(pkt); /* Validate the checksum only when hwol is not supported. */ ok = extract_l3_ipv4(&ctx->key, l3, dp_packet_l3_size(pkt), NULL, !hwol_good_l3_csum); @@ -3402,7 +3402,7 @@ handle_ftp_ctl(struct conntrack *ct, const struct conn_lookup_ctx *ctx, } if (seq_skew) { ip_len = ntohs(l3_hdr->ip_tot_len) + seq_skew; - if (!dp_packet_ol_is_ipv4(pkt)) { + if (!dp_packet_ol_tx_ipv4(pkt)) { l3_hdr->ip_csum = recalc_csum16(l3_hdr->ip_csum, l3_hdr->ip_tot_len, htons(ip_len)); diff --git a/lib/dp-packet.h b/lib/dp-packet.h index fdc0882ab..bf09e2646 100644 --- a/lib/dp-packet.h +++ b/lib/dp-packet.h @@ -981,14 +981,14 @@ dp_packet_ol_tcp_seg(const struct dp_packet *a) /* Returns 'true' if packet 'a' is marked for IPv4 checksum offloading. */ static inline bool -dp_packet_ol_is_ipv4(const struct dp_packet *a) +dp_packet_ol_tx_ipv4(const struct dp_packet *a) { return !!(*dp_packet_ol_flags_ptr(a) & DP_PACKET_OL_TX_IPV4); } /* Returns 'true' if packet 'a' is marked for TCP checksum offloading. */ static inline bool -dp_packet_ol_l4_is_tcp(const struct dp_packet *a) +dp_packet_ol_tx_tcp_csum(const struct dp_packet *a) { return (*dp_packet_ol_flags_ptr(a) & DP_PACKET_OL_TX_L4_MASK) == DP_PACKET_OL_TX_TCP_CSUM; @@ -996,7 +996,7 @@ dp_packet_ol_l4_is_tcp(const struct dp_packet *a) /* Returns 'true' if packet 'a' is marked for UDP checksum offloading. */ static inline bool -dp_packet_ol_l4_is_udp(struct dp_packet *a) +dp_packet_ol_tx_udp_csum(struct dp_packet *a) { return (*dp_packet_ol_flags_ptr(a) & DP_PACKET_OL_TX_L4_MASK) == DP_PACKET_OL_TX_UDP_CSUM; @@ -1004,7 +1004,7 @@ dp_packet_ol_l4_is_udp(struct dp_packet *a) /* Returns 'true' if packet 'a' is marked for SCTP checksum offloading. */ static inline bool -dp_packet_ol_l4_is_sctp(struct dp_packet *a) +dp_packet_ol_tx_sctp_csum(struct dp_packet *a) { return (*dp_packet_ol_flags_ptr(a) & DP_PACKET_OL_TX_L4_MASK) == DP_PACKET_OL_TX_SCTP_CSUM; @@ -1027,7 +1027,7 @@ dp_packet_ol_set_tx_ipv6(struct dp_packet *a) /* Mark packet 'a' for TCP checksum offloading. It implies that either * the packet 'a' is marked for IPv4 or IPv6 checksum offloading. */ static inline void -dp_packet_ol_set_csum_tcp(struct dp_packet *a) +dp_packet_ol_set_tx_tcp_csum(struct dp_packet *a) { *dp_packet_ol_flags_ptr(a) |= DP_PACKET_OL_TX_TCP_CSUM; } @@ -1035,7 +1035,7 @@ dp_packet_ol_set_csum_tcp(struct dp_packet *a) /* Mark packet 'a' for UDP checksum offloading. It implies that either * the packet 'a' is marked for IPv4 or IPv6 checksum offloading. */ static inline void -dp_packet_ol_set_csum_udp(struct dp_packet *a) +dp_packet_ol_set_tx_udp_csum(struct dp_packet *a) { *dp_packet_ol_flags_ptr(a) |= DP_PACKET_OL_TX_UDP_CSUM; } @@ -1043,7 +1043,7 @@ dp_packet_ol_set_csum_udp(struct dp_packet *a) /* Mark packet 'a' for SCTP checksum offloading. It implies that either * the packet 'a' is marked for IPv4 or IPv6 checksum offloading. */ static inline void -dp_packet_ol_set_csum_sctp(struct dp_packet *a) +dp_packet_ol_set_tx_sctp_csum(struct dp_packet *a) { *dp_packet_ol_flags_ptr(a) |= DP_PACKET_OL_TX_SCTP_CSUM; } diff --git a/lib/ipf.c b/lib/ipf.c index df9dd01dd..0e875f509 100644 --- a/lib/ipf.c +++ b/lib/ipf.c @@ -433,7 +433,7 @@ ipf_reassemble_v4_frags(struct ipf_list *ipf_list) len += rest_len; l3 = dp_packet_l3(pkt); ovs_be16 new_ip_frag_off = l3->ip_frag_off & ~htons(IP_MORE_FRAGMENTS); - if (!dp_packet_ol_is_ipv4(pkt)) { + if (!dp_packet_ol_tx_ipv4(pkt)) { l3->ip_csum = recalc_csum16(l3->ip_csum, l3->ip_frag_off, new_ip_frag_off); l3->ip_csum = recalc_csum16(l3->ip_csum, l3->ip_tot_len, htons(len)); @@ -609,7 +609,7 @@ ipf_is_valid_v4_frag(struct ipf *ipf, struct dp_packet *pkt) } if (OVS_UNLIKELY(!dp_packet_ip_checksum_valid(pkt) - && !dp_packet_ol_is_ipv4(pkt) + && !dp_packet_ol_tx_ipv4(pkt) && csum(l3, ip_hdr_len) != 0)) { COVERAGE_INC(ipf_l3csum_err); goto invalid_pkt; @@ -1185,7 +1185,7 @@ ipf_post_execute_reass_pkts(struct ipf *ipf, } else { struct ip_header *l3_frag = dp_packet_l3(frag_i->pkt); struct ip_header *l3_reass = dp_packet_l3(pkt); - if (!dp_packet_ol_is_ipv4(frag_i->pkt)) { + if (!dp_packet_ol_tx_ipv4(frag_i->pkt)) { ovs_be32 reass_ip = get_16aligned_be32(&l3_reass->ip_src); ovs_be32 frag_ip = diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c index 47765032c..6c230d938 100644 --- a/lib/netdev-linux.c +++ b/lib/netdev-linux.c @@ -6654,11 +6654,11 @@ netdev_linux_parse_vnet_hdr(struct dp_packet *p) if (vnet->flags == VIRTIO_NET_HDR_F_NEEDS_CSUM) { if (l4proto == IPPROTO_TCP) { - dp_packet_ol_set_csum_tcp(p); + dp_packet_ol_set_tx_tcp_csum(p); } else if (l4proto == IPPROTO_UDP) { - dp_packet_ol_set_csum_udp(p); + dp_packet_ol_set_tx_udp_csum(p); } else if (l4proto == IPPROTO_SCTP) { - dp_packet_ol_set_csum_sctp(p); + dp_packet_ol_set_tx_sctp_csum(p); } } @@ -6688,7 +6688,7 @@ netdev_linux_prepend_vnet_hdr(struct dp_packet *p, int mtu) vnet->hdr_len = (OVS_FORCE __virtio16)hdr_len; vnet->gso_size = (OVS_FORCE __virtio16)(mtu - hdr_len); - if (dp_packet_ol_is_ipv4(p)) { + if (dp_packet_ol_tx_ipv4(p)) { vnet->gso_type = VIRTIO_NET_HDR_GSO_TCPV4; } else { vnet->gso_type = VIRTIO_NET_HDR_GSO_TCPV6; @@ -6703,13 +6703,13 @@ netdev_linux_prepend_vnet_hdr(struct dp_packet *p, int mtu) vnet->csum_start = (OVS_FORCE __virtio16)((char *) dp_packet_l4(p) - (char *) dp_packet_eth(p)); - if (dp_packet_ol_l4_is_tcp(p)) { + if (dp_packet_ol_tx_tcp_csum(p)) { vnet->csum_offset = (OVS_FORCE __virtio16) __builtin_offsetof( struct tcp_header, tcp_csum); - } else if (dp_packet_ol_l4_is_udp(p)) { + } else if (dp_packet_ol_tx_udp_csum(p)) { vnet->csum_offset = (OVS_FORCE __virtio16) __builtin_offsetof( struct udp_header, udp_csum); - } else if (dp_packet_ol_l4_is_sctp(p)) { + } else if (dp_packet_ol_tx_sctp_csum(p)) { vnet->csum_offset = (OVS_FORCE __virtio16) __builtin_offsetof( struct sctp_header, sctp_csum); } else { diff --git a/lib/netdev.c b/lib/netdev.c index fb535ed7c..5c3751fe6 100644 --- a/lib/netdev.c +++ b/lib/netdev.c @@ -792,8 +792,6 @@ static bool netdev_send_prepare_packet(const uint64_t netdev_flags, struct dp_packet *packet, char **errormsg) { - uint64_t l4_mask; - if (dp_packet_ol_tcp_seg(packet) && !(netdev_flags & NETDEV_OFFLOAD_TX_TCP_TSO)) { /* Fall back to GSO in software. */ @@ -801,29 +799,29 @@ netdev_send_prepare_packet(const uint64_t netdev_flags, return false; } - l4_mask = dp_packet_ol_l4_mask(packet); - if (l4_mask) { - if (dp_packet_ol_l4_is_tcp(packet)) { + if (dp_packet_ol_l4_mask(packet)) { + if (dp_packet_ol_tx_tcp_csum(packet)) { if (!(netdev_flags & NETDEV_OFFLOAD_TX_TCP_CSUM)) { /* Fall back to TCP csum in software. */ VLOG_ERR_BUF(errormsg, "No TCP checksum support"); return false; } - } else if (dp_packet_ol_l4_is_udp(packet)) { + } else if (dp_packet_ol_tx_udp_csum(packet)) { if (!(netdev_flags & NETDEV_OFFLOAD_TX_UDP_CSUM)) { /* Fall back to UDP csum in software. */ VLOG_ERR_BUF(errormsg, "No UDP checksum support"); return false; } - } else if (dp_packet_ol_l4_is_sctp(packet)) { + } else if (dp_packet_ol_tx_sctp_csum(packet)) { if (!(netdev_flags & NETDEV_OFFLOAD_TX_SCTP_CSUM)) { /* Fall back to SCTP csum in software. */ VLOG_ERR_BUF(errormsg, "No SCTP checksum support"); return false; } } else { - VLOG_ERR_BUF(errormsg, "No L4 checksum support: mask: %"PRIu64, - l4_mask); + uint64_t ol_flags = *dp_packet_ol_flags_ptr(packet); + VLOG_ERR_BUF(errormsg, "No L4 checksum support: " + "offload mask: %"PRIu64, ol_flags); return false; } } From patchwork Tue Jun 14 22:13:14 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mike Pattrick X-Patchwork-Id: 1643440 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=BZSphxj+; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=140.211.166.137; helo=smtp4.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Received: from smtp4.osuosl.org (smtp4.osuosl.org [140.211.166.137]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4LN2lV6Qxtz9vGJ for ; Wed, 15 Jun 2022 08:13:58 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id C89F5418A6; Tue, 14 Jun 2022 22:13:53 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp4.osuosl.org ([127.0.0.1]) by localhost (smtp4.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id TT2GS2wa8vsa; Tue, 14 Jun 2022 22:13:52 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp4.osuosl.org (Postfix) with ESMTPS id EE3C5418A7; Tue, 14 Jun 2022 22:13:50 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 739DAC008A; Tue, 14 Jun 2022 22:13:48 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp3.osuosl.org (smtp3.osuosl.org [140.211.166.136]) by lists.linuxfoundation.org (Postfix) with ESMTP id 8828EC002D for ; Tue, 14 Jun 2022 22:13:44 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp3.osuosl.org (Postfix) with ESMTP id 6345C60B54 for ; Tue, 14 Jun 2022 22:13:44 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Authentication-Results: smtp3.osuosl.org (amavisd-new); dkim=pass (1024-bit key) header.d=redhat.com Received: from smtp3.osuosl.org ([127.0.0.1]) by localhost (smtp3.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 02efP1MSi8sx for ; Tue, 14 Jun 2022 22:13:43 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.8.0 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by smtp3.osuosl.org (Postfix) with ESMTPS id 7270560AE9 for ; Tue, 14 Jun 2022 22:13:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1655244822; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=AMkNKBzFlyZaJZZvn8MIAGOpQGHKT6gOQGV2cy5863E=; b=BZSphxj+3ZASMPCUkE+/RZH1hKwOy1f46ckwf4ggNO6AT82mlIO9x0ku2CIzPKNVAgtNPd qRNUr6jlCKmUCJOqV5V3O9Cte8Z3lFCj2Sl4GPNz5rVoPymR7/hD236M2KsxmyfAI38xsK JdbmY72oD7lyWc6r8Akw/m1wEetgrN4= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-641-shwrUEw2MwOHrBHDSL1-Lg-1; Tue, 14 Jun 2022 18:13:39 -0400 X-MC-Unique: shwrUEw2MwOHrBHDSL1-Lg-1 Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.rdu2.redhat.com [10.11.54.10]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 15E94804196; Tue, 14 Jun 2022 22:13:39 +0000 (UTC) Received: from mpattric.remote.csb (unknown [10.22.18.26]) by smtp.corp.redhat.com (Postfix) with ESMTP id B5667492C3B; Tue, 14 Jun 2022 22:13:38 +0000 (UTC) From: Mike Pattrick To: dev@openvswitch.org Date: Tue, 14 Jun 2022 18:13:14 -0400 Message-Id: <20220614221317.1028795-7-mkp@redhat.com> In-Reply-To: <20220614221317.1028795-6-mkp@redhat.com> References: <20220614221317.1028795-1-mkp@redhat.com> <20220614221317.1028795-2-mkp@redhat.com> <20220614221317.1028795-3-mkp@redhat.com> <20220614221317.1028795-4-mkp@redhat.com> <20220614221317.1028795-5-mkp@redhat.com> <20220614221317.1028795-6-mkp@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.85 on 10.11.54.10 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=mkp@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Cc: Flavio Leitner , maxime.coquelin@redhat.com, david.marchand@redhat.com Subject: [ovs-dev] [PATCH 07/10] dp-packet: Add _ol_ to functions using OL flags. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Flavio Leitner This helps to identify when it is about the flags or the packet itself. Signed-off-by: Flavio Leitner Co-authored-by: Mike Pattrick Signed-off-by: Mike Pattrick Acked-by: Maxime Coquelin Reviewed-by: David Marchand --- lib/conntrack.c | 8 ++++---- lib/dp-packet.c | 2 +- lib/dp-packet.h | 10 +++++----- lib/ipf.c | 4 ++-- lib/netdev-native-tnl.c | 4 ++-- lib/netdev-offload-dpdk.c | 2 +- lib/netdev.c | 2 +- lib/packets.c | 2 +- 8 files changed, 17 insertions(+), 17 deletions(-) diff --git a/lib/conntrack.c b/lib/conntrack.c index 52592301a..290560ab6 100644 --- a/lib/conntrack.c +++ b/lib/conntrack.c @@ -2089,12 +2089,12 @@ conn_key_extract(struct conntrack *ct, struct dp_packet *pkt, ovs_be16 dl_type, ctx->key.dl_type = dl_type; if (ctx->key.dl_type == htons(ETH_TYPE_IP)) { - bool hwol_bad_l3_csum = dp_packet_ip_checksum_bad(pkt); + bool hwol_bad_l3_csum = dp_packet_ol_ip_checksum_bad(pkt); if (hwol_bad_l3_csum) { ok = false; COVERAGE_INC(conntrack_l3csum_err); } else { - bool hwol_good_l3_csum = dp_packet_ip_checksum_valid(pkt) + bool hwol_good_l3_csum = dp_packet_ol_ip_checksum_good(pkt) || dp_packet_ol_tx_ipv4(pkt); /* Validate the checksum only when hwol is not supported. */ ok = extract_l3_ipv4(&ctx->key, l3, dp_packet_l3_size(pkt), NULL, @@ -2107,9 +2107,9 @@ conn_key_extract(struct conntrack *ct, struct dp_packet *pkt, ovs_be16 dl_type, } if (ok) { - bool hwol_bad_l4_csum = dp_packet_l4_checksum_bad(pkt); + bool hwol_bad_l4_csum = dp_packet_ol_l4_checksum_bad(pkt); if (!hwol_bad_l4_csum) { - bool hwol_good_l4_csum = dp_packet_l4_checksum_valid(pkt) + bool hwol_good_l4_csum = dp_packet_ol_l4_checksum_good(pkt) || dp_packet_ol_tx_l4_checksum(pkt); /* Validate the checksum only when hwol is not supported. */ if (extract_l4(&ctx->key, l4, dp_packet_l4_size(pkt), diff --git a/lib/dp-packet.c b/lib/dp-packet.c index d390abbc3..9728565dc 100644 --- a/lib/dp-packet.c +++ b/lib/dp-packet.c @@ -33,7 +33,7 @@ dp_packet_init__(struct dp_packet *p, size_t allocated, dp_packet_reset_offsets(p); pkt_metadata_init(&p->md, 0); dp_packet_reset_cutlen(p); - dp_packet_reset_offload(p); + dp_packet_ol_reset(p); /* Initialize implementation-specific fields of dp_packet. */ dp_packet_init_specific(p); /* By default assume the packet type to be Ethernet. */ diff --git a/lib/dp-packet.h b/lib/dp-packet.h index bf09e2646..633b4ef38 100644 --- a/lib/dp-packet.h +++ b/lib/dp-packet.h @@ -935,7 +935,7 @@ dp_packet_rss_valid(const struct dp_packet *p) } static inline void -dp_packet_reset_offload(struct dp_packet *p) +dp_packet_ol_reset(struct dp_packet *p) { *dp_packet_ol_flags_ptr(p) &= ~DP_PACKET_OL_SUPPORTED_MASK; } @@ -1058,28 +1058,28 @@ dp_packet_ol_set_tcp_seg(struct dp_packet *a) } static inline bool -dp_packet_ip_checksum_valid(const struct dp_packet *p) +dp_packet_ol_ip_checksum_good(const struct dp_packet *p) { return (*dp_packet_ol_flags_ptr(p) & DP_PACKET_OL_RX_IP_CSUM_MASK) == DP_PACKET_OL_RX_IP_CSUM_GOOD; } static inline bool -dp_packet_ip_checksum_bad(const struct dp_packet *p) +dp_packet_ol_ip_checksum_bad(const struct dp_packet *p) { return (*dp_packet_ol_flags_ptr(p) & DP_PACKET_OL_RX_IP_CSUM_MASK) == DP_PACKET_OL_RX_IP_CSUM_BAD; } static inline bool -dp_packet_l4_checksum_valid(const struct dp_packet *p) +dp_packet_ol_l4_checksum_good(const struct dp_packet *p) { return (*dp_packet_ol_flags_ptr(p) & DP_PACKET_OL_RX_L4_CSUM_MASK) == DP_PACKET_OL_RX_L4_CSUM_GOOD; } static inline bool -dp_packet_l4_checksum_bad(const struct dp_packet *p) +dp_packet_ol_l4_checksum_bad(const struct dp_packet *p) { return (*dp_packet_ol_flags_ptr(p) & DP_PACKET_OL_RX_L4_CSUM_MASK) == DP_PACKET_OL_RX_L4_CSUM_BAD; diff --git a/lib/ipf.c b/lib/ipf.c index 0e875f509..4f635de11 100644 --- a/lib/ipf.c +++ b/lib/ipf.c @@ -574,7 +574,7 @@ ipf_list_state_transition(struct ipf *ipf, struct ipf_list *ipf_list, static bool ipf_is_valid_v4_frag(struct ipf *ipf, struct dp_packet *pkt) { - if (OVS_UNLIKELY(dp_packet_ip_checksum_bad(pkt))) { + if (OVS_UNLIKELY(dp_packet_ol_ip_checksum_bad(pkt))) { COVERAGE_INC(ipf_l3csum_err); goto invalid_pkt; } @@ -608,7 +608,7 @@ ipf_is_valid_v4_frag(struct ipf *ipf, struct dp_packet *pkt) goto invalid_pkt; } - if (OVS_UNLIKELY(!dp_packet_ip_checksum_valid(pkt) + if (OVS_UNLIKELY(!dp_packet_ol_ip_checksum_good(pkt) && !dp_packet_ol_tx_ipv4(pkt) && csum(l3, ip_hdr_len) != 0)) { COVERAGE_INC(ipf_l3csum_err); diff --git a/lib/netdev-native-tnl.c b/lib/netdev-native-tnl.c index b89dfdd52..8a0b34fc4 100644 --- a/lib/netdev-native-tnl.c +++ b/lib/netdev-native-tnl.c @@ -88,7 +88,7 @@ netdev_tnl_ip_extract_tnl_md(struct dp_packet *packet, struct flow_tnl *tnl, ovs_be32 ip_src, ip_dst; - if (OVS_UNLIKELY(!dp_packet_ip_checksum_valid(packet))) { + if (OVS_UNLIKELY(!dp_packet_ol_ip_checksum_good(packet))) { if (csum(ip, IP_IHL(ip->ip_ihl_ver) * 4)) { VLOG_WARN_RL(&err_rl, "ip packet has invalid checksum"); return NULL; @@ -190,7 +190,7 @@ udp_extract_tnl_md(struct dp_packet *packet, struct flow_tnl *tnl, } if (udp->udp_csum) { - if (OVS_UNLIKELY(!dp_packet_l4_checksum_valid(packet))) { + if (OVS_UNLIKELY(!dp_packet_ol_l4_checksum_good(packet))) { uint32_t csum; if (netdev_tnl_is_header_ipv6(dp_packet_data(packet))) { csum = packet_csum_pseudoheader6(dp_packet_l3(packet)); diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 12d299603..2b83d6c44 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -2688,7 +2688,7 @@ netdev_offload_dpdk_hw_miss_packet_recover(struct netdev *netdev, * processing in SW. */ md->in_port.odp_port = vport_odp; - dp_packet_reset_offload(packet); + dp_packet_ol_reset(packet); close_vport_netdev: netdev_close(vport_netdev); diff --git a/lib/netdev.c b/lib/netdev.c index 5c3751fe6..1219ddbb9 100644 --- a/lib/netdev.c +++ b/lib/netdev.c @@ -913,7 +913,7 @@ netdev_pop_header(struct netdev *netdev, struct dp_packet_batch *batch) /* Reset the offload flags if present, to avoid wrong * interpretation in the further packet processing when * recirculated.*/ - dp_packet_reset_offload(packet); + dp_packet_ol_reset(packet); pkt_metadata_init_conn(&packet->md); dp_packet_batch_refill(batch, packet, i); } diff --git a/lib/packets.c b/lib/packets.c index a1698d65b..d564c9dbe 100644 --- a/lib/packets.c +++ b/lib/packets.c @@ -473,7 +473,7 @@ pop_mpls(struct dp_packet *packet, ovs_be16 ethtype) /* Invalidate offload flags as they are not valid after * decapsulation of MPLS header. */ - dp_packet_reset_offload(packet); + dp_packet_ol_reset(packet); /* packet_type must be reset for the MPLS packets with no l2 header */ if (!len) { From patchwork Tue Jun 14 22:13:15 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mike Pattrick X-Patchwork-Id: 1643441 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=LhjZAOkC; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=2605:bc80:3010::137; helo=smtp4.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Received: from smtp4.osuosl.org (smtp4.osuosl.org [IPv6:2605:bc80:3010::137]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4LN2lY5vfTz9vGL for ; Wed, 15 Jun 2022 08:14:01 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id 6CBF441900; Tue, 14 Jun 2022 22:13:56 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp4.osuosl.org ([127.0.0.1]) by localhost (smtp4.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 2f18T7q3FtyO; Tue, 14 Jun 2022 22:13:54 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [IPv6:2605:bc80:3010:104::8cd3:938]) by smtp4.osuosl.org (Postfix) with ESMTPS id 7F764418B7; Tue, 14 Jun 2022 22:13:52 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 74EF1C0085; Tue, 14 Jun 2022 22:13:50 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp1.osuosl.org (smtp1.osuosl.org [140.211.166.138]) by lists.linuxfoundation.org (Postfix) with ESMTP id 4DAA2C0085 for ; Tue, 14 Jun 2022 22:13:45 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp1.osuosl.org (Postfix) with ESMTP id 3D0F1813E4 for ; Tue, 14 Jun 2022 22:13:45 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Authentication-Results: smtp1.osuosl.org (amavisd-new); dkim=pass (1024-bit key) header.d=redhat.com Received: from smtp1.osuosl.org ([127.0.0.1]) by localhost (smtp1.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id TAX48hFVIMp7 for ; Tue, 14 Jun 2022 22:13:44 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.8.0 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by smtp1.osuosl.org (Postfix) with ESMTPS id 1F505813A8 for ; Tue, 14 Jun 2022 22:13:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1655244822; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=C8TwY4KGNZ9PNrMcJ496C7/Ck7CL7yrvGS27N4EG1qE=; b=LhjZAOkC99X9p/Cx8I5eM/t2eRaNU5V9ET2iL6DwPVNuWBDqoaikouCrU1sJwbMEgsAUbB wFK7ced095nd1D8NnSPml8qk6pvNt85aK4E0bIXdk9aYOZ7Oilc46b3vz5nZo3OV8Prxjb ejLo+fV34FvRXc+PE6GLOp7CI+N0cEo= Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-404-zxbQh8OmO_Gsp_P-gxehWQ-1; Tue, 14 Jun 2022 18:13:39 -0400 X-MC-Unique: zxbQh8OmO_Gsp_P-gxehWQ-1 Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.rdu2.redhat.com [10.11.54.10]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 88DE3299E765; Tue, 14 Jun 2022 22:13:39 +0000 (UTC) Received: from mpattric.remote.csb (unknown [10.22.18.26]) by smtp.corp.redhat.com (Postfix) with ESMTP id 2A35D492C3B; Tue, 14 Jun 2022 22:13:39 +0000 (UTC) From: Mike Pattrick To: dev@openvswitch.org Date: Tue, 14 Jun 2022 18:13:15 -0400 Message-Id: <20220614221317.1028795-8-mkp@redhat.com> In-Reply-To: <20220614221317.1028795-7-mkp@redhat.com> References: <20220614221317.1028795-1-mkp@redhat.com> <20220614221317.1028795-2-mkp@redhat.com> <20220614221317.1028795-3-mkp@redhat.com> <20220614221317.1028795-4-mkp@redhat.com> <20220614221317.1028795-5-mkp@redhat.com> <20220614221317.1028795-6-mkp@redhat.com> <20220614221317.1028795-7-mkp@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.85 on 10.11.54.10 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=mkp@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Cc: Flavio Leitner , maxime.coquelin@redhat.com, david.marchand@redhat.com Subject: [ovs-dev] [PATCH 08/10] Document netdev offload. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Flavio Leitner Document the implementation of netdev hardware offloading in userspace datapath. Signed-off-by: Flavio Leitner Signed-off-by: Mike Pattrick Co-authored-by: Mike Pattrick --- Documentation/automake.mk | 1 + Documentation/topics/index.rst | 1 + Documentation/topics/nic-offloads.rst | 95 +++++++++++++++++++++++++++ 3 files changed, 97 insertions(+) create mode 100644 Documentation/topics/nic-offloads.rst diff --git a/Documentation/automake.mk b/Documentation/automake.mk index 6c2c57739..a5f6d562b 100644 --- a/Documentation/automake.mk +++ b/Documentation/automake.mk @@ -50,6 +50,7 @@ DOC_SOURCE = \ Documentation/topics/integration.rst \ Documentation/topics/language-bindings.rst \ Documentation/topics/networking-namespaces.rst \ + Documentation/topics/nic-offloads.rst \ Documentation/topics/openflow.rst \ Documentation/topics/ovs-extensions.rst \ Documentation/topics/ovsdb-relay.rst \ diff --git a/Documentation/topics/index.rst b/Documentation/topics/index.rst index 90d4c66e6..c4c11f4f1 100644 --- a/Documentation/topics/index.rst +++ b/Documentation/topics/index.rst @@ -44,6 +44,7 @@ OVS openflow bonding networking-namespaces + nic-offloads ovsdb-relay ovsdb-replication dpdk/index diff --git a/Documentation/topics/nic-offloads.rst b/Documentation/topics/nic-offloads.rst new file mode 100644 index 000000000..5959c65ad --- /dev/null +++ b/Documentation/topics/nic-offloads.rst @@ -0,0 +1,95 @@ +.. + Licensed under the Apache License, Version 2.0 (the "License"); you may + not use this file except in compliance with the License. You may obtain + a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + License for the specific language governing permissions and limitations + under the License. + + Convention for heading levels in Open vSwitch documentation: + + ======= Heading 0 (reserved for the title in a document) + ------- Heading 1 + ~~~~~~~ Heading 2 + +++++++ Heading 3 + ''''''' Heading 4 + + Avoid deeper levels because they do not render well. + +============ +NIC Offloads +============ + +This document explains the internals of Open vSwitch support for NIC offloads. + +Design +------ + +The Open vSwitch should strive to forward packets as they arrive regardless +if the checksum is correct, for example. However, it cannot fix existing +problems. Therefore, when the packet has the checksum verified or it the +packet is known to be good, the checksum calculation can be offloaded to +the NIC, otherwise updates can be made as long as the previous situation +doesn't change. For example, a packet has corrupted IP checksum can be +accepted, a flow rule can change the IP destination address to another +address. In that case, OVS needs to partially recompute the checksum +instead of offloading or calculate all of it again which would fix the +existing issue. + +The drivers can set flags indicating if the checksum is good or bad. +The checksum is considered unverified if no flag is set. + +When a packet ingress the data path with good checksum, OVS should +enable checksum offload by default. This allows the data path to +postpone checksum updates until the packet egress the data path. + +When a packet egress the data path, the packet flags and the egress +port flags are verified to make sure all required NIC offload +features to send out the packet are available. If not, the data +path will fall back to equivalent software implementation. + + +Drivers +------- + +When the driver initiates, it should set the flags to tell the data path +which offload features are supported. For example, if the driver supports +IP checksum offloading, then netdev->ol_flags should set the flag +NETDEV_OFFLOAD_TX_IPV4_CSUM. + + +Rules +----- +1) OVS should strive to forward all packets regardless of checksum. + +2) OVS must not correct a bad packet/checksum. + +3) Packet with flag DP_PACKET_OL_RX_IP_CSUM_GOOD means that the + IP checksum is present in the packet and it is good. + +4) Packet with flag DP_PACKET_OL_RX_IP_CSUM_BAD means that the + IP checksum is present in the packet and it is BAD. Extra care + should be taken to not fix the packet during data path processing. + +5) The ingress packet parser can only set DP_PACKET_OL_TX_IP_CSUM + if the packet has DP_PACKET_OL_RX_L4_CKSUM_GOOD to not violate + rule #2. + +6) Packet with flag DP_PACKET_OL_TX_IPV4 is a IPv4 packet. + +7) Packet with flag DP_PACKET_OL_TX_IPV6 is a IPv6 packet. + +8) Packet with flag DP_PACKET_OL_TX_IP_CSUM tells the data path + to skip updating the IP checksum if the packet is modified. The + IP checksum will be calculated by the egress port if that + supports IP checksum offload, otherwise the IP checksum will + be done in software before handing over the packet to the port. + +9) When there are modifications to the packet that requires checksum + update, the data path needs to remove DP_PACKET_OL_RX_IP_CSUM_GOOD + flag, otherwise the checksum is assumed to be good in the packet. From patchwork Tue Jun 14 22:13:16 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mike Pattrick X-Patchwork-Id: 1643442 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=T2HK+mE6; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=2605:bc80:3010::137; helo=smtp4.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Received: from smtp4.osuosl.org (smtp4.osuosl.org [IPv6:2605:bc80:3010::137]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4LN2lc5rfZz9vGJ for ; Wed, 15 Jun 2022 08:14:04 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id B8C294194D; Tue, 14 Jun 2022 22:14:01 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp4.osuosl.org ([127.0.0.1]) by localhost (smtp4.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Qr0GckxG9G3a; Tue, 14 Jun 2022 22:13:57 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [IPv6:2605:bc80:3010:104::8cd3:938]) by smtp4.osuosl.org (Postfix) with ESMTPS id 24048418EC; Tue, 14 Jun 2022 22:13:56 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id B11D5C0083; Tue, 14 Jun 2022 22:13:53 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp2.osuosl.org (smtp2.osuosl.org [IPv6:2605:bc80:3010::133]) by lists.linuxfoundation.org (Postfix) with ESMTP id E1327C0085 for ; Tue, 14 Jun 2022 22:13:45 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp2.osuosl.org (Postfix) with ESMTP id B722C40B83 for ; Tue, 14 Jun 2022 22:13:45 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Authentication-Results: smtp2.osuosl.org (amavisd-new); dkim=fail (1024-bit key) reason="fail (body has been altered)" header.d=redhat.com Received: from smtp2.osuosl.org ([127.0.0.1]) by localhost (smtp2.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id E3fyNxOAEX1B for ; Tue, 14 Jun 2022 22:13:44 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.8.0 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by smtp2.osuosl.org (Postfix) with ESMTPS id ACCF8403AC for ; Tue, 14 Jun 2022 22:13:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1655244823; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=KNOsWQbBkah2NrTcHC6NUIF05DpdT98IWwBLX7gXlgk=; b=T2HK+mE6pzgmMY4Bbkp0+/ZFirt5NqERPLNGbse3tQq2IZ4SgRxN7ZeSbBv905y3mrOq2i EnwFY+2g3aQJ/DHcOJi04nqwN21hHpwK7tea8qvYkz+GqOcC7C9b88POtV0E7QuwEU9/IP q/cTVR0hqkSxBP65DvcjlcVqQ80DtjA= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-442-FXkBZRQ0O5W1EhIeRZIv1Q-1; Tue, 14 Jun 2022 18:13:40 -0400 X-MC-Unique: FXkBZRQ0O5W1EhIeRZIv1Q-1 Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.rdu2.redhat.com [10.11.54.10]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 09C7485A581; Tue, 14 Jun 2022 22:13:40 +0000 (UTC) Received: from mpattric.remote.csb (unknown [10.22.18.26]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9FA81492C3B; Tue, 14 Jun 2022 22:13:39 +0000 (UTC) From: Mike Pattrick To: dev@openvswitch.org Date: Tue, 14 Jun 2022 18:13:16 -0400 Message-Id: <20220614221317.1028795-9-mkp@redhat.com> In-Reply-To: <20220614221317.1028795-8-mkp@redhat.com> References: <20220614221317.1028795-1-mkp@redhat.com> <20220614221317.1028795-2-mkp@redhat.com> <20220614221317.1028795-3-mkp@redhat.com> <20220614221317.1028795-4-mkp@redhat.com> <20220614221317.1028795-5-mkp@redhat.com> <20220614221317.1028795-6-mkp@redhat.com> <20220614221317.1028795-7-mkp@redhat.com> <20220614221317.1028795-8-mkp@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.85 on 10.11.54.10 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=mkp@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Cc: Flavio Leitner , maxime.coquelin@redhat.com, david.marchand@redhat.com Subject: [ovs-dev] [PATCH 09/10] Show netdev offloading flags. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Flavio Leitner Add a new command to show the offloading features of each data path port. Signed-off-by: Flavio Leitner Signed-off-by: Mike Pattrick Co-authored-by: Mike Pattrick --- lib/dpif-netdev-unixctl.man | 5 ++++ lib/dpif-netdev.c | 58 +++++++++++++++++++++++++++++++++++++ lib/netdev-provider.h | 3 ++ lib/netdev.c | 35 ++++++++++++++++++++++ tests/dpif-netdev.at | 21 ++++++++++++++ 5 files changed, 122 insertions(+) diff --git a/lib/dpif-netdev-unixctl.man b/lib/dpif-netdev-unixctl.man index 8cd847416..a1bdb2f9a 100644 --- a/lib/dpif-netdev-unixctl.man +++ b/lib/dpif-netdev-unixctl.man @@ -262,3 +262,8 @@ PMDs in the case where no value is specified. By default "scalar" is used. \fIstudy_cnt\fR defaults to 128 and indicates the number of packets that the "study" miniflow implementation must parse before choosing an optimal implementation. +.IP "\fBdpif-netdev/offload-show\fR [\fIdp\fR] [\fInetdev\fR]" +Prints the hardware offloading features enabled in netdev \fInetdev\fR +attached to datapath \fIdp\fR. The datapath \fIdp\fR parameter can be +omitted if there is only one. All netdev ports are printed if the +parameter \fInetdev\fR is omitted. diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index ff57b3961..b3839e948 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -1568,6 +1568,61 @@ dpif_netdev_bond_show(struct unixctl_conn *conn, int argc, ds_destroy(&reply); } +static void +dpif_netdev_offload_show(struct unixctl_conn *conn, int argc, + const char *argv[], void *aux OVS_UNUSED) +{ + struct ds reply = DS_EMPTY_INITIALIZER; + const char *netdev_name = NULL; + struct dp_netdev *dp = NULL; + struct dp_netdev_port *port; + + ovs_mutex_lock(&dp_netdev_mutex); + if (argc == 3) { + dp = shash_find_data(&dp_netdevs, argv[1]); + netdev_name = argv[2]; + } else if (argc == 2) { + dp = shash_find_data(&dp_netdevs, argv[1]); + if (!dp && shash_count(&dp_netdevs) == 1) { + /* There's only one datapath. */ + dp = shash_first(&dp_netdevs)->data; + netdev_name = argv[1]; + } + } else if (shash_count(&dp_netdevs) == 1) { + /* There's only one datapath. */ + dp = shash_first(&dp_netdevs)->data; + } + + if (!dp) { + ovs_mutex_unlock(&dp_netdev_mutex); + unixctl_command_reply_error(conn, + "please specify an existing datapath"); + return; + } + + ovs_rwlock_rdlock(&dp->port_rwlock); + HMAP_FOR_EACH (port, node, &dp->ports) { + if (netdev_name) { + /* find the port and dump the info */ + if (!strcmp(netdev_get_name(port->netdev), netdev_name)) { + ds_put_format(&reply, "%s: ", netdev_get_name(port->netdev)); + netdev_ol_flags_to_string(&reply, port->netdev); + ds_put_format(&reply, "\n"); + break; + } + } else { + ds_put_format(&reply, "%s: ", netdev_get_name(port->netdev)); + netdev_ol_flags_to_string(&reply, port->netdev); + ds_put_format(&reply, "\n"); + } + } + + ovs_rwlock_unlock(&dp->port_rwlock); + ovs_mutex_unlock(&dp_netdev_mutex); + unixctl_command_reply(conn, ds_cstr(&reply)); + ds_destroy(&reply); +} + static int dpif_netdev_init(void) @@ -1624,6 +1679,9 @@ dpif_netdev_init(void) unixctl_command_register("dpif-netdev/miniflow-parser-get", "", 0, 0, dpif_miniflow_extract_impl_get, NULL); + unixctl_command_register("dpif-netdev/offload-show", "[dp] [netdev]", + 0, 2, dpif_netdev_offload_show, + NULL); return 0; } diff --git a/lib/netdev-provider.h b/lib/netdev-provider.h index 0a8538615..5489ebbb8 100644 --- a/lib/netdev-provider.h +++ b/lib/netdev-provider.h @@ -37,6 +37,7 @@ extern "C" { struct netdev_tnl_build_header_params; #define NETDEV_NUMA_UNSPEC OVS_NUMA_UNSPEC +/* Keep this enum updated with translation to string below. */ enum netdev_ol_flags { NETDEV_OFFLOAD_TX_IPV4_CSUM = 1 << 0, NETDEV_OFFLOAD_TX_TCP_CSUM = 1 << 1, @@ -45,6 +46,8 @@ enum netdev_ol_flags { NETDEV_OFFLOAD_TX_TCP_TSO = 1 << 4, }; +void netdev_ol_flags_to_string(struct ds *, const struct netdev *); + /* A network device (e.g. an Ethernet device). * * Network device implementations may read these members but should not modify diff --git a/lib/netdev.c b/lib/netdev.c index 1219ddbb9..5eecacd9e 100644 --- a/lib/netdev.c +++ b/lib/netdev.c @@ -2298,3 +2298,38 @@ netdev_free_custom_stats_counters(struct netdev_custom_stats *custom_stats) } } } + +void +netdev_ol_flags_to_string(struct ds *string, const struct netdev *netdev) +{ + /* Sort by dependency, if any. */ + if (netdev->ol_flags & NETDEV_OFFLOAD_TX_IPV4_CSUM) { + ds_put_format(string, "ip_csum: on, "); + } else { + ds_put_format(string, "ip_csum: off, "); + } + + if (netdev->ol_flags & NETDEV_OFFLOAD_TX_TCP_CSUM) { + ds_put_format(string, "tcp_csum: on, "); + } else { + ds_put_format(string, "tcp_csum: off, "); + } + + if (netdev->ol_flags & NETDEV_OFFLOAD_TX_UDP_CSUM) { + ds_put_format(string, "udp_csum: on, "); + } else { + ds_put_format(string, "udp_csum: off, "); + } + + if (netdev->ol_flags & NETDEV_OFFLOAD_TX_SCTP_CSUM) { + ds_put_format(string, "sctp_csum: on, "); + } else { + ds_put_format(string, "sctp_csum: off, "); + } + + if (netdev->ol_flags & NETDEV_OFFLOAD_TX_TCP_TSO) { + ds_put_format(string, "tso: on"); + } else { + ds_put_format(string, "tso: off"); + } +} diff --git a/tests/dpif-netdev.at b/tests/dpif-netdev.at index a79ebdb61..416f15fe6 100644 --- a/tests/dpif-netdev.at +++ b/tests/dpif-netdev.at @@ -636,6 +636,27 @@ OVS_VSWITCHD_STOP(["/flow: in_port is not an exact match/d /failed to put/d"]) AT_CLEANUP +AT_SETUP([dpif-netdev - check dpif-netdev/offload-show]) +OVS_VSWITCHD_START( + [add-port br0 p1 \ + -- set interface p1 type=dummy options:pstream=punix:$OVS_RUNDIR/p0.sock \ + -- set bridge br0 datapath-type=dummy \ + other-config:datapath-id=1234 fail-mode=secure]) + +AT_CHECK([ovs-appctl dpif-netdev/offload-show | sort], [0], [dnl +br0: ip_csum: off, tcp_csum: off, udp_csum: off, sctp_csum: off, tso: off +ovs-dummy: ip_csum: off, tcp_csum: off, udp_csum: off, sctp_csum: off, tso: off +p1: ip_csum: off, tcp_csum: off, udp_csum: off, sctp_csum: off, tso: off +], []) +AT_CHECK([ovs-appctl dpif-netdev/offload-show p1], [0], [dnl +p1: ip_csum: off, tcp_csum: off, udp_csum: off, sctp_csum: off, tso: off +], []) +AT_CHECK([ovs-appctl dpif-netdev/offload-show ovs-dummy p1], [0], [dnl +p1: ip_csum: off, tcp_csum: off, udp_csum: off, sctp_csum: off, tso: off +], []) +OVS_VSWITCHD_STOP +AT_CLEANUP + # SEND_UDP_PKTS([p_name], [p_ofport]) # # Sends 128 packets to port 'p_name' with different UDP destination ports. From patchwork Tue Jun 14 22:13:17 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mike Pattrick X-Patchwork-Id: 1643445 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=S+IjV6dD; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=140.211.166.136; helo=smtp3.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Received: from smtp3.osuosl.org (smtp3.osuosl.org [140.211.166.136]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4LN2lt0hgZz9vGM for ; Wed, 15 Jun 2022 08:14:18 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by smtp3.osuosl.org (Postfix) with ESMTP id 531436103A; Tue, 14 Jun 2022 22:14:16 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp3.osuosl.org ([127.0.0.1]) by localhost (smtp3.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id q7BqSCA-P75C; Tue, 14 Jun 2022 22:14:13 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp3.osuosl.org (Postfix) with ESMTPS id 8727761028; Tue, 14 Jun 2022 22:14:01 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id ABE64C0097; Tue, 14 Jun 2022 22:13:57 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp1.osuosl.org (smtp1.osuosl.org [140.211.166.138]) by lists.linuxfoundation.org (Postfix) with ESMTP id C4288C007C for ; Tue, 14 Jun 2022 22:13:47 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp1.osuosl.org (Postfix) with ESMTP id 96B9B81342 for ; Tue, 14 Jun 2022 22:13:47 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Authentication-Results: smtp1.osuosl.org (amavisd-new); dkim=fail (1024-bit key) reason="fail (body has been altered)" header.d=redhat.com Received: from smtp1.osuosl.org ([127.0.0.1]) by localhost (smtp1.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id SbahApIP9yCK for ; Tue, 14 Jun 2022 22:13:45 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.8.0 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by smtp1.osuosl.org (Postfix) with ESMTPS id 4DF4B813F8 for ; Tue, 14 Jun 2022 22:13:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1655244824; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Coj8Qko80QgnoRxEXtIPpLXL/F3Er02YIMdEVCe6reA=; b=S+IjV6dDPesSv/ahx4kzJlpx0qISt8vmyvyg5OLtqj0VsxoJ+41cSCSd1fpZAMRpdNFLjd LE+zvwTibxFpd3+sQwQZE+xIMMBHX55abCqAgkDEqCATeV81Eh01GUPC1T8+DHYaNpnZkb vQHNbc1r4YS1rz0OiHlvZco7gJyW5PY= Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-112-NNN5-RFkNTKYf-VSpFeEDw-1; Tue, 14 Jun 2022 18:13:40 -0400 X-MC-Unique: NNN5-RFkNTKYf-VSpFeEDw-1 Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.rdu2.redhat.com [10.11.54.10]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 9F0B43C01D80; Tue, 14 Jun 2022 22:13:40 +0000 (UTC) Received: from mpattric.remote.csb (unknown [10.22.18.26]) by smtp.corp.redhat.com (Postfix) with ESMTP id 20FD5492C3B; Tue, 14 Jun 2022 22:13:40 +0000 (UTC) From: Mike Pattrick To: dev@openvswitch.org Date: Tue, 14 Jun 2022 18:13:17 -0400 Message-Id: <20220614221317.1028795-10-mkp@redhat.com> In-Reply-To: <20220614221317.1028795-9-mkp@redhat.com> References: <20220614221317.1028795-1-mkp@redhat.com> <20220614221317.1028795-2-mkp@redhat.com> <20220614221317.1028795-3-mkp@redhat.com> <20220614221317.1028795-4-mkp@redhat.com> <20220614221317.1028795-5-mkp@redhat.com> <20220614221317.1028795-6-mkp@redhat.com> <20220614221317.1028795-7-mkp@redhat.com> <20220614221317.1028795-8-mkp@redhat.com> <20220614221317.1028795-9-mkp@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.85 on 10.11.54.10 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=mkp@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Cc: Flavio Leitner , maxime.coquelin@redhat.com, david.marchand@redhat.com Subject: [ovs-dev] [PATCH 10/10] Enable IP checksum offloading by default. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Flavio Leitner The netdev receiving packets is supposed to provide the flags indicating if the IP csum 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 IP header since that is not yet supported. Calculate the IP csum when the packet is going to be sent over a device that doesn't support the feature. Linux devices don't support IP csum offload alone, so the support is not enabled. Signed-off-by: Flavio Leitner Signed-off-by: Mike Pattrick Co-authored-by: Mike Pattrick --- lib/conntrack.c | 12 ++--- lib/dp-packet.c | 12 +++++ lib/dp-packet.h | 70 +++++++++++++++++++++---- lib/dpif.h | 2 +- lib/flow.c | 15 ++++-- lib/ipf.c | 9 ++-- lib/netdev-dpdk.c | 79 +++++++++++++++-------------- lib/netdev-dummy.c | 23 +++++++++ lib/netdev-native-tnl.c | 19 +++++-- lib/netdev.c | 22 ++++++++ lib/odp-execute.c | 21 ++++++-- lib/packets.c | 34 ++++++++++--- ofproto/ofproto-dpif-upcall.c | 14 +++-- tests/automake.mk | 1 + tests/system-userspace-offload.at | 79 +++++++++++++++++++++++++++++ tests/system-userspace-testsuite.at | 1 + 16 files changed, 330 insertions(+), 83 deletions(-) create mode 100644 tests/system-userspace-offload.at diff --git a/lib/conntrack.c b/lib/conntrack.c index 290560ab6..8f56c38e2 100644 --- a/lib/conntrack.c +++ b/lib/conntrack.c @@ -2089,16 +2089,14 @@ conn_key_extract(struct conntrack *ct, struct dp_packet *pkt, ovs_be16 dl_type, ctx->key.dl_type = dl_type; if (ctx->key.dl_type == htons(ETH_TYPE_IP)) { - bool hwol_bad_l3_csum = dp_packet_ol_ip_checksum_bad(pkt); - if (hwol_bad_l3_csum) { + if (dp_packet_ol_ip_checksum_bad(pkt)) { ok = false; COVERAGE_INC(conntrack_l3csum_err); } else { - bool hwol_good_l3_csum = dp_packet_ol_ip_checksum_good(pkt) - || dp_packet_ol_tx_ipv4(pkt); /* Validate the checksum only when hwol is not supported. */ ok = extract_l3_ipv4(&ctx->key, l3, dp_packet_l3_size(pkt), NULL, - !hwol_good_l3_csum); + !dp_packet_ol_tx_ipv4(pkt) && + !dp_packet_ol_ip_checksum_good(pkt)); } } else if (ctx->key.dl_type == htons(ETH_TYPE_IPV6)) { ok = extract_l3_ipv6(&ctx->key, l3, dp_packet_l3_size(pkt), NULL); @@ -3402,7 +3400,9 @@ handle_ftp_ctl(struct conntrack *ct, const struct conn_lookup_ctx *ctx, } if (seq_skew) { ip_len = ntohs(l3_hdr->ip_tot_len) + seq_skew; - if (!dp_packet_ol_tx_ipv4(pkt)) { + if (dp_packet_ol_tx_ip_csum(pkt)) { + dp_packet_ol_reset_ip_csum_good(pkt); + } else { l3_hdr->ip_csum = recalc_csum16(l3_hdr->ip_csum, l3_hdr->ip_tot_len, htons(ip_len)); diff --git a/lib/dp-packet.c b/lib/dp-packet.c index 9728565dc..94d3b1277 100644 --- a/lib/dp-packet.c +++ b/lib/dp-packet.c @@ -21,6 +21,7 @@ #include "dp-packet.h" #include "netdev-afxdp.h" #include "netdev-dpdk.h" +#include "netdev-provider.h" #include "openvswitch/dynamic-string.h" #include "util.h" @@ -507,3 +508,14 @@ dp_packet_resize_l2(struct dp_packet *p, int increment) dp_packet_adjust_layer_offset(&p->l2_5_ofs, increment); return dp_packet_data(p); } + +/* Checks if the packet 'p' is compatible with netdev_ol_flags 'flags' + * and if not, update the packet with the software fall back. */ +void +dp_packet_ol_send_prepare(struct dp_packet *p, const uint64_t flags) { + if (!dp_packet_ol_ip_checksum_good(p) && dp_packet_ol_tx_ip_csum(p) + && !(flags & NETDEV_OFFLOAD_TX_IPV4_CSUM)) { + dp_packet_ip_set_header_csum(p); + dp_packet_ol_set_ip_csum_good(p); + } +} diff --git a/lib/dp-packet.h b/lib/dp-packet.h index 633b4ef38..94aaa40a3 100644 --- a/lib/dp-packet.h +++ b/lib/dp-packet.h @@ -25,6 +25,7 @@ #include #endif +#include "csum.h" #include "netdev-afxdp.h" #include "netdev-dpdk.h" #include "openvswitch/list.h" @@ -77,24 +78,27 @@ enum dp_packet_offload_mask { DEF_OL_FLAG(DP_PACKET_OL_TX_IPV4, RTE_MBUF_F_TX_IPV4, 0x80), /* Offloaded packet is IPv6. */ DEF_OL_FLAG(DP_PACKET_OL_TX_IPV6, RTE_MBUF_F_TX_IPV6, 0x100), + /* Offload IP checksum. */ + DEF_OL_FLAG(DP_PACKET_OL_TX_IP_CSUM, RTE_MBUF_F_TX_IP_CKSUM, 0x200), /* Offload TCP checksum. */ - DEF_OL_FLAG(DP_PACKET_OL_TX_TCP_CSUM, RTE_MBUF_F_TX_TCP_CKSUM, 0x200), + DEF_OL_FLAG(DP_PACKET_OL_TX_TCP_CSUM, RTE_MBUF_F_TX_TCP_CKSUM, 0x400), /* Offload UDP checksum. */ - DEF_OL_FLAG(DP_PACKET_OL_TX_UDP_CSUM, RTE_MBUF_F_TX_UDP_CKSUM, 0x400), + DEF_OL_FLAG(DP_PACKET_OL_TX_UDP_CSUM, RTE_MBUF_F_TX_UDP_CKSUM, 0x800), /* Offload SCTP checksum. */ - DEF_OL_FLAG(DP_PACKET_OL_TX_SCTP_CSUM, RTE_MBUF_F_TX_SCTP_CKSUM, 0x800), + DEF_OL_FLAG(DP_PACKET_OL_TX_SCTP_CSUM, RTE_MBUF_F_TX_SCTP_CKSUM, 0x1000), /* Adding new field requires adding to DP_PACKET_OL_SUPPORTED_MASK. */ }; -#define DP_PACKET_OL_SUPPORTED_MASK (DP_PACKET_OL_RSS_HASH | \ - DP_PACKET_OL_FLOW_MARK | \ +#define DP_PACKET_OL_SUPPORTED_MASK (DP_PACKET_OL_RSS_HASH | \ + DP_PACKET_OL_FLOW_MARK | \ DP_PACKET_OL_RX_L4_CSUM_BAD | \ DP_PACKET_OL_RX_IP_CSUM_BAD | \ DP_PACKET_OL_RX_L4_CSUM_GOOD | \ DP_PACKET_OL_RX_IP_CSUM_GOOD | \ - DP_PACKET_OL_TX_TCP_SEG | \ - DP_PACKET_OL_TX_IPV4 | \ - DP_PACKET_OL_TX_IPV6 | \ + DP_PACKET_OL_TX_TCP_SEG | \ + DP_PACKET_OL_TX_IPV4 | \ + DP_PACKET_OL_TX_IPV6 | \ + DP_PACKET_OL_TX_IP_CSUM | \ DP_PACKET_OL_TX_TCP_CSUM | \ DP_PACKET_OL_TX_UDP_CSUM | \ DP_PACKET_OL_TX_SCTP_CSUM) @@ -235,6 +239,7 @@ void *dp_packet_steal_data(struct dp_packet *); static inline bool dp_packet_equal(const struct dp_packet *, const struct dp_packet *); +void dp_packet_ol_send_prepare(struct dp_packet *, const uint64_t); /* Frees memory that 'p' points to, as well as 'p' itself. */ @@ -979,7 +984,7 @@ dp_packet_ol_tcp_seg(const struct dp_packet *a) return !!(*dp_packet_ol_flags_ptr(a) & DP_PACKET_OL_TX_TCP_SEG); } -/* Returns 'true' if packet 'a' is marked for IPv4 checksum offloading. */ +/* Returns 'true' if packet 'a' is marked as IPv4. */ static inline bool dp_packet_ol_tx_ipv4(const struct dp_packet *a) { @@ -1010,20 +1015,34 @@ dp_packet_ol_tx_sctp_csum(struct dp_packet *a) DP_PACKET_OL_TX_SCTP_CSUM; } -/* Mark packet 'a' for IPv4 checksum offloading. */ +/* Mark packet 'a' as IPv4. */ static inline void dp_packet_ol_set_tx_ipv4(struct dp_packet *a) { *dp_packet_ol_flags_ptr(a) |= DP_PACKET_OL_TX_IPV4; } -/* Mark packet 'a' for IPv6 checksum offloading. */ +/* Mark packet 'a' as IPv6. */ static inline void dp_packet_ol_set_tx_ipv6(struct dp_packet *a) { *dp_packet_ol_flags_ptr(a) |= DP_PACKET_OL_TX_IPV6; } +/* Returns 'true' if packet 'p' is marked for IPv4 checksum offloading. */ +static inline bool +dp_packet_ol_tx_ip_csum(const struct dp_packet *p) +{ + return !!(*dp_packet_ol_flags_ptr(p) & DP_PACKET_OL_TX_IP_CSUM); +} + +/* Marks packet 'p' for IPv4 checksum offloading. */ +static inline void +dp_packet_ol_set_tx_ip_csum(struct dp_packet *p) +{ + *dp_packet_ol_flags_ptr(p) |= DP_PACKET_OL_TX_IP_CSUM; +} + /* Mark packet 'a' for TCP checksum offloading. It implies that either * the packet 'a' is marked for IPv4 or IPv6 checksum offloading. */ static inline void @@ -1057,6 +1076,8 @@ dp_packet_ol_set_tcp_seg(struct dp_packet *a) *dp_packet_ol_flags_ptr(a) |= DP_PACKET_OL_TX_TCP_SEG; } +/* Returns 'true' is the IP has good integrity and the + * checksum in it is complete. */ static inline bool dp_packet_ol_ip_checksum_good(const struct dp_packet *p) { @@ -1064,6 +1085,22 @@ dp_packet_ol_ip_checksum_good(const struct dp_packet *p) DP_PACKET_OL_RX_IP_CSUM_GOOD; } +/* Marks packet 'p' with good IPv4 checksum. */ +static inline void +dp_packet_ol_set_ip_csum_good(const struct dp_packet *p) +{ + *dp_packet_ol_flags_ptr(p) &= ~DP_PACKET_OL_RX_IP_CSUM_BAD; + *dp_packet_ol_flags_ptr(p) |= DP_PACKET_OL_RX_IP_CSUM_GOOD; +} + +/* Resets IP good checksum flag in packet 'p'. */ +static inline void +dp_packet_ol_reset_ip_csum_good(const struct dp_packet *p) +{ + *dp_packet_ol_flags_ptr(p) &= ~DP_PACKET_OL_RX_IP_CSUM_GOOD; +} + +/* Marks packet 'p' with bad IPv4 checksum. */ static inline bool dp_packet_ol_ip_checksum_bad(const struct dp_packet *p) { @@ -1071,6 +1108,17 @@ dp_packet_ol_ip_checksum_bad(const struct dp_packet *p) DP_PACKET_OL_RX_IP_CSUM_BAD; } +/* Calculate and set the IPv4 header checksum in packet 'p'. */ +static inline void +dp_packet_ip_set_header_csum(struct dp_packet *p) +{ + struct ip_header *ip = dp_packet_l3(p); + + ovs_assert(ip); + ip->ip_csum = 0; + ip->ip_csum = csum(ip, sizeof *ip); +} + static inline bool dp_packet_ol_l4_checksum_good(const struct dp_packet *p) { diff --git a/lib/dpif.h b/lib/dpif.h index 6cb4dae6d..33e991b84 100644 --- a/lib/dpif.h +++ b/lib/dpif.h @@ -869,7 +869,7 @@ void dpif_register_dp_purge_cb(struct dpif *, dp_purge_callback *, void *aux); * * Returns 0 if successful, ENOSPC if the flow limit has been reached and no * flow should be installed, or some otherwise a positive errno value. */ -typedef int upcall_callback(const struct dp_packet *packet, +typedef int upcall_callback(struct dp_packet *packet, const struct flow *flow, ovs_u128 *ufid, unsigned pmd_id, diff --git a/lib/flow.c b/lib/flow.c index 8ab9df3fc..7efb2dd00 100644 --- a/lib/flow.c +++ b/lib/flow.c @@ -907,6 +907,10 @@ miniflow_extract(struct dp_packet *packet, struct miniflow *dst) nw_proto = nh->ip_proto; nw_frag = ipv4_get_nw_frag(nh); data_pull(&data, &size, ip_len); + dp_packet_ol_set_tx_ipv4(packet); + if (dp_packet_ol_ip_checksum_good(packet)) { + dp_packet_ol_set_tx_ip_csum(packet); + } } else if (dl_type == htons(ETH_TYPE_IPV6)) { const struct ovs_16aligned_ip6_hdr *nh = data; ovs_be32 tc_flow; @@ -920,6 +924,7 @@ miniflow_extract(struct dp_packet *packet, struct miniflow *dst) } data_pull(&data, &size, sizeof *nh); + dp_packet_ol_set_tx_ipv6(packet); plen = ntohs(nh->ip6_plen); dp_packet_set_l2_pad_size(packet, size - plen); size = plen; /* Never pull padding. */ @@ -3217,9 +3222,12 @@ packet_expand(struct dp_packet *p, const struct flow *flow, size_t size) struct ip_header *ip = dp_packet_l3(p); ip->ip_tot_len = htons(p->l4_ofs - p->l3_ofs + l4_len); - ip->ip_csum = 0; - ip->ip_csum = csum(ip, sizeof *ip); - + if (dp_packet_ol_tx_ip_csum(p)) { + dp_packet_ol_reset_ip_csum_good(p); + } else { + dp_packet_ip_set_header_csum(p); + dp_packet_ol_set_ip_csum_good(p); + } pseudo_hdr_csum = packet_csum_pseudoheader(ip); } else { /* ETH_TYPE_IPV6 */ struct ovs_16aligned_ip6_hdr *nh = dp_packet_l3(p); @@ -3309,6 +3317,7 @@ flow_compose(struct dp_packet *p, const struct flow *flow, /* Checksum has already been zeroed by put_zeros call. */ ip->ip_csum = csum(ip, sizeof *ip); + dp_packet_ol_set_ip_csum_good(p); pseudo_hdr_csum = packet_csum_pseudoheader(ip); flow_compose_l4_csum(p, flow, pseudo_hdr_csum); } else if (flow->dl_type == htons(ETH_TYPE_IPV6)) { diff --git a/lib/ipf.c b/lib/ipf.c index 4f635de11..5462eec53 100644 --- a/lib/ipf.c +++ b/lib/ipf.c @@ -433,7 +433,9 @@ ipf_reassemble_v4_frags(struct ipf_list *ipf_list) len += rest_len; l3 = dp_packet_l3(pkt); ovs_be16 new_ip_frag_off = l3->ip_frag_off & ~htons(IP_MORE_FRAGMENTS); - if (!dp_packet_ol_tx_ipv4(pkt)) { + if (dp_packet_ol_tx_ip_csum(pkt)) { + dp_packet_ol_reset_ip_csum_good(pkt); + } else { l3->ip_csum = recalc_csum16(l3->ip_csum, l3->ip_frag_off, new_ip_frag_off); l3->ip_csum = recalc_csum16(l3->ip_csum, l3->ip_tot_len, htons(len)); @@ -609,7 +611,6 @@ ipf_is_valid_v4_frag(struct ipf *ipf, struct dp_packet *pkt) } if (OVS_UNLIKELY(!dp_packet_ol_ip_checksum_good(pkt) - && !dp_packet_ol_tx_ipv4(pkt) && csum(l3, ip_hdr_len) != 0)) { COVERAGE_INC(ipf_l3csum_err); goto invalid_pkt; @@ -1185,7 +1186,9 @@ ipf_post_execute_reass_pkts(struct ipf *ipf, } else { struct ip_header *l3_frag = dp_packet_l3(frag_i->pkt); struct ip_header *l3_reass = dp_packet_l3(pkt); - if (!dp_packet_ol_tx_ipv4(frag_i->pkt)) { + if (dp_packet_ol_tx_ip_csum(frag_i->pkt)) { + dp_packet_ol_reset_ip_csum_good(frag_i->pkt); + } else { ovs_be32 reass_ip = get_16aligned_be32(&l3_reass->ip_src); ovs_be32 frag_ip = diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index 3172c766b..1eb2954ab 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -397,8 +397,9 @@ enum dpdk_hw_ol_features { NETDEV_RX_CHECKSUM_OFFLOAD = 1 << 0, NETDEV_RX_HW_CRC_STRIP = 1 << 1, NETDEV_RX_HW_SCATTER = 1 << 2, - NETDEV_TX_TSO_OFFLOAD = 1 << 3, - NETDEV_TX_SCTP_CHECKSUM_OFFLOAD = 1 << 4, + NETDEV_TX_IPV4_CKSUM_OFFLOAD = 1 << 3, + NETDEV_TX_TSO_OFFLOAD = 1 << 4, + NETDEV_TX_SCTP_CHECKSUM_OFFLOAD = 1 << 5, }; /* @@ -984,6 +985,10 @@ dpdk_eth_dev_port_config(struct netdev_dpdk *dev, int n_rxq, int n_txq) conf.rxmode.offloads |= RTE_ETH_RX_OFFLOAD_KEEP_CRC; } + if (dev->hw_ol_features & NETDEV_TX_IPV4_CKSUM_OFFLOAD) { + conf.txmode.offloads |= RTE_ETH_TX_OFFLOAD_IPV4_CKSUM; + } + if (dev->hw_ol_features & NETDEV_TX_TSO_OFFLOAD) { conf.txmode.offloads |= DPDK_TX_TSO_OFFLOAD_FLAGS; if (dev->hw_ol_features & NETDEV_TX_SCTP_CHECKSUM_OFFLOAD) { @@ -1124,6 +1129,12 @@ dpdk_eth_dev_init(struct netdev_dpdk *dev) dev->hw_ol_features &= ~NETDEV_RX_HW_SCATTER; } + if (info.tx_offload_capa & RTE_ETH_TX_OFFLOAD_IPV4_CKSUM) { + dev->hw_ol_features |= NETDEV_TX_IPV4_CKSUM_OFFLOAD; + } else { + dev->hw_ol_features &= ~NETDEV_TX_IPV4_CKSUM_OFFLOAD; + } + dev->hw_ol_features &= ~NETDEV_TX_TSO_OFFLOAD; if (userspace_tso_enabled()) { if ((info.tx_offload_capa & tx_tso_offload_capa) @@ -1693,16 +1704,12 @@ netdev_dpdk_get_config(const struct netdev *netdev, struct smap *args) dev->requested_txq_size); smap_add_format(args, "configured_txq_descriptors", "%d", dev->txq_size); - if (dev->hw_ol_features & NETDEV_RX_CHECKSUM_OFFLOAD) { - smap_add(args, "rx_csum_offload", "true"); - } else { - smap_add(args, "rx_csum_offload", "false"); - } - if (dev->hw_ol_features & NETDEV_TX_TSO_OFFLOAD) { - smap_add(args, "tx_tso_offload", "true"); - } else { - smap_add(args, "tx_tso_offload", "false"); - } +#define HWOL_SMAP_ADD(FIELD, FLAG) \ + smap_add(args, FIELD, dev->hw_ol_features & FLAG ? "true" : "false"); + HWOL_SMAP_ADD("rx_csum_offload", NETDEV_RX_CHECKSUM_OFFLOAD); + HWOL_SMAP_ADD("tx_ip_csum_offload", NETDEV_TX_IPV4_CKSUM_OFFLOAD); + HWOL_SMAP_ADD("tx_tso_offload", NETDEV_TX_TSO_OFFLOAD); +#undef HWOL_SMAP_ADD smap_add(args, "lsc_interrupt_mode", dev->lsc_interrupt_mode ? "true" : "false"); @@ -2145,12 +2152,10 @@ netdev_dpdk_prep_ol_packet(struct netdev_dpdk *dev, struct rte_mbuf *mbuf) { struct dp_packet *pkt = CONTAINER_OF(mbuf, struct dp_packet, mbuf); - if (mbuf->ol_flags & RTE_MBUF_F_TX_L4_MASK) { - mbuf->l2_len = (char *)dp_packet_l3(pkt) - (char *)dp_packet_eth(pkt); - mbuf->l3_len = (char *)dp_packet_l4(pkt) - (char *)dp_packet_l3(pkt); - mbuf->outer_l2_len = 0; - mbuf->outer_l3_len = 0; - } + mbuf->l2_len = (char *) dp_packet_l3(pkt) - (char *) dp_packet_eth(pkt); + mbuf->l3_len = (char *) dp_packet_l4(pkt) - (char *) dp_packet_l3(pkt); + mbuf->outer_l2_len = 0; + mbuf->outer_l3_len = 0; if (mbuf->ol_flags & RTE_MBUF_F_TX_TCP_SEG) { struct tcp_header *th = dp_packet_l4(pkt); @@ -2210,13 +2215,11 @@ netdev_dpdk_eth_tx_burst(struct netdev_dpdk *dev, int qid, uint32_t nb_tx = 0; uint16_t nb_tx_prep = cnt; - if (userspace_tso_enabled()) { - nb_tx_prep = rte_eth_tx_prepare(dev->port_id, qid, pkts, cnt); - if (nb_tx_prep != cnt) { - VLOG_WARN_RL(&rl, "%s: Output batch contains invalid packets. " - "Only %u/%u are valid: %s", dev->up.name, nb_tx_prep, - cnt, rte_strerror(rte_errno)); - } + nb_tx_prep = rte_eth_tx_prepare(dev->port_id, qid, pkts, cnt); + if (nb_tx_prep != cnt) { + VLOG_WARN_RL(&rl, "%s: Output batch contains invalid packets. " + "Only %u/%u are valid: %s", dev->up.name, nb_tx_prep, + cnt, rte_strerror(rte_errno)); } while (nb_tx != nb_tx_prep) { @@ -2558,7 +2561,7 @@ netdev_dpdk_vhost_update_tx_counters(struct netdev_dpdk *dev, sw_stats->tx_failure_drops += sw_stats_add->tx_failure_drops; sw_stats->tx_mtu_exceeded_drops += sw_stats_add->tx_mtu_exceeded_drops; sw_stats->tx_qos_drops += sw_stats_add->tx_qos_drops; - sw_stats->tx_invalid_ol_drops += sw_stats_add->tx_invalid_ol_drops; + sw_stats->tx_invalid_ol_drops += sw_stats_add->tx_invalid_ol_drops; } } @@ -2656,12 +2659,10 @@ dpdk_copy_dp_packet_to_mbuf(struct rte_mempool *mp, struct dp_packet *pkt_orig) memcpy(&pkt_dest->l2_pad_size, &pkt_orig->l2_pad_size, sizeof(struct dp_packet) - offsetof(struct dp_packet, l2_pad_size)); - if (mbuf_dest->ol_flags & RTE_MBUF_F_TX_L4_MASK) { - mbuf_dest->l2_len = (char *)dp_packet_l3(pkt_dest) - - (char *)dp_packet_eth(pkt_dest); - mbuf_dest->l3_len = (char *)dp_packet_l4(pkt_dest) - - (char *) dp_packet_l3(pkt_dest); - } + mbuf_dest->l2_len = (char *) dp_packet_l3(pkt_dest) + - (char *) dp_packet_eth(pkt_dest); + mbuf_dest->l3_len = (char *) dp_packet_l4(pkt_dest) + - (char *) dp_packet_l3(pkt_dest); return pkt_dest; } @@ -2718,11 +2719,9 @@ netdev_dpdk_common_send(struct netdev *netdev, struct dp_packet_batch *batch, pkt_cnt = cnt; /* Prepare each mbuf for hardware offloading. */ - if (userspace_tso_enabled()) { - cnt = netdev_dpdk_prep_ol_batch(dev, pkts, pkt_cnt); - stats->tx_invalid_ol_drops += pkt_cnt - cnt; - pkt_cnt = cnt; - } + cnt = netdev_dpdk_prep_ol_batch(dev, pkts, pkt_cnt); + stats->tx_invalid_ol_drops += pkt_cnt - cnt; + pkt_cnt = cnt; /* Apply Quality of Service policy. */ cnt = netdev_dpdk_qos_run(dev, pkts, pkt_cnt, true); @@ -4936,6 +4935,12 @@ netdev_dpdk_reconfigure(struct netdev *netdev) } err = dpdk_eth_dev_init(dev); + if (dev->hw_ol_features & NETDEV_TX_IPV4_CKSUM_OFFLOAD) { + netdev->ol_flags |= NETDEV_OFFLOAD_TX_IPV4_CSUM; + } else { + netdev->ol_flags &= ~NETDEV_OFFLOAD_TX_IPV4_CSUM; + } + if (dev->hw_ol_features & NETDEV_TX_TSO_OFFLOAD) { netdev->ol_flags |= NETDEV_OFFLOAD_TX_TCP_TSO; netdev->ol_flags |= NETDEV_OFFLOAD_TX_TCP_CSUM; diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c index 6e62447f1..f33be55fe 100644 --- a/lib/netdev-dummy.c +++ b/lib/netdev-dummy.c @@ -148,6 +148,11 @@ struct netdev_dummy { int requested_n_txq OVS_GUARDED; int requested_n_rxq OVS_GUARDED; int requested_numa_id OVS_GUARDED; + + /* Enable netdev IP csum offload. */ + bool ol_ip_csum OVS_GUARDED; + /* Flag RX packet with good csum. */ + bool ol_ip_csum_set_good OVS_GUARDED; }; /* Max 'recv_queue_len' in struct netdev_dummy. */ @@ -910,6 +915,13 @@ netdev_dummy_set_config(struct netdev *netdev_, const struct smap *args, } } + netdev->ol_ip_csum_set_good = smap_get_bool(args, "ol_ip_csum_set_good", + false); + netdev->ol_ip_csum = smap_get_bool(args, "ol_ip_csum", false); + if (netdev->ol_ip_csum) { + netdev_->ol_flags |= NETDEV_OFFLOAD_TX_IPV4_CSUM; + } + netdev_change_seq_changed(netdev_); /* 'dummy-pmd' specific config. */ @@ -1088,6 +1100,10 @@ netdev_dummy_rxq_recv(struct netdev_rxq *rxq_, struct dp_packet_batch *batch, netdev->rxq_stats[rxq_->queue_id].bytes += dp_packet_size(packet); netdev->custom_stats[0].value++; netdev->custom_stats[1].value++; + if (netdev->ol_ip_csum_set_good) { + /* The netdev hardware sets the flag when the packet has good csum. */ + dp_packet_ol_set_ip_csum_good(packet); + } ovs_mutex_unlock(&netdev->mutex); dp_packet_batch_init_packet(batch, packet); @@ -1170,6 +1186,13 @@ netdev_dummy_send(struct netdev *netdev, int qid, } ovs_mutex_lock(&dev->mutex); + if (dp_packet_ol_tx_ip_csum(packet)) { + if (!dp_packet_ol_ip_checksum_good(packet)) { + dp_packet_ip_set_header_csum(packet); + dp_packet_ol_set_ip_csum_good(packet); + } + } + dev->stats.tx_packets++; dev->txq_stats[qid].packets++; dev->stats.tx_bytes += size; diff --git a/lib/netdev-native-tnl.c b/lib/netdev-native-tnl.c index 8a0b34fc4..d9e2d7e5d 100644 --- a/lib/netdev-native-tnl.c +++ b/lib/netdev-native-tnl.c @@ -88,7 +88,10 @@ netdev_tnl_ip_extract_tnl_md(struct dp_packet *packet, struct flow_tnl *tnl, ovs_be32 ip_src, ip_dst; - if (OVS_UNLIKELY(!dp_packet_ol_ip_checksum_good(packet))) { + /* A packet coming from a network device might have the + * csum already checked. In this case, skip the check. */ + if (!dp_packet_ol_ip_checksum_good(packet) + && !dp_packet_ol_tx_ip_csum(packet)) { if (csum(ip, IP_IHL(ip->ip_ihl_ver) * 4)) { VLOG_WARN_RL(&err_rl, "ip packet has invalid checksum"); return NULL; @@ -142,7 +145,8 @@ netdev_tnl_ip_extract_tnl_md(struct dp_packet *packet, struct flow_tnl *tnl, * * This function sets the IP header's ip_tot_len field (which should be zeroed * as part of 'header') and puts its value into '*ip_tot_size' as well. Also - * updates IP header checksum, as well as the l3 and l4 offsets in 'packet'. + * updates IP header checksum if not offloaded, as well as the l3 and l4 + * offsets in 'packet'. * * Return pointer to the L4 header added to 'packet'. */ void * @@ -167,11 +171,16 @@ netdev_tnl_push_ip_header(struct dp_packet *packet, *ip_tot_size -= IPV6_HEADER_LEN; ip6->ip6_plen = htons(*ip_tot_size); packet->l4_ofs = dp_packet_size(packet) - *ip_tot_size; + dp_packet_ol_set_tx_ipv6(packet); + dp_packet_ol_reset_ip_csum_good(packet); return ip6 + 1; } else { ip = netdev_tnl_ip_hdr(eth); ip->ip_tot_len = htons(*ip_tot_size); - ip->ip_csum = recalc_csum16(ip->ip_csum, 0, ip->ip_tot_len); + /* Postpone checksum to when the packet is pushed to the port. */ + dp_packet_ol_set_tx_ipv4(packet); + dp_packet_ol_set_tx_ip_csum(packet); + dp_packet_ol_reset_ip_csum_good(packet); *ip_tot_size -= IP_HEADER_LEN; packet->l4_ofs = dp_packet_size(packet) - *ip_tot_size; return ip + 1; @@ -297,8 +306,8 @@ netdev_tnl_ip_build_header(struct ovs_action_push_tnl *data, ip->ip_frag_off = (params->flow->tunnel.flags & FLOW_TNL_F_DONT_FRAGMENT) ? htons(IP_DF) : 0; - /* Checksum has already been zeroed by eth_build_header. */ - ip->ip_csum = csum(ip, sizeof *ip); + /* The checksum will be calculated when the headers are pushed + * to the packet if offloading is not enabled. */ data->header_len += IP_HEADER_LEN; return ip + 1; diff --git a/lib/netdev.c b/lib/netdev.c index 5eecacd9e..b222a5e64 100644 --- a/lib/netdev.c +++ b/lib/netdev.c @@ -799,6 +799,14 @@ netdev_send_prepare_packet(const uint64_t netdev_flags, return false; } + /* Packet with IP csum offloading enabled was received with verified csum. + * Leave the IP csum offloading enabled even with good checksum to the + * netdev to decide what would be the best to do. + * Provide a software fallback in case the device doesn't support IP csum + * offloading. Note: Encapsulated packet must have the inner IP header + * csum already calculated. */ + dp_packet_ol_send_prepare(packet, netdev_flags); + if (dp_packet_ol_l4_mask(packet)) { if (dp_packet_ol_tx_tcp_csum(packet)) { if (!(netdev_flags & NETDEV_OFFLOAD_TX_TCP_CSUM)) { @@ -966,7 +974,21 @@ netdev_push_header(const struct netdev *netdev, "not supported: packet dropped", netdev_get_name(netdev)); } else { + /* The packet is going to be encapsulated and there is + * no support yet for inner network header csum offloading. */ + if (dp_packet_ol_tx_ip_csum(packet) + && !dp_packet_ol_ip_checksum_good(packet)) { + dp_packet_ip_set_header_csum(packet); + } + netdev->netdev_class->push_header(netdev, packet, data); + if (dp_packet_ol_tx_ip_csum(packet)) { + dp_packet_ol_reset_ip_csum_good(packet); + } else if (dp_packet_ol_tx_ipv4(packet)) { + dp_packet_ip_set_header_csum(packet); + dp_packet_ol_set_ip_csum_good(packet); + } + pkt_metadata_init(&packet->md, data->out_port); dp_packet_batch_refill(batch, packet, i); } diff --git a/lib/odp-execute.c b/lib/odp-execute.c index 7da56793d..ab2271a66 100644 --- a/lib/odp-execute.c +++ b/lib/odp-execute.c @@ -167,9 +167,14 @@ odp_set_ipv4(struct dp_packet *packet, const struct ovs_key_ipv4 *key, new_tos = key->ipv4_tos | (nh->ip_tos & ~mask->ipv4_tos); if (nh->ip_tos != new_tos) { - nh->ip_csum = recalc_csum16(nh->ip_csum, - htons((uint16_t) nh->ip_tos), - htons((uint16_t) new_tos)); + if (dp_packet_ol_tx_ip_csum(packet)) { + dp_packet_ol_reset_ip_csum_good(packet); + } else { + nh->ip_csum = recalc_csum16(nh->ip_csum, + htons((uint16_t) nh->ip_tos), + htons((uint16_t) new_tos)); + } + nh->ip_tos = new_tos; } } @@ -178,8 +183,14 @@ odp_set_ipv4(struct dp_packet *packet, const struct ovs_key_ipv4 *key, new_ttl = key->ipv4_ttl | (nh->ip_ttl & ~mask->ipv4_ttl); if (OVS_LIKELY(nh->ip_ttl != new_ttl)) { - nh->ip_csum = recalc_csum16(nh->ip_csum, htons(nh->ip_ttl << 8), - htons(new_ttl << 8)); + if (dp_packet_ol_tx_ip_csum(packet)) { + dp_packet_ol_reset_ip_csum_good(packet); + } else { + nh->ip_csum = recalc_csum16(nh->ip_csum, + htons(nh->ip_ttl << 8), + htons(new_ttl << 8)); + } + nh->ip_ttl = new_ttl; } } diff --git a/lib/packets.c b/lib/packets.c index d564c9dbe..03727dd57 100644 --- a/lib/packets.c +++ b/lib/packets.c @@ -1144,7 +1144,12 @@ packet_set_ipv4_addr(struct dp_packet *packet, } } } - nh->ip_csum = recalc_csum32(nh->ip_csum, old_addr, new_addr); + + if (dp_packet_ol_tx_ip_csum(packet)) { + dp_packet_ol_reset_ip_csum_good(packet); + } else { + nh->ip_csum = recalc_csum32(nh->ip_csum, old_addr, new_addr); + } put_16aligned_be32(addr, new_addr); } @@ -1309,16 +1314,26 @@ packet_set_ipv4(struct dp_packet *packet, ovs_be32 src, ovs_be32 dst, if (nh->ip_tos != tos) { uint8_t *field = &nh->ip_tos; - nh->ip_csum = recalc_csum16(nh->ip_csum, htons((uint16_t) *field), - htons((uint16_t) tos)); + if (dp_packet_ol_tx_ip_csum(packet)) { + dp_packet_ol_reset_ip_csum_good(packet); + } else { + nh->ip_csum = recalc_csum16(nh->ip_csum, htons((uint16_t) *field), + htons((uint16_t) tos)); + } + *field = tos; } if (nh->ip_ttl != ttl) { uint8_t *field = &nh->ip_ttl; - nh->ip_csum = recalc_csum16(nh->ip_csum, htons(*field << 8), - htons(ttl << 8)); + if (dp_packet_ol_tx_ip_csum(packet)) { + dp_packet_ol_reset_ip_csum_good(packet); + } else { + nh->ip_csum = recalc_csum16(nh->ip_csum, htons(*field << 8), + htons(ttl << 8)); + } + *field = ttl; } } @@ -1927,8 +1942,13 @@ IP_ECN_set_ce(struct dp_packet *pkt, bool is_ipv6) tos |= IP_ECN_CE; if (nh->ip_tos != tos) { - nh->ip_csum = recalc_csum16(nh->ip_csum, htons(nh->ip_tos), - htons((uint16_t) tos)); + if (dp_packet_ol_tx_ip_csum(pkt)) { + dp_packet_ol_reset_ip_csum_good(pkt); + } else { + nh->ip_csum = recalc_csum16(nh->ip_csum, htons(nh->ip_tos), + htons((uint16_t) tos)); + } + nh->ip_tos = tos; } } diff --git a/ofproto/ofproto-dpif-upcall.c b/ofproto/ofproto-dpif-upcall.c index 57f94df54..164738503 100644 --- a/ofproto/ofproto-dpif-upcall.c +++ b/ofproto/ofproto-dpif-upcall.c @@ -215,7 +215,7 @@ struct upcall { enum odp_key_fitness fitness; /* Fitness of 'flow' relative to ODP key. */ const ovs_u128 *ufid; /* Unique identifier for 'flow'. */ unsigned pmd_id; /* Datapath poll mode driver id. */ - const struct dp_packet *packet; /* Packet associated with this upcall. */ + struct dp_packet *packet; /* Packet associated with this upcall. */ ofp_port_t ofp_in_port; /* OpenFlow in port, or OFPP_NONE. */ uint16_t mru; /* If !0, Maximum receive unit of fragmented IP packet */ @@ -395,7 +395,7 @@ static void delete_op_init(struct udpif *udpif, struct ukey_op *op, struct udpif_key *ukey); static int upcall_receive(struct upcall *, const struct dpif_backer *, - const struct dp_packet *packet, enum dpif_upcall_type, + struct dp_packet *packet, enum dpif_upcall_type, const struct nlattr *userdata, const struct flow *, const unsigned int mru, const ovs_u128 *ufid, const unsigned pmd_id); @@ -1140,7 +1140,7 @@ compose_slow_path(struct udpif *udpif, struct xlate_out *xout, * since the 'upcall->put_actions' remains uninitialized. */ static int upcall_receive(struct upcall *upcall, const struct dpif_backer *backer, - const struct dp_packet *packet, enum dpif_upcall_type type, + struct dp_packet *packet, enum dpif_upcall_type type, const struct nlattr *userdata, const struct flow *flow, const unsigned int mru, const ovs_u128 *ufid, const unsigned pmd_id) @@ -1336,7 +1336,7 @@ should_install_flow(struct udpif *udpif, struct upcall *upcall) } static int -upcall_cb(const struct dp_packet *packet, const struct flow *flow, ovs_u128 *ufid, +upcall_cb(struct dp_packet *packet, const struct flow *flow, ovs_u128 *ufid, unsigned pmd_id, enum dpif_upcall_type type, const struct nlattr *userdata, struct ofpbuf *actions, struct flow_wildcards *wc, struct ofpbuf *put_actions, void *aux) @@ -1446,7 +1446,7 @@ static int process_upcall(struct udpif *udpif, struct upcall *upcall, struct ofpbuf *odp_actions, struct flow_wildcards *wc) { - const struct dp_packet *packet = upcall->packet; + struct dp_packet *packet = upcall->packet; const struct flow *flow = upcall->flow; size_t actions_len = 0; @@ -1524,6 +1524,10 @@ process_upcall(struct udpif *udpif, struct upcall *upcall, break; } + /* The packet is going to be encapsulated and sent to + * the controller. */ + dp_packet_ol_send_prepare(packet, 0); + const struct frozen_state *state = &recirc_node->state; struct ofproto_async_msg *am = xmalloc(sizeof *am); diff --git a/tests/automake.mk b/tests/automake.mk index 261fbb942..829152926 100644 --- a/tests/automake.mk +++ b/tests/automake.mk @@ -162,6 +162,7 @@ SYSTEM_KMOD_TESTSUITE_AT = \ SYSTEM_USERSPACE_TESTSUITE_AT = \ tests/system-userspace-testsuite.at \ tests/system-userspace-macros.at \ + tests/system-userspace-offload.at \ tests/system-userspace-packet-type-aware.at \ tests/system-route.at diff --git a/tests/system-userspace-offload.at b/tests/system-userspace-offload.at new file mode 100644 index 000000000..4d7f3ef89 --- /dev/null +++ b/tests/system-userspace-offload.at @@ -0,0 +1,79 @@ +AT_BANNER([userspace offload]) + +AT_SETUP([userspace offload - ip csum offload]) +OVS_VSWITCHD_START( + [add-br br1 -- set bridge br1 datapath-type=dummy -- \ + add-port br1 p1 -- \ + set Interface p1 type=dummy -- \ + add-port br1 p2 -- \ + set Interface p2 type=dummy --]) + +# Modify the ip_dst addr to force changing the IP csum. +AT_CHECK([ovs-ofctl add-flow br1 in_port=p1,actions=mod_nw_dst:192.168.1.1,output:p2]) + +# Check if no offload remains ok. +AT_CHECK([ovs-vsctl set Interface p2 options:tx_pcap=p2.pcap]) +AT_CHECK([ovs-vsctl set Interface p1 options:ol_ip_csum=false]) +AT_CHECK([ovs-vsctl set Interface p1 options:ol_ip_csum_set_good=false]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 \ +0a8f394fe0738abf7e2f058408004500003433e0400040068f8fc0a87b02c0a87b01d4781451a962ad5417ed297b801000e547fd00000101080a2524d2345c7fe1c4 +]) + +# Checksum should change to 0x990 with ip_dst changed to 192.168.1.1 +# by the datapath while processing the packet. +AT_CHECK([ovs-pcap p2.pcap > p2.pcap.txt 2>&1]) +AT_CHECK([tail -n 1 p2.pcap.txt], [0], [dnl +0a8f394fe0738abf7e2f058408004500003433e0400040060990c0a87b02c0a80101d4781451a962ad5417ed297b801000e5c1fd00000101080a2524d2345c7fe1c4 +]) + +# Check if packets entering the datapath with csum offloading +# enabled gets the csum updated properly by egress handling +# in the datapath and not by the netdev. +AT_CHECK([ovs-vsctl set Interface p1 options:ol_ip_csum=false]) +AT_CHECK([ovs-vsctl set Interface p1 options:ol_ip_csum_set_good=true]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 \ +0a8f394fe0738abf7e2f058408004500003433e0400040068f8fc0a87b02c0a87b01d4781451a962ad5417ed297b801000e547fd00000101080a2524d2345c7fe1c4 +]) +AT_CHECK([ovs-pcap p2.pcap > p2.pcap.txt 2>&1]) +AT_CHECK([tail -n 1 p2.pcap.txt], [0], [dnl +0a8f394fe0738abf7e2f058408004500003433e0400040060990c0a87b02c0a80101d4781451a962ad5417ed297b801000e5c1fd00000101080a2524d2345c7fe1c4 +]) + +# Check if packets entering the datapath with csum offloading +# enabled gets the csum updated properly by netdev and not +# by the datapath. +AT_CHECK([ovs-vsctl set Interface p1 options:ol_ip_csum=true]) +AT_CHECK([ovs-vsctl set Interface p1 options:ol_ip_csum_set_good=true]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 \ +0a8f394fe0738abf7e2f058408004500003433e0400040068f8fc0a87b02c0a87b01d4781451a962ad5417ed297b801000e547fd00000101080a2524d2345c7fe1c4 +]) +AT_CHECK([ovs-pcap p2.pcap > p2.pcap.txt 2>&1]) +AT_CHECK([tail -n 1 p2.pcap.txt], [0], [dnl +0a8f394fe0738abf7e2f058408004500003433e0400040060990c0a87b02c0a80101d4781451a962ad5417ed297b801000e5c1fd00000101080a2524d2345c7fe1c4 +]) + +# Push a packet with bad csum and offloading disabled to check +# if the datapath updates the csum, but does not fix the issue. +AT_CHECK([ovs-vsctl set Interface p1 options:ol_ip_csum=false]) +AT_CHECK([ovs-vsctl set Interface p1 options:ol_ip_csum_set_good=false]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 \ +0a8f394fe0738abf7e2f058408004500003433e0400040068f03c0a87b02c0a87b01d4781451a962ad5417ed297b801000e547fd00000101080a2524d2345c7fe1c4 +]) +AT_CHECK([ovs-pcap p2.pcap > p2.pcap.txt 2>&1]) +AT_CHECK([tail -n 1 p2.pcap.txt], [0], [dnl +0a8f394fe0738abf7e2f058408004500003433e0400040060904c0a87b02c0a80101d4781451a962ad5417ed297b801000e5c1fd00000101080a2524d2345c7fe1c4 +]) + +# Push a packet with bad csum and offloading enabled to check +# if the driver updates and fixes the csum. +AT_CHECK([ovs-vsctl set Interface p1 options:ol_ip_csum=true]) +AT_CHECK([ovs-vsctl set Interface p1 options:ol_ip_csum_set_good=true]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 \ +0a8f394fe0738abf7e2f058408004500003433e0400040068f03c0a87b02c0a87b01d4781451a962ad5417ed297b801000e547fd00000101080a2524d2345c7fe1c4 +]) +AT_CHECK([ovs-pcap p2.pcap > p2.pcap.txt 2>&1]) +AT_CHECK([tail -n 1 p2.pcap.txt], [0], [dnl +0a8f394fe0738abf7e2f058408004500003433e0400040060990c0a87b02c0a80101d4781451a962ad5417ed297b801000e5c1fd00000101080a2524d2345c7fe1c4 +]) +OVS_VSWITCHD_STOP +AT_CLEANUP diff --git a/tests/system-userspace-testsuite.at b/tests/system-userspace-testsuite.at index 2e9659a67..1021b4ad4 100644 --- a/tests/system-userspace-testsuite.at +++ b/tests/system-userspace-testsuite.at @@ -25,5 +25,6 @@ m4_include([tests/system-common-macros.at]) m4_include([tests/system-traffic.at]) m4_include([tests/system-layer3-tunnels.at]) m4_include([tests/system-interface.at]) +m4_include([tests/system-userspace-offload.at]) m4_include([tests/system-userspace-packet-type-aware.at]) m4_include([tests/system-route.at])