首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rte_eth_tx_burst无法发送数据包

rte_eth_tx_burst无法发送数据包
EN

Stack Overflow用户
提问于 2022-04-21 11:09:17
回答 2查看 459关注 0票数 0

一个dpdk应用程序,它生成少量的arp请求包并调用rte_eth_tx_burst将它们发送出去,一些数据包没有被对等NIC端口接收(这可以通过使用wireshark从对等NIC捕获数据包来确认),dpdk-proc-info显示没有错误计数。但是在调用rte_eth_tx_burst之前让应用程序休眠10,它可以发送所有的数据包.

示例代码:

代码语言:javascript
复制
main(){
  port_init();
  sleep(10);
  gen_pkt(mbuf);
  rte_eth_tx_burst(mbuf);
}

系统设置:Ubuntu20.04.2LTS,dpdk-稳定-20.11.3,I350千兆网络连接1521,igb_uio驱动程序

代码语言:javascript
复制
root@k8s-node:/home/dpdk-stable-20.11.3/build/app# ./dpdk-proc-info -- --xstats
EAL: No legacy callbacks, legacy socket not created
###### NIC extended statistics for port 0  #########
####################################################
rx_good_packets: 10
tx_good_packets: 32
rx_good_bytes: 1203
tx_good_bytes: 1920
rx_missed_errors: 0
rx_errors: 0
tx_errors: 0
rx_mbuf_allocation_errors: 0
rx_q0_packets: 0
rx_q0_bytes: 0
rx_q0_errors: 0
tx_q0_packets: 0
tx_q0_bytes: 0
rx_crc_errors: 0
rx_align_errors: 0
rx_symbol_errors: 0
rx_missed_packets: 0
tx_single_collision_packets: 0
tx_multiple_collision_packets: 0
tx_excessive_collision_packets: 0
tx_late_collisions: 0
tx_total_collisions: 0
tx_deferred_packets: 0
tx_no_carrier_sense_packets: 0
rx_carrier_ext_errors: 0
rx_length_errors: 0
rx_xon_packets: 0
tx_xon_packets: 0
rx_xoff_packets: 0
tx_xoff_packets: 0
rx_flow_control_unsupported_packets: 0
rx_size_64_packets: 4
rx_size_65_to_127_packets: 3
rx_size_128_to_255_packets: 3
rx_size_256_to_511_packets: 0
rx_size_512_to_1023_packets: 0
rx_size_1024_to_max_packets: 0
rx_broadcast_packets: 0
rx_multicast_packets: 10
rx_undersize_errors: 0
rx_fragment_errors: 0
rx_oversize_errors: 0
rx_jabber_errors: 0
rx_management_packets: 0
rx_management_dropped: 0
tx_management_packets: 0
rx_total_packets: 10
tx_total_packets: 32
rx_total_bytes: 1203
tx_total_bytes: 1920
tx_size_64_packets: 32
tx_size_65_to_127_packets: 0
tx_size_128_to_255_packets: 0
tx_size_256_to_511_packets: 0
tx_size_512_to_1023_packets: 0
tx_size_1023_to_max_packets: 0
tx_multicast_packets: 0
tx_broadcast_packets: 32
tx_tso_packets: 0
tx_tso_errors: 0
rx_sent_to_host_packets: 0
tx_sent_by_host_packets: 0
rx_code_violation_packets: 0
interrupt_assert_count: 0
####################################################

root@k8s-node:/home/dpdk-stable-20.11.3/build/app# ./dpdk-proc-info -- --stats
EAL: No legacy callbacks, legacy socket not created

  ######################## NIC statistics for port 0  ########################
  RX-packets: 5           RX-errors:  0           RX-bytes:  785       
  RX-nombuf:  0         
  TX-packets: 32          TX-errors:  0           TX-bytes:  1920      

  Stats reg  0 RX-packets: 0           RX-errors: 0           RX-bytes: 0         
  Stats reg  1 RX-packets: 0           RX-errors: 0           RX-bytes: 0         
  Stats reg  2 RX-packets: 0           RX-errors: 0           RX-bytes: 0         
  Stats reg  3 RX-packets: 0           RX-errors: 0           RX-bytes: 0         
  Stats reg  4 RX-packets: 0           RX-errors: 0           RX-bytes: 0         
  Stats reg  5 RX-packets: 0           RX-errors: 0           RX-bytes: 0         
  Stats reg  6 RX-packets: 0           RX-errors: 0           RX-bytes: 0         
  Stats reg  7 RX-packets: 0           RX-errors: 0           RX-bytes: 0         
  Stats reg  8 RX-packets: 0           RX-errors: 0           RX-bytes: 0         
  Stats reg  9 RX-packets: 0           RX-errors: 0           RX-bytes: 0         
  Stats reg 10 RX-packets: 0           RX-errors: 0           RX-bytes: 0         
  Stats reg 11 RX-packets: 0           RX-errors: 0           RX-bytes: 0         
  Stats reg 12 RX-packets: 0           RX-errors: 0           RX-bytes: 0         
  Stats reg 13 RX-packets: 0           RX-errors: 0           RX-bytes: 0         
  Stats reg 14 RX-packets: 0           RX-errors: 0           RX-bytes: 0         
  Stats reg 15 RX-packets: 0           RX-errors: 0           RX-bytes: 0         

  Stats reg  0 TX-packets: 0           TX-bytes: 0         
  Stats reg  1 TX-packets: 0           TX-bytes: 0         
  Stats reg  2 TX-packets: 0           TX-bytes: 0         
  Stats reg  3 TX-packets: 0           TX-bytes: 0         
  Stats reg  4 TX-packets: 0           TX-bytes: 0         
  Stats reg  5 TX-packets: 0           TX-bytes: 0         
  Stats reg  6 TX-packets: 0           TX-bytes: 0         
  Stats reg  7 TX-packets: 0           TX-bytes: 0         
  Stats reg  8 TX-packets: 0           TX-bytes: 0         
  Stats reg  9 TX-packets: 0           TX-bytes: 0         
  Stats reg 10 TX-packets: 0           TX-bytes: 0         
  Stats reg 11 TX-packets: 0           TX-bytes: 0         
  Stats reg 12 TX-packets: 0           TX-bytes: 0         
  Stats reg 13 TX-packets: 0           TX-bytes: 0         
  Stats reg 14 TX-packets: 0           TX-bytes: 0         
  Stats reg 15 TX-packets: 0           TX-bytes: 0         
  ############################################################################

更新:

谢谢你的回复,我修改了密码:

代码语言:javascript
复制
main(){
  uint32_t port_mask = 0x1;
  port_init();
  check_all_ports_link_status(port_mask);
  gen_pkt(mbuf);
  rte_eth_tx_burst(mbuf);
}

拿到了打印日志:

代码语言:javascript
复制
Checking link status...............................
done
Port0 Link Up. Speed 1000 Mbps - full-duplex

我认为NIC应该已经完全实现了,但是对等NIC端口仍然漏掉了很多数据包。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-22 02:17:37

在大多数工作情况下,物理NIC被枚举为双工(完整/半)、速度(1、10、25、40、50、100、200),以及在1秒内协商的(自动/禁用)。任何超过2或3秒的标志是连接的机器或开关不能与双工,速度或自动协商。因此,建议是

  1. 如果接口是NIC的话,更新驱动程序和固件。
  2. 测试不同的连接电缆,因为链路可能达不到正确。
  3. 在轮毂或开关的情况下,尝试固定速度和自动协商.
  4. 我不建议改变从全双工到半双工(因为它可能是电缆或SFI问题)。

作为暂时的工作,您可以使用到达,这也说明它可能需要It might need to wait up to 9 seconds

注意:测试是否存在电缆问题的简单方法是在两端运行DPDK,以检查链接启动所需的时间。

修改后的代码片段:

代码语言:javascript
复制
main(){
  port_init();
  
  RTE_ETH_FOREACH_DEV(portid) {
   struct rte_eth_link link;
   memset(&link, 0, sizeof(link));

   do {
        retval = rte_eth_link_get_nowait(port, &link);
        if (retval < 0) {
            printf("Failed link get (port %u): %s\n",
                port, rte_strerror(-retval));
            return retval;
        } else if (link.link_status)
            break;
        printf("Waiting for Link up on port %"PRIu16"\n", port);
        sleep(1);
    } while (!link.link_status);
  }

  gen_pkt(mbuf);
  rte_eth_tx_burst(mbuf);
}

代码语言:javascript
复制
main(){
  port_init();
  
  RTE_ETH_FOREACH_DEV(portid) {
   struct rte_eth_link link;
   memset(&link, 0, sizeof(link));
   ret = rte_eth_link_get(portid, &link);
   if (ret < 0) {
            printf("Port %u link get failed: err=%d\n", portid, ret);
            continue;
    }

  gen_pkt(mbuf);
  rte_eth_tx_burst(mbuf);
}
票数 1
EN

Stack Overflow用户

发布于 2022-04-21 12:29:14

在物理链路上升之前不能发送数据包也就不足为奇了。这需要一些时间,可以使用rte_eth_link_get() API接口自动等待。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71953440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档