improve make nodes
[sliver-openvswitch.git] / tests / ofproto-dpif.at
1 AT_BANNER([ofproto-dpif])
2
3 AT_SETUP([ofproto-dpif - resubmit])
4 OVS_VSWITCHD_START
5 AT_DATA([flows.txt], [dnl
6 table=0 in_port=1 priority=1000 icmp actions=output(10),resubmit(2),output(19),resubmit(3),output(21)
7 table=0 in_port=2 priority=1500 icmp actions=output(11),resubmit(,1),output(16),resubmit(2,1),output(18)
8 table=0 in_port=3 priority=2000 icmp actions=output(20)
9 table=1 in_port=1 priority=1000 icmp actions=output(12),resubmit(4,1),output(13),resubmit(3),output(15)
10 table=1 in_port=2 priority=1500 icmp actions=output(17),resubmit(,2)
11 table=1 in_port=3 priority=1500 icmp actions=output(14),resubmit(,2)
12 ])
13 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
14 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])
15 AT_CHECK([tail -1 stdout], [0],
16   [Datapath actions: 10,11,12,13,14,15,16,17,18,19,20,21
17 ])
18 OVS_VSWITCHD_STOP
19 AT_CLEANUP
20
21 AT_SETUP([ofproto-dpif - registers])
22 OVS_VSWITCHD_START
23 AT_DATA([flows.txt], [dnl
24 in_port=90                 actions=resubmit:2,resubmit:3,resubmit:4,resubmit:91
25 in_port=91                 actions=resubmit:5,resubmit:6,resubmit:7,resubmit:92
26 in_port=92                 actions=resubmit:8,resubmit:9,resubmit:10,resubmit:11,resubmit:93
27 in_port=93                 actions=resubmit:12,resubmit:13,resubmit:14,resubmit:15
28
29 in_port=2                  actions=load:0x000db000->NXM_NX_REG0[[]]
30 in_port=3                  actions=load:0xdea->NXM_NX_REG0[[20..31]]
31 in_port=4                  actions=load:0xeef->NXM_NX_REG0[[0..11]]
32 in_port=5                  actions=move:NXM_NX_REG0[[]]->NXM_NX_REG1[[]]
33 in_port=6                  actions=load:0x22222222->NXM_NX_REG2[[]]
34 in_port=7                  actions=move:NXM_NX_REG1[[20..31]]->NXM_NX_REG2[[0..11]]
35 in_port=8                  actions=move:NXM_NX_REG1[[0..11]]->NXM_NX_REG2[[20..31]]
36 in_port=9,reg0=0xdeadbeef  actions=output:20
37 in_port=10,reg1=0xdeadbeef actions=output:21
38 in_port=11,reg2=0xeef22dea actions=output:22
39
40 dnl Sanilty check all registers
41 in_port=12 actions=load:0x10->NXM_NX_REG0[[]],load:0x11->NXM_NX_REG1[[]],load:0x12->NXM_NX_REG2[[]]
42 in_port=13 actions=load:0x13->NXM_NX_REG3[[]],load:0x14->NXM_NX_REG4[[]],load:0x15->NXM_NX_REG5[[]]
43 in_port=14 actions=load:0x16->NXM_NX_REG6[[]],load:0x17->NXM_NX_REG7[[]]
44 in_port=15,reg0=0x10,reg1=0x11,reg2=0x12,reg3=0x13,reg4=0x14,reg5=0x15,reg6=0x16,reg7=0x17 actions=output:33
45 ])
46 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
47 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])
48 AT_CHECK([tail -1 stdout], [0],
49   [Datapath actions: 20,21,22,33
50 ])
51 OVS_VSWITCHD_STOP
52 AT_CLEANUP
53
54 AT_SETUP([ofproto-dpif - output])
55 OVS_VSWITCHD_START
56 AT_DATA([flows.txt], [dnl
57 in_port=1 actions=resubmit:2,resubmit:3,resubmit:4,resubmit:5,resubmit:6,resubmit:7
58 in_port=2 actions=output:9
59 in_port=3 actions=load:55->NXM_NX_REG0[[]],output:NXM_NX_REG0[[]],load:66->NXM_NX_REG1[[]]
60 in_port=4 actions=output:10,output:NXM_NX_REG0[[]],output:NXM_NX_REG1[[]],output:11
61 in_port=5 actions=load:77->NXM_NX_REG0[[0..15]],load:88->NXM_NX_REG0[[16..31]]
62 in_port=6 actions=output:NXM_NX_REG0[[0..15]],output:NXM_NX_REG0[[16..31]]
63 in_port=7 actions=load:0x110000ff->NXM_NX_REG0[[]],output:NXM_NX_REG0[[]]
64 ])
65 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
66 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])
67 AT_CHECK([tail -1 stdout], [0],
68   [Datapath actions: 9,55,10,55,66,11,77,88
69 ])
70 OVS_VSWITCHD_STOP
71 AT_CLEANUP
72
73 AT_SETUP([ofproto-dpif - dec_ttl])
74 OVS_VSWITCHD_START
75 AT_DATA([flows.txt], [dnl
76 table=0 in_port=1 action=dec_ttl,output:2,resubmit(1,1),output:4
77 table=1 in_port=1 action=dec_ttl,output:3
78 ])
79 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
80 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])
81 AT_CHECK([tail -2 stdout], [0],
82   [Datapath actions: set(ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=1,frag=no)),2,4
83 This flow is not cachable.
84 ])
85 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])
86 AT_CHECK([tail -1 stdout], [0],
87   [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
88 ])
89 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])
90 AT_CHECK([tail -1 stdout], [0],
91   [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
92 ])
93
94 AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl --detach --pidfile 2> ofctl_monitor.log])
95 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])
96 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
97 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
98 NXT_PACKET_IN (xid=0x0): table_id=1 total_len=42 in_port=1 tun_id=0x0 reg0=0x0 reg1=0x0 reg2=0x0 reg3=0x0 reg4=0x0 reg5=0x0 reg6=0x0 reg7=0x0 (via invalid_ttl) data_len=42 (unbuffered)
99 priority:0,tunnel:0,in_port:0000,tci(0) mac(50:54:00:00:00:05->50:54:00:00:00:07) type:0800 proto:1 tos:0 ttl:1 ip(192.168.0.1->192.168.0.2)
100 ])
101 OVS_VSWITCHD_STOP
102 AT_CLEANUP
103
104
105 AT_SETUP([ofproto-dpif - output, OFPP_NONE ingress port])
106 OVS_VSWITCHD_START(
107        [add-port br0 p1 -- set Interface p1 type=dummy --\
108         add-port br0 p2 -- set Interface p2 type=dummy])
109
110 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
111
112 # "in_port" defaults to OFPP_NONE if it's not specified.
113 flow="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)"
114 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
115 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
116
117 expected="0,1,2"
118 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
119 mv stdout expout
120 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
121
122 OVS_VSWITCHD_STOP
123 AT_CLEANUP
124
125 AT_SETUP([ofproto-dpif - DSCP])
126 OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=dummy])
127 AT_DATA([flows.txt], [dnl
128 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
129 ])
130 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
131 AT_CHECK([ovs-vsctl -- \
132         set Port p1 qos=@newqos --\
133         --id=@newqos create QoS type=linux-htb queues=1=@q1,2=@q2 --\
134         --id=@q1 create Queue dscp=1 --\
135         --id=@q2 create Queue dscp=2], [0], [ignore])
136 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])
137 AT_CHECK([tail -1 stdout], [0],
138   [Datapath actions: dnl
139 0,dnl
140 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0x7,ttl=128,frag=no)),set(priority(1)),1,dnl
141 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0xb,ttl=128,frag=no)),set(priority(2)),1,dnl
142 1,dnl
143 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0x7,ttl=128,frag=no)),set(priority(1)),1,dnl
144 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0xff,ttl=128,frag=no)),set(priority(0)),1,dnl
145 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0x3,ttl=128,frag=no)),1,dnl
146 0
147 ])
148 OVS_VSWITCHD_STOP
149 AT_CLEANUP
150
151 AT_SETUP([ofproto-dpif - output/flood flags])
152 OVS_VSWITCHD_START([dnl
153         add-port br0 p1 -- set Interface p1 type=dummy --\
154         add-port br0 p2 -- set Interface p2 type=dummy --\
155         add-port br0 p3 -- set Interface p3 type=dummy --\
156         add-port br0 p4 -- set Interface p4 type=dummy --\
157         add-port br0 p5 -- set Interface p5 type=dummy --\
158         add-port br0 p6 -- set Interface p6 type=dummy --\
159         add-port br0 p7 -- set Interface p7 type=dummy ])
160
161 AT_DATA([flows.txt], [dnl
162 in_port=local actions=local,flood
163 in_port=1 actions=flood
164 in_port=2 actions=all
165 in_port=3 actions=output:65534,output:1,output:2,output:3,output:4,output:5,output:6,output:7
166 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
167 ])
168 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
169 AT_CHECK([ovs-ofctl mod-port br0 5 noforward])
170 AT_CHECK([ovs-ofctl mod-port br0 6 noflood])
171
172 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(0),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
173 AT_CHECK([tail -1 stdout \
174 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
175 1
176 2
177 3
178 4
179 7
180 ])
181
182 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])
183 AT_CHECK([tail -1 stdout \
184 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
185 0
186 2
187 3
188 4
189 7
190 ])
191
192 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])
193 AT_CHECK([tail -1 stdout \
194 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
195 0
196 1
197 3
198 4
199 6
200 7
201 ])
202
203 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])
204 AT_CHECK([tail -1 stdout], [0],
205   [Datapath actions: 0,1,2,4,6,7
206 ])
207
208 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])
209 AT_CHECK([tail -1 stdout], [0],
210   [Datapath actions: set(priority(1)),0,1,2,set(priority(2)),3,set(priority(1)),6,7
211 ])
212 OVS_VSWITCHD_STOP
213 AT_CLEANUP
214
215 AT_SETUP([ofproto-dpif - set_tunnel])
216 OVS_VSWITCHD_START
217 AT_DATA([flows.txt], [dnl
218 in_port=90 actions=resubmit:1,resubmit:2,resubmit:3,resubmit:4,resubmit:5
219 in_port=1 actions=set_tunnel:1,output:1
220 in_port=2 actions=set_tunnel:1,output:2
221 in_port=3 actions=set_tunnel:2,set_tunnel:3,output:3
222 in_port=4 actions=set_tunnel:4,set_tunnel:3,output:4
223 in_port=5 actions=set_tunnel:5
224 ])
225 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
226 AT_CHECK([ovs-appctl ofproto/trace br0 'tun_id(0x1),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])
227 AT_CHECK([tail -1 stdout], [0],
228   [Datapath actions: set(tun_id(0x1)),1,2,set(tun_id(0x3)),3,4
229 ])
230 OVS_VSWITCHD_STOP
231 AT_CLEANUP
232
233 AT_SETUP([ofproto-dpif - controller])
234 OVS_VSWITCHD_START([dnl
235    add-port br0 p1 -- set Interface p1 type=dummy
236 ])
237
238 AT_CAPTURE_FILE([ofctl_monitor.log])
239 AT_DATA([flows.txt], [dnl
240 cookie=0x0 dl_src=10:11:11:11:11:11 actions=controller
241 cookie=0x1 dl_src=20:22:22:22:22:22 actions=controller,resubmit(80,1)
242 cookie=0x2 dl_src=30:33:33:33:33:33 actions=mod_vlan_vid:15,controller
243
244 cookie=0x3 table=1 in_port=80 actions=load:1->NXM_NX_REG0[[]],mod_vlan_vid:80,controller,resubmit(81,2)
245 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)
246 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)
247 cookie=0x6 table=4 in_port=83 actions=load:4->NXM_NX_REG3[[]],mod_nw_src:83.83.83.83,controller,resubmit(84,5)
248 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)
249 cookie=0x8 table=6 in_port=85 actions=mod_tp_src:85,controller,resubmit(86,7)
250 cookie=0x9 table=7 in_port=86 actions=mod_tp_dst:86,controller,controller
251 ])
252 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
253
254 dnl Flow miss.
255 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --pidfile 2> ofctl_monitor.log])
256
257 for i in 1 2 3 ; do
258     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)'
259 done
260
261 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
262 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
263 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
264 priority:0,tunnel:0,in_port:0000,tci(0) mac(50:54:00:00:00:05->50:54:00:00:00:07) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->9) tcp_csum:0
265 dnl
266 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
267 priority:0,tunnel:0,in_port:0000,tci(0) mac(50:54:00:00:00:05->50:54:00:00:00:07) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->9) tcp_csum:0
268 dnl
269 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
270 priority:0,tunnel:0,in_port:0000,tci(0) mac(50:54:00:00:00:05->50:54:00:00:00:07) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->9) tcp_csum:0
271 ])
272
273 dnl Singleton controller action.
274 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --pidfile 2> ofctl_monitor.log])
275
276 for i in 1 2 3 ; do
277     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)'
278 done
279
280 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
281 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
282 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
283 priority:0,tunnel:0,in_port:0000,tci(0) mac(10:11:11:11:11:11->50:54:00:00:00:07) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->10) tcp_csum:0
284 dnl
285 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
286 priority:0,tunnel:0,in_port:0000,tci(0) mac(10:11:11:11:11:11->50:54:00:00:00:07) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->10) tcp_csum:0
287 dnl
288 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
289 priority:0,tunnel:0,in_port:0000,tci(0) mac(10:11:11:11:11:11->50:54:00:00:00:07) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->10) tcp_csum:0
290 ])
291
292 dnl Modified controller action.
293 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --pidfile 2> ofctl_monitor.log])
294
295 for i in 1 2 3 ; do
296     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)'
297 done
298
299 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
300 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
301 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
302 priority:0,tunnel:0,in_port:0000,tci(vlan:15,pcp:0) mac(30:33:33:33:33:33->50:54:00:00:00:07) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->10) tcp_csum:0
303 dnl
304 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
305 priority:0,tunnel:0,in_port:0000,tci(vlan:15,pcp:0) mac(30:33:33:33:33:33->50:54:00:00:00:07) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->10) tcp_csum:0
306 dnl
307 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
308 priority:0,tunnel:0,in_port:0000,tci(vlan:15,pcp:0) mac(30:33:33:33:33:33->50:54:00:00:00:07) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->10) tcp_csum:0
309 ])
310
311 dnl Checksum TCP.
312 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
313
314 for i in 1 ; do
315     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)'
316 done
317
318 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
319 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
320 NXT_PACKET_IN (xid=0x0): cookie=0x1 total_len=60 in_port=1 tun_id=0x0 reg0=0x0 reg1=0x0 reg2=0x0 reg3=0x0 reg4=0x0 reg5=0x0 reg6=0x0 reg7=0x0 (via action) data_len=60 (unbuffered)
321 priority:0,tunnel:0,in_port:0000,tci(0) mac(20:22:22:22:22:22->50:54:00:00:00:07) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->11) tcp_csum:0
322 dnl
323 NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x3 total_len=64 in_port=1 tun_id=0x0 reg0=0x1 reg1=0x0 reg2=0x0 reg3=0x0 reg4=0x0 reg5=0x0 reg6=0x0 reg7=0x0 (via action) data_len=64 (unbuffered)
324 priority:0,tunnel:0,in_port:0000,tci(vlan:80,pcp:0) mac(20:22:22:22:22:22->50:54:00:00:00:07) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->11) tcp_csum:0
325 dnl
326 NXT_PACKET_IN (xid=0x0): table_id=2 cookie=0x4 total_len=64 in_port=1 tun_id=0x0 reg0=0x1 reg1=0x2 reg2=0x0 reg3=0x0 reg4=0x0 reg5=0x0 reg6=0x0 reg7=0x0 (via action) data_len=64 (unbuffered)
327 priority:0,tunnel:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->50:54:00:00:00:07) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->11) tcp_csum:0
328 dnl
329 NXT_PACKET_IN (xid=0x0): table_id=3 cookie=0x5 total_len=64 in_port=1 tun_id=0x0 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x0 reg4=0x0 reg5=0x0 reg6=0x0 reg7=0x0 (via action) data_len=64 (unbuffered)
330 priority:0,tunnel:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->82:82:82:82:82:82) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->11) tcp_csum:0
331 dnl
332 NXT_PACKET_IN (xid=0x0): table_id=4 cookie=0x6 total_len=64 in_port=1 tun_id=0x0 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x0 reg5=0x0 reg6=0x0 reg7=0x0 (via action) data_len=64 (unbuffered)
333 priority:0,tunnel:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->82:82:82:82:82:82) type:0800 proto:6 tos:0 ttl:0 ip(83.83.83.83->192.168.0.2) port(8->11) tcp_csum:1a03
334 dnl
335 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 reg5=0x0 reg6=0x0 reg7=0x0 (via action) data_len=64 (unbuffered)
336 priority:0,tunnel:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->82:82:82:82:82:82) type:0800 proto:6 tos:0 ttl:0 ip(83.83.83.83->84.84.84.84) port(8->11) tcp_csum:3205
337 dnl
338 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 reg5=0x0 reg6=0x0 reg7=0x0 (via action) data_len=64 (unbuffered)
339 priority:0,tunnel:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->82:82:82:82:82:82) type:0800 proto:6 tos:0 ttl:0 ip(83.83.83.83->84.84.84.84) port(85->11) tcp_csum:31b8
340 dnl
341 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 reg5=0x0 reg6=0x0 reg7=0x0 (via action) data_len=64 (unbuffered)
342 priority:0,tunnel:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->82:82:82:82:82:82) type:0800 proto:6 tos:0 ttl:0 ip(83.83.83.83->84.84.84.84) port(85->86) tcp_csum:316d
343 dnl
344 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 reg5=0x0 reg6=0x0 reg7=0x0 (via action) data_len=64 (unbuffered)
345 priority:0,tunnel:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->82:82:82:82:82:82) type:0800 proto:6 tos:0 ttl:0 ip(83.83.83.83->84.84.84.84) port(85->86) tcp_csum:316d
346 ])
347
348 dnl Checksum UDP.
349 AT_CHECK([ovs-ofctl monitor br0 65534 --detach --pidfile 2> ofctl_monitor.log])
350
351 for i in 1 ; do
352     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'
353 done
354
355 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
356 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
357 NXT_PACKET_IN (xid=0x0): cookie=0x1 total_len=60 in_port=1 tun_id=0x0 reg0=0x0 reg1=0x0 reg2=0x0 reg3=0x0 reg4=0x0 reg5=0x0 reg6=0x0 reg7=0x0 (via action) data_len=60 (unbuffered)
358 priority:0,tunnel:0,in_port:0000,tci(0) mac(20:22:22:22:22:22->50:54:00:00:00:07) type:0800 proto:17 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->11) udp_csum:1234
359 dnl
360 NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x3 total_len=64 in_port=1 tun_id=0x0 reg0=0x1 reg1=0x0 reg2=0x0 reg3=0x0 reg4=0x0 reg5=0x0 reg6=0x0 reg7=0x0 (via action) data_len=64 (unbuffered)
361 priority:0,tunnel:0,in_port:0000,tci(vlan:80,pcp:0) mac(20:22:22:22:22:22->50:54:00:00:00:07) type:0800 proto:17 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->11) udp_csum:1234
362 dnl
363 NXT_PACKET_IN (xid=0x0): table_id=2 cookie=0x4 total_len=64 in_port=1 tun_id=0x0 reg0=0x1 reg1=0x2 reg2=0x0 reg3=0x0 reg4=0x0 reg5=0x0 reg6=0x0 reg7=0x0 (via action) data_len=64 (unbuffered)
364 priority:0,tunnel:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->50:54:00:00:00:07) type:0800 proto:17 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->11) udp_csum:1234
365 dnl
366 NXT_PACKET_IN (xid=0x0): table_id=3 cookie=0x5 total_len=64 in_port=1 tun_id=0x0 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x0 reg4=0x0 reg5=0x0 reg6=0x0 reg7=0x0 (via action) data_len=64 (unbuffered)
367 priority:0,tunnel:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->82:82:82:82:82:82) type:0800 proto:17 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->11) udp_csum:1234
368 dnl
369 NXT_PACKET_IN (xid=0x0): table_id=4 cookie=0x6 total_len=64 in_port=1 tun_id=0x0 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x0 reg5=0x0 reg6=0x0 reg7=0x0 (via action) data_len=64 (unbuffered)
370 priority:0,tunnel:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->82:82:82:82:82:82) type:0800 proto:17 tos:0 ttl:0 ip(83.83.83.83->192.168.0.2) port(8->11) udp_csum:2c37
371 dnl
372 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 reg5=0x0 reg6=0x0 reg7=0x0 (via action) data_len=64 (unbuffered)
373 priority:0,tunnel:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->82:82:82:82:82:82) type:0800 proto:17 tos:0 ttl:0 ip(83.83.83.83->84.84.84.84) port(8->11) udp_csum:4439
374 dnl
375 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 reg5=0x0 reg6=0x0 reg7=0x0 (via action) data_len=64 (unbuffered)
376 priority:0,tunnel:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->82:82:82:82:82:82) type:0800 proto:17 tos:0 ttl:0 ip(83.83.83.83->84.84.84.84) port(85->11) udp_csum:43ec
377 dnl
378 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 reg5=0x0 reg6=0x0 reg7=0x0 (via action) data_len=64 (unbuffered)
379 priority:0,tunnel:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->82:82:82:82:82:82) type:0800 proto:17 tos:0 ttl:0 ip(83.83.83.83->84.84.84.84) port(85->86) udp_csum:43a1
380 dnl
381 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 reg5=0x0 reg6=0x0 reg7=0x0 (via action) data_len=64 (unbuffered)
382 priority:0,tunnel:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->82:82:82:82:82:82) type:0800 proto:17 tos:0 ttl:0 ip(83.83.83.83->84.84.84.84) port(85->86) udp_csum:43a1
383 ])
384
385 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
386  cookie=0x1, n_packets=2, n_bytes=120, dl_src=20:22:22:22:22:22 actions=CONTROLLER:65535,resubmit(80,1)
387  cookie=0x2, n_packets=3, n_bytes=180, dl_src=30:33:33:33:33:33 actions=mod_vlan_vid:15,CONTROLLER:65535
388  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)
389  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)
390  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)
391  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)
392  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)
393  cookie=0x8, table=6, n_packets=2, n_bytes=120, in_port=85 actions=mod_tp_src:85,CONTROLLER:65535,resubmit(86,7)
394  cookie=0x9, table=7, n_packets=2, n_bytes=120, in_port=86 actions=mod_tp_dst:86,CONTROLLER:65535,CONTROLLER:65535
395  n_packets=3, n_bytes=180, dl_src=10:11:11:11:11:11 actions=CONTROLLER:65535
396 NXST_FLOW reply:
397 ])
398
399 OVS_VSWITCHD_STOP
400 AT_CLEANUP
401
402 AT_SETUP([ofproto-dpif - VLAN handling])
403 OVS_VSWITCHD_START(
404   [set Bridge br0 fail-mode=standalone -- \
405    add-port br0 p1                                  trunks=10,12 -- \
406    add-port br0 p2                           tag=10              -- \
407    add-port br0 p3                           tag=12              \
408                    other-config:priority-tags=true               -- \
409    add-port br0 p4                           tag=12              -- \
410    add-port br0 p5 vlan_mode=native-tagged   tag=10              -- \
411    add-port br0 p6 vlan_mode=native-tagged   tag=10 trunks=10,12 -- \
412    add-port br0 p7 vlan_mode=native-untagged tag=12              -- \
413    add-port br0 p8 vlan_mode=native-untagged tag=12 trunks=10,12 \
414                    other-config:priority-tags=true               -- \
415    set Interface p1 type=dummy -- \
416    set Interface p2 type=dummy -- \
417    set Interface p3 type=dummy -- \
418    set Interface p4 type=dummy -- \
419    set Interface p5 type=dummy -- \
420    set Interface p6 type=dummy -- \
421    set Interface p7 type=dummy -- \
422    set Interface p8 type=dummy --])
423
424 dnl Each of these specifies an in_port by number, a VLAN VID (or "none"),
425 dnl a VLAN PCP (used if the VID isn't "none") and the expected set of datapath
426 dnl actions.
427 for tuple in \
428         "0 none 0 drop" \
429         "0 0    0 drop" \
430         "0 0    1 drop" \
431         "0 10   0 1,5,6,7,8,pop_vlan,2" \
432         "0 10   1 1,5,6,7,8,pop_vlan,2" \
433         "0 11   0 5,7" \
434         "0 11   1 5,7" \
435         "0 12   0 1,5,6,pop_vlan,3,4,7,8" \
436         "0 12   1 1,5,6,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
437         "1  none 0 drop" \
438         "1  0    0 drop" \
439         "1  0    1 drop" \
440         "1  10   0 0,5,6,7,8,pop_vlan,2" \
441         "1  10   1 0,5,6,7,8,pop_vlan,2" \
442         "1  11   0 drop" \
443         "1  11   1 drop" \
444         "1  12   0 0,5,6,pop_vlan,3,4,7,8" \
445         "1  12   1 0,5,6,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
446         "2  none 0 push_vlan(vid=10,pcp=0),0,1,5,6,7,8" \
447         "2  0    0 pop_vlan,push_vlan(vid=10,pcp=0),0,1,5,6,7,8" \
448         "2  0    1 pop_vlan,push_vlan(vid=10,pcp=1),0,1,5,6,7,8" \
449         "2  10   0 drop" \
450         "2  10   1 drop" \
451         "2  11   0 drop" \
452         "2  11   1 drop" \
453         "2  12   0 drop" \
454         "2  12   1 drop" \
455         "3  none 0 4,7,8,push_vlan(vid=12,pcp=0),0,1,5,6" \
456         "3  0    0 pop_vlan,4,7,8,push_vlan(vid=12,pcp=0),0,1,5,6" \
457         "3  0    1 8,pop_vlan,4,7,push_vlan(vid=12,pcp=1),0,1,5,6" \
458         "3  10   0 drop" \
459         "3  10   1 drop" \
460         "3  11   0 drop" \
461         "3  11   1 drop" \
462         "3  12   0 drop" \
463         "3  12   1 drop" \
464         "4  none 0 3,7,8,push_vlan(vid=12,pcp=0),0,1,5,6" \
465         "4  0    0 pop_vlan,3,7,8,push_vlan(vid=12,pcp=0),0,1,5,6" \
466         "4  0    1 3,8,pop_vlan,7,push_vlan(vid=12,pcp=1),0,1,5,6" \
467         "4  10   0 drop" \
468         "4  10   1 drop" \
469         "4  11   0 drop" \
470         "4  11   1 drop" \
471         "4  12   0 drop" \
472         "4  12   1 drop" \
473         "5  none 0 2,push_vlan(vid=10,pcp=0),0,1,6,7,8" \
474         "5  0    0 pop_vlan,2,push_vlan(vid=10,pcp=0),0,1,6,7,8" \
475         "5  0    1 pop_vlan,2,push_vlan(vid=10,pcp=1),0,1,6,7,8" \
476         "5  10   0 0,1,6,7,8,pop_vlan,2" \
477         "5  10   1 0,1,6,7,8,pop_vlan,2" \
478         "5  11   0 0,7" \
479         "5  11   1 0,7" \
480         "5  12   0 0,1,6,pop_vlan,3,4,7,8" \
481         "5  12   1 0,1,6,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
482         "6  none 0 2,push_vlan(vid=10,pcp=0),0,1,5,7,8" \
483         "6  0    0 pop_vlan,2,push_vlan(vid=10,pcp=0),0,1,5,7,8" \
484         "6  0    1 pop_vlan,2,push_vlan(vid=10,pcp=1),0,1,5,7,8" \
485         "6  10   0 0,1,5,7,8,pop_vlan,2" \
486         "6  10   1 0,1,5,7,8,pop_vlan,2" \
487         "6  11   0 drop" \
488         "6  11   1 drop" \
489         "6  12   0 0,1,5,pop_vlan,3,4,7,8" \
490         "6  12   1 0,1,5,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
491         "7  none 0 3,4,8,push_vlan(vid=12,pcp=0),0,1,5,6" \
492         "7  0    0 pop_vlan,3,4,8,push_vlan(vid=12,pcp=0),0,1,5,6" \
493         "7  0    1 3,8,pop_vlan,4,push_vlan(vid=12,pcp=1),0,1,5,6" \
494         "7  10   0 0,1,5,6,8,pop_vlan,2" \
495         "7  10   1 0,1,5,6,8,pop_vlan,2" \
496         "7  11   0 0,5" \
497         "7  11   1 0,5" \
498         "7  12   0 0,1,5,6,pop_vlan,3,4,8" \
499         "7  12   1 0,1,5,6,pop_vlan,4,push_vlan(vid=0,pcp=1),3,8" \
500         "8  none 0 3,4,7,push_vlan(vid=12,pcp=0),0,1,5,6" \
501         "8  0    0 pop_vlan,3,4,7,push_vlan(vid=12,pcp=0),0,1,5,6" \
502         "8  0    1 3,pop_vlan,4,7,push_vlan(vid=12,pcp=1),0,1,5,6" \
503         "8  10   0 0,1,5,6,7,pop_vlan,2" \
504         "8  10   1 0,1,5,6,7,pop_vlan,2" \
505         "8  11   0 drop" \
506         "8  11   1 drop" \
507         "8  12   0 0,1,5,6,pop_vlan,3,4,7" \
508         "8  12   1 0,1,5,6,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3"
509 do
510   set $tuple
511   in_port=$1
512   vlan=$2
513   pcp=$3
514   expected=$4
515
516   if test $vlan = none; then
517     flow="in_port($in_port),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff),eth_type(0xabcd)"
518   else
519     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))"
520   fi
521
522   echo "----------------------------------------------------------------------"
523   echo "in_port=$in_port vlan=$vlan pcp=$pcp"
524
525   AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
526   actual=`tail -1 stdout | sed 's/Datapath actions: //'`
527
528   AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
529   mv stdout expout
530   AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
531 done
532
533 OVS_VSWITCHD_STOP
534 AT_CLEANUP
535
536 AT_SETUP([ofproto-dpif - fragment handling])
537 OVS_VSWITCHD_START
538 AT_DATA([flows.txt], [dnl
539 priority=75 tcp ip_frag=no    tp_dst=80 actions=output:1
540 priority=75 tcp ip_frag=first tp_dst=80 actions=output:2
541 priority=75 tcp ip_frag=later tp_dst=80 actions=output:3
542 priority=50 tcp ip_frag=no              actions=output:4
543 priority=50 tcp ip_frag=first           actions=output:5
544 priority=50 tcp ip_frag=later           actions=output:6
545 ])
546 AT_CHECK([ovs-ofctl replace-flows br0 flows.txt])
547
548 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"
549 no_flow="$base_flow,frag=no),tcp(src=12345,dst=80)"
550 first_flow="$base_flow,frag=first),tcp(src=12345,dst=80)"
551 later_flow="$base_flow,frag=later)"
552
553     # mode    no  first  later
554 for tuple in \
555     'normal    1     5      6' \
556     'drop      1  drop   drop' \
557     'nx-match  1     2      6'
558 do
559   set $tuple
560   mode=$1
561   no=$2
562   first=$3
563   later=$4
564
565   AT_CHECK([ovs-ofctl set-frags br0 $mode])
566   for type in no first later; do
567     eval flow=\$${type}_flow exp_output=\$$type
568     AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
569     AT_CHECK_UNQUOTED([tail -1 stdout], [0], [Datapath actions: $exp_output
570 ])
571   done
572 done
573 OVS_VSWITCHD_STOP
574 AT_CLEANUP
575
576 AT_SETUP([ofproto-dpif - exit])
577 OVS_VSWITCHD_START
578 AT_DATA([flows.txt], [dnl
579 in_port=1 actions=output:10,exit,output:11
580 in_port=2 actions=output:12,resubmit:1,output:12
581 in_port=3 actions=output:13,resubmit:2,output:14
582 ])
583 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
584 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])
585 AT_CHECK([tail -1 stdout], [0],
586   [Datapath actions: 10
587 ])
588 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])
589 AT_CHECK([tail -1 stdout], [0],
590   [Datapath actions: 12,10
591 ])
592 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])
593 AT_CHECK([tail -1 stdout], [0],
594   [Datapath actions: 13,12,10
595 ])
596 OVS_VSWITCHD_STOP
597 AT_CLEANUP
598
599
600 AT_SETUP([ofproto-dpif - mirroring, select_all])
601 OVS_VSWITCHD_START(
602        [add-port br0 p1 -- set Interface p1 type=dummy --\
603         add-port br0 p2 -- set Interface p2 type=dummy --\
604         add-port br0 p3 -- set Interface p3 type=dummy --\
605         set Bridge br0 mirrors=@m --\
606         --id=@p3 get Port p3 --\
607         --id=@m create Mirror name=mymirror \
608         select_all=true output_port=@p3], [<0>
609 ])
610
611 AT_DATA([flows.txt], [dnl
612 in_port=1 actions=output:2
613 in_port=2 actions=output:1
614 ])
615 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
616
617 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)"
618 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
619 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
620   [Datapath actions: 2,3
621 ])
622
623 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)"
624 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
625 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
626   [Datapath actions: 1,3
627 ])
628
629 OVS_VSWITCHD_STOP
630 AT_CLEANUP
631
632
633 AT_SETUP([ofproto-dpif - mirroring, select_src])
634 OVS_VSWITCHD_START(
635        [add-port br0 p1 -- set Interface p1 type=dummy --\
636         add-port br0 p2 -- set Interface p2 type=dummy --\
637         add-port br0 p3 -- set Interface p3 type=dummy --\
638         set Bridge br0 mirrors=@m --\
639         --id=@p1 get Port p1 -- --id=@p3 get Port p3 --\
640         --id=@m create Mirror name=mymirror \
641         select_src_port=@p1 output_port=@p3], [<0>
642 ])
643
644 AT_DATA([flows.txt], [dnl
645 in_port=1 actions=output:2
646 in_port=2 actions=output:1
647 ])
648 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
649
650 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)"
651 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
652 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
653   [Datapath actions: 2,3
654 ])
655
656 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)"
657 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
658 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
659   [Datapath actions: 1
660 ])
661 OVS_VSWITCHD_STOP
662 AT_CLEANUP
663
664 AT_SETUP([ofproto-dpif - mirroring, OFPP_NONE ingress port])
665 OVS_VSWITCHD_START(
666        [add-port br0 p1 -- set Interface p1 type=dummy --\
667         add-port br0 p2 -- set Interface p2 type=dummy --\
668         set Bridge br0 mirrors=@m --\
669         --id=@p2 get Port p2 --\
670         --id=@m create Mirror name=mymirror \
671         select_all=true output_port=@p2], [<0>
672 ])
673
674 AT_CHECK([ovs-ofctl add-flow br0 action=output:1])
675
676 # "in_port" defaults to OFPP_NONE if it's not specified.
677 flow="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)"
678 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
679 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
680   [Datapath actions: 1,2
681 ])
682
683 OVS_VSWITCHD_STOP
684 AT_CLEANUP
685
686
687 AT_SETUP([ofproto-dpif - mirroring, select_dst])
688 OVS_VSWITCHD_START(
689        [add-port br0 p1 -- set Interface p1 type=dummy --\
690         add-port br0 p2 -- set Interface p2 type=dummy --\
691         add-port br0 p3 -- set Interface p3 type=dummy --\
692         set Bridge br0 mirrors=@m --\
693         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
694         --id=@m create Mirror name=mymirror \
695         select_dst_port=@p2 output_port=@p3], [<0>
696 ])
697
698 AT_DATA([flows.txt], [dnl
699 in_port=1 actions=output:2
700 in_port=2 actions=output:1
701 ])
702 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
703
704 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)"
705 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
706 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
707   [Datapath actions: 2,3
708 ])
709
710 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)"
711 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
712 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
713   [Datapath actions: 1
714 ])
715
716 OVS_VSWITCHD_STOP
717 AT_CLEANUP
718
719
720 AT_SETUP([ofproto-dpif - mirroring, select_vlan])
721 OVS_VSWITCHD_START(
722        [add-port br0 p1 -- set Interface p1 type=dummy --\
723         add-port br0 p2 -- set Interface p2 type=dummy --\
724         add-port br0 p3 -- set Interface p3 type=dummy --\
725         set Bridge br0 mirrors=@m --\
726         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
727         --id=@m create Mirror name=mymirror \
728         select_all=true select_vlan=11 output_port=@p3], [<0>
729 ])
730
731 AT_DATA([flows.txt], [dnl
732 in_port=1, actions=output:2
733 ])
734 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
735
736 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)"
737 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
738 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
739   [Datapath actions: 2
740 ])
741
742 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))"
743 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
744 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
745   [Datapath actions: 2
746 ])
747
748 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))"
749 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
750 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
751   [Datapath actions: 2,3
752 ])
753
754 OVS_VSWITCHD_STOP
755 AT_CLEANUP
756
757
758 AT_SETUP([ofproto-dpif - mirroring, output_port])
759 OVS_VSWITCHD_START(
760        [add-port br0 p1 -- set Interface p1 type=dummy --\
761         add-port br0 p2 -- set Interface p2 type=dummy --\
762         add-port br0 p3 -- set Interface p3 type=dummy --\
763         set Bridge br0 mirrors=@m --\
764         --id=@p3 get Port p3 --\
765         --id=@m create Mirror name=mymirror \
766         select_all=true output_port=@p3], [<0>
767 ])
768
769 AT_DATA([flows.txt], [dnl
770 in_port=1 actions=mod_vlan_vid:17,output:2
771 in_port=2 actions=output:1
772 ])
773 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
774
775 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)"
776 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
777 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
778   [Datapath actions: push_vlan(vid=17,pcp=0),2,pop_vlan,3
779 ])
780
781 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)"
782 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
783 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
784   [Datapath actions: 1,3
785 ])
786
787 OVS_VSWITCHD_STOP
788 AT_CLEANUP
789
790 AT_SETUP([ofproto-dpif - mirroring, output_vlan])
791 OVS_VSWITCHD_START(
792        [add-port br0 p1 -- set Interface p1 type=dummy --\
793         add-port br0 p2 -- set Interface p2 type=dummy --\
794         set Bridge br0 mirrors=@m --\
795         --id=@m create Mirror name=mymirror \
796         select_all=true output_vlan=12], [<0>
797 ])
798
799 AT_DATA([flows.txt], [dnl
800 in_port=1 actions=output:2
801 in_port=2 actions=mod_vlan_vid:17,output:1
802 ])
803 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
804
805 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)"
806 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
807 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
808
809 expected="2,push_vlan(vid=12,pcp=0),0,1,2"
810 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
811 mv stdout expout
812 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
813
814 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)"
815 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
816 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
817
818 expected="push_vlan(vid=17,pcp=0),1,pop_vlan,push_vlan(vid=12,pcp=0),0,1,2"
819 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
820 mv stdout expout
821 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
822
823 OVS_VSWITCHD_STOP
824 AT_CLEANUP
825
826 m4_define([OFPROTO_TRACE],
827   [flow="$2"
828    AT_CHECK([ovs-appctl ofproto/trace $1 "$flow" $3], [0], [stdout])
829    actual=`tail -1 stdout | sed 's/Datapath actions: //'`
830    expected="$4"
831    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" $5],
832      [0], [stdout])
833    mv stdout expout
834    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" $5],
835      [0], [expout])])
836
837 AT_SETUP([ofproto-dpif - MAC learning])
838 OVS_VSWITCHD_START(
839   [set bridge br0 fail-mode=standalone -- \
840    add-port br0 p1 -- set Interface p1 type=dummy -- \
841    add-port br0 p2 -- set Interface p2 type=dummy -- \
842    add-port br0 p3 -- set Interface p3 type=dummy])
843
844 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)'
845
846 # Trace an ARP packet arriving on p3, to create a MAC learning entry.
847 OFPROTO_TRACE(
848   [br0],
849   [in_port(3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
850   [-generate],
851   [0,1,2])
852
853 # Check for the MAC learning entry.
854 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
855  port  VLAN  MAC                Age
856     3     0  50:54:00:00:00:05    ?
857 ])
858
859 # Trace a packet arrival destined for the learned MAC.
860 # (This will also learn a MAC.)
861 OFPROTO_TRACE(
862   [br0],
863   [in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05),$arp],
864   [-generate],
865   [3])
866
867 # Check for both MAC learning entries.
868 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
869  port  VLAN  MAC                Age
870     3     0  50:54:00:00:00:05    ?
871     1     0  50:54:00:00:00:06    ?
872 ])
873
874 # Trace a packet arrival that updates the first learned MAC entry.
875 OFPROTO_TRACE(
876   [br0],
877   [in_port(2),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
878   [-generate],
879   [0,1,3])
880
881 # Check that the MAC learning entry was updated.
882 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
883  port  VLAN  MAC                Age
884     1     0  50:54:00:00:00:06    ?
885     2     0  50:54:00:00:00:05    ?
886 ])
887
888 # Add another bridge.
889 AT_CHECK(
890   [ovs-vsctl \
891      -- add-br br1 \
892      -- set bridge br1 datapath-type=dummy \
893      -- add-port br1 p4 -- set interface p4 type=dummy \
894      -- add-port br1 p5 -- set interface p5 type=dummy])
895
896 # Trace some packet arrivals in br1 to create MAC learning entries there too.
897 OFPROTO_TRACE(
898   [br1],
899   [in_port(4),eth(src=50:54:00:00:00:06,dst=ff:ff:ff:ff:ff:ff),$arp],
900   [-generate],
901   [0,5])
902 OFPROTO_TRACE(
903   [br1],
904   [in_port(5),eth(src=50:54:00:00:00:07,dst=ff:ff:ff:ff:ff:ff),$arp],
905   [-generate],
906   [0,4])
907
908 # Check that the MAC learning entries were added.
909 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
910  port  VLAN  MAC                Age
911     4     0  50:54:00:00:00:06    ?
912     5     0  50:54:00:00:00:07    ?
913 ])
914
915 # Delete port p1 and see that its MAC learning entry disappeared, and
916 # that the MAC learning entry for the same MAC was also deleted from br1.
917 AT_CHECK([ovs-vsctl del-port p1])
918 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
919  port  VLAN  MAC                Age
920     2     0  50:54:00:00:00:05    ?
921 ])
922 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
923  port  VLAN  MAC                Age
924     5     0  50:54:00:00:00:07    ?
925 ])
926
927 OVS_VSWITCHD_STOP
928 AT_CLEANUP
929
930 dnl Test that basic NetFlow reports flow statistics correctly:
931 dnl - The initial packet of a flow are correctly accounted.
932 dnl - Later packets within a flow are correctly accounted.
933 dnl - Flow actions changing (in this case, due to MAC learning)
934 dnl   cause a record to be sent.
935 AT_SETUP([ofproto-dpif - NetFlow flow expiration])
936
937 AT_CHECK([perl $srcdir/choose-port.pl], [0], [stdout])
938 NETFLOW_PORT=`cat stdout`
939
940 OVS_VSWITCHD_START(
941   [set Bridge br0 fail-mode=standalone -- \
942    add-port br0 p1 -- set Interface p1 type=dummy -- \
943    add-port br0 p2 -- set Interface p2 type=dummy -- \
944    set Bridge br0 netflow=@nf -- \
945    --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
946      engine_id=1 engine_type=2 active_timeout=30 \
947      add-id-to-interface=false], [<0>
948 ])
949
950 AT_CHECK([test-netflow --detach --pidfile $NETFLOW_PORT:127.0.0.1 > netflow.log])AT_CAPTURE_FILE([netflow.log])
951
952 for delay in 1000 30000; do
953     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)'
954     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)'
955
956     ovs-appctl time/warp $delay
957 done
958
959 OVS_VSWITCHD_STOP
960 ovs-appctl -t test-netflow exit
961
962 AT_CHECK([[sed -e 's/, uptime [0-9]*//
963 s/, now [0-9.]*//
964 s/time \([0-9]*\)\.\.\.\1\b/time <moment>/
965 s/time [0-9]*\.\.\.[0-9]*/time <range>/
966 ' netflow.log]], [0],
967   [header: v5, seq 0, engine 2,1
968 rec: 192.168.0.1 > 192.168.0.2, if 1 > 65535, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
969
970 header: v5, seq 1, engine 2,1
971 rec: 192.168.0.2 > 192.168.0.1, if 2 > 1, 2 pkts, 120 bytes, ICMP 0:0, time <range>
972 rec: 192.168.0.1 > 192.168.0.2, if 1 > 2, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
973 ])
974 AT_CLEANUP
975
976 dnl Test that basic NetFlow reports active expirations correctly.
977 AT_SETUP([ofproto-dpif - NetFlow active expiration])
978
979 AT_CHECK([perl $srcdir/choose-port.pl], [0], [stdout])
980 NETFLOW_PORT=`cat stdout`
981
982 OVS_VSWITCHD_START(
983   [set Bridge br0 fail-mode=standalone -- \
984    add-port br0 p1 -- set Interface p1 type=dummy -- \
985    add-port br0 p2 -- set Interface p2 type=dummy -- \
986    set Bridge br0 netflow=@nf -- \
987    --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
988      engine_id=1 engine_type=2 active_timeout=10 \
989      add-id-to-interface=false], [<0>
990 ])
991
992 AT_CHECK([test-netflow --detach --pidfile $NETFLOW_PORT:127.0.0.1 > netflow.log])AT_CAPTURE_FILE([netflow.log])
993
994 AT_CHECK([ovs-appctl time/stop])
995 n=1
996 while test $n -le 60; do
997     n=`expr $n + 1`
998
999     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)'
1000     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)'
1001
1002     ovs-appctl time/warp 1000
1003 done
1004
1005 ovs-appctl time/warp 10000
1006
1007 OVS_VSWITCHD_STOP
1008 ovs-appctl -t test-netflow exit
1009
1010 # Count the number of reported packets:
1011 # - From source to destination before MAC learning kicks in (just one).
1012 # - From source to destination after that.
1013 # - From destination to source.
1014 n_learn=0
1015 n_in=0
1016 n_out=0
1017 n_other=0
1018 n_recs=0
1019 none=0
1020 while read line; do
1021     pkts=`echo "$line" | sed 's/.*, \([[0-9]]*\) pkts,.*/\1/'`
1022     case $pkts in
1023          [[0-9]]*) ;;
1024          *) continue ;;
1025     esac
1026
1027     case $line in
1028         "rec: 192.168.0.1 > 192.168.0.2, if 1 > 65535, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
1029             counter=n_learn
1030             ;;
1031         "rec: 192.168.0.1 > 192.168.0.2, if 1 > 2, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
1032             counter=n_in
1033             ;;
1034         "rec: 192.168.0.2 > 192.168.0.1, if 2 > 1, "*" pkts, "*" bytes, TCP 80 > 1234, time "*)
1035             counter=n_out
1036             ;;
1037         *)
1038             counter=n_other
1039             ;;
1040     esac
1041     eval $counter=\`expr \$$counter + \$pkts\`
1042     n_recs=`expr $n_recs + 1`
1043 done < netflow.log
1044
1045 # There should be exactly 1 MAC learning packet,
1046 # exactly 59 other packets in that direction,
1047 # and exactly 60 packets in the other direction.
1048 AT_CHECK([echo $n_learn $n_in $n_out $n_other], [0], [1 59 60 0
1049 ])
1050
1051 # There should be 1 expiration for MAC learning,
1052 # at least 5 active and a final expiration in one direction,
1053 # and at least 5 active and a final expiration in the other direction.
1054 echo $n_recs
1055 AT_CHECK([test $n_recs -ge 13])
1056
1057 AT_CLEANUP
1058
1059 AT_SETUP([idle_age and hard_age increase over time])
1060 OVS_VSWITCHD_START
1061
1062 # get_ages DURATION HARD IDLE
1063 #
1064 # Fetch the flow duration, hard age, and idle age into the variables
1065 # whose names are given as arguments.  Rounds DURATION down to the
1066 # nearest integer.  If hard_age doesn't appear in the output, sets
1067 # HARD to "none".  If idle_age doesn't appear in the output, sets IDLE
1068 # to 0.
1069 get_ages () {
1070     AT_CHECK([ovs-ofctl dump-flows br0], [0], [stdout])
1071
1072     duration=`sed -n 's/.*duration=\([[0-9]]*\)\(\.[[0-9]]*\)\{0,1\}s.*/\1/p' stdout`
1073     AT_CHECK([[expr X"$duration" : 'X[0-9][0-9]*$']], [0], [ignore])
1074     AS_VAR_COPY([$1], [duration])
1075
1076     hard=`sed -n 's/.*hard_age=\([[0-9]]*\),.*/\1/p' stdout`
1077     if test X"$hard" = X; then
1078         hard=none
1079     else
1080         AT_CHECK([[expr X"$hard" : 'X[0-9][0-9]*$']], [0], [ignore])
1081     fi
1082     AS_VAR_COPY([$2], [hard])
1083
1084     idle=`sed -n 's/.*idle_age=\([[0-9]]*\),.*/\1/p' stdout`
1085     if test X"$idle" = X; then
1086         idle=0
1087     else
1088         AT_CHECK([[expr X"$idle" : 'X[0-9][0-9]*$']], [0], [ignore])
1089     fi
1090     AS_VAR_COPY([$3], [idle])
1091 }
1092
1093 # Add a flow and get its initial hard and idle age.
1094 AT_CHECK([ovs-ofctl add-flow br0 hard_timeout=199,idle_timeout=188,actions=drop])
1095 get_ages duration1 hard1 idle1
1096
1097 # Warp time forward by 10 seconds, then modify the flow's actions.
1098 ovs-appctl time/warp 10000
1099 get_ages duration2 hard2 idle2
1100 AT_CHECK([ovs-ofctl mod-flows br0 actions=flood])
1101
1102 # Warp time forward by 10 seconds.
1103 ovs-appctl time/warp 10000
1104 get_ages duration3 hard3 idle3
1105
1106 # Warp time forward 10 more seconds, then pass some packets through the flow,
1107 # then warp forward a few more times because idle times are only updated
1108 # occasionally.
1109 ovs-appctl time/warp 10000
1110 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)'
1111 ovs-appctl time/warp 1000
1112 ovs-appctl time/warp 1000
1113 ovs-appctl time/warp 1000
1114 get_ages duration4 hard4 idle4
1115
1116 printf "duration: %4s => %4s => %4s => %4s\n" $duration1 $duration2 $duration3 $duration4
1117 printf "hard_age: %4s => %4s => %4s => %4s\n" $hard1 $hard2 $hard3 $hard4
1118 printf "idle_age: %4s => %4s => %4s => %4s\n" $idle1 $idle2 $idle3 $idle4
1119
1120 # Duration should increase steadily over time.
1121 AT_CHECK([test $duration1 -lt $duration2])
1122 AT_CHECK([test $duration2 -lt $duration3])
1123 AT_CHECK([test $duration3 -lt $duration4])
1124
1125 # Hard age should be "none" initially because it's the same as flow_duration,
1126 # then it should increase.
1127 AT_CHECK([test $hard1 = none])
1128 AT_CHECK([test $hard2 = none])
1129 AT_CHECK([test $hard3 != none])
1130 AT_CHECK([test $hard4 != none])
1131 AT_CHECK([test $hard3 -lt $hard4])
1132
1133 # Idle age should increase from 1 to 2 to 3, then decrease.
1134 AT_CHECK([test $idle1 -lt $idle2])
1135 AT_CHECK([test $idle2 -lt $idle3])
1136 AT_CHECK([test $idle3 -gt $idle4])
1137
1138 # Check some invariant relationships.
1139 AT_CHECK([test $duration1 = $idle1])
1140 AT_CHECK([test $duration2 = $idle2])
1141 AT_CHECK([test $duration3 = $idle3])
1142 AT_CHECK([test $idle3 -gt $hard3])
1143 AT_CHECK([test $idle4 -lt $hard4])
1144 AT_CHECK([test $hard4 -lt $duration4])
1145
1146 OVS_VSWITCHD_STOP
1147 AT_CLEANUP
1148
1149 AT_SETUP([ofproto-dpif - fin_timeout])
1150 OVS_VSWITCHD_START
1151 AT_DATA([flows.txt], [dnl
1152 in_port=1 actions=output:2
1153 in_port=2 actions=mod_vlan_vid:17,output:1
1154 ])
1155 AT_CHECK([ovs-ofctl add-flow br0 'idle_timeout=60,actions=fin_timeout(idle_timeout=5)'])
1156 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1157 [NXST_FLOW reply:
1158  idle_timeout=60, actions=fin_timeout(idle_timeout=5)
1159 ])
1160 # Check that a TCP SYN packet does not change the timeout.  (Because
1161 # flow stats updates are mainly what implements the fin_timeout
1162 # feature, we warp forward a couple of times to ensure that flow stats
1163 # run before re-checking the flow table.)
1164 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f908004500003c2e2440004006465dac11370dac11370b828b0016751e267b00000000a00216d017360000020405b40402080a2d25085f0000000001030307], [0], [success
1165 ])
1166 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
1167 warped
1168 ])
1169 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1170 [NXST_FLOW reply:
1171  n_packets=1, n_bytes=74, idle_timeout=60, actions=fin_timeout(idle_timeout=5)
1172 ])
1173 # Check that a TCP FIN packet does change the timeout.
1174 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f90800451000342e3e40004006463bac11370dac11370b828b0016751e319dfc96399b801100717ae800000101080a2d250a9408579588], [0], [success
1175 ])
1176 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
1177 warped
1178 ])
1179 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1180 [NXST_FLOW reply:
1181  n_packets=2, n_bytes=140, idle_timeout=5, actions=fin_timeout(idle_timeout=5)
1182 ])
1183 OVS_VSWITCHD_STOP
1184 AT_CLEANUP