lib/packetgen/header/ospfv2/lsa.rb in packetgen-2.8.7 vs lib/packetgen/header/ospfv2/lsa.rb in packetgen-3.0.0
- old
+ new
@@ -72,11 +72,11 @@
# @return [ArrayOfTosMetric]
define_field :tos, ArrayOfTosMetric, builder: ->(h, t) { t.new(counter: h[:tos_count]) }
# @return [String]
def to_human
- "Link<type:#{type},metric:#{metric},id:#{id},data:#{data}>"
+ "<type:#{type},metric:#{metric},id:#{id},data:#{data}>"
end
end
# This class defines a specialized {Types::Array array} to handle series
# of {Link Links}.
@@ -127,11 +127,12 @@
# @return [IP::Addr]
define_field :netmask, IP::Addr
# @!attribute routers
# List of routers in network
# @return [IP::ArrayOfAddr]
- define_field :routers, IP::ArrayOfAddr
+ define_field :routers, IP::ArrayOfAddr,
+ builder: ->(h, t) { t.new(length_from: -> { h.length - 24 }) }
end
# This class handles external links in {LSAASExternal LSA AS-External payloads}.
# @author Sylvain Daubert
class External < Types::Fields
@@ -151,10 +152,15 @@
# @!attribute e_flag
# @return [Boolean]
# @!attribute tos
# @return [Integer]
define_bit_fields_on :u8, :e_flag, :tos, 7
+
+ # @return [String]
+ def to_human
+ "<type:#{e_flag? ? 2 : 1},tos:#{tos},metric:#{metric},fwaddr:#{forwarding_addr},tag:#{ext_route_tag}>"
+ end
end
# This class defines a specialized {Types::Array array} to handle series
# of {External Externals}.
# @author Sylvain Daubert
@@ -174,49 +180,29 @@
# @return [IP::Addr]
define_field :netmask, IP::Addr
# @!attribute externals
# List of external destinations
# @return [ArrayOfExternal]
- define_field :externals, ArrayOfExternal
+ define_field :externals, ArrayOfExternal,
+ builder: ->(h, t) { t.new(length_from: -> { h.length - 24 }) }
end
# This class defines a specialized {Types::Array array} to handle series
# of {LSA LSAs}. It recognizes known LSA types and infers correct type.
# @author Sylvain Daubert
class ArrayOfLSA < Types::Array
- set_of LSA
+ set_of LSAHeader
# @param [Hash] options
# @option options [Types::Int] counter Int object used as a counter for this set
# @option options [Boolean] only_headers if +true+, only {LSAHeader LSAHeaders}
# will be added to this array.
def initialize(options={})
super()
@only_headers = options[:only_headers] || false
end
- # Populate object from a string
- # @param [String] str
- # @return [self]
- def read(str)
- clear
- return self if str.nil?
- return self if @counter && @counter.to_i.zero?
- force_binary str
- until str.empty?
- lsa = LSAHeader.new.read(str)
- unless @only_headers
- klass = get_lsa_class_by_human_type(lsa.human_type)
- lsa = klass.new.read(str[0...lsa.length])
- end
- self.push lsa
- str.slice!(0, lsa.sz)
- break if @counter && (self.size == @counter.to_i)
- end
- self
- end
-
private
def record_from_hash(hsh)
unless hsh.key? :type
raise ArgumentError, 'hash should have :type key'
@@ -242,9 +228,13 @@
if OSPFv2.const_defined? klassname
OSPFv2.const_get klassname
else
LSA
end
+ end
+
+ def real_type(lsah)
+ @only_headers ? lsah.class : get_lsa_class_by_human_type(lsah.human_type)
end
end
end
end
end