DPDK patches and discussions
 help / color / mirror / Atom feed
From: Ashish Jain <ashish.jain@nxp.com>
To: <dev@dpdk.org>, <konstantin.ananyev@intel.com>
Subject: [dpdk-dev] [PATCH] examples/ip_fragmentation: add fragmentation size support
Date: Thu, 20 Apr 2017 12:48:08 +0530	[thread overview]
Message-ID: <1492672688-3571-1-git-send-email-ashish.jain@nxp.com> (raw)

Adding support for determining fragmentation size for both
ipv4 and ipv6 traffic dynamically through command line.
It is helpful in testing to configure different fragmentation
sizes and validate the packets.

Signed-off-by: Ashish Jain <ashish.jain@nxp.com>
Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
---
 examples/ip_fragmentation/main.c | 89 ++++++++++++++++++++++++++++++++++++----
 1 file changed, 81 insertions(+), 8 deletions(-)

diff --git a/examples/ip_fragmentation/main.c b/examples/ip_fragmentation/main.c
index 815b225..436755b 100644
--- a/examples/ip_fragmentation/main.c
+++ b/examples/ip_fragmentation/main.c
@@ -94,6 +94,16 @@
 #define	IPV6_DEFAULT_PAYLOAD	(IPV6_MTU_DEFAULT - sizeof(struct ipv6_hdr))
 
 /*
+ * Configure fragmentation size for IPv4 and IPv6 packets
+ */
+static uint32_t frag_size_v4 = IPV4_MTU_DEFAULT;
+static uint32_t frag_size_v6 = IPV6_MTU_DEFAULT;
+#define MIN_IPV4_FRAG_SIZE 64
+#define MAX_IPV4_FRAG_SIZE 9600
+#define MIN_IPV6_FRAG_SIZE 1280
+#define MAX_IPV6_FRAG_SIZE 9600
+
+/*
  * Max number of fragments per packet expected - defined by config file.
  */
 #define	MAX_PACKET_FRAG RTE_LIBRTE_IP_FRAG_MAX_FRAG
@@ -299,14 +309,14 @@ struct rte_lpm6_config lpm6_config = {
 		}
 
 		/* if we don't need to do any fragmentation */
-		if (likely (IPV4_MTU_DEFAULT >= m->pkt_len)) {
+		if (likely (frag_size_v4 >= m->pkt_len)) {
 			qconf->tx_mbufs[port_out].m_table[len] = m;
 			len2 = 1;
 		} else {
 			len2 = rte_ipv4_fragment_packet(m,
 				&qconf->tx_mbufs[port_out].m_table[len],
 				(uint16_t)(MBUF_TABLE_SIZE - len),
-				IPV4_MTU_DEFAULT,
+				frag_size_v4,
 				rxq->direct_pool, rxq->indirect_pool);
 
 			/* Free input packet */
@@ -336,14 +346,14 @@ struct rte_lpm6_config lpm6_config = {
 		}
 
 		/* if we don't need to do any fragmentation */
-		if (likely (IPV6_MTU_DEFAULT >= m->pkt_len)) {
+		if (likely (frag_size_v6 >= m->pkt_len)) {
 			qconf->tx_mbufs[port_out].m_table[len] = m;
 			len2 = 1;
 		} else {
 			len2 = rte_ipv6_fragment_packet(m,
 				&qconf->tx_mbufs[port_out].m_table[len],
 				(uint16_t)(MBUF_TABLE_SIZE - len),
-				IPV6_MTU_DEFAULT,
+				frag_size_v6,
 				rxq->direct_pool, rxq->indirect_pool);
 
 			/* Free input packet */
@@ -489,8 +499,14 @@ struct rte_lpm6_config lpm6_config = {
 {
 	printf("%s [EAL options] -- -p PORTMASK [-q NQ]\n"
 	       "  -p PORTMASK: hexadecimal bitmask of ports to configure\n"
-	       "  -q NQ: number of queue (=ports) per lcore (default is 1)\n",
-	       prgname);
+	       "  -q NQ: number of queue (=ports) per lcore (default is 1)\n"
+	       "  --frag_size_v4=<num>:optional,IPv4 fragment size in decimal"
+	       ",Condition:(frag_size_v4 - 20) should be a multiple of 8,"
+	       " default is %d \n"
+	       "  --frag_size_v6=<num>:optional,IPv6 fragment size in decimal"
+	       ",Condition:(frag_size_v6 - 40) should be a multiple of 8,"
+	       " default is %d\n",
+	       prgname, frag_size_v4, frag_size_v6);
 }
 
 static int
@@ -528,6 +544,29 @@ struct rte_lpm6_config lpm6_config = {
 	return n;
 }
 
+static int
+parse_frag_size(const char *str, uint32_t min, uint32_t max,
+		uint8_t hdr_size, uint32_t *val)
+{
+	char *end;
+	uint64_t v;
+
+	/* parse decimal string */
+	errno = 0;
+	v = strtoul(str, &end, 10);
+	if (errno != 0 || *end != '\0')
+		return -EINVAL;
+
+	if (v < min || v > max)
+		return -EINVAL;
+
+	if ((v - hdr_size) % 8)
+		return -EINVAL;
+
+	*val = (uint32_t)v;
+	return 0;
+}
+
 /* Parse the argument given in the command line of the application */
 static int
 parse_args(int argc, char **argv)
@@ -537,6 +576,8 @@ struct rte_lpm6_config lpm6_config = {
 	int option_index;
 	char *prgname = argv[0];
 	static struct option lgopts[] = {
+		{"frag_size_v4", 1, 0, 0},
+		{"frag_size_v6", 1, 0, 0},
 		{NULL, 0, 0, 0}
 	};
 
@@ -568,8 +609,40 @@ struct rte_lpm6_config lpm6_config = {
 
 		/* long options */
 		case 0:
-			print_usage(prgname);
-			return -1;
+			if (!strncmp(lgopts[option_index].name,
+				"frag_size_v4", 12)) {
+				ret = parse_frag_size(optarg,
+						MIN_IPV4_FRAG_SIZE,
+						MAX_IPV4_FRAG_SIZE,
+						sizeof(struct ipv4_hdr),
+						&frag_size_v4);
+				if (ret) {
+					printf("invalid value: \"%s\" for "
+						"parameter %s\n",
+						optarg,
+						lgopts[option_index].name);
+					print_usage(prgname);
+					return ret;
+				}
+			}
+			if (!strncmp(lgopts[option_index].name,
+				"frag_size_v6", 12)) {
+				ret = parse_frag_size(optarg,
+						MIN_IPV6_FRAG_SIZE,
+						MAX_IPV6_FRAG_SIZE,
+						sizeof(struct ipv6_hdr),
+						&frag_size_v6);
+				if (ret) {
+					printf("invalid value: \"%s\" for "
+						"parameter %s\n",
+						optarg,
+						lgopts[option_index].name);
+					print_usage(prgname);
+					return ret;
+				}
+			}
+
+			break;
 
 		default:
 			print_usage(prgname);
-- 
1.9.1

             reply	other threads:[~2017-04-20  7:18 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-04-20  7:18 Ashish Jain [this message]
2017-05-24  7:28 ` Ashish Jain
2017-06-04 15:44 ` Ananyev, Konstantin
2017-06-14  9:19   ` Jain Ashish-B46179
2017-06-14 10:10     ` Ananyev, Konstantin
2017-06-30 12:18 ` [dpdk-dev] [PATCH v2] example/ip_fragmentation: " Ashish Jain
2017-06-30 12:34   ` Ananyev, Konstantin
2017-06-30 12:50     ` Jain Ashish-B46179
2017-06-30 12:56       ` Ananyev, Konstantin

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=1492672688-3571-1-git-send-email-ashish.jain@nxp.com \
    --to=ashish.jain@nxp.com \
    --cc=dev@dpdk.org \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).