All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ouyang Changchun <changchun.ouyang-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
To: dev-VfR2kkLFssw@public.gmane.org
Subject: [PATCH v4 05/26] ether: Add soft vlan encap/decap functions
Date: Mon,  9 Feb 2015 09:13:54 +0800	[thread overview]
Message-ID: <1423444455-11330-6-git-send-email-changchun.ouyang@intel.com> (raw)
In-Reply-To: <1423444455-11330-1-git-send-email-changchun.ouyang-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>

It is helpful to allow device drivers that don't support hardware
VLAN stripping to emulate this in software. This allows application
to be device independent.

Avoid discarding shared mbufs. Make a copy in rte_vlan_insert() of any
packet to be tagged that has a reference count > 1.

Signed-off-by: Stephen Hemminger <stephen-OTpzqLSitTUnbdJkjeBofR2eb7JE58TQ@public.gmane.org>
Signed-off-by: Changchun Ouyang <changchun.ouyang-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
---
 lib/librte_ether/rte_ether.h | 76 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 76 insertions(+)

diff --git a/lib/librte_ether/rte_ether.h b/lib/librte_ether/rte_ether.h
index 7e7d22c..74f71c2 100644
--- a/lib/librte_ether/rte_ether.h
+++ b/lib/librte_ether/rte_ether.h
@@ -49,6 +49,8 @@ extern "C" {
 
 #include <rte_memcpy.h>
 #include <rte_random.h>
+#include <rte_mbuf.h>
+#include <rte_byteorder.h>
 
 #define ETHER_ADDR_LEN  6 /**< Length of Ethernet address. */
 #define ETHER_TYPE_LEN  2 /**< Length of Ethernet type field. */
@@ -333,6 +335,80 @@ struct vxlan_hdr {
 #define ETHER_VXLAN_HLEN (sizeof(struct udp_hdr) + sizeof(struct vxlan_hdr))
 /**< VXLAN tunnel header length. */
 
+/**
+ * Extract VLAN tag information into mbuf
+ *
+ * Software version of VLAN stripping
+ *
+ * @param m
+ *   The packet mbuf.
+ * @return
+ *   - 0: Success
+ *   - 1: not a vlan packet
+ */
+static inline int rte_vlan_strip(struct rte_mbuf *m)
+{
+	struct ether_hdr *eh
+		 = rte_pktmbuf_mtod(m, struct ether_hdr *);
+
+	if (eh->ether_type != ETHER_TYPE_VLAN)
+		return -1;
+
+	struct vlan_hdr *vh = (struct vlan_hdr *)(eh + 1);
+	m->ol_flags |= PKT_RX_VLAN_PKT;
+	m->vlan_tci = rte_be_to_cpu_16(vh->vlan_tci);
+
+	/* Copy ether header over rather than moving whole packet */
+	memmove(rte_pktmbuf_adj(m, sizeof(struct vlan_hdr)),
+		eh, 2 * ETHER_ADDR_LEN);
+
+	return 0;
+}
+
+/**
+ * Insert VLAN tag into mbuf.
+ *
+ * Software version of VLAN unstripping
+ *
+ * @param m
+ *   The packet mbuf.
+ * @return
+ *   - 0: On success
+ *   -EPERM: mbuf is is shared overwriting would be unsafe
+ *   -ENOSPC: not enough headroom in mbuf
+ */
+static inline int rte_vlan_insert(struct rte_mbuf **m)
+{
+	struct ether_hdr *oh, *nh;
+	struct vlan_hdr *vh;
+
+#ifdef RTE_MBUF_REFCNT
+	/* Can't insert header if mbuf is shared */
+	if (rte_mbuf_refcnt_read(*m) > 1) {
+		struct rte_mbuf *copy;
+
+		copy = rte_pktmbuf_clone(*m, (*m)->pool);
+		if (unlikely(copy == NULL))
+			return -ENOMEM;
+		rte_pktmbuf_free(*m);
+		*m = copy;
+	}
+#endif
+	oh = rte_pktmbuf_mtod(*m, struct ether_hdr *);
+	nh = (struct ether_hdr *)
+		rte_pktmbuf_prepend(*m, sizeof(struct vlan_hdr));
+	if (nh == NULL)
+		return -ENOSPC;
+
+	memmove(nh, oh, 2 * ETHER_ADDR_LEN);
+	nh->ether_type = ETHER_TYPE_VLAN;
+
+	vh = (struct vlan_hdr *) (nh + 1);
+	vh->vlan_tci = rte_cpu_to_be_16((*m)->vlan_tci);
+
+	return 0;
+}
+
 #ifdef __cplusplus
 }
 #endif
-- 
1.8.4.2

  parent reply	other threads:[~2015-02-09  1:13 UTC|newest]

Thread overview: 132+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-15  5:15 [PATCH 00/22] Single virtio implementation Ouyang Changchun
     [not found] ` <1421298930-15210-1-git-send-email-changchun.ouyang-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2015-01-15  5:15   ` [PATCH 01/22] virtio: Rearrange resource initialization Ouyang Changchun
2015-01-15  5:15   ` [PATCH 02/22] virtio: Use weaker barriers Ouyang Changchun
2015-01-15  5:15   ` [PATCH 03/22] virtio: Allow starting with link down Ouyang Changchun
2015-01-15  5:15   ` [PATCH 04/22] virtio: Add support for Link State interrupt Ouyang Changchun
2015-01-15  5:15   ` [PATCH 05/22] ether: Add soft vlan encap/decap functions Ouyang Changchun
2015-01-15  5:15   ` [PATCH 06/22] virtio: Use software vlan stripping Ouyang Changchun
2015-01-15  5:15   ` [PATCH 07/22] virtio: Remove unnecessary adapter structure Ouyang Changchun
2015-01-15  5:15   ` [PATCH 08/22] virtio: Remove redundant vq_alignment Ouyang Changchun
2015-01-15  5:15   ` [PATCH 09/22] virtio: Fix how states are handled during initialization Ouyang Changchun
2015-01-15  5:15   ` [PATCH 10/22] virtio: Make vtpci_get_status local Ouyang Changchun
2015-01-15  5:15   ` [PATCH 11/22] virtio: Check for packet headroom at compile time Ouyang Changchun
2015-01-15  5:15   ` [PATCH 12/22] virtio: Move allocation before initialization Ouyang Changchun
2015-01-15  5:15   ` [PATCH 13/22] virtio: Add support for vlan filtering Ouyang Changchun
2015-01-15  5:15   ` [PATCH 14/22] virtio: Add suport for multiple mac addresses Ouyang Changchun
2015-01-15  5:15   ` [PATCH 15/22] virtio: Add ability to set MAC address Ouyang Changchun
2015-01-15  5:15   ` [PATCH 16/22] virtio: Free mbuf's with threshold Ouyang Changchun
2015-01-15  5:15   ` [PATCH 17/22] virtio: Use port IO to get PCI resource Ouyang Changchun
2015-01-15  5:15   ` [PATCH 18/22] virtio: Fix descriptor index issue Ouyang Changchun
     [not found]     ` <1421298930-15210-19-git-send-email-changchun.ouyang-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2015-01-15 16:54       ` Stephen Hemminger
2015-01-16  0:55         ` Ouyang, Changchun
2015-01-15  5:15   ` [PATCH 19/22] ether: Fix vlan strip/insert issue Ouyang Changchun
2015-01-15  5:15   ` [PATCH 20/22] example/vhost: Avoid inserting vlan twice Ouyang Changchun
2015-01-15  5:15   ` [PATCH 21/22] example/vhost: Add vlan-strip cmd line option Ouyang Changchun
2015-01-15  5:15   ` [PATCH 22/22] virtio: Use soft vlan strip in mergeable Rx path Ouyang Changchun
     [not found]     ` <1421298930-15210-23-git-send-email-changchun.ouyang-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2015-01-15 16:55       ` Stephen Hemminger
2015-01-16  0:56         ` Ouyang, Changchun
2015-01-27  2:35   ` [PATCH v2 00/24] Single virtio implementation Ouyang Changchun
     [not found]     ` <1422326164-13697-1-git-send-email-changchun.ouyang-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2015-01-27  2:35       ` [PATCH v2 01/24] virtio: Rearrange resource initialization Ouyang Changchun
2015-01-27  2:35       ` [PATCH v2 02/24] virtio: Use weaker barriers Ouyang Changchun
     [not found]         ` <1422326164-13697-3-git-send-email-changchun.ouyang-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2015-01-27  7:03           ` Xie, Huawei
     [not found]             ` <C37D651A908B024F974696C65296B57B0F361A10-0J0gbvR4kThpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2015-01-27  9:58               ` Stephen Hemminger
     [not found]                 ` <20150127095831.1572b67a-CA4OZQ/Yy2Lykuyl+CZolw@public.gmane.org>
2015-01-27 16:16                   ` Xie, Huawei
     [not found]                     ` <C37D651A908B024F974696C65296B57B0F362A77-0J0gbvR4kThpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2015-01-28  6:12                       ` Ouyang, Changchun
2015-01-27  7:56           ` Xie, Huawei
     [not found]             ` <C37D651A908B024F974696C65296B57B0F361AD5-0J0gbvR4kThpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2015-01-27  8:04               ` Ouyang, Changchun
2015-01-27  2:35       ` [PATCH v2 03/24] virtio: Allow starting with link down Ouyang Changchun
2015-01-27  2:35       ` [PATCH v2 04/24] virtio: Add support for Link State interrupt Ouyang Changchun
     [not found]         ` <1422326164-13697-5-git-send-email-changchun.ouyang-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2015-01-27  9:04           ` Xie, Huawei
     [not found]             ` <C37D651A908B024F974696C65296B57B0F361C0C-0J0gbvR4kThpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2015-01-27 10:00               ` Stephen Hemminger
     [not found]                 ` <20150127100006.007fbf8c-CA4OZQ/Yy2Lykuyl+CZolw@public.gmane.org>
2015-01-28  3:03                   ` Ouyang, Changchun
     [not found]                     ` <F52918179C57134FAEC9EA62FA2F96251198F0D1-E2R4CRU6q/6iAffOGbnezLfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2015-01-28 15:11                       ` Stephen Hemminger
2015-01-27  2:35       ` [PATCH v2 05/24] ether: Add soft vlan encap/decap functions Ouyang Changchun
2015-01-27  2:35       ` [PATCH v2 06/24] virtio: Use software vlan stripping Ouyang Changchun
2015-01-27  2:35       ` [PATCH v2 07/24] virtio: Remove unnecessary adapter structure Ouyang Changchun
2015-01-27  2:35       ` [PATCH v2 08/24] virtio: Remove redundant vq_alignment Ouyang Changchun
2015-01-27  2:35       ` [PATCH v2 09/24] virtio: Fix how states are handled during initialization Ouyang Changchun
2015-01-27  2:35       ` [PATCH v2 10/24] virtio: Make vtpci_get_status local Ouyang Changchun
2015-01-27  2:35       ` [PATCH v2 11/24] virtio: Check for packet headroom at compile time Ouyang Changchun
2015-01-27  2:35       ` [PATCH v2 12/24] virtio: Move allocation before initialization Ouyang Changchun
2015-01-27  2:35       ` [PATCH v2 13/24] virtio: Add support for vlan filtering Ouyang Changchun
2015-01-27  2:35       ` [PATCH v2 14/24] virtio: Add suport for multiple mac addresses Ouyang Changchun
2015-01-27  2:35       ` [PATCH v2 15/24] virtio: Add ability to set MAC address Ouyang Changchun
2015-01-27  2:35       ` [PATCH v2 16/24] virtio: Free mbuf's with threshold Ouyang Changchun
2015-01-27  2:35       ` [PATCH v2 17/24] virtio: Use port IO to get PCI resource Ouyang Changchun
2015-01-27  2:35       ` [PATCH v2 18/24] virtio: Fix descriptor index issue Ouyang Changchun
2015-01-27  2:35       ` [PATCH v2 19/24] ether: Fix vlan strip/insert issue Ouyang Changchun
2015-01-27  2:36       ` [PATCH v2 20/24] example/vhost: Avoid inserting vlan twice Ouyang Changchun
2015-01-27  2:36       ` [PATCH v2 21/24] example/vhost: Add vlan-strip cmd line option Ouyang Changchun
2015-01-27  2:36       ` [PATCH v2 22/24] virtio: Use soft vlan strip in mergeable Rx path Ouyang Changchun
2015-01-27  2:36       ` [PATCH v2 23/24] virtio: Fix zero copy break issue Ouyang Changchun
2015-01-27  2:36       ` [PATCH v2 24/24] virtio: Remove hotspots Ouyang Changchun
2015-01-27  3:06       ` [PATCH v2 00/24] Single virtio implementation Matthew Hall
     [not found]         ` <20150127030612.GA13138-Hv3ogNYU3JfZZajBQzqCxQ@public.gmane.org>
2015-01-27  3:42           ` Wiles, Keith
     [not found]             ` <D0EC568F.10DB9%keith.wiles-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2015-01-27  9:41               ` Matthew Hall
2015-01-27 10:02           ` Stephen Hemminger
     [not found]             ` <20150127100224.751850c1-CA4OZQ/Yy2Lykuyl+CZolw@public.gmane.org>
2015-01-27 18:59               ` Matthew Hall
2015-01-29  7:23       ` [PATCH v3 00/25] " Ouyang Changchun
     [not found]         ` <1422516249-14596-1-git-send-email-changchun.ouyang-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2015-01-29  7:23           ` [PATCH v3 01/25] virtio: Rearrange resource initialization Ouyang Changchun
2015-01-29  7:23           ` [PATCH v3 02/25] virtio: Use weaker barriers Ouyang Changchun
2015-01-29  7:23           ` [PATCH v3 03/25] virtio: Allow starting with link down Ouyang Changchun
2015-01-29  7:23           ` [PATCH v3 04/25] virtio: Add support for Link State interrupt Ouyang Changchun
2015-01-29  7:23           ` [PATCH v3 05/25] ether: Add soft vlan encap/decap functions Ouyang Changchun
2015-01-29  7:23           ` [PATCH v3 06/25] virtio: Use software vlan stripping Ouyang Changchun
2015-01-29  7:23           ` [PATCH v3 07/25] virtio: Remove unnecessary adapter structure Ouyang Changchun
2015-01-29  7:23           ` [PATCH v3 08/25] virtio: Remove redundant vq_alignment Ouyang Changchun
2015-01-29  7:23           ` [PATCH v3 09/25] virtio: Fix how states are handled during initialization Ouyang Changchun
2015-01-29  7:23           ` [PATCH v3 10/25] virtio: Make vtpci_get_status local Ouyang Changchun
2015-01-29  7:23           ` [PATCH v3 11/25] virtio: Check for packet headroom at compile time Ouyang Changchun
2015-01-29  7:23           ` [PATCH v3 12/25] virtio: Move allocation before initialization Ouyang Changchun
2015-01-29  7:23           ` [PATCH v3 13/25] virtio: Add support for vlan filtering Ouyang Changchun
2015-01-29  7:23           ` [PATCH v3 14/25] virtio: Add suport for multiple mac addresses Ouyang Changchun
2015-01-29  7:23           ` [PATCH v3 15/25] virtio: Add ability to set MAC address Ouyang Changchun
2015-01-29  7:24           ` [PATCH v3 16/25] virtio: Free mbuf's with threshold Ouyang Changchun
2015-01-29  7:24           ` [PATCH v3 17/25] virtio: Use port IO to get PCI resource Ouyang Changchun
     [not found]             ` <1422516249-14596-18-git-send-email-changchun.ouyang-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2015-01-29 23:14               ` Thomas Monjalon
2015-02-04  1:31                 ` Ouyang, Changchun
2015-01-29  7:24           ` [PATCH v3 18/25] virtio: Fix descriptor index issue Ouyang Changchun
2015-01-29  7:24           ` [PATCH v3 19/25] ether: Fix vlan strip/insert issue Ouyang Changchun
2015-02-04 10:54             ` Xie, Huawei
     [not found]               ` <C37D651A908B024F974696C65296B57B0F38064E-0J0gbvR4kThpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2015-02-05  0:54                 ` Ouyang, Changchun
2015-01-29  7:24           ` [PATCH v3 20/25] example/vhost: Avoid inserting vlan twice Ouyang Changchun
2015-01-29  7:24           ` [PATCH v3 21/25] example/vhost: Add vlan-strip cmd line option Ouyang Changchun
2015-01-29  7:24           ` [PATCH v3 22/25] virtio: Use soft vlan strip in mergeable Rx path Ouyang Changchun
2015-01-29  7:24           ` [PATCH v3 23/25] virtio: Fix zero copy break issue Ouyang Changchun
2015-01-29  7:24           ` [PATCH v3 24/25] virtio: Remove hotspots Ouyang Changchun
2015-01-29  7:24           ` [PATCH v3 25/25] virtio: Fix wmb issue Ouyang Changchun
2015-02-09  1:13           ` [PATCH v4 00/26] Single virtio implementation Ouyang Changchun
     [not found]             ` <1423444455-11330-1-git-send-email-changchun.ouyang-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2015-02-09  1:13               ` [PATCH v4 01/26] virtio: Rearrange resource initialization Ouyang Changchun
2015-02-09  1:13               ` [PATCH v4 02/26] virtio: Use weaker barriers Ouyang Changchun
2015-02-09  1:13               ` [PATCH v4 03/26] virtio: Allow starting with link down Ouyang Changchun
2015-02-09  1:13               ` [PATCH v4 04/26] virtio: Add support for Link State interrupt Ouyang Changchun
2015-02-09  1:13               ` Ouyang Changchun [this message]
2015-02-09  1:13               ` [PATCH v4 06/26] virtio: Use software vlan stripping Ouyang Changchun
2015-02-09  1:13               ` [PATCH v4 07/26] virtio: Remove unnecessary adapter structure Ouyang Changchun
2015-02-09  1:13               ` [PATCH v4 08/26] virtio: Remove redundant vq_alignment Ouyang Changchun
2015-02-09  1:13               ` [PATCH v4 09/26] virtio: Fix how states are handled during initialization Ouyang Changchun
2015-02-09  1:13               ` [PATCH v4 10/26] virtio: Make vtpci_get_status local Ouyang Changchun
2015-02-09  1:14               ` [PATCH v4 11/26] virtio: Check for packet headroom at compile time Ouyang Changchun
2015-02-09  1:14               ` [PATCH v4 12/26] virtio: Move allocation before initialization Ouyang Changchun
2015-02-09  1:14               ` [PATCH v4 13/26] virtio: Add support for vlan filtering Ouyang Changchun
2015-02-09  1:14               ` [PATCH v4 14/26] virtio: Add suport for multiple mac addresses Ouyang Changchun
2015-02-09  1:14               ` [PATCH v4 15/26] virtio: Add ability to set MAC address Ouyang Changchun
2015-02-09  1:14               ` [PATCH v4 16/26] virtio: Free mbuf's with threshold Ouyang Changchun
2015-02-09  1:14               ` [PATCH v4 17/26] virtio: Use port IO to get PCI resource Ouyang Changchun
     [not found]                 ` <1423444455-11330-18-git-send-email-changchun.ouyang-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2015-02-11  4:32                   ` Stephen Hemminger
     [not found]                     ` <20150210203232.6c1934ad-CA4OZQ/Yy2Lykuyl+CZolw@public.gmane.org>
2015-02-11  4:50                       ` Ouyang, Changchun
     [not found]                         ` <F52918179C57134FAEC9EA62FA2F9625119E4846-E2R4CRU6q/6iAffOGbnezLfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2015-02-11  7:29                           ` Vincent JARDIN
     [not found]                             ` <54DB04DF.4040201-pdR9zngts4EAvxtiuMwx3w@public.gmane.org>
2015-02-11 13:50                               ` Stephen Hemminger
     [not found]                                 ` <CAOaVG1476B7GehK3kWoq4zs-+iJKDcpf9fOkOM-Ge3y+hzV94w-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-02-11 14:16                                   ` Thomas Monjalon
2015-02-12  0:52                                     ` Ouyang, Changchun
2015-02-09  1:14               ` [PATCH v4 18/26] virtio: Fix descriptor index issue Ouyang Changchun
2015-02-09  1:14               ` [PATCH v4 19/26] ether: Fix vlan strip/insert issue Ouyang Changchun
2015-02-09  1:14               ` [PATCH v4 20/26] example/vhost: Avoid inserting vlan twice Ouyang Changchun
2015-02-09  1:14               ` [PATCH v4 21/26] example/vhost: Add vlan-strip cmd line option Ouyang Changchun
2015-02-09  1:14               ` [PATCH v4 22/26] virtio: Use soft vlan strip in mergeable Rx path Ouyang Changchun
2015-02-09  1:14               ` [PATCH v4 23/26] virtio: Fix zero copy break issue Ouyang Changchun
2015-02-09  1:14               ` [PATCH v4 24/26] virtio: Remove hotspots Ouyang Changchun
2015-02-09  1:14               ` [PATCH v4 25/26] virtio: Fix wmb issue Ouyang Changchun
2015-02-09  1:14               ` [PATCH v4 26/26] virtio: Fix updating vring descriptor index issue Ouyang Changchun
2015-02-17  6:04             ` [PATCH v4 00/26] Single virtio implementation Xie, Huawei
     [not found]               ` <C37D651A908B024F974696C65296B57B0F39ADCC-0J0gbvR4kThpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2015-02-20 18:06                 ` Thomas Monjalon

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=1423444455-11330-6-git-send-email-changchun.ouyang@intel.com \
    --to=changchun.ouyang-ral2jqcrhueavxtiumwx3w@public.gmane.org \
    --cc=dev-VfR2kkLFssw@public.gmane.org \
    /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.