ofproto-dpif: Require an in_port when tracing datapath flows.
[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 - 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], [90])
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_OF_PORTS([br0], 1, 2, 3)
606 ovs-vsctl \
607         set Bridge br0 mirrors=@m --\
608         --id=@p3 get Port p3 --\
609         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
610
611 AT_DATA([flows.txt], [dnl
612 in_port=1 actions=output:2
613 in_port=2 actions=output:1
614 ])
615 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
616
617 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)"
618 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
619 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
620   [Datapath actions: 2,3
621 ])
622
623 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)"
624 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
625 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
626   [Datapath actions: 1,3
627 ])
628
629 OVS_VSWITCHD_STOP
630 AT_CLEANUP
631
632
633 AT_SETUP([ofproto-dpif - mirroring, select_src])
634 OVS_VSWITCHD_START
635 ADD_OF_PORTS([br0], 1, 2, 3)
636 ovs-vsctl \
637         set Bridge br0 mirrors=@m --\
638         --id=@p1 get Port p1 -- --id=@p3 get Port p3 --\
639         --id=@m create Mirror name=mymirror select_src_port=@p1 output_port=@p3
640
641 AT_DATA([flows.txt], [dnl
642 in_port=1 actions=output:2
643 in_port=2 actions=output:1
644 ])
645 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
646
647 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)"
648 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
649 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
650   [Datapath actions: 2,3
651 ])
652
653 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)"
654 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
655 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
656   [Datapath actions: 1
657 ])
658 OVS_VSWITCHD_STOP
659 AT_CLEANUP
660
661 AT_SETUP([ofproto-dpif - mirroring, OFPP_NONE ingress port])
662 OVS_VSWITCHD_START
663 ADD_OF_PORTS([br0], 1, 2)
664 ovs-vsctl \
665         set Bridge br0 mirrors=@m --\
666         --id=@p2 get Port p2 --\
667         --id=@m create Mirror name=mymirror select_all=true output_port=@p2
668
669 AT_CHECK([ovs-ofctl add-flow br0 action=output:1])
670
671 # "in_port" defaults to OFPP_NONE if it's not specified.
672 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"
673 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
674 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
675   [Datapath actions: 1,2
676 ])
677
678 OVS_VSWITCHD_STOP
679 AT_CLEANUP
680
681
682 AT_SETUP([ofproto-dpif - mirroring, select_dst])
683 OVS_VSWITCHD_START
684 ADD_OF_PORTS([br0], 1, 2, 3)
685 ovs-vsctl \
686         set Bridge br0 mirrors=@m --\
687         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
688         --id=@m create Mirror name=mymirror select_dst_port=@p2 output_port=@p3
689
690 AT_DATA([flows.txt], [dnl
691 in_port=1 actions=output:2
692 in_port=2 actions=output:1
693 ])
694 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
695
696 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)"
697 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
698 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
699   [Datapath actions: 2,3
700 ])
701
702 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)"
703 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
704 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
705   [Datapath actions: 1
706 ])
707
708 OVS_VSWITCHD_STOP
709 AT_CLEANUP
710
711
712 AT_SETUP([ofproto-dpif - mirroring, select_vlan])
713 OVS_VSWITCHD_START
714 ADD_OF_PORTS([br0], 1, 2, 3)
715 ovs-vsctl \
716         set Bridge br0 mirrors=@m --\
717         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
718         --id=@m create Mirror name=mymirror select_all=true select_vlan=11 output_port=@p3
719
720 AT_DATA([flows.txt], [dnl
721 in_port=1, actions=output:2
722 ])
723 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
724
725 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)"
726 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
727 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
728   [Datapath actions: 2
729 ])
730
731 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))"
732 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
733 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
734   [Datapath actions: 2
735 ])
736
737 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))"
738 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
739 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
740   [Datapath actions: 2,3
741 ])
742
743 OVS_VSWITCHD_STOP
744 AT_CLEANUP
745
746
747 AT_SETUP([ofproto-dpif - mirroring, output_port])
748 OVS_VSWITCHD_START
749 ADD_OF_PORTS([br0], 1, 2, 3)
750 ovs-vsctl \
751         set Bridge br0 mirrors=@m --\
752         --id=@p3 get Port p3 --\
753         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
754
755 AT_DATA([flows.txt], [dnl
756 in_port=1 actions=mod_vlan_vid:17,output:2
757 in_port=2 actions=output:1
758 ])
759 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
760
761 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)"
762 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
763 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
764   [Datapath actions: push_vlan(vid=17,pcp=0),2,pop_vlan,3
765 ])
766
767 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)"
768 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
769 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
770   [Datapath actions: 1,3
771 ])
772
773 OVS_VSWITCHD_STOP
774 AT_CLEANUP
775
776 AT_SETUP([ofproto-dpif - mirroring, output_vlan])
777 OVS_VSWITCHD_START
778 ADD_OF_PORTS([br0], 1, 2)
779 ovs-vsctl \
780         set Bridge br0 mirrors=@m --\
781         --id=@m create Mirror name=mymirror select_all=true output_vlan=12
782
783 AT_DATA([flows.txt], [dnl
784 in_port=1 actions=output:2
785 in_port=2 actions=mod_vlan_vid:17,output:1
786 ])
787 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
788
789 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)"
790 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
791 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
792
793 expected="2,push_vlan(vid=12,pcp=0),1,2,100"
794 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
795 mv stdout expout
796 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
797
798 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)"
799 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
800 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
801
802 expected="push_vlan(vid=17,pcp=0),1,pop_vlan,push_vlan(vid=12,pcp=0),1,2,100"
803 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
804 mv stdout expout
805 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
806
807 OVS_VSWITCHD_STOP
808 AT_CLEANUP
809
810 m4_define([OFPROTO_TRACE],
811   [flow="$2"
812    AT_CHECK([ovs-appctl ofproto/trace $1 "$flow" $3], [0], [stdout])
813    actual=`tail -1 stdout | sed 's/Datapath actions: //'`
814    expected="$4"
815    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" $5],
816      [0], [stdout])
817    mv stdout expout
818    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" $5],
819      [0], [expout])])
820
821 AT_SETUP([ofproto-dpif - MAC learning])
822 OVS_VSWITCHD_START([set bridge br0 fail-mode=standalone])
823 ADD_OF_PORTS([br0], 1, 2, 3)
824
825 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)'
826
827 # Trace an ARP packet arriving on p3, to create a MAC learning entry.
828 OFPROTO_TRACE(
829   [br0],
830   [in_port(3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
831   [-generate],
832   [1,2,100])
833
834 # Check for the MAC learning entry.
835 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
836  port  VLAN  MAC                Age
837     3     0  50:54:00:00:00:05    ?
838 ])
839
840 # Trace a packet arrival destined for the learned MAC.
841 # (This will also learn a MAC.)
842 OFPROTO_TRACE(
843   [br0],
844   [in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05),$arp],
845   [-generate],
846   [3])
847
848 # Check for both MAC learning entries.
849 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
850  port  VLAN  MAC                Age
851     3     0  50:54:00:00:00:05    ?
852     1     0  50:54:00:00:00:06    ?
853 ])
854
855 # Trace a packet arrival that updates the first learned MAC entry.
856 OFPROTO_TRACE(
857   [br0],
858   [in_port(2),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
859   [-generate],
860   [1,3,100])
861
862 # Check that the MAC learning entry was updated.
863 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
864  port  VLAN  MAC                Age
865     1     0  50:54:00:00:00:06    ?
866     2     0  50:54:00:00:00:05    ?
867 ])
868
869 # Add another bridge.
870 AT_CHECK(
871   [ovs-vsctl \
872      -- add-br br1 \
873      -- set bridge br1 datapath-type=dummy \
874      -- add-port br1 p4 -- set interface p4 type=dummy \
875      -- add-port br1 p5 -- set interface p5 type=dummy])
876
877 # Trace some packet arrivals in br1 to create MAC learning entries there too.
878 OFPROTO_TRACE(
879   [br1],
880   [in_port(4),eth(src=50:54:00:00:00:06,dst=ff:ff:ff:ff:ff:ff),$arp],
881   [-generate],
882   [5,101])
883 OFPROTO_TRACE(
884   [br1],
885   [in_port(5),eth(src=50:54:00:00:00:07,dst=ff:ff:ff:ff:ff:ff),$arp],
886   [-generate],
887   [4,101])
888
889 # Check that the MAC learning entries were added.
890 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
891  port  VLAN  MAC                Age
892     4     0  50:54:00:00:00:06    ?
893     5     0  50:54:00:00:00:07    ?
894 ])
895
896 # Delete port p1 and see that its MAC learning entry disappeared, and
897 # that the MAC learning entry for the same MAC was also deleted from br1.
898 AT_CHECK([ovs-vsctl del-port p1])
899 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
900  port  VLAN  MAC                Age
901     2     0  50:54:00:00:00:05    ?
902 ])
903 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
904  port  VLAN  MAC                Age
905     5     0  50:54:00:00:00:07    ?
906 ])
907
908 OVS_VSWITCHD_STOP
909 AT_CLEANUP
910
911 AT_SETUP([ofproto-dpif - MAC table overflow])
912 OVS_VSWITCHD_START(
913   [set bridge br0 fail-mode=standalone other-config:mac-table-size=10 -- \
914    add-port br0 p1 -- set Interface p1 type=dummy -- \
915    add-port br0 p2 -- set Interface p2 type=dummy -- \
916    add-port br0 p3 -- set Interface p3 type=dummy])
917
918 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)'
919
920 AT_CHECK([ovs-appctl time/stop])
921
922 # Trace 10 ARP packets arriving on p3, to create MAC learning entries.
923 for i in 0 1 2 3 4 5 6 7 8 9; do
924     OFPROTO_TRACE(
925       [br0],
926       [in_port(3),eth(src=50:54:00:00:00:0$i,dst=ff:ff:ff:ff:ff:ff),$arp],
927       [-generate],
928       [1,2,100])
929     ovs-appctl time/warp 1000
930 done
931
932 # Check for the MAC learning entries.
933 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/ *[[0-9]]\{1,\}$//' | sort],
934   [0], [dnl
935     3     0  50:54:00:00:00:00
936     3     0  50:54:00:00:00:01
937     3     0  50:54:00:00:00:02
938     3     0  50:54:00:00:00:03
939     3     0  50:54:00:00:00:04
940     3     0  50:54:00:00:00:05
941     3     0  50:54:00:00:00:06
942     3     0  50:54:00:00:00:07
943     3     0  50:54:00:00:00:08
944     3     0  50:54:00:00:00:09
945  port  VLAN  MAC                Age
946 ])
947
948 # Trace another ARP packet on another MAC.
949 OFPROTO_TRACE(
950   [br0],
951   [in_port(3),eth(src=50:54:00:00:00:10,dst=ff:ff:ff:ff:ff:ff),$arp],
952   [-generate],
953   [1,2,100])
954
955 # Check that the new one chased the oldest one out of the table.
956 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/' | sort],
957   [0], [dnl
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     3     0  50:54:00:00:00:10    ?
968  port  VLAN  MAC                Age
969 ])
970 OVS_VSWITCHD_STOP
971 AT_CLEANUP
972
973 dnl Test that basic NetFlow reports flow statistics correctly:
974 dnl - The initial packet of a flow are correctly accounted.
975 dnl - Later packets within a flow are correctly accounted.
976 dnl - Flow actions changing (in this case, due to MAC learning)
977 dnl   cause a record to be sent.
978 AT_SETUP([ofproto-dpif - NetFlow flow expiration])
979
980 AT_CHECK([perl $srcdir/choose-port.pl], [0], [stdout])
981 NETFLOW_PORT=`cat stdout`
982
983 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
984 ADD_OF_PORTS([br0], 1, 2)
985 ovs-vsctl \
986    set Bridge br0 netflow=@nf -- \
987    --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
988      engine_id=1 engine_type=2 active_timeout=30 add-id-to-interface=false
989
990 ON_EXIT([kill `cat test-netflow.pid`])
991 AT_CHECK([test-netflow --detach --no-chdir --pidfile $NETFLOW_PORT:127.0.0.1 > netflow.log])
992 AT_CAPTURE_FILE([netflow.log])
993
994 for delay in 1000 30000; do
995     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)'
996     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)'
997
998     ovs-appctl time/warp $delay
999 done
1000
1001 sleep 1
1002 OVS_VSWITCHD_STOP
1003 ovs-appctl -t test-netflow exit
1004
1005 AT_CHECK([[sed -e 's/, uptime [0-9]*//
1006 s/, now [0-9.]*//
1007 s/time \([0-9]*\)\.\.\.\1$/time <moment>/
1008 s/time [0-9]*\.\.\.[0-9]*/time <range>/
1009 ' netflow.log | sort]], [0],
1010   [
1011 header: v5, seq 0, engine 2,1
1012 header: v5, seq 1, engine 2,1
1013 seq 0: 192.168.0.1 > 192.168.0.2, if 1 > 65535, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
1014 seq 1: 192.168.0.1 > 192.168.0.2, if 1 > 2, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
1015 seq 1: 192.168.0.2 > 192.168.0.1, if 2 > 1, 2 pkts, 120 bytes, ICMP 0:0, time <range>
1016 ])
1017 AT_CLEANUP
1018
1019 dnl Test that basic NetFlow reports active expirations correctly.
1020 AT_SETUP([ofproto-dpif - NetFlow active expiration])
1021
1022 AT_CHECK([perl $srcdir/choose-port.pl], [0], [stdout])
1023 NETFLOW_PORT=`cat stdout`
1024
1025 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
1026 ADD_OF_PORTS([br0], 1, 2)
1027 ovs-vsctl \
1028    set Bridge br0 netflow=@nf -- \
1029    --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
1030      engine_id=1 engine_type=2 active_timeout=10 add-id-to-interface=false
1031
1032 ON_EXIT([kill `test-netflow.pid`])
1033 AT_CHECK([test-netflow --detach --no-chdir --pidfile $NETFLOW_PORT:127.0.0.1 > netflow.log])AT_CAPTURE_FILE([netflow.log])
1034
1035 AT_CHECK([ovs-appctl time/stop])
1036 n=1
1037 while test $n -le 60; do
1038     n=`expr $n + 1`
1039
1040     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)'
1041     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)'
1042
1043     ovs-appctl time/warp 1000
1044 done
1045
1046 ovs-appctl time/warp 10000
1047
1048 sleep 1
1049 OVS_VSWITCHD_STOP
1050 ovs-appctl -t test-netflow exit
1051
1052 # Count the number of reported packets:
1053 # - From source to destination before MAC learning kicks in (just one).
1054 # - From source to destination after that.
1055 # - From destination to source.
1056 n_learn=0
1057 n_in=0
1058 n_out=0
1059 n_other=0
1060 n_recs=0
1061 none=0
1062 while read line; do
1063     pkts=`echo "$line" | sed 's/.*, \([[0-9]]*\) pkts,.*/\1/'`
1064     case $pkts in
1065          [[0-9]]*) ;;
1066          *) continue ;;
1067     esac
1068
1069     case $line in
1070         "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 65535, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
1071             counter=n_learn
1072             ;;
1073         "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 2, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
1074             counter=n_in
1075             ;;
1076         "seq "*": 192.168.0.2 > 192.168.0.1, if 2 > 1, "*" pkts, "*" bytes, TCP 80 > 1234, time "*)
1077             counter=n_out
1078             ;;
1079         *)
1080             counter=n_other
1081             ;;
1082     esac
1083     eval $counter=\`expr \$$counter + \$pkts\`
1084     n_recs=`expr $n_recs + 1`
1085 done < netflow.log
1086
1087 # There should be exactly 1 MAC learning packet,
1088 # exactly 59 other packets in that direction,
1089 # and exactly 60 packets in the other direction.
1090 AT_CHECK([echo $n_learn $n_in $n_out $n_other], [0], [1 59 60 0
1091 ])
1092
1093 # There should be 1 expiration for MAC learning,
1094 # at least 5 active and a final expiration in one direction,
1095 # and at least 5 active and a final expiration in the other direction.
1096 echo $n_recs
1097 AT_CHECK([test $n_recs -ge 13])
1098
1099 AT_CLEANUP
1100
1101 AT_SETUP([idle_age and hard_age increase over time])
1102 OVS_VSWITCHD_START
1103
1104 # get_ages DURATION HARD IDLE
1105 #
1106 # Fetch the flow duration, hard age, and idle age into the variables
1107 # whose names are given as arguments.  Rounds DURATION down to the
1108 # nearest integer.  If hard_age doesn't appear in the output, sets
1109 # HARD to "none".  If idle_age doesn't appear in the output, sets IDLE
1110 # to 0.
1111 get_ages () {
1112     AT_CHECK([ovs-ofctl dump-flows br0], [0], [stdout])
1113
1114     duration=`sed -n 's/.*duration=\([[0-9]]*\)\(\.[[0-9]]*\)\{0,1\}s.*/\1/p' stdout`
1115     AT_CHECK([[expr X"$duration" : 'X[0-9][0-9]*$']], [0], [ignore])
1116     AS_VAR_COPY([$1], [duration])
1117
1118     hard=`sed -n 's/.*hard_age=\([[0-9]]*\),.*/\1/p' stdout`
1119     if test X"$hard" = X; then
1120         hard=none
1121     else
1122         AT_CHECK([[expr X"$hard" : 'X[0-9][0-9]*$']], [0], [ignore])
1123     fi
1124     AS_VAR_COPY([$2], [hard])
1125
1126     idle=`sed -n 's/.*idle_age=\([[0-9]]*\),.*/\1/p' stdout`
1127     if test X"$idle" = X; then
1128         idle=0
1129     else
1130         AT_CHECK([[expr X"$idle" : 'X[0-9][0-9]*$']], [0], [ignore])
1131     fi
1132     AS_VAR_COPY([$3], [idle])
1133 }
1134
1135 # Add a flow and get its initial hard and idle age.
1136 AT_CHECK([ovs-ofctl add-flow br0 hard_timeout=199,idle_timeout=188,actions=drop])
1137 get_ages duration1 hard1 idle1
1138
1139 # Warp time forward by 10 seconds, then modify the flow's actions.
1140 ovs-appctl time/warp 10000
1141 get_ages duration2 hard2 idle2
1142 AT_CHECK([ovs-ofctl mod-flows br0 actions=flood])
1143
1144 # Warp time forward by 10 seconds.
1145 ovs-appctl time/warp 10000
1146 get_ages duration3 hard3 idle3
1147
1148 # Warp time forward 10 more seconds, then pass some packets through the flow,
1149 # then warp forward a few more times because idle times are only updated
1150 # occasionally.
1151 ovs-appctl time/warp 10000
1152 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)'
1153 ovs-appctl time/warp 1000
1154 ovs-appctl time/warp 1000
1155 ovs-appctl time/warp 1000
1156 get_ages duration4 hard4 idle4
1157
1158 printf "duration: %4s => %4s => %4s => %4s\n" $duration1 $duration2 $duration3 $duration4
1159 printf "hard_age: %4s => %4s => %4s => %4s\n" $hard1 $hard2 $hard3 $hard4
1160 printf "idle_age: %4s => %4s => %4s => %4s\n" $idle1 $idle2 $idle3 $idle4
1161
1162 # Duration should increase steadily over time.
1163 AT_CHECK([test $duration1 -lt $duration2])
1164 AT_CHECK([test $duration2 -lt $duration3])
1165 AT_CHECK([test $duration3 -lt $duration4])
1166
1167 # Hard age should be "none" initially because it's the same as flow_duration,
1168 # then it should increase.
1169 AT_CHECK([test $hard1 = none])
1170 AT_CHECK([test $hard2 = none])
1171 AT_CHECK([test $hard3 != none])
1172 AT_CHECK([test $hard4 != none])
1173 AT_CHECK([test $hard3 -lt $hard4])
1174
1175 # Idle age should increase from 1 to 2 to 3, then decrease.
1176 AT_CHECK([test $idle1 -lt $idle2])
1177 AT_CHECK([test $idle2 -lt $idle3])
1178 AT_CHECK([test $idle3 -gt $idle4])
1179
1180 # Check some invariant relationships.
1181 AT_CHECK([test $duration1 = $idle1])
1182 AT_CHECK([test $duration2 = $idle2])
1183 AT_CHECK([test $duration3 = $idle3])
1184 AT_CHECK([test $idle3 -gt $hard3])
1185 AT_CHECK([test $idle4 -lt $hard4])
1186 AT_CHECK([test $hard4 -lt $duration4])
1187
1188 OVS_VSWITCHD_STOP
1189 AT_CLEANUP
1190
1191 AT_SETUP([ofproto-dpif - fin_timeout])
1192 OVS_VSWITCHD_START
1193 AT_DATA([flows.txt], [dnl
1194 in_port=1 actions=output:2
1195 in_port=2 actions=mod_vlan_vid:17,output:1
1196 ])
1197 AT_CHECK([ovs-ofctl add-flow br0 'idle_timeout=60,actions=fin_timeout(idle_timeout=5)'])
1198 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1199 [NXST_FLOW reply:
1200  idle_timeout=60, actions=fin_timeout(idle_timeout=5)
1201 ])
1202 # Check that a TCP SYN packet does not change the timeout.  (Because
1203 # flow stats updates are mainly what implements the fin_timeout
1204 # feature, we warp forward a couple of times to ensure that flow stats
1205 # run before re-checking the flow table.)
1206 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f908004500003c2e2440004006465dac11370dac11370b828b0016751e267b00000000a00216d017360000020405b40402080a2d25085f0000000001030307], [0], [success
1207 ])
1208 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
1209 warped
1210 ])
1211 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1212 [NXST_FLOW reply:
1213  n_packets=1, n_bytes=74, idle_timeout=60, actions=fin_timeout(idle_timeout=5)
1214 ])
1215 # Check that a TCP FIN packet does change the timeout.
1216 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f90800451000342e3e40004006463bac11370dac11370b828b0016751e319dfc96399b801100717ae800000101080a2d250a9408579588], [0], [success
1217 ])
1218 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
1219 warped
1220 ])
1221 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1222 [NXST_FLOW reply:
1223  n_packets=2, n_bytes=140, idle_timeout=5, actions=fin_timeout(idle_timeout=5)
1224 ])
1225 OVS_VSWITCHD_STOP
1226 AT_CLEANUP
1227
1228 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-dps])
1229 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
1230 ADD_OF_PORTS([br0], [1], [2])
1231 ADD_OF_PORTS([br1], [3])
1232
1233 AT_CHECK([ovs-appctl dpif/dump-dps], [0], [dnl
1234 dummy@br0
1235 dummy@br1
1236 ])
1237 OVS_VSWITCHD_STOP
1238 AT_CLEANUP
1239
1240 AT_SETUP([ofproto-dpif - ovs-appctl dpif/show])
1241 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
1242 ADD_OF_PORTS([br0], [1], [2])
1243 ADD_OF_PORTS([br1], [3])
1244
1245 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
1246 br0 (dummy@ovs-dummy):
1247         lookups: hit:0 missed:0 lost:0
1248         flows: 0
1249         br0 65534/100: (dummy)
1250         p1 1/1: (dummy)
1251         p2 2/2: (dummy)
1252 br1 (dummy@ovs-dummy):
1253         lookups: hit:0 missed:0 lost:0
1254         flows: 0
1255         br1 65534/101: (dummy)
1256         p3 3/3: (dummy)
1257 ])
1258
1259 AT_CHECK([ovs-appctl dpif/show br0], [0], [dnl
1260 br0 (dummy@ovs-dummy):
1261         lookups: hit:0 missed:0 lost:0
1262         flows: 0
1263         br0 65534/100: (dummy)
1264         p1 1/1: (dummy)
1265         p2 2/2: (dummy)
1266 ])
1267 OVS_VSWITCHD_STOP
1268 AT_CLEANUP
1269
1270 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-flows])
1271 OVS_VSWITCHD_START([add-br br1 -- \
1272                     set bridge br1 datapath-type=dummy fail-mode=secure])
1273 ADD_OF_PORTS([br0], [1], [2])
1274 ADD_OF_PORTS([br1], [3])
1275
1276 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
1277 ])
1278 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
1279 ])
1280 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
1281 ])
1282
1283 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
1284 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
1285 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
1286 ])
1287
1288 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
1289 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
1290 ])
1291
1292 OVS_VSWITCHD_STOP
1293 AT_CLEANUP
1294
1295 AT_SETUP([ofproto-dpif - ovs-appctl dpif/del-flows])
1296 OVS_VSWITCHD_START([add-br br1 -- \
1297                     set bridge br1 datapath-type=dummy fail-mode=secure])
1298 ADD_OF_PORTS([br0], [1], [2])
1299 ADD_OF_PORTS([br1], [3])
1300
1301 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
1302 ])
1303 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
1304 ])
1305 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
1306 ])
1307
1308 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
1309 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
1310 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
1311 ])
1312
1313 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
1314 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
1315 ])
1316
1317 AT_CHECK([ovs-appctl dpif/del-flows br0])
1318 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
1319 ])
1320
1321 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
1322 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
1323 ])
1324
1325 OVS_VSWITCHD_STOP
1326 AT_CLEANUP
1327
1328 AT_SETUP([ofproto-dpif - patch ports])
1329 OVS_VSWITCHD_START([add-br br1 \
1330 -- set bridge br1 datapath-type=dummy fail-mode=secure \
1331 -- add-port br1 pbr1 -- set int pbr1 type=patch options:peer=pbr0 \
1332 -- add-port br0 pbr0 -- set int pbr0 type=patch options:peer=pbr1])
1333
1334 ADD_OF_PORTS([br0], [2])
1335 ADD_OF_PORTS([br1], [3])
1336
1337 AT_CHECK([ovs-ofctl add-flow br0 actions=LOCAL,output:1,output:2])
1338 AT_CHECK([ovs-ofctl add-flow br1 actions=LOCAL,output:1,output:3])
1339
1340 for i in $(seq 1 10); do
1341     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)'
1342 done
1343
1344 for i in $(seq 1 5); do
1345     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)'
1346 done
1347
1348 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
1349 br0 (dummy@ovs-dummy):
1350         lookups: hit:13 missed:2 lost:0
1351         flows: 1
1352         br0 65534/100: (dummy)
1353         p2 2/2: (dummy)
1354         pbr0 1/none: (patch: peer=pbr1)
1355 br1 (dummy@ovs-dummy):
1356         lookups: hit:13 missed:2 lost:0
1357         flows: 1
1358         br1 65534/101: (dummy)
1359         p3 3/3: (dummy)
1360         pbr1 1/none: (patch: peer=pbr0)
1361 ])
1362
1363 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_USED], [0], [dnl
1364 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
1365 ]),
1366 AT_CHECK([ovs-appctl dpif/dump-flows br1 | STRIP_USED], [0], [dnl
1367 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
1368 ])
1369
1370 AT_CHECK([ovs-ofctl dump-ports br0 pbr0], [0], [dnl
1371 OFPST_PORT reply (xid=0x4): 1 ports
1372   port  1: rx pkts=5, bytes=300, drop=0, errs=0, frame=0, over=0, crc=0
1373            tx pkts=10, bytes=600, drop=0, errs=0, coll=0
1374 ])
1375
1376 AT_CHECK([ovs-ofctl dump-ports br1 pbr1], [0], [dnl
1377 OFPST_PORT reply (xid=0x4): 1 ports
1378   port  1: rx pkts=10, bytes=600, drop=0, errs=0, frame=0, over=0, crc=0
1379            tx pkts=5, bytes=300, drop=0, errs=0, coll=0
1380 ])
1381
1382 OVS_VSWITCHD_STOP
1383 AT_CLEANUP