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