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.
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:
13 * Redistribution and use in source and binary forms, with or
14 * without modification, are permitted provided that the following
17 * - Redistributions of source code must retain the above
18 * copyright notice, this list of conditions and the following
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.
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
39 * Declaration of osm_subn_t.
40 * This object represents an IBA subnet.
41 * This object is part of the OpenSM family of objects.
44 #ifndef _OSM_SUBNET_H_
45 #define _OSM_SUBNET_H_
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>
57 # define BEGIN_C_DECLS extern "C" {
58 # define END_C_DECLS }
59 #else /* !__cplusplus */
60 # define BEGIN_C_DECLS
62 #endif /* __cplusplus */
65 #define OSM_SUBNET_VECTOR_MIN_SIZE 0
66 #define OSM_SUBNET_VECTOR_GROW_SIZE 1
67 #define OSM_SUBNET_VECTOR_CAPACITY 256
69 struct osm_qos_policy;
76 * The Subnet object encapsulates the information needed by the
77 * OpenSM to manage a subnet. The OpenSM allocates one Subnet object
80 * The Subnet object is not thread safe, thus callers must provide
83 * This object is essentially a container for the various components
84 * of a subnet. Callers may directly access the member variables.
91 /****s* OpenSM: Subnet/osm_qos_options_t
96 * Subnet QoS options structure. This structure contains the various
97 * QoS specific configuration parameters for the subnet.
101 typedef struct osm_qos_options {
112 * The number of maximum VLs on the Subnet (0 == use default)
115 * The limit of High Priority component of VL Arbitration
116 * table (IBA 7.6.9) (-1 == use default)
119 * High priority VL Arbitration table template. (NULL == use default)
122 * Low priority VL Arbitration table template. (NULL == use default)
125 * SL2VL Mapping table (IBA 7.6.6) template. (NULL == use default)
129 /****s* OpenSM: Subnet/osm_subn_opt_t
134 * Subnet options structure. This structure contains the various
135 * site specific configuration parameters for the subnet.
139 typedef struct osm_subn_opt {
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;
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;
173 char *dump_files_dir;
175 unsigned long log_max_size;
176 char *partition_config_file;
177 boolean_t no_partition_enforcement;
179 char *qos_policy_file;
180 boolean_t accum_log_file;
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;
191 char *root_guid_file;
194 char *guid_routing_order_file;
196 boolean_t exit_on_fatal;
197 boolean_t honor_guid2lid_file;
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
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;
224 * The name of the config file.
227 * The port guid that the SM is binding to.
230 * M_Key value sent to all ports qualifying all Set(PortInfo).
233 * SM_Key value of the SM used for SM authentication.
236 * SM_Key value to qualify rcv SA queries as "trusted".
239 * Subnet prefix used on this subnet.
242 * The lease period used for the M_Key on this subnet.
245 * The number of seconds between subnet sweeps. A value of 0
249 * The maximum number of SMPs sent in parallel. Default is 4.
251 * transaction_timeout
252 * The maximum time in milliseconds allowed for a transaction
253 * to complete. Default is 200.
256 * The priority of this SM as specified by the user. This
257 * value is made available in the SMInfo attribute.
260 * The LMC value used on this subnet.
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.
268 * Limit the maximal operational VLs. default is 1.
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.
275 * ignore_other_sm_option
276 * This flag is TRUE if other SMs on the subnet should be ignored.
279 * This flag is TRUE if OpenSM should disable multicast support.
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.
288 * The subnet_timeout that will be set for all the ports in the
289 * design SubnSet(PortInfo.vl_stall_life))
292 * The number of sequential packets dropped that cause the port
293 * to enter the VLStalled state.
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.
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.
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.
308 * local_phy_errors_threshold
309 * Threshold of local phy errors for sending Trap 129
311 * overrun_errors_threshold
312 * Threshold of credits overrun errors for sending Trap 129
314 * sminfo_polling_timeout
315 * Specifies the polling timeout (in milliseconds) - the timeout
316 * between one poll to another.
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)
324 * The directory to be used for opensm-subnet.lst, opensm.fdbs,
325 * opensm.mcfdbs, and default log file (the latter for Windows,
329 * Name of the log file (or NULL) for stdout.
332 * This option defines maximal log file size in MB. When
333 * specified the log file will be truncated upon reaching
337 * Boolean that specifies whether the OpenSM QoS functionality
338 * should be off or on.
341 * Name of the QoS policy 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.
348 * port_prof_ignore_file
349 * Name of file with port guids to be ignored by port profiling.
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.
356 * Received traps will initiate a new sweep.
358 * routing_engine_names
359 * Name of routing engine(s) to use.
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)
367 * When TRUE enables unicast routing cache.
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
374 * Name of the unicast LFTs routing file from where switch
375 * forwarding tables will be loaded
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)
382 * Name of the file that contains list of compute node guids that
383 * will be used by fat-tree routing (provided by User)
386 * Name of the file that contains list of ids which should be
387 * used by Up/Down algorithm instead of node GUIDs
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).
394 * Name of the SA database file.
397 * If TRUE (default) - SM will exit on fatal subnet initialization
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.
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.
410 * OpenSM will run in daemon mode.
413 * OpenSM will start with SM in not active state.
415 * babbling_port_policy
416 * OpenSM will enforce its "babbling" port policy.
419 * Enable or disable the performance manager
422 * Enable or disable the saving of redirection by PerfMgr
424 * perfmgr_sweep_time_s
425 * Define the period (in seconds) of PerfMgr sweeps
428 * File to dump the event database to
431 * Specify the name of the event plugin
434 * Default set of QoS options
437 * QoS options for CA ports
440 * QoS options for switches' port 0
443 * QoS options for switches' external ports
446 * QoS options for router ports
449 * Enable high risk new features and not fully qualified
450 * hardware specific work arounds
453 * When TRUE disables clients reregistration request.
459 /****s* OpenSM: Subnet/osm_subn_t
464 * Subnet structure. Callers may directly access member components,
465 * after grabbing a lock.
468 * This structure should probably be volatile.
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;
489 struct osm_qos_policy *p_qos_policy;
490 uint16_t max_ucast_lid_ho;
491 uint16_t max_mcast_lid_ho;
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];
507 * Container of pointers to all Switch objects in the subent.
508 * Indexed by node GUID.
511 * Container of pointers to all Node objects in the subent.
512 * Indexed by node GUID.
515 * Container of pointers to all Port objects in the subent.
516 * Indexed by port GUID - network order!
519 * Container of pointers to all Router objects in the subent.
520 * Indexed by node GUID.
523 * Container of pointers to all Partition objects in the subnet.
527 * Container of pointers to SM objects representing other SMs
531 * Container of pointers to all Port objects in the subent.
532 * Indexed by port LID.
535 * The base LID owned by the subnet's master SM.
538 * The base LID of the local port where the SM is.
541 * This SM's own port GUID.
544 * The high-level state of the SM. This value is made available
545 * in the SMInfo attribute.
548 * Subnet options structure contains site specific configuration.
551 * Subnet QoS policy structure.
554 * The minimal max unicast lid reported by all switches
557 * The minimal max multicast lid reported by all switches
560 * The minimal MTU reported by all CAs ports on the subnet
563 * The minimal rate reported by all CA ports on the subnet
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.
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.
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.
588 * If TRUE - we want to force switches in the fabric to be
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
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
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.
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.
620 * This flag should be on during first non-master heavy
621 * (including pre-master discovery stage)
624 * Array of pointers to all Multicast Group objects in the subnet.
625 * Indexed by MLID offset from base MLID.
631 /****f* OpenSM: Subnet/osm_subn_construct
636 * This function constructs a Subnet object.
640 void osm_subn_construct(IN osm_subn_t * const p_subn);
644 * [in] Pointer to a Subnet object to construct.
647 * This function does not return a value.
650 * Allows calling osm_subn_init, and osm_subn_destroy.
652 * Calling osm_subn_construct is a prerequisite to calling any other
653 * method except osm_subn_init.
656 * Subnet object, osm_subn_init, osm_subn_destroy
659 /****f* OpenSM: Subnet/osm_subn_destroy
664 * The osm_subn_destroy function destroys a subnet, releasing
669 void osm_subn_destroy(IN osm_subn_t * const p_subn);
673 * [in] Pointer to a Subnet object to destroy.
676 * This function does not return a value.
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
685 * Subnet object, osm_subn_construct, osm_subn_init
688 /****f* OpenSM: Subnet/osm_subn_init
693 * The osm_subn_init function initializes a Subnet object for use.
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);
704 * [in] Pointer to an osm_subn_t object to initialize.
707 * [in] Pointer to the subnet options structure.
710 * IB_SUCCESS if the Subnet object was initialized successfully.
713 * Allows calling other Subnet methods.
716 * Subnet object, osm_subn_construct, osm_subn_destroy
729 /****f* OpenSM: Helper/osm_get_gid_by_mad_addr
731 * osm_get_gid_by_mad_addr
734 * Looks for the requester gid in the mad address.
736 * Note: This code is not thread safe. Need to grab the lock before
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);
749 * [in] Pointer to a log object.
752 * [in] Pointer to subnet object.
755 * [in] Pointer to mad address object.
758 * [out] Pointer to the GID structure to fill in.
761 * IB_SUCCESS if able to find the GID by address given.
768 /****f* OpenSM: Helper/osm_get_physp_by_mad_addr
770 * osm_get_physp_by_mad_addr
773 * Looks for the requester physical port in the mad address.
775 * Note: This code is not thread safe. Need to grab the lock before
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
787 * [in] Pointer to a log object.
790 * [in] Pointer to subnet object.
793 * [in] Pointer to mad address object.
796 * Pointer to requester physical port object if found. Null otherwise.
803 /****f* OpenSM: Helper/osm_get_port_by_mad_addr
805 * osm_get_port_by_mad_addr
808 * Looks for the requester port in the mad address.
810 * Note: This code is not thread safe. Need to grab the lock before
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);
821 * [in] Pointer to a log object.
824 * [in] Pointer to subnet object.
827 * [in] Pointer to mad address object.
830 * Pointer to requester port object if found. Null otherwise.
837 /****f* OpenSM: Subnet/osm_get_switch_by_guid
839 * osm_get_switch_by_guid
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
848 struct osm_switch *osm_get_switch_by_guid(IN const osm_subn_t * p_subn,
853 * [in] Pointer to an osm_subn_t object
856 * [in] The node guid in host order
859 * The switch structure pointer if found. NULL otherwise.
862 * Subnet object, osm_subn_construct, osm_subn_destroy,
866 /****f* OpenSM: Subnet/osm_get_node_by_guid
868 * osm_get_node_by_guid
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
877 struct osm_node *osm_get_node_by_guid(IN osm_subn_t const *p_subn,
882 * [in] Pointer to an osm_subn_t object
885 * [in] The node guid in host order
888 * The node structure pointer if found. NULL otherwise.
891 * Subnet object, osm_subn_construct, osm_subn_destroy,
895 /****f* OpenSM: Subnet/osm_get_port_by_guid
897 * osm_get_port_by_guid
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
906 struct osm_port *osm_get_port_by_guid(IN osm_subn_t const *p_subn,
911 * [in] Pointer to an osm_subn_t object
914 * [in] The port guid in network order
917 * The port structure pointer if found. NULL otherwise.
920 * Subnet object, osm_subn_construct, osm_subn_destroy,
924 /****f* OpenSM: Subnet/osm_get_mgrp_by_mlid
926 * osm_get_mgrp_by_mlid
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
936 struct osm_mgrp *osm_get_mgrp_by_mlid(osm_subn_t const *p_subn, ib_net16_t mlid)
938 return p_subn->mgroups[cl_ntoh16(mlid) - IB_LID_MCAST_START_HO];
943 * [in] Pointer to an osm_subn_t object
946 * [in] The multicast group mlid in network order
949 * The multicast group structure pointer if found. NULL otherwise.
952 /****f* OpenSM: Helper/osm_get_physp_by_mad_addr
954 * osm_get_physp_by_mad_addr
957 * Looks for the requester physical port in the mad address.
959 * Note: This code is not thread safe. Need to grab the lock before
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
971 * [in] Pointer to a log object.
974 * [in] Pointer to subnet object.
977 * [in] Pointer to mad address object.
980 * Pointer to requester physical port object if found. Null otherwise.
987 /****f* OpenSM: Subnet/osm_subn_set_default_opt
989 * osm_subn_set_default_opt
992 * The osm_subn_set_default_opt function sets the default options.
996 void osm_subn_set_default_opt(IN osm_subn_opt_t * const p_opt);
1001 * [in] Pointer to the subnet options structure.
1009 * Subnet object, osm_subn_construct, osm_subn_destroy
1012 /****f* OpenSM: Subnet/osm_subn_parse_conf_file
1014 * osm_subn_parse_conf_file
1017 * The osm_subn_parse_conf_file function parses the configuration file
1018 * and sets the defaults accordingly.
1022 int osm_subn_parse_conf_file(char *conf_file, osm_subn_opt_t * const p_opt);
1027 * [in] Pointer to the subnet options structure.
1030 * 0 on success, positive value if file doesn't exist,
1031 * negative value otherwise
1034 /****f* OpenSM: Subnet/osm_subn_rescan_conf_files
1036 * osm_subn_rescan_conf_files
1039 * The osm_subn_rescan_conf_files function parses the configuration
1040 * files and update selected subnet options
1044 int osm_subn_rescan_conf_files(IN osm_subn_t * const p_subn);
1049 * [in] Pointer to the subnet structure.
1052 * 0 on success, positive value if file doesn't exist,
1053 * negative value otherwise
1057 /****f* OpenSM: Subnet/osm_subn_output_conf
1059 * osm_subn_output_conf
1062 * Output configuration info
1066 int osm_subn_output_conf(FILE *out, IN osm_subn_opt_t * const p_opt);
1071 * [in] File stream to output to.
1074 * [in] Pointer to the subnet options structure.
1077 * 0 on success, negative value otherwise
1080 /****f* OpenSM: Subnet/osm_subn_write_conf_file
1082 * osm_subn_write_conf_file
1085 * Write the configuration file into the cache
1089 int osm_subn_write_conf_file(char *file_name, IN osm_subn_opt_t * const p_opt);
1094 * [in] Pointer to the subnet options structure.
1097 * 0 on success, negative value otherwise
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
1103 int osm_subn_verify_config(osm_subn_opt_t * const p_opt);
1106 #endif /* _OSM_SUBNET_H_ */