xref: /NextBSD/contrib/ofed/management/opensm/include/opensm/osm_subnet.h (revision eb1a5f8de9f7ea602c373a710f531abbf81141c4)
1 /*
2  * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved.
3  * Copyright (c) 2002-2008 Mellanox Technologies LTD. All rights reserved.
4  * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
5  * Copyright (c) 2008 Xsigo Systems Inc.  All rights reserved.
6  *
7  * This software is available to you under a choice of one of two
8  * licenses.  You may choose to be licensed under the terms of the GNU
9  * General Public License (GPL) Version 2, available from the file
10  * COPYING in the main directory of this source tree, or the
11  * OpenIB.org BSD license below:
12  *
13  *     Redistribution and use in source and binary forms, with or
14  *     without modification, are permitted provided that the following
15  *     conditions are met:
16  *
17  *      - Redistributions of source code must retain the above
18  *        copyright notice, this list of conditions and the following
19  *        disclaimer.
20  *
21  *      - Redistributions in binary form must reproduce the above
22  *        copyright notice, this list of conditions and the following
23  *        disclaimer in the documentation and/or other materials
24  *        provided with the distribution.
25  *
26  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
27  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
28  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
29  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
30  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
31  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
32  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
33  * SOFTWARE.
34  *
35  */
36 
37 /*
38  * Abstract:
39  *	Declaration of osm_subn_t.
40  *	This object represents an IBA subnet.
41  *	This object is part of the OpenSM family of objects.
42  */
43 
44 #ifndef _OSM_SUBNET_H_
45 #define _OSM_SUBNET_H_
46 
47 #include <iba/ib_types.h>
48 #include <complib/cl_qmap.h>
49 #include <complib/cl_map.h>
50 #include <complib/cl_ptr_vector.h>
51 #include <complib/cl_list.h>
52 #include <opensm/osm_base.h>
53 #include <opensm/osm_prefix_route.h>
54 #include <stdio.h>
55 
56 #ifdef __cplusplus
57 #  define BEGIN_C_DECLS extern "C" {
58 #  define END_C_DECLS   }
59 #else				/* !__cplusplus */
60 #  define BEGIN_C_DECLS
61 #  define END_C_DECLS
62 #endif				/* __cplusplus */
63 
64 BEGIN_C_DECLS
65 #define OSM_SUBNET_VECTOR_MIN_SIZE			0
66 #define OSM_SUBNET_VECTOR_GROW_SIZE			1
67 #define OSM_SUBNET_VECTOR_CAPACITY			256
68 struct osm_opensm;
69 struct osm_qos_policy;
70 
71 /****h* OpenSM/Subnet
72 * NAME
73 *	Subnet
74 *
75 * DESCRIPTION
76 *	The Subnet object encapsulates the information needed by the
77 *	OpenSM to manage a subnet.  The OpenSM allocates one Subnet object
78 *	per IBA subnet.
79 *
80 *	The Subnet object is not thread safe, thus callers must provide
81 *	serialization.
82 *
83 *	This object is essentially a container for the various components
84 *	of a subnet.  Callers may directly access the member variables.
85 *
86 * AUTHOR
87 *	Steve King, Intel
88 *
89 *********/
90 
91 /****s* OpenSM: Subnet/osm_qos_options_t
92 * NAME
93 *	osm_qos_options_t
94 *
95 * DESCRIPTION
96 *	Subnet QoS options structure.  This structure contains the various
97 *	QoS specific configuration parameters for the subnet.
98 *
99 * SYNOPSIS
100 */
101 typedef struct osm_qos_options {
102 	unsigned max_vls;
103 	int high_limit;
104 	char *vlarb_high;
105 	char *vlarb_low;
106 	char *sl2vl;
107 } osm_qos_options_t;
108 /*
109 * FIELDS
110 *
111 *	max_vls
112 *		The number of maximum VLs on the Subnet (0 == use default)
113 *
114 *	high_limit
115 *		The limit of High Priority component of VL Arbitration
116 *		table (IBA 7.6.9) (-1 == use default)
117 *
118 *	vlarb_high
119 *		High priority VL Arbitration table template. (NULL == use default)
120 *
121 *	vlarb_low
122 *		Low priority VL Arbitration table template. (NULL == use default)
123 *
124 *	sl2vl
125 *		SL2VL Mapping table (IBA 7.6.6) template. (NULL == use default)
126 *
127 *********/
128 
129 /****s* OpenSM: Subnet/osm_subn_opt_t
130 * NAME
131 *	osm_subn_opt_t
132 *
133 * DESCRIPTION
134 *	Subnet options structure.  This structure contains the various
135 *	site specific configuration parameters for the subnet.
136 *
137 * SYNOPSIS
138 */
139 typedef struct osm_subn_opt {
140 	char *config_file;
141 	ib_net64_t guid;
142 	ib_net64_t m_key;
143 	ib_net64_t sm_key;
144 	ib_net64_t sa_key;
145 	ib_net64_t subnet_prefix;
146 	ib_net16_t m_key_lease_period;
147 	uint32_t sweep_interval;
148 	uint32_t max_wire_smps;
149 	uint32_t transaction_timeout;
150 	uint8_t sm_priority;
151 	uint8_t lmc;
152 	boolean_t lmc_esp0;
153 	uint8_t max_op_vls;
154 	uint8_t force_link_speed;
155 	boolean_t reassign_lids;
156 	boolean_t ignore_other_sm;
157 	boolean_t single_thread;
158 	boolean_t disable_multicast;
159 	boolean_t force_log_flush;
160 	uint8_t subnet_timeout;
161 	uint8_t packet_life_time;
162 	uint8_t vl_stall_count;
163 	uint8_t leaf_vl_stall_count;
164 	uint8_t head_of_queue_lifetime;
165 	uint8_t leaf_head_of_queue_lifetime;
166 	uint8_t local_phy_errors_threshold;
167 	uint8_t overrun_errors_threshold;
168 	uint32_t sminfo_polling_timeout;
169 	uint32_t polling_retry_number;
170 	uint32_t max_msg_fifo_timeout;
171 	boolean_t force_heavy_sweep;
172 	uint8_t log_flags;
173 	char *dump_files_dir;
174 	char *log_file;
175 	unsigned long log_max_size;
176 	char *partition_config_file;
177 	boolean_t no_partition_enforcement;
178 	boolean_t qos;
179 	char *qos_policy_file;
180 	boolean_t accum_log_file;
181 	char *console;
182 	uint16_t console_port;
183 	char *port_prof_ignore_file;
184 	boolean_t port_profile_switch_nodes;
185 	boolean_t sweep_on_trap;
186 	char *routing_engine_names;
187 	boolean_t use_ucast_cache;
188 	boolean_t connect_roots;
189 	char *lid_matrix_dump_file;
190 	char *lfts_file;
191 	char *root_guid_file;
192 	char *cn_guid_file;
193 	char *ids_guid_file;
194 	char *guid_routing_order_file;
195 	char *sa_db_file;
196 	boolean_t exit_on_fatal;
197 	boolean_t honor_guid2lid_file;
198 	boolean_t daemon;
199 	boolean_t sm_inactive;
200 	boolean_t babbling_port_policy;
201 	osm_qos_options_t qos_options;
202 	osm_qos_options_t qos_ca_options;
203 	osm_qos_options_t qos_sw0_options;
204 	osm_qos_options_t qos_swe_options;
205 	osm_qos_options_t qos_rtr_options;
206 	boolean_t enable_quirks;
207 	boolean_t no_clients_rereg;
208 #ifdef ENABLE_OSM_PERF_MGR
209 	boolean_t perfmgr;
210 	boolean_t perfmgr_redir;
211 	uint16_t perfmgr_sweep_time_s;
212 	uint32_t perfmgr_max_outstanding_queries;
213 	char *event_db_dump_file;
214 #endif				/* ENABLE_OSM_PERF_MGR */
215 	char *event_plugin_name;
216 	char *node_name_map_name;
217 	char *prefix_routes_file;
218 	boolean_t consolidate_ipv6_snm_req;
219 } osm_subn_opt_t;
220 /*
221 * FIELDS
222 *
223 *	config_file
224 *		The name of the config file.
225 *
226 *	guid
227 *		The port guid that the SM is binding to.
228 *
229 *	m_key
230 *		M_Key value sent to all ports qualifying all Set(PortInfo).
231 *
232 *	sm_key
233 *		SM_Key value of the SM used for SM authentication.
234 *
235 *	sa_key
236 *		SM_Key value to qualify rcv SA queries as "trusted".
237 *
238 *	subnet_prefix
239 *		Subnet prefix used on this subnet.
240 *
241 *	m_key_lease_period
242 *		The lease period used for the M_Key on this subnet.
243 *
244 *	sweep_interval
245 *		The number of seconds between subnet sweeps.  A value of 0
246 *		disables sweeping.
247 *
248 *	max_wire_smps
249 *		The maximum number of SMPs sent in parallel.  Default is 4.
250 *
251 *	transaction_timeout
252 *		The maximum time in milliseconds allowed for a transaction
253 *		to complete.  Default is 200.
254 *
255 *	sm_priority
256 *		The priority of this SM as specified by the user.  This
257 *		value is made available in the SMInfo attribute.
258 *
259 *	lmc
260 *		The LMC value used on this subnet.
261 *
262 *	lmc_esp0
263 *		Whether LMC value used on subnet should be used for
264 *		enhanced switch port 0 or not.  If TRUE, it is used.
265 *		Otherwise (the default), LMC is set to 0 for ESP0.
266 *
267 *	max_op_vls
268 *		Limit the maximal operational VLs. default is 1.
269 *
270 *	reassign_lids
271 *		If TRUE cause all lids to be re-assigend.
272 *		Otherwise (the default),
273 *		OpenSM always tries to preserve as LIDs as much as possible.
274 *
275 *	ignore_other_sm_option
276 *		This flag is TRUE if other SMs on the subnet should be ignored.
277 *
278 *	disable_multicast
279 *		This flag is TRUE if OpenSM should disable multicast support.
280 *
281 *	max_msg_fifo_timeout
282 *		The maximal time a message can stay in the incoming message
283 *		queue. If there is more than one message in the queue and the
284 *		last message stayed in the queue more than this value the SA
285 *		request will be immediately returned with a BUSY status.
286 *
287 *	subnet_timeout
288 *		The subnet_timeout that will be set for all the ports in the
289 *		design SubnSet(PortInfo.vl_stall_life))
290 *
291 *	vl_stall_count
292 *		The number of sequential packets dropped that cause the port
293 *		to enter the VLStalled state.
294 *
295 *	leaf_vl_stall_count
296 *		The number of sequential packets dropped that cause the port
297 *		to enter the VLStalled state. This is for switch ports driving
298 *		a CA or router port.
299 *
300 *	head_of_queue_lifetime
301 *		The maximal time a packet can live at the head of a VL queue
302 *		on any port not driving a CA or router port.
303 *
304 *	leaf_head_of_queue_lifetime
305 *		The maximal time a packet can live at the head of a VL queue
306 *		on switch ports driving a CA or router.
307 *
308 *	local_phy_errors_threshold
309 *		Threshold of local phy errors for sending Trap 129
310 *
311 *	overrun_errors_threshold
312 *		Threshold of credits overrun errors for sending Trap 129
313 *
314 *	sminfo_polling_timeout
315 *		Specifies the polling timeout (in milliseconds) - the timeout
316 *		between one poll to another.
317 *
318 *	packet_life_time
319 *		The maximal time a packet can stay in a switch.
320 *		The value is send to all switches as
321 *		SubnSet(SwitchInfo.life_state)
322 *
323 *	dump_files_dir
324 *		The directory to be used for opensm-subnet.lst, opensm.fdbs,
325 *		opensm.mcfdbs, and default log file (the latter for Windows,
326 *		not Linux).
327 *
328 *	log_file
329 *		Name of the log file (or NULL) for stdout.
330 *
331 *	log_max_size
332 *		This option defines maximal log file size in MB. When
333 *		specified the log file will be truncated upon reaching
334 *		this limit.
335 *
336 *	qos
337 *		Boolean that specifies whether the OpenSM QoS functionality
338 *		should be off or on.
339 *
340 *	qos_policy_file
341 *		Name of the QoS policy file.
342 *
343 *	accum_log_file
344 *		If TRUE (default) - the log file will be accumulated.
345 *		If FALSE - the log file will be erased before starting
346 *		current opensm run.
347 *
348 *	port_prof_ignore_file
349 *		Name of file with port guids to be ignored by port profiling.
350 *
351 *	port_profile_switch_nodes
352 *		If TRUE will count the number of switch nodes routed through
353 *		the link. If FALSE - only CA/RT nodes are counted.
354 *
355 *	sweep_on_trap
356 *		Received traps will initiate a new sweep.
357 *
358 *	routing_engine_names
359 *		Name of routing engine(s) to use.
360 *
361 *	connect_roots
362 *		The option which will enforce root to root connectivity with
363 *		up/down routing engine (even if this violates "pure" deadlock
364 *		free up/down algorithm)
365 *
366 *	use_ucast_cache
367 *		When TRUE enables unicast routing cache.
368 *
369 *	lid_matrix_dump_file
370 *		Name of the lid matrix dump file from where switch
371 *		lid matrices (min hops tables) will be loaded
372 *
373 *	lfts_file
374 *		Name of the unicast LFTs routing file from where switch
375 *		forwarding tables will be loaded
376 *
377 *	root_guid_file
378 *		Name of the file that contains list of root guids that
379 *		will be used by fat-tree or up/dn routing (provided by User)
380 *
381 *	cn_guid_file
382 *		Name of the file that contains list of compute node guids that
383 *		will be used by fat-tree routing (provided by User)
384 *
385 *	ids_guid_file
386 *		Name of the file that contains list of ids which should be
387 *		used by Up/Down algorithm instead of node GUIDs
388 *
389 *	guid_routing_order_file
390 *		Name of the file that contains list of guids for routing order
391 *		that will be used by minhop and up/dn routing (provided by User).
392 *
393 *	sa_db_file
394 *		Name of the SA database file.
395 *
396 *	exit_on_fatal
397 *		If TRUE (default) - SM will exit on fatal subnet initialization
398 *		issues.
399 *		If FALSE - SM will not exit.
400 *		Fatal initialization issues:
401 *		a. SM recognizes 2 different nodes with the same guid, or
402 *		   12x link with lane reversal badly configured.
403 *
404 *	honor_guid2lid_file
405 *		Always honor the guid2lid file if it exists and is valid. This
406 *		means that the file will be honored when SM is coming out of
407 *		STANDBY. By default this is FALSE.
408 *
409 *	daemon
410 *		OpenSM will run in daemon mode.
411 *
412 *	sm_inactive
413 *		OpenSM will start with SM in not active state.
414 *
415 *	babbling_port_policy
416 *		OpenSM will enforce its "babbling" port policy.
417 *
418 *	perfmgr
419 *		Enable or disable the performance manager
420 *
421 *	perfmgr_redir
422 *		Enable or disable the saving of redirection by PerfMgr
423 *
424 *	perfmgr_sweep_time_s
425 *		Define the period (in seconds) of PerfMgr sweeps
426 *
427 *       event_db_dump_file
428 *               File to dump the event database to
429 *
430 *       event_db_plugin
431 *               Specify the name of the event plugin
432 *
433 *	qos_options
434 *		Default set of QoS options
435 *
436 *	qos_ca_options
437 *		QoS options for CA ports
438 *
439 *	qos_sw0_options
440 *		QoS options for switches' port 0
441 *
442 *	qos_swe_options
443 *		QoS options for switches' external ports
444 *
445 *	qos_rtr_options
446 *		QoS options for router ports
447 *
448 *	enable_quirks
449 *		Enable high risk new features and not fully qualified
450 *		hardware specific work arounds
451 *
452 *	no_clients_rereg
453 *		When TRUE disables clients reregistration request.
454 *
455 * SEE ALSO
456 *	Subnet object
457 *********/
458 
459 /****s* OpenSM: Subnet/osm_subn_t
460 * NAME
461 *	osm_subn_t
462 *
463 * DESCRIPTION
464 *	Subnet structure.  Callers may directly access member components,
465 *	after grabbing a lock.
466 *
467 * TO DO
468 *	This structure should probably be volatile.
469 *
470 * SYNOPSIS
471 */
472 typedef struct osm_subn {
473 	struct osm_opensm *p_osm;
474 	cl_qmap_t sw_guid_tbl;
475 	cl_qmap_t node_guid_tbl;
476 	cl_qmap_t port_guid_tbl;
477 	cl_qmap_t rtr_guid_tbl;
478 	cl_qlist_t prefix_routes_list;
479 	cl_qmap_t prtn_pkey_tbl;
480 	cl_qmap_t sm_guid_tbl;
481 	cl_qlist_t sa_sr_list;
482 	cl_qlist_t sa_infr_list;
483 	cl_ptr_vector_t port_lid_tbl;
484 	ib_net16_t master_sm_base_lid;
485 	ib_net16_t sm_base_lid;
486 	ib_net64_t sm_port_guid;
487 	uint8_t sm_state;
488 	osm_subn_opt_t opt;
489 	struct osm_qos_policy *p_qos_policy;
490 	uint16_t max_ucast_lid_ho;
491 	uint16_t max_mcast_lid_ho;
492 	uint8_t min_ca_mtu;
493 	uint8_t min_ca_rate;
494 	boolean_t ignore_existing_lfts;
495 	boolean_t subnet_initialization_error;
496 	boolean_t force_heavy_sweep;
497 	boolean_t force_reroute;
498 	boolean_t in_sweep_hop_0;
499 	boolean_t first_time_master_sweep;
500 	boolean_t coming_out_of_standby;
501 	unsigned need_update;
502 	void *mgroups[IB_LID_MCAST_END_HO - IB_LID_MCAST_START_HO + 1];
503 } osm_subn_t;
504 /*
505 * FIELDS
506 *	sw_guid_tbl
507 *		Container of pointers to all Switch objects in the subent.
508 *		Indexed by node GUID.
509 *
510 *	node_guid_tbl
511 *		Container of pointers to all Node objects in the subent.
512 *		Indexed by node GUID.
513 *
514 *	port_guid_tbl
515 *		Container of pointers to all Port objects in the subent.
516 *		Indexed by port GUID - network order!
517 *
518 *	rtr_guid_tbl
519 *		Container of pointers to all Router objects in the subent.
520 *		Indexed by node GUID.
521 *
522 *	prtn_pkey_tbl
523 *		Container of pointers to all Partition objects in the subnet.
524 *		Indexed by P_KEY.
525 *
526 *	sm_guid_tbl
527 *		Container of pointers to SM objects representing other SMs
528 *		on the subnet.
529 *
530 *	port_lid_tbl
531 *		Container of pointers to all Port objects in the subent.
532 *		Indexed by port LID.
533 *
534 *	master_sm_base_lid
535 *		The base LID owned by the subnet's master SM.
536 *
537 *	sm_base_lid
538 *		The base LID of the local port where the SM is.
539 *
540 *	sm_port_guid
541 *		This SM's own port GUID.
542 *
543 *	sm_state
544 *		The high-level state of the SM.  This value is made available
545 *		in the SMInfo attribute.
546 *
547 *	opt
548 *		Subnet options structure contains site specific configuration.
549 *
550 *	p_qos_policy
551 *		Subnet QoS policy structure.
552 *
553 *	max_ucast_lid_ho
554 *		The minimal max unicast lid reported by all switches
555 *
556 *	max_mcast_lid_ho
557 *		The minimal max multicast lid reported by all switches
558 *
559 *	min_ca_mtu
560 *		The minimal MTU reported by all CAs ports on the subnet
561 *
562 *	min_ca_rate
563 *		The minimal rate reported by all CA ports on the subnet
564 *
565 *	ignore_existing_lfts
566 *		This flag is a dynamic flag to instruct the LFT assignment to
567 *		ignore existing legal LFT settings.
568 *		The value will be set according to :
569 *		- Any change to the list of switches will set it to high
570 *		- Coming out of STANDBY it will be cleared (other SM worked)
571 *		- Set to FALSE upon end of all lft assignments.
572 *
573 *	subnet_initalization_error
574 *		Similar to the force_heavy_sweep flag. If TRUE - means that
575 *		we had errors during initialization (due to SubnSet requests
576 *		that failed). We want to declare the subnet as unhealthy, and
577 *		force another heavy sweep.
578 *
579 *	force_heavy_sweep
580 *		If TRUE - we want to force a heavy sweep. This can be done
581 *		either due to receiving of trap - meaning there is some change
582 *		on the subnet, or we received a handover from a remote sm.
583 *		In this case we want to sweep and reconfigure the entire
584 *		subnet. This will cause another heavy sweep to occure when
585 *		the current sweep is done.
586 *
587 *	force_reroute
588 *		If TRUE - we want to force switches in the fabric to be
589 *		rerouted.
590 *
591 *	in_sweep_hop_0
592 *		When in_sweep_hop_0 flag is set to TRUE - this means we are
593 *		in sweep_hop_0 - meaning we do not want to continue beyond
594 *		the current node.
595 *		This is relevant for the case of SM on switch, since in the
596 *		switch info we need to signal somehow not to continue
597 *		the sweeping.
598 *
599 *	first_time_master_sweep
600 *		This flag is used for the PortInfo setting. On the first
601 *		sweep as master (meaning after moving from Standby|Discovering
602 *		state), the SM must send a PortInfoSet to all ports. After
603 *		that - we want to minimize the number of PortInfoSet requests
604 *		sent, and to send only requests that change the value from
605 *		what is updated in the port (or send a first request if this
606 *		is a new port). We will set this flag to TRUE when entering
607 *		the master state, and set it back to FALSE at the end of the
608 *		drop manager. This is done since at the end of the drop manager
609 *		we have updated all the ports that are reachable, and from now
610 *		on these are the only ports we have data of. We don't want
611 *		to send extra set requests to these ports anymore.
612 *
613 *	coming_out_of_standby
614 *		TRUE on the first sweep after the SM was in standby.
615 *		Used for nulling any cache of LID and Routing.
616 *		The flag is set true if the SM state was standby and now
617 *		changed to MASTER it is reset at the end of the sweep.
618 *
619 *	need_update
620 *		This flag should be on during first non-master heavy
621 *		(including pre-master discovery stage)
622 *
623 *	mgroups
624 *		Array of pointers to all Multicast Group objects in the subnet.
625 *		Indexed by MLID offset from base MLID.
626 *
627 * SEE ALSO
628 *	Subnet object
629 *********/
630 
631 /****f* OpenSM: Subnet/osm_subn_construct
632 * NAME
633 *	osm_subn_construct
634 *
635 * DESCRIPTION
636 *	This function constructs a Subnet object.
637 *
638 * SYNOPSIS
639 */
640 void osm_subn_construct(IN osm_subn_t * const p_subn);
641 /*
642 * PARAMETERS
643 *	p_subn
644 *		[in] Pointer to a Subnet object to construct.
645 *
646 * RETURN VALUE
647 *	This function does not return a value.
648 *
649 * NOTES
650 *	Allows calling osm_subn_init, and osm_subn_destroy.
651 *
652 *	Calling osm_subn_construct is a prerequisite to calling any other
653 *	method except osm_subn_init.
654 *
655 * SEE ALSO
656 *	Subnet object, osm_subn_init, osm_subn_destroy
657 *********/
658 
659 /****f* OpenSM: Subnet/osm_subn_destroy
660 * NAME
661 *	osm_subn_destroy
662 *
663 * DESCRIPTION
664 *	The osm_subn_destroy function destroys a subnet, releasing
665 *	all resources.
666 *
667 * SYNOPSIS
668 */
669 void osm_subn_destroy(IN osm_subn_t * const p_subn);
670 /*
671 * PARAMETERS
672 *	p_subn
673 *		[in] Pointer to a Subnet object to destroy.
674 *
675 * RETURN VALUE
676 *	This function does not return a value.
677 *
678 * NOTES
679 *	Performs any necessary cleanup of the specified Subnet object.
680 *	Further operations should not be attempted on the destroyed object.
681 *	This function should only be called after a call to osm_subn_construct
682 *	or osm_subn_init.
683 *
684 * SEE ALSO
685 *	Subnet object, osm_subn_construct, osm_subn_init
686 *********/
687 
688 /****f* OpenSM: Subnet/osm_subn_init
689 * NAME
690 *	osm_subn_init
691 *
692 * DESCRIPTION
693 *	The osm_subn_init function initializes a Subnet object for use.
694 *
695 * SYNOPSIS
696 */
697 ib_api_status_t
698 osm_subn_init(IN osm_subn_t * const p_subn,
699 	      IN struct osm_opensm *const p_osm,
700 	      IN const osm_subn_opt_t * const p_opt);
701 /*
702 * PARAMETERS
703 *	p_subn
704 *		[in] Pointer to an osm_subn_t object to initialize.
705 *
706 *	p_opt
707 *		[in] Pointer to the subnet options structure.
708 *
709 * RETURN VALUES
710 *	IB_SUCCESS if the Subnet object was initialized successfully.
711 *
712 * NOTES
713 *	Allows calling other Subnet methods.
714 *
715 * SEE ALSO
716 *	Subnet object, osm_subn_construct, osm_subn_destroy
717 *********/
718 
719 /*
720   Forward references.
721 */
722 struct osm_mad_addr;
723 struct osm_log;
724 struct osm_switch;
725 struct osm_physp;
726 struct osm_port;
727 struct osm_mgrp;
728 
729 /****f* OpenSM: Helper/osm_get_gid_by_mad_addr
730 * NAME
731 *	osm_get_gid_by_mad_addr
732 *
733 * DESCRIPTION
734 *	Looks for the requester gid in the mad address.
735 *
736 * Note: This code is not thread safe. Need to grab the lock before
737 * calling it.
738 *
739 * SYNOPSIS
740 */
741 ib_api_status_t
742 osm_get_gid_by_mad_addr(IN struct osm_log *p_log,
743 			IN const osm_subn_t * p_subn,
744 			IN const struct osm_mad_addr *p_mad_addr,
745 			OUT ib_gid_t * p_gid);
746 /*
747 * PARAMETERS
748 *	p_log
749 *		[in] Pointer to a log object.
750 *
751 *	p_subn
752 *		[in] Pointer to subnet object.
753 *
754 *	p_mad_addr
755 *		[in] Pointer to mad address object.
756 *
757 *	p_gid
758 *		[out] Pointer to the GID structure to fill in.
759 *
760 * RETURN VALUES
761 *     IB_SUCCESS if able to find the GID by address given.
762 *
763 * NOTES
764 *
765 * SEE ALSO
766 *********/
767 
768 /****f* OpenSM: Helper/osm_get_physp_by_mad_addr
769 * NAME
770 *	osm_get_physp_by_mad_addr
771 *
772 * DESCRIPTION
773 *	Looks for the requester physical port in the mad address.
774 *
775 * Note: This code is not thread safe. Need to grab the lock before
776 * calling it.
777 *
778 * SYNOPSIS
779 */
780 struct osm_physp *osm_get_physp_by_mad_addr(IN struct osm_log *p_log,
781 					     IN const osm_subn_t * p_subn,
782 					     IN struct osm_mad_addr
783 					     *p_mad_addr);
784 /*
785 * PARAMETERS
786 *	p_log
787 *		[in] Pointer to a log object.
788 *
789 *	p_subn
790 *		[in] Pointer to subnet object.
791 *
792 *	p_mad_addr
793 *		[in] Pointer to mad address object.
794 *
795 * RETURN VALUES
796 *	Pointer to requester physical port object if found. Null otherwise.
797 *
798 * NOTES
799 *
800 * SEE ALSO
801 *********/
802 
803 /****f* OpenSM: Helper/osm_get_port_by_mad_addr
804 * NAME
805 *	osm_get_port_by_mad_addr
806 *
807 * DESCRIPTION
808 *	Looks for the requester port in the mad address.
809 *
810 * Note: This code is not thread safe. Need to grab the lock before
811 * calling it.
812 *
813 * SYNOPSIS
814 */
815 struct osm_port *osm_get_port_by_mad_addr(IN struct osm_log *p_log,
816 					   IN const osm_subn_t * p_subn,
817 					   IN struct osm_mad_addr *p_mad_addr);
818 /*
819 * PARAMETERS
820 *	p_log
821 *		[in] Pointer to a log object.
822 *
823 *	p_subn
824 *		[in] Pointer to subnet object.
825 *
826 *	p_mad_addr
827 *		[in] Pointer to mad address object.
828 *
829 * RETURN VALUES
830 *	Pointer to requester port object if found. Null otherwise.
831 *
832 * NOTES
833 *
834 * SEE ALSO
835 *********/
836 
837 /****f* OpenSM: Subnet/osm_get_switch_by_guid
838 * NAME
839 *	osm_get_switch_by_guid
840 *
841 * DESCRIPTION
842 *	Looks for the given switch guid in the subnet table of switches by guid.
843 *  NOTE: this code is not thread safe. Need to grab the lock before
844 *  calling it.
845 *
846 * SYNOPSIS
847 */
848 struct osm_switch *osm_get_switch_by_guid(IN const osm_subn_t * p_subn,
849 					   IN uint64_t guid);
850 /*
851 * PARAMETERS
852 *	p_subn
853 *		[in] Pointer to an osm_subn_t object
854 *
855 *	guid
856 *		[in] The node guid in host order
857 *
858 * RETURN VALUES
859 *	The switch structure pointer if found. NULL otherwise.
860 *
861 * SEE ALSO
862 *	Subnet object, osm_subn_construct, osm_subn_destroy,
863 *	osm_switch_t
864 *********/
865 
866 /****f* OpenSM: Subnet/osm_get_node_by_guid
867 * NAME
868 *	osm_get_node_by_guid
869 *
870 * DESCRIPTION
871 *	The looks for the given node giud in the subnet table of nodes by guid.
872 *  NOTE: this code is not thread safe. Need to grab the lock before
873 *  calling it.
874 *
875 * SYNOPSIS
876 */
877 struct osm_node *osm_get_node_by_guid(IN osm_subn_t const *p_subn,
878 				       IN uint64_t guid);
879 /*
880 * PARAMETERS
881 *	p_subn
882 *		[in] Pointer to an osm_subn_t object
883 *
884 *	guid
885 *		[in] The node guid in host order
886 *
887 * RETURN VALUES
888 *	The node structure pointer if found. NULL otherwise.
889 *
890 * SEE ALSO
891 *	Subnet object, osm_subn_construct, osm_subn_destroy,
892 *	osm_node_t
893 *********/
894 
895 /****f* OpenSM: Subnet/osm_get_port_by_guid
896 * NAME
897 *	osm_get_port_by_guid
898 *
899 * DESCRIPTION
900 *	The looks for the given port guid in the subnet table of ports by guid.
901 *  NOTE: this code is not thread safe. Need to grab the lock before
902 *  calling it.
903 *
904 * SYNOPSIS
905 */
906 struct osm_port *osm_get_port_by_guid(IN osm_subn_t const *p_subn,
907 				       IN ib_net64_t guid);
908 /*
909 * PARAMETERS
910 *	p_subn
911 *		[in] Pointer to an osm_subn_t object
912 *
913 *	guid
914 *		[in] The port guid in network order
915 *
916 * RETURN VALUES
917 *	The port structure pointer if found. NULL otherwise.
918 *
919 * SEE ALSO
920 *	Subnet object, osm_subn_construct, osm_subn_destroy,
921 *	osm_port_t
922 *********/
923 
924 /****f* OpenSM: Subnet/osm_get_mgrp_by_mlid
925 * NAME
926 *	osm_get_mgrp_by_mlid
927 *
928 * DESCRIPTION
929 *	The looks for the given multicast group in the subnet table by mlid.
930 *	NOTE: this code is not thread safe. Need to grab the lock before
931 *	calling it.
932 *
933 * SYNOPSIS
934 */
935 static inline
osm_get_mgrp_by_mlid(osm_subn_t const * p_subn,ib_net16_t mlid)936 struct osm_mgrp *osm_get_mgrp_by_mlid(osm_subn_t const *p_subn, ib_net16_t mlid)
937 {
938 	return p_subn->mgroups[cl_ntoh16(mlid) - IB_LID_MCAST_START_HO];
939 }
940 /*
941 * PARAMETERS
942 *	p_subn
943 *		[in] Pointer to an osm_subn_t object
944 *
945 *	mlid
946 *		[in] The multicast group mlid in network order
947 *
948 * RETURN VALUES
949 *	The multicast group structure pointer if found. NULL otherwise.
950 *********/
951 
952 /****f* OpenSM: Helper/osm_get_physp_by_mad_addr
953 * NAME
954 *	osm_get_physp_by_mad_addr
955 *
956 * DESCRIPTION
957 *	Looks for the requester physical port in the mad address.
958 *
959 * Note: This code is not thread safe. Need to grab the lock before
960 * calling it.
961 *
962 * SYNOPSIS
963 */
964 struct osm_physp *osm_get_physp_by_mad_addr(IN struct osm_log *p_log,
965 					     IN const osm_subn_t * p_subn,
966 					     IN struct osm_mad_addr
967 					     *p_mad_addr);
968 /*
969 * PARAMETERS
970 *	p_log
971 *		[in] Pointer to a log object.
972 *
973 *	p_subn
974 *		[in] Pointer to subnet object.
975 *
976 *	p_mad_addr
977 *		[in] Pointer to mad address object.
978 *
979 * RETURN VALUES
980 *	Pointer to requester physical port object if found. Null otherwise.
981 *
982 * NOTES
983 *
984 * SEE ALSO
985 *********/
986 
987 /****f* OpenSM: Subnet/osm_subn_set_default_opt
988 * NAME
989 *	osm_subn_set_default_opt
990 *
991 * DESCRIPTION
992 *	The osm_subn_set_default_opt function sets the default options.
993 *
994 * SYNOPSIS
995 */
996 void osm_subn_set_default_opt(IN osm_subn_opt_t * const p_opt);
997 /*
998 * PARAMETERS
999 *
1000 *	p_opt
1001 *		[in] Pointer to the subnet options structure.
1002 *
1003 * RETURN VALUES
1004 *	None
1005 *
1006 * NOTES
1007 *
1008 * SEE ALSO
1009 *	Subnet object, osm_subn_construct, osm_subn_destroy
1010 *********/
1011 
1012 /****f* OpenSM: Subnet/osm_subn_parse_conf_file
1013 * NAME
1014 *	osm_subn_parse_conf_file
1015 *
1016 * DESCRIPTION
1017 *	The osm_subn_parse_conf_file function parses the configuration file
1018 *	and sets the defaults accordingly.
1019 *
1020 * SYNOPSIS
1021 */
1022 int osm_subn_parse_conf_file(char *conf_file, osm_subn_opt_t * const p_opt);
1023 /*
1024 * PARAMETERS
1025 *
1026 *	p_opt
1027 *		[in] Pointer to the subnet options structure.
1028 *
1029 * RETURN VALUES
1030 *	0 on success, positive value if file doesn't exist,
1031 *	negative value otherwise
1032 *********/
1033 
1034 /****f* OpenSM: Subnet/osm_subn_rescan_conf_files
1035 * NAME
1036 *	osm_subn_rescan_conf_files
1037 *
1038 * DESCRIPTION
1039 *	The osm_subn_rescan_conf_files function parses the configuration
1040 *	files and update selected subnet options
1041 *
1042 * SYNOPSIS
1043 */
1044 int osm_subn_rescan_conf_files(IN osm_subn_t * const p_subn);
1045 /*
1046 * PARAMETERS
1047 *
1048 *	p_subn
1049 *		[in] Pointer to the subnet structure.
1050 *
1051 * RETURN VALUES
1052 *	0 on success, positive value if file doesn't exist,
1053 *	negative value otherwise
1054 *
1055 *********/
1056 
1057 /****f* OpenSM: Subnet/osm_subn_output_conf
1058 * NAME
1059 *	osm_subn_output_conf
1060 *
1061 * DESCRIPTION
1062 *	Output configuration info
1063 *
1064 * SYNOPSIS
1065 */
1066 int osm_subn_output_conf(FILE *out, IN osm_subn_opt_t * const p_opt);
1067 /*
1068 * PARAMETERS
1069 *
1070 *	out
1071 *		[in] File stream to output to.
1072 *
1073 *	p_opt
1074 *		[in] Pointer to the subnet options structure.
1075 *
1076 * RETURN VALUES
1077 *	0 on success, negative value otherwise
1078 *********/
1079 
1080 /****f* OpenSM: Subnet/osm_subn_write_conf_file
1081 * NAME
1082 *	osm_subn_write_conf_file
1083 *
1084 * DESCRIPTION
1085 *	Write the configuration file into the cache
1086 *
1087 * SYNOPSIS
1088 */
1089 int osm_subn_write_conf_file(char *file_name, IN osm_subn_opt_t * const p_opt);
1090 /*
1091 * PARAMETERS
1092 *
1093 *	p_opt
1094 *		[in] Pointer to the subnet options structure.
1095 *
1096 * RETURN VALUES
1097 *	0 on success, negative value otherwise
1098 *
1099 * NOTES
1100 *	Assumes the conf file is part of the cache dir which defaults to
1101 *	OSM_DEFAULT_CACHE_DIR or OSM_CACHE_DIR the name is opensm.opts
1102 *********/
1103 int osm_subn_verify_config(osm_subn_opt_t * const p_opt);
1104 
1105 END_C_DECLS
1106 #endif				/* _OSM_SUBNET_H_ */
1107