]> git.proxmox.com Git - ovs.git/blob - tests/ofproto.at
tests: Convert ovsdb-monitor-sort utility from Perl to Python.
[ovs.git] / tests / ofproto.at
1 AT_BANNER([ofproto])
2
3 AT_SETUP([ofproto - echo request])
4 OVS_VSWITCHD_START
5 AT_CHECK([ovs-ofctl -vwarn probe br0])
6 OVS_VSWITCHD_STOP
7 AT_CLEANUP
8
9 AT_SETUP([ofproto - handling messages with bad version])
10 AT_KEYWORDS([monitor])
11 OVS_VSWITCHD_START
12
13 # Start a monitor running OpenFlow 1.0, then send the switch an OF1.1 features
14 # request
15 AT_CHECK([ovs-ofctl -P standard monitor br0 --detach --no-chdir --pidfile])
16 ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
17 AT_CAPTURE_FILE([monitor.log])
18 ovs-appctl -t ovs-ofctl ofctl/send 0205000801234567
19 ovs-appctl -t ovs-ofctl ofctl/barrier
20 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
21
22 AT_CHECK([sed 's/ (xid=0x[[0-9a-fA-F]]*)//
23 /ECHO/d' monitor.log], [0], [dnl
24 send: OFPT_FEATURES_REQUEST (OF1.1):
25 OFPT_ERROR (OF1.1): OFPBRC_BAD_VERSION
26 OFPT_FEATURES_REQUEST (OF1.1):
27 OFPT_BARRIER_REPLY:
28 ])
29
30 OVS_VSWITCHD_STOP(["/received OpenFlow version 0x02 != expected 01/d"])
31 AT_CLEANUP
32
33 AT_SETUP([ofproto - feature request, config request])
34 OVS_VSWITCHD_START
35 AT_CHECK([ovs-ofctl -vwarn show br0], [0], [stdout])
36 AT_CHECK([strip_xids < stdout], [0], [dnl
37 OFPT_FEATURES_REPLY: dpid:fedcba9876543210
38 n_tables:254, n_buffers:0
39 capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
40 actions: output enqueue set_vlan_vid set_vlan_pcp strip_vlan mod_dl_src mod_dl_dst mod_nw_src mod_nw_dst mod_nw_tos mod_tp_src mod_tp_dst
41 LOCAL(br0): addr:aa:55:aa:55:00:00
42 config: PORT_DOWN
43 state: LINK_DOWN
44 speed: 0 Mbps now, 0 Mbps max
45 OFPT_GET_CONFIG_REPLY: frags=normal miss_send_len=0
46 ])
47 OVS_VSWITCHD_STOP
48 AT_CLEANUP
49
50 AT_SETUP([ofproto - set OpenFlow port number])
51 OVS_VSWITCHD_START(
52 [add-port br0 p1 -- set Interface p1 type=dummy --\
53 add-port br0 p2 -- set Interface p2 type=dummy ofport_request=99])
54 AT_CHECK([ovs-ofctl -vwarn show br0], [0], [stdout])
55 AT_CHECK([[sed '
56 s/ (xid=0x[0-9a-fA-F]*)//
57 s/00:0.$/00:0x/' < stdout]],
58 [0], [dnl
59 OFPT_FEATURES_REPLY: dpid:fedcba9876543210
60 n_tables:254, n_buffers:0
61 capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
62 actions: output enqueue set_vlan_vid set_vlan_pcp strip_vlan mod_dl_src mod_dl_dst mod_nw_src mod_nw_dst mod_nw_tos mod_tp_src mod_tp_dst
63 1(p1): addr:aa:55:aa:55:00:0x
64 config: PORT_DOWN
65 state: LINK_DOWN
66 speed: 0 Mbps now, 0 Mbps max
67 99(p2): addr:aa:55:aa:55:00:0x
68 config: PORT_DOWN
69 state: LINK_DOWN
70 speed: 0 Mbps now, 0 Mbps max
71 LOCAL(br0): addr:aa:55:aa:55:00:0x
72 config: PORT_DOWN
73 state: LINK_DOWN
74 speed: 0 Mbps now, 0 Mbps max
75 OFPT_GET_CONFIG_REPLY: frags=normal miss_send_len=0
76 ])
77
78 OVS_VSWITCHD_STOP
79 AT_CLEANUP
80
81 dnl This is really bare-bones.
82 dnl It at least checks request and reply serialization and deserialization.
83 AT_SETUP([ofproto - port stats - (OpenFlow 1.0)])
84 OVS_VSWITCHD_START
85 AT_CHECK([ovs-ofctl -vwarn dump-ports br0], [0], [stdout])
86 AT_CHECK([strip_xids < stdout], [0], [dnl
87 OFPST_PORT reply: 1 ports
88 port LOCAL: rx pkts=0, bytes=0, drop=?, errs=?, frame=?, over=?, crc=?
89 tx pkts=0, bytes=0, drop=?, errs=?, coll=?
90 ])
91 OVS_VSWITCHD_STOP
92 AT_CLEANUP
93
94 AT_SETUP([ofproto - port stats - (OpenFlow 1.2)])
95 OVS_VSWITCHD_START
96 AT_CHECK([ovs-ofctl -O OpenFlow12 -vwarn dump-ports br0], [0], [stdout])
97 AT_CHECK([strip_xids < stdout], [0], [dnl
98 OFPST_PORT reply (OF1.2): 1 ports
99 port LOCAL: rx pkts=0, bytes=0, drop=?, errs=?, frame=?, over=?, crc=?
100 tx pkts=0, bytes=0, drop=?, errs=?, coll=?
101 ])
102 OVS_VSWITCHD_STOP
103 AT_CLEANUP
104
105 AT_SETUP([ofproto - port stats - (OpenFlow 1.4)])
106 OVS_VSWITCHD_START
107 AT_CHECK([ovs-ofctl -O OpenFlow14 -vwarn dump-ports br0], [0], [stdout])
108 AT_CHECK([strip_xids < stdout | sed 's/duration=[[0-9.]]*s/duration=?s/'],
109 [0], [dnl
110 OFPST_PORT reply (OF1.4): 1 ports
111 port LOCAL: rx pkts=0, bytes=0, drop=?, errs=?, frame=?, over=?, crc=?
112 tx pkts=0, bytes=0, drop=?, errs=?, coll=?
113 duration=?s
114 ])
115 OVS_VSWITCHD_STOP
116 AT_CLEANUP
117
118 dnl This is really bare-bones.
119 dnl It at least checks request and reply serialization and deserialization.
120 AT_SETUP([ofproto - port-desc stats (OpenFlow 1.0)])
121 OVS_VSWITCHD_START
122 AT_CHECK([ovs-ofctl -vwarn dump-ports-desc br0], [0], [stdout])
123 AT_CHECK([strip_xids < stdout], [0], [dnl
124 OFPST_PORT_DESC reply:
125 LOCAL(br0): addr:aa:55:aa:55:00:00
126 config: PORT_DOWN
127 state: LINK_DOWN
128 speed: 0 Mbps now, 0 Mbps max
129 ])
130 OVS_VSWITCHD_STOP
131 AT_CLEANUP
132
133 dnl This is really bare-bones.
134 dnl It at least checks request and reply serialization and deserialization.
135 AT_SETUP([ofproto - port-desc stats (OpenFlow 1.2)])
136 OVS_VSWITCHD_START
137 AT_CHECK([ovs-ofctl -O OpenFlow12 -vwarn dump-ports-desc br0], [0], [stdout])
138 AT_CHECK([strip_xids < stdout], [0], [dnl
139 OFPST_PORT_DESC reply (OF1.2):
140 LOCAL(br0): addr:aa:55:aa:55:00:00
141 config: PORT_DOWN
142 state: LINK_DOWN
143 speed: 0 Mbps now, 0 Mbps max
144 ])
145 OVS_VSWITCHD_STOP
146 AT_CLEANUP
147
148 AT_SETUP([ofproto - port-desc stats (OpenFlow 1.5)])
149 OVS_VSWITCHD_START
150 add_of_ports br0 1 2 3
151 AT_CHECK([ovs-ofctl -F OXM-OpenFlow15 -O OpenFlow15 -vwarn dump-ports-desc br0], [0], [stdout])
152 AT_CHECK([strip_xids < stdout | sed 's/00:0./00:0x/'], [0], [dnl
153 OFPST_PORT_DESC reply (OF1.5):
154 1(p1): addr:aa:55:aa:55:00:0x
155 config: PORT_DOWN
156 state: LINK_DOWN
157 speed: 0 Mbps now, 0 Mbps max
158 2(p2): addr:aa:55:aa:55:00:0x
159 config: PORT_DOWN
160 state: LINK_DOWN
161 speed: 0 Mbps now, 0 Mbps max
162 3(p3): addr:aa:55:aa:55:00:0x
163 config: PORT_DOWN
164 state: LINK_DOWN
165 speed: 0 Mbps now, 0 Mbps max
166 LOCAL(br0): addr:aa:55:aa:55:00:0x
167 config: PORT_DOWN
168 state: LINK_DOWN
169 speed: 0 Mbps now, 0 Mbps max
170 ])
171 AT_CHECK([ovs-ofctl -F OXM-OpenFlow15 -O OpenFlow15 -vwarn dump-ports-desc br0 2], [0], [stdout])
172 AT_CHECK([strip_xids < stdout | sed 's/00:0./00:0x/'], [0], [dnl
173 OFPST_PORT_DESC reply (OF1.5):
174 2(p2): addr:aa:55:aa:55:00:0x
175 config: PORT_DOWN
176 state: LINK_DOWN
177 speed: 0 Mbps now, 0 Mbps max
178 ])
179 OVS_VSWITCHD_STOP
180 AT_CLEANUP
181
182 AT_SETUP([ofproto - port-desc stats (OpenFlow 1.6)])
183 OVS_VSWITCHD_START
184 add_of_ports br0 1 2 3
185 AT_CHECK([ovs-ofctl -F OXM-OpenFlow16 -O OpenFlow16 -vwarn dump-ports-desc br0], [0], [stdout])
186 AT_CHECK([strip_xids < stdout | sed 's/00:0./00:0x/'], [0], [dnl
187 OFPST_PORT_DESC reply (OF1.6):
188 1(p1): addr:aa:55:aa:55:00:0x
189 config: PORT_DOWN
190 state: LINK_DOWN
191 speed: 0 Mbps now, 0 Mbps max
192 2(p2): addr:aa:55:aa:55:00:0x
193 config: PORT_DOWN
194 state: LINK_DOWN
195 speed: 0 Mbps now, 0 Mbps max
196 3(p3): addr:aa:55:aa:55:00:0x
197 config: PORT_DOWN
198 state: LINK_DOWN
199 speed: 0 Mbps now, 0 Mbps max
200 LOCAL(br0): addr:aa:55:aa:55:00:0x
201 config: PORT_DOWN
202 state: LINK_DOWN
203 speed: 0 Mbps now, 0 Mbps max
204 ])
205 AT_CHECK([ovs-ofctl -F OXM-OpenFlow16 -O OpenFlow16 -vwarn dump-ports-desc br0 2], [0], [stdout])
206 AT_CHECK([strip_xids < stdout | sed 's/00:0./00:0x/'], [0], [dnl
207 OFPST_PORT_DESC reply (OF1.6):
208 2(p2): addr:aa:55:aa:55:00:0x
209 config: PORT_DOWN
210 state: LINK_DOWN
211 speed: 0 Mbps now, 0 Mbps max
212 ])
213 OVS_VSWITCHD_STOP
214 AT_CLEANUP
215
216 dnl CHECK_QUEUE_STATS(label, option, format)
217 m4_define([CHECK_QUEUE_STATS], [
218 AT_SETUP([ofproto - queue stats - (OpenFlow $1)])
219 OVS_VSWITCHD_START
220
221 AT_CHECK([ovs-ofctl -O $2 queue-stats br0 | strip_xids], [0],
222 [OFPST_QUEUE reply$3: 1 queues
223 port LOCAL queue 0: bytes=?, pkts=?, errors=?, duration=?
224 ])
225
226 AT_CHECK([ovs-ofctl -O $2 queue-stats br0 LOCAL | strip_xids], [0],
227 [OFPST_QUEUE reply$3: 1 queues
228 port LOCAL queue 0: bytes=?, pkts=?, errors=?, duration=?
229 ])
230
231 AT_CHECK([ovs-ofctl -O $2 queue-stats br0 LOCAL 0 | strip_xids], [0],
232 [OFPST_QUEUE reply$3: 1 queues
233 port LOCAL queue 0: bytes=?, pkts=?, errors=?, duration=?
234 ])
235
236 AT_CHECK([ovs-ofctl -O $2 queue-stats br0 ANY 0 | strip_xids], [0],
237 [OFPST_QUEUE reply$3: 1 queues
238 port LOCAL queue 0: bytes=?, pkts=?, errors=?, duration=?
239 ])
240
241 AT_CHECK([ovs-ofctl -O $2 queue-stats br0 LOCAL 5 | strip_xids], [0],
242 [OFPT_ERROR$3: OFPQOFC_BAD_QUEUE
243 OFPST_QUEUE request$3: port=LOCAL queue=5
244 ])
245
246 AT_CHECK([ovs-ofctl -O $2 queue-stats br0 ANY 5 | strip_xids], [0],
247 [OFPT_ERROR$3: OFPQOFC_BAD_QUEUE
248 OFPST_QUEUE request$3: port=ANY queue=5
249 ])
250
251 AT_CHECK([ovs-ofctl -O $2 queue-stats br0 10 | strip_xids], [0],
252 [OFPT_ERROR$3: OFPQOFC_BAD_PORT
253 OFPST_QUEUE request$3: port=10 queue=ALL
254 ])
255 OVS_VSWITCHD_STOP
256 AT_CLEANUP
257 ])
258 CHECK_QUEUE_STATS([1.0], [OpenFlow10], [])
259 CHECK_QUEUE_STATS([1.1], [OpenFlow11], [ (OF1.1)])
260 CHECK_QUEUE_STATS([1.2], [OpenFlow12], [ (OF1.2)])
261 CHECK_QUEUE_STATS([1.3], [OpenFlow13], [ (OF1.3)])
262 CHECK_QUEUE_STATS([1.4], [OpenFlow14], [ (OF1.4)])
263
264 dnl This is really bare-bones.
265 dnl It at least checks request and reply serialization and deserialization.
266 AT_SETUP([ofproto - queue configuration - (OpenFlow 1.0)])
267 OVS_VSWITCHD_START
268 add_of_ports br0 1 2
269 AT_CHECK([ovs-ofctl queue-get-config br0 1], [0], [stdout])
270 AT_CHECK([strip_xids < stdout], [0], [dnl
271 OFPT_QUEUE_GET_CONFIG_REPLY: port=1
272 queue 0:
273 ])
274 AT_CHECK([ovs-ofctl queue-get-config br0], [0], [stdout])
275 AT_CHECK([strip_xids < stdout | sort], [0], [dnl
276 OFPT_QUEUE_GET_CONFIG_REPLY: port=1
277 OFPT_QUEUE_GET_CONFIG_REPLY: port=2
278 queue 0:
279 queue 0:
280 ])
281 AT_CHECK([ovs-ofctl queue-get-config br0 10], [0],
282 [OFPT_ERROR (xid=0x2): OFPQOFC_BAD_PORT
283 OFPT_QUEUE_GET_CONFIG_REQUEST (xid=0x2): port=10
284 ])
285 OVS_VSWITCHD_STOP
286 AT_CLEANUP
287
288 AT_SETUP([ofproto - queue configuration - (OpenFlow 1.1)])
289 OVS_VSWITCHD_START
290 add_of_ports br0 1 2
291 AT_CHECK([ovs-ofctl -O OpenFlow11 queue-get-config br0 1], [0], [stdout])
292 AT_CHECK([strip_xids < stdout], [0], [dnl
293 OFPT_QUEUE_GET_CONFIG_REPLY (OF1.1): port=1
294 queue 0:
295 ])
296 AT_CHECK([ovs-ofctl -O OpenFlow11 queue-get-config br0 10 | strip_xids], [0],
297 [OFPT_ERROR (OF1.1): OFPQOFC_BAD_PORT
298 OFPT_QUEUE_GET_CONFIG_REQUEST (OF1.1): port=10
299 ])
300 OVS_VSWITCHD_STOP
301 AT_CLEANUP
302
303 AT_SETUP([ofproto - queue configuration - (OpenFlow 1.2)])
304 OVS_VSWITCHD_START
305 add_of_ports br0 1 2
306 AT_CHECK([ovs-ofctl -O OpenFlow12 queue-get-config br0 1], [0], [stdout])
307 AT_CHECK([strip_xids < stdout], [0], [dnl
308 OFPT_QUEUE_GET_CONFIG_REPLY (OF1.2): port=1
309 queue 0:
310 ])
311 AT_CHECK([ovs-ofctl -O OpenFlow12 queue-get-config br0 ANY], [0], [stdout])
312 AT_CHECK([strip_xids < stdout], [0], [dnl
313 OFPT_QUEUE_GET_CONFIG_REPLY (OF1.2): port=ANY
314 queue 0:
315 queue 0:
316 queue 0:
317 ])
318 AT_CHECK([ovs-ofctl -O OpenFlow12 queue-get-config br0 10 | strip_xids], [0],
319 [OFPT_ERROR (OF1.2): OFPQOFC_BAD_PORT
320 OFPT_QUEUE_GET_CONFIG_REQUEST (OF1.2): port=10
321 ])
322 OVS_VSWITCHD_STOP
323 AT_CLEANUP
324
325 AT_SETUP([ofproto - queue configuration - (OpenFlow 1.4)])
326 OVS_VSWITCHD_START
327 add_of_ports br0 1 2
328
329 AT_CHECK([ovs-ofctl -O OpenFlow14 queue-get-config br0 any | strip_xids], [0],
330 [OFPST_QUEUE_DESC reply (OF1.4): port=1
331 queue 0:
332 port=2
333 queue 0:
334 port=LOCAL
335 queue 0:
336 ])
337
338 AT_CHECK([ovs-ofctl -O OpenFlow14 queue-get-config br0 1 | strip_xids], [0],
339 [OFPST_QUEUE_DESC reply (OF1.4): port=1
340 queue 0:
341 ])
342
343 AT_CHECK([ovs-ofctl -O OpenFlow14 queue-get-config br0 10 | strip_xids], [0],
344 [OFPT_ERROR (OF1.4): OFPQOFC_BAD_PORT
345 OFPST_QUEUE_DESC request (OF1.4): port=10
346 ])
347
348 AT_CHECK([ovs-ofctl -O OpenFlow14 queue-get-config br0 1 2 | strip_xids], [0],
349 [OFPT_ERROR (OF1.4): OFPQOFC_BAD_QUEUE
350 OFPST_QUEUE_DESC request (OF1.4): port=1 queue=2
351 ])
352 OVS_VSWITCHD_STOP
353 AT_CLEANUP
354
355 dnl This is really bare-bones.
356 dnl It at least checks request and reply serialization and deserialization.
357 dnl Actions definition listed in both supported formats (w/ actions=)
358 AT_SETUP([ofproto - no group support (OpenFlow 1.0)])
359 OVS_VSWITCHD_START
360 AT_DATA([groups.txt], [dnl
361 group_id=1234,type=all,bucket=output:10
362 group_id=1235,type=all,bucket=actions=output:10
363 ])
364 AT_DATA([stderr], [dnl
365 ovs-ofctl: none of the usable flow formats (OXM,OpenFlow11) is among the allowed flow formats (OpenFlow10,NXM)
366 ])
367 AT_CHECK([ovs-ofctl -O OpenFlow10 -vwarn add-groups br0 groups.txt], [1], ,[stderr])
368 AT_CHECK([ovs-ofctl -O OpenFlow10 -vwarn mod-group br0 'group_id=1234,type=all,bucket=output:10'], [1], ,[stderr])
369 AT_CHECK([ovs-ofctl -O OpenFlow10 -vwarn del-groups br0], [1], ,[stderr])
370 AT_CHECK([ovs-ofctl -O OpenFlow10 -vwarn dump-groups br0 ], [1], ,[stderr])
371 OVS_VSWITCHD_STOP
372 AT_CLEANUP
373
374 dnl This is really bare-bones.
375 dnl It at least checks request and reply serialization and deserialization.
376 dnl Actions definition listed in both supported formats (w/ actions=)
377 AT_SETUP([ofproto - del group (OpenFlow 1.1)])
378 OVS_VSWITCHD_START
379 AT_DATA([groups.txt], [dnl
380 group_id=1234,type=all,bucket=output:10
381 group_id=1235,type=all,bucket=actions=output:10
382 ])
383 AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn add-groups br0 groups.txt])
384 AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn dump-groups br0 ], [0], [stdout])
385 AT_CHECK([strip_xids < stdout | sort], [0], [dnl
386 group_id=1234,type=all,bucket=actions=output:10
387 group_id=1235,type=all,bucket=actions=output:10
388 OFPST_GROUP_DESC reply (OF1.1):
389 ])
390 AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn del-groups br0 group_id=1234])
391 AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn dump-groups br0], [0], [stdout])
392 AT_CHECK([strip_xids < stdout], [0], [dnl
393 OFPST_GROUP_DESC reply (OF1.1):
394 group_id=1235,type=all,bucket=actions=output:10
395 ])
396 AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn del-groups br0 group_id=1234])
397 AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn dump-groups br0], [0], [stdout])
398 AT_CHECK([strip_xids < stdout], [0], [dnl
399 OFPST_GROUP_DESC reply (OF1.1):
400 group_id=1235,type=all,bucket=actions=output:10
401 ])
402 AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn del-groups br0], [0])
403 AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn dump-groups br0], [0], [stdout])
404 AT_CHECK([strip_xids < stdout], [0], [dnl
405 OFPST_GROUP_DESC reply (OF1.1):
406 ])
407
408 # Negative test.
409 AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn del-groups br0 group_id=0xfffffff0],
410 [1], [], [ovs-ofctl: invalid group id 4294967280
411 ])
412 OVS_VSWITCHD_STOP
413 AT_CLEANUP
414
415 dnl This is really bare-bones.
416 dnl It at least checks request and reply serialization and deserialization.
417 dnl Actions definition listed in both supported formats (w/ actions=)
418 AT_SETUP([ofproto - add indirect group])
419 OVS_VSWITCHD_START
420 dnl indirect group must have exactly one bucket
421 AT_DATA([stderr], [dnl
422 OFPT_ERROR (OF1.1) (xid=0x2): OFPGMFC_INVALID_GROUP
423 OFPT_GROUP_MOD (OF1.1) (xid=0x2): ***decode error: OFPGMFC_INVALID_GROUP***
424 ])
425 AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn add-group br0 'group_id=1234,type=indirect'], [1], , [stderr])
426 AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn add-group br0 'group_id=1235,type=indirect,bucket=output:10'])
427 AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn add-group br0 'group_id=1236,type=indirect,bucket=output:10,bucket=output:11'], [1], , [stderr])
428 OVS_VSWITCHD_STOP
429 AT_CLEANUP
430
431 AT_SETUP([ofproto - group mod with mod and add_or_mod command])
432 OVS_VSWITCHD_START
433 dnl Check that mod-group for non-existing group fails without --may-create
434 AT_DATA([stderr], [dnl
435 OFPT_ERROR (OF1.3) (xid=0x2): OFPGMFC_UNKNOWN_GROUP
436 OFPT_GROUP_MOD (OF1.3) (xid=0x2):
437 MOD group_id=1234,type=indirect,bucket=actions=output:2
438 ])
439 AT_CHECK([ovs-ofctl -O OpenFlow13 -vwarn mod-group br0 'group_id=1234,type=indirect,bucket=actions=2'], [1], , [stderr])
440 dnl Check that mod-group for non-existing group succeeds with --may-create
441 AT_CHECK([ovs-ofctl -O OpenFlow13 -vwarn --may-create mod-group br0 'group_id=1234,type=indirect,bucket=actions=2'])
442 AT_CHECK([ovs-ofctl -O OpenFlow13 -vwarn dump-groups br0], [0], [stdout])
443 AT_CHECK([strip_xids < stdout], [0], [dnl
444 OFPST_GROUP_DESC reply (OF1.3):
445 group_id=1234,type=indirect,bucket=actions=output:2
446 ])
447 dnl Check that mod-group for existing group succeeds with --may-create
448 AT_CHECK([ovs-ofctl -O OpenFlow13 -vwarn --may-create mod-group br0 'group_id=1234,type=indirect,bucket=actions=3'])
449 AT_CHECK([ovs-ofctl -O OpenFlow13 -vwarn dump-groups br0], [0], [stdout])
450 AT_CHECK([strip_xids < stdout], [0], [dnl
451 OFPST_GROUP_DESC reply (OF1.3):
452 group_id=1234,type=indirect,bucket=actions=output:3
453 ])
454 OVS_VSWITCHD_STOP
455 AT_CLEANUP
456
457 dnl This is really bare-bones.
458 dnl It at least checks request and reply serialization and deserialization.
459 dnl Actions definition listed in both supported formats (w/ actions=)
460 AT_SETUP([ofproto - del group (OpenFlow 1.5)])
461 OVS_VSWITCHD_START
462 AT_DATA([groups.txt], [dnl
463 group_id=1233,type=select,selection_method=hash,bucket=output:10,bucket=output:11
464 group_id=1234,type=select,selection_method=hash,fields(eth_dst,ip_dst,tcp_dst),bucket=output:10,bucket=output:11
465 group_id=1235,type=all,bucket=actions=output:12,bucket=bucket_id:0,actions=output:10,bucket=bucket_id:1,actions=output:11
466 group_id=1236,type=select,selection_method=dp_hash,bucket=output:10,bucket=output:11
467 ])
468 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn add-groups br0 groups.txt])
469 AT_CHECK([ovs-ofctl -F OXM-OpenFlow15 -O OpenFlow15 -vwarn dump-groups br0 1234], [0], [stdout])
470 AT_CHECK([strip_xids < stdout], [0], [dnl
471 OFPST_GROUP_DESC reply (OF1.5):
472 group_id=1234,type=select,selection_method=hash,fields(eth_dst,ip_dst,tcp_dst),bucket=bucket_id:0,actions=output:10,bucket=bucket_id:1,actions=output:11
473 ])
474 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn del-groups br0 group_id=1234])
475 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn dump-groups br0], [0], [stdout])
476 AT_CHECK([strip_xids < stdout | sort], [0], [dnl
477 group_id=1233,type=select,selection_method=hash,bucket=bucket_id:0,actions=output:10,bucket=bucket_id:1,actions=output:11
478 group_id=1235,type=all,bucket=bucket_id:2,actions=output:12,bucket=bucket_id:0,actions=output:10,bucket=bucket_id:1,actions=output:11
479 group_id=1236,type=select,selection_method=dp_hash,bucket=bucket_id:0,actions=output:10,bucket=bucket_id:1,actions=output:11
480 OFPST_GROUP_DESC reply (OF1.5):
481 ])
482 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn del-groups br0 group_id=1234])
483 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn dump-groups br0], [0], [stdout])
484 AT_CHECK([strip_xids < stdout | sort], [0], [dnl
485 group_id=1233,type=select,selection_method=hash,bucket=bucket_id:0,actions=output:10,bucket=bucket_id:1,actions=output:11
486 group_id=1235,type=all,bucket=bucket_id:2,actions=output:12,bucket=bucket_id:0,actions=output:10,bucket=bucket_id:1,actions=output:11
487 group_id=1236,type=select,selection_method=dp_hash,bucket=bucket_id:0,actions=output:10,bucket=bucket_id:1,actions=output:11
488 OFPST_GROUP_DESC reply (OF1.5):
489 ])
490 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn del-groups br0], [0])
491 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn dump-groups br0], [0], [stdout])
492 AT_CHECK([strip_xids < stdout], [0], [dnl
493 OFPST_GROUP_DESC reply (OF1.5):
494 ])
495 OVS_VSWITCHD_STOP
496 AT_CLEANUP
497
498 dnl This is really bare-bones.
499 dnl It at least checks request and reply serialization and deserialization.
500 AT_SETUP([ofproto - del group deletes flows])
501 OVS_VSWITCHD_START
502 AT_DATA([groups.txt], [dnl
503 group_id=1234,type=all,bucket=output:10
504 group_id=1235,type=all,bucket=output:10
505 ])
506 AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn add-groups br0 groups.txt])
507 AT_DATA([flows.txt], [dnl
508 tcp actions=group:1234
509 table=2 udp actions=group:1235
510 ])
511 AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn add-flows br0 flows.txt])
512 AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn dump-flows br0 | ofctl_strip | sort],
513 [0], [dnl
514 table=2, udp actions=group:1235
515 tcp actions=group:1234
516 OFPST_FLOW reply (OF1.1):
517 ])
518 AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn del-groups br0 group_id=1234])
519 AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn dump-flows br0 | ofctl_strip | sort],
520 [0], [dnl
521 table=2, udp actions=group:1235
522 OFPST_FLOW reply (OF1.1):
523 ])
524 AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn del-groups br0 group_id=1234])
525 AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn dump-flows br0 | ofctl_strip | sort],
526 [0], [dnl
527 table=2, udp actions=group:1235
528 OFPST_FLOW reply (OF1.1):
529 ])
530 AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn del-groups br0])
531 AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn dump-flows br0 | ofctl_strip | sort],
532 [0], [dnl
533 OFPST_FLOW reply (OF1.1):
534 ])
535 OVS_VSWITCHD_STOP
536 AT_CLEANUP
537
538 dnl This is really bare-bones.
539 dnl It at least checks request and reply serialization and deserialization.
540 dnl Actions definition listed in both supported formats (w/ actions=)
541 AT_SETUP([ofproto - insert group buckets])
542 OVS_VSWITCHD_START
543 # Add group with no buckets.
544 AT_DATA([groups.txt], [dnl
545 group_id=1234,type=all
546 ])
547 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn add-groups br0 groups.txt])
548 AT_CHECK([ovs-ofctl -F OXM-OpenFlow15 -O OpenFlow15 -vwarn dump-groups br0 1234], [0], [stdout])
549 AT_CHECK([strip_xids < stdout], [0], [dnl
550 OFPST_GROUP_DESC reply (OF1.5):
551 group_id=1234,type=all
552 ])
553
554 # Add two buckets, using "last".
555 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn insert-buckets br0 group_id=1234,command_bucket_id=last,bucket=bucket_id:10,actions=output:10,bucket=bucket_id:11,actions=output:11])
556 AT_CHECK([ovs-ofctl -F OXM-OpenFlow15 -O OpenFlow15 -vwarn dump-groups br0 1234], [0], [stdout])
557 AT_CHECK([strip_xids < stdout], [0], [dnl
558 OFPST_GROUP_DESC reply (OF1.5):
559 group_id=1234,type=all,bucket=bucket_id:10,actions=output:10,bucket=bucket_id:11,actions=output:11
560 ])
561
562 # Start over again, then add two buckets using "first".
563 AT_CHECK([ovs-ofctl -O OpenFlow15 --strict del-groups br0 group_id=1234])
564 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn add-group br0 group_id=1234,type=all])
565 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn insert-buckets br0 group_id=1234,command_bucket_id=first,bucket=bucket_id:10,actions=output:10,bucket=bucket_id:11,actions=output:11])
566 AT_CHECK([ovs-ofctl -F OXM-OpenFlow15 -O OpenFlow15 -vwarn dump-groups br0 1234], [0], [stdout])
567 AT_CHECK([strip_xids < stdout], [0], [dnl
568 OFPST_GROUP_DESC reply (OF1.5):
569 group_id=1234,type=all,bucket=bucket_id:10,actions=output:10,bucket=bucket_id:11,actions=output:11
570 ])
571
572 # Add two more buckets before the existing ones.
573 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn insert-buckets br0 group_id=1234,command_bucket_id=first,bucket=bucket_id:0,actions=output:0,bucket=bucket_id:1,actions=output:1])
574 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn dump-groups br0], [0], [stdout])
575 AT_CHECK([strip_xids < stdout], [0], [dnl
576 OFPST_GROUP_DESC reply (OF1.5):
577 group_id=1234,type=all,bucket=bucket_id:0,actions=output:0,bucket=bucket_id:1,actions=output:1,bucket=bucket_id:10,actions=output:10,bucket=bucket_id:11,actions=output:11
578 ])
579
580 # Add another bucket at the end.
581 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn insert-buckets br0 group_id=1234,command_bucket_id=last,bucket=bucket_id:14,actions=output:14,bucket=bucket_id:15,actions=output:15])
582 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn dump-groups br0], [0], [stdout])
583 AT_CHECK([strip_xids < stdout], [0], [dnl
584 OFPST_GROUP_DESC reply (OF1.5):
585 group_id=1234,type=all,bucket=bucket_id:0,actions=output:0,bucket=bucket_id:1,actions=output:1,bucket=bucket_id:10,actions=output:10,bucket=bucket_id:11,actions=output:11,bucket=bucket_id:14,actions=output:14,bucket=bucket_id:15,actions=output:15
586 ])
587
588 # Verify that duplicate bucket IDs are rejected.
589 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn insert-buckets br0 group_id=1234,command_bucket_id=last,bucket=bucket_id:14,actions=output:14,bucket=bucket_id:15,actions=output:15], [1], [], [stderr])
590 AT_CHECK([strip_xids < stderr | sed '/truncated/,$d'], [0], [dnl
591 OFPT_ERROR (OF1.5): OFPGMFC_BUCKET_EXISTS
592 OFPT_GROUP_MOD (OF1.5):
593 ])
594
595
596 # Add another bucket just before bucket 15.
597 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn insert-buckets br0 group_id=1234,command_bucket_id=15])
598 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn dump-groups br0], [0], [stdout])
599 AT_CHECK([strip_xids < stdout], [0], [dnl
600 OFPST_GROUP_DESC reply (OF1.5):
601 group_id=1234,type=all,bucket=bucket_id:0,actions=output:0,bucket=bucket_id:1,actions=output:1,bucket=bucket_id:10,actions=output:10,bucket=bucket_id:11,actions=output:11,bucket=bucket_id:14,actions=output:14,bucket=bucket_id:15,actions=output:15
602 ])
603
604 # Add two more buckets just before bucket 11,
605 # getting the command from a file.
606 AT_DATA([buckets.txt], [dnl
607 group_id=1234,command_bucket_id=11,bucket=bucket_id:12,actions=output:12,bucket=bucket_id:13,actions=output:13
608 ])
609 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn insert-buckets br0 - < buckets.txt])
610 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn dump-groups br0], [0], [stdout])
611 AT_CHECK([strip_xids < stdout], [0], [dnl
612 OFPST_GROUP_DESC reply (OF1.5):
613 group_id=1234,type=all,bucket=bucket_id:0,actions=output:0,bucket=bucket_id:1,actions=output:1,bucket=bucket_id:10,actions=output:10,bucket=bucket_id:11,actions=output:11,bucket=bucket_id:12,actions=output:12,bucket=bucket_id:13,actions=output:13,bucket=bucket_id:14,actions=output:14,bucket=bucket_id:15,actions=output:15
614 ])
615
616 # Add yet two more buckets.
617 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn insert-buckets br0 group_id=1234,command_bucket_id=15,bucket=bucket_id:20,actions=output:20,bucket=bucket_id:21,actions=output:21])
618 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn dump-groups br0], [0], [stdout])
619 AT_CHECK([strip_xids < stdout], [0], [dnl
620 OFPST_GROUP_DESC reply (OF1.5):
621 group_id=1234,type=all,bucket=bucket_id:0,actions=output:0,bucket=bucket_id:1,actions=output:1,bucket=bucket_id:10,actions=output:10,bucket=bucket_id:11,actions=output:11,bucket=bucket_id:12,actions=output:12,bucket=bucket_id:13,actions=output:13,bucket=bucket_id:14,actions=output:14,bucket=bucket_id:15,actions=output:15,bucket=bucket_id:20,actions=output:20,bucket=bucket_id:21,actions=output:21
622 ])
623
624 # Negative tests.
625 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn insert-buckets br0 group_id=1234,command_bucket_id=0xffffff01,bucket=bucket_id:0,actions=output:0,bucket=bucket_id:1,actions=output:1], [1], [],
626 [ovs-ofctl: invalid command bucket id 4294967041
627 ])
628 AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn insert-buckets br0 group_id=1234,command_bucket_id=first,bucket=bucket_id:0,actions=output:0,bucket=bucket_id:1,actions=output:1], [1], [],
629 [ovs-ofctl: insert-bucket needs OpenFlow 1.5 or later ('-O OpenFlow15')
630 ])
631 OVS_VSWITCHD_STOP
632 AT_CLEANUP
633
634 dnl This is really bare-bones.
635 dnl It at least checks request and reply serialization and deserialization.
636 dnl Actions definition listed in both supported formats (w/ actions=)
637 AT_SETUP([ofproto - remove group buckets])
638 OVS_VSWITCHD_START
639 AT_DATA([groups.txt], [dnl
640 group_id=1234,type=all,bucket=bucket_id:10,actions=output:10,bucket=bucket_id:11,actions=output:11,bucket=bucket_id:12,actions=output:12,bucket=bucket_id:13,actions=output:13,bucket=bucket_id:14,actions=output:14,bucket=bucket_id:15,actions=output:15,bucket=bucket_id:16,actions=output:16
641 ])
642 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn add-groups br0 groups.txt])
643 AT_CHECK([ovs-ofctl -F OXM-OpenFlow15 -O OpenFlow15 -vwarn dump-groups br0 1234], [0], [stdout])
644 AT_CHECK([strip_xids < stdout], [0], [dnl
645 OFPST_GROUP_DESC reply (OF1.5):
646 group_id=1234,type=all,bucket=bucket_id:10,actions=output:10,bucket=bucket_id:11,actions=output:11,bucket=bucket_id:12,actions=output:12,bucket=bucket_id:13,actions=output:13,bucket=bucket_id:14,actions=output:14,bucket=bucket_id:15,actions=output:15,bucket=bucket_id:16,actions=output:16
647 ])
648 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn remove-buckets br0 group_id=1234,command_bucket_id=first])
649 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn dump-groups br0], [0], [stdout])
650 AT_CHECK([strip_xids < stdout], [0], [dnl
651 OFPST_GROUP_DESC reply (OF1.5):
652 group_id=1234,type=all,bucket=bucket_id:11,actions=output:11,bucket=bucket_id:12,actions=output:12,bucket=bucket_id:13,actions=output:13,bucket=bucket_id:14,actions=output:14,bucket=bucket_id:15,actions=output:15,bucket=bucket_id:16,actions=output:16
653 ])
654 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn remove-buckets br0 group_id=1234,command_bucket_id=last])
655 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn dump-groups br0], [0], [stdout])
656 AT_CHECK([strip_xids < stdout], [0], [dnl
657 OFPST_GROUP_DESC reply (OF1.5):
658 group_id=1234,type=all,bucket=bucket_id:11,actions=output:11,bucket=bucket_id:12,actions=output:12,bucket=bucket_id:13,actions=output:13,bucket=bucket_id:14,actions=output:14,bucket=bucket_id:15,actions=output:15
659 ])
660 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn remove-buckets br0 group_id=1234,command_bucket_id=13])
661 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn dump-groups br0], [0], [stdout])
662 AT_CHECK([strip_xids < stdout], [0], [dnl
663 OFPST_GROUP_DESC reply (OF1.5):
664 group_id=1234,type=all,bucket=bucket_id:11,actions=output:11,bucket=bucket_id:12,actions=output:12,bucket=bucket_id:14,actions=output:14,bucket=bucket_id:15,actions=output:15
665 ])
666 AT_DATA([buckets.txt], [dnl
667 group_id=1234
668 ])
669 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn remove-buckets br0 - < buckets.txt])
670 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn dump-groups br0], [0], [stdout])
671 AT_CHECK([strip_xids < stdout], [0], [dnl
672 OFPST_GROUP_DESC reply (OF1.5):
673 group_id=1234,type=all
674 ])
675 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn remove-buckets br0 group_id=1234,command_bucket_id=first])
676 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn remove-buckets br0 group_id=1234,command_bucket_id=last])
677 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn remove-buckets br0 group_id=1234,command_bucket_id=all])
678 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn remove-buckets br0 group_id=1234,command_bucket_id=1], [1], [], [stderr])
679 AT_CHECK([ofctl_strip < stderr], [0], [dnl
680 OFPT_ERROR (OF1.5): OFPGMFC_UNKNOWN_BUCKET
681 OFPT_GROUP_MOD (OF1.5):
682 REMOVE_BUCKET command_bucket_id:1,group_id=1234
683 ])
684 # Negative test.
685 AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn remove-buckets br0 group_id=1234,command_bucket_id=last], [1], [],
686 [ovs-ofctl: remove-bucket needs OpenFlow 1.5 or later ('-O OpenFlow15')
687 ])
688 OVS_VSWITCHD_STOP
689 AT_CLEANUP
690
691 AT_SETUP([ofproto - bundle del group (OpenFlow 1.3)])
692 OVS_VSWITCHD_START
693 AT_DATA([groups.txt], [dnl
694 group_id=1234,type=all,bucket=output:10
695 group_id=1235,type=all,bucket=actions=output:10
696 ])
697 AT_CHECK([ovs-ofctl --bundle -O OpenFlow13 -vwarn add-groups br0 groups.txt])
698 AT_CHECK([ovs-ofctl -O OpenFlow13 -vwarn dump-groups br0 ], [0], [stdout])
699 AT_CHECK([strip_xids < stdout | sort], [0], [dnl
700 group_id=1234,type=all,bucket=actions=output:10
701 group_id=1235,type=all,bucket=actions=output:10
702 OFPST_GROUP_DESC reply (OF1.3):
703 ])
704 AT_CHECK([ovs-ofctl --bundle -O OpenFlow13 -vwarn del-groups br0 group_id=1234])
705 AT_CHECK([ovs-ofctl -O OpenFlow13 -vwarn dump-groups br0], [0], [stdout])
706 AT_CHECK([strip_xids < stdout], [0], [dnl
707 OFPST_GROUP_DESC reply (OF1.3):
708 group_id=1235,type=all,bucket=actions=output:10
709 ])
710 AT_CHECK([ovs-ofctl --bundle -O OpenFlow13 -vwarn del-groups br0 group_id=1234])
711 AT_CHECK([ovs-ofctl -O OpenFlow13 -vwarn dump-groups br0], [0], [stdout])
712 AT_CHECK([strip_xids < stdout], [0], [dnl
713 OFPST_GROUP_DESC reply (OF1.3):
714 group_id=1235,type=all,bucket=actions=output:10
715 ])
716 AT_CHECK([ovs-ofctl --bundle -O OpenFlow13 -vwarn del-groups br0], [0])
717 AT_CHECK([ovs-ofctl -O OpenFlow13 -vwarn dump-groups br0], [0], [stdout])
718 AT_CHECK([strip_xids < stdout], [0], [dnl
719 OFPST_GROUP_DESC reply (OF1.3):
720 ])
721
722 # Negative test.
723 AT_CHECK([ovs-ofctl --bundle -O OpenFlow13 -vwarn del-groups br0 group_id=0xfffffff0],
724 [1], [], [ovs-ofctl: invalid group id 4294967280
725 ])
726 OVS_VSWITCHD_STOP
727 AT_CLEANUP
728
729 AT_SETUP([ofproto - bundle add indirect group])
730 OVS_VSWITCHD_START
731 dnl indirect group must have exactly one bucket
732 AT_DATA([stderr], [dnl
733 OFPT_ERROR (OF1.4) (xid=0x2): OFPGMFC_INVALID_GROUP
734 OFPT_BUNDLE_ADD_MESSAGE (OF1.4) (xid=0x2):
735 bundle_id=0 flags=atomic ordered
736 OFPT_GROUP_MOD (OF1.4) (xid=0x2): ***decode error: OFPGMFC_INVALID_GROUP***
737 ])
738 AT_CHECK([ovs-ofctl --bundle -vwarn add-group br0 'group_id=1234,type=indirect'], [1], , [stderr])
739 AT_CHECK([ovs-ofctl --bundle -vwarn add-group br0 'group_id=1235,type=indirect,bucket=output:10'])
740 AT_CHECK([ovs-ofctl --bundle -vwarn add-group br0 'group_id=1236,type=indirect,bucket=output:10,bucket=output:11'], [1], , [stderr])
741 OVS_VSWITCHD_STOP
742 AT_CLEANUP
743
744 AT_SETUP([ofproto - bundle group mod with mod and add_or_mod command])
745 OVS_VSWITCHD_START
746 dnl Check that mod-group for non-existing group fails without --may-create
747 AT_DATA([stderr], [dnl
748 OFPT_ERROR (OF1.4) (xid=0x2): OFPGMFC_UNKNOWN_GROUP
749 OFPT_GROUP_MOD (OF1.4) (xid=0x2):
750 MOD group_id=1234,type=indirect,bucket=actions=output:2
751 ])
752 AT_CHECK([ovs-ofctl --bundle -vwarn mod-group br0 'group_id=1234,type=indirect,bucket=actions=2'], [1], , [stderr])
753 dnl Check that mod-group for non-existing group succeeds with --may-create
754 AT_CHECK([ovs-ofctl --bundle -vwarn --may-create mod-group br0 'group_id=1234,type=indirect,bucket=actions=2'])
755 AT_CHECK([ovs-ofctl -O OpenFlow14 -vwarn dump-groups br0], [0], [stdout])
756 AT_CHECK([strip_xids < stdout], [0], [dnl
757 OFPST_GROUP_DESC reply (OF1.4):
758 group_id=1234,type=indirect,bucket=actions=output:2
759 ])
760 dnl Check that mod-group for existing group succeeds with --may-create
761 AT_CHECK([ovs-ofctl --bundle -vwarn --may-create mod-group br0 'group_id=1234,type=indirect,bucket=actions=3'])
762 AT_CHECK([ovs-ofctl -O OpenFlow14 -vwarn dump-groups br0], [0], [stdout])
763 AT_CHECK([strip_xids < stdout], [0], [dnl
764 OFPST_GROUP_DESC reply (OF1.4):
765 group_id=1234,type=indirect,bucket=actions=output:3
766 ])
767 OVS_VSWITCHD_STOP
768 AT_CLEANUP
769
770 AT_SETUP([ofproto - bundle del group (OpenFlow 1.5)])
771 OVS_VSWITCHD_START
772 AT_DATA([groups.txt], [dnl
773 group_id=1233,type=select,selection_method=hash,bucket=output:10,bucket=output:11
774 group_id=1234,type=select,selection_method=hash,fields(eth_dst,ip_dst,tcp_dst),bucket=output:10,bucket=output:11
775 group_id=1235,type=all,bucket=actions=output:12,bucket=bucket_id:0,actions=output:10,bucket=bucket_id:1,actions=output:11
776 ])
777 AT_CHECK([ovs-ofctl --bundle -O OpenFlow15 -vwarn add-groups br0 groups.txt])
778 AT_CHECK([ovs-ofctl -F OXM-OpenFlow15 -O OpenFlow15 -vwarn dump-groups br0 1234], [0], [stdout])
779 AT_CHECK([strip_xids < stdout], [0], [dnl
780 OFPST_GROUP_DESC reply (OF1.5):
781 group_id=1234,type=select,selection_method=hash,fields(eth_dst,ip_dst,tcp_dst),bucket=bucket_id:0,actions=output:10,bucket=bucket_id:1,actions=output:11
782 ])
783 AT_CHECK([ovs-ofctl --bundle -O OpenFlow15 -vwarn del-groups br0 group_id=1234])
784 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn dump-groups br0], [0], [stdout])
785 AT_CHECK([strip_xids < stdout | sort], [0], [dnl
786 group_id=1233,type=select,selection_method=hash,bucket=bucket_id:0,actions=output:10,bucket=bucket_id:1,actions=output:11
787 group_id=1235,type=all,bucket=bucket_id:2,actions=output:12,bucket=bucket_id:0,actions=output:10,bucket=bucket_id:1,actions=output:11
788 OFPST_GROUP_DESC reply (OF1.5):
789 ])
790 AT_CHECK([ovs-ofctl --bundle -O OpenFlow15 -vwarn del-groups br0 group_id=1234])
791 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn dump-groups br0], [0], [stdout])
792 AT_CHECK([strip_xids < stdout | sort], [0], [dnl
793 group_id=1233,type=select,selection_method=hash,bucket=bucket_id:0,actions=output:10,bucket=bucket_id:1,actions=output:11
794 group_id=1235,type=all,bucket=bucket_id:2,actions=output:12,bucket=bucket_id:0,actions=output:10,bucket=bucket_id:1,actions=output:11
795 OFPST_GROUP_DESC reply (OF1.5):
796 ])
797 AT_CHECK([ovs-ofctl --bundle -O OpenFlow15 -vwarn del-groups br0], [0])
798 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn dump-groups br0], [0], [stdout])
799 AT_CHECK([strip_xids < stdout], [0], [dnl
800 OFPST_GROUP_DESC reply (OF1.5):
801 ])
802 OVS_VSWITCHD_STOP
803 AT_CLEANUP
804
805 AT_SETUP([ofproto - bundle del group deletes flows])
806 OVS_VSWITCHD_START
807 AT_DATA([groups.txt], [dnl
808 group_id=1234,type=all,bucket=output:10
809 group_id=1235,type=all,bucket=output:10
810 ])
811 AT_CHECK([ovs-ofctl --bundle -vwarn add-groups br0 groups.txt])
812 AT_DATA([flows.txt], [dnl
813 tcp actions=group:1234
814 table=2 udp actions=group:1235
815 ])
816 AT_CHECK([ovs-ofctl --bundle -vwarn add-flows br0 flows.txt])
817 AT_CHECK([ovs-ofctl -O OpenFlow14 -vwarn dump-flows br0 | ofctl_strip | sort],
818 [0], [dnl
819 table=2, udp actions=group:1235
820 tcp actions=group:1234
821 OFPST_FLOW reply (OF1.4):
822 ])
823 AT_CHECK([ovs-ofctl --bundle -vwarn del-groups br0 group_id=1234])
824 AT_CHECK([ovs-ofctl -O OpenFlow14 -vwarn dump-flows br0 | ofctl_strip | sort],
825 [0], [dnl
826 table=2, udp actions=group:1235
827 OFPST_FLOW reply (OF1.4):
828 ])
829 AT_CHECK([ovs-ofctl --bundle -vwarn del-groups br0 group_id=1234])
830 AT_CHECK([ovs-ofctl -O OpenFlow14 -vwarn dump-flows br0 | ofctl_strip | sort],
831 [0], [dnl
832 table=2, udp actions=group:1235
833 OFPST_FLOW reply (OF1.4):
834 ])
835 AT_CHECK([ovs-ofctl --bundle -vwarn del-groups br0])
836 AT_CHECK([ovs-ofctl -O OpenFlow14 -vwarn dump-flows br0 | ofctl_strip | sort],
837 [0], [dnl
838 OFPST_FLOW reply (OF1.4):
839 ])
840 OVS_VSWITCHD_STOP
841 AT_CLEANUP
842
843 dnl This is really bare-bones.
844 dnl It at least checks request and reply serialization and deserialization.
845 dnl Actions definition listed in both supported formats (w/ actions=)
846 AT_SETUP([ofproto - bundle insert group buckets])
847 OVS_VSWITCHD_START
848 # Add group with no buckets.
849 AT_DATA([groups.txt], [dnl
850 group_id=1234,type=all
851 ])
852 AT_CHECK([ovs-ofctl --bundle -O OpenFlow15 -vwarn add-groups br0 groups.txt])
853 AT_CHECK([ovs-ofctl -F OXM-OpenFlow15 -O OpenFlow15 -vwarn dump-groups br0 1234], [0], [stdout])
854 AT_CHECK([strip_xids < stdout], [0], [dnl
855 OFPST_GROUP_DESC reply (OF1.5):
856 group_id=1234,type=all
857 ])
858
859 # Add two buckets, using "last".
860 AT_CHECK([ovs-ofctl --bundle -O OpenFlow15 -vwarn insert-buckets br0 group_id=1234,command_bucket_id=last,bucket=bucket_id:10,actions=output:10,bucket=bucket_id:11,actions=output:11])
861 AT_CHECK([ovs-ofctl -F OXM-OpenFlow15 -O OpenFlow15 -vwarn dump-groups br0 1234], [0], [stdout])
862 AT_CHECK([strip_xids < stdout], [0], [dnl
863 OFPST_GROUP_DESC reply (OF1.5):
864 group_id=1234,type=all,bucket=bucket_id:10,actions=output:10,bucket=bucket_id:11,actions=output:11
865 ])
866
867 # Start over again, then add two buckets using "first".
868 AT_DATA([groups.txt], [dnl
869 delete group_id=1234
870 add group_id=1234,type=all
871 insert_bucket group_id=1234,command_bucket_id=first,bucket=bucket_id:10,actions=output:10,bucket=bucket_id:11,actions=output:11
872 ])
873 AT_CHECK([ovs-ofctl --bundle -O OpenFlow15 -vwarn add-groups br0 groups.txt])
874 AT_CHECK([ovs-ofctl -F OXM-OpenFlow15 -O OpenFlow15 -vwarn dump-groups br0 1234], [0], [stdout])
875 AT_CHECK([strip_xids < stdout], [0], [dnl
876 OFPST_GROUP_DESC reply (OF1.5):
877 group_id=1234,type=all,bucket=bucket_id:10,actions=output:10,bucket=bucket_id:11,actions=output:11
878 ])
879
880 # Add two more buckets before the existing ones.
881 AT_CHECK([ovs-ofctl --bundle -O OpenFlow15 -vwarn insert-buckets br0 group_id=1234,command_bucket_id=first,bucket=bucket_id:0,actions=output:0,bucket=bucket_id:1,actions=output:1])
882 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn dump-groups br0], [0], [stdout])
883 AT_CHECK([strip_xids < stdout], [0], [dnl
884 OFPST_GROUP_DESC reply (OF1.5):
885 group_id=1234,type=all,bucket=bucket_id:0,actions=output:0,bucket=bucket_id:1,actions=output:1,bucket=bucket_id:10,actions=output:10,bucket=bucket_id:11,actions=output:11
886 ])
887
888 # Add another bucket at the end.
889 AT_CHECK([ovs-ofctl --bundle -O OpenFlow15 -vwarn insert-buckets br0 group_id=1234,command_bucket_id=last,bucket=bucket_id:14,actions=output:14,bucket=bucket_id:15,actions=output:15])
890 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn dump-groups br0], [0], [stdout])
891 AT_CHECK([strip_xids < stdout], [0], [dnl
892 OFPST_GROUP_DESC reply (OF1.5):
893 group_id=1234,type=all,bucket=bucket_id:0,actions=output:0,bucket=bucket_id:1,actions=output:1,bucket=bucket_id:10,actions=output:10,bucket=bucket_id:11,actions=output:11,bucket=bucket_id:14,actions=output:14,bucket=bucket_id:15,actions=output:15
894 ])
895
896 # Verify that duplicate bucket IDs are rejected.
897 AT_CHECK([ovs-ofctl --bundle -O OpenFlow15 -vwarn insert-buckets br0 group_id=1234,command_bucket_id=last,bucket=bucket_id:14,actions=output:14,bucket=bucket_id:15,actions=output:15], [1], [], [stderr])
898 AT_CHECK([strip_xids < stderr | sed '/talking to/,$d'], [0], [dnl
899 Error OFPGMFC_BUCKET_EXISTS for: OFPT_GROUP_MOD (OF1.5):
900 INSERT_BUCKET command_bucket_id:last,group_id=1234,bucket=bucket_id:14,actions=output:14,bucket=bucket_id:15,actions=output:15
901 Error OFPBFC_MSG_FAILED for: OFPT_BUNDLE_CONTROL (OF1.5):
902 bundle_id=0 type=COMMIT_REQUEST flags=atomic ordered
903 ])
904
905 # Add another bucket just before bucket 15.
906 AT_CHECK([ovs-ofctl --bundle -O OpenFlow15 -vwarn insert-buckets br0 group_id=1234,command_bucket_id=15])
907 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn dump-groups br0], [0], [stdout])
908 AT_CHECK([strip_xids < stdout], [0], [dnl
909 OFPST_GROUP_DESC reply (OF1.5):
910 group_id=1234,type=all,bucket=bucket_id:0,actions=output:0,bucket=bucket_id:1,actions=output:1,bucket=bucket_id:10,actions=output:10,bucket=bucket_id:11,actions=output:11,bucket=bucket_id:14,actions=output:14,bucket=bucket_id:15,actions=output:15
911 ])
912
913 # Add two more buckets just before bucket 11,
914 # getting the command from a file.
915 AT_DATA([buckets.txt], [dnl
916 group_id=1234,command_bucket_id=11,bucket=bucket_id:12,actions=output:12,bucket=bucket_id:13,actions=output:13
917 ])
918 AT_CHECK([ovs-ofctl --bundle -O OpenFlow15 -vwarn insert-buckets br0 - < buckets.txt])
919 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn dump-groups br0], [0], [stdout])
920 AT_CHECK([strip_xids < stdout], [0], [dnl
921 OFPST_GROUP_DESC reply (OF1.5):
922 group_id=1234,type=all,bucket=bucket_id:0,actions=output:0,bucket=bucket_id:1,actions=output:1,bucket=bucket_id:10,actions=output:10,bucket=bucket_id:11,actions=output:11,bucket=bucket_id:12,actions=output:12,bucket=bucket_id:13,actions=output:13,bucket=bucket_id:14,actions=output:14,bucket=bucket_id:15,actions=output:15
923 ])
924
925 # Add yet two more buckets.
926 AT_CHECK([ovs-ofctl --bundle -O OpenFlow15 -vwarn insert-buckets br0 group_id=1234,command_bucket_id=15,bucket=bucket_id:20,actions=output:20,bucket=bucket_id:21,actions=output:21])
927 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn dump-groups br0], [0], [stdout])
928 AT_CHECK([strip_xids < stdout], [0], [dnl
929 OFPST_GROUP_DESC reply (OF1.5):
930 group_id=1234,type=all,bucket=bucket_id:0,actions=output:0,bucket=bucket_id:1,actions=output:1,bucket=bucket_id:10,actions=output:10,bucket=bucket_id:11,actions=output:11,bucket=bucket_id:12,actions=output:12,bucket=bucket_id:13,actions=output:13,bucket=bucket_id:14,actions=output:14,bucket=bucket_id:15,actions=output:15,bucket=bucket_id:20,actions=output:20,bucket=bucket_id:21,actions=output:21
931 ])
932
933 # Negative tests.
934 AT_CHECK([ovs-ofctl --bundle -O OpenFlow15 -vwarn insert-buckets br0 group_id=1234,command_bucket_id=0xffffff01,bucket=bucket_id:0,actions=output:0,bucket=bucket_id:1,actions=output:1], [1], [],
935 [ovs-ofctl: invalid command bucket id 4294967041
936 ])
937 AT_CHECK([ovs-ofctl --bundle -vwarn insert-buckets br0 group_id=1234,command_bucket_id=first,bucket=bucket_id:0,actions=output:0,bucket=bucket_id:1,actions=output:1], [1], [],
938 [ovs-ofctl: insert-bucket needs OpenFlow 1.5 or later ('-O OpenFlow15')
939 ])
940 OVS_VSWITCHD_STOP
941 AT_CLEANUP
942
943 AT_SETUP([ofproto - bundle remove group buckets])
944 OVS_VSWITCHD_START
945 AT_DATA([groups.txt], [dnl
946 group_id=1234,type=all,bucket=bucket_id:10,actions=output:10,bucket=bucket_id:11,actions=output:11,bucket=bucket_id:12,actions=output:12,bucket=bucket_id:13,actions=output:13,bucket=bucket_id:14,actions=output:14,bucket=bucket_id:15,actions=output:15,bucket=bucket_id:16,actions=output:16
947 ])
948 AT_CHECK([ovs-ofctl --bundle -O OpenFlow15 -vwarn add-groups br0 groups.txt])
949 AT_CHECK([ovs-ofctl -F OXM-OpenFlow15 -O OpenFlow15 -vwarn dump-groups br0 1234], [0], [stdout])
950 AT_CHECK([strip_xids < stdout], [0], [dnl
951 OFPST_GROUP_DESC reply (OF1.5):
952 group_id=1234,type=all,bucket=bucket_id:10,actions=output:10,bucket=bucket_id:11,actions=output:11,bucket=bucket_id:12,actions=output:12,bucket=bucket_id:13,actions=output:13,bucket=bucket_id:14,actions=output:14,bucket=bucket_id:15,actions=output:15,bucket=bucket_id:16,actions=output:16
953 ])
954 AT_CHECK([ovs-ofctl --bundle -O OpenFlow15 -vwarn remove-buckets br0 group_id=1234,command_bucket_id=first])
955 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn dump-groups br0], [0], [stdout])
956 AT_CHECK([strip_xids < stdout], [0], [dnl
957 OFPST_GROUP_DESC reply (OF1.5):
958 group_id=1234,type=all,bucket=bucket_id:11,actions=output:11,bucket=bucket_id:12,actions=output:12,bucket=bucket_id:13,actions=output:13,bucket=bucket_id:14,actions=output:14,bucket=bucket_id:15,actions=output:15,bucket=bucket_id:16,actions=output:16
959 ])
960 AT_CHECK([ovs-ofctl --bundle -O OpenFlow15 -vwarn remove-buckets br0 group_id=1234,command_bucket_id=last])
961 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn dump-groups br0], [0], [stdout])
962 AT_CHECK([strip_xids < stdout], [0], [dnl
963 OFPST_GROUP_DESC reply (OF1.5):
964 group_id=1234,type=all,bucket=bucket_id:11,actions=output:11,bucket=bucket_id:12,actions=output:12,bucket=bucket_id:13,actions=output:13,bucket=bucket_id:14,actions=output:14,bucket=bucket_id:15,actions=output:15
965 ])
966 AT_CHECK([ovs-ofctl --bundle -O OpenFlow15 -vwarn remove-buckets br0 group_id=1234,command_bucket_id=13])
967 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn dump-groups br0], [0], [stdout])
968 AT_CHECK([strip_xids < stdout], [0], [dnl
969 OFPST_GROUP_DESC reply (OF1.5):
970 group_id=1234,type=all,bucket=bucket_id:11,actions=output:11,bucket=bucket_id:12,actions=output:12,bucket=bucket_id:14,actions=output:14,bucket=bucket_id:15,actions=output:15
971 ])
972 AT_DATA([buckets.txt], [dnl
973 group_id=1234
974 ])
975 AT_CHECK([ovs-ofctl --bundle -O OpenFlow15 -vwarn remove-buckets br0 - < buckets.txt])
976 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn dump-groups br0], [0], [stdout])
977 AT_CHECK([strip_xids < stdout], [0], [dnl
978 OFPST_GROUP_DESC reply (OF1.5):
979 group_id=1234,type=all
980 ])
981 AT_CHECK([ovs-ofctl --bundle -O OpenFlow15 -vwarn remove-buckets br0 group_id=1234,command_bucket_id=first])
982 AT_CHECK([ovs-ofctl --bundle -O OpenFlow15 -vwarn remove-buckets br0 group_id=1234,command_bucket_id=last])
983 AT_CHECK([ovs-ofctl --bundle -O OpenFlow15 -vwarn remove-buckets br0 group_id=1234,command_bucket_id=all])
984 AT_CHECK([ovs-ofctl --bundle -O OpenFlow15 -vwarn remove-buckets br0 group_id=1234,command_bucket_id=1], [1], [], [stderr])
985 AT_CHECK([ofctl_strip < stderr | sed '/talking to/,$d'], [0], [dnl
986 Error OFPGMFC_UNKNOWN_BUCKET for: OFPT_GROUP_MOD (OF1.5):
987 REMOVE_BUCKET command_bucket_id:1,group_id=1234
988 Error OFPBFC_MSG_FAILED for: OFPT_BUNDLE_CONTROL (OF1.5):
989 bundle_id=0 type=COMMIT_REQUEST flags=atomic ordered
990 ])
991 # Negative test.
992 AT_CHECK([ovs-ofctl --bundle -O OpenFlow11 -vwarn remove-buckets br0 group_id=1234,command_bucket_id=last], [1], [],
993 [ovs-ofctl: remove-bucket needs OpenFlow 1.5 or later ('-O OpenFlow15')
994 ])
995 OVS_VSWITCHD_STOP
996 AT_CLEANUP
997
998 dnl This is really bare-bones.
999 dnl It at least checks request and reply serialization and deserialization.
1000 AT_SETUP([ofproto - flow mod checks group availability])
1001 OVS_VSWITCHD_START
1002 AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn add-group br0 group_id=1234,type=all,bucket=output:10])
1003 AT_DATA([flows.txt], [dnl
1004 tcp actions=group:1234
1005 udp actions=group:1235
1006 ])
1007 AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn add-flow br0 'tcp actions=group:1234'])
1008 AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn add-flow br0 'tcp actions=group:1235'], [1], [], [stderr])
1009
1010 # The output should look like this:
1011 #
1012 # 00000000 02 0e 00 98 00 00 00 02-00 00 00 00 00 00 00 00 |................|
1013 # 00000010 00 00 00 00 00 00 00 00-ff 00 00 00 00 00 80 00 |................|
1014 # 00000020 ff ff ff ff ff ff ff ff-ff ff ff ff 00 00 00 00 |................|
1015 # 00000030 00 00 00 58 00 00 00 00-00 00 03 d7 00 00 00 00 |...X............|
1016 #
1017 # This 'sed' command captures the error message but drops details.
1018 AT_CHECK([sed '/truncated/d
1019 /^000000.0/d' stderr | strip_xids], [0],
1020 [OFPT_ERROR (OF1.1): OFPBAC_BAD_OUT_GROUP
1021 OFPT_FLOW_MOD (OF1.1):
1022 ])
1023 OVS_VSWITCHD_STOP
1024 AT_CLEANUP
1025
1026 AT_SETUP([ofproto - bundle flow mod checks group availability])
1027 OVS_VSWITCHD_START
1028 AT_DATA([bundle.txt], [dnl
1029 group add group_id=1234,type=all,bucket=output:10
1030 flow add tcp actions=group:1234
1031 flow add udp actions=group:1235
1032 ])
1033 AT_CHECK([ovs-ofctl -vwarn bundle br0 bundle.txt], [1], [], [stderr])
1034
1035 # The output should look like this:
1036 #
1037 # 00000000 02 0e 00 98 00 00 00 02-00 00 00 00 00 00 00 00 |................|
1038 # 00000010 00 00 00 00 00 00 00 00-ff 00 00 00 00 00 80 00 |................|
1039 # 00000020 ff ff ff ff ff ff ff ff-ff ff ff ff 00 00 00 00 |................|
1040 # 00000030 00 00 00 58 00 00 00 00-00 00 03 d7 00 00 00 00 |...X............|
1041 #
1042 # This 'sed' command captures the error message but drops details.
1043 AT_CHECK([sed '/truncated/d
1044 /^000000.0/d' stderr | ofctl_strip | sed '/talking to/,$d'], [0],
1045 [dnl
1046 Error OFPBAC_BAD_OUT_GROUP for: OFPT_FLOW_MOD (OF1.4): ADD udp actions=group:1235
1047 Error OFPBFC_MSG_FAILED for: OFPT_BUNDLE_CONTROL (OF1.4):
1048 bundle_id=0 type=COMMIT_REQUEST flags=atomic ordered
1049 ])
1050 OVS_VSWITCHD_STOP
1051 AT_CLEANUP
1052
1053 dnl This is really bare-bones.
1054 dnl It at least checks request and reply serialization and deserialization.
1055 AT_SETUP([ofproto - group description])
1056 OVS_VSWITCHD_START
1057 AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn add-group br0 group_id=1234,type=all,bucket=output:10], [0], [stdout])
1058 AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn dump-groups br0], [0], [stdout])
1059 AT_CHECK([strip_xids < stdout], [0], [dnl
1060 OFPST_GROUP_DESC reply (OF1.1):
1061 group_id=1234,type=all,bucket=actions=output:10
1062 ])
1063 OVS_VSWITCHD_STOP
1064 AT_CLEANUP
1065
1066 dnl This is really bare-bones.
1067 dnl It at least checks request and reply serialization and deserialization.
1068 AT_SETUP([ofproto - group description])
1069 OVS_VSWITCHD_START
1070 AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn add-group br0 group_id=1234,type=all,bucket=output:10])
1071 AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn dump-groups br0], [0], [stdout])
1072 AT_CHECK([strip_xids < stdout], [0], [dnl
1073 OFPST_GROUP_DESC reply (OF1.1):
1074 group_id=1234,type=all,bucket=actions=output:10
1075 ])
1076 OVS_VSWITCHD_STOP
1077 AT_CLEANUP
1078
1079 dnl This is really bare-bones.
1080 dnl It at least checks request and reply serialization and deserialization.
1081 AT_SETUP([ofproto - group features])
1082 OVS_VSWITCHD_START
1083 AT_CHECK([ovs-ofctl -O OpenFlow12 -vwarn dump-group-features br0], [0], [stdout])
1084 AT_CHECK([strip_xids < stdout], [0], [dnl
1085 OFPST_GROUP_FEATURES reply (OF1.2):
1086 Group table:
1087 Types: 0xf
1088 Capabilities: 0x7
1089 all group:
1090 max_groups=0xffffff00
1091 actions: output group set_field strip_vlan push_vlan mod_nw_ttl dec_ttl set_mpls_ttl dec_mpls_ttl push_mpls pop_mpls set_queue
1092 select group:
1093 max_groups=0xffffff00
1094 actions: output group set_field strip_vlan push_vlan mod_nw_ttl dec_ttl set_mpls_ttl dec_mpls_ttl push_mpls pop_mpls set_queue
1095 indirect group:
1096 max_groups=0xffffff00
1097 actions: output group set_field strip_vlan push_vlan mod_nw_ttl dec_ttl set_mpls_ttl dec_mpls_ttl push_mpls pop_mpls set_queue
1098 fast failover group:
1099 max_groups=0xffffff00
1100 actions: output group set_field strip_vlan push_vlan mod_nw_ttl dec_ttl set_mpls_ttl dec_mpls_ttl push_mpls pop_mpls set_queue
1101 ])
1102 OVS_VSWITCHD_STOP
1103 AT_CLEANUP
1104
1105 dnl This is really bare-bones.
1106 dnl It at least checks request and reply serialization and deserialization.
1107 AT_SETUP([ofproto - group stats (OpenFlow 1.1)])
1108 OVS_VSWITCHD_START
1109 AT_DATA([groups.txt], [dnl
1110 group_id=1234,type=all,bucket=output:10
1111 group_id=1235,type=all,bucket=output:10
1112 ])
1113 AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn add-groups br0 groups.txt])
1114 AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn add-flow br0 'tcp actions=group:1234'])
1115 AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn dump-group-stats br0 group_id=1234], [0], [stdout])
1116 AT_CHECK([strip_xids < stdout | sort], [0], [dnl
1117 group_id=1234,ref_count=1,packet_count=0,byte_count=0,bucket0:packet_count=0,byte_count=0
1118 OFPST_GROUP reply (OF1.1):
1119 ])
1120 AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn dump-group-stats br0], [0], [stdout])
1121 AT_CHECK([strip_xids < stdout | sort], [0], [dnl
1122 group_id=1234,ref_count=1,packet_count=0,byte_count=0,bucket0:packet_count=0,byte_count=0
1123 group_id=1235,ref_count=0,packet_count=0,byte_count=0,bucket0:packet_count=0,byte_count=0
1124 OFPST_GROUP reply (OF1.1):
1125 ])
1126 OVS_VSWITCHD_STOP
1127 AT_CLEANUP
1128
1129 dnl This is really bare-bones.
1130 dnl It at least checks request and reply serialization and deserialization.
1131 AT_SETUP([ofproto - group stats (OpenFlow 1.3)])
1132 OVS_VSWITCHD_START
1133 AT_DATA([groups.txt], [dnl
1134 group_id=1234,type=all,bucket=output:10
1135 group_id=1235,type=all,bucket=output:10
1136 ])
1137 AT_CHECK([ovs-ofctl -O OpenFlow13 -vwarn add-groups br0 groups.txt])
1138 AT_CHECK([ovs-ofctl -O OpenFlow13 -vwarn add-flow br0 'tcp actions=group:1234'])
1139 AT_CHECK([ovs-ofctl -O OpenFlow13 -vwarn dump-group-stats br0 group_id=1234], [0], [stdout])
1140 AT_CHECK([strip_xids < stdout | sed 's/duration=[[0-9.]]*s/duration=?s/' | sort], [0], [dnl
1141 group_id=1234,duration=?s,ref_count=1,packet_count=0,byte_count=0,bucket0:packet_count=0,byte_count=0
1142 OFPST_GROUP reply (OF1.3):
1143 ])
1144 AT_CHECK([ovs-ofctl -O OpenFlow13 -vwarn dump-group-stats br0], [0], [stdout])
1145 AT_CHECK([strip_xids < stdout | sed 's/duration=[[0-9.]]*s/duration=?s/' | sort], [0], [dnl
1146 group_id=1234,duration=?s,ref_count=1,packet_count=0,byte_count=0,bucket0:packet_count=0,byte_count=0
1147 group_id=1235,duration=?s,ref_count=0,packet_count=0,byte_count=0,bucket0:packet_count=0,byte_count=0
1148 OFPST_GROUP reply (OF1.3):
1149 ])
1150 OVS_VSWITCHD_STOP
1151 AT_CLEANUP
1152
1153 dnl This is really bare-bones.
1154 dnl It at least checks request and reply serialization and deserialization.
1155 AT_SETUP([ofproto - group stats (OpenFlow 1.5)])
1156 OVS_VSWITCHD_START
1157 AT_DATA([groups.txt], [dnl
1158 group_id=1234,type=all,bucket=output:10
1159 group_id=1235,type=all,bucket=output:10
1160 ])
1161 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn add-groups br0 groups.txt])
1162 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn add-flow br0 'tcp actions=group:1234'])
1163 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn dump-group-stats br0 group_id=1234], [0], [stdout])
1164 AT_CHECK([strip_xids < stdout | sed 's/duration=[[0-9.]]*s/duration=?s/' | sort], [0], [dnl
1165 group_id=1234,duration=?s,ref_count=1,packet_count=0,byte_count=0,bucket0:packet_count=0,byte_count=0
1166 OFPST_GROUP reply (OF1.5):
1167 ])
1168 AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn dump-group-stats br0], [0], [stdout])
1169 AT_CHECK([strip_xids < stdout | sed 's/duration=[[0-9.]]*s/duration=?s/' | sort], [0], [dnl
1170 group_id=1234,duration=?s,ref_count=1,packet_count=0,byte_count=0,bucket0:packet_count=0,byte_count=0
1171 group_id=1235,duration=?s,ref_count=0,packet_count=0,byte_count=0,bucket0:packet_count=0,byte_count=0
1172 OFPST_GROUP reply (OF1.5):
1173 ])
1174 OVS_VSWITCHD_STOP
1175 AT_CLEANUP
1176
1177 dnl This found a use-after-free error in bridge destruction in the
1178 dnl presence of groups.
1179 AT_SETUP([ofproto - group add then bridge delete (OpenFlow 1.3)])
1180 OVS_VSWITCHD_START
1181 AT_DATA([groups.txt], [dnl
1182 group_id=1234,type=all,bucket=output:10
1183 group_id=1235,type=all,bucket=output:10
1184
1185 dnl This checks for regression against a parser bug such that
1186 dnl "actions=resbmit(,1)" etc. was rejected as a syntax error.
1187 group_id=2345,type=select,bucket=weight:10,actions=resubmit(,1),bucket=weight:10,actions=resubmit(,2),bucket=weight:1,actions=resubmit(,3)
1188 ])
1189 AT_CHECK([ovs-ofctl -O OpenFlow13 -vwarn add-groups br0 groups.txt])
1190 AT_CHECK([ovs-vsctl del-br br0])
1191 OVS_VSWITCHD_STOP
1192 AT_CLEANUP
1193
1194 AT_SETUP([ofproto - mod-port (OpenFlow 1.0)])
1195 OVS_VSWITCHD_START
1196 for command_config_state in \
1197 'up 0 0' \
1198 'noflood NO_FLOOD 0' \
1199 'down PORT_DOWN,NO_FLOOD LINK_DOWN' \
1200 'flood PORT_DOWN LINK_DOWN' \
1201 'no-receive PORT_DOWN,NO_RECV LINK_DOWN' \
1202 'no-forward PORT_DOWN,NO_RECV,NO_FWD LINK_DOWN' \
1203 'no-packet-in PORT_DOWN,NO_RECV,NO_FWD,NO_PACKET_IN LINK_DOWN' \
1204 'forward PORT_DOWN,NO_RECV,NO_PACKET_IN LINK_DOWN' \
1205 'packet-in PORT_DOWN,NO_RECV LINK_DOWN' \
1206 'up NO_RECV 0' \
1207 'receive 0 0'
1208 do
1209 set $command_config_state
1210 command=$[1] config=`echo $[2] | sed 's/,/ /g'` state=$[3]
1211 AT_CHECK([ovs-ofctl -vwarn mod-port br0 br0 $command])
1212 AT_CHECK([ovs-ofctl -vwarn show br0], [0], [stdout])
1213 AT_CHECK_UNQUOTED([strip_xids < stdout], [0], [dnl
1214 OFPT_FEATURES_REPLY: dpid:fedcba9876543210
1215 n_tables:254, n_buffers:0
1216 capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
1217 actions: output enqueue set_vlan_vid set_vlan_pcp strip_vlan mod_dl_src mod_dl_dst mod_nw_src mod_nw_dst mod_nw_tos mod_tp_src mod_tp_dst
1218 LOCAL(br0): addr:aa:55:aa:55:00:00
1219 config: $config
1220 state: $state
1221 speed: 0 Mbps now, 0 Mbps max
1222 OFPT_GET_CONFIG_REPLY: frags=normal miss_send_len=0
1223 ])
1224 done
1225 OVS_VSWITCHD_STOP
1226 AT_CLEANUP
1227
1228 AT_SETUP([ofproto - mod-port (OpenFlow 1.2)])
1229 OVS_VSWITCHD_START
1230 for command_config_state in \
1231 'up 0 LIVE' \
1232 'down PORT_DOWN LINK_DOWN' \
1233 'no-receive PORT_DOWN,NO_RECV LINK_DOWN' \
1234 'no-forward PORT_DOWN,NO_RECV,NO_FWD LINK_DOWN' \
1235 'no-packet-in PORT_DOWN,NO_RECV,NO_FWD,NO_PACKET_IN LINK_DOWN' \
1236 'forward PORT_DOWN,NO_RECV,NO_PACKET_IN LINK_DOWN' \
1237 'packet-in PORT_DOWN,NO_RECV LINK_DOWN' \
1238 'up NO_RECV LIVE' \
1239 'receive 0 LIVE'
1240 do
1241 set $command_config_state
1242 command=$[1] config=`echo $[2] | sed 's/,/ /g'` state=$[3]
1243 AT_CHECK([ovs-ofctl -O OpenFlow12 -vwarn mod-port br0 br0 $command])
1244 AT_CHECK([ovs-ofctl -O OpenFlow12 -vwarn show br0], [0], [stdout])
1245 AT_CHECK_UNQUOTED([strip_xids < stdout], [0], [dnl
1246 OFPT_FEATURES_REPLY (OF1.2): dpid:fedcba9876543210
1247 n_tables:254, n_buffers:0
1248 capabilities: FLOW_STATS TABLE_STATS PORT_STATS GROUP_STATS QUEUE_STATS
1249 LOCAL(br0): addr:aa:55:aa:55:00:00
1250 config: $config
1251 state: $state
1252 speed: 0 Mbps now, 0 Mbps max
1253 OFPT_GET_CONFIG_REPLY (OF1.2): frags=normal miss_send_len=0
1254 ])
1255 done
1256 OVS_VSWITCHD_STOP
1257 AT_CLEANUP
1258
1259 AT_SETUP([ofproto - mod-port (OpenFlow 1.4)])
1260 OVS_VSWITCHD_START
1261 for command_config_state in \
1262 'up 0 LIVE' \
1263 'down PORT_DOWN LINK_DOWN' \
1264 'no-receive PORT_DOWN,NO_RECV LINK_DOWN' \
1265 'no-forward PORT_DOWN,NO_RECV,NO_FWD LINK_DOWN' \
1266 'no-packet-in PORT_DOWN,NO_RECV,NO_FWD,NO_PACKET_IN LINK_DOWN' \
1267 'forward PORT_DOWN,NO_RECV,NO_PACKET_IN LINK_DOWN' \
1268 'packet-in PORT_DOWN,NO_RECV LINK_DOWN' \
1269 'up NO_RECV LIVE' \
1270 'receive 0 LIVE'
1271 do
1272 set $command_config_state
1273 command=$[1] config=`echo $[2] | sed 's/,/ /g'` state=$[3]
1274 AT_CHECK([ovs-ofctl -O OpenFlow14 -vwarn mod-port br0 br0 $command])
1275 AT_CHECK([ovs-ofctl -O OpenFlow14 -vwarn show br0], [0], [stdout])
1276 AT_CHECK_UNQUOTED([strip_xids < stdout], [0], [dnl
1277 OFPT_FEATURES_REPLY (OF1.4): dpid:fedcba9876543210
1278 n_tables:254, n_buffers:0
1279 capabilities: FLOW_STATS TABLE_STATS PORT_STATS GROUP_STATS QUEUE_STATS BUNDLES
1280 OFPST_PORT_DESC reply (OF1.4):
1281 LOCAL(br0): addr:aa:55:aa:55:00:00
1282 config: $config
1283 state: $state
1284 speed: 0 Mbps now, 0 Mbps max
1285 OFPT_GET_CONFIG_REPLY (OF1.4): frags=normal miss_send_len=0
1286 ])
1287 done
1288 OVS_VSWITCHD_STOP
1289 AT_CLEANUP
1290
1291 AT_SETUP([ofproto - mod-port (OpenFlow 1.6)])
1292 OVS_VSWITCHD_START
1293 for command_config_state in \
1294 'up 0 LIVE' \
1295 'down PORT_DOWN LINK_DOWN' \
1296 'no-receive PORT_DOWN,NO_RECV LINK_DOWN' \
1297 'no-forward PORT_DOWN,NO_RECV,NO_FWD LINK_DOWN' \
1298 'no-packet-in PORT_DOWN,NO_RECV,NO_FWD,NO_PACKET_IN LINK_DOWN' \
1299 'forward PORT_DOWN,NO_RECV,NO_PACKET_IN LINK_DOWN' \
1300 'packet-in PORT_DOWN,NO_RECV LINK_DOWN' \
1301 'up NO_RECV LIVE' \
1302 'receive 0 LIVE'
1303 do
1304 set $command_config_state
1305 command=$[1] config=`echo $[2] | sed 's/,/ /g'` state=$[3]
1306 AT_CHECK([ovs-ofctl -O OpenFlow16 -vwarn mod-port br0 br0 $command])
1307 AT_CHECK([ovs-ofctl -O OpenFlow16 -vwarn show br0], [0], [stdout])
1308 AT_CHECK_UNQUOTED([strip_xids < stdout], [0], [dnl
1309 OFPT_FEATURES_REPLY (OF1.6): dpid:fedcba9876543210
1310 n_tables:254, n_buffers:0
1311 capabilities: FLOW_STATS TABLE_STATS PORT_STATS GROUP_STATS QUEUE_STATS BUNDLES
1312 OFPST_PORT_DESC reply (OF1.6):
1313 LOCAL(br0): addr:aa:55:aa:55:00:00
1314 config: $config
1315 state: $state
1316 speed: 0 Mbps now, 0 Mbps max
1317 OFPT_GET_CONFIG_REPLY (OF1.6): frags=normal miss_send_len=0
1318 ])
1319 done
1320 OVS_VSWITCHD_STOP
1321 AT_CLEANUP
1322
1323 AT_SETUP([ofproto - basic flow_mod commands (NXM)])
1324 OVS_VSWITCHD_START
1325 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0], [NXST_FLOW reply:
1326 ])
1327 AT_CHECK([echo 'in_port=2,actions=1' | ovs-ofctl add-flows br0 -])
1328 AT_CHECK([ovs-ofctl add-flow br0 in_port=1,actions=2])
1329 AT_CHECK([ovs-ofctl -F nxm add-flow br0 table=1,in_port=4,actions=3])
1330 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
1331 in_port=1 actions=output:2
1332 in_port=2 actions=output:1
1333 table=1, in_port=4 actions=output:3
1334 NXST_FLOW reply:
1335 ])
1336 AT_CHECK([ovs-ofctl dump-aggregate br0 table=0 | strip_xids], [0], [dnl
1337 NXST_AGGREGATE reply: packet_count=0 byte_count=0 flow_count=2
1338 ])
1339 AT_CHECK([ovs-ofctl del-flows br0])
1340 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0], [NXST_FLOW reply:
1341 ])
1342 OVS_VSWITCHD_STOP
1343 AT_CLEANUP
1344
1345 AT_SETUP([ofproto - basic flow_mod commands (OpenFlow 1.0)])
1346 OVS_VSWITCHD_START
1347 AT_CHECK([ovs-ofctl -F openflow10 dump-flows br0 | ofctl_strip], [0], [OFPST_FLOW reply:
1348 ])
1349 AT_CHECK([echo 'in_port=2,actions=1' | ovs-ofctl -F openflow10 add-flows br0 -])
1350 AT_CHECK([ovs-ofctl -F openflow10 add-flow br0 in_port=1,actions=2])
1351 AT_CHECK([ovs-ofctl -F openflow10 add-flow br0 table=1,in_port=4,actions=3])
1352 AT_CHECK([ovs-ofctl -F openflow10 dump-flows br0 | ofctl_strip | sort], [0], [dnl
1353 in_port=1 actions=output:2
1354 in_port=2 actions=output:1
1355 table=1, in_port=4 actions=output:3
1356 OFPST_FLOW reply:
1357 ])
1358 AT_CHECK([ovs-ofctl -F openflow10 dump-aggregate br0 table=0 | strip_xids], [0], [dnl
1359 OFPST_AGGREGATE reply: packet_count=0 byte_count=0 flow_count=2
1360 ])
1361 AT_CHECK([ovs-ofctl -F openflow10 del-flows br0])
1362 AT_CHECK([ovs-ofctl -F openflow10 dump-flows br0 | ofctl_strip], [0], [OFPST_FLOW reply:
1363 ])
1364 OVS_VSWITCHD_STOP
1365 AT_CLEANUP
1366
1367 # It's really dumb that check_overlap and reset_counts are considered
1368 # part of flow state, but OpenFlow implies that it is, and OFTest and
1369 # some users insist on it.
1370 AT_SETUP([ofproto - add-flow and flags])
1371 OVS_VSWITCHD_START
1372 AT_CHECK([ovs-ofctl -F openflow10 add-flow br0 check_overlap,in_port=1,actions=drop])
1373 # Prior to OF1.3, flow dumps didn't include a "flags" field.
1374 AT_CHECK([ovs-ofctl -F openflow10 dump-flows br0 | ofctl_strip], [0], [dnl
1375 OFPST_FLOW reply:
1376 in_port=1 actions=drop
1377 ])
1378 AT_CHECK([ovs-ofctl -O OpenFlow11 dump-flows br0 | ofctl_strip], [0], [dnl
1379 OFPST_FLOW reply (OF1.1):
1380 in_port=1 actions=drop
1381 ])
1382 AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip], [0], [dnl
1383 OFPST_FLOW reply (OF1.2):
1384 in_port=1 actions=drop
1385 ])
1386 # OF1.3 makes the flags visible.
1387 AT_CHECK([ovs-ofctl -O OpenFlow13 dump-flows br0 | ofctl_strip], [0], [dnl
1388 OFPST_FLOW reply (OF1.3):
1389 check_overlap reset_counts in_port=1 actions=drop
1390 ])
1391 AT_CHECK([ovs-ofctl -O OpenFlow14 dump-flows br0 | ofctl_strip], [0], [dnl
1392 OFPST_FLOW reply (OF1.4):
1393 check_overlap reset_counts in_port=1 actions=drop
1394 ])
1395 AT_CHECK([ovs-ofctl -O OpenFlow15 dump-flows br0 | ofctl_strip], [0], [dnl
1396 OFPST_FLOW reply (OF1.5):
1397 check_overlap reset_counts in_port=1 actions=drop
1398 ])
1399 OVS_VSWITCHD_STOP
1400 AT_CLEANUP
1401
1402 AT_SETUP([ofproto - basic flow_mod commands (OpenFlow 1.1)])
1403 OVS_VSWITCHD_START
1404 AT_CHECK([ovs-ofctl -O OpenFlow11 dump-flows br0 | ofctl_strip], [0], [OFPST_FLOW reply (OF1.1):
1405 ])
1406 AT_CHECK([echo 'in_port=2,actions=1' | ovs-ofctl -O OpenFlow11 add-flows br0 -])
1407 AT_CHECK([ovs-ofctl -O OpenFlow11 add-flow br0 in_port=1,actions=2])
1408 AT_CHECK([ovs-ofctl -O OpenFlow11 add-flow br0 table=1,in_port=4,actions=3])
1409 AT_CHECK([ovs-ofctl -O OpenFlow11 dump-flows br0 | ofctl_strip | sort], [0], [dnl
1410 in_port=1 actions=output:2
1411 in_port=2 actions=output:1
1412 table=1, in_port=4 actions=output:3
1413 OFPST_FLOW reply (OF1.1):
1414 ])
1415 AT_CHECK([ovs-ofctl -O OpenFlow11 dump-aggregate br0 table=0 | strip_xids], [0], [dnl
1416 OFPST_AGGREGATE reply (OF1.1): packet_count=0 byte_count=0 flow_count=2
1417 ])
1418 AT_CHECK([ovs-ofctl -O OpenFlow11 del-flows br0])
1419 AT_CHECK([ovs-ofctl -O OpenFlow11 dump-flows br0 | ofctl_strip], [0], [OFPST_FLOW reply (OF1.1):
1420 table=1, in_port=4 actions=output:3
1421 ])
1422 OVS_VSWITCHD_STOP
1423 AT_CLEANUP
1424
1425 AT_SETUP([ofproto - flow_mod negative test (OpenFlow 1.1)])
1426 OVS_VSWITCHD_START(
1427 [set bridge br0 protocols=OpenFlow10,OpenFlow11,OpenFlow12,OpenFlow13])
1428 AT_CHECK([ovs-ofctl add-flow -O OpenFlow11 br0 table=1,action=goto_table:2])
1429
1430 # The error message here actually comes from ovs-ofctl, not from ovs-vswitchd,
1431 # but at least it's the same code in ofpacts_check() that issues the error.
1432 AT_CHECK([ovs-ofctl add-flow -O OpenFlow11 br0 table=1,action=goto_table:1],
1433 [1], [],
1434 [ovs-ofctl: actions are invalid with specified match (OFPBIC_BAD_TABLE_ID)
1435 ])
1436 OVS_VSWITCHD_STOP
1437 AT_CLEANUP
1438
1439 AT_SETUP([ofproto - set-field flow_mod commands (NXM)])
1440 OVS_VSWITCHD_START
1441 AT_CHECK([ovs-ofctl add-flow br0 ipv6,table=1,in_port=3,actions=drop])
1442 AT_CHECK([ovs-ofctl add-flow br0 ipv6,table=1,in_port=3,actions=set_field:fe80:0123:4567:890a:a6ba:dbff:fefe:59fa-\>ipv6_src])
1443 AT_CHECK([ovs-ofctl add-flow br0 icmp6,icmp_type=136,table=1,in_port=3,actions=set_field:fe80:8675:3097:890a:a6ba:dbff:f00d:59fa-\>nd_target,set_field:cc:dd:ee:ff:00:11-\>nd_tll])
1444 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
1445 table=1, icmp6,in_port=3,icmp_type=136 actions=load:0xa6badbfff00d59fa->NXM_NX_ND_TARGET[[0..63]],load:0xfe8086753097890a->NXM_NX_ND_TARGET[[64..127]],load:0xccddeeff0011->NXM_NX_ND_TLL[[]]
1446 table=1, ipv6,in_port=3 actions=load:0xa6badbfffefe59fa->NXM_NX_IPV6_SRC[[0..63]],load:0xfe8001234567890a->NXM_NX_IPV6_SRC[[64..127]]
1447 NXST_FLOW reply:
1448 ])
1449 OVS_VSWITCHD_STOP
1450 AT_CLEANUP
1451
1452 AT_SETUP([ofproto - basic flow_mod commands (OpenFlow 1.2)])
1453 OVS_VSWITCHD_START
1454 AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip], [0], [OFPST_FLOW reply (OF1.2):
1455 ])
1456 AT_CHECK([echo 'in_port=2,actions=1' | ovs-ofctl -O OpenFlow12 add-flows br0 -])
1457 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 in_port=1,actions=2])
1458 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 table=1,in_port=4,actions=3])
1459 AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0], [dnl
1460 in_port=1 actions=output:2
1461 in_port=2 actions=output:1
1462 table=1, in_port=4 actions=output:3
1463 OFPST_FLOW reply (OF1.2):
1464 ])
1465 AT_CHECK([ovs-ofctl -O OpenFlow12 del-flows br0])
1466 AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip], [0], [OFPST_FLOW reply (OF1.2):
1467 ])
1468 OVS_VSWITCHD_STOP
1469 AT_CLEANUP
1470
1471 AT_SETUP([ofproto - set-field flow_mod commands (OF1.2)])
1472 OVS_VSWITCHD_START
1473 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 ipv6,table=1,in_port=3,actions=drop])
1474 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 ipv6,table=1,in_port=3,actions=set_field:fe80:0123:4567:890a:a6ba:dbff:fefe:59fa-\>ipv6_src])
1475 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 icmp6,icmp_type=136,table=1,in_port=3,actions=set_field:fe80:8675:3097:890a:a6ba:dbff:f00d:59fa-\>nd_target,set_field:cc:dd:ee:ff:00:11-\>nd_tll])
1476 AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0], [dnl
1477 table=1, icmp6,in_port=3,icmp_type=136 actions=set_field:fe80:8675:3097:890a:a6ba:dbff:f00d:59fa->nd_target,set_field:cc:dd:ee:ff:00:11->nd_tll
1478 table=1, ipv6,in_port=3 actions=set_field:fe80:123:4567:890a:a6ba:dbff:fefe:59fa->ipv6_src
1479 OFPST_FLOW reply (OF1.2):
1480 ])
1481 OVS_VSWITCHD_STOP
1482 AT_CLEANUP
1483
1484 AT_SETUP([ofproto - dump flows with cookie])
1485 OVS_VSWITCHD_START
1486 AT_CHECK([ovs-ofctl add-flow br0 cookie=0x1,in_port=1,actions=1])
1487 AT_CHECK([ovs-ofctl add-flow br0 cookie=0x2,in_port=2,actions=1])
1488 AT_CHECK([ovs-ofctl add-flow br0 cookie=0x3,in_port=3,actions=1])
1489 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
1490 cookie=0x1, in_port=1 actions=output:1
1491 cookie=0x2, in_port=2 actions=output:1
1492 cookie=0x3, in_port=3 actions=output:1
1493 NXST_FLOW reply:
1494 ])
1495 AT_CHECK([ovs-ofctl dump-aggregate br0 table=0 | strip_xids], [0], [dnl
1496 NXST_AGGREGATE reply: packet_count=0 byte_count=0 flow_count=3
1497 ])
1498 AT_CHECK([ovs-ofctl dump-flows br0 cookie=0x3/-1 | ofctl_strip | sort], [0], [dnl
1499 cookie=0x3, in_port=3 actions=output:1
1500 NXST_FLOW reply:
1501 ])
1502 AT_CHECK([ovs-ofctl dump-aggregate br0 cookie=0x3/-1 | strip_xids], [0], [dnl
1503 NXST_AGGREGATE reply: packet_count=0 byte_count=0 flow_count=1
1504 ])
1505 OVS_VSWITCHD_STOP
1506 AT_CLEANUP
1507
1508 AT_SETUP([ofproto - mod flow with cookie change (OpenFlow 1.0)])
1509 OVS_VSWITCHD_START
1510 AT_CHECK([ovs-ofctl -F openflow10 add-flow br0 cookie=0x1,in_port=1,actions=1])
1511 AT_CHECK([ovs-ofctl -F openflow10 dump-flows br0 | ofctl_strip | sort], [0], [dnl
1512 cookie=0x1, in_port=1 actions=output:1
1513 OFPST_FLOW reply:
1514 ])
1515
1516 AT_CHECK([ovs-ofctl -F openflow10 mod-flows br0 cookie=0x2,in_port=1,actions=1])
1517 AT_CHECK([ovs-ofctl -F openflow10 dump-flows br0 | ofctl_strip | sort], [0], [dnl
1518 cookie=0x2, in_port=1 actions=output:1
1519 OFPST_FLOW reply:
1520 ])
1521 OVS_VSWITCHD_STOP
1522 AT_CLEANUP
1523
1524 AT_SETUP([ofproto - mod flow with cookie change (NXM)])
1525 OVS_VSWITCHD_START
1526 AT_CHECK([ovs-ofctl -F nxm add-flow br0 cookie=0x1,in_port=1,actions=1])
1527 AT_CHECK([ovs-ofctl -F nxm dump-flows br0 | ofctl_strip | sort], [0], [dnl
1528 cookie=0x1, in_port=1 actions=output:1
1529 NXST_FLOW reply:
1530 ])
1531
1532 AT_CHECK([ovs-ofctl -F nxm mod-flows br0 cookie=0x2,in_port=1,actions=1])
1533 AT_CHECK([ovs-ofctl -F nxm dump-flows br0 | ofctl_strip | sort], [0], [dnl
1534 cookie=0x2, in_port=1 actions=output:1
1535 NXST_FLOW reply:
1536 ])
1537 OVS_VSWITCHD_STOP
1538 AT_CLEANUP
1539
1540 AT_SETUP([ofproto - no mod flow with cookie change (OpenFlow 1.1)])
1541 OVS_VSWITCHD_START
1542 AT_CHECK([ovs-ofctl -O OpenFlow11 add-flow br0 cookie=0x1,in_port=1,actions=1])
1543 AT_CHECK([ovs-ofctl -O OpenFlow11 dump-flows br0 | ofctl_strip | sort], [0], [dnl
1544 cookie=0x1, in_port=1 actions=output:1
1545 OFPST_FLOW reply (OF1.1):
1546 ])
1547 AT_CHECK([ovs-ofctl -O OpenFlow11 mod-flows br0 cookie=0x2,in_port=1,actions=1])
1548 AT_CHECK([ovs-ofctl -O OpenFlow11 dump-flows br0 | ofctl_strip | sort], [0], [dnl
1549 cookie=0x1, in_port=1 actions=output:1
1550 OFPST_FLOW reply (OF1.1):
1551 ])
1552 OVS_VSWITCHD_STOP
1553 AT_CLEANUP
1554
1555 dnl The OpenFlow 1.2 spec states that the cookie may not be modified
1556 AT_SETUP([ofproto - no mod flow with cookie change (OpenFlow 1.2)])
1557 OVS_VSWITCHD_START
1558 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 cookie=0x1,in_port=1,actions=1])
1559 AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0], [dnl
1560 cookie=0x1, in_port=1 actions=output:1
1561 OFPST_FLOW reply (OF1.2):
1562 ])
1563
1564 AT_CHECK([ovs-ofctl -O OpenFlow12 mod-flows br0 cookie=0x2,in_port=1,actions=1])
1565 AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0], [dnl
1566 cookie=0x1, in_port=1 actions=output:1
1567 OFPST_FLOW reply (OF1.2):
1568 ])
1569 OVS_VSWITCHD_STOP
1570 AT_CLEANUP
1571
1572 AT_SETUP([ofproto - mod flows based on cookie mask (OpenFlow 1.0)])
1573 OVS_VSWITCHD_START
1574 AT_CHECK([ovs-ofctl add-flow br0 cookie=0x1,in_port=1,actions=1])
1575 AT_CHECK([ovs-ofctl add-flow br0 cookie=0x1,in_port=2,actions=1])
1576 AT_CHECK([ovs-ofctl add-flow br0 cookie=0x2,in_port=3,actions=1])
1577 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
1578 cookie=0x1, in_port=1 actions=output:1
1579 cookie=0x1, in_port=2 actions=output:1
1580 cookie=0x2, in_port=3 actions=output:1
1581 NXST_FLOW reply:
1582 ])
1583
1584 AT_CHECK([ovs-ofctl -F nxm mod-flows br0 cookie=0x1/0xff,actions=4])
1585 AT_CHECK([ovs-ofctl -F nxm dump-flows br0 | ofctl_strip | sort], [0], [dnl
1586 cookie=0x1, in_port=1 actions=output:4
1587 cookie=0x1, in_port=2 actions=output:4
1588 cookie=0x2, in_port=3 actions=output:1
1589 NXST_FLOW reply:
1590 ])
1591 OVS_VSWITCHD_STOP
1592 AT_CLEANUP
1593
1594 AT_SETUP([ofproto - mod flows based on cookie mask (OpenFlow 1.1)])
1595 OVS_VSWITCHD_START
1596 AT_CHECK([ovs-ofctl -O OpenFlow11 add-flow br0 cookie=0x1,in_port=1,actions=1])
1597 AT_CHECK([ovs-ofctl -O OpenFlow11 add-flow br0 cookie=0x1,in_port=2,actions=1])
1598 AT_CHECK([ovs-ofctl -O OpenFlow11 add-flow br0 cookie=0x2,in_port=3,actions=1])
1599 AT_CHECK([ovs-ofctl -O OpenFlow11 dump-flows br0 | ofctl_strip | sort], [0], [dnl
1600 cookie=0x1, in_port=1 actions=output:1
1601 cookie=0x1, in_port=2 actions=output:1
1602 cookie=0x2, in_port=3 actions=output:1
1603 OFPST_FLOW reply (OF1.1):
1604 ])
1605
1606 AT_CHECK([ovs-ofctl -O OpenFlow11 mod-flows br0 cookie=0x1/0xff,actions=4])
1607 AT_CHECK([ovs-ofctl -O OpenFlow11 dump-flows br0 | ofctl_strip | sort], [0], [dnl
1608 cookie=0x1, in_port=1 actions=output:4
1609 cookie=0x1, in_port=2 actions=output:4
1610 cookie=0x2, in_port=3 actions=output:1
1611 OFPST_FLOW reply (OF1.1):
1612 ])
1613 OVS_VSWITCHD_STOP
1614 AT_CLEANUP
1615
1616 AT_SETUP([ofproto - mod flows based on cookie mask (OpenFlow 1.2)])
1617 OVS_VSWITCHD_START
1618 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 cookie=0x1,in_port=1,actions=1])
1619 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 cookie=0x1,in_port=2,actions=1])
1620 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 cookie=0x2,in_port=3,actions=1])
1621 AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0], [dnl
1622 cookie=0x1, in_port=1 actions=output:1
1623 cookie=0x1, in_port=2 actions=output:1
1624 cookie=0x2, in_port=3 actions=output:1
1625 OFPST_FLOW reply (OF1.2):
1626 ])
1627
1628 AT_CHECK([ovs-ofctl -O OpenFlow12 mod-flows br0 cookie=0x1/0xff,actions=4])
1629 AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0], [dnl
1630 cookie=0x1, in_port=1 actions=output:4
1631 cookie=0x1, in_port=2 actions=output:4
1632 cookie=0x2, in_port=3 actions=output:1
1633 OFPST_FLOW reply (OF1.2):
1634 ])
1635 OVS_VSWITCHD_STOP
1636 AT_CLEANUP
1637
1638 dnl The OpenFlow 1.2 spec states that the cookie may not be modified
1639 AT_SETUP([ofproto - mod flows based on cookie mask with cookie change])
1640 OVS_VSWITCHD_START
1641 AT_CHECK([ovs-ofctl add-flow br0 cookie=0x1,in_port=1,actions=1])
1642 AT_CHECK([ovs-ofctl add-flow br0 cookie=0x1,in_port=2,actions=1])
1643 AT_CHECK([ovs-ofctl add-flow br0 cookie=0x2,in_port=3,actions=1])
1644 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
1645 cookie=0x1, in_port=1 actions=output:1
1646 cookie=0x1, in_port=2 actions=output:1
1647 cookie=0x2, in_port=3 actions=output:1
1648 NXST_FLOW reply:
1649 ])
1650
1651 AT_CHECK([ovs-ofctl -F nxm mod-flows br0 cookie=1/-1,cookie=4,actions=4])
1652 AT_CHECK([ovs-ofctl -F nxm dump-flows br0 | ofctl_strip | sort], [0], [dnl
1653 cookie=0x2, in_port=3 actions=output:1
1654 cookie=0x4, in_port=1 actions=output:4
1655 cookie=0x4, in_port=2 actions=output:4
1656 NXST_FLOW reply:
1657 ])
1658 OVS_VSWITCHD_STOP
1659 AT_CLEANUP
1660
1661 AT_SETUP([ofproto - mod flow with cookie miss (mask==0) - NXM])
1662 OVS_VSWITCHD_START
1663 AT_CHECK([ovs-ofctl -F nxm mod-flows br0 in_port=1,actions=1])
1664 AT_CHECK([ovs-ofctl -F nxm dump-flows br0 | ofctl_strip | sort], [0], [dnl
1665 in_port=1 actions=output:1
1666 NXST_FLOW reply:
1667 ])
1668 OVS_VSWITCHD_STOP
1669 AT_CLEANUP
1670
1671 AT_SETUP([ofproto - mod flow with cookie miss (mask==0) - OF1.1])
1672 OVS_VSWITCHD_START
1673 AT_CHECK([ovs-ofctl -O openflow11 mod-flows br0 in_port=1,actions=1])
1674 AT_CHECK([ovs-ofctl -O openflow11 dump-flows br0 | ofctl_strip | sort], [0], [dnl
1675 in_port=1 actions=output:1
1676 OFPST_FLOW reply (OF1.1):
1677 ])
1678 OVS_VSWITCHD_STOP
1679 AT_CLEANUP
1680
1681 AT_SETUP([ofproto - mod flow with cookie miss (mask==0) - OF1.2])
1682 OVS_VSWITCHD_START
1683 AT_CHECK([ovs-ofctl -O openflow12 mod-flows br0 in_port=1,actions=1])
1684 AT_CHECK([ovs-ofctl -O openflow12 dump-flows br0 | ofctl_strip | sort], [0], [dnl
1685 OFPST_FLOW reply (OF1.2):
1686 ])
1687 OVS_VSWITCHD_STOP
1688 AT_CLEANUP
1689
1690 AT_SETUP([ofproto - mod flow with cookie miss (mask!=0) - NXM])
1691 OVS_VSWITCHD_START
1692 AT_CHECK([ovs-ofctl -F nxm mod-flows br0 cookie=1/1,in_port=1,actions=1])
1693 AT_CHECK([ovs-ofctl -F nxm dump-flows br0 | ofctl_strip | sort], [0], [dnl
1694 NXST_FLOW reply:
1695 ])
1696 OVS_VSWITCHD_STOP
1697 AT_CLEANUP
1698
1699 AT_SETUP([ofproto - mod flow with cookie miss (mask!=0) - OF1.1])
1700 OVS_VSWITCHD_START
1701 AT_CHECK([ovs-ofctl -O openflow11 mod-flows br0 cookie=1/1,in_port=1,actions=1])
1702 AT_CHECK([ovs-ofctl -O openflow11 dump-flows br0 | ofctl_strip | sort], [0], [dnl
1703 OFPST_FLOW reply (OF1.1):
1704 ])
1705 OVS_VSWITCHD_STOP
1706 AT_CLEANUP
1707
1708 AT_SETUP([ofproto - mod flow with cookie miss (mask!=0) - OF1.2])
1709 OVS_VSWITCHD_START
1710 AT_CHECK([ovs-ofctl -O openflow12 mod-flows br0 cookie=1/1,in_port=1,actions=1])
1711 AT_CHECK([ovs-ofctl -O openflow12 dump-flows br0 | ofctl_strip | sort], [0], [dnl
1712 OFPST_FLOW reply (OF1.2):
1713 ])
1714 OVS_VSWITCHD_STOP
1715 AT_CLEANUP
1716
1717 AT_SETUP([ofproto - del flows with cookies])
1718 OVS_VSWITCHD_START
1719 AT_CHECK([ovs-ofctl add-flow br0 cookie=0x1,in_port=1,actions=1])
1720 AT_CHECK([ovs-ofctl add-flow br0 cookie=0x2,in_port=2,actions=1])
1721 AT_CHECK([ovs-ofctl add-flow br0 cookie=0x3,in_port=3,actions=1])
1722 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
1723 cookie=0x1, in_port=1 actions=output:1
1724 cookie=0x2, in_port=2 actions=output:1
1725 cookie=0x3, in_port=3 actions=output:1
1726 NXST_FLOW reply:
1727 ])
1728
1729 AT_CHECK([ovs-ofctl del-flows br0])
1730 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
1731 NXST_FLOW reply:
1732 ])
1733 OVS_VSWITCHD_STOP
1734 AT_CLEANUP
1735
1736 AT_SETUP([ofproto - del flows based on cookie])
1737 OVS_VSWITCHD_START
1738 AT_CHECK([ovs-ofctl add-flow br0 cookie=0x1,in_port=1,actions=1])
1739 AT_CHECK([ovs-ofctl add-flow br0 cookie=0x2,in_port=2,actions=1])
1740 AT_CHECK([ovs-ofctl add-flow br0 cookie=0x3,in_port=3,actions=1])
1741 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
1742 cookie=0x1, in_port=1 actions=output:1
1743 cookie=0x2, in_port=2 actions=output:1
1744 cookie=0x3, in_port=3 actions=output:1
1745 NXST_FLOW reply:
1746 ])
1747
1748 AT_CHECK([ovs-ofctl del-flows br0 cookie=0x3/-1])
1749 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
1750 cookie=0x1, in_port=1 actions=output:1
1751 cookie=0x2, in_port=2 actions=output:1
1752 NXST_FLOW reply:
1753 ])
1754 OVS_VSWITCHD_STOP
1755 AT_CLEANUP
1756
1757 AT_SETUP([ofproto - del flows based on cookie mask])
1758 OVS_VSWITCHD_START
1759 AT_CHECK([ovs-ofctl add-flow br0 cookie=0x1,in_port=1,actions=1])
1760 AT_CHECK([ovs-ofctl add-flow br0 cookie=0x2,in_port=2,actions=1])
1761 AT_CHECK([ovs-ofctl add-flow br0 cookie=0x3,in_port=3,actions=1])
1762 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
1763 cookie=0x1, in_port=1 actions=output:1
1764 cookie=0x2, in_port=2 actions=output:1
1765 cookie=0x3, in_port=3 actions=output:1
1766 NXST_FLOW reply:
1767 ])
1768 AT_CHECK([ovs-ofctl del-flows br0 cookie=0x3/0x1])
1769 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
1770 cookie=0x2, in_port=2 actions=output:1
1771 NXST_FLOW reply:
1772 ])
1773 OVS_VSWITCHD_STOP
1774 AT_CLEANUP
1775
1776 AT_SETUP([ofproto - del flows based on table id (NXM)])
1777 OVS_VSWITCHD_START
1778 AT_CHECK([ovs-ofctl add-flow br0 cookie=0x1,in_port=1,actions=1])
1779 AT_CHECK([ovs-ofctl add-flow br0 cookie=0x2,in_port=2,table=1,actions=1])
1780 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
1781 cookie=0x1, in_port=1 actions=output:1
1782 cookie=0x2, table=1, in_port=2 actions=output:1
1783 NXST_FLOW reply:
1784 ])
1785 AT_CHECK([ovs-ofctl del-flows br0 table=0])
1786 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
1787 cookie=0x2, table=1, in_port=2 actions=output:1
1788 NXST_FLOW reply:
1789 ])
1790 AT_CHECK([ovs-ofctl del-flows br0 table=1])
1791 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
1792 NXST_FLOW reply:
1793 ])
1794 AT_CHECK([ovs-ofctl add-flow br0 cookie=0x1,in_port=1,actions=1])
1795 AT_CHECK([ovs-ofctl add-flow br0 cookie=0x2,in_port=2,table=1,actions=1])
1796 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
1797 cookie=0x1, in_port=1 actions=output:1
1798 cookie=0x2, table=1, in_port=2 actions=output:1
1799 NXST_FLOW reply:
1800 ])
1801 AT_CHECK([ovs-ofctl del-flows br0])
1802 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
1803 NXST_FLOW reply:
1804 ])
1805 OVS_VSWITCHD_STOP
1806 AT_CLEANUP
1807
1808 AT_SETUP([ofproto - del flows based on table id (OpenFlow 1.1)])
1809 OVS_VSWITCHD_START
1810 AT_CHECK([ovs-ofctl -O OpenFlow11 add-flow br0 cookie=0x1,in_port=1,actions=1])
1811 AT_CHECK([ovs-ofctl -O OpenFlow11 add-flow br0 cookie=0x2,in_port=2,table=1,actions=1])
1812 AT_CHECK([ovs-ofctl -O OpenFlow11 dump-flows br0 | ofctl_strip | sort], [0], [dnl
1813 cookie=0x1, in_port=1 actions=output:1
1814 cookie=0x2, table=1, in_port=2 actions=output:1
1815 OFPST_FLOW reply (OF1.1):
1816 ])
1817 AT_CHECK([ovs-ofctl -O OpenFlow11 del-flows br0 table=0])
1818 AT_CHECK([ovs-ofctl -O OpenFlow11 dump-flows br0 | ofctl_strip | sort], [0], [dnl
1819 cookie=0x2, table=1, in_port=2 actions=output:1
1820 OFPST_FLOW reply (OF1.1):
1821 ])
1822 AT_CHECK([ovs-ofctl -O OpenFlow11 del-flows br0 table=1])
1823 AT_CHECK([ovs-ofctl -O OpenFlow11 dump-flows br0 | ofctl_strip | sort], [0], [dnl
1824 OFPST_FLOW reply (OF1.1):
1825 ])
1826 AT_CHECK([ovs-ofctl -O OpenFlow11 add-flow br0 cookie=0x1,in_port=1,actions=1])
1827 AT_CHECK([ovs-ofctl -O OpenFlow11 add-flow br0 cookie=0x2,in_port=2,table=1,actions=1])
1828 AT_CHECK([ovs-ofctl -O OpenFlow11 dump-flows br0 | ofctl_strip | sort], [0], [dnl
1829 cookie=0x1, in_port=1 actions=output:1
1830 cookie=0x2, table=1, in_port=2 actions=output:1
1831 OFPST_FLOW reply (OF1.1):
1832 ])
1833 AT_CHECK([ovs-ofctl -O OpenFlow11 del-flows br0])
1834 AT_CHECK([ovs-ofctl -O OpenFlow11 dump-flows br0 | ofctl_strip], [0], [dnl
1835 OFPST_FLOW reply (OF1.1):
1836 cookie=0x2, table=1, in_port=2 actions=output:1
1837 ])
1838 OVS_VSWITCHD_STOP
1839 AT_CLEANUP
1840
1841 AT_SETUP([ofproto - del flows based on table id (OpenFlow 1.2)])
1842 OVS_VSWITCHD_START
1843 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 cookie=0x1,in_port=1,actions=1])
1844 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 cookie=0x2,in_port=2,table=1,actions=1])
1845 AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0], [dnl
1846 cookie=0x1, in_port=1 actions=output:1
1847 cookie=0x2, table=1, in_port=2 actions=output:1
1848 OFPST_FLOW reply (OF1.2):
1849 ])
1850 AT_CHECK([ovs-ofctl -O OpenFlow12 del-flows br0 table=0])
1851 AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0], [dnl
1852 cookie=0x2, table=1, in_port=2 actions=output:1
1853 OFPST_FLOW reply (OF1.2):
1854 ])
1855 AT_CHECK([ovs-ofctl -O OpenFlow12 del-flows br0 table=1])
1856 AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0], [dnl
1857 OFPST_FLOW reply (OF1.2):
1858 ])
1859 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 cookie=0x1,in_port=1,actions=1])
1860 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 cookie=0x2,in_port=2,table=1,actions=1])
1861 AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0], [dnl
1862 cookie=0x1, in_port=1 actions=output:1
1863 cookie=0x2, table=1, in_port=2 actions=output:1
1864 OFPST_FLOW reply (OF1.2):
1865 ])
1866 AT_CHECK([ovs-ofctl -O OpenFlow12 del-flows br0])
1867 AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0], [dnl
1868 OFPST_FLOW reply (OF1.2):
1869 ])
1870 OVS_VSWITCHD_STOP
1871 AT_CLEANUP
1872
1873 AT_SETUP([ofproto - flow_mod with out_port matching (OpenFlow 1.0)])
1874 OVS_VSWITCHD_START
1875 AT_DATA([flows.txt], [dnl
1876 in_port=1 actions=output:2
1877 in_port=2 actions=output:1,output:2,output:3
1878 in_port=3 actions=output:3,output:1,output:2
1879 in_port=4 actions=drop
1880 in_port=5 actions=output:3
1881 in_port=6 actions=output:1
1882 ])
1883 AT_CHECK([ovs-ofctl -F openflow10 add-flows br0 flows.txt])
1884 (cat flows.txt; echo 'OFPST_FLOW reply:') > expout
1885 AT_CHECK([ovs-ofctl -F openflow10 dump-flows br0 | ofctl_strip | sort], [0],
1886 [expout])
1887
1888 (grep 'output:2' flows.txt; echo 'OFPST_FLOW reply:') > expout
1889 AT_CHECK([ovs-ofctl -F openflow10 dump-flows br0 out_port=2 | ofctl_strip | sort], [0], [expout])
1890
1891 AT_CHECK([ovs-ofctl -F openflow10 del-flows br0 out_port=2])
1892 (grep -v 'output:2' flows.txt; echo 'OFPST_FLOW reply:') > expout
1893 AT_CHECK([ovs-ofctl -F openflow10 dump-flows br0 | ofctl_strip | sort], [0],
1894 [expout])
1895
1896 AT_CHECK([ovs-ofctl -F openflow10 del-flows br0 out_port=3])
1897 (grep -v 'output:[[23]]' flows.txt; echo 'OFPST_FLOW reply:') > expout
1898 AT_CHECK([ovs-ofctl -F openflow10 dump-flows br0 | ofctl_strip | sort], [0],
1899 [expout])
1900
1901 AT_CHECK([ovs-ofctl -F openflow10 del-flows br0 out_port=1])
1902 (grep -v 'output:[[123]]' flows.txt; echo 'OFPST_FLOW reply:') > expout
1903 AT_CHECK([ovs-ofctl -F openflow10 dump-flows br0 | ofctl_strip | sort], [0],
1904 [expout])
1905
1906 OVS_VSWITCHD_STOP
1907 AT_CLEANUP
1908
1909 AT_SETUP([ofproto - flow_mod with out_port matching (OpenFlow 1.1)])
1910 OVS_VSWITCHD_START
1911 AT_DATA([flows.txt], [dnl
1912 in_port=1 actions=output:2
1913 in_port=2 actions=output:1,write_actions(output:2,output:3)
1914 in_port=3 actions=output:3,output:1,write_actions(output:2)
1915 in_port=4 actions=drop
1916 in_port=5 actions=write_actions(output:3)
1917 in_port=6 actions=output:1
1918 ])
1919 AT_CHECK([ovs-ofctl -O OpenFlow11 add-flows br0 flows.txt])
1920 (cat flows.txt; echo 'OFPST_FLOW reply (OF1.1):') > expout
1921 AT_CHECK([ovs-ofctl -O OpenFlow11 dump-flows br0 | ofctl_strip | sort], [0],
1922 [expout])
1923
1924 (grep 'output:2' flows.txt; echo 'OFPST_FLOW reply (OF1.1):') > expout
1925 AT_CHECK([ovs-ofctl -O OpenFlow11 dump-flows br0 out_port=2 | ofctl_strip | sort], [0], [expout])
1926
1927 AT_CHECK([ovs-ofctl -O OpenFlow11 del-flows br0 out_port=2])
1928 (grep -v 'output:2' flows.txt; echo 'OFPST_FLOW reply (OF1.1):') > expout
1929 AT_CHECK([ovs-ofctl -O OpenFlow11 dump-flows br0 | ofctl_strip | sort], [0],
1930 [expout])
1931
1932 AT_CHECK([ovs-ofctl -O OpenFlow11 del-flows br0 out_port=3])
1933 (grep -v 'output:[[23]]' flows.txt; echo 'OFPST_FLOW reply (OF1.1):') > expout
1934 AT_CHECK([ovs-ofctl -O OpenFlow11 dump-flows br0 | ofctl_strip | sort], [0],
1935 [expout])
1936
1937 AT_CHECK([ovs-ofctl -O OpenFlow11 del-flows br0 out_port=1])
1938 (grep -v 'output:[[123]]' flows.txt; echo 'OFPST_FLOW reply (OF1.1):') > expout
1939 AT_CHECK([ovs-ofctl -O OpenFlow11 dump-flows br0 | ofctl_strip | sort], [0],
1940 [expout])
1941
1942 OVS_VSWITCHD_STOP
1943 AT_CLEANUP
1944
1945 AT_SETUP([ofproto - flow_mod with out_group matching (OpenFlow 1.1)])
1946 OVS_VSWITCHD_START
1947 AT_DATA([groups.txt], [dnl
1948 group_id=1,type=all,bucket=output:10
1949 group_id=2,type=all,bucket=output:10
1950 group_id=3,type=all,bucket=output:10
1951 ])
1952 AT_CHECK([ovs-ofctl -O OpenFlow11 add-groups br0 groups.txt])
1953 AT_DATA([flows.txt], [dnl
1954 in_port=1 actions=group:2,output:5
1955 in_port=2 actions=group:1,write_actions(group:2,group:3,output:6)
1956 in_port=3 actions=group:3,group:1,write_actions(group:2,output:3)
1957 in_port=4 actions=output:4
1958 in_port=5 actions=write_actions(output:4,group:3)
1959 in_port=6 actions=group:1
1960 ])
1961 AT_CHECK([ovs-ofctl -O OpenFlow11 add-flows br0 flows.txt])
1962 (cat flows.txt; echo 'OFPST_FLOW reply (OF1.1):') > expout
1963 AT_CHECK([ovs-ofctl -O OpenFlow11 dump-flows br0 | ofctl_strip | sort], [0],
1964 [expout])
1965
1966 (grep 'output:3' flows.txt | grep 'group:2'; echo 'OFPST_FLOW reply (OF1.1):') > expout
1967 AT_CHECK([ovs-ofctl -O OpenFlow11 dump-flows br0 out_port=3,out_group=2 | ofctl_strip | sort], [0], [expout])
1968
1969 AT_CHECK([ovs-ofctl -O OpenFlow11 del-flows br0 out_group=2])
1970 (grep -v 'group:2' flows.txt; echo 'OFPST_FLOW reply (OF1.1):') > expout
1971 AT_CHECK([ovs-ofctl -O OpenFlow11 dump-flows br0 | ofctl_strip | sort], [0],
1972 [expout])
1973
1974 AT_CHECK([ovs-ofctl -O OpenFlow11 del-flows br0 out_group=3])
1975 (grep -v 'group:[[23]]' flows.txt; echo 'OFPST_FLOW reply (OF1.1):') > expout
1976 AT_CHECK([ovs-ofctl -O OpenFlow11 dump-flows br0 | ofctl_strip | sort], [0],
1977 [expout])
1978
1979 AT_CHECK([ovs-ofctl -O OpenFlow11 del-flows br0 out_group=1])
1980 (grep -v 'group:[[123]]' flows.txt; echo 'OFPST_FLOW reply (OF1.1):') > expout
1981 AT_CHECK([ovs-ofctl -O OpenFlow11 dump-flows br0 | ofctl_strip | sort], [0],
1982 [expout])
1983
1984 OVS_VSWITCHD_STOP
1985 AT_CLEANUP
1986
1987 AT_SETUP([ofproto - bundle flow_mod with out group matching (OpenFlow 1.4)])
1988 OVS_VSWITCHD_START
1989 AT_DATA([bundle.txt], [dnl
1990 group group_id=1,type=all,bucket=output:10
1991 group group_id=2,type=all,bucket=output:10
1992 group group_id=3,type=all,bucket=output:10
1993 flow in_port=1 actions=group:2,output:5
1994 flow in_port=2 actions=group:1,write_actions(group:2,group:3,output:6)
1995 flow in_port=3 actions=group:3,group:1,write_actions(group:2,output:3)
1996 flow in_port=4 actions=output:4
1997 flow in_port=5 actions=write_actions(output:4,group:3)
1998 flow in_port=6 actions=group:1
1999 ])
2000 AT_CHECK([ovs-ofctl bundle br0 bundle.txt])
2001
2002 # for checking
2003 AT_DATA([flows.txt], [dnl
2004 in_port=1 actions=group:2,output:5
2005 in_port=2 actions=group:1,write_actions(group:2,group:3,output:6)
2006 in_port=3 actions=group:3,group:1,write_actions(group:2,output:3)
2007 in_port=4 actions=output:4
2008 in_port=5 actions=write_actions(output:4,group:3)
2009 in_port=6 actions=group:1
2010 ])
2011
2012 (cat flows.txt; echo 'OFPST_FLOW reply (OF1.4):') > expout
2013 AT_CHECK([ovs-ofctl -O OpenFlow14 dump-flows br0 | ofctl_strip | sort], [0],
2014 [expout])
2015
2016 (grep 'output:3' flows.txt | grep 'group:2'; echo 'OFPST_FLOW reply (OF1.4):') > expout
2017 AT_CHECK([ovs-ofctl -O OpenFlow14 dump-flows br0 out_port=3,out_group=2 | ofctl_strip | sort], [0], [expout])
2018
2019 AT_CHECK([ovs-ofctl -O OpenFlow14 del-flows br0 out_group=2])
2020 (grep -v 'group:2' flows.txt; echo 'OFPST_FLOW reply (OF1.4):') > expout
2021 AT_CHECK([ovs-ofctl -O OpenFlow14 dump-flows br0 | ofctl_strip | sort], [0],
2022 [expout])
2023
2024 AT_CHECK([ovs-ofctl -O OpenFlow14 del-flows br0 out_group=3])
2025 (grep -v 'group:[[23]]' flows.txt; echo 'OFPST_FLOW reply (OF1.4):') > expout
2026 AT_CHECK([ovs-ofctl -O OpenFlow14 dump-flows br0 | ofctl_strip | sort], [0],
2027 [expout])
2028
2029 AT_CHECK([ovs-ofctl -O OpenFlow14 del-flows br0 out_group=1])
2030 (grep -v 'group:[[123]]' flows.txt; echo 'OFPST_FLOW reply (OF1.4):') > expout
2031 AT_CHECK([ovs-ofctl -O OpenFlow14 dump-flows br0 | ofctl_strip | sort], [0],
2032 [expout])
2033
2034 OVS_VSWITCHD_STOP
2035 AT_CLEANUP
2036
2037 AT_SETUP([ofproto - bundle packet-out (OpenFlow 1.4)])
2038 OVS_VSWITCHD_START
2039
2040 ovs-ofctl del-flows br0
2041 ovs-ofctl add-flow br0 priority=0,actions=drop
2042
2043 # Start a monitor listening for packet-ins.
2044 AT_CHECK([ovs-ofctl -P standard monitor br0 --detach --no-chdir --pidfile])
2045 ovs-appctl -t ovs-ofctl ofctl/send 0109000c0123456700000080
2046 ovs-appctl -t ovs-ofctl ofctl/barrier
2047 ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
2048 AT_CAPTURE_FILE([monitor.log])
2049
2050 # This bundle adds a group, a flow using that group and then a
2051 # packet-out that needs them both. Finally the bundle deletes all
2052 # groups, which also deletes the flow, leaving only the drop flow in
2053 # the table. If this works properly, the packet-out should get
2054 # translated and processed before the flow disappears. Also, if the
2055 # bundle were to fail, the packet-in should not get executed.
2056 AT_DATA([bundle.txt], [dnl
2057 group group_id=1,type=all,bucket=output:controller
2058 flow in_port=6 actions=group:1
2059 packet-out in_port=6, packet=0001020304050010203040501234 actions=table
2060 group delete
2061 ])
2062 AT_CHECK([ovs-ofctl bundle br0 bundle.txt])
2063
2064 # Verify that only the drop flow remains.
2065 AT_CHECK([ovs-ofctl -O OpenFlow14 dump-flows br0 | ofctl_strip | sort], [0],
2066 [ reset_counts priority=0 actions=drop
2067 OFPST_FLOW reply (OF1.4):
2068 ])
2069
2070 # Verify that the packet-in was received via controller action.
2071 AT_CHECK([sed 's/ (xid=0x[[1-9a-fA-F]][[0-9a-fA-F]]*)//' monitor.log], [0],
2072 [OFPT_PACKET_IN (xid=0x0): total_len=14 in_port=6 (via action) data_len=14 (unbuffered)
2073 vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x1234
2074 ])
2075
2076 OVS_VSWITCHD_STOP
2077 AT_CLEANUP
2078
2079 AT_SETUP([ofproto - bundle packet-out, failing bundle commit (OpenFlow 1.4)])
2080 OVS_VSWITCHD_START
2081
2082 ovs-ofctl del-flows br0
2083 ovs-ofctl add-flow br0 priority=0,actions=drop
2084
2085 # Start a monitor listening for packet-ins.
2086 AT_CHECK([ovs-ofctl -P standard monitor br0 --detach --no-chdir --pidfile])
2087 ovs-appctl -t ovs-ofctl ofctl/send 0109000c0123456700000080
2088 ovs-appctl -t ovs-ofctl ofctl/barrier
2089 ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
2090 AT_CAPTURE_FILE([monitor.log])
2091
2092 # This bundle adds a flow using that group and then a packet-out that
2093 # needs them both. Finally the bundle adds another flow that referes
2094 # to a non-existing group, causing the bundle to fail, and the
2095 # packet-in should not get executed.
2096 AT_DATA([bundle.txt], [dnl
2097 group group_id=1,type=all,bucket=output:controller
2098 flow in_port=6 actions=group:1
2099 packet-out in_port=6, packet=0001020304050010203040501234 actions=table
2100 flow in_port=7 actions=group:2
2101 ])
2102 AT_CHECK([ovs-ofctl bundle br0 bundle.txt 2>&1 | sed '/talking to/,$d' | strip_xids], [], [dnl
2103 Error OFPBAC_BAD_OUT_GROUP for: OFPT_FLOW_MOD (OF1.4): ADD in_port=7 actions=group:2
2104 Error OFPBFC_MSG_FAILED for: OFPT_BUNDLE_CONTROL (OF1.4):
2105 bundle_id=0 type=COMMIT_REQUEST flags=atomic ordered
2106 ])
2107
2108 # Verify that only the drop flow remains.
2109 AT_CHECK([ovs-ofctl -O OpenFlow14 dump-flows br0 | ofctl_strip | sort], [0],
2110 [ reset_counts priority=0 actions=drop
2111 OFPST_FLOW reply (OF1.4):
2112 ])
2113
2114 # Verify that the packet-in was NOT received via controller action.
2115 AT_CHECK([strip_xids < monitor.log], [0], [])
2116
2117 OVS_VSWITCHD_STOP
2118 AT_CLEANUP
2119
2120 AT_SETUP([ofproto - bundle packet-out makes bundle commit to fail(OpenFlow 1.4)])
2121 OVS_VSWITCHD_START
2122
2123 ovs-ofctl del-flows br0
2124 ovs-ofctl add-flow br0 priority=0,actions=drop
2125
2126 # Start a monitor listening for packet-ins.
2127 AT_CHECK([ovs-ofctl -P standard monitor br0 --detach --no-chdir --pidfile])
2128 ovs-appctl -t ovs-ofctl ofctl/send 0109000c0123456700000080
2129 ovs-appctl -t ovs-ofctl ofctl/barrier
2130 ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
2131 AT_CAPTURE_FILE([monitor.log])
2132
2133 # This bundle adds a flow using that group and then a packet-out that
2134 # needs them both. Finally the bundle adds another flow that referes
2135 # to a non-existing group, causing the bundle to fail, and the
2136 # packet-in should not get executed.
2137 AT_DATA([bundle.txt], [dnl
2138 group group_id=1,type=all,bucket=output:controller
2139 flow in_port=6 actions=group:1
2140 packet-out in_port=6, packet=0001020304050010203040501234 actions=table
2141 packet-out in_port=6, packet=0001020304050010203040501234 actions=group:2
2142 ])
2143 AT_CHECK([ovs-ofctl bundle br0 bundle.txt 2>&1 | sed '/talking to/,$d' | strip_xids], [], [dnl
2144 Error OFPBAC_BAD_OUT_GROUP for: OFPT_PACKET_OUT (OF1.4): in_port=6 actions=group:2 data_len=14
2145 vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x1234
2146 Error OFPBFC_MSG_FAILED for: OFPT_BUNDLE_CONTROL (OF1.4):
2147 bundle_id=0 type=COMMIT_REQUEST flags=atomic ordered
2148 ])
2149
2150 # Verify that only the drop flow remains.
2151 AT_CHECK([ovs-ofctl -O OpenFlow14 dump-flows br0 | ofctl_strip | sort], [0],
2152 [ reset_counts priority=0 actions=drop
2153 OFPST_FLOW reply (OF1.4):
2154 ])
2155
2156 # Verify that the packet-in was NOT received via controller action.
2157 AT_CHECK([strip_xids < monitor.log], [0], [])
2158
2159 OVS_VSWITCHD_STOP
2160 AT_CLEANUP
2161
2162 AT_SETUP([ofproto - flow table configuration (OpenFlow 1.0)])
2163 OVS_VSWITCHD_START
2164 # Check the default configuration.
2165 head_table() {
2166 printf 'OFPST_TABLE reply (xid=0x2):
2167 table 0 ("%s"):
2168 active=0, lookup=0, matched=0
2169 max_entries=1000000
2170 matching:
2171 in_port: exact match or wildcard
2172 eth_src: exact match or wildcard
2173 eth_dst: exact match or wildcard
2174 eth_type: exact match or wildcard
2175 vlan_vid: exact match or wildcard
2176 vlan_pcp: exact match or wildcard
2177 ip_src: exact match or wildcard
2178 ip_dst: exact match or wildcard
2179 nw_proto: exact match or wildcard
2180 nw_tos: exact match or wildcard
2181 tcp_src: exact match or wildcard
2182 tcp_dst: exact match or wildcard
2183
2184 ' $1
2185 }
2186 ditto() {
2187 for i in `seq $1 $2`; do
2188 printf ' table %d ("table%d"): ditto\n' $i $i
2189 done
2190 }
2191 (head_table classifier; ditto 1 253) > expout
2192 AT_CHECK([ovs-ofctl dump-tables br0], [0], [expout])
2193 # Change the configuration.
2194 AT_CHECK(
2195 [ovs-vsctl \
2196 -- --id=@t0 create Flow_Table name=main \
2197 -- --id=@t1 create Flow_Table flow-limit=1024 \
2198 -- set bridge br0 'flow_tables={1=@t1,0=@t0}' \
2199 | uuidfilt],
2200 [0], [<0>
2201 <1>
2202 ])
2203 # Check that the configuration was updated.
2204 (head_table main; echo ' table 1 ("table1"):
2205 active=0, lookup=0, matched=0
2206 max_entries=1024
2207 (same matching)
2208
2209 table 2 ("table2"):
2210 active=0, lookup=0, matched=0
2211 max_entries=1000000
2212 (same matching)
2213 '; ditto 3 253) > expout
2214 AT_CHECK([ovs-ofctl dump-tables br0], [0], [expout])
2215 OVS_VSWITCHD_STOP
2216 AT_CLEANUP
2217
2218 dnl In-band and fail-open add "hidden rules" to table 0. These rules shouldn't
2219 dnl be visible to OpenFlow. This test checks that "dump-flows" and
2220 dnl "dump-tables" don't make them visible.
2221 AT_SETUP([ofproto - hidden rules not in table stats])
2222 # Use an IP address for a controller that won't actually exist: we
2223 # want to create in-band rules but we do not want to actually connect
2224 # to a controller (because that could mess about with our test). The
2225 # Class E range 240.0.0.0 - 255.255.255.255 seems like a good choice.
2226 OVS_VSWITCHD_START([set-controller br0 tcp:240.0.0.1:6653])
2227 for i in 1 2 3 4 5; do ovs-appctl time/warp 1000; done
2228
2229 # Check that no hidden flows are visible in OpenFlow.
2230 AT_CHECK([ovs-ofctl dump-flows br0 | strip_xids], [0], [NXST_FLOW reply:
2231 ])
2232
2233 # Check that some hidden flows related to 240.0.0.1 are actually in table 0.
2234 #
2235 # We discard flows that mention table_id because we only want table 0 flows,
2236 # which in OVS is implied by the absence of a table_id.
2237 AT_CHECK([ovs-appctl bridge/dump-flows br0], [0], [stdout])
2238 AT_CHECK([test `grep '240\.0\.0\.1' stdout | grep -v table_id= | wc -l` -gt 0])
2239
2240 # Check that dump-tables doesn't count the hidden flows.
2241 head_table() {
2242 printf 'OFPST_TABLE reply:
2243 table 0 ("%s"):
2244 active=0, lookup=0, matched=0
2245 max_entries=1000000
2246 matching:
2247 in_port: exact match or wildcard
2248 eth_src: exact match or wildcard
2249 eth_dst: exact match or wildcard
2250 eth_type: exact match or wildcard
2251 vlan_vid: exact match or wildcard
2252 vlan_pcp: exact match or wildcard
2253 ip_src: exact match or wildcard
2254 ip_dst: exact match or wildcard
2255 nw_proto: exact match or wildcard
2256 nw_tos: exact match or wildcard
2257 tcp_src: exact match or wildcard
2258 tcp_dst: exact match or wildcard
2259
2260 ' $1
2261 }
2262 ditto() {
2263 for i in `seq $1 $2`; do
2264 printf ' table %d ("table%d"): ditto\n' $i $i
2265 done
2266 }
2267 (head_table classifier; ditto 1 253) > expout
2268 AT_CHECK([ovs-ofctl dump-tables br0 | strip_xids], [0], [expout])
2269 OVS_VSWITCHD_STOP(["/240\.0\.0\.1/d"])
2270 AT_CLEANUP
2271
2272 AT_SETUP([ofproto - flow table configuration (OpenFlow 1.2)])
2273 OVS_VSWITCHD_START
2274 # Check the default configuration.
2275 head_table() {
2276 printf 'OFPST_TABLE reply (OF1.2) (xid=0x2):
2277 table 0 ("%s"):
2278 active=0, lookup=0, matched=0
2279 metadata: match=0xffffffffffffffff write=0xffffffffffffffff
2280 config=controller
2281 max_entries=1000000
2282 instructions (table miss and others):
2283 instructions: apply_actions,clear_actions,write_actions,write_metadata,goto_table
2284 Write-Actions and Apply-Actions features:
2285 actions: output group set_field strip_vlan push_vlan mod_nw_ttl dec_ttl set_mpls_ttl dec_mpls_ttl push_mpls pop_mpls set_queue
2286 supported on Set-Field: metadata in_port_oxm eth_src eth_dst vlan_vid vlan_pcp mpls_label mpls_tc ip_src ip_dst ipv6_src ipv6_dst ipv6_label ip_dscp nw_ecn arp_op arp_spa arp_tpa arp_sha arp_tha tcp_src tcp_dst udp_src udp_dst sctp_src sctp_dst icmp_type icmp_code icmpv6_type icmpv6_code nd_target nd_sll nd_tll
2287 matching:
2288 metadata: exact match or wildcard
2289 in_port_oxm: exact match or wildcard
2290 eth_src: exact match or wildcard
2291 eth_dst: exact match or wildcard
2292 eth_type: exact match or wildcard
2293 vlan_vid: exact match or wildcard
2294 vlan_pcp: exact match or wildcard
2295 mpls_label: exact match or wildcard
2296 mpls_tc: exact match or wildcard
2297 ip_src: exact match or wildcard
2298 ip_dst: exact match or wildcard
2299 ipv6_src: exact match or wildcard
2300 ipv6_dst: exact match or wildcard
2301 ipv6_label: exact match or wildcard
2302 nw_proto: exact match or wildcard
2303 ip_dscp: exact match or wildcard
2304 nw_ecn: exact match or wildcard
2305 arp_op: exact match or wildcard
2306 arp_spa: exact match or wildcard
2307 arp_tpa: exact match or wildcard
2308 arp_sha: exact match or wildcard
2309 arp_tha: exact match or wildcard
2310 tcp_src: exact match or wildcard
2311 tcp_dst: exact match or wildcard
2312 udp_src: exact match or wildcard
2313 udp_dst: exact match or wildcard
2314 sctp_src: exact match or wildcard
2315 sctp_dst: exact match or wildcard
2316 icmp_type: exact match or wildcard
2317 icmp_code: exact match or wildcard
2318 icmpv6_type: exact match or wildcard
2319 icmpv6_code: exact match or wildcard
2320 nd_target: exact match or wildcard
2321 nd_sll: exact match or wildcard
2322 nd_tll: exact match or wildcard
2323
2324 ' $1
2325 }
2326 ditto() {
2327 for i in `seq $1 $2`; do
2328 printf ' table %d ("table%d"): ditto\n' $i $i
2329 done
2330 }
2331 tail_table() {
2332 printf ' table 253 ("table253"):
2333 active=0, lookup=0, matched=0
2334 metadata: match=0xffffffffffffffff write=0xffffffffffffffff
2335 config=controller
2336 max_entries=1000000
2337 instructions (table miss and others):
2338 instructions: apply_actions,clear_actions,write_actions,write_metadata
2339 (same actions)
2340 (same matching)
2341 '
2342 }
2343 (head_table classifier; ditto 1 252; tail_table) > expout
2344 AT_CHECK([ovs-ofctl -O OpenFlow12 dump-tables br0], [0], [expout])
2345 # Change the configuration.
2346 AT_CHECK(
2347 [ovs-vsctl \
2348 -- --id=@t0 create Flow_Table name=main \
2349 -- --id=@t1 create Flow_Table flow-limit=1024 \
2350 -- set bridge br0 'flow_tables={1=@t1,0=@t0}' \
2351 | uuidfilt],
2352 [0], [<0>
2353 <1>
2354 ])
2355 # Check that the configuration was updated.
2356 (head_table main; echo ' table 1 ("table1"):
2357 active=0, lookup=0, matched=0
2358 metadata: match=0xffffffffffffffff write=0xffffffffffffffff
2359 config=controller
2360 max_entries=1024
2361 (same instructions)
2362 (same matching)
2363
2364 table 2 ("table2"):
2365 active=0, lookup=0, matched=0
2366 metadata: match=0xffffffffffffffff write=0xffffffffffffffff
2367 config=controller
2368 max_entries=1000000
2369 (same instructions)
2370 (same matching)
2371 '; ditto 3 252; tail_table) > expout
2372 AT_CHECK([ovs-ofctl -O OpenFlow12 dump-tables br0], [0], [expout])
2373 OVS_VSWITCHD_STOP
2374 AT_CLEANUP
2375
2376 AT_SETUP([ofproto - table features (OpenFlow 1.3)])
2377 OVS_VSWITCHD_START
2378 head_table () {
2379 printf ' table 0 ("%s"):
2380 metadata: match=0xffffffffffffffff write=0xffffffffffffffff
2381 max_entries=1000000
2382 instructions (table miss and others):
2383 next tables: 1-253
2384 instructions: meter,apply_actions,clear_actions,write_actions,write_metadata,goto_table
2385 Write-Actions and Apply-Actions features:
2386 actions: output group set_field strip_vlan push_vlan mod_nw_ttl dec_ttl set_mpls_ttl dec_mpls_ttl push_mpls pop_mpls set_queue
2387 supported on Set-Field: tun_id tun_src tun_dst tun_ipv6_src tun_ipv6_dst tun_flags tun_gbp_id tun_gbp_flags tun_metadata0 dnl
2388 tun_metadata1 tun_metadata2 tun_metadata3 tun_metadata4 tun_metadata5 tun_metadata6 tun_metadata7 tun_metadata8 tun_metadata9 tun_metadata10 tun_metadata11 tun_metadata12 tun_metadata13 tun_metadata14 tun_metadata15 tun_metadata16 tun_metadata17 tun_metadata18 tun_metadata19 tun_metadata20 tun_metadata21 tun_metadata22 tun_metadata23 tun_metadata24 tun_metadata25 tun_metadata26 tun_metadata27 tun_metadata28 tun_metadata29 tun_metadata30 tun_metadata31 tun_metadata32 tun_metadata33 tun_metadata34 tun_metadata35 tun_metadata36 tun_metadata37 tun_metadata38 tun_metadata39 tun_metadata40 tun_metadata41 tun_metadata42 tun_metadata43 tun_metadata44 tun_metadata45 tun_metadata46 tun_metadata47 tun_metadata48 tun_metadata49 tun_metadata50 tun_metadata51 tun_metadata52 tun_metadata53 tun_metadata54 tun_metadata55 tun_metadata56 tun_metadata57 tun_metadata58 tun_metadata59 tun_metadata60 tun_metadata61 tun_metadata62 tun_metadata63 dnl
2389 metadata in_port in_port_oxm pkt_mark ct_mark ct_label reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 reg9 reg10 reg11 reg12 reg13 reg14 reg15 xreg0 xreg1 xreg2 xreg3 xreg4 xreg5 xreg6 xreg7 xxreg0 xxreg1 xxreg2 xxreg3 eth_src eth_dst vlan_tci vlan_vid vlan_pcp mpls_label mpls_tc mpls_ttl ip_src ip_dst ipv6_src ipv6_dst ipv6_label nw_tos ip_dscp nw_ecn nw_ttl arp_op arp_spa arp_tpa arp_sha arp_tha tcp_src tcp_dst udp_src udp_dst sctp_src sctp_dst icmp_type icmp_code icmpv6_type icmpv6_code nd_target nd_sll nd_tll nsh_flags nsh_spi nsh_si nsh_c1 nsh_c2 nsh_c3 nsh_c4
2390 matching:
2391 dp_hash: arbitrary mask
2392 recirc_id: exact match or wildcard
2393 packet_type: exact match or wildcard
2394 conj_id: exact match or wildcard
2395 tun_id: arbitrary mask
2396 tun_src: arbitrary mask
2397 tun_dst: arbitrary mask
2398 tun_ipv6_src: arbitrary mask
2399 tun_ipv6_dst: arbitrary mask
2400 tun_flags: arbitrary mask
2401 tun_gbp_id: arbitrary mask
2402 tun_gbp_flags: arbitrary mask
2403 tun_metadata0: arbitrary mask
2404 tun_metadata1: arbitrary mask
2405 tun_metadata2: arbitrary mask
2406 tun_metadata3: arbitrary mask
2407 tun_metadata4: arbitrary mask
2408 tun_metadata5: arbitrary mask
2409 tun_metadata6: arbitrary mask
2410 tun_metadata7: arbitrary mask
2411 tun_metadata8: arbitrary mask
2412 tun_metadata9: arbitrary mask
2413 tun_metadata10: arbitrary mask
2414 tun_metadata11: arbitrary mask
2415 tun_metadata12: arbitrary mask
2416 tun_metadata13: arbitrary mask
2417 tun_metadata14: arbitrary mask
2418 tun_metadata15: arbitrary mask
2419 tun_metadata16: arbitrary mask
2420 tun_metadata17: arbitrary mask
2421 tun_metadata18: arbitrary mask
2422 tun_metadata19: arbitrary mask
2423 tun_metadata20: arbitrary mask
2424 tun_metadata21: arbitrary mask
2425 tun_metadata22: arbitrary mask
2426 tun_metadata23: arbitrary mask
2427 tun_metadata24: arbitrary mask
2428 tun_metadata25: arbitrary mask
2429 tun_metadata26: arbitrary mask
2430 tun_metadata27: arbitrary mask
2431 tun_metadata28: arbitrary mask
2432 tun_metadata29: arbitrary mask
2433 tun_metadata30: arbitrary mask
2434 tun_metadata31: arbitrary mask
2435 tun_metadata32: arbitrary mask
2436 tun_metadata33: arbitrary mask
2437 tun_metadata34: arbitrary mask
2438 tun_metadata35: arbitrary mask
2439 tun_metadata36: arbitrary mask
2440 tun_metadata37: arbitrary mask
2441 tun_metadata38: arbitrary mask
2442 tun_metadata39: arbitrary mask
2443 tun_metadata40: arbitrary mask
2444 tun_metadata41: arbitrary mask
2445 tun_metadata42: arbitrary mask
2446 tun_metadata43: arbitrary mask
2447 tun_metadata44: arbitrary mask
2448 tun_metadata45: arbitrary mask
2449 tun_metadata46: arbitrary mask
2450 tun_metadata47: arbitrary mask
2451 tun_metadata48: arbitrary mask
2452 tun_metadata49: arbitrary mask
2453 tun_metadata50: arbitrary mask
2454 tun_metadata51: arbitrary mask
2455 tun_metadata52: arbitrary mask
2456 tun_metadata53: arbitrary mask
2457 tun_metadata54: arbitrary mask
2458 tun_metadata55: arbitrary mask
2459 tun_metadata56: arbitrary mask
2460 tun_metadata57: arbitrary mask
2461 tun_metadata58: arbitrary mask
2462 tun_metadata59: arbitrary mask
2463 tun_metadata60: arbitrary mask
2464 tun_metadata61: arbitrary mask
2465 tun_metadata62: arbitrary mask
2466 tun_metadata63: arbitrary mask
2467 metadata: arbitrary mask
2468 in_port: exact match or wildcard
2469 in_port_oxm: exact match or wildcard
2470 actset_output: exact match or wildcard
2471 pkt_mark: arbitrary mask
2472 ct_state: arbitrary mask
2473 ct_zone: exact match or wildcard
2474 ct_mark: arbitrary mask
2475 ct_label: arbitrary mask
2476 ct_nw_proto: exact match or wildcard
2477 ct_nw_src: arbitrary mask
2478 ct_nw_dst: arbitrary mask
2479 ct_ipv6_src: arbitrary mask
2480 ct_ipv6_dst: arbitrary mask
2481 ct_tp_src: arbitrary mask
2482 ct_tp_dst: arbitrary mask
2483 reg0: arbitrary mask
2484 reg1: arbitrary mask
2485 reg2: arbitrary mask
2486 reg3: arbitrary mask
2487 reg4: arbitrary mask
2488 reg5: arbitrary mask
2489 reg6: arbitrary mask
2490 reg7: arbitrary mask
2491 reg8: arbitrary mask
2492 reg9: arbitrary mask
2493 reg10: arbitrary mask
2494 reg11: arbitrary mask
2495 reg12: arbitrary mask
2496 reg13: arbitrary mask
2497 reg14: arbitrary mask
2498 reg15: arbitrary mask
2499 xreg0: arbitrary mask
2500 xreg1: arbitrary mask
2501 xreg2: arbitrary mask
2502 xreg3: arbitrary mask
2503 xreg4: arbitrary mask
2504 xreg5: arbitrary mask
2505 xreg6: arbitrary mask
2506 xreg7: arbitrary mask
2507 xxreg0: arbitrary mask
2508 xxreg1: arbitrary mask
2509 xxreg2: arbitrary mask
2510 xxreg3: arbitrary mask
2511 eth_src: arbitrary mask
2512 eth_dst: arbitrary mask
2513 eth_type: exact match or wildcard
2514 vlan_tci: arbitrary mask
2515 vlan_vid: arbitrary mask
2516 vlan_pcp: exact match or wildcard
2517 mpls_label: exact match or wildcard
2518 mpls_tc: exact match or wildcard
2519 mpls_bos: exact match or wildcard
2520 mpls_ttl: exact match or wildcard
2521 ip_src: arbitrary mask
2522 ip_dst: arbitrary mask
2523 ipv6_src: arbitrary mask
2524 ipv6_dst: arbitrary mask
2525 ipv6_label: arbitrary mask
2526 nw_proto: exact match or wildcard
2527 nw_tos: exact match or wildcard
2528 ip_dscp: exact match or wildcard
2529 nw_ecn: exact match or wildcard
2530 nw_ttl: exact match or wildcard
2531 ip_frag: arbitrary mask
2532 arp_op: exact match or wildcard
2533 arp_spa: arbitrary mask
2534 arp_tpa: arbitrary mask
2535 arp_sha: arbitrary mask
2536 arp_tha: arbitrary mask
2537 tcp_src: arbitrary mask
2538 tcp_dst: arbitrary mask
2539 tcp_flags: arbitrary mask
2540 udp_src: arbitrary mask
2541 udp_dst: arbitrary mask
2542 sctp_src: arbitrary mask
2543 sctp_dst: arbitrary mask
2544 icmp_type: exact match or wildcard
2545 icmp_code: exact match or wildcard
2546 icmpv6_type: exact match or wildcard
2547 icmpv6_code: exact match or wildcard
2548 nd_target: arbitrary mask
2549 nd_sll: arbitrary mask
2550 nd_tll: arbitrary mask
2551 nsh_flags: arbitrary mask
2552 nsh_mdtype: exact match or wildcard
2553 nsh_np: exact match or wildcard
2554 nsh_spi: exact match or wildcard
2555 nsh_si: exact match or wildcard
2556 nsh_c1: arbitrary mask
2557 nsh_c2: arbitrary mask
2558 nsh_c3: arbitrary mask
2559 nsh_c4: arbitrary mask
2560
2561 ' $1
2562 }
2563 ditto() {
2564 printf ' table %d ("%s"):
2565 metadata: match=0xffffffffffffffff write=0xffffffffffffffff
2566 max_entries=%d
2567 instructions (table miss and others):
2568 next tables: %d-253
2569 (same instructions)
2570 (same actions)
2571 (same matching)
2572
2573 ' $1 $2 $3 `expr $1 + 1`
2574 }
2575 tail_tables() {
2576 echo ' table 252 ("table252"):
2577 metadata: match=0xffffffffffffffff write=0xffffffffffffffff
2578 max_entries=1000000
2579 instructions (table miss and others):
2580 next tables: 253
2581 (same instructions)
2582 (same actions)
2583 (same matching)
2584
2585 table 253 ("table253"):
2586 metadata: match=0xffffffffffffffff write=0xffffffffffffffff
2587 max_entries=1000000
2588 instructions (table miss and others):
2589 instructions: meter,apply_actions,clear_actions,write_actions,write_metadata
2590 (same actions)
2591 (same matching)
2592 '
2593 }
2594 (head_table classifier
2595 for i in `seq 1 251`; do
2596 ditto $i table$i 1000000
2597 done
2598 tail_tables) > expout
2599 AT_CHECK([ovs-ofctl -O OpenFlow13 dump-table-features br0], [0], [expout])
2600 # Change the configuration.
2601 AT_CHECK(
2602 [ovs-vsctl \
2603 -- --id=@t0 create Flow_Table name=main \
2604 -- --id=@t1 create Flow_Table flow-limit=1024 \
2605 -- set bridge br0 'flow_tables={1=@t1,0=@t0}' \
2606 | uuidfilt],
2607 [0], [<0>
2608 <1>
2609 ])
2610 # Check that the configuration was updated.
2611 (head_table main
2612 ditto 1 table1 1024
2613 for i in `seq 2 251`; do
2614 ditto $i table$i 1000000
2615 done
2616 tail_tables) > expout
2617 AT_CHECK([ovs-ofctl -O OpenFlow13 dump-table-features br0], [0], [expout])
2618 OVS_VSWITCHD_STOP
2619 AT_CLEANUP
2620
2621 AT_SETUP([ofproto - table description (OpenFlow 1.4)])
2622 OVS_VSWITCHD_START
2623 (x=0
2624 while test $x -lt 254; do
2625 y=`expr $x + 1`
2626 echo " table $x:
2627 eviction=off eviction_flags=OTHER|IMPORTANCE|LIFETIME
2628 vacancy=off"
2629 x=$y
2630 done) > expout
2631 AT_CHECK([ovs-ofctl -O OpenFlow14 dump-table-desc br0 | sed '/^$/d
2632 /^OFPST_TABLE_DESC/d'], [0], [expout])
2633
2634 # Change the configuration.
2635 AT_CHECK([ovs-ofctl -O Openflow14 mod-table br0 0 evict])
2636 # Check that the configuration was updated.
2637 mv expout orig-expout
2638 sed -e '2s/eviction=off/eviction=on/' <orig-expout > expout
2639 AT_CHECK([ovs-ofctl -O OpenFlow14 dump-table-desc br0 | sed '/^$/d
2640 /^OFPST_TABLE_DESC/d'], [0], [expout])
2641
2642 AT_CHECK([ovs-ofctl -O Openflow14 mod-table br0 0 vacancy:20,80])
2643 # Check that the configuration was updated.
2644 mv expout orig-expout
2645 sed -e '3s/vacancy=off/vacancy=on vacancy_down=20% vacancy_up=80% vacancy=100%/' <orig-expout > expout
2646 AT_CHECK([ovs-ofctl -O OpenFlow14 dump-table-desc br0 | sed '/^$/d
2647 /^OFPST_TABLE_DESC/d'], [0], [expout])
2648 OVS_VSWITCHD_STOP
2649 AT_CLEANUP
2650
2651 AT_SETUP([ofproto - hard limits on flow table size (OpenFlow 1.0)])
2652 OVS_VSWITCHD_START
2653 # Configure a maximum of 4 flows.
2654 AT_CHECK(
2655 [ovs-vsctl \
2656 -- --id=@t0 create Flow_Table flow-limit=4 \
2657 -- set bridge br0 flow_tables:0=@t0 \
2658 | uuidfilt],
2659 [0], [<0>
2660 ])
2661 # Add 4 flows.
2662 for in_port in 1 2 3 4; do
2663 ovs-ofctl add-flow br0 in_port=$in_port,actions=drop
2664 done
2665 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
2666 in_port=1 actions=drop
2667 in_port=2 actions=drop
2668 in_port=3 actions=drop
2669 in_port=4 actions=drop
2670 NXST_FLOW reply:
2671 ])
2672 # Adding another flow will be refused.
2673 AT_CHECK([ovs-ofctl add-flow br0 in_port=5,actions=drop], [1], [], [stderr])
2674 AT_CHECK([head -n 1 stderr | ofctl_strip], [0],
2675 [OFPT_ERROR: OFPFMFC_TABLE_FULL
2676 ])
2677 # Also a mod-flow that would add a flow will be refused.
2678 AT_CHECK([ovs-ofctl mod-flows br0 in_port=5,actions=drop], [1], [], [stderr])
2679 AT_CHECK([head -n 1 stderr | ofctl_strip], [0],
2680 [OFPT_ERROR: OFPFMFC_TABLE_FULL
2681 ])
2682 # Replacing or modifying an existing flow is allowed.
2683 AT_CHECK([ovs-ofctl add-flow br0 in_port=4,actions=normal])
2684 AT_CHECK([ovs-ofctl mod-flows br0 in_port=3,actions=output:1])
2685 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
2686 in_port=1 actions=drop
2687 in_port=2 actions=drop
2688 in_port=3 actions=output:1
2689 in_port=4 actions=NORMAL
2690 NXST_FLOW reply:
2691 ])
2692 OVS_VSWITCHD_STOP
2693 AT_CLEANUP
2694
2695 AT_SETUP([ofproto - hard limits on flow table size (OpenFlow 1.2)])
2696 OVS_VSWITCHD_START
2697 # Configure a maximum of 4 flows.
2698 AT_CHECK(
2699 [ovs-vsctl \
2700 -- --id=@t0 create Flow_Table flow-limit=4 \
2701 -- set bridge br0 flow_tables:0=@t0 \
2702 | uuidfilt],
2703 [0], [<0>
2704 ])
2705 # Add 4 flows.
2706 for in_port in 1 2 3 4; do
2707 ovs-ofctl -O OpenFlow12 add-flow br0 in_port=$in_port,actions=drop
2708 done
2709 AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0], [dnl
2710 in_port=1 actions=drop
2711 in_port=2 actions=drop
2712 in_port=3 actions=drop
2713 in_port=4 actions=drop
2714 OFPST_FLOW reply (OF1.2):
2715 ])
2716 # Adding another flow will be refused.
2717 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 in_port=5,actions=drop], [1], [], [stderr])
2718 AT_CHECK([head -n 1 stderr | ofctl_strip], [0],
2719 [OFPT_ERROR (OF1.2): OFPFMFC_TABLE_FULL
2720 ])
2721 # Replacing or modifying an existing flow is allowed.
2722 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 in_port=4,actions=normal])
2723 AT_CHECK([ovs-ofctl -O OpenFlow12 mod-flows br0 in_port=3,actions=output:1])
2724 AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0], [dnl
2725 in_port=1 actions=drop
2726 in_port=2 actions=drop
2727 in_port=3 actions=output:1
2728 in_port=4 actions=NORMAL
2729 OFPST_FLOW reply (OF1.2):
2730 ])
2731 OVS_VSWITCHD_STOP
2732 AT_CLEANUP
2733
2734 AT_SETUP([ofproto - eviction upon table overflow (OpenFlow 1.0)])
2735 OVS_VSWITCHD_START
2736 # Configure a maximum of 4 flows.
2737 AT_CHECK(
2738 [ovs-vsctl \
2739 -- --id=@t0 create Flow_Table flow-limit=4 overflow-policy=evict \
2740 -- set bridge br0 flow_tables:0=@t0 \
2741 | uuidfilt],
2742 [0], [<0>
2743 ])
2744 # Add 4 flows.
2745 for in_port in 4 3 2 1; do
2746 ovs-ofctl add-flow br0 idle_timeout=${in_port}0,in_port=$in_port,actions=drop
2747 done
2748 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
2749 idle_timeout=10, in_port=1 actions=drop
2750 idle_timeout=20, in_port=2 actions=drop
2751 idle_timeout=30, in_port=3 actions=drop
2752 idle_timeout=40, in_port=4 actions=drop
2753 NXST_FLOW reply:
2754 ])
2755 # Adding another flow will cause the one that expires soonest to be evicted.
2756 AT_CHECK([ovs-ofctl add-flow br0 in_port=5,actions=drop])
2757 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
2758 idle_timeout=20, in_port=2 actions=drop
2759 idle_timeout=30, in_port=3 actions=drop
2760 idle_timeout=40, in_port=4 actions=drop
2761 in_port=5 actions=drop
2762 NXST_FLOW reply:
2763 ])
2764 # A mod-flow that adds a flow also causes eviction, but replacing or
2765 # modifying an existing flow doesn't.
2766 AT_CHECK([ovs-ofctl mod-flows br0 in_port=6,actions=drop])
2767 AT_CHECK([ovs-ofctl add-flow br0 in_port=4,actions=normal])
2768 AT_CHECK([ovs-ofctl mod-flows br0 in_port=3,actions=output:1])
2769 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
2770 idle_timeout=30, in_port=3 actions=output:1
2771 in_port=4 actions=NORMAL
2772 in_port=5 actions=drop
2773 in_port=6 actions=drop
2774 NXST_FLOW reply:
2775 ])
2776 # Flows with no timeouts at all cannot be evicted.
2777 AT_CHECK([ovs-ofctl add-flow br0 in_port=7,actions=normal])
2778 AT_CHECK([ovs-ofctl add-flow br0 in_port=8,actions=drop], [1], [], [stderr])
2779 AT_CHECK([head -n 1 stderr | ofctl_strip], [0],
2780 [OFPT_ERROR: OFPFMFC_TABLE_FULL
2781 ])
2782 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
2783 in_port=4 actions=NORMAL
2784 in_port=5 actions=drop
2785 in_port=6 actions=drop
2786 in_port=7 actions=NORMAL
2787 NXST_FLOW reply:
2788 ])
2789 OVS_VSWITCHD_STOP
2790 AT_CLEANUP
2791
2792 AT_SETUP([ofproto - eviction upon table overflow (OpenFlow 1.2)])
2793 OVS_VSWITCHD_START
2794 # Configure a maximum of 4 flows.
2795 AT_CHECK(
2796 [ovs-vsctl \
2797 -- --id=@t0 create Flow_Table flow-limit=4 overflow-policy=evict \
2798 -- set bridge br0 flow_tables:0=@t0 \
2799 | uuidfilt],
2800 [0], [<0>
2801 ])
2802 # Add 4 flows.
2803 for in_port in 4 3 2 1; do
2804 ovs-ofctl -O OpenFlow12 add-flow br0 idle_timeout=${in_port}0,in_port=$in_port,actions=drop
2805 done
2806 AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0], [dnl
2807 idle_timeout=10, in_port=1 actions=drop
2808 idle_timeout=20, in_port=2 actions=drop
2809 idle_timeout=30, in_port=3 actions=drop
2810 idle_timeout=40, in_port=4 actions=drop
2811 OFPST_FLOW reply (OF1.2):
2812 ])
2813 # Adding another flow will cause the one that expires soonest to be evicted.
2814 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 in_port=5,actions=drop])
2815 AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0], [dnl
2816 idle_timeout=20, in_port=2 actions=drop
2817 idle_timeout=30, in_port=3 actions=drop
2818 idle_timeout=40, in_port=4 actions=drop
2819 in_port=5 actions=drop
2820 OFPST_FLOW reply (OF1.2):
2821 ])
2822 # In OpenFlow 1.2 a mod-flow does not ever add a flow and thus
2823 # has no effect on eviction
2824 AT_CHECK([ovs-ofctl -O OpenFlow12 mod-flows br0 in_port=6,actions=drop])
2825 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 in_port=4,actions=normal])
2826 AT_CHECK([ovs-ofctl -O OpenFlow12 mod-flows br0 in_port=3,actions=output:1])
2827 AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0], [dnl
2828 idle_timeout=20, in_port=2 actions=drop
2829 idle_timeout=30, in_port=3 actions=output:1
2830 in_port=4 actions=NORMAL
2831 in_port=5 actions=drop
2832 OFPST_FLOW reply (OF1.2):
2833 ])
2834 # Flows with no timeouts at all cannot be evicted.
2835 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 in_port=6,actions=drop])
2836 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 in_port=7,actions=normal])
2837 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 in_port=8,actions=drop], [1], [], [stderr])
2838 AT_CHECK([head -n 1 stderr | ofctl_strip], [0],
2839 [OFPT_ERROR (OF1.2): OFPFMFC_TABLE_FULL
2840 ])
2841 AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0], [dnl
2842 in_port=4 actions=NORMAL
2843 in_port=5 actions=drop
2844 in_port=6 actions=drop
2845 in_port=7 actions=NORMAL
2846 OFPST_FLOW reply (OF1.2):
2847 ])
2848 OVS_VSWITCHD_STOP
2849 AT_CLEANUP
2850
2851 AT_SETUP([ofproto - eviction using importance upon table overflow (OpenFlow 1.4)])
2852 OVS_VSWITCHD_START
2853 # Configure a maximum of 4 flows.
2854 AT_CHECK(
2855 [ovs-vsctl \
2856 -- --id=@t0 create Flow_Table name=evict flow-limit=4 \
2857 -- set bridge br0 flow_tables:0=@t0 \
2858 | uuidfilt],
2859 [0], [<0>
2860 ])
2861 # Use mod-table to turn on eviction just to demonstrate that it works.
2862 AT_CHECK([ovs-ofctl -O OpenFlow14 mod-table br0 0 evict])
2863 # Add 4 flows.
2864 for in_port in 4 3 2 1; do
2865 ovs-ofctl -O Openflow14 add-flow br0 importance=$((in_port + 30)),priority=$((in_port + 5)),hard_timeout=$((in_port + 500)),actions=drop
2866 done
2867 AT_CHECK([ovs-ofctl -O Openflow14 dump-flows br0 | ofctl_strip | sort], [0], [dnl
2868 hard_timeout=501, importance=31, priority=6 actions=drop
2869 hard_timeout=502, importance=32, priority=7 actions=drop
2870 hard_timeout=503, importance=33, priority=8 actions=drop
2871 hard_timeout=504, importance=34, priority=9 actions=drop
2872 OFPST_FLOW reply (OF1.4):
2873 ])
2874 # Adding another flow will cause the one with lowest importance to be evicted.
2875 AT_CHECK([ovs-ofctl -O Openflow14 add-flow br0 hard_timeout=505,importance=35,priority=10,in_port=2,actions=drop])
2876 AT_CHECK([ovs-ofctl -O Openflow14 dump-flows br0 | ofctl_strip | sort], [0], [dnl
2877 hard_timeout=502, importance=32, priority=7 actions=drop
2878 hard_timeout=503, importance=33, priority=8 actions=drop
2879 hard_timeout=504, importance=34, priority=9 actions=drop
2880 hard_timeout=505, importance=35, priority=10,in_port=2 actions=drop
2881 OFPST_FLOW reply (OF1.4):
2882 ])
2883 # Disable the Eviction configuration.
2884 AT_CHECK([ovs-ofctl -O OpenFlow14 mod-table br0 0 noevict])
2885 # Adding another flow will cause the system to give error for FULL TABLE.
2886 AT_CHECK([ovs-ofctl -O Openflow14 add-flow br0 hard_timeout=506,importance=36,priority=11,actions=drop],[1], [], [stderr])
2887 AT_CHECK([head -n 1 stderr | ofctl_strip], [0],
2888 [OFPT_ERROR (OF1.4): OFPFMFC_TABLE_FULL
2889 ])
2890 #Dump flows. It should show only the old values
2891 AT_CHECK([ovs-ofctl -O Openflow14 dump-flows br0 | ofctl_strip | sort], [0], [dnl
2892 hard_timeout=502, importance=32, priority=7 actions=drop
2893 hard_timeout=503, importance=33, priority=8 actions=drop
2894 hard_timeout=504, importance=34, priority=9 actions=drop
2895 hard_timeout=505, importance=35, priority=10,in_port=2 actions=drop
2896 OFPST_FLOW reply (OF1.4):
2897 ])
2898 # mod-flow that would modify a flow will be done successfully.
2899 AT_CHECK([ovs-ofctl -O Openflow14 mod-flows br0 in_port=2,actions=NORMAL])
2900 AT_CHECK([ovs-ofctl -O Openflow14 dump-flows br0 | ofctl_strip | sort], [0], [dnl
2901 hard_timeout=502, importance=32, priority=7 actions=drop
2902 hard_timeout=503, importance=33, priority=8 actions=drop
2903 hard_timeout=504, importance=34, priority=9 actions=drop
2904 hard_timeout=505, importance=35, priority=10,in_port=2 actions=NORMAL
2905 OFPST_FLOW reply (OF1.4):
2906 ])
2907 # Also a mod-flow that would add a flow will be refused.
2908 AT_CHECK([ovs-ofctl mod-flows br0 in_port=5,actions=drop], [1], [], [stderr])
2909 AT_CHECK([head -n 1 stderr | ofctl_strip], [0],
2910 [OFPT_ERROR: OFPFMFC_TABLE_FULL
2911 ])
2912 OVS_VSWITCHD_STOP
2913 AT_CLEANUP
2914
2915 AT_SETUP([ofproto - eviction upon table overflow, with fairness (OpenFlow 1.0)])
2916 OVS_VSWITCHD_START
2917 # Configure a maximum of 4 flows.
2918 AT_CHECK(
2919 [ovs-vsctl \
2920 -- --id=@t0 create Flow_Table name=evict flow-limit=4 \
2921 overflow-policy=evict \
2922 groups='"NXM_OF_IN_PORT[[]]"' \
2923 -- set bridge br0 flow_tables:0=@t0 \
2924 | uuidfilt],
2925 [0], [<0>
2926 ])
2927 # Add 4 flows.
2928 ovs-ofctl add-flows br0 - <<EOF
2929 idle_timeout=10 in_port=2 dl_src=00:44:55:66:77:88 actions=drop
2930 idle_timeout=20 in_port=1 dl_src=00:11:22:33:44:55 actions=drop
2931 idle_timeout=30 in_port=1 dl_src=00:22:33:44:55:66 actions=drop
2932 idle_timeout=40 in_port=1 dl_src=00:33:44:55:66:77 actions=drop
2933 EOF
2934 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
2935 idle_timeout=10, in_port=2,dl_src=00:44:55:66:77:88 actions=drop
2936 idle_timeout=20, in_port=1,dl_src=00:11:22:33:44:55 actions=drop
2937 idle_timeout=30, in_port=1,dl_src=00:22:33:44:55:66 actions=drop
2938 idle_timeout=40, in_port=1,dl_src=00:33:44:55:66:77 actions=drop
2939 NXST_FLOW reply:
2940 ])
2941 # Adding another flow will cause the one that expires soonest within
2942 # the largest group (those with in_port=1) to be evicted. In this
2943 # case this is not the same as the one that expires soonest overall
2944 # (which is what makes the test interesting):
2945 AT_CHECK([ovs-ofctl add-flow br0 in_port=2,dl_src=00:55:66:77:88:99,actions=drop])
2946 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
2947 idle_timeout=10, in_port=2,dl_src=00:44:55:66:77:88 actions=drop
2948 idle_timeout=30, in_port=1,dl_src=00:22:33:44:55:66 actions=drop
2949 idle_timeout=40, in_port=1,dl_src=00:33:44:55:66:77 actions=drop
2950 in_port=2,dl_src=00:55:66:77:88:99 actions=drop
2951 NXST_FLOW reply:
2952 ])
2953 # Enlarge the flow limit, change the eviction policy back to strictly
2954 # based on expiration, and and add some flows.
2955 AT_CHECK([ovs-vsctl set Flow_Table evict groups='[[]]' flow-limit=7])
2956 ovs-ofctl add-flows br0 - <<EOF
2957 idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=drop
2958 idle_timeout=60 in_port=2 dl_src=00:77:88:99:aa:bb actions=drop
2959 idle_timeout=70 in_port=2 dl_src=00:88:99:aa:bb:cc actions=drop
2960 EOF
2961 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
2962 idle_timeout=10, in_port=2,dl_src=00:44:55:66:77:88 actions=drop
2963 idle_timeout=30, in_port=1,dl_src=00:22:33:44:55:66 actions=drop
2964 idle_timeout=40, in_port=1,dl_src=00:33:44:55:66:77 actions=drop
2965 idle_timeout=50, in_port=2,dl_src=00:66:77:88:99:aa actions=drop
2966 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=drop
2967 idle_timeout=70, in_port=2,dl_src=00:88:99:aa:bb:cc actions=drop
2968 in_port=2,dl_src=00:55:66:77:88:99 actions=drop
2969 NXST_FLOW reply:
2970 ])
2971 # Adding another flow will cause the one that expires soonest overall
2972 # to be evicted.
2973 AT_CHECK([ovs-ofctl add-flow br0 'idle_timeout=80 in_port=2 dl_src=00:99:aa:bb:cc:dd actions=drop'])
2974 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
2975 idle_timeout=30, in_port=1,dl_src=00:22:33:44:55:66 actions=drop
2976 idle_timeout=40, in_port=1,dl_src=00:33:44:55:66:77 actions=drop
2977 idle_timeout=50, in_port=2,dl_src=00:66:77:88:99:aa actions=drop
2978 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=drop
2979 idle_timeout=70, in_port=2,dl_src=00:88:99:aa:bb:cc actions=drop
2980 idle_timeout=80, in_port=2,dl_src=00:99:aa:bb:cc:dd actions=drop
2981 in_port=2,dl_src=00:55:66:77:88:99 actions=drop
2982 NXST_FLOW reply:
2983 ])
2984 # Reducing the flow limit also causes the flows that expire soonest
2985 # overall to be evicted.
2986 AT_CHECK([ovs-vsctl set Flow_Table evict flow-limit=4])
2987 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
2988 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=drop
2989 idle_timeout=70, in_port=2,dl_src=00:88:99:aa:bb:cc actions=drop
2990 idle_timeout=80, in_port=2,dl_src=00:99:aa:bb:cc:dd actions=drop
2991 in_port=2,dl_src=00:55:66:77:88:99 actions=drop
2992 NXST_FLOW reply:
2993 ])
2994 OVS_VSWITCHD_STOP
2995 AT_CLEANUP
2996
2997 AT_SETUP([ofproto - eviction upon table overflow, with fairness (OpenFlow 1.2)])
2998 OVS_VSWITCHD_START
2999 # Configure a maximum of 4 flows.
3000 AT_CHECK(
3001 [ovs-vsctl \
3002 -- --id=@t0 create Flow_Table name=evict flow-limit=4 \
3003 overflow-policy=evict \
3004 groups='"NXM_OF_IN_PORT[[]]"' \
3005 -- set bridge br0 flow_tables:0=@t0 \
3006 | uuidfilt],
3007 [0], [<0>
3008 ])
3009 # Add 4 flows.
3010 ovs-ofctl -O OpenFlow12 add-flows br0 - <<EOF
3011 idle_timeout=10 in_port=2 dl_src=00:44:55:66:77:88 actions=drop
3012 idle_timeout=20 in_port=1 dl_src=00:11:22:33:44:55 actions=drop
3013 idle_timeout=30 in_port=1 dl_src=00:22:33:44:55:66 actions=drop
3014 idle_timeout=40 in_port=1 dl_src=00:33:44:55:66:77 actions=drop
3015 EOF
3016 AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0], [dnl
3017 idle_timeout=10, in_port=2,dl_src=00:44:55:66:77:88 actions=drop
3018 idle_timeout=20, in_port=1,dl_src=00:11:22:33:44:55 actions=drop
3019 idle_timeout=30, in_port=1,dl_src=00:22:33:44:55:66 actions=drop
3020 idle_timeout=40, in_port=1,dl_src=00:33:44:55:66:77 actions=drop
3021 OFPST_FLOW reply (OF1.2):
3022 ])
3023 # Adding another flow will cause the one that expires soonest within
3024 # the largest group (those with in_port=1) to be evicted. In this
3025 # case this is not the same as the one that expires soonest overall
3026 # (which is what makes the test interesting):
3027 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 in_port=2,dl_src=00:55:66:77:88:99,actions=drop])
3028 AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0], [dnl
3029 idle_timeout=10, in_port=2,dl_src=00:44:55:66:77:88 actions=drop
3030 idle_timeout=30, in_port=1,dl_src=00:22:33:44:55:66 actions=drop
3031 idle_timeout=40, in_port=1,dl_src=00:33:44:55:66:77 actions=drop
3032 in_port=2,dl_src=00:55:66:77:88:99 actions=drop
3033 OFPST_FLOW reply (OF1.2):
3034 ])
3035 # Enlarge the flow limit, change the eviction policy back to strictly
3036 # based on expiration, and and add some flows.
3037 AT_CHECK([ovs-vsctl set Flow_Table evict groups='[[]]' flow-limit=7])
3038 ovs-ofctl -O OpenFlow12 add-flows br0 - <<EOF
3039 idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=drop
3040 idle_timeout=60 in_port=2 dl_src=00:77:88:99:aa:bb actions=drop
3041 idle_timeout=70 in_port=2 dl_src=00:88:99:aa:bb:cc actions=drop
3042 EOF
3043 AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0], [dnl
3044 idle_timeout=10, in_port=2,dl_src=00:44:55:66:77:88 actions=drop
3045 idle_timeout=30, in_port=1,dl_src=00:22:33:44:55:66 actions=drop
3046 idle_timeout=40, in_port=1,dl_src=00:33:44:55:66:77 actions=drop
3047 idle_timeout=50, in_port=2,dl_src=00:66:77:88:99:aa actions=drop
3048 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=drop
3049 idle_timeout=70, in_port=2,dl_src=00:88:99:aa:bb:cc actions=drop
3050 in_port=2,dl_src=00:55:66:77:88:99 actions=drop
3051 OFPST_FLOW reply (OF1.2):
3052 ])
3053 # Adding another flow will cause the one that expires soonest overall
3054 # to be evicted.
3055 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'idle_timeout=80 in_port=2 dl_src=00:99:aa:bb:cc:dd actions=drop'])
3056 AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0], [dnl
3057 idle_timeout=30, in_port=1,dl_src=00:22:33:44:55:66 actions=drop
3058 idle_timeout=40, in_port=1,dl_src=00:33:44:55:66:77 actions=drop
3059 idle_timeout=50, in_port=2,dl_src=00:66:77:88:99:aa actions=drop
3060 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=drop
3061 idle_timeout=70, in_port=2,dl_src=00:88:99:aa:bb:cc actions=drop
3062 idle_timeout=80, in_port=2,dl_src=00:99:aa:bb:cc:dd actions=drop
3063 in_port=2,dl_src=00:55:66:77:88:99 actions=drop
3064 OFPST_FLOW reply (OF1.2):
3065 ])
3066 # Reducing the flow limit also causes the flows that expire soonest
3067 # overall to be evicted.
3068 AT_CHECK([ovs-vsctl set Flow_Table evict flow-limit=4])
3069 AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0], [dnl
3070 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=drop
3071 idle_timeout=70, in_port=2,dl_src=00:88:99:aa:bb:cc actions=drop
3072 idle_timeout=80, in_port=2,dl_src=00:99:aa:bb:cc:dd actions=drop
3073 in_port=2,dl_src=00:55:66:77:88:99 actions=drop
3074 OFPST_FLOW reply (OF1.2):
3075 ])
3076 OVS_VSWITCHD_STOP
3077 AT_CLEANUP
3078
3079 AT_SETUP([ofproto - eviction upon table overflow, with modified hard timeout])
3080 OVS_VSWITCHD_START
3081 # Configure a maximum of 4 flows.
3082 AT_CHECK(
3083 [ovs-vsctl \
3084 -- --id=@t0 create Flow_Table flow-limit=4 overflow-policy=evict \
3085 -- set bridge br0 flow_tables:0=@t0 \
3086 | uuidfilt],
3087 [0], [<0>
3088 ])
3089 ovs-appctl time/stop
3090 # Add 4 flows.
3091 for in_port in 4 3 2 1; do
3092 ovs-ofctl add-flow br0 hard_timeout=$((10 + in_port * 3)),in_port=$in_port,actions=drop
3093 done
3094 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
3095 hard_timeout=13, in_port=1 actions=drop
3096 hard_timeout=16, in_port=2 actions=drop
3097 hard_timeout=19, in_port=3 actions=drop
3098 hard_timeout=22, in_port=4 actions=drop
3099 NXST_FLOW reply:
3100 ])
3101 # Sleep and modify the one that expires soonest
3102 ovs-appctl time/warp 5000
3103 AT_CHECK([ovs-ofctl mod-flows br0 in_port=1,actions=drop])
3104 # At this point the table would looks like:
3105 # in_port seconds to expire
3106 # 1 13
3107 # 2 11
3108 # 3 14
3109 # 4 17
3110 ovs-appctl time/warp 2000
3111 # Adding another flow will cause the one that expires soonest to be evicted.
3112 AT_CHECK([ovs-ofctl add-flow br0 in_port=5,actions=drop])
3113 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
3114 hard_timeout=13, in_port=1 actions=drop
3115 hard_timeout=19, in_port=3 actions=drop
3116 hard_timeout=22, in_port=4 actions=drop
3117 in_port=5 actions=drop
3118 NXST_FLOW reply:
3119 ])
3120 OVS_VSWITCHD_STOP
3121 AT_CLEANUP
3122
3123 AT_SETUP([ofproto - eviction upon table overflow, with modified idle timeout])
3124 OVS_VSWITCHD_START([add-port br0 p1 -- set interface p1 type=dummy ofport_request=1])
3125 # Configure a maximum of 4 flows.
3126 AT_CHECK(
3127 [ovs-vsctl \
3128 -- --id=@t0 create Flow_Table flow-limit=4 overflow-policy=evict \
3129 -- set bridge br0 flow_tables:0=@t0 \
3130 | uuidfilt],
3131 [0], [<0>
3132 ])
3133 # Add 4 flows.
3134 for in_port in 4 3 2 1; do
3135 ovs-ofctl add-flow br0 idle_timeout=$((10 + in_port * 3)),in_port=$in_port,actions=drop
3136 done
3137 ovs-appctl time/stop
3138 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
3139 idle_timeout=13, in_port=1 actions=drop
3140 idle_timeout=16, in_port=2 actions=drop
3141 idle_timeout=19, in_port=3 actions=drop
3142 idle_timeout=22, in_port=4 actions=drop
3143 NXST_FLOW reply:
3144 ])
3145 # Sleep and receive on the flow that expires soonest
3146 ovs-appctl time/warp 5000
3147 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1)'])
3148 # At this point the table would looks like:
3149 # in_port seconds to expire
3150 # 1 13
3151 # 2 11
3152 # 3 14
3153 # 4 17
3154 ovs-appctl time/warp 2000
3155 # Adding another flow will cause the one that expires soonest to be evicted.
3156 AT_CHECK([ovs-ofctl add-flow br0 in_port=5,actions=drop])
3157 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
3158 idle_timeout=19, in_port=3 actions=drop
3159 idle_timeout=22, in_port=4 actions=drop
3160 in_port=5 actions=drop
3161 n_packets=1, n_bytes=14, idle_timeout=13, in_port=1 actions=drop
3162 NXST_FLOW reply:
3163 ])
3164 OVS_VSWITCHD_STOP
3165 AT_CLEANUP
3166
3167 AT_SETUP([ofproto - asynchronous message control (OpenFlow 1.0)])
3168 OVS_VSWITCHD_START
3169 AT_CHECK([ovs-ofctl -P standard monitor br0 --detach --no-chdir --pidfile])
3170 check_async () {
3171 printf '\n\n--- check_async %d ---\n\n\n' $1
3172 shift
3173
3174 ovs-appctl -t ovs-ofctl ofctl/barrier
3175 ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
3176 : > expout
3177
3178 # OFPT_PACKET_IN, OFPR_ACTION (controller_id=0)
3179 ovs-ofctl -v packet-out br0 controller controller '0001020304050010203040501234'
3180 if test X"$1" = X"OFPR_ACTION"; then shift;
3181 echo >>expout "OFPT_PACKET_IN: total_len=14 in_port=CONTROLLER (via action) data_len=14 (unbuffered)
3182 vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x1234"
3183 fi
3184
3185 # OFPT_PACKET_IN, OFPR_NO_MATCH (controller_id=123)
3186 ovs-ofctl -v packet-out br0 controller 'controller(reason=no_match,id=123)' '0001020304050010203040501234'
3187 if test X"$1" = X"OFPR_NO_MATCH"; then shift;
3188 echo >>expout "OFPT_PACKET_IN: total_len=14 in_port=CONTROLLER (via no_match) data_len=14 (unbuffered)
3189 vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x1234"
3190 fi
3191
3192 # OFPT_PACKET_IN, OFPR_INVALID_TTL (controller_id=0)
3193 ovs-ofctl packet-out br0 "in_port=controller packet=002583dfb4000026b98cb0f908004500003eb7e200000011339bac11370dac100002d7730035002b8f6d86fb0100000100000000000006626c702d7873066e696369726103636f6d00000f00 actions=dec_ttl"
3194 if test X"$1" = X"OFPR_INVALID_TTL"; then shift;
3195 echo >>expout "OFPT_PACKET_IN: total_len=76 in_port=CONTROLLER (via invalid_ttl) data_len=76 (unbuffered)
3196 udp,vlan_tci=0x0000,dl_src=00:26:b9:8c:b0:f9,dl_dst=00:25:83:df:b4:00,nw_src=172.17.55.13,nw_dst=172.16.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=55155,tp_dst=53 udp_csum:8f6d"
3197 fi
3198
3199 # OFPT_PORT_STATUS, OFPPR_ADD
3200 ovs-vsctl add-port br0 test -- set Interface test type=dummy ofport_request=1
3201 if test X"$1" = X"OFPPR_ADD"; then shift;
3202 echo >>expout "OFPT_PORT_STATUS: ADD: 1(test): addr:aa:55:aa:55:00:0x
3203 config: PORT_DOWN
3204 state: LINK_DOWN
3205 speed: 0 Mbps now, 0 Mbps max"
3206 fi
3207
3208 # OFPT_PORT_STATUS, OFPPR_DELETE
3209 ovs-vsctl del-port br0 test
3210 if test X"$1" = X"OFPPR_DELETE"; then shift;
3211 echo >>expout "OFPT_PORT_STATUS: DEL: 1(test): addr:aa:55:aa:55:00:0x
3212 config: PORT_DOWN
3213 state: LINK_DOWN
3214 speed: 0 Mbps now, 0 Mbps max"
3215 fi
3216
3217 # OFPT_FLOW_REMOVED, OFPRR_DELETE
3218 ovs-ofctl add-flow br0 send_flow_rem,actions=drop
3219 ovs-ofctl --strict del-flows br0 ''
3220 if test X"$1" = X"OFPRR_DELETE"; then shift;
3221 echo >>expout "OFPT_FLOW_REMOVED: reason=delete"
3222 fi
3223 AT_FAIL_IF([test X"$1" != X])
3224
3225 OVS_WAIT_UNTIL([test `wc -l < "monitor.log"` -ge `wc -l < "expout"`])
3226
3227 AT_CHECK(
3228 [[sed '
3229 s/ (xid=0x[0-9a-fA-F]*)//
3230 s/ *duration.*//
3231 s/00:0.$/00:0x/' < monitor.log]],
3232 [0], [expout])
3233 }
3234
3235 # It's a service connection so initially there should be no async messages.
3236 check_async 1
3237
3238 # Set miss_send_len to 128, turning on packet-ins for our service connection.
3239 ovs-appctl -t ovs-ofctl ofctl/send 0109000c0123456700000080
3240 check_async 2 OFPR_ACTION OFPPR_ADD OFPPR_DELETE OFPRR_DELETE
3241
3242 # Set miss_send_len to 128 and enable invalid_ttl.
3243 ovs-appctl -t ovs-ofctl ofctl/send 0109000c0123456700040080
3244 check_async 3 OFPR_ACTION OFPR_INVALID_TTL OFPPR_ADD OFPPR_DELETE OFPRR_DELETE
3245
3246 # Become slave, which should disable everything except port status.
3247 ovs-appctl -t ovs-ofctl ofctl/send 0104001400000002000023200000000a00000002
3248 check_async 4 OFPPR_ADD OFPPR_DELETE
3249
3250 # Use NXT_SET_ASYNC_CONFIG to enable a patchwork of asynchronous messages.
3251 ovs-appctl -t ovs-ofctl ofctl/send 01040028000000020000232000000013000000020000000500000005000000020000000200000005
3252 check_async 5 OFPR_INVALID_TTL OFPPR_DELETE OFPRR_DELETE
3253
3254 # Set controller ID 123.
3255 ovs-appctl -t ovs-ofctl ofctl/send 01040018000000030000232000000014000000000000007b
3256 check_async 6 OFPR_NO_MATCH OFPPR_DELETE OFPRR_DELETE
3257
3258 # Restore controller ID 0.
3259 ovs-appctl -t ovs-ofctl ofctl/send 010400180000000300002320000000140000000000000000
3260
3261 # Become master.
3262 ovs-appctl -t ovs-ofctl ofctl/send 0104001400000002000023200000000a00000001
3263 check_async 7 OFPR_ACTION OFPPR_ADD
3264
3265 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
3266 OVS_VSWITCHD_STOP
3267 AT_CLEANUP
3268
3269 AT_SETUP([ofproto - asynchronous message control (OpenFlow 1.2)])
3270 OVS_VSWITCHD_START
3271 AT_CHECK([ovs-ofctl -O OpenFlow12 -P standard monitor br0 --detach --no-chdir --pidfile])
3272 check_async () {
3273 printf '\n\n--- check_async %d ---\n\n\n' $1
3274 INDEX=$1
3275 shift
3276
3277 ovs-appctl -t ovs-ofctl ofctl/barrier
3278 ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
3279 : > expout
3280
3281 # OFPT_PACKET_IN, OFPR_ACTION (controller_id=0)
3282 ovs-ofctl -O OpenFlow12 -v packet-out br0 none controller '0001020304050010203040501234'
3283 if test X"$1" = X"OFPR_ACTION"; then shift;
3284 echo >>expout "OFPT_PACKET_IN (OF1.2): total_len=14 in_port=ANY (via action) data_len=14 (unbuffered)
3285 vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x1234"
3286 fi
3287
3288 # OFPT_PACKET_IN, OFPR_NO_MATCH (controller_id=123)
3289 ovs-ofctl -O OpenFlow12 -v packet-out br0 none 'controller(reason=no_match,id=123)' '0001020304050010203040501234'
3290 if test X"$1" = X"OFPR_NO_MATCH"; then shift;
3291 echo >>expout "OFPT_PACKET_IN (OF1.2): total_len=14 in_port=ANY (via no_match) data_len=14 (unbuffered)
3292 vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x1234"
3293 fi
3294
3295 # OFPT_PACKET_IN, OFPR_INVALID_TTL (controller_id=0)
3296 ovs-ofctl -O OpenFlow12 packet-out br0 none dec_ttl '002583dfb4000026b98cb0f908004500003eb7e200000011339bac11370dac100002d7730035002b8f6d86fb0100000100000000000006626c702d7873066e696369726103636f6d00000f00'
3297 if test X"$1" = X"OFPR_INVALID_TTL"; then shift;
3298 echo >>expout "OFPT_PACKET_IN (OF1.2): total_len=76 in_port=ANY (via invalid_ttl) data_len=76 (unbuffered)
3299 udp,vlan_tci=0x0000,dl_src=00:26:b9:8c:b0:f9,dl_dst=00:25:83:df:b4:00,nw_src=172.17.55.13,nw_dst=172.16.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=55155,tp_dst=53 udp_csum:8f6d"
3300 fi
3301
3302 # OFPT_PORT_STATUS, OFPPR_ADD
3303 ovs-vsctl add-port br0 test -- set Interface test type=dummy
3304 if test X"$1" = X"OFPPR_ADD"; then shift;
3305 echo >>expout "OFPT_PORT_STATUS (OF1.2): ADD: ${INDEX}(test): addr:aa:55:aa:55:00:0x
3306 config: PORT_DOWN
3307 state: LINK_DOWN
3308 speed: 0 Mbps now, 0 Mbps max"
3309 fi
3310
3311 # OFPT_PORT_STATUS, OFPPR_DELETE
3312 ovs-vsctl del-port br0 test
3313 if test X"$1" = X"OFPPR_DELETE"; then shift;
3314 echo >>expout "OFPT_PORT_STATUS (OF1.2): DEL: ${INDEX}(test): addr:aa:55:aa:55:00:0x
3315 config: PORT_DOWN
3316 state: LINK_DOWN
3317 speed: 0 Mbps now, 0 Mbps max"
3318 fi
3319
3320 # OFPT_FLOW_REMOVED, OFPRR_DELETE
3321 ovs-ofctl -O OpenFlow12 add-flow br0 send_flow_rem,actions=drop
3322 ovs-ofctl -O OpenFlow12 --strict del-flows br0 ''
3323 if test X"$1" = X"OFPRR_DELETE"; then shift;
3324 echo >>expout "OFPT_FLOW_REMOVED (OF1.2): reason=delete table_id=0"
3325 fi
3326 AT_FAIL_IF([test X"$1" != X])
3327
3328 OVS_WAIT_UNTIL([test `wc -l < "monitor.log"` -ge `wc -l < "expout"`])
3329
3330 AT_CHECK(
3331 [[sed '
3332 s/ (xid=0x[0-9a-fA-F]*)//
3333 s/ *duration.*//
3334 s/00:0.$/00:0x/' < monitor.log]],
3335 [0], [expout])
3336 }
3337
3338 # It's a service connection so initially there should be no async messages.
3339 check_async 1
3340
3341 # Set miss_send_len to 128, turning on packet-ins for our service connection.
3342 ovs-appctl -t ovs-ofctl ofctl/send 0309000c0123456700000080
3343 check_async 2 OFPR_ACTION OFPPR_ADD OFPPR_DELETE OFPRR_DELETE
3344
3345 # Set miss_send_len to 128 and enable invalid_ttl.
3346 ovs-appctl -t ovs-ofctl ofctl/send 0309000c0123456700040080
3347 check_async 3 OFPR_ACTION OFPR_INVALID_TTL OFPPR_ADD OFPPR_DELETE OFPRR_DELETE
3348
3349 # Become slave (OF 1.2), which should disable everything except port status.
3350 ovs-appctl -t ovs-ofctl ofctl/send 031800180000000200000003000000000000000000000001
3351 check_async 4 OFPPR_ADD OFPPR_DELETE
3352
3353 # Use NXT_SET_ASYNC_CONFIG to enable a patchwork of asynchronous messages.
3354 ovs-appctl -t ovs-ofctl ofctl/send 03040028000000020000232000000013000000020000000500000005000000020000000200000005
3355 check_async 5 OFPR_INVALID_TTL OFPPR_DELETE OFPRR_DELETE
3356
3357 # Set controller ID 123.
3358 ovs-appctl -t ovs-ofctl ofctl/send 03040018000000030000232000000014000000000000007b
3359 check_async 6 OFPR_NO_MATCH OFPPR_DELETE OFPRR_DELETE
3360
3361 # Restore controller ID 0.
3362 ovs-appctl -t ovs-ofctl ofctl/send 030400180000000300002320000000140000000000000000
3363
3364 # Become master (OF 1.2).
3365 ovs-appctl -t ovs-ofctl ofctl/send 031800180000000400000002000000000000000000000002
3366 check_async 7 OFPR_ACTION OFPPR_ADD
3367
3368 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
3369 OVS_VSWITCHD_STOP
3370 AT_CLEANUP
3371
3372 AT_SETUP([ofproto - asynchronous message control (OpenFlow 1.3)])
3373 OVS_VSWITCHD_START([dnl
3374 add-port br0 p1 -- set Interface p1 type=dummy ofport_request=10
3375 ])
3376 AT_CHECK([ovs-ofctl -O OpenFlow13 -P standard monitor br0 --detach --no-chdir --pidfile])
3377 check_async () {
3378 printf '\n\n--- check_async %d ---\n\n\n' $1
3379 INDEX=$1
3380 shift
3381
3382 ovs-appctl -t ovs-ofctl ofctl/barrier
3383 ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
3384 : > expout
3385
3386 # OFPT_PACKET_IN, OFPR_ACTION (controller_id=0)
3387 # OFPR_ACTION_SET is treated as OFPR_ACTION in OpenFlow 1.3
3388 ovs-ofctl -O OpenFlow13 -v packet-out br0 none controller '0001020304050010203040501234'
3389 ovs-ofctl -O OpenFlow13 add-flow br0 'in_port=10 actions=write_actions(output(CONTROLLER))'
3390 ovs-appctl netdev-dummy/receive p1 'in_port(10),eth(src=00:10:20:30:40:50,dst=00:01:02:03:04:05),eth_type(0x1234)'
3391 if test X"$1" = X"OFPR_ACTION"; then shift;
3392 echo >>expout "OFPT_PACKET_IN (OF1.3): total_len=14 in_port=ANY (via action) data_len=14 (unbuffered)
3393 vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x1234"
3394 echo >>expout "OFPT_PACKET_IN (OF1.3): cookie=0x0 total_len=14 in_port=10 (via action) data_len=14 (unbuffered)
3395 vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x1234"
3396 fi
3397
3398 # OFPT_PACKET_IN, OFPR_NO_MATCH (controller_id=123)
3399 ovs-ofctl -O OpenFlow13 -v packet-out br0 none 'controller(reason=no_match,id=123)' '0001020304050010203040501234'
3400 if test X"$1" = X"OFPR_NO_MATCH"; then shift;
3401 echo >>expout "OFPT_PACKET_IN (OF1.3): total_len=14 in_port=ANY (via no_match) data_len=14 (unbuffered)
3402 vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x1234"
3403 fi
3404
3405 # OFPT_PACKET_IN, OFPR_INVALID_TTL (controller_id=0)
3406 ovs-ofctl -O OpenFlow13 packet-out br0 none dec_ttl '002583dfb4000026b98cb0f908004500003eb7e200000011339bac11370dac100002d7730035002b8f6d86fb0100000100000000000006626c702d7873066e696369726103636f6d00000f00'
3407 if test X"$1" = X"OFPR_INVALID_TTL"; then shift;
3408 echo >>expout "OFPT_PACKET_IN (OF1.3): total_len=76 in_port=ANY (via invalid_ttl) data_len=76 (unbuffered)
3409 udp,vlan_tci=0x0000,dl_src=00:26:b9:8c:b0:f9,dl_dst=00:25:83:df:b4:00,nw_src=172.17.55.13,nw_dst=172.16.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=55155,tp_dst=53 udp_csum:8f6d"
3410 fi
3411
3412 # OFPT_PORT_STATUS, OFPPR_ADD
3413 ovs-vsctl add-port br0 test -- set Interface test type=dummy
3414 if test X"$1" = X"OFPPR_ADD"; then shift;
3415 echo >>expout "OFPT_PORT_STATUS (OF1.3): ADD: ${INDEX}(test): addr:aa:55:aa:55:00:0x
3416 config: PORT_DOWN
3417 state: LINK_DOWN
3418 speed: 0 Mbps now, 0 Mbps max"
3419 fi
3420
3421 # OFPT_PORT_STATUS, OFPPR_DELETE
3422 ovs-vsctl del-port br0 test
3423 if test X"$1" = X"OFPPR_DELETE"; then shift;
3424 echo >>expout "OFPT_PORT_STATUS (OF1.3): DEL: ${INDEX}(test): addr:aa:55:aa:55:00:0x
3425 config: PORT_DOWN
3426 state: LINK_DOWN
3427 speed: 0 Mbps now, 0 Mbps max"
3428 fi
3429
3430 # OFPT_FLOW_REMOVED, OFPRR_DELETE
3431 ovs-ofctl -O OpenFlow13 add-flow br0 send_flow_rem,actions=drop
3432 ovs-ofctl -O OpenFlow13 --strict del-flows br0 ''
3433 if test X"$1" = X"OFPRR_DELETE"; then shift;
3434 echo >>expout "OFPT_FLOW_REMOVED (OF1.3): reason=delete table_id=0"
3435 fi
3436
3437 # OFPT_FLOW_REMOVED, OFPRR_GROUP_DELETE
3438 ovs-ofctl -O OpenFlow13 add-group br0 group_id=1234,type=all,bucket=output:10
3439 ovs-ofctl -O OpenFlow13 add-flow br0 send_flow_rem,actions=group:1234
3440 ovs-ofctl -O OpenFlow13 --strict del-groups br0 group_id=1234
3441 if test X"$1" = X"OFPRR_GROUP_DELETE"; then shift;
3442 echo >>expout "OFPT_FLOW_REMOVED (OF1.3): reason=group_delete table_id=0"
3443 fi
3444
3445 AT_FAIL_IF([test X"$1" != X])
3446
3447 OVS_WAIT_UNTIL([test `wc -l < "monitor.log"` -ge `wc -l < "expout"`])
3448
3449 AT_CHECK(
3450 [[sed '
3451 s/ (xid=0x[0-9a-fA-F]*)//
3452 s/ *duration.*//
3453 s/00:0.$/00:0x/' < monitor.log]],
3454 [0], [expout])
3455 }
3456
3457 # It's a service connection so initially there should be no async messages.
3458 check_async 1
3459
3460 # Set miss_send_len to 128, turning on packet-ins for our service connection.
3461 ovs-appctl -t ovs-ofctl ofctl/send 0409000c0123456700000080
3462 check_async 2 OFPR_ACTION OFPPR_ADD OFPPR_DELETE OFPRR_DELETE OFPRR_GROUP_DELETE
3463
3464 # Become slave (OF 1.3), which should disable everything except port status.
3465 ovs-appctl -t ovs-ofctl ofctl/send 041800180000000200000003000000000000000000000001
3466 check_async 3 OFPPR_ADD OFPPR_DELETE
3467
3468 # Use OF 1.3 OFPT_SET_ASYNC to enable a patchwork of asynchronous messages.
3469 ovs-appctl -t ovs-ofctl ofctl/send 041c00200000000200000002000000050000000500000002000000020000000d
3470 check_async 4 OFPR_INVALID_TTL OFPPR_DELETE OFPRR_DELETE OFPRR_GROUP_DELETE
3471
3472 # Set controller ID 123.
3473 ovs-appctl -t ovs-ofctl ofctl/send 04040018000000030000232000000014000000000000007b
3474 check_async 5 OFPR_NO_MATCH OFPPR_DELETE OFPRR_DELETE OFPRR_GROUP_DELETE
3475
3476 # Restore controller ID 0.
3477 ovs-appctl -t ovs-ofctl ofctl/send 040400180000000300002320000000140000000000000000
3478
3479 # Become master (OF 1.3).
3480 ovs-appctl -t ovs-ofctl ofctl/send 041800180000000400000002000000000000000000000002
3481 check_async 6 OFPR_ACTION OFPPR_ADD
3482
3483 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
3484 OVS_VSWITCHD_STOP
3485 AT_CLEANUP
3486
3487 AT_SETUP([ofproto - asynchronous message control (OpenFlow 1.4)])
3488 OVS_VSWITCHD_START([dnl
3489 add-port br0 p1 -- set Interface p1 type=dummy ofport_request=10
3490 ])
3491 AT_CHECK([ovs-ofctl -O OpenFlow14 -P standard monitor br0 --detach --no-chdir --pidfile])
3492 check_async () {
3493 printf '\n\n--- check_async %d ---\n\n\n' $1
3494 INDEX=$1
3495 shift
3496
3497 ovs-appctl -t ovs-ofctl ofctl/barrier
3498 ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
3499 : > expout
3500
3501 # OFPT_PACKET_IN, OFPR_PACKET_OUT (controller_id=0)
3502 ovs-ofctl -O OpenFlow14 -v packet-out br0 none controller '0001020304050010203040501234'
3503 if test X"$1" = X"OFPR_PACKET_OUT"; then shift;
3504 echo >>expout "OFPT_PACKET_IN (OF1.4): total_len=14 in_port=ANY (via packet_out) data_len=14 (unbuffered)
3505 vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x1234"
3506 fi
3507
3508 # OFPT_PACKET_IN, OFPR_ACTION_SET (controller_id=0)
3509 ovs-ofctl -O OpenFlow14 add-flow br0 'in_port=10 actions=write_actions(output(CONTROLLER))'
3510 ovs-appctl netdev-dummy/receive p1 'in_port(10),eth(src=00:10:20:30:40:50,dst=00:01:02:03:04:05),eth_type(0x1234)'
3511 if test X"$1" = X"OFPR_ACTION_SET"; then shift;
3512 echo >>expout "OFPT_PACKET_IN (OF1.4): cookie=0x0 total_len=14 in_port=10 (via action_set) data_len=14 (unbuffered)
3513 vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x1234"
3514 fi
3515
3516 # OFPT_PACKET_IN, OFPR_NO_MATCH (controller_id=123)
3517 ovs-ofctl -O OpenFlow14 -v packet-out br0 none 'controller(reason=no_match,id=123)' '0001020304050010203040501234'
3518 if test X"$1" = X"OFPR_NO_MATCH"; then shift;
3519 echo >>expout "OFPT_PACKET_IN (OF1.4): total_len=14 in_port=ANY (via no_match) data_len=14 (unbuffered)
3520 vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x1234"
3521 fi
3522
3523 # OFPT_PACKET_IN, OFPR_INVALID_TTL (controller_id=0)
3524 ovs-ofctl -O OpenFlow14 packet-out br0 none dec_ttl '002583dfb4000026b98cb0f908004500003eb7e200000011339bac11370dac100002d7730035002b8f6d86fb0100000100000000000006626c702d7873066e696369726103636f6d00000f00'
3525 if test X"$1" = X"OFPR_INVALID_TTL"; then shift;
3526 echo >>expout "OFPT_PACKET_IN (OF1.4): total_len=76 in_port=ANY (via invalid_ttl) data_len=76 (unbuffered)
3527 udp,vlan_tci=0x0000,dl_src=00:26:b9:8c:b0:f9,dl_dst=00:25:83:df:b4:00,nw_src=172.17.55.13,nw_dst=172.16.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=55155,tp_dst=53 udp_csum:8f6d"
3528 fi
3529
3530 # OFPT_PORT_STATUS, OFPPR_ADD
3531 ovs-vsctl add-port br0 test -- set Interface test type=dummy
3532 if test X"$1" = X"OFPPR_ADD"; then shift;
3533 echo >>expout "OFPT_PORT_STATUS (OF1.4): ADD: ${INDEX}(test): addr:aa:55:aa:55:00:0x
3534 config: PORT_DOWN
3535 state: LINK_DOWN
3536 speed: 0 Mbps now, 0 Mbps max"
3537 fi
3538
3539 # OFPT_PORT_STATUS, OFPPR_MODIFY
3540 ovs-ofctl -O OpenFlow14 -vwarn mod-port br0 test up
3541 if test X"$1" = X"OFPPR_MODIFY"; then shift;
3542 echo >>expout "OFPT_PORT_STATUS (OF1.4): MOD: ${INDEX}(test): addr:aa:55:aa:55:00:0x
3543 config: 0
3544 state: LINK_DOWN
3545 speed: 0 Mbps now, 0 Mbps max
3546 OFPT_PORT_STATUS (OF1.4): MOD: ${INDEX}(test): addr:aa:55:aa:55:00:0x
3547 config: 0
3548 state: LIVE
3549 speed: 0 Mbps now, 0 Mbps max"
3550 fi
3551
3552 # OFPT_PORT_STATUS, OFPPR_DELETE
3553 ovs-vsctl del-port br0 test
3554 if test X"$1" = X"OFPPR_DELETE"; then shift;
3555 echo >>expout "OFPT_PORT_STATUS (OF1.4): DEL: ${INDEX}(test): addr:aa:55:aa:55:00:0x
3556 config: 0
3557 state: LIVE
3558 speed: 0 Mbps now, 0 Mbps max"
3559 fi
3560
3561 # OFPT_FLOW_REMOVED, OFPRR_DELETE
3562 ovs-ofctl -O OpenFlow14 add-flow br0 send_flow_rem,actions=drop
3563 ovs-ofctl -O OpenFlow14 --strict del-flows br0 ''
3564 if test X"$1" = X"OFPRR_DELETE"; then shift;
3565 echo >>expout "OFPT_FLOW_REMOVED (OF1.4): reason=delete table_id=0"
3566 fi
3567
3568 # OFPT_FLOW_REMOVED, OFPRR_GROUP_DELETE
3569 ovs-ofctl -O OpenFlow14 add-group br0 group_id=1234,type=all,bucket=output:10
3570 ovs-ofctl -O OpenFlow14 add-flow br0 send_flow_rem,actions=group:1234
3571 ovs-ofctl -O OpenFlow14 --strict del-groups br0 group_id=1234
3572 if test X"$1" = X"OFPRR_GROUP_DELETE"; then shift;
3573 echo >>expout "OFPT_FLOW_REMOVED (OF1.4): reason=group_delete table_id=0"
3574 fi
3575
3576 # OFPT_TABLE_STATUS, OFPTR_VACANCY_UP
3577 if test X"$1" = X"OFPTR_VACANCY_UP"; then shift;
3578 ovs-vsctl -- --id=@t1 create Flow_Table flow-limit=10 -- set bridge br0 flow_tables:1=@t1
3579
3580 # Turn on vacancy events, then add flows until we're full.
3581 # With initial vacancy of 100% and vacancy_up of 80%, so that
3582 # vacancy >= vacancy_up, this enables VACANY_DOWN events, so
3583 # we get a single such message when vacancy dips below 20%.
3584 ovs-ofctl -O OpenFlow14 mod-table br0 1 vacancy:20,80
3585 ovs-ofctl -O OpenFlow14 add-flow br0 table=1,in_port=1,actions=2
3586 ovs-ofctl -O OpenFlow14 add-flow br0 table=1,in_port=2,actions=2
3587 ovs-ofctl -O OpenFlow14 add-flow br0 table=1,in_port=3,actions=2
3588 ovs-ofctl -O OpenFlow14 add-flow br0 table=1,in_port=4,actions=2
3589 ovs-ofctl -O OpenFlow14 add-flow br0 table=1,in_port=5,actions=2
3590 ovs-ofctl -O OpenFlow14 add-flow br0 table=1,in_port=6,actions=2
3591 ovs-ofctl -O OpenFlow14 add-flow br0 table=1,in_port=7,actions=2
3592 ovs-ofctl -O OpenFlow14 add-flow br0 table=1,in_port=8,actions=2
3593 ovs-ofctl -O OpenFlow14 add-flow br0 table=1,in_port=9,actions=2
3594 ovs-ofctl -O OpenFlow14 add-flow br0 table=1,in_port=10,actions=2
3595 echo >>expout "OFPT_TABLE_STATUS (OF1.4): reason=VACANCY_DOWN
3596 table_desc:-
3597 table 1:
3598 eviction=off eviction_flags=OTHER|IMPORTANCE|LIFETIME
3599 vacancy=on vacancy_down=20% vacancy_up=80% vacancy=10%"
3600 # Then delete flows until we're empty. Sending the
3601 # VACANCY_DOWN message enabled VACANCY_UP events, so we get a
3602 # single such message when vacancy rises above 80%.
3603 ovs-ofctl -O OpenFlow14 del-flows br0 table=1,in_port=1
3604 ovs-ofctl -O OpenFlow14 del-flows br0 table=1,in_port=2
3605 ovs-ofctl -O OpenFlow14 del-flows br0 table=1,in_port=3
3606 ovs-ofctl -O OpenFlow14 del-flows br0 table=1,in_port=4
3607 ovs-ofctl -O OpenFlow14 del-flows br0 table=1,in_port=5
3608 ovs-ofctl -O OpenFlow14 del-flows br0 table=1,in_port=6
3609 ovs-ofctl -O OpenFlow14 del-flows br0 table=1,in_port=7
3610 ovs-ofctl -O OpenFlow14 del-flows br0 table=1,in_port=8
3611 ovs-ofctl -O OpenFlow14 del-flows br0 table=1,in_port=9
3612 ovs-ofctl -O OpenFlow14 del-flows br0 table=1,in_port=10
3613 echo >>expout "OFPT_TABLE_STATUS (OF1.4): reason=VACANCY_UP
3614 table_desc:-
3615 table 1:
3616 eviction=off eviction_flags=OTHER|IMPORTANCE|LIFETIME
3617 vacancy=on vacancy_down=20% vacancy_up=80% vacancy=90%"
3618
3619 # Now approach vacancy from the other direction. First
3620 # disable vacancy events. With initial vacancy of 70%, so
3621 # that vacancy < vacancy_up, this enables VACANCY_UP events.
3622 # That means that filling up the table generates no message,
3623 # but deleting all the flows generates VACANCY_UP at the point
3624 # vacancy rises above 80%.
3625 ovs-ofctl -O OpenFlow14 mod-table br0 1 novacancy
3626 ovs-ofctl -O OpenFlow14 add-flow br0 table=1,in_port=1,actions=2
3627 ovs-ofctl -O OpenFlow14 add-flow br0 table=1,in_port=2,actions=2
3628 ovs-ofctl -O OpenFlow14 add-flow br0 table=1,in_port=3,actions=2
3629 ovs-ofctl -O OpenFlow14 mod-table br0 1 vacancy:20,80
3630 ovs-ofctl -O OpenFlow14 add-flow br0 table=1,in_port=4,actions=2
3631 ovs-ofctl -O OpenFlow14 add-flow br0 table=1,in_port=5,actions=2
3632 ovs-ofctl -O OpenFlow14 add-flow br0 table=1,in_port=6,actions=2
3633 ovs-ofctl -O OpenFlow14 add-flow br0 table=1,in_port=7,actions=2
3634 ovs-ofctl -O OpenFlow14 add-flow br0 table=1,in_port=8,actions=2
3635 ovs-ofctl -O OpenFlow14 add-flow br0 table=1,in_port=9,actions=2
3636 ovs-ofctl -O OpenFlow14 add-flow br0 table=1,in_port=10,actions=2
3637 ovs-ofctl -O OpenFlow14 del-flows br0 table=1,in_port=1
3638 ovs-ofctl -O OpenFlow14 del-flows br0 table=1,in_port=2
3639 ovs-ofctl -O OpenFlow14 del-flows br0 table=1,in_port=3
3640 ovs-ofctl -O OpenFlow14 del-flows br0 table=1,in_port=4
3641 ovs-ofctl -O OpenFlow14 del-flows br0 table=1,in_port=5
3642 ovs-ofctl -O OpenFlow14 del-flows br0 table=1,in_port=6
3643 ovs-ofctl -O OpenFlow14 del-flows br0 table=1,in_port=7
3644 ovs-ofctl -O OpenFlow14 del-flows br0 table=1,in_port=8
3645 ovs-ofctl -O OpenFlow14 del-flows br0 table=1,in_port=9
3646 ovs-ofctl -O OpenFlow14 del-flows br0 table=1,in_port=10
3647 echo >>expout "OFPT_TABLE_STATUS (OF1.4): reason=VACANCY_UP
3648 table_desc:-
3649 table 1:
3650 eviction=off eviction_flags=OTHER|IMPORTANCE|LIFETIME
3651 vacancy=on vacancy_down=20% vacancy_up=80% vacancy=90%"
3652 fi
3653
3654 AT_FAIL_IF([test X"$1" != X])
3655
3656 OVS_WAIT_UNTIL([test `wc -l < "monitor.log"` -ge `wc -l < "expout"`])
3657
3658 AT_CHECK(
3659 [[sed '
3660 s/ (xid=0x[0-9a-fA-F]*)//
3661 s/ *duration.*//
3662 s/00:0.$/00:0x/' < monitor.log]],
3663 [0], [expout])
3664 }
3665
3666 # It's a service connection so initially there should be no async messages.
3667 check_async 1
3668
3669 # Set miss_send_len to 128, turning on packet-ins for our service connection.
3670 ovs-appctl -t ovs-ofctl ofctl/send 0509000c0123456700000080
3671 check_async 2 OFPR_PACKET_OUT OFPR_ACTION_SET OFPPR_ADD OFPPR_MODIFY OFPPR_DELETE OFPRR_DELETE OFPRR_GROUP_DELETE
3672
3673 # Become slave (OF 1.4), which should disable everything except port status.
3674 ovs-appctl -t ovs-ofctl ofctl/send 051800180000000200000003000000000000000000000001
3675 check_async 3 OFPPR_ADD OFPPR_MODIFY OFPPR_DELETE
3676
3677 # Use OF 1.4 OFPT_SET_ASYNC to enable a patchwork of asynchronous messages.
3678 ovs-appctl -t ovs-ofctl ofctl/send 051c0040000000020000000800000005000100080000002000020008000000020003000800000005000400080000001c00050008000000050008000800000018
3679 check_async 4 OFPR_INVALID_TTL OFPPR_DELETE OFPRR_DELETE OFPRR_GROUP_DELETE OFPTR_VACANCY_UP
3680
3681 # Set controller ID 123.
3682 ovs-appctl -t ovs-ofctl ofctl/send 05040018000000030000232000000014000000000000007b
3683 check_async 5 OFPR_NO_MATCH OFPPR_DELETE OFPRR_DELETE OFPRR_GROUP_DELETE
3684
3685 # Restore controller ID 0.
3686 ovs-appctl -t ovs-ofctl ofctl/send 050400180000000300002320000000140000000000000000
3687
3688 # Become master (OF 1.4).
3689 ovs-appctl -t ovs-ofctl ofctl/send 051800180000000400000002000000000000000000000002
3690 check_async 6 OFPR_PACKET_OUT OFPPR_ADD OFPPR_MODIFY OFPRR_DELETE
3691
3692 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
3693 OVS_VSWITCHD_STOP
3694 AT_CLEANUP
3695
3696 AT_SETUP([ofproto - asynchronous message control (OpenFlow 1.5)])
3697 OVS_VSWITCHD_START
3698 AT_CHECK([ovs-ofctl -O OpenFlow15 -P standard monitor br0 --detach --no-chdir --pidfile])
3699 check_async () {
3700 printf '\n\n--- check_async %d ---\n\n\n' $1
3701 INDEX=$1
3702 shift
3703
3704 ovs-appctl -t ovs-ofctl ofctl/barrier
3705 ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
3706 : > expout
3707
3708 # Other tests are not working with OF 1.5, and message
3709 # format may change, so leave them out.
3710
3711 # OFPT_PORT_STATUS, OFPPR_ADD
3712 ovs-vsctl add-port br0 test -- set Interface test type=dummy
3713 if test X"$1" = X"OFPPR_ADD"; then shift;
3714 echo >>expout "OFPT_PORT_STATUS (OF1.5): ADD: ${INDEX}(test): addr:aa:55:aa:55:00:0x
3715 config: PORT_DOWN
3716 state: LINK_DOWN
3717 speed: 0 Mbps now, 0 Mbps max"
3718 fi
3719
3720 # OFPT_PORT_STATUS, OFPPR_MODIFY
3721 ovs-ofctl -O OpenFlow15 -vwarn mod-port br0 test up
3722 if test X"$1" = X"OFPPR_MODIFY"; then shift;
3723 echo >>expout "OFPT_PORT_STATUS (OF1.5): MOD: ${INDEX}(test): addr:aa:55:aa:55:00:0x
3724 config: 0
3725 state: LINK_DOWN
3726 speed: 0 Mbps now, 0 Mbps max
3727 OFPT_PORT_STATUS (OF1.5): MOD: 2(test): addr:aa:55:aa:55:00:0x
3728 config: 0
3729 state: LIVE
3730 speed: 0 Mbps now, 0 Mbps max"
3731 fi
3732
3733 # OFPT_PORT_STATUS, OFPPR_DELETE
3734 ovs-vsctl del-port br0 test
3735 if test X"$1" = X"OFPPR_DELETE"; then shift;
3736 echo >>expout "OFPT_PORT_STATUS (OF1.5): DEL: ${INDEX}(test): addr:aa:55:aa:55:00:0x
3737 config: 0
3738 state: LIVE
3739 speed: 0 Mbps now, 0 Mbps max"
3740 fi
3741
3742 AT_FAIL_IF([test X"$1" != X])
3743
3744 OVS_WAIT_UNTIL([test `wc -l < "monitor.log"` -ge `wc -l < "expout"`])
3745
3746 AT_CHECK(
3747 [[sed '
3748 s/ (xid=0x[0-9a-fA-F]*)//
3749 s/ *duration.*//
3750 s/00:0.$/00:0x/' < monitor.log]],
3751 [0], [expout])
3752 }
3753
3754 # It's a service connection so initially there should be no async messages.
3755 check_async 1
3756
3757 # If we don't set this, async messages are not received.
3758 # Set miss_send_len to 128, turning on packet-ins for our service connection.
3759 ovs-appctl -t ovs-ofctl ofctl/send 0609000c0123456700000080
3760 check_async 2 OFPPR_ADD OFPPR_MODIFY OFPPR_DELETE
3761
3762 # Set-async has changed in OF 1.4 and is not yet implemented.
3763
3764 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
3765 OVS_VSWITCHD_STOP
3766 AT_CLEANUP
3767
3768 dnl This test checks that the role request/response messaging works
3769 dnl and that generation_id is handled properly.
3770 AT_SETUP([ofproto - controller role (OpenFlow 1.2)])
3771 OVS_VSWITCHD_START
3772 on_exit 'kill `cat c1.pid c2.pid`'
3773
3774 # Start two ovs-ofctl controller processes.
3775 AT_CAPTURE_FILE([monitor1.log])
3776 AT_CAPTURE_FILE([expout1])
3777 AT_CAPTURE_FILE([experr1])
3778 AT_CAPTURE_FILE([monitor2.log])
3779 AT_CAPTURE_FILE([expout2])
3780 AT_CAPTURE_FILE([experr2])
3781 for i in 1 2; do
3782 AT_CHECK([ovs-ofctl -O OpenFlow12 monitor br0 --detach --no-chdir --pidfile=c$i.pid --unixctl=c$i])
3783 ovs-appctl -t `pwd`/c$i ofctl/barrier
3784 ovs-appctl -t `pwd`/c$i ofctl/set-output-file monitor$i.log
3785 : > expout$i
3786 : > experr$i
3787
3788 # find out current role
3789 ovs-appctl -t `pwd`/c$i ofctl/send 031800180000000200000000000000000000000000000000
3790 echo >>experr$i "send: OFPT_ROLE_REQUEST (OF1.2): role=nochange"
3791 echo >>expout$i "OFPT_ROLE_REPLY (OF1.2): role=equal"
3792 done
3793
3794 # controller 1: Become slave (generation_id is initially undefined, so
3795 # 2^63+2 should not be stale)
3796 ovs-appctl -t `pwd`/c1 ofctl/send 031800180000000300000003000000008000000000000002
3797 echo >>experr1 "send: OFPT_ROLE_REQUEST (OF1.2): role=slave generation_id=9223372036854775810"
3798 echo >>expout1 "OFPT_ROLE_REPLY (OF1.2): role=slave generation_id=9223372036854775810"
3799
3800 # controller 2: Become master.
3801 ovs-appctl -t `pwd`/c2 ofctl/send 031800180000000300000002000000008000000000000003
3802 echo >>experr2 "send: OFPT_ROLE_REQUEST (OF1.2): role=master generation_id=9223372036854775811"
3803 echo >>expout2 "OFPT_ROLE_REPLY (OF1.2): role=master generation_id=9223372036854775811"
3804
3805 # controller 1: Try to become the master using a stale generation ID
3806 ovs-appctl -t `pwd`/c1 ofctl/send 031800180000000400000002000000000000000000000003
3807 echo >>experr1 "send: OFPT_ROLE_REQUEST (OF1.2): role=master generation_id=3"
3808 echo >>expout1 "OFPT_ERROR (OF1.2): OFPRRFC_STALE"
3809 echo >>expout1 "OFPT_ROLE_REQUEST (OF1.2): role=master generation_id=3"
3810
3811 # controller 1: Become master using a valid generation ID
3812 ovs-appctl -t `pwd`/c1 ofctl/send 031800180000000500000002000000000000000000000001
3813 echo >>experr1 "send: OFPT_ROLE_REQUEST (OF1.2): role=master generation_id=1"
3814 echo >>expout1 "OFPT_ROLE_REPLY (OF1.2): role=master generation_id=1"
3815
3816 for i in 1 2; do
3817 ovs-appctl -t `pwd`/c$i ofctl/barrier
3818 echo >>expout$i "OFPT_BARRIER_REPLY (OF1.2):"
3819 done
3820
3821 # Check output.
3822 for i in 1 2; do
3823 cp expout$i expout
3824 AT_CHECK([grep -v '^send:' monitor$i.log | strip_xids], [0], [expout])
3825 cp experr$i expout
3826 AT_CHECK([grep '^send:' monitor$i.log | strip_xids], [0], [expout])
3827 done
3828 OVS_VSWITCHD_STOP
3829 AT_CLEANUP
3830
3831 dnl This test checks that the role request/response messaging works,
3832 dnl that generation_id is handled properly, and that role status update
3833 dnl messages are sent when a controller's role gets changed from master
3834 dnl to slave.
3835 AT_SETUP([ofproto - controller role (OpenFlow 1.4)])
3836 OVS_VSWITCHD_START
3837 on_exit 'kill `cat c1.pid c2.pid`'
3838
3839 # Start two ovs-ofctl controller processes.
3840 AT_CAPTURE_FILE([monitor1.log])
3841 AT_CAPTURE_FILE([expout1])
3842 AT_CAPTURE_FILE([experr1])
3843 AT_CAPTURE_FILE([monitor2.log])
3844 AT_CAPTURE_FILE([expout2])
3845 AT_CAPTURE_FILE([experr2])
3846 for i in 1 2; do
3847 AT_CHECK([ovs-ofctl -O OpenFlow14 monitor br0 --detach --no-chdir --pidfile=c$i.pid --unixctl=c$i])
3848 ovs-appctl -t `pwd`/c$i ofctl/barrier
3849 ovs-appctl -t `pwd`/c$i ofctl/set-output-file monitor$i.log
3850 : > expout$i
3851 : > experr$i
3852
3853 # find out current role
3854 ovs-appctl -t `pwd`/c$i ofctl/send 051800180000000200000000000000000000000000000000
3855 echo >>experr$i "send: OFPT_ROLE_REQUEST (OF1.4): role=nochange"
3856 echo >>expout$i "OFPT_ROLE_REPLY (OF1.4): role=equal"
3857 done
3858
3859 # controller 1: Become slave (generation_id is initially undefined, so
3860 # 2^63+2 should not be stale)
3861 ovs-appctl -t `pwd`/c1 ofctl/send 051800180000000300000003000000008000000000000002
3862 echo >>experr1 "send: OFPT_ROLE_REQUEST (OF1.4): role=slave generation_id=9223372036854775810"
3863 echo >>expout1 "OFPT_ROLE_REPLY (OF1.4): role=slave generation_id=9223372036854775810"
3864
3865 # controller 2: Become master.
3866 ovs-appctl -t `pwd`/c2 ofctl/send 051800180000000300000002000000008000000000000003
3867 echo >>experr2 "send: OFPT_ROLE_REQUEST (OF1.4): role=master generation_id=9223372036854775811"
3868 echo >>expout2 "OFPT_ROLE_REPLY (OF1.4): role=master generation_id=9223372036854775811"
3869
3870 # controller 1: Try to become the master using a stale generation ID
3871 ovs-appctl -t `pwd`/c1 ofctl/send 051800180000000400000002000000000000000000000003
3872 echo >>experr1 "send: OFPT_ROLE_REQUEST (OF1.4): role=master generation_id=3"
3873 echo >>expout1 "OFPT_ERROR (OF1.4): OFPRRFC_STALE"
3874 echo >>expout1 "OFPT_ROLE_REQUEST (OF1.4): role=master generation_id=3"
3875
3876 # controller 1: Become master using a valid generation ID
3877 ovs-appctl -t `pwd`/c1 ofctl/send 051800180000000500000002000000000000000000000001
3878 echo >>experr1 "send: OFPT_ROLE_REQUEST (OF1.4): role=master generation_id=1"
3879 echo >>expout1 "OFPT_ROLE_REPLY (OF1.4): role=master generation_id=1"
3880 echo >>expout2 "OFPT_ROLE_STATUS (OF1.4): role=slave generation_id=1 reason=master_request"
3881
3882 for i in 1 2; do
3883 ovs-appctl -t `pwd`/c$i ofctl/barrier
3884 echo >>expout$i "OFPT_BARRIER_REPLY (OF1.4):"
3885 done
3886
3887 # Check output.
3888 for i in 1 2; do
3889 cp expout$i expout
3890 AT_CHECK([grep -v '^send:' monitor$i.log | strip_xids], [0], [expout])
3891 cp experr$i expout
3892 AT_CHECK([grep '^send:' monitor$i.log | strip_xids], [0], [expout])
3893 done
3894 OVS_VSWITCHD_STOP
3895 AT_CLEANUP
3896
3897 dnl This test checks the Group and meter notifications when a group mod
3898 dnl command is sent from one controller and the reply is received by
3899 dnl other controllers.
3900 AT_SETUP([ofproto - requestforward (OpenFlow 1.4)])
3901 OVS_VSWITCHD_START
3902 on_exit 'kill `cat c1.pid c2.pid c3.pid`'
3903
3904 # Start two ovs-ofctl controller processes.
3905 AT_CAPTURE_FILE([monitor1.log])
3906 AT_CAPTURE_FILE([expout1])
3907 AT_CAPTURE_FILE([monitor2.log])
3908 AT_CAPTURE_FILE([expout2])
3909 AT_CAPTURE_FILE([monitor3.log])
3910 AT_CAPTURE_FILE([expout3])
3911
3912 ovs-ofctl -O OpenFlow15 monitor br0 --detach --no-chdir --pidfile=c1.pid --unixctl=c1
3913 ovs-ofctl -O OpenFlow14 monitor br0 --detach --no-chdir --pidfile=c2.pid --unixctl=c2
3914 ovs-ofctl -O OpenFlow14 monitor br0 --detach --no-chdir --pidfile=c3.pid --unixctl=c3
3915
3916 check_async () {
3917 for i in 1 3; do
3918 ovs-appctl -t `pwd`/c$i ofctl/barrier
3919 ovs-appctl -t `pwd`/c$i ofctl/set-output-file monitor$i.log
3920 : > expout$i
3921 done
3922
3923 printf '\n\n--- check_async %d ---\n\n\n' $1
3924 INDEX=$1
3925 shift
3926
3927 # OFPGC_ADD
3928 ovs-appctl -t `pwd`/c2 ofctl/send "050f0020000000020000000000000001 00100000 ffffffffffffffff 00000000"
3929 if test X"$1" = X"OFPGC_ADD"; then shift;
3930 echo >>expout2 "send: OFPT_GROUP_MOD (OF1.4):
3931 ADD group_id=1,type=all,bucket=actions=drop"
3932 echo >>expout1 "OFPT_REQUESTFORWARD (OF1.5): reason=group_mod
3933 ADD group_id=1,type=all,bucket=bucket_id:0,actions=drop"
3934 echo >>expout3 "OFPT_REQUESTFORWARD (OF1.4): reason=group_mod
3935 ADD group_id=1,type=all,bucket=actions=drop"
3936 fi
3937
3938 # OFPGC_MODIFY
3939 ovs-appctl -t `pwd`/c2 ofctl/send "050f0020000000020001010000000001 00100000 ffffffffffffffff 00000000"
3940 if test X"$1" = X"OFPGC_MODIFY"; then shift;
3941 echo >>expout2 "send: OFPT_GROUP_MOD (OF1.4):
3942 MOD group_id=1,type=select,bucket=weight:0,actions=drop"
3943 echo >>expout1 "OFPT_REQUESTFORWARD (OF1.5): reason=group_mod
3944 MOD group_id=1,type=select,bucket=bucket_id:0,weight:0,actions=drop"
3945 echo >>expout3 "OFPT_REQUESTFORWARD (OF1.4): reason=group_mod
3946 MOD group_id=1,type=select,bucket=weight:0,actions=drop"
3947 fi
3948
3949 ovs-appctl -t `pwd`/c1 ofctl/barrier
3950 echo >>expout1 "OFPT_BARRIER_REPLY (OF1.5):"
3951 ovs-appctl -t `pwd`/c2 ofctl/barrier
3952 echo >>expout2 "OFPT_BARRIER_REPLY (OF1.4):"
3953 ovs-appctl -t `pwd`/c3 ofctl/barrier
3954 echo >>expout3 "OFPT_BARRIER_REPLY (OF1.4):"
3955
3956 # Check output.
3957 for i in 1 3; do
3958 cp expout$i expout
3959 AT_CHECK(
3960 [[sed '
3961 s/ (xid=0x[0-9a-fA-F]*)//'< monitor$i.log]],
3962 [0], [expout])
3963 done
3964 }
3965
3966 # controller 1: Become slave
3967 ovs-appctl -t `pwd`/c1 ofctl/send 061800180000000300000003000000008000000000000002
3968
3969 # controller 2: Become master
3970 ovs-appctl -t `pwd`/c2 ofctl/send 051800180000000300000002000000008000000000000003
3971
3972 # controller 1: Become slave
3973 ovs-appctl -t `pwd`/c3 ofctl/send 051800180000000300000003000000008000000000000004
3974
3975 # controller 1: Enabled requestforward using set Asynchronous message
3976 ovs-appctl -t `pwd`/c1 ofctl/send 061c00280000000200000008000000050002000800000002000400080000001a000a000800000003
3977
3978 # controller 2: Enabled requestforward using set Asynchronous message
3979 ovs-appctl -t `pwd`/c2 ofctl/send 051c002800000002000100080000000200030008000000050005000800000005000b000800000003
3980
3981 # controller 1: Enabled requestforward using set Asynchronous message
3982 ovs-appctl -t `pwd`/c3 ofctl/send 051c00280000000200000008000000050002000800000002000400080000001a000a000800000003
3983 check_async 1 OFPGC_ADD OFPGC_MODIFY
3984
3985 OVS_VSWITCHD_STOP
3986 AT_CLEANUP
3987
3988 dnl This test checks that OFPT_PACKET_OUT accepts both OFPP_NONE (as
3989 dnl specified by OpenFlow 1.0) and OFPP_CONTROLLER (used by some
3990 dnl controllers despite the spec) as meaning a packet that was generated
3991 dnl by the controller.
3992 AT_SETUP([ofproto - packet-out from controller (OpenFlow 1.0)])
3993 OVS_VSWITCHD_START
3994 add_of_ports br0 1
3995
3996 # Start a monitor listening for packet-ins.
3997 AT_CHECK([ovs-ofctl -P standard monitor br0 --detach --no-chdir --pidfile])
3998 ovs-appctl -t ovs-ofctl ofctl/send 0109000c0123456700000080
3999 ovs-appctl -t ovs-ofctl ofctl/barrier
4000 ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
4001 AT_CAPTURE_FILE([monitor.log])
4002
4003 # Send some packet-outs with OFPP_NONE and OFPP_CONTROLLER (65533) as in_port.
4004 AT_CHECK([ovs-ofctl packet-out br0 "in_port=none packet=0001020304050010203040501234 actions=controller,1"])
4005 AT_CHECK([ovs-ofctl packet-out br0 "in_port=controller packet=0001020304050010203040505678 actions=controller,1"])
4006
4007 # Stop the monitor and check its output.
4008 ovs-appctl -t ovs-ofctl ofctl/barrier
4009 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
4010
4011 ovs-ofctl dump-ports br0
4012
4013 AT_CHECK([sed 's/ (xid=0x[[0-9a-fA-F]]*)//' monitor.log], [0], [dnl
4014 OFPT_PACKET_IN: total_len=14 in_port=ANY (via action) data_len=14 (unbuffered)
4015 vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x1234
4016 OFPT_PACKET_IN: total_len=14 in_port=CONTROLLER (via action) data_len=14 (unbuffered)
4017 vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x5678
4018 OFPT_BARRIER_REPLY:
4019 ])
4020
4021 OVS_VSWITCHD_STOP
4022 AT_CLEANUP
4023
4024 dnl This test checks that OFPT_PACKET_OUT accepts both OFPP_NONE (as
4025 dnl specified by OpenFlow 1.2) and OFPP_CONTROLLER (used by some
4026 dnl controllers despite the spec) as meaning a packet that was generated
4027 dnl by the controller.
4028 AT_SETUP([ofproto - packet-out from controller (OpenFlow 1.2)])
4029 OVS_VSWITCHD_START
4030
4031 # Start a monitor listening for packet-ins.
4032 AT_CHECK([ovs-ofctl -O OpenFlow12 -P standard monitor br0 --detach --no-chdir --pidfile])
4033 ovs-appctl -t ovs-ofctl ofctl/send 0309000c0123456700000080
4034 ovs-appctl -t ovs-ofctl ofctl/barrier
4035 ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
4036 AT_CAPTURE_FILE([monitor.log])
4037
4038 # Send some packet-outs with OFPP_NONE and OFPP_CONTROLLER (65533) as in_port.
4039 AT_CHECK([ovs-ofctl -O OpenFlow12 packet-out br0 none controller '0001020304050010203040501234'])
4040 AT_CHECK([ovs-ofctl -O OpenFlow12 packet-out br0 4294967293 controller '0001020304050010203040505678'])
4041
4042 # Stop the monitor and check its output.
4043 ovs-appctl -t ovs-ofctl ofctl/barrier
4044 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
4045
4046 AT_CHECK([sed 's/ (xid=0x[[0-9a-fA-F]]*)//' monitor.log], [0], [dnl
4047 OFPT_PACKET_IN (OF1.2): total_len=14 in_port=ANY (via action) data_len=14 (unbuffered)
4048 vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x1234
4049 OFPT_PACKET_IN (OF1.2): total_len=14 in_port=CONTROLLER (via action) data_len=14 (unbuffered)
4050 vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x5678
4051 OFPT_BARRIER_REPLY (OF1.2):
4052 ])
4053
4054 OVS_VSWITCHD_STOP
4055 AT_CLEANUP
4056
4057 dnl This test checks that OFPT_PACKET_OUT accepts both OFPP_NONE (as
4058 dnl specified by OpenFlow 1.1) and OFPP_CONTROLLER (used by some
4059 dnl controllers despite the spec) as meaning a packet that was generated
4060 dnl by the controller.
4061 AT_SETUP([ofproto - packet-out from controller (OpenFlow 1.1)])
4062 OVS_VSWITCHD_START
4063
4064 # Start a monitor listening for packet-ins.
4065 AT_CHECK([ovs-ofctl -O OpenFlow11 -P standard monitor br0 --detach --no-chdir --pidfile])
4066 ovs-appctl -t ovs-ofctl ofctl/send 0209000c0123456700000080
4067 ovs-appctl -t ovs-ofctl ofctl/barrier
4068 ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
4069 AT_CAPTURE_FILE([monitor.log])
4070
4071 # Send some packet-outs with OFPP_NONE and OFPP_CONTROLLER as in_port.
4072 AT_CHECK([ovs-appctl -t ovs-ofctl ofctl/packet-out "in_port=none, packet=0001020304050010203040501234 actions=controller"])
4073 AT_CHECK([ovs-appctl -t ovs-ofctl ofctl/packet-out "in_port=controller packet=0001020304050010203040505678 actions=controller"])
4074
4075 # Stop the monitor and check its output.
4076 ovs-appctl -t ovs-ofctl ofctl/barrier
4077 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
4078
4079 AT_CHECK([sed 's/ (xid=0x[[0-9a-fA-F]]*)//
4080 /PACKET_OUT/d' monitor.log], [0], [dnl
4081 OFPT_PACKET_IN (OF1.1): total_len=14 in_port=ANY (via action) data_len=14 (unbuffered)
4082 vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x1234
4083 OFPT_PACKET_IN (OF1.1): total_len=14 in_port=CONTROLLER (via action) data_len=14 (unbuffered)
4084 vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x5678
4085 OFPT_BARRIER_REPLY (OF1.1):
4086 ])
4087
4088 OVS_VSWITCHD_STOP
4089 AT_CLEANUP
4090
4091 AT_SETUP([ofproto - packet-out from controller (OpenFlow 1.5)])
4092 OVS_VSWITCHD_START
4093
4094 # Start a monitor listening for packet-ins.
4095 AT_CHECK([ovs-ofctl -O OpenFlow15 -P standard monitor br0 --detach --no-chdir --pidfile])
4096 ovs-appctl -t ovs-ofctl ofctl/send 0609000c0123456700000080
4097 ovs-appctl -t ovs-ofctl ofctl/barrier
4098 ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
4099 AT_CAPTURE_FILE([monitor.log])
4100
4101 # Send some packet-outs with OFPP_NONE and OFPP_CONTROLLER (65533) as in_port.
4102 AT_CHECK([ovs-ofctl -O OpenFlow15 packet-out br0 "in_port=none tun_id=0x11 metadata=0x22 packet=0001020304050010203040501234 actions=controller"])
4103 AT_CHECK([ovs-ofctl -O OpenFlow15 packet-out br0 "in_port=controller tun_id=0x11 metadata=0x33 packet=0001020304050010203040505678 actions=controller"])
4104
4105 # Stop the monitor and check its output.
4106 ovs-appctl -t ovs-ofctl ofctl/barrier
4107 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
4108
4109 AT_CHECK([sed 's/ (xid=0x[[0-9a-fA-F]]*)//' monitor.log], [0], [dnl
4110 OFPT_PACKET_IN (OF1.5): total_len=14 tun_id=0x11,metadata=0x22,in_port=ANY (via packet_out) data_len=14 (unbuffered)
4111 vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x1234
4112 OFPT_PACKET_IN (OF1.5): total_len=14 tun_id=0x11,metadata=0x33,in_port=CONTROLLER (via packet_out) data_len=14 (unbuffered)
4113 vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x5678
4114 OFPT_BARRIER_REPLY (OF1.5):
4115 ])
4116
4117 OVS_VSWITCHD_STOP
4118 AT_CLEANUP
4119
4120 dnl This test checks that metadata and userdata are encoded in NXT_PACKET_IN2.
4121 AT_SETUP([ofproto - packet-out with metadata and userdata (NXT_PACKET_IN2)])
4122 OVS_VSWITCHD_START
4123
4124 # Start a monitor listening for packet-ins.
4125 AT_CHECK([ovs-ofctl -P nxt_packet_in2 monitor br0 --detach --no-chdir --pidfile])
4126 ovs-appctl -t ovs-ofctl ofctl/send 0109000c0123456700000080
4127 ovs-appctl -t ovs-ofctl ofctl/barrier
4128 ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
4129 AT_CAPTURE_FILE([monitor.log])
4130
4131 # Send a packet-out with a load action to set some metadata, and forward to controller
4132 AT_CHECK([ovs-ofctl packet-out br0 "in_port=controller packet=0001020304050010203040501234 actions=load(0xfafafafa5a5a5a5a->OXM_OF_METADATA[[0..63]]),load(0xaa->NXM_NX_PKT_MARK[[]]),controller(userdata=01.02.03.04.05)"])
4133
4134 # Stop the monitor and check its output.
4135 ovs-appctl -t ovs-ofctl ofctl/barrier
4136 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
4137
4138 AT_CHECK([sed 's/ (xid=0x[[0-9a-fA-F]]*)//' monitor.log], [0], [dnl
4139 NXT_PACKET_IN2: total_len=14 pkt_mark=0xaa,metadata=0xfafafafa5a5a5a5a,in_port=CONTROLLER (via action) data_len=14 (unbuffered)
4140 userdata=01.02.03.04.05
4141 vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x1234
4142 OFPT_BARRIER_REPLY:
4143 ])
4144
4145 OVS_VSWITCHD_STOP
4146 AT_CLEANUP
4147
4148 dnl This test checks that 1.5 packet_out is properly encoded/decoded.
4149 AT_SETUP([ofproto - packet-out with set_field metadata (OpenFlow 1.5)])
4150 OVS_VSWITCHD_START
4151
4152 # Start a monitor listening for packet-ins.
4153 AT_CHECK([ovs-ofctl -P standard -O OpenFlow13 monitor br0 --detach --no-chdir --pidfile])
4154 ovs-appctl -t ovs-ofctl ofctl/send 0409000c0123456700000080
4155 ovs-appctl -t ovs-ofctl ofctl/barrier
4156 ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
4157 AT_CAPTURE_FILE([monitor.log])
4158
4159 # Send a packet-out with a couple of set-field action to set some metadata, and forward to controller
4160 AT_CHECK([ovs-ofctl -O OpenFlow15 packet-out br0 CONTROLLER 'set_field:0xfafafafa5a5a5a5a->metadata, controller' '0001020304050010203040501234'])
4161
4162 # Stop the monitor and check its output.
4163 ovs-appctl -t ovs-ofctl ofctl/barrier
4164 ovs-appctl -t ovs-ofctl exit
4165
4166 AT_CHECK([sed 's/ (xid=0x[[0-9a-fA-F]]*)//' monitor.log], [0], [dnl
4167 OFPT_PACKET_IN (OF1.3): total_len=14 metadata=0xfafafafa5a5a5a5a,in_port=CONTROLLER (via action) data_len=14 (unbuffered)
4168 vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x1234
4169 OFPT_BARRIER_REPLY (OF1.3):
4170 ])
4171
4172 OVS_VSWITCHD_STOP
4173 AT_CLEANUP
4174
4175 dnl This test checks that packet_type PT_ETH is properly encoded/decoded in 1.5 packet_out.
4176 AT_SETUP([ofproto - packet-out with set_field metadata with packet_type PT_ETH (OpenFlow 1.5)])
4177 OVS_VSWITCHD_START
4178
4179 # Start a monitor listening for packet-ins.
4180 AT_CHECK([ovs-ofctl -P standard -O OpenFlow13 monitor br0 --detach --no-chdir --pidfile])
4181 ovs-appctl -t ovs-ofctl ofctl/send 0409000c0123456700000080
4182 ovs-appctl -t ovs-ofctl ofctl/barrier
4183 ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
4184 AT_CAPTURE_FILE([monitor.log])
4185
4186 # Send a packet-out with a couple of set-field action to set some metadata, and forward to controller
4187 AT_CHECK([ovs-ofctl -O OpenFlow15 packet-out br0 "in_port=controller packet=0001020304050010203040501234 packet_type(0,0x0) actions=set_field:0xfafafafa5a5a5a5a->metadata,controller"])
4188
4189 # Stop the monitor and check its output.
4190 ovs-appctl -t ovs-ofctl ofctl/barrier
4191 ovs-appctl -t ovs-ofctl exit
4192
4193 AT_CHECK([sed 's/ (xid=0x[[0-9a-fA-F]]*)//' monitor.log], [0], [dnl
4194 OFPT_PACKET_IN (OF1.3): total_len=14 metadata=0xfafafafa5a5a5a5a,in_port=CONTROLLER (via action) data_len=14 (unbuffered)
4195 vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x1234
4196 OFPT_BARRIER_REPLY (OF1.3):
4197 ])
4198
4199 OVS_VSWITCHD_STOP
4200 AT_CLEANUP
4201
4202 dnl This test checks that packet_type PT_IPV4 is properly encoded/decoded in 1.5 packet_out.
4203 AT_SETUP([ofproto - packet-out with set_field metadata with packet_type PT_IPV4 on PTAP bridge (OpenFlow 1.5)])
4204 OVS_VSWITCHD_START
4205
4206 # Start a monitor listening for packet-ins.
4207 AT_CHECK([ovs-ofctl -P standard -O OpenFlow13 monitor br0 --detach --no-chdir --pidfile])
4208 ovs-appctl -t ovs-ofctl ofctl/send 0409000c0123456700000080
4209 ovs-appctl -t ovs-ofctl ofctl/barrier
4210 ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
4211 AT_CAPTURE_FILE([monitor.log])
4212
4213 # Send a packet-out with a couple of set-field action to set some metadata, and forward to controller
4214 AT_CHECK([ovs-ofctl -O OpenFlow15 packet-out br0 "in_port=controller packet=4500002012344000ff1155670a0000140a00001e006400c8000cea78ffffffff packet_type(1,0x800) actions=set_field:0xfafafafa5a5a5a5a->metadata,controller"])
4215
4216 # Stop the monitor and check its output.
4217 ovs-appctl -t ovs-ofctl ofctl/barrier
4218 ovs-appctl -t ovs-ofctl exit
4219
4220 AT_CHECK([sed 's/ (xid=0x[[0-9a-fA-F]]*)//' monitor.log], [0], [dnl
4221 OFPT_PACKET_IN (OF1.3): total_len=32 packet_type=(1,0x800),metadata=0xfafafafa5a5a5a5a,in_port=CONTROLLER (via action) data_len=32 (unbuffered)
4222 packet_type=(1,0x800),nw_src=10.0.0.20,nw_dst=10.0.0.30,nw_proto=17,nw_tos=0,nw_ecn=0,nw_ttl=255,tp_src=100,tp_dst=200 udp_csum:ea78
4223 OFPT_BARRIER_REPLY (OF1.3):
4224 ])
4225
4226 OVS_VSWITCHD_STOP
4227 AT_CLEANUP
4228
4229 dnl This test checks that metadata is encoded in packet_in structures,
4230 dnl supported by NXAST.
4231 AT_SETUP([ofproto - packet-out with metadata (NXM)])
4232 OVS_VSWITCHD_START
4233
4234 # Start a monitor listening for packet-ins.
4235 AT_CHECK([ovs-ofctl -P nxt_packet_in monitor br0 --detach --no-chdir --pidfile])
4236 ovs-appctl -t ovs-ofctl ofctl/send 0109000c0123456700000080
4237 ovs-appctl -t ovs-ofctl ofctl/barrier
4238 ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
4239 AT_CAPTURE_FILE([monitor.log])
4240
4241 # Send a packet-out with a load action to set some metadata, and forward to controller
4242 AT_CHECK([ovs-ofctl packet-out br0 "in_port=controller packet=0001020304050010203040501234 actions=load(0xfafafafa5a5a5a5a->OXM_OF_METADATA[[0..63]]),load(0xaa->NXM_NX_PKT_MARK[[]]),controller"])
4243
4244 # Stop the monitor and check its output.
4245 ovs-appctl -t ovs-ofctl ofctl/barrier
4246 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
4247
4248 AT_CHECK([sed 's/ (xid=0x[[0-9a-fA-F]]*)//' monitor.log], [0], [dnl
4249 NXT_PACKET_IN: total_len=14 pkt_mark=0xaa,metadata=0xfafafafa5a5a5a5a,in_port=CONTROLLER (via action) data_len=14 (unbuffered)
4250 vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x1234
4251 OFPT_BARRIER_REPLY:
4252 ])
4253
4254 OVS_VSWITCHD_STOP
4255 AT_CLEANUP
4256
4257 dnl This test checks that metadata is encoded in packet_in structures,
4258 dnl supported by NXAST.
4259 AT_SETUP([ofproto - packet-out with metadata (OpenFlow 1.2)])
4260 OVS_VSWITCHD_START
4261
4262 # Start a monitor listening for packet-ins.
4263 AT_CHECK([ovs-ofctl -O OpenFlow12 -P standard monitor br0 --detach --no-chdir --pidfile])
4264 ovs-appctl -t ovs-ofctl ofctl/send 0309000c0123456700000080
4265 ovs-appctl -t ovs-ofctl ofctl/barrier
4266 ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
4267 AT_CAPTURE_FILE([monitor.log])
4268
4269 # Send a packet-out with a set-field action to set some metadata, and forward to controller
4270 AT_CHECK([ovs-ofctl -O OpenFlow12 packet-out br0 none 'set_field:0xfafafafa5a5a5a5a->metadata, controller' '0001020304050010203040501234'])
4271
4272 # Stop the monitor and check its output.
4273 ovs-appctl -t ovs-ofctl ofctl/barrier
4274 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
4275
4276 AT_CHECK([sed 's/ (xid=0x[[0-9a-fA-F]]*)//' monitor.log], [0], [dnl
4277 OFPT_PACKET_IN (OF1.2): total_len=14 metadata=0xfafafafa5a5a5a5a,in_port=ANY (via action) data_len=14 (unbuffered)
4278 vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x1234
4279 OFPT_BARRIER_REPLY (OF1.2):
4280 ])
4281
4282 OVS_VSWITCHD_STOP
4283 AT_CLEANUP
4284
4285 dnl This test checks that metadata is encoded in packet_in structures,
4286 dnl supported by NXAST.
4287 AT_SETUP([ofproto - packet-out with metadata and dual set_field (OpenFlow 1.3)])
4288 OVS_VSWITCHD_START
4289
4290 # Start a monitor listening for packet-ins.
4291 AT_CHECK([ovs-ofctl -O OpenFlow13 -P standard monitor br0 --detach --no-chdir --pidfile])
4292 ovs-appctl -t ovs-ofctl ofctl/send 0409000c0123456700000080
4293 ovs-appctl -t ovs-ofctl ofctl/barrier
4294 ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
4295 AT_CAPTURE_FILE([monitor.log])
4296
4297 # Send a packet-out with a couple of set-field action to set some metadata, and forward to controller
4298 AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 none 'set_field:0xfafafafa5a5a5a5a->metadata, set_field:0x6b->metadata, controller' '0001020304050010203040501234'])
4299
4300 # Stop the monitor and check its output.
4301 ovs-appctl -t ovs-ofctl ofctl/barrier
4302 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
4303
4304 AT_CHECK([sed 's/ (xid=0x[[0-9a-fA-F]]*)//' monitor.log], [0], [dnl
4305 OFPT_PACKET_IN (OF1.3): total_len=14 metadata=0x6b,in_port=ANY (via action) data_len=14 (unbuffered)
4306 vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x1234
4307 OFPT_BARRIER_REPLY (OF1.3):
4308 ])
4309
4310 OVS_VSWITCHD_STOP
4311 AT_CLEANUP
4312
4313 dnl This test checks that tunnel metadata is encoded in packet_in structures.
4314 AT_SETUP([ofproto - packet-out with tunnel metadata (OpenFlow 1.2)])
4315 OVS_VSWITCHD_START
4316
4317 # Start a monitor listening for packet-ins.
4318 AT_CHECK([ovs-ofctl -O OpenFlow12 -P standard monitor br0 --detach --no-chdir --pidfile])
4319 ovs-appctl -t ovs-ofctl ofctl/send 0309000c0123456700000080
4320 ovs-appctl -t ovs-ofctl ofctl/barrier
4321 ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
4322 AT_CAPTURE_FILE([monitor.log])
4323
4324 # Send a packet-out with set field actions to set some tunnel metadata, and forward to controller
4325 AT_CHECK([ovs-ofctl -O OpenFlow12 packet-out br0 none 'set_field:127.0.0.1->tun_src,set_field:0x01020304->tun_id,set_field:192.168.0.1->tun_dst, controller' '0001020304050010203040501234'])
4326
4327 # Stop the monitor and check its output.
4328 ovs-appctl -t ovs-ofctl ofctl/barrier
4329 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
4330
4331 AT_CHECK([sed 's/ (xid=0x[[0-9a-fA-F]]*)//' monitor.log], [0], [dnl
4332 OFPT_PACKET_IN (OF1.2): total_len=14 tun_id=0x1020304,tun_src=127.0.0.1,tun_dst=192.168.0.1,in_port=ANY (via action) data_len=14 (unbuffered)
4333 vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x1234
4334 OFPT_BARRIER_REPLY (OF1.2):
4335 ])
4336
4337 OVS_VSWITCHD_STOP
4338 AT_CLEANUP
4339
4340 m4_divert_push([PREPARE_TESTS])
4341 # Sorts groups of lines that start with a space, without moving them
4342 # past the nearest line that does not start with a space.
4343 multiline_sort () {
4344 ${PERL} -e '
4345 use warnings;
4346 use strict;
4347 my @buffer = ();
4348 while (<STDIN>) {
4349 if (/^ /) {
4350 push(@buffer, $_);
4351 } else {
4352 print $_ foreach sort(@buffer);
4353 print $_;
4354 @buffer = ();
4355 }
4356 }
4357 print $_ foreach sort(@buffer);
4358 '
4359 }
4360 m4_divert_pop([PREPARE_TESTS])
4361
4362 AT_SETUP([ofproto - flow monitoring])
4363 AT_KEYWORDS([monitor])
4364 OVS_VSWITCHD_START
4365
4366 ovs-ofctl add-flow br0 in_port=0,dl_vlan=123,actions=output:1
4367
4368 # Start a monitor watching the flow table and check the initial reply.
4369 ovs-ofctl monitor br0 watch: --detach --no-chdir --pidfile >monitor.log 2>&1
4370 AT_CAPTURE_FILE([monitor.log])
4371 ovs-appctl -t ovs-ofctl ofctl/barrier
4372 AT_CHECK([sed 's/ (xid=0x[[1-9a-fA-F]][[0-9a-fA-F]]*)//' monitor.log], [0],
4373 [NXST_FLOW_MONITOR reply:
4374 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=123 actions=output:1
4375 OFPT_BARRIER_REPLY:
4376 ])
4377
4378 # Add, delete, and modify some flows and check the updates.
4379 ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
4380 ovs-ofctl add-flow br0 in_port=0,dl_vlan=124,actions=output:2
4381 ovs-ofctl add-flow br0 in_port=0,dl_vlan=123,actions=output:5
4382 ovs-ofctl add-flow br0 in_port=0,dl_vlan=123,dl_vlan_pcp=0,actions=output:6
4383 ovs-ofctl add-flow br0 in_port=0,dl_vlan=123,dl_vlan_pcp=1,actions=output:7
4384 ovs-ofctl add-flow br0 in_port=0,dl_vlan=123,actions=output:8
4385 ovs-ofctl add-flow br0 in_port=0,dl_vlan=65535,dl_vlan_pcp=0,actions=output:9
4386 ovs-ofctl add-flow br0 in_port=0,dl_vlan=65535,dl_vlan_pcp=1,actions=output:10
4387 ovs-ofctl add-flow br0 in_port=0,dl_vlan=65535,actions=output:11
4388 ovs-ofctl add-flow br0 in_port=0,dl_vlan=8191,dl_vlan_pcp=0,actions=output:12
4389 ovs-ofctl add-flow br0 in_port=0,dl_vlan=8191,dl_vlan_pcp=1,actions=output:13
4390 ovs-ofctl add-flow br0 in_port=0,dl_vlan=8191,actions=output:14
4391 ovs-ofctl add-flow br0 in_port=0,dl_vlan=0,dl_vlan_pcp=0,actions=output:15
4392 ovs-ofctl add-flow br0 in_port=0,dl_vlan=0,dl_vlan_pcp=1,actions=output:16
4393 ovs-ofctl add-flow br0 in_port=0,dl_vlan=0,actions=output:17
4394 ovs-ofctl add-flow br0 in_port=0,dl_vlan=0,dl_vlan_pcp=0,actions=output:18
4395 ovs-ofctl add-flow br0 in_port=0,dl_vlan=0,dl_vlan_pcp=1,actions=output:19
4396 ovs-ofctl add-flow br0 in_port=0,dl_vlan=0,actions=output:20
4397 ovs-ofctl add-flow br0 in_port=0,dl_vlan_pcp=0,actions=output:21
4398 ovs-ofctl add-flow br0 in_port=0,dl_vlan_pcp=1,actions=output:22
4399 ovs-ofctl add-flow br0 in_port=0,actions=output:23
4400 ovs-ofctl mod-flows br0 dl_vlan=123,actions=output:3
4401 ovs-ofctl mod-flows br0 cookie=5,dl_vlan=123,actions=output:3
4402 ovs-ofctl del-flows br0 dl_vlan=123
4403 ovs-ofctl del-flows br0
4404 ovs-appctl -t ovs-ofctl ofctl/barrier
4405 AT_CHECK([sed 's/ (xid=0x[[1-9a-fA-F]][[0-9a-fA-F]]*)//' monitor.log | multiline_sort], [0],
4406 [NXST_FLOW_MONITOR reply (xid=0x0):
4407 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=124 actions=output:2
4408 NXST_FLOW_MONITOR reply (xid=0x0):
4409 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=123 actions=output:5
4410 NXST_FLOW_MONITOR reply (xid=0x0):
4411 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=123,dl_vlan_pcp=0 actions=output:6
4412 NXST_FLOW_MONITOR reply (xid=0x0):
4413 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=123,dl_vlan_pcp=1 actions=output:7
4414 NXST_FLOW_MONITOR reply (xid=0x0):
4415 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=123 actions=output:8
4416 NXST_FLOW_MONITOR reply (xid=0x0):
4417 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=0,dl_vlan_pcp=0 actions=output:9
4418 NXST_FLOW_MONITOR reply (xid=0x0):
4419 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=0,dl_vlan_pcp=1 actions=output:10
4420 NXST_FLOW_MONITOR reply (xid=0x0):
4421 event=ADDED table=0 cookie=0 in_port=0,vlan_tci=0x0000 actions=output:11
4422 NXST_FLOW_MONITOR reply (xid=0x0):
4423 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=4095,dl_vlan_pcp=0 actions=output:12
4424 NXST_FLOW_MONITOR reply (xid=0x0):
4425 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=4095,dl_vlan_pcp=1 actions=output:13
4426 NXST_FLOW_MONITOR reply (xid=0x0):
4427 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=4095 actions=output:14
4428 NXST_FLOW_MONITOR reply (xid=0x0):
4429 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=0,dl_vlan_pcp=0 actions=output:15
4430 NXST_FLOW_MONITOR reply (xid=0x0):
4431 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=0,dl_vlan_pcp=1 actions=output:16
4432 NXST_FLOW_MONITOR reply (xid=0x0):
4433 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=0 actions=output:17
4434 NXST_FLOW_MONITOR reply (xid=0x0):
4435 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=0,dl_vlan_pcp=0 actions=output:18
4436 NXST_FLOW_MONITOR reply (xid=0x0):
4437 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=0,dl_vlan_pcp=1 actions=output:19
4438 NXST_FLOW_MONITOR reply (xid=0x0):
4439 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=0 actions=output:20
4440 NXST_FLOW_MONITOR reply (xid=0x0):
4441 event=ADDED table=0 cookie=0 in_port=0,dl_vlan_pcp=0 actions=output:21
4442 NXST_FLOW_MONITOR reply (xid=0x0):
4443 event=ADDED table=0 cookie=0 in_port=0,dl_vlan_pcp=1 actions=output:22
4444 NXST_FLOW_MONITOR reply (xid=0x0):
4445 event=ADDED table=0 cookie=0 in_port=0 actions=output:23
4446 NXST_FLOW_MONITOR reply (xid=0x0):
4447 event=MODIFIED table=0 cookie=0 in_port=0,dl_vlan=123 actions=output:3
4448 event=MODIFIED table=0 cookie=0 in_port=0,dl_vlan=123,dl_vlan_pcp=0 actions=output:3
4449 event=MODIFIED table=0 cookie=0 in_port=0,dl_vlan=123,dl_vlan_pcp=1 actions=output:3
4450 NXST_FLOW_MONITOR reply (xid=0x0):
4451 event=MODIFIED table=0 cookie=0x5 in_port=0,dl_vlan=123 actions=output:3
4452 event=MODIFIED table=0 cookie=0x5 in_port=0,dl_vlan=123,dl_vlan_pcp=0 actions=output:3
4453 event=MODIFIED table=0 cookie=0x5 in_port=0,dl_vlan=123,dl_vlan_pcp=1 actions=output:3
4454 NXST_FLOW_MONITOR reply (xid=0x0):
4455 event=DELETED reason=delete table=0 cookie=0x5 in_port=0,dl_vlan=123 actions=output:3
4456 event=DELETED reason=delete table=0 cookie=0x5 in_port=0,dl_vlan=123,dl_vlan_pcp=0 actions=output:3
4457 event=DELETED reason=delete table=0 cookie=0x5 in_port=0,dl_vlan=123,dl_vlan_pcp=1 actions=output:3
4458 NXST_FLOW_MONITOR reply (xid=0x0):
4459 event=DELETED reason=delete table=0 cookie=0 in_port=0 actions=output:23
4460 event=DELETED reason=delete table=0 cookie=0 in_port=0,dl_vlan=0 actions=output:20
4461 event=DELETED reason=delete table=0 cookie=0 in_port=0,dl_vlan=0,dl_vlan_pcp=0 actions=output:18
4462 event=DELETED reason=delete table=0 cookie=0 in_port=0,dl_vlan=0,dl_vlan_pcp=1 actions=output:19
4463 event=DELETED reason=delete table=0 cookie=0 in_port=0,dl_vlan=124 actions=output:2
4464 event=DELETED reason=delete table=0 cookie=0 in_port=0,dl_vlan=4095 actions=output:14
4465 event=DELETED reason=delete table=0 cookie=0 in_port=0,dl_vlan=4095,dl_vlan_pcp=0 actions=output:12
4466 event=DELETED reason=delete table=0 cookie=0 in_port=0,dl_vlan=4095,dl_vlan_pcp=1 actions=output:13
4467 event=DELETED reason=delete table=0 cookie=0 in_port=0,dl_vlan_pcp=0 actions=output:21
4468 event=DELETED reason=delete table=0 cookie=0 in_port=0,dl_vlan_pcp=1 actions=output:22
4469 event=DELETED reason=delete table=0 cookie=0 in_port=0,vlan_tci=0x0000 actions=output:11
4470 OFPT_BARRIER_REPLY:
4471 ])
4472
4473 # Check that our own changes are reported as full updates.
4474 ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
4475 ovs-ofctl add-flow br0 in_port=1,actions=output:2
4476 ovs-ofctl add-flow br0 in_port=2,actions=output:1
4477 ovs-appctl -t ovs-ofctl ofctl/barrier
4478 ovs-appctl -t ovs-ofctl ofctl/send 010e004812345678003fffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000ffffffffffff0000
4479 ovs-appctl -t ovs-ofctl ofctl/barrier
4480 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0], [NXST_FLOW reply:
4481 ])
4482 AT_CHECK([sed 's/ (xid=0x[[1-9a-fA-F]][[0-9a-fA-F]]*)//' monitor.log | multiline_sort], [0],
4483 [NXST_FLOW_MONITOR reply (xid=0x0):
4484 event=ADDED table=0 cookie=0 in_port=1 actions=output:2
4485 NXST_FLOW_MONITOR reply (xid=0x0):
4486 event=ADDED table=0 cookie=0 in_port=2 actions=output:1
4487 OFPT_BARRIER_REPLY:
4488 send: OFPT_FLOW_MOD: DEL priority=0 actions=drop
4489 NXST_FLOW_MONITOR reply (xid=0x0):
4490 event=DELETED reason=delete table=0 cookie=0 in_port=1 actions=output:2
4491 event=DELETED reason=delete table=0 cookie=0 in_port=2 actions=output:1
4492 OFPT_BARRIER_REPLY:
4493 ])
4494
4495 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
4496 OVS_VSWITCHD_STOP
4497 AT_CLEANUP
4498
4499 AT_SETUP([ofproto - flow monitoring with !own])
4500 AT_KEYWORDS([monitor])
4501 OVS_VSWITCHD_START
4502
4503 ovs-ofctl add-flow br0 in_port=0,dl_vlan=123,actions=output:1
4504
4505 # Start a monitor watching the flow table and check the initial reply.
4506 ovs-ofctl monitor br0 watch:\!own --detach --no-chdir --pidfile >monitor.log 2>&1
4507 AT_CAPTURE_FILE([monitor.log])
4508 ovs-appctl -t ovs-ofctl ofctl/barrier
4509 AT_CHECK([sed 's/ (xid=0x[[1-9a-fA-F]][[0-9a-fA-F]]*)//' monitor.log], [0],
4510 [NXST_FLOW_MONITOR reply:
4511 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=123 actions=output:1
4512 OFPT_BARRIER_REPLY:
4513 ])
4514
4515 # Check that our own changes are reported as abbreviations.
4516 ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
4517 ovs-ofctl add-flow br0 in_port=1,actions=output:2
4518 ovs-ofctl add-flow br0 in_port=2,actions=output:1
4519 ovs-appctl -t ovs-ofctl ofctl/barrier
4520 ovs-appctl -t ovs-ofctl ofctl/send 010e004812345678003fffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000ffffffffffff0000
4521 ovs-appctl -t ovs-ofctl ofctl/barrier
4522 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0], [NXST_FLOW reply:
4523 ])
4524 AT_CHECK([sed 's/ (xid=0x[[1-9a-fA-F]][[0-9a-fA-F]]*)//' monitor.log], [0],
4525 [NXST_FLOW_MONITOR reply (xid=0x0):
4526 event=ADDED table=0 cookie=0 in_port=1 actions=output:2
4527 NXST_FLOW_MONITOR reply (xid=0x0):
4528 event=ADDED table=0 cookie=0 in_port=2 actions=output:1
4529 OFPT_BARRIER_REPLY:
4530 send: OFPT_FLOW_MOD: DEL priority=0 actions=drop
4531 NXST_FLOW_MONITOR reply (xid=0x0):
4532 event=ABBREV xid=0x12345678
4533 OFPT_BARRIER_REPLY:
4534 ])
4535
4536 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
4537 OVS_VSWITCHD_STOP
4538 AT_CLEANUP
4539
4540 AT_SETUP([ofproto - flow monitoring with out_port])
4541 AT_KEYWORDS([monitor])
4542 OVS_VSWITCHD_START
4543
4544 ovs-ofctl add-flow br0 in_port=0,dl_vlan=121,actions=output:1
4545 ovs-ofctl add-flow br0 in_port=0,dl_vlan=122,actions=output:1
4546 ovs-ofctl add-flow br0 in_port=0,dl_vlan=123,actions=output:2
4547
4548 # Start a monitor watching the flow table and check the initial reply.
4549 ovs-ofctl monitor br0 watch:out_port=2 --detach --no-chdir --pidfile >monitor.log 2>&1
4550 AT_CAPTURE_FILE([monitor.log])
4551 ovs-appctl -t ovs-ofctl ofctl/barrier
4552 AT_CHECK([sed 's/ (xid=0x[[1-9a-fA-F]][[0-9a-fA-F]]*)//' monitor.log], [0],
4553 [NXST_FLOW_MONITOR reply:
4554 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=123 actions=output:2
4555 OFPT_BARRIER_REPLY:
4556 ])
4557
4558 ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
4559
4560 # Add, modify flows and check the updates.
4561 ovs-ofctl mod-flows br0 dl_vlan=121,actions=drop
4562 ovs-ofctl mod-flows br0 dl_vlan=122,actions=output:1,output:2
4563 ovs-appctl -t ovs-ofctl ofctl/barrier
4564
4565 ovs-ofctl mod-flows br0 dl_vlan=123,actions=output:1,output:2
4566 ovs-appctl -t ovs-ofctl ofctl/barrier
4567
4568 ovs-ofctl mod-flows br0 dl_vlan=122,actions=output:1
4569 ovs-appctl -t ovs-ofctl ofctl/barrier
4570 ovs-ofctl mod-flows br0 dl_vlan=123,actions=output:2
4571 ovs-appctl -t ovs-ofctl ofctl/barrier
4572
4573 AT_CHECK([sed 's/ (xid=0x[[1-9a-fA-F]][[0-9a-fA-F]]*)//' monitor.log], [0],
4574 [NXST_FLOW_MONITOR reply (xid=0x0):
4575 event=MODIFIED table=0 cookie=0 in_port=0,dl_vlan=122 actions=output:1,output:2
4576 OFPT_BARRIER_REPLY:
4577 NXST_FLOW_MONITOR reply (xid=0x0):
4578 event=MODIFIED table=0 cookie=0 in_port=0,dl_vlan=123 actions=output:1,output:2
4579 OFPT_BARRIER_REPLY:
4580 NXST_FLOW_MONITOR reply (xid=0x0):
4581 event=MODIFIED table=0 cookie=0 in_port=0,dl_vlan=122 actions=output:1
4582 OFPT_BARRIER_REPLY:
4583 NXST_FLOW_MONITOR reply (xid=0x0):
4584 event=MODIFIED table=0 cookie=0 in_port=0,dl_vlan=123 actions=output:2
4585 OFPT_BARRIER_REPLY:
4586 ])
4587
4588 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
4589 OVS_VSWITCHD_STOP
4590 AT_CLEANUP
4591
4592 AT_SETUP([ofproto - flow monitoring pause and resume])
4593 AT_KEYWORDS([monitor])
4594
4595 # The maximum socket receive buffer size is important for this test, which
4596 # tests behavior when the receive buffer overflows.
4597 if test -e /proc/sys/net/core/rmem_max; then
4598 # Linux
4599 rmem_max=`cat /proc/sys/net/core/rmem_max`
4600 elif rmem_max=`sysctl -n net.inet.tcp.recvbuf_max 2>/dev/null`; then
4601 : # FreeBSD, NetBSD
4602 else
4603 # Don't know how to get maximum socket receive buffer on this OS
4604 AT_SKIP_IF([:])
4605 fi
4606 # Calculate the total amount of queuing: rmem_max in the kernel, 128 kB
4607 # in ofproto sending userspace (see ofmonitor_flush() in connmgr.c).
4608 queue_size=`expr $rmem_max + 128 \* 1024`
4609 echo rmem_max=$rmem_max queue_size=$queue_size
4610
4611 # If there's too much queuing skip the test to avoid timing out.
4612 AT_SKIP_IF([test $rmem_max -gt 1048576])
4613
4614 # Each flow update message takes up at least 48 bytes of space in queues
4615 # and in practice more than that.
4616 n_msgs=`expr $queue_size / 48`
4617 echo n_msgs=$n_msgs
4618
4619 OVS_VSWITCHD_START
4620
4621 # Start a monitor watching the flow table, then make it block.
4622 on_exit 'kill `cat ovs-ofctl.pid`'
4623 ovs-ofctl monitor br0 watch: --detach --no-chdir --pidfile >monitor.log 2>&1
4624 AT_CAPTURE_FILE([monitor.log])
4625 ovs-appctl -t ovs-ofctl ofctl/block
4626
4627 # Add $n_msgs flows.
4628 (echo "in_port=2,actions=output:2"
4629 ${PERL} -e '
4630 for ($i = 0; $i < '$n_msgs'; $i++) {
4631 print "cookie=1,reg1=$i,actions=drop\n";
4632 }
4633 ') > flows.txt
4634 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
4635 # Check that multipart flow dumps work properly:
4636 AT_CHECK([ovs-ofctl diff-flows br0 flows.txt])
4637 AT_CHECK([ovs-ofctl add-flow br0 in_port=1,cookie=3,actions=drop])
4638 AT_CHECK([ovs-ofctl mod-flows br0 in_port=2,cookie=2,actions=output:2])
4639 AT_CHECK([ovs-ofctl del-flows br0 cookie=1/-1])
4640
4641 ovs-appctl -t ovs-ofctl ofctl/unblock
4642
4643 # Wait for the connection resumed.
4644 # A barrier doesn't work for this purpose.
4645 # https://www.mail-archive.com/dev@openvswitch.org/msg27013.html
4646 # https://www.mail-archive.com/dev@openvswitch.org/msg27675.html
4647 OVS_WAIT_UNTIL([grep NXT_FLOW_MONITOR_RESUMED monitor.log])
4648
4649 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
4650
4651 # Check that the flow monitor reported the same number of flows
4652 # added and deleted, but fewer than we actually added and deleted.
4653 adds=`grep -c 'ADDED.*reg1=' monitor.log`
4654 deletes=`grep -c 'DELETED.*reg1=' monitor.log`
4655 echo adds=$adds deletes=$deletes
4656 AT_CHECK([test $adds -gt 100 && test $adds -lt $n_msgs])
4657 AT_CHECK([test $adds = $deletes])
4658
4659 # Check that the flow monitor reported everything in the expected order:
4660 #
4661 # event=ADDED table=0 cookie=0x1 reg1=0x22
4662 # ...
4663 # NXT_FLOW_MONITOR_PAUSED:
4664 # ...
4665 # event=DELETED reason=delete table=0 cookie=0x1 reg1=0x22
4666 # ...
4667 # event=ADDED table=0 cookie=0x3 in_port=1
4668 # event=MODIFIED table=0 cookie=0x2 in_port=2 actions=output:2
4669 # NXT_FLOW_MONITOR_RESUMED:
4670 #
4671 # except that, between the PAUSED and RESUMED, the order of the ADDED
4672 # and MODIFIED lines lines depends on hash order, that is, it varies
4673 # as we change the hash function or change architecture. Therefore,
4674 # we use a couple of tests below to accept both orders.
4675 AT_CHECK([ofctl_strip < monitor.log | sed -n -e '
4676 /reg1=0x22$/p
4677 /cookie=0x[[23]]/p
4678 /NXT_FLOW_MONITOR_PAUSED:/p
4679 /NXT_FLOW_MONITOR_RESUMED:/p
4680 ' > monitor.log.subset])
4681 AT_CHECK([grep -v MODIFIED monitor.log.subset], [0], [dnl
4682 event=ADDED table=0 cookie=0x1 reg1=0x22
4683 NXT_FLOW_MONITOR_PAUSED:
4684 event=DELETED reason=delete table=0 cookie=0x1 reg1=0x22
4685 event=ADDED table=0 cookie=0x3 in_port=1
4686 NXT_FLOW_MONITOR_RESUMED:
4687 ])
4688 AT_CHECK([grep -v ADDED monitor.log.subset], [0], [dnl
4689 NXT_FLOW_MONITOR_PAUSED:
4690 event=DELETED reason=delete table=0 cookie=0x1 reg1=0x22
4691 event=MODIFIED table=0 cookie=0x2 in_port=2 actions=output:2
4692 NXT_FLOW_MONITOR_RESUMED:
4693 ])
4694
4695 OVS_VSWITCHD_STOP
4696 AT_CLEANUP
4697
4698 AT_SETUP([ofproto - event filtering (OpenFlow 1.3)])
4699 AT_KEYWORDS([monitor])
4700 OVS_VSWITCHD_START
4701
4702 # Start a monitor, use the required protocol version
4703 ovs-ofctl -O OpenFlow13 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1
4704 AT_CAPTURE_FILE([monitor.log])
4705
4706 # Send an OpenFlow13 message (04), OFPT_GET_ASYNC_REQUEST (1a), length (8), xid (0a)
4707 ovs-appctl -t ovs-ofctl ofctl/send 041a00080000000a
4708 ovs-appctl -t ovs-ofctl ofctl/barrier
4709
4710 # Check default setting
4711 read -r -d '' expected <<'EOF'
4712 EOF
4713
4714 AT_CHECK([ofctl_strip < monitor.log], [], [dnl
4715 send: OFPT_GET_ASYNC_REQUEST (OF1.3):
4716 OFPT_GET_ASYNC_REPLY (OF1.3):
4717 master:
4718 PACKET_IN: no_match action
4719 PORT_STATUS: add delete modify
4720 FLOW_REMOVED: idle hard delete group_delete
4721 ROLE_STATUS: (off)
4722 TABLE_STATUS: (off)
4723 REQUESTFORWARD: (off)
4724
4725 slave:
4726 PACKET_IN: (off)
4727 PORT_STATUS: add delete modify
4728 FLOW_REMOVED: (off)
4729 ROLE_STATUS: (off)
4730 TABLE_STATUS: (off)
4731 REQUESTFORWARD: (off)
4732 OFPT_BARRIER_REPLY (OF1.3):
4733 ])
4734
4735 OVS_VSWITCHD_STOP
4736 AT_CLEANUP
4737
4738 AT_SETUP([ofproto - ofport_request])
4739 OVS_VSWITCHD_START
4740 add_of_ports br0 1 2 3
4741
4742 set_and_check_specific_ofports () {
4743 ovs-vsctl set Interface p1 ofport_request="$1" -- \
4744 set Interface p2 ofport_request="$2" -- \
4745 set Interface p3 ofport_request="$3"
4746 ofports=`ovs-vsctl get Interface p1 ofport -- \
4747 get Interface p2 ofport -- \
4748 get Interface p3 ofport`
4749 AT_CHECK_UNQUOTED([echo $ofports], [0], [$1 $2 $3
4750 ])
4751 }
4752 for pre in '1 2 3' '1 3 2' '2 1 3' '2 3 1' '3 1 2' '3 2 1'; do
4753 for post in '1 2 3' '1 3 2' '2 1 3' '2 3 1' '3 1 2' '3 2 1'; do
4754 echo -----------------------------------------------------------
4755 echo "Check changing port numbers from $pre to $post"
4756 set_and_check_specific_ofports $pre
4757 set_and_check_specific_ofports $post
4758 done
4759 done
4760
4761 ovs-vsctl del-port p3
4762
4763 set_and_check_poorly_specified_ofports () {
4764 ovs-vsctl set Interface p1 ofport_request="$1" -- \
4765 set Interface p2 ofport_request="$2"
4766 p1=`ovs-vsctl get Interface p1 ofport`
4767 p2=`ovs-vsctl get Interface p2 ofport`
4768 echo $p1 $p2
4769
4770 AT_CHECK([test "$p1" != "$p2"])
4771 if test "$1" = "$2" && test "$1" != '[[]]'; then
4772 # One port number must be the requested one.
4773 AT_CHECK([test "$p1" = "$1" || test "$p2" = "$1"])
4774 # The other port number must be different (already tested above).
4775 else
4776 AT_CHECK([test "$1" = '[[]]' || test "$p1" = "$1"])
4777 AT_CHECK([test "$2" = '[[]]' || test "$p2" = "$2"])
4778 fi
4779 }
4780 for pre in '1 2' '[[]] 2' '1 [[]]' '[[]] [[]]' '2 1' '[[]] 1' '2 [[]]' \
4781 '1 1' '2 2'; do
4782 for post in '1 2' '[[]] 2' '1 [[]]' '[[]] [[]]' '2 1' '[[]] 1' '2 [[]]' \
4783 '1 1' '2 2'; do
4784 echo -----------------------------------------------------------
4785 echo "Check changing port numbers from $pre to $post"
4786 set_and_check_poorly_specified_ofports $pre
4787 set_and_check_poorly_specified_ofports $post
4788 done
4789 done
4790 OVS_VSWITCHD_STOP
4791 AT_CLEANUP
4792
4793
4794 AT_SETUP([ofproto - bundle open (OpenFlow 1.4)])
4795 AT_KEYWORDS([monitor])
4796 OVS_VSWITCHD_START
4797
4798 # Start a monitor, use the required protocol version
4799 ovs-ofctl -O OpenFlow14 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1
4800 AT_CAPTURE_FILE([monitor.log])
4801
4802 # Send an OpenFlow14 message (05), OFPT_BUNDLE_CONTROL (21), length (10), xid (0a)
4803 ovs-appctl -t ovs-ofctl ofctl/send "05 21 00 10 00 00 00 0a 00 00 00 01 00 00 00 02"
4804 ovs-appctl -t ovs-ofctl ofctl/barrier
4805 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
4806
4807 AT_CHECK([ofctl_strip < monitor.log], [], [dnl
4808 send: OFPT_BUNDLE_CONTROL (OF1.4):
4809 bundle_id=0x1 type=OPEN_REQUEST flags=ordered
4810 OFPT_BUNDLE_CONTROL (OF1.4):
4811 bundle_id=0x1 type=OPEN_REPLY flags=0
4812 OFPT_BARRIER_REPLY (OF1.4):
4813 ])
4814
4815 OVS_VSWITCHD_STOP
4816 AT_CLEANUP
4817
4818 AT_SETUP([ofproto - bundle double open (OpenFlow 1.4)])
4819 AT_KEYWORDS([monitor])
4820 OVS_VSWITCHD_START
4821
4822 # Start a monitor, use the required protocol version
4823 ovs-ofctl -O OpenFlow14 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1
4824 AT_CAPTURE_FILE([monitor.log])
4825
4826 # Send twice an OpenFlow14 message (05), OFPT_BUNDLE_CONTROL (21), length (10), xid (0a)
4827 ovs-appctl -t ovs-ofctl ofctl/send "05 21 00 10 00 00 00 0a 00 00 00 01 00 00 00 02"
4828 ovs-appctl -t ovs-ofctl ofctl/barrier
4829 ovs-appctl -t ovs-ofctl ofctl/send "05 21 00 10 00 00 00 0a 00 00 00 01 00 00 00 02"
4830 ovs-appctl -t ovs-ofctl ofctl/barrier
4831 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
4832
4833 AT_CHECK([ofctl_strip < monitor.log], [0], [dnl
4834 send: OFPT_BUNDLE_CONTROL (OF1.4):
4835 bundle_id=0x1 type=OPEN_REQUEST flags=ordered
4836 OFPT_BUNDLE_CONTROL (OF1.4):
4837 bundle_id=0x1 type=OPEN_REPLY flags=0
4838 OFPT_BARRIER_REPLY (OF1.4):
4839 send: OFPT_BUNDLE_CONTROL (OF1.4):
4840 bundle_id=0x1 type=OPEN_REQUEST flags=ordered
4841 OFPT_ERROR (OF1.4): OFPBFC_BAD_ID
4842 OFPT_BUNDLE_CONTROL (OF1.4):
4843 bundle_id=0x1 type=OPEN_REQUEST flags=ordered
4844 OFPT_BARRIER_REPLY (OF1.4):
4845 ])
4846
4847 OVS_VSWITCHD_STOP
4848 AT_CLEANUP
4849
4850 AT_SETUP([ofproto - bundle close without open (OpenFlow 1.4)])
4851 AT_KEYWORDS([monitor])
4852 OVS_VSWITCHD_START
4853
4854 # Start a monitor, use the required protocol version
4855 ovs-ofctl -O OpenFlow14 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1
4856 AT_CAPTURE_FILE([monitor.log])
4857
4858 ovs-appctl -t ovs-ofctl ofctl/send "05 21 00 10 00 00 00 0a 00 00 00 01 00 02 00 02"
4859 ovs-appctl -t ovs-ofctl ofctl/barrier
4860 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
4861
4862 AT_CHECK([ofctl_strip < monitor.log], [0], [dnl
4863 send: OFPT_BUNDLE_CONTROL (OF1.4):
4864 bundle_id=0x1 type=CLOSE_REQUEST flags=ordered
4865 OFPT_ERROR (OF1.4): OFPBFC_BAD_ID
4866 OFPT_BUNDLE_CONTROL (OF1.4):
4867 bundle_id=0x1 type=CLOSE_REQUEST flags=ordered
4868 OFPT_BARRIER_REPLY (OF1.4):
4869 ])
4870
4871 OVS_VSWITCHD_STOP
4872 AT_CLEANUP
4873
4874 AT_SETUP([ofproto - bundle double close (OpenFlow 1.4)])
4875 AT_KEYWORDS([monitor])
4876 OVS_VSWITCHD_START
4877
4878 # Start a monitor, use the required protocol version
4879 ovs-ofctl -O OpenFlow14 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1
4880 AT_CAPTURE_FILE([monitor.log])
4881
4882 # Open, Close, Close
4883 ovs-appctl -t ovs-ofctl ofctl/send "05 21 00 10 00 00 00 0a 00 00 00 01 00 00 00 02"
4884 ovs-appctl -t ovs-ofctl ofctl/barrier
4885 ovs-appctl -t ovs-ofctl ofctl/send "05 21 00 10 00 00 00 0a 00 00 00 01 00 02 00 02"
4886 ovs-appctl -t ovs-ofctl ofctl/barrier
4887 ovs-appctl -t ovs-ofctl ofctl/send "05 21 00 10 00 00 00 0a 00 00 00 01 00 02 00 02"
4888 ovs-appctl -t ovs-ofctl ofctl/barrier
4889 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
4890
4891 AT_CHECK([ofctl_strip < monitor.log], [0], [dnl
4892 send: OFPT_BUNDLE_CONTROL (OF1.4):
4893 bundle_id=0x1 type=OPEN_REQUEST flags=ordered
4894 OFPT_BUNDLE_CONTROL (OF1.4):
4895 bundle_id=0x1 type=OPEN_REPLY flags=0
4896 OFPT_BARRIER_REPLY (OF1.4):
4897 send: OFPT_BUNDLE_CONTROL (OF1.4):
4898 bundle_id=0x1 type=CLOSE_REQUEST flags=ordered
4899 OFPT_BUNDLE_CONTROL (OF1.4):
4900 bundle_id=0x1 type=CLOSE_REPLY flags=0
4901 OFPT_BARRIER_REPLY (OF1.4):
4902 send: OFPT_BUNDLE_CONTROL (OF1.4):
4903 bundle_id=0x1 type=CLOSE_REQUEST flags=ordered
4904 OFPT_ERROR (OF1.4): OFPBFC_BUNDLE_CLOSED
4905 OFPT_BUNDLE_CONTROL (OF1.4):
4906 bundle_id=0x1 type=CLOSE_REQUEST flags=ordered
4907 OFPT_BARRIER_REPLY (OF1.4):
4908 ])
4909
4910 OVS_VSWITCHD_STOP
4911 AT_CLEANUP
4912
4913 AT_SETUP([ofproto - bundle close, different flags (OpenFlow 1.4)])
4914 AT_KEYWORDS([monitor])
4915 OVS_VSWITCHD_START
4916
4917 # Start a monitor, use the required protocol version
4918 ovs-ofctl -O OpenFlow14 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1
4919 AT_CAPTURE_FILE([monitor.log])
4920
4921 # Open, Close
4922 ovs-appctl -t ovs-ofctl ofctl/send "05 21 00 10 00 00 00 0a 00 00 00 01 00 00 00 02"
4923 ovs-appctl -t ovs-ofctl ofctl/barrier
4924 ovs-appctl -t ovs-ofctl ofctl/send "05 21 00 10 00 00 00 0a 00 00 00 01 00 02 00 01"
4925 ovs-appctl -t ovs-ofctl ofctl/barrier
4926 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
4927
4928 AT_CHECK([ofctl_strip < monitor.log], [0], [dnl
4929 send: OFPT_BUNDLE_CONTROL (OF1.4):
4930 bundle_id=0x1 type=OPEN_REQUEST flags=ordered
4931 OFPT_BUNDLE_CONTROL (OF1.4):
4932 bundle_id=0x1 type=OPEN_REPLY flags=0
4933 OFPT_BARRIER_REPLY (OF1.4):
4934 send: OFPT_BUNDLE_CONTROL (OF1.4):
4935 bundle_id=0x1 type=CLOSE_REQUEST flags=atomic
4936 OFPT_ERROR (OF1.4): OFPBFC_BAD_FLAGS
4937 OFPT_BUNDLE_CONTROL (OF1.4):
4938 bundle_id=0x1 type=CLOSE_REQUEST flags=atomic
4939 OFPT_BARRIER_REPLY (OF1.4):
4940 ])
4941
4942 OVS_VSWITCHD_STOP
4943 AT_CLEANUP
4944
4945 AT_SETUP([ofproto - bundle commit without open (OpenFlow 1.4)])
4946 AT_KEYWORDS([monitor])
4947 OVS_VSWITCHD_START
4948
4949 # Start a monitor, use the required protocol version
4950 ovs-ofctl -O OpenFlow14 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1
4951 AT_CAPTURE_FILE([monitor.log])
4952
4953 # Commit
4954 ovs-appctl -t ovs-ofctl ofctl/send "05 21 00 10 00 00 00 0a 00 00 00 01 00 04 00 02"
4955 ovs-appctl -t ovs-ofctl ofctl/barrier
4956 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
4957
4958 AT_CHECK([ofctl_strip < monitor.log], [0], [dnl
4959 send: OFPT_BUNDLE_CONTROL (OF1.4):
4960 bundle_id=0x1 type=COMMIT_REQUEST flags=ordered
4961 OFPT_ERROR (OF1.4): OFPBFC_BAD_ID
4962 OFPT_BUNDLE_CONTROL (OF1.4):
4963 bundle_id=0x1 type=COMMIT_REQUEST flags=ordered
4964 OFPT_BARRIER_REPLY (OF1.4):
4965 ])
4966
4967 OVS_VSWITCHD_STOP
4968 AT_CLEANUP
4969
4970 AT_SETUP([ofproto - bundle commit, different flags (OpenFlow 1.4)])
4971 AT_KEYWORDS([monitor])
4972 OVS_VSWITCHD_START
4973
4974 # Start a monitor, use the required protocol version
4975 ovs-ofctl -O OpenFlow14 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1
4976 AT_CAPTURE_FILE([monitor.log])
4977
4978 # Open, Commit
4979 ovs-appctl -t ovs-ofctl ofctl/send "05 21 00 10 00 00 00 0a 00 00 00 01 00 00 00 02"
4980 ovs-appctl -t ovs-ofctl ofctl/barrier
4981 ovs-appctl -t ovs-ofctl ofctl/send "05 21 00 10 00 00 00 0a 00 00 00 01 00 04 00 01"
4982 ovs-appctl -t ovs-ofctl ofctl/barrier
4983 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
4984
4985 AT_CHECK([ofctl_strip < monitor.log], [0], [dnl
4986 send: OFPT_BUNDLE_CONTROL (OF1.4):
4987 bundle_id=0x1 type=OPEN_REQUEST flags=ordered
4988 OFPT_BUNDLE_CONTROL (OF1.4):
4989 bundle_id=0x1 type=OPEN_REPLY flags=0
4990 OFPT_BARRIER_REPLY (OF1.4):
4991 send: OFPT_BUNDLE_CONTROL (OF1.4):
4992 bundle_id=0x1 type=COMMIT_REQUEST flags=atomic
4993 OFPT_ERROR (OF1.4): OFPBFC_BAD_FLAGS
4994 OFPT_BUNDLE_CONTROL (OF1.4):
4995 bundle_id=0x1 type=COMMIT_REQUEST flags=atomic
4996 OFPT_BARRIER_REPLY (OF1.4):
4997 ])
4998
4999 OVS_VSWITCHD_STOP
5000 AT_CLEANUP
5001
5002 AT_SETUP([ofproto - bundle discard without open (OpenFlow 1.4)])
5003 AT_KEYWORDS([monitor])
5004 OVS_VSWITCHD_START
5005
5006 # Start a monitor, use the required protocol version
5007 ovs-ofctl -O OpenFlow14 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1
5008 AT_CAPTURE_FILE([monitor.log])
5009
5010 # Discard
5011 ovs-appctl -t ovs-ofctl ofctl/send "05 21 00 10 00 00 00 0a 00 00 00 01 00 06 00 02"
5012 ovs-appctl -t ovs-ofctl ofctl/barrier
5013 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
5014
5015 AT_CHECK([ofctl_strip < monitor.log], [0], [dnl
5016 send: OFPT_BUNDLE_CONTROL (OF1.4):
5017 bundle_id=0x1 type=DISCARD_REQUEST flags=ordered
5018 OFPT_ERROR (OF1.4): OFPBFC_BAD_ID
5019 OFPT_BUNDLE_CONTROL (OF1.4):
5020 bundle_id=0x1 type=DISCARD_REQUEST flags=ordered
5021 OFPT_BARRIER_REPLY (OF1.4):
5022 ])
5023
5024 OVS_VSWITCHD_STOP
5025 AT_CLEANUP
5026
5027
5028 AT_SETUP([ofproto - bundle with multiple flow mods (OpenFlow 1.4)])
5029 OVS_VSWITCHD_START
5030
5031 AT_CHECK([ovs-appctl vlog/set vconn:dbg])
5032
5033 AT_CHECK([ovs-ofctl --no-names del-flows br0])
5034
5035 AT_DATA([flows.txt], [dnl
5036 add idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=1
5037 add idle_timeout=60 in_port=2 dl_src=00:77:88:99:aa:bb actions=2
5038 add idle_timeout=70 in_port=2 dl_src=00:88:99:aa:bb:cc actions=3
5039 add idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=4
5040 delete
5041 add idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=5
5042 add idle_timeout=60 in_port=2 dl_src=00:77:88:99:aa:bb actions=6
5043 add idle_timeout=70 in_port=2 dl_src=00:88:99:aa:bb:cc actions=7
5044 delete in_port=2 dl_src=00:88:99:aa:bb:cc
5045 ])
5046
5047 AT_CHECK([ovs-ofctl --no-names --bundle add-flows br0 flows.txt])
5048
5049 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
5050 idle_timeout=50, in_port=2,dl_src=00:66:77:88:99:aa actions=output:5
5051 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:6
5052 NXST_FLOW reply:
5053 ])
5054
5055 AT_DATA([flows.txt], [dnl
5056 modify actions=drop
5057 modify_strict in_port=2 dl_src=00:77:88:99:aa:bb actions=7
5058 ])
5059
5060 AT_CHECK([ovs-ofctl --no-names --bundle add-flows br0 flows.txt])
5061
5062 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
5063 idle_timeout=50, in_port=2,dl_src=00:66:77:88:99:aa actions=drop
5064 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:7
5065 NXST_FLOW reply:
5066 ])
5067
5068 # Adding an existing flow acts as a modify, and delete_strict also works.
5069 AT_DATA([flows.txt], [dnl
5070 add idle_timeout=60 in_port=2 dl_src=00:77:88:99:aa:bb actions=8
5071 delete_strict in_port=2 dl_src=00:66:77:88:99:aa
5072 add in_port=2 dl_src=00:66:77:88:99:aa actions=drop
5073 ])
5074
5075 AT_CHECK([ovs-ofctl --no-names --bundle add-flows br0 flows.txt])
5076
5077 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
5078 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:8
5079 in_port=2,dl_src=00:66:77:88:99:aa actions=drop
5080 NXST_FLOW reply:
5081 ])
5082
5083 dnl Check logs for OpenFlow trace
5084 # Prevent race.
5085 OVS_WAIT_UNTIL([vconn_sub < ovs-vswitchd.log | test `grep -- "|vconn|DBG|unix: sent (Success): NXST_FLOW reply" | wc -l` -ge 3])
5086 AT_CHECK([print_vconn_debug | vconn_sub | ofctl_strip], [0], [dnl
5087 vconn|DBG|unix: sent (Success): OFPT_HELLO (OF1.6):
5088 version bitmap: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
5089 vconn|DBG|unix: received: OFPT_HELLO:
5090 version bitmap: 0x01
5091 vconn|DBG|unix: negotiated OpenFlow version 0x01 (we support version 0x07 and earlier, peer supports version 0x01)
5092 vconn|DBG|unix: received: OFPT_FLOW_MOD: DEL actions=drop
5093 vconn|DBG|unix: received: OFPT_BARRIER_REQUEST:
5094 vconn|DBG|unix: sent (Success): OFPT_BARRIER_REPLY:
5095 vconn|DBG|unix: sent (Success): OFPT_HELLO (OF1.6):
5096 version bitmap: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
5097 vconn|DBG|unix: received: OFPT_HELLO (OF1.4):
5098 version bitmap: 0x05
5099 vconn|DBG|unix: negotiated OpenFlow version 0x05 (we support version 0x07 and earlier, peer supports version 0x05)
5100 vconn|DBG|unix: received: OFPT_BUNDLE_CONTROL (OF1.4):
5101 bundle_id=0 type=OPEN_REQUEST flags=atomic ordered
5102 vconn|DBG|unix: sent (Success): OFPT_BUNDLE_CONTROL (OF1.4):
5103 bundle_id=0 type=OPEN_REPLY flags=0
5104 vconn|DBG|unix: received: OFPT_BUNDLE_ADD_MESSAGE (OF1.4):
5105 bundle_id=0 flags=atomic ordered
5106 OFPT_FLOW_MOD (OF1.4): ADD in_port=2,dl_src=00:66:77:88:99:aa idle:50 actions=output:1
5107 vconn|DBG|unix: received: OFPT_BUNDLE_ADD_MESSAGE (OF1.4):
5108 bundle_id=0 flags=atomic ordered
5109 OFPT_FLOW_MOD (OF1.4): ADD in_port=2,dl_src=00:77:88:99:aa:bb idle:60 actions=output:2
5110 vconn|DBG|unix: received: OFPT_BUNDLE_ADD_MESSAGE (OF1.4):
5111 bundle_id=0 flags=atomic ordered
5112 OFPT_FLOW_MOD (OF1.4): ADD in_port=2,dl_src=00:88:99:aa:bb:cc idle:70 actions=output:3
5113 vconn|DBG|unix: received: OFPT_BUNDLE_ADD_MESSAGE (OF1.4):
5114 bundle_id=0 flags=atomic ordered
5115 OFPT_FLOW_MOD (OF1.4): ADD in_port=2,dl_src=00:66:77:88:99:aa idle:50 actions=output:4
5116 vconn|DBG|unix: received: OFPT_BUNDLE_ADD_MESSAGE (OF1.4):
5117 bundle_id=0 flags=atomic ordered
5118 OFPT_FLOW_MOD (OF1.4): DEL table:255 actions=drop
5119 vconn|DBG|unix: received: OFPT_BUNDLE_ADD_MESSAGE (OF1.4):
5120 bundle_id=0 flags=atomic ordered
5121 OFPT_FLOW_MOD (OF1.4): ADD in_port=2,dl_src=00:66:77:88:99:aa idle:50 actions=output:5
5122 vconn|DBG|unix: received: OFPT_BUNDLE_ADD_MESSAGE (OF1.4):
5123 bundle_id=0 flags=atomic ordered
5124 OFPT_FLOW_MOD (OF1.4): ADD in_port=2,dl_src=00:77:88:99:aa:bb idle:60 actions=output:6
5125 vconn|DBG|unix: received: OFPT_BUNDLE_ADD_MESSAGE (OF1.4):
5126 bundle_id=0 flags=atomic ordered
5127 OFPT_FLOW_MOD (OF1.4): ADD in_port=2,dl_src=00:88:99:aa:bb:cc idle:70 actions=output:7
5128 vconn|DBG|unix: received: OFPT_BUNDLE_ADD_MESSAGE (OF1.4):
5129 bundle_id=0 flags=atomic ordered
5130 OFPT_FLOW_MOD (OF1.4): DEL table:255 in_port=2,dl_src=00:88:99:aa:bb:cc actions=drop
5131 vconn|DBG|unix: received: OFPT_BARRIER_REQUEST (OF1.4):
5132 vconn|DBG|unix: sent (Success): OFPT_BARRIER_REPLY (OF1.4):
5133 vconn|DBG|unix: received: OFPT_BUNDLE_CONTROL (OF1.4):
5134 bundle_id=0 type=COMMIT_REQUEST flags=atomic ordered
5135 vconn|DBG|unix: sent (Success): OFPT_BUNDLE_CONTROL (OF1.4):
5136 bundle_id=0 type=COMMIT_REPLY flags=0
5137 vconn|DBG|unix: sent (Success): OFPT_HELLO (OF1.6):
5138 version bitmap: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
5139 vconn|DBG|unix: received: OFPT_HELLO:
5140 version bitmap: 0x01
5141 vconn|DBG|unix: negotiated OpenFlow version 0x01 (we support version 0x07 and earlier, peer supports version 0x01)
5142 vconn|DBG|unix: received: NXT_SET_FLOW_FORMAT: format=nxm
5143 vconn|DBG|unix: received: OFPT_BARRIER_REQUEST:
5144 vconn|DBG|unix: sent (Success): OFPT_BARRIER_REPLY:
5145 vconn|DBG|unix: received: NXST_FLOW request:
5146 vconn|DBG|unix: sent (Success): NXST_FLOW reply:
5147 idle_timeout=50, in_port=2,dl_src=00:66:77:88:99:aa actions=output:5
5148 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:6
5149 vconn|DBG|unix: sent (Success): OFPT_HELLO (OF1.6):
5150 version bitmap: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
5151 vconn|DBG|unix: received: OFPT_HELLO (OF1.4):
5152 version bitmap: 0x05
5153 vconn|DBG|unix: negotiated OpenFlow version 0x05 (we support version 0x07 and earlier, peer supports version 0x05)
5154 vconn|DBG|unix: received: OFPT_BUNDLE_CONTROL (OF1.4):
5155 bundle_id=0 type=OPEN_REQUEST flags=atomic ordered
5156 vconn|DBG|unix: sent (Success): OFPT_BUNDLE_CONTROL (OF1.4):
5157 bundle_id=0 type=OPEN_REPLY flags=0
5158 vconn|DBG|unix: received: OFPT_BUNDLE_ADD_MESSAGE (OF1.4):
5159 bundle_id=0 flags=atomic ordered
5160 OFPT_FLOW_MOD (OF1.4): MOD actions=drop
5161 vconn|DBG|unix: received: OFPT_BUNDLE_ADD_MESSAGE (OF1.4):
5162 bundle_id=0 flags=atomic ordered
5163 OFPT_FLOW_MOD (OF1.4): MOD_STRICT in_port=2,dl_src=00:77:88:99:aa:bb actions=output:7
5164 vconn|DBG|unix: received: OFPT_BARRIER_REQUEST (OF1.4):
5165 vconn|DBG|unix: sent (Success): OFPT_BARRIER_REPLY (OF1.4):
5166 vconn|DBG|unix: received: OFPT_BUNDLE_CONTROL (OF1.4):
5167 bundle_id=0 type=COMMIT_REQUEST flags=atomic ordered
5168 vconn|DBG|unix: sent (Success): OFPT_BUNDLE_CONTROL (OF1.4):
5169 bundle_id=0 type=COMMIT_REPLY flags=0
5170 vconn|DBG|unix: sent (Success): OFPT_HELLO (OF1.6):
5171 version bitmap: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
5172 vconn|DBG|unix: received: OFPT_HELLO:
5173 version bitmap: 0x01
5174 vconn|DBG|unix: negotiated OpenFlow version 0x01 (we support version 0x07 and earlier, peer supports version 0x01)
5175 vconn|DBG|unix: received: NXT_SET_FLOW_FORMAT: format=nxm
5176 vconn|DBG|unix: received: OFPT_BARRIER_REQUEST:
5177 vconn|DBG|unix: sent (Success): OFPT_BARRIER_REPLY:
5178 vconn|DBG|unix: received: NXST_FLOW request:
5179 vconn|DBG|unix: sent (Success): NXST_FLOW reply:
5180 idle_timeout=50, in_port=2,dl_src=00:66:77:88:99:aa actions=drop
5181 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:7
5182 vconn|DBG|unix: sent (Success): OFPT_HELLO (OF1.6):
5183 version bitmap: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
5184 vconn|DBG|unix: received: OFPT_HELLO (OF1.4):
5185 version bitmap: 0x05
5186 vconn|DBG|unix: negotiated OpenFlow version 0x05 (we support version 0x07 and earlier, peer supports version 0x05)
5187 vconn|DBG|unix: received: OFPT_BUNDLE_CONTROL (OF1.4):
5188 bundle_id=0 type=OPEN_REQUEST flags=atomic ordered
5189 vconn|DBG|unix: sent (Success): OFPT_BUNDLE_CONTROL (OF1.4):
5190 bundle_id=0 type=OPEN_REPLY flags=0
5191 vconn|DBG|unix: received: OFPT_BUNDLE_ADD_MESSAGE (OF1.4):
5192 bundle_id=0 flags=atomic ordered
5193 OFPT_FLOW_MOD (OF1.4): ADD in_port=2,dl_src=00:77:88:99:aa:bb idle:60 actions=output:8
5194 vconn|DBG|unix: received: OFPT_BUNDLE_ADD_MESSAGE (OF1.4):
5195 bundle_id=0 flags=atomic ordered
5196 OFPT_FLOW_MOD (OF1.4): DEL_STRICT table:255 in_port=2,dl_src=00:66:77:88:99:aa actions=drop
5197 vconn|DBG|unix: received: OFPT_BUNDLE_ADD_MESSAGE (OF1.4):
5198 bundle_id=0 flags=atomic ordered
5199 OFPT_FLOW_MOD (OF1.4): ADD in_port=2,dl_src=00:66:77:88:99:aa actions=drop
5200 vconn|DBG|unix: received: OFPT_BARRIER_REQUEST (OF1.4):
5201 vconn|DBG|unix: sent (Success): OFPT_BARRIER_REPLY (OF1.4):
5202 vconn|DBG|unix: received: OFPT_BUNDLE_CONTROL (OF1.4):
5203 bundle_id=0 type=COMMIT_REQUEST flags=atomic ordered
5204 vconn|DBG|unix: sent (Success): OFPT_BUNDLE_CONTROL (OF1.4):
5205 bundle_id=0 type=COMMIT_REPLY flags=0
5206 vconn|DBG|unix: sent (Success): OFPT_HELLO (OF1.6):
5207 version bitmap: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
5208 vconn|DBG|unix: received: OFPT_HELLO:
5209 version bitmap: 0x01
5210 vconn|DBG|unix: negotiated OpenFlow version 0x01 (we support version 0x07 and earlier, peer supports version 0x01)
5211 vconn|DBG|unix: received: NXT_SET_FLOW_FORMAT: format=nxm
5212 vconn|DBG|unix: received: OFPT_BARRIER_REQUEST:
5213 vconn|DBG|unix: sent (Success): OFPT_BARRIER_REPLY:
5214 vconn|DBG|unix: received: NXST_FLOW request:
5215 vconn|DBG|unix: sent (Success): NXST_FLOW reply:
5216 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:8
5217 in_port=2,dl_src=00:66:77:88:99:aa actions=drop
5218 ])
5219
5220 AT_CHECK([grep " flow_mods in the last " ovs-vswitchd.log | sed -e 's/^.*connmgr|INFO|//'], [0], [dnl
5221 br0<->unix: 1 flow_mods in the last 0 s (1 deletes)
5222 br0<->unix: 9 flow_mods in the last 0 s (7 adds, 2 deletes)
5223 br0<->unix: 2 flow_mods in the last 0 s (2 modifications)
5224 br0<->unix: 3 flow_mods in the last 0 s (2 adds, 1 deletes)
5225 ])
5226
5227 OVS_VSWITCHD_STOP
5228 AT_CLEANUP
5229
5230
5231 AT_SETUP([ofproto - failing bundle commit (OpenFlow 1.4)])
5232 OVS_VSWITCHD_START
5233
5234 AT_CHECK([ovs-ofctl del-flows br0])
5235
5236 ovs-ofctl add-flows br0 - <<EOF
5237 idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=11
5238 idle_timeout=60 in_port=2 dl_src=00:77:88:99:aa:bb actions=22
5239 idle_timeout=70 in_port=2 dl_src=00:88:99:aa:bb:cc actions=33
5240 EOF
5241 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
5242 idle_timeout=50, in_port=2,dl_src=00:66:77:88:99:aa actions=output:11
5243 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:22
5244 idle_timeout=70, in_port=2,dl_src=00:88:99:aa:bb:cc actions=output:33
5245 NXST_FLOW reply:
5246 ])
5247
5248 # last line uses illegal table number (OVS internal table)
5249 AT_DATA([flows.txt], [dnl
5250 add idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=1
5251 add idle_timeout=60 in_port=2 dl_src=00:77:88:99:aa:bb actions=2
5252 add idle_timeout=70 in_port=2 dl_src=00:88:99:aa:bb:cc actions=3
5253 modify idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=4
5254 delete
5255 add idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=5
5256 add idle_timeout=60 in_port=2 dl_src=00:77:88:99:aa:bb actions=6
5257 add idle_timeout=70 in_port=2 dl_src=00:88:99:aa:bb:cc actions=7
5258 delete in_port=2 dl_src=00:88:99:aa:bb:cc
5259 add table=254 actions=drop
5260 ])
5261
5262 AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt 2>&1 | sed '/talking to/,$d' | strip_xids],
5263 [0], [dnl
5264 Error OFPBRC_EPERM for: OFPT_FLOW_MOD (OF1.4): ADD table:254 actions=drop
5265 ])
5266
5267 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
5268 idle_timeout=50, in_port=2,dl_src=00:66:77:88:99:aa actions=output:11
5269 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:22
5270 idle_timeout=70, in_port=2,dl_src=00:88:99:aa:bb:cc actions=output:33
5271 NXST_FLOW reply:
5272 ])
5273
5274 OVS_VSWITCHD_STOP
5275 AT_CLEANUP
5276
5277
5278 AT_SETUP([ofproto - bundle timeout (OpenFlow 1.4)])
5279 AT_KEYWORDS([monitor])
5280 OVS_VSWITCHD_START
5281
5282 # Start a monitor, use the required protocol version
5283 ovs-ofctl -O OpenFlow14 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1
5284 AT_CAPTURE_FILE([monitor.log])
5285
5286 ovs-appctl time/stop
5287
5288 # Send an OpenFlow14 message (05), OFPT_BUNDLE_CONTROL (21), length (10), xid (01)
5289 ovs-appctl -t ovs-ofctl ofctl/send "05 21 00 10 00 00 00 01 00 00 00 01 00 00 00 03"
5290 ovs-appctl time/warp 8000
5291 # Send a bundle flow mod, it should keep the bundle alive.
5292 ovs-appctl -t ovs-ofctl ofctl/send "05 22 00 a0 00 00 00 02 00 00 00 01 00 00 00 03 \
5293 05 0e 00 90 00 00 00 02 00 00 00 00 00 00 00 00 \
5294 00 00 00 00 00 00 00 00 01 00 00 00 00 00 ff ff \
5295 ff ff ff ff ff ff ff ff ff ff ff ff 00 00 00 00 \
5296 00 01 00 42 80 00 00 04 00 00 00 01 80 00 08 06 \
5297 50 54 00 00 00 06 80 00 06 06 50 54 00 00 00 05 \
5298 80 00 0a 02 08 06 80 00 0c 02 00 00 80 00 2a 02 \
5299 00 02 80 00 2c 04 c0 a8 00 02 80 00 2e 04 c0 a8 \
5300 00 01 00 00 00 00 00 00 00 04 00 18 00 00 00 00 \
5301 00 00 00 10 00 00 00 03 00 00 00 00 00 00 00 00 \
5302 "
5303 ovs-appctl time/warp 8000
5304 # Send a bundle close, it should keep the bundle alive.
5305 ovs-appctl -t ovs-ofctl ofctl/send "05 21 00 10 00 00 00 03 00 00 00 01 00 02 00 03"
5306 ovs-appctl time/warp 11000
5307 # Make sure that timeouts are processed after the expiry
5308 ovs-appctl time/warp 1000
5309 # Send a Commit, but too late.
5310 ovs-appctl -t ovs-ofctl ofctl/send "05 21 00 10 00 00 00 04 00 00 00 01 00 04 00 03"
5311 ovs-appctl -t ovs-ofctl ofctl/barrier
5312 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
5313
5314 AT_CHECK([ofctl_strip < monitor.log], [], [dnl
5315 send: OFPT_BUNDLE_CONTROL (OF1.4):
5316 bundle_id=0x1 type=OPEN_REQUEST flags=atomic ordered
5317 OFPT_BUNDLE_CONTROL (OF1.4):
5318 bundle_id=0x1 type=OPEN_REPLY flags=0
5319 send: OFPT_BUNDLE_ADD_MESSAGE (OF1.4):
5320 bundle_id=0x1 flags=atomic ordered
5321 OFPT_FLOW_MOD (OF1.4): ADD table:1 priority=65535,arp,in_port=1,vlan_tci=0x0000/0x1fff,dl_src=50:54:00:00:00:06,dl_dst=50:54:00:00:00:05,arp_spa=192.168.0.2,arp_tpa=192.168.0.1,arp_op=2 actions=output:3
5322 send: OFPT_BUNDLE_CONTROL (OF1.4):
5323 bundle_id=0x1 type=CLOSE_REQUEST flags=atomic ordered
5324 OFPT_BUNDLE_CONTROL (OF1.4):
5325 bundle_id=0x1 type=CLOSE_REPLY flags=0
5326 OFPT_ERROR (OF1.4): OFPBFC_TIMEOUT
5327 OFPT_BUNDLE_CONTROL (OF1.4):
5328 bundle_id=0x1 type=OPEN_REQUEST flags=atomic ordered
5329 send: OFPT_BUNDLE_CONTROL (OF1.4):
5330 bundle_id=0x1 type=COMMIT_REQUEST flags=atomic ordered
5331 OFPT_ERROR (OF1.4): OFPBFC_BAD_ID
5332 OFPT_BUNDLE_CONTROL (OF1.4):
5333 bundle_id=0x1 type=COMMIT_REQUEST flags=atomic ordered
5334 OFPT_BARRIER_REPLY (OF1.4):
5335 ])
5336
5337 OVS_VSWITCHD_STOP
5338 AT_CLEANUP
5339
5340
5341 AT_SETUP([ofproto - bundle open (OpenFlow 1.3)])
5342 AT_KEYWORDS([monitor])
5343 OVS_VSWITCHD_START
5344
5345 # Start a monitor, use the required protocol version
5346 ovs-ofctl -O OpenFlow13 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1
5347 AT_CAPTURE_FILE([monitor.log])
5348
5349 # Send an OpenFlow13 message (04), OFPT_EXPERIMENTER (04), length (0018),
5350 # xid (0000000a), ONF_EXPERIMENTER_ID (4F4E4600),
5351 # ONFT_BUNDLE_CONTROL (2300 = 0x08FC), bundle id (00000001),
5352 # message type (0000), and flags (0002)
5353 ovs-appctl -t ovs-ofctl ofctl/send "04 04 00 18 00 00 00 0a 4F 4E 46 00 00 00 08 FC 00 00 00 01 00 00 00 02"
5354 ovs-appctl -t ovs-ofctl ofctl/barrier
5355 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
5356
5357 AT_CHECK([ofctl_strip < monitor.log], [], [dnl
5358 send: ONFT_BUNDLE_CONTROL (OF1.3):
5359 bundle_id=0x1 type=OPEN_REQUEST flags=ordered
5360 ONFT_BUNDLE_CONTROL (OF1.3):
5361 bundle_id=0x1 type=OPEN_REPLY flags=0
5362 OFPT_BARRIER_REPLY (OF1.3):
5363 ])
5364
5365 OVS_VSWITCHD_STOP
5366 AT_CLEANUP
5367
5368 AT_SETUP([ofproto - bundle double open (OpenFlow 1.3)])
5369 AT_KEYWORDS([monitor])
5370 OVS_VSWITCHD_START
5371
5372 # Start a monitor, use the required protocol version
5373 ovs-ofctl -O OpenFlow13 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1
5374 AT_CAPTURE_FILE([monitor.log])
5375
5376 # Send twice an OpenFlow13 message (04), OFPT_EXPERIMENTER (04), length (0018),
5377 # xid (0000000a), ONF_EXPERIMENTER_ID (4F4E4600),
5378 # ONFT_BUNDLE_CONTROL (2300 = 0x08FC), bundle id (00000001),
5379 # message type (0000), and flags (0002)
5380 ovs-appctl -t ovs-ofctl ofctl/send "04 04 00 18 00 00 00 0a 4F 4E 46 00 00 00 08 FC 00 00 00 01 00 00 00 02"
5381 ovs-appctl -t ovs-ofctl ofctl/barrier
5382 ovs-appctl -t ovs-ofctl ofctl/send "04 04 00 18 00 00 00 0a 4F 4E 46 00 00 00 08 FC 00 00 00 01 00 00 00 02"
5383 ovs-appctl -t ovs-ofctl ofctl/barrier
5384 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
5385
5386 AT_CHECK([ofctl_strip < monitor.log], [0], [dnl
5387 send: ONFT_BUNDLE_CONTROL (OF1.3):
5388 bundle_id=0x1 type=OPEN_REQUEST flags=ordered
5389 ONFT_BUNDLE_CONTROL (OF1.3):
5390 bundle_id=0x1 type=OPEN_REPLY flags=0
5391 OFPT_BARRIER_REPLY (OF1.3):
5392 send: ONFT_BUNDLE_CONTROL (OF1.3):
5393 bundle_id=0x1 type=OPEN_REQUEST flags=ordered
5394 OFPT_ERROR (OF1.3): OFPBFC_BAD_ID
5395 ONFT_BUNDLE_CONTROL (OF1.3):
5396 bundle_id=0x1 type=OPEN_REQUEST flags=ordered
5397 OFPT_BARRIER_REPLY (OF1.3):
5398 ])
5399
5400 OVS_VSWITCHD_STOP
5401 AT_CLEANUP
5402
5403 AT_SETUP([ofproto - bundle close without open (OpenFlow 1.3)])
5404 AT_KEYWORDS([monitor])
5405 OVS_VSWITCHD_START
5406
5407 # Start a monitor, use the required protocol version
5408 ovs-ofctl -O OpenFlow13 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1
5409 AT_CAPTURE_FILE([monitor.log])
5410
5411 ovs-appctl -t ovs-ofctl ofctl/send "04 04 00 18 00 00 00 0a 4F 4E 46 00 00 00 08 FC 00 00 00 01 00 02 00 02"
5412 ovs-appctl -t ovs-ofctl ofctl/barrier
5413 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
5414
5415 AT_CHECK([ofctl_strip < monitor.log], [0], [dnl
5416 send: ONFT_BUNDLE_CONTROL (OF1.3):
5417 bundle_id=0x1 type=CLOSE_REQUEST flags=ordered
5418 OFPT_ERROR (OF1.3): OFPBFC_BAD_ID
5419 ONFT_BUNDLE_CONTROL (OF1.3):
5420 bundle_id=0x1 type=CLOSE_REQUEST flags=ordered
5421 OFPT_BARRIER_REPLY (OF1.3):
5422 ])
5423
5424 OVS_VSWITCHD_STOP
5425 AT_CLEANUP
5426
5427 AT_SETUP([ofproto - bundle double close (OpenFlow 1.3)])
5428 AT_KEYWORDS([monitor])
5429 OVS_VSWITCHD_START
5430
5431 # Start a monitor, use the required protocol version
5432 ovs-ofctl -O OpenFlow13 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1
5433 AT_CAPTURE_FILE([monitor.log])
5434
5435 # Open, Close, Close
5436 ovs-appctl -t ovs-ofctl ofctl/send "04 04 00 18 00 00 00 0a 4F 4E 46 00 00 00 08 FC 00 00 00 01 00 00 00 02"
5437 ovs-appctl -t ovs-ofctl ofctl/barrier
5438 ovs-appctl -t ovs-ofctl ofctl/send "04 04 00 18 00 00 00 0a 4F 4E 46 00 00 00 08 FC 00 00 00 01 00 02 00 02"
5439 ovs-appctl -t ovs-ofctl ofctl/barrier
5440 ovs-appctl -t ovs-ofctl ofctl/send "04 04 00 18 00 00 00 0a 4F 4E 46 00 00 00 08 FC 00 00 00 01 00 02 00 02"
5441 ovs-appctl -t ovs-ofctl ofctl/barrier
5442 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
5443
5444 AT_CHECK([ofctl_strip < monitor.log], [0], [dnl
5445 send: ONFT_BUNDLE_CONTROL (OF1.3):
5446 bundle_id=0x1 type=OPEN_REQUEST flags=ordered
5447 ONFT_BUNDLE_CONTROL (OF1.3):
5448 bundle_id=0x1 type=OPEN_REPLY flags=0
5449 OFPT_BARRIER_REPLY (OF1.3):
5450 send: ONFT_BUNDLE_CONTROL (OF1.3):
5451 bundle_id=0x1 type=CLOSE_REQUEST flags=ordered
5452 ONFT_BUNDLE_CONTROL (OF1.3):
5453 bundle_id=0x1 type=CLOSE_REPLY flags=0
5454 OFPT_BARRIER_REPLY (OF1.3):
5455 send: ONFT_BUNDLE_CONTROL (OF1.3):
5456 bundle_id=0x1 type=CLOSE_REQUEST flags=ordered
5457 OFPT_ERROR (OF1.3): OFPBFC_BUNDLE_CLOSED
5458 ONFT_BUNDLE_CONTROL (OF1.3):
5459 bundle_id=0x1 type=CLOSE_REQUEST flags=ordered
5460 OFPT_BARRIER_REPLY (OF1.3):
5461 ])
5462
5463 OVS_VSWITCHD_STOP
5464 AT_CLEANUP
5465
5466 AT_SETUP([ofproto - bundle close, different flags (OpenFlow 1.3)])
5467 AT_KEYWORDS([monitor])
5468 OVS_VSWITCHD_START
5469
5470 # Start a monitor, use the required protocol version
5471 ovs-ofctl -O OpenFlow13 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1
5472 AT_CAPTURE_FILE([monitor.log])
5473
5474 # Open, Close
5475 ovs-appctl -t ovs-ofctl ofctl/send "04 04 00 18 00 00 00 0a 4F 4E 46 00 00 00 08 FC 00 00 00 01 00 00 00 02"
5476 ovs-appctl -t ovs-ofctl ofctl/barrier
5477 ovs-appctl -t ovs-ofctl ofctl/send "04 04 00 18 00 00 00 0a 4F 4E 46 00 00 00 08 FC 00 00 00 01 00 02 00 01"
5478 ovs-appctl -t ovs-ofctl ofctl/barrier
5479 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
5480
5481 AT_CHECK([ofctl_strip < monitor.log], [0], [dnl
5482 send: ONFT_BUNDLE_CONTROL (OF1.3):
5483 bundle_id=0x1 type=OPEN_REQUEST flags=ordered
5484 ONFT_BUNDLE_CONTROL (OF1.3):
5485 bundle_id=0x1 type=OPEN_REPLY flags=0
5486 OFPT_BARRIER_REPLY (OF1.3):
5487 send: ONFT_BUNDLE_CONTROL (OF1.3):
5488 bundle_id=0x1 type=CLOSE_REQUEST flags=atomic
5489 OFPT_ERROR (OF1.3): OFPBFC_BAD_FLAGS
5490 ONFT_BUNDLE_CONTROL (OF1.3):
5491 bundle_id=0x1 type=CLOSE_REQUEST flags=atomic
5492 OFPT_BARRIER_REPLY (OF1.3):
5493 ])
5494
5495 OVS_VSWITCHD_STOP
5496 AT_CLEANUP
5497
5498 AT_SETUP([ofproto - bundle commit without open (OpenFlow 1.3)])
5499 AT_KEYWORDS([monitor])
5500 OVS_VSWITCHD_START
5501
5502 # Start a monitor, use the required protocol version
5503 ovs-ofctl -O OpenFlow13 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1
5504 AT_CAPTURE_FILE([monitor.log])
5505
5506 # Commit
5507 ovs-appctl -t ovs-ofctl ofctl/send "04 04 00 18 00 00 00 0a 4F 4E 46 00 00 00 08 FC 00 00 00 01 00 04 00 02"
5508 ovs-appctl -t ovs-ofctl ofctl/barrier
5509 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
5510
5511 AT_CHECK([ofctl_strip < monitor.log], [0], [dnl
5512 send: ONFT_BUNDLE_CONTROL (OF1.3):
5513 bundle_id=0x1 type=COMMIT_REQUEST flags=ordered
5514 OFPT_ERROR (OF1.3): OFPBFC_BAD_ID
5515 ONFT_BUNDLE_CONTROL (OF1.3):
5516 bundle_id=0x1 type=COMMIT_REQUEST flags=ordered
5517 OFPT_BARRIER_REPLY (OF1.3):
5518 ])
5519
5520 OVS_VSWITCHD_STOP
5521 AT_CLEANUP
5522
5523 AT_SETUP([ofproto - bundle commit, different flags (OpenFlow 1.3)])
5524 AT_KEYWORDS([monitor])
5525 OVS_VSWITCHD_START
5526
5527 # Start a monitor, use the required protocol version
5528 ovs-ofctl -O OpenFlow13 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1
5529 AT_CAPTURE_FILE([monitor.log])
5530
5531 # Open, Commit
5532 ovs-appctl -t ovs-ofctl ofctl/send "04 04 00 18 00 00 00 0a 4F 4E 46 00 00 00 08 FC 00 00 00 01 00 00 00 02"
5533 ovs-appctl -t ovs-ofctl ofctl/barrier
5534 ovs-appctl -t ovs-ofctl ofctl/send "04 04 00 18 00 00 00 0a 4F 4E 46 00 00 00 08 FC 00 00 00 01 00 04 00 01"
5535 ovs-appctl -t ovs-ofctl ofctl/barrier
5536 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
5537
5538 AT_CHECK([ofctl_strip < monitor.log], [0], [dnl
5539 send: ONFT_BUNDLE_CONTROL (OF1.3):
5540 bundle_id=0x1 type=OPEN_REQUEST flags=ordered
5541 ONFT_BUNDLE_CONTROL (OF1.3):
5542 bundle_id=0x1 type=OPEN_REPLY flags=0
5543 OFPT_BARRIER_REPLY (OF1.3):
5544 send: ONFT_BUNDLE_CONTROL (OF1.3):
5545 bundle_id=0x1 type=COMMIT_REQUEST flags=atomic
5546 OFPT_ERROR (OF1.3): OFPBFC_BAD_FLAGS
5547 ONFT_BUNDLE_CONTROL (OF1.3):
5548 bundle_id=0x1 type=COMMIT_REQUEST flags=atomic
5549 OFPT_BARRIER_REPLY (OF1.3):
5550 ])
5551
5552 OVS_VSWITCHD_STOP
5553 AT_CLEANUP
5554
5555 AT_SETUP([ofproto - bundle discard without open (OpenFlow 1.3)])
5556 AT_KEYWORDS([monitor])
5557 OVS_VSWITCHD_START
5558
5559 # Start a monitor, use the required protocol version
5560 ovs-ofctl -O OpenFlow13 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1
5561 AT_CAPTURE_FILE([monitor.log])
5562
5563 # Discard
5564 ovs-appctl -t ovs-ofctl ofctl/send "04 04 00 18 00 00 00 0a 4F 4E 46 00 00 00 08 FC 00 00 00 01 00 06 00 02"
5565 ovs-appctl -t ovs-ofctl ofctl/barrier
5566 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
5567
5568 AT_CHECK([ofctl_strip < monitor.log], [0], [dnl
5569 send: ONFT_BUNDLE_CONTROL (OF1.3):
5570 bundle_id=0x1 type=DISCARD_REQUEST flags=ordered
5571 OFPT_ERROR (OF1.3): OFPBFC_BAD_ID
5572 ONFT_BUNDLE_CONTROL (OF1.3):
5573 bundle_id=0x1 type=DISCARD_REQUEST flags=ordered
5574 OFPT_BARRIER_REPLY (OF1.3):
5575 ])
5576
5577 OVS_VSWITCHD_STOP
5578 AT_CLEANUP
5579
5580
5581 AT_SETUP([ofproto - bundle with multiple flow mods (OpenFlow 1.3)])
5582 OVS_VSWITCHD_START
5583
5584 AT_CHECK([ovs-appctl vlog/set vconn:dbg])
5585
5586 AT_CHECK([ovs-ofctl --no-names del-flows br0])
5587
5588 AT_DATA([flows.txt], [dnl
5589 add idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=1
5590 add idle_timeout=60 in_port=2 dl_src=00:77:88:99:aa:bb actions=2
5591 add idle_timeout=70 in_port=2 dl_src=00:88:99:aa:bb:cc actions=3
5592 add idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=4
5593 delete
5594 add idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=5
5595 add idle_timeout=60 in_port=2 dl_src=00:77:88:99:aa:bb actions=6
5596 add idle_timeout=70 in_port=2 dl_src=00:88:99:aa:bb:cc actions=7
5597 delete in_port=2 dl_src=00:88:99:aa:bb:cc
5598 ])
5599
5600 AT_CHECK([ovs-ofctl -O OpenFlow13 --no-names --bundle add-flows br0 flows.txt])
5601
5602 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
5603 idle_timeout=50, in_port=2,dl_src=00:66:77:88:99:aa actions=output:5
5604 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:6
5605 NXST_FLOW reply:
5606 ])
5607
5608 AT_DATA([flows.txt], [dnl
5609 modify actions=drop
5610 modify_strict in_port=2 dl_src=00:77:88:99:aa:bb actions=7
5611 ])
5612
5613 AT_CHECK([ovs-ofctl -O OpenFlow13 --no-names --bundle add-flows br0 flows.txt])
5614
5615 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
5616 idle_timeout=50, in_port=2,dl_src=00:66:77:88:99:aa actions=drop
5617 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:7
5618 NXST_FLOW reply:
5619 ])
5620
5621 # Adding an existing flow acts as a modify, and delete_strict also works.
5622 AT_DATA([flows.txt], [dnl
5623 add idle_timeout=60 in_port=2 dl_src=00:77:88:99:aa:bb actions=8
5624 delete_strict in_port=2 dl_src=00:66:77:88:99:aa
5625 add in_port=2 dl_src=00:66:77:88:99:aa actions=drop
5626 ])
5627
5628 AT_CHECK([ovs-ofctl -O OpenFlow13 --bundle --no-names add-flows br0 flows.txt])
5629
5630 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
5631 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:8
5632 in_port=2,dl_src=00:66:77:88:99:aa actions=drop
5633 NXST_FLOW reply:
5634 ])
5635
5636 dnl Check logs for OpenFlow trace
5637 # Prevent race.
5638 OVS_WAIT_UNTIL([vconn_sub < ovs-vswitchd.log | test `grep -- "|vconn|DBG|unix: sent (Success): NXST_FLOW reply" | wc -l` -ge 3])
5639 AT_CHECK([print_vconn_debug | vconn_sub | ofctl_strip], [0], [dnl
5640 vconn|DBG|unix: sent (Success): OFPT_HELLO (OF1.6):
5641 version bitmap: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
5642 vconn|DBG|unix: received: OFPT_HELLO:
5643 version bitmap: 0x01
5644 vconn|DBG|unix: negotiated OpenFlow version 0x01 (we support version 0x07 and earlier, peer supports version 0x01)
5645 vconn|DBG|unix: received: OFPT_FLOW_MOD: DEL actions=drop
5646 vconn|DBG|unix: received: OFPT_BARRIER_REQUEST:
5647 vconn|DBG|unix: sent (Success): OFPT_BARRIER_REPLY:
5648 vconn|DBG|unix: sent (Success): OFPT_HELLO (OF1.6):
5649 version bitmap: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
5650 vconn|DBG|unix: received: OFPT_HELLO (OF1.3):
5651 version bitmap: 0x04
5652 vconn|DBG|unix: negotiated OpenFlow version 0x04 (we support version 0x07 and earlier, peer supports version 0x04)
5653 vconn|DBG|unix: received: ONFT_BUNDLE_CONTROL (OF1.3):
5654 bundle_id=0 type=OPEN_REQUEST flags=atomic ordered
5655 vconn|DBG|unix: sent (Success): ONFT_BUNDLE_CONTROL (OF1.3):
5656 bundle_id=0 type=OPEN_REPLY flags=0
5657 vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3):
5658 bundle_id=0 flags=atomic ordered
5659 OFPT_FLOW_MOD (OF1.3): ADD in_port=2,dl_src=00:66:77:88:99:aa idle:50 actions=output:1
5660 vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3):
5661 bundle_id=0 flags=atomic ordered
5662 OFPT_FLOW_MOD (OF1.3): ADD in_port=2,dl_src=00:77:88:99:aa:bb idle:60 actions=output:2
5663 vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3):
5664 bundle_id=0 flags=atomic ordered
5665 OFPT_FLOW_MOD (OF1.3): ADD in_port=2,dl_src=00:88:99:aa:bb:cc idle:70 actions=output:3
5666 vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3):
5667 bundle_id=0 flags=atomic ordered
5668 OFPT_FLOW_MOD (OF1.3): ADD in_port=2,dl_src=00:66:77:88:99:aa idle:50 actions=output:4
5669 vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3):
5670 bundle_id=0 flags=atomic ordered
5671 OFPT_FLOW_MOD (OF1.3): DEL table:255 actions=drop
5672 vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3):
5673 bundle_id=0 flags=atomic ordered
5674 OFPT_FLOW_MOD (OF1.3): ADD in_port=2,dl_src=00:66:77:88:99:aa idle:50 actions=output:5
5675 vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3):
5676 bundle_id=0 flags=atomic ordered
5677 OFPT_FLOW_MOD (OF1.3): ADD in_port=2,dl_src=00:77:88:99:aa:bb idle:60 actions=output:6
5678 vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3):
5679 bundle_id=0 flags=atomic ordered
5680 OFPT_FLOW_MOD (OF1.3): ADD in_port=2,dl_src=00:88:99:aa:bb:cc idle:70 actions=output:7
5681 vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3):
5682 bundle_id=0 flags=atomic ordered
5683 OFPT_FLOW_MOD (OF1.3): DEL table:255 in_port=2,dl_src=00:88:99:aa:bb:cc actions=drop
5684 vconn|DBG|unix: received: OFPT_BARRIER_REQUEST (OF1.3):
5685 vconn|DBG|unix: sent (Success): OFPT_BARRIER_REPLY (OF1.3):
5686 vconn|DBG|unix: received: ONFT_BUNDLE_CONTROL (OF1.3):
5687 bundle_id=0 type=COMMIT_REQUEST flags=atomic ordered
5688 vconn|DBG|unix: sent (Success): ONFT_BUNDLE_CONTROL (OF1.3):
5689 bundle_id=0 type=COMMIT_REPLY flags=0
5690 vconn|DBG|unix: sent (Success): OFPT_HELLO (OF1.6):
5691 version bitmap: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
5692 vconn|DBG|unix: received: OFPT_HELLO:
5693 version bitmap: 0x01
5694 vconn|DBG|unix: negotiated OpenFlow version 0x01 (we support version 0x07 and earlier, peer supports version 0x01)
5695 vconn|DBG|unix: received: NXT_SET_FLOW_FORMAT: format=nxm
5696 vconn|DBG|unix: received: OFPT_BARRIER_REQUEST:
5697 vconn|DBG|unix: sent (Success): OFPT_BARRIER_REPLY:
5698 vconn|DBG|unix: received: NXST_FLOW request:
5699 vconn|DBG|unix: sent (Success): NXST_FLOW reply:
5700 idle_timeout=50, in_port=2,dl_src=00:66:77:88:99:aa actions=output:5
5701 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:6
5702 vconn|DBG|unix: sent (Success): OFPT_HELLO (OF1.6):
5703 version bitmap: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
5704 vconn|DBG|unix: received: OFPT_HELLO (OF1.3):
5705 version bitmap: 0x04
5706 vconn|DBG|unix: negotiated OpenFlow version 0x04 (we support version 0x07 and earlier, peer supports version 0x04)
5707 vconn|DBG|unix: received: ONFT_BUNDLE_CONTROL (OF1.3):
5708 bundle_id=0 type=OPEN_REQUEST flags=atomic ordered
5709 vconn|DBG|unix: sent (Success): ONFT_BUNDLE_CONTROL (OF1.3):
5710 bundle_id=0 type=OPEN_REPLY flags=0
5711 vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3):
5712 bundle_id=0 flags=atomic ordered
5713 OFPT_FLOW_MOD (OF1.3): MOD actions=drop
5714 vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3):
5715 bundle_id=0 flags=atomic ordered
5716 OFPT_FLOW_MOD (OF1.3): MOD_STRICT in_port=2,dl_src=00:77:88:99:aa:bb actions=output:7
5717 vconn|DBG|unix: received: OFPT_BARRIER_REQUEST (OF1.3):
5718 vconn|DBG|unix: sent (Success): OFPT_BARRIER_REPLY (OF1.3):
5719 vconn|DBG|unix: received: ONFT_BUNDLE_CONTROL (OF1.3):
5720 bundle_id=0 type=COMMIT_REQUEST flags=atomic ordered
5721 vconn|DBG|unix: sent (Success): ONFT_BUNDLE_CONTROL (OF1.3):
5722 bundle_id=0 type=COMMIT_REPLY flags=0
5723 vconn|DBG|unix: sent (Success): OFPT_HELLO (OF1.6):
5724 version bitmap: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
5725 vconn|DBG|unix: received: OFPT_HELLO:
5726 version bitmap: 0x01
5727 vconn|DBG|unix: negotiated OpenFlow version 0x01 (we support version 0x07 and earlier, peer supports version 0x01)
5728 vconn|DBG|unix: received: NXT_SET_FLOW_FORMAT: format=nxm
5729 vconn|DBG|unix: received: OFPT_BARRIER_REQUEST:
5730 vconn|DBG|unix: sent (Success): OFPT_BARRIER_REPLY:
5731 vconn|DBG|unix: received: NXST_FLOW request:
5732 vconn|DBG|unix: sent (Success): NXST_FLOW reply:
5733 idle_timeout=50, in_port=2,dl_src=00:66:77:88:99:aa actions=drop
5734 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:7
5735 vconn|DBG|unix: sent (Success): OFPT_HELLO (OF1.6):
5736 version bitmap: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
5737 vconn|DBG|unix: received: OFPT_HELLO (OF1.3):
5738 version bitmap: 0x04
5739 vconn|DBG|unix: negotiated OpenFlow version 0x04 (we support version 0x07 and earlier, peer supports version 0x04)
5740 vconn|DBG|unix: received: ONFT_BUNDLE_CONTROL (OF1.3):
5741 bundle_id=0 type=OPEN_REQUEST flags=atomic ordered
5742 vconn|DBG|unix: sent (Success): ONFT_BUNDLE_CONTROL (OF1.3):
5743 bundle_id=0 type=OPEN_REPLY flags=0
5744 vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3):
5745 bundle_id=0 flags=atomic ordered
5746 OFPT_FLOW_MOD (OF1.3): ADD in_port=2,dl_src=00:77:88:99:aa:bb idle:60 actions=output:8
5747 vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3):
5748 bundle_id=0 flags=atomic ordered
5749 OFPT_FLOW_MOD (OF1.3): DEL_STRICT table:255 in_port=2,dl_src=00:66:77:88:99:aa actions=drop
5750 vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3):
5751 bundle_id=0 flags=atomic ordered
5752 OFPT_FLOW_MOD (OF1.3): ADD in_port=2,dl_src=00:66:77:88:99:aa actions=drop
5753 vconn|DBG|unix: received: OFPT_BARRIER_REQUEST (OF1.3):
5754 vconn|DBG|unix: sent (Success): OFPT_BARRIER_REPLY (OF1.3):
5755 vconn|DBG|unix: received: ONFT_BUNDLE_CONTROL (OF1.3):
5756 bundle_id=0 type=COMMIT_REQUEST flags=atomic ordered
5757 vconn|DBG|unix: sent (Success): ONFT_BUNDLE_CONTROL (OF1.3):
5758 bundle_id=0 type=COMMIT_REPLY flags=0
5759 vconn|DBG|unix: sent (Success): OFPT_HELLO (OF1.6):
5760 version bitmap: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
5761 vconn|DBG|unix: received: OFPT_HELLO:
5762 version bitmap: 0x01
5763 vconn|DBG|unix: negotiated OpenFlow version 0x01 (we support version 0x07 and earlier, peer supports version 0x01)
5764 vconn|DBG|unix: received: NXT_SET_FLOW_FORMAT: format=nxm
5765 vconn|DBG|unix: received: OFPT_BARRIER_REQUEST:
5766 vconn|DBG|unix: sent (Success): OFPT_BARRIER_REPLY:
5767 vconn|DBG|unix: received: NXST_FLOW request:
5768 vconn|DBG|unix: sent (Success): NXST_FLOW reply:
5769 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:8
5770 in_port=2,dl_src=00:66:77:88:99:aa actions=drop
5771 ])
5772
5773 OVS_VSWITCHD_STOP
5774 AT_CLEANUP
5775
5776
5777 AT_SETUP([ofproto - failing bundle add message (OpenFlow 1.3)])
5778 OVS_VSWITCHD_START
5779
5780 AT_CHECK([ovs-ofctl del-flows br0])
5781
5782 ovs-ofctl add-flows br0 - <<EOF
5783 idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=11
5784 idle_timeout=60 in_port=2 dl_src=00:77:88:99:aa:bb actions=22
5785 idle_timeout=70 in_port=2 dl_src=00:88:99:aa:bb:cc actions=33
5786 EOF
5787 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
5788 idle_timeout=50, in_port=2,dl_src=00:66:77:88:99:aa actions=output:11
5789 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:22
5790 idle_timeout=70, in_port=2,dl_src=00:88:99:aa:bb:cc actions=output:33
5791 NXST_FLOW reply:
5792 ])
5793
5794 # last line uses illegal table number (OVS internal table)
5795 AT_DATA([flows.txt], [dnl
5796 add idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=1
5797 add idle_timeout=60 in_port=2 dl_src=00:77:88:99:aa:bb actions=2
5798 add idle_timeout=70 in_port=2 dl_src=00:88:99:aa:bb:cc actions=3
5799 modify idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=4
5800 delete
5801 add idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=5
5802 add idle_timeout=60 in_port=2 dl_src=00:77:88:99:aa:bb actions=6
5803 add idle_timeout=70 in_port=2 dl_src=00:88:99:aa:bb:cc actions=7
5804 delete in_port=2 dl_src=00:88:99:aa:bb:cc
5805 add table=254 actions=drop
5806 ])
5807
5808 AT_CHECK([ovs-ofctl -O OpenFlow13 --bundle add-flows br0 flows.txt 2>&1 | sed '/talking to/,$d' | strip_xids],
5809 [0], [dnl
5810 Error OFPBRC_EPERM for: OFPT_FLOW_MOD (OF1.3): ADD table:254 actions=drop
5811 ])
5812
5813 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
5814 idle_timeout=50, in_port=2,dl_src=00:66:77:88:99:aa actions=output:11
5815 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:22
5816 idle_timeout=70, in_port=2,dl_src=00:88:99:aa:bb:cc actions=output:33
5817 NXST_FLOW reply:
5818 ])
5819
5820 OVS_VSWITCHD_STOP
5821 AT_CLEANUP
5822
5823
5824 AT_SETUP([ofproto - failing bundle commit (OpenFlow 1.3)])
5825 OVS_VSWITCHD_START
5826
5827 AT_CHECK([ovs-ofctl del-flows br0])
5828
5829 # Invalid group numbers are detected at commit time
5830 AT_DATA([flows.txt], [dnl
5831 add idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=group:1
5832 add idle_timeout=60 in_port=2 dl_src=00:77:88:99:aa:bb actions=group:2
5833 add idle_timeout=70 in_port=2 dl_src=00:88:99:aa:bb:cc actions=group:3
5834 ])
5835
5836 AT_CHECK([ovs-ofctl -O OpenFlow13 --bundle add-flows br0 flows.txt 2>&1 | sed '/talking to/,$d' | strip_xids],
5837 [0], [dnl
5838 Error OFPBAC_BAD_OUT_GROUP for: OFPT_FLOW_MOD (OF1.3): ADD in_port=2,dl_src=00:66:77:88:99:aa idle:50 actions=group:1
5839 Error OFPBFC_MSG_FAILED for: ONFT_BUNDLE_CONTROL (OF1.3):
5840 bundle_id=0 type=COMMIT_REQUEST flags=atomic ordered
5841 ])
5842
5843 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
5844 NXST_FLOW reply:
5845 ])
5846
5847 OVS_VSWITCHD_STOP
5848 AT_CLEANUP
5849
5850 AT_SETUP([ofproto - monitor flows with tun_md])
5851 OVS_VSWITCHD_START
5852
5853 AT_CHECK([ovs-ofctl add-tlv-map br0 "{class=0xffff,type=0,len=4}->tun_metadata0"])
5854 AT_CHECK([ovs-ofctl add-flow br0 tun_metadata0=0x1,actions=drop])
5855
5856 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0], [dnl
5857 NXST_FLOW reply:
5858 tun_metadata0=0x1 actions=drop
5859 ])
5860
5861 AT_CAPTURE_FILE([ofctl_monitor.log])
5862 dnl Usually ovs-ofctl monitor outputs on stderr, but the first message here
5863 dnl is put on stdout, because it is handled by ofctl in dump_transaction()
5864 dnl and not in monitor_vconn().
5865 AT_CHECK([ovs-ofctl monitor br0 65534 watch: --detach --no-chdir --pidfile >ofctl_monitor.log 2>&1])
5866
5867 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 2])
5868
5869 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
5870 NXST_FLOW_MONITOR reply:
5871 event=ADDED table=0 cookie=0 tun_metadata0=0x1
5872 ])
5873
5874 AT_CHECK([ovs-ofctl del-flows br0])
5875
5876 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 4])
5877
5878 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
5879 NXST_FLOW_MONITOR reply:
5880 event=ADDED table=0 cookie=0 tun_metadata0=0x1
5881 NXST_FLOW_MONITOR reply:
5882 event=DELETED reason=delete table=0 cookie=0 tun_metadata0=0x1
5883 ])
5884
5885 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
5886
5887 dnl Check that vswitchd hasn't crashed
5888 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0], [dnl
5889 NXST_FLOW reply:
5890 ])
5891
5892 OVS_VSWITCHD_STOP
5893 AT_CLEANUP
5894
5895 AT_SETUP([ofproto - flow mod with tunnel metadata])
5896 AT_KEYWORDS([ofp-actions])
5897 OVS_VSWITCHD_START
5898
5899 AT_CHECK([ovs-ofctl add-tlv-map br0 "{class=0xffff,type=0,len=4}->tun_metadata0"])
5900 AT_CHECK([ovs-ofctl add-flow br0 "in_port=1 actions=move:tun_metadata0[[0..31]]->NXM_NX_REG0[[]]"])
5901
5902 dnl Check the length of tun_metadata0 in the replied OXM header.
5903 dnl Ignore the first 0x50 bytes of hex dump from the reply msg since the NXM
5904 dnl header that describes the tunnel metadata starts at offset 0x50.
5905 AT_CHECK([ovs-ofctl dump-flows br0 -mmmm], [0], [stdout])
5906 AT_CHECK([sed -e 's/duration=[[0-9.]]*s/duration=?s/' -e 's/idle_age=[[0-9]]*/idle_age=?/' -e '/^000000[[0-4]]0 / d' stdout | strip_xids], [0], [dnl
5907 NXST_FLOW reply:
5908 cookie=0x0, duration=?s, table=0, n_packets=0, n_bytes=0, idle_age=?, in_port=1 actions=move:NXM_NX_TUN_METADATA0[[0..31]]->NXM_NX_REG0[[]]
5909 00000050 ff ff 00 18 00 00 23 20-00 06 00 20 00 00 00 00 |......# ... ....|
5910 00000060 00 01 50 04 00 01 00 04- |..P..... |
5911 ])
5912
5913 dnl Check actions that may use tun_metadata
5914 AT_CHECK([ovs-ofctl add-flow br0 "in_port=2 actions=move:tun_metadata1[[0..31]]->NXM_NX_REG0[[]]"], [1], [], [stderr])
5915 AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
5916 OFPT_ERROR: NXFMFC_INVALID_TLV_FIELD
5917 ])
5918
5919 AT_CHECK([ovs-ofctl add-flow br0 "in_port=2 actions=move:tun_metadata0[[32..63]]->NXM_NX_REG0[[]]"], [1], [], [stderr])
5920 AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
5921 OFPT_ERROR: OFPBAC_BAD_SET_LEN
5922 ])
5923
5924 AT_CHECK([ovs-ofctl add-flow br0 "in_port=2 actions=push:tun_metadata1[[0..31]]"], [1], [], [stderr])
5925 AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
5926 OFPT_ERROR: NXFMFC_INVALID_TLV_FIELD
5927 ])
5928
5929 AT_CHECK([ovs-ofctl add-flow br0 "in_port=2 actions=pop:tun_metadata0[[32..63]]"], [1], [], [stderr])
5930 AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
5931 OFPT_ERROR: OFPBAC_BAD_SET_LEN
5932 ])
5933
5934 AT_CHECK([ovs-ofctl add-flow br0 "in_port=3, actions=load:0x11223344->tun_metadata1"], [1], [], [stderr])
5935 AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
5936 OFPT_ERROR: NXFMFC_INVALID_TLV_FIELD
5937 ])
5938
5939 AT_CHECK([ovs-ofctl add-flow br0 "in_port=2 actions=output:tun_metadata1[[0..31]]"], [1], [], [stderr])
5940 AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
5941 OFPT_ERROR: NXFMFC_INVALID_TLV_FIELD
5942 ])
5943
5944 AT_CHECK([ovs-ofctl add-flow br0 "in_port=2 actions=output:tun_metadata0[[32..63]]"], [1], [], [stderr])
5945 AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
5946 OFPT_ERROR: OFPBAC_BAD_SET_LEN
5947 ])
5948
5949 AT_CHECK([ovs-ofctl add-flow br0 "in_port=2 actions=multipath(eth_src,50,modulo_n,1,0,tun_metadata1[[0..31]])"], [1], [], [stderr])
5950 AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
5951 OFPT_ERROR: NXFMFC_INVALID_TLV_FIELD
5952 ])
5953
5954 AT_CHECK([ovs-ofctl add-flow br0 "in_port=2 actions=multipath(eth_src,50,modulo_n,1,0,tun_metadata0[[32..63]])"], [1], [], [stderr])
5955 AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
5956 OFPT_ERROR: OFPBAC_BAD_SET_LEN
5957 ])
5958
5959 AT_CHECK([ovs-ofctl add-flow br0 "in_port=2 actions=bundle_load(eth_src,50,hrw,ofport,tun_metadata1[[0..31]], slaves:4,8)"], [1], [], [stderr])
5960 AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
5961 OFPT_ERROR: NXFMFC_INVALID_TLV_FIELD
5962 ])
5963
5964 AT_CHECK([ovs-ofctl add-flow br0 "in_port=2 actions=bundle_load(eth_src,50,hrw,ofport,tun_metadata0[[32..63]], slaves:4,8)"], [1], [], [stderr])
5965 AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
5966 OFPT_ERROR: OFPBAC_BAD_SET_LEN
5967 ])
5968
5969 AT_CHECK([ovs-ofctl add-flow br0 "in_port=2 actions=learn(tun_metadata1[[0..31]]=reg0[[0..31]])"], [1], [], [stderr])
5970 AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
5971 OFPT_ERROR: NXFMFC_INVALID_TLV_FIELD
5972 ])
5973
5974 AT_CHECK([ovs-ofctl add-flow br0 "in_port=2 actions=learn(tun_metadata0[[32..63]]=reg0[[0..31]])"], [1], [], [stderr])
5975 AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
5976 OFPT_ERROR: OFPBAC_BAD_SET_LEN
5977 ])
5978
5979 AT_CHECK([ovs-ofctl add-flow br0 "in_port=2 actions=clone(move:tun_metadata1[[0..31]]->reg0[[0..31]])"], [1], [], [stderr])
5980 AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
5981 OFPT_ERROR: NXFMFC_INVALID_TLV_FIELD
5982 ])
5983
5984 AT_CHECK([ovs-ofctl add-flow br0 "in_port=2 actions=clone(move:tun_metadata0[[32..63]]->reg0[[0..31]])"], [1], [], [stderr])
5985 AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
5986 OFPT_ERROR: OFPBAC_BAD_SET_LEN
5987 ])
5988
5989 AT_CHECK([ovs-ofctl add-flow br0 "ip actions=ct(commit,zone=tun_metadata1[[0..15]],exec(set_field:0x01->ct_mark))"], [1], [], [stderr])
5990 AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
5991 OFPT_ERROR: NXFMFC_INVALID_TLV_FIELD
5992 ])
5993
5994 AT_CHECK([ovs-ofctl add-flow br0 "ip actions=ct(commit,zone=tun_metadata0[[32..47]],exec(set_field:0x01->ct_mark))"], [1], [], [stderr])
5995 AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
5996 OFPT_ERROR: OFPBAC_BAD_SET_LEN
5997 ])
5998
5999 AT_CHECK([ovs-ofctl add-flow br0 "ip actions=ct(commit,zone=1,exec(move:tun_metadata1[[0..31]]->ct_mark))"], [1], [], [stderr])
6000 AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
6001 OFPT_ERROR: NXFMFC_INVALID_TLV_FIELD
6002 ])
6003
6004 AT_CHECK([ovs-ofctl add-flow br0 "ip actions=ct(commit,zone=1,exec(move:tun_metadata0[[32..63]]->ct_mark))"], [1], [], [stderr])
6005 AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
6006 OFPT_ERROR: OFPBAC_BAD_SET_LEN
6007 ])
6008
6009 dnl Check match field with tun_metadata
6010 AT_CHECK([ovs-ofctl add-flow br0 "tun_metadata0=0x11223344 actions=output:2"], [0], [], [stderr])
6011 AT_CHECK([ovs-ofctl add-flow br0 "tun_metadata1=0x11223344 actions=output:2"], [1], [], [stderr])
6012 AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
6013 OFPT_ERROR: NXFMFC_INVALID_TLV_FIELD
6014 ])
6015
6016 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0], [dnl)
6017 NXST_FLOW reply:
6018 in_port=1 actions=move:NXM_NX_TUN_METADATA0[[0..31]]->NXM_NX_REG0[[]]
6019 tun_metadata0=0x11223344 actions=output:2
6020 ])
6021
6022 OVS_VSWITCHD_STOP(["/NXFMFC_INVALID_TLV_FIELD/d
6023 /tun_metadata0/d
6024 /OFPBAC_BAD_SET_LEN/d"])
6025 AT_CLEANUP