From patchwork Thu Aug 17 17:36:13 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Julien Fortin X-Patchwork-Id: 802813 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="drmx5OSW"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3xYD7c0Nm2z9t4Z for ; Fri, 18 Aug 2017 03:42:36 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753526AbdHQRme (ORCPT ); Thu, 17 Aug 2017 13:42:34 -0400 Received: from mail-wr0-f179.google.com ([209.85.128.179]:38414 "EHLO mail-wr0-f179.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753748AbdHQRmb (ORCPT ); Thu, 17 Aug 2017 13:42:31 -0400 Received: by mail-wr0-f179.google.com with SMTP id 5so25449287wrz.5 for ; Thu, 17 Aug 2017 10:42:30 -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=/gTrG10rFm6dAkFA5v2+kx04M36iowc2i9Bak3oq/yE=; b=drmx5OSWPN98xe16h1AM0l2xhEG8XXGoKUWTmuQmES6XyTx54wbaWaNpPbwG99yrWb kR3LWC8p3fpLIlL9s3HcmlSd/ksn4IuRILSIRZErDe8EESHPKuIf/67Mh740bp0h0R1M XXj6RuDbQ6hMkiXknn+M1W0ifTPMvZHcWoD1U= 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=/gTrG10rFm6dAkFA5v2+kx04M36iowc2i9Bak3oq/yE=; b=CRdV9/1XX+AB219Am/pWgMECJgcTww+6yHlYIQA6bi/KWq09fmtQY2fjyrxQCPX/Lx ieZbfyCel+JJbd3G76VJbWrQbJg1gyIHMTCLDBogP569B0vClJzBbbfpRLe1nACzqDEL 2FpCxyKrXdtdGU49X0KXMIEiY80x75Jw/OCuBTAQIxzvBGFCjNKvQKODhmDKf8TKq5aR 45Yjvz2SLFc9gnZ7gaGUMy3RX1UpTJYDKrnJeoOaqivPzgstaQAA096I9QOGl9Bxn6MT Pp4a0TyzgeP3KxDadzaW1vALWj8DHN+MH5CEyHyEHhi+SnN62fhzbUjkMLXrBACe5vK0 fRhA== X-Gm-Message-State: AHYfb5ipjv/nGpCsHP6F5R+4kjVk7Xgk6D7o8pkxsaknEv0E1ybqdMhs hz/wMyF5PL0jMudGpGXa791g X-Received: by 10.28.175.65 with SMTP id y62mr2065086wme.77.1502991749911; Thu, 17 Aug 2017 10:42:29 -0700 (PDT) Received: from localhost.localdomain ([37.169.21.172]) by smtp.googlemail.com with ESMTPSA id k13sm3902040wrd.4.2017.08.17.10.42.26 (version=TLS1 cipher=AES128-SHA bits=128/128); Thu, 17 Aug 2017 10:42:29 -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 iproute2 json v2 26/27] ip: link_macvlan.c: add json output support Date: Thu, 17 Aug 2017 10:36:13 -0700 Message-Id: <20170817173614.54987-27-julien@cumulusnetworks.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20170817173614.54987-1-julien@cumulusnetworks.com> References: <20170817173614.54987-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); }