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