Class: PacketGen::Header::GRE

Inherits:
Base
  • Object
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) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

A GRE header is composed of:

Current implementation supports tunneling IP and IPv6 packets in GRE.

Author:

  • Sylvain Daubert

  • LemonTree55

Since:

  • 2.1.0

Constant Summary collapse

IP_PROTOCOL =

IP protocol number for GRE

Since:

  • 2.1.0

47

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from Base

bind, calculate_and_set_length, #header_id, inherited, #ip_header, #ll_header

Methods included from PacketGen::Headerable

#added_to_packet, included, #method_name, #packet, #packet=, #parse?, #protocol_name, #read, #to_s

Constructor Details

#initialize(options = {}) ⇒ GRE

Returns a new instance of GRE.

Since:

  • 2.1.0



87
88
89
90
# File 'lib/packetgen/header/gre.rb', line 87

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

Instance Attribute Details

#body ⇒ BinStruct::String, Headerable

Returns:



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

define_attr :body, BinStruct::String

#c ⇒ Boolean

Say if #checksum and #reserved1 attributes are present

Returns:

  • (Boolean)


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

define_bit_attr :u16, c: 1, r: 1, k: 1, s: 1, reserved0: 9, ver: 3

#checksum ⇒ Integer

IP checksum over all 16-bit words in GRE header and its body. Present only if #c is set.

Returns:

  • (Integer)


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

define_attr :checksum, BinStruct::Int16, default: 0, optional: lambda(&:c?)

#k ⇒ Boolean

Say if #key attribute is present

Returns:

  • (Boolean)


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

define_bit_attr :u16, c: 1, r: 1, k: 1, s: 1, reserved0: 9, ver: 3

#key ⇒ Integer

32-bit integer used to identify an individual traffic flow within a tunnel. Present only if #k is set.

Returns:

  • (Integer)


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

define_attr :key, BinStruct::Int32, optional: lambda(&:k?)

#protocol_type ⇒ Integer

Returns:

  • (Integer)


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

define_attr :protocol_type, BinStruct::Int16

#reserved0 ⇒ Integer

Returns:

  • (Integer)


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

define_bit_attr :u16, c: 1, r: 1, k: 1, s: 1, reserved0: 9, ver: 3

#reserved1 ⇒ Integer

Reserved field, present only if #c is set.

Returns:

  • (Integer)


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

define_attr :reserved1, BinStruct::Int16, default: 0, optional: lambda(&:c?)

#s ⇒ Boolean

Say if #sequence_number attribute is present

Returns:

  • (Boolean)


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

define_bit_attr :u16, c: 1, r: 1, k: 1, s: 1, reserved0: 9, ver: 3

#sequence_number ⇒ Integer Also known as: seqnum

32-bit integer. Present only if #s is set.

Returns:

  • (Integer)


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

define_attr :sequence_number, BinStruct::Int32, optional: lambda(&:s?)

#ver ⇒ Integer

3-bit GRE protocol version.

Returns:

  • (Integer)


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

define_bit_attr :u16, c: 1, r: 1, k: 1, s: 1, reserved0: 9, ver: 3

Instance Method Details

#calc_checksum ⇒ Integer

Compute checksum and set checksum attribute.

Returns:

  • (Integer)

Since:

  • 2.1.0



94
95
96
97
# File 'lib/packetgen/header/gre.rb', line 94

def calc_checksum
  sum = IP.sum16(self)
  self.checksum = IP.reduce_checksum(sum)
end