packetgen 3.3.2 → 4.0.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/README.md +37 -21
- data/lib/packetgen/capture.rb +2 -2
- data/lib/packetgen/config.rb +0 -1
- data/lib/packetgen/deprecation.rb +7 -7
- data/lib/packetgen/header/arp.rb +13 -13
- data/lib/packetgen/header/asn1_base.rb +1 -1
- data/lib/packetgen/header/base.rb +17 -18
- data/lib/packetgen/header/bootp.rb +32 -34
- data/lib/packetgen/header/dhcp/option.rb +19 -19
- data/lib/packetgen/header/dhcp/options.rb +1 -1
- data/lib/packetgen/header/dhcp.rb +3 -3
- data/lib/packetgen/header/dhcpv6/duid.rb +16 -16
- data/lib/packetgen/header/dhcpv6/option.rb +53 -53
- data/lib/packetgen/header/dhcpv6/options.rb +1 -1
- data/lib/packetgen/header/dhcpv6/relay.rb +5 -5
- data/lib/packetgen/header/dhcpv6.rb +6 -6
- data/lib/packetgen/header/dns/name.rb +14 -10
- data/lib/packetgen/header/dns/opt.rb +2 -2
- data/lib/packetgen/header/dns/option.rb +11 -11
- data/lib/packetgen/header/dns/qdsection.rb +1 -1
- data/lib/packetgen/header/dns/question.rb +6 -8
- data/lib/packetgen/header/dns/rr.rb +56 -43
- data/lib/packetgen/header/dns/rrsection.rb +4 -4
- data/lib/packetgen/header/dns.rb +27 -30
- data/lib/packetgen/header/dot11/control.rb +11 -11
- data/lib/packetgen/header/dot11/data.rb +20 -20
- data/lib/packetgen/header/dot11/element.rb +4 -4
- data/lib/packetgen/header/dot11/management.rb +8 -8
- data/lib/packetgen/header/dot11/sub_mngt.rb +39 -53
- data/lib/packetgen/header/dot11.rb +88 -93
- data/lib/packetgen/header/dot1q.rb +10 -12
- data/lib/packetgen/header/dot1x.rb +9 -9
- data/lib/packetgen/header/eap/fast.rb +4 -4
- data/lib/packetgen/header/eap/md5.rb +6 -6
- data/lib/packetgen/header/eap/tls.rb +13 -15
- data/lib/packetgen/header/eap/ttls.rb +13 -15
- data/lib/packetgen/header/eap.rb +22 -22
- data/lib/packetgen/header/eth.rb +18 -18
- data/lib/packetgen/header/gre.rb +8 -10
- data/lib/packetgen/header/http/headers.rb +2 -2
- data/lib/packetgen/header/http/request.rb +17 -16
- data/lib/packetgen/header/http/response.rb +18 -17
- data/lib/packetgen/header/http/verbs.rb +1 -3
- data/lib/packetgen/header/icmp.rb +8 -8
- data/lib/packetgen/header/icmpv6.rb +3 -3
- data/lib/packetgen/header/igmp.rb +8 -8
- data/lib/packetgen/header/igmpv3/group_record.rb +12 -12
- data/lib/packetgen/header/igmpv3/mq.rb +16 -18
- data/lib/packetgen/header/igmpv3/mr.rb +4 -4
- data/lib/packetgen/header/igmpv3.rb +7 -7
- data/lib/packetgen/header/ip/addr.rb +13 -13
- data/lib/packetgen/header/ip/option.rb +31 -33
- data/lib/packetgen/header/ip/options.rb +1 -1
- data/lib/packetgen/header/ip.rb +37 -72
- data/lib/packetgen/header/ipv6/addr.rb +14 -14
- data/lib/packetgen/header/ipv6/extension.rb +8 -8
- data/lib/packetgen/header/ipv6/hop_by_hop.rb +9 -9
- data/lib/packetgen/header/ipv6.rb +20 -22
- data/lib/packetgen/header/llc.rb +17 -17
- data/lib/packetgen/header/mdns.rb +1 -1
- data/lib/packetgen/header/mld.rb +6 -6
- data/lib/packetgen/header/mldv2/mcast_address_record.rb +11 -11
- data/lib/packetgen/header/mldv2/mlq.rb +21 -23
- data/lib/packetgen/header/mldv2/mlr.rb +8 -8
- data/lib/packetgen/header/ospfv2/db_description.rb +11 -12
- data/lib/packetgen/header/ospfv2/hello.rb +11 -11
- data/lib/packetgen/header/ospfv2/ls_ack.rb +1 -1
- data/lib/packetgen/header/ospfv2/ls_request.rb +9 -9
- data/lib/packetgen/header/ospfv2/ls_update.rb +3 -3
- data/lib/packetgen/header/ospfv2/lsa.rb +54 -58
- data/lib/packetgen/header/ospfv2/lsa_header.rb +9 -9
- data/lib/packetgen/header/ospfv2.rb +27 -29
- data/lib/packetgen/header/ospfv3/db_description.rb +13 -14
- data/lib/packetgen/header/ospfv3/hello.rb +12 -12
- data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +17 -19
- data/lib/packetgen/header/ospfv3/ls_ack.rb +2 -2
- data/lib/packetgen/header/ospfv3/ls_request.rb +9 -9
- data/lib/packetgen/header/ospfv3/ls_update.rb +4 -4
- data/lib/packetgen/header/ospfv3/lsa.rb +48 -51
- data/lib/packetgen/header/ospfv3/lsa_header.rb +9 -9
- data/lib/packetgen/header/ospfv3.rb +25 -27
- data/lib/packetgen/header/sctp/chunk.rb +44 -41
- data/lib/packetgen/header/sctp/error.rb +52 -52
- data/lib/packetgen/header/sctp/parameter.rb +38 -38
- data/lib/packetgen/header/sctp.rb +5 -5
- data/lib/packetgen/header/snmp.rb +2 -2
- data/lib/packetgen/header/tcp/option.rb +45 -39
- data/lib/packetgen/header/tcp/options.rb +2 -2
- data/lib/packetgen/header/tcp.rb +55 -44
- data/lib/packetgen/header/tftp.rb +16 -16
- data/lib/packetgen/header/udp.rb +8 -8
- data/lib/packetgen/header.rb +9 -10
- data/lib/packetgen/headerable.rb +13 -3
- data/lib/packetgen/inspect.rb +2 -2
- data/lib/packetgen/packet.rb +54 -37
- data/lib/packetgen/pcap.rb +15 -4
- data/lib/packetgen/pcapng/block.rb +18 -17
- data/lib/packetgen/pcapng/epb.rb +13 -15
- data/lib/packetgen/pcapng/file.rb +3 -97
- data/lib/packetgen/pcapng/idb.rb +9 -11
- data/lib/packetgen/pcapng/shb.rb +13 -15
- data/lib/packetgen/pcapng/spb.rb +8 -10
- data/lib/packetgen/pcapng/unknown_block.rb +6 -17
- data/lib/packetgen/pcapng.rb +4 -4
- data/lib/packetgen/pcaprub_wrapper.rb +17 -1
- data/lib/packetgen/proto.rb +1 -1
- data/lib/packetgen/unknown_packet.rb +2 -2
- data/lib/packetgen/utils/arp_spoofer.rb +18 -19
- data/lib/packetgen/utils.rb +2 -2
- data/lib/packetgen/version.rb +1 -1
- data/lib/packetgen.rb +4 -3
- metadata +34 -29
- data/lib/packetgen/types/abstract_tlv.rb +0 -278
- data/lib/packetgen/types/array.rb +0 -287
- data/lib/packetgen/types/cstring.rb +0 -109
- data/lib/packetgen/types/enum.rb +0 -171
- data/lib/packetgen/types/fieldable.rb +0 -66
- data/lib/packetgen/types/fields.rb +0 -622
- data/lib/packetgen/types/int.rb +0 -473
- data/lib/packetgen/types/int_string.rb +0 -102
- data/lib/packetgen/types/length_from.rb +0 -54
- data/lib/packetgen/types/oui.rb +0 -52
- data/lib/packetgen/types/string.rb +0 -97
- data/lib/packetgen/types/tlv.rb +0 -161
- data/lib/packetgen/types.rb +0 -26
@@ -17,25 +17,24 @@ module PacketGen
|
|
17
17
|
class PPI < Base
|
18
18
|
# @!attribute version
|
19
19
|
# @return [Integer] 8-bit PPI version
|
20
|
-
|
20
|
+
define_attr :version, BinStruct::Int8, default: 0
|
21
21
|
# @!attribute flags
|
22
22
|
# @return [Integer] 8-bit PPI flags
|
23
|
-
|
23
|
+
# @!attribute align
|
24
|
+
# @return [Boolean] align flag from {#flags} attribute
|
25
|
+
define_bit_attr :flags, reserved: 7, align: 1
|
24
26
|
# @!attribute length
|
25
27
|
# @return [Integer] 16-bit PPI header length
|
26
|
-
|
28
|
+
define_attr :length, BinStruct::Int16le, default: 8
|
27
29
|
# @!attribute dlt
|
28
30
|
# @return [Integer] 32-bit PPI data link type
|
29
|
-
|
31
|
+
define_attr :dlt, BinStruct::Int32le
|
30
32
|
# @!attribute ppi_fields
|
31
33
|
# @return [Type::String] concatenation of PPI fields
|
32
|
-
|
34
|
+
define_attr :ppi_fields, BinStruct::String, builder: ->(h, t) { t.new(length_from: -> { h.length - 8 }) }
|
33
35
|
# @!attribute body
|
34
36
|
# @return [Type::String]
|
35
|
-
|
36
|
-
# @!attribute align
|
37
|
-
# @return [Boolean] align flag from {#flags} attribute
|
38
|
-
define_bit_fields_on :flags, :reserved, 7, :align
|
37
|
+
define_attr :body, BinStruct::String
|
39
38
|
|
40
39
|
# Check version field
|
41
40
|
# @see [Base#parse?]
|
@@ -65,22 +64,22 @@ module PacketGen
|
|
65
64
|
class RadioTap < Base
|
66
65
|
# @!attribute version
|
67
66
|
# @return [Integer] 8-bit version
|
68
|
-
|
67
|
+
define_attr :version, BinStruct::Int8, default: 0
|
69
68
|
# @!attribute pad
|
70
69
|
# @return [Integer] 8-bit pad
|
71
|
-
|
70
|
+
define_attr :pad, BinStruct::Int8, default: 0
|
72
71
|
# @!attribute length
|
73
72
|
# @return [Integer] 16-bit RadioTap header length
|
74
|
-
|
73
|
+
define_attr :length, BinStruct::Int16le, default: 8
|
75
74
|
# @!attribute present_flags
|
76
75
|
# @return [Integer] 32-bit integer
|
77
|
-
|
76
|
+
define_attr :present_flags, BinStruct::Int32le
|
78
77
|
# @!attribute radio_fields
|
79
78
|
# @return [Type::String] concatenation of RadioTap fields
|
80
|
-
|
79
|
+
define_attr :radio_fields, BinStruct::String, builder: ->(h, t) { t.new(length_from: -> { h.length - 8 }) }
|
81
80
|
# @!attribute body
|
82
81
|
# @return [Type::String]
|
83
|
-
|
82
|
+
define_attr :body, BinStruct::String
|
84
83
|
|
85
84
|
# Check version field
|
86
85
|
# @see [Base#parse?]
|
@@ -108,18 +107,18 @@ module PacketGen
|
|
108
107
|
# @abstract This is a base class to demultiplex different IEEE 802.11 frames when
|
109
108
|
# parsing.
|
110
109
|
# A IEEE 802.11 header may consist of at least:
|
111
|
-
# * a {#frame_ctrl} ({
|
112
|
-
# * a {#id}/duration ({
|
110
|
+
# * a {#frame_ctrl} ({BinStruct::Int16}),
|
111
|
+
# * a {#id}/duration ({BinStruct::Int16le}),
|
113
112
|
# * and a {#mac1} ({Eth::MacAddr}).
|
114
113
|
# Depending on frame type and subtype, it may also contains:
|
115
114
|
# * a {#mac2} ({Eth::MacAddr}),
|
116
115
|
# * a {#mac3} ({Eth::MacAddr}),
|
117
|
-
# * a {#sequence_ctrl} ({
|
116
|
+
# * a {#sequence_ctrl} ({BinStruct::Int16}),
|
118
117
|
# * a {#mac4} ({Eth::MacAddr}),
|
119
|
-
# * a {#qos_ctrl} ({
|
120
|
-
# * a {#ht_ctrl} ({
|
121
|
-
# * a {#body} (a {
|
122
|
-
# * a Frame check sequence ({#fcs}, of type {
|
118
|
+
# * a {#qos_ctrl} ({BinStruct::Int16}),
|
119
|
+
# * a {#ht_ctrl} ({BinStruct::Int32}),
|
120
|
+
# * a {#body} (a {BinStruct::String} or another {Base} class),
|
121
|
+
# * a Frame check sequence ({#fcs}, of type {BinStruct::Int32le})
|
123
122
|
#
|
124
123
|
# == Header accessors
|
125
124
|
# As Dot11 header types are defined under Dot11 namespace, Dot11 header accessors
|
@@ -189,38 +188,6 @@ module PacketGen
|
|
189
188
|
|
190
189
|
# @!attribute frame_ctrl
|
191
190
|
# @return [Integer] 16-bit frame control word
|
192
|
-
define_field :frame_ctrl, Types::Int16, default: 0
|
193
|
-
# @!attribute id
|
194
|
-
# @return [Integer] 16-bit ID/Duration word
|
195
|
-
define_field :id, Types::Int16le, default: 0
|
196
|
-
# @!attribute mac1
|
197
|
-
# @return [Eth::MacAddr]
|
198
|
-
define_field :mac1, Eth::MacAddr
|
199
|
-
# @!attribute mac2
|
200
|
-
# @return [Eth::MacAddr]
|
201
|
-
define_field :mac2, Eth::MacAddr
|
202
|
-
# @!attribute mac3
|
203
|
-
# @return [Eth::MacAddr]
|
204
|
-
define_field :mac3, Eth::MacAddr
|
205
|
-
# @!attribute sequence_ctrl
|
206
|
-
# @return [Integer] 16-bit sequence control word
|
207
|
-
define_field :sequence_ctrl, Types::Int16le, default: 0
|
208
|
-
# @!attribute mac4
|
209
|
-
# @return [Eth::MacAddr]
|
210
|
-
define_field :mac4, Eth::MacAddr
|
211
|
-
# @!attribute qos_ctrl
|
212
|
-
# @return [Integer] 16-bit QoS control word
|
213
|
-
define_field :qos_ctrl, Types::Int16
|
214
|
-
# @!attribute ht_ctrl
|
215
|
-
# @return [Integer] 16-bit HT control word
|
216
|
-
define_field :ht_ctrl, Types::Int32
|
217
|
-
# @!attribute body
|
218
|
-
# @return [Types::String]
|
219
|
-
define_field :body, Types::String
|
220
|
-
# @!attribute fcs
|
221
|
-
# @return [Types::Int32le]
|
222
|
-
define_field :fcs, Types::Int32le
|
223
|
-
|
224
191
|
# @!attribute subtype
|
225
192
|
# @return [Integer] 4-bit frame subtype from {#frame_ctrl}
|
226
193
|
# @!attribute type
|
@@ -243,32 +210,60 @@ module PacketGen
|
|
243
210
|
# @return [Boolean] from_ds flag from {#frame_ctrl}
|
244
211
|
# @!attribute to_ds
|
245
212
|
# @return [Boolean] to_ds flag from {#frame_ctrl}
|
246
|
-
|
247
|
-
|
248
|
-
|
213
|
+
define_bit_attr :frame_ctrl, subtype: 4, type: 2, proto_version: 2, order: 1,
|
214
|
+
wep: 1, md: 1, pwmngt: 1, retry: 1, mf: 1, from_ds: 1, to_ds: 1
|
215
|
+
# @!attribute id
|
216
|
+
# @return [Integer] 16-bit ID/Duration word
|
217
|
+
define_attr :id, BinStruct::Int16le, default: 0
|
218
|
+
# @!attribute mac1
|
219
|
+
# @return [Eth::MacAddr]
|
220
|
+
define_attr :mac1, Eth::MacAddr
|
221
|
+
# @!attribute mac2
|
222
|
+
# @return [Eth::MacAddr]
|
223
|
+
define_attr :mac2, Eth::MacAddr
|
224
|
+
# @!attribute mac3
|
225
|
+
# @return [Eth::MacAddr]
|
226
|
+
define_attr :mac3, Eth::MacAddr
|
227
|
+
# @!attribute sequence_ctrl
|
228
|
+
# @return [Integer] 16-bit sequence control word
|
249
229
|
# @!attribute sequence_number (12-bit field from {#sequence_ctrl})
|
250
230
|
# @return [Integer]
|
251
231
|
# @since 2.1.3
|
252
232
|
# @!attribute fragment_number (4-bit field from {#sequence_ctrl})
|
253
233
|
# @return [Integer]
|
254
234
|
# @since 2.1.3
|
255
|
-
|
235
|
+
define_bit_attr :sequence_ctrl, sequence_number: 12, fragment_number: 4
|
236
|
+
# @!attribute mac4
|
237
|
+
# @return [Eth::MacAddr]
|
238
|
+
define_attr :mac4, Eth::MacAddr
|
239
|
+
# @!attribute qos_ctrl
|
240
|
+
# @return [Integer] 16-bit QoS control word
|
241
|
+
define_attr :qos_ctrl, BinStruct::Int16
|
242
|
+
# @!attribute ht_ctrl
|
243
|
+
# @return [Integer] 16-bit HT control word
|
244
|
+
define_attr :ht_ctrl, BinStruct::Int32
|
245
|
+
# @!attribute body
|
246
|
+
# @return [BinStruct::String]
|
247
|
+
define_attr :body, BinStruct::String
|
248
|
+
# @!attribute fcs
|
249
|
+
# @return [BinStruct::Int32le]
|
250
|
+
define_attr :fcs, BinStruct::Int32le
|
256
251
|
|
257
252
|
alias duration id
|
258
253
|
# @private
|
259
|
-
alias
|
254
|
+
alias old_attributes attributes
|
260
255
|
|
261
256
|
# @param [Hash] options
|
262
257
|
# @see Base#initialize
|
263
258
|
def initialize(options={})
|
264
259
|
super
|
265
|
-
@
|
260
|
+
@applicable_attributes = old_attributes
|
266
261
|
end
|
267
262
|
|
268
263
|
# Get all used field names
|
269
264
|
# @return [Array<Symbol>]
|
270
|
-
def
|
271
|
-
@
|
265
|
+
def attributes
|
266
|
+
@applicable_attributes
|
272
267
|
end
|
273
268
|
|
274
269
|
# @private
|
@@ -281,24 +276,24 @@ module PacketGen
|
|
281
276
|
def read(str)
|
282
277
|
fcs = Dot11.fcs?
|
283
278
|
|
284
|
-
if self.instance_of?
|
279
|
+
if self.instance_of?(Dot11)
|
285
280
|
return self if str.nil?
|
286
281
|
|
287
282
|
force_binary str
|
288
|
-
self[:frame_ctrl].read
|
283
|
+
self[:frame_ctrl].read(str[0, 2])
|
289
284
|
|
290
285
|
case type
|
291
286
|
when 0
|
292
|
-
Dot11::Management.new.read
|
287
|
+
Dot11::Management.new.read(str)
|
293
288
|
when 1
|
294
|
-
Dot11::Control.new.read
|
289
|
+
Dot11::Control.new.read(str)
|
295
290
|
when 2
|
296
|
-
Dot11::Data.new.read
|
291
|
+
Dot11::Data.new.read(str)
|
297
292
|
else
|
298
|
-
private_read
|
293
|
+
private_read(str, fcs)
|
299
294
|
end
|
300
295
|
else
|
301
|
-
private_read
|
296
|
+
private_read(str, fcs)
|
302
297
|
end
|
303
298
|
end
|
304
299
|
|
@@ -312,8 +307,8 @@ module PacketGen
|
|
312
307
|
|
313
308
|
# @return [String]
|
314
309
|
def to_s
|
315
|
-
|
316
|
-
@
|
310
|
+
define_applicable_attributes
|
311
|
+
@applicable_attributes.map { |f| force_binary @attributes[f].to_s }.join
|
317
312
|
end
|
318
313
|
|
319
314
|
# Get human readable type
|
@@ -324,19 +319,19 @@ module PacketGen
|
|
324
319
|
|
325
320
|
# @return [String]
|
326
321
|
def inspect
|
327
|
-
str = if self.instance_of?
|
322
|
+
str = if self.instance_of?(Dot11)
|
328
323
|
Inspect.dashed_line("#{self.class} #{human_type}", 1)
|
329
|
-
elsif self.respond_to?
|
324
|
+
elsif self.respond_to?(:human_subtype)
|
330
325
|
Inspect.dashed_line("#{self.class} #{human_subtype}", 1)
|
331
326
|
else
|
332
327
|
Inspect.dashed_line(self.class.to_s, 1)
|
333
328
|
end
|
334
329
|
|
335
|
-
|
336
|
-
@
|
330
|
+
define_applicable_attributes
|
331
|
+
@applicable_attributes.each do |attr|
|
337
332
|
next if attr == :body
|
338
333
|
|
339
|
-
str << Inspect.inspect_attribute(attr, @
|
334
|
+
str << Inspect.inspect_attribute(attr, @attributes[attr], 1)
|
340
335
|
end
|
341
336
|
str
|
342
337
|
end
|
@@ -354,46 +349,46 @@ module PacketGen
|
|
354
349
|
# @param [Packet] packet
|
355
350
|
# @return [void]
|
356
351
|
def added_to_packet(packet)
|
357
|
-
return if packet.respond_to?
|
352
|
+
return if packet.respond_to?(:dot11)
|
358
353
|
|
359
354
|
packet.instance_eval("def dot11(arg=nil); header(#{self.class}, arg); end") # def dot11(arg=nil); header(Dot11, arg); end
|
360
355
|
end
|
361
356
|
|
362
357
|
private
|
363
358
|
|
364
|
-
def
|
365
|
-
|
366
|
-
@
|
359
|
+
def remove_from_applicable_attributes(attributes)
|
360
|
+
attributes = [attributes] unless attributes.is_a? Array
|
361
|
+
@applicable_attributes -= attributes
|
367
362
|
end
|
368
363
|
|
369
364
|
def handle_mac4
|
370
365
|
if to_ds? && from_ds?
|
371
|
-
@
|
366
|
+
@applicable_attributes[6, 0] = :mac4 unless @applicable_attributes.include?(:mac4)
|
372
367
|
else
|
373
|
-
|
368
|
+
remove_from_applicable_attributes(:mac4)
|
374
369
|
end
|
375
370
|
end
|
376
371
|
|
377
372
|
def handle_ht_ctrl
|
378
373
|
if order?
|
379
|
-
unless @
|
380
|
-
idx = @
|
381
|
-
@
|
374
|
+
unless @applicable_attributes.include?(:ht_ctrl)
|
375
|
+
idx = @applicable_attributes.index(:body)
|
376
|
+
@applicable_attributes[idx, 0] = :ht_ctrl
|
382
377
|
end
|
383
378
|
else
|
384
|
-
|
379
|
+
remove_from_applicable_attributes %i[ht_ctrl]
|
385
380
|
end
|
386
381
|
end
|
387
382
|
|
388
383
|
def handle_fcs
|
389
384
|
if Dot11.fcs?
|
390
|
-
@
|
385
|
+
@applicable_attributes << :fcs unless @applicable_attributes.include?(:fcs)
|
391
386
|
else
|
392
|
-
|
387
|
+
remove_from_applicable_attributes(:fcs)
|
393
388
|
end
|
394
389
|
end
|
395
390
|
|
396
|
-
def
|
391
|
+
def define_applicable_attributes
|
397
392
|
handle_mac4
|
398
393
|
handle_ht_ctrl
|
399
394
|
handle_fcs
|
@@ -401,12 +396,12 @@ module PacketGen
|
|
401
396
|
|
402
397
|
def private_read(str, fcs)
|
403
398
|
self[:frame_ctrl].read str[0, 2]
|
404
|
-
|
399
|
+
define_applicable_attributes
|
405
400
|
if fcs
|
406
|
-
old_read
|
407
|
-
self[:fcs].read
|
401
|
+
old_read(str[0...-4])
|
402
|
+
self[:fcs].read(str[-4..])
|
408
403
|
else
|
409
|
-
old_read
|
404
|
+
old_read(str)
|
410
405
|
end
|
411
406
|
self
|
412
407
|
end
|
@@ -11,9 +11,9 @@ module PacketGen
|
|
11
11
|
# IEEE 802.1Q VLAN tagging
|
12
12
|
#
|
13
13
|
# A VLAN tag consists of:
|
14
|
-
# * a {#tci Tag Control Information} ({
|
15
|
-
# * a {#ethertype} ({
|
16
|
-
# * and a body (a {
|
14
|
+
# * a {#tci Tag Control Information} ({BinStruct::Int16}),
|
15
|
+
# * a {#ethertype} ({BinStruct::Int16}),
|
16
|
+
# * and a body (a {BinStruct::String} or another Header class).
|
17
17
|
#
|
18
18
|
# == Create a Dot1q header
|
19
19
|
# # Create a IP packet in VLAN #43
|
@@ -23,21 +23,19 @@ module PacketGen
|
|
23
23
|
class Dot1q < Base
|
24
24
|
# @!attribute tci
|
25
25
|
# @return [Integer] 16-bit Tag Control Information
|
26
|
-
define_field :tci, Types::Int16
|
27
|
-
# @!attribute ethertype
|
28
|
-
# @return [Integer] 16-bit EtherType
|
29
|
-
define_field :ethertype, Types::Int16
|
30
|
-
# @!attribute body
|
31
|
-
# @return [Types::String,Header::Base]
|
32
|
-
define_field :body, Types::String
|
33
|
-
|
34
26
|
# @!attribute pcp
|
35
27
|
# @return [Integer] 3-bit Priority Code Point from {#tci}
|
36
28
|
# @!attribute dei
|
37
29
|
# @return [Boolean] Drop Eligible Indicator from {#tci}
|
38
30
|
# @!attribute vid
|
39
31
|
# @return [Integer] 12-bit VLAN ID from {#tci}
|
40
|
-
|
32
|
+
define_bit_attr :tci, pcp: 3, dei: 1, vid: 12
|
33
|
+
# @!attribute ethertype
|
34
|
+
# @return [Integer] 16-bit EtherType
|
35
|
+
define_attr :ethertype, BinStruct::Int16
|
36
|
+
# @!attribute body
|
37
|
+
# @return [BinStruct::String,Header::Base]
|
38
|
+
define_attr :body, BinStruct::String
|
41
39
|
end
|
42
40
|
|
43
41
|
Eth.bind Dot1q, ethertype: 0x8100
|
@@ -11,10 +11,10 @@ module PacketGen
|
|
11
11
|
# IEEE 802.1X / EAPOL
|
12
12
|
#
|
13
13
|
# A IEEE 802.1X header consists of:
|
14
|
-
# * a {#version} ({
|
15
|
-
# * a packet {#type} ({
|
16
|
-
# * a {#length} ({
|
17
|
-
# * and a body (a {
|
14
|
+
# * a {#version} ({BinStruct::Int8}),
|
15
|
+
# * a packet {#type} ({BinStruct::Int8}),
|
16
|
+
# * a {#length} ({BinStruct::Int16}),
|
17
|
+
# * and a body (a {BinStruct::String} or another Header class).
|
18
18
|
# == Create a Dot1x header
|
19
19
|
# pkt1 = PacketGen.gen('Eth').add('Dot1x', type: 1)
|
20
20
|
# pkt2 = PacketGen.gen('Eth').add('Dot1x')
|
@@ -37,16 +37,16 @@ module PacketGen
|
|
37
37
|
|
38
38
|
# @!attribute version
|
39
39
|
# @return [Integer] 8-bit Protocol Version
|
40
|
-
|
40
|
+
define_attr :version, BinStruct::Int8, default: 1
|
41
41
|
# @!attribute type
|
42
42
|
# @return [Integer] 8-bit Packet Type
|
43
|
-
|
43
|
+
define_attr :type, BinStruct::Int8Enum, enum: TYPES
|
44
44
|
# @!attribute length
|
45
45
|
# @return [Integer] 16-bit body length
|
46
|
-
|
46
|
+
define_attr :length, BinStruct::Int16
|
47
47
|
# @!attribute body
|
48
|
-
# @return [
|
49
|
-
|
48
|
+
# @return [BinStruct::String,Header::Base]
|
49
|
+
define_attr :body, BinStruct::String, builder: ->(h, t) { t.new(length_from: h[:length]) }
|
50
50
|
|
51
51
|
# Get human readable type
|
52
52
|
# @return [String]
|
@@ -13,13 +13,13 @@ module PacketGen
|
|
13
13
|
# Secure Tunneling, {https://tools.ietf.org/html/rfc4851 RFC 4851}
|
14
14
|
#
|
15
15
|
# {EAP::FAST} has following fields:
|
16
|
-
# * {#flags} ({
|
17
|
-
# * optionally {#message_length} ({
|
18
|
-
# * {#body} ({
|
16
|
+
# * {#flags} ({BinStruct::Int8}),
|
17
|
+
# * optionally {#message_length} ({BinStruct::Int32}), if +#l?+ is +true+,
|
18
|
+
# * {#body} ({BinStruct::String}).
|
19
19
|
# @author Sylvain Daubert
|
20
20
|
# @since 2.1.4
|
21
21
|
class FAST < TTLS
|
22
|
-
|
22
|
+
update_attr :type, default: 43
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
@@ -14,19 +14,19 @@ module PacketGen
|
|
14
14
|
# @author Sylvain Daubert
|
15
15
|
# @since 2.1.4
|
16
16
|
class MD5 < EAP
|
17
|
-
|
18
|
-
|
17
|
+
update_attr :type, default: 4
|
18
|
+
remove_attr :body
|
19
19
|
|
20
20
|
# @!attribute value_size
|
21
21
|
# @return [Integer] 8-bit value size
|
22
|
-
|
22
|
+
define_attr :value_size, BinStruct::Int8
|
23
23
|
# @!attribute value
|
24
24
|
# @return [::String]
|
25
|
-
|
26
|
-
|
25
|
+
define_attr :value, BinStruct::String,
|
26
|
+
builder: ->(h, t) { t.new(length_from: h[:value_size]) }
|
27
27
|
# @!attribute optional_name
|
28
28
|
# @return [::String]
|
29
|
-
|
29
|
+
define_attr :optional_name, BinStruct::String
|
30
30
|
end
|
31
31
|
end
|
32
32
|
end
|
@@ -13,27 +13,25 @@ module PacketGen
|
|
13
13
|
# {https://tools.ietf.org/html/rfc5216 RFC 5216}
|
14
14
|
#
|
15
15
|
# {EAP::TLS} has following fields:
|
16
|
-
# * {#flags} ({
|
17
|
-
# * optionally {#tls_length} ({
|
18
|
-
# * {#body} ({
|
16
|
+
# * {#flags} ({BinStruct::Int8}),
|
17
|
+
# * optionally {#tls_length} ({BinStruct::Int32}), if +#l?+ is +true+,
|
18
|
+
# * {#body} ({BinStruct::String}).
|
19
19
|
# @author Sylvain Daubert
|
20
20
|
# @since 2.1.4
|
21
21
|
class TLS < EAP
|
22
|
-
|
22
|
+
update_attr :type, default: 13
|
23
23
|
# @!attribute flags
|
24
24
|
# @return [Integer] 8-bit flags
|
25
|
-
define_field_before :body, :flags, Types::Int8
|
26
|
-
|
27
25
|
# @!attribute l
|
28
|
-
# Say if length field is included
|
29
|
-
# @return [
|
26
|
+
# Say if length field is included
|
27
|
+
# @return [Integer]
|
30
28
|
# @!attribute m
|
31
|
-
# Say if there are more fragments
|
32
|
-
# @return [
|
29
|
+
# Say if there are more fragments
|
30
|
+
# @return [Integer]
|
33
31
|
# @!attribute s
|
34
|
-
# If set, this message is a TLS-Start
|
35
|
-
# @return [
|
36
|
-
|
32
|
+
# If set, this message is a TLS-Start
|
33
|
+
# @return [Integer]
|
34
|
+
define_bit_attr_before :body, :flags, l: 1, m: 1, s: 1, reserved: 5
|
37
35
|
alias length_present? l?
|
38
36
|
alias more_fragments? m?
|
39
37
|
alias tls_start? s?
|
@@ -43,8 +41,8 @@ module PacketGen
|
|
43
41
|
# TLS message or set of messages that is being fragmented. So, it
|
44
42
|
# cannot be automatically calculated (no +#calc_length+ method).
|
45
43
|
# @return [Integer] 32-bit TLS length
|
46
|
-
|
47
|
-
|
44
|
+
define_attr_before :body, :tls_length, BinStruct::Int32,
|
45
|
+
optional: lambda(&:l?)
|
48
46
|
|
49
47
|
# @return [String]
|
50
48
|
def inspect
|
@@ -13,31 +13,29 @@ module PacketGen
|
|
13
13
|
# {https://tools.ietf.org/html/rfc5281 RFC 5281}
|
14
14
|
#
|
15
15
|
# {EAP::TTLS} has following fields:
|
16
|
-
# * {#flags} ({
|
17
|
-
# * optionally {#message_length} ({
|
18
|
-
# * {#body} ({
|
16
|
+
# * {#flags} ({BinStruct::Int8}),
|
17
|
+
# * optionally {#message_length} ({BinStruct::Int32}), if +#l?+ is +true+,
|
18
|
+
# * {#body} ({BinStruct::String}).
|
19
19
|
# @author Sylvain Daubert
|
20
20
|
# @since 2.1.4
|
21
21
|
class TTLS < EAP
|
22
|
-
|
22
|
+
update_attr :type, default: 21
|
23
23
|
# @!attribute flags
|
24
24
|
# @return [Integer] 8-bit flags
|
25
|
-
define_field_before :body, :flags, Types::Int8
|
26
|
-
|
27
25
|
# @!attribute l
|
28
|
-
# Say if length field is included
|
29
|
-
# @return [
|
26
|
+
# Say if length field is included
|
27
|
+
# @return [Integer]
|
30
28
|
# @!attribute m
|
31
|
-
# Say if there are more fragments
|
32
|
-
# @return [
|
29
|
+
# Say if there are more fragments
|
30
|
+
# @return [Integer]
|
33
31
|
# @!attribute s
|
34
|
-
# If set, this message is a TLS-Start
|
35
|
-
# @return [
|
32
|
+
# If set, this message is a TLS-Start
|
33
|
+
# @return [Integer]
|
36
34
|
# @!attribute reserved
|
37
35
|
# @return [Integer] 2-bit reserved integer
|
38
36
|
# @!attribute version
|
39
37
|
# @return [Integer] 3-bit version
|
40
|
-
|
38
|
+
define_bit_attr_before :body, :flags, l: 1, m: 1, s: 1, reserved: 2, version: 3
|
41
39
|
alias length_present? l?
|
42
40
|
alias more_fragments? m?
|
43
41
|
alias tls_start? s?
|
@@ -47,8 +45,8 @@ module PacketGen
|
|
47
45
|
# raw data message sequence prior to fragmentation. So, it
|
48
46
|
# cannot be automatically calculated (no +#calc_length+ method).
|
49
47
|
# @return [Integer] 32-bit message length
|
50
|
-
|
51
|
-
|
48
|
+
define_attr_before :body, :message_length, BinStruct::Int32,
|
49
|
+
optional: lambda(&:l?)
|
52
50
|
|
53
51
|
# @return [String]
|
54
52
|
def inspect
|