1*d6b92ffaSHans Petter Selasky /*
2*d6b92ffaSHans Petter Selasky * Copyright (c) 2006,2007 The Regents of the University of California.
3*d6b92ffaSHans Petter Selasky * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved.
4*d6b92ffaSHans Petter Selasky * Copyright (c) 2002-2013 Mellanox Technologies LTD. All rights reserved.
5*d6b92ffaSHans Petter Selasky * Copyright (c) 1996-2013 Intel Corporation. All rights reserved.
6*d6b92ffaSHans Petter Selasky * Copyright (c) 2009 HNR Consulting. All rights reserved.
7*d6b92ffaSHans Petter Selasky *
8*d6b92ffaSHans Petter Selasky * Produced at Lawrence Livermore National Laboratory.
9*d6b92ffaSHans Petter Selasky * Written by Ira Weiny <weiny2@llnl.gov>.
10*d6b92ffaSHans Petter Selasky *
11*d6b92ffaSHans Petter Selasky * This software is available to you under a choice of one of two
12*d6b92ffaSHans Petter Selasky * licenses. You may choose to be licensed under the terms of the GNU
13*d6b92ffaSHans Petter Selasky * General Public License (GPL) Version 2, available from the file
14*d6b92ffaSHans Petter Selasky * COPYING in the main directory of this source tree, or the
15*d6b92ffaSHans Petter Selasky * OpenIB.org BSD license below:
16*d6b92ffaSHans Petter Selasky *
17*d6b92ffaSHans Petter Selasky * Redistribution and use in source and binary forms, with or
18*d6b92ffaSHans Petter Selasky * without modification, are permitted provided that the following
19*d6b92ffaSHans Petter Selasky * conditions are met:
20*d6b92ffaSHans Petter Selasky *
21*d6b92ffaSHans Petter Selasky * - Redistributions of source code must retain the above
22*d6b92ffaSHans Petter Selasky * copyright notice, this list of conditions and the following
23*d6b92ffaSHans Petter Selasky * disclaimer.
24*d6b92ffaSHans Petter Selasky *
25*d6b92ffaSHans Petter Selasky * - Redistributions in binary form must reproduce the above
26*d6b92ffaSHans Petter Selasky * copyright notice, this list of conditions and the following
27*d6b92ffaSHans Petter Selasky * disclaimer in the documentation and/or other materials
28*d6b92ffaSHans Petter Selasky * provided with the distribution.
29*d6b92ffaSHans Petter Selasky *
30*d6b92ffaSHans Petter Selasky * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
31*d6b92ffaSHans Petter Selasky * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
32*d6b92ffaSHans Petter Selasky * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
33*d6b92ffaSHans Petter Selasky * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
34*d6b92ffaSHans Petter Selasky * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
35*d6b92ffaSHans Petter Selasky * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
36*d6b92ffaSHans Petter Selasky * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
37*d6b92ffaSHans Petter Selasky * SOFTWARE.
38*d6b92ffaSHans Petter Selasky *
39*d6b92ffaSHans Petter Selasky */
40*d6b92ffaSHans Petter Selasky
41*d6b92ffaSHans Petter Selasky #if HAVE_CONFIG_H
42*d6b92ffaSHans Petter Selasky # include <config.h>
43*d6b92ffaSHans Petter Selasky #endif /* HAVE_CONFIG_H */
44*d6b92ffaSHans Petter Selasky
45*d6b92ffaSHans Petter Selasky #include <unistd.h>
46*d6b92ffaSHans Petter Selasky #include <stdio.h>
47*d6b92ffaSHans Petter Selasky #include <arpa/inet.h>
48*d6b92ffaSHans Petter Selasky #include <ctype.h>
49*d6b92ffaSHans Petter Selasky #include <string.h>
50*d6b92ffaSHans Petter Selasky #include <errno.h>
51*d6b92ffaSHans Petter Selasky
52*d6b92ffaSHans Petter Selasky #define _GNU_SOURCE
53*d6b92ffaSHans Petter Selasky #include <getopt.h>
54*d6b92ffaSHans Petter Selasky
55*d6b92ffaSHans Petter Selasky #include <infiniband/umad.h>
56*d6b92ffaSHans Petter Selasky #include <infiniband/mad.h>
57*d6b92ffaSHans Petter Selasky #include <iba/ib_types.h>
58*d6b92ffaSHans Petter Selasky #include <complib/cl_nodenamemap.h>
59*d6b92ffaSHans Petter Selasky
60*d6b92ffaSHans Petter Selasky #include "ibdiag_common.h"
61*d6b92ffaSHans Petter Selasky #include "ibdiag_sa.h"
62*d6b92ffaSHans Petter Selasky
63*d6b92ffaSHans Petter Selasky #ifndef IB_PR_COMPMASK_SERVICEID
64*d6b92ffaSHans Petter Selasky #define IB_PR_COMPMASK_SERVICEID (IB_PR_COMPMASK_SERVICEID_MSB | \
65*d6b92ffaSHans Petter Selasky IB_PR_COMPMASK_SERVICEID_LSB)
66*d6b92ffaSHans Petter Selasky #endif
67*d6b92ffaSHans Petter Selasky
68*d6b92ffaSHans Petter Selasky #define UMAD_SA_CAP_MASK2_IS_MCAST_TOP_SUP (1 << 3)
69*d6b92ffaSHans Petter Selasky
70*d6b92ffaSHans Petter Selasky struct query_params {
71*d6b92ffaSHans Petter Selasky uint64_t service_id;
72*d6b92ffaSHans Petter Selasky ib_gid_t sgid, dgid, gid, mgid;
73*d6b92ffaSHans Petter Selasky uint16_t slid, dlid, mlid;
74*d6b92ffaSHans Petter Selasky uint32_t flow_label;
75*d6b92ffaSHans Petter Selasky int hop_limit;
76*d6b92ffaSHans Petter Selasky uint8_t tclass;
77*d6b92ffaSHans Petter Selasky int reversible, numb_path;
78*d6b92ffaSHans Petter Selasky uint16_t pkey;
79*d6b92ffaSHans Petter Selasky int qos_class, sl;
80*d6b92ffaSHans Petter Selasky uint8_t mtu, rate, pkt_life;
81*d6b92ffaSHans Petter Selasky uint32_t qkey;
82*d6b92ffaSHans Petter Selasky uint8_t scope;
83*d6b92ffaSHans Petter Selasky uint8_t join_state;
84*d6b92ffaSHans Petter Selasky int proxy_join;
85*d6b92ffaSHans Petter Selasky ib_class_port_info_t cpi;
86*d6b92ffaSHans Petter Selasky uint8_t with_grh;
87*d6b92ffaSHans Petter Selasky ibmad_gid_t sa_dgid;
88*d6b92ffaSHans Petter Selasky };
89*d6b92ffaSHans Petter Selasky
90*d6b92ffaSHans Petter Selasky struct query_cmd {
91*d6b92ffaSHans Petter Selasky const char *name, *alias;
92*d6b92ffaSHans Petter Selasky uint16_t query_type;
93*d6b92ffaSHans Petter Selasky const char *usage;
94*d6b92ffaSHans Petter Selasky int (*handler) (const struct query_cmd * q, struct sa_handle * h,
95*d6b92ffaSHans Petter Selasky struct query_params * p, int argc, char *argv[]);
96*d6b92ffaSHans Petter Selasky };
97*d6b92ffaSHans Petter Selasky
98*d6b92ffaSHans Petter Selasky static char *node_name_map_file = NULL;
99*d6b92ffaSHans Petter Selasky static nn_map_t *node_name_map = NULL;
100*d6b92ffaSHans Petter Selasky
101*d6b92ffaSHans Petter Selasky /**
102*d6b92ffaSHans Petter Selasky * Declare some globals because I don't want this to be too complex.
103*d6b92ffaSHans Petter Selasky */
104*d6b92ffaSHans Petter Selasky #define MAX_PORTS (8)
105*d6b92ffaSHans Petter Selasky #define DEFAULT_SA_TIMEOUT_MS (1000)
106*d6b92ffaSHans Petter Selasky
107*d6b92ffaSHans Petter Selasky enum {
108*d6b92ffaSHans Petter Selasky ALL,
109*d6b92ffaSHans Petter Selasky LID_ONLY,
110*d6b92ffaSHans Petter Selasky UNIQUE_LID_ONLY,
111*d6b92ffaSHans Petter Selasky GUID_ONLY,
112*d6b92ffaSHans Petter Selasky ALL_DESC,
113*d6b92ffaSHans Petter Selasky NAME_OF_LID,
114*d6b92ffaSHans Petter Selasky NAME_OF_GUID,
115*d6b92ffaSHans Petter Selasky } node_print_desc = ALL;
116*d6b92ffaSHans Petter Selasky
117*d6b92ffaSHans Petter Selasky char *requested_name = NULL;
118*d6b92ffaSHans Petter Selasky uint16_t requested_lid = 0;
119*d6b92ffaSHans Petter Selasky int requested_lid_flag = 0;
120*d6b92ffaSHans Petter Selasky uint64_t requested_guid = 0;
121*d6b92ffaSHans Petter Selasky int requested_guid_flag = 0;
122*d6b92ffaSHans Petter Selasky
valid_gid(ib_gid_t * gid)123*d6b92ffaSHans Petter Selasky static unsigned valid_gid(ib_gid_t * gid)
124*d6b92ffaSHans Petter Selasky {
125*d6b92ffaSHans Petter Selasky ib_gid_t zero_gid;
126*d6b92ffaSHans Petter Selasky memset(&zero_gid, 0, sizeof zero_gid);
127*d6b92ffaSHans Petter Selasky return memcmp(&zero_gid, gid, sizeof(*gid));
128*d6b92ffaSHans Petter Selasky }
129*d6b92ffaSHans Petter Selasky
print_node_desc(ib_node_record_t * node_record)130*d6b92ffaSHans Petter Selasky static void print_node_desc(ib_node_record_t * node_record)
131*d6b92ffaSHans Petter Selasky {
132*d6b92ffaSHans Petter Selasky ib_node_info_t *p_ni = &(node_record->node_info);
133*d6b92ffaSHans Petter Selasky ib_node_desc_t *p_nd = &(node_record->node_desc);
134*d6b92ffaSHans Petter Selasky char *name;
135*d6b92ffaSHans Petter Selasky
136*d6b92ffaSHans Petter Selasky if (p_ni->node_type == IB_NODE_TYPE_CA) {
137*d6b92ffaSHans Petter Selasky name = remap_node_name(node_name_map,
138*d6b92ffaSHans Petter Selasky node_record->node_info.node_guid,
139*d6b92ffaSHans Petter Selasky (char *)p_nd->description);
140*d6b92ffaSHans Petter Selasky printf("%6d \"%s\"\n", cl_ntoh16(node_record->lid), name);
141*d6b92ffaSHans Petter Selasky free(name);
142*d6b92ffaSHans Petter Selasky }
143*d6b92ffaSHans Petter Selasky }
144*d6b92ffaSHans Petter Selasky
dump_node_record(void * data,struct query_params * p)145*d6b92ffaSHans Petter Selasky static void dump_node_record(void *data, struct query_params *p)
146*d6b92ffaSHans Petter Selasky {
147*d6b92ffaSHans Petter Selasky ib_node_record_t *nr = data;
148*d6b92ffaSHans Petter Selasky ib_node_info_t *ni = &nr->node_info;
149*d6b92ffaSHans Petter Selasky char *name = remap_node_name(node_name_map,
150*d6b92ffaSHans Petter Selasky cl_ntoh64(ni->node_guid),
151*d6b92ffaSHans Petter Selasky (char *)nr->node_desc.description);
152*d6b92ffaSHans Petter Selasky
153*d6b92ffaSHans Petter Selasky printf("NodeRecord dump:\n"
154*d6b92ffaSHans Petter Selasky "\t\tlid.....................%u\n"
155*d6b92ffaSHans Petter Selasky "\t\treserved................0x%X\n"
156*d6b92ffaSHans Petter Selasky "\t\tbase_version............0x%X\n"
157*d6b92ffaSHans Petter Selasky "\t\tclass_version...........0x%X\n"
158*d6b92ffaSHans Petter Selasky "\t\tnode_type...............%s\n"
159*d6b92ffaSHans Petter Selasky "\t\tnum_ports...............%u\n"
160*d6b92ffaSHans Petter Selasky "\t\tsys_guid................0x%016" PRIx64 "\n"
161*d6b92ffaSHans Petter Selasky "\t\tnode_guid...............0x%016" PRIx64 "\n"
162*d6b92ffaSHans Petter Selasky "\t\tport_guid...............0x%016" PRIx64 "\n"
163*d6b92ffaSHans Petter Selasky "\t\tpartition_cap...........0x%X\n"
164*d6b92ffaSHans Petter Selasky "\t\tdevice_id...............0x%X\n"
165*d6b92ffaSHans Petter Selasky "\t\trevision................0x%X\n"
166*d6b92ffaSHans Petter Selasky "\t\tport_num................%u\n"
167*d6b92ffaSHans Petter Selasky "\t\tvendor_id...............0x%X\n"
168*d6b92ffaSHans Petter Selasky "\t\tNodeDescription.........%s\n",
169*d6b92ffaSHans Petter Selasky cl_ntoh16(nr->lid), cl_ntoh16(nr->resv),
170*d6b92ffaSHans Petter Selasky ni->base_version, ni->class_version,
171*d6b92ffaSHans Petter Selasky ib_get_node_type_str(ni->node_type), ni->num_ports,
172*d6b92ffaSHans Petter Selasky cl_ntoh64(ni->sys_guid), cl_ntoh64(ni->node_guid),
173*d6b92ffaSHans Petter Selasky cl_ntoh64(ni->port_guid), cl_ntoh16(ni->partition_cap),
174*d6b92ffaSHans Petter Selasky cl_ntoh16(ni->device_id), cl_ntoh32(ni->revision),
175*d6b92ffaSHans Petter Selasky ib_node_info_get_local_port_num(ni),
176*d6b92ffaSHans Petter Selasky cl_ntoh32(ib_node_info_get_vendor_id(ni)),
177*d6b92ffaSHans Petter Selasky name);
178*d6b92ffaSHans Petter Selasky
179*d6b92ffaSHans Petter Selasky free(name);
180*d6b92ffaSHans Petter Selasky }
181*d6b92ffaSHans Petter Selasky
print_node_record(ib_node_record_t * node_record)182*d6b92ffaSHans Petter Selasky static void print_node_record(ib_node_record_t * node_record)
183*d6b92ffaSHans Petter Selasky {
184*d6b92ffaSHans Petter Selasky ib_node_info_t *p_ni = &node_record->node_info;
185*d6b92ffaSHans Petter Selasky ib_node_desc_t *p_nd = &node_record->node_desc;
186*d6b92ffaSHans Petter Selasky char *name;
187*d6b92ffaSHans Petter Selasky
188*d6b92ffaSHans Petter Selasky switch (node_print_desc) {
189*d6b92ffaSHans Petter Selasky case LID_ONLY:
190*d6b92ffaSHans Petter Selasky case UNIQUE_LID_ONLY:
191*d6b92ffaSHans Petter Selasky printf("%u\n", cl_ntoh16(node_record->lid));
192*d6b92ffaSHans Petter Selasky return;
193*d6b92ffaSHans Petter Selasky case GUID_ONLY:
194*d6b92ffaSHans Petter Selasky printf("0x%016" PRIx64 "\n", cl_ntoh64(p_ni->port_guid));
195*d6b92ffaSHans Petter Selasky return;
196*d6b92ffaSHans Petter Selasky case NAME_OF_LID:
197*d6b92ffaSHans Petter Selasky case NAME_OF_GUID:
198*d6b92ffaSHans Petter Selasky name = remap_node_name(node_name_map,
199*d6b92ffaSHans Petter Selasky cl_ntoh64(p_ni->node_guid),
200*d6b92ffaSHans Petter Selasky (char *)p_nd->description);
201*d6b92ffaSHans Petter Selasky printf("%s\n", name);
202*d6b92ffaSHans Petter Selasky free(name);
203*d6b92ffaSHans Petter Selasky return;
204*d6b92ffaSHans Petter Selasky case ALL:
205*d6b92ffaSHans Petter Selasky default:
206*d6b92ffaSHans Petter Selasky break;
207*d6b92ffaSHans Petter Selasky }
208*d6b92ffaSHans Petter Selasky
209*d6b92ffaSHans Petter Selasky dump_node_record(node_record, 0);
210*d6b92ffaSHans Petter Selasky }
211*d6b92ffaSHans Petter Selasky
dump_path_record(void * data,struct query_params * p)212*d6b92ffaSHans Petter Selasky static void dump_path_record(void *data, struct query_params *p)
213*d6b92ffaSHans Petter Selasky {
214*d6b92ffaSHans Petter Selasky char gid_str[INET6_ADDRSTRLEN];
215*d6b92ffaSHans Petter Selasky char gid_str2[INET6_ADDRSTRLEN];
216*d6b92ffaSHans Petter Selasky ib_path_rec_t *p_pr = data;
217*d6b92ffaSHans Petter Selasky printf("PathRecord dump:\n"
218*d6b92ffaSHans Petter Selasky "\t\tservice_id..............0x%016" PRIx64 "\n"
219*d6b92ffaSHans Petter Selasky "\t\tdgid....................%s\n"
220*d6b92ffaSHans Petter Selasky "\t\tsgid....................%s\n"
221*d6b92ffaSHans Petter Selasky "\t\tdlid....................%u\n"
222*d6b92ffaSHans Petter Selasky "\t\tslid....................%u\n"
223*d6b92ffaSHans Petter Selasky "\t\thop_flow_raw............0x%X\n"
224*d6b92ffaSHans Petter Selasky "\t\ttclass..................0x%X\n"
225*d6b92ffaSHans Petter Selasky "\t\tnum_path_revers.........0x%X\n"
226*d6b92ffaSHans Petter Selasky "\t\tpkey....................0x%X\n"
227*d6b92ffaSHans Petter Selasky "\t\tqos_class...............0x%X\n"
228*d6b92ffaSHans Petter Selasky "\t\tsl......................0x%X\n"
229*d6b92ffaSHans Petter Selasky "\t\tmtu.....................0x%X\n"
230*d6b92ffaSHans Petter Selasky "\t\trate....................0x%X\n"
231*d6b92ffaSHans Petter Selasky "\t\tpkt_life................0x%X\n"
232*d6b92ffaSHans Petter Selasky "\t\tpreference..............0x%X\n"
233*d6b92ffaSHans Petter Selasky "\t\tresv2...................0x%02X%02X%02X%02X%02X%02X\n",
234*d6b92ffaSHans Petter Selasky cl_ntoh64(p_pr->service_id),
235*d6b92ffaSHans Petter Selasky inet_ntop(AF_INET6, p_pr->dgid.raw, gid_str, sizeof gid_str),
236*d6b92ffaSHans Petter Selasky inet_ntop(AF_INET6, p_pr->sgid.raw, gid_str2, sizeof gid_str2),
237*d6b92ffaSHans Petter Selasky cl_ntoh16(p_pr->dlid), cl_ntoh16(p_pr->slid),
238*d6b92ffaSHans Petter Selasky cl_ntoh32(p_pr->hop_flow_raw), p_pr->tclass, p_pr->num_path,
239*d6b92ffaSHans Petter Selasky cl_ntoh16(p_pr->pkey), ib_path_rec_qos_class(p_pr),
240*d6b92ffaSHans Petter Selasky ib_path_rec_sl(p_pr), p_pr->mtu, p_pr->rate, p_pr->pkt_life,
241*d6b92ffaSHans Petter Selasky p_pr->preference,
242*d6b92ffaSHans Petter Selasky p_pr->resv2[0], p_pr->resv2[1], p_pr->resv2[2],
243*d6b92ffaSHans Petter Selasky p_pr->resv2[3], p_pr->resv2[4], p_pr->resv2[5]);
244*d6b92ffaSHans Petter Selasky }
245*d6b92ffaSHans Petter Selasky
dump_class_port_info(ib_class_port_info_t * cpi)246*d6b92ffaSHans Petter Selasky static void dump_class_port_info(ib_class_port_info_t *cpi)
247*d6b92ffaSHans Petter Selasky {
248*d6b92ffaSHans Petter Selasky char gid_str[INET6_ADDRSTRLEN];
249*d6b92ffaSHans Petter Selasky char gid_str2[INET6_ADDRSTRLEN];
250*d6b92ffaSHans Petter Selasky
251*d6b92ffaSHans Petter Selasky printf("SA ClassPortInfo:\n"
252*d6b92ffaSHans Petter Selasky "\t\tBase version.............%d\n"
253*d6b92ffaSHans Petter Selasky "\t\tClass version............%d\n"
254*d6b92ffaSHans Petter Selasky "\t\tCapability mask..........0x%04X\n"
255*d6b92ffaSHans Petter Selasky "\t\tCapability mask 2........0x%08X\n"
256*d6b92ffaSHans Petter Selasky "\t\tResponse time value......0x%02X\n"
257*d6b92ffaSHans Petter Selasky "\t\tRedirect GID.............%s\n"
258*d6b92ffaSHans Petter Selasky "\t\tRedirect TC/SL/FL........0x%08X\n"
259*d6b92ffaSHans Petter Selasky "\t\tRedirect LID.............%u\n"
260*d6b92ffaSHans Petter Selasky "\t\tRedirect PKey............0x%04X\n"
261*d6b92ffaSHans Petter Selasky "\t\tRedirect QP..............0x%08X\n"
262*d6b92ffaSHans Petter Selasky "\t\tRedirect QKey............0x%08X\n"
263*d6b92ffaSHans Petter Selasky "\t\tTrap GID.................%s\n"
264*d6b92ffaSHans Petter Selasky "\t\tTrap TC/SL/FL............0x%08X\n"
265*d6b92ffaSHans Petter Selasky "\t\tTrap LID.................%u\n"
266*d6b92ffaSHans Petter Selasky "\t\tTrap PKey................0x%04X\n"
267*d6b92ffaSHans Petter Selasky "\t\tTrap HL/QP...............0x%08X\n"
268*d6b92ffaSHans Petter Selasky "\t\tTrap QKey................0x%08X\n",
269*d6b92ffaSHans Petter Selasky cpi->base_ver, cpi->class_ver, cl_ntoh16(cpi->cap_mask),
270*d6b92ffaSHans Petter Selasky ib_class_cap_mask2(cpi), ib_class_resp_time_val(cpi),
271*d6b92ffaSHans Petter Selasky inet_ntop(AF_INET6, &(cpi->redir_gid), gid_str, sizeof gid_str),
272*d6b92ffaSHans Petter Selasky cl_ntoh32(cpi->redir_tc_sl_fl), cl_ntoh16(cpi->redir_lid),
273*d6b92ffaSHans Petter Selasky cl_ntoh16(cpi->redir_pkey), cl_ntoh32(cpi->redir_qp),
274*d6b92ffaSHans Petter Selasky cl_ntoh32(cpi->redir_qkey),
275*d6b92ffaSHans Petter Selasky inet_ntop(AF_INET6, &(cpi->trap_gid), gid_str2, sizeof gid_str2),
276*d6b92ffaSHans Petter Selasky cl_ntoh32(cpi->trap_tc_sl_fl), cl_ntoh16(cpi->trap_lid),
277*d6b92ffaSHans Petter Selasky cl_ntoh16(cpi->trap_pkey), cl_ntoh32(cpi->trap_hop_qp),
278*d6b92ffaSHans Petter Selasky cl_ntoh32(cpi->trap_qkey));
279*d6b92ffaSHans Petter Selasky }
280*d6b92ffaSHans Petter Selasky
dump_portinfo_record(void * data,struct query_params * p)281*d6b92ffaSHans Petter Selasky static void dump_portinfo_record(void *data, struct query_params *p)
282*d6b92ffaSHans Petter Selasky {
283*d6b92ffaSHans Petter Selasky ib_portinfo_record_t *p_pir = data;
284*d6b92ffaSHans Petter Selasky const ib_port_info_t *const p_pi = &p_pir->port_info;
285*d6b92ffaSHans Petter Selasky
286*d6b92ffaSHans Petter Selasky printf("PortInfoRecord dump:\n"
287*d6b92ffaSHans Petter Selasky "\t\tEndPortLid..............%u\n"
288*d6b92ffaSHans Petter Selasky "\t\tPortNum.................%u\n"
289*d6b92ffaSHans Petter Selasky "\t\tbase_lid................%u\n"
290*d6b92ffaSHans Petter Selasky "\t\tmaster_sm_base_lid......%u\n"
291*d6b92ffaSHans Petter Selasky "\t\tcapability_mask.........0x%X\n",
292*d6b92ffaSHans Petter Selasky cl_ntoh16(p_pir->lid), p_pir->port_num,
293*d6b92ffaSHans Petter Selasky cl_ntoh16(p_pi->base_lid), cl_ntoh16(p_pi->master_sm_base_lid),
294*d6b92ffaSHans Petter Selasky cl_ntoh32(p_pi->capability_mask));
295*d6b92ffaSHans Petter Selasky }
296*d6b92ffaSHans Petter Selasky
dump_one_portinfo_record(void * data,struct query_params * p)297*d6b92ffaSHans Petter Selasky static void dump_one_portinfo_record(void *data, struct query_params *p)
298*d6b92ffaSHans Petter Selasky {
299*d6b92ffaSHans Petter Selasky ib_portinfo_record_t *pir = data;
300*d6b92ffaSHans Petter Selasky ib_port_info_t *pi = &pir->port_info;
301*d6b92ffaSHans Petter Selasky
302*d6b92ffaSHans Petter Selasky printf("PortInfoRecord dump:\n"
303*d6b92ffaSHans Petter Selasky "\tRID\n"
304*d6b92ffaSHans Petter Selasky "\t\tEndPortLid..............%u\n"
305*d6b92ffaSHans Petter Selasky "\t\tPortNum.................%u\n"
306*d6b92ffaSHans Petter Selasky "\t\tOptions.................0x%x\n"
307*d6b92ffaSHans Petter Selasky "\tPortInfo dump:\n",
308*d6b92ffaSHans Petter Selasky cl_ntoh16(pir->lid), pir->port_num, pir->options);
309*d6b92ffaSHans Petter Selasky dump_portinfo(pi, 2);
310*d6b92ffaSHans Petter Selasky }
311*d6b92ffaSHans Petter Selasky
dump_one_mcmember_record(void * data,struct query_params * p)312*d6b92ffaSHans Petter Selasky static void dump_one_mcmember_record(void *data, struct query_params *p)
313*d6b92ffaSHans Petter Selasky {
314*d6b92ffaSHans Petter Selasky char mgid[INET6_ADDRSTRLEN], gid[INET6_ADDRSTRLEN];
315*d6b92ffaSHans Petter Selasky ib_member_rec_t *mr = data;
316*d6b92ffaSHans Petter Selasky uint32_t flow;
317*d6b92ffaSHans Petter Selasky uint8_t sl, hop, scope, join;
318*d6b92ffaSHans Petter Selasky ib_member_get_sl_flow_hop(mr->sl_flow_hop, &sl, &flow, &hop);
319*d6b92ffaSHans Petter Selasky ib_member_get_scope_state(mr->scope_state, &scope, &join);
320*d6b92ffaSHans Petter Selasky printf("MCMember Record dump:\n"
321*d6b92ffaSHans Petter Selasky "\t\tMGID....................%s\n"
322*d6b92ffaSHans Petter Selasky "\t\tPortGid.................%s\n"
323*d6b92ffaSHans Petter Selasky "\t\tqkey....................0x%x\n"
324*d6b92ffaSHans Petter Selasky "\t\tmlid....................0x%x\n"
325*d6b92ffaSHans Petter Selasky "\t\tmtu.....................0x%x\n"
326*d6b92ffaSHans Petter Selasky "\t\tTClass..................0x%x\n"
327*d6b92ffaSHans Petter Selasky "\t\tpkey....................0x%x\n"
328*d6b92ffaSHans Petter Selasky "\t\trate....................0x%x\n"
329*d6b92ffaSHans Petter Selasky "\t\tpkt_life................0x%x\n"
330*d6b92ffaSHans Petter Selasky "\t\tSL......................0x%x\n"
331*d6b92ffaSHans Petter Selasky "\t\tFlowLabel...............0x%x\n"
332*d6b92ffaSHans Petter Selasky "\t\tHopLimit................0x%x\n"
333*d6b92ffaSHans Petter Selasky "\t\tScope...................0x%x\n"
334*d6b92ffaSHans Petter Selasky "\t\tJoinState...............0x%x\n"
335*d6b92ffaSHans Petter Selasky "\t\tProxyJoin...............0x%x\n",
336*d6b92ffaSHans Petter Selasky inet_ntop(AF_INET6, mr->mgid.raw, mgid, sizeof(mgid)),
337*d6b92ffaSHans Petter Selasky inet_ntop(AF_INET6, mr->port_gid.raw, gid, sizeof(gid)),
338*d6b92ffaSHans Petter Selasky cl_ntoh32(mr->qkey), cl_ntoh16(mr->mlid), mr->mtu, mr->tclass,
339*d6b92ffaSHans Petter Selasky cl_ntoh16(mr->pkey), mr->rate, mr->pkt_life, sl,
340*d6b92ffaSHans Petter Selasky flow, hop, scope, join, mr->proxy_join);
341*d6b92ffaSHans Petter Selasky }
342*d6b92ffaSHans Petter Selasky
dump_multicast_group_record(void * data,struct query_params * p)343*d6b92ffaSHans Petter Selasky static void dump_multicast_group_record(void *data, struct query_params *p)
344*d6b92ffaSHans Petter Selasky {
345*d6b92ffaSHans Petter Selasky char gid_str[INET6_ADDRSTRLEN];
346*d6b92ffaSHans Petter Selasky ib_member_rec_t *p_mcmr = data;
347*d6b92ffaSHans Petter Selasky uint8_t sl;
348*d6b92ffaSHans Petter Selasky ib_member_get_sl_flow_hop(p_mcmr->sl_flow_hop, &sl, NULL, NULL);
349*d6b92ffaSHans Petter Selasky printf("MCMemberRecord group dump:\n"
350*d6b92ffaSHans Petter Selasky "\t\tMGID....................%s\n"
351*d6b92ffaSHans Petter Selasky "\t\tMlid....................0x%X\n"
352*d6b92ffaSHans Petter Selasky "\t\tMtu.....................0x%X\n"
353*d6b92ffaSHans Petter Selasky "\t\tpkey....................0x%X\n"
354*d6b92ffaSHans Petter Selasky "\t\tRate....................0x%X\n"
355*d6b92ffaSHans Petter Selasky "\t\tSL......................0x%X\n",
356*d6b92ffaSHans Petter Selasky inet_ntop(AF_INET6, p_mcmr->mgid.raw, gid_str, sizeof gid_str),
357*d6b92ffaSHans Petter Selasky cl_ntoh16(p_mcmr->mlid),
358*d6b92ffaSHans Petter Selasky p_mcmr->mtu, cl_ntoh16(p_mcmr->pkey), p_mcmr->rate, sl);
359*d6b92ffaSHans Petter Selasky }
360*d6b92ffaSHans Petter Selasky
dump_multicast_member_record(ib_member_rec_t * p_mcmr,struct sa_query_result * nr_result,struct query_params * params)361*d6b92ffaSHans Petter Selasky static void dump_multicast_member_record(ib_member_rec_t *p_mcmr,
362*d6b92ffaSHans Petter Selasky struct sa_query_result *nr_result,
363*d6b92ffaSHans Petter Selasky struct query_params *params)
364*d6b92ffaSHans Petter Selasky {
365*d6b92ffaSHans Petter Selasky char gid_str[INET6_ADDRSTRLEN];
366*d6b92ffaSHans Petter Selasky char gid_str2[INET6_ADDRSTRLEN];
367*d6b92ffaSHans Petter Selasky uint16_t mlid = cl_ntoh16(p_mcmr->mlid);
368*d6b92ffaSHans Petter Selasky unsigned i = 0;
369*d6b92ffaSHans Petter Selasky char *node_name = strdup("<unknown>");
370*d6b92ffaSHans Petter Selasky
371*d6b92ffaSHans Petter Selasky /* go through the node records searching for a port guid which matches
372*d6b92ffaSHans Petter Selasky * this port gid interface id.
373*d6b92ffaSHans Petter Selasky * This gives us a node name to print, if available.
374*d6b92ffaSHans Petter Selasky */
375*d6b92ffaSHans Petter Selasky for (i = 0; i < nr_result->result_cnt; i++) {
376*d6b92ffaSHans Petter Selasky ib_node_record_t *nr = sa_get_query_rec(nr_result->p_result_madw, i);
377*d6b92ffaSHans Petter Selasky if (nr->node_info.port_guid ==
378*d6b92ffaSHans Petter Selasky p_mcmr->port_gid.unicast.interface_id) {
379*d6b92ffaSHans Petter Selasky if(node_name != NULL)
380*d6b92ffaSHans Petter Selasky free(node_name);
381*d6b92ffaSHans Petter Selasky node_name = remap_node_name(node_name_map,
382*d6b92ffaSHans Petter Selasky nr->node_info.node_guid,
383*d6b92ffaSHans Petter Selasky (char *)nr->node_desc.description);
384*d6b92ffaSHans Petter Selasky break;
385*d6b92ffaSHans Petter Selasky }
386*d6b92ffaSHans Petter Selasky }
387*d6b92ffaSHans Petter Selasky
388*d6b92ffaSHans Petter Selasky if (requested_name) {
389*d6b92ffaSHans Petter Selasky if (strtol(requested_name, NULL, 0) == mlid)
390*d6b92ffaSHans Petter Selasky printf("\t\tPortGid.................%s (%s)\n",
391*d6b92ffaSHans Petter Selasky inet_ntop(AF_INET6, p_mcmr->port_gid.raw,
392*d6b92ffaSHans Petter Selasky gid_str, sizeof gid_str), node_name);
393*d6b92ffaSHans Petter Selasky } else {
394*d6b92ffaSHans Petter Selasky printf("MCMemberRecord member dump:\n"
395*d6b92ffaSHans Petter Selasky "\t\tMGID....................%s\n"
396*d6b92ffaSHans Petter Selasky "\t\tMlid....................0x%X\n"
397*d6b92ffaSHans Petter Selasky "\t\tPortGid.................%s\n"
398*d6b92ffaSHans Petter Selasky "\t\tScopeState..............0x%X\n"
399*d6b92ffaSHans Petter Selasky "\t\tProxyJoin...............0x%X\n"
400*d6b92ffaSHans Petter Selasky "\t\tNodeDescription.........%s\n",
401*d6b92ffaSHans Petter Selasky inet_ntop(AF_INET6, p_mcmr->mgid.raw, gid_str,
402*d6b92ffaSHans Petter Selasky sizeof gid_str),
403*d6b92ffaSHans Petter Selasky cl_ntoh16(p_mcmr->mlid),
404*d6b92ffaSHans Petter Selasky inet_ntop(AF_INET6, p_mcmr->port_gid.raw,
405*d6b92ffaSHans Petter Selasky gid_str2, sizeof gid_str2),
406*d6b92ffaSHans Petter Selasky p_mcmr->scope_state, p_mcmr->proxy_join, node_name);
407*d6b92ffaSHans Petter Selasky }
408*d6b92ffaSHans Petter Selasky free(node_name);
409*d6b92ffaSHans Petter Selasky }
410*d6b92ffaSHans Petter Selasky
dump_service_record(void * data,struct query_params * p)411*d6b92ffaSHans Petter Selasky static void dump_service_record(void *data, struct query_params *p)
412*d6b92ffaSHans Petter Selasky {
413*d6b92ffaSHans Petter Selasky char gid[INET6_ADDRSTRLEN];
414*d6b92ffaSHans Petter Selasky char buf_service_key[35];
415*d6b92ffaSHans Petter Selasky char buf_service_name[65];
416*d6b92ffaSHans Petter Selasky ib_service_record_t *p_sr = data;
417*d6b92ffaSHans Petter Selasky
418*d6b92ffaSHans Petter Selasky sprintf(buf_service_key,
419*d6b92ffaSHans Petter Selasky "0x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
420*d6b92ffaSHans Petter Selasky p_sr->service_key[0], p_sr->service_key[1],
421*d6b92ffaSHans Petter Selasky p_sr->service_key[2], p_sr->service_key[3],
422*d6b92ffaSHans Petter Selasky p_sr->service_key[4], p_sr->service_key[5],
423*d6b92ffaSHans Petter Selasky p_sr->service_key[6], p_sr->service_key[7],
424*d6b92ffaSHans Petter Selasky p_sr->service_key[8], p_sr->service_key[9],
425*d6b92ffaSHans Petter Selasky p_sr->service_key[10], p_sr->service_key[11],
426*d6b92ffaSHans Petter Selasky p_sr->service_key[12], p_sr->service_key[13],
427*d6b92ffaSHans Petter Selasky p_sr->service_key[14], p_sr->service_key[15]);
428*d6b92ffaSHans Petter Selasky strncpy(buf_service_name, (char *)p_sr->service_name, 64);
429*d6b92ffaSHans Petter Selasky buf_service_name[64] = '\0';
430*d6b92ffaSHans Petter Selasky
431*d6b92ffaSHans Petter Selasky printf("ServiceRecord dump:\n"
432*d6b92ffaSHans Petter Selasky "\t\tServiceID...............0x%016" PRIx64 "\n"
433*d6b92ffaSHans Petter Selasky "\t\tServiceGID..............%s\n"
434*d6b92ffaSHans Petter Selasky "\t\tServiceP_Key............0x%X\n"
435*d6b92ffaSHans Petter Selasky "\t\tServiceLease............0x%X\n"
436*d6b92ffaSHans Petter Selasky "\t\tServiceKey..............%s\n"
437*d6b92ffaSHans Petter Selasky "\t\tServiceName.............%s\n"
438*d6b92ffaSHans Petter Selasky "\t\tServiceData8.1..........0x%X\n"
439*d6b92ffaSHans Petter Selasky "\t\tServiceData8.2..........0x%X\n"
440*d6b92ffaSHans Petter Selasky "\t\tServiceData8.3..........0x%X\n"
441*d6b92ffaSHans Petter Selasky "\t\tServiceData8.4..........0x%X\n"
442*d6b92ffaSHans Petter Selasky "\t\tServiceData8.5..........0x%X\n"
443*d6b92ffaSHans Petter Selasky "\t\tServiceData8.6..........0x%X\n"
444*d6b92ffaSHans Petter Selasky "\t\tServiceData8.7..........0x%X\n"
445*d6b92ffaSHans Petter Selasky "\t\tServiceData8.8..........0x%X\n"
446*d6b92ffaSHans Petter Selasky "\t\tServiceData8.9..........0x%X\n"
447*d6b92ffaSHans Petter Selasky "\t\tServiceData8.10.........0x%X\n"
448*d6b92ffaSHans Petter Selasky "\t\tServiceData8.11.........0x%X\n"
449*d6b92ffaSHans Petter Selasky "\t\tServiceData8.12.........0x%X\n"
450*d6b92ffaSHans Petter Selasky "\t\tServiceData8.13.........0x%X\n"
451*d6b92ffaSHans Petter Selasky "\t\tServiceData8.14.........0x%X\n"
452*d6b92ffaSHans Petter Selasky "\t\tServiceData8.15.........0x%X\n"
453*d6b92ffaSHans Petter Selasky "\t\tServiceData8.16.........0x%X\n"
454*d6b92ffaSHans Petter Selasky "\t\tServiceData16.1.........0x%X\n"
455*d6b92ffaSHans Petter Selasky "\t\tServiceData16.2.........0x%X\n"
456*d6b92ffaSHans Petter Selasky "\t\tServiceData16.3.........0x%X\n"
457*d6b92ffaSHans Petter Selasky "\t\tServiceData16.4.........0x%X\n"
458*d6b92ffaSHans Petter Selasky "\t\tServiceData16.5.........0x%X\n"
459*d6b92ffaSHans Petter Selasky "\t\tServiceData16.6.........0x%X\n"
460*d6b92ffaSHans Petter Selasky "\t\tServiceData16.7.........0x%X\n"
461*d6b92ffaSHans Petter Selasky "\t\tServiceData16.8.........0x%X\n"
462*d6b92ffaSHans Petter Selasky "\t\tServiceData32.1.........0x%X\n"
463*d6b92ffaSHans Petter Selasky "\t\tServiceData32.2.........0x%X\n"
464*d6b92ffaSHans Petter Selasky "\t\tServiceData32.3.........0x%X\n"
465*d6b92ffaSHans Petter Selasky "\t\tServiceData32.4.........0x%X\n"
466*d6b92ffaSHans Petter Selasky "\t\tServiceData64.1.........0x%016" PRIx64 "\n"
467*d6b92ffaSHans Petter Selasky "\t\tServiceData64.2.........0x%016" PRIx64 "\n",
468*d6b92ffaSHans Petter Selasky cl_ntoh64(p_sr->service_id),
469*d6b92ffaSHans Petter Selasky inet_ntop(AF_INET6, p_sr->service_gid.raw, gid, sizeof gid),
470*d6b92ffaSHans Petter Selasky cl_ntoh16(p_sr->service_pkey), cl_ntoh32(p_sr->service_lease),
471*d6b92ffaSHans Petter Selasky (show_keys ? buf_service_key : NOT_DISPLAYED_STR),
472*d6b92ffaSHans Petter Selasky buf_service_name,
473*d6b92ffaSHans Petter Selasky p_sr->service_data8[0], p_sr->service_data8[1],
474*d6b92ffaSHans Petter Selasky p_sr->service_data8[2], p_sr->service_data8[3],
475*d6b92ffaSHans Petter Selasky p_sr->service_data8[4], p_sr->service_data8[5],
476*d6b92ffaSHans Petter Selasky p_sr->service_data8[6], p_sr->service_data8[7],
477*d6b92ffaSHans Petter Selasky p_sr->service_data8[8], p_sr->service_data8[9],
478*d6b92ffaSHans Petter Selasky p_sr->service_data8[10], p_sr->service_data8[11],
479*d6b92ffaSHans Petter Selasky p_sr->service_data8[12], p_sr->service_data8[13],
480*d6b92ffaSHans Petter Selasky p_sr->service_data8[14], p_sr->service_data8[15],
481*d6b92ffaSHans Petter Selasky cl_ntoh16(p_sr->service_data16[0]),
482*d6b92ffaSHans Petter Selasky cl_ntoh16(p_sr->service_data16[1]),
483*d6b92ffaSHans Petter Selasky cl_ntoh16(p_sr->service_data16[2]),
484*d6b92ffaSHans Petter Selasky cl_ntoh16(p_sr->service_data16[3]),
485*d6b92ffaSHans Petter Selasky cl_ntoh16(p_sr->service_data16[4]),
486*d6b92ffaSHans Petter Selasky cl_ntoh16(p_sr->service_data16[5]),
487*d6b92ffaSHans Petter Selasky cl_ntoh16(p_sr->service_data16[6]),
488*d6b92ffaSHans Petter Selasky cl_ntoh16(p_sr->service_data16[7]),
489*d6b92ffaSHans Petter Selasky cl_ntoh32(p_sr->service_data32[0]),
490*d6b92ffaSHans Petter Selasky cl_ntoh32(p_sr->service_data32[1]),
491*d6b92ffaSHans Petter Selasky cl_ntoh32(p_sr->service_data32[2]),
492*d6b92ffaSHans Petter Selasky cl_ntoh32(p_sr->service_data32[3]),
493*d6b92ffaSHans Petter Selasky cl_ntoh64(p_sr->service_data64[0]),
494*d6b92ffaSHans Petter Selasky cl_ntoh64(p_sr->service_data64[1]));
495*d6b92ffaSHans Petter Selasky }
496*d6b92ffaSHans Petter Selasky
dump_sm_info_record(void * data,struct query_params * p)497*d6b92ffaSHans Petter Selasky static void dump_sm_info_record(void *data, struct query_params *p)
498*d6b92ffaSHans Petter Selasky {
499*d6b92ffaSHans Petter Selasky ib_sminfo_record_t *p_smr = data;
500*d6b92ffaSHans Petter Selasky const ib_sm_info_t *const p_smi = &p_smr->sm_info;
501*d6b92ffaSHans Petter Selasky uint8_t priority, state;
502*d6b92ffaSHans Petter Selasky priority = ib_sminfo_get_priority(p_smi);
503*d6b92ffaSHans Petter Selasky state = ib_sminfo_get_state(p_smi);
504*d6b92ffaSHans Petter Selasky
505*d6b92ffaSHans Petter Selasky printf("SMInfoRecord dump:\n"
506*d6b92ffaSHans Petter Selasky "\t\tRID\n"
507*d6b92ffaSHans Petter Selasky "\t\tLID...................%u\n"
508*d6b92ffaSHans Petter Selasky "\t\tSMInfo dump:\n"
509*d6b92ffaSHans Petter Selasky "\t\tGUID..................0x%016" PRIx64 "\n"
510*d6b92ffaSHans Petter Selasky "\t\tSM_Key................0x%016" PRIx64 "\n"
511*d6b92ffaSHans Petter Selasky "\t\tActCount..............%u\n"
512*d6b92ffaSHans Petter Selasky "\t\tPriority..............%u\n"
513*d6b92ffaSHans Petter Selasky "\t\tSMState...............%u\n",
514*d6b92ffaSHans Petter Selasky cl_ntoh16(p_smr->lid),
515*d6b92ffaSHans Petter Selasky cl_ntoh64(p_smr->sm_info.guid),
516*d6b92ffaSHans Petter Selasky cl_ntoh64(p_smr->sm_info.sm_key),
517*d6b92ffaSHans Petter Selasky cl_ntoh32(p_smr->sm_info.act_count),
518*d6b92ffaSHans Petter Selasky priority, state);
519*d6b92ffaSHans Petter Selasky }
520*d6b92ffaSHans Petter Selasky
dump_switch_info_record(void * data,struct query_params * p)521*d6b92ffaSHans Petter Selasky static void dump_switch_info_record(void *data, struct query_params *p)
522*d6b92ffaSHans Petter Selasky {
523*d6b92ffaSHans Petter Selasky ib_switch_info_record_t *p_sir = data;
524*d6b92ffaSHans Petter Selasky uint32_t sa_cap_mask2 = ib_class_cap_mask2(&p->cpi);
525*d6b92ffaSHans Petter Selasky
526*d6b92ffaSHans Petter Selasky printf("SwitchInfoRecord dump:\n"
527*d6b92ffaSHans Petter Selasky "\t\tRID\n"
528*d6b92ffaSHans Petter Selasky "\t\tLID.....................................%u\n"
529*d6b92ffaSHans Petter Selasky "\t\tSwitchInfo dump:\n"
530*d6b92ffaSHans Petter Selasky "\t\tLinearFDBCap............................0x%X\n"
531*d6b92ffaSHans Petter Selasky "\t\tRandomFDBCap............................0x%X\n"
532*d6b92ffaSHans Petter Selasky "\t\tMulticastFDBCap.........................0x%X\n"
533*d6b92ffaSHans Petter Selasky "\t\tLinearFDBTop............................0x%X\n"
534*d6b92ffaSHans Petter Selasky "\t\tDefaultPort.............................%u\n"
535*d6b92ffaSHans Petter Selasky "\t\tDefaultMulticastPrimaryPort.............%u\n"
536*d6b92ffaSHans Petter Selasky "\t\tDefaultMulticastNotPrimaryPort..........%u\n"
537*d6b92ffaSHans Petter Selasky "\t\tLifeTimeValue/PortStateChange/OpSL2VL...0x%X\n"
538*d6b92ffaSHans Petter Selasky "\t\tLIDsPerPort.............................0x%X\n"
539*d6b92ffaSHans Petter Selasky "\t\tPartitionEnforcementCap.................0x%X\n"
540*d6b92ffaSHans Petter Selasky "\t\tflags...................................0x%X\n",
541*d6b92ffaSHans Petter Selasky cl_ntoh16(p_sir->lid),
542*d6b92ffaSHans Petter Selasky cl_ntoh16(p_sir->switch_info.lin_cap),
543*d6b92ffaSHans Petter Selasky cl_ntoh16(p_sir->switch_info.rand_cap),
544*d6b92ffaSHans Petter Selasky cl_ntoh16(p_sir->switch_info.mcast_cap),
545*d6b92ffaSHans Petter Selasky cl_ntoh16(p_sir->switch_info.lin_top),
546*d6b92ffaSHans Petter Selasky p_sir->switch_info.def_port,
547*d6b92ffaSHans Petter Selasky p_sir->switch_info.def_mcast_pri_port,
548*d6b92ffaSHans Petter Selasky p_sir->switch_info.def_mcast_not_port,
549*d6b92ffaSHans Petter Selasky p_sir->switch_info.life_state,
550*d6b92ffaSHans Petter Selasky cl_ntoh16(p_sir->switch_info.lids_per_port),
551*d6b92ffaSHans Petter Selasky cl_ntoh16(p_sir->switch_info.enforce_cap),
552*d6b92ffaSHans Petter Selasky p_sir->switch_info.flags);
553*d6b92ffaSHans Petter Selasky if (sa_cap_mask2 & UMAD_SA_CAP_MASK2_IS_MCAST_TOP_SUP)
554*d6b92ffaSHans Petter Selasky printf("\t\tMulticastFDBTop.........................0x%X\n",
555*d6b92ffaSHans Petter Selasky cl_ntoh16(p_sir->switch_info.mcast_top));
556*d6b92ffaSHans Petter Selasky }
557*d6b92ffaSHans Petter Selasky
dump_inform_info_record(void * data,struct query_params * p)558*d6b92ffaSHans Petter Selasky static void dump_inform_info_record(void *data, struct query_params *p)
559*d6b92ffaSHans Petter Selasky {
560*d6b92ffaSHans Petter Selasky char gid_str[INET6_ADDRSTRLEN];
561*d6b92ffaSHans Petter Selasky char gid_str2[INET6_ADDRSTRLEN];
562*d6b92ffaSHans Petter Selasky ib_inform_info_record_t *p_iir = data;
563*d6b92ffaSHans Petter Selasky uint32_t qpn;
564*d6b92ffaSHans Petter Selasky uint8_t resp_time_val;
565*d6b92ffaSHans Petter Selasky
566*d6b92ffaSHans Petter Selasky ib_inform_info_get_qpn_resp_time(p_iir->inform_info.g_or_v.
567*d6b92ffaSHans Petter Selasky generic.qpn_resp_time_val, &qpn,
568*d6b92ffaSHans Petter Selasky &resp_time_val);
569*d6b92ffaSHans Petter Selasky if (p_iir->inform_info.is_generic) {
570*d6b92ffaSHans Petter Selasky printf("InformInfoRecord dump:\n"
571*d6b92ffaSHans Petter Selasky "\t\tRID\n"
572*d6b92ffaSHans Petter Selasky "\t\tSubscriberGID...........%s\n"
573*d6b92ffaSHans Petter Selasky "\t\tSubscriberEnum..........0x%X\n"
574*d6b92ffaSHans Petter Selasky "\t\tInformInfo dump:\n"
575*d6b92ffaSHans Petter Selasky "\t\tgid.....................%s\n"
576*d6b92ffaSHans Petter Selasky "\t\tlid_range_begin.........%u\n"
577*d6b92ffaSHans Petter Selasky "\t\tlid_range_end...........%u\n"
578*d6b92ffaSHans Petter Selasky "\t\tis_generic..............0x%X\n"
579*d6b92ffaSHans Petter Selasky "\t\tsubscribe...............0x%X\n"
580*d6b92ffaSHans Petter Selasky "\t\ttrap_type...............0x%X\n"
581*d6b92ffaSHans Petter Selasky "\t\ttrap_num................%u\n",
582*d6b92ffaSHans Petter Selasky inet_ntop(AF_INET6, p_iir->subscriber_gid.raw, gid_str,
583*d6b92ffaSHans Petter Selasky sizeof gid_str),
584*d6b92ffaSHans Petter Selasky cl_ntoh16(p_iir->subscriber_enum),
585*d6b92ffaSHans Petter Selasky inet_ntop(AF_INET6, p_iir->inform_info.gid.raw, gid_str2,
586*d6b92ffaSHans Petter Selasky sizeof gid_str2),
587*d6b92ffaSHans Petter Selasky cl_ntoh16(p_iir->inform_info.lid_range_begin),
588*d6b92ffaSHans Petter Selasky cl_ntoh16(p_iir->inform_info.lid_range_end),
589*d6b92ffaSHans Petter Selasky p_iir->inform_info.is_generic,
590*d6b92ffaSHans Petter Selasky p_iir->inform_info.subscribe,
591*d6b92ffaSHans Petter Selasky cl_ntoh16(p_iir->inform_info.trap_type),
592*d6b92ffaSHans Petter Selasky cl_ntoh16(p_iir->inform_info.g_or_v.generic.trap_num));
593*d6b92ffaSHans Petter Selasky if (show_keys) {
594*d6b92ffaSHans Petter Selasky printf("\t\tqpn.....................0x%06X\n",
595*d6b92ffaSHans Petter Selasky cl_ntoh32(qpn));
596*d6b92ffaSHans Petter Selasky } else {
597*d6b92ffaSHans Petter Selasky printf("\t\tqpn....................."
598*d6b92ffaSHans Petter Selasky NOT_DISPLAYED_STR "\n");
599*d6b92ffaSHans Petter Selasky }
600*d6b92ffaSHans Petter Selasky printf("\t\tresp_time_val...........0x%X\n"
601*d6b92ffaSHans Petter Selasky "\t\tnode_type...............0x%06X\n",
602*d6b92ffaSHans Petter Selasky resp_time_val,
603*d6b92ffaSHans Petter Selasky cl_ntoh32(ib_inform_info_get_prod_type
604*d6b92ffaSHans Petter Selasky (&p_iir->inform_info)));
605*d6b92ffaSHans Petter Selasky } else {
606*d6b92ffaSHans Petter Selasky printf("InformInfoRecord dump:\n"
607*d6b92ffaSHans Petter Selasky "\t\tRID\n"
608*d6b92ffaSHans Petter Selasky "\t\tSubscriberGID...........%s\n"
609*d6b92ffaSHans Petter Selasky "\t\tSubscriberEnum..........0x%X\n"
610*d6b92ffaSHans Petter Selasky "\t\tInformInfo dump:\n"
611*d6b92ffaSHans Petter Selasky "\t\tgid.....................%s\n"
612*d6b92ffaSHans Petter Selasky "\t\tlid_range_begin.........%u\n"
613*d6b92ffaSHans Petter Selasky "\t\tlid_range_end...........%u\n"
614*d6b92ffaSHans Petter Selasky "\t\tis_generic..............0x%X\n"
615*d6b92ffaSHans Petter Selasky "\t\tsubscribe...............0x%X\n"
616*d6b92ffaSHans Petter Selasky "\t\ttrap_type...............0x%X\n"
617*d6b92ffaSHans Petter Selasky "\t\tdev_id..................0x%X\n",
618*d6b92ffaSHans Petter Selasky inet_ntop(AF_INET6, p_iir->subscriber_gid.raw, gid_str,
619*d6b92ffaSHans Petter Selasky sizeof gid_str),
620*d6b92ffaSHans Petter Selasky cl_ntoh16(p_iir->subscriber_enum),
621*d6b92ffaSHans Petter Selasky inet_ntop(AF_INET6, p_iir->inform_info.gid.raw,
622*d6b92ffaSHans Petter Selasky gid_str2, sizeof gid_str2),
623*d6b92ffaSHans Petter Selasky cl_ntoh16(p_iir->inform_info.lid_range_begin),
624*d6b92ffaSHans Petter Selasky cl_ntoh16(p_iir->inform_info.lid_range_end),
625*d6b92ffaSHans Petter Selasky p_iir->inform_info.is_generic,
626*d6b92ffaSHans Petter Selasky p_iir->inform_info.subscribe,
627*d6b92ffaSHans Petter Selasky cl_ntoh16(p_iir->inform_info.trap_type),
628*d6b92ffaSHans Petter Selasky cl_ntoh16(p_iir->inform_info.g_or_v.vend.dev_id));
629*d6b92ffaSHans Petter Selasky if (show_keys) {
630*d6b92ffaSHans Petter Selasky printf("\t\tqpn.....................0x%06X\n",
631*d6b92ffaSHans Petter Selasky cl_ntoh32(qpn));
632*d6b92ffaSHans Petter Selasky } else {
633*d6b92ffaSHans Petter Selasky printf("\t\tqpn....................."
634*d6b92ffaSHans Petter Selasky NOT_DISPLAYED_STR "\n");
635*d6b92ffaSHans Petter Selasky }
636*d6b92ffaSHans Petter Selasky printf("\t\tresp_time_val...........0x%X\n"
637*d6b92ffaSHans Petter Selasky "\t\tvendor_id...............0x%06X\n",
638*d6b92ffaSHans Petter Selasky resp_time_val,
639*d6b92ffaSHans Petter Selasky cl_ntoh32(ib_inform_info_get_prod_type
640*d6b92ffaSHans Petter Selasky (&p_iir->inform_info)));
641*d6b92ffaSHans Petter Selasky }
642*d6b92ffaSHans Petter Selasky }
643*d6b92ffaSHans Petter Selasky
dump_one_link_record(void * data,struct query_params * p)644*d6b92ffaSHans Petter Selasky static void dump_one_link_record(void *data, struct query_params *p)
645*d6b92ffaSHans Petter Selasky {
646*d6b92ffaSHans Petter Selasky ib_link_record_t *lr = data;
647*d6b92ffaSHans Petter Selasky printf("LinkRecord dump:\n"
648*d6b92ffaSHans Petter Selasky "\t\tFromLID....................%u\n"
649*d6b92ffaSHans Petter Selasky "\t\tFromPort...................%u\n"
650*d6b92ffaSHans Petter Selasky "\t\tToPort.....................%u\n"
651*d6b92ffaSHans Petter Selasky "\t\tToLID......................%u\n",
652*d6b92ffaSHans Petter Selasky cl_ntoh16(lr->from_lid), lr->from_port_num,
653*d6b92ffaSHans Petter Selasky lr->to_port_num, cl_ntoh16(lr->to_lid));
654*d6b92ffaSHans Petter Selasky }
655*d6b92ffaSHans Petter Selasky
dump_one_slvl_record(void * data,struct query_params * p)656*d6b92ffaSHans Petter Selasky static void dump_one_slvl_record(void *data, struct query_params *p)
657*d6b92ffaSHans Petter Selasky {
658*d6b92ffaSHans Petter Selasky ib_slvl_table_record_t *slvl = data;
659*d6b92ffaSHans Petter Selasky ib_slvl_table_t *t = &slvl->slvl_tbl;
660*d6b92ffaSHans Petter Selasky printf("SL2VLTableRecord dump:\n"
661*d6b92ffaSHans Petter Selasky "\t\tLID........................%u\n"
662*d6b92ffaSHans Petter Selasky "\t\tInPort.....................%u\n"
663*d6b92ffaSHans Petter Selasky "\t\tOutPort....................%u\n"
664*d6b92ffaSHans Petter Selasky "\t\tSL: 0| 1| 2| 3| 4| 5| 6| 7| 8| 9|10|11|12|13|14|15|\n"
665*d6b92ffaSHans Petter Selasky "\t\tVL:%2u|%2u|%2u|%2u|%2u|%2u|%2u|%2u|%2u|%2u|%2u|%2u|%2u"
666*d6b92ffaSHans Petter Selasky "|%2u|%2u|%2u|\n",
667*d6b92ffaSHans Petter Selasky cl_ntoh16(slvl->lid), slvl->in_port_num, slvl->out_port_num,
668*d6b92ffaSHans Petter Selasky ib_slvl_table_get(t, 0), ib_slvl_table_get(t, 1),
669*d6b92ffaSHans Petter Selasky ib_slvl_table_get(t, 2), ib_slvl_table_get(t, 3),
670*d6b92ffaSHans Petter Selasky ib_slvl_table_get(t, 4), ib_slvl_table_get(t, 5),
671*d6b92ffaSHans Petter Selasky ib_slvl_table_get(t, 6), ib_slvl_table_get(t, 7),
672*d6b92ffaSHans Petter Selasky ib_slvl_table_get(t, 8), ib_slvl_table_get(t, 9),
673*d6b92ffaSHans Petter Selasky ib_slvl_table_get(t, 10), ib_slvl_table_get(t, 11),
674*d6b92ffaSHans Petter Selasky ib_slvl_table_get(t, 12), ib_slvl_table_get(t, 13),
675*d6b92ffaSHans Petter Selasky ib_slvl_table_get(t, 14), ib_slvl_table_get(t, 15));
676*d6b92ffaSHans Petter Selasky }
677*d6b92ffaSHans Petter Selasky
dump_one_vlarb_record(void * data,struct query_params * p)678*d6b92ffaSHans Petter Selasky static void dump_one_vlarb_record(void *data, struct query_params *p)
679*d6b92ffaSHans Petter Selasky {
680*d6b92ffaSHans Petter Selasky ib_vl_arb_table_record_t *vlarb = data;
681*d6b92ffaSHans Petter Selasky ib_vl_arb_element_t *e = vlarb->vl_arb_tbl.vl_entry;
682*d6b92ffaSHans Petter Selasky int i;
683*d6b92ffaSHans Petter Selasky printf("VLArbTableRecord dump:\n"
684*d6b92ffaSHans Petter Selasky "\t\tLID........................%u\n"
685*d6b92ffaSHans Petter Selasky "\t\tPort.......................%u\n"
686*d6b92ffaSHans Petter Selasky "\t\tBlock......................%u\n",
687*d6b92ffaSHans Petter Selasky cl_ntoh16(vlarb->lid), vlarb->port_num, vlarb->block_num);
688*d6b92ffaSHans Petter Selasky for (i = 0; i < 32; i += 16)
689*d6b92ffaSHans Petter Selasky printf("\t\tVL :%2u|%2u|%2u|%2u|%2u|%2u|%2u|%2u|"
690*d6b92ffaSHans Petter Selasky "%2u|%2u|%2u|%2u|%2u|%2u|%2u|%2u|\n"
691*d6b92ffaSHans Petter Selasky "\t\tWeight:%2u|%2u|%2u|%2u|%2u|%2u|%2u|%2u|"
692*d6b92ffaSHans Petter Selasky "%2u|%2u|%2u|%2u|%2u|%2u|%2u|%2u|\n",
693*d6b92ffaSHans Petter Selasky e[i + 0].vl, e[i + 1].vl, e[i + 2].vl, e[i + 3].vl,
694*d6b92ffaSHans Petter Selasky e[i + 4].vl, e[i + 5].vl, e[i + 6].vl, e[i + 7].vl,
695*d6b92ffaSHans Petter Selasky e[i + 8].vl, e[i + 9].vl, e[i + 10].vl, e[i + 11].vl,
696*d6b92ffaSHans Petter Selasky e[i + 12].vl, e[i + 13].vl, e[i + 14].vl, e[i + 15].vl,
697*d6b92ffaSHans Petter Selasky e[i + 0].weight, e[i + 1].weight, e[i + 2].weight,
698*d6b92ffaSHans Petter Selasky e[i + 3].weight, e[i + 4].weight, e[i + 5].weight,
699*d6b92ffaSHans Petter Selasky e[i + 6].weight, e[i + 7].weight, e[i + 8].weight,
700*d6b92ffaSHans Petter Selasky e[i + 9].weight, e[i + 10].weight, e[i + 11].weight,
701*d6b92ffaSHans Petter Selasky e[i + 12].weight, e[i + 13].weight, e[i + 14].weight,
702*d6b92ffaSHans Petter Selasky e[i + 15].weight);
703*d6b92ffaSHans Petter Selasky }
704*d6b92ffaSHans Petter Selasky
dump_one_pkey_tbl_record(void * data,struct query_params * params)705*d6b92ffaSHans Petter Selasky static void dump_one_pkey_tbl_record(void *data, struct query_params *params)
706*d6b92ffaSHans Petter Selasky {
707*d6b92ffaSHans Petter Selasky ib_pkey_table_record_t *pktr = data;
708*d6b92ffaSHans Petter Selasky ib_net16_t *p = pktr->pkey_tbl.pkey_entry;
709*d6b92ffaSHans Petter Selasky int i;
710*d6b92ffaSHans Petter Selasky printf("PKeyTableRecord dump:\n"
711*d6b92ffaSHans Petter Selasky "\t\tLID........................%u\n"
712*d6b92ffaSHans Petter Selasky "\t\tPort.......................%u\n"
713*d6b92ffaSHans Petter Selasky "\t\tBlock......................%u\n"
714*d6b92ffaSHans Petter Selasky "\t\tPKey Table:\n",
715*d6b92ffaSHans Petter Selasky cl_ntoh16(pktr->lid), pktr->port_num, pktr->block_num);
716*d6b92ffaSHans Petter Selasky for (i = 0; i < 32; i += 8)
717*d6b92ffaSHans Petter Selasky printf("\t\t0x%04x 0x%04x 0x%04x 0x%04x"
718*d6b92ffaSHans Petter Selasky " 0x%04x 0x%04x 0x%04x 0x%04x\n",
719*d6b92ffaSHans Petter Selasky cl_ntoh16(p[i + 0]), cl_ntoh16(p[i + 1]),
720*d6b92ffaSHans Petter Selasky cl_ntoh16(p[i + 2]), cl_ntoh16(p[i + 3]),
721*d6b92ffaSHans Petter Selasky cl_ntoh16(p[i + 4]), cl_ntoh16(p[i + 5]),
722*d6b92ffaSHans Petter Selasky cl_ntoh16(p[i + 6]), cl_ntoh16(p[i + 7]));
723*d6b92ffaSHans Petter Selasky printf("\n");
724*d6b92ffaSHans Petter Selasky }
725*d6b92ffaSHans Petter Selasky
dump_one_lft_record(void * data,struct query_params * p)726*d6b92ffaSHans Petter Selasky static void dump_one_lft_record(void *data, struct query_params *p)
727*d6b92ffaSHans Petter Selasky {
728*d6b92ffaSHans Petter Selasky ib_lft_record_t *lftr = data;
729*d6b92ffaSHans Petter Selasky unsigned block = cl_ntoh16(lftr->block_num);
730*d6b92ffaSHans Petter Selasky int i;
731*d6b92ffaSHans Petter Selasky printf("LFT Record dump:\n"
732*d6b92ffaSHans Petter Selasky "\t\tLID........................%u\n"
733*d6b92ffaSHans Petter Selasky "\t\tBlock......................%u\n"
734*d6b92ffaSHans Petter Selasky "\t\tLFT:\n\t\tLID\tPort Number\n", cl_ntoh16(lftr->lid), block);
735*d6b92ffaSHans Petter Selasky for (i = 0; i < 64; i++)
736*d6b92ffaSHans Petter Selasky printf("\t\t%u\t%u\n", block * 64 + i, lftr->lft[i]);
737*d6b92ffaSHans Petter Selasky printf("\n");
738*d6b92ffaSHans Petter Selasky }
739*d6b92ffaSHans Petter Selasky
dump_one_guidinfo_record(void * data,struct query_params * p)740*d6b92ffaSHans Petter Selasky static void dump_one_guidinfo_record(void *data, struct query_params *p)
741*d6b92ffaSHans Petter Selasky {
742*d6b92ffaSHans Petter Selasky ib_guidinfo_record_t *gir = data;
743*d6b92ffaSHans Petter Selasky printf("GUIDInfo Record dump:\n"
744*d6b92ffaSHans Petter Selasky "\t\tLID........................%u\n"
745*d6b92ffaSHans Petter Selasky "\t\tBlock......................%u\n"
746*d6b92ffaSHans Petter Selasky "\t\tGUID 0.....................0x%016" PRIx64 "\n"
747*d6b92ffaSHans Petter Selasky "\t\tGUID 1.....................0x%016" PRIx64 "\n"
748*d6b92ffaSHans Petter Selasky "\t\tGUID 2.....................0x%016" PRIx64 "\n"
749*d6b92ffaSHans Petter Selasky "\t\tGUID 3.....................0x%016" PRIx64 "\n"
750*d6b92ffaSHans Petter Selasky "\t\tGUID 4.....................0x%016" PRIx64 "\n"
751*d6b92ffaSHans Petter Selasky "\t\tGUID 5.....................0x%016" PRIx64 "\n"
752*d6b92ffaSHans Petter Selasky "\t\tGUID 6.....................0x%016" PRIx64 "\n"
753*d6b92ffaSHans Petter Selasky "\t\tGUID 7.....................0x%016" PRIx64 "\n",
754*d6b92ffaSHans Petter Selasky cl_ntoh16(gir->lid), gir->block_num,
755*d6b92ffaSHans Petter Selasky cl_ntoh64(gir->guid_info.guid[0]),
756*d6b92ffaSHans Petter Selasky cl_ntoh64(gir->guid_info.guid[1]),
757*d6b92ffaSHans Petter Selasky cl_ntoh64(gir->guid_info.guid[2]),
758*d6b92ffaSHans Petter Selasky cl_ntoh64(gir->guid_info.guid[3]),
759*d6b92ffaSHans Petter Selasky cl_ntoh64(gir->guid_info.guid[4]),
760*d6b92ffaSHans Petter Selasky cl_ntoh64(gir->guid_info.guid[5]),
761*d6b92ffaSHans Petter Selasky cl_ntoh64(gir->guid_info.guid[6]),
762*d6b92ffaSHans Petter Selasky cl_ntoh64(gir->guid_info.guid[7]));
763*d6b92ffaSHans Petter Selasky }
764*d6b92ffaSHans Petter Selasky
dump_one_mft_record(void * data,struct query_params * p)765*d6b92ffaSHans Petter Selasky static void dump_one_mft_record(void *data, struct query_params *p)
766*d6b92ffaSHans Petter Selasky {
767*d6b92ffaSHans Petter Selasky ib_mft_record_t *mftr = data;
768*d6b92ffaSHans Petter Selasky unsigned position = cl_ntoh16(mftr->position_block_num) >> 12;
769*d6b92ffaSHans Petter Selasky unsigned block = cl_ntoh16(mftr->position_block_num) &
770*d6b92ffaSHans Petter Selasky IB_MCAST_BLOCK_ID_MASK_HO;
771*d6b92ffaSHans Petter Selasky int i;
772*d6b92ffaSHans Petter Selasky unsigned offset;
773*d6b92ffaSHans Petter Selasky
774*d6b92ffaSHans Petter Selasky printf("MFT Record dump:\n"
775*d6b92ffaSHans Petter Selasky "\t\tLID........................%u\n"
776*d6b92ffaSHans Petter Selasky "\t\tPosition...................%u\n"
777*d6b92ffaSHans Petter Selasky "\t\tBlock......................%u\n"
778*d6b92ffaSHans Petter Selasky "\t\tMFT:\n\t\tMLID\tPort Mask\n",
779*d6b92ffaSHans Petter Selasky cl_ntoh16(mftr->lid), position, block);
780*d6b92ffaSHans Petter Selasky offset = IB_LID_MCAST_START_HO + block * 32;
781*d6b92ffaSHans Petter Selasky for (i = 0; i < IB_MCAST_BLOCK_SIZE; i++)
782*d6b92ffaSHans Petter Selasky printf("\t\t0x%04x\t0x%04x\n",
783*d6b92ffaSHans Petter Selasky offset + i, cl_ntoh16(mftr->mft[i]));
784*d6b92ffaSHans Petter Selasky printf("\n");
785*d6b92ffaSHans Petter Selasky }
786*d6b92ffaSHans Petter Selasky
dump_results(struct sa_query_result * r,void (* dump_func)(void *,struct query_params *),struct query_params * p)787*d6b92ffaSHans Petter Selasky static void dump_results(struct sa_query_result *r,
788*d6b92ffaSHans Petter Selasky void (*dump_func) (void *, struct query_params *),
789*d6b92ffaSHans Petter Selasky struct query_params *p)
790*d6b92ffaSHans Petter Selasky {
791*d6b92ffaSHans Petter Selasky unsigned i;
792*d6b92ffaSHans Petter Selasky for (i = 0; i < r->result_cnt; i++) {
793*d6b92ffaSHans Petter Selasky void *data = sa_get_query_rec(r->p_result_madw, i);
794*d6b92ffaSHans Petter Selasky dump_func(data, p);
795*d6b92ffaSHans Petter Selasky }
796*d6b92ffaSHans Petter Selasky }
797*d6b92ffaSHans Petter Selasky
798*d6b92ffaSHans Petter Selasky /**
799*d6b92ffaSHans Petter Selasky * Get any record(s)
800*d6b92ffaSHans Petter Selasky */
get_any_records(struct sa_handle * h,uint16_t attr_id,uint32_t attr_mod,ib_net64_t comp_mask,void * attr,size_t attr_size,struct sa_query_result * result)801*d6b92ffaSHans Petter Selasky static int get_any_records(struct sa_handle * h,
802*d6b92ffaSHans Petter Selasky uint16_t attr_id, uint32_t attr_mod,
803*d6b92ffaSHans Petter Selasky ib_net64_t comp_mask, void *attr,
804*d6b92ffaSHans Petter Selasky size_t attr_size,
805*d6b92ffaSHans Petter Selasky struct sa_query_result *result)
806*d6b92ffaSHans Petter Selasky {
807*d6b92ffaSHans Petter Selasky int ret = sa_query(h, IB_MAD_METHOD_GET_TABLE, attr_id, attr_mod,
808*d6b92ffaSHans Petter Selasky cl_ntoh64(comp_mask), ibd_sakey, attr, attr_size, result);
809*d6b92ffaSHans Petter Selasky if (ret) {
810*d6b92ffaSHans Petter Selasky fprintf(stderr, "Query SA failed: %s\n", strerror(ret));
811*d6b92ffaSHans Petter Selasky return ret;
812*d6b92ffaSHans Petter Selasky }
813*d6b92ffaSHans Petter Selasky
814*d6b92ffaSHans Petter Selasky if (result->status != IB_SA_MAD_STATUS_SUCCESS) {
815*d6b92ffaSHans Petter Selasky sa_report_err(result->status);
816*d6b92ffaSHans Petter Selasky return EIO;
817*d6b92ffaSHans Petter Selasky }
818*d6b92ffaSHans Petter Selasky
819*d6b92ffaSHans Petter Selasky return ret;
820*d6b92ffaSHans Petter Selasky }
821*d6b92ffaSHans Petter Selasky
get_and_dump_any_records(struct sa_handle * h,uint16_t attr_id,uint32_t attr_mod,ib_net64_t comp_mask,void * attr,size_t attr_size,void (* dump_func)(void *,struct query_params *),struct query_params * p)822*d6b92ffaSHans Petter Selasky static int get_and_dump_any_records(struct sa_handle * h, uint16_t attr_id,
823*d6b92ffaSHans Petter Selasky uint32_t attr_mod, ib_net64_t comp_mask,
824*d6b92ffaSHans Petter Selasky void *attr,
825*d6b92ffaSHans Petter Selasky size_t attr_size,
826*d6b92ffaSHans Petter Selasky void (*dump_func) (void *,
827*d6b92ffaSHans Petter Selasky struct query_params *),
828*d6b92ffaSHans Petter Selasky struct query_params *p)
829*d6b92ffaSHans Petter Selasky {
830*d6b92ffaSHans Petter Selasky struct sa_query_result result;
831*d6b92ffaSHans Petter Selasky int ret = get_any_records(h, attr_id, attr_mod, comp_mask, attr,
832*d6b92ffaSHans Petter Selasky attr_size, &result);
833*d6b92ffaSHans Petter Selasky if (ret)
834*d6b92ffaSHans Petter Selasky return ret;
835*d6b92ffaSHans Petter Selasky
836*d6b92ffaSHans Petter Selasky dump_results(&result, dump_func, p);
837*d6b92ffaSHans Petter Selasky sa_free_result_mad(&result);
838*d6b92ffaSHans Petter Selasky return 0;
839*d6b92ffaSHans Petter Selasky }
840*d6b92ffaSHans Petter Selasky
841*d6b92ffaSHans Petter Selasky /**
842*d6b92ffaSHans Petter Selasky * Get all the records available for requested query type.
843*d6b92ffaSHans Petter Selasky */
get_all_records(struct sa_handle * h,uint16_t attr_id,struct sa_query_result * result)844*d6b92ffaSHans Petter Selasky static int get_all_records(struct sa_handle * h, uint16_t attr_id,
845*d6b92ffaSHans Petter Selasky struct sa_query_result *result)
846*d6b92ffaSHans Petter Selasky {
847*d6b92ffaSHans Petter Selasky return get_any_records(h, attr_id, 0, 0, NULL, 0, result);
848*d6b92ffaSHans Petter Selasky }
849*d6b92ffaSHans Petter Selasky
get_and_dump_all_records(struct sa_handle * h,uint16_t attr_id,void (* dump_func)(void *,struct query_params * p),struct query_params * p)850*d6b92ffaSHans Petter Selasky static int get_and_dump_all_records(struct sa_handle * h, uint16_t attr_id,
851*d6b92ffaSHans Petter Selasky void (*dump_func) (void *,
852*d6b92ffaSHans Petter Selasky struct query_params *p),
853*d6b92ffaSHans Petter Selasky struct query_params *p)
854*d6b92ffaSHans Petter Selasky {
855*d6b92ffaSHans Petter Selasky struct sa_query_result result;
856*d6b92ffaSHans Petter Selasky int ret = get_all_records(h, attr_id, &result);
857*d6b92ffaSHans Petter Selasky if (ret)
858*d6b92ffaSHans Petter Selasky return ret;
859*d6b92ffaSHans Petter Selasky
860*d6b92ffaSHans Petter Selasky dump_results(&result, dump_func, p);
861*d6b92ffaSHans Petter Selasky sa_free_result_mad(&result);
862*d6b92ffaSHans Petter Selasky return ret;
863*d6b92ffaSHans Petter Selasky }
864*d6b92ffaSHans Petter Selasky
865*d6b92ffaSHans Petter Selasky /**
866*d6b92ffaSHans Petter Selasky * return the lid from the node descriptor (name) supplied
867*d6b92ffaSHans Petter Selasky */
get_lid_from_name(struct sa_handle * h,const char * name,uint16_t * lid)868*d6b92ffaSHans Petter Selasky static int get_lid_from_name(struct sa_handle * h, const char *name, uint16_t * lid)
869*d6b92ffaSHans Petter Selasky {
870*d6b92ffaSHans Petter Selasky ib_node_record_t *node_record = NULL;
871*d6b92ffaSHans Petter Selasky unsigned i;
872*d6b92ffaSHans Petter Selasky int ret;
873*d6b92ffaSHans Petter Selasky struct sa_query_result result;
874*d6b92ffaSHans Petter Selasky
875*d6b92ffaSHans Petter Selasky ret = get_all_records(h, IB_SA_ATTR_NODERECORD, &result);
876*d6b92ffaSHans Petter Selasky if (ret)
877*d6b92ffaSHans Petter Selasky return ret;
878*d6b92ffaSHans Petter Selasky
879*d6b92ffaSHans Petter Selasky ret = EHOSTDOWN;
880*d6b92ffaSHans Petter Selasky for (i = 0; i < result.result_cnt; i++) {
881*d6b92ffaSHans Petter Selasky node_record = sa_get_query_rec(result.p_result_madw, i);
882*d6b92ffaSHans Petter Selasky if (name
883*d6b92ffaSHans Petter Selasky && strncmp(name, (char *)node_record->node_desc.description,
884*d6b92ffaSHans Petter Selasky sizeof(node_record->node_desc.description)) ==
885*d6b92ffaSHans Petter Selasky 0) {
886*d6b92ffaSHans Petter Selasky *lid = cl_ntoh16(node_record->lid);
887*d6b92ffaSHans Petter Selasky ret = 0;
888*d6b92ffaSHans Petter Selasky break;
889*d6b92ffaSHans Petter Selasky }
890*d6b92ffaSHans Petter Selasky }
891*d6b92ffaSHans Petter Selasky sa_free_result_mad(&result);
892*d6b92ffaSHans Petter Selasky return ret;
893*d6b92ffaSHans Petter Selasky }
894*d6b92ffaSHans Petter Selasky
get_lid(struct sa_handle * h,const char * name)895*d6b92ffaSHans Petter Selasky static uint16_t get_lid(struct sa_handle * h, const char *name)
896*d6b92ffaSHans Petter Selasky {
897*d6b92ffaSHans Petter Selasky int rc = 0;
898*d6b92ffaSHans Petter Selasky uint16_t rc_lid = 0;
899*d6b92ffaSHans Petter Selasky
900*d6b92ffaSHans Petter Selasky if (!name)
901*d6b92ffaSHans Petter Selasky return 0;
902*d6b92ffaSHans Petter Selasky if (isalpha(name[0])) {
903*d6b92ffaSHans Petter Selasky if ((rc = get_lid_from_name(h, name, &rc_lid)) != 0) {
904*d6b92ffaSHans Petter Selasky fprintf(stderr, "Failed to find lid for \"%s\": %s\n",
905*d6b92ffaSHans Petter Selasky name, strerror(rc));
906*d6b92ffaSHans Petter Selasky exit(rc);
907*d6b92ffaSHans Petter Selasky }
908*d6b92ffaSHans Petter Selasky } else {
909*d6b92ffaSHans Petter Selasky long val;
910*d6b92ffaSHans Petter Selasky errno = 0;
911*d6b92ffaSHans Petter Selasky val = strtol(name, NULL, 0);
912*d6b92ffaSHans Petter Selasky if (errno != 0 || val <= 0 || val > UINT16_MAX) {
913*d6b92ffaSHans Petter Selasky fprintf(stderr, "Invalid lid specified: \"%s\"\n", name);
914*d6b92ffaSHans Petter Selasky exit(EINVAL);
915*d6b92ffaSHans Petter Selasky }
916*d6b92ffaSHans Petter Selasky rc_lid = (uint16_t)val;
917*d6b92ffaSHans Petter Selasky }
918*d6b92ffaSHans Petter Selasky
919*d6b92ffaSHans Petter Selasky return rc_lid;
920*d6b92ffaSHans Petter Selasky }
921*d6b92ffaSHans Petter Selasky
parse_iir_subscriber_gid(char * str,ib_inform_info_record_t * ir)922*d6b92ffaSHans Petter Selasky static int parse_iir_subscriber_gid(char *str, ib_inform_info_record_t *ir)
923*d6b92ffaSHans Petter Selasky {
924*d6b92ffaSHans Petter Selasky int rc = inet_pton(AF_INET6,str,&(ir->subscriber_gid.raw));
925*d6b92ffaSHans Petter Selasky if(rc < 1){
926*d6b92ffaSHans Petter Selasky fprintf(stderr, "Invalid SubscriberGID specified: \"%s\"\n",str);
927*d6b92ffaSHans Petter Selasky exit(EINVAL);
928*d6b92ffaSHans Petter Selasky }
929*d6b92ffaSHans Petter Selasky return rc;
930*d6b92ffaSHans Petter Selasky }
931*d6b92ffaSHans Petter Selasky
parse_lid_and_ports(struct sa_handle * h,char * str,int * lid,int * port1,int * port2)932*d6b92ffaSHans Petter Selasky static int parse_lid_and_ports(struct sa_handle * h,
933*d6b92ffaSHans Petter Selasky char *str, int *lid, int *port1, int *port2)
934*d6b92ffaSHans Petter Selasky {
935*d6b92ffaSHans Petter Selasky char *p, *e;
936*d6b92ffaSHans Petter Selasky
937*d6b92ffaSHans Petter Selasky if (port1)
938*d6b92ffaSHans Petter Selasky *port1 = -1;
939*d6b92ffaSHans Petter Selasky if (port2)
940*d6b92ffaSHans Petter Selasky *port2 = -1;
941*d6b92ffaSHans Petter Selasky
942*d6b92ffaSHans Petter Selasky p = strchr(str, '/');
943*d6b92ffaSHans Petter Selasky if (p)
944*d6b92ffaSHans Petter Selasky *p = '\0';
945*d6b92ffaSHans Petter Selasky if (lid)
946*d6b92ffaSHans Petter Selasky *lid = get_lid(h, str);
947*d6b92ffaSHans Petter Selasky
948*d6b92ffaSHans Petter Selasky if (!p)
949*d6b92ffaSHans Petter Selasky return 0;
950*d6b92ffaSHans Petter Selasky str = p + 1;
951*d6b92ffaSHans Petter Selasky p = strchr(str, '/');
952*d6b92ffaSHans Petter Selasky if (p)
953*d6b92ffaSHans Petter Selasky *p = '\0';
954*d6b92ffaSHans Petter Selasky if (port1) {
955*d6b92ffaSHans Petter Selasky *port1 = strtoul(str, &e, 0);
956*d6b92ffaSHans Petter Selasky if (e == str)
957*d6b92ffaSHans Petter Selasky *port1 = -1;
958*d6b92ffaSHans Petter Selasky }
959*d6b92ffaSHans Petter Selasky
960*d6b92ffaSHans Petter Selasky if (!p)
961*d6b92ffaSHans Petter Selasky return 0;
962*d6b92ffaSHans Petter Selasky str = p + 1;
963*d6b92ffaSHans Petter Selasky if (port2) {
964*d6b92ffaSHans Petter Selasky *port2 = strtoul(str, &e, 0);
965*d6b92ffaSHans Petter Selasky if (e == str)
966*d6b92ffaSHans Petter Selasky *port2 = -1;
967*d6b92ffaSHans Petter Selasky }
968*d6b92ffaSHans Petter Selasky
969*d6b92ffaSHans Petter Selasky return 0;
970*d6b92ffaSHans Petter Selasky }
971*d6b92ffaSHans Petter Selasky
972*d6b92ffaSHans Petter Selasky /*
973*d6b92ffaSHans Petter Selasky * Get the portinfo records available with IsSM or IsSMdisabled CapabilityMask bit on.
974*d6b92ffaSHans Petter Selasky */
get_issm_records(struct sa_handle * h,ib_net32_t capability_mask,struct sa_query_result * result)975*d6b92ffaSHans Petter Selasky static int get_issm_records(struct sa_handle * h, ib_net32_t capability_mask,
976*d6b92ffaSHans Petter Selasky struct sa_query_result *result)
977*d6b92ffaSHans Petter Selasky {
978*d6b92ffaSHans Petter Selasky ib_portinfo_record_t attr;
979*d6b92ffaSHans Petter Selasky
980*d6b92ffaSHans Petter Selasky memset(&attr, 0, sizeof(attr));
981*d6b92ffaSHans Petter Selasky attr.port_info.capability_mask = capability_mask;
982*d6b92ffaSHans Petter Selasky
983*d6b92ffaSHans Petter Selasky return get_any_records(h, IB_SA_ATTR_PORTINFORECORD, 1 << 31,
984*d6b92ffaSHans Petter Selasky IB_PIR_COMPMASK_CAPMASK, &attr, sizeof(attr), result);
985*d6b92ffaSHans Petter Selasky }
986*d6b92ffaSHans Petter Selasky
print_node_records(struct sa_handle * h,struct query_params * p)987*d6b92ffaSHans Petter Selasky static int print_node_records(struct sa_handle * h, struct query_params *p)
988*d6b92ffaSHans Petter Selasky {
989*d6b92ffaSHans Petter Selasky unsigned i;
990*d6b92ffaSHans Petter Selasky int ret;
991*d6b92ffaSHans Petter Selasky struct sa_query_result result;
992*d6b92ffaSHans Petter Selasky
993*d6b92ffaSHans Petter Selasky ret = get_all_records(h, IB_SA_ATTR_NODERECORD, &result);
994*d6b92ffaSHans Petter Selasky if (ret)
995*d6b92ffaSHans Petter Selasky return ret;
996*d6b92ffaSHans Petter Selasky
997*d6b92ffaSHans Petter Selasky if (node_print_desc == ALL_DESC) {
998*d6b92ffaSHans Petter Selasky printf(" LID \"name\"\n");
999*d6b92ffaSHans Petter Selasky printf("================\n");
1000*d6b92ffaSHans Petter Selasky }
1001*d6b92ffaSHans Petter Selasky for (i = 0; i < result.result_cnt; i++) {
1002*d6b92ffaSHans Petter Selasky ib_node_record_t *node_record;
1003*d6b92ffaSHans Petter Selasky node_record = sa_get_query_rec(result.p_result_madw, i);
1004*d6b92ffaSHans Petter Selasky if (node_print_desc == ALL_DESC) {
1005*d6b92ffaSHans Petter Selasky print_node_desc(node_record);
1006*d6b92ffaSHans Petter Selasky } else if (node_print_desc == NAME_OF_LID) {
1007*d6b92ffaSHans Petter Selasky if (requested_lid == cl_ntoh16(node_record->lid))
1008*d6b92ffaSHans Petter Selasky print_node_record(node_record);
1009*d6b92ffaSHans Petter Selasky } else if (node_print_desc == NAME_OF_GUID) {
1010*d6b92ffaSHans Petter Selasky ib_node_info_t *p_ni = &(node_record->node_info);
1011*d6b92ffaSHans Petter Selasky
1012*d6b92ffaSHans Petter Selasky if (requested_guid == cl_ntoh64(p_ni->port_guid))
1013*d6b92ffaSHans Petter Selasky print_node_record(node_record);
1014*d6b92ffaSHans Petter Selasky } else {
1015*d6b92ffaSHans Petter Selasky ib_node_info_t *p_ni = &(node_record->node_info);
1016*d6b92ffaSHans Petter Selasky ib_node_desc_t *p_nd = &(node_record->node_desc);
1017*d6b92ffaSHans Petter Selasky char *name;
1018*d6b92ffaSHans Petter Selasky
1019*d6b92ffaSHans Petter Selasky name = remap_node_name (node_name_map,
1020*d6b92ffaSHans Petter Selasky cl_ntoh64(p_ni->node_guid),
1021*d6b92ffaSHans Petter Selasky (char *)p_nd->description);
1022*d6b92ffaSHans Petter Selasky
1023*d6b92ffaSHans Petter Selasky if (!requested_name ||
1024*d6b92ffaSHans Petter Selasky (strncmp(requested_name,
1025*d6b92ffaSHans Petter Selasky (char *)node_record->node_desc.description,
1026*d6b92ffaSHans Petter Selasky sizeof(node_record->
1027*d6b92ffaSHans Petter Selasky node_desc.description)) == 0) ||
1028*d6b92ffaSHans Petter Selasky (strncmp(requested_name,
1029*d6b92ffaSHans Petter Selasky name,
1030*d6b92ffaSHans Petter Selasky sizeof(node_record->
1031*d6b92ffaSHans Petter Selasky node_desc.description)) == 0)) {
1032*d6b92ffaSHans Petter Selasky print_node_record(node_record);
1033*d6b92ffaSHans Petter Selasky if (node_print_desc == UNIQUE_LID_ONLY) {
1034*d6b92ffaSHans Petter Selasky sa_free_result_mad(&result);
1035*d6b92ffaSHans Petter Selasky exit(0);
1036*d6b92ffaSHans Petter Selasky }
1037*d6b92ffaSHans Petter Selasky }
1038*d6b92ffaSHans Petter Selasky
1039*d6b92ffaSHans Petter Selasky free(name);
1040*d6b92ffaSHans Petter Selasky }
1041*d6b92ffaSHans Petter Selasky }
1042*d6b92ffaSHans Petter Selasky sa_free_result_mad(&result);
1043*d6b92ffaSHans Petter Selasky return ret;
1044*d6b92ffaSHans Petter Selasky }
1045*d6b92ffaSHans Petter Selasky
sm_pr_query(struct sa_handle * h,ibmad_gid_t * gid,int srclid,int destlid)1046*d6b92ffaSHans Petter Selasky static int sm_pr_query(struct sa_handle * h, ibmad_gid_t *gid, int srclid, int destlid) {
1047*d6b92ffaSHans Petter Selasky
1048*d6b92ffaSHans Petter Selasky ib_path_rec_t pr;
1049*d6b92ffaSHans Petter Selasky ib_net64_t comp_mask = 0;
1050*d6b92ffaSHans Petter Selasky struct sa_query_result result;
1051*d6b92ffaSHans Petter Selasky int ret;
1052*d6b92ffaSHans Petter Selasky ib_path_rec_t *p_pr;
1053*d6b92ffaSHans Petter Selasky
1054*d6b92ffaSHans Petter Selasky memset(&pr, 0, sizeof(pr));
1055*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(srclid, 16, 0, pr.slid, PR, SLID);
1056*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(destlid, 16, 0, pr.dlid, PR, DLID);
1057*d6b92ffaSHans Petter Selasky
1058*d6b92ffaSHans Petter Selasky ret = get_any_records(h, IB_SA_ATTR_PATHRECORD, 0, comp_mask, &pr, sizeof(pr), &result);
1059*d6b92ffaSHans Petter Selasky if (ret)
1060*d6b92ffaSHans Petter Selasky return ret;
1061*d6b92ffaSHans Petter Selasky
1062*d6b92ffaSHans Petter Selasky p_pr = sa_get_query_rec(result.p_result_madw, 0);
1063*d6b92ffaSHans Petter Selasky memcpy(gid, &p_pr->dgid, 16);
1064*d6b92ffaSHans Petter Selasky sa_free_result_mad(&result);
1065*d6b92ffaSHans Petter Selasky return ret;
1066*d6b92ffaSHans Petter Selasky }
1067*d6b92ffaSHans Petter Selasky
query_path_records(const struct query_cmd * q,struct sa_handle * h,struct query_params * p,int argc,char * argv[])1068*d6b92ffaSHans Petter Selasky static int query_path_records(const struct query_cmd *q, struct sa_handle * h,
1069*d6b92ffaSHans Petter Selasky struct query_params *p, int argc, char *argv[])
1070*d6b92ffaSHans Petter Selasky {
1071*d6b92ffaSHans Petter Selasky ib_path_rec_t pr;
1072*d6b92ffaSHans Petter Selasky ib_net64_t comp_mask = 0;
1073*d6b92ffaSHans Petter Selasky uint32_t flow = 0;
1074*d6b92ffaSHans Petter Selasky uint16_t qos_class = 0;
1075*d6b92ffaSHans Petter Selasky uint8_t reversible = 0;
1076*d6b92ffaSHans Petter Selasky
1077*d6b92ffaSHans Petter Selasky memset(&pr, 0, sizeof(pr));
1078*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(p->service_id, 64, 0, pr.service_id, PR, SERVICEID);
1079*d6b92ffaSHans Petter Selasky CHECK_AND_SET_GID(p->sgid, pr.sgid, PR, SGID);
1080*d6b92ffaSHans Petter Selasky CHECK_AND_SET_GID(p->dgid, pr.dgid, PR, DGID);
1081*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(p->slid, 16, 0, pr.slid, PR, SLID);
1082*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(p->dlid, 16, 0, pr.dlid, PR, DLID);
1083*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(p->hop_limit, 32, -1, pr.hop_flow_raw, PR, HOPLIMIT);
1084*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL((p->flow_label << 8), 32, 0, flow, PR, FLOWLABEL);
1085*d6b92ffaSHans Petter Selasky pr.hop_flow_raw =
1086*d6b92ffaSHans Petter Selasky (pr.hop_flow_raw & cl_hton32(~0x0FFFFF00)) | flow;
1087*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(p->tclass, 8, 0, pr.tclass, PR, TCLASS);
1088*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(p->reversible, 8, -1, reversible, PR, REVERSIBLE);
1089*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(p->numb_path, 8, -1, pr.num_path, PR, NUMBPATH);
1090*d6b92ffaSHans Petter Selasky pr.num_path |= reversible << 7;
1091*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(p->pkey, 16, 0, pr.pkey, PR, PKEY);
1092*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(p->sl, 16, -1, pr.qos_class_sl, PR, SL);
1093*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL((p->qos_class << 4), 16, -1, qos_class, PR, QOS_CLASS);
1094*d6b92ffaSHans Petter Selasky pr.qos_class_sl = (pr.qos_class_sl & CL_HTON16(IB_PATH_REC_SL_MASK)) |
1095*d6b92ffaSHans Petter Selasky qos_class;
1096*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL_AND_SEL(p->mtu, pr.mtu, PR, MTU, SELEC);
1097*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL_AND_SEL(p->rate, pr.rate, PR, RATE, SELEC);
1098*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL_AND_SEL(p->pkt_life, pr.pkt_life, PR, PKTLIFETIME,
1099*d6b92ffaSHans Petter Selasky SELEC);
1100*d6b92ffaSHans Petter Selasky
1101*d6b92ffaSHans Petter Selasky return get_and_dump_any_records(h, IB_SA_ATTR_PATHRECORD, 0, comp_mask,
1102*d6b92ffaSHans Petter Selasky &pr, sizeof(pr), dump_path_record, p);
1103*d6b92ffaSHans Petter Selasky }
1104*d6b92ffaSHans Petter Selasky
print_issm_records(struct sa_handle * h,struct query_params * p)1105*d6b92ffaSHans Petter Selasky static int print_issm_records(struct sa_handle * h, struct query_params *p)
1106*d6b92ffaSHans Petter Selasky {
1107*d6b92ffaSHans Petter Selasky struct sa_query_result result;
1108*d6b92ffaSHans Petter Selasky int ret = 0;
1109*d6b92ffaSHans Petter Selasky
1110*d6b92ffaSHans Petter Selasky /* First, get IsSM records */
1111*d6b92ffaSHans Petter Selasky ret = get_issm_records(h, IB_PORT_CAP_IS_SM, &result);
1112*d6b92ffaSHans Petter Selasky if (ret != 0)
1113*d6b92ffaSHans Petter Selasky return (ret);
1114*d6b92ffaSHans Petter Selasky
1115*d6b92ffaSHans Petter Selasky printf("IsSM ports\n");
1116*d6b92ffaSHans Petter Selasky dump_results(&result, dump_portinfo_record, p);
1117*d6b92ffaSHans Petter Selasky sa_free_result_mad(&result);
1118*d6b92ffaSHans Petter Selasky
1119*d6b92ffaSHans Petter Selasky /* Now, get IsSMdisabled records */
1120*d6b92ffaSHans Petter Selasky ret = get_issm_records(h, IB_PORT_CAP_SM_DISAB, &result);
1121*d6b92ffaSHans Petter Selasky if (ret != 0)
1122*d6b92ffaSHans Petter Selasky return (ret);
1123*d6b92ffaSHans Petter Selasky
1124*d6b92ffaSHans Petter Selasky printf("\nIsSMdisabled ports\n");
1125*d6b92ffaSHans Petter Selasky dump_results(&result, dump_portinfo_record, p);
1126*d6b92ffaSHans Petter Selasky sa_free_result_mad(&result);
1127*d6b92ffaSHans Petter Selasky
1128*d6b92ffaSHans Petter Selasky return (ret);
1129*d6b92ffaSHans Petter Selasky }
1130*d6b92ffaSHans Petter Selasky
print_multicast_member_records(struct sa_handle * h,struct query_params * params)1131*d6b92ffaSHans Petter Selasky static int print_multicast_member_records(struct sa_handle * h,
1132*d6b92ffaSHans Petter Selasky struct query_params *params)
1133*d6b92ffaSHans Petter Selasky {
1134*d6b92ffaSHans Petter Selasky struct sa_query_result mc_group_result;
1135*d6b92ffaSHans Petter Selasky struct sa_query_result nr_result;
1136*d6b92ffaSHans Petter Selasky int ret;
1137*d6b92ffaSHans Petter Selasky unsigned i;
1138*d6b92ffaSHans Petter Selasky
1139*d6b92ffaSHans Petter Selasky ret = get_all_records(h, IB_SA_ATTR_MCRECORD, &mc_group_result);
1140*d6b92ffaSHans Petter Selasky if (ret)
1141*d6b92ffaSHans Petter Selasky return ret;
1142*d6b92ffaSHans Petter Selasky
1143*d6b92ffaSHans Petter Selasky ret = get_all_records(h, IB_SA_ATTR_NODERECORD, &nr_result);
1144*d6b92ffaSHans Petter Selasky if (ret)
1145*d6b92ffaSHans Petter Selasky goto return_mc;
1146*d6b92ffaSHans Petter Selasky
1147*d6b92ffaSHans Petter Selasky for (i = 0; i < mc_group_result.result_cnt; i++) {
1148*d6b92ffaSHans Petter Selasky ib_member_rec_t *rec = (ib_member_rec_t *)
1149*d6b92ffaSHans Petter Selasky sa_get_query_rec(mc_group_result.p_result_madw,
1150*d6b92ffaSHans Petter Selasky i);
1151*d6b92ffaSHans Petter Selasky dump_multicast_member_record(rec, &nr_result, params);
1152*d6b92ffaSHans Petter Selasky }
1153*d6b92ffaSHans Petter Selasky
1154*d6b92ffaSHans Petter Selasky sa_free_result_mad(&nr_result);
1155*d6b92ffaSHans Petter Selasky
1156*d6b92ffaSHans Petter Selasky return_mc:
1157*d6b92ffaSHans Petter Selasky sa_free_result_mad(&mc_group_result);
1158*d6b92ffaSHans Petter Selasky
1159*d6b92ffaSHans Petter Selasky return ret;
1160*d6b92ffaSHans Petter Selasky }
1161*d6b92ffaSHans Petter Selasky
print_multicast_group_records(struct sa_handle * h,struct query_params * p)1162*d6b92ffaSHans Petter Selasky static int print_multicast_group_records(struct sa_handle * h,
1163*d6b92ffaSHans Petter Selasky struct query_params *p)
1164*d6b92ffaSHans Petter Selasky {
1165*d6b92ffaSHans Petter Selasky return get_and_dump_all_records(h, IB_SA_ATTR_MCRECORD,
1166*d6b92ffaSHans Petter Selasky dump_multicast_group_record, p);
1167*d6b92ffaSHans Petter Selasky }
1168*d6b92ffaSHans Petter Selasky
query_class_port_info(const struct query_cmd * q,struct sa_handle * h,struct query_params * p,int argc,char * argv[])1169*d6b92ffaSHans Petter Selasky static int query_class_port_info(const struct query_cmd *q, struct sa_handle * h,
1170*d6b92ffaSHans Petter Selasky struct query_params *p, int argc, char *argv[])
1171*d6b92ffaSHans Petter Selasky {
1172*d6b92ffaSHans Petter Selasky dump_class_port_info(&p->cpi);
1173*d6b92ffaSHans Petter Selasky return (0);
1174*d6b92ffaSHans Petter Selasky }
1175*d6b92ffaSHans Petter Selasky
query_node_records(const struct query_cmd * q,struct sa_handle * h,struct query_params * p,int argc,char * argv[])1176*d6b92ffaSHans Petter Selasky static int query_node_records(const struct query_cmd *q, struct sa_handle * h,
1177*d6b92ffaSHans Petter Selasky struct query_params *p, int argc, char *argv[])
1178*d6b92ffaSHans Petter Selasky {
1179*d6b92ffaSHans Petter Selasky ib_node_record_t nr;
1180*d6b92ffaSHans Petter Selasky ib_net64_t comp_mask = 0;
1181*d6b92ffaSHans Petter Selasky int lid = 0;
1182*d6b92ffaSHans Petter Selasky
1183*d6b92ffaSHans Petter Selasky if (argc > 0)
1184*d6b92ffaSHans Petter Selasky parse_lid_and_ports(h, argv[0], &lid, NULL, NULL);
1185*d6b92ffaSHans Petter Selasky
1186*d6b92ffaSHans Petter Selasky memset(&nr, 0, sizeof(nr));
1187*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(lid, 16, 0, nr.lid, NR, LID);
1188*d6b92ffaSHans Petter Selasky
1189*d6b92ffaSHans Petter Selasky return get_and_dump_any_records(h, IB_SA_ATTR_NODERECORD, 0, comp_mask,
1190*d6b92ffaSHans Petter Selasky &nr, sizeof(nr), dump_node_record, p);
1191*d6b92ffaSHans Petter Selasky }
1192*d6b92ffaSHans Petter Selasky
query_portinfo_records(const struct query_cmd * q,struct sa_handle * h,struct query_params * p,int argc,char * argv[])1193*d6b92ffaSHans Petter Selasky static int query_portinfo_records(const struct query_cmd *q,
1194*d6b92ffaSHans Petter Selasky struct sa_handle * h, struct query_params *p,
1195*d6b92ffaSHans Petter Selasky int argc, char *argv[])
1196*d6b92ffaSHans Petter Selasky {
1197*d6b92ffaSHans Petter Selasky ib_portinfo_record_t pir;
1198*d6b92ffaSHans Petter Selasky ib_net64_t comp_mask = 0;
1199*d6b92ffaSHans Petter Selasky int lid = 0, port = -1, options = -1;
1200*d6b92ffaSHans Petter Selasky
1201*d6b92ffaSHans Petter Selasky if (argc > 0)
1202*d6b92ffaSHans Petter Selasky parse_lid_and_ports(h, argv[0], &lid, &port, &options);
1203*d6b92ffaSHans Petter Selasky
1204*d6b92ffaSHans Petter Selasky memset(&pir, 0, sizeof(pir));
1205*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(lid, 16, 0, pir.lid, PIR, LID);
1206*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(port, 8, -1, pir.port_num, PIR, PORTNUM);
1207*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(options, 8, -1, pir.options, PIR, OPTIONS);
1208*d6b92ffaSHans Petter Selasky
1209*d6b92ffaSHans Petter Selasky return get_and_dump_any_records(h, IB_SA_ATTR_PORTINFORECORD, 0,
1210*d6b92ffaSHans Petter Selasky comp_mask, &pir, sizeof(pir),
1211*d6b92ffaSHans Petter Selasky dump_one_portinfo_record, p);
1212*d6b92ffaSHans Petter Selasky }
1213*d6b92ffaSHans Petter Selasky
query_mcmember_records(const struct query_cmd * q,struct sa_handle * h,struct query_params * p,int argc,char * argv[])1214*d6b92ffaSHans Petter Selasky static int query_mcmember_records(const struct query_cmd *q,
1215*d6b92ffaSHans Petter Selasky struct sa_handle * h, struct query_params *p,
1216*d6b92ffaSHans Petter Selasky int argc, char *argv[])
1217*d6b92ffaSHans Petter Selasky {
1218*d6b92ffaSHans Petter Selasky ib_member_rec_t mr;
1219*d6b92ffaSHans Petter Selasky ib_net64_t comp_mask = 0;
1220*d6b92ffaSHans Petter Selasky uint32_t flow = 0;
1221*d6b92ffaSHans Petter Selasky uint8_t sl = 0, hop = 0, scope = 0;
1222*d6b92ffaSHans Petter Selasky
1223*d6b92ffaSHans Petter Selasky memset(&mr, 0, sizeof(mr));
1224*d6b92ffaSHans Petter Selasky CHECK_AND_SET_GID(p->mgid, mr.mgid, MCR, MGID);
1225*d6b92ffaSHans Petter Selasky CHECK_AND_SET_GID(p->gid, mr.port_gid, MCR, PORT_GID);
1226*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(p->mlid, 16, 0, mr.mlid, MCR, MLID);
1227*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(p->qkey, 32, 0, mr.qkey, MCR, QKEY);
1228*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL_AND_SEL(p->mtu, mr.mtu, MCR, MTU, _SEL);
1229*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL_AND_SEL(p->rate, mr.rate, MCR, RATE, _SEL);
1230*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL_AND_SEL(p->pkt_life, mr.pkt_life, MCR, LIFE, _SEL);
1231*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(p->tclass, 8, 0, mr.tclass, MCR, TCLASS);
1232*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(p->pkey, 16, 0, mr.pkey, MCR, PKEY);
1233*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(p->sl, 8, -1, sl, MCR, SL);
1234*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(p->flow_label, 32, 0, flow, MCR, FLOW);
1235*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(p->hop_limit, 8, 0, hop, MCR, HOP);
1236*d6b92ffaSHans Petter Selasky /* pass flow in host order as expected by function */
1237*d6b92ffaSHans Petter Selasky mr.sl_flow_hop = ib_member_set_sl_flow_hop(sl, cl_ntoh32(flow), hop);
1238*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(p->scope, 8, 0, scope, MCR, SCOPE);
1239*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(p->join_state, 8, 0, mr.scope_state, MCR, JOIN_STATE);
1240*d6b92ffaSHans Petter Selasky mr.scope_state |= scope << 4;
1241*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(p->proxy_join, 8, -1, mr.proxy_join, MCR, PROXY);
1242*d6b92ffaSHans Petter Selasky
1243*d6b92ffaSHans Petter Selasky return get_and_dump_any_records(h, IB_SA_ATTR_MCRECORD, 0, comp_mask,
1244*d6b92ffaSHans Petter Selasky &mr, sizeof(mr), dump_one_mcmember_record, p);
1245*d6b92ffaSHans Petter Selasky }
1246*d6b92ffaSHans Petter Selasky
query_service_records(const struct query_cmd * q,struct sa_handle * h,struct query_params * p,int argc,char * argv[])1247*d6b92ffaSHans Petter Selasky static int query_service_records(const struct query_cmd *q, struct sa_handle * h,
1248*d6b92ffaSHans Petter Selasky struct query_params *p, int argc, char *argv[])
1249*d6b92ffaSHans Petter Selasky {
1250*d6b92ffaSHans Petter Selasky return get_and_dump_all_records(h, IB_SA_ATTR_SERVICERECORD,
1251*d6b92ffaSHans Petter Selasky dump_service_record, p);
1252*d6b92ffaSHans Petter Selasky }
1253*d6b92ffaSHans Petter Selasky
query_sm_info_records(const struct query_cmd * q,struct sa_handle * h,struct query_params * p,int argc,char * argv[])1254*d6b92ffaSHans Petter Selasky static int query_sm_info_records(const struct query_cmd *q,
1255*d6b92ffaSHans Petter Selasky struct sa_handle * h, struct query_params *p,
1256*d6b92ffaSHans Petter Selasky int argc, char *argv[])
1257*d6b92ffaSHans Petter Selasky {
1258*d6b92ffaSHans Petter Selasky ib_sminfo_record_t smir;
1259*d6b92ffaSHans Petter Selasky ib_net64_t comp_mask = 0;
1260*d6b92ffaSHans Petter Selasky int lid = 0;
1261*d6b92ffaSHans Petter Selasky
1262*d6b92ffaSHans Petter Selasky if (argc > 0)
1263*d6b92ffaSHans Petter Selasky parse_lid_and_ports(h, argv[0], &lid, NULL, NULL);
1264*d6b92ffaSHans Petter Selasky
1265*d6b92ffaSHans Petter Selasky memset(&smir, 0, sizeof(smir));
1266*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(lid, 16, 0, smir.lid, SMIR, LID);
1267*d6b92ffaSHans Petter Selasky
1268*d6b92ffaSHans Petter Selasky return get_and_dump_any_records(h, IB_SA_ATTR_SMINFORECORD, 0,
1269*d6b92ffaSHans Petter Selasky comp_mask, &smir, sizeof(smir),
1270*d6b92ffaSHans Petter Selasky dump_sm_info_record, p);
1271*d6b92ffaSHans Petter Selasky }
1272*d6b92ffaSHans Petter Selasky
query_switchinfo_records(const struct query_cmd * q,struct sa_handle * h,struct query_params * p,int argc,char * argv[])1273*d6b92ffaSHans Petter Selasky static int query_switchinfo_records(const struct query_cmd *q,
1274*d6b92ffaSHans Petter Selasky struct sa_handle * h, struct query_params *p,
1275*d6b92ffaSHans Petter Selasky int argc, char *argv[])
1276*d6b92ffaSHans Petter Selasky {
1277*d6b92ffaSHans Petter Selasky ib_switch_info_record_t swir;
1278*d6b92ffaSHans Petter Selasky ib_net64_t comp_mask = 0;
1279*d6b92ffaSHans Petter Selasky int lid = 0;
1280*d6b92ffaSHans Petter Selasky
1281*d6b92ffaSHans Petter Selasky if (argc > 0)
1282*d6b92ffaSHans Petter Selasky parse_lid_and_ports(h, argv[0], &lid, NULL, NULL);
1283*d6b92ffaSHans Petter Selasky
1284*d6b92ffaSHans Petter Selasky memset(&swir, 0, sizeof(swir));
1285*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(lid, 16, 0, swir.lid, SWIR, LID);
1286*d6b92ffaSHans Petter Selasky
1287*d6b92ffaSHans Petter Selasky return get_and_dump_any_records(h, IB_SA_ATTR_SWITCHINFORECORD, 0,
1288*d6b92ffaSHans Petter Selasky comp_mask, &swir, sizeof(swir),
1289*d6b92ffaSHans Petter Selasky dump_switch_info_record, p);
1290*d6b92ffaSHans Petter Selasky }
1291*d6b92ffaSHans Petter Selasky
query_inform_info_records(const struct query_cmd * q,struct sa_handle * h,struct query_params * p,int argc,char * argv[])1292*d6b92ffaSHans Petter Selasky static int query_inform_info_records(const struct query_cmd *q,
1293*d6b92ffaSHans Petter Selasky struct sa_handle * h, struct query_params *p,
1294*d6b92ffaSHans Petter Selasky int argc, char *argv[])
1295*d6b92ffaSHans Petter Selasky {
1296*d6b92ffaSHans Petter Selasky int rc = 0;
1297*d6b92ffaSHans Petter Selasky ib_inform_info_record_t ir;
1298*d6b92ffaSHans Petter Selasky ib_net64_t comp_mask = 0;
1299*d6b92ffaSHans Petter Selasky memset(&ir, 0, sizeof(ir));
1300*d6b92ffaSHans Petter Selasky
1301*d6b92ffaSHans Petter Selasky if (argc > 0) {
1302*d6b92ffaSHans Petter Selasky comp_mask = IB_IIR_COMPMASK_SUBSCRIBERGID;
1303*d6b92ffaSHans Petter Selasky if((rc = parse_iir_subscriber_gid(argv[0], &ir)) < 1)
1304*d6b92ffaSHans Petter Selasky return rc;
1305*d6b92ffaSHans Petter Selasky }
1306*d6b92ffaSHans Petter Selasky
1307*d6b92ffaSHans Petter Selasky return get_and_dump_any_records(h, IB_SA_ATTR_INFORMINFORECORD, 0, comp_mask,
1308*d6b92ffaSHans Petter Selasky &ir, sizeof(ir), dump_inform_info_record, p);
1309*d6b92ffaSHans Petter Selasky
1310*d6b92ffaSHans Petter Selasky }
1311*d6b92ffaSHans Petter Selasky
query_link_records(const struct query_cmd * q,struct sa_handle * h,struct query_params * p,int argc,char * argv[])1312*d6b92ffaSHans Petter Selasky static int query_link_records(const struct query_cmd *q, struct sa_handle * h,
1313*d6b92ffaSHans Petter Selasky struct query_params *p, int argc, char *argv[])
1314*d6b92ffaSHans Petter Selasky {
1315*d6b92ffaSHans Petter Selasky ib_link_record_t lr;
1316*d6b92ffaSHans Petter Selasky ib_net64_t comp_mask = 0;
1317*d6b92ffaSHans Petter Selasky int from_lid = 0, to_lid = 0, from_port = -1, to_port = -1;
1318*d6b92ffaSHans Petter Selasky
1319*d6b92ffaSHans Petter Selasky if (argc > 0)
1320*d6b92ffaSHans Petter Selasky parse_lid_and_ports(h, argv[0], &from_lid, &from_port, NULL);
1321*d6b92ffaSHans Petter Selasky
1322*d6b92ffaSHans Petter Selasky if (argc > 1)
1323*d6b92ffaSHans Petter Selasky parse_lid_and_ports(h, argv[1], &to_lid, &to_port, NULL);
1324*d6b92ffaSHans Petter Selasky
1325*d6b92ffaSHans Petter Selasky memset(&lr, 0, sizeof(lr));
1326*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(from_lid, 16, 0, lr.from_lid, LR, FROM_LID);
1327*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(from_port, 8, -1, lr.from_port_num, LR, FROM_PORT);
1328*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(to_lid, 16, 0, lr.to_lid, LR, TO_LID);
1329*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(to_port, 8, -1, lr.to_port_num, LR, TO_PORT);
1330*d6b92ffaSHans Petter Selasky
1331*d6b92ffaSHans Petter Selasky return get_and_dump_any_records(h, IB_SA_ATTR_LINKRECORD, 0, comp_mask,
1332*d6b92ffaSHans Petter Selasky &lr, sizeof(lr), dump_one_link_record, p);
1333*d6b92ffaSHans Petter Selasky }
1334*d6b92ffaSHans Petter Selasky
query_sl2vl_records(const struct query_cmd * q,struct sa_handle * h,struct query_params * p,int argc,char * argv[])1335*d6b92ffaSHans Petter Selasky static int query_sl2vl_records(const struct query_cmd *q, struct sa_handle * h,
1336*d6b92ffaSHans Petter Selasky struct query_params *p, int argc, char *argv[])
1337*d6b92ffaSHans Petter Selasky {
1338*d6b92ffaSHans Petter Selasky ib_slvl_table_record_t slvl;
1339*d6b92ffaSHans Petter Selasky ib_net64_t comp_mask = 0;
1340*d6b92ffaSHans Petter Selasky int lid = 0, in_port = -1, out_port = -1;
1341*d6b92ffaSHans Petter Selasky
1342*d6b92ffaSHans Petter Selasky if (argc > 0)
1343*d6b92ffaSHans Petter Selasky parse_lid_and_ports(h, argv[0], &lid, &in_port, &out_port);
1344*d6b92ffaSHans Petter Selasky
1345*d6b92ffaSHans Petter Selasky memset(&slvl, 0, sizeof(slvl));
1346*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(lid, 16, 0, slvl.lid, SLVL, LID);
1347*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(in_port, 8, -1, slvl.in_port_num, SLVL, IN_PORT);
1348*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(out_port, 8, -1, slvl.out_port_num, SLVL, OUT_PORT);
1349*d6b92ffaSHans Petter Selasky
1350*d6b92ffaSHans Petter Selasky return get_and_dump_any_records(h, IB_SA_ATTR_SL2VLTABLERECORD, 0,
1351*d6b92ffaSHans Petter Selasky comp_mask, &slvl, sizeof(slvl),
1352*d6b92ffaSHans Petter Selasky dump_one_slvl_record, p);
1353*d6b92ffaSHans Petter Selasky }
1354*d6b92ffaSHans Petter Selasky
query_vlarb_records(const struct query_cmd * q,struct sa_handle * h,struct query_params * p,int argc,char * argv[])1355*d6b92ffaSHans Petter Selasky static int query_vlarb_records(const struct query_cmd *q, struct sa_handle * h,
1356*d6b92ffaSHans Petter Selasky struct query_params *p, int argc, char *argv[])
1357*d6b92ffaSHans Petter Selasky {
1358*d6b92ffaSHans Petter Selasky ib_vl_arb_table_record_t vlarb;
1359*d6b92ffaSHans Petter Selasky ib_net64_t comp_mask = 0;
1360*d6b92ffaSHans Petter Selasky int lid = 0, port = -1, block = -1;
1361*d6b92ffaSHans Petter Selasky
1362*d6b92ffaSHans Petter Selasky if (argc > 0)
1363*d6b92ffaSHans Petter Selasky parse_lid_and_ports(h, argv[0], &lid, &port, &block);
1364*d6b92ffaSHans Petter Selasky
1365*d6b92ffaSHans Petter Selasky memset(&vlarb, 0, sizeof(vlarb));
1366*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(lid, 16, 0, vlarb.lid, VLA, LID);
1367*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(port, 8, -1, vlarb.port_num, VLA, OUT_PORT);
1368*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(block, 8, -1, vlarb.block_num, VLA, BLOCK);
1369*d6b92ffaSHans Petter Selasky
1370*d6b92ffaSHans Petter Selasky return get_and_dump_any_records(h, IB_SA_ATTR_VLARBTABLERECORD, 0,
1371*d6b92ffaSHans Petter Selasky comp_mask, &vlarb, sizeof(vlarb),
1372*d6b92ffaSHans Petter Selasky dump_one_vlarb_record, p);
1373*d6b92ffaSHans Petter Selasky }
1374*d6b92ffaSHans Petter Selasky
query_pkey_tbl_records(const struct query_cmd * q,struct sa_handle * h,struct query_params * p,int argc,char * argv[])1375*d6b92ffaSHans Petter Selasky static int query_pkey_tbl_records(const struct query_cmd *q,
1376*d6b92ffaSHans Petter Selasky struct sa_handle * h, struct query_params *p,
1377*d6b92ffaSHans Petter Selasky int argc, char *argv[])
1378*d6b92ffaSHans Petter Selasky {
1379*d6b92ffaSHans Petter Selasky ib_pkey_table_record_t pktr;
1380*d6b92ffaSHans Petter Selasky ib_net64_t comp_mask = 0;
1381*d6b92ffaSHans Petter Selasky int lid = 0, port = -1, block = -1;
1382*d6b92ffaSHans Petter Selasky
1383*d6b92ffaSHans Petter Selasky if (argc > 0)
1384*d6b92ffaSHans Petter Selasky parse_lid_and_ports(h, argv[0], &lid, &port, &block);
1385*d6b92ffaSHans Petter Selasky
1386*d6b92ffaSHans Petter Selasky memset(&pktr, 0, sizeof(pktr));
1387*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(lid, 16, 0, pktr.lid, PKEY, LID);
1388*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(port, 8, -1, pktr.port_num, PKEY, PORT);
1389*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(block, 16, -1, pktr.block_num, PKEY, BLOCK);
1390*d6b92ffaSHans Petter Selasky
1391*d6b92ffaSHans Petter Selasky return get_and_dump_any_records(h, IB_SA_ATTR_PKEYTABLERECORD, 0,
1392*d6b92ffaSHans Petter Selasky comp_mask, &pktr, sizeof(pktr),
1393*d6b92ffaSHans Petter Selasky dump_one_pkey_tbl_record, p);
1394*d6b92ffaSHans Petter Selasky }
1395*d6b92ffaSHans Petter Selasky
query_lft_records(const struct query_cmd * q,struct sa_handle * h,struct query_params * p,int argc,char * argv[])1396*d6b92ffaSHans Petter Selasky static int query_lft_records(const struct query_cmd *q, struct sa_handle * h,
1397*d6b92ffaSHans Petter Selasky struct query_params *p, int argc, char *argv[])
1398*d6b92ffaSHans Petter Selasky {
1399*d6b92ffaSHans Petter Selasky ib_lft_record_t lftr;
1400*d6b92ffaSHans Petter Selasky ib_net64_t comp_mask = 0;
1401*d6b92ffaSHans Petter Selasky int lid = 0, block = -1;
1402*d6b92ffaSHans Petter Selasky
1403*d6b92ffaSHans Petter Selasky if (argc > 0)
1404*d6b92ffaSHans Petter Selasky parse_lid_and_ports(h, argv[0], &lid, &block, NULL);
1405*d6b92ffaSHans Petter Selasky
1406*d6b92ffaSHans Petter Selasky memset(&lftr, 0, sizeof(lftr));
1407*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(lid, 16, 0, lftr.lid, LFTR, LID);
1408*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(block, 16, -1, lftr.block_num, LFTR, BLOCK);
1409*d6b92ffaSHans Petter Selasky
1410*d6b92ffaSHans Petter Selasky return get_and_dump_any_records(h, IB_SA_ATTR_LFTRECORD, 0, comp_mask,
1411*d6b92ffaSHans Petter Selasky &lftr, sizeof(lftr), dump_one_lft_record, p);
1412*d6b92ffaSHans Petter Selasky }
1413*d6b92ffaSHans Petter Selasky
query_guidinfo_records(const struct query_cmd * q,struct sa_handle * h,struct query_params * p,int argc,char * argv[])1414*d6b92ffaSHans Petter Selasky static int query_guidinfo_records(const struct query_cmd *q, struct sa_handle * h,
1415*d6b92ffaSHans Petter Selasky struct query_params *p, int argc, char *argv[])
1416*d6b92ffaSHans Petter Selasky {
1417*d6b92ffaSHans Petter Selasky ib_guidinfo_record_t gir;
1418*d6b92ffaSHans Petter Selasky ib_net64_t comp_mask = 0;
1419*d6b92ffaSHans Petter Selasky int lid = 0, block = -1;
1420*d6b92ffaSHans Petter Selasky
1421*d6b92ffaSHans Petter Selasky if (argc > 0)
1422*d6b92ffaSHans Petter Selasky parse_lid_and_ports(h, argv[0], &lid, &block, NULL);
1423*d6b92ffaSHans Petter Selasky
1424*d6b92ffaSHans Petter Selasky memset(&gir, 0, sizeof(gir));
1425*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(lid, 16, 0, gir.lid, GIR, LID);
1426*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(block, 8, -1, gir.block_num, GIR, BLOCKNUM);
1427*d6b92ffaSHans Petter Selasky
1428*d6b92ffaSHans Petter Selasky return get_and_dump_any_records(h, IB_SA_ATTR_GUIDINFORECORD, 0,
1429*d6b92ffaSHans Petter Selasky comp_mask, &gir, sizeof(gir),
1430*d6b92ffaSHans Petter Selasky dump_one_guidinfo_record, p);
1431*d6b92ffaSHans Petter Selasky }
1432*d6b92ffaSHans Petter Selasky
query_mft_records(const struct query_cmd * q,struct sa_handle * h,struct query_params * p,int argc,char * argv[])1433*d6b92ffaSHans Petter Selasky static int query_mft_records(const struct query_cmd *q, struct sa_handle * h,
1434*d6b92ffaSHans Petter Selasky struct query_params *p, int argc, char *argv[])
1435*d6b92ffaSHans Petter Selasky {
1436*d6b92ffaSHans Petter Selasky ib_mft_record_t mftr;
1437*d6b92ffaSHans Petter Selasky ib_net64_t comp_mask = 0;
1438*d6b92ffaSHans Petter Selasky int lid = 0, block = -1, position = -1;
1439*d6b92ffaSHans Petter Selasky uint16_t pos = 0;
1440*d6b92ffaSHans Petter Selasky
1441*d6b92ffaSHans Petter Selasky if (argc > 0)
1442*d6b92ffaSHans Petter Selasky parse_lid_and_ports(h, argv[0], &lid, &position, &block);
1443*d6b92ffaSHans Petter Selasky
1444*d6b92ffaSHans Petter Selasky memset(&mftr, 0, sizeof(mftr));
1445*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(lid, 16, 0, mftr.lid, MFTR, LID);
1446*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(block, 16, -1, mftr.position_block_num, MFTR, BLOCK);
1447*d6b92ffaSHans Petter Selasky mftr.position_block_num &= cl_hton16(IB_MCAST_BLOCK_ID_MASK_HO);
1448*d6b92ffaSHans Petter Selasky CHECK_AND_SET_VAL(position, 8, -1, pos, MFTR, POSITION);
1449*d6b92ffaSHans Petter Selasky mftr.position_block_num |= cl_hton16(pos << 12);
1450*d6b92ffaSHans Petter Selasky
1451*d6b92ffaSHans Petter Selasky return get_and_dump_any_records(h, IB_SA_ATTR_MFTRECORD, 0, comp_mask,
1452*d6b92ffaSHans Petter Selasky &mftr, sizeof(mftr), dump_one_mft_record, p);
1453*d6b92ffaSHans Petter Selasky }
1454*d6b92ffaSHans Petter Selasky
query_sa_cpi(struct sa_handle * h,struct query_params * query_params)1455*d6b92ffaSHans Petter Selasky static int query_sa_cpi(struct sa_handle *h, struct query_params *query_params)
1456*d6b92ffaSHans Petter Selasky {
1457*d6b92ffaSHans Petter Selasky ib_class_port_info_t *cpi;
1458*d6b92ffaSHans Petter Selasky struct sa_query_result result;
1459*d6b92ffaSHans Petter Selasky int ret = sa_query(h, IB_MAD_METHOD_GET, CLASS_PORT_INFO, 0, 0,
1460*d6b92ffaSHans Petter Selasky ibd_sakey, NULL, 0, &result);
1461*d6b92ffaSHans Petter Selasky if (ret) {
1462*d6b92ffaSHans Petter Selasky fprintf(stderr, "Query SA failed: %s\n", strerror(ret));
1463*d6b92ffaSHans Petter Selasky return ret;
1464*d6b92ffaSHans Petter Selasky }
1465*d6b92ffaSHans Petter Selasky
1466*d6b92ffaSHans Petter Selasky if (result.status != IB_SA_MAD_STATUS_SUCCESS) {
1467*d6b92ffaSHans Petter Selasky sa_report_err(result.status);
1468*d6b92ffaSHans Petter Selasky ret = EIO;
1469*d6b92ffaSHans Petter Selasky goto Exit;
1470*d6b92ffaSHans Petter Selasky }
1471*d6b92ffaSHans Petter Selasky cpi = sa_get_query_rec(result.p_result_madw, 0);
1472*d6b92ffaSHans Petter Selasky memcpy(&query_params->cpi, cpi, sizeof(query_params->cpi));
1473*d6b92ffaSHans Petter Selasky Exit:
1474*d6b92ffaSHans Petter Selasky sa_free_result_mad(&result);
1475*d6b92ffaSHans Petter Selasky return (0);
1476*d6b92ffaSHans Petter Selasky }
1477*d6b92ffaSHans Petter Selasky
1478*d6b92ffaSHans Petter Selasky static const struct query_cmd query_cmds[] = {
1479*d6b92ffaSHans Petter Selasky {"ClassPortInfo", "CPI", CLASS_PORT_INFO,
1480*d6b92ffaSHans Petter Selasky NULL, query_class_port_info},
1481*d6b92ffaSHans Petter Selasky {"NodeRecord", "NR", IB_SA_ATTR_NODERECORD,
1482*d6b92ffaSHans Petter Selasky "[lid]", query_node_records},
1483*d6b92ffaSHans Petter Selasky {"PortInfoRecord", "PIR", IB_SA_ATTR_PORTINFORECORD,
1484*d6b92ffaSHans Petter Selasky "[[lid]/[port]/[options]]", query_portinfo_records},
1485*d6b92ffaSHans Petter Selasky {"SL2VLTableRecord", "SL2VL", IB_SA_ATTR_SL2VLTABLERECORD,
1486*d6b92ffaSHans Petter Selasky "[[lid]/[in_port]/[out_port]]", query_sl2vl_records},
1487*d6b92ffaSHans Petter Selasky {"PKeyTableRecord", "PKTR", IB_SA_ATTR_PKEYTABLERECORD,
1488*d6b92ffaSHans Petter Selasky "[[lid]/[port]/[block]]", query_pkey_tbl_records},
1489*d6b92ffaSHans Petter Selasky {"VLArbitrationTableRecord", "VLAR", IB_SA_ATTR_VLARBTABLERECORD,
1490*d6b92ffaSHans Petter Selasky "[[lid]/[port]/[block]]", query_vlarb_records},
1491*d6b92ffaSHans Petter Selasky {"InformInfoRecord", "IIR", IB_SA_ATTR_INFORMINFORECORD,
1492*d6b92ffaSHans Petter Selasky "[subscriber_gid]", query_inform_info_records},
1493*d6b92ffaSHans Petter Selasky {"LinkRecord", "LR", IB_SA_ATTR_LINKRECORD,
1494*d6b92ffaSHans Petter Selasky "[[from_lid]/[from_port]] [[to_lid]/[to_port]]", query_link_records},
1495*d6b92ffaSHans Petter Selasky {"ServiceRecord", "SR", IB_SA_ATTR_SERVICERECORD,
1496*d6b92ffaSHans Petter Selasky NULL, query_service_records},
1497*d6b92ffaSHans Petter Selasky {"PathRecord", "PR", IB_SA_ATTR_PATHRECORD,
1498*d6b92ffaSHans Petter Selasky NULL, query_path_records},
1499*d6b92ffaSHans Petter Selasky {"MCMemberRecord", "MCMR", IB_SA_ATTR_MCRECORD,
1500*d6b92ffaSHans Petter Selasky NULL, query_mcmember_records},
1501*d6b92ffaSHans Petter Selasky {"LFTRecord", "LFTR", IB_SA_ATTR_LFTRECORD,
1502*d6b92ffaSHans Petter Selasky "[[lid]/[block]]", query_lft_records},
1503*d6b92ffaSHans Petter Selasky {"MFTRecord", "MFTR", IB_SA_ATTR_MFTRECORD,
1504*d6b92ffaSHans Petter Selasky "[[mlid]/[position]/[block]]", query_mft_records},
1505*d6b92ffaSHans Petter Selasky {"GUIDInfoRecord", "GIR", IB_SA_ATTR_GUIDINFORECORD,
1506*d6b92ffaSHans Petter Selasky "[[lid]/[block]]", query_guidinfo_records},
1507*d6b92ffaSHans Petter Selasky {"SwitchInfoRecord", "SWIR", IB_SA_ATTR_SWITCHINFORECORD,
1508*d6b92ffaSHans Petter Selasky "[lid]", query_switchinfo_records},
1509*d6b92ffaSHans Petter Selasky {"SMInfoRecord", "SMIR", IB_SA_ATTR_SMINFORECORD,
1510*d6b92ffaSHans Petter Selasky "[lid]", query_sm_info_records},
1511*d6b92ffaSHans Petter Selasky {0}
1512*d6b92ffaSHans Petter Selasky };
1513*d6b92ffaSHans Petter Selasky
find_query(const char * name)1514*d6b92ffaSHans Petter Selasky static const struct query_cmd *find_query(const char *name)
1515*d6b92ffaSHans Petter Selasky {
1516*d6b92ffaSHans Petter Selasky const struct query_cmd *q;
1517*d6b92ffaSHans Petter Selasky
1518*d6b92ffaSHans Petter Selasky for (q = query_cmds; q->name; q++)
1519*d6b92ffaSHans Petter Selasky if (!strcasecmp(name, q->name) ||
1520*d6b92ffaSHans Petter Selasky (q->alias && !strcasecmp(name, q->alias)))
1521*d6b92ffaSHans Petter Selasky return q;
1522*d6b92ffaSHans Petter Selasky
1523*d6b92ffaSHans Petter Selasky return NULL;
1524*d6b92ffaSHans Petter Selasky }
1525*d6b92ffaSHans Petter Selasky
find_query_by_type(uint16_t type)1526*d6b92ffaSHans Petter Selasky static const struct query_cmd *find_query_by_type(uint16_t type)
1527*d6b92ffaSHans Petter Selasky {
1528*d6b92ffaSHans Petter Selasky const struct query_cmd *q;
1529*d6b92ffaSHans Petter Selasky
1530*d6b92ffaSHans Petter Selasky for (q = query_cmds; q->name; q++)
1531*d6b92ffaSHans Petter Selasky if (q->query_type == type)
1532*d6b92ffaSHans Petter Selasky return q;
1533*d6b92ffaSHans Petter Selasky
1534*d6b92ffaSHans Petter Selasky return NULL;
1535*d6b92ffaSHans Petter Selasky }
1536*d6b92ffaSHans Petter Selasky
1537*d6b92ffaSHans Petter Selasky enum saquery_command {
1538*d6b92ffaSHans Petter Selasky SAQUERY_CMD_QUERY,
1539*d6b92ffaSHans Petter Selasky SAQUERY_CMD_NODE_RECORD,
1540*d6b92ffaSHans Petter Selasky SAQUERY_CMD_CLASS_PORT_INFO,
1541*d6b92ffaSHans Petter Selasky SAQUERY_CMD_ISSM,
1542*d6b92ffaSHans Petter Selasky SAQUERY_CMD_MCGROUPS,
1543*d6b92ffaSHans Petter Selasky SAQUERY_CMD_MCMEMBERS,
1544*d6b92ffaSHans Petter Selasky };
1545*d6b92ffaSHans Petter Selasky
1546*d6b92ffaSHans Petter Selasky static enum saquery_command command = SAQUERY_CMD_QUERY;
1547*d6b92ffaSHans Petter Selasky static uint16_t query_type;
1548*d6b92ffaSHans Petter Selasky static char *src_lid, *dst_lid;
1549*d6b92ffaSHans Petter Selasky
process_opt(void * context,int ch,char * optarg)1550*d6b92ffaSHans Petter Selasky static int process_opt(void *context, int ch, char *optarg)
1551*d6b92ffaSHans Petter Selasky {
1552*d6b92ffaSHans Petter Selasky struct query_params *p = context;
1553*d6b92ffaSHans Petter Selasky
1554*d6b92ffaSHans Petter Selasky switch (ch) {
1555*d6b92ffaSHans Petter Selasky case 1:
1556*d6b92ffaSHans Petter Selasky {
1557*d6b92ffaSHans Petter Selasky src_lid = strdup(optarg);
1558*d6b92ffaSHans Petter Selasky dst_lid = strchr(src_lid, ':');
1559*d6b92ffaSHans Petter Selasky if (!dst_lid)
1560*d6b92ffaSHans Petter Selasky ibdiag_show_usage();
1561*d6b92ffaSHans Petter Selasky *dst_lid++ = '\0';
1562*d6b92ffaSHans Petter Selasky }
1563*d6b92ffaSHans Petter Selasky p->numb_path = 0x7f;
1564*d6b92ffaSHans Petter Selasky query_type = IB_SA_ATTR_PATHRECORD;
1565*d6b92ffaSHans Petter Selasky break;
1566*d6b92ffaSHans Petter Selasky case 2:
1567*d6b92ffaSHans Petter Selasky {
1568*d6b92ffaSHans Petter Selasky char *src_addr = strdup(optarg);
1569*d6b92ffaSHans Petter Selasky char *dst_addr = strchr(src_addr, '-');
1570*d6b92ffaSHans Petter Selasky if (!dst_addr)
1571*d6b92ffaSHans Petter Selasky ibdiag_show_usage();
1572*d6b92ffaSHans Petter Selasky *dst_addr++ = '\0';
1573*d6b92ffaSHans Petter Selasky if (inet_pton(AF_INET6, src_addr, &p->sgid) <= 0)
1574*d6b92ffaSHans Petter Selasky ibdiag_show_usage();
1575*d6b92ffaSHans Petter Selasky if (inet_pton(AF_INET6, dst_addr, &p->dgid) <= 0)
1576*d6b92ffaSHans Petter Selasky ibdiag_show_usage();
1577*d6b92ffaSHans Petter Selasky free(src_addr);
1578*d6b92ffaSHans Petter Selasky }
1579*d6b92ffaSHans Petter Selasky p->numb_path = 0x7f;
1580*d6b92ffaSHans Petter Selasky query_type = IB_SA_ATTR_PATHRECORD;
1581*d6b92ffaSHans Petter Selasky break;
1582*d6b92ffaSHans Petter Selasky case 3:
1583*d6b92ffaSHans Petter Selasky node_name_map_file = strdup(optarg);
1584*d6b92ffaSHans Petter Selasky break;
1585*d6b92ffaSHans Petter Selasky case 4:
1586*d6b92ffaSHans Petter Selasky if (!isxdigit(*optarg) && !(optarg = getpass("SM_Key: "))) {
1587*d6b92ffaSHans Petter Selasky fprintf(stderr, "cannot get SM_Key\n");
1588*d6b92ffaSHans Petter Selasky ibdiag_show_usage();
1589*d6b92ffaSHans Petter Selasky }
1590*d6b92ffaSHans Petter Selasky ibd_sakey = strtoull(optarg, NULL, 0);
1591*d6b92ffaSHans Petter Selasky break;
1592*d6b92ffaSHans Petter Selasky case 'p':
1593*d6b92ffaSHans Petter Selasky query_type = IB_SA_ATTR_PATHRECORD;
1594*d6b92ffaSHans Petter Selasky break;
1595*d6b92ffaSHans Petter Selasky case 'D':
1596*d6b92ffaSHans Petter Selasky node_print_desc = ALL_DESC;
1597*d6b92ffaSHans Petter Selasky command = SAQUERY_CMD_NODE_RECORD;
1598*d6b92ffaSHans Petter Selasky break;
1599*d6b92ffaSHans Petter Selasky case 'c':
1600*d6b92ffaSHans Petter Selasky command = SAQUERY_CMD_CLASS_PORT_INFO;
1601*d6b92ffaSHans Petter Selasky break;
1602*d6b92ffaSHans Petter Selasky case 'S':
1603*d6b92ffaSHans Petter Selasky query_type = IB_SA_ATTR_SERVICERECORD;
1604*d6b92ffaSHans Petter Selasky break;
1605*d6b92ffaSHans Petter Selasky case 'I':
1606*d6b92ffaSHans Petter Selasky query_type = IB_SA_ATTR_INFORMINFORECORD;
1607*d6b92ffaSHans Petter Selasky break;
1608*d6b92ffaSHans Petter Selasky case 'N':
1609*d6b92ffaSHans Petter Selasky command = SAQUERY_CMD_NODE_RECORD;
1610*d6b92ffaSHans Petter Selasky break;
1611*d6b92ffaSHans Petter Selasky case 'L':
1612*d6b92ffaSHans Petter Selasky node_print_desc = LID_ONLY;
1613*d6b92ffaSHans Petter Selasky command = SAQUERY_CMD_NODE_RECORD;
1614*d6b92ffaSHans Petter Selasky break;
1615*d6b92ffaSHans Petter Selasky case 'l':
1616*d6b92ffaSHans Petter Selasky node_print_desc = UNIQUE_LID_ONLY;
1617*d6b92ffaSHans Petter Selasky command = SAQUERY_CMD_NODE_RECORD;
1618*d6b92ffaSHans Petter Selasky break;
1619*d6b92ffaSHans Petter Selasky case 'G':
1620*d6b92ffaSHans Petter Selasky node_print_desc = GUID_ONLY;
1621*d6b92ffaSHans Petter Selasky command = SAQUERY_CMD_NODE_RECORD;
1622*d6b92ffaSHans Petter Selasky break;
1623*d6b92ffaSHans Petter Selasky case 'O':
1624*d6b92ffaSHans Petter Selasky node_print_desc = NAME_OF_LID;
1625*d6b92ffaSHans Petter Selasky command = SAQUERY_CMD_NODE_RECORD;
1626*d6b92ffaSHans Petter Selasky break;
1627*d6b92ffaSHans Petter Selasky case 'U':
1628*d6b92ffaSHans Petter Selasky node_print_desc = NAME_OF_GUID;
1629*d6b92ffaSHans Petter Selasky command = SAQUERY_CMD_NODE_RECORD;
1630*d6b92ffaSHans Petter Selasky break;
1631*d6b92ffaSHans Petter Selasky case 's':
1632*d6b92ffaSHans Petter Selasky command = SAQUERY_CMD_ISSM;
1633*d6b92ffaSHans Petter Selasky break;
1634*d6b92ffaSHans Petter Selasky case 'g':
1635*d6b92ffaSHans Petter Selasky command = SAQUERY_CMD_MCGROUPS;
1636*d6b92ffaSHans Petter Selasky break;
1637*d6b92ffaSHans Petter Selasky case 'm':
1638*d6b92ffaSHans Petter Selasky command = SAQUERY_CMD_MCMEMBERS;
1639*d6b92ffaSHans Petter Selasky break;
1640*d6b92ffaSHans Petter Selasky case 'x':
1641*d6b92ffaSHans Petter Selasky query_type = IB_SA_ATTR_LINKRECORD;
1642*d6b92ffaSHans Petter Selasky break;
1643*d6b92ffaSHans Petter Selasky case 5:
1644*d6b92ffaSHans Petter Selasky p->slid = (uint16_t) strtoul(optarg, NULL, 0);
1645*d6b92ffaSHans Petter Selasky break;
1646*d6b92ffaSHans Petter Selasky case 6:
1647*d6b92ffaSHans Petter Selasky p->dlid = (uint16_t) strtoul(optarg, NULL, 0);
1648*d6b92ffaSHans Petter Selasky break;
1649*d6b92ffaSHans Petter Selasky case 7:
1650*d6b92ffaSHans Petter Selasky p->mlid = (uint16_t) strtoul(optarg, NULL, 0);
1651*d6b92ffaSHans Petter Selasky break;
1652*d6b92ffaSHans Petter Selasky case 14:
1653*d6b92ffaSHans Petter Selasky if (inet_pton(AF_INET6, optarg, &p->sgid) <= 0)
1654*d6b92ffaSHans Petter Selasky ibdiag_show_usage();
1655*d6b92ffaSHans Petter Selasky break;
1656*d6b92ffaSHans Petter Selasky case 15:
1657*d6b92ffaSHans Petter Selasky if (inet_pton(AF_INET6, optarg, &p->dgid) <= 0)
1658*d6b92ffaSHans Petter Selasky ibdiag_show_usage();
1659*d6b92ffaSHans Petter Selasky break;
1660*d6b92ffaSHans Petter Selasky case 16:
1661*d6b92ffaSHans Petter Selasky if (inet_pton(AF_INET6, optarg, &p->gid) <= 0)
1662*d6b92ffaSHans Petter Selasky ibdiag_show_usage();
1663*d6b92ffaSHans Petter Selasky break;
1664*d6b92ffaSHans Petter Selasky case 17:
1665*d6b92ffaSHans Petter Selasky if (inet_pton(AF_INET6, optarg, &p->mgid) <= 0)
1666*d6b92ffaSHans Petter Selasky ibdiag_show_usage();
1667*d6b92ffaSHans Petter Selasky break;
1668*d6b92ffaSHans Petter Selasky case 'r':
1669*d6b92ffaSHans Petter Selasky p->reversible = strtoul(optarg, NULL, 0);
1670*d6b92ffaSHans Petter Selasky break;
1671*d6b92ffaSHans Petter Selasky case 'n':
1672*d6b92ffaSHans Petter Selasky p->numb_path = strtoul(optarg, NULL, 0);
1673*d6b92ffaSHans Petter Selasky break;
1674*d6b92ffaSHans Petter Selasky case 18:
1675*d6b92ffaSHans Petter Selasky if (!isxdigit(*optarg) && !(optarg = getpass("P_Key: "))) {
1676*d6b92ffaSHans Petter Selasky fprintf(stderr, "cannot get P_Key\n");
1677*d6b92ffaSHans Petter Selasky ibdiag_show_usage();
1678*d6b92ffaSHans Petter Selasky }
1679*d6b92ffaSHans Petter Selasky p->pkey = (uint16_t) strtoul(optarg, NULL, 0);
1680*d6b92ffaSHans Petter Selasky break;
1681*d6b92ffaSHans Petter Selasky case 'Q':
1682*d6b92ffaSHans Petter Selasky p->qos_class = strtoul(optarg, NULL, 0);
1683*d6b92ffaSHans Petter Selasky break;
1684*d6b92ffaSHans Petter Selasky case 19:
1685*d6b92ffaSHans Petter Selasky p->sl = strtoul(optarg, NULL, 0);
1686*d6b92ffaSHans Petter Selasky break;
1687*d6b92ffaSHans Petter Selasky case 'M':
1688*d6b92ffaSHans Petter Selasky p->mtu = (uint8_t) strtoul(optarg, NULL, 0);
1689*d6b92ffaSHans Petter Selasky break;
1690*d6b92ffaSHans Petter Selasky case 'R':
1691*d6b92ffaSHans Petter Selasky p->rate = (uint8_t) strtoul(optarg, NULL, 0);
1692*d6b92ffaSHans Petter Selasky break;
1693*d6b92ffaSHans Petter Selasky case 20:
1694*d6b92ffaSHans Petter Selasky p->pkt_life = (uint8_t) strtoul(optarg, NULL, 0);
1695*d6b92ffaSHans Petter Selasky break;
1696*d6b92ffaSHans Petter Selasky case 'q':
1697*d6b92ffaSHans Petter Selasky if (!isxdigit(*optarg) && !(optarg = getpass("Q_Key: "))) {
1698*d6b92ffaSHans Petter Selasky fprintf(stderr, "cannot get Q_Key\n");
1699*d6b92ffaSHans Petter Selasky ibdiag_show_usage();
1700*d6b92ffaSHans Petter Selasky }
1701*d6b92ffaSHans Petter Selasky p->qkey = strtoul(optarg, NULL, 0);
1702*d6b92ffaSHans Petter Selasky break;
1703*d6b92ffaSHans Petter Selasky case 'T':
1704*d6b92ffaSHans Petter Selasky p->tclass = (uint8_t) strtoul(optarg, NULL, 0);
1705*d6b92ffaSHans Petter Selasky break;
1706*d6b92ffaSHans Petter Selasky case 'F':
1707*d6b92ffaSHans Petter Selasky p->flow_label = strtoul(optarg, NULL, 0);
1708*d6b92ffaSHans Petter Selasky break;
1709*d6b92ffaSHans Petter Selasky case 'H':
1710*d6b92ffaSHans Petter Selasky p->hop_limit = strtoul(optarg, NULL, 0);
1711*d6b92ffaSHans Petter Selasky break;
1712*d6b92ffaSHans Petter Selasky case 21:
1713*d6b92ffaSHans Petter Selasky p->scope = (uint8_t) strtoul(optarg, NULL, 0);
1714*d6b92ffaSHans Petter Selasky break;
1715*d6b92ffaSHans Petter Selasky case 'J':
1716*d6b92ffaSHans Petter Selasky p->join_state = (uint8_t) strtoul(optarg, NULL, 0);
1717*d6b92ffaSHans Petter Selasky break;
1718*d6b92ffaSHans Petter Selasky case 'X':
1719*d6b92ffaSHans Petter Selasky p->proxy_join = strtoul(optarg, NULL, 0);
1720*d6b92ffaSHans Petter Selasky break;
1721*d6b92ffaSHans Petter Selasky case 22:
1722*d6b92ffaSHans Petter Selasky p->service_id = strtoull(optarg, NULL, 0);
1723*d6b92ffaSHans Petter Selasky break;
1724*d6b92ffaSHans Petter Selasky case 23:
1725*d6b92ffaSHans Petter Selasky p->with_grh = TRUE;
1726*d6b92ffaSHans Petter Selasky break;
1727*d6b92ffaSHans Petter Selasky case 24:
1728*d6b92ffaSHans Petter Selasky p->with_grh = TRUE;
1729*d6b92ffaSHans Petter Selasky if (inet_pton(AF_INET6, optarg, &p->sa_dgid) <= 0)
1730*d6b92ffaSHans Petter Selasky ibdiag_show_usage();
1731*d6b92ffaSHans Petter Selasky break;
1732*d6b92ffaSHans Petter Selasky default:
1733*d6b92ffaSHans Petter Selasky return -1;
1734*d6b92ffaSHans Petter Selasky }
1735*d6b92ffaSHans Petter Selasky return 0;
1736*d6b92ffaSHans Petter Selasky }
1737*d6b92ffaSHans Petter Selasky
main(int argc,char ** argv)1738*d6b92ffaSHans Petter Selasky int main(int argc, char **argv)
1739*d6b92ffaSHans Petter Selasky {
1740*d6b92ffaSHans Petter Selasky ib_portid_t portid = { 0 };
1741*d6b92ffaSHans Petter Selasky int port = 0;
1742*d6b92ffaSHans Petter Selasky int sa_cpi_required = 0;
1743*d6b92ffaSHans Petter Selasky char usage_args[1024];
1744*d6b92ffaSHans Petter Selasky struct sa_handle * h;
1745*d6b92ffaSHans Petter Selasky struct query_params params;
1746*d6b92ffaSHans Petter Selasky const struct query_cmd *q;
1747*d6b92ffaSHans Petter Selasky int status;
1748*d6b92ffaSHans Petter Selasky int n;
1749*d6b92ffaSHans Petter Selasky
1750*d6b92ffaSHans Petter Selasky const struct ibdiag_opt opts[] = {
1751*d6b92ffaSHans Petter Selasky {"p", 'p', 0, NULL, "get PathRecord info"},
1752*d6b92ffaSHans Petter Selasky {"N", 'N', 0, NULL, "get NodeRecord info"},
1753*d6b92ffaSHans Petter Selasky {"L", 'L', 0, NULL, "return the Lids of the name specified"},
1754*d6b92ffaSHans Petter Selasky {"l", 'l', 0, NULL,
1755*d6b92ffaSHans Petter Selasky "return the unique Lid of the name specified"},
1756*d6b92ffaSHans Petter Selasky {"G", 'G', 0, NULL, "return the Guids of the name specified"},
1757*d6b92ffaSHans Petter Selasky {"O", 'O', 0, NULL, "return name for the Lid specified"},
1758*d6b92ffaSHans Petter Selasky {"U", 'U', 0, NULL, "return name for the Guid specified"},
1759*d6b92ffaSHans Petter Selasky {"s", 's', 0, NULL, "return the PortInfoRecords with isSM or"
1760*d6b92ffaSHans Petter Selasky " isSMdisabled capability mask bit on"},
1761*d6b92ffaSHans Petter Selasky {"g", 'g', 0, NULL, "get multicast group info"},
1762*d6b92ffaSHans Petter Selasky {"m", 'm', 0, NULL, "get multicast member info (if multicast"
1763*d6b92ffaSHans Petter Selasky " group specified, list member GIDs only for group specified,"
1764*d6b92ffaSHans Petter Selasky " for example 'saquery -m 0xC000')"},
1765*d6b92ffaSHans Petter Selasky {"x", 'x', 0, NULL, "get LinkRecord info"},
1766*d6b92ffaSHans Petter Selasky {"c", 'c', 0, NULL, "get the SA's class port info"},
1767*d6b92ffaSHans Petter Selasky {"S", 'S', 0, NULL, "get ServiceRecord info"},
1768*d6b92ffaSHans Petter Selasky {"I", 'I', 0, NULL, "get InformInfoRecord (subscription) info"},
1769*d6b92ffaSHans Petter Selasky {"list", 'D', 0, NULL, "the node desc of the CA's"},
1770*d6b92ffaSHans Petter Selasky {"with-grh", 23, 0, NULL, "add GRH to path record query"},
1771*d6b92ffaSHans Petter Selasky {"sa-dgid", 24, 1, "<gid>",
1772*d6b92ffaSHans Petter Selasky "Set destination GID (in IPv6 format) in the GRH"},
1773*d6b92ffaSHans Petter Selasky {"src-to-dst", 1, 1, "<src:dst>", "get a PathRecord for"
1774*d6b92ffaSHans Petter Selasky " <src:dst> where src and dst are either node names or LIDs"},
1775*d6b92ffaSHans Petter Selasky {"sgid-to-dgid", 2, 1, "<sgid-dgid>", "get a PathRecord for"
1776*d6b92ffaSHans Petter Selasky " <sgid-dgid> where sgid and dgid are addresses in IPv6 format"},
1777*d6b92ffaSHans Petter Selasky {"node-name-map", 3, 1, "<file>",
1778*d6b92ffaSHans Petter Selasky "specify a node name map file"},
1779*d6b92ffaSHans Petter Selasky {"smkey", 4, 1, "<val>",
1780*d6b92ffaSHans Petter Selasky "SA SM_Key value for the query."
1781*d6b92ffaSHans Petter Selasky " If non-numeric value (like 'x') is specified then"
1782*d6b92ffaSHans Petter Selasky " saquery will prompt for a value. "
1783*d6b92ffaSHans Petter Selasky " Default (when not specified here or in ibdiag.conf) is to "
1784*d6b92ffaSHans Petter Selasky " use SM_Key == 0 (or \"untrusted\")"},
1785*d6b92ffaSHans Petter Selasky {"slid", 5, 1, "<lid>", "Source LID (PathRecord)"},
1786*d6b92ffaSHans Petter Selasky {"dlid", 6, 1, "<lid>", "Destination LID (PathRecord)"},
1787*d6b92ffaSHans Petter Selasky {"mlid", 7, 1, "<lid>", "Multicast LID (MCMemberRecord)"},
1788*d6b92ffaSHans Petter Selasky {"sgid", 14, 1, "<gid>",
1789*d6b92ffaSHans Petter Selasky "Source GID (IPv6 format) (PathRecord)"},
1790*d6b92ffaSHans Petter Selasky {"dgid", 15, 1, "<gid>",
1791*d6b92ffaSHans Petter Selasky "Destination GID (IPv6 format) (PathRecord)"},
1792*d6b92ffaSHans Petter Selasky {"gid", 16, 1, "<gid>", "Port GID (MCMemberRecord)"},
1793*d6b92ffaSHans Petter Selasky {"mgid", 17, 1, "<gid>", "Multicast GID (MCMemberRecord)"},
1794*d6b92ffaSHans Petter Selasky {"reversible", 'r', 1, NULL, "Reversible path (PathRecord)"},
1795*d6b92ffaSHans Petter Selasky {"numb_path", 'n', 1, NULL, "Number of paths (PathRecord)"},
1796*d6b92ffaSHans Petter Selasky {"pkey", 18, 1, NULL, "P_Key (PathRecord, MCMemberRecord)."
1797*d6b92ffaSHans Petter Selasky " If non-numeric value (like 'x') is specified then"
1798*d6b92ffaSHans Petter Selasky " saquery will prompt for a value"},
1799*d6b92ffaSHans Petter Selasky {"qos_class", 'Q', 1, NULL, "QoS Class (PathRecord)"},
1800*d6b92ffaSHans Petter Selasky {"sl", 19, 1, NULL,
1801*d6b92ffaSHans Petter Selasky "Service level (PathRecord, MCMemberRecord)"},
1802*d6b92ffaSHans Petter Selasky {"mtu", 'M', 1, NULL,
1803*d6b92ffaSHans Petter Selasky "MTU and selector (PathRecord, MCMemberRecord)"},
1804*d6b92ffaSHans Petter Selasky {"rate", 'R', 1, NULL,
1805*d6b92ffaSHans Petter Selasky "Rate and selector (PathRecord, MCMemberRecord)"},
1806*d6b92ffaSHans Petter Selasky {"pkt_lifetime", 20, 1, NULL,
1807*d6b92ffaSHans Petter Selasky "Packet lifetime and selector (PathRecord, MCMemberRecord)"},
1808*d6b92ffaSHans Petter Selasky {"qkey", 'q', 1, NULL, "Q_Key (MCMemberRecord)."
1809*d6b92ffaSHans Petter Selasky " If non-numeric value (like 'x') is specified then"
1810*d6b92ffaSHans Petter Selasky " saquery will prompt for a value"},
1811*d6b92ffaSHans Petter Selasky {"tclass", 'T', 1, NULL,
1812*d6b92ffaSHans Petter Selasky "Traffic Class (PathRecord, MCMemberRecord)"},
1813*d6b92ffaSHans Petter Selasky {"flow_label", 'F', 1, NULL,
1814*d6b92ffaSHans Petter Selasky "Flow Label (PathRecord, MCMemberRecord)"},
1815*d6b92ffaSHans Petter Selasky {"hop_limit", 'H', 1, NULL,
1816*d6b92ffaSHans Petter Selasky "Hop limit (PathRecord, MCMemberRecord)"},
1817*d6b92ffaSHans Petter Selasky {"scope", 21, 1, NULL, "Scope (MCMemberRecord)"},
1818*d6b92ffaSHans Petter Selasky {"join_state", 'J', 1, NULL, "Join state (MCMemberRecord)"},
1819*d6b92ffaSHans Petter Selasky {"proxy_join", 'X', 1, NULL, "Proxy join (MCMemberRecord)"},
1820*d6b92ffaSHans Petter Selasky {"service_id", 22, 1, NULL, "ServiceID (PathRecord)"},
1821*d6b92ffaSHans Petter Selasky {0}
1822*d6b92ffaSHans Petter Selasky };
1823*d6b92ffaSHans Petter Selasky
1824*d6b92ffaSHans Petter Selasky memset(¶ms, 0, sizeof params);
1825*d6b92ffaSHans Petter Selasky params.hop_limit = 0;
1826*d6b92ffaSHans Petter Selasky params.reversible = -1;
1827*d6b92ffaSHans Petter Selasky params.numb_path = -1;
1828*d6b92ffaSHans Petter Selasky params.qos_class = -1;
1829*d6b92ffaSHans Petter Selasky params.sl = -1;
1830*d6b92ffaSHans Petter Selasky params.proxy_join = -1;
1831*d6b92ffaSHans Petter Selasky
1832*d6b92ffaSHans Petter Selasky n = sprintf(usage_args, "[query-name] [<name> | <lid> | <guid>]\n"
1833*d6b92ffaSHans Petter Selasky "\nSupported query names (and aliases):\n");
1834*d6b92ffaSHans Petter Selasky for (q = query_cmds; q->name; q++) {
1835*d6b92ffaSHans Petter Selasky n += snprintf(usage_args + n, sizeof(usage_args) - n,
1836*d6b92ffaSHans Petter Selasky " %s (%s) %s\n", q->name,
1837*d6b92ffaSHans Petter Selasky q->alias ? q->alias : "",
1838*d6b92ffaSHans Petter Selasky q->usage ? q->usage : "");
1839*d6b92ffaSHans Petter Selasky if (n >= sizeof(usage_args))
1840*d6b92ffaSHans Petter Selasky exit(-1);
1841*d6b92ffaSHans Petter Selasky }
1842*d6b92ffaSHans Petter Selasky snprintf(usage_args + n, sizeof(usage_args) - n,
1843*d6b92ffaSHans Petter Selasky "\n Queries node records by default.");
1844*d6b92ffaSHans Petter Selasky
1845*d6b92ffaSHans Petter Selasky q = NULL;
1846*d6b92ffaSHans Petter Selasky ibd_timeout = DEFAULT_SA_TIMEOUT_MS;
1847*d6b92ffaSHans Petter Selasky
1848*d6b92ffaSHans Petter Selasky ibdiag_process_opts(argc, argv, ¶ms, "DGLsy", opts, process_opt,
1849*d6b92ffaSHans Petter Selasky usage_args, NULL);
1850*d6b92ffaSHans Petter Selasky
1851*d6b92ffaSHans Petter Selasky argc -= optind;
1852*d6b92ffaSHans Petter Selasky argv += optind;
1853*d6b92ffaSHans Petter Selasky
1854*d6b92ffaSHans Petter Selasky if (!query_type && command == SAQUERY_CMD_QUERY) {
1855*d6b92ffaSHans Petter Selasky if (!argc || !(q = find_query(argv[0])))
1856*d6b92ffaSHans Petter Selasky query_type = IB_SA_ATTR_NODERECORD;
1857*d6b92ffaSHans Petter Selasky else {
1858*d6b92ffaSHans Petter Selasky query_type = q->query_type;
1859*d6b92ffaSHans Petter Selasky argc--;
1860*d6b92ffaSHans Petter Selasky argv++;
1861*d6b92ffaSHans Petter Selasky }
1862*d6b92ffaSHans Petter Selasky }
1863*d6b92ffaSHans Petter Selasky
1864*d6b92ffaSHans Petter Selasky if (argc) {
1865*d6b92ffaSHans Petter Selasky if (node_print_desc == NAME_OF_LID) {
1866*d6b92ffaSHans Petter Selasky requested_lid = (uint16_t) strtoul(argv[0], NULL, 0);
1867*d6b92ffaSHans Petter Selasky requested_lid_flag++;
1868*d6b92ffaSHans Petter Selasky } else if (node_print_desc == NAME_OF_GUID) {
1869*d6b92ffaSHans Petter Selasky requested_guid = strtoul(argv[0], NULL, 0);
1870*d6b92ffaSHans Petter Selasky requested_guid_flag++;
1871*d6b92ffaSHans Petter Selasky } else
1872*d6b92ffaSHans Petter Selasky requested_name = argv[0];
1873*d6b92ffaSHans Petter Selasky }
1874*d6b92ffaSHans Petter Selasky
1875*d6b92ffaSHans Petter Selasky if ((node_print_desc == LID_ONLY ||
1876*d6b92ffaSHans Petter Selasky node_print_desc == UNIQUE_LID_ONLY ||
1877*d6b92ffaSHans Petter Selasky node_print_desc == GUID_ONLY) && !requested_name) {
1878*d6b92ffaSHans Petter Selasky fprintf(stderr, "ERROR: name not specified\n");
1879*d6b92ffaSHans Petter Selasky ibdiag_show_usage();
1880*d6b92ffaSHans Petter Selasky }
1881*d6b92ffaSHans Petter Selasky
1882*d6b92ffaSHans Petter Selasky if (node_print_desc == NAME_OF_LID && !requested_lid_flag) {
1883*d6b92ffaSHans Petter Selasky fprintf(stderr, "ERROR: lid not specified\n");
1884*d6b92ffaSHans Petter Selasky ibdiag_show_usage();
1885*d6b92ffaSHans Petter Selasky }
1886*d6b92ffaSHans Petter Selasky
1887*d6b92ffaSHans Petter Selasky if (node_print_desc == NAME_OF_GUID && !requested_guid_flag) {
1888*d6b92ffaSHans Petter Selasky fprintf(stderr, "ERROR: guid not specified\n");
1889*d6b92ffaSHans Petter Selasky ibdiag_show_usage();
1890*d6b92ffaSHans Petter Selasky }
1891*d6b92ffaSHans Petter Selasky
1892*d6b92ffaSHans Petter Selasky /* Note: lid cannot be 0; see infiniband spec 4.1.3 */
1893*d6b92ffaSHans Petter Selasky if (node_print_desc == NAME_OF_LID && !requested_lid) {
1894*d6b92ffaSHans Petter Selasky fprintf(stderr, "ERROR: lid invalid\n");
1895*d6b92ffaSHans Petter Selasky ibdiag_show_usage();
1896*d6b92ffaSHans Petter Selasky }
1897*d6b92ffaSHans Petter Selasky
1898*d6b92ffaSHans Petter Selasky if (umad_init())
1899*d6b92ffaSHans Petter Selasky IBEXIT("Failed to initialized umad library");
1900*d6b92ffaSHans Petter Selasky h = sa_get_handle();
1901*d6b92ffaSHans Petter Selasky if (!h)
1902*d6b92ffaSHans Petter Selasky IBPANIC("Failed to bind to the SA");
1903*d6b92ffaSHans Petter Selasky
1904*d6b92ffaSHans Petter Selasky if (params.with_grh) {
1905*d6b92ffaSHans Petter Selasky ibmad_gid_t gid = { 0 };
1906*d6b92ffaSHans Petter Selasky /*
1907*d6b92ffaSHans Petter Selasky * If GRH destination GID is not specified, try to get it by
1908*d6b92ffaSHans Petter Selasky * querying the SA.
1909*d6b92ffaSHans Petter Selasky */
1910*d6b92ffaSHans Petter Selasky if (!memcmp(&gid, ¶ms.sa_dgid, sizeof(ibmad_gid_t))) {
1911*d6b92ffaSHans Petter Selasky if ((status = resolve_self(ibd_ca, ibd_ca_port, &portid,
1912*d6b92ffaSHans Petter Selasky &port, 0)) < 0) {
1913*d6b92ffaSHans Petter Selasky fprintf(stderr, "can't resolve self port %s\n",
1914*d6b92ffaSHans Petter Selasky argv[0]);
1915*d6b92ffaSHans Petter Selasky goto error;
1916*d6b92ffaSHans Petter Selasky }
1917*d6b92ffaSHans Petter Selasky if ((status = sm_pr_query(h, &gid, portid.lid,
1918*d6b92ffaSHans Petter Selasky h->dport.lid)) > 0) {
1919*d6b92ffaSHans Petter Selasky fprintf(stderr,
1920*d6b92ffaSHans Petter Selasky "Failed to query SA:PathRecord\n");
1921*d6b92ffaSHans Petter Selasky goto error;
1922*d6b92ffaSHans Petter Selasky }
1923*d6b92ffaSHans Petter Selasky } else
1924*d6b92ffaSHans Petter Selasky memcpy(&gid, ¶ms.sa_dgid, sizeof(ibmad_gid_t));
1925*d6b92ffaSHans Petter Selasky
1926*d6b92ffaSHans Petter Selasky if ((status = sa_set_handle(h, 1, &gid)) < 0) {
1927*d6b92ffaSHans Petter Selasky fprintf(stderr, "Failed to set GRH\n");
1928*d6b92ffaSHans Petter Selasky goto error;
1929*d6b92ffaSHans Petter Selasky }
1930*d6b92ffaSHans Petter Selasky }
1931*d6b92ffaSHans Petter Selasky
1932*d6b92ffaSHans Petter Selasky node_name_map = open_node_name_map(node_name_map_file);
1933*d6b92ffaSHans Petter Selasky
1934*d6b92ffaSHans Petter Selasky if (src_lid && *src_lid)
1935*d6b92ffaSHans Petter Selasky params.slid = get_lid(h, src_lid);
1936*d6b92ffaSHans Petter Selasky if (dst_lid && *dst_lid)
1937*d6b92ffaSHans Petter Selasky params.dlid = get_lid(h, dst_lid);
1938*d6b92ffaSHans Petter Selasky
1939*d6b92ffaSHans Petter Selasky if (command == SAQUERY_CMD_CLASS_PORT_INFO ||
1940*d6b92ffaSHans Petter Selasky query_type == CLASS_PORT_INFO ||
1941*d6b92ffaSHans Petter Selasky query_type == IB_SA_ATTR_SWITCHINFORECORD)
1942*d6b92ffaSHans Petter Selasky sa_cpi_required = 1;
1943*d6b92ffaSHans Petter Selasky
1944*d6b92ffaSHans Petter Selasky if (sa_cpi_required && (status = query_sa_cpi(h, ¶ms)) != 0) {
1945*d6b92ffaSHans Petter Selasky fprintf(stderr, "Failed to query SA:ClassPortInfo\n");
1946*d6b92ffaSHans Petter Selasky goto error;
1947*d6b92ffaSHans Petter Selasky }
1948*d6b92ffaSHans Petter Selasky
1949*d6b92ffaSHans Petter Selasky switch (command) {
1950*d6b92ffaSHans Petter Selasky case SAQUERY_CMD_NODE_RECORD:
1951*d6b92ffaSHans Petter Selasky status = print_node_records(h, ¶ms);
1952*d6b92ffaSHans Petter Selasky break;
1953*d6b92ffaSHans Petter Selasky case SAQUERY_CMD_CLASS_PORT_INFO:
1954*d6b92ffaSHans Petter Selasky dump_class_port_info(¶ms.cpi);
1955*d6b92ffaSHans Petter Selasky status = 0;
1956*d6b92ffaSHans Petter Selasky break;
1957*d6b92ffaSHans Petter Selasky case SAQUERY_CMD_ISSM:
1958*d6b92ffaSHans Petter Selasky status = print_issm_records(h, ¶ms);
1959*d6b92ffaSHans Petter Selasky break;
1960*d6b92ffaSHans Petter Selasky case SAQUERY_CMD_MCGROUPS:
1961*d6b92ffaSHans Petter Selasky status = print_multicast_group_records(h, ¶ms);
1962*d6b92ffaSHans Petter Selasky break;
1963*d6b92ffaSHans Petter Selasky case SAQUERY_CMD_MCMEMBERS:
1964*d6b92ffaSHans Petter Selasky status = print_multicast_member_records(h, ¶ms);
1965*d6b92ffaSHans Petter Selasky break;
1966*d6b92ffaSHans Petter Selasky default:
1967*d6b92ffaSHans Petter Selasky if ((!q && !(q = find_query_by_type(query_type)))
1968*d6b92ffaSHans Petter Selasky || !q->handler) {
1969*d6b92ffaSHans Petter Selasky fprintf(stderr, "Unknown query type %d\n",
1970*d6b92ffaSHans Petter Selasky ntohs(query_type));
1971*d6b92ffaSHans Petter Selasky status = EINVAL;
1972*d6b92ffaSHans Petter Selasky } else
1973*d6b92ffaSHans Petter Selasky status = q->handler(q, h, ¶ms, argc, argv);
1974*d6b92ffaSHans Petter Selasky break;
1975*d6b92ffaSHans Petter Selasky }
1976*d6b92ffaSHans Petter Selasky
1977*d6b92ffaSHans Petter Selasky error:
1978*d6b92ffaSHans Petter Selasky if (src_lid)
1979*d6b92ffaSHans Petter Selasky free(src_lid);
1980*d6b92ffaSHans Petter Selasky sa_free_handle(h);
1981*d6b92ffaSHans Petter Selasky umad_done();
1982*d6b92ffaSHans Petter Selasky close_node_name_map(node_name_map);
1983*d6b92ffaSHans Petter Selasky return (status);
1984*d6b92ffaSHans Petter Selasky }
1985