packetgen 2.6.0 → 2.7.0

Sign up to get free protection for your applications and to get access to all the features.
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