packetgen 2.6.0 → 2.7.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 (134) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +28 -0
  4. data/Rakefile +6 -6
  5. data/bin/pgconsole +6 -6
  6. data/lib/packetgen.rb +4 -3
  7. data/lib/packetgen/capture.rb +5 -7
  8. data/lib/packetgen/config.rb +3 -3
  9. data/lib/packetgen/deprecation.rb +17 -0
  10. data/lib/packetgen/header.rb +40 -38
  11. data/lib/packetgen/header/arp.rb +46 -31
  12. data/lib/packetgen/header/asn1_base.rb +8 -8
  13. data/lib/packetgen/header/base.rb +108 -36
  14. data/lib/packetgen/header/bootp.rb +28 -19
  15. data/lib/packetgen/header/crypto.rb +6 -8
  16. data/lib/packetgen/header/dhcp.rb +4 -5
  17. data/lib/packetgen/header/dhcp/option.rb +46 -34
  18. data/lib/packetgen/header/dhcp/options.rb +0 -1
  19. data/lib/packetgen/header/dhcpv6.rb +10 -10
  20. data/lib/packetgen/header/dhcpv6/duid.rb +2 -3
  21. data/lib/packetgen/header/dhcpv6/option.rb +16 -21
  22. data/lib/packetgen/header/dhcpv6/relay.rb +6 -4
  23. data/lib/packetgen/header/dns.rb +13 -11
  24. data/lib/packetgen/header/dns/name.rb +4 -6
  25. data/lib/packetgen/header/dns/opt.rb +31 -31
  26. data/lib/packetgen/header/dns/option.rb +0 -2
  27. data/lib/packetgen/header/dns/qdsection.rb +1 -2
  28. data/lib/packetgen/header/dns/question.rb +19 -13
  29. data/lib/packetgen/header/dns/rr.rb +11 -14
  30. data/lib/packetgen/header/dns/rrsection.rb +5 -7
  31. data/lib/packetgen/header/dot11.rb +45 -29
  32. data/lib/packetgen/header/dot11/control.rb +3 -5
  33. data/lib/packetgen/header/dot11/data.rb +34 -6
  34. data/lib/packetgen/header/dot11/element.rb +0 -1
  35. data/lib/packetgen/header/dot11/management.rb +9 -5
  36. data/lib/packetgen/header/dot11/sub_mngt.rb +13 -14
  37. data/lib/packetgen/header/dot1q.rb +2 -2
  38. data/lib/packetgen/header/dot1x.rb +3 -4
  39. data/lib/packetgen/header/eap.rb +62 -53
  40. data/lib/packetgen/header/eap/fast.rb +0 -1
  41. data/lib/packetgen/header/eap/md5.rb +1 -2
  42. data/lib/packetgen/header/eap/tls.rb +9 -10
  43. data/lib/packetgen/header/eap/ttls.rb +9 -10
  44. data/lib/packetgen/header/esp.rb +33 -33
  45. data/lib/packetgen/header/eth.rb +11 -8
  46. data/lib/packetgen/header/gre.rb +5 -6
  47. data/lib/packetgen/header/http/headers.rb +11 -14
  48. data/lib/packetgen/header/http/request.rb +20 -20
  49. data/lib/packetgen/header/http/response.rb +16 -18
  50. data/lib/packetgen/header/http/verbs.rb +5 -5
  51. data/lib/packetgen/header/icmp.rb +1 -3
  52. data/lib/packetgen/header/icmpv6.rb +1 -3
  53. data/lib/packetgen/header/igmp.rb +5 -6
  54. data/lib/packetgen/header/igmpv3.rb +5 -9
  55. data/lib/packetgen/header/igmpv3/group_record.rb +4 -5
  56. data/lib/packetgen/header/igmpv3/mq.rb +2 -2
  57. data/lib/packetgen/header/igmpv3/mr.rb +4 -3
  58. data/lib/packetgen/header/ike.rb +33 -8
  59. data/lib/packetgen/header/ike/auth.rb +4 -6
  60. data/lib/packetgen/header/ike/cert.rb +0 -2
  61. data/lib/packetgen/header/ike/certreq.rb +1 -3
  62. data/lib/packetgen/header/ike/id.rb +1 -3
  63. data/lib/packetgen/header/ike/ke.rb +0 -2
  64. data/lib/packetgen/header/ike/nonce.rb +0 -2
  65. data/lib/packetgen/header/ike/notify.rb +22 -24
  66. data/lib/packetgen/header/ike/payload.rb +198 -199
  67. data/lib/packetgen/header/ike/sa.rb +21 -30
  68. data/lib/packetgen/header/ike/sk.rb +16 -17
  69. data/lib/packetgen/header/ike/ts.rb +22 -24
  70. data/lib/packetgen/header/ike/vendor_id.rb +0 -2
  71. data/lib/packetgen/header/ip.rb +30 -23
  72. data/lib/packetgen/header/ip/addr.rb +5 -6
  73. data/lib/packetgen/header/ip/option.rb +11 -15
  74. data/lib/packetgen/header/ip/options.rb +1 -2
  75. data/lib/packetgen/header/ipv6.rb +27 -12
  76. data/lib/packetgen/header/ipv6/addr.rb +2 -2
  77. data/lib/packetgen/header/ipv6/extension.rb +1 -1
  78. data/lib/packetgen/header/ipv6/hop_by_hop.rb +11 -11
  79. data/lib/packetgen/header/llc.rb +4 -3
  80. data/lib/packetgen/header/mdns.rb +11 -5
  81. data/lib/packetgen/header/mld.rb +4 -4
  82. data/lib/packetgen/header/mldv2.rb +4 -3
  83. data/lib/packetgen/header/mldv2/mcast_address_record.rb +3 -4
  84. data/lib/packetgen/header/mldv2/mlq.rb +3 -4
  85. data/lib/packetgen/header/mldv2/mlr.rb +4 -3
  86. data/lib/packetgen/header/netbios.rb +18 -5
  87. data/lib/packetgen/header/ospfv2.rb +6 -7
  88. data/lib/packetgen/header/ospfv2/db_description.rb +3 -4
  89. data/lib/packetgen/header/ospfv2/hello.rb +2 -3
  90. data/lib/packetgen/header/ospfv2/ls_ack.rb +2 -3
  91. data/lib/packetgen/header/ospfv2/ls_request.rb +2 -3
  92. data/lib/packetgen/header/ospfv2/ls_update.rb +5 -6
  93. data/lib/packetgen/header/ospfv2/lsa.rb +13 -14
  94. data/lib/packetgen/header/ospfv2/lsa_header.rb +4 -5
  95. data/lib/packetgen/header/ospfv3.rb +3 -4
  96. data/lib/packetgen/header/ospfv3/db_description.rb +3 -5
  97. data/lib/packetgen/header/ospfv3/hello.rb +2 -3
  98. data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +7 -8
  99. data/lib/packetgen/header/ospfv3/ls_ack.rb +2 -3
  100. data/lib/packetgen/header/ospfv3/ls_request.rb +2 -3
  101. data/lib/packetgen/header/ospfv3/ls_update.rb +5 -6
  102. data/lib/packetgen/header/ospfv3/lsa.rb +10 -11
  103. data/lib/packetgen/header/ospfv3/lsa_header.rb +3 -4
  104. data/lib/packetgen/header/snmp.rb +45 -32
  105. data/lib/packetgen/header/tcp.rb +13 -9
  106. data/lib/packetgen/header/tcp/option.rb +16 -11
  107. data/lib/packetgen/header/tcp/options.rb +3 -4
  108. data/lib/packetgen/header/tftp.rb +15 -17
  109. data/lib/packetgen/header/udp.rb +10 -4
  110. data/lib/packetgen/inspect.rb +7 -9
  111. data/lib/packetgen/packet.rb +44 -22
  112. data/lib/packetgen/pcapng.rb +1 -5
  113. data/lib/packetgen/pcapng/block.rb +17 -11
  114. data/lib/packetgen/pcapng/epb.rb +6 -11
  115. data/lib/packetgen/pcapng/file.rb +37 -44
  116. data/lib/packetgen/pcapng/idb.rb +17 -22
  117. data/lib/packetgen/pcapng/shb.rb +7 -10
  118. data/lib/packetgen/pcapng/spb.rb +21 -17
  119. data/lib/packetgen/pcapng/unknown_block.rb +17 -13
  120. data/lib/packetgen/proto.rb +1 -2
  121. data/lib/packetgen/types/array.rb +119 -34
  122. data/lib/packetgen/types/cstring.rb +1 -5
  123. data/lib/packetgen/types/enum.rb +8 -10
  124. data/lib/packetgen/types/fields.rb +34 -28
  125. data/lib/packetgen/types/int.rb +11 -13
  126. data/lib/packetgen/types/int_string.rb +6 -8
  127. data/lib/packetgen/types/oui.rb +3 -6
  128. data/lib/packetgen/types/string.rb +4 -6
  129. data/lib/packetgen/types/tlv.rb +11 -14
  130. data/lib/packetgen/utils.rb +15 -23
  131. data/lib/packetgen/utils/arp_spoofer.rb +12 -18
  132. data/lib/packetgen/version.rb +1 -1
  133. data/packetgen.gemspec +9 -8
  134. metadata +19 -17
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: df09d9bda17671562435fd055b6ab552aa3e19798251f953e1e260786bae168d
4
- data.tar.gz: 79baa63b2cfa57534246b3806033dc6233ea9a2ae9da3c6aa0dc9dc803983d97
3
+ metadata.gz: 0c68cb5128a07a395378b28ecf7ab5711be938cbc5fb2807d42b7cb9a946ed5d
4
+ data.tar.gz: cb5d764d681dcda886a0fd2b5c3d852aa1eb477edb116286e8ac449e7170c5bd
5
5
  SHA512:
6
- metadata.gz: a6f3349f7d168b5b8391fa78e1ed90763295c7dc8db21bc0ee517195f96ca290172ad788c2c3fe4d2787809209fc502be4b05f00df6bc9f595709edf06136618
7
- data.tar.gz: d218ba23d8c02253d75bd18f1ea552ce3aee8490895c0886504f443d87f18bbd0ed7c3e0ca13bc30f7bcf4db5fbb7abe7e4c0630bfc1f5fd36b750faa130e56c
6
+ metadata.gz: de785e82d0bc1d5d1a00d6069a74e120fdd6323bd68ab1c06e285967e2d6ab6c32caec8a8079e393cd52076d81d7ab0ccbbb2522d4212264181a7c5033a8718a
7
+ data.tar.gz: fa91feb360719d3a10a7b984cc89c1cb1c842ec69b41121029f68b374e0a2db03f02ea50898b78fb1ce439dd0aed3a2e60635acb8242e71a01184faaece91c99
data/.gitignore CHANGED
@@ -8,5 +8,6 @@
8
8
  /spec/reports/
9
9
  /tmp/
10
10
  /vendor/
11
+ /.vscode/
11
12
  *~
12
13
  tags
@@ -0,0 +1,28 @@
1
+ Layout/SpaceAroundEqualsInParameterDefault:
2
+ EnforcedStyle: no_space
3
+ Lint/EmptyWhen:
4
+ Enabled: false
5
+ Lint/Void:
6
+ Enabled: false
7
+ Metrics:
8
+ Enabled: false
9
+ Style/AsciiComments:
10
+ Enabled: false
11
+ Style/Encoding:
12
+ Enabled: false
13
+ Style/EvalWithLocation:
14
+ Enabled: false
15
+ Style/FormatString:
16
+ EnforcedStyle: percent
17
+ Style/FormatStringToken:
18
+ EnforcedStyle: unannotated
19
+ Style/PerlBackrefs:
20
+ Enabled: false
21
+ Style/RedundantSelf:
22
+ Enabled: false
23
+ Style/StructInheritance:
24
+ Enabled: false
25
+ Style/TrailingCommaInArrayLiteral:
26
+ Enabled: false
27
+ Style/TrailingCommaInHashLiteral:
28
+ Enabled: false
data/Rakefile CHANGED
@@ -2,17 +2,17 @@ require 'bundler/gem_tasks'
2
2
  require 'rspec/core/rake_task'
3
3
  require 'yard'
4
4
 
5
- task :default => :spec
5
+ task default: :spec
6
6
 
7
7
  RSpec::Core::RakeTask.new do |t|
8
8
  t.rspec_opts = '-t ~sudo'
9
9
  end
10
10
  RSpec::Core::RakeTask.new('spec:sudo') do |t|
11
- if ENV['TRAVIS']
12
- t.rspec_opts = '-t sudo -t ~notravis'
13
- else
14
- t.rspec_opts = '-t sudo'
15
- end
11
+ t.rspec_opts = if ENV['TRAVIS']
12
+ '-t sudo -t ~notravis'
13
+ else
14
+ '-t sudo'
15
+ end
16
16
  end
17
17
 
18
18
  YARD::Rake::YardocTask.new do |t|
@@ -8,7 +8,7 @@ use_pry = false
8
8
  begin
9
9
  require 'pry'
10
10
  use_pry = true
11
- puts "use Pry!"
11
+ puts 'use Pry!'
12
12
  rescue LoadError
13
13
  require 'irb'
14
14
  require 'irb/completion'
@@ -29,7 +29,7 @@ class PgConsole
29
29
  Utils.singleton_methods.each do |m|
30
30
  define_method m, Utils.method(m).to_proc
31
31
  end
32
-
32
+
33
33
  def get_binding
34
34
  binding
35
35
  end
@@ -57,11 +57,11 @@ else
57
57
  irb = IRB::Irb.new(IRB::WorkSpace.new(PgConsole.new.get_binding))
58
58
  IRB.conf[:MAIN_CONTEXT] = irb.context
59
59
  irb.context.auto_indent_mode = true
60
- irb.context.prompt_i = "pg> "
61
- irb.context.prompt_s = "pg* "
62
- irb.context.prompt_c = "pg* "
60
+ irb.context.prompt_i = 'pg> '
61
+ irb.context.prompt_s = 'pg* '
62
+ irb.context.prompt_c = 'pg* '
63
63
 
64
- trap("SIGINT") do
64
+ trap('SIGINT') do
65
65
  irb.signal_handle
66
66
  end
67
67
 
@@ -5,12 +5,12 @@
5
5
  # This program is published under MIT license.
6
6
 
7
7
  # frozen_string_literal: true
8
+
8
9
  require 'packetgen/version'
9
10
 
10
11
  # PacketGen is a network packet generator and analyzor.
11
12
  # @author Sylvain Daubert
12
13
  module PacketGen
13
-
14
14
  # Base exception class for PacketGen exceptions
15
15
  class Error < StandardError; end
16
16
 
@@ -75,15 +75,16 @@ module PacketGen
75
75
  return @default_iface if @default_iface
76
76
 
77
77
  ipaddr = `ip addr`.split("\n")
78
- @default_iface = ipaddr.each_with_index do |line, i|
78
+ @default_iface = ipaddr.each do |line|
79
79
  m = line.match(/^\d+: (\w+\d+):/)
80
80
  next if m.nil?
81
- next if m[1] == 'lo'
81
+ next if m[1].start_with? 'lo'
82
82
  break m[1]
83
83
  end
84
84
  end
85
85
  end
86
86
 
87
+ require 'packetgen/deprecation'
87
88
  require 'packetgen/types'
88
89
  require 'packetgen/inspect'
89
90
  require 'packetgen/pcapng'
@@ -8,12 +8,10 @@
8
8
  require 'interfacez'
9
9
 
10
10
  module PacketGen
11
-
12
11
  # Capture packets from wire
13
12
  # @author Sylvain Daubert
14
13
  # @author Kent 'picat' Gruber
15
14
  class Capture
16
-
17
15
  # Default snaplen to use if :snaplen option not defined.
18
16
  DEFAULT_SNAPLEN = 0xffff
19
17
 
@@ -69,10 +67,10 @@ module PacketGen
69
67
  packet = Packet.parse(packet_data)
70
68
  @packets << packet
71
69
  yield packet if block_given?
72
- else
73
- yield packet_data if block_given?
70
+ elsif block_given?
71
+ yield packet_data
74
72
  end
75
- break if @max and @raw_packets.size >= @max
73
+ break if @max && @raw_packets.size >= @max
76
74
  end
77
75
  end
78
76
  @cap_thread.join(@timeout)
@@ -93,9 +91,9 @@ module PacketGen
93
91
  @max = options[:max] if options[:max]
94
92
  @filter = options[:filter] if options[:filter]
95
93
  @timeout = options[:timeout] if options[:timeout]
96
- @promisc = options[:promisc] if options.has_key? :promisc
94
+ @promisc = options[:promisc] if options.key? :promisc
97
95
  @snaplen = options[:snaplen] if options[:snaplen]
98
- @parse = options[:parse] if options.has_key? :parse
96
+ @parse = options[:parse] if options.key? :parse
99
97
  @iface = options[:iface] if options[:iface]
100
98
  end
101
99
 
@@ -4,12 +4,12 @@
4
4
  # This program is published under MIT license.
5
5
 
6
6
  # frozen_string_literal: true
7
+
7
8
  require 'socket'
8
9
  require 'singleton'
9
10
  require 'interfacez'
10
11
 
11
12
  module PacketGen
12
-
13
13
  # Config class to provide +config+ object to pgconsole
14
14
  # @author Sylvain Daubert
15
15
  # @author Kent 'picat' Gruber
@@ -41,14 +41,14 @@ module PacketGen
41
41
  def hwaddr(iface=nil)
42
42
  @hwaddr[iface || @default_iface]
43
43
  end
44
-
44
+
45
45
  # Get IP address for given network interface
46
46
  # @param [String,nil] iface network interface. If +nil+, use default one.
47
47
  # @return [String]
48
48
  def ipaddr(iface=nil)
49
49
  @ipaddr[iface || @default_iface]
50
50
  end
51
-
51
+
52
52
  # Get IPv6 addresses for given network interface
53
53
  # @param [String,nil] iface network interface. If +nil+, use default one.
54
54
  # @return [Array<String>]
@@ -0,0 +1,17 @@
1
+ module PacketGen
2
+ # Deprecation module
3
+ # @since 2.7.0
4
+ # @author Sylvain Daubert
5
+ # @api private
6
+ module Deprecation
7
+ def self.deprecated(klass, deprecated_method, new_method, klass_method: false, remove_version: '3.0.0')
8
+ separator = klass_method ? '.' : '#'
9
+ base_name = klass.to_s + separator
10
+ complete_deprecated_method_name = base_name + deprecated_method.to_s
11
+ complete_new_method_name = base_name + new_method.to_s
12
+
13
+ warn "#{complete_deprecated_method_name} is deprecated in favor of #{complete_new_method_name}. " \
14
+ "It will be remove in PacketGen #{remove_version}."
15
+ end
16
+ end
17
+ end
@@ -13,8 +13,8 @@ module PacketGen
13
13
  # First, define the new header class. By example:
14
14
  # module MyModule
15
15
  # class MyHeader < PacketGen::Header::Base
16
- # define_field :field1, PacketGen::Types::Int32
17
- # define_field :field2, PacketGen::Types::Int32
16
+ # define_field :field1, PacketGen::Types::Int32
17
+ # define_field :field2, PacketGen::Types::Int32
18
18
  # end
19
19
  # end
20
20
  # Then, class must be declared to PacketGen:
@@ -27,7 +27,6 @@ module PacketGen
27
27
  # pkt.myheader.field2.read 0x01
28
28
  # @author Sylvain Daubert
29
29
  module Header
30
-
31
30
  # @private snap length for PCAPRUB
32
31
  PCAP_SNAPLEN = 0xffff
33
32
  # @private promiscuous (or not) for PCAPRUB
@@ -37,44 +36,47 @@ module PacketGen
37
36
 
38
37
  @added_header_classes = {}
39
38
 
40
- # Get known header classes
41
- # @return [Array<Class>]
42
- def self.all
43
- return @header_classes if @header_classes
44
- @header_classes = @added_header_classes.values
45
- end
39
+ class << self
40
+ # List all available headers.
41
+ # @return [Array<Class>]
42
+ def all
43
+ return @header_classes if @header_classes
44
+ @header_classes = @added_header_classes.values
45
+ end
46
+ alias list all
46
47
 
47
- # Add a foreign header class to known header classes. This is
48
- # needed by {Packet.gen} and {Packet#add}.
49
- # @param [Class] klass a header class
50
- # @return [void]
51
- # @since 1.1.0
52
- def self.add_class(klass)
53
- protocol_name = klass.new.protocol_name
54
- @added_header_classes[protocol_name] = klass
55
- @header_classes = nil
56
- end
48
+ # Add a foreign header class to known header classes. This is
49
+ # needed by {Packet.gen} and {Packet#add}.
50
+ # @param [Class] klass a header class
51
+ # @return [void]
52
+ # @since 1.1.0
53
+ def add_class(klass)
54
+ protocol_name = klass.new.protocol_name
55
+ @added_header_classes[protocol_name] = klass
56
+ @header_classes = nil
57
+ end
57
58
 
58
- # Remove a foreign header (previously added by {.add_header_class}
59
- # from known header classes.
60
- # @param [Class] klass
61
- # @return [void]
62
- # @since 1.1.0
63
- def self.remove_class(klass)
64
- protocol_name = klass.new.protocol_name
65
- @added_header_classes.delete protocol_name
66
- @header_classes = nil
67
- end
59
+ # Remove a foreign header (previously added by {.add_header_class}
60
+ # from known header classes.
61
+ # @param [Class] klass
62
+ # @return [void]
63
+ # @since 1.1.0
64
+ def remove_class(klass)
65
+ protocol_name = klass.new.protocol_name
66
+ @added_header_classes.delete protocol_name
67
+ @header_classes = nil
68
+ end
68
69
 
69
- # Get header class from its name
70
- # @param [String] name
71
- # @return [Class,nil]
72
- # @since 1.1.0
73
- def self.get_header_class_by_name(name)
74
- if Header.const_defined? name
75
- Header.const_get name
76
- else
77
- @added_header_classes[name]
70
+ # Get header class from its name
71
+ # @param [String] name
72
+ # @return [Class,nil]
73
+ # @since 1.1.0
74
+ def get_header_class_by_name(name)
75
+ if Header.const_defined? name
76
+ Header.const_get name
77
+ else
78
+ @added_header_classes[name]
79
+ end
78
80
  end
79
81
  end
80
82
  end
@@ -7,7 +7,6 @@
7
7
 
8
8
  module PacketGen
9
9
  module Header
10
-
11
10
  # An ARP header consists of:
12
11
  # * a hardware type ({#hrd} or {#htype}) field ({Types::Int16}),
13
12
  # * a protocol type ({#pro} or {#ptype}) field (+Int16+),
@@ -30,7 +29,6 @@ module PacketGen
30
29
  #
31
30
  # @author Sylvain Daubert
32
31
  class ARP < Base
33
-
34
32
  # @!attribute hrd
35
33
  # 16-bit hardware protocol type
36
34
  # # @return [Integer]
@@ -83,41 +81,58 @@ module PacketGen
83
81
  # @option options [String] :tha target hardware address
84
82
  # @option options [String] :tpa targetr internet address
85
83
  def initialize(options={})
86
- options[:hrd] ||= options[:htype]
87
- options[:pro] ||= options[:ptype]
88
- options[:hln] ||= options[:hlen]
89
- options[:pln] ||= options[:plen]
90
- options[:op] ||= options[:opcode]
91
- options[:sha] ||= options[:src_mac]
92
- options[:spa] ||= options[:src_ip]
93
- options[:tha] ||= options[:dst_mac]
84
+ options[:hrd] ||= options[:htype]
85
+ options[:pro] ||= options[:ptype]
86
+ options[:hln] ||= options[:hlen]
87
+ options[:pln] ||= options[:plen]
88
+ options[:op] ||= options[:opcode]
89
+ options[:sha] ||= options[:src_mac]
90
+ options[:spa] ||= options[:src_ip]
91
+ options[:tha] ||= options[:dst_mac]
94
92
  options[:tpa] ||= options[:dst_ip]
95
- super
93
+ super
96
94
  end
97
95
 
98
- alias :htype :hrd
99
- alias :htype= :hrd=
100
- alias :ptype :pro
101
- alias :ptype= :pro=
102
- alias :hlen :hln
103
- alias :hlen= :hln=
104
- alias :plen :pln
105
- alias :plen= :pln=
106
- alias :opcode :op
107
- alias :opcode= :op=
108
- alias :src_mac :sha
109
- alias :src_mac= :sha=
110
- alias :src_ip :spa
111
- alias :src_ip= :spa=
112
- alias :dst_mac :tha
113
- alias :dst_mac= :tha=
114
- alias :dst_ip :tpa
115
- alias :dst_ip= :tpa=
96
+ alias htype hrd
97
+ alias htype= hrd=
98
+ alias ptype pro
99
+ alias ptype= pro=
100
+ alias hlen hln
101
+ alias hlen= hln=
102
+ alias plen pln
103
+ alias plen= pln=
104
+ alias opcode op
105
+ alias opcode= op=
106
+ alias src_mac sha
107
+ alias src_mac= sha=
108
+ alias src_ip spa
109
+ alias src_ip= spa=
110
+ alias dst_mac tha
111
+ alias dst_mac= tha=
112
+ alias dst_ip tpa
113
+ alias dst_ip= tpa=
114
+
115
+ # Invert data to create a reply.
116
+ # @return [self]
117
+ def reply!
118
+ case opcode.to_i
119
+ when 1
120
+ self.opcode = 2
121
+ self.spa, self.tpa = self.tpa, self.spa
122
+ self.sha, self.tha = self.tha, self.sha
123
+ when 2
124
+ self.opcode = 1
125
+ self.spa, self.tpa = self.tpa, self.spa
126
+ self.sha = self.tha
127
+ self[:tha].from_human('00:00:00:00:00:00')
128
+ end
129
+ self
130
+ end
116
131
  end
117
132
 
118
133
  self.add_class ARP
119
134
 
120
- Eth.bind_header ARP, ethertype: 0x806
121
- Dot1q.bind_header ARP, ethertype: 0x806
135
+ Eth.bind ARP, ethertype: 0x806
136
+ Dot1q.bind ARP, ethertype: 0x806
122
137
  end
123
138
  end
@@ -4,22 +4,22 @@
4
4
  # This program is published under MIT license.
5
5
 
6
6
  # frozen_string_literal: true
7
+
7
8
  require 'rasn1'
8
9
 
9
10
  module PacketGen
10
11
  module Header
11
-
12
12
  # @abstract Base class for ASN.1 header types.
13
13
  # This class implement minimal {Base} API to mimic a {Base} object.
14
14
  #
15
15
  # Subclasses may define magic methods:
16
16
  # * {#parse?}.
17
17
  # @author Sylvain Daubert
18
+ # @since 2.0.0
18
19
  class ASN1Base < RASN1::Model
19
-
20
20
  # Reference on packet which owns this header
21
21
  # @return [Packet,nil]
22
- attr_accessor :packet
22
+ attr_reader :packet
23
23
 
24
24
  # Give protocol name for this class
25
25
  # @return [String]
@@ -51,6 +51,7 @@ module PacketGen
51
51
  classname.sub(/.*::/, '')
52
52
  end
53
53
  end
54
+
54
55
  # return header method name
55
56
  # @return [String]
56
57
  # @since 2.0.0
@@ -77,17 +78,16 @@ module PacketGen
77
78
  added_to_packet(packet)
78
79
  @packet
79
80
  end
80
-
81
+
81
82
  # @abstract This method is called when a header is added to a packet.
82
83
  # This base method does nothing but may be overriden by subclasses.
83
84
  # @param [Packet] packet packet to which self is added
84
85
  # @return [void]
85
86
  # @since 2.1.4
86
- def added_to_packet(packet)
87
- end
87
+ def added_to_packet(packet) end
88
88
 
89
- alias :parse :parse!
90
- alias :to_s :to_der
89
+ alias parse parse!
90
+ alias to_s to_der
91
91
 
92
92
  # Read a BER string
93
93
  # @param [String] str