1 AT_BANNER([ofproto-dpif])
3 AT_SETUP([ofproto-dpif - resubmit])
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)
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
23 AT_SETUP([ofproto-dpif - registers])
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
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
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
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
57 AT_SETUP([ofproto-dpif - output])
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[[]]
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
77 AT_SETUP([ofproto-dpif - dec_ttl])
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
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.
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
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
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
112 AT_SETUP([ofproto-dpif - output, OFPP_NONE ingress port])
114 ADD_OF_PORTS([br0], [1], [2])
116 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
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
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
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
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
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
157 AT_SETUP([ofproto-dpif - output/flood flags])
159 ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6], [7])
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
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])
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
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
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
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
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
215 AT_SETUP([ofproto-dpif - controller])
216 OVS_VSWITCHD_START([dnl
217 add-port br0 p1 -- set Interface p1 type=dummy
220 AT_CAPTURE_FILE([ofctl_monitor.log])
221 AT_DATA([flows.txt], [dnl
222 cookie=0x0 dl_src=10:11:11:11:11:11 actions=controller
223 cookie=0x1 dl_src=20:22:22:22:22:22 actions=controller,resubmit(80,1)
224 cookie=0x2 dl_src=30:33:33:33:33:33 actions=mod_vlan_vid:15,controller
226 cookie=0x3 table=1 in_port=80 actions=load:1->NXM_NX_REG0[[]],mod_vlan_vid:80,controller,resubmit(81,2)
227 cookie=0x4 table=2 in_port=81 actions=load:2->NXM_NX_REG1[[]],mod_dl_src:80:81:81:81:81:81,controller,resubmit(82,3)
228 cookie=0x5 table=3 in_port=82 actions=load:3->NXM_NX_REG2[[]],mod_dl_dst:82:82:82:82:82:82,controller,resubmit(83,4)
229 cookie=0x6 table=4 in_port=83 actions=load:4->NXM_NX_REG3[[]],mod_nw_src:83.83.83.83,controller,resubmit(84,5)
230 cookie=0x7 table=5 in_port=84 actions=load:5->NXM_NX_REG4[[]],load:6->NXM_NX_TUN_ID[[]],mod_nw_dst:84.84.84.84,controller,resubmit(85,6)
231 cookie=0x8 table=6 in_port=85 actions=mod_tp_src:85,controller,resubmit(86,7)
232 cookie=0x9 table=7 in_port=86 actions=mod_tp_dst:86,controller,controller
234 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
237 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
240 ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'
243 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
244 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
245 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
246 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=9 tcp_csum:0
248 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
249 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=9 tcp_csum:0
251 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
252 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=9 tcp_csum:0
255 dnl Singleton controller action.
256 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
259 ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=10:11:11:11:11:11,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=10)'
262 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
263 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
264 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
265 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=10:11:11:11:11:11,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=10 tcp_csum:0
267 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
268 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=10:11:11:11:11:11,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=10 tcp_csum:0
270 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
271 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=10:11:11:11:11:11,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=10 tcp_csum:0
274 dnl Modified controller action.
275 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
278 ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=30:33:33:33:33:33,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=10)'
281 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
282 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
283 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
284 tcp,metadata=0,in_port=0,dl_vlan=15,dl_vlan_pcp=0,dl_src=30:33:33:33:33:33,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=10 tcp_csum:0
286 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
287 tcp,metadata=0,in_port=0,dl_vlan=15,dl_vlan_pcp=0,dl_src=30:33:33:33:33:33,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=10 tcp_csum:0
289 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
290 tcp,metadata=0,in_port=0,dl_vlan=15,dl_vlan_pcp=0,dl_src=30:33:33:33:33:33,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=10 tcp_csum:0
294 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --no-chdir --pidfile 2> ofctl_monitor.log])
297 ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=20:22:22:22:22:22,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=11)'
300 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
301 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
302 NXT_PACKET_IN (xid=0x0): cookie=0x1 total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
303 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=20:22:22:22:22:22,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=11 tcp_csum:0
305 NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x3 total_len=64 in_port=1 reg0=0x1 (via action) data_len=64 (unbuffered)
306 tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=20:22:22:22:22:22,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=11 tcp_csum:0
308 NXT_PACKET_IN (xid=0x0): table_id=2 cookie=0x4 total_len=64 in_port=1 reg0=0x1 reg1=0x2 (via action) data_len=64 (unbuffered)
309 tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=11 tcp_csum:0
311 NXT_PACKET_IN (xid=0x0): table_id=3 cookie=0x5 total_len=64 in_port=1 reg0=0x1 reg1=0x2 reg2=0x3 (via action) data_len=64 (unbuffered)
312 tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=11 tcp_csum:0
314 NXT_PACKET_IN (xid=0x0): table_id=4 cookie=0x6 total_len=64 in_port=1 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 (via action) data_len=64 (unbuffered)
315 tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=11 tcp_csum:1a03
317 NXT_PACKET_IN (xid=0x0): table_id=5 cookie=0x7 total_len=64 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=64 (unbuffered)
318 tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=11 tcp_csum:3205
320 NXT_PACKET_IN (xid=0x0): table_id=6 cookie=0x8 total_len=64 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=64 (unbuffered)
321 tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=85,tp_dst=11 tcp_csum:31b8
323 NXT_PACKET_IN (xid=0x0): table_id=7 cookie=0x9 total_len=64 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=64 (unbuffered)
324 tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=85,tp_dst=86 tcp_csum:316d
326 NXT_PACKET_IN (xid=0x0): table_id=7 cookie=0x9 total_len=64 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=64 (unbuffered)
327 tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=85,tp_dst=86 tcp_csum:316d
331 AT_CHECK([ovs-ofctl monitor br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
334 ovs-appctl netdev-dummy/receive p1 '50 54 00 00 00 07 20 22 22 22 22 22 08 00 45 00 00 1C 00 00 00 00 00 11 00 00 C0 A8 00 01 C0 A8 00 02 00 08 00 0B 00 00 12 34 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
337 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
338 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
339 NXT_PACKET_IN (xid=0x0): cookie=0x1 total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
340 udp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=20:22:22:22:22:22,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=11 udp_csum:1234
342 NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x3 total_len=64 in_port=1 reg0=0x1 (via action) data_len=64 (unbuffered)
343 udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=20:22:22:22:22:22,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=11 udp_csum:1234
345 NXT_PACKET_IN (xid=0x0): table_id=2 cookie=0x4 total_len=64 in_port=1 reg0=0x1 reg1=0x2 (via action) data_len=64 (unbuffered)
346 udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=11 udp_csum:1234
348 NXT_PACKET_IN (xid=0x0): table_id=3 cookie=0x5 total_len=64 in_port=1 reg0=0x1 reg1=0x2 reg2=0x3 (via action) data_len=64 (unbuffered)
349 udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=11 udp_csum:1234
351 NXT_PACKET_IN (xid=0x0): table_id=4 cookie=0x6 total_len=64 in_port=1 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 (via action) data_len=64 (unbuffered)
352 udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=11 udp_csum:2c37
354 NXT_PACKET_IN (xid=0x0): table_id=5 cookie=0x7 total_len=64 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=64 (unbuffered)
355 udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=11 udp_csum:4439
357 NXT_PACKET_IN (xid=0x0): table_id=6 cookie=0x8 total_len=64 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=64 (unbuffered)
358 udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=85,tp_dst=11 udp_csum:43ec
360 NXT_PACKET_IN (xid=0x0): table_id=7 cookie=0x9 total_len=64 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=64 (unbuffered)
361 udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=85,tp_dst=86 udp_csum:43a1
363 NXT_PACKET_IN (xid=0x0): table_id=7 cookie=0x9 total_len=64 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=64 (unbuffered)
364 udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=85,tp_dst=86 udp_csum:43a1
367 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
368 cookie=0x1, n_packets=2, n_bytes=120, dl_src=20:22:22:22:22:22 actions=CONTROLLER:65535,resubmit(80,1)
369 cookie=0x2, n_packets=3, n_bytes=180, dl_src=30:33:33:33:33:33 actions=mod_vlan_vid:15,CONTROLLER:65535
370 cookie=0x3, table=1, n_packets=2, n_bytes=120, in_port=80 actions=load:0x1->NXM_NX_REG0[[]],mod_vlan_vid:80,CONTROLLER:65535,resubmit(81,2)
371 cookie=0x4, table=2, n_packets=2, n_bytes=120, in_port=81 actions=load:0x2->NXM_NX_REG1[[]],mod_dl_src:80:81:81:81:81:81,CONTROLLER:65535,resubmit(82,3)
372 cookie=0x5, table=3, n_packets=2, n_bytes=120, in_port=82 actions=load:0x3->NXM_NX_REG2[[]],mod_dl_dst:82:82:82:82:82:82,CONTROLLER:65535,resubmit(83,4)
373 cookie=0x6, table=4, n_packets=2, n_bytes=120, in_port=83 actions=load:0x4->NXM_NX_REG3[[]],mod_nw_src:83.83.83.83,CONTROLLER:65535,resubmit(84,5)
374 cookie=0x7, table=5, n_packets=2, n_bytes=120, in_port=84 actions=load:0x5->NXM_NX_REG4[[]],load:0x6->NXM_NX_TUN_ID[[]],mod_nw_dst:84.84.84.84,CONTROLLER:65535,resubmit(85,6)
375 cookie=0x8, table=6, n_packets=2, n_bytes=120, in_port=85 actions=mod_tp_src:85,CONTROLLER:65535,resubmit(86,7)
376 cookie=0x9, table=7, n_packets=2, n_bytes=120, in_port=86 actions=mod_tp_dst:86,CONTROLLER:65535,CONTROLLER:65535
377 n_packets=3, n_bytes=180, dl_src=10:11:11:11:11:11 actions=CONTROLLER:65535
384 AT_SETUP([ofproto-dpif - VLAN handling])
386 [set Bridge br0 fail-mode=standalone -- \
387 add-port br0 p1 trunks=10,12 -- \
388 add-port br0 p2 tag=10 -- \
389 add-port br0 p3 tag=12 \
390 other-config:priority-tags=true -- \
391 add-port br0 p4 tag=12 -- \
392 add-port br0 p5 vlan_mode=native-tagged tag=10 -- \
393 add-port br0 p6 vlan_mode=native-tagged tag=10 trunks=10,12 -- \
394 add-port br0 p7 vlan_mode=native-untagged tag=12 -- \
395 add-port br0 p8 vlan_mode=native-untagged tag=12 trunks=10,12 \
396 other-config:priority-tags=true -- \
397 set Interface p1 type=dummy -- \
398 set Interface p2 type=dummy -- \
399 set Interface p3 type=dummy -- \
400 set Interface p4 type=dummy -- \
401 set Interface p5 type=dummy -- \
402 set Interface p6 type=dummy -- \
403 set Interface p7 type=dummy -- \
404 set Interface p8 type=dummy --])
406 dnl Each of these specifies an in_port by number, a VLAN VID (or "none"),
407 dnl a VLAN PCP (used if the VID isn't "none") and the expected set of datapath
413 "100 10 0 1,5,6,7,8,pop_vlan,2" \
414 "100 10 1 1,5,6,7,8,pop_vlan,2" \
417 "100 12 0 1,5,6,pop_vlan,3,4,7,8" \
418 "100 12 1 1,5,6,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
422 "1 10 0 5,6,7,8,100,pop_vlan,2" \
423 "1 10 1 5,6,7,8,100,pop_vlan,2" \
426 "1 12 0 5,6,100,pop_vlan,3,4,7,8" \
427 "1 12 1 5,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
428 "2 none 0 push_vlan(vid=10,pcp=0),1,5,6,7,8,100" \
429 "2 0 0 pop_vlan,push_vlan(vid=10,pcp=0),1,5,6,7,8,100" \
430 "2 0 1 pop_vlan,push_vlan(vid=10,pcp=1),1,5,6,7,8,100" \
437 "3 none 0 4,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
438 "3 0 0 pop_vlan,4,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
439 "3 0 1 8,pop_vlan,4,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
446 "4 none 0 3,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
447 "4 0 0 pop_vlan,3,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
448 "4 0 1 3,8,pop_vlan,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
455 "5 none 0 2,push_vlan(vid=10,pcp=0),1,6,7,8,100" \
456 "5 0 0 pop_vlan,2,push_vlan(vid=10,pcp=0),1,6,7,8,100" \
457 "5 0 1 pop_vlan,2,push_vlan(vid=10,pcp=1),1,6,7,8,100" \
458 "5 10 0 1,6,7,8,100,pop_vlan,2" \
459 "5 10 1 1,6,7,8,100,pop_vlan,2" \
462 "5 12 0 1,6,100,pop_vlan,3,4,7,8" \
463 "5 12 1 1,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
464 "6 none 0 2,push_vlan(vid=10,pcp=0),1,5,7,8,100" \
465 "6 0 0 pop_vlan,2,push_vlan(vid=10,pcp=0),1,5,7,8,100" \
466 "6 0 1 pop_vlan,2,push_vlan(vid=10,pcp=1),1,5,7,8,100" \
467 "6 10 0 1,5,7,8,100,pop_vlan,2" \
468 "6 10 1 1,5,7,8,100,pop_vlan,2" \
471 "6 12 0 1,5,100,pop_vlan,3,4,7,8" \
472 "6 12 1 1,5,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
473 "7 none 0 3,4,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
474 "7 0 0 pop_vlan,3,4,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
475 "7 0 1 3,8,pop_vlan,4,push_vlan(vid=12,pcp=1),1,5,6,100" \
476 "7 10 0 1,5,6,8,100,pop_vlan,2" \
477 "7 10 1 1,5,6,8,100,pop_vlan,2" \
480 "7 12 0 1,5,6,100,pop_vlan,3,4,8" \
481 "7 12 1 1,5,6,100,pop_vlan,4,push_vlan(vid=0,pcp=1),3,8" \
482 "8 none 0 3,4,7,push_vlan(vid=12,pcp=0),1,5,6,100" \
483 "8 0 0 pop_vlan,3,4,7,push_vlan(vid=12,pcp=0),1,5,6,100" \
484 "8 0 1 3,pop_vlan,4,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
485 "8 10 0 1,5,6,7,100,pop_vlan,2" \
486 "8 10 1 1,5,6,7,100,pop_vlan,2" \
489 "8 12 0 1,5,6,100,pop_vlan,3,4,7" \
490 "8 12 1 1,5,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3"
498 if test $vlan = none; then
499 flow="in_port($in_port),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff),eth_type(0xabcd)"
501 flow="in_port($in_port),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff),eth_type(0x8100),vlan(vid=$vlan,pcp=$pcp),encap(eth_type(0xabcd))"
504 echo "----------------------------------------------------------------------"
505 echo "in_port=$in_port vlan=$vlan pcp=$pcp"
507 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
508 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
510 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
512 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
518 AT_SETUP([ofproto-dpif - fragment handling])
520 ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6], [90])
521 AT_DATA([flows.txt], [dnl
522 priority=75 tcp ip_frag=no tp_dst=80 actions=output:1
523 priority=75 tcp ip_frag=first tp_dst=80 actions=output:2
524 priority=75 tcp ip_frag=later tp_dst=80 actions=output:3
525 priority=50 tcp ip_frag=no actions=output:4
526 priority=50 tcp ip_frag=first actions=output:5
527 priority=50 tcp ip_frag=later actions=output:6
529 AT_CHECK([ovs-ofctl replace-flows br0 flows.txt])
531 base_flow="in_port(90),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=128"
532 no_flow="$base_flow,frag=no),tcp(src=12345,dst=80)"
533 first_flow="$base_flow,frag=first),tcp(src=12345,dst=80)"
534 later_flow="$base_flow,frag=later)"
536 # mode no first later
548 AT_CHECK([ovs-ofctl set-frags br0 $mode])
549 for type in no first later; do
550 eval flow=\$${type}_flow exp_output=\$$type
551 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
552 AT_CHECK_UNQUOTED([tail -1 stdout], [0], [Datapath actions: $exp_output
559 AT_SETUP([ofproto-dpif - exit])
561 ADD_OF_PORTS([br0], [1], [2], [3], [10], [11], [12], [13], [14])
562 AT_DATA([flows.txt], [dnl
563 in_port=1 actions=output:10,exit,output:11
564 in_port=2 actions=output:12,resubmit:1,output:12
565 in_port=3 actions=output:13,resubmit:2,output:14
567 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
568 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
569 AT_CHECK([tail -1 stdout], [0],
570 [Datapath actions: 10
572 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(2),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
573 AT_CHECK([tail -1 stdout], [0],
574 [Datapath actions: 12,10
576 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(3),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
577 AT_CHECK([tail -1 stdout], [0],
578 [Datapath actions: 13,12,10
584 AT_SETUP([ofproto-dpif - mirroring, select_all])
586 ADD_OF_PORTS([br0], 1, 2, 3)
588 set Bridge br0 mirrors=@m --\
589 --id=@p3 get Port p3 --\
590 --id=@m create Mirror name=mymirror select_all=true output_port=@p3
592 AT_DATA([flows.txt], [dnl
593 in_port=1 actions=output:2
594 in_port=2 actions=output:1
596 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
598 flow="in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)"
599 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
600 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
601 [Datapath actions: 2,3
604 flow="in_port(2),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)"
605 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
606 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
607 [Datapath actions: 1,3
614 AT_SETUP([ofproto-dpif - mirroring, select_src])
616 ADD_OF_PORTS([br0], 1, 2, 3)
618 set Bridge br0 mirrors=@m --\
619 --id=@p1 get Port p1 -- --id=@p3 get Port p3 --\
620 --id=@m create Mirror name=mymirror select_src_port=@p1 output_port=@p3
622 AT_DATA([flows.txt], [dnl
623 in_port=1 actions=output:2
624 in_port=2 actions=output:1
626 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
628 flow="in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)"
629 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
630 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
631 [Datapath actions: 2,3
634 flow="in_port(2),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)"
635 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
636 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
642 AT_SETUP([ofproto-dpif - mirroring, OFPP_NONE ingress port])
644 ADD_OF_PORTS([br0], 1, 2)
646 set Bridge br0 mirrors=@m --\
647 --id=@p2 get Port p2 --\
648 --id=@m create Mirror name=mymirror select_all=true output_port=@p2
650 AT_CHECK([ovs-ofctl add-flow br0 action=output:1])
652 # "in_port" defaults to OFPP_NONE if it's not specified.
653 flow="icmp,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_ttl=128,icmp_type=8,icmp_code=0"
654 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
655 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
656 [Datapath actions: 1,2
663 AT_SETUP([ofproto-dpif - mirroring, select_dst])
665 ADD_OF_PORTS([br0], 1, 2, 3)
667 set Bridge br0 mirrors=@m --\
668 --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
669 --id=@m create Mirror name=mymirror select_dst_port=@p2 output_port=@p3
671 AT_DATA([flows.txt], [dnl
672 in_port=1 actions=output:2
673 in_port=2 actions=output:1
675 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
677 flow="in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)"
678 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
679 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
680 [Datapath actions: 2,3
683 flow="in_port(2),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)"
684 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
685 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
693 AT_SETUP([ofproto-dpif - mirroring, select_vlan])
695 ADD_OF_PORTS([br0], 1, 2, 3)
697 set Bridge br0 mirrors=@m --\
698 --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
699 --id=@m create Mirror name=mymirror select_all=true select_vlan=11 output_port=@p3
701 AT_DATA([flows.txt], [dnl
702 in_port=1, actions=output:2
704 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
706 flow="in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)"
707 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
708 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
712 flow="in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x8100),vlan(vid=10,pcp=0),encap(eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0))"
713 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
714 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
718 flow="in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x8100),vlan(vid=11,pcp=0),encap(eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0))"
719 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
720 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
721 [Datapath actions: 2,3
728 AT_SETUP([ofproto-dpif - mirroring, output_port])
730 ADD_OF_PORTS([br0], 1, 2, 3)
732 set Bridge br0 mirrors=@m --\
733 --id=@p3 get Port p3 --\
734 --id=@m create Mirror name=mymirror select_all=true output_port=@p3
736 AT_DATA([flows.txt], [dnl
737 in_port=1 actions=mod_vlan_vid:17,output:2
738 in_port=2 actions=output:1
740 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
742 flow="in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)"
743 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
744 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
745 [Datapath actions: push_vlan(vid=17,pcp=0),2,pop_vlan,3
748 flow="in_port(2),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)"
749 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
750 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
751 [Datapath actions: 1,3
757 AT_SETUP([ofproto-dpif - mirroring, output_vlan])
759 ADD_OF_PORTS([br0], 1, 2)
761 set Bridge br0 mirrors=@m --\
762 --id=@m create Mirror name=mymirror select_all=true output_vlan=12
764 AT_DATA([flows.txt], [dnl
765 in_port=1 actions=output:2
766 in_port=2 actions=mod_vlan_vid:17,output:1
768 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
770 flow="in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)"
771 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
772 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
774 expected="2,push_vlan(vid=12,pcp=0),1,2,100"
775 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
777 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
779 flow="in_port(2),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)"
780 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
781 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
783 expected="push_vlan(vid=17,pcp=0),1,pop_vlan,push_vlan(vid=12,pcp=0),1,2,100"
784 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
786 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
791 m4_define([OFPROTO_TRACE],
793 AT_CHECK([ovs-appctl ofproto/trace $1 "$flow" $3], [0], [stdout])
794 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
796 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" $5],
799 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" $5],
802 AT_SETUP([ofproto-dpif - MAC learning])
803 OVS_VSWITCHD_START([set bridge br0 fail-mode=standalone])
804 ADD_OF_PORTS([br0], 1, 2, 3)
806 arp='eth_type(0x0806),arp(sip=192.168.0.1,tip=192.168.0.2,op=1,sha=50:54:00:00:00:05,tha=00:00:00:00:00:00)'
808 # Trace an ARP packet arriving on p3, to create a MAC learning entry.
811 [in_port(3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
815 # Check for the MAC learning entry.
816 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
818 3 0 50:54:00:00:00:05 ?
821 # Trace a packet arrival destined for the learned MAC.
822 # (This will also learn a MAC.)
825 [in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05),$arp],
829 # Check for both MAC learning entries.
830 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
832 3 0 50:54:00:00:00:05 ?
833 1 0 50:54:00:00:00:06 ?
836 # Trace a packet arrival that updates the first learned MAC entry.
839 [in_port(2),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
843 # Check that the MAC learning entry was updated.
844 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
846 1 0 50:54:00:00:00:06 ?
847 2 0 50:54:00:00:00:05 ?
850 # Add another bridge.
854 -- set bridge br1 datapath-type=dummy \
855 -- add-port br1 p4 -- set interface p4 type=dummy \
856 -- add-port br1 p5 -- set interface p5 type=dummy])
858 # Trace some packet arrivals in br1 to create MAC learning entries there too.
861 [in_port(4),eth(src=50:54:00:00:00:06,dst=ff:ff:ff:ff:ff:ff),$arp],
866 [in_port(5),eth(src=50:54:00:00:00:07,dst=ff:ff:ff:ff:ff:ff),$arp],
870 # Check that the MAC learning entries were added.
871 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
873 4 0 50:54:00:00:00:06 ?
874 5 0 50:54:00:00:00:07 ?
877 # Delete port p1 and see that its MAC learning entry disappeared, and
878 # that the MAC learning entry for the same MAC was also deleted from br1.
879 AT_CHECK([ovs-vsctl del-port p1])
880 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
882 2 0 50:54:00:00:00:05 ?
884 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
886 5 0 50:54:00:00:00:07 ?
892 AT_SETUP([ofproto-dpif - MAC table overflow])
894 [set bridge br0 fail-mode=standalone other-config:mac-table-size=10 -- \
895 add-port br0 p1 -- set Interface p1 type=dummy -- \
896 add-port br0 p2 -- set Interface p2 type=dummy -- \
897 add-port br0 p3 -- set Interface p3 type=dummy])
899 arp='eth_type(0x0806),arp(sip=192.168.0.1,tip=192.168.0.2,op=1,sha=50:54:00:00:00:05,tha=00:00:00:00:00:00)'
901 AT_CHECK([ovs-appctl time/stop])
903 # Trace 10 ARP packets arriving on p3, to create MAC learning entries.
904 for i in 0 1 2 3 4 5 6 7 8 9; do
907 [in_port(3),eth(src=50:54:00:00:00:0$i,dst=ff:ff:ff:ff:ff:ff),$arp],
910 ovs-appctl time/warp 1000
913 # Check for the MAC learning entries.
914 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/ *[[0-9]]\{1,\}$//' | sort],
916 3 0 50:54:00:00:00:00
917 3 0 50:54:00:00:00:01
918 3 0 50:54:00:00:00:02
919 3 0 50:54:00:00:00:03
920 3 0 50:54:00:00:00:04
921 3 0 50:54:00:00:00:05
922 3 0 50:54:00:00:00:06
923 3 0 50:54:00:00:00:07
924 3 0 50:54:00:00:00:08
925 3 0 50:54:00:00:00:09
929 # Trace another ARP packet on another MAC.
932 [in_port(3),eth(src=50:54:00:00:00:10,dst=ff:ff:ff:ff:ff:ff),$arp],
936 # Check that the new one chased the oldest one out of the table.
937 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/' | sort],
939 3 0 50:54:00:00:00:01 ?
940 3 0 50:54:00:00:00:02 ?
941 3 0 50:54:00:00:00:03 ?
942 3 0 50:54:00:00:00:04 ?
943 3 0 50:54:00:00:00:05 ?
944 3 0 50:54:00:00:00:06 ?
945 3 0 50:54:00:00:00:07 ?
946 3 0 50:54:00:00:00:08 ?
947 3 0 50:54:00:00:00:09 ?
948 3 0 50:54:00:00:00:10 ?
954 dnl Test that basic NetFlow reports flow statistics correctly:
955 dnl - The initial packet of a flow are correctly accounted.
956 dnl - Later packets within a flow are correctly accounted.
957 dnl - Flow actions changing (in this case, due to MAC learning)
958 dnl cause a record to be sent.
959 AT_SETUP([ofproto-dpif - NetFlow flow expiration])
961 AT_CHECK([perl $srcdir/choose-port.pl], [0], [stdout])
962 NETFLOW_PORT=`cat stdout`
964 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
965 ADD_OF_PORTS([br0], 1, 2)
967 set Bridge br0 netflow=@nf -- \
968 --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
969 engine_id=1 engine_type=2 active_timeout=30 add-id-to-interface=false
971 ON_EXIT([kill `cat test-netflow.pid`])
972 AT_CHECK([test-netflow --detach --no-chdir --pidfile $NETFLOW_PORT:127.0.0.1 > netflow.log])
973 AT_CAPTURE_FILE([netflow.log])
975 for delay in 1000 30000; do
976 ovs-appctl netdev-dummy/receive p1 'in_port(2),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'
977 ovs-appctl netdev-dummy/receive p2 'in_port(1),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x0800),ipv4(src=192.168.0.2,dst=192.168.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=0,code=0)'
979 ovs-appctl time/warp $delay
984 ovs-appctl -t test-netflow exit
986 AT_CHECK([[sed -e 's/, uptime [0-9]*//
988 s/time \([0-9]*\)\.\.\.\1$/time <moment>/
989 s/time [0-9]*\.\.\.[0-9]*/time <range>/
990 ' netflow.log | sort]], [0],
992 header: v5, seq 0, engine 2,1
993 header: v5, seq 1, engine 2,1
994 seq 0: 192.168.0.1 > 192.168.0.2, if 1 > 65535, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
995 seq 1: 192.168.0.1 > 192.168.0.2, if 1 > 2, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
996 seq 1: 192.168.0.2 > 192.168.0.1, if 2 > 1, 2 pkts, 120 bytes, ICMP 0:0, time <range>
1000 dnl Test that basic NetFlow reports active expirations correctly.
1001 AT_SETUP([ofproto-dpif - NetFlow active expiration])
1003 AT_CHECK([perl $srcdir/choose-port.pl], [0], [stdout])
1004 NETFLOW_PORT=`cat stdout`
1006 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
1007 ADD_OF_PORTS([br0], 1, 2)
1009 set Bridge br0 netflow=@nf -- \
1010 --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
1011 engine_id=1 engine_type=2 active_timeout=10 add-id-to-interface=false
1013 ON_EXIT([kill `test-netflow.pid`])
1014 AT_CHECK([test-netflow --detach --no-chdir --pidfile $NETFLOW_PORT:127.0.0.1 > netflow.log])AT_CAPTURE_FILE([netflow.log])
1016 AT_CHECK([ovs-appctl time/stop])
1018 while test $n -le 60; do
1021 ovs-appctl netdev-dummy/receive p1 'in_port(2),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=1234,dst=80)'
1022 ovs-appctl netdev-dummy/receive p2 'in_port(1),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x0800),ipv4(src=192.168.0.2,dst=192.168.0.1,proto=6,tos=0,ttl=64,frag=no),tcp(src=80,dst=1234)'
1024 ovs-appctl time/warp 1000
1027 ovs-appctl time/warp 10000
1031 ovs-appctl -t test-netflow exit
1033 # Count the number of reported packets:
1034 # - From source to destination before MAC learning kicks in (just one).
1035 # - From source to destination after that.
1036 # - From destination to source.
1044 pkts=`echo "$line" | sed 's/.*, \([[0-9]]*\) pkts,.*/\1/'`
1051 "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 65535, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
1054 "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 2, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
1057 "seq "*": 192.168.0.2 > 192.168.0.1, if 2 > 1, "*" pkts, "*" bytes, TCP 80 > 1234, time "*)
1064 eval $counter=\`expr \$$counter + \$pkts\`
1065 n_recs=`expr $n_recs + 1`
1068 # There should be exactly 1 MAC learning packet,
1069 # exactly 59 other packets in that direction,
1070 # and exactly 60 packets in the other direction.
1071 AT_CHECK([echo $n_learn $n_in $n_out $n_other], [0], [1 59 60 0
1074 # There should be 1 expiration for MAC learning,
1075 # at least 5 active and a final expiration in one direction,
1076 # and at least 5 active and a final expiration in the other direction.
1078 AT_CHECK([test $n_recs -ge 13])
1082 AT_SETUP([idle_age and hard_age increase over time])
1085 # get_ages DURATION HARD IDLE
1087 # Fetch the flow duration, hard age, and idle age into the variables
1088 # whose names are given as arguments. Rounds DURATION down to the
1089 # nearest integer. If hard_age doesn't appear in the output, sets
1090 # HARD to "none". If idle_age doesn't appear in the output, sets IDLE
1093 AT_CHECK([ovs-ofctl dump-flows br0], [0], [stdout])
1095 duration=`sed -n 's/.*duration=\([[0-9]]*\)\(\.[[0-9]]*\)\{0,1\}s.*/\1/p' stdout`
1096 AT_CHECK([[expr X"$duration" : 'X[0-9][0-9]*$']], [0], [ignore])
1097 AS_VAR_COPY([$1], [duration])
1099 hard=`sed -n 's/.*hard_age=\([[0-9]]*\),.*/\1/p' stdout`
1100 if test X"$hard" = X; then
1103 AT_CHECK([[expr X"$hard" : 'X[0-9][0-9]*$']], [0], [ignore])
1105 AS_VAR_COPY([$2], [hard])
1107 idle=`sed -n 's/.*idle_age=\([[0-9]]*\),.*/\1/p' stdout`
1108 if test X"$idle" = X; then
1111 AT_CHECK([[expr X"$idle" : 'X[0-9][0-9]*$']], [0], [ignore])
1113 AS_VAR_COPY([$3], [idle])
1116 # Add a flow and get its initial hard and idle age.
1117 AT_CHECK([ovs-ofctl add-flow br0 hard_timeout=199,idle_timeout=188,actions=drop])
1118 get_ages duration1 hard1 idle1
1120 # Warp time forward by 10 seconds, then modify the flow's actions.
1121 ovs-appctl time/warp 10000
1122 get_ages duration2 hard2 idle2
1123 AT_CHECK([ovs-ofctl mod-flows br0 actions=flood])
1125 # Warp time forward by 10 seconds.
1126 ovs-appctl time/warp 10000
1127 get_ages duration3 hard3 idle3
1129 # Warp time forward 10 more seconds, then pass some packets through the flow,
1130 # then warp forward a few more times because idle times are only updated
1132 ovs-appctl time/warp 10000
1133 ovs-appctl netdev-dummy/receive br0 'in_port(0),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x0800),ipv4(src=192.168.0.2,dst=192.168.0.1,proto=6,tos=0,ttl=64,frag=no),tcp(src=80,dst=1234)'
1134 ovs-appctl time/warp 1000
1135 ovs-appctl time/warp 1000
1136 ovs-appctl time/warp 1000
1137 get_ages duration4 hard4 idle4
1139 printf "duration: %4s => %4s => %4s => %4s\n" $duration1 $duration2 $duration3 $duration4
1140 printf "hard_age: %4s => %4s => %4s => %4s\n" $hard1 $hard2 $hard3 $hard4
1141 printf "idle_age: %4s => %4s => %4s => %4s\n" $idle1 $idle2 $idle3 $idle4
1143 # Duration should increase steadily over time.
1144 AT_CHECK([test $duration1 -lt $duration2])
1145 AT_CHECK([test $duration2 -lt $duration3])
1146 AT_CHECK([test $duration3 -lt $duration4])
1148 # Hard age should be "none" initially because it's the same as flow_duration,
1149 # then it should increase.
1150 AT_CHECK([test $hard1 = none])
1151 AT_CHECK([test $hard2 = none])
1152 AT_CHECK([test $hard3 != none])
1153 AT_CHECK([test $hard4 != none])
1154 AT_CHECK([test $hard3 -lt $hard4])
1156 # Idle age should increase from 1 to 2 to 3, then decrease.
1157 AT_CHECK([test $idle1 -lt $idle2])
1158 AT_CHECK([test $idle2 -lt $idle3])
1159 AT_CHECK([test $idle3 -gt $idle4])
1161 # Check some invariant relationships.
1162 AT_CHECK([test $duration1 = $idle1])
1163 AT_CHECK([test $duration2 = $idle2])
1164 AT_CHECK([test $duration3 = $idle3])
1165 AT_CHECK([test $idle3 -gt $hard3])
1166 AT_CHECK([test $idle4 -lt $hard4])
1167 AT_CHECK([test $hard4 -lt $duration4])
1172 AT_SETUP([ofproto-dpif - fin_timeout])
1174 AT_DATA([flows.txt], [dnl
1175 in_port=1 actions=output:2
1176 in_port=2 actions=mod_vlan_vid:17,output:1
1178 AT_CHECK([ovs-ofctl add-flow br0 'idle_timeout=60,actions=fin_timeout(idle_timeout=5)'])
1179 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1181 idle_timeout=60, actions=fin_timeout(idle_timeout=5)
1183 # Check that a TCP SYN packet does not change the timeout. (Because
1184 # flow stats updates are mainly what implements the fin_timeout
1185 # feature, we warp forward a couple of times to ensure that flow stats
1186 # run before re-checking the flow table.)
1187 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f908004500003c2e2440004006465dac11370dac11370b828b0016751e267b00000000a00216d017360000020405b40402080a2d25085f0000000001030307], [0], [success
1189 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
1192 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1194 n_packets=1, n_bytes=74, idle_timeout=60, actions=fin_timeout(idle_timeout=5)
1196 # Check that a TCP FIN packet does change the timeout.
1197 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f90800451000342e3e40004006463bac11370dac11370b828b0016751e319dfc96399b801100717ae800000101080a2d250a9408579588], [0], [success
1199 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
1202 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1204 n_packets=2, n_bytes=140, idle_timeout=5, actions=fin_timeout(idle_timeout=5)
1209 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-dps])
1210 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
1211 ADD_OF_PORTS([br0], [1], [2])
1212 ADD_OF_PORTS([br1], [3])
1214 AT_CHECK([ovs-appctl dpif/dump-dps], [0], [dnl
1221 AT_SETUP([ofproto-dpif - ovs-appctl dpif/show])
1222 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
1223 ADD_OF_PORTS([br0], [1], [2])
1224 ADD_OF_PORTS([br1], [3])
1226 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
1227 br0 (dummy@ovs-dummy):
1228 lookups: hit:0 missed:0 lost:0
1230 br0 65534/100: (dummy)
1233 br1 (dummy@ovs-dummy):
1234 lookups: hit:0 missed:0 lost:0
1236 br1 65534/101: (dummy)
1240 AT_CHECK([ovs-appctl dpif/show br0], [0], [dnl
1241 br0 (dummy@ovs-dummy):
1242 lookups: hit:0 missed:0 lost:0
1244 br0 65534/100: (dummy)
1251 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-flows])
1252 OVS_VSWITCHD_START([add-br br1 -- \
1253 set bridge br1 datapath-type=dummy fail-mode=secure])
1254 ADD_OF_PORTS([br0], [1], [2])
1255 ADD_OF_PORTS([br1], [3])
1257 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'], [0], [success
1259 AT_CHECK([ovs-appctl netdev-dummy/receive p2 'in_port(2),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x0800),ipv4(src=192.168.0.2,dst=192.168.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=0,code=0)'], [0], [success
1261 AT_CHECK([ovs-appctl netdev-dummy/receive p3 'in_port(3),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'], [0], [success
1264 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
1265 in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0), packets:0, bytes:0, used:0.0s, actions:drop
1266 in_port(2),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x0800),ipv4(src=192.168.0.2,dst=192.168.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=0,code=0), packets:0, bytes:0, used:0.0s, actions:drop
1269 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
1270 in_port(3),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0), packets:0, bytes:0, used:0.0s, actions:drop
1276 AT_SETUP([ofproto-dpif - ovs-appctl dpif/del-flows])
1277 OVS_VSWITCHD_START([add-br br1 -- \
1278 set bridge br1 datapath-type=dummy fail-mode=secure])
1279 ADD_OF_PORTS([br0], [1], [2])
1280 ADD_OF_PORTS([br1], [3])
1282 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'], [0], [success
1284 AT_CHECK([ovs-appctl netdev-dummy/receive p2 'in_port(2),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x0800),ipv4(src=192.168.0.2,dst=192.168.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=0,code=0)'], [0], [success
1286 AT_CHECK([ovs-appctl netdev-dummy/receive p3 'in_port(3),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'], [0], [success
1289 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
1290 in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0), packets:0, bytes:0, used:0.0s, actions:drop
1291 in_port(2),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x0800),ipv4(src=192.168.0.2,dst=192.168.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=0,code=0), packets:0, bytes:0, used:0.0s, actions:drop
1294 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
1295 in_port(3),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0), packets:0, bytes:0, used:0.0s, actions:drop
1298 AT_CHECK([ovs-appctl dpif/del-flows br0])
1299 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
1302 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
1303 in_port(3),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0), packets:0, bytes:0, used:0.0s, actions:drop
1309 AT_SETUP([ofproto-dpif - patch ports])
1310 OVS_VSWITCHD_START([add-br br1 \
1311 -- set bridge br1 datapath-type=dummy fail-mode=secure \
1312 -- add-port br1 pbr1 -- set int pbr1 type=patch options:peer=pbr0 \
1313 -- add-port br0 pbr0 -- set int pbr0 type=patch options:peer=pbr1])
1315 ADD_OF_PORTS([br0], [2])
1316 ADD_OF_PORTS([br1], [3])
1318 AT_CHECK([ovs-ofctl add-flow br0 actions=LOCAL,output:1,output:2])
1319 AT_CHECK([ovs-ofctl add-flow br1 actions=LOCAL,output:1,output:3])
1321 for i in $(seq 1 10); do
1322 ovs-appctl netdev-dummy/receive br0 'in_port(100),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'
1325 for i in $(seq 1 5); do
1326 ovs-appctl netdev-dummy/receive br1 'in_port(101),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x0800),ipv4(src=192.168.0.2,dst=192.168.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'
1329 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
1330 br0 (dummy@ovs-dummy):
1331 lookups: hit:13 missed:2 lost:0
1333 br0 65534/100: (dummy)
1335 pbr0 1/none: (patch: peer=pbr1)
1336 br1 (dummy@ovs-dummy):
1337 lookups: hit:13 missed:2 lost:0
1339 br1 65534/101: (dummy)
1341 pbr1 1/none: (patch: peer=pbr0)
1344 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_USED], [0], [dnl
1345 in_port(100),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0), packets:9, bytes:540, used:0.0s, actions:101,3,2
1347 AT_CHECK([ovs-appctl dpif/dump-flows br1 | STRIP_USED], [0], [dnl
1348 in_port(101),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x0800),ipv4(src=192.168.0.2,dst=192.168.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0), packets:4, bytes:240, used:0.0s, actions:100,2,3
1351 AT_CHECK([ovs-ofctl dump-ports br0 pbr0], [0], [dnl
1352 OFPST_PORT reply (xid=0x4): 1 ports
1353 port 1: rx pkts=5, bytes=300, drop=0, errs=0, frame=0, over=0, crc=0
1354 tx pkts=10, bytes=600, drop=0, errs=0, coll=0
1357 AT_CHECK([ovs-ofctl dump-ports br1 pbr1], [0], [dnl
1358 OFPST_PORT reply (xid=0x4): 1 ports
1359 port 1: rx pkts=10, bytes=600, drop=0, errs=0, frame=0, over=0, crc=0
1360 tx pkts=5, bytes=300, drop=0, errs=0, coll=0