]> git.proxmox.com Git - mirror_ovs.git/blame - tests/learn.at
db-ctl-base: Add {in} and {not-in} set relational operators.
[mirror_ovs.git] / tests / learn.at
CommitLineData
75a75043
BP
1AT_BANNER([learning action])
2
3AT_SETUP([learning action - parsing and formatting])
4AT_DATA([flows.txt], [[
5actions=learn()
35f48b8b
BP
6actions=learn(send_flow_rem)
7actions=learn(delete_learned)
8actions=learn(send_flow_rem,delete_learned)
75a75043 9actions=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])
21b2fa61 10actions=learn(table=1,idle_timeout=10, hard_timeout=20, fin_idle_timeout=5, fin_hard_timeout=10, priority=10, cookie=0xfedcba9876543210, in_port=99,eth_dst=eth_src,load:in_port->reg1[16..31])
4c71600d
DDP
11actions=learn(limit=4096)
12actions=learn(limit=4096,result_dst=reg0[0])
75a75043
BP
13]])
14AT_CHECK([ovs-ofctl parse-flows flows.txt], [0],
aa233d57 15[[usable protocols: any
27527aa0
BP
16chosen protocol: OpenFlow10-table_id
17OFPT_FLOW_MOD (xid=0x1): ADD actions=learn(table=1)
35f48b8b
BP
18OFPT_FLOW_MOD (xid=0x2): ADD actions=learn(table=1,send_flow_rem)
19OFPT_FLOW_MOD (xid=0x3): ADD actions=learn(table=1,delete_learned)
20OFPT_FLOW_MOD (xid=0x4): ADD actions=learn(table=1,send_flow_rem,delete_learned)
21OFPT_FLOW_MOD (xid=0x5): 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])
22OFPT_FLOW_MOD (xid=0x6): 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])
4c71600d
DDP
23OFPT_FLOW_MOD (xid=0x7): ADD actions=learn(table=1,limit=4096)
24OFPT_FLOW_MOD (xid=0x8): ADD actions=learn(table=1,limit=4096,result_dst=NXM_NX_REG0[0])
75a75043
BP
25]])
26AT_CLEANUP
eddfcba7 27
72333065
JR
28AT_SETUP([learning action - parsing and formatting - illegal in_port_oxm])
29AT_CHECK([[ovs-ofctl parse-flow 'actions=learn(table=1, in_port_oxm=123456)']],
30 [1], [], [stderr])
0d71302e 31AT_CHECK([sed -e 's/.*|ofp_port|WARN|//' < stderr], [0],
72333065 32 [[port 123456 is outside the supported range 0 through ffff or 0xffffff00 through 0xffffffff
21b2fa61 33ovs-ofctl: table=1, in_port_oxm=123456: in_port_oxm value 123456 cannot be parsed as a subfield (123456: unknown field `123456') or an immediate value (123456: port value out of range for in_port_oxm)
72333065
JR
34]], [[]])
35AT_CLEANUP
36
37AT_SETUP([learning action - parsing and formatting - OXM])
38AT_DATA([flows.txt], [[
39actions=learn(output:OXM_OF_IN_PORT[])
40actions=learn(table=1, in_port=1, load:OXM_OF_IN_PORT[]->NXM_NX_REG1[], load:0xfffffffe->OXM_OF_IN_PORT[])
41]])
db0b6c29 42AT_CHECK([ovs-ofctl -O OpenFlow12 parse-flows flows.txt], [0],
aa233d57 43[[usable protocols: any
db0b6c29 44chosen protocol: OXM-OpenFlow12
0e197060
BP
45OFPT_FLOW_MOD (OF1.2) (xid=0x1): ADD actions=learn(table=1,output:OXM_OF_IN_PORT[])
46OFPT_FLOW_MOD (OF1.2) (xid=0x2): ADD actions=learn(table=1,in_port=1,load:OXM_OF_IN_PORT[]->NXM_NX_REG1[],load:0xfffffffe->OXM_OF_IN_PORT[])
72333065
JR
47]])
48AT_CLEANUP
49
eddfcba7
BP
50AT_SETUP([learning action - examples])
51AT_DATA([flows.txt], [[
0da61033 52# These are the examples from ofp-actions.c.
eddfcba7
BP
53actions=learn(in_port=99,NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[], load:NXM_OF_IN_PORT[]->NXM_NX_REG1[16..31])
54actions=learn(NXM_OF_VLAN_TCI[0..11], NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],output:NXM_OF_IN_PORT[])
55table=0 actions=learn(table=1,hard_timeout=10, NXM_OF_VLAN_TCI[0..11],output:NXM_OF_IN_PORT[]), resubmit(,1)
56table=1 priority=0 actions=flood
57]])
58AT_CHECK([ovs-ofctl parse-flows flows.txt], [0],
aa233d57 59[[usable protocols: OXM,OpenFlow10+table_id,NXM+table_id,OpenFlow11
27527aa0
BP
60chosen protocol: OpenFlow10+table_id
61OFPT_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])
62OFPT_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[])
63OFPT_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)
64OFPT_FLOW_MOD (xid=0x4): ADD table:1 priority=0 actions=FLOOD
eddfcba7
BP
65]])
66AT_CLEANUP
75a75043
BP
67
68AT_SETUP([learning action - satisfied prerequisites])
69AT_DATA([flows.txt],
70[[actions=learn(eth_type=0x800,load:5->NXM_OF_IP_DST[])
71ip,actions=learn(load:NXM_OF_IP_DST[]->NXM_NX_REG1[])
b5e5143b 72ip,actions=learn(eth_type=0x800,OXM_OF_IPV4_DST[])
75a75043
BP
73]])
74AT_CHECK([ovs-ofctl parse-flows flows.txt], [0],
aa233d57 75[[usable protocols: any
27527aa0 76chosen protocol: OpenFlow10-table_id
f25d0cf3 77OFPT_FLOW_MOD (xid=0x1): ADD actions=learn(table=1,eth_type=0x800,load:0x5->NXM_OF_IP_DST[])
75a75043
BP
78OFPT_FLOW_MOD (xid=0x2): ADD ip actions=learn(table=1,load:NXM_OF_IP_DST[]->NXM_NX_REG1[])
79OFPT_FLOW_MOD (xid=0x3): ADD ip actions=learn(table=1,eth_type=0x800,NXM_OF_IP_DST[])
80]])
81AT_CLEANUP
82
83AT_SETUP([learning action - invalid prerequisites])
84AT_CHECK([[ovs-ofctl parse-flow 'actions=learn(load:5->NXM_OF_IP_DST[])']],
dd43a558
SH
85 [1], [], [stderr])
86AT_CHECK([sed -e 's/.*|meta_flow|WARN|//' < stderr], [0],
87 [[destination field ip_dst lacks correct prerequisites
9e404d1e 88ovs-ofctl: actions are invalid with specified match (OFPBAC_MATCH_INCONSISTENT)
dd43a558 89]], [[]])
75a75043 90AT_CHECK([[ovs-ofctl parse-flow 'actions=learn(load:NXM_OF_IP_DST[]->NXM_NX_REG1[])']],
dd43a558
SH
91 [1], [], [stderr])
92AT_CHECK([sed -e 's/.*|meta_flow|WARN|//' < stderr], [0],
93 [[source field ip_dst lacks correct prerequisites
9e404d1e 94ovs-ofctl: actions are invalid with specified match (OFPBAC_MATCH_INCONSISTENT)
75a75043
BP
95]])
96AT_CLEANUP
97
6f17821e
BP
98AT_SETUP([learning action - too-long immediate value])
99dnl 129 bits is too long.
100AT_CHECK([[ovs-ofctl parse-flow 'actions=learn(load:0x1fedbca9876543210fedbca9876543210->NXM_NX_IPV6_DST[])']],
4531547f 101 [1], [], [[ovs-ofctl: 0x1fedbca9876543210fedbca9876543210->NXM_NX_IPV6_DST[]: value does not fit into 128 bits
6f17821e
BP
102]])
103
104dnl 128 bits is merely a bad prerequisite.
105AT_CHECK([[ovs-ofctl parse-flow 'actions=learn(load:0xfedbca9876543210fedbca9876543210->NXM_NX_IPV6_DST[])']], [1], [], [stderr])
106AT_CHECK([sed -e 's/.*|meta_flow|WARN|//' < stderr], [0],
107 [[destination field ipv6_dst lacks correct prerequisites
108ovs-ofctl: actions are invalid with specified match (OFPBAC_MATCH_INCONSISTENT)
109]], [[]])
110AT_CLEANUP
111
75a75043 112AT_SETUP([learning action - standard VLAN+MAC learning])
023e1e0a 113OVS_VSWITCHD_START(
e44768b7
JP
114 [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1 -- \
115 add-port br0 p2 -- set Interface p2 type=dummy ofport_request=2 -- \
116 add-port br0 p3 -- set Interface p3 type=dummy ofport_request=3])
75a75043
BP
117# Set up flow table for VLAN+MAC learning.
118AT_DATA([flows.txt], [[
119table=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)
120table=1 priority=0 actions=flood
121]])
122AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
123
124# Trace an ARP packet arriving on port 3, to create a MAC learning entry.
e44768b7 125flow="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)"
50aa28fd 126AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow" -generate], [0], [stdout])
e44768b7
JP
127actual=`tail -1 stdout | sed 's/Datapath actions: //'`
128
129expected="1,2,100"
130AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
131mv stdout expout
132AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
75a75043
BP
133
134# Check for the MAC learning entry.
1b3758c3 135AT_CHECK([ovs-ofctl dump-flows br0 table=1 --no-stats --sort], [0], [dnl
ef0ce8ae 136 table=1, priority=0 actions=FLOOD
1b3758c3 137 table=1, hard_timeout=60, vlan_tci=0x0000/0x0fff,dl_dst=50:54:00:00:00:05 actions=output:3
75a75043
BP
138])
139
140# Trace a packet arrival destined for the learned MAC.
141# (This will also learn a MAC.)
50aa28fd 142AT_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])
75a75043
BP
143AT_CHECK([tail -1 stdout], [0], [Datapath actions: 3
144])
145
146# Check for both MAC learning entries.
1b3758c3 147AT_CHECK([ovs-ofctl dump-flows br0 table=1 --no-stats | sort], [0], [dnl
b9718b7b
BP
148 table=1, hard_timeout=60, vlan_tci=0x0000/0x0fff,dl_dst=50:54:00:00:00:05 actions=output:3
149 table=1, hard_timeout=60, vlan_tci=0x0000/0x0fff,dl_dst=50:54:00:00:00:06 actions=output:1
ef0ce8ae 150 table=1, priority=0 actions=FLOOD
75a75043
BP
151])
152
153# Trace a packet arrival that updates the first learned MAC entry.
e44768b7 154flow="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)"
50aa28fd 155AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow" -generate], [0], [stdout])
e44768b7
JP
156actual=`tail -1 stdout | sed 's/Datapath actions: //'`
157
158expected="1,3,100"
159AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
160mv stdout expout
161AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
75a75043
BP
162
163# Check that the MAC learning entry was updated.
1b3758c3 164AT_CHECK([ovs-ofctl dump-flows br0 table=1 --no-stats | sort], [0], [dnl
b9718b7b
BP
165 table=1, hard_timeout=60, vlan_tci=0x0000/0x0fff,dl_dst=50:54:00:00:00:05 actions=output:2
166 table=1, hard_timeout=60, vlan_tci=0x0000/0x0fff,dl_dst=50:54:00:00:00:06 actions=output:1
ef0ce8ae 167 table=1, priority=0 actions=FLOOD
75a75043 168])
023e1e0a 169OVS_VSWITCHD_STOP
75a75043 170AT_CLEANUP
0e553d9c 171
644e2a7c
BP
172dnl This test checks that repeated uses of a "learn" action cause the
173dnl modified time of the learned flow to advance. Otherwise, the
174dnl learned flow will expire after its hard timeout even though it's
175dnl supposed to be refreshed. (The expiration can be hard to see since
176dnl it gets re-learned again the next time a packet appears, but
177dnl sometimes the expiration can cause temporary flooding etc.)
178AT_SETUP([learning action - learn refreshes hard_age])
179OVS_VSWITCHD_START(
180 [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1 -- \
181 add-port br0 p2 -- set Interface p2 type=dummy ofport_request=2 -- \
182 add-port br0 p3 -- set Interface p3 type=dummy ofport_request=3])
183
184ovs-appctl time/stop
185
186# Set up flow table for MAC learning.
187AT_DATA([flows.txt], [[
188table=0 actions=learn(table=1, hard_timeout=10, NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[], output:NXM_OF_IN_PORT[]), resubmit(,1)
189table=1 priority=0 actions=flood
190]])
191AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
192
193# Trace an ICMP packet arriving on port 3, to create a MAC learning entry.
194flow="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)"
50aa28fd 195AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow" -generate], [0], [stdout])
644e2a7c
BP
196actual=`tail -1 stdout | sed 's/Datapath actions: //'`
197
198expected="1,2,100"
199AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
200mv stdout expout
201AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
202
203# Check that the MAC learning entry appeared.
1b3758c3 204AT_CHECK([ovs-ofctl dump-flows br0 table=1 --no-stats | sort], [0], [dnl
644e2a7c
BP
205 table=1, hard_timeout=10, dl_dst=50:54:00:00:00:07 actions=output:3
206 table=1, priority=0 actions=FLOOD
644e2a7c
BP
207])
208
209# For 25 seconds, make sure that the MAC learning entry doesn't
210# disappear as long as we refresh it every second.
211for 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
212 ovs-appctl time/warp 1000
50aa28fd 213 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow" -generate], [0], [stdout])
644e2a7c
BP
214
215 # Check that the entry is there.
216 AT_CHECK([ovs-ofctl dump-flows br0 table=1], [0], [stdout])
217 AT_CHECK([ofctl_strip < stdout | sort], [0], [dnl
218 table=1, hard_timeout=10, dl_dst=50:54:00:00:00:07 actions=output:3
219 table=1, priority=0 actions=FLOOD
220NXST_FLOW reply:
221])
222
223 if test $i != 1; then
224 # Check that hard_age has appeared. We need to do this separately
225 # from the above check because ofctl_strip removes it. dump-flows
226 # only prints hard_age when it is different from the flow's duration
227 # (that is, the number of seconds from the time it was created),
228 # so we only check for it after we've refreshed the flow once.
229 AT_CHECK([grep dl_dst=50:54:00:00:00:07 stdout | grep -c hard_age],
230 [0], [1
231])
232 fi
233done
234
235# Make sure that 15 seconds without refreshing makes the flow time out.
bdba1947 236ovs-appctl time/warp 15000 5000
1ddccd4e 237sleep 1
1b3758c3 238AT_CHECK([ovs-ofctl dump-flows br0 table=1 --no-stats | sort], [0], [dnl
644e2a7c 239 table=1, priority=0 actions=FLOOD
644e2a7c
BP
240])
241OVS_VSWITCHD_STOP
242AT_CLEANUP
243
337b9cec
BP
244AT_SETUP([learning action - TCPv4 port learning])
245OVS_VSWITCHD_START(
e44768b7
JP
246 [add-port br0 p1 -- set Interface p1 type=dummy -- \
247 add-port br0 p2 -- set Interface p2 type=dummy -- \
248 add-port br0 p3 -- set Interface p3 type=dummy])
337b9cec
BP
249# Set up flow table for TCPv4 port learning.
250AT_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']])
251
252# Trace a TCPv4 packet arriving on port 3.
e44768b7 253flow="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)"
50aa28fd 254AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow" -generate], [0], [stdout])
e44768b7
JP
255actual=`tail -1 stdout | sed 's/Datapath actions: //'`
256
257expected="1,2,100"
258AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
259mv stdout expout
260AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
337b9cec
BP
261
262# Check for the learning entry.
1b3758c3 263AT_CHECK([ovs-ofctl dump-flows br0 table=1 --no-stats | sort], [0], [dnl
b9718b7b 264 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
337b9cec
BP
265])
266OVS_VSWITCHD_STOP
267AT_CLEANUP
268
269AT_SETUP([learning action - TCPv6 port learning])
270OVS_VSWITCHD_START(
e44768b7
JP
271 [add-port br0 p1 -- set Interface p1 type=dummy -- \
272 add-port br0 p2 -- set Interface p2 type=dummy -- \
273 add-port br0 p3 -- set Interface p3 type=dummy])
337b9cec 274# Set up flow table for TCPv6 port learning.
3d792b70
BP
275# Also add a 128-bit-wide "load" action and a 128-bit literal match to check
276# that they work.
277AT_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']])
337b9cec
BP
278
279# Trace a TCPv6 packet arriving on port 3.
e44768b7 280flow="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)"
50aa28fd 281AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow" -generate], [0], [stdout])
e44768b7
JP
282actual=`tail -1 stdout | sed 's/Datapath actions: //'`
283
284expected="1,2,100"
285AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
286mv stdout expout
287AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
337b9cec
BP
288
289# Check for the learning entry.
1b3758c3 290AT_CHECK([ovs-ofctl dump-flows br0 --no-stats | sort], [0], [dnl
b9718b7b 291 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]]
3d792b70 292 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
337b9cec
BP
293])
294OVS_VSWITCHD_STOP
295AT_CLEANUP
296
7cf2e080
BP
297# In this use of a learn action, the first packet in the flow creates
298# a new flow that changes the behavior of subsequent packets in the
299# flow.
300AT_SETUP([learning action - self-modifying flow])
301OVS_VSWITCHD_START
ca5792f0 302add_of_ports br0 1 2 3
7cf2e080 303
31ef9f51 304ovs-appctl time/stop
7cf2e080
BP
305# Set up flow table for TCPv4 port learning.
306AT_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']])
307
308# Trace some packets arriving. The particular packets don't matter.
309for i in 1 2 3 4 5 6 7 8 9 10; do
310 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)'
b0ed42c8 311 ovs-appctl time/warp 10
15155807
YT
312 if [[ $i -eq 1 ]]; then
313 sleep 1
314 fi
7cf2e080
BP
315done
316
317# Check for the learning entry.
b0ed42c8 318ovs-appctl time/warp 1000
7cf2e080 319AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0],
6f068379
BP
320[[ n_packets=1, n_bytes=118, 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
321 n_packets=9, n_bytes=1062, priority=65535,vlan_tci=0x0000/0x0fff,dl_src=50:54:00:00:00:05 actions=output:3
7cf2e080
BP
322NXST_FLOW reply:
323]])
324
325# Check that the first packet went out port 2 and the rest out port 3.
326AT_CHECK(
8a32aaa5 327 [(ovs-ofctl dump-ports br0 2; ovs-ofctl dump-ports br0 3) | strip_xids], [0],
7cf2e080 328 [OFPST_PORT reply: 1 ports
d6e3feb5 329 port 2: rx pkts=0, bytes=0, drop=?, errs=?, frame=?, over=?, crc=?
6f068379 330 tx pkts=1, bytes=118, drop=?, errs=?, coll=?
7cf2e080 331OFPST_PORT reply: 1 ports
d6e3feb5 332 port 3: rx pkts=0, bytes=0, drop=?, errs=?, frame=?, over=?, crc=?
6f068379 333 tx pkts=9, bytes=1062, drop=?, errs=?, coll=?
7cf2e080 334])
619d5f98
JS
335
336OVS_VSWITCHD_STOP
337AT_CLEANUP
338
339# This test is much like the previous, but adds idle timeouts and sends
340# two different flows to the bridge. This tests that the statistics are
341# attributed correctly.
342AT_SETUP([learning action - self-modifying flow with idle_timeout])
343OVS_VSWITCHD_START
ca5792f0 344add_of_ports br0 1 2 3
619d5f98
JS
345
346ovs-appctl time/stop
347# Set up flow table for TCPv4 port learning.
348AT_CHECK([[ovs-ofctl add-flow br0 'actions=load:3->NXM_NX_REG0[0..15],learn(table=0,idle_timeout=5,priority=65535,NXM_OF_ETH_SRC[],NXM_OF_VLAN_TCI[0..11],output:NXM_NX_REG0[0..15]),output:2']])
349
350# Trace some packets arriving. The particular packets don't matter.
351for i in `seq 1 10`; do
352 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)'
353 ovs-appctl time/warp 10
354 if [[ $i -eq 1 ]]; then
355 sleep 1
356 fi
357done
358
359# Trace some packets arriving. This is is a different flow from the previous.
360# Note that we advance time by 1 second between each packet here.
361for i in `seq 1 10`; do
362 ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:06,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)'
363 ovs-appctl time/warp 1000
7f12bdcc
YT
364 # Note: netdev-dummy/receive merely queues the packet.
365 # We need to wait for other thread to process the packet
366 # and update the flow's 'used' for the packet.
367 # (i % 3 == 0) below is somehow arbitrary but chosen to ensure
368 # that we update the flow's 'used' frequently enough to prevent
369 # idle_timeout.
3ef64336 370 if [[ $i -eq 1 -o $((i % 3)) -eq 0 ]]; then
619d5f98
JS
371 sleep 1
372 fi
373done
374
4b10fd11
YT
375# Check that the first packet of each flow went out port 2 and the rest out
376# port 3.
619d5f98 377AT_CHECK(
8a32aaa5 378 [(ovs-ofctl dump-ports br0 2; ovs-ofctl dump-ports br0 3) | strip_xids], [0],
619d5f98 379 [OFPST_PORT reply: 1 ports
d6e3feb5 380 port 2: rx pkts=0, bytes=0, drop=?, errs=?, frame=?, over=?, crc=?
6f068379 381 tx pkts=2, bytes=236, drop=?, errs=?, coll=?
619d5f98 382OFPST_PORT reply: 1 ports
d6e3feb5 383 port 3: rx pkts=0, bytes=0, drop=?, errs=?, frame=?, over=?, crc=?
6f068379 384 tx pkts=18, bytes=2124, drop=?, errs=?, coll=?
619d5f98
JS
385])
386
387# Check for the learning entry.
388ovs-appctl time/warp 1000
389AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0],
6f068379
BP
390[[ n_packets=2, n_bytes=236, actions=load:0x3->NXM_NX_REG0[0..15],learn(table=0,idle_timeout=5,priority=65535,NXM_OF_ETH_SRC[],NXM_OF_VLAN_TCI[0..11],output:NXM_NX_REG0[0..15]),output:2
391 n_packets=9, n_bytes=1062, idle_timeout=5, priority=65535,vlan_tci=0x0000/0x0fff,dl_src=50:54:00:00:00:06 actions=output:3
619d5f98
JS
392NXST_FLOW reply:
393]])
394OVS_VSWITCHD_STOP
395AT_CLEANUP
396
bd2f109b 397# This test is much like the previous, but adds hard timeouts and sends
619d5f98
JS
398# two different flows to the bridge. This tests that the statistics are
399# attributed correctly.
400AT_SETUP([learning action - self-modifying flow with hard_timeout])
401OVS_VSWITCHD_START
ca5792f0 402add_of_ports br0 1 2 3
619d5f98
JS
403
404ovs-appctl time/stop
405# Set up flow table for TCPv4 port learning.
c2dc87c9 406AT_CHECK([[ovs-ofctl add-flow br0 'actions=load:3->NXM_NX_REG0[0..15],learn(table=0,hard_timeout=10,priority=65535,NXM_OF_ETH_SRC[],NXM_OF_VLAN_TCI[0..11],output:NXM_NX_REG0[0..15]),output:2']])
619d5f98
JS
407
408# Trace some packets arriving. The particular packets don't matter.
409for i in `seq 1 10`; do
410 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)'
619d5f98
JS
411 if [[ $i -eq 1 ]]; then
412 sleep 1
413 fi
c2dc87c9 414 ovs-appctl time/warp 10
619d5f98
JS
415done
416
4c71600d
DDP
417# Check that the first packet of each flow went out port 2 and the rest out
418# port 3.
419AT_CHECK(
420 [(ovs-ofctl dump-ports br0 2; ovs-ofctl dump-ports br0 3) | strip_xids], [0],
421 [OFPST_PORT reply: 1 ports
422 port 2: rx pkts=0, bytes=0, drop=?, errs=?, frame=?, over=?, crc=?
6f068379 423 tx pkts=1, bytes=118, drop=?, errs=?, coll=?
4c71600d
DDP
424OFPST_PORT reply: 1 ports
425 port 3: rx pkts=0, bytes=0, drop=?, errs=?, frame=?, over=?, crc=?
6f068379 426 tx pkts=9, bytes=1062, drop=?, errs=?, coll=?
4c71600d
DDP
427])
428
619d5f98 429# Trace some packets arriving. This is is a different flow from the previous.
c2dc87c9 430# Note that we advance time by 2 second between each packet here.
619d5f98
JS
431for i in `seq 1 10`; do
432 ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:06,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)'
c2dc87c9
YT
433 # Note: hard_timeout should fire immediately after #6 packet.
434 # #7 packet re-install the flow and the following 3 packets
435 # (#8, #9, #10) use the flow.
436 # it's difficult to predict the exact timing of rule expiry
437 # because it's affected by flow dumper thread via udpif_dump_seq.
438 # hard_timeout value for this test was chosen to overcome the uncertainty.
dd7ec292
YT
439 #
440 # receive #1 learn, install flow with hard_timeout=10
441 # sleep to ensure the flow installation
442 # (warp, timeout left 8s)
443 # receive #2 the learned flow
444 # (warp, timeout left 6s)
445 # receive #3
446 # (warp, timeout left 4s)
447 # receive #4
448 # (warp, timeout left 2s)
449 # receive #5
450 # (warp, timeout left 0s)
451 # NOTE: OVS does not consider this expired yet. cf. rule_expire()
452 # receive #6
453 # (warp, timeout left -2s)
454 # sleep to ensure flow expiration
455 # receive #7 learn, install flow with hard_timeout=10
456 # sleep to ensure the flow installation
457 # (warp, timeout left 8s)
458 # receive #8
459 # (warp, timeout left 6s)
460 # receive #9
461 # (warp, timeout left 4s)
462 # receive #10
463 # (warp, timeout left 2s)
464 if [[ $i -eq 1 -o $i -eq 7 ]]; then
619d5f98
JS
465 sleep 1
466 fi
c2dc87c9 467 ovs-appctl time/warp 2000
dd7ec292
YT
468 if [[ $i -eq 6 ]]; then
469 sleep 1
470 fi
619d5f98
JS
471done
472
4b10fd11
YT
473# Check that the first packet of each flow went out port 2 and the rest out
474# port 3.
619d5f98 475AT_CHECK(
8a32aaa5 476 [(ovs-ofctl dump-ports br0 2; ovs-ofctl dump-ports br0 3) | strip_xids], [0],
619d5f98 477 [OFPST_PORT reply: 1 ports
d6e3feb5 478 port 2: rx pkts=0, bytes=0, drop=?, errs=?, frame=?, over=?, crc=?
6f068379 479 tx pkts=3, bytes=354, drop=?, errs=?, coll=?
619d5f98 480OFPST_PORT reply: 1 ports
d6e3feb5 481 port 3: rx pkts=0, bytes=0, drop=?, errs=?, frame=?, over=?, crc=?
6f068379 482 tx pkts=17, bytes=2006, drop=?, errs=?, coll=?
619d5f98
JS
483])
484
485# Check for the learning entry.
486ovs-appctl time/warp 1000
c2dc87c9 487sleep 1
619d5f98 488AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0],
6f068379
BP
489[[ n_packets=3, n_bytes=354, actions=load:0x3->NXM_NX_REG0[0..15],learn(table=0,hard_timeout=10,priority=65535,NXM_OF_ETH_SRC[],NXM_OF_VLAN_TCI[0..11],output:NXM_NX_REG0[0..15]),output:2
490 n_packets=3, n_bytes=354, hard_timeout=10, priority=65535,vlan_tci=0x0000/0x0fff,dl_src=50:54:00:00:00:06 actions=output:3
619d5f98
JS
491NXST_FLOW reply:
492]])
7cf2e080
BP
493OVS_VSWITCHD_STOP
494AT_CLEANUP
495
0e553d9c
BP
496AT_SETUP([learning action - fin_timeout feature])
497# This is a totally artificial use of the "learn" action. The only purpose
498# is to check that specifying fin_idle_timeout or fin_hard_timeout causes
499# a corresponding fin_timeout action to end up in the learned flows.
e1b1d06a
JP
500OVS_VSWITCHD_START(
501 [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1])
0e553d9c 502AT_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[])']])
50aa28fd 503AT_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])
1b3758c3
BP
504AT_CHECK([ovs-ofctl dump-flows br0 table=1 --no-stats], [0],
505[ table=1, dl_dst=50:54:00:00:00:05 actions=fin_timeout(idle_timeout=5,hard_timeout=10),output:1
0e553d9c
BP
506])
507OVS_VSWITCHD_STOP
508AT_CLEANUP
35f48b8b
BP
509
510AT_SETUP([learning action - delete_learned feature])
511OVS_VSWITCHD_START
512
513# Add some initial flows and check that it was successful.
514AT_DATA([flows.txt], [dnl
515 reg0=0x1 actions=learn(delete_learned,cookie=0x123)
516 reg0=0x2 actions=learn(delete_learned,cookie=0x123)
517cookie=0x123, table=1, reg0=0x3 actions=drop
518cookie=0x123, table=1, reg0=0x4 actions=drop
519cookie=0x123, table=2, reg0=0x5 actions=drop
520cookie=0x234, table=1, reg0=0x6 actions=drop
521])
522AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1b3758c3 523AT_CHECK([ovs-ofctl dump-flows br0 --no-stats | sort], [0], [dnl
35f48b8b
BP
524 cookie=0x123, table=1, reg0=0x3 actions=drop
525 cookie=0x123, table=1, reg0=0x4 actions=drop
526 cookie=0x123, table=2, reg0=0x5 actions=drop
527 cookie=0x234, table=1, reg0=0x6 actions=drop
528 reg0=0x1 actions=learn(table=1,delete_learned,cookie=0x123)
529 reg0=0x2 actions=learn(table=1,delete_learned,cookie=0x123)
35f48b8b
BP
530])
531
532# Delete one of the learn actions. The learned flows should stay, since there
533# is another learn action with the identical target.
534AT_CHECK([ovs-ofctl del-flows br0 'table=0 reg0=1'])
1b3758c3 535AT_CHECK([ovs-ofctl dump-flows br0 --no-stats | sort], [0], [dnl
35f48b8b
BP
536 cookie=0x123, table=1, reg0=0x3 actions=drop
537 cookie=0x123, table=1, reg0=0x4 actions=drop
538 cookie=0x123, table=2, reg0=0x5 actions=drop
539 cookie=0x234, table=1, reg0=0x6 actions=drop
540 reg0=0x2 actions=learn(table=1,delete_learned,cookie=0x123)
35f48b8b
BP
541])
542
543# Change the flow with the learn action by adding a second action. The learned
544# flows should stay because the learn action is still there.
545AT_CHECK([ovs-ofctl mod-flows br0 'table=0 reg0=2 actions=output:1,learn(delete_learned,cookie=0x123)'])
1b3758c3 546AT_CHECK([ovs-ofctl dump-flows br0 --no-stats | sort], [0], [dnl
35f48b8b
BP
547 cookie=0x123, table=1, reg0=0x3 actions=drop
548 cookie=0x123, table=1, reg0=0x4 actions=drop
549 cookie=0x123, table=2, reg0=0x5 actions=drop
550 cookie=0x234, table=1, reg0=0x6 actions=drop
551 reg0=0x2 actions=output:1,learn(table=1,delete_learned,cookie=0x123)
35f48b8b
BP
552])
553
554# Change the flow with the learn action by replacing its learn action by one
555# with a different target. The (previous) learned flows disappear.
556AT_CHECK([ovs-ofctl mod-flows br0 'table=0 reg0=2 actions=learn(delete_learned,cookie=0x234)'])
1b3758c3 557AT_CHECK([ovs-ofctl dump-flows br0 --no-stats | sort], [0], [dnl
35f48b8b
BP
558 cookie=0x123, table=2, reg0=0x5 actions=drop
559 cookie=0x234, table=1, reg0=0x6 actions=drop
560 reg0=0x2 actions=learn(table=1,delete_learned,cookie=0x234)
35f48b8b
BP
561])
562
563# Use add-flow to replace the flow with the learn action by one with the
564# same learn action and an extra action. The (new) learned flow remains.
565AT_CHECK([ovs-ofctl add-flow br0 'table=0 reg0=2 actions=learn(delete_learned,cookie=0x234),output:2'])
1b3758c3 566AT_CHECK([ovs-ofctl dump-flows br0 --no-stats | sort], [0], [dnl
35f48b8b
BP
567 cookie=0x123, table=2, reg0=0x5 actions=drop
568 cookie=0x234, table=1, reg0=0x6 actions=drop
569 reg0=0x2 actions=learn(table=1,delete_learned,cookie=0x234),output:2
35f48b8b
BP
570])
571
572# Delete the flow with the learn action. The learned flow disappears too.
573AT_CHECK([ovs-ofctl del-flows br0 table=0])
1b3758c3 574AT_CHECK([ovs-ofctl dump-flows br0 --no-stats | sort], [0], [dnl
35f48b8b 575 cookie=0x123, table=2, reg0=0x5 actions=drop
35f48b8b
BP
576])
577
578# Add a new set of flows to check on a corner case: the learned flows
579# contain their own learn actions which cascade to further deletions.
580# This can't happen if the learned flows were actually created by a
581# learn action, since the learn action has very restricted action
582# support, but there's no restriction that the deleted flows were
583# created by a learn action.
584AT_DATA([flows.txt], [dnl
585 reg0=0x1 actions=learn(table=1,delete_learned,cookie=0x123)
586 reg0=0x2 actions=learn(table=2,delete_learned,cookie=0x234)
587cookie=0x123, table=1, reg0=0x3 actions=learn(table=3,delete_learned,cookie=0x345)
588cookie=0x234, table=2, reg0=0x3 actions=learn(table=4,delete_learned,cookie=0x456)
589cookie=0x345, table=3, reg0=0x4 actions=learn(table=5,delete_learned,cookie=0x567)
590cookie=0x456, table=4, reg0=0x5 actions=learn(table=5,delete_learned,cookie=0x567)
591cookie=0x567, table=5, reg0=0x6 actions=drop
592cookie=0x567, table=5, reg0=0x7 actions=drop
593cookie=0x567, table=5, reg0=0x8 actions=drop
594])
595AT_CHECK([ovs-ofctl del-flows br0])
596AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1b3758c3 597AT_CHECK([ovs-ofctl dump-flows br0 --no-stats | sort], [0], [dnl
35f48b8b
BP
598 cookie=0x123, table=1, reg0=0x3 actions=learn(table=3,delete_learned,cookie=0x345)
599 cookie=0x234, table=2, reg0=0x3 actions=learn(table=4,delete_learned,cookie=0x456)
600 cookie=0x345, table=3, reg0=0x4 actions=learn(table=5,delete_learned,cookie=0x567)
601 cookie=0x456, table=4, reg0=0x5 actions=learn(table=5,delete_learned,cookie=0x567)
602 cookie=0x567, table=5, reg0=0x6 actions=drop
603 cookie=0x567, table=5, reg0=0x7 actions=drop
604 cookie=0x567, table=5, reg0=0x8 actions=drop
605 reg0=0x1 actions=learn(table=1,delete_learned,cookie=0x123)
606 reg0=0x2 actions=learn(table=2,delete_learned,cookie=0x234)
35f48b8b
BP
607])
608
609# Deleting the flow with reg0=1 should cascade to delete a few levels
610# of learned flows, but the ones with cookie=0x567 stick around
611# because of the flow with cookie=0x456.
612AT_CHECK([ovs-ofctl del-flows br0 'table=0 reg0=1'])
1b3758c3 613AT_CHECK([ovs-ofctl dump-flows br0 --no-stats | sort], [0], [dnl
35f48b8b
BP
614 cookie=0x234, table=2, reg0=0x3 actions=learn(table=4,delete_learned,cookie=0x456)
615 cookie=0x456, table=4, reg0=0x5 actions=learn(table=5,delete_learned,cookie=0x567)
616 cookie=0x567, table=5, reg0=0x6 actions=drop
617 cookie=0x567, table=5, reg0=0x7 actions=drop
618 cookie=0x567, table=5, reg0=0x8 actions=drop
619 reg0=0x2 actions=learn(table=2,delete_learned,cookie=0x234)
35f48b8b
BP
620])
621
622# Deleting the flow with reg0=2 should cascade to delete all the rest:
623AT_CHECK([ovs-ofctl del-flows br0 'table=0 reg0=2'])
1b3758c3 624AT_CHECK([ovs-ofctl dump-flows br0 --no-stats | sort])
35f48b8b
BP
625OVS_VSWITCHD_STOP
626AT_CLEANUP
4c71600d 627
fdfd3f7b
WT
628AT_SETUP([learning action - delete_learned/limit with packet])
629OVS_VSWITCHD_START(
630 [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1 --\
631 add-port br0 p2 -- set Interface p2 type=dummy ofport_request=2])
632
633# Add some initial flows and check that it was successful.
634AT_DATA([flows.txt], [dnl
635table=0 actions=set_field:0x2->reg7,set_field:0xabcdef01->metadata, resubmit(,1)
636table=1 actions=learn(table=10,delete_learned,cookie=0x123,limit=3,result_dst=NXM_NX_REG6[[0]],NXM_OF_ETH_DST[[]]=NXM_OF_ETH_SRC[[]],OXM_OF_METADATA[[]],output:NXM_NX_REG7)
637])
638
639AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
640AT_CHECK([ovs-ofctl dump-flows br0 --no-stats | sort], [0], [dnl
641 actions=load:0x2->NXM_NX_REG7[[]],load:0xabcdef01->OXM_OF_METADATA[[]],resubmit(,1)
642 table=1, actions=learn(table=10,delete_learned,cookie=0x123,limit=3,result_dst=NXM_NX_REG6[[0]],NXM_OF_ETH_DST[[]]=NXM_OF_ETH_SRC[[]],OXM_OF_METADATA[[]],output:NXM_NX_REG7[[]])
643])
644
645dnl Each packet will generate its own flow at table=10, except last one
646AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:01,dst=50:54:00:00:00:ff),eth_type(0x1234)'])
647AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:02,dst=50:54:00:00:00:ff),eth_type(0x1234)'])
648AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:03,dst=50:54:00:00:00:ff),eth_type(0x1234)'])
649AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:04,dst=50:54:00:00:00:ff),eth_type(0x1234)'])
650
651AT_CHECK([ovs-ofctl dump-flows br0 table=10 --no-stats | sort], [0], [dnl
652 cookie=0x123, table=10, metadata=0xabcdef01,dl_dst=50:54:00:00:00:01 actions=output:2
653 cookie=0x123, table=10, metadata=0xabcdef01,dl_dst=50:54:00:00:00:02 actions=output:2
654 cookie=0x123, table=10, metadata=0xabcdef01,dl_dst=50:54:00:00:00:03 actions=output:2
655])
656
657ovs-appctl revalidator/wait
658
659AT_CHECK([ovs-ofctl del-flows br0 'table=1'])
660AT_CHECK([ovs-ofctl dump-flows br0 table=10 --no-stats | sort], [0], [dnl
661])
662
663OVS_VSWITCHD_STOP
664AT_CLEANUP
665
4c71600d
DDP
666AT_SETUP([learning action - limit])
667OVS_VSWITCHD_START
668AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
669add_of_ports br0 1 2
670AT_DATA([flows.txt], [dnl
671table=0 in_port=1 actions=learn(table=1,dl_dst=dl_src,cookie=0x1,limit=1),2
672])
673AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
674AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:01,dst=50:54:00:00:00:ff),eth_type(0x1234)'])
675AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:02,dst=50:54:00:00:00:ff),eth_type(0x1234)'])
676
677OVS_WAIT_UNTIL([ovs-ofctl dump-ports br0 2 | grep -o 'tx pkts=2' >/dev/null])
678
1b3758c3 679AT_CHECK([ovs-ofctl dump-flows br0 table=1 --no-stats], [0], [dnl
4c71600d 680 cookie=0x1, table=1, dl_dst=50:54:00:00:00:01 actions=drop
4c71600d
DDP
681])
682
683dnl Delete the learned flow
684AT_CHECK([ovs-ofctl del-flows br0 table=1])
685
686AT_CHECK([ovs-ofctl dump-flows br0 table=1 | ofctl_strip | sort], [0], [dnl
687NXST_FLOW reply:
688])
689
690ovs-appctl revalidator/wait
691
692AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:02,dst=50:54:00:00:00:ff),eth_type(0x1234)'])
693AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:01,dst=50:54:00:00:00:ff),eth_type(0x1234)'])
694
695OVS_WAIT_UNTIL([ovs-ofctl dump-ports br0 2 | grep -o 'tx pkts=4' >/dev/null])
696
697AT_CHECK([ovs-ofctl dump-flows br0 table=1 | ofctl_strip | sort], [0], [dnl
698 cookie=0x1, table=1, dl_dst=50:54:00:00:00:02 actions=drop
699NXST_FLOW reply:
700])
701
702OVS_VSWITCHD_STOP
703AT_CLEANUP
704
705AT_SETUP([learning action - limit result_dst])
706OVS_VSWITCHD_START
707AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
708add_of_ports br0 1
709AT_DATA([flows.txt], [dnl
710table=0 in_port=1 actions=learn(table=1,dl_dst=dl_src,cookie=0x1,limit=1,result_dst=reg0[[0]]),controller
711])
712AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
713
714AT_CAPTURE_FILE([ofctl_monitor.log])
715AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl -P nxt_packet_in --detach --no-chdir --pidfile 2> ofctl_monitor.log])
716
717AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:01,dst=50:54:00:00:00:ff),eth_type(0x1234)'])
718AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:02,dst=50:54:00:00:00:ff),eth_type(0x1234)'])
719
720OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 4])
721OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
722
723AT_CHECK([cat ofctl_monitor.log], [0], [dnl
724NXT_PACKET_IN (xid=0x0): cookie=0x0 total_len=14 reg0=0x1,in_port=1 (via action) data_len=14 (unbuffered)
725vlan_tci=0x0000,dl_src=50:54:00:00:00:01,dl_dst=50:54:00:00:00:ff,dl_type=0x1234
726NXT_PACKET_IN (xid=0x0): cookie=0x0 total_len=14 in_port=1 (via action) data_len=14 (unbuffered)
727vlan_tci=0x0000,dl_src=50:54:00:00:00:02,dl_dst=50:54:00:00:00:ff,dl_type=0x1234
728])
729
730AT_CHECK([ovs-ofctl dump-flows br0 table=1 | ofctl_strip | sort], [0], [dnl
731 cookie=0x1, table=1, dl_dst=50:54:00:00:00:01 actions=drop
732NXST_FLOW reply:
733])
734
735OVS_VSWITCHD_STOP
736AT_CLEANUP
737
738AT_SETUP([learning action - different limits])
739OVS_VSWITCHD_START
740AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
741add_of_ports br0 1 2 3
742AT_DATA([flows.txt], [dnl
743table=0 in_port=1 udp,actions=learn(table=11,dl_type=0x0800,nw_proto=17,udp_src=udp_dst,limit=1,result_dst=reg0[[0]]),resubmit(,1)
744table=0 in_port=2 udp,actions=learn(table=12,dl_type=0x0800,nw_proto=17,udp_src=udp_dst,limit=10,result_dst=reg0[[0]]),resubmit(,1)
745table=0 in_port=3 udp,actions=learn(table=13,dl_type=0x0800,nw_proto=17,udp_src=udp_dst,limit=20,result_dst=reg0[[0]]),resubmit(,1)
746dnl
747dnl These flows simply counts the packets that executed a successful learn action:
748dnl
749table=1 cookie=1,reg0=1,in_port=1 actions=drop
750table=1 cookie=2,reg0=1,in_port=2 actions=drop
751table=1 cookie=3,reg0=1,in_port=3 actions=drop
752dnl
753dnl These flows simply counts the packets that didn't execute a successful learn action:
754dnl
755table=1 cookie=1,reg0=0,in_port=1 actions=drop
756table=1 cookie=2,reg0=0,in_port=2 actions=drop
757table=1 cookie=3,reg0=0,in_port=3 actions=drop
758])
759AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
760
761for i in `seq 1001 1030`; do
762 ovs-appctl netdev-dummy/receive p1 "in_port(1),eth(src=50:54:00:00:00:01,dst=50:54:00:00:00:ff),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=17,tos=0,ttl=64,frag=no),udp(src=1,dst=$i)"
763 ovs-appctl netdev-dummy/receive p2 "in_port(2),eth(src=50:54:00:00:00:01,dst=50:54:00:00:00:ff),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=17,tos=0,ttl=64,frag=no),udp(src=1,dst=$i)"
764 ovs-appctl netdev-dummy/receive p3 "in_port(3),eth(src=50:54:00:00:00:01,dst=50:54:00:00:00:ff),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=17,tos=0,ttl=64,frag=no),udp(src=1,dst=$i)"
765done
766
767dnl Check successful counters:
768AT_CHECK([ovs-ofctl dump-flows br0 table=1,reg0=1 | ofctl_strip | sort], [0], [dnl
6f068379
BP
769 cookie=0x1, table=1, n_packets=1, n_bytes=106, reg0=0x1,in_port=1 actions=drop
770 cookie=0x2, table=1, n_packets=10, n_bytes=1060, reg0=0x1,in_port=2 actions=drop
771 cookie=0x3, table=1, n_packets=20, n_bytes=2120, reg0=0x1,in_port=3 actions=drop
4c71600d
DDP
772NXST_FLOW reply:
773])
774
775dnl Check failed counters:
776AT_CHECK([ovs-ofctl dump-flows br0 table=1,reg0=0 | ofctl_strip | sort], [0], [dnl
6f068379
BP
777 cookie=0x1, table=1, n_packets=29, n_bytes=3074, reg0=0,in_port=1 actions=drop
778 cookie=0x2, table=1, n_packets=20, n_bytes=2120, reg0=0,in_port=2 actions=drop
779 cookie=0x3, table=1, n_packets=10, n_bytes=1060, reg0=0,in_port=3 actions=drop
4c71600d
DDP
780NXST_FLOW reply:
781])
782
783dnl Check learned flows:
784
785AT_CHECK([ovs-ofctl dump-flows br0 table=13 | ofctl_strip | sort], [0], [dnl
786 table=13, udp,tp_src=1001 actions=drop
787 table=13, udp,tp_src=1002 actions=drop
788 table=13, udp,tp_src=1003 actions=drop
789 table=13, udp,tp_src=1004 actions=drop
790 table=13, udp,tp_src=1005 actions=drop
791 table=13, udp,tp_src=1006 actions=drop
792 table=13, udp,tp_src=1007 actions=drop
793 table=13, udp,tp_src=1008 actions=drop
794 table=13, udp,tp_src=1009 actions=drop
795 table=13, udp,tp_src=1010 actions=drop
796 table=13, udp,tp_src=1011 actions=drop
797 table=13, udp,tp_src=1012 actions=drop
798 table=13, udp,tp_src=1013 actions=drop
799 table=13, udp,tp_src=1014 actions=drop
800 table=13, udp,tp_src=1015 actions=drop
801 table=13, udp,tp_src=1016 actions=drop
802 table=13, udp,tp_src=1017 actions=drop
803 table=13, udp,tp_src=1018 actions=drop
804 table=13, udp,tp_src=1019 actions=drop
805 table=13, udp,tp_src=1020 actions=drop
806NXST_FLOW reply:
807])
808
809AT_CHECK([ovs-ofctl dump-flows br0 table=12 | ofctl_strip | sort], [0], [dnl
810 table=12, udp,tp_src=1001 actions=drop
811 table=12, udp,tp_src=1002 actions=drop
812 table=12, udp,tp_src=1003 actions=drop
813 table=12, udp,tp_src=1004 actions=drop
814 table=12, udp,tp_src=1005 actions=drop
815 table=12, udp,tp_src=1006 actions=drop
816 table=12, udp,tp_src=1007 actions=drop
817 table=12, udp,tp_src=1008 actions=drop
818 table=12, udp,tp_src=1009 actions=drop
819 table=12, udp,tp_src=1010 actions=drop
820NXST_FLOW reply:
821])
822
823AT_CHECK([ovs-ofctl dump-flows br0 table=11 | ofctl_strip | sort], [0], [dnl
824 table=11, udp,tp_src=1001 actions=drop
825NXST_FLOW reply:
826])
827
828AT_CHECK([ovs-vsctl del-br br0])
829
830ovs-appctl time/warp 500
831ovs-appctl time/warp 500
832ovs-appctl time/warp 500
833ovs-appctl time/warp 500
834
835AT_CHECK([ovs-vsctl add-br br1 -- set b br1 datapath_type=dummy])
836
837OVS_VSWITCHD_STOP
838AT_CLEANUP