infiniband-diags: initial port of linux ib diags
[mirror/winof/.git] / tools / infiniband_diags / src / sminfo.c
1 /*\r
2  * Copyright (c) 2004-2008 Voltaire Inc.  All rights reserved.\r
3  *\r
4  * This software is available to you under a choice of one of two\r
5  * licenses.  You may choose to be licensed under the terms of the GNU\r
6  * General Public License (GPL) Version 2, available from the file\r
7  * COPYING in the main directory of this source tree, or the\r
8  * OpenIB.org BSD license below:\r
9  *\r
10  *     Redistribution and use in source and binary forms, with or\r
11  *     without modification, are permitted provided that the following\r
12  *     conditions are met:\r
13  *\r
14  *      - Redistributions of source code must retain the above\r
15  *        copyright notice, this list of conditions and the following\r
16  *        disclaimer.\r
17  *\r
18  *      - Redistributions in binary form must reproduce the above\r
19  *        copyright notice, this list of conditions and the following\r
20  *        disclaimer in the documentation and/or other materials\r
21  *        provided with the distribution.\r
22  *\r
23  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
24  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
25  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
26  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
27  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
28  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
29  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
30  * SOFTWARE.\r
31  *\r
32  */\r
33 \r
34 #if HAVE_CONFIG_H\r
35 #  include <config.h>\r
36 #endif /* HAVE_CONFIG_H */\r
37 \r
38 #include <stdio.h>\r
39 #include <stdlib.h>\r
40 #include <stdarg.h>\r
41 \r
42 #if !defined(_WIN32) \r
43 #include <unistd.h>\r
44 #include <inttypes.h>\r
45 #include <getopt.h>\r
46 #else\r
47 #include "..\..\..\..\etc\user\getopt.c"\r
48 #endif\r
49 \r
50 #include <infiniband/umad.h>\r
51 #include <infiniband/mad.h>\r
52 \r
53 #include "ibdiag_common.h"\r
54 \r
55 static uint8_t sminfo[1024];\r
56 \r
57 char *argv0 = "sminfo";\r
58 \r
59 static void\r
60 usage(void)\r
61 {\r
62         fprintf(stderr, "Usage: %s [-d(ebug) -e(rr_show) -s state -p prio -a activity -D(irect) -G(uid) -V(ersion) -C ca_name -P ca_port "\r
63                         "-t(imeout) timeout_ms] <sm_lid|sm_dr_path> [modifier]\n",\r
64                         argv0);\r
65         exit(-1);\r
66 }\r
67 \r
68 int strdata, xdata=1, bindata;\r
69 enum {\r
70         SMINFO_NOTACT,\r
71         SMINFO_DISCOVER,\r
72         SMINFO_STANDBY,\r
73         SMINFO_MASTER,\r
74 \r
75         SMINFO_STATE_LAST,\r
76 };\r
77 \r
78 char *statestr[] = {\r
79         "SMINFO_NOTACT",\r
80         "SMINFO_DISCOVER",\r
81         "SMINFO_STANDBY",\r
82         "SMINFO_MASTER",\r
83 };\r
84 \r
85 #define STATESTR(s)     (((unsigned int)(s)) < SMINFO_STATE_LAST ? statestr[s] : "???")\r
86 \r
87 int __cdecl\r
88 main(int argc, char **argv)\r
89 {\r
90         int mgmt_classes[3] = {IB_SMI_CLASS, IB_SMI_DIRECT_CLASS, IB_SA_CLASS};\r
91         int mod = 0;\r
92         ib_portid_t portid = {0};\r
93         int timeout = 0;        /* use default */\r
94         uint8_t *p;\r
95         unsigned int act = 0;\r
96         int prio = 0, state = SMINFO_STANDBY;\r
97         uint64_t guid = 0, key = 0;\r
98         extern int ibdebug;\r
99         int dest_type = IB_DEST_LID;\r
100         int udebug = 0;\r
101         char *ca = 0;\r
102         int ca_port = 0;\r
103 \r
104         static char str_opts[] = "C:P:t:s:p:a:deDGVhu";\r
105         static struct option long_opts[] = {\r
106                 { "C", 1, 0, 'C'},\r
107                 { "P", 1, 0, 'P'},\r
108                 { "debug", 0, 0, 'd'},\r
109                 { "err_show", 0, 0, 'e'},\r
110                 { "s", 1, 0, 's'},\r
111                 { "p", 1, 0, 'p'},\r
112                 { "a", 1, 0, 'a'},\r
113                 { "Direct", 0, 0, 'D'},\r
114                 { "Guid", 0, 0, 'G'},\r
115                 { "Version", 0, 0, 'V'},\r
116                 { "timeout", 1, 0, 't'},\r
117                 { "help", 0, 0, 'h'},\r
118                 { "usage", 0, 0, 'u'},\r
119                 { 0 }\r
120         };\r
121 \r
122         argv0 = argv[0];\r
123 \r
124         while (1) {\r
125                 int ch = getopt_long(argc, argv, str_opts, long_opts, NULL);\r
126                 if ( ch == -1 )\r
127                         break;\r
128                 switch(ch) {\r
129                 case 'C':\r
130                         ca = optarg;\r
131                         break;\r
132                 case 'P':\r
133                         ca_port = strtoul(optarg, 0, 0);\r
134                         break;\r
135                 case 'd':\r
136                         ibdebug++;\r
137                         madrpc_show_errors(1);\r
138                         umad_debug(udebug);\r
139                         udebug++;\r
140                         break;\r
141                 case 'e':\r
142                         madrpc_show_errors(1);\r
143                         break;\r
144                 case 'D':\r
145                         dest_type = IB_DEST_DRPATH;\r
146                         break;\r
147                 case 'G':\r
148                         dest_type = IB_DEST_GUID;\r
149                         break;\r
150                 case 't':\r
151                         timeout = strtoul(optarg, 0, 0);\r
152                         madrpc_set_timeout(timeout);\r
153                         break;\r
154                 case 'a':\r
155                         act = strtoul(optarg, 0, 0);\r
156                         break;\r
157                 case 's':\r
158                         state = strtoul(optarg, 0, 0);\r
159                         break;\r
160                 case 'p':\r
161                         prio = strtoul(optarg, 0, 0);\r
162                         break;\r
163                 case 'V':\r
164                         fprintf(stderr, "%s %s\n", argv0, get_build_version() );\r
165                         exit(-1);\r
166                 default:\r
167                         usage();\r
168                         break;\r
169                 }\r
170         }\r
171         argc -= optind;\r
172         argv += optind;\r
173 \r
174         if (argc > 1)\r
175                 mod = atoi(argv[1]);\r
176 \r
177         madrpc_init(ca, ca_port, mgmt_classes, 3);\r
178 \r
179         if (argc) {\r
180                 if (ib_resolve_portid_str(&portid, argv[0], dest_type, 0) < 0)\r
181                         IBERROR("can't resolve destination port %s", argv[0]);\r
182         } else {\r
183                 if (ib_resolve_smlid(&portid, timeout) < 0)\r
184                         IBERROR("can't resolve sm port %s", argv[0]);\r
185         }\r
186 \r
187         mad_encode_field(sminfo, IB_SMINFO_GUID_F, &guid);\r
188         mad_encode_field(sminfo, IB_SMINFO_ACT_F, &act);\r
189         mad_encode_field(sminfo, IB_SMINFO_KEY_F, &key);\r
190         mad_encode_field(sminfo, IB_SMINFO_PRIO_F, &prio);\r
191         mad_encode_field(sminfo, IB_SMINFO_STATE_F, &state);\r
192 \r
193         if (mod) {\r
194                 if (!(p = smp_set(sminfo, &portid, IB_ATTR_SMINFO, mod, timeout)))\r
195                         IBERROR("set");\r
196         } else\r
197                 if (!(p = smp_query(sminfo, &portid, IB_ATTR_SMINFO, 0, timeout)))\r
198                         IBERROR("query");\r
199 \r
200         mad_decode_field(sminfo, IB_SMINFO_GUID_F, &guid);\r
201         mad_decode_field(sminfo, IB_SMINFO_ACT_F, &act);\r
202         mad_decode_field(sminfo, IB_SMINFO_KEY_F, &key);\r
203         mad_decode_field(sminfo, IB_SMINFO_PRIO_F, &prio);\r
204         mad_decode_field(sminfo, IB_SMINFO_STATE_F, &state);\r
205 \r
206         printf("sminfo: sm lid %d sm guid 0x%" PRIx64 ", activity count %u priority %d state %d %s\n",\r
207                 portid.lid, guid, act, prio, state, STATESTR(state));\r
208 \r
209         exit(0);\r
210 }\r