From: Leon Romanovsky <leo...@mellanox.com>

Add parsing interface for the cap_mask

$./rdma/rdma link show mlx5_2/2 cap_mask
3/2: mlx5_2/2: sm off notice off trap on opt_ipd off auto_migr off sl_map on 
mkey_nvram off
        pkey_nvram off led_info off sm_disabled off sys_image_guid on 
pkey_sw_ext_port_trap off
        extended_speeds on cm on snmp_tunnel off reinit off device_mgmt off 
vendor_class on dr_notice off
        cap_mask_notice on boot_mgmt off link_latency off client_reg on 
ip_based_gids on

Signed-off-by: Leon Romanovsky <leo...@mellanox.com>
---
 rdma/link.c  | 74 +++++++++++++++++++++++++++++++++++++++++++++++++-----------
 rdma/rdma.h  |  4 ++++
 rdma/utils.c |  4 ++--
 3 files changed, 67 insertions(+), 15 deletions(-)

diff --git a/rdma/link.c b/rdma/link.c
index e86ff399..e9880914 100644
--- a/rdma/link.c
+++ b/rdma/link.c
@@ -14,13 +14,48 @@
 static int link_help(struct rdma *rd)
 {
        pr_out("Usage: %s link show [ DEV | DEV/PORT ]\n", rd->filename);
+       pr_out("       %s link show [ DEV | DEV/PORT ] cap_mask\n", 
rd->filename);
        pr_out("       %s link set DEV/PORT { type { eth | ib | auto } |\n", 
rd->filename);
        pr_out("                                lb_unicast { on | off } |\n");
        pr_out("                                lb_multicast { on | off } }\n");
        return 0;
 }

-static void dev_one_show(const struct dev_map *dev_map, uint32_t 
port_idx_first, uint32_t port_idx_last)
+static void print_cap_mask(uint32_t cap_mask)
+{
+#define PRINT_PORT_CAP(name, val, offset)              (printf(" %s %s", name, 
(((val) >> (offset))&0x1)?"on":"off"))
+
+       /* Naive copy/paste from include/rdma/ib_verbs.h */
+       PRINT_PORT_CAP("sm", cap_mask, 1);
+       PRINT_PORT_CAP("notice", cap_mask, 2);
+       PRINT_PORT_CAP("trap", cap_mask, 3);
+       PRINT_PORT_CAP("opt_ipd", cap_mask, 4);
+       PRINT_PORT_CAP("auto_migr", cap_mask, 5);
+       PRINT_PORT_CAP("sl_map", cap_mask, 6);
+       PRINT_PORT_CAP("mkey_nvram", cap_mask, 7);
+       printf("\n\t");
+       PRINT_PORT_CAP("pkey_nvram", cap_mask, 8);
+       PRINT_PORT_CAP("led_info", cap_mask, 9);
+       PRINT_PORT_CAP("sm_disabled", cap_mask, 10);
+       PRINT_PORT_CAP("sys_image_guid", cap_mask, 11);
+       PRINT_PORT_CAP("pkey_sw_ext_port_trap", cap_mask, 12);
+       printf("\n\t");
+       PRINT_PORT_CAP("extended_speeds", cap_mask, 14);
+       PRINT_PORT_CAP("cm", cap_mask, 16);
+       PRINT_PORT_CAP("snmp_tunnel", cap_mask, 17);
+       PRINT_PORT_CAP("reinit", cap_mask, 18);
+       PRINT_PORT_CAP("device_mgmt", cap_mask, 19);
+       PRINT_PORT_CAP("vendor_class", cap_mask, 20);
+       PRINT_PORT_CAP("dr_notice", cap_mask, 21);
+       printf("\n\t");
+       PRINT_PORT_CAP("cap_mask_notice", cap_mask, 22);
+       PRINT_PORT_CAP("boot_mgmt", cap_mask, 23);
+       PRINT_PORT_CAP("link_latency", cap_mask, 24);
+       PRINT_PORT_CAP("client_reg", cap_mask, 25);
+       PRINT_PORT_CAP("ip_based_gids", cap_mask, 26);
+}
+static void dev_one_show(struct rdma *rd, const struct dev_map *dev_map,
+                        uint32_t port_idx_first, uint32_t port_idx_last)
 {
        char *nodes[] = { "cap_mask",
                          "lid",
@@ -35,23 +70,36 @@ static void dev_one_show(const struct dev_map *dev_map, 
uint32_t port_idx_first,

        struct port_map *port_map;
        char data[4096];
+       uint32_t cap_mask;
+       bool cap_mask_r = false;
        int i, j;

+       rd_arg_inc(rd);
+       if (rd_argv_match(rd, "cap_mask"))
+               cap_mask_r = true;
+
        for(j = port_idx_first ; j <= port_idx_last; j++) {
                pr_out("%u/%u: %s/%u:", dev_map->idx, j, dev_map->dev_name, j);
-               list_for_each_entry(port_map, &dev_map->port_map_list, list)
-                       if (j == port_map->idx)
-                              printf(" ifname %s", (port_map->ifname)?:"NONE");
+               if (cap_mask_r) {
+                       rdma_sysfs_read_ib(dev_map->dev_name, 1, nodes[0], 
data);
+                       cap_mask = strtoul(data, NULL, 16);
+                       print_cap_mask(cap_mask);
+               }
+               else {
+                       list_for_each_entry(port_map, &dev_map->port_map_list, 
list)
+                               if (j == port_map->idx)
+                                      printf(" ifname %s", 
(port_map->ifname)?:"NONE");

-               for (i = 0 ; nodes[i] ; i++) {
-                       if (rdma_sysfs_read_ib(dev_map->dev_name, j, nodes[i], 
data))
-                               continue;
+                       for (i = 0 ; nodes[i] ; i++) {
+                               if (rdma_sysfs_read_ib(dev_map->dev_name, j, 
nodes[i], data))
+                                       continue;

-                       /* Split line before "phys_state" */
-                       if (!strcmp(nodes[i], "phys_state"))
-                               printf("\n\t");
+                               /* Split line before "phys_state" */
+                               if (!strcmp(nodes[i], "phys_state"))
+                                       printf("\n\t");

-                       pr_out(" %s %s", nodes[i], data);
+                               pr_out(" %s %s", nodes[i], data);
+                       }
                }
                pr_out("\n");
        }
@@ -63,7 +111,7 @@ static int link_show(struct rdma *rd)

        if (rd_no_arg(rd)) {
                list_for_each_entry(dev_map, &rd->dev_map_list, list)
-                       dev_one_show(dev_map, 1, dev_map->num_ports);
+                       dev_one_show(rd, dev_map, 1, dev_map->num_ports);
        }
        else {
                uint32_t port_idx;
@@ -81,7 +129,7 @@ static int link_show(struct rdma *rd)
                        num_ports = dev_map->num_ports;
                }

-               dev_one_show(dev_map, port_idx, num_ports);
+               dev_one_show(rd, dev_map, port_idx, num_ports);
        }
        return 0;
 }
diff --git a/rdma/rdma.h b/rdma/rdma.h
index 11d940d7..12c87048 100644
--- a/rdma/rdma.h
+++ b/rdma/rdma.h
@@ -76,6 +76,10 @@ int obj_monitor(struct rdma *rd);
  */
 bool rd_no_arg(struct rdma *rd);
 uint32_t get_port_from_argv(struct rdma *rd);
+bool rd_no_arg(struct rdma *rd);
+bool rd_argv_match(struct rdma *rd, const char *pattern);
+void rd_arg_inc(struct rdma *rd);
+uint32_t get_port_from_argv(struct rdma *rd);

 int rdma_exec_cmd(struct rdma *rd, const struct rdma_obj *o, const char *str);
 int rdma_sysfs_read_ib(const char *name, int port, const char *field, char 
*res);
diff --git a/rdma/utils.c b/rdma/utils.c
index 568d7c0a..fd5fe77f 100644
--- a/rdma/utils.c
+++ b/rdma/utils.c
@@ -40,14 +40,14 @@ static int strcmpx(const char *str1, const char *str2)
        return strncmp(str1, str2, strlen(str1));
 }

-static bool rd_argv_match(struct rdma *rd, const char *pattern)
+bool rd_argv_match(struct rdma *rd, const char *pattern)
 {
        if (!rd_argc(rd))
                return false;
        return strcmpx(rd_argv(rd), pattern) == 0;
 }

-static void rd_arg_inc(struct rdma *rd)
+void rd_arg_inc(struct rdma *rd)
 {
        if (!rd_argc(rd))
                return;
--
2.12.2

Reply via email to