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

Reply via email to