[dpdk-dev] [PATCH] i40e: Use one bit flag for all hardware detected RX packet errors

Olivier MATZ olivier.matz at 6wind.com
Wed Nov 26 12:22:22 CET 2014


Hi Konstantin, Hi Helin,

On 11/26/2014 11:49 AM, Ananyev, Konstantin wrote:
> Hi Helin,
>
>> -----Original Message-----
>> From: Zhang, Helin
>> Sent: Wednesday, November 26, 2014 6:07 AM
>> To: dev at dpdk.org
>> Cc: Cao, Waterman; Cao, Min; Ananyev, Konstantin; olivier.matz at 6wind.com; Zhang, Helin
>> Subject: [PATCH] i40e: Use one bit flag for all hardware detected RX packet errors
>>
>> There were some bit flags of 0 for RX packet errors detected by hardware.
>> Actually only one bit of error flag is enough for all hardware detected
>> RX packet errors.
>>
>> Signed-off-by: Helin Zhang <helin.zhang at intel.com>
>> ---
>>   lib/librte_mbuf/rte_mbuf.h      |  6 +-----
>>   lib/librte_pmd_i40e/i40e_rxtx.c | 31 +++----------------------------
>>   2 files changed, 4 insertions(+), 33 deletions(-)
>>
>> diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
>> index 5899e5c..897fd26 100644
>> --- a/lib/librte_mbuf/rte_mbuf.h
>> +++ b/lib/librte_mbuf/rte_mbuf.h
>> @@ -80,11 +80,6 @@ extern "C" {
>>   #define PKT_RX_FDIR          (1ULL << 2)  /**< RX packet with FDIR match indicate. */
>>   #define PKT_RX_L4_CKSUM_BAD  (1ULL << 3)  /**< L4 cksum of RX pkt. is not OK. */
>>   #define PKT_RX_IP_CKSUM_BAD  (1ULL << 4)  /**< IP cksum of RX pkt. is not OK. */
>> -#define PKT_RX_EIP_CKSUM_BAD (0ULL << 0)  /**< External IP header checksum error. */
>> -#define PKT_RX_OVERSIZE      (0ULL << 0)  /**< Num of desc of an RX pkt oversize. */
>> -#define PKT_RX_HBUF_OVERFLOW (0ULL << 0)  /**< Header buffer overflow. */
>> -#define PKT_RX_RECIP_ERR     (0ULL << 0)  /**< Hardware processing error. */
>> -#define PKT_RX_MAC_ERR       (0ULL << 0)  /**< MAC error. */
>>   #define PKT_RX_IPV4_HDR      (1ULL << 5)  /**< RX packet with IPv4 header. */
>>   #define PKT_RX_IPV4_HDR_EXT  (1ULL << 6)  /**< RX packet with extended IPv4 header. */
>>   #define PKT_RX_IPV6_HDR      (1ULL << 7)  /**< RX packet with IPv6 header. */
>> @@ -95,6 +90,7 @@ extern "C" {
>>   #define PKT_RX_TUNNEL_IPV6_HDR (1ULL << 12) /**< RX tunnel packet with IPv6 header. */
>>   #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_ERR_HW        (1ULL << 15) /**< RX packet error detected by hardware. */
>>
>>   #define PKT_TX_VLAN_PKT      (1ULL << 55) /**< TX packet is a 802.1q VLAN packet. */
>>   #define PKT_TX_IP_CKSUM      (1ULL << 54) /**< IP cksum of TX pkt. computed by NIC. */
>> diff --git a/lib/librte_pmd_i40e/i40e_rxtx.c b/lib/librte_pmd_i40e/i40e_rxtx.c
>> index cce6911..3b2195d 100644
>> --- a/lib/librte_pmd_i40e/i40e_rxtx.c
>> +++ b/lib/librte_pmd_i40e/i40e_rxtx.c
>> @@ -115,35 +115,10 @@ i40e_rxd_status_to_pkt_flags(uint64_t qword)
>>   static inline uint64_t
>>   i40e_rxd_error_to_pkt_flags(uint64_t qword)
>>   {
>> -	uint64_t flags = 0;
>> -	uint64_t error_bits = (qword >> I40E_RXD_QW1_ERROR_SHIFT);
>> -
>> -#define I40E_RX_ERR_BITS 0x3f
>> -	if (likely((error_bits & I40E_RX_ERR_BITS) == 0))
>> -		return flags;
>> -	/* If RXE bit set, all other status bits are meaningless */
>> -	if (unlikely(error_bits & (1 << I40E_RX_DESC_ERROR_RXE_SHIFT))) {
>> -		flags |= PKT_RX_MAC_ERR;
>> -		return flags;
>> -	}
>> -
>> -	/* If RECIPE bit set, all other status indications should be ignored */
>> -	if (unlikely(error_bits & (1 << I40E_RX_DESC_ERROR_RECIPE_SHIFT))) {
>> -		flags |= PKT_RX_RECIP_ERR;
>> -		return flags;
>> -	}
>> -	if (unlikely(error_bits & (1 << I40E_RX_DESC_ERROR_HBO_SHIFT)))
>> -		flags |= PKT_RX_HBUF_OVERFLOW;
>> -	if (unlikely(error_bits & (1 << I40E_RX_DESC_ERROR_IPE_SHIFT)))
>> -		flags |= PKT_RX_IP_CKSUM_BAD;
>> -	if (unlikely(error_bits & (1 << I40E_RX_DESC_ERROR_L4E_SHIFT)))
>> -		flags |= PKT_RX_L4_CKSUM_BAD;
>> -	if (unlikely(error_bits & (1 << I40E_RX_DESC_ERROR_EIPE_SHIFT)))
>> -		flags |= PKT_RX_EIP_CKSUM_BAD;
>> -	if (unlikely(error_bits & (1 << I40E_RX_DESC_ERROR_OVERSIZE_SHIFT)))
>> -		flags |= PKT_RX_OVERSIZE;
>> +	if (unlikely(qword & I40E_RXD_QW1_ERROR_MASK))
>> +		return PKT_RX_ERR_HW;
>
> Probably I didn't explain myself clear enough, sorry.
> I didn't suggest to get rid of setting bits that indicate L3/L4 checksum errors:
> PKT_RX_IP_CKSUM_BAD, PKT_RX_L4_CKSUM_BAD, PKT_RX_EIP_CKSUM_BAD.
> I think these flags should be set as before.
>
> I was talking only about collapsing only these 4 RX error flags into one:
>
> #define PKT_RX_OVERSIZE      (0ULL << 0)  /**< Num of desc of an RX pkt oversize. */
> #define PKT_RX_HBUF_OVERFLOW (0ULL << 0)  /**< Header buffer overflow. */
> #define PKT_RX_RECIP_ERR     (0ULL << 0)  /**< Hardware processing error. */
> #define PKT_RX_MAC_ERR       (0ULL << 0)  /**< MAC error. */
>
>  From my point of view the difference of these 2 groups are:
> First - HW was able to receive whole packet without a problem, but L3/L4 checksum check failed.
>
> Second - HW was not able to receive whole packet properly by whatever reason.
>  From upper layer SW perspective - there it probably makes little difference, what caused it,
> as most likely SW has to throw away erroneous packet.
> And for debugging purposes, we can add PMD_LOG(DEBUG, ...) that would print what exactly HW error happened.

I agree with Konstantin that there are 2 different cases:

a) the packet is properly received by the hardware, but has a bad
    checksum (or another protocol error, for instance an invalid ip len,
    a ip_version == 8 :))

    in this case, it is useful to the application to have the mbuf with
    the data + an error flag. Then using a tcpdump-like tool could help
    to debug what is the cause of the error and what equipment generates
    a bad packet.

b) the packet is not properly received by the hardware. In this case
    the data is invalid in the mbuf and not useable by the application.
    I suggest to only have a stats counter in this case, as receiving the
    mbuf is cpu time consuming and the only thing the application can do
    is to drop the packet.

Regards,
Olivier



More information about the dev mailing list