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