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