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