]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/ofed/management/infiniband-diags/scripts/ibprintrt.pl
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / ofed / management / infiniband-diags / scripts / ibprintrt.pl
1 #!/usr/bin/perl
2 #
3 # Copyright (c) 2006 The Regents of the University of California.
4 # Copyright (c) 2007-2008 Voltaire, Inc. All rights reserved.
5 #
6 # Produced at Lawrence Livermore National Laboratory.
7 # Written by Ira Weiny <weiny2@llnl.gov>.
8 #
9 # This software is available to you under a choice of one of two
10 # licenses.  You may choose to be licensed under the terms of the GNU
11 # General Public License (GPL) Version 2, available from the file
12 # COPYING in the main directory of this source tree, or the
13 # OpenIB.org BSD license below:
14 #
15 #     Redistribution and use in source and binary forms, with or
16 #     without modification, are permitted provided that the following
17 #     conditions are met:
18 #
19 #      - Redistributions of source code must retain the above
20 #        copyright notice, this list of conditions and the following
21 #        disclaimer.
22 #
23 #      - Redistributions in binary form must reproduce the above
24 #        copyright notice, this list of conditions and the following
25 #        disclaimer in the documentation and/or other materials
26 #        provided with the distribution.
27 #
28 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
29 # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
30 # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
31 # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
32 # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
33 # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
34 # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
35 # SOFTWARE.
36 #
37
38 use strict;
39
40 use Getopt::Std;
41 use IBswcountlimits;
42
43 # =========================================================================
44 #
45 sub usage_and_exit
46 {
47         my $prog = $_[0];
48         print "Usage: $prog [-R -l] [-G <rt_guid> | <node_name>]\n";
49         print "   print only the rt specified from the ibnetdiscover output\n";
50         print "   -R Recalculate ibnetdiscover information\n";
51         print "   -l list rts\n";
52         print "   -C <ca_name> use selected channel adaptor name for queries\n";
53         print "   -P <ca_port> use selected channel adaptor port for queries\n";
54         print "   -G node is specified with GUID\n";
55         exit 2;
56 }
57
58 my $argv0          = `basename $0`;
59 my $regenerate_map = undef;
60 my $list_rts       = undef;
61 my $ca_name        = "";
62 my $ca_port        = "";
63 my $name_is_guid   = "no";
64 chomp $argv0;
65 if (!getopts("hRlC:P:G"))         { usage_and_exit $argv0; }
66 if (defined $Getopt::Std::opt_h) { usage_and_exit $argv0; }
67 if (defined $Getopt::Std::opt_R) { $regenerate_map = $Getopt::Std::opt_R; }
68 if (defined $Getopt::Std::opt_l) { $list_rts       = $Getopt::Std::opt_l; }
69 if (defined $Getopt::Std::opt_C) { $ca_name        = $Getopt::Std::opt_C; }
70 if (defined $Getopt::Std::opt_P) { $ca_port        = $Getopt::Std::opt_P; }
71 if (defined $Getopt::Std::opt_G) { $name_is_guid   = "yes"; }
72
73 my $target_rt = $ARGV[0];
74
75 if ($name_is_guid eq "yes") {
76         $target_rt = format_guid($target_rt);
77 }
78
79 my $cache_file = get_cache_file($ca_name, $ca_port);
80
81 if ($regenerate_map || !(-f "$cache_file")) {
82         generate_ibnetdiscover_topology($ca_name, $ca_port);
83 }
84
85 if ($list_rts) {
86         system("ibrouters $cache_file");
87         exit 1;
88 }
89
90 if ($target_rt eq "") {
91         usage_and_exit $argv0;
92 }
93
94 # =========================================================================
95 #
96 sub main
97 {
98         my $found_rt = 0;
99         open IBNET_TOPO, "<$cache_file" or die "Failed to open ibnet topology\n";
100         my $in_rt = "no";
101         my %ports = undef;
102         while (my $line = <IBNET_TOPO>) {
103                 if ($line =~ /^Rt.*\"R-(.*)\"\s+# (.*)/) {
104                         my $guid = $1;
105                         my $desc = $2;
106                         if ($in_rt eq "yes") {
107                                 $in_rt = "no";
108                                 foreach my $port (sort { $a <=> $b } (keys %ports)) {
109                                         print $ports{$port};
110                                 }
111                         }
112                         if ("0x$guid" eq $target_rt || $desc =~ /[\s\"]$target_rt[\s\"]/) {
113                                 print $line;
114                                 $in_rt    = "yes";
115                                 $found_rt++;
116                         }
117                 }
118                 if ($line =~ /^Switch.*/ || $line =~ /^Ca.*/) { $in_rt = "no"; }
119
120                 if ($line =~ /^\[(\d+)\].*/ && $in_rt eq "yes") {
121                         $ports{$1} = $line;
122                 }
123
124         }
125         if ($found_rt == 0) {
126                 die "\"$target_rt\" not found\n" .
127                         "   Try running with the \"-R\" option.\n" .
128                         "   If still not found the node is probably down.\n";
129         }
130         if ($found_rt > 1) {
131                 print "\nWARNING: Found $found_rt Router's with the name \"$target_rt\"\n";
132         }
133         close IBNET_TOPO;
134 }
135 main
136