diff --git a/ChangeLog b/ChangeLog index 9a91abf1..623ab923 100644 --- a/ChangeLog +++ b/ChangeLog @@ -19,6 +19,7 @@ version 3.09 () * When determining the BSSID in Airespace there is only one hexadecimal digit available so skip if outside the range of 1-16, 17 is reserved for 3rd party AP's. + * Don't assume entity index 1 is the chassis and has serial in Layer3. version 3.08 (2013-10-22) diff --git a/Info/Layer3.pm b/Info/Layer3.pm index c8586b27..04d5ad23 100644 --- a/Info/Layer3.pm +++ b/Info/Layer3.pm @@ -205,19 +205,24 @@ sub i_ignore { sub serial { my $l3 = shift; - my $serial1 = $l3->serial1(); - my $e_descr = $l3->e_descr() || {}; - my $e_serial = $l3->e_serial() || {}; + my $serial1 = $l3->serial1(); + my $e_parent = $l3->e_parent() || {}; - my $serial2 = $e_serial->{1} || undef; - my $chassis = $e_descr->{1} || undef; - - # precedence - # serial2,chassis parse,serial1 - return $serial2 if ( defined $serial2 and $serial2 !~ /^\s*$/ ); - - if ( defined $chassis and $chassis =~ /serial#?:\s*([a-z0-9]+)/i ) { - return $1; + foreach my $iid ( keys %$e_parent ) { + my $parent = $e_parent->{$iid}; + if ( $parent eq '0' ) { + my $serial = $l3->e_serial($iid); + if ( $serial ) { + return $serial->{$iid}; + } + else { + my $descr = $l3->e_descr($iid); + if ( $descr and $descr =~ /serial#?:\s*([a-z0-9]+)/i ) + { + return $1; + } + } + } } return $serial1 if ( defined $serial1 and $serial1 !~ /^\s*$/ );