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