pio 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
data/spec/pio/lldp_spec.rb
CHANGED
@@ -1,271 +1,244 @@
|
|
1
|
-
#
|
1
|
+
# encoding: utf-8
|
2
|
+
|
2
3
|
require 'pio'
|
3
4
|
|
4
|
-
describe Pio::
|
5
|
-
|
6
|
-
|
7
|
-
Pio::Lldp.new(
|
8
|
-
:dpid => dpid,
|
9
|
-
:port_number => port_number,
|
10
|
-
:source_mac => source_mac,
|
11
|
-
:destination_mac => destination_mac
|
12
|
-
)
|
13
|
-
end
|
5
|
+
describe Pio::LLDP do
|
6
|
+
Then { Pio::LLDP == Pio::Lldp }
|
7
|
+
end
|
14
8
|
|
9
|
+
describe Pio::Lldp do
|
10
|
+
describe '.new' do
|
15
11
|
context 'with :dpid and :port_number' do
|
16
|
-
|
17
|
-
|
18
|
-
let(:source_mac) { nil }
|
19
|
-
let(:destination_mac) { nil }
|
20
|
-
let(:lldp_dump) do
|
21
|
-
[
|
22
|
-
# Destination MAC
|
23
|
-
0x01, 0x80, 0xc2, 0x00, 0x00, 0x0e,
|
24
|
-
# Source MAC
|
25
|
-
0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
|
26
|
-
# Ethertype
|
27
|
-
0x88, 0xcc,
|
28
|
-
# Chassis ID TLV
|
29
|
-
0x02, 0x09, 0x07, 0x00, 0x00, 0x00, 0x19, 0x2f, 0xa7, 0xb2, 0x8d,
|
30
|
-
# Port ID TLV
|
31
|
-
0x04, 0x05, 0x07, 0x00, 0x00, 0x00, 0x01,
|
32
|
-
# Time to live TLV
|
33
|
-
0x06, 0x02, 0x00, 0x78,
|
34
|
-
# End of LLDPDU TLV
|
35
|
-
0x00, 0x00,
|
36
|
-
# Padding
|
37
|
-
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
38
|
-
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
39
|
-
0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
40
|
-
]
|
12
|
+
Given(:lldp) do
|
13
|
+
Pio::Lldp.new(dpid: 0x192fa7b28d, port_number: 1)
|
41
14
|
end
|
42
15
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
16
|
+
describe '#to_binary' do
|
17
|
+
When(:result) { lldp.to_binary }
|
18
|
+
|
19
|
+
Then do
|
20
|
+
result ==
|
21
|
+
[
|
22
|
+
# Destination MAC
|
23
|
+
0x01, 0x80, 0xc2, 0x00, 0x00, 0x0e,
|
24
|
+
# Source MAC
|
25
|
+
0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
|
26
|
+
# Ethertype
|
27
|
+
0x88, 0xcc,
|
28
|
+
# Chassis ID TLV
|
29
|
+
0x02, 0x09, 0x07, 0x00, 0x00, 0x00, 0x19, 0x2f, 0xa7, 0xb2, 0x8d,
|
30
|
+
# Port ID TLV
|
31
|
+
0x04, 0x05, 0x07, 0x00, 0x00, 0x00, 0x01,
|
32
|
+
# Time to live TLV
|
33
|
+
0x06, 0x02, 0x00, 0x78,
|
34
|
+
# End of LLDPDU TLV
|
35
|
+
0x00, 0x00,
|
36
|
+
# Padding
|
37
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
38
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
39
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
40
|
+
].pack('C*')
|
50
41
|
end
|
42
|
+
And { result.size == 64 }
|
51
43
|
end
|
52
44
|
end
|
53
45
|
|
54
46
|
context 'with :dpid, :port_number and :source_mac' do
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
# Destination MAC
|
62
|
-
0x01, 0x80, 0xc2, 0x00, 0x00, 0x0e,
|
63
|
-
# Source MAC
|
64
|
-
0x06, 0x05, 0x04, 0x03, 0x02, 0x01,
|
65
|
-
# Ethertype
|
66
|
-
0x88, 0xcc,
|
67
|
-
# Chassis ID TLV
|
68
|
-
0x02, 0x09, 0x07, 0x00, 0x00, 0x00, 0x19, 0x2f, 0xa7, 0xb2, 0x8d,
|
69
|
-
# Port ID TLV
|
70
|
-
0x04, 0x05, 0x07, 0x00, 0x00, 0x00, 0x01,
|
71
|
-
# Time to live TLV
|
72
|
-
0x06, 0x02, 0x00, 0x78,
|
73
|
-
# End of LLDPDU TLV
|
74
|
-
0x00, 0x00,
|
75
|
-
# Padding
|
76
|
-
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
77
|
-
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
78
|
-
0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
79
|
-
]
|
47
|
+
Given(:lldp) do
|
48
|
+
Pio::Lldp.new(
|
49
|
+
dpid: 0x192fa7b28d,
|
50
|
+
port_number: 1,
|
51
|
+
source_mac: '06:05:04:03:02:01'
|
52
|
+
)
|
80
53
|
end
|
81
54
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
55
|
+
describe '#to_binary' do
|
56
|
+
When(:result) { lldp.to_binary }
|
57
|
+
|
58
|
+
Then do
|
59
|
+
result ==
|
60
|
+
[
|
61
|
+
# Destination MAC
|
62
|
+
0x01, 0x80, 0xc2, 0x00, 0x00, 0x0e,
|
63
|
+
# Source MAC
|
64
|
+
0x06, 0x05, 0x04, 0x03, 0x02, 0x01,
|
65
|
+
# Ethertype
|
66
|
+
0x88, 0xcc,
|
67
|
+
# Chassis ID TLV
|
68
|
+
0x02, 0x09, 0x07, 0x00, 0x00, 0x00, 0x19, 0x2f, 0xa7, 0xb2, 0x8d,
|
69
|
+
# Port ID TLV
|
70
|
+
0x04, 0x05, 0x07, 0x00, 0x00, 0x00, 0x01,
|
71
|
+
# Time to live TLV
|
72
|
+
0x06, 0x02, 0x00, 0x78,
|
73
|
+
# End of LLDPDU TLV
|
74
|
+
0x00, 0x00,
|
75
|
+
# Padding
|
76
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
77
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
78
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
79
|
+
].pack('C*')
|
89
80
|
end
|
81
|
+
And { result.size == 64 }
|
90
82
|
end
|
91
83
|
end
|
92
84
|
|
93
85
|
context 'with :dpid, :port_number, :source_mac and :destination_mac' do
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
|
102
|
-
# Source MAC
|
103
|
-
0x06, 0x05, 0x04, 0x03, 0x02, 0x01,
|
104
|
-
# Ethertype
|
105
|
-
0x88, 0xcc,
|
106
|
-
# Chassis ID TLV
|
107
|
-
0x02, 0x09, 0x07, 0x00, 0x00, 0x00, 0x19, 0x2f, 0xa7, 0xb2, 0x8d,
|
108
|
-
# Port ID TLV
|
109
|
-
0x04, 0x05, 0x07, 0x00, 0x00, 0x00, 0x01,
|
110
|
-
# Time to live TLV
|
111
|
-
0x06, 0x02, 0x00, 0x78,
|
112
|
-
# End of LLDPDU TLV
|
113
|
-
0x00, 0x00,
|
114
|
-
# Padding
|
115
|
-
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
116
|
-
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
117
|
-
0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
118
|
-
]
|
86
|
+
Given(:lldp) do
|
87
|
+
Pio::Lldp.new(
|
88
|
+
dpid: 0x192fa7b28d,
|
89
|
+
port_number: 1,
|
90
|
+
source_mac: '06:05:04:03:02:01',
|
91
|
+
destination_mac: '01:02:03:04:05:06'
|
92
|
+
)
|
119
93
|
end
|
120
94
|
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
95
|
+
describe '#to_binary' do
|
96
|
+
When(:result) { lldp.to_binary }
|
97
|
+
|
98
|
+
Then do
|
99
|
+
result ==
|
100
|
+
[
|
101
|
+
# Destination MAC
|
102
|
+
0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
|
103
|
+
# Source MAC
|
104
|
+
0x06, 0x05, 0x04, 0x03, 0x02, 0x01,
|
105
|
+
# Ethertype
|
106
|
+
0x88, 0xcc,
|
107
|
+
# Chassis ID TLV
|
108
|
+
0x02, 0x09, 0x07, 0x00, 0x00, 0x00, 0x19, 0x2f, 0xa7, 0xb2, 0x8d,
|
109
|
+
# Port ID TLV
|
110
|
+
0x04, 0x05, 0x07, 0x00, 0x00, 0x00, 0x01,
|
111
|
+
# Time to live TLV
|
112
|
+
0x06, 0x02, 0x00, 0x78,
|
113
|
+
# End of LLDPDU TLV
|
114
|
+
0x00, 0x00,
|
115
|
+
# Padding
|
116
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
117
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
118
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
119
|
+
].pack('C*')
|
128
120
|
end
|
121
|
+
And { result.size == 64 }
|
129
122
|
end
|
130
123
|
end
|
131
|
-
|
132
|
-
context 'when :dpid is not set' do
|
133
|
-
let(:dpid) { nil }
|
134
|
-
let(:port_number) { 1 }
|
135
|
-
let(:source_mac) { nil }
|
136
|
-
let(:destination_mac) { nil }
|
137
|
-
|
138
|
-
it { expect { subject }.to raise_error('Invalid DPID: nil') }
|
139
|
-
end
|
140
|
-
|
141
|
-
context 'when :port_number is not set' do
|
142
|
-
let(:dpid) { 0x192fa7b28d }
|
143
|
-
let(:port_number) { nil }
|
144
|
-
let(:source_mac) { nil }
|
145
|
-
let(:destination_mac) { nil }
|
146
|
-
|
147
|
-
it { expect { subject }.to raise_error('Invalid port number: nil') }
|
148
|
-
end
|
149
124
|
end
|
150
125
|
|
151
126
|
context '.read' do
|
152
|
-
|
153
|
-
|
154
|
-
context 'with a minimal LLDP frame' do
|
155
|
-
let(:data) do
|
127
|
+
context 'with a minimum LLDP frame' do
|
128
|
+
Given(:lldp_dump) do
|
156
129
|
[
|
157
130
|
# Destination MAC
|
158
|
-
|
131
|
+
0x01, 0x80, 0xc2, 0x00, 0x00, 0x0e,
|
159
132
|
# Source MAC
|
160
|
-
|
133
|
+
0x00, 0x19, 0x2f, 0xa7, 0xb2, 0x8d,
|
161
134
|
# Ethertype
|
162
|
-
|
135
|
+
0x88, 0xcc,
|
163
136
|
# Chassis ID TLV
|
164
|
-
|
137
|
+
0x02, 0x07, 0x04, 0x00, 0x19, 0x2f, 0xa7, 0xb2, 0x8d,
|
165
138
|
# Port ID TLV
|
166
|
-
|
167
|
-
|
139
|
+
0x04, 0x0d, 0x01, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x20,
|
140
|
+
0x74, 0x6f, 0x20, 0x53, 0x31,
|
168
141
|
# Time to live TLV
|
169
|
-
|
142
|
+
0x06, 0x02, 0x00, 0x78,
|
170
143
|
# End of LLDPDU TLV
|
171
|
-
|
172
|
-
]
|
144
|
+
0x00, 0x00
|
145
|
+
].pack('C*')
|
173
146
|
end
|
174
147
|
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
148
|
+
When(:lldp) { Pio::Lldp.read(lldp_dump) }
|
149
|
+
|
150
|
+
Then { lldp.destination_mac.to_s == '01:80:c2:00:00:0e' }
|
151
|
+
Then { lldp.source_mac.to_s == '00:19:2f:a7:b2:8d' }
|
152
|
+
Then { lldp.ether_type == 0x88cc }
|
153
|
+
Then { lldp.dpid == 0x192fa7b28d }
|
154
|
+
Then { lldp.dpid.class == Fixnum }
|
155
|
+
Then { lldp.chassis_id == 0x192fa7b28d }
|
156
|
+
Then { lldp.port_id == 'Uplink to S1' }
|
157
|
+
Then { lldp.port_number == 'Uplink to S1' }
|
158
|
+
Then { lldp.ttl == 120 }
|
159
|
+
Then { lldp.port_description == nil }
|
160
|
+
Then { lldp.system_name == nil }
|
161
|
+
Then { lldp.system_description == nil }
|
162
|
+
Then { lldp.system_capabilities == nil }
|
163
|
+
Then { lldp.management_address == nil }
|
189
164
|
end
|
190
165
|
|
191
166
|
context 'with a detailed LLDP frame' do
|
192
|
-
|
167
|
+
Given(:lldp_dump) do
|
193
168
|
[
|
194
169
|
# Destination MAC
|
195
|
-
|
170
|
+
0x01, 0x80, 0xc2, 0x00, 0x00, 0x0e,
|
196
171
|
# Source MAC
|
197
|
-
|
172
|
+
0x00, 0x19, 0x2f, 0xa7, 0xb2, 0x8d,
|
198
173
|
# Ethertype
|
199
|
-
|
174
|
+
0x88, 0xcc,
|
200
175
|
# Chassis ID TLV
|
201
|
-
|
176
|
+
0x02, 0x07, 0x04, 0x00, 0x19, 0x2f, 0xa7, 0xb2, 0x8d,
|
202
177
|
# Port ID TLV
|
203
|
-
|
204
|
-
|
178
|
+
0x04, 0x0d, 0x01, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x20,
|
179
|
+
0x74, 0x6f, 0x20, 0x53, 0x31,
|
205
180
|
# Time to live TLV
|
206
|
-
|
181
|
+
0x06, 0x02, 0x00, 0x78,
|
207
182
|
# Port Description
|
208
|
-
|
209
|
-
|
210
|
-
|
183
|
+
0x08, 0x17, 0x53, 0x75, 0x6d, 0x6d, 0x69, 0x74, 0x33, 0x30,
|
184
|
+
0x30, 0x2d, 0x34, 0x38, 0x2d, 0x50, 0x6f, 0x72, 0x74, 0x20,
|
185
|
+
0x31, 0x30, 0x30, 0x31, 0x00,
|
211
186
|
# System Name
|
212
|
-
|
213
|
-
|
187
|
+
0x0a, 0x0d, 0x53, 0x75, 0x6d, 0x6d, 0x69, 0x74, 0x33, 0x30,
|
188
|
+
0x30, 0x2d, 0x34, 0x38, 0x00,
|
214
189
|
# System Description
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
190
|
+
0x0c, 0x4c, 0x53, 0x75, 0x6d, 0x6d, 0x69, 0x74, 0x33, 0x30,
|
191
|
+
0x30, 0x2d, 0x34, 0x38, 0x20, 0x2d, 0x20, 0x56, 0x65, 0x72,
|
192
|
+
0x73, 0x69, 0x6f, 0x6e, 0x20, 0x37, 0x2e, 0x34, 0x65, 0x2e,
|
193
|
+
0x31, 0x20, 0x28, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x20, 0x35,
|
194
|
+
0x29, 0x20, 0x62, 0x79, 0x20, 0x52, 0x65, 0x6c, 0x65, 0x61,
|
195
|
+
0x73, 0x65, 0x5f, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x20,
|
196
|
+
0x30, 0x35, 0x2f, 0x32, 0x37, 0x2f, 0x30, 0x35, 0x20, 0x30,
|
197
|
+
0x34, 0x3a, 0x35, 0x33, 0x3a, 0x31, 0x31, 0x00,
|
223
198
|
# System Capabilities
|
224
|
-
|
199
|
+
0x0e, 0x04, 0x00, 0x14, 0x00, 0x14,
|
225
200
|
# Management Address
|
226
|
-
|
227
|
-
|
201
|
+
0x10, 0x0e, 0x07, 0x06, 0x00, 0x01, 0x30, 0xf9, 0xad, 0xa0,
|
202
|
+
0x02, 0x00, 0x00, 0x03, 0xe9, 0x00,
|
228
203
|
# Organizationally Specific
|
229
|
-
|
204
|
+
0xfe, 0x07, 0x00, 0x12, 0x0f, 0x02, 0x07, 0x01, 0x00,
|
230
205
|
# End of LLDPDU TLV
|
231
|
-
|
232
|
-
]
|
206
|
+
0x00, 0x00
|
207
|
+
].pack('C*')
|
233
208
|
end
|
234
209
|
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
210
|
+
When(:lldp) { Pio::Lldp.read(lldp_dump) }
|
211
|
+
|
212
|
+
Then { lldp.destination_mac.to_s == '01:80:c2:00:00:0e' }
|
213
|
+
Then { lldp.source_mac.to_s == '00:19:2f:a7:b2:8d' }
|
214
|
+
Then { lldp.ether_type == 0x88cc }
|
215
|
+
Then { lldp.dpid == 0x192fa7b28d }
|
216
|
+
Then { lldp.chassis_id == 0x192fa7b28d }
|
217
|
+
Then { lldp.port_id == 'Uplink to S1' }
|
218
|
+
Then { lldp.port_number == 'Uplink to S1' }
|
219
|
+
Then { lldp.ttl == 120 }
|
220
|
+
Then { lldp.port_description == 'Summit300-48-Port 1001' }
|
221
|
+
Then { lldp.system_name == 'Summit300-48' }
|
222
|
+
Then do
|
223
|
+
lldp.system_description ==
|
224
|
+
'Summit300-48 - Version 7.4e.1 (Build 5) ' \
|
225
|
+
'by Release_Master 05/27/05 04:53:11'
|
248
226
|
end
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
227
|
+
Then { lldp.system_capabilities.system_capabilities == 20 }
|
228
|
+
Then { lldp.system_capabilities.enabled_capabilities == 20 }
|
229
|
+
Then do
|
230
|
+
lldp.management_address ==
|
231
|
+
[0x00, 0x01, 0x30, 0xf9, 0xad, 0xa0].pack('C*')
|
253
232
|
end
|
254
|
-
|
255
|
-
|
256
|
-
|
233
|
+
Then { lldp.organizationally_specific.oui == 4623 }
|
234
|
+
Then { lldp.organizationally_specific.subtype == 2 }
|
235
|
+
Then { lldp.organizationally_specific.information == "\a\x01" }
|
257
236
|
end
|
258
237
|
|
259
|
-
context 'with an invalid
|
260
|
-
|
238
|
+
context 'with an invalid LLDP frame' do
|
239
|
+
When(:result) { Pio::Lldp.read('') }
|
261
240
|
|
262
|
-
|
241
|
+
Then { result == Failure(Pio::ParseError, 'End of file reached') }
|
263
242
|
end
|
264
243
|
end
|
265
244
|
end
|
266
|
-
|
267
|
-
### Local variables:
|
268
|
-
### mode: Ruby
|
269
|
-
### coding: utf-8-unix
|
270
|
-
### indent-tabs-mode: nil
|
271
|
-
### End:
|
data/spec/pio/mac_spec.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# coding: utf-8
|
2
2
|
require 'pio/mac'
|
3
3
|
|
4
4
|
describe Pio::Mac do
|
@@ -17,6 +17,7 @@ describe Pio::Mac do
|
|
17
17
|
it { should_not eq 42 }
|
18
18
|
it { should_not eq 'INVALID_MAC_ADDRESS' }
|
19
19
|
end
|
20
|
+
|
20
21
|
describe '#eql?' do
|
21
22
|
it { expect(subject).to eql Pio::Mac.new('11:22:33:44:55:66') }
|
22
23
|
it { expect(subject).to eql '11:22:33:44:55:66' }
|
@@ -45,7 +46,7 @@ describe Pio::Mac do
|
|
45
46
|
|
46
47
|
context 'with reserved address' do
|
47
48
|
(0x0..0xf).each do | each |
|
48
|
-
octet =
|
49
|
+
octet = format('%02x', each)
|
49
50
|
reserved_address = "01:80:c2:00:00:#{ octet }"
|
50
51
|
|
51
52
|
context "when #{ reserved_address }" do
|
@@ -104,9 +105,3 @@ describe Pio::Mac do
|
|
104
105
|
end
|
105
106
|
end
|
106
107
|
end
|
107
|
-
|
108
|
-
### Local variables:
|
109
|
-
### mode: Ruby
|
110
|
-
### coding: utf-8-unix
|
111
|
-
### indent-tabs-mode: nil
|
112
|
-
### End:
|