packetgen 2.4.0 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.travis.yml +13 -4
- data/lib/packetgen.rb +3 -1
- data/lib/packetgen/capture.rb +2 -0
- data/lib/packetgen/config.rb +1 -0
- data/lib/packetgen/header.rb +5 -0
- data/lib/packetgen/header/arp.rb +2 -0
- data/lib/packetgen/header/asn1_base.rb +2 -0
- data/lib/packetgen/header/base.rb +16 -0
- data/lib/packetgen/header/bootp.rb +2 -0
- data/lib/packetgen/header/crypto.rb +2 -0
- data/lib/packetgen/header/dhcp.rb +2 -0
- data/lib/packetgen/header/dhcp/option.rb +3 -0
- data/lib/packetgen/header/dhcp/options.rb +2 -0
- data/lib/packetgen/header/dhcpv6.rb +109 -0
- data/lib/packetgen/header/dhcpv6/duid.rb +147 -0
- data/lib/packetgen/header/dhcpv6/option.rb +391 -0
- data/lib/packetgen/header/dhcpv6/options.rb +29 -0
- data/lib/packetgen/header/dhcpv6/relay.rb +48 -0
- data/lib/packetgen/header/dns.rb +10 -2
- data/lib/packetgen/header/dns/name.rb +7 -0
- data/lib/packetgen/header/dns/opt.rb +6 -0
- data/lib/packetgen/header/dns/option.rb +7 -0
- data/lib/packetgen/header/dns/qdsection.rb +7 -1
- data/lib/packetgen/header/dns/question.rb +7 -0
- data/lib/packetgen/header/dns/rr.rb +7 -0
- data/lib/packetgen/header/dns/rrsection.rb +7 -0
- data/lib/packetgen/header/dot11.rb +4 -2
- data/lib/packetgen/header/dot11/control.rb +2 -0
- data/lib/packetgen/header/dot11/data.rb +2 -0
- data/lib/packetgen/header/dot11/element.rb +2 -0
- data/lib/packetgen/header/dot11/management.rb +2 -0
- data/lib/packetgen/header/dot11/sub_mngt.rb +2 -0
- data/lib/packetgen/header/dot1q.rb +2 -0
- data/lib/packetgen/header/dot1x.rb +3 -1
- data/lib/packetgen/header/eap.rb +3 -1
- data/lib/packetgen/header/eap/fast.rb +2 -0
- data/lib/packetgen/header/eap/md5.rb +2 -0
- data/lib/packetgen/header/eap/tls.rb +2 -0
- data/lib/packetgen/header/eap/ttls.rb +2 -0
- data/lib/packetgen/header/esp.rb +7 -0
- data/lib/packetgen/header/eth.rb +2 -0
- data/lib/packetgen/header/gre.rb +4 -9
- data/lib/packetgen/header/http/headers.rb +2 -0
- data/lib/packetgen/header/http/request.rb +3 -1
- data/lib/packetgen/header/http/response.rb +3 -1
- data/lib/packetgen/header/icmp.rb +4 -11
- data/lib/packetgen/header/icmpv6.rb +4 -11
- data/lib/packetgen/header/igmp.rb +4 -11
- data/lib/packetgen/header/igmpv3.rb +4 -11
- data/lib/packetgen/header/igmpv3/group_record.rb +2 -0
- data/lib/packetgen/header/igmpv3/mq.rb +2 -0
- data/lib/packetgen/header/igmpv3/mr.rb +2 -0
- data/lib/packetgen/header/ike.rb +13 -6
- data/lib/packetgen/header/ike/auth.rb +2 -0
- data/lib/packetgen/header/ike/cert.rb +2 -0
- data/lib/packetgen/header/ike/certreq.rb +2 -0
- data/lib/packetgen/header/ike/id.rb +2 -0
- data/lib/packetgen/header/ike/ke.rb +2 -0
- data/lib/packetgen/header/ike/nonce.rb +2 -0
- data/lib/packetgen/header/ike/notify.rb +7 -0
- data/lib/packetgen/header/ike/payload.rb +9 -0
- data/lib/packetgen/header/ike/sa.rb +11 -4
- data/lib/packetgen/header/ike/sk.rb +7 -0
- data/lib/packetgen/header/ike/ts.rb +2 -0
- data/lib/packetgen/header/ike/vendor_id.rb +2 -0
- data/lib/packetgen/header/ip.rb +48 -11
- data/lib/packetgen/header/ip/addr.rb +8 -0
- data/lib/packetgen/header/ip/option.rb +2 -0
- data/lib/packetgen/header/ip/options.rb +2 -0
- data/lib/packetgen/header/ipv6.rb +5 -3
- data/lib/packetgen/header/ipv6/addr.rb +8 -0
- data/lib/packetgen/header/ipv6/extension.rb +2 -0
- data/lib/packetgen/header/ipv6/hop_by_hop.rb +2 -0
- data/lib/packetgen/header/llc.rb +2 -0
- data/lib/packetgen/header/mld.rb +2 -0
- data/lib/packetgen/header/mldv2.rb +4 -2
- data/lib/packetgen/header/mldv2/mcast_address_record.rb +3 -1
- data/lib/packetgen/header/mldv2/mlq.rb +2 -0
- data/lib/packetgen/header/mldv2/mlr.rb +4 -2
- data/lib/packetgen/header/ospfv2.rb +249 -0
- data/lib/packetgen/header/ospfv2/db_description.rb +105 -0
- data/lib/packetgen/header/ospfv2/hello.rb +104 -0
- data/lib/packetgen/header/ospfv2/ls_ack.rb +55 -0
- data/lib/packetgen/header/ospfv2/ls_request.rb +90 -0
- data/lib/packetgen/header/ospfv2/ls_update.rb +72 -0
- data/lib/packetgen/header/ospfv2/lsa.rb +252 -0
- data/lib/packetgen/header/ospfv2/lsa_header.rb +122 -0
- data/lib/packetgen/header/ospfv3.rb +216 -0
- data/lib/packetgen/header/ospfv3/db_description.rb +114 -0
- data/lib/packetgen/header/ospfv3/hello.rb +104 -0
- data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +103 -0
- data/lib/packetgen/header/ospfv3/ls_ack.rb +51 -0
- data/lib/packetgen/header/ospfv3/ls_request.rb +108 -0
- data/lib/packetgen/header/ospfv3/ls_update.rb +74 -0
- data/lib/packetgen/header/ospfv3/lsa.rb +252 -0
- data/lib/packetgen/header/ospfv3/lsa_header.rb +123 -0
- data/lib/packetgen/header/snmp.rb +2 -0
- data/lib/packetgen/header/tcp.rb +14 -14
- data/lib/packetgen/header/tcp/option.rb +7 -1
- data/lib/packetgen/header/tcp/options.rb +7 -0
- data/lib/packetgen/header/tftp.rb +2 -0
- data/lib/packetgen/header/udp.rb +6 -14
- data/lib/packetgen/inspect.rb +5 -1
- data/lib/packetgen/packet.rb +3 -1
- data/lib/packetgen/pcapng.rb +2 -0
- data/lib/packetgen/pcapng/block.rb +2 -0
- data/lib/packetgen/pcapng/epb.rb +2 -0
- data/lib/packetgen/pcapng/file.rb +2 -0
- data/lib/packetgen/pcapng/idb.rb +2 -0
- data/lib/packetgen/pcapng/shb.rb +2 -0
- data/lib/packetgen/pcapng/spb.rb +2 -0
- data/lib/packetgen/pcapng/unknown_block.rb +2 -0
- data/lib/packetgen/proto.rb +2 -0
- data/lib/packetgen/types/array.rb +3 -0
- data/lib/packetgen/types/cstring.rb +3 -1
- data/lib/packetgen/types/enum.rb +2 -0
- data/lib/packetgen/types/fields.rb +8 -4
- data/lib/packetgen/types/int.rb +3 -1
- data/lib/packetgen/types/int_string.rb +2 -0
- data/lib/packetgen/types/oui.rb +2 -0
- data/lib/packetgen/types/string.rb +3 -0
- data/lib/packetgen/types/tlv.rb +8 -0
- data/lib/packetgen/utils.rb +6 -4
- data/lib/packetgen/utils/arp_spoofer.rb +2 -0
- data/lib/packetgen/version.rb +3 -1
- metadata +25 -3
@@ -3,6 +3,8 @@
|
|
3
3
|
# See https://github.com/sdaubert/packetgen for more informations
|
4
4
|
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
5
5
|
# This program is published under MIT license.
|
6
|
+
|
7
|
+
# frozen_string_literal: true
|
6
8
|
require 'ipaddr'
|
7
9
|
|
8
10
|
module PacketGen
|
@@ -75,6 +77,12 @@ module PacketGen
|
|
75
77
|
def to_a
|
76
78
|
@fields.values
|
77
79
|
end
|
80
|
+
|
81
|
+
# Return true if this address is a multicast one
|
82
|
+
# @return [Boolean]
|
83
|
+
def mcast?
|
84
|
+
self.a1 & 0xff00 == 0xff00
|
85
|
+
end
|
78
86
|
end
|
79
87
|
|
80
88
|
# Class to handle series of IPv6 addresses
|
data/lib/packetgen/header/llc.rb
CHANGED
data/lib/packetgen/header/mld.rb
CHANGED
@@ -3,6 +3,8 @@
|
|
3
3
|
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
4
4
|
# This program is published under MIT license.
|
5
5
|
|
6
|
+
# frozen_string_literal: true
|
7
|
+
|
6
8
|
module PacketGen
|
7
9
|
module Header
|
8
10
|
# This module contains all MLDv2 specific classes.
|
@@ -11,7 +13,7 @@ module PacketGen
|
|
11
13
|
# Encode value for MLDv2 Max Resp Code.
|
12
14
|
# Value may be encoded as a float, so some error may occur.
|
13
15
|
# See RFC 3810 §5.1.3
|
14
|
-
# @param [Integer]
|
16
|
+
# @param [Integer] value value to encode
|
15
17
|
# @return [Integer]
|
16
18
|
def self.encode(value)
|
17
19
|
if value < 32768
|
@@ -31,7 +33,7 @@ module PacketGen
|
|
31
33
|
|
32
34
|
# Decode value for MLDv2 Max Resp Code.
|
33
35
|
# See RFC 3810 §5.1.3
|
34
|
-
# @param [Integer] value
|
36
|
+
# @param [Integer] value value to decode
|
35
37
|
# @return [Integer]
|
36
38
|
def self.decode(value)
|
37
39
|
if value < 32768
|
@@ -3,6 +3,8 @@
|
|
3
3
|
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
4
4
|
# This program is published under MIT license.
|
5
5
|
|
6
|
+
# frozen_string_literal: true
|
7
|
+
|
6
8
|
module PacketGen
|
7
9
|
module Header
|
8
10
|
module MLDv2
|
@@ -90,7 +92,7 @@ module PacketGen
|
|
90
92
|
end
|
91
93
|
end
|
92
94
|
|
93
|
-
# Class to handle series of {
|
95
|
+
# Class to handle series of {McastAddressRecord}.
|
94
96
|
# @author Sylvain Daubert
|
95
97
|
class McastAddressRecords < Types::Array
|
96
98
|
set_of McastAddressRecord
|
@@ -2,6 +2,8 @@
|
|
2
2
|
# See https://github.com/sdaubert/packetgen for more informations
|
3
3
|
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
4
4
|
# This program is published under MIT license.
|
5
|
+
|
6
|
+
# frozen_string_literal: true
|
5
7
|
require_relative 'mcast_address_record'
|
6
8
|
|
7
9
|
module PacketGen
|
@@ -39,7 +41,7 @@ module PacketGen
|
|
39
41
|
# MLR fields are:
|
40
42
|
# * {#reserved} ({Types::Int16}),
|
41
43
|
# * {#number_of_mar} (number of mcast address records, {Types::Int16}),
|
42
|
-
# * {#records} ({
|
44
|
+
# * {#records} ({McastAddressRecords}).
|
43
45
|
# @author Sylvain Daubert
|
44
46
|
class MLR < Base
|
45
47
|
# @!attribute reserved
|
@@ -47,7 +49,7 @@ module PacketGen
|
|
47
49
|
# @return [Integer]
|
48
50
|
define_field :reserved, Types::Int16, default: 0
|
49
51
|
# @!attribute number_of_mar
|
50
|
-
# 16-bit Number of group records in {#
|
52
|
+
# 16-bit Number of group records in {#records}
|
51
53
|
# @return [Integer]
|
52
54
|
define_field :number_of_mar, Types::Int16, default: 0
|
53
55
|
|
@@ -0,0 +1,249 @@
|
|
1
|
+
# This file is part of PacketGen
|
2
|
+
# See https://github.com/sdaubert/packetgen for more informations
|
3
|
+
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
4
|
+
# This program is published under MIT license.
|
5
|
+
|
6
|
+
# frozen_string_literal: true
|
7
|
+
|
8
|
+
module PacketGen
|
9
|
+
module Header
|
10
|
+
|
11
|
+
# This class supports OSPFv2 (RFC 2328).
|
12
|
+
# A OSPFv2 header has the following format:
|
13
|
+
#
|
14
|
+
# 0 1 2 3
|
15
|
+
# 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
|
16
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
17
|
+
# | Version # | Type | Packet length |
|
18
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
19
|
+
# | Router ID |
|
20
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
21
|
+
# | Area ID |
|
22
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
23
|
+
# | Checksum | AuType |
|
24
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
25
|
+
# | Authentication |
|
26
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
27
|
+
# | Authentication |
|
28
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
29
|
+
#
|
30
|
+
# An OSPFv2 header consists of:
|
31
|
+
# * a {#version} field ({Types::Int8}),
|
32
|
+
# * a {#type} field ({Types::Int8Enum}),
|
33
|
+
# * a {#length} field ({Types::Int16}). The length includes the header,
|
34
|
+
# * a {#router_id} field ({Types::Int32}),
|
35
|
+
# * an {#area_id} field ({Types::Int32}),
|
36
|
+
# * a {#checksum} field ({Types::Int16}),
|
37
|
+
# * an {#au_type} field ({Types::Int16Enum}),
|
38
|
+
# * an {#authentication} field ({Types::Int64}),
|
39
|
+
# * and a {#body} ({Types::String}).
|
40
|
+
#
|
41
|
+
# == Create an OSPFv2 header
|
42
|
+
# # standalone
|
43
|
+
# ospf = PacketGen::Header::OSPFv2.new
|
44
|
+
# # in a packet
|
45
|
+
# pkt = PacketGen.gen('IP', src: source_ip).add('OSPFv2')
|
46
|
+
# # make IP header correct for OSPF
|
47
|
+
# pkt.ospfize
|
48
|
+
# # or make it correct with specific destination address
|
49
|
+
# pkt.ospfize(dst: :all_spf_routers)
|
50
|
+
# # access to OSPF header
|
51
|
+
# pkt.ospfv2 # => PacketGen::Header::OSPFv2
|
52
|
+
#
|
53
|
+
# == OSPFv2 attributes
|
54
|
+
# ospf.version # => 2
|
55
|
+
# ospf.type = 'LS_ACK' # or 5
|
56
|
+
# ospf.length = 154
|
57
|
+
# ospf.router_id = 0xc0a80001
|
58
|
+
# ospf.area_id = 1
|
59
|
+
# ospf.checksum = 0xabcd
|
60
|
+
# ospf.au_type = 'NO_AUTH' # or 0
|
61
|
+
# ospf.authentication = 0
|
62
|
+
#
|
63
|
+
# == OSPFv2 body
|
64
|
+
# OSPFv2 {#body} should contain OSPF payload for given {#type}:
|
65
|
+
# * {OSPFv2::Hello},
|
66
|
+
# * {OSPFv2::DbDescription},
|
67
|
+
# * {OSPFv2::LSRequest},
|
68
|
+
# * {OSPFv2::LSUpdate},
|
69
|
+
# * or {OSPFv2::LSAck}.
|
70
|
+
#
|
71
|
+
# @author Sylvain Daubert
|
72
|
+
class OSPFv2 < Base
|
73
|
+
|
74
|
+
# IP protocol number for OSPF
|
75
|
+
IP_PROTOCOL = 89
|
76
|
+
|
77
|
+
# OSPF packet types
|
78
|
+
TYPES = {
|
79
|
+
'HELLO' => 1,
|
80
|
+
'DB_DESCRIPTION' => 2,
|
81
|
+
'LS_REQUEST' => 3,
|
82
|
+
'LS_UPDATE' => 4,
|
83
|
+
'LS_ACK' => 5
|
84
|
+
}
|
85
|
+
|
86
|
+
# Authentication types
|
87
|
+
AU_TYPES = {
|
88
|
+
'NO_AUTH' => 0,
|
89
|
+
'PASSWORD' => 1,
|
90
|
+
'CRYPTO' => 2,
|
91
|
+
'CRYPTO_WITH_ESN' => 3
|
92
|
+
}
|
93
|
+
|
94
|
+
# @!attribute version
|
95
|
+
# 8-bit OSPF version
|
96
|
+
# @return [Integer]
|
97
|
+
define_field :version, Types::Int8, default: 2
|
98
|
+
# @!attribute type
|
99
|
+
# 8-bit OSPF packet type. Types are defined in {TYPES}.
|
100
|
+
# @return [Integer]
|
101
|
+
define_field :type, Types::Int8Enum, enum: TYPES
|
102
|
+
# @!attribute length
|
103
|
+
# 16-bit OSPF packet length
|
104
|
+
# @return [Integer]
|
105
|
+
define_field :length, Types::Int16
|
106
|
+
# @!attribute router_id
|
107
|
+
# 32-bit router ID
|
108
|
+
# @return [Integer]
|
109
|
+
define_field :router_id, Types::Int32
|
110
|
+
# @!attribute area_id
|
111
|
+
# 32-bit area ID
|
112
|
+
# @return [Integer]
|
113
|
+
define_field :area_id, Types::Int32
|
114
|
+
# @!attribute checksum
|
115
|
+
# 16-bit OSPF packet checksum
|
116
|
+
# @return [Integer]
|
117
|
+
define_field :checksum, Types::Int16
|
118
|
+
# @!attribute au_type
|
119
|
+
# 16-bit authentication type. Types are defined in {AU_TYPES}.
|
120
|
+
# @return [Integer]
|
121
|
+
define_field :au_type, Types::Int16Enum, enum: AU_TYPES
|
122
|
+
# @!attribute authentication
|
123
|
+
# 64-bit authentication data
|
124
|
+
# @return [Integer]
|
125
|
+
define_field :authentication, Types::Int64
|
126
|
+
# @!attribute body
|
127
|
+
# @return [String,Base]
|
128
|
+
define_field :body, Types::String
|
129
|
+
|
130
|
+
# @api private
|
131
|
+
# Helper class method to define an OSPFv2 options field.
|
132
|
+
# @param [Base] hdr header on which define a OSPFv2 options field
|
133
|
+
# @return [void]
|
134
|
+
# @!macro [attach] define_options
|
135
|
+
# @!attribute options
|
136
|
+
# 8-bit options field. Handle {#mt_opt}, {#e_opt}, {#mc_opt},
|
137
|
+
# {#n_opt}, {#l_opt}, {#dc_opt}, {#o_opt} and {#dn_opt}.
|
138
|
+
# @return [Integer]
|
139
|
+
# @!attribute dn_opt
|
140
|
+
# @return [Boolean]
|
141
|
+
# @!attribute o_opt
|
142
|
+
# @return [Boolean]
|
143
|
+
# @!attribute dc_opt
|
144
|
+
# This bit describes the router's handling of demand circuits.
|
145
|
+
# @return [Boolean]
|
146
|
+
# @!attribute l_opt
|
147
|
+
# This specifies if a LLS Data block is present.
|
148
|
+
# @return [Boolean]
|
149
|
+
# @!attribute n_opt
|
150
|
+
# This bit specifies if NSSA is supported.
|
151
|
+
# @return [Boolean]
|
152
|
+
# @!attribute mc_opt
|
153
|
+
# This bit describes whether IP multicast datagrams are forwarded.
|
154
|
+
# @return [Boolean]
|
155
|
+
# @!attribute e_opt
|
156
|
+
# This bit describes the way AS-external-LSAs are flooded.
|
157
|
+
# @return [Boolean]
|
158
|
+
# @!attribute mt_opt
|
159
|
+
# @return [Boolean]
|
160
|
+
def self.define_options(hdr)
|
161
|
+
hdr.define_field :options, Types::Int8
|
162
|
+
hdr.define_bit_fields_on :options, :dn_opt, :o_opt, :dc_opt, :l_opt,
|
163
|
+
:n_opt, :mc_opt, :e_opt, :mt_opt
|
164
|
+
end
|
165
|
+
|
166
|
+
# @api private
|
167
|
+
# @note This method is used internally by PacketGen and should not be
|
168
|
+
# directly called
|
169
|
+
def added_to_packet(packet)
|
170
|
+
ospf_idx = packet.headers.size
|
171
|
+
packet.instance_eval "def ospfize(**kwargs) @headers[#{ospf_idx}].ospfize(**kwargs); end"
|
172
|
+
end
|
173
|
+
|
174
|
+
# Compute checksum and set +checksum+ field
|
175
|
+
# @return [Integer]
|
176
|
+
def calc_checksum
|
177
|
+
# #authentication field is not used in checksum calculation,
|
178
|
+
# so force it to 0 before checksumming
|
179
|
+
saved_auth = self.authentication
|
180
|
+
self.authentication = 0
|
181
|
+
|
182
|
+
sum = IP.sum16(self)
|
183
|
+
self.checksum = IP.reduce_checksum(sum)
|
184
|
+
|
185
|
+
# Restore #authentication value
|
186
|
+
self.authentication = saved_auth
|
187
|
+
|
188
|
+
self.checksum
|
189
|
+
end
|
190
|
+
|
191
|
+
# Get human-readable type
|
192
|
+
# @return [String]
|
193
|
+
def human_type
|
194
|
+
self[:type].to_human
|
195
|
+
end
|
196
|
+
|
197
|
+
# Get human-readable AU type
|
198
|
+
# @return [String]
|
199
|
+
def human_au_type
|
200
|
+
self[:au_type].to_human
|
201
|
+
end
|
202
|
+
|
203
|
+
# Compute length and set +length+ field
|
204
|
+
# @return [Integer]
|
205
|
+
def calc_length
|
206
|
+
self[:length].value = Base.calculate_and_set_length(self)
|
207
|
+
end
|
208
|
+
|
209
|
+
# Fixup IP header according to RFC 2328:
|
210
|
+
# * set TOS field to 0xc0,
|
211
|
+
# * optionally set destination address,
|
212
|
+
# * set TTL to 1 if destination is a mcast address.
|
213
|
+
# This method may be called as:
|
214
|
+
# # first way
|
215
|
+
# pkt.ospfv2.ospfize
|
216
|
+
# # second way
|
217
|
+
# pkt.ospfize
|
218
|
+
# @param [String,Symbol,nil] dst destination address. May be a dotted IP
|
219
|
+
# address (by example '224.0.0.5') or a Symbol (+:all_spf_routers+ or
|
220
|
+
# +:all_d_routers+)
|
221
|
+
# @return [void]
|
222
|
+
def ospfize(dst: nil)
|
223
|
+
ip = ip_header(self)
|
224
|
+
ip.tos = 0xc0
|
225
|
+
dst = case dst
|
226
|
+
when :all_spf_routers
|
227
|
+
'224.0.0.5'
|
228
|
+
when :all_d_routers
|
229
|
+
'224.0.0.6'
|
230
|
+
else
|
231
|
+
dst
|
232
|
+
end
|
233
|
+
ip.dst = dst unless dst.nil?
|
234
|
+
ip.ttl = 1 if ip[:dst].mcast?
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
238
|
+
self.add_class OSPFv2
|
239
|
+
IP.bind_header OSPFv2, protocol: OSPFv2::IP_PROTOCOL
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
require_relative 'ospfv2/hello'
|
244
|
+
require_relative 'ospfv2/lsa_header'
|
245
|
+
require_relative 'ospfv2/lsa'
|
246
|
+
require_relative 'ospfv2/db_description'
|
247
|
+
require_relative 'ospfv2/ls_request'
|
248
|
+
require_relative 'ospfv2/ls_update'
|
249
|
+
require_relative 'ospfv2/ls_ack'
|
@@ -0,0 +1,105 @@
|
|
1
|
+
# This file is part of PacketGen
|
2
|
+
# See https://github.com/sdaubert/packetgen for more informations
|
3
|
+
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
4
|
+
# This program is published under MIT license.
|
5
|
+
|
6
|
+
# frozen_string_literal: true
|
7
|
+
|
8
|
+
module PacketGen
|
9
|
+
module Header
|
10
|
+
class OSPFv2
|
11
|
+
|
12
|
+
# This class handles {OSPFv2 OSPFv2} DB description packets payload.
|
13
|
+
# The DB description payload has the following format:
|
14
|
+
# 0 1 2 3
|
15
|
+
# 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
|
16
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
17
|
+
# | Interface MTU | Options |0|0|0|0|0|I|M|MS
|
18
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
19
|
+
# | DD sequence number |
|
20
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
21
|
+
# | |
|
22
|
+
# +- -+
|
23
|
+
# | |
|
24
|
+
# +- An LSA Header -+
|
25
|
+
# | |
|
26
|
+
# +- -+
|
27
|
+
# | |
|
28
|
+
# +- -+
|
29
|
+
# | |
|
30
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
31
|
+
# | ... |
|
32
|
+
#
|
33
|
+
# A DB description payload is composed of:
|
34
|
+
# * a 16-bit {#mtu} field ({Types::Int16}),
|
35
|
+
# * a 8-bit {#options} field ({Types::Int8}),
|
36
|
+
# * a 8-bit {#flags} field ({Types::Int8}). Supported flags are:
|
37
|
+
# * {i_flag},
|
38
|
+
# * {m_flag},
|
39
|
+
# * {ms_flag},
|
40
|
+
# * a 32-bit {#sequence_number} field ({Types::Int32}),
|
41
|
+
# * and an array of {LSAHeader LSAHeaders} ({#lsas}, {ArrayOfLSA}).
|
42
|
+
#
|
43
|
+
# == Create a DbDescription payload
|
44
|
+
# # standalone
|
45
|
+
# dbd = PacketGen::Header::OSPFv2::DbDescription.new
|
46
|
+
# # in a packet
|
47
|
+
# pkt = PacketGen.gen('IP', src: source_ip).add('OSPFv2').add('OSPFv2::DbDescription')
|
48
|
+
# # access to DbDescription payload
|
49
|
+
# pkt.ospfv2_dbdescription # => PacketGen::Header::OSPFv2::DbDescription
|
50
|
+
#
|
51
|
+
# == DbDescription attributes
|
52
|
+
# dbd.mtu = 1500
|
53
|
+
# # set options. Options may also be set one by one with {#mt_opt},
|
54
|
+
# # {#e_opt}, {#mc_opt}, {#n_opt}, {#l_opt}, {#dc_opt}, {#o_opt} and {#dn_opt}
|
55
|
+
# dbd.options = 0
|
56
|
+
# dbd.flags = 0
|
57
|
+
# dbd.seqnum = 0x800001
|
58
|
+
# # add a LSA Router header
|
59
|
+
# dbd.lsas << { type: 'Router', age: 40, link_state_id: '0.0.0.1', advertising_router: '1.1.1.1', sequence_number: 42, checksum: 0x1234, length: 56 }
|
60
|
+
# # a header may also be set from an existing lsa
|
61
|
+
# dbd.lsas << existing_lsa.to_lsa_header
|
62
|
+
# @author Sylvain Daubert
|
63
|
+
class DbDescription < Base
|
64
|
+
# @!attribute mtu
|
65
|
+
# 16-bit interface MTU
|
66
|
+
# @return [Integer]
|
67
|
+
define_field :mtu, Types::Int16
|
68
|
+
|
69
|
+
# @!macro define_options
|
70
|
+
OSPFv2.define_options(self)
|
71
|
+
|
72
|
+
# @!attribute flags
|
73
|
+
# 8-bit interface flags ({#i_flag}, {#m_flag} and {#ms_flag})
|
74
|
+
# @return [Integer]
|
75
|
+
define_field :flags, Types::Int8
|
76
|
+
# @!attribute i_flag
|
77
|
+
# Init bit
|
78
|
+
# @return [Boolean]
|
79
|
+
# @!attribute m_flag
|
80
|
+
# More bit
|
81
|
+
# @return [Boolean]
|
82
|
+
# @!attribute ms_flag
|
83
|
+
# Master/Slave bit
|
84
|
+
# @return [Boolean]
|
85
|
+
define_bit_fields_on :flags, :zero, 5, :i_flag, :m_flag, :ms_flag
|
86
|
+
|
87
|
+
# @!attribute sequence_number
|
88
|
+
# 32-bit DD sequence number, used to sequence the collection of Database
|
89
|
+
# Description Packets.
|
90
|
+
# @return [Integer]
|
91
|
+
define_field :sequence_number, Types::Int32
|
92
|
+
alias seqnum sequence_number
|
93
|
+
alias seqnum= sequence_number=
|
94
|
+
|
95
|
+
# @!attribute lsas
|
96
|
+
# Array of LSA headers
|
97
|
+
# @return [ArrayOfLSAHeader]
|
98
|
+
define_field :lsas, ArrayOfLSA, builder: ->(h, t) { t.new(only_headers: true) }
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
self.add_class OSPFv2::DbDescription
|
103
|
+
OSPFv2.bind_header OSPFv2::DbDescription, type: OSPFv2::TYPES['DB_DESCRIPTION']
|
104
|
+
end
|
105
|
+
end
|