class ReassembleTcp::PacketStream

packet stream for the same direction and sequence(or acknowledge) number

Attributes

direction[R]
pkts[R]
range[R]
seq_ack_num[R]

Public Class Methods

new(direction, pkt) click to toggle source

@param [Symbol] direction :send or :recv @param [PacketFu::Packet] pkt packet

# File lib/reassemble_tcp/packet_stream.rb, line 9
def initialize(direction, pkt)
  case direction
  when :send
    @seq_ack_num = pkt.tcp_seq.to_i
  when :recv
    @seq_ack_num = pkt.tcp_ack.to_i
  else
    raise ArgumentError, "direction should be :send or :recv"
  end
  @direction = direction
  @range = pkt.timestamp..pkt.timestamp
  @pkts = [pkt]
end

Public Instance Methods

<<(direction, pkt)
Alias for: append
append(direction, pkt) click to toggle source

@param [Symbol] direction :send or :recv @param [PacketFu::Packet] pkt packet @return [Array<PacketFu::Packet>]

# File lib/reassemble_tcp/packet_stream.rb, line 26
def append(direction, pkt)
  raise ArgumentError unless match?(direction, pkt)
  @pkts << pkt
  @range = Range.new(*[@range.begin, @range.end, pkt.timestamp].minmax)
  @pkts
end
Also aliased as: <<
data() click to toggle source

reassemble tcp stream data @return [String] reassembled data

# File lib/reassemble_tcp/packet_stream.rb, line 49
def data
  pkts = @pkts.sort_by!{|pk| pk.timestamp }
  pkts.map{|pkt| pkt.payload }.select{|pay| pay !~ /\A\0+\Z/}.compact.join
end
last_timestamp() click to toggle source

@return [Float] unix time value

# File lib/reassemble_tcp/packet_stream.rb, line 35
def last_timestamp
  @range.last
end
match?(direction, pkt) click to toggle source

@param [Symbol] direction :send or :recv @param [PacketFu::Packet] pkt packet @return [Boolean]

# File lib/reassemble_tcp/packet_stream.rb, line 42
def match?(direction, pkt)
  num = (direction == :send) ?  pkt.tcp_seq.to_i : pkt.tcp_ack.to_i
  @direction == direction && @seq_ack_num == num
end