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