tests: Add sFlow test.
[sliver-openvswitch.git] / tests / ofproto-dpif.at
1 AT_BANNER([ofproto-dpif])
2
3 AT_SETUP([ofproto-dpif - resubmit])
4 OVS_VSWITCHD_START
5 ADD_OF_PORTS([br0], [1], [10], [11], [12], [13], [14], [15],
6                     [16], [17], [18], [19], [20], [21])
7 AT_DATA([flows.txt], [dnl
8 table=0 in_port=1 priority=1000 icmp actions=output(10),resubmit(2),output(19),resubmit(3),output(21)
9 table=0 in_port=2 priority=1500 icmp actions=output(11),resubmit(,1),output(16),resubmit(2,1),output(18)
10 table=0 in_port=3 priority=2000 icmp actions=output(20)
11 table=1 in_port=1 priority=1000 icmp actions=output(12),resubmit(4,1),output(13),resubmit(3),output(15)
12 table=1 in_port=2 priority=1500 icmp actions=output(17),resubmit(,2)
13 table=1 in_port=3 priority=1500 icmp actions=output(14),resubmit(,2)
14 ])
15 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
16 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
17 AT_CHECK([tail -1 stdout], [0],
18   [Datapath actions: 10,11,12,13,14,15,16,17,18,19,20,21
19 ])
20 OVS_VSWITCHD_STOP
21 AT_CLEANUP
22
23 AT_SETUP([ofproto-dpif - goto table])
24 OVS_VSWITCHD_START
25 ADD_OF_PORTS([br0], [1], [10], [11])
26 echo "table=0 in_port=1 actions=output(10),goto_table(1)" > flows.txt
27 for i in `seq 1 252`; do echo "table=$i actions=goto_table($(($i+1)))"; done >> flows.txt
28 echo "table=253 actions=output(11)" >> flows.txt
29 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flows br0 flows.txt])
30 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
31 AT_CHECK([tail -1 stdout], [0],
32   [Datapath actions: 10,11
33 ])
34 OVS_VSWITCHD_STOP
35 AT_CLEANUP
36
37 AT_SETUP([ofproto-dpif - registers])
38 OVS_VSWITCHD_START
39 ADD_OF_PORTS([br0], [20], [21], [22], [33], [90])
40 AT_DATA([flows.txt], [dnl
41 in_port=90                 actions=resubmit:2,resubmit:3,resubmit:4,resubmit:91
42 in_port=91                 actions=resubmit:5,resubmit:6,resubmit:7,resubmit:92
43 in_port=92                 actions=resubmit:8,resubmit:9,resubmit:10,resubmit:11,resubmit:93
44 in_port=93                 actions=resubmit:12,resubmit:13,resubmit:14,resubmit:15
45
46 in_port=2                  actions=load:0x000db000->NXM_NX_REG0[[]]
47 in_port=3                  actions=load:0xdea->NXM_NX_REG0[[20..31]]
48 in_port=4                  actions=load:0xeef->NXM_NX_REG0[[0..11]]
49 in_port=5                  actions=move:NXM_NX_REG0[[]]->NXM_NX_REG1[[]]
50 in_port=6                  actions=load:0x22222222->NXM_NX_REG2[[]]
51 in_port=7                  actions=move:NXM_NX_REG1[[20..31]]->NXM_NX_REG2[[0..11]]
52 in_port=8                  actions=move:NXM_NX_REG1[[0..11]]->NXM_NX_REG2[[20..31]]
53 in_port=9,reg0=0xdeadbeef  actions=output:20
54 in_port=10,reg1=0xdeadbeef actions=output:21
55 in_port=11,reg2=0xeef22dea actions=output:22
56
57 dnl Sanilty check all registers
58 in_port=12 actions=load:0x10->NXM_NX_REG0[[]],load:0x11->NXM_NX_REG1[[]],load:0x12->NXM_NX_REG2[[]]
59 in_port=13 actions=load:0x13->NXM_NX_REG3[[]],load:0x14->NXM_NX_REG4[[]],load:0x15->NXM_NX_REG5[[]]
60 in_port=14 actions=load:0x16->NXM_NX_REG6[[]],load:0x17->NXM_NX_REG7[[]]
61 in_port=15,reg0=0x10,reg1=0x11,reg2=0x12,reg3=0x13,reg4=0x14,reg5=0x15,reg6=0x16,reg7=0x17 actions=output:33
62
63 ])
64 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
65 AT_CHECK([ovs-appctl ofproto/trace br0 '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 br0 '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
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 ])
103 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
104 AT_CHECK([ovs-appctl ofproto/trace 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=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
105 AT_CHECK([tail -1 stdout], [0],
106   [Datapath actions: 9,55,10,55,66,11,77,88
107 ])
108 OVS_VSWITCHD_STOP
109 AT_CLEANUP
110
111 AT_SETUP([ofproto-dpif - dec_ttl])
112 OVS_VSWITCHD_START
113 ADD_OF_PORTS([br0], [1], [2], [3], [4])
114 AT_DATA([flows.txt], [dnl
115 table=0 in_port=1 action=dec_ttl,output:2,resubmit(1,1),output:4
116 table=1 in_port=1 action=dec_ttl,output:3
117 ])
118 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
119 AT_CHECK([ovs-appctl ofproto/trace 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=2,frag=no)' -generate], [0], [stdout])
120 AT_CHECK([tail -3 stdout], [0],
121   [Datapath actions: set(ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=1,frag=no)),2,4
122 This flow is handled by the userspace slow path because it:
123         - Sends "packet-in" messages to the OpenFlow controller.
124 ])
125 AT_CHECK([ovs-appctl ofproto/trace 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=3,frag=no)'], [0], [stdout])
126 AT_CHECK([tail -1 stdout], [0],
127   [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
128 ])
129 AT_CHECK([ovs-appctl ofproto/trace br0 '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])
130 AT_CHECK([tail -1 stdout], [0],
131   [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
132 ])
133
134 AT_CAPTURE_FILE([ofctl_monitor.log])
135 AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl --detach --no-chdir --pidfile 2> ofctl_monitor.log])
136 AT_CHECK([ovs-appctl ofproto/trace 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=2,frag=no)' -generate], [0], [stdout])
137 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
138 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
139 NXT_PACKET_IN (xid=0x0): table_id=1 total_len=42 in_port=1 (via invalid_ttl) data_len=42 (unbuffered)
140 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
141 ])
142 OVS_VSWITCHD_STOP
143 AT_CLEANUP
144
145
146 AT_SETUP([ofproto-dpif - output, OFPP_NONE ingress port])
147 OVS_VSWITCHD_START
148 ADD_OF_PORTS([br0], [1], [2])
149
150 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
151
152 # "in_port" defaults to OFPP_NONE if it's not specified.
153 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"
154 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
155 AT_CHECK([tail -1 stdout | sed 's/Datapath actions: //' | tr "," "\n" | sort -n], [0], [dnl
156 1
157 2
158 100
159 ])
160
161 OVS_VSWITCHD_STOP
162 AT_CLEANUP
163
164 AT_SETUP([ofproto-dpif - DSCP])
165 OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=dummy])
166 ADD_OF_PORTS([br0], [9])
167 AT_DATA([flows.txt], [dnl
168 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
169 ])
170 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
171 AT_CHECK([ovs-vsctl -- \
172         set Port p1 qos=@newqos --\
173         --id=@newqos create QoS type=linux-htb queues=1=@q1,2=@q2 --\
174         --id=@q1 create Queue dscp=1 --\
175         --id=@q2 create Queue dscp=2], [0], [ignore])
176 AT_CHECK([ovs-appctl ofproto/trace br0 '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])
177 AT_CHECK([tail -1 stdout], [0],
178   [Datapath actions: dnl
179 100,dnl
180 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
181 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
182 1,dnl
183 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
184 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
185 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0x3,ttl=128,frag=no)),1,dnl
186 100
187 ])
188 OVS_VSWITCHD_STOP
189 AT_CLEANUP
190
191 AT_SETUP([ofproto-dpif - output/flood flags])
192 OVS_VSWITCHD_START
193 ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6], [7])
194
195 AT_DATA([flows.txt], [dnl
196 in_port=local actions=local,flood
197 in_port=1 actions=flood
198 in_port=2 actions=all
199 in_port=3 actions=output:65534,output:1,output:2,output:3,output:4,output:5,output:6,output:7
200 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
201 ])
202 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
203 AT_CHECK([ovs-ofctl mod-port br0 5 noforward])
204 AT_CHECK([ovs-ofctl mod-port br0 6 noflood])
205
206 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(100),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
207 AT_CHECK([tail -1 stdout \
208 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
209 1
210 2
211 3
212 4
213 7
214 ])
215
216 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(1),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
217 AT_CHECK([tail -1 stdout \
218 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
219 100
220 2
221 3
222 4
223 7
224 ])
225
226 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(2),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
227 AT_CHECK([tail -1 stdout \
228 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
229 1
230 100
231 3
232 4
233 6
234 7
235 ])
236
237 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(3),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
238 AT_CHECK([tail -1 stdout], [0],
239   [Datapath actions: 100,1,2,4,6,7
240 ])
241
242 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(4),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
243 AT_CHECK([tail -1 stdout], [0],
244   [Datapath actions: set(skb_priority(0x1)),100,1,2,set(skb_priority(0x2)),3,set(skb_priority(0x1)),6,7
245 ])
246 OVS_VSWITCHD_STOP
247 AT_CLEANUP
248
249 AT_SETUP([ofproto-dpif - controller])
250 OVS_VSWITCHD_START([dnl
251    add-port br0 p1 -- set Interface p1 type=dummy
252 ])
253
254 AT_CAPTURE_FILE([ofctl_monitor.log])
255 AT_DATA([flows.txt], [dnl
256 cookie=0x0 dl_src=10:11:11:11:11:11 actions=controller
257 cookie=0x1 dl_src=20:22:22:22:22:22 actions=controller,resubmit(80,1)
258 cookie=0x2 dl_src=30:33:33:33:33:33 actions=mod_vlan_vid:15,controller
259
260 cookie=0x3 table=1 in_port=80 actions=load:1->NXM_NX_REG0[[]],mod_vlan_vid:80,controller,resubmit(81,2)
261 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)
262 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)
263 cookie=0x6 table=4 in_port=83 actions=load:4->NXM_NX_REG3[[]],mod_nw_src:83.83.83.83,controller,resubmit(84,5)
264 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)
265 cookie=0x8 table=6 in_port=85 actions=mod_tp_src:85,controller,resubmit(86,7)
266 cookie=0x9 table=7 in_port=86 actions=mod_tp_dst:86,controller,controller
267 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
268 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
269 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
270 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
271 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
272 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
273 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
274 cookie=0xb dl_src=50:55:55:55:55:55 dl_type=0x8847 actions=load:1000->OXM_OF_MPLS_LABEL[[]],controller
275 cookie=0xd dl_src=60:66:66:66:66:66 actions=pop_mpls:0x0800,controller
276 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
277 ])
278 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
279
280 dnl Flow miss.
281 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
282
283 for i in 1 2 3 ; do
284     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)'
285 done
286
287 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
288 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
289 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
290 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
291 dnl
292 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
293 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
294 dnl
295 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
296 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
297 ])
298
299 dnl Singleton controller action.
300 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
301
302 for i in 1 2 3 ; do
303     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)'
304 done
305
306 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
307 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
308 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
309 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
310 dnl
311 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
312 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
313 dnl
314 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
315 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
316 ])
317
318 dnl Modified controller action.
319 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
320
321 for i in 1 2 3 ; do
322     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)'
323 done
324
325 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
326 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
327 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
328 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
329 dnl
330 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
331 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
332 dnl
333 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
334 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
335 ])
336
337 dnl Modified MPLS controller action.
338 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
339
340 for i in 1 2 3; do
341     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)'
342 done
343
344 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
345 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
346 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
347 mpls(label:10,tc:3,ttl:64,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:42,dl_dst=50:54:00:00:00:07
348 dnl
349 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
350 mpls(label:10,tc:3,ttl:64,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:42,dl_dst=50:54:00:00:00:07
351 dnl
352 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
353 mpls(label:10,tc:3,ttl:64,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:42,dl_dst=50:54:00:00:00:07
354 ])
355
356 dnl Modified MPLS controller action.
357 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
358
359 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)
360
361 for i in 1 2 3; do
362     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)'
363 done
364
365 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
366 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
367 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
368 mpls(label:10,tc:3,ttl:64,bos:0),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:43,dl_dst=50:54:00:00:00:07
369 dnl
370 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
371 mpls(label:10,tc:3,ttl:64,bos:0),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:43,dl_dst=50:54:00:00:00:07
372 dnl
373 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
374 mpls(label:10,tc:3,ttl:64,bos:0),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:43,dl_dst=50:54:00:00:00:07
375 ])
376
377 dnl Modified MPLS controller action.
378 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
379
380 for i in 1 2 3; do
381     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))'
382 done
383
384 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
385 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
386 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
387 mpls(label:10,tc:3,ttl:64,bos:1),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
388 dnl
389 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
390 mpls(label:10,tc:3,ttl:64,bos:1),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
391 dnl
392 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
393 mpls(label:10,tc:3,ttl:64,bos:1),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
394 ])
395
396 dnl Modified MPLS controller action.
397 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
398
399 for i in 1 2 3; do
400     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=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)'
401 done
402
403 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
404 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
405 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
406 mpls(label:10,tc:3,ttl:63,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:45,dl_dst=50:54:00:00:00:07
407 dnl
408 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
409 mpls(label:10,tc:3,ttl:63,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:45,dl_dst=50:54:00:00:00:07
410 dnl
411 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
412 mpls(label:10,tc:3,ttl:63,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:45,dl_dst=50:54:00:00:00:07
413 ])
414
415 dnl Modified MPLS controller action.
416 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
417
418 for i in 1 2 3; do
419     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)'
420 done
421
422 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
423 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
424 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
425 mpls(label:10,tc:3,ttl:10,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:46,dl_dst=50:54:00:00:00:07
426 dnl
427 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
428 mpls(label:10,tc:3,ttl:10,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:46,dl_dst=50:54:00:00:00:07
429 dnl
430 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
431 mpls(label:10,tc:3,ttl:10,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:46,dl_dst=50:54:00:00:00:07
432 ])
433
434 dnl Modified MPLS controller action.
435 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
436
437 for i in 1 2 3; do
438     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)'
439 done
440
441 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
442 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
443 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
444 mpls(label:10,tc:3,ttl:10,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:47,dl_dst=50:54:00:00:00:07
445 dnl
446 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
447 mpls(label:10,tc:3,ttl:10,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:47,dl_dst=50:54:00:00:00:07
448 dnl
449 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
450 mpls(label:10,tc:3,ttl:10,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:47,dl_dst=50:54:00:00:00:07
451 ])
452
453 dnl Modified MPLS controller action.
454 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
455
456 for i in 1 2 3; do
457     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)'
458 done
459
460 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
461 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
462 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
463 mpls(label:10,tc:3,ttl:9,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:48,dl_dst=50:54:00:00:00:07
464 dnl
465 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
466 mpls(label:10,tc:3,ttl:9,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:48,dl_dst=50:54:00:00:00:07
467 dnl
468 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
469 mpls(label:10,tc:3,ttl:9,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:48,dl_dst=50:54:00:00:00:07
470 ])
471
472 dnl Modified MPLS actions.
473 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
474
475 for i in 1 2 3; do
476     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),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no)'
477 done
478
479 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
480 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
481 NXT_PACKET_IN (xid=0x0): cookie=0xb total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
482 mpls(label:1000,tc:7,ttl:64,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:55:55:55:55:55,dl_dst=50:54:00:00:00:07
483 dnl
484 NXT_PACKET_IN (xid=0x0): cookie=0xb total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
485 mpls(label:1000,tc:7,ttl:64,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:55:55:55:55:55,dl_dst=50:54:00:00:00:07
486 dnl
487 NXT_PACKET_IN (xid=0x0): cookie=0xb total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
488 mpls(label:1000,tc:7,ttl:64,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:55:55:55:55:55,dl_dst=50:54:00:00:00:07
489 ])
490
491 dnl Modified MPLS ipv6 controller action.
492 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
493
494 for i in 1 2 3; do
495     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)'
496 done
497
498 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
499 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
500 NXT_PACKET_IN (xid=0x0): cookie=0xc total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
501 mplsm(label:1000,tc:7,ttl:64,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=70:77:77:77:77:77,dl_dst=50:54:00:00:00:07
502 dnl
503 NXT_PACKET_IN (xid=0x0): cookie=0xc total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
504 mplsm(label:1000,tc:7,ttl:64,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=70:77:77:77:77:77,dl_dst=50:54:00:00:00:07
505 dnl
506 NXT_PACKET_IN (xid=0x0): cookie=0xc total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
507 mplsm(label:1000,tc:7,ttl:64,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=70:77:77:77:77:77,dl_dst=50:54:00:00:00:07
508 ])
509
510
511 dnl Modified MPLS pop action.
512 dnl The input is a frame with two MPLS headers which tcpdump -vve shows as:
513 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)
514 dnl             (tos 0x0, ttl 64, id 0, offset 0, flags [none], proto TCP (6), length 44)
515
516 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
517
518 for i in 1 2 3; do
519     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'
520 done
521 #for i in 2 3; do
522 #    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)'
523 #done
524
525 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
526 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
527 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered)
528 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
529 dnl
530 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered)
531 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
532 dnl
533 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered)
534 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
535 ])
536
537 dnl Checksum TCP.
538 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --no-chdir --pidfile 2> ofctl_monitor.log])
539
540 for i in 1 ; do
541     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)'
542 done
543
544 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
545 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
546 NXT_PACKET_IN (xid=0x0): cookie=0x1 total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
547 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
548 dnl
549 NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x3 total_len=64 in_port=1 reg0=0x1 (via action) data_len=64 (unbuffered)
550 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
551 dnl
552 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)
553 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
554 dnl
555 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)
556 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
557 dnl
558 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)
559 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
560 dnl
561 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)
562 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
563 dnl
564 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)
565 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
566 dnl
567 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)
568 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
569 dnl
570 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)
571 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
572 ])
573
574 dnl Checksum UDP.
575 AT_CHECK([ovs-ofctl monitor br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
576
577 for i in 1 ; do
578     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'
579 done
580
581 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
582 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
583 NXT_PACKET_IN (xid=0x0): cookie=0x1 total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
584 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
585 dnl
586 NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x3 total_len=64 in_port=1 reg0=0x1 (via action) data_len=64 (unbuffered)
587 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
588 dnl
589 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)
590 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
591 dnl
592 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)
593 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
594 dnl
595 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)
596 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
597 dnl
598 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)
599 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
600 dnl
601 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)
602 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
603 dnl
604 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)
605 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
606 dnl
607 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)
608 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
609 ])
610
611 AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
612 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
613  cookie=0x1, n_packets=2, n_bytes=120, dl_src=20:22:22:22:22:22 actions=CONTROLLER:65535,resubmit(80,1)
614  cookie=0x2, n_packets=3, n_bytes=180, dl_src=30:33:33:33:33:33 actions=mod_vlan_vid:15,CONTROLLER:65535
615  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)
616  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)
617  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)
618  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)
619  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)
620  cookie=0x8, table=6, n_packets=2, n_bytes=120, in_port=85 actions=mod_tp_src:85,CONTROLLER:65535,resubmit(86,7)
621  cookie=0x9, table=7, n_packets=2, n_bytes=120, in_port=86 actions=mod_tp_dst:86,CONTROLLER:65535,CONTROLLER:65535
622  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
623  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
624  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
625  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
626  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
627  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
628  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
629  cookie=0xb, n_packets=3, n_bytes=180, dl_src=50:55:55:55:55:55,dl_type=0x8847 actions=load:0x3e8->OXM_OF_MPLS_LABEL[[]],CONTROLLER:65535
630  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
631  cookie=0xd, n_packets=3, n_bytes=186, dl_src=60:66:66:66:66:66 actions=pop_mpls:0x0800,CONTROLLER:65535
632  n_packets=3, n_bytes=180, dl_src=10:11:11:11:11:11 actions=CONTROLLER:65535
633 NXST_FLOW reply:
634 ])
635
636 OVS_VSWITCHD_STOP
637 AT_CLEANUP
638
639 AT_SETUP([ofproto-dpif - VLAN handling])
640 OVS_VSWITCHD_START(
641   [set Bridge br0 fail-mode=standalone -- \
642    add-port br0 p1                                  trunks=10,12 -- \
643    add-port br0 p2                           tag=10              -- \
644    add-port br0 p3                           tag=12              \
645                    other-config:priority-tags=true               -- \
646    add-port br0 p4                           tag=12              -- \
647    add-port br0 p5 vlan_mode=native-tagged   tag=10              -- \
648    add-port br0 p6 vlan_mode=native-tagged   tag=10 trunks=10,12 -- \
649    add-port br0 p7 vlan_mode=native-untagged tag=12              -- \
650    add-port br0 p8 vlan_mode=native-untagged tag=12 trunks=10,12 \
651                    other-config:priority-tags=true               -- \
652    set Interface p1 type=dummy -- \
653    set Interface p2 type=dummy -- \
654    set Interface p3 type=dummy -- \
655    set Interface p4 type=dummy -- \
656    set Interface p5 type=dummy -- \
657    set Interface p6 type=dummy -- \
658    set Interface p7 type=dummy -- \
659    set Interface p8 type=dummy --])
660
661 dnl Each of these specifies an in_port by number, a VLAN VID (or "none"),
662 dnl a VLAN PCP (used if the VID isn't "none") and the expected set of datapath
663 dnl actions.
664 for tuple in \
665         "100 none 0 drop" \
666         "100 0    0 drop" \
667         "100 0    1 drop" \
668         "100 10   0 1,5,6,7,8,pop_vlan,2" \
669         "100 10   1 1,5,6,7,8,pop_vlan,2" \
670         "100 11   0 5,7" \
671         "100 11   1 5,7" \
672         "100 12   0 1,5,6,pop_vlan,3,4,7,8" \
673         "100 12   1 1,5,6,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
674         "1  none 0 drop" \
675         "1  0    0 drop" \
676         "1  0    1 drop" \
677         "1  10   0 5,6,7,8,100,pop_vlan,2" \
678         "1  10   1 5,6,7,8,100,pop_vlan,2" \
679         "1  11   0 drop" \
680         "1  11   1 drop" \
681         "1  12   0 5,6,100,pop_vlan,3,4,7,8" \
682         "1  12   1 5,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
683         "2  none 0 push_vlan(vid=10,pcp=0),1,5,6,7,8,100" \
684         "2  0    0 pop_vlan,push_vlan(vid=10,pcp=0),1,5,6,7,8,100" \
685         "2  0    1 pop_vlan,push_vlan(vid=10,pcp=1),1,5,6,7,8,100" \
686         "2  10   0 drop" \
687         "2  10   1 drop" \
688         "2  11   0 drop" \
689         "2  11   1 drop" \
690         "2  12   0 drop" \
691         "2  12   1 drop" \
692         "3  none 0 4,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
693         "3  0    0 pop_vlan,4,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
694         "3  0    1 8,pop_vlan,4,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
695         "3  10   0 drop" \
696         "3  10   1 drop" \
697         "3  11   0 drop" \
698         "3  11   1 drop" \
699         "3  12   0 drop" \
700         "3  12   1 drop" \
701         "4  none 0 3,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
702         "4  0    0 pop_vlan,3,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
703         "4  0    1 3,8,pop_vlan,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
704         "4  10   0 drop" \
705         "4  10   1 drop" \
706         "4  11   0 drop" \
707         "4  11   1 drop" \
708         "4  12   0 drop" \
709         "4  12   1 drop" \
710         "5  none 0 2,push_vlan(vid=10,pcp=0),1,6,7,8,100" \
711         "5  0    0 pop_vlan,2,push_vlan(vid=10,pcp=0),1,6,7,8,100" \
712         "5  0    1 pop_vlan,2,push_vlan(vid=10,pcp=1),1,6,7,8,100" \
713         "5  10   0 1,6,7,8,100,pop_vlan,2" \
714         "5  10   1 1,6,7,8,100,pop_vlan,2" \
715         "5  11   0 7,100" \
716         "5  11   1 7,100" \
717         "5  12   0 1,6,100,pop_vlan,3,4,7,8" \
718         "5  12   1 1,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
719         "6  none 0 2,push_vlan(vid=10,pcp=0),1,5,7,8,100" \
720         "6  0    0 pop_vlan,2,push_vlan(vid=10,pcp=0),1,5,7,8,100" \
721         "6  0    1 pop_vlan,2,push_vlan(vid=10,pcp=1),1,5,7,8,100" \
722         "6  10   0 1,5,7,8,100,pop_vlan,2" \
723         "6  10   1 1,5,7,8,100,pop_vlan,2" \
724         "6  11   0 drop" \
725         "6  11   1 drop" \
726         "6  12   0 1,5,100,pop_vlan,3,4,7,8" \
727         "6  12   1 1,5,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
728         "7  none 0 3,4,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
729         "7  0    0 pop_vlan,3,4,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
730         "7  0    1 3,8,pop_vlan,4,push_vlan(vid=12,pcp=1),1,5,6,100" \
731         "7  10   0 1,5,6,8,100,pop_vlan,2" \
732         "7  10   1 1,5,6,8,100,pop_vlan,2" \
733         "7  11   0 5,100" \
734         "7  11   1 5,100" \
735         "7  12   0 1,5,6,100,pop_vlan,3,4,8" \
736         "7  12   1 1,5,6,100,pop_vlan,4,push_vlan(vid=0,pcp=1),3,8" \
737         "8  none 0 3,4,7,push_vlan(vid=12,pcp=0),1,5,6,100" \
738         "8  0    0 pop_vlan,3,4,7,push_vlan(vid=12,pcp=0),1,5,6,100" \
739         "8  0    1 3,pop_vlan,4,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
740         "8  10   0 1,5,6,7,100,pop_vlan,2" \
741         "8  10   1 1,5,6,7,100,pop_vlan,2" \
742         "8  11   0 drop" \
743         "8  11   1 drop" \
744         "8  12   0 1,5,6,100,pop_vlan,3,4,7" \
745         "8  12   1 1,5,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3"
746 do
747   set $tuple
748   in_port=$1
749   vlan=$2
750   pcp=$3
751   expected=$4
752
753   if test $vlan = none; then
754     flow="in_port($in_port),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff),eth_type(0xabcd)"
755   else
756     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))"
757   fi
758
759   echo "----------------------------------------------------------------------"
760   echo "in_port=$in_port vlan=$vlan pcp=$pcp"
761
762   AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
763   actual=`tail -1 stdout | sed 's/Datapath actions: //'`
764
765   AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
766   mv stdout expout
767   AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
768 done
769
770 OVS_VSWITCHD_STOP
771 AT_CLEANUP
772
773 AT_SETUP([ofproto-dpif - fragment handling])
774 OVS_VSWITCHD_START
775 ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6], [90])
776 AT_DATA([flows.txt], [dnl
777 priority=75 tcp ip_frag=no    tp_dst=80 actions=output:1
778 priority=75 tcp ip_frag=first tp_dst=80 actions=output:2
779 priority=75 tcp ip_frag=later tp_dst=80 actions=output:3
780 priority=50 tcp ip_frag=no              actions=output:4
781 priority=50 tcp ip_frag=first           actions=output:5
782 priority=50 tcp ip_frag=later           actions=output:6
783 ])
784 AT_CHECK([ovs-ofctl replace-flows br0 flows.txt])
785
786 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"
787 no_flow="$base_flow,frag=no),tcp(src=12345,dst=80)"
788 first_flow="$base_flow,frag=first),tcp(src=12345,dst=80)"
789 later_flow="$base_flow,frag=later)"
790
791     # mode    no  first  later
792 for tuple in \
793     'normal    1     5      6' \
794     'drop      1  drop   drop' \
795     'nx-match  1     2      6'
796 do
797   set $tuple
798   mode=$1
799   no=$2
800   first=$3
801   later=$4
802
803   AT_CHECK([ovs-ofctl set-frags br0 $mode])
804   for type in no first later; do
805     eval flow=\$${type}_flow exp_output=\$$type
806     AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
807     AT_CHECK_UNQUOTED([tail -1 stdout], [0], [Datapath actions: $exp_output
808 ])
809   done
810 done
811 OVS_VSWITCHD_STOP
812 AT_CLEANUP
813
814 AT_SETUP([ofproto-dpif - exit])
815 OVS_VSWITCHD_START
816 ADD_OF_PORTS([br0], [1], [2], [3], [10], [11], [12], [13], [14])
817 AT_DATA([flows.txt], [dnl
818 in_port=1 actions=output:10,exit,output:11
819 in_port=2 actions=output:12,resubmit:1,output:12
820 in_port=3 actions=output:13,resubmit:2,output:14
821 ])
822 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
823 AT_CHECK([ovs-appctl ofproto/trace 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=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
824 AT_CHECK([tail -1 stdout], [0],
825   [Datapath actions: 10
826 ])
827 AT_CHECK([ovs-appctl ofproto/trace br0 '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])
828 AT_CHECK([tail -1 stdout], [0],
829   [Datapath actions: 12,10
830 ])
831 AT_CHECK([ovs-appctl ofproto/trace br0 '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])
832 AT_CHECK([tail -1 stdout], [0],
833   [Datapath actions: 13,12,10
834 ])
835 OVS_VSWITCHD_STOP
836 AT_CLEANUP
837
838
839 AT_SETUP([ofproto-dpif - mirroring, select_all])
840 OVS_VSWITCHD_START
841 ADD_OF_PORTS([br0], 1, 2, 3)
842 ovs-vsctl \
843         set Bridge br0 mirrors=@m --\
844         --id=@p3 get Port p3 --\
845         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
846
847 AT_DATA([flows.txt], [dnl
848 in_port=1 actions=output:2
849 in_port=2 actions=output:1
850 ])
851 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
852
853 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)"
854 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
855 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
856   [Datapath actions: 2,3
857 ])
858
859 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)"
860 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
861 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
862   [Datapath actions: 1,3
863 ])
864
865 OVS_VSWITCHD_STOP
866 AT_CLEANUP
867
868
869 AT_SETUP([ofproto-dpif - mirroring, select_src])
870 OVS_VSWITCHD_START
871 ADD_OF_PORTS([br0], 1, 2, 3)
872 ovs-vsctl \
873         set Bridge br0 mirrors=@m --\
874         --id=@p1 get Port p1 -- --id=@p3 get Port p3 --\
875         --id=@m create Mirror name=mymirror select_src_port=@p1 output_port=@p3
876
877 AT_DATA([flows.txt], [dnl
878 in_port=1 actions=output:2
879 in_port=2 actions=output:1
880 ])
881 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
882
883 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)"
884 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
885 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
886   [Datapath actions: 2,3
887 ])
888
889 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)"
890 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
891 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
892   [Datapath actions: 1
893 ])
894 OVS_VSWITCHD_STOP
895 AT_CLEANUP
896
897 AT_SETUP([ofproto-dpif - mirroring, OFPP_NONE ingress port])
898 OVS_VSWITCHD_START
899 ADD_OF_PORTS([br0], 1, 2)
900 ovs-vsctl \
901         set Bridge br0 mirrors=@m --\
902         --id=@p2 get Port p2 --\
903         --id=@m create Mirror name=mymirror select_all=true output_port=@p2
904
905 AT_CHECK([ovs-ofctl add-flow br0 action=output:1])
906
907 # "in_port" defaults to OFPP_NONE if it's not specified.
908 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"
909 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
910 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
911   [Datapath actions: 1,2
912 ])
913
914 OVS_VSWITCHD_STOP
915 AT_CLEANUP
916
917
918 AT_SETUP([ofproto-dpif - mirroring, select_dst])
919 OVS_VSWITCHD_START
920 ADD_OF_PORTS([br0], 1, 2, 3)
921 ovs-vsctl \
922         set Bridge br0 mirrors=@m --\
923         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
924         --id=@m create Mirror name=mymirror select_dst_port=@p2 output_port=@p3
925
926 AT_DATA([flows.txt], [dnl
927 in_port=1 actions=output:2
928 in_port=2 actions=output:1
929 ])
930 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
931
932 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)"
933 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
934 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
935   [Datapath actions: 2,3
936 ])
937
938 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)"
939 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
940 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
941   [Datapath actions: 1
942 ])
943
944 OVS_VSWITCHD_STOP
945 AT_CLEANUP
946
947
948 AT_SETUP([ofproto-dpif - mirroring, select_vlan])
949 OVS_VSWITCHD_START
950 ADD_OF_PORTS([br0], 1, 2, 3)
951 ovs-vsctl \
952         set Bridge br0 mirrors=@m --\
953         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
954         --id=@m create Mirror name=mymirror select_all=true select_vlan=11 output_port=@p3
955
956 AT_DATA([flows.txt], [dnl
957 in_port=1, actions=output:2
958 ])
959 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
960
961 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)"
962 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
963 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
964   [Datapath actions: 2
965 ])
966
967 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))"
968 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
969 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
970   [Datapath actions: 2
971 ])
972
973 flow="in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x8100),vlan(vid=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))"
974 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
975 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
976   [Datapath actions: 2,3
977 ])
978
979 OVS_VSWITCHD_STOP
980 AT_CLEANUP
981
982
983 AT_SETUP([ofproto-dpif - mirroring, output_port])
984 OVS_VSWITCHD_START
985 ADD_OF_PORTS([br0], 1, 2, 3)
986 ovs-vsctl \
987         set Bridge br0 mirrors=@m --\
988         --id=@p3 get Port p3 --\
989         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
990
991 AT_DATA([flows.txt], [dnl
992 in_port=1 actions=mod_vlan_vid:17,output:2
993 in_port=2 actions=output:1
994 ])
995 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
996
997 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)"
998 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
999 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1000   [Datapath actions: push_vlan(vid=17,pcp=0),2,pop_vlan,3
1001 ])
1002
1003 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)"
1004 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
1005 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1006   [Datapath actions: 1,3
1007 ])
1008
1009 OVS_VSWITCHD_STOP
1010 AT_CLEANUP
1011
1012 AT_SETUP([ofproto-dpif - mirroring, output_vlan])
1013 OVS_VSWITCHD_START
1014 ADD_OF_PORTS([br0], 1, 2)
1015 ovs-vsctl \
1016         set Bridge br0 mirrors=@m --\
1017         --id=@m create Mirror name=mymirror select_all=true output_vlan=12
1018
1019 AT_DATA([flows.txt], [dnl
1020 in_port=1 actions=output:2
1021 in_port=2 actions=mod_vlan_vid:17,output:1
1022 ])
1023 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1024
1025 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)"
1026 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
1027 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1028
1029 expected="2,push_vlan(vid=12,pcp=0),1,2,100"
1030 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
1031 mv stdout expout
1032 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
1033
1034 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)"
1035 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
1036 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1037
1038 expected="push_vlan(vid=17,pcp=0),1,pop_vlan,push_vlan(vid=12,pcp=0),1,2,100"
1039 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
1040 mv stdout expout
1041 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
1042
1043 OVS_VSWITCHD_STOP
1044 AT_CLEANUP
1045
1046 m4_define([OFPROTO_TRACE],
1047   [flow="$2"
1048    AT_CHECK([ovs-appctl ofproto/trace $1 "$flow" $3], [0], [stdout])
1049    actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1050    expected="$4"
1051    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" $5],
1052      [0], [stdout])
1053    mv stdout expout
1054    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" $5],
1055      [0], [expout])])
1056
1057 AT_SETUP([ofproto-dpif - MAC learning])
1058 OVS_VSWITCHD_START([set bridge br0 fail-mode=standalone])
1059 ADD_OF_PORTS([br0], 1, 2, 3)
1060
1061 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)'
1062
1063 # Trace an ARP packet arriving on p3, to create a MAC learning entry.
1064 OFPROTO_TRACE(
1065   [br0],
1066   [in_port(3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
1067   [-generate],
1068   [1,2,100])
1069
1070 # Check for the MAC learning entry.
1071 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1072  port  VLAN  MAC                Age
1073     3     0  50:54:00:00:00:05    ?
1074 ])
1075
1076 # Trace a packet arrival destined for the learned MAC.
1077 # (This will also learn a MAC.)
1078 OFPROTO_TRACE(
1079   [br0],
1080   [in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05),$arp],
1081   [-generate],
1082   [3])
1083
1084 # Check for both MAC learning entries.
1085 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1086  port  VLAN  MAC                Age
1087     3     0  50:54:00:00:00:05    ?
1088     1     0  50:54:00:00:00:06    ?
1089 ])
1090
1091 # Trace a packet arrival that updates the first learned MAC entry.
1092 OFPROTO_TRACE(
1093   [br0],
1094   [in_port(2),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
1095   [-generate],
1096   [1,3,100])
1097
1098 # Check that the MAC learning entry was updated.
1099 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1100  port  VLAN  MAC                Age
1101     1     0  50:54:00:00:00:06    ?
1102     2     0  50:54:00:00:00:05    ?
1103 ])
1104
1105 # Add another bridge.
1106 AT_CHECK(
1107   [ovs-vsctl \
1108      -- add-br br1 \
1109      -- set bridge br1 datapath-type=dummy \
1110      -- add-port br1 p4 -- set interface p4 type=dummy \
1111      -- add-port br1 p5 -- set interface p5 type=dummy])
1112
1113 # Trace some packet arrivals in br1 to create MAC learning entries there too.
1114 OFPROTO_TRACE(
1115   [br1],
1116   [in_port(4),eth(src=50:54:00:00:00:06,dst=ff:ff:ff:ff:ff:ff),$arp],
1117   [-generate],
1118   [5,101])
1119 OFPROTO_TRACE(
1120   [br1],
1121   [in_port(5),eth(src=50:54:00:00:00:07,dst=ff:ff:ff:ff:ff:ff),$arp],
1122   [-generate],
1123   [4,101])
1124
1125 # Check that the MAC learning entries were added.
1126 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1127  port  VLAN  MAC                Age
1128     4     0  50:54:00:00:00:06    ?
1129     5     0  50:54:00:00:00:07    ?
1130 ])
1131
1132 # Delete port p1 and see that its MAC learning entry disappeared, and
1133 # that the MAC learning entry for the same MAC was also deleted from br1.
1134 AT_CHECK([ovs-vsctl del-port p1])
1135 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1136  port  VLAN  MAC                Age
1137     2     0  50:54:00:00:00:05    ?
1138 ])
1139 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1140  port  VLAN  MAC                Age
1141     5     0  50:54:00:00:00:07    ?
1142 ])
1143
1144 OVS_VSWITCHD_STOP
1145 AT_CLEANUP
1146
1147 AT_SETUP([ofproto-dpif - MAC table overflow])
1148 OVS_VSWITCHD_START(
1149   [set bridge br0 fail-mode=standalone other-config:mac-table-size=10 -- \
1150    add-port br0 p1 -- set Interface p1 type=dummy -- \
1151    add-port br0 p2 -- set Interface p2 type=dummy -- \
1152    add-port br0 p3 -- set Interface p3 type=dummy])
1153
1154 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)'
1155
1156 AT_CHECK([ovs-appctl time/stop])
1157
1158 # Trace 10 ARP packets arriving on p3, to create MAC learning entries.
1159 for i in 0 1 2 3 4 5 6 7 8 9; do
1160     OFPROTO_TRACE(
1161       [br0],
1162       [in_port(3),eth(src=50:54:00:00:00:0$i,dst=ff:ff:ff:ff:ff:ff),$arp],
1163       [-generate],
1164       [1,2,100])
1165     ovs-appctl time/warp 1000
1166 done
1167
1168 # Check for the MAC learning entries.
1169 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/ *[[0-9]]\{1,\}$//' | sort],
1170   [0], [dnl
1171     3     0  50:54:00:00:00:00
1172     3     0  50:54:00:00:00:01
1173     3     0  50:54:00:00:00:02
1174     3     0  50:54:00:00:00:03
1175     3     0  50:54:00:00:00:04
1176     3     0  50:54:00:00:00:05
1177     3     0  50:54:00:00:00:06
1178     3     0  50:54:00:00:00:07
1179     3     0  50:54:00:00:00:08
1180     3     0  50:54:00:00:00:09
1181  port  VLAN  MAC                Age
1182 ])
1183
1184 # Trace another ARP packet on another MAC.
1185 OFPROTO_TRACE(
1186   [br0],
1187   [in_port(3),eth(src=50:54:00:00:00:10,dst=ff:ff:ff:ff:ff:ff),$arp],
1188   [-generate],
1189   [1,2,100])
1190
1191 # Check that the new one chased the oldest one out of the table.
1192 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/' | sort],
1193   [0], [dnl
1194     3     0  50:54:00:00:00:01    ?
1195     3     0  50:54:00:00:00:02    ?
1196     3     0  50:54:00:00:00:03    ?
1197     3     0  50:54:00:00:00:04    ?
1198     3     0  50:54:00:00:00:05    ?
1199     3     0  50:54:00:00:00:06    ?
1200     3     0  50:54:00:00:00:07    ?
1201     3     0  50:54:00:00:00:08    ?
1202     3     0  50:54:00:00:00:09    ?
1203     3     0  50:54:00:00:00:10    ?
1204  port  VLAN  MAC                Age
1205 ])
1206 OVS_VSWITCHD_STOP
1207 AT_CLEANUP
1208
1209 dnl Test that sFlow samples packets correctly.
1210 AT_SETUP([ofproto-dpif - sFlow packet sampling])
1211 AT_CHECK([perl $srcdir/choose-port.pl], [0], [stdout])
1212 SFLOW_PORT=`cat stdout`
1213 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
1214
1215 ovs-appctl time/stop
1216
1217 ADD_OF_PORTS([br0], 1, 2)
1218 ovs-vsctl \
1219    set Interface br0 options:ifindex=1002 -- \
1220    set Interface p1 options:ifindex=1004 -- \
1221    set Interface p2 options:ifindex=1003 -- \
1222    set Bridge br0 sflow=@sf -- \
1223    --id=@sf create sflow targets=\"127.0.0.1:$SFLOW_PORT\" \
1224      header=128 sampling=1 polling=1
1225 ON_EXIT([kill `cat test-sflow.pid`])
1226 AT_CHECK([test-sflow --detach --no-chdir --pidfile $SFLOW_PORT:127.0.0.1 > sflow.log])
1227 AT_CAPTURE_FILE([sflow.log])
1228
1229 dnl open with ARP packets to seed the bridge-learning.  The output
1230 dnl ifIndex numbers should be reported predictably after that.
1231 dnl Since we set sampling=1 we should see all of these packets
1232 dnl reported. Sorting the output by data-source and seqNo makes
1233 dnl it deterministic. Ensuring that we send at least two packets
1234 dnl into each port means we get to check the seq nos are
1235 dnl incrementing correctly.
1236
1237 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)'
1238 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)'
1239 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)'
1240 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)'
1241 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)'
1242
1243 dnl sleep long enough to get more than one counter sample
1244 dnl from each datasource so we can check sequence numbers
1245 for i in `seq 1 30`; do
1246     ovs-appctl time/warp 100
1247 done
1248 OVS_VSWITCHD_STOP
1249 ovs-appctl -t test-sflow exit
1250
1251 AT_CHECK([[sort sflow.log | $EGREP 'HEADER|ERROR' | sed 's/ /\
1252         /g']], [0], [dnl
1253 HEADER
1254         dgramSeqNo=1
1255         ds=127.0.0.1>0:1003
1256         fsSeqNo=1
1257         in_vlan=0
1258         in_priority=0
1259         out_vlan=0
1260         out_priority=0
1261         meanSkip=1
1262         samplePool=1
1263         dropEvents=0
1264         in_ifindex=1003
1265         in_format=0
1266         out_ifindex=2
1267         out_format=2
1268         hdr_prot=1
1269         pkt_len=64
1270         stripped=4
1271         hdr_len=60
1272         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
1273 HEADER
1274         dgramSeqNo=1
1275         ds=127.0.0.1>0:1003
1276         fsSeqNo=2
1277         in_vlan=0
1278         in_priority=0
1279         out_vlan=0
1280         out_priority=0
1281         meanSkip=1
1282         samplePool=2
1283         dropEvents=0
1284         in_ifindex=1003
1285         in_format=0
1286         out_ifindex=1004
1287         out_format=0
1288         hdr_prot=1
1289         pkt_len=64
1290         stripped=4
1291         hdr_len=60
1292         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
1293 HEADER
1294         dgramSeqNo=1
1295         ds=127.0.0.1>0:1003
1296         fsSeqNo=3
1297         in_vlan=0
1298         in_priority=0
1299         out_vlan=0
1300         out_priority=0
1301         meanSkip=1
1302         samplePool=3
1303         dropEvents=0
1304         in_ifindex=1003
1305         in_format=0
1306         out_ifindex=1004
1307         out_format=0
1308         hdr_prot=1
1309         pkt_len=64
1310         stripped=4
1311         hdr_len=60
1312         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
1313 HEADER
1314         dgramSeqNo=1
1315         ds=127.0.0.1>0:1004
1316         fsSeqNo=1
1317         in_vlan=0
1318         in_priority=0
1319         out_vlan=0
1320         out_priority=0
1321         meanSkip=1
1322         samplePool=1
1323         dropEvents=0
1324         in_ifindex=1004
1325         in_format=0
1326         out_ifindex=2
1327         out_format=2
1328         hdr_prot=1
1329         pkt_len=64
1330         stripped=4
1331         hdr_len=60
1332         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
1333 HEADER
1334         dgramSeqNo=1
1335         ds=127.0.0.1>0:1004
1336         fsSeqNo=2
1337         in_vlan=0
1338         in_priority=0
1339         out_vlan=0
1340         out_priority=0
1341         meanSkip=1
1342         samplePool=2
1343         dropEvents=0
1344         in_ifindex=1004
1345         in_format=0
1346         out_ifindex=1003
1347         out_format=0
1348         hdr_prot=1
1349         pkt_len=64
1350         stripped=4
1351         hdr_len=60
1352         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
1353 ])
1354
1355 AT_CHECK([[sort sflow.log | $EGREP 'IFCOUNTERS|ERROR' | head -6 | sed 's/ /\
1356         /g']], [0], [dnl
1357 IFCOUNTERS
1358         dgramSeqNo=2
1359         ds=127.0.0.1>0:1002
1360         csSeqNo=1
1361         ifindex=1002
1362         type=6
1363         ifspeed=100000000
1364         direction=0
1365         status=3
1366         in_octets=0
1367         in_unicasts=0
1368         in_multicasts=0
1369         in_broadcasts=4294967295
1370         in_discards=0
1371         in_errors=0
1372         in_unknownprotos=4294967295
1373         out_octets=120
1374         out_unicasts=2
1375         out_multicasts=4294967295
1376         out_broadcasts=4294967295
1377         out_discards=0
1378         out_errors=0
1379         promiscuous=0
1380 IFCOUNTERS
1381         dgramSeqNo=2
1382         ds=127.0.0.1>0:1003
1383         csSeqNo=1
1384         ifindex=1003
1385         type=6
1386         ifspeed=100000000
1387         direction=0
1388         status=0
1389         in_octets=98
1390         in_unicasts=3
1391         in_multicasts=0
1392         in_broadcasts=4294967295
1393         in_discards=0
1394         in_errors=0
1395         in_unknownprotos=4294967295
1396         out_octets=120
1397         out_unicasts=2
1398         out_multicasts=4294967295
1399         out_broadcasts=4294967295
1400         out_discards=0
1401         out_errors=0
1402         promiscuous=0
1403 IFCOUNTERS
1404         dgramSeqNo=2
1405         ds=127.0.0.1>0:1004
1406         csSeqNo=1
1407         ifindex=1004
1408         type=6
1409         ifspeed=100000000
1410         direction=0
1411         status=0
1412         in_octets=84
1413         in_unicasts=2
1414         in_multicasts=0
1415         in_broadcasts=4294967295
1416         in_discards=0
1417         in_errors=0
1418         in_unknownprotos=4294967295
1419         out_octets=180
1420         out_unicasts=3
1421         out_multicasts=4294967295
1422         out_broadcasts=4294967295
1423         out_discards=0
1424         out_errors=0
1425         promiscuous=0
1426 IFCOUNTERS
1427         dgramSeqNo=3
1428         ds=127.0.0.1>0:1002
1429         csSeqNo=2
1430         ifindex=1002
1431         type=6
1432         ifspeed=100000000
1433         direction=0
1434         status=3
1435         in_octets=0
1436         in_unicasts=0
1437         in_multicasts=0
1438         in_broadcasts=4294967295
1439         in_discards=0
1440         in_errors=0
1441         in_unknownprotos=4294967295
1442         out_octets=120
1443         out_unicasts=2
1444         out_multicasts=4294967295
1445         out_broadcasts=4294967295
1446         out_discards=0
1447         out_errors=0
1448         promiscuous=0
1449 IFCOUNTERS
1450         dgramSeqNo=3
1451         ds=127.0.0.1>0:1003
1452         csSeqNo=2
1453         ifindex=1003
1454         type=6
1455         ifspeed=100000000
1456         direction=0
1457         status=0
1458         in_octets=98
1459         in_unicasts=3
1460         in_multicasts=0
1461         in_broadcasts=4294967295
1462         in_discards=0
1463         in_errors=0
1464         in_unknownprotos=4294967295
1465         out_octets=120
1466         out_unicasts=2
1467         out_multicasts=4294967295
1468         out_broadcasts=4294967295
1469         out_discards=0
1470         out_errors=0
1471         promiscuous=0
1472 IFCOUNTERS
1473         dgramSeqNo=3
1474         ds=127.0.0.1>0:1004
1475         csSeqNo=2
1476         ifindex=1004
1477         type=6
1478         ifspeed=100000000
1479         direction=0
1480         status=0
1481         in_octets=84
1482         in_unicasts=2
1483         in_multicasts=0
1484         in_broadcasts=4294967295
1485         in_discards=0
1486         in_errors=0
1487         in_unknownprotos=4294967295
1488         out_octets=180
1489         out_unicasts=3
1490         out_multicasts=4294967295
1491         out_broadcasts=4294967295
1492         out_discards=0
1493         out_errors=0
1494         promiscuous=0
1495 ])
1496 AT_CLEANUP
1497
1498
1499
1500 dnl Test that basic NetFlow reports flow statistics correctly:
1501 dnl - The initial packet of a flow are correctly accounted.
1502 dnl - Later packets within a flow are correctly accounted.
1503 dnl - Flow actions changing (in this case, due to MAC learning)
1504 dnl   cause a record to be sent.
1505 AT_SETUP([ofproto-dpif - NetFlow flow expiration])
1506
1507 AT_CHECK([perl $srcdir/choose-port.pl], [0], [stdout])
1508 NETFLOW_PORT=`cat stdout`
1509
1510 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
1511 ADD_OF_PORTS([br0], 1, 2)
1512 ovs-vsctl \
1513    set Bridge br0 netflow=@nf -- \
1514    --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
1515      engine_id=1 engine_type=2 active_timeout=30 add-id-to-interface=false
1516
1517 ON_EXIT([kill `cat test-netflow.pid`])
1518 AT_CHECK([test-netflow --detach --no-chdir --pidfile $NETFLOW_PORT:127.0.0.1 > netflow.log])
1519 AT_CAPTURE_FILE([netflow.log])
1520
1521 for delay in 1000 30000; do
1522     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)'
1523     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)'
1524
1525     ovs-appctl time/warp $delay
1526 done
1527
1528 sleep 1
1529 OVS_VSWITCHD_STOP
1530 ovs-appctl -t test-netflow exit
1531
1532 AT_CHECK([[sed -e 's/, uptime [0-9]*//
1533 s/, now [0-9.]*//
1534 s/time \([0-9]*\)\.\.\.\1$/time <moment>/
1535 s/time [0-9]*\.\.\.[0-9]*/time <range>/
1536 ' netflow.log | sort]], [0],
1537   [
1538 header: v5, seq 0, engine 2,1
1539 header: v5, seq 1, engine 2,1
1540 seq 0: 192.168.0.1 > 192.168.0.2, if 1 > 65535, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
1541 seq 1: 192.168.0.1 > 192.168.0.2, if 1 > 2, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
1542 seq 1: 192.168.0.2 > 192.168.0.1, if 2 > 1, 2 pkts, 120 bytes, ICMP 0:0, time <range>
1543 ])
1544 AT_CLEANUP
1545
1546 dnl Test that basic NetFlow reports active expirations correctly.
1547 AT_SETUP([ofproto-dpif - NetFlow active expiration])
1548
1549 AT_CHECK([perl $srcdir/choose-port.pl], [0], [stdout])
1550 NETFLOW_PORT=`cat stdout`
1551
1552 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
1553 ADD_OF_PORTS([br0], 1, 2)
1554 ovs-vsctl \
1555    set Bridge br0 netflow=@nf -- \
1556    --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
1557      engine_id=1 engine_type=2 active_timeout=10 add-id-to-interface=false
1558
1559 ON_EXIT([kill `cat test-netflow.pid`])
1560 AT_CHECK([test-netflow --detach --no-chdir --pidfile $NETFLOW_PORT:127.0.0.1 > netflow.log])AT_CAPTURE_FILE([netflow.log])
1561
1562 AT_CHECK([ovs-appctl time/stop])
1563 n=1
1564 while test $n -le 60; do
1565     n=`expr $n + 1`
1566
1567     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)'
1568     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)'
1569
1570     ovs-appctl time/warp 1000
1571 done
1572
1573 ovs-appctl time/warp 10000
1574
1575 sleep 1
1576 OVS_VSWITCHD_STOP
1577 ovs-appctl -t test-netflow exit
1578
1579 # Count the number of reported packets:
1580 # - From source to destination before MAC learning kicks in (just one).
1581 # - From source to destination after that.
1582 # - From destination to source.
1583 n_learn=0
1584 n_in=0
1585 n_out=0
1586 n_other=0
1587 n_recs=0
1588 none=0
1589 while read line; do
1590     pkts=`echo "$line" | sed 's/.*, \([[0-9]]*\) pkts,.*/\1/'`
1591     case $pkts in
1592          [[0-9]]*) ;;
1593          *) continue ;;
1594     esac
1595
1596     case $line in
1597         "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 65535, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
1598             counter=n_learn
1599             ;;
1600         "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 2, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
1601             counter=n_in
1602             ;;
1603         "seq "*": 192.168.0.2 > 192.168.0.1, if 2 > 1, "*" pkts, "*" bytes, TCP 80 > 1234, time "*)
1604             counter=n_out
1605             ;;
1606         *)
1607             counter=n_other
1608             ;;
1609     esac
1610     eval $counter=\`expr \$$counter + \$pkts\`
1611     n_recs=`expr $n_recs + 1`
1612 done < netflow.log
1613
1614 # There should be exactly 1 MAC learning packet,
1615 # exactly 59 other packets in that direction,
1616 # and exactly 60 packets in the other direction.
1617 AT_CHECK([echo $n_learn $n_in $n_out $n_other], [0], [1 59 60 0
1618 ])
1619
1620 # There should be 1 expiration for MAC learning,
1621 # at least 5 active and a final expiration in one direction,
1622 # and at least 5 active and a final expiration in the other direction.
1623 echo $n_recs
1624 AT_CHECK([test $n_recs -ge 13])
1625
1626 AT_CLEANUP
1627
1628 AT_SETUP([idle_age and hard_age increase over time])
1629 OVS_VSWITCHD_START
1630
1631 # get_ages DURATION HARD IDLE
1632 #
1633 # Fetch the flow duration, hard age, and idle age into the variables
1634 # whose names are given as arguments.  Rounds DURATION down to the
1635 # nearest integer.  If hard_age doesn't appear in the output, sets
1636 # HARD to "none".  If idle_age doesn't appear in the output, sets IDLE
1637 # to 0.
1638 get_ages () {
1639     AT_CHECK([ovs-ofctl dump-flows br0], [0], [stdout])
1640
1641     duration=`sed -n 's/.*duration=\([[0-9]]*\)\(\.[[0-9]]*\)\{0,1\}s.*/\1/p' stdout`
1642     AT_CHECK([[expr X"$duration" : 'X[0-9][0-9]*$']], [0], [ignore])
1643     AS_VAR_COPY([$1], [duration])
1644
1645     hard=`sed -n 's/.*hard_age=\([[0-9]]*\),.*/\1/p' stdout`
1646     if test X"$hard" = X; then
1647         hard=none
1648     else
1649         AT_CHECK([[expr X"$hard" : 'X[0-9][0-9]*$']], [0], [ignore])
1650     fi
1651     AS_VAR_COPY([$2], [hard])
1652
1653     idle=`sed -n 's/.*idle_age=\([[0-9]]*\),.*/\1/p' stdout`
1654     if test X"$idle" = X; then
1655         idle=0
1656     else
1657         AT_CHECK([[expr X"$idle" : 'X[0-9][0-9]*$']], [0], [ignore])
1658     fi
1659     AS_VAR_COPY([$3], [idle])
1660 }
1661
1662 # Add a flow and get its initial hard and idle age.
1663 AT_CHECK([ovs-ofctl add-flow br0 hard_timeout=199,idle_timeout=188,actions=drop])
1664 get_ages duration1 hard1 idle1
1665
1666 # Warp time forward by 10 seconds, then modify the flow's actions.
1667 ovs-appctl time/warp 10000
1668 get_ages duration2 hard2 idle2
1669 AT_CHECK([ovs-ofctl mod-flows br0 actions=flood])
1670
1671 # Warp time forward by 10 seconds.
1672 ovs-appctl time/warp 10000
1673 get_ages duration3 hard3 idle3
1674
1675 # Warp time forward 10 more seconds, then pass some packets through the flow,
1676 # then warp forward a few more times because idle times are only updated
1677 # occasionally.
1678 ovs-appctl time/warp 10000
1679 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)'
1680 ovs-appctl time/warp 1000
1681 ovs-appctl time/warp 1000
1682 ovs-appctl time/warp 1000
1683 get_ages duration4 hard4 idle4
1684
1685 printf "duration: %4s => %4s => %4s => %4s\n" $duration1 $duration2 $duration3 $duration4
1686 printf "hard_age: %4s => %4s => %4s => %4s\n" $hard1 $hard2 $hard3 $hard4
1687 printf "idle_age: %4s => %4s => %4s => %4s\n" $idle1 $idle2 $idle3 $idle4
1688
1689 # Duration should increase steadily over time.
1690 AT_CHECK([test $duration1 -lt $duration2])
1691 AT_CHECK([test $duration2 -lt $duration3])
1692 AT_CHECK([test $duration3 -lt $duration4])
1693
1694 # Hard age should be "none" initially because it's the same as flow_duration,
1695 # then it should increase.
1696 AT_CHECK([test $hard1 = none])
1697 AT_CHECK([test $hard2 = none])
1698 AT_CHECK([test $hard3 != none])
1699 AT_CHECK([test $hard4 != none])
1700 AT_CHECK([test $hard3 -lt $hard4])
1701
1702 # Idle age should increase from 1 to 2 to 3, then decrease.
1703 AT_CHECK([test $idle1 -lt $idle2])
1704 AT_CHECK([test $idle2 -lt $idle3])
1705 AT_CHECK([test $idle3 -gt $idle4])
1706
1707 # Check some invariant relationships.
1708 AT_CHECK([test $duration1 = $idle1])
1709 AT_CHECK([test $duration2 = $idle2])
1710 AT_CHECK([test $duration3 = $idle3])
1711 AT_CHECK([test $idle3 -gt $hard3])
1712 AT_CHECK([test $idle4 -lt $hard4])
1713 AT_CHECK([test $hard4 -lt $duration4])
1714
1715 OVS_VSWITCHD_STOP
1716 AT_CLEANUP
1717
1718 AT_SETUP([ofproto-dpif - fin_timeout])
1719 OVS_VSWITCHD_START
1720 AT_DATA([flows.txt], [dnl
1721 in_port=1 actions=output:2
1722 in_port=2 actions=mod_vlan_vid:17,output:1
1723 ])
1724 AT_CHECK([ovs-ofctl add-flow br0 'idle_timeout=60,actions=fin_timeout(idle_timeout=5)'])
1725 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1726 [NXST_FLOW reply:
1727  idle_timeout=60, actions=fin_timeout(idle_timeout=5)
1728 ])
1729 # Check that a TCP SYN packet does not change the timeout.  (Because
1730 # flow stats updates are mainly what implements the fin_timeout
1731 # feature, we warp forward a couple of times to ensure that flow stats
1732 # run before re-checking the flow table.)
1733 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f908004500003c2e2440004006465dac11370dac11370b828b0016751e267b00000000a00216d017360000020405b40402080a2d25085f0000000001030307], [0], [success
1734 ])
1735 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
1736 warped
1737 ])
1738 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1739 [NXST_FLOW reply:
1740  n_packets=1, n_bytes=74, idle_timeout=60, actions=fin_timeout(idle_timeout=5)
1741 ])
1742 # Check that a TCP FIN packet does change the timeout.
1743 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f90800451000342e3e40004006463bac11370dac11370b828b0016751e319dfc96399b801100717ae800000101080a2d250a9408579588], [0], [success
1744 ])
1745 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
1746 warped
1747 ])
1748 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1749 [NXST_FLOW reply:
1750  n_packets=2, n_bytes=140, idle_timeout=5, actions=fin_timeout(idle_timeout=5)
1751 ])
1752 OVS_VSWITCHD_STOP
1753 AT_CLEANUP
1754
1755 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-dps])
1756 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
1757 ADD_OF_PORTS([br0], [1], [2])
1758 ADD_OF_PORTS([br1], [3])
1759
1760 AT_CHECK([ovs-appctl dpif/dump-dps], [0], [dnl
1761 dummy@br0
1762 dummy@br1
1763 ])
1764 OVS_VSWITCHD_STOP
1765 AT_CLEANUP
1766
1767 AT_SETUP([ofproto-dpif - ovs-appctl dpif/show])
1768 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
1769 ADD_OF_PORTS([br0], [1], [2])
1770 ADD_OF_PORTS([br1], [3])
1771
1772 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
1773 br0 (dummy@ovs-dummy):
1774         lookups: hit:0 missed:0
1775         flows: cur: 0, avg: 0.000, max: 0, life span: 0(ms)
1776                 overall avg: add rate: 0.000/min, del rate: 0.000/min
1777         br0 65534/100: (dummy)
1778         p1 1/1: (dummy)
1779         p2 2/2: (dummy)
1780 br1 (dummy@ovs-dummy):
1781         lookups: hit:0 missed:0
1782         flows: cur: 0, avg: 0.000, max: 0, life span: 0(ms)
1783                 overall avg: add rate: 0.000/min, del rate: 0.000/min
1784         br1 65534/101: (dummy)
1785         p3 3/3: (dummy)
1786 ])
1787
1788 AT_CHECK([ovs-appctl dpif/show br0], [0], [dnl
1789 br0 (dummy@ovs-dummy):
1790         lookups: hit:0 missed:0
1791         flows: cur: 0, avg: 0.000, max: 0, life span: 0(ms)
1792                 overall avg: add rate: 0.000/min, del rate: 0.000/min
1793         br0 65534/100: (dummy)
1794         p1 1/1: (dummy)
1795         p2 2/2: (dummy)
1796 ])
1797 OVS_VSWITCHD_STOP
1798 AT_CLEANUP
1799
1800 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-flows])
1801 OVS_VSWITCHD_START([add-br br1 -- \
1802                     set bridge br1 datapath-type=dummy fail-mode=secure])
1803 ADD_OF_PORTS([br0], [1], [2])
1804 ADD_OF_PORTS([br1], [3])
1805
1806 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)'], [0], [success
1807 ])
1808 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)'], [0], [success
1809 ])
1810 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)'], [0], [success
1811 ])
1812
1813 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
1814 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))
1815 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))
1816 ])
1817
1818 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
1819 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))
1820 ])
1821
1822 OVS_VSWITCHD_STOP
1823 AT_CLEANUP
1824
1825 AT_SETUP([ofproto-dpif - ovs-appctl dpif/del-flows])
1826 OVS_VSWITCHD_START([add-br br1 -- \
1827                     set bridge br1 datapath-type=dummy fail-mode=secure])
1828 ADD_OF_PORTS([br0], [1], [2])
1829 ADD_OF_PORTS([br1], [3])
1830
1831 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)'], [0], [success
1832 ])
1833 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)'], [0], [success
1834 ])
1835 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)'], [0], [success
1836 ])
1837
1838 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
1839 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))
1840 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))
1841 ])
1842
1843 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
1844 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))
1845 ])
1846
1847 AT_CHECK([ovs-appctl dpif/del-flows br0])
1848 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
1849 ])
1850
1851 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
1852 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))
1853 ])
1854
1855 OVS_VSWITCHD_STOP
1856 AT_CLEANUP
1857
1858 AT_SETUP([ofproto-dpif - patch ports])
1859 OVS_VSWITCHD_START([add-br br1 \
1860 -- set bridge br1 datapath-type=dummy fail-mode=secure \
1861 -- add-port br1 pbr1 -- set int pbr1 type=patch options:peer=pbr0 \
1862 -- add-port br0 pbr0 -- set int pbr0 type=patch options:peer=pbr1])
1863
1864 ADD_OF_PORTS([br0], [2])
1865 ADD_OF_PORTS([br1], [3])
1866
1867 AT_CHECK([ovs-ofctl add-flow br0 actions=LOCAL,output:1,output:2])
1868 AT_CHECK([ovs-ofctl add-flow br1 actions=LOCAL,output:1,output:3])
1869
1870 for i in $(seq 1 10); do
1871     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)'
1872 done
1873
1874 for i in $(seq 1 5); do
1875     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)'
1876 done
1877
1878 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
1879 warped
1880 ])
1881
1882 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
1883 br0 (dummy@ovs-dummy):
1884         lookups: hit:9 missed:1
1885         flows: cur: 1, avg: 1.000, max: 1, life span: 0(ms)
1886                 overall avg: add rate: 0.000/min, del rate: 0.000/min
1887         br0 65534/100: (dummy)
1888         p2 2/2: (dummy)
1889         pbr0 1/none: (patch: peer=pbr1)
1890 br1 (dummy@ovs-dummy):
1891         lookups: hit:4 missed:1
1892         flows: cur: 1, avg: 1.000, max: 1, life span: 0(ms)
1893                 overall avg: add rate: 0.000/min, del rate: 0.000/min
1894         br1 65534/101: (dummy)
1895         p3 3/3: (dummy)
1896         pbr1 1/none: (patch: peer=pbr0)
1897 ])
1898
1899 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_USED], [0], [dnl
1900 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
1901 ]),
1902 AT_CHECK([ovs-appctl dpif/dump-flows br1 | STRIP_USED], [0], [dnl
1903 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
1904 ])
1905
1906 AT_CHECK([ovs-ofctl dump-ports br0 pbr0], [0], [dnl
1907 OFPST_PORT reply (xid=0x4): 1 ports
1908   port  1: rx pkts=5, bytes=300, drop=0, errs=0, frame=0, over=0, crc=0
1909            tx pkts=10, bytes=600, drop=0, errs=0, coll=0
1910 ])
1911
1912 AT_CHECK([ovs-ofctl dump-ports br1 pbr1], [0], [dnl
1913 OFPST_PORT reply (xid=0x4): 1 ports
1914   port  1: rx pkts=10, bytes=600, drop=0, errs=0, frame=0, over=0, crc=0
1915            tx pkts=5, bytes=300, drop=0, errs=0, coll=0
1916 ])
1917
1918 OVS_VSWITCHD_STOP
1919 AT_CLEANUP
1920
1921 AT_SETUP([ofproto-dpif - ovs-appctl dpif/show rates])
1922 OVS_VSWITCHD_START([set Bridge br0 fail-mode=secure])
1923 ADD_OF_PORTS([br0], 1, 2)
1924
1925 AT_CHECK([ovs-ofctl add-flow br0 actions=LOCAL,output:1,output:2])
1926
1927 for i in $(seq 1 61); do
1928     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)'
1929     ovs-appctl time/warp 10000
1930     ovs-appctl time/warp 50000
1931 done
1932
1933 AT_CHECK([ovs-appctl time/warp 10000], [0], [warped
1934 ])
1935
1936 AT_CHECK([ovs-appctl dpif/show | sed 's/ 10[[0-9]]\{3\}(ms)$/ 10000(ms)/'], [0], [dnl
1937 br0 (dummy@ovs-dummy):
1938         lookups: hit:0 missed:61
1939         flows: cur: 0, avg: 1.000, max: 1, life span: 10000(ms)
1940                 hourly avg: add rate: 0.641/min, del rate: 0.635/min
1941                 overall avg: add rate: 1.000/min, del rate: 0.984/min
1942         br0 65534/100: (dummy)
1943         p1 1/1: (dummy)
1944         p2 2/2: (dummy)
1945 ])
1946
1947 OVS_VSWITCHD_STOP
1948 AT_CLEANUP