|
Packit Service |
54dbc3 |
/*
|
|
Packit Service |
54dbc3 |
* Copyright (c) 2005-2009 Voltaire, Inc. All rights reserved.
|
|
Packit Service |
54dbc3 |
* Copyright (c) 2009,2010 HNR Consulting. All rights reserved.
|
|
Packit Service |
54dbc3 |
* Copyright (c) 2010,2011 Mellanox Technologies LTD. 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 |
#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 <sys/poll.h>
|
|
Packit Service |
54dbc3 |
#include <sys/types.h>
|
|
Packit Service |
54dbc3 |
#include <sys/socket.h>
|
|
Packit Service |
54dbc3 |
#include <netdb.h>
|
|
Packit Service |
54dbc3 |
#include <regex.h>
|
|
Packit Service |
54dbc3 |
#ifdef ENABLE_OSM_CONSOLE_LOOPBACK
|
|
Packit Service |
54dbc3 |
#include <arpa/inet.h>
|
|
Packit Service |
54dbc3 |
#endif
|
|
Packit Service |
54dbc3 |
#include <unistd.h>
|
|
Packit Service |
54dbc3 |
#include <errno.h>
|
|
Packit Service |
54dbc3 |
#include <ctype.h>
|
|
Packit Service |
54dbc3 |
#include <sys/time.h>
|
|
Packit Service |
54dbc3 |
#include <opensm/osm_file_ids.h>
|
|
Packit Service |
54dbc3 |
#define FILE_ID OSM_FILE_CONSOLE_C
|
|
Packit Service |
54dbc3 |
#include <opensm/osm_console.h>
|
|
Packit Service |
54dbc3 |
#include <complib/cl_passivelock.h>
|
|
Packit Service |
54dbc3 |
#include <opensm/osm_perfmgr.h>
|
|
Packit Service |
54dbc3 |
#include <opensm/osm_subnet.h>
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
extern void osm_update_node_desc(IN osm_opensm_t *osm);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
struct command {
|
|
Packit Service |
54dbc3 |
const char *name;
|
|
Packit Service |
54dbc3 |
void (*help_function) (FILE * out, int detail);
|
|
Packit Service |
54dbc3 |
void (*parse_function) (char **p_last, osm_opensm_t * p_osm,
|
|
Packit Service |
54dbc3 |
FILE * out);
|
|
Packit Service |
54dbc3 |
};
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static struct {
|
|
Packit Service |
54dbc3 |
int on;
|
|
Packit Service |
54dbc3 |
int delay_s;
|
|
Packit Service |
54dbc3 |
time_t previous;
|
|
Packit Service |
54dbc3 |
void (*loop_function) (osm_opensm_t * p_osm, FILE * out);
|
|
Packit Service |
54dbc3 |
} loop_command = {
|
|
Packit Service |
54dbc3 |
.on = 0, .delay_s = 2, .loop_function = NULL};
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static const struct command console_cmds[];
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static char *next_token(char **p_last)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
return strtok_r(NULL, " \t\n\r", p_last);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
#ifdef ENABLE_OSM_PERF_MGR
|
|
Packit Service |
54dbc3 |
static char *name_token(char **p_last)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
return strtok_r(NULL, "\t\n\r", p_last);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
#endif
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void help_command(FILE * out, int detail)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
int i;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
fprintf(out, "Supported commands and syntax:\n");
|
|
Packit Service |
54dbc3 |
fprintf(out, "help [<command>]\n");
|
|
Packit Service |
54dbc3 |
/* skip help command */
|
|
Packit Service |
54dbc3 |
for (i = 1; console_cmds[i].name; i++)
|
|
Packit Service |
54dbc3 |
console_cmds[i].help_function(out, 0);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void help_quit(FILE * out, int detail)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
fprintf(out, "quit (not valid in local mode; use ctl-c)\n");
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void help_loglevel(FILE * out, int detail)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
fprintf(out, "loglevel [<log-level>]\n");
|
|
Packit Service |
54dbc3 |
if (detail) {
|
|
Packit Service |
54dbc3 |
fprintf(out, " log-level is OR'ed from the following\n");
|
|
Packit Service |
54dbc3 |
fprintf(out, " OSM_LOG_NONE 0x%02X\n",
|
|
Packit Service |
54dbc3 |
OSM_LOG_NONE);
|
|
Packit Service |
54dbc3 |
fprintf(out, " OSM_LOG_ERROR 0x%02X\n",
|
|
Packit Service |
54dbc3 |
OSM_LOG_ERROR);
|
|
Packit Service |
54dbc3 |
fprintf(out, " OSM_LOG_INFO 0x%02X\n",
|
|
Packit Service |
54dbc3 |
OSM_LOG_INFO);
|
|
Packit Service |
54dbc3 |
fprintf(out, " OSM_LOG_VERBOSE 0x%02X\n",
|
|
Packit Service |
54dbc3 |
OSM_LOG_VERBOSE);
|
|
Packit Service |
54dbc3 |
fprintf(out, " OSM_LOG_DEBUG 0x%02X\n",
|
|
Packit Service |
54dbc3 |
OSM_LOG_DEBUG);
|
|
Packit Service |
54dbc3 |
fprintf(out, " OSM_LOG_FUNCS 0x%02X\n",
|
|
Packit Service |
54dbc3 |
OSM_LOG_FUNCS);
|
|
Packit Service |
54dbc3 |
fprintf(out, " OSM_LOG_FRAMES 0x%02X\n",
|
|
Packit Service |
54dbc3 |
OSM_LOG_FRAMES);
|
|
Packit Service |
54dbc3 |
fprintf(out, " OSM_LOG_ROUTING 0x%02X\n",
|
|
Packit Service |
54dbc3 |
OSM_LOG_ROUTING);
|
|
Packit Service |
54dbc3 |
fprintf(out, " OSM_LOG_SYS 0x%02X\n",
|
|
Packit Service |
54dbc3 |
OSM_LOG_SYS);
|
|
Packit Service |
54dbc3 |
fprintf(out, "\n");
|
|
Packit Service |
54dbc3 |
fprintf(out, " OSM_LOG_DEFAULT_LEVEL 0x%02X\n",
|
|
Packit Service |
54dbc3 |
OSM_LOG_DEFAULT_LEVEL);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void help_permodlog(FILE * out, int detail)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
fprintf(out, "permodlog\n");
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void help_priority(FILE * out, int detail)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
fprintf(out, "priority [<sm-priority>]\n");
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void help_resweep(FILE * out, int detail)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
fprintf(out, "resweep [heavy|light]\n");
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void help_reroute(FILE * out, int detail)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
fprintf(out, "reroute\n");
|
|
Packit Service |
54dbc3 |
if (detail) {
|
|
Packit Service |
54dbc3 |
fprintf(out, "reroute the fabric\n");
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void help_sweep(FILE * out, int detail)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
fprintf(out, "sweep [on|off]\n");
|
|
Packit Service |
54dbc3 |
if (detail) {
|
|
Packit Service |
54dbc3 |
fprintf(out, "enable or disable sweeping\n");
|
|
Packit Service |
54dbc3 |
fprintf(out, " [on] sweep normally\n");
|
|
Packit Service |
54dbc3 |
fprintf(out, " [off] inhibit all sweeping\n");
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void help_status(FILE * out, int detail)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
fprintf(out, "status [loop]\n");
|
|
Packit Service |
54dbc3 |
if (detail) {
|
|
Packit Service |
54dbc3 |
fprintf(out, " loop -- type \"q<ret>\" to quit\n");
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void help_logflush(FILE * out, int detail)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
fprintf(out, "logflush [on|off] -- toggle opensm.log file flushing\n");
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void help_querylid(FILE * out, int detail)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
fprintf(out,
|
|
Packit Service |
54dbc3 |
"querylid lid -- print internal information about the lid specified\n");
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void help_portstatus(FILE * out, int detail)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
fprintf(out, "portstatus [ca|switch|router]\n");
|
|
Packit Service |
54dbc3 |
if (detail) {
|
|
Packit Service |
54dbc3 |
fprintf(out, "summarize port status\n");
|
|
Packit Service |
54dbc3 |
fprintf(out,
|
|
Packit Service |
54dbc3 |
" [ca|switch|router] -- limit the results to the node type specified\n");
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void help_switchbalance(FILE * out, int detail)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
fprintf(out, "switchbalance [verbose] [guid]\n");
|
|
Packit Service |
54dbc3 |
if (detail) {
|
|
Packit Service |
54dbc3 |
fprintf(out, "output switch balancing information\n");
|
|
Packit Service |
54dbc3 |
fprintf(out,
|
|
Packit Service |
54dbc3 |
" [verbose] -- verbose output\n"
|
|
Packit Service |
54dbc3 |
" [guid] -- limit results to specified guid\n");
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void help_lidbalance(FILE * out, int detail)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
fprintf(out, "lidbalance [switchguid]\n");
|
|
Packit Service |
54dbc3 |
if (detail) {
|
|
Packit Service |
54dbc3 |
fprintf(out, "output lid balanced forwarding information\n");
|
|
Packit Service |
54dbc3 |
fprintf(out,
|
|
Packit Service |
54dbc3 |
" [switchguid] -- limit results to specified switch guid\n");
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void help_dump_conf(FILE *out, int detail)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
fprintf(out, "dump_conf\n");
|
|
Packit Service |
54dbc3 |
if (detail) {
|
|
Packit Service |
54dbc3 |
fprintf(out, "dump current opensm configuration\n");
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void help_update_desc(FILE *out, int detail)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
fprintf(out, "update_desc\n");
|
|
Packit Service |
54dbc3 |
if (detail) {
|
|
Packit Service |
54dbc3 |
fprintf(out, "update node description for all nodes\n");
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
#ifdef ENABLE_OSM_PERF_MGR
|
|
Packit Service |
54dbc3 |
static void help_perfmgr(FILE * out, int detail)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
fprintf(out,
|
|
Packit Service |
54dbc3 |
"perfmgr(pm) [enable|disable\n"
|
|
Packit Service |
54dbc3 |
" |clear_counters|dump_counters|print_counters(pc)|print_errors(pe)\n"
|
|
Packit Service |
54dbc3 |
" |set_rm_nodes|clear_rm_nodes|clear_inactive\n"
|
|
Packit Service |
54dbc3 |
" |set_query_cpi|clear_query_cpi\n"
|
|
Packit Service |
54dbc3 |
" |dump_redir|clear_redir\n"
|
|
Packit Service |
54dbc3 |
" |sweep|sweep_time[seconds]]\n");
|
|
Packit Service |
54dbc3 |
if (detail) {
|
|
Packit Service |
54dbc3 |
fprintf(out,
|
|
Packit Service |
54dbc3 |
"perfmgr -- print the performance manager state\n");
|
|
Packit Service |
54dbc3 |
fprintf(out,
|
|
Packit Service |
54dbc3 |
" [enable|disable] -- change the perfmgr state\n");
|
|
Packit Service |
54dbc3 |
fprintf(out,
|
|
Packit Service |
54dbc3 |
" [sweep] -- Initiate a sweep of the fabric\n");
|
|
Packit Service |
54dbc3 |
fprintf(out,
|
|
Packit Service |
54dbc3 |
" [sweep_time] -- change the perfmgr sweep time (requires [seconds] option)\n");
|
|
Packit Service |
54dbc3 |
fprintf(out,
|
|
Packit Service |
54dbc3 |
" [clear_counters] -- clear the counters stored\n");
|
|
Packit Service |
54dbc3 |
fprintf(out,
|
|
Packit Service |
54dbc3 |
" [dump_counters [mach]] -- dump the counters (optionally in [mach]ine readable format)\n");
|
|
Packit Service |
54dbc3 |
fprintf(out,
|
|
Packit Service |
54dbc3 |
" [print_counters [<nodename|nodeguid>][:<port>]] -- print the internal counters\n"
|
|
Packit Service |
54dbc3 |
" Optionally limit output by name, guid, or port\n");
|
|
Packit Service |
54dbc3 |
fprintf(out,
|
|
Packit Service |
54dbc3 |
" [pc [<nodename|nodeguid>][:<port>]] -- same as print_counters\n");
|
|
Packit Service |
54dbc3 |
fprintf(out,
|
|
Packit Service |
54dbc3 |
" [print_errors [<nodename|nodeguid>]] -- print only ports with errors\n"
|
|
Packit Service |
54dbc3 |
" Optionally limit output by name or guid\n");
|
|
Packit Service |
54dbc3 |
fprintf(out,
|
|
Packit Service |
54dbc3 |
" [pe [<nodename|nodeguid>]] -- same as print_errors\n");
|
|
Packit Service |
54dbc3 |
fprintf(out,
|
|
Packit Service |
54dbc3 |
" [dump_redir [<nodename|nodeguid>]] -- dump the redirection table\n");
|
|
Packit Service |
54dbc3 |
fprintf(out,
|
|
Packit Service |
54dbc3 |
" [clear_redir [<nodename|nodeguid>]] -- clear the redirection table\n");
|
|
Packit Service |
54dbc3 |
fprintf(out,
|
|
Packit Service |
54dbc3 |
" [[set|clear]_rm_nodes] -- enable/disable the removal of \"inactive\" nodes from the DB\n"
|
|
Packit Service |
54dbc3 |
" Inactive nodes are those which no longer appear on the fabric\n");
|
|
Packit Service |
54dbc3 |
fprintf(out,
|
|
Packit Service |
54dbc3 |
" [[set|clear]_query_cpi] -- enable/disable PerfMgrGet(ClassPortInfo)\n"
|
|
Packit Service |
54dbc3 |
" ClassPortInfo indicates hardware support for extended attributes such as PortCountersExtended\n");
|
|
Packit Service |
54dbc3 |
fprintf(out,
|
|
Packit Service |
54dbc3 |
" [clear_inactive] -- Delete inactive nodes from the DB\n");
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
static void help_pm(FILE *out, int detail)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
if (detail)
|
|
Packit Service |
54dbc3 |
help_perfmgr(out, detail);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
#endif /* ENABLE_OSM_PERF_MGR */
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* more help routines go here */
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void help_parse(char **p_last, osm_opensm_t * p_osm, FILE * out)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
char *p_cmd;
|
|
Packit Service |
54dbc3 |
int i, found = 0;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_cmd = next_token(p_last);
|
|
Packit Service |
54dbc3 |
if (!p_cmd)
|
|
Packit Service |
54dbc3 |
help_command(out, 0);
|
|
Packit Service |
54dbc3 |
else {
|
|
Packit Service |
54dbc3 |
for (i = 1; console_cmds[i].name; i++) {
|
|
Packit Service |
54dbc3 |
if (!strcmp(p_cmd, console_cmds[i].name)) {
|
|
Packit Service |
54dbc3 |
found = 1;
|
|
Packit Service |
54dbc3 |
console_cmds[i].help_function(out, 1);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
if (!found) {
|
|
Packit Service |
54dbc3 |
fprintf(out, "%s : Command not found\n\n", p_cmd);
|
|
Packit Service |
54dbc3 |
help_command(out, 0);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void loglevel_parse(char **p_last, osm_opensm_t * p_osm, FILE * out)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
char *p_cmd;
|
|
Packit Service |
54dbc3 |
int level;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_cmd = next_token(p_last);
|
|
Packit Service |
54dbc3 |
if (!p_cmd)
|
|
Packit Service |
54dbc3 |
fprintf(out, "Current log level is 0x%x\n",
|
|
Packit Service |
54dbc3 |
osm_log_get_level(&p_osm->log));
|
|
Packit Service |
54dbc3 |
else {
|
|
Packit Service |
54dbc3 |
/* Handle x, 0x, and decimal specification of log level */
|
|
Packit Service |
54dbc3 |
if (!strncmp(p_cmd, "x", 1)) {
|
|
Packit Service |
54dbc3 |
p_cmd++;
|
|
Packit Service |
54dbc3 |
level = strtoul(p_cmd, NULL, 16);
|
|
Packit Service |
54dbc3 |
} else {
|
|
Packit Service |
54dbc3 |
if (!strncmp(p_cmd, "0x", 2)) {
|
|
Packit Service |
54dbc3 |
p_cmd += 2;
|
|
Packit Service |
54dbc3 |
level = strtoul(p_cmd, NULL, 16);
|
|
Packit Service |
54dbc3 |
} else
|
|
Packit Service |
54dbc3 |
level = strtol(p_cmd, NULL, 10);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
if ((level >= 0) && (level < 256)) {
|
|
Packit Service |
54dbc3 |
fprintf(out, "Setting log level to 0x%x\n", level);
|
|
Packit Service |
54dbc3 |
osm_log_set_level(&p_osm->log, level);
|
|
Packit Service |
54dbc3 |
} else
|
|
Packit Service |
54dbc3 |
fprintf(out, "Invalid log level 0x%x\n", level);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void permodlog_parse(char **p_last, osm_opensm_t * p_osm, FILE * out)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
FILE *fp;
|
|
Packit Service |
54dbc3 |
char buf[1024];
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (p_osm->subn.opt.per_module_logging_file != NULL) {
|
|
Packit Service |
54dbc3 |
fp = fopen(p_osm->subn.opt.per_module_logging_file, "r");
|
|
Packit Service |
54dbc3 |
if (!fp) {
|
|
Packit Service |
54dbc3 |
if (errno == ENOENT)
|
|
Packit Service |
54dbc3 |
return;
|
|
Packit Service |
54dbc3 |
fprintf(out, "fopen(%s) failed: %s\n",
|
|
Packit Service |
54dbc3 |
p_osm->subn.opt.per_module_logging_file,
|
|
Packit Service |
54dbc3 |
strerror(errno));
|
|
Packit Service |
54dbc3 |
return;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
fprintf(out, "Per module logging file: %s\n",
|
|
Packit Service |
54dbc3 |
p_osm->subn.opt.per_module_logging_file);
|
|
Packit Service |
54dbc3 |
while (fgets(buf, sizeof buf, fp) != NULL)
|
|
Packit Service |
54dbc3 |
fprintf(out, "%s", buf);
|
|
Packit Service |
54dbc3 |
fclose(fp);
|
|
Packit Service |
54dbc3 |
fprintf(out, "\n");
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void priority_parse(char **p_last, osm_opensm_t * p_osm, FILE * out)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
char *p_cmd;
|
|
Packit Service |
54dbc3 |
int priority;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_cmd = next_token(p_last);
|
|
Packit Service |
54dbc3 |
if (!p_cmd)
|
|
Packit Service |
54dbc3 |
fprintf(out, "Current sm-priority is %d\n",
|
|
Packit Service |
54dbc3 |
p_osm->subn.opt.sm_priority);
|
|
Packit Service |
54dbc3 |
else {
|
|
Packit Service |
54dbc3 |
priority = strtol(p_cmd, NULL, 0);
|
|
Packit Service |
54dbc3 |
if (0 > priority || 15 < priority)
|
|
Packit Service |
54dbc3 |
fprintf(out,
|
|
Packit Service |
54dbc3 |
"Invalid sm-priority %d; must be between 0 and 15\n",
|
|
Packit Service |
54dbc3 |
priority);
|
|
Packit Service |
54dbc3 |
else {
|
|
Packit Service |
54dbc3 |
fprintf(out, "Setting sm-priority to %d\n", priority);
|
|
Packit Service |
54dbc3 |
osm_set_sm_priority(&p_osm->sm, (uint8_t)priority);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static const char *sm_state_str(int state)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
switch (state) {
|
|
Packit Service |
54dbc3 |
case IB_SMINFO_STATE_DISCOVERING:
|
|
Packit Service |
54dbc3 |
return "Discovering";
|
|
Packit Service |
54dbc3 |
case IB_SMINFO_STATE_STANDBY:
|
|
Packit Service |
54dbc3 |
return "Standby ";
|
|
Packit Service |
54dbc3 |
case IB_SMINFO_STATE_NOTACTIVE:
|
|
Packit Service |
54dbc3 |
return "Not Active ";
|
|
Packit Service |
54dbc3 |
case IB_SMINFO_STATE_MASTER:
|
|
Packit Service |
54dbc3 |
return "Master ";
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
return "UNKNOWN ";
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static const char *sa_state_str(osm_sa_state_t state)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
switch (state) {
|
|
Packit Service |
54dbc3 |
case OSM_SA_STATE_INIT:
|
|
Packit Service |
54dbc3 |
return "Init";
|
|
Packit Service |
54dbc3 |
case OSM_SA_STATE_READY:
|
|
Packit Service |
54dbc3 |
return "Ready";
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
return "UNKNOWN";
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void dump_sms(osm_opensm_t * p_osm, FILE * out)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
osm_subn_t *p_subn = &p_osm->subn;
|
|
Packit Service |
54dbc3 |
osm_remote_sm_t *p_rsm;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
fprintf(out, "\n Known SMs\n"
|
|
Packit Service |
54dbc3 |
" ---------\n");
|
|
Packit Service |
54dbc3 |
fprintf(out, " Port GUID SM State Priority\n");
|
|
Packit Service |
54dbc3 |
fprintf(out, " --------- -------- --------\n");
|
|
Packit Service |
54dbc3 |
fprintf(out, " 0x%" PRIx64 " %s %d SELF\n",
|
|
Packit Service |
54dbc3 |
cl_ntoh64(p_subn->sm_port_guid),
|
|
Packit Service |
54dbc3 |
sm_state_str(p_subn->sm_state),
|
|
Packit Service |
54dbc3 |
p_subn->opt.sm_priority);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
CL_PLOCK_ACQUIRE(p_osm->sm.p_lock);
|
|
Packit Service |
54dbc3 |
p_rsm = (osm_remote_sm_t *) cl_qmap_head(&p_subn->sm_guid_tbl);
|
|
Packit Service |
54dbc3 |
while (p_rsm != (osm_remote_sm_t *) cl_qmap_end(&p_subn->sm_guid_tbl)) {
|
|
Packit Service |
54dbc3 |
fprintf(out, " 0x%" PRIx64 " %s %d\n",
|
|
Packit Service |
54dbc3 |
cl_ntoh64(p_rsm->smi.guid),
|
|
Packit Service |
54dbc3 |
sm_state_str(ib_sminfo_get_state(&p_rsm->smi)),
|
|
Packit Service |
54dbc3 |
ib_sminfo_get_priority(&p_rsm->smi));
|
|
Packit Service |
54dbc3 |
p_rsm = (osm_remote_sm_t *) cl_qmap_next(&p_rsm->map_item);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
CL_PLOCK_RELEASE(p_osm->sm.p_lock);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void print_status(osm_opensm_t * p_osm, FILE * out)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
cl_list_item_t *item;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (out) {
|
|
Packit Service |
54dbc3 |
const char *re_str;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
cl_plock_acquire(&p_osm->lock);
|
|
Packit Service |
54dbc3 |
fprintf(out, " OpenSM Version : %s\n", p_osm->osm_version);
|
|
Packit Service |
54dbc3 |
fprintf(out, " SM State : %s\n",
|
|
Packit Service |
54dbc3 |
sm_state_str(p_osm->subn.sm_state));
|
|
Packit Service |
54dbc3 |
fprintf(out, " SM Priority : %d\n",
|
|
Packit Service |
54dbc3 |
p_osm->subn.opt.sm_priority);
|
|
Packit Service |
54dbc3 |
fprintf(out, " SA State : %s\n",
|
|
Packit Service |
54dbc3 |
sa_state_str(p_osm->sa.state));
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
re_str = p_osm->routing_engine_used ?
|
|
Packit Service |
54dbc3 |
osm_routing_engine_type_str(p_osm->routing_engine_used->type) :
|
|
Packit Service |
54dbc3 |
osm_routing_engine_type_str(OSM_ROUTING_ENGINE_TYPE_NONE);
|
|
Packit Service |
54dbc3 |
fprintf(out, " Routing Engine : %s\n", re_str);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
fprintf(out, " Loaded event plugins :");
|
|
Packit Service |
54dbc3 |
if (cl_qlist_head(&p_osm->plugin_list) ==
|
|
Packit Service |
54dbc3 |
cl_qlist_end(&p_osm->plugin_list)) {
|
|
Packit Service |
54dbc3 |
fprintf(out, " <none>");
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
for (item = cl_qlist_head(&p_osm->plugin_list);
|
|
Packit Service |
54dbc3 |
item != cl_qlist_end(&p_osm->plugin_list);
|
|
Packit Service |
54dbc3 |
item = cl_qlist_next(item))
|
|
Packit Service |
54dbc3 |
fprintf(out, " %s",
|
|
Packit Service |
54dbc3 |
((osm_epi_plugin_t *)item)->plugin_name);
|
|
Packit Service |
54dbc3 |
fprintf(out, "\n");
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
#ifdef ENABLE_OSM_PERF_MGR
|
|
Packit Service |
54dbc3 |
fprintf(out, "\n PerfMgr state/sweep state : %s/%s\n",
|
|
Packit Service |
54dbc3 |
osm_perfmgr_get_state_str(&p_osm->perfmgr),
|
|
Packit Service |
54dbc3 |
osm_perfmgr_get_sweep_state_str(&p_osm->perfmgr));
|
|
Packit Service |
54dbc3 |
#endif
|
|
Packit Service |
54dbc3 |
fprintf(out, "\n MAD stats\n"
|
|
Packit Service |
54dbc3 |
" ---------\n"
|
|
Packit Service |
54dbc3 |
" QP0 MADs outstanding : %u\n"
|
|
Packit Service |
54dbc3 |
" QP0 MADs outstanding (on wire) : %u\n"
|
|
Packit Service |
54dbc3 |
" QP0 MADs rcvd : %u\n"
|
|
Packit Service |
54dbc3 |
" QP0 MADs sent : %u\n"
|
|
Packit Service |
54dbc3 |
" QP0 unicasts sent : %u\n"
|
|
Packit Service |
54dbc3 |
" QP0 unknown MADs rcvd : %u\n"
|
|
Packit Service |
54dbc3 |
" SA MADs outstanding : %u\n"
|
|
Packit Service |
54dbc3 |
" SA MADs rcvd : %u\n"
|
|
Packit Service |
54dbc3 |
" SA MADs sent : %u\n"
|
|
Packit Service |
54dbc3 |
" SA unknown MADs rcvd : %u\n"
|
|
Packit Service |
54dbc3 |
" SA MADs ignored : %u\n",
|
|
Packit Service |
54dbc3 |
(uint32_t)p_osm->stats.qp0_mads_outstanding,
|
|
Packit Service |
54dbc3 |
(uint32_t)p_osm->stats.qp0_mads_outstanding_on_wire,
|
|
Packit Service |
54dbc3 |
(uint32_t)p_osm->stats.qp0_mads_rcvd,
|
|
Packit Service |
54dbc3 |
(uint32_t)p_osm->stats.qp0_mads_sent,
|
|
Packit Service |
54dbc3 |
(uint32_t)p_osm->stats.qp0_unicasts_sent,
|
|
Packit Service |
54dbc3 |
(uint32_t)p_osm->stats.qp0_mads_rcvd_unknown,
|
|
Packit Service |
54dbc3 |
(uint32_t)p_osm->stats.sa_mads_outstanding,
|
|
Packit Service |
54dbc3 |
(uint32_t)p_osm->stats.sa_mads_rcvd,
|
|
Packit Service |
54dbc3 |
(uint32_t)p_osm->stats.sa_mads_sent,
|
|
Packit Service |
54dbc3 |
(uint32_t)p_osm->stats.sa_mads_rcvd_unknown,
|
|
Packit Service |
54dbc3 |
(uint32_t)p_osm->stats.sa_mads_ignored);
|
|
Packit Service |
54dbc3 |
fprintf(out, "\n Subnet flags\n"
|
|
Packit Service |
54dbc3 |
" ------------\n"
|
|
Packit Service |
54dbc3 |
" Sweeping enabled : %d\n"
|
|
Packit Service |
54dbc3 |
" Sweep interval (seconds) : %u\n"
|
|
Packit Service |
54dbc3 |
" Ignore existing lfts : %d\n"
|
|
Packit Service |
54dbc3 |
" Subnet Init errors : %d\n"
|
|
Packit Service |
54dbc3 |
" In sweep hop 0 : %d\n"
|
|
Packit Service |
54dbc3 |
" First time master sweep : %d\n"
|
|
Packit Service |
54dbc3 |
" Coming out of standby : %d\n",
|
|
Packit Service |
54dbc3 |
p_osm->subn.sweeping_enabled,
|
|
Packit Service |
54dbc3 |
p_osm->subn.opt.sweep_interval,
|
|
Packit Service |
54dbc3 |
p_osm->subn.ignore_existing_lfts,
|
|
Packit Service |
54dbc3 |
p_osm->subn.subnet_initialization_error,
|
|
Packit Service |
54dbc3 |
p_osm->subn.in_sweep_hop_0,
|
|
Packit Service |
54dbc3 |
p_osm->subn.first_time_master_sweep,
|
|
Packit Service |
54dbc3 |
p_osm->subn.coming_out_of_standby);
|
|
Packit Service |
54dbc3 |
dump_sms(p_osm, out);
|
|
Packit Service |
54dbc3 |
fprintf(out, "\n");
|
|
Packit Service |
54dbc3 |
cl_plock_release(&p_osm->lock);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static int loop_command_check_time(void)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
time_t cur = time(NULL);
|
|
Packit Service |
54dbc3 |
if ((loop_command.previous + loop_command.delay_s) < cur) {
|
|
Packit Service |
54dbc3 |
loop_command.previous = cur;
|
|
Packit Service |
54dbc3 |
return 1;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
return 0;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void status_parse(char **p_last, osm_opensm_t * p_osm, FILE * out)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
char *p_cmd;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_cmd = next_token(p_last);
|
|
Packit Service |
54dbc3 |
if (p_cmd) {
|
|
Packit Service |
54dbc3 |
if (strcmp(p_cmd, "loop") == 0) {
|
|
Packit Service |
54dbc3 |
fprintf(out, "Looping on status command...\n");
|
|
Packit Service |
54dbc3 |
fflush(out);
|
|
Packit Service |
54dbc3 |
loop_command.on = 1;
|
|
Packit Service |
54dbc3 |
loop_command.previous = time(NULL);
|
|
Packit Service |
54dbc3 |
loop_command.loop_function = print_status;
|
|
Packit Service |
54dbc3 |
} else {
|
|
Packit Service |
54dbc3 |
help_status(out, 1);
|
|
Packit Service |
54dbc3 |
return;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
print_status(p_osm, out);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void resweep_parse(char **p_last, osm_opensm_t * p_osm, FILE * out)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
char *p_cmd;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_cmd = next_token(p_last);
|
|
Packit Service |
54dbc3 |
if (!p_cmd ||
|
|
Packit Service |
54dbc3 |
(strcmp(p_cmd, "heavy") != 0 && strcmp(p_cmd, "light") != 0)) {
|
|
Packit Service |
54dbc3 |
fprintf(out, "Invalid resweep command\n");
|
|
Packit Service |
54dbc3 |
help_resweep(out, 1);
|
|
Packit Service |
54dbc3 |
} else {
|
|
Packit Service |
54dbc3 |
if (strcmp(p_cmd, "heavy") == 0)
|
|
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 |
|
|
Packit Service |
54dbc3 |
static void reroute_parse(char **p_last, osm_opensm_t * p_osm, FILE * out)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
p_osm->subn.force_reroute = TRUE;
|
|
Packit Service |
54dbc3 |
osm_opensm_sweep(p_osm);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void sweep_parse(char **p_last, osm_opensm_t * p_osm, FILE * out)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
char *p_cmd;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_cmd = next_token(p_last);
|
|
Packit Service |
54dbc3 |
if (!p_cmd ||
|
|
Packit Service |
54dbc3 |
(strcmp(p_cmd, "on") != 0 && strcmp(p_cmd, "off") != 0)) {
|
|
Packit Service |
54dbc3 |
fprintf(out, "Invalid sweep command\n");
|
|
Packit Service |
54dbc3 |
help_sweep(out, 1);
|
|
Packit Service |
54dbc3 |
} else {
|
|
Packit Service |
54dbc3 |
if (strcmp(p_cmd, "on") == 0)
|
|
Packit Service |
54dbc3 |
p_osm->subn.sweeping_enabled = TRUE;
|
|
Packit Service |
54dbc3 |
else
|
|
Packit Service |
54dbc3 |
p_osm->subn.sweeping_enabled = FALSE;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void logflush_parse(char **p_last, osm_opensm_t * p_osm, FILE * out)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
char *p_cmd;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_cmd = next_token(p_last);
|
|
Packit Service |
54dbc3 |
if (!p_cmd ||
|
|
Packit Service |
54dbc3 |
(strcmp(p_cmd, "on") != 0 && strcmp(p_cmd, "off") != 0)) {
|
|
Packit Service |
54dbc3 |
fprintf(out, "Invalid logflush command\n");
|
|
Packit Service |
54dbc3 |
help_sweep(out, 1);
|
|
Packit Service |
54dbc3 |
} else {
|
|
Packit Service |
54dbc3 |
if (strcmp(p_cmd, "on") == 0) {
|
|
Packit Service |
54dbc3 |
p_osm->log.flush = TRUE;
|
|
Packit Service |
54dbc3 |
fflush(p_osm->log.out_port);
|
|
Packit Service |
54dbc3 |
} else
|
|
Packit Service |
54dbc3 |
p_osm->log.flush = FALSE;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void querylid_parse(char **p_last, osm_opensm_t * p_osm, FILE * out)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
unsigned int p = 0;
|
|
Packit Service |
54dbc3 |
uint16_t lid = 0;
|
|
Packit Service |
54dbc3 |
osm_port_t *p_port = NULL;
|
|
Packit Service |
54dbc3 |
char *p_cmd = next_token(p_last);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (!p_cmd) {
|
|
Packit Service |
54dbc3 |
fprintf(out, "no LID specified\n");
|
|
Packit Service |
54dbc3 |
help_querylid(out, 1);
|
|
Packit Service |
54dbc3 |
return;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
lid = (uint16_t) strtoul(p_cmd, NULL, 0);
|
|
Packit Service |
54dbc3 |
cl_plock_acquire(&p_osm->lock);
|
|
Packit Service |
54dbc3 |
p_port = osm_get_port_by_lid_ho(&p_osm->subn, lid);
|
|
Packit Service |
54dbc3 |
if (!p_port)
|
|
Packit Service |
54dbc3 |
goto invalid_lid;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
fprintf(out, "Query results for LID %u\n", lid);
|
|
Packit Service |
54dbc3 |
fprintf(out,
|
|
Packit Service |
54dbc3 |
" GUID : 0x%016" PRIx64 "\n"
|
|
Packit Service |
54dbc3 |
" Node Desc : %s\n"
|
|
Packit Service |
54dbc3 |
" Node Type : %s\n"
|
|
Packit Service |
54dbc3 |
" Num Ports : %d\n",
|
|
Packit Service |
54dbc3 |
cl_ntoh64(p_port->guid),
|
|
Packit Service |
54dbc3 |
p_port->p_node->print_desc,
|
|
Packit Service |
54dbc3 |
ib_get_node_type_str(osm_node_get_type(p_port->p_node)),
|
|
Packit Service |
54dbc3 |
p_port->p_node->node_info.num_ports);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (p_port->p_node->sw)
|
|
Packit Service |
54dbc3 |
p = 0;
|
|
Packit Service |
54dbc3 |
else
|
|
Packit Service |
54dbc3 |
p = 1;
|
|
Packit Service |
54dbc3 |
for ( /* see above */ ; p < p_port->p_node->physp_tbl_size; p++) {
|
|
Packit Service |
54dbc3 |
fprintf(out,
|
|
Packit Service |
54dbc3 |
" Port %u health : %s\n",
|
|
Packit Service |
54dbc3 |
p,
|
|
Packit Service |
54dbc3 |
p_port->p_node->physp_table[p].
|
|
Packit Service |
54dbc3 |
healthy ? "OK" : "ERROR");
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
cl_plock_release(&p_osm->lock);
|
|
Packit Service |
54dbc3 |
return;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
invalid_lid:
|
|
Packit Service |
54dbc3 |
cl_plock_release(&p_osm->lock);
|
|
Packit Service |
54dbc3 |
fprintf(out, "Invalid lid %d\n", lid);
|
|
Packit Service |
54dbc3 |
return;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/**
|
|
Packit Service |
54dbc3 |
* Data structures for the portstatus command
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
typedef struct _port_report {
|
|
Packit Service |
54dbc3 |
struct _port_report *next;
|
|
Packit Service |
54dbc3 |
uint64_t node_guid;
|
|
Packit Service |
54dbc3 |
uint8_t port_num;
|
|
Packit Service |
54dbc3 |
char print_desc[IB_NODE_DESCRIPTION_SIZE + 1];
|
|
Packit Service |
54dbc3 |
} port_report_t;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void
|
|
Packit Service |
54dbc3 |
__tag_port_report(port_report_t ** head, uint64_t node_guid,
|
|
Packit Service |
54dbc3 |
uint8_t port_num, char *print_desc)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
port_report_t *rep = malloc(sizeof(*rep));
|
|
Packit Service |
54dbc3 |
if (!rep)
|
|
Packit Service |
54dbc3 |
return;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
rep->node_guid = node_guid;
|
|
Packit Service |
54dbc3 |
rep->port_num = port_num;
|
|
Packit Service |
54dbc3 |
memcpy(rep->print_desc, print_desc, IB_NODE_DESCRIPTION_SIZE + 1);
|
|
Packit Service |
54dbc3 |
rep->next = NULL;
|
|
Packit Service |
54dbc3 |
if (*head) {
|
|
Packit Service |
54dbc3 |
rep->next = *head;
|
|
Packit Service |
54dbc3 |
*head = rep;
|
|
Packit Service |
54dbc3 |
} else
|
|
Packit Service |
54dbc3 |
*head = rep;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void __print_port_report(FILE * out, port_report_t * head)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
port_report_t *item = head;
|
|
Packit Service |
54dbc3 |
while (item != NULL) {
|
|
Packit Service |
54dbc3 |
fprintf(out, " 0x%016" PRIx64 " %d (%s)\n",
|
|
Packit Service |
54dbc3 |
item->node_guid, item->port_num, item->print_desc);
|
|
Packit Service |
54dbc3 |
port_report_t *next = item->next;
|
|
Packit Service |
54dbc3 |
free(item);
|
|
Packit Service |
54dbc3 |
item = next;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
typedef struct {
|
|
Packit Service |
54dbc3 |
uint8_t node_type_lim; /* limit the results; 0 == ALL */
|
|
Packit Service |
54dbc3 |
uint64_t total_nodes;
|
|
Packit Service |
54dbc3 |
uint64_t total_ports;
|
|
Packit Service |
54dbc3 |
uint64_t ports_down;
|
|
Packit Service |
54dbc3 |
uint64_t ports_active;
|
|
Packit Service |
54dbc3 |
uint64_t ports_disabled;
|
|
Packit Service |
54dbc3 |
port_report_t *disabled_ports;
|
|
Packit Service |
54dbc3 |
uint64_t ports_1X;
|
|
Packit Service |
54dbc3 |
uint64_t ports_4X;
|
|
Packit Service |
54dbc3 |
uint64_t ports_8X;
|
|
Packit Service |
54dbc3 |
uint64_t ports_12X;
|
|
Packit Service |
54dbc3 |
uint64_t ports_2X;
|
|
Packit Service |
54dbc3 |
uint64_t ports_unknown_width;
|
|
Packit Service |
54dbc3 |
port_report_t *unknown_width_ports;
|
|
Packit Service |
54dbc3 |
uint64_t ports_unenabled_width;
|
|
Packit Service |
54dbc3 |
port_report_t *unenabled_width_ports;
|
|
Packit Service |
54dbc3 |
uint64_t ports_reduced_width;
|
|
Packit Service |
54dbc3 |
port_report_t *reduced_width_ports;
|
|
Packit Service |
54dbc3 |
uint64_t ports_sdr;
|
|
Packit Service |
54dbc3 |
uint64_t ports_ddr;
|
|
Packit Service |
54dbc3 |
uint64_t ports_qdr;
|
|
Packit Service |
54dbc3 |
uint64_t ports_fdr10;
|
|
Packit Service |
54dbc3 |
uint64_t ports_fdr;
|
|
Packit Service |
54dbc3 |
uint64_t ports_edr;
|
|
Packit Service |
54dbc3 |
uint64_t ports_hdr;
|
|
Packit Service |
54dbc3 |
uint64_t ports_unknown_speed;
|
|
Packit Service |
54dbc3 |
port_report_t *unknown_speed_ports;
|
|
Packit Service |
54dbc3 |
uint64_t ports_unenabled_speed;
|
|
Packit Service |
54dbc3 |
port_report_t *unenabled_speed_ports;
|
|
Packit Service |
54dbc3 |
uint64_t ports_reduced_speed;
|
|
Packit Service |
54dbc3 |
port_report_t *reduced_speed_ports;
|
|
Packit Service |
54dbc3 |
} fabric_stats_t;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/**
|
|
Packit Service |
54dbc3 |
* iterator function to get portstatus on each node
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
static void __get_stats(cl_map_item_t * const p_map_item, void *context)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
fabric_stats_t *fs = (fabric_stats_t *) context;
|
|
Packit Service |
54dbc3 |
osm_node_t *node = (osm_node_t *) p_map_item;
|
|
Packit Service |
54dbc3 |
osm_physp_t *physp0;
|
|
Packit Service |
54dbc3 |
ib_port_info_t *pi0;
|
|
Packit Service |
54dbc3 |
uint8_t num_ports = osm_node_get_num_physp(node);
|
|
Packit Service |
54dbc3 |
uint8_t port = 0;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* Skip nodes we are not interested in */
|
|
Packit Service |
54dbc3 |
if (fs->node_type_lim != 0
|
|
Packit Service |
54dbc3 |
&& fs->node_type_lim != node->node_info.node_type)
|
|
Packit Service |
54dbc3 |
return;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
fs->total_nodes++;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (osm_node_get_type(node) == IB_NODE_TYPE_SWITCH) {
|
|
Packit Service |
54dbc3 |
physp0 = osm_node_get_physp_ptr(node, 0);
|
|
Packit Service |
54dbc3 |
pi0 = &physp0->port_info;
|
|
Packit Service |
54dbc3 |
} else
|
|
Packit Service |
54dbc3 |
pi0 = NULL;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
for (port = 1; port < num_ports; port++) {
|
|
Packit Service |
54dbc3 |
osm_physp_t *phys = osm_node_get_physp_ptr(node, port);
|
|
Packit Service |
54dbc3 |
ib_port_info_t *pi = NULL;
|
|
Packit Service |
54dbc3 |
ib_mlnx_ext_port_info_t *epi = NULL;
|
|
Packit Service |
54dbc3 |
uint8_t active_speed = 0;
|
|
Packit Service |
54dbc3 |
uint8_t enabled_speed = 0;
|
|
Packit Service |
54dbc3 |
uint8_t active_width = 0;
|
|
Packit Service |
54dbc3 |
uint8_t enabled_width = 0;
|
|
Packit Service |
54dbc3 |
uint8_t port_state = 0;
|
|
Packit Service |
54dbc3 |
uint8_t port_phys_state = 0;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (!phys)
|
|
Packit Service |
54dbc3 |
continue;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
pi = &phys->port_info;
|
|
Packit Service |
54dbc3 |
epi = &phys->ext_port_info;
|
|
Packit Service |
54dbc3 |
if (!pi0)
|
|
Packit Service |
54dbc3 |
pi0 = pi;
|
|
Packit Service |
54dbc3 |
active_speed = ib_port_info_get_link_speed_active(pi);
|
|
Packit Service |
54dbc3 |
enabled_speed = ib_port_info_get_link_speed_enabled(pi);
|
|
Packit Service |
54dbc3 |
active_width = pi->link_width_active;
|
|
Packit Service |
54dbc3 |
enabled_width = pi->link_width_enabled;
|
|
Packit Service |
54dbc3 |
port_state = ib_port_info_get_port_state(pi);
|
|
Packit Service |
54dbc3 |
port_phys_state = ib_port_info_get_port_phys_state(pi);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (port_state == IB_LINK_DOWN)
|
|
Packit Service |
54dbc3 |
fs->ports_down++;
|
|
Packit Service |
54dbc3 |
else if (port_state == IB_LINK_ACTIVE)
|
|
Packit Service |
54dbc3 |
fs->ports_active++;
|
|
Packit Service |
54dbc3 |
if (port_phys_state == IB_PORT_PHYS_STATE_DISABLED) {
|
|
Packit Service |
54dbc3 |
__tag_port_report(&(fs->disabled_ports),
|
|
Packit Service |
54dbc3 |
cl_ntoh64(node->node_info.node_guid),
|
|
Packit Service |
54dbc3 |
port, node->print_desc);
|
|
Packit Service |
54dbc3 |
fs->ports_disabled++;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
fs->total_ports++;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (port_state == IB_LINK_DOWN)
|
|
Packit Service |
54dbc3 |
continue;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (!(active_width & enabled_width)) {
|
|
Packit Service |
54dbc3 |
__tag_port_report(&(fs->unenabled_width_ports),
|
|
Packit Service |
54dbc3 |
cl_ntoh64(node->node_info.node_guid),
|
|
Packit Service |
54dbc3 |
port, node->print_desc);
|
|
Packit Service |
54dbc3 |
fs->ports_unenabled_width++;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
else if ((enabled_width ^ active_width) > active_width) {
|
|
Packit Service |
54dbc3 |
__tag_port_report(&(fs->reduced_width_ports),
|
|
Packit Service |
54dbc3 |
cl_ntoh64(node->node_info.node_guid),
|
|
Packit Service |
54dbc3 |
port, node->print_desc);
|
|
Packit Service |
54dbc3 |
fs->ports_reduced_width++;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* unenabled speed usually due to problems with force_link_speed */
|
|
Packit Service |
54dbc3 |
if (!(active_speed & enabled_speed)) {
|
|
Packit Service |
54dbc3 |
__tag_port_report(&(fs->unenabled_speed_ports),
|
|
Packit Service |
54dbc3 |
cl_ntoh64(node->node_info.node_guid),
|
|
Packit Service |
54dbc3 |
port, node->print_desc);
|
|
Packit Service |
54dbc3 |
fs->ports_unenabled_speed++;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
else if ((enabled_speed ^ active_speed) > active_speed) {
|
|
Packit Service |
54dbc3 |
__tag_port_report(&(fs->reduced_speed_ports),
|
|
Packit Service |
54dbc3 |
cl_ntoh64(node->node_info.node_guid),
|
|
Packit Service |
54dbc3 |
port, node->print_desc);
|
|
Packit Service |
54dbc3 |
fs->ports_reduced_speed++;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
switch (active_speed) {
|
|
Packit Service |
54dbc3 |
case IB_LINK_SPEED_ACTIVE_2_5:
|
|
Packit Service |
54dbc3 |
fs->ports_sdr++;
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case IB_LINK_SPEED_ACTIVE_5:
|
|
Packit Service |
54dbc3 |
fs->ports_ddr++;
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case IB_LINK_SPEED_ACTIVE_10:
|
|
Packit Service |
54dbc3 |
if (!(pi0->capability_mask & IB_PORT_CAP_HAS_EXT_SPEEDS) ||
|
|
Packit Service |
54dbc3 |
!ib_port_info_get_link_speed_ext_active(pi)) {
|
|
Packit Service |
54dbc3 |
if (epi->link_speed_active & FDR10)
|
|
Packit Service |
54dbc3 |
fs->ports_fdr10++;
|
|
Packit Service |
54dbc3 |
else {
|
|
Packit Service |
54dbc3 |
fs->ports_qdr++;
|
|
Packit Service |
54dbc3 |
/* check for speed reduced from FDR10 */
|
|
Packit Service |
54dbc3 |
if (epi->link_speed_enabled & FDR10) {
|
|
Packit Service |
54dbc3 |
__tag_port_report(&(fs->reduced_speed_ports),
|
|
Packit Service |
54dbc3 |
cl_ntoh64(node->node_info.node_guid),
|
|
Packit Service |
54dbc3 |
port, node->print_desc);
|
|
Packit Service |
54dbc3 |
fs->ports_reduced_speed++;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case IB_LINK_SPEED_ACTIVE_EXTENDED:
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
default:
|
|
Packit Service |
54dbc3 |
__tag_port_report(&(fs->unknown_speed_ports),
|
|
Packit Service |
54dbc3 |
cl_ntoh64(node->node_info.node_guid),
|
|
Packit Service |
54dbc3 |
port, node->print_desc);
|
|
Packit Service |
54dbc3 |
fs->ports_unknown_speed++;
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
if (pi0->capability_mask & IB_PORT_CAP_HAS_EXT_SPEEDS &&
|
|
Packit Service |
54dbc3 |
ib_port_info_get_link_speed_ext_sup(pi) &&
|
|
Packit Service |
54dbc3 |
(enabled_speed = ib_port_info_get_link_speed_ext_enabled(pi)) != IB_LINK_SPEED_EXT_DISABLE &&
|
|
Packit Service |
54dbc3 |
active_speed == IB_LINK_SPEED_ACTIVE_10) {
|
|
Packit Service |
54dbc3 |
active_speed = ib_port_info_get_link_speed_ext_active(pi);
|
|
Packit Service |
54dbc3 |
if (!(active_speed & enabled_speed)) {
|
|
Packit Service |
54dbc3 |
__tag_port_report(&(fs->unenabled_speed_ports),
|
|
Packit Service |
54dbc3 |
cl_ntoh64(node->node_info.node_guid),
|
|
Packit Service |
54dbc3 |
port, node->print_desc);
|
|
Packit Service |
54dbc3 |
fs->ports_unenabled_speed++;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
else if ((enabled_speed ^ active_speed) > active_speed) {
|
|
Packit Service |
54dbc3 |
__tag_port_report(&(fs->reduced_speed_ports),
|
|
Packit Service |
54dbc3 |
cl_ntoh64(node->node_info.node_guid),
|
|
Packit Service |
54dbc3 |
port, node->print_desc);
|
|
Packit Service |
54dbc3 |
fs->ports_reduced_speed++;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
switch (active_speed) {
|
|
Packit Service |
54dbc3 |
case IB_LINK_SPEED_EXT_ACTIVE_14:
|
|
Packit Service |
54dbc3 |
fs->ports_fdr++;
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case IB_LINK_SPEED_EXT_ACTIVE_25:
|
|
Packit Service |
54dbc3 |
fs->ports_edr++;
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case IB_LINK_SPEED_EXT_ACTIVE_50:
|
|
Packit Service |
54dbc3 |
fs->ports_hdr++;
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case IB_LINK_SPEED_EXT_ACTIVE_NONE:
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
default:
|
|
Packit Service |
54dbc3 |
__tag_port_report(&(fs->unknown_speed_ports),
|
|
Packit Service |
54dbc3 |
cl_ntoh64(node->node_info.node_guid),
|
|
Packit Service |
54dbc3 |
port, node->print_desc);
|
|
Packit Service |
54dbc3 |
fs->ports_unknown_speed++;
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
switch (active_width) {
|
|
Packit Service |
54dbc3 |
case IB_LINK_WIDTH_ACTIVE_1X:
|
|
Packit Service |
54dbc3 |
fs->ports_1X++;
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case IB_LINK_WIDTH_ACTIVE_4X:
|
|
Packit Service |
54dbc3 |
fs->ports_4X++;
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case IB_LINK_WIDTH_ACTIVE_8X:
|
|
Packit Service |
54dbc3 |
fs->ports_8X++;
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case IB_LINK_WIDTH_ACTIVE_12X:
|
|
Packit Service |
54dbc3 |
fs->ports_12X++;
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case IB_LINK_WIDTH_ACTIVE_2X:
|
|
Packit Service |
54dbc3 |
fs->ports_2X++;
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
default:
|
|
Packit Service |
54dbc3 |
__tag_port_report(&(fs->unknown_width_ports),
|
|
Packit Service |
54dbc3 |
cl_ntoh64(node->node_info.node_guid),
|
|
Packit Service |
54dbc3 |
port, node->print_desc);
|
|
Packit Service |
54dbc3 |
fs->ports_unknown_width++;
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void portstatus_parse(char **p_last, osm_opensm_t * p_osm, FILE * out)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
fabric_stats_t fs;
|
|
Packit Service |
54dbc3 |
struct timeval before, after;
|
|
Packit Service |
54dbc3 |
char *p_cmd;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
memset(&fs, 0, sizeof(fs));
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_cmd = next_token(p_last);
|
|
Packit Service |
54dbc3 |
if (p_cmd) {
|
|
Packit Service |
54dbc3 |
if (strcmp(p_cmd, "ca") == 0) {
|
|
Packit Service |
54dbc3 |
fs.node_type_lim = IB_NODE_TYPE_CA;
|
|
Packit Service |
54dbc3 |
} else if (strcmp(p_cmd, "switch") == 0) {
|
|
Packit Service |
54dbc3 |
fs.node_type_lim = IB_NODE_TYPE_SWITCH;
|
|
Packit Service |
54dbc3 |
} else if (strcmp(p_cmd, "router") == 0) {
|
|
Packit Service |
54dbc3 |
fs.node_type_lim = IB_NODE_TYPE_ROUTER;
|
|
Packit Service |
54dbc3 |
} else {
|
|
Packit Service |
54dbc3 |
fprintf(out, "Node type not understood\n");
|
|
Packit Service |
54dbc3 |
help_portstatus(out, 1);
|
|
Packit Service |
54dbc3 |
return;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
gettimeofday(&before, NULL);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* for each node in the system gather the stats */
|
|
Packit Service |
54dbc3 |
cl_plock_acquire(&p_osm->lock);
|
|
Packit Service |
54dbc3 |
cl_qmap_apply_func(&(p_osm->subn.node_guid_tbl), __get_stats,
|
|
Packit Service |
54dbc3 |
(void *)&fs);
|
|
Packit Service |
54dbc3 |
cl_plock_release(&p_osm->lock);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
gettimeofday(&after, NULL);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* report the stats */
|
|
Packit Service |
54dbc3 |
fprintf(out, "\"%s\" port status:\n",
|
|
Packit Service |
54dbc3 |
fs.node_type_lim ? ib_get_node_type_str(fs.
|
|
Packit Service |
54dbc3 |
node_type_lim) : "ALL");
|
|
Packit Service |
54dbc3 |
fprintf(out,
|
|
Packit Service |
54dbc3 |
" %" PRIu64 " port(s) scanned on %" PRIu64
|
|
Packit Service |
54dbc3 |
" nodes in %lu us\n", fs.total_ports, fs.total_nodes,
|
|
Packit Service |
54dbc3 |
after.tv_usec - before.tv_usec);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (fs.ports_down)
|
|
Packit Service |
54dbc3 |
fprintf(out, " %" PRIu64 " down\n", fs.ports_down);
|
|
Packit Service |
54dbc3 |
if (fs.ports_active)
|
|
Packit Service |
54dbc3 |
fprintf(out, " %" PRIu64 " active\n", fs.ports_active);
|
|
Packit Service |
54dbc3 |
if (fs.ports_1X)
|
|
Packit Service |
54dbc3 |
fprintf(out, " %" PRIu64 " at 1X\n", fs.ports_1X);
|
|
Packit Service |
54dbc3 |
if (fs.ports_4X)
|
|
Packit Service |
54dbc3 |
fprintf(out, " %" PRIu64 " at 4X\n", fs.ports_4X);
|
|
Packit Service |
54dbc3 |
if (fs.ports_8X)
|
|
Packit Service |
54dbc3 |
fprintf(out, " %" PRIu64 " at 8X\n", fs.ports_8X);
|
|
Packit Service |
54dbc3 |
if (fs.ports_12X)
|
|
Packit Service |
54dbc3 |
fprintf(out, " %" PRIu64 " at 12X\n", fs.ports_12X);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (fs.ports_sdr)
|
|
Packit Service |
54dbc3 |
fprintf(out, " %" PRIu64 " at 2.5 Gbps\n", fs.ports_sdr);
|
|
Packit Service |
54dbc3 |
if (fs.ports_ddr)
|
|
Packit Service |
54dbc3 |
fprintf(out, " %" PRIu64 " at 5.0 Gbps\n", fs.ports_ddr);
|
|
Packit Service |
54dbc3 |
if (fs.ports_qdr)
|
|
Packit Service |
54dbc3 |
fprintf(out, " %" PRIu64 " at 10.0 Gbps\n", fs.ports_qdr);
|
|
Packit Service |
54dbc3 |
if (fs.ports_fdr10)
|
|
Packit Service |
54dbc3 |
fprintf(out, " %" PRIu64 " at 10.0 Gbps (FDR10)\n", fs.ports_fdr10);
|
|
Packit Service |
54dbc3 |
if (fs.ports_fdr)
|
|
Packit Service |
54dbc3 |
fprintf(out, " %" PRIu64 " at 14.0625 Gbps\n", fs.ports_fdr);
|
|
Packit Service |
54dbc3 |
if (fs.ports_edr)
|
|
Packit Service |
54dbc3 |
fprintf(out, " %" PRIu64 " at 25.78125 Gbps\n", fs.ports_edr);
|
|
Packit Service |
54dbc3 |
if (fs.ports_hdr)
|
|
Packit Service |
54dbc3 |
fprintf(out, " %" PRIu64 " at 53.125 Gbps\n", fs.ports_hdr);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (fs.ports_disabled + fs.ports_reduced_speed + fs.ports_reduced_width
|
|
Packit Service |
54dbc3 |
+ fs.ports_unenabled_width + fs.ports_unenabled_speed
|
|
Packit Service |
54dbc3 |
+ fs.ports_unknown_width + fs.ports_unknown_speed > 0) {
|
|
Packit Service |
54dbc3 |
fprintf(out, "\nPossible issues:\n");
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
if (fs.ports_disabled) {
|
|
Packit Service |
54dbc3 |
fprintf(out, " %" PRIu64 " disabled\n", fs.ports_disabled);
|
|
Packit Service |
54dbc3 |
__print_port_report(out, fs.disabled_ports);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
if (fs.ports_unenabled_speed) {
|
|
Packit Service |
54dbc3 |
fprintf(out, " %" PRIu64 " with unenabled speed\n",
|
|
Packit Service |
54dbc3 |
fs.ports_unenabled_speed);
|
|
Packit Service |
54dbc3 |
__print_port_report(out, fs.unenabled_speed_ports);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
if (fs.ports_reduced_speed) {
|
|
Packit Service |
54dbc3 |
fprintf(out, " %" PRIu64 " with reduced speed\n",
|
|
Packit Service |
54dbc3 |
fs.ports_reduced_speed);
|
|
Packit Service |
54dbc3 |
__print_port_report(out, fs.reduced_speed_ports);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
if (fs.ports_unknown_speed) {
|
|
Packit Service |
54dbc3 |
fprintf(out, " %" PRIu64 " with unknown speed\n",
|
|
Packit Service |
54dbc3 |
fs.ports_unknown_speed);
|
|
Packit Service |
54dbc3 |
__print_port_report(out, fs.unknown_speed_ports);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
if (fs.ports_unenabled_width) {
|
|
Packit Service |
54dbc3 |
fprintf(out, " %" PRIu64 " with unenabled width\n",
|
|
Packit Service |
54dbc3 |
fs.ports_unenabled_width);
|
|
Packit Service |
54dbc3 |
__print_port_report(out, fs.unenabled_width_ports);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
if (fs.ports_reduced_width) {
|
|
Packit Service |
54dbc3 |
fprintf(out, " %" PRIu64 " with reduced width\n",
|
|
Packit Service |
54dbc3 |
fs.ports_reduced_width);
|
|
Packit Service |
54dbc3 |
__print_port_report(out, fs.reduced_width_ports);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
if (fs.ports_unknown_width) {
|
|
Packit Service |
54dbc3 |
fprintf(out, " %" PRIu64 " with unknown width\n",
|
|
Packit Service |
54dbc3 |
fs.ports_unknown_width);
|
|
Packit Service |
54dbc3 |
__print_port_report(out, fs.unknown_width_ports);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
fprintf(out, "\n");
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void switchbalance_check(osm_opensm_t * p_osm,
|
|
Packit Service |
54dbc3 |
osm_switch_t * p_sw, FILE * out, int verbose)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
uint8_t port_num;
|
|
Packit Service |
54dbc3 |
uint8_t num_ports;
|
|
Packit Service |
54dbc3 |
const cl_qmap_t *p_port_tbl;
|
|
Packit Service |
54dbc3 |
osm_port_t *p_port;
|
|
Packit Service |
54dbc3 |
osm_physp_t *p_physp;
|
|
Packit Service |
54dbc3 |
osm_physp_t *p_rem_physp;
|
|
Packit Service |
54dbc3 |
osm_node_t *p_rem_node;
|
|
Packit Service |
54dbc3 |
uint32_t count[255]; /* max ports is a uint8_t */
|
|
Packit Service |
54dbc3 |
uint8_t output_ports[255];
|
|
Packit Service |
54dbc3 |
uint8_t output_ports_count = 0;
|
|
Packit Service |
54dbc3 |
uint32_t min_count = 0xFFFFFFFF;
|
|
Packit Service |
54dbc3 |
uint32_t max_count = 0;
|
|
Packit Service |
54dbc3 |
unsigned int i;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
memset(count, '\0', sizeof(uint32_t) * 255);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* Count port usage */
|
|
Packit Service |
54dbc3 |
p_port_tbl = &p_osm->subn.port_guid_tbl;
|
|
Packit Service |
54dbc3 |
for (p_port = (osm_port_t *) cl_qmap_head(p_port_tbl);
|
|
Packit Service |
54dbc3 |
p_port != (osm_port_t *) cl_qmap_end(p_port_tbl);
|
|
Packit Service |
54dbc3 |
p_port = (osm_port_t *) cl_qmap_next(&p_port->map_item)) {
|
|
Packit Service |
54dbc3 |
uint16_t min_lid_ho;
|
|
Packit Service |
54dbc3 |
uint16_t max_lid_ho;
|
|
Packit Service |
54dbc3 |
uint16_t lid_ho;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* Don't count switches in port usage */
|
|
Packit Service |
54dbc3 |
if (osm_node_get_type(p_port->p_node) == IB_NODE_TYPE_SWITCH)
|
|
Packit Service |
54dbc3 |
continue;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
osm_port_get_lid_range_ho(p_port, &min_lid_ho, &max_lid_ho);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (min_lid_ho == 0 || max_lid_ho == 0)
|
|
Packit Service |
54dbc3 |
continue;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
for (lid_ho = min_lid_ho; lid_ho <= max_lid_ho; lid_ho++) {
|
|
Packit Service |
54dbc3 |
port_num = osm_switch_get_port_by_lid(p_sw, lid_ho,
|
|
Packit Service |
54dbc3 |
OSM_NEW_LFT);
|
|
Packit Service |
54dbc3 |
if (port_num == OSM_NO_PATH)
|
|
Packit Service |
54dbc3 |
continue;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
count[port_num]++;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
num_ports = p_sw->num_ports;
|
|
Packit Service |
54dbc3 |
for (port_num = 1; port_num < num_ports; port_num++) {
|
|
Packit Service |
54dbc3 |
p_physp = osm_node_get_physp_ptr(p_sw->p_node, port_num);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* if port is down/unhealthy, don't consider it in
|
|
Packit Service |
54dbc3 |
* min/max calculations
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
if (!p_physp || !osm_physp_is_healthy(p_physp)
|
|
Packit Service |
54dbc3 |
|| !osm_physp_get_remote(p_physp))
|
|
Packit Service |
54dbc3 |
continue;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_rem_physp = osm_physp_get_remote(p_physp);
|
|
Packit Service |
54dbc3 |
p_rem_node = osm_physp_get_node_ptr(p_rem_physp);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* If we are directly connected to a CA/router, its not really
|
|
Packit Service |
54dbc3 |
* up for balancing consideration.
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
if (osm_node_get_type(p_rem_node) != IB_NODE_TYPE_SWITCH)
|
|
Packit Service |
54dbc3 |
continue;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
output_ports[output_ports_count] = port_num;
|
|
Packit Service |
54dbc3 |
output_ports_count++;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (count[port_num] < min_count)
|
|
Packit Service |
54dbc3 |
min_count = count[port_num];
|
|
Packit Service |
54dbc3 |
if (count[port_num] > max_count)
|
|
Packit Service |
54dbc3 |
max_count = count[port_num];
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (verbose || ((max_count - min_count) > 1)) {
|
|
Packit Service |
54dbc3 |
if ((max_count - min_count) > 1)
|
|
Packit Service |
54dbc3 |
fprintf(out,
|
|
Packit Service |
54dbc3 |
"Unbalanced Switch: 0x%016" PRIx64 " (%s)\n",
|
|
Packit Service |
54dbc3 |
cl_ntoh64(p_sw->p_node->node_info.node_guid),
|
|
Packit Service |
54dbc3 |
p_sw->p_node->print_desc);
|
|
Packit Service |
54dbc3 |
else
|
|
Packit Service |
54dbc3 |
fprintf(out,
|
|
Packit Service |
54dbc3 |
"Switch: 0x%016" PRIx64 " (%s)\n",
|
|
Packit Service |
54dbc3 |
cl_ntoh64(p_sw->p_node->node_info.node_guid),
|
|
Packit Service |
54dbc3 |
p_sw->p_node->print_desc);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
for (i = 0; i < output_ports_count; i++) {
|
|
Packit Service |
54dbc3 |
fprintf(out,
|
|
Packit Service |
54dbc3 |
"Port %d: %d\n",
|
|
Packit Service |
54dbc3 |
output_ports[i], count[output_ports[i]]);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void switchbalance_parse(char **p_last, osm_opensm_t * p_osm, FILE * out)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
char *p_cmd;
|
|
Packit Service |
54dbc3 |
uint64_t guid = 0;
|
|
Packit Service |
54dbc3 |
osm_switch_t *p_sw;
|
|
Packit Service |
54dbc3 |
int verbose = 0;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_cmd = next_token(p_last);
|
|
Packit Service |
54dbc3 |
if (p_cmd) {
|
|
Packit Service |
54dbc3 |
char *p_end;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (strcmp(p_cmd, "verbose") == 0) {
|
|
Packit Service |
54dbc3 |
verbose++;
|
|
Packit Service |
54dbc3 |
p_cmd = next_token(p_last);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (p_cmd) {
|
|
Packit Service |
54dbc3 |
guid = strtoull(p_cmd, &p_end, 0);
|
|
Packit Service |
54dbc3 |
if (!guid || *p_end != '\0') {
|
|
Packit Service |
54dbc3 |
fprintf(out, "Invalid guid specified\n");
|
|
Packit Service |
54dbc3 |
help_switchbalance(out, 1);
|
|
Packit Service |
54dbc3 |
return;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
cl_plock_acquire(&p_osm->lock);
|
|
Packit Service |
54dbc3 |
if (guid) {
|
|
Packit Service |
54dbc3 |
p_sw = osm_get_switch_by_guid(&p_osm->subn, cl_hton64(guid));
|
|
Packit Service |
54dbc3 |
if (!p_sw) {
|
|
Packit Service |
54dbc3 |
fprintf(out, "guid not found\n");
|
|
Packit Service |
54dbc3 |
goto lock_exit;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
switchbalance_check(p_osm, p_sw, out, verbose);
|
|
Packit Service |
54dbc3 |
} else {
|
|
Packit Service |
54dbc3 |
cl_qmap_t *p_sw_guid_tbl = &p_osm->subn.sw_guid_tbl;
|
|
Packit Service |
54dbc3 |
for (p_sw = (osm_switch_t *) cl_qmap_head(p_sw_guid_tbl);
|
|
Packit Service |
54dbc3 |
p_sw != (osm_switch_t *) cl_qmap_end(p_sw_guid_tbl);
|
|
Packit Service |
54dbc3 |
p_sw = (osm_switch_t *) cl_qmap_next(&p_sw->map_item))
|
|
Packit Service |
54dbc3 |
switchbalance_check(p_osm, p_sw, out, verbose);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
lock_exit:
|
|
Packit Service |
54dbc3 |
cl_plock_release(&p_osm->lock);
|
|
Packit Service |
54dbc3 |
return;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void lidbalance_check(osm_opensm_t * p_osm,
|
|
Packit Service |
54dbc3 |
osm_switch_t * p_sw, FILE * out)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
uint8_t port_num;
|
|
Packit Service |
54dbc3 |
const cl_qmap_t *p_port_tbl;
|
|
Packit Service |
54dbc3 |
osm_port_t *p_port;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_port_tbl = &p_osm->subn.port_guid_tbl;
|
|
Packit Service |
54dbc3 |
for (p_port = (osm_port_t *) cl_qmap_head(p_port_tbl);
|
|
Packit Service |
54dbc3 |
p_port != (osm_port_t *) cl_qmap_end(p_port_tbl);
|
|
Packit Service |
54dbc3 |
p_port = (osm_port_t *) cl_qmap_next(&p_port->map_item)) {
|
|
Packit Service |
54dbc3 |
uint32_t port_count[255]; /* max ports is a uint8_t */
|
|
Packit Service |
54dbc3 |
osm_node_t *rem_node[255];
|
|
Packit Service |
54dbc3 |
uint32_t rem_node_count;
|
|
Packit Service |
54dbc3 |
uint32_t rem_count[255];
|
|
Packit Service |
54dbc3 |
osm_physp_t *p_physp;
|
|
Packit Service |
54dbc3 |
osm_physp_t *p_rem_physp;
|
|
Packit Service |
54dbc3 |
osm_node_t *p_rem_node;
|
|
Packit Service |
54dbc3 |
uint32_t port_min_count = 0xFFFFFFFF;
|
|
Packit Service |
54dbc3 |
uint32_t port_max_count = 0;
|
|
Packit Service |
54dbc3 |
uint32_t rem_min_count = 0xFFFFFFFF;
|
|
Packit Service |
54dbc3 |
uint32_t rem_max_count = 0;
|
|
Packit Service |
54dbc3 |
uint16_t min_lid_ho;
|
|
Packit Service |
54dbc3 |
uint16_t max_lid_ho;
|
|
Packit Service |
54dbc3 |
uint16_t lid_ho;
|
|
Packit Service |
54dbc3 |
uint8_t num_ports;
|
|
Packit Service |
54dbc3 |
unsigned int i;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* we only care about non-switches */
|
|
Packit Service |
54dbc3 |
if (osm_node_get_type(p_port->p_node) == IB_NODE_TYPE_SWITCH)
|
|
Packit Service |
54dbc3 |
continue;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
osm_port_get_lid_range_ho(p_port, &min_lid_ho, &max_lid_ho);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (min_lid_ho == 0 || max_lid_ho == 0)
|
|
Packit Service |
54dbc3 |
continue;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
memset(port_count, '\0', sizeof(uint32_t) * 255);
|
|
Packit Service |
54dbc3 |
memset(rem_node, '\0', sizeof(osm_node_t *) * 255);
|
|
Packit Service |
54dbc3 |
rem_node_count = 0;
|
|
Packit Service |
54dbc3 |
memset(rem_count, '\0', sizeof(uint32_t) * 255);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
for (lid_ho = min_lid_ho; lid_ho <= max_lid_ho; lid_ho++) {
|
|
Packit Service |
54dbc3 |
boolean_t rem_node_found = FALSE;
|
|
Packit Service |
54dbc3 |
unsigned int indx = 0;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
port_num = osm_switch_get_port_by_lid(p_sw, lid_ho,
|
|
Packit Service |
54dbc3 |
OSM_NEW_LFT);
|
|
Packit Service |
54dbc3 |
if (port_num == OSM_NO_PATH)
|
|
Packit Service |
54dbc3 |
continue;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_physp =
|
|
Packit Service |
54dbc3 |
osm_node_get_physp_ptr(p_sw->p_node, port_num);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* if port is down/unhealthy, can't calculate */
|
|
Packit Service |
54dbc3 |
if (!p_physp || !osm_physp_is_healthy(p_physp)
|
|
Packit Service |
54dbc3 |
|| !osm_physp_get_remote(p_physp))
|
|
Packit Service |
54dbc3 |
continue;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_rem_physp = osm_physp_get_remote(p_physp);
|
|
Packit Service |
54dbc3 |
p_rem_node = osm_physp_get_node_ptr(p_rem_physp);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* determine if we've seen this remote node before.
|
|
Packit Service |
54dbc3 |
* If not, store it. If yes, update the counter
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
for (i = 0; i < rem_node_count; i++) {
|
|
Packit Service |
54dbc3 |
if (rem_node[i] == p_rem_node) {
|
|
Packit Service |
54dbc3 |
rem_node_found = TRUE;
|
|
Packit Service |
54dbc3 |
indx = i;
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (!rem_node_found) {
|
|
Packit Service |
54dbc3 |
rem_node[rem_node_count] = p_rem_node;
|
|
Packit Service |
54dbc3 |
rem_count[rem_node_count]++;
|
|
Packit Service |
54dbc3 |
indx = rem_node_count;
|
|
Packit Service |
54dbc3 |
rem_node_count++;
|
|
Packit Service |
54dbc3 |
} else
|
|
Packit Service |
54dbc3 |
rem_count[indx]++;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
port_count[port_num]++;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (!rem_node_count)
|
|
Packit Service |
54dbc3 |
continue;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
for (i = 0; i < rem_node_count; i++) {
|
|
Packit Service |
54dbc3 |
if (rem_count[i] < rem_min_count)
|
|
Packit Service |
54dbc3 |
rem_min_count = rem_count[i];
|
|
Packit Service |
54dbc3 |
if (rem_count[i] > rem_max_count)
|
|
Packit Service |
54dbc3 |
rem_max_count = rem_count[i];
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
num_ports = p_sw->num_ports;
|
|
Packit Service |
54dbc3 |
for (i = 0; i < num_ports; i++) {
|
|
Packit Service |
54dbc3 |
if (!port_count[i])
|
|
Packit Service |
54dbc3 |
continue;
|
|
Packit Service |
54dbc3 |
if (port_count[i] < port_min_count)
|
|
Packit Service |
54dbc3 |
port_min_count = port_count[i];
|
|
Packit Service |
54dbc3 |
if (port_count[i] > port_max_count)
|
|
Packit Service |
54dbc3 |
port_max_count = port_count[i];
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* Output if this CA/router is being forwarded an unbalanced number of
|
|
Packit Service |
54dbc3 |
* times to a destination.
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
if ((rem_max_count - rem_min_count) > 1) {
|
|
Packit Service |
54dbc3 |
fprintf(out,
|
|
Packit Service |
54dbc3 |
"Unbalanced Remote Forwarding: Switch 0x%016"
|
|
Packit Service |
54dbc3 |
PRIx64 " (%s): ",
|
|
Packit Service |
54dbc3 |
cl_ntoh64(p_sw->p_node->node_info.node_guid),
|
|
Packit Service |
54dbc3 |
p_sw->p_node->print_desc);
|
|
Packit Service |
54dbc3 |
if (osm_node_get_type(p_port->p_node) ==
|
|
Packit Service |
54dbc3 |
IB_NODE_TYPE_CA)
|
|
Packit Service |
54dbc3 |
fprintf(out, "CA");
|
|
Packit Service |
54dbc3 |
else if (osm_node_get_type(p_port->p_node) ==
|
|
Packit Service |
54dbc3 |
IB_NODE_TYPE_ROUTER)
|
|
Packit Service |
54dbc3 |
fprintf(out, "Router");
|
|
Packit Service |
54dbc3 |
fprintf(out, " 0x%016" PRIx64 " (%s): ",
|
|
Packit Service |
54dbc3 |
cl_ntoh64(p_port->p_node->node_info.node_guid),
|
|
Packit Service |
54dbc3 |
p_port->p_node->print_desc);
|
|
Packit Service |
54dbc3 |
for (i = 0; i < rem_node_count; i++) {
|
|
Packit Service |
54dbc3 |
fprintf(out,
|
|
Packit Service |
54dbc3 |
"Dest 0x%016" PRIx64 "(%s) - %u ",
|
|
Packit Service |
54dbc3 |
cl_ntoh64(rem_node[i]->node_info.
|
|
Packit Service |
54dbc3 |
node_guid),
|
|
Packit Service |
54dbc3 |
rem_node[i]->print_desc, rem_count[i]);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
fprintf(out, "\n");
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* Output if this CA/router is being forwarded through a port
|
|
Packit Service |
54dbc3 |
* an unbalanced number of times.
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
if ((port_max_count - port_min_count) > 1) {
|
|
Packit Service |
54dbc3 |
fprintf(out,
|
|
Packit Service |
54dbc3 |
"Unbalanced Port Forwarding: Switch 0x%016"
|
|
Packit Service |
54dbc3 |
PRIx64 " (%s): ",
|
|
Packit Service |
54dbc3 |
cl_ntoh64(p_sw->p_node->node_info.node_guid),
|
|
Packit Service |
54dbc3 |
p_sw->p_node->print_desc);
|
|
Packit Service |
54dbc3 |
if (osm_node_get_type(p_port->p_node) ==
|
|
Packit Service |
54dbc3 |
IB_NODE_TYPE_CA)
|
|
Packit Service |
54dbc3 |
fprintf(out, "CA");
|
|
Packit Service |
54dbc3 |
else if (osm_node_get_type(p_port->p_node) ==
|
|
Packit Service |
54dbc3 |
IB_NODE_TYPE_ROUTER)
|
|
Packit Service |
54dbc3 |
fprintf(out, "Router");
|
|
Packit Service |
54dbc3 |
fprintf(out, " 0x%016" PRIx64 " (%s): ",
|
|
Packit Service |
54dbc3 |
cl_ntoh64(p_port->p_node->node_info.node_guid),
|
|
Packit Service |
54dbc3 |
p_port->p_node->print_desc);
|
|
Packit Service |
54dbc3 |
for (i = 0; i < num_ports; i++) {
|
|
Packit Service |
54dbc3 |
if (!port_count[i])
|
|
Packit Service |
54dbc3 |
continue;
|
|
Packit Service |
54dbc3 |
fprintf(out, "Port %u - %u: ", i,
|
|
Packit Service |
54dbc3 |
port_count[i]);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
fprintf(out, "\n");
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void lidbalance_parse(char **p_last, osm_opensm_t * p_osm, FILE * out)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
char *p_cmd;
|
|
Packit Service |
54dbc3 |
uint64_t guid = 0;
|
|
Packit Service |
54dbc3 |
osm_switch_t *p_sw;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_cmd = next_token(p_last);
|
|
Packit Service |
54dbc3 |
if (p_cmd) {
|
|
Packit Service |
54dbc3 |
char *p_end;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
guid = strtoull(p_cmd, &p_end, 0);
|
|
Packit Service |
54dbc3 |
if (!guid || *p_end != '\0') {
|
|
Packit Service |
54dbc3 |
fprintf(out, "Invalid switchguid specified\n");
|
|
Packit Service |
54dbc3 |
help_lidbalance(out, 1);
|
|
Packit Service |
54dbc3 |
return;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
cl_plock_acquire(&p_osm->lock);
|
|
Packit Service |
54dbc3 |
if (guid) {
|
|
Packit Service |
54dbc3 |
p_sw = osm_get_switch_by_guid(&p_osm->subn, cl_hton64(guid));
|
|
Packit Service |
54dbc3 |
if (!p_sw) {
|
|
Packit Service |
54dbc3 |
fprintf(out, "switchguid not found\n");
|
|
Packit Service |
54dbc3 |
goto lock_exit;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
lidbalance_check(p_osm, p_sw, out);
|
|
Packit Service |
54dbc3 |
} else {
|
|
Packit Service |
54dbc3 |
cl_qmap_t *p_sw_guid_tbl = &p_osm->subn.sw_guid_tbl;
|
|
Packit Service |
54dbc3 |
for (p_sw = (osm_switch_t *) cl_qmap_head(p_sw_guid_tbl);
|
|
Packit Service |
54dbc3 |
p_sw != (osm_switch_t *) cl_qmap_end(p_sw_guid_tbl);
|
|
Packit Service |
54dbc3 |
p_sw = (osm_switch_t *) cl_qmap_next(&p_sw->map_item))
|
|
Packit Service |
54dbc3 |
lidbalance_check(p_osm, p_sw, out);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
lock_exit:
|
|
Packit Service |
54dbc3 |
cl_plock_release(&p_osm->lock);
|
|
Packit Service |
54dbc3 |
return;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void dump_conf_parse(char **p_last, osm_opensm_t * p_osm, FILE * out)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
osm_subn_output_conf(out, &p_osm->subn.opt);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void update_desc_parse(char **p_last, osm_opensm_t * p_osm, FILE * out)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
osm_update_node_desc(p_osm);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
#ifdef ENABLE_OSM_PERF_MGR
|
|
Packit Service |
54dbc3 |
static monitored_node_t *find_node_by_name(osm_opensm_t * p_osm,
|
|
Packit Service |
54dbc3 |
char *nodename)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
cl_map_item_t *item;
|
|
Packit Service |
54dbc3 |
monitored_node_t *node;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
item = cl_qmap_head(&p_osm->perfmgr.monitored_map);
|
|
Packit Service |
54dbc3 |
while (item != cl_qmap_end(&p_osm->perfmgr.monitored_map)) {
|
|
Packit Service |
54dbc3 |
node = (monitored_node_t *)item;
|
|
Packit Service |
54dbc3 |
if (strcmp(node->name, nodename) == 0)
|
|
Packit Service |
54dbc3 |
return node;
|
|
Packit Service |
54dbc3 |
item = cl_qmap_next(item);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
return NULL;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static monitored_node_t *find_node_by_guid(osm_opensm_t * p_osm,
|
|
Packit Service |
54dbc3 |
uint64_t guid)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
cl_map_item_t *node;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
node = cl_qmap_get(&p_osm->perfmgr.monitored_map, guid);
|
|
Packit Service |
54dbc3 |
if (node != cl_qmap_end(&p_osm->perfmgr.monitored_map))
|
|
Packit Service |
54dbc3 |
return (monitored_node_t *)node;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
return NULL;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void dump_redir_entry(monitored_node_t *p_mon_node, FILE * out)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
int port, redir;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* only display monitored nodes with redirection info */
|
|
Packit Service |
54dbc3 |
redir = 0;
|
|
Packit Service |
54dbc3 |
for (port = (p_mon_node->esp0) ? 0 : 1;
|
|
Packit Service |
54dbc3 |
port < p_mon_node->num_ports; port++) {
|
|
Packit Service |
54dbc3 |
if (p_mon_node->port[port].redirection) {
|
|
Packit Service |
54dbc3 |
if (!redir) {
|
|
Packit Service |
54dbc3 |
fprintf(out, " Node GUID ESP0 Name\n");
|
|
Packit Service |
54dbc3 |
fprintf(out, " --------- ---- ----\n");
|
|
Packit Service |
54dbc3 |
fprintf(out, " 0x%" PRIx64 " %d %s\n",
|
|
Packit Service |
54dbc3 |
p_mon_node->guid, p_mon_node->esp0,
|
|
Packit Service |
54dbc3 |
p_mon_node->name);
|
|
Packit Service |
54dbc3 |
fprintf(out, "\n Port Valid LIDs PKey QP PKey Index\n");
|
|
Packit Service |
54dbc3 |
fprintf(out, " ---- ----- ---- ---- -- ----------\n");
|
|
Packit Service |
54dbc3 |
redir = 1;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
fprintf(out, " %d %d %u->%u 0x%x 0x%x %d\n",
|
|
Packit Service |
54dbc3 |
port, p_mon_node->port[port].valid,
|
|
Packit Service |
54dbc3 |
cl_ntoh16(p_mon_node->port[port].orig_lid),
|
|
Packit Service |
54dbc3 |
cl_ntoh16(p_mon_node->port[port].lid),
|
|
Packit Service |
54dbc3 |
cl_ntoh16(p_mon_node->port[port].pkey),
|
|
Packit Service |
54dbc3 |
cl_ntoh32(p_mon_node->port[port].qp),
|
|
Packit Service |
54dbc3 |
p_mon_node->port[port].pkey_ix);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
if (redir)
|
|
Packit Service |
54dbc3 |
fprintf(out, "\n");
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void dump_redir(osm_opensm_t * p_osm, char *nodename, FILE * out)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
monitored_node_t *p_mon_node;
|
|
Packit Service |
54dbc3 |
uint64_t guid;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (!p_osm->subn.opt.perfmgr_redir)
|
|
Packit Service |
54dbc3 |
fprintf(out, "Perfmgr redirection not enabled\n");
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
fprintf(out, "\nRedirection Table\n");
|
|
Packit Service |
54dbc3 |
fprintf(out, "-----------------\n");
|
|
Packit Service |
54dbc3 |
cl_plock_acquire(&p_osm->lock);
|
|
Packit Service |
54dbc3 |
if (nodename) {
|
|
Packit Service |
54dbc3 |
guid = strtoull(nodename, NULL, 0);
|
|
Packit Service |
54dbc3 |
if (guid == 0 && errno)
|
|
Packit Service |
54dbc3 |
p_mon_node = find_node_by_name(p_osm, nodename);
|
|
Packit Service |
54dbc3 |
else
|
|
Packit Service |
54dbc3 |
p_mon_node = find_node_by_guid(p_osm, guid);
|
|
Packit Service |
54dbc3 |
if (p_mon_node)
|
|
Packit Service |
54dbc3 |
dump_redir_entry(p_mon_node, out);
|
|
Packit Service |
54dbc3 |
else {
|
|
Packit Service |
54dbc3 |
if (guid == 0 && errno)
|
|
Packit Service |
54dbc3 |
fprintf(out, "Node %s not found...\n", nodename);
|
|
Packit Service |
54dbc3 |
else
|
|
Packit Service |
54dbc3 |
fprintf(out, "Node 0x%" PRIx64 " not found...\n", guid);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
} else {
|
|
Packit Service |
54dbc3 |
p_mon_node = (monitored_node_t *) cl_qmap_head(&p_osm->perfmgr.monitored_map);
|
|
Packit Service |
54dbc3 |
while (p_mon_node != (monitored_node_t *) cl_qmap_end(&p_osm->perfmgr.monitored_map)) {
|
|
Packit Service |
54dbc3 |
dump_redir_entry(p_mon_node, out);
|
|
Packit Service |
54dbc3 |
p_mon_node = (monitored_node_t *) cl_qmap_next((const cl_map_item_t *)p_mon_node);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
cl_plock_release(&p_osm->lock);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void clear_redir_entry(monitored_node_t *p_mon_node)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
int port;
|
|
Packit Service |
54dbc3 |
ib_net16_t orig_lid;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
for (port = (p_mon_node->esp0) ? 0 : 1;
|
|
Packit Service |
54dbc3 |
port < p_mon_node->num_ports; port++) {
|
|
Packit Service |
54dbc3 |
if (p_mon_node->port[port].redirection) {
|
|
Packit Service |
54dbc3 |
orig_lid = p_mon_node->port[port].orig_lid;
|
|
Packit Service |
54dbc3 |
memset(&p_mon_node->port[port], 0,
|
|
Packit Service |
54dbc3 |
sizeof(monitored_port_t));
|
|
Packit Service |
54dbc3 |
p_mon_node->port[port].valid = TRUE;
|
|
Packit Service |
54dbc3 |
p_mon_node->port[port].orig_lid = orig_lid;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void clear_redir(osm_opensm_t * p_osm, char *nodename, FILE * out)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
monitored_node_t *p_mon_node;
|
|
Packit Service |
54dbc3 |
uint64_t guid;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (!p_osm->subn.opt.perfmgr_redir)
|
|
Packit Service |
54dbc3 |
fprintf(out, "Perfmgr redirection not enabled\n");
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
cl_plock_acquire(&p_osm->lock);
|
|
Packit Service |
54dbc3 |
if (nodename) {
|
|
Packit Service |
54dbc3 |
guid = strtoull(nodename, NULL, 0);
|
|
Packit Service |
54dbc3 |
if (guid == 0 && errno)
|
|
Packit Service |
54dbc3 |
p_mon_node = find_node_by_name(p_osm, nodename);
|
|
Packit Service |
54dbc3 |
else
|
|
Packit Service |
54dbc3 |
p_mon_node = find_node_by_guid(p_osm, guid);
|
|
Packit Service |
54dbc3 |
if (p_mon_node)
|
|
Packit Service |
54dbc3 |
clear_redir_entry(p_mon_node);
|
|
Packit Service |
54dbc3 |
else {
|
|
Packit Service |
54dbc3 |
if (guid == 0 && errno)
|
|
Packit Service |
54dbc3 |
fprintf(out, "Node %s not found...\n", nodename);
|
|
Packit Service |
54dbc3 |
else
|
|
Packit Service |
54dbc3 |
fprintf(out, "Node 0x%" PRIx64 " not found...\n", guid);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
} else {
|
|
Packit Service |
54dbc3 |
p_mon_node = (monitored_node_t *) cl_qmap_head(&p_osm->perfmgr.monitored_map);
|
|
Packit Service |
54dbc3 |
while (p_mon_node != (monitored_node_t *) cl_qmap_end(&p_osm->perfmgr.monitored_map)) {
|
|
Packit Service |
54dbc3 |
clear_redir_entry(p_mon_node);
|
|
Packit Service |
54dbc3 |
p_mon_node = (monitored_node_t *) cl_qmap_next((const cl_map_item_t *)p_mon_node);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
cl_plock_release(&p_osm->lock);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void perfmgr_parse(char **p_last, osm_opensm_t * p_osm, FILE * out)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
char *p_cmd;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_cmd = next_token(p_last);
|
|
Packit Service |
54dbc3 |
if (p_cmd) {
|
|
Packit Service |
54dbc3 |
if (strcmp(p_cmd, "enable") == 0) {
|
|
Packit Service |
54dbc3 |
osm_perfmgr_set_state(&p_osm->perfmgr,
|
|
Packit Service |
54dbc3 |
PERFMGR_STATE_ENABLED);
|
|
Packit Service |
54dbc3 |
} else if (strcmp(p_cmd, "disable") == 0) {
|
|
Packit Service |
54dbc3 |
osm_perfmgr_set_state(&p_osm->perfmgr,
|
|
Packit Service |
54dbc3 |
PERFMGR_STATE_DISABLE);
|
|
Packit Service |
54dbc3 |
} else if (strcmp(p_cmd, "clear_counters") == 0) {
|
|
Packit Service |
54dbc3 |
osm_perfmgr_clear_counters(&p_osm->perfmgr);
|
|
Packit Service |
54dbc3 |
} else if (strcmp(p_cmd, "set_rm_nodes") == 0) {
|
|
Packit Service |
54dbc3 |
osm_perfmgr_set_rm_nodes(&p_osm->perfmgr, 1);
|
|
Packit Service |
54dbc3 |
} else if (strcmp(p_cmd, "clear_rm_nodes") == 0) {
|
|
Packit Service |
54dbc3 |
osm_perfmgr_set_rm_nodes(&p_osm->perfmgr, 0);
|
|
Packit Service |
54dbc3 |
} else if (strcmp(p_cmd, "set_query_cpi") == 0) {
|
|
Packit Service |
54dbc3 |
osm_perfmgr_set_query_cpi(&p_osm->perfmgr, 1);
|
|
Packit Service |
54dbc3 |
} else if (strcmp(p_cmd, "clear_query_cpi") == 0) {
|
|
Packit Service |
54dbc3 |
osm_perfmgr_set_query_cpi(&p_osm->perfmgr, 0);
|
|
Packit Service |
54dbc3 |
} else if (strcmp(p_cmd, "dump_counters") == 0) {
|
|
Packit Service |
54dbc3 |
p_cmd = next_token(p_last);
|
|
Packit Service |
54dbc3 |
if (p_cmd && (strcmp(p_cmd, "mach") == 0)) {
|
|
Packit Service |
54dbc3 |
osm_perfmgr_dump_counters(&p_osm->perfmgr,
|
|
Packit Service |
54dbc3 |
PERFMGR_EVENT_DB_DUMP_MR);
|
|
Packit Service |
54dbc3 |
} else {
|
|
Packit Service |
54dbc3 |
osm_perfmgr_dump_counters(&p_osm->perfmgr,
|
|
Packit Service |
54dbc3 |
PERFMGR_EVENT_DB_DUMP_HR);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
} else if (strcmp(p_cmd, "clear_inactive") == 0) {
|
|
Packit Service |
54dbc3 |
unsigned cnt = osm_perfmgr_delete_inactive(&p_osm->perfmgr);
|
|
Packit Service |
54dbc3 |
fprintf(out, "Removed %u nodes from Database\n", cnt);
|
|
Packit Service |
54dbc3 |
} else if (strcmp(p_cmd, "print_counters") == 0 ||
|
|
Packit Service |
54dbc3 |
strcmp(p_cmd, "pc") == 0) {
|
|
Packit Service |
54dbc3 |
char *port = NULL;
|
|
Packit Service |
54dbc3 |
p_cmd = name_token(p_last);
|
|
Packit Service |
54dbc3 |
if (p_cmd) {
|
|
Packit Service |
54dbc3 |
port = strchr(p_cmd, ':');
|
|
Packit Service |
54dbc3 |
if (port) {
|
|
Packit Service |
54dbc3 |
*port = '\0';
|
|
Packit Service |
54dbc3 |
port++;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
osm_perfmgr_print_counters(&p_osm->perfmgr, p_cmd,
|
|
Packit Service |
54dbc3 |
out, port, 0);
|
|
Packit Service |
54dbc3 |
} else if (strcmp(p_cmd, "print_errors") == 0 ||
|
|
Packit Service |
54dbc3 |
strcmp(p_cmd, "pe") == 0) {
|
|
Packit Service |
54dbc3 |
p_cmd = name_token(p_last);
|
|
Packit Service |
54dbc3 |
osm_perfmgr_print_counters(&p_osm->perfmgr, p_cmd,
|
|
Packit Service |
54dbc3 |
out, NULL, 1);
|
|
Packit Service |
54dbc3 |
} else if (strcmp(p_cmd, "dump_redir") == 0) {
|
|
Packit Service |
54dbc3 |
p_cmd = name_token(p_last);
|
|
Packit Service |
54dbc3 |
dump_redir(p_osm, p_cmd, out);
|
|
Packit Service |
54dbc3 |
} else if (strcmp(p_cmd, "clear_redir") == 0) {
|
|
Packit Service |
54dbc3 |
p_cmd = name_token(p_last);
|
|
Packit Service |
54dbc3 |
clear_redir(p_osm, p_cmd, out);
|
|
Packit Service |
54dbc3 |
} else if (strcmp(p_cmd, "sweep_time") == 0) {
|
|
Packit Service |
54dbc3 |
p_cmd = next_token(p_last);
|
|
Packit Service |
54dbc3 |
if (p_cmd) {
|
|
Packit Service |
54dbc3 |
uint16_t time_s = atoi(p_cmd);
|
|
Packit Service |
54dbc3 |
if (time_s < 1)
|
|
Packit Service |
54dbc3 |
fprintf(out,
|
|
Packit Service |
54dbc3 |
"sweep_time requires a "
|
|
Packit Service |
54dbc3 |
"positive time period "
|
|
Packit Service |
54dbc3 |
"(in seconds) to be "
|
|
Packit Service |
54dbc3 |
"specified\n");
|
|
Packit Service |
54dbc3 |
else
|
|
Packit Service |
54dbc3 |
osm_perfmgr_set_sweep_time_s(
|
|
Packit Service |
54dbc3 |
&p_osm->perfmgr,
|
|
Packit Service |
54dbc3 |
time_s);
|
|
Packit Service |
54dbc3 |
} else {
|
|
Packit Service |
54dbc3 |
fprintf(out,
|
|
Packit Service |
54dbc3 |
"sweep_time requires a time period "
|
|
Packit Service |
54dbc3 |
"(in seconds) to be specified\n");
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
} else if (strcmp(p_cmd, "sweep") == 0) {
|
|
Packit Service |
54dbc3 |
osm_sm_signal(&p_osm->sm, OSM_SIGNAL_PERFMGR_SWEEP);
|
|
Packit Service |
54dbc3 |
fprintf(out, "sweep initiated...\n");
|
|
Packit Service |
54dbc3 |
} else {
|
|
Packit Service |
54dbc3 |
fprintf(out, "\"%s\" option not found\n", p_cmd);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
} else {
|
|
Packit Service |
54dbc3 |
fprintf(out, "Performance Manager status:\n"
|
|
Packit Service |
54dbc3 |
"state : %s\n"
|
|
Packit Service |
54dbc3 |
"sweep state : %s\n"
|
|
Packit Service |
54dbc3 |
"sweep time : %us\n"
|
|
Packit Service |
54dbc3 |
"outstanding queries/max : %d/%u\n"
|
|
Packit Service |
54dbc3 |
"remove missing nodes from DB : %s\n"
|
|
Packit Service |
54dbc3 |
"query ClassPortInfo : %s\n",
|
|
Packit Service |
54dbc3 |
osm_perfmgr_get_state_str(&p_osm->perfmgr),
|
|
Packit Service |
54dbc3 |
osm_perfmgr_get_sweep_state_str(&p_osm->perfmgr),
|
|
Packit Service |
54dbc3 |
osm_perfmgr_get_sweep_time_s(&p_osm->perfmgr),
|
|
Packit Service |
54dbc3 |
p_osm->perfmgr.outstanding_queries,
|
|
Packit Service |
54dbc3 |
p_osm->perfmgr.max_outstanding_queries,
|
|
Packit Service |
54dbc3 |
osm_perfmgr_get_rm_nodes(&p_osm->perfmgr)
|
|
Packit Service |
54dbc3 |
? "TRUE" : "FALSE",
|
|
Packit Service |
54dbc3 |
osm_perfmgr_get_query_cpi(&p_osm->perfmgr)
|
|
Packit Service |
54dbc3 |
? "TRUE" : "FALSE");
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
#endif /* ENABLE_OSM_PERF_MGR */
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void quit_parse(char **p_last, osm_opensm_t * p_osm, FILE * out)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
cio_close(&p_osm->console, &p_osm->log);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void help_version(FILE * out, int detail)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
fprintf(out, "version -- print the OSM version\n");
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void version_parse(char **p_last, osm_opensm_t * p_osm, FILE * out)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
fprintf(out, "%s build %s %s\n", p_osm->osm_version, __DATE__, __TIME__);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* more parse routines go here */
|
|
Packit Service |
54dbc3 |
typedef struct _regexp_list {
|
|
Packit Service |
54dbc3 |
regex_t exp;
|
|
Packit Service |
54dbc3 |
struct _regexp_list *next;
|
|
Packit Service |
54dbc3 |
} regexp_list_t;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void dump_portguid_parse(char **p_last, osm_opensm_t * p_osm, FILE * out)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
cl_qmap_t *p_alias_port_guid_tbl;
|
|
Packit Service |
54dbc3 |
osm_alias_guid_t *p_alias_guid, *p_next_alias_guid;
|
|
Packit Service |
54dbc3 |
regexp_list_t *p_regexp, *p_head_regexp = NULL;
|
|
Packit Service |
54dbc3 |
FILE *output = out;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
while (1) {
|
|
Packit Service |
54dbc3 |
char *p_cmd = next_token(p_last);
|
|
Packit Service |
54dbc3 |
if (!p_cmd)
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (strcmp(p_cmd, "file") == 0) {
|
|
Packit Service |
54dbc3 |
p_cmd = next_token(p_last);
|
|
Packit Service |
54dbc3 |
if (p_cmd) {
|
|
Packit Service |
54dbc3 |
if (output != out)
|
|
Packit Service |
54dbc3 |
fclose(output);
|
|
Packit Service |
54dbc3 |
output = fopen(p_cmd, "w+");
|
|
Packit Service |
54dbc3 |
if (output == NULL) {
|
|
Packit Service |
54dbc3 |
fprintf(out,
|
|
Packit Service |
54dbc3 |
"Could not open file %s: %s\n",
|
|
Packit Service |
54dbc3 |
p_cmd, strerror(errno));
|
|
Packit Service |
54dbc3 |
output = out;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
} else
|
|
Packit Service |
54dbc3 |
fprintf(out, "No file name passed\n");
|
|
Packit Service |
54dbc3 |
} else if (!(p_regexp = malloc(sizeof(*p_regexp)))) {
|
|
Packit Service |
54dbc3 |
fprintf(out, "No memory\n");
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
} else if (regcomp(&p_regexp->exp, p_cmd,
|
|
Packit Service |
54dbc3 |
REG_NOSUB | REG_EXTENDED) != 0) {
|
|
Packit Service |
54dbc3 |
fprintf(out, "Cannot parse regular expression \'%s\'."
|
|
Packit Service |
54dbc3 |
" Skipping\n", p_cmd);
|
|
Packit Service |
54dbc3 |
free(p_regexp);
|
|
Packit Service |
54dbc3 |
continue;
|
|
Packit Service |
54dbc3 |
} else {
|
|
Packit Service |
54dbc3 |
p_regexp->next = p_head_regexp;
|
|
Packit Service |
54dbc3 |
p_head_regexp = p_regexp;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* Check we have at least one expression to match */
|
|
Packit Service |
54dbc3 |
if (p_head_regexp == NULL) {
|
|
Packit Service |
54dbc3 |
fprintf(out, "No valid expression provided. Aborting\n");
|
|
Packit Service |
54dbc3 |
goto Exit;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (p_osm->sm.p_subn->need_update != 0) {
|
|
Packit Service |
54dbc3 |
fprintf(out, "Subnet is not ready yet. Try again later\n");
|
|
Packit Service |
54dbc3 |
goto Free_and_exit;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* Subnet doesn't need to be updated so we can carry on */
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_alias_port_guid_tbl = &(p_osm->sm.p_subn->alias_port_guid_tbl);
|
|
Packit Service |
54dbc3 |
CL_PLOCK_ACQUIRE(p_osm->sm.p_lock);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_next_alias_guid = (osm_alias_guid_t *) cl_qmap_head(p_alias_port_guid_tbl);
|
|
Packit Service |
54dbc3 |
while (p_next_alias_guid != (osm_alias_guid_t *) cl_qmap_end(p_alias_port_guid_tbl)) {
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_alias_guid = p_next_alias_guid;
|
|
Packit Service |
54dbc3 |
p_next_alias_guid =
|
|
Packit Service |
54dbc3 |
(osm_alias_guid_t *) cl_qmap_next(&p_next_alias_guid->map_item);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
for (p_regexp = p_head_regexp; p_regexp != NULL;
|
|
Packit Service |
54dbc3 |
p_regexp = p_regexp->next)
|
|
Packit Service |
54dbc3 |
if (regexec(&p_regexp->exp,
|
|
Packit Service |
54dbc3 |
p_alias_guid->p_base_port->p_node->print_desc,
|
|
Packit Service |
54dbc3 |
0, NULL, 0) == 0) {
|
|
Packit Service |
54dbc3 |
fprintf(output, "0x%" PRIxLEAST64 "\n",
|
|
Packit Service |
54dbc3 |
cl_ntoh64(p_alias_guid->alias_guid));
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
CL_PLOCK_RELEASE(p_osm->sm.p_lock);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
Free_and_exit:
|
|
Packit Service |
54dbc3 |
for (; p_head_regexp; p_head_regexp = p_regexp) {
|
|
Packit Service |
54dbc3 |
p_regexp = p_head_regexp->next;
|
|
Packit Service |
54dbc3 |
regfree(&p_head_regexp->exp);
|
|
Packit Service |
54dbc3 |
free(p_head_regexp);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
Exit:
|
|
Packit Service |
54dbc3 |
if (output != out)
|
|
Packit Service |
54dbc3 |
fclose(output);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void help_dump_portguid(FILE * out, int detail)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
fprintf(out,
|
|
Packit Service |
54dbc3 |
"dump_portguid [file filename] regexp1 [regexp2 [regexp3 ...]] -- Dump port GUID matching a regexp \n");
|
|
Packit Service |
54dbc3 |
if (detail) {
|
|
Packit Service |
54dbc3 |
fprintf(out,
|
|
Packit Service |
54dbc3 |
"getguidgetguid -- Dump all the port GUID whom node_desc matches one of the provided regexp\n");
|
|
Packit Service |
54dbc3 |
fprintf(out,
|
|
Packit Service |
54dbc3 |
" [file filename] -- Send the port GUID list to the specified file instead of regular output\n");
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static const struct command console_cmds[] = {
|
|
Packit Service |
54dbc3 |
{"help", &help_command, &help_parse},
|
|
Packit Service |
54dbc3 |
{"quit", &help_quit, &quit_parse},
|
|
Packit Service |
54dbc3 |
{"loglevel", &help_loglevel, &loglevel_parse},
|
|
Packit Service |
54dbc3 |
{"permodlog", &help_permodlog, &permodlog_parse},
|
|
Packit Service |
54dbc3 |
{"priority", &help_priority, &priority_parse},
|
|
Packit Service |
54dbc3 |
{"resweep", &help_resweep, &resweep_parse},
|
|
Packit Service |
54dbc3 |
{"reroute", &help_reroute, &reroute_parse},
|
|
Packit Service |
54dbc3 |
{"sweep", &help_sweep, &sweep_parse},
|
|
Packit Service |
54dbc3 |
{"status", &help_status, &status_parse},
|
|
Packit Service |
54dbc3 |
{"logflush", &help_logflush, &logflush_parse},
|
|
Packit Service |
54dbc3 |
{"querylid", &help_querylid, &querylid_parse},
|
|
Packit Service |
54dbc3 |
{"portstatus", &help_portstatus, &portstatus_parse},
|
|
Packit Service |
54dbc3 |
{"switchbalance", &help_switchbalance, &switchbalance_parse},
|
|
Packit Service |
54dbc3 |
{"lidbalance", &help_lidbalance, &lidbalance_parse},
|
|
Packit Service |
54dbc3 |
{"dump_conf", &help_dump_conf, &dump_conf_parse},
|
|
Packit Service |
54dbc3 |
{"update_desc", &help_update_desc, &update_desc_parse},
|
|
Packit Service |
54dbc3 |
{"version", &help_version, &version_parse},
|
|
Packit Service |
54dbc3 |
#ifdef ENABLE_OSM_PERF_MGR
|
|
Packit Service |
54dbc3 |
{"perfmgr", &help_perfmgr, &perfmgr_parse},
|
|
Packit Service |
54dbc3 |
{"pm", &help_pm, &perfmgr_parse},
|
|
Packit Service |
54dbc3 |
#endif /* ENABLE_OSM_PERF_MGR */
|
|
Packit Service |
54dbc3 |
{"dump_portguid", &help_dump_portguid, &dump_portguid_parse},
|
|
Packit Service |
54dbc3 |
{NULL, NULL, NULL} /* end of array */
|
|
Packit Service |
54dbc3 |
};
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void parse_cmd_line(char *line, osm_opensm_t * p_osm)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
char *p_cmd, *p_last;
|
|
Packit Service |
54dbc3 |
int i, found = 0;
|
|
Packit Service |
54dbc3 |
FILE *out = p_osm->console.out;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
while (isspace(*line))
|
|
Packit Service |
54dbc3 |
line++;
|
|
Packit Service |
54dbc3 |
if (!*line)
|
|
Packit Service |
54dbc3 |
return;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* find first token which is the command */
|
|
Packit Service |
54dbc3 |
p_cmd = strtok_r(line, " \t\n\r", &p_last);
|
|
Packit Service |
54dbc3 |
if (p_cmd) {
|
|
Packit Service |
54dbc3 |
for (i = 0; console_cmds[i].name; i++) {
|
|
Packit Service |
54dbc3 |
if (loop_command.on) {
|
|
Packit Service |
54dbc3 |
if (!strcmp(p_cmd, "q")) {
|
|
Packit Service |
54dbc3 |
loop_command.on = 0;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
found = 1;
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
if (!strcmp(p_cmd, console_cmds[i].name)) {
|
|
Packit Service |
54dbc3 |
found = 1;
|
|
Packit Service |
54dbc3 |
console_cmds[i].parse_function(&p_last, p_osm,
|
|
Packit Service |
54dbc3 |
out);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
if (!found) {
|
|
Packit Service |
54dbc3 |
fprintf(out, "%s : Command not found\n\n", p_cmd);
|
|
Packit Service |
54dbc3 |
help_command(out, 0);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
} else {
|
|
Packit Service |
54dbc3 |
fprintf(out, "Error parsing command line: `%s'\n", line);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
if (loop_command.on) {
|
|
Packit Service |
54dbc3 |
fprintf(out, "use \"q<ret>\" to quit loop\n");
|
|
Packit Service |
54dbc3 |
fflush(out);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
int osm_console(osm_opensm_t * p_osm)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
struct pollfd pollfd[2];
|
|
Packit Service |
54dbc3 |
char *p_line;
|
|
Packit Service |
54dbc3 |
size_t len;
|
|
Packit Service |
54dbc3 |
ssize_t n;
|
|
Packit Service |
54dbc3 |
struct pollfd *fds;
|
|
Packit Service |
54dbc3 |
nfds_t nfds;
|
|
Packit Service |
54dbc3 |
osm_console_t *p_oct = &p_osm->console;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
pollfd[0].fd = p_oct->socket;
|
|
Packit Service |
54dbc3 |
pollfd[0].events = POLLIN;
|
|
Packit Service |
54dbc3 |
pollfd[0].revents = 0;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
pollfd[1].fd = p_oct->in_fd;
|
|
Packit Service |
54dbc3 |
pollfd[1].events = POLLIN;
|
|
Packit Service |
54dbc3 |
pollfd[1].revents = 0;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
fds = p_oct->socket < 0 ? &pollfd[1] : pollfd;
|
|
Packit Service |
54dbc3 |
nfds = p_oct->socket < 0 || pollfd[1].fd < 0 ? 1 : 2;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (loop_command.on && loop_command_check_time() &&
|
|
Packit Service |
54dbc3 |
loop_command.loop_function) {
|
|
Packit Service |
54dbc3 |
if (p_oct->out) {
|
|
Packit Service |
54dbc3 |
loop_command.loop_function(p_osm, p_oct->out);
|
|
Packit Service |
54dbc3 |
fflush(p_oct->out);
|
|
Packit Service |
54dbc3 |
} else {
|
|
Packit Service |
54dbc3 |
loop_command.on = 0;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (poll(fds, nfds, 1000) <= 0)
|
|
Packit Service |
54dbc3 |
return 0;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
#ifdef ENABLE_OSM_CONSOLE_LOOPBACK
|
|
Packit Service |
54dbc3 |
if (pollfd[0].revents & POLLIN) {
|
|
Packit Service |
54dbc3 |
int new_fd = 0;
|
|
Packit Service |
54dbc3 |
struct sockaddr_in sin;
|
|
Packit Service |
54dbc3 |
socklen_t len = sizeof(sin);
|
|
Packit Service |
54dbc3 |
struct hostent *hent;
|
|
Packit Service |
54dbc3 |
if ((new_fd = accept(p_oct->socket, &sin, &len)) < 0) {
|
|
Packit Service |
54dbc3 |
OSM_LOG(&p_osm->log, OSM_LOG_ERROR,
|
|
Packit Service |
54dbc3 |
"ERR 4B04: Failed to accept console socket: %s\n",
|
|
Packit Service |
54dbc3 |
strerror(errno));
|
|
Packit Service |
54dbc3 |
p_oct->in_fd = -1;
|
|
Packit Service |
54dbc3 |
return 0;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
if (inet_ntop
|
|
Packit Service |
54dbc3 |
(AF_INET, &sin.sin_addr, p_oct->client_ip,
|
|
Packit Service |
54dbc3 |
sizeof(p_oct->client_ip)) == NULL) {
|
|
Packit Service |
54dbc3 |
snprintf(p_oct->client_ip, sizeof(p_oct->client_ip),
|
|
Packit Service |
54dbc3 |
"STRING_UNKNOWN");
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
if ((hent = gethostbyaddr((const char *)&sin.sin_addr,
|
|
Packit Service |
54dbc3 |
sizeof(struct in_addr),
|
|
Packit Service |
54dbc3 |
AF_INET)) == NULL) {
|
|
Packit Service |
54dbc3 |
snprintf(p_oct->client_hn, sizeof(p_oct->client_hn),
|
|
Packit Service |
54dbc3 |
"STRING_UNKNOWN");
|
|
Packit Service |
54dbc3 |
} else {
|
|
Packit Service |
54dbc3 |
snprintf(p_oct->client_hn, sizeof(p_oct->client_hn),
|
|
Packit Service |
54dbc3 |
"%s", hent->h_name);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
if (is_authorized(p_oct)) {
|
|
Packit Service |
54dbc3 |
cio_open(p_oct, new_fd, &p_osm->log);
|
|
Packit Service |
54dbc3 |
} else {
|
|
Packit Service |
54dbc3 |
OSM_LOG(&p_osm->log, OSM_LOG_ERROR,
|
|
Packit Service |
54dbc3 |
"ERR 4B05: Console connection denied: %s (%s)\n",
|
|
Packit Service |
54dbc3 |
p_oct->client_hn, p_oct->client_ip);
|
|
Packit Service |
54dbc3 |
close(new_fd);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
return 0;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
#endif
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (pollfd[1].revents & POLLIN) {
|
|
Packit Service |
54dbc3 |
p_line = NULL;
|
|
Packit Service |
54dbc3 |
/* Get input line */
|
|
Packit Service |
54dbc3 |
n = getline(&p_line, &len, p_oct->in);
|
|
Packit Service |
54dbc3 |
if (n > 0) {
|
|
Packit Service |
54dbc3 |
/* Parse and act on input */
|
|
Packit Service |
54dbc3 |
parse_cmd_line(p_line, p_osm);
|
|
Packit Service |
54dbc3 |
if (!loop_command.on) {
|
|
Packit Service |
54dbc3 |
osm_console_prompt(p_oct->out);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
} else
|
|
Packit Service |
54dbc3 |
cio_close(p_oct, &p_osm->log);
|
|
Packit Service |
54dbc3 |
if (p_line)
|
|
Packit Service |
54dbc3 |
free(p_line);
|
|
Packit Service |
54dbc3 |
return 0;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
/* input fd is closed (hanged up) */
|
|
Packit Service |
54dbc3 |
if (pollfd[1].revents & POLLHUP) {
|
|
Packit Service |
54dbc3 |
#ifdef ENABLE_OSM_CONSOLE_LOOPBACK
|
|
Packit Service |
54dbc3 |
/* If we are using a socket, we close the current connection */
|
|
Packit Service |
54dbc3 |
if (p_oct->socket >= 0) {
|
|
Packit Service |
54dbc3 |
cio_close(p_oct, &p_osm->log);
|
|
Packit Service |
54dbc3 |
return 0;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
#endif
|
|
Packit Service |
54dbc3 |
/* If we use a local console, stdin is closed (most probable is pipe ended)
|
|
Packit Service |
54dbc3 |
* so we close the local console */
|
|
Packit Service |
54dbc3 |
return -1;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
return 0;
|
|
Packit Service |
54dbc3 |
}
|