ofproto-dpif: Do not give stats to rules bypassed by "drop" frag policy.
[cascardo/ovs.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 icmp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=1,icmp_type=0,icmp_code=0
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(skb_priority(0x1)),1,dnl
143 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0xb,ttl=128,frag=no)),set(skb_priority(0x2)),1,dnl
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(skb_priority(0x1)),1,dnl
146 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0xff,ttl=128,frag=no)),set(skb_priority(0)),1,dnl
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(skb_priority(0x1)),0,1,2,set(skb_priority(0x2)),3,set(skb_priority(0x1)),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 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=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 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=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 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=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 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=10:11:11:11:11:11,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=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 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=10:11:11:11:11:11,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=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 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=10:11:11:11:11:11,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=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 tcp,metadata=0,in_port=0,dl_vlan=15,dl_vlan_pcp=0,dl_src=30:33:33:33:33:33,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=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 tcp,metadata=0,in_port=0,dl_vlan=15,dl_vlan_pcp=0,dl_src=30:33:33:33:33:33,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=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 tcp,metadata=0,in_port=0,dl_vlan=15,dl_vlan_pcp=0,dl_src=30:33:33:33:33:33,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=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 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=20:22:22:22:22:22,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=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 tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=20:22:22:22:22:22,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=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 tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=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 tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=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 tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=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 tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=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 tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=85,tp_dst=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 tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=85,tp_dst=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 tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=85,tp_dst=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 udp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=20:22:22:22:22:22,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=11 udp_csum:1234
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 udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=20:22:22:22:22:22,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=11 udp_csum:1234
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 udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=11 udp_csum:1234
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 udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=11 udp_csum:1234
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 udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=11 udp_csum:2c37
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 udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=11 udp_csum:4439
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 udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=85,tp_dst=11 udp_csum:43ec
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 udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=85,tp_dst=86 udp_csum:43a1
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 udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=85,tp_dst=86 udp_csum:43a1
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     printf "\n%s\n" "----$mode $type-----"
571     AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
572     : > expout
573     if test $mode = drop && test $type != no; then
574         echo 'Packets dropped because they are IP fragments and the fragment handling mode is "drop".' >> expout
575     fi
576     echo "Datapath actions: $exp_output" >> expout
577     AT_CHECK([grep 'IP fragments' stdout; tail -1 stdout], [0], [expout])
578   done
579 done
580 OVS_VSWITCHD_STOP
581 AT_CLEANUP
582
583 AT_SETUP([ofproto-dpif - exit])
584 OVS_VSWITCHD_START
585 AT_DATA([flows.txt], [dnl
586 in_port=1 actions=output:10,exit,output:11
587 in_port=2 actions=output:12,resubmit:1,output:12
588 in_port=3 actions=output:13,resubmit:2,output:14
589 ])
590 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
591 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])
592 AT_CHECK([tail -1 stdout], [0],
593   [Datapath actions: 10
594 ])
595 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])
596 AT_CHECK([tail -1 stdout], [0],
597   [Datapath actions: 12,10
598 ])
599 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])
600 AT_CHECK([tail -1 stdout], [0],
601   [Datapath actions: 13,12,10
602 ])
603 OVS_VSWITCHD_STOP
604 AT_CLEANUP
605
606
607 AT_SETUP([ofproto-dpif - mirroring, select_all])
608 OVS_VSWITCHD_START(
609        [add-port br0 p1 -- set Interface p1 type=dummy --\
610         add-port br0 p2 -- set Interface p2 type=dummy --\
611         add-port br0 p3 -- set Interface p3 type=dummy --\
612         set Bridge br0 mirrors=@m --\
613         --id=@p3 get Port p3 --\
614         --id=@m create Mirror name=mymirror \
615         select_all=true output_port=@p3], [<0>
616 ])
617
618 AT_DATA([flows.txt], [dnl
619 in_port=1 actions=output:2
620 in_port=2 actions=output:1
621 ])
622 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
623
624 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)"
625 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
626 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
627   [Datapath actions: 2,3
628 ])
629
630 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)"
631 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
632 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
633   [Datapath actions: 1,3
634 ])
635
636 OVS_VSWITCHD_STOP
637 AT_CLEANUP
638
639
640 AT_SETUP([ofproto-dpif - mirroring, select_src])
641 OVS_VSWITCHD_START(
642        [add-port br0 p1 -- set Interface p1 type=dummy --\
643         add-port br0 p2 -- set Interface p2 type=dummy --\
644         add-port br0 p3 -- set Interface p3 type=dummy --\
645         set Bridge br0 mirrors=@m --\
646         --id=@p1 get Port p1 -- --id=@p3 get Port p3 --\
647         --id=@m create Mirror name=mymirror \
648         select_src_port=@p1 output_port=@p3], [<0>
649 ])
650
651 AT_DATA([flows.txt], [dnl
652 in_port=1 actions=output:2
653 in_port=2 actions=output:1
654 ])
655 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
656
657 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)"
658 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
659 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
660   [Datapath actions: 2,3
661 ])
662
663 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)"
664 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
665 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
666   [Datapath actions: 1
667 ])
668 OVS_VSWITCHD_STOP
669 AT_CLEANUP
670
671 AT_SETUP([ofproto-dpif - mirroring, OFPP_NONE ingress port])
672 OVS_VSWITCHD_START(
673        [add-port br0 p1 -- set Interface p1 type=dummy --\
674         add-port br0 p2 -- set Interface p2 type=dummy --\
675         set Bridge br0 mirrors=@m --\
676         --id=@p2 get Port p2 --\
677         --id=@m create Mirror name=mymirror \
678         select_all=true output_port=@p2], [<0>
679 ])
680
681 AT_CHECK([ovs-ofctl add-flow br0 action=output:1])
682
683 # "in_port" defaults to OFPP_NONE if it's not specified.
684 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)"
685 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
686 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
687   [Datapath actions: 1,2
688 ])
689
690 OVS_VSWITCHD_STOP
691 AT_CLEANUP
692
693
694 AT_SETUP([ofproto-dpif - mirroring, select_dst])
695 OVS_VSWITCHD_START(
696        [add-port br0 p1 -- set Interface p1 type=dummy --\
697         add-port br0 p2 -- set Interface p2 type=dummy --\
698         add-port br0 p3 -- set Interface p3 type=dummy --\
699         set Bridge br0 mirrors=@m --\
700         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
701         --id=@m create Mirror name=mymirror \
702         select_dst_port=@p2 output_port=@p3], [<0>
703 ])
704
705 AT_DATA([flows.txt], [dnl
706 in_port=1 actions=output:2
707 in_port=2 actions=output:1
708 ])
709 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
710
711 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)"
712 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
713 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
714   [Datapath actions: 2,3
715 ])
716
717 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)"
718 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
719 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
720   [Datapath actions: 1
721 ])
722
723 OVS_VSWITCHD_STOP
724 AT_CLEANUP
725
726
727 AT_SETUP([ofproto-dpif - mirroring, select_vlan])
728 OVS_VSWITCHD_START(
729        [add-port br0 p1 -- set Interface p1 type=dummy --\
730         add-port br0 p2 -- set Interface p2 type=dummy --\
731         add-port br0 p3 -- set Interface p3 type=dummy --\
732         set Bridge br0 mirrors=@m --\
733         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
734         --id=@m create Mirror name=mymirror \
735         select_all=true select_vlan=11 output_port=@p3], [<0>
736 ])
737
738 AT_DATA([flows.txt], [dnl
739 in_port=1, actions=output:2
740 ])
741 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
742
743 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)"
744 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
745 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
746   [Datapath actions: 2
747 ])
748
749 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))"
750 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
751 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
752   [Datapath actions: 2
753 ])
754
755 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))"
756 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
757 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
758   [Datapath actions: 2,3
759 ])
760
761 OVS_VSWITCHD_STOP
762 AT_CLEANUP
763
764
765 AT_SETUP([ofproto-dpif - mirroring, output_port])
766 OVS_VSWITCHD_START(
767        [add-port br0 p1 -- set Interface p1 type=dummy --\
768         add-port br0 p2 -- set Interface p2 type=dummy --\
769         add-port br0 p3 -- set Interface p3 type=dummy --\
770         set Bridge br0 mirrors=@m --\
771         --id=@p3 get Port p3 --\
772         --id=@m create Mirror name=mymirror \
773         select_all=true output_port=@p3], [<0>
774 ])
775
776 AT_DATA([flows.txt], [dnl
777 in_port=1 actions=mod_vlan_vid:17,output:2
778 in_port=2 actions=output:1
779 ])
780 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
781
782 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)"
783 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
784 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
785   [Datapath actions: push_vlan(vid=17,pcp=0),2,pop_vlan,3
786 ])
787
788 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)"
789 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
790 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
791   [Datapath actions: 1,3
792 ])
793
794 OVS_VSWITCHD_STOP
795 AT_CLEANUP
796
797 AT_SETUP([ofproto-dpif - mirroring, output_vlan])
798 OVS_VSWITCHD_START(
799        [add-port br0 p1 -- set Interface p1 type=dummy --\
800         add-port br0 p2 -- set Interface p2 type=dummy --\
801         set Bridge br0 mirrors=@m --\
802         --id=@m create Mirror name=mymirror \
803         select_all=true output_vlan=12], [<0>
804 ])
805
806 AT_DATA([flows.txt], [dnl
807 in_port=1 actions=output:2
808 in_port=2 actions=mod_vlan_vid:17,output:1
809 ])
810 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
811
812 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)"
813 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
814 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
815
816 expected="2,push_vlan(vid=12,pcp=0),0,1,2"
817 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
818 mv stdout expout
819 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
820
821 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)"
822 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
823 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
824
825 expected="push_vlan(vid=17,pcp=0),1,pop_vlan,push_vlan(vid=12,pcp=0),0,1,2"
826 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
827 mv stdout expout
828 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
829
830 OVS_VSWITCHD_STOP
831 AT_CLEANUP
832
833 m4_define([OFPROTO_TRACE],
834   [flow="$2"
835    AT_CHECK([ovs-appctl ofproto/trace $1 "$flow" $3], [0], [stdout])
836    actual=`tail -1 stdout | sed 's/Datapath actions: //'`
837    expected="$4"
838    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" $5],
839      [0], [stdout])
840    mv stdout expout
841    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" $5],
842      [0], [expout])])
843
844 AT_SETUP([ofproto-dpif - MAC learning])
845 OVS_VSWITCHD_START(
846   [set bridge br0 fail-mode=standalone -- \
847    add-port br0 p1 -- set Interface p1 type=dummy -- \
848    add-port br0 p2 -- set Interface p2 type=dummy -- \
849    add-port br0 p3 -- set Interface p3 type=dummy])
850
851 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)'
852
853 # Trace an ARP packet arriving on p3, to create a MAC learning entry.
854 OFPROTO_TRACE(
855   [br0],
856   [in_port(3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
857   [-generate],
858   [0,1,2])
859
860 # Check for the MAC learning entry.
861 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
862  port  VLAN  MAC                Age
863     3     0  50:54:00:00:00:05    ?
864 ])
865
866 # Trace a packet arrival destined for the learned MAC.
867 # (This will also learn a MAC.)
868 OFPROTO_TRACE(
869   [br0],
870   [in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05),$arp],
871   [-generate],
872   [3])
873
874 # Check for both MAC learning entries.
875 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
876  port  VLAN  MAC                Age
877     3     0  50:54:00:00:00:05    ?
878     1     0  50:54:00:00:00:06    ?
879 ])
880
881 # Trace a packet arrival that updates the first learned MAC entry.
882 OFPROTO_TRACE(
883   [br0],
884   [in_port(2),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
885   [-generate],
886   [0,1,3])
887
888 # Check that the MAC learning entry was updated.
889 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
890  port  VLAN  MAC                Age
891     1     0  50:54:00:00:00:06    ?
892     2     0  50:54:00:00:00:05    ?
893 ])
894
895 # Add another bridge.
896 AT_CHECK(
897   [ovs-vsctl \
898      -- add-br br1 \
899      -- set bridge br1 datapath-type=dummy \
900      -- add-port br1 p4 -- set interface p4 type=dummy \
901      -- add-port br1 p5 -- set interface p5 type=dummy])
902
903 # Trace some packet arrivals in br1 to create MAC learning entries there too.
904 OFPROTO_TRACE(
905   [br1],
906   [in_port(4),eth(src=50:54:00:00:00:06,dst=ff:ff:ff:ff:ff:ff),$arp],
907   [-generate],
908   [0,5])
909 OFPROTO_TRACE(
910   [br1],
911   [in_port(5),eth(src=50:54:00:00:00:07,dst=ff:ff:ff:ff:ff:ff),$arp],
912   [-generate],
913   [0,4])
914
915 # Check that the MAC learning entries were added.
916 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
917  port  VLAN  MAC                Age
918     4     0  50:54:00:00:00:06    ?
919     5     0  50:54:00:00:00:07    ?
920 ])
921
922 # Delete port p1 and see that its MAC learning entry disappeared, and
923 # that the MAC learning entry for the same MAC was also deleted from br1.
924 AT_CHECK([ovs-vsctl del-port p1])
925 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
926  port  VLAN  MAC                Age
927     2     0  50:54:00:00:00:05    ?
928 ])
929 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
930  port  VLAN  MAC                Age
931     5     0  50:54:00:00:00:07    ?
932 ])
933
934 OVS_VSWITCHD_STOP
935 AT_CLEANUP
936
937 dnl Test that basic NetFlow reports flow statistics correctly:
938 dnl - The initial packet of a flow are correctly accounted.
939 dnl - Later packets within a flow are correctly accounted.
940 dnl - Flow actions changing (in this case, due to MAC learning)
941 dnl   cause a record to be sent.
942 AT_SETUP([ofproto-dpif - NetFlow flow expiration])
943
944 AT_CHECK([perl $srcdir/choose-port.pl], [0], [stdout])
945 NETFLOW_PORT=`cat stdout`
946
947 OVS_VSWITCHD_START(
948   [set Bridge br0 fail-mode=standalone -- \
949    add-port br0 p1 -- set Interface p1 type=dummy -- \
950    add-port br0 p2 -- set Interface p2 type=dummy -- \
951    set Bridge br0 netflow=@nf -- \
952    --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
953      engine_id=1 engine_type=2 active_timeout=30 \
954      add-id-to-interface=false], [<0>
955 ])
956
957 ON_EXIT([kill `cat test-netflow.pid`])
958 AT_CHECK([test-netflow --detach --no-chdir --pidfile $NETFLOW_PORT:127.0.0.1 > netflow.log])
959 AT_CAPTURE_FILE([netflow.log])
960
961 for delay in 1000 30000; do
962     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)'
963     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)'
964
965     ovs-appctl time/warp $delay
966 done
967
968 sleep 1
969 OVS_VSWITCHD_STOP
970 ovs-appctl -t test-netflow exit
971
972 AT_CHECK([[sed -e 's/, uptime [0-9]*//
973 s/, now [0-9.]*//
974 s/time \([0-9]*\)\.\.\.\1$/time <moment>/
975 s/time [0-9]*\.\.\.[0-9]*/time <range>/
976 ' netflow.log | sort]], [0],
977   [
978 header: v5, seq 0, engine 2,1
979 header: v5, seq 1, engine 2,1
980 seq 0: 192.168.0.1 > 192.168.0.2, if 1 > 65535, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
981 seq 1: 192.168.0.1 > 192.168.0.2, if 1 > 2, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
982 seq 1: 192.168.0.2 > 192.168.0.1, if 2 > 1, 2 pkts, 120 bytes, ICMP 0:0, time <range>
983 ])
984 AT_CLEANUP
985
986 dnl Test that basic NetFlow reports active expirations correctly.
987 AT_SETUP([ofproto-dpif - NetFlow active expiration])
988
989 AT_CHECK([perl $srcdir/choose-port.pl], [0], [stdout])
990 NETFLOW_PORT=`cat stdout`
991
992 OVS_VSWITCHD_START(
993   [set Bridge br0 fail-mode=standalone -- \
994    add-port br0 p1 -- set Interface p1 type=dummy -- \
995    add-port br0 p2 -- set Interface p2 type=dummy -- \
996    set Bridge br0 netflow=@nf -- \
997    --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
998      engine_id=1 engine_type=2 active_timeout=10 \
999      add-id-to-interface=false], [<0>
1000 ])
1001
1002 ON_EXIT([kill `test-netflow.pid`])
1003 AT_CHECK([test-netflow --detach --no-chdir --pidfile $NETFLOW_PORT:127.0.0.1 > netflow.log])AT_CAPTURE_FILE([netflow.log])
1004
1005 AT_CHECK([ovs-appctl time/stop])
1006 n=1
1007 while test $n -le 60; do
1008     n=`expr $n + 1`
1009
1010     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)'
1011     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)'
1012
1013     ovs-appctl time/warp 1000
1014 done
1015
1016 ovs-appctl time/warp 10000
1017
1018 sleep 1
1019 OVS_VSWITCHD_STOP
1020 ovs-appctl -t test-netflow exit
1021
1022 # Count the number of reported packets:
1023 # - From source to destination before MAC learning kicks in (just one).
1024 # - From source to destination after that.
1025 # - From destination to source.
1026 n_learn=0
1027 n_in=0
1028 n_out=0
1029 n_other=0
1030 n_recs=0
1031 none=0
1032 while read line; do
1033     pkts=`echo "$line" | sed 's/.*, \([[0-9]]*\) pkts,.*/\1/'`
1034     case $pkts in
1035          [[0-9]]*) ;;
1036          *) continue ;;
1037     esac
1038
1039     case $line in
1040         "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 65535, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
1041             counter=n_learn
1042             ;;
1043         "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 2, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
1044             counter=n_in
1045             ;;
1046         "seq "*": 192.168.0.2 > 192.168.0.1, if 2 > 1, "*" pkts, "*" bytes, TCP 80 > 1234, time "*)
1047             counter=n_out
1048             ;;
1049         *)
1050             counter=n_other
1051             ;;
1052     esac
1053     eval $counter=\`expr \$$counter + \$pkts\`
1054     n_recs=`expr $n_recs + 1`
1055 done < netflow.log
1056
1057 # There should be exactly 1 MAC learning packet,
1058 # exactly 59 other packets in that direction,
1059 # and exactly 60 packets in the other direction.
1060 AT_CHECK([echo $n_learn $n_in $n_out $n_other], [0], [1 59 60 0
1061 ])
1062
1063 # There should be 1 expiration for MAC learning,
1064 # at least 5 active and a final expiration in one direction,
1065 # and at least 5 active and a final expiration in the other direction.
1066 echo $n_recs
1067 AT_CHECK([test $n_recs -ge 13])
1068
1069 AT_CLEANUP
1070
1071 AT_SETUP([idle_age and hard_age increase over time])
1072 OVS_VSWITCHD_START
1073
1074 # get_ages DURATION HARD IDLE
1075 #
1076 # Fetch the flow duration, hard age, and idle age into the variables
1077 # whose names are given as arguments.  Rounds DURATION down to the
1078 # nearest integer.  If hard_age doesn't appear in the output, sets
1079 # HARD to "none".  If idle_age doesn't appear in the output, sets IDLE
1080 # to 0.
1081 get_ages () {
1082     AT_CHECK([ovs-ofctl dump-flows br0], [0], [stdout])
1083
1084     duration=`sed -n 's/.*duration=\([[0-9]]*\)\(\.[[0-9]]*\)\{0,1\}s.*/\1/p' stdout`
1085     AT_CHECK([[expr X"$duration" : 'X[0-9][0-9]*$']], [0], [ignore])
1086     AS_VAR_COPY([$1], [duration])
1087
1088     hard=`sed -n 's/.*hard_age=\([[0-9]]*\),.*/\1/p' stdout`
1089     if test X"$hard" = X; then
1090         hard=none
1091     else
1092         AT_CHECK([[expr X"$hard" : 'X[0-9][0-9]*$']], [0], [ignore])
1093     fi
1094     AS_VAR_COPY([$2], [hard])
1095
1096     idle=`sed -n 's/.*idle_age=\([[0-9]]*\),.*/\1/p' stdout`
1097     if test X"$idle" = X; then
1098         idle=0
1099     else
1100         AT_CHECK([[expr X"$idle" : 'X[0-9][0-9]*$']], [0], [ignore])
1101     fi
1102     AS_VAR_COPY([$3], [idle])
1103 }
1104
1105 # Add a flow and get its initial hard and idle age.
1106 AT_CHECK([ovs-ofctl add-flow br0 hard_timeout=199,idle_timeout=188,actions=drop])
1107 get_ages duration1 hard1 idle1
1108
1109 # Warp time forward by 10 seconds, then modify the flow's actions.
1110 ovs-appctl time/warp 10000
1111 get_ages duration2 hard2 idle2
1112 AT_CHECK([ovs-ofctl mod-flows br0 actions=flood])
1113
1114 # Warp time forward by 10 seconds.
1115 ovs-appctl time/warp 10000
1116 get_ages duration3 hard3 idle3
1117
1118 # Warp time forward 10 more seconds, then pass some packets through the flow,
1119 # then warp forward a few more times because idle times are only updated
1120 # occasionally.
1121 ovs-appctl time/warp 10000
1122 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)'
1123 ovs-appctl time/warp 1000
1124 ovs-appctl time/warp 1000
1125 ovs-appctl time/warp 1000
1126 get_ages duration4 hard4 idle4
1127
1128 printf "duration: %4s => %4s => %4s => %4s\n" $duration1 $duration2 $duration3 $duration4
1129 printf "hard_age: %4s => %4s => %4s => %4s\n" $hard1 $hard2 $hard3 $hard4
1130 printf "idle_age: %4s => %4s => %4s => %4s\n" $idle1 $idle2 $idle3 $idle4
1131
1132 # Duration should increase steadily over time.
1133 AT_CHECK([test $duration1 -lt $duration2])
1134 AT_CHECK([test $duration2 -lt $duration3])
1135 AT_CHECK([test $duration3 -lt $duration4])
1136
1137 # Hard age should be "none" initially because it's the same as flow_duration,
1138 # then it should increase.
1139 AT_CHECK([test $hard1 = none])
1140 AT_CHECK([test $hard2 = none])
1141 AT_CHECK([test $hard3 != none])
1142 AT_CHECK([test $hard4 != none])
1143 AT_CHECK([test $hard3 -lt $hard4])
1144
1145 # Idle age should increase from 1 to 2 to 3, then decrease.
1146 AT_CHECK([test $idle1 -lt $idle2])
1147 AT_CHECK([test $idle2 -lt $idle3])
1148 AT_CHECK([test $idle3 -gt $idle4])
1149
1150 # Check some invariant relationships.
1151 AT_CHECK([test $duration1 = $idle1])
1152 AT_CHECK([test $duration2 = $idle2])
1153 AT_CHECK([test $duration3 = $idle3])
1154 AT_CHECK([test $idle3 -gt $hard3])
1155 AT_CHECK([test $idle4 -lt $hard4])
1156 AT_CHECK([test $hard4 -lt $duration4])
1157
1158 OVS_VSWITCHD_STOP
1159 AT_CLEANUP
1160
1161 AT_SETUP([ofproto-dpif - fin_timeout])
1162 OVS_VSWITCHD_START
1163 AT_DATA([flows.txt], [dnl
1164 in_port=1 actions=output:2
1165 in_port=2 actions=mod_vlan_vid:17,output:1
1166 ])
1167 AT_CHECK([ovs-ofctl add-flow br0 'idle_timeout=60,actions=fin_timeout(idle_timeout=5)'])
1168 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1169 [NXST_FLOW reply:
1170  idle_timeout=60, actions=fin_timeout(idle_timeout=5)
1171 ])
1172 # Check that a TCP SYN packet does not change the timeout.  (Because
1173 # flow stats updates are mainly what implements the fin_timeout
1174 # feature, we warp forward a couple of times to ensure that flow stats
1175 # run before re-checking the flow table.)
1176 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f908004500003c2e2440004006465dac11370dac11370b828b0016751e267b00000000a00216d017360000020405b40402080a2d25085f0000000001030307], [0], [success
1177 ])
1178 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
1179 warped
1180 ])
1181 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1182 [NXST_FLOW reply:
1183  n_packets=1, n_bytes=74, idle_timeout=60, actions=fin_timeout(idle_timeout=5)
1184 ])
1185 # Check that a TCP FIN packet does change the timeout.
1186 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f90800451000342e3e40004006463bac11370dac11370b828b0016751e319dfc96399b801100717ae800000101080a2d250a9408579588], [0], [success
1187 ])
1188 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
1189 warped
1190 ])
1191 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1192 [NXST_FLOW reply:
1193  n_packets=2, n_bytes=140, idle_timeout=5, actions=fin_timeout(idle_timeout=5)
1194 ])
1195 OVS_VSWITCHD_STOP
1196 AT_CLEANUP