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