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