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