1 AT_BANNER([ofproto-dpif])
3 AT_SETUP([ofproto-dpif - resubmit])
5 AT_DATA([flows.txt], [dnl
6 table=0 in_port=1 priority=1000 icmp actions=output(10),resubmit(2),output(19),resubmit(3),output(21)
7 table=0 in_port=2 priority=1500 icmp actions=output(11),resubmit(,1),output(16),resubmit(2,1),output(18)
8 table=0 in_port=3 priority=2000 icmp actions=output(20)
9 table=1 in_port=1 priority=1000 icmp actions=output(12),resubmit(4,1),output(13),resubmit(3),output(15)
10 table=1 in_port=2 priority=1500 icmp actions=output(17),resubmit(,2)
11 table=1 in_port=3 priority=1500 icmp actions=output(14),resubmit(,2)
13 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
14 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])
15 AT_CHECK([tail -1 stdout], [0],
16 [Datapath actions: 10,11,12,13,14,15,16,17,18,19,20,21
21 AT_SETUP([ofproto-dpif - registers])
23 AT_DATA([flows.txt], [dnl
24 in_port=90 actions=resubmit:2,resubmit:3,resubmit:4,resubmit:91
25 in_port=91 actions=resubmit:5,resubmit:6,resubmit:7,resubmit:92
26 in_port=92 actions=resubmit:8,resubmit:9,resubmit:10,resubmit:11
27 in_port=2 actions=load:0x000db000->NXM_NX_REG0[[]]
28 in_port=3 actions=load:0xdea->NXM_NX_REG0[[20..31]]
29 in_port=4 actions=load:0xeef->NXM_NX_REG0[[0..11]]
30 in_port=5 actions=move:NXM_NX_REG0[[]]->NXM_NX_REG1[[]]
31 in_port=6 actions=load:0x22222222->NXM_NX_REG2[[]]
32 in_port=7 actions=move:NXM_NX_REG1[[20..31]]->NXM_NX_REG2[[0..11]]
33 in_port=8 actions=move:NXM_NX_REG1[[0..11]]->NXM_NX_REG2[[20..31]]
34 in_port=9,reg0=0xdeadbeef actions=output:20
35 in_port=10,reg1=0xdeadbeef actions=output:21
36 in_port=11,reg2=0xeef22dea actions=output:22
38 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
39 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])
40 AT_CHECK([tail -1 stdout], [0],
41 [Datapath actions: 20,21,22
46 AT_SETUP([ofproto-dpif - output])
48 AT_DATA([flows.txt], [dnl
49 in_port=1 actions=resubmit:2,resubmit:3,resubmit:4,resubmit:5,resubmit:6,resubmit:7
50 in_port=2 actions=output:9
51 in_port=3 actions=load:55->NXM_NX_REG0[[]],output:NXM_NX_REG0[[]],load:66->NXM_NX_REG1[[]]
52 in_port=4 actions=output:10,output:NXM_NX_REG0[[]],output:NXM_NX_REG1[[]],output:11
53 in_port=5 actions=load:77->NXM_NX_REG0[[0..15]],load:88->NXM_NX_REG0[[16..31]]
54 in_port=6 actions=output:NXM_NX_REG0[[0..15]],output:NXM_NX_REG0[[16..31]]
55 in_port=7 actions=load:0x110000ff->NXM_NX_REG0[[]],output:NXM_NX_REG0[[]]
57 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
58 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])
59 AT_CHECK([tail -1 stdout], [0],
60 [Datapath actions: 9,55,10,55,66,11,77,88
65 AT_SETUP([ofproto-dpif - dec_ttl])
67 AT_DATA([flows.txt], [dnl
68 table=0 in_port=1 action=dec_ttl,output:2,resubmit(1,1),output:4
69 table=1 in_port=1 action=dec_ttl,output:3
71 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
72 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])
73 AT_CHECK([tail -2 stdout], [0],
74 [Datapath actions: set(ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=1,frag=no)),2,4
75 This flow is not cachable.
77 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])
78 AT_CHECK([tail -1 stdout], [0],
79 [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
81 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])
82 AT_CHECK([tail -1 stdout], [0],
83 [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
86 AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl --detach --pidfile 2> ofctl_monitor.log])
87 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])
88 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
89 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
90 NXT_PACKET_IN (xid=0x0): table_id=1 total_len=42 in_port=1 tun_id=0x0 reg0=0x0 reg1=0x0 reg2=0x0 reg3=0x0 reg4=0x0 (via invalid_ttl) data_len=42 (unbuffered)
91 priority:0,tunnel:0,in_port:0000,tci(0) mac(50:54:00:00:00:05->50:54:00:00:00:07) type:0800 proto:1 tos:0 ttl:1 ip(192.168.0.1->192.168.0.2)
97 AT_SETUP([ofproto-dpif - output, OFPP_NONE ingress port])
99 [add-port br0 p1 -- set Interface p1 type=dummy --\
100 add-port br0 p2 -- set Interface p2 type=dummy])
102 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
104 # "in_port" defaults to OFPP_NONE if it's not specified.
105 flow="eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)"
106 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
107 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
110 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
112 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
117 AT_SETUP([ofproto-dpif - DSCP])
118 OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=dummy])
119 AT_DATA([flows.txt], [dnl
120 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
122 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
123 AT_CHECK([ovs-vsctl -- \
124 set Port p1 qos=@newqos --\
125 --id=@newqos create QoS type=linux-htb queues=1=@q1,2=@q2 --\
126 --id=@q1 create Queue dscp=1 --\
127 --id=@q2 create Queue dscp=2], [0], [ignore])
128 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])
129 AT_CHECK([tail -1 stdout], [0],
130 [Datapath actions: dnl
132 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0x7,ttl=128,frag=no)),set(priority(1)),1,dnl
133 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0xb,ttl=128,frag=no)),set(priority(2)),1,dnl
135 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0x7,ttl=128,frag=no)),set(priority(1)),1,dnl
136 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0xff,ttl=128,frag=no)),set(priority(0)),1,dnl
137 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0x3,ttl=128,frag=no)),1,dnl
143 AT_SETUP([ofproto-dpif - output/flood flags])
144 OVS_VSWITCHD_START([dnl
145 add-port br0 p1 -- set Interface p1 type=dummy --\
146 add-port br0 p2 -- set Interface p2 type=dummy --\
147 add-port br0 p3 -- set Interface p3 type=dummy --\
148 add-port br0 p4 -- set Interface p4 type=dummy --\
149 add-port br0 p5 -- set Interface p5 type=dummy --\
150 add-port br0 p6 -- set Interface p6 type=dummy --\
151 add-port br0 p7 -- set Interface p7 type=dummy ])
153 AT_DATA([flows.txt], [dnl
154 in_port=1 actions=flood
155 in_port=2 actions=all
156 in_port=3 actions=output:65534,output:1,output:2,output:3,output:4,output:5,output:6,output:7
157 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
159 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
160 AT_CHECK([ovs-ofctl mod-port br0 5 noforward])
161 AT_CHECK([ovs-ofctl mod-port br0 6 noflood])
163 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])
164 AT_CHECK([tail -1 stdout \
165 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
173 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])
174 AT_CHECK([tail -1 stdout \
175 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
184 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])
185 AT_CHECK([tail -1 stdout], [0],
186 [Datapath actions: 0,1,2,4,6,7
189 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])
190 AT_CHECK([tail -1 stdout], [0],
191 [Datapath actions: set(priority(1)),0,1,2,set(priority(2)),3,set(priority(1)),6,7
196 AT_SETUP([ofproto-dpif - set_tunnel])
198 AT_DATA([flows.txt], [dnl
199 in_port=90 actions=resubmit:1,resubmit:2,resubmit:3,resubmit:4,resubmit:5
200 in_port=1 actions=set_tunnel:1,output:1
201 in_port=2 actions=set_tunnel:1,output:2
202 in_port=3 actions=set_tunnel:2,set_tunnel:3,output:3
203 in_port=4 actions=set_tunnel:4,set_tunnel:3,output:4
204 in_port=5 actions=set_tunnel:5
206 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
207 AT_CHECK([ovs-appctl ofproto/trace br0 'tun_id(0x1),in_port(90),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
208 AT_CHECK([tail -1 stdout], [0],
209 [Datapath actions: set(tun_id(0x1)),1,2,set(tun_id(0x3)),3,4
214 AT_SETUP([ofproto-dpif - controller])
215 OVS_VSWITCHD_START([dnl
216 add-port br0 p1 -- set Interface p1 type=dummy
219 AT_CAPTURE_FILE([ofctl_monitor.log])
220 AT_DATA([flows.txt], [dnl
221 cookie=0x0 dl_src=10:11:11:11:11:11 actions=controller
222 cookie=0x1 dl_src=20:22:22:22:22:22 actions=controller,resubmit(80,1)
223 cookie=0x2 dl_src=30:33:33:33:33:33 actions=mod_vlan_vid:15,controller
225 cookie=0x3 table=1 in_port=80 actions=load:1->NXM_NX_REG0[[]],mod_vlan_vid:80,controller,resubmit(81,2)
226 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)
227 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)
228 cookie=0x6 table=4 in_port=83 actions=load:4->NXM_NX_REG3[[]],mod_nw_src:83.83.83.83,controller,resubmit(84,5)
229 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)
230 cookie=0x8 table=6 in_port=85 actions=mod_tp_src:85,controller,resubmit(86,7)
231 cookie=0x9 table=7 in_port=86 actions=mod_tp_dst:86,controller,controller
233 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
236 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --pidfile 2> ofctl_monitor.log])
239 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)'
242 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
243 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
244 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
245 priority:0,tunnel:0,in_port:0000,tci(0) mac(50:54:00:00:00:05->50:54:00:00:00:07) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->9) tcp_csum:0
247 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
248 priority:0,tunnel:0,in_port:0000,tci(0) mac(50:54:00:00:00:05->50:54:00:00:00:07) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->9) tcp_csum:0
250 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
251 priority:0,tunnel:0,in_port:0000,tci(0) mac(50:54:00:00:00:05->50:54:00:00:00:07) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->9) tcp_csum:0
254 dnl Singleton controller action.
255 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --pidfile 2> ofctl_monitor.log])
258 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)'
261 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
262 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
263 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
264 priority:0,tunnel:0,in_port:0000,tci(0) mac(10:11:11:11:11:11->50:54:00:00:00:07) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->10) tcp_csum:0
266 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
267 priority:0,tunnel:0,in_port:0000,tci(0) mac(10:11:11:11:11:11->50:54:00:00:00:07) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->10) tcp_csum:0
269 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
270 priority:0,tunnel:0,in_port:0000,tci(0) mac(10:11:11:11:11:11->50:54:00:00:00:07) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->10) tcp_csum:0
273 dnl Modified controller action.
274 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --pidfile 2> ofctl_monitor.log])
277 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)'
280 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
281 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
282 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
283 priority:0,tunnel:0,in_port:0000,tci(vlan:15,pcp:0) mac(30:33:33:33:33:33->50:54:00:00:00:07) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->10) tcp_csum:0
285 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
286 priority:0,tunnel:0,in_port:0000,tci(vlan:15,pcp:0) mac(30:33:33:33:33:33->50:54:00:00:00:07) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->10) tcp_csum:0
288 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
289 priority:0,tunnel:0,in_port:0000,tci(vlan:15,pcp:0) mac(30:33:33:33:33:33->50:54:00:00:00:07) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->10) tcp_csum:0
293 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
296 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)'
299 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
300 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
301 NXT_PACKET_IN (xid=0x0): cookie=0x1 total_len=60 in_port=1 tun_id=0x0 reg0=0x0 reg1=0x0 reg2=0x0 reg3=0x0 reg4=0x0 (via action) data_len=60 (unbuffered)
302 priority:0,tunnel:0,in_port:0000,tci(0) mac(20:22:22:22:22:22->50:54:00:00:00:07) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->11) tcp_csum:0
304 NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x3 total_len=64 in_port=1 tun_id=0x0 reg0=0x1 reg1=0x0 reg2=0x0 reg3=0x0 reg4=0x0 (via action) data_len=64 (unbuffered)
305 priority:0,tunnel:0,in_port:0000,tci(vlan:80,pcp:0) mac(20:22:22:22:22:22->50:54:00:00:00:07) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->11) tcp_csum:0
307 NXT_PACKET_IN (xid=0x0): table_id=2 cookie=0x4 total_len=64 in_port=1 tun_id=0x0 reg0=0x1 reg1=0x2 reg2=0x0 reg3=0x0 reg4=0x0 (via action) data_len=64 (unbuffered)
308 priority:0,tunnel:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->50:54:00:00:00:07) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->11) tcp_csum:0
310 NXT_PACKET_IN (xid=0x0): table_id=3 cookie=0x5 total_len=64 in_port=1 tun_id=0x0 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x0 reg4=0x0 (via action) data_len=64 (unbuffered)
311 priority:0,tunnel:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->82:82:82:82:82:82) type:0800 proto:6 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->11) tcp_csum:0
313 NXT_PACKET_IN (xid=0x0): table_id=4 cookie=0x6 total_len=64 in_port=1 tun_id=0x0 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x0 (via action) data_len=64 (unbuffered)
314 priority:0,tunnel:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->82:82:82:82:82:82) type:0800 proto:6 tos:0 ttl:0 ip(83.83.83.83->192.168.0.2) port(8->11) tcp_csum:1a03
316 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)
317 priority:0,tunnel:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->82:82:82:82:82:82) type:0800 proto:6 tos:0 ttl:0 ip(83.83.83.83->84.84.84.84) port(8->11) tcp_csum:3205
319 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)
320 priority:0,tunnel:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->82:82:82:82:82:82) type:0800 proto:6 tos:0 ttl:0 ip(83.83.83.83->84.84.84.84) port(85->11) tcp_csum:31b8
322 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)
323 priority:0,tunnel:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->82:82:82:82:82:82) type:0800 proto:6 tos:0 ttl:0 ip(83.83.83.83->84.84.84.84) port(85->86) tcp_csum:316d
325 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)
326 priority:0,tunnel:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->82:82:82:82:82:82) type:0800 proto:6 tos:0 ttl:0 ip(83.83.83.83->84.84.84.84) port(85->86) tcp_csum:316d
330 AT_CHECK([ovs-ofctl monitor br0 65534 --detach --pidfile 2> ofctl_monitor.log])
333 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'
336 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
337 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
338 NXT_PACKET_IN (xid=0x0): cookie=0x1 total_len=60 in_port=1 tun_id=0x0 reg0=0x0 reg1=0x0 reg2=0x0 reg3=0x0 reg4=0x0 (via action) data_len=60 (unbuffered)
339 priority:0,tunnel:0,in_port:0000,tci(0) mac(20:22:22:22:22:22->50:54:00:00:00:07) type:0800 proto:17 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->11) udp_csum:1234
341 NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x3 total_len=64 in_port=1 tun_id=0x0 reg0=0x1 reg1=0x0 reg2=0x0 reg3=0x0 reg4=0x0 (via action) data_len=64 (unbuffered)
342 priority:0,tunnel:0,in_port:0000,tci(vlan:80,pcp:0) mac(20:22:22:22:22:22->50:54:00:00:00:07) type:0800 proto:17 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->11) udp_csum:1234
344 NXT_PACKET_IN (xid=0x0): table_id=2 cookie=0x4 total_len=64 in_port=1 tun_id=0x0 reg0=0x1 reg1=0x2 reg2=0x0 reg3=0x0 reg4=0x0 (via action) data_len=64 (unbuffered)
345 priority:0,tunnel:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->50:54:00:00:00:07) type:0800 proto:17 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->11) udp_csum:1234
347 NXT_PACKET_IN (xid=0x0): table_id=3 cookie=0x5 total_len=64 in_port=1 tun_id=0x0 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x0 reg4=0x0 (via action) data_len=64 (unbuffered)
348 priority:0,tunnel:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->82:82:82:82:82:82) type:0800 proto:17 tos:0 ttl:0 ip(192.168.0.1->192.168.0.2) port(8->11) udp_csum:1234
350 NXT_PACKET_IN (xid=0x0): table_id=4 cookie=0x6 total_len=64 in_port=1 tun_id=0x0 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x0 (via action) data_len=64 (unbuffered)
351 priority:0,tunnel:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->82:82:82:82:82:82) type:0800 proto:17 tos:0 ttl:0 ip(83.83.83.83->192.168.0.2) port(8->11) udp_csum:2c37
353 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)
354 priority:0,tunnel:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->82:82:82:82:82:82) type:0800 proto:17 tos:0 ttl:0 ip(83.83.83.83->84.84.84.84) port(8->11) udp_csum:4439
356 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)
357 priority:0,tunnel:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->82:82:82:82:82:82) type:0800 proto:17 tos:0 ttl:0 ip(83.83.83.83->84.84.84.84) port(85->11) udp_csum:43ec
359 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)
360 priority:0,tunnel:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->82:82:82:82:82:82) type:0800 proto:17 tos:0 ttl:0 ip(83.83.83.83->84.84.84.84) port(85->86) udp_csum:43a1
362 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)
363 priority:0,tunnel:0,in_port:0000,tci(vlan:80,pcp:0) mac(80:81:81:81:81:81->82:82:82:82:82:82) type:0800 proto:17 tos:0 ttl:0 ip(83.83.83.83->84.84.84.84) port(85->86) udp_csum:43a1
366 AT_CHECK([ovs-ofctl dump-flows br0 | STRIP_DURATION | sort], [0], [dnl
367 cookie=0x0, duration=?s, table=0, n_packets=3, n_bytes=180, dl_src=10:11:11:11:11:11 actions=CONTROLLER:65535
368 cookie=0x1, duration=?s, table=0, n_packets=2, n_bytes=120, dl_src=20:22:22:22:22:22 actions=CONTROLLER:65535,resubmit(80,1)
369 cookie=0x2, duration=?s, table=0, n_packets=3, n_bytes=180, dl_src=30:33:33:33:33:33 actions=mod_vlan_vid:15,CONTROLLER:65535
370 cookie=0x3, duration=?s, 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, duration=?s, 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, duration=?s, 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, duration=?s, 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, duration=?s, 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, duration=?s, table=6, n_packets=2, n_bytes=120, in_port=85 actions=mod_tp_src:85,CONTROLLER:65535,resubmit(86,7)
376 cookie=0x9, duration=?s, table=7, n_packets=2, n_bytes=120, in_port=86 actions=mod_tp_dst:86,CONTROLLER:65535,CONTROLLER:65535
377 NXST_FLOW reply (xid=0x4):
383 AT_SETUP([ofproto-dpif - VLAN handling])
385 [set Bridge br0 fail-mode=standalone -- \
386 add-port br0 p1 trunks=10,12 -- \
387 add-port br0 p2 tag=10 -- \
388 add-port br0 p3 tag=12 \
389 other-config:priority-tags=true -- \
390 add-port br0 p4 tag=12 -- \
391 add-port br0 p5 vlan_mode=native-tagged tag=10 -- \
392 add-port br0 p6 vlan_mode=native-tagged tag=10 trunks=10,12 -- \
393 add-port br0 p7 vlan_mode=native-untagged tag=12 -- \
394 add-port br0 p8 vlan_mode=native-untagged tag=12 trunks=10,12 \
395 other-config:priority-tags=true -- \
396 set Interface p1 type=dummy -- \
397 set Interface p2 type=dummy -- \
398 set Interface p3 type=dummy -- \
399 set Interface p4 type=dummy -- \
400 set Interface p5 type=dummy -- \
401 set Interface p6 type=dummy -- \
402 set Interface p7 type=dummy -- \
403 set Interface p8 type=dummy --])
405 dnl Each of these specifies an in_port by number, a VLAN VID (or "none"),
406 dnl a VLAN PCP (used if the VID isn't "none") and the expected set of datapath
412 "0 10 0 1,5,6,7,8,pop_vlan,2" \
413 "0 10 1 1,5,6,7,8,pop_vlan,2" \
416 "0 12 0 1,5,6,pop_vlan,3,4,7,8" \
417 "0 12 1 1,5,6,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
421 "1 10 0 0,5,6,7,8,pop_vlan,2" \
422 "1 10 1 0,5,6,7,8,pop_vlan,2" \
425 "1 12 0 0,5,6,pop_vlan,3,4,7,8" \
426 "1 12 1 0,5,6,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
427 "2 none 0 push_vlan(vid=10,pcp=0),0,1,5,6,7,8" \
428 "2 0 0 pop_vlan,push_vlan(vid=10,pcp=0),0,1,5,6,7,8" \
429 "2 0 1 pop_vlan,push_vlan(vid=10,pcp=1),0,1,5,6,7,8" \
436 "3 none 0 4,7,8,push_vlan(vid=12,pcp=0),0,1,5,6" \
437 "3 0 0 pop_vlan,4,7,8,push_vlan(vid=12,pcp=0),0,1,5,6" \
438 "3 0 1 8,pop_vlan,4,7,push_vlan(vid=12,pcp=1),0,1,5,6" \
445 "4 none 0 3,7,8,push_vlan(vid=12,pcp=0),0,1,5,6" \
446 "4 0 0 pop_vlan,3,7,8,push_vlan(vid=12,pcp=0),0,1,5,6" \
447 "4 0 1 3,8,pop_vlan,7,push_vlan(vid=12,pcp=1),0,1,5,6" \
454 "5 none 0 2,push_vlan(vid=10,pcp=0),0,1,6,7,8" \
455 "5 0 0 pop_vlan,2,push_vlan(vid=10,pcp=0),0,1,6,7,8" \
456 "5 0 1 pop_vlan,2,push_vlan(vid=10,pcp=1),0,1,6,7,8" \
457 "5 10 0 0,1,6,7,8,pop_vlan,2" \
458 "5 10 1 0,1,6,7,8,pop_vlan,2" \
461 "5 12 0 0,1,6,pop_vlan,3,4,7,8" \
462 "5 12 1 0,1,6,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
463 "6 none 0 2,push_vlan(vid=10,pcp=0),0,1,5,7,8" \
464 "6 0 0 pop_vlan,2,push_vlan(vid=10,pcp=0),0,1,5,7,8" \
465 "6 0 1 pop_vlan,2,push_vlan(vid=10,pcp=1),0,1,5,7,8" \
466 "6 10 0 0,1,5,7,8,pop_vlan,2" \
467 "6 10 1 0,1,5,7,8,pop_vlan,2" \
470 "6 12 0 0,1,5,pop_vlan,3,4,7,8" \
471 "6 12 1 0,1,5,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
472 "7 none 0 3,4,8,push_vlan(vid=12,pcp=0),0,1,5,6" \
473 "7 0 0 pop_vlan,3,4,8,push_vlan(vid=12,pcp=0),0,1,5,6" \
474 "7 0 1 3,8,pop_vlan,4,push_vlan(vid=12,pcp=1),0,1,5,6" \
475 "7 10 0 0,1,5,6,8,pop_vlan,2" \
476 "7 10 1 0,1,5,6,8,pop_vlan,2" \
479 "7 12 0 0,1,5,6,pop_vlan,3,4,8" \
480 "7 12 1 0,1,5,6,pop_vlan,4,push_vlan(vid=0,pcp=1),3,8" \
481 "8 none 0 3,4,7,push_vlan(vid=12,pcp=0),0,1,5,6" \
482 "8 0 0 pop_vlan,3,4,7,push_vlan(vid=12,pcp=0),0,1,5,6" \
483 "8 0 1 3,pop_vlan,4,7,push_vlan(vid=12,pcp=1),0,1,5,6" \
484 "8 10 0 0,1,5,6,7,pop_vlan,2" \
485 "8 10 1 0,1,5,6,7,pop_vlan,2" \
488 "8 12 0 0,1,5,6,pop_vlan,3,4,7" \
489 "8 12 1 0,1,5,6,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3"
497 if test $vlan = none; then
498 flow="in_port($in_port),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff),eth_type(0xabcd)"
500 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))"
503 echo "----------------------------------------------------------------------"
504 echo "in_port=$in_port vlan=$vlan pcp=$pcp"
506 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
507 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
509 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
511 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
517 AT_SETUP([ofproto-dpif - fragment handling])
519 AT_DATA([flows.txt], [dnl
520 priority=75 tcp ip_frag=no tp_dst=80 actions=output:1
521 priority=75 tcp ip_frag=first tp_dst=80 actions=output:2
522 priority=75 tcp ip_frag=later tp_dst=80 actions=output:3
523 priority=50 tcp ip_frag=no actions=output:4
524 priority=50 tcp ip_frag=first actions=output:5
525 priority=50 tcp ip_frag=later actions=output:6
527 AT_CHECK([ovs-ofctl replace-flows br0 flows.txt])
529 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"
530 no_flow="$base_flow,frag=no),tcp(src=12345,dst=80)"
531 first_flow="$base_flow,frag=first),tcp(src=12345,dst=80)"
532 later_flow="$base_flow,frag=later)"
534 # mode no first later
546 AT_CHECK([ovs-ofctl set-frags br0 $mode])
547 for type in no first later; do
548 eval flow=\$${type}_flow exp_output=\$$type
549 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
550 AT_CHECK_UNQUOTED([tail -1 stdout], [0], [Datapath actions: $exp_output
557 AT_SETUP([ofproto-dpif - exit])
559 AT_DATA([flows.txt], [dnl
560 in_port=1 actions=output:10,exit,output:11
561 in_port=2 actions=output:12,resubmit:1,output:12
562 in_port=3 actions=output:13,resubmit:2,output:14
564 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
565 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])
566 AT_CHECK([tail -1 stdout], [0],
567 [Datapath actions: 10
569 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])
570 AT_CHECK([tail -1 stdout], [0],
571 [Datapath actions: 12,10
573 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])
574 AT_CHECK([tail -1 stdout], [0],
575 [Datapath actions: 13,12,10
581 AT_SETUP([ofproto-dpif - mirroring, select_all])
583 [add-port br0 p1 -- set Interface p1 type=dummy --\
584 add-port br0 p2 -- set Interface p2 type=dummy --\
585 add-port br0 p3 -- set Interface p3 type=dummy --\
586 set Bridge br0 mirrors=@m --\
587 --id=@p3 get Port p3 --\
588 --id=@m create Mirror name=mymirror \
589 select_all=true output_port=@p3], [<0>
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-port br0 p1 -- set Interface p1 type=dummy --\
617 add-port br0 p2 -- set Interface p2 type=dummy --\
618 add-port br0 p3 -- set Interface p3 type=dummy --\
619 set Bridge br0 mirrors=@m --\
620 --id=@p1 get Port p1 -- --id=@p3 get Port p3 --\
621 --id=@m create Mirror name=mymirror \
622 select_src_port=@p1 output_port=@p3], [<0>
625 AT_DATA([flows.txt], [dnl
626 in_port=1 actions=output:2
627 in_port=2 actions=output:1
629 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
631 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)"
632 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
633 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
634 [Datapath actions: 2,3
637 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)"
638 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
639 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
645 AT_SETUP([ofproto-dpif - mirroring, OFPP_NONE ingress port])
647 [add-port br0 p1 -- set Interface p1 type=dummy --\
648 add-port br0 p2 -- set Interface p2 type=dummy --\
649 set Bridge br0 mirrors=@m --\
650 --id=@p2 get Port p2 --\
651 --id=@m create Mirror name=mymirror \
652 select_all=true output_port=@p2], [<0>
655 AT_CHECK([ovs-ofctl add-flow br0 action=output:1])
657 # "in_port" defaults to OFPP_NONE if it's not specified.
658 flow="eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)"
659 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
660 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
661 [Datapath actions: 1,2
668 AT_SETUP([ofproto-dpif - mirroring, select_dst])
670 [add-port br0 p1 -- set Interface p1 type=dummy --\
671 add-port br0 p2 -- set Interface p2 type=dummy --\
672 add-port br0 p3 -- set Interface p3 type=dummy --\
673 set Bridge br0 mirrors=@m --\
674 --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
675 --id=@m create Mirror name=mymirror \
676 select_dst_port=@p2 output_port=@p3], [<0>
679 AT_DATA([flows.txt], [dnl
680 in_port=1 actions=output:2
681 in_port=2 actions=output:1
683 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
685 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)"
686 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
687 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
688 [Datapath actions: 2,3
691 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)"
692 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
693 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
701 AT_SETUP([ofproto-dpif - mirroring, select_vlan])
703 [add-port br0 p1 -- set Interface p1 type=dummy --\
704 add-port br0 p2 -- set Interface p2 type=dummy --\
705 add-port br0 p3 -- set Interface p3 type=dummy --\
706 set Bridge br0 mirrors=@m --\
707 --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
708 --id=@m create Mirror name=mymirror \
709 select_all=true select_vlan=11 output_port=@p3], [<0>
712 AT_DATA([flows.txt], [dnl
713 in_port=1, actions=output:2
715 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
717 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)"
718 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
719 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
723 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))"
724 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
725 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
729 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))"
730 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
731 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
732 [Datapath actions: 2,3
739 AT_SETUP([ofproto-dpif - mirroring, output_port])
741 [add-port br0 p1 -- set Interface p1 type=dummy --\
742 add-port br0 p2 -- set Interface p2 type=dummy --\
743 add-port br0 p3 -- set Interface p3 type=dummy --\
744 set Bridge br0 mirrors=@m --\
745 --id=@p3 get Port p3 --\
746 --id=@m create Mirror name=mymirror \
747 select_all=true output_port=@p3], [<0>
750 AT_DATA([flows.txt], [dnl
751 in_port=1 actions=mod_vlan_vid:17,output:2
752 in_port=2 actions=output:1
754 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
756 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)"
757 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
758 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
759 [Datapath actions: push_vlan(vid=17,pcp=0),2,pop_vlan,3
762 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)"
763 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
764 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
765 [Datapath actions: 1,3
771 AT_SETUP([ofproto-dpif - mirroring, output_vlan])
773 [add-port br0 p1 -- set Interface p1 type=dummy --\
774 add-port br0 p2 -- set Interface p2 type=dummy --\
775 set Bridge br0 mirrors=@m --\
776 --id=@m create Mirror name=mymirror \
777 select_all=true output_vlan=12], [<0>
780 AT_DATA([flows.txt], [dnl
781 in_port=1 actions=output:2
782 in_port=2 actions=mod_vlan_vid:17,output:1
784 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
786 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)"
787 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
788 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
790 expected="2,push_vlan(vid=12,pcp=0),0,1,2"
791 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
793 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
795 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)"
796 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
797 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
799 expected="push_vlan(vid=17,pcp=0),1,pop_vlan,push_vlan(vid=12,pcp=0),0,1,2"
800 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
802 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
807 m4_define([OFPROTO_TRACE],
809 AT_CHECK([ovs-appctl ofproto/trace $1 "$flow" $3], [0], [stdout])
810 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
812 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" $5],
815 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" $5],
818 AT_SETUP([ofproto-dpif - MAC learning])
820 [set bridge br0 fail-mode=standalone -- \
821 add-port br0 p1 -- set Interface p1 type=dummy -- \
822 add-port br0 p2 -- set Interface p2 type=dummy -- \
823 add-port br0 p3 -- set Interface p3 type=dummy])
825 arp='eth_type(0x0806),arp(sip=192.168.0.1,tip=192.168.0.2,op=1,sha=50:54:00:00:00:05,tha=00:00:00:00:00:00)'
827 # Trace an ARP packet arriving on p3, to create a MAC learning entry.
830 [in_port(3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
834 # Check for the MAC learning entry.
835 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
837 3 0 50:54:00:00:00:05 ?
840 # Trace a packet arrival destined for the learned MAC.
841 # (This will also learn a MAC.)
844 [in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05),$arp],
848 # Check for both MAC learning entries.
849 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
851 3 0 50:54:00:00:00:05 ?
852 1 0 50:54:00:00:00:06 ?
855 # Trace a packet arrival that updates the first learned MAC entry.
858 [in_port(2),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
862 # Check that the MAC learning entry was updated.
863 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
865 1 0 50:54:00:00:00:06 ?
866 2 0 50:54:00:00:00:05 ?
869 # Add another bridge.
873 -- set bridge br1 datapath-type=dummy \
874 -- add-port br1 p4 -- set interface p4 type=dummy \
875 -- add-port br1 p5 -- set interface p5 type=dummy])
877 # Trace some packet arrivals in br1 to create MAC learning entries there too.
880 [in_port(4),eth(src=50:54:00:00:00:06,dst=ff:ff:ff:ff:ff:ff),$arp],
885 [in_port(5),eth(src=50:54:00:00:00:07,dst=ff:ff:ff:ff:ff:ff),$arp],
889 # Check that the MAC learning entries were added.
890 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]$/?/'], [0], [dnl
892 4 0 50:54:00:00:00:06 ?
893 5 0 50:54:00:00:00:07 ?
896 # Delete port p1 and see that its MAC learning entry disappeared, and
897 # that the MAC learning entry for the same MAC was also deleted from br1.
898 AT_CHECK([ovs-vsctl del-port p1])
899 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
901 2 0 50:54:00:00:00:05 ?
903 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]$/?/'], [0], [dnl
905 5 0 50:54:00:00:00:07 ?
911 dnl Test that basic NetFlow reports flow statistics correctly:
912 dnl - The initial packet of a flow are correctly accounted.
913 dnl - Later packets within a flow are correctly accounted.
914 dnl - Flow actions changing (in this case, due to MAC learning)
915 dnl cause a record to be sent.
916 AT_SETUP([ofproto-dpif - NetFlow flow expiration])
918 AT_SKIP_IF([test "x$RANDOM" = x])
919 NETFLOW_PORT=`expr 32767 + \( $RANDOM % 32767 \)`
922 [set Bridge br0 fail-mode=standalone -- \
923 add-port br0 p1 -- set Interface p1 type=dummy -- \
924 add-port br0 p2 -- set Interface p2 type=dummy -- \
925 set Bridge br0 netflow=@nf -- \
926 --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
927 engine_id=1 engine_type=2 active_timeout=30 \
928 add-id-to-interface=false], [<0>
931 AT_CHECK([test-netflow --detach --pidfile $NETFLOW_PORT:127.0.0.1 > netflow.log])AT_CAPTURE_FILE([netflow.log])
933 for delay in 1000 30000; do
934 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)'
935 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)'
937 ovs-appctl time/warp $delay
941 ovs-appctl -t test-netflow exit
943 AT_CHECK([[sed -e 's/, uptime [0-9]*//
945 s/time \([0-9]*\)\.\.\.\1\b/time <moment>/
946 s/time [0-9]*\.\.\.[0-9]*/time <range>/
947 ' netflow.log]], [0],
948 [header: v5, seq 0, engine 2,1
949 rec: 192.168.0.1 > 192.168.0.2, if 1 > 65535, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
951 header: v5, seq 1, engine 2,1
952 rec: 192.168.0.2 > 192.168.0.1, if 2 > 1, 2 pkts, 120 bytes, ICMP 0:0, time <range>
953 rec: 192.168.0.1 > 192.168.0.2, if 1 > 2, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
957 dnl Test that basic NetFlow reports active expirations correctly.
958 AT_SETUP([ofproto-dpif - NetFlow active expiration])
960 AT_SKIP_IF([test "x$RANDOM" = x])
961 NETFLOW_PORT=`expr 32767 + \( $RANDOM % 32767 \)`
964 [set Bridge br0 fail-mode=standalone -- \
965 add-port br0 p1 -- set Interface p1 type=dummy -- \
966 add-port br0 p2 -- set Interface p2 type=dummy -- \
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=10 \
970 add-id-to-interface=false], [<0>
973 AT_CHECK([test-netflow --detach --pidfile $NETFLOW_PORT:127.0.0.1 > netflow.log])AT_CAPTURE_FILE([netflow.log])
976 while test $n -le 60; do
979 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)'
980 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)'
982 ovs-appctl time/warp 1000
985 ovs-appctl time/warp 10000
988 ovs-appctl -t test-netflow exit
990 # Count the number of reported packets:
991 # - From source to destination before MAC learning kicks in (just one).
992 # - From source to destination after that.
993 # - From destination to source.
1001 pkts=`echo "$line" | sed 's/.*, \([[0-9]]*\) pkts,.*/\1/'`
1008 "rec: 192.168.0.1 > 192.168.0.2, if 1 > 65535, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
1011 "rec: 192.168.0.1 > 192.168.0.2, if 1 > 2, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
1014 "rec: 192.168.0.2 > 192.168.0.1, if 2 > 1, "*" pkts, "*" bytes, TCP 80 > 1234, time "*)
1021 eval $counter=\`expr \$$counter + \$pkts\`
1022 n_recs=`expr $n_recs + 1`
1025 # There should be exactly 1 MAC learning packet,
1026 # exactly 59 other packets in that direction,
1027 # and exactly 60 packets in the other direction.
1028 AT_CHECK([echo $n_learn $n_in $n_out $n_other], [0], [1 59 60 0
1031 # There should be 1 expiration for MAC learning,
1032 # at least 5 active and a final expiration in one direction,
1033 # and at least 5 active and a final expiration in the other direction.
1035 AT_CHECK([test $n_recs -ge 13])