DPDK数据包丢失和混乱

时间:2018-02-06 02:25:00

标签: dpdk

我使用DPDK做了一个简单的测试程序:computer1中的program1是发送数据包,而computer2中的program2是接收数据包。 computer1和computer2直接连接,没有开关。

在程序1中,我使用packId来指示数据包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); 
}
}

在接收器中,我定义了长RX环: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左右。

1 个答案:

答案 0 :(得分:0)

rte_eth_stats_get()对于故障排除非常有用。从rte_eth_stats,我发现ipackets是正确的,q_ipackets [0]是正确的,并且imissed是0,ierrors是0,rx_nombuf是0,q_errors [0]是0.所以它应该是program2中的代码有问题。检查代码后,这是因为program2中的一些内存管理。