/* 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>
#include <rte_net.h>
#include <rte_mbuf.h>
#include <rte_ether.h>
+#include <rte_vxlan.h>
#include <rte_ethdev.h>
#include <rte_flow.h>
uint16_t udp_port;
uint32_t vx_vni;
const char *reason;
+ int dynf_index;
if (!nb_pkts)
return;
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);
* 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;
}
}
}
+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)
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;
+}