如何解决为多个源地址复制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中的缓冲区。
请让我知道最好的方法是什么。
我首先想到了在pkts指向的rte_mbuf中编辑源IP,然后通过具有源IP递增循环来调用rte_eth_tx_burst(info-> pid,qid,pkts,cnt)函数,但是rte_eth_tx_burst函数似乎释放了发送数据包一次后,pkts指向rte_mbuf,因此我无法再次编辑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,NULL);
if (tstamp)
pktgen_tstamp_apply(info,seq_idx);
ret = rte_eth_tx_burst(info->pid,qid,cnt);
if (tap)
pktgen_do_tx_tap(info,ret);
pkts += ret;
cnt -= ret;
}
}
解决方法
要将DPDK数据包缓冲区保留在内存中,请使用rte_mbuf_refcnt_update
将mbuf ptr -> refcnt
从1
更新为10
。这样会将缓冲区保留在内存中,直到对同一mbuf调用rte_eth_tx_burst
或rte_pktmbuf_free
或combination of both
十次为止。
注意:请在当前代码段中添加代码
- 确保当前的MBUF是IP。
- 修改IP标头后重新计算IP校验和。
基于Skype对话的[EDIT-1],突出显示了要聚焦的主要区域。实际dpdk-pktgen的更改将影响功能和性能。建议使用dpdk-burstreplay或定制的DPDK应用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。