xref: /freebsd/contrib/ofed/libibnetdisc/ibnetdisc.h (revision 87181516ef48be852d5e5fee53c6e0dbfc62f21e)
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