From 3e21357e8d45fd953c4e76c7ba430c1c45c487c7 Mon Sep 17 00:00:00 2001 From: "Eric A. Miller" Date: Thu, 2 Aug 2012 23:19:54 -0400 Subject: [PATCH] Add i_ssidmac() to get BSSID's, grab radio base MAC as port MAC for AP's --- Info/Airespace.pm | 63 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 59 insertions(+), 4 deletions(-) diff --git a/Info/Airespace.pm b/Info/Airespace.pm index c43ca8f9..1379d1f2 100644 --- a/Info/Airespace.pm +++ b/Info/Airespace.pm @@ -421,11 +421,12 @@ sub i_mac { next unless defined $mac; $i_mac{$iid} = $mac; } - - # Don't grab AP MACs - we want the AP to show up on edge switch - # ports + elsif ( $index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/ ) { + $index =~ s/\.\d+$//; + next unless defined $index; + $i_mac{$iid} = $index; + } # Some switch interfaces have MACs, virtuals report 00:00:00:00:00:00 - else { my $mac = $if_mac->{$iid}; next unless defined $mac; @@ -659,6 +660,60 @@ sub i_ssidbcast { return \%i_ssidbcast; } +# Secret decoder ring for BSSID: https://supportforums.cisco.com/docs/DOC-2935 +# We need radio base MAC, SSID index, radio band, and whether AP is +# VxWorks or IOS based then we can do the arithmetic + +sub i_ssidmac { + my $airespace = shift; + my $partial = shift; + + my $ssidlist = $airespace->i_ssidlist($partial) || {}; + my $apif_type = $airespace->airespace_apif_type() || {}; + my $ap_ios = $airespace->bsnAPIOSVersion() || {}; + + my %i_ssidmac; + foreach my $oid ( keys %$ssidlist ) { + + my @parts = split( /\./, $oid ); + my $ssid_idx = pop (@parts); + my $slot = pop (@parts); + my $last = pop (@parts); + + my $iid = $oid; + # Get radio band + $iid =~ s/\.\d+$//; + my $ap_type = $apif_type->{$iid}; + # Determine if IOS based + $iid =~ s/\.\d+$//; + my $ios = $ap_ios->{$iid} || ''; + + # Four cases: + # IOS and 2.4Ghz count up, starts at zero + if ($ios and $ap_type =~ /b$/) { + $last = $last + ($ssid_idx - 1); + } + # IOS and 5Ghz - count down from maximum of 16 + elsif ($ios and $ap_type =~ /a$/) { + $last = $last + (16 - $ssid_idx); + } + # VxWorks and 5Ghz - count up, starts at zero + elsif ($ios and $ap_type =~ /a$/) { + $last = $last + ($ssid_idx - 1); + } + # VxWorks and 2.4Ghz - count down from maximum of 16 + else { + $last = $last + (16 - $ssid_idx); + } + + push (@parts, $last); + my $bssid = join( ':', map { sprintf( "%02x", $_ ) } @parts ); + $i_ssidmac{$oid} = $bssid; + } + + return \%i_ssidmac; +} + sub i_80211channel { my $airespace = shift; my $partial = shift;