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