【发布时间】:2018-02-06 02:24:59
【问题描述】:
我使用 DPDK 做了一个简单的测试程序:computer1 中的 program1 是发送数据包,computer2 中的 program2 是接收数据包。 computer1 和computer2 直接相连,没有开关。
在程序1中,我使用了一个packId来表示packet id的顺序。
while(true){
pkt = rte_pktmbuf_alloc(mbuf_pool);
uint8_t* pchar = rte_pktmbuf_mod(pkt, uint8_t*);
//set mac address and packet length. (pkt 0 to pkt 13).
//use from byte 14 to store uint_64 packId;
uint64_t* pPackId = (uint64_t*)(pchar+14);
*pPackId = packId;
packId++;
//put 1024 bytes data inside packet.
uint16_t sent = rte_eth_tx_burst(0, 0, &pkt, 1);
while(sent!=1)
{
sent = rte_eth_tx_burst(0, 0, &pkt, 1);
}
}
在接收器中,我定义了长接收环:nb_rxd=3072:
rte_eth_dev_adjust_nb_rx_tx_desc(0, &nb_rxd, &nb_txd);
rte_eth_rx_queue_setup(0, 0, nb_rxd, rte_eth_dev_socket_id(0), NULL, mbuf_pool);
有一个for循环来接收数据包,并检查数据包序列ID。
for(;;)
{
strcut rte_mbuf *bufs[32];
const uint16_t nb_rx = rte_eth_rx_burst(0, 0, bus, 32);
if(unlikely(nb_rx==0))
continue;
int m = 0;
for (m=0; m<nb_rx;m++)
{
uint8_t* pchar = rte_pktmbuf_mtod(buf[m], uint8_t*);
uint64_t* pPackId = pchar+14;
uint64_t packid = *pPackId;
if(expectedPackid!=packid){
printf...
expectedPackid = packid+1;
}
else expectedPackid++;
}
}
基于program2,我看到很多丢包和乱码。接收到的数据包被放入环形缓冲区。如果按顺序接收,我也发现有丢包,但我的program1的发送速度只有1gbps左右。
【问题讨论】:
-
嗯,它是依赖于 PMD 的,但一般来说,如果你使用一个 TX/RX 队列发送和接收数据包,你应该按顺序获取数据包。总体而言,“很多数据包丢失”听起来像是其他问题,而不是排序本身。我建议您先处理丢失的数据包,然后再进行订购...
rte_eth_stats_get()可能会启发丢失数据包的情况... -
我使用 rte_eth_stats_get() 发现所有数据包都已收到。最后我发现这是我的program2问题。感谢您的正确指导,很高兴与您交谈。
-
您可能会发现自己回答问题很有用,因此其他人可能会从您的经验中学习...
标签: dpdk