All of lore.kernel.org
 help / color / mirror / Atom feed
From: Michal Jastrzebski <michalx.k.jastrzebski-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
To: dev-VfR2kkLFssw@public.gmane.org
Subject: [PATCH v2 3/3] port: added ipv6 reassembly port
Date: Thu, 30 Apr 2015 14:02:34 +0200	[thread overview]
Message-ID: <1430395354-4160-4-git-send-email-michalx.k.jastrzebski@intel.com> (raw)
In-Reply-To: <1430395354-4160-1-git-send-email-michalx.k.jastrzebski-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>

From: Maciej Gajdzica <maciejx.t.gajdzica-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>

Added new port type - IPv6 reassembly port.

Signed-off-by: Maciej Gajdzica <maciejx.t.gajdzica-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
---
 lib/librte_port/rte_port_ras.c |  142 +++++++++++++++++++++++++++++-----------
 lib/librte_port/rte_port_ras.h |    9 ++-
 2 files changed, 112 insertions(+), 39 deletions(-)

diff --git a/lib/librte_port/rte_port_ras.c b/lib/librte_port/rte_port_ras.c
index b6ab67a..5eb627a 100644
--- a/lib/librte_port/rte_port_ras.c
+++ b/lib/librte_port/rte_port_ras.c
@@ -39,33 +39,46 @@
 
 #include "rte_port_ras.h"
 
-#ifndef IPV4_RAS_N_BUCKETS
-#define IPV4_RAS_N_BUCKETS                                 4094
+#ifndef RTE_PORT_RAS_N_BUCKETS
+#define RTE_PORT_RAS_N_BUCKETS                                 4094
 #endif
 
-#ifndef IPV4_RAS_N_ENTRIES_PER_BUCKET
-#define IPV4_RAS_N_ENTRIES_PER_BUCKET                      8
+#ifndef RTE_PORT_RAS_N_ENTRIES_PER_BUCKET
+#define RTE_PORT_RAS_N_ENTRIES_PER_BUCKET                      8
 #endif
 
-#ifndef IPV4_RAS_N_ENTRIES
-#define IPV4_RAS_N_ENTRIES (IPV4_RAS_N_BUCKETS * IPV4_RAS_N_ENTRIES_PER_BUCKET)
+#ifndef RTE_PORT_RAS_N_ENTRIES
+#define RTE_PORT_RAS_N_ENTRIES (RTE_PORT_RAS_N_BUCKETS * RTE_PORT_RAS_N_ENTRIES_PER_BUCKET)
 #endif
 
-struct rte_port_ring_writer_ipv4_ras {
+struct rte_port_ring_writer_ras;
+
+typedef void (*ras_op)(
+		struct rte_port_ring_writer_ras *p,
+		struct rte_mbuf *pkt);
+
+static void
+process_ipv4(struct rte_port_ring_writer_ras *p, struct rte_mbuf *pkt);
+static void
+process_ipv6(struct rte_port_ring_writer_ras *p, struct rte_mbuf *pkt);
+
+struct rte_port_ring_writer_ras {
 	struct rte_mbuf *tx_buf[RTE_PORT_IN_BURST_SIZE_MAX];
 	struct rte_ring *ring;
 	uint32_t tx_burst_sz;
 	uint32_t tx_buf_count;
 	struct rte_ip_frag_tbl *frag_tbl;
 	struct rte_ip_frag_death_row death_row;
+
+	ras_op f_ras;
 };
 
 static void *
-rte_port_ring_writer_ipv4_ras_create(void *params, int socket_id)
+rte_port_ring_writer_ras_create(void *params, int socket_id, int is_ipv4)
 {
-	struct rte_port_ring_writer_ipv4_ras_params *conf =
-			(struct rte_port_ring_writer_ipv4_ras_params *) params;
-	struct rte_port_ring_writer_ipv4_ras *port;
+	struct rte_port_ring_writer_ras_params *conf =
+			(struct rte_port_ring_writer_ras_params *) params;
+	struct rte_port_ring_writer_ras *port;
 	uint64_t frag_cycles;
 
 	/* Check input parameters */
@@ -97,9 +110,9 @@ rte_port_ring_writer_ipv4_ras_create(void *params, int socket_id)
 	frag_cycles *= 100;
 
 	port->frag_tbl = rte_ip_frag_table_create(
-		IPV4_RAS_N_BUCKETS,
-		IPV4_RAS_N_ENTRIES_PER_BUCKET,
-		IPV4_RAS_N_ENTRIES,
+		RTE_PORT_RAS_N_BUCKETS,
+		RTE_PORT_RAS_N_ENTRIES_PER_BUCKET,
+		RTE_PORT_RAS_N_ENTRIES,
 		frag_cycles,
 		socket_id);
 
@@ -115,11 +128,25 @@ rte_port_ring_writer_ipv4_ras_create(void *params, int socket_id)
 	port->tx_burst_sz = conf->tx_burst_sz;
 	port->tx_buf_count = 0;
 
+	port->f_ras = (is_ipv4 == 0) ? process_ipv4 : process_ipv6;
+
 	return port;
 }
 
+static void *
+rte_port_ring_writer_ipv4_ras_create(void *params, int socket_id)
+{
+	return rte_port_ring_writer_ras_create(params, socket_id, 1);
+}
+
+static void *
+rte_port_ring_writer_ipv6_ras_create(void *params, int socket_id)
+{
+	return rte_port_ring_writer_ras_create(params, socket_id, 0);
+}
+
 static inline void
-send_burst(struct rte_port_ring_writer_ipv4_ras *p)
+send_burst(struct rte_port_ring_writer_ras *p)
 {
 	uint32_t nb_tx;
 
@@ -132,8 +159,8 @@ send_burst(struct rte_port_ring_writer_ipv4_ras *p)
 	p->tx_buf_count = 0;
 }
 
-static inline void
-process_one(struct rte_port_ring_writer_ipv4_ras *p, struct rte_mbuf *pkt)
+static void
+process_ipv4(struct rte_port_ring_writer_ras *p, struct rte_mbuf *pkt)
 {
 	/* Assume there is no ethernet header */
 	struct ipv4_hdr *pkt_hdr = (struct ipv4_hdr *)
@@ -153,7 +180,38 @@ process_one(struct rte_port_ring_writer_ipv4_ras *p, struct rte_mbuf *pkt)
 		struct rte_ip_frag_death_row *dr = &p->death_row;
 
 		/* Process this fragment */
-		mo = rte_ipv4_frag_reassemble_packet(tbl, dr, pkt, rte_rdtsc(), pkt_hdr);
+		mo = rte_ipv4_frag_reassemble_packet(tbl, dr, pkt, rte_rdtsc(),
+				pkt_hdr);
+		if (mo != NULL)
+			p->tx_buf[p->tx_buf_count++] = mo;
+
+		rte_ip_frag_free_death_row(&p->death_row, 3);
+	}
+}
+
+static void
+process_ipv6(struct rte_port_ring_writer_ras *p, struct rte_mbuf *pkt)
+{
+	/* Assume there is no ethernet header */
+	struct ipv6_hdr *pkt_hdr = (struct ipv6_hdr *)
+			(rte_pktmbuf_mtod(pkt, unsigned char *));
+
+	struct ipv6_extension_fragment *frag_hdr;
+	frag_hdr = rte_ipv6_frag_get_ipv6_fragment_header(pkt_hdr);
+	uint16_t frag_offset = frag_hdr->frag_offset;
+	uint16_t frag_flag = frag_hdr->more_frags;
+
+	/* If it is a fragmented packet, then try to reassemble */
+	if ((frag_flag == 0) && (frag_offset == 0))
+		p->tx_buf[p->tx_buf_count++] = pkt;
+	else {
+		struct rte_mbuf *mo;
+		struct rte_ip_frag_tbl *tbl = p->frag_tbl;
+		struct rte_ip_frag_death_row *dr = &p->death_row;
+
+		/* Process this fragment */
+		mo = rte_ipv6_frag_reassemble_packet(tbl, dr, pkt, rte_rdtsc(), pkt_hdr,
+				frag_hdr);
 		if (mo != NULL)
 			p->tx_buf[p->tx_buf_count++] = mo;
 
@@ -162,12 +220,12 @@ process_one(struct rte_port_ring_writer_ipv4_ras *p, struct rte_mbuf *pkt)
 }
 
 static int
-rte_port_ring_writer_ipv4_ras_tx(void *port, struct rte_mbuf *pkt)
+rte_port_ring_writer_ras_tx(void *port, struct rte_mbuf *pkt)
 {
-	struct rte_port_ring_writer_ipv4_ras *p =
-			(struct rte_port_ring_writer_ipv4_ras *) port;
+	struct rte_port_ring_writer_ras *p =
+			(struct rte_port_ring_writer_ras *) port;
 
-	process_one(p, pkt);
+	p->f_ras(p, pkt);
 	if (p->tx_buf_count >= p->tx_burst_sz)
 		send_burst(p);
 
@@ -175,12 +233,12 @@ rte_port_ring_writer_ipv4_ras_tx(void *port, struct rte_mbuf *pkt)
 }
 
 static int
-rte_port_ring_writer_ipv4_ras_tx_bulk(void *port,
+rte_port_ring_writer_ras_tx_bulk(void *port,
 		struct rte_mbuf **pkts,
 		uint64_t pkts_mask)
 {
-	struct rte_port_ring_writer_ipv4_ras *p =
-			(struct rte_port_ring_writer_ipv4_ras *) port;
+	struct rte_port_ring_writer_ras *p =
+			(struct rte_port_ring_writer_ras *) port;
 
 	if ((pkts_mask & (pkts_mask + 1)) == 0) {
 		uint64_t n_pkts = __builtin_popcountll(pkts_mask);
@@ -189,7 +247,7 @@ rte_port_ring_writer_ipv4_ras_tx_bulk(void *port,
 		for (i = 0; i < n_pkts; i++) {
 			struct rte_mbuf *pkt = pkts[i];
 
-			process_one(p, pkt);
+			p->f_ras(p, pkt);
 			if (p->tx_buf_count >= p->tx_burst_sz)
 				send_burst(p);
 		}
@@ -199,7 +257,7 @@ rte_port_ring_writer_ipv4_ras_tx_bulk(void *port,
 			uint64_t pkt_mask = 1LLU << pkt_index;
 			struct rte_mbuf *pkt = pkts[pkt_index];
 
-			process_one(p, pkt);
+			p->f_ras(p, pkt);
 			if (p->tx_buf_count >= p->tx_burst_sz)
 				send_burst(p);
 
@@ -211,10 +269,10 @@ rte_port_ring_writer_ipv4_ras_tx_bulk(void *port,
 }
 
 static int
-rte_port_ring_writer_ipv4_ras_flush(void *port)
+rte_port_ring_writer_ras_flush(void *port)
 {
-	struct rte_port_ring_writer_ipv4_ras *p =
-			(struct rte_port_ring_writer_ipv4_ras *) port;
+	struct rte_port_ring_writer_ras *p =
+			(struct rte_port_ring_writer_ras *) port;
 
 	if (p->tx_buf_count > 0)
 		send_burst(p);
@@ -223,17 +281,17 @@ rte_port_ring_writer_ipv4_ras_flush(void *port)
 }
 
 static int
-rte_port_ring_writer_ipv4_ras_free(void *port)
+rte_port_ring_writer_ras_free(void *port)
 {
-	struct rte_port_ring_writer_ipv4_ras *p =
-			(struct rte_port_ring_writer_ipv4_ras *) port;
+	struct rte_port_ring_writer_ras *p =
+			(struct rte_port_ring_writer_ras *) port;
 
 	if (port == NULL) {
 		RTE_LOG(ERR, PORT, "%s: Parameter port is NULL\n", __func__);
 		return -1;
 	}
 
-	rte_port_ring_writer_ipv4_ras_flush(port);
+	rte_port_ring_writer_ras_flush(port);
 	rte_ip_frag_table_destroy(p->frag_tbl);
 	rte_free(port);
 
@@ -245,8 +303,16 @@ rte_port_ring_writer_ipv4_ras_free(void *port)
  */
 struct rte_port_out_ops rte_port_ring_writer_ipv4_ras_ops = {
 	.f_create = rte_port_ring_writer_ipv4_ras_create,
-	.f_free = rte_port_ring_writer_ipv4_ras_free,
-	.f_tx = rte_port_ring_writer_ipv4_ras_tx,
-	.f_tx_bulk = rte_port_ring_writer_ipv4_ras_tx_bulk,
-	.f_flush = rte_port_ring_writer_ipv4_ras_flush,
+	.f_free = rte_port_ring_writer_ras_free,
+	.f_tx = rte_port_ring_writer_ras_tx,
+	.f_tx_bulk = rte_port_ring_writer_ras_tx_bulk,
+	.f_flush = rte_port_ring_writer_ras_flush,
+};
+
+struct rte_port_out_ops rte_port_ring_writer_ipv6_ras_ops = {
+	.f_create = rte_port_ring_writer_ipv6_ras_create,
+	.f_free = rte_port_ring_writer_ras_free,
+	.f_tx = rte_port_ring_writer_ras_tx,
+	.f_tx_bulk = rte_port_ring_writer_ras_tx_bulk,
+	.f_flush = rte_port_ring_writer_ras_flush,
 };
diff --git a/lib/librte_port/rte_port_ras.h b/lib/librte_port/rte_port_ras.h
index c6ed688..5a16f83 100644
--- a/lib/librte_port/rte_port_ras.h
+++ b/lib/librte_port/rte_port_ras.h
@@ -64,7 +64,7 @@ extern "C" {
 #include "rte_port.h"
 
 /** ring_writer_ipv4_ras port parameters */
-struct rte_port_ring_writer_ipv4_ras_params {
+struct rte_port_ring_writer_ras_params {
 	/** Underlying single consumer ring that has to be pre-initialized. */
 	struct rte_ring *ring;
 
@@ -73,9 +73,16 @@ struct rte_port_ring_writer_ipv4_ras_params {
 	uint32_t tx_burst_sz;
 };
 
+#define rte_port_ring_writer_ipv4_ras_params rte_port_ring_writer_ras_params
+
+#define rte_port_ring_writer_ipv6_ras_params rte_port_ring_writer_ras_params
+
 /** ring_writer_ipv4_ras port operations */
 extern struct rte_port_out_ops rte_port_ring_writer_ipv4_ras_ops;
 
+/** ring_writer_ipv6_ras port operations */
+extern struct rte_port_out_ops rte_port_ring_writer_ipv6_ras_ops;
+
 #ifdef __cplusplus
 }
 #endif
-- 
1.7.9.5

  parent reply	other threads:[~2015-04-30 12:02 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-04-30 12:02 [PATCH v2 0/3] port: added frag_ipv6 and ras_ipv6 ports Michal Jastrzebski
     [not found] ` <1430395354-4160-1-git-send-email-michalx.k.jastrzebski-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2015-04-30 12:02   ` [PATCH v2 1/3] port: removed IPV4_MTU_DEFAULT define Michal Jastrzebski
2015-04-30 12:02   ` [PATCH v2 2/3] port: added ipv6 fragmentation port Michal Jastrzebski
2015-04-30 12:02   ` Michal Jastrzebski [this message]
2015-05-05 15:08   ` [PATCH v2 0/3] port: added frag_ipv6 and ras_ipv6 ports Dumitrescu, Cristian
2015-05-18 12:50     ` Thomas Monjalon

Reply instructions:

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

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

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

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

  git send-email \
    --in-reply-to=1430395354-4160-4-git-send-email-michalx.k.jastrzebski@intel.com \
    --to=michalx.k.jastrzebski-ral2jqcrhueavxtiumwx3w@public.gmane.org \
    --cc=dev-VfR2kkLFssw@public.gmane.org \
    /path/to/YOUR_REPLY

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

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