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