net/tap: support flow API
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
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
@@ -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
@@ -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
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_internalswill be necessary intap_flow.cto store the flows.Signed-off-by Pascal Mazon <[email protected]>Acked-by Olga Shern <[email protected]>---
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.hdrivers/net/tap/Makefile +0
-0@@ -40,6 +40,7 @@ EXPORT_MAP := rte_pmd_tap_version.mapLIBABIVER := 1
CFLAGS += -O3
+CFLAGS += -I$(SRCDIR)
CFLAGS += $(WERROR_FLAGS)#
drivers/net/tap/rte_eth_tap.c +2
-32@@ -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@@ -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
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_internalswill be necessary intap_flow.cto store the flows.Signed-off-by Pascal Mazon <[email protected]>Acked-by Olga Shern <[email protected]>---
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.hdrivers/net/tap/Makefile +0
-0@@ -40,6 +40,7 @@ EXPORT_MAP := rte_pmd_tap_version.mapLIBABIVER := 1
CFLAGS += -O3
+CFLAGS += -I$(SRCDIR)
CFLAGS += $(WERROR_FLAGS)#
(quoted diff) +0
-0
b/drivers/net/tap/rte_eth_tap.cindex3fd057225ab3..fa57d645f3b1100644 ---a/drivers/net/tap/rte_eth_tap.c
+++b/drivers/net/tap/rte_eth_tap.cdrivers/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 outputpackets */
drivers/net/tap/Makefile +0
-1- uint64_t ipackets; /* Number of inputpackets */
drivers/net/tap/Makefile +0
-1- uint64_t obytes; /* Number of bytes onoutput */
drivers/net/tap/Makefile +0
-1- uint64_t ibytes; /* Number of bytes oninput */
drivers/net/tap/Makefile +0
-1- uint64_t errs; /* Number of errorpackets */ -};
drivers/net/tap/Makefile +0
-3- -struct rx_queue { - struct rte_mempool *mp; /* Mempool for RXpackets */
drivers/net/tap/Makefile +0
-4- uint16_t in_port; /* Port ID */ - int fd; - - struct pkt_stats stats; /* Stats for thisRX queue */ -};
drivers/net/tap/Makefile +0
-4- -struct tx_queue { - int fd; - struct pkt_stats stats; /* Stats for thisTX queue */ -};
drivers/net/tap/Makefile +0
-3- -struct pmd_internals { - char name[RTE_ETH_NAME_MAX_LEN]; /* Internal Tapdevice name */
drivers/net/tap/Makefile +0
-1- uint16_t nb_queues; /* Number of queuessupported */
drivers/net/tap/Makefile +0
-1- struct ether_addr eth_addr; /* Mac address of thedevice port */ -
drivers/net/tap/Makefile +0
-1- int if_index; /* IF_INDEX for theport */ -
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 --gita/drivers/net/tap/tap.hb/drivers/net/tap/tap.hnew file mode 100644
index 000000000000..88f62b895febdrivers/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 devicename */
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.rc0Regards,
Keith
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_internalswill be necessary intap_flow.cto store the flows.Signed-off-by Pascal Mazon <[email protected]>Acked-by Olga Shern <[email protected]>---
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.hdrivers/net/tap/Makefile +0
-0@@ -40,6 +40,7 @@ EXPORT_MAP := rte_pmd_tap_version.mapLIBABIVER := 1
CFLAGS += -O3
+CFLAGS += -I$(SRCDIR)
CFLAGS += $(WERROR_FLAGS)#
(quoted diff) +0
-0
b/drivers/net/tap/rte_eth_tap.cindex3fd057225ab3..fa57d645f3b1100644 ---a/drivers/net/tap/rte_eth_tap.c
+++b/drivers/net/tap/rte_eth_tap.cdrivers/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 outputpackets */
drivers/net/tap/Makefile +0
-1- uint64_t ipackets; /* Number of inputpackets */
drivers/net/tap/Makefile +0
-1- uint64_t obytes; /* Number of bytes onoutput */
drivers/net/tap/Makefile +0
-1- uint64_t ibytes; /* Number of bytes oninput */
drivers/net/tap/Makefile +0
-1- uint64_t errs; /* Number of errorpackets */ -};
drivers/net/tap/Makefile +0
-3- -struct rx_queue { - struct rte_mempool *mp; /* Mempool for RXpackets */
drivers/net/tap/Makefile +0
-4- uint16_t in_port; /* Port ID */ - int fd; - - struct pkt_stats stats; /* Stats for thisRX queue */ -};
drivers/net/tap/Makefile +0
-4- -struct tx_queue { - int fd; - struct pkt_stats stats; /* Stats for thisTX queue */ -};
drivers/net/tap/Makefile +0
-3- -struct pmd_internals { - char name[RTE_ETH_NAME_MAX_LEN]; /* Internal Tapdevice name */
drivers/net/tap/Makefile +0
-1- uint16_t nb_queues; /* Number of queuessupported */
drivers/net/tap/Makefile +0
-1- struct ether_addr eth_addr; /* Mac address of thedevice port */ -
drivers/net/tap/Makefile +0
-1- int if_index; /* IF_INDEX for theport */ -
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 --gita/drivers/net/tap/tap.hb/drivers/net/tap/tap.hnew file mode 100644
index 000000000000..88f62b895febdrivers/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 devicename */
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,
PascalQuoted 9 lines
Quoted 5 lines
drivers/net/tap/tap.h new file +2
-0+ +#endif /* _TAP_H_ */ Signature · 1 line
2.8.0.rc0Regards,
Keith
Regards,
Keith
PATCH 2/4 net/tap: add preliminary support for rte_flow
In reply to Pascal MazonThe 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
@@ -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
@@ -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
@@ -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
@@ -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
PATCH 3/4 net/tap: add netlink back-end for flow API
In reply to Pascal MazonEach 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
@@ -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
PATCH 4/4 net/tap: add basic flow API patterns and actions
In reply to Pascal MazonSupported 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
@@ -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
@@ -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
@@ -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
@@ -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
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), andeth_type(0xffffmask).
- vlan: vid, pcp, tpid, but not eid.
- ipv4/6: src and dst (with variable masks), andip_proto(0xffffmask).
- udp/tcp: src and dst port (0xffff) mask.Supported actions:
- DROP
- QUEUE
- PASSTHRUIt 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.Signed-off-by Pascal Mazon <[email protected]>Acked-by Olga Shern <[email protected]>—
…
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@@ -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
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), andeth_type(0xffffmask).
- vlan: vid, pcp, tpid, but not eid.
- ipv4/6: src and dst (with variable masks), andip_proto(0xffffmask).
- udp/tcp: src and dst port (0xffff) mask.Supported actions:
- DROP
- QUEUE
- PASSTHRUIt 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.Signed-off-by Pascal Mazon <[email protected]>Acked-by Olga Shern <[email protected]>—
…
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 tokernel");
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 toour 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@@ -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.
+ * Inrte_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,
enumrte_filter_typefilter_type, enumrte_filter_opfilter_op,Signature · 1 line
2.8.0.rc0Regards,
Keith
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 forrte_flownet/tap: add netlink back-end for flow API net/tap: add basic flow API patterns and actionsdoc/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 100644drivers/net/tap/tap_flow.c
create mode 100644drivers/net/tap/tap_flow.h
create mode 100644drivers/net/tap/tap_netlink.c
create mode 100644drivers/net/tap/tap_netlink.h
create mode 100644drivers/net/tap/tap_tcmsgs.c
create mode 100644drivers/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
v2 cover net/tap: support flow API
In reply to Pascal MazonThis 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
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
@@ -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
@@ -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
PATCH v2 2/4 net/tap: add preliminary support for rte_flow
In reply to Pascal MazonThe 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
@@ -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
@@ -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
@@ -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
@@ -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
PATCH v2 3/4 net/tap: add netlink back-end for flow API
In reply to Pascal MazonEach 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
@@ -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
PATCH v2 4/4 net/tap: add basic flow API patterns and actions
In reply to Pascal MazonSupported 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
@@ -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
@@ -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
@@ -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
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 intap.h
- remove unnecessary gotoPascal Mazon (4):
net/tap: move private elements to external header net/tap: add preliminary support forrte_flownet/tap: add netlink back-end for flow API net/tap: add basic flow API patterns and actionsdoc/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
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.rstdoc
- 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_internalschanged (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,
PascalQuoted 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 intap.h
- remove unnecessary gotoPascal Mazon (4):
net/tap: move private elements to external header net/tap: add preliminary support forrte_flownet/tap: add netlink back-end for flow API net/tap: add basic flow API patterns and actionsdoc/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, 2202insertions(+), 33 deletions(-) create mode 100644
drivers/net/tap/tap.hcreate mode 100644drivers/net/tap/tap_flow.ccreate mode 100644drivers/net/tap/tap_flow.h
create mode 100644drivers/net/tap/tap_netlink.c
create mode 100644drivers/net/tap/tap_netlink.h
create mode 100644drivers/net/tap/tap_tcmsgs.c
create mode 100644drivers/net/tap/tap_tcmsgs.h
Regards,
Keith
v3 cover net/tap: support flow API
In reply to Pascal MazonThis 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
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
@@ -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
@@ -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
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_internalswill be necessary intap_flow.cto store the flows.Signed-off-by Pascal Mazon <[email protected]>Acked-by Olga Shern <[email protected]>--- 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.
<...>
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_internalswill be necessary intap_flow.cto store the flows.Signed-off-by Pascal Mazon <[email protected]>Acked-by Olga Shern <[email protected]>--- drivers/net/tap/Makefile | 1 + drivers/net/tap/rte_eth_tap.c | 34 ++------------------ drivers/net/tap/tap.h | 73+++++++++++++++++++++++++++++++++++++++++++
Quoted 3 lines
tap.his a generic name, I thinkrte_eth_tap.hfits better here.<...>
I'm ok with that. I'll change it in my next version.
PATCH v3 2/4 net/tap: add preliminary support for rte_flow
In reply to Pascal MazonThe 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
@@ -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
@@ -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
@@ -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
@@ -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
PATCH v3 3/4 net/tap: add netlink back-end for flow API
In reply to Pascal MazonEach 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
@@ -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
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. Insidetcmsgs.c, functions are specific to deal with TC rules.Signed-off-by Pascal Mazon <[email protected]>Acked-by Olga Shern <[email protected]>
<...>
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. Insidetcmsgs.c, functions are specific to deal with TC rules.Signed-off-by Pascal Mazon <[email protected]>Acked-by Olga Shern <[email protected]><...>
PATCH v3 4/4 net/tap: add basic flow API patterns and actions
In reply to Pascal MazonSupported 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
@@ -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
@@ -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
@@ -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
@@ -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
v4 cover net/tap: support flow API
In reply to Pascal MazonThis 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
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
@@ -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
@@ -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
Re: [PATCH v4 1/4] net/tap: move private elements to external header
Quoted 8 lines · Pascal Mazon
In the next patch, access to struct
pmd_internalswill be necessary intap_flow.cto store the flows.Signed-off-by Pascal Mazon <[email protected]>Acked-by Olga Shern <[email protected]>
Regards,
Keith
PATCH v4 2/4 net/tap: add preliminary support for rte_flow
In reply to Pascal MazonThe 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
@@ -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
@@ -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
@@ -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
@@ -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
PATCH v4 3/4 net/tap: add netlink back-end for flow API
In reply to Pascal MazonEach 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
@@ -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
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. Insidetcmsgs.c, functions are specific to deal with TC rules.Signed-off-by Pascal Mazon <[email protected]>Acked-by Olga Shern <[email protected]>
Regards,
Keith
PATCH v4 4/4 net/tap: add basic flow API patterns and actions
In reply to Pascal MazonSupported 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
@@ -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
@@ -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
@@ -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
@@ -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
v5 cover net/tap: support flow API
In reply to Pascal MazonThis 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
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
@@ -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
@@ -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
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_internalswill be necessary intap_flow.cto store the flows.Signed-off-by Pascal Mazon <[email protected]>Acked-by Olga Shern <[email protected]>---
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.hdrivers/net/tap/Makefile +0
-0@@ -40,6 +40,7 @@ EXPORT_MAP := rte_pmd_tap_version.mapLIBABIVER := 1
CFLAGS += -O3
+CFLAGS += -I$(SRCDIR)
CFLAGS += $(WERROR_FLAGS)#
drivers/net/tap/rte_eth_tap.c +2
-34@@ -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@@ -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
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
PATCH v5 2/4 net/tap: add preliminary support for rte_flow
In reply to Pascal MazonThe 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
@@ -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
@@ -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
@@ -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
@@ -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
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.
Signed-off-by Pascal Mazon <[email protected]>Acked-by Olga Shern <[email protected]>
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
PATCH v5 3/4 net/tap: add netlink back-end for flow API
In reply to Pascal MazonEach 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
@@ -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
PATCH v5 4/4 net/tap: add basic flow API patterns and actions
In reply to Pascal MazonSupported 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
@@ -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
@@ -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
@@ -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
@@ -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
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), andeth_type(0xffffmask).
- vlan: vid, pcp, tpid, but not eid.
- ipv4/6: src and dst (with variable masks), andip_proto(0xffffmask).
- udp/tcp: src and dst port (0xffff) mask.Supported actions:
- DROP
- QUEUE
- PASSTHRUIt 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.Signed-off-by Pascal Mazon <[email protected]>Acked-by Olga Shern <[email protected]>
<...>
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; }
<...>
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 intap.h
- remove unnecessary gotov3 changes:
- vlan patterns enabled depending on running kernel (4.9+)
- updatedoc/guides/nics/tap.rstfor Flow API support
- rebase on top of "net/tap: add additional management ops" seriesv4 changes:
- rebase on top of "net/tap: add additional management ops" series
- fix a few netlink doxygen comments
- renametap.h->rte_eth_tap.h
- flush flow rules only when applicablev5 changes:
- rebase after adrien's patches on Tx poll and Rx signaling
- better spaces for comments inrte_eth_tap.hPascal Mazon (4):
net/tap: move private elements to external header net/tap: add preliminary support forrte_flownet/tap: add netlink back-end for flow API net/tap: add basic flow API patterns and actionsdoc/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 100644drivers/net/tap/tap_flow.c
create mode 100644drivers/net/tap/tap_flow.h
create mode 100644drivers/net/tap/tap_netlink.c
create mode 100644drivers/net/tap/tap_netlink.h
create mode 100644drivers/net/tap/tap_tcmsgs.c
create mode 100644drivers/net/tap/tap_tcmsgs.hSignature · 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
v6 cover net/tap: support flow API
In reply to Pascal MazonThis 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
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
@@ -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
@@ -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
PATCH v6 2/4 net/tap: add preliminary support for rte_flow
In reply to Pascal MazonThe 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
@@ -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
@@ -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
@@ -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
@@ -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
PATCH v6 3/4 net/tap: add netlink back-end for flow API
In reply to Pascal MazonEach 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
@@ -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
PATCH v6 4/4 net/tap: add basic flow API patterns and actions
In reply to Pascal MazonSupported 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
@@ -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
@@ -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
@@ -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
@@ -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
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), andeth_type(0xffffmask).
- vlan: vid, pcp, tpid, but not eid.
- ipv4/6: src and dst (with variable masks), andip_proto(0xffffmask).
- udp/tcp: src and dst port (0xffff) mask.Supported actions:
- DROP
- QUEUE
- PASSTHRUIt 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.Signed-off-by Pascal Mazon <[email protected]>Acked-by Olga Shern <[email protected]>
<...>
Quoted 23 lines
doc/guides/nics/tap.rst +15
-0@@ -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
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 inrte_eth_tap.hv4 changes:
- rebase on top of "net/tap: add additional management ops" series
- fix a few netlink doxygen comments
- renametap.h->rte_eth_tap.h
- flush flow rules only when applicablev3 changes:
- vlan patterns enabled depending on running kernel (4.9+)
- updatedoc/guides/nics/tap.rstfor Flow API support
- rebase on top of "net/tap: add additional management ops" seriesv2 changes:
- support compilation on kernels < 4.2 (where flower support appeared)
- set whitespaces intap.h
- remove unnecessary gotoPascal Mazon (4):
net/tap: move private elements to external header net/tap: add preliminary support forrte_flownet/tap: add netlink back-end for flow API net/tap: add basic flow API patterns and actionsdoc/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 100644drivers/net/tap/tap_flow.c
create mode 100644drivers/net/tap/tap_flow.h
create mode 100644drivers/net/tap/tap_netlink.c
create mode 100644drivers/net/tap/tap_netlink.h
create mode 100644drivers/net/tap/tap_tcmsgs.c
create mode 100644drivers/net/tap/tap_tcmsgs.hSignature · 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
v7 cover net/tap: support flow API
In reply to Pascal MazonThis 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
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
@@ -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
@@ -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
PATCH v7 2/4 net/tap: add preliminary support for rte_flow
In reply to Pascal MazonThe 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
@@ -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
@@ -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
@@ -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
@@ -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
PATCH v7 3/4 net/tap: add netlink back-end for flow API
In reply to Pascal MazonEach 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
@@ -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
PATCH v7 4/4 net/tap: add basic flow API patterns and actions
In reply to Pascal MazonSupported 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
@@ -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
@@ -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
@@ -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
@@ -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
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 indoc/guides/nics/tap.rstv6 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 inrte_eth_tap.hv4 changes:
- rebase on top of "net/tap: add additional management ops" series
- fix a few netlink doxygen comments
- renametap.h->rte_eth_tap.h
- flush flow rules only when applicablev3 changes:
- vlan patterns enabled depending on running kernel (4.9+)
- updatedoc/guides/nics/tap.rstfor Flow API support
- rebase on top of "net/tap: add additional management ops" seriesv2 changes:
- support compilation on kernels < 4.2 (where flower support appeared)
- set whitespaces intap.h
- remove unnecessary goto
Quoted 5 lines
Pascal Mazon (4):
net/tap: move private elements to external header net/tap: add preliminary support forrte_flownet/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.