ofproto-dpif.at: Avoid races in "ofproto-dpif - dummy interface"
[sliver-openvswitch.git] / tests / ofproto-dpif.at
1 AT_BANNER([ofproto-dpif])
2
3 # Strips out uninteresting parts of flow output, as well as parts
4 # that vary from one run to another (e.g., timing and bond actions).
5 m4_define([STRIP_USED], [[sed '
6     s/used:[0-9]*\.[0-9]*/used:0.0/
7 ' | sort]])
8 m4_define([STRIP_XOUT], [[sed '
9     s/used:[0-9]*\.[0-9]*/used:0.0/
10     s/actions:.*/actions: <del>/
11     s/packets:[0-9]*/packets:0/
12     s/bytes:[0-9]*/bytes:0/
13 ' | sort]])
14
15 AT_SETUP([ofproto-dpif - dummy interface])
16 # Create br0 with interfaces p1 and p7
17 #    and br1 with interfaces p2 and p8
18 # with p1 and p2 connected via unix domain socket
19 OVS_VSWITCHD_START(
20   [add-port br0 p1 -- set interface p1 type=dummy options:pstream=punix:$OVS_RUNDIR/p0.sock ofport_request=1 -- \
21    add-port br0 p7 -- set interface p7 ofport_request=7 type=dummy -- \
22    add-br br1 -- \
23    set bridge br1 other-config:hwaddr=aa:66:aa:66:00:00 -- \
24    set bridge br1 datapath-type=dummy other-config:datapath-id=1234 \
25                   fail-mode=secure -- \
26    add-port br1 p2 -- set interface p2 type=dummy options:stream=unix:$OVS_RUNDIR/p0.sock ofport_request=2 -- \
27    add-port br1 p8 -- set interface p8 ofport_request=8 type=dummy --])
28
29 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
30 AT_CHECK([ovs-ofctl add-flow br1 action=normal])
31 ovs-appctl time/stop
32 ovs-appctl time/warp 5000
33 AT_CHECK([ovs-appctl netdev-dummy/receive p7 'in_port(7),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
34 AT_CHECK([ovs-appctl netdev-dummy/receive p8 'in_port(8),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.3,dst=10.0.0.4,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
35 ovs-appctl time/warp 100
36 sleep 1  # wait for forwarders process packets
37
38 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
39 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.3/0.0.0.0,dst=10.0.0.4/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
40 skb_priority(0),in_port(7),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
41 ])
42
43 AT_CHECK([ovs-appctl dpif/dump-flows br1 | STRIP_XOUT], [0], [dnl
44 skb_priority(0),in_port(2),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
45 skb_priority(0),in_port(8),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.3/0.0.0.0,dst=10.0.0.4/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
46 ])
47 OVS_VSWITCHD_STOP
48 AT_CLEANUP
49
50 AT_SETUP([ofproto-dpif - resubmit])
51 OVS_VSWITCHD_START
52 ADD_OF_PORTS([br0], [1], [10], [11], [12], [13], [14], [15],
53                     [16], [17], [18], [19], [20], [21])
54 AT_DATA([flows.txt], [dnl
55 table=0 in_port=1 priority=1000 icmp actions=output(10),resubmit(2),output(19),resubmit(3),output(21)
56 table=0 in_port=2 priority=1500 icmp actions=output(11),resubmit(,1),output(16),resubmit(2,1),output(18)
57 table=0 in_port=3 priority=2000 icmp actions=output(20)
58 table=1 in_port=1 priority=1000 icmp actions=output(12),resubmit(4,1),output(13),resubmit(3),output(15)
59 table=1 in_port=2 priority=1500 icmp actions=output(17),resubmit(,2)
60 table=1 in_port=3 priority=1500 icmp actions=output(14),resubmit(,2)
61 ])
62 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
63 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
64 AT_CHECK([tail -1 stdout], [0],
65   [Datapath actions: 10,11,12,13,14,15,16,17,18,19,20,21
66 ])
67 OVS_VSWITCHD_STOP
68 AT_CLEANUP
69
70 AT_SETUP([ofproto-dpif - goto table])
71 OVS_VSWITCHD_START
72 ADD_OF_PORTS([br0], [1], [10], [11])
73 echo "table=0 in_port=1 actions=output(10),goto_table(1)" > flows.txt
74 for i in `seq 1 63`; do echo "table=$i actions=goto_table($(($i+1)))"; done >> flows.txt
75 echo "table=64 actions=output(11)" >> flows.txt
76 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flows br0 flows.txt])
77 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
78 AT_CHECK([tail -1 stdout], [0],
79   [Datapath actions: 10,11
80 ])
81 OVS_VSWITCHD_STOP
82 AT_CLEANUP
83
84 AT_SETUP([ofproto-dpif - write actions])
85 OVS_VSWITCHD_START
86 ADD_OF_PORTS([br0], [1], [10], [11], [12], [13])
87 AT_DATA([flows.txt], [dnl
88 table=0 in_port=1,ip actions=output(10),write_actions(set_field:192.168.3.90->ip_src,output(12)),goto_table(1)
89 table=1 ip actions=write_actions(output(13)),goto_table(2)
90 table=2 ip actions=set_field:192.168.3.91->ip_src,output(11)
91 ])
92 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flows br0 flows.txt])
93 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
94 AT_CHECK([tail -1 stdout], [0],
95   [Datapath actions: 10,set(ipv4(src=192.168.3.91,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no)),11,set(ipv4(src=192.168.3.90,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no)),13
96 ])
97 OVS_VSWITCHD_STOP
98 AT_CLEANUP
99
100 AT_SETUP([ofproto-dpif - clear actions])
101 OVS_VSWITCHD_START
102 ADD_OF_PORTS([br0], [1], [10], [11], [12])
103 AT_DATA([flows.txt], [dnl
104 table=0 in_port=1,ip actions=output(10),write_actions(set_field:192.168.3.90->ip_src,output(12)),goto_table(1)
105 table=1 ip actions=set_field:192.168.3.91->ip_src,output(11),clear_actions
106 ])
107 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flows br0 flows.txt])
108 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
109 AT_CHECK([tail -1 stdout], [0],
110   [Datapath actions: 10,set(ipv4(src=192.168.3.91,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no)),11
111 ])
112 OVS_VSWITCHD_STOP
113 AT_CLEANUP
114
115 AT_SETUP([ofproto-dpif - all group in action list])
116 OVS_VSWITCHD_START
117 ADD_OF_PORTS([br0], [1], [10], [11])
118 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=all,bucket=output:10,set_field:192.168.3.90->ip_src,bucket=output:11'])
119 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=group:1234'])
120 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
121 AT_CHECK([tail -1 stdout], [0],
122   [Datapath actions: set(ipv4(src=192.168.3.90,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no)),10,set(ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no)),11
123 ])
124 OVS_VSWITCHD_STOP
125 AT_CLEANUP
126
127 AT_SETUP([ofproto-dpif - indirect group in action list])
128 OVS_VSWITCHD_START
129 ADD_OF_PORTS([br0], [1], [10])
130 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 group_id=1234,type=indirect,bucket=output:10])
131 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=group:1234'])
132 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
133 AT_CHECK([tail -1 stdout], [0],
134   [Datapath actions: 10
135 ])
136 OVS_VSWITCHD_STOP
137 AT_CLEANUP
138
139 AT_SETUP([ofproto-dpif - all group in action set])
140 OVS_VSWITCHD_START
141 ADD_OF_PORTS([br0], [1], [10], [11])
142 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=all,bucket=output:10,set_field:192.168.3.90->ip_src,bucket=output:11'])
143 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
144 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
145 AT_CHECK([tail -1 stdout], [0],
146   [Datapath actions: set(ipv4(src=192.168.3.90,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no)),10,set(ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no)),11
147 ])
148 OVS_VSWITCHD_STOP
149 AT_CLEANUP
150
151 AT_SETUP([ofproto-dpif - indirect group in action set])
152 OVS_VSWITCHD_START
153 ADD_OF_PORTS([br0], [1], [10])
154 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 group_id=1234,type=indirect,bucket=output:10])
155 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
156 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
157 AT_CHECK([tail -1 stdout], [0],
158   [Datapath actions: 10
159 ])
160 OVS_VSWITCHD_STOP
161 AT_CLEANUP
162
163 AT_SETUP([ofproto-dpif - select group])
164 OVS_VSWITCHD_START
165 ADD_OF_PORTS([br0], [1], [10], [11])
166 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=select,bucket=output:10,bucket=output:11'])
167 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
168
169 # Try a bunch of different flows and make sure that they get distributed
170 # at least somewhat.
171 for d in 0 1 2 3 4 5 6 7 8 9 a b c d e f; do
172     AT_CHECK([ovs-appctl ofproto/trace br0 "in_port=1,dl_src=50:54:00:00:00:07,dl_dst=50:54:00:00:00:0$d,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0"], [0], [stdout])
173     tail -1 stdout >> results
174 done
175 sort results | uniq -c
176 AT_CHECK([sort results | uniq], [0],
177   [Datapath actions: 10
178 Datapath actions: 11
179 ])
180 OVS_VSWITCHD_STOP
181 AT_CLEANUP
182
183 AT_SETUP([ofproto-dpif - select group with watch port])
184 OVS_VSWITCHD_START
185 ADD_OF_PORTS([br0], [1], [10], [11])
186 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=select,bucket=watch_port:10,output:10,bucket=output:11'])
187 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
188 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:07,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
189 AT_CHECK([tail -1 stdout], [0],
190   [Datapath actions: 11
191 ])
192 OVS_VSWITCHD_STOP
193 AT_CLEANUP
194
195 AT_SETUP([ofproto-dpif - select group with weight])
196 OVS_VSWITCHD_START
197 ADD_OF_PORTS([br0], [1], [10], [11], [12])
198 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=select,bucket=output:10,bucket=output:11,weight=2000,bucket=output:12,weight=0'])
199 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
200 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:07,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
201 AT_CHECK([tail -1 stdout], [0],
202   [Datapath actions: 11
203 ])
204 OVS_VSWITCHD_STOP
205 AT_CLEANUP
206
207 AT_SETUP([ofproto-dpif - fast failover group])
208 OVS_VSWITCHD_START
209 ADD_OF_PORTS([br0], [1], [10], [11])
210 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=ff,bucket=watch_port:10,output:10,bucket=watch_port:11,output:11'])
211 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
212 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
213 AT_CHECK([tail -1 stdout], [0],
214   [Datapath actions: drop
215 ])
216 OVS_VSWITCHD_STOP
217 AT_CLEANUP
218
219 AT_SETUP([ofproto-dpif - registers])
220 OVS_VSWITCHD_START
221 ADD_OF_PORTS([br0], [20], [21], [22], [33], [90])
222 AT_DATA([flows.txt], [dnl
223 in_port=90                 actions=resubmit:2,resubmit:3,resubmit:4,resubmit:91
224 in_port=91                 actions=resubmit:5,resubmit:6,resubmit:7,resubmit:92
225 in_port=92                 actions=resubmit:8,resubmit:9,resubmit:10,resubmit:11,resubmit:93
226 in_port=93                 actions=resubmit:12,resubmit:13,resubmit:14,resubmit:15
227
228 in_port=2                  actions=load:0x000db000->NXM_NX_REG0[[]]
229 in_port=3                  actions=load:0xdea->NXM_NX_REG0[[20..31]]
230 in_port=4                  actions=load:0xeef->NXM_NX_REG0[[0..11]]
231 in_port=5                  actions=move:NXM_NX_REG0[[]]->NXM_NX_REG1[[]]
232 in_port=6                  actions=load:0x22222222->NXM_NX_REG2[[]]
233 in_port=7                  actions=move:NXM_NX_REG1[[20..31]]->NXM_NX_REG2[[0..11]]
234 in_port=8                  actions=move:NXM_NX_REG1[[0..11]]->NXM_NX_REG2[[20..31]]
235 in_port=9,reg0=0xdeadbeef  actions=output:20
236 in_port=10,reg1=0xdeadbeef actions=output:21
237 in_port=11,reg2=0xeef22dea actions=output:22
238
239 dnl Sanilty check all registers
240 in_port=12 actions=load:0x10->NXM_NX_REG0[[]],load:0x11->NXM_NX_REG1[[]],load:0x12->NXM_NX_REG2[[]]
241 in_port=13 actions=load:0x13->NXM_NX_REG3[[]],load:0x14->NXM_NX_REG4[[]],load:0x15->NXM_NX_REG5[[]]
242 in_port=14 actions=load:0x16->NXM_NX_REG6[[]],load:0x17->NXM_NX_REG7[[]]
243 in_port=15,reg0=0x10,reg1=0x11,reg2=0x12,reg3=0x13,reg4=0x14,reg5=0x15,reg6=0x16,reg7=0x17 actions=output:33
244
245 ])
246 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
247 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(90),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
248 AT_CHECK([tail -1 stdout], [0],
249   [Datapath actions: 20,21,22,33
250 ])
251 OVS_VSWITCHD_STOP
252 AT_CLEANUP
253
254 AT_SETUP([ofproto-dpif - push-pop])
255 OVS_VSWITCHD_START
256 ADD_OF_PORTS([br0], [20], [21], [22], [33], [90])
257 AT_DATA([flows.txt], [dnl
258 in_port=90           actions=load:20->NXM_NX_REG0[[0..7]],load:21->NXM_NX_REG1[[0..7]],load:22->NXM_NX_REG2[[0..7]], load:33->NXM_NX_REG3[[0..7]], push:NXM_NX_REG0[[]], push:NXM_NX_REG1[[0..7]],push:NXM_NX_REG2[[0..15]], push:NXM_NX_REG3[[]], resubmit:2, resubmit:3, resubmit:4, resubmit:5
259 in_port=2            actions=pop:NXM_NX_REG0[[0..7]],output:NXM_NX_REG0[[]]
260 in_port=3            actions=pop:NXM_NX_REG1[[0..7]],output:NXM_NX_REG1[[]]
261 in_port=4            actions=pop:NXM_NX_REG2[[0..15]],output:NXM_NX_REG2[[]]
262 in_port=5            actions=pop:NXM_NX_REG3[[]],output:NXM_NX_REG3[[]]
263
264 ])
265 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
266 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(90),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
267 AT_CHECK([tail -1 stdout], [0],
268   [Datapath actions: 33,22,21,20
269 ])
270 OVS_VSWITCHD_STOP
271 AT_CLEANUP
272
273 AT_SETUP([ofproto-dpif - output])
274 OVS_VSWITCHD_START
275 ADD_OF_PORTS([br0], [1], [9], [10], [11], [55], [66], [77], [88])
276 AT_DATA([flows.txt], [dnl
277 in_port=1 actions=resubmit:2,resubmit:3,resubmit:4,resubmit:5,resubmit:6,resubmit:7,resubmit:8
278 in_port=2 actions=output:9
279 in_port=3 actions=load:55->NXM_NX_REG0[[]],output:NXM_NX_REG0[[]],load:66->NXM_NX_REG1[[]]
280 in_port=4 actions=output:10,output:NXM_NX_REG0[[]],output:NXM_NX_REG1[[]],output:11
281 in_port=5 actions=load:77->NXM_NX_REG0[[0..15]],load:88->NXM_NX_REG0[[16..31]]
282 in_port=6 actions=output:NXM_NX_REG0[[0..15]],output:NXM_NX_REG0[[16..31]]
283 in_port=7 actions=load:0x110000ff->NXM_NX_REG0[[]],output:NXM_NX_REG0[[]]
284 in_port=8 actions=1,9,load:9->NXM_OF_IN_PORT[[]],1,9
285 ])
286 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
287 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
288 AT_CHECK([tail -1 stdout], [0],
289   [Datapath actions: 9,55,10,55,66,11,77,88,9,1
290 ])
291 OVS_VSWITCHD_STOP
292 AT_CLEANUP
293
294 AT_SETUP([ofproto-dpif - dec_ttl])
295 OVS_VSWITCHD_START
296 ADD_OF_PORTS([br0], [1], [2], [3], [4])
297 AT_DATA([flows.txt], [dnl
298 table=0 in_port=1 action=dec_ttl,output:2,resubmit(1,1),output:4
299 table=1 in_port=1 action=dec_ttl,output:3
300 ])
301 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
302 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=111,tos=0,ttl=2,frag=no)' -generate], [0], [stdout])
303 AT_CHECK([tail -3 stdout], [0],
304   [Datapath actions: set(ipv4(src=192.168.0.1,dst=192.168.0.2,proto=111,tos=0,ttl=1,frag=no)),2,4
305 This flow is handled by the userspace slow path because it:
306         - Sends "packet-in" messages to the OpenFlow controller.
307 ])
308 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=111,tos=0,ttl=3,frag=no)'], [0], [stdout])
309 AT_CHECK([tail -1 stdout], [0],
310   [Datapath actions: set(ipv4(src=192.168.0.1,dst=192.168.0.2,proto=111,tos=0,ttl=2,frag=no)),2,set(ipv4(src=192.168.0.1,dst=192.168.0.2,proto=111,tos=0,ttl=1,frag=no)),3,4
311 ])
312 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x86dd),ipv6(src=::1,dst=::2,label=0,proto=10,tclass=0x70,hlimit=128,frag=no)'], [0], [stdout])
313 AT_CHECK([tail -1 stdout], [0],
314   [Datapath actions: set(ipv6(src=::1,dst=::2,label=0,proto=10,tclass=0x70,hlimit=127,frag=no)),2,set(ipv6(src=::1,dst=::2,label=0,proto=10,tclass=0x70,hlimit=126,frag=no)),3,4
315 ])
316
317 AT_CAPTURE_FILE([ofctl_monitor.log])
318 AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl --detach --no-chdir --pidfile 2> ofctl_monitor.log])
319 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=111,tos=0,ttl=2,frag=no)' -generate], [0], [stdout])
320 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
321 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
322 NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x0 total_len=34 in_port=1 (via invalid_ttl) data_len=34 (unbuffered)
323 ip,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=111,nw_tos=0,nw_ecn=0,nw_ttl=1
324 ])
325 OVS_VSWITCHD_STOP
326 AT_CLEANUP
327
328
329 AT_SETUP([ofproto-dpif - output, OFPP_NONE ingress port])
330 OVS_VSWITCHD_START
331 ADD_OF_PORTS([br0], [1], [2])
332
333 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
334
335 # "in_port" defaults to OFPP_NONE if it's not specified.
336 flow="icmp,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,icmp_type=8,icmp_code=0"
337 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
338 AT_CHECK([tail -1 stdout | sed 's/Datapath actions: //' | tr "," "\n" | sort -n], [0], [dnl
339 1
340 2
341 100
342 ])
343
344 OVS_VSWITCHD_STOP
345 AT_CLEANUP
346
347 AT_SETUP([ofproto-dpif - DSCP])
348 OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=dummy])
349 ADD_OF_PORTS([br0], [9])
350 AT_DATA([flows.txt], [dnl
351 actions=output:LOCAL,enqueue:1:1,enqueue:1:2,enqueue:1:2,enqueue:1:1,output:1,mod_nw_tos:0,output:1,output:LOCAL
352 ])
353 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
354 AT_CHECK([ovs-vsctl -- \
355         set Port p1 qos=@newqos --\
356         --id=@newqos create QoS type=linux-htb queues=1=@q1,2=@q2 --\
357         --id=@q1 create Queue dscp=1 --\
358         --id=@q2 create Queue dscp=2], [0], [ignore])
359 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(9),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0xff,ttl=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
360 AT_CHECK([tail -1 stdout], [0],
361   [Datapath actions: dnl
362 100,dnl
363 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0x7,ttl=128,frag=no)),set(skb_priority(0x1)),1,dnl
364 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0xb,ttl=128,frag=no)),set(skb_priority(0x2)),1,dnl
365 1,dnl
366 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0x7,ttl=128,frag=no)),set(skb_priority(0x1)),1,dnl
367 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0xff,ttl=128,frag=no)),set(skb_priority(0)),1,dnl
368 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0x3,ttl=128,frag=no)),1,dnl
369 100
370 ])
371 OVS_VSWITCHD_STOP
372 AT_CLEANUP
373
374 AT_SETUP([ofproto-dpif - output/flood flags])
375 OVS_VSWITCHD_START
376 ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6], [7])
377
378 AT_DATA([flows.txt], [dnl
379 in_port=local actions=local,flood
380 in_port=1 actions=flood
381 in_port=2 actions=all
382 in_port=3 actions=output:LOCAL,output:1,output:2,output:3,output:4,output:5,output:6,output:7
383 in_port=4 actions=enqueue:LOCAL:1,enqueue:1:1,enqueue:2:1,enqueue:3:2,enqueue:4:1,enqueue:5:1,enqueue:6:1,enqueue:7:1
384 ])
385 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
386 AT_CHECK([ovs-ofctl mod-port br0 5 noforward])
387 AT_CHECK([ovs-ofctl mod-port br0 6 noflood])
388
389 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(100),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
390 AT_CHECK([tail -1 stdout \
391 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
392 1
393 2
394 3
395 4
396 7
397 ])
398
399 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(1),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
400 AT_CHECK([tail -1 stdout \
401 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
402 100
403 2
404 3
405 4
406 7
407 ])
408
409 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(2),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
410 AT_CHECK([tail -1 stdout \
411 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
412 1
413 100
414 3
415 4
416 6
417 7
418 ])
419
420 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(3),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
421 AT_CHECK([tail -1 stdout], [0],
422   [Datapath actions: 100,1,2,4,6,7
423 ])
424
425 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(4),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
426 AT_CHECK([tail -1 stdout], [0],
427   [Datapath actions: set(skb_priority(0x1)),100,1,2,set(skb_priority(0x2)),3,set(skb_priority(0x1)),6,7
428 ])
429 OVS_VSWITCHD_STOP
430 AT_CLEANUP
431
432 AT_SETUP([ofproto-dpif - controller])
433 OVS_VSWITCHD_START([dnl
434    add-port br0 p1 -- set Interface p1 type=dummy
435 ])
436 ON_EXIT([kill `cat ovs-ofctl.pid`])
437
438 AT_CAPTURE_FILE([ofctl_monitor.log])
439 AT_DATA([flows.txt], [dnl
440 cookie=0x0 dl_src=10:11:11:11:11:11 actions=controller
441 cookie=0x1 dl_src=20:22:22:22:22:22 actions=controller,resubmit(80,1)
442 cookie=0x2 dl_src=30:33:33:33:33:33 actions=mod_vlan_vid:15,controller
443
444 cookie=0x3 table=1 in_port=80 actions=load:1->NXM_NX_REG0[[]],mod_vlan_vid:80,controller,resubmit(81,2)
445 cookie=0x4 table=2 in_port=81 actions=load:2->NXM_NX_REG1[[]],mod_dl_src:80:81:81:81:81:81,controller,resubmit(82,3)
446 cookie=0x5 table=3 in_port=82 actions=load:3->NXM_NX_REG2[[]],mod_dl_dst:82:82:82:82:82:82,controller,resubmit(83,4)
447 cookie=0x6 table=4 in_port=83 actions=load:4->NXM_NX_REG3[[]],mod_nw_src:83.83.83.83,controller,resubmit(84,5)
448 cookie=0x7 table=5 in_port=84 actions=load:5->NXM_NX_REG4[[]],load:6->NXM_NX_TUN_ID[[]],mod_nw_dst:84.84.84.84,controller,resubmit(85,6)
449 cookie=0x8 table=6 in_port=85 actions=mod_tp_src:85,controller,resubmit(86,7)
450 cookie=0x9 table=7 in_port=86 actions=mod_tp_dst:86,controller,controller
451 cookie=0xa dl_src=40:44:44:44:44:41 actions=mod_vlan_vid:99,mod_vlan_pcp:1,controller
452 cookie=0xa dl_src=40:44:44:44:44:42 actions=push_mpls:0x8847,load:10->OXM_OF_MPLS_LABEL[[]],load:3->OXM_OF_MPLS_TC[[]],controller
453 cookie=0xa dl_src=41:44:44:44:44:42 actions=push_mpls:0x8847,load:10->OXM_OF_MPLS_LABEL[[]],load:3->OXM_OF_MPLS_TC[[]],pop_mpls:0x0800,controller
454 cookie=0xa dl_src=40:44:44:44:44:43 actions=push_mpls:0x8847,load:10->OXM_OF_MPLS_LABEL[[]],load:3->OXM_OF_MPLS_TC[[]],controller
455 cookie=0xa dl_src=40:44:44:44:44:44 actions=push_mpls:0x8847,load:10->OXM_OF_MPLS_LABEL[[]],load:3->OXM_OF_MPLS_TC[[]],controller
456 cookie=0xa dl_src=40:44:44:44:44:45 actions=push_mpls:0x8847,load:10->OXM_OF_MPLS_LABEL[[]],load:3->OXM_OF_MPLS_TC[[]],dec_mpls_ttl,controller
457 cookie=0xa dl_src=40:44:44:44:44:46 actions=push_mpls:0x8847,load:10->OXM_OF_MPLS_LABEL[[]],load:3->OXM_OF_MPLS_TC[[]],set_mpls_ttl(10),controller
458 cookie=0xa dl_src=40:44:44:44:44:47 actions=push_mpls:0x8847,load:10->OXM_OF_MPLS_LABEL[[]],load:3->OXM_OF_MPLS_TC[[]],dec_mpls_ttl,set_mpls_ttl(10),controller
459 cookie=0xa dl_src=40:44:44:44:44:48 actions=push_mpls:0x8847,load:10->OXM_OF_MPLS_LABEL[[]],load:3->OXM_OF_MPLS_TC[[]],set_mpls_ttl(10),dec_mpls_ttl,controller
460 cookie=0xb dl_src=50:55:55:55:55:55 dl_type=0x8847 actions=load:1000->OXM_OF_MPLS_LABEL[[]],controller
461 cookie=0xd dl_src=60:66:66:66:66:66 actions=pop_mpls:0x0800,controller
462 cookie=0xc dl_src=70:77:77:77:77:77 actions=push_mpls:0x8848,load:1000->OXM_OF_MPLS_LABEL[[]],load:7->OXM_OF_MPLS_TC[[]],controller
463 cookie=0xd dl_src=80:88:88:88:88:88 arp actions=load:2->OXM_OF_ARP_OP[[]],controller,load:0xc0a88001->OXM_OF_ARP_SPA[[]],controller,load:0x404444444441->OXM_OF_ARP_THA[[]],load:0x01010101->OXM_OF_ARP_SPA[[]],load:0x02020202->OXM_OF_ARP_TPA[[]],controller
464 ])
465 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
466
467 dnl Flow miss.
468 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
469
470 for i in 1 2 3 ; do
471     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9),tcp_flags(0x010)'
472 done
473 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
474 ovs-appctl -t ovs-ofctl exit
475
476 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
477 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
478 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=9,tcp_flags=0x010 tcp_csum:0
479 dnl
480 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
481 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=9,tcp_flags=0x010 tcp_csum:0
482 dnl
483 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
484 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=9,tcp_flags=0x010 tcp_csum:0
485 ])
486
487 dnl Singleton controller action.
488 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
489
490 for i in 1 2 3 ; do
491     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=10:11:11:11:11:11,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=10),tcp_flags(0x002)'
492 done
493 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
494 ovs-appctl -t ovs-ofctl exit
495
496 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
497 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
498 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=10:11:11:11:11:11,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=10,tcp_flags=0x002 tcp_csum:0
499 dnl
500 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
501 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=10:11:11:11:11:11,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=10,tcp_flags=0x002 tcp_csum:0
502 dnl
503 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
504 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=10:11:11:11:11:11,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=10,tcp_flags=0x002 tcp_csum:0
505 ])
506
507 dnl Modified controller action.
508 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
509
510 for i in 1 2 3 ; do
511     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=30:33:33:33:33:33,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=10),tcp_flags(0x001)'
512 done
513 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
514 ovs-appctl -t ovs-ofctl exit
515
516 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
517 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
518 tcp,metadata=0,in_port=0,dl_vlan=15,dl_vlan_pcp=0,dl_src=30:33:33:33:33:33,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=10,tcp_flags=0x001 tcp_csum:0
519 dnl
520 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
521 tcp,metadata=0,in_port=0,dl_vlan=15,dl_vlan_pcp=0,dl_src=30:33:33:33:33:33,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=10,tcp_flags=0x001 tcp_csum:0
522 dnl
523 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
524 tcp,metadata=0,in_port=0,dl_vlan=15,dl_vlan_pcp=0,dl_src=30:33:33:33:33:33,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=10,tcp_flags=0x001 tcp_csum:0
525 ])
526
527 dnl Modified VLAN controller action.
528 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
529
530 for i in 1 2 3; do
531     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:44:41,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=16,tos=0,ttl=64,frag=no)'
532 done
533 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
534 ovs-appctl -t ovs-ofctl exit
535
536 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
537 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
538 ip,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:44:41,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=16,nw_tos=0,nw_ecn=0,nw_ttl=64
539 dnl
540 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
541 ip,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:44:41,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=16,nw_tos=0,nw_ecn=0,nw_ttl=64
542 dnl
543 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
544 ip,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:44:41,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=16,nw_tos=0,nw_ecn=0,nw_ttl=64
545 ])
546
547 dnl Modified MPLS controller action.
548 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
549
550 for i in 1 2 3; do
551     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:44:42,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=16,tos=0,ttl=64,frag=no)'
552 done
553 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
554 ovs-appctl -t ovs-ofctl exit
555
556 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
557 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
558 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:42,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=64,mpls_bos=1
559 dnl
560 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
561 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:42,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=64,mpls_bos=1
562 dnl
563 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
564 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:42,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=64,mpls_bos=1
565 ])
566
567 dnl Modified MPLS controller action.
568 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
569
570 for i in 1 2 3; do
571     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=41:44:44:44:44:42,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=16,tos=0,ttl=64,frag=no)'
572 done
573 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
574 ovs-appctl -t ovs-ofctl exit
575
576 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
577 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
578 ip,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=41:44:44:44:44:42,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=16,nw_tos=0,nw_ecn=0,nw_ttl=64
579 dnl
580 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
581 ip,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=41:44:44:44:44:42,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=16,nw_tos=0,nw_ecn=0,nw_ttl=64
582 dnl
583 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
584 ip,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=41:44:44:44:44:42,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=16,nw_tos=0,nw_ecn=0,nw_ttl=64
585 ])
586
587 dnl Modified MPLS controller action.
588 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
589
590 dnl in_port(1),eth(src=00:01:02:03:04:05,dst=10:11:12:13:14:15),eth_type(0x8847),mpls(label=100,tc=3,ttl=64,bos=1)
591
592 for i in 1 2 3; do
593     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:44:43,dst=50:54:00:00:00:07),eth_type(0x8847),mpls(label=11,tc=3,ttl=64,bos=1)'
594 done
595
596 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
597 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
598 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
599 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:43,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=64,mpls_bos=0,mpls_lse1=46912
600 dnl
601 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
602 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:43,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=64,mpls_bos=0,mpls_lse1=46912
603 dnl
604 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
605 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:43,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=64,mpls_bos=0,mpls_lse1=46912
606 ])
607
608 dnl Modified MPLS controller action.
609 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
610
611 for i in 1 2 3; do
612     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:44:44,dst=50:54:00:00:00:07),eth_type(0x8100),vlan(vid=99,pcp=7),encap(eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=16,tos=0,ttl=64,frag=no))'
613 done
614 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
615 ovs-appctl -t ovs-ofctl exit
616
617 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
618 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
619 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=7,dl_src=40:44:44:44:44:44,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=64,mpls_bos=1
620 dnl
621 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
622 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=7,dl_src=40:44:44:44:44:44,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=64,mpls_bos=1
623 dnl
624 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
625 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=7,dl_src=40:44:44:44:44:44,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=64,mpls_bos=1
626 ])
627
628 dnl Modified MPLS controller action.
629 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
630
631 for i in 1 2 3; do
632     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:44:45,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=16,tos=0,ttl=64,frag=no)'
633 done
634 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
635 ovs-appctl -t ovs-ofctl exit
636
637 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
638 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
639 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:45,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=63,mpls_bos=1
640 dnl
641 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
642 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:45,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=63,mpls_bos=1
643 dnl
644 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
645 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:45,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=63,mpls_bos=1
646 ])
647
648 dnl Modified MPLS controller action.
649 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
650
651 for i in 1 2 3; do
652     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:44:46,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=16,tos=0,ttl=64,frag=no)'
653 done
654 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
655 ovs-appctl -t ovs-ofctl exit
656
657 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
658 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
659 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:46,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=10,mpls_bos=1
660 dnl
661 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
662 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:46,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=10,mpls_bos=1
663 dnl
664 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
665 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:46,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=10,mpls_bos=1
666 ])
667
668 dnl Modified MPLS controller action.
669 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
670
671 for i in 1 2 3; do
672     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:44:47,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=16,tos=0,ttl=64,frag=no)'
673 done
674 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
675 ovs-appctl -t ovs-ofctl exit
676
677 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
678 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
679 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:47,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=10,mpls_bos=1
680 dnl
681 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
682 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:47,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=10,mpls_bos=1
683 dnl
684 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
685 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:47,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=10,mpls_bos=1
686 ])
687
688 dnl Modified MPLS controller action.
689 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
690
691 for i in 1 2 3; do
692     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:44:48,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=16,tos=0,ttl=64,frag=no)'
693 done
694 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
695 ovs-appctl -t ovs-ofctl exit
696
697 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
698 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
699 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:48,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=9,mpls_bos=1
700 dnl
701 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
702 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:48,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=9,mpls_bos=1
703 dnl
704 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
705 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:48,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=9,mpls_bos=1
706 ])
707
708 dnl Modified MPLS actions.
709 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
710
711 for i in 1 2 3; do
712     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:55:55:55:55:55,dst=50:54:00:00:00:07),eth_type(0x8847),mpls(label=100,tc=7,ttl=64,bos=1)'
713 done
714 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
715 ovs-appctl -t ovs-ofctl exit
716
717 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
718 NXT_PACKET_IN (xid=0x0): cookie=0xb total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
719 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:55:55:55:55:55,dl_dst=50:54:00:00:00:07,mpls_label=1000,mpls_tc=7,mpls_ttl=64,mpls_bos=1
720 dnl
721 NXT_PACKET_IN (xid=0x0): cookie=0xb total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
722 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:55:55:55:55:55,dl_dst=50:54:00:00:00:07,mpls_label=1000,mpls_tc=7,mpls_ttl=64,mpls_bos=1
723 dnl
724 NXT_PACKET_IN (xid=0x0): cookie=0xb total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
725 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:55:55:55:55:55,dl_dst=50:54:00:00:00:07,mpls_label=1000,mpls_tc=7,mpls_ttl=64,mpls_bos=1
726 ])
727
728 dnl Modified MPLS ipv6 controller action.
729 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
730
731 for i in 1 2 3; do
732     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=70:77:77:77:77:77,dst=50:54:00:00:00:07),eth_type(0x86dd),ipv6(src=::1,dst=::2,label=0,proto=10,tclass=0x70,hlimit=128,frag=no)'
733 done
734 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
735 ovs-appctl -t ovs-ofctl exit
736
737 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
738 NXT_PACKET_IN (xid=0x0): cookie=0xc total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
739 mplsm,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=70:77:77:77:77:77,dl_dst=50:54:00:00:00:07,mpls_label=1000,mpls_tc=7,mpls_ttl=128,mpls_bos=1
740 dnl
741 NXT_PACKET_IN (xid=0x0): cookie=0xc total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
742 mplsm,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=70:77:77:77:77:77,dl_dst=50:54:00:00:00:07,mpls_label=1000,mpls_tc=7,mpls_ttl=128,mpls_bos=1
743 dnl
744 NXT_PACKET_IN (xid=0x0): cookie=0xc total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
745 mplsm,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=70:77:77:77:77:77,dl_dst=50:54:00:00:00:07,mpls_label=1000,mpls_tc=7,mpls_ttl=128,mpls_bos=1
746 ])
747
748
749 dnl Modified MPLS pop action.
750 dnl The input is a frame with two MPLS headers which tcpdump -vve shows as:
751 dnl 60:66:66:66:66:66 > 50:54:00:00:00:07, ethertype MPLS multicast (0x8847), length 66: MPLS (label 20, exp 0, ttl 32)
752 dnl             (tos 0x0, ttl 64, id 0, offset 0, flags [none], proto TCP (6), length 44)
753
754 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
755
756 for i in 1 2 3; do
757     ovs-appctl netdev-dummy/receive p1 '50 54 00 00 00 07 60 66 66 66 66 66 88 47 00 01 41 20 45 00 00 2c 00 00 00 00 40 06 3b 78 c0 a8 00 01 c0 a8 00 02 00 50 00 00 00 00 00 2a 00 00 00 2a 50 00 27 10 77 44 00 00 48 4f 47 45'
758 done
759 #for i in 2 3; do
760 #    ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=60:66:66:66:66:66,dst=50:54:00:00:00:07),eth_type(0x8847),mpls(label=10,tc=3,ttl=100,bos=1)'
761 #done
762 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
763 ovs-appctl -t ovs-ofctl exit
764
765 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
766 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered)
767 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=60:66:66:66:66:66,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=80,tp_dst=0,tcp_flags=0x000 tcp_csum:7744
768 dnl
769 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered)
770 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=60:66:66:66:66:66,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=80,tp_dst=0,tcp_flags=0x000 tcp_csum:7744
771 dnl
772 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered)
773 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=60:66:66:66:66:66,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=80,tp_dst=0,tcp_flags=0x000 tcp_csum:7744
774 ])
775
776 dnl Checksum TCP.
777 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --no-chdir --pidfile 2> ofctl_monitor.log])
778
779 for i in 1 ; do
780     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=20:22:22:22:22:22,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=11),tcp_flags(0x001)'
781 done
782 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 18])
783 ovs-appctl -t ovs-ofctl exit
784
785 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
786 NXT_PACKET_IN (xid=0x0): cookie=0x1 total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
787 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=20:22:22:22:22:22,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=11,tcp_flags=0x001 tcp_csum:0
788 dnl
789 NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x3 total_len=64 in_port=1 reg0=0x1 (via action) data_len=64 (unbuffered)
790 tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=20:22:22:22:22:22,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=11,tcp_flags=0x001 tcp_csum:0
791 dnl
792 NXT_PACKET_IN (xid=0x0): table_id=2 cookie=0x4 total_len=64 in_port=1 reg0=0x1 reg1=0x2 (via action) data_len=64 (unbuffered)
793 tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=11,tcp_flags=0x001 tcp_csum:0
794 dnl
795 NXT_PACKET_IN (xid=0x0): table_id=3 cookie=0x5 total_len=64 in_port=1 reg0=0x1 reg1=0x2 reg2=0x3 (via action) data_len=64 (unbuffered)
796 tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=11,tcp_flags=0x001 tcp_csum:0
797 dnl
798 NXT_PACKET_IN (xid=0x0): table_id=4 cookie=0x6 total_len=64 in_port=1 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 (via action) data_len=64 (unbuffered)
799 tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=11,tcp_flags=0x001 tcp_csum:1a03
800 dnl
801 NXT_PACKET_IN (xid=0x0): table_id=5 cookie=0x7 total_len=64 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=64 (unbuffered)
802 tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=11,tcp_flags=0x001 tcp_csum:3205
803 dnl
804 NXT_PACKET_IN (xid=0x0): table_id=6 cookie=0x8 total_len=64 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=64 (unbuffered)
805 tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=85,tp_dst=11,tcp_flags=0x001 tcp_csum:31b8
806 dnl
807 NXT_PACKET_IN (xid=0x0): table_id=7 cookie=0x9 total_len=64 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=64 (unbuffered)
808 tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=85,tp_dst=86,tcp_flags=0x001 tcp_csum:316d
809 dnl
810 NXT_PACKET_IN (xid=0x0): table_id=7 cookie=0x9 total_len=64 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=64 (unbuffered)
811 tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=85,tp_dst=86,tcp_flags=0x001 tcp_csum:316d
812 ])
813
814 dnl Checksum UDP.
815 AT_CHECK([ovs-ofctl monitor br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
816
817 for i in 1 ; do
818     ovs-appctl netdev-dummy/receive p1 '50 54 00 00 00 07 20 22 22 22 22 22 08 00 45 00 00 1C 00 00 00 00 00 11 00 00 C0 A8 00 01 C0 A8 00 02 00 08 00 0B 00 00 12 34 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
819 done
820 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 18])
821 ovs-appctl -t ovs-ofctl exit
822
823 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
824 NXT_PACKET_IN (xid=0x0): cookie=0x1 total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
825 udp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=20:22:22:22:22:22,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=11 udp_csum:1234
826 dnl
827 NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x3 total_len=64 in_port=1 reg0=0x1 (via action) data_len=64 (unbuffered)
828 udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=20:22:22:22:22:22,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=11 udp_csum:1234
829 dnl
830 NXT_PACKET_IN (xid=0x0): table_id=2 cookie=0x4 total_len=64 in_port=1 reg0=0x1 reg1=0x2 (via action) data_len=64 (unbuffered)
831 udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=11 udp_csum:1234
832 dnl
833 NXT_PACKET_IN (xid=0x0): table_id=3 cookie=0x5 total_len=64 in_port=1 reg0=0x1 reg1=0x2 reg2=0x3 (via action) data_len=64 (unbuffered)
834 udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=11 udp_csum:1234
835 dnl
836 NXT_PACKET_IN (xid=0x0): table_id=4 cookie=0x6 total_len=64 in_port=1 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 (via action) data_len=64 (unbuffered)
837 udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=11 udp_csum:2c37
838 dnl
839 NXT_PACKET_IN (xid=0x0): table_id=5 cookie=0x7 total_len=64 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=64 (unbuffered)
840 udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=11 udp_csum:4439
841 dnl
842 NXT_PACKET_IN (xid=0x0): table_id=6 cookie=0x8 total_len=64 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=64 (unbuffered)
843 udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=85,tp_dst=11 udp_csum:43ec
844 dnl
845 NXT_PACKET_IN (xid=0x0): table_id=7 cookie=0x9 total_len=64 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=64 (unbuffered)
846 udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=85,tp_dst=86 udp_csum:43a1
847 dnl
848 NXT_PACKET_IN (xid=0x0): table_id=7 cookie=0x9 total_len=64 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=64 (unbuffered)
849 udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=85,tp_dst=86 udp_csum:43a1
850 ])
851
852 dnl Modified ARP controller action.
853 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
854
855 for i in 1 2 3; do
856     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=80:88:88:88:88:88,dst=ff:ff:ff:ff:ff:ff),eth_type(0x0806),arp(sip=192.168.0.1,tip=192.168.0.2,op=1,sha=50:54:00:00:00:05,tha=00:00:00:00:00:00)'
857 done
858
859 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 9])
860 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
861 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
862 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
863 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.0.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00
864 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
865 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.128.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00
866 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
867 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=1.1.1.1,arp_tpa=2.2.2.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=40:44:44:44:44:41
868 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
869 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.0.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00
870 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
871 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.128.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00
872 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
873 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=1.1.1.1,arp_tpa=2.2.2.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=40:44:44:44:44:41
874 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
875 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.0.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00
876 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
877 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.128.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00
878 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
879 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=1.1.1.1,arp_tpa=2.2.2.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=40:44:44:44:44:41
880 ])
881
882 AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
883
884 dnl Checksum SCTP.
885 AT_CHECK([ovs-ofctl monitor br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
886
887 for i in 1 ; do
888     ovs-appctl netdev-dummy/receive p1 '50 54 00 00 00 07 20 22 22 22 22 22 08 00 45 00 00 24 00 00 00 00 00 84 00 00 C0 A8 00 01 C0 A8 00 02 04 58 08 af 00 00 00 00 d9 d7 91 57 01 00 00 34 cf 28 ec 4e 00 01 40 00 00 0a ff ff b7 53 24 19 00 05 00 08 7f 00 00 01 00 05 00 08 c0 a8 02 07 00 0c 00 06 00 05 00 00 80 00 00 04 c0 00 00 04'
889 done
890
891 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 9])
892 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
893 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
894 NXT_PACKET_IN (xid=0x0): cookie=0x1 total_len=98 in_port=1 (via action) data_len=98 (unbuffered)
895 sctp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=20:22:22:22:22:22,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=1112,tp_dst=2223 sctp_csum:d9d79157
896 dnl
897 NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x3 total_len=102 in_port=1 reg0=0x1 (via action) data_len=102 (unbuffered)
898 sctp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=20:22:22:22:22:22,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=1112,tp_dst=2223 sctp_csum:d9d79157
899 dnl
900 NXT_PACKET_IN (xid=0x0): table_id=2 cookie=0x4 total_len=102 in_port=1 reg0=0x1 reg1=0x2 (via action) data_len=102 (unbuffered)
901 sctp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=1112,tp_dst=2223 sctp_csum:d9d79157
902 dnl
903 NXT_PACKET_IN (xid=0x0): table_id=3 cookie=0x5 total_len=102 in_port=1 reg0=0x1 reg1=0x2 reg2=0x3 (via action) data_len=102 (unbuffered)
904 sctp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=1112,tp_dst=2223 sctp_csum:d9d79157
905 dnl
906 NXT_PACKET_IN (xid=0x0): table_id=4 cookie=0x6 total_len=102 in_port=1 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 (via action) data_len=102 (unbuffered)
907 sctp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=1112,tp_dst=2223 sctp_csum:d9d79157
908 dnl
909 NXT_PACKET_IN (xid=0x0): table_id=5 cookie=0x7 total_len=102 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=102 (unbuffered)
910 sctp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=1112,tp_dst=2223 sctp_csum:d9d79157
911 dnl
912 NXT_PACKET_IN (xid=0x0): table_id=6 cookie=0x8 total_len=102 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=102 (unbuffered)
913 sctp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=85,tp_dst=2223 sctp_csum:7f12662e
914 dnl
915 NXT_PACKET_IN (xid=0x0): table_id=7 cookie=0x9 total_len=102 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=102 (unbuffered)
916 sctp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=85,tp_dst=86 sctp_csum:a7e86f67
917 dnl
918 NXT_PACKET_IN (xid=0x0): table_id=7 cookie=0x9 total_len=102 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=102 (unbuffered)
919 sctp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=85,tp_dst=86 sctp_csum:a7e86f67
920 ])
921
922 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
923  cookie=0x1, n_packets=3, n_bytes=218, dl_src=20:22:22:22:22:22 actions=CONTROLLER:65535,resubmit(80,1)
924  cookie=0x2, n_packets=3, n_bytes=180, dl_src=30:33:33:33:33:33 actions=mod_vlan_vid:15,CONTROLLER:65535
925  cookie=0x3, table=1, n_packets=3, n_bytes=218, in_port=80 actions=load:0x1->NXM_NX_REG0[[]],mod_vlan_vid:80,CONTROLLER:65535,resubmit(81,2)
926  cookie=0x4, table=2, n_packets=3, n_bytes=218, in_port=81 actions=load:0x2->NXM_NX_REG1[[]],mod_dl_src:80:81:81:81:81:81,CONTROLLER:65535,resubmit(82,3)
927  cookie=0x5, table=3, n_packets=3, n_bytes=218, in_port=82 actions=load:0x3->NXM_NX_REG2[[]],mod_dl_dst:82:82:82:82:82:82,CONTROLLER:65535,resubmit(83,4)
928  cookie=0x6, table=4, n_packets=3, n_bytes=218, in_port=83 actions=load:0x4->NXM_NX_REG3[[]],mod_nw_src:83.83.83.83,CONTROLLER:65535,resubmit(84,5)
929  cookie=0x7, table=5, n_packets=3, n_bytes=218, in_port=84 actions=load:0x5->NXM_NX_REG4[[]],load:0x6->NXM_NX_TUN_ID[[]],mod_nw_dst:84.84.84.84,CONTROLLER:65535,resubmit(85,6)
930  cookie=0x8, table=6, n_packets=3, n_bytes=218, in_port=85 actions=mod_tp_src:85,CONTROLLER:65535,resubmit(86,7)
931  cookie=0x9, table=7, n_packets=3, n_bytes=218, in_port=86 actions=mod_tp_dst:86,CONTROLLER:65535,CONTROLLER:65535
932  cookie=0xa, n_packets=3, n_bytes=180, dl_src=40:44:44:44:44:41 actions=mod_vlan_vid:99,mod_vlan_pcp:1,CONTROLLER:65535
933  cookie=0xa, n_packets=3, n_bytes=180, dl_src=40:44:44:44:44:42 actions=push_mpls:0x8847,load:0xa->OXM_OF_MPLS_LABEL[[]],load:0x3->OXM_OF_MPLS_TC[[]],CONTROLLER:65535
934  cookie=0xa, n_packets=3, n_bytes=180, dl_src=40:44:44:44:44:43 actions=push_mpls:0x8847,load:0xa->OXM_OF_MPLS_LABEL[[]],load:0x3->OXM_OF_MPLS_TC[[]],CONTROLLER:65535
935  cookie=0xa, n_packets=3, n_bytes=180, dl_src=40:44:44:44:44:44 actions=push_mpls:0x8847,load:0xa->OXM_OF_MPLS_LABEL[[]],load:0x3->OXM_OF_MPLS_TC[[]],CONTROLLER:65535
936  cookie=0xa, n_packets=3, n_bytes=180, dl_src=40:44:44:44:44:45 actions=push_mpls:0x8847,load:0xa->OXM_OF_MPLS_LABEL[[]],load:0x3->OXM_OF_MPLS_TC[[]],dec_mpls_ttl,CONTROLLER:65535
937  cookie=0xa, n_packets=3, n_bytes=180, dl_src=40:44:44:44:44:46 actions=push_mpls:0x8847,load:0xa->OXM_OF_MPLS_LABEL[[]],load:0x3->OXM_OF_MPLS_TC[[]],set_mpls_ttl(10),CONTROLLER:65535
938  cookie=0xa, n_packets=3, n_bytes=180, dl_src=40:44:44:44:44:47 actions=push_mpls:0x8847,load:0xa->OXM_OF_MPLS_LABEL[[]],load:0x3->OXM_OF_MPLS_TC[[]],dec_mpls_ttl,set_mpls_ttl(10),CONTROLLER:65535
939  cookie=0xa, n_packets=3, n_bytes=180, dl_src=40:44:44:44:44:48 actions=push_mpls:0x8847,load:0xa->OXM_OF_MPLS_LABEL[[]],load:0x3->OXM_OF_MPLS_TC[[]],set_mpls_ttl(10),dec_mpls_ttl,CONTROLLER:65535
940  cookie=0xa, n_packets=3, n_bytes=180, dl_src=41:44:44:44:44:42 actions=push_mpls:0x8847,load:0xa->OXM_OF_MPLS_LABEL[[]],load:0x3->OXM_OF_MPLS_TC[[]],pop_mpls:0x0800,CONTROLLER:65535
941  cookie=0xb, n_packets=3, n_bytes=180, mpls,dl_src=50:55:55:55:55:55 actions=load:0x3e8->OXM_OF_MPLS_LABEL[[]],CONTROLLER:65535
942  cookie=0xc, n_packets=3, n_bytes=180, dl_src=70:77:77:77:77:77 actions=push_mpls:0x8848,load:0x3e8->OXM_OF_MPLS_LABEL[[]],load:0x7->OXM_OF_MPLS_TC[[]],CONTROLLER:65535
943  cookie=0xd, n_packets=3, n_bytes=180, arp,dl_src=80:88:88:88:88:88 actions=load:0x2->NXM_OF_ARP_OP[[]],CONTROLLER:65535,load:0xc0a88001->NXM_OF_ARP_SPA[[]],CONTROLLER:65535,load:0x404444444441->NXM_NX_ARP_THA[[]],load:0x1010101->NXM_OF_ARP_SPA[[]],load:0x2020202->NXM_OF_ARP_TPA[[]],CONTROLLER:65535
944  cookie=0xd, n_packets=3, n_bytes=186, dl_src=60:66:66:66:66:66 actions=pop_mpls:0x0800,CONTROLLER:65535
945  n_packets=3, n_bytes=180, dl_src=10:11:11:11:11:11 actions=CONTROLLER:65535
946 NXST_FLOW reply:
947 ])
948
949 OVS_VSWITCHD_STOP
950 AT_CLEANUP
951
952 AT_SETUP([ofproto-dpif - ARP modification slow-path])
953 OVS_VSWITCHD_START
954 ADD_OF_PORTS([br0], [1], [2])
955
956 ovs-vsctl -- set Interface p2 type=dummy options:pcap=p2.pcap
957 ovs-ofctl add-flow br0 'in_port=1,arp actions=load:2->OXM_OF_ARP_OP[[]],2,load:0xc0a88001->OXM_OF_ARP_SPA[[]],2,load:0x404444444441->OXM_OF_ARP_THA[[]],2'
958
959 # Input some packets that should follow the arp modification slow-path.
960 for i in 1 2 3; do
961     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=80:88:88:88:88:88,dst=ff:ff:ff:ff:ff:ff),eth_type(0x0806),arp(sip=192.168.0.1,tip=192.168.0.2,op=1,sha=50:54:00:00:00:05,tha=00:00:00:00:00:00)'
962 done
963 AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
964
965 # Check the packets that were output.
966 AT_CHECK([ovs-ofctl parse-pcap p2.pcap], [0], [dnl
967 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.0.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00
968 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.128.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00
969 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.128.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=40:44:44:44:44:41
970 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.0.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00
971 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.128.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00
972 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.128.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=40:44:44:44:44:41
973 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.0.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00
974 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.128.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00
975 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.128.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=40:44:44:44:44:41
976 ])
977
978 OVS_VSWITCHD_STOP
979 AT_CLEANUP
980
981 AT_SETUP([ofproto-dpif - VLAN handling])
982 OVS_VSWITCHD_START(
983   [set Bridge br0 fail-mode=standalone -- \
984    add-port br0 p1                                  trunks=10,12 -- \
985    add-port br0 p2                           tag=10              -- \
986    add-port br0 p3                           tag=12              \
987                    other-config:priority-tags=true               -- \
988    add-port br0 p4                           tag=12              -- \
989    add-port br0 p5 vlan_mode=native-tagged   tag=10              -- \
990    add-port br0 p6 vlan_mode=native-tagged   tag=10 trunks=10,12 -- \
991    add-port br0 p7 vlan_mode=native-untagged tag=12              -- \
992    add-port br0 p8 vlan_mode=native-untagged tag=12 trunks=10,12 \
993                    other-config:priority-tags=true               -- \
994    set Interface p1 type=dummy -- \
995    set Interface p2 type=dummy -- \
996    set Interface p3 type=dummy -- \
997    set Interface p4 type=dummy -- \
998    set Interface p5 type=dummy -- \
999    set Interface p6 type=dummy -- \
1000    set Interface p7 type=dummy -- \
1001    set Interface p8 type=dummy --])
1002
1003 dnl Each of these specifies an in_port by number, a VLAN VID (or "none"),
1004 dnl a VLAN PCP (used if the VID isn't "none") and the expected set of datapath
1005 dnl actions.
1006 for tuple in \
1007         "100 none 0 drop" \
1008         "100 0    0 drop" \
1009         "100 0    1 drop" \
1010         "100 10   0 1,5,6,7,8,pop_vlan,2" \
1011         "100 10   1 1,5,6,7,8,pop_vlan,2" \
1012         "100 11   0 5,7" \
1013         "100 11   1 5,7" \
1014         "100 12   0 1,5,6,pop_vlan,3,4,7,8" \
1015         "100 12   1 1,5,6,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
1016         "1  none 0 drop" \
1017         "1  0    0 drop" \
1018         "1  0    1 drop" \
1019         "1  10   0 5,6,7,8,100,pop_vlan,2" \
1020         "1  10   1 5,6,7,8,100,pop_vlan,2" \
1021         "1  11   0 drop" \
1022         "1  11   1 drop" \
1023         "1  12   0 5,6,100,pop_vlan,3,4,7,8" \
1024         "1  12   1 5,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
1025         "2  none 0 push_vlan(vid=10,pcp=0),1,5,6,7,8,100" \
1026         "2  0    0 pop_vlan,push_vlan(vid=10,pcp=0),1,5,6,7,8,100" \
1027         "2  0    1 pop_vlan,push_vlan(vid=10,pcp=1),1,5,6,7,8,100" \
1028         "2  10   0 drop" \
1029         "2  10   1 drop" \
1030         "2  11   0 drop" \
1031         "2  11   1 drop" \
1032         "2  12   0 drop" \
1033         "2  12   1 drop" \
1034         "3  none 0 4,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
1035         "3  0    0 pop_vlan,4,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
1036         "3  0    1 8,pop_vlan,4,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
1037         "3  10   0 drop" \
1038         "3  10   1 drop" \
1039         "3  11   0 drop" \
1040         "3  11   1 drop" \
1041         "3  12   0 drop" \
1042         "3  12   1 drop" \
1043         "4  none 0 3,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
1044         "4  0    0 pop_vlan,3,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
1045         "4  0    1 3,8,pop_vlan,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
1046         "4  10   0 drop" \
1047         "4  10   1 drop" \
1048         "4  11   0 drop" \
1049         "4  11   1 drop" \
1050         "4  12   0 drop" \
1051         "4  12   1 drop" \
1052         "5  none 0 2,push_vlan(vid=10,pcp=0),1,6,7,8,100" \
1053         "5  0    0 pop_vlan,2,push_vlan(vid=10,pcp=0),1,6,7,8,100" \
1054         "5  0    1 pop_vlan,2,push_vlan(vid=10,pcp=1),1,6,7,8,100" \
1055         "5  10   0 1,6,7,8,100,pop_vlan,2" \
1056         "5  10   1 1,6,7,8,100,pop_vlan,2" \
1057         "5  11   0 7,100" \
1058         "5  11   1 7,100" \
1059         "5  12   0 1,6,100,pop_vlan,3,4,7,8" \
1060         "5  12   1 1,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
1061         "6  none 0 2,push_vlan(vid=10,pcp=0),1,5,7,8,100" \
1062         "6  0    0 pop_vlan,2,push_vlan(vid=10,pcp=0),1,5,7,8,100" \
1063         "6  0    1 pop_vlan,2,push_vlan(vid=10,pcp=1),1,5,7,8,100" \
1064         "6  10   0 1,5,7,8,100,pop_vlan,2" \
1065         "6  10   1 1,5,7,8,100,pop_vlan,2" \
1066         "6  11   0 drop" \
1067         "6  11   1 drop" \
1068         "6  12   0 1,5,100,pop_vlan,3,4,7,8" \
1069         "6  12   1 1,5,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
1070         "7  none 0 3,4,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
1071         "7  0    0 pop_vlan,3,4,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
1072         "7  0    1 3,8,pop_vlan,4,push_vlan(vid=12,pcp=1),1,5,6,100" \
1073         "7  10   0 1,5,6,8,100,pop_vlan,2" \
1074         "7  10   1 1,5,6,8,100,pop_vlan,2" \
1075         "7  11   0 5,100" \
1076         "7  11   1 5,100" \
1077         "7  12   0 1,5,6,100,pop_vlan,3,4,8" \
1078         "7  12   1 1,5,6,100,pop_vlan,4,push_vlan(vid=0,pcp=1),3,8" \
1079         "8  none 0 3,4,7,push_vlan(vid=12,pcp=0),1,5,6,100" \
1080         "8  0    0 pop_vlan,3,4,7,push_vlan(vid=12,pcp=0),1,5,6,100" \
1081         "8  0    1 3,pop_vlan,4,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
1082         "8  10   0 1,5,6,7,100,pop_vlan,2" \
1083         "8  10   1 1,5,6,7,100,pop_vlan,2" \
1084         "8  11   0 drop" \
1085         "8  11   1 drop" \
1086         "8  12   0 1,5,6,100,pop_vlan,3,4,7" \
1087         "8  12   1 1,5,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3"
1088 do
1089   set $tuple
1090   in_port=$1
1091   vlan=$2
1092   pcp=$3
1093   expected=$4
1094
1095   if test $vlan = none; then
1096     flow="in_port($in_port),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff),eth_type(0xabcd)"
1097   else
1098     flow="in_port($in_port),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff),eth_type(0x8100),vlan(vid=$vlan,pcp=$pcp),encap(eth_type(0xabcd))"
1099   fi
1100
1101   echo "----------------------------------------------------------------------"
1102   echo "in_port=$in_port vlan=$vlan pcp=$pcp"
1103
1104   AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1105   actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1106
1107   AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
1108   mv stdout expout
1109   AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
1110 done
1111
1112 OVS_VSWITCHD_STOP
1113 AT_CLEANUP
1114
1115 AT_SETUP([ofproto-dpif - fragment handling])
1116 OVS_VSWITCHD_START
1117 ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6], [90])
1118 AT_DATA([flows.txt], [dnl
1119 priority=75 tcp ip_frag=no    tp_dst=80 actions=output:1
1120 priority=75 tcp ip_frag=first tp_dst=80 actions=output:2
1121 priority=75 tcp ip_frag=later tp_dst=80 actions=output:3
1122 priority=50 tcp ip_frag=no              actions=output:4
1123 priority=50 tcp ip_frag=first           actions=output:5
1124 priority=50 tcp ip_frag=later           actions=output:6
1125 ])
1126 AT_CHECK([ovs-ofctl replace-flows br0 flows.txt])
1127
1128 base_flow="in_port(90),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=128"
1129 no_flow="$base_flow,frag=no),tcp(src=12345,dst=80)"
1130 first_flow="$base_flow,frag=first),tcp(src=12345,dst=80)"
1131 later_flow="$base_flow,frag=later)"
1132
1133     # mode    no  first  later
1134 for tuple in \
1135     'normal    1     5      6' \
1136     'drop      1  drop   drop' \
1137     'nx-match  1     2      6'
1138 do
1139   set $tuple
1140   mode=$1
1141   no=$2
1142   first=$3
1143   later=$4
1144
1145   AT_CHECK([ovs-ofctl set-frags br0 $mode])
1146   for type in no first later; do
1147     eval flow=\$${type}_flow exp_output=\$$type
1148     printf "\n%s\n" "----$mode $type-----"
1149     AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1150     : > expout
1151     if test $mode = drop && test $type != no; then
1152         echo 'Packets dropped because they are IP fragments and the fragment handling mode is "drop".' >> expout
1153     fi
1154     echo "Datapath actions: $exp_output" >> expout
1155     AT_CHECK([grep 'IP fragments' stdout; tail -1 stdout], [0], [expout])
1156   done
1157 done
1158 OVS_VSWITCHD_STOP
1159 AT_CLEANUP
1160
1161 AT_SETUP([ofproto-dpif - exit])
1162 OVS_VSWITCHD_START
1163 ADD_OF_PORTS([br0], [1], [2], [3], [10], [11], [12], [13], [14])
1164 AT_DATA([flows.txt], [dnl
1165 in_port=1 actions=output:10,exit,output:11
1166 in_port=2 actions=output:12,resubmit:1,output:12
1167 in_port=3 actions=output:13,resubmit:2,output:14
1168 ])
1169 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1170 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
1171 AT_CHECK([tail -1 stdout], [0],
1172   [Datapath actions: 10
1173 ])
1174 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(2),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
1175 AT_CHECK([tail -1 stdout], [0],
1176   [Datapath actions: 12,10
1177 ])
1178 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(3),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
1179 AT_CHECK([tail -1 stdout], [0],
1180   [Datapath actions: 13,12,10
1181 ])
1182 OVS_VSWITCHD_STOP
1183 AT_CLEANUP
1184
1185
1186 AT_SETUP([ofproto-dpif - mirroring, select_all])
1187 OVS_VSWITCHD_START
1188 ADD_OF_PORTS([br0], 1, 2, 3)
1189 ovs-vsctl \
1190         set Bridge br0 mirrors=@m --\
1191         --id=@p3 get Port p3 --\
1192         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
1193
1194 AT_DATA([flows.txt], [dnl
1195 in_port=1 actions=output:2
1196 in_port=2 actions=output:1
1197 ])
1198 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1199
1200 flow="in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)"
1201 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1202 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1203   [Datapath actions: 2,3
1204 ])
1205
1206 flow="in_port(2),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)"
1207 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1208 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1209   [Datapath actions: 1,3
1210 ])
1211
1212 OVS_VSWITCHD_STOP
1213 AT_CLEANUP
1214
1215
1216 AT_SETUP([ofproto-dpif - mirroring, select_src])
1217 OVS_VSWITCHD_START
1218 ADD_OF_PORTS([br0], 1, 2, 3)
1219 ovs-vsctl \
1220         set Bridge br0 mirrors=@m --\
1221         --id=@p1 get Port p1 -- --id=@p3 get Port p3 --\
1222         --id=@m create Mirror name=mymirror select_src_port=@p1 output_port=@p3
1223
1224 AT_DATA([flows.txt], [dnl
1225 in_port=1 actions=output:2
1226 in_port=2 actions=output:1
1227 ])
1228 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1229
1230 flow="in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)"
1231 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1232 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1233   [Datapath actions: 2,3
1234 ])
1235
1236 flow="in_port(2),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)"
1237 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1238 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1239   [Datapath actions: 1
1240 ])
1241 OVS_VSWITCHD_STOP
1242 AT_CLEANUP
1243
1244 AT_SETUP([ofproto-dpif - mirroring, OFPP_NONE ingress port])
1245 OVS_VSWITCHD_START
1246 ADD_OF_PORTS([br0], 1, 2)
1247 ovs-vsctl \
1248         set Bridge br0 mirrors=@m --\
1249         --id=@p2 get Port p2 --\
1250         --id=@m create Mirror name=mymirror select_all=true output_port=@p2
1251
1252 AT_CHECK([ovs-ofctl add-flow br0 action=output:1])
1253
1254 # "in_port" defaults to OFPP_NONE if it's not specified.
1255 flow="icmp,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_ttl=128,icmp_type=8,icmp_code=0"
1256 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
1257 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1258   [Datapath actions: 1,2
1259 ])
1260
1261 OVS_VSWITCHD_STOP
1262 AT_CLEANUP
1263
1264
1265 AT_SETUP([ofproto-dpif - mirroring, select_dst])
1266 OVS_VSWITCHD_START
1267 ADD_OF_PORTS([br0], 1, 2, 3)
1268 ovs-vsctl \
1269         set Bridge br0 mirrors=@m --\
1270         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
1271         --id=@m create Mirror name=mymirror select_dst_port=@p2 output_port=@p3
1272
1273 AT_DATA([flows.txt], [dnl
1274 in_port=1 actions=output:2
1275 in_port=2 actions=output:1
1276 ])
1277 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1278
1279 flow="in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)"
1280 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1281 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1282   [Datapath actions: 2,3
1283 ])
1284
1285 flow="in_port(2),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)"
1286 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1287 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1288   [Datapath actions: 1
1289 ])
1290
1291 OVS_VSWITCHD_STOP
1292 AT_CLEANUP
1293
1294
1295 AT_SETUP([ofproto-dpif - mirroring, select_vlan])
1296 OVS_VSWITCHD_START
1297 ADD_OF_PORTS([br0], 1, 2, 3)
1298 ovs-vsctl \
1299         set Bridge br0 mirrors=@m --\
1300         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
1301         --id=@m create Mirror name=mymirror select_all=true select_vlan=11 output_port=@p3
1302
1303 AT_DATA([flows.txt], [dnl
1304 in_port=1, actions=output:2
1305 ])
1306 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1307
1308 flow="in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)"
1309 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1310 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1311   [Datapath actions: 2
1312 ])
1313
1314 flow="in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x8100),vlan(vid=10,pcp=0),encap(eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0))"
1315 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1316 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1317   [Datapath actions: 2
1318 ])
1319
1320 flow="in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x8100),vlan(vid=11,pcp=0),encap(eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0))"
1321 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1322 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1323   [Datapath actions: 2,3
1324 ])
1325
1326 OVS_VSWITCHD_STOP
1327 AT_CLEANUP
1328
1329
1330 AT_SETUP([ofproto-dpif - mirroring, output_port])
1331 OVS_VSWITCHD_START
1332 ADD_OF_PORTS([br0], 1, 2, 3)
1333 ovs-vsctl \
1334         set Bridge br0 mirrors=@m --\
1335         --id=@p3 get Port p3 --\
1336         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
1337
1338 AT_DATA([flows.txt], [dnl
1339 in_port=1 actions=mod_vlan_vid:17,output:2
1340 in_port=2 actions=output:1
1341 ])
1342 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1343
1344 flow="in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)"
1345 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1346 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1347   [Datapath actions: push_vlan(vid=17,pcp=0),2,pop_vlan,3
1348 ])
1349
1350 flow="in_port(2),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)"
1351 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1352 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1353   [Datapath actions: 1,3
1354 ])
1355
1356 OVS_VSWITCHD_STOP
1357 AT_CLEANUP
1358
1359 AT_SETUP([ofproto-dpif - mirroring, output_vlan])
1360 OVS_VSWITCHD_START
1361 ADD_OF_PORTS([br0], 1, 2)
1362 ovs-vsctl \
1363         set Bridge br0 mirrors=@m --\
1364         --id=@m create Mirror name=mymirror select_all=true output_vlan=12
1365
1366 AT_DATA([flows.txt], [dnl
1367 in_port=1 actions=output:2
1368 in_port=2 actions=mod_vlan_vid:17,output:1
1369 ])
1370 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1371
1372 flow="in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)"
1373 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1374 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1375
1376 expected="2,push_vlan(vid=12,pcp=0),1,2,100"
1377 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
1378 mv stdout expout
1379 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
1380
1381 flow="in_port(2),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)"
1382 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1383 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1384
1385 expected="push_vlan(vid=17,pcp=0),1,pop_vlan,push_vlan(vid=12,pcp=0),1,2,100"
1386 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
1387 mv stdout expout
1388 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
1389
1390 OVS_VSWITCHD_STOP
1391 AT_CLEANUP
1392
1393 # Two testcases below are for the ofproto/trace command
1394 # The first one tests all correct syntax:
1395 # ofproto/trace [dp_name] odp_flow [-generate|packet]
1396 # ofproto/trace br_name br_flow [-generate|packet]
1397 AT_SETUP([ofproto-dpif - ofproto/trace command 1])
1398 OVS_VSWITCHD_START([set bridge br0 fail-mode=standalone])
1399 ADD_OF_PORTS([br0], 1, 2, 3)
1400
1401 AT_DATA([flows.txt], [dnl
1402 in_port=1 actions=output:2
1403 in_port=2 actions=output:1
1404 ])
1405 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1406
1407 odp_flow="in_port(p1)"
1408 br_flow="in_port=1"
1409 # Test command: ofproto/trace odp_flow with in_port as a name.
1410 AT_CHECK([ovs-appctl ofproto/trace "$odp_flow"], [0], [stdout])
1411 AT_CHECK([tail -1 stdout], [0], [dnl
1412 Datapath actions: 2
1413 ])
1414
1415 odp_flow="in_port(1)"
1416 # Test command: ofproto/trace odp_flow
1417 AT_CHECK([ovs-appctl ofproto/trace "$odp_flow"], [0], [stdout])
1418 AT_CHECK([tail -1 stdout], [0], [dnl
1419 Datapath actions: 2
1420 ])
1421
1422 # Test command: ofproto/trace dp_name odp_flow
1423 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$odp_flow"], [0], [stdout])
1424 AT_CHECK([tail -1 stdout], [0], [dnl
1425 Datapath actions: 2
1426 ])
1427 # Test commmand: ofproto/trace br_name br_flow
1428 AT_CHECK([ovs-appctl ofproto/trace br0 "$br_flow"], [0], [stdout])
1429 AT_CHECK([tail -1 stdout], [0], [dnl
1430 Datapath actions: 2
1431 ])
1432
1433 # Delete the inserted flows
1434 AT_CHECK([ovs-ofctl del-flows br0 "in_port=1"], [0], [stdout])
1435 AT_CHECK([ovs-ofctl del-flows br0 "in_port=2"], [0], [stdout])
1436
1437 # This section beflow tests the [-generate] option
1438 odp_flow="in_port(3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff)"
1439 br_flow="arp,metadata=0,in_port=3,vlan_tci=0x0000,dl_src=50:54:00:00:00:05,dl_dst=ff:ff:ff:ff:ff:ff"
1440
1441 # Test command: ofproto/trace odp_flow
1442 AT_CHECK([ovs-appctl ofproto/trace "$odp_flow"], [0], [stdout])
1443 # Check for no MAC learning entry
1444 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1445  port  VLAN  MAC                Age
1446 ])
1447
1448 # Test command: ofproto/trace br_name br_flow
1449 AT_CHECK([ovs-appctl ofproto/trace br0 "$br_flow"], [0], [stdout])
1450 # Check for no MAC learning entry
1451 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1452  port  VLAN  MAC                Age
1453 ])
1454
1455 # Test command: ofproto/trace odp_flow -generate
1456 AT_CHECK([ovs-appctl ofproto/trace "$odp_flow" -generate], [0], [stdout])
1457 # Check for the MAC learning entry
1458 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1459  port  VLAN  MAC                Age
1460     3     0  50:54:00:00:00:05    ?
1461 ])
1462
1463 # Test command: ofproto/trace dp_name odp_flow -generate
1464 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy \
1465   "in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05)" \
1466   -generate], [0], [stdout])
1467 # Check for both MAC learning entries
1468 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1469  port  VLAN  MAC                Age
1470     3     0  50:54:00:00:00:05    ?
1471     1     0  50:54:00:00:00:06    ?
1472 ])
1473
1474 # Test command: ofproto/trace br_name br_flow -generate
1475 AT_CHECK([ovs-appctl ofproto/trace br0 \
1476   "in_port=2,dl_src=50:54:00:00:00:07,dl_dst=50:54:00:00:00:06" \
1477   -generate], [0], [stdout])
1478 # Check for both MAC learning entries.
1479 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1480  port  VLAN  MAC                Age
1481     3     0  50:54:00:00:00:05    ?
1482     1     0  50:54:00:00:00:06    ?
1483     2     0  50:54:00:00:00:07    ?
1484 ])
1485
1486 # This section beflow tests the [packet] option
1487 # The ovs-tcpundump of packets between port1 and port2
1488 pkt1to2="50540000000250540000000108064500001C000100004001F98CC0A80001C0A800020800F7FF00000000"
1489 pkt2to1="50540000000150540000000208064500001C000100004001F98CC0A80002C0A800010800F7FF00000000"
1490
1491 # Construct the MAC learning table
1492 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy \
1493   "in_port(1),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff)" \
1494   -generate], [0], [stdout])
1495
1496 # Construct the MAC learning table
1497 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy \
1498   "in_port(2),eth(src=50:54:00:00:00:02,dst=ff:ff:ff:ff:ff:ff)" \
1499   -generate], [0], [stdout])
1500
1501 # Test command: ofproto/trace odp_flow packet
1502 AT_CHECK([ovs-appctl ofproto/trace \
1503   "in_port(1),skb_priority(1),skb_mark(2)" "$pkt1to2"], [0], [stdout])
1504 AT_CHECK([tail -1 stdout], [0], [dnl
1505 Datapath actions: 2
1506 ])
1507 AT_CHECK([head -n 2 stdout], [0], [dnl
1508 Bridge: br0
1509 Flow: pkt_mark=0x2,skb_priority=0x1,arp,metadata=0,in_port=1,vlan_tci=0x0000,dl_src=50:54:00:00:00:01,dl_dst=50:54:00:00:00:02,arp_spa=0.0.0.0,arp_tpa=0.0.0.0,arp_sha=00:00:00:00:00:00,arp_tha=00:00:00:00:00:00
1510 ])
1511
1512 # Test command: ofproto/trace dp_name odp_flow packet
1513 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy \
1514   "in_port(1),skb_priority(1),skb_mark(2)" "$pkt1to2"], [0], [stdout])
1515 AT_CHECK([tail -1 stdout], [0], [dnl
1516 Datapath actions: 2
1517 ])
1518 AT_CHECK([head -n 2 stdout], [0], [dnl
1519 Bridge: br0
1520 Flow: pkt_mark=0x2,skb_priority=0x1,arp,metadata=0,in_port=1,vlan_tci=0x0000,dl_src=50:54:00:00:00:01,dl_dst=50:54:00:00:00:02,arp_spa=0.0.0.0,arp_tpa=0.0.0.0,arp_sha=00:00:00:00:00:00,arp_tha=00:00:00:00:00:00
1521 ])
1522
1523 # Test command: ofproto/trace br_name br_flow packet
1524 AT_CHECK([ovs-appctl ofproto/trace br0 \
1525   "in_port=2,skb_priority=2,pkt_mark=1" "$pkt2to1"], [0], [stdout],[stderr])
1526 AT_CHECK([tail -1 stdout], [0], [dnl
1527 Datapath actions: 1
1528 ])
1529 AT_CHECK([head -n 2 stdout], [0], [dnl
1530 Bridge: br0
1531 Flow: pkt_mark=0x1,skb_priority=0x2,arp,metadata=0,in_port=2,vlan_tci=0x0000,dl_src=50:54:00:00:00:02,dl_dst=50:54:00:00:00:01,arp_spa=0.0.0.0,arp_tpa=0.0.0.0,arp_sha=00:00:00:00:00:00,arp_tha=00:00:00:00:00:00
1532 ])
1533
1534 OVS_VSWITCHD_STOP
1535 AT_CLEANUP
1536
1537 # The second test tests the corner cases
1538 AT_SETUP([ofproto-dpif - ofproto/trace command 2])
1539 OVS_VSWITCHD_START
1540 ADD_OF_PORTS([br0], 1, 2)
1541
1542 # Define flows
1543 odp_flow="in_port(1),eth(src=50:54:00:00:00:01,dst=50:54:00:00:00:02)"
1544 br_flow="in_port=1,dl_src=50:54:00:00:00:01,dl_dst=50:54:00:00:00:02"
1545 # Define options
1546 generate="-generate"
1547 pkt="50540000000250540000000108064500001C000100004001F98CC0A80001C0A800020800F7FF00000000"
1548
1549 # Test incorrect command: ofproto/trace wrong_name odp_flow [-generate|packet]
1550 m4_foreach(
1551 [option],
1552 [[],
1553 ["$generate"],
1554 ["$pkt"]],
1555 [AT_CHECK([ovs-appctl ofproto/trace wrong_name "$odp_flow" option],
1556   [2], [], [stderr])
1557 AT_CHECK([tail -2 stderr], [0], [dnl
1558 Cannot find the datapath
1559 ovs-appctl: ovs-vswitchd: server returned an error
1560 ])])
1561
1562 # Test incorrect command: ofproto/trace empty_string odp_flow [-generate|packet]
1563 m4_foreach(
1564 [option],
1565 [[],
1566 ["$generate"],
1567 ["$pkt"]],
1568 [AT_CHECK([ovs-appctl ofproto/trace "" "$odp_flow" option],
1569   [2], [], [stderr])
1570 AT_CHECK([tail -2 stderr], [0], [dnl
1571 Cannot find the datapath
1572 ovs-appctl: ovs-vswitchd: server returned an error
1573 ])])
1574
1575 # Test incorrect command: ofproto/trace nonexist_dp_name odp_flow [-generate|packet]
1576 m4_foreach(
1577 [option],
1578 [[],
1579 ["$generate"],
1580 ["$pkt"]],
1581 [AT_CHECK([ovs-appctl ofproto/trace ovs-system "$odp_flow" option],
1582   [2], [], [stderr])
1583 AT_CHECK([tail -2 stderr], [0], [dnl
1584 Cannot find the datapath
1585 ovs-appctl: ovs-vswitchd: server returned an error
1586 ])])
1587
1588 # Test incorrect command: ofproto/trace br_name odp_flow [-generate|packet]
1589 m4_foreach(
1590 [option],
1591 [[],
1592 ["$generate"],
1593 ["$pkt"]],
1594 [AT_CHECK([ovs-appctl ofproto/trace br0 "$odp_flow" option],
1595   [2], [], [stderr])
1596 AT_CHECK([tail -2 stderr], [0], [dnl
1597 Cannot find the datapath
1598 ovs-appctl: ovs-vswitchd: server returned an error
1599 ])])
1600
1601 # Test incorrect command: ofproto/trace dp_name br_flow [-generate|packet]
1602 m4_foreach(
1603 [option],
1604 [[],
1605 ["$generate"],
1606 ["$pkt"]],
1607 [AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$br_flow" option],
1608   [2], [], [stderr])
1609 AT_CHECK([tail -2 stderr], [0], [dnl
1610 Unknown bridge name
1611 ovs-appctl: ovs-vswitchd: server returned an error
1612 ])])
1613
1614 # Test incorrect command: ofproto/trace br_flow [-generate|packet]
1615 m4_foreach(
1616 [option],
1617 [[],
1618 ["$generate"],
1619 ["$pkt"]],
1620 [AT_CHECK([ovs-appctl ofproto/trace "$br_flow" option],
1621   [2], [], [stderr])
1622 AT_CHECK([tail -2 stderr], [0], [dnl
1623 Must specify bridge name
1624 ovs-appctl: ovs-vswitchd: server returned an error
1625 ])])
1626
1627 # Test incorrect command: ofproto/trace dp_name odp_flow garbage_option
1628 AT_CHECK([ovs-appctl ofproto/trace \
1629   ovs-dummy "$odp_flow" garbage_option],
1630   [2], [stdout],[stderr])
1631 AT_CHECK([tail -2 stderr], [0], [dnl
1632 Trailing garbage in packet data
1633 ovs-appctl: ovs-vswitchd: server returned an error
1634 ])
1635
1636 # Test incorrect command: ofproto/trace with 4 arguments
1637 AT_CHECK([ovs-appctl ofproto/trace \
1638   arg1, arg2, arg3, arg4], [2], [stdout],[stderr])
1639 AT_CHECK([tail -2 stderr], [0], [dnl
1640 "ofproto/trace" command takes at most 3 arguments
1641 ovs-appctl: ovs-vswitchd: server returned an error
1642 ])
1643
1644 # Test incorrect command: ofproto/trace with 0 argument
1645 AT_CHECK([ovs-appctl ofproto/trace ], [2], [stdout],[stderr])
1646 AT_CHECK([tail -2 stderr], [0], [dnl
1647 "ofproto/trace" command requires at least 1 arguments
1648 ovs-appctl: ovs-vswitchd: server returned an error
1649 ])
1650
1651 OVS_VSWITCHD_STOP
1652 AT_CLEANUP
1653
1654 AT_SETUP([ofproto-dpif - ofproto/trace-packet-out])
1655 OVS_VSWITCHD_START
1656 ADD_OF_PORTS([br0], 1, 2, 3)
1657
1658 AT_DATA([flows.txt], [dnl
1659 in_port=1 actions=output:2
1660 in_port=2 actions=output:1
1661 ])
1662 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1663
1664 AT_CHECK([ovs-appctl ofproto/trace-packet-out br0 in_port=1 'mod_vlan_vid:123,resubmit(,0)'], [0], [stdout])
1665 AT_CHECK([tail -1 stdout], [0], [dnl
1666 Datapath actions: push_vlan(vid=123,pcp=0),2
1667 ])
1668
1669 OVS_VSWITCHD_STOP
1670 AT_CLEANUP
1671
1672
1673 m4_define([OFPROTO_TRACE],
1674   [flow="$2"
1675    AT_CHECK([ovs-appctl ofproto/trace $1 "$flow" $3], [0], [stdout])
1676    actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1677    expected="$4"
1678    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" $5],
1679      [0], [stdout])
1680    mv stdout expout
1681    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" $5],
1682      [0], [expout])])
1683
1684 AT_SETUP([ofproto-dpif - MAC learning])
1685 OVS_VSWITCHD_START([set bridge br0 fail-mode=standalone])
1686 ADD_OF_PORTS([br0], 1, 2, 3)
1687
1688 arp='eth_type(0x0806),arp(sip=192.168.0.1,tip=192.168.0.2,op=1,sha=50:54:00:00:00:05,tha=00:00:00:00:00:00)'
1689
1690 # Trace an ARP packet arriving on p3, to create a MAC learning entry.
1691 OFPROTO_TRACE(
1692   [ovs-dummy],
1693   [in_port(3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
1694   [-generate],
1695   [1,2,100])
1696
1697 # Check for the MAC learning entry.
1698 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1699  port  VLAN  MAC                Age
1700     3     0  50:54:00:00:00:05    ?
1701 ])
1702
1703 # Trace a packet arrival destined for the learned MAC.
1704 # (This will also learn a MAC.)
1705 OFPROTO_TRACE(
1706   [ovs-dummy],
1707   [in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05),$arp],
1708   [-generate],
1709   [3])
1710
1711 # Check for both MAC learning entries.
1712 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1713  port  VLAN  MAC                Age
1714     3     0  50:54:00:00:00:05    ?
1715     1     0  50:54:00:00:00:06    ?
1716 ])
1717
1718 # Trace a packet arrival that updates the first learned MAC entry.
1719 OFPROTO_TRACE(
1720   [ovs-dummy],
1721   [in_port(2),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
1722   [-generate],
1723   [1,3,100])
1724
1725 # Check that the MAC learning entry was updated.
1726 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1727  port  VLAN  MAC                Age
1728     1     0  50:54:00:00:00:06    ?
1729     2     0  50:54:00:00:00:05    ?
1730 ])
1731
1732 # Add another bridge.
1733 AT_CHECK(
1734   [ovs-vsctl \
1735      -- add-br br1 \
1736      -- set bridge br1 datapath-type=dummy])
1737 ADD_OF_PORTS([br1], 4, 5)
1738
1739 # Trace some packet arrivals in br1 to create MAC learning entries there too.
1740 OFPROTO_TRACE(
1741   [ovs-dummy],
1742   [in_port(4),eth(src=50:54:00:00:00:06,dst=ff:ff:ff:ff:ff:ff),$arp],
1743   [-generate],
1744   [5,101])
1745 OFPROTO_TRACE(
1746   [ovs-dummy],
1747   [in_port(5),eth(src=50:54:00:00:00:07,dst=ff:ff:ff:ff:ff:ff),$arp],
1748   [-generate],
1749   [4,101])
1750
1751 # Check that the MAC learning entries were added.
1752 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1753  port  VLAN  MAC                Age
1754     4     0  50:54:00:00:00:06    ?
1755     5     0  50:54:00:00:00:07    ?
1756 ])
1757
1758 # Delete port p1 and see that its MAC learning entry disappeared, and
1759 # that the MAC learning entry for the same MAC was also deleted from br1.
1760 AT_CHECK([ovs-vsctl del-port p1])
1761 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1762  port  VLAN  MAC                Age
1763     2     0  50:54:00:00:00:05    ?
1764 ])
1765 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1766  port  VLAN  MAC                Age
1767     5     0  50:54:00:00:00:07    ?
1768 ])
1769
1770 OVS_VSWITCHD_STOP
1771 AT_CLEANUP
1772
1773 AT_SETUP([ofproto-dpif - MAC table overflow])
1774 OVS_VSWITCHD_START(
1775   [set bridge br0 fail-mode=standalone other-config:mac-table-size=10])
1776 ADD_OF_PORTS([br0], 1, 2, 3)
1777
1778 arp='eth_type(0x0806),arp(sip=192.168.0.1,tip=192.168.0.2,op=1,sha=50:54:00:00:00:05,tha=00:00:00:00:00:00)'
1779
1780 AT_CHECK([ovs-appctl time/stop])
1781
1782 # Trace 10 ARP packets arriving on p3, to create MAC learning entries.
1783 for i in 0 1 2 3 4 5 6 7 8 9; do
1784     OFPROTO_TRACE(
1785       [ovs-dummy],
1786       [in_port(3),eth(src=50:54:00:00:00:0$i,dst=ff:ff:ff:ff:ff:ff),$arp],
1787       [-generate],
1788       [1,2,100])
1789     ovs-appctl time/warp 1000
1790 done
1791
1792 # Check for the MAC learning entries.
1793 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/ *[[0-9]]\{1,\}$//' | sort],
1794   [0], [dnl
1795     3     0  50:54:00:00:00:00
1796     3     0  50:54:00:00:00:01
1797     3     0  50:54:00:00:00:02
1798     3     0  50:54:00:00:00:03
1799     3     0  50:54:00:00:00:04
1800     3     0  50:54:00:00:00:05
1801     3     0  50:54:00:00:00:06
1802     3     0  50:54:00:00:00:07
1803     3     0  50:54:00:00:00:08
1804     3     0  50:54:00:00:00:09
1805  port  VLAN  MAC                Age
1806 ])
1807
1808 # Trace another ARP packet on another MAC.
1809 OFPROTO_TRACE(
1810   [ovs-dummy],
1811   [in_port(3),eth(src=50:54:00:00:00:10,dst=ff:ff:ff:ff:ff:ff),$arp],
1812   [-generate],
1813   [1,2,100])
1814
1815 # Check that the new one chased the oldest one out of the table.
1816 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/' | sort],
1817   [0], [dnl
1818     3     0  50:54:00:00:00:01    ?
1819     3     0  50:54:00:00:00:02    ?
1820     3     0  50:54:00:00:00:03    ?
1821     3     0  50:54:00:00:00:04    ?
1822     3     0  50:54:00:00:00:05    ?
1823     3     0  50:54:00:00:00:06    ?
1824     3     0  50:54:00:00:00:07    ?
1825     3     0  50:54:00:00:00:08    ?
1826     3     0  50:54:00:00:00:09    ?
1827     3     0  50:54:00:00:00:10    ?
1828  port  VLAN  MAC                Age
1829 ])
1830 OVS_VSWITCHD_STOP
1831 AT_CLEANUP
1832
1833 # CHECK_SFLOW_SAMPLING_PACKET(LOOPBACK_ADDR, ADDR_WITHOUT_BRACKETS)
1834 #
1835 # Test that sFlow samples packets correctly using IPv4/IPv6 sFlow collector
1836 #
1837 # IP_VERSION_TYPE is used in AT_SETUP
1838 m4_define([CHECK_SFLOW_SAMPLING_PACKET],
1839   [AT_SETUP([ofproto-dpif - sFlow packet sampling - $2 collector])
1840   OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
1841
1842   ON_EXIT([kill `cat test-sflow.pid`])
1843   AT_CHECK([test-sflow --log-file --detach --no-chdir --pidfile 0:$1 > sflow.log], [0], [], [ignore])
1844   AT_CAPTURE_FILE([sflow.log])
1845   SFLOW_PORT=`parse_listening_port < test-sflow.log`
1846   ovs-appctl time/stop
1847
1848   ADD_OF_PORTS([br0], 1, 2)
1849   ovs-vsctl \
1850      set Interface br0 options:ifindex=1002 -- \
1851      set Interface p1 options:ifindex=1004 -- \
1852      set Interface p2 options:ifindex=1003 -- \
1853      set Bridge br0 sflow=@sf -- \
1854      --id=@sf create sflow targets=\"$1:$SFLOW_PORT\" \
1855        header=128 sampling=1 polling=1 agent=lo
1856
1857   dnl open with ARP packets to seed the bridge-learning.  The output
1858   dnl ifIndex numbers should be reported predictably after that.
1859   dnl Since we set sampling=1 we should see all of these packets
1860   dnl reported. Sorting the output by data-source and seqNo makes
1861   dnl it deterministic. Ensuring that we send at least two packets
1862   dnl into each port means we get to check the seq nos are
1863   dnl incrementing correctly.
1864   dnl because packets from different ports can be handled by separate
1865   dnl threads, put some sleeps
1866
1867   ovs-appctl netdev-dummy/receive p1 'in_port(2),eth(src=50:54:00:00:00:05,dst=FF:FF:FF:FF:FF:FF),eth_type(0x0806),arp(sip=192.168.0.2,tip=192.168.0.1,op=1,sha=50:54:00:00:00:05,tha=00:00:00:00:00:00)'
1868   sleep 1
1869   ovs-appctl netdev-dummy/receive p2 'in_port(1),eth(src=50:54:00:00:00:07,dst=FF:FF:FF:FF:FF:FF),eth_type(0x0806),arp(sip=192.168.0.1,tip=192.168.0.2,op=1,sha=50:54:00:00:00:07,tha=00:00:00:00:00:00)'
1870   sleep 1
1871   ovs-appctl netdev-dummy/receive p1 'in_port(2),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'
1872   sleep 1
1873   ovs-appctl netdev-dummy/receive p2 'in_port(1),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x0800),ipv4(src=192.168.0.2,dst=192.168.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=0,code=0)'
1874   ovs-appctl netdev-dummy/receive p2 'in_port(1),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x86dd),ipv6(src=fe80::1,dst=fe80::2,label=0,proto=10,tclass=0x70,hlimit=128,frag=no)'
1875
1876   dnl sleep long enough to get more than one counter sample
1877   dnl from each datasource so we can check sequence numbers
1878   for i in `seq 1 30`; do
1879       ovs-appctl time/warp 100
1880   done
1881   OVS_VSWITCHD_STOP
1882   ovs-appctl -t test-sflow exit
1883
1884   AT_CHECK_UNQUOTED([[sort sflow.log | $EGREP 'HEADER|ERROR' | sed 's/ /\
1885         /g']], [0], [dnl
1886 HEADER
1887         dgramSeqNo=1
1888         ds=127.0.0.1>2:1000
1889         fsSeqNo=1
1890         in_vlan=0
1891         in_priority=0
1892         out_vlan=0
1893         out_priority=0
1894         meanSkip=1
1895         samplePool=1
1896         dropEvents=0
1897         in_ifindex=1004
1898         in_format=0
1899         out_ifindex=2
1900         out_format=2
1901         hdr_prot=1
1902         pkt_len=64
1903         stripped=4
1904         hdr_len=60
1905         hdr=FF-FF-FF-FF-FF-FF-50-54-00-00-00-05-08-06-00-01-08-00-06-04-00-01-50-54-00-00-00-05-C0-A8-00-02-00-00-00-00-00-00-C0-A8-00-01-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
1906 HEADER
1907         dgramSeqNo=1
1908         ds=127.0.0.1>2:1000
1909         fsSeqNo=2
1910         in_vlan=0
1911         in_priority=0
1912         out_vlan=0
1913         out_priority=0
1914         meanSkip=1
1915         samplePool=2
1916         dropEvents=0
1917         in_ifindex=1003
1918         in_format=0
1919         out_ifindex=2
1920         out_format=2
1921         hdr_prot=1
1922         pkt_len=64
1923         stripped=4
1924         hdr_len=60
1925         hdr=FF-FF-FF-FF-FF-FF-50-54-00-00-00-07-08-06-00-01-08-00-06-04-00-01-50-54-00-00-00-07-C0-A8-00-01-00-00-00-00-00-00-C0-A8-00-02-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
1926 HEADER
1927         dgramSeqNo=1
1928         ds=127.0.0.1>2:1000
1929         fsSeqNo=3
1930         in_vlan=0
1931         in_priority=0
1932         out_vlan=0
1933         out_priority=0
1934         meanSkip=1
1935         samplePool=3
1936         dropEvents=0
1937         in_ifindex=1004
1938         in_format=0
1939         out_ifindex=1003
1940         out_format=0
1941         hdr_prot=1
1942         pkt_len=64
1943         stripped=4
1944         hdr_len=60
1945         hdr=50-54-00-00-00-07-50-54-00-00-00-05-08-00-45-00-00-1C-00-00-00-00-40-01-F9-8D-C0-A8-00-01-C0-A8-00-02-08-00-F7-FF-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
1946 HEADER
1947         dgramSeqNo=1
1948         ds=127.0.0.1>2:1000
1949         fsSeqNo=4
1950         in_vlan=0
1951         in_priority=0
1952         out_vlan=0
1953         out_priority=0
1954         meanSkip=1
1955         samplePool=4
1956         dropEvents=0
1957         in_ifindex=1003
1958         in_format=0
1959         out_ifindex=1004
1960         out_format=0
1961         hdr_prot=1
1962         pkt_len=64
1963         stripped=4
1964         hdr_len=60
1965         hdr=50-54-00-00-00-05-50-54-00-00-00-07-08-00-45-00-00-1C-00-00-00-00-40-01-F9-8D-C0-A8-00-02-C0-A8-00-01-00-00-FF-FF-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
1966 HEADER
1967         dgramSeqNo=1
1968         ds=127.0.0.1>2:1000
1969         fsSeqNo=5
1970         in_vlan=0
1971         in_priority=0
1972         out_vlan=0
1973         out_priority=0
1974         meanSkip=1
1975         samplePool=5
1976         dropEvents=0
1977         in_ifindex=1003
1978         in_format=0
1979         out_ifindex=1004
1980         out_format=0
1981         hdr_prot=1
1982         pkt_len=64
1983         stripped=4
1984         hdr_len=60
1985         hdr=50-54-00-00-00-05-50-54-00-00-00-07-86-DD-67-00-00-00-00-00-0A-80-FE-80-00-00-00-00-00-00-00-00-00-00-00-00-00-01-FE-80-00-00-00-00-00-00-00-00-00-00-00-00-00-02-00-00-00-00-00-00
1986 ])
1987
1988   AT_CHECK_UNQUOTED([[sort sflow.log | $EGREP 'IFCOUNTERS|ERROR' | head -6 | sed 's/ /\
1989         /g']], [0], [dnl
1990 IFCOUNTERS
1991         dgramSeqNo=2
1992         ds=127.0.0.1>0:1002
1993         csSeqNo=1
1994         ifindex=1002
1995         type=6
1996         ifspeed=100000000
1997         direction=0
1998         status=3
1999         in_octets=0
2000         in_unicasts=0
2001         in_multicasts=0
2002         in_broadcasts=4294967295
2003         in_discards=0
2004         in_errors=0
2005         in_unknownprotos=4294967295
2006         out_octets=120
2007         out_unicasts=2
2008         out_multicasts=4294967295
2009         out_broadcasts=4294967295
2010         out_discards=0
2011         out_errors=0
2012         promiscuous=0
2013 IFCOUNTERS
2014         dgramSeqNo=2
2015         ds=127.0.0.1>0:1003
2016         csSeqNo=1
2017         ifindex=1003
2018         type=6
2019         ifspeed=100000000
2020         direction=0
2021         status=0
2022         in_octets=138
2023         in_unicasts=3
2024         in_multicasts=0
2025         in_broadcasts=4294967295
2026         in_discards=0
2027         in_errors=0
2028         in_unknownprotos=4294967295
2029         out_octets=120
2030         out_unicasts=2
2031         out_multicasts=4294967295
2032         out_broadcasts=4294967295
2033         out_discards=0
2034         out_errors=0
2035         promiscuous=0
2036 IFCOUNTERS
2037         dgramSeqNo=2
2038         ds=127.0.0.1>0:1004
2039         csSeqNo=1
2040         ifindex=1004
2041         type=6
2042         ifspeed=100000000
2043         direction=0
2044         status=0
2045         in_octets=84
2046         in_unicasts=2
2047         in_multicasts=0
2048         in_broadcasts=4294967295
2049         in_discards=0
2050         in_errors=0
2051         in_unknownprotos=4294967295
2052         out_octets=180
2053         out_unicasts=3
2054         out_multicasts=4294967295
2055         out_broadcasts=4294967295
2056         out_discards=0
2057         out_errors=0
2058         promiscuous=0
2059 IFCOUNTERS
2060         dgramSeqNo=3
2061         ds=127.0.0.1>0:1002
2062         csSeqNo=2
2063         ifindex=1002
2064         type=6
2065         ifspeed=100000000
2066         direction=0
2067         status=3
2068         in_octets=0
2069         in_unicasts=0
2070         in_multicasts=0
2071         in_broadcasts=4294967295
2072         in_discards=0
2073         in_errors=0
2074         in_unknownprotos=4294967295
2075         out_octets=120
2076         out_unicasts=2
2077         out_multicasts=4294967295
2078         out_broadcasts=4294967295
2079         out_discards=0
2080         out_errors=0
2081         promiscuous=0
2082 IFCOUNTERS
2083         dgramSeqNo=3
2084         ds=127.0.0.1>0:1003
2085         csSeqNo=2
2086         ifindex=1003
2087         type=6
2088         ifspeed=100000000
2089         direction=0
2090         status=0
2091         in_octets=138
2092         in_unicasts=3
2093         in_multicasts=0
2094         in_broadcasts=4294967295
2095         in_discards=0
2096         in_errors=0
2097         in_unknownprotos=4294967295
2098         out_octets=120
2099         out_unicasts=2
2100         out_multicasts=4294967295
2101         out_broadcasts=4294967295
2102         out_discards=0
2103         out_errors=0
2104         promiscuous=0
2105 IFCOUNTERS
2106         dgramSeqNo=3
2107         ds=127.0.0.1>0:1004
2108         csSeqNo=2
2109         ifindex=1004
2110         type=6
2111         ifspeed=100000000
2112         direction=0
2113         status=0
2114         in_octets=84
2115         in_unicasts=2
2116         in_multicasts=0
2117         in_broadcasts=4294967295
2118         in_discards=0
2119         in_errors=0
2120         in_unknownprotos=4294967295
2121         out_octets=180
2122         out_unicasts=3
2123         out_multicasts=4294967295
2124         out_broadcasts=4294967295
2125         out_discards=0
2126         out_errors=0
2127         promiscuous=0
2128 ])
2129   AT_CLEANUP])
2130
2131 CHECK_SFLOW_SAMPLING_PACKET([127.0.0.1], [IPv4])
2132 CHECK_SFLOW_SAMPLING_PACKET([[[::1]]], [IPv6])
2133
2134 # CHECK_NETFLOW_EXPIRATION(LOOPBACK_ADDR, IP_VERSION_TYPE)
2135 #
2136 # Test that basic NetFlow reports flow statistics correctly:
2137 # The initial packet of a flow are correctly accounted.
2138 # Later packets within a flow are correctly accounted.
2139 # Flow actions changing (in this case, due to MAC learning)
2140 # cause a record to be sent.
2141 #
2142 # IP_VERSION_TYPE is used in AT_SETUP
2143 m4_define([CHECK_NETFLOW_EXPIRATION],
2144   [AT_SETUP([ofproto-dpif - NetFlow flow expiration - $2 collector])
2145   OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
2146   ADD_OF_PORTS([br0], 1, 2)
2147
2148   ovs-appctl time/stop
2149   ON_EXIT([kill `cat test-netflow.pid`])
2150   AT_CHECK([test-netflow --log-file --detach --no-chdir --pidfile 0:$1 > netflow.log], [0], [], [ignore])
2151   AT_CAPTURE_FILE([netflow.log])
2152   NETFLOW_PORT=`parse_listening_port < test-netflow.log`
2153
2154   ovs-vsctl \
2155      set Bridge br0 netflow=@nf -- \
2156      --id=@nf create NetFlow targets=\"$1:$NETFLOW_PORT\" \
2157        engine_id=1 engine_type=2 active_timeout=30 add-id-to-interface=false
2158
2159   for delay in 1000 30000; do
2160       ovs-appctl netdev-dummy/receive p1 'in_port(2),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'
2161       ovs-appctl netdev-dummy/receive p2 'in_port(1),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x0800),ipv4(src=192.168.0.2,dst=192.168.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=0,code=0)'
2162
2163       ovs-appctl time/warp $delay
2164   done
2165
2166   ovs-appctl time/warp 6000
2167   sleep 1
2168   OVS_VSWITCHD_STOP
2169   ovs-appctl -t test-netflow exit
2170
2171   AT_CHECK([test `grep "192.168.0.1 > 192.168.0.2, if 1 > 65535, 1 pkts, 60 bytes, ICMP 8:0" netflow.log | wc -l` -eq 1])
2172
2173   AT_CHECK([test `grep "192.168.0.1 > 192.168.0.2, if 1 > 2, 1 pkts, 60 bytes, ICMP 8:0" netflow.log | wc -l` -eq 1])
2174
2175   combined=`grep "192.168.0.2 > 192.168.0.1, if 2 > 1, 2 pkts, 120 bytes, ICMP 0:0" netflow.log | wc -l`
2176   separate=`grep "192.168.0.2 > 192.168.0.1, if 2 > 1, 1 pkts, 60 bytes, ICMP 0:0" netflow.log | wc -l`
2177   AT_CHECK([test $separate = 2 || test $combined = 1], [0])
2178
2179   AT_CLEANUP])
2180
2181 CHECK_NETFLOW_EXPIRATION([127.0.0.1], [IPv4])
2182 CHECK_NETFLOW_EXPIRATION([[[::1]]], [IPv6])
2183
2184 # CHECK_NETFLOW_ACTIVE_EXPIRATION(LOOPBACK_ADDR, IP_VERSION_TYPE)
2185 #
2186 # Test that basic NetFlow reports active expirations correctly.
2187 #
2188 # IP_VERSION_TYPE is used in AT_SETUP
2189 m4_define([CHECK_NETFLOW_ACTIVE_EXPIRATION],
2190   [AT_SETUP([ofproto-dpif - NetFlow active expiration - $2 collector])
2191
2192   OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
2193   ADD_OF_PORTS([br0], 1, 2)
2194
2195   ON_EXIT([kill `cat test-netflow.pid`])
2196   AT_CHECK([test-netflow --log-file --detach --no-chdir --pidfile 0:$1 > netflow.log], [0], [], [ignore])
2197   AT_CAPTURE_FILE([netflow.log])
2198   NETFLOW_PORT=`parse_listening_port < test-netflow.log`
2199
2200   ovs-vsctl \
2201      set Bridge br0 netflow=@nf -- \
2202      --id=@nf create NetFlow targets=\"$1:$NETFLOW_PORT\" \
2203        engine_id=1 engine_type=2 active_timeout=10 add-id-to-interface=false
2204
2205   AT_CHECK([ovs-appctl time/stop])
2206   n=1
2207   while test $n -le 60; do
2208       n=`expr $n + 1`
2209
2210       ovs-appctl netdev-dummy/receive p1 'in_port(2),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=1234,dst=80)'
2211       ovs-appctl netdev-dummy/receive p2 'in_port(1),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x0800),ipv4(src=192.168.0.2,dst=192.168.0.1,proto=6,tos=0,ttl=64,frag=no),tcp(src=80,dst=1234)'
2212
2213       ovs-appctl time/warp 1000
2214   done
2215
2216   ovs-appctl time/warp 10000
2217
2218   sleep 1
2219   OVS_VSWITCHD_STOP
2220   ovs-appctl -t test-netflow exit
2221
2222   # Count the number of reported packets:
2223   # - From source to destination before MAC learning kicks in (just one).
2224   # - From source to destination after that.
2225   # - From destination to source.
2226   n_learn=0
2227   n_in=0
2228   n_out=0
2229   n_other=0
2230   n_recs=0
2231   none=0
2232   while read line; do
2233       pkts=`echo "$line" | sed 's/.*, \([[0-9]]*\) pkts,.*/\1/'`
2234       case $pkts in
2235            [[0-9]]*) ;;
2236        *) continue ;;
2237       esac
2238
2239       case $line in
2240           "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 65535, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
2241               counter=n_learn
2242           ;;
2243       "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 2, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
2244           counter=n_in
2245           ;;
2246       "seq "*": 192.168.0.2 > 192.168.0.1, if 2 > 1, "*" pkts, "*" bytes, TCP 80 > 1234, time "*)
2247           counter=n_out
2248           ;;
2249       *)
2250           counter=n_other
2251           ;;
2252       esac
2253       eval $counter=\`expr \$$counter + \$pkts\`
2254       n_recs=`expr $n_recs + 1`
2255   done < netflow.log
2256
2257   # There should be exactly 1 MAC learning packet,
2258   # exactly 59 other packets in that direction,
2259   # and exactly 60 packets in the other direction.
2260   AT_CHECK([echo $n_learn $n_in $n_out $n_other], [0], [1 59 60 0
2261 ])
2262
2263   AT_CLEANUP])
2264
2265 CHECK_NETFLOW_ACTIVE_EXPIRATION([127.0.0.1], [IPv4])
2266 CHECK_NETFLOW_ACTIVE_EXPIRATION([[[::1]]], [IPv6])
2267
2268 AT_SETUP([idle_age and hard_age increase over time])
2269 OVS_VSWITCHD_START
2270
2271 # get_ages DURATION HARD IDLE
2272 #
2273 # Fetch the flow duration, hard age, and idle age into the variables
2274 # whose names are given as arguments.  Rounds DURATION down to the
2275 # nearest integer.  If hard_age doesn't appear in the output, sets
2276 # HARD to "none".  If idle_age doesn't appear in the output, sets IDLE
2277 # to 0.
2278 get_ages () {
2279     AT_CHECK([ovs-ofctl dump-flows br0], [0], [stdout])
2280
2281     duration=`sed -n 's/.*duration=\([[0-9]]*\)\(\.[[0-9]]*\)\{0,1\}s.*/\1/p' stdout`
2282     AT_CHECK([[expr X"$duration" : 'X[0-9][0-9]*$']], [0], [ignore])
2283     AS_VAR_COPY([$1], [duration])
2284
2285     hard=`sed -n 's/.*hard_age=\([[0-9]]*\),.*/\1/p' stdout`
2286     if test X"$hard" = X; then
2287         hard=none
2288     else
2289         AT_CHECK([[expr X"$hard" : 'X[0-9][0-9]*$']], [0], [ignore])
2290     fi
2291     AS_VAR_COPY([$2], [hard])
2292
2293     idle=`sed -n 's/.*idle_age=\([[0-9]]*\),.*/\1/p' stdout`
2294     if test X"$idle" = X; then
2295         idle=0
2296     else
2297         AT_CHECK([[expr X"$idle" : 'X[0-9][0-9]*$']], [0], [ignore])
2298     fi
2299     AS_VAR_COPY([$3], [idle])
2300 }
2301
2302 # Add a flow and get its initial hard and idle age.
2303 AT_CHECK([ovs-ofctl add-flow br0 hard_timeout=199,idle_timeout=188,actions=drop])
2304 get_ages duration1 hard1 idle1
2305
2306 ovs-appctl time/stop
2307 # Warp time forward by 10 seconds, then modify the flow's actions.
2308 ovs-appctl time/warp 10000
2309 get_ages duration2 hard2 idle2
2310 AT_CHECK([ovs-ofctl mod-flows br0 actions=flood])
2311
2312 # Warp time forward by 10 seconds.
2313 ovs-appctl time/warp 10000
2314 get_ages duration3 hard3 idle3
2315
2316 # Warp time forward 10 more seconds, then pass some packets through the flow,
2317 # then warp forward a few more times because idle times are only updated
2318 # occasionally.
2319 ovs-appctl time/warp 10000
2320 ovs-appctl netdev-dummy/receive br0 'in_port(0),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x0800),ipv4(src=192.168.0.2,dst=192.168.0.1,proto=6,tos=0,ttl=64,frag=no),tcp(src=80,dst=1234)'
2321 ovs-appctl time/warp 1000
2322 ovs-appctl time/warp 1000
2323 ovs-appctl time/warp 1000
2324 get_ages duration4 hard4 idle4
2325
2326 printf "duration: %4s => %4s => %4s => %4s\n" $duration1 $duration2 $duration3 $duration4
2327 printf "hard_age: %4s => %4s => %4s => %4s\n" $hard1 $hard2 $hard3 $hard4
2328 printf "idle_age: %4s => %4s => %4s => %4s\n" $idle1 $idle2 $idle3 $idle4
2329
2330 # Duration should increase steadily over time.
2331 AT_CHECK([test $duration1 -lt $duration2])
2332 AT_CHECK([test $duration2 -lt $duration3])
2333 AT_CHECK([test $duration3 -lt $duration4])
2334
2335 # Hard age should be "none" initially because it's the same as flow_duration,
2336 # then it should increase.
2337 AT_CHECK([test $hard1 = none])
2338 AT_CHECK([test $hard2 = none])
2339 AT_CHECK([test $hard3 != none])
2340 AT_CHECK([test $hard4 != none])
2341 AT_CHECK([test $hard3 -lt $hard4])
2342
2343 # Idle age should increase from 1 to 2 to 3, then decrease.
2344 AT_CHECK([test $idle1 -lt $idle2])
2345 AT_CHECK([test $idle2 -lt $idle3])
2346 AT_CHECK([test $idle3 -gt $idle4])
2347
2348 # Check some invariant relationships.
2349 AT_CHECK([test $duration1 = $idle1])
2350 AT_CHECK([test $duration2 = $idle2])
2351 AT_CHECK([test $duration3 = $idle3])
2352 AT_CHECK([test $idle3 -gt $hard3])
2353 AT_CHECK([test $idle4 -lt $hard4])
2354 AT_CHECK([test $hard4 -lt $duration4])
2355
2356 OVS_VSWITCHD_STOP
2357 AT_CLEANUP
2358
2359 AT_SETUP([ofproto-dpif - fin_timeout])
2360 OVS_VSWITCHD_START
2361 AT_DATA([flows.txt], [dnl
2362 in_port=1 actions=output:2
2363 in_port=2 actions=mod_vlan_vid:17,output:1
2364 ])
2365 AT_CHECK([ovs-ofctl add-flow br0 'idle_timeout=60,actions=fin_timeout(idle_timeout=5)'])
2366 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
2367 [NXST_FLOW reply:
2368  idle_timeout=60, actions=fin_timeout(idle_timeout=5)
2369 ])
2370
2371 ovs-appctl time/stop
2372 # Check that a TCP SYN packet does not change the timeout.  (Because
2373 # flow stats updates are mainly what implements the fin_timeout
2374 # feature, we warp forward a couple of times to ensure that flow stats
2375 # run before re-checking the flow table.)
2376 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f908004500003c2e2440004006465dac11370dac11370b828b0016751e267b00000000a00216d017360000020405b40402080a2d25085f0000000001030307])
2377 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
2378 warped
2379 ])
2380 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
2381 [NXST_FLOW reply:
2382  n_packets=1, n_bytes=74, idle_timeout=60, actions=fin_timeout(idle_timeout=5)
2383 ])
2384 # Check that a TCP FIN packet does change the timeout.
2385 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f90800451000342e3e40004006463bac11370dac11370b828b0016751e319dfc96399b801100717ae800000101080a2d250a9408579588])
2386 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
2387 warped
2388 ])
2389 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
2390 [NXST_FLOW reply:
2391  n_packets=2, n_bytes=140, idle_timeout=5, actions=fin_timeout(idle_timeout=5)
2392 ])
2393 OVS_VSWITCHD_STOP
2394 AT_CLEANUP
2395
2396 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-dps])
2397 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
2398 ADD_OF_PORTS([br0], [1], [2])
2399 ADD_OF_PORTS([br1], [3])
2400
2401 AT_CHECK([ovs-appctl dpif/dump-dps], [0], [dnl
2402 dummy@br0
2403 dummy@br1
2404 ])
2405 OVS_VSWITCHD_STOP
2406 AT_CLEANUP
2407
2408 AT_SETUP([ofproto-dpif - ovs-appctl dpif/show])
2409 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
2410 ADD_OF_PORTS([br0], [1], [2])
2411 ADD_OF_PORTS([br1], [3])
2412
2413 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
2414 dummy@ovs-dummy: hit:0 missed:0
2415         br0:
2416                 br0 65534/100: (dummy)
2417                 p1 1/1: (dummy)
2418                 p2 2/2: (dummy)
2419         br1:
2420                 br1 65534/101: (dummy)
2421                 p3 3/3: (dummy)
2422 ])
2423 OVS_VSWITCHD_STOP
2424 AT_CLEANUP
2425
2426 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-flows])
2427 OVS_VSWITCHD_START([add-br br1 -- \
2428                     set bridge br1 datapath-type=dummy fail-mode=secure])
2429 ADD_OF_PORTS([br0], [1], [2])
2430 ADD_OF_PORTS([br1], [3])
2431
2432 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2433 AT_CHECK([ovs-appctl netdev-dummy/receive p2 'in_port(2),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x0800),ipv4(src=192.168.0.2,dst=192.168.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=0,code=0)'])
2434 AT_CHECK([ovs-appctl netdev-dummy/receive p3 'in_port(3),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2435
2436 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
2437 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=192.168.0.1/0.0.0.0,dst=192.168.0.2/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions:userspace(pid=0,slow_path(controller))
2438 skb_priority(0),in_port(2),eth_type(0x0800),ipv4(src=192.168.0.2/0.0.0.0,dst=192.168.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions:userspace(pid=0,slow_path(controller))
2439 ])
2440
2441 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
2442 skb_priority(0),in_port(3),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions:userspace(pid=0,slow_path(controller))
2443 ])
2444
2445 AT_CHECK([ovs-appctl dpif/dump-flows -m br0 | sort | STRIP_USED], [0], [dnl
2446 skb_priority(0),skb_mark(0/0),in_port(p1),eth(src=50:54:00:00:00:05/00:00:00:00:00:00,dst=50:54:00:00:00:07/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=192.168.0.1/0.0.0.0,dst=192.168.0.2/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff),icmp(type=8/0,code=0/0), packets:0, bytes:0, used:never, actions:userspace(pid=0,slow_path(controller))
2447 skb_priority(0),skb_mark(0/0),in_port(p2),eth(src=50:54:00:00:00:07/00:00:00:00:00:00,dst=50:54:00:00:00:05/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=192.168.0.2/0.0.0.0,dst=192.168.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff),icmp(type=0/0,code=0/0), packets:0, bytes:0, used:never, actions:userspace(pid=0,slow_path(controller))
2448 ])
2449
2450 AT_CHECK([ovs-appctl dpif/dump-flows -m br1 | sort | STRIP_USED], [0], [dnl
2451 skb_priority(0),skb_mark(0/0),in_port(p3),eth(src=50:54:00:00:00:09/00:00:00:00:00:00,dst=50:54:00:00:00:0a/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff),icmp(type=8/0,code=0/0), packets:0, bytes:0, used:never, actions:userspace(pid=0,slow_path(controller))
2452 ])
2453
2454 OVS_VSWITCHD_STOP
2455 AT_CLEANUP
2456
2457 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-flows - MPLS actions that result in a userspace action])
2458 OVS_VSWITCHD_START([dnl
2459    add-port br0 p1 -- set Interface p1 type=dummy
2460 ])
2461 ON_EXIT([kill `cat ovs-ofctl.pid`])
2462
2463 AT_CAPTURE_FILE([ofctl_monitor.log])
2464 AT_DATA([flows.txt], [dnl
2465 dl_src=60:66:66:66:66:00 actions=push_mpls:0x8847,controller
2466 dl_src=60:66:66:66:66:01 actions=pop_mpls:0x8849,controller
2467 ])
2468 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2469
2470 dnl Packet is sent to userspace because a MPLS push or pop action is applied to
2471 dnl a packet with 4 MPLS LSEs but userspace and the datapath can only handle up
2472 dnl to 3 labels.
2473 dnl
2474 dnl The input is a frame with four MPLS labels which tcpdump -vve shows as:
2475 dnl 60:66:66:66:66:00 > 50:54:00:00:00:07, ethertype MPLS unicast (0x8847), length 74: MPLS (label 20, exp 0, ttl 32)
2476 dnl         (label 20, exp 0, ttl 32)
2477 dnl         (label 20, exp 0, ttl 32)
2478 dnl         (label 20, exp 0, [S], ttl 32)
2479 dnl         (tos 0x0, ttl 64, id 0, offset 0, flags [none], proto TCP (6), length 44, bad cksum 3b78 (->f978)!)
2480 dnl     192.168.0.1.80 > 192.168.0.2.0: Flags [none], cksum 0x7744 (correct), seq 42:46, win 10000, length 4
2481
2482 for dl_src in 00 01; do
2483     AT_CHECK([ovs-appctl netdev-dummy/receive p1 "505400000007 6066666666$dl_src 8847 00014020 00014020 00014020 00014120 45 00 00 2c 00 00 00 00 40 06 3b 78 c0 a8 00 01 c0 a8 00 02 00 50 00 00 00 00 00 2a 00 00 00 2a 50 00 27 10 77 44 00 00 48 4f 47 45"])
2484
2485     AT_CHECK_UNQUOTED([ovs-appctl dpif/dump-flows br0 | grep ":$dl_src/" | STRIP_USED], [0], [dnl
2486 skb_priority(0),in_port(1),eth(src=60:66:66:66:66:$dl_src/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:07/00:00:00:00:00:00),eth_type(0x8847),mpls(lse0=0x14020/0x100,lse1=0x14020/0x100,lse2=0x14020/0x100), packets:0, bytes:0, used:never, actions:drop
2487 ])
2488 done
2489
2490 OVS_VSWITCHD_STOP
2491 AT_CLEANUP
2492
2493
2494 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-flows - MPLS actions that result in a drop])
2495 OVS_VSWITCHD_START([dnl
2496    add-port br0 p1 -- set Interface p1 type=dummy
2497 ])
2498 ON_EXIT([kill `cat ovs-ofctl.pid`])
2499
2500 AT_CAPTURE_FILE([ofctl_monitor.log])
2501 AT_DATA([flows.txt], [dnl
2502 dl_src=60:66:66:66:66:00 actions=push_mpls:0x8847,controller
2503 dl_src=60:66:66:66:66:01 actions=pop_mpls:0x8849,controller
2504 ])
2505 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2506
2507 dnl Packet is dropped because an MPLS PUSH action is applied to a packet with
2508 dnl 4 MPLS LSEs but ovs-vswtichd can only handle up to 3 MPLS LSEs and thus
2509 dnl can't determine the resulting MPLS label after an MPLS PUSH action.
2510 dnl
2511 dnl The input is a frame with two MPLS headers which tcpdump -vve shows as:
2512 dnl 60:66:66:66:66:01 > 50:54:00:00:00:07, ethertype MPLS unicast (0x8847), length 74: MPLS (label 20, exp 0, ttl 32)
2513 dnl         (label 20, exp 0, ttl 32)
2514 dnl         (label 20, exp 0, ttl 32)
2515 dnl         (label 20, exp 0, [S], ttl 32)
2516 dnl         (tos 0x0, ttl 64, id 0, offset 0, flags [none], proto TCP (6), length 44, bad cksum 3b78 (->f978)!)
2517 dnl     192.168.0.1.80 > 192.168.0.2.0: Flags [none], cksum 0x7744 (correct), seq 42:46, win 10000, length 4
2518 AT_CHECK([ovs-appctl netdev-dummy/receive p1 '50 54 00 00 00 07 60 66 66 66 66 01 88 47 00 01 40 20 00 01 40 20 00 01 40 20 00 01 41 20 45 00 00 2c 00 00 00 00 40 06 3b 78 c0 a8 00 01 c0 a8 00 02 00 50 00 00 00 00 00 2a 00 00 00 2a 50 00 27 10 77 44 00 00 48 4f 47 45'])
2519
2520 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
2521 skb_priority(0),in_port(1),eth(src=60:66:66:66:66:01/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:07/00:00:00:00:00:00),eth_type(0x8847),mpls(lse0=0x14020/0x100,lse1=0x14020/0x100,lse2=0x14020/0x100), packets:0, bytes:0, used:never, actions:drop
2522 ])
2523
2524 OVS_VSWITCHD_STOP
2525 AT_CLEANUP
2526
2527 AT_SETUP([ofproto-dpif - patch ports])
2528 OVS_VSWITCHD_START([add-br br1 \
2529 -- set bridge br1 datapath-type=dummy fail-mode=secure \
2530 -- add-port br1 pbr1 -- set int pbr1 type=patch options:peer=pbr0 \
2531 -- add-port br0 pbr0 -- set int pbr0 type=patch options:peer=pbr1])
2532
2533 ADD_OF_PORTS([br0], [2])
2534 ADD_OF_PORTS([br1], [3])
2535
2536 AT_CHECK([ovs-appctl time/stop])
2537
2538 AT_CHECK([ovs-ofctl add-flow br0 actions=LOCAL,output:1,output:2])
2539 AT_CHECK([ovs-ofctl add-flow br1 actions=LOCAL,output:1,output:3])
2540
2541 for i in $(seq 1 10); do
2542     ovs-appctl netdev-dummy/receive br0 'in_port(100),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'
2543 done
2544
2545 for i in $(seq 1 5); do
2546     ovs-appctl netdev-dummy/receive br1 'in_port(101),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x0800),ipv4(src=192.168.0.2,dst=192.168.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'
2547 done
2548
2549 AT_CHECK([ovs-appctl time/warp 500], [0],
2550 [warped
2551 ])
2552
2553 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
2554 dummy@ovs-dummy: hit:13 missed:2
2555         br0:
2556                 br0 65534/100: (dummy)
2557                 p2 2/2: (dummy)
2558                 pbr0 1/none: (patch: peer=pbr1)
2559         br1:
2560                 br1 65534/101: (dummy)
2561                 p3 3/3: (dummy)
2562                 pbr1 1/none: (patch: peer=pbr0)
2563 ])
2564
2565 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_USED], [0], [dnl
2566 skb_priority(0),in_port(100),eth_type(0x0800),ipv4(src=192.168.0.1/0.0.0.0,dst=192.168.0.2/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:9, bytes:540, used:0.0s, actions:101,3,2
2567 ]),
2568 AT_CHECK([ovs-appctl dpif/dump-flows br1 | STRIP_USED], [0], [dnl
2569 skb_priority(0),in_port(101),eth_type(0x0800),ipv4(src=192.168.0.2/0.0.0.0,dst=192.168.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:4, bytes:240, used:0.0s, actions:100,2,3
2570 ])
2571
2572 AT_CHECK([ovs-ofctl dump-ports br0 pbr0], [0], [dnl
2573 OFPST_PORT reply (xid=0x4): 1 ports
2574   port  1: rx pkts=5, bytes=300, drop=0, errs=0, frame=0, over=0, crc=0
2575            tx pkts=10, bytes=600, drop=0, errs=0, coll=0
2576 ])
2577
2578 AT_CHECK([ovs-ofctl dump-ports br1 pbr1], [0], [dnl
2579 OFPST_PORT reply (xid=0x4): 1 ports
2580   port  1: rx pkts=10, bytes=600, drop=0, errs=0, frame=0, over=0, crc=0
2581            tx pkts=5, bytes=300, drop=0, errs=0, coll=0
2582 ])
2583
2584 OVS_VSWITCHD_STOP
2585 AT_CLEANUP
2586
2587 AT_SETUP([ofproto-dpif - port duration])
2588 OVS_VSWITCHD_START([set Bridge br0 protocols=OpenFlow13])
2589 ADD_OF_PORTS([br0], 1, 2)
2590
2591 ovs-appctl time/stop
2592 ovs-appctl time/warp 10000
2593
2594 AT_CHECK([ovs-ofctl -O openflow13 dump-ports br0], [0], [stdout])
2595 AT_CHECK([sed -n 's/=[[0-9]][[0-9]]\(\.[[0-9]][[0-9]]*\)\{0,1\}s/=?s/p' stdout], [0],
2596 [dnl
2597            duration=?s
2598            duration=?s
2599            duration=?s
2600 ])
2601 OVS_VSWITCHD_STOP
2602 AT_CLEANUP
2603
2604 dnl ----------------------------------------------------------------------
2605 AT_BANNER([ofproto-dpif -- megaflows])
2606
2607 AT_SETUP([ofproto-dpif megaflow - port classification])
2608 OVS_VSWITCHD_START
2609 ADD_OF_PORTS([br0], [1], [2])
2610 AT_DATA([flows.txt], [dnl
2611 table=0 in_port=1 actions=output(2)
2612 ])
2613 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2614 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2615 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2616 sleep 1
2617 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2618 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
2619 ])
2620 OVS_VSWITCHD_STOP
2621 AT_CLEANUP
2622
2623 AT_SETUP([ofproto-dpif megaflow - L2 classification])
2624 OVS_VSWITCHD_START
2625 ADD_OF_PORTS([br0], [1], [2])
2626 AT_DATA([flows.txt], [dnl
2627 table=0 in_port=1,dl_src=50:54:00:00:00:09 actions=output(2)
2628 ])
2629 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2630 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2631 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2632 sleep 1
2633 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2634 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:09/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:0a/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
2635 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:0b/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:0c/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=10.0.0.4/0.0.0.0,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
2636 ])
2637 OVS_VSWITCHD_STOP
2638 AT_CLEANUP
2639
2640 AT_SETUP([ofproto-dpif megaflow - L3 classification])
2641 OVS_VSWITCHD_START
2642 ADD_OF_PORTS([br0], [1], [2])
2643 AT_CHECK([ovs-vsctl set Bridge br0 flow_tables:0=@N1 -- --id=@N1 create Flow_Table name=t0 prefixes=nw_dst,nw_src], [0], [ignore], [])
2644 AT_DATA([flows.txt], [dnl
2645 table=0 in_port=1,icmp,nw_src=10.0.0.4 actions=output(2)
2646 ])
2647 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2648 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2649 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2650 sleep 1
2651 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2652 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.2/255.255.255.252,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
2653 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.4/255.255.255.255,dst=10.0.0.3/0.0.0.0,proto=1/0xff,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
2654 ])
2655 OVS_VSWITCHD_STOP
2656 AT_CLEANUP
2657
2658 AT_SETUP([ofproto-dpif megaflow - IPv6 classification])
2659 OVS_VSWITCHD_START
2660 ADD_OF_PORTS([br0], [1], [2])
2661 AT_CHECK([ovs-vsctl set Bridge br0 flow_tables:0=@N1 -- --id=@N1 create Flow_Table name=t0 prefixes=ipv6_dst,ipv6_src], [0], [ignore], [])
2662 AT_DATA([flows.txt], [dnl
2663 table=0 in_port=1,ipv6,ipv6_src=2001:db8:3c4d:1:2:3:4:5 actions=output(2)
2664 ])
2665 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2666 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x86dd),ipv6(src=2001:db8:3c4d:1:2:3:4:5,dst=fe80::2,label=0,proto=10,tclass=0x70,hlimit=128,frag=no)'])
2667 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x86dd),ipv6(src=2001:db8:3c4d:5:4:3:2:1,dst=2001:db8:3c4d:1:2:3:4:1,label=0,proto=99,tclass=0x70,hlimit=64,frag=no)'])
2668 sleep 1
2669 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2670 skb_priority(0),in_port(1),eth_type(0x86dd),ipv6(src=2001:db8:3c4d:1:2:3:4:5/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff,dst=fe80::2/::,label=0/0,proto=10/0,tclass=0x70/0,hlimit=128/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
2671 skb_priority(0),in_port(1),eth_type(0x86dd),ipv6(src=2001:db8:3c4d:5:4:3:2:1/ffff:ffff:ffff:fffc::,dst=2001:db8:3c4d:1:2:3:4:1/::,label=0/0,proto=99/0,tclass=0x70/0,hlimit=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
2672 ])
2673 OVS_VSWITCHD_STOP
2674 AT_CLEANUP
2675
2676 AT_SETUP([ofproto-dpif megaflow - L4 classification])
2677 OVS_VSWITCHD_START
2678 ADD_OF_PORTS([br0], [1], [2])
2679 AT_DATA([flows.txt], [dnl
2680 table=0 in_port=1,icmp,icmp_type=8 actions=output(2)
2681 ])
2682 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2683 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2684 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2685 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2686 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0xff,tos=0/0,ttl=64/0,frag=no/0xff),icmp(type=8/0xff,code=0/0), packets:0, bytes:0, used:0.0s, actions: <del>
2687 ])
2688 OVS_VSWITCHD_STOP
2689 AT_CLEANUP
2690
2691 AT_SETUP([ofproto-dpif megaflow - normal])
2692 OVS_VSWITCHD_START
2693 ADD_OF_PORTS([br0], [1], [2])
2694 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
2695 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2696 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2697 sleep 1
2698 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2699 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
2700 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4/0.0.0.0,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
2701 ])
2702 OVS_VSWITCHD_STOP
2703 AT_CLEANUP
2704
2705 AT_SETUP([ofproto-dpif megaflow - mpls])
2706 OVS_VSWITCHD_START
2707 ADD_OF_PORTS([br0], [1], [2])
2708 AT_DATA([flows.txt], [dnl
2709 table=0 dl_src=50:54:00:00:00:09 actions=push_mpls:0x8847,2
2710 table=0 dl_src=50:54:00:00:00:0b actions=pop_mpls:0x0800,2
2711 ])
2712 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2713 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x8847),mpls(label=11,tc=3,ttl=64,bos=1)'])
2714 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0a),eth_type(0x8847),mpls(label=11,tc=3,ttl=64,bos=1)'])
2715 sleep 1
2716 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2717 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:09/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:0a/00:00:00:00:00:00),eth_type(0x8847),mpls(label=11,tc=3,ttl=64,bos=1), packets:0, bytes:0, used:never, actions: <del>
2718 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:0b/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:0a/00:00:00:00:00:00),eth_type(0x8847),mpls(label=11,tc=3,ttl=64,bos=1), packets:0, bytes:0, used:never, actions: <del>
2719 ])
2720 OVS_VSWITCHD_STOP
2721 AT_CLEANUP
2722
2723 # CHECK_MEGAFLOW_NETFLOW(LOOPBACK_ADDR, IP_VERSION_TYPE)
2724 #
2725 # IP_VERSION_TYPE is used in AT_SETUP
2726 m4_define([CHECK_MEGAFLOW_NETFLOW],
2727   [AT_SETUP([ofproto-dpif megaflow - netflow - $2 collector])
2728   OVS_VSWITCHD_START
2729   ADD_OF_PORTS([br0], [1], [2])
2730
2731   dnl NetFlow configuration disables wildcarding relevant fields
2732   ON_EXIT([kill `cat test-netflow.pid`])
2733   AT_CHECK([test-netflow --log-file --detach --no-chdir --pidfile 0:$1 > netflow.log], [0], [], [ignore])
2734   AT_CAPTURE_FILE([netflow.log])
2735   NETFLOW_PORT=`parse_listening_port < test-netflow.log`
2736   ovs-vsctl \
2737      set Bridge br0 netflow=@nf -- \
2738      --id=@nf create NetFlow targets=\"$1:$NETFLOW_PORT\" \
2739        engine_id=1 engine_type=2 active_timeout=30 add-id-to-interface=false
2740
2741   AT_CHECK([ovs-ofctl add-flow br0 action=normal])
2742   AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2743   AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2744   sleep 1
2745   AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2746 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2/255.255.255.255,dst=10.0.0.1/255.255.255.255,proto=1/0xff,tos=0/0xfc,ttl=64/0,frag=no/0xff),icmp(type=8,code=0), packets:0, bytes:0, used:never, actions: <del>
2747 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4/255.255.255.255,dst=10.0.0.3/255.255.255.255,proto=1/0xff,tos=0/0xfc,ttl=64/0,frag=no/0xff),icmp(type=8,code=0), packets:0, bytes:0, used:never, actions: <del>
2748 ])
2749   OVS_VSWITCHD_STOP
2750   AT_CLEANUP])
2751
2752 CHECK_MEGAFLOW_NETFLOW([127.0.0.1], [IPv4])
2753 CHECK_MEGAFLOW_NETFLOW([[[::1]]], [IPv6])
2754
2755 AT_SETUP([ofproto-dpif megaflow - normal, active-backup bonding])
2756 OVS_VSWITCHD_START(
2757   [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1 -- \
2758    add-bond br0 bond0 p2 p3 bond_mode=active-backup -- \
2759    set interface p2 type=dummy ofport_request=2 -- \
2760    set interface p3 type=dummy ofport_request=3])
2761 AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK
2762 ])
2763
2764 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
2765 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2766 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2767 sleep 1
2768 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2769 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
2770 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4/0.0.0.0,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
2771 ])
2772 OVS_VSWITCHD_STOP
2773 AT_CLEANUP
2774
2775 AT_SETUP([ofproto-dpif megaflow - normal, balance-slb bonding])
2776 OVS_VSWITCHD_START(
2777   [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1 -- \
2778    add-bond br0 bond0 p2 p3 bond_mode=balance-slb -- \
2779    set interface p2 type=dummy ofport_request=2 -- \
2780    set interface p3 type=dummy ofport_request=3])
2781 AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK
2782 ])
2783
2784 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
2785 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2786 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2787 sleep 1
2788 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2789 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
2790 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4/0.0.0.0,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
2791 ])
2792 OVS_VSWITCHD_STOP
2793 AT_CLEANUP
2794
2795 AT_SETUP([ofproto-dpif megaflow - normal, balance-tcp bonding])
2796 # Create bond0 on br0 with interfaces p0 and p1
2797 #    and bond1 on br1 with interfaces p2 and p3
2798 # with p0 patched to p2 and p1 patched to p3.
2799 OVS_VSWITCHD_START(
2800   [add-bond br0 bond0 p0 p1 bond_mode=balance-tcp lacp=active \
2801                             other-config:lacp-time=fast \
2802                             other-config:bond-rebalance-interval=0 -- \
2803    set interface p0 type=patch options:peer=p2 ofport_request=1 -- \
2804    set interface p1 type=patch options:peer=p3 ofport_request=2 -- \
2805    add-br br1 -- \
2806    set bridge br1 other-config:hwaddr=aa:66:aa:66:00:00 -- \
2807    set bridge br1 datapath-type=dummy other-config:datapath-id=1234 \
2808                   fail-mode=secure -- \
2809    add-bond br1 bond1 p2 p3 bond_mode=balance-tcp lacp=active \
2810                             other-config:lacp-time=fast \
2811                             other-config:bond-rebalance-interval=0 -- \
2812    set interface p2 type=patch options:peer=p0 ofport_request=3 -- \
2813    set interface p3 type=patch options:peer=p1 ofport_request=4 --])
2814
2815 AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK
2816 ])
2817 ADD_OF_PORTS([br0], [7])
2818 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
2819 AT_CHECK([ovs-ofctl add-flow br1 action=normal])
2820 ovs-appctl time/stop
2821 ovs-appctl time/warp 5000
2822 AT_CHECK([ovs-appctl netdev-dummy/receive p7 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2823 AT_CHECK([ovs-appctl netdev-dummy/receive p7 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2824 sleep 1
2825 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2826 skb_priority(0),in_port(7),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2/255.255.255.255,dst=10.0.0.1/255.255.255.255,proto=1/0xff,tos=0/0,ttl=64/0,frag=no/0xff),icmp(type=8,code=0), packets:0, bytes:0, used:never, actions: <del>
2827 skb_priority(0),in_port(7),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4/255.255.255.255,dst=10.0.0.3/255.255.255.255,proto=1/0xff,tos=0/0,ttl=64/0,frag=no/0xff),icmp(type=8,code=0), packets:0, bytes:0, used:never, actions: <del>
2828 ])
2829 OVS_VSWITCHD_STOP
2830 AT_CLEANUP
2831
2832 AT_SETUP([ofproto-dpif megaflow - resubmit port action])
2833 OVS_VSWITCHD_START
2834 ADD_OF_PORTS([br0], [1], [2])
2835 AT_DATA([flows.txt], [dnl
2836 table=0 in_port=1,ip actions=resubmit(90)
2837 table=0 in_port=90,dl_src=50:54:00:00:00:09 actions=output(2)
2838 ])
2839 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2840 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2841 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2842 sleep 1
2843 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2844 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:09/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:0a/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
2845 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:0b/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:0c/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=10.0.0.4/0.0.0.0,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
2846 ])
2847 OVS_VSWITCHD_STOP
2848 AT_CLEANUP
2849
2850 AT_SETUP([ofproto-dpif megaflow - resubmit table action])
2851 OVS_VSWITCHD_START
2852 ADD_OF_PORTS([br0], [1], [2])
2853 AT_DATA([flows.txt], [dnl
2854 table=0 in_port=1,ip actions=resubmit(,1)
2855 table=1 dl_src=50:54:00:00:00:09 actions=output(2)
2856 ])
2857 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2858 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2859 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=
2860 1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2861 sleep 1
2862 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2863 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:09/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:0a/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
2864 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:0b/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:0c/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=10.0.0.4/0.0.0.0,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
2865 ])
2866 OVS_VSWITCHD_STOP
2867 AT_CLEANUP
2868
2869 AT_SETUP([ofproto-dpif megaflow - goto_table action])
2870 OVS_VSWITCHD_START
2871 ADD_OF_PORTS([br0], [1], [2])
2872 AT_DATA([flows.txt], [dnl
2873 table=0 in_port=1,ip actions=goto_table(1)
2874 table=1 dl_src=50:54:00:00:00:09 actions=output(2)
2875 ])
2876 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flows br0 flows.txt])
2877 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2878 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2879 sleep 1
2880 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2881 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:09/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:0a/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
2882 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:0b/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:0c/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=10.0.0.4/0.0.0.0,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
2883 ])
2884 OVS_VSWITCHD_STOP
2885 AT_CLEANUP
2886
2887 AT_SETUP([ofproto-dpif megaflow - mirroring, select_all])
2888 OVS_VSWITCHD_START
2889 ADD_OF_PORTS([br0], [1], [2], [3])
2890 ovs-vsctl \
2891         set Bridge br0 mirrors=@m --\
2892         --id=@p3 get Port p3 --\
2893         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
2894
2895 AT_DATA([flows.txt], [dnl
2896 in_port=1 actions=output:2
2897 ])
2898 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2899 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2900 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2901 sleep 1
2902 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2903 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
2904 ])
2905 OVS_VSWITCHD_STOP
2906 AT_CLEANUP
2907
2908 AT_SETUP([ofproto-dpif megaflow - mirroring, select_vlan])
2909 OVS_VSWITCHD_START
2910 ADD_OF_PORTS([br0], [1], [2], [3])
2911 ovs-vsctl \
2912         set Bridge br0 mirrors=@m --\
2913         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
2914         --id=@m create Mirror name=mymirror select_all=true select_vlan=11 output_port=@p3
2915
2916 AT_DATA([flows.txt], [dnl
2917 in_port=1 actions=output:2
2918 ])
2919 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2920 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x8100),vlan(vid=11,pcp=7),encap(eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0))'])
2921 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2922 sleep 1
2923 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2924 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.4/0.0.0.0,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
2925 skb_priority(0),in_port(1),eth_type(0x8100),vlan(vid=11/0xfff,pcp=7/0x0,cfi=1/1),encap(eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff)), packets:0, bytes:0, used:never, actions: <del>
2926 ])
2927 OVS_VSWITCHD_STOP
2928 AT_CLEANUP
2929
2930 AT_SETUP([ofproto-dpif megaflow - move action])
2931 OVS_VSWITCHD_START
2932 ADD_OF_PORTS([br0], [1], [2])
2933 AT_DATA([flows.txt], [dnl
2934 table=0 in_port=1 ip,actions=move:NXM_OF_IP_SRC[[]]->NXM_NX_REG0[[]],resubmit(90)
2935 table=0 in_port=90 ip,actions=move:NXM_NX_REG0[[]]->NXM_NX_REG1[[]],resubmit(91)
2936 table=0 in_port=91 reg0=0x0a000002,actions=output(2)
2937 ])
2938 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2939 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2940 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2941 sleep 1
2942 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2943 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.2/255.255.255.255,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
2944 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.4/255.255.255.255,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
2945 ])
2946 OVS_VSWITCHD_STOP
2947 AT_CLEANUP
2948
2949 AT_SETUP([ofproto-dpif megaflow - push action])
2950 OVS_VSWITCHD_START
2951 ADD_OF_PORTS([br0], [1], [2])
2952 AT_DATA([flows.txt], [dnl
2953 table=0 in_port=1 ip,actions=push:NXM_OF_IP_SRC[[]],output(2)
2954 ])
2955 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2956 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2957 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2958 sleep 1
2959 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2960 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.2/255.255.255.255,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
2961 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.4/255.255.255.255,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
2962 ])
2963 OVS_VSWITCHD_STOP
2964 AT_CLEANUP
2965
2966 AT_SETUP([ofproto-dpif megaflow - learning])
2967 OVS_VSWITCHD_START
2968 ADD_OF_PORTS([br0], [1], [2])
2969 AT_DATA([flows.txt], [dnl
2970 table=0 in_port=1 actions=load:2->NXM_NX_REG0[[0..15]],learn(table=1,priority=65535,NXM_OF_ETH_SRC[[]],NXM_OF_VLAN_TCI[[0..11]],output:NXM_NX_REG0[[0..15]]),output:2
2971 ])
2972 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2973 ovs-appctl time/stop
2974 # We send each packet twice because the first packet in each flow causes the
2975 # flow table to change and thus revalidations, which (depending on timing)
2976 # can keep a megaflow from being installed.  The revalidations are done by
2977 # the second iteration, allowing the flows to be installed.
2978 for i in 1 2; do
2979     AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2980     AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2981     ovs-appctl time/warp 100
2982 done
2983 sleep 1
2984 dnl The original flow is missing due to a revalidation.
2985 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2986 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:09/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:0a/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
2987 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:0b/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:0c/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=10.0.0.4/0.0.0.0,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
2988 ])
2989 OVS_VSWITCHD_STOP
2990 AT_CLEANUP
2991
2992 AT_SETUP([ofproto-dpif megaflow - tunnels])
2993 OVS_VSWITCHD_START(
2994   [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1])
2995 AT_CHECK([ovs-vsctl add-port br0 p2 -- set Interface p2 type=gre \
2996      options:remote_ip=1.1.1.1 ofport_request=2 options:key=flow])
2997 AT_CHECK([ovs-vsctl add-port br0 p3 -- set Interface p3 type=dummy \
2998           ofport_request=3])
2999 AT_CHECK([ovs-vsctl add-port br0 p4 -- set Interface p4 type=gre \
3000      options:remote_ip=1.1.1.2 options:tos=inherit options:ttl=inherit \
3001      ofport_request=4 options:key=flow])
3002 AT_DATA([flows.txt], [dnl
3003 in_port=1,actions=output(2)
3004 in_port=3,actions=output(4)
3005 ])
3006 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3007 dnl ECN bits are always copied out, but don't use 0x3 (CE), since that
3008 dnl will cause the packet to be dropped.
3009 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0xfd,ttl=128,frag=no),icmp(type=8,code=0)'])
3010 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0x1,ttl=64,frag=no),icmp(type=8,code=0)'])
3011 AT_CHECK([ovs-appctl netdev-dummy/receive p3 'in_port(3),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0xfd,ttl=128,frag=no),icmp(type=8,code=0)'])
3012 AT_CHECK([ovs-appctl netdev-dummy/receive p3 'in_port(3),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0x1,ttl=64,frag=no),icmp(type=8,code=0)'])
3013 sleep 1
3014 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3015 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0xfd/0x3,ttl=128/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
3016 skb_priority(0),in_port(3),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0xfd/0xff,ttl=128/0xff,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
3017 skb_priority(0),in_port(3),eth_type(0x0800),ipv4(src=10.0.0.4/0.0.0.0,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0x1/0xff,ttl=64/0xff,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
3018 ])
3019 OVS_VSWITCHD_STOP
3020 AT_CLEANUP
3021
3022 AT_SETUP([ofproto-dpif megaflow - dec_ttl])
3023 OVS_VSWITCHD_START
3024 ADD_OF_PORTS([br0], [1], [2])
3025 AT_CHECK([ovs-vsctl set Bridge br0 flow_tables:0=@N1 -- --id=@N1 create Flow_Table name=t0 prefixes=nw_dst,nw_src], [0], [ignore], [])
3026 AT_DATA([flows.txt], [dnl
3027 table=0 in_port=1,icmp,nw_src=10.0.0.4 actions=dec_ttl,output(2)
3028 ])
3029 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3030 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
3031 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
3032 sleep 1
3033 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3034 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.2/255.255.255.252,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
3035 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no), packets:0, bytes:0, used:never, actions: <del>
3036 ])
3037 OVS_VSWITCHD_STOP
3038 AT_CLEANUP
3039
3040 AT_SETUP([ofproto-dpif megaflow - set dl_dst])
3041 OVS_VSWITCHD_START
3042 ADD_OF_PORTS([br0], [1], [2])
3043 AT_DATA([flows.txt], [dnl
3044 table=0 in_port=1 actions=mod_dl_dst(50:54:00:00:00:0a),output(2)
3045 ])
3046 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3047 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
3048 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
3049 sleep 1
3050 dnl The megaflows do not match the same fields, since the first packet
3051 dnl is essentially a no-op.  (The new destination MAC is the same as the
3052 dnl original.) The ofproto-dpif library un-wildcards the destination MAC
3053 dnl so that a packet that doesn't need its MAC address changed doesn't
3054 dnl hide one that does.  Since the first entry doesn't need to change,
3055 dnl only the destination MAC address is matched (as decided by
3056 dnl ofproto-dpif).  The second entry actually updates the destination
3057 dnl MAC, so both the source and destination MAC addresses are
3058 dnl un-wildcarded, since the ODP commit functions update both the source
3059 dnl and destination MAC addresses.
3060 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_USED], [0], [dnl
3061 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:09/00:00:00:00:00:00,dst=50:54:00:00:00:0a/ff:ff:ff:ff:ff:ff),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions:2
3062 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4/0.0.0.0,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions:set(eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0a)),2
3063 ])
3064 OVS_VSWITCHD_STOP
3065 AT_CLEANUP
3066
3067 AT_SETUP([ofproto-dpif megaflow - disabled])
3068 OVS_VSWITCHD_START
3069 ADD_OF_PORTS([br0], [1], [2])
3070 AT_DATA([flows.txt], [dnl
3071 table=0 in_port=1,ip,nw_dst=10.0.0.1 actions=output(2)
3072 table=0 in_port=1,ip,nw_dst=10.0.0.3 actions=drop
3073 ])
3074 AT_CHECK([ovs-appctl upcall/disable-megaflows], [0], [megaflows disabled
3075 ], [])
3076 AT_CHECK([ovs-appctl vlog/set dpif_netdev:dbg], [0], [], [])
3077 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3078 for i in 1 2 3 4; do
3079     AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
3080     AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
3081 done
3082 sleep 1
3083 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_USED], [0], [dnl
3084 skb_priority(0),skb_mark(0),in_port(1/0xffff),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2/255.255.255.255,dst=10.0.0.1/255.255.255.255,proto=1/0xff,tos=0/0xff,ttl=64/0xff,frag=no/0xfc),icmp(type=8,code=0), packets:3, bytes:180, used:0.0s, actions:2
3085 skb_priority(0),skb_mark(0),in_port(1/0xffff),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4/255.255.255.255,dst=10.0.0.3/255.255.255.255,proto=1/0xff,tos=0/0xff,ttl=64/0xff,frag=no/0xfc),icmp(type=8,code=0), packets:3, bytes:180, used:0.0s, actions:drop
3086 ])
3087 OVS_VSWITCHD_STOP
3088 AT_CLEANUP
3089
3090 AT_SETUP([ofproto-dpif - datapath port number change])
3091 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
3092 ADD_OF_PORTS([br0], 1)
3093
3094 # Trace a flow that should output to p1.
3095 AT_CHECK([ovs-appctl ofproto/trace br0 in_port=LOCAL,dl_src=10:20:30:40:50:60],
3096   [0], [stdout])
3097 AT_CHECK([tail -1 stdout], [0], [Datapath actions: 1
3098 ])
3099
3100 # Change p1's port number to 5.
3101 AT_CHECK([ovs-appctl dpif-dummy/change-port-number ovs-dummy p1 5])
3102
3103 # Trace a flow that should output to p1 in its new location.
3104 AT_CHECK([ovs-appctl ofproto/trace br0 in_port=LOCAL,dl_src=10:20:30:40:50:60],
3105   [0], [stdout])
3106 AT_CHECK([tail -1 stdout], [0], [Datapath actions: 5
3107 ])
3108 OVS_VSWITCHD_STOP
3109 AT_CLEANUP
3110
3111 # Tests the bundling with various bfd and cfm configurations.
3112 AT_SETUP([ofproto - bundle with variable bfd/cfm config])
3113 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy -- \
3114                     add-bond br0 br0bond p0 p2 bond-mode=active-backup -- \
3115                     add-bond br1 br1bond p1 p3 bond-mode=active-backup -- \
3116                     set Interface p1 type=patch options:peer=p0 ofport_request=2 -- \
3117                     set Interface p3 type=patch options:peer=p2 ofport_request=4 -- \
3118                     set Interface p0 type=patch options:peer=p1 ofport_request=1 -- \
3119                     set Interface p2 type=patch options:peer=p3 ofport_request=3 -- \
3120                     set Interface p0 bfd:enable=true bfd:min_tx=300 bfd:min_rx=300 -- \
3121                     set Interface p0 cfm_mpid=1 -- \
3122                     set Interface p1 bfd:enable=true bfd:min_tx=500 bfd:min_rx=500])
3123
3124 ovs-appctl time/stop
3125 # advance the clock to stablize everything.
3126 for i in `seq 0 49`; do ovs-appctl time/warp 100; done
3127 # cfm/show should show 'recv' fault.
3128 AT_CHECK([ovs-appctl cfm/show | sed -n '/^.*fault:.*/p'], [0], [dnl
3129         fault: recv
3130 ])
3131 # bfd/show should show 'up'.
3132 AT_CHECK([ovs-appctl bfd/show | sed -n '/^.*Session State:.*/p'], [0], [dnl
3133         Local Session State: up
3134         Remote Session State: up
3135         Local Session State: up
3136         Remote Session State: up
3137 ])
3138 # bond/show should show 'may-enable: true' for all slaves.
3139 AT_CHECK([ovs-appctl bond/show | sed -n '/^.*may_enable:.*/p'], [0], [dnl
3140         may_enable: true
3141         may_enable: true
3142         may_enable: true
3143         may_enable: true
3144 ])
3145
3146 # now disable the bfd on p1.
3147 AT_CHECK([ovs-vsctl set Interface p1 bfd:enable=false])
3148 # advance the clock to stablize everything.
3149 for i in `seq 0 49`; do ovs-appctl time/warp 100; done
3150 # cfm/show should show 'recv' fault.
3151 AT_CHECK([ovs-appctl cfm/show | sed -n '/^.*fault:.*/p'], [0], [dnl
3152         fault: recv
3153 ])
3154 # bfd/show should show 'down'.
3155 AT_CHECK([ovs-appctl bfd/show | sed -n '/^.*Session State:.*/p'], [0], [dnl
3156         Local Session State: down
3157         Remote Session State: down
3158 ])
3159 # bond/show should show 'may-enable: false' for p0.
3160 AT_CHECK([ovs-appctl bond/show br0bond | sed -n '/^.*may_enable:.*/p'], [0], [dnl
3161         may_enable: false
3162         may_enable: true
3163 ])
3164
3165 # now enable the bfd on p1 and disable bfd on p0.
3166 AT_CHECK([ovs-vsctl set Interface p1 bfd:enable=true])
3167 AT_CHECK([ovs-vsctl set Interface p0 bfd:enable=false])
3168 # advance the clock to stablize everything.
3169 for i in `seq 0 49`; do ovs-appctl time/warp 100; done
3170 # cfm/show should show 'recv' fault.
3171 AT_CHECK([ovs-appctl cfm/show | sed -n '/^.*fault:.*/p'], [0], [dnl
3172         fault: recv
3173 ])
3174 # bfd/show should show 'down'.
3175 AT_CHECK([ovs-appctl bfd/show | sed -n '/^.*Session State:.*/p'], [0], [dnl
3176         Local Session State: down
3177         Remote Session State: down
3178 ])
3179 # bond/show should show 'may-enable: false' for p0 and p1.
3180 AT_CHECK([ovs-appctl bond/show | sed -n '/^.*may_enable:.*/p'], [0], [dnl
3181         may_enable: false
3182         may_enable: true
3183         may_enable: false
3184         may_enable: true
3185 ])
3186
3187 OVS_VSWITCHD_STOP
3188 AT_CLEANUP
3189
3190 AT_SETUP([ofproto-dpif - ofproto-dpif-monitor 1])
3191 OVS_VSWITCHD_START([add-port br0 p0 -- set interface p0 type=gre options:remote_ip=1.2.3.4])
3192
3193 # enable bfd on p0.
3194 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=true])
3195 # check log.
3196 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* created\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3197 monitor thread created
3198 ])
3199 # disable bfd on p0.
3200 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=false])
3201 # check log.
3202 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* terminated\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3203 monitor thread terminated
3204 ])
3205 AT_CHECK([cat ovs-vswitchd.log | sed -e '/^.*ofproto_dpif_monitor.*$/d' > ovs-vswitchd.log])
3206
3207 # enable cfm on p0.
3208 AT_CHECK([ovs-vsctl set interface p0 cfm_mpid=10])
3209 # check log.
3210 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* created\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3211 monitor thread created
3212 ])
3213 # disable cfm on p0.
3214 AT_CHECK([ovs-vsctl remove interface p0 cfm_mpid 10])
3215 # check log.
3216 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* terminated\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3217 monitor thread terminated
3218 ])
3219 AT_CHECK([cat ovs-vswitchd.log | sed -e '/^.*ofproto_dpif_monitor.*$/d' > ovs-vswitchd.log])
3220
3221 # enable both bfd and cfm on p0.
3222 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=true cfm_mpid=10])
3223 # check log.
3224 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* created\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3225 monitor thread created
3226 ])
3227 # disable bfd on p0.
3228 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=false])
3229 # check log, there should not be the log of thread terminated.
3230 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* terminated\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3231 ])
3232 # reenable bfd on p0.
3233 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=true])
3234 # check log, should still be on log of thread created.
3235 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* created\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3236 monitor thread created
3237 ])
3238 # disable bfd and cfm together.
3239 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=false -- remove interface p0 cfm_mpid 10])
3240 # check log.
3241 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* terminated\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3242 monitor thread terminated
3243 ])
3244
3245 OVS_VSWITCHD_STOP
3246 AT_CLEANUP
3247
3248 # this test helps avoid the deadlock between the main thread and monitor thread.
3249 AT_SETUP([ofproto-dpif - ofproto-dpif-monitor 2])
3250 OVS_VSWITCHD_START
3251
3252 for i in `seq 1 199`
3253 do
3254     AT_CHECK([ovs-vsctl add-port br0 p$i -- set interface p$i type=gre options:remote_ip=1.2.3.4 options:key=$i bfd:enable=true])
3255 done
3256
3257 OVS_VSWITCHD_STOP
3258 AT_CLEANUP
3259 \f
3260 AT_BANNER([ofproto-dpif - flow translation resource limits])
3261
3262 AT_SETUP([ofproto-dpif - infinite resubmit])
3263 OVS_VSWITCHD_START
3264 AT_CHECK([ovs-ofctl add-flow br0 actions=resubmit:1,resubmit:2,output:3])
3265 AT_CHECK([ovs-appctl ofproto/trace br0 'eth_dst=ff:ff:ff:ff:ff:ff'],
3266   [0], [stdout])
3267 AT_CHECK([tail -1 stdout], [0], [Datapath actions: drop
3268 ])
3269 AT_CHECK([grep -c 'resubmit actions recursed over 64 times' ovs-vswitchd.log],
3270   [0], [1
3271 ])
3272 OVS_VSWITCHD_STOP(["/resubmit actions recursed/d"])
3273 AT_CLEANUP
3274
3275 AT_SETUP([ofproto-dpif - exponential resubmit chain])
3276 OVS_VSWITCHD_START
3277 ADD_OF_PORTS([br0], 1)
3278 (for i in `seq 1 64`; do
3279      j=`expr $i + 1`
3280      echo "in_port=$i, actions=resubmit:$j, resubmit:$j, local"
3281  done
3282  echo "in_port=65, actions=local") > flows
3283  AT_CHECK([ovs-ofctl add-flows br0 flows])
3284 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1'], [0], [stdout])
3285 AT_CHECK([grep -c 'over 4096 resubmit actions' ovs-vswitchd.log], [0], [1
3286 ])
3287 OVS_VSWITCHD_STOP(["/over.*resubmit actions/d"])
3288 AT_CLEANUP
3289
3290 AT_SETUP([ofproto-dpif - too many output actions])
3291 OVS_VSWITCHD_START
3292 ADD_OF_PORTS([br0], 1)
3293 (for i in `seq 1 12`; do
3294      j=`expr $i + 1`
3295      echo "in_port=$i, actions=resubmit:$j, resubmit:$j, local"
3296  done
3297  echo "in_port=13, actions=local,local,local,local,local,local,local,local") > flows
3298 AT_CHECK([ovs-ofctl add-flows br0 flows])
3299 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1'], [0], [stdout])
3300 AT_CHECK([grep -c -e '- Uses action(s) not supported by datapath' stdout],
3301   [0], [1
3302 ])
3303 AT_CHECK([grep -c 'resubmits yielded over 64 kB of actions' ovs-vswitchd.log], [0], [1
3304 ])
3305 OVS_VSWITCHD_STOP(["/resubmits yielded over 64 kB of actions/d"])
3306 AT_CLEANUP
3307
3308 AT_SETUP([ofproto-dpif - stack too deep])
3309 OVS_VSWITCHD_START
3310 ADD_OF_PORTS([br0], 1)
3311 (for i in `seq 1 12`; do
3312      j=`expr $i + 1`
3313      echo "in_port=$i, actions=resubmit:$j, resubmit:$j, local"
3314  done
3315  push="push:NXM_NX_REG0[[]]"
3316  echo "in_port=13, actions=$push,$push,$push,$push,$push,$push,$push,$push") > flows
3317  AT_CHECK([ovs-ofctl add-flows br0 flows])
3318 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1'], [0], [stdout])
3319 AT_CHECK([grep -c 'resubmits yielded over 64 kB of stack' ovs-vswitchd.log], [0], [1
3320 ])
3321 OVS_VSWITCHD_STOP(["/resubmits yielded over 64 kB of stack/d"])
3322 AT_CLEANUP