Class: PacketGen::Header::OSPFv3
- 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:
-
a #version field (
BinStruct::Int8
), -
a #type field (
BinStruct::Int8Enum
), -
a #length field (
BinStruct::Int16
). The length includes the header, -
a #router_id field (
BinStruct::Int32
), -
an #area_id field (
BinStruct::Int32
), -
a #checksum field (
BinStruct::Int16
), -
an #instance_id field (
BinStruct::Int8
), -
a #reserved field (
BinStruct::Int8
), -
and a #body (
BinStruct::String
or PacketGen::Headerable).
OSPFv3 body
OSPFv3 #body should contain OSPF payload for given #type:
-
or LSAck.
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
OSPFv2::IP_PROTOCOL
- TYPES =
OSPF packet types
OSPFv2::TYPES
Instance Attribute Summary collapse
-
#area_id ⇒ Integer
32-bit area ID.
-
#body ⇒ String, Headerable
OSPFv3 body.
-
#checksum ⇒ Integer
16-bit OSPF packet checksum.
-
#instance_id ⇒ Integer
8-bit instance ID.
-
#length ⇒ Integer
16-bit OSPF packet length.
-
#reserved ⇒ Integer
8-bit reserved field.
-
#router_id ⇒ Integer
32-bit router ID.
-
#type ⇒ Integer
8-bit OSPF packet type.
-
#version ⇒ Integer
8-bit OSPF version.
Class Method Summary collapse
-
.define_options(hdr) ⇒ void
private
Helper class method to define an OSPFv3 options field.
Instance Method Summary collapse
-
#added_to_packet(packet) ⇒ Object
private
Add
#ospfize
method topacket
. -
#calc_checksum ⇒ Integer
Compute checksum and set #checksum attribute.
-
#calc_length ⇒ Integer
Compute length and set #length attribute.
-
#human_type ⇒ String
Get human-readable type.
-
#ospfize(dst: nil) ⇒ void
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.
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, #to_s
Constructor Details
This class inherits a constructor from PacketGen::Header::Base
Instance Attribute Details
#area_id ⇒ Integer
32-bit area ID
95 |
# File 'lib/packetgen/header/ospfv3.rb', line 95 define_attr :area_id, BinStruct::Int32 |
#body ⇒ String, Headerable
OSPFv3 body
111 |
# File 'lib/packetgen/header/ospfv3.rb', line 111 define_attr :body, BinStruct::String |
#checksum ⇒ Integer
16-bit OSPF packet checksum
99 |
# File 'lib/packetgen/header/ospfv3.rb', line 99 define_attr :checksum, BinStruct::Int16 |
#instance_id ⇒ Integer
8-bit instance ID.
103 |
# File 'lib/packetgen/header/ospfv3.rb', line 103 define_attr :instance_id, BinStruct::Int8 |
#length ⇒ Integer
16-bit OSPF packet length. Header is included in length
87 |
# File 'lib/packetgen/header/ospfv3.rb', line 87 define_attr :length, BinStruct::Int16 |
#reserved ⇒ Integer
8-bit reserved field.
107 |
# File 'lib/packetgen/header/ospfv3.rb', line 107 define_attr :reserved, BinStruct::Int8, default: 0 |
#router_id ⇒ Integer
32-bit router ID
91 |
# File 'lib/packetgen/header/ospfv3.rb', line 91 define_attr :router_id, BinStruct::Int32 |
#type ⇒ Integer
8-bit OSPF packet type. Types are defined in TYPES.
83 |
# File 'lib/packetgen/header/ospfv3.rb', line 83 define_attr :type, BinStruct::Int8Enum, enum: TYPES |
#version ⇒ Integer
8-bit OSPF version
79 |
# File 'lib/packetgen/header/ospfv3.rb', line 79 define_attr :version, BinStruct::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.
141 142 143 |
# File 'lib/packetgen/header/ospfv3.rb', line 141 def self.(hdr) hdr.define_bit_attr :options, z: 18, dc_opt: 1, r_opt: 1, n_opt: 1, x_opt: 1, e_opt: 1, v6_opt: 1 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.
This method is used internally by PacketGen and should not be directly called
Add #ospfize
method to packet
. This method calls #ospfize.
149 150 151 152 |
# File 'lib/packetgen/header/ospfv3.rb', line 149 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_checksum ⇒ Integer
Compute checksum and set #checksum attribute
156 157 158 159 160 161 162 163 |
# File 'lib/packetgen/header/ospfv3.rb', line 156 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_length ⇒ Integer
Compute length and set #length attribute
173 174 175 |
# File 'lib/packetgen/header/ospfv3.rb', line 173 def calc_length self[:length].value = Base.calculate_and_set_length(self) end |
#human_type ⇒ String
Get human-readable type
167 168 169 |
# File 'lib/packetgen/header/ospfv3.rb', line 167 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
190 191 192 193 194 195 196 197 198 199 200 201 202 203 |
# File 'lib/packetgen/header/ospfv3.rb', line 190 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 |