<div dir="ltr"><span id="gmail-docs-internal-guid-7f9bcd68-7fff-ecdc-e36c-e1ea05c8539c"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">Hi </span><a href="https://patches.dpdk.org/project/dpdk/list/?submitter=33" style="text-decoration-line:none"><span style="font-size:10.5pt;font-family:Arial;color:rgb(42,100,150);background-color:rgb(240,240,240);font-variant-numeric:normal;font-variant-east-asian:normal;text-decoration-line:underline;vertical-align:baseline;white-space:pre-wrap">Ananyev, Konstantin</span></a><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">, </span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">Yes, you understand it right.</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">The approach you discussed, we have been doing the same thing in our patch. At first, we check the HW offload capabilities. </span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:8.5pt;font-family:"Courier New";color:rgb(0,127,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">> +</span><span style="font-size:8.5pt;font-family:"Courier New";color:rgb(0,127,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><span class="gmail-Apple-tab-span" style="white-space:pre">   </span></span><span style="font-size:8.5pt;font-family:"Courier New";color:rgb(0,127,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><span class="gmail-Apple-tab-span" style="white-space:pre">    </span></span><span style="font-size:8.5pt;font-family:"Courier New";color:rgb(0,127,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_IPV4_CKSUM)</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:8.5pt;font-family:"Courier New";color:rgb(0,127,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">> +</span><span style="font-size:8.5pt;font-family:"Courier New";color:rgb(0,127,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><span class="gmail-Apple-tab-span" style="white-space:pre">  </span></span><span style="font-size:8.5pt;font-family:"Courier New";color:rgb(0,127,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><span class="gmail-Apple-tab-span" style="white-space:pre">    </span></span><span style="font-size:8.5pt;font-family:"Courier New";color:rgb(0,127,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><span class="gmail-Apple-tab-span" style="white-space:pre">    </span></span><span style="font-size:8.5pt;font-family:"Courier New";color:rgb(0,127,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">local_port_conf.rxmode.offloads |=</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:8.5pt;font-family:"Courier New";color:rgb(0,127,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">> +</span><span style="font-size:8.5pt;font-family:"Courier New";color:rgb(0,127,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><span class="gmail-Apple-tab-span" style="white-space:pre">     </span></span><span style="font-size:8.5pt;font-family:"Courier New";color:rgb(0,127,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><span class="gmail-Apple-tab-span" style="white-space:pre">    </span></span><span style="font-size:8.5pt;font-family:"Courier New";color:rgb(0,127,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><span class="gmail-Apple-tab-span" style="white-space:pre">    </span></span><span style="font-size:8.5pt;font-family:"Courier New";color:rgb(0,127,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">DEV_RX_OFFLOAD_IPV4_CKSUM;</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:8.5pt;font-family:"Courier New";color:rgb(0,127,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">> +</span><span style="font-size:8.5pt;font-family:"Courier New";color:rgb(0,127,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><span class="gmail-Apple-tab-span" style="white-space:pre">     </span></span><span style="font-size:8.5pt;font-family:"Courier New";color:rgb(0,127,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><span class="gmail-Apple-tab-span" style="white-space:pre">    </span></span><span style="font-size:8.5pt;font-family:"Courier New";color:rgb(0,127,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">else {</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:8.5pt;font-family:"Courier New";color:rgb(0,127,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">> +</span><span style="font-size:8.5pt;font-family:"Courier New";color:rgb(0,127,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><span class="gmail-Apple-tab-span" style="white-space:pre"> </span></span><span style="font-size:8.5pt;font-family:"Courier New";color:rgb(0,127,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><span class="gmail-Apple-tab-span" style="white-space:pre">    </span></span><span style="font-size:8.5pt;font-family:"Courier New";color:rgb(0,127,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><span class="gmail-Apple-tab-span" style="white-space:pre">    </span></span><span style="font-size:8.5pt;font-family:"Courier New";color:rgb(0,127,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">l3_sft_cksum = true;</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:8.5pt;font-family:"Courier New";color:rgb(0,127,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">> +</span><span style="font-size:8.5pt;font-family:"Courier New";color:rgb(0,127,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><span class="gmail-Apple-tab-span" style="white-space:pre">   </span></span><span style="font-size:8.5pt;font-family:"Courier New";color:rgb(0,127,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><span class="gmail-Apple-tab-span" style="white-space:pre">    </span></span><span style="font-size:8.5pt;font-family:"Courier New";color:rgb(0,127,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><span class="gmail-Apple-tab-span" style="white-space:pre">    </span></span><span style="font-size:8.5pt;font-family:"Courier New";color:rgb(0,127,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">printf("WARNING: IPV4 checksum offload not available.\n");</span></p><p dir="ltr" style="line-height:1.287;margin-top:0pt;margin-bottom:8pt"><span style="font-size:8.5pt;font-family:"Courier New";color:rgb(0,127,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">> +</span><span style="font-size:8.5pt;font-family:"Courier New";color:rgb(0,127,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><span class="gmail-Apple-tab-span" style="white-space:pre">  </span></span><span style="font-size:8.5pt;font-family:"Courier New";color:rgb(0,127,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><span class="gmail-Apple-tab-span" style="white-space:pre">    </span></span><span style="font-size:8.5pt;font-family:"Courier New";color:rgb(0,127,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><span class="gmail-Apple-tab-span" style="white-space:pre">    </span></span><span style="font-size:8.5pt;font-family:"Courier New";color:rgb(0,127,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">}</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">If cksum HW offload capability is missing, we call SFT cksum function, by setting a bool variable to true. We will look into setting up the SFT callbacks in the next version of patch.</span></p></span><br class="gmail-Apple-interchange-newline"></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Nov 4, 2021 at 6:19 PM Ananyev, Konstantin <<a href="mailto:konstantin.ananyev@intel.com">konstantin.ananyev@intel.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">> checks if ipv4 and udptcp cksum offload capability available<br>
> If not available, cksum is verified through software<br>
> If cksum is corrupt, packet is dropped, rest of the packets<br>
> are forwarded back.<br>
<br>
>From what I see right now l3fwd:<br>
   a) enables HW RX cksum offload <br>
   b) simply ignores HW provided cksum status <br>
Which came as a real surprise to me. <br>
Feel free to correct me if I missed something obvious here.<br>
<br>
So, I think first we need to add missing check first,<br>
even though it might cause some perf drop. <br>
Then make changes to actually check provided by HW status and<br>
when HW doesn't provide such offload do check in SW.<br>
<br>
Another alternative would be to remove request for HW offloads<br>
and document l3fwd that it doesn't check checksums at all,<br>
but I don't think it is a good way.<br>
<br>
> Bugzilla ID:545<br>
> Signed-off-by: Usama Nadeem <<a href="mailto:usama.nadeem@emumba.com" target="_blank">usama.nadeem@emumba.com</a>><br>
> ---<br>
>  examples/l3fwd/l3fwd.h     |  6 ++++<br>
>  examples/l3fwd/l3fwd_lpm.c | 72 ++++++++++++++++++++++++++++++++++++--<br>
>  examples/l3fwd/main.c      | 33 +++++++++++++++--<br>
>  3 files changed, 105 insertions(+), 6 deletions(-)<br>
> <br>
> diff --git a/examples/l3fwd/l3fwd.h b/examples/l3fwd/l3fwd.h<br>
> index a808d60247..c2c21a91fb 100644<br>
> --- a/examples/l3fwd/l3fwd.h<br>
> +++ b/examples/l3fwd/l3fwd.h<br>
> @@ -55,6 +55,8 @@<br>
>  #define L3FWD_HASH_ENTRIES           (1024*1024*1)<br>
>  #endif<br>
>  #define HASH_ENTRY_NUMBER_DEFAULT    4<br>
> +extern bool l3_sft_cksum;<br>
> +extern bool l4_sft_cksum;<br>
<br>
About the approach itself.<br>
We have similar issue for HW PTYPE recognition - some HW doesn't support it.<br>
So we check HW capabilities and if required we setup SW RX callbacks to do<br>
determine PTYPE in SW. Note that for EM/LPM we have different callbacks.<br>
I think for cksum checks we can do the same:<br>
check HW capabilities, if they are missing add a new callback that would<br>
calculate/check cksum and set  RTE_MBUF_F_RX_*_CKSUM_* flags.<br>
That way it will HW/SW cksum will be transparent for the rest of l3fwd code.  <br>
<br>
About cksums required: for LPM/FIB mode just IPv4 cksum seems enough.<br>
For EM we probably need L4 cksum too, though not sure is it really needed.<br>
Wonder what other people think here? <br>
<br>
 >  struct mbuf_table {<br>
>       uint16_t len;<br>
> @@ -210,6 +212,10 @@ em_main_loop(__rte_unused void *dummy);<br>
>  int<br>
>  lpm_main_loop(__rte_unused void *dummy);<br>
> <br>
> +int<br>
> +check_software_cksum(struct rte_mbuf **pkts_burst,<br>
> +struct rte_mbuf **pkts_burst_to_send, int nb_rx);<br>
> +<br>
>  int<br>
>  fib_main_loop(__rte_unused void *dummy);<br>
> <br>
> diff --git a/examples/l3fwd/l3fwd_lpm.c b/examples/l3fwd/l3fwd_lpm.c<br>
> index 232b606b54..ecaf323943 100644<br>
> --- a/examples/l3fwd/l3fwd_lpm.c<br>
> +++ b/examples/l3fwd/l3fwd_lpm.c<br>
> @@ -26,6 +26,7 @@<br>
>  #include <rte_udp.h><br>
>  #include <rte_lpm.h><br>
>  #include <rte_lpm6.h><br>
> +#include <rte_net.h><br>
> <br>
>  #include "l3fwd.h"<br>
>  #include "l3fwd_event.h"<br>
> @@ -139,16 +140,65 @@ lpm_get_dst_port_with_ipv4(const struct lcore_conf *qconf, struct rte_mbuf *pkt,<br>
>  #include "l3fwd_lpm.h"<br>
>  #endif<br>
> <br>
> +<br>
> +int check_software_cksum(struct rte_mbuf **pkts_burst,<br>
> +struct rte_mbuf **pkts_burst_to_send, int nb_rx)<br>
> +{<br>
> +     int j;<br>
> +     int i = 0;<br>
> +     struct rte_net_hdr_lens hdr_lens;<br>
> +     struct rte_ipv4_hdr *ipv4_hdr;<br>
> +     void *l3_hdr;<br>
> +     void *l4_hdr;<br>
> +     rte_be16_t prev_cksum;<br>
> +     int dropped_pkts_udp_tcp = 0;<br>
> +     int dropped_pkts_ipv4 = 0;<br>
> +     bool dropped;<br>
> +     for (j = 0; j < nb_rx; j++) {<br>
> +             dropped = false;<br>
> +             rte_net_get_ptype(pkts_burst[j], &hdr_lens, RTE_PTYPE_ALL_MASK);<br>
> +             l3_hdr = rte_pktmbuf_mtod_offset(pkts_burst[j],<br>
> +             void *, hdr_lens.l2_len);<br>
> +             l4_hdr = rte_pktmbuf_mtod_offset(pkts_burst[j],<br>
> +             void *, hdr_lens.l2_len + hdr_lens.l3_len);<br>
> +             ipv4_hdr = l3_hdr;<br>
> +             prev_cksum = ipv4_hdr->hdr_checksum;<br>
> +             ipv4_hdr->hdr_checksum = 0;<br>
> +             ipv4_hdr->hdr_checksum = rte_ipv4_cksum(ipv4_hdr);<br>
> +<br>
> +             if (l3_sft_cksum && prev_cksum != ipv4_hdr->hdr_checksum) {<br>
> +                     rte_pktmbuf_free(pkts_burst[j]);<br>
> +                     dropped_pkts_ipv4++;<br>
> +                     dropped = true;<br>
> +             } else if (l4_sft_cksum &&<br>
> +                             rte_ipv4_udptcp_cksum_verify<br>
> +                             (l3_hdr, l4_hdr) != 0) {<br>
> +<br>
> +                     rte_pktmbuf_free(pkts_burst[j]);<br>
> +                     dropped_pkts_udp_tcp++;<br>
> +                     dropped = true;<br>
> +             }<br>
> +             if (dropped == false) {<br>
> +                     pkts_burst_to_send[i] = pkts_burst[j];<br>
> +                     i++;<br>
> +             }<br>
> +<br>
> +     }<br>
> +     return dropped_pkts_udp_tcp+dropped_pkts_ipv4;<br>
> +}<br>
> +<br>
>  /* main processing loop */<br>
>  int<br>
>  lpm_main_loop(__rte_unused void *dummy)<br>
>  {<br>
>       struct rte_mbuf *pkts_burst[MAX_PKT_BURST];<br>
> +     struct rte_mbuf *pkts_burst_to_send[MAX_PKT_BURST];<br>
>       unsigned lcore_id;<br>
>       uint64_t prev_tsc, diff_tsc, cur_tsc;<br>
>       int i, nb_rx;<br>
>       uint16_t portid;<br>
>       uint8_t queueid;<br>
> +     int dropped;<br>
>       struct lcore_conf *qconf;<br>
>       const uint64_t drain_tsc = (rte_get_tsc_hz() + US_PER_S - 1) /<br>
>               US_PER_S * BURST_TX_DRAIN_US;<br>
> @@ -209,19 +259,35 @@ lpm_main_loop(__rte_unused void *dummy)<br>
>                       if (nb_rx == 0)<br>
>                               continue;<br>
> <br>
> +                     if (l3_sft_cksum || l4_sft_cksum) {<br>
> +                             dropped = check_software_cksum(pkts_burst,<br>
> +                             pkts_burst_to_send,     nb_rx);<br>
> +<br>
> +                             nb_rx = nb_rx-dropped;<br>
> +                     }<br>
> +<br>
> +<br>
>  #if defined RTE_ARCH_X86 || defined __ARM_NEON \<br>
>                        || defined RTE_ARCH_PPC_64<br>
> +             if (l3_sft_cksum == false && l4_sft_cksum == false)<br>
>                       l3fwd_lpm_send_packets(nb_rx, pkts_burst,<br>
>                                               portid, qconf);<br>
> +             else<br>
> +                     l3fwd_lpm_send_packets(nb_rx, pkts_burst_to_send,<br>
> +                                             portid, qconf);<br>
> +<br>
>  #else<br>
> -                     l3fwd_lpm_no_opt_send_packets(nb_rx, pkts_burst,<br>
> +                     if (l3_sft_cksum == false && l4_sft_cksum == false)<br>
> +                             l3fwd_lpm_no_opt_send_packets(nb_rx, pkts_burst,<br>
>                                                       portid, qconf);<br>
> +                     else<br>
> +                             l3fwd_lpm_no_opt_send_packets(nb_rx,<br>
> +                             pkts_burst_to_send, portid, qconf);<br>
> +<br>
>  #endif /* X86 */<br>
>               }<br>
> -<br>
>               cur_tsc = rte_rdtsc();<br>
>       }<br>
> -<br>
>       return 0;<br>
>  }<br>
> <br>
> diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c<br>
> index 00ac267af1..a54aca070d 100644<br>
> --- a/examples/l3fwd/main.c<br>
> +++ b/examples/l3fwd/main.c<br>
> @@ -61,6 +61,9 @@ static uint16_t nb_txd = RTE_TEST_TX_DESC_DEFAULT;<br>
>  /**< Ports set in promiscuous mode off by default. */<br>
>  static int promiscuous_on;<br>
> <br>
> +bool l3_sft_cksum;<br>
> +bool l4_sft_cksum;<br>
> +<br>
>  /* Select Longest-Prefix, Exact match or Forwarding Information Base. */<br>
>  enum L3FWD_LOOKUP_MODE {<br>
>       L3FWD_LOOKUP_DEFAULT,<br>
> @@ -123,7 +126,6 @@ static struct rte_eth_conf port_conf = {<br>
>               .mq_mode = ETH_MQ_RX_RSS,<br>
>               .max_rx_pkt_len = RTE_ETHER_MAX_LEN,<br>
>               .split_hdr_size = 0,<br>
> -             .offloads = DEV_RX_OFFLOAD_CHECKSUM,<br>
>       },<br>
>       .rx_adv_conf = {<br>
>               .rss_conf = {<br>
> @@ -981,6 +983,7 @@ prepare_ptype_parser(uint16_t portid, uint16_t queueid)<br>
>       return 0;<br>
>  }<br>
> <br>
> +<br>
>  static void<br>
>  l3fwd_poll_resource_setup(void)<br>
>  {<br>
> @@ -993,7 +996,8 @@ l3fwd_poll_resource_setup(void)<br>
>       unsigned int nb_ports;<br>
>       unsigned int lcore_id;<br>
>       int ret;<br>
> -<br>
> +     l3_sft_cksum = false;<br>
> +     l4_sft_cksum = false;<br>
>       if (check_lcore_params() < 0)<br>
>               rte_exit(EXIT_FAILURE, "check_lcore_params failed\n");<br>
> <br>
> @@ -1034,11 +1038,34 @@ l3fwd_poll_resource_setup(void)<br>
>                       rte_exit(EXIT_FAILURE,<br>
>                               "Error during getting device (port %u) info: %s\n",<br>
>                               portid, strerror(-ret));<br>
> -<br>
>               if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE)<br>
>                       local_port_conf.txmode.offloads |=<br>
>                               DEV_TX_OFFLOAD_MBUF_FAST_FREE;<br>
> <br>
> +             if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_IPV4_CKSUM)<br>
> +                     local_port_conf.rxmode.offloads |=<br>
> +                     DEV_RX_OFFLOAD_IPV4_CKSUM;<br>
> +             else {<br>
> +                     l3_sft_cksum = true;<br>
> +                     printf("WARNING: IPV4 checksum offload not available.\n");<br>
> +                     }<br>
> +<br>
> +             if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_UDP_CKSUM)<br>
> +                     local_port_conf.rxmode.offloads |=<br>
> +                             DEV_RX_OFFLOAD_UDP_CKSUM;<br>
> +             else {<br>
> +                     l4_sft_cksum = true;<br>
> +                     printf("WARNING: UDP checksum offload not available.\n");<br>
> +             }<br>
> +<br>
> +             if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_TCP_CKSUM)<br>
> +                     local_port_conf.rxmode.offloads |=<br>
> +                             DEV_RX_OFFLOAD_TCP_CKSUM;<br>
> +             else {<br>
> +                     l4_sft_cksum = true;<br>
> +                     printf("WARNING: TCP checksum offload not available.\n");<br>
> +             }<br>
> +<br>
>               local_port_conf.rx_adv_conf.rss_conf.rss_hf &=<br>
>                       dev_info.flow_type_rss_offloads;<br>
> <br>
> --<br>
> 2.25.1<br>
<br>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr">-Usama<br></div></div>