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