update sliver-ovs to new ovsdb syntax
[sliver-openvswitch.git] / tests / learn.at
1 AT_BANNER([learning action])
2
3 AT_SETUP([learning action - parsing and formatting])
4 AT_DATA([flows.txt], [[
5 actions=learn()
6 actions=learn(NXM_OF_VLAN_TCI[0..11], NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[], output:NXM_OF_IN_PORT[], load:10->NXM_NX_REG0[5..10])
7 actions=learn(table=1,idle_timeout=10, hard_timeout=20, fin_idle_timeout=5, fin_hard_timeout=10, priority=10, cookie=0xfedcba9876543210, in_port=99,NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:NXM_OF_IN_PORT[]->NXM_NX_REG1[16..31])
8 ]])
9 AT_CHECK([ovs-ofctl parse-flows flows.txt], [0],
10 [[usable protocols: any
11 chosen protocol: OpenFlow10-table_id
12 OFPT_FLOW_MOD (xid=0x1): ADD actions=learn(table=1)
13 OFPT_FLOW_MOD (xid=0x2): ADD actions=learn(table=1,NXM_OF_VLAN_TCI[0..11],NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],output:NXM_OF_IN_PORT[],load:0xa->NXM_NX_REG0[5..10])
14 OFPT_FLOW_MOD (xid=0x3): ADD actions=learn(table=1,idle_timeout=10,hard_timeout=20,fin_idle_timeout=5,fin_hard_timeout=10,priority=10,cookie=0xfedcba9876543210,in_port=99,NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:NXM_OF_IN_PORT[]->NXM_NX_REG1[16..31])
15 ]])
16 AT_CLEANUP
17
18 AT_SETUP([learning action - parsing and formatting - illegal in_port_oxm])
19 AT_CHECK([[ovs-ofctl parse-flow 'actions=learn(table=1, in_port_oxm=123456)']],
20   [1], [], [stderr])
21 AT_CHECK([sed -e 's/.*|ofp_util|WARN|//' < stderr], [0],
22   [[port 123456 is outside the supported range 0 through ffff or 0xffffff00 through 0xffffffff
23 ovs-ofctl: 123456: port value out of range for in_port_oxm
24 ]], [[]])
25 AT_CLEANUP
26
27 AT_SETUP([learning action - parsing and formatting - OXM])
28 AT_DATA([flows.txt], [[
29 actions=learn(output:OXM_OF_IN_PORT[])
30 actions=learn(table=1, in_port=1, load:OXM_OF_IN_PORT[]->NXM_NX_REG1[], load:0xfffffffe->OXM_OF_IN_PORT[])
31 ]])
32 AT_CHECK([ovs-ofctl parse-flows flows.txt], [0],
33 [[usable protocols: any
34 chosen protocol: OpenFlow10-table_id
35 OFPT_FLOW_MOD (xid=0x1): ADD actions=learn(table=1,output:OXM_OF_IN_PORT[])
36 OFPT_FLOW_MOD (xid=0x2): ADD actions=learn(table=1,in_port=1,load:OXM_OF_IN_PORT[]->NXM_NX_REG1[],load:0xfffffffe->OXM_OF_IN_PORT[])
37 ]])
38 AT_CLEANUP
39
40 AT_SETUP([learning action - examples])
41 AT_DATA([flows.txt], [[
42 # These are the examples from nicira-ext.h.
43 actions=learn(in_port=99,NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[], load:NXM_OF_IN_PORT[]->NXM_NX_REG1[16..31])
44 actions=learn(NXM_OF_VLAN_TCI[0..11], NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],output:NXM_OF_IN_PORT[])
45 table=0 actions=learn(table=1,hard_timeout=10, NXM_OF_VLAN_TCI[0..11],output:NXM_OF_IN_PORT[]), resubmit(,1)
46 table=1 priority=0 actions=flood
47 ]])
48 AT_CHECK([ovs-ofctl parse-flows flows.txt], [0],
49 [[usable protocols: OXM,OpenFlow10+table_id,NXM+table_id
50 chosen protocol: OpenFlow10+table_id
51 OFPT_FLOW_MOD (xid=0x1): ADD table:255 actions=learn(table=1,in_port=99,NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:NXM_OF_IN_PORT[]->NXM_NX_REG1[16..31])
52 OFPT_FLOW_MOD (xid=0x2): ADD table:255 actions=learn(table=1,NXM_OF_VLAN_TCI[0..11],NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],output:NXM_OF_IN_PORT[])
53 OFPT_FLOW_MOD (xid=0x3): ADD actions=learn(table=1,hard_timeout=10,NXM_OF_VLAN_TCI[0..11],output:NXM_OF_IN_PORT[]),resubmit(,1)
54 OFPT_FLOW_MOD (xid=0x4): ADD table:1 priority=0 actions=FLOOD
55 ]])
56 AT_CLEANUP
57
58 AT_SETUP([learning action - satisfied prerequisites])
59 AT_DATA([flows.txt],
60 [[actions=learn(eth_type=0x800,load:5->NXM_OF_IP_DST[])
61 ip,actions=learn(load:NXM_OF_IP_DST[]->NXM_NX_REG1[])
62 ip,actions=learn(eth_type=0x800,OXM_OF_IPV4_DST[])
63 ]])
64 AT_CHECK([ovs-ofctl parse-flows flows.txt], [0],
65 [[usable protocols: any
66 chosen protocol: OpenFlow10-table_id
67 OFPT_FLOW_MOD (xid=0x1): ADD actions=learn(table=1,eth_type=0x800,load:0x5->NXM_OF_IP_DST[])
68 OFPT_FLOW_MOD (xid=0x2): ADD ip actions=learn(table=1,load:NXM_OF_IP_DST[]->NXM_NX_REG1[])
69 OFPT_FLOW_MOD (xid=0x3): ADD ip actions=learn(table=1,eth_type=0x800,NXM_OF_IP_DST[])
70 ]])
71 AT_CLEANUP
72
73 AT_SETUP([learning action - invalid prerequisites])
74 AT_CHECK([[ovs-ofctl parse-flow 'actions=learn(load:5->NXM_OF_IP_DST[])']],
75   [1], [], [stderr])
76 AT_CHECK([sed -e 's/.*|meta_flow|WARN|//' < stderr], [0],
77   [[destination field ip_dst lacks correct prerequisites
78 ]], [[]])
79 AT_CHECK([[ovs-ofctl parse-flow 'actions=learn(load:NXM_OF_IP_DST[]->NXM_NX_REG1[])']],
80   [1], [], [stderr])
81 AT_CHECK([sed -e 's/.*|meta_flow|WARN|//' < stderr], [0],
82   [[source field ip_dst lacks correct prerequisites
83 ]])
84 AT_CLEANUP
85
86 AT_SETUP([learning action - standard VLAN+MAC learning])
87 OVS_VSWITCHD_START(
88   [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1 -- \
89    add-port br0 p2 -- set Interface p2 type=dummy ofport_request=2 -- \
90    add-port br0 p3 -- set Interface p3 type=dummy ofport_request=3])
91 # Set up flow table for VLAN+MAC learning.
92 AT_DATA([flows.txt], [[
93 table=0 actions=learn(table=1, hard_timeout=60, NXM_OF_VLAN_TCI[0..11], NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[], output:NXM_OF_IN_PORT[]), resubmit(,1)
94 table=1 priority=0 actions=flood
95 ]])
96 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
97
98 # Trace an ARP packet arriving on port 3, to create a MAC learning entry.
99 flow="in_port(3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),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)"
100 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow" -generate], [0], [stdout])
101 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
102
103 expected="1,2,100"
104 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
105 mv stdout expout
106 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
107
108 # Check for the MAC learning entry.
109 AT_CHECK([ovs-ofctl dump-flows br0 table=1 | ofctl_strip | sort], [0], [dnl
110  table=1, hard_timeout=60, vlan_tci=0x0000/0x0fff,dl_dst=50:54:00:00:00:05 actions=output:3
111  table=1, priority=0 actions=FLOOD
112 NXST_FLOW reply:
113 ])
114
115 # Trace a packet arrival destined for the learned MAC.
116 # (This will also learn a MAC.)
117 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05),eth_type(0x0806),arp(sip=192.168.0.2,tip=192.168.0.1,op=2,sha=50:54:00:00:00:06,tha=50:54:00:00:00:05)' -generate], [0], [stdout])
118 AT_CHECK([tail -1 stdout], [0], [Datapath actions: 3
119 ])
120
121 # Check for both MAC learning entries.
122 AT_CHECK([ovs-ofctl dump-flows br0 table=1 | ofctl_strip |sort], [0], [dnl
123  table=1, hard_timeout=60, vlan_tci=0x0000/0x0fff,dl_dst=50:54:00:00:00:05 actions=output:3
124  table=1, hard_timeout=60, vlan_tci=0x0000/0x0fff,dl_dst=50:54:00:00:00:06 actions=output:1
125  table=1, priority=0 actions=FLOOD
126 NXST_FLOW reply:
127 ])
128
129 # Trace a packet arrival that updates the first learned MAC entry.
130 flow="in_port(2),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),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)"
131 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow" -generate], [0], [stdout])
132 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
133
134 expected="1,3,100"
135 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
136 mv stdout expout
137 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
138
139 # Check that the MAC learning entry was updated.
140 AT_CHECK([ovs-ofctl dump-flows br0 table=1 | ofctl_strip | sort], [0], [dnl
141  table=1, hard_timeout=60, vlan_tci=0x0000/0x0fff,dl_dst=50:54:00:00:00:05 actions=output:2
142  table=1, hard_timeout=60, vlan_tci=0x0000/0x0fff,dl_dst=50:54:00:00:00:06 actions=output:1
143  table=1, priority=0 actions=FLOOD
144 NXST_FLOW reply:
145 ])
146 OVS_VSWITCHD_STOP
147 AT_CLEANUP
148
149 dnl This test checks that repeated uses of a "learn" action cause the
150 dnl modified time of the learned flow to advance.  Otherwise, the
151 dnl learned flow will expire after its hard timeout even though it's
152 dnl supposed to be refreshed.  (The expiration can be hard to see since
153 dnl it gets re-learned again the next time a packet appears, but
154 dnl sometimes the expiration can cause temporary flooding etc.)
155 AT_SETUP([learning action - learn refreshes hard_age])
156 OVS_VSWITCHD_START(
157   [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1 -- \
158    add-port br0 p2 -- set Interface p2 type=dummy ofport_request=2 -- \
159    add-port br0 p3 -- set Interface p3 type=dummy ofport_request=3])
160
161 ovs-appctl time/stop
162
163 # Set up flow table for MAC learning.
164 AT_DATA([flows.txt], [[
165 table=0 actions=learn(table=1, hard_timeout=10, NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[], output:NXM_OF_IN_PORT[]), resubmit(,1)
166 table=1 priority=0 actions=flood
167 ]])
168 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
169
170 # Trace an ICMP packet arriving on port 3, to create a MAC learning entry.
171 flow="in_port(3),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)"
172 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow" -generate], [0], [stdout])
173 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
174
175 expected="1,2,100"
176 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
177 mv stdout expout
178 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
179
180 # Check that the MAC learning entry appeared.
181 AT_CHECK([ovs-ofctl dump-flows br0 table=1 | ofctl_strip | sort], [0], [dnl
182  table=1, hard_timeout=10, dl_dst=50:54:00:00:00:07 actions=output:3
183  table=1, priority=0 actions=FLOOD
184 NXST_FLOW reply:
185 ])
186
187 # For 25 seconds, make sure that the MAC learning entry doesn't
188 # disappear as long as we refresh it every second.
189 for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25; do
190     ovs-appctl time/warp 1000
191     AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow" -generate], [0], [stdout])
192
193     # Check that the entry is there.
194     AT_CHECK([ovs-ofctl dump-flows br0 table=1], [0], [stdout])
195     AT_CHECK([ofctl_strip < stdout | sort], [0], [dnl
196  table=1, hard_timeout=10, dl_dst=50:54:00:00:00:07 actions=output:3
197  table=1, priority=0 actions=FLOOD
198 NXST_FLOW reply:
199 ])
200
201     if test $i != 1; then
202         # Check that hard_age has appeared.  We need to do this separately
203         # from the above check because ofctl_strip removes it.  dump-flows
204         # only prints hard_age when it is different from the flow's duration
205         # (that is, the number of seconds from the time it was created),
206         # so we only check for it after we've refreshed the flow once.
207         AT_CHECK([grep dl_dst=50:54:00:00:00:07 stdout | grep -c hard_age],
208                  [0], [1
209 ])
210     fi
211 done
212
213 # Make sure that 15 seconds without refreshing makes the flow time out.
214 ovs-appctl time/warp 5000
215 ovs-appctl time/warp 5000
216 ovs-appctl time/warp 5000
217     AT_CHECK([ovs-ofctl dump-flows br0 table=1 | ofctl_strip | sort], [0], [dnl
218  table=1, priority=0 actions=FLOOD
219 NXST_FLOW reply:
220 ])
221 OVS_VSWITCHD_STOP
222 AT_CLEANUP
223
224 AT_SETUP([learning action - TCPv4 port learning])
225 OVS_VSWITCHD_START(
226   [add-port br0 p1 -- set Interface p1 type=dummy -- \
227    add-port br0 p2 -- set Interface p2 type=dummy -- \
228    add-port br0 p3 -- set Interface p3 type=dummy])
229 # Set up flow table for TCPv4 port learning.
230 AT_CHECK([[ovs-ofctl add-flow br0 'table=0 tcp actions=learn(table=1, hard_timeout=60, eth_type=0x800, nw_proto=6, NXM_OF_IP_SRC[]=NXM_OF_IP_DST[], NXM_OF_IP_DST[]=NXM_OF_IP_SRC[], NXM_OF_TCP_SRC[]=NXM_OF_TCP_DST[], NXM_OF_TCP_DST[]=NXM_OF_TCP_SRC[]), flood']])
231
232 # Trace a TCPv4 packet arriving on port 3.
233 flow="in_port(3),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:06),eth_type(0x0800),ipv4(src=192.168.0.2,dst=192.168.0.1,proto=6,tos=0,ttl=64,frag=no),tcp(src=40000,dst=80)"
234 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow" -generate], [0], [stdout])
235 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
236
237 expected="1,2,100"
238 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
239 mv stdout expout
240 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
241
242 # Check for the learning entry.
243 AT_CHECK([ovs-ofctl dump-flows br0 table=1 | ofctl_strip | sort], [0], [dnl
244  table=1, hard_timeout=60, tcp,nw_src=192.168.0.1,nw_dst=192.168.0.2,tp_src=80,tp_dst=40000 actions=drop
245 NXST_FLOW reply:
246 ])
247 OVS_VSWITCHD_STOP
248 AT_CLEANUP
249
250 AT_SETUP([learning action - TCPv6 port learning])
251 OVS_VSWITCHD_START(
252   [add-port br0 p1 -- set Interface p1 type=dummy -- \
253    add-port br0 p2 -- set Interface p2 type=dummy -- \
254    add-port br0 p3 -- set Interface p3 type=dummy])
255 # Set up flow table for TCPv6 port learning.
256 # Also add a 128-bit-wide "load" action and a 128-bit literal match to check
257 # that they work.
258 AT_CHECK([[ovs-ofctl add-flow br0 'table=0 tcp6 actions=learn(table=1, hard_timeout=60, eth_type=0x86dd, nw_proto=6, NXM_NX_IPV6_SRC[]=NXM_NX_IPV6_DST[], ipv6_dst=2001:0db8:85a3:0000:0000:8a2e:0370:7334, NXM_OF_TCP_SRC[]=NXM_OF_TCP_DST[], NXM_OF_TCP_DST[]=NXM_OF_TCP_SRC[], load(0x20010db885a308d313198a2e03707348->NXM_NX_IPV6_DST[])), flood']])
259
260 # Trace a TCPv6 packet arriving on port 3.
261 flow="in_port(3),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:06),eth_type(0x86dd),ipv6(src=fec0::2,dst=fec0::1,label=0,proto=6,tclass=0,hlimit=255,frag=no),tcp(src=40000,dst=80)"
262 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow" -generate], [0], [stdout])
263 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
264
265 expected="1,2,100"
266 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
267 mv stdout expout
268 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
269
270 # Check for the learning entry.
271 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
272  table=1, hard_timeout=60, tcp6,ipv6_src=fec0::1,ipv6_dst=2001:db8:85a3::8a2e:370:7334,tp_src=80,tp_dst=40000 actions=load:0x13198a2e03707348->NXM_NX_IPV6_DST[[0..63]],load:0x20010db885a308d3->NXM_NX_IPV6_DST[[64..127]]
273  tcp6 actions=learn(table=1,hard_timeout=60,eth_type=0x86dd,nw_proto=6,NXM_NX_IPV6_SRC[[]]=NXM_NX_IPV6_DST[[]],ipv6_dst=2001:db8:85a3::8a2e:370:7334,NXM_OF_TCP_SRC[[]]=NXM_OF_TCP_DST[[]],NXM_OF_TCP_DST[[]]=NXM_OF_TCP_SRC[[]],load:0x20010db885a308d313198a2e03707348->NXM_NX_IPV6_DST[[]]),FLOOD
274 NXST_FLOW reply:
275 ])
276 OVS_VSWITCHD_STOP
277 AT_CLEANUP
278
279 # In this use of a learn action, the first packet in the flow creates
280 # a new flow that changes the behavior of subsequent packets in the
281 # flow.
282 AT_SETUP([learning action - self-modifying flow])
283 OVS_VSWITCHD_START
284 ADD_OF_PORTS([br0], 1, 2, 3)
285
286 # Set up flow table for TCPv4 port learning.
287 AT_CHECK([[ovs-ofctl add-flow br0 'actions=load:3->NXM_NX_REG0[0..15],learn(table=0,priority=65535,NXM_OF_ETH_SRC[],NXM_OF_VLAN_TCI[0..11],output:NXM_NX_REG0[0..15]),output:2']])
288
289 # Trace some packets arriving.  The particular packets don't matter.
290 for i in 1 2 3 4 5 6 7 8 9 10; do
291     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)'
292 done
293
294 # Check for the learning entry.
295 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0],
296 [[ n_packets=1, n_bytes=60, actions=load:0x3->NXM_NX_REG0[0..15],learn(table=0,priority=65535,NXM_OF_ETH_SRC[],NXM_OF_VLAN_TCI[0..11],output:NXM_NX_REG0[0..15]),output:2
297  priority=65535,vlan_tci=0x0000/0x0fff,dl_src=50:54:00:00:00:05 actions=output:3
298 NXST_FLOW reply:
299 ]])
300
301 # Check that the first packet went out port 2 and the rest out port 3.
302 AT_CHECK(
303   [(ovs-ofctl dump-ports br0 2; ovs-ofctl dump-ports br0 3) | STRIP_XIDS], [0],
304   [OFPST_PORT reply: 1 ports
305   port  2: rx pkts=0, bytes=0, drop=0, errs=0, frame=0, over=0, crc=0
306            tx pkts=1, bytes=60, drop=0, errs=0, coll=0
307 OFPST_PORT reply: 1 ports
308   port  3: rx pkts=0, bytes=0, drop=0, errs=0, frame=0, over=0, crc=0
309            tx pkts=9, bytes=540, drop=0, errs=0, coll=0
310 ])
311 OVS_VSWITCHD_STOP
312 AT_CLEANUP
313
314 AT_SETUP([learning action - fin_timeout feature])
315 # This is a totally artificial use of the "learn" action.  The only purpose
316 # is to check that specifying fin_idle_timeout or fin_hard_timeout causes
317 # a corresponding fin_timeout action to end up in the learned flows.
318 OVS_VSWITCHD_START(
319     [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1])
320 AT_CHECK([[ovs-ofctl add-flow br0 'actions=learn(fin_hard_timeout=10, fin_idle_timeout=5, NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[], output:NXM_OF_IN_PORT[])']])
321 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(1),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),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)' -generate], [0], [ignore])
322 AT_CHECK([ovs-ofctl dump-flows br0 table=1 | ofctl_strip], [0],
323 [NXST_FLOW reply:
324  table=1, dl_dst=50:54:00:00:00:05 actions=fin_timeout(idle_timeout=5,hard_timeout=10),output:1
325 ])
326 OVS_VSWITCHD_STOP
327 AT_CLEANUP