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