无法在 DPDK 中打印 IP 地址

问题描述 投票:0回答:1

我正在玩 DPDK 示例skeleton,但无法打印正确的 IP 地址

rte_eth_rx_burst()
之后我尝试了以下打印方式:

    struct rte_ipv4_hdr *ipv4_hdr = rte_pktmbuf_mtod_offset(bufs[0],
                                    struct rte_ipv4_hdr *, sizeof(struct rte_ether_hdr));

    /* 1st way, prints:
      SrcIP: 162.38.192.168
      DstIP: 250.250.0.0
    */
    struct in_addr ip_addr = {0};
    ip_addr.s_addr = ipv4_hdr->src_addr;
    printf("SrcIP: %s\n", inet_ntoa(ip_addr));
    ip_addr.s_addr = ipv4_hdr->dst_addr;
    printf("DstIP: %s\n", inet_ntoa(ip_addr));

    /* 2nd way, prints:
       Source IP: 168.192.38.162
       Dest IP: 0.0.250.250
    */
   printf("Source IP: %u.%u.%u.%u\n", (ipv4_hdr->src_addr >> 24) & 0xff,
              (ipv4_hdr->src_addr >> 16) & 0xff,
              (ipv4_hdr->src_addr >> 8) & 0xff,
              ipv4_hdr->src_addr & 0xff);
   printf("Dest IP: %u.%u.%u.%u\n", (ipv4_hdr->dst_addr >> 24) & 0xff,
            (ipv4_hdr->dst_addr >> 16) & 0xff,
            (ipv4_hdr->dst_addr >> 8) & 0xff,
            ipv4_hdr->dst_addr & 0xff);

但是我从 192.168.250.250 (src IP) 向 192.168.250.1 (dst IP) 发送 ICMP 数据包。偏移量似乎有问题,但我不明白如何解决?但似乎我正在使用正确的方法来获取指向 IP 标头的指针

c linux networking printf dpdk
1个回答
1
投票

DPDK 的框架示例不支持 ARP 响应*,并且您的 ping 主机似乎无法设置 L2 连接(相邻)。因此,您只是尝试打印 IP 地址而不是来自 IPv4 标头,而是来自 ARP 标头。幸运的是协议字段在标头中的位置,一些 IP 地址最终出现在 printf 输出中。

*-在 DPDK 中,有必要自己负责所有重要协议逻辑的实现

© www.soinside.com 2019 - 2024. All rights reserved.