Skip to contentSkip to conversation

net/tap: support flow API

PATCH Superseded Pascal Mazon 3 participants 57 messages Mar 3, 2017 – Mar 23, 2017 Network drivers

lore
Share & tools
lore
#0 lore raw

cover net/tap: support flow API

This series add support for the flow API in tap PMD.

It enables filtering specific packets incoming on the tap netdevice, to process only desired ones. Under the hood, it uses kernel TC (traffic control), which takes place very early in the stack, and supports most common pattern items and actions defined in the flow API.

This series applies on top of:

[PATCH 0/6] net/tap: add additional management ops

Pascal Mazon (4):
net/tap: move private elements to external header net/tap: add preliminary support for rte_flow net/tap: add netlink back-end for flow API net/tap: add basic flow API patterns and actions

 doc/guides/nics/features/tap.ini |    1 +
 drivers/net/tap/Makefile         |   39 ++
 drivers/net/tap/rte_eth_tap.c    |   73 +--
 drivers/net/tap/tap.h            |   76 +++
 drivers/net/tap/tap_flow.c       | 1050 ++++++++++++++++++++++++++++++++++++++
 drivers/net/tap/tap_flow.h       |   58 +++
 drivers/net/tap/tap_netlink.c    |  367 +++++++++++++
 drivers/net/tap/tap_netlink.h    |   69 +++
 drivers/net/tap/tap_tcmsgs.c     |  378 ++++++++++++++
 drivers/net/tap/tap_tcmsgs.h     |   63 +++
 10 files changed, 2140 insertions(+), 34 deletions(-)
 create mode 100644 drivers/net/tap/tap.h
 create mode 100644 drivers/net/tap/tap_flow.c
 create mode 100644 drivers/net/tap/tap_flow.h
 create mode 100644 drivers/net/tap/tap_netlink.c
 create mode 100644 drivers/net/tap/tap_netlink.h
 create mode 100644 drivers/net/tap/tap_tcmsgs.c
 create mode 100644 drivers/net/tap/tap_tcmsgs.h
Signature · 1 line
2.8.0.rc0
#1 lore raw

PATCH 1/4 net/tap: move private elements to external header

In the next patch, access to struct pmd_internals will be necessary in tap_flow.c to store the flows.

---
 drivers/net/tap/Makefile      |  1 +
 drivers/net/tap/rte_eth_tap.c | 34 ++------------------
 drivers/net/tap/tap.h         | 73 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 76 insertions(+), 32 deletions(-)
 create mode 100644 drivers/net/tap/tap.h
drivers/net/tap/Makefile +1 -0
index e18f30c56f52..bdbe69e62a4e 100644
@@ -40,6 +40,7 @@ EXPORT_MAP := rte_pmd_tap_version.map
 LIBABIVER := 1
 
 CFLAGS += -O3
+CFLAGS += -I$(SRCDIR)
 CFLAGS += $(WERROR_FLAGS)
 
 #
drivers/net/tap/rte_eth_tap.c +2 -32
index 3fd057225ab3..fa57d645f3b1 100644
@@ -51,6 +51,8 @@
 #include <linux/if_ether.h>
 #include <fcntl.h>
 
+#include <tap.h>
+
 /* Linux based path to the TUN device */
 #define TUN_TAP_DEV_PATH        "/dev/net/tun"
 #define DEFAULT_TAP_NAME        "dtap"
@@ -83,38 +85,6 @@ static struct rte_eth_link pmd_link = {
 	.link_autoneg = ETH_LINK_SPEED_AUTONEG
 };
 
-struct pkt_stats {
-	uint64_t opackets;		/* Number of output packets */
-	uint64_t ipackets;		/* Number of input packets */
-	uint64_t obytes;		/* Number of bytes on output */
-	uint64_t ibytes;		/* Number of bytes on input */
-	uint64_t errs;			/* Number of error packets */
-};
-
-struct rx_queue {
-	struct rte_mempool *mp;		/* Mempool for RX packets */
-	uint16_t in_port;		/* Port ID */
-	int fd;
-
-	struct pkt_stats stats;		/* Stats for this RX queue */
-};
-
-struct tx_queue {
-	int fd;
-	struct pkt_stats stats;		/* Stats for this TX queue */
-};
-
-struct pmd_internals {
-	char name[RTE_ETH_NAME_MAX_LEN];	/* Internal Tap device name */
-	uint16_t nb_queues;		/* Number of queues supported */
-	struct ether_addr eth_addr;	/* Mac address of the device port */
-
-	int if_index;			/* IF_INDEX for the port */
-
-	struct rx_queue rxq[RTE_PMD_TAP_MAX_QUEUES];	/* List of RX queues */
-	struct tx_queue txq[RTE_PMD_TAP_MAX_QUEUES];	/* List of TX queues */
-};
-
 /* Tun/Tap allocation routine
  *
  * name is the number of the interface to use, unless NULL to take the host
drivers/net/tap/tap.h new file +73 -0

73 lines not on this page · raw message

Signature · 1 line
2.8.0.rc0
#2 lore raw

Re: [PATCH 1/4] net/tap: move private elements to external header

Quoted 146 lines · Pascal Mazon

In the next patch, access to struct pmd_internals will be necessary in tap_flow.c to store the flows.

---

drivers/net/tap/Makefile      |  1 +
drivers/net/tap/rte_eth_tap.c | 34 ++------------------
drivers/net/tap/tap.h         | 73 +++++++++++++++++++++++++++++++++++++++++++
3 files changed, 76 insertions(+), 32 deletions(-)

create mode 100644 drivers/net/tap/tap.h

drivers/net/tap/Makefile +0 -0
index e18f30c56f52..bdbe69e62a4e 100644
@@ -40,6 +40,7 @@ EXPORT_MAP := rte_pmd_tap_version.map

LIBABIVER := 1

CFLAGS += -O3
+CFLAGS += -I$(SRCDIR)
CFLAGS += $(WERROR_FLAGS)

#

drivers/net/tap/rte_eth_tap.c +2 -32
index 3fd057225ab3..fa57d645f3b1 100644
@@ -51,6 +51,8 @@
 #include <linux/if_ether.h>
 #include <fcntl.h>
 
+#include <tap.h>
+
 /* Linux based path to the TUN device */
 #define TUN_TAP_DEV_PATH        "/dev/net/tun"
 #define DEFAULT_TAP_NAME        "dtap"
@@ -83,38 +85,6 @@ static struct rte_eth_link pmd_link = {
 	.link_autoneg = ETH_LINK_SPEED_AUTONEG
 };
 
-struct pkt_stats {
-	uint64_t opackets;		/* Number of output packets */
-	uint64_t ipackets;		/* Number of input packets */
-	uint64_t obytes;		/* Number of bytes on output */
-	uint64_t ibytes;		/* Number of bytes on input */
-	uint64_t errs;			/* Number of error packets */
-};
-
-struct rx_queue {
-	struct rte_mempool *mp;		/* Mempool for RX packets */
-	uint16_t in_port;		/* Port ID */
-	int fd;
-
-	struct pkt_stats stats;		/* Stats for this RX queue */
-};
-
-struct tx_queue {
-	int fd;
-	struct pkt_stats stats;		/* Stats for this TX queue */
-};
-
-struct pmd_internals {
-	char name[RTE_ETH_NAME_MAX_LEN];	/* Internal Tap device name */
-	uint16_t nb_queues;		/* Number of queues supported */
-	struct ether_addr eth_addr;	/* Mac address of the device port */
-
-	int if_index;			/* IF_INDEX for the port */
-
-	struct rx_queue rxq[RTE_PMD_TAP_MAX_QUEUES];	/* List of RX queues */
-	struct tx_queue txq[RTE_PMD_TAP_MAX_QUEUES];	/* List of TX queues */
-};
-
 /* Tun/Tap allocation routine
 *
 * name is the number of the interface to use, unless NULL to take the host
drivers/net/tap/tap.h new file +61 -0
new file mode 100644
index 000000000000..88f62b895feb
@@ -0,0 +1,73 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright 2017 6WIND S.A.
+ *   Copyright 2017 Mellanox.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of 6WIND S.A. nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _TAP_H_
+#define _TAP_H_
+
+#include <inttypes.h>
+
+#include <rte_ethdev.h>
+#include <rte_ether.h>
+
+#define RTE_PMD_TAP_MAX_QUEUES 16
+
+struct pkt_stats {
+	uint64_t opackets; /* Number of output packets */
+	uint64_t ipackets; /* Number of input packets */
+	uint64_t obytes; /* Number of bytes on output */
+	uint64_t ibytes; /* Number of bytes on input */
+	uint64_t errs; /* Number of error packets */
+};
+
+struct rx_queue {
+	struct rte_mempool *mp; /* Mempool for RX packets */
+	uint16_t in_port; /* Port ID */
+	int fd;
+	struct pkt_stats stats; /* Stats for this RX queue */
+};
+
+struct tx_queue {
+	int fd;
+	struct pkt_stats stats; /* Stats for this TX queue */

drivers/net/tap/tap.h line 71

Quoted 10 lines
drivers/net/tap/tap.h new file +10 -0
+};
+
+struct pmd_internals {
+	char name[RTE_ETH_NAME_MAX_LEN]; /* Internal Tap device name */
+	uint16_t nb_queues; /* Number of queues supported */
+	struct ether_addr eth_addr; /* Mac address of the device port */
+	int if_index; /* IF_INDEX for the port */
+	struct rx_queue rxq[RTE_PMD_TAP_MAX_QUEUES]; /* List of RX queues */
+	struct tx_queue txq[RTE_PMD_TAP_MAX_QUEUES]; /* List of TX queues */
+};

I guess I am going to be a bit picky here on the formatting. Moving the code from .c to .h you compress a lot of white space out and now I think it is very hard to read. Can you add back some of the white space for readability.

Quoted 5 lines
drivers/net/tap/tap.h new file +2 -0
+
+#endif /* _TAP_H_ */
Signature · 1 line
2.8.0.rc0

Regards,
Keith

#3 lore raw

Re: [PATCH 1/4] net/tap: move private elements to external header

Quoted 185 lines · Keith
Quoted 185 lines

On Mar 3, 2017, at 4:45 AM, Pascal Mazon <[email protected]> wrote:

In the next patch, access to struct pmd_internals will be necessary in tap_flow.c to store the flows.

---

drivers/net/tap/Makefile      |  1 +
drivers/net/tap/rte_eth_tap.c | 34 ++------------------
drivers/net/tap/tap.h         | 73

+++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+), 32 deletions(-) create mode 100644 drivers/net/tap/tap.h

drivers/net/tap/Makefile +0 -0
index e18f30c56f52..bdbe69e62a4e 100644
@@ -40,6 +40,7 @@ EXPORT_MAP := rte_pmd_tap_version.map

LIBABIVER := 1

CFLAGS += -O3
+CFLAGS += -I$(SRCDIR)
CFLAGS += $(WERROR_FLAGS)

#

(quoted diff) +0 -0

b/drivers/net/tap/rte_eth_tap.c index 3fd057225ab3..fa57d645f3b1 100644 --- a/drivers/net/tap/rte_eth_tap.c
+++ b/drivers/net/tap/rte_eth_tap.c

drivers/net/tap/Makefile +2 -2
@@ -51,6 +51,8 @@
 #include <linux/if_ether.h>
 #include <fcntl.h>
 
+#include <tap.h>
+
 /* Linux based path to the TUN device */
 #define TUN_TAP_DEV_PATH        "/dev/net/tun"
 #define DEFAULT_TAP_NAME        "dtap"
@@ -83,38 +85,6 @@ static struct rte_eth_link pmd_link = {
 	.link_autoneg = ETH_LINK_SPEED_AUTONEG
 };
 
-struct pkt_stats {
-	uint64_t opackets;		/* Number of output

packets */

drivers/net/tap/Makefile +0 -1
-	uint64_t ipackets;		/* Number of input

packets */

drivers/net/tap/Makefile +0 -1
-	uint64_t obytes;		/* Number of bytes on

output */

drivers/net/tap/Makefile +0 -1
-	uint64_t ibytes;		/* Number of bytes on

input */

drivers/net/tap/Makefile +0 -1
-	uint64_t errs;			/* Number of error

packets */ -};

drivers/net/tap/Makefile +0 -3
-
-struct rx_queue {
-	struct rte_mempool *mp;		/* Mempool for RX

packets */

drivers/net/tap/Makefile +0 -4
-	uint16_t in_port;		/* Port ID */
-	int fd;
-
-	struct pkt_stats stats;		/* Stats for this

RX queue */ -};

drivers/net/tap/Makefile +0 -4
-
-struct tx_queue {
-	int fd;
-	struct pkt_stats stats;		/* Stats for this

TX queue */ -};

drivers/net/tap/Makefile +0 -3
-
-struct pmd_internals {
-	char name[RTE_ETH_NAME_MAX_LEN];	/* Internal Tap

device name */

drivers/net/tap/Makefile +0 -1
-	uint16_t nb_queues;		/* Number of queues

supported */

drivers/net/tap/Makefile +0 -1
-	struct ether_addr eth_addr;	/* Mac address of the

device port */ -

drivers/net/tap/Makefile +0 -1
-	int if_index;			/* IF_INDEX for the

port */ -

drivers/net/tap/Makefile +0 -1
-	struct rx_queue rxq[RTE_PMD_TAP_MAX_QUEUES];	/*

List of RX queues */

drivers/net/tap/Makefile +0 -1
-	struct tx_queue txq[RTE_PMD_TAP_MAX_QUEUES];	/*

List of TX queues */ -};
-
/* Tun/Tap allocation routine
*
* name is the number of the interface to use, unless NULL to take
the host diff --git a/drivers/net/tap/tap.h b/drivers/net/tap/tap.h new file mode 100644
index 000000000000..88f62b895feb

drivers/net/tap/tap.h new file +7 -0
@@ -0,0 +1,73 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright 2017 6WIND S.A.
+ *   Copyright 2017 Mellanox.
+ *
+ *   Redistribution and use in source and binary forms, with or

without
+ * modification, are permitted provided that the following
conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above
copyright
+ * notice, this list of conditions and the following
disclaimer.
+ * * Redistributions in binary form must reproduce the above
copyright
+ * notice, this list of conditions and the following
disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of 6WIND S.A. nor the names of its
+ * contributors may be used to endorse or promote products
derived
+ * from this software without specific prior written
permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.
+ */

drivers/net/tap/tap.h new file +33 -0
+
+#ifndef _TAP_H_
+#define _TAP_H_
+
+#include <inttypes.h>
+
+#include <rte_ethdev.h>
+#include <rte_ether.h>
+
+#define RTE_PMD_TAP_MAX_QUEUES 16
+
+struct pkt_stats {
+	uint64_t opackets; /* Number of output packets */
+	uint64_t ipackets; /* Number of input packets */
+	uint64_t obytes; /* Number of bytes on output */
+	uint64_t ibytes; /* Number of bytes on input */
+	uint64_t errs; /* Number of error packets */
+};
+
+struct rx_queue {
+	struct rte_mempool *mp; /* Mempool for RX packets */
+	uint16_t in_port; /* Port ID */
+	int fd;
+	struct pkt_stats stats; /* Stats for this RX queue */
+};
+
+struct tx_queue {
+	int fd;
+	struct pkt_stats stats; /* Stats for this TX queue */
+};
+
+struct pmd_internals {
+	char name[RTE_ETH_NAME_MAX_LEN]; /* Internal Tap device

name */

drivers/net/tap/tap.h new file +2 -0
+	uint16_t nb_queues; /* Number of queues supported */
+	struct ether_addr eth_addr; /* Mac address of the device

port */

drivers/net/tap/tap.h new file +2 -0
+	int if_index; /* IF_INDEX for the port */
+	struct rx_queue rxq[RTE_PMD_TAP_MAX_QUEUES]; /* List of RX
Quoted 9 lines
Quoted 3 lines

queues */

drivers/net/tap/tap.h new file +1 -0
+	struct tx_queue txq[RTE_PMD_TAP_MAX_QUEUES]; /* List of TX

queues */ +};

I guess I am going to be a bit picky here on the formatting. Moving the code from .c to .h you compress a lot of white space out and now I think it is very hard to read. Can you add back some of the white space for readability.

Do you mean whitespaces between ";" and the comment, or do you mean line jumps? Would you rather have it look like what's described there?
http://dpdk.org/doc/guides/contributing/coding_style.html#structure-declarations

Regards,
Pascal

Quoted 9 lines
Quoted 5 lines
drivers/net/tap/tap.h new file +2 -0
+
+#endif /* _TAP_H_ */
Signature · 1 line
2.8.0.rc0

Regards,
Keith

#4 lore raw

Re: [PATCH 1/4] net/tap: move private elements to external header

Quoted 201 lines · Pascal Mazon
Quoted 185 lines · Keith
Quoted 185 lines

On Mar 3, 2017, at 4:45 AM, Pascal Mazon <[email protected]> wrote:

In the next patch, access to struct pmd_internals will be necessary in tap_flow.c to store the flows.

---

drivers/net/tap/Makefile      |  1 +
drivers/net/tap/rte_eth_tap.c | 34 ++------------------
drivers/net/tap/tap.h         | 73

+++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+), 32 deletions(-) create mode 100644 drivers/net/tap/tap.h

drivers/net/tap/Makefile +0 -0
index e18f30c56f52..bdbe69e62a4e 100644
@@ -40,6 +40,7 @@ EXPORT_MAP := rte_pmd_tap_version.map

LIBABIVER := 1

CFLAGS += -O3
+CFLAGS += -I$(SRCDIR)
CFLAGS += $(WERROR_FLAGS)

#

(quoted diff) +0 -0

b/drivers/net/tap/rte_eth_tap.c index 3fd057225ab3..fa57d645f3b1 100644 --- a/drivers/net/tap/rte_eth_tap.c
+++ b/drivers/net/tap/rte_eth_tap.c

drivers/net/tap/Makefile +2 -2
@@ -51,6 +51,8 @@
 #include <linux/if_ether.h>
 #include <fcntl.h>
 
+#include <tap.h>
+
 /* Linux based path to the TUN device */
 #define TUN_TAP_DEV_PATH        "/dev/net/tun"
 #define DEFAULT_TAP_NAME        "dtap"
@@ -83,38 +85,6 @@ static struct rte_eth_link pmd_link = {
 	.link_autoneg = ETH_LINK_SPEED_AUTONEG
 };
 
-struct pkt_stats {
-	uint64_t opackets;		/* Number of output

packets */

drivers/net/tap/Makefile +0 -1
-	uint64_t ipackets;		/* Number of input

packets */

drivers/net/tap/Makefile +0 -1
-	uint64_t obytes;		/* Number of bytes on

output */

drivers/net/tap/Makefile +0 -1
-	uint64_t ibytes;		/* Number of bytes on

input */

drivers/net/tap/Makefile +0 -1
-	uint64_t errs;			/* Number of error

packets */ -};

drivers/net/tap/Makefile +0 -3
-
-struct rx_queue {
-	struct rte_mempool *mp;		/* Mempool for RX

packets */

drivers/net/tap/Makefile +0 -4
-	uint16_t in_port;		/* Port ID */
-	int fd;
-
-	struct pkt_stats stats;		/* Stats for this

RX queue */ -};

drivers/net/tap/Makefile +0 -4
-
-struct tx_queue {
-	int fd;
-	struct pkt_stats stats;		/* Stats for this

TX queue */ -};

drivers/net/tap/Makefile +0 -3
-
-struct pmd_internals {
-	char name[RTE_ETH_NAME_MAX_LEN];	/* Internal Tap

device name */

drivers/net/tap/Makefile +0 -1
-	uint16_t nb_queues;		/* Number of queues

supported */

drivers/net/tap/Makefile +0 -1
-	struct ether_addr eth_addr;	/* Mac address of the

device port */ -

drivers/net/tap/Makefile +0 -1
-	int if_index;			/* IF_INDEX for the

port */ -

drivers/net/tap/Makefile +0 -1
-	struct rx_queue rxq[RTE_PMD_TAP_MAX_QUEUES];	/*

List of RX queues */

drivers/net/tap/Makefile +0 -1
-	struct tx_queue txq[RTE_PMD_TAP_MAX_QUEUES];	/*

List of TX queues */ -};
-
/* Tun/Tap allocation routine
*
* name is the number of the interface to use, unless NULL to take the host diff --git a/drivers/net/tap/tap.h b/drivers/net/tap/tap.h new file mode 100644
index 000000000000..88f62b895feb

drivers/net/tap/tap.h new file +7 -0
@@ -0,0 +1,73 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright 2017 6WIND S.A.
+ *   Copyright 2017 Mellanox.
+ *
+ *   Redistribution and use in source and binary forms, with or

without
+ * modification, are permitted provided that the following
conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above
copyright
+ * notice, this list of conditions and the following
disclaimer.
+ * * Redistributions in binary form must reproduce the above
copyright
+ * notice, this list of conditions and the following
disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of 6WIND S.A. nor the names of its
+ * contributors may be used to endorse or promote products
derived
+ * from this software without specific prior written
permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.
+ */

drivers/net/tap/tap.h new file +33 -0
+
+#ifndef _TAP_H_
+#define _TAP_H_
+
+#include <inttypes.h>
+
+#include <rte_ethdev.h>
+#include <rte_ether.h>
+
+#define RTE_PMD_TAP_MAX_QUEUES 16
+
+struct pkt_stats {
+	uint64_t opackets; /* Number of output packets */
+	uint64_t ipackets; /* Number of input packets */
+	uint64_t obytes; /* Number of bytes on output */
+	uint64_t ibytes; /* Number of bytes on input */
+	uint64_t errs; /* Number of error packets */
+};
+
+struct rx_queue {
+	struct rte_mempool *mp; /* Mempool for RX packets */
+	uint16_t in_port; /* Port ID */
+	int fd;
+	struct pkt_stats stats; /* Stats for this RX queue */
+};
+
+struct tx_queue {
+	int fd;
+	struct pkt_stats stats; /* Stats for this TX queue */
+};
+
+struct pmd_internals {
+	char name[RTE_ETH_NAME_MAX_LEN]; /* Internal Tap device

name */

drivers/net/tap/tap.h new file +2 -0
+	uint16_t nb_queues; /* Number of queues supported */
+	struct ether_addr eth_addr; /* Mac address of the device

port */

drivers/net/tap/tap.h new file +2 -0
+	int if_index; /* IF_INDEX for the port */
+	struct rx_queue rxq[RTE_PMD_TAP_MAX_QUEUES]; /* List of RX
Quoted 9 lines
Quoted 3 lines

queues */

drivers/net/tap/tap.h new file +1 -0
+	struct tx_queue txq[RTE_PMD_TAP_MAX_QUEUES]; /* List of TX

queues */ +};

I guess I am going to be a bit picky here on the formatting. Moving the code from .c to .h you compress a lot of white space out and now I think it is very hard to read. Can you add back some of the white space for readability.

Quoted 3 lines

Do you mean whitespaces between ";" and the comment, or do you mean line jumps? Would you rather have it look like what's described there?
http://dpdk.org/doc/guides/contributing/coding_style.html#structure-declarations

The spaces between the ; and comment is what I wanted here. The extra blank lines are optional to break up the structure some is good as well. You do not need to align the variables in the same columns as long as the comments are spaced out and aligned would be nice.

To me white space is your friend when writing code and the compiler does not care normally :-)

Quoted 14 lines

Regards,
Pascal

Quoted 9 lines
Quoted 5 lines
drivers/net/tap/tap.h new file +2 -0
+
+#endif /* _TAP_H_ */
Signature · 1 line
2.8.0.rc0

Regards,
Keith

Regards,
Keith

#5 lore raw

PATCH 2/4 net/tap: add preliminary support for rte_flow

In reply to Pascal Mazon

The flow API provides the ability to classify packets received by a tap netdevice.

This patch only implements skeleton functions for flow API support, no patterns are supported yet.

---
 doc/guides/nics/features/tap.ini |   1 +
 drivers/net/tap/Makefile         |   1 +
 drivers/net/tap/rte_eth_tap.c    |   6 ++
 drivers/net/tap/tap.h            |   2 +
 drivers/net/tap/tap_flow.c       | 185 +++++++++++++++++++++++++++++++++++++++
 drivers/net/tap/tap_flow.h       |  46 ++++++++++
 6 files changed, 241 insertions(+)
 create mode 100644 drivers/net/tap/tap_flow.c
 create mode 100644 drivers/net/tap/tap_flow.h
doc/guides/nics/features/tap.ini +1 -0
index a51712dce066..9d73f61cca3b 100644
@@ -9,6 +9,7 @@ Jumbo frame          = Y
 Promiscuous mode     = Y
 Allmulticast mode    = Y
 Basic stats          = Y
+Flow API             = Y
 MTU update           = Y
 Multicast MAC filter = Y
 Speed capabilities   = Y
drivers/net/tap/Makefile +1 -0
index bdbe69e62a4e..386b8b0594d3 100644
@@ -47,6 +47,7 @@ CFLAGS += $(WERROR_FLAGS)
 # all source are stored in SRCS-y
 #
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += rte_eth_tap.c
+SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_flow.c
 
 # this lib depends upon:
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_eal
drivers/net/tap/rte_eth_tap.c +6 -0
index fa57d645f3b1..e80de0c29377 100644
@@ -52,6 +52,7 @@
 #include <fcntl.h>
 
 #include <tap.h>
+#include <tap_flow.h>
 
 /* Linux based path to the TUN device */
 #define TUN_TAP_DEV_PATH        "/dev/net/tun"
@@ -788,6 +789,7 @@ static const struct eth_dev_ops ops = {
 	.stats_get              = tap_stats_get,
 	.stats_reset            = tap_stats_reset,
 	.dev_supported_ptypes_get = tap_dev_supported_ptypes_get,
+	.filter_ctrl            = tap_dev_filter_ctrl,
 };
 
 static int
@@ -850,6 +852,8 @@ eth_dev_tap_create(const char *name, char *tap_name)
 		pmd->txq[i].fd = -1;
 	}
 
+	LIST_INIT(&pmd->flows);
+
 	return 0;
 
 error_exit:
@@ -962,6 +966,8 @@ rte_pmd_tap_remove(const char *name)
 	if (!eth_dev)
 		return 0;
 
+	tap_flow_flush(eth_dev, NULL);
+
 	internals = eth_dev->data->dev_private;
 	for (i = 0; i < internals->nb_queues; i++)
 		if (internals->rxq[i].fd != -1)
drivers/net/tap/tap.h +2 -0
index 88f62b895feb..323f5705a324 100644
@@ -34,6 +34,7 @@
 #ifndef _TAP_H_
 #define _TAP_H_
 
+#include <sys/queue.h>
 #include <inttypes.h>
 
 #include <rte_ethdev.h>
@@ -66,6 +67,7 @@ struct pmd_internals {
 	uint16_t nb_queues; /* Number of queues supported */
 	struct ether_addr eth_addr; /* Mac address of the device port */
 	int if_index; /* IF_INDEX for the port */
+	LIST_HEAD(tap_flows, rte_flow) flows; /* rte_flow rules */
 	struct rx_queue rxq[RTE_PMD_TAP_MAX_QUEUES]; /* List of RX queues */
 	struct tx_queue txq[RTE_PMD_TAP_MAX_QUEUES]; /* List of TX queues */
 };
drivers/net/tap/tap_flow.c new file +185 -0

185 lines not on this page · raw message

drivers/net/tap/tap_flow.h new file +46 -0

46 lines not on this page · raw message

Signature · 1 line
2.8.0.rc0
#6 lore raw

PATCH 3/4 net/tap: add netlink back-end for flow API

In reply to Pascal Mazon

Each kernel netdevice may have queueing disciplines set for it, which determine how to handle the packet (mostly on egress). That's part of the TC (Traffic Control) mechanism.

Through TC, it is possible to set filter rules that match specific packets, and act according to what is in the rule. This is a perfect candidate to implement the flow API for the tap PMD, as it has an associated kernel netdevice automatically.

Each flow API rule will be translated into its TC counterpart.

To leverage TC, it is necessary to communicate with the kernel using netlink. This patch introduces a library to help that communication.

Inside netlink.c, functions are generic for any netlink messaging. Inside tcmsgs.c, functions are specific to deal with TC rules.

---
 drivers/net/tap/Makefile      |   2 +
 drivers/net/tap/tap_netlink.c | 367 ++++++++++++++++++++++++++++++++++++++++
 drivers/net/tap/tap_netlink.h |  69 ++++++++
 drivers/net/tap/tap_tcmsgs.c  | 378 ++++++++++++++++++++++++++++++++++++++++++
 drivers/net/tap/tap_tcmsgs.h  |  63 +++++++
 5 files changed, 879 insertions(+)
 create mode 100644 drivers/net/tap/tap_netlink.c
 create mode 100644 drivers/net/tap/tap_netlink.h
 create mode 100644 drivers/net/tap/tap_tcmsgs.c
 create mode 100644 drivers/net/tap/tap_tcmsgs.h
drivers/net/tap/Makefile +2 -0
index 386b8b0594d3..4ae2ca6cfbab 100644
@@ -48,6 +48,8 @@ CFLAGS += $(WERROR_FLAGS)
 #
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += rte_eth_tap.c
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_flow.c
+SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_netlink.c
+SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_tcmsgs.c
 
 # this lib depends upon:
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_eal
drivers/net/tap/tap_netlink.c new file +367 -0

367 lines not on this page · raw message

drivers/net/tap/tap_netlink.h new file +69 -0

69 lines not on this page · raw message

drivers/net/tap/tap_tcmsgs.c new file +378 -0

378 lines not on this page · raw message

drivers/net/tap/tap_tcmsgs.h new file +63 -0

63 lines not on this page · raw message

Signature · 1 line
2.8.0.rc0
#7 lore raw

PATCH 4/4 net/tap: add basic flow API patterns and actions

In reply to Pascal Mazon

Supported flow rules are now mapped to TC rules on the tap netdevice. The netlink message used for creating the TC rule is stored in struct rte_flow. That way, by simply changing a metadata in it, we can require for the rule deletion without further parsing.

Supported items:
- eth: src and dst (with variable masks), and eth_type (0xffff mask).
- vlan: vid, pcp, tpid, but not eid.
- ipv4/6: src and dst (with variable masks), and ip_proto (0xffff mask).
- udp/tcp: src and dst port (0xffff) mask.

Supported actions:
- DROP
- QUEUE
- PASSTHRU

It is generally not possible to provide a "last" item. However, if the "last" item, once masked, is identical to the masked spec, then it is supported.

Only IPv4/6 and MAC addresses can use a variable mask. All other items need a full mask (exact match).

Support for VLAN requires kernel headers >= 4.9, checked using auto-config.sh.

---
 drivers/net/tap/Makefile      |  35 ++
 drivers/net/tap/rte_eth_tap.c |  33 +-
 drivers/net/tap/tap.h         |   1 +
 drivers/net/tap/tap_flow.c    | 891 +++++++++++++++++++++++++++++++++++++++++-
 drivers/net/tap/tap_flow.h    |  12 +
 5 files changed, 957 insertions(+), 15 deletions(-)
drivers/net/tap/Makefile +35 -0
index 4ae2ca6cfbab..10a97312945d 100644
@@ -41,6 +41,7 @@ LIBABIVER := 1
 
 CFLAGS += -O3
 CFLAGS += -I$(SRCDIR)
+CFLAGS += -I.
 CFLAGS += $(WERROR_FLAGS)
 
 #
@@ -57,5 +58,39 @@ DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_mbuf
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_mempool
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_ether
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_kvargs
+DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_hash
 
 include $(RTE_SDK)/mk/rte.lib.mk
+
+# Generate and clean-up tap_autoconf.h.
+
+export CC CFLAGS CPPFLAGS EXTRA_CFLAGS EXTRA_CPPFLAGS
+export AUTO_CONFIG_CFLAGS = -Wno-error
+
+ifndef V
+AUTOCONF_OUTPUT := >/dev/null
+endif
+
+tap_autoconf.h.new: FORCE
+
+tap_autoconf.h.new: $(RTE_SDK)/buildtools/auto-config-h.sh
+	$Q $(RM) -f -- '$@'
+	$Q sh -- '$<' '$@' \
+		HAVE_TC_VLAN_ID \
+		linux/pkt_cls.h \
+		enum TCA_FLOWER_KEY_VLAN_PRIO \
+		$(AUTOCONF_OUTPUT)
+
+# Create tap_autoconf.h or update it in case it differs from the new one.
+
+tap_autoconf.h: tap_autoconf.h.new
+	$Q [ -f '$@' ] && \
+		cmp '$<' '$@' $(AUTOCONF_OUTPUT) || \
+		mv '$<' '$@'
+
+$(SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP):.c=.o): tap_autoconf.h
+
+clean_tap: FORCE
+	$Q rm -f -- tap_autoconf.h tap_autoconf.h.new
+
+clean: clean_tap
drivers/net/tap/rte_eth_tap.c +31 -2
index e80de0c29377..aa605f74e375 100644
@@ -46,13 +46,14 @@
 #include <unistd.h>
 #include <poll.h>
 #include <arpa/inet.h>
-#include <linux/if.h>
+#include <net/if.h>
 #include <linux/if_tun.h>
 #include <linux/if_ether.h>
 #include <fcntl.h>
 
 #include <tap.h>
 #include <tap_flow.h>
+#include <tap_tcmsgs.h>
 
 /* Linux based path to the TUN device */
 #define TUN_TAP_DEV_PATH        "/dev/net/tun"
@@ -594,9 +595,30 @@ tap_setup_queue(struct rte_eth_dev *dev,
 	rx->fd = fd;
 	tx->fd = fd;
 
-	if (qid == 0)
+	if (qid == 0) {
 		tap_mac_set(dev, &pmd->eth_addr);
 
+		pmd->if_index = if_nametoindex(pmd->name);
+		if (!pmd->if_index) {
+			RTE_LOG(ERR, PMD,
+				"Could not find ifindex for %s: rte_flow won't be usable.\n",
+				pmd->name);
+			return fd;
+		}
+		if (qdisc_create_multiq(pmd->nlsk_fd, pmd->if_index) < 0) {
+			RTE_LOG(ERR, PMD,
+				"Could not create multiq qdisc for %s: rte_flow won't be usable.\n",
+				pmd->name);
+			return fd;
+		}
+		if (qdisc_create_ingress(pmd->nlsk_fd, pmd->if_index) < 0) {
+			RTE_LOG(ERR, PMD,
+				"Could not create multiq qdisc for %s: rte_flow won't be usable.\n",
+				pmd->name);
+			return fd;
+		}
+	}
+
 	return fd;
 }
 
@@ -853,6 +875,11 @@ eth_dev_tap_create(const char *name, char *tap_name)
 	}
 
 	LIST_INIT(&pmd->flows);
+	/*
+	 * If no netlink socket can be created, then it will fail when
+	 * creating/destroying flow rules.
+	 */
+	pmd->nlsk_fd = nl_init();
 
 	return 0;
 
@@ -969,6 +996,8 @@ rte_pmd_tap_remove(const char *name)
 	tap_flow_flush(eth_dev, NULL);
 
 	internals = eth_dev->data->dev_private;
+	if (internals->nlsk_fd)
+		nl_final(internals->nlsk_fd);
 	for (i = 0; i < internals->nb_queues; i++)
 		if (internals->rxq[i].fd != -1)
 			close(internals->rxq[i].fd);
drivers/net/tap/tap.h +1 -0
index 323f5705a324..96d9025412b3 100644
@@ -64,6 +64,7 @@ struct tx_queue {
 
 struct pmd_internals {
 	char name[RTE_ETH_NAME_MAX_LEN]; /* Internal Tap device name */
+	int nlsk_fd; /* Netlink socket fd */
 	uint16_t nb_queues; /* Number of queues supported */
 	struct ether_addr eth_addr; /* Mac address of the device port */
 	int if_index; /* IF_INDEX for the port */
drivers/net/tap/tap_flow.c +878 -13

943 lines not on this page · raw message

drivers/net/tap/tap_flow.h +12 -0
index 377a9f7b758a..a05e945df523 100644
@@ -37,6 +37,18 @@
 #include <rte_flow.h>
 #include <rte_flow_driver.h>
 
+/**
+ * In TC, priority 0 means we require the kernel to allocate one for us.
+ * In rte_flow, however, we want the priority 0 to be the most important one.
+ * Use an offset to have the most important priority being 1 in TC.
+ */
+#define PRIORITY_OFFSET 1
+#define PRIORITY_MASK (0xfff)
+#define MAX_PRIORITY (PRIORITY_MASK - PRIORITY_OFFSET)
+#define GROUP_MASK (0xf)
+#define GROUP_SHIFT 12
+#define MAX_GROUP GROUP_MASK
+
 int tap_dev_filter_ctrl(struct rte_eth_dev *dev,
 			enum rte_filter_type filter_type,
 			enum rte_filter_op filter_op,
Signature · 1 line
2.8.0.rc0
#8 lore raw

Re: [PATCH 4/4] net/tap: add basic flow API patterns and actions

Quoted 32 lines · Pascal Mazon

Supported flow rules are now mapped to TC rules on the tap netdevice. The netlink message used for creating the TC rule is stored in struct rte_flow. That way, by simply changing a metadata in it, we can require for the rule deletion without further parsing.

Supported items:
- eth: src and dst (with variable masks), and eth_type (0xffff mask).
- vlan: vid, pcp, tpid, but not eid.
- ipv4/6: src and dst (with variable masks), and ip_proto (0xffff mask).
- udp/tcp: src and dst port (0xffff) mask.

Supported actions:
- DROP
- QUEUE
- PASSTHRU

It is generally not possible to provide a "last" item. However, if the "last" item, once masked, is identical to the masked spec, then it is supported.

Only IPv4/6 and MAC addresses can use a variable mask. All other items need a full mask (exact match).

Support for VLAN requires kernel headers >= 4.9, checked using auto-config.sh.

—

…

Quoted 20 lines

/**

(quoted diff) +0 -0
@@ -120,13 +965,33 @@ tap_flow_create(struct rte_eth_dev *dev,
 * @see rte_flow_ops
 */

static int

drivers/net/tap/tap_flow.c +1 -1
-tap_flow_destroy(struct rte_eth_dev *dev __rte_unused,
+tap_flow_destroy(struct rte_eth_dev *dev,

struct rte_flow *flow,

drivers/net/tap/tap_flow.c +1 -1
-		 struct rte_flow_error *error __rte_unused)
+		 struct rte_flow_error *error)

{

drivers/net/tap/tap_flow.c +3 -0
+	struct pmd_internals *pmd = dev->data->dev_private;
+	int ret = 0;
+
	LIST_REMOVE(flow, next);
drivers/net/tap/tap_flow.c +5 -0
+	flow->msg.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
+	flow->msg.nh.nlmsg_type = RTM_DELTFILTER;
+
+	ret = nl_send(pmd->nlsk_fd, &flow->msg.nh);
+	if (ret < 0) {

drivers/net/tap/tap_flow.c tap_flow_create(struct rte_eth_dev *dev, · line 990

Quoted 10 lines
drivers/net/tap/tap_flow.c +10 -0
+		rte_flow_error_set(error, ENOTSUP, RTE_FLOW_ERROR_TYPE_HANDLE,
+				   NULL, "couldn't send request to kernel");
+		goto end;
+	}
+	ret = nl_recv_ack(pmd->nlsk_fd);
+	if (ret < 0) {
+		rte_flow_error_set(error, ENOTSUP, RTE_FLOW_ERROR_TYPE_HANDLE,
+				   NULL,
+				   "couldn't receive kernel ack to our request");
+		goto end;

This goto is not required.

Quoted 34 lines
drivers/net/tap/tap_flow.c +2 -0
+	}
+end:
	rte_free(flow);
drivers/net/tap/tap_flow.c +1 -1
-	return 0;
+	return ret;

}

/**

drivers/net/tap/tap_flow.h +12 -0
index 377a9f7b758a..a05e945df523 100644
@@ -37,6 +37,18 @@
 #include <rte_flow.h>
 #include <rte_flow_driver.h>
 
+/**
+ * In TC, priority 0 means we require the kernel to allocate one for us.
+ * In rte_flow, however, we want the priority 0 to be the most important one.
+ * Use an offset to have the most important priority being 1 in TC.
+ */
+#define PRIORITY_OFFSET 1
+#define PRIORITY_MASK (0xfff)
+#define MAX_PRIORITY (PRIORITY_MASK - PRIORITY_OFFSET)
+#define GROUP_MASK (0xf)
+#define GROUP_SHIFT 12
+#define MAX_GROUP GROUP_MASK
+
 int tap_dev_filter_ctrl(struct rte_eth_dev *dev,
 			enum rte_filter_type filter_type,
 			enum rte_filter_op filter_op,
Signature · 1 line
2.8.0.rc0

Regards,
Keith

#9 lore raw

Re: [PATCH 4/4] net/tap: add basic flow API patterns and actions

Quoted 66 lines · Keith
Quoted 35 lines

On Mar 3, 2017, at 4:45 AM, Pascal Mazon <[email protected]> wrote:

Supported flow rules are now mapped to TC rules on the tap netdevice. The netlink message used for creating the TC rule is stored in struct rte_flow. That way, by simply changing a metadata in it, we can require for the rule deletion without further parsing.

Supported items:
- eth: src and dst (with variable masks), and eth_type (0xffff mask).
- vlan: vid, pcp, tpid, but not eid.
- ipv4/6: src and dst (with variable masks), and ip_proto (0xffff mask).
- udp/tcp: src and dst port (0xffff) mask.

Supported actions:
- DROP
- QUEUE
- PASSTHRU

It is generally not possible to provide a "last" item. However, if the "last" item, once masked, is identical to the masked spec, then it is supported.

Only IPv4/6 and MAC addresses can use a variable mask. All other items need a full mask (exact match).

Support for VLAN requires kernel headers >= 4.9, checked using auto-config.sh.

—

…

Quoted 28 lines

/**

(quoted diff) +0 -0
@@ -120,13 +965,33 @@ tap_flow_create(struct rte_eth_dev *dev,
 * @see rte_flow_ops
 */

static int

drivers/net/tap/tap_flow.c +1 -1
-tap_flow_destroy(struct rte_eth_dev *dev __rte_unused,
+tap_flow_destroy(struct rte_eth_dev *dev,

struct rte_flow *flow,

drivers/net/tap/tap_flow.c +1 -1
-		 struct rte_flow_error *error __rte_unused)
+		 struct rte_flow_error *error)

{

drivers/net/tap/tap_flow.c +3 -0
+	struct pmd_internals *pmd = dev->data->dev_private;
+	int ret = 0;
+
	LIST_REMOVE(flow, next);
drivers/net/tap/tap_flow.c +6 -0
+	flow->msg.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
+	flow->msg.nh.nlmsg_type = RTM_DELTFILTER;
+
+	ret = nl_send(pmd->nlsk_fd, &flow->msg.nh);
+	if (ret < 0) {
+		rte_flow_error_set(error, ENOTSUP,

RTE_FLOW_ERROR_TYPE_HANDLE,

(quoted diff) +1 -0
+				   NULL, "couldn't send request to

kernel");

drivers/net/tap/tap_flow.c +4 -0
+		goto end;
+	}
+	ret = nl_recv_ack(pmd->nlsk_fd);
+	if (ret < 0) {
Quoted 9 lines

Review

Quoted 6 lines
(quoted diff) +1 -0
+		rte_flow_error_set(error, ENOTSUP,

RTE_FLOW_ERROR_TYPE_HANDLE,

(quoted diff) +2 -0
+				   NULL,
+				   "couldn't receive kernel ack to

our request");

(quoted diff) +1 -0
+		goto end;

This goto is not required.

Indeed!
I'll fix that in v2.

Regards,
Pascal

Quoted 40 lines
Quoted 30 lines
drivers/net/tap/tap_flow.c +2 -0
+	}
+end:
	rte_free(flow);
drivers/net/tap/tap_flow.c +1 -1
-	return 0;
+	return ret;

}

/**

drivers/net/tap/tap_flow.h +2 -0
index 377a9f7b758a..a05e945df523 100644
@@ -37,6 +37,18 @@
 #include <rte_flow.h>
 #include <rte_flow_driver.h>
 
+/**
+ * In TC, priority 0 means we require the kernel to allocate one

for us.
+ * In rte_flow, however, we want the priority 0 to be the most important one.
+ * Use an offset to have the most important priority being 1 in TC.
+ */

drivers/net/tap/tap_flow.h +7 -0
+#define PRIORITY_OFFSET 1
+#define PRIORITY_MASK (0xfff)
+#define MAX_PRIORITY (PRIORITY_MASK - PRIORITY_OFFSET)
+#define GROUP_MASK (0xf)
+#define GROUP_SHIFT 12
+#define MAX_GROUP GROUP_MASK
+
Quoted 6 lines

int tap_dev_filter_ctrl(struct rte_eth_dev *dev,
enum rte_filter_type filter_type, enum rte_filter_op filter_op,

Signature · 1 line
2.8.0.rc0

Regards,
Keith

#10 lore raw
In reply to Pascal Mazon
Quoted 31 lines · Pascal Mazon

This series add support for the flow API in tap PMD.

It enables filtering specific packets incoming on the tap netdevice, to process only desired ones. Under the hood, it uses kernel TC (traffic control), which takes place very early in the stack, and supports most common pattern items and actions defined in the flow API.

This series applies on top of:

[PATCH 0/6] net/tap: add additional management ops

Pascal Mazon (4):
net/tap: move private elements to external header net/tap: add preliminary support for rte_flow net/tap: add netlink back-end for flow API net/tap: add basic flow API patterns and actions

doc/guides/nics/features/tap.ini |    1 +
drivers/net/tap/Makefile         |   39 ++
drivers/net/tap/rte_eth_tap.c    |   73 +--
drivers/net/tap/tap.h            |   76 +++
drivers/net/tap/tap_flow.c       | 1050 ++++++++++++++++++++++++++++++++++++++
drivers/net/tap/tap_flow.h       |   58 +++
drivers/net/tap/tap_netlink.c    |  367 +++++++++++++
drivers/net/tap/tap_netlink.h    |   69 +++
drivers/net/tap/tap_tcmsgs.c     |  378 ++++++++++++++
drivers/net/tap/tap_tcmsgs.h     |   63 +++
10 files changed, 2140 insertions(+), 34 deletions(-)
Quoted 7 lines

create mode 100644 drivers/net/tap/tap.h
create mode 100644 drivers/net/tap/tap_flow.c
create mode 100644 drivers/net/tap/tap_flow.h
create mode 100644 drivers/net/tap/tap_netlink.c
create mode 100644 drivers/net/tap/tap_netlink.h
create mode 100644 drivers/net/tap/tap_tcmsgs.c
create mode 100644 drivers/net/tap/tap_tcmsgs.h

A lot of great changes to the TAP PMD here, but I did not see the tap.rst file getting updated to include the new remote option and other items you see fit to add to the docs.

Quoted 4 lines
Signature · 2 lines
-- 
2.8.0.rc0

Regards,
Keith

#11 lore raw

v2 cover net/tap: support flow API

In reply to Pascal Mazon

This series add support for the flow API in tap PMD.

It enables filtering specific packets incoming on the tap netdevice, to process only desired ones. Under the hood, it uses kernel TC (traffic control), which takes place very early in the stack, and supports most common pattern items and actions defined in the flow API.

This series applies on top of:

[PATCH 0/6] net/tap: add additional management ops

v2 changes:
- support compilation on kernels < 4.2 (where flower support appeared)
- set whitespaces in tap.h
- remove unnecessary goto

Pascal Mazon (4):
net/tap: move private elements to external header net/tap: add preliminary support for rte_flow net/tap: add netlink back-end for flow API net/tap: add basic flow API patterns and actions

 doc/guides/nics/features/tap.ini |    1 +
 drivers/net/tap/Makefile         |   44 ++
 drivers/net/tap/rte_eth_tap.c    |   94 ++--
 drivers/net/tap/tap.h            |   77 +++
 drivers/net/tap/tap_flow.c       | 1084 ++++++++++++++++++++++++++++++++++++++
 drivers/net/tap/tap_flow.h       |   58 ++
 drivers/net/tap/tap_netlink.c    |  367 +++++++++++++
 drivers/net/tap/tap_netlink.h    |   69 +++
 drivers/net/tap/tap_tcmsgs.c     |  378 +++++++++++++
 drivers/net/tap/tap_tcmsgs.h     |   63 +++
 10 files changed, 2202 insertions(+), 33 deletions(-)
 create mode 100644 drivers/net/tap/tap.h
 create mode 100644 drivers/net/tap/tap_flow.c
 create mode 100644 drivers/net/tap/tap_flow.h
 create mode 100644 drivers/net/tap/tap_netlink.c
 create mode 100644 drivers/net/tap/tap_netlink.h
 create mode 100644 drivers/net/tap/tap_tcmsgs.c
 create mode 100644 drivers/net/tap/tap_tcmsgs.h
Signature · 1 line
2.8.0.rc0
#12 lore raw

PATCH v2 1/4 net/tap: move private elements to external header

In the next patch, access to struct pmd_internals will be necessary in tap_flow.c to store the flows.

---
 drivers/net/tap/Makefile      |  1 +
 drivers/net/tap/rte_eth_tap.c | 34 ++------------------
 drivers/net/tap/tap.h         | 73 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 76 insertions(+), 32 deletions(-)
 create mode 100644 drivers/net/tap/tap.h
drivers/net/tap/Makefile +1 -0
index e18f30c56f52..bdbe69e62a4e 100644
@@ -40,6 +40,7 @@ EXPORT_MAP := rte_pmd_tap_version.map
 LIBABIVER := 1
 
 CFLAGS += -O3
+CFLAGS += -I$(SRCDIR)
 CFLAGS += $(WERROR_FLAGS)
 
 #
drivers/net/tap/rte_eth_tap.c +2 -32
index 21c667c82b3f..2cc77317f03e 100644
@@ -51,6 +51,8 @@
 #include <linux/if_ether.h>
 #include <fcntl.h>
 
+#include <tap.h>
+
 /* Linux based path to the TUN device */
 #define TUN_TAP_DEV_PATH        "/dev/net/tun"
 #define DEFAULT_TAP_NAME        "dtap"
@@ -83,38 +85,6 @@ static struct rte_eth_link pmd_link = {
 	.link_autoneg = ETH_LINK_SPEED_AUTONEG
 };
 
-struct pkt_stats {
-	uint64_t opackets;		/* Number of output packets */
-	uint64_t ipackets;		/* Number of input packets */
-	uint64_t obytes;		/* Number of bytes on output */
-	uint64_t ibytes;		/* Number of bytes on input */
-	uint64_t errs;			/* Number of error packets */
-};
-
-struct rx_queue {
-	struct rte_mempool *mp;		/* Mempool for RX packets */
-	uint16_t in_port;		/* Port ID */
-	int fd;
-
-	struct pkt_stats stats;		/* Stats for this RX queue */
-};
-
-struct tx_queue {
-	int fd;
-	struct pkt_stats stats;		/* Stats for this TX queue */
-};
-
-struct pmd_internals {
-	char name[RTE_ETH_NAME_MAX_LEN];	/* Internal Tap device name */
-	uint16_t nb_queues;		/* Number of queues supported */
-	struct ether_addr eth_addr;	/* Mac address of the device port */
-
-	int if_index;			/* IF_INDEX for the port */
-
-	struct rx_queue rxq[RTE_PMD_TAP_MAX_QUEUES];	/* List of RX queues */
-	struct tx_queue txq[RTE_PMD_TAP_MAX_QUEUES];	/* List of TX queues */
-};
-
 /* Tun/Tap allocation routine
  *
  * name is the number of the interface to use, unless NULL to take the host
drivers/net/tap/tap.h new file +73 -0

73 lines not on this page · raw message

Signature · 1 line
2.8.0.rc0
#13 lore raw

PATCH v2 2/4 net/tap: add preliminary support for rte_flow

In reply to Pascal Mazon

The flow API provides the ability to classify packets received by a tap netdevice.

This patch only implements skeleton functions for flow API support, no patterns are supported yet.

---
 doc/guides/nics/features/tap.ini |   1 +
 drivers/net/tap/Makefile         |   1 +
 drivers/net/tap/rte_eth_tap.c    |   6 ++
 drivers/net/tap/tap.h            |   2 +
 drivers/net/tap/tap_flow.c       | 185 +++++++++++++++++++++++++++++++++++++++
 drivers/net/tap/tap_flow.h       |  46 ++++++++++
 6 files changed, 241 insertions(+)
 create mode 100644 drivers/net/tap/tap_flow.c
 create mode 100644 drivers/net/tap/tap_flow.h
doc/guides/nics/features/tap.ini +1 -0
index a51712dce066..9d73f61cca3b 100644
@@ -9,6 +9,7 @@ Jumbo frame          = Y
 Promiscuous mode     = Y
 Allmulticast mode    = Y
 Basic stats          = Y
+Flow API             = Y
 MTU update           = Y
 Multicast MAC filter = Y
 Speed capabilities   = Y
drivers/net/tap/Makefile +1 -0
index bdbe69e62a4e..386b8b0594d3 100644
@@ -47,6 +47,7 @@ CFLAGS += $(WERROR_FLAGS)
 # all source are stored in SRCS-y
 #
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += rte_eth_tap.c
+SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_flow.c
 
 # this lib depends upon:
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_eal
drivers/net/tap/rte_eth_tap.c +6 -0
index 2cc77317f03e..f891def81af5 100644
@@ -52,6 +52,7 @@
 #include <fcntl.h>
 
 #include <tap.h>
+#include <tap_flow.h>
 
 /* Linux based path to the TUN device */
 #define TUN_TAP_DEV_PATH        "/dev/net/tun"
@@ -788,6 +789,7 @@ static const struct eth_dev_ops ops = {
 	.stats_get              = tap_stats_get,
 	.stats_reset            = tap_stats_reset,
 	.dev_supported_ptypes_get = tap_dev_supported_ptypes_get,
+	.filter_ctrl            = tap_dev_filter_ctrl,
 };
 
 static int
@@ -851,6 +853,8 @@ eth_dev_tap_create(const char *name, char *tap_name)
 		pmd->txq[i].fd = -1;
 	}
 
+	LIST_INIT(&pmd->flows);
+
 	return 0;
 
 error_exit:
@@ -963,6 +967,8 @@ rte_pmd_tap_remove(const char *name)
 	if (!eth_dev)
 		return 0;
 
+	tap_flow_flush(eth_dev, NULL);
+
 	internals = eth_dev->data->dev_private;
 	for (i = 0; i < internals->nb_queues; i++)
 		if (internals->rxq[i].fd != -1)
drivers/net/tap/tap.h +2 -0
index abd1795b2a43..60c0c58c7c1a 100644
@@ -34,6 +34,7 @@
 #ifndef _TAP_H_
 #define _TAP_H_
 
+#include <sys/queue.h>
 #include <inttypes.h>
 
 #include <rte_ethdev.h>
@@ -66,6 +67,7 @@ struct pmd_internals {
 	uint16_t nb_queues;               /* Number of queues supported */
 	struct ether_addr eth_addr;       /* Mac address of the device port */
 	int if_index;                     /* IF_INDEX for the port */
+	LIST_HEAD(tap_flows, rte_flow) flows;        /* rte_flow rules */
 	struct rx_queue rxq[RTE_PMD_TAP_MAX_QUEUES]; /* List of RX queues */
 	struct tx_queue txq[RTE_PMD_TAP_MAX_QUEUES]; /* List of TX queues */
 };
drivers/net/tap/tap_flow.c new file +185 -0

185 lines not on this page · raw message

drivers/net/tap/tap_flow.h new file +46 -0

46 lines not on this page · raw message

Signature · 1 line
2.8.0.rc0
#14 lore raw

PATCH v2 3/4 net/tap: add netlink back-end for flow API

In reply to Pascal Mazon

Each kernel netdevice may have queueing disciplines set for it, which determine how to handle the packet (mostly on egress). That's part of the TC (Traffic Control) mechanism.

Through TC, it is possible to set filter rules that match specific packets, and act according to what is in the rule. This is a perfect candidate to implement the flow API for the tap PMD, as it has an associated kernel netdevice automatically.

Each flow API rule will be translated into its TC counterpart.

To leverage TC, it is necessary to communicate with the kernel using netlink. This patch introduces a library to help that communication.

Inside netlink.c, functions are generic for any netlink messaging. Inside tcmsgs.c, functions are specific to deal with TC rules.

---
 drivers/net/tap/Makefile      |   2 +
 drivers/net/tap/tap_netlink.c | 367 ++++++++++++++++++++++++++++++++++++++++
 drivers/net/tap/tap_netlink.h |  69 ++++++++
 drivers/net/tap/tap_tcmsgs.c  | 378 ++++++++++++++++++++++++++++++++++++++++++
 drivers/net/tap/tap_tcmsgs.h  |  63 +++++++
 5 files changed, 879 insertions(+)
 create mode 100644 drivers/net/tap/tap_netlink.c
 create mode 100644 drivers/net/tap/tap_netlink.h
 create mode 100644 drivers/net/tap/tap_tcmsgs.c
 create mode 100644 drivers/net/tap/tap_tcmsgs.h
drivers/net/tap/Makefile +2 -0
index 386b8b0594d3..4ae2ca6cfbab 100644
@@ -48,6 +48,8 @@ CFLAGS += $(WERROR_FLAGS)
 #
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += rte_eth_tap.c
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_flow.c
+SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_netlink.c
+SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_tcmsgs.c
 
 # this lib depends upon:
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_eal
drivers/net/tap/tap_netlink.c new file +367 -0

367 lines not on this page · raw message

drivers/net/tap/tap_netlink.h new file +69 -0

69 lines not on this page · raw message

drivers/net/tap/tap_tcmsgs.c new file +378 -0

378 lines not on this page · raw message

drivers/net/tap/tap_tcmsgs.h new file +63 -0

63 lines not on this page · raw message

Signature · 1 line
2.8.0.rc0
#15 lore raw

PATCH v2 4/4 net/tap: add basic flow API patterns and actions

In reply to Pascal Mazon

Supported flow rules are now mapped to TC rules on the tap netdevice. The netlink message used for creating the TC rule is stored in struct rte_flow. That way, by simply changing a metadata in it, we can require for the rule deletion without further parsing.

Supported items:
- eth: src and dst (with variable masks), and eth_type (0xffff mask).
- vlan: vid, pcp, tpid, but not eid.
- ipv4/6: src and dst (with variable masks), and ip_proto (0xffff mask).
- udp/tcp: src and dst port (0xffff) mask.

Supported actions:
- DROP
- QUEUE
- PASSTHRU

It is generally not possible to provide a "last" item. However, if the "last" item, once masked, is identical to the masked spec, then it is supported.

Only IPv4/6 and MAC addresses can use a variable mask. All other items need a full mask (exact match).

Support for VLAN requires kernel headers >= 4.9, checked using auto-config.sh.

---
 drivers/net/tap/Makefile      |  40 ++
 drivers/net/tap/rte_eth_tap.c |  56 ++-
 drivers/net/tap/tap.h         |   2 +
 drivers/net/tap/tap_flow.c    | 925 +++++++++++++++++++++++++++++++++++++++++-
 drivers/net/tap/tap_flow.h    |  12 +
 5 files changed, 1020 insertions(+), 15 deletions(-)
drivers/net/tap/Makefile +40 -0
index 4ae2ca6cfbab..bb8217fe48a2 100644
@@ -41,6 +41,7 @@ LIBABIVER := 1
 
 CFLAGS += -O3
 CFLAGS += -I$(SRCDIR)
+CFLAGS += -I.
 CFLAGS += $(WERROR_FLAGS)
 
 #
@@ -57,5 +58,44 @@ DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_mbuf
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_mempool
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_ether
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_kvargs
+DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_hash
 
 include $(RTE_SDK)/mk/rte.lib.mk
+
+# Generate and clean-up tap_autoconf.h.
+
+export CC CFLAGS CPPFLAGS EXTRA_CFLAGS EXTRA_CPPFLAGS
+export AUTO_CONFIG_CFLAGS = -Wno-error
+
+ifndef V
+AUTOCONF_OUTPUT := >/dev/null
+endif
+
+tap_autoconf.h.new: FORCE
+
+tap_autoconf.h.new: $(RTE_SDK)/buildtools/auto-config-h.sh
+	$Q $(RM) -f -- '$@'
+	$Q sh -- '$<' '$@' \
+		HAVE_TC_VLAN_ID \
+		linux/pkt_cls.h \
+		enum TCA_FLOWER_KEY_VLAN_PRIO \
+		$(AUTOCONF_OUTPUT)
+	$Q sh -- '$<' '$@' \
+		HAVE_TC_FLOWER \
+		linux/pkt_cls.h \
+		enum TCA_FLOWER_UNSPEC \
+		$(AUTOCONF_OUTPUT)
+
+# Create tap_autoconf.h or update it in case it differs from the new one.
+
+tap_autoconf.h: tap_autoconf.h.new
+	$Q [ -f '$@' ] && \
+		cmp '$<' '$@' $(AUTOCONF_OUTPUT) || \
+		mv '$<' '$@'
+
+$(SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP):.c=.o): tap_autoconf.h
+
+clean_tap: FORCE
+	$Q rm -f -- tap_autoconf.h tap_autoconf.h.new
+
+clean: clean_tap
drivers/net/tap/rte_eth_tap.c +54 -2

105 lines not on this page · raw message

drivers/net/tap/tap.h +2 -0
index 60c0c58c7c1a..db157c60d1cb 100644
@@ -67,6 +67,8 @@ struct pmd_internals {
 	uint16_t nb_queues;               /* Number of queues supported */
 	struct ether_addr eth_addr;       /* Mac address of the device port */
 	int if_index;                     /* IF_INDEX for the port */
+	int nlsk_fd;                      /* Netlink socket fd */
+	int flower_support;               /* 1 if kernel supports, else 0 */
 	LIST_HEAD(tap_flows, rte_flow) flows;        /* rte_flow rules */
 	struct rx_queue rxq[RTE_PMD_TAP_MAX_QUEUES]; /* List of RX queues */
 	struct tx_queue txq[RTE_PMD_TAP_MAX_QUEUES]; /* List of TX queues */
drivers/net/tap/tap_flow.c +912 -13

983 lines not on this page · raw message

drivers/net/tap/tap_flow.h +12 -0
index 377a9f7b758a..a05e945df523 100644
@@ -37,6 +37,18 @@
 #include <rte_flow.h>
 #include <rte_flow_driver.h>
 
+/**
+ * In TC, priority 0 means we require the kernel to allocate one for us.
+ * In rte_flow, however, we want the priority 0 to be the most important one.
+ * Use an offset to have the most important priority being 1 in TC.
+ */
+#define PRIORITY_OFFSET 1
+#define PRIORITY_MASK (0xfff)
+#define MAX_PRIORITY (PRIORITY_MASK - PRIORITY_OFFSET)
+#define GROUP_MASK (0xf)
+#define GROUP_SHIFT 12
+#define MAX_GROUP GROUP_MASK
+
 int tap_dev_filter_ctrl(struct rte_eth_dev *dev,
 			enum rte_filter_type filter_type,
 			enum rte_filter_op filter_op,
Signature · 1 line
2.8.0.rc0
#16 lore raw
In reply to Pascal Mazon

Hi Keith,

I'm working on a v3 for that series:

- I added info regarding flow API support in tap.rst doc
- I fixed support for kernels where flower/vlan was not supported.

Do you have any other remarks, or can I send the v3 (hopefully ok for integration)?

I'll send a v2 for the latest series (introducing remote capture), because struct pmd_internals changed (whitespaces). Same question there, do you have remarks?

Thank you.

Best regards,
Pascal

Quoted 43 lines · On Mon, 6 Mar 2017 18:05:26 +0100 Pascal Mazon <[email protected]> wrote:

This series add support for the flow API in tap PMD.

It enables filtering specific packets incoming on the tap netdevice, to process only desired ones. Under the hood, it uses kernel TC (traffic control), which takes place very early in the stack, and supports most common pattern items and actions defined in the flow API.

This series applies on top of:

[PATCH 0/6] net/tap: add additional management ops

v2 changes:
- support compilation on kernels < 4.2 (where flower support
appeared)
- set whitespaces in tap.h
- remove unnecessary goto

Pascal Mazon (4):
net/tap: move private elements to external header net/tap: add preliminary support for rte_flow net/tap: add netlink back-end for flow API net/tap: add basic flow API patterns and actions

 doc/guides/nics/features/tap.ini |    1 +
 drivers/net/tap/Makefile         |   44 ++
 drivers/net/tap/rte_eth_tap.c    |   94 ++--
 drivers/net/tap/tap.h            |   77 +++
 drivers/net/tap/tap_flow.c       | 1084
++++++++++++++++++++++++++++++++++++++
drivers/net/tap/tap_flow.h       |   58 ++
drivers/net/tap/tap_netlink.c    |  367 +++++++++++++
drivers/net/tap/tap_netlink.h    |   69 +++
drivers/net/tap/tap_tcmsgs.c     |  378 +++++++++++++
drivers/net/tap/tap_tcmsgs.h     |   63 +++ 10 files changed, 2202
insertions(+), 33 deletions(-) create mode 100644
drivers/net/tap/tap.h create mode 100644 drivers/net/tap/tap_flow.c
 create mode 100644 drivers/net/tap/tap_flow.h
 create mode 100644 drivers/net/tap/tap_netlink.c
 create mode 100644 drivers/net/tap/tap_netlink.h
 create mode 100644 drivers/net/tap/tap_tcmsgs.c
 create mode 100644 drivers/net/tap/tap_tcmsgs.h
#17 lore raw
Quoted 10 lines · Pascal Mazon

Hi Keith,

I'm working on a v3 for that series:

- I added info regarding flow API support in tap.rst doc
- I fixed support for kernels where flower/vlan was not supported.

Quoted 6 lines

Do you have any other remarks, or can I send the v3 (hopefully ok for integration)?

I'll send a v2 for the latest series (introducing remote capture), because struct pmd_internals changed (whitespaces). Same question there, do you have remarks?

I think I am ok with everything we discussed and you can send your v2/v3 when you want.

Quoted 53 lines

Thank you.

Best regards,
Pascal

Quoted 43 lines · On Mon, 6 Mar 2017 18:05:26 +0100 Pascal Mazon <[email protected]> wrote:

This series add support for the flow API in tap PMD.

It enables filtering specific packets incoming on the tap netdevice, to process only desired ones. Under the hood, it uses kernel TC (traffic control), which takes place very early in the stack, and supports most common pattern items and actions defined in the flow API.

This series applies on top of:

[PATCH 0/6] net/tap: add additional management ops

v2 changes:
- support compilation on kernels < 4.2 (where flower support
appeared)
- set whitespaces in tap.h
- remove unnecessary goto

Pascal Mazon (4):
net/tap: move private elements to external header net/tap: add preliminary support for rte_flow net/tap: add netlink back-end for flow API net/tap: add basic flow API patterns and actions

doc/guides/nics/features/tap.ini |    1 +
drivers/net/tap/Makefile         |   44 ++
drivers/net/tap/rte_eth_tap.c    |   94 ++--
drivers/net/tap/tap.h            |   77 +++
drivers/net/tap/tap_flow.c       | 1084
++++++++++++++++++++++++++++++++++++++
drivers/net/tap/tap_flow.h       |   58 ++
drivers/net/tap/tap_netlink.c    |  367 +++++++++++++
drivers/net/tap/tap_netlink.h    |   69 +++
drivers/net/tap/tap_tcmsgs.c     |  378 +++++++++++++
drivers/net/tap/tap_tcmsgs.h     |   63 +++ 10 files changed, 2202

insertions(+), 33 deletions(-) create mode 100644 drivers/net/tap/tap.h create mode 100644 drivers/net/tap/tap_flow.c create mode 100644 drivers/net/tap/tap_flow.h
create mode 100644 drivers/net/tap/tap_netlink.c
create mode 100644 drivers/net/tap/tap_netlink.h
create mode 100644 drivers/net/tap/tap_tcmsgs.c
create mode 100644 drivers/net/tap/tap_tcmsgs.h

Regards,
Keith

#18 lore raw

v3 cover net/tap: support flow API

In reply to Pascal Mazon

This series add support for the flow API in tap PMD.

It enables filtering specific packets incoming on the tap netdevice, to process only desired ones. Under the hood, it uses kernel TC (traffic control), which takes place very early in the stack, and supports most common pattern items and actions defined in the flow API.

This series applies on top of:

[PATCH 0/6] net/tap: add additional management ops

v2 changes:
- support compilation on kernels < 4.2 (where flower support appeared)
- set whitespaces in tap.h
- remove unnecessary goto

v3 changes:
- vlan patterns enabled depending on running kernel (4.9+)
- update doc/guides/nics/tap.rst for Flow API support
- rebase on top of "net/tap: add additional management ops" series

Pascal Mazon (4):
net/tap: move private elements to external header net/tap: add preliminary support for rte_flow net/tap: add netlink back-end for flow API net/tap: add basic flow API patterns and actions

 doc/guides/nics/features/tap.ini |    1 +
 doc/guides/nics/tap.rst          |   23 +
 drivers/net/tap/Makefile         |   44 ++
 drivers/net/tap/rte_eth_tap.c    |   96 ++--
 drivers/net/tap/tap.h            |   78 +++
 drivers/net/tap/tap_flow.c       | 1078 ++++++++++++++++++++++++++++++++++++++
 drivers/net/tap/tap_flow.h       |   58 ++
 drivers/net/tap/tap_netlink.c    |  367 +++++++++++++
 drivers/net/tap/tap_netlink.h    |   69 +++
 drivers/net/tap/tap_tcmsgs.c     |  378 +++++++++++++
 drivers/net/tap/tap_tcmsgs.h     |   63 +++
 11 files changed, 2223 insertions(+), 32 deletions(-)
 create mode 100644 drivers/net/tap/tap.h
 create mode 100644 drivers/net/tap/tap_flow.c
 create mode 100644 drivers/net/tap/tap_flow.h
 create mode 100644 drivers/net/tap/tap_netlink.c
 create mode 100644 drivers/net/tap/tap_netlink.h
 create mode 100644 drivers/net/tap/tap_tcmsgs.c
 create mode 100644 drivers/net/tap/tap_tcmsgs.h
Signature · 1 line
2.8.0.rc0
#19 lore raw

PATCH v3 1/4 net/tap: move private elements to external header

In the next patch, access to struct pmd_internals will be necessary in tap_flow.c to store the flows.

---
 drivers/net/tap/Makefile      |  1 +
 drivers/net/tap/rte_eth_tap.c | 34 ++------------------
 drivers/net/tap/tap.h         | 73 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 76 insertions(+), 32 deletions(-)
 create mode 100644 drivers/net/tap/tap.h
drivers/net/tap/Makefile +1 -0
index e18f30c56f52..bdbe69e62a4e 100644
@@ -40,6 +40,7 @@ EXPORT_MAP := rte_pmd_tap_version.map
 LIBABIVER := 1
 
 CFLAGS += -O3
+CFLAGS += -I$(SRCDIR)
 CFLAGS += $(WERROR_FLAGS)
 
 #
drivers/net/tap/rte_eth_tap.c +2 -32
index cbfb3b9641c8..308519d265cb 100644
@@ -51,6 +51,8 @@
 #include <linux/if_ether.h>
 #include <fcntl.h>
 
+#include <tap.h>
+
 /* Linux based path to the TUN device */
 #define TUN_TAP_DEV_PATH        "/dev/net/tun"
 #define DEFAULT_TAP_NAME        "dtap"
@@ -83,38 +85,6 @@ static struct rte_eth_link pmd_link = {
 	.link_autoneg = ETH_LINK_SPEED_AUTONEG
 };
 
-struct pkt_stats {
-	uint64_t opackets;		/* Number of output packets */
-	uint64_t ipackets;		/* Number of input packets */
-	uint64_t obytes;		/* Number of bytes on output */
-	uint64_t ibytes;		/* Number of bytes on input */
-	uint64_t errs;			/* Number of error packets */
-};
-
-struct rx_queue {
-	struct rte_mempool *mp;		/* Mempool for RX packets */
-	uint16_t in_port;		/* Port ID */
-	int fd;
-
-	struct pkt_stats stats;		/* Stats for this RX queue */
-};
-
-struct tx_queue {
-	int fd;
-	struct pkt_stats stats;		/* Stats for this TX queue */
-};
-
-struct pmd_internals {
-	char name[RTE_ETH_NAME_MAX_LEN];	/* Internal Tap device name */
-	uint16_t nb_queues;		/* Number of queues supported */
-	struct ether_addr eth_addr;	/* Mac address of the device port */
-
-	int if_index;			/* IF_INDEX for the port */
-
-	struct rx_queue rxq[RTE_PMD_TAP_MAX_QUEUES];	/* List of RX queues */
-	struct tx_queue txq[RTE_PMD_TAP_MAX_QUEUES];	/* List of TX queues */
-};
-
 /* Tun/Tap allocation routine
  *
  * name is the number of the interface to use, unless NULL to take the host
drivers/net/tap/tap.h new file +73 -0

73 lines not on this page · raw message

Signature · 1 line
2.8.0.rc0
#20 lore raw

Re: [PATCH v3 1/4] net/tap: move private elements to external header

Quoted 9 lines · Pascal Mazon

In the next patch, access to struct pmd_internals will be necessary in tap_flow.c to store the flows.

---
 drivers/net/tap/Makefile      |  1 +
 drivers/net/tap/rte_eth_tap.c | 34 ++------------------
 drivers/net/tap/tap.h         | 73 +++++++++++++++++++++++++++++++++++++++++++

tap.h is a generic name, I think rte_eth_tap.h fits better here.

<...>

#21 lore raw

Re: [PATCH v3 1/4] net/tap: move private elements to external header

Quoted 12 lines · On Thu, 9 Mar 2017 15:28:31 +0000 Ferruh Yigit <[email protected]> wrote:
Quoted 10 lines · Pascal Mazon

In the next patch, access to struct pmd_internals will be necessary in tap_flow.c to store the flows.

---
 drivers/net/tap/Makefile      |  1 +
 drivers/net/tap/rte_eth_tap.c | 34 ++------------------
 drivers/net/tap/tap.h         | 73

+++++++++++++++++++++++++++++++++++++++++++

Quoted 3 lines

tap.h is a generic name, I think rte_eth_tap.h fits better here.

<...>

I'm ok with that. I'll change it in my next version.

#22 lore raw

PATCH v3 2/4 net/tap: add preliminary support for rte_flow

In reply to Pascal Mazon

The flow API provides the ability to classify packets received by a tap netdevice.

This patch only implements skeleton functions for flow API support, no patterns are supported yet.

---
 doc/guides/nics/features/tap.ini |   1 +
 drivers/net/tap/Makefile         |   1 +
 drivers/net/tap/rte_eth_tap.c    |   6 ++
 drivers/net/tap/tap.h            |   2 +
 drivers/net/tap/tap_flow.c       | 185 +++++++++++++++++++++++++++++++++++++++
 drivers/net/tap/tap_flow.h       |  46 ++++++++++
 6 files changed, 241 insertions(+)
 create mode 100644 drivers/net/tap/tap_flow.c
 create mode 100644 drivers/net/tap/tap_flow.h
doc/guides/nics/features/tap.ini +1 -0
index a51712dce066..9d73f61cca3b 100644
@@ -9,6 +9,7 @@ Jumbo frame          = Y
 Promiscuous mode     = Y
 Allmulticast mode    = Y
 Basic stats          = Y
+Flow API             = Y
 MTU update           = Y
 Multicast MAC filter = Y
 Speed capabilities   = Y
drivers/net/tap/Makefile +1 -0
index bdbe69e62a4e..386b8b0594d3 100644
@@ -47,6 +47,7 @@ CFLAGS += $(WERROR_FLAGS)
 # all source are stored in SRCS-y
 #
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += rte_eth_tap.c
+SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_flow.c
 
 # this lib depends upon:
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_eal
drivers/net/tap/rte_eth_tap.c +6 -0
index 308519d265cb..d4f2ff72e8b4 100644
@@ -52,6 +52,7 @@
 #include <fcntl.h>
 
 #include <tap.h>
+#include <tap_flow.h>
 
 /* Linux based path to the TUN device */
 #define TUN_TAP_DEV_PATH        "/dev/net/tun"
@@ -797,6 +798,7 @@ static const struct eth_dev_ops ops = {
 	.stats_get              = tap_stats_get,
 	.stats_reset            = tap_stats_reset,
 	.dev_supported_ptypes_get = tap_dev_supported_ptypes_get,
+	.filter_ctrl            = tap_dev_filter_ctrl,
 };
 
 static int
@@ -860,6 +862,8 @@ eth_dev_tap_create(const char *name, char *tap_name)
 		pmd->txq[i].fd = -1;
 	}
 
+	LIST_INIT(&pmd->flows);
+
 	return 0;
 
 error_exit:
@@ -972,6 +976,8 @@ rte_pmd_tap_remove(const char *name)
 	if (!eth_dev)
 		return 0;
 
+	tap_flow_flush(eth_dev, NULL);
+
 	internals = eth_dev->data->dev_private;
 	for (i = 0; i < internals->nb_queues; i++)
 		if (internals->rxq[i].fd != -1)
drivers/net/tap/tap.h +2 -0
index abd1795b2a43..60c0c58c7c1a 100644
@@ -34,6 +34,7 @@
 #ifndef _TAP_H_
 #define _TAP_H_
 
+#include <sys/queue.h>
 #include <inttypes.h>
 
 #include <rte_ethdev.h>
@@ -66,6 +67,7 @@ struct pmd_internals {
 	uint16_t nb_queues;               /* Number of queues supported */
 	struct ether_addr eth_addr;       /* Mac address of the device port */
 	int if_index;                     /* IF_INDEX for the port */
+	LIST_HEAD(tap_flows, rte_flow) flows;        /* rte_flow rules */
 	struct rx_queue rxq[RTE_PMD_TAP_MAX_QUEUES]; /* List of RX queues */
 	struct tx_queue txq[RTE_PMD_TAP_MAX_QUEUES]; /* List of TX queues */
 };
drivers/net/tap/tap_flow.c new file +185 -0

185 lines not on this page · raw message

drivers/net/tap/tap_flow.h new file +46 -0

46 lines not on this page · raw message

Signature · 1 line
2.8.0.rc0
#23 lore raw

PATCH v3 3/4 net/tap: add netlink back-end for flow API

In reply to Pascal Mazon

Each kernel netdevice may have queueing disciplines set for it, which determine how to handle the packet (mostly on egress). That's part of the TC (Traffic Control) mechanism.

Through TC, it is possible to set filter rules that match specific packets, and act according to what is in the rule. This is a perfect candidate to implement the flow API for the tap PMD, as it has an associated kernel netdevice automatically.

Each flow API rule will be translated into its TC counterpart.

To leverage TC, it is necessary to communicate with the kernel using netlink. This patch introduces a library to help that communication.

Inside netlink.c, functions are generic for any netlink messaging. Inside tcmsgs.c, functions are specific to deal with TC rules.

---
 drivers/net/tap/Makefile      |   2 +
 drivers/net/tap/tap_netlink.c | 367 ++++++++++++++++++++++++++++++++++++++++
 drivers/net/tap/tap_netlink.h |  69 ++++++++
 drivers/net/tap/tap_tcmsgs.c  | 378 ++++++++++++++++++++++++++++++++++++++++++
 drivers/net/tap/tap_tcmsgs.h  |  63 +++++++
 5 files changed, 879 insertions(+)
 create mode 100644 drivers/net/tap/tap_netlink.c
 create mode 100644 drivers/net/tap/tap_netlink.h
 create mode 100644 drivers/net/tap/tap_tcmsgs.c
 create mode 100644 drivers/net/tap/tap_tcmsgs.h
drivers/net/tap/Makefile +2 -0
index 386b8b0594d3..4ae2ca6cfbab 100644
@@ -48,6 +48,8 @@ CFLAGS += $(WERROR_FLAGS)
 #
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += rte_eth_tap.c
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_flow.c
+SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_netlink.c
+SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_tcmsgs.c
 
 # this lib depends upon:
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_eal
drivers/net/tap/tap_netlink.c new file +367 -0

367 lines not on this page · raw message

drivers/net/tap/tap_netlink.h new file +69 -0

69 lines not on this page · raw message

drivers/net/tap/tap_tcmsgs.c new file +378 -0

378 lines not on this page · raw message

drivers/net/tap/tap_tcmsgs.h new file +63 -0

63 lines not on this page · raw message

Signature · 1 line
2.8.0.rc0
#24 lore raw

Re: [PATCH v3 3/4] net/tap: add netlink back-end for flow API

Quoted 3 lines · Pascal Mazon

Each kernel netdevice may have queueing disciplines set for it, which determine how to handle the packet (mostly on egress). That's part of the TC (Traffic Control) mechanism.

This is nice.
qdisc is egress part of the network stack right, is there any ingress part of it?

Quoted 7 lines

Through TC, it is possible to set filter rules that match specific packets, and act according to what is in the rule. This is a perfect candidate to implement the flow API for the tap PMD, as it has an associated kernel netdevice automatically.

Each flow API rule will be translated into its TC counterpart.

What can be use cases here?

Quoted 4 lines

To leverage TC, it is necessary to communicate with the kernel using netlink. This patch introduces a library to help that communication.

What do you think implementing these out of tap PMD? These can be used by KNI too.

Quoted 5 lines

Inside netlink.c, functions are generic for any netlink messaging. Inside tcmsgs.c, functions are specific to deal with TC rules.

<...>

#25 lore raw

Re: [PATCH v3 3/4] net/tap: add netlink back-end for flow API

Quoted 9 lines · On Thu, 9 Mar 2017 15:29:01 +0000 Ferruh Yigit <[email protected]> wrote:
Quoted 3 lines · Pascal Mazon

Each kernel netdevice may have queueing disciplines set for it, which determine how to handle the packet (mostly on egress). That's part of the TC (Traffic Control) mechanism.

This is nice.
qdisc is egress part of the network stack right, is there any ingress part of it?

qdisc is mainly for egress (can range from 0 to fffe), but there is one qdisc for ingress (ffff).

Quoted 9 lines
Quoted 7 lines

Through TC, it is possible to set filter rules that match specific packets, and act according to what is in the rule. This is a perfect candidate to implement the flow API for the tap PMD, as it has an associated kernel netdevice automatically.

Each flow API rule will be translated into its TC counterpart.

What can be use cases here?

Well, it can be any case with rte_flow. Such as directing incoming packets to specific queues for the application, dropping them, and any kind of filtering (along those supported, see later patch).

Quoted 9 lines
Quoted 5 lines

To leverage TC, it is necessary to communicate with the kernel using netlink. This patch introduces a library to help that communication.

What do you think implementing these out of tap PMD? These can be used by KNI too.

Well, I don't know about KNI, but I think setting it in tap PMD, which is the current sole user for this, is a good start.
It will always be time later to make it more generic for other uses.

Regards,
Pascal

Quoted 6 lines
Quoted 5 lines

Inside netlink.c, functions are generic for any netlink messaging. Inside tcmsgs.c, functions are specific to deal with TC rules.

<...>

#26 lore raw

PATCH v3 4/4 net/tap: add basic flow API patterns and actions

In reply to Pascal Mazon

Supported flow rules are now mapped to TC rules on the tap netdevice. The netlink message used for creating the TC rule is stored in struct rte_flow. That way, by simply changing a metadata in it, we can require for the rule deletion without further parsing.

Supported items:
- eth: src and dst (with variable masks), and eth_type (0xffff mask).
- vlan: vid, pcp, tpid, but not eid.
- ipv4/6: src and dst (with variable masks), and ip_proto (0xffff mask).
- udp/tcp: src and dst port (0xffff) mask.

Supported actions:
- DROP
- QUEUE
- PASSTHRU

It is generally not possible to provide a "last" item. However, if the "last" item, once masked, is identical to the masked spec, then it is supported.

Only IPv4/6 and MAC addresses can use a variable mask. All other items need a full mask (exact match).

Support for VLAN requires kernel headers >= 4.9, checked using auto-config.sh.

---
 doc/guides/nics/tap.rst       |  23 ++
 drivers/net/tap/Makefile      |  40 ++
 drivers/net/tap/rte_eth_tap.c |  58 ++-
 drivers/net/tap/tap.h         |   3 +
 drivers/net/tap/tap_flow.c    | 919 +++++++++++++++++++++++++++++++++++++++++-
 drivers/net/tap/tap_flow.h    |  12 +
 6 files changed, 1041 insertions(+), 14 deletions(-)
doc/guides/nics/tap.rst +23 -0
index c4f207be3b47..cdb528b5eae4 100644
@@ -82,6 +82,29 @@ can utilize that stack to handle the network protocols. Plus you would be able
 to address the interface using an IP address assigned to the internal
 interface.
 
+Flow API support
+----------------
+
+The tap PMD supports major flow API pattern items and actions, when running on
+linux kernels above 4.2 ("Flower" classifier required). Supported items:
+
+- eth: src and dst (with variable masks), and eth_type (0xffff mask).
+- vlan: vid, pcp, tpid, but not eid. (requires kernel 4.9)
+- ipv4/6: src and dst (with variable masks), and ip_proto (0xffff mask).
+- udp/tcp: src and dst port (0xffff) mask.
+
+Supported actions:
+
+- DROP
+- QUEUE
+- PASSTHRU
+
+It is generally not possible to provide a "last" item. However, if the "last"
+item, once masked, is identical to the masked spec, then it is supported.
+
+Only IPv4/6 and MAC addresses can use a variable mask. All other items need a
+full mask (exact match).
+
 Example
 -------
 
drivers/net/tap/Makefile +40 -0
index 4ae2ca6cfbab..a6542dad1d66 100644
@@ -41,6 +41,7 @@ LIBABIVER := 1
 
 CFLAGS += -O3
 CFLAGS += -I$(SRCDIR)
+CFLAGS += -I.
 CFLAGS += $(WERROR_FLAGS)
 
 #
@@ -57,5 +58,44 @@ DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_mbuf
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_mempool
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_ether
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_kvargs
+DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_hash
 
 include $(RTE_SDK)/mk/rte.lib.mk
+
+# Generate and clean-up tap_autoconf.h.
+
+export CC CFLAGS CPPFLAGS EXTRA_CFLAGS EXTRA_CPPFLAGS
+export AUTO_CONFIG_CFLAGS = -Wno-error
+
+ifndef V
+AUTOCONF_OUTPUT := >/dev/null
+endif
+
+tap_autoconf.h.new: FORCE
+
+tap_autoconf.h.new: $(RTE_SDK)/buildtools/auto-config-h.sh
+	$Q $(RM) -f -- '$@'
+	$Q sh -- '$<' '$@' \
+		HAVE_TC_FLOWER \
+		linux/pkt_cls.h \
+		enum TCA_FLOWER_UNSPEC \
+		$(AUTOCONF_OUTPUT)
+	$Q sh -- '$<' '$@' \
+		HAVE_TC_VLAN_ID \
+		linux/pkt_cls.h \
+		enum TCA_FLOWER_KEY_VLAN_PRIO \
+		$(AUTOCONF_OUTPUT)
+
+# Create tap_autoconf.h or update it in case it differs from the new one.
+
+tap_autoconf.h: tap_autoconf.h.new
+	$Q [ -f '$@' ] && \
+		cmp '$<' '$@' $(AUTOCONF_OUTPUT) || \
+		mv '$<' '$@'
+
+$(SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP):.c=.o): tap_autoconf.h
+
+clean_tap: FORCE
+	$Q rm -f -- tap_autoconf.h tap_autoconf.h.new
+
+clean: clean_tap
drivers/net/tap/rte_eth_tap.c +57 -1

105 lines not on this page · raw message

drivers/net/tap/tap.h +3 -0
index 60c0c58c7c1a..2c8cc7d5b485 100644
@@ -67,6 +67,9 @@ struct pmd_internals {
 	uint16_t nb_queues;               /* Number of queues supported */
 	struct ether_addr eth_addr;       /* Mac address of the device port */
 	int if_index;                     /* IF_INDEX for the port */
+	int nlsk_fd;                      /* Netlink socket fd */
+	int flower_support;               /* 1 if kernel supports, else 0 */
+	int flower_vlan_support;          /* 1 if kernel supports, else 0 */
 	LIST_HEAD(tap_flows, rte_flow) flows;        /* rte_flow rules */
 	struct rx_queue rxq[RTE_PMD_TAP_MAX_QUEUES]; /* List of RX queues */
 	struct tx_queue txq[RTE_PMD_TAP_MAX_QUEUES]; /* List of TX queues */
drivers/net/tap/tap_flow.c +906 -13

977 lines not on this page · raw message

drivers/net/tap/tap_flow.h +12 -0
index 377a9f7b758a..a05e945df523 100644
@@ -37,6 +37,18 @@
 #include <rte_flow.h>
 #include <rte_flow_driver.h>
 
+/**
+ * In TC, priority 0 means we require the kernel to allocate one for us.
+ * In rte_flow, however, we want the priority 0 to be the most important one.
+ * Use an offset to have the most important priority being 1 in TC.
+ */
+#define PRIORITY_OFFSET 1
+#define PRIORITY_MASK (0xfff)
+#define MAX_PRIORITY (PRIORITY_MASK - PRIORITY_OFFSET)
+#define GROUP_MASK (0xf)
+#define GROUP_SHIFT 12
+#define MAX_GROUP GROUP_MASK
+
 int tap_dev_filter_ctrl(struct rte_eth_dev *dev,
 			enum rte_filter_type filter_type,
 			enum rte_filter_op filter_op,
Signature · 1 line
2.8.0.rc0
#27 lore raw

v4 cover net/tap: support flow API

In reply to Pascal Mazon

This series add support for the flow API in tap PMD.

It enables filtering specific packets incoming on the tap netdevice, to process only desired ones. Under the hood, it uses kernel TC (traffic control), which takes place very early in the stack, and supports most common pattern items and actions defined in the flow API.

This series applies on top of:

[PATCH 0/6] net/tap: add additional management ops

v2 changes:
- support compilation on kernels < 4.2 (where flower support appeared)
- set whitespaces in tap.h
- remove unnecessary goto

v3 changes:
- vlan patterns enabled depending on running kernel (4.9+)
- update doc/guides/nics/tap.rst for Flow API support
- rebase on top of "net/tap: add additional management ops" series

v4 changes:
- rebase on top of "net/tap: add additional management ops" series
- fix a few netlink doxygen comments
- rename tap.h -> rte_eth_tap.h
- flush flow rules only when applicable

Pascal Mazon (4):
net/tap: move private elements to external header net/tap: add preliminary support for rte_flow net/tap: add netlink back-end for flow API net/tap: add basic flow API patterns and actions

 doc/guides/nics/features/tap.ini |    1 +
 doc/guides/nics/tap.rst          |   23 +
 drivers/net/tap/Makefile         |   44 ++
 drivers/net/tap/rte_eth_tap.c    |  100 ++--
 drivers/net/tap/rte_eth_tap.h    |   79 +++
 drivers/net/tap/tap_flow.c       | 1078 ++++++++++++++++++++++++++++++++++++++
 drivers/net/tap/tap_flow.h       |   58 ++
 drivers/net/tap/tap_netlink.c    |  367 +++++++++++++
 drivers/net/tap/tap_netlink.h    |   69 +++
 drivers/net/tap/tap_tcmsgs.c     |  378 +++++++++++++
 drivers/net/tap/tap_tcmsgs.h     |   63 +++
 11 files changed, 2226 insertions(+), 34 deletions(-)
 create mode 100644 drivers/net/tap/rte_eth_tap.h
 create mode 100644 drivers/net/tap/tap_flow.c
 create mode 100644 drivers/net/tap/tap_flow.h
 create mode 100644 drivers/net/tap/tap_netlink.c
 create mode 100644 drivers/net/tap/tap_netlink.h
 create mode 100644 drivers/net/tap/tap_tcmsgs.c
 create mode 100644 drivers/net/tap/tap_tcmsgs.h
Signature · 1 line
2.8.0.rc0
#28 lore raw

PATCH v4 1/4 net/tap: move private elements to external header

In the next patch, access to struct pmd_internals will be necessary in tap_flow.c to store the flows.

---
 drivers/net/tap/Makefile      |  1 +
 drivers/net/tap/rte_eth_tap.c | 35 ++------------------
 drivers/net/tap/rte_eth_tap.h | 74 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 77 insertions(+), 33 deletions(-)
 create mode 100644 drivers/net/tap/rte_eth_tap.h
drivers/net/tap/Makefile +1 -0
index e18f30c56f52..bdbe69e62a4e 100644
@@ -40,6 +40,7 @@ EXPORT_MAP := rte_pmd_tap_version.map
 LIBABIVER := 1
 
 CFLAGS += -O3
+CFLAGS += -I$(SRCDIR)
 CFLAGS += $(WERROR_FLAGS)
 
 #
drivers/net/tap/rte_eth_tap.c +2 -33
index 7557abb2ebfc..536fd206e789 100644
@@ -51,6 +51,8 @@
 #include <linux/if_ether.h>
 #include <fcntl.h>
 
+#include <rte_eth_tap.h>
+
 /* Linux based path to the TUN device */
 #define TUN_TAP_DEV_PATH        "/dev/net/tun"
 #define DEFAULT_TAP_NAME        "dtap"
@@ -81,39 +83,6 @@ static struct rte_eth_link pmd_link = {
 	.link_autoneg = ETH_LINK_SPEED_AUTONEG
 };
 
-struct pkt_stats {
-	uint64_t opackets;		/* Number of output packets */
-	uint64_t ipackets;		/* Number of input packets */
-	uint64_t obytes;		/* Number of bytes on output */
-	uint64_t ibytes;		/* Number of bytes on input */
-	uint64_t errs;			/* Number of error packets */
-};
-
-struct rx_queue {
-	struct rte_mempool *mp;		/* Mempool for RX packets */
-	uint16_t in_port;		/* Port ID */
-	int fd;
-
-	struct pkt_stats stats;		/* Stats for this RX queue */
-};
-
-struct tx_queue {
-	int fd;
-	struct pkt_stats stats;		/* Stats for this TX queue */
-};
-
-struct pmd_internals {
-	char name[RTE_ETH_NAME_MAX_LEN];	/* Internal Tap device name */
-	uint16_t nb_queues;		/* Number of queues supported */
-	struct ether_addr eth_addr;	/* Mac address of the device port */
-
-	int if_index;			/* IF_INDEX for the port */
-	int ioctl_sock;			/* socket for ioctl calls */
-
-	struct rx_queue rxq[RTE_PMD_TAP_MAX_QUEUES];	/* List of RX queues */
-	struct tx_queue txq[RTE_PMD_TAP_MAX_QUEUES];	/* List of TX queues */
-};
-
 static int
 tap_ioctl(struct pmd_internals *pmd, unsigned long request,
 	  struct ifreq *ifr, int set);
drivers/net/tap/rte_eth_tap.h new file +74 -0

74 lines not on this page · raw message

Signature · 1 line
2.8.0.rc0
#30 lore raw

PATCH v4 2/4 net/tap: add preliminary support for rte_flow

In reply to Pascal Mazon

The flow API provides the ability to classify packets received by a tap netdevice.

This patch only implements skeleton functions for flow API support, no patterns are supported yet.

---
 doc/guides/nics/features/tap.ini |   1 +
 drivers/net/tap/Makefile         |   1 +
 drivers/net/tap/rte_eth_tap.c    |   6 ++
 drivers/net/tap/rte_eth_tap.h    |   2 +
 drivers/net/tap/tap_flow.c       | 185 +++++++++++++++++++++++++++++++++++++++
 drivers/net/tap/tap_flow.h       |  46 ++++++++++
 6 files changed, 241 insertions(+)
 create mode 100644 drivers/net/tap/tap_flow.c
 create mode 100644 drivers/net/tap/tap_flow.h
doc/guides/nics/features/tap.ini +1 -0
index a51712dce066..9d73f61cca3b 100644
@@ -9,6 +9,7 @@ Jumbo frame          = Y
 Promiscuous mode     = Y
 Allmulticast mode    = Y
 Basic stats          = Y
+Flow API             = Y
 MTU update           = Y
 Multicast MAC filter = Y
 Speed capabilities   = Y
drivers/net/tap/Makefile +1 -0
index bdbe69e62a4e..386b8b0594d3 100644
@@ -47,6 +47,7 @@ CFLAGS += $(WERROR_FLAGS)
 # all source are stored in SRCS-y
 #
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += rte_eth_tap.c
+SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_flow.c
 
 # this lib depends upon:
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_eal
drivers/net/tap/rte_eth_tap.c +6 -0
index 536fd206e789..78eac9a11ea0 100644
@@ -52,6 +52,7 @@
 #include <fcntl.h>
 
 #include <rte_eth_tap.h>
+#include <tap_flow.h>
 
 /* Linux based path to the TUN device */
 #define TUN_TAP_DEV_PATH        "/dev/net/tun"
@@ -435,6 +436,7 @@ tap_dev_close(struct rte_eth_dev *dev __rte_unused)
 	struct pmd_internals *internals = dev->data->dev_private;
 
 	tap_link_set_down(dev);
+	tap_flow_flush(dev, NULL);
 
 	for (i = 0; i < internals->nb_queues; i++) {
 		if (internals->rxq[i].fd != -1)
@@ -758,6 +760,7 @@ static const struct eth_dev_ops ops = {
 	.stats_get              = tap_stats_get,
 	.stats_reset            = tap_stats_reset,
 	.dev_supported_ptypes_get = tap_dev_supported_ptypes_get,
+	.filter_ctrl            = tap_dev_filter_ctrl,
 };
 
 static int
@@ -829,6 +832,8 @@ eth_dev_tap_create(const char *name, char *tap_name)
 		pmd->txq[i].fd = -1;
 	}
 
+	LIST_INIT(&pmd->flows);
+
 	return 0;
 
 error_exit:
@@ -942,6 +947,7 @@ rte_pmd_tap_remove(const char *name)
 		return 0;
 
 	internals = eth_dev->data->dev_private;
+	tap_flow_flush(eth_dev, NULL);
 	for (i = 0; i < internals->nb_queues; i++)
 		if (internals->rxq[i].fd != -1)
 			close(internals->rxq[i].fd);
drivers/net/tap/rte_eth_tap.h +2 -0
index 880ec1b4fc8c..a64116f5a35e 100644
@@ -34,6 +34,7 @@
 #ifndef _RTE_ETH_TAP_H_
 #define _RTE_ETH_TAP_H_
 
+#include <sys/queue.h>
 #include <inttypes.h>
 
 #include <rte_ethdev.h>
@@ -67,6 +68,7 @@ struct pmd_internals {
 	struct ether_addr eth_addr;       /* Mac address of the device port */
 	int if_index;                     /* IF_INDEX for the port */
 	int ioctl_sock;                   /* socket for ioctl calls */
+	LIST_HEAD(tap_flows, rte_flow) flows;        /* rte_flow rules */
 	struct rx_queue rxq[RTE_PMD_TAP_MAX_QUEUES]; /* List of RX queues */
 	struct tx_queue txq[RTE_PMD_TAP_MAX_QUEUES]; /* List of TX queues */
 };
drivers/net/tap/tap_flow.c new file +185 -0

185 lines not on this page · raw message

drivers/net/tap/tap_flow.h new file +46 -0

46 lines not on this page · raw message

Signature · 1 line
2.8.0.rc0
#31 lore raw

PATCH v4 3/4 net/tap: add netlink back-end for flow API

In reply to Pascal Mazon

Each kernel netdevice may have queueing disciplines set for it, which determine how to handle the packet (mostly on egress). That's part of the TC (Traffic Control) mechanism.

Through TC, it is possible to set filter rules that match specific packets, and act according to what is in the rule. This is a perfect candidate to implement the flow API for the tap PMD, as it has an associated kernel netdevice automatically.

Each flow API rule will be translated into its TC counterpart.

To leverage TC, it is necessary to communicate with the kernel using netlink. This patch introduces a library to help that communication.

Inside netlink.c, functions are generic for any netlink messaging. Inside tcmsgs.c, functions are specific to deal with TC rules.

---
 drivers/net/tap/Makefile      |   2 +
 drivers/net/tap/tap_netlink.c | 367 ++++++++++++++++++++++++++++++++++++++++
 drivers/net/tap/tap_netlink.h |  69 ++++++++
 drivers/net/tap/tap_tcmsgs.c  | 378 ++++++++++++++++++++++++++++++++++++++++++
 drivers/net/tap/tap_tcmsgs.h  |  63 +++++++
 5 files changed, 879 insertions(+)
 create mode 100644 drivers/net/tap/tap_netlink.c
 create mode 100644 drivers/net/tap/tap_netlink.h
 create mode 100644 drivers/net/tap/tap_tcmsgs.c
 create mode 100644 drivers/net/tap/tap_tcmsgs.h
drivers/net/tap/Makefile +2 -0
index 386b8b0594d3..4ae2ca6cfbab 100644
@@ -48,6 +48,8 @@ CFLAGS += $(WERROR_FLAGS)
 #
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += rte_eth_tap.c
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_flow.c
+SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_netlink.c
+SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_tcmsgs.c
 
 # this lib depends upon:
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_eal
drivers/net/tap/tap_netlink.c new file +367 -0

367 lines not on this page · raw message

drivers/net/tap/tap_netlink.h new file +69 -0

69 lines not on this page · raw message

drivers/net/tap/tap_tcmsgs.c new file +378 -0

378 lines not on this page · raw message

drivers/net/tap/tap_tcmsgs.h new file +63 -0

63 lines not on this page · raw message

Signature · 1 line
2.8.0.rc0
Acked-by on v4 3/4
#32 lore raw

Re: [PATCH v4 3/4] net/tap: add netlink back-end for flow API

Quoted 14 lines · Pascal Mazon

Each kernel netdevice may have queueing disciplines set for it, which determine how to handle the packet (mostly on egress). That's part of the TC (Traffic Control) mechanism.

Through TC, it is possible to set filter rules that match specific packets, and act according to what is in the rule. This is a perfect candidate to implement the flow API for the tap PMD, as it has an associated kernel netdevice automatically.

Each flow API rule will be translated into its TC counterpart.

Quoted 8 lines

To leverage TC, it is necessary to communicate with the kernel using netlink. This patch introduces a library to help that communication.

Inside netlink.c, functions are generic for any netlink messaging. Inside tcmsgs.c, functions are specific to deal with TC rules.

Regards,
Keith

#33 lore raw

PATCH v4 4/4 net/tap: add basic flow API patterns and actions

In reply to Pascal Mazon

Supported flow rules are now mapped to TC rules on the tap netdevice. The netlink message used for creating the TC rule is stored in struct rte_flow. That way, by simply changing a metadata in it, we can require for the rule deletion without further parsing.

Supported items:
- eth: src and dst (with variable masks), and eth_type (0xffff mask).
- vlan: vid, pcp, tpid, but not eid.
- ipv4/6: src and dst (with variable masks), and ip_proto (0xffff mask).
- udp/tcp: src and dst port (0xffff) mask.

Supported actions:
- DROP
- QUEUE
- PASSTHRU

It is generally not possible to provide a "last" item. However, if the "last" item, once masked, is identical to the masked spec, then it is supported.

Only IPv4/6 and MAC addresses can use a variable mask. All other items need a full mask (exact match).

Support for VLAN requires kernel headers >= 4.9, checked using auto-config.sh.

---
 doc/guides/nics/tap.rst       |  23 ++
 drivers/net/tap/Makefile      |  40 ++
 drivers/net/tap/rte_eth_tap.c |  61 ++-
 drivers/net/tap/rte_eth_tap.h |   3 +
 drivers/net/tap/tap_flow.c    | 919 +++++++++++++++++++++++++++++++++++++++++-
 drivers/net/tap/tap_flow.h    |  12 +
 6 files changed, 1043 insertions(+), 15 deletions(-)
doc/guides/nics/tap.rst +23 -0
index c4f207be3b47..cdb528b5eae4 100644
@@ -82,6 +82,29 @@ can utilize that stack to handle the network protocols. Plus you would be able
 to address the interface using an IP address assigned to the internal
 interface.
 
+Flow API support
+----------------
+
+The tap PMD supports major flow API pattern items and actions, when running on
+linux kernels above 4.2 ("Flower" classifier required). Supported items:
+
+- eth: src and dst (with variable masks), and eth_type (0xffff mask).
+- vlan: vid, pcp, tpid, but not eid. (requires kernel 4.9)
+- ipv4/6: src and dst (with variable masks), and ip_proto (0xffff mask).
+- udp/tcp: src and dst port (0xffff) mask.
+
+Supported actions:
+
+- DROP
+- QUEUE
+- PASSTHRU
+
+It is generally not possible to provide a "last" item. However, if the "last"
+item, once masked, is identical to the masked spec, then it is supported.
+
+Only IPv4/6 and MAC addresses can use a variable mask. All other items need a
+full mask (exact match).
+
 Example
 -------
 
drivers/net/tap/Makefile +40 -0
index 4ae2ca6cfbab..a6542dad1d66 100644
@@ -41,6 +41,7 @@ LIBABIVER := 1
 
 CFLAGS += -O3
 CFLAGS += -I$(SRCDIR)
+CFLAGS += -I.
 CFLAGS += $(WERROR_FLAGS)
 
 #
@@ -57,5 +58,44 @@ DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_mbuf
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_mempool
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_ether
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_kvargs
+DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_hash
 
 include $(RTE_SDK)/mk/rte.lib.mk
+
+# Generate and clean-up tap_autoconf.h.
+
+export CC CFLAGS CPPFLAGS EXTRA_CFLAGS EXTRA_CPPFLAGS
+export AUTO_CONFIG_CFLAGS = -Wno-error
+
+ifndef V
+AUTOCONF_OUTPUT := >/dev/null
+endif
+
+tap_autoconf.h.new: FORCE
+
+tap_autoconf.h.new: $(RTE_SDK)/buildtools/auto-config-h.sh
+	$Q $(RM) -f -- '$@'
+	$Q sh -- '$<' '$@' \
+		HAVE_TC_FLOWER \
+		linux/pkt_cls.h \
+		enum TCA_FLOWER_UNSPEC \
+		$(AUTOCONF_OUTPUT)
+	$Q sh -- '$<' '$@' \
+		HAVE_TC_VLAN_ID \
+		linux/pkt_cls.h \
+		enum TCA_FLOWER_KEY_VLAN_PRIO \
+		$(AUTOCONF_OUTPUT)
+
+# Create tap_autoconf.h or update it in case it differs from the new one.
+
+tap_autoconf.h: tap_autoconf.h.new
+	$Q [ -f '$@' ] && \
+		cmp '$<' '$@' $(AUTOCONF_OUTPUT) || \
+		mv '$<' '$@'
+
+$(SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP):.c=.o): tap_autoconf.h
+
+clean_tap: FORCE
+	$Q rm -f -- tap_autoconf.h tap_autoconf.h.new
+
+clean: clean_tap
drivers/net/tap/rte_eth_tap.c +59 -2

108 lines not on this page · raw message

drivers/net/tap/rte_eth_tap.h +3 -0
index a64116f5a35e..15ae0b980ace 100644
@@ -68,6 +68,9 @@ struct pmd_internals {
 	struct ether_addr eth_addr;       /* Mac address of the device port */
 	int if_index;                     /* IF_INDEX for the port */
 	int ioctl_sock;                   /* socket for ioctl calls */
+	int nlsk_fd;                      /* Netlink socket fd */
+	int flower_support;               /* 1 if kernel supports, else 0 */
+	int flower_vlan_support;          /* 1 if kernel supports, else 0 */
 	LIST_HEAD(tap_flows, rte_flow) flows;        /* rte_flow rules */
 	struct rx_queue rxq[RTE_PMD_TAP_MAX_QUEUES]; /* List of RX queues */
 	struct tx_queue txq[RTE_PMD_TAP_MAX_QUEUES]; /* List of TX queues */
drivers/net/tap/tap_flow.c +906 -13

977 lines not on this page · raw message

drivers/net/tap/tap_flow.h +12 -0
index 377a9f7b758a..a05e945df523 100644
@@ -37,6 +37,18 @@
 #include <rte_flow.h>
 #include <rte_flow_driver.h>
 
+/**
+ * In TC, priority 0 means we require the kernel to allocate one for us.
+ * In rte_flow, however, we want the priority 0 to be the most important one.
+ * Use an offset to have the most important priority being 1 in TC.
+ */
+#define PRIORITY_OFFSET 1
+#define PRIORITY_MASK (0xfff)
+#define MAX_PRIORITY (PRIORITY_MASK - PRIORITY_OFFSET)
+#define GROUP_MASK (0xf)
+#define GROUP_SHIFT 12
+#define MAX_GROUP GROUP_MASK
+
 int tap_dev_filter_ctrl(struct rte_eth_dev *dev,
 			enum rte_filter_type filter_type,
 			enum rte_filter_op filter_op,
Signature · 1 line
2.8.0.rc0
#34 lore raw

v5 cover net/tap: support flow API

In reply to Pascal Mazon

This series add support for the flow API in tap PMD.

It enables filtering specific packets incoming on the tap netdevice, to process only desired ones. Under the hood, it uses kernel TC (traffic control), which takes place very early in the stack, and supports most common pattern items and actions defined in the flow API.

This series applies on top of:

[PATCH 0/6] net/tap: add additional management ops

v2 changes:
- support compilation on kernels < 4.2 (where flower support appeared)
- set whitespaces in tap.h
- remove unnecessary goto

v3 changes:
- vlan patterns enabled depending on running kernel (4.9+)
- update doc/guides/nics/tap.rst for Flow API support
- rebase on top of "net/tap: add additional management ops" series

v4 changes:
- rebase on top of "net/tap: add additional management ops" series
- fix a few netlink doxygen comments
- rename tap.h -> rte_eth_tap.h
- flush flow rules only when applicable

v5 changes:
- rebase after adrien's patches on Tx poll and Rx signaling
- better spaces for comments in rte_eth_tap.h

Pascal Mazon (4):
net/tap: move private elements to external header net/tap: add preliminary support for rte_flow net/tap: add netlink back-end for flow API net/tap: add basic flow API patterns and actions

 doc/guides/nics/features/tap.ini |    1 +
 doc/guides/nics/tap.rst          |   23 +
 drivers/net/tap/Makefile         |   44 ++
 drivers/net/tap/rte_eth_tap.c    |  101 ++--
 drivers/net/tap/rte_eth_tap.h    |   80 +++
 drivers/net/tap/tap_flow.c       | 1078 ++++++++++++++++++++++++++++++++++++++
 drivers/net/tap/tap_flow.h       |   58 ++
 drivers/net/tap/tap_netlink.c    |  367 +++++++++++++
 drivers/net/tap/tap_netlink.h    |   69 +++
 drivers/net/tap/tap_tcmsgs.c     |  378 +++++++++++++
 drivers/net/tap/tap_tcmsgs.h     |   63 +++
 11 files changed, 2227 insertions(+), 35 deletions(-)
 create mode 100644 drivers/net/tap/rte_eth_tap.h
 create mode 100644 drivers/net/tap/tap_flow.c
 create mode 100644 drivers/net/tap/tap_flow.h
 create mode 100644 drivers/net/tap/tap_netlink.c
 create mode 100644 drivers/net/tap/tap_netlink.h
 create mode 100644 drivers/net/tap/tap_tcmsgs.c
 create mode 100644 drivers/net/tap/tap_tcmsgs.h
Signature · 1 line
2.8.0.rc0
#35 lore raw

PATCH v5 1/4 net/tap: move private elements to external header

In the next patch, access to struct pmd_internals will be necessary in tap_flow.c to store the flows.

---
 drivers/net/tap/Makefile      |  1 +
 drivers/net/tap/rte_eth_tap.c | 36 ++-------------------
 drivers/net/tap/rte_eth_tap.h | 75 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 78 insertions(+), 34 deletions(-)
 create mode 100644 drivers/net/tap/rte_eth_tap.h
drivers/net/tap/Makefile +1 -0
index ddf87232d335..fa4658bd1e75 100644
@@ -40,6 +40,7 @@ EXPORT_MAP := rte_pmd_tap_version.map
 LIBABIVER := 1
 
 CFLAGS += -O3
+CFLAGS += -I$(SRCDIR)
 CFLAGS += $(WERROR_FLAGS)
 
 #
drivers/net/tap/rte_eth_tap.c +2 -34
index f8d9cc7dc3b2..6bb63e5ec873 100644
@@ -55,6 +55,8 @@
 #include <linux/if_ether.h>
 #include <fcntl.h>
 
+#include <rte_eth_tap.h>
+
 /* Linux based path to the TUN device */
 #define TUN_TAP_DEV_PATH        "/dev/net/tun"
 #define DEFAULT_TAP_NAME        "dtap"
@@ -87,40 +89,6 @@ static struct rte_eth_link pmd_link = {
 	.link_autoneg = ETH_LINK_SPEED_AUTONEG
 };
 
-struct pkt_stats {
-	uint64_t opackets;		/* Number of output packets */
-	uint64_t ipackets;		/* Number of input packets */
-	uint64_t obytes;		/* Number of bytes on output */
-	uint64_t ibytes;		/* Number of bytes on input */
-	uint64_t errs;			/* Number of error packets */
-};
-
-struct rx_queue {
-	struct rte_mempool *mp;		/* Mempool for RX packets */
-	uint32_t trigger_seen;		/* Last seen Rx trigger value */
-	uint16_t in_port;		/* Port ID */
-	int fd;
-
-	struct pkt_stats stats;		/* Stats for this RX queue */
-};
-
-struct tx_queue {
-	int fd;
-	struct pkt_stats stats;		/* Stats for this TX queue */
-};
-
-struct pmd_internals {
-	char name[RTE_ETH_NAME_MAX_LEN];	/* Internal Tap device name */
-	uint16_t nb_queues;		/* Number of queues supported */
-	struct ether_addr eth_addr;	/* Mac address of the device port */
-
-	int if_index;			/* IF_INDEX for the port */
-	int ioctl_sock;			/* socket for ioctl calls */
-
-	struct rx_queue rxq[RTE_PMD_TAP_MAX_QUEUES];	/* List of RX queues */
-	struct tx_queue txq[RTE_PMD_TAP_MAX_QUEUES];	/* List of TX queues */
-};
-
 static void
 tap_trigger_cb(int sig __rte_unused)
 {
drivers/net/tap/rte_eth_tap.h new file +75 -0

75 lines not on this page · raw message

Signature · 1 line
2.8.0.rc0
#36 lore raw

Re: [PATCH v5 1/4] net/tap: move private elements to external header

Quoted 117 lines · Pascal Mazon

In the next patch, access to struct pmd_internals will be necessary in tap_flow.c to store the flows.

---

drivers/net/tap/Makefile      |  1 +
drivers/net/tap/rte_eth_tap.c | 36 ++-------------------
drivers/net/tap/rte_eth_tap.h | 75 +++++++++++++++++++++++++++++++++++++++++++
3 files changed, 78 insertions(+), 34 deletions(-)

create mode 100644 drivers/net/tap/rte_eth_tap.h

drivers/net/tap/Makefile +0 -0
index ddf87232d335..fa4658bd1e75 100644
@@ -40,6 +40,7 @@ EXPORT_MAP := rte_pmd_tap_version.map

LIBABIVER := 1

CFLAGS += -O3
+CFLAGS += -I$(SRCDIR)
CFLAGS += $(WERROR_FLAGS)

#

drivers/net/tap/rte_eth_tap.c +2 -34
index f8d9cc7dc3b2..6bb63e5ec873 100644
@@ -55,6 +55,8 @@
 #include <linux/if_ether.h>
 #include <fcntl.h>
 
+#include <rte_eth_tap.h>
+
 /* Linux based path to the TUN device */
 #define TUN_TAP_DEV_PATH        "/dev/net/tun"
 #define DEFAULT_TAP_NAME        "dtap"
@@ -87,40 +89,6 @@ static struct rte_eth_link pmd_link = {
 	.link_autoneg = ETH_LINK_SPEED_AUTONEG
 };
 
-struct pkt_stats {
-	uint64_t opackets;		/* Number of output packets */
-	uint64_t ipackets;		/* Number of input packets */
-	uint64_t obytes;		/* Number of bytes on output */
-	uint64_t ibytes;		/* Number of bytes on input */
-	uint64_t errs;			/* Number of error packets */
-};
-
-struct rx_queue {
-	struct rte_mempool *mp;		/* Mempool for RX packets */
-	uint32_t trigger_seen;		/* Last seen Rx trigger value */
-	uint16_t in_port;		/* Port ID */
-	int fd;
-
-	struct pkt_stats stats;		/* Stats for this RX queue */
-};
-
-struct tx_queue {
-	int fd;
-	struct pkt_stats stats;		/* Stats for this TX queue */
-};
-
-struct pmd_internals {
-	char name[RTE_ETH_NAME_MAX_LEN];	/* Internal Tap device name */
-	uint16_t nb_queues;		/* Number of queues supported */
-	struct ether_addr eth_addr;	/* Mac address of the device port */
-
-	int if_index;			/* IF_INDEX for the port */
-	int ioctl_sock;			/* socket for ioctl calls */
-
-	struct rx_queue rxq[RTE_PMD_TAP_MAX_QUEUES];	/* List of RX queues */
-	struct tx_queue txq[RTE_PMD_TAP_MAX_QUEUES];	/* List of TX queues */
-};
-

static void
tap_trigger_cb(int sig __rte_unused)
{

drivers/net/tap/rte_eth_tap.h new file +30 -0
new file mode 100644
index 000000000000..aafdef1faa99
@@ -0,0 +1,75 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright 2017 6WIND S.A.
+ *   Copyright 2017 Mellanox.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of 6WIND S.A. nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE

drivers/net/tap/rte_eth_tap.h line 40

Quoted 10 lines
drivers/net/tap/rte_eth_tap.h new file +10 -0
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _RTE_ETH_TAP_H_
+#define _RTE_ETH_TAP_H_
+
+#include <inttypes.h>
+
+#include <rte_ethdev.h>
+#include <rte_ether.h>

Just noticed this new header does not have the C++ ifdefs. Create a new patch to fix this problem, unless you need to update this patch series. Just starting my review of this one, sorry was traveling last week.

Quoted 38 lines
drivers/net/tap/rte_eth_tap.h new file +35 -0
+
+#define RTE_PMD_TAP_MAX_QUEUES 16
+
+struct pkt_stats {
+	uint64_t opackets;              /* Number of output packets */
+	uint64_t ipackets;              /* Number of input packets */
+	uint64_t obytes;                /* Number of bytes on output */
+	uint64_t ibytes;                /* Number of bytes on input */
+	uint64_t errs;                  /* Number of TX error packets */
+};
+
+struct rx_queue {
+	struct rte_mempool *mp;         /* Mempool for RX packets */
+	uint32_t trigger_seen;          /* Last seen Rx trigger value */
+	uint16_t in_port;               /* Port ID */
+	int fd;
+	struct pkt_stats stats;         /* Stats for this RX queue */
+};
+
+struct tx_queue {
+	int fd;
+	struct pkt_stats stats;         /* Stats for this TX queue */
+};
+
+struct pmd_internals {
+	char name[RTE_ETH_NAME_MAX_LEN];  /* Internal Tap device name */
+	uint16_t nb_queues;               /* Number of queues supported */
+	struct ether_addr eth_addr;       /* Mac address of the device port */
+	int if_index;                     /* IF_INDEX for the port */
+	int ioctl_sock;                   /* socket for ioctl calls */
+	struct rx_queue rxq[RTE_PMD_TAP_MAX_QUEUES]; /* List of RX queues */
+	struct tx_queue txq[RTE_PMD_TAP_MAX_QUEUES]; /* List of TX queues */
+};
+
+#endif /* _RTE_ETH_TAP_H_ */
Signature · 1 line
2.8.0.rc0

Regards,
Keith

#37 lore raw

Re: [PATCH v5 1/4] net/tap: move private elements to external header

Quoted 9 lines · Keith

Just noticed this new header does not have the C++ ifdefs. Create a new patch to fix this problem, unless you need to update this patch series. Just starting my review of this one, sorry was traveling last week.

Regards,
Keith

Hi Keith,

rte_eth_tap.h header is only presenting functions for local use within the tap driver. That part of the code is completely internal to the driver, compiled as pure C, and is not to be used directly by the (potentially c++) user application linking itself with DPDK.

It's thus normal to keep it standard C without the need for c++ ifdefs.

The other PMDs in drivers/net also don't use the c++ ifdefs in their headers, by the way.

Best regards,
Pascal

#38 lore raw

PATCH v5 2/4 net/tap: add preliminary support for rte_flow

In reply to Pascal Mazon

The flow API provides the ability to classify packets received by a tap netdevice.

This patch only implements skeleton functions for flow API support, no patterns are supported yet.

---
 doc/guides/nics/features/tap.ini |   1 +
 drivers/net/tap/Makefile         |   1 +
 drivers/net/tap/rte_eth_tap.c    |   6 ++
 drivers/net/tap/rte_eth_tap.h    |   2 +
 drivers/net/tap/tap_flow.c       | 185 +++++++++++++++++++++++++++++++++++++++
 drivers/net/tap/tap_flow.h       |  46 ++++++++++
 6 files changed, 241 insertions(+)
 create mode 100644 drivers/net/tap/tap_flow.c
 create mode 100644 drivers/net/tap/tap_flow.h
doc/guides/nics/features/tap.ini +1 -0
index a51712dce066..9d73f61cca3b 100644
@@ -9,6 +9,7 @@ Jumbo frame          = Y
 Promiscuous mode     = Y
 Allmulticast mode    = Y
 Basic stats          = Y
+Flow API             = Y
 MTU update           = Y
 Multicast MAC filter = Y
 Speed capabilities   = Y
drivers/net/tap/Makefile +1 -0
index fa4658bd1e75..45c67de8e970 100644
@@ -47,6 +47,7 @@ CFLAGS += $(WERROR_FLAGS)
 # all source are stored in SRCS-y
 #
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += rte_eth_tap.c
+SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_flow.c
 
 # this lib depends upon:
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_eal
drivers/net/tap/rte_eth_tap.c +6 -0
index 6bb63e5ec873..9127c739a214 100644
@@ -56,6 +56,7 @@
 #include <fcntl.h>
 
 #include <rte_eth_tap.h>
+#include <tap_flow.h>
 
 /* Linux based path to the TUN device */
 #define TUN_TAP_DEV_PATH        "/dev/net/tun"
@@ -482,6 +483,7 @@ tap_dev_close(struct rte_eth_dev *dev __rte_unused)
 	struct pmd_internals *internals = dev->data->dev_private;
 
 	tap_link_set_down(dev);
+	tap_flow_flush(dev, NULL);
 
 	for (i = 0; i < internals->nb_queues; i++) {
 		if (internals->rxq[i].fd != -1)
@@ -806,6 +808,7 @@ static const struct eth_dev_ops ops = {
 	.stats_get              = tap_stats_get,
 	.stats_reset            = tap_stats_reset,
 	.dev_supported_ptypes_get = tap_dev_supported_ptypes_get,
+	.filter_ctrl            = tap_dev_filter_ctrl,
 };
 
 static int
@@ -877,6 +880,8 @@ eth_dev_tap_create(const char *name, char *tap_name)
 		pmd->txq[i].fd = -1;
 	}
 
+	LIST_INIT(&pmd->flows);
+
 	return 0;
 
 error_exit:
@@ -990,6 +995,7 @@ rte_pmd_tap_remove(const char *name)
 		return 0;
 
 	internals = eth_dev->data->dev_private;
+	tap_flow_flush(eth_dev, NULL);
 	for (i = 0; i < internals->nb_queues; i++)
 		if (internals->rxq[i].fd != -1)
 			close(internals->rxq[i].fd);
drivers/net/tap/rte_eth_tap.h +2 -0
index aafdef1faa99..bf8226736627 100644
@@ -34,6 +34,7 @@
 #ifndef _RTE_ETH_TAP_H_
 #define _RTE_ETH_TAP_H_
 
+#include <sys/queue.h>
 #include <inttypes.h>
 
 #include <rte_ethdev.h>
@@ -68,6 +69,7 @@ struct pmd_internals {
 	struct ether_addr eth_addr;       /* Mac address of the device port */
 	int if_index;                     /* IF_INDEX for the port */
 	int ioctl_sock;                   /* socket for ioctl calls */
+	LIST_HEAD(tap_flows, rte_flow) flows;        /* rte_flow rules */
 	struct rx_queue rxq[RTE_PMD_TAP_MAX_QUEUES]; /* List of RX queues */
 	struct tx_queue txq[RTE_PMD_TAP_MAX_QUEUES]; /* List of TX queues */
 };
drivers/net/tap/tap_flow.c new file +185 -0

185 lines not on this page · raw message

drivers/net/tap/tap_flow.h new file +46 -0

46 lines not on this page · raw message

Signature · 1 line
2.8.0.rc0
#39 lore raw

Re: [PATCH v5 2/4] net/tap: add preliminary support for rte_flow

Quoted 11 lines · Pascal Mazon

The flow API provides the ability to classify packets received by a tap netdevice.

This patch only implements skeleton functions for flow API support, no patterns are supported yet.

drivers/net/tap/tap_flow.h line 38

Quoted 5 lines
drivers/net/tap/tap_flow.h new file +5 -0
+#ifndef _TAP_FLOW_H_
+#define _TAP_FLOW_H_
+
+#include <rte_flow.h>
+#include <rte_flow_driver.h>

Missing the C++ ifdefs.

Quoted 11 lines
drivers/net/tap/tap_flow.h new file +8 -0
+
+int tap_dev_filter_ctrl(struct rte_eth_dev *dev,
+			enum rte_filter_type filter_type,
+			enum rte_filter_op filter_op,
+			void *arg);
+int tap_flow_flush(struct rte_eth_dev *dev, struct rte_flow_error *error);
+
+#endif /* _TAP_FLOW_H_ */
Signature · 1 line
2.8.0.rc0

Regards,
Keith

#40 lore raw

PATCH v5 3/4 net/tap: add netlink back-end for flow API

In reply to Pascal Mazon

Each kernel netdevice may have queueing disciplines set for it, which determine how to handle the packet (mostly on egress). That's part of the TC (Traffic Control) mechanism.

Through TC, it is possible to set filter rules that match specific packets, and act according to what is in the rule. This is a perfect candidate to implement the flow API for the tap PMD, as it has an associated kernel netdevice automatically.

Each flow API rule will be translated into its TC counterpart.

To leverage TC, it is necessary to communicate with the kernel using netlink. This patch introduces a library to help that communication.

Inside netlink.c, functions are generic for any netlink messaging. Inside tcmsgs.c, functions are specific to deal with TC rules.

---
 drivers/net/tap/Makefile      |   2 +
 drivers/net/tap/tap_netlink.c | 367 ++++++++++++++++++++++++++++++++++++++++
 drivers/net/tap/tap_netlink.h |  69 ++++++++
 drivers/net/tap/tap_tcmsgs.c  | 378 ++++++++++++++++++++++++++++++++++++++++++
 drivers/net/tap/tap_tcmsgs.h  |  63 +++++++
 5 files changed, 879 insertions(+)
 create mode 100644 drivers/net/tap/tap_netlink.c
 create mode 100644 drivers/net/tap/tap_netlink.h
 create mode 100644 drivers/net/tap/tap_tcmsgs.c
 create mode 100644 drivers/net/tap/tap_tcmsgs.h
drivers/net/tap/Makefile +2 -0
index 45c67de8e970..3a33b560d3b5 100644
@@ -48,6 +48,8 @@ CFLAGS += $(WERROR_FLAGS)
 #
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += rte_eth_tap.c
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_flow.c
+SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_netlink.c
+SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_tcmsgs.c
 
 # this lib depends upon:
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_eal
drivers/net/tap/tap_netlink.c new file +367 -0

367 lines not on this page · raw message

drivers/net/tap/tap_netlink.h new file +69 -0

69 lines not on this page · raw message

drivers/net/tap/tap_tcmsgs.c new file +378 -0

378 lines not on this page · raw message

drivers/net/tap/tap_tcmsgs.h new file +63 -0

63 lines not on this page · raw message

Signature · 1 line
2.8.0.rc0
#41 lore raw

PATCH v5 4/4 net/tap: add basic flow API patterns and actions

In reply to Pascal Mazon

Supported flow rules are now mapped to TC rules on the tap netdevice. The netlink message used for creating the TC rule is stored in struct rte_flow. That way, by simply changing a metadata in it, we can require for the rule deletion without further parsing.

Supported items:
- eth: src and dst (with variable masks), and eth_type (0xffff mask).
- vlan: vid, pcp, tpid, but not eid.
- ipv4/6: src and dst (with variable masks), and ip_proto (0xffff mask).
- udp/tcp: src and dst port (0xffff) mask.

Supported actions:
- DROP
- QUEUE
- PASSTHRU

It is generally not possible to provide a "last" item. However, if the "last" item, once masked, is identical to the masked spec, then it is supported.

Only IPv4/6 and MAC addresses can use a variable mask. All other items need a full mask (exact match).

Support for VLAN requires kernel headers >= 4.9, checked using auto-config.sh.

---
 doc/guides/nics/tap.rst       |  23 ++
 drivers/net/tap/Makefile      |  40 ++
 drivers/net/tap/rte_eth_tap.c |  61 ++-
 drivers/net/tap/rte_eth_tap.h |   3 +
 drivers/net/tap/tap_flow.c    | 919 +++++++++++++++++++++++++++++++++++++++++-
 drivers/net/tap/tap_flow.h    |  12 +
 6 files changed, 1043 insertions(+), 15 deletions(-)
doc/guides/nics/tap.rst +23 -0
index c4f207be3b47..cdb528b5eae4 100644
@@ -82,6 +82,29 @@ can utilize that stack to handle the network protocols. Plus you would be able
 to address the interface using an IP address assigned to the internal
 interface.
 
+Flow API support
+----------------
+
+The tap PMD supports major flow API pattern items and actions, when running on
+linux kernels above 4.2 ("Flower" classifier required). Supported items:
+
+- eth: src and dst (with variable masks), and eth_type (0xffff mask).
+- vlan: vid, pcp, tpid, but not eid. (requires kernel 4.9)
+- ipv4/6: src and dst (with variable masks), and ip_proto (0xffff mask).
+- udp/tcp: src and dst port (0xffff) mask.
+
+Supported actions:
+
+- DROP
+- QUEUE
+- PASSTHRU
+
+It is generally not possible to provide a "last" item. However, if the "last"
+item, once masked, is identical to the masked spec, then it is supported.
+
+Only IPv4/6 and MAC addresses can use a variable mask. All other items need a
+full mask (exact match).
+
 Example
 -------
 
drivers/net/tap/Makefile +40 -0
index 3a33b560d3b5..c42a680555e9 100644
@@ -41,6 +41,7 @@ LIBABIVER := 1
 
 CFLAGS += -O3
 CFLAGS += -I$(SRCDIR)
+CFLAGS += -I.
 CFLAGS += $(WERROR_FLAGS)
 
 #
@@ -58,5 +59,44 @@ DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_mempool
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_ether
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_kvargs
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_net
+DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_hash
 
 include $(RTE_SDK)/mk/rte.lib.mk
+
+# Generate and clean-up tap_autoconf.h.
+
+export CC CFLAGS CPPFLAGS EXTRA_CFLAGS EXTRA_CPPFLAGS
+export AUTO_CONFIG_CFLAGS = -Wno-error
+
+ifndef V
+AUTOCONF_OUTPUT := >/dev/null
+endif
+
+tap_autoconf.h.new: FORCE
+
+tap_autoconf.h.new: $(RTE_SDK)/buildtools/auto-config-h.sh
+	$Q $(RM) -f -- '$@'
+	$Q sh -- '$<' '$@' \
+		HAVE_TC_FLOWER \
+		linux/pkt_cls.h \
+		enum TCA_FLOWER_UNSPEC \
+		$(AUTOCONF_OUTPUT)
+	$Q sh -- '$<' '$@' \
+		HAVE_TC_VLAN_ID \
+		linux/pkt_cls.h \
+		enum TCA_FLOWER_KEY_VLAN_PRIO \
+		$(AUTOCONF_OUTPUT)
+
+# Create tap_autoconf.h or update it in case it differs from the new one.
+
+tap_autoconf.h: tap_autoconf.h.new
+	$Q [ -f '$@' ] && \
+		cmp '$<' '$@' $(AUTOCONF_OUTPUT) || \
+		mv '$<' '$@'
+
+$(SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP):.c=.o): tap_autoconf.h
+
+clean_tap: FORCE
+	$Q rm -f -- tap_autoconf.h tap_autoconf.h.new
+
+clean: clean_tap
drivers/net/tap/rte_eth_tap.c +59 -2

110 lines not on this page · raw message

drivers/net/tap/rte_eth_tap.h +3 -0
index bf8226736627..741ec5350886 100644
@@ -69,6 +69,9 @@ struct pmd_internals {
 	struct ether_addr eth_addr;       /* Mac address of the device port */
 	int if_index;                     /* IF_INDEX for the port */
 	int ioctl_sock;                   /* socket for ioctl calls */
+	int nlsk_fd;                      /* Netlink socket fd */
+	int flower_support;               /* 1 if kernel supports, else 0 */
+	int flower_vlan_support;          /* 1 if kernel supports, else 0 */
 	LIST_HEAD(tap_flows, rte_flow) flows;        /* rte_flow rules */
 	struct rx_queue rxq[RTE_PMD_TAP_MAX_QUEUES]; /* List of RX queues */
 	struct tx_queue txq[RTE_PMD_TAP_MAX_QUEUES]; /* List of TX queues */
drivers/net/tap/tap_flow.c +906 -13

977 lines not on this page · raw message

drivers/net/tap/tap_flow.h +12 -0
index 377a9f7b758a..a05e945df523 100644
@@ -37,6 +37,18 @@
 #include <rte_flow.h>
 #include <rte_flow_driver.h>
 
+/**
+ * In TC, priority 0 means we require the kernel to allocate one for us.
+ * In rte_flow, however, we want the priority 0 to be the most important one.
+ * Use an offset to have the most important priority being 1 in TC.
+ */
+#define PRIORITY_OFFSET 1
+#define PRIORITY_MASK (0xfff)
+#define MAX_PRIORITY (PRIORITY_MASK - PRIORITY_OFFSET)
+#define GROUP_MASK (0xf)
+#define GROUP_SHIFT 12
+#define MAX_GROUP GROUP_MASK
+
 int tap_dev_filter_ctrl(struct rte_eth_dev *dev,
 			enum rte_filter_type filter_type,
 			enum rte_filter_op filter_op,
Signature · 1 line
2.8.0.rc0
#42 lore raw

Re: [PATCH v5 4/4] net/tap: add basic flow API patterns and actions

Quoted 28 lines · Pascal Mazon

Supported flow rules are now mapped to TC rules on the tap netdevice. The netlink message used for creating the TC rule is stored in struct rte_flow. That way, by simply changing a metadata in it, we can require for the rule deletion without further parsing.

Supported items:
- eth: src and dst (with variable masks), and eth_type (0xffff mask).
- vlan: vid, pcp, tpid, but not eid.
- ipv4/6: src and dst (with variable masks), and ip_proto (0xffff mask).
- udp/tcp: src and dst port (0xffff) mask.

Supported actions:
- DROP
- QUEUE
- PASSTHRU

It is generally not possible to provide a "last" item. However, if the "last" item, once masked, is identical to the masked spec, then it is supported.

Only IPv4/6 and MAC addresses can use a variable mask. All other items need a full mask (exact match).

Support for VLAN requires kernel headers >= 4.9, checked using auto-config.sh.

<...>

Quoted 17 lines
drivers/net/tap/tap_flow.c +17 -0
+/**
+ * Set a unique handle in a flow.
+ *
+ * The kernel supports TC rules with equal priority, as long as they use the
+ * same matching fields (e.g.: dst mac and ipv4) with different values (and
+ * full mask to ensure no collision is possible).
+ * In those rules, the handle (uint32_t) is the part that would identify
+ * specifically each rule.
+ *
+ * On 32-bit architectures, the handle can simply be the flow's pointer address.
+ * On 64-bit architectures, we rely on jhash(flow) to find a (sufficiently)
+ * unique handle.
+ *
+ * @param[in, out] flow
+ *   The flow that needs its handle set.
+ */
+static void

drivers/net/tap/tap_flow.c static const struct rte_flow_ops tap_flow_ops = { · line 917

Quoted 10 lines
drivers/net/tap/tap_flow.c +10 -0
+tap_flow_set_handle(struct rte_flow *flow)
+{
+	uint32_t handle = 0;
+
+#if !defined(__SIZEOF_POINTER__) && __SIZEOF_POINTER__ == 8
+	handle = rte_jhash(&flow, sizeof(flow), 1);
+#else
+	if (sizeof(flow) == 4) {
+		/* 32-bits arch */
+		uint64_t h = (uint64_t)flow;

This line is causing build error for i686 target:

.../drivers/net/tap/tap_flow.c: In function ‘tap_flow_set_handle’:
.../drivers/net/tap/tap_flow.c:917:16:
error: cast from pointer to integer of different size [-Werror=pointer-to-int-cast]

   uint64_t h = (uint64_t)flow;
                ^
Quoted 11 lines
drivers/net/tap/tap_flow.c +10 -0
+
+		handle = (uint32_t)h;
+	} else {
+		handle = rte_jhash(&flow, sizeof(flow), 1);
+	}
+#endif
+	/* must be at least 1 to avoid letting the kernel choose one for us */
+	if (!handle)
+		handle = 1;
+	flow->msg.t.tcm_handle = handle;
 }

<...>

Acked-by on the v5 series
#43 lore raw
In reply to Pascal Mazon
Quoted 52 lines · Pascal Mazon

This series add support for the flow API in tap PMD.

It enables filtering specific packets incoming on the tap netdevice, to process only desired ones. Under the hood, it uses kernel TC (traffic control), which takes place very early in the stack, and supports most common pattern items and actions defined in the flow API.

This series applies on top of:

[PATCH 0/6] net/tap: add additional management ops

v2 changes:
- support compilation on kernels < 4.2 (where flower support appeared)
- set whitespaces in tap.h
- remove unnecessary goto

v3 changes:
- vlan patterns enabled depending on running kernel (4.9+)
- update doc/guides/nics/tap.rst for Flow API support
- rebase on top of "net/tap: add additional management ops" series

v4 changes:
- rebase on top of "net/tap: add additional management ops" series
- fix a few netlink doxygen comments
- rename tap.h -> rte_eth_tap.h
- flush flow rules only when applicable

v5 changes:
- rebase after adrien's patches on Tx poll and Rx signaling
- better spaces for comments in rte_eth_tap.h

Pascal Mazon (4):
net/tap: move private elements to external header net/tap: add preliminary support for rte_flow net/tap: add netlink back-end for flow API net/tap: add basic flow API patterns and actions

doc/guides/nics/features/tap.ini |    1 +
doc/guides/nics/tap.rst          |   23 +
drivers/net/tap/Makefile         |   44 ++
drivers/net/tap/rte_eth_tap.c    |  101 ++--
drivers/net/tap/rte_eth_tap.h    |   80 +++
drivers/net/tap/tap_flow.c       | 1078 ++++++++++++++++++++++++++++++++++++++
drivers/net/tap/tap_flow.h       |   58 ++
drivers/net/tap/tap_netlink.c    |  367 +++++++++++++
drivers/net/tap/tap_netlink.h    |   69 +++
drivers/net/tap/tap_tcmsgs.c     |  378 +++++++++++++
drivers/net/tap/tap_tcmsgs.h     |   63 +++
11 files changed, 2227 insertions(+), 35 deletions(-)
Quoted 11 lines

create mode 100644 drivers/net/tap/rte_eth_tap.h
create mode 100644 drivers/net/tap/tap_flow.c
create mode 100644 drivers/net/tap/tap_flow.h
create mode 100644 drivers/net/tap/tap_netlink.c
create mode 100644 drivers/net/tap/tap_netlink.h
create mode 100644 drivers/net/tap/tap_tcmsgs.c
create mode 100644 drivers/net/tap/tap_tcmsgs.h

Signature · 1 line
2.8.0.rc0

Going to Ack the series, but I am not an expert on flows. The only thing I saw was the missing C++ ifdefs in the headers, if that is required, then you can send that update in a new patch instead of reissuing this one, unless you want.

Regards,
Keith

#44 lore raw

v6 cover net/tap: support flow API

In reply to Pascal Mazon

This series add support for the flow API in tap PMD.

It enables filtering specific packets incoming on the tap netdevice, to process only desired ones. Under the hood, it uses kernel TC (traffic control), which takes place very early in the stack, and supports most common pattern items and actions defined in the flow API.

v6 changes:
- fix compilation issue on i686 (wrong cast for rte flow handle)

v5 changes:
- rebase after adrien's patches on Tx poll and Rx signaling
- better spaces for comments in rte_eth_tap.h

v4 changes:
- rebase on top of "net/tap: add additional management ops" series
- fix a few netlink doxygen comments
- rename tap.h -> rte_eth_tap.h
- flush flow rules only when applicable

v3 changes:
- vlan patterns enabled depending on running kernel (4.9+)
- update doc/guides/nics/tap.rst for Flow API support
- rebase on top of "net/tap: add additional management ops" series

v2 changes:
- support compilation on kernels < 4.2 (where flower support appeared)
- set whitespaces in tap.h
- remove unnecessary goto

Pascal Mazon (4):
net/tap: move private elements to external header net/tap: add preliminary support for rte_flow net/tap: add netlink back-end for flow API net/tap: add basic flow API patterns and actions

 doc/guides/nics/features/tap.ini |    1 +
 doc/guides/nics/tap.rst          |   23 +
 drivers/net/tap/Makefile         |   44 ++
 drivers/net/tap/rte_eth_tap.c    |  101 ++--
 drivers/net/tap/rte_eth_tap.h    |   80 +++
 drivers/net/tap/tap_flow.c       | 1070 ++++++++++++++++++++++++++++++++++++++
 drivers/net/tap/tap_flow.h       |   58 +++
 drivers/net/tap/tap_netlink.c    |  367 +++++++++++++
 drivers/net/tap/tap_netlink.h    |   69 +++
 drivers/net/tap/tap_tcmsgs.c     |  378 ++++++++++++++
 drivers/net/tap/tap_tcmsgs.h     |   63 +++
 11 files changed, 2219 insertions(+), 35 deletions(-)
 create mode 100644 drivers/net/tap/rte_eth_tap.h
 create mode 100644 drivers/net/tap/tap_flow.c
 create mode 100644 drivers/net/tap/tap_flow.h
 create mode 100644 drivers/net/tap/tap_netlink.c
 create mode 100644 drivers/net/tap/tap_netlink.h
 create mode 100644 drivers/net/tap/tap_tcmsgs.c
 create mode 100644 drivers/net/tap/tap_tcmsgs.h
Signature · 1 line
2.12.0.306.g4a9b9b3
#45 lore raw

PATCH v6 1/4 net/tap: move private elements to external header

In the next patch, access to struct pmd_internals will be necessary in tap_flow.c to store the flows.

---
 drivers/net/tap/Makefile      |  1 +
 drivers/net/tap/rte_eth_tap.c | 36 ++-------------------
 drivers/net/tap/rte_eth_tap.h | 75 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 78 insertions(+), 34 deletions(-)
 create mode 100644 drivers/net/tap/rte_eth_tap.h
drivers/net/tap/Makefile +1 -0
index ddf87232d335..fa4658bd1e75 100644
@@ -40,6 +40,7 @@ EXPORT_MAP := rte_pmd_tap_version.map
 LIBABIVER := 1
 
 CFLAGS += -O3
+CFLAGS += -I$(SRCDIR)
 CFLAGS += $(WERROR_FLAGS)
 
 #
drivers/net/tap/rte_eth_tap.c +2 -34
index f8d9cc7dc3b2..6bb63e5ec873 100644
@@ -55,6 +55,8 @@
 #include <linux/if_ether.h>
 #include <fcntl.h>
 
+#include <rte_eth_tap.h>
+
 /* Linux based path to the TUN device */
 #define TUN_TAP_DEV_PATH        "/dev/net/tun"
 #define DEFAULT_TAP_NAME        "dtap"
@@ -87,40 +89,6 @@ static struct rte_eth_link pmd_link = {
 	.link_autoneg = ETH_LINK_SPEED_AUTONEG
 };
 
-struct pkt_stats {
-	uint64_t opackets;		/* Number of output packets */
-	uint64_t ipackets;		/* Number of input packets */
-	uint64_t obytes;		/* Number of bytes on output */
-	uint64_t ibytes;		/* Number of bytes on input */
-	uint64_t errs;			/* Number of error packets */
-};
-
-struct rx_queue {
-	struct rte_mempool *mp;		/* Mempool for RX packets */
-	uint32_t trigger_seen;		/* Last seen Rx trigger value */
-	uint16_t in_port;		/* Port ID */
-	int fd;
-
-	struct pkt_stats stats;		/* Stats for this RX queue */
-};
-
-struct tx_queue {
-	int fd;
-	struct pkt_stats stats;		/* Stats for this TX queue */
-};
-
-struct pmd_internals {
-	char name[RTE_ETH_NAME_MAX_LEN];	/* Internal Tap device name */
-	uint16_t nb_queues;		/* Number of queues supported */
-	struct ether_addr eth_addr;	/* Mac address of the device port */
-
-	int if_index;			/* IF_INDEX for the port */
-	int ioctl_sock;			/* socket for ioctl calls */
-
-	struct rx_queue rxq[RTE_PMD_TAP_MAX_QUEUES];	/* List of RX queues */
-	struct tx_queue txq[RTE_PMD_TAP_MAX_QUEUES];	/* List of TX queues */
-};
-
 static void
 tap_trigger_cb(int sig __rte_unused)
 {
drivers/net/tap/rte_eth_tap.h new file +75 -0

75 lines not on this page · raw message

Signature · 1 line
2.12.0.306.g4a9b9b3
#46 lore raw

PATCH v6 2/4 net/tap: add preliminary support for rte_flow

In reply to Pascal Mazon

The flow API provides the ability to classify packets received by a tap netdevice.

This patch only implements skeleton functions for flow API support, no patterns are supported yet.

---
 doc/guides/nics/features/tap.ini |   1 +
 drivers/net/tap/Makefile         |   1 +
 drivers/net/tap/rte_eth_tap.c    |   6 ++
 drivers/net/tap/rte_eth_tap.h    |   2 +
 drivers/net/tap/tap_flow.c       | 185 +++++++++++++++++++++++++++++++++++++++
 drivers/net/tap/tap_flow.h       |  46 ++++++++++
 6 files changed, 241 insertions(+)
 create mode 100644 drivers/net/tap/tap_flow.c
 create mode 100644 drivers/net/tap/tap_flow.h
doc/guides/nics/features/tap.ini +1 -0
index a51712dce066..9d73f61cca3b 100644
@@ -9,6 +9,7 @@ Jumbo frame          = Y
 Promiscuous mode     = Y
 Allmulticast mode    = Y
 Basic stats          = Y
+Flow API             = Y
 MTU update           = Y
 Multicast MAC filter = Y
 Speed capabilities   = Y
drivers/net/tap/Makefile +1 -0
index fa4658bd1e75..45c67de8e970 100644
@@ -47,6 +47,7 @@ CFLAGS += $(WERROR_FLAGS)
 # all source are stored in SRCS-y
 #
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += rte_eth_tap.c
+SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_flow.c
 
 # this lib depends upon:
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_eal
drivers/net/tap/rte_eth_tap.c +6 -0
index 6bb63e5ec873..9127c739a214 100644
@@ -56,6 +56,7 @@
 #include <fcntl.h>
 
 #include <rte_eth_tap.h>
+#include <tap_flow.h>
 
 /* Linux based path to the TUN device */
 #define TUN_TAP_DEV_PATH        "/dev/net/tun"
@@ -482,6 +483,7 @@ tap_dev_close(struct rte_eth_dev *dev __rte_unused)
 	struct pmd_internals *internals = dev->data->dev_private;
 
 	tap_link_set_down(dev);
+	tap_flow_flush(dev, NULL);
 
 	for (i = 0; i < internals->nb_queues; i++) {
 		if (internals->rxq[i].fd != -1)
@@ -806,6 +808,7 @@ static const struct eth_dev_ops ops = {
 	.stats_get              = tap_stats_get,
 	.stats_reset            = tap_stats_reset,
 	.dev_supported_ptypes_get = tap_dev_supported_ptypes_get,
+	.filter_ctrl            = tap_dev_filter_ctrl,
 };
 
 static int
@@ -877,6 +880,8 @@ eth_dev_tap_create(const char *name, char *tap_name)
 		pmd->txq[i].fd = -1;
 	}
 
+	LIST_INIT(&pmd->flows);
+
 	return 0;
 
 error_exit:
@@ -990,6 +995,7 @@ rte_pmd_tap_remove(const char *name)
 		return 0;
 
 	internals = eth_dev->data->dev_private;
+	tap_flow_flush(eth_dev, NULL);
 	for (i = 0; i < internals->nb_queues; i++)
 		if (internals->rxq[i].fd != -1)
 			close(internals->rxq[i].fd);
drivers/net/tap/rte_eth_tap.h +2 -0
index aafdef1faa99..bf8226736627 100644
@@ -34,6 +34,7 @@
 #ifndef _RTE_ETH_TAP_H_
 #define _RTE_ETH_TAP_H_
 
+#include <sys/queue.h>
 #include <inttypes.h>
 
 #include <rte_ethdev.h>
@@ -68,6 +69,7 @@ struct pmd_internals {
 	struct ether_addr eth_addr;       /* Mac address of the device port */
 	int if_index;                     /* IF_INDEX for the port */
 	int ioctl_sock;                   /* socket for ioctl calls */
+	LIST_HEAD(tap_flows, rte_flow) flows;        /* rte_flow rules */
 	struct rx_queue rxq[RTE_PMD_TAP_MAX_QUEUES]; /* List of RX queues */
 	struct tx_queue txq[RTE_PMD_TAP_MAX_QUEUES]; /* List of TX queues */
 };
drivers/net/tap/tap_flow.c new file +185 -0

185 lines not on this page · raw message

drivers/net/tap/tap_flow.h new file +46 -0

46 lines not on this page · raw message

Signature · 1 line
2.12.0.306.g4a9b9b3
#47 lore raw

PATCH v6 3/4 net/tap: add netlink back-end for flow API

In reply to Pascal Mazon

Each kernel netdevice may have queueing disciplines set for it, which determine how to handle the packet (mostly on egress). That's part of the TC (Traffic Control) mechanism.

Through TC, it is possible to set filter rules that match specific packets, and act according to what is in the rule. This is a perfect candidate to implement the flow API for the tap PMD, as it has an associated kernel netdevice automatically.

Each flow API rule will be translated into its TC counterpart.

To leverage TC, it is necessary to communicate with the kernel using netlink. This patch introduces a library to help that communication.

Inside netlink.c, functions are generic for any netlink messaging. Inside tcmsgs.c, functions are specific to deal with TC rules.

---
 drivers/net/tap/Makefile      |   2 +
 drivers/net/tap/tap_netlink.c | 367 ++++++++++++++++++++++++++++++++++++++++
 drivers/net/tap/tap_netlink.h |  69 ++++++++
 drivers/net/tap/tap_tcmsgs.c  | 378 ++++++++++++++++++++++++++++++++++++++++++
 drivers/net/tap/tap_tcmsgs.h  |  63 +++++++
 5 files changed, 879 insertions(+)
 create mode 100644 drivers/net/tap/tap_netlink.c
 create mode 100644 drivers/net/tap/tap_netlink.h
 create mode 100644 drivers/net/tap/tap_tcmsgs.c
 create mode 100644 drivers/net/tap/tap_tcmsgs.h
drivers/net/tap/Makefile +2 -0
index 45c67de8e970..3a33b560d3b5 100644
@@ -48,6 +48,8 @@ CFLAGS += $(WERROR_FLAGS)
 #
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += rte_eth_tap.c
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_flow.c
+SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_netlink.c
+SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_tcmsgs.c
 
 # this lib depends upon:
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_eal
drivers/net/tap/tap_netlink.c new file +367 -0

367 lines not on this page · raw message

drivers/net/tap/tap_netlink.h new file +69 -0

69 lines not on this page · raw message

drivers/net/tap/tap_tcmsgs.c new file +378 -0

378 lines not on this page · raw message

drivers/net/tap/tap_tcmsgs.h new file +63 -0

63 lines not on this page · raw message

Signature · 1 line
2.12.0.306.g4a9b9b3
#48 lore raw

PATCH v6 4/4 net/tap: add basic flow API patterns and actions

In reply to Pascal Mazon

Supported flow rules are now mapped to TC rules on the tap netdevice. The netlink message used for creating the TC rule is stored in struct rte_flow. That way, by simply changing a metadata in it, we can require for the rule deletion without further parsing.

Supported items:
- eth: src and dst (with variable masks), and eth_type (0xffff mask).
- vlan: vid, pcp, tpid, but not eid.
- ipv4/6: src and dst (with variable masks), and ip_proto (0xffff mask).
- udp/tcp: src and dst port (0xffff) mask.

Supported actions:
- DROP
- QUEUE
- PASSTHRU

It is generally not possible to provide a "last" item. However, if the "last" item, once masked, is identical to the masked spec, then it is supported.

Only IPv4/6 and MAC addresses can use a variable mask. All other items need a full mask (exact match).

Support for VLAN requires kernel headers >= 4.9, checked using auto-config.sh.

---
 doc/guides/nics/tap.rst       |  23 ++
 drivers/net/tap/Makefile      |  40 ++
 drivers/net/tap/rte_eth_tap.c |  61 ++-
 drivers/net/tap/rte_eth_tap.h |   3 +
 drivers/net/tap/tap_flow.c    | 911 +++++++++++++++++++++++++++++++++++++++++-
 drivers/net/tap/tap_flow.h    |  12 +
 6 files changed, 1035 insertions(+), 15 deletions(-)
doc/guides/nics/tap.rst +23 -0
index c4f207be3b47..cdb528b5eae4 100644
@@ -82,6 +82,29 @@ can utilize that stack to handle the network protocols. Plus you would be able
 to address the interface using an IP address assigned to the internal
 interface.
 
+Flow API support
+----------------
+
+The tap PMD supports major flow API pattern items and actions, when running on
+linux kernels above 4.2 ("Flower" classifier required). Supported items:
+
+- eth: src and dst (with variable masks), and eth_type (0xffff mask).
+- vlan: vid, pcp, tpid, but not eid. (requires kernel 4.9)
+- ipv4/6: src and dst (with variable masks), and ip_proto (0xffff mask).
+- udp/tcp: src and dst port (0xffff) mask.
+
+Supported actions:
+
+- DROP
+- QUEUE
+- PASSTHRU
+
+It is generally not possible to provide a "last" item. However, if the "last"
+item, once masked, is identical to the masked spec, then it is supported.
+
+Only IPv4/6 and MAC addresses can use a variable mask. All other items need a
+full mask (exact match).
+
 Example
 -------
 
drivers/net/tap/Makefile +40 -0
index 3a33b560d3b5..c42a680555e9 100644
@@ -41,6 +41,7 @@ LIBABIVER := 1
 
 CFLAGS += -O3
 CFLAGS += -I$(SRCDIR)
+CFLAGS += -I.
 CFLAGS += $(WERROR_FLAGS)
 
 #
@@ -58,5 +59,44 @@ DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_mempool
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_ether
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_kvargs
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_net
+DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_hash
 
 include $(RTE_SDK)/mk/rte.lib.mk
+
+# Generate and clean-up tap_autoconf.h.
+
+export CC CFLAGS CPPFLAGS EXTRA_CFLAGS EXTRA_CPPFLAGS
+export AUTO_CONFIG_CFLAGS = -Wno-error
+
+ifndef V
+AUTOCONF_OUTPUT := >/dev/null
+endif
+
+tap_autoconf.h.new: FORCE
+
+tap_autoconf.h.new: $(RTE_SDK)/buildtools/auto-config-h.sh
+	$Q $(RM) -f -- '$@'
+	$Q sh -- '$<' '$@' \
+		HAVE_TC_FLOWER \
+		linux/pkt_cls.h \
+		enum TCA_FLOWER_UNSPEC \
+		$(AUTOCONF_OUTPUT)
+	$Q sh -- '$<' '$@' \
+		HAVE_TC_VLAN_ID \
+		linux/pkt_cls.h \
+		enum TCA_FLOWER_KEY_VLAN_PRIO \
+		$(AUTOCONF_OUTPUT)
+
+# Create tap_autoconf.h or update it in case it differs from the new one.
+
+tap_autoconf.h: tap_autoconf.h.new
+	$Q [ -f '$@' ] && \
+		cmp '$<' '$@' $(AUTOCONF_OUTPUT) || \
+		mv '$<' '$@'
+
+$(SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP):.c=.o): tap_autoconf.h
+
+clean_tap: FORCE
+	$Q rm -f -- tap_autoconf.h tap_autoconf.h.new
+
+clean: clean_tap
drivers/net/tap/rte_eth_tap.c +59 -2

110 lines not on this page · raw message

drivers/net/tap/rte_eth_tap.h +3 -0
index bf8226736627..741ec5350886 100644
@@ -69,6 +69,9 @@ struct pmd_internals {
 	struct ether_addr eth_addr;       /* Mac address of the device port */
 	int if_index;                     /* IF_INDEX for the port */
 	int ioctl_sock;                   /* socket for ioctl calls */
+	int nlsk_fd;                      /* Netlink socket fd */
+	int flower_support;               /* 1 if kernel supports, else 0 */
+	int flower_vlan_support;          /* 1 if kernel supports, else 0 */
 	LIST_HEAD(tap_flows, rte_flow) flows;        /* rte_flow rules */
 	struct rx_queue rxq[RTE_PMD_TAP_MAX_QUEUES]; /* List of RX queues */
 	struct tx_queue txq[RTE_PMD_TAP_MAX_QUEUES]; /* List of TX queues */
drivers/net/tap/tap_flow.c +898 -13

969 lines not on this page · raw message

drivers/net/tap/tap_flow.h +12 -0
index 377a9f7b758a..a05e945df523 100644
@@ -37,6 +37,18 @@
 #include <rte_flow.h>
 #include <rte_flow_driver.h>
 
+/**
+ * In TC, priority 0 means we require the kernel to allocate one for us.
+ * In rte_flow, however, we want the priority 0 to be the most important one.
+ * Use an offset to have the most important priority being 1 in TC.
+ */
+#define PRIORITY_OFFSET 1
+#define PRIORITY_MASK (0xfff)
+#define MAX_PRIORITY (PRIORITY_MASK - PRIORITY_OFFSET)
+#define GROUP_MASK (0xf)
+#define GROUP_SHIFT 12
+#define MAX_GROUP GROUP_MASK
+
 int tap_dev_filter_ctrl(struct rte_eth_dev *dev,
 			enum rte_filter_type filter_type,
 			enum rte_filter_op filter_op,
Signature · 1 line
2.12.0.306.g4a9b9b3
#49 lore raw

Re: [PATCH v6 4/4] net/tap: add basic flow API patterns and actions

Quoted 28 lines · Pascal Mazon

Supported flow rules are now mapped to TC rules on the tap netdevice. The netlink message used for creating the TC rule is stored in struct rte_flow. That way, by simply changing a metadata in it, we can require for the rule deletion without further parsing.

Supported items:
- eth: src and dst (with variable masks), and eth_type (0xffff mask).
- vlan: vid, pcp, tpid, but not eid.
- ipv4/6: src and dst (with variable masks), and ip_proto (0xffff mask).
- udp/tcp: src and dst port (0xffff) mask.

Supported actions:
- DROP
- QUEUE
- PASSTHRU

It is generally not possible to provide a "last" item. However, if the "last" item, once masked, is identical to the masked spec, then it is supported.

Only IPv4/6 and MAC addresses can use a variable mask. All other items need a full mask (exact match).

Support for VLAN requires kernel headers >= 4.9, checked using auto-config.sh.

<...>

Quoted 23 lines
doc/guides/nics/tap.rst +15 -0
index c4f207be3b47..cdb528b5eae4 100644
@@ -82,6 +82,29 @@ can utilize that stack to handle the network protocols. Plus you would be able
 to address the interface using an IP address assigned to the internal
 interface.
 
+Flow API support
+----------------
+
+The tap PMD supports major flow API pattern items and actions, when running on
+linux kernels above 4.2 ("Flower" classifier required). Supported items:
+
+- eth: src and dst (with variable masks), and eth_type (0xffff mask).
+- vlan: vid, pcp, tpid, but not eid. (requires kernel 4.9)
+- ipv4/6: src and dst (with variable masks), and ip_proto (0xffff mask).
+- udp/tcp: src and dst port (0xffff) mask.
+
+Supported actions:
+
+- DROP
+- QUEUE

doc/guides/nics/tap.rst can utilize that stack to handle the network protocols. Plus you would be able · line 109

Quoted 10 lines
doc/guides/nics/tap.rst +8 -0
+- PASSTHRU
+
+It is generally not possible to provide a "last" item. However, if the "last"
+item, once masked, is identical to the masked spec, then it is supported.
+
+Only IPv4/6 and MAC addresses can use a variable mask. All other items need a
+full mask (exact match).
+
 Example
 -------

Hi Pascal,

I believe this is a good feature that deserves more explanation, would you mind adding more documentation, more use cases and a few testpmd usage samples?

btw, you can keep Ack from Keith for next version.

Thanks,
ferruh

Acked-by on the v6 series
#50 lore raw
In reply to Pascal Mazon
Quoted 51 lines · Pascal Mazon

This series add support for the flow API in tap PMD.

It enables filtering specific packets incoming on the tap netdevice, to process only desired ones. Under the hood, it uses kernel TC (traffic control), which takes place very early in the stack, and supports most common pattern items and actions defined in the flow API.

v6 changes:
- fix compilation issue on i686 (wrong cast for rte flow handle)

v5 changes:
- rebase after adrien's patches on Tx poll and Rx signaling
- better spaces for comments in rte_eth_tap.h

v4 changes:
- rebase on top of "net/tap: add additional management ops" series
- fix a few netlink doxygen comments
- rename tap.h -> rte_eth_tap.h
- flush flow rules only when applicable

v3 changes:
- vlan patterns enabled depending on running kernel (4.9+)
- update doc/guides/nics/tap.rst for Flow API support
- rebase on top of "net/tap: add additional management ops" series

v2 changes:
- support compilation on kernels < 4.2 (where flower support appeared)
- set whitespaces in tap.h
- remove unnecessary goto

Pascal Mazon (4):
net/tap: move private elements to external header net/tap: add preliminary support for rte_flow net/tap: add netlink back-end for flow API net/tap: add basic flow API patterns and actions

doc/guides/nics/features/tap.ini |    1 +
doc/guides/nics/tap.rst          |   23 +
drivers/net/tap/Makefile         |   44 ++
drivers/net/tap/rte_eth_tap.c    |  101 ++--
drivers/net/tap/rte_eth_tap.h    |   80 +++
drivers/net/tap/tap_flow.c       | 1070 ++++++++++++++++++++++++++++++++++++++
drivers/net/tap/tap_flow.h       |   58 +++
drivers/net/tap/tap_netlink.c    |  367 +++++++++++++
drivers/net/tap/tap_netlink.h    |   69 +++
drivers/net/tap/tap_tcmsgs.c     |  378 ++++++++++++++
drivers/net/tap/tap_tcmsgs.h     |   63 +++
11 files changed, 2219 insertions(+), 35 deletions(-)
Quoted 11 lines

create mode 100644 drivers/net/tap/rte_eth_tap.h
create mode 100644 drivers/net/tap/tap_flow.c
create mode 100644 drivers/net/tap/tap_flow.h
create mode 100644 drivers/net/tap/tap_netlink.c
create mode 100644 drivers/net/tap/tap_netlink.h
create mode 100644 drivers/net/tap/tap_tcmsgs.c
create mode 100644 drivers/net/tap/tap_tcmsgs.h

Signature · 1 line
2.12.0.306.g4a9b9b3

Did not add my ack to the list, but that is OK I guess.

I still think all headers in DPDK should have the C++ ifdefs as it does not hurt in anyway and just make sure someone does not include it directly.

Regards,
Keith

#51 lore raw

v7 cover net/tap: support flow API

In reply to Pascal Mazon

This series adds support for the flow API in tap PMD.

It enables filtering specific packets incoming on the tap netdevice, to process only desired ones. Under the hood, it uses kernel TC (traffic control), which takes place very early in the stack, and supports most common pattern items and actions defined in the flow API.

v7 changes:
- provide more details in doc/guides/nics/tap.rst

v6 changes:
- fix compilation issue on i686 (wrong cast for rte flow handle)

v5 changes:
- rebase after adrien's patches on Tx poll and Rx signaling
- better spaces for comments in rte_eth_tap.h

v4 changes:
- rebase on top of "net/tap: add additional management ops" series
- fix a few netlink doxygen comments
- rename tap.h -> rte_eth_tap.h
- flush flow rules only when applicable

v3 changes:
- vlan patterns enabled depending on running kernel (4.9+)
- update doc/guides/nics/tap.rst for Flow API support
- rebase on top of "net/tap: add additional management ops" series

v2 changes:
- support compilation on kernels < 4.2 (where flower support appeared)
- set whitespaces in tap.h
- remove unnecessary goto

Pascal Mazon (4):
net/tap: move private elements to external header net/tap: add preliminary support for rte_flow net/tap: add netlink back-end for flow API net/tap: add basic flow API patterns and actions

 doc/guides/nics/features/tap.ini |    1 +
 doc/guides/nics/tap.rst          |   45 ++
 drivers/net/tap/Makefile         |   44 ++
 drivers/net/tap/rte_eth_tap.c    |  101 ++--
 drivers/net/tap/rte_eth_tap.h    |   80 +++
 drivers/net/tap/tap_flow.c       | 1070 ++++++++++++++++++++++++++++++++++++++
 drivers/net/tap/tap_flow.h       |   58 +++
 drivers/net/tap/tap_netlink.c    |  367 +++++++++++++
 drivers/net/tap/tap_netlink.h    |   69 +++
 drivers/net/tap/tap_tcmsgs.c     |  378 ++++++++++++++
 drivers/net/tap/tap_tcmsgs.h     |   63 +++
 11 files changed, 2241 insertions(+), 35 deletions(-)
 create mode 100644 drivers/net/tap/rte_eth_tap.h
 create mode 100644 drivers/net/tap/tap_flow.c
 create mode 100644 drivers/net/tap/tap_flow.h
 create mode 100644 drivers/net/tap/tap_netlink.c
 create mode 100644 drivers/net/tap/tap_netlink.h
 create mode 100644 drivers/net/tap/tap_tcmsgs.c
 create mode 100644 drivers/net/tap/tap_tcmsgs.h
Signature · 1 line
2.12.0.306.g4a9b9b3
#52 lore raw

PATCH v7 1/4 net/tap: move private elements to external header

In the next patch, access to struct pmd_internals will be necessary in tap_flow.c to store the flows.

---
 drivers/net/tap/Makefile      |  1 +
 drivers/net/tap/rte_eth_tap.c | 36 ++-------------------
 drivers/net/tap/rte_eth_tap.h | 75 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 78 insertions(+), 34 deletions(-)
 create mode 100644 drivers/net/tap/rte_eth_tap.h
drivers/net/tap/Makefile +1 -0
index ddf87232d335..fa4658bd1e75 100644
@@ -40,6 +40,7 @@ EXPORT_MAP := rte_pmd_tap_version.map
 LIBABIVER := 1
 
 CFLAGS += -O3
+CFLAGS += -I$(SRCDIR)
 CFLAGS += $(WERROR_FLAGS)
 
 #
drivers/net/tap/rte_eth_tap.c +2 -34
index f8d9cc7dc3b2..6bb63e5ec873 100644
@@ -55,6 +55,8 @@
 #include <linux/if_ether.h>
 #include <fcntl.h>
 
+#include <rte_eth_tap.h>
+
 /* Linux based path to the TUN device */
 #define TUN_TAP_DEV_PATH        "/dev/net/tun"
 #define DEFAULT_TAP_NAME        "dtap"
@@ -87,40 +89,6 @@ static struct rte_eth_link pmd_link = {
 	.link_autoneg = ETH_LINK_SPEED_AUTONEG
 };
 
-struct pkt_stats {
-	uint64_t opackets;		/* Number of output packets */
-	uint64_t ipackets;		/* Number of input packets */
-	uint64_t obytes;		/* Number of bytes on output */
-	uint64_t ibytes;		/* Number of bytes on input */
-	uint64_t errs;			/* Number of error packets */
-};
-
-struct rx_queue {
-	struct rte_mempool *mp;		/* Mempool for RX packets */
-	uint32_t trigger_seen;		/* Last seen Rx trigger value */
-	uint16_t in_port;		/* Port ID */
-	int fd;
-
-	struct pkt_stats stats;		/* Stats for this RX queue */
-};
-
-struct tx_queue {
-	int fd;
-	struct pkt_stats stats;		/* Stats for this TX queue */
-};
-
-struct pmd_internals {
-	char name[RTE_ETH_NAME_MAX_LEN];	/* Internal Tap device name */
-	uint16_t nb_queues;		/* Number of queues supported */
-	struct ether_addr eth_addr;	/* Mac address of the device port */
-
-	int if_index;			/* IF_INDEX for the port */
-	int ioctl_sock;			/* socket for ioctl calls */
-
-	struct rx_queue rxq[RTE_PMD_TAP_MAX_QUEUES];	/* List of RX queues */
-	struct tx_queue txq[RTE_PMD_TAP_MAX_QUEUES];	/* List of TX queues */
-};
-
 static void
 tap_trigger_cb(int sig __rte_unused)
 {
drivers/net/tap/rte_eth_tap.h new file +75 -0

75 lines not on this page · raw message

Signature · 1 line
2.12.0.306.g4a9b9b3
#53 lore raw

PATCH v7 2/4 net/tap: add preliminary support for rte_flow

In reply to Pascal Mazon

The flow API provides the ability to classify packets received by a tap netdevice.

This patch only implements skeleton functions for flow API support, no patterns are supported yet.

---
 doc/guides/nics/features/tap.ini |   1 +
 drivers/net/tap/Makefile         |   1 +
 drivers/net/tap/rte_eth_tap.c    |   6 ++
 drivers/net/tap/rte_eth_tap.h    |   2 +
 drivers/net/tap/tap_flow.c       | 185 +++++++++++++++++++++++++++++++++++++++
 drivers/net/tap/tap_flow.h       |  46 ++++++++++
 6 files changed, 241 insertions(+)
 create mode 100644 drivers/net/tap/tap_flow.c
 create mode 100644 drivers/net/tap/tap_flow.h
doc/guides/nics/features/tap.ini +1 -0
index a51712dce066..9d73f61cca3b 100644
@@ -9,6 +9,7 @@ Jumbo frame          = Y
 Promiscuous mode     = Y
 Allmulticast mode    = Y
 Basic stats          = Y
+Flow API             = Y
 MTU update           = Y
 Multicast MAC filter = Y
 Speed capabilities   = Y
drivers/net/tap/Makefile +1 -0
index fa4658bd1e75..45c67de8e970 100644
@@ -47,6 +47,7 @@ CFLAGS += $(WERROR_FLAGS)
 # all source are stored in SRCS-y
 #
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += rte_eth_tap.c
+SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_flow.c
 
 # this lib depends upon:
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_eal
drivers/net/tap/rte_eth_tap.c +6 -0
index 6bb63e5ec873..9127c739a214 100644
@@ -56,6 +56,7 @@
 #include <fcntl.h>
 
 #include <rte_eth_tap.h>
+#include <tap_flow.h>
 
 /* Linux based path to the TUN device */
 #define TUN_TAP_DEV_PATH        "/dev/net/tun"
@@ -482,6 +483,7 @@ tap_dev_close(struct rte_eth_dev *dev __rte_unused)
 	struct pmd_internals *internals = dev->data->dev_private;
 
 	tap_link_set_down(dev);
+	tap_flow_flush(dev, NULL);
 
 	for (i = 0; i < internals->nb_queues; i++) {
 		if (internals->rxq[i].fd != -1)
@@ -806,6 +808,7 @@ static const struct eth_dev_ops ops = {
 	.stats_get              = tap_stats_get,
 	.stats_reset            = tap_stats_reset,
 	.dev_supported_ptypes_get = tap_dev_supported_ptypes_get,
+	.filter_ctrl            = tap_dev_filter_ctrl,
 };
 
 static int
@@ -877,6 +880,8 @@ eth_dev_tap_create(const char *name, char *tap_name)
 		pmd->txq[i].fd = -1;
 	}
 
+	LIST_INIT(&pmd->flows);
+
 	return 0;
 
 error_exit:
@@ -990,6 +995,7 @@ rte_pmd_tap_remove(const char *name)
 		return 0;
 
 	internals = eth_dev->data->dev_private;
+	tap_flow_flush(eth_dev, NULL);
 	for (i = 0; i < internals->nb_queues; i++)
 		if (internals->rxq[i].fd != -1)
 			close(internals->rxq[i].fd);
drivers/net/tap/rte_eth_tap.h +2 -0
index aafdef1faa99..bf8226736627 100644
@@ -34,6 +34,7 @@
 #ifndef _RTE_ETH_TAP_H_
 #define _RTE_ETH_TAP_H_
 
+#include <sys/queue.h>
 #include <inttypes.h>
 
 #include <rte_ethdev.h>
@@ -68,6 +69,7 @@ struct pmd_internals {
 	struct ether_addr eth_addr;       /* Mac address of the device port */
 	int if_index;                     /* IF_INDEX for the port */
 	int ioctl_sock;                   /* socket for ioctl calls */
+	LIST_HEAD(tap_flows, rte_flow) flows;        /* rte_flow rules */
 	struct rx_queue rxq[RTE_PMD_TAP_MAX_QUEUES]; /* List of RX queues */
 	struct tx_queue txq[RTE_PMD_TAP_MAX_QUEUES]; /* List of TX queues */
 };
drivers/net/tap/tap_flow.c new file +185 -0

185 lines not on this page · raw message

drivers/net/tap/tap_flow.h new file +46 -0

46 lines not on this page · raw message

Signature · 1 line
2.12.0.306.g4a9b9b3
#54 lore raw

PATCH v7 3/4 net/tap: add netlink back-end for flow API

In reply to Pascal Mazon

Each kernel netdevice may have queueing disciplines set for it, which determine how to handle the packet (mostly on egress). That's part of the TC (Traffic Control) mechanism.

Through TC, it is possible to set filter rules that match specific packets, and act according to what is in the rule. This is a perfect candidate to implement the flow API for the tap PMD, as it has an associated kernel netdevice automatically.

Each flow API rule will be translated into its TC counterpart.

To leverage TC, it is necessary to communicate with the kernel using netlink. This patch introduces a library to help that communication.

Inside netlink.c, functions are generic for any netlink messaging. Inside tcmsgs.c, functions are specific to deal with TC rules.

---
 drivers/net/tap/Makefile      |   2 +
 drivers/net/tap/tap_netlink.c | 367 ++++++++++++++++++++++++++++++++++++++++
 drivers/net/tap/tap_netlink.h |  69 ++++++++
 drivers/net/tap/tap_tcmsgs.c  | 378 ++++++++++++++++++++++++++++++++++++++++++
 drivers/net/tap/tap_tcmsgs.h  |  63 +++++++
 5 files changed, 879 insertions(+)
 create mode 100644 drivers/net/tap/tap_netlink.c
 create mode 100644 drivers/net/tap/tap_netlink.h
 create mode 100644 drivers/net/tap/tap_tcmsgs.c
 create mode 100644 drivers/net/tap/tap_tcmsgs.h
drivers/net/tap/Makefile +2 -0
index 45c67de8e970..3a33b560d3b5 100644
@@ -48,6 +48,8 @@ CFLAGS += $(WERROR_FLAGS)
 #
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += rte_eth_tap.c
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_flow.c
+SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_netlink.c
+SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_tcmsgs.c
 
 # this lib depends upon:
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_eal
drivers/net/tap/tap_netlink.c new file +367 -0

367 lines not on this page · raw message

drivers/net/tap/tap_netlink.h new file +69 -0

69 lines not on this page · raw message

drivers/net/tap/tap_tcmsgs.c new file +378 -0

378 lines not on this page · raw message

drivers/net/tap/tap_tcmsgs.h new file +63 -0

63 lines not on this page · raw message

Signature · 1 line
2.12.0.306.g4a9b9b3
#55 lore raw

PATCH v7 4/4 net/tap: add basic flow API patterns and actions

In reply to Pascal Mazon

Supported flow rules are now mapped to TC rules on the tap netdevice. The netlink message used for creating the TC rule is stored in struct rte_flow. That way, by simply changing a metadata in it, we can require for the rule deletion without further parsing.

Supported items:
- eth: src and dst (with variable masks), and eth_type (0xffff mask).
- vlan: vid, pcp, tpid, but not eid.
- ipv4/6: src and dst (with variable masks), and ip_proto (0xffff mask).
- udp/tcp: src and dst port (0xffff) mask.

Supported actions:
- DROP
- QUEUE
- PASSTHRU

It is generally not possible to provide a "last" item. However, if the "last" item, once masked, is identical to the masked spec, then it is supported.

Only IPv4/6 and MAC addresses can use a variable mask. All other items need a full mask (exact match).

Support for VLAN requires kernel headers >= 4.9, checked using auto-config.sh.

---
 doc/guides/nics/tap.rst       |  45 +++
 drivers/net/tap/Makefile      |  40 ++
 drivers/net/tap/rte_eth_tap.c |  61 ++-
 drivers/net/tap/rte_eth_tap.h |   3 +
 drivers/net/tap/tap_flow.c    | 911 +++++++++++++++++++++++++++++++++++++++++-
 drivers/net/tap/tap_flow.h    |  12 +
 6 files changed, 1057 insertions(+), 15 deletions(-)
doc/guides/nics/tap.rst +45 -0
index c4f207be3b47..4986e47e9f57 100644
@@ -82,6 +82,51 @@ can utilize that stack to handle the network protocols. Plus you would be able
 to address the interface using an IP address assigned to the internal
 interface.
 
+Flow API support
+----------------
+
+The tap PMD supports major flow API pattern items and actions, when running on
+linux kernels above 4.2 ("Flower" classifier required). Supported items:
+
+- eth: src and dst (with variable masks), and eth_type (0xffff mask).
+- vlan: vid, pcp, tpid, but not eid. (requires kernel 4.9)
+- ipv4/6: src and dst (with variable masks), and ip_proto (0xffff mask).
+- udp/tcp: src and dst port (0xffff) mask.
+
+Supported actions:
+
+- DROP
+- QUEUE
+- PASSTHRU
+
+It is generally not possible to provide a "last" item. However, if the "last"
+item, once masked, is identical to the masked spec, then it is supported.
+
+Only IPv4/6 and MAC addresses can use a variable mask. All other items need a
+full mask (exact match).
+
+As rules are translated to TC, it is possible to show them with something like::
+
+   tc -s filter show dev tap1 parent 1:
+
+Examples of testpmd flow rules
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Drop packets for destination IP 192.168.0.1::
+
+   testpmd> flow create 0 priority 1 ingress pattern eth / ipv4 dst is 1.1.1.1 \
+            / end actions drop / end
+
+Ensure packets from a given MAC address are received on a queue 2::
+
+   testpmd> flow create 0 priority 2 ingress pattern eth src is 06:05:04:03:02:01 \
+            / end actions queue index 2 / end
+
+Drop UDP packets in vlan 3::
+
+   testpmd> flow create 0 priority 3 ingress pattern eth / vlan vid is 3 / \
+            ipv4 proto is 17 / end actions drop / end
+
 Example
 -------
 
drivers/net/tap/Makefile +40 -0
index 3a33b560d3b5..c42a680555e9 100644
@@ -41,6 +41,7 @@ LIBABIVER := 1
 
 CFLAGS += -O3
 CFLAGS += -I$(SRCDIR)
+CFLAGS += -I.
 CFLAGS += $(WERROR_FLAGS)
 
 #
@@ -58,5 +59,44 @@ DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_mempool
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_ether
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_kvargs
 DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_net
+DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += lib/librte_hash
 
 include $(RTE_SDK)/mk/rte.lib.mk
+
+# Generate and clean-up tap_autoconf.h.
+
+export CC CFLAGS CPPFLAGS EXTRA_CFLAGS EXTRA_CPPFLAGS
+export AUTO_CONFIG_CFLAGS = -Wno-error
+
+ifndef V
+AUTOCONF_OUTPUT := >/dev/null
+endif
+
+tap_autoconf.h.new: FORCE
+
+tap_autoconf.h.new: $(RTE_SDK)/buildtools/auto-config-h.sh
+	$Q $(RM) -f -- '$@'
+	$Q sh -- '$<' '$@' \
+		HAVE_TC_FLOWER \
+		linux/pkt_cls.h \
+		enum TCA_FLOWER_UNSPEC \
+		$(AUTOCONF_OUTPUT)
+	$Q sh -- '$<' '$@' \
+		HAVE_TC_VLAN_ID \
+		linux/pkt_cls.h \
+		enum TCA_FLOWER_KEY_VLAN_PRIO \
+		$(AUTOCONF_OUTPUT)
+
+# Create tap_autoconf.h or update it in case it differs from the new one.
+
+tap_autoconf.h: tap_autoconf.h.new
+	$Q [ -f '$@' ] && \
+		cmp '$<' '$@' $(AUTOCONF_OUTPUT) || \
+		mv '$<' '$@'
+
+$(SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP):.c=.o): tap_autoconf.h
+
+clean_tap: FORCE
+	$Q rm -f -- tap_autoconf.h tap_autoconf.h.new
+
+clean: clean_tap
drivers/net/tap/rte_eth_tap.c +59 -2

110 lines not on this page · raw message

drivers/net/tap/rte_eth_tap.h +3 -0
index bf8226736627..741ec5350886 100644
@@ -69,6 +69,9 @@ struct pmd_internals {
 	struct ether_addr eth_addr;       /* Mac address of the device port */
 	int if_index;                     /* IF_INDEX for the port */
 	int ioctl_sock;                   /* socket for ioctl calls */
+	int nlsk_fd;                      /* Netlink socket fd */
+	int flower_support;               /* 1 if kernel supports, else 0 */
+	int flower_vlan_support;          /* 1 if kernel supports, else 0 */
 	LIST_HEAD(tap_flows, rte_flow) flows;        /* rte_flow rules */
 	struct rx_queue rxq[RTE_PMD_TAP_MAX_QUEUES]; /* List of RX queues */
 	struct tx_queue txq[RTE_PMD_TAP_MAX_QUEUES]; /* List of TX queues */
drivers/net/tap/tap_flow.c +898 -13

969 lines not on this page · raw message

drivers/net/tap/tap_flow.h +12 -0
index 377a9f7b758a..a05e945df523 100644
@@ -37,6 +37,18 @@
 #include <rte_flow.h>
 #include <rte_flow_driver.h>
 
+/**
+ * In TC, priority 0 means we require the kernel to allocate one for us.
+ * In rte_flow, however, we want the priority 0 to be the most important one.
+ * Use an offset to have the most important priority being 1 in TC.
+ */
+#define PRIORITY_OFFSET 1
+#define PRIORITY_MASK (0xfff)
+#define MAX_PRIORITY (PRIORITY_MASK - PRIORITY_OFFSET)
+#define GROUP_MASK (0xf)
+#define GROUP_SHIFT 12
+#define MAX_GROUP GROUP_MASK
+
 int tap_dev_filter_ctrl(struct rte_eth_dev *dev,
 			enum rte_filter_type filter_type,
 			enum rte_filter_op filter_op,
Signature · 1 line
2.12.0.306.g4a9b9b3
#56 lore raw
In reply to Pascal Mazon
Quoted 33 lines · Pascal Mazon

This series adds support for the flow API in tap PMD.

It enables filtering specific packets incoming on the tap netdevice, to process only desired ones. Under the hood, it uses kernel TC (traffic control), which takes place very early in the stack, and supports most common pattern items and actions defined in the flow API.

v7 changes:
- provide more details in doc/guides/nics/tap.rst

v6 changes:
- fix compilation issue on i686 (wrong cast for rte flow handle)

v5 changes:
- rebase after adrien's patches on Tx poll and Rx signaling
- better spaces for comments in rte_eth_tap.h

v4 changes:
- rebase on top of "net/tap: add additional management ops" series
- fix a few netlink doxygen comments
- rename tap.h -> rte_eth_tap.h
- flush flow rules only when applicable

v3 changes:
- vlan patterns enabled depending on running kernel (4.9+)
- update doc/guides/nics/tap.rst for Flow API support
- rebase on top of "net/tap: add additional management ops" series

v2 changes:
- support compilation on kernels < 4.2 (where flower support appeared)
- set whitespaces in tap.h
- remove unnecessary goto

Quoted 5 lines

Pascal Mazon (4):
net/tap: move private elements to external header net/tap: add preliminary support for rte_flow net/tap: add netlink back-end for flow API net/tap: add basic flow API patterns and actions

Series applied to dpdk-next-net/master, thanks.