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