]> git.ipfire.org Git - thirdparty/iproute2.git/commitdiff
bridge: mdb: add user-space support for extended attributes
authorNikolay Aleksandrov <nikolay@cumulusnetworks.com>
Mon, 22 Feb 2016 14:16:13 +0000 (15:16 +0100)
committerStephen Hemminger <stephen@networkplumber.org>
Wed, 2 Mar 2016 17:31:46 +0000 (09:31 -0800)
Recently support was added to the kernel to be able to add more per-mdb
entry attributes via standard netlink attributes of type MDBA_MDB_EATTR_.
This patch adds support to iproute2 to parse and output these
attributes. The first exported attribute is the mdb "timer" value which
is shown only when the "-s" iproute2 arg is used.

Example:
$ bridge -s mdb show
dev br0 port eth1 grp 239.0.0.11 permanent   0.00
dev br0 port eth1 grp 239.0.0.10 temp 244.15
dev br0 port eth1 grp 239.0.0.1 temp 245.21
dev br0 port eth1 grp 239.0.0.5 temp 246.43
dev br0 port eth2 grp 239.0.0.5 temp 248.44
dev br0 port eth1 grp 239.0.0.2 temp 245.32

Signed-off-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
bridge/br_common.h
bridge/mdb.c
man/man8/bridge.8

index 169a162d0c0100aa5be83aa48811fb1c6aa1ad37..41eb0dc3829352221a2e154defd892433a825311 100644 (file)
@@ -1,3 +1,6 @@
+#define MDB_RTA(r) \
+               ((struct rtattr *)(((char *)(r)) + RTA_ALIGN(sizeof(struct br_mdb_entry))))
+
 extern int print_linkinfo(const struct sockaddr_nl *who,
                          struct nlmsghdr *n,
                          void *arg);
index 24c4903542bf0123d33fef267260973c2ebde73c..09d4b2255857fff444fab04ba1b2349e4375d804 100644 (file)
@@ -49,7 +49,7 @@ static void br_print_router_ports(FILE *f, struct rtattr *attr)
 }
 
 static void print_mdb_entry(FILE *f, int ifindex, struct br_mdb_entry *e,
-                           struct nlmsghdr *n)
+                           struct nlmsghdr *n, struct rtattr **tb)
 {
        SPRINT_BUF(abuf);
        const void *src;
@@ -66,20 +66,29 @@ static void print_mdb_entry(FILE *f, int ifindex, struct br_mdb_entry *e,
                (e->state & MDB_PERMANENT) ? "permanent" : "temp");
        if (e->vid)
                fprintf(f, " vid %hu", e->vid);
+       if (show_stats && tb && tb[MDBA_MDB_EATTR_TIMER]) {
+               struct timeval tv;
+
+               __jiffies_to_tv(&tv, rta_getattr_u32(tb[MDBA_MDB_EATTR_TIMER]));
+               fprintf(f, "%4i.%.2i", (int)tv.tv_sec, (int)tv.tv_usec/10000);
+       }
        fprintf(f, "\n");
 }
 
 static void br_print_mdb_entry(FILE *f, int ifindex, struct rtattr *attr,
                               struct nlmsghdr *n)
 {
+       struct rtattr *etb[MDBA_MDB_EATTR_MAX + 1];
+       struct br_mdb_entry *e;
        struct rtattr *i;
        int rem;
-       struct br_mdb_entry *e;
 
        rem = RTA_PAYLOAD(attr);
        for (i = RTA_DATA(attr); RTA_OK(i, rem); i = RTA_NEXT(i, rem)) {
                e = RTA_DATA(i);
-               print_mdb_entry(f, ifindex, e, n);
+               parse_rtattr(etb, MDBA_MDB_EATTR_MAX, MDB_RTA(RTA_DATA(i)),
+                            RTA_PAYLOAD(i) - RTA_ALIGN(sizeof(*e)));
+               print_mdb_entry(f, ifindex, e, n, etb);
        }
 }
 
index efd416e71d55b23d1e1088083da2fbc3a1bd53e2..0e98edf4762fab564d174a07c82994b736606f0e 100644 (file)
@@ -503,6 +503,11 @@ With the
 option, the command becomes verbose. It prints out the ports known to have
 a connected router.
 
+.PP
+With the
+.B -statistics
+option, the command displays timer values for mdb entries.
+
 .SH bridge vlan - VLAN filter list
 
 .B vlan