On 6/22/2018 8:15 AM, Ido Goshen wrote: > > >> -----Original Message----- >> From: Ferruh Yigit <ferruh.yi...@intel.com> >> Sent: Thursday, June 21, 2018 3:51 PM >> To: Ido Goshen <i...@cgstowernetworks.com> >> Cc: dev@dpdk.org >> Subject: Re: [PATCH v2 3/3] net/pcap: support pcap files and ifaces mix >> >> On 6/21/2018 1:24 PM, ido goshen wrote: >>> Suggested-by: Ferruh Yigit <ferruh.yi...@intel.com> >>> >>> Signed-off-by: ido goshen <i...@cgstowernetworks.com> >> >> <...> >> >>> +static uint16_t >>> +eth_pcap_tx_mux(void *queue, struct rte_mbuf **bufs, uint16_t >>> +nb_pkts) { >>> + struct pcap_tx_queue *tx_queue = queue; >>> + if (tx_queue->dumper) >>> + return eth_pcap_tx_dumper(queue, bufs, nb_pkts); >>> + else >>> + return eth_pcap_tx(queue, bufs, nb_pkts); } >>> + >>> /* >>> * pcap_open_live wrapper function >>> */ >>> @@ -773,6 +783,31 @@ struct pmd_devargs { >>> return open_iface(key, value, extra_args); } >>> >>> +static int >>> +open_pcap_rx_mux(const char *key, const char *value, void >>> +*extra_args) { >>> + struct pmd_devargs *pcaps = extra_args; >> >> Do we need this assignment? Why not pass extra_args directly? > > [idog] Correct, it can be passed directly > other option is to leave the assignment here and pass strong type to the > internal open_rx_pcap/iface > instead of passing it as void* > Any preference? > >> >>> + >>> + if (strcmp(key, ETH_PCAP_RX_PCAP_ARG) == 0) >>> + return open_rx_pcap(key, value, pcaps); >>> + if (strcmp(key, ETH_PCAP_RX_IFACE_ARG) == 0) >>> + return open_rx_iface(key, value, pcaps); >>> + return 0; >>> +} >>> + >>> +static int >>> +open_pcap_tx_mux(const char *key, const char *value, void >>> +*extra_args) { >>> + struct pmd_devargs *dumpers = extra_args; >> >> Do we need this assignment? Why not pass extra_args directly? >> >>> + >>> + if (strcmp(key, ETH_PCAP_TX_PCAP_ARG) == 0) >>> + return open_tx_pcap(key, value, dumpers); >>> + if (strcmp(key, ETH_PCAP_TX_IFACE_ARG) == 0) >>> + return open_tx_iface(key, value, dumpers); >>> + return 0; >>> +} >>> + >>> + >>> static struct rte_vdev_driver pmd_pcap_drv; >>> >>> static int >>> @@ -873,8 +908,7 @@ struct pmd_devargs { eth_from_pcaps(struct >>> rte_vdev_device *vdev, >>> struct pmd_devargs *rx_queues, const unsigned int >> nb_rx_queues, >>> struct pmd_devargs *tx_queues, const unsigned int >> nb_tx_queues, >>> - struct rte_kvargs *kvlist, int single_iface, >>> - unsigned int using_dumpers) >>> + struct rte_kvargs *kvlist, int single_iface) >>> { >>> struct pmd_internals *internals = NULL; >>> struct rte_eth_dev *eth_dev = NULL; >>> @@ -891,10 +925,7 @@ struct pmd_devargs { >>> >>> eth_dev->rx_pkt_burst = eth_pcap_rx; >>> >>> - if (using_dumpers) >>> - eth_dev->tx_pkt_burst = eth_pcap_tx_dumper; >>> - else >>> - eth_dev->tx_pkt_burst = eth_pcap_tx; >>> + eth_dev->tx_pkt_burst = eth_pcap_tx_mux; >> >> We shouldn't introduce an extra check in data path. Instead of checking "if >> (tx_queue->dumper)" for _each_ packet, we should check it here once and >> assign proper burst function. > > [idog] I don't see how it can be avoided > rte_eth_dev has only single tx_pkt_burst > but now we suggest to support 2 different queue types in a single device > each type requires different end functionality pcap_dump or pcap_sendpkt > btw - it's only once per burst
Right, we can't avoid. This change is removing a limitation in the PMD but with a side effect, I missed side effect part. I am for rejecting the patch until this feature explicitly requested for a practical usecase, to be sure we are not introducing the side effect a feature that is not really needed. Thanks for your effort.