Enhance userspace support for MPLS, for up to 3 labels.
[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([ovs-appctl -t ovs-ofctl exit])
859 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
860 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
861 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
862 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
863 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.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
864 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
865 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=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
866 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
867 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=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
868 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
869 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.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
870 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
871 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=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
872 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
873 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=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
874 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
875 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.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
876 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
877 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=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
878 ])
879
880 AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
881
882 dnl Checksum SCTP.
883 AT_CHECK([ovs-ofctl monitor br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
884
885 for i in 1 ; do
886     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'
887 done
888
889 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
890 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
891 NXT_PACKET_IN (xid=0x0): cookie=0x1 total_len=98 in_port=1 (via action) data_len=98 (unbuffered)
892 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
893 dnl
894 NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x3 total_len=102 in_port=1 reg0=0x1 (via action) data_len=102 (unbuffered)
895 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
896 dnl
897 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)
898 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
899 dnl
900 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)
901 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
902 dnl
903 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)
904 sctp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=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
905 dnl
906 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)
907 sctp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=1112,tp_dst=2223 sctp_csum:d9d79157
908 dnl
909 NXT_PACKET_IN (xid=0x0): table_id=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)
910 sctp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=85,tp_dst=2223 sctp_csum:7f12662e
911 dnl
912 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)
913 sctp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=85,tp_dst=86 sctp_csum:a7e86f67
914 dnl
915 NXT_PACKET_IN (xid=0x0): table_id=7 cookie=0x9 total_len=102 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=102 (unbuffered)
916 sctp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=85,tp_dst=86 sctp_csum:a7e86f67
917 ])
918
919 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
920  cookie=0x1, n_packets=3, n_bytes=218, dl_src=20:22:22:22:22:22 actions=CONTROLLER:65535,resubmit(80,1)
921  cookie=0x2, n_packets=3, n_bytes=180, dl_src=30:33:33:33:33:33 actions=mod_vlan_vid:15,CONTROLLER:65535
922  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)
923  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)
924  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)
925  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)
926  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)
927  cookie=0x8, table=6, n_packets=3, n_bytes=218, in_port=85 actions=mod_tp_src:85,CONTROLLER:65535,resubmit(86,7)
928  cookie=0x9, table=7, n_packets=3, n_bytes=218, in_port=86 actions=mod_tp_dst:86,CONTROLLER:65535,CONTROLLER:65535
929  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
930  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
931  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
932  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
933  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
934  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
935  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
936  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
937  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
938  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
939  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
940  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
941  cookie=0xd, n_packets=3, n_bytes=186, dl_src=60:66:66:66:66:66 actions=pop_mpls:0x0800,CONTROLLER:65535
942  n_packets=3, n_bytes=180, dl_src=10:11:11:11:11:11 actions=CONTROLLER:65535
943 NXST_FLOW reply:
944 ])
945
946 OVS_VSWITCHD_STOP
947 AT_CLEANUP
948
949 AT_SETUP([ofproto-dpif - ARP modification slow-path])
950 OVS_VSWITCHD_START
951 ADD_OF_PORTS([br0], [1], [2])
952
953 ovs-vsctl -- set Interface p2 type=dummy options:pcap=p2.pcap
954 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'
955
956 # Input some packets that should follow the arp modification slow-path.
957 for i in 1 2 3; do
958     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)'
959 done
960 AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
961
962 # Check the packets that were output.
963 AT_CHECK([ovs-ofctl parse-pcap p2.pcap], [0], [dnl
964 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
965 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
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.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
967 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.0.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00
968 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.128.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00
969 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.128.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=40:44:44:44:44:41
970 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.0.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00
971 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.128.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00
972 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.128.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=40:44:44:44:44:41
973 ])
974
975 OVS_VSWITCHD_STOP
976 AT_CLEANUP
977
978 AT_SETUP([ofproto-dpif - VLAN handling])
979 OVS_VSWITCHD_START(
980   [set Bridge br0 fail-mode=standalone -- \
981    add-port br0 p1                                  trunks=10,12 -- \
982    add-port br0 p2                           tag=10              -- \
983    add-port br0 p3                           tag=12              \
984                    other-config:priority-tags=true               -- \
985    add-port br0 p4                           tag=12              -- \
986    add-port br0 p5 vlan_mode=native-tagged   tag=10              -- \
987    add-port br0 p6 vlan_mode=native-tagged   tag=10 trunks=10,12 -- \
988    add-port br0 p7 vlan_mode=native-untagged tag=12              -- \
989    add-port br0 p8 vlan_mode=native-untagged tag=12 trunks=10,12 \
990                    other-config:priority-tags=true               -- \
991    set Interface p1 type=dummy -- \
992    set Interface p2 type=dummy -- \
993    set Interface p3 type=dummy -- \
994    set Interface p4 type=dummy -- \
995    set Interface p5 type=dummy -- \
996    set Interface p6 type=dummy -- \
997    set Interface p7 type=dummy -- \
998    set Interface p8 type=dummy --])
999
1000 dnl Each of these specifies an in_port by number, a VLAN VID (or "none"),
1001 dnl a VLAN PCP (used if the VID isn't "none") and the expected set of datapath
1002 dnl actions.
1003 for tuple in \
1004         "100 none 0 drop" \
1005         "100 0    0 drop" \
1006         "100 0    1 drop" \
1007         "100 10   0 1,5,6,7,8,pop_vlan,2" \
1008         "100 10   1 1,5,6,7,8,pop_vlan,2" \
1009         "100 11   0 5,7" \
1010         "100 11   1 5,7" \
1011         "100 12   0 1,5,6,pop_vlan,3,4,7,8" \
1012         "100 12   1 1,5,6,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
1013         "1  none 0 drop" \
1014         "1  0    0 drop" \
1015         "1  0    1 drop" \
1016         "1  10   0 5,6,7,8,100,pop_vlan,2" \
1017         "1  10   1 5,6,7,8,100,pop_vlan,2" \
1018         "1  11   0 drop" \
1019         "1  11   1 drop" \
1020         "1  12   0 5,6,100,pop_vlan,3,4,7,8" \
1021         "1  12   1 5,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
1022         "2  none 0 push_vlan(vid=10,pcp=0),1,5,6,7,8,100" \
1023         "2  0    0 pop_vlan,push_vlan(vid=10,pcp=0),1,5,6,7,8,100" \
1024         "2  0    1 pop_vlan,push_vlan(vid=10,pcp=1),1,5,6,7,8,100" \
1025         "2  10   0 drop" \
1026         "2  10   1 drop" \
1027         "2  11   0 drop" \
1028         "2  11   1 drop" \
1029         "2  12   0 drop" \
1030         "2  12   1 drop" \
1031         "3  none 0 4,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
1032         "3  0    0 pop_vlan,4,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
1033         "3  0    1 8,pop_vlan,4,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
1034         "3  10   0 drop" \
1035         "3  10   1 drop" \
1036         "3  11   0 drop" \
1037         "3  11   1 drop" \
1038         "3  12   0 drop" \
1039         "3  12   1 drop" \
1040         "4  none 0 3,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
1041         "4  0    0 pop_vlan,3,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
1042         "4  0    1 3,8,pop_vlan,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
1043         "4  10   0 drop" \
1044         "4  10   1 drop" \
1045         "4  11   0 drop" \
1046         "4  11   1 drop" \
1047         "4  12   0 drop" \
1048         "4  12   1 drop" \
1049         "5  none 0 2,push_vlan(vid=10,pcp=0),1,6,7,8,100" \
1050         "5  0    0 pop_vlan,2,push_vlan(vid=10,pcp=0),1,6,7,8,100" \
1051         "5  0    1 pop_vlan,2,push_vlan(vid=10,pcp=1),1,6,7,8,100" \
1052         "5  10   0 1,6,7,8,100,pop_vlan,2" \
1053         "5  10   1 1,6,7,8,100,pop_vlan,2" \
1054         "5  11   0 7,100" \
1055         "5  11   1 7,100" \
1056         "5  12   0 1,6,100,pop_vlan,3,4,7,8" \
1057         "5  12   1 1,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
1058         "6  none 0 2,push_vlan(vid=10,pcp=0),1,5,7,8,100" \
1059         "6  0    0 pop_vlan,2,push_vlan(vid=10,pcp=0),1,5,7,8,100" \
1060         "6  0    1 pop_vlan,2,push_vlan(vid=10,pcp=1),1,5,7,8,100" \
1061         "6  10   0 1,5,7,8,100,pop_vlan,2" \
1062         "6  10   1 1,5,7,8,100,pop_vlan,2" \
1063         "6  11   0 drop" \
1064         "6  11   1 drop" \
1065         "6  12   0 1,5,100,pop_vlan,3,4,7,8" \
1066         "6  12   1 1,5,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
1067         "7  none 0 3,4,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
1068         "7  0    0 pop_vlan,3,4,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
1069         "7  0    1 3,8,pop_vlan,4,push_vlan(vid=12,pcp=1),1,5,6,100" \
1070         "7  10   0 1,5,6,8,100,pop_vlan,2" \
1071         "7  10   1 1,5,6,8,100,pop_vlan,2" \
1072         "7  11   0 5,100" \
1073         "7  11   1 5,100" \
1074         "7  12   0 1,5,6,100,pop_vlan,3,4,8" \
1075         "7  12   1 1,5,6,100,pop_vlan,4,push_vlan(vid=0,pcp=1),3,8" \
1076         "8  none 0 3,4,7,push_vlan(vid=12,pcp=0),1,5,6,100" \
1077         "8  0    0 pop_vlan,3,4,7,push_vlan(vid=12,pcp=0),1,5,6,100" \
1078         "8  0    1 3,pop_vlan,4,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
1079         "8  10   0 1,5,6,7,100,pop_vlan,2" \
1080         "8  10   1 1,5,6,7,100,pop_vlan,2" \
1081         "8  11   0 drop" \
1082         "8  11   1 drop" \
1083         "8  12   0 1,5,6,100,pop_vlan,3,4,7" \
1084         "8  12   1 1,5,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3"
1085 do
1086   set $tuple
1087   in_port=$1
1088   vlan=$2
1089   pcp=$3
1090   expected=$4
1091
1092   if test $vlan = none; then
1093     flow="in_port($in_port),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff),eth_type(0xabcd)"
1094   else
1095     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))"
1096   fi
1097
1098   echo "----------------------------------------------------------------------"
1099   echo "in_port=$in_port vlan=$vlan pcp=$pcp"
1100
1101   AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1102   actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1103
1104   AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
1105   mv stdout expout
1106   AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
1107 done
1108
1109 OVS_VSWITCHD_STOP
1110 AT_CLEANUP
1111
1112 AT_SETUP([ofproto-dpif - fragment handling])
1113 OVS_VSWITCHD_START
1114 ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6], [90])
1115 AT_DATA([flows.txt], [dnl
1116 priority=75 tcp ip_frag=no    tp_dst=80 actions=output:1
1117 priority=75 tcp ip_frag=first tp_dst=80 actions=output:2
1118 priority=75 tcp ip_frag=later tp_dst=80 actions=output:3
1119 priority=50 tcp ip_frag=no              actions=output:4
1120 priority=50 tcp ip_frag=first           actions=output:5
1121 priority=50 tcp ip_frag=later           actions=output:6
1122 ])
1123 AT_CHECK([ovs-ofctl replace-flows br0 flows.txt])
1124
1125 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"
1126 no_flow="$base_flow,frag=no),tcp(src=12345,dst=80)"
1127 first_flow="$base_flow,frag=first),tcp(src=12345,dst=80)"
1128 later_flow="$base_flow,frag=later)"
1129
1130     # mode    no  first  later
1131 for tuple in \
1132     'normal    1     5      6' \
1133     'drop      1  drop   drop' \
1134     'nx-match  1     2      6'
1135 do
1136   set $tuple
1137   mode=$1
1138   no=$2
1139   first=$3
1140   later=$4
1141
1142   AT_CHECK([ovs-ofctl set-frags br0 $mode])
1143   for type in no first later; do
1144     eval flow=\$${type}_flow exp_output=\$$type
1145     printf "\n%s\n" "----$mode $type-----"
1146     AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1147     : > expout
1148     if test $mode = drop && test $type != no; then
1149         echo 'Packets dropped because they are IP fragments and the fragment handling mode is "drop".' >> expout
1150     fi
1151     echo "Datapath actions: $exp_output" >> expout
1152     AT_CHECK([grep 'IP fragments' stdout; tail -1 stdout], [0], [expout])
1153   done
1154 done
1155 OVS_VSWITCHD_STOP
1156 AT_CLEANUP
1157
1158 AT_SETUP([ofproto-dpif - exit])
1159 OVS_VSWITCHD_START
1160 ADD_OF_PORTS([br0], [1], [2], [3], [10], [11], [12], [13], [14])
1161 AT_DATA([flows.txt], [dnl
1162 in_port=1 actions=output:10,exit,output:11
1163 in_port=2 actions=output:12,resubmit:1,output:12
1164 in_port=3 actions=output:13,resubmit:2,output:14
1165 ])
1166 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1167 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])
1168 AT_CHECK([tail -1 stdout], [0],
1169   [Datapath actions: 10
1170 ])
1171 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])
1172 AT_CHECK([tail -1 stdout], [0],
1173   [Datapath actions: 12,10
1174 ])
1175 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])
1176 AT_CHECK([tail -1 stdout], [0],
1177   [Datapath actions: 13,12,10
1178 ])
1179 OVS_VSWITCHD_STOP
1180 AT_CLEANUP
1181
1182
1183 AT_SETUP([ofproto-dpif - mirroring, select_all])
1184 OVS_VSWITCHD_START
1185 ADD_OF_PORTS([br0], 1, 2, 3)
1186 ovs-vsctl \
1187         set Bridge br0 mirrors=@m --\
1188         --id=@p3 get Port p3 --\
1189         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
1190
1191 AT_DATA([flows.txt], [dnl
1192 in_port=1 actions=output:2
1193 in_port=2 actions=output:1
1194 ])
1195 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1196
1197 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)"
1198 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1199 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1200   [Datapath actions: 2,3
1201 ])
1202
1203 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)"
1204 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1205 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1206   [Datapath actions: 1,3
1207 ])
1208
1209 OVS_VSWITCHD_STOP
1210 AT_CLEANUP
1211
1212
1213 AT_SETUP([ofproto-dpif - mirroring, select_src])
1214 OVS_VSWITCHD_START
1215 ADD_OF_PORTS([br0], 1, 2, 3)
1216 ovs-vsctl \
1217         set Bridge br0 mirrors=@m --\
1218         --id=@p1 get Port p1 -- --id=@p3 get Port p3 --\
1219         --id=@m create Mirror name=mymirror select_src_port=@p1 output_port=@p3
1220
1221 AT_DATA([flows.txt], [dnl
1222 in_port=1 actions=output:2
1223 in_port=2 actions=output:1
1224 ])
1225 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1226
1227 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)"
1228 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1229 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1230   [Datapath actions: 2,3
1231 ])
1232
1233 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)"
1234 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1235 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1236   [Datapath actions: 1
1237 ])
1238 OVS_VSWITCHD_STOP
1239 AT_CLEANUP
1240
1241 AT_SETUP([ofproto-dpif - mirroring, OFPP_NONE ingress port])
1242 OVS_VSWITCHD_START
1243 ADD_OF_PORTS([br0], 1, 2)
1244 ovs-vsctl \
1245         set Bridge br0 mirrors=@m --\
1246         --id=@p2 get Port p2 --\
1247         --id=@m create Mirror name=mymirror select_all=true output_port=@p2
1248
1249 AT_CHECK([ovs-ofctl add-flow br0 action=output:1])
1250
1251 # "in_port" defaults to OFPP_NONE if it's not specified.
1252 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"
1253 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
1254 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1255   [Datapath actions: 1,2
1256 ])
1257
1258 OVS_VSWITCHD_STOP
1259 AT_CLEANUP
1260
1261
1262 AT_SETUP([ofproto-dpif - mirroring, select_dst])
1263 OVS_VSWITCHD_START
1264 ADD_OF_PORTS([br0], 1, 2, 3)
1265 ovs-vsctl \
1266         set Bridge br0 mirrors=@m --\
1267         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
1268         --id=@m create Mirror name=mymirror select_dst_port=@p2 output_port=@p3
1269
1270 AT_DATA([flows.txt], [dnl
1271 in_port=1 actions=output:2
1272 in_port=2 actions=output:1
1273 ])
1274 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1275
1276 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)"
1277 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1278 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1279   [Datapath actions: 2,3
1280 ])
1281
1282 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)"
1283 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1284 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1285   [Datapath actions: 1
1286 ])
1287
1288 OVS_VSWITCHD_STOP
1289 AT_CLEANUP
1290
1291
1292 AT_SETUP([ofproto-dpif - mirroring, select_vlan])
1293 OVS_VSWITCHD_START
1294 ADD_OF_PORTS([br0], 1, 2, 3)
1295 ovs-vsctl \
1296         set Bridge br0 mirrors=@m --\
1297         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
1298         --id=@m create Mirror name=mymirror select_all=true select_vlan=11 output_port=@p3
1299
1300 AT_DATA([flows.txt], [dnl
1301 in_port=1, actions=output:2
1302 ])
1303 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1304
1305 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)"
1306 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1307 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1308   [Datapath actions: 2
1309 ])
1310
1311 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))"
1312 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1313 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1314   [Datapath actions: 2
1315 ])
1316
1317 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))"
1318 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1319 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1320   [Datapath actions: 2,3
1321 ])
1322
1323 OVS_VSWITCHD_STOP
1324 AT_CLEANUP
1325
1326
1327 AT_SETUP([ofproto-dpif - mirroring, output_port])
1328 OVS_VSWITCHD_START
1329 ADD_OF_PORTS([br0], 1, 2, 3)
1330 ovs-vsctl \
1331         set Bridge br0 mirrors=@m --\
1332         --id=@p3 get Port p3 --\
1333         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
1334
1335 AT_DATA([flows.txt], [dnl
1336 in_port=1 actions=mod_vlan_vid:17,output:2
1337 in_port=2 actions=output:1
1338 ])
1339 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1340
1341 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)"
1342 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1343 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1344   [Datapath actions: push_vlan(vid=17,pcp=0),2,pop_vlan,3
1345 ])
1346
1347 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)"
1348 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1349 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1350   [Datapath actions: 1,3
1351 ])
1352
1353 OVS_VSWITCHD_STOP
1354 AT_CLEANUP
1355
1356 AT_SETUP([ofproto-dpif - mirroring, output_vlan])
1357 OVS_VSWITCHD_START
1358 ADD_OF_PORTS([br0], 1, 2)
1359 ovs-vsctl \
1360         set Bridge br0 mirrors=@m --\
1361         --id=@m create Mirror name=mymirror select_all=true output_vlan=12
1362
1363 AT_DATA([flows.txt], [dnl
1364 in_port=1 actions=output:2
1365 in_port=2 actions=mod_vlan_vid:17,output:1
1366 ])
1367 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1368
1369 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)"
1370 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1371 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1372
1373 expected="2,push_vlan(vid=12,pcp=0),1,2,100"
1374 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
1375 mv stdout expout
1376 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
1377
1378 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)"
1379 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1380 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1381
1382 expected="push_vlan(vid=17,pcp=0),1,pop_vlan,push_vlan(vid=12,pcp=0),1,2,100"
1383 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
1384 mv stdout expout
1385 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
1386
1387 OVS_VSWITCHD_STOP
1388 AT_CLEANUP
1389
1390 # Two testcases below are for the ofproto/trace command
1391 # The first one tests all correct syntax:
1392 # ofproto/trace [dp_name] odp_flow [-generate|packet]
1393 # ofproto/trace br_name br_flow [-generate|packet]
1394 AT_SETUP([ofproto-dpif - ofproto/trace command 1])
1395 OVS_VSWITCHD_START([set bridge br0 fail-mode=standalone])
1396 ADD_OF_PORTS([br0], 1, 2, 3)
1397
1398 AT_DATA([flows.txt], [dnl
1399 in_port=1 actions=output:2
1400 in_port=2 actions=output:1
1401 ])
1402 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1403
1404 odp_flow="in_port(p1)"
1405 br_flow="in_port=1"
1406 # Test command: ofproto/trace odp_flow with in_port as a name.
1407 AT_CHECK([ovs-appctl ofproto/trace "$odp_flow"], [0], [stdout])
1408 AT_CHECK([tail -1 stdout], [0], [dnl
1409 Datapath actions: 2
1410 ])
1411
1412 odp_flow="in_port(1)"
1413 # Test command: ofproto/trace odp_flow
1414 AT_CHECK([ovs-appctl ofproto/trace "$odp_flow"], [0], [stdout])
1415 AT_CHECK([tail -1 stdout], [0], [dnl
1416 Datapath actions: 2
1417 ])
1418
1419 # Test command: ofproto/trace dp_name odp_flow
1420 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$odp_flow"], [0], [stdout])
1421 AT_CHECK([tail -1 stdout], [0], [dnl
1422 Datapath actions: 2
1423 ])
1424 # Test commmand: ofproto/trace br_name br_flow
1425 AT_CHECK([ovs-appctl ofproto/trace br0 "$br_flow"], [0], [stdout])
1426 AT_CHECK([tail -1 stdout], [0], [dnl
1427 Datapath actions: 2
1428 ])
1429
1430 # Delete the inserted flows
1431 AT_CHECK([ovs-ofctl del-flows br0 "in_port=1"], [0], [stdout])
1432 AT_CHECK([ovs-ofctl del-flows br0 "in_port=2"], [0], [stdout])
1433
1434 # This section beflow tests the [-generate] option
1435 odp_flow="in_port(3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff)"
1436 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"
1437
1438 # Test command: ofproto/trace odp_flow
1439 AT_CHECK([ovs-appctl ofproto/trace "$odp_flow"], [0], [stdout])
1440 # Check for no MAC learning entry
1441 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1442  port  VLAN  MAC                Age
1443 ])
1444
1445 # Test command: ofproto/trace br_name br_flow
1446 AT_CHECK([ovs-appctl ofproto/trace br0 "$br_flow"], [0], [stdout])
1447 # Check for no MAC learning entry
1448 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1449  port  VLAN  MAC                Age
1450 ])
1451
1452 # Test command: ofproto/trace odp_flow -generate
1453 AT_CHECK([ovs-appctl ofproto/trace "$odp_flow" -generate], [0], [stdout])
1454 # Check for the MAC learning entry
1455 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1456  port  VLAN  MAC                Age
1457     3     0  50:54:00:00:00:05    ?
1458 ])
1459
1460 # Test command: ofproto/trace dp_name odp_flow -generate
1461 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy \
1462   "in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05)" \
1463   -generate], [0], [stdout])
1464 # Check for both MAC learning entries
1465 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1466  port  VLAN  MAC                Age
1467     3     0  50:54:00:00:00:05    ?
1468     1     0  50:54:00:00:00:06    ?
1469 ])
1470
1471 # Test command: ofproto/trace br_name br_flow -generate
1472 AT_CHECK([ovs-appctl ofproto/trace br0 \
1473   "in_port=2,dl_src=50:54:00:00:00:07,dl_dst=50:54:00:00:00:06" \
1474   -generate], [0], [stdout])
1475 # Check for both MAC learning entries.
1476 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1477  port  VLAN  MAC                Age
1478     3     0  50:54:00:00:00:05    ?
1479     1     0  50:54:00:00:00:06    ?
1480     2     0  50:54:00:00:00:07    ?
1481 ])
1482
1483 # This section beflow tests the [packet] option
1484 # The ovs-tcpundump of packets between port1 and port2
1485 pkt1to2="50540000000250540000000108064500001C000100004001F98CC0A80001C0A800020800F7FF00000000"
1486 pkt2to1="50540000000150540000000208064500001C000100004001F98CC0A80002C0A800010800F7FF00000000"
1487
1488 # Construct the MAC learning table
1489 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy \
1490   "in_port(1),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff)" \
1491   -generate], [0], [stdout])
1492
1493 # Construct the MAC learning table
1494 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy \
1495   "in_port(2),eth(src=50:54:00:00:00:02,dst=ff:ff:ff:ff:ff:ff)" \
1496   -generate], [0], [stdout])
1497
1498 # Test command: ofproto/trace odp_flow packet
1499 AT_CHECK([ovs-appctl ofproto/trace \
1500   "in_port(1),skb_priority(1),skb_mark(2)" "$pkt1to2"], [0], [stdout])
1501 AT_CHECK([tail -1 stdout], [0], [dnl
1502 Datapath actions: 2
1503 ])
1504 AT_CHECK([head -n 2 stdout], [0], [dnl
1505 Bridge: br0
1506 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
1507 ])
1508
1509 # Test command: ofproto/trace dp_name odp_flow packet
1510 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy \
1511   "in_port(1),skb_priority(1),skb_mark(2)" "$pkt1to2"], [0], [stdout])
1512 AT_CHECK([tail -1 stdout], [0], [dnl
1513 Datapath actions: 2
1514 ])
1515 AT_CHECK([head -n 2 stdout], [0], [dnl
1516 Bridge: br0
1517 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
1518 ])
1519
1520 # Test command: ofproto/trace br_name br_flow packet
1521 AT_CHECK([ovs-appctl ofproto/trace br0 \
1522   "in_port=2,skb_priority=2,pkt_mark=1" "$pkt2to1"], [0], [stdout],[stderr])
1523 AT_CHECK([tail -1 stdout], [0], [dnl
1524 Datapath actions: 1
1525 ])
1526 AT_CHECK([head -n 2 stdout], [0], [dnl
1527 Bridge: br0
1528 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
1529 ])
1530
1531 OVS_VSWITCHD_STOP
1532 AT_CLEANUP
1533
1534 # The second test tests the corner cases
1535 AT_SETUP([ofproto-dpif - ofproto/trace command 2])
1536 OVS_VSWITCHD_START
1537 ADD_OF_PORTS([br0], 1, 2)
1538
1539 # Define flows
1540 odp_flow="in_port(1),eth(src=50:54:00:00:00:01,dst=50:54:00:00:00:02)"
1541 br_flow="in_port=1,dl_src=50:54:00:00:00:01,dl_dst=50:54:00:00:00:02"
1542 # Define options
1543 generate="-generate"
1544 pkt="50540000000250540000000108064500001C000100004001F98CC0A80001C0A800020800F7FF00000000"
1545
1546 # Test incorrect command: ofproto/trace wrong_name odp_flow [-generate|packet]
1547 m4_foreach(
1548 [option],
1549 [[],
1550 ["$generate"],
1551 ["$pkt"]],
1552 [AT_CHECK([ovs-appctl ofproto/trace wrong_name "$odp_flow" option],
1553   [2], [], [stderr])
1554 AT_CHECK([tail -2 stderr], [0], [dnl
1555 Cannot find the datapath
1556 ovs-appctl: ovs-vswitchd: server returned an error
1557 ])])
1558
1559 # Test incorrect command: ofproto/trace empty_string odp_flow [-generate|packet]
1560 m4_foreach(
1561 [option],
1562 [[],
1563 ["$generate"],
1564 ["$pkt"]],
1565 [AT_CHECK([ovs-appctl ofproto/trace "" "$odp_flow" option],
1566   [2], [], [stderr])
1567 AT_CHECK([tail -2 stderr], [0], [dnl
1568 Cannot find the datapath
1569 ovs-appctl: ovs-vswitchd: server returned an error
1570 ])])
1571
1572 # Test incorrect command: ofproto/trace nonexist_dp_name odp_flow [-generate|packet]
1573 m4_foreach(
1574 [option],
1575 [[],
1576 ["$generate"],
1577 ["$pkt"]],
1578 [AT_CHECK([ovs-appctl ofproto/trace ovs-system "$odp_flow" option],
1579   [2], [], [stderr])
1580 AT_CHECK([tail -2 stderr], [0], [dnl
1581 Cannot find the datapath
1582 ovs-appctl: ovs-vswitchd: server returned an error
1583 ])])
1584
1585 # Test incorrect command: ofproto/trace br_name odp_flow [-generate|packet]
1586 m4_foreach(
1587 [option],
1588 [[],
1589 ["$generate"],
1590 ["$pkt"]],
1591 [AT_CHECK([ovs-appctl ofproto/trace br0 "$odp_flow" option],
1592   [2], [], [stderr])
1593 AT_CHECK([tail -2 stderr], [0], [dnl
1594 Cannot find the datapath
1595 ovs-appctl: ovs-vswitchd: server returned an error
1596 ])])
1597
1598 # Test incorrect command: ofproto/trace dp_name br_flow [-generate|packet]
1599 m4_foreach(
1600 [option],
1601 [[],
1602 ["$generate"],
1603 ["$pkt"]],
1604 [AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$br_flow" option],
1605   [2], [], [stderr])
1606 AT_CHECK([tail -2 stderr], [0], [dnl
1607 Unknown bridge name
1608 ovs-appctl: ovs-vswitchd: server returned an error
1609 ])])
1610
1611 # Test incorrect command: ofproto/trace br_flow [-generate|packet]
1612 m4_foreach(
1613 [option],
1614 [[],
1615 ["$generate"],
1616 ["$pkt"]],
1617 [AT_CHECK([ovs-appctl ofproto/trace "$br_flow" option],
1618   [2], [], [stderr])
1619 AT_CHECK([tail -2 stderr], [0], [dnl
1620 Must specify bridge name
1621 ovs-appctl: ovs-vswitchd: server returned an error
1622 ])])
1623
1624 # Test incorrect command: ofproto/trace dp_name odp_flow garbage_option
1625 AT_CHECK([ovs-appctl ofproto/trace \
1626   ovs-dummy "$odp_flow" garbage_option],
1627   [2], [stdout],[stderr])
1628 AT_CHECK([tail -2 stderr], [0], [dnl
1629 Trailing garbage in packet data
1630 ovs-appctl: ovs-vswitchd: server returned an error
1631 ])
1632
1633 # Test incorrect command: ofproto/trace with 4 arguments
1634 AT_CHECK([ovs-appctl ofproto/trace \
1635   arg1, arg2, arg3, arg4], [2], [stdout],[stderr])
1636 AT_CHECK([tail -2 stderr], [0], [dnl
1637 "ofproto/trace" command takes at most 3 arguments
1638 ovs-appctl: ovs-vswitchd: server returned an error
1639 ])
1640
1641 # Test incorrect command: ofproto/trace with 0 argument
1642 AT_CHECK([ovs-appctl ofproto/trace ], [2], [stdout],[stderr])
1643 AT_CHECK([tail -2 stderr], [0], [dnl
1644 "ofproto/trace" command requires at least 1 arguments
1645 ovs-appctl: ovs-vswitchd: server returned an error
1646 ])
1647
1648 OVS_VSWITCHD_STOP
1649 AT_CLEANUP
1650
1651 AT_SETUP([ofproto-dpif - ofproto/trace-packet-out])
1652 OVS_VSWITCHD_START
1653 ADD_OF_PORTS([br0], 1, 2, 3)
1654
1655 AT_DATA([flows.txt], [dnl
1656 in_port=1 actions=output:2
1657 in_port=2 actions=output:1
1658 ])
1659 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1660
1661 AT_CHECK([ovs-appctl ofproto/trace-packet-out br0 in_port=1 'mod_vlan_vid:123,resubmit(,0)'], [0], [stdout])
1662 AT_CHECK([tail -1 stdout], [0], [dnl
1663 Datapath actions: push_vlan(vid=123,pcp=0),2
1664 ])
1665
1666 OVS_VSWITCHD_STOP
1667 AT_CLEANUP
1668
1669
1670 m4_define([OFPROTO_TRACE],
1671   [flow="$2"
1672    AT_CHECK([ovs-appctl ofproto/trace $1 "$flow" $3], [0], [stdout])
1673    actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1674    expected="$4"
1675    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" $5],
1676      [0], [stdout])
1677    mv stdout expout
1678    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" $5],
1679      [0], [expout])])
1680
1681 AT_SETUP([ofproto-dpif - MAC learning])
1682 OVS_VSWITCHD_START([set bridge br0 fail-mode=standalone])
1683 ADD_OF_PORTS([br0], 1, 2, 3)
1684
1685 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)'
1686
1687 # Trace an ARP packet arriving on p3, to create a MAC learning entry.
1688 OFPROTO_TRACE(
1689   [ovs-dummy],
1690   [in_port(3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
1691   [-generate],
1692   [1,2,100])
1693
1694 # Check for the MAC learning entry.
1695 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1696  port  VLAN  MAC                Age
1697     3     0  50:54:00:00:00:05    ?
1698 ])
1699
1700 # Trace a packet arrival destined for the learned MAC.
1701 # (This will also learn a MAC.)
1702 OFPROTO_TRACE(
1703   [ovs-dummy],
1704   [in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05),$arp],
1705   [-generate],
1706   [3])
1707
1708 # Check for both MAC learning entries.
1709 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1710  port  VLAN  MAC                Age
1711     3     0  50:54:00:00:00:05    ?
1712     1     0  50:54:00:00:00:06    ?
1713 ])
1714
1715 # Trace a packet arrival that updates the first learned MAC entry.
1716 OFPROTO_TRACE(
1717   [ovs-dummy],
1718   [in_port(2),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
1719   [-generate],
1720   [1,3,100])
1721
1722 # Check that the MAC learning entry was updated.
1723 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1724  port  VLAN  MAC                Age
1725     1     0  50:54:00:00:00:06    ?
1726     2     0  50:54:00:00:00:05    ?
1727 ])
1728
1729 # Add another bridge.
1730 AT_CHECK(
1731   [ovs-vsctl \
1732      -- add-br br1 \
1733      -- set bridge br1 datapath-type=dummy])
1734 ADD_OF_PORTS([br1], 4, 5)
1735
1736 # Trace some packet arrivals in br1 to create MAC learning entries there too.
1737 OFPROTO_TRACE(
1738   [ovs-dummy],
1739   [in_port(4),eth(src=50:54:00:00:00:06,dst=ff:ff:ff:ff:ff:ff),$arp],
1740   [-generate],
1741   [5,101])
1742 OFPROTO_TRACE(
1743   [ovs-dummy],
1744   [in_port(5),eth(src=50:54:00:00:00:07,dst=ff:ff:ff:ff:ff:ff),$arp],
1745   [-generate],
1746   [4,101])
1747
1748 # Check that the MAC learning entries were added.
1749 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1750  port  VLAN  MAC                Age
1751     4     0  50:54:00:00:00:06    ?
1752     5     0  50:54:00:00:00:07    ?
1753 ])
1754
1755 # Delete port p1 and see that its MAC learning entry disappeared, and
1756 # that the MAC learning entry for the same MAC was also deleted from br1.
1757 AT_CHECK([ovs-vsctl del-port p1])
1758 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1759  port  VLAN  MAC                Age
1760     2     0  50:54:00:00:00:05    ?
1761 ])
1762 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1763  port  VLAN  MAC                Age
1764     5     0  50:54:00:00:00:07    ?
1765 ])
1766
1767 OVS_VSWITCHD_STOP
1768 AT_CLEANUP
1769
1770 AT_SETUP([ofproto-dpif - MAC table overflow])
1771 OVS_VSWITCHD_START(
1772   [set bridge br0 fail-mode=standalone other-config:mac-table-size=10])
1773 ADD_OF_PORTS([br0], 1, 2, 3)
1774
1775 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)'
1776
1777 AT_CHECK([ovs-appctl time/stop])
1778
1779 # Trace 10 ARP packets arriving on p3, to create MAC learning entries.
1780 for i in 0 1 2 3 4 5 6 7 8 9; do
1781     OFPROTO_TRACE(
1782       [ovs-dummy],
1783       [in_port(3),eth(src=50:54:00:00:00:0$i,dst=ff:ff:ff:ff:ff:ff),$arp],
1784       [-generate],
1785       [1,2,100])
1786     ovs-appctl time/warp 1000
1787 done
1788
1789 # Check for the MAC learning entries.
1790 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/ *[[0-9]]\{1,\}$//' | sort],
1791   [0], [dnl
1792     3     0  50:54:00:00:00:00
1793     3     0  50:54:00:00:00:01
1794     3     0  50:54:00:00:00:02
1795     3     0  50:54:00:00:00:03
1796     3     0  50:54:00:00:00:04
1797     3     0  50:54:00:00:00:05
1798     3     0  50:54:00:00:00:06
1799     3     0  50:54:00:00:00:07
1800     3     0  50:54:00:00:00:08
1801     3     0  50:54:00:00:00:09
1802  port  VLAN  MAC                Age
1803 ])
1804
1805 # Trace another ARP packet on another MAC.
1806 OFPROTO_TRACE(
1807   [ovs-dummy],
1808   [in_port(3),eth(src=50:54:00:00:00:10,dst=ff:ff:ff:ff:ff:ff),$arp],
1809   [-generate],
1810   [1,2,100])
1811
1812 # Check that the new one chased the oldest one out of the table.
1813 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/' | sort],
1814   [0], [dnl
1815     3     0  50:54:00:00:00:01    ?
1816     3     0  50:54:00:00:00:02    ?
1817     3     0  50:54:00:00:00:03    ?
1818     3     0  50:54:00:00:00:04    ?
1819     3     0  50:54:00:00:00:05    ?
1820     3     0  50:54:00:00:00:06    ?
1821     3     0  50:54:00:00:00:07    ?
1822     3     0  50:54:00:00:00:08    ?
1823     3     0  50:54:00:00:00:09    ?
1824     3     0  50:54:00:00:00:10    ?
1825  port  VLAN  MAC                Age
1826 ])
1827 OVS_VSWITCHD_STOP
1828 AT_CLEANUP
1829
1830 dnl Test that sFlow samples packets correctly.
1831 AT_SETUP([ofproto-dpif - sFlow packet sampling])
1832 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
1833
1834 ON_EXIT([kill `cat test-sflow.pid`])
1835 AT_CHECK([test-sflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > sflow.log], [0], [], [ignore])
1836 AT_CAPTURE_FILE([sflow.log])
1837 SFLOW_PORT=`parse_listening_port < test-sflow.log`
1838
1839 ovs-appctl time/stop
1840
1841 ADD_OF_PORTS([br0], 1, 2)
1842 ovs-vsctl \
1843    set Interface br0 options:ifindex=1002 -- \
1844    set Interface p1 options:ifindex=1004 -- \
1845    set Interface p2 options:ifindex=1003 -- \
1846    set Bridge br0 sflow=@sf -- \
1847    --id=@sf create sflow targets=\"127.0.0.1:$SFLOW_PORT\" \
1848      header=128 sampling=1 polling=1
1849
1850 dnl open with ARP packets to seed the bridge-learning.  The output
1851 dnl ifIndex numbers should be reported predictably after that.
1852 dnl Since we set sampling=1 we should see all of these packets
1853 dnl reported. Sorting the output by data-source and seqNo makes
1854 dnl it deterministic. Ensuring that we send at least two packets
1855 dnl into each port means we get to check the seq nos are
1856 dnl incrementing correctly.
1857
1858 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)'
1859 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)'
1860 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)'
1861 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)'
1862 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)'
1863
1864 dnl sleep long enough to get more than one counter sample
1865 dnl from each datasource so we can check sequence numbers
1866 for i in `seq 1 30`; do
1867     ovs-appctl time/warp 100
1868 done
1869 OVS_VSWITCHD_STOP
1870 ovs-appctl -t test-sflow exit
1871
1872 AT_CHECK([[sort sflow.log | $EGREP 'HEADER|ERROR' | sed 's/ /\
1873         /g']], [0], [dnl
1874 HEADER
1875         dgramSeqNo=1
1876         ds=127.0.0.1>2:1000
1877         fsSeqNo=1
1878         in_vlan=0
1879         in_priority=0
1880         out_vlan=0
1881         out_priority=0
1882         meanSkip=1
1883         samplePool=1
1884         dropEvents=0
1885         in_ifindex=1004
1886         in_format=0
1887         out_ifindex=2
1888         out_format=2
1889         hdr_prot=1
1890         pkt_len=64
1891         stripped=4
1892         hdr_len=60
1893         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
1894 HEADER
1895         dgramSeqNo=1
1896         ds=127.0.0.1>2:1000
1897         fsSeqNo=2
1898         in_vlan=0
1899         in_priority=0
1900         out_vlan=0
1901         out_priority=0
1902         meanSkip=1
1903         samplePool=2
1904         dropEvents=0
1905         in_ifindex=1003
1906         in_format=0
1907         out_ifindex=2
1908         out_format=2
1909         hdr_prot=1
1910         pkt_len=64
1911         stripped=4
1912         hdr_len=60
1913         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
1914 HEADER
1915         dgramSeqNo=1
1916         ds=127.0.0.1>2:1000
1917         fsSeqNo=3
1918         in_vlan=0
1919         in_priority=0
1920         out_vlan=0
1921         out_priority=0
1922         meanSkip=1
1923         samplePool=3
1924         dropEvents=0
1925         in_ifindex=1004
1926         in_format=0
1927         out_ifindex=1003
1928         out_format=0
1929         hdr_prot=1
1930         pkt_len=64
1931         stripped=4
1932         hdr_len=60
1933         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
1934 HEADER
1935         dgramSeqNo=1
1936         ds=127.0.0.1>2:1000
1937         fsSeqNo=4
1938         in_vlan=0
1939         in_priority=0
1940         out_vlan=0
1941         out_priority=0
1942         meanSkip=1
1943         samplePool=4
1944         dropEvents=0
1945         in_ifindex=1003
1946         in_format=0
1947         out_ifindex=1004
1948         out_format=0
1949         hdr_prot=1
1950         pkt_len=64
1951         stripped=4
1952         hdr_len=60
1953         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
1954 HEADER
1955         dgramSeqNo=1
1956         ds=127.0.0.1>2:1000
1957         fsSeqNo=5
1958         in_vlan=0
1959         in_priority=0
1960         out_vlan=0
1961         out_priority=0
1962         meanSkip=1
1963         samplePool=5
1964         dropEvents=0
1965         in_ifindex=1003
1966         in_format=0
1967         out_ifindex=1004
1968         out_format=0
1969         hdr_prot=1
1970         pkt_len=64
1971         stripped=4
1972         hdr_len=60
1973         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
1974 ])
1975
1976 AT_CHECK([[sort sflow.log | $EGREP 'IFCOUNTERS|ERROR' | head -6 | sed 's/ /\
1977         /g']], [0], [dnl
1978 IFCOUNTERS
1979         dgramSeqNo=2
1980         ds=127.0.0.1>0:1002
1981         csSeqNo=1
1982         ifindex=1002
1983         type=6
1984         ifspeed=100000000
1985         direction=0
1986         status=3
1987         in_octets=0
1988         in_unicasts=0
1989         in_multicasts=0
1990         in_broadcasts=4294967295
1991         in_discards=0
1992         in_errors=0
1993         in_unknownprotos=4294967295
1994         out_octets=120
1995         out_unicasts=2
1996         out_multicasts=4294967295
1997         out_broadcasts=4294967295
1998         out_discards=0
1999         out_errors=0
2000         promiscuous=0
2001 IFCOUNTERS
2002         dgramSeqNo=2
2003         ds=127.0.0.1>0:1003
2004         csSeqNo=1
2005         ifindex=1003
2006         type=6
2007         ifspeed=100000000
2008         direction=0
2009         status=0
2010         in_octets=138
2011         in_unicasts=3
2012         in_multicasts=0
2013         in_broadcasts=4294967295
2014         in_discards=0
2015         in_errors=0
2016         in_unknownprotos=4294967295
2017         out_octets=120
2018         out_unicasts=2
2019         out_multicasts=4294967295
2020         out_broadcasts=4294967295
2021         out_discards=0
2022         out_errors=0
2023         promiscuous=0
2024 IFCOUNTERS
2025         dgramSeqNo=2
2026         ds=127.0.0.1>0:1004
2027         csSeqNo=1
2028         ifindex=1004
2029         type=6
2030         ifspeed=100000000
2031         direction=0
2032         status=0
2033         in_octets=84
2034         in_unicasts=2
2035         in_multicasts=0
2036         in_broadcasts=4294967295
2037         in_discards=0
2038         in_errors=0
2039         in_unknownprotos=4294967295
2040         out_octets=180
2041         out_unicasts=3
2042         out_multicasts=4294967295
2043         out_broadcasts=4294967295
2044         out_discards=0
2045         out_errors=0
2046         promiscuous=0
2047 IFCOUNTERS
2048         dgramSeqNo=3
2049         ds=127.0.0.1>0:1002
2050         csSeqNo=2
2051         ifindex=1002
2052         type=6
2053         ifspeed=100000000
2054         direction=0
2055         status=3
2056         in_octets=0
2057         in_unicasts=0
2058         in_multicasts=0
2059         in_broadcasts=4294967295
2060         in_discards=0
2061         in_errors=0
2062         in_unknownprotos=4294967295
2063         out_octets=120
2064         out_unicasts=2
2065         out_multicasts=4294967295
2066         out_broadcasts=4294967295
2067         out_discards=0
2068         out_errors=0
2069         promiscuous=0
2070 IFCOUNTERS
2071         dgramSeqNo=3
2072         ds=127.0.0.1>0:1003
2073         csSeqNo=2
2074         ifindex=1003
2075         type=6
2076         ifspeed=100000000
2077         direction=0
2078         status=0
2079         in_octets=138
2080         in_unicasts=3
2081         in_multicasts=0
2082         in_broadcasts=4294967295
2083         in_discards=0
2084         in_errors=0
2085         in_unknownprotos=4294967295
2086         out_octets=120
2087         out_unicasts=2
2088         out_multicasts=4294967295
2089         out_broadcasts=4294967295
2090         out_discards=0
2091         out_errors=0
2092         promiscuous=0
2093 IFCOUNTERS
2094         dgramSeqNo=3
2095         ds=127.0.0.1>0:1004
2096         csSeqNo=2
2097         ifindex=1004
2098         type=6
2099         ifspeed=100000000
2100         direction=0
2101         status=0
2102         in_octets=84
2103         in_unicasts=2
2104         in_multicasts=0
2105         in_broadcasts=4294967295
2106         in_discards=0
2107         in_errors=0
2108         in_unknownprotos=4294967295
2109         out_octets=180
2110         out_unicasts=3
2111         out_multicasts=4294967295
2112         out_broadcasts=4294967295
2113         out_discards=0
2114         out_errors=0
2115         promiscuous=0
2116 ])
2117 AT_CLEANUP
2118
2119
2120
2121 dnl Test that basic NetFlow reports flow statistics correctly:
2122 dnl - The initial packet of a flow are correctly accounted.
2123 dnl - Later packets within a flow are correctly accounted.
2124 dnl - Flow actions changing (in this case, due to MAC learning)
2125 dnl   cause a record to be sent.
2126 AT_SETUP([ofproto-dpif - NetFlow flow expiration])
2127
2128 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
2129 ADD_OF_PORTS([br0], 1, 2)
2130
2131 ovs-appctl time/stop
2132 ON_EXIT([kill `cat test-netflow.pid`])
2133 AT_CHECK([test-netflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > netflow.log], [0], [], [ignore])
2134 AT_CAPTURE_FILE([netflow.log])
2135 NETFLOW_PORT=`parse_listening_port < test-netflow.log`
2136
2137 ovs-vsctl \
2138    set Bridge br0 netflow=@nf -- \
2139    --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
2140      engine_id=1 engine_type=2 active_timeout=30 add-id-to-interface=false
2141
2142 for delay in 1000 30000; do
2143     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)'
2144     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)'
2145
2146     ovs-appctl time/warp $delay
2147 done
2148
2149 ovs-appctl time/warp 6000
2150 sleep 1
2151 OVS_VSWITCHD_STOP
2152 ovs-appctl -t test-netflow exit
2153
2154 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])
2155
2156 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])
2157
2158 combined=`grep "192.168.0.2 > 192.168.0.1, if 2 > 1, 2 pkts, 120 bytes, ICMP 0:0" netflow.log | wc -l`
2159 separate=`grep "192.168.0.2 > 192.168.0.1, if 2 > 1, 1 pkts, 60 bytes, ICMP 0:0" netflow.log | wc -l`
2160 AT_CHECK([test $separate = 2 || test $combined = 1], [0])
2161
2162 AT_CLEANUP
2163
2164 dnl Test that basic NetFlow reports active expirations correctly.
2165 AT_SETUP([ofproto-dpif - NetFlow active expiration])
2166
2167 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
2168 ADD_OF_PORTS([br0], 1, 2)
2169
2170 ON_EXIT([kill `cat test-netflow.pid`])
2171 AT_CHECK([test-netflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > netflow.log], [0], [], [ignore])
2172 AT_CAPTURE_FILE([netflow.log])
2173 NETFLOW_PORT=`parse_listening_port < test-netflow.log`
2174
2175 ovs-vsctl \
2176    set Bridge br0 netflow=@nf -- \
2177    --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
2178      engine_id=1 engine_type=2 active_timeout=10 add-id-to-interface=false
2179
2180 AT_CHECK([ovs-appctl time/stop])
2181 n=1
2182 while test $n -le 60; do
2183     n=`expr $n + 1`
2184
2185     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)'
2186     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)'
2187
2188     ovs-appctl time/warp 1000
2189 done
2190
2191 ovs-appctl time/warp 10000
2192
2193 sleep 1
2194 OVS_VSWITCHD_STOP
2195 ovs-appctl -t test-netflow exit
2196
2197 # Count the number of reported packets:
2198 # - From source to destination before MAC learning kicks in (just one).
2199 # - From source to destination after that.
2200 # - From destination to source.
2201 n_learn=0
2202 n_in=0
2203 n_out=0
2204 n_other=0
2205 n_recs=0
2206 none=0
2207 while read line; do
2208     pkts=`echo "$line" | sed 's/.*, \([[0-9]]*\) pkts,.*/\1/'`
2209     case $pkts in
2210          [[0-9]]*) ;;
2211          *) continue ;;
2212     esac
2213
2214     case $line in
2215         "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 65535, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
2216             counter=n_learn
2217             ;;
2218         "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 2, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
2219             counter=n_in
2220             ;;
2221         "seq "*": 192.168.0.2 > 192.168.0.1, if 2 > 1, "*" pkts, "*" bytes, TCP 80 > 1234, time "*)
2222             counter=n_out
2223             ;;
2224         *)
2225             counter=n_other
2226             ;;
2227     esac
2228     eval $counter=\`expr \$$counter + \$pkts\`
2229     n_recs=`expr $n_recs + 1`
2230 done < netflow.log
2231
2232 # There should be exactly 1 MAC learning packet,
2233 # exactly 59 other packets in that direction,
2234 # and exactly 60 packets in the other direction.
2235 AT_CHECK([echo $n_learn $n_in $n_out $n_other], [0], [1 59 60 0
2236 ])
2237
2238 AT_CLEANUP
2239
2240 AT_SETUP([idle_age and hard_age increase over time])
2241 OVS_VSWITCHD_START
2242
2243 # get_ages DURATION HARD IDLE
2244 #
2245 # Fetch the flow duration, hard age, and idle age into the variables
2246 # whose names are given as arguments.  Rounds DURATION down to the
2247 # nearest integer.  If hard_age doesn't appear in the output, sets
2248 # HARD to "none".  If idle_age doesn't appear in the output, sets IDLE
2249 # to 0.
2250 get_ages () {
2251     AT_CHECK([ovs-ofctl dump-flows br0], [0], [stdout])
2252
2253     duration=`sed -n 's/.*duration=\([[0-9]]*\)\(\.[[0-9]]*\)\{0,1\}s.*/\1/p' stdout`
2254     AT_CHECK([[expr X"$duration" : 'X[0-9][0-9]*$']], [0], [ignore])
2255     AS_VAR_COPY([$1], [duration])
2256
2257     hard=`sed -n 's/.*hard_age=\([[0-9]]*\),.*/\1/p' stdout`
2258     if test X"$hard" = X; then
2259         hard=none
2260     else
2261         AT_CHECK([[expr X"$hard" : 'X[0-9][0-9]*$']], [0], [ignore])
2262     fi
2263     AS_VAR_COPY([$2], [hard])
2264
2265     idle=`sed -n 's/.*idle_age=\([[0-9]]*\),.*/\1/p' stdout`
2266     if test X"$idle" = X; then
2267         idle=0
2268     else
2269         AT_CHECK([[expr X"$idle" : 'X[0-9][0-9]*$']], [0], [ignore])
2270     fi
2271     AS_VAR_COPY([$3], [idle])
2272 }
2273
2274 # Add a flow and get its initial hard and idle age.
2275 AT_CHECK([ovs-ofctl add-flow br0 hard_timeout=199,idle_timeout=188,actions=drop])
2276 get_ages duration1 hard1 idle1
2277
2278 ovs-appctl time/stop
2279 # Warp time forward by 10 seconds, then modify the flow's actions.
2280 ovs-appctl time/warp 10000
2281 get_ages duration2 hard2 idle2
2282 AT_CHECK([ovs-ofctl mod-flows br0 actions=flood])
2283
2284 # Warp time forward by 10 seconds.
2285 ovs-appctl time/warp 10000
2286 get_ages duration3 hard3 idle3
2287
2288 # Warp time forward 10 more seconds, then pass some packets through the flow,
2289 # then warp forward a few more times because idle times are only updated
2290 # occasionally.
2291 ovs-appctl time/warp 10000
2292 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)'
2293 ovs-appctl time/warp 1000
2294 ovs-appctl time/warp 1000
2295 ovs-appctl time/warp 1000
2296 get_ages duration4 hard4 idle4
2297
2298 printf "duration: %4s => %4s => %4s => %4s\n" $duration1 $duration2 $duration3 $duration4
2299 printf "hard_age: %4s => %4s => %4s => %4s\n" $hard1 $hard2 $hard3 $hard4
2300 printf "idle_age: %4s => %4s => %4s => %4s\n" $idle1 $idle2 $idle3 $idle4
2301
2302 # Duration should increase steadily over time.
2303 AT_CHECK([test $duration1 -lt $duration2])
2304 AT_CHECK([test $duration2 -lt $duration3])
2305 AT_CHECK([test $duration3 -lt $duration4])
2306
2307 # Hard age should be "none" initially because it's the same as flow_duration,
2308 # then it should increase.
2309 AT_CHECK([test $hard1 = none])
2310 AT_CHECK([test $hard2 = none])
2311 AT_CHECK([test $hard3 != none])
2312 AT_CHECK([test $hard4 != none])
2313 AT_CHECK([test $hard3 -lt $hard4])
2314
2315 # Idle age should increase from 1 to 2 to 3, then decrease.
2316 AT_CHECK([test $idle1 -lt $idle2])
2317 AT_CHECK([test $idle2 -lt $idle3])
2318 AT_CHECK([test $idle3 -gt $idle4])
2319
2320 # Check some invariant relationships.
2321 AT_CHECK([test $duration1 = $idle1])
2322 AT_CHECK([test $duration2 = $idle2])
2323 AT_CHECK([test $duration3 = $idle3])
2324 AT_CHECK([test $idle3 -gt $hard3])
2325 AT_CHECK([test $idle4 -lt $hard4])
2326 AT_CHECK([test $hard4 -lt $duration4])
2327
2328 OVS_VSWITCHD_STOP
2329 AT_CLEANUP
2330
2331 AT_SETUP([ofproto-dpif - fin_timeout])
2332 OVS_VSWITCHD_START
2333 AT_DATA([flows.txt], [dnl
2334 in_port=1 actions=output:2
2335 in_port=2 actions=mod_vlan_vid:17,output:1
2336 ])
2337 AT_CHECK([ovs-ofctl add-flow br0 'idle_timeout=60,actions=fin_timeout(idle_timeout=5)'])
2338 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
2339 [NXST_FLOW reply:
2340  idle_timeout=60, actions=fin_timeout(idle_timeout=5)
2341 ])
2342
2343 ovs-appctl time/stop
2344 # Check that a TCP SYN packet does not change the timeout.  (Because
2345 # flow stats updates are mainly what implements the fin_timeout
2346 # feature, we warp forward a couple of times to ensure that flow stats
2347 # run before re-checking the flow table.)
2348 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f908004500003c2e2440004006465dac11370dac11370b828b0016751e267b00000000a00216d017360000020405b40402080a2d25085f0000000001030307])
2349 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
2350 warped
2351 ])
2352 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
2353 [NXST_FLOW reply:
2354  n_packets=1, n_bytes=74, idle_timeout=60, actions=fin_timeout(idle_timeout=5)
2355 ])
2356 # Check that a TCP FIN packet does change the timeout.
2357 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f90800451000342e3e40004006463bac11370dac11370b828b0016751e319dfc96399b801100717ae800000101080a2d250a9408579588])
2358 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
2359 warped
2360 ])
2361 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
2362 [NXST_FLOW reply:
2363  n_packets=2, n_bytes=140, idle_timeout=5, actions=fin_timeout(idle_timeout=5)
2364 ])
2365 OVS_VSWITCHD_STOP
2366 AT_CLEANUP
2367
2368 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-dps])
2369 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
2370 ADD_OF_PORTS([br0], [1], [2])
2371 ADD_OF_PORTS([br1], [3])
2372
2373 AT_CHECK([ovs-appctl dpif/dump-dps], [0], [dnl
2374 dummy@br0
2375 dummy@br1
2376 ])
2377 OVS_VSWITCHD_STOP
2378 AT_CLEANUP
2379
2380 AT_SETUP([ofproto-dpif - ovs-appctl dpif/show])
2381 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
2382 ADD_OF_PORTS([br0], [1], [2])
2383 ADD_OF_PORTS([br1], [3])
2384
2385 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
2386 dummy@ovs-dummy: hit:0 missed:0
2387         br0:
2388                 br0 65534/100: (dummy)
2389                 p1 1/1: (dummy)
2390                 p2 2/2: (dummy)
2391         br1:
2392                 br1 65534/101: (dummy)
2393                 p3 3/3: (dummy)
2394 ])
2395 OVS_VSWITCHD_STOP
2396 AT_CLEANUP
2397
2398 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-flows])
2399 OVS_VSWITCHD_START([add-br br1 -- \
2400                     set bridge br1 datapath-type=dummy fail-mode=secure])
2401 ADD_OF_PORTS([br0], [1], [2])
2402 ADD_OF_PORTS([br1], [3])
2403
2404 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)'])
2405 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)'])
2406 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)'])
2407
2408 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
2409 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))
2410 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))
2411 ])
2412
2413 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
2414 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))
2415 ])
2416
2417 AT_CHECK([ovs-appctl dpif/dump-flows -m br0 | sort | STRIP_USED], [0], [dnl
2418 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))
2419 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))
2420 ])
2421
2422 AT_CHECK([ovs-appctl dpif/dump-flows -m br1 | sort | STRIP_USED], [0], [dnl
2423 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))
2424 ])
2425
2426 OVS_VSWITCHD_STOP
2427 AT_CLEANUP
2428
2429 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-flows - MPLS actions that result in a userspace action])
2430 OVS_VSWITCHD_START([dnl
2431    add-port br0 p1 -- set Interface p1 type=dummy
2432 ])
2433 ON_EXIT([kill `cat ovs-ofctl.pid`])
2434
2435 AT_CAPTURE_FILE([ofctl_monitor.log])
2436 AT_DATA([flows.txt], [dnl
2437 dl_src=60:66:66:66:66:00 actions=push_mpls:0x8847,controller
2438 dl_src=60:66:66:66:66:01 actions=pop_mpls:0x8849,controller
2439 ])
2440 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2441
2442 dnl Packet is sent to userspace because a MPLS push or pop action is applied to
2443 dnl a packet with 4 MPLS LSEs but userspace and the datapath can only handle up
2444 dnl to 3 labels.
2445 dnl
2446 dnl The input is a frame with four MPLS labels which tcpdump -vve shows as:
2447 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)
2448 dnl         (label 20, exp 0, ttl 32)
2449 dnl         (label 20, exp 0, ttl 32)
2450 dnl         (label 20, exp 0, [S], ttl 32)
2451 dnl         (tos 0x0, ttl 64, id 0, offset 0, flags [none], proto TCP (6), length 44, bad cksum 3b78 (->f978)!)
2452 dnl     192.168.0.1.80 > 192.168.0.2.0: Flags [none], cksum 0x7744 (correct), seq 42:46, win 10000, length 4
2453
2454 for dl_src in 00 01; do
2455     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"])
2456
2457     AT_CHECK_UNQUOTED([ovs-appctl dpif/dump-flows br0 | grep ":$dl_src/" | STRIP_USED], [0], [dnl
2458 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
2459 ])
2460 done
2461
2462 OVS_VSWITCHD_STOP
2463 AT_CLEANUP
2464
2465
2466 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-flows - MPLS actions that result in a drop])
2467 OVS_VSWITCHD_START([dnl
2468    add-port br0 p1 -- set Interface p1 type=dummy
2469 ])
2470 ON_EXIT([kill `cat ovs-ofctl.pid`])
2471
2472 AT_CAPTURE_FILE([ofctl_monitor.log])
2473 AT_DATA([flows.txt], [dnl
2474 dl_src=60:66:66:66:66:00 actions=push_mpls:0x8847,controller
2475 dl_src=60:66:66:66:66:01 actions=pop_mpls:0x8849,controller
2476 ])
2477 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2478
2479 dnl Packet is dropped because an MPLS PUSH action is applied to a packet with
2480 dnl 4 MPLS LSEs but ovs-vswtichd can only handle up to 3 MPLS LSEs and thus
2481 dnl can't determine the resulting MPLS label after an MPLS PUSH action.
2482 dnl
2483 dnl The input is a frame with two MPLS headers which tcpdump -vve shows as:
2484 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)
2485 dnl         (label 20, exp 0, ttl 32)
2486 dnl         (label 20, exp 0, ttl 32)
2487 dnl         (label 20, exp 0, [S], ttl 32)
2488 dnl         (tos 0x0, ttl 64, id 0, offset 0, flags [none], proto TCP (6), length 44, bad cksum 3b78 (->f978)!)
2489 dnl     192.168.0.1.80 > 192.168.0.2.0: Flags [none], cksum 0x7744 (correct), seq 42:46, win 10000, length 4
2490 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'])
2491
2492 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
2493 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
2494 ])
2495
2496 OVS_VSWITCHD_STOP
2497 AT_CLEANUP
2498
2499 AT_SETUP([ofproto-dpif - patch ports])
2500 OVS_VSWITCHD_START([add-br br1 \
2501 -- set bridge br1 datapath-type=dummy fail-mode=secure \
2502 -- add-port br1 pbr1 -- set int pbr1 type=patch options:peer=pbr0 \
2503 -- add-port br0 pbr0 -- set int pbr0 type=patch options:peer=pbr1])
2504
2505 ADD_OF_PORTS([br0], [2])
2506 ADD_OF_PORTS([br1], [3])
2507
2508 AT_CHECK([ovs-appctl time/stop])
2509
2510 AT_CHECK([ovs-ofctl add-flow br0 actions=LOCAL,output:1,output:2])
2511 AT_CHECK([ovs-ofctl add-flow br1 actions=LOCAL,output:1,output:3])
2512
2513 for i in $(seq 1 10); do
2514     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)'
2515 done
2516
2517 for i in $(seq 1 5); do
2518     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)'
2519 done
2520
2521 AT_CHECK([ovs-appctl time/warp 500], [0],
2522 [warped
2523 ])
2524
2525 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
2526 dummy@ovs-dummy: hit:13 missed:2
2527         br0:
2528                 br0 65534/100: (dummy)
2529                 p2 2/2: (dummy)
2530                 pbr0 1/none: (patch: peer=pbr1)
2531         br1:
2532                 br1 65534/101: (dummy)
2533                 p3 3/3: (dummy)
2534                 pbr1 1/none: (patch: peer=pbr0)
2535 ])
2536
2537 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_USED], [0], [dnl
2538 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
2539 ]),
2540 AT_CHECK([ovs-appctl dpif/dump-flows br1 | STRIP_USED], [0], [dnl
2541 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
2542 ])
2543
2544 AT_CHECK([ovs-ofctl dump-ports br0 pbr0], [0], [dnl
2545 OFPST_PORT reply (xid=0x4): 1 ports
2546   port  1: rx pkts=5, bytes=300, drop=0, errs=0, frame=0, over=0, crc=0
2547            tx pkts=10, bytes=600, drop=0, errs=0, coll=0
2548 ])
2549
2550 AT_CHECK([ovs-ofctl dump-ports br1 pbr1], [0], [dnl
2551 OFPST_PORT reply (xid=0x4): 1 ports
2552   port  1: rx pkts=10, bytes=600, drop=0, errs=0, frame=0, over=0, crc=0
2553            tx pkts=5, bytes=300, drop=0, errs=0, coll=0
2554 ])
2555
2556 OVS_VSWITCHD_STOP
2557 AT_CLEANUP
2558
2559 AT_SETUP([ofproto-dpif - port duration])
2560 OVS_VSWITCHD_START([set Bridge br0 protocols=OpenFlow13])
2561 ADD_OF_PORTS([br0], 1, 2)
2562
2563 ovs-appctl time/stop
2564 ovs-appctl time/warp 10000
2565
2566 AT_CHECK([ovs-ofctl -O openflow13 dump-ports br0], [0], [stdout])
2567 AT_CHECK([sed -n 's/=[[0-9]][[0-9]]\(\.[[0-9]][[0-9]]*\)\{0,1\}s/=?s/p' stdout], [0],
2568 [dnl
2569            duration=?s
2570            duration=?s
2571            duration=?s
2572 ])
2573 OVS_VSWITCHD_STOP
2574 AT_CLEANUP
2575
2576 dnl ----------------------------------------------------------------------
2577 AT_BANNER([ofproto-dpif -- megaflows])
2578
2579 AT_SETUP([ofproto-dpif megaflow - port classification])
2580 OVS_VSWITCHD_START
2581 ADD_OF_PORTS([br0], [1], [2])
2582 AT_DATA([flows.txt], [dnl
2583 table=0 in_port=1 actions=output(2)
2584 ])
2585 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2586 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)'])
2587 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)'])
2588 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2589 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>
2590 ])
2591 OVS_VSWITCHD_STOP
2592 AT_CLEANUP
2593
2594 AT_SETUP([ofproto-dpif megaflow - L2 classification])
2595 OVS_VSWITCHD_START
2596 ADD_OF_PORTS([br0], [1], [2])
2597 AT_DATA([flows.txt], [dnl
2598 table=0 in_port=1,dl_src=50:54:00:00:00:09 actions=output(2)
2599 ])
2600 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2601 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)'])
2602 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)'])
2603 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2604 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>
2605 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>
2606 ])
2607 OVS_VSWITCHD_STOP
2608 AT_CLEANUP
2609
2610 AT_SETUP([ofproto-dpif megaflow - L3 classification])
2611 OVS_VSWITCHD_START
2612 ADD_OF_PORTS([br0], [1], [2])
2613 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], [])
2614 AT_DATA([flows.txt], [dnl
2615 table=0 in_port=1,icmp,nw_src=10.0.0.4 actions=output(2)
2616 ])
2617 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2618 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)'])
2619 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)'])
2620 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2621 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>
2622 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>
2623 ])
2624 OVS_VSWITCHD_STOP
2625 AT_CLEANUP
2626
2627 AT_SETUP([ofproto-dpif megaflow - IPv6 classification])
2628 OVS_VSWITCHD_START
2629 ADD_OF_PORTS([br0], [1], [2])
2630 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], [])
2631 AT_DATA([flows.txt], [dnl
2632 table=0 in_port=1,ipv6,ipv6_src=2001:db8:3c4d:1:2:3:4:5 actions=output(2)
2633 ])
2634 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2635 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)'])
2636 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)'])
2637 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2638 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>
2639 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>
2640 ])
2641 OVS_VSWITCHD_STOP
2642 AT_CLEANUP
2643
2644 AT_SETUP([ofproto-dpif megaflow - L4 classification])
2645 OVS_VSWITCHD_START
2646 ADD_OF_PORTS([br0], [1], [2])
2647 AT_DATA([flows.txt], [dnl
2648 table=0 in_port=1,icmp,icmp_type=8 actions=output(2)
2649 ])
2650 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2651 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)'])
2652 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)'])
2653 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2654 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>
2655 ])
2656 OVS_VSWITCHD_STOP
2657 AT_CLEANUP
2658
2659 AT_SETUP([ofproto-dpif megaflow - normal])
2660 OVS_VSWITCHD_START
2661 ADD_OF_PORTS([br0], [1], [2])
2662 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
2663 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)'])
2664 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)'])
2665 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2666 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>
2667 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>
2668 ])
2669 OVS_VSWITCHD_STOP
2670 AT_CLEANUP
2671
2672 AT_SETUP([ofproto-dpif megaflow - mpls])
2673 OVS_VSWITCHD_START
2674 ADD_OF_PORTS([br0], [1], [2])
2675 AT_DATA([flows.txt], [dnl
2676 table=0 dl_src=50:54:00:00:00:09 actions=push_mpls:0x8847,2
2677 table=0 dl_src=50:54:00:00:00:0b actions=pop_mpls:0x0800,2
2678 ])
2679 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2680 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)'])
2681 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)'])
2682 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2683 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>
2684 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>
2685 ])
2686 OVS_VSWITCHD_STOP
2687 AT_CLEANUP
2688
2689 AT_SETUP([ofproto-dpif megaflow - netflow])
2690 OVS_VSWITCHD_START
2691 ADD_OF_PORTS([br0], [1], [2])
2692
2693 dnl NetFlow configuration disables wildcarding relevant fields
2694 ON_EXIT([kill `cat test-netflow.pid`])
2695 AT_CHECK([test-netflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > netflow.log], [0], [], [ignore])
2696 AT_CAPTURE_FILE([netflow.log])
2697 NETFLOW_PORT=`parse_listening_port < test-netflow.log`
2698 ovs-vsctl \
2699    set Bridge br0 netflow=@nf -- \
2700    --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
2701      engine_id=1 engine_type=2 active_timeout=30 add-id-to-interface=false
2702
2703 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
2704 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)'])
2705 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)'])
2706 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2707 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>
2708 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>
2709 ])
2710 OVS_VSWITCHD_STOP
2711 AT_CLEANUP
2712
2713 AT_SETUP([ofproto-dpif megaflow - normal, active-backup bonding])
2714 OVS_VSWITCHD_START(
2715   [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1 -- \
2716    add-bond br0 bond0 p2 p3 bond_mode=active-backup -- \
2717    set interface p2 type=dummy ofport_request=2 -- \
2718    set interface p3 type=dummy ofport_request=3])
2719 AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK
2720 ])
2721
2722 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
2723 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)'])
2724 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)'])
2725 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2726 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>
2727 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>
2728 ])
2729 OVS_VSWITCHD_STOP
2730 AT_CLEANUP
2731
2732 AT_SETUP([ofproto-dpif megaflow - normal, balance-slb bonding])
2733 OVS_VSWITCHD_START(
2734   [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1 -- \
2735    add-bond br0 bond0 p2 p3 bond_mode=balance-slb -- \
2736    set interface p2 type=dummy ofport_request=2 -- \
2737    set interface p3 type=dummy ofport_request=3])
2738 AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK
2739 ])
2740
2741 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
2742 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2743 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2744 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/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>
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/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>
2747 ])
2748 OVS_VSWITCHD_STOP
2749 AT_CLEANUP
2750
2751 AT_SETUP([ofproto-dpif megaflow - normal, balance-tcp bonding])
2752 # Create bond0 on br0 with interfaces p0 and p1
2753 #    and bond1 on br1 with interfaces p2 and p3
2754 # with p0 patched to p2 and p1 patched to p3.
2755 OVS_VSWITCHD_START(
2756   [add-bond br0 bond0 p0 p1 bond_mode=balance-tcp lacp=active \
2757                             other-config:lacp-time=fast \
2758                             other-config:bond-rebalance-interval=0 -- \
2759    set interface p0 type=patch options:peer=p2 ofport_request=1 -- \
2760    set interface p1 type=patch options:peer=p3 ofport_request=2 -- \
2761    add-br br1 -- \
2762    set bridge br1 other-config:hwaddr=aa:66:aa:66:00:00 -- \
2763    set bridge br1 datapath-type=dummy other-config:datapath-id=1234 \
2764                   fail-mode=secure -- \
2765    add-bond br1 bond1 p2 p3 bond_mode=balance-tcp lacp=active \
2766                             other-config:lacp-time=fast \
2767                             other-config:bond-rebalance-interval=0 -- \
2768    set interface p2 type=patch options:peer=p0 ofport_request=3 -- \
2769    set interface p3 type=patch options:peer=p1 ofport_request=4 --])
2770
2771 AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK
2772 ])
2773 ADD_OF_PORTS([br0], [7])
2774 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
2775 AT_CHECK([ovs-ofctl add-flow br1 action=normal])
2776 ovs-appctl time/stop
2777 ovs-appctl time/warp 5000
2778 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)'])
2779 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)'])
2780
2781 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2782 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>
2783 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>
2784 ])
2785 OVS_VSWITCHD_STOP
2786 AT_CLEANUP
2787
2788 AT_SETUP([ofproto-dpif megaflow - resubmit port action])
2789 OVS_VSWITCHD_START
2790 ADD_OF_PORTS([br0], [1], [2])
2791 AT_DATA([flows.txt], [dnl
2792 table=0 in_port=1,ip actions=resubmit(90)
2793 table=0 in_port=90,dl_src=50:54:00:00:00:09 actions=output(2)
2794 ])
2795 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2796 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)'])
2797 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)'])
2798 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2799 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>
2800 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>
2801 ])
2802 OVS_VSWITCHD_STOP
2803 AT_CLEANUP
2804
2805 AT_SETUP([ofproto-dpif megaflow - resubmit table action])
2806 OVS_VSWITCHD_START
2807 ADD_OF_PORTS([br0], [1], [2])
2808 AT_DATA([flows.txt], [dnl
2809 table=0 in_port=1,ip actions=resubmit(,1)
2810 table=1 dl_src=50:54:00:00:00:09 actions=output(2)
2811 ])
2812 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2813 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)'])
2814 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=
2815 1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2816 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2817 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>
2818 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>
2819 ])
2820 OVS_VSWITCHD_STOP
2821 AT_CLEANUP
2822
2823 AT_SETUP([ofproto-dpif megaflow - goto_table action])
2824 OVS_VSWITCHD_START
2825 ADD_OF_PORTS([br0], [1], [2])
2826 AT_DATA([flows.txt], [dnl
2827 table=0 in_port=1,ip actions=goto_table(1)
2828 table=1 dl_src=50:54:00:00:00:09 actions=output(2)
2829 ])
2830 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flows br0 flows.txt])
2831 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)'])
2832 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)'])
2833 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2834 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>
2835 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>
2836 ])
2837 OVS_VSWITCHD_STOP
2838 AT_CLEANUP
2839
2840 AT_SETUP([ofproto-dpif megaflow - mirroring, select_all])
2841 OVS_VSWITCHD_START
2842 ADD_OF_PORTS([br0], [1], [2], [3])
2843 ovs-vsctl \
2844         set Bridge br0 mirrors=@m --\
2845         --id=@p3 get Port p3 --\
2846         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
2847
2848 AT_DATA([flows.txt], [dnl
2849 in_port=1 actions=output:2
2850 ])
2851 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2852 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)'])
2853 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)'])
2854 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2855 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>
2856 ])
2857 OVS_VSWITCHD_STOP
2858 AT_CLEANUP
2859
2860 AT_SETUP([ofproto-dpif megaflow - mirroring, select_vlan])
2861 OVS_VSWITCHD_START
2862 ADD_OF_PORTS([br0], [1], [2], [3])
2863 ovs-vsctl \
2864         set Bridge br0 mirrors=@m --\
2865         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
2866         --id=@m create Mirror name=mymirror select_all=true select_vlan=11 output_port=@p3
2867
2868 AT_DATA([flows.txt], [dnl
2869 in_port=1 actions=output:2
2870 ])
2871 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2872 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))'])
2873 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)'])
2874 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2875 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>
2876 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>
2877 ])
2878 OVS_VSWITCHD_STOP
2879 AT_CLEANUP
2880
2881 AT_SETUP([ofproto-dpif megaflow - move action])
2882 OVS_VSWITCHD_START
2883 ADD_OF_PORTS([br0], [1], [2])
2884 AT_DATA([flows.txt], [dnl
2885 table=0 in_port=1 ip,actions=move:NXM_OF_IP_SRC[[]]->NXM_NX_REG0[[]],resubmit(90)
2886 table=0 in_port=90 ip,actions=move:NXM_NX_REG0[[]]->NXM_NX_REG1[[]],resubmit(91)
2887 table=0 in_port=91 reg0=0x0a000002,actions=output(2)
2888 ])
2889 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2890 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)'])
2891 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)'])
2892 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2893 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>
2894 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>
2895 ])
2896 OVS_VSWITCHD_STOP
2897 AT_CLEANUP
2898
2899 AT_SETUP([ofproto-dpif megaflow - push action])
2900 OVS_VSWITCHD_START
2901 ADD_OF_PORTS([br0], [1], [2])
2902 AT_DATA([flows.txt], [dnl
2903 table=0 in_port=1 ip,actions=push:NXM_OF_IP_SRC[[]],output(2)
2904 ])
2905 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2906 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)'])
2907 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)'])
2908 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2909 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>
2910 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>
2911 ])
2912 OVS_VSWITCHD_STOP
2913 AT_CLEANUP
2914
2915 AT_SETUP([ofproto-dpif megaflow - learning])
2916 OVS_VSWITCHD_START
2917 ADD_OF_PORTS([br0], [1], [2])
2918 AT_DATA([flows.txt], [dnl
2919 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
2920 ])
2921 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2922 ovs-appctl time/stop
2923 # We send each packet twice because the first packet in each flow causes the
2924 # flow table to change and thus revalidations, which (depending on timing)
2925 # can keep a megaflow from being installed.  The revalidations are done by
2926 # the second iteration, allowing the flows to be installed.
2927 for i in 1 2; do
2928     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)'])
2929     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)'])
2930     ovs-appctl time/warp 100
2931 done
2932 dnl The original flow is missing due to a revalidation.
2933 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2934 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>
2935 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>
2936 ])
2937 OVS_VSWITCHD_STOP
2938 AT_CLEANUP
2939
2940 AT_SETUP([ofproto-dpif megaflow - tunnels])
2941 OVS_VSWITCHD_START(
2942   [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1])
2943 AT_CHECK([ovs-vsctl add-port br0 p2 -- set Interface p2 type=gre \
2944      options:remote_ip=1.1.1.1 ofport_request=2 options:key=flow])
2945 AT_CHECK([ovs-vsctl add-port br0 p3 -- set Interface p3 type=dummy \
2946           ofport_request=3])
2947 AT_CHECK([ovs-vsctl add-port br0 p4 -- set Interface p4 type=gre \
2948      options:remote_ip=1.1.1.2 options:tos=inherit options:ttl=inherit \
2949      ofport_request=4 options:key=flow])
2950 AT_DATA([flows.txt], [dnl
2951 in_port=1,actions=output(2)
2952 in_port=3,actions=output(4)
2953 ])
2954 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2955 dnl ECN bits are always copied out, but don't use 0x3 (CE), since that
2956 dnl will cause the packet to be dropped.
2957 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)'])
2958 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)'])
2959 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)'])
2960 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)'])
2961 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2962 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>
2963 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>
2964 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>
2965 ])
2966 OVS_VSWITCHD_STOP
2967 AT_CLEANUP
2968
2969 AT_SETUP([ofproto-dpif megaflow - dec_ttl])
2970 OVS_VSWITCHD_START
2971 ADD_OF_PORTS([br0], [1], [2])
2972 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], [])
2973 AT_DATA([flows.txt], [dnl
2974 table=0 in_port=1,icmp,nw_src=10.0.0.4 actions=dec_ttl,output(2)
2975 ])
2976 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2977 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)'])
2978 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)'])
2979 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2980 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>
2981 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>
2982 ])
2983 OVS_VSWITCHD_STOP
2984 AT_CLEANUP
2985
2986 AT_SETUP([ofproto-dpif megaflow - set dl_dst])
2987 OVS_VSWITCHD_START
2988 ADD_OF_PORTS([br0], [1], [2])
2989 AT_DATA([flows.txt], [dnl
2990 table=0 in_port=1 actions=mod_dl_dst(50:54:00:00:00:0a),output(2)
2991 ])
2992 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2993 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)'])
2994 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)'])
2995 dnl The megaflows do not match the same fields, since the first packet
2996 dnl is essentially a no-op.  (The new destination MAC is the same as the
2997 dnl original.) The ofproto-dpif library un-wildcards the destination MAC
2998 dnl so that a packet that doesn't need its MAC address changed doesn't
2999 dnl hide one that does.  Since the first entry doesn't need to change,
3000 dnl only the destination MAC address is matched (as decided by
3001 dnl ofproto-dpif).  The second entry actually updates the destination
3002 dnl MAC, so both the source and destination MAC addresses are
3003 dnl un-wildcarded, since the ODP commit functions update both the source
3004 dnl and destination MAC addresses.
3005 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_USED], [0], [dnl
3006 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
3007 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
3008 ])
3009 OVS_VSWITCHD_STOP
3010 AT_CLEANUP
3011
3012 AT_SETUP([ofproto-dpif megaflow - disabled])
3013 OVS_VSWITCHD_START
3014 ADD_OF_PORTS([br0], [1], [2])
3015 AT_DATA([flows.txt], [dnl
3016 table=0 in_port=1,ip,nw_dst=10.0.0.1 actions=output(2)
3017 table=0 in_port=1,ip,nw_dst=10.0.0.3 actions=drop
3018 ])
3019 AT_CHECK([ovs-appctl upcall/disable-megaflows], [0], [megaflows disabled
3020 ], [])
3021 AT_CHECK([ovs-appctl vlog/set dpif_netdev:dbg], [0], [], [])
3022 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3023 for i in 1 2 3 4; do
3024     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)'])
3025     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)'])
3026 done
3027 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_USED], [0], [dnl
3028 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
3029 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
3030 ])
3031 OVS_VSWITCHD_STOP
3032 AT_CLEANUP
3033
3034 AT_SETUP([ofproto-dpif - datapath port number change])
3035 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
3036 ADD_OF_PORTS([br0], 1)
3037
3038 # Trace a flow that should output to p1.
3039 AT_CHECK([ovs-appctl ofproto/trace br0 in_port=LOCAL,dl_src=10:20:30:40:50:60],
3040   [0], [stdout])
3041 AT_CHECK([tail -1 stdout], [0], [Datapath actions: 1
3042 ])
3043
3044 # Change p1's port number to 5.
3045 AT_CHECK([ovs-appctl dpif-dummy/change-port-number ovs-dummy p1 5])
3046
3047 # Trace a flow that should output to p1 in its new location.
3048 AT_CHECK([ovs-appctl ofproto/trace br0 in_port=LOCAL,dl_src=10:20:30:40:50:60],
3049   [0], [stdout])
3050 AT_CHECK([tail -1 stdout], [0], [Datapath actions: 5
3051 ])
3052 OVS_VSWITCHD_STOP
3053 AT_CLEANUP
3054
3055 # Tests the bundling with various bfd and cfm configurations.
3056 AT_SETUP([ofproto - bundle with variable bfd/cfm config])
3057 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy -- \
3058                     add-bond br0 br0bond p0 p2 bond-mode=active-backup -- \
3059                     add-bond br1 br1bond p1 p3 bond-mode=active-backup -- \
3060                     set Interface p1 type=patch options:peer=p0 ofport_request=2 -- \
3061                     set Interface p3 type=patch options:peer=p2 ofport_request=4 -- \
3062                     set Interface p0 type=patch options:peer=p1 ofport_request=1 -- \
3063                     set Interface p2 type=patch options:peer=p3 ofport_request=3 -- \
3064                     set Interface p0 bfd:enable=true bfd:min_tx=300 bfd:min_rx=300 -- \
3065                     set Interface p0 cfm_mpid=1 -- \
3066                     set Interface p1 bfd:enable=true bfd:min_tx=500 bfd:min_rx=500])
3067
3068 ovs-appctl time/stop
3069 # advance the clock to stablize everything.
3070 for i in `seq 0 49`; do ovs-appctl time/warp 100; done
3071 # cfm/show should show 'recv' fault.
3072 AT_CHECK([ovs-appctl cfm/show | sed -n '/^.*fault:.*/p'], [0], [dnl
3073         fault: recv
3074 ])
3075 # bfd/show should show 'up'.
3076 AT_CHECK([ovs-appctl bfd/show | sed -n '/^.*Session State:.*/p'], [0], [dnl
3077         Local Session State: up
3078         Remote Session State: up
3079         Local Session State: up
3080         Remote Session State: up
3081 ])
3082 # bond/show should show 'may-enable: true' for all slaves.
3083 AT_CHECK([ovs-appctl bond/show | sed -n '/^.*may_enable:.*/p'], [0], [dnl
3084         may_enable: true
3085         may_enable: true
3086         may_enable: true
3087         may_enable: true
3088 ])
3089
3090 # now disable the bfd on p1.
3091 AT_CHECK([ovs-vsctl set Interface p1 bfd:enable=false])
3092 # advance the clock to stablize everything.
3093 for i in `seq 0 49`; do ovs-appctl time/warp 100; done
3094 # cfm/show should show 'recv' fault.
3095 AT_CHECK([ovs-appctl cfm/show | sed -n '/^.*fault:.*/p'], [0], [dnl
3096         fault: recv
3097 ])
3098 # bfd/show should show 'down'.
3099 AT_CHECK([ovs-appctl bfd/show | sed -n '/^.*Session State:.*/p'], [0], [dnl
3100         Local Session State: down
3101         Remote Session State: down
3102 ])
3103 # bond/show should show 'may-enable: false' for p0.
3104 AT_CHECK([ovs-appctl bond/show br0bond | sed -n '/^.*may_enable:.*/p'], [0], [dnl
3105         may_enable: false
3106         may_enable: true
3107 ])
3108
3109 # now enable the bfd on p1 and disable bfd on p0.
3110 AT_CHECK([ovs-vsctl set Interface p1 bfd:enable=true])
3111 AT_CHECK([ovs-vsctl set Interface p0 bfd:enable=false])
3112 # advance the clock to stablize everything.
3113 for i in `seq 0 49`; do ovs-appctl time/warp 100; done
3114 # cfm/show should show 'recv' fault.
3115 AT_CHECK([ovs-appctl cfm/show | sed -n '/^.*fault:.*/p'], [0], [dnl
3116         fault: recv
3117 ])
3118 # bfd/show should show 'down'.
3119 AT_CHECK([ovs-appctl bfd/show | sed -n '/^.*Session State:.*/p'], [0], [dnl
3120         Local Session State: down
3121         Remote Session State: down
3122 ])
3123 # bond/show should show 'may-enable: false' for p0 and p1.
3124 AT_CHECK([ovs-appctl bond/show | sed -n '/^.*may_enable:.*/p'], [0], [dnl
3125         may_enable: false
3126         may_enable: true
3127         may_enable: false
3128         may_enable: true
3129 ])
3130
3131 OVS_VSWITCHD_STOP
3132 AT_CLEANUP
3133
3134 AT_SETUP([ofproto-dpif - ofproto-dpif-monitor 1])
3135 OVS_VSWITCHD_START([add-port br0 p0 -- set interface p0 type=gre options:remote_ip=1.2.3.4])
3136
3137 # enable bfd on p0.
3138 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=true])
3139 # check log.
3140 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* created\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3141 monitor thread created
3142 ])
3143 # disable bfd on p0.
3144 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=false])
3145 # check log.
3146 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* terminated\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3147 monitor thread terminated
3148 ])
3149 AT_CHECK([cat ovs-vswitchd.log | sed -e '/^.*ofproto_dpif_monitor.*$/d' > ovs-vswitchd.log])
3150
3151 # enable cfm on p0.
3152 AT_CHECK([ovs-vsctl set interface p0 cfm_mpid=10])
3153 # check log.
3154 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* created\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3155 monitor thread created
3156 ])
3157 # disable cfm on p0.
3158 AT_CHECK([ovs-vsctl remove interface p0 cfm_mpid 10])
3159 # check log.
3160 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* terminated\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3161 monitor thread terminated
3162 ])
3163 AT_CHECK([cat ovs-vswitchd.log | sed -e '/^.*ofproto_dpif_monitor.*$/d' > ovs-vswitchd.log])
3164
3165 # enable both bfd and cfm on p0.
3166 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=true cfm_mpid=10])
3167 # check log.
3168 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* created\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3169 monitor thread created
3170 ])
3171 # disable bfd on p0.
3172 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=false])
3173 # check log, there should not be the log of thread terminated.
3174 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* terminated\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3175 ])
3176 # reenable bfd on p0.
3177 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=true])
3178 # check log, should still be on log of thread created.
3179 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* created\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3180 monitor thread created
3181 ])
3182 # disable bfd and cfm together.
3183 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=false -- remove interface p0 cfm_mpid 10])
3184 # check log.
3185 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* terminated\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3186 monitor thread terminated
3187 ])
3188
3189 OVS_VSWITCHD_STOP
3190 AT_CLEANUP
3191
3192 # this test helps avoid the deadlock between the main thread and monitor thread.
3193 AT_SETUP([ofproto-dpif - ofproto-dpif-monitor 2])
3194 OVS_VSWITCHD_START
3195
3196 for i in `seq 1 199`
3197 do
3198     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])
3199 done
3200
3201 OVS_VSWITCHD_STOP
3202 AT_CLEANUP
3203 \f
3204 AT_BANNER([ofproto-dpif - flow translation resource limits])
3205
3206 AT_SETUP([ofproto-dpif - infinite resubmit])
3207 OVS_VSWITCHD_START
3208 AT_CHECK([ovs-ofctl add-flow br0 actions=resubmit:1,resubmit:2,output:3])
3209 AT_CHECK([ovs-appctl ofproto/trace br0 'eth_dst=ff:ff:ff:ff:ff:ff'],
3210   [0], [stdout])
3211 AT_CHECK([tail -1 stdout], [0], [Datapath actions: drop
3212 ])
3213 AT_CHECK([grep -c 'resubmit actions recursed over 64 times' ovs-vswitchd.log],
3214   [0], [1
3215 ])
3216 OVS_VSWITCHD_STOP(["/resubmit actions recursed/d"])
3217 AT_CLEANUP
3218
3219 AT_SETUP([ofproto-dpif - exponential resubmit chain])
3220 OVS_VSWITCHD_START
3221 ADD_OF_PORTS([br0], 1)
3222 (for i in `seq 1 64`; do
3223      j=`expr $i + 1`
3224      echo "in_port=$i, actions=resubmit:$j, resubmit:$j, local"
3225  done
3226  echo "in_port=65, actions=local") > flows
3227  AT_CHECK([ovs-ofctl add-flows br0 flows])
3228 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1'], [0], [stdout])
3229 AT_CHECK([grep -c 'over 4096 resubmit actions' ovs-vswitchd.log], [0], [1
3230 ])
3231 OVS_VSWITCHD_STOP(["/over.*resubmit actions/d"])
3232 AT_CLEANUP
3233
3234 AT_SETUP([ofproto-dpif - too many output actions])
3235 OVS_VSWITCHD_START
3236 ADD_OF_PORTS([br0], 1)
3237 (for i in `seq 1 12`; do
3238      j=`expr $i + 1`
3239      echo "in_port=$i, actions=resubmit:$j, resubmit:$j, local"
3240  done
3241  echo "in_port=13, actions=local,local,local,local,local,local,local,local") > flows
3242 AT_CHECK([ovs-ofctl add-flows br0 flows])
3243 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1'], [0], [stdout])
3244 AT_CHECK([grep -c -e '- Uses action(s) not supported by datapath' stdout],
3245   [0], [1
3246 ])
3247 AT_CHECK([grep -c 'resubmits yielded over 64 kB of actions' ovs-vswitchd.log], [0], [1
3248 ])
3249 OVS_VSWITCHD_STOP(["/resubmits yielded over 64 kB of actions/d"])
3250 AT_CLEANUP
3251
3252 AT_SETUP([ofproto-dpif - stack too deep])
3253 OVS_VSWITCHD_START
3254 ADD_OF_PORTS([br0], 1)
3255 (for i in `seq 1 12`; do
3256      j=`expr $i + 1`
3257      echo "in_port=$i, actions=resubmit:$j, resubmit:$j, local"
3258  done
3259  push="push:NXM_NX_REG0[[]]"
3260  echo "in_port=13, actions=$push,$push,$push,$push,$push,$push,$push,$push") > flows
3261  AT_CHECK([ovs-ofctl add-flows br0 flows])
3262 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1'], [0], [stdout])
3263 AT_CHECK([grep -c 'resubmits yielded over 64 kB of stack' ovs-vswitchd.log], [0], [1
3264 ])
3265 OVS_VSWITCHD_STOP(["/resubmits yielded over 64 kB of stack/d"])
3266 AT_CLEANUP