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