为多个源地址复制 dpdk pktgen 读取的 PCAP 数据包
Replicating PCAP packets read by dpdk pktgen for multiple source addresses
我想使用 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 中的缓冲区
请告诉我最好的方法是什么。
我首先想到在调用 rte_eth_tx_burst(info->pid, qid, pkts, cnt) 函数之前编辑 pkts 指向的 rte_mbuf 中的源 IP,使源 IP 递增循环,但似乎 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, 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_update
将 mbuf ptr -> refcnt
从 1
更新为 10
。这会将缓冲区保留在内存中,直到 rte_eth_tx_burst
或 rte_pktmbuf_free
或 combination of both
被相同的 mbuf 调用 10 次。
注意:请将当前代码片段添加到
- 确保当前MBUF是IP。
- re-calculate修改IP头时的IP校验和
[EDIT-1] 基于 skype 对话,突出显示要关注的主要区域。实际 dpdk-pktgen 的变化将影响功能和性能。推荐使用 dpdk-burstreplay 或自定义构建的 DPDK 应用。
我想使用 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
。基本上,在修改每个 运行.
请告诉我最好的方法是什么。
我首先想到在调用 rte_eth_tx_burst(info->pid, qid, pkts, cnt) 函数之前编辑 pkts 指向的 rte_mbuf 中的源 IP,使源 IP 递增循环,但似乎 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, 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_update
将 mbuf ptr -> refcnt
从 1
更新为 10
。这会将缓冲区保留在内存中,直到 rte_eth_tx_burst
或 rte_pktmbuf_free
或 combination of both
被相同的 mbuf 调用 10 次。
注意:请将当前代码片段添加到
- 确保当前MBUF是IP。
- re-calculate修改IP头时的IP校验和
[EDIT-1] 基于 skype 对话,突出显示要关注的主要区域。实际 dpdk-pktgen 的变化将影响功能和性能。推荐使用 dpdk-burstreplay 或自定义构建的 DPDK 应用。