|
Packit Service |
54dbc3 |
/*
|
|
Packit Service |
54dbc3 |
* Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved.
|
|
Packit Service |
54dbc3 |
* Copyright (c) 2002-2011 Mellanox Technologies LTD. All rights reserved.
|
|
Packit Service |
54dbc3 |
* Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
|
|
Packit Service |
54dbc3 |
* Copyright (c) 2009 HNR Consulting. All rights reserved.
|
|
Packit Service |
54dbc3 |
* Copyright (c) 2009 System Fabric Works, Inc. All rights reserved.
|
|
Packit Service |
54dbc3 |
* Copyright (c) 2009-2011 ZIH, TU Dresden, Federal Republic of Germany. All rights reserved.
|
|
Packit Service |
54dbc3 |
* Copyright (C) 2012-2017 Tokyo Institute of Technology. All rights reserved.
|
|
Packit Service |
54dbc3 |
*
|
|
Packit Service |
54dbc3 |
* This software is available to you under a choice of one of two
|
|
Packit Service |
54dbc3 |
* licenses. You may choose to be licensed under the terms of the GNU
|
|
Packit Service |
54dbc3 |
* General Public License (GPL) Version 2, available from the file
|
|
Packit Service |
54dbc3 |
* COPYING in the main directory of this source tree, or the
|
|
Packit Service |
54dbc3 |
* OpenIB.org BSD license below:
|
|
Packit Service |
54dbc3 |
*
|
|
Packit Service |
54dbc3 |
* Redistribution and use in source and binary forms, with or
|
|
Packit Service |
54dbc3 |
* without modification, are permitted provided that the following
|
|
Packit Service |
54dbc3 |
* conditions are met:
|
|
Packit Service |
54dbc3 |
*
|
|
Packit Service |
54dbc3 |
* - Redistributions of source code must retain the above
|
|
Packit Service |
54dbc3 |
* copyright notice, this list of conditions and the following
|
|
Packit Service |
54dbc3 |
* disclaimer.
|
|
Packit Service |
54dbc3 |
*
|
|
Packit Service |
54dbc3 |
* - Redistributions in binary form must reproduce the above
|
|
Packit Service |
54dbc3 |
* copyright notice, this list of conditions and the following
|
|
Packit Service |
54dbc3 |
* disclaimer in the documentation and/or other materials
|
|
Packit Service |
54dbc3 |
* provided with the distribution.
|
|
Packit Service |
54dbc3 |
*
|
|
Packit Service |
54dbc3 |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
Packit Service |
54dbc3 |
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
Packit Service |
54dbc3 |
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
Packit Service |
54dbc3 |
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
Packit Service |
54dbc3 |
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
Packit Service |
54dbc3 |
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
Packit Service |
54dbc3 |
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
Packit Service |
54dbc3 |
* SOFTWARE.
|
|
Packit Service |
54dbc3 |
*
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/*
|
|
Packit Service |
54dbc3 |
* Abstract:
|
|
Packit Service |
54dbc3 |
* Command line interface for opensm.
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
#if HAVE_CONFIG_H
|
|
Packit Service |
54dbc3 |
# include <config.h>
|
|
Packit Service |
54dbc3 |
#endif /* HAVE_CONFIG_H */
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
#include <stdio.h>
|
|
Packit Service |
54dbc3 |
#include <stdlib.h>
|
|
Packit Service |
54dbc3 |
#include <getopt.h>
|
|
Packit Service |
54dbc3 |
#include <unistd.h>
|
|
Packit Service |
54dbc3 |
#include <signal.h>
|
|
Packit Service |
54dbc3 |
#include <sys/types.h>
|
|
Packit Service |
54dbc3 |
#include <sys/stat.h>
|
|
Packit Service |
54dbc3 |
#include <fcntl.h>
|
|
Packit Service |
54dbc3 |
#include <complib/cl_types.h>
|
|
Packit Service |
54dbc3 |
#include <complib/cl_debug.h>
|
|
Packit Service |
54dbc3 |
#include <opensm/osm_file_ids.h>
|
|
Packit Service |
54dbc3 |
#define FILE_ID OSM_FILE_MAIN_C
|
|
Packit Service |
54dbc3 |
#include <vendor/osm_vendor_api.h>
|
|
Packit Service |
54dbc3 |
#include <opensm/osm_version.h>
|
|
Packit Service |
54dbc3 |
#include <opensm/osm_opensm.h>
|
|
Packit Service |
54dbc3 |
#include <opensm/osm_console.h>
|
|
Packit Service |
54dbc3 |
#include <opensm/osm_console_io.h>
|
|
Packit Service |
54dbc3 |
#include <opensm/osm_perfmgr.h>
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
volatile unsigned int osm_exit_flag = 0;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static volatile unsigned int osm_hup_flag = 0;
|
|
Packit Service |
54dbc3 |
static volatile unsigned int osm_usr1_flag = 0;
|
|
Packit Service |
54dbc3 |
static char *pidfile;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
#define MAX_LOCAL_IBPORTS 64
|
|
Packit Service |
54dbc3 |
#define INVALID_GUID (0xFFFFFFFFFFFFFFFFULL)
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void mark_exit_flag(int signum)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
if (!osm_exit_flag)
|
|
Packit Service |
54dbc3 |
printf("OpenSM: Got signal %d - exiting...\n", signum);
|
|
Packit Service |
54dbc3 |
osm_exit_flag = 1;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void mark_hup_flag(int signum)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
osm_hup_flag = 1;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void mark_usr1_flag(int signum)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
osm_usr1_flag = 1;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static sigset_t saved_sigset;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void block_signals()
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
sigset_t set;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
sigemptyset(&set);
|
|
Packit Service |
54dbc3 |
sigaddset(&set, SIGINT);
|
|
Packit Service |
54dbc3 |
sigaddset(&set, SIGTERM);
|
|
Packit Service |
54dbc3 |
sigaddset(&set, SIGHUP);
|
|
Packit Service |
54dbc3 |
#ifndef HAVE_OLD_LINUX_THREADS
|
|
Packit Service |
54dbc3 |
sigaddset(&set, SIGUSR1);
|
|
Packit Service |
54dbc3 |
#endif
|
|
Packit Service |
54dbc3 |
pthread_sigmask(SIG_SETMASK, &set, &saved_sigset);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void setup_signals()
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
struct sigaction act;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
sigemptyset(&act.sa_mask);
|
|
Packit Service |
54dbc3 |
act.sa_handler = mark_exit_flag;
|
|
Packit Service |
54dbc3 |
act.sa_flags = 0;
|
|
Packit Service |
54dbc3 |
sigaction(SIGINT, &act, NULL);
|
|
Packit Service |
54dbc3 |
sigaction(SIGTERM, &act, NULL);
|
|
Packit Service |
54dbc3 |
act.sa_handler = mark_hup_flag;
|
|
Packit Service |
54dbc3 |
sigaction(SIGHUP, &act, NULL);
|
|
Packit Service |
54dbc3 |
sigaction(SIGCONT, &act, NULL);
|
|
Packit Service |
54dbc3 |
#ifndef HAVE_OLD_LINUX_THREADS
|
|
Packit Service |
54dbc3 |
act.sa_handler = mark_usr1_flag;
|
|
Packit Service |
54dbc3 |
sigaction(SIGUSR1, &act, NULL);
|
|
Packit Service |
54dbc3 |
#endif
|
|
Packit Service |
54dbc3 |
pthread_sigmask(SIG_SETMASK, &saved_sigset, NULL);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void show_usage(void)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
printf("\n------- OpenSM - Usage and options ----------------------\n");
|
|
Packit Service |
54dbc3 |
printf("Usage: opensm [options]\n");
|
|
Packit Service |
54dbc3 |
printf("Options:\n");
|
|
Packit Service |
54dbc3 |
printf("--version\n Prints OpenSM version and exits.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--config, -F <file-name>\n"
|
|
Packit Service |
54dbc3 |
" The name of the OpenSM config file. When not specified\n"
|
|
Packit Service |
54dbc3 |
" " OSM_DEFAULT_CONFIG_FILE
|
|
Packit Service |
54dbc3 |
" will be used (if exists).\n\n");
|
|
Packit Service |
54dbc3 |
printf("--create-config, -c <file-name>\n"
|
|
Packit Service |
54dbc3 |
" OpenSM will dump its configuration to the specified file and exit.\n"
|
|
Packit Service |
54dbc3 |
" This is a way to generate OpenSM configuration file template.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--guid, -g <GUID in hex>\n"
|
|
Packit Service |
54dbc3 |
" This option specifies the local port GUID value\n"
|
|
Packit Service |
54dbc3 |
" with which OpenSM should bind. OpenSM may be\n"
|
|
Packit Service |
54dbc3 |
" bound to 1 port at a time.\n"
|
|
Packit Service |
54dbc3 |
" If GUID given is 0, OpenSM displays a list\n"
|
|
Packit Service |
54dbc3 |
" of possible port GUIDs and waits for user input.\n"
|
|
Packit Service |
54dbc3 |
" Without -g, OpenSM tries to use the default port.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--lmc, -l <LMC>\n"
|
|
Packit Service |
54dbc3 |
" This option specifies the subnet's LMC value.\n"
|
|
Packit Service |
54dbc3 |
" The number of LIDs assigned to each port is 2^LMC.\n"
|
|
Packit Service |
54dbc3 |
" The LMC value must be in the range 0-7.\n"
|
|
Packit Service |
54dbc3 |
" LMC values > 0 allow multiple paths between ports.\n"
|
|
Packit Service |
54dbc3 |
" LMC values > 0 should only be used if the subnet\n"
|
|
Packit Service |
54dbc3 |
" topology actually provides multiple paths between\n"
|
|
Packit Service |
54dbc3 |
" ports, i.e. multiple interconnects between switches.\n"
|
|
Packit Service |
54dbc3 |
" Without -l, OpenSM defaults to LMC = 0, which allows\n"
|
|
Packit Service |
54dbc3 |
" one path between any two ports.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--priority, -p <PRIORITY>\n"
|
|
Packit Service |
54dbc3 |
" This option specifies the SM's PRIORITY.\n"
|
|
Packit Service |
54dbc3 |
" This will effect the handover cases, where master\n"
|
|
Packit Service |
54dbc3 |
" is chosen by priority and GUID. Range goes\n"
|
|
Packit Service |
54dbc3 |
" from 0 (lowest priority) to 15 (highest).\n\n");
|
|
Packit Service |
54dbc3 |
printf("--subnet_prefix <prefix>\n"
|
|
Packit Service |
54dbc3 |
" Set the subnet prefix to something other than the\n"
|
|
Packit Service |
54dbc3 |
" default value of 0xfe80000000000000\n\n");
|
|
Packit Service |
54dbc3 |
printf("--smkey, -k <SM_Key>\n"
|
|
Packit Service |
54dbc3 |
" This option specifies the SM's SM_Key (64 bits).\n"
|
|
Packit Service |
54dbc3 |
" This will effect SM authentication.\n"
|
|
Packit Service |
54dbc3 |
" Note that OpenSM version 3.2.1 and below used the\n"
|
|
Packit Service |
54dbc3 |
" default value '1' in a host byte order, it is fixed\n"
|
|
Packit Service |
54dbc3 |
" now but you may need this option to interoperate\n"
|
|
Packit Service |
54dbc3 |
" with old OpenSM running on a little endian machine.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--reassign_lids, -r\n"
|
|
Packit Service |
54dbc3 |
" This option causes OpenSM to reassign LIDs to all\n"
|
|
Packit Service |
54dbc3 |
" end nodes. Specifying -r on a running subnet\n"
|
|
Packit Service |
54dbc3 |
" may disrupt subnet traffic.\n"
|
|
Packit Service |
54dbc3 |
" Without -r, OpenSM attempts to preserve existing\n"
|
|
Packit Service |
54dbc3 |
" LID assignments resolving multiple use of same LID.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--routing_engine, -R <engine name>\n"
|
|
Packit Service |
54dbc3 |
" This option chooses routing engine(s) to use instead of default\n"
|
|
Packit Service |
54dbc3 |
" Min Hop algorithm. Multiple routing engines can be specified\n"
|
|
Packit Service |
54dbc3 |
" separated by commas so that specific ordering of routing\n"
|
|
Packit Service |
54dbc3 |
" algorithms will be tried if earlier routing engines fail.\n"
|
|
Packit Service |
54dbc3 |
" If all configured routing engines fail, OpenSM will always\n"
|
|
Packit Service |
54dbc3 |
" attempt to route with Min Hop unless 'no_fallback' is\n"
|
|
Packit Service |
54dbc3 |
" included in the list of routing engines.\n"
|
|
Packit Service |
54dbc3 |
" Supported engines: updn, dnup, file, ftree, lash, dor,\n"
|
|
Packit Service |
54dbc3 |
" torus-2QoS, nue, dfsssp, sssp\n\n");
|
|
Packit Service |
54dbc3 |
printf("--do_mesh_analysis\n"
|
|
Packit Service |
54dbc3 |
" This option enables additional analysis for the lash\n"
|
|
Packit Service |
54dbc3 |
" routing engine to precondition switch port assignments\n"
|
|
Packit Service |
54dbc3 |
" in regular cartesian meshes which may reduce the number\n"
|
|
Packit Service |
54dbc3 |
" of SLs required to give a deadlock free routing\n\n");
|
|
Packit Service |
54dbc3 |
printf("--lash_start_vl <vl number>\n"
|
|
Packit Service |
54dbc3 |
" Sets the starting VL to use for the lash routing algorithm.\n"
|
|
Packit Service |
54dbc3 |
" Defaults to 0.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--sm_sl <sl number>\n"
|
|
Packit Service |
54dbc3 |
" Sets the SL to use to communicate with the SM/SA. Defaults to 0.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--nue_max_num_vls <vl number>\n"
|
|
Packit Service |
54dbc3 |
" Sets the maximum number of VLs to be used by Nue routing.\n"
|
|
Packit Service |
54dbc3 |
" Defaults to 1 to enforce deadlock-freedom even if QoS is not\n"
|
|
Packit Service |
54dbc3 |
" enabled. Set to 0 if Nue should automatically determine and\n"
|
|
Packit Service |
54dbc3 |
" choose maximum supported by the fabric, or any integer >= 1.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--connect_roots, -z\n"
|
|
Packit Service |
54dbc3 |
" This option enforces routing engines (up/down and \n"
|
|
Packit Service |
54dbc3 |
" fat-tree) to make connectivity between root switches\n"
|
|
Packit Service |
54dbc3 |
" and in this way be IBA compliant. In many cases,\n"
|
|
Packit Service |
54dbc3 |
" this can violate \"pure\" deadlock free algorithm, so\n"
|
|
Packit Service |
54dbc3 |
" use it carefully.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--ucast_cache, -A\n"
|
|
Packit Service |
54dbc3 |
" This option enables unicast routing cache to prevent\n"
|
|
Packit Service |
54dbc3 |
" routing recalculation (which is a heavy task in a\n"
|
|
Packit Service |
54dbc3 |
" large cluster) when there was no topology change\n"
|
|
Packit Service |
54dbc3 |
" detected during the heavy sweep, or when the topology\n"
|
|
Packit Service |
54dbc3 |
" change does not require new routing calculation,\n"
|
|
Packit Service |
54dbc3 |
" e.g. in case of host reboot.\n"
|
|
Packit Service |
54dbc3 |
" This option becomes very handy when the cluster size\n"
|
|
Packit Service |
54dbc3 |
" is thousands of nodes.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--lid_matrix_file, -M <file name>\n"
|
|
Packit Service |
54dbc3 |
" This option specifies the name of the lid matrix dump file\n"
|
|
Packit Service |
54dbc3 |
" from where switch lid matrices (min hops tables will be\n"
|
|
Packit Service |
54dbc3 |
" loaded.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--lfts_file, -U <file name>\n"
|
|
Packit Service |
54dbc3 |
" This option specifies the name of the LFTs file\n"
|
|
Packit Service |
54dbc3 |
" from where switch forwarding tables will be loaded when using \"file\"\n"
|
|
Packit Service |
54dbc3 |
" routing engine.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--sadb_file, -S <file name>\n"
|
|
Packit Service |
54dbc3 |
" This option specifies the name of the SA DB dump file\n"
|
|
Packit Service |
54dbc3 |
" from where SA database will be loaded.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--root_guid_file, -a <path to file>\n"
|
|
Packit Service |
54dbc3 |
" Set the root nodes for the Up/Down or Fat-Tree routing\n"
|
|
Packit Service |
54dbc3 |
" algorithm to the guids provided in the given file (one\n"
|
|
Packit Service |
54dbc3 |
" to a line)\n" "\n");
|
|
Packit Service |
54dbc3 |
printf("--cn_guid_file, -u <path to file>\n"
|
|
Packit Service |
54dbc3 |
" Set the compute nodes for the Fat-Tree or DFSSSP/SSSP routing algorithms\n"
|
|
Packit Service |
54dbc3 |
" to the port GUIDs provided in the given file (one to a line)\n\n");
|
|
Packit Service |
54dbc3 |
printf("--io_guid_file, -G <path to file>\n"
|
|
Packit Service |
54dbc3 |
" Set the I/O nodes for the Fat-Tree or DFSSSP/SSSP routing algorithms\n"
|
|
Packit Service |
54dbc3 |
" to the port GUIDs provided in the given file (one to a line)\n\n");
|
|
Packit Service |
54dbc3 |
printf("--port-shifting\n"
|
|
Packit Service |
54dbc3 |
" Attempt to shift port routes around to remove alignment problems\n"
|
|
Packit Service |
54dbc3 |
" in routing tables\n\n");
|
|
Packit Service |
54dbc3 |
printf("--scatter-ports <random seed>\n"
|
|
Packit Service |
54dbc3 |
" Randomize best port chosen for a route\n"
|
|
Packit Service |
54dbc3 |
" Assign ports in a random order instead of round-robin\n"
|
|
Packit Service |
54dbc3 |
" If zero disable (default), otherwise use the value as a random seed\n\n");
|
|
Packit Service |
54dbc3 |
printf("--max_reverse_hops, -H <hop_count>\n"
|
|
Packit Service |
54dbc3 |
" Set the max number of hops the wrong way around\n"
|
|
Packit Service |
54dbc3 |
" an I/O node is allowed to do (connectivity for I/O nodes on top switches)\n\n");
|
|
Packit Service |
54dbc3 |
printf("--ids_guid_file, -m <path to file>\n"
|
|
Packit Service |
54dbc3 |
" Name of the map file with set of the IDs which will be used\n"
|
|
Packit Service |
54dbc3 |
" by Up/Down routing algorithm instead of node GUIDs\n"
|
|
Packit Service |
54dbc3 |
" (format: <guid> <id> per line)\n\n");
|
|
Packit Service |
54dbc3 |
printf("--guid_routing_order_file, -X <path to file>\n"
|
|
Packit Service |
54dbc3 |
" Set the order port guids will be routed for the MinHop\n"
|
|
Packit Service |
54dbc3 |
" and Up/Down routing algorithms to the guids provided in the\n"
|
|
Packit Service |
54dbc3 |
" given file (one to a line)\n\n");
|
|
Packit Service |
54dbc3 |
printf("--torus_config <path to file>\n"
|
|
Packit Service |
54dbc3 |
" This option defines the file name for the extra configuration\n"
|
|
Packit Service |
54dbc3 |
" info needed for the torus-2QoS routing engine. The default\n"
|
|
Packit Service |
54dbc3 |
" name is \'"OSM_DEFAULT_TORUS_CONF_FILE"\'\n\n");
|
|
Packit Service |
54dbc3 |
printf("--once, -o\n"
|
|
Packit Service |
54dbc3 |
" This option causes OpenSM to configure the subnet\n"
|
|
Packit Service |
54dbc3 |
" once, then exit. Ports remain in the ACTIVE state.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--sweep, -s <interval>\n"
|
|
Packit Service |
54dbc3 |
" This option specifies the number of seconds between\n"
|
|
Packit Service |
54dbc3 |
" subnet sweeps. Specifying -s 0 disables sweeping.\n"
|
|
Packit Service |
54dbc3 |
" Without -s, OpenSM defaults to a sweep interval of\n"
|
|
Packit Service |
54dbc3 |
" 10 seconds.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--timeout, -t <milliseconds>\n"
|
|
Packit Service |
54dbc3 |
" This option specifies the time in milliseconds\n"
|
|
Packit Service |
54dbc3 |
" used for transaction timeouts.\n"
|
|
Packit Service |
54dbc3 |
" Timeout values should be > 0.\n"
|
|
Packit Service |
54dbc3 |
" Without -t, OpenSM defaults to a timeout value of\n"
|
|
Packit Service |
54dbc3 |
" 200 milliseconds.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--retries <number>\n"
|
|
Packit Service |
54dbc3 |
" This option specifies the number of retries used\n"
|
|
Packit Service |
54dbc3 |
" for transactions.\n"
|
|
Packit Service |
54dbc3 |
" Without --retries, OpenSM defaults to %u retries\n"
|
|
Packit Service |
54dbc3 |
" for transactions.\n\n", OSM_DEFAULT_RETRY_COUNT);
|
|
Packit Service |
54dbc3 |
printf("--maxsmps, -n <number>\n"
|
|
Packit Service |
54dbc3 |
" This option specifies the number of VL15 SMP MADs\n"
|
|
Packit Service |
54dbc3 |
" allowed on the wire at any one time.\n"
|
|
Packit Service |
54dbc3 |
" Specifying --maxsmps 0 allows unlimited outstanding\n"
|
|
Packit Service |
54dbc3 |
" SMPs.\n"
|
|
Packit Service |
54dbc3 |
" Without --maxsmps, OpenSM defaults to a maximum of\n"
|
|
Packit Service |
54dbc3 |
" 4 outstanding SMPs.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--console, -q [off|local"
|
|
Packit Service |
54dbc3 |
#ifdef ENABLE_OSM_CONSOLE_LOOPBACK
|
|
Packit Service |
54dbc3 |
"|loopback"
|
|
Packit Service |
54dbc3 |
#endif
|
|
Packit Service |
54dbc3 |
#ifdef ENABLE_OSM_CONSOLE_SOCKET
|
|
Packit Service |
54dbc3 |
"|socket"
|
|
Packit Service |
54dbc3 |
#endif
|
|
Packit Service |
54dbc3 |
"]\n This option activates the OpenSM console (default off).\n\n");
|
|
Packit Service |
54dbc3 |
#ifdef ENABLE_OSM_CONSOLE_LOOPBACK
|
|
Packit Service |
54dbc3 |
printf("--console-port, -C <port>\n"
|
|
Packit Service |
54dbc3 |
" Specify an alternate telnet port for the console (default %d).\n\n",
|
|
Packit Service |
54dbc3 |
OSM_DEFAULT_CONSOLE_PORT);
|
|
Packit Service |
54dbc3 |
#endif
|
|
Packit Service |
54dbc3 |
printf("--ignore_guids, -i <equalize-ignore-guids-file>\n"
|
|
Packit Service |
54dbc3 |
" This option provides the means to define a set of ports\n"
|
|
Packit Service |
54dbc3 |
" (by guid) that will be ignored by the link load\n"
|
|
Packit Service |
54dbc3 |
" equalization algorithm.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--hop_weights_file, -w <path to file>\n"
|
|
Packit Service |
54dbc3 |
" This option provides the means to define a weighting\n"
|
|
Packit Service |
54dbc3 |
" factor per port for customizing the least weight\n"
|
|
Packit Service |
54dbc3 |
" hops for the routing.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--port_search_ordering_file, -O <path to file>\n"
|
|
Packit Service |
54dbc3 |
" This option provides the means to define a mapping\n"
|
|
Packit Service |
54dbc3 |
" between ports and dimension (Order) for controlling\n"
|
|
Packit Service |
54dbc3 |
" Dimension Order Routing (DOR).\n"
|
|
Packit Service |
54dbc3 |
" Moreover this option provides the means to define non\n"
|
|
Packit Service |
54dbc3 |
" default routing port order.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--dimn_ports_file, -O <path to file> (DEPRECATED)\n"
|
|
Packit Service |
54dbc3 |
" Use --port_search_ordering_file instead.\n"
|
|
Packit Service |
54dbc3 |
" This option provides the means to define a mapping\n"
|
|
Packit Service |
54dbc3 |
" between ports and dimension (Order) for controlling\n"
|
|
Packit Service |
54dbc3 |
" Dimension Order Routing (DOR).\n\n");
|
|
Packit Service |
54dbc3 |
printf("--honor_guid2lid, -x\n"
|
|
Packit Service |
54dbc3 |
" This option forces OpenSM to honor the guid2lid file,\n"
|
|
Packit Service |
54dbc3 |
" when it comes out of Standby state, if such file exists\n"
|
|
Packit Service |
54dbc3 |
" under OSM_CACHE_DIR, and is valid. By default, this is FALSE.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--dump_files_dir <directory-name>"
|
|
Packit Service |
54dbc3 |
" The directory to hold the file dumps.\n");
|
|
Packit Service |
54dbc3 |
printf("--log_file, -f <log-file-name>\n"
|
|
Packit Service |
54dbc3 |
" This option defines the log to be the given file.\n"
|
|
Packit Service |
54dbc3 |
" By default, the log goes to /var/log/opensm.log.\n"
|
|
Packit Service |
54dbc3 |
" For the log to go to standard output use -f stdout.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--log_limit, -L <size in MB>\n"
|
|
Packit Service |
54dbc3 |
" This option defines maximal log file size in MB. When\n"
|
|
Packit Service |
54dbc3 |
" specified the log file will be truncated upon reaching\n"
|
|
Packit Service |
54dbc3 |
" this limit.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--erase_log_file, -e\n"
|
|
Packit Service |
54dbc3 |
" This option will cause deletion of the log file\n"
|
|
Packit Service |
54dbc3 |
" (if it previously exists). By default, the log file\n"
|
|
Packit Service |
54dbc3 |
" is accumulative.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--Pconfig, -P <partition-config-file>\n"
|
|
Packit Service |
54dbc3 |
" This option defines the optional partition configuration file.\n"
|
|
Packit Service |
54dbc3 |
" The default name is \'"
|
|
Packit Service |
54dbc3 |
OSM_DEFAULT_PARTITION_CONFIG_FILE "\'.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--no_part_enforce, -N (DEPRECATED)\n"
|
|
Packit Service |
54dbc3 |
" Use --part_enforce instead.\n"
|
|
Packit Service |
54dbc3 |
" This option disables partition enforcement on switch external ports.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--part_enforce, -Z [both, in, out, off]\n"
|
|
Packit Service |
54dbc3 |
" This option indicates the partition enforcement type (for switches)\n"
|
|
Packit Service |
54dbc3 |
" Enforcement type can be outbound only (out), inbound only (in), both or\n"
|
|
Packit Service |
54dbc3 |
" disabled (off). Default is both.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--allow_both_pkeys, -W\n"
|
|
Packit Service |
54dbc3 |
" This option indicates whether both full and limited membership\n"
|
|
Packit Service |
54dbc3 |
" on the same partition can be configured in the PKeyTable.\n"
|
|
Packit Service |
54dbc3 |
" Default is not to allow both pkeys.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--qos, -Q\n" " This option enables QoS setup.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--qos_policy_file, -Y <QoS-policy-file>\n"
|
|
Packit Service |
54dbc3 |
" This option defines the optional QoS policy file.\n"
|
|
Packit Service |
54dbc3 |
" The default name is \'" OSM_DEFAULT_QOS_POLICY_FILE
|
|
Packit Service |
54dbc3 |
"\'.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--congestion_control\n"
|
|
Packit Service |
54dbc3 |
" (EXPERIMENTAL) This option enables congestion control configuration.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--cc_key <key>\n"
|
|
Packit Service |
54dbc3 |
" (EXPERIMENTAL) This option configures the CCkey to use when configuring\n"
|
|
Packit Service |
54dbc3 |
" congestion control.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--stay_on_fatal, -y\n"
|
|
Packit Service |
54dbc3 |
" This option will cause SM not to exit on fatal initialization\n"
|
|
Packit Service |
54dbc3 |
" issues: if SM discovers duplicated guids or 12x link with\n"
|
|
Packit Service |
54dbc3 |
" lane reversal badly configured.\n"
|
|
Packit Service |
54dbc3 |
" By default, the SM will exit on these errors.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--daemon, -B\n"
|
|
Packit Service |
54dbc3 |
" Run in daemon mode - OpenSM will run in the background.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--inactive, -I\n"
|
|
Packit Service |
54dbc3 |
" Start SM in inactive rather than normal init SM state.\n\n");
|
|
Packit Service |
54dbc3 |
#ifdef ENABLE_OSM_PERF_MGR
|
|
Packit Service |
54dbc3 |
printf("--perfmgr\n" " Start with PerfMgr enabled.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--perfmgr_sweep_time_s <sec.>\n"
|
|
Packit Service |
54dbc3 |
" PerfMgr sweep interval in seconds.\n\n");
|
|
Packit Service |
54dbc3 |
#endif
|
|
Packit Service |
54dbc3 |
printf("--prefix_routes_file <path to file>\n"
|
|
Packit Service |
54dbc3 |
" This option specifies the prefix routes file.\n"
|
|
Packit Service |
54dbc3 |
" Prefix routes control how the SA responds to path record\n"
|
|
Packit Service |
54dbc3 |
" queries for off-subnet DGIDs. Default file is:\n"
|
|
Packit Service |
54dbc3 |
" " OSM_DEFAULT_PREFIX_ROUTES_FILE "\n\n");
|
|
Packit Service |
54dbc3 |
printf("--consolidate_ipv6_snm_req\n"
|
|
Packit Service |
54dbc3 |
" Use shared MLID for IPv6 Solicited Node Multicast groups\n"
|
|
Packit Service |
54dbc3 |
" per MGID scope and P_Key.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--guid_routing_order_no_scatter\n"
|
|
Packit Service |
54dbc3 |
" Don't use scatter for ports defined in guid_routing_order file\n\n");
|
|
Packit Service |
54dbc3 |
printf("--log_prefix <prefix text>\n"
|
|
Packit Service |
54dbc3 |
" Prefix to syslog messages from OpenSM.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--verbose, -v\n"
|
|
Packit Service |
54dbc3 |
" This option increases the log verbosity level.\n"
|
|
Packit Service |
54dbc3 |
" The -v option may be specified multiple times\n"
|
|
Packit Service |
54dbc3 |
" to further increase the verbosity level.\n"
|
|
Packit Service |
54dbc3 |
" See the -D option for more information about\n"
|
|
Packit Service |
54dbc3 |
" log verbosity.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--V, -V\n"
|
|
Packit Service |
54dbc3 |
" This option sets the maximum verbosity level and\n"
|
|
Packit Service |
54dbc3 |
" forces log flushing.\n"
|
|
Packit Service |
54dbc3 |
" The -V is equivalent to '-D 0xFF -d 2'.\n"
|
|
Packit Service |
54dbc3 |
" See the -D option for more information about\n"
|
|
Packit Service |
54dbc3 |
" log verbosity.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--D, -D <flags>\n"
|
|
Packit Service |
54dbc3 |
" This option sets the log verbosity level.\n"
|
|
Packit Service |
54dbc3 |
" A flags field must follow the -D option.\n"
|
|
Packit Service |
54dbc3 |
" A bit set/clear in the flags enables/disables a\n"
|
|
Packit Service |
54dbc3 |
" specific log level as follows:\n"
|
|
Packit Service |
54dbc3 |
" BIT LOG LEVEL ENABLED\n"
|
|
Packit Service |
54dbc3 |
" ---- -----------------\n"
|
|
Packit Service |
54dbc3 |
" 0x01 - ERROR (error messages)\n"
|
|
Packit Service |
54dbc3 |
" 0x02 - INFO (basic messages, low volume)\n"
|
|
Packit Service |
54dbc3 |
" 0x04 - VERBOSE (interesting stuff, moderate volume)\n"
|
|
Packit Service |
54dbc3 |
" 0x08 - DEBUG (diagnostic, high volume)\n"
|
|
Packit Service |
54dbc3 |
" 0x10 - FUNCS (function entry/exit, very high volume)\n"
|
|
Packit Service |
54dbc3 |
" 0x20 - FRAMES (dumps all SMP and GMP frames)\n"
|
|
Packit Service |
54dbc3 |
" 0x40 - ROUTING (dump FDB routing information)\n"
|
|
Packit Service |
54dbc3 |
" 0x80 - currently unused.\n"
|
|
Packit Service |
54dbc3 |
" Without -D, OpenSM defaults to ERROR + INFO (0x3).\n"
|
|
Packit Service |
54dbc3 |
" Specifying -D 0 disables all messages.\n"
|
|
Packit Service |
54dbc3 |
" Specifying -D 0xFF enables all messages (see -V).\n"
|
|
Packit Service |
54dbc3 |
" High verbosity levels may require increasing\n"
|
|
Packit Service |
54dbc3 |
" the transaction timeout with the -t option.\n\n");
|
|
Packit Service |
54dbc3 |
printf("--debug, -d <number>\n"
|
|
Packit Service |
54dbc3 |
" This option specifies a debug option.\n"
|
|
Packit Service |
54dbc3 |
" These options are not normally needed.\n"
|
|
Packit Service |
54dbc3 |
" The number following -d selects the debug\n"
|
|
Packit Service |
54dbc3 |
" option to enable as follows:\n"
|
|
Packit Service |
54dbc3 |
" OPT Description\n"
|
|
Packit Service |
54dbc3 |
" --- -----------------\n"
|
|
Packit Service |
54dbc3 |
" -d0 - Ignore other SM nodes\n"
|
|
Packit Service |
54dbc3 |
" -d1 - Force single threaded dispatching\n"
|
|
Packit Service |
54dbc3 |
" -d2 - Force log flushing after each log message\n"
|
|
Packit Service |
54dbc3 |
" -d3 - Disable multicast support\n"
|
|
Packit Service |
54dbc3 |
" -d10 - Put OpenSM in testability mode\n"
|
|
Packit Service |
54dbc3 |
" Without -d, no debug options are enabled\n\n");
|
|
Packit Service |
54dbc3 |
printf("--help, -h, -?\n"
|
|
Packit Service |
54dbc3 |
" Display this usage info then exit.\n\n");
|
|
Packit Service |
54dbc3 |
fflush(stdout);
|
|
Packit Service |
54dbc3 |
exit(2);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static ib_net64_t get_port_guid(IN osm_opensm_t * p_osm, uint64_t port_guid)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
ib_port_attr_t attr_array[MAX_LOCAL_IBPORTS];
|
|
Packit Service |
54dbc3 |
uint32_t num_ports = MAX_LOCAL_IBPORTS;
|
|
Packit Service |
54dbc3 |
uint32_t i, choice = 0;
|
|
Packit Service |
54dbc3 |
ib_api_status_t status;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
for (i = 0; i < num_ports; i++) {
|
|
Packit Service |
54dbc3 |
attr_array[i].num_pkeys = 0;
|
|
Packit Service |
54dbc3 |
attr_array[i].p_pkey_table = NULL;
|
|
Packit Service |
54dbc3 |
attr_array[i].num_gids = 0;
|
|
Packit Service |
54dbc3 |
attr_array[i].p_gid_table = NULL;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* Call the transport layer for a list of local port GUID values */
|
|
Packit Service |
54dbc3 |
status = osm_vendor_get_all_port_attr(p_osm->p_vendor, attr_array,
|
|
Packit Service |
54dbc3 |
&num_ports);
|
|
Packit Service |
54dbc3 |
if (status != IB_SUCCESS) {
|
|
Packit Service |
54dbc3 |
printf("\nError from osm_vendor_get_all_port_attr (%x)\n",
|
|
Packit Service |
54dbc3 |
status);
|
|
Packit Service |
54dbc3 |
return 0;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* if num_ports is 0 - return 0 */
|
|
Packit Service |
54dbc3 |
if (num_ports == 0) {
|
|
Packit Service |
54dbc3 |
printf("\nNo local ports detected!\n");
|
|
Packit Service |
54dbc3 |
return 0;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
/* If num_ports is 1, then there is only one possible port to use.
|
|
Packit Service |
54dbc3 |
* Use it. */
|
|
Packit Service |
54dbc3 |
if (num_ports == 1) {
|
|
Packit Service |
54dbc3 |
printf("Using default GUID 0x%" PRIx64 "\n",
|
|
Packit Service |
54dbc3 |
cl_hton64(attr_array[0].port_guid));
|
|
Packit Service |
54dbc3 |
return attr_array[0].port_guid;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
/* If port_guid is 0 - use the first connected port */
|
|
Packit Service |
54dbc3 |
if (port_guid == 0) {
|
|
Packit Service |
54dbc3 |
for (i = 0; i < num_ports; i++)
|
|
Packit Service |
54dbc3 |
if (attr_array[i].link_state > IB_LINK_DOWN)
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
if (i == num_ports)
|
|
Packit Service |
54dbc3 |
i = 0;
|
|
Packit Service |
54dbc3 |
printf("Using default GUID 0x%" PRIx64 "\n",
|
|
Packit Service |
54dbc3 |
cl_hton64(attr_array[i].port_guid));
|
|
Packit Service |
54dbc3 |
return attr_array[i].port_guid;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (p_osm->subn.opt.daemon)
|
|
Packit Service |
54dbc3 |
return 0;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* More than one possible port - list all ports and let the user
|
|
Packit Service |
54dbc3 |
* to choose. */
|
|
Packit Service |
54dbc3 |
while (1) {
|
|
Packit Service |
54dbc3 |
printf("\nChoose a local port number with which to bind:\n\n");
|
|
Packit Service |
54dbc3 |
for (i = 0; i < num_ports; i++)
|
|
Packit Service |
54dbc3 |
/* Print the index + 1 since by convention, port
|
|
Packit Service |
54dbc3 |
* numbers start with 1 on host channel adapters. */
|
|
Packit Service |
54dbc3 |
printf("\t%u: GUID 0x%" PRIx64 ", lid %u, state %s\n",
|
|
Packit Service |
54dbc3 |
i + 1, cl_ntoh64(attr_array[i].port_guid),
|
|
Packit Service |
54dbc3 |
attr_array[i].lid,
|
|
Packit Service |
54dbc3 |
ib_get_port_state_str(attr_array[i].link_state));
|
|
Packit Service |
54dbc3 |
printf("\n\t0: Exit\n");
|
|
Packit Service |
54dbc3 |
printf("\nEnter choice (0-%u): ", i);
|
|
Packit Service |
54dbc3 |
fflush(stdout);
|
|
Packit Service |
54dbc3 |
if (scanf("%u", &choice) <= 0) {
|
|
Packit Service |
54dbc3 |
char junk[128];
|
|
Packit Service |
54dbc3 |
if (scanf("%127s", junk) <= 0)
|
|
Packit Service |
54dbc3 |
printf("\nError: Cannot scan!\n");
|
|
Packit Service |
54dbc3 |
} else if (choice == 0)
|
|
Packit Service |
54dbc3 |
return 0;
|
|
Packit Service |
54dbc3 |
else if (choice <= num_ports)
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
printf("\nError: Lame choice! Please try again.\n");
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
choice--;
|
|
Packit Service |
54dbc3 |
printf("Choice guid=0x%" PRIx64 "\n",
|
|
Packit Service |
54dbc3 |
cl_ntoh64(attr_array[choice].port_guid));
|
|
Packit Service |
54dbc3 |
return attr_array[choice].port_guid;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void remove_pidfile(void)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
if (pidfile)
|
|
Packit Service |
54dbc3 |
unlink(pidfile);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static int daemonize(osm_opensm_t * osm)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
pid_t pid;
|
|
Packit Service |
54dbc3 |
int fd;
|
|
Packit Service |
54dbc3 |
FILE *f;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
fd = open("/dev/null", O_WRONLY);
|
|
Packit Service |
54dbc3 |
if (fd < 0) {
|
|
Packit Service |
54dbc3 |
perror("open");
|
|
Packit Service |
54dbc3 |
return -1;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if ((pid = fork()) < 0) {
|
|
Packit Service |
54dbc3 |
perror("fork");
|
|
Packit Service |
54dbc3 |
exit(-1);
|
|
Packit Service |
54dbc3 |
} else if (pid > 0)
|
|
Packit Service |
54dbc3 |
exit(0);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
setsid();
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if ((pid = fork()) < 0) {
|
|
Packit Service |
54dbc3 |
perror("fork");
|
|
Packit Service |
54dbc3 |
exit(-1);
|
|
Packit Service |
54dbc3 |
} else if (pid > 0)
|
|
Packit Service |
54dbc3 |
exit(0);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (pidfile) {
|
|
Packit Service |
54dbc3 |
remove_pidfile();
|
|
Packit Service |
54dbc3 |
f = fopen(pidfile, "w");
|
|
Packit Service |
54dbc3 |
if (f) {
|
|
Packit Service |
54dbc3 |
fprintf(f, "%d\n", getpid());
|
|
Packit Service |
54dbc3 |
fclose(f);
|
|
Packit Service |
54dbc3 |
} else {
|
|
Packit Service |
54dbc3 |
perror("fopen");
|
|
Packit Service |
54dbc3 |
exit(1);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
close(0);
|
|
Packit Service |
54dbc3 |
close(1);
|
|
Packit Service |
54dbc3 |
close(2);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
dup2(fd, 0);
|
|
Packit Service |
54dbc3 |
dup2(fd, 1);
|
|
Packit Service |
54dbc3 |
dup2(fd, 2);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
close(fd);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
return 0;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
int osm_manager_loop(osm_subn_opt_t * p_opt, osm_opensm_t * p_osm)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
int console_init_flag = 0;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (is_console_enabled(p_opt)) {
|
|
Packit Service |
54dbc3 |
if (!osm_console_init(p_opt, &p_osm->console, &p_osm->log))
|
|
Packit Service |
54dbc3 |
console_init_flag = 1;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/*
|
|
Packit Service |
54dbc3 |
Sit here forever - dwell or do console i/o & cmds
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
while (!osm_exit_flag) {
|
|
Packit Service |
54dbc3 |
if (console_init_flag) {
|
|
Packit Service |
54dbc3 |
if (osm_console(p_osm))
|
|
Packit Service |
54dbc3 |
console_init_flag = 0;
|
|
Packit Service |
54dbc3 |
} else
|
|
Packit Service |
54dbc3 |
cl_thread_suspend(10000);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (osm_usr1_flag) {
|
|
Packit Service |
54dbc3 |
osm_usr1_flag = 0;
|
|
Packit Service |
54dbc3 |
osm_log_reopen_file(&(p_osm->log));
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
if (osm_hup_flag) {
|
|
Packit Service |
54dbc3 |
osm_hup_flag = 0;
|
|
Packit Service |
54dbc3 |
/* a HUP signal should only start a new heavy sweep */
|
|
Packit Service |
54dbc3 |
p_osm->subn.force_heavy_sweep = TRUE;
|
|
Packit Service |
54dbc3 |
osm_opensm_sweep(p_osm);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
if (is_console_enabled(p_opt))
|
|
Packit Service |
54dbc3 |
osm_console_exit(&p_osm->console, &p_osm->log);
|
|
Packit Service |
54dbc3 |
return 0;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
#define SET_STR_OPT(opt, val) do { \
|
|
Packit Service |
54dbc3 |
opt = val ? strdup(val) : NULL ; \
|
|
Packit Service |
54dbc3 |
} while (0)
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
int main(int argc, char *argv[])
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
osm_opensm_t osm;
|
|
Packit Service |
54dbc3 |
osm_subn_opt_t opt;
|
|
Packit Service |
54dbc3 |
ib_net64_t sm_key = 0;
|
|
Packit Service |
54dbc3 |
ib_api_status_t status;
|
|
Packit Service |
54dbc3 |
uint32_t temp, dbg_lvl;
|
|
Packit Service |
54dbc3 |
boolean_t run_once_flag = FALSE;
|
|
Packit Service |
54dbc3 |
int32_t vendor_debug = 0;
|
|
Packit Service |
54dbc3 |
int next_option;
|
|
Packit Service |
54dbc3 |
char *conf_template = NULL;
|
|
Packit Service |
54dbc3 |
const char *config_file = NULL;
|
|
Packit Service |
54dbc3 |
uint32_t val;
|
|
Packit Service |
54dbc3 |
const char *const short_option =
|
|
Packit Service |
54dbc3 |
"F:c:i:w:O:f:ed:D:g:l:L:s:t:a:u:m:X:R:zM:U:S:P:Y:ANZ:WBIQvVhoryxp:n:q:k:C:G:H:";
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/*
|
|
Packit Service |
54dbc3 |
In the array below, the 2nd parameter specifies the number
|
|
Packit Service |
54dbc3 |
of arguments as follows:
|
|
Packit Service |
54dbc3 |
0: no arguments
|
|
Packit Service |
54dbc3 |
1: argument
|
|
Packit Service |
54dbc3 |
2: optional
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
const struct option long_option[] = {
|
|
Packit Service |
54dbc3 |
{"version", 0, NULL, 12},
|
|
Packit Service |
54dbc3 |
{"config", 1, NULL, 'F'},
|
|
Packit Service |
54dbc3 |
{"create-config", 1, NULL, 'c'},
|
|
Packit Service |
54dbc3 |
{"debug", 1, NULL, 'd'},
|
|
Packit Service |
54dbc3 |
{"guid", 1, NULL, 'g'},
|
|
Packit Service |
54dbc3 |
{"ignore_guids", 1, NULL, 'i'},
|
|
Packit Service |
54dbc3 |
{"hop_weights_file", 1, NULL, 'w'},
|
|
Packit Service |
54dbc3 |
{"dimn_ports_file", 1, NULL, 'O'},
|
|
Packit Service |
54dbc3 |
{"port_search_ordering_file", 1, NULL, 'O'},
|
|
Packit Service |
54dbc3 |
{"lmc", 1, NULL, 'l'},
|
|
Packit Service |
54dbc3 |
{"sweep", 1, NULL, 's'},
|
|
Packit Service |
54dbc3 |
{"timeout", 1, NULL, 't'},
|
|
Packit Service |
54dbc3 |
{"verbose", 0, NULL, 'v'},
|
|
Packit Service |
54dbc3 |
{"D", 1, NULL, 'D'},
|
|
Packit Service |
54dbc3 |
{"log_file", 1, NULL, 'f'},
|
|
Packit Service |
54dbc3 |
{"log_limit", 1, NULL, 'L'},
|
|
Packit Service |
54dbc3 |
{"erase_log_file", 0, NULL, 'e'},
|
|
Packit Service |
54dbc3 |
{"Pconfig", 1, NULL, 'P'},
|
|
Packit Service |
54dbc3 |
{"no_part_enforce", 0, NULL, 'N'},
|
|
Packit Service |
54dbc3 |
{"part_enforce", 1, NULL, 'Z'},
|
|
Packit Service |
54dbc3 |
{"allow_both_pkeys", 0, NULL, 'W'},
|
|
Packit Service |
54dbc3 |
{"qos", 0, NULL, 'Q'},
|
|
Packit Service |
54dbc3 |
{"qos_policy_file", 1, NULL, 'Y'},
|
|
Packit Service |
54dbc3 |
{"congestion_control", 0, NULL, 128},
|
|
Packit Service |
54dbc3 |
{"cc_key", 1, NULL, 129},
|
|
Packit Service |
54dbc3 |
{"maxsmps", 1, NULL, 'n'},
|
|
Packit Service |
54dbc3 |
{"console", 1, NULL, 'q'},
|
|
Packit Service |
54dbc3 |
{"V", 0, NULL, 'V'},
|
|
Packit Service |
54dbc3 |
{"help", 0, NULL, 'h'},
|
|
Packit Service |
54dbc3 |
{"once", 0, NULL, 'o'},
|
|
Packit Service |
54dbc3 |
{"reassign_lids", 0, NULL, 'r'},
|
|
Packit Service |
54dbc3 |
{"priority", 1, NULL, 'p'},
|
|
Packit Service |
54dbc3 |
{"subnet_prefix", 1, NULL, 16},
|
|
Packit Service |
54dbc3 |
{"smkey", 1, NULL, 'k'},
|
|
Packit Service |
54dbc3 |
{"routing_engine", 1, NULL, 'R'},
|
|
Packit Service |
54dbc3 |
{"ucast_cache", 0, NULL, 'A'},
|
|
Packit Service |
54dbc3 |
{"connect_roots", 0, NULL, 'z'},
|
|
Packit Service |
54dbc3 |
{"lid_matrix_file", 1, NULL, 'M'},
|
|
Packit Service |
54dbc3 |
{"lfts_file", 1, NULL, 'U'},
|
|
Packit Service |
54dbc3 |
{"sadb_file", 1, NULL, 'S'},
|
|
Packit Service |
54dbc3 |
{"root_guid_file", 1, NULL, 'a'},
|
|
Packit Service |
54dbc3 |
{"cn_guid_file", 1, NULL, 'u'},
|
|
Packit Service |
54dbc3 |
{"io_guid_file", 1, NULL, 'G'},
|
|
Packit Service |
54dbc3 |
{"port-shifting", 0, NULL, 11},
|
|
Packit Service |
54dbc3 |
{"scatter-ports", 1, NULL, 14},
|
|
Packit Service |
54dbc3 |
{"max_reverse_hops", 1, NULL, 'H'},
|
|
Packit Service |
54dbc3 |
{"ids_guid_file", 1, NULL, 'm'},
|
|
Packit Service |
54dbc3 |
{"guid_routing_order_file", 1, NULL, 'X'},
|
|
Packit Service |
54dbc3 |
{"stay_on_fatal", 0, NULL, 'y'},
|
|
Packit Service |
54dbc3 |
{"honor_guid2lid", 0, NULL, 'x'},
|
|
Packit Service |
54dbc3 |
#ifdef ENABLE_OSM_CONSOLE_LOOPBACK
|
|
Packit Service |
54dbc3 |
{"console-port", 1, NULL, 'C'},
|
|
Packit Service |
54dbc3 |
#endif
|
|
Packit Service |
54dbc3 |
{"daemon", 0, NULL, 'B'},
|
|
Packit Service |
54dbc3 |
{"pidfile", 1, NULL, 'J'},
|
|
Packit Service |
54dbc3 |
{"inactive", 0, NULL, 'I'},
|
|
Packit Service |
54dbc3 |
#ifdef ENABLE_OSM_PERF_MGR
|
|
Packit Service |
54dbc3 |
{"perfmgr", 0, NULL, 1},
|
|
Packit Service |
54dbc3 |
{"perfmgr_sweep_time_s", 1, NULL, 2},
|
|
Packit Service |
54dbc3 |
#endif
|
|
Packit Service |
54dbc3 |
{"prefix_routes_file", 1, NULL, 3},
|
|
Packit Service |
54dbc3 |
{"consolidate_ipv6_snm_req", 0, NULL, 4},
|
|
Packit Service |
54dbc3 |
{"do_mesh_analysis", 0, NULL, 5},
|
|
Packit Service |
54dbc3 |
{"lash_start_vl", 1, NULL, 6},
|
|
Packit Service |
54dbc3 |
{"sm_sl", 1, NULL, 7},
|
|
Packit Service |
54dbc3 |
{"retries", 1, NULL, 8},
|
|
Packit Service |
54dbc3 |
{"log_prefix", 1, NULL, 9},
|
|
Packit Service |
54dbc3 |
{"torus_config", 1, NULL, 10},
|
|
Packit Service |
54dbc3 |
{"guid_routing_order_no_scatter", 0, NULL, 13},
|
|
Packit Service |
54dbc3 |
{"nue_max_num_vls", 1, NULL, 15},
|
|
Packit Service |
54dbc3 |
{"dump_files_dir", 1, NULL, 17},
|
|
Packit Service |
54dbc3 |
{NULL, 0, NULL, 0} /* Required at the end of the array */
|
|
Packit Service |
54dbc3 |
};
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* force stdout to be line-buffered */
|
|
Packit Service |
54dbc3 |
setvbuf(stdout, NULL, _IOLBF, BUFSIZ);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* Make sure that the opensm and complib were compiled using
|
|
Packit Service |
54dbc3 |
same modes (debug/free) */
|
|
Packit Service |
54dbc3 |
if (osm_is_debug() != cl_is_debug()) {
|
|
Packit Service |
54dbc3 |
fprintf(stderr,
|
|
Packit Service |
54dbc3 |
"ERROR: OpenSM and Complib were compiled using different modes\n");
|
|
Packit Service |
54dbc3 |
fprintf(stderr, "ERROR: OpenSM debug:%d Complib debug:%d \n",
|
|
Packit Service |
54dbc3 |
osm_is_debug(), cl_is_debug());
|
|
Packit Service |
54dbc3 |
exit(1);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
printf("-------------------------------------------------\n");
|
|
Packit Service |
54dbc3 |
printf("%s\n", OSM_VERSION);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
do {
|
|
Packit Service |
54dbc3 |
next_option = getopt_long_only(argc, argv, short_option,
|
|
Packit Service |
54dbc3 |
long_option, NULL);
|
|
Packit Service |
54dbc3 |
switch (next_option) {
|
|
Packit Service |
54dbc3 |
case 'F':
|
|
Packit Service |
54dbc3 |
config_file = optarg;
|
|
Packit Service |
54dbc3 |
printf("Config file is `%s`:\n", config_file);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
default:
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
} while (next_option != -1);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
optind = 0; /* reset command line */
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (!config_file)
|
|
Packit Service |
54dbc3 |
config_file = OSM_DEFAULT_CONFIG_FILE;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
osm_subn_set_default_opt(&opt;;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (osm_subn_parse_conf_file(config_file, &opt) < 0)
|
|
Packit Service |
54dbc3 |
printf("\nFail to parse config file \'%s\'\n", config_file);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
printf("Command Line Arguments:\n");
|
|
Packit Service |
54dbc3 |
do {
|
|
Packit Service |
54dbc3 |
next_option = getopt_long_only(argc, argv, short_option,
|
|
Packit Service |
54dbc3 |
long_option, NULL);
|
|
Packit Service |
54dbc3 |
switch (next_option) {
|
|
Packit Service |
54dbc3 |
case 12: /* --version - already printed above */
|
|
Packit Service |
54dbc3 |
exit(0);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case 'F':
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case 'c':
|
|
Packit Service |
54dbc3 |
conf_template = optarg;
|
|
Packit Service |
54dbc3 |
printf(" Creating config file template \'%s\'.\n",
|
|
Packit Service |
54dbc3 |
conf_template);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case 'o':
|
|
Packit Service |
54dbc3 |
/*
|
|
Packit Service |
54dbc3 |
Run once option.
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
run_once_flag = TRUE;
|
|
Packit Service |
54dbc3 |
printf(" Run Once\n");
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'r':
|
|
Packit Service |
54dbc3 |
/*
|
|
Packit Service |
54dbc3 |
Reassign LIDs subnet option.
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
opt.reassign_lids = TRUE;
|
|
Packit Service |
54dbc3 |
printf(" Reassign LIDs\n");
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'i':
|
|
Packit Service |
54dbc3 |
/*
|
|
Packit Service |
54dbc3 |
Specifies ignore guids file.
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
SET_STR_OPT(opt.port_prof_ignore_file, optarg);
|
|
Packit Service |
54dbc3 |
printf(" Ignore Guids File = %s\n",
|
|
Packit Service |
54dbc3 |
opt.port_prof_ignore_file);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'w':
|
|
Packit Service |
54dbc3 |
SET_STR_OPT(opt.hop_weights_file, optarg);
|
|
Packit Service |
54dbc3 |
printf(" Hop Weights File = %s\n",
|
|
Packit Service |
54dbc3 |
opt.hop_weights_file);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'O':
|
|
Packit Service |
54dbc3 |
SET_STR_OPT(opt.port_search_ordering_file, optarg);
|
|
Packit Service |
54dbc3 |
printf(" Port Search Ordering/Dimension Ports File = %s\n",
|
|
Packit Service |
54dbc3 |
opt.port_search_ordering_file);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'g':
|
|
Packit Service |
54dbc3 |
/*
|
|
Packit Service |
54dbc3 |
Specifies port guid with which to bind.
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
opt.guid = cl_hton64(strtoull(optarg, NULL, 16));
|
|
Packit Service |
54dbc3 |
if (!opt.guid)
|
|
Packit Service |
54dbc3 |
/* If guid is 0 - need to display the
|
|
Packit Service |
54dbc3 |
* guid list */
|
|
Packit Service |
54dbc3 |
opt.guid = INVALID_GUID;
|
|
Packit Service |
54dbc3 |
else
|
|
Packit Service |
54dbc3 |
printf(" Guid <0x%" PRIx64 ">\n",
|
|
Packit Service |
54dbc3 |
cl_hton64(opt.guid));
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 's':
|
|
Packit Service |
54dbc3 |
val = strtol(optarg, NULL, 0);
|
|
Packit Service |
54dbc3 |
/* Check that the number is not too large */
|
|
Packit Service |
54dbc3 |
if (((uint32_t) (val * 1000000)) / 1000000 != val)
|
|
Packit Service |
54dbc3 |
fprintf(stderr,
|
|
Packit Service |
54dbc3 |
"ERROR: sweep interval given is too large. Ignoring it.\n");
|
|
Packit Service |
54dbc3 |
else {
|
|
Packit Service |
54dbc3 |
opt.sweep_interval = val;
|
|
Packit Service |
54dbc3 |
printf(" sweep interval = %d\n",
|
|
Packit Service |
54dbc3 |
opt.sweep_interval);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 't':
|
|
Packit Service |
54dbc3 |
val = strtoul(optarg, NULL, 0);
|
|
Packit Service |
54dbc3 |
opt.transaction_timeout = strtoul(optarg, NULL, 0);
|
|
Packit Service |
54dbc3 |
if (val == 0)
|
|
Packit Service |
54dbc3 |
fprintf(stderr, "ERROR: timeout value 0 is invalid. Ignoring it.\n");
|
|
Packit Service |
54dbc3 |
else {
|
|
Packit Service |
54dbc3 |
opt.transaction_timeout = val;
|
|
Packit Service |
54dbc3 |
printf(" Transaction timeout = %u\n",
|
|
Packit Service |
54dbc3 |
opt.transaction_timeout);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'n':
|
|
Packit Service |
54dbc3 |
opt.max_wire_smps = strtoul(optarg, NULL, 0);
|
|
Packit Service |
54dbc3 |
if (opt.max_wire_smps == 0 ||
|
|
Packit Service |
54dbc3 |
opt.max_wire_smps > 0x7FFFFFFF)
|
|
Packit Service |
54dbc3 |
opt.max_wire_smps = 0x7FFFFFFF;
|
|
Packit Service |
54dbc3 |
printf(" Max wire smp's = %d\n", opt.max_wire_smps);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'q':
|
|
Packit Service |
54dbc3 |
/*
|
|
Packit Service |
54dbc3 |
* OpenSM interactive console
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
if (strcmp(optarg, OSM_DISABLE_CONSOLE) == 0
|
|
Packit Service |
54dbc3 |
|| strcmp(optarg, OSM_LOCAL_CONSOLE) == 0
|
|
Packit Service |
54dbc3 |
#ifdef ENABLE_OSM_CONSOLE_SOCKET
|
|
Packit Service |
54dbc3 |
|| strcmp(optarg, OSM_REMOTE_CONSOLE) == 0
|
|
Packit Service |
54dbc3 |
#endif
|
|
Packit Service |
54dbc3 |
#ifdef ENABLE_OSM_CONSOLE_LOOPBACK
|
|
Packit Service |
54dbc3 |
|| strcmp(optarg, OSM_LOOPBACK_CONSOLE) == 0
|
|
Packit Service |
54dbc3 |
#endif
|
|
Packit Service |
54dbc3 |
)
|
|
Packit Service |
54dbc3 |
SET_STR_OPT(opt.console, optarg);
|
|
Packit Service |
54dbc3 |
else
|
|
Packit Service |
54dbc3 |
printf("-console %s option not understood\n",
|
|
Packit Service |
54dbc3 |
optarg);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
#ifdef ENABLE_OSM_CONSOLE_LOOPBACK
|
|
Packit Service |
54dbc3 |
case 'C':
|
|
Packit Service |
54dbc3 |
opt.console_port = strtol(optarg, NULL, 0);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
#endif
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'd':
|
|
Packit Service |
54dbc3 |
dbg_lvl = strtol(optarg, NULL, 0);
|
|
Packit Service |
54dbc3 |
printf(" d level = 0x%x\n", dbg_lvl);
|
|
Packit Service |
54dbc3 |
if (dbg_lvl == 0) {
|
|
Packit Service |
54dbc3 |
printf(" Debug mode: Ignore Other SMs\n");
|
|
Packit Service |
54dbc3 |
opt.ignore_other_sm = TRUE;
|
|
Packit Service |
54dbc3 |
} else if (dbg_lvl == 1) {
|
|
Packit Service |
54dbc3 |
printf(" Debug mode: Forcing Single Thread\n");
|
|
Packit Service |
54dbc3 |
opt.single_thread = TRUE;
|
|
Packit Service |
54dbc3 |
} else if (dbg_lvl == 2) {
|
|
Packit Service |
54dbc3 |
printf(" Debug mode: Force Log Flush\n");
|
|
Packit Service |
54dbc3 |
opt.force_log_flush = TRUE;
|
|
Packit Service |
54dbc3 |
} else if (dbg_lvl == 3) {
|
|
Packit Service |
54dbc3 |
printf
|
|
Packit Service |
54dbc3 |
(" Debug mode: Disable multicast support\n");
|
|
Packit Service |
54dbc3 |
opt.disable_multicast = TRUE;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
/*
|
|
Packit Service |
54dbc3 |
* NOTE: Debug level 4 used to be used for memory
|
|
Packit Service |
54dbc3 |
* tracking but this is now deprecated
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
else if (dbg_lvl == 5)
|
|
Packit Service |
54dbc3 |
vendor_debug++;
|
|
Packit Service |
54dbc3 |
else
|
|
Packit Service |
54dbc3 |
printf(" OpenSM: Unknown debug option %d"
|
|
Packit Service |
54dbc3 |
" ignored\n", dbg_lvl);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'l':
|
|
Packit Service |
54dbc3 |
temp = strtoul(optarg, NULL, 0);
|
|
Packit Service |
54dbc3 |
if (temp > 7) {
|
|
Packit Service |
54dbc3 |
fprintf(stderr,
|
|
Packit Service |
54dbc3 |
"ERROR: LMC must be 7 or less.\n");
|
|
Packit Service |
54dbc3 |
return -1;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
opt.lmc = (uint8_t) temp;
|
|
Packit Service |
54dbc3 |
printf(" LMC = %d\n", temp);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'D':
|
|
Packit Service |
54dbc3 |
opt.log_flags = strtol(optarg, NULL, 0);
|
|
Packit Service |
54dbc3 |
printf(" verbose option -D = 0x%x\n", opt.log_flags);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'f':
|
|
Packit Service |
54dbc3 |
SET_STR_OPT(opt.log_file, optarg);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'L':
|
|
Packit Service |
54dbc3 |
opt.log_max_size = strtoul(optarg, NULL, 0);
|
|
Packit Service |
54dbc3 |
printf(" Log file max size is %u MBytes\n",
|
|
Packit Service |
54dbc3 |
opt.log_max_size);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'e':
|
|
Packit Service |
54dbc3 |
opt.accum_log_file = FALSE;
|
|
Packit Service |
54dbc3 |
printf(" Creating new log file\n");
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'J':
|
|
Packit Service |
54dbc3 |
pidfile = optarg;
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'P':
|
|
Packit Service |
54dbc3 |
SET_STR_OPT(opt.partition_config_file, optarg);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'N':
|
|
Packit Service |
54dbc3 |
opt.no_partition_enforcement = TRUE;
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'Z':
|
|
Packit Service |
54dbc3 |
if (strcmp(optarg, OSM_PARTITION_ENFORCE_BOTH) == 0
|
|
Packit Service |
54dbc3 |
|| strcmp(optarg, OSM_PARTITION_ENFORCE_IN) == 0
|
|
Packit Service |
54dbc3 |
|| strcmp(optarg, OSM_PARTITION_ENFORCE_OUT) == 0
|
|
Packit Service |
54dbc3 |
|| strcmp(optarg, OSM_PARTITION_ENFORCE_OFF) == 0) {
|
|
Packit Service |
54dbc3 |
SET_STR_OPT(opt.part_enforce, optarg);
|
|
Packit Service |
54dbc3 |
if (strcmp(optarg, OSM_PARTITION_ENFORCE_BOTH) == 0)
|
|
Packit Service |
54dbc3 |
opt.part_enforce_enum = OSM_PARTITION_ENFORCE_TYPE_BOTH;
|
|
Packit Service |
54dbc3 |
else if (strcmp(optarg, OSM_PARTITION_ENFORCE_IN) == 0)
|
|
Packit Service |
54dbc3 |
opt.part_enforce_enum = OSM_PARTITION_ENFORCE_TYPE_IN;
|
|
Packit Service |
54dbc3 |
else if (strcmp(optarg, OSM_PARTITION_ENFORCE_OUT) == 0)
|
|
Packit Service |
54dbc3 |
opt.part_enforce_enum = OSM_PARTITION_ENFORCE_TYPE_OUT;
|
|
Packit Service |
54dbc3 |
else
|
|
Packit Service |
54dbc3 |
opt.part_enforce_enum = OSM_PARTITION_ENFORCE_TYPE_OFF;
|
|
Packit Service |
54dbc3 |
} else
|
|
Packit Service |
54dbc3 |
printf("-part_enforce %s option not understood\n",
|
|
Packit Service |
54dbc3 |
optarg);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'W':
|
|
Packit Service |
54dbc3 |
opt.allow_both_pkeys = TRUE;
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'Q':
|
|
Packit Service |
54dbc3 |
opt.qos = TRUE;
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'Y':
|
|
Packit Service |
54dbc3 |
SET_STR_OPT(opt.qos_policy_file, optarg);
|
|
Packit Service |
54dbc3 |
printf(" QoS policy file \'%s\'\n", optarg);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 128:
|
|
Packit Service |
54dbc3 |
opt.congestion_control = TRUE;
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 129:
|
|
Packit Service |
54dbc3 |
opt.cc_key = strtoull(optarg, NULL, 0);
|
|
Packit Service |
54dbc3 |
printf(" CC Key 0x%" PRIx64 "\n", opt.cc_key);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'y':
|
|
Packit Service |
54dbc3 |
opt.exit_on_fatal = FALSE;
|
|
Packit Service |
54dbc3 |
printf(" Staying on fatal initialization errors\n");
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'v':
|
|
Packit Service |
54dbc3 |
opt.log_flags = (opt.log_flags << 1) | 1;
|
|
Packit Service |
54dbc3 |
printf(" Verbose option -v (log flags = 0x%X)\n",
|
|
Packit Service |
54dbc3 |
opt.log_flags);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'V':
|
|
Packit Service |
54dbc3 |
opt.log_flags = 0xFF;
|
|
Packit Service |
54dbc3 |
opt.force_log_flush = TRUE;
|
|
Packit Service |
54dbc3 |
printf(" Big V selected\n");
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'p':
|
|
Packit Service |
54dbc3 |
temp = strtoul(optarg, NULL, 0);
|
|
Packit Service |
54dbc3 |
if (temp > 15) {
|
|
Packit Service |
54dbc3 |
fprintf(stderr,
|
|
Packit Service |
54dbc3 |
"ERROR: priority must be between 0 and 15\n");
|
|
Packit Service |
54dbc3 |
return -1;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
opt.sm_priority = (uint8_t) temp;
|
|
Packit Service |
54dbc3 |
printf(" Priority = %d\n", temp);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 16:
|
|
Packit Service |
54dbc3 |
opt.subnet_prefix = cl_hton64(strtoull(optarg, NULL, 16));
|
|
Packit Service |
54dbc3 |
printf(" Subnet_Prefix = <0x%" PRIx64 ">\n", cl_hton64(opt.subnet_prefix));
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'k':
|
|
Packit Service |
54dbc3 |
sm_key = cl_hton64(strtoull(optarg, NULL, 16));
|
|
Packit Service |
54dbc3 |
printf(" SM Key <0x%" PRIx64 ">\n", cl_hton64(sm_key));
|
|
Packit Service |
54dbc3 |
opt.sm_key = sm_key;
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'R':
|
|
Packit Service |
54dbc3 |
SET_STR_OPT(opt.routing_engine_names, optarg);
|
|
Packit Service |
54dbc3 |
printf(" Activate \'%s\' routing engine(s)\n", optarg);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'z':
|
|
Packit Service |
54dbc3 |
opt.connect_roots = TRUE;
|
|
Packit Service |
54dbc3 |
printf(" Connect roots option is on\n");
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'A':
|
|
Packit Service |
54dbc3 |
opt.use_ucast_cache = TRUE;
|
|
Packit Service |
54dbc3 |
printf(" Unicast routing cache option is on\n");
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'M':
|
|
Packit Service |
54dbc3 |
SET_STR_OPT(opt.lid_matrix_dump_file, optarg);
|
|
Packit Service |
54dbc3 |
printf(" Lid matrix dump file is \'%s\'\n", optarg);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'U':
|
|
Packit Service |
54dbc3 |
SET_STR_OPT(opt.lfts_file, optarg);
|
|
Packit Service |
54dbc3 |
printf(" LFTs file is \'%s\'\n", optarg);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'S':
|
|
Packit Service |
54dbc3 |
SET_STR_OPT(opt.sa_db_file, optarg);
|
|
Packit Service |
54dbc3 |
printf(" SA DB file is \'%s\'\n", optarg);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'a':
|
|
Packit Service |
54dbc3 |
SET_STR_OPT(opt.root_guid_file, optarg);
|
|
Packit Service |
54dbc3 |
printf(" Root Guid File: %s\n", opt.root_guid_file);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'u':
|
|
Packit Service |
54dbc3 |
SET_STR_OPT(opt.cn_guid_file, optarg);
|
|
Packit Service |
54dbc3 |
printf(" Compute Node Guid File: %s\n",
|
|
Packit Service |
54dbc3 |
opt.cn_guid_file);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'G':
|
|
Packit Service |
54dbc3 |
SET_STR_OPT(opt.io_guid_file, optarg);
|
|
Packit Service |
54dbc3 |
printf(" I/O Node Guid File: %s\n", opt.io_guid_file);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case 11:
|
|
Packit Service |
54dbc3 |
opt.port_shifting = TRUE;
|
|
Packit Service |
54dbc3 |
printf(" Port Shifting is on\n");
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case 14:
|
|
Packit Service |
54dbc3 |
opt.scatter_ports = strtol(optarg, NULL, 0);
|
|
Packit Service |
54dbc3 |
printf(" Scatter Ports is on\n");
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case 'H':
|
|
Packit Service |
54dbc3 |
opt.max_reverse_hops = atoi(optarg);
|
|
Packit Service |
54dbc3 |
printf(" Max Reverse Hops: %d\n", opt.max_reverse_hops);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case 'm':
|
|
Packit Service |
54dbc3 |
SET_STR_OPT(opt.ids_guid_file, optarg);
|
|
Packit Service |
54dbc3 |
printf(" IDs Guid File: %s\n", opt.ids_guid_file);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'X':
|
|
Packit Service |
54dbc3 |
SET_STR_OPT(opt.guid_routing_order_file, optarg);
|
|
Packit Service |
54dbc3 |
printf(" GUID Routing Order File: %s\n",
|
|
Packit Service |
54dbc3 |
opt.guid_routing_order_file);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'x':
|
|
Packit Service |
54dbc3 |
opt.honor_guid2lid_file = TRUE;
|
|
Packit Service |
54dbc3 |
printf(" Honor guid2lid file, if possible\n");
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'B':
|
|
Packit Service |
54dbc3 |
opt.daemon = TRUE;
|
|
Packit Service |
54dbc3 |
printf(" Daemon mode\n");
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 'I':
|
|
Packit Service |
54dbc3 |
opt.sm_inactive = TRUE;
|
|
Packit Service |
54dbc3 |
printf(" SM started in inactive state\n");
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
#ifdef ENABLE_OSM_PERF_MGR
|
|
Packit Service |
54dbc3 |
case 1:
|
|
Packit Service |
54dbc3 |
opt.perfmgr = TRUE;
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case 2:
|
|
Packit Service |
54dbc3 |
opt.perfmgr_sweep_time_s = atoi(optarg);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
#endif /* ENABLE_OSM_PERF_MGR */
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case 3:
|
|
Packit Service |
54dbc3 |
SET_STR_OPT(opt.prefix_routes_file, optarg);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case 4:
|
|
Packit Service |
54dbc3 |
opt.consolidate_ipv6_snm_req = TRUE;
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case 5:
|
|
Packit Service |
54dbc3 |
opt.do_mesh_analysis = TRUE;
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case 6:
|
|
Packit Service |
54dbc3 |
temp = strtoul(optarg, NULL, 0);
|
|
Packit Service |
54dbc3 |
if (temp >= IB_MAX_NUM_VLS) {
|
|
Packit Service |
54dbc3 |
fprintf(stderr,
|
|
Packit Service |
54dbc3 |
"ERROR: starting lash vl must be between 0 and 15\n");
|
|
Packit Service |
54dbc3 |
return -1;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
opt.lash_start_vl = (uint8_t) temp;
|
|
Packit Service |
54dbc3 |
printf(" LASH starting VL = %d\n", opt.lash_start_vl);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case 7:
|
|
Packit Service |
54dbc3 |
temp = strtoul(optarg, NULL, 0);
|
|
Packit Service |
54dbc3 |
if (temp > 15) {
|
|
Packit Service |
54dbc3 |
fprintf(stderr,
|
|
Packit Service |
54dbc3 |
"ERROR: SM's SL must be between 0 and 15\n");
|
|
Packit Service |
54dbc3 |
return -1;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
opt.sm_sl = (uint8_t) temp;
|
|
Packit Service |
54dbc3 |
printf(" SMSL = %d\n", opt.sm_sl);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case 8:
|
|
Packit Service |
54dbc3 |
opt.transaction_retries = strtoul(optarg, NULL, 0);
|
|
Packit Service |
54dbc3 |
printf(" Transaction retries = %u\n",
|
|
Packit Service |
54dbc3 |
opt.transaction_retries);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case 9:
|
|
Packit Service |
54dbc3 |
SET_STR_OPT(opt.log_prefix, optarg);
|
|
Packit Service |
54dbc3 |
printf("Log prefix = %s\n", opt.log_prefix);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case 10:
|
|
Packit Service |
54dbc3 |
SET_STR_OPT(opt.torus_conf_file, optarg);
|
|
Packit Service |
54dbc3 |
printf("Torus-2QoS config file = %s\n", opt.torus_conf_file);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case 13:
|
|
Packit Service |
54dbc3 |
opt.guid_routing_order_no_scatter = TRUE;
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case 15:
|
|
Packit Service |
54dbc3 |
temp = strtoul(optarg, NULL, 0);
|
|
Packit Service |
54dbc3 |
if (temp >= IB_MAX_NUM_VLS) {
|
|
Packit Service |
54dbc3 |
fprintf(stderr,
|
|
Packit Service |
54dbc3 |
"ERROR: maximum #VLs for nue routing must be between 0 and %d\n",
|
|
Packit Service |
54dbc3 |
IB_MAX_NUM_VLS);
|
|
Packit Service |
54dbc3 |
return -1;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
opt.nue_max_num_vls = (uint8_t) temp;
|
|
Packit Service |
54dbc3 |
printf(" Nue maximum #VLs = %d\n", opt.nue_max_num_vls);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case 17:
|
|
Packit Service |
54dbc3 |
SET_STR_OPT(opt.dump_files_dir, optarg);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case 'h':
|
|
Packit Service |
54dbc3 |
case '?':
|
|
Packit Service |
54dbc3 |
case ':':
|
|
Packit Service |
54dbc3 |
show_usage();
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
case -1:
|
|
Packit Service |
54dbc3 |
break; /* done with option */
|
|
Packit Service |
54dbc3 |
default: /* something wrong */
|
|
Packit Service |
54dbc3 |
abort();
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
} while (next_option != -1);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (opt.log_file != NULL)
|
|
Packit Service |
54dbc3 |
printf(" Log File: %s\n", opt.log_file);
|
|
Packit Service |
54dbc3 |
/* Done with options description */
|
|
Packit Service |
54dbc3 |
printf("-------------------------------------------------\n");
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (conf_template) {
|
|
Packit Service |
54dbc3 |
status = osm_subn_write_conf_file(conf_template, &opt;;
|
|
Packit Service |
54dbc3 |
if (status)
|
|
Packit Service |
54dbc3 |
printf("\nosm_subn_write_conf_file failed!\n");
|
|
Packit Service |
54dbc3 |
exit(status);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
osm_subn_verify_config(&opt;;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (vendor_debug)
|
|
Packit Service |
54dbc3 |
osm_vendor_set_debug(osm.p_vendor, vendor_debug);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
block_signals();
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (opt.daemon) {
|
|
Packit Service |
54dbc3 |
if (INVALID_GUID == opt.guid) {
|
|
Packit Service |
54dbc3 |
fprintf(stderr,
|
|
Packit Service |
54dbc3 |
"ERROR: Invalid GUID specified; exiting because of daemon mode\n");
|
|
Packit Service |
54dbc3 |
return -1;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
daemonize(&osm;;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (complib_init_v2() != CL_SUCCESS) {
|
|
Packit Service |
54dbc3 |
printf("\ncomplib_init_v2 error\n");
|
|
Packit Service |
54dbc3 |
return -1;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
status = osm_opensm_init(&osm, &opt;;
|
|
Packit Service |
54dbc3 |
if (status != IB_SUCCESS) {
|
|
Packit Service |
54dbc3 |
const char *err_str = ib_get_err_str(status);
|
|
Packit Service |
54dbc3 |
if (err_str == NULL)
|
|
Packit Service |
54dbc3 |
err_str = "Unknown Error Type";
|
|
Packit Service |
54dbc3 |
printf("\nError from osm_opensm_init: %s.\n", err_str);
|
|
Packit Service |
54dbc3 |
/* We will just exit, and not go to Exit, since we don't
|
|
Packit Service |
54dbc3 |
want the destroy to be called. */
|
|
Packit Service |
54dbc3 |
complib_exit();
|
|
Packit Service |
54dbc3 |
return status;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/*
|
|
Packit Service |
54dbc3 |
If the user didn't specify a GUID on the command line,
|
|
Packit Service |
54dbc3 |
then get a port GUID value with which to bind.
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
if (opt.guid == 0 || cl_hton64(opt.guid) == CL_HTON64(INVALID_GUID))
|
|
Packit Service |
54dbc3 |
opt.guid = get_port_guid(&osm, opt.guid);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (opt.guid == 0)
|
|
Packit Service |
54dbc3 |
goto Exit2;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
status = osm_opensm_init_finish(&osm, &opt;;
|
|
Packit Service |
54dbc3 |
if (status != IB_SUCCESS) {
|
|
Packit Service |
54dbc3 |
const char *err_str = ib_get_err_str(status);
|
|
Packit Service |
54dbc3 |
if (err_str == NULL)
|
|
Packit Service |
54dbc3 |
err_str = "Unknown Error Type";
|
|
Packit Service |
54dbc3 |
printf("\nError from osm_opensm_init_finish: %s.\n", err_str);
|
|
Packit Service |
54dbc3 |
goto Exit2;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
status = osm_opensm_bind(&osm, opt.guid);
|
|
Packit Service |
54dbc3 |
if (status != IB_SUCCESS) {
|
|
Packit Service |
54dbc3 |
printf("\nError from osm_opensm_bind (0x%X)\n", status);
|
|
Packit Service |
54dbc3 |
printf
|
|
Packit Service |
54dbc3 |
("Perhaps another instance of OpenSM is already running\n");
|
|
Packit Service |
54dbc3 |
goto Exit;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
setup_signals();
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
osm_opensm_sweep(&osm;;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (run_once_flag == TRUE) {
|
|
Packit Service |
54dbc3 |
while (!osm_exit_flag) {
|
|
Packit Service |
54dbc3 |
status =
|
|
Packit Service |
54dbc3 |
osm_opensm_wait_for_subnet_up(&osm,
|
|
Packit Service |
54dbc3 |
osm.subn.opt.
|
|
Packit Service |
54dbc3 |
sweep_interval *
|
|
Packit Service |
54dbc3 |
1000000, TRUE);
|
|
Packit Service |
54dbc3 |
if (!status)
|
|
Packit Service |
54dbc3 |
osm_exit_flag = 1;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
} else {
|
|
Packit Service |
54dbc3 |
/*
|
|
Packit Service |
54dbc3 |
* Sit here until signaled to exit
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
osm_manager_loop(&opt, &osm;;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (osm.mad_pool.mads_out) {
|
|
Packit Service |
54dbc3 |
fprintf(stdout,
|
|
Packit Service |
54dbc3 |
"There are still %u MADs out. Forcing the exit of the OpenSM application...\n",
|
|
Packit Service |
54dbc3 |
osm.mad_pool.mads_out);
|
|
Packit Service |
54dbc3 |
#ifdef HAVE_LIBPTHREAD
|
|
Packit Service |
54dbc3 |
pthread_cond_signal(&osm.stats.cond);
|
|
Packit Service |
54dbc3 |
#else
|
|
Packit Service |
54dbc3 |
cl_event_signal(&osm.stats.event);
|
|
Packit Service |
54dbc3 |
#endif
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
Exit:
|
|
Packit Service |
54dbc3 |
osm_opensm_destroy(&osm;;
|
|
Packit Service |
54dbc3 |
Exit2:
|
|
Packit Service |
54dbc3 |
osm_opensm_destroy_finish(&osm;;
|
|
Packit Service |
54dbc3 |
complib_exit();
|
|
Packit Service |
54dbc3 |
remove_pidfile();
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
exit(0);
|
|
Packit Service |
54dbc3 |
}
|