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