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
data/lib/packetgen/pcapng.rb
CHANGED
@@ -4,15 +4,14 @@
|
|
4
4
|
# This program is published under MIT license.
|
5
5
|
|
6
6
|
# frozen_string_literal: true
|
7
|
+
|
7
8
|
require 'stringio'
|
8
9
|
|
9
10
|
module PacketGen
|
10
|
-
|
11
11
|
# Module to handle PCAP-NG file format.
|
12
12
|
# See http://xml2rfc.tools.ietf.org/cgi-bin/xml2rfc.cgi?url=https://raw.githubusercontent.com/pcapng/pcapng/master/draft-tuexen-opsawg-pcapng.xml&modeAsFormat=html/ascii&type=ascii
|
13
13
|
# @author Sylvain Daubert
|
14
14
|
module PcapNG
|
15
|
-
|
16
15
|
# Section Header Block type number
|
17
16
|
SHB_TYPE = Types::Int32.new(0x0A0D0D0A, :little)
|
18
17
|
# Interface Description Block type number
|
@@ -44,12 +43,9 @@ module PacketGen
|
|
44
43
|
class Error < PacketGen::Error; end
|
45
44
|
# Invalid PcapNG file error
|
46
45
|
class InvalidFileError < Error; end
|
47
|
-
|
48
46
|
end
|
49
|
-
|
50
47
|
end
|
51
48
|
|
52
|
-
|
53
49
|
require_relative 'pcapng/block.rb'
|
54
50
|
require_relative 'pcapng/unknown_block.rb'
|
55
51
|
require_relative 'pcapng/shb.rb'
|
@@ -7,11 +7,9 @@
|
|
7
7
|
|
8
8
|
module PacketGen
|
9
9
|
module PcapNG
|
10
|
-
|
11
10
|
# @abstract Base class for all block types
|
12
11
|
# @author Sylvain Daubert
|
13
12
|
class Block < Types::Fields
|
14
|
-
|
15
13
|
# @return [:little, :big]
|
16
14
|
attr_accessor :endian
|
17
15
|
|
@@ -34,8 +32,16 @@ module PacketGen
|
|
34
32
|
|
35
33
|
# Has this block option?
|
36
34
|
# @return [Boolean]
|
35
|
+
# @since 2.7.0
|
36
|
+
def options?
|
37
|
+
@fields.key?(:options) && @fields[:options].sz > 0
|
38
|
+
end
|
39
|
+
|
40
|
+
# @deprecated Use {#options?} instead.
|
41
|
+
# @return [Boolean]
|
37
42
|
def has_options?
|
38
|
-
|
43
|
+
Deprecation.deprecated(self.class, __method__, 'options?')
|
44
|
+
options?
|
39
45
|
end
|
40
46
|
|
41
47
|
# Calculate block length and update :block_len and block_len2 fields
|
@@ -50,7 +56,7 @@ module PacketGen
|
|
50
56
|
# @return [void]
|
51
57
|
def pad_field(*fields)
|
52
58
|
fields.each do |field|
|
53
|
-
unless @fields[field].size % 4
|
59
|
+
unless (@fields[field].size % 4).zero?
|
54
60
|
@fields[field] << "\x00" * (4 - (@fields[field].size % 4))
|
55
61
|
end
|
56
62
|
end
|
@@ -60,15 +66,15 @@ module PacketGen
|
|
60
66
|
|
61
67
|
# Set the endianness for the various Int classes handled by self.
|
62
68
|
# Must be called by all subclass #initialize method.
|
63
|
-
# @param [:little, :big]
|
64
|
-
# @return [:little, :big] returns
|
65
|
-
def set_endianness(
|
66
|
-
unless [
|
69
|
+
# @param [:little, :big] endian
|
70
|
+
# @return [:little, :big] returns endian
|
71
|
+
def set_endianness(endian)
|
72
|
+
unless %i[little big].include? endian
|
67
73
|
raise ArgumentError, "unknown endianness for #{self.class}"
|
68
74
|
end
|
69
|
-
@endian =
|
70
|
-
@fields.each { |
|
71
|
-
|
75
|
+
@endian = endian
|
76
|
+
@fields.each { |_f, v| v.endian = endian if v.is_a?(Types::Int) }
|
77
|
+
endian
|
72
78
|
end
|
73
79
|
|
74
80
|
def check_len_coherency
|
data/lib/packetgen/pcapng/epb.rb
CHANGED
@@ -7,7 +7,6 @@
|
|
7
7
|
|
8
8
|
module PacketGen
|
9
9
|
module PcapNG
|
10
|
-
|
11
10
|
# {EPB} represents a Enhanced Packet Block (EPB) of a pcapng file.
|
12
11
|
#
|
13
12
|
# == EPB Definition
|
@@ -23,9 +22,8 @@ module PacketGen
|
|
23
22
|
# Int32 :block_len2
|
24
23
|
# @author Sylvain Daubert
|
25
24
|
class EPB < Block
|
26
|
-
|
27
25
|
# Minimum EPB size
|
28
|
-
MIN_SIZE
|
26
|
+
MIN_SIZE = 8 * 4
|
29
27
|
|
30
28
|
# @return [:little, :big]
|
31
29
|
attr_accessor :endian
|
@@ -84,11 +82,11 @@ module PacketGen
|
|
84
82
|
# @param [::String,IO] str_or_io
|
85
83
|
# @return [self]
|
86
84
|
def read(str_or_io)
|
87
|
-
if str_or_io.respond_to? :read
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
85
|
+
io = if str_or_io.respond_to? :read
|
86
|
+
str_or_io
|
87
|
+
else
|
88
|
+
StringIO.new(force_binary(str_or_io.to_s))
|
89
|
+
end
|
92
90
|
return self if io.eof?
|
93
91
|
|
94
92
|
self[:type].read io.read(4)
|
@@ -124,7 +122,6 @@ module PacketGen
|
|
124
122
|
super
|
125
123
|
end
|
126
124
|
|
127
|
-
|
128
125
|
private
|
129
126
|
|
130
127
|
def ts_resol
|
@@ -134,8 +131,6 @@ module PacketGen
|
|
134
131
|
@interface.ts_resol
|
135
132
|
end
|
136
133
|
end
|
137
|
-
|
138
134
|
end
|
139
|
-
|
140
135
|
end
|
141
136
|
end
|
@@ -7,11 +7,9 @@
|
|
7
7
|
|
8
8
|
module PacketGen
|
9
9
|
module PcapNG
|
10
|
-
|
11
10
|
# PcapNG::File is a complete Pcap-NG file handler.
|
12
11
|
# @author Sylvain Daubert
|
13
12
|
class File
|
14
|
-
|
15
13
|
# Known link types
|
16
14
|
KNOWN_LINK_TYPES = {
|
17
15
|
LINKTYPE_ETHERNET => 'Eth',
|
@@ -64,20 +62,17 @@ module PacketGen
|
|
64
62
|
end
|
65
63
|
|
66
64
|
::File.open(fname, 'rb') do |f|
|
67
|
-
|
68
|
-
parse_section(f)
|
69
|
-
end
|
65
|
+
parse_section(f) until f.eof?
|
70
66
|
end
|
71
67
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
end
|
68
|
+
return unless blk
|
69
|
+
count = 0
|
70
|
+
@sections.each do |section|
|
71
|
+
section.interfaces.each do |intf|
|
72
|
+
intf.packets.each { |pkt| count += 1; yield pkt }
|
78
73
|
end
|
79
|
-
count
|
80
74
|
end
|
75
|
+
count
|
81
76
|
end
|
82
77
|
|
83
78
|
# Give an array of raw packets (raw data from packets).
|
@@ -143,7 +138,7 @@ module PacketGen
|
|
143
138
|
# Return the object as a String
|
144
139
|
# @return [String]
|
145
140
|
def to_s
|
146
|
-
@sections.map
|
141
|
+
@sections.map(&:to_s).join
|
147
142
|
end
|
148
143
|
|
149
144
|
# Clear the contents of the Pcapng::File.
|
@@ -173,9 +168,9 @@ module PacketGen
|
|
173
168
|
@sections.each do |section|
|
174
169
|
section.interfaces.each do |itf|
|
175
170
|
if options[:keep_timestamps] || options[:keep_ts]
|
176
|
-
ary.concat
|
171
|
+
ary.concat(itf.packets.map { |pkt| { pkt.timestamp => pkt.data.to_s } })
|
177
172
|
else
|
178
|
-
ary.concat
|
173
|
+
ary.concat(itf.packets.map { |pkt| pkt.data.to_s })
|
179
174
|
end
|
180
175
|
end
|
181
176
|
end
|
@@ -188,29 +183,28 @@ module PacketGen
|
|
188
183
|
# the packets are appended to the file, rather than overwriting it
|
189
184
|
# @return [Array] array of 2 elements: filename and size written
|
190
185
|
def to_file(filename, options={})
|
191
|
-
mode =
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
::File.open(filename, mode) {|f| f.write(self.to_s)}
|
186
|
+
mode = if options[:append] && ::File.exist?(filename)
|
187
|
+
'ab'
|
188
|
+
else
|
189
|
+
'wb'
|
190
|
+
end
|
191
|
+
::File.open(filename, mode) { |f| f.write(self.to_s) }
|
198
192
|
[filename, self.to_s.size]
|
199
193
|
end
|
200
|
-
|
194
|
+
alias to_f to_file
|
201
195
|
|
202
196
|
# Shorthand method for writing to a file.
|
203
197
|
# @param [#to_s] filename
|
204
198
|
# @return [Array] see return value from {#to_file}
|
205
199
|
def write(filename='out.pcapng')
|
206
|
-
self.to_file(filename.to_s, :
|
200
|
+
self.to_file(filename.to_s, append: false)
|
207
201
|
end
|
208
202
|
|
209
203
|
# Shorthand method for appending to a file.
|
210
204
|
# @param [#to_s] filename
|
211
205
|
# @return [Array] see return value from {#to_file}
|
212
206
|
def append(filename='out.pcapng')
|
213
|
-
self.to_file(filename.to_s, :
|
207
|
+
self.to_file(filename.to_s, append: true)
|
214
208
|
end
|
215
209
|
|
216
210
|
# @overload array_to_file(ary)
|
@@ -235,12 +229,12 @@ module PacketGen
|
|
235
229
|
when Hash
|
236
230
|
filename = options[:filename] || options[:file]
|
237
231
|
ary = options[:array] || options[:arr]
|
238
|
-
unless ary.
|
232
|
+
unless ary.is_a? Array
|
239
233
|
raise ArgumentError, ':array parameter needs to be an array'
|
240
234
|
end
|
241
235
|
ts = options[:timestamp] || options[:ts] || Time.now
|
242
236
|
ts_inc = options[:ts_inc] || 1
|
243
|
-
append =
|
237
|
+
append = !options[:append].nil?
|
244
238
|
when Array
|
245
239
|
ary = options
|
246
240
|
ts = Time.now
|
@@ -253,7 +247,7 @@ module PacketGen
|
|
253
247
|
|
254
248
|
section = SHB.new
|
255
249
|
@sections << section
|
256
|
-
itf = IDB.new(:
|
250
|
+
itf = IDB.new(endian: section.endian)
|
257
251
|
classify_block section, itf
|
258
252
|
|
259
253
|
ary.each_with_index do |pkt, i|
|
@@ -270,24 +264,23 @@ module PacketGen
|
|
270
264
|
this_ts = (this_ts / itf.ts_resol).to_i
|
271
265
|
this_tsh = this_ts >> 32
|
272
266
|
this_tsl = this_ts & 0xffffffff
|
273
|
-
this_pkt = EPB.new(:
|
274
|
-
:
|
275
|
-
:
|
276
|
-
:
|
277
|
-
:
|
278
|
-
:
|
279
|
-
:
|
267
|
+
this_pkt = EPB.new(endian: section.endian,
|
268
|
+
interface_id: 0,
|
269
|
+
tsh: this_tsh,
|
270
|
+
tsl: this_tsl,
|
271
|
+
cap_len: this_cap_len,
|
272
|
+
orig_len: this_cap_len,
|
273
|
+
data: this_data)
|
280
274
|
classify_block section, this_pkt
|
281
275
|
end
|
282
276
|
|
283
277
|
if filename
|
284
|
-
self.to_f(filename, :
|
278
|
+
self.to_f(filename, append: append)
|
285
279
|
else
|
286
280
|
self
|
287
281
|
end
|
288
282
|
end
|
289
283
|
|
290
|
-
|
291
284
|
private
|
292
285
|
|
293
286
|
# Parse a section. A section is made of at least a SHB. It than may contain
|
@@ -304,19 +297,19 @@ module PacketGen
|
|
304
297
|
if shb.section_len.to_i != 0xffffffffffffffff
|
305
298
|
# Section length is defined
|
306
299
|
section = StringIO.new(io.read(shb.section_len.to_i))
|
307
|
-
|
300
|
+
until section.eof?
|
308
301
|
shb = @sections.last
|
309
302
|
type = Types::Int32.new(0, shb.endian).read(section.read(4))
|
310
303
|
section.seek(-4, IO::SEEK_CUR)
|
311
|
-
|
304
|
+
parse(type, section, shb)
|
312
305
|
end
|
313
306
|
else
|
314
307
|
# section length is undefined
|
315
|
-
|
308
|
+
until io.eof?
|
316
309
|
shb = @sections.last
|
317
310
|
type = Types::Int32.new(0, shb.endian).read(io.read(4))
|
318
311
|
io.seek(-4, IO::SEEK_CUR)
|
319
|
-
|
312
|
+
parse(type, io, shb)
|
320
313
|
end
|
321
314
|
end
|
322
315
|
end
|
@@ -327,11 +320,11 @@ module PacketGen
|
|
327
320
|
# @param [SHB] shb header of current section
|
328
321
|
# @return [void]
|
329
322
|
def parse(type, io, shb)
|
330
|
-
types = PcapNG.constants(false).select { |c| c.to_s =~ /_TYPE/ }
|
331
|
-
|
323
|
+
types = PcapNG.constants(false).select { |c| c.to_s =~ /_TYPE/ }
|
324
|
+
.map { |c| [PcapNG.const_get(c).to_i, c] }
|
332
325
|
types = Hash[types]
|
333
326
|
|
334
|
-
if types.
|
327
|
+
if types.key?(type.to_i)
|
335
328
|
klass = PcapNG.const_get(types[type.to_i].to_s.gsub(/_TYPE/, '').to_sym)
|
336
329
|
block = klass.new(endian: shb.endian)
|
337
330
|
else
|
data/lib/packetgen/pcapng/idb.rb
CHANGED
@@ -7,7 +7,6 @@
|
|
7
7
|
|
8
8
|
module PacketGen
|
9
9
|
module PcapNG
|
10
|
-
|
11
10
|
# {IDB} represents a Interface Description Block (IDB) of a pcapng file.
|
12
11
|
#
|
13
12
|
# == IDB Definition
|
@@ -20,9 +19,8 @@ module PacketGen
|
|
20
19
|
# Int32 :block_len2
|
21
20
|
# @author Sylvain Daubert
|
22
21
|
class IDB < Block
|
23
|
-
|
24
22
|
# Minimum IDB size
|
25
|
-
MIN_SIZE
|
23
|
+
MIN_SIZE = 5 * 4
|
26
24
|
|
27
25
|
# Option code for if_tsresol option
|
28
26
|
OPTION_IF_TSRESOL = 9
|
@@ -73,11 +71,11 @@ module PacketGen
|
|
73
71
|
# @param [::String,IO] str_or_io
|
74
72
|
# @return [self]
|
75
73
|
def read(str_or_io)
|
76
|
-
if str_or_io.respond_to? :read
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
74
|
+
io = if str_or_io.respond_to? :read
|
75
|
+
str_or_io
|
76
|
+
else
|
77
|
+
StringIO.new(force_binary(str_or_io.to_s))
|
78
|
+
end
|
81
79
|
return self if io.eof?
|
82
80
|
|
83
81
|
self[:type].read io.read(4)
|
@@ -104,23 +102,22 @@ module PacketGen
|
|
104
102
|
# @param [Boolean] force if +true+, force decoding even if already done
|
105
103
|
# @return [Float]
|
106
104
|
def ts_resol(force: false)
|
107
|
-
if @options_decoded
|
105
|
+
if @options_decoded && !force
|
108
106
|
@ts_resol
|
109
107
|
else
|
110
|
-
packstr =
|
108
|
+
packstr = @endian == :little ? 'v' : 'n'
|
111
109
|
idx = 0
|
112
110
|
options = self[:options]
|
113
|
-
opt_code = opt_len = 0
|
114
111
|
|
115
|
-
while idx < options.length
|
112
|
+
while idx < options.length
|
116
113
|
opt_code, opt_len = options[idx, 4].unpack("#{packstr}2")
|
117
|
-
if opt_code == OPTION_IF_TSRESOL
|
118
|
-
tsresol = options[idx+4, 1].unpack('C').first
|
119
|
-
if tsresol & 0x80
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
114
|
+
if opt_code == OPTION_IF_TSRESOL && opt_len == 1
|
115
|
+
tsresol = options[idx + 4, 1].unpack('C').first
|
116
|
+
@ts_resol = if (tsresol & 0x80).zero?
|
117
|
+
10**-tsresol
|
118
|
+
else
|
119
|
+
2**-(tsresol & 0x7f)
|
120
|
+
end
|
124
121
|
|
125
122
|
@options_decoded = true
|
126
123
|
return @ts_resol
|
@@ -130,7 +127,7 @@ module PacketGen
|
|
130
127
|
end
|
131
128
|
|
132
129
|
@options_decoded = true
|
133
|
-
@ts_resol = 1E-6
|
130
|
+
@ts_resol = 1E-6 # default value
|
134
131
|
end
|
135
132
|
end
|
136
133
|
|
@@ -141,8 +138,6 @@ module PacketGen
|
|
141
138
|
recalc_block_len
|
142
139
|
super << @packets.map(&:to_s).join
|
143
140
|
end
|
144
|
-
|
145
141
|
end
|
146
|
-
|
147
142
|
end
|
148
143
|
end
|
data/lib/packetgen/pcapng/shb.rb
CHANGED
@@ -7,7 +7,6 @@
|
|
7
7
|
|
8
8
|
module PacketGen
|
9
9
|
module PcapNG
|
10
|
-
|
11
10
|
# {SHB} represents a Section Header Block (SHB) of a pcapng file.
|
12
11
|
#
|
13
12
|
# == SHB Definition
|
@@ -21,7 +20,6 @@ module PacketGen
|
|
21
20
|
# Int32 :block_len2
|
22
21
|
# @author Sylvain Daubert
|
23
22
|
class SHB < Block
|
24
|
-
|
25
23
|
# @return [:little, :big]
|
26
24
|
attr_accessor :endian
|
27
25
|
# Get interfaces for this section
|
@@ -39,7 +37,7 @@ module PacketGen
|
|
39
37
|
MAGIC_BIG = [MAGIC_INT32].pack('N')
|
40
38
|
|
41
39
|
# Minimum SHB size
|
42
|
-
MIN_SIZE
|
40
|
+
MIN_SIZE = 7 * 4
|
43
41
|
# +section_len+ value for undefined length
|
44
42
|
SECTION_LEN_UNDEFINED = 0xffffffff_ffffffff
|
45
43
|
|
@@ -91,11 +89,11 @@ module PacketGen
|
|
91
89
|
# @param [::String,IO] str_or_io
|
92
90
|
# @return [self]
|
93
91
|
def read(str_or_io)
|
94
|
-
if str_or_io.respond_to? :read
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
92
|
+
io = if str_or_io.respond_to? :read
|
93
|
+
str_or_io
|
94
|
+
else
|
95
|
+
StringIO.new(force_binary(str_or_io.to_s))
|
96
|
+
end
|
99
97
|
return self if io.eof?
|
100
98
|
|
101
99
|
type_str = io.read(4)
|
@@ -159,12 +157,11 @@ module PacketGen
|
|
159
157
|
super + body
|
160
158
|
end
|
161
159
|
|
162
|
-
|
163
160
|
private
|
164
161
|
|
165
162
|
def force_endianness(endian)
|
166
163
|
@endian = endian
|
167
|
-
self[:type]
|
164
|
+
self[:type] = Types::Int32.new(self[:type].to_i, endian)
|
168
165
|
self[:block_len] = Types::Int32.new(self[:block_len].to_i, endian)
|
169
166
|
self[:magic] = Types::Int32.new(self[:magic].to_i, endian)
|
170
167
|
self[:ver_major] = Types::Int16.new(self[:ver_major].to_i, endian)
|