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