[dpdk-users] Replicating PCAP packets read by pktgen for multiple source addresses

Ravi Tandon ravi.tandon1982 at gmail.com
Mon Sep 14 18:03:26 CEST 2020


Thanks Keith.

I updated the refcnt and it worked.

Regards,
Ravi

On Mon, Sep 14, 2020 at 3:30 PM Wiles, Keith <keith.wiles at intel.com> wrote:

> You can edit the packet in the function below, but you have to do that
> action everytime. Freeing the mbuf I sok, you can look into the refcnt
> value in the mbuf if you want tx_burst to not free the packet completely.
>
>
>
> *From: *users <users-bounces at dpdk.org>
> *Date: *Sunday, September 13, 2020 at 5:00 PM
> *To: *users at dpdk.org <users at dpdk.org>
> *Subject: *[dpdk-users] Replicating PCAP packets read by pktgen for
> multiple source addresses
>
> Hi,
>
> I want to use pktgen to read a pcap file and play that pcap file say 10
> times by editing the source IP address for each run, please let me know
> what's the best way of doing this.
>
> I first thought of editing the source IP in the rte_mbuf pointed by pkts
> before calling the rte_eth_tx_burst(info->pid, qid, pkts, cnt) function but
> it seems that rte_eth_tx_burst function frees up the rte_mbuf pointed by
> pkts after sending the packet once so I cannot edit the pkts buffer again.
>
>
> static __inline__ void
> trafficgen_send_burst(port_info_t *info, uint16_t qid)
> {
> struct mbuf_table   *mtab = &info->q[qid].tx_mbufs;
> struct rte_mbuf **pkts;
> struct qstats_s *qstats;
> uint32_t ret, cnt, tap, rnd, tstamp, i;
> int32_t seq_idx;
>
> if ((cnt = mtab->len) == 0)
> return;
>
> mtab->len = 0;
> pkts = mtab->m_table;
>
> if (trafficgen_tst_port_flags(info, SEND_RANGE_PKTS))
> seq_idx = RANGE_PKT;
> else if (trafficgen_tst_port_flags(info, SEND_RATE_PACKETS))
> seq_idx = RATE_PKT;
> else
> seq_idx = SINGLE_PKT;
>
> tap = trafficgen_tst_port_flags(info, PROCESS_TX_TAP_PKTS);
> rnd = trafficgen_tst_port_flags(info, SEND_RANDOM_PKTS);
> tstamp = trafficgen_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]);
>
> */*Inserting a for loop here doesn't help as rte_mbuf is freed by
> rte_eth_tx_burst*/*
> /* Send all of the packets before we can exit this function */
> while (cnt) {
>
> if (rnd)
> trafficgen_rnd_bits_apply(info, pkts, cnt, NULL);
>
> if (tstamp)
> trafficgen_tstamp_apply(info, pkts, cnt, seq_idx);
>
> ret = rte_eth_tx_burst(info->pid, qid, pkts, cnt);
>
> if (tap)
> trafficgen_do_tx_tap(info, pkts, ret);
>
> pkts += ret;
> cnt -= ret;
> }
> }
>
> Basically, I want to resend buffers stored in rte_mbuf again and again,
> after modifying source IP in each run.
>
> Thanks
> Ravi
>


More information about the users mailing list