X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=app%2Ftest-pmd%2Futil.c;h=8488fa1a8f04fcd85cc809e5967874b7d3eb48de;hb=573ef95dc7c9e4991da41fa1fc3d45c5c4076deb;hp=18dfdca08de4aae3e41396e0b20bf882342f8393;hpb=3e6b0d5f69da2130e60b535e57fd065746b932a8;p=dpdk.git diff --git a/app/test-pmd/util.c b/app/test-pmd/util.c index 18dfdca08d..8488fa1a8f 100644 --- a/app/test-pmd/util.c +++ b/app/test-pmd/util.c @@ -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 @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -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; +}