pio 0.2.7 → 0.3.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/.rubocop.yml +1 -0
- data/.travis.yml +1 -0
- data/CONTRIBUTING.md +12 -0
- data/Gemfile +26 -23
- data/Guardfile +5 -0
- data/README.md +61 -19
- data/Rakefile +54 -56
- data/lib/pio/arp/frame.rb +8 -6
- data/lib/pio/arp/message.rb +9 -23
- data/lib/pio/arp/reply.rb +6 -15
- data/lib/pio/arp/request.rb +7 -16
- data/lib/pio/arp.rb +14 -17
- data/lib/pio/icmp/frame.rb +131 -0
- data/lib/pio/icmp/message.rb +100 -0
- data/lib/pio/icmp/reply.rb +17 -0
- data/lib/pio/icmp/request.rb +17 -0
- data/lib/pio/icmp.rb +27 -0
- data/lib/pio/ipv4_address.rb +22 -39
- data/lib/pio/lldp/chassis_id_tlv.rb +13 -16
- data/lib/pio/lldp/end_of_lldpdu_value.rb +4 -5
- data/lib/pio/lldp/frame.rb +21 -32
- data/lib/pio/lldp/management_address_value.rb +3 -4
- data/lib/pio/lldp/optional_tlv.rb +13 -22
- data/lib/pio/lldp/organizationally_specific_value.rb +3 -4
- data/lib/pio/lldp/port_description_value.rb +3 -4
- data/lib/pio/lldp/port_id_tlv.rb +6 -9
- data/lib/pio/lldp/system_capabilities_value.rb +3 -4
- data/lib/pio/lldp/system_description_value.rb +3 -4
- data/lib/pio/lldp/system_name_value.rb +3 -4
- data/lib/pio/lldp/ttl_tlv.rb +6 -9
- data/lib/pio/lldp.rb +20 -36
- data/lib/pio/mac.rb +30 -53
- data/lib/pio/message_util.rb +19 -0
- data/lib/pio/type/config.reek +4 -0
- data/lib/pio/type/ethernet_header.rb +7 -4
- data/lib/pio/type/ip_address.rb +5 -8
- data/lib/pio/type/ipv4_header.rb +37 -0
- data/lib/pio/type/mac_address.rb +7 -8
- data/lib/pio/util.rb +21 -0
- data/lib/pio/version.rb +2 -2
- data/lib/pio.rb +4 -4
- data/pio.gemspec +15 -17
- data/pio.org +499 -76
- data/pio.org_archive +86 -0
- data/rubocop-todo.yml +9 -0
- data/spec/pio/arp/reply_spec.rb +106 -118
- data/spec/pio/arp/request_spec.rb +90 -101
- data/spec/pio/arp_spec.rb +105 -113
- data/spec/pio/icmp/reply_spec.rb +132 -0
- data/spec/pio/icmp/request_spec.rb +131 -0
- data/spec/pio/icmp_spec.rb +159 -0
- data/spec/pio/ipv4_address_spec.rb +87 -97
- data/spec/pio/lldp_spec.rb +237 -186
- data/spec/pio/mac_spec.rb +82 -93
- data/spec/spec_helper.rb +10 -13
- metadata +20 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 75af6278d342dd6e8c2b0c675d1f3f7d82ab3474
|
4
|
+
data.tar.gz: d5e0ee260a39d472ecf3d950e849f33f2558f52d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 780986656174b5c659d486c2affca51f2fd70d09bb848198cf501668670628d5fcf6a3d640af5c8a709fcbad1ab241c4fe50921350964492278267207ed0883a
|
7
|
+
data.tar.gz: 59b6ddea90c19e05307ab2b2f2a8be7b201f5f872fd58824aca29acc1923a1d8eccc1c8a881bf0150568c7ddeab3a029afab45725067f971f95e9be979a9a072
|
data/.rubocop.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
inherit_from: rubocop-todo.yml
|
data/.travis.yml
CHANGED
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
# Contributing to Pio
|
2
|
+
|
3
|
+
* Check out the latest develop to make sure the feature hasn't been
|
4
|
+
implemented or the bug hasn't been fixed yet.
|
5
|
+
* Check out the issue tracker to make sure someone already hasn't
|
6
|
+
requested it and/or contributed it.
|
7
|
+
* Fork the project.
|
8
|
+
* Commit and push until you are happy with your contribution.
|
9
|
+
* Make sure to add tests for it. This is important so I don't break it
|
10
|
+
in a future version unintentionally.
|
11
|
+
* Squash your commits.
|
12
|
+
* Create a pull-request.
|
data/Gemfile
CHANGED
@@ -1,32 +1,35 @@
|
|
1
|
-
source
|
2
|
-
|
1
|
+
source 'https://rubygems.org'
|
3
2
|
|
4
3
|
gemspec
|
5
4
|
|
6
|
-
|
7
5
|
group :development, :test do
|
8
|
-
gem
|
9
|
-
gem
|
10
|
-
gem
|
11
|
-
gem
|
12
|
-
gem
|
13
|
-
gem
|
14
|
-
gem
|
15
|
-
gem
|
16
|
-
gem
|
17
|
-
gem
|
18
|
-
gem
|
19
|
-
gem
|
20
|
-
gem
|
21
|
-
gem
|
22
|
-
gem
|
23
|
-
gem
|
24
|
-
gem
|
25
|
-
gem
|
26
|
-
gem
|
6
|
+
gem 'coveralls', '~> 0.7.0', :require => false
|
7
|
+
gem 'flay', '~> 2.4.0'
|
8
|
+
gem 'flog', '~> 4.2.0'
|
9
|
+
gem 'fuubar', '~> 1.2.1'
|
10
|
+
gem 'guard', '~> 1.8.3' if RUBY_VERSION < '1.9.0'
|
11
|
+
gem 'guard', '~> 2.2.2' if RUBY_VERSION >= '1.9.0'
|
12
|
+
gem 'guard-bundler', '~> 1.0.0' if RUBY_VERSION < '1.9.0'
|
13
|
+
gem 'guard-bundler', '~> 2.0.0' if RUBY_VERSION >= '1.9.0'
|
14
|
+
gem 'guard-rspec', '~> 3.1.0' if RUBY_VERSION < '1.9.0'
|
15
|
+
gem 'guard-rspec', '~> 4.0.3' if RUBY_VERSION >= '1.9.0'
|
16
|
+
gem 'json', '~> 1.8.1'
|
17
|
+
gem 'mime-types', '~> 1.25' if RUBY_VERSION < '1.9.0'
|
18
|
+
gem 'mime-types', '~> 2.0' if RUBY_VERSION >= '1.9.0'
|
19
|
+
gem 'rake', '~> 10.1.0'
|
20
|
+
gem 'rb-fchange', '~> 0.0.6', :require => false
|
21
|
+
gem 'rb-fsevent', '~> 0.9.3', :require => false
|
22
|
+
gem 'rb-inotify', '~> 0.9.2', :require => false
|
23
|
+
gem 'redcarpet', '~> 2.3.0' if RUBY_VERSION < '1.9.0'
|
24
|
+
gem 'redcarpet', '~> 3.0.0' if RUBY_VERSION >= '1.9.0'
|
25
|
+
gem 'reek', '~> 1.3.4'
|
26
|
+
gem 'rspec', '~> 2.14.1'
|
27
|
+
gem 'rspec-instafail', '~> 0.2.4'
|
28
|
+
gem 'rubocop', '~> 0.14.1' if RUBY_VERSION >= '1.9.0'
|
29
|
+
gem 'terminal-notifier-guard', '~> 1.5.3'
|
30
|
+
gem 'yard', '~> 0.8.7.3'
|
27
31
|
end
|
28
32
|
|
29
|
-
|
30
33
|
### Local variables:
|
31
34
|
### mode: Ruby
|
32
35
|
### coding: utf-8-unix
|
data/Guardfile
CHANGED
data/README.md
CHANGED
@@ -10,6 +10,7 @@ Pio
|
|
10
10
|
|
11
11
|
Pio is a ruby gem to easily parse and generate network packets. It supports the following packet formats:
|
12
12
|
|
13
|
+
* ICMP
|
13
14
|
* ARP
|
14
15
|
* LLDP
|
15
16
|
* (...currently there are just a few formats supported but I'm sure this list will grow)
|
@@ -28,41 +29,80 @@ Features Overview
|
|
28
29
|
format DSL so that it is easy to read and debug by human beings.
|
29
30
|
|
30
31
|
|
31
|
-
|
32
|
-
|
32
|
+
Examples
|
33
|
+
--------
|
33
34
|
|
34
35
|
Its usage is dead simple.
|
35
36
|
|
37
|
+
### ICMP
|
38
|
+
|
39
|
+
To parse an ICMP frame, use the API `Pio::Icmp.read` and you can
|
40
|
+
access each field of the parsed ICMP frame.
|
41
|
+
|
42
|
+
```ruby
|
43
|
+
require 'pio'
|
44
|
+
icmp = Pio::Icmp.read(binary_data)
|
45
|
+
icmp.source_mac.to_s #=> '00:26:82:eb:ea:d1'
|
46
|
+
```
|
47
|
+
|
48
|
+
Also you can use `Pio::Icmp::Request#new` or `Pio::Icmp::Reply#new` to
|
49
|
+
generate an Icmp Request/Reply frame like below:
|
50
|
+
|
51
|
+
```ruby
|
52
|
+
require 'pio'
|
53
|
+
|
54
|
+
request = Pio::Icmp::Request.new(
|
55
|
+
source_mac: '00:26:82:eb:ea:d1',
|
56
|
+
destination_mac: '00:26:82:eb:ea:d1',
|
57
|
+
ip_source_address: '192.168.83.3',
|
58
|
+
ip_destination_address: '192.168.83.254'
|
59
|
+
)
|
60
|
+
request.to_binary #=> ICMP Request frame in binary format.
|
61
|
+
|
62
|
+
reply = Pio::Icmp::Reply.new(
|
63
|
+
destination_mac: '00:26:82:eb:ea:d1',
|
64
|
+
source_mac: '00:00:00:00:00:01',
|
65
|
+
ip_source_address: '192.168.0.1',
|
66
|
+
ip_destination_address: '192.168.0.2',
|
67
|
+
# The ICMP Identifier and the ICMP Sequence number
|
68
|
+
# should be same as those of the request.
|
69
|
+
icmp_identifier: request.icmp_identifier,
|
70
|
+
icmp_sequence_number: request.icmp_sequence_number,
|
71
|
+
echo_data: request.echo_data
|
72
|
+
)
|
73
|
+
reply.to_binary #=> ICMP Reply frame in binary format.
|
74
|
+
```
|
75
|
+
|
36
76
|
### ARP
|
37
77
|
|
38
78
|
To parse an ARP frame, use the API `Pio::Arp.read` and you can access
|
39
79
|
each field of the parsed ARP frame.
|
40
80
|
|
41
81
|
```ruby
|
42
|
-
require
|
82
|
+
require 'pio'
|
43
83
|
|
44
|
-
arp = Pio::Arp.read(
|
45
|
-
arp.source_mac.to_s #=>
|
84
|
+
arp = Pio::Arp.read(binary_data)
|
85
|
+
arp.source_mac.to_s #=> '00:26:82:eb:ea:d1'
|
46
86
|
```
|
47
87
|
|
48
88
|
Also you can use `Pio::Arp::Request#new` or `Pio::Arp::Reply#new` to
|
49
89
|
generate an Arp Request/Reply frame like below:
|
50
90
|
|
51
91
|
```ruby
|
52
|
-
require
|
92
|
+
require 'pio'
|
53
93
|
|
54
94
|
request = Pio::Arp::Request.new(
|
55
|
-
source_mac:
|
56
|
-
sender_protocol_address:
|
57
|
-
target_protocol_address:
|
95
|
+
source_mac: '00:26:82:eb:ea:d1',
|
96
|
+
sender_protocol_address: '192.168.83.3',
|
97
|
+
target_protocol_address: '192.168.83.254'
|
58
98
|
)
|
59
99
|
request.to_binary #=> Arp Request frame in binary format.
|
60
100
|
|
61
101
|
reply = Pio::Arp::Reply.new(
|
62
|
-
source_mac:
|
63
|
-
destination_mac:
|
64
|
-
sender_protocol_address:
|
65
|
-
target_protocol_address:
|
102
|
+
source_mac: '00:26:82:eb:ea:d1',
|
103
|
+
destination_mac: '00:26:82:eb:ea:d1',
|
104
|
+
sender_protocol_address: '192.168.83.3',
|
105
|
+
target_protocol_address: '192.168.83.254'
|
66
106
|
)
|
67
107
|
reply.to_binary #=> Arp Reply frame in binary format.
|
68
108
|
```
|
@@ -73,18 +113,18 @@ To parse an LLDP frame, use the API `Pio::Lldp.read` and you can
|
|
73
113
|
access each field of the parsed LLDP frame.
|
74
114
|
|
75
115
|
```ruby
|
76
|
-
require
|
116
|
+
require 'pio'
|
77
117
|
|
78
|
-
lldp = Pio::Lldp.read(
|
118
|
+
lldp = Pio::Lldp.read(binary_data)
|
79
119
|
lldp.ttl #=> 120
|
80
120
|
```
|
81
121
|
|
82
122
|
Also you can use `Pio::Lldp#new` to generate an LLDP frame like below:
|
83
123
|
|
84
124
|
```ruby
|
85
|
-
require
|
125
|
+
require 'pio'
|
86
126
|
|
87
|
-
lldp = Pio::Lldp.new(
|
127
|
+
lldp = Pio::Lldp.new(dpid: 0x123, port_number: 12)
|
88
128
|
lldp.to_binary #=> LLDP frame in binary format.
|
89
129
|
```
|
90
130
|
|
@@ -113,9 +153,11 @@ Documents
|
|
113
153
|
* [API document generated with YARD](http://rubydoc.info/github/trema/pio/frames/file/README.md)
|
114
154
|
|
115
155
|
|
116
|
-
|
156
|
+
Team
|
157
|
+
----
|
117
158
|
|
118
|
-
[Yasuhito Takamiya](https://github.com/yasuhito) ([@yasuhito](
|
159
|
+
* [Yasuhito Takamiya](https://github.com/yasuhito) ([@yasuhito](https://twitter.com/yasuhito))
|
160
|
+
* [Eishun Kondoh](https://github.com/shun159) ([@Eishun_Kondoh](https://twitter.com/Eishun_Kondoh))
|
119
161
|
|
120
162
|
### Contributors
|
121
163
|
|
data/Rakefile
CHANGED
@@ -1,101 +1,99 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
12
|
-
|
13
|
-
|
14
|
-
$ruby_source = FileList[ "lib/**/*.rb" ]
|
15
|
-
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'coveralls/rake/task'
|
3
|
+
require 'flay'
|
4
|
+
require 'flay_task'
|
5
|
+
require 'flog'
|
6
|
+
require 'rake/tasklib'
|
7
|
+
require 'reek/rake/task'
|
8
|
+
require 'rspec/core'
|
9
|
+
require 'rspec/core/rake_task'
|
10
|
+
require 'yaml'
|
11
|
+
require 'yard'
|
12
|
+
|
13
|
+
ruby_source = FileList['lib/**/*.rb']
|
16
14
|
|
17
15
|
task :default => :travis
|
18
|
-
task :travis => [
|
19
|
-
|
20
|
-
desc "Check for code quality"
|
21
|
-
task :quality => [ :reek, :flog, :flay ]
|
16
|
+
task :travis => [:spec, :quality, 'coveralls:push']
|
22
17
|
|
18
|
+
desc 'Check for code quality'
|
19
|
+
task :quality => [:reek, :flog, :flay]
|
23
20
|
|
24
21
|
Coveralls::RakeTask.new
|
25
22
|
|
26
|
-
|
27
23
|
RSpec::Core::RakeTask.new
|
28
24
|
|
29
|
-
|
30
|
-
Reek::Rake::Task.new do | t |
|
25
|
+
Reek::Rake::Task.new do |t|
|
31
26
|
t.fail_on_error = false
|
32
27
|
t.verbose = false
|
33
|
-
t.ruby_opts = [
|
34
|
-
t.reek_opts =
|
35
|
-
t.source_files =
|
28
|
+
t.ruby_opts = ['-rubygems']
|
29
|
+
t.reek_opts = '--quiet'
|
30
|
+
t.source_files = ruby_source
|
36
31
|
end
|
37
32
|
|
38
|
-
|
39
|
-
desc "Analyze for code complexity"
|
33
|
+
desc 'Analyze for code complexity'
|
40
34
|
task :flog do
|
41
|
-
flog = Flog.new(
|
42
|
-
flog.flog(
|
43
|
-
threshold =
|
35
|
+
flog = Flog.new(:continue => true)
|
36
|
+
flog.flog(*ruby_source)
|
37
|
+
threshold = 28
|
44
38
|
|
45
|
-
bad_methods = flog.totals.select do |
|
46
|
-
(
|
39
|
+
bad_methods = flog.totals.select do |name, score|
|
40
|
+
!(/##{flog.no_method}$/ =~ name) && score > threshold
|
47
41
|
end
|
48
|
-
bad_methods.sort
|
49
|
-
|
50
|
-
end.reverse.each do | name, score |
|
51
|
-
puts "%8.1f: %s" % [ score, name ]
|
42
|
+
bad_methods.sort { |a, b| a[1] <=> b[1] }.reverse.each do |name, score|
|
43
|
+
printf "%8.1f: %s\n", score, name
|
52
44
|
end
|
53
45
|
unless bad_methods.empty?
|
54
|
-
$stderr.puts "#{
|
46
|
+
$stderr.puts "#{bad_methods.size} methods have a complexity > #{threshold}"
|
55
47
|
end
|
56
48
|
end
|
57
49
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
each[ /[^\/]+/ ]
|
50
|
+
FlayTask.new do |t|
|
51
|
+
t.dirs = ruby_source.map do |each|
|
52
|
+
each[/[^\/]+/]
|
62
53
|
end.uniq
|
63
54
|
t.threshold = 0
|
64
|
-
t.verbose =
|
55
|
+
t.verbose = true
|
65
56
|
end
|
66
57
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
58
|
+
if RUBY_VERSION >= '1.9.0'
|
59
|
+
task :quality => :rubocop
|
60
|
+
require 'rubocop/rake_task'
|
61
|
+
Rubocop::RakeTask.new
|
71
62
|
end
|
72
63
|
|
64
|
+
YARD::Rake::YardocTask.new do |t|
|
65
|
+
t.options = ['--no-private']
|
66
|
+
t.options << '--debug' << '--verbose' if Rake.verbose
|
67
|
+
end
|
73
68
|
|
74
69
|
def travis_yml
|
75
|
-
File.join File.dirname(
|
70
|
+
File.join File.dirname(__FILE__), '.travis.yml'
|
76
71
|
end
|
77
72
|
|
78
|
-
|
79
73
|
def rubies
|
80
|
-
|
74
|
+
YAML.load_file(travis_yml)['rvm'].uniq.sort
|
81
75
|
end
|
82
76
|
|
77
|
+
def gemfile_lock
|
78
|
+
File.join File.dirname(__FILE__), 'Gemfile.lock'
|
79
|
+
end
|
83
80
|
|
84
|
-
desc
|
81
|
+
desc 'Run tests against multiple rubies'
|
85
82
|
task :portability
|
86
83
|
|
87
|
-
rubies.each do |
|
88
|
-
portability_task_name = "portability:#{
|
84
|
+
rubies.each do |each|
|
85
|
+
portability_task_name = "portability:#{each}"
|
89
86
|
task :portability => portability_task_name
|
90
87
|
|
91
|
-
desc "Run tests against Ruby#{
|
88
|
+
desc "Run tests against Ruby#{each}"
|
92
89
|
task portability_task_name do
|
93
|
-
|
94
|
-
sh "rvm #{
|
90
|
+
rm_f gemfile_lock
|
91
|
+
sh "rvm #{each} exec bundle update"
|
92
|
+
sh "rvm #{each} exec bundle install"
|
93
|
+
sh "rvm #{each} exec bundle exec rake"
|
95
94
|
end
|
96
95
|
end
|
97
96
|
|
98
|
-
|
99
97
|
### Local variables:
|
100
98
|
### mode: Ruby
|
101
99
|
### coding: utf-8-unix
|
data/lib/pio/arp/frame.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
|
2
|
-
require
|
3
|
-
require
|
4
|
-
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'pio/type/ethernet_header'
|
3
|
+
require 'pio/type/ip_address'
|
4
|
+
require 'pio/type/mac_address'
|
5
5
|
|
6
6
|
module Pio
|
7
7
|
class Arp
|
@@ -22,15 +22,17 @@ module Pio
|
|
22
22
|
mac_address :target_hardware_address
|
23
23
|
ip_address :target_protocol_address
|
24
24
|
|
25
|
+
def message_type
|
26
|
+
operation
|
27
|
+
end
|
25
28
|
|
26
29
|
def to_binary
|
27
|
-
to_binary_s + "\000" * (
|
30
|
+
to_binary_s + "\000" * (64 - num_bytes)
|
28
31
|
end
|
29
32
|
end
|
30
33
|
end
|
31
34
|
end
|
32
35
|
|
33
|
-
|
34
36
|
### Local variables:
|
35
37
|
### mode: Ruby
|
36
38
|
### coding: utf-8-unix
|
data/lib/pio/arp/message.rb
CHANGED
@@ -1,28 +1,27 @@
|
|
1
|
-
|
2
|
-
require
|
3
|
-
require
|
4
|
-
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'forwardable'
|
3
|
+
require 'pio/arp/frame'
|
4
|
+
require 'pio/ipv4_address'
|
5
|
+
require 'pio/message_util'
|
5
6
|
|
6
7
|
module Pio
|
7
8
|
class Arp
|
8
9
|
# Base class of ARP Request and Reply
|
9
10
|
class Message
|
10
11
|
extend Forwardable
|
12
|
+
include MessageUtil
|
11
13
|
|
12
|
-
|
13
|
-
def self.create_from frame
|
14
|
+
def self.create_from(frame)
|
14
15
|
message = allocate
|
15
16
|
message.instance_variable_set :@frame, frame
|
16
17
|
message
|
17
18
|
end
|
18
19
|
|
19
|
-
|
20
|
-
def initialize options
|
20
|
+
def initialize(options)
|
21
21
|
@options = options
|
22
|
-
@frame = Arp::Frame.new(
|
22
|
+
@frame = Arp::Frame.new(option_hash)
|
23
23
|
end
|
24
24
|
|
25
|
-
|
26
25
|
def_delegators :@frame, :destination_mac
|
27
26
|
def_delegators :@frame, :source_mac
|
28
27
|
def_delegators :@frame, :ether_type
|
@@ -37,20 +36,7 @@ module Pio
|
|
37
36
|
def_delegators :@frame, :target_protocol_address
|
38
37
|
def_delegators :@frame, :to_binary
|
39
38
|
|
40
|
-
|
41
|
-
##########################################################################
|
42
39
|
private
|
43
|
-
##########################################################################
|
44
|
-
|
45
|
-
|
46
|
-
def option_hash
|
47
|
-
mandatory_options.inject( {} ) do | opt, each |
|
48
|
-
klass = option_to_klass[ each ]
|
49
|
-
opt_pair = { each => klass.new( user_options[ each ] ).to_a }
|
50
|
-
opt.merge opt_pair
|
51
|
-
end.merge default_options
|
52
|
-
end
|
53
|
-
|
54
40
|
|
55
41
|
def option_to_klass
|
56
42
|
{
|
data/lib/pio/arp/reply.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
|
2
|
-
require
|
3
|
-
require
|
4
|
-
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'forwardable'
|
3
|
+
require 'pio/arp/message'
|
4
|
+
require 'pio/mac'
|
5
5
|
|
6
6
|
module Pio
|
7
7
|
class Arp
|
@@ -9,11 +9,7 @@ module Pio
|
|
9
9
|
class Reply < Message
|
10
10
|
OPERATION = 2
|
11
11
|
|
12
|
-
|
13
|
-
##########################################################################
|
14
12
|
private
|
15
|
-
##########################################################################
|
16
|
-
|
17
13
|
|
18
14
|
def default_options
|
19
15
|
{
|
@@ -21,17 +17,13 @@ module Pio
|
|
21
17
|
}
|
22
18
|
end
|
23
19
|
|
24
|
-
|
25
20
|
def user_options
|
26
21
|
@options.merge(
|
27
|
-
|
28
|
-
|
29
|
-
:target_hardware_address => @options[ :destination_mac ]
|
30
|
-
}
|
22
|
+
:sender_hardware_address => @options[:source_mac],
|
23
|
+
:target_hardware_address => @options[:destination_mac]
|
31
24
|
)
|
32
25
|
end
|
33
26
|
|
34
|
-
|
35
27
|
def mandatory_options
|
36
28
|
[
|
37
29
|
:source_mac,
|
@@ -46,7 +38,6 @@ module Pio
|
|
46
38
|
end
|
47
39
|
end
|
48
40
|
|
49
|
-
|
50
41
|
### Local variables:
|
51
42
|
### mode: Ruby
|
52
43
|
### coding: utf-8-unix
|
data/lib/pio/arp/request.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
|
2
|
-
require
|
3
|
-
require
|
4
|
-
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'pio/arp/frame'
|
3
|
+
require 'pio/arp/message'
|
4
|
+
require 'pio/mac'
|
5
5
|
|
6
6
|
module Pio
|
7
7
|
class Arp
|
@@ -9,14 +9,10 @@ module Pio
|
|
9
9
|
class Request < Message
|
10
10
|
OPERATION = 1
|
11
11
|
|
12
|
-
BROADCAST_MAC_ADDRESS = Mac.new(
|
13
|
-
ALL_ZERO_MAC_ADDRESS = Mac.new(
|
14
|
-
|
12
|
+
BROADCAST_MAC_ADDRESS = Mac.new(0xffffffffffff).to_a
|
13
|
+
ALL_ZERO_MAC_ADDRESS = Mac.new(0).to_a
|
15
14
|
|
16
|
-
########################################################################
|
17
15
|
private
|
18
|
-
########################################################################
|
19
|
-
|
20
16
|
|
21
17
|
def default_options
|
22
18
|
{
|
@@ -26,14 +22,10 @@ module Pio
|
|
26
22
|
}
|
27
23
|
end
|
28
24
|
|
29
|
-
|
30
25
|
def user_options
|
31
|
-
@options.merge
|
32
|
-
{ :sender_hardware_address => @options[ :source_mac ] }
|
33
|
-
)
|
26
|
+
@options.merge :sender_hardware_address => @options[:source_mac]
|
34
27
|
end
|
35
28
|
|
36
|
-
|
37
29
|
def mandatory_options
|
38
30
|
[
|
39
31
|
:source_mac,
|
@@ -46,7 +38,6 @@ module Pio
|
|
46
38
|
end
|
47
39
|
end
|
48
40
|
|
49
|
-
|
50
41
|
### Local variables:
|
51
42
|
### mode: Ruby
|
52
43
|
### coding: utf-8-unix
|
data/lib/pio/arp.rb
CHANGED
@@ -1,29 +1,26 @@
|
|
1
|
-
|
2
|
-
require
|
3
|
-
|
4
|
-
require
|
5
|
-
require "pio/arp/reply"
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'English'
|
3
|
+
require 'rubygems'
|
4
|
+
require 'bindata'
|
6
5
|
|
6
|
+
require 'pio/arp/request'
|
7
|
+
require 'pio/arp/reply'
|
8
|
+
require 'pio/util'
|
7
9
|
|
8
10
|
module Pio
|
9
11
|
# ARP parser and generator.
|
10
|
-
class Arp
|
11
|
-
ARP_MESSAGE_TYPE = { Request::OPERATION => Request, Reply::OPERATION => Reply }
|
12
|
-
|
13
12
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
ARP_MESSAGE_TYPE[ frame.operation ].create_from frame
|
13
|
+
class Arp
|
14
|
+
MESSAGE_TYPE = {
|
15
|
+
Request::OPERATION => Request,
|
16
|
+
Reply::OPERATION => Reply
|
17
|
+
}
|
18
|
+
class << self
|
19
|
+
include Util
|
22
20
|
end
|
23
21
|
end
|
24
22
|
end
|
25
23
|
|
26
|
-
|
27
24
|
### Local variables:
|
28
25
|
### mode: Ruby
|
29
26
|
### coding: utf-8-unix
|