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