X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=app%2Fpdump%2Fmain.c;h=8e42b36476fd5b51f8d8e99a2bec171181289d5a;hb=refs%2Fheads%2Fupstream-17.11-stable;hp=e0ff8bea5617837dac81557b1b0dcffd06e3355b;hpb=5d4e5dcd8a186778b3d78e27c81550d07a288fd2;p=deb_dpdk.git diff --git a/app/pdump/main.c b/app/pdump/main.c index e0ff8bea..8e42b364 100644 --- a/app/pdump/main.c +++ b/app/pdump/main.c @@ -68,8 +68,8 @@ #define CMD_LINE_OPT_SER_SOCK_PATH "server-socket-path" #define CMD_LINE_OPT_CLI_SOCK_PATH "client-socket-path" -#define VDEV_PCAP "eth_pcap_%s_%d,tx_pcap=%s" -#define VDEV_IFACE "eth_pcap_%s_%d,tx_iface=%s" +#define VDEV_PCAP "net_pcap_%s_%d,tx_pcap=%s" +#define VDEV_IFACE "net_pcap_%s_%d,tx_iface=%s" #define TX_STREAM_SIZE 64 #define MP_NAME "pdump_pool_%d" @@ -92,7 +92,6 @@ #define BURST_SIZE 32 #define NUM_VDEVS 2 -#define RTE_RING_SZ_MASK (unsigned)(0x0fffffff) /**< Ring size mask */ /* true if x is a power of 2 */ #define POWEROF2(x) ((((x)-1) & (x)) == 0) @@ -132,7 +131,7 @@ struct pdump_stats { struct pdump_tuples { /* cli params */ - uint8_t port; + uint16_t port; char *device_id; uint16_t queue; char rx_dev[TX_STREAM_SIZE]; @@ -149,8 +148,8 @@ struct pdump_tuples { /* params for packet dumping */ enum pdump_by dump_by_type; - int rx_vdev_id; - int tx_vdev_id; + uint16_t rx_vdev_id; + uint16_t tx_vdev_id; enum pcap_stream rx_vdev_stream_type; enum pcap_stream tx_vdev_stream_type; bool single_pdump_dev; @@ -302,7 +301,7 @@ parse_pdump(const char *optarg) &parse_uint_value, &v); if (ret < 0) goto free_kvlist; - pt->port = (uint8_t) v.val; + pt->port = (uint16_t) v.val; pt->dump_by_type = PORT_ID; } else if (cnt2 == 1) { ret = rte_kvargs_process(kvlist, PDUMP_PCI_ARG, @@ -490,14 +489,14 @@ disable_pdump(struct pdump_tuples *pt) } static inline void -pdump_rxtx(struct rte_ring *ring, uint8_t vdev_id, struct pdump_stats *stats) +pdump_rxtx(struct rte_ring *ring, uint16_t vdev_id, struct pdump_stats *stats) { /* write input packets of port to vdev for pdump */ struct rte_mbuf *rxtx_bufs[BURST_SIZE]; /* first dequeue packets from ring of primary process */ const uint16_t nb_in_deq = rte_ring_dequeue_burst(ring, - (void *)rxtx_bufs, BURST_SIZE); + (void *)rxtx_bufs, BURST_SIZE, NULL); stats->dequeue_pkts += nb_in_deq; if (nb_in_deq) { @@ -517,13 +516,33 @@ pdump_rxtx(struct rte_ring *ring, uint8_t vdev_id, struct pdump_stats *stats) } static void -free_ring_data(struct rte_ring *ring, uint8_t vdev_id, +free_ring_data(struct rte_ring *ring, uint16_t vdev_id, struct pdump_stats *stats) { while (rte_ring_count(ring)) pdump_rxtx(ring, vdev_id, stats); } +static void +cleanup_rings(void) +{ + int i; + struct pdump_tuples *pt; + + for (i = 0; i < num_tuples; i++) { + pt = &pdump_t[i]; + + if (pt->device_id) + free(pt->device_id); + + /* free the rings */ + if (pt->rx_ring) + rte_ring_free(pt->rx_ring); + if (pt->tx_ring) + rte_ring_free(pt->tx_ring); + } +} + static void cleanup_pdump_resources(void) { @@ -545,16 +564,8 @@ cleanup_pdump_resources(void) free_ring_data(pt->rx_ring, pt->rx_vdev_id, &pt->stats); if (pt->dir & RTE_PDUMP_FLAG_TX) free_ring_data(pt->tx_ring, pt->tx_vdev_id, &pt->stats); - - if (pt->device_id) - free(pt->device_id); - - /* free the rings */ - if (pt->rx_ring) - rte_ring_free(pt->rx_ring); - if (pt->tx_ring) - rte_ring_free(pt->tx_ring); } + cleanup_rings(); } static void @@ -568,7 +579,7 @@ signal_handler(int sig_num) } static inline int -configure_vdev(uint8_t port_id) +configure_vdev(uint16_t port_id) { struct ether_addr addr; const uint16_t rxRings = 0, txRings = 1; @@ -598,7 +609,7 @@ configure_vdev(uint8_t port_id) rte_eth_macaddr_get(port_id, &addr); printf("Port %u MAC: %02"PRIx8" %02"PRIx8" %02"PRIx8 " %02"PRIx8" %02"PRIx8" %02"PRIx8"\n", - (unsigned)port_id, + port_id, addr.addr_bytes[0], addr.addr_bytes[1], addr.addr_bytes[2], addr.addr_bytes[3], addr.addr_bytes[4], addr.addr_bytes[5]); @@ -612,7 +623,7 @@ static void create_mp_ring_vdev(void) { int i; - uint8_t portid; + uint16_t portid; struct pdump_tuples *pt = NULL; struct rte_mempool *mbuf_pool = NULL; char vdev_args[SIZE]; @@ -630,10 +641,12 @@ create_mp_ring_vdev(void) MBUF_POOL_CACHE_SIZE, 0, pt->mbuf_data_size, rte_socket_id()); - if (mbuf_pool == NULL) + if (mbuf_pool == NULL) { + cleanup_rings(); rte_exit(EXIT_FAILURE, "Mempool creation failed: %s\n", rte_strerror(rte_errno)); + } } pt->mp = mbuf_pool; @@ -643,19 +656,23 @@ create_mp_ring_vdev(void) snprintf(ring_name, SIZE, RX_RING, i); pt->rx_ring = rte_ring_create(ring_name, pt->ring_size, rte_socket_id(), 0); - if (pt->rx_ring == NULL) + if (pt->rx_ring == NULL) { + cleanup_rings(); rte_exit(EXIT_FAILURE, "%s:%s:%d\n", rte_strerror(rte_errno), __func__, __LINE__); + } /* create tx_ring */ snprintf(ring_name, SIZE, TX_RING, i); pt->tx_ring = rte_ring_create(ring_name, pt->ring_size, rte_socket_id(), 0); - if (pt->tx_ring == NULL) + if (pt->tx_ring == NULL) { + cleanup_rings(); rte_exit(EXIT_FAILURE, "%s:%s:%d\n", rte_strerror(rte_errno), __func__, __LINE__); + } /* create vdevs */ (pt->rx_vdev_stream_type == IFACE) ? @@ -663,10 +680,12 @@ create_mp_ring_vdev(void) pt->rx_dev) : snprintf(vdev_args, SIZE, VDEV_PCAP, RX_STR, i, pt->rx_dev); - if (rte_eth_dev_attach(vdev_args, &portid) < 0) + if (rte_eth_dev_attach(vdev_args, &portid) < 0) { + cleanup_rings(); rte_exit(EXIT_FAILURE, "vdev creation failed:%s:%d\n", __func__, __LINE__); + } pt->rx_vdev_id = portid; /* configure vdev */ @@ -680,10 +699,13 @@ create_mp_ring_vdev(void) pt->tx_dev) : snprintf(vdev_args, SIZE, VDEV_PCAP, TX_STR, i, pt->tx_dev); - if (rte_eth_dev_attach(vdev_args, &portid) < 0) + if (rte_eth_dev_attach(vdev_args, + &portid) < 0) { + cleanup_rings(); rte_exit(EXIT_FAILURE, "vdev creation failed:" "%s:%d\n", __func__, __LINE__); + } pt->tx_vdev_id = portid; /* configure vdev */ @@ -695,19 +717,23 @@ create_mp_ring_vdev(void) snprintf(ring_name, SIZE, RX_RING, i); pt->rx_ring = rte_ring_create(ring_name, pt->ring_size, rte_socket_id(), 0); - if (pt->rx_ring == NULL) + if (pt->rx_ring == NULL) { + cleanup_rings(); rte_exit(EXIT_FAILURE, "%s\n", rte_strerror(rte_errno)); + } (pt->rx_vdev_stream_type == IFACE) ? snprintf(vdev_args, SIZE, VDEV_IFACE, RX_STR, i, pt->rx_dev) : snprintf(vdev_args, SIZE, VDEV_PCAP, RX_STR, i, pt->rx_dev); - if (rte_eth_dev_attach(vdev_args, &portid) < 0) + if (rte_eth_dev_attach(vdev_args, &portid) < 0) { + cleanup_rings(); rte_exit(EXIT_FAILURE, "vdev creation failed:%s:%d\n", __func__, __LINE__); + } pt->rx_vdev_id = portid; /* configure vdev */ configure_vdev(pt->rx_vdev_id); @@ -717,18 +743,22 @@ create_mp_ring_vdev(void) snprintf(ring_name, SIZE, TX_RING, i); pt->tx_ring = rte_ring_create(ring_name, pt->ring_size, rte_socket_id(), 0); - if (pt->tx_ring == NULL) + if (pt->tx_ring == NULL) { + cleanup_rings(); rte_exit(EXIT_FAILURE, "%s\n", rte_strerror(rte_errno)); + } (pt->tx_vdev_stream_type == IFACE) ? snprintf(vdev_args, SIZE, VDEV_IFACE, TX_STR, i, pt->tx_dev) : snprintf(vdev_args, SIZE, VDEV_PCAP, TX_STR, i, pt->tx_dev); - if (rte_eth_dev_attach(vdev_args, &portid) < 0) + if (rte_eth_dev_attach(vdev_args, &portid) < 0) { + cleanup_rings(); rte_exit(EXIT_FAILURE, "vdev creation failed\n"); + } pt->tx_vdev_id = portid; /* configure vdev */