openflow-protocol 0.1.4 → 0.1.6

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 (54) hide show
  1. checksums.yaml +4 -4
  2. data/lib/messages/echo_reply.rb +6 -0
  3. data/lib/openflow-protocol/version.rb +5 -0
  4. data/spec/actions/action_enqueue_spec.rb +30 -0
  5. data/spec/actions/action_output_spec.rb +29 -0
  6. data/spec/actions/action_set_destination_port_spec.rb +26 -0
  7. data/spec/actions/action_set_ip_destination_spec.rb +25 -0
  8. data/spec/actions/action_set_ip_source_spec.rb +25 -0
  9. data/spec/actions/action_set_ip_tos_spec.rb +26 -0
  10. data/spec/actions/action_set_mac_destination_spec.rb +26 -0
  11. data/spec/actions/action_set_mac_source_spec.rb +26 -0
  12. data/spec/actions/action_set_source_port_spec.rb +26 -0
  13. data/spec/actions/action_set_vlan_id_spec.rb +26 -0
  14. data/spec/actions/action_set_vlan_pcp_spec.rb +26 -0
  15. data/spec/actions/action_strip_vlan_spec.rb +17 -0
  16. data/spec/actions/action_vendor_spec.rb +25 -0
  17. data/spec/actions/actions_spec.rb +33 -0
  18. data/spec/messages/barrier_reply_spec.rb +25 -0
  19. data/spec/messages/barrier_request_spec.rb +25 -0
  20. data/spec/messages/echo_reply_spec.rb +44 -0
  21. data/spec/messages/echo_request_spec.rb +53 -0
  22. data/spec/messages/error_spec.rb +56 -0
  23. data/spec/messages/features_reply_spec.rb +204 -0
  24. data/spec/messages/features_request_spec.rb +25 -0
  25. data/spec/messages/flow_mod_spec.rb +139 -0
  26. data/spec/messages/flow_removed_spec.rb +109 -0
  27. data/spec/messages/get_config_reply_spec.rb +39 -0
  28. data/spec/messages/get_config_request_spec.rb +25 -0
  29. data/spec/messages/hello_spec.rb +25 -0
  30. data/spec/messages/packet_in_spec.rb +76 -0
  31. data/spec/messages/packet_out_spec.rb +56 -0
  32. data/spec/messages/parser_spec.rb +43 -0
  33. data/spec/messages/port_mod_spec.rb +64 -0
  34. data/spec/messages/port_status_spec.rb +52 -0
  35. data/spec/messages/set_config_spec.rb +39 -0
  36. data/spec/messages/statistics_reply_spec.rb +411 -0
  37. data/spec/messages/statistics_request_spec.rb +355 -0
  38. data/spec/messages/vendor_spec.rb +56 -0
  39. data/spec/spec_helper.rb +7 -0
  40. data/spec/statistics/aggregate_statistics_reply_spec.rb +31 -0
  41. data/spec/statistics/aggregate_statistics_request_spec.rb +46 -0
  42. data/spec/statistics/description_statistics_spec.rb +38 -0
  43. data/spec/statistics/flow_statistics_reply_spec.rb +74 -0
  44. data/spec/statistics/flow_statistics_request_spec.rb +46 -0
  45. data/spec/statistics/port_statistics_reply_spec.rb +81 -0
  46. data/spec/statistics/port_statistics_request_spec.rb +19 -0
  47. data/spec/statistics/queue_statistics_reply_spec.rb +42 -0
  48. data/spec/statistics/queue_statistics_request_spec.rb +26 -0
  49. data/spec/statistics/table_statistics_spec.rb +54 -0
  50. data/spec/statistics/vendor_statistics_spec.rb +25 -0
  51. data/spec/structs/match_spec.rb +143 -0
  52. data/spec/structs/physical_port_spec.rb +63 -0
  53. data/spec/structs/port_number_spec.rb +19 -0
  54. metadata +109 -8
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ describe OFSetConfig do
4
+ it 'should read binary' do
5
+ msg = OFSetConfig.read [
6
+ 1, 9, 0, 12, 0, 0, 0, 1, # header
7
+ 0, 0, # flags
8
+ 0, 0xff # miss_send_length
9
+ ].pack('C*')
10
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
11
+ expect(msg.type).to eq(:set_config)
12
+ expect(msg.len).to eq(12)
13
+ expect(msg.xid).to eq(1)
14
+ expect(msg.flags).to eq(:fragments_normal)
15
+ expect(msg.miss_send_length).to eq(0xff)
16
+ end
17
+ it 'should initialize with default values' do
18
+ msg = OFSetConfig.new
19
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
20
+ expect(msg.type).to eq(:set_config)
21
+ expect(msg.len).to eq(12)
22
+ expect(msg.xid).to eq(0)
23
+ expect(msg.flags).to eq(:fragments_normal)
24
+ expect(msg.miss_send_length).to eq(0)
25
+ end
26
+ it 'should initialize with some values' do
27
+ msg = OFSetConfig.new(
28
+ xid: 1,
29
+ flags: :fragments_normal,
30
+ miss_send_length: 0xff
31
+ )
32
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
33
+ expect(msg.type).to eq(:set_config)
34
+ expect(msg.len).to eq(12)
35
+ expect(msg.xid).to eq(1)
36
+ expect(msg.flags).to eq(:fragments_normal)
37
+ expect(msg.miss_send_length).to eq(0xff)
38
+ end
39
+ end
@@ -0,0 +1,411 @@
1
+ require 'spec_helper'
2
+
3
+ describe OFStatisticsReply do
4
+ context 'with description' do
5
+ it 'should read binary' do
6
+ desc = 'Manufacturer description'.pad(256) +
7
+ 'Hardware description'.pad(256) +
8
+ 'Software description'.pad(256) +
9
+ '123456789'.pad(32) +
10
+ 'Datapath description'.pad(256)
11
+
12
+ msg = OFStatisticsReply.read [
13
+ 1, 17, 0x04, 0x2c, 0, 0, 0, 1, # header
14
+ 0, 0, # statistic_type
15
+ 0, 1, # flags
16
+ ].pack('C*') + desc
17
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
18
+ expect(msg.type).to eq(:statistics_reply)
19
+ expect(msg.len).to eq(1068)
20
+ expect(msg.xid).to eq(1)
21
+ expect(msg.statistic_type).to eq(:description)
22
+ expect(msg.flags).to eq([:reply_more])
23
+ expect(msg.statistics.serial_number).to eq('123456789')
24
+ end
25
+ it 'should initialize with default values' do
26
+ msg = OFStatisticsReply.new
27
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
28
+ expect(msg.type).to eq(:statistics_reply)
29
+ expect(msg.len).to eq(1068)
30
+ expect(msg.xid).to eq(0)
31
+ expect(msg.statistic_type).to eq(:description)
32
+ expect(msg.flags).to be_empty
33
+ expect(msg.statistics.serial_number).to eq('')
34
+ end
35
+ it 'should initialize with some values' do
36
+ msg = OFStatisticsReply.new(
37
+ xid: 1,
38
+ statistic_type: :description,
39
+ flags: [:reply_more],
40
+ statistics: {
41
+ serial_number: '123456789'
42
+ }
43
+ )
44
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
45
+ expect(msg.type).to eq(:statistics_reply)
46
+ expect(msg.len).to eq(1068)
47
+ expect(msg.xid).to eq(1)
48
+ expect(msg.statistic_type).to eq(:description)
49
+ expect(msg.flags).to eq([:reply_more])
50
+ expect(msg.statistics.serial_number).to eq('123456789')
51
+ end
52
+ end
53
+
54
+ context 'with flow' do
55
+ it 'should read binary' do
56
+ msg = OFStatisticsReply.read [
57
+ 1, 17, 0, 108, 0, 0, 0, 1, # header
58
+ 0, 1, # statistic_type
59
+ 0, 1, # flags
60
+
61
+ # flow_statistics_reply
62
+ 0, 96, # len
63
+ 1, # table_id
64
+ 0, # padding
65
+
66
+ # match
67
+ 0, 0x30, 0x20, 0x4f, # wildcards
68
+ 0, 0, # in_port
69
+ 0, 0, 0, 0, 0, 0, # mac_source
70
+ 0, 0, 0, 0, 0, 0, # mac_destination
71
+ 0xff, 0xff, # vlan_id
72
+ 0, # vlan_pcp
73
+ 0, # padding
74
+ 8, 0, # mac_protocol
75
+ 0, # ip_tos
76
+ 6, # ip_protocol
77
+ 0, 0, # padding
78
+ 0, 0, 0, 0, # ip_source
79
+ 192, 168, 0, 2, # ip_destination
80
+ 0, 0, # source_port
81
+ 0x0b, 0xb8, # destination_port
82
+
83
+ 0, 0, 0, 50, # duration_seconds
84
+ 0, 0, 0, 10, # duration_nanoseconds
85
+ 0x0b, 0xb8, # priority
86
+ 0, 100, # idle_timeout
87
+ 1, 0x2c, # hard_timeout
88
+ 0, 0, 0, 0, 0, 0, # padding
89
+ 0, 0, 0, 0, 0, 0, 0, 1, # cookie
90
+ 0, 0, 0, 0, 0, 0, 0, 10, # packet_count
91
+ 0, 0, 0, 0, 0, 0, 0, 80, # byte_count
92
+
93
+ # actions
94
+ # output
95
+ 0, 0, 0, 8, # header
96
+ 0, 1, # port
97
+ 0xff, 0xff # max_length
98
+ ].pack('C*')
99
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
100
+ expect(msg.type).to eq(:statistics_reply)
101
+ expect(msg.len).to eq(108)
102
+ expect(msg.xid).to eq(1)
103
+ expect(msg.statistic_type).to eq(:flow)
104
+ expect(msg.flags).to eq([:reply_more])
105
+ expect(msg.statistics.table_id).to eq(1)
106
+ expect(msg.statistics.actions.length).to eq(1)
107
+ end
108
+ it 'should initialize with default values' do
109
+ msg = OFStatisticsReply.new(statistic_type: :flow)
110
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
111
+ expect(msg.type).to eq(:statistics_reply)
112
+ expect(msg.len).to eq(100)
113
+ expect(msg.xid).to eq(0)
114
+ expect(msg.statistic_type).to eq(:flow)
115
+ expect(msg.flags).to be_empty
116
+ expect(msg.statistics.table_id).to eq(:all)
117
+ expect(msg.statistics.actions).to be_empty
118
+ end
119
+ it 'should initialize with some values' do
120
+ msg = OFStatisticsReply.new(
121
+ xid: 1,
122
+ statistic_type: :flow,
123
+ flags: [:reply_more],
124
+ statistics: {
125
+ table_id: 1,
126
+ actions: [OFActionOutput.new(port: 1)]
127
+ }
128
+ )
129
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
130
+ expect(msg.type).to eq(:statistics_reply)
131
+ expect(msg.len).to eq(108)
132
+ expect(msg.xid).to eq(1)
133
+ expect(msg.statistic_type).to eq(:flow)
134
+ expect(msg.flags).to eq([:reply_more])
135
+ expect(msg.statistics.table_id).to eq(1)
136
+ expect(msg.statistics.actions.length).to eq(1)
137
+ end
138
+ end
139
+
140
+ context 'with aggregate' do
141
+ it 'should read binary' do
142
+ msg = OFStatisticsReply.read [
143
+ 1, 17, 0, 36, 0, 0, 0, 1, # header
144
+ 0, 2, # statistic_type
145
+ 0, 1, # flags
146
+
147
+ # aggregate_statistics_reply
148
+ 0, 0, 0, 0, 0, 0, 0, 10, # packet_count
149
+ 0, 0, 0, 0, 0, 0, 0, 80, # byte_count
150
+ 0, 0, 0, 4, # flow_count
151
+ 0, 0, 0, 0 # padding
152
+ ].pack('C*')
153
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
154
+ expect(msg.type).to eq(:statistics_reply)
155
+ expect(msg.len).to eq(36)
156
+ expect(msg.xid).to eq(1)
157
+ expect(msg.statistic_type).to eq(:aggregate)
158
+ expect(msg.flags).to eq([:reply_more])
159
+ expect(msg.statistics.packet_count).to eq(10)
160
+ end
161
+ it 'should initialize with default values' do
162
+ msg = OFStatisticsReply.new(statistic_type: :aggregate)
163
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
164
+ expect(msg.type).to eq(:statistics_reply)
165
+ expect(msg.len).to eq(36)
166
+ expect(msg.xid).to eq(0)
167
+ expect(msg.statistic_type).to eq(:aggregate)
168
+ expect(msg.flags).to be_empty
169
+ expect(msg.statistics.packet_count).to eq(0)
170
+ end
171
+ it 'should initialize with some values' do
172
+ msg = OFStatisticsReply.new(
173
+ xid: 1,
174
+ statistic_type: :aggregate,
175
+ flags: [:reply_more],
176
+ statistics: {
177
+ packet_count: 10,
178
+ byte_count: 80,
179
+ flow_count: 4
180
+ }
181
+ )
182
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
183
+ expect(msg.type).to eq(:statistics_reply)
184
+ expect(msg.len).to eq(36)
185
+ expect(msg.xid).to eq(1)
186
+ expect(msg.statistic_type).to eq(:aggregate)
187
+ expect(msg.flags).to eq([:reply_more])
188
+ expect(msg.statistics.packet_count).to eq(10)
189
+ end
190
+ end
191
+
192
+ context 'with table' do
193
+ it 'should read binary' do
194
+ msg = OFStatisticsReply.read [
195
+ 1, 17, 0, 76, 0, 0, 0, 1, # header
196
+ 0, 3, # statistic_type
197
+ 0, 1, # flags
198
+
199
+ # array of table_statistics
200
+ 1, # table_id
201
+ 0, 0, 0, # padding
202
+ 116, 97, 98, 108, 101, 45, 49, 0, # name
203
+ 0, 0, 0, 0, 0, 0, 0, 0,
204
+ 0, 0, 0, 0, 0, 0, 0, 0,
205
+ 0, 0, 0, 0, 0, 0, 0, 0,
206
+ 0, 8, 0x20, 1, # wildcards
207
+ 0, 0, 0, 10, # max_entries
208
+ 0, 0, 0, 5, # active_count
209
+ 0, 0, 0, 0, 0, 0, 0, 4, # lookup_count
210
+ 0, 0, 0, 0, 0, 0, 0, 1 # matched_count
211
+ ].pack('C*')
212
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
213
+ expect(msg.type).to eq(:statistics_reply)
214
+ expect(msg.len).to eq(76)
215
+ expect(msg.xid).to eq(1)
216
+ expect(msg.statistic_type).to eq(:table)
217
+ expect(msg.flags).to eq([:reply_more])
218
+ expect(msg.statistics.length).to eq(1)
219
+ expect(msg.statistics.first.table_id).to eq(1)
220
+ end
221
+ it 'should initialize with default values' do
222
+ msg = OFStatisticsReply.new(statistic_type: :table)
223
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
224
+ expect(msg.type).to eq(:statistics_reply)
225
+ expect(msg.len).to eq(12)
226
+ expect(msg.xid).to eq(0)
227
+ expect(msg.statistic_type).to eq(:table)
228
+ expect(msg.flags).to be_empty
229
+ expect(msg.statistics).to be_empty
230
+ end
231
+ it 'should initialize with some values' do
232
+ msg = OFStatisticsReply.new(
233
+ xid: 1,
234
+ statistic_type: :table,
235
+ flags: [:reply_more],
236
+ statistics: [{table_id: 1}]
237
+ )
238
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
239
+ expect(msg.type).to eq(:statistics_reply)
240
+ expect(msg.len).to eq(76)
241
+ expect(msg.xid).to eq(1)
242
+ expect(msg.statistic_type).to eq(:table)
243
+ expect(msg.flags).to eq([:reply_more])
244
+ expect(msg.statistics.length).to eq(1)
245
+ expect(msg.statistics.first.table_id).to eq(1)
246
+ end
247
+ end
248
+
249
+ context 'with port' do
250
+ it 'should read binary' do
251
+ msg = OFStatisticsReply.read [
252
+ 1, 17, 0, 116, 0, 0, 0, 1, # header
253
+ 0, 4, # statistic_type
254
+ 0, 1, # flags
255
+
256
+ # array of port_statistics_reply
257
+ 0, 1, # port_number
258
+ 0, 0, 0, 0, 0, 0, # padding
259
+ 0, 0, 0, 0, 0, 0, 0, 10, # receive_packets
260
+ 0, 0, 0, 0, 0, 0, 0, 10, # transmit_packets
261
+ 0, 0, 0, 0, 0, 0, 0, 80, # receive_bytes
262
+ 0, 0, 0, 0, 0, 0, 0, 80, # transmit_bytes
263
+ 0, 0, 0, 0, 0, 0, 0, 5, # receive_dropped
264
+ 0, 0, 0, 0, 0, 0, 0, 5, # transmit_dropped
265
+ 0, 0, 0, 0, 0, 0, 0, 2, # receive_errors
266
+ 0, 0, 0, 0, 0, 0, 0, 2, # transmit_errors
267
+ 0, 0, 0, 0, 0, 0, 0, 1, # receive_frame_errors
268
+ 0, 0, 0, 0, 0, 0, 0, 0, # receive_overrun_errors
269
+ 0, 0, 0, 0, 0, 0, 0, 1, # receive_crc_errors
270
+ 0, 0, 0, 0, 0, 0, 0, 3 # collisions
271
+ ].pack('C*')
272
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
273
+ expect(msg.type).to eq(:statistics_reply)
274
+ expect(msg.len).to eq(116)
275
+ expect(msg.xid).to eq(1)
276
+ expect(msg.statistic_type).to eq(:port)
277
+ expect(msg.flags).to eq([:reply_more])
278
+ expect(msg.statistics.length).to eq(1)
279
+ expect(msg.statistics.first.port_number).to eq(1)
280
+ end
281
+ it 'should initialize with default values' do
282
+ msg = OFStatisticsReply.new(statistic_type: :port)
283
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
284
+ expect(msg.type).to eq(:statistics_reply)
285
+ expect(msg.len).to eq(12)
286
+ expect(msg.xid).to eq(0)
287
+ expect(msg.statistic_type).to eq(:port)
288
+ expect(msg.flags).to be_empty
289
+ expect(msg.statistics).to be_empty
290
+ end
291
+ it 'should initialize with some values' do
292
+ msg = OFStatisticsReply.new(
293
+ xid: 1,
294
+ statistic_type: :port,
295
+ flags: [:reply_more],
296
+ statistics: [{port_number: 1}]
297
+ )
298
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
299
+ expect(msg.type).to eq(:statistics_reply)
300
+ expect(msg.len).to eq(116)
301
+ expect(msg.xid).to eq(1)
302
+ expect(msg.statistic_type).to eq(:port)
303
+ expect(msg.flags).to eq([:reply_more])
304
+ expect(msg.statistics.length).to eq(1)
305
+ expect(msg.statistics.first.port_number).to eq(1)
306
+ end
307
+ end
308
+
309
+ context 'with queue' do
310
+ it 'should read binary' do
311
+ msg = OFStatisticsReply.read [
312
+ 1, 17, 0, 44, 0, 0, 0, 1, # header
313
+ 0, 5, # statistic_type
314
+ 0, 1, # flags
315
+
316
+ # array of queue_statistics_reply
317
+ 0, 1, # port_number
318
+ 0, 0, # padding
319
+ 0, 0, 0, 1, # queue_id
320
+ 0, 0, 0, 0, 0, 0, 0, 80, # transmit_bytes
321
+ 0, 0, 0, 0, 0, 0, 0, 10, # transmit_packets
322
+ 0, 0, 0, 0, 0, 0, 0, 2 # transmit_errors
323
+ ].pack('C*')
324
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
325
+ expect(msg.type).to eq(:statistics_reply)
326
+ expect(msg.len).to eq(44)
327
+ expect(msg.xid).to eq(1)
328
+ expect(msg.statistic_type).to eq(:queue)
329
+ expect(msg.flags).to eq([:reply_more])
330
+ expect(msg.statistics.length).to eq(1)
331
+ expect(msg.statistics.first.port_number).to eq(1)
332
+ end
333
+ it 'should initialize with default values' do
334
+ msg = OFStatisticsReply.new(statistic_type: :queue)
335
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
336
+ expect(msg.type).to eq(:statistics_reply)
337
+ expect(msg.len).to eq(12)
338
+ expect(msg.xid).to eq(0)
339
+ expect(msg.statistic_type).to eq(:queue)
340
+ expect(msg.flags).to be_empty
341
+ expect(msg.statistics).to be_empty
342
+ end
343
+ it 'should initialize with some values' do
344
+ msg = OFStatisticsReply.new(
345
+ xid: 1,
346
+ statistic_type: :queue,
347
+ flags: [:reply_more],
348
+ statistics: [{port_number: 1}]
349
+ )
350
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
351
+ expect(msg.type).to eq(:statistics_reply)
352
+ expect(msg.len).to eq(44)
353
+ expect(msg.xid).to eq(1)
354
+ expect(msg.statistic_type).to eq(:queue)
355
+ expect(msg.flags).to eq([:reply_more])
356
+ expect(msg.statistics.length).to eq(1)
357
+ expect(msg.statistics.first.port_number).to eq(1)
358
+ end
359
+ end
360
+
361
+ context 'with vendor' do
362
+ it 'should read binary' do
363
+ msg = OFStatisticsReply.read [
364
+ 1, 17, 0, 20, 0, 0, 0, 1, # header
365
+ 0xff, 0xff, # statistic_type
366
+ 0, 0, # flags
367
+
368
+ # vendor_statistics
369
+ 0, 0, 0, 1, # vendor
370
+ 1, 2, 3, 4 # body
371
+ ].pack('C*')
372
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
373
+ expect(msg.type).to eq(:statistics_reply)
374
+ expect(msg.len).to eq(20)
375
+ expect(msg.xid).to eq(1)
376
+ expect(msg.statistic_type).to eq(:vendor)
377
+ expect(msg.flags).to be_empty
378
+ expect(msg.statistics.vendor).to eq(1)
379
+ expect(msg.statistics.body).to eq([1, 2, 3, 4].pack('C*'))
380
+ end
381
+ it 'should initialize with default values' do
382
+ msg = OFStatisticsReply.new(statistic_type: :vendor)
383
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
384
+ expect(msg.type).to eq(:statistics_reply)
385
+ expect(msg.len).to eq(16)
386
+ expect(msg.xid).to eq(0)
387
+ expect(msg.statistic_type).to eq(:vendor)
388
+ expect(msg.flags).to be_empty
389
+ expect(msg.statistics.vendor).to eq(0)
390
+ expect(msg.statistics.body).to be_empty
391
+ end
392
+ it 'should initialize with some values' do
393
+ msg = OFStatisticsReply.new(
394
+ xid: 1,
395
+ statistic_type: :vendor,
396
+ statistics: {
397
+ vendor: 1,
398
+ body: [1, 2, 3, 4].pack('C*')
399
+ }
400
+ )
401
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
402
+ expect(msg.type).to eq(:statistics_reply)
403
+ expect(msg.len).to eq(20)
404
+ expect(msg.xid).to eq(1)
405
+ expect(msg.statistic_type).to eq(:vendor)
406
+ expect(msg.flags).to be_empty
407
+ expect(msg.statistics.vendor).to eq(1)
408
+ expect(msg.statistics.body).to eq([1, 2, 3, 4].pack('C*'))
409
+ end
410
+ end
411
+ end
@@ -0,0 +1,355 @@
1
+ require 'spec_helper'
2
+
3
+ describe OFStatisticsRequest do
4
+ context 'with description' do
5
+ it 'should read binary' do
6
+ msg = OFStatisticsRequest.read [
7
+ 1, 16, 0, 12, 0, 0, 0, 1, # header
8
+ 0, 0, # statistic_type
9
+ 0, 0, # flags
10
+ ].pack('C*')
11
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
12
+ expect(msg.type).to eq(:statistics_request)
13
+ expect(msg.len).to eq(12)
14
+ expect(msg.xid).to eq(1)
15
+ expect(msg.statistic_type).to eq(:description)
16
+ expect(msg.flags).to be_empty
17
+ expect(msg.statistics).to be_empty
18
+ end
19
+ it 'should initialize with default values' do
20
+ msg = OFStatisticsRequest.new
21
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
22
+ expect(msg.type).to eq(:statistics_request)
23
+ expect(msg.len).to eq(12)
24
+ expect(msg.xid).to eq(0)
25
+ expect(msg.statistic_type).to eq(:description)
26
+ expect(msg.flags).to be_empty
27
+ expect(msg.statistics).to be_empty
28
+ end
29
+ it 'should initialize with some values' do
30
+ msg = OFStatisticsRequest.new(
31
+ xid: 1,
32
+ statistic_type: :description
33
+ )
34
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
35
+ expect(msg.type).to eq(:statistics_request)
36
+ expect(msg.len).to eq(12)
37
+ expect(msg.xid).to eq(1)
38
+ expect(msg.statistic_type).to eq(:description)
39
+ expect(msg.flags).to be_empty
40
+ expect(msg.statistics).to be_empty
41
+ end
42
+ end
43
+
44
+ context 'with flow' do
45
+ it 'should read binary' do
46
+ msg = OFStatisticsRequest.read [
47
+ 1, 16, 0, 56, 0, 0, 0, 1, # header
48
+ 0, 1, # statistic_type
49
+ 0, 0, # flags
50
+
51
+ # flow_statistics_request
52
+ # match
53
+ 0, 0x30, 0x20, 0x4f, # wildcards
54
+ 0, 0, # in_port
55
+ 0, 0, 0, 0, 0, 0, # mac_source
56
+ 0, 0, 0, 0, 0, 0, # mac_destination
57
+ 0xff, 0xff, # vlan_id
58
+ 0, # vlan_pcp
59
+ 0, # padding
60
+ 8, 0, # mac_protocol
61
+ 0, # ip_tos
62
+ 6, # ip_protocol
63
+ 0, 0, # padding
64
+ 0, 0, 0, 0, # ip_source
65
+ 192, 168, 0, 2, # ip_destination
66
+ 0, 0, # source_port
67
+ 0x0b, 0xb8, # destination_port
68
+
69
+ 1, # table_id
70
+ 0, # padding
71
+ 0, 1 # out_port
72
+ ].pack('C*')
73
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
74
+ expect(msg.type).to eq(:statistics_request)
75
+ expect(msg.len).to eq(56)
76
+ expect(msg.xid).to eq(1)
77
+ expect(msg.statistic_type).to eq(:flow)
78
+ expect(msg.flags).to be_empty
79
+ expect(msg.statistics.table_id).to eq(1)
80
+ end
81
+ it 'should initialize with default values' do
82
+ msg = OFStatisticsRequest.new(statistic_type: :flow)
83
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
84
+ expect(msg.type).to eq(:statistics_request)
85
+ expect(msg.len).to eq(56)
86
+ expect(msg.xid).to eq(0)
87
+ expect(msg.statistic_type).to eq(:flow)
88
+ expect(msg.flags).to be_empty
89
+ expect(msg.statistics.table_id).to eq(:all)
90
+ end
91
+ it 'should initialize with some values' do
92
+ msg = OFStatisticsRequest.new(
93
+ xid: 1,
94
+ statistic_type: :flow,
95
+ statistics: {
96
+ table_id: 1
97
+ }
98
+ )
99
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
100
+ expect(msg.type).to eq(:statistics_request)
101
+ expect(msg.len).to eq(56)
102
+ expect(msg.xid).to eq(1)
103
+ expect(msg.statistic_type).to eq(:flow)
104
+ expect(msg.flags).to be_empty
105
+ expect(msg.statistics.table_id).to eq(1)
106
+ end
107
+ end
108
+
109
+ context 'with aggregate' do
110
+ it 'should read binary' do
111
+ msg = OFStatisticsRequest.read [
112
+ 1, 16, 0, 56, 0, 0, 0, 1, # header
113
+ 0, 2, # statistic_type
114
+ 0, 0, # flags
115
+
116
+ # aggregate_statistics_request
117
+ # match
118
+ 0, 0x30, 0x20, 0x4f, # wildcards
119
+ 0, 0, # in_port
120
+ 0, 0, 0, 0, 0, 0, # mac_source
121
+ 0, 0, 0, 0, 0, 0, # mac_destination
122
+ 0xff, 0xff, # vlan_id
123
+ 0, # vlan_pcp
124
+ 0, # padding
125
+ 8, 0, # mac_protocol
126
+ 0, # ip_tos
127
+ 6, # ip_protocol
128
+ 0, 0, # padding
129
+ 0, 0, 0, 0, # ip_source
130
+ 192, 168, 0, 2, # ip_destination
131
+ 0, 0, # source_port
132
+ 0x0b, 0xb8, # destination_port
133
+
134
+ 1, # table_id
135
+ 0, # padding
136
+ 0, 1 # out_port
137
+ ].pack('C*')
138
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
139
+ expect(msg.type).to eq(:statistics_request)
140
+ expect(msg.len).to eq(56)
141
+ expect(msg.xid).to eq(1)
142
+ expect(msg.statistic_type).to eq(:aggregate)
143
+ expect(msg.flags).to be_empty
144
+ expect(msg.statistics.table_id).to eq(1)
145
+ end
146
+ it 'should initialize with default values' do
147
+ msg = OFStatisticsRequest.new(statistic_type: :aggregate)
148
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
149
+ expect(msg.type).to eq(:statistics_request)
150
+ expect(msg.len).to eq(56)
151
+ expect(msg.xid).to eq(0)
152
+ expect(msg.statistic_type).to eq(:aggregate)
153
+ expect(msg.flags).to be_empty
154
+ expect(msg.statistics.table_id).to eq(:all)
155
+ end
156
+ it 'should initialize with some values' do
157
+ msg = OFStatisticsRequest.new(
158
+ xid: 1,
159
+ statistic_type: :aggregate,
160
+ statistics: {
161
+ table_id: 1
162
+ }
163
+ )
164
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
165
+ expect(msg.type).to eq(:statistics_request)
166
+ expect(msg.len).to eq(56)
167
+ expect(msg.xid).to eq(1)
168
+ expect(msg.statistic_type).to eq(:aggregate)
169
+ expect(msg.flags).to be_empty
170
+ expect(msg.statistics.table_id).to eq(1)
171
+ end
172
+ end
173
+
174
+ context 'with table' do
175
+ it 'should read binary' do
176
+ msg = OFStatisticsRequest.read [
177
+ 1, 16, 0, 12, 0, 0, 0, 1, # header
178
+ 0, 3, # statistic_type
179
+ 0, 0, # flags
180
+ ].pack('C*')
181
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
182
+ expect(msg.type).to eq(:statistics_request)
183
+ expect(msg.len).to eq(12)
184
+ expect(msg.xid).to eq(1)
185
+ expect(msg.statistic_type).to eq(:table)
186
+ expect(msg.flags).to be_empty
187
+ expect(msg.statistics).to be_empty
188
+ end
189
+ it 'should initialize with default values' do
190
+ msg = OFStatisticsRequest.new(statistic_type: :table)
191
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
192
+ expect(msg.type).to eq(:statistics_request)
193
+ expect(msg.len).to eq(12)
194
+ expect(msg.xid).to eq(0)
195
+ expect(msg.statistic_type).to eq(:table)
196
+ expect(msg.flags).to be_empty
197
+ expect(msg.statistics).to be_empty
198
+ end
199
+ it 'should initialize with some values' do
200
+ msg = OFStatisticsRequest.new(
201
+ xid: 1,
202
+ statistic_type: :table
203
+ )
204
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
205
+ expect(msg.type).to eq(:statistics_request)
206
+ expect(msg.len).to eq(12)
207
+ expect(msg.xid).to eq(1)
208
+ expect(msg.statistic_type).to eq(:table)
209
+ expect(msg.flags).to be_empty
210
+ expect(msg.statistics).to be_empty
211
+ end
212
+ end
213
+
214
+ context 'with port' do
215
+ it 'should read binary' do
216
+ msg = OFStatisticsRequest.read [
217
+ 1, 16, 0, 20, 0, 0, 0, 1, # header
218
+ 0, 4, # statistic_type
219
+ 0, 0, # flags
220
+
221
+ # port_statistics_request
222
+ 0, 1, # port_number
223
+ 0, 0, 0, 0, 0, 0 # padding
224
+ ].pack('C*')
225
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
226
+ expect(msg.type).to eq(:statistics_request)
227
+ expect(msg.len).to eq(20)
228
+ expect(msg.xid).to eq(1)
229
+ expect(msg.statistic_type).to eq(:port)
230
+ expect(msg.flags).to be_empty
231
+ expect(msg.statistics.port_number).to eq(1)
232
+ end
233
+ it 'should initialize with default values' do
234
+ msg = OFStatisticsRequest.new(statistic_type: :port)
235
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
236
+ expect(msg.type).to eq(:statistics_request)
237
+ expect(msg.len).to eq(20)
238
+ expect(msg.xid).to eq(0)
239
+ expect(msg.statistic_type).to eq(:port)
240
+ expect(msg.flags).to be_empty
241
+ expect(msg.statistics.port_number).to eq(:none)
242
+ end
243
+ it 'should initialize with some values' do
244
+ msg = OFStatisticsRequest.new(
245
+ xid: 1,
246
+ statistic_type: :port,
247
+ statistics: {port_number: 1}
248
+ )
249
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
250
+ expect(msg.type).to eq(:statistics_request)
251
+ expect(msg.len).to eq(20)
252
+ expect(msg.xid).to eq(1)
253
+ expect(msg.statistic_type).to eq(:port)
254
+ expect(msg.flags).to be_empty
255
+ expect(msg.statistics.port_number).to eq(1)
256
+ end
257
+ end
258
+
259
+ context 'with queue' do
260
+ it 'should read binary' do
261
+ msg = OFStatisticsRequest.read [
262
+ 1, 16, 0, 20, 0, 0, 0, 1, # header
263
+ 0, 5, # statistic_type
264
+ 0, 0, # flags
265
+
266
+ # queue_statistics_request
267
+ 0, 1, # port_number
268
+ 0, 0, # padding
269
+ 0, 0, 0, 1 # queue_id
270
+ ].pack('C*')
271
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
272
+ expect(msg.type).to eq(:statistics_request)
273
+ expect(msg.len).to eq(20)
274
+ expect(msg.xid).to eq(1)
275
+ expect(msg.statistic_type).to eq(:queue)
276
+ expect(msg.flags).to be_empty
277
+ expect(msg.statistics.port_number).to eq(1)
278
+ end
279
+ it 'should initialize with default values' do
280
+ msg = OFStatisticsRequest.new(statistic_type: :queue)
281
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
282
+ expect(msg.type).to eq(:statistics_request)
283
+ expect(msg.len).to eq(20)
284
+ expect(msg.xid).to eq(0)
285
+ expect(msg.statistic_type).to eq(:queue)
286
+ expect(msg.flags).to be_empty
287
+ expect(msg.statistics.port_number).to eq(:all)
288
+ end
289
+ it 'should initialize with some values' do
290
+ msg = OFStatisticsRequest.new(
291
+ xid: 1,
292
+ statistic_type: :queue,
293
+ statistics: {port_number: 1}
294
+ )
295
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
296
+ expect(msg.type).to eq(:statistics_request)
297
+ expect(msg.len).to eq(20)
298
+ expect(msg.xid).to eq(1)
299
+ expect(msg.statistic_type).to eq(:queue)
300
+ expect(msg.flags).to be_empty
301
+ expect(msg.statistics.port_number).to eq(1)
302
+ end
303
+ end
304
+
305
+ context 'with vendor' do
306
+ it 'should read binary' do
307
+ msg = OFStatisticsRequest.read [
308
+ 1, 16, 0, 20, 0, 0, 0, 1, # header
309
+ 0xff, 0xff, # statistic_type
310
+ 0, 0, # flags
311
+
312
+ # vendor_statistics
313
+ 0, 0, 0, 1, # vendor
314
+ 1, 2, 3, 4 # body
315
+ ].pack('C*')
316
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
317
+ expect(msg.type).to eq(:statistics_request)
318
+ expect(msg.len).to eq(20)
319
+ expect(msg.xid).to eq(1)
320
+ expect(msg.statistic_type).to eq(:vendor)
321
+ expect(msg.flags).to be_empty
322
+ expect(msg.statistics.vendor).to eq(1)
323
+ expect(msg.statistics.body).to eq([1, 2, 3, 4].pack('C*'))
324
+ end
325
+ it 'should initialize with default values' do
326
+ msg = OFStatisticsRequest.new(statistic_type: :vendor)
327
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
328
+ expect(msg.type).to eq(:statistics_request)
329
+ expect(msg.len).to eq(16)
330
+ expect(msg.xid).to eq(0)
331
+ expect(msg.statistic_type).to eq(:vendor)
332
+ expect(msg.flags).to be_empty
333
+ expect(msg.statistics.vendor).to eq(0)
334
+ expect(msg.statistics.body).to be_empty
335
+ end
336
+ it 'should initialize with some values' do
337
+ msg = OFStatisticsRequest.new(
338
+ xid: 1,
339
+ statistic_type: :vendor,
340
+ statistics: {
341
+ vendor: 1,
342
+ body: [1, 2, 3, 4].pack('C*')
343
+ }
344
+ )
345
+ expect(msg.version).to eq(OFMessage::OFP_VERSION)
346
+ expect(msg.type).to eq(:statistics_request)
347
+ expect(msg.len).to eq(20)
348
+ expect(msg.xid).to eq(1)
349
+ expect(msg.statistic_type).to eq(:vendor)
350
+ expect(msg.flags).to be_empty
351
+ expect(msg.statistics.vendor).to eq(1)
352
+ expect(msg.statistics.body).to eq([1, 2, 3, 4].pack('C*'))
353
+ end
354
+ end
355
+ end