Class: PacketGen::Header::GRE

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

Overview

Generic Routing Encapsulation (RFC 2784 and 2890)

                     1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|C| |K|S| Reserved0       | Ver |         Protocol Type         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      Checksum (optional)      |       Reserved1 (Optional)    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Key (optional)                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                 Sequence Number (Optional)                    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Author:

  • Sylvain Daubert

Constant Summary collapse

IP_PROTOCOL =

IP protocol number for GRE

47

Instance Attribute Summary collapse

Attributes inherited from Base

#packet

Instance Method Summary collapse

Methods inherited from Base

bind_header, #header_id, inherited, #ip_header, known_headers, #method_name, #parse?, protocol_name, #protocol_name

Methods inherited from Types::Fields

#[], #[]=, define_bit_fields_on, define_field, define_field_after, define_field_before, delete_field, #fields, #force_binary, inherited, #inspect, #is_optional?, #is_present?, #optional_fields, #read, #sz, #to_h, #to_s

Constructor Details

#initialize(options = {}) ⇒ GRE

Returns a new instance of GRE.



63
64
65
66
# File 'lib/packetgen/header/gre.rb', line 63

def initialize(options={})
  opts = { r: false, reserved0: 0, version: 0 }.merge(options)
  super(opts)
end

Instance Attribute Details

#bodyTypes::String, Header::Base



58
# File 'lib/packetgen/header/gre.rb', line 58

define_field :body, Types::String

#cBoolean

Returns:

  • (Boolean)


39
# File 'lib/packetgen/header/gre.rb', line 39

define_bit_fields_on :u16, :c, :r, :k, :s, :reserved0, 9, :ver, 3

#checksumInteger

Returns:

  • (Integer)


46
# File 'lib/packetgen/header/gre.rb', line 46

define_field :checksum, Types::Int16, default: 0, optional: ->(gre) { gre.c? }

#kBoolean

Returns:

  • (Boolean)


39
# File 'lib/packetgen/header/gre.rb', line 39

define_bit_fields_on :u16, :c, :r, :k, :s, :reserved0, 9, :ver, 3

#keyInteger

Returns:

  • (Integer)


52
# File 'lib/packetgen/header/gre.rb', line 52

define_field :key, Types::Int32, optional: ->(gre) { gre.k? }

#protocol_typeInteger

Returns:

  • (Integer)


43
# File 'lib/packetgen/header/gre.rb', line 43

define_field :protocol_type, Types::Int16

#reserved0Integer

Returns:

  • (Integer)


39
# File 'lib/packetgen/header/gre.rb', line 39

define_bit_fields_on :u16, :c, :r, :k, :s, :reserved0, 9, :ver, 3

#reserved1Integer

Returns:

  • (Integer)


49
# File 'lib/packetgen/header/gre.rb', line 49

define_field :reserved1, Types::Int16, default: 0, optional: ->(gre) { gre.c? }

#sBoolean

Returns:

  • (Boolean)


39
# File 'lib/packetgen/header/gre.rb', line 39

define_bit_fields_on :u16, :c, :r, :k, :s, :reserved0, 9, :ver, 3

#sequence_numberInteger Also known as: seqnum

Returns:

  • (Integer)


55
# File 'lib/packetgen/header/gre.rb', line 55

define_field :sequence_number, Types::Int32, optional: ->(gre) { gre.s? }

#verInteger

Returns:

  • (Integer)


39
# File 'lib/packetgen/header/gre.rb', line 39

define_bit_fields_on :u16, :c, :r, :k, :s, :reserved0, 9, :ver, 3

Instance Method Details

#calc_checksumInteger

Compute checksum and set checksum field

Returns:

  • (Integer)


70
71
72
73
74
75
76
77
78
79
80
# File 'lib/packetgen/header/gre.rb', line 70

def calc_checksum
  str = to_s
  str << "\x00" if str.length % 2 == 1
  sum = str.unpack('n*').reduce(:+)

  while sum > 0xffff do
    sum = (sum & 0xffff) + (sum >> 16)
  end
  sum = ~sum & 0xffff
  self[:checksum].value = (sum == 0) ? 0xffff : sum
end