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.
Files changed (128) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +38 -22
  3. data/lib/packetgen/capture.rb +2 -2
  4. data/lib/packetgen/config.rb +0 -1
  5. data/lib/packetgen/deprecation.rb +14 -8
  6. data/lib/packetgen/header/arp.rb +17 -18
  7. data/lib/packetgen/header/asn1_base.rb +2 -1
  8. data/lib/packetgen/header/base.rb +42 -40
  9. data/lib/packetgen/header/bootp.rb +35 -37
  10. data/lib/packetgen/header/dhcp/option.rb +21 -21
  11. data/lib/packetgen/header/dhcp/options.rb +3 -3
  12. data/lib/packetgen/header/dhcp.rb +8 -9
  13. data/lib/packetgen/header/dhcpv6/duid.rb +16 -16
  14. data/lib/packetgen/header/dhcpv6/option.rb +83 -61
  15. data/lib/packetgen/header/dhcpv6/options.rb +4 -4
  16. data/lib/packetgen/header/dhcpv6/relay.rb +6 -5
  17. data/lib/packetgen/header/dhcpv6.rb +17 -18
  18. data/lib/packetgen/header/dns/name.rb +21 -16
  19. data/lib/packetgen/header/dns/opt.rb +5 -2
  20. data/lib/packetgen/header/dns/option.rb +14 -14
  21. data/lib/packetgen/header/dns/qdsection.rb +3 -3
  22. data/lib/packetgen/header/dns/question.rb +7 -8
  23. data/lib/packetgen/header/dns/rr.rb +56 -43
  24. data/lib/packetgen/header/dns/rrsection.rb +6 -6
  25. data/lib/packetgen/header/dns.rb +103 -90
  26. data/lib/packetgen/header/dot11/control.rb +12 -12
  27. data/lib/packetgen/header/dot11/data.rb +25 -24
  28. data/lib/packetgen/header/dot11/element.rb +4 -4
  29. data/lib/packetgen/header/dot11/management.rb +21 -18
  30. data/lib/packetgen/header/dot11/sub_mngt.rb +40 -53
  31. data/lib/packetgen/header/dot11.rb +117 -122
  32. data/lib/packetgen/header/dot1q.rb +12 -13
  33. data/lib/packetgen/header/dot1x.rb +13 -13
  34. data/lib/packetgen/header/eap/fast.rb +4 -4
  35. data/lib/packetgen/header/eap/md5.rb +16 -8
  36. data/lib/packetgen/header/eap/tls.rb +18 -19
  37. data/lib/packetgen/header/eap/ttls.rb +22 -21
  38. data/lib/packetgen/header/eap.rb +73 -48
  39. data/lib/packetgen/header/eth.rb +41 -27
  40. data/lib/packetgen/header/gre.rb +33 -11
  41. data/lib/packetgen/header/http/headers.rb +7 -6
  42. data/lib/packetgen/header/http/request.rb +38 -29
  43. data/lib/packetgen/header/http/response.rb +35 -27
  44. data/lib/packetgen/header/http/verbs.rb +1 -3
  45. data/lib/packetgen/header/icmp.rb +14 -14
  46. data/lib/packetgen/header/icmpv6.rb +10 -9
  47. data/lib/packetgen/header/igmp.rb +26 -15
  48. data/lib/packetgen/header/igmpv3/group_record.rb +18 -13
  49. data/lib/packetgen/header/igmpv3/mq.rb +16 -18
  50. data/lib/packetgen/header/igmpv3/mr.rb +5 -5
  51. data/lib/packetgen/header/igmpv3.rb +12 -11
  52. data/lib/packetgen/header/ip/addr.rb +19 -15
  53. data/lib/packetgen/header/ip/option.rb +47 -36
  54. data/lib/packetgen/header/ip/options.rb +1 -1
  55. data/lib/packetgen/header/ip.rb +77 -95
  56. data/lib/packetgen/header/ipv6/addr.rb +28 -27
  57. data/lib/packetgen/header/ipv6/extension.rb +13 -11
  58. data/lib/packetgen/header/ipv6/hop_by_hop.rb +32 -13
  59. data/lib/packetgen/header/ipv6.rb +42 -35
  60. data/lib/packetgen/header/llc.rb +28 -21
  61. data/lib/packetgen/header/mdns.rb +10 -3
  62. data/lib/packetgen/header/mld.rb +15 -13
  63. data/lib/packetgen/header/mldv2/mcast_address_record.rb +17 -12
  64. data/lib/packetgen/header/mldv2/mlq.rb +22 -24
  65. data/lib/packetgen/header/mldv2/mlr.rb +8 -8
  66. data/lib/packetgen/header/mldv2.rb +1 -1
  67. data/lib/packetgen/header/ospfv2/db_description.rb +17 -18
  68. data/lib/packetgen/header/ospfv2/hello.rb +18 -17
  69. data/lib/packetgen/header/ospfv2/ls_ack.rb +6 -7
  70. data/lib/packetgen/header/ospfv2/ls_request.rb +14 -13
  71. data/lib/packetgen/header/ospfv2/ls_update.rb +9 -9
  72. data/lib/packetgen/header/ospfv2/lsa.rb +79 -60
  73. data/lib/packetgen/header/ospfv2/lsa_header.rb +12 -11
  74. data/lib/packetgen/header/ospfv2.rb +49 -46
  75. data/lib/packetgen/header/ospfv3/db_description.rb +20 -22
  76. data/lib/packetgen/header/ospfv3/hello.rb +17 -16
  77. data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +22 -20
  78. data/lib/packetgen/header/ospfv3/ls_ack.rb +7 -8
  79. data/lib/packetgen/header/ospfv3/ls_request.rb +18 -18
  80. data/lib/packetgen/header/ospfv3/ls_update.rb +10 -10
  81. data/lib/packetgen/header/ospfv3/lsa.rb +62 -51
  82. data/lib/packetgen/header/ospfv3/lsa_header.rb +12 -11
  83. data/lib/packetgen/header/ospfv3.rb +54 -52
  84. data/lib/packetgen/header/sctp/chunk.rb +80 -56
  85. data/lib/packetgen/header/sctp/error.rb +174 -202
  86. data/lib/packetgen/header/sctp/padded32.rb +3 -3
  87. data/lib/packetgen/header/sctp/parameter.rb +89 -136
  88. data/lib/packetgen/header/sctp.rb +19 -8
  89. data/lib/packetgen/header/snmp.rb +108 -7
  90. data/lib/packetgen/header/tcp/option.rb +52 -39
  91. data/lib/packetgen/header/tcp/options.rb +13 -5
  92. data/lib/packetgen/header/tcp.rb +83 -65
  93. data/lib/packetgen/header/tftp.rb +31 -25
  94. data/lib/packetgen/header/udp.rb +21 -19
  95. data/lib/packetgen/header.rb +23 -18
  96. data/lib/packetgen/headerable.rb +21 -5
  97. data/lib/packetgen/inspect.rb +3 -8
  98. data/lib/packetgen/packet.rb +146 -71
  99. data/lib/packetgen/pcap.rb +15 -4
  100. data/lib/packetgen/pcapng/block.rb +20 -18
  101. data/lib/packetgen/pcapng/epb.rb +13 -15
  102. data/lib/packetgen/pcapng/file.rb +44 -111
  103. data/lib/packetgen/pcapng/idb.rb +11 -12
  104. data/lib/packetgen/pcapng/shb.rb +15 -16
  105. data/lib/packetgen/pcapng/spb.rb +9 -11
  106. data/lib/packetgen/pcapng/unknown_block.rb +6 -17
  107. data/lib/packetgen/pcapng.rb +6 -4
  108. data/lib/packetgen/pcaprub_wrapper.rb +17 -1
  109. data/lib/packetgen/proto.rb +5 -1
  110. data/lib/packetgen/unknown_packet.rb +5 -5
  111. data/lib/packetgen/utils/arp_spoofer.rb +18 -19
  112. data/lib/packetgen/utils.rb +4 -3
  113. data/lib/packetgen/version.rb +1 -1
  114. data/lib/packetgen.rb +12 -5
  115. metadata +29 -38
  116. data/lib/packetgen/types/abstract_tlv.rb +0 -278
  117. data/lib/packetgen/types/array.rb +0 -287
  118. data/lib/packetgen/types/cstring.rb +0 -109
  119. data/lib/packetgen/types/enum.rb +0 -171
  120. data/lib/packetgen/types/fieldable.rb +0 -66
  121. data/lib/packetgen/types/fields.rb +0 -622
  122. data/lib/packetgen/types/int.rb +0 -473
  123. data/lib/packetgen/types/int_string.rb +0 -102
  124. data/lib/packetgen/types/length_from.rb +0 -54
  125. data/lib/packetgen/types/oui.rb +0 -52
  126. data/lib/packetgen/types/string.rb +0 -97
  127. data/lib/packetgen/types/tlv.rb +0 -161
  128. 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} ({Types::Int16}),
14
- # * a {#length} ({Types::Int16}),
15
- # * and a {#data} ({Types::String}).
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 < Types::Fields
21
- include Types::Fieldable
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
- define_field :type, Types::Int16
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
- define_field :length, Types::Int16
30
+ define_attr :length, BinStruct::Int16
31
+ # @!scope class
31
32
  # @!attribute data
32
33
  # variable length option data.
33
34
  # @return [String]
34
- define_field :data, Types::String,
35
- builder: ->(h, t) { t.new(length_from: h[:length]) }
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 :type
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 = +"#{human_type}:"
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
- update_field :type, default: 1
115
- remove_field :data
115
+ update_attr :type, default: 1
116
+ remove_attr :data
116
117
 
117
118
  # @!attribute duid
118
119
  # @return [DUID]
119
- define_field :duid, DUID
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
- update_field :type, default: 2
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
- update_field :type, default: 3
138
- remove_field :data
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
- define_field :iaid, Types::Int32
144
+ define_attr :iaid, BinStruct::Int32
144
145
  # @!attribute t1
145
146
  # 32-bit T1 field
146
147
  # @return [Integer]
147
- define_field :t1, Types::Int32
148
+ define_attr :t1, BinStruct::Int32
148
149
  # @!attribute t2
149
150
  # 32-bit T2 field
150
151
  # @return [Integer]
151
- define_field :t2, Types::Int32
152
+ define_attr :t2, BinStruct::Int32
152
153
  # @!attribute options
153
154
  # options field
154
155
  # @return [String]
155
- define_field :options, Types::String,
156
- builder: ->(h, t) { t.new length_from: -> { h[:length].to_i - 12 } }
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
- update_field :type, default: 4
169
- remove_field :data
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
- define_field :iaid, Types::Int32
175
+ define_attr :iaid, BinStruct::Int32
175
176
  # @!attribute options
176
177
  # options field
177
178
  # @return [String]
178
- define_field :options, Types::String,
179
- builder: ->(h, t) { t.new length_from: -> { h[:length].to_i - 4 } }
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
- update_field :type, default: 5
192
- remove_field :data
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
- define_field :ipv6, IPv6::Addr
198
+ define_attr :ipv6, IPv6::Addr
198
199
  # @attribute preferred_lifetime
199
200
  # 32-bit preferred lifetime
200
201
  # @return [Integer]
201
- define_field :preferred_lifetime, Types::Int32
202
+ define_attr :preferred_lifetime, BinStruct::Int32
202
203
  # @attribute valid_lifetime
203
204
  # 32-bit valid lifetime
204
205
  # @return [Integer]
205
- define_field :valid_lifetime, Types::Int32
206
+ define_attr :valid_lifetime, BinStruct::Int32
206
207
  # @!attribute options
207
208
  # options field
208
209
  # @return [String]
209
- define_field :options, Types::String,
210
- builder: ->(h, t) { t.new length_from: -> { h[:length].to_i - 24 } }
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
- update_field :type, default: 6
230
- remove_field :data
223
+ update_attr :type, default: 6
224
+ remove_attr :data
231
225
 
232
226
  # @!attribute options
233
- # @return [RequestedOptions]
234
- define_field :options, RequestedOptions, builder: ->(h, t) { t.new(length_from: h[:length]) }
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
- update_field :type, default: 7
247
- remove_field :data
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
- define_field :value, Types::Int8
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
- update_field :type, default: 8
265
- remove_field :data
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
- define_field :value, Types::Int16
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
- update_field :type, default: 9
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
- update_field :type, default: 12
289
- remove_field :data
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
- define_field :addr, IPv6::Addr
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 < ElapsedTime
306
- update_field :type, default: 13
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
- update_field :type, default: 14
313
- remove_field :data
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
- # == Add DHCPv6 options to an +Options+ instance
15
- # options = PacketGen::Header::DHCP::Options.new
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 < Types::Array
22
+ class Options < BinStruct::Array
23
23
  set_of DHCPv6::Option
24
24
 
25
- # Separator used in {#to_human}.
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
- define_field :msg_type, Types::Int8Enum, enum: MESSAGE_TYPES
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
- define_field :hop_count, Types::Int8
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
- define_field :link, IPv6::Addr
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
- define_field :peer, IPv6::Addr
39
+ define_attr :peer, IPv6::Addr
40
40
  # @!attribute options
41
+ # Set of {Option}s
41
42
  # @return [DHCPv6::Options]
42
- define_field :options, DHCPv6::Options
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 ({Types::Int8Enum}),
26
- # * a {#transaction_id} field ({Types::Int24}),
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
- # == Create a DHCPv6 header
29
+ # @example Create a DHCPv6 header
30
30
  # # standalone
31
- # dhcpv6 = PacketGen::Header::DHCPv6.new(msg_type: 'SOLLICIT')
32
- # # in a packet
33
- # pkt = PacketGen.gen('IPv6').add('DHCPv6', msg_type: 'SOLLICIT')
34
- # # access to DHCPv6 header from packet
35
- # pkt.dhcpv6 #=> PacketGen::Header::DHCPv6
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
- # Options may be added by pushing a hash to {#options}:
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
- define_field :msg_type, Types::Int8Enum, enum: MESSAGE_TYPES
73
+ define_attr :msg_type, BinStruct::Int8Enum, enum: MESSAGE_TYPES
76
74
  # @!attribute transaction_id
77
75
  # 24-bit transaction ID
78
- # @return [Integer]
79
- define_field :transaction_id, Types::Int24
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
- define_field :options, DHCPv6::Options
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 = Types::Int8.new.read(str)
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 {Types::IntString}.
12
+ # DNS Name, defined as a suite of labels. A label is of type +BinStruct::IntString+.
13
13
  # @author Sylvain Daubert
14
- class Name < Types::Array
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
- def initialize
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 [Types::IntString] label
33
+ # @param [BinStruct::IntString] label
29
34
  # @return [Name] self
30
35
  # @!method <<(label)
31
- # @param [Types::IntString] label
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 << Types::IntString.new(string: label)
47
+ self << BinStruct::IntString.new(value: label)
43
48
  end
44
- self << Types::IntString.new
49
+ self << BinStruct::IntString.new
45
50
  end
46
51
 
47
52
  # Clear name
48
- # @return [void]
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
- PacketGen.force_binary str
67
+ strb = str.to_s.b
63
68
  start = 0
64
69
  loop do
65
- index = str[start, 2].unpack1('n')
66
- if pointer? index
70
+ index = strb[start, 2].unpack1('n')
71
+ if pointer?(index)
67
72
  # Pointer on another label
68
- @pointer = str[start, 2]
73
+ @pointer = strb[start, 2]
69
74
  break
70
75
  else
71
- label = add_label_from(str[start..])
76
+ label = add_label_from(strb[start..])
72
77
  start += label.sz
73
- break if label.empty? || str[start..].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 = Types::IntString.new
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
- define_field_after :rdata, :options, ArrayOfOptions
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
- ((self[:ttl].to_i >> 15) & 1) == 1
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 {Types::Int16},
15
- # # * {#length} is a {Types::Int16},
16
- # # * {#data} is a {Types::String}.
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 {Types::AbstractTLV}
20
- # # @!parse class Option < Types::AbstractTLV; end
19
+ # # @since 3.1.0 defined with BinStruct::AbstractTLV
20
+ # # @!parse class Option < BinStruct::AbstractTLV; end
21
21
  # # @!attribute code
22
- # # Alias for {#type}
22
+ # # Alias for +#type+
23
23
  # # @return [Integer]
24
24
  # # @!attribute data
25
- # # Alias for {#value}
26
- # # @return [Types::String]
27
- # class Option < Types::AbstractTLV; end
25
+ # # Alias for +#value+
26
+ # # @return [BinStruct::String]
27
+ # class Option < BinStruct::AbstractTLV; end
28
28
  # @private
29
- Option = Types::AbstractTLV.create(type_class: Types::Int16,
30
- length_class: Types::Int16,
31
- aliases: { code: :type, data: :value })
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 < Types::Array
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
- PacketGen.force_binary str
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 question
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 < Types::Fields
15
- include Types::Fieldable
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
- define_field :name, Name, default: '.'
62
+ define_attr :name, Name, default: '.'
63
63
  # @!attribute type
64
64
  # 16-bit question type
65
65
  # @return [Integer]
66
- define_field :type, Types::Int16Enum, default: 1, enum: TYPES
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
- define_field :rrclass, Types::Int16Enum, default: 1, enum: CLASSES
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].read v
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