DPDK发送自定义pkt但无法接收

时间:2017-05-24 13:53:47

标签: c dpdk

我正在尝试使用dpdk发送自定义包,但我发现某些包结构会使其无法接收。例如,我定义了这样的包结构:

union my_pkt{
   struct hdr{
       uint32_t id;
       uint32_t name_len;
       uint64_t tsc;
       uint8_t name[100];
   }__attribute__((__packed__)) pkt_hdr;
   char buff[500];
};

运行dpdk的服务器只能接收第一批pkts,但rte_eth_tx_burst()的返回值显示更多已发送的包。
但是,如果我修改结构如下:

union my_pkt{
   struct hdr{
       uint32_t id;
       uint32_t name_len;
       uint32_t tsc[2];//modify this line
       uint8_t name[100];
   }__attribute__((__packed__)) pkt_hdr;
   char buff[500];
};

发送和接收都正常工作。两个结构之间的唯一区别是uint64_t时间戳被一个由2个项组成的uint32_t数组替换。我调试到i40e驱动程序代码但无法理解它出错的地方。

任何人都可以帮助我吗?谢谢!

1 个答案:

答案 0 :(得分:0)

虽然从您的描述中不清楚,但您可能应该在缓冲区的开头添加以太网标头,即:

union my_pkt{
   struct hdr{
       struct ether_hdr; // Ethernet header
       uint32_t id;
       uint32_t name_len;
       uint64_t tsc;
       uint8_t name[100];
   }__attribute__((__packed__)) pkt_hdr;
   char buff[500];
};

然后用目标/源MAC填充它并输入您的代码。