pio 0.14.0 → 0.15.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 +8 -0
- data/README.md +1 -1
- data/features/port_status_read.feature +24 -0
- data/lib/pio.rb +1 -0
- data/lib/pio/features.rb +13 -1
- data/lib/pio/open_flow/phy_port.rb +19 -0
- data/lib/pio/open_flow/type.rb +1 -0
- data/lib/pio/packet_in.rb +8 -0
- data/lib/pio/port_status.rb +37 -0
- data/lib/pio/version.rb +1 -1
- data/pio.gemspec +1 -1
- metadata +7 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 160b6df4de3e742f9bc613203352993fe5f8b1b9
|
4
|
+
data.tar.gz: a35953dba3610759b5d00e111538523bafb65ac5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b558f6a0be89346665789e8847a221791a03db8381dbcb558b6ae3c8580717d91e7f209353b92bd20f54894d1607e68a815eef68fcd34cc135d5f5a86c0e26ee
|
7
|
+
data.tar.gz: 821b6cecaa878417d2338f6e1d1a801f7f98549b721acadeb8fafd5d48dee98e6a485c5efc222381d1a41de5c2823705b4adad2d6227ca10bbd72ecc9bb6633c
|
data/CHANGELOG.md
CHANGED
@@ -3,6 +3,14 @@
|
|
3
3
|
## develop (unreleased)
|
4
4
|
|
5
5
|
|
6
|
+
## 0.15.0 (2/12/2015)
|
7
|
+
### New features
|
8
|
+
* [#126](https://github.com/trema/pio/pull/126): Add new class `Pio::PortStatus`.
|
9
|
+
* [#126](https://github.com/trema/pio/pull/126): Add new methods `Pio::Type::OpenFlow::PhyPort#up?`, `Pio::Type::OpenFlow::PhyPort#down?`, `Pio::Type::OpenFlow::PhyPort#local?`, `Pio::Type::OpenFlow::PhyPort#datapath_id` and `Pio::Type::OpenFlow::PhyPort#dpid`.
|
10
|
+
* [#126](https://github.com/trema/pio/pull/126): Add new methods `Pio::PacketIn#lldp?`.
|
11
|
+
* [#126](https://github.com/trema/pio/pull/126): Add new methods `Pio::Features::Reply#physical_ports`.
|
12
|
+
|
13
|
+
|
6
14
|
## 0.14.0 (2/9/2015)
|
7
15
|
### New features
|
8
16
|
* [#125](https://github.com/trema/pio/pull/125): Add new accessor methods `Pio::PacketIn#datapath_id` and `Pio::PacketIn#dpid`.
|
data/README.md
CHANGED
@@ -24,6 +24,7 @@ supports the following packet formats:
|
|
24
24
|
- Packet-In
|
25
25
|
- Packet-Out
|
26
26
|
- Flow Mod
|
27
|
+
- Port Status
|
27
28
|
- (…currently there are just a few formats supported but I'm sure this list will grow)
|
28
29
|
|
29
30
|
## Features Overview
|
@@ -384,5 +385,4 @@ and install it by running Bundler:
|
|
384
385
|
## License
|
385
386
|
|
386
387
|
Pio is released under the GNU General Public License version 3.0:
|
387
|
-
|
388
388
|
- <http://www.gnu.org/licenses/gpl.html>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
Feature: Pio::PortStatus.read
|
2
|
+
Scenario: port_status.raw
|
3
|
+
Given a packet data file "port_status.raw"
|
4
|
+
When I try to parse the file with "PortStatus" class
|
5
|
+
Then it should finish successfully
|
6
|
+
And the parsed data have the following field and value:
|
7
|
+
| field | value |
|
8
|
+
| class | Pio::PortStatus |
|
9
|
+
| ofp_version | 1 |
|
10
|
+
| message_type | 12 |
|
11
|
+
| message_length | 64 |
|
12
|
+
| transaction_id | 4 |
|
13
|
+
| xid | 4 |
|
14
|
+
| reason | delete |
|
15
|
+
| desc.port_no | 65533 |
|
16
|
+
| desc.hardware_address | 01:02:03:04:05:06 |
|
17
|
+
| desc.name | foo |
|
18
|
+
| desc.config | [:no_flood] |
|
19
|
+
| desc.state | [:stp_forward, :stp_block] |
|
20
|
+
| desc.curr | [:port_10mb_hd] |
|
21
|
+
| desc.advertised | [:port_1gb_fd] |
|
22
|
+
| desc.supported | [:port_autoneg] |
|
23
|
+
| desc.peer | [:port_pause_asym] |
|
24
|
+
|
data/lib/pio.rb
CHANGED
data/lib/pio/features.rb
CHANGED
@@ -65,7 +65,19 @@ module Pio
|
|
65
65
|
def_delegators :body, :n_tables
|
66
66
|
def_delegators :body, :capabilities
|
67
67
|
def_delegators :body, :actions
|
68
|
-
|
68
|
+
|
69
|
+
def ports
|
70
|
+
body.ports.map do |each|
|
71
|
+
each.datapath_id = datapath_id
|
72
|
+
each
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def physical_ports
|
77
|
+
ports.select do |each|
|
78
|
+
each.port_no <= PortNumber::MAX
|
79
|
+
end
|
80
|
+
end
|
69
81
|
end
|
70
82
|
end
|
71
83
|
end
|
@@ -53,9 +53,28 @@ module Pio
|
|
53
53
|
port_feature :supported
|
54
54
|
port_feature :peer
|
55
55
|
|
56
|
+
attr_accessor :datapath_id
|
57
|
+
alias_method :dpid, :datapath_id
|
58
|
+
|
59
|
+
def number
|
60
|
+
port_no
|
61
|
+
end
|
62
|
+
|
56
63
|
def mac_address
|
57
64
|
hardware_address
|
58
65
|
end
|
66
|
+
|
67
|
+
def up?
|
68
|
+
!down?
|
69
|
+
end
|
70
|
+
|
71
|
+
def down?
|
72
|
+
config.include?(:port_down) || state.include?(:link_down)
|
73
|
+
end
|
74
|
+
|
75
|
+
def local?
|
76
|
+
port_no == PortNumber::NUMBERS[:local]
|
77
|
+
end
|
59
78
|
end
|
60
79
|
end
|
61
80
|
end
|
data/lib/pio/open_flow/type.rb
CHANGED
data/lib/pio/packet_in.rb
CHANGED
@@ -69,6 +69,7 @@ module Pio
|
|
69
69
|
rest :rest
|
70
70
|
end
|
71
71
|
|
72
|
+
# rubocop:disable MethodLength
|
72
73
|
def self.read(raw_data)
|
73
74
|
ethernet_header = EthernetHeaderParser.read(raw_data)
|
74
75
|
case ethernet_header.ether_type
|
@@ -76,10 +77,13 @@ module Pio
|
|
76
77
|
IPv4Packet.read raw_data
|
77
78
|
when 0x0806
|
78
79
|
Pio::Arp.read raw_data
|
80
|
+
when 0x88cc
|
81
|
+
Pio::Lldp.read raw_data
|
79
82
|
else
|
80
83
|
fail 'Failed to parse packet_in data.'
|
81
84
|
end
|
82
85
|
end
|
86
|
+
# rubocop:enable MethodLength
|
83
87
|
end
|
84
88
|
|
85
89
|
attr_accessor :datapath_id
|
@@ -96,6 +100,10 @@ module Pio
|
|
96
100
|
@parsed_data ||= DataParser.read(data)
|
97
101
|
end
|
98
102
|
|
103
|
+
def lldp?
|
104
|
+
parsed_data.is_a? Lldp
|
105
|
+
end
|
106
|
+
|
99
107
|
def source_mac
|
100
108
|
parsed_data.source_mac
|
101
109
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'pio/open_flow'
|
2
|
+
|
3
|
+
module Pio
|
4
|
+
# OpenFlow 1.0 Port Status message
|
5
|
+
class PortStatus < OpenFlow::Message.factory(OpenFlow::Type::PORT_STATUS)
|
6
|
+
# What changed about the physical port
|
7
|
+
class Reason < BinData::Primitive
|
8
|
+
REASONS = { add: 0, delete: 1, modify: 2 }
|
9
|
+
|
10
|
+
uint8 :reason
|
11
|
+
|
12
|
+
def get
|
13
|
+
REASONS.invert.fetch(reason)
|
14
|
+
end
|
15
|
+
|
16
|
+
def set(value)
|
17
|
+
self.reason = REASONS.fetch(value)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Message body of Packet-In.
|
22
|
+
class PortStatusBody < BinData::Record
|
23
|
+
endian :big
|
24
|
+
|
25
|
+
reason :reason
|
26
|
+
uint56 :padding
|
27
|
+
hide :padding
|
28
|
+
phy_port :desc
|
29
|
+
end
|
30
|
+
|
31
|
+
def_delegators :body, :desc
|
32
|
+
|
33
|
+
def reason
|
34
|
+
body.reason.to_s.to_sym
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/pio/version.rb
CHANGED
data/pio.gemspec
CHANGED
@@ -37,7 +37,7 @@ Gem::Specification.new do |gem|
|
|
37
37
|
gem.add_dependency 'bindata', '~> 2.1.0'
|
38
38
|
|
39
39
|
gem.add_development_dependency 'rake'
|
40
|
-
gem.add_development_dependency 'bundler', '~> 1.
|
40
|
+
gem.add_development_dependency 'bundler', '~> 1.8.0'
|
41
41
|
gem.add_development_dependency 'pry', '~> 0.10.1'
|
42
42
|
|
43
43
|
# Guard
|
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.15.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-02-
|
11
|
+
date: 2015-02-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bindata
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - ~>
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 1.
|
47
|
+
version: 1.8.0
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 1.
|
54
|
+
version: 1.8.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: pry
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -435,6 +435,7 @@ files:
|
|
435
435
|
- features/packet_data/vendor_stats_request.raw
|
436
436
|
- features/packet_in_read.feature
|
437
437
|
- features/packet_out_read.feature
|
438
|
+
- features/port_status_read.feature
|
438
439
|
- features/step_definitions/packet_data_steps.rb
|
439
440
|
- features/step_definitions/pending_steps.rb
|
440
441
|
- features/support/env.rb
|
@@ -508,6 +509,7 @@ files:
|
|
508
509
|
- lib/pio/packet_out.rb
|
509
510
|
- lib/pio/parse_error.rb
|
510
511
|
- lib/pio/pcap.rb
|
512
|
+
- lib/pio/port_status.rb
|
511
513
|
- lib/pio/send_out_port.rb
|
512
514
|
- lib/pio/set_eth_addr.rb
|
513
515
|
- lib/pio/set_ip_addr.rb
|
@@ -679,6 +681,7 @@ test_files:
|
|
679
681
|
- features/packet_data/echo_request.raw
|
680
682
|
- features/exact_match.feature
|
681
683
|
- features/icmp_read.feature
|
684
|
+
- features/port_status_read.feature
|
682
685
|
- features/arp_read.feature
|
683
686
|
- features/step_definitions/pending_steps.rb
|
684
687
|
- features/step_definitions/packet_data_steps.rb
|