125 lines
4.0 KiB
Ruby
125 lines
4.0 KiB
Ruby
|
# $Id: vtp.rb 127 2009-11-29 01:30:46Z jhart $
|
||
|
#
|
||
|
# Copyright (c) 2008, Jon Hart
|
||
|
# 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 <organization> 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 Jon Hart ``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 Jon Hart 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.
|
||
|
#
|
||
|
module Racket
|
||
|
module L2
|
||
|
# VLAN Trunking Protocol (VTP)
|
||
|
# http://en.wikipedia.org/wiki/VLAN_Trunking_Protocol
|
||
|
# http://www.cisco.com/en/US/tech/tk389/tk689/technologies_tech_note09186a0080094c52.shtml
|
||
|
# This is just a base class from which all VTP messages inherit and should never be used directly
|
||
|
class VTPGeneric < RacketPart
|
||
|
# VTP version (1-3)
|
||
|
unsigned :version, 8
|
||
|
# Message code (summary advertisement, subset advertisement, advertisement request, VTP join)
|
||
|
unsigned :code, 8
|
||
|
# Sometimes used, sometimes not, depends on the type
|
||
|
unsigned :reserved, 8
|
||
|
# Length of the management domain
|
||
|
unsigned :domain_length, 8
|
||
|
# management domain name, zero padded to 32 bytes
|
||
|
text :domain, 256
|
||
|
|
||
|
# Adjust +domain_length+ and +domain+ accordingly prior to sending
|
||
|
def fix!
|
||
|
self.domain_length = self.domain.length
|
||
|
self.domain = self.domain.ljust(32, "\x00")
|
||
|
end
|
||
|
end
|
||
|
|
||
|
# A raw VTP message
|
||
|
class VTPRaw < VTPGeneric
|
||
|
rest :payload
|
||
|
end
|
||
|
|
||
|
class VTPSubsetAdvertisement < VTPGeneric
|
||
|
# Configuration revision
|
||
|
unsigned :revision, 32
|
||
|
# all of the vlan info fields
|
||
|
rest :payload
|
||
|
|
||
|
def add_vlan_info(status, type, id, mtu, index, name)
|
||
|
name_length = name.length
|
||
|
# zero pad name to a multiple of 4 bytes
|
||
|
name = name.length % 4 == 0 ? name : name.ljust(name.length + (4 - (name.length % 4)), "\x00")
|
||
|
length = 12 + name.length
|
||
|
@vlan_info << [length, status, type, name_length, id, mtu, index, name]
|
||
|
end
|
||
|
|
||
|
def fix!
|
||
|
@vlan_info.each do |v|
|
||
|
self.payload += v.pack("CCCCnnNa*")
|
||
|
end
|
||
|
super
|
||
|
end
|
||
|
|
||
|
def initialize(*args)
|
||
|
@vlan_info = []
|
||
|
super(*args)
|
||
|
self.code = 2
|
||
|
end
|
||
|
end
|
||
|
|
||
|
class VTPSummaryAdvertisement < VTPGeneric
|
||
|
# Configuration revision number
|
||
|
unsigned :revision, 32
|
||
|
# Updater identity (IP)
|
||
|
octets :updater, 32
|
||
|
# update timestamp
|
||
|
unsigned :timestamp, 96
|
||
|
# MD5 digest of VTP password
|
||
|
text :md5, 128
|
||
|
rest :payload
|
||
|
|
||
|
def initialize(*args)
|
||
|
super(*args)
|
||
|
self.code = 1
|
||
|
end
|
||
|
end
|
||
|
|
||
|
class VTPAdvertisementRequest < VTPGeneric
|
||
|
# This is used in cases in which there are several subset advertisements. If the first (n) subset advertisement has been received and the subsequent one (n+1) has not been received, the Catalyst only requests advertisements from the (n+1)th one.
|
||
|
unsigned :start, 32
|
||
|
rest :payload
|
||
|
def initialize(*args)
|
||
|
super(*args)
|
||
|
self.code = 3
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
|
||
|
class VTPJoin < VTPGeneric
|
||
|
def initialize(*args)
|
||
|
super(*args)
|
||
|
self.code = 4
|
||
|
end
|
||
|
end
|
||
|
|
||
|
end
|
||
|
end
|
||
|
# vim: set ts=2 et sw=2:
|