X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=app%2Ftest-pmd%2Fconfig.c;h=ab458c8d2837aa3d820ad9d10d4cdfe3699c61e9;hb=35b2d13fd6fdcbd191f2a30d74648faeb1186c65;hp=d18ef81f41c5db94287b8956069a9688f7f8218a;hpb=ec7f71577febe59323cd29e9a086348ff3c791cb;p=dpdk.git diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c index d18ef81f41..ab458c8d28 100644 --- a/app/test-pmd/config.c +++ b/app/test-pmd/config.c @@ -50,6 +50,7 @@ #endif #include #include +#include #include "testpmd.h" @@ -74,6 +75,10 @@ static const struct { }; const struct rss_type_info rss_type_table[] = { + { "all", ETH_RSS_IP | ETH_RSS_TCP | + ETH_RSS_UDP | ETH_RSS_SCTP | + ETH_RSS_L2_PAYLOAD }, + { "none", 0 }, { "ipv4", ETH_RSS_IPV4 }, { "ipv4-frag", ETH_RSS_FRAG_IPV4 }, { "ipv4-tcp", ETH_RSS_NONFRAG_IPV4_TCP }, @@ -103,10 +108,10 @@ const struct rss_type_info rss_type_table[] = { }; static void -print_ethaddr(const char *name, struct ether_addr *eth_addr) +print_ethaddr(const char *name, struct rte_ether_addr *eth_addr) { - char buf[ETHER_ADDR_FMT_SIZE]; - ether_format_addr(buf, ETHER_ADDR_FMT_SIZE, eth_addr); + char buf[RTE_ETHER_ADDR_FMT_SIZE]; + rte_ether_format_addr(buf, RTE_ETHER_ADDR_FMT_SIZE, eth_addr); printf("%s%s", name, buf); } @@ -386,7 +391,7 @@ void port_infos_display(portid_t port_id) { struct rte_port *port; - struct ether_addr mac_addr; + struct rte_ether_addr mac_addr; struct rte_eth_link link; struct rte_eth_dev_info dev_info; int vlan_offload; @@ -410,6 +415,8 @@ port_infos_display(portid_t port_id) rte_eth_dev_get_name_by_port(port_id, name); printf("\nDevice name: %s", name); printf("\nDriver name: %s", dev_info.driver_name); + if (dev_info.device->devargs && dev_info.device->devargs->args) + printf("\nDevargs: %s", dev_info.device->devargs->args); printf("\nConnect to socket: %u", port->socket_id); if (port_numa[port_id] != NUMA_NO_CONFIG) { @@ -517,6 +524,43 @@ port_infos_display(portid_t port_id) } } +void +port_summary_header_display(void) +{ + uint16_t port_number; + + port_number = rte_eth_dev_count_avail(); + printf("Number of available ports: %i\n", port_number); + printf("%-4s %-17s %-12s %-14s %-8s %s\n", "Port", "MAC Address", "Name", + "Driver", "Status", "Link"); +} + +void +port_summary_display(portid_t port_id) +{ + struct rte_ether_addr mac_addr; + struct rte_eth_link link; + struct rte_eth_dev_info dev_info; + char name[RTE_ETH_NAME_MAX_LEN]; + + if (port_id_is_invalid(port_id, ENABLED_WARN)) { + print_valid_ports(); + return; + } + + rte_eth_link_get_nowait(port_id, &link); + rte_eth_dev_info_get(port_id, &dev_info); + rte_eth_dev_get_name_by_port(port_id, name); + rte_eth_macaddr_get(port_id, &mac_addr); + + printf("%-4d %02X:%02X:%02X:%02X:%02X:%02X %-12s %-14s %-8s %uMbps\n", + port_id, mac_addr.addr_bytes[0], mac_addr.addr_bytes[1], + mac_addr.addr_bytes[2], mac_addr.addr_bytes[3], + mac_addr.addr_bytes[4], mac_addr.addr_bytes[5], name, + dev_info.driver_name, (link.link_status) ? ("up") : ("down"), + (unsigned int) link.link_speed); +} + void port_offload_cap_display(portid_t port_id) { @@ -543,7 +587,7 @@ port_offload_cap_display(portid_t port_id) if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_QINQ_STRIP) { printf("Double VLANs stripped: "); if (ports[port_id].dev_conf.rxmode.offloads & - DEV_RX_OFFLOAD_VLAN_EXTEND) + DEV_RX_OFFLOAD_QINQ_STRIP) printf("on\n"); else printf("off\n"); @@ -773,6 +817,16 @@ port_offload_cap_display(portid_t port_id) else printf("off\n"); } + + if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_OUTER_UDP_CKSUM) { + printf("TX Outer UDP checksum: "); + if (ports[port_id].dev_conf.txmode.offloads & + DEV_TX_OFFLOAD_OUTER_UDP_CKSUM) + printf("on\n"); + else + printf("off\n"); + } + } int @@ -1009,9 +1063,16 @@ void port_mtu_set(portid_t port_id, uint16_t mtu) { int diag; + struct rte_eth_dev_info dev_info; if (port_id_is_invalid(port_id, ENABLED_WARN)) return; + rte_eth_dev_info_get(port_id, &dev_info); + if (mtu > dev_info.max_mtu || mtu < dev_info.min_mtu) { + printf("Set MTU failed. MTU:%u is not in valid range, min:%u - max:%u\n", + mtu, dev_info.min_mtu, dev_info.max_mtu); + return; + } diag = rte_eth_dev_set_mtu(port_id, mtu); if (diag == 0) return; @@ -1430,8 +1491,8 @@ ring_dma_zone_lookup(const char *ring_name, portid_t port_id, uint16_t q_id) char mz_name[RTE_MEMZONE_NAMESIZE]; const struct rte_memzone *mz; - snprintf(mz_name, sizeof(mz_name), "%s_%s_%d_%d", - ports[port_id].dev_info.driver_name, ring_name, port_id, q_id); + snprintf(mz_name, sizeof(mz_name), "eth_p%d_q%d_%s", + port_id, q_id, ring_name); mz = rte_memzone_lookup(mz_name); if (mz == NULL) printf("%s ring memory zoneof (port %d, queue %d) not" @@ -2458,7 +2519,8 @@ set_tx_pkt_segments(unsigned *seg_lengths, unsigned nb_segs) * Check that each segment length is greater or equal than * the mbuf data sise. * Check also that the total packet length is greater or equal than the - * size of an empty UDP/IP packet (sizeof(struct ether_hdr) + 20 + 8). + * size of an empty UDP/IP packet (sizeof(struct rte_ether_hdr) + + * 20 + 8). */ tx_pkt_len = 0; for (i = 0; i < nb_segs; i++) { @@ -2469,10 +2531,10 @@ set_tx_pkt_segments(unsigned *seg_lengths, unsigned nb_segs) } tx_pkt_len = (uint16_t)(tx_pkt_len + seg_lengths[i]); } - if (tx_pkt_len < (sizeof(struct ether_hdr) + 20 + 8)) { + if (tx_pkt_len < (sizeof(struct rte_ether_hdr) + 20 + 8)) { printf("total packet length=%u < %d - give up\n", (unsigned) tx_pkt_len, - (int)(sizeof(struct ether_hdr) + 20 + 8)); + (int)(sizeof(struct rte_ether_hdr) + 20 + 8)); return; } @@ -2656,12 +2718,103 @@ set_pkt_forwarding_mode(const char *fwd_mode_name) printf("Invalid %s packet forwarding mode\n", fwd_mode_name); } +void +add_rx_dump_callbacks(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_rx_queues; queue++) + if (!ports[portid].rx_dump_cb[queue]) + ports[portid].rx_dump_cb[queue] = + rte_eth_add_rx_callback(portid, queue, + dump_rx_pkts, NULL); +} + +void +add_tx_dump_callbacks(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_dump_cb[queue]) + ports[portid].tx_dump_cb[queue] = + rte_eth_add_tx_callback(portid, queue, + dump_tx_pkts, NULL); +} + +void +remove_rx_dump_callbacks(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_rx_queues; queue++) + if (ports[portid].rx_dump_cb[queue]) { + rte_eth_remove_rx_callback(portid, queue, + ports[portid].rx_dump_cb[queue]); + ports[portid].rx_dump_cb[queue] = NULL; + } +} + +void +remove_tx_dump_callbacks(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_dump_cb[queue]) { + rte_eth_remove_tx_callback(portid, queue, + ports[portid].tx_dump_cb[queue]); + ports[portid].tx_dump_cb[queue] = NULL; + } +} + +void +configure_rxtx_dump_callbacks(uint16_t verbose) +{ + portid_t portid; + +#ifndef RTE_ETHDEV_RXTX_CALLBACKS + TESTPMD_LOG(ERR, "setting rxtx callbacks is not enabled\n"); + return; +#endif + + RTE_ETH_FOREACH_DEV(portid) + { + if (verbose == 1 || verbose > 2) + add_rx_dump_callbacks(portid); + else + remove_rx_dump_callbacks(portid); + if (verbose >= 2) + add_tx_dump_callbacks(portid); + else + remove_tx_dump_callbacks(portid); + } +} + void set_verbose_level(uint16_t vb_level) { printf("Change verbose level from %u to %u\n", (unsigned int) verbose_level, (unsigned int) vb_level); verbose_level = vb_level; + configure_rxtx_dump_callbacks(verbose_level); } void @@ -2810,7 +2963,6 @@ vlan_tpid_set(portid_t port_id, enum rte_vlan_type vlan_type, uint16_t tp_id) void tx_vlan_set(portid_t port_id, uint16_t vlan_id) { - int vlan_offload; struct rte_eth_dev_info dev_info; if (port_id_is_invalid(port_id, ENABLED_WARN)) @@ -2818,8 +2970,8 @@ tx_vlan_set(portid_t port_id, uint16_t vlan_id) if (vlan_id_is_invalid(vlan_id)) return; - vlan_offload = rte_eth_dev_get_vlan_offload(port_id); - if (vlan_offload & ETH_VLAN_EXTEND_OFFLOAD) { + if (ports[port_id].dev_conf.txmode.offloads & + DEV_TX_OFFLOAD_QINQ_INSERT) { printf("Error, as QinQ has been enabled.\n"); return; } @@ -2838,7 +2990,6 @@ tx_vlan_set(portid_t port_id, uint16_t vlan_id) void tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer) { - int vlan_offload; struct rte_eth_dev_info dev_info; if (port_id_is_invalid(port_id, ENABLED_WARN)) @@ -2848,11 +2999,6 @@ tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer) if (vlan_id_is_invalid(vlan_id_outer)) return; - vlan_offload = rte_eth_dev_get_vlan_offload(port_id); - if (!(vlan_offload & ETH_VLAN_EXTEND_OFFLOAD)) { - printf("Error, as QinQ hasn't been enabled.\n"); - return; - } rte_eth_dev_info_get(port_id, &dev_info); if ((dev_info.tx_offload_capa & DEV_TX_OFFLOAD_QINQ_INSERT) == 0) { printf("Error: qinq insert not supported by port %d\n", @@ -2861,7 +3007,8 @@ tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer) } tx_vlan_reset(port_id); - ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_QINQ_INSERT; + ports[port_id].dev_conf.txmode.offloads |= (DEV_TX_OFFLOAD_VLAN_INSERT | + DEV_TX_OFFLOAD_QINQ_INSERT); ports[port_id].tx_vlan_id = vlan_id; ports[port_id].tx_vlan_id_outer = vlan_id_outer; } @@ -3307,7 +3454,7 @@ set_vf_rate_limit(portid_t port_id, uint16_t vf, uint16_t rate, uint64_t q_msk) static int mcast_addr_pool_extend(struct rte_port *port) { - struct ether_addr *mc_pool; + struct rte_ether_addr *mc_pool; size_t mc_pool_size; /* @@ -3324,9 +3471,9 @@ mcast_addr_pool_extend(struct rte_port *port) * The previous test guarantees that port->mc_addr_nb is a multiple * of MCAST_POOL_INC. */ - mc_pool_size = sizeof(struct ether_addr) * (port->mc_addr_nb + + mc_pool_size = sizeof(struct rte_ether_addr) * (port->mc_addr_nb + MCAST_POOL_INC); - mc_pool = (struct ether_addr *) realloc(port->mc_addr_pool, + mc_pool = (struct rte_ether_addr *) realloc(port->mc_addr_pool, mc_pool_size); if (mc_pool == NULL) { printf("allocation of pool of %u multicast addresses failed\n", @@ -3355,7 +3502,7 @@ mcast_addr_pool_remove(struct rte_port *port, uint32_t addr_idx) } memmove(&port->mc_addr_pool[addr_idx], &port->mc_addr_pool[addr_idx + 1], - sizeof(struct ether_addr) * (port->mc_addr_nb - addr_idx)); + sizeof(struct rte_ether_addr) * (port->mc_addr_nb - addr_idx)); } static void @@ -3374,7 +3521,7 @@ eth_port_multicast_addr_list_set(portid_t port_id) } void -mcast_addr_add(portid_t port_id, struct ether_addr *mc_addr) +mcast_addr_add(portid_t port_id, struct rte_ether_addr *mc_addr) { struct rte_port *port; uint32_t i; @@ -3389,7 +3536,7 @@ mcast_addr_add(portid_t port_id, struct ether_addr *mc_addr) * in the pool of multicast addresses. */ for (i = 0; i < port->mc_addr_nb; i++) { - if (is_same_ether_addr(mc_addr, &port->mc_addr_pool[i])) { + if (rte_is_same_ether_addr(mc_addr, &port->mc_addr_pool[i])) { printf("multicast address already filtered by port\n"); return; } @@ -3397,12 +3544,12 @@ mcast_addr_add(portid_t port_id, struct ether_addr *mc_addr) if (mcast_addr_pool_extend(port) != 0) return; - ether_addr_copy(mc_addr, &port->mc_addr_pool[i]); + rte_ether_addr_copy(mc_addr, &port->mc_addr_pool[i]); eth_port_multicast_addr_list_set(port_id); } void -mcast_addr_remove(portid_t port_id, struct ether_addr *mc_addr) +mcast_addr_remove(portid_t port_id, struct rte_ether_addr *mc_addr) { struct rte_port *port; uint32_t i; @@ -3416,7 +3563,7 @@ mcast_addr_remove(portid_t port_id, struct ether_addr *mc_addr) * Search the pool of multicast MAC addresses for the removed address. */ for (i = 0; i < port->mc_addr_nb; i++) { - if (is_same_ether_addr(mc_addr, &port->mc_addr_pool[i])) + if (rte_is_same_ether_addr(mc_addr, &port->mc_addr_pool[i])) break; } if (i == port->mc_addr_nb) {