pio 0.26.0 → 0.27.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/README.md +20 -13
- data/Rakefile +1 -1
- data/features/open_flow10/aggregate_stats_reply.feature +17 -0
- data/features/open_flow10/aggregate_stats_request.feature +60 -0
- data/features/open_flow10/description_stats_reply.feature +18 -0
- data/features/open_flow10/{desc_stats_reply.raw → description_stats_reply.raw} +0 -0
- data/features/open_flow10/description_stats_request.feature +43 -0
- data/features/open_flow10/{desc_stats_request.raw → description_stats_request.raw} +0 -0
- data/features/open_flow10/nx_flow_mod_add.raw +0 -0
- data/features/open_flow10/nx_flow_mod_delete.raw +0 -0
- data/features/open_flow10/nx_flow_mod_delete_strict.raw +0 -0
- data/features/open_flow10/nx_flow_mod_modify.raw +0 -0
- data/features/open_flow10/nx_flow_mod_modify_strict.raw +0 -0
- data/features/open_flow13/stats_request.feature +19 -0
- data/features/open_flow_read.feature +24 -18
- data/lib/pio/arp/format.rb +1 -0
- data/lib/pio/dhcp/ack.rb +1 -0
- data/lib/pio/icmp/format.rb +1 -0
- data/lib/pio/lldp/chassis_id_tlv.rb +1 -0
- data/lib/pio/lldp/frame.rb +1 -0
- data/lib/pio/open_flow.rb +4 -4
- data/lib/pio/open_flow10.rb +6 -0
- data/lib/pio/open_flow10/aggregate_stats_reply.rb +38 -0
- data/lib/pio/open_flow10/aggregate_stats_request.rb +42 -0
- data/lib/pio/open_flow10/description_stats_reply.rb +35 -0
- data/lib/pio/open_flow10/description_stats_request.rb +36 -0
- data/lib/pio/open_flow10/error/error_type10.rb +19 -17
- data/lib/pio/open_flow10/flow_mod.rb +1 -1
- data/lib/pio/open_flow10/flow_stats_reply.rb +1 -1
- data/lib/pio/open_flow10/flow_stats_request.rb +1 -1
- data/lib/pio/open_flow10/match.rb +1 -1
- data/lib/pio/open_flow10/stats_reply.rb +28 -0
- data/lib/pio/open_flow10/stats_request.rb +28 -0
- data/lib/pio/open_flow13.rb +1 -0
- data/lib/pio/open_flow13/features_reply.rb +4 -4
- data/lib/pio/open_flow13/features_request.rb +0 -4
- data/lib/pio/open_flow13/meter.rb +1 -1
- data/lib/pio/open_flow13/stats_request.rb +53 -0
- data/lib/pio/version.rb +1 -1
- metadata +33 -8
- data/features/step_definitions/Gemfile.lock +0 -76
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4ac567d11a76df3274344c3e5ddb963879f8381a
|
4
|
+
data.tar.gz: 08fdbed8c63e7abf6a75079bdca6f497977e505e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c15052c6d83a106474ef2df7495a583f00e8bbf19a64cea87b743362853dec11da2ee13d87b6cf282626ff215924f9c81179e11dbfa924097d73138c6ef65e26
|
7
|
+
data.tar.gz: 13039d0174785fecc8e0bb1f9ccd1e16390a91b397e021a624a49d1e743b8859f8194fe074b2a994fa78d90ef357e04f50ffc1dd4e384a193907bc7e7597f5ac
|
data/CHANGELOG.md
CHANGED
@@ -3,6 +3,11 @@
|
|
3
3
|
## develop (unreleased)
|
4
4
|
|
5
5
|
|
6
|
+
## 0.27.0 (9/16/2015)
|
7
|
+
### New features
|
8
|
+
* [#203](https://github.com/trema/pio/pull/203): Add new classes `Pio::OpenFlow10::DescriptionStats::Request`, `Pio::OpenFlow10::DescriptionStats::Reply`, `Pio::OpenFlow10::FlowStats::Request`, `Pio::OpenFlow10::FlowStats::Reply`, `Pio::OpenFlow10::AggregateStats::Request`, `Pio::OpenFlow10::AggregateStats::Reply`.
|
9
|
+
|
10
|
+
|
6
11
|
## 0.26.0 (9/8/2015)
|
7
12
|
### New features
|
8
13
|
* [#214](https://github.com/trema/pio/pull/214): Add new class `Pio::OpenFlow10::Error::HelloFailed`.
|
data/README.md
CHANGED
@@ -10,8 +10,21 @@
|
|
10
10
|
|
11
11
|
<a href="http://www.flickr.com/photos/mongogushi/4226014070/" title="pio pencil by mongo gushi, on Flickr"><img src="http://farm5.staticflickr.com/4022/4226014070_cdeb7c1e5d_n.jpg" width="320" height="290" alt="pio pencil"></a>
|
12
12
|
|
13
|
-
Pio is a ruby gem to easily parse and generate network packets.
|
14
|
-
|
13
|
+
Pio is a ruby gem to easily parse and generate network packets.
|
14
|
+
|
15
|
+
## Features Overview
|
16
|
+
|
17
|
+
- Pure Ruby. No additional dependency on other external tools to
|
18
|
+
parse/generate packets.
|
19
|
+
- Multi-Platform. Runs on major operating systems (recent Windows,
|
20
|
+
Linux, and MacOSX).
|
21
|
+
- Clean Code. Pio is built on
|
22
|
+
[BinData](https://github.com/dmendel/bindata)'s declarative binary
|
23
|
+
format DSL so that it is easy to read and debug by human beings.
|
24
|
+
|
25
|
+
## Supported packet formats
|
26
|
+
|
27
|
+
Pio supports the following packet formats:
|
15
28
|
|
16
29
|
- [ICMP](https://relishapp.com/trema/pio/docs/pio-icmp)
|
17
30
|
- [ARP](https://relishapp.com/trema/pio/docs/pio-arp)
|
@@ -33,8 +46,12 @@ supports the following packet formats:
|
|
33
46
|
- [Exact Match](https://relishapp.com/trema/pio/docs/open-flow10/pio-exactmatch)
|
34
47
|
- [Barrier Request](https://relishapp.com/trema/pio/docs/open-flow10/pio-barrier-request)
|
35
48
|
- [Barrier Reply](https://relishapp.com/trema/pio/docs/open-flow10/pio-barrier-reply)
|
49
|
+
- [Description Stats Request](https://relishapp.com/trema/pio/docs/open-flow10/pio-descriptionstats-request)
|
50
|
+
- [Description Stats Reply](https://relishapp.com/trema/pio/docs/open-flow10/pio-descriptionstats-reply)
|
36
51
|
- [Flow Stats Request](https://relishapp.com/trema/pio/docs/open-flow10/pio-flowstats-request)
|
37
52
|
- [Flow Stats Reply](https://relishapp.com/trema/pio/docs/open-flow10/pio-flowstats-reply)
|
53
|
+
- [Aggregate Stats Request](https://relishapp.com/trema/pio/docs/open-flow10/pio-aggregatestats-request)
|
54
|
+
- [Aggregate Stats Reply](https://relishapp.com/trema/pio/docs/open-flow10/pio-aggregatestats-reply)
|
38
55
|
- OpenFlow 1.3
|
39
56
|
- [Hello](https://relishapp.com/trema/pio/docs/open-flow13/pio-hello)
|
40
57
|
- [HelloFailed](https://relishapp.com/trema/pio/docs/open-flow13/pio-error-hellofailed)
|
@@ -47,16 +64,6 @@ supports the following packet formats:
|
|
47
64
|
- [Packet Out](https://relishapp.com/trema/pio/docs/open-flow13/pio-packetout)
|
48
65
|
- [Flow Mod](https://relishapp.com/trema/pio/docs/open-flow13/pio-flowmod)
|
49
66
|
|
50
|
-
## Features Overview
|
51
|
-
|
52
|
-
- Pure Ruby. No additional dependency on other external tools to
|
53
|
-
parse/generate packets.
|
54
|
-
- Multi-Platform. Runs on major operating systems (recent Windows,
|
55
|
-
Linux, and MacOSX).
|
56
|
-
- Clean Code. Pio is built on
|
57
|
-
[BinData](https://github.com/dmendel/bindata)'s declarative binary
|
58
|
-
format DSL so that it is easy to read and debug by human beings.
|
59
|
-
|
60
67
|
## Installation
|
61
68
|
|
62
69
|
The simplest way to install Pio is to use [Bundler](http://gembundler.com/).
|
@@ -75,7 +82,7 @@ bundle
|
|
75
82
|
|
76
83
|
## Documents
|
77
84
|
|
78
|
-
- [API document
|
85
|
+
- [API document](https://relishapp.com/trema/pio/docs)
|
79
86
|
|
80
87
|
## Team
|
81
88
|
|
data/Rakefile
CHANGED
@@ -0,0 +1,17 @@
|
|
1
|
+
@open_flow10
|
2
|
+
Feature: Pio::AggregateStats::Reply
|
3
|
+
Scenario: read
|
4
|
+
When I try to parse a file named "open_flow10/aggregate_stats_reply.raw" with "AggregateStats::Reply" class
|
5
|
+
Then it should finish successfully
|
6
|
+
And the message has the following fields and values:
|
7
|
+
| field | value |
|
8
|
+
| ofp_version | 1 |
|
9
|
+
| message_type | 17 |
|
10
|
+
| length | 36 |
|
11
|
+
| transaction_id | 15 |
|
12
|
+
| xid | 15 |
|
13
|
+
| stats_type | :aggregate |
|
14
|
+
| flags | 0 |
|
15
|
+
| packet_count | 0 |
|
16
|
+
| byte_count | 0 |
|
17
|
+
| flow_count | 0 |
|
@@ -0,0 +1,60 @@
|
|
1
|
+
@open_flow10
|
2
|
+
Feature: Pio::AggregateStats::Request
|
3
|
+
Scenario: new
|
4
|
+
When I try to create an OpenFlow message with:
|
5
|
+
"""
|
6
|
+
Pio::AggregateStats::Request.new(match: Match.new(in_port: 1))
|
7
|
+
"""
|
8
|
+
Then it should finish successfully
|
9
|
+
And the message has the following fields and values:
|
10
|
+
| field | value |
|
11
|
+
| ofp_version | 1 |
|
12
|
+
| message_type | 16 |
|
13
|
+
| length | 56 |
|
14
|
+
| transaction_id | 0 |
|
15
|
+
| xid | 0 |
|
16
|
+
| stats_type | :aggregate |
|
17
|
+
| match.in_port | 1 |
|
18
|
+
| match.wildcards.keys.size | 11 |
|
19
|
+
| match.wildcards.fetch(:ether_destination_address) | true |
|
20
|
+
| match.wildcards.fetch(:ether_source_address) | true |
|
21
|
+
| match.wildcards.fetch(:ether_type) | true |
|
22
|
+
| match.wildcards.fetch(:ip_destination_address_all) | true |
|
23
|
+
| match.wildcards.fetch(:ip_protocol) | true |
|
24
|
+
| match.wildcards.fetch(:ip_source_address_all) | true |
|
25
|
+
| match.wildcards.fetch(:ip_tos) | true |
|
26
|
+
| match.wildcards.fetch(:transport_destination_port) | true |
|
27
|
+
| match.wildcards.fetch(:transport_source_port) | true |
|
28
|
+
| match.wildcards.fetch(:vlan_priority) | true |
|
29
|
+
| match.wildcards.fetch(:vlan_vid) | true |
|
30
|
+
| table_id.to_hex | 0xff |
|
31
|
+
| out_port | :none |
|
32
|
+
|
33
|
+
|
34
|
+
Scenario: read
|
35
|
+
When I try to parse a file named "open_flow10/aggregate_stats_request.raw" with "AggregateStats::Request" class
|
36
|
+
Then it should finish successfully
|
37
|
+
And the message has the following fields and values:
|
38
|
+
| field | value |
|
39
|
+
| ofp_version | 1 |
|
40
|
+
| message_type | 16 |
|
41
|
+
| length | 56 |
|
42
|
+
| transaction_id | 14 |
|
43
|
+
| xid | 14 |
|
44
|
+
| stats_type | :aggregate |
|
45
|
+
| match.wildcards.keys.size | 12 |
|
46
|
+
| match.wildcards.fetch(:ether_destination_address) | true |
|
47
|
+
| match.wildcards.fetch(:ether_source_address) | true |
|
48
|
+
| match.wildcards.fetch(:ether_type) | true |
|
49
|
+
| match.wildcards.fetch(:in_port) | true |
|
50
|
+
| match.wildcards.fetch(:ip_destination_address_all) | true |
|
51
|
+
| match.wildcards.fetch(:ip_protocol) | true |
|
52
|
+
| match.wildcards.fetch(:ip_source_address_all) | true |
|
53
|
+
| match.wildcards.fetch(:ip_tos) | true |
|
54
|
+
| match.wildcards.fetch(:transport_destination_port) | true |
|
55
|
+
| match.wildcards.fetch(:transport_source_port) | true |
|
56
|
+
| match.wildcards.fetch(:vlan_priority) | true |
|
57
|
+
| match.wildcards.fetch(:vlan_vid) | true |
|
58
|
+
| table_id.to_hex | 0xff |
|
59
|
+
| out_port | :none |
|
60
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
@open_flow10
|
2
|
+
Feature: Pio::DescriptionStats::Reply
|
3
|
+
Scenario: read
|
4
|
+
When I try to parse a file named "open_flow10/description_stats_reply.raw" with "DescriptionStats::Reply" class
|
5
|
+
Then it should finish successfully
|
6
|
+
And the message has the following fields and values:
|
7
|
+
| field | value |
|
8
|
+
| ofp_version | 1 |
|
9
|
+
| message_type | 17 |
|
10
|
+
| length | 1068 |
|
11
|
+
| transaction_id | 12 |
|
12
|
+
| xid | 12 |
|
13
|
+
| stats_type | :description |
|
14
|
+
| manufacturer | Nicira, Inc. |
|
15
|
+
| hardware | |
|
16
|
+
| software | |
|
17
|
+
| serial_number | |
|
18
|
+
| datapath | |
|
File without changes
|
@@ -0,0 +1,43 @@
|
|
1
|
+
@open_flow10
|
2
|
+
Feature: Pio::DescriptionStats::Request
|
3
|
+
Scenario: new
|
4
|
+
When I try to create an OpenFlow message with:
|
5
|
+
"""
|
6
|
+
Pio::DescriptionStats::Request.new
|
7
|
+
"""
|
8
|
+
Then it should finish successfully
|
9
|
+
And the message has the following fields and values:
|
10
|
+
| field | value |
|
11
|
+
| ofp_version | 1 |
|
12
|
+
| message_type | 16 |
|
13
|
+
| length | 12 |
|
14
|
+
| transaction_id | 0 |
|
15
|
+
| xid | 0 |
|
16
|
+
| stats_type | :description |
|
17
|
+
|
18
|
+
Scenario: new(transaction_id: 123)
|
19
|
+
When I try to create an OpenFlow message with:
|
20
|
+
"""
|
21
|
+
Pio::DescriptionStats::Request.new(transaction_id: 123)
|
22
|
+
"""
|
23
|
+
Then it should finish successfully
|
24
|
+
And the message has the following fields and values:
|
25
|
+
| field | value |
|
26
|
+
| ofp_version | 1 |
|
27
|
+
| message_type | 16 |
|
28
|
+
| length | 12 |
|
29
|
+
| transaction_id | 123 |
|
30
|
+
| xid | 123 |
|
31
|
+
| stats_type | :description |
|
32
|
+
|
33
|
+
Scenario: read
|
34
|
+
When I try to parse a file named "open_flow10/description_stats_request.raw" with "DescriptionStats::Request" class
|
35
|
+
Then it should finish successfully
|
36
|
+
And the message has the following fields and values:
|
37
|
+
| field | value |
|
38
|
+
| ofp_version | 1 |
|
39
|
+
| message_type | 16 |
|
40
|
+
| length | 12 |
|
41
|
+
| transaction_id | 12 |
|
42
|
+
| xid | 12 |
|
43
|
+
| stats_type | :description |
|
File without changes
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,19 @@
|
|
1
|
+
Feature: Pio::StatsRequest
|
2
|
+
Background:
|
3
|
+
Given I use OpenFlow 1.3
|
4
|
+
|
5
|
+
@wip
|
6
|
+
Scenario: new
|
7
|
+
When I try to create an OpenFlow message with:
|
8
|
+
"""
|
9
|
+
Pio::StatsRequest.new(stats_type: :table)
|
10
|
+
"""
|
11
|
+
Then it should finish successfully
|
12
|
+
And the message has the following fields and values:
|
13
|
+
| field | value |
|
14
|
+
| ofp_version | 4 |
|
15
|
+
| message_type | 16 |
|
16
|
+
| message_length | 12 |
|
17
|
+
| transaction_id | 0 |
|
18
|
+
| xid | 0 |
|
19
|
+
| stats_type | :table |
|
@@ -2,21 +2,27 @@ 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/
|
7
|
-
| open_flow10/
|
8
|
-
|
|
9
|
-
| open_flow10/
|
10
|
-
|
|
11
|
-
| open_flow10/
|
12
|
-
| open_flow10/
|
13
|
-
| open_flow10/
|
14
|
-
| open_flow10/
|
15
|
-
| open_flow10/
|
16
|
-
| open_flow10/
|
17
|
-
| open_flow10/flow_mod_add.raw
|
18
|
-
| open_flow10/
|
19
|
-
| open_flow10/
|
20
|
-
| open_flow10/
|
21
|
-
| open_flow10/flow_stats_request.raw
|
22
|
-
| open_flow10/
|
5
|
+
| raw file | result object |
|
6
|
+
| open_flow10/aggregate_stats_reply.raw | Pio::OpenFlow10::AggregateStats::Reply |
|
7
|
+
| open_flow10/aggregate_stats_request.raw | Pio::OpenFlow10::AggregateStats::Request |
|
8
|
+
| open_flow10/bad_request.raw | Pio::OpenFlow10::Error::BadRequest |
|
9
|
+
| open_flow10/barrier_reply.raw | Pio::OpenFlow10::Barrier::Reply |
|
10
|
+
| open_flow10/barrier_request.raw | Pio::OpenFlow10::Barrier::Request |
|
11
|
+
| open_flow10/description_stats_reply.raw | Pio::OpenFlow10::DescriptionStats::Reply |
|
12
|
+
| open_flow10/description_stats_request.raw | Pio::OpenFlow10::DescriptionStats::Request |
|
13
|
+
| open_flow10/echo_reply.raw | Pio::OpenFlow10::Echo::Reply |
|
14
|
+
| open_flow10/echo_request.raw | Pio::OpenFlow10::Echo::Request |
|
15
|
+
| open_flow10/features_reply.raw | Pio::OpenFlow10::Features::Reply |
|
16
|
+
| open_flow10/features_request.raw | Pio::OpenFlow10::Features::Request |
|
17
|
+
| open_flow10/flow_mod_add.raw | Pio::OpenFlow10::FlowMod |
|
18
|
+
| open_flow10/flow_stats_reply.raw | Pio::OpenFlow10::FlowStats::Reply |
|
19
|
+
| open_flow10/flow_stats_reply.raw | Pio::OpenFlow10::FlowStats::Reply |
|
20
|
+
| open_flow10/flow_stats_request.raw | Pio::OpenFlow10::FlowStats::Request |
|
21
|
+
| open_flow10/flow_stats_request.raw | Pio::OpenFlow10::FlowStats::Request |
|
22
|
+
| open_flow10/hello.raw | Pio::OpenFlow10::Hello |
|
23
|
+
| open_flow10/hello_failed.raw | Pio::OpenFlow10::Error::HelloFailed |
|
24
|
+
| open_flow10/packet_in.raw | Pio::OpenFlow10::PacketIn |
|
25
|
+
| open_flow10/packet_out.raw | Pio::OpenFlow10::PacketOut |
|
26
|
+
| open_flow10/port_status.raw | Pio::OpenFlow10::PortStatus |
|
27
|
+
| open_flow13/bad_request.raw | Pio::OpenFlow13::Error::BadRequest |
|
28
|
+
| open_flow13/hello_failed.raw | Pio::OpenFlow13::Error::HelloFailed |
|
data/lib/pio/arp/format.rb
CHANGED
data/lib/pio/dhcp/ack.rb
CHANGED
data/lib/pio/icmp/format.rb
CHANGED
data/lib/pio/lldp/frame.rb
CHANGED
data/lib/pio/open_flow.rb
CHANGED
@@ -17,8 +17,8 @@ module Pio
|
|
17
17
|
|
18
18
|
def self.switch_version(version)
|
19
19
|
[:Barrier, :Echo, :Features, :FlowMod, :Hello, :Match,
|
20
|
-
:PacketIn, :PacketOut, :SendOutPort, :PortStatus,
|
21
|
-
:FlowStats, :Error].each do |each|
|
20
|
+
:PacketIn, :PacketOut, :SendOutPort, :PortStatus, :Stats,
|
21
|
+
:FlowStats, :DescriptionStats, :AggregateStats, :Error].each do |each|
|
22
22
|
set_message_class_name each, version
|
23
23
|
@version = version.to_s
|
24
24
|
end
|
@@ -37,8 +37,8 @@ module Pio
|
|
37
37
|
12 => Pio::PortStatus,
|
38
38
|
13 => Pio::PacketOut,
|
39
39
|
14 => Pio::FlowMod,
|
40
|
-
16 => Pio::
|
41
|
-
17 => Pio::
|
40
|
+
16 => Pio::Stats::Request,
|
41
|
+
17 => Pio::Stats::Reply,
|
42
42
|
18 => Pio::Barrier::Request,
|
43
43
|
19 => Pio::Barrier::Reply
|
44
44
|
}
|
data/lib/pio/open_flow10.rb
CHANGED
@@ -1,5 +1,9 @@
|
|
1
|
+
require 'pio/open_flow10/aggregate_stats_reply.rb'
|
2
|
+
require 'pio/open_flow10/aggregate_stats_request.rb'
|
1
3
|
require 'pio/open_flow10/barrier_reply'
|
2
4
|
require 'pio/open_flow10/barrier_request'
|
5
|
+
require 'pio/open_flow10/description_stats_reply'
|
6
|
+
require 'pio/open_flow10/description_stats_request'
|
3
7
|
require 'pio/open_flow10/echo'
|
4
8
|
require 'pio/open_flow10/error'
|
5
9
|
require 'pio/open_flow10/error/bad_request'
|
@@ -16,3 +20,5 @@ require 'pio/open_flow10/phy_port16'
|
|
16
20
|
require 'pio/open_flow10/port16'
|
17
21
|
require 'pio/open_flow10/port_status'
|
18
22
|
require 'pio/open_flow10/send_out_port'
|
23
|
+
require 'pio/open_flow10/stats_reply'
|
24
|
+
require 'pio/open_flow10/stats_request'
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'pio/open_flow10/stats_type'
|
2
|
+
|
3
|
+
# Base module.
|
4
|
+
module Pio
|
5
|
+
# OpenFlow 1.0 messages
|
6
|
+
module OpenFlow10
|
7
|
+
# Aggregate Stats messages
|
8
|
+
module AggregateStats
|
9
|
+
# Aggregate Stats Reply message
|
10
|
+
class Reply < OpenFlow::Message
|
11
|
+
# Message body of Flow Stats Request.
|
12
|
+
class Body < BinData::Record
|
13
|
+
endian :big
|
14
|
+
|
15
|
+
stats_type :stats_type, value: -> { :aggregate }
|
16
|
+
uint16 :flags
|
17
|
+
uint64 :packet_count
|
18
|
+
uint64 :byte_count
|
19
|
+
uint32 :flow_count
|
20
|
+
string :padding, length: 4
|
21
|
+
hide :padding
|
22
|
+
|
23
|
+
def length
|
24
|
+
24
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Aggregate Stats Reply message format.
|
29
|
+
class Format < BinData::Record
|
30
|
+
extend OpenFlow::Format
|
31
|
+
|
32
|
+
header version: 1, message_type: 17
|
33
|
+
body :body
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'pio/open_flow10/match'
|
2
|
+
require 'pio/open_flow10/port16'
|
3
|
+
require 'pio/open_flow10/stats_type'
|
4
|
+
|
5
|
+
# Base module.
|
6
|
+
module Pio
|
7
|
+
# OpenFlow 1.0 messages
|
8
|
+
module OpenFlow10
|
9
|
+
# OpenFlow 1.0 Aggregate Stats messages
|
10
|
+
module AggregateStats
|
11
|
+
# OpenFlow 1.0 Aggregate Stats Request message
|
12
|
+
class Request < OpenFlow::Message
|
13
|
+
# Message body of Flow Stats Request.
|
14
|
+
class Body < BinData::Record
|
15
|
+
endian :big
|
16
|
+
|
17
|
+
stats_type :stats_type, value: -> { :aggregate }
|
18
|
+
uint16 :flags
|
19
|
+
match10 :match
|
20
|
+
uint8 :table_id, initial_value: 0xff
|
21
|
+
string :padding, length: 1
|
22
|
+
hide :padding
|
23
|
+
port16 :out_port, initial_value: -> { :none }
|
24
|
+
|
25
|
+
def length
|
26
|
+
48
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# OpenFlow 1.0 Aggregate Stats Request message format.
|
31
|
+
class Format < BinData::Record
|
32
|
+
extend OpenFlow::Format
|
33
|
+
|
34
|
+
header version: 1, message_type: 16
|
35
|
+
body :body
|
36
|
+
end
|
37
|
+
|
38
|
+
body_option :match
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'pio/open_flow10/stats_type'
|
2
|
+
|
3
|
+
# Base module.
|
4
|
+
module Pio
|
5
|
+
# OpenFlow 1.0 messages
|
6
|
+
module OpenFlow10
|
7
|
+
# OpenFlow 1.0 Description Stats messages
|
8
|
+
module DescriptionStats
|
9
|
+
# OpenFlow 1.0 Description Stats Reply message
|
10
|
+
class Reply < OpenFlow::Message
|
11
|
+
# Message body of Flow Stats Reply.
|
12
|
+
class Body < BinData::Record
|
13
|
+
endian :big
|
14
|
+
|
15
|
+
stats_type :stats_type, value: -> { :description }
|
16
|
+
uint16 :flags
|
17
|
+
|
18
|
+
stringz :manufacturer, length: 256
|
19
|
+
stringz :hardware, length: 256
|
20
|
+
stringz :software, length: 256
|
21
|
+
stringz :serial_number, length: 32
|
22
|
+
stringz :datapath, length: 256
|
23
|
+
end
|
24
|
+
|
25
|
+
# OpenFlow 1.0 Description Stats Reply message format.
|
26
|
+
class Format < BinData::Record
|
27
|
+
extend OpenFlow::Format
|
28
|
+
|
29
|
+
header version: 1, message_type: 17
|
30
|
+
body :body
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'pio/open_flow10/stats_type'
|
2
|
+
require 'pio/open_flow/format'
|
3
|
+
require 'pio/open_flow/message'
|
4
|
+
|
5
|
+
# Base module.
|
6
|
+
module Pio
|
7
|
+
# OpenFlow 1.0 messages
|
8
|
+
module OpenFlow10
|
9
|
+
# OpenFlow 1.0 Description Stats messages
|
10
|
+
module DescriptionStats
|
11
|
+
# OpenFlow 1.0 Description Stats Request message
|
12
|
+
class Request < OpenFlow::Message
|
13
|
+
# Message body of Flow Stats Request.
|
14
|
+
class Body < BinData::Record
|
15
|
+
endian :big
|
16
|
+
|
17
|
+
stats_type :stats_type, value: -> { :description }
|
18
|
+
uint16 :flags
|
19
|
+
string :body, value: ''
|
20
|
+
|
21
|
+
def length
|
22
|
+
4
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# OpenFlow 1.0 Description Stats Request message format.
|
27
|
+
class Format < BinData::Record
|
28
|
+
extend OpenFlow::Format
|
29
|
+
|
30
|
+
header version: 1, message_type: 16
|
31
|
+
body :body
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -1,25 +1,27 @@
|
|
1
1
|
module Pio
|
2
2
|
module OpenFlow10
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
3
|
+
module Error
|
4
|
+
# enum ofp_error_type
|
5
|
+
class ErrorType10 < BinData::Primitive
|
6
|
+
ERROR_TYPES = {
|
7
|
+
hello_failed: 0,
|
8
|
+
bad_request: 1,
|
9
|
+
bad_action: 2,
|
10
|
+
flow_mod_failed: 3,
|
11
|
+
port_mod_failed: 4,
|
12
|
+
queue_operation_failed: 5
|
13
|
+
}
|
13
14
|
|
14
|
-
|
15
|
-
|
15
|
+
endian :big
|
16
|
+
uint16 :error_type
|
16
17
|
|
17
|
-
|
18
|
-
|
19
|
-
|
18
|
+
def get
|
19
|
+
ERROR_TYPES.invert.fetch(error_type)
|
20
|
+
end
|
20
21
|
|
21
|
-
|
22
|
-
|
22
|
+
def set(value)
|
23
|
+
self.error_type = ERROR_TYPES.fetch(value)
|
24
|
+
end
|
23
25
|
end
|
24
26
|
end
|
25
27
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Pio
|
2
|
+
module OpenFlow10
|
3
|
+
class Stats
|
4
|
+
# Stats reply parser.
|
5
|
+
class Reply
|
6
|
+
# Stats reply format.
|
7
|
+
class Format < BinData::Record
|
8
|
+
extend OpenFlow::Format
|
9
|
+
|
10
|
+
header version: 1, message_type: 17
|
11
|
+
stats_type :stats_type
|
12
|
+
end
|
13
|
+
|
14
|
+
TYPES = {
|
15
|
+
description: OpenFlow10::DescriptionStats::Reply,
|
16
|
+
flow: OpenFlow10::FlowStats::Reply,
|
17
|
+
aggregate: OpenFlow10::AggregateStats::Reply
|
18
|
+
}
|
19
|
+
|
20
|
+
def self.read(binary)
|
21
|
+
TYPES.fetch(Format.read(binary).stats_type.to_sym).read(binary)
|
22
|
+
rescue KeyError
|
23
|
+
raise "Unknown stats type: #{stats_type}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Pio
|
2
|
+
module OpenFlow10
|
3
|
+
class Stats
|
4
|
+
# Stats request parser.
|
5
|
+
class Request
|
6
|
+
# Stats request format.
|
7
|
+
class Format < BinData::Record
|
8
|
+
extend OpenFlow::Format
|
9
|
+
|
10
|
+
header version: 1, message_type: 16
|
11
|
+
stats_type :stats_type
|
12
|
+
end
|
13
|
+
|
14
|
+
TYPES = {
|
15
|
+
description: OpenFlow10::DescriptionStats::Request,
|
16
|
+
flow: OpenFlow10::FlowStats::Request,
|
17
|
+
aggregate: OpenFlow10::AggregateStats::Request
|
18
|
+
}
|
19
|
+
|
20
|
+
def self.read(binary)
|
21
|
+
TYPES.fetch(Format.read(binary).stats_type.to_sym).read(binary)
|
22
|
+
rescue KeyError
|
23
|
+
raise "Unknown stats type: #{stats_type}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/pio/open_flow13.rb
CHANGED
@@ -36,6 +36,10 @@ module Pio
|
|
36
36
|
capabilities :capabilities
|
37
37
|
uint32 :reserved
|
38
38
|
|
39
|
+
def dpid
|
40
|
+
datapath_id
|
41
|
+
end
|
42
|
+
|
39
43
|
def length
|
40
44
|
24
|
41
45
|
end
|
@@ -45,10 +49,6 @@ module Pio
|
|
45
49
|
|
46
50
|
header version: 4, message_type: 6
|
47
51
|
body :body
|
48
|
-
|
49
|
-
def dpid
|
50
|
-
datapath_id
|
51
|
-
end
|
52
52
|
end
|
53
53
|
|
54
54
|
body_option :dpid
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'pio/open_flow'
|
2
|
+
|
3
|
+
module Pio
|
4
|
+
module OpenFlow13
|
5
|
+
# OpenFlow 1.3 Stats Request message
|
6
|
+
class StatsRequest < OpenFlow::Message
|
7
|
+
# Request type of Stats Request message
|
8
|
+
class StatsType < BinData::Primitive
|
9
|
+
TYPES = [:description,
|
10
|
+
:flow,
|
11
|
+
:aggregate,
|
12
|
+
:table,
|
13
|
+
:port,
|
14
|
+
:queue,
|
15
|
+
:vendor]
|
16
|
+
|
17
|
+
endian :big
|
18
|
+
|
19
|
+
uint16 :stats_type
|
20
|
+
|
21
|
+
def set(value)
|
22
|
+
self.stats_type = TYPES.find_index(value)
|
23
|
+
end
|
24
|
+
|
25
|
+
def get
|
26
|
+
TYPES[stats_type]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# OpenFlow 1.3 Stats Request message body
|
31
|
+
class Body < BinData::Record
|
32
|
+
endian :big
|
33
|
+
|
34
|
+
stats_type :stats_type
|
35
|
+
uint16 :stats_flags
|
36
|
+
|
37
|
+
def length
|
38
|
+
4
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# OpenFlow 1.3 Stats Request message format
|
43
|
+
class Format < BinData::Record
|
44
|
+
extend OpenFlow::Format
|
45
|
+
|
46
|
+
header version: 4, message_type: 16
|
47
|
+
body :body
|
48
|
+
end
|
49
|
+
|
50
|
+
body_option :stats_type
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/lib/pio/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pio
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.27.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yasuhito Takamiya
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-09-
|
11
|
+
date: 2015-09-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bindata
|
@@ -423,7 +423,9 @@ files:
|
|
423
423
|
- features/lldp.detailed.pcap
|
424
424
|
- features/lldp.feature
|
425
425
|
- features/lldp.minimal.pcap
|
426
|
+
- features/open_flow10/aggregate_stats_reply.feature
|
426
427
|
- features/open_flow10/aggregate_stats_reply.raw
|
428
|
+
- features/open_flow10/aggregate_stats_request.feature
|
427
429
|
- features/open_flow10/aggregate_stats_request.raw
|
428
430
|
- features/open_flow10/bad_request.feature
|
429
431
|
- features/open_flow10/bad_request.raw
|
@@ -431,8 +433,10 @@ files:
|
|
431
433
|
- features/open_flow10/barrier_reply.raw
|
432
434
|
- features/open_flow10/barrier_request.feature
|
433
435
|
- features/open_flow10/barrier_request.raw
|
434
|
-
- features/open_flow10/
|
435
|
-
- features/open_flow10/
|
436
|
+
- features/open_flow10/description_stats_reply.feature
|
437
|
+
- features/open_flow10/description_stats_reply.raw
|
438
|
+
- features/open_flow10/description_stats_request.feature
|
439
|
+
- features/open_flow10/description_stats_request.raw
|
436
440
|
- features/open_flow10/echo_reply.feature
|
437
441
|
- features/open_flow10/echo_reply.raw
|
438
442
|
- features/open_flow10/echo_request.feature
|
@@ -461,6 +465,11 @@ files:
|
|
461
465
|
- features/open_flow10/hello.raw
|
462
466
|
- features/open_flow10/hello_failed.feature
|
463
467
|
- features/open_flow10/hello_failed.raw
|
468
|
+
- features/open_flow10/nx_flow_mod_add.raw
|
469
|
+
- features/open_flow10/nx_flow_mod_delete.raw
|
470
|
+
- features/open_flow10/nx_flow_mod_delete_strict.raw
|
471
|
+
- features/open_flow10/nx_flow_mod_modify.raw
|
472
|
+
- features/open_flow10/nx_flow_mod_modify_strict.raw
|
464
473
|
- features/open_flow10/nxast_learn.raw
|
465
474
|
- features/open_flow10/packet_in.feature
|
466
475
|
- features/open_flow10/packet_in.raw
|
@@ -589,13 +598,13 @@ files:
|
|
589
598
|
- features/open_flow13/packet_out.raw
|
590
599
|
- features/open_flow13/send_out_port.feature
|
591
600
|
- features/open_flow13/send_out_port.raw
|
601
|
+
- features/open_flow13/stats_request.feature
|
592
602
|
- features/open_flow13/table_stats_reply.raw
|
593
603
|
- features/open_flow13/table_stats_request.raw
|
594
604
|
- features/open_flow13/write_metadata.feature
|
595
605
|
- features/open_flow_read.feature
|
596
606
|
- features/open_flow_version.feature
|
597
607
|
- features/step_definitions/Gemfile
|
598
|
-
- features/step_definitions/Gemfile.lock
|
599
608
|
- features/step_definitions/Guardfile
|
600
609
|
- features/step_definitions/LICENSE
|
601
610
|
- features/step_definitions/README.md
|
@@ -677,8 +686,12 @@ files:
|
|
677
686
|
- lib/pio/open_flow/transaction_id.rb
|
678
687
|
- lib/pio/open_flow10.rb
|
679
688
|
- lib/pio/open_flow10/actions.rb
|
689
|
+
- lib/pio/open_flow10/aggregate_stats_reply.rb
|
690
|
+
- lib/pio/open_flow10/aggregate_stats_request.rb
|
680
691
|
- lib/pio/open_flow10/barrier_reply.rb
|
681
692
|
- lib/pio/open_flow10/barrier_request.rb
|
693
|
+
- lib/pio/open_flow10/description_stats_reply.rb
|
694
|
+
- lib/pio/open_flow10/description_stats_request.rb
|
682
695
|
- lib/pio/open_flow10/echo.rb
|
683
696
|
- lib/pio/open_flow10/enqueue.rb
|
684
697
|
- lib/pio/open_flow10/error.rb
|
@@ -705,6 +718,8 @@ files:
|
|
705
718
|
- lib/pio/open_flow10/set_vlan.rb
|
706
719
|
- lib/pio/open_flow10/set_vlan_priority.rb
|
707
720
|
- lib/pio/open_flow10/set_vlan_vid.rb
|
721
|
+
- lib/pio/open_flow10/stats_reply.rb
|
722
|
+
- lib/pio/open_flow10/stats_request.rb
|
708
723
|
- lib/pio/open_flow10/stats_type.rb
|
709
724
|
- lib/pio/open_flow10/strip_vlan_header.rb
|
710
725
|
- lib/pio/open_flow10/vendor_action.rb
|
@@ -728,6 +743,7 @@ files:
|
|
728
743
|
- lib/pio/open_flow13/packet_out.rb
|
729
744
|
- lib/pio/open_flow13/port32.rb
|
730
745
|
- lib/pio/open_flow13/send_out_port.rb
|
746
|
+
- lib/pio/open_flow13/stats_request.rb
|
731
747
|
- lib/pio/open_flow13/write_metadata.rb
|
732
748
|
- lib/pio/options.rb
|
733
749
|
- lib/pio/parse_error.rb
|
@@ -892,7 +908,9 @@ test_files:
|
|
892
908
|
- features/lldp.detailed.pcap
|
893
909
|
- features/lldp.feature
|
894
910
|
- features/lldp.minimal.pcap
|
911
|
+
- features/open_flow10/aggregate_stats_reply.feature
|
895
912
|
- features/open_flow10/aggregate_stats_reply.raw
|
913
|
+
- features/open_flow10/aggregate_stats_request.feature
|
896
914
|
- features/open_flow10/aggregate_stats_request.raw
|
897
915
|
- features/open_flow10/bad_request.feature
|
898
916
|
- features/open_flow10/bad_request.raw
|
@@ -900,8 +918,10 @@ test_files:
|
|
900
918
|
- features/open_flow10/barrier_reply.raw
|
901
919
|
- features/open_flow10/barrier_request.feature
|
902
920
|
- features/open_flow10/barrier_request.raw
|
903
|
-
- features/open_flow10/
|
904
|
-
- features/open_flow10/
|
921
|
+
- features/open_flow10/description_stats_reply.feature
|
922
|
+
- features/open_flow10/description_stats_reply.raw
|
923
|
+
- features/open_flow10/description_stats_request.feature
|
924
|
+
- features/open_flow10/description_stats_request.raw
|
905
925
|
- features/open_flow10/echo_reply.feature
|
906
926
|
- features/open_flow10/echo_reply.raw
|
907
927
|
- features/open_flow10/echo_request.feature
|
@@ -930,6 +950,11 @@ test_files:
|
|
930
950
|
- features/open_flow10/hello.raw
|
931
951
|
- features/open_flow10/hello_failed.feature
|
932
952
|
- features/open_flow10/hello_failed.raw
|
953
|
+
- features/open_flow10/nx_flow_mod_add.raw
|
954
|
+
- features/open_flow10/nx_flow_mod_delete.raw
|
955
|
+
- features/open_flow10/nx_flow_mod_delete_strict.raw
|
956
|
+
- features/open_flow10/nx_flow_mod_modify.raw
|
957
|
+
- features/open_flow10/nx_flow_mod_modify_strict.raw
|
933
958
|
- features/open_flow10/nxast_learn.raw
|
934
959
|
- features/open_flow10/packet_in.feature
|
935
960
|
- features/open_flow10/packet_in.raw
|
@@ -1058,6 +1083,7 @@ test_files:
|
|
1058
1083
|
- features/open_flow13/packet_out.raw
|
1059
1084
|
- features/open_flow13/send_out_port.feature
|
1060
1085
|
- features/open_flow13/send_out_port.raw
|
1086
|
+
- features/open_flow13/stats_request.feature
|
1061
1087
|
- features/open_flow13/table_stats_reply.raw
|
1062
1088
|
- features/open_flow13/table_stats_request.raw
|
1063
1089
|
- features/open_flow13/write_metadata.feature
|
@@ -1065,7 +1091,6 @@ test_files:
|
|
1065
1091
|
- features/open_flow_version.feature
|
1066
1092
|
- features/step_definitions/dump_flows_steps.rb
|
1067
1093
|
- features/step_definitions/Gemfile
|
1068
|
-
- features/step_definitions/Gemfile.lock
|
1069
1094
|
- features/step_definitions/Guardfile
|
1070
1095
|
- features/step_definitions/LICENSE
|
1071
1096
|
- features/step_definitions/open_flow_steps.rb
|
@@ -1,76 +0,0 @@
|
|
1
|
-
GEM
|
2
|
-
remote: https://rubygems.org/
|
3
|
-
specs:
|
4
|
-
ast (2.0.0)
|
5
|
-
astrolabe (1.3.0)
|
6
|
-
parser (>= 2.2.0.pre.3, < 3.0)
|
7
|
-
celluloid (0.16.0)
|
8
|
-
timers (~> 4.0.0)
|
9
|
-
coderay (1.1.0)
|
10
|
-
ffi (1.9.8)
|
11
|
-
formatador (0.2.5)
|
12
|
-
guard (2.12.5)
|
13
|
-
formatador (>= 0.2.4)
|
14
|
-
listen (~> 2.7)
|
15
|
-
lumberjack (~> 1.0)
|
16
|
-
nenv (~> 0.1)
|
17
|
-
notiffany (~> 0.0)
|
18
|
-
pry (>= 0.9.12)
|
19
|
-
shellany (~> 0.0)
|
20
|
-
thor (>= 0.18.1)
|
21
|
-
guard-bundler (2.1.0)
|
22
|
-
bundler (~> 1.0)
|
23
|
-
guard (~> 2.2)
|
24
|
-
guard-compat (~> 1.1)
|
25
|
-
guard-compat (1.2.1)
|
26
|
-
guard-rubocop (1.2.0)
|
27
|
-
guard (~> 2.0)
|
28
|
-
rubocop (~> 0.20)
|
29
|
-
hitimes (1.2.2)
|
30
|
-
listen (2.10.0)
|
31
|
-
celluloid (~> 0.16.0)
|
32
|
-
rb-fsevent (>= 0.9.3)
|
33
|
-
rb-inotify (>= 0.9)
|
34
|
-
lumberjack (1.0.9)
|
35
|
-
method_source (0.8.2)
|
36
|
-
nenv (0.2.0)
|
37
|
-
notiffany (0.0.6)
|
38
|
-
nenv (~> 0.1)
|
39
|
-
shellany (~> 0.0)
|
40
|
-
parser (2.2.2.1)
|
41
|
-
ast (>= 1.1, < 3.0)
|
42
|
-
powerpack (0.1.0)
|
43
|
-
pry (0.10.1)
|
44
|
-
coderay (~> 1.1.0)
|
45
|
-
method_source (~> 0.8.1)
|
46
|
-
slop (~> 3.4)
|
47
|
-
rainbow (2.0.0)
|
48
|
-
rake (10.4.2)
|
49
|
-
rb-fsevent (0.9.5)
|
50
|
-
rb-inotify (0.9.5)
|
51
|
-
ffi (>= 0.5.0)
|
52
|
-
rubocop (0.30.1)
|
53
|
-
astrolabe (~> 1.3)
|
54
|
-
parser (>= 2.2.2.1, < 3.0)
|
55
|
-
powerpack (~> 0.1)
|
56
|
-
rainbow (>= 1.99.1, < 3.0)
|
57
|
-
ruby-progressbar (~> 1.4)
|
58
|
-
ruby-progressbar (1.7.5)
|
59
|
-
shellany (0.0.1)
|
60
|
-
slop (3.6.0)
|
61
|
-
thor (0.19.1)
|
62
|
-
timers (4.0.1)
|
63
|
-
hitimes
|
64
|
-
|
65
|
-
PLATFORMS
|
66
|
-
ruby
|
67
|
-
|
68
|
-
DEPENDENCIES
|
69
|
-
guard
|
70
|
-
guard-bundler
|
71
|
-
guard-rubocop
|
72
|
-
rake
|
73
|
-
rubocop
|
74
|
-
|
75
|
-
BUNDLED WITH
|
76
|
-
1.10.6
|