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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +28 -0
- data/Rakefile +6 -6
- data/bin/pgconsole +6 -6
- data/lib/packetgen.rb +4 -3
- data/lib/packetgen/capture.rb +5 -7
- data/lib/packetgen/config.rb +3 -3
- data/lib/packetgen/deprecation.rb +17 -0
- data/lib/packetgen/header.rb +40 -38
- data/lib/packetgen/header/arp.rb +46 -31
- data/lib/packetgen/header/asn1_base.rb +8 -8
- data/lib/packetgen/header/base.rb +108 -36
- data/lib/packetgen/header/bootp.rb +28 -19
- data/lib/packetgen/header/crypto.rb +6 -8
- data/lib/packetgen/header/dhcp.rb +4 -5
- data/lib/packetgen/header/dhcp/option.rb +46 -34
- data/lib/packetgen/header/dhcp/options.rb +0 -1
- data/lib/packetgen/header/dhcpv6.rb +10 -10
- data/lib/packetgen/header/dhcpv6/duid.rb +2 -3
- data/lib/packetgen/header/dhcpv6/option.rb +16 -21
- data/lib/packetgen/header/dhcpv6/relay.rb +6 -4
- data/lib/packetgen/header/dns.rb +13 -11
- data/lib/packetgen/header/dns/name.rb +4 -6
- data/lib/packetgen/header/dns/opt.rb +31 -31
- data/lib/packetgen/header/dns/option.rb +0 -2
- data/lib/packetgen/header/dns/qdsection.rb +1 -2
- data/lib/packetgen/header/dns/question.rb +19 -13
- data/lib/packetgen/header/dns/rr.rb +11 -14
- data/lib/packetgen/header/dns/rrsection.rb +5 -7
- data/lib/packetgen/header/dot11.rb +45 -29
- data/lib/packetgen/header/dot11/control.rb +3 -5
- data/lib/packetgen/header/dot11/data.rb +34 -6
- data/lib/packetgen/header/dot11/element.rb +0 -1
- data/lib/packetgen/header/dot11/management.rb +9 -5
- data/lib/packetgen/header/dot11/sub_mngt.rb +13 -14
- data/lib/packetgen/header/dot1q.rb +2 -2
- data/lib/packetgen/header/dot1x.rb +3 -4
- data/lib/packetgen/header/eap.rb +62 -53
- data/lib/packetgen/header/eap/fast.rb +0 -1
- data/lib/packetgen/header/eap/md5.rb +1 -2
- data/lib/packetgen/header/eap/tls.rb +9 -10
- data/lib/packetgen/header/eap/ttls.rb +9 -10
- data/lib/packetgen/header/esp.rb +33 -33
- data/lib/packetgen/header/eth.rb +11 -8
- data/lib/packetgen/header/gre.rb +5 -6
- data/lib/packetgen/header/http/headers.rb +11 -14
- data/lib/packetgen/header/http/request.rb +20 -20
- data/lib/packetgen/header/http/response.rb +16 -18
- data/lib/packetgen/header/http/verbs.rb +5 -5
- data/lib/packetgen/header/icmp.rb +1 -3
- data/lib/packetgen/header/icmpv6.rb +1 -3
- data/lib/packetgen/header/igmp.rb +5 -6
- data/lib/packetgen/header/igmpv3.rb +5 -9
- data/lib/packetgen/header/igmpv3/group_record.rb +4 -5
- data/lib/packetgen/header/igmpv3/mq.rb +2 -2
- data/lib/packetgen/header/igmpv3/mr.rb +4 -3
- data/lib/packetgen/header/ike.rb +33 -8
- data/lib/packetgen/header/ike/auth.rb +4 -6
- data/lib/packetgen/header/ike/cert.rb +0 -2
- data/lib/packetgen/header/ike/certreq.rb +1 -3
- data/lib/packetgen/header/ike/id.rb +1 -3
- data/lib/packetgen/header/ike/ke.rb +0 -2
- data/lib/packetgen/header/ike/nonce.rb +0 -2
- data/lib/packetgen/header/ike/notify.rb +22 -24
- data/lib/packetgen/header/ike/payload.rb +198 -199
- data/lib/packetgen/header/ike/sa.rb +21 -30
- data/lib/packetgen/header/ike/sk.rb +16 -17
- data/lib/packetgen/header/ike/ts.rb +22 -24
- data/lib/packetgen/header/ike/vendor_id.rb +0 -2
- data/lib/packetgen/header/ip.rb +30 -23
- data/lib/packetgen/header/ip/addr.rb +5 -6
- data/lib/packetgen/header/ip/option.rb +11 -15
- data/lib/packetgen/header/ip/options.rb +1 -2
- data/lib/packetgen/header/ipv6.rb +27 -12
- data/lib/packetgen/header/ipv6/addr.rb +2 -2
- data/lib/packetgen/header/ipv6/extension.rb +1 -1
- data/lib/packetgen/header/ipv6/hop_by_hop.rb +11 -11
- data/lib/packetgen/header/llc.rb +4 -3
- data/lib/packetgen/header/mdns.rb +11 -5
- data/lib/packetgen/header/mld.rb +4 -4
- data/lib/packetgen/header/mldv2.rb +4 -3
- data/lib/packetgen/header/mldv2/mcast_address_record.rb +3 -4
- data/lib/packetgen/header/mldv2/mlq.rb +3 -4
- data/lib/packetgen/header/mldv2/mlr.rb +4 -3
- data/lib/packetgen/header/netbios.rb +18 -5
- data/lib/packetgen/header/ospfv2.rb +6 -7
- data/lib/packetgen/header/ospfv2/db_description.rb +3 -4
- data/lib/packetgen/header/ospfv2/hello.rb +2 -3
- data/lib/packetgen/header/ospfv2/ls_ack.rb +2 -3
- data/lib/packetgen/header/ospfv2/ls_request.rb +2 -3
- data/lib/packetgen/header/ospfv2/ls_update.rb +5 -6
- data/lib/packetgen/header/ospfv2/lsa.rb +13 -14
- data/lib/packetgen/header/ospfv2/lsa_header.rb +4 -5
- data/lib/packetgen/header/ospfv3.rb +3 -4
- data/lib/packetgen/header/ospfv3/db_description.rb +3 -5
- data/lib/packetgen/header/ospfv3/hello.rb +2 -3
- data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +7 -8
- data/lib/packetgen/header/ospfv3/ls_ack.rb +2 -3
- data/lib/packetgen/header/ospfv3/ls_request.rb +2 -3
- data/lib/packetgen/header/ospfv3/ls_update.rb +5 -6
- data/lib/packetgen/header/ospfv3/lsa.rb +10 -11
- data/lib/packetgen/header/ospfv3/lsa_header.rb +3 -4
- data/lib/packetgen/header/snmp.rb +45 -32
- data/lib/packetgen/header/tcp.rb +13 -9
- data/lib/packetgen/header/tcp/option.rb +16 -11
- data/lib/packetgen/header/tcp/options.rb +3 -4
- data/lib/packetgen/header/tftp.rb +15 -17
- data/lib/packetgen/header/udp.rb +10 -4
- data/lib/packetgen/inspect.rb +7 -9
- data/lib/packetgen/packet.rb +44 -22
- data/lib/packetgen/pcapng.rb +1 -5
- data/lib/packetgen/pcapng/block.rb +17 -11
- data/lib/packetgen/pcapng/epb.rb +6 -11
- data/lib/packetgen/pcapng/file.rb +37 -44
- data/lib/packetgen/pcapng/idb.rb +17 -22
- data/lib/packetgen/pcapng/shb.rb +7 -10
- data/lib/packetgen/pcapng/spb.rb +21 -17
- data/lib/packetgen/pcapng/unknown_block.rb +17 -13
- data/lib/packetgen/proto.rb +1 -2
- data/lib/packetgen/types/array.rb +119 -34
- data/lib/packetgen/types/cstring.rb +1 -5
- data/lib/packetgen/types/enum.rb +8 -10
- data/lib/packetgen/types/fields.rb +34 -28
- data/lib/packetgen/types/int.rb +11 -13
- data/lib/packetgen/types/int_string.rb +6 -8
- data/lib/packetgen/types/oui.rb +3 -6
- data/lib/packetgen/types/string.rb +4 -6
- data/lib/packetgen/types/tlv.rb +11 -14
- data/lib/packetgen/utils.rb +15 -23
- data/lib/packetgen/utils/arp_spoofer.rb +12 -18
- data/lib/packetgen/version.rb +1 -1
- data/packetgen.gemspec +9 -8
- metadata +19 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0c68cb5128a07a395378b28ecf7ab5711be938cbc5fb2807d42b7cb9a946ed5d
|
4
|
+
data.tar.gz: cb5d764d681dcda886a0fd2b5c3d852aa1eb477edb116286e8ac449e7170c5bd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: de785e82d0bc1d5d1a00d6069a74e120fdd6323bd68ab1c06e285967e2d6ab6c32caec8a8079e393cd52076d81d7ab0ccbbb2522d4212264181a7c5033a8718a
|
7
|
+
data.tar.gz: fa91feb360719d3a10a7b984cc89c1cb1c842ec69b41121029f68b374e0a2db03f02ea50898b78fb1ce439dd0aed3a2e60635acb8242e71a01184faaece91c99
|
data/.gitignore
CHANGED
data/.rubocop.yml
ADDED
@@ -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 :
|
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
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
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|
|
data/bin/pgconsole
CHANGED
@@ -8,7 +8,7 @@ use_pry = false
|
|
8
8
|
begin
|
9
9
|
require 'pry'
|
10
10
|
use_pry = true
|
11
|
-
puts
|
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 =
|
61
|
-
irb.context.prompt_s =
|
62
|
-
irb.context.prompt_c =
|
60
|
+
irb.context.prompt_i = 'pg> '
|
61
|
+
irb.context.prompt_s = 'pg* '
|
62
|
+
irb.context.prompt_c = 'pg* '
|
63
63
|
|
64
|
-
trap(
|
64
|
+
trap('SIGINT') do
|
65
65
|
irb.signal_handle
|
66
66
|
end
|
67
67
|
|
data/lib/packetgen.rb
CHANGED
@@ -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.
|
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]
|
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'
|
data/lib/packetgen/capture.rb
CHANGED
@@ -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
|
-
|
73
|
-
yield packet_data
|
70
|
+
elsif block_given?
|
71
|
+
yield packet_data
|
74
72
|
end
|
75
|
-
break if @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.
|
94
|
+
@promisc = options[:promisc] if options.key? :promisc
|
97
95
|
@snaplen = options[:snaplen] if options[:snaplen]
|
98
|
-
@parse = options[:parse] if options.
|
96
|
+
@parse = options[:parse] if options.key? :parse
|
99
97
|
@iface = options[:iface] if options[:iface]
|
100
98
|
end
|
101
99
|
|
data/lib/packetgen/config.rb
CHANGED
@@ -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
|
data/lib/packetgen/header.rb
CHANGED
@@ -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
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
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
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
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
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
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
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
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
|
data/lib/packetgen/header/arp.rb
CHANGED
@@ -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
|
99
|
-
alias
|
100
|
-
alias
|
101
|
-
alias
|
102
|
-
alias
|
103
|
-
alias
|
104
|
-
alias
|
105
|
-
alias
|
106
|
-
alias
|
107
|
-
alias
|
108
|
-
alias
|
109
|
-
alias
|
110
|
-
alias
|
111
|
-
alias
|
112
|
-
alias
|
113
|
-
alias
|
114
|
-
alias
|
115
|
-
alias
|
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.
|
121
|
-
Dot1q.
|
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
|
-
|
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
|
90
|
-
alias
|
89
|
+
alias parse parse!
|
90
|
+
alias to_s to_der
|
91
91
|
|
92
92
|
# Read a BER string
|
93
93
|
# @param [String] str
|