Re: [PATCH iproute2 net-next 2/5] bridge: add json support for bridge vlan show

2016-05-30 Thread Roopa Prabhu
On 5/29/16, 5:43 PM, Toshiaki Makita wrote:
> On 2016/05/28 13:37, Roopa Prabhu wrote:
>> From: Roopa Prabhu 
>>
>> $bridge -c vlan show
>> port vlan ids
>> swp1  1 PVID Egress Untagged
>>   10-13
>>
>> swp2  1 PVID Egress Untagged
>>   10-13
>>
>> br0   1 PVID Egress Untagged
>>
>> $bridge -j vlan show
>> {
>> "swp1": [{
>> "vlan": 1,
>> "flags": "PVID Egress Untagged"
> Shouldn't we split flags?

yes, of-course. v2 coming...


Re: [PATCH iproute2 net-next 2/5] bridge: add json support for bridge vlan show

2016-05-29 Thread Toshiaki Makita
On 2016/05/28 13:37, Roopa Prabhu wrote:
> From: Roopa Prabhu 
> 
> $bridge -c vlan show
> port  vlan ids
> swp1   1 PVID Egress Untagged
>10-13
> 
> swp2   1 PVID Egress Untagged
>10-13
> 
> br01 PVID Egress Untagged
> 
> $bridge -j vlan show
> {
> "swp1": [{
> "vlan": 1,
> "flags": "PVID Egress Untagged"

Shouldn't we split flags?

"swp1": [{
"vlan": 1,
"flags": [
"PVID",
"Egress Untagged"
]
}

--
Toshiaki Makita




[PATCH iproute2 net-next 2/5] bridge: add json support for bridge vlan show

2016-05-27 Thread Roopa Prabhu
From: Roopa Prabhu 

$bridge -c vlan show
portvlan ids
swp1 1 PVID Egress Untagged
 10-13

swp2 1 PVID Egress Untagged
 10-13

br0  1 PVID Egress Untagged

$bridge -j vlan show
{
"swp1": [{
"vlan": 1,
"flags": "PVID Egress Untagged"
},{
"vlan": 10
},{
"vlan": 11
},{
"vlan": 12
},{
"vlan": 13
}
],
"swp2": [{
"vlan": 1,
"flags": "PVID Egress Untagged"
},{
"vlan": 10
},{
"vlan": 11
},{
"vlan": 12
},{
"vlan": 13
}
],
"br0": [{
"vlan": 1,
"flags": "PVID Egress Untagged"
}
]
}

$bridge -c -j vlan show
{
"swp1": [{
"vlan": 1,
"flags": "PVID Egress Untagged"
},{
"vlan": 10,
"vlanEnd": 13
}
],
"swp2": [{
"vlan": 1,
"flags": "PVID Egress Untagged"
},{
"vlan": 10,
"vlanEnd": 13
}
],
"br0": [{
"vlan": 1,
"flags": "PVID Egress Untagged"
}
]
}

Signed-off-by: Roopa Prabhu 
---
 bridge/br_common.h |  1 +
 bridge/bridge.c|  5 +++-
 bridge/vlan.c  | 83 ++
 3 files changed, 76 insertions(+), 13 deletions(-)

diff --git a/bridge/br_common.h b/bridge/br_common.h
index 5ea45c9..c649e7d 100644
--- a/bridge/br_common.h
+++ b/bridge/br_common.h
@@ -23,4 +23,5 @@ extern int show_stats;
 extern int show_details;
 extern int timestamp;
 extern int compress_vlans;
+extern int json_output;
 extern struct rtnl_handle rth;
diff --git a/bridge/bridge.c b/bridge/bridge.c
index 72f153f..5ff038d 100644
--- a/bridge/bridge.c
+++ b/bridge/bridge.c
@@ -23,6 +23,7 @@ int oneline;
 int show_stats;
 int show_details;
 int compress_vlans;
+int json_output;
 int timestamp;
 char *batch_file;
 int force;
@@ -38,7 +39,7 @@ static void usage(void)
 "where OBJECT := { link | fdb | mdb | vlan | monitor }\n"
 "  OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] |\n"
 "   -o[neline] | -t[imestamp] | -n[etns] name |\n"
-"   -c[ompressvlans] }\n");
+"   -c[ompressvlans] -j{son} }\n");
exit(-1);
 }
 
@@ -173,6 +174,8 @@ main(int argc, char **argv)
++compress_vlans;
} else if (matches(opt, "-force") == 0) {
++force;
+   } else if (matches(opt, "-json") == 0) {
+   ++json_output;
} else if (matches(opt, "-batch") == 0) {
argc--;
argv++;
diff --git a/bridge/vlan.c b/bridge/vlan.c
index 717025a..722d0af 100644
--- a/bridge/vlan.c
+++ b/bridge/vlan.c
@@ -7,6 +7,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 
 #include "libnetlink.h"
@@ -15,6 +16,8 @@
 
 static unsigned int filter_index, filter_vlan;
 
+json_writer_t *jw_global = NULL;
+
 static void usage(void)
 {
fprintf(stderr, "Usage: bridge vlan { add | del } vid VLAN_ID dev DEV [ 
pvid] [ untagged ]\n");
@@ -158,6 +161,19 @@ static int filter_vlan_check(struct bridge_vlan_info 
*vinfo)
return 1;
 }
 
+static int print_vlan_port(FILE *fp, int ifi_index)
+{
+   if (jw_global) {
+   jsonw_pretty(jw_global, 1);
+   jsonw_name(jw_global,
+  ll_index_to_name(ifi_index));
+   jsonw_start_array(jw_global);
+   } else {
+   fprintf(fp, "%s",
+   ll_index_to_name(ifi_index));
+   }
+}
+
 static int print_vlan(const struct sockaddr_nl *who,
  struct nlmsghdr *n,
  void *arg)
@@ -166,6 +182,7 @@ static int print_vlan(const struct sockaddr_nl *who,
struct ifinfomsg *ifm = NLMSG_DATA(n);
int len = n->nlmsg_len;
struct rtattr *tb[IFLA_MAX+1];
+   char flags[80];
 
if (n->nlmsg_type != RTM_NEWLINK) {
fprintf(stderr, "Not RTM_NEWLINK: %08x %08x %08x\n",
@@ -199,7 +216,8 @@ static int print_vlan(const struct sockaddr_nl *who,
__u16 last_vid_start = 0;
 
if (!filter_vlan)
-   fprintf(fp, "%s", ll_index_to_name(ifm->ifi_index));
+   print_vlan_port(fp, ifm->ifi_index);
+
for (i = RTA_DATA(list); RTA_OK(i, rem); i = RTA_NEXT(i, rem)) {
struct bridge_vlan_info *vinfo;
int vcheck_ret;
@@ -218,20 +236,49 @@ static int print_vlan(const struct sockaddr_nl *who,
continue;
 
if (filter_vlan)
-   fprintf(fp, "%s",
-