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