From patchwork Fri Mar 1 18:35:10 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 1050339 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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; dmarc=none (p=none dis=none) header.from=netronome.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="QdxTnqlS"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 449ylh68Htz9s47 for ; Sat, 2 Mar 2019 05:35:28 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728507AbfCASf1 (ORCPT ); Fri, 1 Mar 2019 13:35:27 -0500 Received: from mail-qt1-f195.google.com ([209.85.160.195]:34483 "EHLO mail-qt1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728361AbfCASf0 (ORCPT ); Fri, 1 Mar 2019 13:35:26 -0500 Received: by mail-qt1-f195.google.com with SMTP id w4so28962959qtc.1 for ; Fri, 01 Mar 2019 10:35:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=B0+WFGtfOnBzENqlAOtXEKAo2IIqmAgjl2wBr0WSOk0=; b=QdxTnqlSX8dD/i6y87aATOtb2LOe+fanqAn8RA/i2qSCyts1hs55nLEGZJnO44g7F3 oXvE0+Q9xCDBcufgkuFJTYwGi4Jh5GqI5WKT1nBVhYFmOWInMWsLdz8abpmQcTvdT+sx 01KSwr1P4tHUePYr75ctr9pAPDu1xxcHfEJtkRzVFmnxS4UEhwMKaEFzr6Vq7qhon8Ga ECXxftDTh6J4IssXeV/oMYv2LshdcjU+JU1GTh58FTmyssT7J1bckjrqf8tJAN7x1BLS 7s8NVp6UoIco/CxugLHPWDMQDY2NeK2TLMPRHjowWO22qeZvOaBVYrj3Gvg1JsCbmM0q +Yhw== 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:mime-version:content-transfer-encoding; bh=B0+WFGtfOnBzENqlAOtXEKAo2IIqmAgjl2wBr0WSOk0=; b=adSAzPkU6oVu/WePI2S7zXbAoxE1CNHIZ79xli2A+7t5DOpt2JJRN3rgWhZv8dziKD EEG5LDEG6uVPL7BLIjUguaZ9GP/qmL7EgivSgPxDRy8hJ6ohrEtWrRxVm3mF3Kkb2Luo ENDkpiWCxGymoJM9HPhtIpGDN0xbi8dzwA5og4iHW70/xyOUZWEjoNblqJ6kEpSXCUpJ WB7Lg9ePHBgmapz4vZG+yDBAycQEyVuXvQgS+/J85qNyQRsgDNz0fLptE9a/wKuBVRTi NN6xrWU58Y0xYC9vgg376QbSpIB1EEySfG2+66kJjtIH1IJuUyfdY/Jgw7xPgKNOfN8I sygg== X-Gm-Message-State: APjAAAX/N65NQfWl+r22RzAYtjOkOT5wLD5SU/kn/VqWu0gFlUzXeOYo 8GJPZwMHl/0eiZllM4f7REkI6w== X-Google-Smtp-Source: APXvYqy5lXEXeZP1GlIGSDC6cWBtEW208wOK/+gNvxHAx+t5BJUXfkYBZARmbjlchmt5G5g0FK8rfw== X-Received: by 2002:ac8:2a39:: with SMTP id k54mr5247291qtk.26.1551465324512; Fri, 01 Mar 2019 10:35:24 -0800 (PST) Received: from jkicinski-Precision-T1700.netronome.com ([66.60.152.14]) by smtp.gmail.com with ESMTPSA id y21sm15542906qth.90.2019.03.01.10.35.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 01 Mar 2019 10:35:24 -0800 (PST) From: Jakub Kicinski To: jiri@resnulli.us Cc: netdev@vger.kernel.org, oss-drivers@netronome.com, Jakub Kicinski Subject: [RFC iproute2-next 3/3] devlink: add support for PCIe device peers Date: Fri, 1 Mar 2019 10:35:10 -0800 Message-Id: <20190301183510.9028-4-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20190301183510.9028-1-jakub.kicinski@netronome.com> References: <20190301183510.9028-1-jakub.kicinski@netronome.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Print peer netdev information. $ devlink port pci/0000:82:00.0/0: type eth netdev p4p1 flavour physical pci/0000:82:00.0/10000: type eth netdev eth1 flavour pci_pf pf 0 peer_netdev enp130s0 $ devlink -jp port { "port": { "pci/0000:82:00.0/0": { "type": "eth", "netdev": "p4p1", "flavour": "physical" }, "pci/0000:82:00.0/10000": { "type": "eth", "netdev": "eth1", "flavour": "pci_pf", "pf": 0, "peer": { "netdev": "enp130s0" } } } } Signed-off-by: Jakub Kicinski --- devlink/devlink.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/devlink/devlink.c b/devlink/devlink.c index c130305b94ff..e4b66aa28f71 100644 --- a/devlink/devlink.c +++ b/devlink/devlink.c @@ -417,6 +417,8 @@ static const enum mnl_attr_data_type devlink_policy[DEVLINK_ATTR_MAX + 1] = { [DEVLINK_ATTR_PORT_PCI_PF_NUMBER] = MNL_TYPE_U32, [DEVLINK_ATTR_PORT_PCI_VF_NUMBER] = MNL_TYPE_U32, [DEVLINK_ATTR_PORT_PCI_SUBPORT] = MNL_TYPE_U32, + [DEVLINK_ATTR_PORT_PEER_NETDEV_NAME] = MNL_TYPE_STRING, + [DEVLINK_ATTR_PORT_PEER_IBDEV_NAME] = MNL_TYPE_STRING, }; static int attr_cb(const struct nlattr *attr, void *data) @@ -2783,6 +2785,36 @@ static const char *port_flavour_name(uint16_t flavour) } } +static void pr_out_port_peer(struct dl *dl, struct nlattr *peer) +{ + struct nlattr *tb[DEVLINK_ATTR_MAX + 1] = {}; + const char *netdev = NULL, *ibdev = NULL; + + mnl_attr_parse_nested(peer, attr_cb, tb); + + if (tb[DEVLINK_ATTR_PORT_PEER_NETDEV_NAME]) + netdev = mnl_attr_get_str(tb[DEVLINK_ATTR_PORT_PEER_NETDEV_NAME]); + if (tb[DEVLINK_ATTR_PORT_PEER_IBDEV_NAME]) + ibdev = mnl_attr_get_str(tb[DEVLINK_ATTR_PORT_PEER_IBDEV_NAME]); + + if (dl->jw) { + jsonw_name(dl->jw, "peer"); + jsonw_start_object(dl->jw); + + if (netdev) + pr_out_str(dl, "netdev", netdev); + if (ibdev) + pr_out_str(dl, "ibdev", ibdev); + + jsonw_end_object(dl->jw); + } else { + if (netdev) + pr_out_str(dl, "peer_netdev", netdev); + if (ibdev) + pr_out_str(dl, "peer_ibdev", ibdev); + } +} + static void pr_out_port(struct dl *dl, struct nlattr **tb) { struct nlattr *pt_attr = tb[DEVLINK_ATTR_PORT_TYPE]; @@ -2825,6 +2857,8 @@ static void pr_out_port(struct dl *dl, struct nlattr **tb) if (tb[DEVLINK_ATTR_PORT_PCI_SUBPORT]) pr_out_uint(dl, "subport", mnl_attr_get_u32(tb[DEVLINK_ATTR_PORT_PCI_SUBPORT])); + if (tb[DEVLINK_ATTR_PORT_PEER]) + pr_out_port_peer(dl, tb[DEVLINK_ATTR_PORT_PEER]); pr_out_port_handle_end(dl); }