]> git.ipfire.org Git - thirdparty/iproute2.git/commitdiff
devlink: print nested devlink handle for devlink dev
authorJiri Pirko <jiri@nvidia.com>
Tue, 7 Nov 2023 08:06:07 +0000 (09:06 +0100)
committerDavid Ahern <dsahern@kernel.org>
Sat, 11 Nov 2023 17:31:40 +0000 (17:31 +0000)
Devlink dev may contain one or more nested devlink instances.
Print them using previously introduced pr_out_nested_handle_obj()
helper.

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
Signed-off-by: David Ahern <dsahern@kernel.org>
devlink/devlink.c

index ae31e7cf34e36b3a5ebacaca57ba5b47bac38b1c..f999e5940c63045472c48903cbb15b19316bdd5b 100644 (file)
@@ -3860,13 +3860,35 @@ static void pr_out_reload_data(struct dl *dl, struct nlattr **tb)
        pr_out_object_end(dl);
 }
 
+static void pr_out_dev_nested(struct dl *dl, const struct nlmsghdr *nlh)
+{
+       int i = 0, count = 0;
+       struct nlattr *attr;
+
+       mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) {
+               if (mnl_attr_get_type(attr) == DEVLINK_ATTR_NESTED_DEVLINK)
+                       count++;
+       }
+       if (!count)
+               return;
+
+       mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) {
+               if (mnl_attr_get_type(attr) != DEVLINK_ATTR_NESTED_DEVLINK)
+                       continue;
+               pr_out_nested_handle_obj(dl, attr, i == 0, i == count - 1);
+               i++;
+       }
+}
 
-static void pr_out_dev(struct dl *dl, struct nlattr **tb)
+static void pr_out_dev(struct dl *dl, const struct nlmsghdr *nlh,
+                      struct nlattr **tb)
 {
        if ((tb[DEVLINK_ATTR_RELOAD_FAILED] && mnl_attr_get_u8(tb[DEVLINK_ATTR_RELOAD_FAILED])) ||
-           (tb[DEVLINK_ATTR_DEV_STATS] && dl->stats)) {
+           (tb[DEVLINK_ATTR_DEV_STATS] && dl->stats) ||
+            tb[DEVLINK_ATTR_NESTED_DEVLINK]) {
                __pr_out_handle_start(dl, tb, true, false);
                pr_out_reload_data(dl, tb);
+               pr_out_dev_nested(dl, nlh);
                pr_out_handle_end(dl);
        } else {
                pr_out_handle(dl, tb);
@@ -3883,7 +3905,7 @@ static int cmd_dev_show_cb(const struct nlmsghdr *nlh, void *data)
        if (!tb[DEVLINK_ATTR_BUS_NAME] || !tb[DEVLINK_ATTR_DEV_NAME])
                return MNL_CB_ERROR;
 
-       pr_out_dev(dl, tb);
+       pr_out_dev(dl, nlh, tb);
        return MNL_CB_OK;
 }
 
@@ -6810,7 +6832,7 @@ static int cmd_mon_show_cb(const struct nlmsghdr *nlh, void *data)
                        return MNL_CB_ERROR;
                pr_out_mon_header(genl->cmd);
                dl->stats = true;
-               pr_out_dev(dl, tb);
+               pr_out_dev(dl, nlh, tb);
                pr_out_mon_footer();
                break;
        case DEVLINK_CMD_PORT_GET: /* fall through */