|
Packit |
db064d |
#!/usr/bin/perl
|
|
Packit |
db064d |
#
|
|
Packit |
db064d |
# Copyright (c) 2007-2008 Voltaire, Inc. All rights reserved.
|
|
Packit |
db064d |
# Copyright (c) 2006 The Regents of the University of California.
|
|
Packit |
db064d |
#
|
|
Packit |
db064d |
# This software is available to you under a choice of one of two
|
|
Packit |
db064d |
# licenses. You may choose to be licensed under the terms of the GNU
|
|
Packit |
db064d |
# General Public License (GPL) Version 2, available from the file
|
|
Packit |
db064d |
# COPYING in the main directory of this source tree, or the
|
|
Packit |
db064d |
# OpenIB.org BSD license below:
|
|
Packit |
db064d |
#
|
|
Packit |
db064d |
# Redistribution and use in source and binary forms, with or
|
|
Packit |
db064d |
# without modification, are permitted provided that the following
|
|
Packit |
db064d |
# conditions are met:
|
|
Packit |
db064d |
#
|
|
Packit |
db064d |
# - Redistributions of source code must retain the above
|
|
Packit |
db064d |
# copyright notice, this list of conditions and the following
|
|
Packit |
db064d |
# disclaimer.
|
|
Packit |
db064d |
#
|
|
Packit |
db064d |
# - Redistributions in binary form must reproduce the above
|
|
Packit |
db064d |
# copyright notice, this list of conditions and the following
|
|
Packit |
db064d |
# disclaimer in the documentation and/or other materials
|
|
Packit |
db064d |
# provided with the distribution.
|
|
Packit |
db064d |
#
|
|
Packit |
db064d |
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
Packit |
db064d |
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
Packit |
db064d |
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
Packit |
db064d |
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
Packit |
db064d |
# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
Packit |
db064d |
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
Packit |
db064d |
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
Packit |
db064d |
# SOFTWARE.
|
|
Packit |
db064d |
#
|
|
Packit |
db064d |
|
|
Packit |
db064d |
use strict;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
use Getopt::Std;
|
|
Packit |
db064d |
use IBswcountlimits;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
my $return_code = 0;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
sub usage_and_exit
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
my $prog = $_[0];
|
|
Packit |
db064d |
print "Usage: $prog [-Rh]\n";
|
|
Packit |
db064d |
print
|
|
Packit |
db064d |
" Validate LIDs and GUIDs (check for zero and duplicates) in the local subnet\n";
|
|
Packit |
db064d |
print " -h This help message\n";
|
|
Packit |
db064d |
print
|
|
Packit |
db064d |
" -R Recalculate ibnetdiscover information (Default is to reuse ibnetdiscover output)\n";
|
|
Packit |
db064d |
print " -C <ca_name> use selected Channel Adaptor name for queries\n";
|
|
Packit |
db064d |
print " -P <ca_port> use selected channel adaptor port for queries\n";
|
|
Packit |
db064d |
exit 2;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
my $argv0 = `basename $0`;
|
|
Packit |
db064d |
my $regenerate_map = undef;
|
|
Packit |
db064d |
my $ca_name = "";
|
|
Packit |
db064d |
my $ca_port = "";
|
|
Packit |
db064d |
|
|
Packit |
db064d |
chomp $argv0;
|
|
Packit |
db064d |
if (!getopts("hRC:P:")) { usage_and_exit $argv0; }
|
|
Packit |
db064d |
if (defined $Getopt::Std::opt_h) { usage_and_exit $argv0; }
|
|
Packit |
db064d |
if (defined $Getopt::Std::opt_R) { $regenerate_map = $Getopt::Std::opt_R; }
|
|
Packit |
db064d |
if (defined $Getopt::Std::opt_C) { $ca_name = $Getopt::Std::opt_C; }
|
|
Packit |
db064d |
if (defined $Getopt::Std::opt_P) { $ca_port = $Getopt::Std::opt_P; }
|
|
Packit |
db064d |
|
|
Packit |
db064d |
sub validate_non_zero_lid
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
my ($lid) = shift(@_);
|
|
Packit |
db064d |
my ($nodeguid) = shift(@_);
|
|
Packit |
db064d |
my ($nodetype) = shift(@_);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if ($lid eq 0) {
|
|
Packit |
db064d |
print "LID 0 found for $nodetype NodeGUID $nodeguid\n";
|
|
Packit |
db064d |
return 1;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
return 0;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
sub validate_non_zero_guid
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
my ($lid) = shift(@_);
|
|
Packit |
db064d |
my ($guid) = shift(@_);
|
|
Packit |
db064d |
my ($nodetype) = shift(@_);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if ($guid eq 0x0) {
|
|
Packit |
db064d |
print "$nodetype GUID 0x0 found with LID $lid\n";
|
|
Packit |
db064d |
return 1;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
return 0;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
$insert_lid::lids = undef;
|
|
Packit |
db064d |
$insert_nodeguid::nodeguids = undef;
|
|
Packit |
db064d |
$insert_portguid::portguids = undef;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
sub insert_lid
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
my ($lid) = shift(@_);
|
|
Packit |
db064d |
my ($nodeguid) = shift(@_);
|
|
Packit |
db064d |
my ($nodetype) = shift(@_);
|
|
Packit |
db064d |
my $rec = undef;
|
|
Packit |
db064d |
my $status = "";
|
|
Packit |
db064d |
|
|
Packit |
db064d |
$status = validate_non_zero_lid($lid, $nodeguid, $nodetype);
|
|
Packit |
db064d |
if ($status eq 0) {
|
|
Packit |
db064d |
if (defined($insert_lid::lids{$lid})) {
|
|
Packit |
db064d |
print
|
|
Packit |
db064d |
"LID $lid already defined for NodeGUID $insert_lid::lids{$lid}->{nodeguid}\n";
|
|
Packit |
db064d |
$return_code = 1;
|
|
Packit |
db064d |
} else {
|
|
Packit |
db064d |
$rec = {lid => $lid, nodeguid => $nodeguid};
|
|
Packit |
db064d |
$insert_lid::lids{$lid} = $rec;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
} else {
|
|
Packit |
db064d |
$return_code = $status;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
sub insert_nodeguid
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
my ($lid) = shift(@_);
|
|
Packit |
db064d |
my ($nodeguid) = shift(@_);
|
|
Packit |
db064d |
my ($nodetype) = shift(@_);
|
|
Packit |
db064d |
my $rec = undef;
|
|
Packit |
db064d |
my $status = "";
|
|
Packit |
db064d |
|
|
Packit |
db064d |
$status = validate_non_zero_guid($lid, $nodeguid, $nodetype);
|
|
Packit |
db064d |
if ($status eq 0) {
|
|
Packit |
db064d |
if (defined($insert_nodeguid::nodeguids{$nodeguid})) {
|
|
Packit |
db064d |
print
|
|
Packit |
db064d |
"NodeGUID $nodeguid already defined for LID $insert_nodeguid::nodeguids{$nodeguid}->{lid}\n";
|
|
Packit |
db064d |
$return_code = 1;
|
|
Packit |
db064d |
} else {
|
|
Packit |
db064d |
$rec = {lid => $lid, nodeguid => $nodeguid};
|
|
Packit |
db064d |
$insert_nodeguid::nodeguids{$nodeguid} = $rec;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
} else {
|
|
Packit |
db064d |
$return_code = $status;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
sub validate_portguid
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
my ($portguid) = shift(@_);
|
|
Packit |
db064d |
my ($nodeguid) = shift(@_);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (($nodeguid ne $portguid)
|
|
Packit |
db064d |
&& defined($insert_nodeguid::nodeguids{$portguid})) {
|
|
Packit |
db064d |
print "PortGUID $portguid is an invalid duplicate of a NodeGUID\n";
|
|
Packit |
db064d |
$return_code = 1;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
sub insert_portguid
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
my ($lid) = shift(@_);
|
|
Packit |
db064d |
my ($portguid) = shift(@_);
|
|
Packit |
db064d |
my ($nodetype) = shift(@_);
|
|
Packit |
db064d |
my ($nodeguid) = shift(@_);
|
|
Packit |
db064d |
my $rec = undef;
|
|
Packit |
db064d |
my $status = "";
|
|
Packit |
db064d |
|
|
Packit |
db064d |
$status = validate_non_zero_guid($lid, $portguid, $nodetype);
|
|
Packit |
db064d |
if ($status eq 0) {
|
|
Packit |
db064d |
if (defined($insert_portguid::portguids{$portguid})) {
|
|
Packit |
db064d |
print
|
|
Packit |
db064d |
"PortGUID $portguid already defined for LID $insert_portguid::portguids{$portguid}->{lid}\n";
|
|
Packit |
db064d |
$return_code = 1;
|
|
Packit |
db064d |
} else {
|
|
Packit |
db064d |
$rec = {lid => $lid, portguid => $portguid};
|
|
Packit |
db064d |
$insert_portguid::portguids{$portguid} = $rec;
|
|
Packit |
db064d |
validate_portguid($portguid, $nodeguid);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
} else {
|
|
Packit |
db064d |
$return_code = $status;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
sub main
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
my $cache_file = get_cache_file($ca_name, $ca_port);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if ($regenerate_map || !(-f "$cache_file")) {
|
|
Packit |
db064d |
generate_ibnetdiscover_topology($ca_name, $ca_port);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
open IBNET_TOPO, "<$cache_file"
|
|
Packit |
db064d |
or die "Failed to open ibnet topology: $!\n";
|
|
Packit |
db064d |
|
|
Packit |
db064d |
my $nodetype = "";
|
|
Packit |
db064d |
my $nodeguid = "";
|
|
Packit |
db064d |
my $portguid = "";
|
|
Packit |
db064d |
my $lid = "";
|
|
Packit |
db064d |
my $line = "";
|
|
Packit |
db064d |
my $firstport = "";
|
|
Packit |
db064d |
|
|
Packit |
db064d |
while ($line = <IBNET_TOPO>) {
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if ($line =~ /^caguid=(.*)/ || $line =~ /^rtguid=(.*)/) {
|
|
Packit |
db064d |
$nodeguid = $1;
|
|
Packit |
db064d |
$nodetype = "";
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if ($line =~ /^switchguid=(.*)/) {
|
|
Packit |
db064d |
$nodeguid = $1;
|
|
Packit |
db064d |
$portguid = "";
|
|
Packit |
db064d |
$nodetype = "";
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
if ($line =~ /^switchguid=(.*)\((.*)\)/) {
|
|
Packit |
db064d |
$nodeguid = $1;
|
|
Packit |
db064d |
$portguid = "0x" . $2;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if ($line =~ /^Switch.*\"S-(.*)\"\s+# (.*) port.* lid (\d+) .*/) {
|
|
Packit |
db064d |
$nodetype = "switch";
|
|
Packit |
db064d |
$firstport = "yes";
|
|
Packit |
db064d |
$lid = $3;
|
|
Packit |
db064d |
insert_lid($lid, $nodeguid, $nodetype);
|
|
Packit |
db064d |
insert_nodeguid($lid, $nodeguid, $nodetype);
|
|
Packit |
db064d |
if ($portguid ne "") {
|
|
Packit |
db064d |
insert_portguid($lid, $portguid, $nodetype, $nodeguid);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
if ($line =~ /^Ca.*/) {
|
|
Packit |
db064d |
$nodetype = "ca";
|
|
Packit |
db064d |
$firstport = "yes";
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
if ($line =~ /^Rt.*/) {
|
|
Packit |
db064d |
$nodetype = "router";
|
|
Packit |
db064d |
$firstport = "yes";
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if ($nodetype eq "ca" || $nodetype eq "router") {
|
|
Packit |
db064d |
if ($line =~ /"S-(.*)\# lid (\d+) .*/) {
|
|
Packit |
db064d |
$lid = $2;
|
|
Packit |
db064d |
insert_lid($lid, $nodeguid, $nodetype);
|
|
Packit |
db064d |
if ($firstport eq "yes") {
|
|
Packit |
db064d |
insert_nodeguid($lid, $nodeguid, $nodetype);
|
|
Packit |
db064d |
$firstport = "no";
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
if ($line =~ /^.*"H-(.*)\# lid (\d+) .*/) {
|
|
Packit |
db064d |
$lid = $2;
|
|
Packit |
db064d |
insert_lid($lid, $nodeguid, $nodetype);
|
|
Packit |
db064d |
if ($firstport eq "yes") {
|
|
Packit |
db064d |
insert_nodeguid($lid, $nodeguid, $nodetype);
|
|
Packit |
db064d |
$firstport = "no";
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
if ($line =~ /^.*"R-(.*)\# lid (\d+) .*/) {
|
|
Packit |
db064d |
$lid = $2;
|
|
Packit |
db064d |
insert_lid($lid, $nodeguid, $nodetype);
|
|
Packit |
db064d |
if ($firstport eq "yes") {
|
|
Packit |
db064d |
insert_nodeguid($lid, $nodeguid, $nodetype);
|
|
Packit |
db064d |
$firstport = "no";
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
if ($line =~ /^\[(\d+)\]\((.*)\)/) {
|
|
Packit |
db064d |
$portguid = "0x" . $2;
|
|
Packit |
db064d |
insert_portguid($lid, $portguid, $nodetype, $nodeguid);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
close IBNET_TOPO;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
main;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
exit ($return_code);
|
|
Packit |
db064d |
|