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