Blame scripts/ibidsverify.pl

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