From patchwork Thu Aug 3 15:55:14 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Julien Fortin X-Patchwork-Id: 797277 X-Patchwork-Delegate: shemminger@vyatta.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=cumulusnetworks.com header.i=@cumulusnetworks.com header.b="fY0TSl92"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3xNZRG6LHpz9s8V for ; Fri, 4 Aug 2017 01:56:10 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752034AbdHCP4I (ORCPT ); Thu, 3 Aug 2017 11:56:08 -0400 Received: from mail-wr0-f174.google.com ([209.85.128.174]:36118 "EHLO mail-wr0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751996AbdHCP4G (ORCPT ); Thu, 3 Aug 2017 11:56:06 -0400 Received: by mail-wr0-f174.google.com with SMTP id y43so7405373wrd.3 for ; Thu, 03 Aug 2017 08:56:05 -0700 (PDT) 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=M4oywOFrO1KH8C+9nsp1RqHEXA8EZHQlw7E6yRy68m0=; b=fY0TSl92OqVMq5QSXM4UGwquxFqmKnMZSe3+TALHe7GIm+mE0ibY68p3tS7exyp4EA NbnOg+cLDCkzu7TVOdiYCo8009inPjrcGZunY2fdQ5XDa7L71e67/pkadUfeOYUdzngs h85FmNo0WArIdJP5XjHuiENYgFqmJFc3PsyZ0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=M4oywOFrO1KH8C+9nsp1RqHEXA8EZHQlw7E6yRy68m0=; b=bjurxKy8deW8ZfOISlm2dl6s+mvnh0FMNAERAPPwZhoT7ekQyh9tj175T5eLjAbYZL UJ9NG/sx7qb/5Je5ltE+tpb8Xoneu3VJopED7TDZ/5sXj5Oozm/rsRgSTe9IOaEpfjFW TiZGGDqlOqG+zmuGKd+r+hVKxdWfjhjRakhy8W0Q7yymGFx/I1L+QIC0zn/3oxQTSf/Z SACrCS4irmYeSH9EG6QgCBDbkuW6NllPk7Rl5s30IJbiMYPgY8lt6AMlfiCgS0AcWHQM ysMD7eM4MGyiPM/Xvttmm113clGn42vrh/LKoItMpXBDXwvdaUtOdIeLZ0SucSs8TttM ptiQ== X-Gm-Message-State: AIVw1117qMk88cduoVl5bgUPMH1eAlIZYIFtF+39z1jtZ2rANpoIARYH yfFiGMPzNVxKXKvusd8= X-Received: by 10.223.178.85 with SMTP id y21mr1621528wra.92.1501775764440; Thu, 03 Aug 2017 08:56:04 -0700 (PDT) Received: from localhost.localdomain (91-160-18-219.subs.proxad.net. [91.160.18.219]) by smtp.googlemail.com with ESMTPSA id d91sm2213309wma.23.2017.08.03.08.56.03 (version=TLS1 cipher=AES128-SHA bits=128/128); Thu, 03 Aug 2017 08:56:03 -0700 (PDT) From: Julien Fortin X-Google-Original-From: Julien Fortin To: netdev@vger.kernel.org Cc: roopa@cumulusnetworks.com, nikolay@cumulusnetworks.com, dsa@cumulusnetworks.com, Julien Fortin Subject: [PATCH 26/27] ip: link_macvlan.c: add json output support Date: Thu, 3 Aug 2017 17:55:14 +0200 Message-Id: <20170803155515.99226-27-julien@cumulusnetworks.com> X-Mailer: git-send-email 2.13.3 In-Reply-To: <20170803155515.99226-1-julien@cumulusnetworks.com> References: <20170803155515.99226-1-julien@cumulusnetworks.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Julien Fortin Schema: { "mode": { "type": "string", "attr": "IFLA_MACVLAN_MODE" }, "nopromisc": { "type": "bool", "attr": "MACVLAN_FLAG_NOPROMISC" }, "macaddr_count": { "type": "int", "attr": "IFLA_MACVLAN_MACADDR_COUNT" }, "macaddr_data": { "type": "array", "attr": "IFLA_MACVLAN_MACADDR_DATA", "array": [ { "type": "string" } ] }, } $ ip link add name peth0 link eth0 type macvlan $ ip -details -json link show peth0 [{ "ifindex": 26, "ifname": "peth0", "link": "eth0", "flags": ["BROADCAST","MULTICAST"], "mtu": 1500, "qdisc": "noop", "operstate": "DOWN", "linkmode": "DEFAULT", "group": "default", "link_type": "ether", "address": "7a:84:48:3e:7b:1c", "broadcast": "ff:ff:ff:ff:ff:ff", "promiscuity": 0, "linkinfo": { "info_kind": "macvlan", "info_data": { "mode": "vepa" } }, "inet6_addr_gen_mode": "eui64", "num_tx_queues": 1, "num_rx_queues": 1, "gso_max_size": 65536, "gso_max_segs": 65535 } ] Signed-off-by: Julien Fortin --- ip/iplink_macvlan.c | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/ip/iplink_macvlan.c b/ip/iplink_macvlan.c index 662eb6ff..b966a615 100644 --- a/ip/iplink_macvlan.c +++ b/ip/iplink_macvlan.c @@ -193,13 +193,15 @@ static void macvlan_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[] return; mode = rta_getattr_u32(tb[IFLA_MACVLAN_MODE]); - fprintf(f, "mode %s ", - mode == MACVLAN_MODE_PRIVATE ? "private" - : mode == MACVLAN_MODE_VEPA ? "vepa" - : mode == MACVLAN_MODE_BRIDGE ? "bridge" - : mode == MACVLAN_MODE_PASSTHRU ? "passthru" - : mode == MACVLAN_MODE_SOURCE ? "source" - : "unknown"); + print_string(PRINT_ANY, + "mode", + "mode %s ", + mode == MACVLAN_MODE_PRIVATE ? "private" + : mode == MACVLAN_MODE_VEPA ? "vepa" + : mode == MACVLAN_MODE_BRIDGE ? "bridge" + : mode == MACVLAN_MODE_PASSTHRU ? "passthru" + : mode == MACVLAN_MODE_SOURCE ? "source" + : "unknown"); if (!tb[IFLA_MACVLAN_FLAGS] || RTA_PAYLOAD(tb[IFLA_MACVLAN_FLAGS]) < sizeof(__u16)) @@ -208,7 +210,7 @@ static void macvlan_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[] flags = rta_getattr_u16(tb[IFLA_MACVLAN_FLAGS]); if (flags & MACVLAN_FLAG_NOPROMISC) - fprintf(f, "nopromisc "); + print_bool(PRINT_ANY, "nopromisc", "nopromisc ", true); /* in source mode, there are more options to print */ @@ -220,7 +222,7 @@ static void macvlan_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[] return; count = rta_getattr_u32(tb[IFLA_MACVLAN_MACADDR_COUNT]); - fprintf(f, "remotes (%d) ", count); + print_int(PRINT_ANY, "macaddr_count", "remotes (%d) ", count); if (!tb[IFLA_MACVLAN_MACADDR_DATA]) return; @@ -228,18 +230,29 @@ static void macvlan_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[] rta = RTA_DATA(tb[IFLA_MACVLAN_MACADDR_DATA]); len = RTA_PAYLOAD(tb[IFLA_MACVLAN_MACADDR_DATA]); + open_json_array(PRINT_JSON, "macaddr_data"); for (; RTA_OK(rta, len); rta = RTA_NEXT(rta, len)) { if (rta->rta_type != IFLA_MACVLAN_MACADDR || RTA_PAYLOAD(rta) < 6) continue; addr = RTA_DATA(rta); - fprintf(f, "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x ", addr[0], - addr[1], addr[2], addr[3], addr[4], addr[5]); + if (is_json_context()) { + SPRINT_BUF(b1); + + snprintf(b1, sizeof(b1), + "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x", addr[0], + addr[1], addr[2], addr[3], addr[4], addr[5]); + print_string(PRINT_JSON, NULL, NULL, b1); + } else { + fprintf(f, "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x ", addr[0], + addr[1], addr[2], addr[3], addr[4], addr[5]); + } } + close_json_array(PRINT_JSON, NULL); } static void macvlan_print_help(struct link_util *lu, int argc, char **argv, - FILE *f) + FILE *f) { print_explain(lu, f); }