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