naccyde / rpms / iproute

Forked from rpms/iproute 5 months ago
Clone

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

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