packetgen 2.8.1 → 2.8.3
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/README.md +11 -4
- data/lib/packetgen/deprecation.rb +2 -1
- data/lib/packetgen/header/asn1_base.rb +2 -2
- data/lib/packetgen/header/base.rb +7 -3
- data/lib/packetgen/header/bootp.rb +4 -3
- data/lib/packetgen/header/dhcpv6/duid.rb +0 -6
- data/lib/packetgen/header/dhcpv6/option.rb +0 -18
- data/lib/packetgen/header/dns.rb +7 -7
- data/lib/packetgen/header/dot11.rb +10 -4
- data/lib/packetgen/header/dot11/sub_mngt.rb +2 -2
- data/lib/packetgen/header/eap/md5.rb +0 -1
- data/lib/packetgen/header/eap/tls.rb +6 -5
- data/lib/packetgen/header/eap/ttls.rb +5 -4
- data/lib/packetgen/header/ike.rb +2 -1
- data/lib/packetgen/header/ike/cert.rb +3 -3
- data/lib/packetgen/header/ike/certreq.rb +3 -3
- data/lib/packetgen/header/ike/notify.rb +4 -3
- data/lib/packetgen/header/ike/sa.rb +0 -1
- data/lib/packetgen/header/ike/ts.rb +0 -1
- data/lib/packetgen/header/ip.rb +5 -4
- data/lib/packetgen/header/ip/option.rb +0 -5
- data/lib/packetgen/header/ipv6.rb +3 -2
- data/lib/packetgen/header/netbios/datagram.rb +2 -2
- data/lib/packetgen/header/snmp.rb +2 -2
- data/lib/packetgen/header/tcp.rb +5 -4
- data/lib/packetgen/header/tftp.rb +0 -3
- data/lib/packetgen/inspect.rb +16 -10
- data/lib/packetgen/packet.rb +4 -4
- data/lib/packetgen/types/fields.rb +56 -15
- data/lib/packetgen/types/int.rb +122 -13
- data/lib/packetgen/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8ed1bb8d789bf32ec06fefdb337c59a0bc798c681b109414e3c84e29d7668890
|
4
|
+
data.tar.gz: 938c883c20a2a5452aa4ade8d55cec86971eafc4c561c8980260c509b57312fb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8cccb84679cdf8934e2e26b267cb4d00576201ff309311d70d7907dd3ea1ddb6ea3f61a11b2a081b4648a8e3263083ba7484961448ea60f944b6f0541e145d58
|
7
|
+
data.tar.gz: dfda8ea794e137b501bcbf1810f35ed637113ee33c548132d8f0f0db2cb24b6ca8603222eaf8185d02f37ca8ba2a0bd7ff60701cedd28fbaf8ccedd1c3985d35
|
data/README.md
CHANGED
@@ -157,20 +157,27 @@ classes. A special `config` object gives local network configuration:
|
|
157
157
|
|
158
158
|
If `pry` gem is installed, it is used as backend for `pgconsole`, else IRB is used.
|
159
159
|
|
160
|
+
## Plugins
|
161
|
+
|
162
|
+
PacketGen provides a plugin system (see [wiki](https://github.com/sdaubert/packetgen/wiki/Create-Custom-Protocol)).
|
163
|
+
|
164
|
+
For now, there is only one plugin available as a gem:
|
165
|
+
|
166
|
+
* [packetgen-plugin-smb](https://github.com/sdaubert/packetgen-plugin-smb): add (limited) support for SMB protocol suite.
|
167
|
+
|
160
168
|
## See also
|
161
169
|
|
162
170
|
Wiki: https://github.com/sdaubert/packetgen/wiki
|
163
171
|
|
164
172
|
API documentation: http://www.rubydoc.info/gems/packetgen
|
165
173
|
|
166
|
-
##
|
174
|
+
## Contributing
|
167
175
|
|
168
|
-
|
176
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/sdaubert/packetgen-plugin-smb.
|
169
177
|
|
170
178
|
## License
|
171
|
-
MIT License (see [LICENSE](https://github.com/sdaubert/packetgen/blob/master/LICENSE))
|
172
179
|
|
173
|
-
|
180
|
+
MIT License (see [LICENSE](https://github.com/sdaubert/packetgen/blob/master/LICENSE))
|
174
181
|
|
175
182
|
### Other sources
|
176
183
|
All original code maintains its copyright from its original authors and licensing.
|
@@ -10,7 +10,8 @@ module PacketGen
|
|
10
10
|
complete_deprecated_method_name = base_name + deprecated_method.to_s
|
11
11
|
complete_new_method_name = base_name + new_method.to_s
|
12
12
|
|
13
|
-
|
13
|
+
file, line = caller(2).first.split(':')[0, 2]
|
14
|
+
warn "#{file}:#{line}: #{complete_deprecated_method_name} is deprecated in favor of #{complete_new_method_name}. " \
|
14
15
|
"It will be remove in PacketGen #{remove_version}."
|
15
16
|
end
|
16
17
|
end
|
@@ -100,9 +100,9 @@ module PacketGen
|
|
100
100
|
# Common inspect method for ASN.1 headers
|
101
101
|
# @return [String]
|
102
102
|
def inspect
|
103
|
-
str = Inspect.dashed_line(self.class,
|
103
|
+
str = Inspect.dashed_line(self.class, 1)
|
104
104
|
self.class.class_eval { @attributes }.each do |attr|
|
105
|
-
str << Inspect.inspect_asn1_attribute(attr, self[attr],
|
105
|
+
str << Inspect.inspect_asn1_attribute(attr, self[attr], 1)
|
106
106
|
end
|
107
107
|
str
|
108
108
|
end
|
@@ -17,7 +17,6 @@ module PacketGen
|
|
17
17
|
class Base < Types::Fields
|
18
18
|
# @api private
|
19
19
|
# Simple class to handle a header association
|
20
|
-
# @deprecated Will be remove with {Base.bind_header}
|
21
20
|
class Binding < Struct.new(:key, :value)
|
22
21
|
# Check +fields+ responds to binding
|
23
22
|
# @param [Types::Fields] fields
|
@@ -51,7 +50,6 @@ module PacketGen
|
|
51
50
|
|
52
51
|
# @api private
|
53
52
|
# Class to handle a header association from procs
|
54
|
-
# @deprecated Will be remove with {Base.bind_header}
|
55
53
|
class ProcBinding
|
56
54
|
# @param [Array<Proc>] procs first proc is used to set fields, second proc is
|
57
55
|
# used to check binding
|
@@ -163,7 +161,7 @@ module PacketGen
|
|
163
161
|
# @return [Packet,nil]
|
164
162
|
attr_reader :packet
|
165
163
|
|
166
|
-
# On inheritage, create +@
|
164
|
+
# On inheritage, create +@known_header+ class variable
|
167
165
|
# @param [Class] klass
|
168
166
|
# @return [void]
|
169
167
|
def self.inherited(klass)
|
@@ -286,6 +284,12 @@ module PacketGen
|
|
286
284
|
@known_headers
|
287
285
|
end
|
288
286
|
|
287
|
+
# @see Types::Fields#initialize
|
288
|
+
def initialize(options={})
|
289
|
+
@packet = options.delete(:packet) if options.key?(:packet)
|
290
|
+
super
|
291
|
+
end
|
292
|
+
|
289
293
|
# Return header protocol name
|
290
294
|
# @return [String]
|
291
295
|
def protocol_name
|
@@ -132,14 +132,15 @@ module PacketGen
|
|
132
132
|
|
133
133
|
# @return [String]
|
134
134
|
def inspect
|
135
|
-
str = Inspect.dashed_line(self.class,
|
135
|
+
str = Inspect.dashed_line(self.class, 1)
|
136
136
|
fields.each do |attr|
|
137
137
|
next if attr == :body
|
138
138
|
next unless is_present?(attr)
|
139
|
+
|
139
140
|
str << if (attr == :chaddr) && (self.hlen == 6)
|
140
|
-
Inspect.inspect_attribute(attr, Eth::MacAddr.new.read(self[:chaddr][0, 6]),
|
141
|
+
Inspect.inspect_attribute(attr, Eth::MacAddr.new.read(self[:chaddr][0, 6]), 1)
|
141
142
|
else
|
142
|
-
Inspect.inspect_attribute(attr, self[attr],
|
143
|
+
Inspect.inspect_attribute(attr, self[attr], 1)
|
143
144
|
end
|
144
145
|
end
|
145
146
|
str
|
@@ -62,8 +62,6 @@ module PacketGen
|
|
62
62
|
# @author Sylvain Daubert
|
63
63
|
class DUID_LLT < DUID
|
64
64
|
delete_field :body
|
65
|
-
undef body
|
66
|
-
undef body=
|
67
65
|
|
68
66
|
# Base time for time computation
|
69
67
|
BASE_TIME = Time.utc(2000, 1, 1)
|
@@ -102,8 +100,6 @@ module PacketGen
|
|
102
100
|
# @author Sylvain Daubert
|
103
101
|
class DUID_EN < DUID
|
104
102
|
delete_field :body
|
105
|
-
undef body
|
106
|
-
undef body=
|
107
103
|
|
108
104
|
# @!attribute en
|
109
105
|
# 32-bit entreprise number
|
@@ -124,8 +120,6 @@ module PacketGen
|
|
124
120
|
# @author Sylvain Daubert
|
125
121
|
class DUID_LL < DUID
|
126
122
|
delete_field :body
|
127
|
-
undef body
|
128
|
-
undef body=
|
129
123
|
|
130
124
|
# @!attribute htype
|
131
125
|
# 16-bit hardware protocol type
|
@@ -135,8 +135,6 @@ module PacketGen
|
|
135
135
|
TYPE = 1
|
136
136
|
|
137
137
|
delete_field :data
|
138
|
-
undef data
|
139
|
-
undef data=
|
140
138
|
|
141
139
|
# @!attribute duid
|
142
140
|
# @return [DUID]
|
@@ -163,8 +161,6 @@ module PacketGen
|
|
163
161
|
TYPE = 3
|
164
162
|
|
165
163
|
delete_field :data
|
166
|
-
undef data
|
167
|
-
undef data=
|
168
164
|
|
169
165
|
# @!attribute iaid
|
170
166
|
# 32-bit IAID field
|
@@ -198,8 +194,6 @@ module PacketGen
|
|
198
194
|
TYPE = 4
|
199
195
|
|
200
196
|
delete_field :data
|
201
|
-
undef data
|
202
|
-
undef data=
|
203
197
|
|
204
198
|
# @!attribute iaid
|
205
199
|
# 32-bit IAID field
|
@@ -225,8 +219,6 @@ module PacketGen
|
|
225
219
|
TYPE = 5
|
226
220
|
|
227
221
|
delete_field :data
|
228
|
-
undef data
|
229
|
-
undef data=
|
230
222
|
|
231
223
|
# @attribute ipv6
|
232
224
|
# IPv6 address
|
@@ -267,8 +259,6 @@ module PacketGen
|
|
267
259
|
TYPE = 6
|
268
260
|
|
269
261
|
delete_field :data
|
270
|
-
undef data
|
271
|
-
undef data=
|
272
262
|
|
273
263
|
# @!attribute options
|
274
264
|
# @return [RequestedOptions]
|
@@ -298,8 +288,6 @@ module PacketGen
|
|
298
288
|
TYPE = 7
|
299
289
|
|
300
290
|
delete_field :data
|
301
|
-
undef data
|
302
|
-
undef data=
|
303
291
|
|
304
292
|
# @!attribute value
|
305
293
|
# 8-bit value
|
@@ -320,8 +308,6 @@ module PacketGen
|
|
320
308
|
TYPE = 8
|
321
309
|
|
322
310
|
delete_field :data
|
323
|
-
undef data
|
324
|
-
undef data=
|
325
311
|
|
326
312
|
# @!attribute value
|
327
313
|
# 16-bit value
|
@@ -349,8 +335,6 @@ module PacketGen
|
|
349
335
|
TYPE = 12
|
350
336
|
|
351
337
|
delete_field :data
|
352
|
-
undef data
|
353
|
-
undef data=
|
354
338
|
|
355
339
|
# @!attribute addr
|
356
340
|
# IPv6 server address
|
@@ -378,8 +362,6 @@ module PacketGen
|
|
378
362
|
TYPE = 14
|
379
363
|
|
380
364
|
delete_field :data
|
381
|
-
undef data
|
382
|
-
undef data=
|
383
365
|
end
|
384
366
|
end
|
385
367
|
end
|
data/lib/packetgen/header/dns.rb
CHANGED
@@ -250,21 +250,21 @@ module PacketGen
|
|
250
250
|
|
251
251
|
# @return [String]
|
252
252
|
def inspect
|
253
|
-
str = Inspect.dashed_line(self.class,
|
253
|
+
str = Inspect.dashed_line(self.class, 1)
|
254
254
|
fields.each do |attr|
|
255
255
|
if attr == :u16
|
256
256
|
flags = %i[qr aa tc rd ra].select! { |flag| send "#{flag}?" }
|
257
257
|
.map(&:to_s).join(',')
|
258
|
-
str << Inspect.shift_level(
|
258
|
+
str << Inspect.shift_level(1)
|
259
259
|
str << Inspect::FMT_ATTR % ['Flags', 'flags', flags]
|
260
|
-
opcode = '%-
|
261
|
-
str << Inspect.shift_level(
|
260
|
+
opcode = '%-16s (%u)' % [OPCODES.key(self.opcode), self.opcode]
|
261
|
+
str << Inspect.shift_level(1)
|
262
262
|
str << Inspect::FMT_ATTR % ['Integer', 'opcode', opcode]
|
263
|
-
rcode = '%-
|
264
|
-
str << Inspect.shift_level(
|
263
|
+
rcode = '%-16s (%u)' % [RCODES.key(self.rcode), self.rcode]
|
264
|
+
str << Inspect.shift_level(1)
|
265
265
|
str << Inspect::FMT_ATTR % ['Integer', 'rcode', rcode]
|
266
266
|
else
|
267
|
-
str << Inspect.inspect_attribute(attr, self[attr],
|
267
|
+
str << Inspect.inspect_attribute(attr, self[attr], 1)
|
268
268
|
end
|
269
269
|
end
|
270
270
|
str
|
@@ -40,6 +40,7 @@ module PacketGen
|
|
40
40
|
# @return [PPI] self
|
41
41
|
def read(str)
|
42
42
|
return self if str.nil?
|
43
|
+
|
43
44
|
force_binary str
|
44
45
|
self[:version].read str[0, 1]
|
45
46
|
self[:flags].read str[1, 1]
|
@@ -102,6 +103,7 @@ module PacketGen
|
|
102
103
|
# @return [RadioTap] self
|
103
104
|
def read(str)
|
104
105
|
return self if str.nil?
|
106
|
+
|
105
107
|
force_binary str
|
106
108
|
self[:version].read str[0, 1]
|
107
109
|
self[:pad].read str[1, 1]
|
@@ -331,6 +333,7 @@ module PacketGen
|
|
331
333
|
|
332
334
|
if self.class == Dot11
|
333
335
|
return self if str.nil?
|
336
|
+
|
334
337
|
force_binary str
|
335
338
|
self[:frame_ctrl].read str[0, 2]
|
336
339
|
|
@@ -372,16 +375,18 @@ module PacketGen
|
|
372
375
|
# @return [String]
|
373
376
|
def inspect
|
374
377
|
str = if self.class == Dot11
|
375
|
-
Inspect.dashed_line("#{self.class} #{human_type}",
|
378
|
+
Inspect.dashed_line("#{self.class} #{human_type}", 1)
|
376
379
|
elsif self.respond_to? :human_subtype
|
377
|
-
Inspect.dashed_line("#{self.class} #{human_subtype}",
|
380
|
+
Inspect.dashed_line("#{self.class} #{human_subtype}", 1)
|
378
381
|
else
|
379
|
-
Inspect.dashed_line(self.class.to_s,
|
382
|
+
Inspect.dashed_line(self.class.to_s, 1)
|
380
383
|
end
|
384
|
+
|
381
385
|
define_applicable_fields
|
382
386
|
@applicable_fields.each do |attr|
|
383
387
|
next if attr == :body
|
384
|
-
|
388
|
+
|
389
|
+
str << Inspect.inspect_attribute(attr, @fields[attr], 1)
|
385
390
|
end
|
386
391
|
str
|
387
392
|
end
|
@@ -403,6 +408,7 @@ module PacketGen
|
|
403
408
|
# @return [void]
|
404
409
|
def added_to_packet(packet)
|
405
410
|
return if packet.respond_to? :dot11
|
411
|
+
|
406
412
|
packet.instance_eval("def dot11(arg=nil); header(#{self.class}, arg); end")
|
407
413
|
end
|
408
414
|
|
@@ -45,9 +45,9 @@ module PacketGen
|
|
45
45
|
# @return [String]
|
46
46
|
def inspect
|
47
47
|
str = super
|
48
|
-
str << Inspect.dashed_line('Dot11 Elements',
|
48
|
+
str << Inspect.dashed_line('Dot11 Elements', 2)
|
49
49
|
@elements.each do |el|
|
50
|
-
str << Inspect.shift_level(
|
50
|
+
str << Inspect.shift_level(2) << el.to_human << "\n"
|
51
51
|
end
|
52
52
|
str
|
53
53
|
end
|
@@ -51,19 +51,20 @@ module PacketGen
|
|
51
51
|
|
52
52
|
# @return [String]
|
53
53
|
def inspect
|
54
|
-
str = Inspect.dashed_line(self.class,
|
54
|
+
str = Inspect.dashed_line(self.class, 1)
|
55
55
|
fields.each do |attr|
|
56
56
|
next if attr == :body
|
57
|
-
next unless
|
57
|
+
next unless present?(attr)
|
58
|
+
|
58
59
|
if attr == :flags
|
59
|
-
shift = Inspect.shift_level(
|
60
|
+
shift = Inspect.shift_level(1)
|
60
61
|
value = %i[l m s].map { |f| send("#{f}?") ? f.to_s : '.' }.join
|
61
|
-
value = '%-
|
62
|
+
value = '%-16s (0x%02x)' % [value, self.flags]
|
62
63
|
str << shift
|
63
64
|
str << Inspect::FMT_ATTR % [self[attr].class.to_s.sub(/.*::/, ''),
|
64
65
|
attr, value]
|
65
66
|
else
|
66
|
-
str << Inspect.inspect_attribute(attr, self[attr],
|
67
|
+
str << Inspect.inspect_attribute(attr, self[attr], 1)
|
67
68
|
end
|
68
69
|
end
|
69
70
|
str
|
@@ -55,20 +55,21 @@ module PacketGen
|
|
55
55
|
|
56
56
|
# @return [String]
|
57
57
|
def inspect
|
58
|
-
str = Inspect.dashed_line(self.class,
|
58
|
+
str = Inspect.dashed_line(self.class, 1)
|
59
59
|
fields.each do |attr|
|
60
60
|
next if attr == :body
|
61
61
|
next unless is_present?(attr)
|
62
|
+
|
62
63
|
if attr == :flags
|
63
|
-
shift = Inspect.shift_level(
|
64
|
+
shift = Inspect.shift_level(1)
|
64
65
|
value = %i[l m s].map { |f| send("#{f}?") ? f.to_s : '.' }.join
|
65
|
-
value = '%-
|
66
|
+
value = '%-16s (0x%02x)' % [value, self.flags]
|
66
67
|
str << shift
|
67
68
|
str << Inspect::FMT_ATTR % [self[attr].class.to_s.sub(/.*::/, ''),
|
68
69
|
attr, value]
|
69
70
|
str << Inspect::FMT_ATTR % ['', 'version', self.version]
|
70
71
|
else
|
71
|
-
str << Inspect.inspect_attribute(attr, self[attr],
|
72
|
+
str << Inspect.inspect_attribute(attr, self[attr], 1)
|
72
73
|
end
|
73
74
|
end
|
74
75
|
str
|
data/lib/packetgen/header/ike.rb
CHANGED
@@ -189,9 +189,10 @@ module PacketGen
|
|
189
189
|
|
190
190
|
# @return [String]
|
191
191
|
def inspect
|
192
|
-
str = Inspect.dashed_line(self.class,
|
192
|
+
str = Inspect.dashed_line(self.class, )
|
193
193
|
fields.each do |attr|
|
194
194
|
next if attr == :body
|
195
|
+
|
195
196
|
case attr
|
196
197
|
when :flags
|
197
198
|
str_flags = ''.dup
|
@@ -71,17 +71,17 @@ module PacketGen
|
|
71
71
|
|
72
72
|
# @return [String]
|
73
73
|
def inspect
|
74
|
-
str = Inspect.dashed_line(self.class,
|
74
|
+
str = Inspect.dashed_line(self.class, 1)
|
75
75
|
fields.each do |attr|
|
76
76
|
case attr
|
77
77
|
when :body
|
78
78
|
next
|
79
79
|
when :encoding
|
80
|
-
str << Inspect.shift_level(
|
80
|
+
str << Inspect.shift_level(1)
|
81
81
|
str << Inspect::FMT_ATTR % [self[attr].class.to_s.sub(/.*::/, ''), attr,
|
82
82
|
human_encoding]
|
83
83
|
else
|
84
|
-
str << Inspect.inspect_attribute(attr, self[attr],
|
84
|
+
str << Inspect.inspect_attribute(attr, self[attr], 1)
|
85
85
|
end
|
86
86
|
end
|
87
87
|
str
|
@@ -52,16 +52,16 @@ module PacketGen
|
|
52
52
|
|
53
53
|
# @return [String]
|
54
54
|
def inspect
|
55
|
-
str = Inspect.dashed_line(self.class,
|
55
|
+
str = Inspect.dashed_line(self.class, 1)
|
56
56
|
fields.each do |attr|
|
57
57
|
case attr
|
58
58
|
when :body
|
59
59
|
next
|
60
60
|
when :content
|
61
|
-
str << Inspect.shift_level(
|
61
|
+
str << Inspect.shift_level(1)
|
62
62
|
str << Inspect::FMT_ATTR % ['hashes', :content, human_content]
|
63
63
|
else
|
64
|
-
str << Inspect.inspect_attribute(attr, self[attr],
|
64
|
+
str << Inspect.inspect_attribute(attr, self[attr], 1)
|
65
65
|
end
|
66
66
|
end
|
67
67
|
str
|
@@ -160,15 +160,16 @@ module PacketGen
|
|
160
160
|
|
161
161
|
# @return [String]
|
162
162
|
def inspect
|
163
|
-
str = Inspect.dashed_line(self.class,
|
163
|
+
str = Inspect.dashed_line(self.class, 1)
|
164
164
|
fields.each do |attr|
|
165
165
|
next if attr == :body
|
166
|
+
|
166
167
|
if %i[protocol message_type].include? attr
|
167
|
-
str << Inspect.shift_level(
|
168
|
+
str << Inspect.shift_level(1)
|
168
169
|
str << Inspect::FMT_ATTR % [self[attr].class.to_s.sub(/.*::/, ''), attr,
|
169
170
|
send("human_#{attr}")]
|
170
171
|
else
|
171
|
-
str << Inspect.inspect_attribute(attr, self[attr],
|
172
|
+
str << Inspect.inspect_attribute(attr, self[attr], 1)
|
172
173
|
end
|
173
174
|
end
|
174
175
|
str
|
data/lib/packetgen/header/ip.rb
CHANGED
@@ -84,7 +84,7 @@ module PacketGen
|
|
84
84
|
define_field :length, Types::Int16, default: 20
|
85
85
|
# @!attribute id
|
86
86
|
# @return [Integer] 16-bit ID
|
87
|
-
define_field :id, Types::Int16, default: -> { rand(65_535) }
|
87
|
+
define_field :id, Types::Int16, default: ->(h) { rand(65_535) }
|
88
88
|
# @!attribute frag
|
89
89
|
# @return [Integer] 16-bit frag word
|
90
90
|
define_field :frag, Types::Int16, default: 0
|
@@ -235,11 +235,12 @@ module PacketGen
|
|
235
235
|
|
236
236
|
# @return [String]
|
237
237
|
def inspect
|
238
|
-
str = Inspect.dashed_line(self.class,
|
239
|
-
shift = Inspect.shift_level(
|
238
|
+
str = Inspect.dashed_line(self.class, 1)
|
239
|
+
shift = Inspect.shift_level(1)
|
240
240
|
fields.each do |attr|
|
241
241
|
next if attr == :body
|
242
|
-
|
242
|
+
|
243
|
+
str << Inspect.inspect_attribute(attr, self[attr], 1)
|
243
244
|
if attr == :u8
|
244
245
|
str << shift + Inspect::FMT_ATTR % ['', 'version', version]
|
245
246
|
str << shift + Inspect::FMT_ATTR % ['', 'ihl', ihl]
|
@@ -110,9 +110,7 @@ module PacketGen
|
|
110
110
|
# End-of-option-List IP option
|
111
111
|
class EOL < Option
|
112
112
|
delete_field :length
|
113
|
-
undef length
|
114
113
|
delete_field :data
|
115
|
-
undef data
|
116
114
|
end
|
117
115
|
|
118
116
|
# No OPeration IP option
|
@@ -122,7 +120,6 @@ module PacketGen
|
|
122
120
|
# Loose Source and Record Route IP option
|
123
121
|
class LSRR < Option
|
124
122
|
delete_field :data
|
125
|
-
undef data
|
126
123
|
|
127
124
|
# @!attribute pointer
|
128
125
|
# 8-bit pointer on next address
|
@@ -169,7 +166,6 @@ module PacketGen
|
|
169
166
|
# Stream Identifier IP option
|
170
167
|
class SI < Option
|
171
168
|
delete_field :data
|
172
|
-
undef data
|
173
169
|
|
174
170
|
# @!attribute id
|
175
171
|
# 16-bit stream ID
|
@@ -180,7 +176,6 @@ module PacketGen
|
|
180
176
|
# Router Alert IP option
|
181
177
|
class RA < Option
|
182
178
|
delete_field :data
|
183
|
-
undef data
|
184
179
|
|
185
180
|
# @!attribute value
|
186
181
|
# 16-bit value. Should be 0.
|
@@ -137,10 +137,11 @@ module PacketGen
|
|
137
137
|
|
138
138
|
# @return [String]
|
139
139
|
def inspect
|
140
|
-
str = Inspect.dashed_line(self.class,
|
140
|
+
str = Inspect.dashed_line(self.class, 1)
|
141
141
|
fields.each do |attr|
|
142
142
|
next if attr == :body
|
143
|
-
|
143
|
+
|
144
|
+
str << Inspect.inspect_attribute(attr, self[attr], 1)
|
144
145
|
if attr == :u32
|
145
146
|
shift = Inspect.shift_level(2)
|
146
147
|
str << shift + Inspect::FMT_ATTR % ['', 'version', version]
|
@@ -93,8 +93,8 @@ module PacketGen
|
|
93
93
|
# @return [Integer] calculated length
|
94
94
|
def calc_length
|
95
95
|
length = self[:body].sz
|
96
|
-
length += self[:src_name].sz if
|
97
|
-
length += self[:dst_name].sz if
|
96
|
+
length += self[:src_name].sz if present?(:src_name)
|
97
|
+
length += self[:dst_name].sz if present?(:dst_name)
|
98
98
|
self.dgm_length = length
|
99
99
|
end
|
100
100
|
end
|
@@ -280,13 +280,13 @@ module PacketGen
|
|
280
280
|
|
281
281
|
def inspect
|
282
282
|
str = super
|
283
|
-
str << Inspect.shift_level(
|
283
|
+
str << Inspect.shift_level(1)
|
284
284
|
if self[:data].chosen.nil?
|
285
285
|
str << Inspect::FMT_ATTR % [self[:data].type, :data, '']
|
286
286
|
else
|
287
287
|
data = self[:data]
|
288
288
|
str << Inspect::FMT_ATTR % [data.type, :data, data.chosen_value.type]
|
289
|
-
str << Inspect.dashed_line('ASN.1 content',
|
289
|
+
str << Inspect.dashed_line('ASN.1 content', 1)
|
290
290
|
str << data.chosen_value.inspect(1)
|
291
291
|
begin
|
292
292
|
str << Inspect.inspect_body(self[:message].to_der, 'ASN.1 DER')
|
data/lib/packetgen/header/tcp.rb
CHANGED
@@ -78,7 +78,7 @@ module PacketGen
|
|
78
78
|
# @!attribute seqnum
|
79
79
|
# 32-bit TCP sequence number
|
80
80
|
# @return [Integer]
|
81
|
-
define_field :seqnum, Types::Int32, default: -> { rand(2**32) }
|
81
|
+
define_field :seqnum, Types::Int32, default: ->(h) { rand(2**32) }
|
82
82
|
# @!attribute acknum
|
83
83
|
# 32-bit TCP acknowledgement number
|
84
84
|
# @return [Integer]
|
@@ -206,11 +206,12 @@ module PacketGen
|
|
206
206
|
|
207
207
|
# @return [String]
|
208
208
|
def inspect
|
209
|
-
str = Inspect.dashed_line(self.class,
|
210
|
-
shift = Inspect.shift_level(
|
209
|
+
str = Inspect.dashed_line(self.class, 1)
|
210
|
+
shift = Inspect.shift_level(1)
|
211
211
|
fields.each do |attr|
|
212
212
|
next if attr == :body
|
213
|
-
|
213
|
+
|
214
|
+
str << Inspect.inspect_attribute(attr, self[attr], 1)
|
214
215
|
if attr == :u16
|
215
216
|
doff = Inspect.int_dec_hex(data_offset, 1)
|
216
217
|
str << shift + Inspect::FMT_ATTR % ['', 'data_offset', doff]
|
@@ -138,7 +138,6 @@ module PacketGen
|
|
138
138
|
# TFTP Read Request header
|
139
139
|
class RRQ < TFTP
|
140
140
|
delete_field :body
|
141
|
-
undef body
|
142
141
|
|
143
142
|
# @!attribute filename
|
144
143
|
# Filename to access
|
@@ -165,7 +164,6 @@ module PacketGen
|
|
165
164
|
# TFTP ACK header
|
166
165
|
class ACK < TFTP
|
167
166
|
delete_field :body
|
168
|
-
undef body
|
169
167
|
|
170
168
|
# @!attribute block_num
|
171
169
|
# 16-bit block number
|
@@ -176,7 +174,6 @@ module PacketGen
|
|
176
174
|
# TFTP ERROR header
|
177
175
|
class ERROR < TFTP
|
178
176
|
delete_field :body
|
179
|
-
undef body
|
180
177
|
|
181
178
|
# @!attribute error_code
|
182
179
|
# 16-bit error code
|
data/lib/packetgen/inspect.rb
CHANGED
@@ -14,7 +14,7 @@ module PacketGen
|
|
14
14
|
MAX_WIDTH = 70
|
15
15
|
|
16
16
|
# Format to inspect attribute
|
17
|
-
FMT_ATTR = "%
|
17
|
+
FMT_ATTR = "%14s %16s: %s\n"
|
18
18
|
|
19
19
|
# Create a dashed line with +obj+ class writing in it
|
20
20
|
# @param [String] name
|
@@ -34,7 +34,7 @@ module PacketGen
|
|
34
34
|
# @param [Integer] hexsize
|
35
35
|
# @return [String]
|
36
36
|
def self.int_dec_hex(value, hexsize)
|
37
|
-
"%-
|
37
|
+
"%-16s (0x%0#{hexsize}x)" % [value.to_i, value.to_i]
|
38
38
|
end
|
39
39
|
|
40
40
|
# Format an attribute for +#inspect+.
|
@@ -49,16 +49,21 @@ module PacketGen
|
|
49
49
|
# @return [String]
|
50
50
|
def self.inspect_attribute(attr, value, level=1)
|
51
51
|
str = shift_level(level)
|
52
|
-
val =
|
53
|
-
|
54
|
-
|
52
|
+
val = case value
|
53
|
+
when Types::Enum
|
54
|
+
"%-16s (0x%0#{value.sz * 2}x)" % [value.to_human, value.to_i]
|
55
|
+
when Types::Int
|
55
56
|
int_dec_hex(value, value.sz * 2)
|
56
|
-
|
57
|
+
when Integer
|
58
|
+
int_dec_hex(value, value.sz * 2)
|
59
|
+
when String
|
57
60
|
value.to_s.inspect
|
58
|
-
elsif value.respond_to? :to_human
|
59
|
-
value.to_human
|
60
61
|
else
|
61
|
-
value.
|
62
|
+
if value.respond_to? :to_human
|
63
|
+
value.to_human
|
64
|
+
else
|
65
|
+
value.to_s.inspect
|
66
|
+
end
|
62
67
|
end
|
63
68
|
str << FMT_ATTR % [value.class.to_s.sub(/.*::/, ''), attr, val]
|
64
69
|
end
|
@@ -80,7 +85,7 @@ module PacketGen
|
|
80
85
|
val = case attr
|
81
86
|
when RASN1::Types::Enumerated
|
82
87
|
hexsize = attr.value_size * 2
|
83
|
-
"%-
|
88
|
+
"%-16s (0x%0#{hexsize}x)" % [attr.value, attr.to_i]
|
84
89
|
when RASN1::Types::Integer
|
85
90
|
int_dec_hex(attr.value, attr.value_size * 2)
|
86
91
|
when RASN1::Model
|
@@ -95,6 +100,7 @@ module PacketGen
|
|
95
100
|
# @return [String]
|
96
101
|
def self.inspect_body(body, name='Body')
|
97
102
|
return '' if body.nil? || body.empty?
|
103
|
+
|
98
104
|
str = dashed_line(name, 2)
|
99
105
|
str << (0..15).to_a.map { |v| ' %02d' % v }.join << "\n"
|
100
106
|
str << '-' * MAX_WIDTH << "\n"
|
data/lib/packetgen/packet.rb
CHANGED
@@ -143,7 +143,7 @@ module PacketGen
|
|
143
143
|
def add(protocol, options={})
|
144
144
|
klass = check_protocol(protocol)
|
145
145
|
|
146
|
-
header = klass.new(options)
|
146
|
+
header = klass.new(options.merge!(packet: self))
|
147
147
|
add_header header
|
148
148
|
self
|
149
149
|
end
|
@@ -158,7 +158,7 @@ module PacketGen
|
|
158
158
|
klass = check_protocol(protocol)
|
159
159
|
|
160
160
|
nxt = prev.body
|
161
|
-
header = klass.new(options)
|
161
|
+
header = klass.new(options.merge!(packet: self))
|
162
162
|
add_header header, previous_header: prev
|
163
163
|
idx = @headers.index(prev) + 1
|
164
164
|
@headers[idx, 0] = header
|
@@ -422,7 +422,7 @@ module PacketGen
|
|
422
422
|
def guess_first_header(binary_str)
|
423
423
|
first_header = nil
|
424
424
|
Header.all.each do |hklass|
|
425
|
-
hdr = hklass.new
|
425
|
+
hdr = hklass.new(packet: self)
|
426
426
|
# #read may return another object (more specific class)
|
427
427
|
hdr = hdr.read(binary_str)
|
428
428
|
# First header is found when:
|
@@ -446,7 +446,7 @@ module PacketGen
|
|
446
446
|
break if last_known_hdr.body.empty?
|
447
447
|
search_header(last_known_hdr) do |nh|
|
448
448
|
str = last_known_hdr.body
|
449
|
-
nheader = nh.new
|
449
|
+
nheader = nh.new(packet: self)
|
450
450
|
nheader = nheader.read(str)
|
451
451
|
next unless nheader.parse?
|
452
452
|
add_header nheader, parsing: true
|
@@ -99,7 +99,7 @@ module PacketGen
|
|
99
99
|
# @private
|
100
100
|
@field_defs = {}
|
101
101
|
# @private
|
102
|
-
@bit_fields =
|
102
|
+
@bit_fields = {}
|
103
103
|
|
104
104
|
# On inheritage, create +@field_defs+ class variable
|
105
105
|
# @param [Class] klass
|
@@ -132,7 +132,8 @@ module PacketGen
|
|
132
132
|
# @param [Object] type class or instance
|
133
133
|
# @param [Hash] options Unrecognized options are passed to object builder if
|
134
134
|
# +:builder+ option is not set.
|
135
|
-
# @option options [Object] :default default value
|
135
|
+
# @option options [Object] :default default value. May be a proc. This lambda
|
136
|
+
# take one argument: the caller object.
|
136
137
|
# @option options [Lambda] :builder lambda to construct this field.
|
137
138
|
# Parameters to this lambda is the caller object and the field type class.
|
138
139
|
# @option options [Lambda] :optional define this field as optional. Given lambda
|
@@ -180,9 +181,11 @@ module PacketGen
|
|
180
181
|
def self.define_field_before(other, name, type, options={})
|
181
182
|
define_field name, type, options
|
182
183
|
return if other.nil?
|
184
|
+
|
183
185
|
@ordered_fields.delete name
|
184
186
|
idx = @ordered_fields.index(other)
|
185
187
|
raise ArgumentError, "unknown #{other} field" if idx.nil?
|
188
|
+
|
186
189
|
@ordered_fields[idx, 0] = name
|
187
190
|
end
|
188
191
|
|
@@ -197,9 +200,11 @@ module PacketGen
|
|
197
200
|
def self.define_field_after(other, name, type, options={})
|
198
201
|
define_field name, type, options
|
199
202
|
return if other.nil?
|
203
|
+
|
200
204
|
@ordered_fields.delete name
|
201
205
|
idx = @ordered_fields.index(other)
|
202
206
|
raise ArgumentError, "unknown #{other} field" if idx.nil?
|
207
|
+
|
203
208
|
@ordered_fields[idx + 1, 0] = name
|
204
209
|
end
|
205
210
|
|
@@ -209,6 +214,8 @@ module PacketGen
|
|
209
214
|
def self.delete_field(name)
|
210
215
|
@ordered_fields.delete name
|
211
216
|
@field_defs.delete name
|
217
|
+
undef_method name
|
218
|
+
undef_method "#{name}="
|
212
219
|
end
|
213
220
|
|
214
221
|
# Define a bitfield on given attribute
|
@@ -233,16 +240,19 @@ module PacketGen
|
|
233
240
|
def self.define_bit_fields_on(attr, *args)
|
234
241
|
attr_def = @field_defs[attr]
|
235
242
|
raise ArgumentError, "unknown #{attr} field" if attr_def.nil?
|
243
|
+
|
236
244
|
type = attr_def.first
|
237
245
|
unless type < Types::Int
|
238
246
|
raise TypeError, "#{attr} is not a PacketGen::Types::Int"
|
239
247
|
end
|
248
|
+
|
240
249
|
total_size = type.new.width * 8
|
241
250
|
idx = total_size - 1
|
242
251
|
|
243
252
|
field = args.shift
|
244
253
|
while field
|
245
254
|
next unless field.is_a? Symbol
|
255
|
+
|
246
256
|
size = if args.first.is_a? Integer
|
247
257
|
args.shift
|
248
258
|
else
|
@@ -277,7 +287,8 @@ module PacketGen
|
|
277
287
|
METHODS
|
278
288
|
end
|
279
289
|
|
280
|
-
@bit_fields
|
290
|
+
@bit_fields[attr] = {} if @bit_fields[attr].nil?
|
291
|
+
@bit_fields[attr][field] = size
|
281
292
|
end
|
282
293
|
|
283
294
|
idx -= size
|
@@ -294,7 +305,7 @@ module PacketGen
|
|
294
305
|
|
295
306
|
self.class.class_eval { @field_defs }.each do |field, ary|
|
296
307
|
type, default, builder, optional, enum, field_options = ary
|
297
|
-
default = default.call if default.is_a?(Proc)
|
308
|
+
default = default.to_proc.call(self) if default.is_a?(Proc)
|
298
309
|
@fields[field] = if builder
|
299
310
|
builder.call(self, type)
|
300
311
|
elsif enum
|
@@ -325,8 +336,10 @@ module PacketGen
|
|
325
336
|
|
326
337
|
@optional_fields[field] = optional if optional
|
327
338
|
end
|
328
|
-
self.class.class_eval { @bit_fields }.each do |
|
329
|
-
|
339
|
+
self.class.class_eval { @bit_fields }.each do |_, hsh|
|
340
|
+
hsh.each_key do |bit_field|
|
341
|
+
self.send "#{bit_field}=", options[bit_field] if options[bit_field]
|
342
|
+
end
|
330
343
|
end
|
331
344
|
end
|
332
345
|
|
@@ -358,26 +371,42 @@ module PacketGen
|
|
358
371
|
|
359
372
|
# Say if this field is optional
|
360
373
|
# @return [Boolean]
|
361
|
-
def
|
374
|
+
def optional?(field)
|
362
375
|
@optional_fields.key? field
|
363
376
|
end
|
364
377
|
|
378
|
+
# @deprecated Use {#optional?} instead.
|
379
|
+
def is_optional?(field)
|
380
|
+
Deprecation.deprecated(self.class, __method__, 'optional?', klass_method: true)
|
381
|
+
optional? field
|
382
|
+
end
|
383
|
+
|
365
384
|
# Say if an optional field is present
|
366
385
|
# @return [Boolean]
|
367
|
-
def
|
368
|
-
return true unless
|
386
|
+
def present?(field)
|
387
|
+
return true unless optional?(field)
|
388
|
+
|
369
389
|
@optional_fields[field].call(self)
|
370
390
|
end
|
371
391
|
|
392
|
+
# Say if an optional field is present
|
393
|
+
# @return [Boolean]
|
394
|
+
def is_present?(field)
|
395
|
+
Deprecation.deprecated(self.class, __method__, 'present?', klass_method: true)
|
396
|
+
present? field
|
397
|
+
end
|
398
|
+
|
372
399
|
# Populate object from a binary string
|
373
400
|
# @param [String] str
|
374
401
|
# @return [Fields] self
|
375
402
|
def read(str)
|
376
403
|
return self if str.nil?
|
404
|
+
|
377
405
|
force_binary str
|
378
406
|
start = 0
|
379
407
|
fields.each do |field|
|
380
|
-
next unless
|
408
|
+
next unless present?(field)
|
409
|
+
|
381
410
|
obj = nil
|
382
411
|
if self[field].respond_to? :width
|
383
412
|
width = self[field].width
|
@@ -400,11 +429,12 @@ module PacketGen
|
|
400
429
|
# Common inspect method for headers
|
401
430
|
# @return [String]
|
402
431
|
def inspect
|
403
|
-
str = Inspect.dashed_line(self.class,
|
432
|
+
str = Inspect.dashed_line(self.class, 1)
|
404
433
|
fields.each do |attr|
|
405
434
|
next if attr == :body
|
406
|
-
next unless
|
407
|
-
|
435
|
+
next unless present?(attr)
|
436
|
+
|
437
|
+
str << Inspect.inspect_attribute(attr, self[attr], 1)
|
408
438
|
end
|
409
439
|
str
|
410
440
|
end
|
@@ -412,7 +442,7 @@ module PacketGen
|
|
412
442
|
# Return object as a binary string
|
413
443
|
# @return [String]
|
414
444
|
def to_s
|
415
|
-
fields.select { |f|
|
445
|
+
fields.select { |f| present?(f) }
|
416
446
|
.map! { |f| force_binary @fields[f].to_s }.join
|
417
447
|
end
|
418
448
|
|
@@ -435,6 +465,7 @@ module PacketGen
|
|
435
465
|
# @raise [ArgumentError] cannot cram +body+ in +:body+ field
|
436
466
|
def body=(value)
|
437
467
|
raise BodyError, 'no body field' unless @fields.key? :body
|
468
|
+
|
438
469
|
case body
|
439
470
|
when ::String
|
440
471
|
self[:body].read value
|
@@ -460,14 +491,24 @@ module PacketGen
|
|
460
491
|
# @raise [ArgumentError] unknown field
|
461
492
|
def offset_of(field)
|
462
493
|
raise ArgumentError, "#{field} is an unknown field of #{self.class}" unless @fields.include?(field)
|
494
|
+
|
463
495
|
offset = 0
|
464
496
|
fields.each do |f|
|
465
497
|
break offset if f == field
|
466
|
-
next unless
|
498
|
+
next unless present?(f)
|
499
|
+
|
467
500
|
offset += self[f].sz
|
468
501
|
end
|
469
502
|
end
|
470
503
|
|
504
|
+
# Get bit fields definition for given field.
|
505
|
+
# @param [Symbol] field defining bit fields
|
506
|
+
# @return [Hash,nil] keys: bit fields, values: their size in bits
|
507
|
+
# @since 2.8.3
|
508
|
+
def bits_on(field)
|
509
|
+
self.class.class_eval { @bit_fields }[field]
|
510
|
+
end
|
511
|
+
|
471
512
|
private
|
472
513
|
|
473
514
|
# Deeply duplicate +@fields+
|
data/lib/packetgen/types/int.rb
CHANGED
@@ -56,6 +56,7 @@ module PacketGen
|
|
56
56
|
unless defined? @packstr
|
57
57
|
raise StandardError, 'PacketGen::Types::Int#to_s is an abstract method'
|
58
58
|
end
|
59
|
+
|
59
60
|
[to_i].pack(@packstr[@endian])
|
60
61
|
end
|
61
62
|
|
@@ -79,7 +80,7 @@ module PacketGen
|
|
79
80
|
end
|
80
81
|
end
|
81
82
|
|
82
|
-
# One byte integer
|
83
|
+
# One byte unsigned integer
|
83
84
|
# @author Sylvain Daubert
|
84
85
|
class Int8 < Int
|
85
86
|
# @param [Integer,nil] value
|
@@ -89,7 +90,18 @@ module PacketGen
|
|
89
90
|
end
|
90
91
|
end
|
91
92
|
|
92
|
-
#
|
93
|
+
# One byte signed integer
|
94
|
+
# @author Sylvain Daubert
|
95
|
+
# @since 2.8.2
|
96
|
+
class SInt8 < Int
|
97
|
+
# @param [Integer,nil] value
|
98
|
+
def initialize(value=nil)
|
99
|
+
super(value, nil, 1)
|
100
|
+
@packstr = { nil => 'c' }
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
# 2-byte unsigned integer
|
93
105
|
# @author Sylvain Daubert
|
94
106
|
class Int16 < Int
|
95
107
|
# @param [Integer,nil] value
|
@@ -100,13 +112,13 @@ module PacketGen
|
|
100
112
|
end
|
101
113
|
end
|
102
114
|
|
103
|
-
# big endian 2-byte integer
|
115
|
+
# big endian 2-byte unsigned integer
|
104
116
|
# @author Sylvain Daubert
|
105
117
|
class Int16be < Int16
|
106
118
|
undef endian=
|
107
119
|
end
|
108
120
|
|
109
|
-
# little endian 2-byte integer
|
121
|
+
# little endian 2-byte unsigned integer
|
110
122
|
# @author Sylvain Daubert
|
111
123
|
class Int16le < Int16
|
112
124
|
# @param [Integer,nil] value
|
@@ -118,7 +130,39 @@ module PacketGen
|
|
118
130
|
end
|
119
131
|
end
|
120
132
|
|
121
|
-
#
|
133
|
+
# 2-byte signed integer
|
134
|
+
# @author Sylvain Daubert
|
135
|
+
# @since 2.8.2
|
136
|
+
class SInt16 < Int16
|
137
|
+
# @param [Integer,nil] value
|
138
|
+
# @param [:big, :little] endian
|
139
|
+
def initialize(value=nil, endian=:big)
|
140
|
+
super
|
141
|
+
@packstr = { big: 's>', little: 's<' }
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
# big endian 2-byte signed integer
|
146
|
+
# @author Sylvain Daubert
|
147
|
+
# @since 2.8.2
|
148
|
+
class SInt16be < SInt16
|
149
|
+
undef endian=
|
150
|
+
end
|
151
|
+
|
152
|
+
# little endian 2-byte signed integer
|
153
|
+
# @author Sylvain Daubert
|
154
|
+
# @since 2.8.2
|
155
|
+
class SInt16le < SInt16
|
156
|
+
# @param [Integer,nil] value
|
157
|
+
undef endian=
|
158
|
+
|
159
|
+
# @param [Integer, nil] value
|
160
|
+
def initialize(value=nil)
|
161
|
+
super(value, :little)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
# 3-byte unsigned integer
|
122
166
|
# @author Sylvain Daubert
|
123
167
|
# @since 2.1.4
|
124
168
|
class Int24 < Int
|
@@ -133,6 +177,7 @@ module PacketGen
|
|
133
177
|
# @return [self]
|
134
178
|
def read(value)
|
135
179
|
return self if value.nil?
|
180
|
+
|
136
181
|
@value = if value.is_a?(Integer)
|
137
182
|
value.to_i
|
138
183
|
else
|
@@ -159,14 +204,14 @@ module PacketGen
|
|
159
204
|
end
|
160
205
|
end
|
161
206
|
|
162
|
-
# big endian 3-byte integer
|
207
|
+
# big endian 3-byte unsigned integer
|
163
208
|
# @author Sylvain Daubert
|
164
209
|
# @since 2.1.4
|
165
210
|
class Int24be < Int24
|
166
211
|
undef endian=
|
167
212
|
end
|
168
213
|
|
169
|
-
# little endian 3-byte integer
|
214
|
+
# little endian 3-byte unsigned integer
|
170
215
|
# @author Sylvain Daubert
|
171
216
|
# @since 2.1.4
|
172
217
|
class Int24le < Int24
|
@@ -179,7 +224,7 @@ module PacketGen
|
|
179
224
|
end
|
180
225
|
end
|
181
226
|
|
182
|
-
# 4-byte integer
|
227
|
+
# 4-byte unsigned integer
|
183
228
|
# @author Sylvain Daubert
|
184
229
|
class Int32 < Int
|
185
230
|
# @param [Integer,nil] value
|
@@ -190,13 +235,13 @@ module PacketGen
|
|
190
235
|
end
|
191
236
|
end
|
192
237
|
|
193
|
-
# big endian 4-byte integer
|
238
|
+
# big endian 4-byte unsigned integer
|
194
239
|
# @author Sylvain Daubert
|
195
240
|
class Int32be < Int32
|
196
241
|
undef endian=
|
197
242
|
end
|
198
243
|
|
199
|
-
# little endian 4-byte integer
|
244
|
+
# little endian 4-byte unsigned integer
|
200
245
|
# @author Sylvain Daubert
|
201
246
|
class Int32le < Int32
|
202
247
|
# @param [Integer,nil] value
|
@@ -208,7 +253,39 @@ module PacketGen
|
|
208
253
|
end
|
209
254
|
end
|
210
255
|
|
211
|
-
#
|
256
|
+
# 4-byte unsigned integer
|
257
|
+
# @author Sylvain Daubert
|
258
|
+
# @since 2.8.2
|
259
|
+
class SInt32 < Int32
|
260
|
+
# @param [Integer,nil] value
|
261
|
+
# @param [:big, :little] endian
|
262
|
+
def initialize(value=nil, endian=:big)
|
263
|
+
super
|
264
|
+
@packstr = { big: 'l>', little: 'l<' }
|
265
|
+
end
|
266
|
+
end
|
267
|
+
|
268
|
+
# big endian 4-byte unsigned integer
|
269
|
+
# @author Sylvain Daubert
|
270
|
+
# @since 2.8.2
|
271
|
+
class SInt32be < SInt32
|
272
|
+
undef endian=
|
273
|
+
end
|
274
|
+
|
275
|
+
# little endian 4-byte unsigned integer
|
276
|
+
# @author Sylvain Daubert
|
277
|
+
# @since 2.8.2
|
278
|
+
class SInt32le < SInt32
|
279
|
+
# @param [Integer,nil] value
|
280
|
+
undef endian=
|
281
|
+
|
282
|
+
# @param [Integer, nil] value
|
283
|
+
def initialize(value=nil)
|
284
|
+
super(value, :little)
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
288
|
+
# 8-byte unsigned integer
|
212
289
|
# @author Sylvain Daubert
|
213
290
|
class Int64 < Int
|
214
291
|
# @param [Integer,nil] value
|
@@ -219,13 +296,13 @@ module PacketGen
|
|
219
296
|
end
|
220
297
|
end
|
221
298
|
|
222
|
-
# big endian 8-byte integer
|
299
|
+
# big endian 8-byte unsigned integer
|
223
300
|
# @author Sylvain Daubert
|
224
301
|
class Int64be < Int64
|
225
302
|
undef endian=
|
226
303
|
end
|
227
304
|
|
228
|
-
# little endian 8-byte integer
|
305
|
+
# little endian 8-byte unsigned integer
|
229
306
|
# @author Sylvain Daubert
|
230
307
|
class Int64le < Int64
|
231
308
|
# @param [Integer,nil] value
|
@@ -236,5 +313,37 @@ module PacketGen
|
|
236
313
|
super(value, :little)
|
237
314
|
end
|
238
315
|
end
|
316
|
+
|
317
|
+
# 8-byte unsigned integer
|
318
|
+
# @author Sylvain Daubert
|
319
|
+
# @since 2.8.2
|
320
|
+
class SInt64 < Int64
|
321
|
+
# @param [Integer,nil] value
|
322
|
+
# @param [:big, :little] endian
|
323
|
+
def initialize(value=nil, endian=:big)
|
324
|
+
super
|
325
|
+
@packstr = { big: 'q>', little: 'q<' }
|
326
|
+
end
|
327
|
+
end
|
328
|
+
|
329
|
+
# big endian 8-byte unsigned integer
|
330
|
+
# @author Sylvain Daubert
|
331
|
+
# @since 2.8.2
|
332
|
+
class SInt64be < SInt64
|
333
|
+
undef endian=
|
334
|
+
end
|
335
|
+
|
336
|
+
# little endian 8-byte unsigned integer
|
337
|
+
# @author Sylvain Daubert
|
338
|
+
# @since 2.8.2
|
339
|
+
class SInt64le < SInt64
|
340
|
+
# @param [Integer,nil] value
|
341
|
+
undef endian=
|
342
|
+
|
343
|
+
# @param [Integer, nil] value
|
344
|
+
def initialize(value=nil)
|
345
|
+
super(value, :little)
|
346
|
+
end
|
347
|
+
end
|
239
348
|
end
|
240
349
|
end
|
data/lib/packetgen/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: packetgen
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.8.
|
4
|
+
version: 2.8.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sylvain Daubert
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-09-
|
11
|
+
date: 2018-09-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: interfacez
|