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