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