OPENFLOW-1.1+: Update status of a few items.
[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 ])
1125 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 add-flows br0 flows.txt])
1126
1127 dnl In this test, we push an MPLS tag to an ethernet packet.
1128 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 monitor br0 65534 -m -P nxm --detach --pidfile 2> ofctl_monitor.log])
1129
1130 for i in 1 2 3; do
1131     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)'
1132 done
1133 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
1134
1135 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
1136 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1137 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
1138 00000000  50 54 00 00 00 07 40 44-44 44 00 00 88 47 00 00
1139 00000010  01 40 45 00 00 28 00 00-00 00 40 06 f9 7c c0 a8
1140 00000020  00 01 c0 a8 00 02 00 00-00 00 00 00 00 00 00 00
1141 00000030  00 00 50 00 00 00 00 00-00 00 00 00 00 00 00 00
1142 dnl
1143 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1144 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
1145 00000000  50 54 00 00 00 07 40 44-44 44 00 00 88 47 00 00
1146 00000010  01 40 45 00 00 28 00 00-00 00 40 06 f9 7c c0 a8
1147 00000020  00 01 c0 a8 00 02 00 00-00 00 00 00 00 00 00 00
1148 00000030  00 00 50 00 00 00 00 00-00 00 00 00 00 00 00 00
1149 dnl
1150 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1151 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
1152 00000000  50 54 00 00 00 07 40 44-44 44 00 00 88 47 00 00
1153 00000010  01 40 45 00 00 28 00 00-00 00 40 06 f9 7c c0 a8
1154 00000020  00 01 c0 a8 00 02 00 00-00 00 00 00 00 00 00 00
1155 00000030  00 00 50 00 00 00 00 00-00 00 00 00 00 00 00 00
1156 ])
1157
1158 OVS_VSWITCHD_STOP
1159 AT_CLEANUP
1160
1161 AT_SETUP([ofproto-dpif - VLAN+MPLS handling])
1162 OVS_VSWITCHD_START([dnl
1163    add-port br0 p1 -- set Interface p1 type=dummy
1164 ])
1165 ON_EXIT([kill `cat ovs-ofctl.pid`])
1166
1167 AT_CAPTURE_FILE([ofctl_monitor.log])
1168 AT_DATA([flows.txt], [dnl
1169 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
1170 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
1171 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
1172 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
1173 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
1174 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
1175 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
1176 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
1177 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
1178 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
1179 ])
1180 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 add-flows br0 flows.txt])
1181
1182 dnl Modified MPLS controller action.
1183 dnl In this test, we push the MPLS tag before pushing a VLAN tag, so we see
1184 dnl both of these in the final flow
1185 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 monitor br0 65534 -m -P nxm --detach --pidfile 2> ofctl_monitor.log])
1186
1187 for i in 1 2 3; do
1188     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)'
1189 done
1190 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
1191
1192 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
1193 OFPT_PACKET_IN (OF1.2): total_len=68 in_port=1 (via action) data_len=68 (unbuffered)
1194 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
1195 00000000  50 54 00 00 00 07 40 44-44 44 54 50 81 00 20 63
1196 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1197 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1198 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1199 00000040  00 00 00 00
1200 dnl
1201 OFPT_PACKET_IN (OF1.2): total_len=68 in_port=1 (via action) data_len=68 (unbuffered)
1202 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
1203 00000000  50 54 00 00 00 07 40 44-44 44 54 50 81 00 20 63
1204 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1205 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1206 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1207 00000040  00 00 00 00
1208 dnl
1209 OFPT_PACKET_IN (OF1.2): total_len=68 in_port=1 (via action) data_len=68 (unbuffered)
1210 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
1211 00000000  50 54 00 00 00 07 40 44-44 44 54 50 81 00 20 63
1212 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1213 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1214 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1215 00000040  00 00 00 00
1216 ])
1217
1218 dnl Modified MPLS controller action.
1219 dnl In this test, the input packet in vlan-tagged, which should be stripped
1220 dnl before we push the MPLS and VLAN tags.
1221 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 monitor br0 65534 -m -P nxm --detach --pidfile 2> ofctl_monitor.log])
1222
1223 for i in 1 2 3; do
1224     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=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))'
1225 done
1226 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
1227 ovs-appctl -t ovs-ofctl exit
1228
1229 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
1230 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1231 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
1232 00000000  50 54 00 00 00 07 40 44-44 44 54 51 81 00 20 63
1233 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1234 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1235 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1236 dnl
1237 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1238 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
1239 00000000  50 54 00 00 00 07 40 44-44 44 54 51 81 00 20 63
1240 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1241 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1242 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1243 dnl
1244 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1245 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
1246 00000000  50 54 00 00 00 07 40 44-44 44 54 51 81 00 20 63
1247 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1248 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1249 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1250 ])
1251
1252 dnl Modified MPLS controller action.
1253 dnl In this test, we push the MPLS tag before pushing a VLAN tag, so we see
1254 dnl both of these in the final flow
1255 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 monitor br0 65534 -m -P nxm --detach --pidfile 2> ofctl_monitor.log])
1256
1257 for i in 1 2 3; do
1258     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)'
1259 done
1260 OVS_WAIT_UNTIL([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=68 in_port=1 (via action) data_len=68 (unbuffered)
1264 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
1265 00000000  52 54 00 00 00 07 40 44-44 44 54 52 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 00000040  00 00 00 00
1270 dnl
1271 OFPT_PACKET_IN (OF1.2): total_len=68 in_port=1 (via action) data_len=68 (unbuffered)
1272 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
1273 00000000  52 54 00 00 00 07 40 44-44 44 54 52 81 00 20 63
1274 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1275 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1276 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1277 00000040  00 00 00 00
1278 dnl
1279 OFPT_PACKET_IN (OF1.2): total_len=68 in_port=1 (via action) data_len=68 (unbuffered)
1280 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
1281 00000000  52 54 00 00 00 07 40 44-44 44 54 52 81 00 20 63
1282 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1283 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1284 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1285 00000040  00 00 00 00
1286 ])
1287
1288 dnl Modified MPLS controller action.
1289 dnl In this test, the input packet in vlan-tagged, which should be stripped
1290 dnl before we push the MPLS and VLAN tags.
1291 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 monitor br0 65534 -m -P nxm --detach --pidfile 2> ofctl_monitor.log])
1292
1293 for i in 1 2 3; do
1294     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))'
1295 done
1296 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
1297 ovs-appctl -t ovs-ofctl exit
1298
1299 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
1300 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1301 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
1302 00000000  50 54 00 00 00 07 40 44-44 44 54 53 81 00 20 63
1303 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1304 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1305 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1306 dnl
1307 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1308 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
1309 00000000  50 54 00 00 00 07 40 44-44 44 54 53 81 00 20 63
1310 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1311 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1312 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1313 dnl
1314 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1315 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
1316 00000000  50 54 00 00 00 07 40 44-44 44 54 53 81 00 20 63
1317 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1318 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1319 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1320 ])
1321
1322 dnl Modified MPLS controller action.
1323 dnl In this test, we push the VLAN tag before pushing a MPLS tag, but these
1324 dnl actions are reordered, so we see both of these in the final flow.
1325 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 monitor br0 65534 -m -P nxm --detach --pidfile 2> ofctl_monitor.log])
1326
1327 for i in 1 2 3; do
1328     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)'
1329 done
1330 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
1331 ovs-appctl -t ovs-ofctl exit
1332
1333 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
1334 OFPT_PACKET_IN (OF1.2): total_len=68 in_port=1 (via action) data_len=68 (unbuffered)
1335 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
1336 00000000  50 54 00 00 00 07 40 44-44 44 54 54 81 00 20 63
1337 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1338 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1339 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1340 00000040  00 00 00 00
1341 dnl
1342 OFPT_PACKET_IN (OF1.2): total_len=68 in_port=1 (via action) data_len=68 (unbuffered)
1343 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
1344 00000000  50 54 00 00 00 07 40 44-44 44 54 54 81 00 20 63
1345 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1346 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1347 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1348 00000040  00 00 00 00
1349 dnl
1350 OFPT_PACKET_IN (OF1.2): total_len=68 in_port=1 (via action) data_len=68 (unbuffered)
1351 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
1352 00000000  50 54 00 00 00 07 40 44-44 44 54 54 81 00 20 63
1353 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1354 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1355 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1356 00000040  00 00 00 00
1357 ])
1358
1359 dnl Modified MPLS controller action.
1360 dnl In this test, the input packet in vlan-tagged, which should be stripped
1361 dnl before we push the MPLS and VLAN tags.
1362 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 monitor br0 65534 -m -P nxm --detach --pidfile 2> ofctl_monitor.log])
1363
1364 for i in 1 2 3; do
1365     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))'
1366 done
1367 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
1368 ovs-appctl -t ovs-ofctl exit
1369
1370 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
1371 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1372 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
1373 00000000  50 54 00 00 00 07 40 44-44 44 54 55 81 00 20 63
1374 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1375 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1376 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1377 dnl
1378 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1379 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
1380 00000000  50 54 00 00 00 07 40 44-44 44 54 55 81 00 20 63
1381 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1382 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1383 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1384 dnl
1385 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1386 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
1387 00000000  50 54 00 00 00 07 40 44-44 44 54 55 81 00 20 63
1388 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1389 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1390 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1391 ])
1392
1393 dnl Modified MPLS controller action.
1394 dnl In this test, we push the VLAN tag before pushing a MPLS tag, but these
1395 dnl actions are reordered, so we see both of these in the final flow.
1396 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 monitor br0 65534 -m -P nxm --detach --pidfile 2> ofctl_monitor.log])
1397
1398 for i in 1 2 3; do
1399     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)'
1400 done
1401 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
1402 ovs-appctl -t ovs-ofctl exit
1403
1404 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
1405 OFPT_PACKET_IN (OF1.2): total_len=68 in_port=1 (via action) data_len=68 (unbuffered)
1406 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
1407 00000000  50 54 00 00 00 07 40 44-44 44 54 56 81 00 20 63
1408 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1409 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1410 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1411 00000040  00 00 00 00
1412 dnl
1413 OFPT_PACKET_IN (OF1.2): total_len=68 in_port=1 (via action) data_len=68 (unbuffered)
1414 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
1415 00000000  50 54 00 00 00 07 40 44-44 44 54 56 81 00 20 63
1416 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1417 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1418 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1419 00000040  00 00 00 00
1420 dnl
1421 OFPT_PACKET_IN (OF1.2): total_len=68 in_port=1 (via action) data_len=68 (unbuffered)
1422 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
1423 00000000  50 54 00 00 00 07 40 44-44 44 54 56 81 00 20 63
1424 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1425 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1426 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1427 00000040  00 00 00 00
1428 ])
1429
1430 dnl Modified MPLS controller action.
1431 dnl In this test, the input packet in vlan-tagged, which should be stripped
1432 dnl before we push the MPLS and VLAN tags.
1433 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 monitor br0 -m 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
1434
1435 for i in 1 2 3; do
1436     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))'
1437 done
1438 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
1439 ovs-appctl -t ovs-ofctl exit
1440
1441 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
1442 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1443 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
1444 00000000  50 54 00 00 00 07 40 44-44 44 54 57 81 00 20 63
1445 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1446 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1447 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1448 dnl
1449 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1450 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
1451 00000000  50 54 00 00 00 07 40 44-44 44 54 57 81 00 20 63
1452 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1453 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1454 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1455 dnl
1456 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1457 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
1458 00000000  50 54 00 00 00 07 40 44-44 44 54 57 81 00 20 63
1459 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1460 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1461 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1462 ])
1463
1464 dnl Modified MPLS controller action.
1465 dnl In this test, the input packet in vlan-tagged, which should be stripped
1466 dnl before we push the MPLS and VLAN tags.
1467 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 monitor br0 65534 -m -P nxm --detach --pidfile 2> ofctl_monitor.log])
1468
1469 for i in 1 2 3; do
1470     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))'
1471 done
1472 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
1473 ovs-appctl -t ovs-ofctl exit
1474
1475 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
1476 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1477 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
1478 00000000  50 54 00 00 00 07 40 44-44 44 54 58 81 00 20 63
1479 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1480 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1481 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1482 dnl
1483 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1484 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
1485 00000000  50 54 00 00 00 07 40 44-44 44 54 58 81 00 20 63
1486 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1487 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1488 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1489 dnl
1490 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1491 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
1492 00000000  50 54 00 00 00 07 40 44-44 44 54 58 81 00 20 63
1493 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1494 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1495 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1496 ])
1497
1498 dnl Modified MPLS controller action.
1499 dnl In this test, the input packet in vlan-tagged, which should be modified
1500 dnl before we push MPLS and VLAN tags.
1501 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 monitor br0 65534 -m -P nxm --detach --pidfile 2> ofctl_monitor.log])
1502
1503 for i in 1 2 3; do
1504     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))'
1505 done
1506 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
1507 ovs-appctl -t ovs-ofctl exit
1508
1509 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
1510 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1511 mpls,metadata=0,in_port=0,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
1512 00000000  50 54 00 00 00 07 40 44-44 44 54 59 81 00 20 63
1513 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1514 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1515 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1516 dnl
1517 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1518 mpls,metadata=0,in_port=0,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
1519 00000000  50 54 00 00 00 07 40 44-44 44 54 59 81 00 20 63
1520 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1521 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1522 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1523 dnl
1524 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1525 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
1526 00000000  50 54 00 00 00 07 40 44-44 44 54 59 81 00 20 63
1527 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1528 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1529 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1530 ])
1531
1532 AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
1533 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0], [dnl
1534  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
1535  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
1536  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
1537  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
1538  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
1539  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
1540  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
1541  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
1542  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
1543  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
1544 OFPST_FLOW reply (OF1.2):
1545 ])
1546
1547 OVS_VSWITCHD_STOP
1548 AT_CLEANUP
1549
1550 AT_SETUP([ofproto-dpif - fragment handling])
1551 OVS_VSWITCHD_START
1552 ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6], [90])
1553 AT_DATA([flows.txt], [dnl
1554 priority=75 tcp ip_frag=no    tp_dst=80 actions=output:1
1555 priority=75 tcp ip_frag=first tp_dst=80 actions=output:2
1556 priority=75 tcp ip_frag=later tp_dst=80 actions=output:3
1557 priority=50 tcp ip_frag=no              actions=output:4
1558 priority=50 tcp ip_frag=first           actions=output:5
1559 priority=50 tcp ip_frag=later           actions=output:6
1560 ])
1561 AT_CHECK([ovs-ofctl replace-flows br0 flows.txt])
1562
1563 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"
1564 no_flow="$base_flow,frag=no),tcp(src=12345,dst=80)"
1565 first_flow="$base_flow,frag=first),tcp(src=12345,dst=80)"
1566 later_flow="$base_flow,frag=later)"
1567
1568     # mode    no  first  later
1569 for tuple in \
1570     'normal    1     5      6' \
1571     'drop      1  drop   drop' \
1572     'nx-match  1     2      6'
1573 do
1574   set $tuple
1575   mode=$1
1576   no=$2
1577   first=$3
1578   later=$4
1579
1580   AT_CHECK([ovs-ofctl set-frags br0 $mode])
1581   for type in no first later; do
1582     eval flow=\$${type}_flow exp_output=\$$type
1583     printf "\n%s\n" "----$mode $type-----"
1584     AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1585     : > expout
1586     if test $mode = drop && test $type != no; then
1587         echo 'Packets dropped because they are IP fragments and the fragment handling mode is "drop".' >> expout
1588     fi
1589     echo "Datapath actions: $exp_output" >> expout
1590     AT_CHECK([grep 'IP fragments' stdout; tail -1 stdout], [0], [expout])
1591   done
1592 done
1593 OVS_VSWITCHD_STOP
1594 AT_CLEANUP
1595
1596 AT_SETUP([ofproto-dpif - exit])
1597 OVS_VSWITCHD_START
1598 ADD_OF_PORTS([br0], [1], [2], [3], [10], [11], [12], [13], [14])
1599 AT_DATA([flows.txt], [dnl
1600 in_port=1 actions=output:10,exit,output:11
1601 in_port=2 actions=output:12,resubmit:1,output:12
1602 in_port=3 actions=output:13,resubmit:2,output:14
1603 ])
1604 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1605 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])
1606 AT_CHECK([tail -1 stdout], [0],
1607   [Datapath actions: 10
1608 ])
1609 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])
1610 AT_CHECK([tail -1 stdout], [0],
1611   [Datapath actions: 12,10
1612 ])
1613 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])
1614 AT_CHECK([tail -1 stdout], [0],
1615   [Datapath actions: 13,12,10
1616 ])
1617 OVS_VSWITCHD_STOP
1618 AT_CLEANUP
1619
1620
1621 AT_SETUP([ofproto-dpif - mirroring, select_all])
1622 OVS_VSWITCHD_START
1623 ADD_OF_PORTS([br0], 1, 2, 3)
1624 ovs-vsctl \
1625         set Bridge br0 mirrors=@m --\
1626         --id=@p3 get Port p3 --\
1627         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
1628
1629 AT_DATA([flows.txt], [dnl
1630 in_port=1 actions=output:2
1631 in_port=2 actions=output:1
1632 ])
1633 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1634
1635 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)"
1636 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1637 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1638   [Datapath actions: 2,3
1639 ])
1640
1641 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)"
1642 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1643 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1644   [Datapath actions: 1,3
1645 ])
1646
1647 OVS_VSWITCHD_STOP
1648 AT_CLEANUP
1649
1650
1651 AT_SETUP([ofproto-dpif - mirroring, select_src])
1652 OVS_VSWITCHD_START
1653 ADD_OF_PORTS([br0], 1, 2, 3)
1654 ovs-vsctl \
1655         set Bridge br0 mirrors=@m --\
1656         --id=@p1 get Port p1 -- --id=@p3 get Port p3 --\
1657         --id=@m create Mirror name=mymirror select_src_port=@p1 output_port=@p3
1658
1659 AT_DATA([flows.txt], [dnl
1660 in_port=1 actions=output:2
1661 in_port=2 actions=output:1
1662 ])
1663 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1664
1665 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)"
1666 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1667 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1668   [Datapath actions: 2,3
1669 ])
1670
1671 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)"
1672 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1673 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1674   [Datapath actions: 1
1675 ])
1676 OVS_VSWITCHD_STOP
1677 AT_CLEANUP
1678
1679 AT_SETUP([ofproto-dpif - mirroring, OFPP_NONE ingress port])
1680 OVS_VSWITCHD_START
1681 ADD_OF_PORTS([br0], 1, 2)
1682 ovs-vsctl \
1683         set Bridge br0 mirrors=@m --\
1684         --id=@p2 get Port p2 --\
1685         --id=@m create Mirror name=mymirror select_all=true output_port=@p2
1686
1687 AT_CHECK([ovs-ofctl add-flow br0 action=output:1])
1688
1689 # "in_port" defaults to OFPP_NONE if it's not specified.
1690 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"
1691 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
1692 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1693   [Datapath actions: 1,2
1694 ])
1695
1696 OVS_VSWITCHD_STOP
1697 AT_CLEANUP
1698
1699
1700 AT_SETUP([ofproto-dpif - mirroring, select_dst])
1701 OVS_VSWITCHD_START
1702 ADD_OF_PORTS([br0], 1, 2, 3)
1703 ovs-vsctl \
1704         set Bridge br0 mirrors=@m --\
1705         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
1706         --id=@m create Mirror name=mymirror select_dst_port=@p2 output_port=@p3
1707
1708 AT_DATA([flows.txt], [dnl
1709 in_port=1 actions=output:2
1710 in_port=2 actions=output:1
1711 ])
1712 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1713
1714 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)"
1715 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1716 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1717   [Datapath actions: 2,3
1718 ])
1719
1720 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)"
1721 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1722 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1723   [Datapath actions: 1
1724 ])
1725
1726 OVS_VSWITCHD_STOP
1727 AT_CLEANUP
1728
1729
1730 AT_SETUP([ofproto-dpif - mirroring, select_vlan])
1731 OVS_VSWITCHD_START
1732 ADD_OF_PORTS([br0], 1, 2, 3)
1733 ovs-vsctl \
1734         set Bridge br0 mirrors=@m --\
1735         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
1736         --id=@m create Mirror name=mymirror select_all=true select_vlan=11 output_port=@p3
1737
1738 AT_DATA([flows.txt], [dnl
1739 in_port=1, actions=output:2
1740 ])
1741 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1742
1743 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)"
1744 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1745 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1746   [Datapath actions: 2
1747 ])
1748
1749 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))"
1750 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1751 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1752   [Datapath actions: 2
1753 ])
1754
1755 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))"
1756 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1757 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1758   [Datapath actions: 2,3
1759 ])
1760
1761 OVS_VSWITCHD_STOP
1762 AT_CLEANUP
1763
1764
1765 AT_SETUP([ofproto-dpif - mirroring, output_port])
1766 OVS_VSWITCHD_START
1767 ADD_OF_PORTS([br0], 1, 2, 3)
1768 ovs-vsctl \
1769         set Bridge br0 mirrors=@m --\
1770         --id=@p3 get Port p3 --\
1771         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
1772
1773 AT_DATA([flows.txt], [dnl
1774 in_port=1 actions=mod_vlan_vid:17,output:2
1775 in_port=2 actions=output:1
1776 ])
1777 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1778
1779 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)"
1780 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1781 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1782   [Datapath actions: push_vlan(vid=17,pcp=0),2,pop_vlan,3
1783 ])
1784
1785 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)"
1786 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1787 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1788   [Datapath actions: 1,3
1789 ])
1790
1791 OVS_VSWITCHD_STOP
1792 AT_CLEANUP
1793
1794 AT_SETUP([ofproto-dpif - mirroring, output_vlan])
1795 OVS_VSWITCHD_START
1796 ADD_OF_PORTS([br0], 1, 2)
1797 ovs-vsctl \
1798         set Bridge br0 mirrors=@m --\
1799         --id=@m create Mirror name=mymirror select_all=true output_vlan=12
1800
1801 AT_DATA([flows.txt], [dnl
1802 in_port=1 actions=output:2
1803 in_port=2 actions=mod_vlan_vid:17,output:1
1804 ])
1805 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1806
1807 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)"
1808 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1809 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1810
1811 expected="2,push_vlan(vid=12,pcp=0),1,2,100"
1812 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
1813 mv stdout expout
1814 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
1815
1816 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)"
1817 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1818 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1819
1820 expected="push_vlan(vid=17,pcp=0),1,pop_vlan,push_vlan(vid=12,pcp=0),1,2,100"
1821 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
1822 mv stdout expout
1823 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
1824
1825 OVS_VSWITCHD_STOP
1826 AT_CLEANUP
1827
1828 # Two testcases below are for the ofproto/trace command
1829 # The first one tests all correct syntax:
1830 # ofproto/trace [dp_name] odp_flow [-generate|packet]
1831 # ofproto/trace br_name br_flow [-generate|packet]
1832 AT_SETUP([ofproto-dpif - ofproto/trace command 1])
1833 OVS_VSWITCHD_START([set bridge br0 fail-mode=standalone])
1834 ADD_OF_PORTS([br0], 1, 2, 3)
1835
1836 AT_DATA([flows.txt], [dnl
1837 in_port=1 actions=output:2
1838 in_port=2 actions=output:1
1839 ])
1840 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1841
1842 odp_flow="in_port(p1)"
1843 br_flow="in_port=1"
1844 # Test command: ofproto/trace odp_flow with in_port as a name.
1845 AT_CHECK([ovs-appctl ofproto/trace "$odp_flow"], [0], [stdout])
1846 AT_CHECK([tail -1 stdout], [0], [dnl
1847 Datapath actions: 2
1848 ])
1849
1850 odp_flow="in_port(1)"
1851 # Test command: ofproto/trace odp_flow
1852 AT_CHECK([ovs-appctl ofproto/trace "$odp_flow"], [0], [stdout])
1853 AT_CHECK([tail -1 stdout], [0], [dnl
1854 Datapath actions: 2
1855 ])
1856
1857 # Test command: ofproto/trace dp_name odp_flow
1858 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$odp_flow"], [0], [stdout])
1859 AT_CHECK([tail -1 stdout], [0], [dnl
1860 Datapath actions: 2
1861 ])
1862 # Test commmand: ofproto/trace br_name br_flow
1863 AT_CHECK([ovs-appctl ofproto/trace br0 "$br_flow"], [0], [stdout])
1864 AT_CHECK([tail -1 stdout], [0], [dnl
1865 Datapath actions: 2
1866 ])
1867
1868 # Delete the inserted flows
1869 AT_CHECK([ovs-ofctl del-flows br0 "in_port=1"], [0], [stdout])
1870 AT_CHECK([ovs-ofctl del-flows br0 "in_port=2"], [0], [stdout])
1871
1872 # This section beflow tests the [-generate] option
1873 odp_flow="in_port(3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff)"
1874 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"
1875
1876 # Test command: ofproto/trace odp_flow
1877 AT_CHECK([ovs-appctl ofproto/trace "$odp_flow"], [0], [stdout])
1878 # Check for no MAC learning entry
1879 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1880  port  VLAN  MAC                Age
1881 ])
1882
1883 # Test command: ofproto/trace br_name br_flow
1884 AT_CHECK([ovs-appctl ofproto/trace br0 "$br_flow"], [0], [stdout])
1885 # Check for no MAC learning entry
1886 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1887  port  VLAN  MAC                Age
1888 ])
1889
1890 # Test command: ofproto/trace odp_flow -generate
1891 AT_CHECK([ovs-appctl ofproto/trace "$odp_flow" -generate], [0], [stdout])
1892 # Check for the MAC learning entry
1893 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1894  port  VLAN  MAC                Age
1895     3     0  50:54:00:00:00:05    ?
1896 ])
1897
1898 # Test command: ofproto/trace dp_name odp_flow -generate
1899 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy \
1900   "in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05)" \
1901   -generate], [0], [stdout])
1902 # Check for both MAC learning entries
1903 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1904  port  VLAN  MAC                Age
1905     3     0  50:54:00:00:00:05    ?
1906     1     0  50:54:00:00:00:06    ?
1907 ])
1908
1909 # Test command: ofproto/trace br_name br_flow -generate
1910 AT_CHECK([ovs-appctl ofproto/trace br0 \
1911   "in_port=2,dl_src=50:54:00:00:00:07,dl_dst=50:54:00:00:00:06" \
1912   -generate], [0], [stdout])
1913 # Check for both MAC learning entries.
1914 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1915  port  VLAN  MAC                Age
1916     3     0  50:54:00:00:00:05    ?
1917     1     0  50:54:00:00:00:06    ?
1918     2     0  50:54:00:00:00:07    ?
1919 ])
1920
1921 # This section beflow tests the [packet] option
1922 # The ovs-tcpundump of packets between port1 and port2
1923 pkt1to2="50540000000250540000000108064500001C000100004001F98CC0A80001C0A800020800F7FF00000000"
1924 pkt2to1="50540000000150540000000208064500001C000100004001F98CC0A80002C0A800010800F7FF00000000"
1925
1926 # Construct the MAC learning table
1927 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy \
1928   "in_port(1),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff)" \
1929   -generate], [0], [stdout])
1930
1931 # Construct the MAC learning table
1932 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy \
1933   "in_port(2),eth(src=50:54:00:00:00:02,dst=ff:ff:ff:ff:ff:ff)" \
1934   -generate], [0], [stdout])
1935
1936 # Test command: ofproto/trace odp_flow packet
1937 AT_CHECK([ovs-appctl ofproto/trace \
1938   "in_port(1),skb_priority(1),skb_mark(2)" "$pkt1to2"], [0], [stdout])
1939 AT_CHECK([tail -1 stdout], [0], [dnl
1940 Datapath actions: 2
1941 ])
1942 AT_CHECK([head -n 2 stdout], [0], [dnl
1943 Bridge: br0
1944 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
1945 ])
1946
1947 # Test command: ofproto/trace dp_name odp_flow packet
1948 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy \
1949   "in_port(1),skb_priority(1),skb_mark(2)" "$pkt1to2"], [0], [stdout])
1950 AT_CHECK([tail -1 stdout], [0], [dnl
1951 Datapath actions: 2
1952 ])
1953 AT_CHECK([head -n 2 stdout], [0], [dnl
1954 Bridge: br0
1955 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
1956 ])
1957
1958 # Test command: ofproto/trace br_name br_flow packet
1959 AT_CHECK([ovs-appctl ofproto/trace br0 \
1960   "in_port=2,skb_priority=2,pkt_mark=1" "$pkt2to1"], [0], [stdout],[stderr])
1961 AT_CHECK([tail -1 stdout], [0], [dnl
1962 Datapath actions: 1
1963 ])
1964 AT_CHECK([head -n 2 stdout], [0], [dnl
1965 Bridge: br0
1966 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
1967 ])
1968
1969 OVS_VSWITCHD_STOP
1970 AT_CLEANUP
1971
1972 # The second test tests the corner cases
1973 AT_SETUP([ofproto-dpif - ofproto/trace command 2])
1974 OVS_VSWITCHD_START
1975 ADD_OF_PORTS([br0], 1, 2)
1976
1977 # Define flows
1978 odp_flow="in_port(1),eth(src=50:54:00:00:00:01,dst=50:54:00:00:00:02)"
1979 br_flow="in_port=1,dl_src=50:54:00:00:00:01,dl_dst=50:54:00:00:00:02"
1980 # Define options
1981 generate="-generate"
1982 pkt="50540000000250540000000108064500001C000100004001F98CC0A80001C0A800020800F7FF00000000"
1983
1984 # Test incorrect command: ofproto/trace wrong_name odp_flow [-generate|packet]
1985 m4_foreach(
1986 [option],
1987 [[],
1988 ["$generate"],
1989 ["$pkt"]],
1990 [AT_CHECK([ovs-appctl ofproto/trace wrong_name "$odp_flow" option],
1991   [2], [], [stderr])
1992 AT_CHECK([tail -2 stderr], [0], [dnl
1993 Cannot find the datapath
1994 ovs-appctl: ovs-vswitchd: server returned an error
1995 ])])
1996
1997 # Test incorrect command: ofproto/trace empty_string odp_flow [-generate|packet]
1998 m4_foreach(
1999 [option],
2000 [[],
2001 ["$generate"],
2002 ["$pkt"]],
2003 [AT_CHECK([ovs-appctl ofproto/trace "" "$odp_flow" option],
2004   [2], [], [stderr])
2005 AT_CHECK([tail -2 stderr], [0], [dnl
2006 Cannot find the datapath
2007 ovs-appctl: ovs-vswitchd: server returned an error
2008 ])])
2009
2010 # Test incorrect command: ofproto/trace nonexist_dp_name odp_flow [-generate|packet]
2011 m4_foreach(
2012 [option],
2013 [[],
2014 ["$generate"],
2015 ["$pkt"]],
2016 [AT_CHECK([ovs-appctl ofproto/trace ovs-system "$odp_flow" option],
2017   [2], [], [stderr])
2018 AT_CHECK([tail -2 stderr], [0], [dnl
2019 Cannot find the datapath
2020 ovs-appctl: ovs-vswitchd: server returned an error
2021 ])])
2022
2023 # Test incorrect command: ofproto/trace br_name odp_flow [-generate|packet]
2024 m4_foreach(
2025 [option],
2026 [[],
2027 ["$generate"],
2028 ["$pkt"]],
2029 [AT_CHECK([ovs-appctl ofproto/trace br0 "$odp_flow" option],
2030   [2], [], [stderr])
2031 AT_CHECK([tail -2 stderr], [0], [dnl
2032 Cannot find the datapath
2033 ovs-appctl: ovs-vswitchd: server returned an error
2034 ])])
2035
2036 # Test incorrect command: ofproto/trace dp_name br_flow [-generate|packet]
2037 m4_foreach(
2038 [option],
2039 [[],
2040 ["$generate"],
2041 ["$pkt"]],
2042 [AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$br_flow" option],
2043   [2], [], [stderr])
2044 AT_CHECK([tail -2 stderr], [0], [dnl
2045 Unknown bridge name
2046 ovs-appctl: ovs-vswitchd: server returned an error
2047 ])])
2048
2049 # Test incorrect command: ofproto/trace br_flow [-generate|packet]
2050 m4_foreach(
2051 [option],
2052 [[],
2053 ["$generate"],
2054 ["$pkt"]],
2055 [AT_CHECK([ovs-appctl ofproto/trace "$br_flow" option],
2056   [2], [], [stderr])
2057 AT_CHECK([tail -2 stderr], [0], [dnl
2058 Must specify bridge name
2059 ovs-appctl: ovs-vswitchd: server returned an error
2060 ])])
2061
2062 # Test incorrect command: ofproto/trace dp_name odp_flow garbage_option
2063 AT_CHECK([ovs-appctl ofproto/trace \
2064   ovs-dummy "$odp_flow" garbage_option],
2065   [2], [stdout],[stderr])
2066 AT_CHECK([tail -2 stderr], [0], [dnl
2067 Trailing garbage in packet data
2068 ovs-appctl: ovs-vswitchd: server returned an error
2069 ])
2070
2071 # Test incorrect command: ofproto/trace with 4 arguments
2072 AT_CHECK([ovs-appctl ofproto/trace \
2073   arg1, arg2, arg3, arg4], [2], [stdout],[stderr])
2074 AT_CHECK([tail -2 stderr], [0], [dnl
2075 "ofproto/trace" command takes at most 3 arguments
2076 ovs-appctl: ovs-vswitchd: server returned an error
2077 ])
2078
2079 # Test incorrect command: ofproto/trace with 0 argument
2080 AT_CHECK([ovs-appctl ofproto/trace ], [2], [stdout],[stderr])
2081 AT_CHECK([tail -2 stderr], [0], [dnl
2082 "ofproto/trace" command requires at least 1 arguments
2083 ovs-appctl: ovs-vswitchd: server returned an error
2084 ])
2085
2086 OVS_VSWITCHD_STOP
2087 AT_CLEANUP
2088
2089 AT_SETUP([ofproto-dpif - ofproto/trace-packet-out])
2090 OVS_VSWITCHD_START
2091 ADD_OF_PORTS([br0], 1, 2, 3)
2092
2093 AT_DATA([flows.txt], [dnl
2094 in_port=1 actions=output:2
2095 in_port=2 actions=output:1
2096 ])
2097 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2098
2099 AT_CHECK([ovs-appctl ofproto/trace-packet-out br0 in_port=1 'mod_vlan_vid:123,resubmit(,0)'], [0], [stdout])
2100 AT_CHECK([tail -1 stdout], [0], [dnl
2101 Datapath actions: push_vlan(vid=123,pcp=0),2
2102 ])
2103
2104 OVS_VSWITCHD_STOP
2105 AT_CLEANUP
2106
2107
2108 m4_define([OFPROTO_TRACE],
2109   [flow="$2"
2110    AT_CHECK([ovs-appctl ofproto/trace $1 "$flow" $3], [0], [stdout])
2111    actual=`tail -1 stdout | sed 's/Datapath actions: //'`
2112    expected="$4"
2113    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" $5],
2114      [0], [stdout])
2115    mv stdout expout
2116    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" $5],
2117      [0], [expout])])
2118
2119 AT_SETUP([ofproto-dpif - MAC learning])
2120 OVS_VSWITCHD_START([set bridge br0 fail-mode=standalone])
2121 ADD_OF_PORTS([br0], 1, 2, 3)
2122
2123 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)'
2124
2125 # Trace an ARP packet arriving on p3, to create a MAC learning entry.
2126 OFPROTO_TRACE(
2127   [ovs-dummy],
2128   [in_port(3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
2129   [-generate],
2130   [1,2,100])
2131
2132 # Check for the MAC learning entry.
2133 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
2134  port  VLAN  MAC                Age
2135     3     0  50:54:00:00:00:05    ?
2136 ])
2137
2138 # Trace a packet arrival destined for the learned MAC.
2139 # (This will also learn a MAC.)
2140 OFPROTO_TRACE(
2141   [ovs-dummy],
2142   [in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05),$arp],
2143   [-generate],
2144   [3])
2145
2146 # Check for both MAC learning entries.
2147 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
2148  port  VLAN  MAC                Age
2149     3     0  50:54:00:00:00:05    ?
2150     1     0  50:54:00:00:00:06    ?
2151 ])
2152
2153 # Trace a packet arrival that updates the first learned MAC entry.
2154 OFPROTO_TRACE(
2155   [ovs-dummy],
2156   [in_port(2),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
2157   [-generate],
2158   [1,3,100])
2159
2160 # Check that the MAC learning entry was updated.
2161 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
2162  port  VLAN  MAC                Age
2163     1     0  50:54:00:00:00:06    ?
2164     2     0  50:54:00:00:00:05    ?
2165 ])
2166
2167 # Add another bridge.
2168 AT_CHECK(
2169   [ovs-vsctl \
2170      -- add-br br1 \
2171      -- set bridge br1 datapath-type=dummy])
2172 ADD_OF_PORTS([br1], 4, 5)
2173
2174 # Trace some packet arrivals in br1 to create MAC learning entries there too.
2175 OFPROTO_TRACE(
2176   [ovs-dummy],
2177   [in_port(4),eth(src=50:54:00:00:00:06,dst=ff:ff:ff:ff:ff:ff),$arp],
2178   [-generate],
2179   [5,101])
2180 OFPROTO_TRACE(
2181   [ovs-dummy],
2182   [in_port(5),eth(src=50:54:00:00:00:07,dst=ff:ff:ff:ff:ff:ff),$arp],
2183   [-generate],
2184   [4,101])
2185
2186 # Check that the MAC learning entries were added.
2187 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
2188  port  VLAN  MAC                Age
2189     4     0  50:54:00:00:00:06    ?
2190     5     0  50:54:00:00:00:07    ?
2191 ])
2192
2193 # Delete port p1 and see that its MAC learning entry disappeared, and
2194 # that the MAC learning entry for the same MAC was also deleted from br1.
2195 AT_CHECK([ovs-vsctl del-port p1])
2196 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
2197  port  VLAN  MAC                Age
2198     2     0  50:54:00:00:00:05    ?
2199 ])
2200 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
2201  port  VLAN  MAC                Age
2202     5     0  50:54:00:00:00:07    ?
2203 ])
2204
2205 OVS_VSWITCHD_STOP
2206 AT_CLEANUP
2207
2208 AT_SETUP([ofproto-dpif - MAC table overflow])
2209 OVS_VSWITCHD_START(
2210   [set bridge br0 fail-mode=standalone other-config:mac-table-size=10])
2211 ADD_OF_PORTS([br0], 1, 2, 3)
2212
2213 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)'
2214
2215 AT_CHECK([ovs-appctl time/stop])
2216
2217 # Trace 10 ARP packets arriving on p3, to create MAC learning entries.
2218 for i in 0 1 2 3 4 5 6 7 8 9; do
2219     OFPROTO_TRACE(
2220       [ovs-dummy],
2221       [in_port(3),eth(src=50:54:00:00:00:0$i,dst=ff:ff:ff:ff:ff:ff),$arp],
2222       [-generate],
2223       [1,2,100])
2224     ovs-appctl time/warp 1000
2225 done
2226
2227 # Check for the MAC learning entries.
2228 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/ *[[0-9]]\{1,\}$//' | sort],
2229   [0], [dnl
2230     3     0  50:54:00:00:00:00
2231     3     0  50:54:00:00:00:01
2232     3     0  50:54:00:00:00:02
2233     3     0  50:54:00:00:00:03
2234     3     0  50:54:00:00:00:04
2235     3     0  50:54:00:00:00:05
2236     3     0  50:54:00:00:00:06
2237     3     0  50:54:00:00:00:07
2238     3     0  50:54:00:00:00:08
2239     3     0  50:54:00:00:00:09
2240  port  VLAN  MAC                Age
2241 ])
2242
2243 # Trace another ARP packet on another MAC.
2244 OFPROTO_TRACE(
2245   [ovs-dummy],
2246   [in_port(3),eth(src=50:54:00:00:00:10,dst=ff:ff:ff:ff:ff:ff),$arp],
2247   [-generate],
2248   [1,2,100])
2249
2250 # Check that the new one chased the oldest one out of the table.
2251 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/' | sort],
2252   [0], [dnl
2253     3     0  50:54:00:00:00:01    ?
2254     3     0  50:54:00:00:00:02    ?
2255     3     0  50:54:00:00:00:03    ?
2256     3     0  50:54:00:00:00:04    ?
2257     3     0  50:54:00:00:00:05    ?
2258     3     0  50:54:00:00:00:06    ?
2259     3     0  50:54:00:00:00:07    ?
2260     3     0  50:54:00:00:00:08    ?
2261     3     0  50:54:00:00:00:09    ?
2262     3     0  50:54:00:00:00:10    ?
2263  port  VLAN  MAC                Age
2264 ])
2265 OVS_VSWITCHD_STOP
2266 AT_CLEANUP
2267
2268 # CHECK_SFLOW_SAMPLING_PACKET(LOOPBACK_ADDR, ADDR_WITHOUT_BRACKETS)
2269 #
2270 # Test that sFlow samples packets correctly using IPv4/IPv6 sFlow collector
2271 #
2272 # IP_VERSION_TYPE is used in AT_SETUP
2273 m4_define([CHECK_SFLOW_SAMPLING_PACKET],
2274   [AT_SETUP([ofproto-dpif - sFlow packet sampling - $2 collector])
2275   OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
2276
2277   ON_EXIT([kill `cat test-sflow.pid`])
2278   AT_CHECK([test-sflow --log-file --detach --no-chdir --pidfile 0:$1 > sflow.log], [0], [], [ignore])
2279   AT_CAPTURE_FILE([sflow.log])
2280   SFLOW_PORT=`parse_listening_port < test-sflow.log`
2281   ovs-appctl time/stop
2282
2283   ADD_OF_PORTS([br0], 1, 2)
2284   ovs-vsctl \
2285      set Interface br0 options:ifindex=1002 -- \
2286      set Interface p1 options:ifindex=1004 -- \
2287      set Interface p2 options:ifindex=1003 -- \
2288      set Bridge br0 sflow=@sf -- \
2289      --id=@sf create sflow targets=\"$1:$SFLOW_PORT\" \
2290        header=128 sampling=1 polling=1 agent=lo
2291
2292   dnl open with ARP packets to seed the bridge-learning.  The output
2293   dnl ifIndex numbers should be reported predictably after that.
2294   dnl Since we set sampling=1 we should see all of these packets
2295   dnl reported. Sorting the output by data-source and seqNo makes
2296   dnl it deterministic. Ensuring that we send at least two packets
2297   dnl into each port means we get to check the seq nos are
2298   dnl incrementing correctly.
2299   dnl because packets from different ports can be handled by separate
2300   dnl threads, put some sleeps
2301
2302   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)'
2303   sleep 1
2304   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)'
2305   sleep 1
2306   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)'
2307   sleep 1
2308   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)'
2309   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)'
2310
2311   dnl sleep long enough to get more than one counter sample
2312   dnl from each datasource so we can check sequence numbers
2313   for i in `seq 1 30`; do
2314       ovs-appctl time/warp 100
2315   done
2316   OVS_VSWITCHD_STOP
2317   ovs-appctl -t test-sflow exit
2318
2319   AT_CHECK_UNQUOTED([[sort sflow.log | $EGREP 'HEADER|ERROR' | sed 's/ /\
2320         /g']], [0], [dnl
2321 HEADER
2322         dgramSeqNo=1
2323         ds=127.0.0.1>2:1000
2324         fsSeqNo=1
2325         in_vlan=0
2326         in_priority=0
2327         out_vlan=0
2328         out_priority=0
2329         meanSkip=1
2330         samplePool=1
2331         dropEvents=0
2332         in_ifindex=1004
2333         in_format=0
2334         out_ifindex=2
2335         out_format=2
2336         hdr_prot=1
2337         pkt_len=64
2338         stripped=4
2339         hdr_len=60
2340         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
2341 HEADER
2342         dgramSeqNo=1
2343         ds=127.0.0.1>2:1000
2344         fsSeqNo=2
2345         in_vlan=0
2346         in_priority=0
2347         out_vlan=0
2348         out_priority=0
2349         meanSkip=1
2350         samplePool=2
2351         dropEvents=0
2352         in_ifindex=1003
2353         in_format=0
2354         out_ifindex=2
2355         out_format=2
2356         hdr_prot=1
2357         pkt_len=64
2358         stripped=4
2359         hdr_len=60
2360         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
2361 HEADER
2362         dgramSeqNo=1
2363         ds=127.0.0.1>2:1000
2364         fsSeqNo=3
2365         in_vlan=0
2366         in_priority=0
2367         out_vlan=0
2368         out_priority=0
2369         meanSkip=1
2370         samplePool=3
2371         dropEvents=0
2372         in_ifindex=1004
2373         in_format=0
2374         out_ifindex=1003
2375         out_format=0
2376         hdr_prot=1
2377         pkt_len=64
2378         stripped=4
2379         hdr_len=60
2380         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
2381 HEADER
2382         dgramSeqNo=1
2383         ds=127.0.0.1>2:1000
2384         fsSeqNo=4
2385         in_vlan=0
2386         in_priority=0
2387         out_vlan=0
2388         out_priority=0
2389         meanSkip=1
2390         samplePool=4
2391         dropEvents=0
2392         in_ifindex=1003
2393         in_format=0
2394         out_ifindex=1004
2395         out_format=0
2396         hdr_prot=1
2397         pkt_len=64
2398         stripped=4
2399         hdr_len=60
2400         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
2401 HEADER
2402         dgramSeqNo=1
2403         ds=127.0.0.1>2:1000
2404         fsSeqNo=5
2405         in_vlan=0
2406         in_priority=0
2407         out_vlan=0
2408         out_priority=0
2409         meanSkip=1
2410         samplePool=5
2411         dropEvents=0
2412         in_ifindex=1003
2413         in_format=0
2414         out_ifindex=1004
2415         out_format=0
2416         hdr_prot=1
2417         pkt_len=64
2418         stripped=4
2419         hdr_len=60
2420         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
2421 ])
2422
2423   AT_CHECK_UNQUOTED([[sort sflow.log | $EGREP 'IFCOUNTERS|ERROR' | head -6 | sed 's/ /\
2424         /g']], [0], [dnl
2425 IFCOUNTERS
2426         dgramSeqNo=2
2427         ds=127.0.0.1>0:1002
2428         csSeqNo=1
2429         ifindex=1002
2430         type=6
2431         ifspeed=100000000
2432         direction=0
2433         status=3
2434         in_octets=0
2435         in_unicasts=0
2436         in_multicasts=0
2437         in_broadcasts=4294967295
2438         in_discards=0
2439         in_errors=0
2440         in_unknownprotos=4294967295
2441         out_octets=120
2442         out_unicasts=2
2443         out_multicasts=4294967295
2444         out_broadcasts=4294967295
2445         out_discards=0
2446         out_errors=0
2447         promiscuous=0
2448 IFCOUNTERS
2449         dgramSeqNo=2
2450         ds=127.0.0.1>0:1003
2451         csSeqNo=1
2452         ifindex=1003
2453         type=6
2454         ifspeed=100000000
2455         direction=0
2456         status=0
2457         in_octets=138
2458         in_unicasts=3
2459         in_multicasts=0
2460         in_broadcasts=4294967295
2461         in_discards=0
2462         in_errors=0
2463         in_unknownprotos=4294967295
2464         out_octets=120
2465         out_unicasts=2
2466         out_multicasts=4294967295
2467         out_broadcasts=4294967295
2468         out_discards=0
2469         out_errors=0
2470         promiscuous=0
2471 IFCOUNTERS
2472         dgramSeqNo=2
2473         ds=127.0.0.1>0:1004
2474         csSeqNo=1
2475         ifindex=1004
2476         type=6
2477         ifspeed=100000000
2478         direction=0
2479         status=0
2480         in_octets=84
2481         in_unicasts=2
2482         in_multicasts=0
2483         in_broadcasts=4294967295
2484         in_discards=0
2485         in_errors=0
2486         in_unknownprotos=4294967295
2487         out_octets=180
2488         out_unicasts=3
2489         out_multicasts=4294967295
2490         out_broadcasts=4294967295
2491         out_discards=0
2492         out_errors=0
2493         promiscuous=0
2494 IFCOUNTERS
2495         dgramSeqNo=3
2496         ds=127.0.0.1>0:1002
2497         csSeqNo=2
2498         ifindex=1002
2499         type=6
2500         ifspeed=100000000
2501         direction=0
2502         status=3
2503         in_octets=0
2504         in_unicasts=0
2505         in_multicasts=0
2506         in_broadcasts=4294967295
2507         in_discards=0
2508         in_errors=0
2509         in_unknownprotos=4294967295
2510         out_octets=120
2511         out_unicasts=2
2512         out_multicasts=4294967295
2513         out_broadcasts=4294967295
2514         out_discards=0
2515         out_errors=0
2516         promiscuous=0
2517 IFCOUNTERS
2518         dgramSeqNo=3
2519         ds=127.0.0.1>0:1003
2520         csSeqNo=2
2521         ifindex=1003
2522         type=6
2523         ifspeed=100000000
2524         direction=0
2525         status=0
2526         in_octets=138
2527         in_unicasts=3
2528         in_multicasts=0
2529         in_broadcasts=4294967295
2530         in_discards=0
2531         in_errors=0
2532         in_unknownprotos=4294967295
2533         out_octets=120
2534         out_unicasts=2
2535         out_multicasts=4294967295
2536         out_broadcasts=4294967295
2537         out_discards=0
2538         out_errors=0
2539         promiscuous=0
2540 IFCOUNTERS
2541         dgramSeqNo=3
2542         ds=127.0.0.1>0:1004
2543         csSeqNo=2
2544         ifindex=1004
2545         type=6
2546         ifspeed=100000000
2547         direction=0
2548         status=0
2549         in_octets=84
2550         in_unicasts=2
2551         in_multicasts=0
2552         in_broadcasts=4294967295
2553         in_discards=0
2554         in_errors=0
2555         in_unknownprotos=4294967295
2556         out_octets=180
2557         out_unicasts=3
2558         out_multicasts=4294967295
2559         out_broadcasts=4294967295
2560         out_discards=0
2561         out_errors=0
2562         promiscuous=0
2563 ])
2564   AT_CLEANUP])
2565
2566 CHECK_SFLOW_SAMPLING_PACKET([127.0.0.1], [IPv4])
2567 CHECK_SFLOW_SAMPLING_PACKET([[[::1]]], [IPv6])
2568
2569 # CHECK_NETFLOW_EXPIRATION(LOOPBACK_ADDR, IP_VERSION_TYPE)
2570 #
2571 # Test that basic NetFlow reports flow statistics correctly:
2572 # The initial packet of a flow are correctly accounted.
2573 # Later packets within a flow are correctly accounted.
2574 # Flow actions changing (in this case, due to MAC learning)
2575 # cause a record to be sent.
2576 #
2577 # IP_VERSION_TYPE is used in AT_SETUP
2578 m4_define([CHECK_NETFLOW_EXPIRATION],
2579   [AT_SETUP([ofproto-dpif - NetFlow flow expiration - $2 collector])
2580   OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
2581   ADD_OF_PORTS([br0], 1, 2)
2582
2583   ovs-appctl time/stop
2584   ON_EXIT([kill `cat test-netflow.pid`])
2585   AT_CHECK([test-netflow --log-file --detach --no-chdir --pidfile 0:$1 > netflow.log], [0], [], [ignore])
2586   AT_CAPTURE_FILE([netflow.log])
2587   NETFLOW_PORT=`parse_listening_port < test-netflow.log`
2588
2589   ovs-vsctl \
2590      set Bridge br0 netflow=@nf -- \
2591      --id=@nf create NetFlow targets=\"$1:$NETFLOW_PORT\" \
2592        engine_id=1 engine_type=2 active_timeout=30 add-id-to-interface=false
2593
2594   for delay in 1000 30000; do
2595       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)'
2596       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)'
2597
2598       ovs-appctl time/warp $delay
2599   done
2600
2601   ovs-appctl time/warp 6000
2602   sleep 1
2603   OVS_VSWITCHD_STOP
2604   ovs-appctl -t test-netflow exit
2605
2606   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])
2607
2608   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])
2609
2610   combined=`grep "192.168.0.2 > 192.168.0.1, if 2 > 1, 2 pkts, 120 bytes, ICMP 0:0" netflow.log | wc -l`
2611   separate=`grep "192.168.0.2 > 192.168.0.1, if 2 > 1, 1 pkts, 60 bytes, ICMP 0:0" netflow.log | wc -l`
2612   AT_CHECK([test $separate = 2 || test $combined = 1], [0])
2613
2614   AT_CLEANUP])
2615
2616 CHECK_NETFLOW_EXPIRATION([127.0.0.1], [IPv4])
2617 CHECK_NETFLOW_EXPIRATION([[[::1]]], [IPv6])
2618
2619 # CHECK_NETFLOW_ACTIVE_EXPIRATION(LOOPBACK_ADDR, IP_VERSION_TYPE)
2620 #
2621 # Test that basic NetFlow reports active expirations correctly.
2622 #
2623 # IP_VERSION_TYPE is used in AT_SETUP
2624 m4_define([CHECK_NETFLOW_ACTIVE_EXPIRATION],
2625   [AT_SETUP([ofproto-dpif - NetFlow active expiration - $2 collector])
2626
2627   OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
2628   ADD_OF_PORTS([br0], 1, 2)
2629
2630   ON_EXIT([kill `cat test-netflow.pid`])
2631   AT_CHECK([test-netflow --log-file --detach --no-chdir --pidfile 0:$1 > netflow.log], [0], [], [ignore])
2632   AT_CAPTURE_FILE([netflow.log])
2633   NETFLOW_PORT=`parse_listening_port < test-netflow.log`
2634
2635   ovs-vsctl \
2636      set Bridge br0 netflow=@nf -- \
2637      --id=@nf create NetFlow targets=\"$1:$NETFLOW_PORT\" \
2638        engine_id=1 engine_type=2 active_timeout=10 add-id-to-interface=false
2639
2640   AT_CHECK([ovs-appctl time/stop])
2641   n=1
2642   while test $n -le 60; do
2643       n=`expr $n + 1`
2644
2645       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)'
2646       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)'
2647
2648       ovs-appctl time/warp 1000
2649   done
2650
2651   ovs-appctl time/warp 10000
2652
2653   sleep 1
2654   OVS_VSWITCHD_STOP
2655   ovs-appctl -t test-netflow exit
2656
2657   # Count the number of reported packets:
2658   # - From source to destination before MAC learning kicks in (just one).
2659   # - From source to destination after that.
2660   # - From destination to source.
2661   n_learn=0
2662   n_in=0
2663   n_out=0
2664   n_other=0
2665   n_recs=0
2666   none=0
2667   while read line; do
2668       pkts=`echo "$line" | sed 's/.*, \([[0-9]]*\) pkts,.*/\1/'`
2669       case $pkts in
2670            [[0-9]]*) ;;
2671        *) continue ;;
2672       esac
2673
2674       case $line in
2675           "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 65535, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
2676               counter=n_learn
2677           ;;
2678       "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 2, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
2679           counter=n_in
2680           ;;
2681       "seq "*": 192.168.0.2 > 192.168.0.1, if 2 > 1, "*" pkts, "*" bytes, TCP 80 > 1234, time "*)
2682           counter=n_out
2683           ;;
2684       *)
2685           counter=n_other
2686           ;;
2687       esac
2688       eval $counter=\`expr \$$counter + \$pkts\`
2689       n_recs=`expr $n_recs + 1`
2690   done < netflow.log
2691
2692   # There should be exactly 1 MAC learning packet,
2693   # exactly 59 other packets in that direction,
2694   # and exactly 60 packets in the other direction.
2695   AT_CHECK([echo $n_learn $n_in $n_out $n_other], [0], [1 59 60 0
2696 ])
2697
2698   AT_CLEANUP])
2699
2700 CHECK_NETFLOW_ACTIVE_EXPIRATION([127.0.0.1], [IPv4])
2701 CHECK_NETFLOW_ACTIVE_EXPIRATION([[[::1]]], [IPv6])
2702
2703 AT_SETUP([idle_age and hard_age increase over time])
2704 OVS_VSWITCHD_START
2705
2706 # get_ages DURATION HARD IDLE
2707 #
2708 # Fetch the flow duration, hard age, and idle age into the variables
2709 # whose names are given as arguments.  Rounds DURATION down to the
2710 # nearest integer.  If hard_age doesn't appear in the output, sets
2711 # HARD to "none".  If idle_age doesn't appear in the output, sets IDLE
2712 # to 0.
2713 get_ages () {
2714     AT_CHECK([ovs-ofctl dump-flows br0], [0], [stdout])
2715
2716     duration=`sed -n 's/.*duration=\([[0-9]]*\)\(\.[[0-9]]*\)\{0,1\}s.*/\1/p' stdout`
2717     AT_CHECK([[expr X"$duration" : 'X[0-9][0-9]*$']], [0], [ignore])
2718     AS_VAR_COPY([$1], [duration])
2719
2720     hard=`sed -n 's/.*hard_age=\([[0-9]]*\),.*/\1/p' stdout`
2721     if test X"$hard" = X; then
2722         hard=none
2723     else
2724         AT_CHECK([[expr X"$hard" : 'X[0-9][0-9]*$']], [0], [ignore])
2725     fi
2726     AS_VAR_COPY([$2], [hard])
2727
2728     idle=`sed -n 's/.*idle_age=\([[0-9]]*\),.*/\1/p' stdout`
2729     if test X"$idle" = X; then
2730         idle=0
2731     else
2732         AT_CHECK([[expr X"$idle" : 'X[0-9][0-9]*$']], [0], [ignore])
2733     fi
2734     AS_VAR_COPY([$3], [idle])
2735 }
2736
2737 # Add a flow and get its initial hard and idle age.
2738 AT_CHECK([ovs-ofctl add-flow br0 hard_timeout=199,idle_timeout=188,actions=drop])
2739 get_ages duration1 hard1 idle1
2740
2741 ovs-appctl time/stop
2742 # Warp time forward by 10 seconds, then modify the flow's actions.
2743 ovs-appctl time/warp 10000
2744 get_ages duration2 hard2 idle2
2745 AT_CHECK([ovs-ofctl mod-flows br0 actions=flood])
2746
2747 # Warp time forward by 10 seconds.
2748 ovs-appctl time/warp 10000
2749 get_ages duration3 hard3 idle3
2750
2751 # Warp time forward 10 more seconds, then pass some packets through the flow,
2752 # then warp forward a few more times because idle times are only updated
2753 # occasionally.
2754 ovs-appctl time/warp 10000
2755 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)'
2756 ovs-appctl time/warp 1000
2757 ovs-appctl time/warp 1000
2758 ovs-appctl time/warp 1000
2759 get_ages duration4 hard4 idle4
2760
2761 printf "duration: %4s => %4s => %4s => %4s\n" $duration1 $duration2 $duration3 $duration4
2762 printf "hard_age: %4s => %4s => %4s => %4s\n" $hard1 $hard2 $hard3 $hard4
2763 printf "idle_age: %4s => %4s => %4s => %4s\n" $idle1 $idle2 $idle3 $idle4
2764
2765 # Duration should increase steadily over time.
2766 AT_CHECK([test $duration1 -lt $duration2])
2767 AT_CHECK([test $duration2 -lt $duration3])
2768 AT_CHECK([test $duration3 -lt $duration4])
2769
2770 # Hard age should be "none" initially because it's the same as flow_duration,
2771 # then it should increase.
2772 AT_CHECK([test $hard1 = none])
2773 AT_CHECK([test $hard2 = none])
2774 AT_CHECK([test $hard3 != none])
2775 AT_CHECK([test $hard4 != none])
2776 AT_CHECK([test $hard3 -lt $hard4])
2777
2778 # Idle age should increase from 1 to 2 to 3, then decrease.
2779 AT_CHECK([test $idle1 -lt $idle2])
2780 AT_CHECK([test $idle2 -lt $idle3])
2781 AT_CHECK([test $idle3 -gt $idle4])
2782
2783 # Check some invariant relationships.
2784 AT_CHECK([test $duration1 = $idle1])
2785 AT_CHECK([test $duration2 = $idle2])
2786 AT_CHECK([test $duration3 = $idle3])
2787 AT_CHECK([test $idle3 -gt $hard3])
2788 AT_CHECK([test $idle4 -lt $hard4])
2789 AT_CHECK([test $hard4 -lt $duration4])
2790
2791 OVS_VSWITCHD_STOP
2792 AT_CLEANUP
2793
2794 AT_SETUP([ofproto-dpif - fin_timeout])
2795 OVS_VSWITCHD_START
2796 AT_DATA([flows.txt], [dnl
2797 in_port=1 actions=output:2
2798 in_port=2 actions=mod_vlan_vid:17,output:1
2799 ])
2800 AT_CHECK([ovs-ofctl add-flow br0 'idle_timeout=60,actions=fin_timeout(idle_timeout=5)'])
2801 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
2802 [NXST_FLOW reply:
2803  idle_timeout=60, actions=fin_timeout(idle_timeout=5)
2804 ])
2805
2806 ovs-appctl time/stop
2807 # Check that a TCP SYN packet does not change the timeout.  (Because
2808 # flow stats updates are mainly what implements the fin_timeout
2809 # feature, we warp forward a couple of times to ensure that flow stats
2810 # run before re-checking the flow table.)
2811 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f908004500003c2e2440004006465dac11370dac11370b828b0016751e267b00000000a00216d017360000020405b40402080a2d25085f0000000001030307])
2812 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
2813 warped
2814 ])
2815 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
2816 [NXST_FLOW reply:
2817  n_packets=1, n_bytes=74, idle_timeout=60, actions=fin_timeout(idle_timeout=5)
2818 ])
2819 # Check that a TCP FIN packet does change the timeout.
2820 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f90800451000342e3e40004006463bac11370dac11370b828b0016751e319dfc96399b801100717ae800000101080a2d250a9408579588])
2821 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
2822 warped
2823 ])
2824 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
2825 [NXST_FLOW reply:
2826  n_packets=2, n_bytes=140, idle_timeout=5, actions=fin_timeout(idle_timeout=5)
2827 ])
2828 OVS_VSWITCHD_STOP
2829 AT_CLEANUP
2830
2831 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-dps])
2832 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
2833 ADD_OF_PORTS([br0], [1], [2])
2834 ADD_OF_PORTS([br1], [3])
2835
2836 AT_CHECK([ovs-appctl dpif/dump-dps], [0], [dnl
2837 dummy@br0
2838 dummy@br1
2839 ])
2840 OVS_VSWITCHD_STOP
2841 AT_CLEANUP
2842
2843 AT_SETUP([ofproto-dpif - ovs-appctl dpif/show])
2844 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
2845 ADD_OF_PORTS([br0], [1], [2])
2846 ADD_OF_PORTS([br1], [3])
2847
2848 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
2849 dummy@ovs-dummy: hit:0 missed:0
2850         br0:
2851                 br0 65534/100: (dummy)
2852                 p1 1/1: (dummy)
2853                 p2 2/2: (dummy)
2854         br1:
2855                 br1 65534/101: (dummy)
2856                 p3 3/3: (dummy)
2857 ])
2858 OVS_VSWITCHD_STOP
2859 AT_CLEANUP
2860
2861 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-flows])
2862 OVS_VSWITCHD_START([add-br br1 -- \
2863                     set bridge br1 datapath-type=dummy fail-mode=secure])
2864 ADD_OF_PORTS([br0], [1], [2])
2865 ADD_OF_PORTS([br1], [3])
2866
2867 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)'])
2868 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)'])
2869 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)'])
2870
2871 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
2872 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))
2873 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))
2874 ])
2875
2876 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
2877 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))
2878 ])
2879
2880 AT_CHECK([ovs-appctl dpif/dump-flows -m br0 | sort | STRIP_USED], [0], [dnl
2881 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))
2882 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))
2883 ])
2884
2885 AT_CHECK([ovs-appctl dpif/dump-flows -m br1 | sort | STRIP_USED], [0], [dnl
2886 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))
2887 ])
2888
2889 OVS_VSWITCHD_STOP
2890 AT_CLEANUP
2891
2892 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-flows - MPLS actions that result in a userspace action])
2893 OVS_VSWITCHD_START([dnl
2894    add-port br0 p1 -- set Interface p1 type=dummy
2895 ])
2896 ON_EXIT([kill `cat ovs-ofctl.pid`])
2897
2898 AT_CAPTURE_FILE([ofctl_monitor.log])
2899 AT_DATA([flows.txt], [dnl
2900 dl_src=60:66:66:66:66:00 actions=push_mpls:0x8847,controller
2901 dl_src=60:66:66:66:66:01 actions=pop_mpls:0x8849,controller
2902 ])
2903 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2904
2905 dnl Packet is sent to userspace because a MPLS push or pop action is applied to
2906 dnl a packet with 2 MPLS LSEs but dpif-netdev can't handle any labels.
2907 dnl
2908 dnl The input is a frame with two MPLS labels which tcpdump -vve shows as:
2909 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)
2910 dnl         (label 20, exp 0, [S], ttl 32)
2911 dnl         (tos 0x0, ttl 64, id 0, offset 0, flags [none], proto TCP (6), length 44, bad cksum 3b78 (->f978)!)
2912 dnl     192.168.0.1.80 > 192.168.0.2.0: Flags [none], cksum 0x7744 (correct), seq 42:46, win 10000, length 4
2913
2914 for dl_src in 00 01; do
2915     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"])
2916
2917     AT_CHECK_UNQUOTED([ovs-appctl dpif/dump-flows br0 | grep ":$dl_src/" | STRIP_USED], [0], [dnl
2918 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))
2919 ])
2920 done
2921
2922 OVS_VSWITCHD_STOP
2923 AT_CLEANUP
2924
2925
2926 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-flows - MPLS actions that result in a drop])
2927 OVS_VSWITCHD_START([dnl
2928    add-port br0 p1 -- set Interface p1 type=dummy
2929 ])
2930 ON_EXIT([kill `cat ovs-ofctl.pid`])
2931
2932 AT_CAPTURE_FILE([ofctl_monitor.log])
2933 AT_DATA([flows.txt], [dnl
2934 dl_src=60:66:66:66:66:00 actions=push_mpls:0x8847,controller
2935 dl_src=60:66:66:66:66:01 actions=pop_mpls:0x8849,controller
2936 ])
2937 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2938
2939 dnl Packet is dropped because an MPLS PUSH action is applied to a packet with
2940 dnl 4 MPLS LSEs but ovs-vswtichd can only handle up to 3 MPLS LSEs and thus
2941 dnl can't determine the resulting MPLS label after MPLS push/pop actions.
2942 dnl
2943 dnl The input is a frame with two MPLS headers which tcpdump -vve shows as:
2944 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)
2945 dnl         (label 20, exp 0, ttl 32)
2946 dnl         (label 20, exp 0, ttl 32)
2947 dnl         (label 20, exp 0, [S], ttl 32)
2948 dnl         (tos 0x0, ttl 64, id 0, offset 0, flags [none], proto TCP (6), length 44, bad cksum 3b78 (->f978)!)
2949 dnl     192.168.0.1.80 > 192.168.0.2.0: Flags [none], cksum 0x7744 (correct), seq 42:46, win 10000, length 4
2950
2951 for dl_src in 00 01; do
2952     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"])
2953
2954     AT_CHECK_UNQUOTED([ovs-appctl dpif/dump-flows br0 | grep ":$dl_src/" | STRIP_USED], [0], [dnl
2955 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))
2956 ])
2957 done
2958
2959 OVS_VSWITCHD_STOP
2960 AT_CLEANUP
2961
2962 AT_SETUP([ofproto-dpif - patch ports])
2963 OVS_VSWITCHD_START([add-br br1 \
2964 -- set bridge br1 datapath-type=dummy fail-mode=secure \
2965 -- add-port br1 pbr1 -- set int pbr1 type=patch options:peer=pbr0 \
2966 -- add-port br0 pbr0 -- set int pbr0 type=patch options:peer=pbr1])
2967
2968 ADD_OF_PORTS([br0], [2])
2969 ADD_OF_PORTS([br1], [3])
2970
2971 AT_CHECK([ovs-appctl time/stop])
2972
2973 AT_CHECK([ovs-ofctl add-flow br0 actions=LOCAL,output:1,output:2])
2974 AT_CHECK([ovs-ofctl add-flow br1 actions=LOCAL,output:1,output:3])
2975
2976 for i in $(seq 1 10); do
2977     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)'
2978 done
2979
2980 for i in $(seq 1 5); do
2981     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)'
2982 done
2983
2984 AT_CHECK([ovs-appctl time/warp 500], [0],
2985 [warped
2986 ])
2987
2988 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
2989 dummy@ovs-dummy: hit:13 missed:2
2990         br0:
2991                 br0 65534/100: (dummy)
2992                 p2 2/2: (dummy)
2993                 pbr0 1/none: (patch: peer=pbr1)
2994         br1:
2995                 br1 65534/101: (dummy)
2996                 p3 3/3: (dummy)
2997                 pbr1 1/none: (patch: peer=pbr0)
2998 ])
2999
3000 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_USED], [0], [dnl
3001 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
3002 ]),
3003 AT_CHECK([ovs-appctl dpif/dump-flows br1 | STRIP_USED], [0], [dnl
3004 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
3005 ])
3006
3007 AT_CHECK([ovs-ofctl dump-ports br0 pbr0], [0], [dnl
3008 OFPST_PORT reply (xid=0x4): 1 ports
3009   port  1: rx pkts=5, bytes=300, drop=0, errs=0, frame=0, over=0, crc=0
3010            tx pkts=10, bytes=600, drop=0, errs=0, coll=0
3011 ])
3012
3013 AT_CHECK([ovs-ofctl dump-ports br1 pbr1], [0], [dnl
3014 OFPST_PORT reply (xid=0x4): 1 ports
3015   port  1: rx pkts=10, bytes=600, drop=0, errs=0, frame=0, over=0, crc=0
3016            tx pkts=5, bytes=300, drop=0, errs=0, coll=0
3017 ])
3018
3019 OVS_VSWITCHD_STOP
3020 AT_CLEANUP
3021
3022 AT_SETUP([ofproto-dpif - port duration])
3023 OVS_VSWITCHD_START([set Bridge br0 protocols=OpenFlow13])
3024 ADD_OF_PORTS([br0], 1, 2)
3025
3026 ovs-appctl time/stop
3027 ovs-appctl time/warp 10000
3028
3029 AT_CHECK([ovs-ofctl -O openflow13 dump-ports br0], [0], [stdout])
3030 AT_CHECK([sed -n 's/=[[0-9]][[0-9]]\(\.[[0-9]][[0-9]]*\)\{0,1\}s/=?s/p' stdout], [0],
3031 [dnl
3032            duration=?s
3033            duration=?s
3034            duration=?s
3035 ])
3036 OVS_VSWITCHD_STOP
3037 AT_CLEANUP
3038
3039 dnl ----------------------------------------------------------------------
3040 AT_BANNER([ofproto-dpif -- megaflows])
3041
3042 AT_SETUP([ofproto-dpif megaflow - port classification])
3043 OVS_VSWITCHD_START
3044 ADD_OF_PORTS([br0], [1], [2])
3045 AT_DATA([flows.txt], [dnl
3046 table=0 in_port=1 actions=output(2)
3047 ])
3048 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3049 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)'])
3050 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)'])
3051 sleep 1
3052 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3053 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>
3054 ])
3055 OVS_VSWITCHD_STOP
3056 AT_CLEANUP
3057
3058 AT_SETUP([ofproto-dpif megaflow - L2 classification])
3059 OVS_VSWITCHD_START
3060 ADD_OF_PORTS([br0], [1], [2])
3061 AT_DATA([flows.txt], [dnl
3062 table=0 in_port=1,dl_src=50:54:00:00:00:09 actions=output(2)
3063 ])
3064 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3065 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)'])
3066 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)'])
3067 sleep 1
3068 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3069 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>
3070 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>
3071 ])
3072 OVS_VSWITCHD_STOP
3073 AT_CLEANUP
3074
3075 AT_SETUP([ofproto-dpif megaflow - L3 classification])
3076 OVS_VSWITCHD_START
3077 ADD_OF_PORTS([br0], [1], [2])
3078 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], [])
3079 AT_DATA([flows.txt], [dnl
3080 table=0 in_port=1,icmp,nw_src=10.0.0.4 actions=output(2)
3081 ])
3082 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3083 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)'])
3084 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)'])
3085 sleep 1
3086 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3087 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>
3088 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>
3089 ])
3090 OVS_VSWITCHD_STOP
3091 AT_CLEANUP
3092
3093 AT_SETUP([ofproto-dpif megaflow - IPv6 classification])
3094 OVS_VSWITCHD_START
3095 ADD_OF_PORTS([br0], [1], [2])
3096 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], [])
3097 AT_DATA([flows.txt], [dnl
3098 table=0 in_port=1,ipv6,ipv6_src=2001:db8:3c4d:1:2:3:4:5 actions=output(2)
3099 ])
3100 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3101 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)'])
3102 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)'])
3103 sleep 1
3104 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3105 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>
3106 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>
3107 ])
3108 OVS_VSWITCHD_STOP
3109 AT_CLEANUP
3110
3111 AT_SETUP([ofproto-dpif megaflow - L4 classification])
3112 OVS_VSWITCHD_START
3113 ADD_OF_PORTS([br0], [1], [2])
3114 AT_DATA([flows.txt], [dnl
3115 table=0 in_port=1,icmp,icmp_type=8 actions=output(2)
3116 ])
3117 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3118 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)'])
3119 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)'])
3120 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3121 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>
3122 ])
3123 OVS_VSWITCHD_STOP
3124 AT_CLEANUP
3125
3126 AT_SETUP([ofproto-dpif megaflow - normal])
3127 OVS_VSWITCHD_START
3128 ADD_OF_PORTS([br0], [1], [2])
3129 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
3130 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)'])
3131 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)'])
3132 sleep 1
3133 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3134 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>
3135 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>
3136 ])
3137 OVS_VSWITCHD_STOP
3138 AT_CLEANUP
3139
3140 AT_SETUP([ofproto-dpif megaflow - mpls])
3141 OVS_VSWITCHD_START
3142 ADD_OF_PORTS([br0], [1], [2])
3143 AT_DATA([flows.txt], [dnl
3144 table=0 dl_src=50:54:00:00:00:09 actions=push_mpls:0x8847,2
3145 table=0 dl_src=50:54:00:00:00:0b actions=pop_mpls:0x0800,2
3146 ])
3147 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3148 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)'])
3149 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)'])
3150 sleep 1
3151 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3152 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>
3153 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>
3154 ])
3155 OVS_VSWITCHD_STOP
3156 AT_CLEANUP
3157
3158 # CHECK_MEGAFLOW_NETFLOW(LOOPBACK_ADDR, IP_VERSION_TYPE)
3159 #
3160 # IP_VERSION_TYPE is used in AT_SETUP
3161 m4_define([CHECK_MEGAFLOW_NETFLOW],
3162   [AT_SETUP([ofproto-dpif megaflow - netflow - $2 collector])
3163   OVS_VSWITCHD_START
3164   ADD_OF_PORTS([br0], [1], [2])
3165
3166   dnl NetFlow configuration disables wildcarding relevant fields
3167   ON_EXIT([kill `cat test-netflow.pid`])
3168   AT_CHECK([test-netflow --log-file --detach --no-chdir --pidfile 0:$1 > netflow.log], [0], [], [ignore])
3169   AT_CAPTURE_FILE([netflow.log])
3170   NETFLOW_PORT=`parse_listening_port < test-netflow.log`
3171   ovs-vsctl \
3172      set Bridge br0 netflow=@nf -- \
3173      --id=@nf create NetFlow targets=\"$1:$NETFLOW_PORT\" \
3174        engine_id=1 engine_type=2 active_timeout=30 add-id-to-interface=false
3175
3176   AT_CHECK([ovs-ofctl add-flow br0 action=normal])
3177   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)'])
3178   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)'])
3179   sleep 1
3180   AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3181 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>
3182 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>
3183 ])
3184   OVS_VSWITCHD_STOP
3185   AT_CLEANUP])
3186
3187 CHECK_MEGAFLOW_NETFLOW([127.0.0.1], [IPv4])
3188 CHECK_MEGAFLOW_NETFLOW([[[::1]]], [IPv6])
3189
3190 AT_SETUP([ofproto-dpif megaflow - normal, active-backup bonding])
3191 OVS_VSWITCHD_START(
3192   [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1 -- \
3193    add-bond br0 bond0 p2 p3 bond_mode=active-backup -- \
3194    set interface p2 type=dummy ofport_request=2 -- \
3195    set interface p3 type=dummy ofport_request=3])
3196 AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK
3197 ])
3198
3199 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
3200 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)'])
3201 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)'])
3202 sleep 1
3203 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3204 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>
3205 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>
3206 ])
3207 OVS_VSWITCHD_STOP
3208 AT_CLEANUP
3209
3210 AT_SETUP([ofproto-dpif megaflow - normal, balance-slb bonding])
3211 OVS_VSWITCHD_START(
3212   [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1 -- \
3213    add-bond br0 bond0 p2 p3 bond_mode=balance-slb -- \
3214    set interface p2 type=dummy ofport_request=2 -- \
3215    set interface p3 type=dummy ofport_request=3])
3216 AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK
3217 ])
3218
3219 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
3220 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)'])
3221 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)'])
3222 sleep 1
3223 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3224 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>
3225 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>
3226 ])
3227 OVS_VSWITCHD_STOP
3228 AT_CLEANUP
3229
3230 AT_SETUP([ofproto-dpif megaflow - normal, balance-tcp bonding])
3231 # Create bond0 on br0 with interfaces p0 and p1
3232 #    and bond1 on br1 with interfaces p2 and p3
3233 # with p0 patched to p2 and p1 patched to p3.
3234 OVS_VSWITCHD_START(
3235   [add-bond br0 bond0 p0 p1 bond_mode=balance-tcp lacp=active \
3236                             other-config:lacp-time=fast \
3237                             other-config:bond-rebalance-interval=0 -- \
3238    set interface p0 type=patch options:peer=p2 ofport_request=1 -- \
3239    set interface p1 type=patch options:peer=p3 ofport_request=2 -- \
3240    add-br br1 -- \
3241    set bridge br1 other-config:hwaddr=aa:66:aa:66:00:00 -- \
3242    set bridge br1 datapath-type=dummy other-config:datapath-id=1234 \
3243                   fail-mode=secure -- \
3244    add-bond br1 bond1 p2 p3 bond_mode=balance-tcp lacp=active \
3245                             other-config:lacp-time=fast \
3246                             other-config:bond-rebalance-interval=0 -- \
3247    set interface p2 type=patch options:peer=p0 ofport_request=3 -- \
3248    set interface p3 type=patch options:peer=p1 ofport_request=4 --])
3249
3250 AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK
3251 ])
3252 ADD_OF_PORTS([br0], [7])
3253 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
3254 AT_CHECK([ovs-ofctl add-flow br1 action=normal])
3255 ovs-appctl time/stop
3256 ovs-appctl time/warp 5000
3257 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)'])
3258 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)'])
3259 sleep 1
3260 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3261 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>
3262 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>
3263 ])
3264 OVS_VSWITCHD_STOP
3265 AT_CLEANUP
3266
3267 AT_SETUP([ofproto-dpif megaflow - resubmit port action])
3268 OVS_VSWITCHD_START
3269 ADD_OF_PORTS([br0], [1], [2])
3270 AT_DATA([flows.txt], [dnl
3271 table=0 in_port=1,ip actions=resubmit(90)
3272 table=0 in_port=90,dl_src=50:54:00:00:00:09 actions=output(2)
3273 ])
3274 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3275 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)'])
3276 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)'])
3277 sleep 1
3278 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3279 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>
3280 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>
3281 ])
3282 OVS_VSWITCHD_STOP
3283 AT_CLEANUP
3284
3285 AT_SETUP([ofproto-dpif megaflow - resubmit table action])
3286 OVS_VSWITCHD_START
3287 ADD_OF_PORTS([br0], [1], [2])
3288 AT_DATA([flows.txt], [dnl
3289 table=0 in_port=1,ip actions=resubmit(,1)
3290 table=1 dl_src=50:54:00:00:00:09 actions=output(2)
3291 ])
3292 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3293 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)'])
3294 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=
3295 1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
3296 sleep 1
3297 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3298 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>
3299 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>
3300 ])
3301 OVS_VSWITCHD_STOP
3302 AT_CLEANUP
3303
3304 AT_SETUP([ofproto-dpif megaflow - goto_table action])
3305 OVS_VSWITCHD_START
3306 ADD_OF_PORTS([br0], [1], [2])
3307 AT_DATA([flows.txt], [dnl
3308 table=0 in_port=1,ip actions=goto_table(1)
3309 table=1 dl_src=50:54:00:00:00:09 actions=output(2)
3310 ])
3311 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flows br0 flows.txt])
3312 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)'])
3313 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)'])
3314 sleep 1
3315 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3316 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>
3317 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>
3318 ])
3319 OVS_VSWITCHD_STOP
3320 AT_CLEANUP
3321
3322 AT_SETUP([ofproto-dpif megaflow - mirroring, select_all])
3323 OVS_VSWITCHD_START
3324 ADD_OF_PORTS([br0], [1], [2], [3])
3325 ovs-vsctl \
3326         set Bridge br0 mirrors=@m --\
3327         --id=@p3 get Port p3 --\
3328         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
3329
3330 AT_DATA([flows.txt], [dnl
3331 in_port=1 actions=output:2
3332 ])
3333 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3334 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)'])
3335 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)'])
3336 sleep 1
3337 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3338 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>
3339 ])
3340 OVS_VSWITCHD_STOP
3341 AT_CLEANUP
3342
3343 AT_SETUP([ofproto-dpif megaflow - mirroring, select_vlan])
3344 OVS_VSWITCHD_START
3345 ADD_OF_PORTS([br0], [1], [2], [3])
3346 ovs-vsctl \
3347         set Bridge br0 mirrors=@m --\
3348         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
3349         --id=@m create Mirror name=mymirror select_all=true select_vlan=11 output_port=@p3
3350
3351 AT_DATA([flows.txt], [dnl
3352 in_port=1 actions=output:2
3353 ])
3354 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3355 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))'])
3356 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)'])
3357 sleep 1
3358 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3359 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>
3360 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>
3361 ])
3362 OVS_VSWITCHD_STOP
3363 AT_CLEANUP
3364
3365 AT_SETUP([ofproto-dpif megaflow - move action])
3366 OVS_VSWITCHD_START
3367 ADD_OF_PORTS([br0], [1], [2])
3368 AT_DATA([flows.txt], [dnl
3369 table=0 in_port=1 ip,actions=move:NXM_OF_IP_SRC[[]]->NXM_NX_REG0[[]],resubmit(90)
3370 table=0 in_port=90 ip,actions=move:NXM_NX_REG0[[]]->NXM_NX_REG1[[]],resubmit(91)
3371 table=0 in_port=91 reg0=0x0a000002,actions=output(2)
3372 ])
3373 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3374 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)'])
3375 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)'])
3376 sleep 1
3377 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3378 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>
3379 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>
3380 ])
3381 OVS_VSWITCHD_STOP
3382 AT_CLEANUP
3383
3384 AT_SETUP([ofproto-dpif megaflow - push action])
3385 OVS_VSWITCHD_START
3386 ADD_OF_PORTS([br0], [1], [2])
3387 AT_DATA([flows.txt], [dnl
3388 table=0 in_port=1 ip,actions=push:NXM_OF_IP_SRC[[]],output(2)
3389 ])
3390 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3391 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)'])
3392 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)'])
3393 sleep 1
3394 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3395 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>
3396 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>
3397 ])
3398 OVS_VSWITCHD_STOP
3399 AT_CLEANUP
3400
3401 AT_SETUP([ofproto-dpif megaflow - learning])
3402 OVS_VSWITCHD_START
3403 ADD_OF_PORTS([br0], [1], [2])
3404 AT_DATA([flows.txt], [dnl
3405 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
3406 ])
3407 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3408 ovs-appctl time/stop
3409 # We send each packet twice because the first packet in each flow causes the
3410 # flow table to change and thus revalidations, which (depending on timing)
3411 # can keep a megaflow from being installed.  The revalidations are done by
3412 # the second iteration, allowing the flows to be installed.
3413 for i in 1 2; do
3414     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)'])
3415     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)'])
3416     ovs-appctl time/warp 100
3417 done
3418 sleep 1
3419 dnl The original flow is missing due to a revalidation.
3420 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3421 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>
3422 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>
3423 ])
3424 OVS_VSWITCHD_STOP
3425 AT_CLEANUP
3426
3427 AT_SETUP([ofproto-dpif megaflow - tunnels])
3428 OVS_VSWITCHD_START(
3429   [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1])
3430 AT_CHECK([ovs-vsctl add-port br0 p2 -- set Interface p2 type=gre \
3431      options:remote_ip=1.1.1.1 ofport_request=2 options:key=flow])
3432 AT_CHECK([ovs-vsctl add-port br0 p3 -- set Interface p3 type=dummy \
3433           ofport_request=3])
3434 AT_CHECK([ovs-vsctl add-port br0 p4 -- set Interface p4 type=gre \
3435      options:remote_ip=1.1.1.2 options:tos=inherit options:ttl=inherit \
3436      ofport_request=4 options:key=flow])
3437 AT_DATA([flows.txt], [dnl
3438 in_port=1,actions=output(2)
3439 in_port=3,actions=output(4)
3440 ])
3441 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3442 dnl ECN bits are always copied out, but don't use 0x3 (CE), since that
3443 dnl will cause the packet to be dropped.
3444 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)'])
3445 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)'])
3446 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)'])
3447 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)'])
3448 sleep 1
3449 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3450 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>
3451 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>
3452 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>
3453 ])
3454 OVS_VSWITCHD_STOP
3455 AT_CLEANUP
3456
3457 AT_SETUP([ofproto-dpif megaflow - dec_ttl])
3458 OVS_VSWITCHD_START
3459 ADD_OF_PORTS([br0], [1], [2])
3460 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], [])
3461 AT_DATA([flows.txt], [dnl
3462 table=0 in_port=1,icmp,nw_src=10.0.0.4 actions=dec_ttl,output(2)
3463 ])
3464 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3465 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)'])
3466 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)'])
3467 sleep 1
3468 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3469 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>
3470 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>
3471 ])
3472 OVS_VSWITCHD_STOP
3473 AT_CLEANUP
3474
3475 AT_SETUP([ofproto-dpif megaflow - set dl_dst])
3476 OVS_VSWITCHD_START
3477 ADD_OF_PORTS([br0], [1], [2])
3478 AT_DATA([flows.txt], [dnl
3479 table=0 in_port=1 actions=mod_dl_dst(50:54:00:00:00:0a),output(2)
3480 ])
3481 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3482 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)'])
3483 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)'])
3484 sleep 1
3485 dnl The megaflows do not match the same fields, since the first packet
3486 dnl is essentially a no-op.  (The new destination MAC is the same as the
3487 dnl original.) The ofproto-dpif library un-wildcards the destination MAC
3488 dnl so that a packet that doesn't need its MAC address changed doesn't
3489 dnl hide one that does.  Since the first entry doesn't need to change,
3490 dnl only the destination MAC address is matched (as decided by
3491 dnl ofproto-dpif).  The second entry actually updates the destination
3492 dnl MAC, so both the source and destination MAC addresses are
3493 dnl un-wildcarded, since the ODP commit functions update both the source
3494 dnl and destination MAC addresses.
3495 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_USED], [0], [dnl
3496 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
3497 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
3498 ])
3499 OVS_VSWITCHD_STOP
3500 AT_CLEANUP
3501
3502 AT_SETUP([ofproto-dpif megaflow - disabled])
3503 OVS_VSWITCHD_START
3504 ADD_OF_PORTS([br0], [1], [2])
3505 AT_DATA([flows.txt], [dnl
3506 table=0 in_port=1,ip,nw_dst=10.0.0.1 actions=output(2)
3507 table=0 in_port=1,ip,nw_dst=10.0.0.3 actions=drop
3508 ])
3509 AT_CHECK([ovs-appctl upcall/disable-megaflows], [0], [megaflows disabled
3510 ], [])
3511 AT_CHECK([ovs-appctl vlog/set dpif_netdev:dbg], [0], [], [])
3512 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3513 for i in 1 2 3 4; do
3514     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)'])
3515     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)'])
3516 done
3517 sleep 1
3518 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_USED], [0], [dnl
3519 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
3520 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
3521 ])
3522 OVS_VSWITCHD_STOP
3523 AT_CLEANUP
3524
3525 AT_SETUP([ofproto-dpif - datapath port number change])
3526 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
3527 ADD_OF_PORTS([br0], 1)
3528
3529 # Trace a flow that should output to p1.
3530 AT_CHECK([ovs-appctl ofproto/trace br0 in_port=LOCAL,dl_src=10:20:30:40:50:60],
3531   [0], [stdout])
3532 AT_CHECK([tail -1 stdout], [0], [Datapath actions: 1
3533 ])
3534
3535 # Change p1's port number to 5.
3536 AT_CHECK([ovs-appctl dpif-dummy/change-port-number ovs-dummy p1 5])
3537
3538 # Trace a flow that should output to p1 in its new location.
3539 AT_CHECK([ovs-appctl ofproto/trace br0 in_port=LOCAL,dl_src=10:20:30:40:50:60],
3540   [0], [stdout])
3541 AT_CHECK([tail -1 stdout], [0], [Datapath actions: 5
3542 ])
3543 OVS_VSWITCHD_STOP
3544 AT_CLEANUP
3545
3546 # Tests the bundling with various bfd and cfm configurations.
3547 AT_SETUP([ofproto - bundle with variable bfd/cfm config])
3548 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy -- \
3549                     add-bond br0 br0bond p0 p2 bond-mode=active-backup -- \
3550                     add-bond br1 br1bond p1 p3 bond-mode=active-backup -- \
3551                     set Interface p1 type=patch options:peer=p0 ofport_request=2 -- \
3552                     set Interface p3 type=patch options:peer=p2 ofport_request=4 -- \
3553                     set Interface p0 type=patch options:peer=p1 ofport_request=1 -- \
3554                     set Interface p2 type=patch options:peer=p3 ofport_request=3 -- \
3555                     set Interface p0 bfd:enable=true bfd:min_tx=300 bfd:min_rx=300 -- \
3556                     set Interface p0 cfm_mpid=1 -- \
3557                     set Interface p1 bfd:enable=true bfd:min_tx=500 bfd:min_rx=500])
3558
3559 ovs-appctl time/stop
3560 # advance the clock to stablize everything.
3561 for i in `seq 0 49`; do ovs-appctl time/warp 100; done
3562 # cfm/show should show 'recv' fault.
3563 AT_CHECK([ovs-appctl cfm/show | sed -n '/^.*fault:.*/p'], [0], [dnl
3564         fault: recv
3565 ])
3566 # bfd/show should show 'up'.
3567 AT_CHECK([ovs-appctl bfd/show | sed -n '/^.*Session State:.*/p'], [0], [dnl
3568         Local Session State: up
3569         Remote Session State: up
3570         Local Session State: up
3571         Remote Session State: up
3572 ])
3573 # bond/show should show 'may-enable: true' for all slaves.
3574 AT_CHECK([ovs-appctl bond/show | sed -n '/^.*may_enable:.*/p'], [0], [dnl
3575         may_enable: true
3576         may_enable: true
3577         may_enable: true
3578         may_enable: true
3579 ])
3580
3581 # now disable the bfd on p1.
3582 AT_CHECK([ovs-vsctl set Interface p1 bfd:enable=false])
3583 # advance the clock to stablize everything.
3584 for i in `seq 0 49`; do ovs-appctl time/warp 100; done
3585 # cfm/show should show 'recv' fault.
3586 AT_CHECK([ovs-appctl cfm/show | sed -n '/^.*fault:.*/p'], [0], [dnl
3587         fault: recv
3588 ])
3589 # bfd/show should show 'down'.
3590 AT_CHECK([ovs-appctl bfd/show | sed -n '/^.*Session State:.*/p'], [0], [dnl
3591         Local Session State: down
3592         Remote Session State: down
3593 ])
3594 # bond/show should show 'may-enable: false' for p0.
3595 AT_CHECK([ovs-appctl bond/show br0bond | sed -n '/^.*may_enable:.*/p'], [0], [dnl
3596         may_enable: false
3597         may_enable: true
3598 ])
3599
3600 # now enable the bfd on p1 and disable bfd on p0.
3601 AT_CHECK([ovs-vsctl set Interface p1 bfd:enable=true])
3602 AT_CHECK([ovs-vsctl set Interface p0 bfd:enable=false])
3603 # advance the clock to stablize everything.
3604 for i in `seq 0 49`; do ovs-appctl time/warp 100; done
3605 # cfm/show should show 'recv' fault.
3606 AT_CHECK([ovs-appctl cfm/show | sed -n '/^.*fault:.*/p'], [0], [dnl
3607         fault: recv
3608 ])
3609 # bfd/show should show 'down'.
3610 AT_CHECK([ovs-appctl bfd/show | sed -n '/^.*Session State:.*/p'], [0], [dnl
3611         Local Session State: down
3612         Remote Session State: down
3613 ])
3614 # bond/show should show 'may-enable: false' for p0 and p1.
3615 AT_CHECK([ovs-appctl bond/show | sed -n '/^.*may_enable:.*/p'], [0], [dnl
3616         may_enable: false
3617         may_enable: true
3618         may_enable: false
3619         may_enable: true
3620 ])
3621
3622 OVS_VSWITCHD_STOP
3623 AT_CLEANUP
3624
3625 AT_SETUP([ofproto-dpif - ofproto-dpif-monitor 1])
3626 OVS_VSWITCHD_START([add-port br0 p0 -- set interface p0 type=gre options:remote_ip=1.2.3.4])
3627
3628 # enable bfd on p0.
3629 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=true])
3630 # check log.
3631 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* created\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3632 monitor thread created
3633 ])
3634 # disable bfd on p0.
3635 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=false])
3636 # check log.
3637 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* terminated\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3638 monitor thread terminated
3639 ])
3640 AT_CHECK([cat ovs-vswitchd.log | sed -e '/^.*ofproto_dpif_monitor.*$/d' > ovs-vswitchd.log])
3641
3642 # enable cfm on p0.
3643 AT_CHECK([ovs-vsctl set interface p0 cfm_mpid=10])
3644 # check log.
3645 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* created\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3646 monitor thread created
3647 ])
3648 # disable cfm on p0.
3649 AT_CHECK([ovs-vsctl remove interface p0 cfm_mpid 10])
3650 # check log.
3651 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* terminated\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3652 monitor thread terminated
3653 ])
3654 AT_CHECK([cat ovs-vswitchd.log | sed -e '/^.*ofproto_dpif_monitor.*$/d' > ovs-vswitchd.log])
3655
3656 # enable both bfd and cfm on p0.
3657 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=true cfm_mpid=10])
3658 # check log.
3659 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* created\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3660 monitor thread created
3661 ])
3662 # disable bfd on p0.
3663 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=false])
3664 # check log, there should not be the log of thread terminated.
3665 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* terminated\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3666 ])
3667 # reenable bfd on p0.
3668 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=true])
3669 # check log, should still be on log of thread created.
3670 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* created\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3671 monitor thread created
3672 ])
3673 # disable bfd and cfm together.
3674 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=false -- remove interface p0 cfm_mpid 10])
3675 # check log.
3676 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* terminated\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3677 monitor thread terminated
3678 ])
3679
3680 OVS_VSWITCHD_STOP
3681 AT_CLEANUP
3682
3683 # this test helps avoid the deadlock between the main thread and monitor thread.
3684 AT_SETUP([ofproto-dpif - ofproto-dpif-monitor 2])
3685 OVS_VSWITCHD_START
3686
3687 for i in `seq 1 199`
3688 do
3689     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])
3690 done
3691
3692 OVS_VSWITCHD_STOP
3693 AT_CLEANUP
3694 \f
3695 AT_BANNER([ofproto-dpif - flow translation resource limits])
3696
3697 AT_SETUP([ofproto-dpif - infinite resubmit])
3698 OVS_VSWITCHD_START
3699 AT_CHECK([ovs-ofctl add-flow br0 actions=resubmit:1,resubmit:2,output:3])
3700 AT_CHECK([ovs-appctl ofproto/trace br0 'eth_dst=ff:ff:ff:ff:ff:ff'],
3701   [0], [stdout])
3702 AT_CHECK([tail -1 stdout], [0], [Datapath actions: drop
3703 ])
3704 AT_CHECK([grep -c 'resubmit actions recursed over 64 times' ovs-vswitchd.log],
3705   [0], [1
3706 ])
3707 OVS_VSWITCHD_STOP(["/resubmit actions recursed/d"])
3708 AT_CLEANUP
3709
3710 AT_SETUP([ofproto-dpif - exponential resubmit chain])
3711 OVS_VSWITCHD_START
3712 ADD_OF_PORTS([br0], 1)
3713 (for i in `seq 1 64`; do
3714      j=`expr $i + 1`
3715      echo "in_port=$i, actions=resubmit:$j, resubmit:$j, local"
3716  done
3717  echo "in_port=65, actions=local") > flows
3718  AT_CHECK([ovs-ofctl add-flows br0 flows])
3719 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1'], [0], [stdout])
3720 AT_CHECK([grep -c 'over 4096 resubmit actions' ovs-vswitchd.log], [0], [1
3721 ])
3722 OVS_VSWITCHD_STOP(["/over.*resubmit actions/d"])
3723 AT_CLEANUP
3724
3725 AT_SETUP([ofproto-dpif - too many output actions])
3726 OVS_VSWITCHD_START
3727 ADD_OF_PORTS([br0], 1)
3728 (for i in `seq 1 12`; do
3729      j=`expr $i + 1`
3730      echo "in_port=$i, actions=resubmit:$j, resubmit:$j, local"
3731  done
3732  echo "in_port=13, actions=local,local,local,local,local,local,local,local") > flows
3733 AT_CHECK([ovs-ofctl add-flows br0 flows])
3734 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1'], [0], [stdout])
3735 AT_CHECK([grep -c -e '- Uses action(s) not supported by datapath' stdout],
3736   [0], [1
3737 ])
3738 AT_CHECK([grep -c 'resubmits yielded over 64 kB of actions' ovs-vswitchd.log], [0], [1
3739 ])
3740 OVS_VSWITCHD_STOP(["/resubmits yielded over 64 kB of actions/d"])
3741 AT_CLEANUP
3742
3743 AT_SETUP([ofproto-dpif - stack too deep])
3744 OVS_VSWITCHD_START
3745 ADD_OF_PORTS([br0], 1)
3746 (for i in `seq 1 12`; do
3747      j=`expr $i + 1`
3748      echo "in_port=$i, actions=resubmit:$j, resubmit:$j, local"
3749  done
3750  push="push:NXM_NX_REG0[[]]"
3751  echo "in_port=13, actions=$push,$push,$push,$push,$push,$push,$push,$push") > flows
3752  AT_CHECK([ovs-ofctl add-flows br0 flows])
3753 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1'], [0], [stdout])
3754 AT_CHECK([grep -c 'resubmits yielded over 64 kB of stack' ovs-vswitchd.log], [0], [1
3755 ])
3756 OVS_VSWITCHD_STOP(["/resubmits yielded over 64 kB of stack/d"])
3757 AT_CLEANUP