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
