1/*
2 * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved.
3 * Copyright (c) 2002-2015 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 * Copyright (c) 2009 System Fabric Works, Inc. All rights reserved.
7 * Copyright (c) 2009 HNR Consulting. All rights reserved.
8 * Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved.
9 * Copyright (c) 2009-2015 ZIH, TU Dresden, Federal Republic of Germany. All rights reserved.
10 *
11 * This software is available to you under a choice of one of two
12 * licenses.  You may choose to be licensed under the terms of the GNU
13 * General Public License (GPL) Version 2, available from the file
14 * COPYING in the main directory of this source tree, or the
15 * OpenIB.org BSD license below:
16 *
17 *     Redistribution and use in source and binary forms, with or
18 *     without modification, are permitted provided that the following
19 *     conditions are met:
20 *
21 *      - Redistributions of source code must retain the above
22 *        copyright notice, this list of conditions and the following
23 *        disclaimer.
24 *
25 *      - Redistributions in binary form must reproduce the above
26 *        copyright notice, this list of conditions and the following
27 *        disclaimer in the documentation and/or other materials
28 *        provided with the distribution.
29 *
30 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
31 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
32 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
33 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
34 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
35 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
36 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
37 * SOFTWARE.
38 *
39 */
40
41/*
42 * Abstract:
43 *	Declaration of osm_subn_t.
44 *	This object represents an IBA subnet.
45 *	This object is part of the OpenSM family of objects.
46 */
47
48#ifndef _OSM_SUBNET_H_
49#define _OSM_SUBNET_H_
50
51#include <iba/ib_types.h>
52#include <complib/cl_qmap.h>
53#include <complib/cl_fleximap.h>
54#include <complib/cl_map.h>
55#include <complib/cl_ptr_vector.h>
56#include <complib/cl_list.h>
57#include <opensm/osm_base.h>
58#include <opensm/osm_prefix_route.h>
59#include <opensm/osm_db.h>
60#include <stdio.h>
61
62#ifdef __cplusplus
63#  define BEGIN_C_DECLS extern "C" {
64#  define END_C_DECLS   }
65#else				/* !__cplusplus */
66#  define BEGIN_C_DECLS
67#  define END_C_DECLS
68#endif				/* __cplusplus */
69
70BEGIN_C_DECLS
71#define OSM_SUBNET_VECTOR_MIN_SIZE			0
72#define OSM_SUBNET_VECTOR_GROW_SIZE			1
73#define OSM_SUBNET_VECTOR_CAPACITY			256
74
75#define OSM_PARTITION_ENFORCE_BOTH			"both"
76#define OSM_PARTITION_ENFORCE_IN			"in"
77#define OSM_PARTITION_ENFORCE_OUT			"out"
78#define OSM_PARTITION_ENFORCE_OFF			"off"
79
80typedef enum _osm_partition_enforce_type_enum {
81	OSM_PARTITION_ENFORCE_TYPE_BOTH,
82	OSM_PARTITION_ENFORCE_TYPE_IN,
83	OSM_PARTITION_ENFORCE_TYPE_OUT,
84	OSM_PARTITION_ENFORCE_TYPE_OFF
85} osm_partition_enforce_type_enum;
86
87/* XXX: not actual max, max we're currently going to support */
88#define OSM_CCT_ENTRY_MAX        128
89#define OSM_CCT_ENTRY_MAD_BLOCKS (OSM_CCT_ENTRY_MAX/64)
90
91struct osm_opensm;
92struct osm_qos_policy;
93
94/****h* OpenSM/Subnet
95* NAME
96*	Subnet
97*
98* DESCRIPTION
99*	The Subnet object encapsulates the information needed by the
100*	OpenSM to manage a subnet.  The OpenSM allocates one Subnet object
101*	per IBA subnet.
102*
103*	The Subnet object is not thread safe, thus callers must provide
104*	serialization.
105*
106*	This object is essentially a container for the various components
107*	of a subnet.  Callers may directly access the member variables.
108*
109* AUTHOR
110*	Steve King, Intel
111*
112*********/
113
114/****s* OpenSM: Subnet/osm_qos_options_t
115* NAME
116*	osm_qos_options_t
117*
118* DESCRIPTION
119*	Subnet QoS options structure.  This structure contains the various
120*	QoS specific configuration parameters for the subnet.
121*
122* SYNOPSIS
123*/
124typedef struct osm_qos_options {
125	unsigned max_vls;
126	int high_limit;
127	char *vlarb_high;
128	char *vlarb_low;
129	char *sl2vl;
130} osm_qos_options_t;
131/*
132* FIELDS
133*
134*	max_vls
135*		The number of maximum VLs on the Subnet (0 == use default)
136*
137*	high_limit
138*		The limit of High Priority component of VL Arbitration
139*		table (IBA 7.6.9) (-1 == use default)
140*
141*	vlarb_high
142*		High priority VL Arbitration table template. (NULL == use default)
143*
144*	vlarb_low
145*		Low priority VL Arbitration table template. (NULL == use default)
146*
147*	sl2vl
148*		SL2VL Mapping table (IBA 7.6.6) template. (NULL == use default)
149*
150*********/
151
152/****s* OpenSM: Subnet/osm_cct_entry_t
153* NAME
154*	osm_cct_entry_t
155*
156* DESCRIPTION
157*	Subnet Congestion Control Table entry.  See A10.2.2.1.1 for format details.
158*
159* SYNOPSIS
160*/
161typedef struct osm_cct_entry {
162	uint8_t shift; //Alex: shift 2 bits
163	uint16_t multiplier; //Alex multiplier 14 bits
164} osm_cct_entry_t;
165/*
166* FIELDS
167*
168*	shift
169*		shift field in CCT entry.  See A10.2.2.1.1.
170*
171*	multiplier
172*		multiplier field in CCT entry.  See A10.2.2.1.1.
173*
174*********/
175
176/****s* OpenSM: Subnet/osm_cacongestion_entry_t
177* NAME
178*	osm_cacongestion_entry_t
179*
180* DESCRIPTION
181*	Subnet CA Congestion entry.  See A10.4.3.8.4 for format details.
182*
183* SYNOPSIS
184*/
185typedef struct osm_cacongestion_entry {
186	ib_net16_t ccti_timer; //Alex: ccti_timer and ccti_increase should be replaced
187	uint8_t ccti_increase;
188	uint8_t trigger_threshold;
189	uint8_t ccti_min;
190} osm_cacongestion_entry_t;
191/*
192* FIELDS
193*
194*	ccti_timer
195*		CCTI Timer
196*
197*	ccti_increase
198*		CCTI Increase
199*
200*	trigger_threshold
201*		CCTI trigger for log message
202*
203*	ccti_min
204*		CCTI Minimum
205*
206*********/
207
208/****s* OpenSM: Subnet/osm_cct_t
209* NAME
210*	osm_cct_t
211*
212* DESCRIPTION
213*	Subnet CongestionControlTable.  See A10.4.3.9 for format details.
214*
215* SYNOPSIS
216*/
217typedef struct osm_cct {
218	osm_cct_entry_t entries[OSM_CCT_ENTRY_MAX];
219	unsigned int entries_len;
220	char *input_str;
221} osm_cct_t;
222/*
223* FIELDS
224*
225*	entries
226*		Entries in CCT
227*
228*	entries_len
229*		Length of entries
230*
231*	input_str
232*		Original str input
233*
234*********/
235
236
237/****s* OpenSM: Subnet/osm_subn_opt_t
238* NAME
239*	osm_subn_opt_t
240*
241* DESCRIPTION
242*	Subnet options structure.  This structure contains the various
243*	site specific configuration parameters for the subnet.
244*
245* SYNOPSIS
246*/
247typedef struct osm_subn_opt {
248	const char *config_file;
249	ib_net64_t guid;
250	ib_net64_t m_key;
251	ib_net64_t sm_key;
252	ib_net64_t sa_key;
253	ib_net64_t subnet_prefix;
254	ib_net16_t m_key_lease_period;
255	uint8_t m_key_protect_bits;
256	boolean_t m_key_lookup;
257	uint32_t sweep_interval;
258	uint32_t max_wire_smps;
259	uint32_t max_wire_smps2;
260	uint32_t max_smps_timeout;
261	uint32_t transaction_timeout;
262	uint32_t transaction_retries;
263	uint8_t sm_priority;
264	uint8_t lmc;
265	boolean_t lmc_esp0;
266	uint8_t max_op_vls;
267	uint8_t force_link_speed;
268	uint8_t force_link_speed_ext;
269	uint8_t fdr10;
270	boolean_t reassign_lids;
271	boolean_t ignore_other_sm;
272	boolean_t single_thread;
273	boolean_t disable_multicast;
274	boolean_t force_log_flush;
275	uint8_t subnet_timeout;
276	uint8_t packet_life_time;
277	uint8_t vl_stall_count;
278	uint8_t leaf_vl_stall_count;
279	uint8_t head_of_queue_lifetime;
280	uint8_t leaf_head_of_queue_lifetime;
281	uint8_t local_phy_errors_threshold;
282	uint8_t overrun_errors_threshold;
283	boolean_t use_mfttop;
284	uint32_t sminfo_polling_timeout;
285	uint32_t polling_retry_number;
286	uint32_t max_msg_fifo_timeout;
287	boolean_t force_heavy_sweep;
288	uint8_t log_flags;
289	char *dump_files_dir;
290	char *log_file;
291	uint32_t log_max_size;
292	char *partition_config_file;
293	boolean_t no_partition_enforcement;
294	char *part_enforce;
295	osm_partition_enforce_type_enum part_enforce_enum;
296	boolean_t allow_both_pkeys;
297	uint8_t sm_assigned_guid;
298	boolean_t qos;
299	char *qos_policy_file;
300	boolean_t suppress_sl2vl_mad_status_errors;
301	boolean_t accum_log_file;
302	char *console;
303	uint16_t console_port;
304	char *port_prof_ignore_file;
305	char *hop_weights_file;
306	char *port_search_ordering_file;
307	boolean_t port_profile_switch_nodes;
308	boolean_t sweep_on_trap;
309	char *routing_engine_names;
310	boolean_t use_ucast_cache;
311	boolean_t connect_roots;
312	char *lid_matrix_dump_file;
313	char *lfts_file;
314	char *root_guid_file;
315	char *cn_guid_file;
316	char *io_guid_file;
317	boolean_t port_shifting;
318	uint32_t scatter_ports;
319	uint16_t max_reverse_hops;
320	char *ids_guid_file;
321	char *guid_routing_order_file;
322	boolean_t guid_routing_order_no_scatter;
323	char *sa_db_file;
324	boolean_t sa_db_dump;
325	char *torus_conf_file;
326	boolean_t do_mesh_analysis;
327	boolean_t exit_on_fatal;
328	boolean_t honor_guid2lid_file;
329	boolean_t daemon;
330	boolean_t sm_inactive;
331	boolean_t babbling_port_policy;
332	boolean_t drop_event_subscriptions;
333	boolean_t ipoib_mcgroup_creation_validation;
334	boolean_t mcgroup_join_validation;
335	boolean_t use_optimized_slvl;
336	boolean_t fsync_high_avail_files;
337	osm_qos_options_t qos_options;
338	osm_qos_options_t qos_ca_options;
339	osm_qos_options_t qos_sw0_options;
340	osm_qos_options_t qos_swe_options;
341	osm_qos_options_t qos_rtr_options;
342	boolean_t congestion_control;
343	ib_net64_t cc_key;
344	uint32_t cc_max_outstanding_mads;
345	ib_net32_t cc_sw_cong_setting_control_map;
346	uint8_t cc_sw_cong_setting_victim_mask[IB_CC_PORT_MASK_DATA_SIZE];
347	uint8_t cc_sw_cong_setting_credit_mask[IB_CC_PORT_MASK_DATA_SIZE];
348	uint8_t cc_sw_cong_setting_threshold;
349	uint8_t cc_sw_cong_setting_packet_size;
350	uint8_t cc_sw_cong_setting_credit_starvation_threshold;
351	osm_cct_entry_t cc_sw_cong_setting_credit_starvation_return_delay;
352	ib_net16_t cc_sw_cong_setting_marking_rate;
353	ib_net16_t cc_ca_cong_setting_port_control;
354	ib_net16_t cc_ca_cong_setting_control_map;
355	osm_cacongestion_entry_t cc_ca_cong_entries[IB_CA_CONG_ENTRY_DATA_SIZE];
356	osm_cct_t cc_cct;
357	boolean_t enable_quirks;
358	boolean_t no_clients_rereg;
359#ifdef ENABLE_OSM_PERF_MGR
360	boolean_t perfmgr;
361	boolean_t perfmgr_redir;
362	uint16_t perfmgr_sweep_time_s;
363	uint32_t perfmgr_max_outstanding_queries;
364	boolean_t perfmgr_ignore_cas;
365	char *event_db_dump_file;
366	int perfmgr_rm_nodes;
367	boolean_t perfmgr_log_errors;
368	boolean_t perfmgr_query_cpi;
369	boolean_t perfmgr_xmit_wait_log;
370	uint32_t perfmgr_xmit_wait_threshold;
371#endif				/* ENABLE_OSM_PERF_MGR */
372	char *event_plugin_name;
373	char *event_plugin_options;
374	char *node_name_map_name;
375	char *prefix_routes_file;
376	char *log_prefix;
377	boolean_t consolidate_ipv6_snm_req;
378	struct osm_subn_opt *file_opts; /* used for update */
379	uint8_t lash_start_vl;			/* starting vl to use in lash */
380	uint8_t sm_sl;			/* which SL to use for SM/SA communication */
381	char *per_module_logging_file;
382	boolean_t quasi_ftree_indexing;
383} osm_subn_opt_t;
384/*
385* FIELDS
386*
387*	config_file
388*		The name of the config file.
389*
390*	guid
391*		The port guid that the SM is binding to.
392*
393*	m_key
394*		M_Key value sent to all ports qualifying all Set(PortInfo).
395*
396*	sm_key
397*		SM_Key value of the SM used for SM authentication.
398*
399*	sa_key
400*		SM_Key value to qualify rcv SA queries as "trusted".
401*
402*	subnet_prefix
403*		Subnet prefix used on this subnet.
404*
405*	m_key_lease_period
406*		The lease period used for the M_Key on this subnet.
407*
408*	sweep_interval
409*		The number of seconds between subnet sweeps.  A value of 0
410*		disables sweeping.
411*
412*	max_wire_smps
413*		The maximum number of SMPs sent in parallel.  Default is 4.
414*
415*	max_wire_smps2
416*		The maximum number of timeout SMPs allowed to be outstanding.
417*		Default is same as max_wire_smps which disables the timeout
418*		mechanism.
419*
420*	max_smps_timeout
421*		The wait time in usec for timeout based SMPs.  Default is
422*		timeout * retries.
423*
424*	transaction_timeout
425*		The maximum time in milliseconds allowed for a transaction
426*		to complete.  Default is 200.
427*
428*	transaction_retries
429*		The number of retries for a transaction. Default is 3.
430*
431*	sm_priority
432*		The priority of this SM as specified by the user.  This
433*		value is made available in the SMInfo attribute.
434*
435*	lmc
436*		The LMC value used on this subnet.
437*
438*	lmc_esp0
439*		Whether LMC value used on subnet should be used for
440*		enhanced switch port 0 or not.  If TRUE, it is used.
441*		Otherwise (the default), LMC is set to 0 for ESP0.
442*
443*	max_op_vls
444*		Limit the maximal operational VLs. default is 1.
445*
446*	reassign_lids
447*		If TRUE cause all lids to be re-assigend.
448*		Otherwise (the default),
449*		OpenSM always tries to preserve as LIDs as much as possible.
450*
451*	ignore_other_sm_option
452*		This flag is TRUE if other SMs on the subnet should be ignored.
453*
454*	disable_multicast
455*		This flag is TRUE if OpenSM should disable multicast support.
456*
457*	max_msg_fifo_timeout
458*		The maximal time a message can stay in the incoming message
459*		queue. If there is more than one message in the queue and the
460*		last message stayed in the queue more than this value the SA
461*		request will be immediately returned with a BUSY status.
462*
463*	subnet_timeout
464*		The subnet_timeout that will be set for all the ports in the
465*		design SubnSet(PortInfo.vl_stall_life))
466*
467*	vl_stall_count
468*		The number of sequential packets dropped that cause the port
469*		to enter the VLStalled state.
470*
471*	leaf_vl_stall_count
472*		The number of sequential packets dropped that cause the port
473*		to enter the VLStalled state. This is for switch ports driving
474*		a CA or router port.
475*
476*	head_of_queue_lifetime
477*		The maximal time a packet can live at the head of a VL queue
478*		on any port not driving a CA or router port.
479*
480*	leaf_head_of_queue_lifetime
481*		The maximal time a packet can live at the head of a VL queue
482*		on switch ports driving a CA or router.
483*
484*	local_phy_errors_threshold
485*		Threshold of local phy errors for sending Trap 129
486*
487*	overrun_errors_threshold
488*		Threshold of credits overrun errors for sending Trap 129
489*
490*	sminfo_polling_timeout
491*		Specifies the polling timeout (in milliseconds) - the timeout
492*		between one poll to another.
493*
494*	packet_life_time
495*		The maximal time a packet can stay in a switch.
496*		The value is send to all switches as
497*		SubnSet(SwitchInfo.life_state)
498*
499*	dump_files_dir
500*		The directory to be used for opensm-subnet.lst, opensm.fdbs,
501*		opensm.mcfdbs, and default log file (the latter for Windows,
502*		not Linux).
503*
504*	log_file
505*		Name of the log file (or NULL) for stdout.
506*
507*	log_max_size
508*		This option defines maximal log file size in MB. When
509*		specified the log file will be truncated upon reaching
510*		this limit.
511*
512*	qos
513*		Boolean that specifies whether the OpenSM QoS functionality
514*		should be off or on.
515*
516*	qos_policy_file
517*		Name of the QoS policy file.
518*
519*	accum_log_file
520*		If TRUE (default) - the log file will be accumulated.
521*		If FALSE - the log file will be erased before starting
522*		current opensm run.
523*
524*	port_prof_ignore_file
525*		Name of file with port guids to be ignored by port profiling.
526*
527*	port_profile_switch_nodes
528*		If TRUE will count the number of switch nodes routed through
529*		the link. If FALSE - only CA/RT nodes are counted.
530*
531*	sweep_on_trap
532*		Received traps will initiate a new sweep.
533*
534*	routing_engine_names
535*		Name of routing engine(s) to use.
536*
537*	connect_roots
538*		The option which will enforce root to root connectivity with
539*		up/down and fat-tree routing engines (even if this violates
540*		"pure" deadlock free up/down or fat-tree algorithm)
541*
542*	use_ucast_cache
543*		When TRUE enables unicast routing cache.
544*
545*	lid_matrix_dump_file
546*		Name of the lid matrix dump file from where switch
547*		lid matrices (min hops tables) will be loaded
548*
549*	lfts_file
550*		Name of the unicast LFTs routing file from where switch
551*		forwarding tables will be loaded
552*
553*	root_guid_file
554*		Name of the file that contains list of root guids that
555*		will be used by fat-tree or up/dn routing (provided by User)
556*
557*	cn_guid_file
558*		Name of the file that contains list of compute node guids that
559*		will be used by fat-tree routing (provided by User)
560*
561*	io_guid_file
562*		Name of the file that contains list of I/O node guids that
563*		will be used by fat-tree routing (provided by User)
564*
565*	port_shifting
566*		This option will turn on port_shifting in routing.
567*
568*	ids_guid_file
569*		Name of the file that contains list of ids which should be
570*		used by Up/Down algorithm instead of node GUIDs
571*
572*	guid_routing_order_file
573*		Name of the file that contains list of guids for routing order
574*		that will be used by minhop and up/dn routing (provided by User).
575*
576*	sa_db_file
577*		Name of the SA database file.
578*
579*	sa_db_dump
580*		When TRUE causes OpenSM to dump SA DB at the end of every
581*		light sweep regardless the current verbosity level.
582*
583*	torus_conf_file
584*		Name of the file with extra configuration info for torus-2QoS
585*		routing engine.
586*
587*	exit_on_fatal
588*		If TRUE (default) - SM will exit on fatal subnet initialization
589*		issues.
590*		If FALSE - SM will not exit.
591*		Fatal initialization issues:
592*		a. SM recognizes 2 different nodes with the same guid, or
593*		   12x link with lane reversal badly configured.
594*
595*	honor_guid2lid_file
596*		Always honor the guid2lid file if it exists and is valid. This
597*		means that the file will be honored when SM is coming out of
598*		STANDBY. By default this is FALSE.
599*
600*	daemon
601*		OpenSM will run in daemon mode.
602*
603*	sm_inactive
604*		OpenSM will start with SM in not active state.
605*
606*	babbling_port_policy
607*		OpenSM will enforce its "babbling" port policy.
608*
609*	drop_event_subscriptions
610*		OpenSM will drop event subscriptions if the port goes away.
611*
612*	ipoib_mcgroup_creation_validation
613*		OpenSM will validate IPoIB non-broadcast group parameters
614*		against IPoIB broadcast group.
615*
616*	mcgroup_join_validation
617*		OpenSM will validate multicast join parameters against
618*		multicast group parameters when MC group already exists.
619*
620*	use_optimized_slvl
621*		Use optimized SLtoVLMappingTable programming if
622*		device indicates it supports this.
623*
624*	fsync_high_avail_files
625*		Synchronize high availability in memory files
626*		with storage.
627*
628*	perfmgr
629*		Enable or disable the performance manager
630*
631*	perfmgr_redir
632*		Enable or disable the saving of redirection by PerfMgr
633*
634*	perfmgr_sweep_time_s
635*		Define the period (in seconds) of PerfMgr sweeps
636*
637*       event_db_dump_file
638*               File to dump the event database to
639*
640*       event_plugin_name
641*               Specify the name(s) of the event plugin(s)
642*
643*       event_plugin_options
644*               Options string that would be passed to the plugin(s)
645*
646*	qos_options
647*		Default set of QoS options
648*
649*	qos_ca_options
650*		QoS options for CA ports
651*
652*	qos_sw0_options
653*		QoS options for switches' port 0
654*
655*	qos_swe_options
656*		QoS options for switches' external ports
657*
658*	qos_rtr_options
659*		QoS options for router ports
660*
661*	congestion_control
662*		Boolean that specifies whether OpenSM congestion control configuration
663*		should be off or no.
664*
665*	cc_key
666*		CCkey to use when configuring congestion control.
667*
668*	cc_max_outstanding_mads
669*		Max number of outstanding CC mads that can be on the wire.
670*
671*	cc_sw_cong_setting_control_map
672*		Congestion Control Switch Congestion Setting Control Map
673*		configuration setting.
674*
675*	cc_sw_cong_setting_victim_mask
676*		Congestion Control Switch Congestion Setting Victim Mask
677*		configuration setting.
678*
679*	cc_sw_cong_setting_credit_mask
680*		Congestion Control Switch Congestion Setting Credit Mask
681*		configuration setting.
682*
683*	cc_sw_cong_setting_threshold
684*		Congestion Control Switch Congestion Setting Threshold
685*		configuration setting.
686*
687*	cc_sw_cong_setting_packet_size
688*		Congestion Control Switch Congestion Setting Packet Size
689*		configuration setting.
690*
691*	cc_sw_cong_setting_credit_starvation_threshold
692*		Congestion Control Switch Congestion Setting Credit Starvation Threshold
693*		configuration setting.
694*
695*	cc_sw_cong_setting_credit_starvation_return_delay
696*		Congestion Control Switch Congestion Setting Credit Starvation Return Delay
697*		configuration setting.
698*
699*	cc_sw_cong_setting_marking_rate
700*		Congestion Control Switch Congestion Setting Marking Rate
701*		configuration setting.
702*
703*	cc_ca_cong_setting_port_control
704*		Congestion Control CA Congestion Setting Port Control
705*
706*	cc_ca_cong_setting_control_map
707*		Congestion Control CA Congestion Setting Control Map
708
709*	cc_ca_cong_entries
710*		Congestion Control CA Congestion Setting Entries
711*
712*	cc_cct
713*		Congestion Control Table array of entries
714*
715*	enable_quirks
716*		Enable high risk new features and not fully qualified
717*		hardware specific work arounds
718*
719*	no_clients_rereg
720*		When TRUE disables clients reregistration request
721*
722*	scatter_ports
723*		When not zero, randomize best possible ports chosen
724*		for a route. The value is used as a random key seed.
725*
726*	per_module_logging_file
727*		File name of per module logging configuration.
728*
729* SEE ALSO
730*	Subnet object
731*********/
732
733/****s* OpenSM: Subnet/osm_subn_t
734* NAME
735*	osm_subn_t
736*
737* DESCRIPTION
738*	Subnet structure.  Callers may directly access member components,
739*	after grabbing a lock.
740*
741* TO DO
742*	This structure should probably be volatile.
743*
744* SYNOPSIS
745*/
746typedef struct osm_subn {
747	struct osm_opensm *p_osm;
748	cl_qmap_t sw_guid_tbl;
749	cl_qmap_t node_guid_tbl;
750	cl_qmap_t port_guid_tbl;
751	cl_qmap_t alias_port_guid_tbl;
752	cl_qmap_t assigned_guids_tbl;
753	cl_qmap_t rtr_guid_tbl;
754	cl_qlist_t prefix_routes_list;
755	cl_qmap_t prtn_pkey_tbl;
756	cl_qmap_t sm_guid_tbl;
757	cl_qlist_t sa_sr_list;
758	cl_qlist_t sa_infr_list;
759	cl_qlist_t alias_guid_list;
760	cl_ptr_vector_t port_lid_tbl;
761	ib_net16_t master_sm_base_lid;
762	ib_net16_t sm_base_lid;
763	ib_net64_t sm_port_guid;
764	uint8_t last_sm_port_state;
765	uint8_t sm_state;
766	osm_subn_opt_t opt;
767	struct osm_qos_policy *p_qos_policy;
768	uint16_t max_ucast_lid_ho;
769	uint16_t max_mcast_lid_ho;
770	uint8_t min_ca_mtu;
771	uint8_t min_ca_rate;
772	uint8_t min_data_vls;
773	uint8_t min_sw_data_vls;
774	boolean_t ignore_existing_lfts;
775	boolean_t subnet_initialization_error;
776	boolean_t force_heavy_sweep;
777	boolean_t force_reroute;
778	boolean_t in_sweep_hop_0;
779	boolean_t force_first_time_master_sweep;
780	boolean_t first_time_master_sweep;
781	boolean_t coming_out_of_standby;
782	boolean_t sweeping_enabled;
783	unsigned need_update;
784	cl_fmap_t mgrp_mgid_tbl;
785	osm_db_domain_t *p_g2m;
786	osm_db_domain_t *p_neighbor;
787	void *mboxes[IB_LID_MCAST_END_HO - IB_LID_MCAST_START_HO + 1];
788} osm_subn_t;
789/*
790* FIELDS
791*	sw_guid_tbl
792*		Container of pointers to all Switch objects in the subnet.
793*		Indexed by node GUID.
794*
795*	node_guid_tbl
796*		Container of pointers to all Node objects in the subnet.
797*		Indexed by node GUID.
798*
799*	port_guid_tbl
800*		Container of pointers to all Port objects in the subnet.
801*		Indexed by port GUID.
802*
803*	rtr_guid_tbl
804*		Container of pointers to all Router objects in the subnet.
805*		Indexed by node GUID.
806*
807*	prtn_pkey_tbl
808*		Container of pointers to all Partition objects in the subnet.
809*		Indexed by P_KEY.
810*
811*	sm_guid_tbl
812*		Container of pointers to SM objects representing other SMs
813*		on the subnet.
814*
815*	port_lid_tbl
816*		Container of pointers to all Port objects in the subnet.
817*		Indexed by port LID.
818*
819*	master_sm_base_lid
820*		The base LID owned by the subnet's master SM.
821*
822*	sm_base_lid
823*		The base LID of the local port where the SM is.
824*
825*	sm_port_guid
826*		This SM's own port GUID.
827*
828*	last_sm_port_state
829*		Last state of this SM's port.
830*		0 is down and 1 is up.
831*
832*	sm_state
833*		The high-level state of the SM.  This value is made available
834*		in the SMInfo attribute.
835*
836*	opt
837*		Subnet options structure contains site specific configuration.
838*
839*	p_qos_policy
840*		Subnet QoS policy structure.
841*
842*	max_ucast_lid_ho
843*		The minimal max unicast lid reported by all switches
844*
845*	max_mcast_lid_ho
846*		The minimal max multicast lid reported by all switches
847*
848*	min_ca_mtu
849*		The minimal MTU reported by all CAs ports on the subnet
850*
851*	min_ca_rate
852*		The minimal rate reported by all CA ports on the subnet
853*
854*	ignore_existing_lfts
855*		This flag is a dynamic flag to instruct the LFT assignment to
856*		ignore existing legal LFT settings.
857*		The value will be set according to :
858*		- Any change to the list of switches will set it to high
859*		- Coming out of STANDBY it will be cleared (other SM worked)
860*		- Set to FALSE upon end of all lft assignments.
861*
862*	subnet_initalization_error
863*		Similar to the force_heavy_sweep flag. If TRUE - means that
864*		we had errors during initialization (due to SubnSet requests
865*		that failed). We want to declare the subnet as unhealthy, and
866*		force another heavy sweep.
867*
868*	force_heavy_sweep
869*		If TRUE - we want to force a heavy sweep. This can be done
870*		either due to receiving of trap - meaning there is some change
871*		on the subnet, or we received a handover from a remote sm.
872*		In this case we want to sweep and reconfigure the entire
873*		subnet. This will cause another heavy sweep to occure when
874*		the current sweep is done.
875*
876*	force_reroute
877*		If TRUE - we want to force switches in the fabric to be
878*		rerouted.
879*
880*	in_sweep_hop_0
881*		When in_sweep_hop_0 flag is set to TRUE - this means we are
882*		in sweep_hop_0 - meaning we do not want to continue beyond
883*		the current node.
884*		This is relevant for the case of SM on switch, since in the
885*		switch info we need to signal somehow not to continue
886*		the sweeping.
887*
888*	force_first_time_master_sweep
889*		This flag is used to avoid race condition when Master SM being
890*		in the middle of very long configuration stage of the heavy sweep,
891*		receives HANDOVER from another MASTER SM. When the current heavy sweep
892*		is finished, new heavy sweep will be started immediately.
893*		At the beginning of the sweep, opensm will set first_time_master_sweep,
894*		force_heavy_sweep and coming_out_of_standby flags in order to allow full
895*		reconfiguration of the fabric. This is required as another MASTER SM could
896*		change configuration of the fabric before sending HANDOVER to MASTER SM.
897*
898*	first_time_master_sweep
899*		This flag is used for the PortInfo setting. On the first
900*		sweep as master (meaning after moving from Standby|Discovering
901*		state), the SM must send a PortInfoSet to all ports. After
902*		that - we want to minimize the number of PortInfoSet requests
903*		sent, and to send only requests that change the value from
904*		what is updated in the port (or send a first request if this
905*		is a new port). We will set this flag to TRUE when entering
906*		the master state, and set it back to FALSE at the end of the
907*		drop manager. This is done since at the end of the drop manager
908*		we have updated all the ports that are reachable, and from now
909*		on these are the only ports we have data of. We don't want
910*		to send extra set requests to these ports anymore.
911*
912*	coming_out_of_standby
913*		TRUE on the first sweep after the SM was in standby.
914*		Used for nulling any cache of LID and Routing.
915*		The flag is set true if the SM state was standby and now
916*		changed to MASTER it is reset at the end of the sweep.
917*
918*	sweeping_enabled
919*		FALSE - sweeping is administratively disabled, all
920*		sweeping is inhibited, TRUE - sweeping is done
921*		normally
922*
923*	need_update
924*		This flag should be on during first non-master heavy
925*		(including pre-master discovery stage)
926*
927*	mgrp_mgid_tbl
928*		Container of pointers to all Multicast group objects in
929*		the subnet. Indexed by MGID.
930*
931*	mboxes
932*		Array of pointers to all Multicast MLID box objects in the
933*		subnet. Indexed by MLID offset from base MLID.
934*
935* SEE ALSO
936*	Subnet object
937*********/
938
939/****s* OpenSM: Subnet/osm_assigned_guids_t
940* NAME
941*	osm_assigned_guids_t
942*
943* DESCRIPTION
944*	SA assigned GUIDs structure.
945*
946* SYNOPSIS
947*/
948typedef struct osm_assigned_guids {
949	cl_map_item_t map_item;
950	ib_net64_t port_guid;
951	ib_net64_t assigned_guid[1];
952} osm_assigned_guids_t;
953/*
954* FIELDS
955*	map_item
956*		Linkage structure for cl_qmap.  MUST BE FIRST MEMBER!
957*
958*	port_guid
959*		Base port GUID.
960*
961*	assigned_guids
962*		Table of persistent SA assigned GUIDs.
963*
964* SEE ALSO
965*	Subnet object
966*********/
967
968/****f* OpenSM: Subnet/osm_subn_construct
969* NAME
970*	osm_subn_construct
971*
972* DESCRIPTION
973*	This function constructs a Subnet object.
974*
975* SYNOPSIS
976*/
977void osm_subn_construct(IN osm_subn_t * p_subn);
978/*
979* PARAMETERS
980*	p_subn
981*		[in] Pointer to a Subnet object to construct.
982*
983* RETURN VALUE
984*	This function does not return a value.
985*
986* NOTES
987*	Allows calling osm_subn_init, and osm_subn_destroy.
988*
989*	Calling osm_subn_construct is a prerequisite to calling any other
990*	method except osm_subn_init.
991*
992* SEE ALSO
993*	Subnet object, osm_subn_init, osm_subn_destroy
994*********/
995
996/****f* OpenSM: Subnet/osm_subn_destroy
997* NAME
998*	osm_subn_destroy
999*
1000* DESCRIPTION
1001*	The osm_subn_destroy function destroys a subnet, releasing
1002*	all resources.
1003*
1004* SYNOPSIS
1005*/
1006void osm_subn_destroy(IN osm_subn_t * p_subn);
1007/*
1008* PARAMETERS
1009*	p_subn
1010*		[in] Pointer to a Subnet object to destroy.
1011*
1012* RETURN VALUE
1013*	This function does not return a value.
1014*
1015* NOTES
1016*	Performs any necessary cleanup of the specified Subnet object.
1017*	Further operations should not be attempted on the destroyed object.
1018*	This function should only be called after a call to osm_subn_construct
1019*	or osm_subn_init.
1020*
1021* SEE ALSO
1022*	Subnet object, osm_subn_construct, osm_subn_init
1023*********/
1024
1025/****f* OpenSM: Subnet/osm_subn_init
1026* NAME
1027*	osm_subn_init
1028*
1029* DESCRIPTION
1030*	The osm_subn_init function initializes a Subnet object for use.
1031*
1032* SYNOPSIS
1033*/
1034ib_api_status_t osm_subn_init(IN osm_subn_t * p_subn,
1035			      IN struct osm_opensm *p_osm,
1036			      IN const osm_subn_opt_t * p_opt);
1037/*
1038* PARAMETERS
1039*	p_subn
1040*		[in] Pointer to an osm_subn_t object to initialize.
1041*
1042*	p_opt
1043*		[in] Pointer to the subnet options structure.
1044*
1045* RETURN VALUES
1046*	IB_SUCCESS if the Subnet object was initialized successfully.
1047*
1048* NOTES
1049*	Allows calling other Subnet methods.
1050*
1051* SEE ALSO
1052*	Subnet object, osm_subn_construct, osm_subn_destroy
1053*********/
1054
1055/*
1056  Forward references.
1057*/
1058struct osm_mad_addr;
1059struct osm_log;
1060struct osm_switch;
1061struct osm_physp;
1062struct osm_port;
1063struct osm_mgrp;
1064
1065/****f* OpenSM: Helper/osm_get_gid_by_mad_addr
1066* NAME
1067*	osm_get_gid_by_mad_addr
1068*
1069* DESCRIPTION
1070*	Looks for the requester gid in the mad address.
1071*
1072* Note: This code is not thread safe. Need to grab the lock before
1073* calling it.
1074*
1075* SYNOPSIS
1076*/
1077ib_api_status_t osm_get_gid_by_mad_addr(IN struct osm_log *p_log,
1078					IN const osm_subn_t * p_subn,
1079					IN struct osm_mad_addr *p_mad_addr,
1080					OUT ib_gid_t * p_gid);
1081/*
1082* PARAMETERS
1083*	p_log
1084*		[in] Pointer to a log object.
1085*
1086*	p_subn
1087*		[in] Pointer to subnet object.
1088*
1089*	p_mad_addr
1090*		[in] Pointer to mad address object.
1091*
1092*	p_gid
1093*		[out] Pointer to the GID structure to fill in.
1094*
1095* RETURN VALUES
1096*     IB_SUCCESS if able to find the GID by address given.
1097*
1098* NOTES
1099*
1100* SEE ALSO
1101*********/
1102
1103/****f* OpenSM: Helper/osm_get_physp_by_mad_addr
1104* NAME
1105*	osm_get_physp_by_mad_addr
1106*
1107* DESCRIPTION
1108*	Looks for the requester physical port in the mad address.
1109*
1110* Note: This code is not thread safe. Need to grab the lock before
1111* calling it.
1112*
1113* SYNOPSIS
1114*/
1115struct osm_physp *osm_get_physp_by_mad_addr(IN struct osm_log *p_log,
1116					     IN const osm_subn_t * p_subn,
1117					     IN struct osm_mad_addr
1118					     *p_mad_addr);
1119/*
1120* PARAMETERS
1121*	p_log
1122*		[in] Pointer to a log object.
1123*
1124*	p_subn
1125*		[in] Pointer to subnet object.
1126*
1127*	p_mad_addr
1128*		[in] Pointer to mad address object.
1129*
1130* RETURN VALUES
1131*	Pointer to requester physical port object if found. Null otherwise.
1132*
1133* NOTES
1134*
1135* SEE ALSO
1136*********/
1137
1138/****f* OpenSM: Helper/osm_get_port_by_mad_addr
1139* NAME
1140*	osm_get_port_by_mad_addr
1141*
1142* DESCRIPTION
1143*	Looks for the requester port in the mad address.
1144*
1145* Note: This code is not thread safe. Need to grab the lock before
1146* calling it.
1147*
1148* SYNOPSIS
1149*/
1150struct osm_port *osm_get_port_by_mad_addr(IN struct osm_log *p_log,
1151					   IN const osm_subn_t * p_subn,
1152					   IN struct osm_mad_addr *p_mad_addr);
1153/*
1154* PARAMETERS
1155*	p_log
1156*		[in] Pointer to a log object.
1157*
1158*	p_subn
1159*		[in] Pointer to subnet object.
1160*
1161*	p_mad_addr
1162*		[in] Pointer to mad address object.
1163*
1164* RETURN VALUES
1165*	Pointer to requester port object if found. Null otherwise.
1166*
1167* NOTES
1168*
1169* SEE ALSO
1170*********/
1171
1172/****f* OpenSM: Subnet/osm_get_switch_by_guid
1173* NAME
1174*	osm_get_switch_by_guid
1175*
1176* DESCRIPTION
1177*	Looks for the given switch guid in the subnet table of switches by guid.
1178*  NOTE: this code is not thread safe. Need to grab the lock before
1179*  calling it.
1180*
1181* SYNOPSIS
1182*/
1183struct osm_switch *osm_get_switch_by_guid(IN const osm_subn_t * p_subn,
1184					  IN ib_net64_t guid);
1185/*
1186* PARAMETERS
1187*	p_subn
1188*		[in] Pointer to an osm_subn_t object
1189*
1190*	guid
1191*		[in] The node guid in network byte order
1192*
1193* RETURN VALUES
1194*	The switch structure pointer if found. NULL otherwise.
1195*
1196* SEE ALSO
1197*	Subnet object, osm_subn_construct, osm_subn_destroy,
1198*	osm_switch_t
1199*********/
1200
1201/****f* OpenSM: Subnet/osm_get_node_by_guid
1202* NAME
1203*	osm_get_node_by_guid
1204*
1205* DESCRIPTION
1206*	This looks for the given node guid in the subnet table of nodes by guid.
1207*  NOTE: this code is not thread safe. Need to grab the lock before
1208*  calling it.
1209*
1210* SYNOPSIS
1211*/
1212struct osm_node *osm_get_node_by_guid(IN osm_subn_t const *p_subn,
1213				      IN ib_net64_t guid);
1214/*
1215* PARAMETERS
1216*	p_subn
1217*		[in] Pointer to an osm_subn_t object
1218*
1219*	guid
1220*		[in] The node guid in network byte order
1221*
1222* RETURN VALUES
1223*	The node structure pointer if found. NULL otherwise.
1224*
1225* SEE ALSO
1226*	Subnet object, osm_subn_construct, osm_subn_destroy,
1227*	osm_node_t
1228*********/
1229
1230/****f* OpenSM: Subnet/osm_get_port_by_guid
1231* NAME
1232*	osm_get_port_by_guid
1233*
1234* DESCRIPTION
1235*	This looks for the given port guid in the subnet table of ports by guid.
1236*  NOTE: this code is not thread safe. Need to grab the lock before
1237*  calling it.
1238*
1239* SYNOPSIS
1240*/
1241struct osm_port *osm_get_port_by_guid(IN osm_subn_t const *p_subn,
1242				      IN ib_net64_t guid);
1243/*
1244* PARAMETERS
1245*	p_subn
1246*		[in] Pointer to an osm_subn_t object
1247*
1248*	guid
1249*		[in] The port guid in network order
1250*
1251* RETURN VALUES
1252*	The port structure pointer if found. NULL otherwise.
1253*
1254* SEE ALSO
1255*	Subnet object, osm_subn_construct, osm_subn_destroy,
1256*	osm_port_t
1257*********/
1258
1259/****f* OpenSM: Port/osm_get_port_by_lid_ho
1260* NAME
1261*	osm_get_port_by_lid_ho
1262*
1263* DESCRIPTION
1264*	Returns a pointer of the port object for given lid value.
1265*
1266* SYNOPSIS
1267*/
1268struct osm_port *osm_get_port_by_lid_ho(const osm_subn_t * subn, uint16_t lid);
1269/*
1270* PARAMETERS
1271*	subn
1272*		[in] Pointer to the subnet data structure.
1273*
1274*	lid
1275*		[in] LID requested in host byte order.
1276*
1277* RETURN VALUES
1278*	The port structure pointer if found. NULL otherwise.
1279*
1280* SEE ALSO
1281*       Subnet object, osm_port_t
1282*********/
1283
1284/****f* OpenSM: Subnet/osm_get_alias_guid_by_guid
1285* NAME
1286*	osm_get_alias_guid_by_guid
1287*
1288* DESCRIPTION
1289*	This looks for the given port guid in the subnet table of ports by
1290*	alias guid.
1291*  NOTE: this code is not thread safe. Need to grab the lock before
1292*  calling it.
1293*
1294* SYNOPSIS
1295*/
1296struct osm_alias_guid *osm_get_alias_guid_by_guid(IN osm_subn_t const *p_subn,
1297						  IN ib_net64_t guid);
1298/*
1299* PARAMETERS
1300*	p_subn
1301*		[in] Pointer to an osm_subn_t object
1302*
1303*	guid
1304*		[in] The alias port guid in network order
1305*
1306* RETURN VALUES
1307*	The alias guid structure pointer if found. NULL otherwise.
1308*
1309* SEE ALSO
1310*	Subnet object, osm_subn_construct, osm_subn_destroy,
1311*	osm_alias_guid_t
1312*********/
1313
1314/****f* OpenSM: Subnet/osm_get_port_by_alias_guid
1315* NAME
1316*	osm_get_port_by_alias_guid
1317*
1318* DESCRIPTION
1319*	This looks for the given port guid in the subnet table of ports by
1320*	alias guid.
1321*  NOTE: this code is not thread safe. Need to grab the lock before
1322*  calling it.
1323*
1324* SYNOPSIS
1325*/
1326struct osm_port *osm_get_port_by_alias_guid(IN osm_subn_t const *p_subn,
1327					    IN ib_net64_t guid);
1328/*
1329* PARAMETERS
1330*	p_subn
1331*		[in] Pointer to an osm_subn_t object
1332*
1333*	guid
1334*		[in] The alias port guid in network order
1335*
1336* RETURN VALUES
1337*	The port structure pointer if found. NULL otherwise.
1338*
1339* SEE ALSO
1340*	Subnet object, osm_subn_construct, osm_subn_destroy,
1341*	osm_port_t
1342*********/
1343
1344/****f* OpenSM: Port/osm_assigned_guids_new
1345* NAME
1346*	osm_assigned_guids_new
1347*
1348* DESCRIPTION
1349*	This function allocates and initializes an assigned guids object.
1350*
1351* SYNOPSIS
1352*/
1353osm_assigned_guids_t *osm_assigned_guids_new(IN const ib_net64_t port_guid,
1354					     IN const uint32_t num_guids);
1355/*
1356* PARAMETERS
1357*       port_guid
1358*               [in] Base port GUID in network order
1359*
1360* RETURN VALUE
1361*       Pointer to the initialized assigned alias guid object.
1362*
1363* SEE ALSO
1364*	Subnet object, osm_assigned_guids_t, osm_assigned_guids_delete,
1365*	osm_get_assigned_guids_by_guid
1366*********/
1367
1368/****f* OpenSM: Port/osm_assigned_guids_delete
1369* NAME
1370*	osm_assigned_guids_delete
1371*
1372* DESCRIPTION
1373*	This function destroys and deallocates an assigned guids object.
1374*
1375* SYNOPSIS
1376*/
1377void osm_assigned_guids_delete(IN OUT osm_assigned_guids_t ** pp_assigned_guids);
1378/*
1379* PARAMETERS
1380*       pp_assigned_guids
1381*		[in][out] Pointer to a pointer to an assigned guids object to delete.
1382*		On return, this pointer is NULL.
1383*
1384* RETURN VALUE
1385*	This function does not return a value.
1386*
1387* NOTES
1388*	Performs any necessary cleanup of the specified assigned guids object.
1389*
1390* SEE ALSO
1391*	Subnet object, osm_assigned_guids_new, osm_get_assigned_guids_by_guid
1392*********/
1393
1394/****f* OpenSM: Subnet/osm_get_assigned_guids_by_guid
1395* NAME
1396*	osm_get_assigned_guids_by_guid
1397*
1398* DESCRIPTION
1399*	This looks for the given port guid and returns a pointer
1400*	to the guid table of SA assigned alias guids for that port.
1401*
1402* SYNOPSIS
1403*/
1404osm_assigned_guids_t *osm_get_assigned_guids_by_guid(IN osm_subn_t const *p_subn,
1405						     IN ib_net64_t port_guid);
1406/*
1407* PARAMETERS
1408*	p_subn
1409*		[in] Pointer to an osm_subn_t object
1410*
1411*	port_guid
1412*		[in] The base port guid in network order
1413*
1414* RETURN VALUES
1415*	The osm_assigned_guids structure pointer if found. NULL otherwise.
1416*
1417* SEE ALSO
1418*	Subnet object, osm_assigned_guids_new, osm_assigned_guids_delete,
1419*	osm_assigned_guids_t
1420*********/
1421
1422/****f* OpenSM: Port/osm_get_port_by_lid
1423* NAME
1424*	osm_get_port_by_lid
1425*
1426* DESCRIPTION
1427*	Returns a pointer of the port object for given lid value.
1428*
1429* SYNOPSIS
1430*/
1431static inline struct osm_port *osm_get_port_by_lid(IN osm_subn_t const * subn,
1432						   IN ib_net16_t lid)
1433{
1434	return osm_get_port_by_lid_ho(subn, cl_ntoh16(lid));
1435}
1436/*
1437* PARAMETERS
1438*	subn
1439*		[in] Pointer to the subnet data structure.
1440*
1441*	lid
1442*		[in] LID requested in network byte order.
1443*
1444* RETURN VALUES
1445*	The port structure pointer if found. NULL otherwise.
1446*
1447* SEE ALSO
1448*       Subnet object, osm_port_t
1449*********/
1450
1451/****f* OpenSM: Subnet/osm_get_mgrp_by_mgid
1452* NAME
1453*	osm_get_mgrp_by_mgid
1454*
1455* DESCRIPTION
1456*	This looks for the given multicast group in the subnet table by mgid.
1457*	NOTE: this code is not thread safe. Need to grab the lock before
1458*	calling it.
1459*
1460* SYNOPSIS
1461*/
1462struct osm_mgrp *osm_get_mgrp_by_mgid(IN osm_subn_t * subn, IN ib_gid_t * mgid);
1463/*
1464* PARAMETERS
1465*	subn
1466*		[in] Pointer to an osm_subn_t object
1467*
1468*	mgid
1469*		[in] The multicast group MGID value
1470*
1471* RETURN VALUES
1472*	The multicast group structure pointer if found. NULL otherwise.
1473*********/
1474
1475/****f* OpenSM: Subnet/osm_get_mbox_by_mlid
1476* NAME
1477*	osm_get_mbox_by_mlid
1478*
1479* DESCRIPTION
1480*	This looks for the given multicast group in the subnet table by mlid.
1481*	NOTE: this code is not thread safe. Need to grab the lock before
1482*	calling it.
1483*
1484* SYNOPSIS
1485*/
1486static inline struct osm_mgrp_box *osm_get_mbox_by_mlid(osm_subn_t const *p_subn, ib_net16_t mlid)
1487{
1488	return (struct osm_mgrp_box *)p_subn->mboxes[cl_ntoh16(mlid) - IB_LID_MCAST_START_HO];
1489}
1490/*
1491* PARAMETERS
1492*	p_subn
1493*		[in] Pointer to an osm_subn_t object
1494*
1495*	mlid
1496*		[in] The multicast group mlid in network order
1497*
1498* RETURN VALUES
1499*	The multicast group structure pointer if found. NULL otherwise.
1500*********/
1501
1502int is_mlnx_ext_port_info_supported(ib_net32_t vendid, ib_net16_t devid);
1503
1504/****f* OpenSM: Subnet/osm_subn_set_default_opt
1505* NAME
1506*	osm_subn_set_default_opt
1507*
1508* DESCRIPTION
1509*	The osm_subn_set_default_opt function sets the default options.
1510*
1511* SYNOPSIS
1512*/
1513void osm_subn_set_default_opt(IN osm_subn_opt_t * p_opt);
1514/*
1515* PARAMETERS
1516*
1517*	p_opt
1518*		[in] Pointer to the subnet options structure.
1519*
1520* RETURN VALUES
1521*	None
1522*
1523* NOTES
1524*
1525* SEE ALSO
1526*	Subnet object, osm_subn_construct, osm_subn_destroy
1527*********/
1528
1529/****f* OpenSM: Subnet/osm_subn_parse_conf_file
1530* NAME
1531*	osm_subn_parse_conf_file
1532*
1533* DESCRIPTION
1534*	The osm_subn_parse_conf_file function parses the configuration file
1535*	and sets the defaults accordingly.
1536*
1537* SYNOPSIS
1538*/
1539int osm_subn_parse_conf_file(const char *conf_file, osm_subn_opt_t * p_opt);
1540/*
1541* PARAMETERS
1542*
1543*	p_opt
1544*		[in] Pointer to the subnet options structure.
1545*
1546* RETURN VALUES
1547*	0 on success, positive value if file doesn't exist,
1548*	negative value otherwise
1549*********/
1550
1551/****f* OpenSM: Subnet/osm_subn_rescan_conf_files
1552* NAME
1553*	osm_subn_rescan_conf_files
1554*
1555* DESCRIPTION
1556*	The osm_subn_rescan_conf_files function parses the configuration
1557*	files and update selected subnet options
1558*
1559* SYNOPSIS
1560*/
1561int osm_subn_rescan_conf_files(IN osm_subn_t * p_subn);
1562/*
1563* PARAMETERS
1564*
1565*	p_subn
1566*		[in] Pointer to the subnet structure.
1567*
1568* RETURN VALUES
1569*	0 on success, positive value if file doesn't exist,
1570*	negative value otherwise
1571*
1572*********/
1573
1574/****f* OpenSM: Subnet/osm_subn_output_conf
1575* NAME
1576*	osm_subn_output_conf
1577*
1578* DESCRIPTION
1579*	Output configuration info
1580*
1581* SYNOPSIS
1582*/
1583void osm_subn_output_conf(FILE *out, IN osm_subn_opt_t * p_opt);
1584/*
1585* PARAMETERS
1586*
1587*	out
1588*		[in] File stream to output to.
1589*
1590*	p_opt
1591*		[in] Pointer to the subnet options structure.
1592*
1593* RETURN VALUES
1594*	This method does not return a value
1595*********/
1596
1597/****f* OpenSM: Subnet/osm_subn_write_conf_file
1598* NAME
1599*	osm_subn_write_conf_file
1600*
1601* DESCRIPTION
1602*	Write the configuration file into the cache
1603*
1604* SYNOPSIS
1605*/
1606int osm_subn_write_conf_file(char *file_name, IN osm_subn_opt_t * p_opt);
1607/*
1608* PARAMETERS
1609*
1610*	p_opt
1611*		[in] Pointer to the subnet options structure.
1612*
1613* RETURN VALUES
1614*	0 on success, negative value otherwise
1615*
1616* NOTES
1617*	Assumes the conf file is part of the cache dir which defaults to
1618*	OSM_DEFAULT_CACHE_DIR or OSM_CACHE_DIR the name is opensm.opts
1619*********/
1620int osm_subn_verify_config(osm_subn_opt_t * p_opt);
1621
1622END_C_DECLS
1623#endif				/* _OSM_SUBNET_H_ */
1624