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