[dpdk-dev,v2,4/6] ixgbe: support VxLAN & NVGRE RX checksum off-load

Message ID 1452735516-4527-5-git-send-email-wenzhuo.lu@intel.com (mailing list archive)
State Superseded, archived
Delegated to: Bruce Richardson
Headers

Commit Message

Wenzhuo Lu Jan. 14, 2016, 1:38 a.m. UTC
  X550 will do VxLAN & NVGRE RX checksum off-load automatically.
This patch exposes the result of the checksum off-load.

Signed-off-by: Wenzhuo Lu <wenzhuo.lu@intel.com>
---
 drivers/net/ixgbe/ixgbe_rxtx.c | 11 ++++++++++-
 lib/librte_mbuf/rte_mbuf.c     |  1 +
 lib/librte_mbuf/rte_mbuf.h     |  1 +
 3 files changed, 12 insertions(+), 1 deletion(-)
  

Comments

Ananyev, Konstantin Feb. 4, 2016, 8:16 p.m. UTC | #1
> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Wenzhuo Lu
> Sent: Thursday, January 14, 2016 1:39 AM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH v2 4/6] ixgbe: support VxLAN & NVGRE RX checksum off-load
> 
> X550 will do VxLAN & NVGRE RX checksum off-load automatically.
> This patch exposes the result of the checksum off-load.
> 
> Signed-off-by: Wenzhuo Lu <wenzhuo.lu@intel.com>
> ---
>  drivers/net/ixgbe/ixgbe_rxtx.c | 11 ++++++++++-
>  lib/librte_mbuf/rte_mbuf.c     |  1 +
>  lib/librte_mbuf/rte_mbuf.h     |  1 +
>  3 files changed, 12 insertions(+), 1 deletion(-)


Do we need a new DEV_RX_OFFLOAD_ here?

> 
> diff --git a/drivers/net/ixgbe/ixgbe_rxtx.c b/drivers/net/ixgbe/ixgbe_rxtx.c
> index 52a263c..512ac3a 100644
> --- a/drivers/net/ixgbe/ixgbe_rxtx.c
> +++ b/drivers/net/ixgbe/ixgbe_rxtx.c
> @@ -1003,6 +1003,8 @@ rx_desc_status_to_pkt_flags(uint32_t rx_status)
>  static inline uint64_t
>  rx_desc_error_to_pkt_flags(uint32_t rx_status)
>  {
> +	uint64_t pkt_flags;
> +
>  	/*
>  	 * Bit 31: IPE, IPv4 checksum error
>  	 * Bit 30: L4I, L4I integrity error
> @@ -1011,8 +1013,15 @@ rx_desc_error_to_pkt_flags(uint32_t rx_status)
>  		0,  PKT_RX_L4_CKSUM_BAD, PKT_RX_IP_CKSUM_BAD,
>  		PKT_RX_IP_CKSUM_BAD | PKT_RX_L4_CKSUM_BAD
>  	};
> -	return error_to_pkt_flags_map[(rx_status >>
> +	pkt_flags = error_to_pkt_flags_map[(rx_status >>
>  		IXGBE_RXDADV_ERR_CKSUM_BIT) & IXGBE_RXDADV_ERR_CKSUM_MSK];
> +
> +	if ((rx_status & IXGBE_RXD_STAT_OUTERIPCS) &&
> +	    (rx_status & IXGBE_RXDADV_ERR_OUTERIPER)) {
> +		pkt_flags |= PKT_RX_OUTER_IP_CKSUM_BAD;
> +	}
> +
> +	return pkt_flags;
>  }
> 
>  /*
> diff --git a/lib/librte_mbuf/rte_mbuf.c b/lib/librte_mbuf/rte_mbuf.c
> index c18b438..5d4af39 100644
> --- a/lib/librte_mbuf/rte_mbuf.c
> +++ b/lib/librte_mbuf/rte_mbuf.c
> @@ -260,6 +260,7 @@ const char *rte_get_rx_ol_flag_name(uint64_t mask)
>  	/* case PKT_RX_MAC_ERR: return "PKT_RX_MAC_ERR"; */
>  	case PKT_RX_IEEE1588_PTP: return "PKT_RX_IEEE1588_PTP";
>  	case PKT_RX_IEEE1588_TMST: return "PKT_RX_IEEE1588_TMST";
> +	case PKT_RX_OUTER_IP_CKSUM_BAD: return "PKT_RX_OUTER_IP_CKSUM_BAD";
>  	default: return NULL;
>  	}
>  }
> diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
> index f234ac9..5ad5e59 100644
> --- a/lib/librte_mbuf/rte_mbuf.h
> +++ b/lib/librte_mbuf/rte_mbuf.h
> @@ -98,6 +98,7 @@ extern "C" {
>  #define PKT_RX_FDIR_ID       (1ULL << 13) /**< FD id reported if FDIR match. */
>  #define PKT_RX_FDIR_FLX      (1ULL << 14) /**< Flexible bytes reported if FDIR match. */
>  #define PKT_RX_QINQ_PKT      (1ULL << 15)  /**< RX packet with double VLAN stripped. */
> +#define PKT_RX_OUTER_IP_CKSUM_BAD (1ULL << 16)  /**< Outer IP cksum of RX pkt. is not OK. */

There is
#define PKT_RX_EIP_CKSUM_BAD (0ULL << 0)  /**< External IP header checksum error. */
Probably need either redefine it, or remove it.

Konstantin
>  /* add new RX flags here */
> 
>  /* add new TX flags here */
> --
> 1.9.3
  
Wenzhuo Lu Feb. 15, 2016, 2:15 a.m. UTC | #2
Hi Konstantin,

> -----Original Message-----
> From: Ananyev, Konstantin
> Sent: Friday, February 5, 2016 4:17 AM
> To: Lu, Wenzhuo; dev@dpdk.org
> Subject: RE: [dpdk-dev] [PATCH v2 4/6] ixgbe: support VxLAN & NVGRE RX
> checksum off-load
> 
> 
> 
> > -----Original Message-----
> > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Wenzhuo Lu
> > Sent: Thursday, January 14, 2016 1:39 AM
> > To: dev@dpdk.org
> > Subject: [dpdk-dev] [PATCH v2 4/6] ixgbe: support VxLAN & NVGRE RX
> > checksum off-load
> >
> > X550 will do VxLAN & NVGRE RX checksum off-load automatically.
> > This patch exposes the result of the checksum off-load.
> >
> > Signed-off-by: Wenzhuo Lu <wenzhuo.lu@intel.com>
> > ---
> >  drivers/net/ixgbe/ixgbe_rxtx.c | 11 ++++++++++-
> >  lib/librte_mbuf/rte_mbuf.c     |  1 +
> >  lib/librte_mbuf/rte_mbuf.h     |  1 +
> >  3 files changed, 12 insertions(+), 1 deletion(-)
> 
> 
> Do we need a new DEV_RX_OFFLOAD_ here?
Yes, I will add a new capability. Thanks.

> 
> >
> > diff --git a/drivers/net/ixgbe/ixgbe_rxtx.c
> > b/drivers/net/ixgbe/ixgbe_rxtx.c index 52a263c..512ac3a 100644
> > --- a/drivers/net/ixgbe/ixgbe_rxtx.c
> > +++ b/drivers/net/ixgbe/ixgbe_rxtx.c
> > @@ -1003,6 +1003,8 @@ rx_desc_status_to_pkt_flags(uint32_t rx_status)
> > static inline uint64_t  rx_desc_error_to_pkt_flags(uint32_t rx_status)
> > {
> > +	uint64_t pkt_flags;
> > +
> >  	/*
> >  	 * Bit 31: IPE, IPv4 checksum error
> >  	 * Bit 30: L4I, L4I integrity error
> > @@ -1011,8 +1013,15 @@ rx_desc_error_to_pkt_flags(uint32_t rx_status)
> >  		0,  PKT_RX_L4_CKSUM_BAD, PKT_RX_IP_CKSUM_BAD,
> >  		PKT_RX_IP_CKSUM_BAD | PKT_RX_L4_CKSUM_BAD
> >  	};
> > -	return error_to_pkt_flags_map[(rx_status >>
> > +	pkt_flags = error_to_pkt_flags_map[(rx_status >>
> >  		IXGBE_RXDADV_ERR_CKSUM_BIT) &
> IXGBE_RXDADV_ERR_CKSUM_MSK];
> > +
> > +	if ((rx_status & IXGBE_RXD_STAT_OUTERIPCS) &&
> > +	    (rx_status & IXGBE_RXDADV_ERR_OUTERIPER)) {
> > +		pkt_flags |= PKT_RX_OUTER_IP_CKSUM_BAD;
> > +	}
> > +
> > +	return pkt_flags;
> >  }
> >
> >  /*
> > diff --git a/lib/librte_mbuf/rte_mbuf.c b/lib/librte_mbuf/rte_mbuf.c
> > index c18b438..5d4af39 100644
> > --- a/lib/librte_mbuf/rte_mbuf.c
> > +++ b/lib/librte_mbuf/rte_mbuf.c
> > @@ -260,6 +260,7 @@ const char *rte_get_rx_ol_flag_name(uint64_t mask)
> >  	/* case PKT_RX_MAC_ERR: return "PKT_RX_MAC_ERR"; */
> >  	case PKT_RX_IEEE1588_PTP: return "PKT_RX_IEEE1588_PTP";
> >  	case PKT_RX_IEEE1588_TMST: return "PKT_RX_IEEE1588_TMST";
> > +	case PKT_RX_OUTER_IP_CKSUM_BAD: return
> "PKT_RX_OUTER_IP_CKSUM_BAD";
> >  	default: return NULL;
> >  	}
> >  }
> > diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
> > index f234ac9..5ad5e59 100644
> > --- a/lib/librte_mbuf/rte_mbuf.h
> > +++ b/lib/librte_mbuf/rte_mbuf.h
> > @@ -98,6 +98,7 @@ extern "C" {
> >  #define PKT_RX_FDIR_ID       (1ULL << 13) /**< FD id reported if FDIR match.
> */
> >  #define PKT_RX_FDIR_FLX      (1ULL << 14) /**< Flexible bytes reported if FDIR
> match. */
> >  #define PKT_RX_QINQ_PKT      (1ULL << 15)  /**< RX packet with double VLAN
> stripped. */
> > +#define PKT_RX_OUTER_IP_CKSUM_BAD (1ULL << 16)  /**< Outer IP cksum
> > +of RX pkt. is not OK. */
> 
> There is
> #define PKT_RX_EIP_CKSUM_BAD (0ULL << 0)  /**< External IP header
> checksum error. */ Probably need either redefine it, or remove it.
O, agree. I should redefine it. Thanks.

> 
> Konstantin
> >  /* add new RX flags here */
> >
> >  /* add new TX flags here */
> > --
> > 1.9.3
  

Patch

diff --git a/drivers/net/ixgbe/ixgbe_rxtx.c b/drivers/net/ixgbe/ixgbe_rxtx.c
index 52a263c..512ac3a 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx.c
+++ b/drivers/net/ixgbe/ixgbe_rxtx.c
@@ -1003,6 +1003,8 @@  rx_desc_status_to_pkt_flags(uint32_t rx_status)
 static inline uint64_t
 rx_desc_error_to_pkt_flags(uint32_t rx_status)
 {
+	uint64_t pkt_flags;
+
 	/*
 	 * Bit 31: IPE, IPv4 checksum error
 	 * Bit 30: L4I, L4I integrity error
@@ -1011,8 +1013,15 @@  rx_desc_error_to_pkt_flags(uint32_t rx_status)
 		0,  PKT_RX_L4_CKSUM_BAD, PKT_RX_IP_CKSUM_BAD,
 		PKT_RX_IP_CKSUM_BAD | PKT_RX_L4_CKSUM_BAD
 	};
-	return error_to_pkt_flags_map[(rx_status >>
+	pkt_flags = error_to_pkt_flags_map[(rx_status >>
 		IXGBE_RXDADV_ERR_CKSUM_BIT) & IXGBE_RXDADV_ERR_CKSUM_MSK];
+
+	if ((rx_status & IXGBE_RXD_STAT_OUTERIPCS) &&
+	    (rx_status & IXGBE_RXDADV_ERR_OUTERIPER)) {
+		pkt_flags |= PKT_RX_OUTER_IP_CKSUM_BAD;
+	}
+
+	return pkt_flags;
 }
 
 /*
diff --git a/lib/librte_mbuf/rte_mbuf.c b/lib/librte_mbuf/rte_mbuf.c
index c18b438..5d4af39 100644
--- a/lib/librte_mbuf/rte_mbuf.c
+++ b/lib/librte_mbuf/rte_mbuf.c
@@ -260,6 +260,7 @@  const char *rte_get_rx_ol_flag_name(uint64_t mask)
 	/* case PKT_RX_MAC_ERR: return "PKT_RX_MAC_ERR"; */
 	case PKT_RX_IEEE1588_PTP: return "PKT_RX_IEEE1588_PTP";
 	case PKT_RX_IEEE1588_TMST: return "PKT_RX_IEEE1588_TMST";
+	case PKT_RX_OUTER_IP_CKSUM_BAD: return "PKT_RX_OUTER_IP_CKSUM_BAD";
 	default: return NULL;
 	}
 }
diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
index f234ac9..5ad5e59 100644
--- a/lib/librte_mbuf/rte_mbuf.h
+++ b/lib/librte_mbuf/rte_mbuf.h
@@ -98,6 +98,7 @@  extern "C" {
 #define PKT_RX_FDIR_ID       (1ULL << 13) /**< FD id reported if FDIR match. */
 #define PKT_RX_FDIR_FLX      (1ULL << 14) /**< Flexible bytes reported if FDIR match. */
 #define PKT_RX_QINQ_PKT      (1ULL << 15)  /**< RX packet with double VLAN stripped. */
+#define PKT_RX_OUTER_IP_CKSUM_BAD (1ULL << 16)  /**< Outer IP cksum of RX pkt. is not OK. */
 /* add new RX flags here */
 
 /* add new TX flags here */