@@ -1,6 +1,6 @@
include ../Config
-RDMA_OBJ = rdma.o utils.o dev.o
+RDMA_OBJ = rdma.o utils.o dev.o link.o
TARGETS=rdma
all: $(TARGETS) $(LIBS)
new file mode 100644
@@ -0,0 +1,112 @@
+/*
+ * link.c RDMA tool
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ *
+ * Authors: Leon Romanovsky <leonro@mellanox.com>
+ */
+
+#include "rdma.h"
+
+static int link_help(struct rdma *rd)
+{
+ pr_out("Usage: %s link show [ DEV | DEV/PORT ]\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)
+{
+ char *nodes[] = { "cap_mask",
+ "lid",
+ "lid_mask_count",
+ "link_layer",
+ "phys_state",
+ "rate",
+ "sm_lid",
+ "sm_sl",
+ "state",
+ NULL };
+
+ struct port_map *port_map;
+ char data[4096];
+ int i, j;
+
+ 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");
+
+ 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");
+
+ pr_out(" %s %s", nodes[i], data);
+ }
+ pr_out("\n");
+ }
+}
+
+static int link_show(struct rdma *rd)
+{
+ struct dev_map *dev_map;
+
+ 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);
+ }
+ else {
+ uint32_t port_idx;
+ uint32_t num_ports;
+ dev_map = dev_map_lookup(rd, true);
+ port_idx = get_port_from_argv(rd);
+ if (!dev_map || port_idx > dev_map->num_ports) {
+ pr_err("Wrong device name\n");
+ return -EINVAL;
+ }
+ if (port_idx)
+ num_ports = port_idx;
+ else {
+ port_idx = 1;
+ num_ports = dev_map->num_ports;
+ }
+
+ dev_one_show(dev_map, port_idx, num_ports);
+ }
+ return 0;
+}
+
+static int link_set(struct rdma *rd)
+{
+ /* Not supported yet */
+ return 0;
+}
+
+int obj_link(struct rdma *rd)
+{
+ const struct rdma_obj objs[] = {
+ { NULL, link_show },
+ { "show", link_show },
+ { "list", link_show },
+ { "set", link_set },
+ { "help", link_help },
+ { 0 }
+ };
+
+ if (dev_map_init(rd)) {
+ pr_err("There are no RDMA devices\n");
+ return -ENOENT;
+ }
+
+ return rdma_exec_cmd(rd, objs, "link command");
+}
@@ -17,7 +17,7 @@
static void help(char *name)
{
pr_out("Usage: %s [ OPTIONS ] OBJECT { COMMAND | help }\n"
- "where OBJECT := { dev }\n"
+ "where OBJECT := { dev | link }\n"
" OPTIONS := { -V[ersion] }\n", name);
}
@@ -32,6 +32,7 @@ static int rd_cmd(struct rdma *rd)
const struct rdma_obj objs[] = {
{ NULL, obj_help },
{ "dev", obj_dev },
+ { "link", obj_link },
{ "help", obj_help },
{ 0 }
};
@@ -63,6 +63,7 @@ struct rdma_obj {
* Command interfaces
*/
int obj_dev(struct rdma *rd);
+int obj_link(struct rdma *rd);
/*
* Parser interface