fix Mellanox copyright and SPDX tag
[dpdk.git] / app / test-pmd / util.c
index 18dfdca..8488fa1 100644 (file)
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: BSD-3-Clause
  * Copyright(c) 2010-2014 Intel Corporation
- * Copyright(c) 2018 Mellanox Technology
+ * Copyright 2018 Mellanox Technologies, Ltd
  */
 
 #include <stdio.h>
@@ -8,6 +8,7 @@
 #include <rte_net.h>
 #include <rte_mbuf.h>
 #include <rte_ether.h>
+#include <rte_vxlan.h>
 #include <rte_ethdev.h>
 #include <rte_flow.h>
 
@@ -38,6 +39,7 @@ dump_pkt_burst(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[],
        uint16_t udp_port;
        uint32_t vx_vni;
        const char *reason;
+       int dynf_index;
 
        if (!nb_pkts)
                return;
@@ -81,6 +83,18 @@ dump_pkt_burst(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[],
                               mb->vlan_tci, mb->vlan_tci_outer);
                else if (ol_flags & PKT_RX_VLAN)
                        printf(" - VLAN tci=0x%x", mb->vlan_tci);
+               if (!is_rx && (ol_flags & PKT_TX_DYNF_METADATA))
+                       printf(" - Tx metadata: 0x%x",
+                              *RTE_FLOW_DYNF_METADATA(mb));
+               if (is_rx && (ol_flags & PKT_RX_DYNF_METADATA))
+                       printf(" - Rx metadata: 0x%x",
+                              *RTE_FLOW_DYNF_METADATA(mb));
+               for (dynf_index = 0; dynf_index < 64; dynf_index++) {
+                       if (dynf_names[dynf_index][0] != '\0')
+                               printf(" - dynf %s: %d",
+                                      dynf_names[dynf_index],
+                                      !!(ol_flags & (1UL << dynf_index)));
+               }
                if (mb->packet_type) {
                        rte_get_ptype_name(mb->packet_type, buf, sizeof(buf));
                        printf(" - hw ptype: %s", buf);
@@ -182,10 +196,12 @@ tx_pkt_set_md(uint16_t port_id, __rte_unused uint16_t queue,
         * Add metadata value to every Tx packet,
         * and set ol_flags accordingly.
         */
-       for (i = 0; i < nb_pkts; i++) {
-               pkts[i]->tx_metadata = ports[port_id].tx_metadata;
-               pkts[i]->ol_flags |= PKT_TX_METADATA;
-       }
+       if (rte_flow_dynf_metadata_avail())
+               for (i = 0; i < nb_pkts; i++) {
+                       *RTE_FLOW_DYNF_METADATA(pkts[i]) =
+                                               ports[port_id].tx_metadata;
+                       pkts[i]->ol_flags |= PKT_TX_DYNF_METADATA;
+               }
        return nb_pkts;
 }
 
@@ -194,10 +210,15 @@ add_tx_md_callback(portid_t portid)
 {
        struct rte_eth_dev_info dev_info;
        uint16_t queue;
+       int ret;
 
        if (port_id_is_invalid(portid, ENABLED_WARN))
                return;
-       rte_eth_dev_info_get(portid, &dev_info);
+
+       ret = eth_dev_info_get_print_err(portid, &dev_info);
+       if (ret != 0)
+               return;
+
        for (queue = 0; queue < dev_info.nb_tx_queues; queue++)
                if (!ports[portid].tx_set_md_cb[queue])
                        ports[portid].tx_set_md_cb[queue] =
@@ -210,10 +231,15 @@ remove_tx_md_callback(portid_t portid)
 {
        struct rte_eth_dev_info dev_info;
        uint16_t queue;
+       int ret;
 
        if (port_id_is_invalid(portid, ENABLED_WARN))
                return;
-       rte_eth_dev_info_get(portid, &dev_info);
+
+       ret = eth_dev_info_get_print_err(portid, &dev_info);
+       if (ret != 0)
+               return;
+
        for (queue = 0; queue < dev_info.nb_tx_queues; queue++)
                if (ports[portid].tx_set_md_cb[queue]) {
                        rte_eth_remove_tx_callback(portid, queue,
@@ -221,3 +247,131 @@ remove_tx_md_callback(portid_t portid)
                        ports[portid].tx_set_md_cb[queue] = NULL;
                }
 }
+
+uint16_t
+tx_pkt_set_dynf(uint16_t port_id, __rte_unused uint16_t queue,
+               struct rte_mbuf *pkts[], uint16_t nb_pkts,
+               __rte_unused void *user_param)
+{
+       uint16_t i = 0;
+
+       if (ports[port_id].mbuf_dynf)
+               for (i = 0; i < nb_pkts; i++)
+                       pkts[i]->ol_flags |= ports[port_id].mbuf_dynf;
+       return nb_pkts;
+}
+
+void
+add_tx_dynf_callback(portid_t portid)
+{
+       struct rte_eth_dev_info dev_info;
+       uint16_t queue;
+       int ret;
+
+       if (port_id_is_invalid(portid, ENABLED_WARN))
+               return;
+
+       ret = eth_dev_info_get_print_err(portid, &dev_info);
+       if (ret != 0)
+               return;
+
+       for (queue = 0; queue < dev_info.nb_tx_queues; queue++)
+               if (!ports[portid].tx_set_dynf_cb[queue])
+                       ports[portid].tx_set_dynf_cb[queue] =
+                               rte_eth_add_tx_callback(portid, queue,
+                                                       tx_pkt_set_dynf, NULL);
+}
+
+void
+remove_tx_dynf_callback(portid_t portid)
+{
+       struct rte_eth_dev_info dev_info;
+       uint16_t queue;
+       int ret;
+
+       if (port_id_is_invalid(portid, ENABLED_WARN))
+               return;
+
+       ret = eth_dev_info_get_print_err(portid, &dev_info);
+       if (ret != 0)
+               return;
+
+       for (queue = 0; queue < dev_info.nb_tx_queues; queue++)
+               if (ports[portid].tx_set_dynf_cb[queue]) {
+                       rte_eth_remove_tx_callback(portid, queue,
+                               ports[portid].tx_set_dynf_cb[queue]);
+                       ports[portid].tx_set_dynf_cb[queue] = NULL;
+               }
+}
+
+int
+eth_dev_info_get_print_err(uint16_t port_id,
+                                       struct rte_eth_dev_info *dev_info)
+{
+       int ret;
+
+       ret = rte_eth_dev_info_get(port_id, dev_info);
+       if (ret != 0)
+               printf("Error during getting device (port %u) info: %s\n",
+                               port_id, strerror(-ret));
+
+       return ret;
+}
+
+void
+eth_set_promisc_mode(uint16_t port, int enable)
+{
+       int ret;
+
+       if (enable)
+               ret = rte_eth_promiscuous_enable(port);
+       else
+               ret = rte_eth_promiscuous_disable(port);
+
+       if (ret != 0)
+               printf("Error during %s promiscuous mode for port %u: %s\n",
+                       enable ? "enabling" : "disabling",
+                       port, rte_strerror(-ret));
+}
+
+void
+eth_set_allmulticast_mode(uint16_t port, int enable)
+{
+       int ret;
+
+       if (enable)
+               ret = rte_eth_allmulticast_enable(port);
+       else
+               ret = rte_eth_allmulticast_disable(port);
+
+       if (ret != 0)
+               printf("Error during %s all-multicast mode for port %u: %s\n",
+                       enable ? "enabling" : "disabling",
+                       port, rte_strerror(-ret));
+}
+
+int
+eth_link_get_nowait_print_err(uint16_t port_id, struct rte_eth_link *link)
+{
+       int ret;
+
+       ret = rte_eth_link_get_nowait(port_id, link);
+       if (ret < 0)
+               printf("Device (port %u) link get (without wait) failed: %s\n",
+                       port_id, rte_strerror(-ret));
+
+       return ret;
+}
+
+int
+eth_macaddr_get_print_err(uint16_t port_id, struct rte_ether_addr *mac_addr)
+{
+       int ret;
+
+       ret = rte_eth_macaddr_get(port_id, mac_addr);
+       if (ret != 0)
+               printf("Error getting device (port %u) mac address: %s\n",
+                               port_id, rte_strerror(-ret));
+
+       return ret;
+}