|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
* Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved.
|
|
Packit |
13e616 |
* Copyright (c) 2002-2011 Mellanox Technologies LTD. All rights reserved.
|
|
Packit |
13e616 |
* Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
|
|
Packit |
13e616 |
* Copyright (c) 2008 Xsigo Systems Inc. All rights reserved.
|
|
Packit |
13e616 |
* Copyright (c) 2009 System Fabric Works, Inc. All rights reserved.
|
|
Packit |
13e616 |
* Copyright (c) 2009 HNR Consulting. All rights reserved.
|
|
Packit |
13e616 |
* Copyright (c) 2009-2015 ZIH, TU Dresden, Federal Republic of Germany. All rights reserved.
|
|
Packit |
13e616 |
* Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved.
|
|
Packit |
13e616 |
* Copyright (C) 2012-2017 Tokyo Institute of Technology. All rights reserved.
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
* This software is available to you under a choice of one of two
|
|
Packit |
13e616 |
* licenses. You may choose to be licensed under the terms of the GNU
|
|
Packit |
13e616 |
* General Public License (GPL) Version 2, available from the file
|
|
Packit |
13e616 |
* COPYING in the main directory of this source tree, or the
|
|
Packit |
13e616 |
* OpenIB.org BSD license below:
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
* Redistribution and use in source and binary forms, with or
|
|
Packit |
13e616 |
* without modification, are permitted provided that the following
|
|
Packit |
13e616 |
* conditions are met:
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
* - Redistributions of source code must retain the above
|
|
Packit |
13e616 |
* copyright notice, this list of conditions and the following
|
|
Packit |
13e616 |
* disclaimer.
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
* - Redistributions in binary form must reproduce the above
|
|
Packit |
13e616 |
* copyright notice, this list of conditions and the following
|
|
Packit |
13e616 |
* disclaimer in the documentation and/or other materials
|
|
Packit |
13e616 |
* provided with the distribution.
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
Packit |
13e616 |
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
Packit |
13e616 |
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
Packit |
13e616 |
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
Packit |
13e616 |
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
Packit |
13e616 |
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
Packit |
13e616 |
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
Packit |
13e616 |
* SOFTWARE.
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
* Abstract:
|
|
Packit |
13e616 |
* Implementation of osm_subn_t.
|
|
Packit |
13e616 |
* This object represents an IBA subnet.
|
|
Packit |
13e616 |
* This object is part of the opensm family of objects.
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
#if HAVE_CONFIG_H
|
|
Packit |
13e616 |
# include <config.h>
|
|
Packit |
13e616 |
#endif /* HAVE_CONFIG_H */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
#include <string.h>
|
|
Packit |
13e616 |
#include <stdio.h>
|
|
Packit |
13e616 |
#include <stdarg.h>
|
|
Packit |
13e616 |
#include <limits.h>
|
|
Packit |
13e616 |
#include <errno.h>
|
|
Packit |
13e616 |
#include <ctype.h>
|
|
Packit |
13e616 |
#include <complib/cl_debug.h>
|
|
Packit |
13e616 |
#include <complib/cl_log.h>
|
|
Packit |
13e616 |
#include <opensm/osm_file_ids.h>
|
|
Packit |
13e616 |
#define FILE_ID OSM_FILE_SUBNET_C
|
|
Packit |
13e616 |
#include <opensm/osm_subnet.h>
|
|
Packit |
13e616 |
#include <opensm/osm_opensm.h>
|
|
Packit |
13e616 |
#include <opensm/osm_log.h>
|
|
Packit |
13e616 |
#include <opensm/osm_madw.h>
|
|
Packit |
13e616 |
#include <opensm/osm_port.h>
|
|
Packit |
13e616 |
#include <opensm/osm_switch.h>
|
|
Packit |
13e616 |
#include <opensm/osm_remote_sm.h>
|
|
Packit |
13e616 |
#include <opensm/osm_partition.h>
|
|
Packit |
13e616 |
#include <opensm/osm_node.h>
|
|
Packit |
13e616 |
#include <opensm/osm_guid.h>
|
|
Packit |
13e616 |
#include <opensm/osm_multicast.h>
|
|
Packit |
13e616 |
#include <opensm/osm_inform.h>
|
|
Packit |
13e616 |
#include <opensm/osm_console.h>
|
|
Packit |
13e616 |
#include <opensm/osm_perfmgr.h>
|
|
Packit |
13e616 |
#include <opensm/osm_congestion_control.h>
|
|
Packit |
13e616 |
#include <opensm/osm_event_plugin.h>
|
|
Packit |
13e616 |
#include <opensm/osm_qos_policy.h>
|
|
Packit |
13e616 |
#include <opensm/osm_service.h>
|
|
Packit |
13e616 |
#include <opensm/osm_db.h>
|
|
Packit |
13e616 |
#include <opensm/osm_db_pack.h>
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static const char null_str[] = "(null)";
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
#define OPT_OFFSET(opt) offsetof(osm_subn_opt_t, opt)
|
|
Packit |
13e616 |
#define ARR_SIZE(a) (sizeof(a)/sizeof((a)[0]))
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
typedef struct opt_rec {
|
|
Packit |
13e616 |
const char *name;
|
|
Packit |
13e616 |
unsigned long opt_offset;
|
|
Packit |
13e616 |
void (*parse_fn)(osm_subn_t *p_subn, char *p_key, char *p_val_str,
|
|
Packit |
13e616 |
void *p_val1, void *p_val2,
|
|
Packit |
13e616 |
void (*)(osm_subn_t *, void *));
|
|
Packit |
13e616 |
void (*setup_fn)(osm_subn_t *p_subn, void *p_val);
|
|
Packit |
13e616 |
int can_update;
|
|
Packit |
13e616 |
} opt_rec_t;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static const char *module_name_str[] = {
|
|
Packit |
13e616 |
"main.c",
|
|
Packit |
13e616 |
"osm_console.c",
|
|
Packit |
13e616 |
"osm_console_io.c",
|
|
Packit |
13e616 |
"osm_db_files.c",
|
|
Packit |
13e616 |
"osm_db_pack.c",
|
|
Packit |
13e616 |
"osm_drop_mgr.c",
|
|
Packit |
13e616 |
"osm_dump.c",
|
|
Packit |
13e616 |
"osm_event_plugin.c",
|
|
Packit |
13e616 |
"osm_guid_info_rcv.c",
|
|
Packit |
13e616 |
"osm_guid_mgr.c",
|
|
Packit |
13e616 |
"osm_helper.c",
|
|
Packit |
13e616 |
"osm_inform.c",
|
|
Packit |
13e616 |
"osm_lid_mgr.c",
|
|
Packit |
13e616 |
"osm_lin_fwd_rcv.c",
|
|
Packit |
13e616 |
"osm_link_mgr.c",
|
|
Packit |
13e616 |
"osm_log.c",
|
|
Packit |
13e616 |
"osm_mad_pool.c",
|
|
Packit |
13e616 |
"osm_mcast_fwd_rcv.c",
|
|
Packit |
13e616 |
"osm_mcast_mgr.c",
|
|
Packit |
13e616 |
"osm_mcast_tbl.c",
|
|
Packit |
13e616 |
"osm_mcm_port.c",
|
|
Packit |
13e616 |
"osm_mesh.c",
|
|
Packit |
13e616 |
"osm_mlnx_ext_port_info_rcv.c",
|
|
Packit |
13e616 |
"osm_mtree.c",
|
|
Packit |
13e616 |
"osm_multicast.c",
|
|
Packit |
13e616 |
"osm_node.c",
|
|
Packit |
13e616 |
"osm_node_desc_rcv.c",
|
|
Packit |
13e616 |
"osm_node_info_rcv.c",
|
|
Packit |
13e616 |
"osm_opensm.c",
|
|
Packit |
13e616 |
"osm_perfmgr.c",
|
|
Packit |
13e616 |
"osm_perfmgr_db.c",
|
|
Packit |
13e616 |
"osm_pkey.c",
|
|
Packit |
13e616 |
"osm_pkey_mgr.c",
|
|
Packit |
13e616 |
"osm_pkey_rcv.c",
|
|
Packit |
13e616 |
"osm_port.c",
|
|
Packit |
13e616 |
"osm_port_info_rcv.c",
|
|
Packit |
13e616 |
"osm_prtn.c",
|
|
Packit |
13e616 |
"osm_prtn_config.c",
|
|
Packit |
13e616 |
"osm_qos.c",
|
|
Packit |
13e616 |
"osm_qos_parser_l.c",
|
|
Packit |
13e616 |
"osm_qos_parser_y.c",
|
|
Packit |
13e616 |
"osm_qos_policy.c",
|
|
Packit |
13e616 |
"osm_remote_sm.c",
|
|
Packit |
13e616 |
"osm_req.c",
|
|
Packit |
13e616 |
"osm_resp.c",
|
|
Packit |
13e616 |
"osm_router.c",
|
|
Packit |
13e616 |
"osm_sa.c",
|
|
Packit |
13e616 |
"osm_sa_class_port_info.c",
|
|
Packit |
13e616 |
"osm_sa_guidinfo_record.c",
|
|
Packit |
13e616 |
"osm_sa_informinfo.c",
|
|
Packit |
13e616 |
"osm_sa_lft_record.c",
|
|
Packit |
13e616 |
"osm_sa_link_record.c",
|
|
Packit |
13e616 |
"osm_sa_mad_ctrl.c",
|
|
Packit |
13e616 |
"osm_sa_mcmember_record.c",
|
|
Packit |
13e616 |
"osm_sa_mft_record.c",
|
|
Packit |
13e616 |
"osm_sa_multipath_record.c",
|
|
Packit |
13e616 |
"osm_sa_node_record.c",
|
|
Packit |
13e616 |
"osm_sa_path_record.c",
|
|
Packit |
13e616 |
"osm_sa_pkey_record.c",
|
|
Packit |
13e616 |
"osm_sa_portinfo_record.c",
|
|
Packit |
13e616 |
"osm_sa_service_record.c",
|
|
Packit |
13e616 |
"osm_sa_slvl_record.c",
|
|
Packit |
13e616 |
"osm_sa_sminfo_record.c",
|
|
Packit |
13e616 |
"osm_sa_sw_info_record.c",
|
|
Packit |
13e616 |
"osm_sa_vlarb_record.c",
|
|
Packit |
13e616 |
"osm_service.c",
|
|
Packit |
13e616 |
"osm_slvl_map_rcv.c",
|
|
Packit |
13e616 |
"osm_sm.c",
|
|
Packit |
13e616 |
"osm_sminfo_rcv.c",
|
|
Packit |
13e616 |
"osm_sm_mad_ctrl.c",
|
|
Packit |
13e616 |
"osm_sm_state_mgr.c",
|
|
Packit |
13e616 |
"osm_state_mgr.c",
|
|
Packit |
13e616 |
"osm_subnet.c",
|
|
Packit |
13e616 |
"osm_sw_info_rcv.c",
|
|
Packit |
13e616 |
"osm_switch.c",
|
|
Packit |
13e616 |
"osm_torus.c",
|
|
Packit |
13e616 |
"osm_trap_rcv.c",
|
|
Packit |
13e616 |
"osm_ucast_cache.c",
|
|
Packit |
13e616 |
"osm_ucast_dnup.c",
|
|
Packit |
13e616 |
"osm_ucast_file.c",
|
|
Packit |
13e616 |
"osm_ucast_ftree.c",
|
|
Packit |
13e616 |
"osm_ucast_lash.c",
|
|
Packit |
13e616 |
"osm_ucast_mgr.c",
|
|
Packit |
13e616 |
"osm_ucast_updn.c",
|
|
Packit |
13e616 |
"osm_vendor_ibumad.c",
|
|
Packit |
13e616 |
"osm_vl15intf.c",
|
|
Packit |
13e616 |
"osm_vl_arb_rcv.c",
|
|
Packit |
13e616 |
"st.c",
|
|
Packit |
13e616 |
"osm_ucast_dfsssp.c",
|
|
Packit |
13e616 |
"osm_congestion_control.c",
|
|
Packit |
13e616 |
"osm_ucast_nue.c",
|
|
Packit |
13e616 |
/* Add new module names here ... */
|
|
Packit |
13e616 |
/* FILE_ID define in those modules must be identical to index here */
|
|
Packit |
13e616 |
/* last FILE_ID is currently 90 */
|
|
Packit |
13e616 |
};
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
#define MOD_NAME_STR_UNKNOWN_VAL (ARR_SIZE(module_name_str))
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static int find_module_name(const char *name, uint8_t *file_id)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
uint8_t i;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
for (i = 0; i < MOD_NAME_STR_UNKNOWN_VAL; i++) {
|
|
Packit |
13e616 |
if (strcmp(name, module_name_str[i]) == 0) {
|
|
Packit |
13e616 |
if (file_id)
|
|
Packit |
13e616 |
*file_id = i;
|
|
Packit |
13e616 |
return 0;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
return 1;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void log_report(const char *fmt, ...)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
char buf[128];
|
|
Packit |
13e616 |
va_list args;
|
|
Packit |
13e616 |
va_start(args, fmt);
|
|
Packit |
13e616 |
vsnprintf(buf, sizeof(buf), fmt, args);
|
|
Packit |
13e616 |
va_end(args);
|
|
Packit |
13e616 |
printf("%s", buf);
|
|
Packit |
13e616 |
cl_log_event("OpenSM", CL_LOG_INFO, buf, NULL, 0);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void log_config_value(char *name, const char *fmt, ...)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
char buf[128];
|
|
Packit |
13e616 |
va_list args;
|
|
Packit |
13e616 |
unsigned n;
|
|
Packit |
13e616 |
va_start(args, fmt);
|
|
Packit |
13e616 |
n = snprintf(buf, sizeof(buf), " Loading Cached Option:%s = ", name);
|
|
Packit |
13e616 |
if (n > sizeof(buf))
|
|
Packit |
13e616 |
n = sizeof(buf);
|
|
Packit |
13e616 |
n += vsnprintf(buf + n, sizeof(buf) - n, fmt, args);
|
|
Packit |
13e616 |
if (n > sizeof(buf) - 2)
|
|
Packit |
13e616 |
n = sizeof(buf) - 2;
|
|
Packit |
13e616 |
snprintf(buf + n, sizeof(buf) - n, "\n");
|
|
Packit |
13e616 |
va_end(args);
|
|
Packit |
13e616 |
printf("%s", buf);
|
|
Packit |
13e616 |
cl_log_event("OpenSM", CL_LOG_INFO, buf, NULL, 0);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void opts_setup_log_flags(osm_subn_t *p_subn, void *p_val)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
p_subn->p_osm->log.level = *((uint8_t *) p_val);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void opts_setup_force_log_flush(osm_subn_t *p_subn, void *p_val)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
p_subn->p_osm->log.flush = *((boolean_t *) p_val);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void opts_setup_accum_log_file(osm_subn_t *p_subn, void *p_val)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
p_subn->p_osm->log.accum_log_file = *((boolean_t *) p_val);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void opts_setup_log_max_size(osm_subn_t *p_subn, void *p_val)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
uint32_t log_max_size = *((uint32_t *) p_val);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_subn->p_osm->log.max_size = (unsigned long)log_max_size << 20; /* convert from MB to bytes */
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void opts_setup_sminfo_polling_timeout(osm_subn_t *p_subn, void *p_val)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
osm_sm_t *p_sm = &p_subn->p_osm->sm;
|
|
Packit |
13e616 |
uint32_t sminfo_polling_timeout = *((uint32_t *) p_val);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
cl_timer_stop(&p_sm->polling_timer);
|
|
Packit |
13e616 |
cl_timer_start(&p_sm->polling_timer, sminfo_polling_timeout);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void opts_setup_sm_priority(osm_subn_t *p_subn, void *p_val)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
osm_sm_t *p_sm = &p_subn->p_osm->sm;
|
|
Packit |
13e616 |
uint8_t sm_priority = *((uint8_t *) p_val);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
osm_set_sm_priority(p_sm, sm_priority);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static int opts_strtoul(uint32_t *val, IN char *p_val_str,
|
|
Packit |
13e616 |
IN char *p_key, uint32_t max_value)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
char *endptr;
|
|
Packit |
13e616 |
unsigned long int tmp_val;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
errno = 0;
|
|
Packit |
13e616 |
tmp_val = strtoul(p_val_str, &endptr, 0);
|
|
Packit |
13e616 |
*val = tmp_val;
|
|
Packit |
13e616 |
if (*p_val_str == '\0' || *endptr != '\0') {
|
|
Packit |
13e616 |
log_report("-E- Parsing error in field %s, expected "
|
|
Packit |
13e616 |
"numeric input received: %s\n", p_key, p_val_str);
|
|
Packit |
13e616 |
return -1;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
if (tmp_val > max_value ||
|
|
Packit |
13e616 |
((tmp_val == ULONG_MAX) && errno == ERANGE)) {
|
|
Packit |
13e616 |
log_report("-E- Parsing error in field %s, value out of range\n", p_key);
|
|
Packit |
13e616 |
return -1;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
return 0;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static int opts_strtoull(uint64_t *val, IN char *p_val_str,
|
|
Packit |
13e616 |
IN char *p_key, uint64_t max_value)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
char *endptr;
|
|
Packit |
13e616 |
unsigned long long int tmp_val;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
errno = 0;
|
|
Packit |
13e616 |
tmp_val = strtoull(p_val_str, &endptr, 0);
|
|
Packit |
13e616 |
*val = tmp_val;
|
|
Packit |
13e616 |
if (*p_val_str == '\0' || *endptr != '\0') {
|
|
Packit |
13e616 |
log_report("-E- Parsing error in field %s, expected "
|
|
Packit |
13e616 |
"numeric input received: %s\n", p_key, p_val_str);
|
|
Packit |
13e616 |
return -1;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
if (tmp_val > max_value || (tmp_val == ULLONG_MAX && errno == ERANGE)) {
|
|
Packit |
13e616 |
log_report("-E- Parsing error in field %s, value out of range\n", p_key);
|
|
Packit |
13e616 |
return -1;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
return 0;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void opts_parse_net64(IN osm_subn_t *p_subn, IN char *p_key,
|
|
Packit |
13e616 |
IN char *p_val_str, void *p_v1, void *p_v2,
|
|
Packit |
13e616 |
void (*pfn)(osm_subn_t *, void *))
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
uint64_t *p_val1 = p_v1, *p_val2 = p_v2;
|
|
Packit |
13e616 |
uint64_t val;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (opts_strtoull(&val, p_val_str, p_key, UINT64_MAX))
|
|
Packit |
13e616 |
return;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (cl_hton64(val) != *p_val1) {
|
|
Packit |
13e616 |
log_config_value(p_key, "0x%016" PRIx64, val);
|
|
Packit |
13e616 |
if (pfn)
|
|
Packit |
13e616 |
pfn(p_subn, &val;;
|
|
Packit |
13e616 |
*p_val1 = *p_val2 = cl_ntoh64(val);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void opts_parse_uint32(IN osm_subn_t *p_subn, IN char *p_key,
|
|
Packit |
13e616 |
IN char *p_val_str, void *p_v1, void *p_v2,
|
|
Packit |
13e616 |
void (*pfn)(osm_subn_t *, void *))
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
uint32_t *p_val1 = p_v1, *p_val2 = p_v2;
|
|
Packit |
13e616 |
uint32_t val;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (opts_strtoul(&val, p_val_str, p_key, UINT32_MAX))
|
|
Packit |
13e616 |
return;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (val != *p_val1) {
|
|
Packit |
13e616 |
log_config_value(p_key, "%u", val);
|
|
Packit |
13e616 |
if (pfn)
|
|
Packit |
13e616 |
pfn(p_subn, &val;;
|
|
Packit |
13e616 |
*p_val1 = *p_val2 = val;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void opts_parse_net32(IN osm_subn_t *p_subn, IN char *p_key,
|
|
Packit |
13e616 |
IN char *p_val_str, void *p_v1, void *p_v2,
|
|
Packit |
13e616 |
void (*pfn)(osm_subn_t *, void *))
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
uint32_t *p_val1 = p_v1, *p_val2 = p_v2;
|
|
Packit |
13e616 |
uint32_t val;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (opts_strtoul(&val, p_val_str, p_key, UINT32_MAX))
|
|
Packit |
13e616 |
return;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (cl_hton32(val) != *p_val1) {
|
|
Packit |
13e616 |
log_config_value(p_key, "%u", val);
|
|
Packit |
13e616 |
if (pfn)
|
|
Packit |
13e616 |
pfn(p_subn, &val;;
|
|
Packit |
13e616 |
*p_val1 = *p_val2 = cl_hton32(val);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void opts_parse_int32(IN osm_subn_t *p_subn, IN char *p_key,
|
|
Packit |
13e616 |
IN char *p_val_str, void *p_v1, void *p_v2,
|
|
Packit |
13e616 |
void (*pfn)(osm_subn_t *, void *))
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
int32_t *p_val1 = p_v1, *p_val2 = p_v2;
|
|
Packit |
13e616 |
int32_t val = strtol(p_val_str, NULL, 0);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (val != *p_val1) {
|
|
Packit |
13e616 |
log_config_value(p_key, "%d", val);
|
|
Packit |
13e616 |
if (pfn)
|
|
Packit |
13e616 |
pfn(p_subn, &val;;
|
|
Packit |
13e616 |
*p_val1 = *p_val2 = val;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void opts_parse_uint16(IN osm_subn_t *p_subn, IN char *p_key,
|
|
Packit |
13e616 |
IN char *p_val_str, void *p_v1, void *p_v2,
|
|
Packit |
13e616 |
void (*pfn)(osm_subn_t *, void *))
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
uint16_t *p_val1 = p_v1, *p_val2 = p_v2;
|
|
Packit |
13e616 |
uint32_t tmp_val;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (opts_strtoul(&tmp_val, p_val_str, p_key, UINT16_MAX))
|
|
Packit |
13e616 |
return;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
uint16_t val = (uint16_t) tmp_val;
|
|
Packit |
13e616 |
if (val != *p_val1) {
|
|
Packit |
13e616 |
log_config_value(p_key, "%u", val);
|
|
Packit |
13e616 |
if (pfn)
|
|
Packit |
13e616 |
pfn(p_subn, &val;;
|
|
Packit |
13e616 |
*p_val1 = *p_val2 = val;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void opts_parse_net16(IN osm_subn_t *p_subn, IN char *p_key,
|
|
Packit |
13e616 |
IN char *p_val_str, void *p_v1, void *p_v2,
|
|
Packit |
13e616 |
void (*pfn)(osm_subn_t *, void *))
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
uint16_t *p_val1 = p_v1, *p_val2 = p_v2;
|
|
Packit |
13e616 |
uint32_t tmp_val;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (opts_strtoul(&tmp_val, p_val_str, p_key, UINT16_MAX))
|
|
Packit |
13e616 |
return;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
uint16_t val = (uint16_t) tmp_val;
|
|
Packit |
13e616 |
if (cl_hton16(val) != *p_val1) {
|
|
Packit |
13e616 |
log_config_value(p_key, "0x%04x", val);
|
|
Packit |
13e616 |
if (pfn)
|
|
Packit |
13e616 |
pfn(p_subn, &val;;
|
|
Packit |
13e616 |
*p_val1 = *p_val2 = cl_hton16(val);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void opts_parse_uint8(IN osm_subn_t *p_subn, IN char *p_key,
|
|
Packit |
13e616 |
IN char *p_val_str, void *p_v1, void *p_v2,
|
|
Packit |
13e616 |
void (*pfn)(osm_subn_t *, void *))
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
uint8_t *p_val1 = p_v1, *p_val2 = p_v2;
|
|
Packit |
13e616 |
uint32_t tmp_val;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (opts_strtoul(&tmp_val, p_val_str, p_key, UINT8_MAX))
|
|
Packit |
13e616 |
return;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
uint8_t val = (uint8_t) tmp_val;
|
|
Packit |
13e616 |
if (val != *p_val1) {
|
|
Packit |
13e616 |
log_config_value(p_key, "%u", val);
|
|
Packit |
13e616 |
if (pfn)
|
|
Packit |
13e616 |
pfn(p_subn, &val;;
|
|
Packit |
13e616 |
*p_val1 = *p_val2 = val;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void opts_parse_boolean(IN osm_subn_t *p_subn, IN char *p_key,
|
|
Packit |
13e616 |
IN char *p_val_str, void *p_v1, void *p_v2,
|
|
Packit |
13e616 |
void (*pfn)(osm_subn_t *, void *))
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
boolean_t *p_val1 = p_v1, *p_val2 = p_v2;
|
|
Packit |
13e616 |
boolean_t val;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (!p_val_str)
|
|
Packit |
13e616 |
return;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (strcmp("TRUE", p_val_str))
|
|
Packit |
13e616 |
val = FALSE;
|
|
Packit |
13e616 |
else
|
|
Packit |
13e616 |
val = TRUE;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (val != *p_val1) {
|
|
Packit |
13e616 |
log_config_value(p_key, "%s", p_val_str);
|
|
Packit |
13e616 |
if (pfn)
|
|
Packit |
13e616 |
pfn(p_subn, &val;;
|
|
Packit |
13e616 |
*p_val1 = *p_val2 = val;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void opts_parse_charp(IN osm_subn_t *p_subn, IN char *p_key,
|
|
Packit |
13e616 |
IN char *p_val_str, void *p_v1, void *p_v2,
|
|
Packit |
13e616 |
void (*pfn)(osm_subn_t *, void *))
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
char **p_val1 = p_v1, **p_val2 = p_v2;
|
|
Packit |
13e616 |
const char *current_str = *p_val1 ? *p_val1 : null_str;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (p_val_str && strcmp(p_val_str, current_str)) {
|
|
Packit |
13e616 |
char *new;
|
|
Packit |
13e616 |
log_config_value(p_key, "%s", p_val_str);
|
|
Packit |
13e616 |
/* special case the "(null)" string */
|
|
Packit |
13e616 |
new = strcmp(null_str, p_val_str) ? strdup(p_val_str) : NULL;
|
|
Packit |
13e616 |
if (pfn)
|
|
Packit |
13e616 |
pfn(p_subn, new);
|
|
Packit |
13e616 |
if (*p_val1 && *p_val1 != *p_val2)
|
|
Packit |
13e616 |
free(*p_val1);
|
|
Packit |
13e616 |
if (*p_val2)
|
|
Packit |
13e616 |
free(*p_val2);
|
|
Packit |
13e616 |
*p_val1 = *p_val2 = new;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void opts_parse_256bit(IN osm_subn_t *p_subn, IN char *p_key,
|
|
Packit |
13e616 |
IN char *p_val_str, void *p_v1, void *p_v2,
|
|
Packit |
13e616 |
void (*pfn)(osm_subn_t *, void *))
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
uint8_t *p_val1 = p_v1, *p_val2 = p_v2;
|
|
Packit |
13e616 |
uint8_t val[IB_CC_PORT_MASK_DATA_SIZE] = { 0 };
|
|
Packit |
13e616 |
char tmpbuf[3] = { 0 };
|
|
Packit |
13e616 |
uint8_t tmpint;
|
|
Packit |
13e616 |
int numdigits = 0;
|
|
Packit |
13e616 |
int startindex;
|
|
Packit |
13e616 |
char *strptr = p_val_str;
|
|
Packit |
13e616 |
char *ptr;
|
|
Packit |
13e616 |
int i;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* parse like it's hypothetically a 256 bit integer code
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
* store "big endian"
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (!strncmp(strptr, "0x", 2) || !strncmp(strptr, "0X", 2))
|
|
Packit |
13e616 |
strptr+=2;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
for (ptr = strptr; *ptr; ptr++) {
|
|
Packit |
13e616 |
if (!isxdigit(*ptr)) {
|
|
Packit |
13e616 |
log_report("invalid hex digit in bitmask\n");
|
|
Packit |
13e616 |
return;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
numdigits++;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (!numdigits) {
|
|
Packit |
13e616 |
log_report("invalid length bitmask\n");
|
|
Packit |
13e616 |
return;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* max of 2 hex chars per byte */
|
|
Packit |
13e616 |
if (numdigits > IB_CC_PORT_MASK_DATA_SIZE * 2)
|
|
Packit |
13e616 |
numdigits = IB_CC_PORT_MASK_DATA_SIZE * 2;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
startindex = IB_CC_PORT_MASK_DATA_SIZE - ((numdigits - 1) / 2) - 1;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (numdigits % 2) {
|
|
Packit |
13e616 |
memcpy(tmpbuf, strptr, 1);
|
|
Packit |
13e616 |
strptr += 1;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
else {
|
|
Packit |
13e616 |
memcpy(tmpbuf, strptr, 2);
|
|
Packit |
13e616 |
strptr += 2;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
tmpint = strtoul(tmpbuf, NULL, 16);
|
|
Packit |
13e616 |
val[startindex] = tmpint;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
for (i = (startindex + 1); i < IB_CC_PORT_MASK_DATA_SIZE; i++) {
|
|
Packit |
13e616 |
memcpy(tmpbuf, strptr, 2);
|
|
Packit |
13e616 |
strptr += 2;
|
|
Packit |
13e616 |
tmpint = strtoul(tmpbuf, NULL, 16);
|
|
Packit |
13e616 |
val[i] = tmpint;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (memcmp(val, p_val1, IB_CC_PORT_MASK_DATA_SIZE)) {
|
|
Packit |
13e616 |
log_config_value(p_key, "%s", p_val_str);
|
|
Packit |
13e616 |
if (pfn)
|
|
Packit |
13e616 |
pfn(p_subn, val);
|
|
Packit |
13e616 |
memcpy(p_val1, val, IB_CC_PORT_MASK_DATA_SIZE);
|
|
Packit |
13e616 |
memcpy(p_val2, val, IB_CC_PORT_MASK_DATA_SIZE);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void opts_parse_cct_entry(IN osm_subn_t *p_subn, IN char *p_key,
|
|
Packit |
13e616 |
IN char *p_val_str, void *p_v1, void *p_v2,
|
|
Packit |
13e616 |
void (*pfn)(osm_subn_t *, void *))
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
osm_cct_entry_t *p_cct1 = p_v1, *p_cct2 = p_v2;
|
|
Packit |
13e616 |
osm_cct_entry_t cct;
|
|
Packit |
13e616 |
char buf[512] = { 0 };
|
|
Packit |
13e616 |
char *ptr;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
strncpy(buf, p_val_str, 511);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (!(ptr = strchr(buf, ':'))) {
|
|
Packit |
13e616 |
log_report("invalid CCT entry\n");
|
|
Packit |
13e616 |
return;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
*ptr = '\0';
|
|
Packit |
13e616 |
ptr++;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
cct.shift = strtoul(buf, NULL, 0);
|
|
Packit |
13e616 |
cct.multiplier = strtoul(ptr, NULL, 0);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (cct.shift != p_cct1->shift
|
|
Packit |
13e616 |
|| cct.multiplier != p_cct1->multiplier) {
|
|
Packit |
13e616 |
log_config_value(p_key, "%s", p_val_str);
|
|
Packit |
13e616 |
if (pfn)
|
|
Packit |
13e616 |
pfn(p_subn, &cct;;
|
|
Packit |
13e616 |
p_cct1->shift = p_cct2->shift = cct.shift;
|
|
Packit |
13e616 |
p_cct1->multiplier = p_cct2->multiplier = cct.multiplier;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void opts_parse_cc_cct(IN osm_subn_t *p_subn, IN char *p_key,
|
|
Packit |
13e616 |
IN char *p_val_str, void *p_v1, void *p_v2,
|
|
Packit |
13e616 |
void (*pfn)(osm_subn_t *, void *))
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
osm_cct_t *p_val1 = p_v1, *p_val2 = p_v2;
|
|
Packit |
13e616 |
const char *current_str = p_val1->input_str ? p_val1->input_str : null_str;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (p_val_str && strcmp(p_val_str, current_str)) {
|
|
Packit |
13e616 |
osm_cct_t newcct;
|
|
Packit |
13e616 |
char *new;
|
|
Packit |
13e616 |
unsigned int len = 0;
|
|
Packit |
13e616 |
char *lasts;
|
|
Packit |
13e616 |
char *tok;
|
|
Packit |
13e616 |
char *ptr;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* special case the "(null)" string */
|
|
Packit |
13e616 |
new = strcmp(null_str, p_val_str) ? strdup(p_val_str) : NULL;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (!new) {
|
|
Packit |
13e616 |
log_config_value(p_key, "%s", p_val_str);
|
|
Packit |
13e616 |
if (pfn)
|
|
Packit |
13e616 |
pfn(p_subn, NULL);
|
|
Packit |
13e616 |
memset(p_val1->entries, '\0', sizeof(p_val1->entries));
|
|
Packit |
13e616 |
memset(p_val2->entries, '\0', sizeof(p_val2->entries));
|
|
Packit |
13e616 |
p_val1->entries_len = p_val2->entries_len = 0;
|
|
Packit |
13e616 |
p_val1->input_str = p_val2->input_str = NULL;
|
|
Packit |
13e616 |
return;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
memset(&newcct, '\0', sizeof(newcct));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
tok = strtok_r(new, ",", &lasts);
|
|
Packit |
13e616 |
while (tok && len < OSM_CCT_ENTRY_MAX) {
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (!(ptr = strchr(tok, ':'))) {
|
|
Packit |
13e616 |
log_report("invalid CCT entry\n");
|
|
Packit |
13e616 |
free(new);
|
|
Packit |
13e616 |
return;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
*ptr = '\0';
|
|
Packit |
13e616 |
ptr++;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
newcct.entries[len].shift = strtoul(tok, NULL, 0);
|
|
Packit |
13e616 |
newcct.entries[len].multiplier = strtoul(ptr, NULL, 0);
|
|
Packit |
13e616 |
len++;
|
|
Packit |
13e616 |
tok = strtok_r(NULL, ",", &lasts);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
free(new);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
newcct.entries_len = len;
|
|
Packit |
13e616 |
newcct.input_str = strdup(p_val_str);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
log_config_value(p_key, "%s", p_val_str);
|
|
Packit |
13e616 |
if (pfn)
|
|
Packit |
13e616 |
pfn(p_subn, &newcct);
|
|
Packit |
13e616 |
if (p_val1->input_str && p_val1->input_str != p_val2->input_str)
|
|
Packit |
13e616 |
free(p_val1->input_str);
|
|
Packit |
13e616 |
if (p_val2->input_str)
|
|
Packit |
13e616 |
free(p_val2->input_str);
|
|
Packit |
13e616 |
memcpy(p_val1->entries, newcct.entries, sizeof(newcct.entries));
|
|
Packit |
13e616 |
memcpy(p_val2->entries, newcct.entries, sizeof(newcct.entries));
|
|
Packit |
13e616 |
p_val1->entries_len = p_val2->entries_len = newcct.entries_len;
|
|
Packit |
13e616 |
p_val1->input_str = p_val2->input_str = newcct.input_str;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static int parse_ca_cong_common(char *p_val_str, uint8_t *sl, unsigned int *val_offset) {
|
|
Packit |
13e616 |
char *new, *lasts, *sl_str, *val_str;
|
|
Packit |
13e616 |
uint8_t sltmp;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
new = strcmp(null_str, p_val_str) ? strdup(p_val_str) : NULL;
|
|
Packit |
13e616 |
if (!new)
|
|
Packit |
13e616 |
return -1;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
sl_str = strtok_r(new, " \t", &lasts);
|
|
Packit |
13e616 |
val_str = strtok_r(NULL, " \t", &lasts);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (!val_str) {
|
|
Packit |
13e616 |
log_report("value must be specified in addition to SL\n");
|
|
Packit |
13e616 |
free(new);
|
|
Packit |
13e616 |
return -1;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
sltmp = strtoul(sl_str, NULL, 0);
|
|
Packit |
13e616 |
if (sltmp >= IB_CA_CONG_ENTRY_DATA_SIZE) {
|
|
Packit |
13e616 |
log_report("invalid SL specified\n");
|
|
Packit |
13e616 |
free(new);
|
|
Packit |
13e616 |
return -1;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
*sl = sltmp;
|
|
Packit |
13e616 |
*val_offset = (unsigned int)(val_str - new);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
free(new);
|
|
Packit |
13e616 |
return 0;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void opts_parse_ccti_timer(IN osm_subn_t *p_subn, IN char *p_key,
|
|
Packit |
13e616 |
IN char *p_val_str, void *p_v1, void *p_v2,
|
|
Packit |
13e616 |
void (*pfn)(osm_subn_t *, void *))
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
osm_cacongestion_entry_t *p_val1 = p_v1, *p_val2 = p_v2;
|
|
Packit |
13e616 |
unsigned int val_offset = 0;
|
|
Packit |
13e616 |
uint8_t sl = 0;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (parse_ca_cong_common(p_val_str, &sl, &val_offset) < 0)
|
|
Packit |
13e616 |
return;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
opts_parse_net16(p_subn, p_key, p_val_str + val_offset,
|
|
Packit |
13e616 |
&p_val1[sl].ccti_timer,
|
|
Packit |
13e616 |
&p_val2[sl].ccti_timer,
|
|
Packit |
13e616 |
pfn);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void opts_parse_ccti_increase(IN osm_subn_t *p_subn, IN char *p_key,
|
|
Packit |
13e616 |
IN char *p_val_str, void *p_v1, void *p_v2,
|
|
Packit |
13e616 |
void (*pfn)(osm_subn_t *, void *))
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
osm_cacongestion_entry_t *p_val1 = p_v1, *p_val2 = p_v2;
|
|
Packit |
13e616 |
unsigned int val_offset = 0;
|
|
Packit |
13e616 |
uint8_t sl = 0;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (parse_ca_cong_common(p_val_str, &sl, &val_offset) < 0)
|
|
Packit |
13e616 |
return;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
opts_parse_uint8(p_subn, p_key, p_val_str + val_offset,
|
|
Packit |
13e616 |
&p_val1[sl].ccti_increase,
|
|
Packit |
13e616 |
&p_val2[sl].ccti_increase,
|
|
Packit |
13e616 |
pfn);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void opts_parse_trigger_threshold(IN osm_subn_t *p_subn, IN char *p_key,
|
|
Packit |
13e616 |
IN char *p_val_str, void *p_v1, void *p_v2,
|
|
Packit |
13e616 |
void (*pfn)(osm_subn_t *, void *))
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
osm_cacongestion_entry_t *p_val1 = p_v1, *p_val2 = p_v2;
|
|
Packit |
13e616 |
unsigned int val_offset = 0;
|
|
Packit |
13e616 |
uint8_t sl = 0;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (parse_ca_cong_common(p_val_str, &sl, &val_offset) < 0)
|
|
Packit |
13e616 |
return;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
opts_parse_uint8(p_subn, p_key, p_val_str + val_offset,
|
|
Packit |
13e616 |
&p_val1[sl].trigger_threshold,
|
|
Packit |
13e616 |
&p_val2[sl].trigger_threshold,
|
|
Packit |
13e616 |
pfn);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void opts_parse_ccti_min(IN osm_subn_t *p_subn, IN char *p_key,
|
|
Packit |
13e616 |
IN char *p_val_str, void *p_v1, void *p_v2,
|
|
Packit |
13e616 |
void (*pfn)(osm_subn_t *, void *))
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
osm_cacongestion_entry_t *p_val1 = p_v1, *p_val2 = p_v2;
|
|
Packit |
13e616 |
unsigned int val_offset = 0;
|
|
Packit |
13e616 |
uint8_t sl = 0;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (parse_ca_cong_common(p_val_str, &sl, &val_offset) < 0)
|
|
Packit |
13e616 |
return;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
opts_parse_uint8(p_subn, p_key, p_val_str + val_offset,
|
|
Packit |
13e616 |
&p_val1[sl].ccti_min,
|
|
Packit |
13e616 |
&p_val2[sl].ccti_min,
|
|
Packit |
13e616 |
pfn);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static const opt_rec_t opt_tbl[] = {
|
|
Packit |
13e616 |
{ "guid", OPT_OFFSET(guid), opts_parse_net64, NULL, 0 },
|
|
Packit |
13e616 |
{ "m_key", OPT_OFFSET(m_key), opts_parse_net64, NULL, 1 },
|
|
Packit |
13e616 |
{ "sm_key", OPT_OFFSET(sm_key), opts_parse_net64, NULL, 1 },
|
|
Packit |
13e616 |
{ "sa_key", OPT_OFFSET(sa_key), opts_parse_net64, NULL, 1 },
|
|
Packit |
13e616 |
{ "subnet_prefix", OPT_OFFSET(subnet_prefix), opts_parse_net64, NULL, 0 },
|
|
Packit |
13e616 |
{ "m_key_lease_period", OPT_OFFSET(m_key_lease_period), opts_parse_net16, NULL, 1 },
|
|
Packit |
13e616 |
{ "m_key_protection_level", OPT_OFFSET(m_key_protect_bits), opts_parse_uint8, NULL, 1 },
|
|
Packit |
13e616 |
{ "m_key_lookup", OPT_OFFSET(m_key_lookup), opts_parse_boolean, NULL, 1 },
|
|
Packit |
13e616 |
{ "sweep_interval", OPT_OFFSET(sweep_interval), opts_parse_uint32, NULL, 1 },
|
|
Packit |
13e616 |
{ "max_wire_smps", OPT_OFFSET(max_wire_smps), opts_parse_uint32, NULL, 1 },
|
|
Packit |
13e616 |
{ "max_wire_smps2", OPT_OFFSET(max_wire_smps2), opts_parse_uint32, NULL, 1 },
|
|
Packit |
13e616 |
{ "max_smps_timeout", OPT_OFFSET(max_smps_timeout), opts_parse_uint32, NULL, 1 },
|
|
Packit |
13e616 |
{ "console", OPT_OFFSET(console), opts_parse_charp, NULL, 0 },
|
|
Packit |
13e616 |
{ "console_port", OPT_OFFSET(console_port), opts_parse_uint16, NULL, 0 },
|
|
Packit |
13e616 |
{ "transaction_timeout", OPT_OFFSET(transaction_timeout), opts_parse_uint32, NULL, 0 },
|
|
Packit |
13e616 |
{ "transaction_retries", OPT_OFFSET(transaction_retries), opts_parse_uint32, NULL, 0 },
|
|
Packit |
13e616 |
{ "long_transaction_timeout", OPT_OFFSET(long_transaction_timeout), opts_parse_uint32, NULL, 0 },
|
|
Packit |
13e616 |
{ "max_msg_fifo_timeout", OPT_OFFSET(max_msg_fifo_timeout), opts_parse_uint32, NULL, 1 },
|
|
Packit |
13e616 |
{ "sm_priority", OPT_OFFSET(sm_priority), opts_parse_uint8, opts_setup_sm_priority, 1 },
|
|
Packit |
13e616 |
{ "lmc", OPT_OFFSET(lmc), opts_parse_uint8, NULL, 0 },
|
|
Packit |
13e616 |
{ "lmc_esp0", OPT_OFFSET(lmc_esp0), opts_parse_boolean, NULL, 0 },
|
|
Packit |
13e616 |
{ "max_op_vls", OPT_OFFSET(max_op_vls), opts_parse_uint8, NULL, 1 },
|
|
Packit |
13e616 |
{ "force_link_speed", OPT_OFFSET(force_link_speed), opts_parse_uint8, NULL, 1 },
|
|
Packit |
13e616 |
{ "force_link_speed_ext", OPT_OFFSET(force_link_speed_ext), opts_parse_uint8, NULL, 1 },
|
|
Packit |
13e616 |
{ "force_link_width", OPT_OFFSET(force_link_width), opts_parse_uint8, NULL, 1 },
|
|
Packit |
13e616 |
{ "fdr10", OPT_OFFSET(fdr10), opts_parse_uint8, NULL, 1 },
|
|
Packit |
13e616 |
{ "reassign_lids", OPT_OFFSET(reassign_lids), opts_parse_boolean, NULL, 1 },
|
|
Packit |
13e616 |
{ "ignore_other_sm", OPT_OFFSET(ignore_other_sm), opts_parse_boolean, NULL, 1 },
|
|
Packit |
13e616 |
{ "single_thread", OPT_OFFSET(single_thread), opts_parse_boolean, NULL, 0 },
|
|
Packit |
13e616 |
{ "disable_multicast", OPT_OFFSET(disable_multicast), opts_parse_boolean, NULL, 1 },
|
|
Packit |
13e616 |
{ "subnet_timeout", OPT_OFFSET(subnet_timeout), opts_parse_uint8, NULL, 1 },
|
|
Packit |
13e616 |
{ "packet_life_time", OPT_OFFSET(packet_life_time), opts_parse_uint8, NULL, 1 },
|
|
Packit |
13e616 |
{ "vl_stall_count", OPT_OFFSET(vl_stall_count), opts_parse_uint8, NULL, 1 },
|
|
Packit |
13e616 |
{ "leaf_vl_stall_count", OPT_OFFSET(leaf_vl_stall_count), opts_parse_uint8, NULL, 1 },
|
|
Packit |
13e616 |
{ "head_of_queue_lifetime", OPT_OFFSET(head_of_queue_lifetime), opts_parse_uint8, NULL, 1 },
|
|
Packit |
13e616 |
{ "leaf_head_of_queue_lifetime", OPT_OFFSET(leaf_head_of_queue_lifetime), opts_parse_uint8, NULL, 1 },
|
|
Packit |
13e616 |
{ "local_phy_errors_threshold", OPT_OFFSET(local_phy_errors_threshold), opts_parse_uint8, NULL, 1 },
|
|
Packit |
13e616 |
{ "overrun_errors_threshold", OPT_OFFSET(overrun_errors_threshold), opts_parse_uint8, NULL, 1 },
|
|
Packit |
13e616 |
{ "use_mfttop", OPT_OFFSET(use_mfttop), opts_parse_boolean, NULL, 1},
|
|
Packit |
13e616 |
{ "sminfo_polling_timeout", OPT_OFFSET(sminfo_polling_timeout), opts_parse_uint32, opts_setup_sminfo_polling_timeout, 1 },
|
|
Packit |
13e616 |
{ "polling_retry_number", OPT_OFFSET(polling_retry_number), opts_parse_uint32, NULL, 1 },
|
|
Packit |
13e616 |
{ "force_heavy_sweep", OPT_OFFSET(force_heavy_sweep), opts_parse_boolean, NULL, 1 },
|
|
Packit |
13e616 |
{ "port_prof_ignore_file", OPT_OFFSET(port_prof_ignore_file), opts_parse_charp, NULL, 0 },
|
|
Packit |
13e616 |
{ "hop_weights_file", OPT_OFFSET(hop_weights_file), opts_parse_charp, NULL, 0 },
|
|
Packit |
13e616 |
{ "dimn_ports_file", OPT_OFFSET(port_search_ordering_file), opts_parse_charp, NULL, 0 },
|
|
Packit |
13e616 |
{ "port_search_ordering_file", OPT_OFFSET(port_search_ordering_file), opts_parse_charp, NULL, 0 },
|
|
Packit |
13e616 |
{ "port_profile_switch_nodes", OPT_OFFSET(port_profile_switch_nodes), opts_parse_boolean, NULL, 1 },
|
|
Packit |
13e616 |
{ "sweep_on_trap", OPT_OFFSET(sweep_on_trap), opts_parse_boolean, NULL, 1 },
|
|
Packit |
13e616 |
{ "routing_engine", OPT_OFFSET(routing_engine_names), opts_parse_charp, NULL, 0 },
|
|
Packit |
13e616 |
{ "avoid_throttled_links", OPT_OFFSET(avoid_throttled_links), opts_parse_boolean, NULL, 0 },
|
|
Packit |
13e616 |
{ "connect_roots", OPT_OFFSET(connect_roots), opts_parse_boolean, NULL, 1 },
|
|
Packit |
13e616 |
{ "use_ucast_cache", OPT_OFFSET(use_ucast_cache), opts_parse_boolean, NULL, 0 },
|
|
Packit |
13e616 |
{ "log_file", OPT_OFFSET(log_file), opts_parse_charp, NULL, 0 },
|
|
Packit |
13e616 |
{ "log_max_size", OPT_OFFSET(log_max_size), opts_parse_uint32, opts_setup_log_max_size, 1 },
|
|
Packit |
13e616 |
{ "log_flags", OPT_OFFSET(log_flags), opts_parse_uint8, opts_setup_log_flags, 1 },
|
|
Packit |
13e616 |
{ "force_log_flush", OPT_OFFSET(force_log_flush), opts_parse_boolean, opts_setup_force_log_flush, 1 },
|
|
Packit |
13e616 |
{ "accum_log_file", OPT_OFFSET(accum_log_file), opts_parse_boolean, opts_setup_accum_log_file, 1 },
|
|
Packit |
13e616 |
{ "partition_config_file", OPT_OFFSET(partition_config_file), opts_parse_charp, NULL, 0 },
|
|
Packit |
13e616 |
{ "no_partition_enforcement", OPT_OFFSET(no_partition_enforcement), opts_parse_boolean, NULL, 1 },
|
|
Packit |
13e616 |
{ "part_enforce", OPT_OFFSET(part_enforce), opts_parse_charp, NULL, 1 },
|
|
Packit |
13e616 |
{ "allow_both_pkeys", OPT_OFFSET(allow_both_pkeys), opts_parse_boolean, NULL, 0 },
|
|
Packit |
13e616 |
{ "keep_pkey_indexes", OPT_OFFSET(keep_pkey_indexes), opts_parse_boolean, NULL, 1 },
|
|
Packit |
13e616 |
{ "sm_assigned_guid", OPT_OFFSET(sm_assigned_guid), opts_parse_uint8, NULL, 1 },
|
|
Packit |
13e616 |
{ "qos", OPT_OFFSET(qos), opts_parse_boolean, NULL, 1 },
|
|
Packit |
13e616 |
{ "qos_policy_file", OPT_OFFSET(qos_policy_file), opts_parse_charp, NULL, 0 },
|
|
Packit |
13e616 |
{ "suppress_sl2vl_mad_status_errors", OPT_OFFSET(suppress_sl2vl_mad_status_errors), opts_parse_boolean, NULL, 1 },
|
|
Packit |
13e616 |
{ "dump_files_dir", OPT_OFFSET(dump_files_dir), opts_parse_charp, NULL, 0 },
|
|
Packit |
13e616 |
{ "lid_matrix_dump_file", OPT_OFFSET(lid_matrix_dump_file), opts_parse_charp, NULL, 0 },
|
|
Packit |
13e616 |
{ "lfts_file", OPT_OFFSET(lfts_file), opts_parse_charp, NULL, 0 },
|
|
Packit |
13e616 |
{ "root_guid_file", OPT_OFFSET(root_guid_file), opts_parse_charp, NULL, 0 },
|
|
Packit |
13e616 |
{ "cn_guid_file", OPT_OFFSET(cn_guid_file), opts_parse_charp, NULL, 0 },
|
|
Packit |
13e616 |
{ "io_guid_file", OPT_OFFSET(io_guid_file), opts_parse_charp, NULL, 0 },
|
|
Packit |
13e616 |
{ "port_shifting", OPT_OFFSET(port_shifting), opts_parse_boolean, NULL, 1 },
|
|
Packit |
13e616 |
{ "scatter_ports", OPT_OFFSET(scatter_ports), opts_parse_uint32, NULL, 1 },
|
|
Packit |
13e616 |
{ "max_reverse_hops", OPT_OFFSET(max_reverse_hops), opts_parse_uint16, NULL, 0 },
|
|
Packit |
13e616 |
{ "ids_guid_file", OPT_OFFSET(ids_guid_file), opts_parse_charp, NULL, 0 },
|
|
Packit |
13e616 |
{ "guid_routing_order_file", OPT_OFFSET(guid_routing_order_file), opts_parse_charp, NULL, 0 },
|
|
Packit |
13e616 |
{ "guid_routing_order_no_scatter", OPT_OFFSET(guid_routing_order_no_scatter), opts_parse_boolean, NULL, 0 },
|
|
Packit |
13e616 |
{ "sa_db_file", OPT_OFFSET(sa_db_file), opts_parse_charp, NULL, 0 },
|
|
Packit |
13e616 |
{ "sa_db_dump", OPT_OFFSET(sa_db_dump), opts_parse_boolean, NULL, 1 },
|
|
Packit |
13e616 |
{ "torus_config", OPT_OFFSET(torus_conf_file), opts_parse_charp, NULL, 1 },
|
|
Packit |
13e616 |
{ "do_mesh_analysis", OPT_OFFSET(do_mesh_analysis), opts_parse_boolean, NULL, 1 },
|
|
Packit |
13e616 |
{ "exit_on_fatal", OPT_OFFSET(exit_on_fatal), opts_parse_boolean, NULL, 1 },
|
|
Packit |
13e616 |
{ "honor_guid2lid_file", OPT_OFFSET(honor_guid2lid_file), opts_parse_boolean, NULL, 1 },
|
|
Packit |
13e616 |
{ "daemon", OPT_OFFSET(daemon), opts_parse_boolean, NULL, 0 },
|
|
Packit |
13e616 |
{ "sm_inactive", OPT_OFFSET(sm_inactive), opts_parse_boolean, NULL, 1 },
|
|
Packit |
13e616 |
{ "babbling_port_policy", OPT_OFFSET(babbling_port_policy), opts_parse_boolean, NULL, 1 },
|
|
Packit |
13e616 |
{ "drop_event_subscriptions", OPT_OFFSET(drop_event_subscriptions), opts_parse_boolean, NULL, 1 },
|
|
Packit |
13e616 |
{ "ipoib_mcgroup_creation_validation", OPT_OFFSET(ipoib_mcgroup_creation_validation), opts_parse_boolean, NULL, 1 },
|
|
Packit |
13e616 |
{ "mcgroup_join_validation", OPT_OFFSET(mcgroup_join_validation), opts_parse_boolean, NULL, 1 },
|
|
Packit |
13e616 |
{ "use_original_extended_sa_rates_only", OPT_OFFSET(use_original_extended_sa_rates_only), opts_parse_boolean, NULL, 1 },
|
|
Packit |
13e616 |
{ "use_optimized_slvl", OPT_OFFSET(use_optimized_slvl), opts_parse_boolean, NULL, 1 },
|
|
Packit |
13e616 |
{ "fsync_high_avail_files", OPT_OFFSET(fsync_high_avail_files), opts_parse_boolean, NULL, 1 },
|
|
Packit |
13e616 |
#ifdef ENABLE_OSM_PERF_MGR
|
|
Packit |
13e616 |
{ "perfmgr", OPT_OFFSET(perfmgr), opts_parse_boolean, NULL, 0 },
|
|
Packit |
13e616 |
{ "perfmgr_redir", OPT_OFFSET(perfmgr_redir), opts_parse_boolean, NULL, 0 },
|
|
Packit |
13e616 |
{ "perfmgr_sweep_time_s", OPT_OFFSET(perfmgr_sweep_time_s), opts_parse_uint16, NULL, 0 },
|
|
Packit |
13e616 |
{ "perfmgr_max_outstanding_queries", OPT_OFFSET(perfmgr_max_outstanding_queries), opts_parse_uint32, NULL, 0 },
|
|
Packit |
13e616 |
{ "perfmgr_ignore_cas", OPT_OFFSET(perfmgr_ignore_cas), opts_parse_boolean, NULL, 0 },
|
|
Packit |
13e616 |
{ "event_db_dump_file", OPT_OFFSET(event_db_dump_file), opts_parse_charp, NULL, 0 },
|
|
Packit |
13e616 |
{ "perfmgr_rm_nodes", OPT_OFFSET(perfmgr_rm_nodes), opts_parse_boolean, NULL, 0 },
|
|
Packit |
13e616 |
{ "perfmgr_log_errors", OPT_OFFSET(perfmgr_log_errors), opts_parse_boolean, NULL, 0 },
|
|
Packit |
13e616 |
{ "perfmgr_query_cpi", OPT_OFFSET(perfmgr_query_cpi), opts_parse_boolean, NULL, 0 },
|
|
Packit |
13e616 |
{ "perfmgr_xmit_wait_log", OPT_OFFSET(perfmgr_xmit_wait_log), opts_parse_boolean, NULL, 0 },
|
|
Packit |
13e616 |
{ "perfmgr_xmit_wait_threshold", OPT_OFFSET(perfmgr_xmit_wait_threshold), opts_parse_uint32, NULL, 0 },
|
|
Packit |
13e616 |
#endif /* ENABLE_OSM_PERF_MGR */
|
|
Packit |
13e616 |
{ "event_plugin_name", OPT_OFFSET(event_plugin_name), opts_parse_charp, NULL, 0 },
|
|
Packit |
13e616 |
{ "event_plugin_options", OPT_OFFSET(event_plugin_options), opts_parse_charp, NULL, 0 },
|
|
Packit |
13e616 |
{ "node_name_map_name", OPT_OFFSET(node_name_map_name), opts_parse_charp, NULL, 0 },
|
|
Packit |
13e616 |
{ "qos_max_vls", OPT_OFFSET(qos_options.max_vls), opts_parse_uint32, NULL, 1 },
|
|
Packit |
13e616 |
{ "qos_high_limit", OPT_OFFSET(qos_options.high_limit), opts_parse_int32, NULL, 1 },
|
|
Packit |
13e616 |
{ "qos_vlarb_high", OPT_OFFSET(qos_options.vlarb_high), opts_parse_charp, NULL, 1 },
|
|
Packit |
13e616 |
{ "qos_vlarb_low", OPT_OFFSET(qos_options.vlarb_low), opts_parse_charp, NULL, 1 },
|
|
Packit |
13e616 |
{ "qos_sl2vl", OPT_OFFSET(qos_options.sl2vl), opts_parse_charp, NULL, 1 },
|
|
Packit |
13e616 |
{ "qos_ca_max_vls", OPT_OFFSET(qos_ca_options.max_vls), opts_parse_uint32, NULL, 1 },
|
|
Packit |
13e616 |
{ "qos_ca_high_limit", OPT_OFFSET(qos_ca_options.high_limit), opts_parse_int32, NULL, 1 },
|
|
Packit |
13e616 |
{ "qos_ca_vlarb_high", OPT_OFFSET(qos_ca_options.vlarb_high), opts_parse_charp, NULL, 1 },
|
|
Packit |
13e616 |
{ "qos_ca_vlarb_low", OPT_OFFSET(qos_ca_options.vlarb_low), opts_parse_charp, NULL, 1 },
|
|
Packit |
13e616 |
{ "qos_ca_sl2vl", OPT_OFFSET(qos_ca_options.sl2vl), opts_parse_charp, NULL, 1 },
|
|
Packit |
13e616 |
{ "qos_sw0_max_vls", OPT_OFFSET(qos_sw0_options.max_vls), opts_parse_uint32, NULL, 1 },
|
|
Packit |
13e616 |
{ "qos_sw0_high_limit", OPT_OFFSET(qos_sw0_options.high_limit), opts_parse_int32, NULL, 1 },
|
|
Packit |
13e616 |
{ "qos_sw0_vlarb_high", OPT_OFFSET(qos_sw0_options.vlarb_high), opts_parse_charp, NULL, 1 },
|
|
Packit |
13e616 |
{ "qos_sw0_vlarb_low", OPT_OFFSET(qos_sw0_options.vlarb_low), opts_parse_charp, NULL, 1 },
|
|
Packit |
13e616 |
{ "qos_sw0_sl2vl", OPT_OFFSET(qos_sw0_options.sl2vl), opts_parse_charp, NULL, 1 },
|
|
Packit |
13e616 |
{ "qos_swe_max_vls", OPT_OFFSET(qos_swe_options.max_vls), opts_parse_uint32, NULL, 1 },
|
|
Packit |
13e616 |
{ "qos_swe_high_limit", OPT_OFFSET(qos_swe_options.high_limit), opts_parse_int32, NULL, 1 },
|
|
Packit |
13e616 |
{ "qos_swe_vlarb_high", OPT_OFFSET(qos_swe_options.vlarb_high), opts_parse_charp, NULL, 1 },
|
|
Packit |
13e616 |
{ "qos_swe_vlarb_low", OPT_OFFSET(qos_swe_options.vlarb_low), opts_parse_charp, NULL, 1 },
|
|
Packit |
13e616 |
{ "qos_swe_sl2vl", OPT_OFFSET(qos_swe_options.sl2vl), opts_parse_charp, NULL, 1 },
|
|
Packit |
13e616 |
{ "qos_rtr_max_vls", OPT_OFFSET(qos_rtr_options.max_vls), opts_parse_uint32, NULL, 1 },
|
|
Packit |
13e616 |
{ "qos_rtr_high_limit", OPT_OFFSET(qos_rtr_options.high_limit), opts_parse_int32, NULL, 1 },
|
|
Packit |
13e616 |
{ "qos_rtr_vlarb_high", OPT_OFFSET(qos_rtr_options.vlarb_high), opts_parse_charp, NULL, 1 },
|
|
Packit |
13e616 |
{ "qos_rtr_vlarb_low", OPT_OFFSET(qos_rtr_options.vlarb_low), opts_parse_charp, NULL, 1 },
|
|
Packit |
13e616 |
{ "qos_rtr_sl2vl", OPT_OFFSET(qos_rtr_options.sl2vl), opts_parse_charp, NULL, 1 },
|
|
Packit |
13e616 |
{ "congestion_control", OPT_OFFSET(congestion_control), opts_parse_boolean, NULL, 1 },
|
|
Packit |
13e616 |
{ "cc_key", OPT_OFFSET(cc_key), opts_parse_net64, NULL, 0},
|
|
Packit |
13e616 |
{ "cc_max_outstanding_mads", OPT_OFFSET(cc_max_outstanding_mads), opts_parse_uint32, NULL, 0 },
|
|
Packit |
13e616 |
{ "cc_sw_cong_setting_control_map", OPT_OFFSET(cc_sw_cong_setting_control_map), opts_parse_net32, NULL, 1},
|
|
Packit |
13e616 |
{ "cc_sw_cong_setting_victim_mask", OPT_OFFSET(cc_sw_cong_setting_victim_mask), opts_parse_256bit, NULL, 1},
|
|
Packit |
13e616 |
{ "cc_sw_cong_setting_credit_mask", OPT_OFFSET(cc_sw_cong_setting_credit_mask), opts_parse_256bit, NULL, 1},
|
|
Packit |
13e616 |
{ "cc_sw_cong_setting_threshold", OPT_OFFSET(cc_sw_cong_setting_threshold), opts_parse_uint8, NULL, 1},
|
|
Packit |
13e616 |
{ "cc_sw_cong_setting_packet_size", OPT_OFFSET(cc_sw_cong_setting_packet_size), opts_parse_uint8, NULL, 1},
|
|
Packit |
13e616 |
{ "cc_sw_cong_setting_credit_starvation_threshold", OPT_OFFSET(cc_sw_cong_setting_credit_starvation_threshold), opts_parse_uint8, NULL, 1},
|
|
Packit |
13e616 |
{ "cc_sw_cong_setting_credit_starvation_return_delay", OPT_OFFSET(cc_sw_cong_setting_credit_starvation_return_delay), opts_parse_cct_entry, NULL, 1},
|
|
Packit |
13e616 |
{ "cc_sw_cong_setting_marking_rate", OPT_OFFSET(cc_sw_cong_setting_marking_rate), opts_parse_net16, NULL, 1},
|
|
Packit |
13e616 |
{ "cc_ca_cong_setting_port_control", OPT_OFFSET(cc_ca_cong_setting_port_control), opts_parse_net16, NULL, 1},
|
|
Packit |
13e616 |
{ "cc_ca_cong_setting_control_map", OPT_OFFSET(cc_ca_cong_setting_control_map), opts_parse_net16, NULL, 1},
|
|
Packit |
13e616 |
{ "cc_ca_cong_setting_ccti_timer", OPT_OFFSET(cc_ca_cong_entries), opts_parse_ccti_timer, NULL, 1},
|
|
Packit |
13e616 |
{ "cc_ca_cong_setting_ccti_increase", OPT_OFFSET(cc_ca_cong_entries), opts_parse_ccti_increase, NULL, 1},
|
|
Packit |
13e616 |
{ "cc_ca_cong_setting_trigger_threshold", OPT_OFFSET(cc_ca_cong_entries), opts_parse_trigger_threshold, NULL, 1},
|
|
Packit |
13e616 |
{ "cc_ca_cong_setting_ccti_min", OPT_OFFSET(cc_ca_cong_entries), opts_parse_ccti_min, NULL, 1},
|
|
Packit |
13e616 |
{ "cc_cct", OPT_OFFSET(cc_cct), opts_parse_cc_cct, NULL, 1},
|
|
Packit |
13e616 |
{ "enable_quirks", OPT_OFFSET(enable_quirks), opts_parse_boolean, NULL, 1 },
|
|
Packit |
13e616 |
{ "no_clients_rereg", OPT_OFFSET(no_clients_rereg), opts_parse_boolean, NULL, 1 },
|
|
Packit |
13e616 |
{ "prefix_routes_file", OPT_OFFSET(prefix_routes_file), opts_parse_charp, NULL, 0 },
|
|
Packit |
13e616 |
{ "consolidate_ipv6_snm_req", OPT_OFFSET(consolidate_ipv6_snm_req), opts_parse_boolean, NULL, 1 },
|
|
Packit |
13e616 |
{ "lash_start_vl", OPT_OFFSET(lash_start_vl), opts_parse_uint8, NULL, 1 },
|
|
Packit |
13e616 |
{ "sm_sl", OPT_OFFSET(sm_sl), opts_parse_uint8, NULL, 1 },
|
|
Packit |
13e616 |
{ "nue_max_num_vls", OPT_OFFSET(nue_max_num_vls), opts_parse_uint8, NULL, 1 },
|
|
Packit |
13e616 |
{ "nue_include_switches", OPT_OFFSET(nue_include_switches), opts_parse_boolean, NULL, 0 },
|
|
Packit |
13e616 |
{ "log_prefix", OPT_OFFSET(log_prefix), opts_parse_charp, NULL, 1 },
|
|
Packit |
13e616 |
{ "per_module_logging_file", OPT_OFFSET(per_module_logging_file), opts_parse_charp, NULL, 0 },
|
|
Packit |
13e616 |
{ "quasi_ftree_indexing", OPT_OFFSET(quasi_ftree_indexing), opts_parse_boolean, NULL, 1 },
|
|
Packit |
13e616 |
{0}
|
|
Packit |
13e616 |
};
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static int compar_mgids(const void *m1, const void *m2)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
return memcmp(m1, m2, sizeof(ib_gid_t));
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void subn_validate_g2m(osm_subn_t *p_subn)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
cl_qlist_t guids;
|
|
Packit |
13e616 |
osm_db_guid_elem_t *p_item;
|
|
Packit |
13e616 |
uint64_t mkey;
|
|
Packit |
13e616 |
boolean_t valid_entry;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG_ENTER(&(p_subn->p_osm->log));
|
|
Packit |
13e616 |
cl_qlist_init(&guids);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (osm_db_guid2mkey_guids(p_subn->p_g2m, &guids)) {
|
|
Packit |
13e616 |
OSM_LOG(&(p_subn->p_osm->log), OSM_LOG_ERROR, "ERR 7506: "
|
|
Packit |
13e616 |
"could not get mkey guid list\n");
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
while ((p_item = (osm_db_guid_elem_t *) cl_qlist_remove_head(&guids))
|
|
Packit |
13e616 |
!= (osm_db_guid_elem_t *) cl_qlist_end(&guids)) {
|
|
Packit |
13e616 |
valid_entry = TRUE;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (p_item->guid == 0) {
|
|
Packit |
13e616 |
OSM_LOG(&(p_subn->p_osm->log), OSM_LOG_ERROR,
|
|
Packit |
13e616 |
"ERR 7507: found invalid zero guid");
|
|
Packit |
13e616 |
valid_entry = FALSE;
|
|
Packit |
13e616 |
} else if (osm_db_guid2mkey_get(p_subn->p_g2m, p_item->guid,
|
|
Packit |
13e616 |
&mkey)) {
|
|
Packit |
13e616 |
OSM_LOG(&(p_subn->p_osm->log), OSM_LOG_ERROR,
|
|
Packit |
13e616 |
"ERR 7508: could not get mkey for guid:0x%016"
|
|
Packit |
13e616 |
PRIx64 "\n", p_item->guid);
|
|
Packit |
13e616 |
valid_entry = FALSE;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (valid_entry == FALSE) {
|
|
Packit |
13e616 |
if (osm_db_guid2mkey_delete(p_subn->p_g2m,
|
|
Packit |
13e616 |
p_item->guid))
|
|
Packit |
13e616 |
OSM_LOG(&(p_subn->p_osm->log), OSM_LOG_ERROR,
|
|
Packit |
13e616 |
"ERR 7509: failed to delete entry for "
|
|
Packit |
13e616 |
"guid:0x%016" PRIx64 "\n",
|
|
Packit |
13e616 |
p_item->guid);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
free(p_item);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
Exit:
|
|
Packit |
13e616 |
OSM_LOG_EXIT(&(p_subn->p_osm->log));
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void subn_validate_neighbor(osm_subn_t *p_subn)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
cl_qlist_t entries;
|
|
Packit |
13e616 |
osm_db_neighbor_elem_t *p_item;
|
|
Packit |
13e616 |
boolean_t valid_entry;
|
|
Packit |
13e616 |
uint64_t guid;
|
|
Packit |
13e616 |
uint8_t port;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG_ENTER(&(p_subn->p_osm->log));
|
|
Packit |
13e616 |
cl_qlist_init(&entries);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (osm_db_neighbor_guids(p_subn->p_neighbor, &entries)) {
|
|
Packit |
13e616 |
OSM_LOG(&(p_subn->p_osm->log), OSM_LOG_ERROR, "ERR 7512: "
|
|
Packit |
13e616 |
"could not get neighbor entry list\n");
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
while ((p_item =
|
|
Packit |
13e616 |
(osm_db_neighbor_elem_t *) cl_qlist_remove_head(&entries))
|
|
Packit |
13e616 |
!= (osm_db_neighbor_elem_t *) cl_qlist_end(&entries)) {
|
|
Packit |
13e616 |
valid_entry = TRUE;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&(p_subn->p_osm->log), OSM_LOG_DEBUG,
|
|
Packit |
13e616 |
"Validating neighbor for guid:0x%016" PRIx64
|
|
Packit |
13e616 |
", port %d\n",
|
|
Packit |
13e616 |
p_item->guid, p_item->portnum);
|
|
Packit |
13e616 |
if (p_item->guid == 0) {
|
|
Packit |
13e616 |
OSM_LOG(&(p_subn->p_osm->log), OSM_LOG_ERROR,
|
|
Packit |
13e616 |
"ERR 7513: found invalid zero guid\n");
|
|
Packit |
13e616 |
valid_entry = FALSE;
|
|
Packit |
13e616 |
} else if (p_item->portnum == 0) {
|
|
Packit |
13e616 |
OSM_LOG(&(p_subn->p_osm->log), OSM_LOG_ERROR,
|
|
Packit |
13e616 |
"ERR 7514: found invalid zero port for "
|
|
Packit |
13e616 |
"guid: 0x%016" PRIx64 "\n",
|
|
Packit |
13e616 |
p_item->guid);
|
|
Packit |
13e616 |
valid_entry = FALSE;
|
|
Packit |
13e616 |
} else if (osm_db_neighbor_get(p_subn->p_neighbor,
|
|
Packit |
13e616 |
p_item->guid, p_item->portnum,
|
|
Packit |
13e616 |
&guid, &port)) {
|
|
Packit |
13e616 |
OSM_LOG(&(p_subn->p_osm->log), OSM_LOG_ERROR,
|
|
Packit |
13e616 |
"ERR 7515: could not find neighbor for "
|
|
Packit |
13e616 |
"guid: 0x%016" PRIx64 ", port %d\n",
|
|
Packit |
13e616 |
p_item->guid, p_item->portnum);
|
|
Packit |
13e616 |
valid_entry = FALSE;
|
|
Packit |
13e616 |
} else if (guid == 0) {
|
|
Packit |
13e616 |
OSM_LOG(&(p_subn->p_osm->log), OSM_LOG_ERROR,
|
|
Packit |
13e616 |
"ERR 7516: found invalid neighbor "
|
|
Packit |
13e616 |
"zero guid for guid: 0x%016" PRIx64
|
|
Packit |
13e616 |
", port %d\n",
|
|
Packit |
13e616 |
p_item->guid, p_item->portnum);
|
|
Packit |
13e616 |
valid_entry = FALSE;
|
|
Packit |
13e616 |
} else if (port == 0) {
|
|
Packit |
13e616 |
OSM_LOG(&(p_subn->p_osm->log), OSM_LOG_ERROR,
|
|
Packit |
13e616 |
"ERR 7517: found invalid neighbor "
|
|
Packit |
13e616 |
"zero port for guid: 0x%016" PRIx64
|
|
Packit |
13e616 |
", port %d\n",
|
|
Packit |
13e616 |
p_item->guid, p_item->portnum);
|
|
Packit |
13e616 |
valid_entry = FALSE;
|
|
Packit |
13e616 |
} else if (osm_db_neighbor_get(p_subn->p_neighbor,
|
|
Packit |
13e616 |
guid, port, &guid, &port) ||
|
|
Packit |
13e616 |
guid != p_item->guid || port != p_item->portnum) {
|
|
Packit |
13e616 |
OSM_LOG(&(p_subn->p_osm->log), OSM_LOG_ERROR,
|
|
Packit |
13e616 |
"ERR 7518: neighbor does not point "
|
|
Packit |
13e616 |
"back at us (guid: 0x%016" PRIx64
|
|
Packit |
13e616 |
", port %d)\n",
|
|
Packit |
13e616 |
p_item->guid, p_item->portnum);
|
|
Packit |
13e616 |
valid_entry = FALSE;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (valid_entry == FALSE) {
|
|
Packit |
13e616 |
if (osm_db_neighbor_delete(p_subn->p_neighbor,
|
|
Packit |
13e616 |
p_item->guid,
|
|
Packit |
13e616 |
p_item->portnum))
|
|
Packit |
13e616 |
OSM_LOG(&(p_subn->p_osm->log), OSM_LOG_ERROR,
|
|
Packit |
13e616 |
"ERR 7519: failed to delete entry for "
|
|
Packit |
13e616 |
"guid:0x%016" PRIx64 " port:%u\n",
|
|
Packit |
13e616 |
p_item->guid, p_item->portnum);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
free(p_item);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
Exit:
|
|
Packit |
13e616 |
OSM_LOG_EXIT(&(p_subn->p_osm->log));
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
void osm_subn_construct(IN osm_subn_t * p_subn)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
memset(p_subn, 0, sizeof(*p_subn));
|
|
Packit |
13e616 |
cl_ptr_vector_construct(&p_subn->port_lid_tbl);
|
|
Packit |
13e616 |
cl_qmap_init(&p_subn->sw_guid_tbl);
|
|
Packit |
13e616 |
cl_qmap_init(&p_subn->node_guid_tbl);
|
|
Packit |
13e616 |
cl_qmap_init(&p_subn->port_guid_tbl);
|
|
Packit |
13e616 |
cl_qmap_init(&p_subn->alias_port_guid_tbl);
|
|
Packit |
13e616 |
cl_qmap_init(&p_subn->assigned_guids_tbl);
|
|
Packit |
13e616 |
cl_qmap_init(&p_subn->sm_guid_tbl);
|
|
Packit |
13e616 |
cl_qlist_init(&p_subn->sa_sr_list);
|
|
Packit |
13e616 |
cl_qlist_init(&p_subn->sa_infr_list);
|
|
Packit |
13e616 |
cl_qlist_init(&p_subn->alias_guid_list);
|
|
Packit |
13e616 |
cl_qlist_init(&p_subn->prefix_routes_list);
|
|
Packit |
13e616 |
cl_qmap_init(&p_subn->rtr_guid_tbl);
|
|
Packit |
13e616 |
cl_qmap_init(&p_subn->prtn_pkey_tbl);
|
|
Packit |
13e616 |
cl_fmap_init(&p_subn->mgrp_mgid_tbl, compar_mgids);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void subn_destroy_qos_options(osm_qos_options_t *opt)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
free(opt->vlarb_high);
|
|
Packit |
13e616 |
free(opt->vlarb_low);
|
|
Packit |
13e616 |
free(opt->sl2vl);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void subn_opt_destroy(IN osm_subn_opt_t * p_opt)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
free(p_opt->console);
|
|
Packit |
13e616 |
free(p_opt->port_prof_ignore_file);
|
|
Packit |
13e616 |
free(p_opt->hop_weights_file);
|
|
Packit |
13e616 |
free(p_opt->port_search_ordering_file);
|
|
Packit |
13e616 |
free(p_opt->routing_engine_names);
|
|
Packit |
13e616 |
free(p_opt->log_file);
|
|
Packit |
13e616 |
free(p_opt->partition_config_file);
|
|
Packit |
13e616 |
free(p_opt->qos_policy_file);
|
|
Packit |
13e616 |
free(p_opt->dump_files_dir);
|
|
Packit |
13e616 |
free(p_opt->part_enforce);
|
|
Packit |
13e616 |
free(p_opt->lid_matrix_dump_file);
|
|
Packit |
13e616 |
free(p_opt->lfts_file);
|
|
Packit |
13e616 |
free(p_opt->root_guid_file);
|
|
Packit |
13e616 |
free(p_opt->cn_guid_file);
|
|
Packit |
13e616 |
free(p_opt->io_guid_file);
|
|
Packit |
13e616 |
free(p_opt->ids_guid_file);
|
|
Packit |
13e616 |
free(p_opt->guid_routing_order_file);
|
|
Packit |
13e616 |
free(p_opt->sa_db_file);
|
|
Packit |
13e616 |
free(p_opt->torus_conf_file);
|
|
Packit |
13e616 |
#ifdef ENABLE_OSM_PERF_MGR
|
|
Packit |
13e616 |
free(p_opt->event_db_dump_file);
|
|
Packit |
13e616 |
#endif /* ENABLE_OSM_PERF_MGR */
|
|
Packit |
13e616 |
free(p_opt->event_plugin_name);
|
|
Packit |
13e616 |
free(p_opt->event_plugin_options);
|
|
Packit |
13e616 |
free(p_opt->node_name_map_name);
|
|
Packit |
13e616 |
free(p_opt->prefix_routes_file);
|
|
Packit |
13e616 |
free(p_opt->log_prefix);
|
|
Packit |
13e616 |
free(p_opt->per_module_logging_file);
|
|
Packit |
13e616 |
subn_destroy_qos_options(&p_opt->qos_options);
|
|
Packit |
13e616 |
subn_destroy_qos_options(&p_opt->qos_ca_options);
|
|
Packit |
13e616 |
subn_destroy_qos_options(&p_opt->qos_sw0_options);
|
|
Packit |
13e616 |
subn_destroy_qos_options(&p_opt->qos_swe_options);
|
|
Packit |
13e616 |
subn_destroy_qos_options(&p_opt->qos_rtr_options);
|
|
Packit |
13e616 |
free(p_opt->cc_cct.input_str);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
void osm_subn_destroy(IN osm_subn_t * p_subn)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
int i;
|
|
Packit |
13e616 |
osm_node_t *p_node, *p_next_node;
|
|
Packit |
13e616 |
osm_assigned_guids_t *p_assigned_guids, *p_next_assigned_guids;
|
|
Packit |
13e616 |
osm_alias_guid_t *p_alias_guid, *p_next_alias_guid;
|
|
Packit |
13e616 |
osm_port_t *p_port, *p_next_port;
|
|
Packit |
13e616 |
osm_switch_t *p_sw, *p_next_sw;
|
|
Packit |
13e616 |
osm_remote_sm_t *p_rsm, *p_next_rsm;
|
|
Packit |
13e616 |
osm_prtn_t *p_prtn, *p_next_prtn;
|
|
Packit |
13e616 |
osm_infr_t *p_infr, *p_next_infr;
|
|
Packit |
13e616 |
osm_svcr_t *p_svcr, *p_next_svcr;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* it might be a good idea to de-allocate all known objects */
|
|
Packit |
13e616 |
p_next_node = (osm_node_t *) cl_qmap_head(&p_subn->node_guid_tbl);
|
|
Packit |
13e616 |
while (p_next_node !=
|
|
Packit |
13e616 |
(osm_node_t *) cl_qmap_end(&p_subn->node_guid_tbl)) {
|
|
Packit |
13e616 |
p_node = p_next_node;
|
|
Packit |
13e616 |
p_next_node = (osm_node_t *) cl_qmap_next(&p_node->map_item);
|
|
Packit |
13e616 |
osm_node_delete(&p_node);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_next_assigned_guids = (osm_assigned_guids_t *) cl_qmap_head(&p_subn->assigned_guids_tbl);
|
|
Packit |
13e616 |
while (p_next_assigned_guids !=
|
|
Packit |
13e616 |
(osm_assigned_guids_t *) cl_qmap_end(&p_subn->assigned_guids_tbl)) {
|
|
Packit |
13e616 |
p_assigned_guids = p_next_assigned_guids;
|
|
Packit |
13e616 |
p_next_assigned_guids = (osm_assigned_guids_t *) cl_qmap_next(&p_assigned_guids->map_item);
|
|
Packit |
13e616 |
osm_assigned_guids_delete(&p_assigned_guids);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_next_alias_guid = (osm_alias_guid_t *) cl_qmap_head(&p_subn->alias_port_guid_tbl);
|
|
Packit |
13e616 |
while (p_next_alias_guid !=
|
|
Packit |
13e616 |
(osm_alias_guid_t *) cl_qmap_end(&p_subn->alias_port_guid_tbl)) {
|
|
Packit |
13e616 |
p_alias_guid = p_next_alias_guid;
|
|
Packit |
13e616 |
p_next_alias_guid = (osm_alias_guid_t *) cl_qmap_next(&p_alias_guid->map_item);
|
|
Packit |
13e616 |
osm_alias_guid_delete(&p_alias_guid);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
while (cl_qlist_count(&p_subn->alias_guid_list))
|
|
Packit |
13e616 |
osm_guid_work_obj_delete((osm_guidinfo_work_obj_t *) cl_qlist_remove_head(&p_subn->alias_guid_list));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_next_port = (osm_port_t *) cl_qmap_head(&p_subn->port_guid_tbl);
|
|
Packit |
13e616 |
while (p_next_port !=
|
|
Packit |
13e616 |
(osm_port_t *) cl_qmap_end(&p_subn->port_guid_tbl)) {
|
|
Packit |
13e616 |
p_port = p_next_port;
|
|
Packit |
13e616 |
p_next_port = (osm_port_t *) cl_qmap_next(&p_port->map_item);
|
|
Packit |
13e616 |
osm_port_delete(&p_port);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_next_sw = (osm_switch_t *) cl_qmap_head(&p_subn->sw_guid_tbl);
|
|
Packit |
13e616 |
while (p_next_sw != (osm_switch_t *) cl_qmap_end(&p_subn->sw_guid_tbl)) {
|
|
Packit |
13e616 |
p_sw = p_next_sw;
|
|
Packit |
13e616 |
p_next_sw = (osm_switch_t *) cl_qmap_next(&p_sw->map_item);
|
|
Packit |
13e616 |
osm_switch_delete(&p_sw);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_next_rsm = (osm_remote_sm_t *) cl_qmap_head(&p_subn->sm_guid_tbl);
|
|
Packit |
13e616 |
while (p_next_rsm !=
|
|
Packit |
13e616 |
(osm_remote_sm_t *) cl_qmap_end(&p_subn->sm_guid_tbl)) {
|
|
Packit |
13e616 |
p_rsm = p_next_rsm;
|
|
Packit |
13e616 |
p_next_rsm = (osm_remote_sm_t *) cl_qmap_next(&p_rsm->map_item);
|
|
Packit |
13e616 |
free(p_rsm);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_next_prtn = (osm_prtn_t *) cl_qmap_head(&p_subn->prtn_pkey_tbl);
|
|
Packit |
13e616 |
while (p_next_prtn !=
|
|
Packit |
13e616 |
(osm_prtn_t *) cl_qmap_end(&p_subn->prtn_pkey_tbl)) {
|
|
Packit |
13e616 |
p_prtn = p_next_prtn;
|
|
Packit |
13e616 |
p_next_prtn = (osm_prtn_t *) cl_qmap_next(&p_prtn->map_item);
|
|
Packit |
13e616 |
osm_prtn_delete(p_subn, &p_prtn);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
cl_fmap_remove_all(&p_subn->mgrp_mgid_tbl);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
for (i = 0; i <= p_subn->max_mcast_lid_ho - IB_LID_MCAST_START_HO;
|
|
Packit |
13e616 |
i++)
|
|
Packit |
13e616 |
if (p_subn->mboxes[i])
|
|
Packit |
13e616 |
osm_mgrp_box_delete(p_subn->mboxes[i]);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_next_infr = (osm_infr_t *) cl_qlist_head(&p_subn->sa_infr_list);
|
|
Packit |
13e616 |
while (p_next_infr !=
|
|
Packit |
13e616 |
(osm_infr_t *) cl_qlist_end(&p_subn->sa_infr_list)) {
|
|
Packit |
13e616 |
p_infr = p_next_infr;
|
|
Packit |
13e616 |
p_next_infr = (osm_infr_t *) cl_qlist_next(&p_infr->list_item);
|
|
Packit |
13e616 |
osm_infr_delete(p_infr);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_next_svcr = (osm_svcr_t *) cl_qlist_head(&p_subn->sa_sr_list);
|
|
Packit |
13e616 |
while (p_next_svcr !=
|
|
Packit |
13e616 |
(osm_svcr_t *) cl_qlist_end(&p_subn->sa_sr_list)) {
|
|
Packit |
13e616 |
p_svcr = p_next_svcr;
|
|
Packit |
13e616 |
p_next_svcr = (osm_svcr_t *) cl_qlist_next(&p_svcr->list_item);
|
|
Packit |
13e616 |
osm_svcr_delete(p_svcr);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
cl_ptr_vector_destroy(&p_subn->port_lid_tbl);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
osm_qos_policy_destroy(p_subn->p_qos_policy);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
while (!cl_is_qlist_empty(&p_subn->prefix_routes_list)) {
|
|
Packit |
13e616 |
cl_list_item_t *item = cl_qlist_remove_head(&p_subn->prefix_routes_list);
|
|
Packit |
13e616 |
free(item);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
subn_opt_destroy(&p_subn->opt);
|
|
Packit |
13e616 |
free(p_subn->opt.file_opts);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
ib_api_status_t osm_subn_init(IN osm_subn_t * p_subn, IN osm_opensm_t * p_osm,
|
|
Packit |
13e616 |
IN const osm_subn_opt_t * p_opt)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
cl_status_t status;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_subn->p_osm = p_osm;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = cl_ptr_vector_init(&p_subn->port_lid_tbl,
|
|
Packit |
13e616 |
OSM_SUBNET_VECTOR_MIN_SIZE,
|
|
Packit |
13e616 |
OSM_SUBNET_VECTOR_GROW_SIZE);
|
|
Packit |
13e616 |
if (status != CL_SUCCESS)
|
|
Packit |
13e616 |
return status;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = cl_ptr_vector_set_capacity(&p_subn->port_lid_tbl,
|
|
Packit |
13e616 |
OSM_SUBNET_VECTOR_CAPACITY);
|
|
Packit |
13e616 |
if (status != CL_SUCCESS)
|
|
Packit |
13e616 |
return status;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
LID zero is not valid. NULL out this entry for the
|
|
Packit |
13e616 |
convenience of other code.
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
cl_ptr_vector_set(&p_subn->port_lid_tbl, 0, NULL);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_subn->opt = *p_opt;
|
|
Packit |
13e616 |
p_subn->max_ucast_lid_ho = IB_LID_UCAST_END_HO;
|
|
Packit |
13e616 |
p_subn->max_mcast_lid_ho = IB_LID_MCAST_END_HO;
|
|
Packit |
13e616 |
p_subn->min_ca_mtu = IB_MAX_MTU;
|
|
Packit |
13e616 |
p_subn->min_ca_rate = IB_PATH_RECORD_RATE_300_GBS;
|
|
Packit |
13e616 |
p_subn->min_data_vls = IB_MAX_NUM_VLS - 1;
|
|
Packit |
13e616 |
p_subn->min_sw_data_vls = IB_MAX_NUM_VLS - 1;
|
|
Packit |
13e616 |
p_subn->ignore_existing_lfts = TRUE;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* we assume master by default - so we only need to set it true if STANDBY */
|
|
Packit |
13e616 |
p_subn->coming_out_of_standby = FALSE;
|
|
Packit |
13e616 |
p_subn->sweeping_enabled = TRUE;
|
|
Packit |
13e616 |
p_subn->last_sm_port_state = 1;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Initialize the guid2mkey database */
|
|
Packit |
13e616 |
p_subn->p_g2m = osm_db_domain_init(&(p_osm->db), "guid2mkey");
|
|
Packit |
13e616 |
if (!p_subn->p_g2m) {
|
|
Packit |
13e616 |
OSM_LOG(&(p_osm->log), OSM_LOG_ERROR, "ERR 7510: "
|
|
Packit |
13e616 |
"Error initializing Guid-to-MKey persistent database\n");
|
|
Packit |
13e616 |
return IB_ERROR;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (osm_db_restore(p_subn->p_g2m)) {
|
|
Packit |
13e616 |
#ifndef __WIN__
|
|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
* When Windows is BSODing, it might corrupt files that
|
|
Packit |
13e616 |
* were previously opened for writing, even if the files
|
|
Packit |
13e616 |
* are closed, so we might see corrupted guid2mkey file.
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
if (p_subn->opt.exit_on_fatal) {
|
|
Packit |
13e616 |
osm_log(&(p_osm->log), OSM_LOG_SYS,
|
|
Packit |
13e616 |
"FATAL: Error restoring Guid-to-Mkey "
|
|
Packit |
13e616 |
"persistent database\n");
|
|
Packit |
13e616 |
return IB_ERROR;
|
|
Packit |
13e616 |
} else
|
|
Packit |
13e616 |
#endif
|
|
Packit |
13e616 |
OSM_LOG(&(p_osm->log), OSM_LOG_ERROR,
|
|
Packit |
13e616 |
"ERR 7511: Error restoring Guid-to-Mkey "
|
|
Packit |
13e616 |
"persistent database\n");
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
subn_validate_g2m(p_subn);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Initialize the neighbor database */
|
|
Packit |
13e616 |
p_subn->p_neighbor = osm_db_domain_init(&(p_osm->db), "neighbors");
|
|
Packit |
13e616 |
if (!p_subn->p_neighbor) {
|
|
Packit |
13e616 |
OSM_LOG(&(p_osm->log), OSM_LOG_ERROR, "ERR 7520: Error "
|
|
Packit |
13e616 |
"initializing neighbor link persistent database\n");
|
|
Packit |
13e616 |
return IB_ERROR;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (osm_db_restore(p_subn->p_neighbor)) {
|
|
Packit |
13e616 |
#ifndef __WIN__
|
|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
* When Windows is BSODing, it might corrupt files that
|
|
Packit |
13e616 |
* were previously opened for writing, even if the files
|
|
Packit |
13e616 |
* are closed, so we might see corrupted neighbors file.
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
if (p_subn->opt.exit_on_fatal) {
|
|
Packit |
13e616 |
osm_log(&(p_osm->log), OSM_LOG_SYS,
|
|
Packit |
13e616 |
"FATAL: Error restoring neighbor link "
|
|
Packit |
13e616 |
"persistent database\n");
|
|
Packit |
13e616 |
return IB_ERROR;
|
|
Packit |
13e616 |
} else
|
|
Packit |
13e616 |
#endif
|
|
Packit |
13e616 |
OSM_LOG(&(p_osm->log), OSM_LOG_ERROR,
|
|
Packit |
13e616 |
"ERR 7521: Error restoring neighbor link "
|
|
Packit |
13e616 |
"persistent database\n");
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
subn_validate_neighbor(p_subn);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
return IB_SUCCESS;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
osm_port_t *osm_get_port_by_mad_addr(IN osm_log_t * p_log,
|
|
Packit |
13e616 |
IN const osm_subn_t * p_subn,
|
|
Packit |
13e616 |
IN osm_mad_addr_t * p_mad_addr)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
osm_port_t *port = osm_get_port_by_lid(p_subn, p_mad_addr->dest_lid);
|
|
Packit |
13e616 |
if (!port)
|
|
Packit |
13e616 |
OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 7504: "
|
|
Packit |
13e616 |
"Lid is out of range: %u\n",
|
|
Packit |
13e616 |
cl_ntoh16(p_mad_addr->dest_lid));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
return port;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
ib_api_status_t osm_get_gid_by_mad_addr(IN osm_log_t * p_log,
|
|
Packit |
13e616 |
IN const osm_subn_t * p_subn,
|
|
Packit |
13e616 |
IN osm_mad_addr_t * p_mad_addr,
|
|
Packit |
13e616 |
OUT ib_gid_t * p_gid)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
const osm_port_t *p_port;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (p_gid == NULL) {
|
|
Packit |
13e616 |
OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 7505: "
|
|
Packit |
13e616 |
"Provided output GID is NULL\n");
|
|
Packit |
13e616 |
return IB_INVALID_PARAMETER;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_port = osm_get_port_by_mad_addr(p_log, p_subn, p_mad_addr);
|
|
Packit |
13e616 |
if (!p_port)
|
|
Packit |
13e616 |
return IB_INVALID_PARAMETER;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_gid->unicast.interface_id = p_port->p_physp->port_guid;
|
|
Packit |
13e616 |
p_gid->unicast.prefix = p_subn->opt.subnet_prefix;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
return IB_SUCCESS;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
osm_physp_t *osm_get_physp_by_mad_addr(IN osm_log_t * p_log,
|
|
Packit |
13e616 |
IN const osm_subn_t * p_subn,
|
|
Packit |
13e616 |
IN osm_mad_addr_t * p_mad_addr)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
osm_port_t *p_port;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_port = osm_get_port_by_mad_addr(p_log, p_subn, p_mad_addr);
|
|
Packit |
13e616 |
if (!p_port)
|
|
Packit |
13e616 |
return NULL;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
return p_port->p_physp;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
osm_switch_t *osm_get_switch_by_guid(IN const osm_subn_t * p_subn,
|
|
Packit |
13e616 |
IN ib_net64_t guid)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
osm_switch_t *p_switch;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_switch = (osm_switch_t *) cl_qmap_get(&(p_subn->sw_guid_tbl), guid);
|
|
Packit |
13e616 |
if (p_switch == (osm_switch_t *) cl_qmap_end(&(p_subn->sw_guid_tbl)))
|
|
Packit |
13e616 |
p_switch = NULL;
|
|
Packit |
13e616 |
return p_switch;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
osm_node_t *osm_get_node_by_guid(IN osm_subn_t const *p_subn, IN ib_net64_t guid)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
osm_node_t *p_node;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_node = (osm_node_t *) cl_qmap_get(&(p_subn->node_guid_tbl), guid);
|
|
Packit |
13e616 |
if (p_node == (osm_node_t *) cl_qmap_end(&(p_subn->node_guid_tbl)))
|
|
Packit |
13e616 |
p_node = NULL;
|
|
Packit |
13e616 |
return p_node;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
osm_port_t *osm_get_port_by_guid(IN osm_subn_t const *p_subn, IN ib_net64_t guid)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
osm_port_t *p_port;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_port = (osm_port_t *) cl_qmap_get(&(p_subn->port_guid_tbl), guid);
|
|
Packit |
13e616 |
if (p_port == (osm_port_t *) cl_qmap_end(&(p_subn->port_guid_tbl)))
|
|
Packit |
13e616 |
p_port = NULL;
|
|
Packit |
13e616 |
return p_port;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
osm_alias_guid_t *osm_get_alias_guid_by_guid(IN osm_subn_t const *p_subn,
|
|
Packit |
13e616 |
IN ib_net64_t guid)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
osm_alias_guid_t *p_alias_guid;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_alias_guid = (osm_alias_guid_t *) cl_qmap_get(&(p_subn->alias_port_guid_tbl), guid);
|
|
Packit |
13e616 |
if (p_alias_guid == (osm_alias_guid_t *) cl_qmap_end(&(p_subn->alias_port_guid_tbl)))
|
|
Packit |
13e616 |
return NULL;
|
|
Packit |
13e616 |
return p_alias_guid;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
osm_port_t *osm_get_port_by_alias_guid(IN osm_subn_t const *p_subn,
|
|
Packit |
13e616 |
IN ib_net64_t guid)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
osm_alias_guid_t *p_alias_guid;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_alias_guid = osm_get_alias_guid_by_guid(p_subn, guid);
|
|
Packit |
13e616 |
if (!p_alias_guid)
|
|
Packit |
13e616 |
return NULL;
|
|
Packit |
13e616 |
return p_alias_guid->p_base_port;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
osm_assigned_guids_t *osm_assigned_guids_new(IN const ib_net64_t port_guid,
|
|
Packit |
13e616 |
IN const uint32_t num_guids)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
osm_assigned_guids_t *p_assigned_guids;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_assigned_guids = calloc(1, sizeof(*p_assigned_guids) +
|
|
Packit |
13e616 |
sizeof(ib_net64_t) * (num_guids - 1));
|
|
Packit |
13e616 |
if (p_assigned_guids)
|
|
Packit |
13e616 |
p_assigned_guids->port_guid = port_guid;
|
|
Packit |
13e616 |
return p_assigned_guids;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
void osm_assigned_guids_delete(IN OUT osm_assigned_guids_t ** pp_assigned_guids)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
free(*pp_assigned_guids);
|
|
Packit |
13e616 |
*pp_assigned_guids = NULL;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
osm_assigned_guids_t *osm_get_assigned_guids_by_guid(IN osm_subn_t const *p_subn,
|
|
Packit |
13e616 |
IN ib_net64_t port_guid)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
osm_assigned_guids_t *p_assigned_guids;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_assigned_guids = (osm_assigned_guids_t *) cl_qmap_get(&(p_subn->assigned_guids_tbl), port_guid);
|
|
Packit |
13e616 |
if (p_assigned_guids == (osm_assigned_guids_t *) cl_qmap_end(&(p_subn->assigned_guids_tbl)))
|
|
Packit |
13e616 |
return NULL;
|
|
Packit |
13e616 |
return p_assigned_guids;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
osm_port_t *osm_get_port_by_lid_ho(IN osm_subn_t const * subn, IN uint16_t lid)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
if (lid < cl_ptr_vector_get_size(&subn->port_lid_tbl))
|
|
Packit |
13e616 |
return cl_ptr_vector_get(&subn->port_lid_tbl, lid);
|
|
Packit |
13e616 |
return NULL;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
osm_mgrp_t *osm_get_mgrp_by_mgid(IN osm_subn_t * subn, IN ib_gid_t * mgid)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
osm_mgrp_t *mgrp;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
mgrp = (osm_mgrp_t *)cl_fmap_get(&subn->mgrp_mgid_tbl, mgid);
|
|
Packit |
13e616 |
if (mgrp != (osm_mgrp_t *)cl_fmap_end(&subn->mgrp_mgid_tbl))
|
|
Packit |
13e616 |
return mgrp;
|
|
Packit |
13e616 |
return NULL;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
int is_mlnx_ext_port_info_supported(ib_net32_t vendid, ib_net16_t devid)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
uint32_t vendid_ho;
|
|
Packit |
13e616 |
uint16_t devid_ho;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
devid_ho = cl_ntoh16(devid);
|
|
Packit |
13e616 |
if ((devid_ho >= 0xc738 && devid_ho <= 0xc73b) ||
|
|
Packit |
13e616 |
devid_ho == 0xc839 || devid_ho == 0xcb20 ||
|
|
Packit |
13e616 |
devid_ho == 0xcf08 || devid_ho == 0xcf09 || devid_ho == 0xd2f0)
|
|
Packit |
13e616 |
return 1;
|
|
Packit |
13e616 |
if (devid_ho >= 0x1003 && devid_ho <= 0x101b)
|
|
Packit |
13e616 |
return 1;
|
|
Packit |
13e616 |
if (devid_ho == 0xa2d2)
|
|
Packit |
13e616 |
return 1;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
vendid_ho = cl_ntoh32(vendid);
|
|
Packit |
13e616 |
if (vendid_ho == 0x119f) {
|
|
Packit |
13e616 |
/* Bull Switch-X */
|
|
Packit |
13e616 |
if (devid_ho == 0x1b02 || devid_ho == 0x1b50)
|
|
Packit |
13e616 |
return 1;
|
|
Packit |
13e616 |
/* Bull Switch-IB/IB2 */
|
|
Packit |
13e616 |
if (devid_ho == 0x1ba0 ||
|
|
Packit |
13e616 |
(devid_ho >= 0x1bd0 && devid_ho <= 0x1bd5))
|
|
Packit |
13e616 |
return 1;
|
|
Packit |
13e616 |
/* Bull Quantum */
|
|
Packit |
13e616 |
if (devid_ho == 0x1bf0)
|
|
Packit |
13e616 |
return 1;
|
|
Packit |
13e616 |
/* Bull Connect-X3 */
|
|
Packit |
13e616 |
if (devid_ho == 0x1b33 || devid_ho == 0x1b73 ||
|
|
Packit |
13e616 |
devid_ho == 0x1b40 || devid_ho == 0x1b41 ||
|
|
Packit |
13e616 |
devid_ho == 0x1b60 || devid_ho == 0x1b61)
|
|
Packit |
13e616 |
return 1;
|
|
Packit |
13e616 |
/* Bull Connect-IB */
|
|
Packit |
13e616 |
if (devid_ho == 0x1b83 ||
|
|
Packit |
13e616 |
devid_ho == 0x1b93 || devid_ho == 0x1b94)
|
|
Packit |
13e616 |
return 1;
|
|
Packit |
13e616 |
/* Bull Connect-X4, Sequana HDR and HDR100 */
|
|
Packit |
13e616 |
if (devid_ho == 0x1bb4 || devid_ho == 0x1bb5 ||
|
|
Packit |
13e616 |
(devid_ho >= 0x1bc4 && devid_ho <= 0x1bc6))
|
|
Packit |
13e616 |
return 1;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
return 0;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void subn_init_qos_options(osm_qos_options_t *opt, osm_qos_options_t *f)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
opt->max_vls = 0;
|
|
Packit |
13e616 |
opt->high_limit = -1;
|
|
Packit |
13e616 |
if (opt->vlarb_high)
|
|
Packit |
13e616 |
free(opt->vlarb_high);
|
|
Packit |
13e616 |
opt->vlarb_high = NULL;
|
|
Packit |
13e616 |
if (opt->vlarb_low)
|
|
Packit |
13e616 |
free(opt->vlarb_low);
|
|
Packit |
13e616 |
opt->vlarb_low = NULL;
|
|
Packit |
13e616 |
if (opt->sl2vl)
|
|
Packit |
13e616 |
free(opt->sl2vl);
|
|
Packit |
13e616 |
opt->sl2vl = NULL;
|
|
Packit |
13e616 |
if (f)
|
|
Packit |
13e616 |
memcpy(f, opt, sizeof(*f));
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
void osm_subn_set_default_opt(IN osm_subn_opt_t * p_opt)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
memset(p_opt, 0, sizeof(osm_subn_opt_t));
|
|
Packit |
13e616 |
p_opt->guid = 0;
|
|
Packit |
13e616 |
p_opt->m_key = OSM_DEFAULT_M_KEY;
|
|
Packit |
13e616 |
p_opt->sm_key = OSM_DEFAULT_SM_KEY;
|
|
Packit |
13e616 |
p_opt->sa_key = OSM_DEFAULT_SA_KEY;
|
|
Packit |
13e616 |
p_opt->subnet_prefix = IB_DEFAULT_SUBNET_PREFIX;
|
|
Packit |
13e616 |
p_opt->m_key_lease_period = 0;
|
|
Packit |
13e616 |
p_opt->m_key_protect_bits = 0;
|
|
Packit |
13e616 |
p_opt->m_key_lookup = TRUE;
|
|
Packit |
13e616 |
p_opt->sweep_interval = OSM_DEFAULT_SWEEP_INTERVAL_SECS;
|
|
Packit |
13e616 |
p_opt->max_wire_smps = OSM_DEFAULT_SMP_MAX_ON_WIRE;
|
|
Packit |
13e616 |
p_opt->max_wire_smps2 = p_opt->max_wire_smps;
|
|
Packit |
13e616 |
p_opt->console = strdup(OSM_DEFAULT_CONSOLE);
|
|
Packit |
13e616 |
p_opt->console_port = OSM_DEFAULT_CONSOLE_PORT;
|
|
Packit |
13e616 |
p_opt->transaction_timeout = OSM_DEFAULT_TRANS_TIMEOUT_MILLISEC;
|
|
Packit |
13e616 |
p_opt->transaction_retries = OSM_DEFAULT_RETRY_COUNT;
|
|
Packit |
13e616 |
p_opt->long_transaction_timeout = OSM_DEFAULT_LONG_TRANS_TIMEOUT_MILLISEC;
|
|
Packit |
13e616 |
p_opt->max_smps_timeout = 1000 * p_opt->transaction_timeout *
|
|
Packit |
13e616 |
p_opt->transaction_retries;
|
|
Packit |
13e616 |
/* by default we will consider waiting for 50x transaction timeout normal */
|
|
Packit |
13e616 |
p_opt->max_msg_fifo_timeout = 50 * OSM_DEFAULT_TRANS_TIMEOUT_MILLISEC;
|
|
Packit |
13e616 |
p_opt->sm_priority = OSM_DEFAULT_SM_PRIORITY;
|
|
Packit |
13e616 |
p_opt->lmc = OSM_DEFAULT_LMC;
|
|
Packit |
13e616 |
p_opt->lmc_esp0 = FALSE;
|
|
Packit |
13e616 |
p_opt->max_op_vls = OSM_DEFAULT_MAX_OP_VLS;
|
|
Packit |
13e616 |
p_opt->force_link_speed = IB_LINK_SPEED_SET_LSS;
|
|
Packit |
13e616 |
p_opt->force_link_speed_ext = IB_LINK_SPEED_EXT_SET_LSES;
|
|
Packit |
13e616 |
p_opt->force_link_width = IB_LINK_WIDTH_SET_LWS;
|
|
Packit |
13e616 |
p_opt->fdr10 = 1;
|
|
Packit |
13e616 |
p_opt->reassign_lids = FALSE;
|
|
Packit |
13e616 |
p_opt->ignore_other_sm = FALSE;
|
|
Packit |
13e616 |
p_opt->single_thread = FALSE;
|
|
Packit |
13e616 |
p_opt->disable_multicast = FALSE;
|
|
Packit |
13e616 |
p_opt->force_log_flush = FALSE;
|
|
Packit |
13e616 |
p_opt->subnet_timeout = OSM_DEFAULT_SUBNET_TIMEOUT;
|
|
Packit |
13e616 |
p_opt->packet_life_time = OSM_DEFAULT_SWITCH_PACKET_LIFE;
|
|
Packit |
13e616 |
p_opt->vl_stall_count = OSM_DEFAULT_VL_STALL_COUNT;
|
|
Packit |
13e616 |
p_opt->leaf_vl_stall_count = OSM_DEFAULT_LEAF_VL_STALL_COUNT;
|
|
Packit |
13e616 |
p_opt->head_of_queue_lifetime = OSM_DEFAULT_HEAD_OF_QUEUE_LIFE;
|
|
Packit |
13e616 |
p_opt->leaf_head_of_queue_lifetime =
|
|
Packit |
13e616 |
OSM_DEFAULT_LEAF_HEAD_OF_QUEUE_LIFE;
|
|
Packit |
13e616 |
p_opt->local_phy_errors_threshold = OSM_DEFAULT_ERROR_THRESHOLD;
|
|
Packit |
13e616 |
p_opt->overrun_errors_threshold = OSM_DEFAULT_ERROR_THRESHOLD;
|
|
Packit |
13e616 |
p_opt->use_mfttop = TRUE;
|
|
Packit |
13e616 |
p_opt->sminfo_polling_timeout =
|
|
Packit |
13e616 |
OSM_SM_DEFAULT_POLLING_TIMEOUT_MILLISECS;
|
|
Packit |
13e616 |
p_opt->polling_retry_number = OSM_SM_DEFAULT_POLLING_RETRY_NUMBER;
|
|
Packit |
13e616 |
p_opt->force_heavy_sweep = FALSE;
|
|
Packit |
13e616 |
p_opt->log_flags = OSM_LOG_DEFAULT_LEVEL;
|
|
Packit |
13e616 |
p_opt->honor_guid2lid_file = FALSE;
|
|
Packit |
13e616 |
p_opt->daemon = FALSE;
|
|
Packit |
13e616 |
p_opt->sm_inactive = FALSE;
|
|
Packit |
13e616 |
p_opt->babbling_port_policy = FALSE;
|
|
Packit |
13e616 |
p_opt->drop_event_subscriptions = FALSE;
|
|
Packit |
13e616 |
p_opt->ipoib_mcgroup_creation_validation = TRUE;
|
|
Packit |
13e616 |
p_opt->mcgroup_join_validation = TRUE;
|
|
Packit |
13e616 |
p_opt->use_original_extended_sa_rates_only = FALSE;
|
|
Packit |
13e616 |
p_opt->use_optimized_slvl = FALSE;
|
|
Packit |
13e616 |
p_opt->fsync_high_avail_files = TRUE;
|
|
Packit |
13e616 |
#ifdef ENABLE_OSM_PERF_MGR
|
|
Packit |
13e616 |
p_opt->perfmgr = FALSE;
|
|
Packit |
13e616 |
p_opt->perfmgr_redir = TRUE;
|
|
Packit |
13e616 |
p_opt->perfmgr_sweep_time_s = OSM_PERFMGR_DEFAULT_SWEEP_TIME_S;
|
|
Packit |
13e616 |
p_opt->perfmgr_max_outstanding_queries =
|
|
Packit |
13e616 |
OSM_PERFMGR_DEFAULT_MAX_OUTSTANDING_QUERIES;
|
|
Packit |
13e616 |
p_opt->perfmgr_ignore_cas = FALSE;
|
|
Packit |
13e616 |
p_opt->event_db_dump_file = NULL; /* use default */
|
|
Packit |
13e616 |
p_opt->perfmgr_rm_nodes = TRUE;
|
|
Packit |
13e616 |
p_opt->perfmgr_log_errors = TRUE;
|
|
Packit |
13e616 |
p_opt->perfmgr_query_cpi = TRUE;
|
|
Packit |
13e616 |
p_opt->perfmgr_xmit_wait_log = FALSE;
|
|
Packit |
13e616 |
p_opt->perfmgr_xmit_wait_threshold = OSM_PERFMGR_DEFAULT_XMIT_WAIT_THRESHOLD;
|
|
Packit |
13e616 |
#endif /* ENABLE_OSM_PERF_MGR */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_opt->event_plugin_name = NULL;
|
|
Packit |
13e616 |
p_opt->event_plugin_options = NULL;
|
|
Packit |
13e616 |
p_opt->node_name_map_name = NULL;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_opt->dump_files_dir = getenv("OSM_TMP_DIR");
|
|
Packit |
13e616 |
if (!p_opt->dump_files_dir || !(*p_opt->dump_files_dir))
|
|
Packit |
13e616 |
p_opt->dump_files_dir = strdup(OSM_DEFAULT_TMP_DIR);
|
|
Packit |
13e616 |
else
|
|
Packit |
13e616 |
p_opt->dump_files_dir = strdup(p_opt->dump_files_dir);
|
|
Packit |
13e616 |
p_opt->log_file = strdup(OSM_DEFAULT_LOG_FILE);
|
|
Packit |
13e616 |
p_opt->log_max_size = 0;
|
|
Packit |
13e616 |
p_opt->partition_config_file = strdup(OSM_DEFAULT_PARTITION_CONFIG_FILE);
|
|
Packit |
13e616 |
p_opt->no_partition_enforcement = FALSE;
|
|
Packit |
13e616 |
p_opt->part_enforce = strdup(OSM_PARTITION_ENFORCE_BOTH);
|
|
Packit |
13e616 |
p_opt->allow_both_pkeys = FALSE;
|
|
Packit |
13e616 |
p_opt->keep_pkey_indexes = TRUE;
|
|
Packit |
13e616 |
p_opt->sm_assigned_guid = 0;
|
|
Packit |
13e616 |
p_opt->qos = FALSE;
|
|
Packit |
13e616 |
p_opt->qos_policy_file = strdup(OSM_DEFAULT_QOS_POLICY_FILE);
|
|
Packit |
13e616 |
p_opt->suppress_sl2vl_mad_status_errors = FALSE;
|
|
Packit |
13e616 |
p_opt->accum_log_file = TRUE;
|
|
Packit |
13e616 |
p_opt->port_prof_ignore_file = NULL;
|
|
Packit |
13e616 |
p_opt->hop_weights_file = NULL;
|
|
Packit |
13e616 |
p_opt->port_search_ordering_file = NULL;
|
|
Packit |
13e616 |
p_opt->port_profile_switch_nodes = FALSE;
|
|
Packit |
13e616 |
p_opt->sweep_on_trap = TRUE;
|
|
Packit |
13e616 |
p_opt->use_ucast_cache = FALSE;
|
|
Packit |
13e616 |
p_opt->routing_engine_names = NULL;
|
|
Packit |
13e616 |
p_opt->avoid_throttled_links = FALSE;
|
|
Packit |
13e616 |
p_opt->connect_roots = FALSE;
|
|
Packit |
13e616 |
p_opt->lid_matrix_dump_file = NULL;
|
|
Packit |
13e616 |
p_opt->lfts_file = NULL;
|
|
Packit |
13e616 |
p_opt->root_guid_file = NULL;
|
|
Packit |
13e616 |
p_opt->cn_guid_file = NULL;
|
|
Packit |
13e616 |
p_opt->io_guid_file = NULL;
|
|
Packit |
13e616 |
p_opt->port_shifting = FALSE;
|
|
Packit |
13e616 |
p_opt->scatter_ports = OSM_DEFAULT_SCATTER_PORTS;
|
|
Packit |
13e616 |
p_opt->max_reverse_hops = 0;
|
|
Packit |
13e616 |
p_opt->ids_guid_file = NULL;
|
|
Packit |
13e616 |
p_opt->guid_routing_order_file = NULL;
|
|
Packit |
13e616 |
p_opt->guid_routing_order_no_scatter = FALSE;
|
|
Packit |
13e616 |
p_opt->sa_db_file = NULL;
|
|
Packit |
13e616 |
p_opt->sa_db_dump = FALSE;
|
|
Packit |
13e616 |
p_opt->torus_conf_file = strdup(OSM_DEFAULT_TORUS_CONF_FILE);
|
|
Packit |
13e616 |
p_opt->do_mesh_analysis = FALSE;
|
|
Packit |
13e616 |
p_opt->exit_on_fatal = TRUE;
|
|
Packit |
13e616 |
p_opt->congestion_control = FALSE;
|
|
Packit |
13e616 |
p_opt->cc_key = OSM_DEFAULT_CC_KEY;
|
|
Packit |
13e616 |
p_opt->cc_max_outstanding_mads = OSM_CC_DEFAULT_MAX_OUTSTANDING_QUERIES;
|
|
Packit |
13e616 |
p_opt->enable_quirks = FALSE;
|
|
Packit |
13e616 |
p_opt->no_clients_rereg = FALSE;
|
|
Packit |
13e616 |
p_opt->prefix_routes_file = strdup(OSM_DEFAULT_PREFIX_ROUTES_FILE);
|
|
Packit |
13e616 |
p_opt->consolidate_ipv6_snm_req = FALSE;
|
|
Packit |
13e616 |
p_opt->lash_start_vl = 0;
|
|
Packit |
13e616 |
p_opt->sm_sl = OSM_DEFAULT_SL;
|
|
Packit |
13e616 |
p_opt->nue_max_num_vls = 1;
|
|
Packit |
13e616 |
p_opt->nue_include_switches = FALSE;
|
|
Packit |
13e616 |
p_opt->log_prefix = NULL;
|
|
Packit |
13e616 |
p_opt->per_module_logging_file = strdup(OSM_DEFAULT_PER_MOD_LOGGING_CONF_FILE);
|
|
Packit |
13e616 |
subn_init_qos_options(&p_opt->qos_options, NULL);
|
|
Packit |
13e616 |
subn_init_qos_options(&p_opt->qos_ca_options, NULL);
|
|
Packit |
13e616 |
subn_init_qos_options(&p_opt->qos_sw0_options, NULL);
|
|
Packit |
13e616 |
subn_init_qos_options(&p_opt->qos_swe_options, NULL);
|
|
Packit |
13e616 |
subn_init_qos_options(&p_opt->qos_rtr_options, NULL);
|
|
Packit |
13e616 |
p_opt->cc_cct.entries_len = 0;
|
|
Packit |
13e616 |
p_opt->cc_cct.input_str = NULL;
|
|
Packit |
13e616 |
p_opt->quasi_ftree_indexing = FALSE;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static char *clean_val(char *val)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
char *p = val;
|
|
Packit |
13e616 |
/* clean leading spaces */
|
|
Packit |
13e616 |
while (isspace(*p))
|
|
Packit |
13e616 |
p++;
|
|
Packit |
13e616 |
val = p;
|
|
Packit |
13e616 |
if (!*val)
|
|
Packit |
13e616 |
return val;
|
|
Packit |
13e616 |
/* clean trailing spaces */
|
|
Packit |
13e616 |
p = val + strlen(val) - 1;
|
|
Packit |
13e616 |
while (p > val && isspace(*p))
|
|
Packit |
13e616 |
p--;
|
|
Packit |
13e616 |
p[1] = '\0';
|
|
Packit |
13e616 |
/* clean quotas */
|
|
Packit |
13e616 |
if ((*val == '\"' && *p == '\"') || (*val == '\'' && *p == '\'')) {
|
|
Packit |
13e616 |
val++;
|
|
Packit |
13e616 |
*p-- = '\0';
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
return val;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static int subn_dump_qos_options(FILE * file, const char *set_name,
|
|
Packit |
13e616 |
const char *prefix, osm_qos_options_t * opt)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
return fprintf(file, "# %s\n"
|
|
Packit |
13e616 |
"%s_max_vls %u\n"
|
|
Packit |
13e616 |
"%s_high_limit %d\n"
|
|
Packit |
13e616 |
"%s_vlarb_high %s\n"
|
|
Packit |
13e616 |
"%s_vlarb_low %s\n"
|
|
Packit |
13e616 |
"%s_sl2vl %s\n",
|
|
Packit |
13e616 |
set_name,
|
|
Packit |
13e616 |
prefix, opt->max_vls,
|
|
Packit |
13e616 |
prefix, opt->high_limit,
|
|
Packit |
13e616 |
prefix, opt->vlarb_high,
|
|
Packit |
13e616 |
prefix, opt->vlarb_low, prefix, opt->sl2vl);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static ib_api_status_t append_prefix_route(IN osm_subn_t * p_subn,
|
|
Packit |
13e616 |
uint64_t prefix, uint64_t guid)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
osm_prefix_route_t *route;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
route = malloc(sizeof *route);
|
|
Packit |
13e616 |
if (! route) {
|
|
Packit |
13e616 |
OSM_LOG(&p_subn->p_osm->log, OSM_LOG_ERROR, "out of memory");
|
|
Packit |
13e616 |
return IB_ERROR;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
route->prefix = cl_hton64(prefix);
|
|
Packit |
13e616 |
route->guid = cl_hton64(guid);
|
|
Packit |
13e616 |
cl_qlist_insert_tail(&p_subn->prefix_routes_list, &route->list_item);
|
|
Packit |
13e616 |
return IB_SUCCESS;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static ib_api_status_t parse_prefix_routes_file(IN osm_subn_t * p_subn)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
osm_log_t *log = &p_subn->p_osm->log;
|
|
Packit |
13e616 |
FILE *fp;
|
|
Packit |
13e616 |
char buf[1024];
|
|
Packit |
13e616 |
int line = 0;
|
|
Packit |
13e616 |
int errors = 0;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
while (!cl_is_qlist_empty(&p_subn->prefix_routes_list)) {
|
|
Packit |
13e616 |
cl_list_item_t *item = cl_qlist_remove_head(&p_subn->prefix_routes_list);
|
|
Packit |
13e616 |
free(item);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fp = fopen(p_subn->opt.prefix_routes_file, "r");
|
|
Packit |
13e616 |
if (! fp) {
|
|
Packit |
13e616 |
if (errno == ENOENT)
|
|
Packit |
13e616 |
return IB_SUCCESS;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(log, OSM_LOG_ERROR, "fopen(%s) failed: %s",
|
|
Packit |
13e616 |
p_subn->opt.prefix_routes_file, strerror(errno));
|
|
Packit |
13e616 |
return IB_ERROR;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
while (fgets(buf, sizeof buf, fp) != NULL) {
|
|
Packit |
13e616 |
char *p_prefix, *p_guid, *p_extra, *p_last, *p_end;
|
|
Packit |
13e616 |
uint64_t prefix, guid;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
line++;
|
|
Packit |
13e616 |
if (errors > 10)
|
|
Packit |
13e616 |
break;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_prefix = strtok_r(buf, " \t\n", &p_last);
|
|
Packit |
13e616 |
if (! p_prefix)
|
|
Packit |
13e616 |
continue; /* ignore blank lines */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (*p_prefix == '#')
|
|
Packit |
13e616 |
continue; /* ignore comment lines */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_guid = strtok_r(NULL, " \t\n", &p_last);
|
|
Packit |
13e616 |
if (! p_guid) {
|
|
Packit |
13e616 |
OSM_LOG(log, OSM_LOG_ERROR, "%s:%d: missing GUID\n",
|
|
Packit |
13e616 |
p_subn->opt.prefix_routes_file, line);
|
|
Packit |
13e616 |
errors++;
|
|
Packit |
13e616 |
continue;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_extra = strtok_r(NULL, " \t\n", &p_last);
|
|
Packit |
13e616 |
if (p_extra && *p_extra != '#') {
|
|
Packit |
13e616 |
OSM_LOG(log, OSM_LOG_INFO, "%s:%d: extra tokens ignored\n",
|
|
Packit |
13e616 |
p_subn->opt.prefix_routes_file, line);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (strcmp(p_prefix, "*") == 0)
|
|
Packit |
13e616 |
prefix = 0;
|
|
Packit |
13e616 |
else {
|
|
Packit |
13e616 |
prefix = strtoull(p_prefix, &p_end, 16);
|
|
Packit |
13e616 |
if (*p_end != '\0') {
|
|
Packit |
13e616 |
OSM_LOG(log, OSM_LOG_ERROR, "%s:%d: illegal prefix: %s\n",
|
|
Packit |
13e616 |
p_subn->opt.prefix_routes_file, line, p_prefix);
|
|
Packit |
13e616 |
errors++;
|
|
Packit |
13e616 |
continue;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (strcmp(p_guid, "*") == 0)
|
|
Packit |
13e616 |
guid = 0;
|
|
Packit |
13e616 |
else {
|
|
Packit |
13e616 |
guid = strtoull(p_guid, &p_end, 16);
|
|
Packit |
13e616 |
if (*p_end != '\0' && *p_end != '#') {
|
|
Packit |
13e616 |
OSM_LOG(log, OSM_LOG_ERROR, "%s:%d: illegal GUID: %s\n",
|
|
Packit |
13e616 |
p_subn->opt.prefix_routes_file, line, p_guid);
|
|
Packit |
13e616 |
errors++;
|
|
Packit |
13e616 |
continue;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (append_prefix_route(p_subn, prefix, guid) != IB_SUCCESS) {
|
|
Packit |
13e616 |
errors++;
|
|
Packit |
13e616 |
break;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fclose(fp);
|
|
Packit |
13e616 |
return (errors == 0) ? IB_SUCCESS : IB_ERROR;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static ib_api_status_t insert_per_module_debug(IN osm_subn_t * p_subn,
|
|
Packit |
13e616 |
char *mod_name,
|
|
Packit |
13e616 |
osm_log_level_t level)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
uint8_t index;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (find_module_name(mod_name, &index)) {
|
|
Packit |
13e616 |
OSM_LOG(&p_subn->p_osm->log, OSM_LOG_ERROR,
|
|
Packit |
13e616 |
"Module name %s not found\n", mod_name);
|
|
Packit |
13e616 |
return IB_ERROR;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
osm_set_log_per_module(&p_subn->p_osm->log, index, level);
|
|
Packit |
13e616 |
return IB_SUCCESS;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static ib_api_status_t parse_per_mod_logging_file(IN osm_subn_t * p_subn)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
osm_log_t *log = &p_subn->p_osm->log;
|
|
Packit |
13e616 |
FILE *fp;
|
|
Packit |
13e616 |
char buf[1024];
|
|
Packit |
13e616 |
int line = 0;
|
|
Packit |
13e616 |
int errors = 0;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
osm_reset_log_per_module(log);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (p_subn->opt.per_module_logging_file == NULL)
|
|
Packit |
13e616 |
return IB_SUCCESS;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fp = fopen(p_subn->opt.per_module_logging_file, "r");
|
|
Packit |
13e616 |
if (!fp) {
|
|
Packit |
13e616 |
if (errno == ENOENT)
|
|
Packit |
13e616 |
return IB_SUCCESS;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(log, OSM_LOG_ERROR, "fopen(%s) failed: %s",
|
|
Packit |
13e616 |
p_subn->opt.per_module_logging_file, strerror(errno));
|
|
Packit |
13e616 |
return IB_ERROR;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
while (fgets(buf, sizeof buf, fp) != NULL) {
|
|
Packit |
13e616 |
char *p_mod_name, *p_level, *p_extra, *p_last;
|
|
Packit |
13e616 |
osm_log_level_t level;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
line++;
|
|
Packit |
13e616 |
if (errors > 10)
|
|
Packit |
13e616 |
break;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_mod_name = strtok_r(buf, " =,\t\n", &p_last);
|
|
Packit |
13e616 |
if (!p_mod_name)
|
|
Packit |
13e616 |
continue; /* ignore blank lines */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (*p_mod_name == '#')
|
|
Packit |
13e616 |
continue; /* ignore comment lines */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_level = strtok_r(NULL, " \t\n", &p_last);
|
|
Packit |
13e616 |
if (!p_level) {
|
|
Packit |
13e616 |
OSM_LOG(log, OSM_LOG_ERROR, "%s:%d: missing log level\n",
|
|
Packit |
13e616 |
p_subn->opt.per_module_logging_file, line);
|
|
Packit |
13e616 |
errors++;
|
|
Packit |
13e616 |
continue;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
p_extra = strtok_r(NULL, " \t\n", &p_last);
|
|
Packit |
13e616 |
if (p_extra && *p_extra != '#') {
|
|
Packit |
13e616 |
OSM_LOG(log, OSM_LOG_INFO, "%s:%d: extra tokens ignored\n",
|
|
Packit |
13e616 |
p_subn->opt.per_module_logging_file, line);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
level = strtoul(p_level, NULL, 0);
|
|
Packit |
13e616 |
if (insert_per_module_debug(p_subn, p_mod_name, level) != IB_SUCCESS) {
|
|
Packit |
13e616 |
errors++;
|
|
Packit |
13e616 |
break;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fclose(fp);
|
|
Packit |
13e616 |
return (errors == 0) ? IB_SUCCESS : IB_ERROR;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void subn_verify_max_vls(unsigned *max_vls, const char *prefix)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
if (!*max_vls || *max_vls > 15) {
|
|
Packit |
13e616 |
if (*max_vls)
|
|
Packit |
13e616 |
log_report(" Invalid Cached Option: %s_max_vls=%u: "
|
|
Packit |
13e616 |
"Using Default = %u\n",
|
|
Packit |
13e616 |
prefix, *max_vls, OSM_DEFAULT_QOS_MAX_VLS);
|
|
Packit |
13e616 |
*max_vls = 0;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void subn_verify_high_limit(int *high_limit, const char *prefix)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
if (*high_limit < 0 || *high_limit > 255) {
|
|
Packit |
13e616 |
if (*high_limit > 255)
|
|
Packit |
13e616 |
log_report(" Invalid Cached Option: %s_high_limit=%d: "
|
|
Packit |
13e616 |
"Using Default: %d\n",
|
|
Packit |
13e616 |
prefix, *high_limit,
|
|
Packit |
13e616 |
OSM_DEFAULT_QOS_HIGH_LIMIT);
|
|
Packit |
13e616 |
*high_limit = -1;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void subn_verify_vlarb(char **vlarb, const char *prefix,
|
|
Packit |
13e616 |
const char *suffix)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
char *str, *tok, *end, *ptr;
|
|
Packit |
13e616 |
int count = 0;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (*vlarb == NULL)
|
|
Packit |
13e616 |
return;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
str = strdup(*vlarb);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
tok = strtok_r(str, ",\n", &ptr);
|
|
Packit |
13e616 |
while (tok) {
|
|
Packit |
13e616 |
char *vl_str, *weight_str;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
vl_str = tok;
|
|
Packit |
13e616 |
weight_str = strchr(tok, ':');
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (weight_str) {
|
|
Packit |
13e616 |
long vl, weight;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
*weight_str = '\0';
|
|
Packit |
13e616 |
weight_str++;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
vl = strtol(vl_str, &end, 0);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (*end)
|
|
Packit |
13e616 |
log_report(" Warning: Cached Option "
|
|
Packit |
13e616 |
"%s_vlarb_%s:vl=%s"
|
|
Packit |
13e616 |
" improperly formatted\n",
|
|
Packit |
13e616 |
prefix, suffix, vl_str);
|
|
Packit |
13e616 |
else if (vl < 0 || vl > 14)
|
|
Packit |
13e616 |
log_report(" Warning: Cached Option "
|
|
Packit |
13e616 |
"%s_vlarb_%s:vl=%ld out of range\n",
|
|
Packit |
13e616 |
prefix, suffix, vl);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
weight = strtol(weight_str, &end, 0);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (*end)
|
|
Packit |
13e616 |
log_report(" Warning: Cached Option "
|
|
Packit |
13e616 |
"%s_vlarb_%s:weight=%s "
|
|
Packit |
13e616 |
"improperly formatted\n",
|
|
Packit |
13e616 |
prefix, suffix, weight_str);
|
|
Packit |
13e616 |
else if (weight < 0 || weight > 255)
|
|
Packit |
13e616 |
log_report(" Warning: Cached Option "
|
|
Packit |
13e616 |
"%s_vlarb_%s:weight=%ld "
|
|
Packit |
13e616 |
"out of range\n",
|
|
Packit |
13e616 |
prefix, suffix, weight);
|
|
Packit |
13e616 |
} else
|
|
Packit |
13e616 |
log_report(" Warning: Cached Option "
|
|
Packit |
13e616 |
"%s_vlarb_%s:vl:weight=%s "
|
|
Packit |
13e616 |
"improperly formatted\n",
|
|
Packit |
13e616 |
prefix, suffix, tok);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
count++;
|
|
Packit |
13e616 |
tok = strtok_r(NULL, ",\n", &ptr);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (count > 64)
|
|
Packit |
13e616 |
log_report(" Warning: Cached Option %s_vlarb_%s: > 64 listed:"
|
|
Packit |
13e616 |
" excess vl:weight pairs will be dropped\n",
|
|
Packit |
13e616 |
prefix, suffix);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
free(str);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void subn_verify_sl2vl(char **sl2vl, const char *prefix)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
char *str, *tok, *end, *ptr;
|
|
Packit |
13e616 |
int count = 0;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (*sl2vl == NULL)
|
|
Packit |
13e616 |
return;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
str = strdup(*sl2vl);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
tok = strtok_r(str, ",\n", &ptr);
|
|
Packit |
13e616 |
while (tok) {
|
|
Packit |
13e616 |
long vl = strtol(tok, &end, 0);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (*end)
|
|
Packit |
13e616 |
log_report(" Warning: Cached Option %s_sl2vl:vl=%s "
|
|
Packit |
13e616 |
"improperly formatted\n", prefix, tok);
|
|
Packit |
13e616 |
else if (vl < 0 || vl > 15)
|
|
Packit |
13e616 |
log_report(" Warning: Cached Option %s_sl2vl:vl=%ld "
|
|
Packit |
13e616 |
"out of range\n", prefix, vl);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
count++;
|
|
Packit |
13e616 |
tok = strtok_r(NULL, ",\n", &ptr);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (count < 16)
|
|
Packit |
13e616 |
log_report(" Warning: Cached Option %s_sl2vl: < 16 VLs "
|
|
Packit |
13e616 |
"listed\n", prefix);
|
|
Packit |
13e616 |
else if (count > 16)
|
|
Packit |
13e616 |
log_report(" Warning: Cached Option %s_sl2vl: > 16 listed: "
|
|
Packit |
13e616 |
"excess VLs will be dropped\n", prefix);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
free(str);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void subn_verify_qos_set(osm_qos_options_t *set, const char *prefix)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
subn_verify_max_vls(&set->max_vls, prefix);
|
|
Packit |
13e616 |
subn_verify_high_limit(&set->high_limit, prefix);
|
|
Packit |
13e616 |
subn_verify_vlarb(&set->vlarb_low, prefix, "low");
|
|
Packit |
13e616 |
subn_verify_vlarb(&set->vlarb_high, prefix, "high");
|
|
Packit |
13e616 |
subn_verify_sl2vl(&set->sl2vl, prefix);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
int osm_subn_verify_config(IN osm_subn_opt_t * p_opts)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
if (p_opts->lmc > 7) {
|
|
Packit |
13e616 |
log_report(" Invalid Cached Option Value:lmc = %u:"
|
|
Packit |
13e616 |
"Using Default:%u\n", p_opts->lmc, OSM_DEFAULT_LMC);
|
|
Packit |
13e616 |
p_opts->lmc = OSM_DEFAULT_LMC;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (15 < p_opts->sm_priority) {
|
|
Packit |
13e616 |
log_report(" Invalid Cached Option Value:sm_priority = %u:"
|
|
Packit |
13e616 |
"Using Default:%u\n",
|
|
Packit |
13e616 |
p_opts->sm_priority, OSM_DEFAULT_SM_PRIORITY);
|
|
Packit |
13e616 |
p_opts->sm_priority = OSM_DEFAULT_SM_PRIORITY;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if ((IB_LINK_SPEED_SET_LSS < p_opts->force_link_speed) ||
|
|
Packit |
13e616 |
(p_opts->force_link_speed > IB_LINK_SPEED_2_5_5_OR_10 &&
|
|
Packit |
13e616 |
p_opts->force_link_speed < IB_LINK_SPEED_SET_LSS)) {
|
|
Packit |
13e616 |
log_report(" Invalid Cached Option Value:force_link_speed = %u:"
|
|
Packit |
13e616 |
"Using Default:%u\n", p_opts->force_link_speed,
|
|
Packit |
13e616 |
IB_LINK_SPEED_SET_LSS);
|
|
Packit |
13e616 |
p_opts->force_link_speed = IB_LINK_SPEED_SET_LSS;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if ((IB_LINK_SPEED_EXT_SET_LSES < p_opts->force_link_speed_ext) ||
|
|
Packit |
13e616 |
(p_opts->force_link_speed_ext > IB_LINK_SPEED_EXT_14_25_OR_50 &&
|
|
Packit |
13e616 |
p_opts->force_link_speed_ext < IB_LINK_SPEED_EXT_DISABLE)) {
|
|
Packit |
13e616 |
log_report(" Invalid Cached Option Value:force_link_speed_ext = %u:"
|
|
Packit |
13e616 |
"Using Default:%u\n", p_opts->force_link_speed_ext,
|
|
Packit |
13e616 |
IB_LINK_SPEED_EXT_SET_LSES);
|
|
Packit |
13e616 |
p_opts->force_link_speed_ext = IB_LINK_SPEED_EXT_SET_LSES;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if ((IB_LINK_WIDTH_SET_LWS < p_opts->force_link_width) ||
|
|
Packit |
13e616 |
(p_opts->force_link_width > IB_LINK_WIDTH_1X_2X_4X_8X_OR_12X &&
|
|
Packit |
13e616 |
p_opts->force_link_width < IB_LINK_WIDTH_SET_LWS)) {
|
|
Packit |
13e616 |
log_report(" Invalid Cached Option Value:force_link_width = %u:"
|
|
Packit |
13e616 |
"Using Default:%u\n", p_opts->force_link_width,
|
|
Packit |
13e616 |
IB_LINK_WIDTH_SET_LWS);
|
|
Packit |
13e616 |
p_opts->force_link_width = IB_LINK_WIDTH_SET_LWS;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (2 < p_opts->fdr10) {
|
|
Packit |
13e616 |
log_report(" Invalid Cached Option Value:fdr10 = %u:"
|
|
Packit |
13e616 |
"Using Default:%u\n", p_opts->fdr10, 1);
|
|
Packit |
13e616 |
p_opts->fdr10 = 1;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (p_opts->max_wire_smps == 0)
|
|
Packit |
13e616 |
p_opts->max_wire_smps = 0x7FFFFFFF;
|
|
Packit |
13e616 |
else if (p_opts->max_wire_smps > 0x7FFFFFFF) {
|
|
Packit |
13e616 |
log_report(" Invalid Cached Option Value: max_wire_smps = %u,"
|
|
Packit |
13e616 |
" Using Default: %u\n",
|
|
Packit |
13e616 |
p_opts->max_wire_smps, OSM_DEFAULT_SMP_MAX_ON_WIRE);
|
|
Packit |
13e616 |
p_opts->max_wire_smps = OSM_DEFAULT_SMP_MAX_ON_WIRE;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (p_opts->max_wire_smps2 > 0x7FFFFFFF) {
|
|
Packit |
13e616 |
log_report(" Invalid Cached Option Value: max_wire_smps2 = %u,"
|
|
Packit |
13e616 |
" Using Default: %u",
|
|
Packit |
13e616 |
p_opts->max_wire_smps2, p_opts->max_wire_smps);
|
|
Packit |
13e616 |
p_opts->max_wire_smps2 = p_opts->max_wire_smps;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (p_opts->long_transaction_timeout < p_opts->transaction_timeout) {
|
|
Packit |
13e616 |
log_report(" Invalid Cached Option Value: long_transaction_timeout = %u,"
|
|
Packit |
13e616 |
" Using transaction_timeout: %u",
|
|
Packit |
13e616 |
p_opts->long_transaction_timeout, p_opts->transaction_timeout);
|
|
Packit |
13e616 |
p_opts->long_transaction_timeout = p_opts->transaction_timeout;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (strcmp(p_opts->console, OSM_DISABLE_CONSOLE)
|
|
Packit |
13e616 |
&& strcmp(p_opts->console, OSM_LOCAL_CONSOLE)
|
|
Packit |
13e616 |
#ifdef ENABLE_OSM_CONSOLE_LOOPBACK
|
|
Packit |
13e616 |
&& strcmp(p_opts->console, OSM_LOOPBACK_CONSOLE)
|
|
Packit |
13e616 |
#endif
|
|
Packit |
13e616 |
#ifdef ENABLE_OSM_CONSOLE_SOCKET
|
|
Packit |
13e616 |
&& strcmp(p_opts->console, OSM_REMOTE_CONSOLE)
|
|
Packit |
13e616 |
#endif
|
|
Packit |
13e616 |
) {
|
|
Packit |
13e616 |
log_report(" Invalid Cached Option Value:console = %s"
|
|
Packit |
13e616 |
", Using Default:%s\n",
|
|
Packit |
13e616 |
p_opts->console, OSM_DEFAULT_CONSOLE);
|
|
Packit |
13e616 |
free(p_opts->console);
|
|
Packit |
13e616 |
p_opts->console = strdup(OSM_DEFAULT_CONSOLE);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (p_opts->no_partition_enforcement == TRUE) {
|
|
Packit |
13e616 |
strcpy(p_opts->part_enforce, OSM_PARTITION_ENFORCE_OFF);
|
|
Packit |
13e616 |
p_opts->part_enforce_enum = OSM_PARTITION_ENFORCE_TYPE_OFF;
|
|
Packit |
13e616 |
} else {
|
|
Packit |
13e616 |
if (strcmp(p_opts->part_enforce, OSM_PARTITION_ENFORCE_BOTH) == 0)
|
|
Packit |
13e616 |
p_opts->part_enforce_enum = OSM_PARTITION_ENFORCE_TYPE_BOTH;
|
|
Packit |
13e616 |
else if (strcmp(p_opts->part_enforce, OSM_PARTITION_ENFORCE_IN) == 0)
|
|
Packit |
13e616 |
p_opts->part_enforce_enum = OSM_PARTITION_ENFORCE_TYPE_IN;
|
|
Packit |
13e616 |
else if (strcmp(p_opts->part_enforce, OSM_PARTITION_ENFORCE_OUT) == 0)
|
|
Packit |
13e616 |
p_opts->part_enforce_enum = OSM_PARTITION_ENFORCE_TYPE_OUT;
|
|
Packit |
13e616 |
else if (strcmp(p_opts->part_enforce, OSM_PARTITION_ENFORCE_OFF) == 0)
|
|
Packit |
13e616 |
p_opts->part_enforce_enum = OSM_PARTITION_ENFORCE_TYPE_OFF;
|
|
Packit |
13e616 |
else {
|
|
Packit |
13e616 |
log_report(" Invalid Cached Option Value:part_enforce = %s"
|
|
Packit |
13e616 |
", Using Default:%s\n",
|
|
Packit |
13e616 |
p_opts->part_enforce, OSM_PARTITION_ENFORCE_BOTH);
|
|
Packit |
13e616 |
strcpy(p_opts->part_enforce, OSM_PARTITION_ENFORCE_BOTH);
|
|
Packit |
13e616 |
p_opts->part_enforce_enum = OSM_PARTITION_ENFORCE_TYPE_BOTH;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (p_opts->qos) {
|
|
Packit |
13e616 |
subn_verify_qos_set(&p_opts->qos_options, "qos");
|
|
Packit |
13e616 |
subn_verify_qos_set(&p_opts->qos_ca_options, "qos_ca");
|
|
Packit |
13e616 |
subn_verify_qos_set(&p_opts->qos_sw0_options, "qos_sw0");
|
|
Packit |
13e616 |
subn_verify_qos_set(&p_opts->qos_swe_options, "qos_swe");
|
|
Packit |
13e616 |
subn_verify_qos_set(&p_opts->qos_rtr_options, "qos_rtr");
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
#ifdef ENABLE_OSM_PERF_MGR
|
|
Packit |
13e616 |
if (p_opts->perfmgr_sweep_time_s < 1) {
|
|
Packit |
13e616 |
log_report(" Invalid Cached Option Value:perfmgr_sweep_time_s "
|
|
Packit |
13e616 |
"= %u Using Default:%u\n",
|
|
Packit |
13e616 |
p_opts->perfmgr_sweep_time_s,
|
|
Packit |
13e616 |
OSM_PERFMGR_DEFAULT_SWEEP_TIME_S);
|
|
Packit |
13e616 |
p_opts->perfmgr_sweep_time_s = OSM_PERFMGR_DEFAULT_SWEEP_TIME_S;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
if (p_opts->perfmgr_max_outstanding_queries < 1) {
|
|
Packit |
13e616 |
log_report(" Invalid Cached Option Value:"
|
|
Packit |
13e616 |
"perfmgr_max_outstanding_queries = %u"
|
|
Packit |
13e616 |
" Using Default:%u\n",
|
|
Packit |
13e616 |
p_opts->perfmgr_max_outstanding_queries,
|
|
Packit |
13e616 |
OSM_PERFMGR_DEFAULT_MAX_OUTSTANDING_QUERIES);
|
|
Packit |
13e616 |
p_opts->perfmgr_max_outstanding_queries =
|
|
Packit |
13e616 |
OSM_PERFMGR_DEFAULT_MAX_OUTSTANDING_QUERIES;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
#endif
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (p_opts->m_key_protect_bits > 3) {
|
|
Packit |
13e616 |
log_report(" Invalid Cached Option Value:"
|
|
Packit |
13e616 |
"m_key_protection_level = %u Setting to %u "
|
|
Packit |
13e616 |
"instead\n", p_opts->m_key_protect_bits, 2);
|
|
Packit |
13e616 |
p_opts->m_key_protect_bits = 2;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
if (p_opts->m_key_protect_bits && p_opts->m_key_lease_period) {
|
|
Packit |
13e616 |
if (!p_opts->sweep_interval) {
|
|
Packit |
13e616 |
log_report(" Sweep disabled with protected mkey "
|
|
Packit |
13e616 |
"leases in effect; re-enabling sweeping "
|
|
Packit |
13e616 |
"with interval %u\n",
|
|
Packit |
13e616 |
cl_ntoh16(p_opts->m_key_lease_period) - 1);
|
|
Packit |
13e616 |
p_opts->sweep_interval =
|
|
Packit |
13e616 |
cl_ntoh16(p_opts->m_key_lease_period) - 1;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
if (p_opts->sweep_interval >=
|
|
Packit |
13e616 |
cl_ntoh16(p_opts->m_key_lease_period)) {
|
|
Packit |
13e616 |
log_report(" Sweep interval %u >= mkey lease period "
|
|
Packit |
13e616 |
"%u. Setting lease period to %u\n",
|
|
Packit |
13e616 |
p_opts->sweep_interval,
|
|
Packit |
13e616 |
cl_ntoh16(p_opts->m_key_lease_period),
|
|
Packit |
13e616 |
p_opts->sweep_interval + 1);
|
|
Packit |
13e616 |
p_opts->m_key_lease_period =
|
|
Packit |
13e616 |
cl_hton16(p_opts->sweep_interval + 1);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
return 0;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
int osm_subn_parse_conf_file(const char *file_name, osm_subn_opt_t * p_opts)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
char line[1024];
|
|
Packit |
13e616 |
FILE *opts_file;
|
|
Packit |
13e616 |
char *p_key, *p_val, *pound_sign;
|
|
Packit |
13e616 |
const opt_rec_t *r;
|
|
Packit |
13e616 |
void *p_field1, *p_field2;
|
|
Packit |
13e616 |
int token_matched;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
opts_file = fopen(file_name, "r");
|
|
Packit |
13e616 |
if (!opts_file) {
|
|
Packit |
13e616 |
if (errno == ENOENT)
|
|
Packit |
13e616 |
return 1;
|
|
Packit |
13e616 |
printf("cannot open file \'%s\': %s\n",
|
|
Packit |
13e616 |
file_name, strerror(errno));
|
|
Packit |
13e616 |
return -1;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
printf(" Reading Cached Option File: %s\n", file_name);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_opts->config_file = file_name;
|
|
Packit |
13e616 |
if (!p_opts->file_opts && !(p_opts->file_opts = malloc(sizeof(*p_opts)))) {
|
|
Packit |
13e616 |
fclose(opts_file);
|
|
Packit |
13e616 |
return -1;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
memcpy(p_opts->file_opts, p_opts, sizeof(*p_opts));
|
|
Packit |
13e616 |
p_opts->file_opts->file_opts = NULL;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
while (fgets(line, 1023, opts_file) != NULL) {
|
|
Packit |
13e616 |
pound_sign = strchr(line,'#');
|
|
Packit |
13e616 |
token_matched = 0;
|
|
Packit |
13e616 |
/* Truncate any comments. */
|
|
Packit |
13e616 |
if (pound_sign)
|
|
Packit |
13e616 |
*pound_sign = '\0';
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* get the first token */
|
|
Packit |
13e616 |
p_key = strtok_r(line, " \t\n", &p_val);
|
|
Packit |
13e616 |
if (!p_key)
|
|
Packit |
13e616 |
continue;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_val = clean_val(p_val);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
for (r = opt_tbl; r->name; r++) {
|
|
Packit |
13e616 |
if (strcmp(r->name, p_key))
|
|
Packit |
13e616 |
continue;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
token_matched = 1;
|
|
Packit |
13e616 |
p_field1 = (void *)p_opts->file_opts + r->opt_offset;
|
|
Packit |
13e616 |
p_field2 = (void *)p_opts + r->opt_offset;
|
|
Packit |
13e616 |
/* don't call setup function first time */
|
|
Packit |
13e616 |
r->parse_fn(NULL, p_key, p_val, p_field1, p_field2,
|
|
Packit |
13e616 |
NULL);
|
|
Packit |
13e616 |
break;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (!token_matched)
|
|
Packit |
13e616 |
log_report(" Unrecognized token: \"%s\"\n", p_key);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
fclose(opts_file);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
osm_subn_verify_config(p_opts);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
return 0;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
int osm_subn_rescan_conf_files(IN osm_subn_t * p_subn)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
char line[1024];
|
|
Packit |
13e616 |
osm_subn_opt_t *p_opts = &p_subn->opt;
|
|
Packit |
13e616 |
const opt_rec_t *r;
|
|
Packit |
13e616 |
FILE *opts_file;
|
|
Packit |
13e616 |
char *p_key, *p_val, *pound_sign;
|
|
Packit |
13e616 |
void *p_field1, *p_field2;
|
|
Packit |
13e616 |
int token_matched;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (!p_opts->config_file)
|
|
Packit |
13e616 |
return 0;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
opts_file = fopen(p_opts->config_file, "r");
|
|
Packit |
13e616 |
if (!opts_file) {
|
|
Packit |
13e616 |
if (errno == ENOENT)
|
|
Packit |
13e616 |
return 1;
|
|
Packit |
13e616 |
OSM_LOG(&p_subn->p_osm->log, OSM_LOG_ERROR,
|
|
Packit |
13e616 |
"cannot open file \'%s\': %s\n",
|
|
Packit |
13e616 |
p_opts->config_file, strerror(errno));
|
|
Packit |
13e616 |
return -1;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
subn_init_qos_options(&p_opts->qos_options,
|
|
Packit |
13e616 |
&p_opts->file_opts->qos_options);
|
|
Packit |
13e616 |
subn_init_qos_options(&p_opts->qos_ca_options,
|
|
Packit |
13e616 |
&p_opts->file_opts->qos_ca_options);
|
|
Packit |
13e616 |
subn_init_qos_options(&p_opts->qos_sw0_options,
|
|
Packit |
13e616 |
&p_opts->file_opts->qos_sw0_options);
|
|
Packit |
13e616 |
subn_init_qos_options(&p_opts->qos_swe_options,
|
|
Packit |
13e616 |
&p_opts->file_opts->qos_swe_options);
|
|
Packit |
13e616 |
subn_init_qos_options(&p_opts->qos_rtr_options,
|
|
Packit |
13e616 |
&p_opts->file_opts->qos_rtr_options);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
while (fgets(line, 1023, opts_file) != NULL) {
|
|
Packit |
13e616 |
pound_sign = strchr(line,'#');
|
|
Packit |
13e616 |
token_matched = 0;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Truncate any comments. */
|
|
Packit |
13e616 |
if (pound_sign)
|
|
Packit |
13e616 |
*pound_sign = '\0';
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* get the first token */
|
|
Packit |
13e616 |
p_key = strtok_r(line, " \t\n", &p_val);
|
|
Packit |
13e616 |
if (!p_key)
|
|
Packit |
13e616 |
continue;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_val = clean_val(p_val);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
for (r = opt_tbl; r->name; r++) {
|
|
Packit |
13e616 |
if (strcmp(r->name, p_key))
|
|
Packit |
13e616 |
continue;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
token_matched = 1;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (!r->can_update)
|
|
Packit |
13e616 |
continue;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_field1 = (void *)p_opts->file_opts + r->opt_offset;
|
|
Packit |
13e616 |
p_field2 = (void *)p_opts + r->opt_offset;
|
|
Packit |
13e616 |
r->parse_fn(p_subn, p_key, p_val, p_field1, p_field2,
|
|
Packit |
13e616 |
r->setup_fn);
|
|
Packit |
13e616 |
break;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
if (!token_matched)
|
|
Packit |
13e616 |
log_report(" Unrecognized token: \"%s\"\n", p_key);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
fclose(opts_file);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
osm_subn_verify_config(p_opts);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
parse_prefix_routes_file(p_subn);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
parse_per_mod_logging_file(p_subn);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
return 0;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
void osm_subn_output_conf(FILE *out, IN osm_subn_opt_t * p_opts)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
int cacongoutputcount = 0;
|
|
Packit |
13e616 |
int i;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"#\n# DEVICE ATTRIBUTES OPTIONS\n#\n"
|
|
Packit |
13e616 |
"# The port GUID on which the OpenSM is running\n"
|
|
Packit |
13e616 |
"guid 0x%016" PRIx64 "\n\n"
|
|
Packit |
13e616 |
"# M_Key value sent to all ports qualifying all Set(PortInfo)\n"
|
|
Packit |
13e616 |
"m_key 0x%016" PRIx64 "\n\n"
|
|
Packit |
13e616 |
"# The lease period used for the M_Key on this subnet in [sec]\n"
|
|
Packit |
13e616 |
"m_key_lease_period %u\n\n"
|
|
Packit |
13e616 |
"# The protection level used for the M_Key on this subnet\n"
|
|
Packit |
13e616 |
"m_key_protection_level %u\n\n"
|
|
Packit |
13e616 |
"# If TRUE, SM tries to determine the m_key of unknown ports from guid2mkey file\n"
|
|
Packit |
13e616 |
"# If FALSE, SM won't try to determine the m_key of unknown ports.\n"
|
|
Packit |
13e616 |
"# Preconfigured m_key will be used instead\n"
|
|
Packit |
13e616 |
"m_key_lookup %s\n\n"
|
|
Packit |
13e616 |
"# SM_Key value of the SM used for SM authentication\n"
|
|
Packit |
13e616 |
"sm_key 0x%016" PRIx64 "\n\n"
|
|
Packit |
13e616 |
"# SM_Key value to qualify rcv SA queries as 'trusted'\n"
|
|
Packit |
13e616 |
"sa_key 0x%016" PRIx64 "\n\n"
|
|
Packit |
13e616 |
"# Note that for both values above (sm_key and sa_key)\n"
|
|
Packit |
13e616 |
"# OpenSM version 3.2.1 and below used the default value '1'\n"
|
|
Packit |
13e616 |
"# in a host byte order, it is fixed now but you may need to\n"
|
|
Packit |
13e616 |
"# change the values to interoperate with old OpenSM running\n"
|
|
Packit |
13e616 |
"# on a little endian machine.\n\n"
|
|
Packit |
13e616 |
"# Subnet prefix used on this subnet\n"
|
|
Packit |
13e616 |
"subnet_prefix 0x%016" PRIx64 "\n\n"
|
|
Packit |
13e616 |
"# The LMC value used on this subnet\n"
|
|
Packit |
13e616 |
"lmc %u\n\n"
|
|
Packit |
13e616 |
"# lmc_esp0 determines whether LMC value used on subnet is used for\n"
|
|
Packit |
13e616 |
"# enhanced switch port 0. If TRUE, LMC value for subnet is used for\n"
|
|
Packit |
13e616 |
"# ESP0. Otherwise, LMC value for ESP0s is 0.\n"
|
|
Packit |
13e616 |
"lmc_esp0 %s\n\n"
|
|
Packit |
13e616 |
"# sm_sl determines SMSL used for SM/SA communication\n"
|
|
Packit |
13e616 |
"sm_sl %u\n\n"
|
|
Packit |
13e616 |
"# The code of maximal time a packet can live in a switch\n"
|
|
Packit |
13e616 |
"# The actual time is 4.096usec * 2^<packet_life_time>\n"
|
|
Packit |
13e616 |
"# The value 0x14 disables this mechanism\n"
|
|
Packit |
13e616 |
"packet_life_time 0x%02x\n\n"
|
|
Packit |
13e616 |
"# The number of sequential packets dropped that cause the port\n"
|
|
Packit |
13e616 |
"# to enter the VLStalled state. The result of setting this value to\n"
|
|
Packit |
13e616 |
"# zero is undefined.\n"
|
|
Packit |
13e616 |
"vl_stall_count 0x%02x\n\n"
|
|
Packit |
13e616 |
"# The number of sequential packets dropped that cause the port\n"
|
|
Packit |
13e616 |
"# to enter the VLStalled state. This value is for switch ports\n"
|
|
Packit |
13e616 |
"# driving a CA or router port. The result of setting this value\n"
|
|
Packit |
13e616 |
"# to zero is undefined.\n"
|
|
Packit |
13e616 |
"leaf_vl_stall_count 0x%02x\n\n"
|
|
Packit |
13e616 |
"# The code of maximal time a packet can wait at the head of\n"
|
|
Packit |
13e616 |
"# transmission queue.\n"
|
|
Packit |
13e616 |
"# The actual time is 4.096usec * 2^<head_of_queue_lifetime>\n"
|
|
Packit |
13e616 |
"# The value 0x14 disables this mechanism\n"
|
|
Packit |
13e616 |
"head_of_queue_lifetime 0x%02x\n\n"
|
|
Packit |
13e616 |
"# The maximal time a packet can wait at the head of queue on\n"
|
|
Packit |
13e616 |
"# switch port connected to a CA or router port\n"
|
|
Packit |
13e616 |
"leaf_head_of_queue_lifetime 0x%02x\n\n"
|
|
Packit |
13e616 |
"# Limit the maximal operational VLs\n"
|
|
Packit |
13e616 |
"max_op_vls %u\n\n"
|
|
Packit |
13e616 |
"# Force PortInfo:LinkSpeedEnabled on switch ports\n"
|
|
Packit |
13e616 |
"# If 0, don't modify PortInfo:LinkSpeedEnabled on switch port\n"
|
|
Packit |
13e616 |
"# Otherwise, use value for PortInfo:LinkSpeedEnabled on switch port\n"
|
|
Packit |
13e616 |
"# Values are (IB Spec 1.2.1, 14.2.5.6 Table 146 \"PortInfo\")\n"
|
|
Packit |
13e616 |
"# 1: 2.5 Gbps\n"
|
|
Packit |
13e616 |
"# 3: 2.5 or 5.0 Gbps\n"
|
|
Packit |
13e616 |
"# 5: 2.5 or 10.0 Gbps\n"
|
|
Packit |
13e616 |
"# 7: 2.5 or 5.0 or 10.0 Gbps\n"
|
|
Packit |
13e616 |
"# 2,4,6,8-14 Reserved\n"
|
|
Packit |
13e616 |
"# Default 15: set to PortInfo:LinkSpeedSupported\n"
|
|
Packit |
13e616 |
"force_link_speed %u\n\n"
|
|
Packit |
13e616 |
"# Force PortInfo:LinkSpeedExtEnabled on ports\n"
|
|
Packit |
13e616 |
"# If 0, don't modify PortInfo:LinkSpeedExtEnabled on port\n"
|
|
Packit |
13e616 |
"# Otherwise, use value for PortInfo:LinkSpeedExtEnabled on port\n"
|
|
Packit |
13e616 |
"# Values are (MgtWG RefIDs #4722 and #9366)\n"
|
|
Packit |
13e616 |
"# 1: 14.0625 Gbps\n"
|
|
Packit |
13e616 |
"# 2: 25.78125 Gbps\n"
|
|
Packit |
13e616 |
"# 3: 14.0625 Gbps or 25.78125 Gbps\n"
|
|
Packit |
13e616 |
"# 4: 53.125 Gbps\n"
|
|
Packit |
13e616 |
"# 5: 14.0625 Gbps or 53.125 Gbps\n"
|
|
Packit |
13e616 |
"# 6: 25.78125 Gbps or 53.125 Gbps\n"
|
|
Packit |
13e616 |
"# 7: 14.0625 Gbps, 25.78125 Gbps or 53.125 Gbps\n"
|
|
Packit |
13e616 |
"# 30: Disable extended link speeds\n"
|
|
Packit |
13e616 |
"# Default 31: set to PortInfo:LinkSpeedExtSupported\n"
|
|
Packit |
13e616 |
"force_link_speed_ext %u\n\n"
|
|
Packit |
13e616 |
"# Force PortInfo:LinkWidthEnabled on switch ports\n"
|
|
Packit |
13e616 |
"# If 0, don't modify PortInfo:LinkWidthEnabled on switch port\n"
|
|
Packit |
13e616 |
"# Otherwise, use value for PortInfo:LinkWidthEnabled on switch port\n"
|
|
Packit |
13e616 |
"# Values are (IB Spec 1.2.1, 14.2.5.6 Table 146 \"PortInfo\"\n"
|
|
Packit |
13e616 |
"# augmented by MgtWG RefIDs #9306-9309)\n"
|
|
Packit |
13e616 |
"# 1: 1x\n"
|
|
Packit |
13e616 |
"# 2: 4x\n"
|
|
Packit |
13e616 |
"# 3: 1x or 4x\n"
|
|
Packit |
13e616 |
"# 4: 8x\n"
|
|
Packit |
13e616 |
"# 5: 1x or 8x\n"
|
|
Packit |
13e616 |
"# 6: 4x or 8x\n"
|
|
Packit |
13e616 |
"# 7: 1x or 4x or 8x\n"
|
|
Packit |
13e616 |
"# 8: 12x\n"
|
|
Packit |
13e616 |
"# 9: 1x or 12x\n"
|
|
Packit |
13e616 |
"# 10: 4x or 12x\n"
|
|
Packit |
13e616 |
"# 11: 1x or 4x or 12x\n"
|
|
Packit |
13e616 |
"# 12: 8x or 12x\n"
|
|
Packit |
13e616 |
"# 13: 1x or 8x or 12x\n"
|
|
Packit |
13e616 |
"# 14: 4x or 8x or 12x\n"
|
|
Packit |
13e616 |
"# 15: 1x or 4x or 8x or 12x\n"
|
|
Packit |
13e616 |
"# 16: 2x\n"
|
|
Packit |
13e616 |
"# 17: 1x or 2x\n"
|
|
Packit |
13e616 |
"# 18: 2x or 4x\n"
|
|
Packit |
13e616 |
"# 19: 1x or 2x or 4x\n"
|
|
Packit |
13e616 |
"# 20: 2x or 8x\n"
|
|
Packit |
13e616 |
"# 21: 1x or 2x or 8x\n"
|
|
Packit |
13e616 |
"# 22: 2x or 4x or 8x\n"
|
|
Packit |
13e616 |
"# 23: 1x or 2x or 4x or 8x\n"
|
|
Packit |
13e616 |
"# 24: 2x or 12x\n"
|
|
Packit |
13e616 |
"# 25: 1x or 2x or 12x\n"
|
|
Packit |
13e616 |
"# 26: 2x or 4x or 12x\n"
|
|
Packit |
13e616 |
"# 27: 1x or 2x or 4x or 12x\n"
|
|
Packit |
13e616 |
"# 28: 2x or 8x or 12x\n"
|
|
Packit |
13e616 |
"# 29: 1x or 2x or 8x or 12x\n"
|
|
Packit |
13e616 |
"# 30: 2x or 4x or 8x or 12x\n"
|
|
Packit |
13e616 |
"# 31: 1x or 2x or 4x or 8x or 12x\n"
|
|
Packit |
13e616 |
"# 32-254 Reserved\n"
|
|
Packit |
13e616 |
"# Default 255: set to PortInfo:LinkWidthSupported\n"
|
|
Packit |
13e616 |
"force_link_width %u\n\n"
|
|
Packit |
13e616 |
"# FDR10 on ports on devices that support FDR10\n"
|
|
Packit |
13e616 |
"# Values are:\n"
|
|
Packit |
13e616 |
"# 0: don't use fdr10 (no MLNX ExtendedPortInfo MADs)\n"
|
|
Packit |
13e616 |
"# Default 1: enable fdr10 when supported\n"
|
|
Packit |
13e616 |
"# 2: disable fdr10 when supported\n"
|
|
Packit |
13e616 |
"fdr10 %u\n\n"
|
|
Packit |
13e616 |
"# The subnet_timeout code that will be set for all the ports\n"
|
|
Packit |
13e616 |
"# The actual timeout is 4.096usec * 2^<subnet_timeout>\n"
|
|
Packit |
13e616 |
"subnet_timeout %u\n\n"
|
|
Packit |
13e616 |
"# Threshold of local phy errors for sending Trap 129\n"
|
|
Packit |
13e616 |
"local_phy_errors_threshold 0x%02x\n\n"
|
|
Packit |
13e616 |
"# Threshold of credit overrun errors for sending Trap 130\n"
|
|
Packit |
13e616 |
"overrun_errors_threshold 0x%02x\n\n"
|
|
Packit |
13e616 |
"# Use SwitchInfo:MulticastFDBTop if advertised in PortInfo:CapabilityMask\n"
|
|
Packit |
13e616 |
"use_mfttop %s\n\n",
|
|
Packit |
13e616 |
cl_ntoh64(p_opts->guid),
|
|
Packit |
13e616 |
cl_ntoh64(p_opts->m_key),
|
|
Packit |
13e616 |
cl_ntoh16(p_opts->m_key_lease_period),
|
|
Packit |
13e616 |
p_opts->m_key_protect_bits,
|
|
Packit |
13e616 |
p_opts->m_key_lookup ? "TRUE" : "FALSE",
|
|
Packit |
13e616 |
cl_ntoh64(p_opts->sm_key),
|
|
Packit |
13e616 |
cl_ntoh64(p_opts->sa_key),
|
|
Packit |
13e616 |
cl_ntoh64(p_opts->subnet_prefix),
|
|
Packit |
13e616 |
p_opts->lmc,
|
|
Packit |
13e616 |
p_opts->lmc_esp0 ? "TRUE" : "FALSE",
|
|
Packit |
13e616 |
p_opts->sm_sl,
|
|
Packit |
13e616 |
p_opts->packet_life_time,
|
|
Packit |
13e616 |
p_opts->vl_stall_count,
|
|
Packit |
13e616 |
p_opts->leaf_vl_stall_count,
|
|
Packit |
13e616 |
p_opts->head_of_queue_lifetime,
|
|
Packit |
13e616 |
p_opts->leaf_head_of_queue_lifetime,
|
|
Packit |
13e616 |
p_opts->max_op_vls,
|
|
Packit |
13e616 |
p_opts->force_link_speed,
|
|
Packit |
13e616 |
p_opts->force_link_speed_ext,
|
|
Packit |
13e616 |
p_opts->force_link_width,
|
|
Packit |
13e616 |
p_opts->fdr10,
|
|
Packit |
13e616 |
p_opts->subnet_timeout,
|
|
Packit |
13e616 |
p_opts->local_phy_errors_threshold,
|
|
Packit |
13e616 |
p_opts->overrun_errors_threshold,
|
|
Packit |
13e616 |
p_opts->use_mfttop ? "TRUE" : "FALSE");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"#\n# PARTITIONING OPTIONS\n#\n"
|
|
Packit |
13e616 |
"# Partition configuration file to be used\n"
|
|
Packit |
13e616 |
"partition_config_file %s\n\n"
|
|
Packit |
13e616 |
"# Disable partition enforcement by switches (DEPRECATED)\n"
|
|
Packit |
13e616 |
"# This option is DEPRECATED. Please use part_enforce instead\n"
|
|
Packit |
13e616 |
"no_partition_enforcement %s\n\n"
|
|
Packit |
13e616 |
"# Partition enforcement type (for switches)\n"
|
|
Packit |
13e616 |
"# Values are both, out, in and off\n"
|
|
Packit |
13e616 |
"# Default is both (outbound and inbound enforcement)\n"
|
|
Packit |
13e616 |
"part_enforce %s\n\n"
|
|
Packit |
13e616 |
"# Allow both full and limited membership on the same partition\n"
|
|
Packit |
13e616 |
"allow_both_pkeys %s\n\n"
|
|
Packit |
13e616 |
"# Keep current and take into account old pkey indexes\n"
|
|
Packit |
13e616 |
"# during calculation of physical ports pkey tables\n"
|
|
Packit |
13e616 |
"keep_pkey_indexes %s\n\n"
|
|
Packit |
13e616 |
"# SM assigned GUID byte where GUID is formed from OpenFabrics OUI\n"
|
|
Packit |
13e616 |
"# followed by 40 bits xy 00 ab cd ef where xy is the SM assigned GUID byte\n"
|
|
Packit |
13e616 |
"# and ab cd ef is an SM autogenerated 24 bits\n"
|
|
Packit |
13e616 |
"# SM assigned GUID byte should be configured as subnet unique\n"
|
|
Packit |
13e616 |
"sm_assigned_guid 0x%02x\n\n",
|
|
Packit |
13e616 |
p_opts->partition_config_file,
|
|
Packit |
13e616 |
p_opts->no_partition_enforcement ? "TRUE" : "FALSE",
|
|
Packit |
13e616 |
p_opts->part_enforce,
|
|
Packit |
13e616 |
p_opts->allow_both_pkeys ? "TRUE" : "FALSE",
|
|
Packit |
13e616 |
p_opts->keep_pkey_indexes ? "TRUE" : "FALSE",
|
|
Packit |
13e616 |
p_opts->sm_assigned_guid);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"#\n# SWEEP OPTIONS\n#\n"
|
|
Packit |
13e616 |
"# The number of seconds between subnet sweeps (0 disables it)\n"
|
|
Packit |
13e616 |
"sweep_interval %u\n\n"
|
|
Packit |
13e616 |
"# If TRUE cause all lids to be reassigned\n"
|
|
Packit |
13e616 |
"reassign_lids %s\n\n"
|
|
Packit |
13e616 |
"# If TRUE forces every sweep to be a heavy sweep\n"
|
|
Packit |
13e616 |
"force_heavy_sweep %s\n\n"
|
|
Packit |
13e616 |
"# If TRUE every trap 128 and 144 will cause a heavy sweep.\n"
|
|
Packit |
13e616 |
"# NOTE: successive identical traps (>10) are suppressed\n"
|
|
Packit |
13e616 |
"sweep_on_trap %s\n\n",
|
|
Packit |
13e616 |
p_opts->sweep_interval,
|
|
Packit |
13e616 |
p_opts->reassign_lids ? "TRUE" : "FALSE",
|
|
Packit |
13e616 |
p_opts->force_heavy_sweep ? "TRUE" : "FALSE",
|
|
Packit |
13e616 |
p_opts->sweep_on_trap ? "TRUE" : "FALSE");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"#\n# ROUTING OPTIONS\n#\n"
|
|
Packit |
13e616 |
"# If TRUE count switches as link subscriptions\n"
|
|
Packit |
13e616 |
"port_profile_switch_nodes %s\n\n",
|
|
Packit |
13e616 |
p_opts->port_profile_switch_nodes ? "TRUE" : "FALSE");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"# Name of file with port guids to be ignored by port profiling\n"
|
|
Packit |
13e616 |
"port_prof_ignore_file %s\n\n", p_opts->port_prof_ignore_file ?
|
|
Packit |
13e616 |
p_opts->port_prof_ignore_file : null_str);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"# The file holding routing weighting factors per output port\n"
|
|
Packit |
13e616 |
"hop_weights_file %s\n\n",
|
|
Packit |
13e616 |
p_opts->hop_weights_file ? p_opts->hop_weights_file : null_str);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"# The file holding non-default port order per switch for routing\n"
|
|
Packit |
13e616 |
"port_search_ordering_file %s\n\n",
|
|
Packit |
13e616 |
p_opts->port_search_ordering_file ?
|
|
Packit |
13e616 |
p_opts->port_search_ordering_file : null_str);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"# Routing engine\n"
|
|
Packit |
13e616 |
"# Multiple routing engines can be specified separated by\n"
|
|
Packit |
13e616 |
"# commas so that specific ordering of routing algorithms will\n"
|
|
Packit |
13e616 |
"# be tried if earlier routing engines fail.\n"
|
|
Packit |
13e616 |
"# Supported engines: minhop, updn, dnup, file, ftree, lash,\n"
|
|
Packit |
13e616 |
"# dor, torus-2QoS, nue, dfsssp, sssp\n"
|
|
Packit |
13e616 |
"routing_engine %s\n\n", p_opts->routing_engine_names ?
|
|
Packit |
13e616 |
p_opts->routing_engine_names : null_str);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"# Routing engines will avoid throttled switch-to-switch links\n"
|
|
Packit |
13e616 |
"# (supported by: nue, dfsssp, sssp; use FALSE if unsure)\n"
|
|
Packit |
13e616 |
"avoid_throttled_links %s\n\n",
|
|
Packit |
13e616 |
p_opts->avoid_throttled_links ? "TRUE" : "FALSE");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"# Connect roots (use FALSE if unsure)\n"
|
|
Packit |
13e616 |
"connect_roots %s\n\n",
|
|
Packit |
13e616 |
p_opts->connect_roots ? "TRUE" : "FALSE");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"# Use unicast routing cache (use FALSE if unsure)\n"
|
|
Packit |
13e616 |
"use_ucast_cache %s\n\n",
|
|
Packit |
13e616 |
p_opts->use_ucast_cache ? "TRUE" : "FALSE");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"# Lid matrix dump file name\n"
|
|
Packit |
13e616 |
"lid_matrix_dump_file %s\n\n", p_opts->lid_matrix_dump_file ?
|
|
Packit |
13e616 |
p_opts->lid_matrix_dump_file : null_str);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"# LFTs file name\nlfts_file %s\n\n",
|
|
Packit |
13e616 |
p_opts->lfts_file ? p_opts->lfts_file : null_str);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"# The file holding the root node guids (for fat-tree or Up/Down)\n"
|
|
Packit |
13e616 |
"# One guid in each line\nroot_guid_file %s\n\n",
|
|
Packit |
13e616 |
p_opts->root_guid_file ? p_opts->root_guid_file : null_str);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"# The file holding the fat-tree compute node guids\n"
|
|
Packit |
13e616 |
"# One guid in each line\ncn_guid_file %s\n\n",
|
|
Packit |
13e616 |
p_opts->cn_guid_file ? p_opts->cn_guid_file : null_str);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"# The file holding the fat-tree I/O node guids\n"
|
|
Packit |
13e616 |
"# One guid in each line.\n"
|
|
Packit |
13e616 |
"# If only io_guid file is provided, the rest of nodes\n"
|
|
Packit |
13e616 |
"# are considered as compute nodes.\n"
|
|
Packit |
13e616 |
"io_guid_file %s\n\n",
|
|
Packit |
13e616 |
p_opts->io_guid_file ? p_opts->io_guid_file : null_str);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"# If TRUE enables alternative indexing policy for ftree routing\n"
|
|
Packit |
13e616 |
"# in quasi-ftree topologies that can improve shift-pattern support.\n"
|
|
Packit |
13e616 |
"# The switch indexing starts from root switch and leaf switches\n"
|
|
Packit |
13e616 |
"# are termination points of BFS algorithm\n"
|
|
Packit |
13e616 |
"# If FALSE, the indexing starts from leaf switch (default)\n"
|
|
Packit |
13e616 |
"quasi_ftree_indexing %s\n\n",
|
|
Packit |
13e616 |
p_opts->quasi_ftree_indexing ? "TRUE" : "FALSE");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"# Number of reverse hops allowed for I/O nodes\n"
|
|
Packit |
13e616 |
"# Used for connectivity between I/O nodes connected to Top Switches\nmax_reverse_hops %d\n\n",
|
|
Packit |
13e616 |
p_opts->max_reverse_hops);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"# The file holding the node ids which will be used by"
|
|
Packit |
13e616 |
" Up/Down algorithm instead\n# of GUIDs (one guid and"
|
|
Packit |
13e616 |
" id in each line)\nids_guid_file %s\n\n",
|
|
Packit |
13e616 |
p_opts->ids_guid_file ? p_opts->ids_guid_file : null_str);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"# The file holding guid routing order guids (for MinHop and Up/Down)\n"
|
|
Packit |
13e616 |
"guid_routing_order_file %s\n\n",
|
|
Packit |
13e616 |
p_opts->guid_routing_order_file ? p_opts->guid_routing_order_file : null_str);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"# Do mesh topology analysis (for LASH algorithm)\n"
|
|
Packit |
13e616 |
"do_mesh_analysis %s\n\n",
|
|
Packit |
13e616 |
p_opts->do_mesh_analysis ? "TRUE" : "FALSE");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"# Starting VL for LASH algorithm\n"
|
|
Packit |
13e616 |
"lash_start_vl %u\n\n",
|
|
Packit |
13e616 |
p_opts->lash_start_vl);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"# Maximum number of VLs for Nue routing algorithm (default: 1; to enforce\n"
|
|
Packit |
13e616 |
"# deadlock-freedom even if QoS is not enabled). Set to 0 if Nue should\n"
|
|
Packit |
13e616 |
"# automatically determine and choose maximum supported by the fabric, or\n"
|
|
Packit |
13e616 |
"# any integer >= 1 (then Nue uses min(max_supported,nue_max_num_vls)\n"
|
|
Packit |
13e616 |
"nue_max_num_vls %u\n\n",
|
|
Packit |
13e616 |
p_opts->nue_max_num_vls);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"# If TRUE, then Nue assumes that switches will send/receive\n"
|
|
Packit |
13e616 |
"# data traffic, too, and hence their paths are included in\n"
|
|
Packit |
13e616 |
"# the deadlock-avoidance calculation (use FALSE if unsure)\n"
|
|
Packit |
13e616 |
"nue_include_switches %s\n\n",
|
|
Packit |
13e616 |
p_opts->nue_include_switches ? "TRUE" : "FALSE");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"# Port Shifting (use FALSE if unsure)\n"
|
|
Packit |
13e616 |
"port_shifting %s\n\n",
|
|
Packit |
13e616 |
p_opts->port_shifting ? "TRUE" : "FALSE");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"# Assign ports in a random order instead of round-robin\n"
|
|
Packit |
13e616 |
"# If zero disable (default), otherwise use the value as a random seed\n"
|
|
Packit |
13e616 |
"scatter_ports %d\n\n",
|
|
Packit |
13e616 |
p_opts->scatter_ports);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"# Don't use scatter for ports defined in\n"
|
|
Packit |
13e616 |
"# guid_routing_order file\n"
|
|
Packit |
13e616 |
"guid_routing_order_no_scatter %s\n\n",
|
|
Packit |
13e616 |
p_opts->guid_routing_order_no_scatter ? "TRUE" : "FALSE");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"# SA database file name\nsa_db_file %s\n\n",
|
|
Packit |
13e616 |
p_opts->sa_db_file ? p_opts->sa_db_file : null_str);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"# If TRUE causes OpenSM to dump SA database at the end of\n"
|
|
Packit |
13e616 |
"# every light sweep, regardless of the verbosity level\n"
|
|
Packit |
13e616 |
"sa_db_dump %s\n\n",
|
|
Packit |
13e616 |
p_opts->sa_db_dump ? "TRUE" : "FALSE");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"# Torus-2QoS configuration file name\ntorus_config %s\n\n",
|
|
Packit |
13e616 |
p_opts->torus_conf_file ? p_opts->torus_conf_file : null_str);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"#\n# HANDOVER - MULTIPLE SMs OPTIONS\n#\n"
|
|
Packit |
13e616 |
"# SM priority used for deciding who is the master\n"
|
|
Packit |
13e616 |
"# Range goes from 0 (lowest priority) to 15 (highest).\n"
|
|
Packit |
13e616 |
"sm_priority %u\n\n"
|
|
Packit |
13e616 |
"# If TRUE other SMs on the subnet should be ignored\n"
|
|
Packit |
13e616 |
"ignore_other_sm %s\n\n"
|
|
Packit |
13e616 |
"# Timeout in [msec] between two polls of active master SM\n"
|
|
Packit |
13e616 |
"sminfo_polling_timeout %u\n\n"
|
|
Packit |
13e616 |
"# Number of failing polls of remote SM that declares it dead\n"
|
|
Packit |
13e616 |
"polling_retry_number %u\n\n"
|
|
Packit |
13e616 |
"# If TRUE honor the guid2lid file when coming out of standby\n"
|
|
Packit |
13e616 |
"# state, if such file exists and is valid\n"
|
|
Packit |
13e616 |
"honor_guid2lid_file %s\n\n",
|
|
Packit |
13e616 |
p_opts->sm_priority,
|
|
Packit |
13e616 |
p_opts->ignore_other_sm ? "TRUE" : "FALSE",
|
|
Packit |
13e616 |
p_opts->sminfo_polling_timeout,
|
|
Packit |
13e616 |
p_opts->polling_retry_number,
|
|
Packit |
13e616 |
p_opts->honor_guid2lid_file ? "TRUE" : "FALSE");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"#\n# TIMING AND THREADING OPTIONS\n#\n"
|
|
Packit |
13e616 |
"# Maximum number of SMPs sent in parallel\n"
|
|
Packit |
13e616 |
"max_wire_smps %u\n\n"
|
|
Packit |
13e616 |
"# Maximum number of timeout based SMPs allowed to be outstanding\n"
|
|
Packit |
13e616 |
"# A value less than or equal to max_wire_smps disables this mechanism\n"
|
|
Packit |
13e616 |
"max_wire_smps2 %u\n\n"
|
|
Packit |
13e616 |
"# The timeout in [usec] used for sending SMPs above max_wire_smps limit\n"
|
|
Packit |
13e616 |
"# and below max_wire_smps2 limit\n"
|
|
Packit |
13e616 |
"max_smps_timeout %u\n\n"
|
|
Packit |
13e616 |
"# The maximum time in [msec] allowed for a transaction to complete\n"
|
|
Packit |
13e616 |
"transaction_timeout %u\n\n"
|
|
Packit |
13e616 |
"# The maximum number of retries allowed for a transaction to complete\n"
|
|
Packit |
13e616 |
"transaction_retries %u\n\n"
|
|
Packit |
13e616 |
"# The maximum time in [msec] allowed for a \"long\" transacrion to complete\n"
|
|
Packit |
13e616 |
"# Currently, long transaction is only set of optimized SL2VLMappingTable\n"
|
|
Packit |
13e616 |
"long_transaction_timeout %u\n\n"
|
|
Packit |
13e616 |
"# Maximal time in [msec] a message can stay in the incoming message queue.\n"
|
|
Packit |
13e616 |
"# If there is more than one message in the queue and the last message\n"
|
|
Packit |
13e616 |
"# stayed in the queue more than this value, any SA request will be\n"
|
|
Packit |
13e616 |
"# immediately be dropped but BUSY status is not currently returned.\n"
|
|
Packit |
13e616 |
"max_msg_fifo_timeout %u\n\n"
|
|
Packit |
13e616 |
"# Use a single thread for handling SA queries\n"
|
|
Packit |
13e616 |
"single_thread %s\n\n",
|
|
Packit |
13e616 |
p_opts->max_wire_smps,
|
|
Packit |
13e616 |
p_opts->max_wire_smps2,
|
|
Packit |
13e616 |
p_opts->max_smps_timeout,
|
|
Packit |
13e616 |
p_opts->transaction_timeout,
|
|
Packit |
13e616 |
p_opts->transaction_retries,
|
|
Packit |
13e616 |
p_opts->long_transaction_timeout,
|
|
Packit |
13e616 |
p_opts->max_msg_fifo_timeout,
|
|
Packit |
13e616 |
p_opts->single_thread ? "TRUE" : "FALSE");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"#\n# MISC OPTIONS\n#\n"
|
|
Packit |
13e616 |
"# Daemon mode\n"
|
|
Packit |
13e616 |
"daemon %s\n\n"
|
|
Packit |
13e616 |
"# SM Inactive\n"
|
|
Packit |
13e616 |
"sm_inactive %s\n\n"
|
|
Packit |
13e616 |
"# Babbling Port Policy\n"
|
|
Packit |
13e616 |
"babbling_port_policy %s\n\n"
|
|
Packit |
13e616 |
"# Drop event subscriptions (InformInfo and ServiceRecord) on port removal and SM coming out of STANDBY\n"
|
|
Packit |
13e616 |
"drop_event_subscriptions %s\n\n"
|
|
Packit |
13e616 |
"# Validate IPoIB non-broadcast group creation parameters against\n"
|
|
Packit |
13e616 |
"# broadcast group parameters per IETF RFC 4391 (default TRUE)\n"
|
|
Packit |
13e616 |
"ipoib_mcgroup_creation_validation %s\n\n"
|
|
Packit |
13e616 |
"# Validate multicast join parameters against multicast group\n"
|
|
Packit |
13e616 |
"# parameters when MC group already exists\n"
|
|
Packit |
13e616 |
"mcgroup_join_validation %s\n\n"
|
|
Packit |
13e616 |
"# Use original extended SA rates only\n"
|
|
Packit |
13e616 |
"# The original extended SA rates are up through 300 Gbps (12x EDR)\n"
|
|
Packit |
13e616 |
"# Set to TRUE for subnets with old kernels/drivers that don't understand\n"
|
|
Packit |
13e616 |
"# the new SA rates for 2x link width and/or HDR link speed (19-22)\n"
|
|
Packit |
13e616 |
"# default is FALSE\n"
|
|
Packit |
13e616 |
"use_original_extended_sa_rates_only %s\n\n"
|
|
Packit |
13e616 |
"# Use Optimized SLtoVLMapping programming if supported by device\n"
|
|
Packit |
13e616 |
"use_optimized_slvl %s\n\n"
|
|
Packit |
13e616 |
"# Sync in memory files used for high availability with storage\n"
|
|
Packit |
13e616 |
"fsync_high_avail_files %s\n\n",
|
|
Packit |
13e616 |
p_opts->daemon ? "TRUE" : "FALSE",
|
|
Packit |
13e616 |
p_opts->sm_inactive ? "TRUE" : "FALSE",
|
|
Packit |
13e616 |
p_opts->babbling_port_policy ? "TRUE" : "FALSE",
|
|
Packit |
13e616 |
p_opts->drop_event_subscriptions ? "TRUE" : "FALSE",
|
|
Packit |
13e616 |
p_opts->ipoib_mcgroup_creation_validation ? "TRUE" : "FALSE",
|
|
Packit |
13e616 |
p_opts->mcgroup_join_validation ? "TRUE" : "FALSE",
|
|
Packit |
13e616 |
p_opts->use_original_extended_sa_rates_only ? "TRUE" : "FALSE",
|
|
Packit |
13e616 |
p_opts->use_optimized_slvl ? "TRUE" : "FALSE",
|
|
Packit |
13e616 |
p_opts->fsync_high_avail_files ? "TRUE" : "FALSE");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
#ifdef ENABLE_OSM_PERF_MGR
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"#\n# Performance Manager Options\n#\n"
|
|
Packit |
13e616 |
"# perfmgr enable\n"
|
|
Packit |
13e616 |
"# PerfMgr is enabled if TRUE and disabled if FALSE (default FALSE)\n"
|
|
Packit |
13e616 |
"perfmgr %s\n\n"
|
|
Packit |
13e616 |
"# redirection enable\n"
|
|
Packit |
13e616 |
"# Redirection supported if TRUE and not supported if FALSE (default TRUE)\n"
|
|
Packit |
13e616 |
"perfmgr_redir %s\n\n"
|
|
Packit |
13e616 |
"# sweep time in seconds (default %u seconds)\n"
|
|
Packit |
13e616 |
"perfmgr_sweep_time_s %u\n\n"
|
|
Packit |
13e616 |
"# Max outstanding queries (default %u)\n"
|
|
Packit |
13e616 |
"perfmgr_max_outstanding_queries %u\n\n"
|
|
Packit |
13e616 |
"# Ignore CAs on sweep (default FALSE)\n"
|
|
Packit |
13e616 |
"perfmgr_ignore_cas %s\n\n"
|
|
Packit |
13e616 |
"# Remove missing nodes from DB (default TRUE)\n"
|
|
Packit |
13e616 |
"perfmgr_rm_nodes %s\n\n"
|
|
Packit |
13e616 |
"# Log error counters to opensm.log (default TRUE)\n"
|
|
Packit |
13e616 |
"perfmgr_log_errors %s\n\n"
|
|
Packit |
13e616 |
"# Query PerfMgt Get(ClassPortInfo) for extended capabilities\n"
|
|
Packit |
13e616 |
"# Extended capabilities include 64 bit extended counters\n"
|
|
Packit |
13e616 |
"# and transmit wait support (default TRUE)\n"
|
|
Packit |
13e616 |
"perfmgr_query_cpi %s\n\n"
|
|
Packit |
13e616 |
"# Log xmit_wait errors (default FALSE)\n"
|
|
Packit |
13e616 |
"perfmgr_xmit_wait_log %s\n\n"
|
|
Packit |
13e616 |
"# If logging xmit_wait's; set threshold (default %u)\n"
|
|
Packit |
13e616 |
"perfmgr_xmit_wait_threshold %u\n\n"
|
|
Packit |
13e616 |
,
|
|
Packit |
13e616 |
p_opts->perfmgr ? "TRUE" : "FALSE",
|
|
Packit |
13e616 |
p_opts->perfmgr_redir ? "TRUE" : "FALSE",
|
|
Packit |
13e616 |
OSM_PERFMGR_DEFAULT_SWEEP_TIME_S,
|
|
Packit |
13e616 |
p_opts->perfmgr_sweep_time_s,
|
|
Packit |
13e616 |
OSM_PERFMGR_DEFAULT_MAX_OUTSTANDING_QUERIES,
|
|
Packit |
13e616 |
p_opts->perfmgr_max_outstanding_queries,
|
|
Packit |
13e616 |
p_opts->perfmgr_ignore_cas ? "TRUE" : "FALSE",
|
|
Packit |
13e616 |
p_opts->perfmgr_rm_nodes ? "TRUE" : "FALSE",
|
|
Packit |
13e616 |
p_opts->perfmgr_log_errors ? "TRUE" : "FALSE",
|
|
Packit |
13e616 |
p_opts->perfmgr_query_cpi ? "TRUE" : "FALSE",
|
|
Packit |
13e616 |
p_opts->perfmgr_xmit_wait_log ? "TRUE" : "FALSE",
|
|
Packit |
13e616 |
OSM_PERFMGR_DEFAULT_XMIT_WAIT_THRESHOLD,
|
|
Packit |
13e616 |
p_opts->perfmgr_xmit_wait_threshold);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"#\n# Event DB Options\n#\n"
|
|
Packit |
13e616 |
"# Dump file to dump the events to\n"
|
|
Packit |
13e616 |
"event_db_dump_file %s\n\n", p_opts->event_db_dump_file ?
|
|
Packit |
13e616 |
p_opts->event_db_dump_file : null_str);
|
|
Packit |
13e616 |
#endif /* ENABLE_OSM_PERF_MGR */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"#\n# Event Plugin Options\n#\n"
|
|
Packit |
13e616 |
"# Event plugin name(s)\n"
|
|
Packit |
13e616 |
"event_plugin_name %s\n\n"
|
|
Packit |
13e616 |
"# Options string that would be passed to the plugin(s)\n"
|
|
Packit |
13e616 |
"event_plugin_options %s\n\n",
|
|
Packit |
13e616 |
p_opts->event_plugin_name ?
|
|
Packit |
13e616 |
p_opts->event_plugin_name : null_str,
|
|
Packit |
13e616 |
p_opts->event_plugin_options ?
|
|
Packit |
13e616 |
p_opts->event_plugin_options : null_str);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"#\n# Node name map for mapping node's to more descriptive node descriptions\n"
|
|
Packit |
13e616 |
"# (man ibnetdiscover for more information)\n#\n"
|
|
Packit |
13e616 |
"node_name_map_name %s\n\n", p_opts->node_name_map_name ?
|
|
Packit |
13e616 |
p_opts->node_name_map_name : null_str);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"#\n# DEBUG FEATURES\n#\n"
|
|
Packit |
13e616 |
"# The log flags used\n"
|
|
Packit |
13e616 |
"log_flags 0x%02x\n\n"
|
|
Packit |
13e616 |
"# Force flush of the log file after each log message\n"
|
|
Packit |
13e616 |
"force_log_flush %s\n\n"
|
|
Packit |
13e616 |
"# Log file to be used\n"
|
|
Packit |
13e616 |
"log_file %s\n\n"
|
|
Packit |
13e616 |
"# Limit the size of the log file in MB. If overrun, log is restarted\n"
|
|
Packit |
13e616 |
"log_max_size %u\n\n"
|
|
Packit |
13e616 |
"# If TRUE will accumulate the log over multiple OpenSM sessions\n"
|
|
Packit |
13e616 |
"accum_log_file %s\n\n"
|
|
Packit |
13e616 |
"# Per module logging configuration file\n"
|
|
Packit |
13e616 |
"# Each line in config file contains <module_name><separator><log_flags>\n"
|
|
Packit |
13e616 |
"# where module_name is file name including .c\n"
|
|
Packit |
13e616 |
"# separator is either = , space, or tab\n"
|
|
Packit |
13e616 |
"# log_flags is the same flags as used in the coarse/overall logging\n"
|
|
Packit |
13e616 |
"per_module_logging_file %s\n\n"
|
|
Packit |
13e616 |
"# The directory to hold the file OpenSM dumps\n"
|
|
Packit |
13e616 |
"dump_files_dir %s\n\n"
|
|
Packit |
13e616 |
"# If TRUE enables new high risk options and hardware specific quirks\n"
|
|
Packit |
13e616 |
"enable_quirks %s\n\n"
|
|
Packit |
13e616 |
"# If TRUE disables client reregistration\n"
|
|
Packit |
13e616 |
"no_clients_rereg %s\n\n"
|
|
Packit |
13e616 |
"# If TRUE OpenSM should disable multicast support and\n"
|
|
Packit |
13e616 |
"# no multicast routing is performed if TRUE\n"
|
|
Packit |
13e616 |
"disable_multicast %s\n\n"
|
|
Packit |
13e616 |
"# If TRUE opensm will exit on fatal initialization issues\n"
|
|
Packit |
13e616 |
"exit_on_fatal %s\n\n" "# console [off|local"
|
|
Packit |
13e616 |
#ifdef ENABLE_OSM_CONSOLE_LOOPBACK
|
|
Packit |
13e616 |
"|loopback"
|
|
Packit |
13e616 |
#endif
|
|
Packit |
13e616 |
#ifdef ENABLE_OSM_CONSOLE_SOCKET
|
|
Packit |
13e616 |
"|socket]\n"
|
|
Packit |
13e616 |
#else
|
|
Packit |
13e616 |
"]\n"
|
|
Packit |
13e616 |
#endif
|
|
Packit |
13e616 |
"console %s\n\n"
|
|
Packit |
13e616 |
"# Telnet port for console (default %d)\n"
|
|
Packit |
13e616 |
"console_port %d\n\n",
|
|
Packit |
13e616 |
p_opts->log_flags,
|
|
Packit |
13e616 |
p_opts->force_log_flush ? "TRUE" : "FALSE",
|
|
Packit |
13e616 |
p_opts->log_file,
|
|
Packit |
13e616 |
p_opts->log_max_size,
|
|
Packit |
13e616 |
p_opts->accum_log_file ? "TRUE" : "FALSE",
|
|
Packit |
13e616 |
p_opts->per_module_logging_file ?
|
|
Packit |
13e616 |
p_opts->per_module_logging_file : null_str,
|
|
Packit |
13e616 |
p_opts->dump_files_dir,
|
|
Packit |
13e616 |
p_opts->enable_quirks ? "TRUE" : "FALSE",
|
|
Packit |
13e616 |
p_opts->no_clients_rereg ? "TRUE" : "FALSE",
|
|
Packit |
13e616 |
p_opts->disable_multicast ? "TRUE" : "FALSE",
|
|
Packit |
13e616 |
p_opts->exit_on_fatal ? "TRUE" : "FALSE",
|
|
Packit |
13e616 |
p_opts->console,
|
|
Packit |
13e616 |
OSM_DEFAULT_CONSOLE_PORT, p_opts->console_port);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"#\n# QoS OPTIONS\n#\n"
|
|
Packit |
13e616 |
"# Enable QoS setup\n"
|
|
Packit |
13e616 |
"qos %s\n\n"
|
|
Packit |
13e616 |
"# QoS policy file to be used\n"
|
|
Packit |
13e616 |
"qos_policy_file %s\n\n"
|
|
Packit |
13e616 |
"# Suppress QoS MAD status errors\n"
|
|
Packit |
13e616 |
"suppress_sl2vl_mad_status_errors %s\n\n",
|
|
Packit |
13e616 |
p_opts->qos ? "TRUE" : "FALSE", p_opts->qos_policy_file,
|
|
Packit |
13e616 |
p_opts->suppress_sl2vl_mad_status_errors ? "TRUE" : "FALSE");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
subn_dump_qos_options(out,
|
|
Packit |
13e616 |
"QoS default options", "qos",
|
|
Packit |
13e616 |
&p_opts->qos_options);
|
|
Packit |
13e616 |
fprintf(out, "\n");
|
|
Packit |
13e616 |
subn_dump_qos_options(out,
|
|
Packit |
13e616 |
"QoS CA options", "qos_ca",
|
|
Packit |
13e616 |
&p_opts->qos_ca_options);
|
|
Packit |
13e616 |
fprintf(out, "\n");
|
|
Packit |
13e616 |
subn_dump_qos_options(out,
|
|
Packit |
13e616 |
"QoS Switch Port 0 options", "qos_sw0",
|
|
Packit |
13e616 |
&p_opts->qos_sw0_options);
|
|
Packit |
13e616 |
fprintf(out, "\n");
|
|
Packit |
13e616 |
subn_dump_qos_options(out,
|
|
Packit |
13e616 |
"QoS Switch external ports options", "qos_swe",
|
|
Packit |
13e616 |
&p_opts->qos_swe_options);
|
|
Packit |
13e616 |
fprintf(out, "\n");
|
|
Packit |
13e616 |
subn_dump_qos_options(out,
|
|
Packit |
13e616 |
"QoS Router ports options", "qos_rtr",
|
|
Packit |
13e616 |
&p_opts->qos_rtr_options);
|
|
Packit |
13e616 |
fprintf(out, "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"#\n# Congestion Control OPTIONS (EXPERIMENTAL)\n#\n\n"
|
|
Packit |
13e616 |
"# Enable Congestion Control Configuration\n"
|
|
Packit |
13e616 |
"congestion_control %s\n\n"
|
|
Packit |
13e616 |
"# CCKey to use when configuring congestion control\n"
|
|
Packit |
13e616 |
"# note that this does not configure a new CCkey, only the CCkey to use\n"
|
|
Packit |
13e616 |
"cc_key 0x%016" PRIx64 "\n\n"
|
|
Packit |
13e616 |
"# Congestion Control Max outstanding MAD\n"
|
|
Packit |
13e616 |
"cc_max_outstanding_mads %u\n\n",
|
|
Packit |
13e616 |
p_opts->congestion_control ? "TRUE" : "FALSE",
|
|
Packit |
13e616 |
cl_ntoh64(p_opts->cc_key),
|
|
Packit |
13e616 |
p_opts->cc_max_outstanding_mads);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"#\n# Congestion Control SwitchCongestionSetting options\n#\n"
|
|
Packit |
13e616 |
"# Control Map - bitmask indicating which of the following are to be used\n"
|
|
Packit |
13e616 |
"# bit 0 - victim mask\n"
|
|
Packit |
13e616 |
"# bit 1 - credit mask\n"
|
|
Packit |
13e616 |
"# bit 2 - threshold + packet size\n"
|
|
Packit |
13e616 |
"# bit 3 - credit starvation threshold + return delay valid\n"
|
|
Packit |
13e616 |
"# bit 4 - marking rate valid\n"
|
|
Packit |
13e616 |
"cc_sw_cong_setting_control_map 0x%X\n\n",
|
|
Packit |
13e616 |
cl_ntoh32(p_opts->cc_sw_cong_setting_control_map));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"# Victim Mask - 256 bit mask representing switch ports, mark packets with FECN\n"
|
|
Packit |
13e616 |
"# whether they are the source or victim of congestion\n"
|
|
Packit |
13e616 |
"# bit 0 - port 0 (enhanced port)\n"
|
|
Packit |
13e616 |
"# bit 1 - port 1\n"
|
|
Packit |
13e616 |
"# ...\n"
|
|
Packit |
13e616 |
"# bit 254 - port 254\n"
|
|
Packit |
13e616 |
"# bit 255 - reserved\n"
|
|
Packit |
13e616 |
"cc_sw_cong_setting_victim_mask 0x");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
for (i = 0; i < IB_CC_PORT_MASK_DATA_SIZE; i++)
|
|
Packit |
13e616 |
fprintf(out, "%02X", p_opts->cc_sw_cong_setting_victim_mask[i]);
|
|
Packit |
13e616 |
fprintf(out, "\n\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"# Credit Mask - 256 bit mask representing switch ports to apply credit starvation\n"
|
|
Packit |
13e616 |
"# bit 0 - port 0 (enhanced port)\n"
|
|
Packit |
13e616 |
"# bit 1 - port 1\n"
|
|
Packit |
13e616 |
"# ...\n"
|
|
Packit |
13e616 |
"# bit 254 - port 254\n"
|
|
Packit |
13e616 |
"# bit 255 - reserved\n"
|
|
Packit |
13e616 |
"cc_sw_cong_setting_credit_mask 0x");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
for (i = 0; i < IB_CC_PORT_MASK_DATA_SIZE; i++)
|
|
Packit |
13e616 |
fprintf(out, "%02X", p_opts->cc_sw_cong_setting_credit_mask[i]);
|
|
Packit |
13e616 |
fprintf(out, "\n\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"# Threshold - value indicating aggressiveness of congestion marking\n"
|
|
Packit |
13e616 |
"# 0x0 - none, 0x1 - loose, ..., 0xF - aggressive\n"
|
|
Packit |
13e616 |
"cc_sw_cong_setting_threshold 0x%02X\n\n"
|
|
Packit |
13e616 |
"# Packet Size - any packet less than this size will not be marked with a FECN\n"
|
|
Packit |
13e616 |
"# units are in credits\n"
|
|
Packit |
13e616 |
"cc_sw_cong_setting_packet_size %u\n\n"
|
|
Packit |
13e616 |
"# Credit Starvation Threshold - value indicating aggressiveness of credit starvation\n"
|
|
Packit |
13e616 |
"# 0x0 - none, 0x1 - loose, ..., 0xF - aggressive\n"
|
|
Packit |
13e616 |
"cc_sw_cong_setting_credit_starvation_threshold 0x%02X\n\n"
|
|
Packit |
13e616 |
"# Credit Starvation Return Delay - in CCT entry shift:multiplier format, see IB spec\n"
|
|
Packit |
13e616 |
"cc_sw_cong_setting_credit_starvation_return_delay %u:%u\n\n"
|
|
Packit |
13e616 |
"# Marking Rate - mean number of packets between markings\n"
|
|
Packit |
13e616 |
"cc_sw_cong_setting_marking_rate %u\n\n",
|
|
Packit |
13e616 |
p_opts->cc_sw_cong_setting_threshold,
|
|
Packit |
13e616 |
p_opts->cc_sw_cong_setting_packet_size,
|
|
Packit |
13e616 |
p_opts->cc_sw_cong_setting_credit_starvation_threshold,
|
|
Packit |
13e616 |
p_opts->cc_sw_cong_setting_credit_starvation_return_delay.shift,
|
|
Packit |
13e616 |
p_opts->cc_sw_cong_setting_credit_starvation_return_delay.multiplier,
|
|
Packit |
13e616 |
cl_ntoh16(p_opts->cc_sw_cong_setting_marking_rate));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"#\n# Congestion Control CA Congestion Setting options\n#\n"
|
|
Packit |
13e616 |
"# Port Control\n"
|
|
Packit |
13e616 |
"# bit 0 = 0, QP based congestion control\n"
|
|
Packit |
13e616 |
"# bit 0 = 1, SL/port based congestion control\n"
|
|
Packit |
13e616 |
"cc_ca_cong_setting_port_control 0x%04X\n\n"
|
|
Packit |
13e616 |
"# Control Map - 16 bit bitmask indicating which SLs should be configured\n"
|
|
Packit |
13e616 |
"cc_ca_cong_setting_control_map 0x%04X\n\n",
|
|
Packit |
13e616 |
cl_ntoh16(p_opts->cc_ca_cong_setting_port_control),
|
|
Packit |
13e616 |
cl_ntoh16(p_opts->cc_ca_cong_setting_control_map));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"#\n# CA Congestion Setting Entries\n#\n"
|
|
Packit |
13e616 |
"# Each of congestion control settings below configures the CA Congestion\n"
|
|
Packit |
13e616 |
"# Settings for an individual SL. The SL must be specified before the value.\n"
|
|
Packit |
13e616 |
"# These options may be specified multiple times to configure different values\n"
|
|
Packit |
13e616 |
"# for different SLs.\n"
|
|
Packit |
13e616 |
"#\n"
|
|
Packit |
13e616 |
"# ccti timer - when expires decrements 1 from the CCTI\n"
|
|
Packit |
13e616 |
"# ccti increase - number to be added to the table index on receipt of a BECN\n"
|
|
Packit |
13e616 |
"# trigger threshold - when the ccti is equal to this, an event is logged\n"
|
|
Packit |
13e616 |
"# ccti min - the minimum value for the ccti. This imposes a minimum rate\n"
|
|
Packit |
13e616 |
"# on the injection rate\n\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
for (i = 0; i < IB_CA_CONG_ENTRY_DATA_SIZE; i++) {
|
|
Packit |
13e616 |
/* Don't output unless one of the settings has been set, there's no need
|
|
Packit |
13e616 |
* to output 16 chunks of this with all defaults of 0 */
|
|
Packit |
13e616 |
if (p_opts->cc_ca_cong_entries[i].ccti_timer
|
|
Packit |
13e616 |
|| p_opts->cc_ca_cong_entries[i].ccti_increase
|
|
Packit |
13e616 |
|| p_opts->cc_ca_cong_entries[i].trigger_threshold
|
|
Packit |
13e616 |
|| p_opts->cc_ca_cong_entries[i].ccti_min) {
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"# SL = %u\n"
|
|
Packit |
13e616 |
"cc_ca_cong_setting_ccti_timer %u %u\n"
|
|
Packit |
13e616 |
"cc_ca_cong_setting_ccti_increase %u %u\n"
|
|
Packit |
13e616 |
"cc_ca_cong_setting_trigger_threshold %u %u\n"
|
|
Packit |
13e616 |
"cc_ca_cong_setting_ccti_min %u %u\n\n",
|
|
Packit |
13e616 |
i,
|
|
Packit |
13e616 |
i,
|
|
Packit |
13e616 |
cl_ntoh16(p_opts->cc_ca_cong_entries[i].ccti_timer),
|
|
Packit |
13e616 |
i,
|
|
Packit |
13e616 |
p_opts->cc_ca_cong_entries[i].ccti_increase,
|
|
Packit |
13e616 |
i,
|
|
Packit |
13e616 |
p_opts->cc_ca_cong_entries[i].trigger_threshold,
|
|
Packit |
13e616 |
i,
|
|
Packit |
13e616 |
p_opts->cc_ca_cong_entries[i].ccti_min);
|
|
Packit |
13e616 |
cacongoutputcount++;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* If by chance all the CA Cong Settings are default, output at least 1 chunk
|
|
Packit |
13e616 |
* for illustration */
|
|
Packit |
13e616 |
if (!cacongoutputcount)
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"# SL = 0\n"
|
|
Packit |
13e616 |
"cc_ca_cong_setting_ccti_timer 0 %u\n"
|
|
Packit |
13e616 |
"cc_ca_cong_setting_ccti_increase 0 %u\n"
|
|
Packit |
13e616 |
"cc_ca_cong_setting_trigger_threshold 0 %u\n"
|
|
Packit |
13e616 |
"cc_ca_cong_setting_ccti_min 0 %u\n\n",
|
|
Packit |
13e616 |
cl_ntoh16(p_opts->cc_ca_cong_entries[0].ccti_timer),
|
|
Packit |
13e616 |
p_opts->cc_ca_cong_entries[0].ccti_increase,
|
|
Packit |
13e616 |
p_opts->cc_ca_cong_entries[0].trigger_threshold,
|
|
Packit |
13e616 |
p_opts->cc_ca_cong_entries[0].ccti_min);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"#\n# Congestion Control Table\n#\n"
|
|
Packit |
13e616 |
"# Comma separated list of CCT entries representing CCT.\n"
|
|
Packit |
13e616 |
"# Format is shift:multipler,shift_multiplier,shift:multiplier,...\n"
|
|
Packit |
13e616 |
"cc_cct ");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (!p_opts->cc_cct.entries_len) {
|
|
Packit |
13e616 |
fprintf(out, "%s\n", null_str);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
else {
|
|
Packit |
13e616 |
fprintf(out, "%u:%u",
|
|
Packit |
13e616 |
p_opts->cc_cct.entries[0].shift,
|
|
Packit |
13e616 |
p_opts->cc_cct.entries[0].multiplier);
|
|
Packit |
13e616 |
for (i = 1; i < p_opts->cc_cct.entries_len; i++) {
|
|
Packit |
13e616 |
fprintf(out, ",%u:%u",
|
|
Packit |
13e616 |
p_opts->cc_cct.entries[i].shift,
|
|
Packit |
13e616 |
p_opts->cc_cct.entries[i].multiplier);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
fprintf(out, "\n");
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
fprintf(out, "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"# Prefix routes file name\n"
|
|
Packit |
13e616 |
"prefix_routes_file %s\n\n",
|
|
Packit |
13e616 |
p_opts->prefix_routes_file);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out,
|
|
Packit |
13e616 |
"#\n# IPv6 Solicited Node Multicast (SNM) Options\n#\n"
|
|
Packit |
13e616 |
"consolidate_ipv6_snm_req %s\n\n",
|
|
Packit |
13e616 |
p_opts->consolidate_ipv6_snm_req ? "TRUE" : "FALSE");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(out, "# Log prefix\nlog_prefix %s\n\n", p_opts->log_prefix);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* optional string attributes ... */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
int osm_subn_write_conf_file(char *file_name, IN osm_subn_opt_t * p_opts)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
FILE *opts_file;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
opts_file = fopen(file_name, "w");
|
|
Packit |
13e616 |
if (!opts_file) {
|
|
Packit |
13e616 |
printf("cannot open file \'%s\' for writing: %s\n",
|
|
Packit |
13e616 |
file_name, strerror(errno));
|
|
Packit |
13e616 |
return -1;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
osm_subn_output_conf(opts_file, p_opts);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fclose(opts_file);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
return 0;
|
|
Packit |
13e616 |
}
|