Implement duration fields in OpenFlow 1.3 port stats.
[cascardo/ovs.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     AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
808     AT_CHECK_UNQUOTED([tail -1 stdout], [0], [Datapath actions: $exp_output
809 ])
810   done
811 done
812 OVS_VSWITCHD_STOP
813 AT_CLEANUP
814
815 AT_SETUP([ofproto-dpif - exit])
816 OVS_VSWITCHD_START
817 ADD_OF_PORTS([br0], [1], [2], [3], [10], [11], [12], [13], [14])
818 AT_DATA([flows.txt], [dnl
819 in_port=1 actions=output:10,exit,output:11
820 in_port=2 actions=output:12,resubmit:1,output:12
821 in_port=3 actions=output:13,resubmit:2,output:14
822 ])
823 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
824 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])
825 AT_CHECK([tail -1 stdout], [0],
826   [Datapath actions: 10
827 ])
828 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])
829 AT_CHECK([tail -1 stdout], [0],
830   [Datapath actions: 12,10
831 ])
832 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])
833 AT_CHECK([tail -1 stdout], [0],
834   [Datapath actions: 13,12,10
835 ])
836 OVS_VSWITCHD_STOP
837 AT_CLEANUP
838
839
840 AT_SETUP([ofproto-dpif - mirroring, select_all])
841 OVS_VSWITCHD_START
842 ADD_OF_PORTS([br0], 1, 2, 3)
843 ovs-vsctl \
844         set Bridge br0 mirrors=@m --\
845         --id=@p3 get Port p3 --\
846         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
847
848 AT_DATA([flows.txt], [dnl
849 in_port=1 actions=output:2
850 in_port=2 actions=output:1
851 ])
852 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
853
854 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)"
855 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
856 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
857   [Datapath actions: 2,3
858 ])
859
860 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)"
861 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
862 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
863   [Datapath actions: 1,3
864 ])
865
866 OVS_VSWITCHD_STOP
867 AT_CLEANUP
868
869
870 AT_SETUP([ofproto-dpif - mirroring, select_src])
871 OVS_VSWITCHD_START
872 ADD_OF_PORTS([br0], 1, 2, 3)
873 ovs-vsctl \
874         set Bridge br0 mirrors=@m --\
875         --id=@p1 get Port p1 -- --id=@p3 get Port p3 --\
876         --id=@m create Mirror name=mymirror select_src_port=@p1 output_port=@p3
877
878 AT_DATA([flows.txt], [dnl
879 in_port=1 actions=output:2
880 in_port=2 actions=output:1
881 ])
882 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
883
884 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)"
885 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
886 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
887   [Datapath actions: 2,3
888 ])
889
890 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)"
891 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
892 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
893   [Datapath actions: 1
894 ])
895 OVS_VSWITCHD_STOP
896 AT_CLEANUP
897
898 AT_SETUP([ofproto-dpif - mirroring, OFPP_NONE ingress port])
899 OVS_VSWITCHD_START
900 ADD_OF_PORTS([br0], 1, 2)
901 ovs-vsctl \
902         set Bridge br0 mirrors=@m --\
903         --id=@p2 get Port p2 --\
904         --id=@m create Mirror name=mymirror select_all=true output_port=@p2
905
906 AT_CHECK([ovs-ofctl add-flow br0 action=output:1])
907
908 # "in_port" defaults to OFPP_NONE if it's not specified.
909 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"
910 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
911 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
912   [Datapath actions: 1,2
913 ])
914
915 OVS_VSWITCHD_STOP
916 AT_CLEANUP
917
918
919 AT_SETUP([ofproto-dpif - mirroring, select_dst])
920 OVS_VSWITCHD_START
921 ADD_OF_PORTS([br0], 1, 2, 3)
922 ovs-vsctl \
923         set Bridge br0 mirrors=@m --\
924         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
925         --id=@m create Mirror name=mymirror select_dst_port=@p2 output_port=@p3
926
927 AT_DATA([flows.txt], [dnl
928 in_port=1 actions=output:2
929 in_port=2 actions=output:1
930 ])
931 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
932
933 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)"
934 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
935 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
936   [Datapath actions: 2,3
937 ])
938
939 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)"
940 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
941 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
942   [Datapath actions: 1
943 ])
944
945 OVS_VSWITCHD_STOP
946 AT_CLEANUP
947
948
949 AT_SETUP([ofproto-dpif - mirroring, select_vlan])
950 OVS_VSWITCHD_START
951 ADD_OF_PORTS([br0], 1, 2, 3)
952 ovs-vsctl \
953         set Bridge br0 mirrors=@m --\
954         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
955         --id=@m create Mirror name=mymirror select_all=true select_vlan=11 output_port=@p3
956
957 AT_DATA([flows.txt], [dnl
958 in_port=1, actions=output:2
959 ])
960 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
961
962 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)"
963 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
964 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
965   [Datapath actions: 2
966 ])
967
968 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))"
969 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
970 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
971   [Datapath actions: 2
972 ])
973
974 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))"
975 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
976 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
977   [Datapath actions: 2,3
978 ])
979
980 OVS_VSWITCHD_STOP
981 AT_CLEANUP
982
983
984 AT_SETUP([ofproto-dpif - mirroring, output_port])
985 OVS_VSWITCHD_START
986 ADD_OF_PORTS([br0], 1, 2, 3)
987 ovs-vsctl \
988         set Bridge br0 mirrors=@m --\
989         --id=@p3 get Port p3 --\
990         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
991
992 AT_DATA([flows.txt], [dnl
993 in_port=1 actions=mod_vlan_vid:17,output:2
994 in_port=2 actions=output:1
995 ])
996 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
997
998 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)"
999 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1000 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1001   [Datapath actions: push_vlan(vid=17,pcp=0),2,pop_vlan,3
1002 ])
1003
1004 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)"
1005 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1006 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1007   [Datapath actions: 1,3
1008 ])
1009
1010 OVS_VSWITCHD_STOP
1011 AT_CLEANUP
1012
1013 AT_SETUP([ofproto-dpif - mirroring, output_vlan])
1014 OVS_VSWITCHD_START
1015 ADD_OF_PORTS([br0], 1, 2)
1016 ovs-vsctl \
1017         set Bridge br0 mirrors=@m --\
1018         --id=@m create Mirror name=mymirror select_all=true output_vlan=12
1019
1020 AT_DATA([flows.txt], [dnl
1021 in_port=1 actions=output:2
1022 in_port=2 actions=mod_vlan_vid:17,output:1
1023 ])
1024 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1025
1026 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)"
1027 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1028 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1029
1030 expected="2,push_vlan(vid=12,pcp=0),1,2,100"
1031 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
1032 mv stdout expout
1033 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
1034
1035 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)"
1036 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1037 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1038
1039 expected="push_vlan(vid=17,pcp=0),1,pop_vlan,push_vlan(vid=12,pcp=0),1,2,100"
1040 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
1041 mv stdout expout
1042 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
1043
1044 OVS_VSWITCHD_STOP
1045 AT_CLEANUP
1046
1047 # Two testcases below are for the ofproto/trace command
1048 # The first one tests all correct syntax:
1049 # ofproto/trace [dp_name] odp_flow [-generate|packet]
1050 # ofproto/trace br_name br_flow [-generate|packet]
1051 AT_SETUP([ofproto-dpif - ofproto/trace command 1])
1052 OVS_VSWITCHD_START([set bridge br0 fail-mode=standalone])
1053 ADD_OF_PORTS([br0], 1, 2, 3)
1054
1055 AT_DATA([flows.txt], [dnl
1056 in_port=1 actions=output:2
1057 in_port=2 actions=output:1
1058 ])
1059 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1060
1061 odp_flow="in_port(1)"
1062 br_flow="in_port=1"
1063 # Test command: ofproto/trace odp_flow
1064 AT_CHECK([ovs-appctl ofproto/trace "$odp_flow"], [0], [stdout])
1065 AT_CHECK([tail -1 stdout], [0], [dnl
1066 Datapath actions: 2
1067 ])
1068
1069 # Test command: ofproto/trace dp_name odp_flow
1070 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$odp_flow"], [0], [stdout])
1071 AT_CHECK([tail -1 stdout], [0], [dnl
1072 Datapath actions: 2
1073 ])
1074 # Test commmand: ofproto/trace br_name br_flow
1075 AT_CHECK([ovs-appctl ofproto/trace br0 "$br_flow"], [0], [stdout])
1076 AT_CHECK([tail -1 stdout], [0], [dnl
1077 Datapath actions: 2
1078 ])
1079
1080 # Delete the inserted flows
1081 AT_CHECK([ovs-ofctl del-flows br0 "in_port=1"], [0], [stdout])
1082 AT_CHECK([ovs-ofctl del-flows br0 "in_port=2"], [0], [stdout])
1083
1084 # This section beflow tests the [-generate] option
1085 odp_flow="in_port(3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff)"
1086 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"
1087
1088 # Test command: ofproto/trace odp_flow
1089 AT_CHECK([ovs-appctl ofproto/trace "$odp_flow"], [0], [stdout])
1090 # Check for no MAC learning entry
1091 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1092  port  VLAN  MAC                Age
1093 ])
1094
1095 # Test command: ofproto/trace br_name br_flow
1096 AT_CHECK([ovs-appctl ofproto/trace br0 "$br_flow"], [0], [stdout])
1097 # Check for no MAC learning entry
1098 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1099  port  VLAN  MAC                Age
1100 ])
1101
1102 # Test command: ofproto/trace odp_flow -generate
1103 AT_CHECK([ovs-appctl ofproto/trace "$odp_flow" -generate], [0], [stdout])
1104 # Check for the MAC learning entry
1105 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1106  port  VLAN  MAC                Age
1107     3     0  50:54:00:00:00:05    ?
1108 ])
1109
1110 # Test command: ofproto/trace dp_name odp_flow -generate
1111 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy \
1112   "in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05)" \
1113   -generate], [0], [stdout])
1114 # Check for both MAC learning entries
1115 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1116  port  VLAN  MAC                Age
1117     3     0  50:54:00:00:00:05    ?
1118     1     0  50:54:00:00:00:06    ?
1119 ])
1120
1121 # Test command: ofproto/trace br_name br_flow -generate
1122 AT_CHECK([ovs-appctl ofproto/trace br0 \
1123   "in_port=2,dl_src=50:54:00:00:00:07,dl_dst=50:54:00:00:00:06" \
1124   -generate], [0], [stdout])
1125 # Check for both MAC learning entries.
1126 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1127  port  VLAN  MAC                Age
1128     3     0  50:54:00:00:00:05    ?
1129     1     0  50:54:00:00:00:06    ?
1130     2     0  50:54:00:00:00:07    ?
1131 ])
1132
1133 # This section beflow tests the [packet] option
1134 # The ovs-tcpundump of packets between port1 and port2
1135 pkt1to2="50540000000250540000000108064500001C000100004001F98CC0A80001C0A800020800F7FF00000000"
1136 pkt2to1="50540000000150540000000208064500001C000100004001F98CC0A80002C0A800010800F7FF00000000"
1137
1138 # Construct the MAC learning table
1139 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy \
1140   "in_port(1),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff)" \
1141   -generate], [0], [stdout])
1142
1143 # Construct the MAC learning table
1144 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy \
1145   "in_port(2),eth(src=50:54:00:00:00:02,dst=ff:ff:ff:ff:ff:ff)" \
1146   -generate], [0], [stdout])
1147
1148 # Test command: ofproto/trace odp_flow packet
1149 AT_CHECK([ovs-appctl ofproto/trace \
1150   "in_port(1),skb_priority(1),skb_mark(2)" "$pkt1to2"], [0], [stdout])
1151 AT_CHECK([tail -1 stdout], [0], [dnl
1152 Datapath actions: 2
1153 ])
1154 AT_CHECK([head -n 3 stdout], [0], [dnl
1155 Bridge: br0
1156 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
1157 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
1158 ])
1159
1160 # Test command: ofproto/trace dp_name odp_flow packet
1161 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy \
1162   "in_port(1),skb_priority(1),skb_mark(2)" "$pkt1to2"], [0], [stdout])
1163 AT_CHECK([tail -1 stdout], [0], [dnl
1164 Datapath actions: 2
1165 ])
1166 AT_CHECK([head -n 3 stdout], [0], [dnl
1167 Bridge: br0
1168 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
1169 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
1170 ])
1171
1172 # Test command: ofproto/trace br_name br_flow packet
1173 AT_CHECK([ovs-appctl ofproto/trace br0 \
1174   "in_port=2,skb_priority=2,skb_mark=1" "$pkt2to1"], [0], [stdout],[stderr])
1175 AT_CHECK([tail -1 stdout], [0], [dnl
1176 Datapath actions: set(skb_mark(0)),1
1177 ])
1178 AT_CHECK([head -n 2 stdout], [0], [dnl
1179 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
1180 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
1181 ])
1182
1183 OVS_VSWITCHD_STOP
1184 AT_CLEANUP
1185
1186 # The second test tests the corner cases
1187 AT_SETUP([ofproto-dpif - ofproto/trace command 2])
1188 OVS_VSWITCHD_START
1189 ADD_OF_PORTS([br0], 1, 2)
1190
1191 # Define flows
1192 odp_flow="in_port(1),eth(src=50:54:00:00:00:01,dst=50:54:00:00:00:02)"
1193 br_flow="in_port=1,dl_src=50:54:00:00:00:01,dl_dst=50:54:00:00:00:02"
1194 # Define options
1195 generate="-generate"
1196 pkt="50540000000250540000000108064500001C000100004001F98CC0A80001C0A800020800F7FF00000000"
1197
1198 # Test incorrect command: ofproto/trace wrong_name odp_flow [-generate|packet]
1199 m4_foreach(
1200 [option],
1201 [[],
1202 ["$generate"],
1203 ["$pkt"]],
1204 [AT_CHECK([ovs-appctl ofproto/trace wrong_name "$odp_flow" option],
1205   [2], [], [stderr])
1206 AT_CHECK([tail -2 stderr], [0], [dnl
1207 Cannot find datapath of this name
1208 ovs-appctl: ovs-vswitchd: server returned an error
1209 ])])
1210
1211 # Test incorrect command: ofproto/trace empty_string odp_flow [-generate|packet]
1212 m4_foreach(
1213 [option],
1214 [[],
1215 ["$generate"],
1216 ["$pkt"]],
1217 [AT_CHECK([ovs-appctl ofproto/trace "" "$odp_flow" option],
1218   [2], [], [stderr])
1219 AT_CHECK([tail -2 stderr], [0], [dnl
1220 Cannot find datapath of this name
1221 ovs-appctl: ovs-vswitchd: server returned an error
1222 ])])
1223
1224 # Test incorrect command: ofproto/trace nonexist_dp_name odp_flow [-generate|packet]
1225 m4_foreach(
1226 [option],
1227 [[],
1228 ["$generate"],
1229 ["$pkt"]],
1230 [AT_CHECK([ovs-appctl ofproto/trace ovs-system "$odp_flow" option],
1231   [2], [], [stderr])
1232 AT_CHECK([tail -2 stderr], [0], [dnl
1233 Cannot find datapath of this name
1234 ovs-appctl: ovs-vswitchd: server returned an error
1235 ])])
1236
1237 # Test incorrect command: ofproto/trace br_name odp_flow [-generate|packet]
1238 m4_foreach(
1239 [option],
1240 [[],
1241 ["$generate"],
1242 ["$pkt"]],
1243 [AT_CHECK([ovs-appctl ofproto/trace br0 "$odp_flow" option],
1244   [2], [], [stderr])
1245 AT_CHECK([tail -2 stderr], [0], [dnl
1246 Cannot find datapath of this name
1247 ovs-appctl: ovs-vswitchd: server returned an error
1248 ])])
1249
1250 # Test incorrect command: ofproto/trace dp_name br_flow [-generate|packet]
1251 m4_foreach(
1252 [option],
1253 [[],
1254 ["$generate"],
1255 ["$pkt"]],
1256 [AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$br_flow" option],
1257   [2], [], [stderr])
1258 AT_CHECK([tail -2 stderr], [0], [dnl
1259 Unknown bridge name
1260 ovs-appctl: ovs-vswitchd: server returned an error
1261 ])])
1262
1263 # Test incorrect command: ofproto/trace br_flow [-generate|packet]
1264 m4_foreach(
1265 [option],
1266 [[],
1267 ["$generate"],
1268 ["$pkt"]],
1269 [AT_CHECK([ovs-appctl ofproto/trace "$br_flow" option],
1270   [2], [], [stderr])
1271 AT_CHECK([tail -2 stderr], [0], [dnl
1272 Must specify bridge name
1273 ovs-appctl: ovs-vswitchd: server returned an error
1274 ])])
1275
1276 # Test incorrect command: ofproto/trace dp_name odp_flow garbage_option
1277 AT_CHECK([ovs-appctl ofproto/trace \
1278   ovs-dummy "$odp_flow" garbage_option],
1279   [2], [stdout],[stderr])
1280 AT_CHECK([tail -2 stderr], [0], [dnl
1281 Trailing garbage in packet data
1282 ovs-appctl: ovs-vswitchd: server returned an error
1283 ])
1284
1285 # Test incorrect command: ofproto/trace with 4 arguments
1286 AT_CHECK([ovs-appctl ofproto/trace \
1287   arg1, arg2, arg3, arg4], [2], [stdout],[stderr])
1288 AT_CHECK([tail -2 stderr], [0], [dnl
1289 "ofproto/trace" command takes at most 3 arguments
1290 ovs-appctl: ovs-vswitchd: server returned an error
1291 ])
1292
1293 # Test incorrect command: ofproto/trace with 0 argument
1294 AT_CHECK([ovs-appctl ofproto/trace ], [2], [stdout],[stderr])
1295 AT_CHECK([tail -2 stderr], [0], [dnl
1296 "ofproto/trace" command requires at least 1 arguments
1297 ovs-appctl: ovs-vswitchd: server returned an error
1298 ])
1299
1300 OVS_VSWITCHD_STOP
1301 AT_CLEANUP
1302
1303 m4_define([OFPROTO_TRACE],
1304   [flow="$2"
1305    AT_CHECK([ovs-appctl ofproto/trace $1 "$flow" $3], [0], [stdout])
1306    actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1307    expected="$4"
1308    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" $5],
1309      [0], [stdout])
1310    mv stdout expout
1311    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" $5],
1312      [0], [expout])])
1313
1314 AT_SETUP([ofproto-dpif - MAC learning])
1315 OVS_VSWITCHD_START([set bridge br0 fail-mode=standalone])
1316 ADD_OF_PORTS([br0], 1, 2, 3)
1317
1318 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)'
1319
1320 # Trace an ARP packet arriving on p3, to create a MAC learning entry.
1321 OFPROTO_TRACE(
1322   [ovs-dummy],
1323   [in_port(3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
1324   [-generate],
1325   [1,2,100])
1326
1327 # Check for the MAC learning entry.
1328 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1329  port  VLAN  MAC                Age
1330     3     0  50:54:00:00:00:05    ?
1331 ])
1332
1333 # Trace a packet arrival destined for the learned MAC.
1334 # (This will also learn a MAC.)
1335 OFPROTO_TRACE(
1336   [ovs-dummy],
1337   [in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05),$arp],
1338   [-generate],
1339   [3])
1340
1341 # Check for both MAC learning entries.
1342 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1343  port  VLAN  MAC                Age
1344     3     0  50:54:00:00:00:05    ?
1345     1     0  50:54:00:00:00:06    ?
1346 ])
1347
1348 # Trace a packet arrival that updates the first learned MAC entry.
1349 OFPROTO_TRACE(
1350   [ovs-dummy],
1351   [in_port(2),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
1352   [-generate],
1353   [1,3,100])
1354
1355 # Check that the MAC learning entry was updated.
1356 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1357  port  VLAN  MAC                Age
1358     1     0  50:54:00:00:00:06    ?
1359     2     0  50:54:00:00:00:05    ?
1360 ])
1361
1362 # Add another bridge.
1363 AT_CHECK(
1364   [ovs-vsctl \
1365      -- add-br br1 \
1366      -- set bridge br1 datapath-type=dummy \
1367      -- add-port br1 p4 -- set interface p4 type=dummy \
1368      -- add-port br1 p5 -- set interface p5 type=dummy])
1369
1370 # Trace some packet arrivals in br1 to create MAC learning entries there too.
1371 OFPROTO_TRACE(
1372   [ovs-dummy],
1373   [in_port(4),eth(src=50:54:00:00:00:06,dst=ff:ff:ff:ff:ff:ff),$arp],
1374   [-generate],
1375   [5,101])
1376 OFPROTO_TRACE(
1377   [ovs-dummy],
1378   [in_port(5),eth(src=50:54:00:00:00:07,dst=ff:ff:ff:ff:ff:ff),$arp],
1379   [-generate],
1380   [4,101])
1381
1382 # Check that the MAC learning entries were added.
1383 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1384  port  VLAN  MAC                Age
1385     4     0  50:54:00:00:00:06    ?
1386     5     0  50:54:00:00:00:07    ?
1387 ])
1388
1389 # Delete port p1 and see that its MAC learning entry disappeared, and
1390 # that the MAC learning entry for the same MAC was also deleted from br1.
1391 AT_CHECK([ovs-vsctl del-port p1])
1392 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1393  port  VLAN  MAC                Age
1394     2     0  50:54:00:00:00:05    ?
1395 ])
1396 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1397  port  VLAN  MAC                Age
1398     5     0  50:54:00:00:00:07    ?
1399 ])
1400
1401 OVS_VSWITCHD_STOP
1402 AT_CLEANUP
1403
1404 AT_SETUP([ofproto-dpif - MAC table overflow])
1405 OVS_VSWITCHD_START(
1406   [set bridge br0 fail-mode=standalone other-config:mac-table-size=10 -- \
1407    add-port br0 p1 -- set Interface p1 type=dummy -- \
1408    add-port br0 p2 -- set Interface p2 type=dummy -- \
1409    add-port br0 p3 -- set Interface p3 type=dummy])
1410
1411 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)'
1412
1413 AT_CHECK([ovs-appctl time/stop])
1414
1415 # Trace 10 ARP packets arriving on p3, to create MAC learning entries.
1416 for i in 0 1 2 3 4 5 6 7 8 9; do
1417     OFPROTO_TRACE(
1418       [ovs-dummy],
1419       [in_port(3),eth(src=50:54:00:00:00:0$i,dst=ff:ff:ff:ff:ff:ff),$arp],
1420       [-generate],
1421       [1,2,100])
1422     ovs-appctl time/warp 1000
1423 done
1424
1425 # Check for the MAC learning entries.
1426 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/ *[[0-9]]\{1,\}$//' | sort],
1427   [0], [dnl
1428     3     0  50:54:00:00:00:00
1429     3     0  50:54:00:00:00:01
1430     3     0  50:54:00:00:00:02
1431     3     0  50:54:00:00:00:03
1432     3     0  50:54:00:00:00:04
1433     3     0  50:54:00:00:00:05
1434     3     0  50:54:00:00:00:06
1435     3     0  50:54:00:00:00:07
1436     3     0  50:54:00:00:00:08
1437     3     0  50:54:00:00:00:09
1438  port  VLAN  MAC                Age
1439 ])
1440
1441 # Trace another ARP packet on another MAC.
1442 OFPROTO_TRACE(
1443   [ovs-dummy],
1444   [in_port(3),eth(src=50:54:00:00:00:10,dst=ff:ff:ff:ff:ff:ff),$arp],
1445   [-generate],
1446   [1,2,100])
1447
1448 # Check that the new one chased the oldest one out of the table.
1449 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/' | sort],
1450   [0], [dnl
1451     3     0  50:54:00:00:00:01    ?
1452     3     0  50:54:00:00:00:02    ?
1453     3     0  50:54:00:00:00:03    ?
1454     3     0  50:54:00:00:00:04    ?
1455     3     0  50:54:00:00:00:05    ?
1456     3     0  50:54:00:00:00:06    ?
1457     3     0  50:54:00:00:00:07    ?
1458     3     0  50:54:00:00:00:08    ?
1459     3     0  50:54:00:00:00:09    ?
1460     3     0  50:54:00:00:00:10    ?
1461  port  VLAN  MAC                Age
1462 ])
1463 OVS_VSWITCHD_STOP
1464 AT_CLEANUP
1465
1466 dnl Test that sFlow samples packets correctly.
1467 AT_SETUP([ofproto-dpif - sFlow packet sampling])
1468 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
1469
1470 ON_EXIT([kill `cat test-sflow.pid`])
1471 AT_CHECK([test-sflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > sflow.log], [0], [], [ignore])
1472 AT_CAPTURE_FILE([sflow.log])
1473 SFLOW_PORT=`parse_listening_port < test-sflow.log`
1474
1475 ovs-appctl time/stop
1476
1477 ADD_OF_PORTS([br0], 1, 2)
1478 ovs-vsctl \
1479    set Interface br0 options:ifindex=1002 -- \
1480    set Interface p1 options:ifindex=1004 -- \
1481    set Interface p2 options:ifindex=1003 -- \
1482    set Bridge br0 sflow=@sf -- \
1483    --id=@sf create sflow targets=\"127.0.0.1:$SFLOW_PORT\" \
1484      header=128 sampling=1 polling=1
1485
1486 dnl open with ARP packets to seed the bridge-learning.  The output
1487 dnl ifIndex numbers should be reported predictably after that.
1488 dnl Since we set sampling=1 we should see all of these packets
1489 dnl reported. Sorting the output by data-source and seqNo makes
1490 dnl it deterministic. Ensuring that we send at least two packets
1491 dnl into each port means we get to check the seq nos are
1492 dnl incrementing correctly.
1493
1494 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)'
1495 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)'
1496 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)'
1497 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)'
1498 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)'
1499
1500 dnl sleep long enough to get more than one counter sample
1501 dnl from each datasource so we can check sequence numbers
1502 for i in `seq 1 30`; do
1503     ovs-appctl time/warp 100
1504 done
1505 OVS_VSWITCHD_STOP
1506 ovs-appctl -t test-sflow exit
1507
1508 AT_CHECK([[sort sflow.log | $EGREP 'HEADER|ERROR' | sed 's/ /\
1509         /g']], [0], [dnl
1510 HEADER
1511         dgramSeqNo=1
1512         ds=127.0.0.1>2:1000
1513         fsSeqNo=1
1514         in_vlan=0
1515         in_priority=0
1516         out_vlan=0
1517         out_priority=0
1518         meanSkip=1
1519         samplePool=1
1520         dropEvents=0
1521         in_ifindex=1004
1522         in_format=0
1523         out_ifindex=2
1524         out_format=2
1525         hdr_prot=1
1526         pkt_len=64
1527         stripped=4
1528         hdr_len=60
1529         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
1530 HEADER
1531         dgramSeqNo=1
1532         ds=127.0.0.1>2:1000
1533         fsSeqNo=2
1534         in_vlan=0
1535         in_priority=0
1536         out_vlan=0
1537         out_priority=0
1538         meanSkip=1
1539         samplePool=2
1540         dropEvents=0
1541         in_ifindex=1003
1542         in_format=0
1543         out_ifindex=2
1544         out_format=2
1545         hdr_prot=1
1546         pkt_len=64
1547         stripped=4
1548         hdr_len=60
1549         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
1550 HEADER
1551         dgramSeqNo=1
1552         ds=127.0.0.1>2:1000
1553         fsSeqNo=3
1554         in_vlan=0
1555         in_priority=0
1556         out_vlan=0
1557         out_priority=0
1558         meanSkip=1
1559         samplePool=3
1560         dropEvents=0
1561         in_ifindex=1004
1562         in_format=0
1563         out_ifindex=1003
1564         out_format=0
1565         hdr_prot=1
1566         pkt_len=64
1567         stripped=4
1568         hdr_len=60
1569         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
1570 HEADER
1571         dgramSeqNo=1
1572         ds=127.0.0.1>2:1000
1573         fsSeqNo=4
1574         in_vlan=0
1575         in_priority=0
1576         out_vlan=0
1577         out_priority=0
1578         meanSkip=1
1579         samplePool=4
1580         dropEvents=0
1581         in_ifindex=1003
1582         in_format=0
1583         out_ifindex=1004
1584         out_format=0
1585         hdr_prot=1
1586         pkt_len=64
1587         stripped=4
1588         hdr_len=60
1589         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
1590 HEADER
1591         dgramSeqNo=1
1592         ds=127.0.0.1>2:1000
1593         fsSeqNo=5
1594         in_vlan=0
1595         in_priority=0
1596         out_vlan=0
1597         out_priority=0
1598         meanSkip=1
1599         samplePool=5
1600         dropEvents=0
1601         in_ifindex=1003
1602         in_format=0
1603         out_ifindex=1004
1604         out_format=0
1605         hdr_prot=1
1606         pkt_len=64
1607         stripped=4
1608         hdr_len=60
1609         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
1610 ])
1611
1612 AT_CHECK([[sort sflow.log | $EGREP 'IFCOUNTERS|ERROR' | head -6 | sed 's/ /\
1613         /g']], [0], [dnl
1614 IFCOUNTERS
1615         dgramSeqNo=2
1616         ds=127.0.0.1>0:1002
1617         csSeqNo=1
1618         ifindex=1002
1619         type=6
1620         ifspeed=100000000
1621         direction=0
1622         status=3
1623         in_octets=0
1624         in_unicasts=0
1625         in_multicasts=0
1626         in_broadcasts=4294967295
1627         in_discards=0
1628         in_errors=0
1629         in_unknownprotos=4294967295
1630         out_octets=120
1631         out_unicasts=2
1632         out_multicasts=4294967295
1633         out_broadcasts=4294967295
1634         out_discards=0
1635         out_errors=0
1636         promiscuous=0
1637 IFCOUNTERS
1638         dgramSeqNo=2
1639         ds=127.0.0.1>0:1003
1640         csSeqNo=1
1641         ifindex=1003
1642         type=6
1643         ifspeed=100000000
1644         direction=0
1645         status=0
1646         in_octets=98
1647         in_unicasts=3
1648         in_multicasts=0
1649         in_broadcasts=4294967295
1650         in_discards=0
1651         in_errors=0
1652         in_unknownprotos=4294967295
1653         out_octets=120
1654         out_unicasts=2
1655         out_multicasts=4294967295
1656         out_broadcasts=4294967295
1657         out_discards=0
1658         out_errors=0
1659         promiscuous=0
1660 IFCOUNTERS
1661         dgramSeqNo=2
1662         ds=127.0.0.1>0:1004
1663         csSeqNo=1
1664         ifindex=1004
1665         type=6
1666         ifspeed=100000000
1667         direction=0
1668         status=0
1669         in_octets=84
1670         in_unicasts=2
1671         in_multicasts=0
1672         in_broadcasts=4294967295
1673         in_discards=0
1674         in_errors=0
1675         in_unknownprotos=4294967295
1676         out_octets=180
1677         out_unicasts=3
1678         out_multicasts=4294967295
1679         out_broadcasts=4294967295
1680         out_discards=0
1681         out_errors=0
1682         promiscuous=0
1683 IFCOUNTERS
1684         dgramSeqNo=3
1685         ds=127.0.0.1>0:1002
1686         csSeqNo=2
1687         ifindex=1002
1688         type=6
1689         ifspeed=100000000
1690         direction=0
1691         status=3
1692         in_octets=0
1693         in_unicasts=0
1694         in_multicasts=0
1695         in_broadcasts=4294967295
1696         in_discards=0
1697         in_errors=0
1698         in_unknownprotos=4294967295
1699         out_octets=120
1700         out_unicasts=2
1701         out_multicasts=4294967295
1702         out_broadcasts=4294967295
1703         out_discards=0
1704         out_errors=0
1705         promiscuous=0
1706 IFCOUNTERS
1707         dgramSeqNo=3
1708         ds=127.0.0.1>0:1003
1709         csSeqNo=2
1710         ifindex=1003
1711         type=6
1712         ifspeed=100000000
1713         direction=0
1714         status=0
1715         in_octets=98
1716         in_unicasts=3
1717         in_multicasts=0
1718         in_broadcasts=4294967295
1719         in_discards=0
1720         in_errors=0
1721         in_unknownprotos=4294967295
1722         out_octets=120
1723         out_unicasts=2
1724         out_multicasts=4294967295
1725         out_broadcasts=4294967295
1726         out_discards=0
1727         out_errors=0
1728         promiscuous=0
1729 IFCOUNTERS
1730         dgramSeqNo=3
1731         ds=127.0.0.1>0:1004
1732         csSeqNo=2
1733         ifindex=1004
1734         type=6
1735         ifspeed=100000000
1736         direction=0
1737         status=0
1738         in_octets=84
1739         in_unicasts=2
1740         in_multicasts=0
1741         in_broadcasts=4294967295
1742         in_discards=0
1743         in_errors=0
1744         in_unknownprotos=4294967295
1745         out_octets=180
1746         out_unicasts=3
1747         out_multicasts=4294967295
1748         out_broadcasts=4294967295
1749         out_discards=0
1750         out_errors=0
1751         promiscuous=0
1752 ])
1753 AT_CLEANUP
1754
1755
1756
1757 dnl Test that basic NetFlow reports flow statistics correctly:
1758 dnl - The initial packet of a flow are correctly accounted.
1759 dnl - Later packets within a flow are correctly accounted.
1760 dnl - Flow actions changing (in this case, due to MAC learning)
1761 dnl   cause a record to be sent.
1762 AT_SETUP([ofproto-dpif - NetFlow flow expiration])
1763
1764 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
1765 ADD_OF_PORTS([br0], 1, 2)
1766
1767 ON_EXIT([kill `cat test-netflow.pid`])
1768 AT_CHECK([test-netflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > netflow.log], [0], [], [ignore])
1769 AT_CAPTURE_FILE([netflow.log])
1770 NETFLOW_PORT=`parse_listening_port < test-netflow.log`
1771
1772 ovs-vsctl \
1773    set Bridge br0 netflow=@nf -- \
1774    --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
1775      engine_id=1 engine_type=2 active_timeout=30 add-id-to-interface=false
1776
1777 for delay in 1000 30000; do
1778     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)'
1779     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)'
1780
1781     ovs-appctl time/warp $delay
1782 done
1783
1784 sleep 1
1785 OVS_VSWITCHD_STOP
1786 ovs-appctl -t test-netflow exit
1787
1788 AT_CHECK([[sed -e 's/, uptime [0-9]*//
1789 s/, now [0-9.]*//
1790 s/time \([0-9]*\)\.\.\.\1$/time <moment>/
1791 s/time [0-9]*\.\.\.[0-9]*/time <range>/
1792 ' netflow.log | sort]], [0],
1793   [
1794 header: v5, seq 0, engine 2,1
1795 header: v5, seq 1, engine 2,1
1796 seq 0: 192.168.0.1 > 192.168.0.2, if 1 > 65535, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
1797 seq 1: 192.168.0.1 > 192.168.0.2, if 1 > 2, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
1798 seq 1: 192.168.0.2 > 192.168.0.1, if 2 > 1, 2 pkts, 120 bytes, ICMP 0:0, time <range>
1799 ])
1800 AT_CLEANUP
1801
1802 dnl Test that basic NetFlow reports active expirations correctly.
1803 AT_SETUP([ofproto-dpif - NetFlow active expiration])
1804
1805 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
1806 ADD_OF_PORTS([br0], 1, 2)
1807
1808 ON_EXIT([kill `cat test-netflow.pid`])
1809 AT_CHECK([test-netflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > netflow.log], [0], [], [ignore])
1810 AT_CAPTURE_FILE([netflow.log])
1811 NETFLOW_PORT=`parse_listening_port < test-netflow.log`
1812
1813 ovs-vsctl \
1814    set Bridge br0 netflow=@nf -- \
1815    --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
1816      engine_id=1 engine_type=2 active_timeout=10 add-id-to-interface=false
1817
1818 AT_CHECK([ovs-appctl time/stop])
1819 n=1
1820 while test $n -le 60; do
1821     n=`expr $n + 1`
1822
1823     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)'
1824     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)'
1825
1826     ovs-appctl time/warp 1000
1827 done
1828
1829 ovs-appctl time/warp 10000
1830
1831 sleep 1
1832 OVS_VSWITCHD_STOP
1833 ovs-appctl -t test-netflow exit
1834
1835 # Count the number of reported packets:
1836 # - From source to destination before MAC learning kicks in (just one).
1837 # - From source to destination after that.
1838 # - From destination to source.
1839 n_learn=0
1840 n_in=0
1841 n_out=0
1842 n_other=0
1843 n_recs=0
1844 none=0
1845 while read line; do
1846     pkts=`echo "$line" | sed 's/.*, \([[0-9]]*\) pkts,.*/\1/'`
1847     case $pkts in
1848          [[0-9]]*) ;;
1849          *) continue ;;
1850     esac
1851
1852     case $line in
1853         "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 65535, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
1854             counter=n_learn
1855             ;;
1856         "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 2, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
1857             counter=n_in
1858             ;;
1859         "seq "*": 192.168.0.2 > 192.168.0.1, if 2 > 1, "*" pkts, "*" bytes, TCP 80 > 1234, time "*)
1860             counter=n_out
1861             ;;
1862         *)
1863             counter=n_other
1864             ;;
1865     esac
1866     eval $counter=\`expr \$$counter + \$pkts\`
1867     n_recs=`expr $n_recs + 1`
1868 done < netflow.log
1869
1870 # There should be exactly 1 MAC learning packet,
1871 # exactly 59 other packets in that direction,
1872 # and exactly 60 packets in the other direction.
1873 AT_CHECK([echo $n_learn $n_in $n_out $n_other], [0], [1 59 60 0
1874 ])
1875
1876 # There should be 1 expiration for MAC learning,
1877 # at least 5 active and a final expiration in one direction,
1878 # and at least 5 active and a final expiration in the other direction.
1879 echo $n_recs
1880 AT_CHECK([test $n_recs -ge 13])
1881
1882 AT_CLEANUP
1883
1884 AT_SETUP([idle_age and hard_age increase over time])
1885 OVS_VSWITCHD_START
1886
1887 # get_ages DURATION HARD IDLE
1888 #
1889 # Fetch the flow duration, hard age, and idle age into the variables
1890 # whose names are given as arguments.  Rounds DURATION down to the
1891 # nearest integer.  If hard_age doesn't appear in the output, sets
1892 # HARD to "none".  If idle_age doesn't appear in the output, sets IDLE
1893 # to 0.
1894 get_ages () {
1895     AT_CHECK([ovs-ofctl dump-flows br0], [0], [stdout])
1896
1897     duration=`sed -n 's/.*duration=\([[0-9]]*\)\(\.[[0-9]]*\)\{0,1\}s.*/\1/p' stdout`
1898     AT_CHECK([[expr X"$duration" : 'X[0-9][0-9]*$']], [0], [ignore])
1899     AS_VAR_COPY([$1], [duration])
1900
1901     hard=`sed -n 's/.*hard_age=\([[0-9]]*\),.*/\1/p' stdout`
1902     if test X"$hard" = X; then
1903         hard=none
1904     else
1905         AT_CHECK([[expr X"$hard" : 'X[0-9][0-9]*$']], [0], [ignore])
1906     fi
1907     AS_VAR_COPY([$2], [hard])
1908
1909     idle=`sed -n 's/.*idle_age=\([[0-9]]*\),.*/\1/p' stdout`
1910     if test X"$idle" = X; then
1911         idle=0
1912     else
1913         AT_CHECK([[expr X"$idle" : 'X[0-9][0-9]*$']], [0], [ignore])
1914     fi
1915     AS_VAR_COPY([$3], [idle])
1916 }
1917
1918 # Add a flow and get its initial hard and idle age.
1919 AT_CHECK([ovs-ofctl add-flow br0 hard_timeout=199,idle_timeout=188,actions=drop])
1920 get_ages duration1 hard1 idle1
1921
1922 # Warp time forward by 10 seconds, then modify the flow's actions.
1923 ovs-appctl time/warp 10000
1924 get_ages duration2 hard2 idle2
1925 AT_CHECK([ovs-ofctl mod-flows br0 actions=flood])
1926
1927 # Warp time forward by 10 seconds.
1928 ovs-appctl time/warp 10000
1929 get_ages duration3 hard3 idle3
1930
1931 # Warp time forward 10 more seconds, then pass some packets through the flow,
1932 # then warp forward a few more times because idle times are only updated
1933 # occasionally.
1934 ovs-appctl time/warp 10000
1935 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)'
1936 ovs-appctl time/warp 1000
1937 ovs-appctl time/warp 1000
1938 ovs-appctl time/warp 1000
1939 get_ages duration4 hard4 idle4
1940
1941 printf "duration: %4s => %4s => %4s => %4s\n" $duration1 $duration2 $duration3 $duration4
1942 printf "hard_age: %4s => %4s => %4s => %4s\n" $hard1 $hard2 $hard3 $hard4
1943 printf "idle_age: %4s => %4s => %4s => %4s\n" $idle1 $idle2 $idle3 $idle4
1944
1945 # Duration should increase steadily over time.
1946 AT_CHECK([test $duration1 -lt $duration2])
1947 AT_CHECK([test $duration2 -lt $duration3])
1948 AT_CHECK([test $duration3 -lt $duration4])
1949
1950 # Hard age should be "none" initially because it's the same as flow_duration,
1951 # then it should increase.
1952 AT_CHECK([test $hard1 = none])
1953 AT_CHECK([test $hard2 = none])
1954 AT_CHECK([test $hard3 != none])
1955 AT_CHECK([test $hard4 != none])
1956 AT_CHECK([test $hard3 -lt $hard4])
1957
1958 # Idle age should increase from 1 to 2 to 3, then decrease.
1959 AT_CHECK([test $idle1 -lt $idle2])
1960 AT_CHECK([test $idle2 -lt $idle3])
1961 AT_CHECK([test $idle3 -gt $idle4])
1962
1963 # Check some invariant relationships.
1964 AT_CHECK([test $duration1 = $idle1])
1965 AT_CHECK([test $duration2 = $idle2])
1966 AT_CHECK([test $duration3 = $idle3])
1967 AT_CHECK([test $idle3 -gt $hard3])
1968 AT_CHECK([test $idle4 -lt $hard4])
1969 AT_CHECK([test $hard4 -lt $duration4])
1970
1971 OVS_VSWITCHD_STOP
1972 AT_CLEANUP
1973
1974 AT_SETUP([ofproto-dpif - fin_timeout])
1975 OVS_VSWITCHD_START
1976 AT_DATA([flows.txt], [dnl
1977 in_port=1 actions=output:2
1978 in_port=2 actions=mod_vlan_vid:17,output:1
1979 ])
1980 AT_CHECK([ovs-ofctl add-flow br0 'idle_timeout=60,actions=fin_timeout(idle_timeout=5)'])
1981 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1982 [NXST_FLOW reply:
1983  idle_timeout=60, actions=fin_timeout(idle_timeout=5)
1984 ])
1985 # Check that a TCP SYN packet does not change the timeout.  (Because
1986 # flow stats updates are mainly what implements the fin_timeout
1987 # feature, we warp forward a couple of times to ensure that flow stats
1988 # run before re-checking the flow table.)
1989 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f908004500003c2e2440004006465dac11370dac11370b828b0016751e267b00000000a00216d017360000020405b40402080a2d25085f0000000001030307])
1990 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
1991 warped
1992 ])
1993 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1994 [NXST_FLOW reply:
1995  n_packets=1, n_bytes=74, idle_timeout=60, actions=fin_timeout(idle_timeout=5)
1996 ])
1997 # Check that a TCP FIN packet does change the timeout.
1998 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f90800451000342e3e40004006463bac11370dac11370b828b0016751e319dfc96399b801100717ae800000101080a2d250a9408579588])
1999 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
2000 warped
2001 ])
2002 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
2003 [NXST_FLOW reply:
2004  n_packets=2, n_bytes=140, idle_timeout=5, actions=fin_timeout(idle_timeout=5)
2005 ])
2006 OVS_VSWITCHD_STOP
2007 AT_CLEANUP
2008
2009 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-dps])
2010 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
2011 ADD_OF_PORTS([br0], [1], [2])
2012 ADD_OF_PORTS([br1], [3])
2013
2014 AT_CHECK([ovs-appctl dpif/dump-dps], [0], [dnl
2015 dummy@br0
2016 dummy@br1
2017 ])
2018 OVS_VSWITCHD_STOP
2019 AT_CLEANUP
2020
2021 AT_SETUP([ofproto-dpif - ovs-appctl dpif/show])
2022 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
2023 ADD_OF_PORTS([br0], [1], [2])
2024 ADD_OF_PORTS([br1], [3])
2025
2026 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
2027 br0 (dummy@ovs-dummy):
2028         lookups: hit:0 missed:0
2029         flows: cur: 0, avg: 0.000, max: 0, life span: 0(ms)
2030                 overall avg: add rate: 0.000/min, del rate: 0.000/min
2031         br0 65534/100: (dummy)
2032         p1 1/1: (dummy)
2033         p2 2/2: (dummy)
2034 br1 (dummy@ovs-dummy):
2035         lookups: hit:0 missed:0
2036         flows: cur: 0, avg: 0.000, max: 0, life span: 0(ms)
2037                 overall avg: add rate: 0.000/min, del rate: 0.000/min
2038         br1 65534/101: (dummy)
2039         p3 3/3: (dummy)
2040 ])
2041
2042 AT_CHECK([ovs-appctl dpif/show br0], [0], [dnl
2043 br0 (dummy@ovs-dummy):
2044         lookups: hit:0 missed:0
2045         flows: cur: 0, avg: 0.000, max: 0, life span: 0(ms)
2046                 overall avg: add rate: 0.000/min, del rate: 0.000/min
2047         br0 65534/100: (dummy)
2048         p1 1/1: (dummy)
2049         p2 2/2: (dummy)
2050 ])
2051 OVS_VSWITCHD_STOP
2052 AT_CLEANUP
2053
2054 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-flows])
2055 OVS_VSWITCHD_START([add-br br1 -- \
2056                     set bridge br1 datapath-type=dummy fail-mode=secure])
2057 ADD_OF_PORTS([br0], [1], [2])
2058 ADD_OF_PORTS([br1], [3])
2059
2060 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)'])
2061 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)'])
2062 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)'])
2063
2064 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
2065 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))
2066 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))
2067 ])
2068
2069 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
2070 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))
2071 ])
2072
2073 OVS_VSWITCHD_STOP
2074 AT_CLEANUP
2075
2076 AT_SETUP([ofproto-dpif - ovs-appctl dpif/del-flows])
2077 OVS_VSWITCHD_START([add-br br1 -- \
2078                     set bridge br1 datapath-type=dummy fail-mode=secure])
2079 ADD_OF_PORTS([br0], [1], [2])
2080 ADD_OF_PORTS([br1], [3])
2081
2082 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)'])
2083 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)'])
2084 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)'])
2085
2086 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
2087 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))
2088 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))
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 AT_CHECK([ovs-appctl dpif/del-flows br0])
2096 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
2097 ])
2098
2099 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
2100 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))
2101 ])
2102
2103 OVS_VSWITCHD_STOP
2104 AT_CLEANUP
2105
2106 AT_SETUP([ofproto-dpif - patch ports])
2107 OVS_VSWITCHD_START([add-br br1 \
2108 -- set bridge br1 datapath-type=dummy fail-mode=secure \
2109 -- add-port br1 pbr1 -- set int pbr1 type=patch options:peer=pbr0 \
2110 -- add-port br0 pbr0 -- set int pbr0 type=patch options:peer=pbr1])
2111
2112 ADD_OF_PORTS([br0], [2])
2113 ADD_OF_PORTS([br1], [3])
2114
2115 AT_CHECK([ovs-ofctl add-flow br0 actions=LOCAL,output:1,output:2])
2116 AT_CHECK([ovs-ofctl add-flow br1 actions=LOCAL,output:1,output:3])
2117
2118 for i in $(seq 1 10); do
2119     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)'
2120 done
2121
2122 for i in $(seq 1 5); do
2123     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)'
2124 done
2125
2126 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
2127 warped
2128 ])
2129
2130 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
2131 br0 (dummy@ovs-dummy):
2132         lookups: hit:9 missed:1
2133         flows: cur: 1, avg: 1.000, max: 1, life span: 0(ms)
2134                 overall avg: add rate: 0.000/min, del rate: 0.000/min
2135         br0 65534/100: (dummy)
2136         p2 2/2: (dummy)
2137         pbr0 1/none: (patch: peer=pbr1)
2138 br1 (dummy@ovs-dummy):
2139         lookups: hit:4 missed:1
2140         flows: cur: 1, avg: 1.000, max: 1, life span: 0(ms)
2141                 overall avg: add rate: 0.000/min, del rate: 0.000/min
2142         br1 65534/101: (dummy)
2143         p3 3/3: (dummy)
2144         pbr1 1/none: (patch: peer=pbr0)
2145 ])
2146
2147 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_USED], [0], [dnl
2148 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
2149 ]),
2150 AT_CHECK([ovs-appctl dpif/dump-flows br1 | STRIP_USED], [0], [dnl
2151 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
2152 ])
2153
2154 AT_CHECK([ovs-ofctl dump-ports br0 pbr0], [0], [dnl
2155 OFPST_PORT reply (xid=0x4): 1 ports
2156   port  1: rx pkts=5, bytes=300, drop=0, errs=0, frame=0, over=0, crc=0
2157            tx pkts=10, bytes=600, drop=0, errs=0, coll=0
2158 ])
2159
2160 AT_CHECK([ovs-ofctl dump-ports br1 pbr1], [0], [dnl
2161 OFPST_PORT reply (xid=0x4): 1 ports
2162   port  1: rx pkts=10, bytes=600, drop=0, errs=0, frame=0, over=0, crc=0
2163            tx pkts=5, bytes=300, drop=0, errs=0, coll=0
2164 ])
2165
2166 OVS_VSWITCHD_STOP
2167 AT_CLEANUP
2168
2169 AT_SETUP([ofproto-dpif - ovs-appctl dpif/show rates])
2170 OVS_VSWITCHD_START([set Bridge br0 fail-mode=secure])
2171 ADD_OF_PORTS([br0], 1, 2)
2172
2173 AT_CHECK([ovs-ofctl add-flow br0 actions=LOCAL,output:1,output:2])
2174
2175 for i in $(seq 1 61); do
2176     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)'
2177     ovs-appctl time/warp 10000
2178     ovs-appctl time/warp 50000
2179 done
2180
2181 AT_CHECK([ovs-appctl time/warp 10000], [0], [warped
2182 ])
2183
2184 AT_CHECK([ovs-appctl dpif/show | sed 's/ 10[[0-9]]\{3\}(ms)$/ 10000(ms)/'], [0], [dnl
2185 br0 (dummy@ovs-dummy):
2186         lookups: hit:0 missed:61
2187         flows: cur: 0, avg: 1.000, max: 1, life span: 10000(ms)
2188                 hourly avg: add rate: 0.641/min, del rate: 0.641/min
2189                 overall avg: add rate: 1.000/min, del rate: 1.000/min
2190         br0 65534/100: (dummy)
2191         p1 1/1: (dummy)
2192         p2 2/2: (dummy)
2193 ])
2194
2195 OVS_VSWITCHD_STOP
2196 AT_CLEANUP
2197
2198 AT_SETUP([ofproto-dpif - port duration])
2199 OVS_VSWITCHD_START([set Bridge br0 protocols=OpenFlow13])
2200 ADD_OF_PORTS([br0], 1, 2)
2201
2202 ovs-appctl time/warp 10000
2203
2204 AT_CHECK([ovs-ofctl -O openflow13 dump-ports br0], [0], [stdout])
2205 AT_CHECK([sed 's/=[[0-9]][[0-9]]\(\.[[0-9]]\{1,\}\)\{,1\}s/=?s/' stdout], [0],
2206 [dnl
2207 OFPST_PORT reply (OF1.3) (xid=0x2): 3 ports
2208   port  1: rx pkts=0, bytes=0, drop=0, errs=0, frame=0, over=0, crc=0
2209            tx pkts=0, bytes=0, drop=0, errs=0, coll=0
2210            duration=?s
2211   port  2: rx pkts=0, bytes=0, drop=0, errs=0, frame=0, over=0, crc=0
2212            tx pkts=0, bytes=0, drop=0, errs=0, coll=0
2213            duration=?s
2214   port LOCAL: rx pkts=0, bytes=0, drop=0, errs=0, frame=0, over=0, crc=0
2215            tx pkts=0, bytes=0, drop=0, errs=0, coll=0
2216            duration=?s
2217 ])
2218 OVS_VSWITCHD_STOP
2219 AT_CLEANUP