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