All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bernard Iremonger <bernard.iremonger@intel.com>
To: dev@dpdk.org, ferruh.yigit@intel.com,
	konstantin.ananyev@intel.com, cristian.dumitrescu@intel.com,
	adrien.mazarguil@6wind.com
Cc: Bernard Iremonger <bernard.iremonger@intel.com>
Subject: [PATCH v7 4/4] test: flow classify library unit tests
Date: Mon,  2 Oct 2017 10:31:08 +0100	[thread overview]
Message-ID: <1506936668-31197-5-git-send-email-bernard.iremonger@intel.com> (raw)
In-Reply-To: <1506676737-23900-1-git-send-email-bernard.iremonger@intel.com>

Add flow_classify_autotest program.

Set up IPv4 ACL field definitions.
Create table_acl for use by librte_flow_classify API's.
Create an mbuf pool for use by rte_flow_classify_query.

For each of the librte_flow_classify API's:
add bad parameter tests
add bad pattern tests
add bad action tests
add good parameter tests

Initialise ipv4 udp traffic for use by the udp test for
rte_flow_classif_query.

Initialise ipv4 tcp traffic for use by the tcp test for
rte_flow_classif_query.

Initialise ipv4 sctp traffic for use by the sctp test for
rte_flow_classif_query.

Signed-off-by: Bernard Iremonger <bernard.iremonger@intel.com>
---
 test/test/Makefile             |   1 +
 test/test/test_flow_classify.c | 698 +++++++++++++++++++++++++++++++++++++++++
 test/test/test_flow_classify.h | 240 ++++++++++++++
 3 files changed, 939 insertions(+)
 create mode 100644 test/test/test_flow_classify.c
 create mode 100644 test/test/test_flow_classify.h

diff --git a/test/test/Makefile b/test/test/Makefile
index 42d9a49..073e1ed 100644
--- a/test/test/Makefile
+++ b/test/test/Makefile
@@ -106,6 +106,7 @@ SRCS-y += test_table_tables.c
 SRCS-y += test_table_ports.c
 SRCS-y += test_table_combined.c
 SRCS-$(CONFIG_RTE_LIBRTE_ACL) += test_table_acl.c
+SRCS-$(CONFIG_RTE_LIBRTE_ACL) += test_flow_classify.c
 endif
 
 SRCS-y += test_rwlock.c
diff --git a/test/test/test_flow_classify.c b/test/test/test_flow_classify.c
new file mode 100644
index 0000000..e7fbe73
--- /dev/null
+++ b/test/test/test_flow_classify.c
@@ -0,0 +1,698 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2017 Intel Corporation. All rights reserved.
+ *   All rights reserved.
+ *
+ *   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 Intel Corporation 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.
+ */
+
+#include <string.h>
+#include <errno.h>
+
+#include "test.h"
+
+#include <rte_string_fns.h>
+#include <rte_mbuf.h>
+#include <rte_byteorder.h>
+#include <rte_ip.h>
+#include <rte_acl.h>
+#include <rte_common.h>
+#include <rte_table_acl.h>
+#include <rte_flow.h>
+#include <rte_flow_classify.h>
+
+#include "packet_burst_generator.h"
+#include "test_flow_classify.h"
+
+
+#define FLOW_CLASSIFY_MAX_RULE_NUM 100
+static void *table_acl;
+static uint32_t entry_size;
+
+/*
+ * test functions by passing invalid or
+ * non-workable parameters.
+ */
+static int
+test_invalid_parameters(void)
+{
+	struct rte_flow_classify *classify;
+	int ret;
+
+	ret = rte_flow_classify_validate(NULL, NULL, NULL, NULL, NULL);
+	if (!ret) {
+		printf("Line %i: flow_classify_validate", __LINE__);
+		printf(" with NULL param should have failed!\n");
+		return -1;
+	}
+
+	classify = rte_flow_classify_create(NULL, 0, NULL, NULL, NULL, NULL);
+	if (classify) {
+		printf("Line %i: flow_classify_create", __LINE__);
+		printf(" with NULL param should have failed!\n");
+		return -1;
+	}
+
+	ret = rte_flow_classify_destroy(NULL, NULL, NULL);
+	if (!ret) {
+		printf("Line %i: flow_classify_destroy", __LINE__);
+		printf(" with NULL param should have failed!\n");
+		return -1;
+	}
+
+	ret = rte_flow_classify_query(NULL, NULL, NULL, 0, NULL, NULL);
+	if (!ret) {
+		printf("Line %i: flow_classify_query", __LINE__);
+		printf(" with NULL param should have failed!\n");
+		return -1;
+	}
+
+	ret = rte_flow_classify_validate(NULL, NULL, NULL, NULL, &error);
+	if (!ret) {
+		printf("Line %i: flow_classify_validate", __LINE__);
+		printf(" with NULL param should have failed!\n");
+		return -1;
+	}
+
+	classify = rte_flow_classify_create(NULL, 0, NULL, NULL, NULL, &error);
+	if (classify) {
+		printf("Line %i: flow_classify_create ", __LINE__);
+		printf("with NULL param should have failed!\n");
+		return -1;
+	}
+
+	ret = rte_flow_classify_destroy(NULL, NULL, &error);
+	if (!ret) {
+		printf("Line %i: flow_classify_destroy", __LINE__);
+		printf("with NULL param should have failed!\n");
+		return -1;
+	}
+
+	ret = rte_flow_classify_query(NULL, NULL, NULL, 0, NULL, &error);
+	if (!ret) {
+		printf("Line %i: flow_classify_query", __LINE__);
+		printf(" with NULL param should have failed!\n");
+		return -1;
+	}
+	return 0;
+}
+
+static int
+test_valid_parameters(void)
+{
+	struct rte_flow_classify *flow_classify;
+	int ret;
+
+	/* set up parameters for rte_flow_classify_validate and
+	 * rte_flow_classify_create and rte_flow_classify_destroy
+	 */
+
+	attr.ingress = 1;
+	attr.priority = 1;
+	pattern[0] = eth_item;
+	pattern[1] = ipv4_udp_item_1;
+	pattern[2] = udp_item_1;
+	pattern[3] = end_item;
+	actions[0] = count_action;
+	actions[1] = end_action;
+
+	ret = rte_flow_classify_validate(table_acl, &attr,
+			pattern, actions, &error);
+	if (ret) {
+		printf("Line %i: flow_classify_validate", __LINE__);
+		printf(" should not have failed!\n");
+		return -1;
+	}
+
+	flow_classify = rte_flow_classify_create(table_acl, entry_size, &attr,
+			pattern, actions, &error);
+	if (!flow_classify) {
+		printf("Line %i: flow_classify_create", __LINE__);
+		printf(" should not have failed!\n");
+		return -1;
+	}
+
+	ret = rte_flow_classify_destroy(table_acl, flow_classify, &error);
+	if (ret) {
+		printf("Line %i: flow_classify_destroy", __LINE__);
+		printf(" should not have failed!\n");
+		return -1;
+	}
+	return 0;
+}
+
+static int
+test_invalid_patterns(void)
+{
+	struct rte_flow_classify *flow_classify;
+	int ret;
+
+	/* set up parameters for rte_flow_classify_validate and
+	 * rte_flow_classify_create and rte_flow_classify_destroy
+	 */
+
+	attr.ingress = 1;
+	attr.priority = 1;
+	pattern[0] = eth_item_bad;
+	pattern[1] = ipv4_udp_item_1;
+	pattern[2] = udp_item_1;
+	pattern[3] = end_item;
+	actions[0] = count_action;
+	actions[1] = end_action;
+
+	ret = rte_flow_classify_validate(table_acl, &attr,
+			pattern, actions, &error);
+	if (!ret) {
+		printf("Line %i: flow_classify_validate", __LINE__);
+		printf(" should have failed!\n");
+		return -1;
+	}
+
+	pattern[0] = eth_item;
+	pattern[1] = ipv4_udp_item_bad;
+	flow_classify = rte_flow_classify_create(table_acl, entry_size, &attr,
+			pattern, actions, &error);
+	if (flow_classify) {
+		printf("Line %i: flow_classify_create", __LINE__);
+		printf(" should have failed!\n");
+		return -1;
+	}
+
+	ret = rte_flow_classify_destroy(table_acl, flow_classify, &error);
+	if (!ret) {
+		printf("Line %i: flow_classify_destroy", __LINE__);
+		printf(" should have failed!\n");
+		return -1;
+	}
+
+	pattern[1] = ipv4_udp_item_1;
+	pattern[2] = udp_item_bad;
+	ret = rte_flow_classify_validate(table_acl, &attr,
+			pattern, actions, &error);
+	if (!ret) {
+		printf("Line %i: flow_classify_validate", __LINE__);
+		printf(" should have failed!\n");
+		return -1;
+	}
+
+	pattern[2] = udp_item_1;
+	pattern[3] = end_item_bad;
+	flow_classify = rte_flow_classify_create(table_acl, entry_size, &attr,
+			pattern, actions, &error);
+	if (flow_classify) {
+		printf("Line %i: flow_classify_create", __LINE__);
+		printf(" should have failed!\n");
+		return -1;
+	}
+
+	ret = rte_flow_classify_destroy(table_acl, flow_classify, &error);
+	if (!ret) {
+		printf("Line %i: flow_classify_destroy", __LINE__);
+		printf(" should have failed!\n");
+		return -1;
+	}
+	return 0;
+}
+
+static int
+test_invalid_actions(void)
+{
+	struct rte_flow_classify *flow_classify;
+	int ret;
+
+	/* set up parameters for rte_flow_classify_validate and
+	 * rte_flow_classify_create and rte_flow_classify_destroy
+	 */
+
+	attr.ingress = 1;
+	attr.priority = 1;
+	pattern[0] = eth_item;
+	pattern[1] = ipv4_udp_item_1;
+	pattern[2] = udp_item_1;
+	pattern[3] = end_item;
+	actions[0] = count_action_bad;
+	actions[1] = end_action;
+
+	ret = rte_flow_classify_validate(table_acl, &attr,
+			pattern, actions, &error);
+	if (!ret) {
+		printf("Line %i: flow_classify_validate", __LINE__);
+		printf(" should have failed!\n");
+		return -1;
+	}
+
+	flow_classify = rte_flow_classify_create(table_acl, entry_size, &attr,
+			pattern, actions, &error);
+	if (flow_classify) {
+		printf("Line %i: flow_classify_create", __LINE__);
+		printf(" should have failed!\n");
+		return -1;
+	}
+
+	ret = rte_flow_classify_destroy(table_acl, flow_classify, &error);
+	if (!ret) {
+		printf("Line %i: flow_classify_destroy", __LINE__);
+		printf(" should have failed!\n");
+		return -1;
+	}
+
+	actions[0] = count_action;
+	actions[1] = end_action_bad;
+	ret = rte_flow_classify_validate(table_acl, &attr,
+			pattern, actions, &error);
+	if (!ret) {
+		printf("Line %i: flow_classify_validate", __LINE__);
+		printf(" should have failed!\n");
+		return -1;
+	}
+
+	flow_classify = rte_flow_classify_create(table_acl, entry_size, &attr,
+			pattern, actions, &error);
+	if (flow_classify) {
+		printf("Line %i: flow_classify_create", __LINE__);
+		printf(" should have failed!\n");
+		return -1;
+	}
+
+	ret = rte_flow_classify_destroy(table_acl, flow_classify, &error);
+	if (!ret) {
+		printf("Line %i: flow_classify_destroy", __LINE__);
+		printf("should have failed!\n");
+		return -1;
+	}
+	return 0;
+}
+
+static int
+init_ipv4_udp_traffic(struct rte_mempool *mp,
+	     struct rte_mbuf **pkts_burst, uint32_t burst_size)
+{
+	struct ether_hdr pkt_eth_hdr;
+	struct ipv4_hdr pkt_ipv4_hdr;
+	struct udp_hdr pkt_udp_hdr;
+	uint32_t src_addr = IPV4_ADDR(2, 2, 2, 3);
+	uint32_t dst_addr = IPV4_ADDR(2, 2, 2, 7);
+	uint16_t src_port = 32;
+	uint16_t dst_port = 33;
+	uint16_t pktlen;
+
+	static uint8_t src_mac[] = { 0x00, 0xFF, 0xAA, 0xFF, 0xAA, 0xFF };
+	static uint8_t dst_mac[] = { 0x00, 0xAA, 0xFF, 0xAA, 0xFF, 0xAA };
+
+	printf("Set up IPv4 UDP traffic\n");
+	initialize_eth_header(&pkt_eth_hdr,
+		(struct ether_addr *)src_mac,
+		(struct ether_addr *)dst_mac, ETHER_TYPE_IPv4, 0, 0);
+	pktlen = (uint16_t)(sizeof(struct ether_hdr));
+	printf("ETH  pktlen %u\n", pktlen);
+
+	pktlen = initialize_ipv4_header(&pkt_ipv4_hdr, src_addr, dst_addr,
+					pktlen);
+	printf("ETH + IPv4 pktlen %u\n", pktlen);
+
+	pktlen = initialize_udp_header(&pkt_udp_hdr, src_port, dst_port,
+					pktlen);
+	printf("ETH + IPv4 + UDP pktlen %u\n\n", pktlen);
+
+	return generate_packet_burst(mp, pkts_burst, &pkt_eth_hdr,
+				     0, &pkt_ipv4_hdr, 1,
+				     &pkt_udp_hdr, burst_size,
+				     PACKET_BURST_GEN_PKT_LEN, 1);
+}
+
+static int
+init_ipv4_tcp_traffic(struct rte_mempool *mp,
+	     struct rte_mbuf **pkts_burst, uint32_t burst_size)
+{
+	struct ether_hdr pkt_eth_hdr;
+	struct ipv4_hdr pkt_ipv4_hdr;
+	struct tcp_hdr pkt_tcp_hdr;
+	uint32_t src_addr = IPV4_ADDR(1, 2, 3, 4);
+	uint32_t dst_addr = IPV4_ADDR(5, 6, 7, 8);
+	uint16_t src_port = 16;
+	uint16_t dst_port = 17;
+	uint16_t pktlen;
+
+	static uint8_t src_mac[] = { 0x00, 0xFF, 0xAA, 0xFF, 0xAA, 0xFF };
+	static uint8_t dst_mac[] = { 0x00, 0xAA, 0xFF, 0xAA, 0xFF, 0xAA };
+
+	printf("Set up IPv4 TCP traffic\n");
+	initialize_eth_header(&pkt_eth_hdr,
+		(struct ether_addr *)src_mac,
+		(struct ether_addr *)dst_mac, ETHER_TYPE_IPv4, 0, 0);
+	pktlen = (uint16_t)(sizeof(struct ether_hdr));
+	printf("ETH  pktlen %u\n", pktlen);
+
+	pktlen = initialize_ipv4_header_proto(&pkt_ipv4_hdr, src_addr,
+					dst_addr, pktlen, IPPROTO_TCP);
+	printf("ETH + IPv4 pktlen %u\n", pktlen);
+
+	pktlen = initialize_tcp_header(&pkt_tcp_hdr, src_port, dst_port,
+					pktlen);
+	printf("ETH + IPv4 + TCP pktlen %u\n\n", pktlen);
+
+	return generate_packet_burst_proto(mp, pkts_burst, &pkt_eth_hdr,
+					0, &pkt_ipv4_hdr, 1, IPPROTO_TCP,
+					&pkt_tcp_hdr, burst_size,
+					PACKET_BURST_GEN_PKT_LEN, 1);
+}
+
+static int
+init_ipv4_sctp_traffic(struct rte_mempool *mp,
+	     struct rte_mbuf **pkts_burst, uint32_t burst_size)
+{
+	struct ether_hdr pkt_eth_hdr;
+	struct ipv4_hdr pkt_ipv4_hdr;
+	struct sctp_hdr pkt_sctp_hdr;
+	uint32_t src_addr = IPV4_ADDR(11, 12, 13, 14);
+	uint32_t dst_addr = IPV4_ADDR(15, 16, 17, 18);
+	uint16_t src_port = 10;
+	uint16_t dst_port = 11;
+	uint16_t pktlen;
+
+	static uint8_t src_mac[] = { 0x00, 0xFF, 0xAA, 0xFF, 0xAA, 0xFF };
+	static uint8_t dst_mac[] = { 0x00, 0xAA, 0xFF, 0xAA, 0xFF, 0xAA };
+
+	printf("Set up IPv4 SCTP traffic\n");
+	initialize_eth_header(&pkt_eth_hdr,
+		(struct ether_addr *)src_mac,
+		(struct ether_addr *)dst_mac, ETHER_TYPE_IPv4, 0, 0);
+	pktlen = (uint16_t)(sizeof(struct ether_hdr));
+	printf("ETH  pktlen %u\n", pktlen);
+
+	pktlen = initialize_ipv4_header_proto(&pkt_ipv4_hdr, src_addr,
+					dst_addr, pktlen, IPPROTO_SCTP);
+	printf("ETH + IPv4 pktlen %u\n", pktlen);
+
+	pktlen = initialize_sctp_header(&pkt_sctp_hdr, src_port, dst_port,
+					pktlen);
+	printf("ETH + IPv4 + SCTP pktlen %u\n\n", pktlen);
+
+	return generate_packet_burst_proto(mp, pkts_burst, &pkt_eth_hdr,
+					0, &pkt_ipv4_hdr, 1, IPPROTO_SCTP,
+					&pkt_sctp_hdr, burst_size,
+					PACKET_BURST_GEN_PKT_LEN, 1);
+}
+
+static int
+init_mbufpool(void)
+{
+	int socketid;
+	int ret = 0;
+	unsigned int lcore_id;
+	char s[64];
+
+	for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) {
+		if (rte_lcore_is_enabled(lcore_id) == 0)
+			continue;
+
+		socketid = rte_lcore_to_socket_id(lcore_id);
+		if (socketid >= NB_SOCKETS) {
+			printf(
+				"Socket %d of lcore %u is out of range %d\n",
+				socketid, lcore_id, NB_SOCKETS);
+			ret = -1;
+			break;
+		}
+		if (mbufpool[socketid] == NULL) {
+			snprintf(s, sizeof(s), "mbuf_pool_%d", socketid);
+			mbufpool[socketid] =
+				rte_pktmbuf_pool_create(s, NB_MBUF,
+					MEMPOOL_CACHE_SIZE, 0, MBUF_SIZE,
+					socketid);
+			if (mbufpool[socketid]) {
+				printf("Allocated mbuf pool on socket %d\n",
+					socketid);
+			} else {
+				printf("Cannot init mbuf pool on socket %d\n",
+					socketid);
+				ret = -ENOMEM;
+				break;
+			}
+		}
+	}
+	return ret;
+}
+
+static int
+test_query_udp(void)
+{
+	struct rte_flow_error error;
+	struct rte_flow_classify *flow_classify;
+	int ret;
+	int i;
+
+	ret = init_ipv4_udp_traffic(mbufpool[0], bufs, MAX_PKT_BURST);
+	if (ret != MAX_PKT_BURST) {
+		printf("Line %i: init_udp_ipv4_traffic has failed!\n",
+				__LINE__);
+		return -1;
+	}
+
+	for (i = 0; i < MAX_PKT_BURST; i++)
+		bufs[i]->packet_type = RTE_PTYPE_L3_IPV4;
+
+	/* set up parameters for rte_flow_classify_validate and
+	 * rte_flow_classify_create and rte_flow_classify_destroy
+	 */
+
+	attr.ingress = 1;
+	attr.priority = 1;
+	pattern[0] = eth_item;
+	pattern[1] = ipv4_udp_item_1;
+	pattern[2] = udp_item_1;
+	pattern[3] = end_item;
+	actions[0] = count_action;
+	actions[1] = end_action;
+
+	ret = rte_flow_classify_validate(table_acl, &attr,
+			pattern, actions, &error);
+	if (ret) {
+		printf("Line %i: flow_classify_validate", __LINE__);
+		printf(" should not have failed!\n");
+		return -1;
+	}
+
+	flow_classify = rte_flow_classify_create(table_acl, entry_size, &attr,
+			pattern, actions, &error);
+	if (!flow_classify) {
+		printf("Line %i: flow_classify_create", __LINE__);
+		printf(" should not have failed!\n");
+		return -1;
+	}
+
+	ret = rte_flow_classify_query(table_acl, flow_classify, bufs,
+			MAX_PKT_BURST, &udp_classify_stats, &error);
+	if (ret) {
+		printf("Line %i: flow_classify_query", __LINE__);
+		printf(" should not have failed!\n");
+		return -1;
+	}
+
+	ret = rte_flow_classify_destroy(table_acl, flow_classify, &error);
+	if (ret) {
+		printf("Line %i: flow_classify_destroy", __LINE__);
+		printf(" should not have failed!\n");
+		return -1;
+	}
+	return 0;
+}
+
+static int
+test_query_tcp(void)
+{
+	struct rte_flow_classify *flow_classify;
+	int ret;
+	int i;
+
+	ret = init_ipv4_tcp_traffic(mbufpool[0], bufs, MAX_PKT_BURST);
+	if (ret != MAX_PKT_BURST) {
+		printf("Line %i: init_ipv4_tcp_traffic has failed!\n",
+				__LINE__);
+		return -1;
+	}
+
+	for (i = 0; i < MAX_PKT_BURST; i++)
+		bufs[i]->packet_type = RTE_PTYPE_L3_IPV4;
+
+	/* set up parameters for rte_flow_classify_validate and
+	 * rte_flow_classify_create and rte_flow_classify_destroy
+	 */
+
+	attr.ingress = 1;
+	attr.priority = 1;
+	pattern[0] = eth_item;
+	pattern[1] = ipv4_tcp_item_1;
+	pattern[2] = tcp_item_1;
+	pattern[3] = end_item;
+	actions[0] = count_action;
+	actions[1] = end_action;
+
+	ret = rte_flow_classify_validate(table_acl, &attr,
+			pattern, actions, &error);
+	if (ret) {
+		printf("Line %i: flow_classify_validate", __LINE__);
+		printf(" should not have failed!\n");
+		return -1;
+	}
+
+	flow_classify = rte_flow_classify_create(table_acl, entry_size, &attr,
+			pattern, actions, &error);
+	if (!flow_classify) {
+		printf("Line %i: flow_classify_create", __LINE__);
+		printf(" should not have failed!\n");
+		return -1;
+	}
+
+	ret = rte_flow_classify_query(table_acl, flow_classify, bufs,
+			MAX_PKT_BURST, &tcp_classify_stats, &error);
+	if (ret) {
+		printf("Line %i: flow_classify_query", __LINE__);
+		printf(" should not have failed!\n");
+		return -1;
+	}
+
+	ret = rte_flow_classify_destroy(table_acl, flow_classify, &error);
+	if (ret) {
+		printf("Line %i: flow_classify_destroy", __LINE__);
+		printf(" should not have failed!\n");
+		return -1;
+	}
+	return 0;
+}
+
+static int
+test_query_sctp(void)
+{
+	struct rte_flow_classify *flow_classify;
+	int ret;
+	int i;
+
+	ret = init_ipv4_sctp_traffic(mbufpool[0], bufs, MAX_PKT_BURST);
+	if (ret != MAX_PKT_BURST) {
+		printf("Line %i: init_ipv4_tcp_traffic has failed!\n",
+				__LINE__);
+		return -1;
+	}
+
+	for (i = 0; i < MAX_PKT_BURST; i++)
+		bufs[i]->packet_type = RTE_PTYPE_L3_IPV4;
+
+	/* set up parameters for rte_flow_classify_validate and
+	 * rte_flow_classify_create and rte_flow_classify_destroy
+	 */
+
+	attr.ingress = 1;
+	attr.priority = 1;
+	pattern[0] = eth_item;
+	pattern[1] = ipv4_sctp_item_1;
+	pattern[2] = sctp_item_1;
+	pattern[3] = end_item;
+	actions[0] = count_action;
+	actions[1] = end_action;
+
+	ret = rte_flow_classify_validate(table_acl, &attr,
+			pattern, actions, &error);
+	if (ret) {
+		printf("Line %i: flow_classify_validate", __LINE__);
+		printf(" should not have failed!\n");
+		return -1;
+	}
+
+	flow_classify = rte_flow_classify_create(table_acl, entry_size, &attr,
+			pattern, actions, &error);
+	if (!flow_classify) {
+		printf("Line %i: flow_classify_create", __LINE__);
+		printf(" should not have failed!\n");
+		return -1;
+	}
+
+	ret = rte_flow_classify_query(table_acl, flow_classify, bufs,
+			MAX_PKT_BURST, &sctp_classify_stats, &error);
+	if (ret) {
+		printf("Line %i: flow_classify_query", __LINE__);
+		printf(" should not have failed!\n");
+		return -1;
+	}
+
+	ret = rte_flow_classify_destroy(table_acl, flow_classify, &error);
+	if (ret) {
+		printf("Line %i: flow_classify_destroy", __LINE__);
+		printf(" should not have failed!\n");
+		return -1;
+	}
+	return 0;
+}
+
+static int
+test_flow_classify(void)
+{
+	struct rte_table_acl_params table_acl_params;
+	int socket_id = 0;
+	int ret;
+
+	/* initialise ACL table params */
+	table_acl_params.n_rule_fields = RTE_DIM(ipv4_defs);
+	table_acl_params.name = "table_acl_ipv4_5tuple";
+	table_acl_params.n_rules = FLOW_CLASSIFY_MAX_RULE_NUM;
+	memcpy(table_acl_params.field_format, ipv4_defs, sizeof(ipv4_defs));
+	entry_size = RTE_ACL_RULE_SZ(RTE_DIM(ipv4_defs));
+
+	table_acl = rte_table_acl_ops.f_create(&table_acl_params, socket_id,
+					entry_size);
+	if (table_acl == NULL) {
+		printf("Line %i: f_create has failed!\n", __LINE__);
+		return -1;
+	}
+	printf("Created table_acl for for IPv4 five tuple packets\n");
+
+	ret = init_mbufpool();
+	if (ret) {
+		printf("Line %i: init_mbufpool has failed!\n", __LINE__);
+		return -1;
+	}
+
+	if (test_invalid_parameters() < 0)
+		return -1;
+	if (test_valid_parameters() < 0)
+		return -1;
+	if (test_invalid_patterns() < 0)
+		return -1;
+	if (test_invalid_actions() < 0)
+		return -1;
+	if (test_query_udp() < 0)
+		return -1;
+	if (test_query_tcp() < 0)
+		return -1;
+	if (test_query_sctp() < 0)
+		return -1;
+
+	return 0;
+}
+
+REGISTER_TEST_COMMAND(flow_classify_autotest, test_flow_classify);
diff --git a/test/test/test_flow_classify.h b/test/test/test_flow_classify.h
new file mode 100644
index 0000000..95ddc94
--- /dev/null
+++ b/test/test/test_flow_classify.h
@@ -0,0 +1,240 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2017 Intel Corporation. All rights reserved.
+ *   All rights reserved.
+ *
+ *   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 Intel Corporation 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 TEST_FLOW_CLASSIFY_H_
+#define TEST_FLOW_CLASSIFY_H_
+
+#define MAX_PKT_BURST      (32)
+#define NB_SOCKETS         (1)
+#define MEMPOOL_CACHE_SIZE (256)
+#define MBUF_SIZE          (512)
+#define NB_MBUF            (512)
+
+/* test UDP, TCP and SCTP packets */
+static struct rte_mempool *mbufpool[NB_SOCKETS];
+static struct rte_mbuf *bufs[MAX_PKT_BURST];
+
+/* ACL field definitions for IPv4 5 tuple rule */
+
+enum {
+	PROTO_FIELD_IPV4,
+	SRC_FIELD_IPV4,
+	DST_FIELD_IPV4,
+	SRCP_FIELD_IPV4,
+	DSTP_FIELD_IPV4,
+	NUM_FIELDS_IPV4
+};
+
+enum {
+	PROTO_INPUT_IPV4,
+	SRC_INPUT_IPV4,
+	DST_INPUT_IPV4,
+	SRCP_DESTP_INPUT_IPV4
+};
+
+static struct rte_acl_field_def ipv4_defs[NUM_FIELDS_IPV4] = {
+	/* first input field - always one byte long. */
+	{
+		.type = RTE_ACL_FIELD_TYPE_BITMASK,
+		.size = sizeof(uint8_t),
+		.field_index = PROTO_FIELD_IPV4,
+		.input_index = PROTO_INPUT_IPV4,
+		.offset = sizeof(struct ether_hdr) +
+			offsetof(struct ipv4_hdr, next_proto_id),
+	},
+	/* next input field (IPv4 source address) - 4 consecutive bytes. */
+	{
+		/* rte_flow uses a bit mask for IPv4 addresses */
+		.type = RTE_ACL_FIELD_TYPE_BITMASK,
+		.size = sizeof(uint32_t),
+		.field_index = SRC_FIELD_IPV4,
+		.input_index = SRC_INPUT_IPV4,
+		.offset = sizeof(struct ether_hdr) +
+			offsetof(struct ipv4_hdr, src_addr),
+	},
+	/* next input field (IPv4 destination address) - 4 consecutive bytes. */
+	{
+		/* rte_flow uses a bit mask for IPv4 addresses */
+		.type = RTE_ACL_FIELD_TYPE_BITMASK,
+		.size = sizeof(uint32_t),
+		.field_index = DST_FIELD_IPV4,
+		.input_index = DST_INPUT_IPV4,
+		.offset = sizeof(struct ether_hdr) +
+			offsetof(struct ipv4_hdr, dst_addr),
+	},
+	/*
+	 * Next 2 fields (src & dst ports) form 4 consecutive bytes.
+	 * They share the same input index.
+	 */
+	{
+		/* rte_flow uses a bit mask for protocol ports */
+		.type = RTE_ACL_FIELD_TYPE_BITMASK,
+		.size = sizeof(uint16_t),
+		.field_index = SRCP_FIELD_IPV4,
+		.input_index = SRCP_DESTP_INPUT_IPV4,
+		.offset = sizeof(struct ether_hdr) +
+			sizeof(struct ipv4_hdr) +
+			offsetof(struct tcp_hdr, src_port),
+	},
+	{
+		/* rte_flow uses a bit mask for protocol ports */
+		.type = RTE_ACL_FIELD_TYPE_BITMASK,
+		.size = sizeof(uint16_t),
+		.field_index = DSTP_FIELD_IPV4,
+		.input_index = SRCP_DESTP_INPUT_IPV4,
+		.offset = sizeof(struct ether_hdr) +
+			sizeof(struct ipv4_hdr) +
+			offsetof(struct tcp_hdr, dst_port),
+	},
+};
+
+/* parameters for rte_flow_classify_validate and rte_flow_classify_create */
+
+/* test UDP pattern:
+ * "eth / ipv4 src spec 2.2.2.3 src mask 255.255.255.00 dst spec 2.2.2.7
+ *  dst mask 255.255.255.00 / udp src is 32 dst is 33 / end"
+ */
+static struct rte_flow_item_ipv4 ipv4_udp_spec_1 = {
+	{ 0, 0, 0, 0, 0, 0, IPPROTO_UDP, 0, IPv4(2, 2, 2, 3), IPv4(2, 2, 2, 7)}
+};
+static const struct rte_flow_item_ipv4 ipv4_mask_24 = {
+	.hdr = {
+		.next_proto_id = 0xff,
+		.src_addr = 0xffffff00,
+		.dst_addr = 0xffffff00,
+	},
+};
+static struct rte_flow_item_udp udp_spec_1 = {
+	{ 32, 33, 0, 0 }
+};
+
+static struct rte_flow_item  eth_item = { RTE_FLOW_ITEM_TYPE_ETH,
+	0, 0, 0 };
+static struct rte_flow_item  eth_item_bad = { -1, 0, 0, 0 };
+
+static struct rte_flow_item  ipv4_udp_item_1 = { RTE_FLOW_ITEM_TYPE_IPV4,
+	&ipv4_udp_spec_1, 0, &ipv4_mask_24};
+static struct rte_flow_item  ipv4_udp_item_bad = { RTE_FLOW_ITEM_TYPE_IPV4,
+	NULL, 0, NULL};
+
+static struct rte_flow_item  udp_item_1 = { RTE_FLOW_ITEM_TYPE_UDP,
+	&udp_spec_1, 0, &rte_flow_item_udp_mask};
+static struct rte_flow_item  udp_item_bad = { RTE_FLOW_ITEM_TYPE_UDP,
+	NULL, 0, NULL};
+
+static struct rte_flow_item  end_item = { RTE_FLOW_ITEM_TYPE_END,
+	0, 0, 0 };
+static struct rte_flow_item  end_item_bad = { -1, 0, 0, 0 };
+
+/* test TCP pattern:
+ * "eth / ipv4 src spec 1.2.3.4 src mask 255.255.255.00 dst spec 5.6.7.8
+ *  dst mask 255.255.255.00 / tcp src is 16 dst is 17 / end"
+ */
+static struct rte_flow_item_ipv4 ipv4_tcp_spec_1 = {
+	{ 0, 0, 0, 0, 0, 0, IPPROTO_TCP, 0, IPv4(1, 2, 3, 4), IPv4(5, 6, 7, 8)}
+};
+
+static struct rte_flow_item_tcp tcp_spec_1 = {
+	{ 16, 17, 0, 0, 0, 0, 0, 0, 0}
+};
+
+static struct rte_flow_item  ipv4_tcp_item_1 = { RTE_FLOW_ITEM_TYPE_IPV4,
+	&ipv4_tcp_spec_1, 0, &ipv4_mask_24};
+
+static struct rte_flow_item  tcp_item_1 = { RTE_FLOW_ITEM_TYPE_TCP,
+	&tcp_spec_1, 0, &rte_flow_item_tcp_mask};
+
+/* test SCTP pattern:
+ * "eth / ipv4 src spec 1.2.3.4 src mask 255.255.255.00 dst spec 5.6.7.8
+ *  dst mask 255.255.255.00 / sctp src is 16 dst is 17/ end"
+ */
+static struct rte_flow_item_ipv4 ipv4_sctp_spec_1 = {
+	{ 0, 0, 0, 0, 0, 0, IPPROTO_SCTP, 0, IPv4(11, 12, 13, 14),
+	IPv4(15, 16, 17, 18)}
+};
+
+static struct rte_flow_item_sctp sctp_spec_1 = {
+	{ 10, 11, 0, 0}
+};
+
+static struct rte_flow_item  ipv4_sctp_item_1 = { RTE_FLOW_ITEM_TYPE_IPV4,
+	&ipv4_sctp_spec_1, 0, &ipv4_mask_24};
+
+static struct rte_flow_item  sctp_item_1 = { RTE_FLOW_ITEM_TYPE_SCTP,
+	&sctp_spec_1, 0, &rte_flow_item_sctp_mask};
+
+
+/* test actions:
+ * "actions count / end"
+ */
+static struct rte_flow_action count_action = { RTE_FLOW_ACTION_TYPE_COUNT, 0};
+static struct rte_flow_action count_action_bad = { -1, 0};
+
+static struct rte_flow_action end_action = { RTE_FLOW_ACTION_TYPE_END, 0};
+static struct rte_flow_action end_action_bad =	{ -1, 0};
+
+static struct rte_flow_action actions[2];
+
+/* test attributes */
+static struct rte_flow_attr attr;
+
+/* test error */
+static struct rte_flow_error error;
+
+/* test pattern */
+static struct rte_flow_item  pattern[4];
+
+/* flow classify data for UDP burst */
+static struct rte_flow_classify_5tuple_stats udp_ntuple_stats;
+static struct rte_flow_classify_stats udp_classify_stats = {
+		.available_space = MAX_PKT_BURST,
+		.used_space = 0,
+		.stats = (void **)&udp_ntuple_stats
+};
+
+/* flow classify data for TCP burst */
+static struct rte_flow_classify_5tuple_stats tcp_ntuple_stats;
+static struct rte_flow_classify_stats tcp_classify_stats = {
+		.available_space = MAX_PKT_BURST,
+		.used_space = 0,
+		.stats = (void **)&tcp_ntuple_stats
+};
+
+/* flow classify data for SCTP burst */
+static struct rte_flow_classify_5tuple_stats sctp_ntuple_stats;
+static struct rte_flow_classify_stats sctp_classify_stats = {
+		.available_space = MAX_PKT_BURST,
+		.used_space = 0,
+		.stats = (void **)&sctp_ntuple_stats
+};
+#endif /* TEST_FLOW_CLASSIFY_H_ */
-- 
1.9.1

  parent reply	other threads:[~2017-10-02  9:31 UTC|newest]

Thread overview: 145+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-04-20 18:54 [RFC 17.08] Flow classification library Ferruh Yigit
2017-04-20 18:54 ` [RFC 17.08] flow_classify: add librte_flow_classify library Ferruh Yigit
2017-05-04 11:35   ` Mcnamara, John
2017-05-16 22:19     ` Thomas Monjalon
2017-05-17 14:54   ` Ananyev, Konstantin
2017-05-17 15:37     ` Ferruh Yigit
2017-05-17 16:10       ` Ananyev, Konstantin
2017-05-18 12:12         ` Ferruh Yigit
2017-05-17 16:02     ` Ferruh Yigit
2017-05-17 16:18       ` Ananyev, Konstantin
2017-05-17 16:38       ` Gaëtan Rivet
2017-05-18 11:33         ` Ferruh Yigit
2017-05-18 20:31           ` Thomas Monjalon
2017-05-19  8:57             ` Ananyev, Konstantin
2017-05-19  9:11               ` Gaëtan Rivet
2017-05-19  9:40                 ` Ananyev, Konstantin
2017-05-19 10:11                 ` Thomas Monjalon
2017-05-22  9:13                   ` Adrien Mazarguil
2017-04-21 10:38 ` [RFC 17.08] Flow classification library Gaëtan Rivet
2017-05-03  9:15   ` Mcnamara, John
2017-05-06 14:04     ` Morten Brørup
2017-05-09 13:37       ` Ferruh Yigit
2017-05-09 19:24         ` Morten Brørup
2017-05-17 11:26           ` Ferruh Yigit
2017-05-09 13:26   ` Ferruh Yigit
2017-05-18 18:12 ` [RFC v2] " Ferruh Yigit
2017-05-18 18:12   ` [RFC v2] flow_classify: add librte_flow_classify library Ferruh Yigit
2017-05-19 16:30   ` [RFC v2] Flow classification library Iremonger, Bernard
2017-05-22 13:53     ` Ferruh Yigit
2017-05-23 12:26       ` Adrien Mazarguil
2017-05-23 12:58         ` Ferruh Yigit
2017-05-23 13:30           ` Adrien Mazarguil
2017-05-23 16:42             ` Ferruh Yigit
2017-05-25 15:46   ` [RFC v3] " Ferruh Yigit
2017-05-25 15:46     ` [RFC v3] flow_classify: add librte_flow_classify library Ferruh Yigit
2017-05-30 12:59       ` Iremonger, Bernard
2017-08-23 13:51     ` [PATCH v1 0/6] Flow classification library Bernard Iremonger
2017-08-25 16:10       ` [PATCH v2 0/6] flow " Bernard Iremonger
2017-08-31 14:54         ` [PATCH v3 0/5] " Bernard Iremonger
2017-09-06 10:27           ` [PATCH v4 " Bernard Iremonger
2017-09-07 16:43             ` [PATCH v5 0/6] " Bernard Iremonger
2017-09-29  9:18               ` [PATCH v6 0/4] " Bernard Iremonger
2017-10-02  9:31                 ` [PATCH v7 " Bernard Iremonger
2017-10-17 20:26                   ` [PATCH v8 " Bernard Iremonger
2017-10-22 13:32                     ` [PATCH v9 " Bernard Iremonger
2017-10-23 15:16                       ` [PATCH v10 " Bernard Iremonger
2017-10-23 20:59                         ` Thomas Monjalon
2017-10-24  8:40                           ` Iremonger, Bernard
2017-10-24  9:23                             ` Mcnamara, John
2017-10-24  9:38                               ` Thomas Monjalon
2017-10-24  9:53                                 ` Iremonger, Bernard
2017-10-24 10:25                                   ` Thomas Monjalon
2017-10-24 17:27                         ` [PATCH v11 " Bernard Iremonger
2017-10-24 20:33                           ` Thomas Monjalon
2017-10-25  8:47                             ` Iremonger, Bernard
2017-10-25  8:56                               ` Thomas Monjalon
2017-10-24 17:28                         ` [PATCH v11 1/4] flow_classify: add flow classify library Bernard Iremonger
2017-10-24 19:39                           ` Thomas Monjalon
2017-10-25 11:10                             ` Iremonger, Bernard
2017-10-25 12:13                               ` Thomas Monjalon
2017-10-24 19:41                           ` Thomas Monjalon
2017-10-24 19:43                           ` Thomas Monjalon
2017-10-24 20:05                           ` Thomas Monjalon
2017-10-24 20:16                           ` Thomas Monjalon
2017-10-24 20:18                           ` Thomas Monjalon
2017-10-24 17:28                         ` [PATCH v11 2/4] examples/flow_classify: flow classify sample application Bernard Iremonger
2017-10-24 20:13                           ` Thomas Monjalon
2017-10-24 17:28                         ` [PATCH v11 3/4] test: add packet burst generator functions Bernard Iremonger
2017-10-24 17:28                         ` [PATCH v11 4/4] test: flow classify library unit tests Bernard Iremonger
2017-10-23 15:16                       ` [PATCH v10 1/4] librte_flow_classify: add flow classify library Bernard Iremonger
2017-10-23 16:03                         ` Singh, Jasvinder
2017-10-24  9:50                         ` Thomas Monjalon
2017-10-24 10:09                           ` Iremonger, Bernard
2017-10-23 15:16                       ` [PATCH v10 2/4] examples/flow_classify: flow classify sample application Bernard Iremonger
2017-10-23 16:04                         ` Singh, Jasvinder
2017-10-23 15:16                       ` [PATCH v10 3/4] test: add packet burst generator functions Bernard Iremonger
2017-10-23 16:05                         ` Singh, Jasvinder
2017-10-23 15:16                       ` [PATCH v10 4/4] test: flow classify library unit tests Bernard Iremonger
2017-10-23 16:06                         ` Singh, Jasvinder
2017-10-22 13:32                     ` [PATCH v9 1/4] librte_flow_classify: add flow classify library Bernard Iremonger
2017-10-23 13:21                       ` Singh, Jasvinder
2017-10-23 13:37                         ` Iremonger, Bernard
2017-10-22 13:32                     ` [PATCH v9 2/4] examples/flow_classify: flow classify sample application Bernard Iremonger
2017-10-22 13:32                     ` [PATCH v9 3/4] test: add packet burst generator functions Bernard Iremonger
2017-10-22 13:32                     ` [PATCH v9 4/4] test: flow classify library unit tests Bernard Iremonger
2017-10-17 20:26                   ` [PATCH v8 1/4] librte_flow_classify: add flow classify library Bernard Iremonger
2017-10-19 14:22                     ` Singh, Jasvinder
2017-10-20 16:59                       ` Iremonger, Bernard
2017-10-21 12:07                         ` Iremonger, Bernard
2017-10-17 20:26                   ` [PATCH v8 2/4] examples/flow_classify: flow classify sample application Bernard Iremonger
2017-10-17 20:26                   ` [PATCH v8 3/4] test: add packet burst generator functions Bernard Iremonger
2017-10-17 20:26                   ` [PATCH v8 4/4] test: flow classify library unit tests Bernard Iremonger
2017-10-02  9:31                 ` [PATCH v7 1/4] librte_flow_classify: add librte_flow_classify library Bernard Iremonger
2017-10-06 15:00                   ` Singh, Jasvinder
2017-10-09  9:28                     ` Mcnamara, John
2017-10-13 15:39                     ` Iremonger, Bernard
2017-10-02  9:31                 ` [PATCH v7 2/4] examples/flow_classify: flow classify sample application Bernard Iremonger
2017-10-02  9:31                 ` [PATCH v7 3/4] test: add packet burst generator functions Bernard Iremonger
2017-10-02  9:31                 ` Bernard Iremonger [this message]
2017-09-29  9:18               ` [PATCH v6 1/4] librte_flow_classify: add librte_flow_classify library Bernard Iremonger
2017-09-29  9:18               ` [PATCH v6 2/4] examples/flow_classify: flow classify sample application Bernard Iremonger
2017-09-29  9:18               ` [PATCH v6 3/4] test: add packet burst generator functions Bernard Iremonger
2017-09-29  9:18               ` [PATCH v6 4/4] test: flow classify library unit tests Bernard Iremonger
2017-09-07 16:43             ` [PATCH v5 1/6] librte_table: fix acl entry add and delete functions Bernard Iremonger
2017-09-18 15:29               ` Singh, Jasvinder
2017-09-20 12:21                 ` Dumitrescu, Cristian
2017-09-29  8:25                   ` Iremonger, Bernard
2017-09-07 16:43             ` [PATCH v5 2/6] librte_table: fix acl lookup function Bernard Iremonger
2017-09-20 12:24               ` Dumitrescu, Cristian
2017-09-29  8:27                 ` Iremonger, Bernard
2017-09-07 16:43             ` [PATCH v5 3/6] librte_flow_classify: add librte_flow_classify library Bernard Iremonger
2017-09-07 16:43             ` [PATCH v5 4/6] examples/flow_classify: flow classify sample application Bernard Iremonger
2017-09-07 16:43             ` [PATCH v5 5/6] test: add packet burst generator functions Bernard Iremonger
2017-09-07 16:43             ` [PATCH v5 6/6] test: flow classify library unit tests Bernard Iremonger
2017-09-06 10:27           ` [PATCH v4 1/5] librte_table: fix acl entry add and delete functions Bernard Iremonger
2017-09-06 10:27           ` [PATCH v4 2/5] librte_table: fix acl lookup function Bernard Iremonger
2017-09-06 10:27           ` [PATCH v4 3/5] librte_flow_classify: add librte_flow_classify library Bernard Iremonger
2017-09-06 10:27           ` [PATCH v4 4/5] examples/flow_classify: flow classify sample application Bernard Iremonger
2017-09-06 10:27           ` [PATCH v4 5/5] test: flow classify library unit tests Bernard Iremonger
2017-08-31 14:54         ` [PATCH v3 1/5] librte_table: fix acl entry add and delete functions Bernard Iremonger
2017-08-31 15:09           ` Pavan Nikhilesh Bhagavatula
2017-08-31 14:54         ` [PATCH v3 2/5] librte_table: fix acl lookup function Bernard Iremonger
2017-08-31 14:54         ` [PATCH v3 3/5] librte_flow_classify: add librte_flow_classify library Bernard Iremonger
2017-08-31 15:18           ` Pavan Nikhilesh Bhagavatula
2017-08-31 14:54         ` [PATCH v3 4/5] examples/flow_classify: flow classify sample application Bernard Iremonger
2017-08-31 14:54         ` [PATCH v3 5/5] test: flow classify library unit tests Bernard Iremonger
2017-08-25 16:10       ` [PATCH v2 1/6] librte_table: fix acl entry add and delete functions Bernard Iremonger
2017-08-25 16:10       ` [PATCH v2 2/6] librte_table: fix acl lookup function Bernard Iremonger
2017-08-25 16:10       ` [PATCH v2 3/6] librte_ether: initialise IPv4 protocol mask for rte_flow Bernard Iremonger
2017-08-30 12:39         ` Adrien Mazarguil
2017-08-30 13:28           ` Iremonger, Bernard
2017-08-30 14:39             ` Adrien Mazarguil
2017-08-30 15:12               ` Iremonger, Bernard
2017-08-25 16:10       ` [PATCH v2 4/6] librte_flow_classify: add librte_flow_classify library Bernard Iremonger
2017-08-25 16:10       ` [PATCH v2 5/6] examples/flow_classify: flow classify sample application Bernard Iremonger
2017-08-25 16:10       ` [PATCH v2 6/6] test: flow classify library unit tests Bernard Iremonger
2017-08-23 13:51     ` [PATCH v1 1/6] librte_table: move structure to header file Bernard Iremonger
2017-08-23 14:13       ` Dumitrescu, Cristian
2017-08-23 14:32         ` Iremonger, Bernard
2017-08-28  8:48           ` Iremonger, Bernard
2017-08-23 13:51     ` [PATCH v1 2/6] librte_table: fix acl entry add and delete functions Bernard Iremonger
2017-08-23 13:51     ` [PATCH v1 3/6] librte_ether: initialise IPv4 protocol mask for rte_flow Bernard Iremonger
2017-08-23 13:51     ` [PATCH v1 4/6] librte_flow_classify: add librte_flow_classify library Bernard Iremonger
2017-08-23 13:51     ` [PATCH v1 5/6] examples/flow_classify: flow classify sample application Bernard Iremonger
2017-08-23 13:51     ` [PATCH v1 6/6] test: flow classify library unit tests Bernard Iremonger

Reply instructions:

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

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

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

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

  git send-email \
    --in-reply-to=1506936668-31197-5-git-send-email-bernard.iremonger@intel.com \
    --to=bernard.iremonger@intel.com \
    --cc=adrien.mazarguil@6wind.com \
    --cc=cristian.dumitrescu@intel.com \
    --cc=dev@dpdk.org \
    --cc=ferruh.yigit@intel.com \
    --cc=konstantin.ananyev@intel.com \
    /path/to/YOUR_REPLY

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

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