fix Mellanox copyright and SPDX tag
[dpdk.git] / app / test-pmd / util.c
index f20531d..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>
@@ -39,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;
@@ -82,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);
@@ -183,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;
 }
 
@@ -233,6 +248,62 @@ remove_tx_md_callback(portid_t portid)
                }
 }
 
+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)