X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=app%2Ftest-pmd%2Futil.c;h=781a81375983a141ee423a1be1e79545f03c75ed;hb=4a91344b5e06081f8e2254266bb469489f6633d8;hp=faf247c3f489a2fa2fbd268117c9c490456915c2;hpb=a5279d25616d7885c2b6d0a36590d0836281deff;p=dpdk.git diff --git a/app/test-pmd/util.c b/app/test-pmd/util.c index faf247c3f4..781a813759 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; @@ -46,18 +48,49 @@ dump_pkt_burst(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[], is_rx ? "received" : "sent", (unsigned int) nb_pkts); for (i = 0; i < nb_pkts; i++) { + int ret; + struct rte_flow_error error; + struct rte_flow_restore_info info = { 0, }; + mb = pkts[i]; eth_hdr = rte_pktmbuf_read(mb, 0, sizeof(_eth_hdr), &_eth_hdr); eth_type = RTE_BE_TO_CPU_16(eth_hdr->ether_type); - ol_flags = mb->ol_flags; packet_type = mb->packet_type; is_encapsulation = RTE_ETH_IS_TUNNEL_PKT(packet_type); - + ret = rte_flow_get_restore_info(port_id, mb, &info, &error); + if (!ret) { + printf("restore info:"); + if (info.flags & RTE_FLOW_RESTORE_INFO_TUNNEL) { + struct port_flow_tunnel *port_tunnel; + + port_tunnel = port_flow_locate_tunnel + (port_id, &info.tunnel); + printf(" - tunnel"); + if (port_tunnel) + printf(" #%u", port_tunnel->id); + else + printf(" %s", "-none-"); + printf(" type %s", + port_flow_tunnel_type(&info.tunnel)); + } else { + printf(" - no tunnel info"); + } + if (info.flags & RTE_FLOW_RESTORE_INFO_ENCAPSULATED) + printf(" - outer header present"); + else + printf(" - no outer header"); + if (info.flags & RTE_FLOW_RESTORE_INFO_GROUP_ID) + printf(" - miss group %u", info.group_id); + else + printf(" - no miss group"); + printf("\n"); + } print_ether_addr(" src=", ð_hdr->s_addr); print_ether_addr(" - dst=", ð_hdr->d_addr); printf(" - type=0x%04x - length=%u - nb_segs=%d", eth_type, (unsigned int) mb->pkt_len, (int)mb->nb_segs); + ol_flags = mb->ol_flags; if (ol_flags & PKT_RX_RSS_HASH) { printf(" - RSS hash=0x%x", (unsigned int) mb->hash.rss); printf(" - RSS queue=0x%x", (unsigned int) queue); @@ -81,6 +114,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 +227,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; } @@ -232,6 +279,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) @@ -262,6 +365,22 @@ eth_set_promisc_mode(uint16_t port, int enable) 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) {