3 AT_SETUP([ofproto - echo request])
5 AT_CHECK([ovs-ofctl -vwarn probe br0])
9 AT_SETUP([ofproto - handling messages with bad version])
10 AT_KEYWORDS([monitor])
13 # Start a monitor running OpenFlow 1.0, then send the switch an OF1.1 features
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])
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):
30 OVS_VSWITCHD_STOP(["/received OpenFlow version 0x02 != expected 01/d"])
33 AT_SETUP([ofproto - feature request, config request])
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
44 speed: 0 Mbps now, 0 Mbps max
45 OFPT_GET_CONFIG_REPLY: frags=normal miss_send_len=0
50 AT_SETUP([ofproto - set OpenFlow port number])
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])
56 s/ (xid=0x[0-9a-fA-F]*)//
57 s/00:0.$/00:0x/' < stdout]],
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
66 speed: 0 Mbps now, 0 Mbps max
67 99(p2): addr:aa:55:aa:55:00:0x
70 speed: 0 Mbps now, 0 Mbps max
71 LOCAL(br0): addr:aa:55:aa:55:00:0x
74 speed: 0 Mbps now, 0 Mbps max
75 OFPT_GET_CONFIG_REPLY: frags=normal miss_send_len=0
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)])
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=?
94 AT_SETUP([ofproto - port stats - (OpenFlow 1.2)])
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=?
105 AT_SETUP([ofproto - port stats - (OpenFlow 1.4)])
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/'],
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=?
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)])
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
128 speed: 0 Mbps now, 0 Mbps max
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)])
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
143 speed: 0 Mbps now, 0 Mbps max
148 AT_SETUP([ofproto - port-desc stats (OpenFlow 1.5)])
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
157 speed: 0 Mbps now, 0 Mbps max
158 2(p2): addr:aa:55:aa:55:00:0x
161 speed: 0 Mbps now, 0 Mbps max
162 3(p3): addr:aa:55:aa:55:00:0x
165 speed: 0 Mbps now, 0 Mbps max
166 LOCAL(br0): addr:aa:55:aa:55:00:0x
169 speed: 0 Mbps now, 0 Mbps max
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
177 speed: 0 Mbps now, 0 Mbps max
182 AT_SETUP([ofproto - port-desc stats (OpenFlow 1.6)])
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
191 speed: 0 Mbps now, 0 Mbps max
192 2(p2): addr:aa:55:aa:55:00:0x
195 speed: 0 Mbps now, 0 Mbps max
196 3(p3): addr:aa:55:aa:55:00:0x
199 speed: 0 Mbps now, 0 Mbps max
200 LOCAL(br0): addr:aa:55:aa:55:00:0x
203 speed: 0 Mbps now, 0 Mbps max
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
211 speed: 0 Mbps now, 0 Mbps max
216 dnl CHECK_QUEUE_STATS(label, option, format)
217 m4_define([CHECK_QUEUE_STATS], [
218 AT_SETUP([ofproto - queue stats - (OpenFlow $1)])
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=?
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=?
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=?
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=?
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
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
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
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)])
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)])
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
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
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
288 AT_SETUP([ofproto - queue configuration - (OpenFlow 1.1)])
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
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
303 AT_SETUP([ofproto - queue configuration - (OpenFlow 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
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
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
325 AT_SETUP([ofproto - queue configuration - (OpenFlow 1.4)])
329 AT_CHECK([ovs-ofctl -O OpenFlow14 queue-get-config br0 any | strip_xids], [0],
330 [OFPST_QUEUE_DESC reply (OF1.4): port=1
338 AT_CHECK([ovs-ofctl -O OpenFlow14 queue-get-config br0 1 | strip_xids], [0],
339 [OFPST_QUEUE_DESC reply (OF1.4): port=1
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
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
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)])
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
364 AT_DATA([stderr], [dnl
365 ovs-ofctl: none of the usable flow formats (OXM,OpenFlow11) is among the allowed flow formats (OpenFlow10,NXM)
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])
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)])
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
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):
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
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
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):
409 AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn del-groups br0 group_id=0xfffffff0],
410 [1], [], [ovs-ofctl: invalid group id 4294967280
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])
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***
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])
431 AT_SETUP([ofproto - group mod with mod and add_or_mod command])
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
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
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
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)])
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
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
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):
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):
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):
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])
502 AT_DATA([groups.txt], [dnl
503 group_id=1234,type=all,bucket=output:10
504 group_id=1235,type=all,bucket=output:10
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
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],
514 table=2, udp actions=group:1235
515 tcp actions=group:1234
516 OFPST_FLOW reply (OF1.1):
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],
521 table=2, udp actions=group:1235
522 OFPST_FLOW reply (OF1.1):
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],
527 table=2, udp actions=group:1235
528 OFPST_FLOW reply (OF1.1):
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],
533 OFPST_FLOW reply (OF1.1):
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])
543 # Add group with no buckets.
544 AT_DATA([groups.txt], [dnl
545 group_id=1234,type=all
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
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
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
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
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
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):
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
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
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
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
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
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')
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])
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
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
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
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
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
666 AT_DATA([buckets.txt], [dnl
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
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
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')
691 AT_SETUP([ofproto - bundle del group (OpenFlow 1.3)])
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
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):
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
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
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):
723 AT_CHECK([ovs-ofctl --bundle -O OpenFlow13 -vwarn del-groups br0 group_id=0xfffffff0],
724 [1], [], [ovs-ofctl: invalid group id 4294967280
729 AT_SETUP([ofproto - bundle add indirect group])
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***
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])
744 AT_SETUP([ofproto - bundle group mod with mod and add_or_mod command])
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
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
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
770 AT_SETUP([ofproto - bundle del group (OpenFlow 1.5)])
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
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
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):
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):
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):
805 AT_SETUP([ofproto - bundle del group deletes flows])
807 AT_DATA([groups.txt], [dnl
808 group_id=1234,type=all,bucket=output:10
809 group_id=1235,type=all,bucket=output:10
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
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],
819 table=2, udp actions=group:1235
820 tcp actions=group:1234
821 OFPST_FLOW reply (OF1.4):
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],
826 table=2, udp actions=group:1235
827 OFPST_FLOW reply (OF1.4):
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],
832 table=2, udp actions=group:1235
833 OFPST_FLOW reply (OF1.4):
835 AT_CHECK([ovs-ofctl --bundle -vwarn del-groups br0])
836 AT_CHECK([ovs-ofctl -O OpenFlow14 -vwarn dump-flows br0 | ofctl_strip | sort],
838 OFPST_FLOW reply (OF1.4):
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])
848 # Add group with no buckets.
849 AT_DATA([groups.txt], [dnl
850 group_id=1234,type=all
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
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
867 # Start over again, then add two buckets using "first".
868 AT_DATA([groups.txt], [dnl
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
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
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
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
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
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
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
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
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
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
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')
943 AT_SETUP([ofproto - bundle remove group buckets])
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
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
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
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
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
972 AT_DATA([buckets.txt], [dnl
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
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
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')
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])
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
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])
1010 # The output should look like this:
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............|
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):
1026 AT_SETUP([ofproto - bundle flow mod checks group availability])
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
1033 AT_CHECK([ovs-ofctl -vwarn bundle br0 bundle.txt], [1], [], [stderr])
1035 # The output should look like this:
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............|
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],
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
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])
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
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])
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
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])
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):
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
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
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
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)])
1109 AT_DATA([groups.txt], [dnl
1110 group_id=1234,type=all,bucket=output:10
1111 group_id=1235,type=all,bucket=output:10
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):
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):
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)])
1133 AT_DATA([groups.txt], [dnl
1134 group_id=1234,type=all,bucket=output:10
1135 group_id=1235,type=all,bucket=output:10
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):
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):
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)])
1157 AT_DATA([groups.txt], [dnl
1158 group_id=1234,type=all,bucket=output:10
1159 group_id=1235,type=all,bucket=output:10
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):
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):
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)])
1181 AT_DATA([groups.txt], [dnl
1182 group_id=1234,type=all,bucket=output:10
1183 group_id=1235,type=all,bucket=output:10
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)
1189 AT_CHECK([ovs-ofctl -O OpenFlow13 -vwarn add-groups br0 groups.txt])
1190 AT_CHECK([ovs-vsctl del-br br0])
1194 AT_SETUP([ofproto - mod-port (OpenFlow 1.0)])
1196 for command_config_state in \
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' \
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
1221 speed: 0 Mbps now, 0 Mbps max
1222 OFPT_GET_CONFIG_REPLY: frags=normal miss_send_len=0
1228 AT_SETUP([ofproto - mod-port (OpenFlow 1.2)])
1230 for command_config_state in \
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' \
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
1252 speed: 0 Mbps now, 0 Mbps max
1253 OFPT_GET_CONFIG_REPLY (OF1.2): frags=normal miss_send_len=0
1259 AT_SETUP([ofproto - mod-port (OpenFlow 1.4)])
1261 for command_config_state in \
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' \
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
1284 speed: 0 Mbps now, 0 Mbps max
1285 OFPT_GET_CONFIG_REPLY (OF1.4): frags=normal miss_send_len=0
1291 AT_SETUP([ofproto - mod-port (OpenFlow 1.6)])
1293 for command_config_state in \
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' \
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
1316 speed: 0 Mbps now, 0 Mbps max
1317 OFPT_GET_CONFIG_REPLY (OF1.6): frags=normal miss_send_len=0
1323 AT_SETUP([ofproto - basic flow_mod commands (NXM)])
1325 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0], [NXST_FLOW reply:
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
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
1339 AT_CHECK([ovs-ofctl del-flows br0])
1340 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0], [NXST_FLOW reply:
1345 AT_SETUP([ofproto - basic flow_mod commands (OpenFlow 1.0)])
1347 AT_CHECK([ovs-ofctl -F openflow10 dump-flows br0 | ofctl_strip], [0], [OFPST_FLOW reply:
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
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
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:
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])
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
1376 in_port=1 actions=drop
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
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
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
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
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
1402 AT_SETUP([ofproto - basic flow_mod commands (OpenFlow 1.1)])
1404 AT_CHECK([ovs-ofctl -O OpenFlow11 dump-flows br0 | ofctl_strip], [0], [OFPST_FLOW reply (OF1.1):
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):
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
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
1425 AT_SETUP([ofproto - flow_mod negative test (OpenFlow 1.1)])
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])
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],
1434 [ovs-ofctl: actions are invalid with specified match (OFPBIC_BAD_TABLE_ID)
1439 AT_SETUP([ofproto - set-field flow_mod commands (NXM)])
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]]
1452 AT_SETUP([ofproto - basic flow_mod commands (OpenFlow 1.2)])
1454 AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip], [0], [OFPST_FLOW reply (OF1.2):
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):
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):
1471 AT_SETUP([ofproto - set-field flow_mod commands (OF1.2)])
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):
1484 AT_SETUP([ofproto - dump flows with cookie])
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
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
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
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
1508 AT_SETUP([ofproto - mod flow with cookie change (OpenFlow 1.0)])
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
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
1524 AT_SETUP([ofproto - mod flow with cookie change (NXM)])
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
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
1540 AT_SETUP([ofproto - no mod flow with cookie change (OpenFlow 1.1)])
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):
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):
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)])
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):
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):
1572 AT_SETUP([ofproto - mod flows based on cookie mask (OpenFlow 1.0)])
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
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
1594 AT_SETUP([ofproto - mod flows based on cookie mask (OpenFlow 1.1)])
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):
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):
1616 AT_SETUP([ofproto - mod flows based on cookie mask (OpenFlow 1.2)])
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):
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):
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])
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
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
1661 AT_SETUP([ofproto - mod flow with cookie miss (mask==0) - NXM])
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
1671 AT_SETUP([ofproto - mod flow with cookie miss (mask==0) - OF1.1])
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):
1681 AT_SETUP([ofproto - mod flow with cookie miss (mask==0) - OF1.2])
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):
1690 AT_SETUP([ofproto - mod flow with cookie miss (mask!=0) - NXM])
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
1699 AT_SETUP([ofproto - mod flow with cookie miss (mask!=0) - OF1.1])
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):
1708 AT_SETUP([ofproto - mod flow with cookie miss (mask!=0) - OF1.2])
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):
1717 AT_SETUP([ofproto - del flows with cookies])
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
1729 AT_CHECK([ovs-ofctl del-flows br0])
1730 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
1736 AT_SETUP([ofproto - del flows based on cookie])
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
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
1757 AT_SETUP([ofproto - del flows based on cookie mask])
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
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
1776 AT_SETUP([ofproto - del flows based on table id (NXM)])
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
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
1790 AT_CHECK([ovs-ofctl del-flows br0 table=1])
1791 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
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
1801 AT_CHECK([ovs-ofctl del-flows br0])
1802 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
1808 AT_SETUP([ofproto - del flows based on table id (OpenFlow 1.1)])
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):
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):
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):
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):
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
1841 AT_SETUP([ofproto - del flows based on table id (OpenFlow 1.2)])
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):
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):
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):
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):
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):
1873 AT_SETUP([ofproto - flow_mod with out_port matching (OpenFlow 1.0)])
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
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],
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])
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],
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],
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],
1909 AT_SETUP([ofproto - flow_mod with out_port matching (OpenFlow 1.1)])
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
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],
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])
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],
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],
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],
1945 AT_SETUP([ofproto - flow_mod with out_group matching (OpenFlow 1.1)])
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
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
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],
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])
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],
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],
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],
1987 AT_SETUP([ofproto - bundle flow_mod with out group matching (OpenFlow 1.4)])
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
2000 AT_CHECK([ovs-ofctl bundle br0 bundle.txt])
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
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],
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])
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],
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],
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],
2037 AT_SETUP([ofproto - bundle packet-out (OpenFlow 1.4)])
2040 ovs-ofctl del-flows br0
2041 ovs-ofctl add-flow br0 priority=0,actions=drop
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])
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
2062 AT_CHECK([ovs-ofctl bundle br0 bundle.txt])
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):
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
2079 AT_SETUP([ofproto - bundle packet-out, failing bundle commit (OpenFlow 1.4)])
2082 ovs-ofctl del-flows br0
2083 ovs-ofctl add-flow br0 priority=0,actions=drop
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])
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
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
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):
2114 # Verify that the packet-in was NOT received via controller action.
2115 AT_CHECK([strip_xids < monitor.log], [0], [])
2120 AT_SETUP([ofproto - bundle packet-out makes bundle commit to fail(OpenFlow 1.4)])
2123 ovs-ofctl del-flows br0
2124 ovs-ofctl add-flow br0 priority=0,actions=drop
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])
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
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
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):
2156 # Verify that the packet-in was NOT received via controller action.
2157 AT_CHECK([strip_xids < monitor.log], [0], [])
2162 AT_SETUP([ofproto - flow table configuration (OpenFlow 1.0)])
2164 # Check the default configuration.
2166 printf 'OFPST_TABLE reply (xid=0x2):
2168 active=0, lookup=0, matched=0
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
2187 for i in `seq $1 $2`; do
2188 printf ' table %d ("table%d"): ditto\n' $i $i
2191 (head_table classifier; ditto 1 253) > expout
2192 AT_CHECK([ovs-ofctl dump-tables br0], [0], [expout])
2193 # Change the configuration.
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}' \
2203 # Check that the configuration was updated.
2204 (head_table main; echo ' table 1 ("table1"):
2205 active=0, lookup=0, matched=0
2210 active=0, lookup=0, matched=0
2213 '; ditto 3 253) > expout
2214 AT_CHECK([ovs-ofctl dump-tables br0], [0], [expout])
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
2229 # Check that no hidden flows are visible in OpenFlow.
2230 AT_CHECK([ovs-ofctl dump-flows br0 | strip_xids], [0], [NXST_FLOW reply:
2233 # Check that some hidden flows related to 240.0.0.1 are actually in table 0.
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])
2240 # Check that dump-tables doesn't count the hidden flows.
2242 printf 'OFPST_TABLE reply:
2244 active=0, lookup=0, matched=0
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
2263 for i in `seq $1 $2`; do
2264 printf ' table %d ("table%d"): ditto\n' $i $i
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"])
2272 AT_SETUP([ofproto - flow table configuration (OpenFlow 1.2)])
2274 # Check the default configuration.
2276 printf 'OFPST_TABLE reply (OF1.2) (xid=0x2):
2278 active=0, lookup=0, matched=0
2279 metadata: match=0xffffffffffffffff write=0xffffffffffffffff
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
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
2327 for i in `seq $1 $2`; do
2328 printf ' table %d ("table%d"): ditto\n' $i $i
2332 printf ' table 253 ("table253"):
2333 active=0, lookup=0, matched=0
2334 metadata: match=0xffffffffffffffff write=0xffffffffffffffff
2337 instructions (table miss and others):
2338 instructions: apply_actions,clear_actions,write_actions,write_metadata
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.
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}' \
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
2365 active=0, lookup=0, matched=0
2366 metadata: match=0xffffffffffffffff write=0xffffffffffffffff
2371 '; ditto 3 252; tail_table) > expout
2372 AT_CHECK([ovs-ofctl -O OpenFlow12 dump-tables br0], [0], [expout])
2376 AT_SETUP([ofproto - table features (OpenFlow 1.3)])
2379 printf ' table 0 ("%s"):
2380 metadata: match=0xffffffffffffffff write=0xffffffffffffffff
2382 instructions (table miss and others):
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
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
2564 printf ' table %d ("%s"):
2565 metadata: match=0xffffffffffffffff write=0xffffffffffffffff
2567 instructions (table miss and others):
2573 ' $1 $2 $3 `expr $1 + 1`
2576 echo ' table 252 ("table252"):
2577 metadata: match=0xffffffffffffffff write=0xffffffffffffffff
2579 instructions (table miss and others):
2585 table 253 ("table253"):
2586 metadata: match=0xffffffffffffffff write=0xffffffffffffffff
2588 instructions (table miss and others):
2589 instructions: meter,apply_actions,clear_actions,write_actions,write_metadata
2594 (head_table classifier
2595 for i in `seq 1 251`; do
2596 ditto $i table$i 1000000
2598 tail_tables) > expout
2599 AT_CHECK([ovs-ofctl -O OpenFlow13 dump-table-features br0], [0], [expout])
2600 # Change the configuration.
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}' \
2610 # Check that the configuration was updated.
2613 for i in `seq 2 251`; do
2614 ditto $i table$i 1000000
2616 tail_tables) > expout
2617 AT_CHECK([ovs-ofctl -O OpenFlow13 dump-table-features br0], [0], [expout])
2621 AT_SETUP([ofproto - table description (OpenFlow 1.4)])
2624 while test $x -lt 254; do
2627 eviction=off eviction_flags=OTHER|IMPORTANCE|LIFETIME
2631 AT_CHECK([ovs-ofctl -O OpenFlow14 dump-table-desc br0 | sed '/^$/d
2632 /^OFPST_TABLE_DESC/d'], [0], [expout])
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])
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])
2651 AT_SETUP([ofproto - hard limits on flow table size (OpenFlow 1.0)])
2653 # Configure a maximum of 4 flows.
2656 -- --id=@t0 create Flow_Table flow-limit=4 \
2657 -- set bridge br0 flow_tables:0=@t0 \
2662 for in_port in 1 2 3 4; do
2663 ovs-ofctl add-flow br0 in_port=$in_port,actions=drop
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
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
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
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
2695 AT_SETUP([ofproto - hard limits on flow table size (OpenFlow 1.2)])
2697 # Configure a maximum of 4 flows.
2700 -- --id=@t0 create Flow_Table flow-limit=4 \
2701 -- set bridge br0 flow_tables:0=@t0 \
2706 for in_port in 1 2 3 4; do
2707 ovs-ofctl -O OpenFlow12 add-flow br0 in_port=$in_port,actions=drop
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):
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
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):
2734 AT_SETUP([ofproto - eviction upon table overflow (OpenFlow 1.0)])
2736 # Configure a maximum of 4 flows.
2739 -- --id=@t0 create Flow_Table flow-limit=4 overflow-policy=evict \
2740 -- set bridge br0 flow_tables:0=@t0 \
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
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
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
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
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
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
2792 AT_SETUP([ofproto - eviction upon table overflow (OpenFlow 1.2)])
2794 # Configure a maximum of 4 flows.
2797 -- --id=@t0 create Flow_Table flow-limit=4 overflow-policy=evict \
2798 -- set bridge br0 flow_tables:0=@t0 \
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
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):
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):
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):
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
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):
2851 AT_SETUP([ofproto - eviction using importance upon table overflow (OpenFlow 1.4)])
2853 # Configure a maximum of 4 flows.
2856 -- --id=@t0 create Flow_Table name=evict flow-limit=4 \
2857 -- set bridge br0 flow_tables:0=@t0 \
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])
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
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):
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):
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
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):
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):
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
2915 AT_SETUP([ofproto - eviction upon table overflow, with fairness (OpenFlow 1.0)])
2917 # Configure a maximum of 4 flows.
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 \
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
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
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
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
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
2971 # Adding another flow will cause the one that expires soonest overall
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
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
2997 AT_SETUP([ofproto - eviction upon table overflow, with fairness (OpenFlow 1.2)])
2999 # Configure a maximum of 4 flows.
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 \
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
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):
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):
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
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):
3053 # Adding another flow will cause the one that expires soonest overall
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):
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):
3079 AT_SETUP([ofproto - eviction upon table overflow, with modified hard timeout])
3081 # Configure a maximum of 4 flows.
3084 -- --id=@t0 create Flow_Table flow-limit=4 overflow-policy=evict \
3085 -- set bridge br0 flow_tables:0=@t0 \
3089 ovs-appctl time/stop
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
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
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
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
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.
3128 -- --id=@t0 create Flow_Table flow-limit=4 overflow-policy=evict \
3129 -- set bridge br0 flow_tables:0=@t0 \
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
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
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
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
3167 AT_SETUP([ofproto - asynchronous message control (OpenFlow 1.0)])
3169 AT_CHECK([ovs-ofctl -P standard monitor br0 --detach --no-chdir --pidfile])
3171 printf '\n\n--- check_async %d ---\n\n\n' $1
3174 ovs-appctl -t ovs-ofctl ofctl/barrier
3175 ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
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"
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"
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"
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
3205 speed: 0 Mbps now, 0 Mbps max"
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
3214 speed: 0 Mbps now, 0 Mbps max"
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"
3223 AT_FAIL_IF([test X"$1" != X])
3225 OVS_WAIT_UNTIL([test `wc -l < "monitor.log"` -ge `wc -l < "expout"`])
3229 s/ (xid=0x[0-9a-fA-F]*)//
3231 s/00:0.$/00:0x/' < monitor.log]],
3235 # It's a service connection so initially there should be no async messages.
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
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
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
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
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
3258 # Restore controller ID 0.
3259 ovs-appctl -t ovs-ofctl ofctl/send 010400180000000300002320000000140000000000000000
3262 ovs-appctl -t ovs-ofctl ofctl/send 0104001400000002000023200000000a00000001
3263 check_async 7 OFPR_ACTION OFPPR_ADD
3265 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
3269 AT_SETUP([ofproto - asynchronous message control (OpenFlow 1.2)])
3271 AT_CHECK([ovs-ofctl -O OpenFlow12 -P standard monitor br0 --detach --no-chdir --pidfile])
3273 printf '\n\n--- check_async %d ---\n\n\n' $1
3277 ovs-appctl -t ovs-ofctl ofctl/barrier
3278 ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
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"
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"
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"
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
3308 speed: 0 Mbps now, 0 Mbps max"
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
3317 speed: 0 Mbps now, 0 Mbps max"
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"
3326 AT_FAIL_IF([test X"$1" != X])
3328 OVS_WAIT_UNTIL([test `wc -l < "monitor.log"` -ge `wc -l < "expout"`])
3332 s/ (xid=0x[0-9a-fA-F]*)//
3334 s/00:0.$/00:0x/' < monitor.log]],
3338 # It's a service connection so initially there should be no async messages.
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
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
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
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
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
3361 # Restore controller ID 0.
3362 ovs-appctl -t ovs-ofctl ofctl/send 030400180000000300002320000000140000000000000000
3364 # Become master (OF 1.2).
3365 ovs-appctl -t ovs-ofctl ofctl/send 031800180000000400000002000000000000000000000002
3366 check_async 7 OFPR_ACTION OFPPR_ADD
3368 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
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
3376 AT_CHECK([ovs-ofctl -O OpenFlow13 -P standard monitor br0 --detach --no-chdir --pidfile])
3378 printf '\n\n--- check_async %d ---\n\n\n' $1
3382 ovs-appctl -t ovs-ofctl ofctl/barrier
3383 ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
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"
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"
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"
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
3418 speed: 0 Mbps now, 0 Mbps max"
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
3427 speed: 0 Mbps now, 0 Mbps max"
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"
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"
3445 AT_FAIL_IF([test X"$1" != X])
3447 OVS_WAIT_UNTIL([test `wc -l < "monitor.log"` -ge `wc -l < "expout"`])
3451 s/ (xid=0x[0-9a-fA-F]*)//
3453 s/00:0.$/00:0x/' < monitor.log]],
3457 # It's a service connection so initially there should be no async messages.
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
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
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
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
3476 # Restore controller ID 0.
3477 ovs-appctl -t ovs-ofctl ofctl/send 040400180000000300002320000000140000000000000000
3479 # Become master (OF 1.3).
3480 ovs-appctl -t ovs-ofctl ofctl/send 041800180000000400000002000000000000000000000002
3481 check_async 6 OFPR_ACTION OFPPR_ADD
3483 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
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
3491 AT_CHECK([ovs-ofctl -O OpenFlow14 -P standard monitor br0 --detach --no-chdir --pidfile])
3493 printf '\n\n--- check_async %d ---\n\n\n' $1
3497 ovs-appctl -t ovs-ofctl ofctl/barrier
3498 ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
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"
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"
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"
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"
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
3536 speed: 0 Mbps now, 0 Mbps max"
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
3545 speed: 0 Mbps now, 0 Mbps max
3546 OFPT_PORT_STATUS (OF1.4): MOD: ${INDEX}(test): addr:aa:55:aa:55:00:0x
3549 speed: 0 Mbps now, 0 Mbps max"
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
3558 speed: 0 Mbps now, 0 Mbps max"
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"
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"
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
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
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
3616 eviction=off eviction_flags=OTHER|IMPORTANCE|LIFETIME
3617 vacancy=on vacancy_down=20% vacancy_up=80% vacancy=90%"
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
3650 eviction=off eviction_flags=OTHER|IMPORTANCE|LIFETIME
3651 vacancy=on vacancy_down=20% vacancy_up=80% vacancy=90%"
3654 AT_FAIL_IF([test X"$1" != X])
3656 OVS_WAIT_UNTIL([test `wc -l < "monitor.log"` -ge `wc -l < "expout"`])
3660 s/ (xid=0x[0-9a-fA-F]*)//
3662 s/00:0.$/00:0x/' < monitor.log]],
3666 # It's a service connection so initially there should be no async messages.
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
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
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
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
3685 # Restore controller ID 0.
3686 ovs-appctl -t ovs-ofctl ofctl/send 050400180000000300002320000000140000000000000000
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
3692 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
3696 AT_SETUP([ofproto - asynchronous message control (OpenFlow 1.5)])
3698 AT_CHECK([ovs-ofctl -O OpenFlow15 -P standard monitor br0 --detach --no-chdir --pidfile])
3700 printf '\n\n--- check_async %d ---\n\n\n' $1
3704 ovs-appctl -t ovs-ofctl ofctl/barrier
3705 ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
3708 # Other tests are not working with OF 1.5, and message
3709 # format may change, so leave them out.
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
3717 speed: 0 Mbps now, 0 Mbps max"
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
3726 speed: 0 Mbps now, 0 Mbps max
3727 OFPT_PORT_STATUS (OF1.5): MOD: 2(test): addr:aa:55:aa:55:00:0x
3730 speed: 0 Mbps now, 0 Mbps max"
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
3739 speed: 0 Mbps now, 0 Mbps max"
3742 AT_FAIL_IF([test X"$1" != X])
3744 OVS_WAIT_UNTIL([test `wc -l < "monitor.log"` -ge `wc -l < "expout"`])
3748 s/ (xid=0x[0-9a-fA-F]*)//
3750 s/00:0.$/00:0x/' < monitor.log]],
3754 # It's a service connection so initially there should be no async messages.
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
3762 # Set-async has changed in OF 1.4 and is not yet implemented.
3764 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
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)])
3772 on_exit 'kill `cat c1.pid c2.pid`'
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])
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
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"
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"
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"
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"
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"
3817 ovs-appctl -t `pwd`/c$i ofctl/barrier
3818 echo >>expout$i "OFPT_BARRIER_REPLY (OF1.2):"
3824 AT_CHECK([grep -v '^send:' monitor$i.log | strip_xids], [0], [expout])
3826 AT_CHECK([grep '^send:' monitor$i.log | strip_xids], [0], [expout])
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
3835 AT_SETUP([ofproto - controller role (OpenFlow 1.4)])
3837 on_exit 'kill `cat c1.pid c2.pid`'
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])
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
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"
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"
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"
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"
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"
3883 ovs-appctl -t `pwd`/c$i ofctl/barrier
3884 echo >>expout$i "OFPT_BARRIER_REPLY (OF1.4):"
3890 AT_CHECK([grep -v '^send:' monitor$i.log | strip_xids], [0], [expout])
3892 AT_CHECK([grep '^send:' monitor$i.log | strip_xids], [0], [expout])
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)])
3902 on_exit 'kill `cat c1.pid c2.pid c3.pid`'
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])
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
3918 ovs-appctl -t `pwd`/c$i ofctl/barrier
3919 ovs-appctl -t `pwd`/c$i ofctl/set-output-file monitor$i.log
3923 printf '\n\n--- check_async %d ---\n\n\n' $1
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"
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"
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):"
3961 s/ (xid=0x[0-9a-fA-F]*)//'< monitor$i.log]],
3966 # controller 1: Become slave
3967 ovs-appctl -t `pwd`/c1 ofctl/send 061800180000000300000003000000008000000000000002
3969 # controller 2: Become master
3970 ovs-appctl -t `pwd`/c2 ofctl/send 051800180000000300000002000000008000000000000003
3972 # controller 1: Become slave
3973 ovs-appctl -t `pwd`/c3 ofctl/send 051800180000000300000003000000008000000000000004
3975 # controller 1: Enabled requestforward using set Asynchronous message
3976 ovs-appctl -t `pwd`/c1 ofctl/send 061c00280000000200000008000000050002000800000002000400080000001a000a000800000003
3978 # controller 2: Enabled requestforward using set Asynchronous message
3979 ovs-appctl -t `pwd`/c2 ofctl/send 051c002800000002000100080000000200030008000000050005000800000005000b000800000003
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
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)])
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])
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"])
4007 # Stop the monitor and check its output.
4008 ovs-appctl -t ovs-ofctl ofctl/barrier
4009 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
4011 ovs-ofctl dump-ports br0
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
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)])
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])
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'])
4042 # Stop the monitor and check its output.
4043 ovs-appctl -t ovs-ofctl ofctl/barrier
4044 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
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):
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)])
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])
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"])
4075 # Stop the monitor and check its output.
4076 ovs-appctl -t ovs-ofctl ofctl/barrier
4077 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
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):
4091 AT_SETUP([ofproto - packet-out from controller (OpenFlow 1.5)])
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])
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"])
4105 # Stop the monitor and check its output.
4106 ovs-appctl -t ovs-ofctl ofctl/barrier
4107 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
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):
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)])
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])
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)"])
4134 # Stop the monitor and check its output.
4135 ovs-appctl -t ovs-ofctl ofctl/barrier
4136 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
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
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)])
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])
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'])
4162 # Stop the monitor and check its output.
4163 ovs-appctl -t ovs-ofctl ofctl/barrier
4164 ovs-appctl -t ovs-ofctl exit
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):
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)])
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])
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"])
4189 # Stop the monitor and check its output.
4190 ovs-appctl -t ovs-ofctl ofctl/barrier
4191 ovs-appctl -t ovs-ofctl exit
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):
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)])
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])
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"])
4216 # Stop the monitor and check its output.
4217 ovs-appctl -t ovs-ofctl ofctl/barrier
4218 ovs-appctl -t ovs-ofctl exit
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):
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)])
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])
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"])
4244 # Stop the monitor and check its output.
4245 ovs-appctl -t ovs-ofctl ofctl/barrier
4246 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
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
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)])
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])
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'])
4272 # Stop the monitor and check its output.
4273 ovs-appctl -t ovs-ofctl ofctl/barrier
4274 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
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):
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)])
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])
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'])
4300 # Stop the monitor and check its output.
4301 ovs-appctl -t ovs-ofctl ofctl/barrier
4302 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
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):
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)])
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])
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'])
4327 # Stop the monitor and check its output.
4328 ovs-appctl -t ovs-ofctl ofctl/barrier
4329 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
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):
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.
4352 print $_ foreach sort(@buffer);
4357 print $_ foreach sort(@buffer);
4360 m4_divert_pop([PREPARE_TESTS])
4362 AT_SETUP([ofproto - flow monitoring])
4363 AT_KEYWORDS([monitor])
4366 ovs-ofctl add-flow br0 in_port=0,dl_vlan=123,actions=output:1
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
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
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:
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
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
4495 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
4499 AT_SETUP([ofproto - flow monitoring with !own])
4500 AT_KEYWORDS([monitor])
4503 ovs-ofctl add-flow br0 in_port=0,dl_vlan=123,actions=output:1
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
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:
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
4530 send: OFPT_FLOW_MOD: DEL priority=0 actions=drop
4531 NXST_FLOW_MONITOR reply (xid=0x0):
4532 event=ABBREV xid=0x12345678
4536 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
4540 AT_SETUP([ofproto - flow monitoring with out_port])
4541 AT_KEYWORDS([monitor])
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
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
4558 ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
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
4565 ovs-ofctl mod-flows br0 dl_vlan=123,actions=output:1,output:2
4566 ovs-appctl -t ovs-ofctl ofctl/barrier
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
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
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
4580 NXST_FLOW_MONITOR reply (xid=0x0):
4581 event=MODIFIED table=0 cookie=0 in_port=0,dl_vlan=122 actions=output:1
4583 NXST_FLOW_MONITOR reply (xid=0x0):
4584 event=MODIFIED table=0 cookie=0 in_port=0,dl_vlan=123 actions=output:2
4588 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
4592 AT_SETUP([ofproto - flow monitoring pause and resume])
4593 AT_KEYWORDS([monitor])
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
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
4603 # Don't know how to get maximum socket receive buffer on this OS
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
4611 # If there's too much queuing skip the test to avoid timing out.
4612 AT_SKIP_IF([test $rmem_max -gt 1048576])
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`
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
4627 # Add $n_msgs flows.
4628 (echo "in_port=2,actions=output:2"
4630 for ($i = 0; $i < '$n_msgs'; $i++) {
4631 print "cookie=1,reg1=$i,actions=drop\n";
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])
4641 ovs-appctl -t ovs-ofctl ofctl/unblock
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])
4649 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
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])
4659 # Check that the flow monitor reported everything in the expected order:
4661 # event=ADDED table=0 cookie=0x1 reg1=0x22
4663 # NXT_FLOW_MONITOR_PAUSED:
4665 # event=DELETED reason=delete table=0 cookie=0x1 reg1=0x22
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:
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 '
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:
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:
4698 AT_SETUP([ofproto - event filtering (OpenFlow 1.3)])
4699 AT_KEYWORDS([monitor])
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])
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
4710 # Check default setting
4711 read -r -d '' expected <<'EOF'
4714 AT_CHECK([ofctl_strip < monitor.log], [], [dnl
4715 send: OFPT_GET_ASYNC_REQUEST (OF1.3):
4716 OFPT_GET_ASYNC_REPLY (OF1.3):
4718 PACKET_IN: no_match action
4719 PORT_STATUS: add delete modify
4720 FLOW_REMOVED: idle hard delete group_delete
4723 REQUESTFORWARD: (off)
4727 PORT_STATUS: add delete modify
4731 REQUESTFORWARD: (off)
4732 OFPT_BARRIER_REPLY (OF1.3):
4738 AT_SETUP([ofproto - ofport_request])
4740 add_of_ports br0 1 2 3
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
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
4761 ovs-vsctl del-port p3
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`
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).
4776 AT_CHECK([test "$1" = '[[]]' || test "$p1" = "$1"])
4777 AT_CHECK([test "$2" = '[[]]' || test "$p2" = "$2"])
4780 for pre in '1 2' '[[]] 2' '1 [[]]' '[[]] [[]]' '2 1' '[[]] 1' '2 [[]]' \
4782 for post in '1 2' '[[]] 2' '1 [[]]' '[[]] [[]]' '2 1' '[[]] 1' '2 [[]]' \
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
4794 AT_SETUP([ofproto - bundle open (OpenFlow 1.4)])
4795 AT_KEYWORDS([monitor])
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])
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])
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):
4818 AT_SETUP([ofproto - bundle double open (OpenFlow 1.4)])
4819 AT_KEYWORDS([monitor])
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])
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])
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):
4850 AT_SETUP([ofproto - bundle close without open (OpenFlow 1.4)])
4851 AT_KEYWORDS([monitor])
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])
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])
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):
4874 AT_SETUP([ofproto - bundle double close (OpenFlow 1.4)])
4875 AT_KEYWORDS([monitor])
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])
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])
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):
4913 AT_SETUP([ofproto - bundle close, different flags (OpenFlow 1.4)])
4914 AT_KEYWORDS([monitor])
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])
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])
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):
4945 AT_SETUP([ofproto - bundle commit without open (OpenFlow 1.4)])
4946 AT_KEYWORDS([monitor])
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])
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])
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):
4970 AT_SETUP([ofproto - bundle commit, different flags (OpenFlow 1.4)])
4971 AT_KEYWORDS([monitor])
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])
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])
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):
5002 AT_SETUP([ofproto - bundle discard without open (OpenFlow 1.4)])
5003 AT_KEYWORDS([monitor])
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])
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])
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):
5028 AT_SETUP([ofproto - bundle with multiple flow mods (OpenFlow 1.4)])
5031 AT_CHECK([ovs-appctl vlog/set vconn:dbg])
5033 AT_CHECK([ovs-ofctl --no-names del-flows br0])
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
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
5047 AT_CHECK([ovs-ofctl --no-names --bundle add-flows br0 flows.txt])
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
5055 AT_DATA([flows.txt], [dnl
5057 modify_strict in_port=2 dl_src=00:77:88:99:aa:bb actions=7
5060 AT_CHECK([ovs-ofctl --no-names --bundle add-flows br0 flows.txt])
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
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
5075 AT_CHECK([ovs-ofctl --no-names --bundle add-flows br0 flows.txt])
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
5083 dnl Check logs for OpenFlow trace
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
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)
5231 AT_SETUP([ofproto - failing bundle commit (OpenFlow 1.4)])
5234 AT_CHECK([ovs-ofctl del-flows br0])
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
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
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
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
5262 AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt 2>&1 | sed '/talking to/,$d' | strip_xids],
5264 Error OFPBRC_EPERM for: OFPT_FLOW_MOD (OF1.4): ADD table:254 actions=drop
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
5278 AT_SETUP([ofproto - bundle timeout (OpenFlow 1.4)])
5279 AT_KEYWORDS([monitor])
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])
5286 ovs-appctl time/stop
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 \
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])
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):
5341 AT_SETUP([ofproto - bundle open (OpenFlow 1.3)])
5342 AT_KEYWORDS([monitor])
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])
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])
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):
5368 AT_SETUP([ofproto - bundle double open (OpenFlow 1.3)])
5369 AT_KEYWORDS([monitor])
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])
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])
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):
5403 AT_SETUP([ofproto - bundle close without open (OpenFlow 1.3)])
5404 AT_KEYWORDS([monitor])
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])
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])
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):
5427 AT_SETUP([ofproto - bundle double close (OpenFlow 1.3)])
5428 AT_KEYWORDS([monitor])
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])
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])
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):
5466 AT_SETUP([ofproto - bundle close, different flags (OpenFlow 1.3)])
5467 AT_KEYWORDS([monitor])
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])
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])
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):
5498 AT_SETUP([ofproto - bundle commit without open (OpenFlow 1.3)])
5499 AT_KEYWORDS([monitor])
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])
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])
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):
5523 AT_SETUP([ofproto - bundle commit, different flags (OpenFlow 1.3)])
5524 AT_KEYWORDS([monitor])
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])
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])
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):
5555 AT_SETUP([ofproto - bundle discard without open (OpenFlow 1.3)])
5556 AT_KEYWORDS([monitor])
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])
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])
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):
5581 AT_SETUP([ofproto - bundle with multiple flow mods (OpenFlow 1.3)])
5584 AT_CHECK([ovs-appctl vlog/set vconn:dbg])
5586 AT_CHECK([ovs-ofctl --no-names del-flows br0])
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
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
5600 AT_CHECK([ovs-ofctl -O OpenFlow13 --no-names --bundle add-flows br0 flows.txt])
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
5608 AT_DATA([flows.txt], [dnl
5610 modify_strict in_port=2 dl_src=00:77:88:99:aa:bb actions=7
5613 AT_CHECK([ovs-ofctl -O OpenFlow13 --no-names --bundle add-flows br0 flows.txt])
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
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
5628 AT_CHECK([ovs-ofctl -O OpenFlow13 --bundle --no-names add-flows br0 flows.txt])
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
5636 dnl Check logs for OpenFlow trace
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
5777 AT_SETUP([ofproto - failing bundle add message (OpenFlow 1.3)])
5780 AT_CHECK([ovs-ofctl del-flows br0])
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
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
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
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
5808 AT_CHECK([ovs-ofctl -O OpenFlow13 --bundle add-flows br0 flows.txt 2>&1 | sed '/talking to/,$d' | strip_xids],
5810 Error OFPBRC_EPERM for: OFPT_FLOW_MOD (OF1.3): ADD table:254 actions=drop
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
5824 AT_SETUP([ofproto - failing bundle commit (OpenFlow 1.3)])
5827 AT_CHECK([ovs-ofctl del-flows br0])
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
5836 AT_CHECK([ovs-ofctl -O OpenFlow13 --bundle add-flows br0 flows.txt 2>&1 | sed '/talking to/,$d' | strip_xids],
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
5843 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
5850 AT_SETUP([ofproto - monitor flows with tun_md])
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])
5856 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0], [dnl
5858 tun_metadata0=0x1 actions=drop
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])
5867 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 2])
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
5874 AT_CHECK([ovs-ofctl del-flows br0])
5876 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 4])
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
5885 OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
5887 dnl Check that vswitchd hasn't crashed
5888 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0], [dnl
5895 AT_SETUP([ofproto - flow mod with tunnel metadata])
5896 AT_KEYWORDS([ofp-actions])
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[[]]"])
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
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..... |
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
6016 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0], [dnl)
6018 in_port=1 actions=move:NXM_NX_TUN_METADATA0[[0..31]]->NXM_NX_REG0[[]]
6019 tun_metadata0=0x11223344 actions=output:2
6022 OVS_VSWITCHD_STOP(["/NXFMFC_INVALID_TLV_FIELD/d
6024 /OFPBAC_BAD_SET_LEN/d"])