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