Add extra check in LLDP local interface determination to improve H3C support
This commit is contained in:
16
Info/LLDP.pm
16
Info/LLDP.pm
@@ -99,20 +99,26 @@ sub lldp_if {
|
|||||||
|
|
||||||
my $addr = $lldp->lldp_rem_pid($partial) || {};
|
my $addr = $lldp->lldp_rem_pid($partial) || {};
|
||||||
my $i_descr = $lldp->i_description() || {};
|
my $i_descr = $lldp->i_description() || {};
|
||||||
|
my $i_alias = $lldp->i_alias() || {};
|
||||||
my %r_i_descr = reverse %$i_descr;
|
my %r_i_descr = reverse %$i_descr;
|
||||||
|
my %r_i_alias = reverse %$i_alias;
|
||||||
|
|
||||||
my %lldp_if;
|
my %lldp_if;
|
||||||
foreach my $key ( keys %$addr ) {
|
foreach my $key ( keys %$addr ) {
|
||||||
my @aOID = split( '\.', $key );
|
my @aOID = split( '\.', $key );
|
||||||
my $port = $aOID[1];
|
my $port = $aOID[1];
|
||||||
next unless $port;
|
next unless $port;
|
||||||
# Local LLDP port may not equate to ifIndex
|
# Local LLDP port may not equate to ifIndex, see LldpPortNumber TEXTUAL-CONVENTION in LLDP-MIB.
|
||||||
# Cross reference lldpLocPortDesc with ifDescr to get ifIndex
|
# Cross reference lldpLocPortDesc with ifDescr and ifAlias to get ifIndex,
|
||||||
|
# prefer ifDescr over ifAlias because using cross ref with description is correct behavior
|
||||||
|
# according to the LLDP-MIB. Some devices (eg H3C gear) seem to use ifAlias though.
|
||||||
my $lldp_desc = $lldp->lldpLocPortDesc($port);
|
my $lldp_desc = $lldp->lldpLocPortDesc($port);
|
||||||
my $desc = $lldp_desc->{$port};
|
my $desc = $lldp_desc->{$port};
|
||||||
# If cross reference is successful use it, otherwise stick with lldpRemLocalPortNum
|
# If cross reference is successful use it, otherwise stick with lldpRemLocalPortNum
|
||||||
if ( exists $r_i_descr{$desc} ) {
|
if ( exists $r_i_descr{$desc} ) {
|
||||||
$port = $r_i_descr{$desc};
|
$port = $r_i_descr{$desc};
|
||||||
|
} elsif ( exists $r_i_alias{$desc} ) {
|
||||||
|
$port = $r_i_alias{$desc};
|
||||||
}
|
}
|
||||||
|
|
||||||
$lldp_if{$key} = $port;
|
$lldp_if{$key} = $port;
|
||||||
@@ -411,9 +417,9 @@ with the remote system.
|
|||||||
|
|
||||||
=item $lldp->lldp_if()
|
=item $lldp->lldp_if()
|
||||||
|
|
||||||
Returns the mapping to the SNMP Interface Table. Trys to cross reference
|
Returns the mapping to the SNMP Interface Table. Triess to cross reference
|
||||||
(C<lldpLocPortDesc>) with (C<ifDescr>) to get (C<ifIndex>), if unable
|
(C<lldpLocPortDesc>) with (C<ifDescr>) and (C<ifAlias>) to get (C<ifIndex>),
|
||||||
defaults to (C<lldpRemLocalPortNum>).
|
if unable defaults to (C<lldpRemLocalPortNum>).
|
||||||
|
|
||||||
=item $lldp->lldp_ip()
|
=item $lldp->lldp_ip()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user