/* * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. * Copyright (c) 2002-2015 Mellanox Technologies LTD. All rights reserved. * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. * Copyright (c) 2008 Xsigo Systems Inc. All rights reserved. * Copyright (c) 2009 System Fabric Works, Inc. All rights reserved. * Copyright (c) 2009 HNR Consulting. All rights reserved. * Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2009-2015 ZIH, TU Dresden, Federal Republic of Germany. All rights reserved. * Copyright (C) 2012-2017 Tokyo Institute of Technology. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU * General Public License (GPL) Version 2, available from the file * COPYING in the main directory of this source tree, or the * OpenIB.org BSD license below: * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * - Redistributions of source code must retain the above * copyright notice, this list of conditions and the following * disclaimer. * * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials * provided with the distribution. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * */ /* * Abstract: * Declaration of osm_subn_t. * This object represents an IBA subnet. * This object is part of the OpenSM family of objects. */ #ifndef _OSM_SUBNET_H_ #define _OSM_SUBNET_H_ #include #include #include #include #include #include #include #include #include #include #ifdef __cplusplus # define BEGIN_C_DECLS extern "C" { # define END_C_DECLS } #else /* !__cplusplus */ # define BEGIN_C_DECLS # define END_C_DECLS #endif /* __cplusplus */ BEGIN_C_DECLS #define OSM_SUBNET_VECTOR_MIN_SIZE 0 #define OSM_SUBNET_VECTOR_GROW_SIZE 1 #define OSM_SUBNET_VECTOR_CAPACITY 256 #define OSM_PARTITION_ENFORCE_BOTH "both" #define OSM_PARTITION_ENFORCE_IN "in" #define OSM_PARTITION_ENFORCE_OUT "out" #define OSM_PARTITION_ENFORCE_OFF "off" typedef enum _osm_partition_enforce_type_enum { OSM_PARTITION_ENFORCE_TYPE_BOTH, OSM_PARTITION_ENFORCE_TYPE_IN, OSM_PARTITION_ENFORCE_TYPE_OUT, OSM_PARTITION_ENFORCE_TYPE_OFF } osm_partition_enforce_type_enum; /* XXX: not actual max, max we're currently going to support */ #define OSM_CCT_ENTRY_MAX 128 #define OSM_CCT_ENTRY_MAD_BLOCKS (OSM_CCT_ENTRY_MAX/64) struct osm_opensm; struct osm_qos_policy; /****h* OpenSM/Subnet * NAME * Subnet * * DESCRIPTION * The Subnet object encapsulates the information needed by the * OpenSM to manage a subnet. The OpenSM allocates one Subnet object * per IBA subnet. * * The Subnet object is not thread safe, thus callers must provide * serialization. * * This object is essentially a container for the various components * of a subnet. Callers may directly access the member variables. * * AUTHOR * Steve King, Intel * *********/ /****s* OpenSM: Subnet/osm_qos_options_t * NAME * osm_qos_options_t * * DESCRIPTION * Subnet QoS options structure. This structure contains the various * QoS specific configuration parameters for the subnet. * * SYNOPSIS */ typedef struct osm_qos_options { unsigned max_vls; int high_limit; char *vlarb_high; char *vlarb_low; char *sl2vl; } osm_qos_options_t; /* * FIELDS * * max_vls * The number of maximum VLs on the Subnet (0 == use default) * * high_limit * The limit of High Priority component of VL Arbitration * table (IBA 7.6.9) (-1 == use default) * * vlarb_high * High priority VL Arbitration table template. (NULL == use default) * * vlarb_low * Low priority VL Arbitration table template. (NULL == use default) * * sl2vl * SL2VL Mapping table (IBA 7.6.6) template. (NULL == use default) * *********/ /****s* OpenSM: Subnet/osm_cct_entry_t * NAME * osm_cct_entry_t * * DESCRIPTION * Subnet Congestion Control Table entry. See A10.2.2.1.1 for format details. * * SYNOPSIS */ typedef struct osm_cct_entry { uint8_t shift; //Alex: shift 2 bits uint16_t multiplier; //Alex multiplier 14 bits } osm_cct_entry_t; /* * FIELDS * * shift * shift field in CCT entry. See A10.2.2.1.1. * * multiplier * multiplier field in CCT entry. See A10.2.2.1.1. * *********/ /****s* OpenSM: Subnet/osm_cacongestion_entry_t * NAME * osm_cacongestion_entry_t * * DESCRIPTION * Subnet CA Congestion entry. See A10.4.3.8.4 for format details. * * SYNOPSIS */ typedef struct osm_cacongestion_entry { ib_net16_t ccti_timer; //Alex: ccti_timer and ccti_increase should be replaced uint8_t ccti_increase; uint8_t trigger_threshold; uint8_t ccti_min; } osm_cacongestion_entry_t; /* * FIELDS * * ccti_timer * CCTI Timer * * ccti_increase * CCTI Increase * * trigger_threshold * CCTI trigger for log message * * ccti_min * CCTI Minimum * *********/ /****s* OpenSM: Subnet/osm_cct_t * NAME * osm_cct_t * * DESCRIPTION * Subnet CongestionControlTable. See A10.4.3.9 for format details. * * SYNOPSIS */ typedef struct osm_cct { osm_cct_entry_t entries[OSM_CCT_ENTRY_MAX]; unsigned int entries_len; char *input_str; } osm_cct_t; /* * FIELDS * * entries * Entries in CCT * * entries_len * Length of entries * * input_str * Original str input * *********/ /****s* OpenSM: Subnet/osm_subn_opt_t * NAME * osm_subn_opt_t * * DESCRIPTION * Subnet options structure. This structure contains the various * site specific configuration parameters for the subnet. * * SYNOPSIS */ typedef struct osm_subn_opt { const char *config_file; ib_net64_t guid; ib_net64_t m_key; ib_net64_t sm_key; ib_net64_t sa_key; ib_net64_t subnet_prefix; ib_net16_t m_key_lease_period; uint8_t m_key_protect_bits; boolean_t m_key_lookup; uint32_t sweep_interval; uint32_t max_wire_smps; uint32_t max_wire_smps2; uint32_t max_smps_timeout; uint32_t transaction_timeout; uint32_t transaction_retries; uint32_t long_transaction_timeout; uint8_t sm_priority; uint8_t lmc; boolean_t lmc_esp0; uint8_t max_op_vls; uint8_t force_link_speed; uint8_t force_link_speed_ext; uint8_t force_link_width; uint8_t fdr10; boolean_t reassign_lids; boolean_t ignore_other_sm; boolean_t single_thread; boolean_t disable_multicast; boolean_t force_log_flush; uint8_t subnet_timeout; uint8_t packet_life_time; uint8_t vl_stall_count; uint8_t leaf_vl_stall_count; uint8_t head_of_queue_lifetime; uint8_t leaf_head_of_queue_lifetime; uint8_t local_phy_errors_threshold; uint8_t overrun_errors_threshold; boolean_t use_mfttop; uint32_t sminfo_polling_timeout; uint32_t polling_retry_number; uint32_t max_msg_fifo_timeout; boolean_t force_heavy_sweep; uint8_t log_flags; char *dump_files_dir; char *log_file; uint32_t log_max_size; char *partition_config_file; boolean_t no_partition_enforcement; char *part_enforce; osm_partition_enforce_type_enum part_enforce_enum; boolean_t allow_both_pkeys; boolean_t keep_pkey_indexes; uint8_t sm_assigned_guid; boolean_t qos; char *qos_policy_file; boolean_t suppress_sl2vl_mad_status_errors; boolean_t accum_log_file; char *console; uint16_t console_port; char *port_prof_ignore_file; char *hop_weights_file; char *port_search_ordering_file; boolean_t port_profile_switch_nodes; boolean_t sweep_on_trap; char *routing_engine_names; boolean_t avoid_throttled_links; boolean_t use_ucast_cache; boolean_t connect_roots; char *lid_matrix_dump_file; char *lfts_file; char *root_guid_file; char *cn_guid_file; char *io_guid_file; boolean_t port_shifting; uint32_t scatter_ports; uint16_t max_reverse_hops; char *ids_guid_file; char *guid_routing_order_file; boolean_t guid_routing_order_no_scatter; char *sa_db_file; boolean_t sa_db_dump; char *torus_conf_file; boolean_t do_mesh_analysis; boolean_t exit_on_fatal; boolean_t honor_guid2lid_file; boolean_t daemon; boolean_t sm_inactive; boolean_t babbling_port_policy; boolean_t drop_event_subscriptions; boolean_t ipoib_mcgroup_creation_validation; boolean_t mcgroup_join_validation; boolean_t use_original_extended_sa_rates_only; boolean_t use_optimized_slvl; boolean_t fsync_high_avail_files; osm_qos_options_t qos_options; osm_qos_options_t qos_ca_options; osm_qos_options_t qos_sw0_options; osm_qos_options_t qos_swe_options; osm_qos_options_t qos_rtr_options; boolean_t congestion_control; ib_net64_t cc_key; uint32_t cc_max_outstanding_mads; ib_net32_t cc_sw_cong_setting_control_map; uint8_t cc_sw_cong_setting_victim_mask[IB_CC_PORT_MASK_DATA_SIZE]; uint8_t cc_sw_cong_setting_credit_mask[IB_CC_PORT_MASK_DATA_SIZE]; uint8_t cc_sw_cong_setting_threshold; uint8_t cc_sw_cong_setting_packet_size; uint8_t cc_sw_cong_setting_credit_starvation_threshold; osm_cct_entry_t cc_sw_cong_setting_credit_starvation_return_delay; ib_net16_t cc_sw_cong_setting_marking_rate; ib_net16_t cc_ca_cong_setting_port_control; ib_net16_t cc_ca_cong_setting_control_map; osm_cacongestion_entry_t cc_ca_cong_entries[IB_CA_CONG_ENTRY_DATA_SIZE]; osm_cct_t cc_cct; boolean_t enable_quirks; boolean_t no_clients_rereg; #ifdef ENABLE_OSM_PERF_MGR boolean_t perfmgr; boolean_t perfmgr_redir; uint16_t perfmgr_sweep_time_s; uint32_t perfmgr_max_outstanding_queries; boolean_t perfmgr_ignore_cas; char *event_db_dump_file; int perfmgr_rm_nodes; boolean_t perfmgr_log_errors; boolean_t perfmgr_query_cpi; boolean_t perfmgr_xmit_wait_log; uint32_t perfmgr_xmit_wait_threshold; #endif /* ENABLE_OSM_PERF_MGR */ char *event_plugin_name; char *event_plugin_options; char *node_name_map_name; char *prefix_routes_file; char *log_prefix; boolean_t consolidate_ipv6_snm_req; struct osm_subn_opt *file_opts; /* used for update */ uint8_t lash_start_vl; /* starting vl to use in lash */ uint8_t sm_sl; /* which SL to use for SM/SA communication */ uint8_t nue_max_num_vls; /* maximum #VLs to use in nue */ boolean_t nue_include_switches; /* control how nue treats switches */ char *per_module_logging_file; boolean_t quasi_ftree_indexing; } osm_subn_opt_t; /* * FIELDS * * config_file * The name of the config file. * * guid * The port guid that the SM is binding to. * * m_key * M_Key value sent to all ports qualifying all Set(PortInfo). * * sm_key * SM_Key value of the SM used for SM authentication. * * sa_key * SM_Key value to qualify rcv SA queries as "trusted". * * subnet_prefix * Subnet prefix used on this subnet. * * m_key_lease_period * The lease period used for the M_Key on this subnet. * * sweep_interval * The number of seconds between subnet sweeps. A value of 0 * disables sweeping. * * max_wire_smps * The maximum number of SMPs sent in parallel. Default is 4. * * max_wire_smps2 * The maximum number of timeout SMPs allowed to be outstanding. * Default is same as max_wire_smps which disables the timeout * mechanism. * * max_smps_timeout * The wait time in usec for timeout based SMPs. Default is * timeout * retries. * * transaction_timeout * The maximum time in milliseconds allowed for a transaction * to complete. Default is 200. * * transaction_retries * The number of retries for a transaction. Default is 3. * * long_transaction_timeout * The maximum time in milliseconds allowed for "long" transaction * to complete. Default is 500. * * sm_priority * The priority of this SM as specified by the user. This * value is made available in the SMInfo attribute. * * lmc * The LMC value used on this subnet. * * lmc_esp0 * Whether LMC value used on subnet should be used for * enhanced switch port 0 or not. If TRUE, it is used. * Otherwise (the default), LMC is set to 0 for ESP0. * * max_op_vls * Limit the maximal operational VLs. default is 1. * * reassign_lids * If TRUE cause all lids to be re-assigend. * Otherwise (the default), * OpenSM always tries to preserve as LIDs as much as possible. * * ignore_other_sm_option * This flag is TRUE if other SMs on the subnet should be ignored. * * disable_multicast * This flag is TRUE if OpenSM should disable multicast support. * * max_msg_fifo_timeout * The maximal time a message can stay in the incoming message * queue. If there is more than one message in the queue and the * last message stayed in the queue more than this value the SA * request will be immediately returned with a BUSY status. * * subnet_timeout * The subnet_timeout that will be set for all the ports in the * design SubnSet(PortInfo.vl_stall_life)) * * vl_stall_count * The number of sequential packets dropped that cause the port * to enter the VLStalled state. * * leaf_vl_stall_count * The number of sequential packets dropped that cause the port * to enter the VLStalled state. This is for switch ports driving * a CA or router port. * * head_of_queue_lifetime * The maximal time a packet can live at the head of a VL queue * on any port not driving a CA or router port. * * leaf_head_of_queue_lifetime * The maximal time a packet can live at the head of a VL queue * on switch ports driving a CA or router. * * local_phy_errors_threshold * Threshold of local phy errors for sending Trap 129 * * overrun_errors_threshold * Threshold of credits overrun errors for sending Trap 129 * * sminfo_polling_timeout * Specifies the polling timeout (in milliseconds) - the timeout * between one poll to another. * * packet_life_time * The maximal time a packet can stay in a switch. * The value is send to all switches as * SubnSet(SwitchInfo.life_state) * * dump_files_dir * The directory to be used for opensm-subnet.lst, opensm.fdbs, * opensm.mcfdbs, and default log file (the latter for Windows, * not Linux). * * log_file * Name of the log file (or NULL) for stdout. * * log_max_size * This option defines maximal log file size in MB. When * specified the log file will be truncated upon reaching * this limit. * * qos * Boolean that specifies whether the OpenSM QoS functionality * should be off or on. * * qos_policy_file * Name of the QoS policy file. * * accum_log_file * If TRUE (default) - the log file will be accumulated. * If FALSE - the log file will be erased before starting * current opensm run. * * port_prof_ignore_file * Name of file with port guids to be ignored by port profiling. * * port_profile_switch_nodes * If TRUE will count the number of switch nodes routed through * the link. If FALSE - only CA/RT nodes are counted. * * sweep_on_trap * Received traps will initiate a new sweep. * * routing_engine_names * Name of routing engine(s) to use. * * avoid_throttled_links * This option will enforce that throttled switch-to-switch links * in the fabric are treated as 'broken' by the routing engines * (if they support it), and hence no path is assigned to these * underperforming links and a warning is logged instead. * * connect_roots * The option which will enforce root to root connectivity with * up/down and fat-tree routing engines (even if this violates * "pure" deadlock free up/down or fat-tree algorithm) * * use_ucast_cache * When TRUE enables unicast routing cache. * * lid_matrix_dump_file * Name of the lid matrix dump file from where switch * lid matrices (min hops tables) will be loaded * * lfts_file * Name of the unicast LFTs routing file from where switch * forwarding tables will be loaded * * root_guid_file * Name of the file that contains list of root guids that * will be used by fat-tree or up/dn routing (provided by User) * * cn_guid_file * Name of the file that contains list of compute node guids that * will be used by fat-tree routing (provided by User) * * io_guid_file * Name of the file that contains list of I/O node guids that * will be used by fat-tree routing (provided by User) * * port_shifting * This option will turn on port_shifting in routing. * * ids_guid_file * Name of the file that contains list of ids which should be * used by Up/Down algorithm instead of node GUIDs * * guid_routing_order_file * Name of the file that contains list of guids for routing order * that will be used by minhop and up/dn routing (provided by User). * * sa_db_file * Name of the SA database file. * * sa_db_dump * When TRUE causes OpenSM to dump SA DB at the end of every * light sweep regardless the current verbosity level. * * torus_conf_file * Name of the file with extra configuration info for torus-2QoS * routing engine. * * exit_on_fatal * If TRUE (default) - SM will exit on fatal subnet initialization * issues. * If FALSE - SM will not exit. * Fatal initialization issues: * a. SM recognizes 2 different nodes with the same guid, or * 12x link with lane reversal badly configured. * * honor_guid2lid_file * Always honor the guid2lid file if it exists and is valid. This * means that the file will be honored when SM is coming out of * STANDBY. By default this is FALSE. * * daemon * OpenSM will run in daemon mode. * * sm_inactive * OpenSM will start with SM in not active state. * * babbling_port_policy * OpenSM will enforce its "babbling" port policy. * * drop_event_subscriptions * OpenSM will drop event subscriptions if the port goes away. * * ipoib_mcgroup_creation_validation * OpenSM will validate IPoIB non-broadcast group parameters * against IPoIB broadcast group. * * mcgroup_join_validation * OpenSM will validate multicast join parameters against * multicast group parameters when MC group already exists. * * use_original_extended_sa_rates_only * Use only original extended SA rates (up through 300 Gbps * for 12x EDR). Option is needed for subnets with * old kernels/drivers that don't understand the * new SA rates for 2x link width and/or HDR link speed (19-22). * * use_optimized_slvl * Use optimized SLtoVLMappingTable programming if * device indicates it supports this. * * fsync_high_avail_files * Synchronize high availability in memory files * with storage. * * perfmgr * Enable or disable the performance manager * * perfmgr_redir * Enable or disable the saving of redirection by PerfMgr * * perfmgr_sweep_time_s * Define the period (in seconds) of PerfMgr sweeps * * event_db_dump_file * File to dump the event database to * * event_plugin_name * Specify the name(s) of the event plugin(s) * * event_plugin_options * Options string that would be passed to the plugin(s) * * qos_options * Default set of QoS options * * qos_ca_options * QoS options for CA ports * * qos_sw0_options * QoS options for switches' port 0 * * qos_swe_options * QoS options for switches' external ports * * qos_rtr_options * QoS options for router ports * * congestion_control * Boolean that specifies whether OpenSM congestion control configuration * should be off or no. * * cc_key * CCkey to use when configuring congestion control. * * cc_max_outstanding_mads * Max number of outstanding CC mads that can be on the wire. * * cc_sw_cong_setting_control_map * Congestion Control Switch Congestion Setting Control Map * configuration setting. * * cc_sw_cong_setting_victim_mask * Congestion Control Switch Congestion Setting Victim Mask * configuration setting. * * cc_sw_cong_setting_credit_mask * Congestion Control Switch Congestion Setting Credit Mask * configuration setting. * * cc_sw_cong_setting_threshold * Congestion Control Switch Congestion Setting Threshold * configuration setting. * * cc_sw_cong_setting_packet_size * Congestion Control Switch Congestion Setting Packet Size * configuration setting. * * cc_sw_cong_setting_credit_starvation_threshold * Congestion Control Switch Congestion Setting Credit Starvation Threshold * configuration setting. * * cc_sw_cong_setting_credit_starvation_return_delay * Congestion Control Switch Congestion Setting Credit Starvation Return Delay * configuration setting. * * cc_sw_cong_setting_marking_rate * Congestion Control Switch Congestion Setting Marking Rate * configuration setting. * * cc_ca_cong_setting_port_control * Congestion Control CA Congestion Setting Port Control * * cc_ca_cong_setting_control_map * Congestion Control CA Congestion Setting Control Map * cc_ca_cong_entries * Congestion Control CA Congestion Setting Entries * * cc_cct * Congestion Control Table array of entries * * enable_quirks * Enable high risk new features and not fully qualified * hardware specific work arounds * * no_clients_rereg * When TRUE disables clients reregistration request * * scatter_ports * When not zero, randomize best possible ports chosen * for a route. The value is used as a random key seed. * * per_module_logging_file * File name of per module logging configuration. * * SEE ALSO * Subnet object *********/ /****s* OpenSM: Subnet/osm_subn_t * NAME * osm_subn_t * * DESCRIPTION * Subnet structure. Callers may directly access member components, * after grabbing a lock. * * TO DO * This structure should probably be volatile. * * SYNOPSIS */ typedef struct osm_subn { struct osm_opensm *p_osm; cl_qmap_t sw_guid_tbl; cl_qmap_t node_guid_tbl; cl_qmap_t port_guid_tbl; cl_qmap_t alias_port_guid_tbl; cl_qmap_t assigned_guids_tbl; cl_qmap_t rtr_guid_tbl; cl_qlist_t prefix_routes_list; cl_qmap_t prtn_pkey_tbl; cl_qmap_t sm_guid_tbl; cl_qlist_t sa_sr_list; cl_qlist_t sa_infr_list; cl_qlist_t alias_guid_list; cl_ptr_vector_t port_lid_tbl; ib_net16_t master_sm_base_lid; ib_net16_t sm_base_lid; ib_net64_t sm_port_guid; uint8_t last_sm_port_state; uint8_t sm_state; osm_subn_opt_t opt; struct osm_qos_policy *p_qos_policy; uint16_t max_ucast_lid_ho; uint16_t max_mcast_lid_ho; uint8_t min_ca_mtu; uint8_t min_ca_rate; uint8_t min_data_vls; uint8_t min_sw_data_vls; boolean_t ignore_existing_lfts; boolean_t subnet_initialization_error; boolean_t force_heavy_sweep; boolean_t force_reroute; boolean_t in_sweep_hop_0; boolean_t force_first_time_master_sweep; boolean_t first_time_master_sweep; boolean_t coming_out_of_standby; boolean_t sweeping_enabled; unsigned need_update; cl_fmap_t mgrp_mgid_tbl; osm_db_domain_t *p_g2m; osm_db_domain_t *p_neighbor; void *mboxes[IB_LID_MCAST_END_HO - IB_LID_MCAST_START_HO + 1]; } osm_subn_t; /* * FIELDS * sw_guid_tbl * Container of pointers to all Switch objects in the subnet. * Indexed by node GUID. * * node_guid_tbl * Container of pointers to all Node objects in the subnet. * Indexed by node GUID. * * port_guid_tbl * Container of pointers to all Port objects in the subnet. * Indexed by port GUID. * * rtr_guid_tbl * Container of pointers to all Router objects in the subnet. * Indexed by node GUID. * * prtn_pkey_tbl * Container of pointers to all Partition objects in the subnet. * Indexed by P_KEY. * * sm_guid_tbl * Container of pointers to SM objects representing other SMs * on the subnet. * * port_lid_tbl * Container of pointers to all Port objects in the subnet. * Indexed by port LID. * * master_sm_base_lid * The base LID owned by the subnet's master SM. * * sm_base_lid * The base LID of the local port where the SM is. * * sm_port_guid * This SM's own port GUID. * * last_sm_port_state * Last state of this SM's port. * 0 is down and 1 is up. * * sm_state * The high-level state of the SM. This value is made available * in the SMInfo attribute. * * opt * Subnet options structure contains site specific configuration. * * p_qos_policy * Subnet QoS policy structure. * * max_ucast_lid_ho * The minimal max unicast lid reported by all switches * * max_mcast_lid_ho * The minimal max multicast lid reported by all switches * * min_ca_mtu * The minimal MTU reported by all CAs ports on the subnet * * min_ca_rate * The minimal rate reported by all CA ports on the subnet * * ignore_existing_lfts * This flag is a dynamic flag to instruct the LFT assignment to * ignore existing legal LFT settings. * The value will be set according to : * - Any change to the list of switches will set it to high * - Coming out of STANDBY it will be cleared (other SM worked) * - Set to FALSE upon end of all lft assignments. * * subnet_initalization_error * Similar to the force_heavy_sweep flag. If TRUE - means that * we had errors during initialization (due to SubnSet requests * that failed). We want to declare the subnet as unhealthy, and * force another heavy sweep. * * force_heavy_sweep * If TRUE - we want to force a heavy sweep. This can be done * either due to receiving of trap - meaning there is some change * on the subnet, or we received a handover from a remote sm. * In this case we want to sweep and reconfigure the entire * subnet. This will cause another heavy sweep to occure when * the current sweep is done. * * force_reroute * If TRUE - we want to force switches in the fabric to be * rerouted. * * in_sweep_hop_0 * When in_sweep_hop_0 flag is set to TRUE - this means we are * in sweep_hop_0 - meaning we do not want to continue beyond * the current node. * This is relevant for the case of SM on switch, since in the * switch info we need to signal somehow not to continue * the sweeping. * * force_first_time_master_sweep * This flag is used to avoid race condition when Master SM being * in the middle of very long configuration stage of the heavy sweep, * receives HANDOVER from another MASTER SM. When the current heavy sweep * is finished, new heavy sweep will be started immediately. * At the beginning of the sweep, opensm will set first_time_master_sweep, * force_heavy_sweep and coming_out_of_standby flags in order to allow full * reconfiguration of the fabric. This is required as another MASTER SM could * change configuration of the fabric before sending HANDOVER to MASTER SM. * * first_time_master_sweep * This flag is used for the PortInfo setting. On the first * sweep as master (meaning after moving from Standby|Discovering * state), the SM must send a PortInfoSet to all ports. After * that - we want to minimize the number of PortInfoSet requests * sent, and to send only requests that change the value from * what is updated in the port (or send a first request if this * is a new port). We will set this flag to TRUE when entering * the master state, and set it back to FALSE at the end of the * drop manager. This is done since at the end of the drop manager * we have updated all the ports that are reachable, and from now * on these are the only ports we have data of. We don't want * to send extra set requests to these ports anymore. * * coming_out_of_standby * TRUE on the first sweep after the SM was in standby. * Used for nulling any cache of LID and Routing. * The flag is set true if the SM state was standby and now * changed to MASTER it is reset at the end of the sweep. * * sweeping_enabled * FALSE - sweeping is administratively disabled, all * sweeping is inhibited, TRUE - sweeping is done * normally * * need_update * This flag should be on during first non-master heavy * (including pre-master discovery stage) * * mgrp_mgid_tbl * Container of pointers to all Multicast group objects in * the subnet. Indexed by MGID. * * mboxes * Array of pointers to all Multicast MLID box objects in the * subnet. Indexed by MLID offset from base MLID. * * SEE ALSO * Subnet object *********/ /****s* OpenSM: Subnet/osm_assigned_guids_t * NAME * osm_assigned_guids_t * * DESCRIPTION * SA assigned GUIDs structure. * * SYNOPSIS */ typedef struct osm_assigned_guids { cl_map_item_t map_item; ib_net64_t port_guid; ib_net64_t assigned_guid[1]; } osm_assigned_guids_t; /* * FIELDS * map_item * Linkage structure for cl_qmap. MUST BE FIRST MEMBER! * * port_guid * Base port GUID. * * assigned_guids * Table of persistent SA assigned GUIDs. * * SEE ALSO * Subnet object *********/ /****f* OpenSM: Subnet/osm_subn_construct * NAME * osm_subn_construct * * DESCRIPTION * This function constructs a Subnet object. * * SYNOPSIS */ void osm_subn_construct(IN osm_subn_t * p_subn); /* * PARAMETERS * p_subn * [in] Pointer to a Subnet object to construct. * * RETURN VALUE * This function does not return a value. * * NOTES * Allows calling osm_subn_init, and osm_subn_destroy. * * Calling osm_subn_construct is a prerequisite to calling any other * method except osm_subn_init. * * SEE ALSO * Subnet object, osm_subn_init, osm_subn_destroy *********/ /****f* OpenSM: Subnet/osm_subn_destroy * NAME * osm_subn_destroy * * DESCRIPTION * The osm_subn_destroy function destroys a subnet, releasing * all resources. * * SYNOPSIS */ void osm_subn_destroy(IN osm_subn_t * p_subn); /* * PARAMETERS * p_subn * [in] Pointer to a Subnet object to destroy. * * RETURN VALUE * This function does not return a value. * * NOTES * Performs any necessary cleanup of the specified Subnet object. * Further operations should not be attempted on the destroyed object. * This function should only be called after a call to osm_subn_construct * or osm_subn_init. * * SEE ALSO * Subnet object, osm_subn_construct, osm_subn_init *********/ /****f* OpenSM: Subnet/osm_subn_init * NAME * osm_subn_init * * DESCRIPTION * The osm_subn_init function initializes a Subnet object for use. * * SYNOPSIS */ ib_api_status_t osm_subn_init(IN osm_subn_t * p_subn, IN struct osm_opensm *p_osm, IN const osm_subn_opt_t * p_opt); /* * PARAMETERS * p_subn * [in] Pointer to an osm_subn_t object to initialize. * * p_opt * [in] Pointer to the subnet options structure. * * RETURN VALUES * IB_SUCCESS if the Subnet object was initialized successfully. * * NOTES * Allows calling other Subnet methods. * * SEE ALSO * Subnet object, osm_subn_construct, osm_subn_destroy *********/ /* Forward references. */ struct osm_mad_addr; struct osm_log; struct osm_switch; struct osm_physp; struct osm_port; struct osm_mgrp; /****f* OpenSM: Helper/osm_get_gid_by_mad_addr * NAME * osm_get_gid_by_mad_addr * * DESCRIPTION * Looks for the requester gid in the mad address. * * Note: This code is not thread safe. Need to grab the lock before * calling it. * * SYNOPSIS */ ib_api_status_t osm_get_gid_by_mad_addr(IN struct osm_log *p_log, IN const osm_subn_t * p_subn, IN struct osm_mad_addr *p_mad_addr, OUT ib_gid_t * p_gid); /* * PARAMETERS * p_log * [in] Pointer to a log object. * * p_subn * [in] Pointer to subnet object. * * p_mad_addr * [in] Pointer to mad address object. * * p_gid * [out] Pointer to the GID structure to fill in. * * RETURN VALUES * IB_SUCCESS if able to find the GID by address given. * * NOTES * * SEE ALSO *********/ /****f* OpenSM: Helper/osm_get_physp_by_mad_addr * NAME * osm_get_physp_by_mad_addr * * DESCRIPTION * Looks for the requester physical port in the mad address. * * Note: This code is not thread safe. Need to grab the lock before * calling it. * * SYNOPSIS */ struct osm_physp *osm_get_physp_by_mad_addr(IN struct osm_log *p_log, IN const osm_subn_t * p_subn, IN struct osm_mad_addr *p_mad_addr); /* * PARAMETERS * p_log * [in] Pointer to a log object. * * p_subn * [in] Pointer to subnet object. * * p_mad_addr * [in] Pointer to mad address object. * * RETURN VALUES * Pointer to requester physical port object if found. Null otherwise. * * NOTES * * SEE ALSO *********/ /****f* OpenSM: Helper/osm_get_port_by_mad_addr * NAME * osm_get_port_by_mad_addr * * DESCRIPTION * Looks for the requester port in the mad address. * * Note: This code is not thread safe. Need to grab the lock before * calling it. * * SYNOPSIS */ struct osm_port *osm_get_port_by_mad_addr(IN struct osm_log *p_log, IN const osm_subn_t * p_subn, IN struct osm_mad_addr *p_mad_addr); /* * PARAMETERS * p_log * [in] Pointer to a log object. * * p_subn * [in] Pointer to subnet object. * * p_mad_addr * [in] Pointer to mad address object. * * RETURN VALUES * Pointer to requester port object if found. Null otherwise. * * NOTES * * SEE ALSO *********/ /****f* OpenSM: Subnet/osm_get_switch_by_guid * NAME * osm_get_switch_by_guid * * DESCRIPTION * Looks for the given switch guid in the subnet table of switches by guid. * NOTE: this code is not thread safe. Need to grab the lock before * calling it. * * SYNOPSIS */ struct osm_switch *osm_get_switch_by_guid(IN const osm_subn_t * p_subn, IN ib_net64_t guid); /* * PARAMETERS * p_subn * [in] Pointer to an osm_subn_t object * * guid * [in] The node guid in network byte order * * RETURN VALUES * The switch structure pointer if found. NULL otherwise. * * SEE ALSO * Subnet object, osm_subn_construct, osm_subn_destroy, * osm_switch_t *********/ /****f* OpenSM: Subnet/osm_get_node_by_guid * NAME * osm_get_node_by_guid * * DESCRIPTION * This looks for the given node guid in the subnet table of nodes by guid. * NOTE: this code is not thread safe. Need to grab the lock before * calling it. * * SYNOPSIS */ struct osm_node *osm_get_node_by_guid(IN osm_subn_t const *p_subn, IN ib_net64_t guid); /* * PARAMETERS * p_subn * [in] Pointer to an osm_subn_t object * * guid * [in] The node guid in network byte order * * RETURN VALUES * The node structure pointer if found. NULL otherwise. * * SEE ALSO * Subnet object, osm_subn_construct, osm_subn_destroy, * osm_node_t *********/ /****f* OpenSM: Subnet/osm_get_port_by_guid * NAME * osm_get_port_by_guid * * DESCRIPTION * This looks for the given port guid in the subnet table of ports by guid. * NOTE: this code is not thread safe. Need to grab the lock before * calling it. * * SYNOPSIS */ struct osm_port *osm_get_port_by_guid(IN osm_subn_t const *p_subn, IN ib_net64_t guid); /* * PARAMETERS * p_subn * [in] Pointer to an osm_subn_t object * * guid * [in] The port guid in network order * * RETURN VALUES * The port structure pointer if found. NULL otherwise. * * SEE ALSO * Subnet object, osm_subn_construct, osm_subn_destroy, * osm_port_t *********/ /****f* OpenSM: Port/osm_get_port_by_lid_ho * NAME * osm_get_port_by_lid_ho * * DESCRIPTION * Returns a pointer of the port object for given lid value. * * SYNOPSIS */ struct osm_port *osm_get_port_by_lid_ho(const osm_subn_t * subn, uint16_t lid); /* * PARAMETERS * subn * [in] Pointer to the subnet data structure. * * lid * [in] LID requested in host byte order. * * RETURN VALUES * The port structure pointer if found. NULL otherwise. * * SEE ALSO * Subnet object, osm_port_t *********/ /****f* OpenSM: Subnet/osm_get_alias_guid_by_guid * NAME * osm_get_alias_guid_by_guid * * DESCRIPTION * This looks for the given port guid in the subnet table of ports by * alias guid. * NOTE: this code is not thread safe. Need to grab the lock before * calling it. * * SYNOPSIS */ struct osm_alias_guid *osm_get_alias_guid_by_guid(IN osm_subn_t const *p_subn, IN ib_net64_t guid); /* * PARAMETERS * p_subn * [in] Pointer to an osm_subn_t object * * guid * [in] The alias port guid in network order * * RETURN VALUES * The alias guid structure pointer if found. NULL otherwise. * * SEE ALSO * Subnet object, osm_subn_construct, osm_subn_destroy, * osm_alias_guid_t *********/ /****f* OpenSM: Subnet/osm_get_port_by_alias_guid * NAME * osm_get_port_by_alias_guid * * DESCRIPTION * This looks for the given port guid in the subnet table of ports by * alias guid. * NOTE: this code is not thread safe. Need to grab the lock before * calling it. * * SYNOPSIS */ struct osm_port *osm_get_port_by_alias_guid(IN osm_subn_t const *p_subn, IN ib_net64_t guid); /* * PARAMETERS * p_subn * [in] Pointer to an osm_subn_t object * * guid * [in] The alias port guid in network order * * RETURN VALUES * The port structure pointer if found. NULL otherwise. * * SEE ALSO * Subnet object, osm_subn_construct, osm_subn_destroy, * osm_port_t *********/ /****f* OpenSM: Port/osm_assigned_guids_new * NAME * osm_assigned_guids_new * * DESCRIPTION * This function allocates and initializes an assigned guids object. * * SYNOPSIS */ osm_assigned_guids_t *osm_assigned_guids_new(IN const ib_net64_t port_guid, IN const uint32_t num_guids); /* * PARAMETERS * port_guid * [in] Base port GUID in network order * * RETURN VALUE * Pointer to the initialized assigned alias guid object. * * SEE ALSO * Subnet object, osm_assigned_guids_t, osm_assigned_guids_delete, * osm_get_assigned_guids_by_guid *********/ /****f* OpenSM: Port/osm_assigned_guids_delete * NAME * osm_assigned_guids_delete * * DESCRIPTION * This function destroys and deallocates an assigned guids object. * * SYNOPSIS */ void osm_assigned_guids_delete(IN OUT osm_assigned_guids_t ** pp_assigned_guids); /* * PARAMETERS * pp_assigned_guids * [in][out] Pointer to a pointer to an assigned guids object to delete. * On return, this pointer is NULL. * * RETURN VALUE * This function does not return a value. * * NOTES * Performs any necessary cleanup of the specified assigned guids object. * * SEE ALSO * Subnet object, osm_assigned_guids_new, osm_get_assigned_guids_by_guid *********/ /****f* OpenSM: Subnet/osm_get_assigned_guids_by_guid * NAME * osm_get_assigned_guids_by_guid * * DESCRIPTION * This looks for the given port guid and returns a pointer * to the guid table of SA assigned alias guids for that port. * * SYNOPSIS */ osm_assigned_guids_t *osm_get_assigned_guids_by_guid(IN osm_subn_t const *p_subn, IN ib_net64_t port_guid); /* * PARAMETERS * p_subn * [in] Pointer to an osm_subn_t object * * port_guid * [in] The base port guid in network order * * RETURN VALUES * The osm_assigned_guids structure pointer if found. NULL otherwise. * * SEE ALSO * Subnet object, osm_assigned_guids_new, osm_assigned_guids_delete, * osm_assigned_guids_t *********/ /****f* OpenSM: Port/osm_get_port_by_lid * NAME * osm_get_port_by_lid * * DESCRIPTION * Returns a pointer of the port object for given lid value. * * SYNOPSIS */ static inline struct osm_port *osm_get_port_by_lid(IN osm_subn_t const * subn, IN ib_net16_t lid) { return osm_get_port_by_lid_ho(subn, cl_ntoh16(lid)); } /* * PARAMETERS * subn * [in] Pointer to the subnet data structure. * * lid * [in] LID requested in network byte order. * * RETURN VALUES * The port structure pointer if found. NULL otherwise. * * SEE ALSO * Subnet object, osm_port_t *********/ /****f* OpenSM: Subnet/osm_get_mgrp_by_mgid * NAME * osm_get_mgrp_by_mgid * * DESCRIPTION * This looks for the given multicast group in the subnet table by mgid. * NOTE: this code is not thread safe. Need to grab the lock before * calling it. * * SYNOPSIS */ struct osm_mgrp *osm_get_mgrp_by_mgid(IN osm_subn_t * subn, IN ib_gid_t * mgid); /* * PARAMETERS * subn * [in] Pointer to an osm_subn_t object * * mgid * [in] The multicast group MGID value * * RETURN VALUES * The multicast group structure pointer if found. NULL otherwise. *********/ /****f* OpenSM: Subnet/osm_get_mbox_by_mlid * NAME * osm_get_mbox_by_mlid * * DESCRIPTION * This looks for the given multicast group in the subnet table by mlid. * NOTE: this code is not thread safe. Need to grab the lock before * calling it. * * SYNOPSIS */ static inline struct osm_mgrp_box *osm_get_mbox_by_mlid(osm_subn_t const *p_subn, ib_net16_t mlid) { return (struct osm_mgrp_box *)p_subn->mboxes[cl_ntoh16(mlid) - IB_LID_MCAST_START_HO]; } /* * PARAMETERS * p_subn * [in] Pointer to an osm_subn_t object * * mlid * [in] The multicast group mlid in network order * * RETURN VALUES * The multicast group structure pointer if found. NULL otherwise. *********/ int is_mlnx_ext_port_info_supported(ib_net32_t vendid, ib_net16_t devid); /****f* OpenSM: Subnet/osm_subn_set_default_opt * NAME * osm_subn_set_default_opt * * DESCRIPTION * The osm_subn_set_default_opt function sets the default options. * * SYNOPSIS */ void osm_subn_set_default_opt(IN osm_subn_opt_t * p_opt); /* * PARAMETERS * * p_opt * [in] Pointer to the subnet options structure. * * RETURN VALUES * None * * NOTES * * SEE ALSO * Subnet object, osm_subn_construct, osm_subn_destroy *********/ /****f* OpenSM: Subnet/osm_subn_parse_conf_file * NAME * osm_subn_parse_conf_file * * DESCRIPTION * The osm_subn_parse_conf_file function parses the configuration file * and sets the defaults accordingly. * * SYNOPSIS */ int osm_subn_parse_conf_file(const char *conf_file, osm_subn_opt_t * p_opt); /* * PARAMETERS * * p_opt * [in] Pointer to the subnet options structure. * * RETURN VALUES * 0 on success, positive value if file doesn't exist, * negative value otherwise *********/ /****f* OpenSM: Subnet/osm_subn_rescan_conf_files * NAME * osm_subn_rescan_conf_files * * DESCRIPTION * The osm_subn_rescan_conf_files function parses the configuration * files and update selected subnet options * * SYNOPSIS */ int osm_subn_rescan_conf_files(IN osm_subn_t * p_subn); /* * PARAMETERS * * p_subn * [in] Pointer to the subnet structure. * * RETURN VALUES * 0 on success, positive value if file doesn't exist, * negative value otherwise * *********/ /****f* OpenSM: Subnet/osm_subn_output_conf * NAME * osm_subn_output_conf * * DESCRIPTION * Output configuration info * * SYNOPSIS */ void osm_subn_output_conf(FILE *out, IN osm_subn_opt_t * p_opt); /* * PARAMETERS * * out * [in] File stream to output to. * * p_opt * [in] Pointer to the subnet options structure. * * RETURN VALUES * This method does not return a value *********/ /****f* OpenSM: Subnet/osm_subn_write_conf_file * NAME * osm_subn_write_conf_file * * DESCRIPTION * Write the configuration file into the cache * * SYNOPSIS */ int osm_subn_write_conf_file(char *file_name, IN osm_subn_opt_t * p_opt); /* * PARAMETERS * * p_opt * [in] Pointer to the subnet options structure. * * RETURN VALUES * 0 on success, negative value otherwise * * NOTES * Assumes the conf file is part of the cache dir which defaults to * OSM_DEFAULT_CACHE_DIR or OSM_CACHE_DIR the name is opensm.opts *********/ int osm_subn_verify_config(osm_subn_opt_t * p_opt); END_C_DECLS #endif /* _OSM_SUBNET_H_ */