From patchwork Mon Mar 7 10:10:32 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nikolay Aleksandrov X-Patchwork-Id: 592874 X-Patchwork-Delegate: shemminger@vyatta.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 469AD1401AF for ; Mon, 7 Mar 2016 21:11:17 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=cumulusnetworks.com header.i=@cumulusnetworks.com header.b=UjxEaNGZ; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752670AbcCGKLK (ORCPT ); Mon, 7 Mar 2016 05:11:10 -0500 Received: from mail-wm0-f41.google.com ([74.125.82.41]:34282 "EHLO mail-wm0-f41.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752736AbcCGKKg (ORCPT ); Mon, 7 Mar 2016 05:10:36 -0500 Received: by mail-wm0-f41.google.com with SMTP id p65so101212940wmp.1 for ; Mon, 07 Mar 2016 02:10:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cumulusnetworks.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=7nU5FQCTCEIDVu/9XWmCNeXNg2hyhXVVloy35YYsd08=; b=UjxEaNGZOJo/zUPITq6oS4kBvLO0FTdRTdMf1RXdRhJSQf+Qt3T4CZ56yEJLPtlibp SU0jB527YOebD13irIg1peTGVueTF1Q7KbJ551KHJl+2rJBUN+V/1l4brhqueSRMhjev 5CzUPYRp4mUDCrgoP3N6nv+BGL4csgFq3QnIU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=7nU5FQCTCEIDVu/9XWmCNeXNg2hyhXVVloy35YYsd08=; b=aPUGz+e43YtC+BamXu/FrS80BbkeriQWg74rxkFv0gcNQvLNLfiFDrE3I468LeDbXc qWDkVaHQiSRvLiuCBiFzCbOzl6IjgfHqAfGIthsh0FT7l145QtfYqKKl2c+r8rWuA8q5 2imULaVH2W53ZIXKLiFYaILmDtZApDEI/p5j74EGyr4ujRAYt7rJgcTkAuAH/UMox+Bs 6fo55O2UFTrw1cNTJ7WbIsxUj7+xQqXVhsu42fKnl0si+0anoySG9K2O0KQ27e/mEuOj e2/kV9Ao2go71oj2oy01LYVu4Q0cTKnaCCAqoUg0AjMguNB1PRaoz8BqgG1mMBR49gvn LI3w== X-Gm-Message-State: AD7BkJIbNPTwiYwBNA0gjPY5SNS8utyo6XNYv/BF0WnJplUfvO2ZI6nYFDrGcWsiP9IcEVj0 X-Received: by 10.28.132.212 with SMTP id g203mr12180377wmd.30.1457345435029; Mon, 07 Mar 2016 02:10:35 -0800 (PST) Received: from debil.lan (ip4-62-4-104-109.cust.nbox.cz. [62.4.104.109]) by smtp.gmail.com with ESMTPSA id u202sm12902993wmd.24.2016.03.07.02.10.33 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 07 Mar 2016 02:10:34 -0800 (PST) From: Nikolay Aleksandrov To: netdev@vger.kernel.org Cc: stephen@networkplumber.org, roopa@cumulusnetworks.com, Nikolay Aleksandrov Subject: [PATCH iproute2 net-next v4] bridge: mdb: add support for extended router port information Date: Mon, 7 Mar 2016 11:10:32 +0100 Message-Id: <1457345432-19360-1-git-send-email-nikolay@cumulusnetworks.com> X-Mailer: git-send-email 2.4.3 In-Reply-To: <1457343179-30053-1-git-send-email-nikolay@cumulusnetworks.com> References: <1457343179-30053-1-git-send-email-nikolay@cumulusnetworks.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Recently a new temp router port mode was added and with it the dumped information was extended similar to how mdb entries were done. This patch adds support to dump the new information by using the "-s" switch. Example: $ bridge -d -s mdb show dev br0 port eth1 grp ff02::1:ffbf:5716 temp 234.39 dev br0 port eth1 grp 239.0.0.2 temp 97.17 dev br0 port eth1 grp 239.0.0.3 temp 105.36 router ports on br0: eth1 0.00 permanent router ports on br0: eth2 254.87 temp It also updates the bridge man page. Signed-off-by: Nikolay Aleksandrov --- v4: minor optimization, parse new attributes only when show_stats has been specified v3: make is_temp_mcast_rtr bool and return the result directly as per Stephen's comment v2: print the values only if they were provided by the kernel, otherwise we might print "permanent" for a temporary entry on an older kernel. bridge/br_common.h | 3 +++ bridge/mdb.c | 57 +++++++++++++++++++++++++++++++++++++++++++++--------- man/man8/bridge.8 | 6 +++++- 3 files changed, 56 insertions(+), 10 deletions(-) diff --git a/bridge/br_common.h b/bridge/br_common.h index 41eb0dc38293..5ea45c9e654d 100644 --- a/bridge/br_common.h +++ b/bridge/br_common.h @@ -1,6 +1,9 @@ #define MDB_RTA(r) \ ((struct rtattr *)(((char *)(r)) + RTA_ALIGN(sizeof(struct br_mdb_entry)))) +#define MDB_RTR_RTA(r) \ + ((struct rtattr *)(((char *)(r)) + RTA_ALIGN(sizeof(__u32)))) + extern int print_linkinfo(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg); diff --git a/bridge/mdb.c b/bridge/mdb.c index 600596c94969..c15f4b8944ef 100644 --- a/bridge/mdb.c +++ b/bridge/mdb.c @@ -33,19 +33,60 @@ static void usage(void) exit(-1); } -static void br_print_router_ports(FILE *f, struct rtattr *attr) +static bool is_temp_mcast_rtr(__u8 type) +{ + return type == MDB_RTR_TYPE_TEMP_QUERY || type == MDB_RTR_TYPE_TEMP; +} + +static void br_print_router_ports(FILE *f, struct rtattr *attr, __u32 brifidx) { uint32_t *port_ifindex; struct rtattr *i; int rem; + if (!show_stats) + fprintf(f, "router ports on %s: ", ll_index_to_name(brifidx)); + rem = RTA_PAYLOAD(attr); for (i = RTA_DATA(attr); RTA_OK(i, rem); i = RTA_NEXT(i, rem)) { port_ifindex = RTA_DATA(i); - fprintf(f, "%s ", ll_index_to_name(*port_ifindex)); + if (show_stats) { + struct rtattr *tb[MDBA_ROUTER_PATTR_MAX + 1]; + + parse_rtattr(tb, MDBA_ROUTER_PATTR_MAX, + MDB_RTR_RTA(RTA_DATA(i)), + RTA_PAYLOAD(i) - + RTA_ALIGN(sizeof(*port_ifindex))); + + fprintf(f, "router ports on %s: %s", + ll_index_to_name(brifidx), + ll_index_to_name(*port_ifindex)); + if (tb[MDBA_ROUTER_PATTR_TIMER]) { + struct timeval tv; + __u32 tval; + + tval = rta_getattr_u32( + tb[MDBA_ROUTER_PATTR_TIMER]); + __jiffies_to_tv(&tv, tval); + fprintf(f, " %4i.%.2i", + (int)tv.tv_sec, (int)tv.tv_usec/10000); + } + if (tb[MDBA_ROUTER_PATTR_TYPE]) { + __u8 type; + + type = rta_getattr_u8( + tb[MDBA_ROUTER_PATTR_TYPE]); + fprintf(f, " %s", + is_temp_mcast_rtr(type) ? "temp" : + "permanent"); + } + fprintf(f, "\n"); + } else { + fprintf(f, "%s ", ll_index_to_name(*port_ifindex)); + } } - - fprintf(f, "\n"); + if (!show_stats) + fprintf(f, "\n"); } static void print_mdb_entry(FILE *f, int ifindex, struct br_mdb_entry *e, @@ -127,11 +168,9 @@ int print_mdb(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) if (tb[MDBA_ROUTER]) { if (n->nlmsg_type == RTM_GETMDB) { - if (show_details) { - fprintf(fp, "router ports on %s: ", - ll_index_to_name(r->ifindex)); - br_print_router_ports(fp, tb[MDBA_ROUTER]); - } + if (show_details) + br_print_router_ports(fp, tb[MDBA_ROUTER], + r->ifindex); } else { uint32_t *port_ifindex; diff --git a/man/man8/bridge.8 b/man/man8/bridge.8 index 0e98edf4762f..08e8a5bf5a08 100644 --- a/man/man8/bridge.8 +++ b/man/man8/bridge.8 @@ -119,6 +119,10 @@ is given multiple times, the amount of information increases. As a rule, the information is statistics or some time values. .TP +.BR "\-d" , " \-details" +print detailed information about MDB router ports. + +.TP .BR "\-n" , " \-net" , " \-netns " switches .B bridge @@ -506,7 +510,7 @@ a connected router. .PP With the .B -statistics -option, the command displays timer values for mdb entries. +option, the command displays timer values for mdb and router port entries. .SH bridge vlan - VLAN filter list