pio 0.20.0 → 0.20.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/Rakefile +2 -2
  4. data/features/open_flow13/match.feature +370 -0
  5. data/features/open_flow13/oxm_ether_destination_field.raw +0 -0
  6. data/features/open_flow13/oxm_ether_source_field.raw +0 -0
  7. data/features/open_flow13/oxm_ether_type_field.raw +0 -0
  8. data/features/open_flow13/oxm_in_phy_port_field.raw +0 -0
  9. data/features/open_flow13/oxm_in_port_field.raw +0 -0
  10. data/features/open_flow13/oxm_ipv4_destination_field.raw +0 -0
  11. data/features/open_flow13/oxm_ipv4_source_field.raw +0 -0
  12. data/features/open_flow13/oxm_ipv6_destination_field.raw +0 -0
  13. data/features/open_flow13/oxm_ipv6_source_field.raw +0 -0
  14. data/features/open_flow13/oxm_masked_ether_destination_field.raw +0 -0
  15. data/features/open_flow13/oxm_masked_ether_source_field.raw +0 -0
  16. data/features/open_flow13/oxm_masked_ipv4_destination_field.raw +0 -0
  17. data/features/open_flow13/oxm_masked_ipv4_source_field.raw +0 -0
  18. data/features/open_flow13/oxm_masked_ipv6_destination_field.raw +0 -0
  19. data/features/open_flow13/oxm_masked_ipv6_source_field.raw +0 -0
  20. data/features/open_flow13/oxm_metadata_field.raw +0 -0
  21. data/features/open_flow13/oxm_metadata_masked_field.raw +0 -0
  22. data/features/open_flow13/oxm_no_fields.raw +0 -0
  23. data/features/open_flow13/oxm_tcp_destination_field.raw +0 -0
  24. data/features/open_flow13/oxm_tcp_field.raw +0 -0
  25. data/features/open_flow13/oxm_tcp_source_field.raw +0 -0
  26. data/features/open_flow13/oxm_udp_destination_field.raw +0 -0
  27. data/features/open_flow13/oxm_udp_field.raw +0 -0
  28. data/features/open_flow13/oxm_udp_source_field.raw +0 -0
  29. data/lib/pio/ipv4_header.rb +0 -2
  30. data/lib/pio/open_flow/message.rb +18 -54
  31. data/lib/pio/open_flow10/packet_in.rb +1 -1
  32. data/lib/pio/open_flow13/match.rb +452 -0
  33. data/lib/pio/open_flow13.rb +7 -0
  34. data/lib/pio/type/ipv6_address.rb +21 -0
  35. data/lib/pio/version.rb +1 -1
  36. data/pio.gemspec +8 -8
  37. data/spec/pio/mac_spec.rb +2 -2
  38. data/spec/pio/open_flow13/match_spec.rb +387 -0
  39. data/spec/pio/packet_out_spec.rb +1 -2
  40. metadata +73 -19
@@ -0,0 +1,387 @@
1
+ require 'pio/open_flow13/match'
2
+
3
+ # rubocop:disable LineLength
4
+ describe Pio::OpenFlow13::Match do
5
+ describe '.new' do
6
+ When(:match) { Pio::OpenFlow13::Match.new }
7
+ Then { match.match_fields == [] }
8
+ And { match.class == Pio::OpenFlow13::Match }
9
+ And { match.length == 8 }
10
+ And { match.match_type == Pio::OpenFlow13::MATCH_TYPE_OXM }
11
+ And { match.match_length == 4 }
12
+
13
+ context 'with in_port: 1' do
14
+ When(:match) { Pio::OpenFlow13::Match.new(in_port: 1) }
15
+ Then { match.in_port == 1 }
16
+ And { match.class == Pio::OpenFlow13::Match }
17
+ And { match.length == 16 }
18
+ And { match.match_type == Pio::OpenFlow13::MATCH_TYPE_OXM }
19
+ And { match.match_length == 12 }
20
+ And { match.match_fields.size == 1 }
21
+ And do
22
+ match.match_fields[0].oxm_class ==
23
+ Pio::OpenFlow13::Match::OXM_CLASS_OPENFLOW_BASIC
24
+ end
25
+ And do
26
+ match.match_fields[0].oxm_field ==
27
+ Pio::OpenFlow13::Match::InPort::OXM_FIELD
28
+ end
29
+ And { match.match_fields[0].masked? == false }
30
+ And { match.match_fields[0].oxm_length == 4 }
31
+ end
32
+
33
+ context "with ether_source_address: '01:02:03:04:05:06'" do
34
+ When(:match) do
35
+ Pio::OpenFlow13::Match.new(ether_source_address: '01:02:03:04:05:06')
36
+ end
37
+ Then { match.ether_source_address == '01:02:03:04:05:06' }
38
+ And { match.class == Pio::OpenFlow13::Match }
39
+ And { match.length == 16 }
40
+ And { match.match_type == Pio::OpenFlow13::MATCH_TYPE_OXM }
41
+ And { match.match_length == 14 }
42
+ And { match.match_fields.size == 1 }
43
+ And do
44
+ match.match_fields[0].oxm_class ==
45
+ Pio::OpenFlow13::Match::OXM_CLASS_OPENFLOW_BASIC
46
+ end
47
+ And do
48
+ match.match_fields[0].oxm_field ==
49
+ Pio::OpenFlow13::Match::EtherSourceAddress::OXM_FIELD
50
+ end
51
+ And { match.match_fields[0].masked? == false }
52
+ And { match.match_fields[0].oxm_length == 6 }
53
+ end
54
+
55
+ context "with ether_source_address: '01:02:03:04:05:06', ether_source_address_mask: 'ff:ff:ff:00:00:00'" do
56
+ When(:match) do
57
+ Pio::OpenFlow13::Match.new(ether_source_address: '01:02:03:04:05:06',
58
+ ether_source_address_mask: 'ff:ff:ff:00:00:00')
59
+ end
60
+ Then { match.ether_source_address == '01:02:03:04:05:06' }
61
+ Then { match.ether_source_address_mask == 'ff:ff:ff:00:00:00' }
62
+ And { match.class == Pio::OpenFlow13::Match }
63
+ And { match.length == 24 }
64
+ And { match.match_type == Pio::OpenFlow13::MATCH_TYPE_OXM }
65
+ And { match.match_length == 20 }
66
+ And { match.match_fields.size == 1 }
67
+ And do
68
+ match.match_fields[0].oxm_class ==
69
+ Pio::OpenFlow13::Match::OXM_CLASS_OPENFLOW_BASIC
70
+ end
71
+ And do
72
+ match.match_fields[0].oxm_field ==
73
+ Pio::OpenFlow13::Match::EtherSourceAddress::OXM_FIELD
74
+ end
75
+ And { match.match_fields[0].masked? == true }
76
+ And { match.match_fields[0].oxm_length == 12 }
77
+ end
78
+
79
+ context 'with ether_type: 0x0800' do
80
+ When(:match) { Pio::OpenFlow13::Match.new(ether_type: 0x0800) }
81
+ Then { match.ether_type == 0x0800 }
82
+ And { match.class == Pio::OpenFlow13::Match }
83
+ And { match.length == 16 }
84
+ And { match.match_type == Pio::OpenFlow13::MATCH_TYPE_OXM }
85
+ And { match.match_length == 10 }
86
+ And { match.match_fields.size == 1 }
87
+ And do
88
+ match.match_fields[0].oxm_class ==
89
+ Pio::OpenFlow13::Match::OXM_CLASS_OPENFLOW_BASIC
90
+ end
91
+ And do
92
+ match.match_fields[0].oxm_field ==
93
+ Pio::OpenFlow13::Match::EtherType::OXM_FIELD
94
+ end
95
+ And { match.match_fields[0].masked? == false }
96
+ And { match.match_fields[0].oxm_length == 2 }
97
+ end
98
+
99
+ context "with ether_type: 0x0800, ipv4_source_address: '1.2.3.4'" do
100
+ When(:match) do
101
+ Pio::OpenFlow13::Match.new(ether_type: 0x0800,
102
+ ipv4_source_address: '1.2.3.4')
103
+ end
104
+ Then { match.ether_type == 0x0800 }
105
+ Then { match.ipv4_source_address == '1.2.3.4' }
106
+ And { match.class == Pio::OpenFlow13::Match }
107
+ And { match.length == 24 }
108
+ And { match.match_type == Pio::OpenFlow13::MATCH_TYPE_OXM }
109
+ And { match.match_length == 18 }
110
+ And { match.match_fields.size == 2 }
111
+ And do
112
+ match.match_fields[0].oxm_class ==
113
+ Pio::OpenFlow13::Match::OXM_CLASS_OPENFLOW_BASIC
114
+ end
115
+ And do
116
+ match.match_fields[0].oxm_field ==
117
+ Pio::OpenFlow13::Match::EtherType::OXM_FIELD
118
+ end
119
+ And { match.match_fields[0].masked? == false }
120
+ And { match.match_fields[0].oxm_length == 2 }
121
+ And do
122
+ match.match_fields[1].oxm_class ==
123
+ Pio::OpenFlow13::Match::OXM_CLASS_OPENFLOW_BASIC
124
+ end
125
+ And do
126
+ match.match_fields[1].oxm_field ==
127
+ Pio::OpenFlow13::Match::Ipv4SourceAddress::OXM_FIELD
128
+ end
129
+ And { match.match_fields[1].masked? == false }
130
+ And { match.match_fields[1].oxm_length == 4 }
131
+ end
132
+
133
+ context "with ether_type: 0x0800, ipv4_destination_address: '1.2.3.4'" do
134
+ When(:match) do
135
+ Pio::OpenFlow13::Match.new(ether_type: 0x0800,
136
+ ipv4_destination_address: '1.2.3.4')
137
+ end
138
+ Then { match.ether_type == 0x0800 }
139
+ Then { match.ipv4_destination_address == '1.2.3.4' }
140
+ And { match.class == Pio::OpenFlow13::Match }
141
+ And { match.length == 24 }
142
+ And { match.match_type == Pio::OpenFlow13::MATCH_TYPE_OXM }
143
+ And { match.match_length == 18 }
144
+ And { match.match_fields.size == 2 }
145
+ And do
146
+ match.match_fields[0].oxm_class ==
147
+ Pio::OpenFlow13::Match::OXM_CLASS_OPENFLOW_BASIC
148
+ end
149
+ And do
150
+ match.match_fields[0].oxm_field ==
151
+ Pio::OpenFlow13::Match::EtherType::OXM_FIELD
152
+ end
153
+ And { match.match_fields[0].masked? == false }
154
+ And { match.match_fields[0].oxm_length == 2 }
155
+ And do
156
+ match.match_fields[1].oxm_class ==
157
+ Pio::OpenFlow13::Match::OXM_CLASS_OPENFLOW_BASIC
158
+ end
159
+ And do
160
+ match.match_fields[1].oxm_field ==
161
+ Pio::OpenFlow13::Match::Ipv4DestinationAddress::OXM_FIELD
162
+ end
163
+ And { match.match_fields[1].masked? == false }
164
+ And { match.match_fields[1].oxm_length == 4 }
165
+ end
166
+ end
167
+
168
+ def read_raw_data_file(name)
169
+ IO.read File.join(__dir__, '..', '..', '..', name)
170
+ end
171
+
172
+ describe '.read' do
173
+ When(:match) { Pio::OpenFlow13::Match.read(raw_data) }
174
+
175
+ context 'with file "features/open_flow13/oxm_no_fields.raw"' do
176
+ Given(:raw_data) do
177
+ read_raw_data_file 'features/open_flow13/oxm_no_fields.raw'
178
+ end
179
+ Then { match.match_fields == [] }
180
+ And { match.class == Pio::OpenFlow13::Match }
181
+ And { match.length == 8 }
182
+ And { match.match_type == Pio::OpenFlow13::MATCH_TYPE_OXM }
183
+ And { match.match_length == 4 }
184
+ end
185
+
186
+ context 'with file "features/open_flow13/oxm_in_port_field.raw"' do
187
+ Given(:raw_data) do
188
+ read_raw_data_file 'features/open_flow13/oxm_in_port_field.raw'
189
+ end
190
+ Then { match.in_port == 1 }
191
+ And { match.class == Pio::OpenFlow13::Match }
192
+ And { match.length == 16 }
193
+ And { match.match_type == Pio::OpenFlow13::MATCH_TYPE_OXM }
194
+ And { match.match_length == 12 }
195
+ And { match.match_fields.size == 1 }
196
+ And do
197
+ match.match_fields[0].oxm_class ==
198
+ Pio::OpenFlow13::Match::OXM_CLASS_OPENFLOW_BASIC
199
+ end
200
+ And do
201
+ match.match_fields[0].oxm_field ==
202
+ Pio::OpenFlow13::Match::InPort::OXM_FIELD
203
+ end
204
+ And { match.match_fields[0].masked? == false }
205
+ And { match.match_fields[0].oxm_length == 4 }
206
+ end
207
+
208
+ context 'with file "features/open_flow13/oxm_ether_destination_field.raw"' do
209
+ Given(:raw_data) do
210
+ read_raw_data_file 'features/open_flow13/oxm_ether_destination_field.raw'
211
+ end
212
+ Then { match.ether_destination_address == 'ff:ff:ff:ff:ff:ff' }
213
+ And { match.class == Pio::OpenFlow13::Match }
214
+ And { match.length == 16 }
215
+ And { match.match_type == Pio::OpenFlow13::MATCH_TYPE_OXM }
216
+ And { match.match_length == 14 }
217
+ And { match.match_fields.size == 1 }
218
+ And do
219
+ match.match_fields[0].oxm_class ==
220
+ Pio::OpenFlow13::Match::OXM_CLASS_OPENFLOW_BASIC
221
+ end
222
+ And do
223
+ match.match_fields[0].oxm_field ==
224
+ Pio::OpenFlow13::Match::EtherDestinationAddress::OXM_FIELD
225
+ end
226
+ And { match.match_fields[0].masked? == false }
227
+ And { match.match_fields[0].oxm_length == 6 }
228
+ end
229
+
230
+ context 'with file "features/open_flow13/oxm_ether_source_field.raw"' do
231
+ Given(:raw_data) do
232
+ read_raw_data_file 'features/open_flow13/oxm_ether_source_field.raw'
233
+ end
234
+ Then { match.ether_source_address == '01:02:03:04:05:06' }
235
+ And { match.class == Pio::OpenFlow13::Match }
236
+ And { match.length == 16 }
237
+ And { match.match_type == Pio::OpenFlow13::MATCH_TYPE_OXM }
238
+ And { match.match_length == 14 }
239
+ And { match.match_fields.size == 1 }
240
+ And do
241
+ match.match_fields[0].oxm_class ==
242
+ Pio::OpenFlow13::Match::OXM_CLASS_OPENFLOW_BASIC
243
+ end
244
+ And do
245
+ match.match_fields[0].oxm_field ==
246
+ Pio::OpenFlow13::Match::EtherSourceAddress::OXM_FIELD
247
+ end
248
+ And { match.match_fields[0].masked? == false }
249
+ And { match.match_fields[0].oxm_length == 6 }
250
+ end
251
+
252
+ context 'with file "features/open_flow13/oxm_masked_ether_destination_field.raw"' do
253
+ Given(:raw_data) do
254
+ read_raw_data_file 'features/open_flow13/oxm_masked_ether_destination_field.raw'
255
+ end
256
+ Then { match.ether_destination_address == 'ff:ff:ff:ff:ff:ff' }
257
+ Then { match.ether_destination_address_mask == 'ff:ff:ff:00:00:00' }
258
+ And { match.class == Pio::OpenFlow13::Match }
259
+ And { match.length == 24 }
260
+ And { match.match_type == Pio::OpenFlow13::MATCH_TYPE_OXM }
261
+ And { match.match_length == 20 }
262
+ And { match.match_fields.size == 1 }
263
+ And do
264
+ match.match_fields[0].oxm_class ==
265
+ Pio::OpenFlow13::Match::OXM_CLASS_OPENFLOW_BASIC
266
+ end
267
+ And do
268
+ match.match_fields[0].oxm_field ==
269
+ Pio::OpenFlow13::Match::EtherDestinationAddress::OXM_FIELD
270
+ end
271
+ And { match.match_fields[0].masked? == true }
272
+ And { match.match_fields[0].oxm_length == 12 }
273
+ end
274
+
275
+ context 'with file "features/open_flow13/oxm_masked_ether_source_field.raw"' do
276
+ Given(:raw_data) do
277
+ read_raw_data_file 'features/open_flow13/oxm_masked_ether_source_field.raw'
278
+ end
279
+ Then { match.ether_source_address == '01:02:03:04:05:06' }
280
+ Then { match.ether_source_address_mask == 'ff:ff:ff:00:00:00' }
281
+ And { match.class == Pio::OpenFlow13::Match }
282
+ And { match.length == 24 }
283
+ And { match.match_type == Pio::OpenFlow13::MATCH_TYPE_OXM }
284
+ And { match.match_length == 20 }
285
+ And { match.match_fields.size == 1 }
286
+ And do
287
+ match.match_fields[0].oxm_class ==
288
+ Pio::OpenFlow13::Match::OXM_CLASS_OPENFLOW_BASIC
289
+ end
290
+ And do
291
+ match.match_fields[0].oxm_field ==
292
+ Pio::OpenFlow13::Match::EtherSourceAddress::OXM_FIELD
293
+ end
294
+ And { match.match_fields[0].masked? == true }
295
+ And { match.match_fields[0].oxm_length == 12 }
296
+ end
297
+
298
+ context 'with file "features/open_flow13/oxm_ether_type_field.raw"' do
299
+ Given(:raw_data) do
300
+ read_raw_data_file 'features/open_flow13/oxm_ether_type_field.raw'
301
+ end
302
+ Then { match.ether_type == 0 }
303
+ And { match.class == Pio::OpenFlow13::Match }
304
+ And { match.length == 16 }
305
+ And { match.match_type == Pio::OpenFlow13::MATCH_TYPE_OXM }
306
+ And { match.match_length == 10 }
307
+ And { match.match_fields.size == 1 }
308
+ And do
309
+ match.match_fields[0].oxm_class ==
310
+ Pio::OpenFlow13::Match::OXM_CLASS_OPENFLOW_BASIC
311
+ end
312
+ And do
313
+ match.match_fields[0].oxm_field ==
314
+ Pio::OpenFlow13::Match::EtherType::OXM_FIELD
315
+ end
316
+ And { match.match_fields[0].masked? == false }
317
+ And { match.match_fields[0].oxm_length == 2 }
318
+ end
319
+
320
+ context 'with file "features/open_flow13/oxm_ipv4_source_field.raw"' do
321
+ Given(:raw_data) do
322
+ read_raw_data_file 'features/open_flow13/oxm_ipv4_source_field.raw'
323
+ end
324
+ Then { match.ether_type == 0x0800 }
325
+ Then { match.ipv4_source_address == '1.2.3.4' }
326
+ And { match.class == Pio::OpenFlow13::Match }
327
+ And { match.length == 24 }
328
+ And { match.match_type == Pio::OpenFlow13::MATCH_TYPE_OXM }
329
+ And { match.match_length == 18 }
330
+ And { match.match_fields.size == 2 }
331
+ And do
332
+ match.match_fields[0].oxm_class ==
333
+ Pio::OpenFlow13::Match::OXM_CLASS_OPENFLOW_BASIC
334
+ end
335
+ And do
336
+ match.match_fields[0].oxm_field ==
337
+ Pio::OpenFlow13::Match::EtherType::OXM_FIELD
338
+ end
339
+ And { match.match_fields[0].masked? == false }
340
+ And { match.match_fields[0].oxm_length == 2 }
341
+ And do
342
+ match.match_fields[1].oxm_class ==
343
+ Pio::OpenFlow13::Match::OXM_CLASS_OPENFLOW_BASIC
344
+ end
345
+ And do
346
+ match.match_fields[1].oxm_field ==
347
+ Pio::OpenFlow13::Match::Ipv4SourceAddress::OXM_FIELD
348
+ end
349
+ And { match.match_fields[1].masked? == false }
350
+ And { match.match_fields[1].oxm_length == 4 }
351
+ end
352
+
353
+ context 'with file "features/open_flow13/oxm_ipv4_destination_field.raw"' do
354
+ Given(:raw_data) do
355
+ read_raw_data_file 'features/open_flow13/oxm_ipv4_destination_field.raw'
356
+ end
357
+ Then { match.ether_type == 0x0800 }
358
+ Then { match.ipv4_destination_address == '11.22.33.44' }
359
+ And { match.class == Pio::OpenFlow13::Match }
360
+ And { match.length == 24 }
361
+ And { match.match_type == Pio::OpenFlow13::MATCH_TYPE_OXM }
362
+ And { match.match_length == 18 }
363
+ And { match.match_fields.size == 2 }
364
+ And do
365
+ match.match_fields[0].oxm_class ==
366
+ Pio::OpenFlow13::Match::OXM_CLASS_OPENFLOW_BASIC
367
+ end
368
+ And do
369
+ match.match_fields[0].oxm_field ==
370
+ Pio::OpenFlow13::Match::EtherType::OXM_FIELD
371
+ end
372
+ And { match.match_fields[0].masked? == false }
373
+ And { match.match_fields[0].oxm_length == 2 }
374
+ And do
375
+ match.match_fields[1].oxm_class ==
376
+ Pio::OpenFlow13::Match::OXM_CLASS_OPENFLOW_BASIC
377
+ end
378
+ And do
379
+ match.match_fields[1].oxm_field ==
380
+ Pio::OpenFlow13::Match::Ipv4DestinationAddress::OXM_FIELD
381
+ end
382
+ And { match.match_fields[1].masked? == false }
383
+ And { match.match_fields[1].oxm_length == 4 }
384
+ end
385
+ end
386
+ end
387
+ # rubocop:enable LineLength
@@ -86,8 +86,7 @@ describe Pio::PacketOut do
86
86
  When(:binary) { [1, 0, 0, 8, 0, 0, 0, 0].pack('C*') }
87
87
 
88
88
  Then do
89
- result == Failure(Pio::ParseError,
90
- 'Invalid PacketOut message.')
89
+ result == Failure(Pio::ParseError, 'Invalid PacketOut message.')
91
90
  end
92
91
  end
93
92
  end
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.20.0
4
+ version: 0.20.1
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-04-22 00:00:00.000000000 Z
11
+ date: 2015-06-10 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.9.4
47
+ version: 1.10.3
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.9.4
54
+ version: 1.10.3
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: pry
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -72,14 +72,14 @@ dependencies:
72
72
  requirements:
73
73
  - - ~>
74
74
  - !ruby/object:Gem::Version
75
- version: 2.12.5
75
+ version: 2.12.6
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - ~>
81
81
  - !ruby/object:Gem::Version
82
- version: 2.12.5
82
+ version: 2.12.6
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: guard-bundler
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -114,14 +114,14 @@ dependencies:
114
114
  requirements:
115
115
  - - ~>
116
116
  - !ruby/object:Gem::Version
117
- version: 4.5.0
117
+ version: 4.5.2
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - ~>
123
123
  - !ruby/object:Gem::Version
124
- version: 4.5.0
124
+ version: 4.5.2
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: guard-rubocop
127
127
  requirement: !ruby/object:Gem::Requirement
@@ -156,14 +156,14 @@ dependencies:
156
156
  requirements:
157
157
  - - ~>
158
158
  - !ruby/object:Gem::Version
159
- version: 0.9.4
159
+ version: 0.9.5
160
160
  type: :development
161
161
  prerelease: false
162
162
  version_requirements: !ruby/object:Gem::Requirement
163
163
  requirements:
164
164
  - - ~>
165
165
  - !ruby/object:Gem::Version
166
- version: 0.9.4
166
+ version: 0.9.5
167
167
  - !ruby/object:Gem::Dependency
168
168
  name: rb-inotify
169
169
  requirement: !ruby/object:Gem::Requirement
@@ -198,14 +198,14 @@ dependencies:
198
198
  requirements:
199
199
  - - ~>
200
200
  - !ruby/object:Gem::Version
201
- version: 0.5.10
201
+ version: 0.6.2
202
202
  type: :development
203
203
  prerelease: false
204
204
  version_requirements: !ruby/object:Gem::Requirement
205
205
  requirements:
206
206
  - - ~>
207
207
  - !ruby/object:Gem::Version
208
- version: 0.5.10
208
+ version: 0.6.2
209
209
  - !ruby/object:Gem::Dependency
210
210
  name: relish
211
211
  requirement: !ruby/object:Gem::Requirement
@@ -254,14 +254,14 @@ dependencies:
254
254
  requirements:
255
255
  - - ~>
256
256
  - !ruby/object:Gem::Version
257
- version: 0.8.0
257
+ version: 0.8.1
258
258
  type: :development
259
259
  prerelease: false
260
260
  version_requirements: !ruby/object:Gem::Requirement
261
261
  requirements:
262
262
  - - ~>
263
263
  - !ruby/object:Gem::Version
264
- version: 0.8.0
264
+ version: 0.8.1
265
265
  - !ruby/object:Gem::Dependency
266
266
  name: cucumber
267
267
  requirement: !ruby/object:Gem::Requirement
@@ -310,14 +310,14 @@ dependencies:
310
310
  requirements:
311
311
  - - ~>
312
312
  - !ruby/object:Gem::Version
313
- version: 2.1.0
313
+ version: 2.2.1
314
314
  type: :development
315
315
  prerelease: false
316
316
  version_requirements: !ruby/object:Gem::Requirement
317
317
  requirements:
318
318
  - - ~>
319
319
  - !ruby/object:Gem::Version
320
- version: 2.1.0
320
+ version: 2.2.1
321
321
  - !ruby/object:Gem::Dependency
322
322
  name: rspec
323
323
  requirement: !ruby/object:Gem::Requirement
@@ -352,14 +352,14 @@ dependencies:
352
352
  requirements:
353
353
  - - ~>
354
354
  - !ruby/object:Gem::Version
355
- version: 0.30.0
355
+ version: 0.32.0
356
356
  type: :development
357
357
  prerelease: false
358
358
  version_requirements: !ruby/object:Gem::Requirement
359
359
  requirements:
360
360
  - - ~>
361
361
  - !ruby/object:Gem::Version
362
- version: 0.30.0
362
+ version: 0.32.0
363
363
  description: Pure ruby packet parser and generator.
364
364
  email:
365
365
  - yasuhito@gmail.com
@@ -480,6 +480,31 @@ files:
480
480
  - features/open_flow13/hello.feature
481
481
  - features/open_flow13/hello_no_version_bitmap.raw
482
482
  - features/open_flow13/hello_version_bitmap.raw
483
+ - features/open_flow13/match.feature
484
+ - features/open_flow13/oxm_ether_destination_field.raw
485
+ - features/open_flow13/oxm_ether_source_field.raw
486
+ - features/open_flow13/oxm_ether_type_field.raw
487
+ - features/open_flow13/oxm_in_phy_port_field.raw
488
+ - features/open_flow13/oxm_in_port_field.raw
489
+ - features/open_flow13/oxm_ipv4_destination_field.raw
490
+ - features/open_flow13/oxm_ipv4_source_field.raw
491
+ - features/open_flow13/oxm_ipv6_destination_field.raw
492
+ - features/open_flow13/oxm_ipv6_source_field.raw
493
+ - features/open_flow13/oxm_masked_ether_destination_field.raw
494
+ - features/open_flow13/oxm_masked_ether_source_field.raw
495
+ - features/open_flow13/oxm_masked_ipv4_destination_field.raw
496
+ - features/open_flow13/oxm_masked_ipv4_source_field.raw
497
+ - features/open_flow13/oxm_masked_ipv6_destination_field.raw
498
+ - features/open_flow13/oxm_masked_ipv6_source_field.raw
499
+ - features/open_flow13/oxm_metadata_field.raw
500
+ - features/open_flow13/oxm_metadata_masked_field.raw
501
+ - features/open_flow13/oxm_no_fields.raw
502
+ - features/open_flow13/oxm_tcp_destination_field.raw
503
+ - features/open_flow13/oxm_tcp_field.raw
504
+ - features/open_flow13/oxm_tcp_source_field.raw
505
+ - features/open_flow13/oxm_udp_destination_field.raw
506
+ - features/open_flow13/oxm_udp_field.raw
507
+ - features/open_flow13/oxm_udp_source_field.raw
483
508
  - features/step_definitions/open_flow_steps.rb
484
509
  - features/step_definitions/packet_data_steps.rb
485
510
  - features/support/env.rb
@@ -561,6 +586,7 @@ files:
561
586
  - lib/pio/open_flow13/features_reply.rb
562
587
  - lib/pio/open_flow13/features_request.rb
563
588
  - lib/pio/open_flow13/hello.rb
589
+ - lib/pio/open_flow13/match.rb
564
590
  - lib/pio/options.rb
565
591
  - lib/pio/parse_error.rb
566
592
  - lib/pio/payload.rb
@@ -575,6 +601,7 @@ files:
575
601
  - lib/pio/set_vlan_vid.rb
576
602
  - lib/pio/strip_vlan_header.rb
577
603
  - lib/pio/type/ip_address.rb
604
+ - lib/pio/type/ipv6_address.rb
578
605
  - lib/pio/type/mac_address.rb
579
606
  - lib/pio/udp.rb
580
607
  - lib/pio/udp_header.rb
@@ -602,6 +629,7 @@ files:
602
629
  - spec/pio/open_flow/phy_port_spec.rb
603
630
  - spec/pio/open_flow/type_spec.rb
604
631
  - spec/pio/open_flow13/hello_spec.rb
632
+ - spec/pio/open_flow13/match_spec.rb
605
633
  - spec/pio/packet_out_spec.rb
606
634
  - spec/pio/send_out_port_spec.rb
607
635
  - spec/pio/set_ether_destination_address_spec.rb
@@ -636,7 +664,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
636
664
  version: '0'
637
665
  requirements: []
638
666
  rubyforge_project:
639
- rubygems_version: 2.4.3
667
+ rubygems_version: 2.4.7
640
668
  signing_key:
641
669
  specification_version: 4
642
670
  summary: Packet parser and generator.
@@ -661,6 +689,7 @@ test_files:
661
689
  - spec/pio/lldp/options_spec.rb
662
690
  - spec/pio/set_vlan_priority_spec.rb
663
691
  - spec/pio/open_flow13/hello_spec.rb
692
+ - spec/pio/open_flow13/match_spec.rb
664
693
  - spec/pio/mac_spec.rb
665
694
  - spec/pio/icmp/request_spec.rb
666
695
  - spec/pio/icmp/reply_spec.rb
@@ -733,18 +762,43 @@ test_files:
733
762
  - features/open_flow10/echo_request.raw
734
763
  - features/lldp.minimal.pcap
735
764
  - features/open_flow13/echo_request_body.raw
765
+ - features/open_flow13/oxm_no_fields.raw
766
+ - features/open_flow13/oxm_ipv4_source_field.raw
736
767
  - features/open_flow13/hello_version_bitmap.raw
737
768
  - features/open_flow13/echo_reply_body.raw
738
769
  - features/open_flow13/features_reply.raw
739
770
  - features/open_flow13/features_request.feature
771
+ - features/open_flow13/oxm_masked_ether_destination_field.raw
772
+ - features/open_flow13/oxm_tcp_source_field.raw
773
+ - features/open_flow13/oxm_ipv6_destination_field.raw
740
774
  - features/open_flow13/echo_request.feature
741
775
  - features/open_flow13/features_request.raw
776
+ - features/open_flow13/oxm_masked_ipv6_destination_field.raw
777
+ - features/open_flow13/oxm_udp_field.raw
742
778
  - features/open_flow13/features_reply.feature
779
+ - features/open_flow13/oxm_masked_ether_source_field.raw
780
+ - features/open_flow13/oxm_in_port_field.raw
781
+ - features/open_flow13/oxm_tcp_field.raw
782
+ - features/open_flow13/oxm_in_phy_port_field.raw
783
+ - features/open_flow13/oxm_ether_type_field.raw
743
784
  - features/open_flow13/echo_reply_no_body.raw
785
+ - features/open_flow13/oxm_tcp_destination_field.raw
786
+ - features/open_flow13/oxm_masked_ipv4_source_field.raw
787
+ - features/open_flow13/match.feature
788
+ - features/open_flow13/oxm_udp_source_field.raw
744
789
  - features/open_flow13/echo_request_no_body.raw
790
+ - features/open_flow13/oxm_masked_ipv6_source_field.raw
791
+ - features/open_flow13/oxm_ipv6_source_field.raw
792
+ - features/open_flow13/oxm_masked_ipv4_destination_field.raw
745
793
  - features/open_flow13/echo_reply.feature
794
+ - features/open_flow13/oxm_metadata_field.raw
795
+ - features/open_flow13/oxm_metadata_masked_field.raw
796
+ - features/open_flow13/oxm_ipv4_destination_field.raw
797
+ - features/open_flow13/oxm_udp_destination_field.raw
746
798
  - features/open_flow13/hello.feature
799
+ - features/open_flow13/oxm_ether_source_field.raw
747
800
  - features/open_flow13/hello_no_version_bitmap.raw
801
+ - features/open_flow13/oxm_ether_destination_field.raw
748
802
  - features/step_definitions/packet_data_steps.rb
749
803
  - features/step_definitions/open_flow_steps.rb
750
804
  - features/icmp.pcap