PortInfoRecord query implementation. Alias is "PIR" (case insensitive),
usage is [lid]/[port], all is optional.

Signed-off-by: Sasha Khapyorsky <[email protected]>
---
 infiniband-diags/man/saquery.8 |    2 +-
 infiniband-diags/src/saquery.c |   67 ++++++++++++++++++++++++++++++++++++++-
 2 files changed, 66 insertions(+), 3 deletions(-)

diff --git a/infiniband-diags/man/saquery.8 b/infiniband-diags/man/saquery.8
index 5c75c21..82a5fed 100644
--- a/infiniband-diags/man/saquery.8
+++ b/infiniband-diags/man/saquery.8
@@ -105,7 +105,7 @@ for node name map file format.  Only used with the 
\fB\-O\fR and \fB\-U\fR optio
 Supported query names (and aliases):
  ClassPortInfo (CPI)
  NodeRecord (NR)
- PortInfoRecord (PIR)
+ PortInfoRecord (PIR) [[lid]/[port]]
  SL2VLTableRecord (SL2VL) [[lid]/[in_port]/[out_port]]
  PKeyTableRecord (PKTR) [[lid]/[port]/[block]]
  VLArbitrationTableRecord (VLAR) [[lid]/[port]/[block]]
diff --git a/infiniband-diags/src/saquery.c b/infiniband-diags/src/saquery.c
index e4175c2..1cc4aca 100644
--- a/infiniband-diags/src/saquery.c
+++ b/infiniband-diags/src/saquery.c
@@ -49,6 +49,7 @@
 #define _GNU_SOURCE
 #include <getopt.h>
 
+#include <infiniband/mad.h>
 #include <infiniband/opensm/osm_log.h>
 #include <infiniband/vendor/osm_vendor_api.h>
 #include <infiniband/vendor/osm_vendor_sa_api.h>
@@ -102,6 +103,20 @@ int requested_lid_flag = 0;
 ib_net64_t requested_guid = 0;
 int requested_guid_flag = 0;
 
+static void format_buf(char *in, char *out, unsigned size)
+{
+       unsigned i;
+
+       for (i = 0; i < size - 3 && *in; i++) {
+               *out++ = *in;
+               if (*in++ == '\n' && *in) {
+                       *out++ = '\t';
+                       *out++ = '\t';
+               }
+       }
+       *out = '\0';
+}
+
 /**
  * Call back for the various record requests.
  */
@@ -297,6 +312,25 @@ static void dump_portinfo_record(void *data)
            );
 }
 
+static void dump_one_portinfo_record(void *data)
+{
+       char buf[2048], buf2[4096];
+       ib_portinfo_record_t *pir = data;
+       ib_port_info_t *pi = &pir->port_info;
+
+       mad_dump_portinfo(buf, sizeof(buf), pi, sizeof(*pi));
+
+       format_buf(buf, buf2, sizeof(buf2));
+
+       printf("PortInfoRecord dump:\n"
+               "\tRID:\n"
+               "\t\tEndPortLid..............%u\n"
+               "\t\tPortNum.................0x%x\n"
+               "\t\tReserved................0x%x\n"
+               "\tPortInfo dump:\n\t\t%s",
+               cl_ntoh16(pir->lid), pir->port_num, pir->resv, buf2);
+}
+
 static void dump_multicast_group_record(void *data)
 {
        char gid_str[INET6_ADDRSTRLEN];
@@ -1089,7 +1123,36 @@ static int query_node_records(const struct query_cmd *q,
 static int query_portinfo_records(const struct query_cmd *q,
                                  osm_bind_handle_t h, int argc, char *argv[])
 {
-       return print_issm_records(h);
+       ib_portinfo_record_t pir;
+       ib_net64_t comp_mask = 0;
+       int lid = 0, port = -1;
+       ib_api_status_t status;
+
+       if (argc > 0)
+               parse_lid_and_ports(h, argv[0], &lid, &port, NULL);
+
+       memset(&pir, 0, sizeof(pir));
+
+       if (lid > 0) {
+               pir.lid = cl_hton16(lid);
+               comp_mask |= IB_PIR_COMPMASK_LID;
+       }
+       if (port >= 0) {
+               pir.port_num = cl_hton16(port);
+               comp_mask |= IB_PIR_COMPMASK_PORTNUM;
+       }
+
+       status = get_any_records(h, IB_MAD_ATTR_PORTINFO_RECORD, 0,
+                                comp_mask, &pir,
+                                ib_get_attr_offset(sizeof(pir)), 0);
+
+       if (status != IB_SUCCESS)
+               return status;
+
+       dump_results(&result, dump_one_portinfo_record);
+       return_mad();
+
+       return 0;
 }
 
 static int query_mcmember_records(const struct query_cmd *q,
@@ -1439,7 +1502,7 @@ static const struct query_cmd query_cmds[] = {
        {"NodeRecord", "NR", IB_MAD_ATTR_NODE_RECORD,
         NULL, query_node_records},
        {"PortInfoRecord", "PIR", IB_MAD_ATTR_PORTINFO_RECORD,
-        NULL, query_portinfo_records},
+        "[[lid]/[port]]", query_portinfo_records},
        {"SL2VLTableRecord", "SL2VL", IB_MAD_ATTR_SLVL_RECORD,
         "[[lid]/[in_port]/[out_port]]", query_sl2vl_records},
        {"PKeyTableRecord", "PKTR", IB_MAD_ATTR_PKEY_TBL_RECORD,
-- 
1.6.0.4.766.g6fc4a

_______________________________________________
general mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to