Class: PacketGen::Header::OSPFv3

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

Overview

This class supports OSPFv3 (RFC 5340). A OSPFv3 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             |  Instance ID  |      0        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

An OSPFv3 header consists of:

Create an OSPFv3 header

# standalone
ospf = PacketGen::Header::OSPFv3.new
# in a packet
pkt = PacketGen.gen('IPv6', src: source_ip).add('OSPFv3')
# make IPv6 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.ospfv3    # => PacketGen::Header::OSPFv3

OSPFv3 attributes

ospf.version              # => 3
ospf.type = 'LS_ACK'      # or 5
ospf.length = 154
ospf.router_id = 0xc0a80001
ospf.area_id = 1
ospf.checksum = 0xabcd
ospf.instance_id = 0

OSPFv3 body

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

Author:

  • Sylvain Daubert

Since:

  • 2.5.0

Defined Under Namespace

Classes: ArrayOfIPv6Prefix, ArrayOfLSA, ArrayOfLSR, ArrayOfLink, DbDescription, Hello, IPv6Prefix, LSA, LSAHeader, LSAIntraAreaPrefix, LSALink, LSANetwork, LSARouter, LSAck, LSR, LSRequest, LSUpdate, Link

Constant Summary collapse

IP_PROTOCOL =

IP protocol number for OSPF

Since:

  • 2.5.0

OSPFv2::IP_PROTOCOL
TYPES =

OSPF packet types

Since:

  • 2.5.0

OSPFv2::TYPES

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)


93
# File 'lib/packetgen/header/ospfv3.rb', line 93

define_field :area_id, Types::Int32

#bodyString, Base

Returns:



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

define_field :body, Types::String

#checksumInteger

16-bit OSPF packet checksum

Returns:

  • (Integer)


97
# File 'lib/packetgen/header/ospfv3.rb', line 97

define_field :checksum, Types::Int16

#instance_idInteger

8-bit instance ID.

Returns:

  • (Integer)


101
# File 'lib/packetgen/header/ospfv3.rb', line 101

define_field :instance_id, Types::Int8

#lengthInteger

16-bit OSPF packet length

Returns:

  • (Integer)


85
# File 'lib/packetgen/header/ospfv3.rb', line 85

define_field :length, Types::Int16

#reservedInteger

8-bit reserved field.

Returns:

  • (Integer)


105
# File 'lib/packetgen/header/ospfv3.rb', line 105

define_field :reserved, Types::Int8, default: 0

#router_idInteger

32-bit router ID

Returns:

  • (Integer)


89
# File 'lib/packetgen/header/ospfv3.rb', line 89

define_field :router_id, Types::Int32

#typeInteger

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

Returns:

  • (Integer)


81
# File 'lib/packetgen/header/ospfv3.rb', line 81

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

#versionInteger

8-bit OSPF version

Returns:

  • (Integer)


77
# File 'lib/packetgen/header/ospfv3.rb', line 77

define_field :version, Types::Int8, default: 3

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 OSPFv3 options field.

Parameters:

  • hdr (Base)

    header on which define a OSPFv3 options field

Since:

  • 2.5.0



138
139
140
141
142
# File 'lib/packetgen/header/ospfv3.rb', line 138

def self.define_options(hdr)
  hdr.define_field :options, Types::Int24
  hdr.define_bit_fields_on :options, :z, 18, :dc_opt, :r_opt,
                           :n_opt, :x_opt, :e_opt, :v6_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



147
148
149
150
# File 'lib/packetgen/header/ospfv3.rb', line 147

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



154
155
156
157
158
159
160
161
# File 'lib/packetgen/header/ospfv3.rb', line 154

def calc_checksum
  ipv6 = ip_header(self)
  sum = ipv6.pseudo_header_checksum
  sum += IP_PROTOCOL
  sum += self.sz
  sum += IP.sum16(self)
  self.checksum = IP.reduce_checksum(sum)
end

#calc_lengthInteger

Compute length and set length field

Returns:

  • (Integer)

Since:

  • 2.5.0



171
172
173
# File 'lib/packetgen/header/ospfv3.rb', line 171

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

#human_typeString

Get human-readable type

Returns:

  • (String)

Since:

  • 2.5.0



165
166
167
# File 'lib/packetgen/header/ospfv3.rb', line 165

def human_type
  self[:type].to_human
end

#ospfize(dst: nil) ⇒ void

This method returns an undefined value.

Fixup IPv6 header according to RFC 5340:

  • set Traffic Class field to 0xc0,

  • optionally set destination address,

  • set Hop-limit to 1 if destination is a mcast address.

This method may be called as:

# first way
pkt.ospfv3.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



188
189
190
191
192
193
194
195
196
197
198
199
200
201
# File 'lib/packetgen/header/ospfv3.rb', line 188

def ospfize(dst: nil)
  ipv6 = ip_header(self)
  ipv6.traffic_class = 0xc0
  dst = case dst
        when :all_spf_routers
          'ff02::5'
        when :all_d_routers
          'ff02::6'
        else
          dst
        end
  ipv6.dst = dst unless dst.nil?
  ipv6.hop = 1 if ipv6[:dst].mcast?
end