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