From patchwork Wed Sep 19 19:55:47 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dan Gora X-Patchwork-Id: 44977 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 3ED7F1B136; Wed, 19 Sep 2018 21:56:27 +0200 (CEST) Received: from mail-qt0-f194.google.com (mail-qt0-f194.google.com [209.85.216.194]) by dpdk.org (Postfix) with ESMTP id 222841B133 for ; Wed, 19 Sep 2018 21:56:26 +0200 (CEST) Received: by mail-qt0-f194.google.com with SMTP id l42-v6so6286236qtf.13 for ; Wed, 19 Sep 2018 12:56:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Q8m/h6wgMrJg98G+yF7Q37xFrUbI8QZydatcW7/BTNs=; b=rk/rm33JlZTp/fwvmM7hXJ3p+wgyjq95Y/guLZv8nty7533tAuH03RISdyeRTMo8Zp 6ZbeNjL95fRyAIaemdwJsV0Bk6/bH+l1tpVbLE/M7pQTm/hkrXamKO2KrcRuKOcFh2C1 ItZMR4S/61GNQzyd0XX6zAGOe/FlFk0qzBmnZuZ2lnYoks5tLuRnQ/tMd+qOHVHOlyBa ciKFEj2ZUXB2VO8swFQ3HLyNZ5dpbWLzmoMx2yeaeeD20b5TiHaC+SxdioNPEZpPpP88 SQJjhZcCNRDtiYKz8esfp9/HncC7XJ0hHgrZvSncxfwq1iy8j0Zjg5vBMqLB5ubSncn3 BXgQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=Q8m/h6wgMrJg98G+yF7Q37xFrUbI8QZydatcW7/BTNs=; b=p1bujB6lwsAHzIkWer3H5BQUmA+sVWpsr3J4pK/fDCCLXEeF0dfkjG7uFL+f8FRAZ4 f92XnTlpToqbkfiPMu7HLMJTaLeEo7jJg+FyiwcfhBmwmKBqweSMohsDruDCpUaseJOE yVxB2A5luHQSWhfIEVxlf44EkOAKT3ErxEqh1AxBISu8uBbiXnl8I+VLKeMToxCEBdBl m9VQ5rwPGCDjBQtH4hhVkM1VTWkWZzETIzWUC/mhis9QMrxvdnsmMpOlemWQ4+FaiSYz OtSXzpA4fqSIKCb1Xm+gOROqXbm4Ue6hPARy81IBLnp6PC558fcwyKqgqQ5xMlXQ9ofW 0rlw== X-Gm-Message-State: APzg51A2eTyAI+kDJ+szVCp1tkA3AjvdLxfYqlFLJ3/vVAVR0QS0Vs0v 8jKPltqrhhQ9Oeik9KydzyZM78lm X-Google-Smtp-Source: ANB0Vdb0oZ96UV5eFJuWuATJ/Kb1cMSG6b2P/C1b7I1KOywp66WdAJEZhpmfWvnC73FxBU6bINepoQ== X-Received: by 2002:ac8:29ef:: with SMTP id 44-v6mr24961810qtt.174.1537386985156; Wed, 19 Sep 2018 12:56:25 -0700 (PDT) Received: from snappy.local.lan ([187.10.145.241]) by smtp.gmail.com with ESMTPSA id g184-v6sm12431369qkb.15.2018.09.19.12.56.22 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 19 Sep 2018 12:56:24 -0700 (PDT) From: Dan Gora To: dev@dpdk.org Cc: Igor Ryzhov , Stephen Hemminger , Dan Gora , Ferruh Yigit Date: Wed, 19 Sep 2018 16:55:47 -0300 Message-Id: <20180919195549.5585-4-dg@adax.com> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180919195549.5585-1-dg@adax.com> References: <20180911232906.18352-1-dg@adax.com> <20180919195549.5585-1-dg@adax.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v2 3/5] examples/kni: monitor and update link status continually X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Update KNI example to continuously monitor the Ethernet link status of the physical link and update the carrier status of the corresponding interfaces with rte_kni_update_link(). Signed-off-by: Dan Gora --- examples/kni/Makefile | 2 ++ examples/kni/main.c | 82 +++++++++++++++++++++---------------------- 2 files changed, 43 insertions(+), 41 deletions(-) diff --git a/examples/kni/Makefile b/examples/kni/Makefile index 7e19d2e2a..dd90d7d73 100644 --- a/examples/kni/Makefile +++ b/examples/kni/Makefile @@ -20,6 +20,7 @@ static: build/$(APP)-static PC_FILE := $(shell pkg-config --path libdpdk) CFLAGS += -O3 $(shell pkg-config --cflags libdpdk) +CFLAGS += -DALLOW_EXPERIMENTAL_API LDFLAGS_SHARED = $(shell pkg-config --libs libdpdk) LDFLAGS_STATIC = -Wl,-Bstatic $(shell pkg-config --static --libs libdpdk) @@ -54,6 +55,7 @@ please change the definition of the RTE_TARGET environment variable) endif CFLAGS += -O3 +CFLAGS += -DALLOW_EXPERIMENTAL_API CFLAGS += $(WERROR_FLAGS) include $(RTE_SDK)/mk/rte.extapp.mk diff --git a/examples/kni/main.c b/examples/kni/main.c index 80c401c51..8c3d3839e 100644 --- a/examples/kni/main.c +++ b/examples/kni/main.c @@ -107,6 +107,8 @@ static uint32_t ports_mask = 0; /* Ports set in promiscuous mode off by default. */ static int promiscuous_on = 0; +static int kni_running; + /* Structure type for recording kni interface specific stats */ struct kni_interface_stats { /* number of pkts received from NIC, and sent to KNI */ @@ -620,58 +622,45 @@ init_port(uint16_t port) } /* Check the link status of all ports in up to 9s, and print them finally */ -static void -check_all_ports_link_status(uint32_t port_mask) +static void * +check_all_ports_link_status(void *arg) { #define CHECK_INTERVAL 100 /* 100ms */ #define MAX_CHECK_TIME 90 /* 9s (90 * 100ms) in total */ uint16_t portid; - uint8_t count, all_ports_up, print_flag = 0; struct rte_eth_link link; + const char *name; + char cmd[64]; + unsigned int i; + struct kni_port_params **p = kni_port_params_array; + (void) arg; + + RTE_ETH_FOREACH_DEV(portid) { + for (i = 0; i < p[portid]->nb_kni; i++) { + name = rte_kni_get_name(p[portid]->kni[i]); + snprintf(cmd, sizeof(cmd), + "/sbin/ifconfig %s up", name); + RTE_LOG(INFO, APP, + "Marking interface %s 'up'\n", name); + if (system(cmd) == -1) + RTE_LOG(ERR, APP, + "Error: Failed to mark interface %s 'up'\n", + name); + } + } - printf("\nChecking link status\n"); - fflush(stdout); - for (count = 0; count <= MAX_CHECK_TIME; count++) { - all_ports_up = 1; + while (kni_running) { + rte_delay_ms(CHECK_INTERVAL); RTE_ETH_FOREACH_DEV(portid) { - if ((port_mask & (1 << portid)) == 0) + if ((ports_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 %uMbps - %s\n", - portid, link.link_speed, - (link.link_duplex == ETH_LINK_FULL_DUPLEX) ? - ("full-duplex") : ("half-duplex\n")); - else - printf("Port %d Link Down\n", portid); - continue; - } - /* clear all_ports_up flag if any link down */ - if (link.link_status == ETH_LINK_DOWN) { - 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"); + for (i = 0; i < p[portid]->nb_kni; i++) + rte_kni_update_link(p[portid]->kni[i], &link); } } + return NULL; } /* Callback for request of changing MTU */ @@ -893,6 +882,8 @@ main(int argc, char** argv) int ret; uint16_t nb_sys_ports, port; unsigned i; + void *retval; + pthread_t kni_link_tid; /* Associate signal_hanlder function with USR signals */ signal(SIGUSR1, signal_handler); @@ -947,7 +938,14 @@ main(int argc, char** argv) kni_alloc(port); } - check_all_ports_link_status(ports_mask); + + kni_running = 1; + ret = rte_ctrl_thread_create(&kni_link_tid, + "KNI link status check", NULL, + check_all_ports_link_status, NULL); + if (ret < 0) + rte_exit(EXIT_FAILURE, + "Could not create link status thread!\n"); /* Launch per-lcore function on every lcore */ rte_eal_mp_remote_launch(main_loop, NULL, CALL_MASTER); @@ -955,6 +953,8 @@ main(int argc, char** argv) if (rte_eal_wait_lcore(i) < 0) return -1; } + kni_running = 0; + pthread_join(kni_link_tid, &retval); /* Release resources */ RTE_ETH_FOREACH_DEV(port) {