naccyde / rpms / iproute

Forked from rpms/iproute 8 months ago
Clone

Blame SOURCES/0011-vdpa-Enable-user-to-query-vdpa-device-config-layout.patch

b6425b
From 492d698656851b27349dc64a8f0c2f66057eea52 Mon Sep 17 00:00:00 2001
b6425b
Message-Id: <492d698656851b27349dc64a8f0c2f66057eea52.1647984433.git.aclaudi@redhat.com>
b6425b
In-Reply-To: <cef782ca658d695c5ca2d174ba1f89cba6bd84e5.1647984433.git.aclaudi@redhat.com>
b6425b
References: <cef782ca658d695c5ca2d174ba1f89cba6bd84e5.1647984433.git.aclaudi@redhat.com>
b6425b
From: Andrea Claudi <aclaudi@redhat.com>
b6425b
Date: Mon, 21 Mar 2022 16:35:15 +0100
b6425b
Subject: [PATCH] vdpa: Enable user to query vdpa device config layout
b6425b
b6425b
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2059427
b6425b
Upstream Status: iproute2-next.git commit a311f0c4
b6425b
b6425b
commit a311f0c43a67be939dfafda563453a3f9bf30e42
b6425b
Author: Parav Pandit <parav@nvidia.com>
b6425b
Date:   Fri Dec 17 10:08:25 2021 +0200
b6425b
b6425b
    vdpa: Enable user to query vdpa device config layout
b6425b
b6425b
    Query the device configuration layout whenever kernel supports it.
b6425b
b6425b
    An example of configuration layout of vdpa device of type network:
b6425b
b6425b
    $ vdpa dev add name bar mgmtdev vdpasim_net
b6425b
b6425b
    $ vdpa dev config show
b6425b
    bar: mac 00:35:09:19:48:05 link up link_announce false mtu 1500
b6425b
b6425b
    $ vdpa dev config show -jp
b6425b
    {
b6425b
        "config": {
b6425b
            "bar": {
b6425b
                "mac": "00:35:09:19:48:05",
b6425b
                "link ": "up",
b6425b
                "link_announce ": false,
b6425b
                "mtu": 1500,
b6425b
            }
b6425b
        }
b6425b
    }
b6425b
b6425b
    Signed-off-by: Parav Pandit <parav@nvidia.com>
b6425b
    Signed-off-by: David Ahern <dsahern@kernel.org>
b6425b
---
b6425b
 man/man8/vdpa-dev.8 |  21 +++++++++
b6425b
 vdpa/vdpa.c         | 110 ++++++++++++++++++++++++++++++++++++++++++++
b6425b
 2 files changed, 131 insertions(+)
b6425b
b6425b
diff --git a/man/man8/vdpa-dev.8 b/man/man8/vdpa-dev.8
b6425b
index 36433519..5d3a3f26 100644
b6425b
--- a/man/man8/vdpa-dev.8
b6425b
+++ b/man/man8/vdpa-dev.8
b6425b
@@ -36,6 +36,10 @@ vdpa-dev \- vdpa device configuration
b6425b
 .B vdpa dev del
b6425b
 .I DEV
b6425b
 
b6425b
+.ti -8
b6425b
+.B vdpa dev config show
b6425b
+.RI "[ " DEV " ]"
b6425b
+
b6425b
 .SH "DESCRIPTION"
b6425b
 .SS vdpa dev show - display vdpa device attributes
b6425b
 
b6425b
@@ -65,6 +69,18 @@ Name of the management device to use for device addition.
b6425b
 .I "DEV"
b6425b
 - specifies the vdpa device to delete.
b6425b
 
b6425b
+.SS vdpa dev config show - Show configuration of specific device or all devices.
b6425b
+
b6425b
+.PP
b6425b
+.I "DEV"
b6425b
+- specifies the vdpa device to show its configuration.
b6425b
+If this argument is omitted all devices configuration is listed.
b6425b
+
b6425b
+.in +4
b6425b
+Format is:
b6425b
+.in +2
b6425b
+VDPA_DEVICE_NAME
b6425b
+
b6425b
 .SH "EXAMPLES"
b6425b
 .PP
b6425b
 vdpa dev show
b6425b
@@ -86,6 +102,11 @@ vdpa dev del foo
b6425b
 .RS 4
b6425b
 Delete the vdpa device named foo which was previously created.
b6425b
 .RE
b6425b
+.PP
b6425b
+vdpa dev config show foo
b6425b
+.RS 4
b6425b
+Shows the vdpa device configuration of device named foo.
b6425b
+.RE
b6425b
 
b6425b
 .SH SEE ALSO
b6425b
 .BR vdpa (8),
b6425b
diff --git a/vdpa/vdpa.c b/vdpa/vdpa.c
b6425b
index 7fdb36b9..ba704254 100644
b6425b
--- a/vdpa/vdpa.c
b6425b
+++ b/vdpa/vdpa.c
b6425b
@@ -6,9 +6,11 @@
b6425b
 #include <linux/genetlink.h>
b6425b
 #include <linux/vdpa.h>
b6425b
 #include <linux/virtio_ids.h>
b6425b
+#include <linux/virtio_net.h>
b6425b
 #include <linux/netlink.h>
b6425b
 #include <libmnl/libmnl.h>
b6425b
 #include "mnl_utils.h"
b6425b
+#include <rt_names.h>
b6425b
 
b6425b
 #include "version.h"
b6425b
 #include "json_print.h"
b6425b
@@ -413,6 +415,7 @@ static void cmd_dev_help(void)
b6425b
 	fprintf(stderr, "Usage: vdpa dev show [ DEV ]\n");
b6425b
 	fprintf(stderr, "       vdpa dev add name NAME mgmtdev MANAGEMENTDEV\n");
b6425b
 	fprintf(stderr, "       vdpa dev del DEV\n");
b6425b
+	fprintf(stderr, "Usage: vdpa dev config COMMAND [ OPTIONS ]\n");
b6425b
 }
b6425b
 
b6425b
 static const char *device_type_name(uint32_t type)
b6425b
@@ -520,6 +523,111 @@ static int cmd_dev_del(struct vdpa *vdpa,  int argc, char **argv)
b6425b
 	return mnlu_gen_socket_sndrcv(&vdpa->nlg, nlh, NULL, NULL);
b6425b
 }
b6425b
 
b6425b
+static void pr_out_dev_net_config(struct nlattr **tb)
b6425b
+{
b6425b
+	SPRINT_BUF(macaddr);
b6425b
+	uint16_t val_u16;
b6425b
+
b6425b
+	if (tb[VDPA_ATTR_DEV_NET_CFG_MACADDR]) {
b6425b
+		const unsigned char *data;
b6425b
+		uint16_t len;
b6425b
+
b6425b
+		len = mnl_attr_get_payload_len(tb[VDPA_ATTR_DEV_NET_CFG_MACADDR]);
b6425b
+		data = mnl_attr_get_payload(tb[VDPA_ATTR_DEV_NET_CFG_MACADDR]);
b6425b
+
b6425b
+		print_string(PRINT_ANY, "mac", "mac %s ",
b6425b
+			     ll_addr_n2a(data, len, 0, macaddr, sizeof(macaddr)));
b6425b
+	}
b6425b
+	if (tb[VDPA_ATTR_DEV_NET_STATUS]) {
b6425b
+		val_u16 = mnl_attr_get_u16(tb[VDPA_ATTR_DEV_NET_STATUS]);
b6425b
+		print_string(PRINT_ANY, "link ", "link %s ",
b6425b
+			     (val_u16 & VIRTIO_NET_S_LINK_UP) ? "up" : "down");
b6425b
+		print_bool(PRINT_ANY, "link_announce ", "link_announce %s ",
b6425b
+			     (val_u16 & VIRTIO_NET_S_ANNOUNCE) ? true : false);
b6425b
+	}
b6425b
+	if (tb[VDPA_ATTR_DEV_NET_CFG_MAX_VQP]) {
b6425b
+		val_u16 = mnl_attr_get_u16(tb[VDPA_ATTR_DEV_NET_CFG_MAX_VQP]);
b6425b
+		print_uint(PRINT_ANY, "max_vq_pairs", "max_vq_pairs %d ",
b6425b
+			     val_u16);
b6425b
+	}
b6425b
+	if (tb[VDPA_ATTR_DEV_NET_CFG_MTU]) {
b6425b
+		val_u16 = mnl_attr_get_u16(tb[VDPA_ATTR_DEV_NET_CFG_MTU]);
b6425b
+		print_uint(PRINT_ANY, "mtu", "mtu %d ", val_u16);
b6425b
+	}
b6425b
+}
b6425b
+
b6425b
+static void pr_out_dev_config(struct vdpa *vdpa, struct nlattr **tb)
b6425b
+{
b6425b
+	uint32_t device_id = mnl_attr_get_u32(tb[VDPA_ATTR_DEV_ID]);
b6425b
+
b6425b
+	pr_out_vdev_handle_start(vdpa, tb);
b6425b
+	switch (device_id) {
b6425b
+	case VIRTIO_ID_NET:
b6425b
+		pr_out_dev_net_config(tb);
b6425b
+		break;
b6425b
+	default:
b6425b
+		break;
b6425b
+	}
b6425b
+	pr_out_vdev_handle_end(vdpa);
b6425b
+}
b6425b
+
b6425b
+static int cmd_dev_config_show_cb(const struct nlmsghdr *nlh, void *data)
b6425b
+{
b6425b
+	struct genlmsghdr *genl = mnl_nlmsg_get_payload(nlh);
b6425b
+	struct nlattr *tb[VDPA_ATTR_MAX + 1] = {};
b6425b
+	struct vdpa *vdpa = data;
b6425b
+
b6425b
+	mnl_attr_parse(nlh, sizeof(*genl), attr_cb, tb);
b6425b
+	if (!tb[VDPA_ATTR_DEV_NAME] || !tb[VDPA_ATTR_DEV_ID])
b6425b
+		return MNL_CB_ERROR;
b6425b
+	pr_out_dev_config(vdpa, tb);
b6425b
+	return MNL_CB_OK;
b6425b
+}
b6425b
+
b6425b
+static int cmd_dev_config_show(struct vdpa *vdpa, int argc, char **argv)
b6425b
+{
b6425b
+	uint16_t flags = NLM_F_REQUEST | NLM_F_ACK;
b6425b
+	struct nlmsghdr *nlh;
b6425b
+	int err;
b6425b
+
b6425b
+	if (argc <= 0)
b6425b
+		flags |= NLM_F_DUMP;
b6425b
+
b6425b
+	nlh = mnlu_gen_socket_cmd_prepare(&vdpa->nlg, VDPA_CMD_DEV_CONFIG_GET,
b6425b
+					  flags);
b6425b
+	if (argc > 0) {
b6425b
+		err = vdpa_argv_parse_put(nlh, vdpa, argc, argv,
b6425b
+					  VDPA_OPT_VDEV_HANDLE);
b6425b
+		if (err)
b6425b
+			return err;
b6425b
+	}
b6425b
+
b6425b
+	pr_out_section_start(vdpa, "config");
b6425b
+	err = mnlu_gen_socket_sndrcv(&vdpa->nlg, nlh, cmd_dev_config_show_cb, vdpa);
b6425b
+	pr_out_section_end(vdpa);
b6425b
+	return err;
b6425b
+}
b6425b
+
b6425b
+static void cmd_dev_config_help(void)
b6425b
+{
b6425b
+	fprintf(stderr, "Usage: vdpa dev config show [ DEV ]\n");
b6425b
+}
b6425b
+
b6425b
+static int cmd_dev_config(struct vdpa *vdpa, int argc, char **argv)
b6425b
+{
b6425b
+	if (!argc)
b6425b
+		return cmd_dev_config_show(vdpa, argc - 1, argv + 1);
b6425b
+
b6425b
+	if (matches(*argv, "help") == 0) {
b6425b
+		cmd_dev_config_help();
b6425b
+		return 0;
b6425b
+	} else if (matches(*argv, "show") == 0) {
b6425b
+		return cmd_dev_config_show(vdpa, argc - 1, argv + 1);
b6425b
+	}
b6425b
+	fprintf(stderr, "Command \"%s\" not found\n", *argv);
b6425b
+	return -ENOENT;
b6425b
+}
b6425b
+
b6425b
 static int cmd_dev(struct vdpa *vdpa, int argc, char **argv)
b6425b
 {
b6425b
 	if (!argc)
b6425b
@@ -535,6 +643,8 @@ static int cmd_dev(struct vdpa *vdpa, int argc, char **argv)
b6425b
 		return cmd_dev_add(vdpa, argc - 1, argv + 1);
b6425b
 	} else if (matches(*argv, "del") == 0) {
b6425b
 		return cmd_dev_del(vdpa, argc - 1, argv + 1);
b6425b
+	} else if (matches(*argv, "config") == 0) {
b6425b
+		return cmd_dev_config(vdpa, argc - 1, argv + 1);
b6425b
 	}
b6425b
 	fprintf(stderr, "Command \"%s\" not found\n", *argv);
b6425b
 	return -ENOENT;
b6425b
-- 
b6425b
2.35.1
b6425b