packetgen 3.3.3 → 4.1.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 +38 -22
- data/lib/packetgen/capture.rb +2 -2
- data/lib/packetgen/config.rb +0 -1
- data/lib/packetgen/deprecation.rb +14 -8
- data/lib/packetgen/header/arp.rb +17 -18
- data/lib/packetgen/header/asn1_base.rb +2 -1
- data/lib/packetgen/header/base.rb +42 -40
- data/lib/packetgen/header/bootp.rb +35 -37
- data/lib/packetgen/header/dhcp/option.rb +21 -21
- data/lib/packetgen/header/dhcp/options.rb +3 -3
- data/lib/packetgen/header/dhcp.rb +8 -9
- data/lib/packetgen/header/dhcpv6/duid.rb +16 -16
- data/lib/packetgen/header/dhcpv6/option.rb +83 -61
- data/lib/packetgen/header/dhcpv6/options.rb +4 -4
- data/lib/packetgen/header/dhcpv6/relay.rb +6 -5
- data/lib/packetgen/header/dhcpv6.rb +17 -18
- data/lib/packetgen/header/dns/name.rb +21 -16
- data/lib/packetgen/header/dns/opt.rb +5 -2
- data/lib/packetgen/header/dns/option.rb +14 -14
- data/lib/packetgen/header/dns/qdsection.rb +3 -3
- data/lib/packetgen/header/dns/question.rb +7 -8
- data/lib/packetgen/header/dns/rr.rb +56 -43
- data/lib/packetgen/header/dns/rrsection.rb +6 -6
- data/lib/packetgen/header/dns.rb +103 -90
- data/lib/packetgen/header/dot11/control.rb +12 -12
- data/lib/packetgen/header/dot11/data.rb +25 -24
- data/lib/packetgen/header/dot11/element.rb +4 -4
- data/lib/packetgen/header/dot11/management.rb +21 -18
- data/lib/packetgen/header/dot11/sub_mngt.rb +40 -53
- data/lib/packetgen/header/dot11.rb +117 -122
- data/lib/packetgen/header/dot1q.rb +12 -13
- data/lib/packetgen/header/dot1x.rb +13 -13
- data/lib/packetgen/header/eap/fast.rb +4 -4
- data/lib/packetgen/header/eap/md5.rb +16 -8
- data/lib/packetgen/header/eap/tls.rb +18 -19
- data/lib/packetgen/header/eap/ttls.rb +22 -21
- data/lib/packetgen/header/eap.rb +73 -48
- data/lib/packetgen/header/eth.rb +41 -27
- data/lib/packetgen/header/gre.rb +33 -11
- data/lib/packetgen/header/http/headers.rb +7 -6
- data/lib/packetgen/header/http/request.rb +38 -29
- data/lib/packetgen/header/http/response.rb +35 -27
- data/lib/packetgen/header/http/verbs.rb +1 -3
- data/lib/packetgen/header/icmp.rb +14 -14
- data/lib/packetgen/header/icmpv6.rb +10 -9
- data/lib/packetgen/header/igmp.rb +26 -15
- data/lib/packetgen/header/igmpv3/group_record.rb +18 -13
- data/lib/packetgen/header/igmpv3/mq.rb +16 -18
- data/lib/packetgen/header/igmpv3/mr.rb +5 -5
- data/lib/packetgen/header/igmpv3.rb +12 -11
- data/lib/packetgen/header/ip/addr.rb +19 -15
- data/lib/packetgen/header/ip/option.rb +47 -36
- data/lib/packetgen/header/ip/options.rb +1 -1
- data/lib/packetgen/header/ip.rb +77 -95
- data/lib/packetgen/header/ipv6/addr.rb +28 -27
- data/lib/packetgen/header/ipv6/extension.rb +13 -11
- data/lib/packetgen/header/ipv6/hop_by_hop.rb +32 -13
- data/lib/packetgen/header/ipv6.rb +42 -35
- data/lib/packetgen/header/llc.rb +28 -21
- data/lib/packetgen/header/mdns.rb +10 -3
- data/lib/packetgen/header/mld.rb +15 -13
- data/lib/packetgen/header/mldv2/mcast_address_record.rb +17 -12
- data/lib/packetgen/header/mldv2/mlq.rb +22 -24
- data/lib/packetgen/header/mldv2/mlr.rb +8 -8
- data/lib/packetgen/header/mldv2.rb +1 -1
- data/lib/packetgen/header/ospfv2/db_description.rb +17 -18
- data/lib/packetgen/header/ospfv2/hello.rb +18 -17
- data/lib/packetgen/header/ospfv2/ls_ack.rb +6 -7
- data/lib/packetgen/header/ospfv2/ls_request.rb +14 -13
- data/lib/packetgen/header/ospfv2/ls_update.rb +9 -9
- data/lib/packetgen/header/ospfv2/lsa.rb +79 -60
- data/lib/packetgen/header/ospfv2/lsa_header.rb +12 -11
- data/lib/packetgen/header/ospfv2.rb +49 -46
- data/lib/packetgen/header/ospfv3/db_description.rb +20 -22
- data/lib/packetgen/header/ospfv3/hello.rb +17 -16
- data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +22 -20
- data/lib/packetgen/header/ospfv3/ls_ack.rb +7 -8
- data/lib/packetgen/header/ospfv3/ls_request.rb +18 -18
- data/lib/packetgen/header/ospfv3/ls_update.rb +10 -10
- data/lib/packetgen/header/ospfv3/lsa.rb +62 -51
- data/lib/packetgen/header/ospfv3/lsa_header.rb +12 -11
- data/lib/packetgen/header/ospfv3.rb +54 -52
- data/lib/packetgen/header/sctp/chunk.rb +80 -56
- data/lib/packetgen/header/sctp/error.rb +174 -202
- data/lib/packetgen/header/sctp/padded32.rb +3 -3
- data/lib/packetgen/header/sctp/parameter.rb +89 -136
- data/lib/packetgen/header/sctp.rb +19 -8
- data/lib/packetgen/header/snmp.rb +108 -7
- data/lib/packetgen/header/tcp/option.rb +52 -39
- data/lib/packetgen/header/tcp/options.rb +13 -5
- data/lib/packetgen/header/tcp.rb +83 -65
- data/lib/packetgen/header/tftp.rb +31 -25
- data/lib/packetgen/header/udp.rb +21 -19
- data/lib/packetgen/header.rb +23 -18
- data/lib/packetgen/headerable.rb +21 -5
- data/lib/packetgen/inspect.rb +3 -8
- data/lib/packetgen/packet.rb +146 -71
- data/lib/packetgen/pcap.rb +15 -4
- data/lib/packetgen/pcapng/block.rb +20 -18
- data/lib/packetgen/pcapng/epb.rb +13 -15
- data/lib/packetgen/pcapng/file.rb +44 -111
- data/lib/packetgen/pcapng/idb.rb +11 -12
- data/lib/packetgen/pcapng/shb.rb +15 -16
- data/lib/packetgen/pcapng/spb.rb +9 -11
- data/lib/packetgen/pcapng/unknown_block.rb +6 -17
- data/lib/packetgen/pcapng.rb +6 -4
- data/lib/packetgen/pcaprub_wrapper.rb +17 -1
- data/lib/packetgen/proto.rb +5 -1
- data/lib/packetgen/unknown_packet.rb +5 -5
- data/lib/packetgen/utils/arp_spoofer.rb +18 -19
- data/lib/packetgen/utils.rb +4 -3
- data/lib/packetgen/version.rb +1 -1
- data/lib/packetgen.rb +12 -5
- metadata +29 -38
- 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
@@ -9,30 +9,31 @@
|
|
9
9
|
module PacketGen
|
10
10
|
module Header
|
11
11
|
class DHCPv6
|
12
|
-
# A DHCPv6 consists of:
|
13
|
-
# * a {#type} (
|
14
|
-
# * a {#length} (
|
15
|
-
# * and a {#data} (
|
12
|
+
# A DHCPv6 option consists of:
|
13
|
+
# * a {#type} (+BinStruct::Int16+),
|
14
|
+
# * a {#length} (+BinStruct::Int16+),
|
15
|
+
# * and a {#data} (+BinStruct::String+).
|
16
16
|
#
|
17
17
|
# Subclasses handles known options. These subclasses may remove {#data}
|
18
18
|
# field to replace it by specific option field(s).
|
19
19
|
# @author Sylvain Daubert
|
20
|
-
class Option <
|
21
|
-
include
|
20
|
+
class Option < BinStruct::Struct
|
21
|
+
include BinStruct::Structable
|
22
22
|
|
23
23
|
# @!attribute type
|
24
24
|
# 16-bit option type
|
25
25
|
# @return [Integer]
|
26
|
-
|
26
|
+
define_attr :type, BinStruct::Int16
|
27
27
|
# @!attribute length
|
28
|
-
# 16-bit option length
|
28
|
+
# 16-bit option length. Length of data part.
|
29
29
|
# @return [Integer]
|
30
|
-
|
30
|
+
define_attr :length, BinStruct::Int16
|
31
|
+
# @!scope class
|
31
32
|
# @!attribute data
|
32
33
|
# variable length option data.
|
33
34
|
# @return [String]
|
34
|
-
|
35
|
-
|
35
|
+
define_attr :data, BinStruct::String,
|
36
|
+
builder: ->(h, t) { t.new(length_from: h[:length]) }
|
36
37
|
|
37
38
|
class << self
|
38
39
|
# Get Option subclasses
|
@@ -63,7 +64,7 @@ module PacketGen
|
|
63
64
|
when String
|
64
65
|
if DHCPv6.const_defined?(options[:type])
|
65
66
|
klass = DHCPv6.const_get(options[:type])
|
66
|
-
options.delete
|
67
|
+
options.delete(:type)
|
67
68
|
klass.new(options) if klass < Option
|
68
69
|
end
|
69
70
|
else
|
@@ -96,7 +97,7 @@ module PacketGen
|
|
96
97
|
# Get a human-readable string for this option
|
97
98
|
# @return [String]
|
98
99
|
def to_human
|
99
|
-
str =
|
100
|
+
str = "#{human_type}:"
|
100
101
|
if respond_to?(:human_data) && !human_data.empty?
|
101
102
|
str << human_data
|
102
103
|
elsif !self[:data].nil?
|
@@ -111,12 +112,12 @@ module PacketGen
|
|
111
112
|
# DHCPv6 Client ID option
|
112
113
|
# @author Sylvain Daubert
|
113
114
|
class ClientID < Option
|
114
|
-
|
115
|
-
|
115
|
+
update_attr :type, default: 1
|
116
|
+
remove_attr :data
|
116
117
|
|
117
118
|
# @!attribute duid
|
118
119
|
# @return [DUID]
|
119
|
-
|
120
|
+
define_attr :duid, DUID
|
120
121
|
|
121
122
|
# Get human-readable data (DUID)
|
122
123
|
# @return [String]
|
@@ -128,32 +129,32 @@ module PacketGen
|
|
128
129
|
# DHCPv6 Server ID option
|
129
130
|
# @author Sylvain Daubert
|
130
131
|
class ServerID < ClientID
|
131
|
-
|
132
|
+
update_attr :type, default: 2
|
132
133
|
end
|
133
134
|
|
134
135
|
# DHCPv6 Identity Association for Non-temporary Addresses Option
|
135
136
|
# @author Sylvain Daubert
|
136
137
|
class IANA < Option
|
137
|
-
|
138
|
-
|
138
|
+
update_attr :type, default: 3
|
139
|
+
remove_attr :data
|
139
140
|
|
140
141
|
# @!attribute iaid
|
141
142
|
# 32-bit IAID field
|
142
143
|
# @return [Integer]
|
143
|
-
|
144
|
+
define_attr :iaid, BinStruct::Int32
|
144
145
|
# @!attribute t1
|
145
146
|
# 32-bit T1 field
|
146
147
|
# @return [Integer]
|
147
|
-
|
148
|
+
define_attr :t1, BinStruct::Int32
|
148
149
|
# @!attribute t2
|
149
150
|
# 32-bit T2 field
|
150
151
|
# @return [Integer]
|
151
|
-
|
152
|
+
define_attr :t2, BinStruct::Int32
|
152
153
|
# @!attribute options
|
153
154
|
# options field
|
154
155
|
# @return [String]
|
155
|
-
|
156
|
-
|
156
|
+
define_attr :options, BinStruct::String,
|
157
|
+
builder: ->(h, t) { t.new length_from: -> { h[:length].to_i - 12 } }
|
157
158
|
|
158
159
|
# Get human-readable data (IAID, T1 and T2)
|
159
160
|
# @return [String]
|
@@ -165,18 +166,18 @@ module PacketGen
|
|
165
166
|
# DHCPv6 Identity Association for Temporary Addresses Option
|
166
167
|
# @author Sylvain Daubert
|
167
168
|
class IATA < Option
|
168
|
-
|
169
|
-
|
169
|
+
update_attr :type, default: 4
|
170
|
+
remove_attr :data
|
170
171
|
|
171
172
|
# @!attribute iaid
|
172
173
|
# 32-bit IAID field
|
173
174
|
# @return [Integer]
|
174
|
-
|
175
|
+
define_attr :iaid, BinStruct::Int32
|
175
176
|
# @!attribute options
|
176
177
|
# options field
|
177
178
|
# @return [String]
|
178
|
-
|
179
|
-
|
179
|
+
define_attr :options, BinStruct::String,
|
180
|
+
builder: ->(h, t) { t.new length_from: -> { h[:length].to_i - 4 } }
|
180
181
|
|
181
182
|
# Get human-readable data (IAID)
|
182
183
|
# @return [String]
|
@@ -188,26 +189,26 @@ module PacketGen
|
|
188
189
|
# DHCPv6 IA Address option
|
189
190
|
# @author Sylvain Daubert
|
190
191
|
class IAAddr < Option
|
191
|
-
|
192
|
-
|
192
|
+
update_attr :type, default: 5
|
193
|
+
remove_attr :data
|
193
194
|
|
194
195
|
# @attribute ipv6
|
195
196
|
# IPv6 address
|
196
197
|
# @return [IPv6::Addr]
|
197
|
-
|
198
|
+
define_attr :ipv6, IPv6::Addr
|
198
199
|
# @attribute preferred_lifetime
|
199
200
|
# 32-bit preferred lifetime
|
200
201
|
# @return [Integer]
|
201
|
-
|
202
|
+
define_attr :preferred_lifetime, BinStruct::Int32
|
202
203
|
# @attribute valid_lifetime
|
203
204
|
# 32-bit valid lifetime
|
204
205
|
# @return [Integer]
|
205
|
-
|
206
|
+
define_attr :valid_lifetime, BinStruct::Int32
|
206
207
|
# @!attribute options
|
207
208
|
# options field
|
208
209
|
# @return [String]
|
209
|
-
|
210
|
-
|
210
|
+
define_attr :options, BinStruct::String,
|
211
|
+
builder: ->(h, t) { t.new length_from: -> { h[:length].to_i - 24 } }
|
211
212
|
|
212
213
|
# Get human-readable data (ipv6, preferred lifetime and valid lifetime)
|
213
214
|
# @return [String]
|
@@ -216,22 +217,17 @@ module PacketGen
|
|
216
217
|
end
|
217
218
|
end
|
218
219
|
|
219
|
-
# List of requested options for {ORO} option.
|
220
|
-
# Set of {Types::Int16}
|
221
|
-
# @author Sylvain Daubert
|
222
|
-
class RequestedOptions < Types::Array
|
223
|
-
set_of Types::Int16
|
224
|
-
end
|
225
|
-
|
226
220
|
# DHCPv6 Option Request Option
|
227
221
|
# @author Sylvain Daubert
|
228
222
|
class ORO < Option
|
229
|
-
|
230
|
-
|
223
|
+
update_attr :type, default: 6
|
224
|
+
remove_attr :data
|
231
225
|
|
232
226
|
# @!attribute options
|
233
|
-
# @return [
|
234
|
-
|
227
|
+
# @return [BinStruct::ArrayOfInt16]
|
228
|
+
# @since 2.5.0
|
229
|
+
# @since 4.1.0 Type +BinStruct::ArrayOfInt16+ instead of custom +RequestedOptions+ (deleted)
|
230
|
+
define_attr :options, BinStruct::ArrayOfInt16, builder: ->(h, t) { t.new(length_from: h[:length]) }
|
235
231
|
|
236
232
|
# Get human-readable data
|
237
233
|
# @return [String]
|
@@ -243,13 +239,13 @@ module PacketGen
|
|
243
239
|
# DHCPv6 Preference option
|
244
240
|
# @author Sylvain Daubert
|
245
241
|
class Preference < Option
|
246
|
-
|
247
|
-
|
242
|
+
update_attr :type, default: 7
|
243
|
+
remove_attr :data
|
248
244
|
|
249
245
|
# @!attribute value
|
250
246
|
# 8-bit value
|
251
247
|
# @return [Integer]
|
252
|
-
|
248
|
+
define_attr :value, BinStruct::Int8
|
253
249
|
|
254
250
|
# Get human-readable data (value)
|
255
251
|
# @return [String]
|
@@ -261,13 +257,13 @@ module PacketGen
|
|
261
257
|
# DHCPv6 Elapsed Time option
|
262
258
|
# @author Sylvain Daubert
|
263
259
|
class ElapsedTime < Option
|
264
|
-
|
265
|
-
|
260
|
+
update_attr :type, default: 8
|
261
|
+
remove_attr :data
|
266
262
|
|
267
263
|
# @!attribute value
|
268
264
|
# 16-bit value
|
269
265
|
# @return [Integer]
|
270
|
-
|
266
|
+
define_attr :value, BinStruct::Int16
|
271
267
|
|
272
268
|
# Get human-readable data (value)
|
273
269
|
# @return [String]
|
@@ -279,19 +275,22 @@ module PacketGen
|
|
279
275
|
# DHCPv6 Relay Message option
|
280
276
|
# @author Sylvain Daubert
|
281
277
|
class RelayMessage < Option
|
282
|
-
|
278
|
+
update_attr :type, default: 9
|
279
|
+
# @!attribute data
|
280
|
+
# variable length option data.
|
281
|
+
# @return [String]
|
283
282
|
end
|
284
283
|
|
285
284
|
# DHCPv6 Server Unicast option
|
286
285
|
# @author Sylvain Daubert
|
287
286
|
class ServerUnicast < Option
|
288
|
-
|
289
|
-
|
287
|
+
update_attr :type, default: 12
|
288
|
+
remove_attr :data
|
290
289
|
|
291
290
|
# @!attribute addr
|
292
291
|
# IPv6 server address
|
293
292
|
# @return [IPv6::Addr]
|
294
|
-
|
293
|
+
define_attr :addr, IPv6::Addr
|
295
294
|
|
296
295
|
# Get human-readable data (addr)
|
297
296
|
# @return [String]
|
@@ -302,15 +301,38 @@ module PacketGen
|
|
302
301
|
|
303
302
|
# DHCPv6 Status Code option
|
304
303
|
# @author Sylvain Daubert
|
305
|
-
class StatusCode <
|
306
|
-
|
304
|
+
class StatusCode < Option
|
305
|
+
update_attr :type, default: 13
|
306
|
+
remove_attr :data
|
307
|
+
|
308
|
+
# @!attribute status_code
|
309
|
+
# 16-bit status code
|
310
|
+
# @return [Integer]
|
311
|
+
define_attr :status_code, BinStruct::Int16
|
312
|
+
# @!attribute status_message
|
313
|
+
# UTF-8 encoded text string suitable for display to an end user
|
314
|
+
# @return [::String]
|
315
|
+
define_attr :status_message, BinStruct::String
|
316
|
+
|
317
|
+
# @param [Hash] options
|
318
|
+
def initialize(options={})
|
319
|
+
options[:length] = options[:status_message].to_s.size + 2 if options[:status_message]
|
320
|
+
super
|
321
|
+
self.length = self.sz - 4 if options[:status_message].nil?
|
322
|
+
end
|
323
|
+
|
324
|
+
# Get human-readable data (status code)
|
325
|
+
# @return [String]
|
326
|
+
def human_data
|
327
|
+
status_code.to_s
|
328
|
+
end
|
307
329
|
end
|
308
330
|
|
309
331
|
# DHCPv6 Rapid Commit option
|
310
332
|
# @author Sylvain Daubert
|
311
333
|
class RapidCommit < Option
|
312
|
-
|
313
|
-
|
334
|
+
update_attr :type, default: 14
|
335
|
+
remove_attr :data
|
314
336
|
end
|
315
337
|
end
|
316
338
|
end
|
@@ -11,18 +11,18 @@ module PacketGen
|
|
11
11
|
class DHCPv6
|
12
12
|
# Container class for DHCPv6 {Option options}.
|
13
13
|
#
|
14
|
-
#
|
15
|
-
# options = PacketGen::Header::
|
14
|
+
# @example Add DHCPv6 options to an +Options+ instance
|
15
|
+
# options = PacketGen::Header::DHCPv6::Options.new
|
16
16
|
# # Add an ElapsedTime option
|
17
17
|
# options << { type: 'ElapsedTime', value: 3600 }
|
18
18
|
# # Add a ClientID. Here, use integer type
|
19
19
|
# duid = PacketGen::Header::DHCPv6::DUID_LL.new(link_addr: '08:00:27:fe:8f:95')
|
20
20
|
# options << { type: 1, duid: duid }
|
21
21
|
# @author Sylvain Daubert
|
22
|
-
class Options <
|
22
|
+
class Options < BinStruct::Array
|
23
23
|
set_of DHCPv6::Option
|
24
24
|
|
25
|
-
# Separator used in
|
25
|
+
# Separator used in +#to_human+.
|
26
26
|
HUMAN_SEPARATOR = ';'
|
27
27
|
|
28
28
|
private
|
@@ -21,25 +21,26 @@ module PacketGen
|
|
21
21
|
# @!attribute msg_type
|
22
22
|
# 8-bit message type
|
23
23
|
# @return [Integer]
|
24
|
-
|
24
|
+
define_attr :msg_type, BinStruct::Int8Enum, enum: MESSAGE_TYPES
|
25
25
|
# @!attribute hop_count
|
26
26
|
# 8-bit hop count (number of relay agents that have relayed
|
27
27
|
# this message)
|
28
28
|
# @return [Integer]
|
29
|
-
|
29
|
+
define_attr :hop_count, BinStruct::Int8
|
30
30
|
# @!attribute link
|
31
31
|
# Link address: address that will be used by the server to identify
|
32
32
|
# the link on which the client is located
|
33
33
|
# @return [IPv6::Addr]
|
34
|
-
|
34
|
+
define_attr :link, IPv6::Addr
|
35
35
|
# @!attribute peer
|
36
36
|
# Peer address: the address of the client or relay agent from which
|
37
37
|
# the message to be relayed was received
|
38
38
|
# @return [IPv6::Addr]
|
39
|
-
|
39
|
+
define_attr :peer, IPv6::Addr
|
40
40
|
# @!attribute options
|
41
|
+
# Set of {Option}s
|
41
42
|
# @return [DHCPv6::Options]
|
42
|
-
|
43
|
+
define_attr :options, DHCPv6::Options
|
43
44
|
end
|
44
45
|
end
|
45
46
|
|
@@ -22,22 +22,20 @@ module PacketGen
|
|
22
22
|
# | |
|
23
23
|
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
24
24
|
# A DHCPv6 header is made of:
|
25
|
-
# * a {#msg_type} field (
|
26
|
-
# * a {#transaction_id} field (
|
27
|
-
# * and an {#options} field ({DHCPv6::Options}).
|
25
|
+
# * a {#msg_type} field (+BinStruct::Int8Enum+),
|
26
|
+
# * a {#transaction_id} field (+BinStruct::Int24+),
|
27
|
+
# * and an {#options} field ({DHCPv6::Options}). This field is a container for {DHCPv6::Option} objects.
|
28
28
|
#
|
29
|
-
#
|
29
|
+
# @example Create a DHCPv6 header
|
30
30
|
# # standalone
|
31
|
-
#
|
32
|
-
#
|
33
|
-
#
|
34
|
-
#
|
35
|
-
#
|
36
|
-
#
|
37
|
-
# == Add options
|
38
|
-
# DHCPv6 options are defined by subclasses of {DHCPv6::Option}.
|
31
|
+
# dhcpv6 = PacketGen::Header::DHCPv6.new(msg_type: 'SOLLICIT')
|
32
|
+
# # in a packet
|
33
|
+
# pkt = PacketGen.gen('IPv6').add('UDP').add('DHCPv6', msg_type: 'SOLLICIT')
|
34
|
+
# # access to DHCPv6 header from packet
|
35
|
+
# pkt.dhcpv6.class #=> PacketGen::Header::DHCPv6
|
39
36
|
#
|
40
|
-
#
|
37
|
+
# @example Add options
|
38
|
+
# # Options may be added by pushing a hash to #options:
|
41
39
|
# dhcpv6 = PacketGen::Header::DHCPv6.new(msg_type: 'SOLLICIT')
|
42
40
|
# dhcpv6.options << { type: 'Preference', value: 1 }
|
43
41
|
# @author Sylvain Daubert
|
@@ -72,20 +70,21 @@ module PacketGen
|
|
72
70
|
# @!attribute msg_type
|
73
71
|
# 8-bit message type
|
74
72
|
# @return [Integer]
|
75
|
-
|
73
|
+
define_attr :msg_type, BinStruct::Int8Enum, enum: MESSAGE_TYPES
|
76
74
|
# @!attribute transaction_id
|
77
75
|
# 24-bit transaction ID
|
78
|
-
#
|
79
|
-
|
76
|
+
# @return [Integer]
|
77
|
+
define_attr :transaction_id, BinStruct::Int24
|
80
78
|
# @!attribute options
|
79
|
+
# Set of {Option}s
|
81
80
|
# @return [DHCPv6::Options]
|
82
|
-
|
81
|
+
define_attr :options, DHCPv6::Options
|
83
82
|
|
84
83
|
# Populate object from string
|
85
84
|
# @param [String] str
|
86
85
|
# @return [DHCPv6,DHCPv6::Relay]
|
87
86
|
def read(str)
|
88
|
-
msg_type =
|
87
|
+
msg_type = BinStruct::Int8.new.read(str)
|
89
88
|
|
90
89
|
case msg_type
|
91
90
|
when 12, 13
|
@@ -9,26 +9,31 @@
|
|
9
9
|
module PacketGen
|
10
10
|
module Header
|
11
11
|
class DNS
|
12
|
-
# DNS Name, defined as a suite of labels. A label is of type
|
12
|
+
# DNS Name, defined as a suite of labels. A label is of type +BinStruct::IntString+.
|
13
13
|
# @author Sylvain Daubert
|
14
|
-
|
14
|
+
# @author LemonTree55
|
15
|
+
class Name < BinStruct::Array
|
15
16
|
# Mask to decode a pointer on another label
|
16
17
|
POINTER_MASK = 0xc000
|
17
18
|
|
19
|
+
# DNS message to which this name is attached. Used to decode compressed names
|
18
20
|
# @return [DNS]
|
19
21
|
attr_accessor :dns
|
20
22
|
|
21
|
-
|
23
|
+
# @param [Hash] options
|
24
|
+
# @option options [DNS] :dns
|
25
|
+
def initialize(options={})
|
26
|
+
@dns = options.delete(:dns)
|
22
27
|
super
|
23
28
|
@pointer = nil
|
24
29
|
@pointer_name = nil
|
25
30
|
end
|
26
31
|
|
27
32
|
# @!method push(label)
|
28
|
-
# @param [
|
33
|
+
# @param [BinStruct::IntString] label
|
29
34
|
# @return [Name] self
|
30
35
|
# @!method <<(label)
|
31
|
-
# @param [
|
36
|
+
# @param [BinStruct::IntString] label
|
32
37
|
# @return [Name] self
|
33
38
|
|
34
39
|
# Read a set of labels form a dotted string
|
@@ -39,38 +44,38 @@ module PacketGen
|
|
39
44
|
return self if str.nil?
|
40
45
|
|
41
46
|
str.split('.').each do |label|
|
42
|
-
self <<
|
47
|
+
self << BinStruct::IntString.new(value: label)
|
43
48
|
end
|
44
|
-
self <<
|
49
|
+
self << BinStruct::IntString.new
|
45
50
|
end
|
46
51
|
|
47
52
|
# Clear name
|
48
|
-
#
|
53
|
+
# @return [void]
|
49
54
|
def clear
|
50
55
|
super
|
51
56
|
@pointer = nil
|
52
57
|
@pointer_name = nil
|
53
58
|
end
|
54
59
|
|
55
|
-
# Read a sequence of label from a string
|
60
|
+
# Read a sequence of label from a binary string
|
56
61
|
# @param [String] str binary string
|
57
62
|
# @return [Name] self
|
58
63
|
def read(str)
|
59
64
|
clear
|
60
65
|
return self if str.nil?
|
61
66
|
|
62
|
-
|
67
|
+
strb = str.to_s.b
|
63
68
|
start = 0
|
64
69
|
loop do
|
65
|
-
index =
|
66
|
-
if pointer?
|
70
|
+
index = strb[start, 2].unpack1('n')
|
71
|
+
if pointer?(index)
|
67
72
|
# Pointer on another label
|
68
|
-
@pointer =
|
73
|
+
@pointer = strb[start, 2]
|
69
74
|
break
|
70
75
|
else
|
71
|
-
label = add_label_from(
|
76
|
+
label = add_label_from(strb[start..])
|
72
77
|
start += label.sz
|
73
|
-
break if label.empty? ||
|
78
|
+
break if label.empty? || strb[start..].empty?
|
74
79
|
end
|
75
80
|
end
|
76
81
|
# force resolution of compressed names
|
@@ -119,7 +124,7 @@ module PacketGen
|
|
119
124
|
end
|
120
125
|
|
121
126
|
def add_label_from(str)
|
122
|
-
label =
|
127
|
+
label = BinStruct::IntString.new
|
123
128
|
label.read(str)
|
124
129
|
self << label
|
125
130
|
label
|
@@ -15,12 +15,13 @@ module PacketGen
|
|
15
15
|
#
|
16
16
|
# a OPT record may contain zero or more {Option options} in its {#rdata}.
|
17
17
|
# @author Sylvain Daubert
|
18
|
+
# @author LemonTree55
|
18
19
|
# @since 1.3.0
|
19
20
|
# @since 3.1.1 {#options} is a {ArrayOfOptions}
|
20
21
|
class OPT < RR
|
21
22
|
# @!attribute options
|
22
23
|
# @return [ArrayOfOptions]
|
23
|
-
|
24
|
+
define_attr_after :rdata, :options, ArrayOfOptions
|
24
25
|
|
25
26
|
# @param [DNS] dns
|
26
27
|
# @param [Hash] options
|
@@ -94,7 +95,7 @@ module PacketGen
|
|
94
95
|
self[:ttl].value = self[:ttl].to_i & (0xffffffff & ~(1 << 15))
|
95
96
|
self[:ttl].value |= (b & 1) << 15
|
96
97
|
end
|
97
|
-
|
98
|
+
self[:ttl].to_i.anybits?(0x8000)
|
98
99
|
end
|
99
100
|
alias do? do=
|
100
101
|
|
@@ -118,11 +119,13 @@ module PacketGen
|
|
118
119
|
alias udp_size rrclass
|
119
120
|
alias udp_size= rrclass=
|
120
121
|
|
122
|
+
# Get human-readable string for flags
|
121
123
|
# @return [String]
|
122
124
|
def human_flags
|
123
125
|
do? ? 'do' : 'none'
|
124
126
|
end
|
125
127
|
|
128
|
+
# Get human-readable string for this OPT
|
126
129
|
# @return [String]
|
127
130
|
def to_human
|
128
131
|
"#{name} #{human_type} UDPsize:#{udp_size} " \
|
@@ -11,28 +11,28 @@ module PacketGen
|
|
11
11
|
class DNS
|
12
12
|
# @!parse
|
13
13
|
# # DNS option is a TLV object:
|
14
|
-
# # * {#code} is a
|
15
|
-
# # *
|
16
|
-
# # * {#data} is a
|
14
|
+
# # * {#code} is a BinStruct::Int16,
|
15
|
+
# # * +#length+ is a BinStruct::Int16,
|
16
|
+
# # * {#data} is a BinStruct::String.
|
17
17
|
# #
|
18
18
|
# # @since 1.3.0
|
19
|
-
# # @since 3.1.0 defined with
|
20
|
-
# # @!parse class Option <
|
19
|
+
# # @since 3.1.0 defined with BinStruct::AbstractTLV
|
20
|
+
# # @!parse class Option < BinStruct::AbstractTLV; end
|
21
21
|
# # @!attribute code
|
22
|
-
# # Alias for
|
22
|
+
# # Alias for +#type+
|
23
23
|
# # @return [Integer]
|
24
24
|
# # @!attribute data
|
25
|
-
# # Alias for
|
26
|
-
# # @return [
|
27
|
-
# class Option <
|
25
|
+
# # Alias for +#value+
|
26
|
+
# # @return [BinStruct::String]
|
27
|
+
# class Option < BinStruct::AbstractTLV; end
|
28
28
|
# @private
|
29
|
-
Option =
|
30
|
-
|
31
|
-
|
29
|
+
Option = BinStruct::AbstractTLV.create(type_class: BinStruct::Int16,
|
30
|
+
length_class: BinStruct::Int16,
|
31
|
+
aliases: { code: :type, data: :value })
|
32
32
|
|
33
|
-
# Array of {Option}.
|
33
|
+
# Array of {Option}s.
|
34
34
|
# @since 3.1.1
|
35
|
-
class ArrayOfOptions <
|
35
|
+
class ArrayOfOptions < BinStruct::Array
|
36
36
|
set_of Option
|
37
37
|
end
|
38
38
|
end
|
@@ -25,18 +25,18 @@ module PacketGen
|
|
25
25
|
# @param [Question] q
|
26
26
|
# @return [Question]
|
27
27
|
|
28
|
-
# Read Question section from a string
|
28
|
+
# Read Question section from a binary string
|
29
29
|
# @param [String] str binary string
|
30
30
|
# @return [QDSection] self
|
31
31
|
def read(str)
|
32
32
|
clear
|
33
33
|
return self if str.nil?
|
34
34
|
|
35
|
-
|
35
|
+
str = str.b unless str.encoding == Encoding::ASCII_8BIT
|
36
36
|
while !str.empty? && (self.size < @counter.to_i)
|
37
37
|
question = Question.new(@dns).read(str)
|
38
38
|
str.slice!(0, question.sz)
|
39
|
-
push
|
39
|
+
push(question)
|
40
40
|
end
|
41
41
|
self
|
42
42
|
end
|
@@ -11,8 +11,8 @@ module PacketGen
|
|
11
11
|
class DNS
|
12
12
|
# DNS Question
|
13
13
|
# @author Sylvain Daubert
|
14
|
-
class Question <
|
15
|
-
include
|
14
|
+
class Question < BinStruct::Struct
|
15
|
+
include BinStruct::Structable
|
16
16
|
|
17
17
|
# Ressource Record types
|
18
18
|
TYPES = {
|
@@ -59,15 +59,15 @@ module PacketGen
|
|
59
59
|
# @!attribute name
|
60
60
|
# Question domain name
|
61
61
|
# @return [String]
|
62
|
-
|
62
|
+
define_attr :name, Name, default: '.'
|
63
63
|
# @!attribute type
|
64
64
|
# 16-bit question type
|
65
65
|
# @return [Integer]
|
66
|
-
|
66
|
+
define_attr :type, BinStruct::Int16Enum, default: 1, enum: TYPES
|
67
67
|
# @!attribute rrclass
|
68
68
|
# 16-bit question class
|
69
69
|
# @return [Integer]
|
70
|
-
|
70
|
+
define_attr :rrclass, BinStruct::Int16Enum, default: 1, enum: CLASSES
|
71
71
|
|
72
72
|
# @param [DNS] dns
|
73
73
|
# @param [Hash] options
|
@@ -77,8 +77,6 @@ module PacketGen
|
|
77
77
|
def initialize(dns, options={})
|
78
78
|
super(options)
|
79
79
|
self[:name].dns = dns
|
80
|
-
self.type = options[:type] if options[:type]
|
81
|
-
self.rrclass = options[:rrclass] if options[:rrclass]
|
82
80
|
end
|
83
81
|
|
84
82
|
undef rrclass=
|
@@ -95,7 +93,7 @@ module PacketGen
|
|
95
93
|
end
|
96
94
|
raise ArgumentError, "unknown class #{val.inspect}" unless v
|
97
95
|
|
98
|
-
self[:rrclass].
|
96
|
+
self[:rrclass].from_human(v)
|
99
97
|
end
|
100
98
|
|
101
99
|
# Check type
|
@@ -122,6 +120,7 @@ module PacketGen
|
|
122
120
|
end
|
123
121
|
end
|
124
122
|
|
123
|
+
# Human-readable string for this question
|
125
124
|
# @return [String]
|
126
125
|
def to_human
|
127
126
|
if self[:name].dns.is_a? MDNS
|