为多个源地址复制dpdk-pktgen读取的PCAP数据包



我想使用dpdk-pktgen读取带有IP数据包的pcap文件。然后用唯一的IP地址对每个IP包重播10次。示例if my pcap file has 20 packets, starting with TCP SYN packet, then I want to replay each packet with source IPs in my list, thus total of 10 x 20 packets should be sent。基本上,我想在每次运行中修改源IP后,一次又一次地重新发送存储在rte_mbuf中的缓冲区。

请告诉我最好的方法是什么。

在通过源IP递增循环调用rte_eth_tx_burst(info->pid,qid,pkts,cnt(函数之前,我首先想到了编辑pkts指向的rte_mbuf中的源IP,但似乎rte_eth_tx_burst函数在发送一次数据包后释放了pkts指定的rte_mbu,因此我无法再次编辑pkts缓冲区。

static __inline__ void
pktgen_send_burst(port_info_t *info, uint16_t qid)
{
struct mbuf_table   *mtab = &info->q[qid].tx_mbufs;
struct rte_mbuf **pkts, **orig_pkts;
struct qstats_s *qstats;
uint32_t ret, cnt, tap, rnd, tstamp, i, j, orig_cnt;
int32_t seq_idx, num_src_ips=10;
if ((cnt = mtab->len) == 0)
return;
mtab->len = 0;
pkts = mtab->m_table;
if (pktgen_tst_port_flags(info, SEND_RANGE_PKTS))
seq_idx = RANGE_PKT;
else if (pktgen_tst_port_flags(info, SEND_RATE_PACKETS))
seq_idx = RATE_PKT;
else
seq_idx = SINGLE_PKT;
tap = pktgen_tst_port_flags(info, PROCESS_TX_TAP_PKTS);
rnd = pktgen_tst_port_flags(info, SEND_RANDOM_PKTS);
tstamp = pktgen_tst_port_flags(info, (SEND_LATENCY_PKTS | SEND_RATE_PACKETS));
qstats = &info->qstats[qid];
qstats->txpkts += cnt;
for (i = 0; i < cnt; i++) {
qstats->txbytes += rte_pktmbuf_data_len(pkts[i]);
rte_mbuf_refcnt_update(pkts[i], num_src_ips) /*Updating refcnt to num_src_ips*/
}

/* Send all of the packets before we can exit this function */
while (cnt) {
if (rnd)
pktgen_rnd_bits_apply(info, pkts, cnt, NULL);
if (tstamp)
pktgen_tstamp_apply(info, pkts, cnt, seq_idx);
ret = rte_eth_tx_burst(info->pid, qid, pkts, cnt);
if (tap)
pktgen_do_tx_tap(info, pkts, ret);
pkts += ret;
cnt -= ret;
}
}

要在内存中保留DPDK数据包缓冲区,请使用rte_mbuf_refcnt_updatembuf ptr -> refcnt1更新为10。这会将缓冲区保留在内存中,直到rte_eth_tx_burstrte_pktmbuf_freecombination of both被调用10次用于相同的mbuf。

注意:请将代码添加到的当前代码段

  • 确保当前MBUF为IP
  • 当IP报头被修改时,重新计算IP校验和

[EDIT-1]基于skype对话,突出显示了要关注的主要领域。实际dpdk-pktgen的更改将影响功能和性能。建议使用dpdk burstreplay或自定义构建的dpdk应用程序。

最新更新