# SNMP::Info::Layer3::Aironet # Max Baker # # Copyright (c) 2002, Regents of the University of California # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # * Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # * Neither the name of the University of California, Santa Cruz nor the # names of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON # ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package SNMP::Info::Layer3::Aironet; $VERSION = 0.1; use strict; use Exporter; use SNMP::Info::Layer3; use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/; @SNMP::Info::Layer3::Aironet::ISA = qw/SNMP::Info::Layer3 Exporter/; @SNMP::Info::Layer3::Aironet::EXPORT_OK = qw//; $DEBUG=0; $SNMP::debugging=$DEBUG; $INIT = 0; %MIBS = ( %SNMP::Info::Layer3::MIBS, 'AWCVX-MIB' => 'awcIfTable', 'IEEE802dot11-MIB' => 'dot11StationID', ); %GLOBALS = ( %SNMP::Info::Layer3::GLOBALS, 'mac' => 'dot11StationID.2', # AWC Ethernet Table 'awc_duplex' => 'awcEtherDuplex.0', ); %FUNCS = ( %SNMP::Info::Layer3::FUNCS, 'i_mac2' => 'ifPhysAddress', 'i_mtu2' => 'ifMtu', 'i_ssid' => 'dot11DesiredSSID', # Bridge-mib overrides 'fw_mac2' => 'dot1dTpFdbAddress', 'fw_port2' => 'dot1dTpFdbPort', 'bp_index2' => 'dot1dBasePortIfIndex', # AWC Interface Table (awcIfTable) 'awc_default_mac' => 'awcIfDefaultPhyAddress', 'awc_mac' => 'awcIfPhyAddress', 'awc_ip' => 'awcIfIpAddress', 'awc_netmask' => 'awcIfIpNetMask', 'awc_msdu' => 'awcIfMSDUMaxLength', ); %MUNGE = ( # Inherit all the built in munging %SNMP::Info::Layer3::MUNGE, 'i_mac2' => \&SNMP::Info::munge_mac, 'awc_mac' => \&SNMP::Info::munge_mac, 'fw_mac2' => \&SNMP::Info::munge_mac, ); # Override wireless port with static info sub bp_index { my $aironet = shift; my $interfaces = $aironet->interfaces(); my $bp_index = $aironet->bp_index2(); foreach my $iid (keys %$interfaces){ my $port = $interfaces->{$iid}; # Hardwire the wireless port to the transparent bridge port if ($port =~ /awc/){ $bp_index->{0}=$iid; } } return $bp_index; } # Add the static table to the forwarding table sub fw_mac { my $aironet = shift; my $fw_mac = $aironet->fw_mac2(); my $fw_port = $aironet->fw_port2(); my $bs_mac = $aironet->bs_mac(); # remove port 0 forwarding table entries, only port 0 static entries foreach my $fw (keys %$fw_mac){ my $port = $fw_port->{$fw}; delete $fw_mac->{$fw} if $port == 0; } foreach my $bs (keys %$bs_mac){ $fw_mac->{$bs} = $bs_mac->{$bs}; } return $fw_mac; } # Add the static table to the forwarding table sub fw_port { my $aironet = shift; my $fw_port = $aironet->fw_port2(); my $bs_port = $aironet->bs_port(); foreach my $bs (keys %$bs_port){ $fw_port->{$bs} = $bs_port->{$bs}; } return $fw_port; } sub i_duplex { my $aironet = shift; my $interfaces = $aironet->interfaces(); my $awc_duplex = $aironet->awc_duplex(); my %i_duplex; foreach my $iid (keys %$interfaces){ my $name = $interfaces->{$iid}; if ($name =~ /fec/){ $i_duplex{$iid} = $awc_duplex; } } return \%i_duplex; } sub i_mac { my $aironet = shift; my $i_mac = $aironet->i_mac2(); my $awc_mac = $aironet->awc_mac(); foreach my $iid (keys %$awc_mac){ next unless defined $i_mac->{$iid}; $i_mac->{$iid} = $awc_mac->{$iid}; } return $i_mac; } sub i_ignore { my $aironet = shift; my $interfaces = $aironet->interfaces(); my %i_ignore; foreach my $if (keys %$interfaces){ $i_ignore{$if}++ if ($interfaces->{$if} =~ /(rptr|lo)/); } return \%i_ignore; } sub vendor { return 'cisco'; } 1; __END__ =head1 NAME SNMP::Info::Layer3::Aironet - Perl5 Interface to Cisco Aironet Wireless Devices =head1 DESCRIPTION Inherits all methods from SNMP::Info::Layer3 =head1 AUTHOR Max Baker (C) =head1 SYNOPSIS my $aironet = new SNMP::Info::Layer3::Aironet(DestHost => 'myswitch', Community => 'public'); my $mac = $aironet->mac(); =head1 CREATING AN OBJECT =over =item new SNMP::Info::Layer3::Aironet() Arguments passed to new() are passed on to SNMP::Session::new() my $aironet = new SNMP::Info::Layer3::Aironet( DestHost => $host, Community => 'public', Version => 3,... ) die "Couldn't connect.\n" unless defined $aironet; =item $aironet->session() Sets or returns the SNMP::Session object # Get my $sess = $aironet->session(); # Set my $newsession = new SNMP::Session(...); $aironet->session($newsession); =back =head1 Globals =over =item $aironet->mac() Gives the MAC Address of the wireless side B =item $aironet->awc_duplex() Gives the admin duplex setting for the Ethernet Port. B =item $aironet->vendor() Returns 'cisco'. =back =head1 TABLE ENTRIES =head2 Aironet specific items =over =item $aironet->awc_default_mac() Gives the default MAC address of each interface. B =item $aironet->awc_mac() Gives the actual MAC address of each interface. B =item $aironet->awc_ip() Gives the IP Address assigned to each interface. B =item $aironet->awc_netmask() Gives the NetMask for each interface. B =item $aironet->awc_msdu() B =back =head2 Overrides =over =item $aironet->bp_index() Takes the bp_index() value from SNMP::Info::Bridge and overrides the wireless port to be assigned to the transparent bridge port (port 0) =item $aironet->fw_mac() Adds static table entries from bs_mac() to port 0 so that wireless MAC addresses will be reported. Forwarding table entries for port 0 are removed. =item $aironet->fw_port() Adds the static table port mappings to the forwarding table port mappings by adding bs_port() to fw_port() =item $aironet->i_duplex() Adds the value of awc_duplex() to each Ethernet port seen. =item $aironet->i_mac() Overrides the values for i_mac with the value from awc_mac() if they are set. =item $aironet->i_ignore() Ignores ports that are of type ``rptr'' and ``lo''. =back =cut