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