From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by dpdk.org (Postfix) with ESMTP id 32F3F1BAA7 for ; Fri, 22 Jun 2018 16:32:03 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 22 Jun 2018 07:32:00 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,257,1526367600"; d="scan'208";a="66815857" Received: from silpixa00397517.ir.intel.com (HELO silpixa00397517.ger.corp.intel.com) ([10.237.222.54]) by orsmga001.jf.intel.com with ESMTP; 22 Jun 2018 07:31:59 -0700 From: Kevin Laatz To: dev@dpdk.org Cc: jasvinder.singh@intel.com, cristian.dumitrescu@intel.com, Kevin Laatz Date: Fri, 22 Jun 2018 15:31:47 +0100 Message-Id: <20180622143147.5716-1-kevin.laatz@intel.com> X-Mailer: git-send-email 2.9.5 In-Reply-To: <20180608163053.37891-1-kevin.laatz@intel.com> References: <20180608163053.37891-1-kevin.laatz@intel.com> Subject: [dpdk-dev] [PATCH v2] examples/ip_pipeline: add link show to the cli 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: , X-List-Received-Date: Fri, 22 Jun 2018 14:32:03 -0000 Add the functionality to track links in the application. This enables the user to print the name, mac address and statistics for each link in the application. Signed-off-by: Kevin Laatz Acked-by: Cristian Dumitrescu --- v2: - Implemeted API to iterate through the linked list - Printing tidy up - Removed unnecessary checks --- examples/ip_pipeline/cli.c | 91 +++++++++++++++++++++++++++++++++++++++++++++ examples/ip_pipeline/link.c | 6 +++ examples/ip_pipeline/link.h | 3 ++ 3 files changed, 100 insertions(+) diff --git a/examples/ip_pipeline/cli.c b/examples/ip_pipeline/cli.c index c9587f5..27c9844 100644 --- a/examples/ip_pipeline/cli.c +++ b/examples/ip_pipeline/cli.c @@ -9,6 +9,7 @@ #include #include +#include #include "cli.h" #include "kni.h" @@ -237,6 +238,91 @@ cmd_link(char **tokens, } } +/* Print the link stats and info */ +static void +print_link_info(struct link *link, char *out, size_t out_size) +{ + struct rte_eth_stats stats; + struct ether_addr mac_addr; + struct rte_eth_link eth_link; + uint16_t mtu; + + memset(&stats, 0, sizeof(stats)); + rte_eth_stats_get(link->port_id, &stats); + + rte_eth_macaddr_get(link->port_id, &mac_addr); + rte_eth_link_get(link->port_id, ð_link); + rte_eth_dev_get_mtu(link->port_id, &mtu); + + snprintf(out, out_size, + "\n" + "%s: flags=<%s> mtu %u\n" + "\tether %02X:%02X:%02X:%02X:%02X:%02X rxqueues %u txqueues %u\n" + "\tport# %u speed %u Mbps\n" + "\tRX packets %" PRIu64" bytes %" PRIu64"\n" + "\tRX errors %" PRIu64" missed %" PRIu64" no-mbuf %" PRIu64"\n" + "\tTX packets %" PRIu64" bytes %" PRIu64"\n" + "\tTX errors %" PRIu64"\n", + link->name, + eth_link.link_status == 0 ? "DOWN" : "UP", + mtu, + 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], + link->n_rxq, + link->n_txq, + link->port_id, + eth_link.link_speed, + stats.ipackets, + stats.ibytes, + stats.ierrors, + stats.imissed, + stats.rx_nombuf, + stats.opackets, + stats.obytes, + stats.oerrors); +} + +/* + * link show [] + */ +static void +cmd_link_show(char **tokens, uint32_t n_tokens, char *out, size_t out_size) +{ + struct link *link; + char *link_name; + + if (n_tokens != 2 && n_tokens != 3) { + snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]); + return; + } + + if (n_tokens == 2) { + link = link_next(NULL); + + while (link != NULL) { + out_size = out_size - strlen(out); + out = &out[strlen(out)]; + + print_link_info(link, out, out_size); + link = link_next(link); + } + } else { + out_size = out_size - strlen(out); + out = &out[strlen(out)]; + + link_name = tokens[2]; + link = link_find(link_name); + + if (link == NULL) { + snprintf(out, out_size, MSG_ARG_INVALID, + "Link does not exist"); + return; + } + print_link_info(link, out, out_size); + } +} + /** * swq * size @@ -4380,6 +4466,11 @@ cli_process(char *in, char *out, size_t out_size) } if (strcmp(tokens[0], "link") == 0) { + if (strcmp(tokens[1], "show") == 0) { + cmd_link_show(tokens, n_tokens, out, out_size); + return; + } + cmd_link(tokens, n_tokens, out, out_size); return; } diff --git a/examples/ip_pipeline/link.c b/examples/ip_pipeline/link.c index b8a431f..28a46d2 100644 --- a/examples/ip_pipeline/link.c +++ b/examples/ip_pipeline/link.c @@ -36,6 +36,12 @@ link_find(const char *name) return NULL; } +struct link * +link_next(struct link *link) +{ + return (link == NULL) ? TAILQ_FIRST(&link_list) : TAILQ_NEXT(link, node); +} + static struct rte_eth_conf port_conf_default = { .link_speeds = 0, .rxmode = { diff --git a/examples/ip_pipeline/link.h b/examples/ip_pipeline/link.h index 37d3dc4..34ff114 100644 --- a/examples/ip_pipeline/link.h +++ b/examples/ip_pipeline/link.h @@ -30,6 +30,9 @@ link_init(void); struct link * link_find(const char *name); +struct link * +link_next(struct link *link); + struct link_params_rss { uint32_t queue_id[LINK_RXQ_RSS_MAX]; uint32_t n_queues; -- 2.9.5