Support rx of in direction packets only Useful for apps that also tx to eth_pcap ports in order not to see them echoed back in as rx when out direction is also captured
Signed-off-by: ido goshen <i...@cgstowernetworks.com> --- v2: clean checkpatch warning drivers/net/pcap/rte_eth_pcap.c | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/drivers/net/pcap/rte_eth_pcap.c b/drivers/net/pcap/rte_eth_pcap.c index 6bd4a7d..132f469 100644 --- a/drivers/net/pcap/rte_eth_pcap.c +++ b/drivers/net/pcap/rte_eth_pcap.c @@ -26,6 +26,7 @@ #define ETH_PCAP_RX_PCAP_ARG "rx_pcap" #define ETH_PCAP_TX_PCAP_ARG "tx_pcap" #define ETH_PCAP_RX_IFACE_ARG "rx_iface" +#define ETH_PCAP_RX_IFACE_IN_ARG "rx_iface_in" #define ETH_PCAP_TX_IFACE_ARG "tx_iface" #define ETH_PCAP_IFACE_ARG "iface" @@ -83,6 +84,7 @@ struct pmd_devargs { ETH_PCAP_RX_PCAP_ARG, ETH_PCAP_TX_PCAP_ARG, ETH_PCAP_RX_IFACE_ARG, + ETH_PCAP_RX_IFACE_IN_ARG, ETH_PCAP_TX_IFACE_ARG, ETH_PCAP_IFACE_ARG, NULL @@ -726,6 +728,22 @@ struct pmd_devargs { return 0; } +static inline int +set_iface_direction(const char *iface, const char *key, pcap_t *pcap) +{ + if (strcmp(key, ETH_PCAP_RX_IFACE_IN_ARG) == 0) { + if (pcap_setdirection(pcap, PCAP_D_IN) < 0) { + PMD_LOG(ERR, + "Setting %s pcap direction IN failed - %s\n", + iface, + pcap_geterr(pcap)); + return -1; + } + PMD_LOG(INFO, "Setting %s pcap direction IN\n", iface); + } + return 0; +} + /* * Opens a NIC for reading packets from it */ @@ -740,11 +758,12 @@ struct pmd_devargs { for (i = 0; i < rx->num_of_queue; i++) { if (open_single_iface(iface, &pcap) < 0) return -1; + if (set_iface_direction(iface, key, pcap) < 0) + return -1; rx->queue[i].pcap = pcap; rx->queue[i].name = iface; rx->queue[i].type = key; } - return 0; } @@ -963,17 +982,25 @@ struct pmd_devargs { is_rx_pcap = 1; else pcaps.num_of_queue = rte_kvargs_count(kvlist, - ETH_PCAP_RX_IFACE_ARG); + ETH_PCAP_RX_IFACE_ARG) + + rte_kvargs_count(kvlist, + ETH_PCAP_RX_IFACE_IN_ARG); if (pcaps.num_of_queue > RTE_PMD_PCAP_MAX_QUEUES) pcaps.num_of_queue = RTE_PMD_PCAP_MAX_QUEUES; - if (is_rx_pcap) + if (is_rx_pcap) { ret = rte_kvargs_process(kvlist, ETH_PCAP_RX_PCAP_ARG, &open_rx_pcap, &pcaps); - else + } else { ret = rte_kvargs_process(kvlist, ETH_PCAP_RX_IFACE_ARG, &open_rx_iface, &pcaps); + if (ret == 0) + ret = rte_kvargs_process(kvlist, + ETH_PCAP_RX_IFACE_IN_ARG, + &open_rx_iface, + &pcaps); + } if (ret < 0) goto free_kvlist; @@ -1046,6 +1073,7 @@ struct pmd_devargs { ETH_PCAP_RX_PCAP_ARG "=<string> " ETH_PCAP_TX_PCAP_ARG "=<string> " ETH_PCAP_RX_IFACE_ARG "=<ifc> " + ETH_PCAP_RX_IFACE_IN_ARG "=<ifc> " ETH_PCAP_TX_IFACE_ARG "=<ifc> " ETH_PCAP_IFACE_ARG "=<ifc>"); -- 1.9.1