lib/packetgen/packet.rb in packetgen-1.3.0 vs lib/packetgen/packet.rb in packetgen-1.4.0
- old
+ new
@@ -317,15 +317,18 @@
protocol = header.protocol_name
prev_header = previous_header || @headers.last
if prev_header
bindings = prev_header.class.known_headers[header.class]
if bindings.nil?
- msg = "#{prev_header.class} knowns no layer association with #{protocol}. "
- msg << "Try #{prev_header.class}.bind_layer(PacketGen::Header::#{protocol}, "
- msg << "#{prev_header.protocol_name.downcase}_proto_field: "
- msg << "value_for_#{protocol.downcase})"
- raise ArgumentError, msg
+ bindings = prev_header.class.known_headers[header.class.superclass]
+ if bindings.nil?
+ msg = "#{prev_header.class} knowns no layer association with #{protocol}. "
+ msg << "Try #{prev_header.class}.bind_layer(PacketGen::Header::#{protocol}, "
+ msg << "#{prev_header.protocol_name.downcase}_proto_field: "
+ msg << "value_for_#{protocol.downcase})"
+ raise ArgumentError, msg
+ end
end
bindings.set(prev_header) if !bindings.empty? and !parsing
prev_header[:body] = header
end
header.packet = self
@@ -357,19 +360,20 @@
decode_packet_bottom_up = true
while decode_packet_bottom_up do
last_known_hdr = @headers.last
search_header(last_known_hdr) do |nh|
str = last_known_hdr.body
- add_header nh.new, parsing: true
- @headers[-1, 1] = @headers.last.read(str)
+ nheader = nh.new
+ nheader = nheader.read(str)
+ add_header nheader, parsing: true
end
decode_packet_bottom_up = (@headers.last != last_known_hdr)
end
end
def search_header(hdr)
hdr.class.known_headers.each do |nh, bindings|
- if bindings.check?(hdr)
+ if bindings.check?(hdr) and hdr.parse?
yield nh
break
end
end
end