X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=examples%2Fipv4_frag%2Fmain.c;h=dec6c2486ca3ef0a85d1ab3a613d9fd50459496c;hb=b6df9fc8715f9a925136006b18fdd65f9c621757;hp=a790d936b475d810192fb06d8c65736011887da0;hpb=041cdbf947fa7eb732e67b1c691c2572c7513461;p=dpdk.git diff --git a/examples/ipv4_frag/main.c b/examples/ipv4_frag/main.c index a790d936b4..dec6c2486c 100644 --- a/examples/ipv4_frag/main.c +++ b/examples/ipv4_frag/main.c @@ -1,7 +1,7 @@ /*- * BSD LICENSE * - * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * Copyright(c) 2010-2013 Intel Corporation. All rights reserved. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -312,7 +312,7 @@ static __attribute__((noreturn)) int main_loop(__attribute__((unused)) void *dummy) { struct rte_mbuf *pkts_burst[MAX_PKT_BURST]; - uint32_t lcore_id; + unsigned lcore_id; uint64_t prev_tsc = 0; uint64_t diff_tsc, cur_tsc; int i, j, nb_rx; @@ -512,11 +512,65 @@ print_ethaddr(const char *name, struct ether_addr *eth_addr) eth_addr->addr_bytes[5]); } +/* Check the link status of all ports in up to 9s, and print them finally */ +static void +check_all_ports_link_status(uint8_t port_num, uint32_t port_mask) +{ +#define CHECK_INTERVAL 100 /* 100ms */ +#define MAX_CHECK_TIME 90 /* 9s (90 * 100ms) in total */ + uint8_t portid, count, all_ports_up, print_flag = 0; + struct rte_eth_link link; + + printf("\nChecking link status"); + fflush(stdout); + for (count = 0; count <= MAX_CHECK_TIME; count++) { + all_ports_up = 1; + for (portid = 0; portid < port_num; portid++) { + if ((port_mask & (1 << portid)) == 0) + continue; + memset(&link, 0, sizeof(link)); + rte_eth_link_get_nowait(portid, &link); + /* print link status if flag set */ + if (print_flag == 1) { + if (link.link_status) + printf("Port %d Link Up - speed %u " + "Mbps - %s\n", (uint8_t)portid, + (unsigned)link.link_speed, + (link.link_duplex == ETH_LINK_FULL_DUPLEX) ? + ("full-duplex") : ("half-duplex\n")); + else + printf("Port %d Link Down\n", + (uint8_t)portid); + continue; + } + /* clear all_ports_up flag if any link down */ + if (link.link_status == 0) { + all_ports_up = 0; + break; + } + } + /* after finally printing all link status, get out */ + if (print_flag == 1) + break; + + if (all_ports_up == 0) { + printf("."); + fflush(stdout); + rte_delay_ms(CHECK_INTERVAL); + } + + /* set the print_flag if all ports up or timeout */ + if (all_ports_up == 1 || count == (MAX_CHECK_TIME - 1)) { + print_flag = 1; + printf("done\n"); + } + } +} + int MAIN(int argc, char **argv) { struct lcore_queue_conf *qconf; - struct rte_eth_link link; int ret; unsigned nb_ports, i; uint16_t queueid = 0; @@ -585,10 +639,10 @@ MAIN(int argc, char **argv) qconf->n_rx_queue == (unsigned)rx_queue_per_lcore) { rx_lcore_id ++; - qconf = &lcore_queue_conf[rx_lcore_id]; - if (rx_lcore_id >= RTE_MAX_LCORE) rte_exit(EXIT_FAILURE, "Not enough cores\n"); + + qconf = &lcore_queue_conf[rx_lcore_id]; } qconf->rx_queue_list[qconf->n_rx_queue] = portid; qconf->n_rx_queue++; @@ -651,21 +705,12 @@ MAIN(int argc, char **argv) printf("done: "); - /* get link status */ - rte_eth_link_get(portid, &link); - if (link.link_status) { - printf(" Link Up - speed %u Mbps - %s\n", - (uint32_t) link.link_speed, - (link.link_duplex == ETH_LINK_FULL_DUPLEX) ? - ("full-duplex") : ("half-duplex\n")); - } else { - printf(" Link Down\n"); - } - /* Set port in promiscuous mode */ rte_eth_promiscuous_enable(portid); } + check_all_ports_link_status((uint8_t)nb_ports, enabled_port_mask); + /* create the LPM table */ l3fwd_lpm = rte_lpm_create("L3FWD_LPM", SOCKET0, L3FWD_LPM_MAX_RULES, 0); if (l3fwd_lpm == NULL) @@ -684,7 +729,7 @@ MAIN(int argc, char **argv) } printf("Adding route 0x%08x / %d (%d)\n", - l3fwd_route_array[i].ip, + (unsigned) l3fwd_route_array[i].ip, l3fwd_route_array[i].depth, l3fwd_route_array[i].if_out); }