1*d6b92ffaSHans Petter Selasky /* 2*d6b92ffaSHans Petter Selasky * Copyright (c) 2009 Voltaire, Inc. All rights reserved. 3*d6b92ffaSHans Petter Selasky * Copyright (c) 2008 Lawrence Livermore National Lab. All rights reserved. 4*d6b92ffaSHans Petter Selasky * Copyright (c) 2010-2011 Mellanox Technologies LTD. All rights reserved. 5*d6b92ffaSHans Petter Selasky * 6*d6b92ffaSHans Petter Selasky * This software is available to you under a choice of one of two 7*d6b92ffaSHans Petter Selasky * licenses. You may choose to be licensed under the terms of the GNU 8*d6b92ffaSHans Petter Selasky * General Public License (GPL) Version 2, available from the file 9*d6b92ffaSHans Petter Selasky * COPYING in the main directory of this source tree, or the 10*d6b92ffaSHans Petter Selasky * OpenIB.org BSD license below: 11*d6b92ffaSHans Petter Selasky * 12*d6b92ffaSHans Petter Selasky * Redistribution and use in source and binary forms, with or 13*d6b92ffaSHans Petter Selasky * without modification, are permitted provided that the following 14*d6b92ffaSHans Petter Selasky * conditions are met: 15*d6b92ffaSHans Petter Selasky * 16*d6b92ffaSHans Petter Selasky * - Redistributions of source code must retain the above 17*d6b92ffaSHans Petter Selasky * copyright notice, this list of conditions and the following 18*d6b92ffaSHans Petter Selasky * disclaimer. 19*d6b92ffaSHans Petter Selasky * 20*d6b92ffaSHans Petter Selasky * - Redistributions in binary form must reproduce the above 21*d6b92ffaSHans Petter Selasky * copyright notice, this list of conditions and the following 22*d6b92ffaSHans Petter Selasky * disclaimer in the documentation and/or other materials 23*d6b92ffaSHans Petter Selasky * provided with the distribution. 24*d6b92ffaSHans Petter Selasky * 25*d6b92ffaSHans Petter Selasky * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 26*d6b92ffaSHans Petter Selasky * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 27*d6b92ffaSHans Petter Selasky * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 28*d6b92ffaSHans Petter Selasky * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 29*d6b92ffaSHans Petter Selasky * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 30*d6b92ffaSHans Petter Selasky * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 31*d6b92ffaSHans Petter Selasky * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 32*d6b92ffaSHans Petter Selasky * SOFTWARE. 33*d6b92ffaSHans Petter Selasky * 34*d6b92ffaSHans Petter Selasky */ 35*d6b92ffaSHans Petter Selasky 36*d6b92ffaSHans Petter Selasky #ifndef _IBNETDISC_H_ 37*d6b92ffaSHans Petter Selasky #define _IBNETDISC_H_ 38*d6b92ffaSHans Petter Selasky 39*d6b92ffaSHans Petter Selasky #include <stdio.h> 40*d6b92ffaSHans Petter Selasky #include <infiniband/mad.h> 41*d6b92ffaSHans Petter Selasky #include <iba/ib_types.h> 42*d6b92ffaSHans Petter Selasky 43*d6b92ffaSHans Petter Selasky #include <infiniband/ibnetdisc_osd.h> 44*d6b92ffaSHans Petter Selasky 45*d6b92ffaSHans Petter Selasky #ifdef __cplusplus 46*d6b92ffaSHans Petter Selasky extern "C" { 47*d6b92ffaSHans Petter Selasky #endif 48*d6b92ffaSHans Petter Selasky 49*d6b92ffaSHans Petter Selasky struct ibnd_chassis; /* forward declare */ 50*d6b92ffaSHans Petter Selasky struct ibnd_port; /* forward declare */ 51*d6b92ffaSHans Petter Selasky 52*d6b92ffaSHans Petter Selasky #define CHASSIS_TYPE_SIZE 20 53*d6b92ffaSHans Petter Selasky 54*d6b92ffaSHans Petter Selasky /** ========================================================================= 55*d6b92ffaSHans Petter Selasky * Node 56*d6b92ffaSHans Petter Selasky */ 57*d6b92ffaSHans Petter Selasky typedef struct ibnd_node { 58*d6b92ffaSHans Petter Selasky struct ibnd_node *next; /* all node list in fabric */ 59*d6b92ffaSHans Petter Selasky 60*d6b92ffaSHans Petter Selasky ib_portid_t path_portid; /* path from "from_node" */ 61*d6b92ffaSHans Petter Selasky /* NOTE: this is not valid on a fabric 62*d6b92ffaSHans Petter Selasky * read from a cache file */ 63*d6b92ffaSHans Petter Selasky uint16_t smalid; 64*d6b92ffaSHans Petter Selasky uint8_t smalmc; 65*d6b92ffaSHans Petter Selasky 66*d6b92ffaSHans Petter Selasky /* quick cache of switchinfo below */ 67*d6b92ffaSHans Petter Selasky int smaenhsp0; 68*d6b92ffaSHans Petter Selasky /* use libibmad decoder functions for switchinfo */ 69*d6b92ffaSHans Petter Selasky uint8_t switchinfo[IB_SMP_DATA_SIZE]; 70*d6b92ffaSHans Petter Selasky 71*d6b92ffaSHans Petter Selasky /* quick cache of info below */ 72*d6b92ffaSHans Petter Selasky uint64_t guid; 73*d6b92ffaSHans Petter Selasky int type; 74*d6b92ffaSHans Petter Selasky int numports; 75*d6b92ffaSHans Petter Selasky /* use libibmad decoder functions for info */ 76*d6b92ffaSHans Petter Selasky uint8_t info[IB_SMP_DATA_SIZE]; 77*d6b92ffaSHans Petter Selasky 78*d6b92ffaSHans Petter Selasky char nodedesc[IB_SMP_DATA_SIZE]; 79*d6b92ffaSHans Petter Selasky 80*d6b92ffaSHans Petter Selasky struct ibnd_port **ports; /* array of ports, indexed by port number 81*d6b92ffaSHans Petter Selasky ports[1] == port 1, 82*d6b92ffaSHans Petter Selasky ports[2] == port 2, 83*d6b92ffaSHans Petter Selasky etc... 84*d6b92ffaSHans Petter Selasky Any port in the array MAY BE NULL! 85*d6b92ffaSHans Petter Selasky Most notable is non-switches have no 86*d6b92ffaSHans Petter Selasky port 0 therefore node.ports[0] == NULL 87*d6b92ffaSHans Petter Selasky for those nodes */ 88*d6b92ffaSHans Petter Selasky 89*d6b92ffaSHans Petter Selasky /* chassis info */ 90*d6b92ffaSHans Petter Selasky struct ibnd_node *next_chassis_node; /* next node in ibnd_chassis_t->nodes */ 91*d6b92ffaSHans Petter Selasky struct ibnd_chassis *chassis; /* if != NULL the chassis this node belongs to */ 92*d6b92ffaSHans Petter Selasky unsigned char ch_type; 93*d6b92ffaSHans Petter Selasky char ch_type_str[CHASSIS_TYPE_SIZE]; 94*d6b92ffaSHans Petter Selasky unsigned char ch_anafanum; 95*d6b92ffaSHans Petter Selasky unsigned char ch_slotnum; 96*d6b92ffaSHans Petter Selasky unsigned char ch_slot; 97*d6b92ffaSHans Petter Selasky 98*d6b92ffaSHans Petter Selasky /* internal use only */ 99*d6b92ffaSHans Petter Selasky unsigned char ch_found; 100*d6b92ffaSHans Petter Selasky struct ibnd_node *htnext; /* hash table list */ 101*d6b92ffaSHans Petter Selasky struct ibnd_node *type_next; /* next based on type */ 102*d6b92ffaSHans Petter Selasky } ibnd_node_t; 103*d6b92ffaSHans Petter Selasky 104*d6b92ffaSHans Petter Selasky /** ========================================================================= 105*d6b92ffaSHans Petter Selasky * Port 106*d6b92ffaSHans Petter Selasky */ 107*d6b92ffaSHans Petter Selasky typedef struct ibnd_port { 108*d6b92ffaSHans Petter Selasky uint64_t guid; 109*d6b92ffaSHans Petter Selasky int portnum; 110*d6b92ffaSHans Petter Selasky int ext_portnum; /* optional if != 0 external port num */ 111*d6b92ffaSHans Petter Selasky ibnd_node_t *node; /* node this port belongs to */ 112*d6b92ffaSHans Petter Selasky struct ibnd_port *remoteport; /* null if SMA, or does not exist */ 113*d6b92ffaSHans Petter Selasky /* quick cache of info below */ 114*d6b92ffaSHans Petter Selasky uint16_t base_lid; 115*d6b92ffaSHans Petter Selasky uint8_t lmc; 116*d6b92ffaSHans Petter Selasky /* use libibmad decoder functions for info */ 117*d6b92ffaSHans Petter Selasky uint8_t info[IB_SMP_DATA_SIZE]; 118*d6b92ffaSHans Petter Selasky uint8_t ext_info[IB_SMP_DATA_SIZE]; 119*d6b92ffaSHans Petter Selasky 120*d6b92ffaSHans Petter Selasky /* internal use only */ 121*d6b92ffaSHans Petter Selasky struct ibnd_port *htnext; 122*d6b92ffaSHans Petter Selasky } ibnd_port_t; 123*d6b92ffaSHans Petter Selasky 124*d6b92ffaSHans Petter Selasky /** ========================================================================= 125*d6b92ffaSHans Petter Selasky * Chassis 126*d6b92ffaSHans Petter Selasky */ 127*d6b92ffaSHans Petter Selasky typedef struct ibnd_chassis { 128*d6b92ffaSHans Petter Selasky struct ibnd_chassis *next; 129*d6b92ffaSHans Petter Selasky uint64_t chassisguid; 130*d6b92ffaSHans Petter Selasky unsigned char chassisnum; 131*d6b92ffaSHans Petter Selasky 132*d6b92ffaSHans Petter Selasky /* generic grouping by SystemImageGUID */ 133*d6b92ffaSHans Petter Selasky unsigned char nodecount; 134*d6b92ffaSHans Petter Selasky ibnd_node_t *nodes; 135*d6b92ffaSHans Petter Selasky 136*d6b92ffaSHans Petter Selasky /* specific to voltaire type nodes */ 137*d6b92ffaSHans Petter Selasky #define SPINES_MAX_NUM 18 138*d6b92ffaSHans Petter Selasky #define LINES_MAX_NUM 36 139*d6b92ffaSHans Petter Selasky ibnd_node_t *spinenode[SPINES_MAX_NUM + 1]; 140*d6b92ffaSHans Petter Selasky ibnd_node_t *linenode[LINES_MAX_NUM + 1]; 141*d6b92ffaSHans Petter Selasky } ibnd_chassis_t; 142*d6b92ffaSHans Petter Selasky 143*d6b92ffaSHans Petter Selasky #define HTSZ 137 144*d6b92ffaSHans Petter Selasky 145*d6b92ffaSHans Petter Selasky /* define config flags */ 146*d6b92ffaSHans Petter Selasky #define IBND_CONFIG_MLX_EPI (1 << 0) 147*d6b92ffaSHans Petter Selasky 148*d6b92ffaSHans Petter Selasky typedef struct ibnd_config { 149*d6b92ffaSHans Petter Selasky unsigned max_smps; 150*d6b92ffaSHans Petter Selasky unsigned show_progress; 151*d6b92ffaSHans Petter Selasky unsigned max_hops; 152*d6b92ffaSHans Petter Selasky unsigned debug; 153*d6b92ffaSHans Petter Selasky unsigned timeout_ms; 154*d6b92ffaSHans Petter Selasky unsigned retries; 155*d6b92ffaSHans Petter Selasky uint32_t flags; 156*d6b92ffaSHans Petter Selasky uint64_t mkey; 157*d6b92ffaSHans Petter Selasky uint8_t pad[44]; 158*d6b92ffaSHans Petter Selasky } ibnd_config_t; 159*d6b92ffaSHans Petter Selasky 160*d6b92ffaSHans Petter Selasky /** ========================================================================= 161*d6b92ffaSHans Petter Selasky * Fabric 162*d6b92ffaSHans Petter Selasky * Main fabric object which is returned and represents the data discovered 163*d6b92ffaSHans Petter Selasky */ 164*d6b92ffaSHans Petter Selasky typedef struct ibnd_fabric { 165*d6b92ffaSHans Petter Selasky /* the node the discover was initiated from 166*d6b92ffaSHans Petter Selasky * "from" parameter in ibnd_discover_fabric 167*d6b92ffaSHans Petter Selasky * or by default the node you ar running on 168*d6b92ffaSHans Petter Selasky */ 169*d6b92ffaSHans Petter Selasky ibnd_node_t *from_node; 170*d6b92ffaSHans Petter Selasky int from_portnum; 171*d6b92ffaSHans Petter Selasky 172*d6b92ffaSHans Petter Selasky /* NULL term list of all nodes in the fabric */ 173*d6b92ffaSHans Petter Selasky ibnd_node_t *nodes; 174*d6b92ffaSHans Petter Selasky /* NULL terminated list of all chassis found in the fabric */ 175*d6b92ffaSHans Petter Selasky ibnd_chassis_t *chassis; 176*d6b92ffaSHans Petter Selasky unsigned maxhops_discovered; 177*d6b92ffaSHans Petter Selasky unsigned total_mads_used; 178*d6b92ffaSHans Petter Selasky 179*d6b92ffaSHans Petter Selasky /* internal use only */ 180*d6b92ffaSHans Petter Selasky ibnd_node_t *nodestbl[HTSZ]; 181*d6b92ffaSHans Petter Selasky ibnd_port_t *portstbl[HTSZ]; 182*d6b92ffaSHans Petter Selasky ibnd_node_t *switches; 183*d6b92ffaSHans Petter Selasky ibnd_node_t *ch_adapters; 184*d6b92ffaSHans Petter Selasky ibnd_node_t *routers; 185*d6b92ffaSHans Petter Selasky } ibnd_fabric_t; 186*d6b92ffaSHans Petter Selasky 187*d6b92ffaSHans Petter Selasky /** ========================================================================= 188*d6b92ffaSHans Petter Selasky * Initialization (fabric operations) 189*d6b92ffaSHans Petter Selasky */ 190*d6b92ffaSHans Petter Selasky 191*d6b92ffaSHans Petter Selasky IBND_EXPORT ibnd_fabric_t *ibnd_discover_fabric(char * ca_name, 192*d6b92ffaSHans Petter Selasky int ca_port, 193*d6b92ffaSHans Petter Selasky ib_portid_t * from, 194*d6b92ffaSHans Petter Selasky struct ibnd_config *config); 195*d6b92ffaSHans Petter Selasky /** 196*d6b92ffaSHans Petter Selasky * ca_name: (optional) name of the CA to use 197*d6b92ffaSHans Petter Selasky * ca_port: (optional) CA port to use 198*d6b92ffaSHans Petter Selasky * from: (optional) specify the node to start scanning from. 199*d6b92ffaSHans Petter Selasky * If NULL start from the CA/CA port specified 200*d6b92ffaSHans Petter Selasky * config: (optional) additional config options for the scan 201*d6b92ffaSHans Petter Selasky */ 202*d6b92ffaSHans Petter Selasky IBND_EXPORT void ibnd_destroy_fabric(ibnd_fabric_t * fabric); 203*d6b92ffaSHans Petter Selasky 204*d6b92ffaSHans Petter Selasky IBND_EXPORT ibnd_fabric_t *ibnd_load_fabric(const char *file, 205*d6b92ffaSHans Petter Selasky unsigned int flags); 206*d6b92ffaSHans Petter Selasky 207*d6b92ffaSHans Petter Selasky IBND_EXPORT int ibnd_cache_fabric(ibnd_fabric_t * fabric, const char *file, 208*d6b92ffaSHans Petter Selasky unsigned int flags); 209*d6b92ffaSHans Petter Selasky 210*d6b92ffaSHans Petter Selasky #define IBND_CACHE_FABRIC_FLAG_DEFAULT 0x0000 211*d6b92ffaSHans Petter Selasky #define IBND_CACHE_FABRIC_FLAG_NO_OVERWRITE 0x0001 212*d6b92ffaSHans Petter Selasky 213*d6b92ffaSHans Petter Selasky /** ========================================================================= 214*d6b92ffaSHans Petter Selasky * Node operations 215*d6b92ffaSHans Petter Selasky */ 216*d6b92ffaSHans Petter Selasky IBND_EXPORT ibnd_node_t *ibnd_find_node_guid(ibnd_fabric_t * fabric, 217*d6b92ffaSHans Petter Selasky uint64_t guid); 218*d6b92ffaSHans Petter Selasky IBND_EXPORT ibnd_node_t *ibnd_find_node_dr(ibnd_fabric_t * fabric, char *dr_str); 219*d6b92ffaSHans Petter Selasky 220*d6b92ffaSHans Petter Selasky typedef void (*ibnd_iter_node_func_t) (ibnd_node_t * node, void *user_data); 221*d6b92ffaSHans Petter Selasky IBND_EXPORT void ibnd_iter_nodes(ibnd_fabric_t * fabric, 222*d6b92ffaSHans Petter Selasky ibnd_iter_node_func_t func, void *user_data); 223*d6b92ffaSHans Petter Selasky IBND_EXPORT void ibnd_iter_nodes_type(ibnd_fabric_t * fabric, 224*d6b92ffaSHans Petter Selasky ibnd_iter_node_func_t func, 225*d6b92ffaSHans Petter Selasky int node_type, void *user_data); 226*d6b92ffaSHans Petter Selasky 227*d6b92ffaSHans Petter Selasky /** ========================================================================= 228*d6b92ffaSHans Petter Selasky * Port operations 229*d6b92ffaSHans Petter Selasky */ 230*d6b92ffaSHans Petter Selasky IBND_EXPORT ibnd_port_t *ibnd_find_port_guid(ibnd_fabric_t * fabric, 231*d6b92ffaSHans Petter Selasky uint64_t guid); 232*d6b92ffaSHans Petter Selasky IBND_EXPORT ibnd_port_t *ibnd_find_port_dr(ibnd_fabric_t * fabric, 233*d6b92ffaSHans Petter Selasky char *dr_str); 234*d6b92ffaSHans Petter Selasky IBND_EXPORT ibnd_port_t *ibnd_find_port_lid(ibnd_fabric_t * fabric, 235*d6b92ffaSHans Petter Selasky uint16_t lid); 236*d6b92ffaSHans Petter Selasky 237*d6b92ffaSHans Petter Selasky typedef void (*ibnd_iter_port_func_t) (ibnd_port_t * port, void *user_data); 238*d6b92ffaSHans Petter Selasky IBND_EXPORT void ibnd_iter_ports(ibnd_fabric_t * fabric, 239*d6b92ffaSHans Petter Selasky ibnd_iter_port_func_t func, void *user_data); 240*d6b92ffaSHans Petter Selasky 241*d6b92ffaSHans Petter Selasky /** ========================================================================= 242*d6b92ffaSHans Petter Selasky * Chassis queries 243*d6b92ffaSHans Petter Selasky */ 244*d6b92ffaSHans Petter Selasky IBND_EXPORT uint64_t ibnd_get_chassis_guid(ibnd_fabric_t * fabric, 245*d6b92ffaSHans Petter Selasky unsigned char chassisnum); 246*d6b92ffaSHans Petter Selasky IBND_EXPORT char *ibnd_get_chassis_type(ibnd_node_t * node); 247*d6b92ffaSHans Petter Selasky IBND_EXPORT char *ibnd_get_chassis_slot_str(ibnd_node_t * node, 248*d6b92ffaSHans Petter Selasky char *str, size_t size); 249*d6b92ffaSHans Petter Selasky 250*d6b92ffaSHans Petter Selasky IBND_EXPORT int ibnd_is_xsigo_guid(uint64_t guid); 251*d6b92ffaSHans Petter Selasky IBND_EXPORT int ibnd_is_xsigo_tca(uint64_t guid); 252*d6b92ffaSHans Petter Selasky IBND_EXPORT int ibnd_is_xsigo_hca(uint64_t guid); 253*d6b92ffaSHans Petter Selasky 254*d6b92ffaSHans Petter Selasky #ifdef __cplusplus 255*d6b92ffaSHans Petter Selasky } 256*d6b92ffaSHans Petter Selasky #endif 257*d6b92ffaSHans Petter Selasky 258*d6b92ffaSHans Petter Selasky #endif /* _IBNETDISC_H_ */ 259