app/testpmd: add packet dump callbacks
authorRaslan Darawsheh <rasland@mellanox.com>
Wed, 17 Oct 2018 15:22:10 +0000 (18:22 +0300)
committerFerruh Yigit <ferruh.yigit@intel.com>
Thu, 18 Oct 2018 08:24:39 +0000 (10:24 +0200)
add new rx/tx callback functions to be used for dumping the packets.

Signed-off-by: Raslan Darawsheh <rasland@mellanox.com>
Acked-by: Bernard Iremonger <bernard.iremonger@intel.com>
app/test-pmd/config.c
app/test-pmd/rxonly.c
app/test-pmd/testpmd.h
app/test-pmd/util.c

index a6db5df..55fec7f 100644 (file)
@@ -2705,6 +2705,73 @@ set_pkt_forwarding_mode(const char *fwd_mode_name)
        printf("Invalid %s packet forwarding mode\n", fwd_mode_name);
 }
 
+void
+add_rx_dump_callbacks(portid_t portid)
+{
+       struct rte_eth_dev_info dev_info;
+       uint16_t queue;
+
+       if (port_id_is_invalid(portid, ENABLED_WARN))
+               return;
+
+       rte_eth_dev_info_get(portid, &dev_info);
+       for (queue = 0; queue < dev_info.nb_rx_queues; queue++)
+               if (!ports[portid].rx_dump_cb[queue])
+                       ports[portid].rx_dump_cb[queue] =
+                               rte_eth_add_rx_callback(portid, queue,
+                                       dump_rx_pkts, NULL);
+}
+
+void
+add_tx_dump_callbacks(portid_t portid)
+{
+       struct rte_eth_dev_info dev_info;
+       uint16_t queue;
+
+       if (port_id_is_invalid(portid, ENABLED_WARN))
+               return;
+       rte_eth_dev_info_get(portid, &dev_info);
+       for (queue = 0; queue < dev_info.nb_tx_queues; queue++)
+               if (!ports[portid].tx_dump_cb[queue])
+                       ports[portid].tx_dump_cb[queue] =
+                               rte_eth_add_tx_callback(portid, queue,
+                                                       dump_tx_pkts, NULL);
+}
+
+void
+remove_rx_dump_callbacks(portid_t portid)
+{
+       struct rte_eth_dev_info dev_info;
+       uint16_t queue;
+
+       if (port_id_is_invalid(portid, ENABLED_WARN))
+               return;
+       rte_eth_dev_info_get(portid, &dev_info);
+       for (queue = 0; queue < dev_info.nb_rx_queues; queue++)
+               if (ports[portid].rx_dump_cb[queue]) {
+                       rte_eth_remove_rx_callback(portid, queue,
+                               ports[portid].rx_dump_cb[queue]);
+                       ports[portid].rx_dump_cb[queue] = NULL;
+               }
+}
+
+void
+remove_tx_dump_callbacks(portid_t portid)
+{
+       struct rte_eth_dev_info dev_info;
+       uint16_t queue;
+
+       if (port_id_is_invalid(portid, ENABLED_WARN))
+               return;
+       rte_eth_dev_info_get(portid, &dev_info);
+       for (queue = 0; queue < dev_info.nb_tx_queues; queue++)
+               if (ports[portid].tx_dump_cb[queue]) {
+                       rte_eth_remove_tx_callback(portid, queue,
+                               ports[portid].tx_dump_cb[queue]);
+                       ports[portid].tx_dump_cb[queue] = NULL;
+               }
+}
+
 void
 set_verbose_level(uint16_t vb_level)
 {
index 3eca89c..5c65fc4 100644 (file)
@@ -70,10 +70,6 @@ pkt_burst_receive(struct fwd_stream *fs)
        fs->rx_burst_stats.pkt_burst_spread[nb_rx]++;
 #endif
        fs->rx_packets += nb_rx;
-
-       /*
-        * Dump each received packet if verbose_level > 0.
-        */
        for (i = 0; i < nb_rx; i++)
                rte_pktmbuf_free(pkts_burst[i]);
 
index cba9640..c07bee8 100644 (file)
@@ -191,6 +191,8 @@ struct rte_port {
        uint32_t                mc_addr_nb; /**< nb. of addr. in mc_addr_pool */
        uint8_t                 slave_flag; /**< bonding slave port */
        struct port_flow        *flow_list; /**< Associated flows. */
+       const struct rte_eth_rxtx_callback *rx_dump_cb[MAX_QUEUE_ID+1];
+       const struct rte_eth_rxtx_callback *tx_dump_cb[MAX_QUEUE_ID+1];
 #ifdef SOFTNIC
        struct softnic_port     softport;  /**< softnic params */
 #endif
@@ -764,8 +766,17 @@ int check_nb_rxq(queueid_t rxq);
 queueid_t get_allowed_max_nb_txq(portid_t *pid);
 int check_nb_txq(queueid_t txq);
 
-void dump_pkt_burst(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[],
-        uint16_t nb_pkts, int is_rx);
+uint16_t dump_rx_pkts(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[],
+                     uint16_t nb_pkts, __rte_unused uint16_t max_pkts,
+                     __rte_unused void *user_param);
+
+uint16_t dump_tx_pkts(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[],
+                     uint16_t nb_pkts, __rte_unused void *user_param);
+
+void add_rx_dump_callbacks(portid_t portid);
+void remove_rx_dump_callbacks(portid_t portid);
+void add_tx_dump_callbacks(portid_t portid);
+void remove_tx_dump_callbacks(portid_t portid);
 
 /*
  * Work-around of a compilation error with ICC on invocations of the
index 3ba3b58..f4125df 100644 (file)
@@ -21,7 +21,7 @@ print_ether_addr(const char *what, struct ether_addr *eth_addr)
        printf("%s%s", what, buf);
 }
 
-void
+static inline void
 dump_pkt_burst(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[],
              uint16_t nb_pkts, int is_rx)
 {
@@ -149,3 +149,20 @@ dump_pkt_burst(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[],
                printf("  ol_flags: %s\n", buf);
        }
 }
+
+uint16_t
+dump_rx_pkts(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[],
+            uint16_t nb_pkts, __rte_unused uint16_t max_pkts,
+            __rte_unused void *user_param)
+{
+       dump_pkt_burst(port_id, queue, pkts, nb_pkts, 1);
+       return nb_pkts;
+}
+
+uint16_t
+dump_tx_pkts(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[],
+            uint16_t nb_pkts, __rte_unused void *user_param)
+{
+       dump_pkt_burst(port_id, queue, pkts, nb_pkts, 0);
+       return nb_pkts;
+}