From patchwork Thu Aug 17 17:35:55 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Julien Fortin X-Patchwork-Id: 802795 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="QRbOZAUK"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3xYD5h0LJbz9t4Z for ; Fri, 18 Aug 2017 03:40:56 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753520AbdHQRkw (ORCPT ); Thu, 17 Aug 2017 13:40:52 -0400 Received: from mail-wr0-f174.google.com ([209.85.128.174]:34723 "EHLO mail-wr0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753508AbdHQRks (ORCPT ); Thu, 17 Aug 2017 13:40:48 -0400 Received: by mail-wr0-f174.google.com with SMTP id y96so47226301wrc.1 for ; Thu, 17 Aug 2017 10:40:48 -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=iYEBbYPvN4uyYLiq5jRTxaUt9sND9coXdk7HP0qigw0=; b=QRbOZAUKxAhsjA+GH+oB8OYnghTgngYjirBSMEDSaYJoiZm9+1pqvvyGz4U/7E44T6 14TvpXTwNg8ZwnKdOZqoyZaVM+eTJ9a9MvIuBLrEOcBWRUcQHS0kFy7VlksCbr3glYKN 3Ne3lHZ81qxtqwHYfsvB70qtF/+RxbLGTIPCY= 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=iYEBbYPvN4uyYLiq5jRTxaUt9sND9coXdk7HP0qigw0=; b=aQh0IIm/kaZCuQVJpRPL21CT9mjGb37uBzasj5Pwc+P4o8crDb0KG5p2z4+FF+EfIH xUwtzneEYDbjepp3IAW4tsIjV55jeupG86jRdSgbd8rLa7KADzjmmNzj/YeCF+eEtAkU L+EVOYCxx14W1zhHhWzN6KPyqWfGQLVH5e5lzbDnwSJ+vG1URbU0UQPEgl7l3rPqTjsF NWtgX1TjmL+X+cjR2YxUBhyEn06SuqeirMW7uRNnpu6e/1OpaONdCwfboyqWf4M6cgnR PYsIt94cwTFg8Pzb46IC5lONBBueIBbiLaKDlKc1fwKI/Tw7P52tCHqX+uLG5xjKNZup eGlA== X-Gm-Message-State: AHYfb5gaMK8WEjRg/TFkjg/0YwiysfuT5tghkd4wLrwjRxQIcH2qlBJ6 CLMxIBoyPed83muM4vETXg41 X-Received: by 10.28.175.65 with SMTP id y62mr2062137wme.77.1502991647182; Thu, 17 Aug 2017 10:40:47 -0700 (PDT) Received: from localhost.localdomain ([37.169.21.172]) by smtp.googlemail.com with ESMTPSA id k13sm3902040wrd.4.2017.08.17.10.40.43 (version=TLS1 cipher=AES128-SHA bits=128/128); Thu, 17 Aug 2017 10:40:46 -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 08/27] ip: iplink_bond_slave.c: add json output support (info_slave_data) Date: Thu, 17 Aug 2017 10:35:55 -0700 Message-Id: <20170817173614.54987-9-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 and live example: bond_slave: IFLA_INFO_SLAVE_DATA { "state": { "type": "string", "attr": "IFLA_BOND_SLAVE_STATE", "mutually_exclusive": { "state_index": { "type": "int", "comment": "if (state >= ARRAY_SIZE(slave_states))" } } }, "mii_status": { "type": "string", "attr": "IFLA_BOND_SLAVE_MII_STATUS", "mutually_exclusive": { "mii_status_index": { "type": "int", "comment": "if (status >= ARRAY_SIZE(slave_mii_status))" } } }, "link_failure_count": { "type": "int", "attr": "IFLA_BOND_SLAVE_LINK_FAILURE_COUNT" }, "perm_hwaddr": { "type": "string", "attr": "IFLA_BOND_SLAVE_PERM_HWADDR" }, "queue_id": { "type": "int", "attr": "IFLA_BOND_SLAVE_QUEUE_ID" }, "ad_aggregator_id": { "type": "int", "attr": "IFLA_BOND_SLAVE_AD_AGGREGATOR_ID" }, "ad_actor_oper_port_state": { "type": "int", "attr": "IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE" }, "ad_partner_oper_port_state": { "type": "int", "attr": "IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE" } } $ ip link add dev bond42 type bond $ ip link set dev swp5 master bond42 $ ip link set dev bond42 up $ ip link set dev swp5 up $ ip -details -json link show [{ "ifindex": 7, "ifname": "swp5", "flags": ["BROADCAST","MULTICAST","SLAVE","UP","LOWER_UP"], "mtu": 1500, "qdisc": "pfifo_fast", "master": "bond42", "operstate": "UP", "linkmode": "DEFAULT", "group": "default", "txqlen": 1000, "link_type": "ether", "address": "08:00:27:5c:03:c6", "broadcast": "ff:ff:ff:ff:ff:ff", "promiscuity": 0, "linkinfo": { "info_slave_kind": "bond", "info_slave_data": { "state": "BACKUP", "mii_status": "UP", "link_failure_count": 0, "perm_hwaddr": "08:00:27:5c:03:c6", "queue_id": 0, "ad_aggregator_id": 1, "ad_actor_oper_port_state": 79, "ad_partner_oper_port_state": 1 } }, "inet6_addr_gen_mode": "eui64", "num_tx_queues": 1, "num_rx_queues": 1, "gso_max_size": 65536, "gso_max_segs": 65535 },{ "ifindex": 14, "ifname": "bond42", "flags": ["NO-CARRIER","BROADCAST","MULTICAST","MASTER","UP"], "mtu": 1500, "qdisc": "noqueue", "operstate": "DOWN", "linkmode": "DEFAULT", "group": "default", "link_type": "ether", "address": "08:00:27:5c:03:c6", "broadcast": "ff:ff:ff:ff:ff:ff", "promiscuity": 0, "linkinfo": { "info_kind": "bond", "info_data": { "mode": "802.3ad", "miimon": 100, "updelay": 0, "downdelay": 0, "use_carrier": 1, "arp_interval": 0, "arp_validate": null, "arp_all_targets": "any", "primary_reselect": "always", "fail_over_mac": "none", "xmit_hash_policy": "layer3+4", "resend_igmp": 1, "num_peer_notif": 1, "all_slaves_active": 0, "min_links": 1, "lp_interval": 1, "packets_per_slave": 1, "ad_lacp_rate": "fast", "ad_select": "stable", "ad_info": { "aggregator": 1, "num_ports": 1, "actor_key": 0, "partner_key": 1, "partner_mac": "00:00:00:00:00:00" }, "ad_actor_sys_prio": 65535, "ad_user_port_key": 0, "ad_actor_system": "00:00:00:00:00:00" } }, "inet6_addr_gen_mode": "eui64", "num_tx_queues": 16, "num_rx_queues": 16, "gso_max_size": 65536, "gso_max_segs": 65535 } ] Signed-off-by: Julien Fortin --- ip/iplink_bond_slave.c | 57 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 39 insertions(+), 18 deletions(-) diff --git a/ip/iplink_bond_slave.c b/ip/iplink_bond_slave.c index 877e2d9e..67219c67 100644 --- a/ip/iplink_bond_slave.c +++ b/ip/iplink_bond_slave.c @@ -37,9 +37,12 @@ static void print_slave_state(FILE *f, struct rtattr *tb) unsigned int state = rta_getattr_u8(tb); if (state >= ARRAY_SIZE(slave_states)) - fprintf(f, "state %d ", state); + print_int(PRINT_ANY, "state_index", "state %d ", state); else - fprintf(f, "state %s ", slave_states[state]); + print_string(PRINT_ANY, + "state", + "state %s ", + slave_states[state]); } static const char *slave_mii_status[] = { @@ -54,9 +57,15 @@ static void print_slave_mii_status(FILE *f, struct rtattr *tb) unsigned int status = rta_getattr_u8(tb); if (status >= ARRAY_SIZE(slave_mii_status)) - fprintf(f, "mii_status %d ", status); + print_int(PRINT_ANY, + "mii_status_index", + "mii_status %d ", + status); else - fprintf(f, "mii_status %s ", slave_mii_status[status]); + print_string(PRINT_ANY, + "mii_status", + "mii_status %s ", + slave_mii_status[status]); } static void bond_slave_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[]) @@ -72,30 +81,42 @@ static void bond_slave_print_opt(struct link_util *lu, FILE *f, struct rtattr *t print_slave_mii_status(f, tb[IFLA_BOND_SLAVE_MII_STATUS]); if (tb[IFLA_BOND_SLAVE_LINK_FAILURE_COUNT]) - fprintf(f, "link_failure_count %d ", - rta_getattr_u32(tb[IFLA_BOND_SLAVE_LINK_FAILURE_COUNT])); + print_int(PRINT_ANY, + "link_failure_count", + "link_failure_count %d ", + rta_getattr_u32(tb[IFLA_BOND_SLAVE_LINK_FAILURE_COUNT])); if (tb[IFLA_BOND_SLAVE_PERM_HWADDR]) - fprintf(f, "perm_hwaddr %s ", - ll_addr_n2a(RTA_DATA(tb[IFLA_BOND_SLAVE_PERM_HWADDR]), - RTA_PAYLOAD(tb[IFLA_BOND_SLAVE_PERM_HWADDR]), - 0, b1, sizeof(b1))); + print_string(PRINT_ANY, + "perm_hwaddr", + "perm_hwaddr %s ", + ll_addr_n2a(RTA_DATA(tb[IFLA_BOND_SLAVE_PERM_HWADDR]), + RTA_PAYLOAD(tb[IFLA_BOND_SLAVE_PERM_HWADDR]), + 0, b1, sizeof(b1))); if (tb[IFLA_BOND_SLAVE_QUEUE_ID]) - fprintf(f, "queue_id %d ", - rta_getattr_u16(tb[IFLA_BOND_SLAVE_QUEUE_ID])); + print_int(PRINT_ANY, + "queue_id", + "queue_id %d ", + rta_getattr_u16(tb[IFLA_BOND_SLAVE_QUEUE_ID])); if (tb[IFLA_BOND_SLAVE_AD_AGGREGATOR_ID]) - fprintf(f, "ad_aggregator_id %d ", - rta_getattr_u16(tb[IFLA_BOND_SLAVE_AD_AGGREGATOR_ID])); + print_int(PRINT_ANY, + "ad_aggregator_id", + "ad_aggregator_id %d ", + rta_getattr_u16(tb[IFLA_BOND_SLAVE_AD_AGGREGATOR_ID])); if (tb[IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE]) - fprintf(f, "ad_actor_oper_port_state %d ", - rta_getattr_u8(tb[IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE])); + print_int(PRINT_ANY, + "ad_actor_oper_port_state", + "ad_actor_oper_port_state %d ", + rta_getattr_u8(tb[IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE])); if (tb[IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE]) - fprintf(f, "ad_partner_oper_port_state %d ", - rta_getattr_u16(tb[IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE])); + print_int(PRINT_ANY, + "ad_partner_oper_port_state", + "ad_partner_oper_port_state %d ", + rta_getattr_u16(tb[IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE])); } static int bond_slave_parse_opt(struct link_util *lu, int argc, char **argv,