From: Martin Mares Date: Sun, 28 Jan 2018 22:25:47 +0000 (+0100) Subject: show-switch: We distunguish between ifindex and portindex X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=2fa7fa06da83f937340b46920972bed3f145a881;p=jablonka.git show-switch: We distunguish between ifindex and portindex --- diff --git a/show-switch b/show-switch index ea084d8..733f93b 100755 --- a/show-switch +++ b/show-switch @@ -92,7 +92,7 @@ my $basics = my_get_table({ 'name' => "$OID_basic.5", 'location' => "$OID_basic.6", }); -print Dumper($basics) if $debug; +print "# Basics:\n", Dumper($basics) if $debug; my $bas = $basics->{0} or die "Cannot find basic info"; for (values %$bas) { s{\r}{}gs; @@ -124,7 +124,7 @@ for my $if (values %$if_table) { $if->{mac} = join(':', map { sprintf "%02x", ord $_ } split(//, $if->{mac})); $if_macs{$if->{mac}} = 1; } -print Dumper($if_table) if $debug; +print "# Interface table:\n", Dumper($if_table) if $debug; my @ifaces = sort { $a <=> $b } keys %$if_table; print "MAC addr: ", join(" ", sort keys %if_macs), "\n"; @@ -133,7 +133,7 @@ my $ip_table = my_get_table({ 'iface' => "$OID_ipTable.1.2", 'mask' => "$OID_ipTable.1.3", }); -print Dumper($ip_table) if $debug; +print "# IP table:\n", Dumper($ip_table) if $debug; # XXX: IPv6 not supported yet for my $ipa (keys %$ip_table) { @@ -142,7 +142,20 @@ for my $ipa (keys %$ip_table) { my $nm = Net::Netmask->new2($ipa, $ip->{mask}) or die "Cannot parse IP prefix"; push @{$if->{ip_addrs}}, $ipa . '/' . $nm->bits; } -print Dumper($if_table) if $debug; + +# Switch ports +my $OID_1dBasePortTable = '1.3.6.1.2.1.17.1.4'; +my $port_table = my_get_table({ + 'ifindex' => "$OID_1dBasePortTable.1.2", +}); +print "# Switch ports:\n", Dumper($port_table) if $debug; + +for my $port (keys %$port_table) { + my $if = $if_table->{$port_table->{$port}->{ifindex}} or die "Port table refers to unknown iface"; + $if->{switch_port} = $port; +} + +print "# Extended interface table:\n", Dumper($if_table) if $debug; if ($mac) { my $OID_1qTpFdbTable = '1.3.6.1.2.1.17.7.1.2.2'; @@ -150,17 +163,18 @@ if ($mac) { 'port' => "$OID_1qTpFdbTable.1.2", 'status' => "$OID_1qTpFdbTable.1.3", }); - print Dumper($vlan_fdb_table) if $debug; + print "# VLAN FDB:\n", Dumper($vlan_fdb_table) if $debug; if (%$vlan_fdb_table) { for my $m (keys %$vlan_fdb_table) { my $fdb = $vlan_fdb_table->{$m}; $fdb->{status} == 3 or next; # Only learned MACs - my $port = $if_table->{$fdb->{port}} or die "Forwarding DB refers to unknown iface"; + my $port = $port_table->{$fdb->{port}} or die "Forwarding DB refers to unknown port"; + my $if = $if_table->{$port->{ifindex}} or die "Forwarding DB refers to unknown iface"; my @m = split /\./, $m; my $vlan = shift @m; my $mac = join(':', map { sprintf('%02x', $_) } @m); - push @{$port->{macs}}, $mac; + push @{$if->{macs}}, $mac; } } else { print "# Trying fall-fack to .1d FDB\n" if $debug; @@ -169,14 +183,15 @@ if ($mac) { 'port' => "$OID_1dTpFdbTable.1.2", 'status' => "$OID_1dTpFdbTable.1.3", }); - print Dumper($fdb_table) if $debug; + print "# Non-VLAN FDB:\n", Dumper($fdb_table) if $debug; for my $m (keys %$fdb_table) { my $fdb = $fdb_table->{$m}; $fdb->{status} == 3 or next; # Only learned MACs - my $port = $if_table->{$fdb->{port}} or die "Forwarding DB refers to unknown iface"; + my $port = $port_table->{$fdb->{port}} or die "Forwarding DB refers to unknown port"; + my $if = $if_table->{$port->{ifindex}} or die "Forwarding DB refers to unknown iface"; my @m = split /\./, $m; my $mac = join(':', map { sprintf('%02x', $_) } @m); - push @{$port->{macs}}, $mac; + push @{$if->{macs}}, $mac; } } @@ -198,7 +213,7 @@ for my $vlan (values %$vlan_table) { $vlan->{$k} = [ split //, unpack("B*", $vlan->{$k} // "") ]; } } -print Dumper($vlan_table) if $debug; +print "# VLAN table\n", Dumper($vlan_table) if $debug; my @vlans = sort { $a <=> $b } grep { $vlan_table->{$_}->{'row-status'} == 1 } keys %$vlan_table; print "\n### VLANs ###\n\n"; @@ -211,9 +226,9 @@ if (@vlans) { } print "\n### Ports ###\n\n"; -# XXX: We assume that 802.1d switch ports IDs are equal to interface IDs -for my $port (@ifaces) { - my $if = $if_table->{$port}; +for my $ifindex (@ifaces) { + my $if = $if_table->{$ifindex}; + my $port = $if->{switch_port}; my $state; my $scolor = $t_norm; if ($if->{'admin'} != 1) { @@ -234,7 +249,7 @@ for my $port (@ifaces) { $speed = int($speed/1000); $speed = "${speed}G"; } - printf "%-4d %-15.15s %s%-4s %-5s %s%-25.25s%s", $port, $if->{name}, $scolor, $state, $speed, $t_yellow, $if->{alias}, $t_norm; + printf "%-4d %-15.15s %s%-4s %-5s %s%-25.25s%s", $ifindex, $if->{name}, $scolor, $state, $speed, $t_yellow, $if->{alias}, $t_norm; if ($mac) { my $show_mac = "";