]> git.proxmox.com Git - mirror_ovs.git/blame - tests/ofproto.at
OpenFlow: Add support for "group delete" flow removed reason to 1.3.
[mirror_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
75754d04
JP
3432 if test X"$1" = X"OFPRR_GROUP_DELETE"; then shift;
3433 echo >>expout "OFPT_FLOW_REMOVED (OF1.3): reason=group_delete table_id=0"
cc40d06b
SH
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
75754d04 3453check_async 2 OFPR_ACTION OFPPR_ADD OFPPR_DELETE OFPRR_DELETE OFPRR_GROUP_DELETE
b21eb1da
JR
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.
75754d04
JP
3460ovs-appctl -t ovs-ofctl ofctl/send 041c00200000000200000002000000050000000500000002000000020000000d
3461check_async 4 OFPR_INVALID_TTL OFPPR_DELETE OFPRR_DELETE OFPRR_GROUP_DELETE
b21eb1da
JR
3462
3463# Set controller ID 123.
3464ovs-appctl -t ovs-ofctl ofctl/send 04040018000000030000232000000014000000000000007b
75754d04 3465check_async 5 OFPR_NO_MATCH OFPPR_DELETE OFPRR_DELETE OFPRR_GROUP_DELETE
b21eb1da
JR
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
cb1145d1
ZB
4139dnl This test checks that 1.5 packet_out is properly encoded/decoded.
4140AT_SETUP([ofproto - packet-out with set_field metadata (OpenFlow 1.5)])
4141OVS_VSWITCHD_START
4142
4143# Start a monitor listening for packet-ins.
4144AT_CHECK([ovs-ofctl -P standard -O OpenFlow13 monitor br0 --detach --no-chdir --pidfile])
4145ovs-appctl -t ovs-ofctl ofctl/send 0409000c0123456700000080
4146ovs-appctl -t ovs-ofctl ofctl/barrier
4147ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
4148AT_CAPTURE_FILE([monitor.log])
4149
4150# Send a packet-out with a couple of set-field action to set some metadata, and forward to controller
4151AT_CHECK([ovs-ofctl -O OpenFlow15 packet-out br0 CONTROLLER 'set_field:0xfafafafa5a5a5a5a->metadata, controller' '0001020304050010203040501234'])
4152
4153# Stop the monitor and check its output.
4154ovs-appctl -t ovs-ofctl ofctl/barrier
4155ovs-appctl -t ovs-ofctl exit
4156
4157AT_CHECK([sed 's/ (xid=0x[[0-9a-fA-F]]*)//' monitor.log], [0], [dnl
4158OFPT_PACKET_IN (OF1.3): total_len=14 metadata=0xfafafafa5a5a5a5a,in_port=CONTROLLER (via action) data_len=14 (unbuffered)
4159vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x1234
4160OFPT_BARRIER_REPLY (OF1.3):
4161])
4162
4163OVS_VSWITCHD_STOP
4164AT_CLEANUP
4165
4166dnl This test checks that packet_type PT_ETH is properly encoded/decoded in 1.5 packet_out.
4167AT_SETUP([ofproto - packet-out with set_field metadata with packet_type PT_ETH (OpenFlow 1.5)])
4168OVS_VSWITCHD_START
4169
4170# Start a monitor listening for packet-ins.
4171AT_CHECK([ovs-ofctl -P standard -O OpenFlow13 monitor br0 --detach --no-chdir --pidfile])
4172ovs-appctl -t ovs-ofctl ofctl/send 0409000c0123456700000080
4173ovs-appctl -t ovs-ofctl ofctl/barrier
4174ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
4175AT_CAPTURE_FILE([monitor.log])
4176
4177# Send a packet-out with a couple of set-field action to set some metadata, and forward to controller
4178AT_CHECK([ovs-ofctl -O OpenFlow15 packet-out br0 "in_port=controller packet=0001020304050010203040501234 packet_type(0,0x0) actions=set_field:0xfafafafa5a5a5a5a->metadata,controller"])
4179
4180# Stop the monitor and check its output.
4181ovs-appctl -t ovs-ofctl ofctl/barrier
4182ovs-appctl -t ovs-ofctl exit
4183
4184AT_CHECK([sed 's/ (xid=0x[[0-9a-fA-F]]*)//' monitor.log], [0], [dnl
4185OFPT_PACKET_IN (OF1.3): total_len=14 metadata=0xfafafafa5a5a5a5a,in_port=CONTROLLER (via action) data_len=14 (unbuffered)
4186vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x1234
4187OFPT_BARRIER_REPLY (OF1.3):
4188])
4189
4190OVS_VSWITCHD_STOP
4191AT_CLEANUP
4192
4193dnl This test checks that packet_type PT_IPV4 is properly encoded/decoded in 1.5 packet_out.
4194AT_SETUP([ofproto - packet-out with set_field metadata with packet_type PT_IPV4 on PTAP bridge (OpenFlow 1.5)])
4195OVS_VSWITCHD_START
4196
4197# Start a monitor listening for packet-ins.
4198AT_CHECK([ovs-ofctl -P standard -O OpenFlow13 monitor br0 --detach --no-chdir --pidfile])
4199ovs-appctl -t ovs-ofctl ofctl/send 0409000c0123456700000080
4200ovs-appctl -t ovs-ofctl ofctl/barrier
4201ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
4202AT_CAPTURE_FILE([monitor.log])
4203
4204# Send a packet-out with a couple of set-field action to set some metadata, and forward to controller
4205AT_CHECK([ovs-ofctl -O OpenFlow15 packet-out br0 "in_port=controller packet=4500002012344000ff1155670a0000140a00001e006400c8000cea78ffffffff packet_type(1,0x800) actions=set_field:0xfafafafa5a5a5a5a->metadata,controller"])
4206
4207# Stop the monitor and check its output.
4208ovs-appctl -t ovs-ofctl ofctl/barrier
4209ovs-appctl -t ovs-ofctl exit
4210
4211AT_CHECK([sed 's/ (xid=0x[[0-9a-fA-F]]*)//' monitor.log], [0], [dnl
4212OFPT_PACKET_IN (OF1.3): total_len=32 packet_type=(1,0x800),metadata=0xfafafafa5a5a5a5a,in_port=CONTROLLER (via action) data_len=32 (unbuffered)
4213packet_type=(1,0x800),nw_src=10.0.0.20,nw_dst=10.0.0.30,nw_proto=17,nw_tos=0,nw_ecn=0,nw_ttl=255,tp_src=100,tp_dst=200 udp_csum:ea78
4214OFPT_BARRIER_REPLY (OF1.3):
4215])
4216
4217OVS_VSWITCHD_STOP
4218AT_CLEANUP
4219
969fc56c
JS
4220dnl This test checks that metadata is encoded in packet_in structures,
4221dnl supported by NXAST.
4222AT_SETUP([ofproto - packet-out with metadata (NXM)])
4223OVS_VSWITCHD_START
4224
4225# Start a monitor listening for packet-ins.
6409e008 4226AT_CHECK([ovs-ofctl -P nxt_packet_in monitor br0 --detach --no-chdir --pidfile])
969fc56c
JS
4227ovs-appctl -t ovs-ofctl ofctl/send 0109000c0123456700000080
4228ovs-appctl -t ovs-ofctl ofctl/barrier
4229ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
4230AT_CAPTURE_FILE([monitor.log])
4231
4232# Send a packet-out with a load action to set some metadata, and forward to controller
6dd3c787 4233AT_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
4234
4235# Stop the monitor and check its output.
4236ovs-appctl -t ovs-ofctl ofctl/barrier
d9c8c57c 4237OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
969fc56c
JS
4238
4239AT_CHECK([sed 's/ (xid=0x[[0-9a-fA-F]]*)//' monitor.log], [0], [dnl
50dcbd8e 4240NXT_PACKET_IN: total_len=14 pkt_mark=0xaa,metadata=0xfafafafa5a5a5a5a,in_port=CONTROLLER (via action) data_len=14 (unbuffered)
e6d9ab56 4241vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x1234
751c7785
BP
4242OFPT_BARRIER_REPLY:
4243])
4244
4245OVS_VSWITCHD_STOP
4246AT_CLEANUP
2b07c8b1 4247
9dcd1c00
SH
4248dnl This test checks that metadata is encoded in packet_in structures,
4249dnl supported by NXAST.
4250AT_SETUP([ofproto - packet-out with metadata (OpenFlow 1.2)])
4251OVS_VSWITCHD_START
4252
4253# Start a monitor listening for packet-ins.
6409e008 4254AT_CHECK([ovs-ofctl -O OpenFlow12 -P standard monitor br0 --detach --no-chdir --pidfile])
9dcd1c00
SH
4255ovs-appctl -t ovs-ofctl ofctl/send 0309000c0123456700000080
4256ovs-appctl -t ovs-ofctl ofctl/barrier
4257ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
4258AT_CAPTURE_FILE([monitor.log])
4259
277876e9
JT
4260# Send a packet-out with a set-field action to set some metadata, and forward to controller
4261AT_CHECK([ovs-ofctl -O OpenFlow12 packet-out br0 none 'set_field:0xfafafafa5a5a5a5a->metadata, controller' '0001020304050010203040501234'])
9dcd1c00
SH
4262
4263# Stop the monitor and check its output.
4264ovs-appctl -t ovs-ofctl ofctl/barrier
d9c8c57c 4265OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
9dcd1c00
SH
4266
4267AT_CHECK([sed 's/ (xid=0x[[0-9a-fA-F]]*)//' monitor.log], [0], [dnl
50dcbd8e 4268OFPT_PACKET_IN (OF1.2): total_len=14 metadata=0xfafafafa5a5a5a5a,in_port=ANY (via action) data_len=14 (unbuffered)
e6d9ab56 4269vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x1234
0ad90c84
JR
4270OFPT_BARRIER_REPLY (OF1.2):
4271])
4272
4273OVS_VSWITCHD_STOP
4274AT_CLEANUP
4275
743c159b
JT
4276dnl This test checks that metadata is encoded in packet_in structures,
4277dnl supported by NXAST.
4278AT_SETUP([ofproto - packet-out with metadata and dual set_field (OpenFlow 1.3)])
4279OVS_VSWITCHD_START
4280
4281# Start a monitor listening for packet-ins.
6409e008 4282AT_CHECK([ovs-ofctl -O OpenFlow13 -P standard monitor br0 --detach --no-chdir --pidfile])
743c159b
JT
4283ovs-appctl -t ovs-ofctl ofctl/send 0409000c0123456700000080
4284ovs-appctl -t ovs-ofctl ofctl/barrier
4285ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
4286AT_CAPTURE_FILE([monitor.log])
4287
4288# Send a packet-out with a couple of set-field action to set some metadata, and forward to controller
4289AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 none 'set_field:0xfafafafa5a5a5a5a->metadata, set_field:0x6b->metadata, controller' '0001020304050010203040501234'])
4290
4291# Stop the monitor and check its output.
4292ovs-appctl -t ovs-ofctl ofctl/barrier
d9c8c57c 4293OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
743c159b
JT
4294
4295AT_CHECK([sed 's/ (xid=0x[[0-9a-fA-F]]*)//' monitor.log], [0], [dnl
50dcbd8e 4296OFPT_PACKET_IN (OF1.3): total_len=14 metadata=0x6b,in_port=ANY (via action) data_len=14 (unbuffered)
e6d9ab56 4297vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x1234
743c159b
JT
4298OFPT_BARRIER_REPLY (OF1.3):
4299])
4300
4301OVS_VSWITCHD_STOP
4302AT_CLEANUP
4303
0ad90c84
JR
4304dnl This test checks that tunnel metadata is encoded in packet_in structures.
4305AT_SETUP([ofproto - packet-out with tunnel metadata (OpenFlow 1.2)])
4306OVS_VSWITCHD_START
4307
4308# Start a monitor listening for packet-ins.
6409e008 4309AT_CHECK([ovs-ofctl -O OpenFlow12 -P standard monitor br0 --detach --no-chdir --pidfile])
0ad90c84
JR
4310ovs-appctl -t ovs-ofctl ofctl/send 0309000c0123456700000080
4311ovs-appctl -t ovs-ofctl ofctl/barrier
4312ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
4313AT_CAPTURE_FILE([monitor.log])
4314
4315# Send a packet-out with set field actions to set some tunnel metadata, and forward to controller
4316AT_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'])
4317
4318# Stop the monitor and check its output.
4319ovs-appctl -t ovs-ofctl ofctl/barrier
d9c8c57c 4320OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
0ad90c84
JR
4321
4322AT_CHECK([sed 's/ (xid=0x[[0-9a-fA-F]]*)//' monitor.log], [0], [dnl
50dcbd8e 4323OFPT_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 4324vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x1234
9dcd1c00
SH
4325OFPT_BARRIER_REPLY (OF1.2):
4326])
4327
4328OVS_VSWITCHD_STOP
4329AT_CLEANUP
4330
1637ebb2
SH
4331m4_divert_push([PREPARE_TESTS])
4332# Sorts groups of lines that start with a space, without moving them
4333# past the nearest line that does not start with a space.
4334multiline_sort () {
4335 ${PERL} -e '
4336 use warnings;
4337 use strict;
4338 my @buffer = ();
4339 while (<STDIN>) {
4340 if (/^ /) {
4341 push(@buffer, $_);
4342 } else {
4343 print $_ foreach sort(@buffer);
4344 print $_;
4345 @buffer = ();
4346 }
4347 }
4348 print $_ foreach sort(@buffer);
4349'
4350}
4351m4_divert_pop([PREPARE_TESTS])
4352
2b07c8b1
BP
4353AT_SETUP([ofproto - flow monitoring])
4354AT_KEYWORDS([monitor])
4355OVS_VSWITCHD_START
4356
4357ovs-ofctl add-flow br0 in_port=0,dl_vlan=123,actions=output:1
4358
4359# Start a monitor watching the flow table and check the initial reply.
4360ovs-ofctl monitor br0 watch: --detach --no-chdir --pidfile >monitor.log 2>&1
4361AT_CAPTURE_FILE([monitor.log])
4362ovs-appctl -t ovs-ofctl ofctl/barrier
4363AT_CHECK([sed 's/ (xid=0x[[1-9a-fA-F]][[0-9a-fA-F]]*)//' monitor.log], [0],
4364 [NXST_FLOW_MONITOR reply:
4365 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=123 actions=output:1
4366OFPT_BARRIER_REPLY:
4367])
4368
4369# Add, delete, and modify some flows and check the updates.
4370ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
4371ovs-ofctl add-flow br0 in_port=0,dl_vlan=124,actions=output:2
4372ovs-ofctl add-flow br0 in_port=0,dl_vlan=123,actions=output:5
95a1c4ca
SH
4373ovs-ofctl add-flow br0 in_port=0,dl_vlan=123,dl_vlan_pcp=0,actions=output:6
4374ovs-ofctl add-flow br0 in_port=0,dl_vlan=123,dl_vlan_pcp=1,actions=output:7
4375ovs-ofctl add-flow br0 in_port=0,dl_vlan=123,actions=output:8
4376ovs-ofctl add-flow br0 in_port=0,dl_vlan=65535,dl_vlan_pcp=0,actions=output:9
4377ovs-ofctl add-flow br0 in_port=0,dl_vlan=65535,dl_vlan_pcp=1,actions=output:10
4378ovs-ofctl add-flow br0 in_port=0,dl_vlan=65535,actions=output:11
4379ovs-ofctl add-flow br0 in_port=0,dl_vlan=8191,dl_vlan_pcp=0,actions=output:12
4380ovs-ofctl add-flow br0 in_port=0,dl_vlan=8191,dl_vlan_pcp=1,actions=output:13
4381ovs-ofctl add-flow br0 in_port=0,dl_vlan=8191,actions=output:14
4382ovs-ofctl add-flow br0 in_port=0,dl_vlan=0,dl_vlan_pcp=0,actions=output:15
4383ovs-ofctl add-flow br0 in_port=0,dl_vlan=0,dl_vlan_pcp=1,actions=output:16
4384ovs-ofctl add-flow br0 in_port=0,dl_vlan=0,actions=output:17
4385ovs-ofctl add-flow br0 in_port=0,dl_vlan=0,dl_vlan_pcp=0,actions=output:18
4386ovs-ofctl add-flow br0 in_port=0,dl_vlan=0,dl_vlan_pcp=1,actions=output:19
4387ovs-ofctl add-flow br0 in_port=0,dl_vlan=0,actions=output:20
4388ovs-ofctl add-flow br0 in_port=0,dl_vlan_pcp=0,actions=output:21
4389ovs-ofctl add-flow br0 in_port=0,dl_vlan_pcp=1,actions=output:22
4390ovs-ofctl add-flow br0 in_port=0,actions=output:23
ee088a75 4391ovs-ofctl mod-flows br0 dl_vlan=123,actions=output:3
2b07c8b1
BP
4392ovs-ofctl mod-flows br0 cookie=5,dl_vlan=123,actions=output:3
4393ovs-ofctl del-flows br0 dl_vlan=123
4394ovs-ofctl del-flows br0
4395ovs-appctl -t ovs-ofctl ofctl/barrier
1637ebb2 4396AT_CHECK([sed 's/ (xid=0x[[1-9a-fA-F]][[0-9a-fA-F]]*)//' monitor.log | multiline_sort], [0],
2b07c8b1
BP
4397[NXST_FLOW_MONITOR reply (xid=0x0):
4398 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=124 actions=output:2
4399NXST_FLOW_MONITOR reply (xid=0x0):
4400 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=123 actions=output:5
95a1c4ca
SH
4401NXST_FLOW_MONITOR reply (xid=0x0):
4402 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=123,dl_vlan_pcp=0 actions=output:6
4403NXST_FLOW_MONITOR reply (xid=0x0):
4404 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=123,dl_vlan_pcp=1 actions=output:7
4405NXST_FLOW_MONITOR reply (xid=0x0):
4406 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=123 actions=output:8
4407NXST_FLOW_MONITOR reply (xid=0x0):
4408 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=0,dl_vlan_pcp=0 actions=output:9
4409NXST_FLOW_MONITOR reply (xid=0x0):
4410 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=0,dl_vlan_pcp=1 actions=output:10
4411NXST_FLOW_MONITOR reply (xid=0x0):
4412 event=ADDED table=0 cookie=0 in_port=0,vlan_tci=0x0000 actions=output:11
4413NXST_FLOW_MONITOR reply (xid=0x0):
4414 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=4095,dl_vlan_pcp=0 actions=output:12
4415NXST_FLOW_MONITOR reply (xid=0x0):
4416 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=4095,dl_vlan_pcp=1 actions=output:13
4417NXST_FLOW_MONITOR reply (xid=0x0):
4418 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=4095 actions=output:14
4419NXST_FLOW_MONITOR reply (xid=0x0):
4420 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=0,dl_vlan_pcp=0 actions=output:15
4421NXST_FLOW_MONITOR reply (xid=0x0):
4422 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=0,dl_vlan_pcp=1 actions=output:16
4423NXST_FLOW_MONITOR reply (xid=0x0):
4424 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=0 actions=output:17
4425NXST_FLOW_MONITOR reply (xid=0x0):
4426 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=0,dl_vlan_pcp=0 actions=output:18
4427NXST_FLOW_MONITOR reply (xid=0x0):
4428 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=0,dl_vlan_pcp=1 actions=output:19
4429NXST_FLOW_MONITOR reply (xid=0x0):
4430 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=0 actions=output:20
4431NXST_FLOW_MONITOR reply (xid=0x0):
4432 event=ADDED table=0 cookie=0 in_port=0,dl_vlan_pcp=0 actions=output:21
4433NXST_FLOW_MONITOR reply (xid=0x0):
4434 event=ADDED table=0 cookie=0 in_port=0,dl_vlan_pcp=1 actions=output:22
4435NXST_FLOW_MONITOR reply (xid=0x0):
4436 event=ADDED table=0 cookie=0 in_port=0 actions=output:23
ee088a75
SH
4437NXST_FLOW_MONITOR reply (xid=0x0):
4438 event=MODIFIED table=0 cookie=0 in_port=0,dl_vlan=123 actions=output:3
4439 event=MODIFIED table=0 cookie=0 in_port=0,dl_vlan=123,dl_vlan_pcp=0 actions=output:3
4440 event=MODIFIED table=0 cookie=0 in_port=0,dl_vlan=123,dl_vlan_pcp=1 actions=output:3
2b07c8b1
BP
4441NXST_FLOW_MONITOR reply (xid=0x0):
4442 event=MODIFIED table=0 cookie=0x5 in_port=0,dl_vlan=123 actions=output:3
95a1c4ca
SH
4443 event=MODIFIED table=0 cookie=0x5 in_port=0,dl_vlan=123,dl_vlan_pcp=0 actions=output:3
4444 event=MODIFIED table=0 cookie=0x5 in_port=0,dl_vlan=123,dl_vlan_pcp=1 actions=output:3
2b07c8b1
BP
4445NXST_FLOW_MONITOR reply (xid=0x0):
4446 event=DELETED reason=delete table=0 cookie=0x5 in_port=0,dl_vlan=123 actions=output:3
95a1c4ca
SH
4447 event=DELETED reason=delete table=0 cookie=0x5 in_port=0,dl_vlan=123,dl_vlan_pcp=0 actions=output:3
4448 event=DELETED reason=delete table=0 cookie=0x5 in_port=0,dl_vlan=123,dl_vlan_pcp=1 actions=output:3
2b07c8b1 4449NXST_FLOW_MONITOR reply (xid=0x0):
32cd83a2 4450 event=DELETED reason=delete table=0 cookie=0 in_port=0 actions=output:23
95a1c4ca 4451 event=DELETED reason=delete table=0 cookie=0 in_port=0,dl_vlan=0 actions=output:20
32cd83a2
BP
4452 event=DELETED reason=delete table=0 cookie=0 in_port=0,dl_vlan=0,dl_vlan_pcp=0 actions=output:18
4453 event=DELETED reason=delete table=0 cookie=0 in_port=0,dl_vlan=0,dl_vlan_pcp=1 actions=output:19
2b07c8b1 4454 event=DELETED reason=delete table=0 cookie=0 in_port=0,dl_vlan=124 actions=output:2
95a1c4ca 4455 event=DELETED reason=delete table=0 cookie=0 in_port=0,dl_vlan=4095 actions=output:14
32cd83a2 4456 event=DELETED reason=delete table=0 cookie=0 in_port=0,dl_vlan=4095,dl_vlan_pcp=0 actions=output:12
95a1c4ca 4457 event=DELETED reason=delete table=0 cookie=0 in_port=0,dl_vlan=4095,dl_vlan_pcp=1 actions=output:13
32cd83a2
BP
4458 event=DELETED reason=delete table=0 cookie=0 in_port=0,dl_vlan_pcp=0 actions=output:21
4459 event=DELETED reason=delete table=0 cookie=0 in_port=0,dl_vlan_pcp=1 actions=output:22
95a1c4ca 4460 event=DELETED reason=delete table=0 cookie=0 in_port=0,vlan_tci=0x0000 actions=output:11
2b07c8b1
BP
4461OFPT_BARRIER_REPLY:
4462])
4463
200d6ac4
SH
4464# Check that our own changes are reported as full updates.
4465ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
4466ovs-ofctl add-flow br0 in_port=1,actions=output:2
4467ovs-ofctl add-flow br0 in_port=2,actions=output:1
4468ovs-appctl -t ovs-ofctl ofctl/barrier
4469ovs-appctl -t ovs-ofctl ofctl/send 010e004812345678003fffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000ffffffffffff0000
4470ovs-appctl -t ovs-ofctl ofctl/barrier
4471AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0], [NXST_FLOW reply:
4472])
4473AT_CHECK([sed 's/ (xid=0x[[1-9a-fA-F]][[0-9a-fA-F]]*)//' monitor.log | multiline_sort], [0],
4474[NXST_FLOW_MONITOR reply (xid=0x0):
4475 event=ADDED table=0 cookie=0 in_port=1 actions=output:2
4476NXST_FLOW_MONITOR reply (xid=0x0):
4477 event=ADDED table=0 cookie=0 in_port=2 actions=output:1
4478OFPT_BARRIER_REPLY:
4479send: OFPT_FLOW_MOD: DEL priority=0 actions=drop
4480NXST_FLOW_MONITOR reply (xid=0x0):
4481 event=DELETED reason=delete table=0 cookie=0 in_port=1 actions=output:2
4482 event=DELETED reason=delete table=0 cookie=0 in_port=2 actions=output:1
4483OFPT_BARRIER_REPLY:
4484])
4485
d9c8c57c 4486OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
200d6ac4
SH
4487OVS_VSWITCHD_STOP
4488AT_CLEANUP
4489
4490AT_SETUP([ofproto - flow monitoring with !own])
4491AT_KEYWORDS([monitor])
4492OVS_VSWITCHD_START
4493
4494ovs-ofctl add-flow br0 in_port=0,dl_vlan=123,actions=output:1
4495
4496# Start a monitor watching the flow table and check the initial reply.
4497ovs-ofctl monitor br0 watch:\!own --detach --no-chdir --pidfile >monitor.log 2>&1
4498AT_CAPTURE_FILE([monitor.log])
4499ovs-appctl -t ovs-ofctl ofctl/barrier
4500AT_CHECK([sed 's/ (xid=0x[[1-9a-fA-F]][[0-9a-fA-F]]*)//' monitor.log], [0],
4501 [NXST_FLOW_MONITOR reply:
4502 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=123 actions=output:1
4503OFPT_BARRIER_REPLY:
4504])
4505
2b07c8b1
BP
4506# Check that our own changes are reported as abbreviations.
4507ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
4508ovs-ofctl add-flow br0 in_port=1,actions=output:2
4509ovs-ofctl add-flow br0 in_port=2,actions=output:1
90d721f0 4510ovs-appctl -t ovs-ofctl ofctl/barrier
2b07c8b1
BP
4511ovs-appctl -t ovs-ofctl ofctl/send 010e004812345678003fffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000ffffffffffff0000
4512ovs-appctl -t ovs-ofctl ofctl/barrier
4513AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0], [NXST_FLOW reply:
4514])
4515AT_CHECK([sed 's/ (xid=0x[[1-9a-fA-F]][[0-9a-fA-F]]*)//' monitor.log], [0],
4516[NXST_FLOW_MONITOR reply (xid=0x0):
4517 event=ADDED table=0 cookie=0 in_port=1 actions=output:2
4518NXST_FLOW_MONITOR reply (xid=0x0):
4519 event=ADDED table=0 cookie=0 in_port=2 actions=output:1
90d721f0 4520OFPT_BARRIER_REPLY:
2b07c8b1
BP
4521send: OFPT_FLOW_MOD: DEL priority=0 actions=drop
4522NXST_FLOW_MONITOR reply (xid=0x0):
4523 event=ABBREV xid=0x12345678
cdbdeeda
SH
4524OFPT_BARRIER_REPLY:
4525])
4526
d9c8c57c 4527OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
cdbdeeda
SH
4528OVS_VSWITCHD_STOP
4529AT_CLEANUP
4530
4531AT_SETUP([ofproto - flow monitoring with out_port])
4532AT_KEYWORDS([monitor])
4533OVS_VSWITCHD_START
4534
4535ovs-ofctl add-flow br0 in_port=0,dl_vlan=121,actions=output:1
4536ovs-ofctl add-flow br0 in_port=0,dl_vlan=122,actions=output:1
4537ovs-ofctl add-flow br0 in_port=0,dl_vlan=123,actions=output:2
4538
4539# Start a monitor watching the flow table and check the initial reply.
4540ovs-ofctl monitor br0 watch:out_port=2 --detach --no-chdir --pidfile >monitor.log 2>&1
4541AT_CAPTURE_FILE([monitor.log])
4542ovs-appctl -t ovs-ofctl ofctl/barrier
4543AT_CHECK([sed 's/ (xid=0x[[1-9a-fA-F]][[0-9a-fA-F]]*)//' monitor.log], [0],
4544 [NXST_FLOW_MONITOR reply:
4545 event=ADDED table=0 cookie=0 in_port=0,dl_vlan=123 actions=output:2
4546OFPT_BARRIER_REPLY:
4547])
4548
4549ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
4550
4551# Add, modify flows and check the updates.
4552ovs-ofctl mod-flows br0 dl_vlan=121,actions=drop
4553ovs-ofctl mod-flows br0 dl_vlan=122,actions=output:1,output:2
4554ovs-appctl -t ovs-ofctl ofctl/barrier
4555
4556ovs-ofctl mod-flows br0 dl_vlan=123,actions=output:1,output:2
4557ovs-appctl -t ovs-ofctl ofctl/barrier
4558
4559ovs-ofctl mod-flows br0 dl_vlan=122,actions=output:1
4560ovs-appctl -t ovs-ofctl ofctl/barrier
4561ovs-ofctl mod-flows br0 dl_vlan=123,actions=output:2
4562ovs-appctl -t ovs-ofctl ofctl/barrier
4563
4564AT_CHECK([sed 's/ (xid=0x[[1-9a-fA-F]][[0-9a-fA-F]]*)//' monitor.log], [0],
4565[NXST_FLOW_MONITOR reply (xid=0x0):
4566 event=MODIFIED table=0 cookie=0 in_port=0,dl_vlan=122 actions=output:1,output:2
4567OFPT_BARRIER_REPLY:
4568NXST_FLOW_MONITOR reply (xid=0x0):
4569 event=MODIFIED table=0 cookie=0 in_port=0,dl_vlan=123 actions=output:1,output:2
4570OFPT_BARRIER_REPLY:
4571NXST_FLOW_MONITOR reply (xid=0x0):
4572 event=MODIFIED table=0 cookie=0 in_port=0,dl_vlan=122 actions=output:1
4573OFPT_BARRIER_REPLY:
4574NXST_FLOW_MONITOR reply (xid=0x0):
4575 event=MODIFIED table=0 cookie=0 in_port=0,dl_vlan=123 actions=output:2
2b07c8b1
BP
4576OFPT_BARRIER_REPLY:
4577])
4578
d9c8c57c 4579OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
2b07c8b1
BP
4580OVS_VSWITCHD_STOP
4581AT_CLEANUP
4582
4583AT_SETUP([ofproto - flow monitoring pause and resume])
4584AT_KEYWORDS([monitor])
4585
46a80050
EM
4586# The maximum socket receive buffer size is important for this test, which
4587# tests behavior when the receive buffer overflows.
4588if test -e /proc/sys/net/core/rmem_max; then
4589 # Linux
4590 rmem_max=`cat /proc/sys/net/core/rmem_max`
4591elif rmem_max=`sysctl -n net.inet.tcp.recvbuf_max 2>/dev/null`; then
f3326eeb 4592 : # FreeBSD, NetBSD
46a80050
EM
4593else
4594 # Don't know how to get maximum socket receive buffer on this OS
4595 AT_SKIP_IF([:])
4596fi
2b07c8b1
BP
4597# Calculate the total amount of queuing: rmem_max in the kernel, 128 kB
4598# in ofproto sending userspace (see ofmonitor_flush() in connmgr.c).
2b07c8b1
BP
4599queue_size=`expr $rmem_max + 128 \* 1024`
4600echo rmem_max=$rmem_max queue_size=$queue_size
4601
21aa35c3
BP
4602# If there's too much queuing skip the test to avoid timing out.
4603AT_SKIP_IF([test $rmem_max -gt 1048576])
4604
2b07c8b1
BP
4605# Each flow update message takes up at least 48 bytes of space in queues
4606# and in practice more than that.
4607n_msgs=`expr $queue_size / 48`
4608echo n_msgs=$n_msgs
4609
4610OVS_VSWITCHD_START
4611
4612# Start a monitor watching the flow table, then make it block.
53eb8cb8 4613on_exit 'kill `cat ovs-ofctl.pid`'
2b07c8b1
BP
4614ovs-ofctl monitor br0 watch: --detach --no-chdir --pidfile >monitor.log 2>&1
4615AT_CAPTURE_FILE([monitor.log])
4616ovs-appctl -t ovs-ofctl ofctl/block
4617
4618# Add $n_msgs flows.
4619(echo "in_port=2,actions=output:2"
5c6d0628 4620${PERL} -e '
2b07c8b1
BP
4621 for ($i = 0; $i < '$n_msgs'; $i++) {
4622 print "cookie=1,reg1=$i,actions=drop\n";
4623 }
4624') > flows.txt
4625AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
79b8c36c
BP
4626# Check that multipart flow dumps work properly:
4627AT_CHECK([ovs-ofctl diff-flows br0 flows.txt])
2b07c8b1
BP
4628AT_CHECK([ovs-ofctl add-flow br0 in_port=1,cookie=3,actions=drop])
4629AT_CHECK([ovs-ofctl mod-flows br0 in_port=2,cookie=2,actions=output:2])
4630AT_CHECK([ovs-ofctl del-flows br0 cookie=1/-1])
4631
4632ovs-appctl -t ovs-ofctl ofctl/unblock
c4821629
YT
4633
4634# Wait for the connection resumed.
4635# A barrier doesn't work for this purpose.
4636# https://www.mail-archive.com/dev@openvswitch.org/msg27013.html
4637# https://www.mail-archive.com/dev@openvswitch.org/msg27675.html
4638OVS_WAIT_UNTIL([grep NXT_FLOW_MONITOR_RESUMED monitor.log])
2b07c8b1 4639
d9c8c57c 4640OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
2b07c8b1
BP
4641
4642# Check that the flow monitor reported the same number of flows
4643# added and deleted, but fewer than we actually added and deleted.
4644adds=`grep -c 'ADDED.*reg1=' monitor.log`
4645deletes=`grep -c 'DELETED.*reg1=' monitor.log`
4646echo adds=$adds deletes=$deletes
4647AT_CHECK([test $adds -gt 100 && test $adds -lt $n_msgs])
4648AT_CHECK([test $adds = $deletes])
4649
d0ab8a1a
BP
4650# Check that the flow monitor reported everything in the expected order:
4651#
4652# event=ADDED table=0 cookie=0x1 reg1=0x22
4653# ...
4654# NXT_FLOW_MONITOR_PAUSED:
4655# ...
4656# event=DELETED reason=delete table=0 cookie=0x1 reg1=0x22
4657# ...
4658# event=ADDED table=0 cookie=0x3 in_port=1
4659# event=MODIFIED table=0 cookie=0x2 in_port=2 actions=output:2
4660# NXT_FLOW_MONITOR_RESUMED:
4661#
4662# except that, between the PAUSED and RESUMED, the order of the ADDED
4663# and MODIFIED lines lines depends on hash order, that is, it varies
4664# as we change the hash function or change architecture. Therefore,
4665# we use a couple of tests below to accept both orders.
2b07c8b1 4666AT_CHECK([ofctl_strip < monitor.log | sed -n -e '
46a80050 4667/reg1=0x22$/p
2b07c8b1
BP
4668/cookie=0x[[23]]/p
4669/NXT_FLOW_MONITOR_PAUSED:/p
4670/NXT_FLOW_MONITOR_RESUMED:/p
d0ab8a1a
BP
4671' > monitor.log.subset])
4672AT_CHECK([grep -v MODIFIED monitor.log.subset], [0], [dnl
4673 event=ADDED table=0 cookie=0x1 reg1=0x22
2b07c8b1
BP
4674NXT_FLOW_MONITOR_PAUSED:
4675 event=DELETED reason=delete table=0 cookie=0x1 reg1=0x22
4676 event=ADDED table=0 cookie=0x3 in_port=1
d0ab8a1a
BP
4677NXT_FLOW_MONITOR_RESUMED:
4678])
4679AT_CHECK([grep -v ADDED monitor.log.subset], [0], [dnl
4680NXT_FLOW_MONITOR_PAUSED:
4681 event=DELETED reason=delete table=0 cookie=0x1 reg1=0x22
2b07c8b1
BP
4682 event=MODIFIED table=0 cookie=0x2 in_port=2 actions=output:2
4683NXT_FLOW_MONITOR_RESUMED:
4684])
4685
4686OVS_VSWITCHD_STOP
4687AT_CLEANUP
45156451
AC
4688
4689AT_SETUP([ofproto - event filtering (OpenFlow 1.3)])
4690AT_KEYWORDS([monitor])
4691OVS_VSWITCHD_START
4692
4693# Start a monitor, use the required protocol version
4694ovs-ofctl -O OpenFlow13 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1
4695AT_CAPTURE_FILE([monitor.log])
4696
4697# Send an OpenFlow13 message (04), OFPT_GET_ASYNC_REQUEST (1a), length (8), xid (0a)
4698ovs-appctl -t ovs-ofctl ofctl/send 041a00080000000a
4699ovs-appctl -t ovs-ofctl ofctl/barrier
4700
4701# Check default setting
4702read -r -d '' expected <<'EOF'
4703EOF
4704
4705AT_CHECK([ofctl_strip < monitor.log], [], [dnl
4706send: OFPT_GET_ASYNC_REQUEST (OF1.3):
4707OFPT_GET_ASYNC_REPLY (OF1.3):
4708 master:
4709 PACKET_IN: no_match action
4710 PORT_STATUS: add delete modify
75754d04 4711 FLOW_REMOVED: idle hard delete group_delete
904e5202
BP
4712 ROLE_STATUS: (off)
4713 TABLE_STATUS: (off)
4714 REQUESTFORWARD: (off)
45156451
AC
4715
4716 slave:
4717 PACKET_IN: (off)
4718 PORT_STATUS: add delete modify
4719 FLOW_REMOVED: (off)
904e5202
BP
4720 ROLE_STATUS: (off)
4721 TABLE_STATUS: (off)
4722 REQUESTFORWARD: (off)
45156451
AC
4723OFPT_BARRIER_REPLY (OF1.3):
4724])
4725
4726OVS_VSWITCHD_STOP
4727AT_CLEANUP
4abb8608
BP
4728
4729AT_SETUP([ofproto - ofport_request])
4730OVS_VSWITCHD_START
ca5792f0 4731add_of_ports br0 1 2 3
4abb8608
BP
4732
4733set_and_check_specific_ofports () {
4734 ovs-vsctl set Interface p1 ofport_request="$1" -- \
4735 set Interface p2 ofport_request="$2" -- \
4736 set Interface p3 ofport_request="$3"
4737 ofports=`ovs-vsctl get Interface p1 ofport -- \
4738 get Interface p2 ofport -- \
4739 get Interface p3 ofport`
4740 AT_CHECK_UNQUOTED([echo $ofports], [0], [$1 $2 $3
4741])
4742}
4743for pre in '1 2 3' '1 3 2' '2 1 3' '2 3 1' '3 1 2' '3 2 1'; do
4744 for post in '1 2 3' '1 3 2' '2 1 3' '2 3 1' '3 1 2' '3 2 1'; do
4745 echo -----------------------------------------------------------
4746 echo "Check changing port numbers from $pre to $post"
d08d51b9
JS
4747 set_and_check_specific_ofports $pre
4748 set_and_check_specific_ofports $post
4abb8608
BP
4749 done
4750done
4751
4752ovs-vsctl del-port p3
4753
4754set_and_check_poorly_specified_ofports () {
4755 ovs-vsctl set Interface p1 ofport_request="$1" -- \
4756 set Interface p2 ofport_request="$2"
4757 p1=`ovs-vsctl get Interface p1 ofport`
4758 p2=`ovs-vsctl get Interface p2 ofport`
4759 echo $p1 $p2
4760
4761 AT_CHECK([test "$p1" != "$p2"])
4762 if test "$1" = "$2" && test "$1" != '[[]]'; then
4763 # One port number must be the requested one.
4764 AT_CHECK([test "$p1" = "$1" || test "$p2" = "$1"])
4765 # The other port number must be different (already tested above).
4766 else
641c6188
YT
4767 AT_CHECK([test "$1" = '[[]]' || test "$p1" = "$1"])
4768 AT_CHECK([test "$2" = '[[]]' || test "$p2" = "$2"])
4abb8608
BP
4769 fi
4770}
4771for pre in '1 2' '[[]] 2' '1 [[]]' '[[]] [[]]' '2 1' '[[]] 1' '2 [[]]' \
4772 '1 1' '2 2'; do
4773 for post in '1 2' '[[]] 2' '1 [[]]' '[[]] [[]]' '2 1' '[[]] 1' '2 [[]]' \
4774 '1 1' '2 2'; do
4775 echo -----------------------------------------------------------
4776 echo "Check changing port numbers from $pre to $post"
4777 set_and_check_poorly_specified_ofports $pre
4778 set_and_check_poorly_specified_ofports $post
4779 done
4780done
4781OVS_VSWITCHD_STOP
4782AT_CLEANUP
777af88d
AC
4783
4784
06d4d4b6 4785AT_SETUP([ofproto - bundle open (OpenFlow 1.4)])
777af88d
AC
4786AT_KEYWORDS([monitor])
4787OVS_VSWITCHD_START
4788
4789# Start a monitor, use the required protocol version
4790ovs-ofctl -O OpenFlow14 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1
4791AT_CAPTURE_FILE([monitor.log])
4792
4793# Send an OpenFlow14 message (05), OFPT_BUNDLE_CONTROL (21), length (10), xid (0a)
1f42be1c 4794ovs-appctl -t ovs-ofctl ofctl/send "05 21 00 10 00 00 00 0a 00 00 00 01 00 00 00 02"
777af88d 4795ovs-appctl -t ovs-ofctl ofctl/barrier
d9c8c57c 4796OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
777af88d
AC
4797
4798AT_CHECK([ofctl_strip < monitor.log], [], [dnl
4799send: OFPT_BUNDLE_CONTROL (OF1.4):
1f42be1c 4800 bundle_id=0x1 type=OPEN_REQUEST flags=ordered
777af88d
AC
4801OFPT_BUNDLE_CONTROL (OF1.4):
4802 bundle_id=0x1 type=OPEN_REPLY flags=0
4803OFPT_BARRIER_REPLY (OF1.4):
4804])
4805
4806OVS_VSWITCHD_STOP
4807AT_CLEANUP
4808
06d4d4b6 4809AT_SETUP([ofproto - bundle double open (OpenFlow 1.4)])
777af88d
AC
4810AT_KEYWORDS([monitor])
4811OVS_VSWITCHD_START
4812
4813# Start a monitor, use the required protocol version
4814ovs-ofctl -O OpenFlow14 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1
4815AT_CAPTURE_FILE([monitor.log])
4816
4817# Send twice an OpenFlow14 message (05), OFPT_BUNDLE_CONTROL (21), length (10), xid (0a)
1f42be1c 4818ovs-appctl -t ovs-ofctl ofctl/send "05 21 00 10 00 00 00 0a 00 00 00 01 00 00 00 02"
777af88d 4819ovs-appctl -t ovs-ofctl ofctl/barrier
1f42be1c 4820ovs-appctl -t ovs-ofctl ofctl/send "05 21 00 10 00 00 00 0a 00 00 00 01 00 00 00 02"
777af88d 4821ovs-appctl -t ovs-ofctl ofctl/barrier
d9c8c57c 4822OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
777af88d
AC
4823
4824AT_CHECK([ofctl_strip < monitor.log], [0], [dnl
4825send: OFPT_BUNDLE_CONTROL (OF1.4):
1f42be1c 4826 bundle_id=0x1 type=OPEN_REQUEST flags=ordered
777af88d
AC
4827OFPT_BUNDLE_CONTROL (OF1.4):
4828 bundle_id=0x1 type=OPEN_REPLY flags=0
4829OFPT_BARRIER_REPLY (OF1.4):
4830send: OFPT_BUNDLE_CONTROL (OF1.4):
1f42be1c 4831 bundle_id=0x1 type=OPEN_REQUEST flags=ordered
777af88d
AC
4832OFPT_ERROR (OF1.4): OFPBFC_BAD_ID
4833OFPT_BUNDLE_CONTROL (OF1.4):
1f42be1c 4834 bundle_id=0x1 type=OPEN_REQUEST flags=ordered
777af88d
AC
4835OFPT_BARRIER_REPLY (OF1.4):
4836])
4837
4838OVS_VSWITCHD_STOP
4839AT_CLEANUP
4840
4841AT_SETUP([ofproto - bundle close without open (OpenFlow 1.4)])
4842AT_KEYWORDS([monitor])
4843OVS_VSWITCHD_START
4844
4845# Start a monitor, use the required protocol version
4846ovs-ofctl -O OpenFlow14 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1
4847AT_CAPTURE_FILE([monitor.log])
4848
1f42be1c 4849ovs-appctl -t ovs-ofctl ofctl/send "05 21 00 10 00 00 00 0a 00 00 00 01 00 02 00 02"
777af88d 4850ovs-appctl -t ovs-ofctl ofctl/barrier
d9c8c57c 4851OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
777af88d
AC
4852
4853AT_CHECK([ofctl_strip < monitor.log], [0], [dnl
4854send: OFPT_BUNDLE_CONTROL (OF1.4):
1f42be1c 4855 bundle_id=0x1 type=CLOSE_REQUEST flags=ordered
777af88d
AC
4856OFPT_ERROR (OF1.4): OFPBFC_BAD_ID
4857OFPT_BUNDLE_CONTROL (OF1.4):
1f42be1c 4858 bundle_id=0x1 type=CLOSE_REQUEST flags=ordered
777af88d
AC
4859OFPT_BARRIER_REPLY (OF1.4):
4860])
4861
4862OVS_VSWITCHD_STOP
4863AT_CLEANUP
4864
4865AT_SETUP([ofproto - bundle double close (OpenFlow 1.4)])
4866AT_KEYWORDS([monitor])
4867OVS_VSWITCHD_START
4868
4869# Start a monitor, use the required protocol version
4870ovs-ofctl -O OpenFlow14 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1
4871AT_CAPTURE_FILE([monitor.log])
4872
4873# Open, Close, Close
1f42be1c 4874ovs-appctl -t ovs-ofctl ofctl/send "05 21 00 10 00 00 00 0a 00 00 00 01 00 00 00 02"
777af88d 4875ovs-appctl -t ovs-ofctl ofctl/barrier
1f42be1c 4876ovs-appctl -t ovs-ofctl ofctl/send "05 21 00 10 00 00 00 0a 00 00 00 01 00 02 00 02"
777af88d 4877ovs-appctl -t ovs-ofctl ofctl/barrier
1f42be1c 4878ovs-appctl -t ovs-ofctl ofctl/send "05 21 00 10 00 00 00 0a 00 00 00 01 00 02 00 02"
777af88d 4879ovs-appctl -t ovs-ofctl ofctl/barrier
d9c8c57c 4880OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
777af88d
AC
4881
4882AT_CHECK([ofctl_strip < monitor.log], [0], [dnl
4883send: OFPT_BUNDLE_CONTROL (OF1.4):
1f42be1c 4884 bundle_id=0x1 type=OPEN_REQUEST flags=ordered
777af88d
AC
4885OFPT_BUNDLE_CONTROL (OF1.4):
4886 bundle_id=0x1 type=OPEN_REPLY flags=0
4887OFPT_BARRIER_REPLY (OF1.4):
4888send: OFPT_BUNDLE_CONTROL (OF1.4):
1f42be1c 4889 bundle_id=0x1 type=CLOSE_REQUEST flags=ordered
777af88d
AC
4890OFPT_BUNDLE_CONTROL (OF1.4):
4891 bundle_id=0x1 type=CLOSE_REPLY flags=0
4892OFPT_BARRIER_REPLY (OF1.4):
4893send: OFPT_BUNDLE_CONTROL (OF1.4):
1f42be1c 4894 bundle_id=0x1 type=CLOSE_REQUEST flags=ordered
777af88d
AC
4895OFPT_ERROR (OF1.4): OFPBFC_BUNDLE_CLOSED
4896OFPT_BUNDLE_CONTROL (OF1.4):
1f42be1c 4897 bundle_id=0x1 type=CLOSE_REQUEST flags=ordered
777af88d
AC
4898OFPT_BARRIER_REPLY (OF1.4):
4899])
4900
4901OVS_VSWITCHD_STOP
4902AT_CLEANUP
4903
4904AT_SETUP([ofproto - bundle close, different flags (OpenFlow 1.4)])
4905AT_KEYWORDS([monitor])
4906OVS_VSWITCHD_START
4907
4908# Start a monitor, use the required protocol version
4909ovs-ofctl -O OpenFlow14 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1
4910AT_CAPTURE_FILE([monitor.log])
4911
68030e16 4912# Open, Close
1f42be1c 4913ovs-appctl -t ovs-ofctl ofctl/send "05 21 00 10 00 00 00 0a 00 00 00 01 00 00 00 02"
777af88d 4914ovs-appctl -t ovs-ofctl ofctl/barrier
1f42be1c 4915ovs-appctl -t ovs-ofctl ofctl/send "05 21 00 10 00 00 00 0a 00 00 00 01 00 02 00 01"
777af88d 4916ovs-appctl -t ovs-ofctl ofctl/barrier
d9c8c57c 4917OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
777af88d
AC
4918
4919AT_CHECK([ofctl_strip < monitor.log], [0], [dnl
4920send: OFPT_BUNDLE_CONTROL (OF1.4):
1f42be1c 4921 bundle_id=0x1 type=OPEN_REQUEST flags=ordered
777af88d
AC
4922OFPT_BUNDLE_CONTROL (OF1.4):
4923 bundle_id=0x1 type=OPEN_REPLY flags=0
4924OFPT_BARRIER_REPLY (OF1.4):
4925send: OFPT_BUNDLE_CONTROL (OF1.4):
1f42be1c 4926 bundle_id=0x1 type=CLOSE_REQUEST flags=atomic
777af88d
AC
4927OFPT_ERROR (OF1.4): OFPBFC_BAD_FLAGS
4928OFPT_BUNDLE_CONTROL (OF1.4):
1f42be1c 4929 bundle_id=0x1 type=CLOSE_REQUEST flags=atomic
777af88d
AC
4930OFPT_BARRIER_REPLY (OF1.4):
4931])
4932
4933OVS_VSWITCHD_STOP
4934AT_CLEANUP
4935
4936AT_SETUP([ofproto - bundle commit without open (OpenFlow 1.4)])
4937AT_KEYWORDS([monitor])
4938OVS_VSWITCHD_START
4939
4940# Start a monitor, use the required protocol version
4941ovs-ofctl -O OpenFlow14 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1
4942AT_CAPTURE_FILE([monitor.log])
4943
68030e16 4944# Commit
1f42be1c 4945ovs-appctl -t ovs-ofctl ofctl/send "05 21 00 10 00 00 00 0a 00 00 00 01 00 04 00 02"
777af88d 4946ovs-appctl -t ovs-ofctl ofctl/barrier
d9c8c57c 4947OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
777af88d
AC
4948
4949AT_CHECK([ofctl_strip < monitor.log], [0], [dnl
4950send: OFPT_BUNDLE_CONTROL (OF1.4):
1f42be1c 4951 bundle_id=0x1 type=COMMIT_REQUEST flags=ordered
777af88d
AC
4952OFPT_ERROR (OF1.4): OFPBFC_BAD_ID
4953OFPT_BUNDLE_CONTROL (OF1.4):
1f42be1c 4954 bundle_id=0x1 type=COMMIT_REQUEST flags=ordered
777af88d
AC
4955OFPT_BARRIER_REPLY (OF1.4):
4956])
4957
4958OVS_VSWITCHD_STOP
4959AT_CLEANUP
4960
4961AT_SETUP([ofproto - bundle commit, different flags (OpenFlow 1.4)])
4962AT_KEYWORDS([monitor])
4963OVS_VSWITCHD_START
4964
4965# Start a monitor, use the required protocol version
4966ovs-ofctl -O OpenFlow14 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1
4967AT_CAPTURE_FILE([monitor.log])
4968
68030e16 4969# Open, Commit
1f42be1c 4970ovs-appctl -t ovs-ofctl ofctl/send "05 21 00 10 00 00 00 0a 00 00 00 01 00 00 00 02"
777af88d 4971ovs-appctl -t ovs-ofctl ofctl/barrier
1f42be1c 4972ovs-appctl -t ovs-ofctl ofctl/send "05 21 00 10 00 00 00 0a 00 00 00 01 00 04 00 01"
777af88d 4973ovs-appctl -t ovs-ofctl ofctl/barrier
d9c8c57c 4974OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
777af88d
AC
4975
4976AT_CHECK([ofctl_strip < monitor.log], [0], [dnl
4977send: OFPT_BUNDLE_CONTROL (OF1.4):
1f42be1c 4978 bundle_id=0x1 type=OPEN_REQUEST flags=ordered
777af88d
AC
4979OFPT_BUNDLE_CONTROL (OF1.4):
4980 bundle_id=0x1 type=OPEN_REPLY flags=0
4981OFPT_BARRIER_REPLY (OF1.4):
4982send: OFPT_BUNDLE_CONTROL (OF1.4):
1f42be1c 4983 bundle_id=0x1 type=COMMIT_REQUEST flags=atomic
777af88d
AC
4984OFPT_ERROR (OF1.4): OFPBFC_BAD_FLAGS
4985OFPT_BUNDLE_CONTROL (OF1.4):
1f42be1c 4986 bundle_id=0x1 type=COMMIT_REQUEST flags=atomic
777af88d
AC
4987OFPT_BARRIER_REPLY (OF1.4):
4988])
4989
4990OVS_VSWITCHD_STOP
4991AT_CLEANUP
4992
4993AT_SETUP([ofproto - bundle discard without open (OpenFlow 1.4)])
4994AT_KEYWORDS([monitor])
4995OVS_VSWITCHD_START
4996
4997# Start a monitor, use the required protocol version
4998ovs-ofctl -O OpenFlow14 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1
4999AT_CAPTURE_FILE([monitor.log])
5000
68030e16 5001# Discard
1f42be1c 5002ovs-appctl -t ovs-ofctl ofctl/send "05 21 00 10 00 00 00 0a 00 00 00 01 00 06 00 02"
777af88d 5003ovs-appctl -t ovs-ofctl ofctl/barrier
d9c8c57c 5004OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
777af88d
AC
5005
5006AT_CHECK([ofctl_strip < monitor.log], [0], [dnl
5007send: OFPT_BUNDLE_CONTROL (OF1.4):
1f42be1c 5008 bundle_id=0x1 type=DISCARD_REQUEST flags=ordered
777af88d
AC
5009OFPT_ERROR (OF1.4): OFPBFC_BAD_ID
5010OFPT_BUNDLE_CONTROL (OF1.4):
1f42be1c 5011 bundle_id=0x1 type=DISCARD_REQUEST flags=ordered
777af88d
AC
5012OFPT_BARRIER_REPLY (OF1.4):
5013])
5014
5015OVS_VSWITCHD_STOP
5016AT_CLEANUP
db5076ee
JR
5017
5018
5019AT_SETUP([ofproto - bundle with multiple flow mods (OpenFlow 1.4)])
db5076ee
JR
5020OVS_VSWITCHD_START
5021
5022AT_CHECK([ovs-appctl vlog/set vconn:dbg])
5023
50f96b10 5024AT_CHECK([ovs-ofctl --no-names del-flows br0])
db5076ee
JR
5025
5026AT_DATA([flows.txt], [dnl
5027add idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=1
5028add idle_timeout=60 in_port=2 dl_src=00:77:88:99:aa:bb actions=2
5029add idle_timeout=70 in_port=2 dl_src=00:88:99:aa:bb:cc actions=3
5030add idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=4
5031delete
5032add idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=5
5033add idle_timeout=60 in_port=2 dl_src=00:77:88:99:aa:bb actions=6
5034add idle_timeout=70 in_port=2 dl_src=00:88:99:aa:bb:cc actions=7
5035delete in_port=2 dl_src=00:88:99:aa:bb:cc
5036])
5037
50f96b10 5038AT_CHECK([ovs-ofctl --no-names --bundle add-flows br0 flows.txt])
db5076ee
JR
5039
5040AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
5041 idle_timeout=50, in_port=2,dl_src=00:66:77:88:99:aa actions=output:5
5042 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:6
5043NXST_FLOW reply:
5044])
5045
5046AT_DATA([flows.txt], [dnl
5047modify actions=drop
5048modify_strict in_port=2 dl_src=00:77:88:99:aa:bb actions=7
5049])
5050
50f96b10 5051AT_CHECK([ovs-ofctl --no-names --bundle add-flows br0 flows.txt])
db5076ee
JR
5052
5053AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
5054 idle_timeout=50, in_port=2,dl_src=00:66:77:88:99:aa actions=drop
5055 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:7
5056NXST_FLOW reply:
5057])
5058
5059# Adding an existing flow acts as a modify, and delete_strict also works.
5060AT_DATA([flows.txt], [dnl
5061add idle_timeout=60 in_port=2 dl_src=00:77:88:99:aa:bb actions=8
5062delete_strict in_port=2 dl_src=00:66:77:88:99:aa
5063add in_port=2 dl_src=00:66:77:88:99:aa actions=drop
5064])
5065
50f96b10 5066AT_CHECK([ovs-ofctl --no-names --bundle add-flows br0 flows.txt])
db5076ee
JR
5067
5068AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
5069 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:8
5070 in_port=2,dl_src=00:66:77:88:99:aa actions=drop
5071NXST_FLOW reply:
5072])
5073
5074dnl Check logs for OpenFlow trace
5075# Prevent race.
38b0b29f 5076OVS_WAIT_UNTIL([vconn_sub < ovs-vswitchd.log | test `grep -- "|vconn|DBG|unix: sent (Success): NXST_FLOW reply" | wc -l` -ge 3])
12e2ba2e 5077AT_CHECK([print_vconn_debug | vconn_sub | ofctl_strip], [0], [dnl
b79d45a1
BP
5078vconn|DBG|unix: sent (Success): OFPT_HELLO (OF1.6):
5079 version bitmap: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
db5076ee
JR
5080vconn|DBG|unix: received: OFPT_HELLO:
5081 version bitmap: 0x01
b79d45a1 5082vconn|DBG|unix: negotiated OpenFlow version 0x01 (we support version 0x07 and earlier, peer supports version 0x01)
db5076ee
JR
5083vconn|DBG|unix: received: OFPT_FLOW_MOD: DEL actions=drop
5084vconn|DBG|unix: received: OFPT_BARRIER_REQUEST:
5085vconn|DBG|unix: sent (Success): OFPT_BARRIER_REPLY:
b79d45a1
BP
5086vconn|DBG|unix: sent (Success): OFPT_HELLO (OF1.6):
5087 version bitmap: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
db5076ee 5088vconn|DBG|unix: received: OFPT_HELLO (OF1.4):
5f8c05ad 5089 version bitmap: 0x05
b79d45a1 5090vconn|DBG|unix: negotiated OpenFlow version 0x05 (we support version 0x07 and earlier, peer supports version 0x05)
db5076ee 5091vconn|DBG|unix: received: OFPT_BUNDLE_CONTROL (OF1.4):
39c94593 5092 bundle_id=0 type=OPEN_REQUEST flags=atomic ordered
db5076ee
JR
5093vconn|DBG|unix: sent (Success): OFPT_BUNDLE_CONTROL (OF1.4):
5094 bundle_id=0 type=OPEN_REPLY flags=0
5095vconn|DBG|unix: received: OFPT_BUNDLE_ADD_MESSAGE (OF1.4):
39c94593 5096 bundle_id=0 flags=atomic ordered
db5076ee
JR
5097OFPT_FLOW_MOD (OF1.4): ADD in_port=2,dl_src=00:66:77:88:99:aa idle:50 actions=output:1
5098vconn|DBG|unix: received: OFPT_BUNDLE_ADD_MESSAGE (OF1.4):
39c94593 5099 bundle_id=0 flags=atomic ordered
db5076ee
JR
5100OFPT_FLOW_MOD (OF1.4): ADD in_port=2,dl_src=00:77:88:99:aa:bb idle:60 actions=output:2
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:88:99:aa:bb:cc idle:70 actions=output:3
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): ADD in_port=2,dl_src=00:66:77:88:99:aa idle:50 actions=output:4
5107vconn|DBG|unix: received: OFPT_BUNDLE_ADD_MESSAGE (OF1.4):
39c94593 5108 bundle_id=0 flags=atomic ordered
db5076ee
JR
5109OFPT_FLOW_MOD (OF1.4): DEL table:255 actions=drop
5110vconn|DBG|unix: received: OFPT_BUNDLE_ADD_MESSAGE (OF1.4):
39c94593 5111 bundle_id=0 flags=atomic ordered
db5076ee
JR
5112OFPT_FLOW_MOD (OF1.4): ADD in_port=2,dl_src=00:66:77:88:99:aa idle:50 actions=output:5
5113vconn|DBG|unix: received: OFPT_BUNDLE_ADD_MESSAGE (OF1.4):
39c94593 5114 bundle_id=0 flags=atomic ordered
db5076ee
JR
5115OFPT_FLOW_MOD (OF1.4): ADD in_port=2,dl_src=00:77:88:99:aa:bb idle:60 actions=output:6
5116vconn|DBG|unix: received: OFPT_BUNDLE_ADD_MESSAGE (OF1.4):
39c94593 5117 bundle_id=0 flags=atomic ordered
db5076ee
JR
5118OFPT_FLOW_MOD (OF1.4): ADD in_port=2,dl_src=00:88:99:aa:bb:cc idle:70 actions=output:7
5119vconn|DBG|unix: received: OFPT_BUNDLE_ADD_MESSAGE (OF1.4):
39c94593 5120 bundle_id=0 flags=atomic ordered
db5076ee 5121OFPT_FLOW_MOD (OF1.4): DEL table:255 in_port=2,dl_src=00:88:99:aa:bb:cc actions=drop
506c1ddb
JR
5122vconn|DBG|unix: received: OFPT_BARRIER_REQUEST (OF1.4):
5123vconn|DBG|unix: sent (Success): OFPT_BARRIER_REPLY (OF1.4):
db5076ee 5124vconn|DBG|unix: received: OFPT_BUNDLE_CONTROL (OF1.4):
39c94593 5125 bundle_id=0 type=COMMIT_REQUEST flags=atomic ordered
db5076ee
JR
5126vconn|DBG|unix: sent (Success): OFPT_BUNDLE_CONTROL (OF1.4):
5127 bundle_id=0 type=COMMIT_REPLY flags=0
b79d45a1
BP
5128vconn|DBG|unix: sent (Success): OFPT_HELLO (OF1.6):
5129 version bitmap: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
db5076ee
JR
5130vconn|DBG|unix: received: OFPT_HELLO:
5131 version bitmap: 0x01
b79d45a1 5132vconn|DBG|unix: negotiated OpenFlow version 0x01 (we support version 0x07 and earlier, peer supports version 0x01)
db5076ee
JR
5133vconn|DBG|unix: received: NXT_SET_FLOW_FORMAT: format=nxm
5134vconn|DBG|unix: received: OFPT_BARRIER_REQUEST:
5135vconn|DBG|unix: sent (Success): OFPT_BARRIER_REPLY:
5136vconn|DBG|unix: received: NXST_FLOW request:
5137vconn|DBG|unix: sent (Success): NXST_FLOW reply:
5138 idle_timeout=50, in_port=2,dl_src=00:66:77:88:99:aa actions=output:5
5139 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:6
b79d45a1
BP
5140vconn|DBG|unix: sent (Success): OFPT_HELLO (OF1.6):
5141 version bitmap: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
db5076ee 5142vconn|DBG|unix: received: OFPT_HELLO (OF1.4):
5f8c05ad 5143 version bitmap: 0x05
b79d45a1 5144vconn|DBG|unix: negotiated OpenFlow version 0x05 (we support version 0x07 and earlier, peer supports version 0x05)
db5076ee 5145vconn|DBG|unix: received: OFPT_BUNDLE_CONTROL (OF1.4):
39c94593 5146 bundle_id=0 type=OPEN_REQUEST flags=atomic ordered
db5076ee
JR
5147vconn|DBG|unix: sent (Success): OFPT_BUNDLE_CONTROL (OF1.4):
5148 bundle_id=0 type=OPEN_REPLY flags=0
5149vconn|DBG|unix: received: OFPT_BUNDLE_ADD_MESSAGE (OF1.4):
39c94593 5150 bundle_id=0 flags=atomic ordered
db5076ee
JR
5151OFPT_FLOW_MOD (OF1.4): MOD actions=drop
5152vconn|DBG|unix: received: OFPT_BUNDLE_ADD_MESSAGE (OF1.4):
39c94593 5153 bundle_id=0 flags=atomic ordered
db5076ee 5154OFPT_FLOW_MOD (OF1.4): MOD_STRICT in_port=2,dl_src=00:77:88:99:aa:bb actions=output:7
506c1ddb
JR
5155vconn|DBG|unix: received: OFPT_BARRIER_REQUEST (OF1.4):
5156vconn|DBG|unix: sent (Success): OFPT_BARRIER_REPLY (OF1.4):
db5076ee 5157vconn|DBG|unix: received: OFPT_BUNDLE_CONTROL (OF1.4):
39c94593 5158 bundle_id=0 type=COMMIT_REQUEST flags=atomic ordered
db5076ee
JR
5159vconn|DBG|unix: sent (Success): OFPT_BUNDLE_CONTROL (OF1.4):
5160 bundle_id=0 type=COMMIT_REPLY flags=0
b79d45a1
BP
5161vconn|DBG|unix: sent (Success): OFPT_HELLO (OF1.6):
5162 version bitmap: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
db5076ee
JR
5163vconn|DBG|unix: received: OFPT_HELLO:
5164 version bitmap: 0x01
b79d45a1 5165vconn|DBG|unix: negotiated OpenFlow version 0x01 (we support version 0x07 and earlier, peer supports version 0x01)
db5076ee
JR
5166vconn|DBG|unix: received: NXT_SET_FLOW_FORMAT: format=nxm
5167vconn|DBG|unix: received: OFPT_BARRIER_REQUEST:
5168vconn|DBG|unix: sent (Success): OFPT_BARRIER_REPLY:
5169vconn|DBG|unix: received: NXST_FLOW request:
5170vconn|DBG|unix: sent (Success): NXST_FLOW reply:
5171 idle_timeout=50, in_port=2,dl_src=00:66:77:88:99:aa actions=drop
5172 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:7
b79d45a1
BP
5173vconn|DBG|unix: sent (Success): OFPT_HELLO (OF1.6):
5174 version bitmap: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
db5076ee 5175vconn|DBG|unix: received: OFPT_HELLO (OF1.4):
5f8c05ad 5176 version bitmap: 0x05
b79d45a1 5177vconn|DBG|unix: negotiated OpenFlow version 0x05 (we support version 0x07 and earlier, peer supports version 0x05)
db5076ee 5178vconn|DBG|unix: received: OFPT_BUNDLE_CONTROL (OF1.4):
39c94593 5179 bundle_id=0 type=OPEN_REQUEST flags=atomic ordered
db5076ee
JR
5180vconn|DBG|unix: sent (Success): OFPT_BUNDLE_CONTROL (OF1.4):
5181 bundle_id=0 type=OPEN_REPLY flags=0
5182vconn|DBG|unix: received: OFPT_BUNDLE_ADD_MESSAGE (OF1.4):
39c94593 5183 bundle_id=0 flags=atomic ordered
db5076ee
JR
5184OFPT_FLOW_MOD (OF1.4): ADD in_port=2,dl_src=00:77:88:99:aa:bb idle:60 actions=output:8
5185vconn|DBG|unix: received: OFPT_BUNDLE_ADD_MESSAGE (OF1.4):
39c94593 5186 bundle_id=0 flags=atomic ordered
db5076ee
JR
5187OFPT_FLOW_MOD (OF1.4): DEL_STRICT table:255 in_port=2,dl_src=00:66:77:88:99:aa actions=drop
5188vconn|DBG|unix: received: OFPT_BUNDLE_ADD_MESSAGE (OF1.4):
39c94593 5189 bundle_id=0 flags=atomic ordered
db5076ee 5190OFPT_FLOW_MOD (OF1.4): ADD in_port=2,dl_src=00:66:77:88:99:aa actions=drop
506c1ddb
JR
5191vconn|DBG|unix: received: OFPT_BARRIER_REQUEST (OF1.4):
5192vconn|DBG|unix: sent (Success): OFPT_BARRIER_REPLY (OF1.4):
db5076ee 5193vconn|DBG|unix: received: OFPT_BUNDLE_CONTROL (OF1.4):
39c94593 5194 bundle_id=0 type=COMMIT_REQUEST flags=atomic ordered
db5076ee
JR
5195vconn|DBG|unix: sent (Success): OFPT_BUNDLE_CONTROL (OF1.4):
5196 bundle_id=0 type=COMMIT_REPLY flags=0
b79d45a1
BP
5197vconn|DBG|unix: sent (Success): OFPT_HELLO (OF1.6):
5198 version bitmap: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
db5076ee
JR
5199vconn|DBG|unix: received: OFPT_HELLO:
5200 version bitmap: 0x01
b79d45a1 5201vconn|DBG|unix: negotiated OpenFlow version 0x01 (we support version 0x07 and earlier, peer supports version 0x01)
db5076ee
JR
5202vconn|DBG|unix: received: NXT_SET_FLOW_FORMAT: format=nxm
5203vconn|DBG|unix: received: OFPT_BARRIER_REQUEST:
5204vconn|DBG|unix: sent (Success): OFPT_BARRIER_REPLY:
5205vconn|DBG|unix: received: NXST_FLOW request:
5206vconn|DBG|unix: sent (Success): NXST_FLOW reply:
5207 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:8
5208 in_port=2,dl_src=00:66:77:88:99:aa actions=drop
5209])
5210
0c78eebe
JR
5211AT_CHECK([grep " flow_mods in the last " ovs-vswitchd.log | sed -e 's/^.*connmgr|INFO|//'], [0], [dnl
5212br0<->unix: 1 flow_mods in the last 0 s (1 deletes)
5213br0<->unix: 9 flow_mods in the last 0 s (7 adds, 2 deletes)
5214br0<->unix: 2 flow_mods in the last 0 s (2 modifications)
5215br0<->unix: 3 flow_mods in the last 0 s (2 adds, 1 deletes)
5216])
5217
db5076ee
JR
5218OVS_VSWITCHD_STOP
5219AT_CLEANUP
5220
5221
5222AT_SETUP([ofproto - failing bundle commit (OpenFlow 1.4)])
db5076ee
JR
5223OVS_VSWITCHD_START
5224
5225AT_CHECK([ovs-ofctl del-flows br0])
5226
5227ovs-ofctl add-flows br0 - <<EOF
5228idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=11
5229idle_timeout=60 in_port=2 dl_src=00:77:88:99:aa:bb actions=22
5230idle_timeout=70 in_port=2 dl_src=00:88:99:aa:bb:cc actions=33
5231EOF
5232AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
5233 idle_timeout=50, in_port=2,dl_src=00:66:77:88:99:aa actions=output:11
5234 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:22
5235 idle_timeout=70, in_port=2,dl_src=00:88:99:aa:bb:cc actions=output:33
5236NXST_FLOW reply:
5237])
5238
5239# last line uses illegal table number (OVS internal table)
5240AT_DATA([flows.txt], [dnl
5241add idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=1
5242add idle_timeout=60 in_port=2 dl_src=00:77:88:99:aa:bb actions=2
5243add idle_timeout=70 in_port=2 dl_src=00:88:99:aa:bb:cc actions=3
5244modify idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=4
5245delete
5246add idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=5
5247add idle_timeout=60 in_port=2 dl_src=00:77:88:99:aa:bb actions=6
5248add idle_timeout=70 in_port=2 dl_src=00:88:99:aa:bb:cc actions=7
5249delete in_port=2 dl_src=00:88:99:aa:bb:cc
5250add table=254 actions=drop
5251])
5252
50f96b10 5253AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt 2>&1 | sed '/talking to/,$d' | strip_xids],
b0065993 5254[0], [dnl
50f96b10 5255Error OFPBRC_EPERM for: OFPT_FLOW_MOD (OF1.4): ADD table:254 actions=drop
db5076ee
JR
5256])
5257
5258AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
5259 idle_timeout=50, in_port=2,dl_src=00:66:77:88:99:aa actions=output:11
5260 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:22
5261 idle_timeout=70, in_port=2,dl_src=00:88:99:aa:bb:cc actions=output:33
5262NXST_FLOW reply:
5263])
5264
5265OVS_VSWITCHD_STOP
5266AT_CLEANUP
51bb26fa
JR
5267
5268
5269AT_SETUP([ofproto - bundle timeout (OpenFlow 1.4)])
5270AT_KEYWORDS([monitor])
5271OVS_VSWITCHD_START
5272
5273# Start a monitor, use the required protocol version
5274ovs-ofctl -O OpenFlow14 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1
5275AT_CAPTURE_FILE([monitor.log])
5276
5277ovs-appctl time/stop
5278
5279# Send an OpenFlow14 message (05), OFPT_BUNDLE_CONTROL (21), length (10), xid (01)
5280ovs-appctl -t ovs-ofctl ofctl/send "05 21 00 10 00 00 00 01 00 00 00 01 00 00 00 03"
5281ovs-appctl time/warp 8000
5282# Send a bundle flow mod, it should keep the bundle alive.
5283ovs-appctl -t ovs-ofctl ofctl/send "05 22 00 a0 00 00 00 02 00 00 00 01 00 00 00 03 \
528405 0e 00 90 00 00 00 02 00 00 00 00 00 00 00 00 \
528500 00 00 00 00 00 00 00 01 00 00 00 00 00 ff ff \
5286ff ff ff ff ff ff ff ff ff ff ff ff 00 00 00 00 \
528700 01 00 42 80 00 00 04 00 00 00 01 80 00 08 06 \
528850 54 00 00 00 06 80 00 06 06 50 54 00 00 00 05 \
528980 00 0a 02 08 06 80 00 0c 02 00 00 80 00 2a 02 \
529000 02 80 00 2c 04 c0 a8 00 02 80 00 2e 04 c0 a8 \
529100 01 00 00 00 00 00 00 00 04 00 18 00 00 00 00 \
529200 00 00 10 00 00 00 03 00 00 00 00 00 00 00 00 \
5293"
5294ovs-appctl time/warp 8000
5295# Send a bundle close, it should keep the bundle alive.
5296ovs-appctl -t ovs-ofctl ofctl/send "05 21 00 10 00 00 00 03 00 00 00 01 00 02 00 03"
5297ovs-appctl time/warp 11000
5298# Make sure that timeouts are processed after the expiry
5299ovs-appctl time/warp 1000
5300# Send a Commit, but too late.
5301ovs-appctl -t ovs-ofctl ofctl/send "05 21 00 10 00 00 00 04 00 00 00 01 00 04 00 03"
5302ovs-appctl -t ovs-ofctl ofctl/barrier
5303OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
5304
5305AT_CHECK([ofctl_strip < monitor.log], [], [dnl
5306send: OFPT_BUNDLE_CONTROL (OF1.4):
5307 bundle_id=0x1 type=OPEN_REQUEST flags=atomic ordered
5308OFPT_BUNDLE_CONTROL (OF1.4):
5309 bundle_id=0x1 type=OPEN_REPLY flags=0
5310send: OFPT_BUNDLE_ADD_MESSAGE (OF1.4):
5311 bundle_id=0x1 flags=atomic ordered
5312OFPT_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
5313send: OFPT_BUNDLE_CONTROL (OF1.4):
5314 bundle_id=0x1 type=CLOSE_REQUEST flags=atomic ordered
5315OFPT_BUNDLE_CONTROL (OF1.4):
5316 bundle_id=0x1 type=CLOSE_REPLY flags=0
5317OFPT_ERROR (OF1.4): OFPBFC_TIMEOUT
5318OFPT_BUNDLE_CONTROL (OF1.4):
5319 bundle_id=0x1 type=OPEN_REQUEST flags=atomic ordered
5320send: OFPT_BUNDLE_CONTROL (OF1.4):
5321 bundle_id=0x1 type=COMMIT_REQUEST flags=atomic ordered
5322OFPT_ERROR (OF1.4): OFPBFC_BAD_ID
5323OFPT_BUNDLE_CONTROL (OF1.4):
5324 bundle_id=0x1 type=COMMIT_REQUEST flags=atomic ordered
5325OFPT_BARRIER_REPLY (OF1.4):
5326])
5327
5328OVS_VSWITCHD_STOP
5329AT_CLEANUP
06d4d4b6
JR
5330
5331
5332AT_SETUP([ofproto - bundle open (OpenFlow 1.3)])
5333AT_KEYWORDS([monitor])
5334OVS_VSWITCHD_START
5335
5336# Start a monitor, use the required protocol version
5337ovs-ofctl -O OpenFlow13 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1
5338AT_CAPTURE_FILE([monitor.log])
5339
5340# Send an OpenFlow13 message (04), OFPT_EXPERIMENTER (04), length (0018),
5341# xid (0000000a), ONF_EXPERIMENTER_ID (4F4E4600),
5342# ONFT_BUNDLE_CONTROL (2300 = 0x08FC), bundle id (00000001),
5343# message type (0000), and flags (0002)
5344ovs-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"
5345ovs-appctl -t ovs-ofctl ofctl/barrier
d9c8c57c 5346OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
06d4d4b6
JR
5347
5348AT_CHECK([ofctl_strip < monitor.log], [], [dnl
5349send: ONFT_BUNDLE_CONTROL (OF1.3):
5350 bundle_id=0x1 type=OPEN_REQUEST flags=ordered
5351ONFT_BUNDLE_CONTROL (OF1.3):
5352 bundle_id=0x1 type=OPEN_REPLY flags=0
5353OFPT_BARRIER_REPLY (OF1.3):
5354])
5355
5356OVS_VSWITCHD_STOP
5357AT_CLEANUP
5358
5359AT_SETUP([ofproto - bundle double open (OpenFlow 1.3)])
5360AT_KEYWORDS([monitor])
5361OVS_VSWITCHD_START
5362
5363# Start a monitor, use the required protocol version
5364ovs-ofctl -O OpenFlow13 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1
5365AT_CAPTURE_FILE([monitor.log])
5366
5367# Send twice an OpenFlow13 message (04), OFPT_EXPERIMENTER (04), length (0018),
5368# xid (0000000a), ONF_EXPERIMENTER_ID (4F4E4600),
5369# ONFT_BUNDLE_CONTROL (2300 = 0x08FC), bundle id (00000001),
5370# message type (0000), and flags (0002)
5371ovs-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"
5372ovs-appctl -t ovs-ofctl ofctl/barrier
5373ovs-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"
5374ovs-appctl -t ovs-ofctl ofctl/barrier
d9c8c57c 5375OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
06d4d4b6
JR
5376
5377AT_CHECK([ofctl_strip < monitor.log], [0], [dnl
5378send: ONFT_BUNDLE_CONTROL (OF1.3):
5379 bundle_id=0x1 type=OPEN_REQUEST flags=ordered
5380ONFT_BUNDLE_CONTROL (OF1.3):
5381 bundle_id=0x1 type=OPEN_REPLY flags=0
5382OFPT_BARRIER_REPLY (OF1.3):
5383send: ONFT_BUNDLE_CONTROL (OF1.3):
5384 bundle_id=0x1 type=OPEN_REQUEST flags=ordered
5385OFPT_ERROR (OF1.3): OFPBFC_BAD_ID
5386ONFT_BUNDLE_CONTROL (OF1.3):
5387 bundle_id=0x1 type=OPEN_REQUEST flags=ordered
5388OFPT_BARRIER_REPLY (OF1.3):
5389])
5390
5391OVS_VSWITCHD_STOP
5392AT_CLEANUP
5393
5394AT_SETUP([ofproto - bundle close without open (OpenFlow 1.3)])
5395AT_KEYWORDS([monitor])
5396OVS_VSWITCHD_START
5397
5398# Start a monitor, use the required protocol version
5399ovs-ofctl -O OpenFlow13 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1
5400AT_CAPTURE_FILE([monitor.log])
5401
5402ovs-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"
5403ovs-appctl -t ovs-ofctl ofctl/barrier
d9c8c57c 5404OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
06d4d4b6
JR
5405
5406AT_CHECK([ofctl_strip < monitor.log], [0], [dnl
5407send: ONFT_BUNDLE_CONTROL (OF1.3):
5408 bundle_id=0x1 type=CLOSE_REQUEST flags=ordered
5409OFPT_ERROR (OF1.3): OFPBFC_BAD_ID
5410ONFT_BUNDLE_CONTROL (OF1.3):
5411 bundle_id=0x1 type=CLOSE_REQUEST flags=ordered
5412OFPT_BARRIER_REPLY (OF1.3):
5413])
5414
5415OVS_VSWITCHD_STOP
5416AT_CLEANUP
5417
5418AT_SETUP([ofproto - bundle double close (OpenFlow 1.3)])
5419AT_KEYWORDS([monitor])
5420OVS_VSWITCHD_START
5421
5422# Start a monitor, use the required protocol version
5423ovs-ofctl -O OpenFlow13 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1
5424AT_CAPTURE_FILE([monitor.log])
5425
5426# Open, Close, Close
5427ovs-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"
5428ovs-appctl -t ovs-ofctl ofctl/barrier
5429ovs-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"
5430ovs-appctl -t ovs-ofctl ofctl/barrier
5431ovs-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"
5432ovs-appctl -t ovs-ofctl ofctl/barrier
d9c8c57c 5433OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
06d4d4b6
JR
5434
5435AT_CHECK([ofctl_strip < monitor.log], [0], [dnl
5436send: ONFT_BUNDLE_CONTROL (OF1.3):
5437 bundle_id=0x1 type=OPEN_REQUEST flags=ordered
5438ONFT_BUNDLE_CONTROL (OF1.3):
5439 bundle_id=0x1 type=OPEN_REPLY flags=0
5440OFPT_BARRIER_REPLY (OF1.3):
5441send: ONFT_BUNDLE_CONTROL (OF1.3):
5442 bundle_id=0x1 type=CLOSE_REQUEST flags=ordered
5443ONFT_BUNDLE_CONTROL (OF1.3):
5444 bundle_id=0x1 type=CLOSE_REPLY flags=0
5445OFPT_BARRIER_REPLY (OF1.3):
5446send: ONFT_BUNDLE_CONTROL (OF1.3):
5447 bundle_id=0x1 type=CLOSE_REQUEST flags=ordered
5448OFPT_ERROR (OF1.3): OFPBFC_BUNDLE_CLOSED
5449ONFT_BUNDLE_CONTROL (OF1.3):
5450 bundle_id=0x1 type=CLOSE_REQUEST flags=ordered
5451OFPT_BARRIER_REPLY (OF1.3):
5452])
5453
5454OVS_VSWITCHD_STOP
5455AT_CLEANUP
5456
5457AT_SETUP([ofproto - bundle close, different flags (OpenFlow 1.3)])
5458AT_KEYWORDS([monitor])
5459OVS_VSWITCHD_START
5460
5461# Start a monitor, use the required protocol version
5462ovs-ofctl -O OpenFlow13 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1
5463AT_CAPTURE_FILE([monitor.log])
5464
5465# Open, Close
5466ovs-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"
5467ovs-appctl -t ovs-ofctl ofctl/barrier
5468ovs-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"
5469ovs-appctl -t ovs-ofctl ofctl/barrier
d9c8c57c 5470OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
06d4d4b6
JR
5471
5472AT_CHECK([ofctl_strip < monitor.log], [0], [dnl
5473send: ONFT_BUNDLE_CONTROL (OF1.3):
5474 bundle_id=0x1 type=OPEN_REQUEST flags=ordered
5475ONFT_BUNDLE_CONTROL (OF1.3):
5476 bundle_id=0x1 type=OPEN_REPLY flags=0
5477OFPT_BARRIER_REPLY (OF1.3):
5478send: ONFT_BUNDLE_CONTROL (OF1.3):
5479 bundle_id=0x1 type=CLOSE_REQUEST flags=atomic
5480OFPT_ERROR (OF1.3): OFPBFC_BAD_FLAGS
5481ONFT_BUNDLE_CONTROL (OF1.3):
5482 bundle_id=0x1 type=CLOSE_REQUEST flags=atomic
5483OFPT_BARRIER_REPLY (OF1.3):
5484])
5485
5486OVS_VSWITCHD_STOP
5487AT_CLEANUP
5488
5489AT_SETUP([ofproto - bundle commit without open (OpenFlow 1.3)])
5490AT_KEYWORDS([monitor])
5491OVS_VSWITCHD_START
5492
5493# Start a monitor, use the required protocol version
5494ovs-ofctl -O OpenFlow13 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1
5495AT_CAPTURE_FILE([monitor.log])
5496
5497# Commit
5498ovs-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"
5499ovs-appctl -t ovs-ofctl ofctl/barrier
d9c8c57c 5500OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
06d4d4b6
JR
5501
5502AT_CHECK([ofctl_strip < monitor.log], [0], [dnl
5503send: ONFT_BUNDLE_CONTROL (OF1.3):
5504 bundle_id=0x1 type=COMMIT_REQUEST flags=ordered
5505OFPT_ERROR (OF1.3): OFPBFC_BAD_ID
5506ONFT_BUNDLE_CONTROL (OF1.3):
5507 bundle_id=0x1 type=COMMIT_REQUEST flags=ordered
5508OFPT_BARRIER_REPLY (OF1.3):
5509])
5510
5511OVS_VSWITCHD_STOP
5512AT_CLEANUP
5513
5514AT_SETUP([ofproto - bundle commit, different flags (OpenFlow 1.3)])
5515AT_KEYWORDS([monitor])
5516OVS_VSWITCHD_START
5517
5518# Start a monitor, use the required protocol version
5519ovs-ofctl -O OpenFlow13 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1
5520AT_CAPTURE_FILE([monitor.log])
5521
5522# Open, Commit
5523ovs-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"
5524ovs-appctl -t ovs-ofctl ofctl/barrier
5525ovs-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"
5526ovs-appctl -t ovs-ofctl ofctl/barrier
d9c8c57c 5527OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
06d4d4b6
JR
5528
5529AT_CHECK([ofctl_strip < monitor.log], [0], [dnl
5530send: ONFT_BUNDLE_CONTROL (OF1.3):
5531 bundle_id=0x1 type=OPEN_REQUEST flags=ordered
5532ONFT_BUNDLE_CONTROL (OF1.3):
5533 bundle_id=0x1 type=OPEN_REPLY flags=0
5534OFPT_BARRIER_REPLY (OF1.3):
5535send: ONFT_BUNDLE_CONTROL (OF1.3):
5536 bundle_id=0x1 type=COMMIT_REQUEST flags=atomic
5537OFPT_ERROR (OF1.3): OFPBFC_BAD_FLAGS
5538ONFT_BUNDLE_CONTROL (OF1.3):
5539 bundle_id=0x1 type=COMMIT_REQUEST flags=atomic
5540OFPT_BARRIER_REPLY (OF1.3):
5541])
5542
5543OVS_VSWITCHD_STOP
5544AT_CLEANUP
5545
5546AT_SETUP([ofproto - bundle discard without open (OpenFlow 1.3)])
5547AT_KEYWORDS([monitor])
5548OVS_VSWITCHD_START
5549
5550# Start a monitor, use the required protocol version
5551ovs-ofctl -O OpenFlow13 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1
5552AT_CAPTURE_FILE([monitor.log])
5553
5554# Discard
5555ovs-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"
5556ovs-appctl -t ovs-ofctl ofctl/barrier
d9c8c57c 5557OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
06d4d4b6
JR
5558
5559AT_CHECK([ofctl_strip < monitor.log], [0], [dnl
5560send: ONFT_BUNDLE_CONTROL (OF1.3):
5561 bundle_id=0x1 type=DISCARD_REQUEST flags=ordered
5562OFPT_ERROR (OF1.3): OFPBFC_BAD_ID
5563ONFT_BUNDLE_CONTROL (OF1.3):
5564 bundle_id=0x1 type=DISCARD_REQUEST flags=ordered
5565OFPT_BARRIER_REPLY (OF1.3):
5566])
5567
5568OVS_VSWITCHD_STOP
5569AT_CLEANUP
5570
5571
5572AT_SETUP([ofproto - bundle with multiple flow mods (OpenFlow 1.3)])
06d4d4b6
JR
5573OVS_VSWITCHD_START
5574
5575AT_CHECK([ovs-appctl vlog/set vconn:dbg])
5576
50f96b10 5577AT_CHECK([ovs-ofctl --no-names del-flows br0])
06d4d4b6
JR
5578
5579AT_DATA([flows.txt], [dnl
5580add idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=1
5581add idle_timeout=60 in_port=2 dl_src=00:77:88:99:aa:bb actions=2
5582add idle_timeout=70 in_port=2 dl_src=00:88:99:aa:bb:cc actions=3
5583add idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=4
5584delete
5585add idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=5
5586add idle_timeout=60 in_port=2 dl_src=00:77:88:99:aa:bb actions=6
5587add idle_timeout=70 in_port=2 dl_src=00:88:99:aa:bb:cc actions=7
5588delete in_port=2 dl_src=00:88:99:aa:bb:cc
5589])
5590
50f96b10 5591AT_CHECK([ovs-ofctl -O OpenFlow13 --no-names --bundle add-flows br0 flows.txt])
06d4d4b6
JR
5592
5593AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
5594 idle_timeout=50, in_port=2,dl_src=00:66:77:88:99:aa actions=output:5
5595 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:6
5596NXST_FLOW reply:
5597])
5598
5599AT_DATA([flows.txt], [dnl
5600modify actions=drop
5601modify_strict in_port=2 dl_src=00:77:88:99:aa:bb actions=7
5602])
5603
50f96b10 5604AT_CHECK([ovs-ofctl -O OpenFlow13 --no-names --bundle add-flows br0 flows.txt])
06d4d4b6
JR
5605
5606AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
5607 idle_timeout=50, in_port=2,dl_src=00:66:77:88:99:aa actions=drop
5608 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:7
5609NXST_FLOW reply:
5610])
5611
5612# Adding an existing flow acts as a modify, and delete_strict also works.
5613AT_DATA([flows.txt], [dnl
5614add idle_timeout=60 in_port=2 dl_src=00:77:88:99:aa:bb actions=8
5615delete_strict in_port=2 dl_src=00:66:77:88:99:aa
5616add in_port=2 dl_src=00:66:77:88:99:aa actions=drop
5617])
5618
50f96b10 5619AT_CHECK([ovs-ofctl -O OpenFlow13 --bundle --no-names add-flows br0 flows.txt])
06d4d4b6
JR
5620
5621AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
5622 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:8
5623 in_port=2,dl_src=00:66:77:88:99:aa actions=drop
5624NXST_FLOW reply:
5625])
5626
5627dnl Check logs for OpenFlow trace
5628# Prevent race.
5629OVS_WAIT_UNTIL([vconn_sub < ovs-vswitchd.log | test `grep -- "|vconn|DBG|unix: sent (Success): NXST_FLOW reply" | wc -l` -ge 3])
5630AT_CHECK([print_vconn_debug | vconn_sub | ofctl_strip], [0], [dnl
b79d45a1
BP
5631vconn|DBG|unix: sent (Success): OFPT_HELLO (OF1.6):
5632 version bitmap: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
06d4d4b6
JR
5633vconn|DBG|unix: received: OFPT_HELLO:
5634 version bitmap: 0x01
b79d45a1 5635vconn|DBG|unix: negotiated OpenFlow version 0x01 (we support version 0x07 and earlier, peer supports version 0x01)
06d4d4b6
JR
5636vconn|DBG|unix: received: OFPT_FLOW_MOD: DEL actions=drop
5637vconn|DBG|unix: received: OFPT_BARRIER_REQUEST:
5638vconn|DBG|unix: sent (Success): OFPT_BARRIER_REPLY:
b79d45a1
BP
5639vconn|DBG|unix: sent (Success): OFPT_HELLO (OF1.6):
5640 version bitmap: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
06d4d4b6
JR
5641vconn|DBG|unix: received: OFPT_HELLO (OF1.3):
5642 version bitmap: 0x04
b79d45a1 5643vconn|DBG|unix: negotiated OpenFlow version 0x04 (we support version 0x07 and earlier, peer supports version 0x04)
06d4d4b6
JR
5644vconn|DBG|unix: received: ONFT_BUNDLE_CONTROL (OF1.3):
5645 bundle_id=0 type=OPEN_REQUEST flags=atomic ordered
5646vconn|DBG|unix: sent (Success): ONFT_BUNDLE_CONTROL (OF1.3):
5647 bundle_id=0 type=OPEN_REPLY flags=0
5648vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3):
5649 bundle_id=0 flags=atomic ordered
5650OFPT_FLOW_MOD (OF1.3): ADD in_port=2,dl_src=00:66:77:88:99:aa idle:50 actions=output:1
5651vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3):
5652 bundle_id=0 flags=atomic ordered
5653OFPT_FLOW_MOD (OF1.3): ADD in_port=2,dl_src=00:77:88:99:aa:bb idle:60 actions=output:2
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:88:99:aa:bb:cc idle:70 actions=output:3
5657vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3):
5658 bundle_id=0 flags=atomic ordered
5659OFPT_FLOW_MOD (OF1.3): ADD in_port=2,dl_src=00:66:77:88:99:aa idle:50 actions=output:4
5660vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3):
5661 bundle_id=0 flags=atomic ordered
5662OFPT_FLOW_MOD (OF1.3): DEL table:255 actions=drop
5663vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3):
5664 bundle_id=0 flags=atomic ordered
5665OFPT_FLOW_MOD (OF1.3): ADD in_port=2,dl_src=00:66:77:88:99:aa idle:50 actions=output:5
5666vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3):
5667 bundle_id=0 flags=atomic ordered
5668OFPT_FLOW_MOD (OF1.3): ADD in_port=2,dl_src=00:77:88:99:aa:bb idle:60 actions=output:6
5669vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3):
5670 bundle_id=0 flags=atomic ordered
5671OFPT_FLOW_MOD (OF1.3): ADD in_port=2,dl_src=00:88:99:aa:bb:cc idle:70 actions=output:7
5672vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3):
5673 bundle_id=0 flags=atomic ordered
5674OFPT_FLOW_MOD (OF1.3): DEL table:255 in_port=2,dl_src=00:88:99:aa:bb:cc actions=drop
506c1ddb
JR
5675vconn|DBG|unix: received: OFPT_BARRIER_REQUEST (OF1.3):
5676vconn|DBG|unix: sent (Success): OFPT_BARRIER_REPLY (OF1.3):
06d4d4b6
JR
5677vconn|DBG|unix: received: ONFT_BUNDLE_CONTROL (OF1.3):
5678 bundle_id=0 type=COMMIT_REQUEST flags=atomic ordered
5679vconn|DBG|unix: sent (Success): ONFT_BUNDLE_CONTROL (OF1.3):
5680 bundle_id=0 type=COMMIT_REPLY flags=0
b79d45a1
BP
5681vconn|DBG|unix: sent (Success): OFPT_HELLO (OF1.6):
5682 version bitmap: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
06d4d4b6
JR
5683vconn|DBG|unix: received: OFPT_HELLO:
5684 version bitmap: 0x01
b79d45a1 5685vconn|DBG|unix: negotiated OpenFlow version 0x01 (we support version 0x07 and earlier, peer supports version 0x01)
06d4d4b6
JR
5686vconn|DBG|unix: received: NXT_SET_FLOW_FORMAT: format=nxm
5687vconn|DBG|unix: received: OFPT_BARRIER_REQUEST:
5688vconn|DBG|unix: sent (Success): OFPT_BARRIER_REPLY:
5689vconn|DBG|unix: received: NXST_FLOW request:
5690vconn|DBG|unix: sent (Success): NXST_FLOW reply:
5691 idle_timeout=50, in_port=2,dl_src=00:66:77:88:99:aa actions=output:5
5692 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:6
b79d45a1
BP
5693vconn|DBG|unix: sent (Success): OFPT_HELLO (OF1.6):
5694 version bitmap: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
06d4d4b6
JR
5695vconn|DBG|unix: received: OFPT_HELLO (OF1.3):
5696 version bitmap: 0x04
b79d45a1 5697vconn|DBG|unix: negotiated OpenFlow version 0x04 (we support version 0x07 and earlier, peer supports version 0x04)
06d4d4b6
JR
5698vconn|DBG|unix: received: ONFT_BUNDLE_CONTROL (OF1.3):
5699 bundle_id=0 type=OPEN_REQUEST flags=atomic ordered
5700vconn|DBG|unix: sent (Success): ONFT_BUNDLE_CONTROL (OF1.3):
5701 bundle_id=0 type=OPEN_REPLY flags=0
5702vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3):
5703 bundle_id=0 flags=atomic ordered
5704OFPT_FLOW_MOD (OF1.3): MOD actions=drop
5705vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3):
5706 bundle_id=0 flags=atomic ordered
5707OFPT_FLOW_MOD (OF1.3): MOD_STRICT in_port=2,dl_src=00:77:88:99:aa:bb actions=output:7
506c1ddb
JR
5708vconn|DBG|unix: received: OFPT_BARRIER_REQUEST (OF1.3):
5709vconn|DBG|unix: sent (Success): OFPT_BARRIER_REPLY (OF1.3):
06d4d4b6
JR
5710vconn|DBG|unix: received: ONFT_BUNDLE_CONTROL (OF1.3):
5711 bundle_id=0 type=COMMIT_REQUEST flags=atomic ordered
5712vconn|DBG|unix: sent (Success): ONFT_BUNDLE_CONTROL (OF1.3):
5713 bundle_id=0 type=COMMIT_REPLY flags=0
b79d45a1
BP
5714vconn|DBG|unix: sent (Success): OFPT_HELLO (OF1.6):
5715 version bitmap: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
06d4d4b6
JR
5716vconn|DBG|unix: received: OFPT_HELLO:
5717 version bitmap: 0x01
b79d45a1 5718vconn|DBG|unix: negotiated OpenFlow version 0x01 (we support version 0x07 and earlier, peer supports version 0x01)
06d4d4b6
JR
5719vconn|DBG|unix: received: NXT_SET_FLOW_FORMAT: format=nxm
5720vconn|DBG|unix: received: OFPT_BARRIER_REQUEST:
5721vconn|DBG|unix: sent (Success): OFPT_BARRIER_REPLY:
5722vconn|DBG|unix: received: NXST_FLOW request:
5723vconn|DBG|unix: sent (Success): NXST_FLOW reply:
5724 idle_timeout=50, in_port=2,dl_src=00:66:77:88:99:aa actions=drop
5725 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:7
b79d45a1
BP
5726vconn|DBG|unix: sent (Success): OFPT_HELLO (OF1.6):
5727 version bitmap: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
06d4d4b6
JR
5728vconn|DBG|unix: received: OFPT_HELLO (OF1.3):
5729 version bitmap: 0x04
b79d45a1 5730vconn|DBG|unix: negotiated OpenFlow version 0x04 (we support version 0x07 and earlier, peer supports version 0x04)
06d4d4b6
JR
5731vconn|DBG|unix: received: ONFT_BUNDLE_CONTROL (OF1.3):
5732 bundle_id=0 type=OPEN_REQUEST flags=atomic ordered
5733vconn|DBG|unix: sent (Success): ONFT_BUNDLE_CONTROL (OF1.3):
5734 bundle_id=0 type=OPEN_REPLY flags=0
5735vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3):
5736 bundle_id=0 flags=atomic ordered
5737OFPT_FLOW_MOD (OF1.3): ADD in_port=2,dl_src=00:77:88:99:aa:bb idle:60 actions=output:8
5738vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3):
5739 bundle_id=0 flags=atomic ordered
5740OFPT_FLOW_MOD (OF1.3): DEL_STRICT table:255 in_port=2,dl_src=00:66:77:88:99:aa actions=drop
5741vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3):
5742 bundle_id=0 flags=atomic ordered
5743OFPT_FLOW_MOD (OF1.3): ADD in_port=2,dl_src=00:66:77:88:99:aa actions=drop
506c1ddb
JR
5744vconn|DBG|unix: received: OFPT_BARRIER_REQUEST (OF1.3):
5745vconn|DBG|unix: sent (Success): OFPT_BARRIER_REPLY (OF1.3):
06d4d4b6
JR
5746vconn|DBG|unix: received: ONFT_BUNDLE_CONTROL (OF1.3):
5747 bundle_id=0 type=COMMIT_REQUEST flags=atomic ordered
5748vconn|DBG|unix: sent (Success): ONFT_BUNDLE_CONTROL (OF1.3):
5749 bundle_id=0 type=COMMIT_REPLY flags=0
b79d45a1
BP
5750vconn|DBG|unix: sent (Success): OFPT_HELLO (OF1.6):
5751 version bitmap: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
06d4d4b6
JR
5752vconn|DBG|unix: received: OFPT_HELLO:
5753 version bitmap: 0x01
b79d45a1 5754vconn|DBG|unix: negotiated OpenFlow version 0x01 (we support version 0x07 and earlier, peer supports version 0x01)
06d4d4b6
JR
5755vconn|DBG|unix: received: NXT_SET_FLOW_FORMAT: format=nxm
5756vconn|DBG|unix: received: OFPT_BARRIER_REQUEST:
5757vconn|DBG|unix: sent (Success): OFPT_BARRIER_REPLY:
5758vconn|DBG|unix: received: NXST_FLOW request:
5759vconn|DBG|unix: sent (Success): NXST_FLOW reply:
5760 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:8
5761 in_port=2,dl_src=00:66:77:88:99:aa actions=drop
5762])
5763
5764OVS_VSWITCHD_STOP
5765AT_CLEANUP
5766
5767
506c1ddb 5768AT_SETUP([ofproto - failing bundle add message (OpenFlow 1.3)])
06d4d4b6
JR
5769OVS_VSWITCHD_START
5770
5771AT_CHECK([ovs-ofctl del-flows br0])
5772
5773ovs-ofctl add-flows br0 - <<EOF
5774idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=11
5775idle_timeout=60 in_port=2 dl_src=00:77:88:99:aa:bb actions=22
5776idle_timeout=70 in_port=2 dl_src=00:88:99:aa:bb:cc actions=33
5777EOF
5778AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
5779 idle_timeout=50, in_port=2,dl_src=00:66:77:88:99:aa actions=output:11
5780 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:22
5781 idle_timeout=70, in_port=2,dl_src=00:88:99:aa:bb:cc actions=output:33
5782NXST_FLOW reply:
5783])
5784
5785# last line uses illegal table number (OVS internal table)
5786AT_DATA([flows.txt], [dnl
5787add idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=1
5788add idle_timeout=60 in_port=2 dl_src=00:77:88:99:aa:bb actions=2
5789add idle_timeout=70 in_port=2 dl_src=00:88:99:aa:bb:cc actions=3
5790modify idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=4
5791delete
5792add idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=5
5793add idle_timeout=60 in_port=2 dl_src=00:77:88:99:aa:bb actions=6
5794add idle_timeout=70 in_port=2 dl_src=00:88:99:aa:bb:cc actions=7
5795delete in_port=2 dl_src=00:88:99:aa:bb:cc
5796add table=254 actions=drop
5797])
5798
50f96b10 5799AT_CHECK([ovs-ofctl -O OpenFlow13 --bundle add-flows br0 flows.txt 2>&1 | sed '/talking to/,$d' | strip_xids],
06d4d4b6 5800[0], [dnl
50f96b10 5801Error OFPBRC_EPERM for: OFPT_FLOW_MOD (OF1.3): ADD table:254 actions=drop
06d4d4b6
JR
5802])
5803
5804AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
5805 idle_timeout=50, in_port=2,dl_src=00:66:77:88:99:aa actions=output:11
5806 idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:22
5807 idle_timeout=70, in_port=2,dl_src=00:88:99:aa:bb:cc actions=output:33
5808NXST_FLOW reply:
5809])
5810
5811OVS_VSWITCHD_STOP
5812AT_CLEANUP
25070e04
JR
5813
5814
5815AT_SETUP([ofproto - failing bundle commit (OpenFlow 1.3)])
25070e04
JR
5816OVS_VSWITCHD_START
5817
5818AT_CHECK([ovs-ofctl del-flows br0])
5819
5820# Invalid group numbers are detected at commit time
5821AT_DATA([flows.txt], [dnl
5822add idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=group:1
5823add idle_timeout=60 in_port=2 dl_src=00:77:88:99:aa:bb actions=group:2
5824add idle_timeout=70 in_port=2 dl_src=00:88:99:aa:bb:cc actions=group:3
5825])
5826
50f96b10 5827AT_CHECK([ovs-ofctl -O OpenFlow13 --bundle add-flows br0 flows.txt 2>&1 | sed '/talking to/,$d' | strip_xids],
25070e04 5828[0], [dnl
50f96b10
BP
5829Error 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
5830Error OFPBFC_MSG_FAILED for: ONFT_BUNDLE_CONTROL (OF1.3):
25070e04
JR
5831 bundle_id=0 type=COMMIT_REQUEST flags=atomic ordered
5832])
5833
5834AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
5835NXST_FLOW reply:
5836])
5837
5838OVS_VSWITCHD_STOP
5839AT_CLEANUP
140f36ba
DDP
5840
5841AT_SETUP([ofproto - monitor flows with tun_md])
5842OVS_VSWITCHD_START
5843
5844AT_CHECK([ovs-ofctl add-tlv-map br0 "{class=0xffff,type=0,len=4}->tun_metadata0"])
5845AT_CHECK([ovs-ofctl add-flow br0 tun_metadata0=0x1,actions=drop])
5846
5847AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0], [dnl
5848NXST_FLOW reply:
5849 tun_metadata0=0x1 actions=drop
5850])
5851
5852AT_CAPTURE_FILE([ofctl_monitor.log])
5853dnl Usually ovs-ofctl monitor outputs on stderr, but the first message here
5854dnl is put on stdout, because it is handled by ofctl in dump_transaction()
5855dnl and not in monitor_vconn().
5856AT_CHECK([ovs-ofctl monitor br0 65534 watch: --detach --no-chdir --pidfile >ofctl_monitor.log 2>&1])
5857
5858OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 2])
5859
5860AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
5861NXST_FLOW_MONITOR reply:
5862 event=ADDED table=0 cookie=0 tun_metadata0=0x1
5863])
5864
5865AT_CHECK([ovs-ofctl del-flows br0])
5866
5867OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 4])
5868
5869AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
5870NXST_FLOW_MONITOR reply:
5871 event=ADDED table=0 cookie=0 tun_metadata0=0x1
5872NXST_FLOW_MONITOR reply:
5873 event=DELETED reason=delete table=0 cookie=0 tun_metadata0=0x1
5874])
5875
5876OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
5877
5878dnl Check that vswitchd hasn't crashed
5879AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0], [dnl
5880NXST_FLOW reply:
5881])
5882
5883OVS_VSWITCHD_STOP
5884AT_CLEANUP
04f48a68
YHW
5885
5886AT_SETUP([ofproto - flow mod with tunnel metadata])
5887AT_KEYWORDS([ofp-actions])
5888OVS_VSWITCHD_START
5889
5890AT_CHECK([ovs-ofctl add-tlv-map br0 "{class=0xffff,type=0,len=4}->tun_metadata0"])
5891AT_CHECK([ovs-ofctl add-flow br0 "in_port=1 actions=move:tun_metadata0[[0..31]]->NXM_NX_REG0[[]]"])
5892
5893dnl Check the length of tun_metadata0 in the replied OXM header.
5894dnl Ignore the first 0x50 bytes of hex dump from the reply msg since the NXM
5895dnl header that describes the tunnel metadata starts at offset 0x50.
5896AT_CHECK([ovs-ofctl dump-flows br0 -mmmm], [0], [stdout])
50f96b10
BP
5897AT_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
5898NXST_FLOW reply:
04f48a68
YHW
5899 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[[]]
590000000050 ff ff 00 18 00 00 23 20-00 06 00 20 00 00 00 00 |......# ... ....|
590100000060 00 01 50 04 00 01 00 04- |..P..... |
5902])
5903
5904dnl Check actions that may use tun_metadata
5905AT_CHECK([ovs-ofctl add-flow br0 "in_port=2 actions=move:tun_metadata1[[0..31]]->NXM_NX_REG0[[]]"], [1], [], [stderr])
5906AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
5907OFPT_ERROR: NXFMFC_INVALID_TLV_FIELD
5908])
5909
5910AT_CHECK([ovs-ofctl add-flow br0 "in_port=2 actions=move:tun_metadata0[[32..63]]->NXM_NX_REG0[[]]"], [1], [], [stderr])
5911AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
5912OFPT_ERROR: OFPBAC_BAD_SET_LEN
5913])
5914
5915AT_CHECK([ovs-ofctl add-flow br0 "in_port=2 actions=push:tun_metadata1[[0..31]]"], [1], [], [stderr])
5916AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
5917OFPT_ERROR: NXFMFC_INVALID_TLV_FIELD
5918])
5919
5920AT_CHECK([ovs-ofctl add-flow br0 "in_port=2 actions=pop:tun_metadata0[[32..63]]"], [1], [], [stderr])
5921AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
5922OFPT_ERROR: OFPBAC_BAD_SET_LEN
5923])
5924
5925AT_CHECK([ovs-ofctl add-flow br0 "in_port=3, actions=load:0x11223344->tun_metadata1"], [1], [], [stderr])
5926AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
5927OFPT_ERROR: NXFMFC_INVALID_TLV_FIELD
5928])
5929
5930AT_CHECK([ovs-ofctl add-flow br0 "in_port=2 actions=output:tun_metadata1[[0..31]]"], [1], [], [stderr])
5931AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
5932OFPT_ERROR: NXFMFC_INVALID_TLV_FIELD
5933])
5934
5935AT_CHECK([ovs-ofctl add-flow br0 "in_port=2 actions=output:tun_metadata0[[32..63]]"], [1], [], [stderr])
5936AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
5937OFPT_ERROR: OFPBAC_BAD_SET_LEN
5938])
5939
5940AT_CHECK([ovs-ofctl add-flow br0 "in_port=2 actions=multipath(eth_src,50,modulo_n,1,0,tun_metadata1[[0..31]])"], [1], [], [stderr])
5941AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
5942OFPT_ERROR: NXFMFC_INVALID_TLV_FIELD
5943])
5944
5945AT_CHECK([ovs-ofctl add-flow br0 "in_port=2 actions=multipath(eth_src,50,modulo_n,1,0,tun_metadata0[[32..63]])"], [1], [], [stderr])
5946AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
5947OFPT_ERROR: OFPBAC_BAD_SET_LEN
5948])
5949
5950AT_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])
5951AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
5952OFPT_ERROR: NXFMFC_INVALID_TLV_FIELD
5953])
5954
5955AT_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])
5956AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
5957OFPT_ERROR: OFPBAC_BAD_SET_LEN
5958])
5959
5960AT_CHECK([ovs-ofctl add-flow br0 "in_port=2 actions=learn(tun_metadata1[[0..31]]=reg0[[0..31]])"], [1], [], [stderr])
5961AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
5962OFPT_ERROR: NXFMFC_INVALID_TLV_FIELD
5963])
5964
5965AT_CHECK([ovs-ofctl add-flow br0 "in_port=2 actions=learn(tun_metadata0[[32..63]]=reg0[[0..31]])"], [1], [], [stderr])
5966AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
5967OFPT_ERROR: OFPBAC_BAD_SET_LEN
5968])
5969
5970AT_CHECK([ovs-ofctl add-flow br0 "in_port=2 actions=clone(move:tun_metadata1[[0..31]]->reg0[[0..31]])"], [1], [], [stderr])
5971AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
5972OFPT_ERROR: NXFMFC_INVALID_TLV_FIELD
5973])
5974
5975AT_CHECK([ovs-ofctl add-flow br0 "in_port=2 actions=clone(move:tun_metadata0[[32..63]]->reg0[[0..31]])"], [1], [], [stderr])
5976AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
5977OFPT_ERROR: OFPBAC_BAD_SET_LEN
5978])
5979
5980AT_CHECK([ovs-ofctl add-flow br0 "ip actions=ct(commit,zone=tun_metadata1[[0..15]],exec(set_field:0x01->ct_mark))"], [1], [], [stderr])
5981AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
5982OFPT_ERROR: NXFMFC_INVALID_TLV_FIELD
5983])
5984
5985AT_CHECK([ovs-ofctl add-flow br0 "ip actions=ct(commit,zone=tun_metadata0[[32..47]],exec(set_field:0x01->ct_mark))"], [1], [], [stderr])
5986AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
5987OFPT_ERROR: OFPBAC_BAD_SET_LEN
5988])
5989
5990AT_CHECK([ovs-ofctl add-flow br0 "ip actions=ct(commit,zone=1,exec(move:tun_metadata1[[0..31]]->ct_mark))"], [1], [], [stderr])
5991AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
5992OFPT_ERROR: NXFMFC_INVALID_TLV_FIELD
5993])
5994
5995AT_CHECK([ovs-ofctl add-flow br0 "ip actions=ct(commit,zone=1,exec(move:tun_metadata0[[32..63]]->ct_mark))"], [1], [], [stderr])
5996AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
5997OFPT_ERROR: OFPBAC_BAD_SET_LEN
5998])
5999
3cddeff0
YHW
6000dnl Check match field with tun_metadata
6001AT_CHECK([ovs-ofctl add-flow br0 "tun_metadata0=0x11223344 actions=output:2"], [0], [], [stderr])
6002AT_CHECK([ovs-ofctl add-flow br0 "tun_metadata1=0x11223344 actions=output:2"], [1], [], [stderr])
6003AT_CHECK([strip_xids < stderr | sed '/FLOW_MOD/,$d'], [0], [dnl
6004OFPT_ERROR: NXFMFC_INVALID_TLV_FIELD
6005])
6006
6007AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0], [dnl)
6008NXST_FLOW reply:
6009 in_port=1 actions=move:NXM_NX_TUN_METADATA0[[0..31]]->NXM_NX_REG0[[]]
6010 tun_metadata0=0x11223344 actions=output:2
04f48a68
YHW
6011])
6012
6013OVS_VSWITCHD_STOP(["/NXFMFC_INVALID_TLV_FIELD/d
6014/tun_metadata0/d
6015/OFPBAC_BAD_SET_LEN/d"])
6016AT_CLEANUP