X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;ds=sidebyside;f=app%2Ftest-pmd%2Futil.c;h=6b0791daaba3e66f765bbd96a67a64070155f5a3;hb=640c5f09ef2cb23d300748e220ea5d8fffdbfdd0;hp=3ba3b583dff23be20f965ec040e353a88a37fcc0;hpb=d862c45b5955d010752f2321fa5d01cd8a5d6720;p=dpdk.git diff --git a/app/test-pmd/util.c b/app/test-pmd/util.c index 3ba3b583df..6b0791daab 100644 --- a/app/test-pmd/util.c +++ b/app/test-pmd/util.c @@ -21,7 +21,7 @@ print_ether_addr(const char *what, struct ether_addr *eth_addr) printf("%s%s", what, buf); } -void +static inline void dump_pkt_burst(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[], uint16_t nb_pkts, int is_rx) { @@ -36,6 +36,7 @@ dump_pkt_burst(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[], uint32_t sw_packet_type; uint16_t udp_port; uint32_t vx_vni; + const char *reason; if (!nb_pkts) return; @@ -147,5 +148,75 @@ dump_pkt_burst(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[], printf("\n"); rte_get_rx_ol_flag_list(mb->ol_flags, buf, sizeof(buf)); printf(" ol_flags: %s\n", buf); + if (rte_mbuf_check(mb, 1, &reason) < 0) + printf("INVALID mbuf: %s\n", reason); + } +} + +uint16_t +dump_rx_pkts(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[], + uint16_t nb_pkts, __rte_unused uint16_t max_pkts, + __rte_unused void *user_param) +{ + dump_pkt_burst(port_id, queue, pkts, nb_pkts, 1); + return nb_pkts; +} + +uint16_t +dump_tx_pkts(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[], + uint16_t nb_pkts, __rte_unused void *user_param) +{ + dump_pkt_burst(port_id, queue, pkts, nb_pkts, 0); + return nb_pkts; +} + +uint16_t +tx_pkt_set_md(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; + + /* + * 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; } + return nb_pkts; +} + +void +add_tx_md_callback(portid_t portid) +{ + struct rte_eth_dev_info dev_info; + uint16_t queue; + + if (port_id_is_invalid(portid, ENABLED_WARN)) + return; + rte_eth_dev_info_get(portid, &dev_info); + 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] = + rte_eth_add_tx_callback(portid, queue, + tx_pkt_set_md, NULL); +} + +void +remove_tx_md_callback(portid_t portid) +{ + struct rte_eth_dev_info dev_info; + uint16_t queue; + + if (port_id_is_invalid(portid, ENABLED_WARN)) + return; + rte_eth_dev_info_get(portid, &dev_info); + 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, + ports[portid].tx_set_md_cb[queue]); + ports[portid].tx_set_md_cb[queue] = NULL; + } }