pio 0.29.0 → 0.30.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.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -0
  3. data/bin/{code_metrics → terminal-notifier} +2 -2
  4. data/features/{open_flow10 → open_flow}/nicira_resubmit.feature +0 -1
  5. data/features/{open_flow10 → open_flow}/nicira_resubmit_table.feature +0 -1
  6. data/features/open_flow13/nicira_reg_load.feature +56 -0
  7. data/features/open_flow13/nicira_reg_move.feature +21 -0
  8. data/features/open_flow13/nicira_send_out_port.feature +20 -0
  9. data/features/open_flow13/set_metadata.feature +14 -0
  10. data/lib/pio/open_flow.rb +3 -3
  11. data/lib/pio/open_flow/nicira_resubmit.rb +18 -0
  12. data/lib/pio/open_flow/nicira_resubmit_table.rb +15 -0
  13. data/lib/pio/open_flow10.rb +2 -2
  14. data/lib/pio/open_flow13.rb +5 -0
  15. data/lib/pio/open_flow13/goto_table.rb +1 -0
  16. data/lib/pio/open_flow13/match.rb +348 -58
  17. data/lib/pio/open_flow13/nicira_reg_load.rb +44 -0
  18. data/lib/pio/open_flow13/nicira_reg_move.rb +7 -3
  19. data/lib/pio/open_flow13/nicira_send_out_port.rb +38 -0
  20. data/lib/pio/open_flow13/set_arp_operation.rb +1 -1
  21. data/lib/pio/open_flow13/set_arp_sender_hardware_address.rb +1 -1
  22. data/lib/pio/open_flow13/set_arp_sender_protocol_address.rb +1 -1
  23. data/lib/pio/open_flow13/set_destination_mac_address.rb +1 -1
  24. data/lib/pio/open_flow13/set_metadata.rb +21 -0
  25. data/lib/pio/open_flow13/set_source_mac_address.rb +1 -1
  26. data/lib/pio/version.rb +1 -1
  27. data/spec/pio/open_flow13/match_spec.rb +43 -43
  28. metadata +19 -11
  29. data/bin/code_metrics-profile +0 -16
  30. data/lib/pio/open_flow10/nicira_resubmit.rb +0 -20
  31. data/lib/pio/open_flow10/nicira_resubmit_table.rb +0 -17
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f0bae1a4e884cc9c53cae04b7ca07d4781cea7b1
4
- data.tar.gz: bdce833e9753e814505163d84bb10a59a1511955
3
+ metadata.gz: 9b5753a6115af1e4780aa485bf53e666cd071903
4
+ data.tar.gz: 14fa545e8f983b2694dcff0afafb7c1afeb91624
5
5
  SHA512:
6
- metadata.gz: 7557c2fffccafb3e314d0cb97356eba24b391edc5941ae760dd1c6a9d7fe53e417a1d3706a89def3d2725f5df791f1d1d527e86f50ef5273d53775f2dc9f9bc1
7
- data.tar.gz: e1672095ad435143f579135afca3fa08d6f530ff3d9b2b20ebeab600b8e8b0e5205404e2b6cf89333c183601a6cf9256d33955635f8e11c7ce603f241d7e39ae
6
+ metadata.gz: c6db3f9249f15d5fcaec8af17d66fa36af5a222dfb4b8b082049ffb356a871a98572d8edafbd11e9416ed3a7aca21428116ca69200c153f4690487485cf708ef
7
+ data.tar.gz: 44ccf71fb9db860a33706942d947a110464c2f809263543dca73c977888180ca4cfeb1646297a722cfcb777e027fa40566d80eb08410412ab8d76e4b627ccf75
@@ -2,6 +2,14 @@
2
2
 
3
3
  ## develop (unreleased)
4
4
 
5
+ ## 0.30.0 (11/17/2015)
6
+ ### New features
7
+ * [#281](https://github.com/trema/pio/pull/281): Add `NiciraRegLoad` action.
8
+ * [#282](https://github.com/trema/pio/pull/282): Add `NiciraResubmit` action.
9
+ * [#283](https://github.com/trema/pio/pull/283): Add `SetMetadata` action.
10
+ * [#284](https://github.com/trema/pio/pull/284): Enable masking with reg0-reg7.
11
+ * [#285](https://github.com/trema/pio/pull/285): Add Nicira `SendOutPort` action.
12
+
5
13
 
6
14
  ## 0.29.0 (11/11/2015)
7
15
  ### New features
@@ -2,7 +2,7 @@
2
2
  #
3
3
  # This file was generated by Bundler.
4
4
  #
5
- # The application 'code_metrics' is installed as part of a gem, and
5
+ # The application 'terminal-notifier' is installed as part of a gem, and
6
6
  # this file is here to facilitate running it.
7
7
  #
8
8
 
@@ -13,4 +13,4 @@ ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
13
13
  require 'rubygems'
14
14
  require 'bundler/setup'
15
15
 
16
- load Gem.bin_path('code_metrics', 'code_metrics')
16
+ load Gem.bin_path('terminal-notifier', 'terminal-notifier')
@@ -1,4 +1,3 @@
1
- @open_flow10
2
1
  Feature: Pio::NiciraResubmit
3
2
 
4
3
  Scenario: new(1)
@@ -1,4 +1,3 @@
1
- @open_flow10
2
1
  Feature: Pio::NiciraResubmitTable
3
2
 
4
3
  Scenario: new(in_port: 1, table: 1)
@@ -0,0 +1,56 @@
1
+ @open_flow13
2
+ Feature: Pio::NiciraRegLoad
3
+
4
+ Scenario: new(0xdeadbeef, :reg0)
5
+ When I try to create an OpenFlow action with:
6
+ """
7
+ Pio::NiciraRegLoad.new(0xdeadbeef, :reg0)
8
+ """
9
+ Then it should finish successfully
10
+ And the action has the following fields and values:
11
+ | field | value |
12
+ | action_type.to_hex | 0xffff |
13
+ | action_length | 24 |
14
+ | experimenter_id.to_hex | 0x2320 |
15
+ | experimenter_type | 7 |
16
+ | offset | 0 |
17
+ | n_bits | 32 |
18
+ | destination | :reg0 |
19
+ | destination_internal | 65540 |
20
+ | value.to_hex | 0xdeadbeef |
21
+
22
+ Scenario: new(0xdeadbeef, :metadata)
23
+ When I try to create an OpenFlow action with:
24
+ """
25
+ Pio::NiciraRegLoad.new(0xdeadbeef, :metadata)
26
+ """
27
+ Then it should finish successfully
28
+ And the action has the following fields and values:
29
+ | field | value |
30
+ | action_type.to_hex | 0xffff |
31
+ | action_length | 24 |
32
+ | experimenter_id.to_hex | 0x2320 |
33
+ | experimenter_type | 7 |
34
+ | offset | 0 |
35
+ | n_bits | 64 |
36
+ | destination | :metadata |
37
+ | destination_internal | 2147484680 |
38
+ | value.to_hex | 0xdeadbeef |
39
+
40
+ Scenario: new(0xdeadbeef, :metadata, offset: 32, n_bits: 32)
41
+ When I try to create an OpenFlow action with:
42
+ """
43
+ Pio::NiciraRegLoad.new(0xdeadbeef, :metadata, offset: 32, n_bits: 32)
44
+ """
45
+ Then it should finish successfully
46
+ And the action has the following fields and values:
47
+ | field | value |
48
+ | action_type.to_hex | 0xffff |
49
+ | action_length | 24 |
50
+ | experimenter_id.to_hex | 0x2320 |
51
+ | experimenter_type | 7 |
52
+ | offset | 32 |
53
+ | n_bits | 32 |
54
+ | destination | :metadata |
55
+ | destination_internal | 2147484680 |
56
+ | value.to_hex | 0xdeadbeef |
@@ -19,3 +19,24 @@ Feature: Pio::NiciraRegMove
19
19
  | to | :arp_target_hardware_address |
20
20
  | destination_oxm_field | 25 |
21
21
  | destination_oxm_length | 6 |
22
+
23
+ Scenario: new(from: :reg0, to: :reg7)
24
+ When I try to create an OpenFlow action with:
25
+ """
26
+ Pio::NiciraRegMove.new(from: :reg0, to: :reg7)
27
+ """
28
+ Then it should finish successfully
29
+ And the action has the following fields and values:
30
+ | field | value |
31
+ | action_type.to_hex | 0xffff |
32
+ | action_length | 24 |
33
+ | experimenter_id.to_hex | 0x2320 |
34
+ | experimenter_type | 6 |
35
+ | from | :reg0 |
36
+ | source_oxm_class | 1 |
37
+ | source_oxm_field | 0 |
38
+ | source_oxm_length | 4 |
39
+ | to | :reg7 |
40
+ | destination_oxm_class | 1 |
41
+ | destination_oxm_field | 7 |
42
+ | destination_oxm_length | 4 |
@@ -0,0 +1,20 @@
1
+ @open_flow13
2
+ Feature: Pio::NiciraSendOutPort
3
+
4
+ Scenario: new(:reg0)
5
+ When I try to create an OpenFlow action with:
6
+ """
7
+ Pio::NiciraSendOutPort.new(:reg0)
8
+ """
9
+ Then it should finish successfully
10
+ And the action has the following fields and values:
11
+ | field | value |
12
+ | action_type.to_hex | 0xffff |
13
+ | action_length | 24 |
14
+ | experimenter_id.to_hex | 0x2320 |
15
+ | experimenter_type | 15 |
16
+ | offset | 0 |
17
+ | source | :reg0 |
18
+ | max_length | 0 |
19
+
20
+
@@ -0,0 +1,14 @@
1
+ @open_flow13
2
+ Feature: Pio::SetMetadata
3
+
4
+ Scenario: new(0x123)
5
+ When I try to create an OpenFlow action with:
6
+ """
7
+ Pio::SetMetadata.new(0x123)
8
+ """
9
+ Then it should finish successfully
10
+ And the action has the following fields and values:
11
+ | field | value |
12
+ | action_type | 25 |
13
+ | action_length | 16 |
14
+ | metadata.to_hex | 0x123 |
@@ -19,9 +19,9 @@ module Pio
19
19
  :PacketIn, :FlowRemoved, :PacketOut, :SendOutPort,
20
20
  :SetSourceMacAddress, :SetDestinationMacAddress, :PortStatus, :Stats,
21
21
  :FlowStats, :DescriptionStats, :AggregateStats, :TableStats, :PortStats,
22
- :QueueStats, :Error, :NiciraResubmit, :SetArpOperation,
23
- :SetArpSenderProtocolAddress, :SetArpSenderHardwareAddress,
24
- :NiciraResubmitTable, :NiciraRegMove].each do |each|
22
+ :QueueStats, :Error, :SetArpOperation, :SetArpSenderProtocolAddress,
23
+ :SetArpSenderHardwareAddress, :NiciraRegMove, :SetMetadata,
24
+ :NiciraRegLoad, :NiciraSendOutPort].each do |each|
25
25
  set_message_class_name each, version
26
26
  @version = version.to_s
27
27
  end
@@ -0,0 +1,18 @@
1
+ require 'pio/open_flow/nicira_action'
2
+ require 'pio/open_flow10/port16'
3
+
4
+ module Pio
5
+ # NXAST_RESUBMIT action
6
+ class NiciraResubmit < OpenFlow::NiciraAction
7
+ nicira_action_header action_type: 0xffff,
8
+ action_length: 16,
9
+ subtype: 1
10
+ port16 :in_port
11
+ string :padding, length: 4
12
+ hide :padding
13
+
14
+ def initialize(port_number)
15
+ super(in_port: port_number)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,15 @@
1
+ require 'pio/open_flow/nicira_action'
2
+ require 'pio/open_flow10/port16'
3
+
4
+ module Pio
5
+ # NXAST_RESUBMIT_TABLE action
6
+ class NiciraResubmitTable < OpenFlow::NiciraAction
7
+ nicira_action_header action_type: 0xffff,
8
+ action_length: 16,
9
+ subtype: 14
10
+ port16 :in_port
11
+ uint8 :table, initial_value: 0xff
12
+ string :padding, length: 3
13
+ hide :padding
14
+ end
15
+ end
@@ -27,8 +27,8 @@ require 'pio/open_flow10/stats_request'
27
27
  require 'pio/open_flow10/table_stats/request'
28
28
 
29
29
  # Actions
30
- require 'pio/open_flow10/nicira_resubmit'
31
- require 'pio/open_flow10/nicira_resubmit_table'
30
+ require 'pio/open_flow/nicira_resubmit'
31
+ require 'pio/open_flow/nicira_resubmit_table'
32
32
  require 'pio/open_flow10/send_out_port'
33
33
  require 'pio/open_flow10/set_destination_mac_address'
34
34
  require 'pio/open_flow10/set_source_mac_address'
@@ -13,12 +13,17 @@ require 'pio/open_flow13/packet_out'
13
13
  require 'pio/open_flow13/stats_request'
14
14
 
15
15
  # Actions
16
+ require 'pio/open_flow/nicira_resubmit'
17
+ require 'pio/open_flow/nicira_resubmit_table'
18
+ require 'pio/open_flow13/nicira_reg_load'
16
19
  require 'pio/open_flow13/nicira_reg_move'
20
+ require 'pio/open_flow13/nicira_send_out_port'
17
21
  require 'pio/open_flow13/send_out_port'
18
22
  require 'pio/open_flow13/set_arp_operation'
19
23
  require 'pio/open_flow13/set_arp_sender_hardware_address'
20
24
  require 'pio/open_flow13/set_arp_sender_protocol_address'
21
25
  require 'pio/open_flow13/set_destination_mac_address'
26
+ require 'pio/open_flow13/set_metadata'
22
27
  require 'pio/open_flow13/set_source_mac_address'
23
28
 
24
29
  # Instructions
@@ -28,6 +28,7 @@ module Pio
28
28
  def_delegators :@format, :instruction_length
29
29
  def_delegators :@format, :table_id
30
30
  def_delegators :@format, :to_binary_s
31
+ def_delegator :@format, :to_binary_s, :to_binary
31
32
 
32
33
  def initialize(table_id)
33
34
  @format = Format.new(table_id: table_id)
@@ -12,11 +12,23 @@ module Pio
12
12
 
13
13
  # OpenFlow eXtensible Match (OXM)
14
14
  class Match
15
- OXM_CLASS_OPENFLOW_BASIC = 0x8000
16
- OXM_CLASS_EXPERIMENTER = 0xFFFF
15
+ # OFPXMC_NXM_1 TLV value
16
+ class NiciraMatchExtensionValue < BinData::Record
17
+ OXM_CLASS = 0x1
18
+ end
19
+
20
+ # OFPXMC_OPENFLOW_BASIC TLV value
21
+ class OpenFlowBasicValue < BinData::Record
22
+ OXM_CLASS = 0x8000
23
+ end
24
+
25
+ # OFPXMC_EXPERIMENTER TLV value
26
+ class ExperimenterValue < BinData::Record
27
+ OXM_CLASS = 0xFFFF
28
+ end
17
29
 
18
30
  # The value of OXM_OF_IN_PORT match field.
19
- class InPort < BinData::Record
31
+ class InPort < OpenFlowBasicValue
20
32
  OXM_FIELD = 0
21
33
 
22
34
  endian :big
@@ -29,7 +41,7 @@ module Pio
29
41
  end
30
42
 
31
43
  # The value of OXM_OF_METADATA match field
32
- class Metadata < BinData::Record
44
+ class Metadata < OpenFlowBasicValue
33
45
  OXM_FIELD = 2
34
46
 
35
47
  endian :big
@@ -42,7 +54,7 @@ module Pio
42
54
  end
43
55
 
44
56
  # Masked OXM_OF_METADATA match field
45
- class MaskedMetadata < BinData::Record
57
+ class MaskedMetadata < OpenFlowBasicValue
46
58
  endian :big
47
59
 
48
60
  uint64 :metadata
@@ -54,7 +66,7 @@ module Pio
54
66
  end
55
67
 
56
68
  # The value of OXM_OF_ETH_DST match field.
57
- class DestinationMacAddress < BinData::Record
69
+ class DestinationMacAddress < OpenFlowBasicValue
58
70
  OXM_FIELD = 3
59
71
 
60
72
  endian :big
@@ -67,7 +79,7 @@ module Pio
67
79
  end
68
80
 
69
81
  # The value of OXM_OF_ETH_SRC match field.
70
- class SourceMacAddress < BinData::Record
82
+ class SourceMacAddress < OpenFlowBasicValue
71
83
  OXM_FIELD = 4
72
84
 
73
85
  endian :big
@@ -80,7 +92,7 @@ module Pio
80
92
  end
81
93
 
82
94
  # Masked OXM_OF_ETH_DST match field.
83
- class MaskedDestinationMacAddress < BinData::Record
95
+ class MaskedDestinationMacAddress < OpenFlowBasicValue
84
96
  endian :big
85
97
 
86
98
  mac_address :destination_mac_address
@@ -92,7 +104,7 @@ module Pio
92
104
  end
93
105
 
94
106
  # Masked OXM_OF_ETH_SRC match field.
95
- class MaskedSourceMacAddress < BinData::Record
107
+ class MaskedSourceMacAddress < OpenFlowBasicValue
96
108
  endian :big
97
109
 
98
110
  mac_address :source_mac_address
@@ -104,7 +116,7 @@ module Pio
104
116
  end
105
117
 
106
118
  # The value of OXM_OF_ETH_TYPE match field.
107
- class EtherType < BinData::Record
119
+ class EtherType < OpenFlowBasicValue
108
120
  OXM_FIELD = 5
109
121
 
110
122
  endian :big
@@ -117,7 +129,7 @@ module Pio
117
129
  end
118
130
 
119
131
  # The value of OXM_OF_VLAN_VID match field
120
- class VlanVid < BinData::Record
132
+ class VlanVid < OpenFlowBasicValue
121
133
  OXM_FIELD = 6
122
134
 
123
135
  endian :big
@@ -133,7 +145,7 @@ module Pio
133
145
  end
134
146
 
135
147
  # The value of OXM_OF_VLAN_PCP match field
136
- class VlanPcp < BinData::Record
148
+ class VlanPcp < OpenFlowBasicValue
137
149
  OXM_FIELD = 7
138
150
 
139
151
  endian :big
@@ -149,7 +161,7 @@ module Pio
149
161
  end
150
162
 
151
163
  # The value of OXM_OF_IP_DSCP match field
152
- class IpDscp < BinData::Record
164
+ class IpDscp < OpenFlowBasicValue
153
165
  OXM_FIELD = 8
154
166
 
155
167
  endian :big
@@ -165,7 +177,7 @@ module Pio
165
177
  end
166
178
 
167
179
  # The value of OXM_OF_IP_ECN match field
168
- class IpEcn < BinData::Record
180
+ class IpEcn < OpenFlowBasicValue
169
181
  OXM_FIELD = 9
170
182
 
171
183
  endian :big
@@ -181,7 +193,7 @@ module Pio
181
193
  end
182
194
 
183
195
  # The value of OXM_OF_IP_PROTO
184
- class IpProtocol < BinData::Record
196
+ class IpProtocol < OpenFlowBasicValue
185
197
  OXM_FIELD = 10
186
198
 
187
199
  endian :big
@@ -194,7 +206,7 @@ module Pio
194
206
  end
195
207
 
196
208
  # The value of OXM_OF_IPV4_SRC
197
- class Ipv4SourceAddress < BinData::Record
209
+ class Ipv4SourceAddress < OpenFlowBasicValue
198
210
  OXM_FIELD = 11
199
211
 
200
212
  endian :big
@@ -207,7 +219,7 @@ module Pio
207
219
  end
208
220
 
209
221
  # The value of masked OXM_OF_IPV4_SRC
210
- class MaskedIpv4SourceAddress < BinData::Record
222
+ class MaskedIpv4SourceAddress < OpenFlowBasicValue
211
223
  OXM_FIELD = 11
212
224
 
213
225
  endian :big
@@ -220,7 +232,7 @@ module Pio
220
232
  end
221
233
 
222
234
  # The value of OXM_OF_IPV4_DST
223
- class Ipv4DestinationAddress < BinData::Record
235
+ class Ipv4DestinationAddress < OpenFlowBasicValue
224
236
  OXM_FIELD = 12
225
237
 
226
238
  endian :big
@@ -233,7 +245,7 @@ module Pio
233
245
  end
234
246
 
235
247
  # The value of masked OXM_OF_IPV4_DST
236
- class MaskedIpv4DestinationAddress < BinData::Record
248
+ class MaskedIpv4DestinationAddress < OpenFlowBasicValue
237
249
  OXM_FIELD = 12
238
250
 
239
251
  endian :big
@@ -246,7 +258,7 @@ module Pio
246
258
  end
247
259
 
248
260
  # The value of OXM_OF_TCP_SRC
249
- class TcpSourcePort < BinData::Record
261
+ class TcpSourcePort < OpenFlowBasicValue
250
262
  OXM_FIELD = 13
251
263
 
252
264
  endian :big
@@ -259,7 +271,7 @@ module Pio
259
271
  end
260
272
 
261
273
  # The value of OXM_OF_TCP_DST
262
- class TcpDestinationPort < BinData::Record
274
+ class TcpDestinationPort < OpenFlowBasicValue
263
275
  OXM_FIELD = 14
264
276
 
265
277
  endian :big
@@ -272,7 +284,7 @@ module Pio
272
284
  end
273
285
 
274
286
  # The value of OXM_OF_UDP_SRC
275
- class UdpSourcePort < BinData::Record
287
+ class UdpSourcePort < OpenFlowBasicValue
276
288
  OXM_FIELD = 15
277
289
 
278
290
  endian :big
@@ -285,7 +297,7 @@ module Pio
285
297
  end
286
298
 
287
299
  # The value of OXM_OF_UDP_SRC
288
- class UdpDestinationPort < BinData::Record
300
+ class UdpDestinationPort < OpenFlowBasicValue
289
301
  OXM_FIELD = 16
290
302
 
291
303
  endian :big
@@ -298,7 +310,7 @@ module Pio
298
310
  end
299
311
 
300
312
  # The value of OXM_OF_SCTP_SRC
301
- class SctpSourcePort < BinData::Record
313
+ class SctpSourcePort < OpenFlowBasicValue
302
314
  OXM_FIELD = 17
303
315
 
304
316
  endian :big
@@ -311,7 +323,7 @@ module Pio
311
323
  end
312
324
 
313
325
  # The value of OXM_OF_SCTP_DST
314
- class SctpDestinationPort < BinData::Record
326
+ class SctpDestinationPort < OpenFlowBasicValue
315
327
  OXM_FIELD = 18
316
328
 
317
329
  endian :big
@@ -324,7 +336,7 @@ module Pio
324
336
  end
325
337
 
326
338
  # The value of OXM_OF_ICMPV4_TYPE
327
- class Icmpv4Type < BinData::Record
339
+ class Icmpv4Type < OpenFlowBasicValue
328
340
  OXM_FIELD = 19
329
341
 
330
342
  endian :big
@@ -337,7 +349,7 @@ module Pio
337
349
  end
338
350
 
339
351
  # The value of OXM_OF_ICMPV4_CODE
340
- class Icmpv4Code < BinData::Record
352
+ class Icmpv4Code < OpenFlowBasicValue
341
353
  OXM_FIELD = 20
342
354
 
343
355
  endian :big
@@ -350,7 +362,7 @@ module Pio
350
362
  end
351
363
 
352
364
  # The value of OXM_OF_ARP_OP
353
- class ArpOperation < BinData::Record
365
+ class ArpOperation < OpenFlowBasicValue
354
366
  OXM_FIELD = 21
355
367
 
356
368
  endian :big
@@ -363,7 +375,7 @@ module Pio
363
375
  end
364
376
 
365
377
  # The value of OXM_OF_ARP_SPA
366
- class ArpSenderProtocolAddress < BinData::Record
378
+ class ArpSenderProtocolAddress < OpenFlowBasicValue
367
379
  OXM_FIELD = 22
368
380
 
369
381
  endian :big
@@ -376,7 +388,7 @@ module Pio
376
388
  end
377
389
 
378
390
  # The value of masked OXM_OF_ARP_SPA
379
- class MaskedArpSenderProtocolAddress < BinData::Record
391
+ class MaskedArpSenderProtocolAddress < OpenFlowBasicValue
380
392
  OXM_FIELD = 22
381
393
 
382
394
  endian :big
@@ -389,7 +401,7 @@ module Pio
389
401
  end
390
402
 
391
403
  # The value of OXM_OF_ARP_TPA
392
- class ArpTargetProtocolAddress < BinData::Record
404
+ class ArpTargetProtocolAddress < OpenFlowBasicValue
393
405
  OXM_FIELD = 23
394
406
 
395
407
  endian :big
@@ -402,7 +414,7 @@ module Pio
402
414
  end
403
415
 
404
416
  # The value of masked OXM_OF_ARP_TPA
405
- class MaskedArpTargetProtocolAddress < BinData::Record
417
+ class MaskedArpTargetProtocolAddress < OpenFlowBasicValue
406
418
  OXM_FIELD = 23
407
419
 
408
420
  endian :big
@@ -415,7 +427,7 @@ module Pio
415
427
  end
416
428
 
417
429
  # The value of OXM_OF_ARP_SHA match field.
418
- class ArpSenderHardwareAddress < BinData::Record
430
+ class ArpSenderHardwareAddress < OpenFlowBasicValue
419
431
  OXM_FIELD = 24
420
432
 
421
433
  endian :big
@@ -428,7 +440,7 @@ module Pio
428
440
  end
429
441
 
430
442
  # Masked OXM_OF_ARP_SHA match field.
431
- class MaskedArpSenderHardwareAddress < BinData::Record
443
+ class MaskedArpSenderHardwareAddress < OpenFlowBasicValue
432
444
  OXM_FIELD = 24
433
445
 
434
446
  endian :big
@@ -442,7 +454,7 @@ module Pio
442
454
  end
443
455
 
444
456
  # The value of OXM_OF_ARP_THA match field.
445
- class ArpTargetHardwareAddress < BinData::Record
457
+ class ArpTargetHardwareAddress < OpenFlowBasicValue
446
458
  OXM_FIELD = 25
447
459
 
448
460
  endian :big
@@ -455,7 +467,7 @@ module Pio
455
467
  end
456
468
 
457
469
  # Masked OXM_OF_ARP_THA match field.
458
- class MaskedArpTargetHardwareAddress < BinData::Record
470
+ class MaskedArpTargetHardwareAddress < OpenFlowBasicValue
459
471
  OXM_FIELD = 25
460
472
 
461
473
  endian :big
@@ -469,7 +481,7 @@ module Pio
469
481
  end
470
482
 
471
483
  # The value of OXM_OF_IPV6_SRC
472
- class Ipv6SourceAddress < BinData::Record
484
+ class Ipv6SourceAddress < OpenFlowBasicValue
473
485
  OXM_FIELD = 26
474
486
 
475
487
  endian :big
@@ -482,7 +494,7 @@ module Pio
482
494
  end
483
495
 
484
496
  # The value of masked OXM_OF_IPV6_SRC
485
- class MaskedIpv6SourceAddress < BinData::Record
497
+ class MaskedIpv6SourceAddress < OpenFlowBasicValue
486
498
  OXM_FIELD = 26
487
499
 
488
500
  endian :big
@@ -496,7 +508,7 @@ module Pio
496
508
  end
497
509
 
498
510
  # The value of OXM_OF_IPV6_DST
499
- class Ipv6DestinationAddress < BinData::Record
511
+ class Ipv6DestinationAddress < OpenFlowBasicValue
500
512
  OXM_FIELD = 27
501
513
 
502
514
  endian :big
@@ -509,7 +521,7 @@ module Pio
509
521
  end
510
522
 
511
523
  # The value of OXM_OF_IPV6_DST
512
- class MaskedIpv6DestinationAddress < BinData::Record
524
+ class MaskedIpv6DestinationAddress < OpenFlowBasicValue
513
525
  OXM_FIELD = 27
514
526
 
515
527
  endian :big
@@ -523,7 +535,7 @@ module Pio
523
535
  end
524
536
 
525
537
  # The value of OXM_OF_TUNNEL_ID match field
526
- class TunnelId < BinData::Record
538
+ class TunnelId < OpenFlowBasicValue
527
539
  OXM_FIELD = 38
528
540
 
529
541
  endian :big
@@ -536,7 +548,7 @@ module Pio
536
548
  end
537
549
 
538
550
  # Masked OXM_OF_TUNNEL_ID match field
539
- class MaskedTunnelId < BinData::Record
551
+ class MaskedTunnelId < OpenFlowBasicValue
540
552
  endian :big
541
553
 
542
554
  uint64 :tunnel_id
@@ -547,6 +559,206 @@ module Pio
547
559
  end
548
560
  end
549
561
 
562
+ # NXM_NX_REG0 match field
563
+ class Reg0 < NiciraMatchExtensionValue
564
+ OXM_FIELD = 0
565
+
566
+ endian :big
567
+
568
+ uint32 :reg0
569
+
570
+ def length
571
+ 4
572
+ end
573
+ end
574
+
575
+ # Masked NXM_NX_REG0 match field
576
+ class MaskedReg0 < NiciraMatchExtensionValue
577
+ endian :big
578
+
579
+ uint32 :reg0
580
+ uint32 :reg0_mask
581
+
582
+ def length
583
+ 8
584
+ end
585
+ end
586
+
587
+ # NXM_NX_REG1 match field
588
+ class Reg1 < NiciraMatchExtensionValue
589
+ OXM_FIELD = 1
590
+
591
+ endian :big
592
+
593
+ uint32 :reg1
594
+
595
+ def length
596
+ 4
597
+ end
598
+ end
599
+
600
+ # Masked NXM_NX_REG1 match field
601
+ class MaskedReg1 < NiciraMatchExtensionValue
602
+ endian :big
603
+
604
+ uint32 :reg1
605
+ uint32 :reg1_mask
606
+
607
+ def length
608
+ 8
609
+ end
610
+ end
611
+
612
+ # NXM_NX_REG2 match field
613
+ class Reg2 < NiciraMatchExtensionValue
614
+ OXM_FIELD = 2
615
+
616
+ endian :big
617
+
618
+ uint32 :reg2
619
+
620
+ def length
621
+ 4
622
+ end
623
+ end
624
+
625
+ # Masked NXM_NX_REG2 match field
626
+ class MaskedReg2 < NiciraMatchExtensionValue
627
+ endian :big
628
+
629
+ uint32 :reg2
630
+ uint32 :reg2_mask
631
+
632
+ def length
633
+ 8
634
+ end
635
+ end
636
+
637
+ # NXM_NX_REG3 match field
638
+ class Reg3 < NiciraMatchExtensionValue
639
+ OXM_FIELD = 3
640
+
641
+ endian :big
642
+
643
+ uint32 :reg3
644
+
645
+ def length
646
+ 4
647
+ end
648
+ end
649
+
650
+ # Masked NXM_NX_REG3 match field
651
+ class MaskedReg3 < NiciraMatchExtensionValue
652
+ endian :big
653
+
654
+ uint32 :reg3
655
+ uint32 :reg3_mask
656
+
657
+ def length
658
+ 8
659
+ end
660
+ end
661
+
662
+ # NXM_NX_REG4 match field
663
+ class Reg4 < NiciraMatchExtensionValue
664
+ OXM_FIELD = 4
665
+
666
+ endian :big
667
+
668
+ uint32 :reg4
669
+
670
+ def length
671
+ 4
672
+ end
673
+ end
674
+
675
+ # Masked NXM_NX_REG4 match field
676
+ class MaskedReg4 < NiciraMatchExtensionValue
677
+ endian :big
678
+
679
+ uint32 :reg4
680
+ uint32 :reg4_mask
681
+
682
+ def length
683
+ 8
684
+ end
685
+ end
686
+
687
+ # NXM_NX_REG5 match field
688
+ class Reg5 < NiciraMatchExtensionValue
689
+ OXM_FIELD = 5
690
+
691
+ endian :big
692
+
693
+ uint32 :reg5
694
+
695
+ def length
696
+ 4
697
+ end
698
+ end
699
+
700
+ # Masked NXM_NX_REG5 match field
701
+ class MaskedReg5 < NiciraMatchExtensionValue
702
+ endian :big
703
+
704
+ uint32 :reg5
705
+ uint32 :reg5_mask
706
+
707
+ def length
708
+ 8
709
+ end
710
+ end
711
+
712
+ # NXM_NX_REG6 match field
713
+ class Reg6 < NiciraMatchExtensionValue
714
+ OXM_FIELD = 6
715
+
716
+ endian :big
717
+
718
+ uint32 :reg6
719
+
720
+ def length
721
+ 4
722
+ end
723
+ end
724
+
725
+ # Masked NXM_NX_REG6 match field
726
+ class MaskedReg6 < NiciraMatchExtensionValue
727
+ endian :big
728
+
729
+ uint32 :reg6
730
+ uint32 :reg6_mask
731
+
732
+ def length
733
+ 8
734
+ end
735
+ end
736
+
737
+ # NXM_NX_REG7 match field
738
+ class Reg7 < NiciraMatchExtensionValue
739
+ OXM_FIELD = 7
740
+
741
+ endian :big
742
+
743
+ uint32 :reg7
744
+
745
+ def length
746
+ 4
747
+ end
748
+ end
749
+
750
+ # Masked NXM_NX_REG7 match field
751
+ class MaskedReg7 < NiciraMatchExtensionValue
752
+ endian :big
753
+
754
+ uint32 :reg7
755
+ uint32 :reg7_mask
756
+
757
+ def length
758
+ 8
759
+ end
760
+ end
761
+
550
762
  # OXM format
551
763
  class Oxm < BinData::Record
552
764
  # Experimenter part, data will use oxm_length
@@ -564,6 +776,79 @@ module Pio
564
776
  end
565
777
  end
566
778
 
779
+ # Nicira match extension
780
+ class NiciraMatchExtension < BinData::Record
781
+ endian :big
782
+
783
+ bit7 :oxm_field
784
+ bit1 :oxm_hasmask
785
+ uint8 :oxm_length, value: -> { tlv_value.length }
786
+ choice :tlv_value,
787
+ selection: :choose_tlv_value do
788
+ reg0 Reg0
789
+ masked_reg0 MaskedReg0
790
+ reg1 Reg1
791
+ masked_reg1 MaskedReg1
792
+ reg2 Reg2
793
+ masked_reg2 MaskedReg2
794
+ reg3 Reg3
795
+ masked_reg3 MaskedReg3
796
+ reg4 Reg4
797
+ masked_reg4 MaskedReg4
798
+ reg5 Reg5
799
+ masked_reg5 MaskedReg5
800
+ reg6 Reg6
801
+ masked_reg6 MaskedReg6
802
+ reg7 Reg7
803
+ masked_reg7 MaskedReg7
804
+ end
805
+
806
+ def length
807
+ tlv_value.length + 2
808
+ end
809
+
810
+ def masked?
811
+ oxm_hasmask == 1
812
+ end
813
+
814
+ def method_missing(method, *args, &block)
815
+ tlv_value.__send__ method, *args, &block
816
+ end
817
+
818
+ private
819
+
820
+ # rubocop:disable AbcSize
821
+ # rubocop:disable CyclomaticComplexity
822
+ # rubocop:disable PerceivedComplexity
823
+ # rubocop:disable MethodLength
824
+ def choose_tlv_value
825
+ case oxm_field
826
+ when Reg0::OXM_FIELD
827
+ masked? ? MaskedReg0 : Reg0
828
+ when Reg1::OXM_FIELD
829
+ masked? ? MaskedReg1 : Reg1
830
+ when Reg2::OXM_FIELD
831
+ masked? ? MaskedReg2 : Reg2
832
+ when Reg3::OXM_FIELD
833
+ masked? ? MaskedReg3 : Reg3
834
+ when Reg4::OXM_FIELD
835
+ masked? ? MaskedReg4 : Reg4
836
+ when Reg5::OXM_FIELD
837
+ masked? ? MaskedReg5 : Reg5
838
+ when Reg6::OXM_FIELD
839
+ masked? ? MaskedReg6 : Reg6
840
+ when Reg7::OXM_FIELD
841
+ masked? ? MaskedReg7 : Reg7
842
+ else
843
+ fail "Unknown OXM field value: #{oxm_field}"
844
+ end
845
+ end
846
+ # rubocop:enable AbcSize
847
+ # rubocop:enable CyclomaticComplexity
848
+ # rubocop:enable PerceivedComplexity
849
+ # rubocop:enable MethodLength
850
+ end
851
+
567
852
  # rubocop:disable ClassLength
568
853
  # OpenflowBasic part, tlv_value will use oxm_field, oxm_hasmask
569
854
  class OpenflowBasic < BinData::Record
@@ -727,10 +1012,11 @@ module Pio
727
1012
  class MatchField < BinData::Record
728
1013
  endian :big
729
1014
 
730
- uint16 :oxm_class, initial_value: OXM_CLASS_OPENFLOW_BASIC
1015
+ uint16 :oxm_class
731
1016
  choice :class_payload, selection: :oxm_class do
732
- OpenflowBasic OXM_CLASS_OPENFLOW_BASIC
733
- Experimenter OXM_CLASS_EXPERIMENTER
1017
+ NiciraMatchExtension NiciraMatchExtensionValue::OXM_CLASS
1018
+ OpenflowBasic OpenFlowBasicValue::OXM_CLASS
1019
+ Experimenter ExperimenterValue::OXM_CLASS
734
1020
  end
735
1021
 
736
1022
  def oxm_field
@@ -751,9 +1037,9 @@ module Pio
751
1037
 
752
1038
  def method_missing(method, *args, &block)
753
1039
  case oxm_class
754
- when OXM_CLASS_OPENFLOW_BASIC
1040
+ when OpenFlowBasicValue::OXM_CLASS
755
1041
  return class_payload.tlv_value.__send__(method, *args, &block)
756
- when OXM_CLASS_EXPERIMENTER
1042
+ when ExperimenterValue::OXM_CLASS
757
1043
  return class_payload.__send__(method, *args, &block)
758
1044
  else
759
1045
  fail NoMethodError, method.to_s
@@ -777,9 +1063,10 @@ module Pio
777
1063
  end
778
1064
 
779
1065
  # rubocop:disable Next
1066
+ # rubocop:disable LineLength
780
1067
  def method_missing(method, *args, &block)
781
1068
  match_fields.each do |each|
782
- if each.oxm_class == OXM_CLASS_OPENFLOW_BASIC
1069
+ if each.oxm_class == OpenFlowBasicValue::OXM_CLASS || each.oxm_class == NiciraMatchExtensionValue::OXM_CLASS
783
1070
  next unless each.class_payload.tlv_value.respond_to?(method)
784
1071
  return each.class_payload.tlv_value.__send__(
785
1072
  method, *args, &block)
@@ -788,6 +1075,7 @@ module Pio
788
1075
  fail NoMethodError, method.to_s
789
1076
  end
790
1077
  # rubocop:enable Next
1078
+ # rubocop:enable LineLength
791
1079
 
792
1080
  private
793
1081
 
@@ -812,6 +1100,7 @@ module Pio
812
1100
  class Options
813
1101
  # rubocop:disable MethodLength
814
1102
  # rubocop:disable AbcSize
1103
+ # rubocop:disable LineLength
815
1104
  def initialize(user_attrs)
816
1105
  @match_fields = []
817
1106
 
@@ -822,29 +1111,30 @@ module Pio
822
1111
  :icmpv4_type, :icmpv4_code, :arp_operation].each do |each|
823
1112
  next unless user_attrs.key?(each)
824
1113
  klass = Match.const_get(each.to_s.split('_').map(&:capitalize).join)
825
- @match_fields << { class_payload:
826
- { oxm_field: klass.const_get(:OXM_FIELD),
827
- tlv_value: { each => user_attrs.fetch(each) } } }
1114
+ @match_fields << { oxm_class: klass.superclass.const_get(:OXM_CLASS),
1115
+ class_payload: { oxm_field: klass.const_get(:OXM_FIELD),
1116
+ tlv_value: { each => user_attrs.fetch(each) } } }
828
1117
  end
829
1118
 
830
1119
  [:metadata, :destination_mac_address, :source_mac_address,
831
1120
  :ipv4_source_address, :ipv4_destination_address,
832
1121
  :arp_sender_protocol_address, :arp_target_protocol_address,
833
1122
  :arp_sender_hardware_address, :arp_target_hardware_address,
834
- :ipv6_source_address, :ipv6_destination_address,
835
- :tunnel_id].each do |each|
1123
+ :ipv6_source_address, :ipv6_destination_address, :tunnel_id,
1124
+ :reg0, :reg1, :reg2, :reg3, :reg4, :reg5, :reg6, :reg7].each do |each|
836
1125
  next unless user_attrs.key?(each)
837
1126
  klass = Match.const_get(each.to_s.split('_').map(&:capitalize).join)
838
1127
  mask_key = "#{each}_mask".to_sym
839
- @match_fields << { class_payload:
840
- { oxm_field: klass.const_get(:OXM_FIELD),
841
- oxm_hasmask: user_attrs.key?(mask_key) ? 1 : 0,
842
- tlv_value: { each => user_attrs[each],
843
- mask_key => user_attrs[mask_key] } } }
1128
+ @match_fields << { oxm_class: klass.superclass.const_get(:OXM_CLASS),
1129
+ class_payload: { oxm_field: klass.const_get(:OXM_FIELD),
1130
+ oxm_hasmask: user_attrs.key?(mask_key) ? 1 : 0,
1131
+ tlv_value: { each => user_attrs[each],
1132
+ mask_key => user_attrs[mask_key] } } }
844
1133
  end
845
1134
  end
846
1135
  # rubocop:enable MethodLength
847
1136
  # rubocop:enable AbcSize
1137
+ # rubocop:enable LineLength
848
1138
 
849
1139
  def to_hash
850
1140
  { match_fields: @match_fields }