From patchwork Thu Aug 3 15:54:56 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Julien Fortin X-Patchwork-Id: 797290 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="Q2OazPOA"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3xNZT737BYz9s9Y for ; Fri, 4 Aug 2017 01:57:47 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751914AbdHCPzq (ORCPT ); Thu, 3 Aug 2017 11:55:46 -0400 Received: from mail-wm0-f52.google.com ([74.125.82.52]:37551 "EHLO mail-wm0-f52.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751895AbdHCPzn (ORCPT ); Thu, 3 Aug 2017 11:55:43 -0400 Received: by mail-wm0-f52.google.com with SMTP id t201so19238544wmt.0 for ; Thu, 03 Aug 2017 08:55:43 -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=Yc5QcL37WLj+Oy0Lvi9bnqfLUhjyq1HONaAxr9BuV+E=; b=Q2OazPOASsp6bYZsnQEI86qutAAO4/Lx9xxUsRA4XorGY1a29ubcN7BpSjcUcdNcbL /SvmTg1+ciTwPkLFpnkw1mDFWxoCgyrYEil2WCnCiYvDCuLy2Iv91xSJ/zhimffatmCN EgEGGElvosirh33Vf9zXV1GqpKhBDa/HGibvw= 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=Yc5QcL37WLj+Oy0Lvi9bnqfLUhjyq1HONaAxr9BuV+E=; b=HoCYzPstCInMl5jsctQWKJ6XJK5NdOCnitoNVpfjJbCU58/bYMjyfwRN5lWNmWEBKp 86xmZbCHNuPX4tyrdIpERg9ixiXGbNExxw0BsKbvEbE1pU9eUWciuByNaGE2JnTYdOSi 8ob3fXc7r04SRXuXRr8Nyw8/gf549lLXgKHr+G7piJojhrPZsFlp347Oc5zdD1N5hnr0 kK7/EfYtEhnyWIunHyR1S9xQzAjEnGjOHbvrnlOY3prSsIm4UvY3MnIMgm1aN1VkCkL5 66s48PnXiAYXaGw8exd0+KneUndxs/hkOwN9KB/rIT9AHBfiU66exeXO9xQc2sX+YRSR gbWw== X-Gm-Message-State: AIVw113ITrhl4BVed3d07khlIubiuzMNV5d0cOfscAuWxedlrb79aZPL nhs9Trahjtj+j51qVR4= X-Received: by 10.28.180.8 with SMTP id d8mr1643063wmf.161.1501775742080; Thu, 03 Aug 2017 08:55:42 -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.55.40 (version=TLS1 cipher=AES128-SHA bits=128/128); Thu, 03 Aug 2017 08:55:41 -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 08/27] ip: iplink_bond_slave.c: add json output support (info_slave_data) Date: Thu, 3 Aug 2017 17:54:56 +0200 Message-Id: <20170803155515.99226-9-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 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,