Class: PacketGen::Header::OSPFv2

Inherits:
Base show all
Defined in:
lib/packetgen/header/ospfv2.rb,
lib/packetgen/header/ospfv2/lsa.rb,
lib/packetgen/header/ospfv2/hello.rb,
lib/packetgen/header/ospfv2/ls_ack.rb,
lib/packetgen/header/ospfv2/ls_update.rb,
lib/packetgen/header/ospfv2/ls_request.rb,
lib/packetgen/header/ospfv2/lsa_header.rb,
lib/packetgen/header/ospfv2/db_description.rb

Overview

This class supports OSPFv2 (RFC 2328). A OSPFv2 header has the following format:

 0                   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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Version #   |     Type      |         Packet length         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Router ID                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           Area ID                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Checksum            |             AuType            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Authentication                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Authentication                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

An OSPFv2 header consists of:

Create an OSPFv2 header

# standalone
ospf = PacketGen::Header::OSPFv2.new
# in a packet
pkt = PacketGen.gen('IP', src: source_ip).add('OSPFv2')
# make IP header correct for OSPF
pkt.ospfize
# or make it correct with specific destination address
pkt.ospfize(dst: :all_spf_routers)
# access to OSPF header
pkt.ospfv2    # => PacketGen::Header::OSPFv2

OSPFv2 attributes

ospf.version              # => 2
ospf.type = 'LS_ACK'      # or 5
ospf.length = 154
ospf.router_id = 0xc0a80001
ospf.area_id = 1
ospf.checksum = 0xabcd
ospf.au_type = 'NO_AUTH'  # or 0
ospf.authentication = 0

OSPFv2 body

OSPFv2 #body should contain OSPF payload for given #type:

Author:

  • Sylvain Daubert

Since:

  • 2.5.0

Defined Under Namespace

Classes: ArrayOfExternal, ArrayOfLSA, ArrayOfLSR, ArrayOfLink, ArrayOfTosMetric, DbDescription, External, Hello, LSA, LSAASExternal, LSAHeader, LSANetwork, LSARouter, LSAck, LSR, LSRequest, LSUpdate, Link, TosMetric

Constant Summary collapse

IP_PROTOCOL =

IP protocol number for OSPF

Since:

  • 2.5.0

89
TYPES =

OSPF packet types

Since:

  • 2.5.0

{
  'HELLO' => 1,
  'DB_DESCRIPTION' => 2,
  'LS_REQUEST' => 3,
  'LS_UPDATE' => 4,
  'LS_ACK' => 5
}.freeze
AU_TYPES =

Authentication types

Since:

  • 2.5.0

{
  'NO_AUTH' => 0,
  'PASSWORD' => 1,
  'CRYPTO' => 2,
  'CRYPTO_WITH_ESN' => 3
}.freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Base

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

Methods included from PacketGen::Headerable

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

Methods inherited from Types::Fields

#[], #[]=, #bits_on, define_bit_fields_on, define_field, define_field_after, define_field_before, #fields, fields, inherited, #initialize, #inspect, #offset_of, #optional?, #optional_fields, #present?, #read, remove_bit_fields_on, remove_field, #sz, #to_h, #to_s, update_field

Constructor Details

This class inherits a constructor from PacketGen::Header::Base

Instance Attribute Details

#area_idInteger

32-bit area ID

Returns:

  • (Integer)


112
# File 'lib/packetgen/header/ospfv2.rb', line 112

define_field :area_id, Types::Int32

#au_typeInteger

16-bit authentication type. Types are defined in AU_TYPES.

Returns:

  • (Integer)


120
# File 'lib/packetgen/header/ospfv2.rb', line 120

define_field :au_type, Types::Int16Enum, enum: AU_TYPES

#authenticationInteger

64-bit authentication data

Returns:

  • (Integer)


124
# File 'lib/packetgen/header/ospfv2.rb', line 124

define_field :authentication, Types::Int64

#bodyString, Base

Returns:



127
# File 'lib/packetgen/header/ospfv2.rb', line 127

define_field :body, Types::String

#checksumInteger

16-bit OSPF packet checksum

Returns:

  • (Integer)


116
# File 'lib/packetgen/header/ospfv2.rb', line 116

define_field :checksum, Types::Int16

#lengthInteger

16-bit OSPF packet length

Returns:

  • (Integer)


104
# File 'lib/packetgen/header/ospfv2.rb', line 104

define_field :length, Types::Int16

#router_idInteger

32-bit router ID

Returns:

  • (Integer)


108
# File 'lib/packetgen/header/ospfv2.rb', line 108

define_field :router_id, Types::Int32

#typeInteger

8-bit OSPF packet type. Types are defined in TYPES.

Returns:

  • (Integer)


100
# File 'lib/packetgen/header/ospfv2.rb', line 100

define_field :type, Types::Int8Enum, enum: TYPES

#versionInteger

8-bit OSPF version

Returns:

  • (Integer)


96
# File 'lib/packetgen/header/ospfv2.rb', line 96

define_field :version, Types::Int8, default: 2

Class Method Details

.define_options(hdr) ⇒ void

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

This method returns an undefined value.

Helper class method to define an OSPFv2 options field.

Parameters:

  • hdr (Base)

    header on which define a OSPFv2 options field

Since:

  • 2.5.0



159
160
161
162
163
# File 'lib/packetgen/header/ospfv2.rb', line 159

def self.define_options(hdr)
  hdr.define_field :options, Types::Int8
  hdr.define_bit_fields_on :options, :dn_opt, :o_opt, :dc_opt, :l_opt,
                           :n_opt, :mc_opt, :e_opt, :mt_opt
end

Instance Method Details

#added_to_packet(packet) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Note:

This method is used internally by PacketGen and should not be directly called

Since:

  • 2.5.0



168
169
170
171
# File 'lib/packetgen/header/ospfv2.rb', line 168

def added_to_packet(packet)
  ospf_idx = packet.headers.size
  packet.instance_eval "def ospfize(**kwargs) @headers[#{ospf_idx}].ospfize(**kwargs); end" # def ospfize(**kwargs) @headers[2].ospfize(**kwargs); end
end

#calc_checksumInteger

Compute checksum and set checksum field

Returns:

  • (Integer)

Since:

  • 2.5.0



175
176
177
178
179
180
181
182
183
184
185
186
187
188
# File 'lib/packetgen/header/ospfv2.rb', line 175

def calc_checksum
  # #authentication field is not used in checksum calculation,
  # so force it to 0 before checksumming
  saved_auth = self.authentication
  self.authentication = 0

  sum = IP.sum16(self)
  self.checksum = IP.reduce_checksum(sum)

  # Restore #authentication value
  self.authentication = saved_auth

  self.checksum
end

#calc_lengthInteger

Compute length and set length field

Returns:

  • (Integer)

Since:

  • 2.5.0



204
205
206
# File 'lib/packetgen/header/ospfv2.rb', line 204

def calc_length
  self[:length].value = Base.calculate_and_set_length(self)
end

#human_au_typeString

Get human-readable AU type

Returns:

  • (String)

Since:

  • 2.5.0



198
199
200
# File 'lib/packetgen/header/ospfv2.rb', line 198

def human_au_type
  self[:au_type].to_human
end

#human_typeString

Get human-readable type

Returns:

  • (String)

Since:

  • 2.5.0



192
193
194
# File 'lib/packetgen/header/ospfv2.rb', line 192

def human_type
  self[:type].to_human
end

#ospfize(dst: nil) ⇒ void

This method returns an undefined value.

Fixup IP header according to RFC 2328:

  • set TOS field to 0xc0,

  • optionally set destination address,

  • set TTL to 1 if destination is a mcast address.

This method may be called as:

# first way
pkt.ospfv2.ospfize
# second way
pkt.ospfize

Parameters:

  • dst (String, Symbol, nil) (defaults to: nil)

    destination address. May be a dotted IP address (by example ‘224.0.0.5’) or a Symbol (:all_spf_routers or :all_d_routers)

Since:

  • 2.5.0



221
222
223
224
225
226
227
228
229
230
231
232
233
234
# File 'lib/packetgen/header/ospfv2.rb', line 221

def ospfize(dst: nil)
  ip = ip_header(self)
  ip.tos = 0xc0
  dst = case dst
        when :all_spf_routers
          '224.0.0.5'
        when :all_d_routers
          '224.0.0.6'
        else
          dst
        end
  ip.dst = dst unless dst.nil?
  ip.ttl = 1 if ip[:dst].mcast?
end