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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 */ 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 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 */ 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 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 */ 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 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 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 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 */ 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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