packetgen 2.6.0 → 2.7.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 +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +28 -0
- data/Rakefile +6 -6
- data/bin/pgconsole +6 -6
- data/lib/packetgen.rb +4 -3
- data/lib/packetgen/capture.rb +5 -7
- data/lib/packetgen/config.rb +3 -3
- data/lib/packetgen/deprecation.rb +17 -0
- data/lib/packetgen/header.rb +40 -38
- data/lib/packetgen/header/arp.rb +46 -31
- data/lib/packetgen/header/asn1_base.rb +8 -8
- data/lib/packetgen/header/base.rb +108 -36
- data/lib/packetgen/header/bootp.rb +28 -19
- data/lib/packetgen/header/crypto.rb +6 -8
- data/lib/packetgen/header/dhcp.rb +4 -5
- data/lib/packetgen/header/dhcp/option.rb +46 -34
- data/lib/packetgen/header/dhcp/options.rb +0 -1
- data/lib/packetgen/header/dhcpv6.rb +10 -10
- data/lib/packetgen/header/dhcpv6/duid.rb +2 -3
- data/lib/packetgen/header/dhcpv6/option.rb +16 -21
- data/lib/packetgen/header/dhcpv6/relay.rb +6 -4
- data/lib/packetgen/header/dns.rb +13 -11
- data/lib/packetgen/header/dns/name.rb +4 -6
- data/lib/packetgen/header/dns/opt.rb +31 -31
- data/lib/packetgen/header/dns/option.rb +0 -2
- data/lib/packetgen/header/dns/qdsection.rb +1 -2
- data/lib/packetgen/header/dns/question.rb +19 -13
- data/lib/packetgen/header/dns/rr.rb +11 -14
- data/lib/packetgen/header/dns/rrsection.rb +5 -7
- data/lib/packetgen/header/dot11.rb +45 -29
- data/lib/packetgen/header/dot11/control.rb +3 -5
- data/lib/packetgen/header/dot11/data.rb +34 -6
- data/lib/packetgen/header/dot11/element.rb +0 -1
- data/lib/packetgen/header/dot11/management.rb +9 -5
- data/lib/packetgen/header/dot11/sub_mngt.rb +13 -14
- data/lib/packetgen/header/dot1q.rb +2 -2
- data/lib/packetgen/header/dot1x.rb +3 -4
- data/lib/packetgen/header/eap.rb +62 -53
- data/lib/packetgen/header/eap/fast.rb +0 -1
- data/lib/packetgen/header/eap/md5.rb +1 -2
- data/lib/packetgen/header/eap/tls.rb +9 -10
- data/lib/packetgen/header/eap/ttls.rb +9 -10
- data/lib/packetgen/header/esp.rb +33 -33
- data/lib/packetgen/header/eth.rb +11 -8
- data/lib/packetgen/header/gre.rb +5 -6
- data/lib/packetgen/header/http/headers.rb +11 -14
- data/lib/packetgen/header/http/request.rb +20 -20
- data/lib/packetgen/header/http/response.rb +16 -18
- data/lib/packetgen/header/http/verbs.rb +5 -5
- data/lib/packetgen/header/icmp.rb +1 -3
- data/lib/packetgen/header/icmpv6.rb +1 -3
- data/lib/packetgen/header/igmp.rb +5 -6
- data/lib/packetgen/header/igmpv3.rb +5 -9
- data/lib/packetgen/header/igmpv3/group_record.rb +4 -5
- data/lib/packetgen/header/igmpv3/mq.rb +2 -2
- data/lib/packetgen/header/igmpv3/mr.rb +4 -3
- data/lib/packetgen/header/ike.rb +33 -8
- data/lib/packetgen/header/ike/auth.rb +4 -6
- data/lib/packetgen/header/ike/cert.rb +0 -2
- data/lib/packetgen/header/ike/certreq.rb +1 -3
- data/lib/packetgen/header/ike/id.rb +1 -3
- data/lib/packetgen/header/ike/ke.rb +0 -2
- data/lib/packetgen/header/ike/nonce.rb +0 -2
- data/lib/packetgen/header/ike/notify.rb +22 -24
- data/lib/packetgen/header/ike/payload.rb +198 -199
- data/lib/packetgen/header/ike/sa.rb +21 -30
- data/lib/packetgen/header/ike/sk.rb +16 -17
- data/lib/packetgen/header/ike/ts.rb +22 -24
- data/lib/packetgen/header/ike/vendor_id.rb +0 -2
- data/lib/packetgen/header/ip.rb +30 -23
- data/lib/packetgen/header/ip/addr.rb +5 -6
- data/lib/packetgen/header/ip/option.rb +11 -15
- data/lib/packetgen/header/ip/options.rb +1 -2
- data/lib/packetgen/header/ipv6.rb +27 -12
- data/lib/packetgen/header/ipv6/addr.rb +2 -2
- data/lib/packetgen/header/ipv6/extension.rb +1 -1
- data/lib/packetgen/header/ipv6/hop_by_hop.rb +11 -11
- data/lib/packetgen/header/llc.rb +4 -3
- data/lib/packetgen/header/mdns.rb +11 -5
- data/lib/packetgen/header/mld.rb +4 -4
- data/lib/packetgen/header/mldv2.rb +4 -3
- data/lib/packetgen/header/mldv2/mcast_address_record.rb +3 -4
- data/lib/packetgen/header/mldv2/mlq.rb +3 -4
- data/lib/packetgen/header/mldv2/mlr.rb +4 -3
- data/lib/packetgen/header/netbios.rb +18 -5
- data/lib/packetgen/header/ospfv2.rb +6 -7
- data/lib/packetgen/header/ospfv2/db_description.rb +3 -4
- data/lib/packetgen/header/ospfv2/hello.rb +2 -3
- data/lib/packetgen/header/ospfv2/ls_ack.rb +2 -3
- data/lib/packetgen/header/ospfv2/ls_request.rb +2 -3
- data/lib/packetgen/header/ospfv2/ls_update.rb +5 -6
- data/lib/packetgen/header/ospfv2/lsa.rb +13 -14
- data/lib/packetgen/header/ospfv2/lsa_header.rb +4 -5
- data/lib/packetgen/header/ospfv3.rb +3 -4
- data/lib/packetgen/header/ospfv3/db_description.rb +3 -5
- data/lib/packetgen/header/ospfv3/hello.rb +2 -3
- data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +7 -8
- data/lib/packetgen/header/ospfv3/ls_ack.rb +2 -3
- data/lib/packetgen/header/ospfv3/ls_request.rb +2 -3
- data/lib/packetgen/header/ospfv3/ls_update.rb +5 -6
- data/lib/packetgen/header/ospfv3/lsa.rb +10 -11
- data/lib/packetgen/header/ospfv3/lsa_header.rb +3 -4
- data/lib/packetgen/header/snmp.rb +45 -32
- data/lib/packetgen/header/tcp.rb +13 -9
- data/lib/packetgen/header/tcp/option.rb +16 -11
- data/lib/packetgen/header/tcp/options.rb +3 -4
- data/lib/packetgen/header/tftp.rb +15 -17
- data/lib/packetgen/header/udp.rb +10 -4
- data/lib/packetgen/inspect.rb +7 -9
- data/lib/packetgen/packet.rb +44 -22
- data/lib/packetgen/pcapng.rb +1 -5
- data/lib/packetgen/pcapng/block.rb +17 -11
- data/lib/packetgen/pcapng/epb.rb +6 -11
- data/lib/packetgen/pcapng/file.rb +37 -44
- data/lib/packetgen/pcapng/idb.rb +17 -22
- data/lib/packetgen/pcapng/shb.rb +7 -10
- data/lib/packetgen/pcapng/spb.rb +21 -17
- data/lib/packetgen/pcapng/unknown_block.rb +17 -13
- data/lib/packetgen/proto.rb +1 -2
- data/lib/packetgen/types/array.rb +119 -34
- data/lib/packetgen/types/cstring.rb +1 -5
- data/lib/packetgen/types/enum.rb +8 -10
- data/lib/packetgen/types/fields.rb +34 -28
- data/lib/packetgen/types/int.rb +11 -13
- data/lib/packetgen/types/int_string.rb +6 -8
- data/lib/packetgen/types/oui.rb +3 -6
- data/lib/packetgen/types/string.rb +4 -6
- data/lib/packetgen/types/tlv.rb +11 -14
- data/lib/packetgen/utils.rb +15 -23
- data/lib/packetgen/utils/arp_spoofer.rb +12 -18
- data/lib/packetgen/version.rb +1 -1
- data/packetgen.gemspec +9 -8
- metadata +19 -17
@@ -9,6 +9,7 @@ module PacketGen
|
|
9
9
|
module Header
|
10
10
|
# This module contains all MLDv2 specific classes.
|
11
11
|
# @author Sylvain Daubert
|
12
|
+
# @since 2.4.0
|
12
13
|
module MLDv2
|
13
14
|
# Encode value for MLDv2 Max Resp Code.
|
14
15
|
# Value may be encoded as a float, so some error may occur.
|
@@ -16,14 +17,14 @@ module PacketGen
|
|
16
17
|
# @param [Integer] value value to encode
|
17
18
|
# @return [Integer]
|
18
19
|
def self.encode(value)
|
19
|
-
if value <
|
20
|
+
if value < 32_768
|
20
21
|
value
|
21
22
|
elsif value > 8_387_583
|
22
23
|
0xffff
|
23
24
|
else
|
24
25
|
exp = 0
|
25
26
|
value >>= 3
|
26
|
-
while value >
|
27
|
+
while value > 8_191
|
27
28
|
exp += 1
|
28
29
|
value >>= 1
|
29
30
|
end
|
@@ -36,7 +37,7 @@ module PacketGen
|
|
36
37
|
# @param [Integer] value value to decode
|
37
38
|
# @return [Integer]
|
38
39
|
def self.decode(value)
|
39
|
-
if value <
|
40
|
+
if value < 32_768
|
40
41
|
value
|
41
42
|
else
|
42
43
|
mant = value & 0xfff
|
@@ -52,7 +52,6 @@ module PacketGen
|
|
52
52
|
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
53
53
|
# @author Sylvain Daubert
|
54
54
|
class McastAddressRecord < Types::Fields
|
55
|
-
|
56
55
|
# Known record types
|
57
56
|
RECORD_TYPES = IGMPv3::GroupRecord::RECORD_TYPES
|
58
57
|
|
@@ -81,7 +80,7 @@ module PacketGen
|
|
81
80
|
# @!attribute aux_data
|
82
81
|
# @return [String]
|
83
82
|
define_field :aux_data, Types::String,
|
84
|
-
builder: ->(h, t) { t.new(length_from: ->
|
83
|
+
builder: ->(h, t) { t.new(length_from: -> { h[:aux_data_len].to_i * 4 }) }
|
85
84
|
|
86
85
|
def human_type
|
87
86
|
self[:type].to_human
|
@@ -91,12 +90,12 @@ module PacketGen
|
|
91
90
|
"#{human_type}(ma:#{multicast_addr}|src:#{source_addr.to_human})"
|
92
91
|
end
|
93
92
|
end
|
94
|
-
|
93
|
+
|
95
94
|
# Class to handle series of {McastAddressRecord}.
|
96
95
|
# @author Sylvain Daubert
|
97
96
|
class McastAddressRecords < Types::Array
|
98
97
|
set_of McastAddressRecord
|
99
|
-
|
98
|
+
|
100
99
|
# Separator used in {#to_human}.
|
101
100
|
HUMAN_SEPARATOR = ';'
|
102
101
|
end
|
@@ -92,7 +92,7 @@ module PacketGen
|
|
92
92
|
# Array of IPv6 source addresses
|
93
93
|
# @return [IPv6::ArrayOfAddr]
|
94
94
|
define_field_before :body, :source_addr, IPv6::ArrayOfAddr,
|
95
|
-
builder: ->(h,t) { t.new(counter: h[:number_of_sources]) }
|
95
|
+
builder: ->(h, t) { t.new(counter: h[:number_of_sources]) }
|
96
96
|
|
97
97
|
# @!attribute flag_resv
|
98
98
|
# 4-bit reserved field in {#flags}
|
@@ -138,9 +138,8 @@ module PacketGen
|
|
138
138
|
end
|
139
139
|
end
|
140
140
|
end
|
141
|
-
|
142
|
-
self.add_class MLDv2::MLQ
|
143
|
-
ICMPv6.bind_header MLDv2::MLQ, op: :and, type: 130, body: ->(b) { b.nil? ? '' : b.length > 23 }
|
144
141
|
|
142
|
+
self.add_class MLDv2::MLQ
|
143
|
+
ICMPv6.bind MLDv2::MLQ, type: 130, body: ->(b) { b.nil? ? '' : b.length > 23 }
|
145
144
|
end
|
146
145
|
end
|
@@ -4,6 +4,7 @@
|
|
4
4
|
# This program is published under MIT license.
|
5
5
|
|
6
6
|
# frozen_string_literal: true
|
7
|
+
|
7
8
|
require_relative 'mcast_address_record'
|
8
9
|
|
9
10
|
module PacketGen
|
@@ -52,7 +53,7 @@ module PacketGen
|
|
52
53
|
# 16-bit Number of group records in {#records}
|
53
54
|
# @return [Integer]
|
54
55
|
define_field :number_of_mar, Types::Int16, default: 0
|
55
|
-
|
56
|
+
|
56
57
|
# @!attribute records
|
57
58
|
# Array of Mcast Address Records
|
58
59
|
# @return [McastAddressRecords]
|
@@ -60,8 +61,8 @@ module PacketGen
|
|
60
61
|
builder: ->(h, t) { t.new(counter: h[:number_of_mar]) }
|
61
62
|
end
|
62
63
|
end
|
63
|
-
|
64
|
+
|
64
65
|
self.add_class MLDv2::MLR
|
65
|
-
ICMPv6.
|
66
|
+
ICMPv6.bind MLDv2::MLR, type: 143
|
66
67
|
end
|
67
68
|
end
|
@@ -9,13 +9,14 @@ module PacketGen
|
|
9
9
|
module Header
|
10
10
|
# Module to group all NetBIOS headers
|
11
11
|
# @author Sylvain Daubert
|
12
|
+
# @since 2.5.1
|
12
13
|
module NetBIOS
|
13
14
|
# NetBIOS Session Service messages.
|
14
15
|
# @author Sylvain Daubert
|
15
16
|
class Session < Base
|
16
17
|
# Port number for NetBIOS Session Service over TCP
|
17
18
|
TCP_PORT = 139
|
18
|
-
|
19
|
+
|
19
20
|
# Session packet types
|
20
21
|
TYPES = {
|
21
22
|
'message' => 0,
|
@@ -24,8 +25,8 @@ module PacketGen
|
|
24
25
|
'negative_response' => 0x83,
|
25
26
|
'retarget_response' => 0x84,
|
26
27
|
'keep_alive' => 0x85,
|
27
|
-
}
|
28
|
-
|
28
|
+
}.freeze
|
29
|
+
|
29
30
|
# @!attribute type
|
30
31
|
# 8-bit session packet type
|
31
32
|
# @return [Integer]
|
@@ -37,15 +38,27 @@ module PacketGen
|
|
37
38
|
# @!attribute body
|
38
39
|
# @return [String]
|
39
40
|
define_field :body, Types::String
|
40
|
-
|
41
|
+
|
41
42
|
# Compute and set {#length} field
|
42
43
|
# @return [Integer] calculated length
|
43
44
|
def calc_length
|
44
45
|
Base.calculate_and_set_length(self, header_in_size: false)
|
45
46
|
end
|
47
|
+
|
48
|
+
# @api private
|
49
|
+
# @note This method is used internally by PacketGen and should not be
|
50
|
+
# directly called
|
51
|
+
# @since 2.7.0 Set TCP sport according to bindings, only if sport is 0.
|
52
|
+
# Needed by new bind API.
|
53
|
+
def added_to_packet(packet)
|
54
|
+
return unless packet.is? 'TCP'
|
55
|
+
return unless packet.tcp.sport.zero?
|
56
|
+
packet.tcp.sport = TCP_PORT
|
57
|
+
end
|
46
58
|
end
|
47
59
|
end
|
48
60
|
self.add_class NetBIOS::Session
|
49
|
-
TCP.
|
61
|
+
TCP.bind NetBIOS::Session, dport: NetBIOS::Session::TCP_PORT
|
62
|
+
TCP.bind NetBIOS::Session, sport: NetBIOS::Session::TCP_PORT
|
50
63
|
end
|
51
64
|
end
|
@@ -7,7 +7,6 @@
|
|
7
7
|
|
8
8
|
module PacketGen
|
9
9
|
module Header
|
10
|
-
|
11
10
|
# This class supports OSPFv2 (RFC 2328).
|
12
11
|
# A OSPFv2 header has the following format:
|
13
12
|
#
|
@@ -69,19 +68,19 @@ module PacketGen
|
|
69
68
|
# * or {OSPFv2::LSAck}.
|
70
69
|
#
|
71
70
|
# @author Sylvain Daubert
|
71
|
+
# @since 2.5.0
|
72
72
|
class OSPFv2 < Base
|
73
|
-
|
74
73
|
# IP protocol number for OSPF
|
75
74
|
IP_PROTOCOL = 89
|
76
|
-
|
75
|
+
|
77
76
|
# OSPF packet types
|
78
|
-
TYPES
|
77
|
+
TYPES = {
|
79
78
|
'HELLO' => 1,
|
80
79
|
'DB_DESCRIPTION' => 2,
|
81
80
|
'LS_REQUEST' => 3,
|
82
81
|
'LS_UPDATE' => 4,
|
83
82
|
'LS_ACK' => 5
|
84
|
-
}
|
83
|
+
}.freeze
|
85
84
|
|
86
85
|
# Authentication types
|
87
86
|
AU_TYPES = {
|
@@ -89,7 +88,7 @@ module PacketGen
|
|
89
88
|
'PASSWORD' => 1,
|
90
89
|
'CRYPTO' => 2,
|
91
90
|
'CRYPTO_WITH_ESN' => 3
|
92
|
-
}
|
91
|
+
}.freeze
|
93
92
|
|
94
93
|
# @!attribute version
|
95
94
|
# 8-bit OSPF version
|
@@ -236,7 +235,7 @@ module PacketGen
|
|
236
235
|
end
|
237
236
|
|
238
237
|
self.add_class OSPFv2
|
239
|
-
IP.
|
238
|
+
IP.bind OSPFv2, protocol: OSPFv2::IP_PROTOCOL
|
240
239
|
end
|
241
240
|
end
|
242
241
|
|
@@ -8,7 +8,6 @@
|
|
8
8
|
module PacketGen
|
9
9
|
module Header
|
10
10
|
class OSPFv2
|
11
|
-
|
12
11
|
# This class handles {OSPFv2 OSPFv2} DB description packets payload.
|
13
12
|
# The DB description payload has the following format:
|
14
13
|
# 0 1 2 3
|
@@ -91,15 +90,15 @@ module PacketGen
|
|
91
90
|
define_field :sequence_number, Types::Int32
|
92
91
|
alias seqnum sequence_number
|
93
92
|
alias seqnum= sequence_number=
|
94
|
-
|
93
|
+
|
95
94
|
# @!attribute lsas
|
96
95
|
# Array of LSA headers
|
97
96
|
# @return [ArrayOfLSAHeader]
|
98
|
-
define_field :lsas, ArrayOfLSA, builder: ->(
|
97
|
+
define_field :lsas, ArrayOfLSA, builder: ->(_h, t) { t.new(only_headers: true) }
|
99
98
|
end
|
100
99
|
end
|
101
100
|
|
102
101
|
self.add_class OSPFv2::DbDescription
|
103
|
-
OSPFv2.
|
102
|
+
OSPFv2.bind OSPFv2::DbDescription, type: OSPFv2::TYPES['DB_DESCRIPTION']
|
104
103
|
end
|
105
104
|
end
|
@@ -8,7 +8,6 @@
|
|
8
8
|
module PacketGen
|
9
9
|
module Header
|
10
10
|
class OSPFv2
|
11
|
-
|
12
11
|
# This class handles {OSPFv2 OSPFv2} HELLO packets payload. The HELLO
|
13
12
|
# payload has the following format:
|
14
13
|
# 0 1 2 3
|
@@ -97,8 +96,8 @@ module PacketGen
|
|
97
96
|
define_field :neighbors, IP::ArrayOfAddr
|
98
97
|
end
|
99
98
|
end
|
100
|
-
|
99
|
+
|
101
100
|
self.add_class OSPFv2::Hello
|
102
|
-
OSPFv2.
|
101
|
+
OSPFv2.bind OSPFv2::Hello, type: OSPFv2::TYPES['HELLO']
|
103
102
|
end
|
104
103
|
end
|
@@ -8,7 +8,6 @@
|
|
8
8
|
module PacketGen
|
9
9
|
module Header
|
10
10
|
class OSPFv2
|
11
|
-
|
12
11
|
# This class handles {OSPFv2 OSPFv2} LS Acknowledgment packets payload.
|
13
12
|
# The LS Acknowledgment payload has the following format:
|
14
13
|
# 0 1 2 3
|
@@ -45,11 +44,11 @@ module PacketGen
|
|
45
44
|
# @!attribute lsas
|
46
45
|
# Array of LSA headers
|
47
46
|
# @return [ArrayOfLSAHeader]
|
48
|
-
define_field :lsas, ArrayOfLSA, builder: ->(
|
47
|
+
define_field :lsas, ArrayOfLSA, builder: ->(_h, t) { t.new(only_headers: true) }
|
49
48
|
end
|
50
49
|
end
|
51
50
|
|
52
51
|
self.add_class OSPFv2::LSAck
|
53
|
-
OSPFv2.
|
52
|
+
OSPFv2.bind OSPFv2::LSAck, type: OSPFv2::TYPES['LS_ACK']
|
54
53
|
end
|
55
54
|
end
|
@@ -8,7 +8,6 @@
|
|
8
8
|
module PacketGen
|
9
9
|
module Header
|
10
10
|
class OSPFv2
|
11
|
-
|
12
11
|
# This class handle a LS request, which is composed 3 {Types::Int32} fields:
|
13
12
|
# * {#type},
|
14
13
|
# * {#link_state_id},
|
@@ -40,7 +39,7 @@ module PacketGen
|
|
40
39
|
"LSR<#{human_type},#{link_state_id},#{advertising_router}>"
|
41
40
|
end
|
42
41
|
end
|
43
|
-
|
42
|
+
|
44
43
|
# This class defines a specialized {Types::Array array} to handle series
|
45
44
|
# of {LSR LSRs}.
|
46
45
|
# @author Sylvain Daubert
|
@@ -85,6 +84,6 @@ module PacketGen
|
|
85
84
|
end
|
86
85
|
|
87
86
|
self.add_class OSPFv2::LSRequest
|
88
|
-
OSPFv2.
|
87
|
+
OSPFv2.bind OSPFv2::LSRequest, type: OSPFv2::TYPES['LS_REQUEST']
|
89
88
|
end
|
90
89
|
end
|
@@ -8,7 +8,6 @@
|
|
8
8
|
module PacketGen
|
9
9
|
module Header
|
10
10
|
class OSPFv2
|
11
|
-
|
12
11
|
# This class handles {OSPFv2 OSPFv2} Link State Update packets
|
13
12
|
# payload. The LSU payload has the following format:
|
14
13
|
# 0 1 2 3
|
@@ -52,21 +51,21 @@ module PacketGen
|
|
52
51
|
# Array of {LSA LSAs}
|
53
52
|
# @return [ArrayOfLSA]
|
54
53
|
define_field :lsas, ArrayOfLSA, builder: ->(h, t) { t.new(counter: h[:lsas_count]) }
|
55
|
-
|
54
|
+
|
56
55
|
# Calculate checksums of all LSAs
|
57
56
|
# @return [void]
|
58
57
|
def calc_checksum
|
59
|
-
lsas.each
|
58
|
+
lsas.each(&:calc_checksum)
|
60
59
|
end
|
61
|
-
|
60
|
+
|
62
61
|
# Calculate length of all LSAs
|
63
62
|
def calc_length
|
64
|
-
lsas.each
|
63
|
+
lsas.each(&:calc_length)
|
65
64
|
end
|
66
65
|
end
|
67
66
|
end
|
68
67
|
|
69
68
|
self.add_class OSPFv2::LSUpdate
|
70
|
-
OSPFv2.
|
69
|
+
OSPFv2.bind OSPFv2::LSUpdate, type: OSPFv2::TYPES['LS_UPDATE']
|
71
70
|
end
|
72
71
|
end
|
@@ -8,7 +8,6 @@
|
|
8
8
|
module PacketGen
|
9
9
|
module Header
|
10
10
|
class OSPFv2
|
11
|
-
|
12
11
|
# This class handles unsupported {OSPFv2 OSPFv2} LSA payloads.
|
13
12
|
# A LSA payload is a {LSAHeader} with a {#body} field.
|
14
13
|
# @author Sylvain Daubert
|
@@ -17,7 +16,7 @@ module PacketGen
|
|
17
16
|
# LSA body
|
18
17
|
# @return [String]
|
19
18
|
define_field :body, Types::String,
|
20
|
-
builder: ->(h,t) { t.new(length_from: ->
|
19
|
+
builder: ->(h, t) { t.new(length_from: -> { h.length - 20 }) }
|
21
20
|
end
|
22
21
|
|
23
22
|
# This class handles TOS metrics for {Link links} in a {LSARouter
|
@@ -71,7 +70,7 @@ module PacketGen
|
|
71
70
|
# @!attribute tos
|
72
71
|
# Additionnal TOS metrics
|
73
72
|
# @return [ArrayOfTosMetric]
|
74
|
-
define_field :tos, ArrayOfTosMetric, builder: ->(h,t) { t.new(counter: h[:tos_count]) }
|
73
|
+
define_field :tos, ArrayOfTosMetric, builder: ->(h, t) { t.new(counter: h[:tos_count]) }
|
75
74
|
|
76
75
|
# @return [String]
|
77
76
|
def to_human
|
@@ -106,7 +105,7 @@ module PacketGen
|
|
106
105
|
# @attribute links
|
107
106
|
# @return [ArrayOfLink]
|
108
107
|
define_field :links, ArrayOfLink, builder: ->(h, t) { t.new(counter: h[:link_count]) }
|
109
|
-
|
108
|
+
|
110
109
|
# @attribute v_flag
|
111
110
|
# @return [Boolean]
|
112
111
|
# @attribute e_flag
|
@@ -148,7 +147,7 @@ module PacketGen
|
|
148
147
|
# @!attribute ext_route_tag
|
149
148
|
# @return [Integer]
|
150
149
|
define_field :ext_route_tag, Types::Int32
|
151
|
-
|
150
|
+
|
152
151
|
# @!attribute e_flag
|
153
152
|
# @return [Boolean]
|
154
153
|
# @!attribute tos
|
@@ -185,7 +184,7 @@ module PacketGen
|
|
185
184
|
# @author Sylvain Daubert
|
186
185
|
class ArrayOfLSA < Types::Array
|
187
186
|
set_of LSA
|
188
|
-
|
187
|
+
|
189
188
|
# @param [Hash] options
|
190
189
|
# @option options [Types::Int] counter Int object used as a counter for this set
|
191
190
|
# @option options [Boolean] only_headers if +true+, only {LSAHeader LSAHeaders}
|
@@ -201,17 +200,17 @@ module PacketGen
|
|
201
200
|
def read(str)
|
202
201
|
clear
|
203
202
|
return self if str.nil?
|
204
|
-
return self if @counter
|
203
|
+
return self if @counter && @counter.to_i.zero?
|
205
204
|
force_binary str
|
206
|
-
|
205
|
+
until str.empty?
|
207
206
|
lsa = LSAHeader.new.read(str)
|
208
|
-
|
207
|
+
unless @only_headers
|
209
208
|
klass = get_lsa_class_by_human_type(lsa.human_type)
|
210
209
|
lsa = klass.new.read(str[0...lsa.length])
|
211
210
|
end
|
212
211
|
self.push lsa
|
213
212
|
str.slice!(0, lsa.sz)
|
214
|
-
break if @counter
|
213
|
+
break if @counter && (self.size == @counter.to_i)
|
215
214
|
end
|
216
215
|
self
|
217
216
|
end
|
@@ -219,10 +218,10 @@ module PacketGen
|
|
219
218
|
private
|
220
219
|
|
221
220
|
def record_from_hash(hsh)
|
222
|
-
unless hsh.
|
223
|
-
raise ArgumentError,
|
221
|
+
unless hsh.key? :type
|
222
|
+
raise ArgumentError, 'hash should have :type key'
|
224
223
|
end
|
225
|
-
|
224
|
+
|
226
225
|
klass = if @only_headers
|
227
226
|
LSAHeader
|
228
227
|
else
|
@@ -239,7 +238,7 @@ module PacketGen
|
|
239
238
|
end
|
240
239
|
|
241
240
|
def get_lsa_class_by_human_type(htype)
|
242
|
-
klassname = "LSA#{htype.to_s.
|
241
|
+
klassname = "LSA#{htype.to_s.delete('-')}"
|
243
242
|
if OSPFv2.const_defined? klassname
|
244
243
|
OSPFv2.const_get klassname
|
245
244
|
else
|
@@ -8,7 +8,6 @@
|
|
8
8
|
module PacketGen
|
9
9
|
module Header
|
10
10
|
class OSPFv2
|
11
|
-
|
12
11
|
# This class handles {OSPFv2 OSPFv2} LSA header. A LSA header has the
|
13
12
|
# following format:
|
14
13
|
# 0 1 2 3
|
@@ -37,7 +36,7 @@ module PacketGen
|
|
37
36
|
'Summary-IP' => 3,
|
38
37
|
'Summary-ABSR' => 4,
|
39
38
|
'AS-External' => 5
|
40
|
-
}
|
39
|
+
}.freeze
|
41
40
|
|
42
41
|
# @!attribute age
|
43
42
|
# The time in seconds since the LSA was originated.
|
@@ -72,7 +71,7 @@ module PacketGen
|
|
72
71
|
# Length of the LSA, including the header.
|
73
72
|
# @return [Integer]
|
74
73
|
define_field :length, Types::Int16
|
75
|
-
|
74
|
+
|
76
75
|
# Compute and set Fletcher-16 checksum on LSA
|
77
76
|
# @return [Integer]
|
78
77
|
def calc_checksum
|
@@ -86,10 +85,10 @@ module PacketGen
|
|
86
85
|
end
|
87
86
|
c0 %= 255
|
88
87
|
c1 %= 255
|
89
|
-
|
88
|
+
|
90
89
|
x = ((sz - 16 - 1) * c0 - c1) % 255
|
91
90
|
x += 255 if x <= 0
|
92
|
-
y = 255*2 - c0 - x
|
91
|
+
y = 255 * 2 - c0 - x
|
93
92
|
y -= 255 if y > 255
|
94
93
|
self.checksum = (x << 8) | y
|
95
94
|
end
|