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