pio 0.3.0 → 0.4.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/CONTRIBUTING.md +46 -12
- data/README.md +131 -116
- data/Rakefile +7 -92
- data/examples/arp_new.rb +16 -0
- data/examples/arp_read.rb +4 -0
- data/examples/dhcp_new.rb +30 -0
- data/examples/dhcp_read.rb +4 -0
- data/examples/icmp_new.rb +21 -0
- data/examples/icmp_read.rb +4 -0
- data/examples/lldp_new.rb +4 -0
- data/examples/lldp_read.rb +4 -0
- data/lib/pio.rb +6 -12
- data/lib/pio/arp.rb +7 -19
- data/lib/pio/arp/frame.rb +8 -12
- data/lib/pio/arp/message.rb +12 -25
- data/lib/pio/arp/reply.rb +30 -30
- data/lib/pio/arp/request.rb +30 -29
- data/lib/pio/dhcp.rb +58 -0
- data/lib/pio/dhcp/ack.rb +12 -0
- data/lib/pio/dhcp/boot_reply.rb +16 -0
- data/lib/pio/dhcp/boot_reply_options.rb +75 -0
- data/lib/pio/dhcp/boot_request.rb +16 -0
- data/lib/pio/dhcp/boot_request_options.rb +69 -0
- data/lib/pio/dhcp/common_options.rb +71 -0
- data/lib/pio/dhcp/csum_util.rb +83 -0
- data/lib/pio/dhcp/dhcp_field.rb +48 -0
- data/lib/pio/dhcp/dhcp_tlv_options.rb +84 -0
- data/lib/pio/dhcp/discover.rb +12 -0
- data/lib/pio/dhcp/field_util.rb +102 -0
- data/lib/pio/dhcp/frame.rb +95 -0
- data/lib/pio/dhcp/message.rb +79 -0
- data/lib/pio/dhcp/offer.rb +12 -0
- data/lib/pio/dhcp/optional_tlv.rb +74 -0
- data/lib/pio/dhcp/request.rb +12 -0
- data/lib/pio/dhcp/type/dhcp_client_id.rb +21 -0
- data/lib/pio/dhcp/type/dhcp_param_list.rb +22 -0
- data/lib/pio/dhcp/type/dhcp_string.rb +21 -0
- data/lib/pio/icmp.rb +7 -18
- data/lib/pio/icmp/frame.rb +38 -40
- data/lib/pio/icmp/message.rb +10 -61
- data/lib/pio/icmp/options.rb +25 -0
- data/lib/pio/icmp/reply.rb +34 -7
- data/lib/pio/icmp/request.rb +43 -7
- data/lib/pio/ipv4_address.rb +5 -8
- data/lib/pio/lldp.rb +22 -62
- data/lib/pio/lldp/chassis_id_tlv.rb +7 -13
- data/lib/pio/lldp/end_of_lldpdu_value.rb +3 -9
- data/lib/pio/lldp/frame.rb +6 -12
- data/lib/pio/lldp/management_address_value.rb +4 -10
- data/lib/pio/lldp/optional_tlv.rb +5 -10
- data/lib/pio/lldp/options.rb +37 -0
- data/lib/pio/lldp/organizationally_specific_value.rb +2 -8
- data/lib/pio/lldp/port_description_value.rb +2 -8
- data/lib/pio/lldp/port_id_tlv.rb +6 -12
- data/lib/pio/lldp/system_capabilities_value.rb +2 -8
- data/lib/pio/lldp/system_description_value.rb +2 -8
- data/lib/pio/lldp/system_name_value.rb +2 -8
- data/lib/pio/lldp/ttl_tlv.rb +5 -11
- data/lib/pio/mac.rb +4 -9
- data/lib/pio/message_type_selector.rb +22 -0
- data/lib/pio/options.rb +65 -0
- data/lib/pio/parse_error.rb +6 -0
- data/lib/pio/type/ethernet_header.rb +3 -2
- data/lib/pio/type/ip_address.rb +4 -9
- data/lib/pio/type/ipv4_header.rb +12 -17
- data/lib/pio/type/mac_address.rb +5 -10
- data/lib/pio/type/udp_header.rb +18 -0
- data/lib/pio/version.rb +3 -8
- data/pio.gemspec +12 -10
- data/spec/pio/arp/reply/options_spec.rb +145 -0
- data/spec/pio/arp/reply_spec.rb +77 -113
- data/spec/pio/arp/request/options_spec.rb +115 -0
- data/spec/pio/arp/request_spec.rb +74 -96
- data/spec/pio/arp_spec.rb +71 -105
- data/spec/pio/dhcp/ack_spec.rb +189 -0
- data/spec/pio/dhcp/discover_spec.rb +165 -0
- data/spec/pio/dhcp/offer_spec.rb +189 -0
- data/spec/pio/dhcp/request_spec.rb +173 -0
- data/spec/pio/dhcp_spec.rb +609 -0
- data/spec/pio/icmp/reply_spec.rb +102 -95
- data/spec/pio/icmp/request_spec.rb +86 -78
- data/spec/pio/icmp_spec.rb +153 -146
- data/spec/pio/ipv4_address_spec.rb +2 -7
- data/spec/pio/lldp/options_spec.rb +188 -0
- data/spec/pio/lldp_spec.rb +181 -208
- data/spec/pio/mac_spec.rb +3 -8
- data/spec/spec_helper.rb +4 -10
- metadata +69 -17
- data/.gitignore +0 -20
- data/.rspec +0 -3
- data/.rubocop.yml +0 -1
- data/.travis.yml +0 -13
- data/Gemfile +0 -37
- data/Guardfile +0 -24
- data/lib/pio/message_util.rb +0 -19
- data/lib/pio/type/config.reek +0 -4
- data/lib/pio/util.rb +0 -21
- data/pio.org +0 -668
- data/pio.org_archive +0 -943
- data/rubocop-todo.yml +0 -9
@@ -1,4 +1,5 @@
|
|
1
|
-
#
|
1
|
+
# encoding: utf-8
|
2
|
+
|
2
3
|
require 'pio/type/mac_address'
|
3
4
|
|
4
5
|
module Pio
|
@@ -11,7 +12,7 @@ module Pio
|
|
11
12
|
class_eval do
|
12
13
|
mac_address :destination_mac
|
13
14
|
mac_address :source_mac
|
14
|
-
uint16 :ether_type, :
|
15
|
+
uint16 :ether_type, value: options[:ether_type]
|
15
16
|
end
|
16
17
|
end
|
17
18
|
end
|
data/lib/pio/type/ip_address.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
#
|
1
|
+
# encoding: utf-8
|
2
|
+
|
2
3
|
require 'bindata'
|
3
4
|
require 'pio/ipv4_address'
|
4
5
|
|
@@ -6,21 +7,15 @@ module Pio
|
|
6
7
|
module Type
|
7
8
|
# IP address
|
8
9
|
class IpAddress < BinData::Primitive
|
9
|
-
array :octets, :
|
10
|
+
array :octets, type: :uint8, initial_length: 4
|
10
11
|
|
11
12
|
def set(value)
|
12
13
|
self.octets = value
|
13
14
|
end
|
14
15
|
|
15
16
|
def get
|
16
|
-
IPv4Address.new octets.map { | each |
|
17
|
+
IPv4Address.new octets.map { | each | format('%d', each) }.join('.')
|
17
18
|
end
|
18
19
|
end
|
19
20
|
end
|
20
21
|
end
|
21
|
-
|
22
|
-
### Local variables:
|
23
|
-
### mode: Ruby
|
24
|
-
### coding: utf-8-unix
|
25
|
-
### indent-tabs-mode: nil
|
26
|
-
### End:
|
data/lib/pio/type/ipv4_header.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
#
|
1
|
+
# encoding: utf-8
|
2
|
+
|
2
3
|
require 'pio/type/ip_address'
|
3
4
|
|
4
5
|
module Pio
|
@@ -9,18 +10,18 @@ module Pio
|
|
9
10
|
def ipv4_header(options)
|
10
11
|
endian :big
|
11
12
|
class_eval do
|
12
|
-
bit4 :ip_version, :
|
13
|
-
bit4 :ip_header_length, :
|
14
|
-
uint8 :ip_type_of_service, :
|
13
|
+
bit4 :ip_version, initial_value: 0x4
|
14
|
+
bit4 :ip_header_length, initial_value: 0x5
|
15
|
+
uint8 :ip_type_of_service, initial_value: 0
|
15
16
|
uint16be :ip_total_length,
|
16
|
-
:
|
17
|
-
uint16be :ip_identifier, :
|
18
|
-
bit3 :ip_flag, :
|
19
|
-
bit13 :ip_fragment, :
|
20
|
-
uint8 :ip_ttl, :
|
21
|
-
uint8 :ip_protocol, :
|
17
|
+
initial_value: options[:ip_total_length]
|
18
|
+
uint16be :ip_identifier, initial_value: 0
|
19
|
+
bit3 :ip_flag, initial_value: 0
|
20
|
+
bit13 :ip_fragment, initial_value: 0
|
21
|
+
uint8 :ip_ttl, initial_value: 128
|
22
|
+
uint8 :ip_protocol, value: options[:ip_protocol]
|
22
23
|
uint16be :ip_header_checksum,
|
23
|
-
:
|
24
|
+
initial_value: options[:ip_header_checksum]
|
24
25
|
ip_address :ip_source_address
|
25
26
|
ip_address :ip_destination_address
|
26
27
|
end
|
@@ -29,9 +30,3 @@ module Pio
|
|
29
30
|
end
|
30
31
|
end
|
31
32
|
end
|
32
|
-
|
33
|
-
### Local variables:
|
34
|
-
### mode: Ruby
|
35
|
-
### coding: utf-8-unix
|
36
|
-
### indent-tabs-mode: nil
|
37
|
-
### End:
|
data/lib/pio/type/mac_address.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
#
|
1
|
+
# encoding: utf-8
|
2
|
+
|
2
3
|
require 'bindata'
|
3
4
|
require 'pio/mac'
|
4
5
|
|
@@ -6,23 +7,17 @@ module Pio
|
|
6
7
|
module Type
|
7
8
|
# MAC address
|
8
9
|
class MacAddress < BinData::Primitive
|
9
|
-
array :octets, :
|
10
|
+
array :octets, type: :uint8, initial_length: 6
|
10
11
|
|
11
12
|
def set(value)
|
12
|
-
self.octets = value
|
13
|
+
self.octets = value.to_a
|
13
14
|
end
|
14
15
|
|
15
16
|
def get
|
16
17
|
Mac.new(octets.reduce('') do |str, each|
|
17
|
-
str +
|
18
|
+
str + format('%02x', each)
|
18
19
|
end.hex)
|
19
20
|
end
|
20
21
|
end
|
21
22
|
end
|
22
23
|
end
|
23
|
-
|
24
|
-
### Local variables:
|
25
|
-
### mode: Ruby
|
26
|
-
### coding: utf-8-unix
|
27
|
-
### indent-tabs-mode: nil
|
28
|
-
### End:
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Pio
|
4
|
+
module Type
|
5
|
+
# UDP Header Format.
|
6
|
+
module UdpHeader
|
7
|
+
def udp_header(options)
|
8
|
+
endian :big
|
9
|
+
class_eval do
|
10
|
+
uint16be :udp_src_port
|
11
|
+
uint16be :udp_dst_port
|
12
|
+
uint16be :udp_length, initial_value: options[:udp_length]
|
13
|
+
uint16be :udp_checksum, initial_value: options[:udp_checksum]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/pio/version.rb
CHANGED
data/pio.gemspec
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
lib = File.expand_path('../lib', __FILE__)
|
2
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
5
|
require 'pio/version'
|
4
6
|
|
5
|
-
Gem::Specification.new do |
|
7
|
+
Gem::Specification.new do |gem|
|
6
8
|
gem.name = 'pio'
|
7
9
|
gem.version = Pio::VERSION
|
8
10
|
gem.summary = 'Packet parser and generator.'
|
@@ -14,18 +16,18 @@ Gem::Specification.new do | gem |
|
|
14
16
|
gem.email = ['yasuhito@gmail.com']
|
15
17
|
gem.homepage = 'http://github.com/trema/pio'
|
16
18
|
|
17
|
-
gem.files =
|
19
|
+
gem.files = %w(CONTRIBUTING.md LICENSE Rakefile pio.gemspec)
|
20
|
+
gem.files += Dir.glob('lib/**/*.rb')
|
21
|
+
gem.files += Dir.glob('bin/**/*')
|
22
|
+
gem.files += Dir.glob('spec/**/*')
|
23
|
+
gem.files += Dir.glob('examples/**/*')
|
18
24
|
|
19
25
|
gem.require_paths = ['lib']
|
20
26
|
|
21
27
|
gem.extra_rdoc_files = ['README.md']
|
22
|
-
gem.test_files =
|
28
|
+
gem.test_files = Dir.glob('spec/**/*')
|
23
29
|
|
24
|
-
gem.
|
30
|
+
gem.required_ruby_version = '>= 1.9.3'
|
31
|
+
gem.add_dependency 'bindata', '~> 2.0.0'
|
32
|
+
gem.add_development_dependency 'bundler', '~> 1.6.0'
|
25
33
|
end
|
26
|
-
|
27
|
-
### Local variables:
|
28
|
-
### mode: Ruby
|
29
|
-
### coding: utf-8-unix
|
30
|
-
### indent-tabs-mode: nil
|
31
|
-
### End:
|
@@ -0,0 +1,145 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'pio'
|
4
|
+
|
5
|
+
describe Pio::Arp::Reply::Options, '.new' do
|
6
|
+
Given(:mandatory_options) do
|
7
|
+
{
|
8
|
+
source_mac: 0x00169d1d9cc4,
|
9
|
+
destination_mac: 0x002682ebead1,
|
10
|
+
sender_protocol_address: 0xc0a85303,
|
11
|
+
target_protocol_address: 0xc0a853fe
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
context 'with all mandatory options' do
|
16
|
+
Given(:options) do
|
17
|
+
Pio::Arp::Reply::Options.new(mandatory_options)
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '#to_hash' do
|
21
|
+
When(:result) { options.to_hash }
|
22
|
+
|
23
|
+
Then { result[:source_mac] == Pio::Mac.new(0x00169d1d9cc4) }
|
24
|
+
Then { result[:destination_mac] == Pio::Mac.new(0x002682ebead1) }
|
25
|
+
Then do
|
26
|
+
result[:sender_protocol_address] == Pio::IPv4Address.new(0xc0a85303)
|
27
|
+
end
|
28
|
+
Then do
|
29
|
+
result[:target_protocol_address] == Pio::IPv4Address.new(0xc0a853fe)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'when source_mac is not passed' do
|
35
|
+
Given(:user_options) do
|
36
|
+
mandatory_options.delete(:source_mac)
|
37
|
+
mandatory_options
|
38
|
+
end
|
39
|
+
|
40
|
+
When(:result) { Pio::Arp::Reply::Options.new(user_options) }
|
41
|
+
|
42
|
+
Then do
|
43
|
+
result ==
|
44
|
+
Failure(ArgumentError, 'The source_mac option should be passed.')
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context 'with source_mac = nil' do
|
49
|
+
Given(:user_options) do
|
50
|
+
mandatory_options.update(source_mac: nil)
|
51
|
+
mandatory_options
|
52
|
+
end
|
53
|
+
|
54
|
+
When(:result) { Pio::Arp::Reply::Options.new(user_options) }
|
55
|
+
|
56
|
+
Then do
|
57
|
+
result ==
|
58
|
+
Failure(ArgumentError, "The source_mac option shouldn't be nil.")
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
context 'when destination_mac is not passed' do
|
63
|
+
Given(:user_options) do
|
64
|
+
mandatory_options.delete(:destination_mac)
|
65
|
+
mandatory_options
|
66
|
+
end
|
67
|
+
|
68
|
+
When(:result) { Pio::Arp::Reply::Options.new(user_options) }
|
69
|
+
|
70
|
+
Then do
|
71
|
+
result ==
|
72
|
+
Failure(ArgumentError, 'The destination_mac option should be passed.')
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
context 'with destination_mac = nil' do
|
77
|
+
Given(:user_options) do
|
78
|
+
mandatory_options.update(destination_mac: nil)
|
79
|
+
mandatory_options
|
80
|
+
end
|
81
|
+
|
82
|
+
When(:result) { Pio::Arp::Reply::Options.new(user_options) }
|
83
|
+
|
84
|
+
Then do
|
85
|
+
result ==
|
86
|
+
Failure(ArgumentError, "The destination_mac option shouldn't be nil.")
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
context 'when sender_protocol_address is not passed' do
|
91
|
+
Given(:user_options) do
|
92
|
+
mandatory_options.delete(:sender_protocol_address)
|
93
|
+
mandatory_options
|
94
|
+
end
|
95
|
+
|
96
|
+
When(:result) { Pio::Arp::Reply::Options.new(user_options) }
|
97
|
+
|
98
|
+
Then do
|
99
|
+
result == Failure(ArgumentError,
|
100
|
+
'The sender_protocol_address option should be passed.')
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
context 'with sender_protocol_address = nil' do
|
105
|
+
Given(:user_options) do
|
106
|
+
mandatory_options.update(sender_protocol_address: nil)
|
107
|
+
mandatory_options
|
108
|
+
end
|
109
|
+
|
110
|
+
When(:result) { Pio::Arp::Reply::Options.new(user_options) }
|
111
|
+
|
112
|
+
Then do
|
113
|
+
result == Failure(ArgumentError,
|
114
|
+
"The sender_protocol_address option shouldn't be nil.")
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
context 'when target_protocol_address is not passed' do
|
119
|
+
Given(:user_options) do
|
120
|
+
mandatory_options.delete(:target_protocol_address)
|
121
|
+
mandatory_options
|
122
|
+
end
|
123
|
+
|
124
|
+
When(:result) { Pio::Arp::Reply::Options.new(user_options) }
|
125
|
+
|
126
|
+
Then do
|
127
|
+
result == Failure(ArgumentError,
|
128
|
+
'The target_protocol_address option should be passed.')
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
context 'with target_protocol_address = nil' do
|
133
|
+
Given(:user_options) do
|
134
|
+
mandatory_options.update(target_protocol_address: nil)
|
135
|
+
mandatory_options
|
136
|
+
end
|
137
|
+
|
138
|
+
When(:result) { Pio::Arp::Reply::Options.new(user_options) }
|
139
|
+
|
140
|
+
Then do
|
141
|
+
result == Failure(ArgumentError,
|
142
|
+
"The target_protocol_address option shouldn't be nil.")
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
data/spec/pio/arp/reply_spec.rb
CHANGED
@@ -1,137 +1,101 @@
|
|
1
|
-
#
|
2
|
-
require 'pio/arp/reply'
|
1
|
+
# encoding: utf-8
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
require 'pio'
|
4
|
+
|
5
|
+
describe Pio::ARP::Reply do
|
6
|
+
Then { Pio::ARP::Reply == Pio::Arp::Reply }
|
7
|
+
end
|
8
|
+
|
9
|
+
describe Pio::Arp::Reply, '.new' do
|
10
|
+
ARP_REPLY_DUMP =
|
11
|
+
[
|
12
|
+
0x00, 0x26, 0x82, 0xeb, 0xea, 0xd1, # destination mac address
|
13
|
+
0x00, 0x16, 0x9d, 0x1d, 0x9c, 0xc4, # source mac address
|
14
|
+
0x08, 0x06, # ethernet type
|
15
|
+
0x00, 0x01, # arp hardware type
|
16
|
+
0x08, 0x00, # arp protocol type
|
17
|
+
0x06, # hardware address size
|
18
|
+
0x04, # protocol address size
|
19
|
+
0x00, 0x02, # operational code
|
20
|
+
0x00, 0x16, 0x9d, 0x1d, 0x9c, 0xc4, # sender hardware address
|
21
|
+
0xc0, 0xa8, 0x53, 0xfe, # sender protocol address
|
22
|
+
0x00, 0x26, 0x82, 0xeb, 0xea, 0xd1, # target hardware address
|
23
|
+
0xc0, 0xa8, 0x53, 0x03, # target protocol address
|
24
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # padding
|
25
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
26
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
27
|
+
0x00, 0x00, 0x00, 0x00
|
28
|
+
].pack('C*')
|
29
|
+
|
30
|
+
context 'with String MAC and IP address' do
|
31
|
+
Given(:arp_reply) do
|
7
32
|
Pio::Arp::Reply.new(
|
8
|
-
:
|
9
|
-
:
|
10
|
-
:
|
11
|
-
:
|
33
|
+
source_mac: '00:16:9d:1d:9c:c4',
|
34
|
+
destination_mac: '00:26:82:eb:ea:d1',
|
35
|
+
sender_protocol_address: '192.168.83.254',
|
36
|
+
target_protocol_address: '192.168.83.3'
|
12
37
|
)
|
13
38
|
end
|
14
39
|
|
15
|
-
|
16
|
-
|
17
|
-
0x00, 0x26, 0x82, 0xeb, 0xea, 0xd1, # destination mac address
|
18
|
-
0x00, 0x16, 0x9d, 0x1d, 0x9c, 0xc4, # source mac address
|
19
|
-
0x08, 0x06, # ethernet type
|
20
|
-
0x00, 0x01, # arp hardware type
|
21
|
-
0x08, 0x00, # arp protocol type
|
22
|
-
0x06, # hardware address size
|
23
|
-
0x04, # protocol address size
|
24
|
-
0x00, 0x02, # operational code
|
25
|
-
0x00, 0x16, 0x9d, 0x1d, 0x9c, 0xc4, # sender hardware address
|
26
|
-
0xc0, 0xa8, 0x53, 0xfe, # sender protocol address
|
27
|
-
0x00, 0x26, 0x82, 0xeb, 0xea, 0xd1, # target hardware address
|
28
|
-
0xc0, 0xa8, 0x53, 0x03, # target protocol address
|
29
|
-
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # padding
|
30
|
-
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
31
|
-
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
32
|
-
0x00, 0x00, 0x00, 0x00,
|
33
|
-
].pack('C*')
|
34
|
-
end
|
35
|
-
|
36
|
-
context 'with Integer MAC and IP address' do
|
37
|
-
let(:source_mac) { 0x00169d1d9cc4 }
|
38
|
-
let(:destination_mac) { 0x002682ebead1 }
|
39
|
-
let(:sender_protocol_address) { 0xc0a853fe }
|
40
|
-
let(:target_protocol_address) { 0xc0a85303 }
|
41
|
-
|
42
|
-
context '#to_binary' do
|
43
|
-
it 'returns an Arp Reply binary String' do
|
44
|
-
expect(subject.to_binary).to eq arp_reply_dump
|
45
|
-
end
|
40
|
+
describe '#to_binary' do
|
41
|
+
When(:result) { arp_reply.to_binary }
|
46
42
|
|
47
|
-
|
48
|
-
|
49
|
-
end
|
50
|
-
end
|
43
|
+
Then { result == ARP_REPLY_DUMP }
|
44
|
+
And { result.size == 64 }
|
51
45
|
end
|
46
|
+
end
|
52
47
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
expect(subject.to_binary).to eq arp_reply_dump
|
62
|
-
end
|
63
|
-
|
64
|
-
it 'returns a valid ether frame with size = 64' do
|
65
|
-
expect(subject.to_binary.size).to eq 64
|
66
|
-
end
|
67
|
-
end
|
48
|
+
context 'with Integer MAC address and IP address' do
|
49
|
+
Given(:arp_reply) do
|
50
|
+
Pio::Arp::Reply.new(
|
51
|
+
source_mac: 0x00169d1d9cc4,
|
52
|
+
destination_mac: 0x002682ebead1,
|
53
|
+
sender_protocol_address: 0xc0a853fe,
|
54
|
+
target_protocol_address: 0xc0a85303
|
55
|
+
)
|
68
56
|
end
|
69
57
|
|
70
|
-
|
71
|
-
|
72
|
-
let(:destination_mac) { 0x002682ebead1 }
|
73
|
-
let(:sender_protocol_address) { '192.168.83.254' }
|
74
|
-
let(:target_protocol_address) { '192.168.83.3' }
|
58
|
+
describe '#to_binary' do
|
59
|
+
When(:result) { arp_reply.to_binary }
|
75
60
|
|
76
|
-
|
77
|
-
|
78
|
-
expect(subject.to_binary).to eq arp_reply_dump
|
79
|
-
end
|
80
|
-
|
81
|
-
it 'returns a valid ether frame with size = 64' do
|
82
|
-
expect(subject.to_binary.size).to eq 64
|
83
|
-
end
|
84
|
-
end
|
61
|
+
Then { result == ARP_REPLY_DUMP }
|
62
|
+
And { result.size == 64 }
|
85
63
|
end
|
64
|
+
end
|
86
65
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
end
|
66
|
+
context 'with String MAC and Integer IP address' do
|
67
|
+
Given(:arp_reply) do
|
68
|
+
Pio::Arp::Reply.new(
|
69
|
+
source_mac: '00:16:9d:1d:9c:c4',
|
70
|
+
destination_mac: '00:26:82:eb:ea:d1',
|
71
|
+
sender_protocol_address: 0xc0a853fe,
|
72
|
+
target_protocol_address: 0xc0a85303
|
73
|
+
)
|
96
74
|
end
|
97
75
|
|
98
|
-
|
99
|
-
|
100
|
-
let(:destination_mac) { nil }
|
101
|
-
let(:sender_protocol_address) { '192.168.83.3' }
|
102
|
-
let(:target_protocol_address) { '192.168.83.254' }
|
76
|
+
describe '#to_binary' do
|
77
|
+
When(:result) { arp_reply.to_binary }
|
103
78
|
|
104
|
-
|
105
|
-
|
106
|
-
end
|
79
|
+
Then { result == ARP_REPLY_DUMP }
|
80
|
+
And { result.size == 64 }
|
107
81
|
end
|
82
|
+
end
|
108
83
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
end
|
84
|
+
context 'with Integer MAC and String IP address' do
|
85
|
+
Given(:arp_reply) do
|
86
|
+
Pio::Arp::Reply.new(
|
87
|
+
source_mac: 0x00169d1d9cc4,
|
88
|
+
destination_mac: 0x002682ebead1,
|
89
|
+
sender_protocol_address: '192.168.83.254',
|
90
|
+
target_protocol_address: '192.168.83.3'
|
91
|
+
)
|
118
92
|
end
|
119
93
|
|
120
|
-
|
121
|
-
|
122
|
-
let(:destination_mac) { 0x002682ebead1 }
|
123
|
-
let(:sender_protocol_address) { '192.168.83.3' }
|
124
|
-
let(:target_protocol_address) { nil }
|
94
|
+
describe '#to_binary' do
|
95
|
+
When(:result) { arp_reply.to_binary }
|
125
96
|
|
126
|
-
|
127
|
-
|
128
|
-
end
|
97
|
+
Then { result == ARP_REPLY_DUMP }
|
98
|
+
And { result.size == 64 }
|
129
99
|
end
|
130
100
|
end
|
131
101
|
end
|
132
|
-
|
133
|
-
### Local variables:
|
134
|
-
### mode: Ruby
|
135
|
-
### coding: utf-8-unix
|
136
|
-
### indent-tabs-mode: nil
|
137
|
-
### End:
|