ofproto-dpif.at: Fix races in "NetFlow flow expiration" 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       sleep 1  # ensure the order in which these two packets are processed
3350       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)'
3351
3352       ovs-appctl time/warp $delay
3353   done
3354
3355   ovs-appctl time/warp 6000
3356   sleep 1
3357   OVS_VSWITCHD_STOP
3358   ovs-appctl -t test-netflow exit
3359
3360   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])
3361
3362   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])
3363
3364   combined=`grep "192.168.0.2 > 192.168.0.1, if 2 > 1, 2 pkts, 120 bytes, ICMP 0:0" netflow.log | wc -l`
3365   separate=`grep "192.168.0.2 > 192.168.0.1, if 2 > 1, 1 pkts, 60 bytes, ICMP 0:0" netflow.log | wc -l`
3366   AT_CHECK([test $separate = 2 || test $combined = 1], [0])
3367
3368   AT_CLEANUP])
3369
3370 CHECK_NETFLOW_EXPIRATION([127.0.0.1], [IPv4])
3371 CHECK_NETFLOW_EXPIRATION([[[::1]]], [IPv6])
3372
3373 # CHECK_NETFLOW_ACTIVE_EXPIRATION(LOOPBACK_ADDR, IP_VERSION_TYPE)
3374 #
3375 # Test that basic NetFlow reports active expirations correctly.
3376 #
3377 # IP_VERSION_TYPE is used in AT_SETUP
3378 m4_define([CHECK_NETFLOW_ACTIVE_EXPIRATION],
3379   [AT_SETUP([ofproto-dpif - NetFlow active expiration - $2 collector])
3380
3381   OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
3382   ADD_OF_PORTS([br0], 1, 2)
3383
3384   ON_EXIT([kill `cat test-netflow.pid`])
3385   AT_CHECK([ovstest test-netflow --log-file --detach --no-chdir --pidfile 0:$1 > netflow.log], [0], [], [ignore])
3386   AT_CAPTURE_FILE([netflow.log])
3387   NETFLOW_PORT=`parse_listening_port < test-netflow.log`
3388
3389   ovs-vsctl \
3390      set Bridge br0 netflow=@nf -- \
3391      --id=@nf create NetFlow targets=\"$1:$NETFLOW_PORT\" \
3392        engine_id=1 engine_type=2 active_timeout=10 add-id-to-interface=false
3393
3394   AT_CHECK([ovs-appctl time/stop])
3395   n=1
3396   while test $n -le 60; do
3397       n=`expr $n + 1`
3398
3399       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)'
3400       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)'
3401
3402       ovs-appctl time/warp 1000
3403   done
3404
3405   ovs-appctl time/warp 10000
3406
3407   sleep 1
3408   OVS_VSWITCHD_STOP
3409   ovs-appctl -t test-netflow exit
3410
3411   # Count the number of reported packets:
3412   # - From source to destination before MAC learning kicks in (just one).
3413   # - From source to destination after that.
3414   # - From destination to source.
3415   n_learn=0
3416   n_in=0
3417   n_out=0
3418   n_other=0
3419   n_recs=0
3420   none=0
3421   while read line; do
3422       pkts=`echo "$line" | sed 's/.*, \([[0-9]]*\) pkts,.*/\1/'`
3423       case $pkts in
3424            [[0-9]]*) ;;
3425        *) continue ;;
3426       esac
3427
3428       case $line in
3429           "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 65535, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
3430               counter=n_learn
3431           ;;
3432       "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 2, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
3433           counter=n_in
3434           ;;
3435       "seq "*": 192.168.0.2 > 192.168.0.1, if 2 > 1, "*" pkts, "*" bytes, TCP 80 > 1234, time "*)
3436           counter=n_out
3437           ;;
3438       *)
3439           counter=n_other
3440           ;;
3441       esac
3442       eval $counter=\`expr \$$counter + \$pkts\`
3443       n_recs=`expr $n_recs + 1`
3444   done < netflow.log
3445
3446   # There should be exactly 1 MAC learning packet,
3447   # exactly 59 other packets in that direction,
3448   # and exactly 60 packets in the other direction.
3449   AT_CHECK([echo $n_learn $n_in $n_out $n_other], [0], [1 59 60 0
3450 ])
3451
3452   AT_CLEANUP])
3453
3454 CHECK_NETFLOW_ACTIVE_EXPIRATION([127.0.0.1], [IPv4])
3455 CHECK_NETFLOW_ACTIVE_EXPIRATION([[[::1]]], [IPv6])
3456
3457 AT_SETUP([ofproto-dpif - flow stats])
3458 OVS_VSWITCHD_START
3459 AT_CHECK([ovs-ofctl add-flow br0 "ip,actions=NORMAL"])
3460 AT_CHECK([ovs-ofctl add-flow br0 "icmp,actions=NORMAL"])
3461
3462 ovs-appctl time/stop
3463
3464 for i in `seq 1 10`; do
3465     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)'
3466 done
3467
3468 ovs-appctl time/warp 1000
3469 sleep 1  # wait for revalidator to update stats
3470
3471 AT_CHECK([ovs-ofctl dump-flows br0], [0], [stdout])
3472 AT_CHECK([STRIP_XIDS stdout | sed -n 's/duration=[[0-9]]*\.[[0-9]]*s/duration=0.0s/p' | sort], [0], [dnl
3473  cookie=0x0, duration=0.0s, table=0, n_packets=0, n_bytes=0, idle_age=1, icmp actions=NORMAL
3474  cookie=0x0, duration=0.0s, table=0, n_packets=10, n_bytes=600, idle_age=1, ip actions=NORMAL
3475 ])
3476 OVS_VSWITCHD_STOP
3477 AT_CLEANUP
3478
3479 AT_SETUP([ofproto-dpif - flow stats, set-n-threads])
3480 OVS_VSWITCHD_START
3481 AT_CHECK([ovs-ofctl add-flow br0 "ip,actions=NORMAL"])
3482 AT_CHECK([ovs-ofctl add-flow br0 "icmp,actions=NORMAL"])
3483
3484 ovs-appctl time/stop
3485
3486 for i in `seq 1 10`; do
3487     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)'
3488 done
3489
3490 ovs-appctl time/warp 100
3491 AT_CHECK([ovs-vsctl set Open_vSwitch . other-config:n-revalidator-threads=2])
3492 ovs-appctl time/warp 1000
3493
3494 AT_CHECK([ovs-ofctl dump-flows br0], [0], [stdout])
3495 AT_CHECK([STRIP_XIDS stdout | sed -n 's/duration=[[0-9]]*\.[[0-9]]*s/duration=0.0s/p' | sort], [0], [dnl
3496  cookie=0x0, duration=0.0s, table=0, n_packets=0, n_bytes=0, idle_age=1, icmp actions=NORMAL
3497  cookie=0x0, duration=0.0s, table=0, n_packets=10, n_bytes=600, idle_age=1, ip actions=NORMAL
3498 ])
3499 OVS_VSWITCHD_STOP
3500 AT_CLEANUP
3501
3502 AT_SETUP([idle_age and hard_age increase over time])
3503 OVS_VSWITCHD_START
3504
3505 # get_ages DURATION HARD IDLE
3506 #
3507 # Fetch the flow duration, hard age, and idle age into the variables
3508 # whose names are given as arguments.  Rounds DURATION down to the
3509 # nearest integer.  If hard_age doesn't appear in the output, sets
3510 # HARD to "none".  If idle_age doesn't appear in the output, sets IDLE
3511 # to 0.
3512 get_ages () {
3513     AT_CHECK([ovs-ofctl dump-flows br0], [0], [stdout])
3514
3515     duration=`sed -n 's/.*duration=\([[0-9]]*\)\(\.[[0-9]]*\)\{0,1\}s.*/\1/p' stdout`
3516     AT_CHECK([[expr X"$duration" : 'X[0-9][0-9]*$']], [0], [ignore])
3517     AS_VAR_COPY([$1], [duration])
3518
3519     hard=`sed -n 's/.*hard_age=\([[0-9]]*\),.*/\1/p' stdout`
3520     if test X"$hard" = X; then
3521         hard=none
3522     else
3523         AT_CHECK([[expr X"$hard" : 'X[0-9][0-9]*$']], [0], [ignore])
3524     fi
3525     AS_VAR_COPY([$2], [hard])
3526
3527     idle=`sed -n 's/.*idle_age=\([[0-9]]*\),.*/\1/p' stdout`
3528     if test X"$idle" = X; then
3529         idle=0
3530     else
3531         AT_CHECK([[expr X"$idle" : 'X[0-9][0-9]*$']], [0], [ignore])
3532     fi
3533     AS_VAR_COPY([$3], [idle])
3534 }
3535
3536 # Add a flow and get its initial hard and idle age.
3537 AT_CHECK([ovs-ofctl add-flow br0 hard_timeout=199,idle_timeout=188,actions=drop])
3538 get_ages duration1 hard1 idle1
3539
3540 ovs-appctl time/stop
3541 # Warp time forward by 10 seconds, then modify the flow's actions.
3542 ovs-appctl time/warp 10000
3543 get_ages duration2 hard2 idle2
3544 AT_CHECK([ovs-ofctl mod-flows br0 actions=flood])
3545
3546 # Warp time forward by 10 seconds.
3547 ovs-appctl time/warp 10000
3548 get_ages duration3 hard3 idle3
3549
3550 # Warp time forward 10 more seconds, then pass some packets through the flow,
3551 # then warp forward a few more times because idle times are only updated
3552 # occasionally.
3553 ovs-appctl time/warp 10000
3554 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)'
3555 ovs-appctl time/warp 1000
3556 ovs-appctl time/warp 1000
3557 ovs-appctl time/warp 1000
3558 get_ages duration4 hard4 idle4
3559
3560 printf "duration: %4s => %4s => %4s => %4s\n" $duration1 $duration2 $duration3 $duration4
3561 printf "hard_age: %4s => %4s => %4s => %4s\n" $hard1 $hard2 $hard3 $hard4
3562 printf "idle_age: %4s => %4s => %4s => %4s\n" $idle1 $idle2 $idle3 $idle4
3563
3564 # Duration should increase steadily over time.
3565 AT_CHECK([test $duration1 -lt $duration2])
3566 AT_CHECK([test $duration2 -lt $duration3])
3567 AT_CHECK([test $duration3 -lt $duration4])
3568
3569 # Hard age should be "none" initially because it's the same as flow_duration,
3570 # then it should increase.
3571 AT_CHECK([test $hard1 = none])
3572 AT_CHECK([test $hard2 = none])
3573 AT_CHECK([test $hard3 != none])
3574 AT_CHECK([test $hard4 != none])
3575 AT_CHECK([test $hard3 -lt $hard4])
3576
3577 # Idle age should increase from 1 to 2 to 3, then decrease.
3578 AT_CHECK([test $idle1 -lt $idle2])
3579 AT_CHECK([test $idle2 -lt $idle3])
3580 AT_CHECK([test $idle3 -gt $idle4])
3581
3582 # Check some invariant relationships.
3583 AT_CHECK([test $duration1 = $idle1])
3584 AT_CHECK([test $duration2 = $idle2])
3585 AT_CHECK([test $duration3 = $idle3])
3586 AT_CHECK([test $idle3 -gt $hard3])
3587 AT_CHECK([test $idle4 -lt $hard4])
3588 AT_CHECK([test $hard4 -lt $duration4])
3589
3590 OVS_VSWITCHD_STOP
3591 AT_CLEANUP
3592
3593 AT_SETUP([ofproto-dpif - fin_timeout])
3594 OVS_VSWITCHD_START
3595 AT_DATA([flows.txt], [dnl
3596 in_port=1 actions=output:2
3597 in_port=2 actions=mod_vlan_vid:17,output:1
3598 ])
3599 ovs-appctl time/stop
3600 AT_CHECK([ovs-ofctl add-flow br0 'idle_timeout=60,actions=fin_timeout(idle_timeout=5)'])
3601 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
3602 [NXST_FLOW reply:
3603  idle_timeout=60, actions=fin_timeout(idle_timeout=5)
3604 ])
3605
3606 # Check that a TCP SYN packet does not change the timeout.  (Because
3607 # flow stats updates are mainly what implements the fin_timeout
3608 # feature, we warp forward a couple of times to ensure that flow stats
3609 # run before re-checking the flow table.)
3610 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f908004500003c2e2440004006465dac11370dac11370b828b0016751e267b00000000a00216d017360000020405b40402080a2d25085f0000000001030307])
3611 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
3612 warped
3613 ])
3614 sleep 1
3615 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
3616 [NXST_FLOW reply:
3617  n_packets=1, n_bytes=74, idle_timeout=60, actions=fin_timeout(idle_timeout=5)
3618 ])
3619 # Check that a TCP FIN packet does change the timeout.
3620 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f90800451000342e3e40004006463bac11370dac11370b828b0016751e319dfc96399b801100717ae800000101080a2d250a9408579588])
3621 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
3622 warped
3623 ])
3624 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
3625 [NXST_FLOW reply:
3626  n_packets=2, n_bytes=140, idle_timeout=5, actions=fin_timeout(idle_timeout=5)
3627 ])
3628 OVS_VSWITCHD_STOP
3629 AT_CLEANUP
3630
3631 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-dps])
3632 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
3633 ADD_OF_PORTS([br0], [1], [2])
3634 ADD_OF_PORTS([br1], [3])
3635
3636 AT_CHECK([ovs-appctl dpif/dump-dps], [0], [dnl
3637 dummy@br0
3638 dummy@br1
3639 ])
3640 OVS_VSWITCHD_STOP
3641 AT_CLEANUP
3642
3643 AT_SETUP([ofproto-dpif - ovs-appctl dpif/show])
3644 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
3645 ADD_OF_PORTS([br0], [1], [2])
3646 ADD_OF_PORTS([br1], [3])
3647
3648 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
3649 dummy@ovs-dummy: hit:0 missed:0
3650         br0:
3651                 br0 65534/100: (dummy)
3652                 p1 1/1: (dummy)
3653                 p2 2/2: (dummy)
3654         br1:
3655                 br1 65534/101: (dummy)
3656                 p3 3/3: (dummy)
3657 ])
3658 OVS_VSWITCHD_STOP
3659 AT_CLEANUP
3660
3661 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-flows])
3662 OVS_VSWITCHD_START([add-br br1 -- \
3663                     set bridge br1 datapath-type=dummy fail-mode=secure])
3664 ADD_OF_PORTS([br0], [1], [2])
3665 ADD_OF_PORTS([br1], [3])
3666
3667 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)'])
3668 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)'])
3669 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)'])
3670
3671 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
3672 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
3673 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
3674 ])
3675
3676 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
3677 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
3678 ])
3679
3680 AT_CHECK([ovs-appctl dpif/dump-flows -m br0 | sort | STRIP_USED], [0], [dnl
3681 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
3682 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
3683 ])
3684
3685 AT_CHECK([ovs-appctl dpif/dump-flows -m br1 | sort | STRIP_USED], [0], [dnl
3686 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
3687 ])
3688
3689 OVS_VSWITCHD_STOP
3690 AT_CLEANUP
3691
3692 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-flows - MPLS actions that result in a userspace action])
3693 OVS_VSWITCHD_START([dnl
3694    add-port br0 p1 -- set Interface p1 type=dummy
3695 ])
3696 ON_EXIT([kill `cat ovs-ofctl.pid`])
3697
3698 AT_CAPTURE_FILE([ofctl_monitor.log])
3699 AT_DATA([flows.txt], [dnl
3700 dl_src=60:66:66:66:66:00 actions=push_mpls:0x8847,controller
3701 dl_src=60:66:66:66:66:01 actions=pop_mpls:0x8849,controller
3702 ])
3703 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3704
3705 dnl Packet is sent to userspace because a MPLS push or pop action is applied to
3706 dnl a packet with 2 MPLS LSEs but dpif-netdev can't handle any labels.
3707 dnl
3708 dnl The input is a frame with two MPLS labels which tcpdump -vve shows as:
3709 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)
3710 dnl         (label 20, exp 0, [S], ttl 32)
3711 dnl         (tos 0x0, ttl 64, id 0, offset 0, flags [none], proto TCP (6), length 44, bad cksum 3b78 (->f978)!)
3712 dnl     192.168.0.1.80 > 192.168.0.2.0: Flags [none], cksum 0x7744 (correct), seq 42:46, win 10000, length 4
3713
3714 for dl_src in 00 01; do
3715     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"])
3716 done
3717 sleep 1  # wait for the datapath flow installed
3718 for dl_src in 00 01; do
3719     AT_CHECK_UNQUOTED([ovs-appctl dpif/dump-flows br0 | grep ":$dl_src/" | STRIP_USED], [0], [dnl
3720 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))
3721 ])
3722 done
3723
3724 OVS_VSWITCHD_STOP
3725 AT_CLEANUP
3726
3727
3728 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-flows - MPLS actions that result in a drop])
3729 OVS_VSWITCHD_START([dnl
3730    add-port br0 p1 -- set Interface p1 type=dummy
3731 ])
3732 ON_EXIT([kill `cat ovs-ofctl.pid`])
3733
3734 AT_CAPTURE_FILE([ofctl_monitor.log])
3735 AT_DATA([flows.txt], [dnl
3736 dl_src=60:66:66:66:66:00 actions=push_mpls:0x8847,controller
3737 dl_src=60:66:66:66:66:01 actions=pop_mpls:0x8849,controller
3738 ])
3739 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3740
3741 dnl Packet is dropped because an MPLS PUSH action is applied to a packet with
3742 dnl 4 MPLS LSEs but ovs-vswtichd can only handle up to 3 MPLS LSEs and thus
3743 dnl can't determine the resulting MPLS label after MPLS push/pop actions.
3744 dnl
3745 dnl The input is a frame with two MPLS headers which tcpdump -vve shows as:
3746 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)
3747 dnl         (label 20, exp 0, ttl 32)
3748 dnl         (label 20, exp 0, ttl 32)
3749 dnl         (label 20, exp 0, [S], ttl 32)
3750 dnl         (tos 0x0, ttl 64, id 0, offset 0, flags [none], proto TCP (6), length 44, bad cksum 3b78 (->f978)!)
3751 dnl     192.168.0.1.80 > 192.168.0.2.0: Flags [none], cksum 0x7744 (correct), seq 42:46, win 10000, length 4
3752
3753 for dl_src in 00 01; do
3754     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"])
3755 done
3756 sleep 1  # wait for the datapath flow installed
3757 for dl_src in 00 01; do
3758     AT_CHECK_UNQUOTED([ovs-appctl dpif/dump-flows br0 | grep ":$dl_src/" | STRIP_USED], [0], [dnl
3759 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))
3760 ])
3761 done
3762
3763 OVS_VSWITCHD_STOP
3764 AT_CLEANUP
3765
3766 AT_SETUP([ofproto-dpif - patch ports])
3767 OVS_VSWITCHD_START([add-br br1 \
3768 -- set bridge br1 datapath-type=dummy fail-mode=secure \
3769 -- add-port br1 pbr1 -- set int pbr1 type=patch options:peer=pbr0 \
3770 -- add-port br0 pbr0 -- set int pbr0 type=patch options:peer=pbr1])
3771
3772 ADD_OF_PORTS([br0], [2])
3773 ADD_OF_PORTS([br1], [3])
3774
3775 AT_CHECK([ovs-appctl time/stop])
3776
3777 AT_CHECK([ovs-ofctl add-flow br0 actions=LOCAL,output:1,output:2])
3778 AT_CHECK([ovs-ofctl add-flow br1 actions=LOCAL,output:1,output:3])
3779
3780 for i in $(seq 1 10); do
3781     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)'
3782     if [[ $i -eq 1 ]]; then
3783         sleep 1
3784     fi
3785 done
3786
3787 for i in $(seq 1 5); do
3788     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)'
3789     if [[ $i -eq 1 ]]; then
3790         sleep 1
3791     fi
3792 done
3793
3794 AT_CHECK([ovs-appctl time/warp 500], [0],
3795 [warped
3796 ])
3797
3798 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
3799 dummy@ovs-dummy: hit:13 missed:2
3800         br0:
3801                 br0 65534/100: (dummy)
3802                 p2 2/2: (dummy)
3803                 pbr0 1/none: (patch: peer=pbr1)
3804         br1:
3805                 br1 65534/101: (dummy)
3806                 p3 3/3: (dummy)
3807                 pbr1 1/none: (patch: peer=pbr0)
3808 ])
3809
3810 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_USED], [0], [dnl
3811 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
3812 ]),
3813 AT_CHECK([ovs-appctl dpif/dump-flows br1 | STRIP_USED], [0], [dnl
3814 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
3815 ])
3816
3817 AT_CHECK([ovs-ofctl dump-ports br0 pbr0], [0], [dnl
3818 OFPST_PORT reply (xid=0x4): 1 ports
3819   port  1: rx pkts=5, bytes=300, drop=0, errs=0, frame=0, over=0, crc=0
3820            tx pkts=10, bytes=600, drop=0, errs=0, coll=0
3821 ])
3822
3823 AT_CHECK([ovs-ofctl dump-ports br1 pbr1], [0], [dnl
3824 OFPST_PORT reply (xid=0x4): 1 ports
3825   port  1: rx pkts=10, bytes=600, drop=0, errs=0, frame=0, over=0, crc=0
3826            tx pkts=5, bytes=300, drop=0, errs=0, coll=0
3827 ])
3828
3829 OVS_VSWITCHD_STOP
3830 AT_CLEANUP
3831
3832 AT_SETUP([ofproto-dpif - port duration])
3833 OVS_VSWITCHD_START([set Bridge br0 protocols=OpenFlow13])
3834 ADD_OF_PORTS([br0], 1, 2)
3835
3836 ovs-appctl time/stop
3837 ovs-appctl time/warp 10000
3838
3839 AT_CHECK([ovs-ofctl -O openflow13 dump-ports br0], [0], [stdout])
3840 AT_CHECK([sed -n 's/=[[0-9]][[0-9]]\(\.[[0-9]][[0-9]]*\)\{0,1\}s/=?s/p' stdout], [0],
3841 [dnl
3842            duration=?s
3843            duration=?s
3844            duration=?s
3845 ])
3846 OVS_VSWITCHD_STOP
3847 AT_CLEANUP
3848
3849 dnl ----------------------------------------------------------------------
3850 AT_BANNER([ofproto-dpif -- megaflows])
3851
3852 AT_SETUP([ofproto-dpif megaflow - port classification])
3853 OVS_VSWITCHD_START
3854 ADD_OF_PORTS([br0], [1], [2])
3855 AT_DATA([flows.txt], [dnl
3856 table=0 in_port=1 actions=output(2)
3857 ])
3858 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3859 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)'])
3860 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)'])
3861 sleep 1
3862 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3863 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>
3864 ])
3865 OVS_VSWITCHD_STOP
3866 AT_CLEANUP
3867
3868 AT_SETUP([ofproto-dpif megaflow - L2 classification])
3869 OVS_VSWITCHD_START
3870 ADD_OF_PORTS([br0], [1], [2])
3871 AT_DATA([flows.txt], [dnl
3872 table=0 in_port=1,dl_src=50:54:00:00:00:09 actions=output(2)
3873 ])
3874 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3875 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)'])
3876 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)'])
3877 sleep 1
3878 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3879 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>
3880 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>
3881 ])
3882 OVS_VSWITCHD_STOP
3883 AT_CLEANUP
3884
3885 AT_SETUP([ofproto-dpif megaflow - L3 classification])
3886 OVS_VSWITCHD_START
3887 ADD_OF_PORTS([br0], [1], [2])
3888 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], [])
3889 AT_DATA([flows.txt], [dnl
3890 table=0 in_port=1,icmp,nw_src=10.0.0.4 actions=output(2)
3891 ])
3892 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3893 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)'])
3894 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)'])
3895 sleep 1
3896 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3897 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>
3898 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>
3899 ])
3900 OVS_VSWITCHD_STOP
3901 AT_CLEANUP
3902
3903 AT_SETUP([ofproto-dpif megaflow - IPv6 classification])
3904 OVS_VSWITCHD_START
3905 ADD_OF_PORTS([br0], [1], [2])
3906 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], [])
3907 AT_DATA([flows.txt], [dnl
3908 table=0 in_port=1,ipv6,ipv6_src=2001:db8:3c4d:1:2:3:4:5 actions=output(2)
3909 ])
3910 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3911 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)'])
3912 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)'])
3913 sleep 1
3914 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3915 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>
3916 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>
3917 ])
3918 OVS_VSWITCHD_STOP
3919 AT_CLEANUP
3920
3921 AT_SETUP([ofproto-dpif megaflow - L4 classification])
3922 OVS_VSWITCHD_START
3923 ADD_OF_PORTS([br0], [1], [2])
3924 AT_DATA([flows.txt], [dnl
3925 table=0 in_port=1,icmp,icmp_type=8 actions=output(2)
3926 ])
3927 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3928 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)'])
3929 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)'])
3930 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3931 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>
3932 ])
3933 OVS_VSWITCHD_STOP
3934 AT_CLEANUP
3935
3936 AT_SETUP([ofproto-dpif megaflow - normal])
3937 OVS_VSWITCHD_START
3938 ADD_OF_PORTS([br0], [1], [2])
3939 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
3940 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)'])
3941 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)'])
3942 sleep 1
3943 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3944 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>
3945 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>
3946 ])
3947 OVS_VSWITCHD_STOP
3948 AT_CLEANUP
3949
3950 AT_SETUP([ofproto-dpif megaflow - mpls])
3951 OVS_VSWITCHD_START
3952 ADD_OF_PORTS([br0], [1], [2])
3953 AT_DATA([flows.txt], [dnl
3954 table=0 dl_src=50:54:00:00:00:09 actions=push_mpls:0x8847,2
3955 table=0 dl_src=50:54:00:00:00:0b actions=pop_mpls:0x0800,2
3956 ])
3957 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3958 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)'])
3959 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)'])
3960 sleep 1
3961 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3962 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>
3963 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>
3964 ])
3965 OVS_VSWITCHD_STOP
3966 AT_CLEANUP
3967
3968 # CHECK_MEGAFLOW_NETFLOW(LOOPBACK_ADDR, IP_VERSION_TYPE)
3969 #
3970 # IP_VERSION_TYPE is used in AT_SETUP
3971 m4_define([CHECK_MEGAFLOW_NETFLOW],
3972   [AT_SETUP([ofproto-dpif megaflow - netflow - $2 collector])
3973   OVS_VSWITCHD_START
3974   ADD_OF_PORTS([br0], [1], [2])
3975
3976   dnl NetFlow configuration disables wildcarding relevant fields
3977   ON_EXIT([kill `cat test-netflow.pid`])
3978   AT_CHECK([ovstest test-netflow --log-file --detach --no-chdir --pidfile 0:$1 > netflow.log], [0], [], [ignore])
3979   AT_CAPTURE_FILE([netflow.log])
3980   NETFLOW_PORT=`parse_listening_port < test-netflow.log`
3981   ovs-vsctl \
3982      set Bridge br0 netflow=@nf -- \
3983      --id=@nf create NetFlow targets=\"$1:$NETFLOW_PORT\" \
3984        engine_id=1 engine_type=2 active_timeout=30 add-id-to-interface=false
3985
3986   AT_CHECK([ovs-ofctl add-flow br0 action=normal])
3987   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)'])
3988   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)'])
3989   sleep 1
3990   AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3991 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>
3992 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>
3993 ])
3994   OVS_VSWITCHD_STOP
3995   AT_CLEANUP])
3996
3997 CHECK_MEGAFLOW_NETFLOW([127.0.0.1], [IPv4])
3998 CHECK_MEGAFLOW_NETFLOW([[[::1]]], [IPv6])
3999
4000 AT_SETUP([ofproto-dpif megaflow - normal, active-backup bonding])
4001 OVS_VSWITCHD_START(
4002   [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1 -- \
4003    add-bond br0 bond0 p2 p3 bond_mode=active-backup -- \
4004    set interface p2 type=dummy ofport_request=2 -- \
4005    set interface p3 type=dummy ofport_request=3])
4006 AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK
4007 ])
4008
4009 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
4010 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)'])
4011 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)'])
4012 sleep 1
4013 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
4014 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>
4015 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>
4016 ])
4017 OVS_VSWITCHD_STOP
4018 AT_CLEANUP
4019
4020 AT_SETUP([ofproto-dpif megaflow - normal, balance-slb bonding])
4021 OVS_VSWITCHD_START(
4022   [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1 -- \
4023    add-bond br0 bond0 p2 p3 bond_mode=balance-slb -- \
4024    set interface p2 type=dummy ofport_request=2 -- \
4025    set interface p3 type=dummy ofport_request=3])
4026 AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK
4027 ])
4028
4029 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
4030 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)'])
4031 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)'])
4032 sleep 1
4033 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
4034 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>
4035 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>
4036 ])
4037 OVS_VSWITCHD_STOP
4038 AT_CLEANUP
4039
4040 AT_SETUP([ofproto-dpif megaflow - normal, balance-tcp bonding])
4041 # Create bond0 on br0 with interfaces p0 and p1
4042 #    and bond1 on br1 with interfaces p2 and p3
4043 # with p0 patched to p2 and p1 patched to p3.
4044 OVS_VSWITCHD_START(
4045   [add-bond br0 bond0 p0 p1 bond_mode=balance-tcp lacp=active \
4046                             other-config:lacp-time=fast \
4047                             other-config:bond-rebalance-interval=0 -- \
4048    set interface p0 type=patch options:peer=p2 ofport_request=1 -- \
4049    set interface p1 type=patch options:peer=p3 ofport_request=2 -- \
4050    add-br br1 -- \
4051    set bridge br1 other-config:hwaddr=aa:66:aa:66:00:00 -- \
4052    set bridge br1 datapath-type=dummy other-config:datapath-id=1234 \
4053                   fail-mode=secure -- \
4054    add-bond br1 bond1 p2 p3 bond_mode=balance-tcp lacp=active \
4055                             other-config:lacp-time=fast \
4056                             other-config:bond-rebalance-interval=0 -- \
4057    set interface p2 type=patch options:peer=p0 ofport_request=3 -- \
4058    set interface p3 type=patch options:peer=p1 ofport_request=4 --])
4059
4060 AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK
4061 ])
4062 ADD_OF_PORTS([br0], [7])
4063 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
4064 AT_CHECK([ovs-ofctl add-flow br1 action=normal])
4065 ovs-appctl time/stop
4066 ovs-appctl time/warp 5000
4067 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)'])
4068 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)'])
4069
4070 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
4071 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>
4072 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>
4073 ])
4074 OVS_VSWITCHD_STOP
4075 AT_CLEANUP
4076
4077 AT_SETUP([ofproto-dpif megaflow - resubmit port action])
4078 OVS_VSWITCHD_START
4079 ADD_OF_PORTS([br0], [1], [2])
4080 AT_DATA([flows.txt], [dnl
4081 table=0 in_port=1,ip actions=resubmit(90)
4082 table=0 in_port=90,dl_src=50:54:00:00:00:09 actions=output(2)
4083 ])
4084 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
4085 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)'])
4086 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)'])
4087 sleep 1
4088 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
4089 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>
4090 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>
4091 ])
4092 OVS_VSWITCHD_STOP
4093 AT_CLEANUP
4094
4095 AT_SETUP([ofproto-dpif megaflow - resubmit table action])
4096 OVS_VSWITCHD_START
4097 ADD_OF_PORTS([br0], [1], [2])
4098 AT_DATA([flows.txt], [dnl
4099 table=0 in_port=1,ip actions=resubmit(,1)
4100 table=1 dl_src=50:54:00:00:00:09 actions=output(2)
4101 ])
4102 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
4103 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)'])
4104 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=
4105 1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
4106 sleep 1
4107 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
4108 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>
4109 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>
4110 ])
4111 OVS_VSWITCHD_STOP
4112 AT_CLEANUP
4113
4114 AT_SETUP([ofproto-dpif megaflow - goto_table action])
4115 OVS_VSWITCHD_START
4116 ADD_OF_PORTS([br0], [1], [2])
4117 AT_DATA([flows.txt], [dnl
4118 table=0 in_port=1,ip actions=goto_table(1)
4119 table=1 dl_src=50:54:00:00:00:09 actions=output(2)
4120 ])
4121 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flows br0 flows.txt])
4122 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)'])
4123 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)'])
4124 sleep 1
4125 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
4126 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>
4127 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>
4128 ])
4129 OVS_VSWITCHD_STOP
4130 AT_CLEANUP
4131
4132 AT_SETUP([ofproto-dpif megaflow - mirroring, select_all])
4133 OVS_VSWITCHD_START
4134 ADD_OF_PORTS([br0], [1], [2], [3])
4135 ovs-vsctl \
4136         set Bridge br0 mirrors=@m --\
4137         --id=@p3 get Port p3 --\
4138         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
4139
4140 AT_DATA([flows.txt], [dnl
4141 in_port=1 actions=output:2
4142 ])
4143 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
4144 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)'])
4145 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)'])
4146 sleep 1
4147 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
4148 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>
4149 ])
4150 OVS_VSWITCHD_STOP
4151 AT_CLEANUP
4152
4153 AT_SETUP([ofproto-dpif megaflow - mirroring, select_vlan])
4154 OVS_VSWITCHD_START
4155 ADD_OF_PORTS([br0], [1], [2], [3])
4156 ovs-vsctl \
4157         set Bridge br0 mirrors=@m --\
4158         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
4159         --id=@m create Mirror name=mymirror select_all=true select_vlan=11 output_port=@p3
4160
4161 AT_DATA([flows.txt], [dnl
4162 in_port=1 actions=output:2
4163 ])
4164 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
4165 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))'])
4166 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)'])
4167 sleep 1
4168 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
4169 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>
4170 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>
4171 ])
4172 OVS_VSWITCHD_STOP
4173 AT_CLEANUP
4174
4175 AT_SETUP([ofproto-dpif megaflow - move action])
4176 OVS_VSWITCHD_START
4177 ADD_OF_PORTS([br0], [1], [2])
4178 AT_DATA([flows.txt], [dnl
4179 table=0 in_port=1 ip,actions=move:NXM_OF_IP_SRC[[]]->NXM_NX_REG0[[]],resubmit(90)
4180 table=0 in_port=90 ip,actions=move:NXM_NX_REG0[[]]->NXM_NX_REG1[[]],resubmit(91)
4181 table=0 in_port=91 reg0=0x0a000002,actions=output(2)
4182 ])
4183 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
4184 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)'])
4185 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)'])
4186 sleep 1
4187 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
4188 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>
4189 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>
4190 ])
4191 OVS_VSWITCHD_STOP
4192 AT_CLEANUP
4193
4194 AT_SETUP([ofproto-dpif megaflow - push action])
4195 OVS_VSWITCHD_START
4196 ADD_OF_PORTS([br0], [1], [2])
4197 AT_DATA([flows.txt], [dnl
4198 table=0 in_port=1 ip,actions=push:NXM_OF_IP_SRC[[]],output(2)
4199 ])
4200 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
4201 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)'])
4202 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)'])
4203 sleep 1
4204 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
4205 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>
4206 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>
4207 ])
4208 OVS_VSWITCHD_STOP
4209 AT_CLEANUP
4210
4211 AT_SETUP([ofproto-dpif megaflow - learning])
4212 OVS_VSWITCHD_START
4213 ADD_OF_PORTS([br0], [1], [2])
4214 AT_DATA([flows.txt], [dnl
4215 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
4216 ])
4217 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
4218 ovs-appctl time/stop
4219 # We send each packet twice because the first packet in each flow causes the
4220 # flow table to change and thus revalidations, which (depending on timing)
4221 # can keep a megaflow from being installed.  The revalidations are done by
4222 # the second iteration, allowing the flows to be installed.
4223 for i in 1 2; do
4224     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)'])
4225     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)'])
4226     ovs-appctl time/warp 100
4227 done
4228 sleep 1
4229 dnl The original flow is missing due to a revalidation.
4230 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
4231 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>
4232 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>
4233 ])
4234 OVS_VSWITCHD_STOP
4235 AT_CLEANUP
4236
4237 AT_SETUP([ofproto-dpif megaflow - tunnels])
4238 OVS_VSWITCHD_START(
4239   [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1])
4240 AT_CHECK([ovs-vsctl add-port br0 p2 -- set Interface p2 type=gre \
4241      options:remote_ip=1.1.1.1 ofport_request=2 options:key=flow])
4242 AT_CHECK([ovs-vsctl add-port br0 p3 -- set Interface p3 type=dummy \
4243           ofport_request=3])
4244 AT_CHECK([ovs-vsctl add-port br0 p4 -- set Interface p4 type=gre \
4245      options:remote_ip=1.1.1.2 options:tos=inherit options:ttl=inherit \
4246      ofport_request=4 options:key=flow])
4247 AT_DATA([flows.txt], [dnl
4248 in_port=1,actions=output(2)
4249 in_port=3,actions=output(4)
4250 ])
4251 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
4252 dnl ECN bits are always copied out, but don't use 0x3 (CE), since that
4253 dnl will cause the packet to be dropped.
4254 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)'])
4255 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)'])
4256 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)'])
4257 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)'])
4258 sleep 1
4259 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
4260 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>
4261 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>
4262 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>
4263 ])
4264 OVS_VSWITCHD_STOP
4265 AT_CLEANUP
4266
4267 AT_SETUP([ofproto-dpif megaflow - dec_ttl])
4268 OVS_VSWITCHD_START
4269 ADD_OF_PORTS([br0], [1], [2])
4270 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], [])
4271 AT_DATA([flows.txt], [dnl
4272 table=0 in_port=1,icmp,nw_src=10.0.0.4 actions=dec_ttl,output(2)
4273 ])
4274 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
4275 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)'])
4276 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)'])
4277 sleep 1
4278 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
4279 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>
4280 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>
4281 ])
4282 OVS_VSWITCHD_STOP
4283 AT_CLEANUP
4284
4285 AT_SETUP([ofproto-dpif megaflow - set dl_dst])
4286 OVS_VSWITCHD_START
4287 ADD_OF_PORTS([br0], [1], [2])
4288 AT_DATA([flows.txt], [dnl
4289 table=0 in_port=1 actions=mod_dl_dst(50:54:00:00:00:0a),output(2)
4290 ])
4291 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
4292 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)'])
4293 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)'])
4294 sleep 1
4295 dnl The megaflows do not match the same fields, since the first packet
4296 dnl is essentially a no-op.  (The new destination MAC is the same as the
4297 dnl original.) The ofproto-dpif library un-wildcards the destination MAC
4298 dnl so that a packet that doesn't need its MAC address changed doesn't
4299 dnl hide one that does.  Since the first entry doesn't need to change,
4300 dnl only the destination MAC address is matched (as decided by
4301 dnl ofproto-dpif).  The second entry actually updates the destination
4302 dnl MAC, so both the source and destination MAC addresses are
4303 dnl un-wildcarded, since the ODP commit functions update both the source
4304 dnl and destination MAC addresses.
4305 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_USED], [0], [dnl
4306 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
4307 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
4308 ])
4309 OVS_VSWITCHD_STOP
4310 AT_CLEANUP
4311
4312 AT_SETUP([ofproto-dpif megaflow - disabled])
4313 OVS_VSWITCHD_START
4314 ADD_OF_PORTS([br0], [1], [2])
4315 AT_DATA([flows.txt], [dnl
4316 table=0 in_port=1,ip,nw_dst=10.0.0.1 actions=output(2)
4317 table=0 in_port=1,ip,nw_dst=10.0.0.3 actions=drop
4318 ])
4319 AT_CHECK([ovs-appctl upcall/disable-megaflows], [0], [megaflows disabled
4320 ], [])
4321 AT_CHECK([ovs-appctl vlog/set dpif_netdev:dbg], [0], [], [])
4322 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
4323 for i in 1 2 3 4; do
4324     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)'])
4325     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)'])
4326 done
4327 sleep 1
4328 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_USED], [0], [dnl
4329 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
4330 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
4331 ])
4332 OVS_VSWITCHD_STOP
4333 AT_CLEANUP
4334
4335 AT_SETUP([ofproto-dpif - datapath port number change])
4336 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
4337 ADD_OF_PORTS([br0], 1)
4338
4339 # Trace a flow that should output to p1.
4340 AT_CHECK([ovs-appctl ofproto/trace br0 in_port=LOCAL,dl_src=10:20:30:40:50:60],
4341   [0], [stdout])
4342 AT_CHECK([tail -1 stdout], [0], [Datapath actions: 1
4343 ])
4344
4345 # Change p1's port number to 5.
4346 AT_CHECK([ovs-appctl dpif-dummy/change-port-number ovs-dummy p1 5])
4347
4348 # Trace a flow that should output to p1 in its new location.
4349 AT_CHECK([ovs-appctl ofproto/trace br0 in_port=LOCAL,dl_src=10:20:30:40:50:60],
4350   [0], [stdout])
4351 AT_CHECK([tail -1 stdout], [0], [Datapath actions: 5
4352 ])
4353 OVS_VSWITCHD_STOP
4354 AT_CLEANUP
4355
4356 # Tests the bundling with various bfd and cfm configurations.
4357 AT_SETUP([ofproto - bundle with variable bfd/cfm config])
4358 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy -- \
4359                     add-bond br0 br0bond p0 p2 bond-mode=active-backup -- \
4360                     add-bond br1 br1bond p1 p3 bond-mode=active-backup -- \
4361                     set Interface p1 type=patch options:peer=p0 ofport_request=2 -- \
4362                     set Interface p3 type=patch options:peer=p2 ofport_request=4 -- \
4363                     set Interface p0 type=patch options:peer=p1 ofport_request=1 -- \
4364                     set Interface p2 type=patch options:peer=p3 ofport_request=3 -- \
4365                     set Interface p0 bfd:enable=true bfd:min_tx=300 bfd:min_rx=300 -- \
4366                     set Interface p0 cfm_mpid=1 -- \
4367                     set Interface p1 bfd:enable=true bfd:min_tx=500 bfd:min_rx=500])
4368
4369 ovs-appctl time/stop
4370 # advance the clock to stablize everything.
4371 for i in `seq 0 49`; do ovs-appctl time/warp 100; done
4372 # cfm/show should show 'recv' fault.
4373 AT_CHECK([ovs-appctl cfm/show | sed -n '/^.*fault:.*/p'], [0], [dnl
4374         fault: recv
4375 ])
4376 # bfd/show should show 'up'.
4377 AT_CHECK([ovs-appctl bfd/show | sed -n '/^.*Session State:.*/p'], [0], [dnl
4378         Local Session State: up
4379         Remote Session State: up
4380         Local Session State: up
4381         Remote Session State: up
4382 ])
4383 # bond/show should show 'may-enable: true' for all slaves.
4384 AT_CHECK([ovs-appctl bond/show | sed -n '/^.*may_enable:.*/p'], [0], [dnl
4385         may_enable: true
4386         may_enable: true
4387         may_enable: true
4388         may_enable: true
4389 ])
4390
4391 # now disable the bfd on p1.
4392 AT_CHECK([ovs-vsctl set Interface p1 bfd:enable=false])
4393 # advance the clock to stablize everything.
4394 for i in `seq 0 49`; do ovs-appctl time/warp 100; done
4395 # cfm/show should show 'recv' fault.
4396 AT_CHECK([ovs-appctl cfm/show | sed -n '/^.*fault:.*/p'], [0], [dnl
4397         fault: recv
4398 ])
4399 # bfd/show should show 'down'.
4400 AT_CHECK([ovs-appctl bfd/show | sed -n '/^.*Session State:.*/p'], [0], [dnl
4401         Local Session State: down
4402         Remote Session State: down
4403 ])
4404 # bond/show should show 'may-enable: false' for p0.
4405 AT_CHECK([ovs-appctl bond/show br0bond | sed -n '/^.*may_enable:.*/p'], [0], [dnl
4406         may_enable: false
4407         may_enable: true
4408 ])
4409
4410 # now enable the bfd on p1 and disable bfd on p0.
4411 AT_CHECK([ovs-vsctl set Interface p1 bfd:enable=true])
4412 AT_CHECK([ovs-vsctl set Interface p0 bfd:enable=false])
4413 # advance the clock to stablize everything.
4414 for i in `seq 0 49`; do ovs-appctl time/warp 100; done
4415 # cfm/show should show 'recv' fault.
4416 AT_CHECK([ovs-appctl cfm/show | sed -n '/^.*fault:.*/p'], [0], [dnl
4417         fault: recv
4418 ])
4419 # bfd/show should show 'down'.
4420 AT_CHECK([ovs-appctl bfd/show | sed -n '/^.*Session State:.*/p'], [0], [dnl
4421         Local Session State: down
4422         Remote Session State: down
4423 ])
4424 # bond/show should show 'may-enable: false' for p0 and p1.
4425 AT_CHECK([ovs-appctl bond/show | sed -n '/^.*may_enable:.*/p'], [0], [dnl
4426         may_enable: false
4427         may_enable: true
4428         may_enable: false
4429         may_enable: true
4430 ])
4431
4432 OVS_VSWITCHD_STOP
4433 AT_CLEANUP
4434
4435 AT_SETUP([ofproto-dpif - ofproto-dpif-monitor 1])
4436 OVS_VSWITCHD_START([add-port br0 p0 -- set interface p0 type=gre options:remote_ip=1.2.3.4])
4437
4438 # enable bfd on p0.
4439 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=true])
4440 # check log.
4441 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* created\)$/\1/p" ovs-vswitchd.log], [0], [dnl
4442 monitor thread created
4443 ])
4444 # disable bfd on p0.
4445 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=false])
4446 # check log.
4447 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* terminated\)$/\1/p" ovs-vswitchd.log], [0], [dnl
4448 monitor thread terminated
4449 ])
4450 AT_CHECK([cat ovs-vswitchd.log | sed -e '/^.*ofproto_dpif_monitor.*$/d' > ovs-vswitchd.log])
4451
4452 # enable cfm on p0.
4453 AT_CHECK([ovs-vsctl set interface p0 cfm_mpid=10])
4454 # check log.
4455 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* created\)$/\1/p" ovs-vswitchd.log], [0], [dnl
4456 monitor thread created
4457 ])
4458 # disable cfm on p0.
4459 AT_CHECK([ovs-vsctl remove interface p0 cfm_mpid 10])
4460 # check log.
4461 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* terminated\)$/\1/p" ovs-vswitchd.log], [0], [dnl
4462 monitor thread terminated
4463 ])
4464 AT_CHECK([cat ovs-vswitchd.log | sed -e '/^.*ofproto_dpif_monitor.*$/d' > ovs-vswitchd.log])
4465
4466 # enable both bfd and cfm on p0.
4467 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=true cfm_mpid=10])
4468 # check log.
4469 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* created\)$/\1/p" ovs-vswitchd.log], [0], [dnl
4470 monitor thread created
4471 ])
4472 # disable bfd on p0.
4473 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=false])
4474 # check log, there should not be the log of thread terminated.
4475 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* terminated\)$/\1/p" ovs-vswitchd.log], [0], [dnl
4476 ])
4477 # reenable bfd on p0.
4478 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=true])
4479 # check log, should still be on log of thread created.
4480 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* created\)$/\1/p" ovs-vswitchd.log], [0], [dnl
4481 monitor thread created
4482 ])
4483 # disable bfd and cfm together.
4484 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=false -- remove interface p0 cfm_mpid 10])
4485 # check log.
4486 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* terminated\)$/\1/p" ovs-vswitchd.log], [0], [dnl
4487 monitor thread terminated
4488 ])
4489
4490 OVS_VSWITCHD_STOP
4491 AT_CLEANUP
4492
4493 # this test helps avoid the deadlock between the main thread and monitor thread.
4494 AT_SETUP([ofproto-dpif - ofproto-dpif-monitor 2])
4495 OVS_VSWITCHD_START
4496
4497 for i in `seq 1 199`
4498 do
4499     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])
4500 done
4501
4502 OVS_VSWITCHD_STOP
4503 AT_CLEANUP
4504 \f
4505 AT_BANNER([ofproto-dpif - flow translation resource limits])
4506
4507 AT_SETUP([ofproto-dpif - infinite resubmit])
4508 OVS_VSWITCHD_START
4509 AT_CHECK([ovs-ofctl add-flow br0 actions=resubmit:1,resubmit:2,output:3])
4510 AT_CHECK([ovs-appctl ofproto/trace br0 'eth_dst=ff:ff:ff:ff:ff:ff'],
4511   [0], [stdout])
4512 AT_CHECK([tail -1 stdout], [0], [Datapath actions: drop
4513 ])
4514 AT_CHECK([grep -c 'resubmit actions recursed over 64 times' ovs-vswitchd.log],
4515   [0], [1
4516 ])
4517 OVS_VSWITCHD_STOP(["/resubmit actions recursed/d"])
4518 AT_CLEANUP
4519
4520 AT_SETUP([ofproto-dpif - exponential resubmit chain])
4521 OVS_VSWITCHD_START
4522 ADD_OF_PORTS([br0], 1)
4523 (for i in `seq 1 64`; do
4524      j=`expr $i + 1`
4525      echo "in_port=$i, actions=resubmit:$j, resubmit:$j, local"
4526  done
4527  echo "in_port=65, actions=local") > flows
4528  AT_CHECK([ovs-ofctl add-flows br0 flows])
4529 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1'], [0], [stdout])
4530 AT_CHECK([grep -c 'over 4096 resubmit actions' ovs-vswitchd.log], [0], [1
4531 ])
4532 OVS_VSWITCHD_STOP(["/over.*resubmit actions/d"])
4533 AT_CLEANUP
4534
4535 AT_SETUP([ofproto-dpif - too many output actions])
4536 OVS_VSWITCHD_START
4537 ADD_OF_PORTS([br0], 1)
4538 (for i in `seq 1 12`; do
4539      j=`expr $i + 1`
4540      echo "in_port=$i, actions=resubmit:$j, resubmit:$j, local"
4541  done
4542  echo "in_port=13, actions=local,local,local,local,local,local,local,local") > flows
4543 AT_CHECK([ovs-ofctl add-flows br0 flows])
4544 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1'], [0], [stdout])
4545 AT_CHECK([grep -c -e '- Uses action(s) not supported by datapath' stdout],
4546   [0], [1
4547 ])
4548 AT_CHECK([grep -c 'resubmits yielded over 64 kB of actions' ovs-vswitchd.log], [0], [1
4549 ])
4550 OVS_VSWITCHD_STOP(["/resubmits yielded over 64 kB of actions/d"])
4551 AT_CLEANUP
4552
4553 AT_SETUP([ofproto-dpif - stack too deep])
4554 OVS_VSWITCHD_START
4555 ADD_OF_PORTS([br0], 1)
4556 (for i in `seq 1 12`; do
4557      j=`expr $i + 1`
4558      echo "in_port=$i, actions=resubmit:$j, resubmit:$j, local"
4559  done
4560  push="push:NXM_NX_REG0[[]]"
4561  echo "in_port=13, actions=$push,$push,$push,$push,$push,$push,$push,$push") > flows
4562  AT_CHECK([ovs-ofctl add-flows br0 flows])
4563 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1'], [0], [stdout])
4564 AT_CHECK([grep -c 'resubmits yielded over 64 kB of stack' ovs-vswitchd.log], [0], [1
4565 ])
4566 OVS_VSWITCHD_STOP(["/resubmits yielded over 64 kB of stack/d"])
4567 AT_CLEANUP