pio 0.24.2 → 0.25.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/CHANGELOG.md +5 -0
- data/README.md +2 -0
- data/bin/byebug +16 -0
- data/features/arp.feature +2 -2
- data/features/dhcp.feature +4 -4
- data/features/icmp.feature +2 -2
- data/features/lldp.feature +1 -1
- data/features/open_flow10/barrier_reply.feature +4 -4
- data/features/open_flow10/barrier_request.feature +4 -4
- data/features/open_flow10/echo_reply.feature +6 -6
- data/features/open_flow10/echo_request.feature +6 -6
- data/features/open_flow10/exact_match.feature +2 -2
- data/features/open_flow10/features_reply.feature +2 -2
- data/features/open_flow10/features_request.feature +4 -4
- data/features/open_flow10/flow_mod.feature +6 -6
- data/features/open_flow10/flow_stats_reply.feature +105 -0
- data/features/open_flow10/flow_stats_request.feature +90 -0
- data/features/open_flow10/hello.feature +4 -4
- data/features/open_flow10/packet_in.feature +2 -2
- data/features/open_flow10/packet_out.feature +1 -1
- data/features/open_flow10/port_status.feature +1 -1
- data/features/open_flow13/apply_actions.feature +3 -3
- data/features/open_flow13/echo_reply.feature +7 -7
- data/features/open_flow13/echo_request.feature +7 -7
- data/features/open_flow13/features_reply.feature +2 -2
- data/features/open_flow13/features_request.feature +4 -4
- data/features/open_flow13/flow_mod.feature +5 -5
- data/features/open_flow13/goto_table.feature +2 -2
- data/features/open_flow13/hello.feature +5 -5
- data/features/open_flow13/match.feature +81 -81
- data/features/open_flow13/meter.feature +2 -2
- data/features/open_flow13/packet_in.feature +3 -3
- data/features/open_flow13/packet_out.feature +3 -3
- data/features/open_flow13/send_out_port.feature +2 -2
- data/features/open_flow13/write_metadata.feature +2 -2
- data/features/open_flow_read.feature +12 -10
- data/features/step_definitions/packet_data_steps.rb +3 -3
- data/lib/pio/open_flow.rb +4 -1
- data/lib/pio/open_flow/message.rb +3 -0
- data/lib/pio/open_flow10.rb +2 -0
- data/lib/pio/open_flow10/flow_mod.rb +1 -16
- data/lib/pio/open_flow10/flow_stats_reply.rb +59 -0
- data/lib/pio/open_flow10/flow_stats_request.rb +64 -0
- data/lib/pio/open_flow10/match.rb +17 -0
- data/lib/pio/open_flow10/stats_type.rb +27 -0
- data/lib/pio/version.rb +1 -1
- data/pio.gemspec +2 -2
- data/spec/pio/open_flow10/flow_stats_reply_spec.rb +39 -0
- data/spec/pio/open_flow10/flow_stats_request_spec.rb +38 -0
- metadata +185 -173
@@ -6,7 +6,7 @@ Feature: Pio::Meter
|
|
6
6
|
Pio::Meter.new(1)
|
7
7
|
"""
|
8
8
|
Then it should finish successfully
|
9
|
-
And the message
|
9
|
+
And the message has the following fields and values:
|
10
10
|
| field | value |
|
11
11
|
| class | Pio::Meter |
|
12
12
|
| instruction_type | 6 |
|
@@ -17,7 +17,7 @@ Feature: Pio::Meter
|
|
17
17
|
Scenario: read
|
18
18
|
When I try to parse a file named "open_flow13/instruction_meter.raw" with "Pio::Meter" class
|
19
19
|
Then it should finish successfully
|
20
|
-
And the message
|
20
|
+
And the message has the following fields and values:
|
21
21
|
| field | value |
|
22
22
|
| class | Pio::Meter |
|
23
23
|
| instruction_type | 6 |
|
@@ -6,7 +6,7 @@ Feature: Pio::PacketIn
|
|
6
6
|
Pio::PacketIn.new
|
7
7
|
"""
|
8
8
|
Then it should finish successfully
|
9
|
-
And the message
|
9
|
+
And the message has the following fields and values:
|
10
10
|
| field | value |
|
11
11
|
| ofp_version | 4 |
|
12
12
|
| message_type | 10 |
|
@@ -36,7 +36,7 @@ Feature: Pio::PacketIn
|
|
36
36
|
Pio::PacketIn.new(raw_data: data_dump)
|
37
37
|
"""
|
38
38
|
Then it should finish successfully
|
39
|
-
And the message
|
39
|
+
And the message has the following fields and values:
|
40
40
|
| field | value |
|
41
41
|
| ofp_version | 4 |
|
42
42
|
| message_length | 94 |
|
@@ -55,7 +55,7 @@ Feature: Pio::PacketIn
|
|
55
55
|
Scenario: read
|
56
56
|
When I try to parse a file named "open_flow13/packet_in.raw" with "PacketIn" class
|
57
57
|
Then it should finish successfully
|
58
|
-
And the message
|
58
|
+
And the message has the following fields and values:
|
59
59
|
| field | value |
|
60
60
|
| ofp_version | 4 |
|
61
61
|
| message_type | 10 |
|
@@ -6,7 +6,7 @@ Feature: Pio::PacketOut
|
|
6
6
|
Pio::PacketOut.new
|
7
7
|
"""
|
8
8
|
Then it should finish successfully
|
9
|
-
And the message
|
9
|
+
And the message has the following fields and values:
|
10
10
|
| field | value |
|
11
11
|
| ofp_version | 4 |
|
12
12
|
| message_type | 13 |
|
@@ -34,7 +34,7 @@ Feature: Pio::PacketOut
|
|
34
34
|
Pio::PacketOut.new(raw_data: data_dump, actions: Pio::SendOutPort.new(1))
|
35
35
|
"""
|
36
36
|
Then it should finish successfully
|
37
|
-
And the message
|
37
|
+
And the message has the following fields and values:
|
38
38
|
| field | value |
|
39
39
|
| ofp_version | 4 |
|
40
40
|
| message_type | 13 |
|
@@ -63,7 +63,7 @@ Feature: Pio::PacketOut
|
|
63
63
|
Scenario: read
|
64
64
|
When I try to parse a file named "open_flow13/packet_out.raw" with "PacketOut" class
|
65
65
|
Then it should finish successfully
|
66
|
-
And the message
|
66
|
+
And the message has the following fields and values:
|
67
67
|
| field | value |
|
68
68
|
| ofp_version | 4 |
|
69
69
|
| message_type | 13 |
|
@@ -6,7 +6,7 @@ Feature: Pio::SendOutPort
|
|
6
6
|
Pio::SendOutPort.new(1)
|
7
7
|
"""
|
8
8
|
Then it should finish successfully
|
9
|
-
And the message
|
9
|
+
And the message has the following fields and values:
|
10
10
|
| field | value |
|
11
11
|
| action_type | 0 |
|
12
12
|
| action_length | 16 |
|
@@ -16,7 +16,7 @@ Feature: Pio::SendOutPort
|
|
16
16
|
Scenario: read
|
17
17
|
When I try to parse a file named "open_flow13/send_out_port.raw" with "Pio::SendOutPort" class
|
18
18
|
Then it should finish successfully
|
19
|
-
And the message
|
19
|
+
And the message has the following fields and values:
|
20
20
|
| field | value |
|
21
21
|
| action_type | 0 |
|
22
22
|
| action_length | 16 |
|
@@ -6,7 +6,7 @@ Feature: Pio::WriteMetadata
|
|
6
6
|
Pio::WriteMetadata.new(metadata: 1)
|
7
7
|
"""
|
8
8
|
Then it should finish successfully
|
9
|
-
And the message
|
9
|
+
And the message has the following fields and values:
|
10
10
|
| field | value |
|
11
11
|
| class | Pio::WriteMetadata |
|
12
12
|
| instruction_type | 2 |
|
@@ -18,7 +18,7 @@ Feature: Pio::WriteMetadata
|
|
18
18
|
Scenario: read
|
19
19
|
When I try to parse a file named "open_flow13/instruction_write_metadata.raw" with "Pio::WriteMetadata" class
|
20
20
|
Then it should finish successfully
|
21
|
-
And the message
|
21
|
+
And the message has the following fields and values:
|
22
22
|
| field | value |
|
23
23
|
| class | Pio::WriteMetadata |
|
24
24
|
| instruction_type | 2 |
|
@@ -2,13 +2,15 @@ Feature: Pio::OpenFlow.read
|
|
2
2
|
Scenario: OpenFlow10
|
3
3
|
Given I switch the Pio::OpenFlow version to "OpenFlow10"
|
4
4
|
Then the following each raw file should be parsed into its corresponding object using OpenFlow.read
|
5
|
-
| raw file
|
6
|
-
| open_flow10/hello.raw
|
7
|
-
| open_flow10/echo_request.raw
|
8
|
-
| open_flow10/echo_reply.raw
|
9
|
-
| open_flow10/features_request.raw
|
10
|
-
| open_flow10/features_reply.raw
|
11
|
-
| open_flow10/packet_in.raw
|
12
|
-
| open_flow10/port_status.raw
|
13
|
-
| open_flow10/barrier_request.raw
|
14
|
-
| open_flow10/barrier_reply.raw
|
5
|
+
| raw file | result object |
|
6
|
+
| open_flow10/hello.raw | Pio::OpenFlow10::Hello |
|
7
|
+
| open_flow10/echo_request.raw | Pio::OpenFlow10::Echo::Request |
|
8
|
+
| open_flow10/echo_reply.raw | Pio::OpenFlow10::Echo::Reply |
|
9
|
+
| open_flow10/features_request.raw | Pio::OpenFlow10::Features::Request |
|
10
|
+
| open_flow10/features_reply.raw | Pio::OpenFlow10::Features::Reply |
|
11
|
+
| open_flow10/packet_in.raw | Pio::OpenFlow10::PacketIn |
|
12
|
+
| open_flow10/port_status.raw | Pio::OpenFlow10::PortStatus |
|
13
|
+
| open_flow10/barrier_request.raw | Pio::OpenFlow10::Barrier::Request |
|
14
|
+
| open_flow10/barrier_reply.raw | Pio::OpenFlow10::Barrier::Reply |
|
15
|
+
| open_flow10/flow_stats_request.raw | Pio::OpenFlow10::FlowStats::Request |
|
16
|
+
| open_flow10/flow_stats_reply.raw | Pio::OpenFlow10::FlowStats::Reply |
|
@@ -44,7 +44,7 @@ Then(/^the message should be a "([^"]*)"$/) do |expected_klass|
|
|
44
44
|
expect(@result.class.to_s).to eq(expected_klass)
|
45
45
|
end
|
46
46
|
|
47
|
-
Then(/^the packet
|
47
|
+
Then(/^the packet has the following fields and values:$/) do |table|
|
48
48
|
table.hashes.each do |each|
|
49
49
|
output = @result.instance_eval("self.#{each['field']}")
|
50
50
|
if /^:/ =~ output.inspect
|
@@ -55,8 +55,8 @@ Then(/^the packet have the following fields and values:$/) do |table|
|
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
58
|
-
Then(/^the message
|
59
|
-
step 'the packet
|
58
|
+
Then(/^the message has the following fields and values:$/) do |table|
|
59
|
+
step 'the packet has the following fields and values:', table
|
60
60
|
end
|
61
61
|
|
62
62
|
# rubocop:disable LineLength
|
data/lib/pio/open_flow.rb
CHANGED
@@ -18,7 +18,8 @@ module Pio
|
|
18
18
|
|
19
19
|
def self.switch_version(version)
|
20
20
|
[:Barrier, :Echo, :Features, :FlowMod, :Hello, :Match,
|
21
|
-
:PacketIn, :PacketOut, :SendOutPort, :PortStatus
|
21
|
+
:PacketIn, :PacketOut, :SendOutPort, :PortStatus,
|
22
|
+
:FlowStats].each do |each|
|
22
23
|
set_message_class_name each, version
|
23
24
|
@version = version.to_s
|
24
25
|
end
|
@@ -34,6 +35,8 @@ module Pio
|
|
34
35
|
6 => Pio::Features::Reply,
|
35
36
|
10 => Pio::PacketIn,
|
36
37
|
12 => Pio::PortStatus,
|
38
|
+
16 => Pio::FlowStats::Request,
|
39
|
+
17 => Pio::FlowStats::Reply,
|
37
40
|
18 => Pio::Barrier::Request,
|
38
41
|
19 => Pio::Barrier::Reply
|
39
42
|
}
|
data/lib/pio/open_flow10.rb
CHANGED
@@ -4,6 +4,8 @@ require 'pio/open_flow10/echo'
|
|
4
4
|
require 'pio/open_flow10/exact_match'
|
5
5
|
require 'pio/open_flow10/features'
|
6
6
|
require 'pio/open_flow10/flow_mod'
|
7
|
+
require 'pio/open_flow10/flow_stats_reply'
|
8
|
+
require 'pio/open_flow10/flow_stats_request'
|
7
9
|
require 'pio/open_flow10/hello'
|
8
10
|
require 'pio/open_flow10/packet_in'
|
9
11
|
require 'pio/open_flow10/packet_out'
|
@@ -31,21 +31,6 @@ module Pio
|
|
31
31
|
|
32
32
|
# Message body of FlowMod.
|
33
33
|
class Body < BinData::Record
|
34
|
-
# Pio::MatchFormat wrapper.
|
35
|
-
class Match < BinData::Primitive
|
36
|
-
endian :big
|
37
|
-
|
38
|
-
string :match, read_length: 40
|
39
|
-
|
40
|
-
def set(object)
|
41
|
-
self.match = object.to_binary_s
|
42
|
-
end
|
43
|
-
|
44
|
-
def get
|
45
|
-
Pio::OpenFlow10::Match.read match
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
34
|
extend OpenFlow::Flags
|
50
35
|
|
51
36
|
flags_16bit :flags,
|
@@ -55,7 +40,7 @@ module Pio
|
|
55
40
|
|
56
41
|
endian :big
|
57
42
|
|
58
|
-
|
43
|
+
match_open_flow10 :match
|
59
44
|
uint64 :cookie
|
60
45
|
command :command
|
61
46
|
uint16 :idle_timeout
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'pio/open_flow10/actions'
|
2
|
+
require 'pio/open_flow10/stats_type'
|
3
|
+
|
4
|
+
# Base module.
|
5
|
+
module Pio
|
6
|
+
# OpenFlow 1.0 messages
|
7
|
+
module OpenFlow10
|
8
|
+
# OpenFlow 1.0 FlowStats messages
|
9
|
+
module FlowStats
|
10
|
+
# OpenFlow 1.0 Flow Stats Reply message
|
11
|
+
class Reply < OpenFlow::Message
|
12
|
+
# Body of reply to Flow Stats Request.
|
13
|
+
class FlowStatsEntry < BinData::Record
|
14
|
+
endian :big
|
15
|
+
|
16
|
+
uint16 :entry_length
|
17
|
+
uint8 :table_id
|
18
|
+
string :padding1, length: 1
|
19
|
+
hide :padding1
|
20
|
+
match_open_flow10 :match
|
21
|
+
uint32 :duration_sec
|
22
|
+
uint32 :duration_nsec
|
23
|
+
uint16 :priority
|
24
|
+
uint16 :idle_timeout
|
25
|
+
uint16 :hard_timeout
|
26
|
+
string :padding2, length: 6
|
27
|
+
hide :padding2
|
28
|
+
uint64 :cookie
|
29
|
+
uint64 :packet_count
|
30
|
+
uint64 :byte_count
|
31
|
+
actions :actions, length: -> { entry_length - 88 }
|
32
|
+
end
|
33
|
+
|
34
|
+
# Message body of Flow Stats Reply.
|
35
|
+
class Body < BinData::Record
|
36
|
+
endian :big
|
37
|
+
|
38
|
+
stats_type :stats_type, value: -> { :flow }
|
39
|
+
uint16 :flags
|
40
|
+
array(:stats,
|
41
|
+
type: :flow_stats_entry,
|
42
|
+
read_until: :eof)
|
43
|
+
|
44
|
+
def length
|
45
|
+
4 + stats.to_binary_s.length
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# OpenFlow 1.0 Flow Stats Reply message format.
|
50
|
+
class Format < BinData::Record
|
51
|
+
extend OpenFlow::Format
|
52
|
+
|
53
|
+
header version: 1, message_type: 17
|
54
|
+
body :body
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'pio/open_flow10/match'
|
2
|
+
require 'pio/open_flow10/stats_type'
|
3
|
+
require 'pio/open_flow/format'
|
4
|
+
require 'pio/open_flow/message'
|
5
|
+
|
6
|
+
# Base module.
|
7
|
+
module Pio
|
8
|
+
# OpenFlow 1.0 messages
|
9
|
+
module OpenFlow10
|
10
|
+
# OpenFlow 1.0 FlowStats messages
|
11
|
+
module FlowStats
|
12
|
+
# OpenFlow 1.0 Flow Stats Request message
|
13
|
+
class Request < OpenFlow::Message
|
14
|
+
# Body for Stats Request of type :flow
|
15
|
+
class FlowStatsRequestBody < BinData::Record
|
16
|
+
endian :big
|
17
|
+
|
18
|
+
match_open_flow10 :match
|
19
|
+
uint8 :table_id, initial_value: 0xff
|
20
|
+
string :padding, length: 1
|
21
|
+
hide :padding
|
22
|
+
port_number :out_port, initial_value: -> { :none }
|
23
|
+
end
|
24
|
+
|
25
|
+
# Message body of Flow Stats Request.
|
26
|
+
class Body < BinData::Record
|
27
|
+
endian :big
|
28
|
+
|
29
|
+
stats_type :stats_type, value: -> { :flow }
|
30
|
+
uint16 :flags
|
31
|
+
choice :stats_request_body, selection: -> { stats_type.to_s } do
|
32
|
+
flow_stats_request_body 'flow'
|
33
|
+
string :default
|
34
|
+
end
|
35
|
+
|
36
|
+
def length
|
37
|
+
48
|
38
|
+
end
|
39
|
+
|
40
|
+
def method_missing(method, *args, &block)
|
41
|
+
stats_request_body.__send__(method, *args, &block)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# OpenFlow 1.0 Flow Stats Request message format.
|
46
|
+
class Format < BinData::Record
|
47
|
+
extend OpenFlow::Format
|
48
|
+
|
49
|
+
header version: 1, message_type: 16
|
50
|
+
body :body
|
51
|
+
end
|
52
|
+
|
53
|
+
body_option :match
|
54
|
+
|
55
|
+
def initialize(user_options = {})
|
56
|
+
validate_user_options user_options
|
57
|
+
header_options = parse_header_options(user_options)
|
58
|
+
@format = Format.new(header: header_options,
|
59
|
+
body: { stats_request_body: user_options })
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -161,5 +161,22 @@ module Pio
|
|
161
161
|
@format.__send__ method, *args, &block
|
162
162
|
end
|
163
163
|
end
|
164
|
+
|
165
|
+
# Pio::MatchFormat wrapper.
|
166
|
+
class MatchOpenFlow10 < BinData::Primitive
|
167
|
+
endian :big
|
168
|
+
|
169
|
+
string :match,
|
170
|
+
read_length: 40,
|
171
|
+
initial_value: Pio::OpenFlow10::Match.new.to_binary_s
|
172
|
+
|
173
|
+
def set(object)
|
174
|
+
self.match = object.to_binary_s
|
175
|
+
end
|
176
|
+
|
177
|
+
def get
|
178
|
+
Pio::OpenFlow10::Match.read match
|
179
|
+
end
|
180
|
+
end
|
164
181
|
end
|
165
182
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Pio
|
2
|
+
module OpenFlow10
|
3
|
+
# enum ofp_stats_types
|
4
|
+
class StatsType < BinData::Primitive
|
5
|
+
STATS_TYPES = {
|
6
|
+
description: 0,
|
7
|
+
flow: 1,
|
8
|
+
aggregate: 2,
|
9
|
+
table: 3,
|
10
|
+
port: 4,
|
11
|
+
queue: 5,
|
12
|
+
vendor: 0xffff
|
13
|
+
}
|
14
|
+
|
15
|
+
endian :big
|
16
|
+
uint16 :command
|
17
|
+
|
18
|
+
def get
|
19
|
+
STATS_TYPES.invert.fetch(command)
|
20
|
+
end
|
21
|
+
|
22
|
+
def set(value)
|
23
|
+
self.command = STATS_TYPES.fetch(value)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/pio/version.rb
CHANGED
data/pio.gemspec
CHANGED
@@ -38,7 +38,7 @@ Gem::Specification.new do |gem|
|
|
38
38
|
gem.add_development_dependency 'guard', '~> 2.13.0'
|
39
39
|
gem.add_development_dependency 'guard-bundler', '~> 2.1.0'
|
40
40
|
gem.add_development_dependency 'guard-cucumber', '~> 1.6.0'
|
41
|
-
gem.add_development_dependency 'guard-rspec', '~> 4.6.
|
41
|
+
gem.add_development_dependency 'guard-rspec', '~> 4.6.4'
|
42
42
|
gem.add_development_dependency 'guard-rubocop', '~> 1.2.0'
|
43
43
|
gem.add_development_dependency 'rb-fchange', '~> 0.0.6'
|
44
44
|
gem.add_development_dependency 'rb-fsevent', '~> 0.9.5'
|
@@ -59,5 +59,5 @@ Gem::Specification.new do |gem|
|
|
59
59
|
gem.add_development_dependency 'reek', '~> 3.1'
|
60
60
|
gem.add_development_dependency 'rspec', '~> 3.3.0'
|
61
61
|
gem.add_development_dependency 'rspec-given', '~> 3.7.1'
|
62
|
-
gem.add_development_dependency 'rubocop', '~> 0.
|
62
|
+
gem.add_development_dependency 'rubocop', '~> 0.33.0'
|
63
63
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'pio/open_flow10/flow_stats_reply'
|
2
|
+
|
3
|
+
describe Pio::OpenFlow10::FlowStats::Reply do
|
4
|
+
describe '.read' do
|
5
|
+
context 'with a Flow Stats Reply binary' do
|
6
|
+
Given(:binary) do
|
7
|
+
[0x01, 0x11, 0x00, 0xe4, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01,
|
8
|
+
0x00, 0x00, 0x00, 0x68, 0x03, 0x00, 0x00, 0x3f, 0xff, 0xff,
|
9
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
10
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
11
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
12
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
|
13
|
+
0x00, 0x00, 0x00, 0x02, 0x00, 0x64, 0x00, 0x05, 0x00, 0x0a,
|
14
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x23, 0x45, 0x67,
|
15
|
+
0x89, 0xab, 0xcd, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
16
|
+
0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xe8,
|
17
|
+
0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
|
18
|
+
0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x70, 0x04, 0x00,
|
19
|
+
0x00, 0x3f, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
20
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
21
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
22
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
23
|
+
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x64,
|
24
|
+
0x00, 0x05, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
25
|
+
0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x00, 0x00,
|
26
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00,
|
27
|
+
0x00, 0x00, 0x03, 0xe8, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01,
|
28
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00,
|
29
|
+
0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0x00, 0x00].pack('C*')
|
30
|
+
end
|
31
|
+
|
32
|
+
When(:flow_stats_reply) do
|
33
|
+
Pio::OpenFlow10::FlowStats::Reply.read(binary)
|
34
|
+
end
|
35
|
+
|
36
|
+
Then { flow_stats_reply.class == Pio::OpenFlow10::FlowStats::Reply }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|