Class: PacketGen::Header::IKE::Payload

Inherits:
Base show all
Defined in:
lib/packetgen/header/ike/payload.rb

Overview

Base class for IKE payloads. This class may also be used for unknown payloads.

This class handles generic IKE payload header:

                     1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Next Payload  |C|  RESERVED   |         Payload Length        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

to which a #content field is added to handle content of unknown payload types.

Author:

  • Sylvain Daubert

Since:

  • 2.0.0

Direct Known Subclasses

Auth, Cert, IDi, KE, Nonce, Notify, SA, SK, TSi, VendorID

Instance Attribute Summary collapse

Attributes inherited from Base

#packet

Instance Method Summary collapse

Methods inherited from Base

#added_to_packet, bind, bind_header, calculate_and_set_length, #header_id, inherited, #ip_header, known_headers, #ll_header, #method_name, #parse?, #protocol_name, protocol_name

Methods inherited from Types::Fields

#[], #[]=, #bits_on, #body=, define_bit_fields_on, define_field, define_field_after, define_field_before, delete_field, fields, #fields, #force_binary, inherited, #inspect, #is_optional?, #is_present?, #offset_of, #optional?, #optional_fields, #present?, remove_bit_fields_on, remove_field, #sz, #to_h, #to_s, update_field

Constructor Details

#initialize(options = {}) ⇒ Payload

Returns a new instance of Payload.

Since:

  • 2.0.0



50
51
52
53
# File 'lib/packetgen/header/ike/payload.rb', line 50

def initialize(options={})
  super
  self[:length].value = sz unless options[:length]
end

Instance Attribute Details

#contentString

Payload content. Depends on payload. Variable length.

Returns:

  • (String)


37
# File 'lib/packetgen/header/ike/payload.rb', line 37

define_field :content, Types::String

#criticalBoolean

critical flag

Returns:

  • (Boolean)


48
# File 'lib/packetgen/header/ike/payload.rb', line 48

define_bit_fields_on :flags, :critical, :hreserved, 7

#flagsInteger

8-bit flags

Returns:

  • (Integer)


29
# File 'lib/packetgen/header/ike/payload.rb', line 29

define_field :flags, Types::Int8

#hreservedInteger

reserved part of #flags field

Returns:

  • (Integer)


48
# File 'lib/packetgen/header/ike/payload.rb', line 48

define_bit_fields_on :flags, :critical, :hreserved, 7

#lengthInteger

16-bit payload total length, including generic payload header

Returns:

  • (Integer)


33
# File 'lib/packetgen/header/ike/payload.rb', line 33

define_field :length, Types::Int16

#nextInteger

8-bit next payload

Returns:

  • (Integer)


25
# File 'lib/packetgen/header/ike/payload.rb', line 25

define_field :next, Types::Int8

Instance Method Details

#base_readObject

Since:

  • 2.0.0



56
# File 'lib/packetgen/header/ike/payload.rb', line 56

alias base_read read

#calc_lengthInteger

Compute length and set #length field

Returns:

  • (Integer)

    new length

Since:

  • 2.0.0



75
76
77
78
79
# File 'lib/packetgen/header/ike/payload.rb', line 75

def calc_length
  # Here, #body is next payload, so body size should not be taken in
  # account (payload's real body is #content).
  self[:length].value = sz - body.sz
end

#read(str) ⇒ self

Populate object from a string

Parameters:

  • str (String)

Returns:

  • (self)

Since:

  • 2.0.0



61
62
63
64
65
66
67
68
69
70
71
# File 'lib/packetgen/header/ike/payload.rb', line 61

def read(str)
  base_read str
  unless self[:content].nil?
    content_length = length - self.class.new.sz
    if content_length >= 0
      self[:body] = self[:content][content_length..-1]
      self[:content] = self[:content][0, content_length]
    end
  end
  self
end