[ofa-general] [PATCH] infiniband-diags/saquery: attribute names support
Sasha Khapyorsky
sashak at voltaire.com
Tue Jan 8 19:24:02 PST 2008
This let to pass requested via command line SA attribute by name.
Examples:
saquery NodeRecord
saquery NR <lid>
Main motivation for this addition is that I cannot find appropriate free
characters for adding new attributes (specifically PKeyTableRecord and
SL2VLTableRecord - p, P, s, S are used already).
This preserves a command line options currently used for same
purposes.
Signed-off-by: Sasha Khapyorsky <sashak at voltaire.com>
---
infiniband-diags/src/saquery.c | 54 ++++++++++++++++++++++++++++++++++++++-
1 files changed, 52 insertions(+), 2 deletions(-)
diff --git a/infiniband-diags/src/saquery.c b/infiniband-diags/src/saquery.c
index 2017a86..9863860 100644
--- a/infiniband-diags/src/saquery.c
+++ b/infiniband-diags/src/saquery.c
@@ -91,7 +91,6 @@ ib_net16_t requested_lid = 0;
int requested_lid_flag = 0;
ib_net64_t requested_guid = 0;
int requested_guid_flag = 0;
-ib_net16_t query_type = IB_MAD_ATTR_NODE_RECORD;
/**
* Call back for the various record requests.
@@ -1144,12 +1143,46 @@ clean_up(void)
osm_vendor_delete(&vendor);
}
+struct query_cmd {
+ const char *name, *alias;
+ ib_net16_t query_type;
+ int (*handler)(const char *name, osm_bind_handle_t bind_handle,
+ char *from, char *to);
+};
+
+static const struct query_cmd query_cmds[] = {
+ { "ClassPortInfo", "CPI", IB_MAD_ATTR_CLASS_PORT_INFO, },
+ { "NodeRecord", "NR", IB_MAD_ATTR_NODE_RECORD, },
+ { "PortInfoRecord", "PIR", IB_MAD_ATTR_PORTINFO_RECORD, },
+ { "InformInfoRecord", "IIR", IB_MAD_ATTR_INFORM_INFO_RECORD, },
+ { "LinkRecord", "LR", IB_MAD_ATTR_LINK_RECORD, },
+ { "ServiceRecord", "SR", IB_MAD_ATTR_SERVICE_RECORD, },
+ { "PathRecord", "PR", IB_MAD_ATTR_PATH_RECORD, },
+ { "MCMemberRecord", "MCMR", IB_MAD_ATTR_MCMEMBER_RECORD, },
+ { 0 }
+};
+
+static const struct query_cmd *find_query(const char *name)
+{
+ const struct query_cmd *q;
+ unsigned len = strlen(name);
+
+ for (q = query_cmds; q->name; q++)
+ if (!strncasecmp(name, q->name, len) ||
+ (q->alias && !strncasecmp(name, q->alias, len)))
+ return q;
+
+ return NULL;
+}
+
static void
usage(void)
{
+ const struct query_cmd *q;
+
fprintf(stderr, "Usage: %s [-h -d -p -N] [--list | -D] [-S -I -L -l -G"
" -O -U -c -s -g -m --src-to-dst <src:dst> --sgid-to-dgid <src-dst> "
- "-C <ca_name> -P <ca_port> -t(imeout) <msec>] [<name> | <lid> | <guid>]\n",
+ "-C <ca_name> -P <ca_port> -t(imeout) <msec>] [query-name] [<name> | <lid> | <guid>]\n",
argv0);
fprintf(stderr, " Queries node records by default\n");
fprintf(stderr, " -d enable debugging\n");
@@ -1184,6 +1217,12 @@ usage(void)
"response timeout (default %u msec)\n",
DEFAULT_SA_TIMEOUT_MS);
fprintf(stderr, " --node-name-map <node-name-map> specify a node name map\n");
+ fprintf(stderr, "\n Supported query names (and aliases):\n");
+ for (q = query_cmds; q->name; q++)
+ fprintf(stderr, " %s (%s)\n", q->name,
+ q->alias ? q->alias : "");
+ fprintf(stderr, "\n");
+
exit(-1);
}
@@ -1193,10 +1232,12 @@ main(int argc, char **argv)
int ch = 0;
int members = 0;
osm_bind_handle_t bind_handle;
+ const struct query_cmd *q;
char *src = NULL;
char *dst = NULL;
char *sgid = NULL;
char *dgid = NULL;
+ ib_net16_t query_type = 0;
ib_net16_t src_lid;
ib_net16_t dst_lid;
ib_api_status_t status;
@@ -1342,6 +1383,15 @@ main(int argc, char **argv)
argc -= optind;
argv += optind;
+ if (!query_type) {
+ if (!argc || !(q = find_query(argv[0])))
+ query_type = IB_MAD_ATTR_NODE_RECORD;
+ else {
+ query_type = q->query_type;
+ argc--;
+ }
+ }
+
if (argc) {
if (node_print_desc == NAME_OF_LID) {
requested_lid = (ib_net16_t)strtoul(argv[0], NULL, 0);
--
1.5.4.rc2.38.gd6da3
More information about the general
mailing list