pio 0.27.1 → 0.27.2

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.
Files changed (111) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -0
  3. data/Rakefile +1 -1
  4. data/bin/{terminal-notifier → code_metrics} +2 -2
  5. data/bin/code_metrics-profile +16 -0
  6. data/features/icmpv6.pcap +0 -0
  7. data/features/open_flow10/aggregate_stats_reply.feature +1 -1
  8. data/features/open_flow10/aggregate_stats_request.feature +2 -2
  9. data/features/open_flow10/bad_request.feature +2 -2
  10. data/features/open_flow10/barrier_reply.feature +3 -18
  11. data/features/open_flow10/barrier_request.feature +3 -18
  12. data/features/open_flow10/description_stats_reply.feature +1 -1
  13. data/features/open_flow10/description_stats_request.feature +3 -3
  14. data/features/open_flow10/echo_reply.feature +4 -47
  15. data/features/open_flow10/echo_request.feature +4 -36
  16. data/features/open_flow10/exact_match.feature +20 -2
  17. data/features/open_flow10/features_reply.feature +65 -72
  18. data/features/open_flow10/features_request.feature +3 -22
  19. data/features/open_flow10/flow_mod.feature +5 -5
  20. data/features/open_flow10/flow_stats_reply.feature +2 -2
  21. data/features/open_flow10/flow_stats_request.feature +3 -4
  22. data/features/open_flow10/hello.feature +4 -20
  23. data/features/open_flow10/hello_failed.feature +4 -4
  24. data/features/open_flow10/packet_in.feature +2 -2
  25. data/features/open_flow10/packet_in_arp_reply.raw +0 -0
  26. data/features/open_flow10/packet_out.feature +1 -1
  27. data/features/open_flow10/port_status.feature +1 -1
  28. data/features/open_flow13/bad_request.feature +2 -2
  29. data/features/open_flow13/echo_reply.feature +5 -37
  30. data/features/open_flow13/echo_request.feature +5 -37
  31. data/features/open_flow13/features_reply.feature +3 -7
  32. data/features/open_flow13/features_request.feature +3 -18
  33. data/features/open_flow13/flow_mod.feature +5 -5
  34. data/features/open_flow13/hello.feature +4 -19
  35. data/features/open_flow13/hello_failed.feature +4 -4
  36. data/features/open_flow13/match.feature +4 -4
  37. data/features/open_flow13/packet_in.feature +3 -3
  38. data/features/open_flow13/packet_out.feature +3 -3
  39. data/features/parser.feature +10 -0
  40. data/lib/pio/arp/format.rb +20 -0
  41. data/lib/pio/ipv4_header.rb +20 -0
  42. data/lib/pio/open_flow.rb +0 -1
  43. data/lib/pio/open_flow/message.rb +51 -57
  44. data/lib/pio/open_flow/open_flow_header.rb +6 -10
  45. data/lib/pio/open_flow10.rb +20 -15
  46. data/lib/pio/open_flow10/aggregate_stats/reply.rb +20 -0
  47. data/lib/pio/open_flow10/aggregate_stats/request.rb +25 -0
  48. data/lib/pio/open_flow10/barrier/reply.rb +14 -0
  49. data/lib/pio/open_flow10/barrier/request.rb +14 -0
  50. data/lib/pio/open_flow10/description_stats/reply.rb +21 -0
  51. data/lib/pio/open_flow10/description_stats/request.rb +19 -0
  52. data/lib/pio/open_flow10/echo/reply.rb +16 -0
  53. data/lib/pio/open_flow10/echo/request.rb +16 -0
  54. data/lib/pio/open_flow10/error/bad_request.rb +27 -49
  55. data/lib/pio/open_flow10/error/hello_failed.rb +6 -28
  56. data/lib/pio/open_flow10/exact_match.rb +4 -39
  57. data/lib/pio/open_flow10/features/reply.rb +48 -72
  58. data/lib/pio/open_flow10/features/request.rb +4 -11
  59. data/lib/pio/open_flow10/flow_mod.rb +21 -51
  60. data/lib/pio/open_flow10/{flow_stats_reply.rb → flow_stats/reply.rb} +7 -23
  61. data/lib/pio/open_flow10/flow_stats/request.rb +25 -0
  62. data/lib/pio/open_flow10/hello.rb +3 -13
  63. data/lib/pio/open_flow10/match.rb +0 -18
  64. data/lib/pio/open_flow10/match10.rb +22 -0
  65. data/lib/pio/open_flow10/packet_in.rb +18 -42
  66. data/lib/pio/open_flow10/packet_out.rb +8 -31
  67. data/lib/pio/open_flow10/port_status.rb +11 -39
  68. data/lib/pio/open_flow10/stats_reply.rb +11 -8
  69. data/lib/pio/open_flow10/stats_request.rb +8 -8
  70. data/lib/pio/open_flow13.rb +13 -6
  71. data/lib/pio/open_flow13/echo/reply.rb +15 -0
  72. data/lib/pio/open_flow13/echo/request.rb +15 -0
  73. data/lib/pio/open_flow13/error/bad_request.rb +32 -49
  74. data/lib/pio/open_flow13/error/hello_failed.rb +7 -30
  75. data/lib/pio/open_flow13/features/reply.rb +27 -51
  76. data/lib/pio/open_flow13/features/request.rb +3 -10
  77. data/lib/pio/open_flow13/flow_mod.rb +29 -52
  78. data/lib/pio/open_flow13/hello.rb +18 -22
  79. data/lib/pio/open_flow13/packet_in.rb +26 -44
  80. data/lib/pio/open_flow13/packet_out.rb +16 -35
  81. data/lib/pio/open_flow13/stats_request.rb +5 -21
  82. data/lib/pio/parser.rb +5 -4
  83. data/lib/pio/version.rb +1 -1
  84. data/pio.gemspec +6 -6
  85. data/spec/pio/open_flow10/{echo_reply_spec.rb → echo/reply_spec.rb} +1 -1
  86. data/spec/pio/open_flow10/{echo_request_spec.rb → echo/request_spec.rb} +1 -1
  87. data/spec/pio/open_flow10/error/hello_failed_spec.rb +2 -2
  88. data/spec/pio/open_flow10/features/request_spec.rb +0 -5
  89. data/spec/pio/open_flow10/flow_mod_spec.rb +2 -4
  90. data/spec/pio/open_flow10/flow_stats_reply_spec.rb +1 -1
  91. data/spec/pio/open_flow10/flow_stats_request_spec.rb +2 -2
  92. data/spec/pio/open_flow10/packet_out_spec.rb +15 -18
  93. data/spec/pio/open_flow13/echo_reply_spec.rb +1 -1
  94. data/spec/pio/open_flow13/echo_request_spec.rb +1 -1
  95. data/spec/pio/open_flow13/error/hello_failed_spec.rb +2 -2
  96. data/spec/pio/open_flow13/features/request_spec.rb +5 -3
  97. data/spec/pio/open_flow13/hello_spec.rb +3 -3
  98. data/spec/support/shared_examples_for_openflow_messages.rb +5 -12
  99. metadata +92 -85
  100. data/lib/pio/open_flow/echo.rb +0 -44
  101. data/lib/pio/open_flow/format.rb +0 -46
  102. data/lib/pio/open_flow10/aggregate_stats_reply.rb +0 -38
  103. data/lib/pio/open_flow10/aggregate_stats_request.rb +0 -42
  104. data/lib/pio/open_flow10/barrier_reply.rb +0 -21
  105. data/lib/pio/open_flow10/barrier_request.rb +0 -22
  106. data/lib/pio/open_flow10/description_stats_reply.rb +0 -35
  107. data/lib/pio/open_flow10/description_stats_request.rb +0 -36
  108. data/lib/pio/open_flow10/echo.rb +0 -20
  109. data/lib/pio/open_flow10/flow_stats_request.rb +0 -64
  110. data/lib/pio/open_flow13/echo.rb +0 -20
  111. data/lib/pio/open_flow13/features.rb +0 -2
@@ -1,4 +1,4 @@
1
- require 'pio/open_flow'
1
+ require 'pio/open_flow/message'
2
2
 
3
3
  module Pio
4
4
  module OpenFlow10
@@ -6,17 +6,10 @@ module Pio
6
6
  class Features
7
7
  # Features Request message.
8
8
  class Request < OpenFlow::Message
9
- # Features Request message format.
10
- class Format < BinData::Record
11
- extend OpenFlow::Format
9
+ open_flow_header version: 1, message_type: 5
10
+ string :body, length: 0
12
11
 
13
- header version: 1, message_type: 5
14
- string :body, value: ''
15
-
16
- def user_data
17
- body
18
- end
19
- end
12
+ alias_method :user_data, :body
20
13
  end
21
14
  end
22
15
  end
@@ -1,8 +1,7 @@
1
1
  require 'pio/open_flow'
2
2
  require 'pio/open_flow10/actions'
3
- require 'pio/open_flow10/match'
3
+ require 'pio/open_flow10/match10'
4
4
 
5
- # Base module.
6
5
  module Pio
7
6
  module OpenFlow10
8
7
  # OpenFlow 1.0 Flow Mod message.
@@ -29,55 +28,26 @@ module Pio
29
28
  end
30
29
  end
31
30
 
32
- # Message body of FlowMod.
33
- class Body < BinData::Record
34
- extend OpenFlow::Flags
35
-
36
- flags_16bit :flags,
37
- [:send_flow_rem,
38
- :check_overwrap,
39
- :emerg]
40
-
41
- endian :big
42
-
43
- match10 :match
44
- uint64 :cookie
45
- command :command
46
- uint16 :idle_timeout
47
- uint16 :hard_timeout
48
- uint16 :priority
49
- uint32 :buffer_id
50
- uint16 :out_port
51
- flags :flags
52
- actions :actions, length: -> { header.length - 72 }
53
-
54
- def empty?
55
- false
56
- end
57
-
58
- def length
59
- 64 + actions.binary.length
60
- end
61
- end
62
-
63
- # OpenFlow 1.0 Flow Mod message format.
64
- class Format < BinData::Record
65
- extend OpenFlow::Format
66
-
67
- header version: 1, message_type: 14
68
- body :body
69
- end
70
-
71
- body_option :actions
72
- body_option :buffer_id
73
- body_option :command
74
- body_option :cookie
75
- body_option :flags
76
- body_option :hard_timeout
77
- body_option :idle_timeout
78
- body_option :match
79
- body_option :out_port
80
- body_option :priority
31
+ extend OpenFlow::Flags
32
+
33
+ flags_16bit :flags,
34
+ [:send_flow_rem,
35
+ :check_overwrap,
36
+ :emerg]
37
+
38
+ open_flow_header version: 1,
39
+ message_type: 14,
40
+ message_length: -> { 72 + actions.binary.length }
41
+ match10 :match
42
+ uint64 :cookie
43
+ command :command
44
+ uint16 :idle_timeout
45
+ uint16 :hard_timeout
46
+ uint16 :priority
47
+ uint32 :buffer_id
48
+ uint16 :out_port
49
+ flags :flags
50
+ actions :actions, length: -> { message_length - 72 }
81
51
  end
82
52
  end
83
53
  end
@@ -1,9 +1,8 @@
1
1
  require 'pio/open_flow10/actions'
2
+ require 'pio/open_flow10/match10'
2
3
  require 'pio/open_flow10/stats_type'
3
4
 
4
- # Base module.
5
5
  module Pio
6
- # OpenFlow 1.0 messages
7
6
  module OpenFlow10
8
7
  # OpenFlow 1.0 FlowStats messages
9
8
  module FlowStats
@@ -31,28 +30,13 @@ module Pio
31
30
  actions :actions, length: -> { entry_length - 88 }
32
31
  end
33
32
 
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
33
+ open_flow_header version: 1,
34
+ message_type: 17,
35
+ message_length: -> { 12 + stats.to_binary_s.length }
52
36
 
53
- header version: 1, message_type: 17
54
- body :body
55
- end
37
+ stats_type :stats_type, value: -> { :flow }
38
+ uint16 :flags
39
+ array :stats, type: :flow_stats_entry, read_until: :eof
56
40
  end
57
41
  end
58
42
  end
@@ -0,0 +1,25 @@
1
+ require 'pio/open_flow/message'
2
+ require 'pio/open_flow10/match10'
3
+ require 'pio/open_flow10/stats_type'
4
+
5
+ module Pio
6
+ module OpenFlow10
7
+ # OpenFlow 1.0 FlowStats messages
8
+ module FlowStats
9
+ # OpenFlow 1.0 Flow Stats Request message
10
+ class Request < OpenFlow::Message
11
+ open_flow_header version: 1,
12
+ message_type: 16,
13
+ message_length: 56
14
+
15
+ stats_type :stats_type, value: -> { :flow }
16
+ uint16 :flags
17
+ match10 :match
18
+ uint8 :table_id, initial_value: 0xff
19
+ string :padding, length: 1
20
+ hide :padding
21
+ port16 :out_port, initial_value: -> { :none }
22
+ end
23
+ end
24
+ end
25
+ end
@@ -1,23 +1,13 @@
1
- require 'pio/open_flow/format'
2
1
  require 'pio/open_flow/message'
3
2
 
4
- # Base module.
5
3
  module Pio
6
- # OpenFlow 1.0 messages
7
4
  module OpenFlow10
8
5
  # Hello message
9
6
  class Hello < OpenFlow::Message
10
- # Hello message format
11
- class Format < BinData::Record
12
- extend OpenFlow::Format
7
+ open_flow_header version: 1, message_type: 0
8
+ string :body, length: 0
13
9
 
14
- header version: 1, message_type: 0
15
- string :body
16
-
17
- def user_data
18
- body
19
- end
20
- end
10
+ alias_method :user_data, :body
21
11
  end
22
12
  end
23
13
  end
@@ -1,6 +1,5 @@
1
1
  require 'English'
2
2
  require 'bindata'
3
- require 'pio/open_flow'
4
3
  require 'pio/type/ip_address'
5
4
  require 'pio/type/mac_address'
6
5
 
@@ -161,22 +160,5 @@ module Pio
161
160
  @format.__send__ method, *args, &block
162
161
  end
163
162
  end
164
-
165
- # Pio::MatchFormat wrapper.
166
- class Match10 < 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
181
163
  end
182
164
  end
@@ -0,0 +1,22 @@
1
+ require 'pio/open_flow10/match'
2
+
3
+ module Pio
4
+ module OpenFlow10
5
+ # Pio::MatchFormat wrapper.
6
+ class Match10 < BinData::Primitive
7
+ endian :big
8
+
9
+ string :match,
10
+ read_length: 40,
11
+ initial_value: Pio::OpenFlow10::Match.new.to_binary_s
12
+
13
+ def set(object)
14
+ self.match = object.to_binary_s
15
+ end
16
+
17
+ def get
18
+ Pio::OpenFlow10::Match.read match
19
+ end
20
+ end
21
+ end
22
+ end
@@ -4,7 +4,6 @@ require 'pio/open_flow'
4
4
  require 'pio/parse_error'
5
5
  require 'pio/parser'
6
6
 
7
- # Base module.
8
7
  module Pio
9
8
  module OpenFlow10
10
9
  # OpenFlow 1.0 Packet-In message
@@ -25,55 +24,32 @@ module Pio
25
24
  end
26
25
  end
27
26
 
28
- # Message body of Packet-In.
29
- class Body < BinData::Record
30
- endian :big
31
-
32
- uint32 :buffer_id
33
- uint16 :total_len, value: -> { raw_data.length }
34
- uint16 :in_port
35
- reason :reason
36
- uint8 :padding
37
- hide :padding
38
- string :raw_data, read_length: :total_len
39
-
40
- def data
41
- @data ||= Pio::Parser.read(raw_data)
42
- end
43
-
44
- def empty?
45
- false
46
- end
47
-
48
- def length
49
- 10 + raw_data.length
50
- end
51
-
52
- def lldp?
53
- data.is_a? Lldp
54
- end
55
-
56
- def method_missing(method, *args)
57
- data.__send__(method, *args).snapshot
58
- end
27
+ open_flow_header version: 1,
28
+ message_type: 10,
29
+ message_length: -> { 18 + raw_data.length }
30
+ uint32 :buffer_id
31
+ uint16 :total_len, value: -> { raw_data.length }
32
+ uint16 :in_port
33
+ reason :reason
34
+ uint8 :padding
35
+ hide :padding
36
+ string :raw_data, read_length: :total_len
37
+
38
+ def data
39
+ @data ||= Pio::Parser.read(raw_data)
59
40
  end
60
41
 
61
- # OpenFlow 1.0 Flow Mod message format.
62
- class Format < BinData::Record
63
- extend OpenFlow::Format
42
+ def lldp?
43
+ data.is_a? Lldp
44
+ end
64
45
 
65
- header version: 1, message_type: 10
66
- body :body
46
+ def method_missing(method, *args)
47
+ data.__send__(method, *args).snapshot
67
48
  end
68
49
 
69
50
  attr_accessor :datapath_id
70
51
  alias_method :dpid, :datapath_id
71
52
  alias_method :dpid=, :datapath_id=
72
-
73
- body_option :buffer_id
74
- body_option :in_port
75
- body_option :reason
76
- body_option :raw_data
77
53
  end
78
54
  end
79
55
  end
@@ -6,37 +6,14 @@ module Pio
6
6
  module OpenFlow10
7
7
  # OpenFlow 1.0 Packet-Out message
8
8
  class PacketOut < OpenFlow::Message
9
- # OpenFlow 1.0 Flow Mod message format.
10
- class Format < BinData::Record
11
- # Message body of Packet-Out
12
- class Body < BinData::Record
13
- endian :big
14
-
15
- uint32 :buffer_id
16
- uint16 :in_port
17
- uint16 :actions_len, initial_value: -> { actions.binary.length }
18
- actions :actions, length: -> { actions_len }
19
- rest :raw_data
20
-
21
- def empty?
22
- false
23
- end
24
-
25
- def length
26
- 8 + actions_len + raw_data.length
27
- end
28
- end
29
-
30
- extend OpenFlow::Format
31
-
32
- header version: 1, message_type: 13
33
- body :body
34
- end
35
-
36
- body_option :buffer_id
37
- body_option :in_port
38
- body_option :actions
39
- body_option :raw_data
9
+ open_flow_header version: 1,
10
+ message_type: 13,
11
+ message_length: -> { 16 + actions_len + raw_data.length }
12
+ uint32 :buffer_id
13
+ uint16 :in_port
14
+ uint16 :actions_len, initial_value: -> { actions.binary.length }
15
+ actions :actions, length: -> { actions_len }
16
+ rest :raw_data
40
17
  end
41
18
  end
42
19
  end
@@ -1,8 +1,6 @@
1
- require 'pio/open_flow'
1
+ require 'pio/open_flow/message'
2
2
 
3
- # Base module.
4
3
  module Pio
5
- # OpenFlow 1.0 messages
6
4
  module OpenFlow10
7
5
  # OpenFlow 1.0 Port Status message
8
6
  class PortStatus < OpenFlow::Message
@@ -21,51 +19,25 @@ module Pio
21
19
  end
22
20
  end
23
21
 
24
- # Message body of Port Status
25
- class Body < BinData::Record
26
- endian :big
22
+ open_flow_header version: 1,
23
+ message_type: 12,
24
+ message_length: 10
25
+ reason :reason
26
+ uint56 :padding
27
+ hide :padding
28
+ phy_port16 :desc
27
29
 
28
- reason :reason
29
- uint56 :padding
30
- hide :padding
31
- phy_port16 :desc
32
- end
33
-
34
- # OpenFlow 1.0 Flow Mod message format.
35
- class Format < BinData::Record
36
- extend OpenFlow::Format
37
-
38
- header version: 1, message_type: 12
39
- body :body
40
-
41
- def reason
42
- body.reason.to_sym
43
- end
30
+ def reason
31
+ @format.reason.to_sym
44
32
  end
45
33
 
46
34
  attr_writer :datapath_id
47
35
 
48
36
  def desc
49
- @desc ||= @format.body.desc.snapshot
37
+ @desc ||= @format.desc.snapshot
50
38
  @desc.instance_variable_set :@datapath_id, @datapath_id
51
39
  @desc
52
40
  end
53
-
54
- # rubocop:disable MethodLength
55
- def initialize(user_options = {})
56
- header_options = parse_header_options(user_options)
57
- body_options = if user_options.respond_to?(:fetch)
58
- user_options.delete :transaction_id
59
- user_options.delete :xid
60
- dpid = user_options[:dpid]
61
- user_options[:datapath_id] = dpid if dpid
62
- user_options
63
- else
64
- ''
65
- end
66
- @format = Format.new(header: header_options, body: body_options)
67
- end
68
- # rubocop:enable MethodLength
69
41
  end
70
42
  end
71
43
  end