All of lore.kernel.org
 help / color / mirror / Atom feed
From: Akihiko Odaki <akihiko.odaki@daynix.com>
Cc: "Sriram Yagnaraman" <sriram.yagnaraman@est.tech>,
	"Jason Wang" <jasowang@redhat.com>,
	"Dmitry Fleytman" <dmitry.fleytman@gmail.com>,
	"Michael S . Tsirkin" <mst@redhat.com>,
	"Alex Bennée" <alex.bennee@linaro.org>,
	"Philippe Mathieu-Daudé" <philmd@linaro.org>,
	"Thomas Huth" <thuth@redhat.com>,
	"Wainer dos Santos Moschetta" <wainersm@redhat.com>,
	"Beraldo Leal" <bleal@redhat.com>,
	"Cleber Rosa" <crosa@redhat.com>,
	"Laurent Vivier" <lvivier@redhat.com>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	qemu-devel@nongnu.org,
	"Tomasz Dzieciol" <t.dzieciol@partner.samsung.com>,
	"Akihiko Odaki" <akihiko.odaki@daynix.com>
Subject: [PATCH v5 31/48] net/eth: Always add VLAN tag
Date: Tue, 23 May 2023 11:43:22 +0900	[thread overview]
Message-ID: <20230523024339.50875-32-akihiko.odaki@daynix.com> (raw)
In-Reply-To: <20230523024339.50875-1-akihiko.odaki@daynix.com>

It is possible to have another VLAN tag even if the packet is already
tagged.

Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
---
 include/net/eth.h   |  4 ++--
 hw/net/net_tx_pkt.c | 16 +++++++---------
 net/eth.c           | 22 ++++++----------------
 3 files changed, 15 insertions(+), 27 deletions(-)

diff --git a/include/net/eth.h b/include/net/eth.h
index 95ff24d6b8..048e434685 100644
--- a/include/net/eth.h
+++ b/include/net/eth.h
@@ -353,8 +353,8 @@ eth_strip_vlan_ex(const struct iovec *iov, int iovcnt, size_t iovoff,
 uint16_t
 eth_get_l3_proto(const struct iovec *l2hdr_iov, int iovcnt, size_t l2hdr_len);
 
-void eth_setup_vlan_headers(struct eth_header *ehdr, uint16_t vlan_tag,
-    uint16_t vlan_ethtype, bool *is_new);
+void eth_setup_vlan_headers(struct eth_header *ehdr, size_t *ehdr_size,
+                            uint16_t vlan_tag, uint16_t vlan_ethtype);
 
 
 uint8_t eth_get_gso_type(uint16_t l3_proto, uint8_t *l3_hdr, uint8_t l4proto);
diff --git a/hw/net/net_tx_pkt.c b/hw/net/net_tx_pkt.c
index ce6b102391..af8f77a3f0 100644
--- a/hw/net/net_tx_pkt.c
+++ b/hw/net/net_tx_pkt.c
@@ -40,7 +40,10 @@ struct NetTxPkt {
 
     struct iovec *vec;
 
-    uint8_t l2_hdr[ETH_MAX_L2_HDR_LEN];
+    struct {
+        struct eth_header eth;
+        struct vlan_header vlan[3];
+    } l2_hdr;
     union {
         struct ip_header ip;
         struct ip6_header ip6;
@@ -365,18 +368,13 @@ bool net_tx_pkt_build_vheader(struct NetTxPkt *pkt, bool tso_enable,
 void net_tx_pkt_setup_vlan_header_ex(struct NetTxPkt *pkt,
     uint16_t vlan, uint16_t vlan_ethtype)
 {
-    bool is_new;
     assert(pkt);
 
     eth_setup_vlan_headers(pkt->vec[NET_TX_PKT_L2HDR_FRAG].iov_base,
-        vlan, vlan_ethtype, &is_new);
+                           &pkt->vec[NET_TX_PKT_L2HDR_FRAG].iov_len,
+                           vlan, vlan_ethtype);
 
-    /* update l2hdrlen */
-    if (is_new) {
-        pkt->hdr_len += sizeof(struct vlan_header);
-        pkt->vec[NET_TX_PKT_L2HDR_FRAG].iov_len +=
-            sizeof(struct vlan_header);
-    }
+    pkt->hdr_len += sizeof(struct vlan_header);
 }
 
 bool net_tx_pkt_add_raw_fragment(struct NetTxPkt *pkt, void *base, size_t len)
diff --git a/net/eth.c b/net/eth.c
index f7ffbda600..5307978486 100644
--- a/net/eth.c
+++ b/net/eth.c
@@ -21,26 +21,16 @@
 #include "net/checksum.h"
 #include "net/tap.h"
 
-void eth_setup_vlan_headers(struct eth_header *ehdr, uint16_t vlan_tag,
-    uint16_t vlan_ethtype, bool *is_new)
+void eth_setup_vlan_headers(struct eth_header *ehdr, size_t *ehdr_size,
+                            uint16_t vlan_tag, uint16_t vlan_ethtype)
 {
     struct vlan_header *vhdr = PKT_GET_VLAN_HDR(ehdr);
 
-    switch (be16_to_cpu(ehdr->h_proto)) {
-    case ETH_P_VLAN:
-    case ETH_P_DVLAN:
-        /* vlan hdr exists */
-        *is_new = false;
-        break;
-
-    default:
-        /* No VLAN header, put a new one */
-        vhdr->h_proto = ehdr->h_proto;
-        ehdr->h_proto = cpu_to_be16(vlan_ethtype);
-        *is_new = true;
-        break;
-    }
+    memmove(vhdr + 1, vhdr, *ehdr_size - ETH_HLEN);
     vhdr->h_tci = cpu_to_be16(vlan_tag);
+    vhdr->h_proto = ehdr->h_proto;
+    ehdr->h_proto = cpu_to_be16(vlan_ethtype);
+    *ehdr_size += sizeof(*vhdr);
 }
 
 uint8_t
-- 
2.40.1



  parent reply	other threads:[~2023-05-23  2:46 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-05-23  2:42 [PATCH v5 00/48] igb: Fix for DPDK Akihiko Odaki
2023-05-23  2:42 ` [PATCH v5 01/48] hw/net/net_tx_pkt: Decouple implementation from PCI Akihiko Odaki
2023-05-23  2:42 ` [PATCH v5 02/48] hw/net/net_tx_pkt: Decouple interface " Akihiko Odaki
2023-05-23  2:42 ` [PATCH v5 03/48] e1000x: Fix BPRC and MPRC Akihiko Odaki
2023-05-23  2:42 ` [PATCH v5 04/48] igb: Fix Rx packet type encoding Akihiko Odaki
2023-05-23  2:42 ` [PATCH v5 05/48] igb: Do not require CTRL.VME for tx VLAN tagging Akihiko Odaki
2023-05-23  2:42 ` [PATCH v5 06/48] igb: Clear IMS bits when committing ICR access Akihiko Odaki
2023-05-23  2:42 ` [PATCH v5 07/48] net/net_rx_pkt: Use iovec for net_rx_pkt_set_protocols() Akihiko Odaki
2023-05-23  2:42 ` [PATCH v5 08/48] e1000e: Always copy ethernet header Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 09/48] igb: " Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 10/48] Fix references to igb Avocado test Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 11/48] tests/avocado: Remove unused imports Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 12/48] tests/avocado: Remove test_igb_nomsi_kvm Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 13/48] hw/net/net_tx_pkt: Remove net_rx_pkt_get_l4_info Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 14/48] net/eth: Rename eth_setup_vlan_headers_ex Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 15/48] e1000x: Share more Rx filtering logic Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 16/48] e1000x: Take CRC into consideration for size check Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 17/48] e1000x: Rename TcpIpv6 into TcpIpv6Ex Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 18/48] e1000e: Always log status after building rx metadata Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 19/48] igb: " Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 20/48] igb: Remove goto Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 21/48] igb: Read DCMD.VLE of the first Tx descriptor Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 22/48] e1000e: Reset packet state after emptying Tx queue Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 23/48] vmxnet3: " Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 24/48] igb: Add more definitions for Tx descriptor Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 25/48] igb: Share common VF constants Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 26/48] igb: Fix igb_mac_reg_init coding style alignment Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 27/48] igb: Clear EICR bits for delayed MSI-X interrupts Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 28/48] e1000e: Rename a variable in e1000e_receive_internal() Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 29/48] igb: Rename a variable in igb_receive_internal() Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 30/48] net/eth: Use void pointers Akihiko Odaki
2023-05-23  2:43 ` Akihiko Odaki [this message]
2023-05-23  2:43 ` [PATCH v5 32/48] hw/net/net_rx_pkt: Enforce alignment for eth_header Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 33/48] tests/qtest/libqos/igb: Set GPIE.Multiple_MSIX Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 34/48] igb: Implement MSI-X single vector mode Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 35/48] igb: Use UDP for RSS hash Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 36/48] igb: Implement Rx SCTP CSO Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 37/48] igb: Implement Tx " Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 38/48] igb: Strip the second VLAN tag for extended VLAN Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 39/48] igb: Filter with " Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 40/48] igb: Implement igb-specific oversize check Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 41/48] igb: Implement Rx PTP2 timestamp Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 42/48] igb: Implement Tx timestamp Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 43/48] e1000e: Notify only new interrupts Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 44/48] igb: " Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 45/48] igb: Clear-on-read ICR when ICR.INTA is set Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 46/48] vmxnet3: Do not depend on PC Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 47/48] MAINTAINERS: Add a reviewer for network packet abstractions Akihiko Odaki
2023-05-23  2:43 ` [PATCH v5 48/48] docs/system/devices/igb: Note igb is tested for DPDK Akihiko Odaki

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230523024339.50875-32-akihiko.odaki@daynix.com \
    --to=akihiko.odaki@daynix.com \
    --cc=alex.bennee@linaro.org \
    --cc=bleal@redhat.com \
    --cc=crosa@redhat.com \
    --cc=dmitry.fleytman@gmail.com \
    --cc=jasowang@redhat.com \
    --cc=lvivier@redhat.com \
    --cc=mst@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=philmd@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=sriram.yagnaraman@est.tech \
    --cc=t.dzieciol@partner.samsung.com \
    --cc=thuth@redhat.com \
    --cc=wainersm@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.