[dpdk-dev,6/7] vmxnet3: support RSS and refactor offload

Message ID 1424917922-1979-6-git-send-email-stephen@networkplumber.org (mailing list archive)
State Superseded, archived
Headers

Commit Message

Stephen Hemminger Feb. 26, 2015, 2:32 a.m. UTC
  Refactor the logic to compute receive offload flags to a simpler
function. And add support for putting RSS flow hash into packet.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
Signed-off-by: Bill Hong <bhong@brocade.com>
---
 lib/librte_pmd_vmxnet3/vmxnet3_rxtx.c | 69 ++++++++++++++++++++---------------
 1 file changed, 40 insertions(+), 29 deletions(-)
  

Comments

Yong Wang March 5, 2015, 7:27 p.m. UTC | #1
I believe I have ACKed v1 of this commit but I didn't see ACKed-by in v2.
Or is there any changes from v1?  If that’s the case, can you explain the
changes in the changelog?


On 2/25/15, 6:32 PM, "Stephen Hemminger" <stephen@networkplumber.org>
wrote:

>Refactor the logic to compute receive offload flags to a simpler

>function. And add support for putting RSS flow hash into packet.

>

>Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>

>Signed-off-by: Bill Hong <bhong@brocade.com>

>---

> lib/librte_pmd_vmxnet3/vmxnet3_rxtx.c | 69

>++++++++++++++++++++---------------

> 1 file changed, 40 insertions(+), 29 deletions(-)

>

>diff --git a/lib/librte_pmd_vmxnet3/vmxnet3_rxtx.c

>b/lib/librte_pmd_vmxnet3/vmxnet3_rxtx.c

>index 884b57f..82bcae6 100644

>--- a/lib/librte_pmd_vmxnet3/vmxnet3_rxtx.c

>+++ b/lib/librte_pmd_vmxnet3/vmxnet3_rxtx.c

>@@ -505,6 +505,43 @@ vmxnet3_post_rx_bufs(vmxnet3_rx_queue_t *rxq,

>uint8_t ring_id)

> 		return i;

> }

> 

>+

>+/* Receive side checksum and other offloads */

>+static void

>+vmxnet3_rx_offload(const Vmxnet3_RxCompDesc *rcd, struct rte_mbuf *rxm)

>+{

>+	/* Check for hardware stripped VLAN tag */

>+	if (rcd->ts) {

>+		rxm->ol_flags |= PKT_RX_VLAN_PKT;

>+		rxm->vlan_tci = rte_le_to_cpu_16((uint16_t)rcd->tci);

>+	}

>+

>+	/* Check for RSS */

>+	if (rcd->rssType != VMXNET3_RCD_RSS_TYPE_NONE) {

>+		rxm->ol_flags |= PKT_RX_RSS_HASH;

>+		rxm->hash.rss = rcd->rssHash;

>+	}

>+

>+	/* Check packet type, checksum errors, etc. Only support IPv4 for now.

>*/

>+	if (rcd->v4) {

>+		struct ether_hdr *eth = rte_pktmbuf_mtod(rxm, struct ether_hdr *);

>+		struct ipv4_hdr *ip = (struct ipv4_hdr *)(eth + 1);

>+

>+		if (((ip->version_ihl & 0xf) << 2) > (int)sizeof(struct ipv4_hdr))

>+			rxm->ol_flags |= PKT_RX_IPV4_HDR_EXT;

>+		else

>+			rxm->ol_flags |= PKT_RX_IPV4_HDR;

>+

>+		if (!rcd->cnc) {

>+			if (!rcd->ipc)

>+				rxm->ol_flags |= PKT_RX_IP_CKSUM_BAD;

>+

>+			if ((rcd->tcp || rcd->udp) && !rcd->tuc)

>+				rxm->ol_flags |= PKT_RX_L4_CKSUM_BAD;

>+		}

>+	}

>+}

>+

> /*

>  * Process the Rx Completion Ring of given vmxnet3_rx_queue

>  * for nb_pkts burst and return the number of packets received

>@@ -605,17 +642,6 @@ vmxnet3_recv_pkts(void *rx_queue, struct rte_mbuf

>**rx_pkts, uint16_t nb_pkts)

> 			goto rcd_done;

> 		}

> 

>-		/* Check for hardware stripped VLAN tag */

>-		if (rcd->ts) {

>-			PMD_RX_LOG(DEBUG, "Received packet with vlan ID: %d.",

>-				   rcd->tci);

>-			rxm->ol_flags = PKT_RX_VLAN_PKT;

>-			/* Copy vlan tag in packet buffer */

>-			rxm->vlan_tci = rte_le_to_cpu_16((uint16_t)rcd->tci);

>-		} else {

>-			rxm->ol_flags = 0;

>-			rxm->vlan_tci = 0;

>-		}

> 

> 		/* Initialize newly received packet buffer */

> 		rxm->port = rxq->port_id;

>@@ -624,25 +650,10 @@ vmxnet3_recv_pkts(void *rx_queue, struct rte_mbuf

>**rx_pkts, uint16_t nb_pkts)

> 		rxm->pkt_len = (uint16_t)rcd->len;

> 		rxm->data_len = (uint16_t)rcd->len;

> 		rxm->data_off = RTE_PKTMBUF_HEADROOM;

>+		rxm->ol_flags = 0;

>+		rxm->vlan_tci = 0;

> 

>-		/* Check packet type, checksum errors, etc. Only support IPv4 for now.

>*/

>-		if (rcd->v4) {

>-			struct ether_hdr *eth = rte_pktmbuf_mtod(rxm, struct ether_hdr *);

>-			struct ipv4_hdr *ip = (struct ipv4_hdr *)(eth + 1);

>-

>-			if (((ip->version_ihl & 0xf) << 2) > (int)sizeof(struct ipv4_hdr))

>-				rxm->ol_flags |= PKT_RX_IPV4_HDR_EXT;

>-			else

>-				rxm->ol_flags |= PKT_RX_IPV4_HDR;

>-

>-			if (!rcd->cnc) {

>-				if (!rcd->ipc)

>-					rxm->ol_flags |= PKT_RX_IP_CKSUM_BAD;

>-

>-				if ((rcd->tcp || rcd->udp) && !rcd->tuc)

>-					rxm->ol_flags |= PKT_RX_L4_CKSUM_BAD;

>-			}

>-		}

>+		vmxnet3_rx_offload(rcd, rxm);

> 

> 		rx_pkts[nb_rx++] = rxm;

> rcd_done:

>-- 

>2.1.4

>
  

Patch

diff --git a/lib/librte_pmd_vmxnet3/vmxnet3_rxtx.c b/lib/librte_pmd_vmxnet3/vmxnet3_rxtx.c
index 884b57f..82bcae6 100644
--- a/lib/librte_pmd_vmxnet3/vmxnet3_rxtx.c
+++ b/lib/librte_pmd_vmxnet3/vmxnet3_rxtx.c
@@ -505,6 +505,43 @@  vmxnet3_post_rx_bufs(vmxnet3_rx_queue_t *rxq, uint8_t ring_id)
 		return i;
 }
 
+
+/* Receive side checksum and other offloads */
+static void
+vmxnet3_rx_offload(const Vmxnet3_RxCompDesc *rcd, struct rte_mbuf *rxm)
+{
+	/* Check for hardware stripped VLAN tag */
+	if (rcd->ts) {
+		rxm->ol_flags |= PKT_RX_VLAN_PKT;
+		rxm->vlan_tci = rte_le_to_cpu_16((uint16_t)rcd->tci);
+	}
+
+	/* Check for RSS */
+	if (rcd->rssType != VMXNET3_RCD_RSS_TYPE_NONE) {
+		rxm->ol_flags |= PKT_RX_RSS_HASH;
+		rxm->hash.rss = rcd->rssHash;
+	}
+
+	/* Check packet type, checksum errors, etc. Only support IPv4 for now. */
+	if (rcd->v4) {
+		struct ether_hdr *eth = rte_pktmbuf_mtod(rxm, struct ether_hdr *);
+		struct ipv4_hdr *ip = (struct ipv4_hdr *)(eth + 1);
+
+		if (((ip->version_ihl & 0xf) << 2) > (int)sizeof(struct ipv4_hdr))
+			rxm->ol_flags |= PKT_RX_IPV4_HDR_EXT;
+		else
+			rxm->ol_flags |= PKT_RX_IPV4_HDR;
+
+		if (!rcd->cnc) {
+			if (!rcd->ipc)
+				rxm->ol_flags |= PKT_RX_IP_CKSUM_BAD;
+
+			if ((rcd->tcp || rcd->udp) && !rcd->tuc)
+				rxm->ol_flags |= PKT_RX_L4_CKSUM_BAD;
+		}
+	}
+}
+
 /*
  * Process the Rx Completion Ring of given vmxnet3_rx_queue
  * for nb_pkts burst and return the number of packets received
@@ -605,17 +642,6 @@  vmxnet3_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
 			goto rcd_done;
 		}
 
-		/* Check for hardware stripped VLAN tag */
-		if (rcd->ts) {
-			PMD_RX_LOG(DEBUG, "Received packet with vlan ID: %d.",
-				   rcd->tci);
-			rxm->ol_flags = PKT_RX_VLAN_PKT;
-			/* Copy vlan tag in packet buffer */
-			rxm->vlan_tci = rte_le_to_cpu_16((uint16_t)rcd->tci);
-		} else {
-			rxm->ol_flags = 0;
-			rxm->vlan_tci = 0;
-		}
 
 		/* Initialize newly received packet buffer */
 		rxm->port = rxq->port_id;
@@ -624,25 +650,10 @@  vmxnet3_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
 		rxm->pkt_len = (uint16_t)rcd->len;
 		rxm->data_len = (uint16_t)rcd->len;
 		rxm->data_off = RTE_PKTMBUF_HEADROOM;
+		rxm->ol_flags = 0;
+		rxm->vlan_tci = 0;
 
-		/* Check packet type, checksum errors, etc. Only support IPv4 for now. */
-		if (rcd->v4) {
-			struct ether_hdr *eth = rte_pktmbuf_mtod(rxm, struct ether_hdr *);
-			struct ipv4_hdr *ip = (struct ipv4_hdr *)(eth + 1);
-
-			if (((ip->version_ihl & 0xf) << 2) > (int)sizeof(struct ipv4_hdr))
-				rxm->ol_flags |= PKT_RX_IPV4_HDR_EXT;
-			else
-				rxm->ol_flags |= PKT_RX_IPV4_HDR;
-
-			if (!rcd->cnc) {
-				if (!rcd->ipc)
-					rxm->ol_flags |= PKT_RX_IP_CKSUM_BAD;
-
-				if ((rcd->tcp || rcd->udp) && !rcd->tuc)
-					rxm->ol_flags |= PKT_RX_L4_CKSUM_BAD;
-			}
-		}
+		vmxnet3_rx_offload(rcd, rxm);
 
 		rx_pkts[nb_rx++] = rxm;
 rcd_done: