X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=examples%2Flink_status_interrupt%2Fmain.c;h=a0bc1e56d0ecb1d1562357d8c98485aa6b8170fa;hb=953e74e6b73a876d6f149fd759bd0423e5438247;hp=d1ce6abed5a20f8a4ea0b343007926cc4b920ce8;hpb=ce6b8c31548b4d71a986d9807cd06cf3a616d1ab;p=dpdk.git diff --git a/examples/link_status_interrupt/main.c b/examples/link_status_interrupt/main.c index d1ce6abed5..a0bc1e56d0 100644 --- a/examples/link_status_interrupt/main.c +++ b/examples/link_status_interrupt/main.c @@ -9,7 +9,6 @@ #include #include #include -#include #include #include #include @@ -67,15 +66,18 @@ static unsigned lsi_dst_ports[RTE_MAX_ETHPORTS] = {0}; #define MAX_RX_QUEUE_PER_LCORE 16 #define MAX_TX_QUEUE_PER_PORT 16 +/* List of queues must be polled for a give lcore. 8< */ struct lcore_queue_conf { unsigned n_rx_port; unsigned rx_port_list[MAX_RX_QUEUE_PER_LCORE]; unsigned tx_queue_id; } __rte_cache_aligned; struct lcore_queue_conf lcore_queue_conf[RTE_MAX_LCORE]; +/* >8 End of list of queues to be polled. */ struct rte_eth_dev_tx_buffer *tx_buffer[RTE_MAX_ETHPORTS]; +/* Global configuration stored in a static structure. 8< */ static struct rte_eth_conf port_conf = { .rxmode = { .split_hdr_size = 0, @@ -87,6 +89,7 @@ static struct rte_eth_conf port_conf = { .lsc = 1, /**< lsc interrupt feature enabled */ }, }; +/* >8 End of global configuration stored in a static structure. */ struct rte_mempool * lsi_pktmbuf_pool = NULL; @@ -133,7 +136,7 @@ print_stats(void) link_get_err = rte_eth_link_get_nowait(portid, &link); printf("\nStatistics for port %u ------------------------------" "\nLink status: %25s" - "\nLink speed: %26u" + "\nLink speed: %26s" "\nLink duplex: %25s" "\nPackets sent: %24"PRIu64 "\nPackets received: %20"PRIu64 @@ -141,8 +144,8 @@ print_stats(void) portid, link_get_err < 0 ? "Link get failed" : (link.link_status ? "Link up" : "Link down"), - link_get_err < 0 ? 0 : - (unsigned int)link.link_speed, + link_get_err < 0 ? "0" : + rte_eth_link_speed_to_str(link.link_speed), link_get_err < 0 ? "Link get failed" : (link.link_duplex == ETH_LINK_FULL_DUPLEX ? \ "full-duplex" : "half-duplex"), @@ -166,6 +169,7 @@ print_stats(void) fflush(stdout); } +/* Replacing the source and destination MAC addresses. 8< */ static void lsi_simple_forward(struct rte_mbuf *m, unsigned portid) { @@ -189,6 +193,7 @@ lsi_simple_forward(struct rte_mbuf *m, unsigned portid) if (sent) port_statistics[dst_port].tx += sent; } +/* >8 End of replacing the source and destination MAC addresses. */ /* main processing loop */ static void @@ -227,6 +232,7 @@ lsi_main_loop(void) while (1) { + /* Draining TX queue in its main loop. 8< */ cur_tsc = rte_rdtsc(); /* @@ -255,8 +261,8 @@ lsi_main_loop(void) /* if timer has reached its timeout */ if (unlikely(timer_tsc >= (uint64_t) timer_period)) { - /* do this only on master core */ - if (lcore_id == rte_get_master_lcore()) { + /* do this only on main core */ + if (lcore_id == rte_get_main_lcore()) { print_stats(); /* reset the timer */ timer_tsc = 0; @@ -266,10 +272,9 @@ lsi_main_loop(void) prev_tsc = cur_tsc; } + /* >8 End of draining TX queue in its main loop. */ - /* - * Read packet from RX queues - */ + /* Read packet from RX queues. 8< */ for (i = 0; i < qconf->n_rx_port; i++) { portid = qconf->rx_port_list[i]; @@ -284,6 +289,7 @@ lsi_main_loop(void) lsi_simple_forward(m, portid); } } + /* >8 End of reading packet from RX queues. */ } } @@ -436,12 +442,15 @@ lsi_parse_args(int argc, char **argv) * @return * int. */ + +/* lsi_event_callback 8< */ static int lsi_event_callback(uint16_t port_id, enum rte_eth_event_type type, void *param, void *ret_param) { struct rte_eth_link link; int ret; + char link_status_text[RTE_ETH_LINK_MAX_STR_LEN]; RTE_SET_USED(param); RTE_SET_USED(ret_param); @@ -454,16 +463,12 @@ lsi_event_callback(uint16_t port_id, enum rte_eth_event_type type, void *param, port_id, rte_strerror(-ret)); return ret; } - if (link.link_status) { - printf("Port %d Link Up - speed %u Mbps - %s\n\n", - port_id, (unsigned)link.link_speed, - (link.link_duplex == ETH_LINK_FULL_DUPLEX) ? - ("full-duplex") : ("half-duplex")); - } else - printf("Port %d Link Down\n\n", port_id); + rte_eth_link_to_str(link_status_text, sizeof(link_status_text), &link); + printf("Port %d %s\n\n", port_id, link_status_text); return 0; } +/* >8 End of registering one or more callbacks. */ /* Check the link status of all ports in up to 9s, and print them finally */ static void @@ -475,6 +480,7 @@ check_all_ports_link_status(uint16_t port_num, uint32_t port_mask) uint16_t portid; struct rte_eth_link link; int ret; + char link_status_text[RTE_ETH_LINK_MAX_STR_LEN]; printf("\nChecking link status"); fflush(stdout); @@ -494,14 +500,10 @@ check_all_ports_link_status(uint16_t port_num, uint32_t port_mask) } /* print link status if flag set */ if (print_flag == 1) { - if (link.link_status) - printf( - "Port%d Link Up. Speed %u Mbps - %s\n", - portid, link.link_speed, - (link.link_duplex == ETH_LINK_FULL_DUPLEX) ? - ("full-duplex") : ("half-duplex")); - else - printf("Port %d Link Down\n", portid); + rte_eth_link_to_str(link_status_text, + sizeof(link_status_text), &link); + printf("Port %d %s", portid, + link_status_text); continue; } /* clear all_ports_up flag if any link down */ @@ -561,9 +563,7 @@ main(int argc, char **argv) if (nb_ports == 0) rte_panic("No Ethernet port - bye\n"); - /* - * Each logical core is assigned a dedicated TX queue on each port. - */ + /* Each logical core is assigned a dedicated TX queue on each port. 8< */ for (portid = 0; portid < nb_ports; portid++) { /* skip ports that are not enabled */ if ((lsi_enabled_port_mask & (1 << portid)) == 0) @@ -579,6 +579,7 @@ main(int argc, char **argv) nb_ports_in_mask++; } + /* >8 End of assigning logical core. */ if (nb_ports_in_mask < 2 || nb_ports_in_mask % 2) rte_exit(EXIT_FAILURE, "Current enabled port number is %u, " "but it should be even and at least 2\n", @@ -636,10 +637,12 @@ main(int argc, char **argv) if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE) local_port_conf.txmode.offloads |= DEV_TX_OFFLOAD_MBUF_FAST_FREE; + /* Configure RX and TX queues. 8< */ ret = rte_eth_dev_configure(portid, 1, 1, &local_port_conf); if (ret < 0) rte_exit(EXIT_FAILURE, "Cannot configure device: err=%d, port=%u\n", ret, (unsigned) portid); + /* >8 End of configure RX and TX queues. */ ret = rte_eth_dev_adjust_nb_rx_tx_desc(portid, &nb_rxd, &nb_txd); @@ -653,8 +656,11 @@ main(int argc, char **argv) * lsc interrupt will be present, and below callback to * be registered will never be called. */ + + /* RTE callback register. 8< */ rte_eth_dev_callback_register(portid, RTE_ETH_EVENT_INTR_LSC, lsi_event_callback, NULL); + /* >8 End of registering lsi interrupt callback. */ ret = rte_eth_macaddr_get(portid, &lsi_ports_eth_addr[portid]); @@ -667,6 +673,7 @@ main(int argc, char **argv) fflush(stdout); rxq_conf = dev_info.default_rxconf; rxq_conf.offloads = local_port_conf.rxmode.offloads; + /* RX queue initialization. 8< */ ret = rte_eth_rx_queue_setup(portid, 0, nb_rxd, rte_eth_dev_socket_id(portid), &rxq_conf, @@ -674,8 +681,9 @@ main(int argc, char **argv) if (ret < 0) rte_exit(EXIT_FAILURE, "rte_eth_rx_queue_setup: err=%d, port=%u\n", ret, (unsigned) portid); + /* >8 End of RX queue initialization. */ - /* init one TX queue logical core on each port */ + /* init one TX queue logical core on each port. 8< */ fflush(stdout); txq_conf = dev_info.default_txconf; txq_conf.offloads = local_port_conf.txmode.offloads; @@ -685,6 +693,7 @@ main(int argc, char **argv) if (ret < 0) rte_exit(EXIT_FAILURE, "rte_eth_tx_queue_setup: err=%d,port=%u\n", ret, (unsigned) portid); + /* >8 End of init one TX queue. */ /* Initialize TX buffers */ tx_buffer[portid] = rte_zmalloc_socket("tx_buffer", @@ -716,14 +725,9 @@ main(int argc, char **argv) "rte_eth_promiscuous_enable: err=%s, port=%u\n", rte_strerror(-ret), portid); - printf("Port %u, MAC address: %02X:%02X:%02X:%02X:%02X:%02X\n\n", + printf("Port %u, MAC address: " RTE_ETHER_ADDR_PRT_FMT "\n\n", (unsigned) portid, - lsi_ports_eth_addr[portid].addr_bytes[0], - lsi_ports_eth_addr[portid].addr_bytes[1], - lsi_ports_eth_addr[portid].addr_bytes[2], - lsi_ports_eth_addr[portid].addr_bytes[3], - lsi_ports_eth_addr[portid].addr_bytes[4], - lsi_ports_eth_addr[portid].addr_bytes[5]); + RTE_ETHER_ADDR_BYTES(&lsi_ports_eth_addr[portid])); /* initialize port stats */ memset(&port_statistics, 0, sizeof(port_statistics)); @@ -732,11 +736,14 @@ main(int argc, char **argv) check_all_ports_link_status(nb_ports, lsi_enabled_port_mask); /* launch per-lcore init on every lcore */ - rte_eal_mp_remote_launch(lsi_launch_one_lcore, NULL, CALL_MASTER); - RTE_LCORE_FOREACH_SLAVE(lcore_id) { + rte_eal_mp_remote_launch(lsi_launch_one_lcore, NULL, CALL_MAIN); + RTE_LCORE_FOREACH_WORKER(lcore_id) { if (rte_eal_wait_lcore(lcore_id) < 0) return -1; } + /* clean up the EAL */ + rte_eal_cleanup(); + return 0; }