packetgen 1.4.3 → 2.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.
@@ -44,6 +44,12 @@ module PacketGen
44
44
  # == Save packets to a file
45
45
  # Packet.write 'file.pcapng', packets
46
46
  #
47
+ # @since 2.0.0
48
+ #
49
+ # Packet accessor has changed. When header class is in a namespace
50
+ # (for example Dot11::* header classes), to avoid clashes in names, such
51
+ # accessors are named +namespace_class+. For example {Header::Dot11::Data}
52
+ # header is now accessed through +Packet#dot11_data+ and nor more +Packet#data+).
47
53
  # @author Sylvain Daubert
48
54
  class Packet
49
55
  # @return [Array<Header::Base]
@@ -216,10 +222,15 @@ module PacketGen
216
222
 
217
223
  # Encapulate another packet in +self+
218
224
  # @param [Packet] other
225
+ # @param [Boolean] parsing set to +true+ to not update last current header field
226
+ # from binding with first other's one. Use only when current heade field as
227
+ # its value set accordingly.
219
228
  # @return [self] +self+ with new headers from +other+
220
229
  # @since 1.1.0
221
- def encapsulate(other)
222
- other.headers.each { |h| add_header h }
230
+ def encapsulate(other, parsing: false)
231
+ other.headers.each_with_index do |h, i|
232
+ add_header h, parsing: (i > 0) || parsing
233
+ end
223
234
  end
224
235
 
225
236
  # Remove headers from +self+
@@ -327,19 +338,19 @@ module PacketGen
327
338
  # Add a header to packet
328
339
  # @param [Header::Base] header
329
340
  # @param [Header::Base] previous_header
341
+ # @param [Boolean] parsing
330
342
  # @return [void]
331
343
  def add_header(header, previous_header: nil, parsing: false)
332
- protocol = header.protocol_name
333
344
  prev_header = previous_header || @headers.last
334
345
  if prev_header
335
346
  bindings = prev_header.class.known_headers[header.class]
336
347
  if bindings.nil?
337
348
  bindings = prev_header.class.known_headers[header.class.superclass]
338
349
  if bindings.nil?
339
- msg = "#{prev_header.class} knowns no layer association with #{protocol}. "
340
- msg << "Try #{prev_header.class}.bind_layer(PacketGen::Header::#{protocol}, "
341
- msg << "#{prev_header.protocol_name.downcase}_proto_field: "
342
- msg << "value_for_#{protocol.downcase})"
350
+ msg = "#{prev_header.class} knowns no layer association with #{header.protocol_name}. "
351
+ msg << "Try #{prev_header.class}.bind_layer(#{header.class}, "
352
+ msg << "#{prev_header.method_name}_proto_field: "
353
+ msg << "value_for_#{header.method_name})"
343
354
  raise ArgumentError, msg
344
355
  end
345
356
  end
@@ -348,8 +359,8 @@ module PacketGen
348
359
  end
349
360
  header.packet = self
350
361
  @headers << header unless previous_header
351
- unless respond_to? protocol.downcase
352
- self.class.class_eval "def #{protocol.downcase}(arg=nil);" \
362
+ unless respond_to? header.method_name
363
+ self.class.class_eval "def #{header.method_name}(arg=nil);" \
353
364
  "header(#{header.class}, arg); end"
354
365
  end
355
366
  end
@@ -375,11 +386,14 @@ module PacketGen
375
386
  decode_packet_bottom_up = true
376
387
  while decode_packet_bottom_up do
377
388
  last_known_hdr = @headers.last
389
+ break unless last_known_hdr.respond_to? :body
390
+ break if last_known_hdr.body.empty?
378
391
  search_header(last_known_hdr) do |nh|
379
392
  str = last_known_hdr.body
380
393
  nheader = nh.new
381
394
  nheader = nheader.read(str)
382
395
  add_header nheader, parsing: true
396
+ nheader.dissect if nheader.respond_to? :dissect
383
397
  end
384
398
  decode_packet_bottom_up = (@headers.last != last_known_hdr)
385
399
  end
@@ -187,13 +187,21 @@ module PacketGen
187
187
  end
188
188
  end
189
189
 
190
+ # Delete a previously defined field
191
+ # @param [Symbol] name
192
+ # @return [void]
193
+ def self.delete_field(name)
194
+ @ordered_fields.delete name
195
+ @field_defs.delete name
196
+ end
197
+
190
198
  # Define a bitfield on given attribute
191
199
  # class MyHeader < PacketGen::Types::Fields
192
200
  # define_field :flags, Types::Int16
193
201
  # # define a bit field on :flag attribute:
194
202
  # # flag1, flag2 and flag3 are 1-bit fields
195
203
  # # type and stype are 3-bit fields. reserved is a 6-bit field
196
- # define_bit_fields_on :flags, :flag1, :flag2, :flag3, :type, 3, :stype, 3, :reserved: 7
204
+ # define_bit_fields_on :flags, :flag1, :flag2, :flag3, :type, 3, :stype, 3, :reserved, 7
197
205
  # end
198
206
  # A bitfield of size 1 bit defines 2 methods:
199
207
  # * +#field?+ which returns a Boolean,
@@ -340,9 +348,9 @@ module PacketGen
340
348
  # @return [String]
341
349
  def inspect
342
350
  str = Inspect.dashed_line(self.class, 2)
343
- @fields.each do |attr, value|
351
+ fields.each do |attr|
344
352
  next if attr == :body
345
- str << Inspect.inspect_attribute(attr, value, 2)
353
+ str << Inspect.inspect_attribute(attr, self[attr], 2)
346
354
  end
347
355
  str
348
356
  end
@@ -8,5 +8,5 @@
8
8
  # @author Sylvain Daubert
9
9
  module PacketGen
10
10
  # PacketGen version
11
- VERSION = "1.4.3"
11
+ VERSION = "2.0.0"
12
12
  end
data/packetgen.gemspec CHANGED
@@ -25,6 +25,8 @@ Gem::Specification.new do |spec|
25
25
  spec.add_dependency 'pcaprub', '~>0.12.4'
26
26
  spec.add_dependency 'pry', '~>0.10'
27
27
  spec.add_dependency 'network_interface'
28
+ spec.add_dependency 'net-proto', '~>1.2'
29
+ spec.add_dependency 'rasn1', '~>0.3', '>= 0.3.1'
28
30
 
29
31
  spec.add_development_dependency 'bundler', '~> 1.7'
30
32
  spec.add_development_dependency 'rake', '~> 10.0'
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: 1.4.3
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sylvain Daubert
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-04 00:00:00.000000000 Z
11
+ date: 2017-08-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pcaprub
@@ -52,6 +52,40 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: net-proto
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.2'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.2'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rasn1
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.3'
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: 0.3.1
79
+ type: :runtime
80
+ prerelease: false
81
+ version_requirements: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - "~>"
84
+ - !ruby/object:Gem::Version
85
+ version: '0.3'
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: 0.3.1
55
89
  - !ruby/object:Gem::Dependency
56
90
  name: bundler
57
91
  requirement: !ruby/object:Gem::Requirement
@@ -142,7 +176,9 @@ files:
142
176
  - lib/packetgen/config.rb
143
177
  - lib/packetgen/header.rb
144
178
  - lib/packetgen/header/arp.rb
179
+ - lib/packetgen/header/asn1_base.rb
145
180
  - lib/packetgen/header/base.rb
181
+ - lib/packetgen/header/crypto.rb
146
182
  - lib/packetgen/header/dns.rb
147
183
  - lib/packetgen/header/dns/name.rb
148
184
  - lib/packetgen/header/dns/opt.rb
@@ -163,9 +199,23 @@ files:
163
199
  - lib/packetgen/header/eth.rb
164
200
  - lib/packetgen/header/icmp.rb
165
201
  - lib/packetgen/header/icmpv6.rb
202
+ - lib/packetgen/header/ike.rb
203
+ - lib/packetgen/header/ike/auth.rb
204
+ - lib/packetgen/header/ike/cert.rb
205
+ - lib/packetgen/header/ike/certreq.rb
206
+ - lib/packetgen/header/ike/id.rb
207
+ - lib/packetgen/header/ike/ke.rb
208
+ - lib/packetgen/header/ike/nonce.rb
209
+ - lib/packetgen/header/ike/notify.rb
210
+ - lib/packetgen/header/ike/payload.rb
211
+ - lib/packetgen/header/ike/sa.rb
212
+ - lib/packetgen/header/ike/sk.rb
213
+ - lib/packetgen/header/ike/ts.rb
214
+ - lib/packetgen/header/ike/vendor_id.rb
166
215
  - lib/packetgen/header/ip.rb
167
216
  - lib/packetgen/header/ipv6.rb
168
217
  - lib/packetgen/header/llc.rb
218
+ - lib/packetgen/header/snmp.rb
169
219
  - lib/packetgen/header/tcp.rb
170
220
  - lib/packetgen/header/tcp/option.rb
171
221
  - lib/packetgen/header/tcp/options.rb