Menu

#32 Include support for extended vlan membership in CiscoVTP.pm

v1.05
closed-accepted
SNMP / Mibs (9)
5
2007-11-21
2007-08-07
No

I noticed the latest cvs copy of snmp-info was not showing the vlan memberships for vlans above 1024 from our C6500s, using the 'i_vlan_membership' method. Here's a patch that fixes that.

Regards,

cv

cvs diff: Diffing Info
Index: Info/CiscoVTP.pm
===================================================================
RCS file: /cvsroot/snmp-info/snmp-info/Info/CiscoVTP.pm,v
retrieving revision 1.14
diff -r1.14 CiscoVTP.pm
105c105,108
< 'vtp_trunk_native' => 'vlanTrunkPortNativeVlan',
---
> 'vtp_trunk_vlans2k' => 'vlanTrunkPortVlansEnabled2k',
> 'vtp_trunk_vlans3k' => 'vlanTrunkPortVlansEnabled3k',
> 'vtp_trunk_vlans4k' => 'vlanTrunkPortVlansEnabled4k',
> 'vtp_trunk_native' => 'vlanTrunkPortNativeVlan',
184c187,190
< my $ports_vlans = $vtp->vtp_trunk_vlans($partial) || {};
---
> my $ports_vlans = $vtp->vtp_trunk_vlans($partial) || {};
> my $ports_vlans2k = $vtp->vtp_trunk_vlans2k($partial) || {};
> my $ports_vlans3k = $vtp->vtp_trunk_vlans3k($partial) || {};
> my $ports_vlans4k = $vtp->vtp_trunk_vlans4k($partial) || {};
201c207,221
< # Get trunk ports
---
> # Get trunk ports. Determine which vlans are operational first.
> my %oper_vlans;
> foreach my $iid (keys %$vtp_vlans) {
> my $vlan = 0;
> my $vtp_dom = 0;
> my $state = $vtp_vlans->{$iid};
> next unless defined $state;
> next if $state !~ /operational/;
> if ($iid =~ /(\d+)\.(\d+)/ ) {
> $vtp_dom = $1;
> $vlan = $2;
> $oper_vlans{$vlan}++;
> }
> }
>
204,216c224,231
<
< foreach my $iid (keys %$vtp_vlans) {
< my $vlan = 0;
< my $vtp_dom =0;
< my $state = $vtp_vlans->{$iid};
< next unless defined $state;
< next if $state !~ /operational/;
< if ($iid =~ /(\d+)\.(\d+)/ ) {
< $vtp_dom = $1;
< $vlan = $2;
< }
<
< push(@{$i_vlan_membership->{$port}}, $vlan) if (@$vlanlist[$vlan]);
---
> foreach my $vlan (keys %oper_vlans) {
> push(@{$i_vlan_membership->{$port}}, $vlan) if (@$vlanlist[$vlan]);
> }
> }
> foreach my $port (keys %$ports_vlans2k) {
> my $vlanlist = [split(//, unpack("B*", $ports_vlans2k->{$port}))];
> foreach my $vlan (keys %oper_vlans) {
> push(@{$i_vlan_membership->{$port}}, $vlan) if (@$vlanlist[$vlan-1024]);
218a234,246
> foreach my $port (keys %$ports_vlans3k) {
> my $vlanlist = [split(//, unpack("B*", $ports_vlans3k->{$port}))];
> foreach my $vlan (keys %oper_vlans) {
> push(@{$i_vlan_membership->{$port}}, $vlan) if (@$vlanlist[$vlan-2048]);
> }
> }
> foreach my $port (keys %$ports_vlans4k) {
> my $vlanlist = [split(//, unpack("B*", $ports_vlans4k->{$port}))];
> foreach my $vlan (keys %oper_vlans) {
> push(@{$i_vlan_membership->{$port}}, $vlan) if (@$vlanlist[$vlan-3072]);
> }
> }
>

Discussion

  • Justin Hunter

    Justin Hunter - 2007-08-29

    Logged In: YES
    user_id=1368562
    Originator: NO

    here's a .patch file against CVS; note, it also includes a pvid hack, since Cisco does not implement Q-BRIDGE-MIB. I can't attach, so here it is inline.

    --- /tmp/snmp-info-cvs/snmp-info/Info/CiscoVTP.pm 2007-02-19 20:06:04.000000000 -0700
    +++ CiscoVTP.pm 2007-08-29 10:09:03.000000000 -0700
    @@ -96,12 +96,17 @@
    'i_vlan_2' => 'vmVlans2k',
    'i_vlan_3' => 'vmVlans3k',
    'i_vlan_4' => 'vmVlans4k',
    + 'i_voice_vlan' => 'vmVoiceVlanId',
    + 'i_pvid' => 'vlanTrunkPortNativeVlan',
    # CISCO-VLAN-IFTABLE-RELATIONSHIP-MIB
    'v_cvi_if' => 'cviRoutedVlanIfIndex',
    # CISCO-VTP-MIB::vlanTrunkPortTable
    'vtp_trunk_mgmt_dom' => 'vlanTrunkPortManagementDomain',
    'vtp_trunk_encaps_t' => 'vlanTrunkPortEncapsulationType',
    'vtp_trunk_vlans' => 'vlanTrunkPortVlansEnabled',
    + 'vtp_trunk_vlans_2k' => 'vlanTrunkPortVlansEnabled2k',
    + 'vtp_trunk_vlans_3k' => 'vlanTrunkPortVlansEnabled3k',
    + 'vtp_trunk_vlans_4k' => 'vlanTrunkPortVlansEnabled4k',
    'vtp_trunk_native' => 'vlanTrunkPortNativeVlan',
    'vtp_trunk_rstat' => 'vlanTrunkPortRowStatus',
    'vtp_trunk_dyn' => 'vlanTrunkPortDynamicState',
    @@ -110,13 +115,32 @@
    'vtp_trunk_encaps' => 'vlanTrunkPortEncapsulationOperType',
    # TODO Add these tables if someone wants them..
    # vtpEditControlTable
    + 'v_edit_operation' => 'vtpVlanEditOperation',
    + 'v_edit_apply_status' => 'vtpVlanApplyStatus',
    + 'v_edit_buffer_owner' => 'vtpVlanEditBufferOwner',
    + 'v_edit_config_rev' => 'vtpVlanEditConfigRevNumber',
    + 'v_edit_modified_vlan' => 'vtpVlanEditModifiedVlan',
    +
    # vtpVlanEditTable
    + 'v_edit_vlan_index' => 'vtpVlanEditIndex',
    + 'v_edit_vlan_state' => 'vtpVlanEditState',
    + 'v_edit_vlan_type' => 'vtpVlanEditType',
    + 'v_edit_vlan_name' => 'vtpVlanEditName',
    # vtpStatsTable
    );

    %MUNGE = (
    + 'i_pvid' => \&munge_pvid,
    );

    +sub munge_pvid {
    + my $pvid = shift;
    + return undef if $pvid == 1;
    + return $pvid;
    +}
    +
    +
    +
    sub v_index {
    my $vtp = shift;
    my $partial = shift;
    @@ -173,7 +197,6 @@
    $i_vlans{$iid} = $vlan;
    }
    }
    -
    return \%i_vlans;
    }

    @@ -182,6 +205,9 @@
    my $partial = shift;

    my $ports_vlans = $vtp->vtp_trunk_vlans($partial) || {};
    + my $ports_vlans_2k = $vtp->vtp_trunk_vlans_2k($partial) || {};
    + my $ports_vlans_3k = $vtp->vtp_trunk_vlans_3k($partial) || {};
    + my $ports_vlans_4k = $vtp->vtp_trunk_vlans_4k($partial) || {};
    my $vtp_vlans = $vtp->v_state();
    my $i_vlan = $vtp->i_vlan2($partial) || {};
    my $trunk_dyn_stat = $vtp->vtp_trunk_dyn_stat($partial) || {};
    @@ -199,9 +225,7 @@
    }

    # Get trunk ports
    - foreach my $port (keys %$ports_vlans) {
    - my $vlanlist = [split(//, unpack("B*", $ports_vlans->{$port}))];
    -
    + my %oper_vlans;
    foreach my $iid (keys %$vtp_vlans) {
    my $vlan = 0;
    my $vtp_dom =0;
    @@ -212,10 +236,38 @@
    $vtp_dom = $1;
    $vlan = $2;
    }
    + $oper_vlans{$vlan}++;
    + }

    + foreach my $port (keys %$ports_vlans) {
    + my $vlanlist = [split(//, unpack("B*", $ports_vlans->{$port}))];
    + foreach my $vlan (keys %oper_vlans) {
    push(@{$i_vlan_membership->{$port}}, $vlan) if (@$vlanlist[$vlan]);
    }
    }
    +
    + foreach my $port (keys %$ports_vlans_2k) {
    + my $vlanlist = [split(//, unpack("B*", $ports_vlans_2k->{$port}))];
    + foreach my $vlan (keys %oper_vlans) {
    + push(@{$i_vlan_membership->{$port}}, $vlan) if (@$vlanlist[$vlan-1024]);
    + }
    + }
    +
    + foreach my $port (keys %$ports_vlans_3k) {
    + my $vlanlist = [split(//, unpack("B*", $ports_vlans_3k->{$port}))];
    + foreach my $vlan (keys %oper_vlans) {
    + push(@{$i_vlan_membership->{$port}}, $vlan) if (@$vlanlist[$vlan-2048]);
    + }
    + }
    +
    + foreach my $port (keys %$ports_vlans_4k) {
    + my $vlanlist = [split(//, unpack("B*", $ports_vlans_4k->{$port}))];
    + foreach my $vlan (keys %oper_vlans) {
    + push(@{$i_vlan_membership->{$port}}, $vlan) if (@$vlanlist[$vlan-3072]);
    + }
    + }
    +
    +
    return $i_vlan_membership;
    }

     
  • Carlos Vicente

    Carlos Vicente - 2007-11-13

    Logged In: YES
    user_id=1070425
    Originator: YES

    Any news on this patch (or the alternative one submitted by arcanez)? Thanks. cv

     
  • Eric A. Miller

    Eric A. Miller - 2007-11-21

    Logged In: YES
    user_id=1135238
    Originator: NO

    Committed to CVS. Thanks.

     
  • Eric A. Miller

    Eric A. Miller - 2007-11-21
    • milestone: --> v1.05
    • assigned_to: nobody --> jeneric
    • status: open --> closed-accepted