我正在尝试使用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驱动程序代码但无法理解它出错的地方。
任何人都可以帮助我吗?谢谢!
答案 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填充它并输入您的代码。