1.) Я забыл упомянуть, что l2 len было установлено следующим образом.
if (ETHER_TYPE_VLAN == eth_type)
{
mbuf->l2_len = sizeof(struct ether_hdr) + sizeof(struct vlan_hdr);
}
else {
mbuf->ol_flags = PKT_TX_VLAN_PKT;
mbuf->l2_len = sizeof(struct ether_hdr);
}
2.) Я пытался использовать второй вариант как
хорошо после установки l2_len и l3_len, но это не сработало.
ip->hdr_checksum = 0;
mbuf->ol_flags |= PKT_TX_IPV4 | PKT_TX_IP_CKSUM | PKT_TX_UDP_CKSUM;
udphdr->dgram_cksum = rte_ipv4_phdr_cksum(mbuf->l3_len, mbuf->ol_flags);
3.) Как уже упоминалось, он поддерживается на аппаратной рекламе DEV_TX_OFFLOAD_IPV4_CKSUM, DEV_TX_OFFLOAD_UDP_CKSUM и DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM.
Так что в качестве другого варианта я попытался установить разгрузки txmode во время инициализации порта вместе с вариантом 2.)
struct rte_eth_conf port_conf;
port_conf.txmode.offloads |= DEV_TX_OFFLOAD_UDP_CKSUM |DEV_TX_OFFLOAD_IPV4_CKSUM;
ret = rte_eth_dev_configure(port, nbqueue, nbqueue, &port_conf);
Это тоже не сработало.
Пожалуйста, предложите любые другие обходные пути, которые я могу попробовать.