tunnel: Clear IPSEC_MARK on input rather than output.
[sliver-openvswitch.git] / tests / ofproto-dpif.at
1 AT_BANNER([ofproto-dpif])
2
3 AT_SETUP([ofproto-dpif - resubmit])
4 OVS_VSWITCHD_START
5 ADD_OF_PORTS([br0], [1], [10], [11], [12], [13], [14], [15],
6                     [16], [17], [18], [19], [20], [21])
7 AT_DATA([flows.txt], [dnl
8 table=0 in_port=1 priority=1000 icmp actions=output(10),resubmit(2),output(19),resubmit(3),output(21)
9 table=0 in_port=2 priority=1500 icmp actions=output(11),resubmit(,1),output(16),resubmit(2,1),output(18)
10 table=0 in_port=3 priority=2000 icmp actions=output(20)
11 table=1 in_port=1 priority=1000 icmp actions=output(12),resubmit(4,1),output(13),resubmit(3),output(15)
12 table=1 in_port=2 priority=1500 icmp actions=output(17),resubmit(,2)
13 table=1 in_port=3 priority=1500 icmp actions=output(14),resubmit(,2)
14 ])
15 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
16 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
17 AT_CHECK([tail -1 stdout], [0],
18   [Datapath actions: 10,11,12,13,14,15,16,17,18,19,20,21
19 ])
20 OVS_VSWITCHD_STOP
21 AT_CLEANUP
22
23 AT_SETUP([ofproto-dpif - goto table])
24 OVS_VSWITCHD_START
25 ADD_OF_PORTS([br0], [1], [10], [11])
26 echo "table=0 in_port=1 actions=output(10),goto_table(1)" > flows.txt
27 for i in `seq 1 63`; do echo "table=$i actions=goto_table($(($i+1)))"; done >> flows.txt
28 echo "table=64 actions=output(11)" >> flows.txt
29 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flows br0 flows.txt])
30 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])
31 AT_CHECK([tail -1 stdout], [0],
32   [Datapath actions: 10,11
33 ])
34 OVS_VSWITCHD_STOP
35 AT_CLEANUP
36
37 AT_SETUP([ofproto-dpif - registers])
38 OVS_VSWITCHD_START
39 ADD_OF_PORTS([br0], [20], [21], [22], [33], [90])
40 AT_DATA([flows.txt], [dnl
41 in_port=90                 actions=resubmit:2,resubmit:3,resubmit:4,resubmit:91
42 in_port=91                 actions=resubmit:5,resubmit:6,resubmit:7,resubmit:92
43 in_port=92                 actions=resubmit:8,resubmit:9,resubmit:10,resubmit:11,resubmit:93
44 in_port=93                 actions=resubmit:12,resubmit:13,resubmit:14,resubmit:15
45
46 in_port=2                  actions=load:0x000db000->NXM_NX_REG0[[]]
47 in_port=3                  actions=load:0xdea->NXM_NX_REG0[[20..31]]
48 in_port=4                  actions=load:0xeef->NXM_NX_REG0[[0..11]]
49 in_port=5                  actions=move:NXM_NX_REG0[[]]->NXM_NX_REG1[[]]
50 in_port=6                  actions=load:0x22222222->NXM_NX_REG2[[]]
51 in_port=7                  actions=move:NXM_NX_REG1[[20..31]]->NXM_NX_REG2[[0..11]]
52 in_port=8                  actions=move:NXM_NX_REG1[[0..11]]->NXM_NX_REG2[[20..31]]
53 in_port=9,reg0=0xdeadbeef  actions=output:20
54 in_port=10,reg1=0xdeadbeef actions=output:21
55 in_port=11,reg2=0xeef22dea actions=output:22
56
57 dnl Sanilty check all registers
58 in_port=12 actions=load:0x10->NXM_NX_REG0[[]],load:0x11->NXM_NX_REG1[[]],load:0x12->NXM_NX_REG2[[]]
59 in_port=13 actions=load:0x13->NXM_NX_REG3[[]],load:0x14->NXM_NX_REG4[[]],load:0x15->NXM_NX_REG5[[]]
60 in_port=14 actions=load:0x16->NXM_NX_REG6[[]],load:0x17->NXM_NX_REG7[[]]
61 in_port=15,reg0=0x10,reg1=0x11,reg2=0x12,reg3=0x13,reg4=0x14,reg5=0x15,reg6=0x16,reg7=0x17 actions=output:33
62
63 ])
64 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
65 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy '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])
66 AT_CHECK([tail -1 stdout], [0],
67   [Datapath actions: 20,21,22,33
68 ])
69 OVS_VSWITCHD_STOP
70 AT_CLEANUP
71
72 AT_SETUP([ofproto-dpif - push-pop])
73 OVS_VSWITCHD_START
74 ADD_OF_PORTS([br0], [20], [21], [22], [33], [90])
75 AT_DATA([flows.txt], [dnl
76 in_port=90           actions=load:20->NXM_NX_REG0[[0..7]],load:21->NXM_NX_REG1[[0..7]],load:22->NXM_NX_REG2[[0..7]], load:33->NXM_NX_REG3[[0..7]], push:NXM_NX_REG0[[]], push:NXM_NX_REG1[[0..7]],push:NXM_NX_REG2[[0..15]], push:NXM_NX_REG3[[]], resubmit:2, resubmit:3, resubmit:4, resubmit:5
77 in_port=2            actions=pop:NXM_NX_REG0[[0..7]],output:NXM_NX_REG0[[]]
78 in_port=3            actions=pop:NXM_NX_REG1[[0..7]],output:NXM_NX_REG1[[]]
79 in_port=4            actions=pop:NXM_NX_REG2[[0..15]],output:NXM_NX_REG2[[]]
80 in_port=5            actions=pop:NXM_NX_REG3[[]],output:NXM_NX_REG3[[]]
81
82 ])
83 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
84 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy '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])
85 AT_CHECK([tail -1 stdout], [0],
86   [Datapath actions: 33,22,21,20
87 ])
88 OVS_VSWITCHD_STOP
89 AT_CLEANUP
90
91 AT_SETUP([ofproto-dpif - output])
92 OVS_VSWITCHD_START
93 ADD_OF_PORTS([br0], [1], [9], [10], [11], [55], [66], [77], [88])
94 AT_DATA([flows.txt], [dnl
95 in_port=1 actions=resubmit:2,resubmit:3,resubmit:4,resubmit:5,resubmit:6,resubmit:7,resubmit:8
96 in_port=2 actions=output:9
97 in_port=3 actions=load:55->NXM_NX_REG0[[]],output:NXM_NX_REG0[[]],load:66->NXM_NX_REG1[[]]
98 in_port=4 actions=output:10,output:NXM_NX_REG0[[]],output:NXM_NX_REG1[[]],output:11
99 in_port=5 actions=load:77->NXM_NX_REG0[[0..15]],load:88->NXM_NX_REG0[[16..31]]
100 in_port=6 actions=output:NXM_NX_REG0[[0..15]],output:NXM_NX_REG0[[16..31]]
101 in_port=7 actions=load:0x110000ff->NXM_NX_REG0[[]],output:NXM_NX_REG0[[]]
102 in_port=8 actions=1,9,load:9->NXM_OF_IN_PORT[[]],1,9
103 ])
104 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
105 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy '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])
106 AT_CHECK([tail -1 stdout], [0],
107   [Datapath actions: 9,55,10,55,66,11,77,88,9,1
108 ])
109 OVS_VSWITCHD_STOP
110 AT_CLEANUP
111
112 AT_SETUP([ofproto-dpif - dec_ttl])
113 OVS_VSWITCHD_START
114 ADD_OF_PORTS([br0], [1], [2], [3], [4])
115 AT_DATA([flows.txt], [dnl
116 table=0 in_port=1 action=dec_ttl,output:2,resubmit(1,1),output:4
117 table=1 in_port=1 action=dec_ttl,output:3
118 ])
119 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
120 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy '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])
121 AT_CHECK([tail -3 stdout], [0],
122   [Datapath actions: set(ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=1,frag=no)),2,4
123 This flow is handled by the userspace slow path because it:
124         - Sends "packet-in" messages to the OpenFlow controller.
125 ])
126 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy '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])
127 AT_CHECK([tail -1 stdout], [0],
128   [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
129 ])
130 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy '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])
131 AT_CHECK([tail -1 stdout], [0],
132   [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
133 ])
134
135 AT_CAPTURE_FILE([ofctl_monitor.log])
136 AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl --detach --no-chdir --pidfile 2> ofctl_monitor.log])
137 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy '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])
138 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
139 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
140 NXT_PACKET_IN (xid=0x0): table_id=1 total_len=42 in_port=1 (via invalid_ttl) data_len=42 (unbuffered)
141 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
142 ])
143 OVS_VSWITCHD_STOP
144 AT_CLEANUP
145
146
147 AT_SETUP([ofproto-dpif - output, OFPP_NONE ingress port])
148 OVS_VSWITCHD_START
149 ADD_OF_PORTS([br0], [1], [2])
150
151 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
152
153 # "in_port" defaults to OFPP_NONE if it's not specified.
154 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"
155 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
156 AT_CHECK([tail -1 stdout | sed 's/Datapath actions: //' | tr "," "\n" | sort -n], [0], [dnl
157 1
158 2
159 100
160 ])
161
162 OVS_VSWITCHD_STOP
163 AT_CLEANUP
164
165 AT_SETUP([ofproto-dpif - DSCP])
166 OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=dummy])
167 ADD_OF_PORTS([br0], [9])
168 AT_DATA([flows.txt], [dnl
169 actions=output:LOCAL,enqueue:1:1,enqueue:1:2,enqueue:1:2,enqueue:1:1,output:1,mod_nw_tos:0,output:1,output:LOCAL
170 ])
171 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
172 AT_CHECK([ovs-vsctl -- \
173         set Port p1 qos=@newqos --\
174         --id=@newqos create QoS type=linux-htb queues=1=@q1,2=@q2 --\
175         --id=@q1 create Queue dscp=1 --\
176         --id=@q2 create Queue dscp=2], [0], [ignore])
177 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy '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])
178 AT_CHECK([tail -1 stdout], [0],
179   [Datapath actions: dnl
180 100,dnl
181 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
182 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
183 1,dnl
184 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
185 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
186 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0x3,ttl=128,frag=no)),1,dnl
187 100
188 ])
189 OVS_VSWITCHD_STOP
190 AT_CLEANUP
191
192 AT_SETUP([ofproto-dpif - output/flood flags])
193 OVS_VSWITCHD_START
194 ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6], [7])
195
196 AT_DATA([flows.txt], [dnl
197 in_port=local actions=local,flood
198 in_port=1 actions=flood
199 in_port=2 actions=all
200 in_port=3 actions=output:LOCAL,output:1,output:2,output:3,output:4,output:5,output:6,output:7
201 in_port=4 actions=enqueue:LOCAL:1,enqueue:1:1,enqueue:2:1,enqueue:3:2,enqueue:4:1,enqueue:5:1,enqueue:6:1,enqueue:7:1
202 ])
203 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
204 AT_CHECK([ovs-ofctl mod-port br0 5 noforward])
205 AT_CHECK([ovs-ofctl mod-port br0 6 noflood])
206
207 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(100),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
208 AT_CHECK([tail -1 stdout \
209 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
210 1
211 2
212 3
213 4
214 7
215 ])
216
217 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(1),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
218 AT_CHECK([tail -1 stdout \
219 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
220 100
221 2
222 3
223 4
224 7
225 ])
226
227 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(2),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
228 AT_CHECK([tail -1 stdout \
229 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
230 1
231 100
232 3
233 4
234 6
235 7
236 ])
237
238 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(3),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
239 AT_CHECK([tail -1 stdout], [0],
240   [Datapath actions: 100,1,2,4,6,7
241 ])
242
243 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(4),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
244 AT_CHECK([tail -1 stdout], [0],
245   [Datapath actions: set(skb_priority(0x1)),100,1,2,set(skb_priority(0x2)),3,set(skb_priority(0x1)),6,7
246 ])
247 OVS_VSWITCHD_STOP
248 AT_CLEANUP
249
250 AT_SETUP([ofproto-dpif - controller])
251 OVS_VSWITCHD_START([dnl
252    add-port br0 p1 -- set Interface p1 type=dummy
253 ])
254 ON_EXIT([kill `cat ovs-ofctl.pid`])
255
256 AT_CAPTURE_FILE([ofctl_monitor.log])
257 AT_DATA([flows.txt], [dnl
258 cookie=0x0 dl_src=10:11:11:11:11:11 actions=controller
259 cookie=0x1 dl_src=20:22:22:22:22:22 actions=controller,resubmit(80,1)
260 cookie=0x2 dl_src=30:33:33:33:33:33 actions=mod_vlan_vid:15,controller
261
262 cookie=0x3 table=1 in_port=80 actions=load:1->NXM_NX_REG0[[]],mod_vlan_vid:80,controller,resubmit(81,2)
263 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)
264 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)
265 cookie=0x6 table=4 in_port=83 actions=load:4->NXM_NX_REG3[[]],mod_nw_src:83.83.83.83,controller,resubmit(84,5)
266 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)
267 cookie=0x8 table=6 in_port=85 actions=mod_tp_src:85,controller,resubmit(86,7)
268 cookie=0x9 table=7 in_port=86 actions=mod_tp_dst:86,controller,controller
269 cookie=0xa dl_src=40:44:44:44:44:41 actions=push_vlan:0x8100,mod_vlan_vid:99,mod_vlan_pcp:1,controller
270 cookie=0xa dl_src=40:44:44:44:44:42 actions=push_mpls:0x8847,load:10->OXM_OF_MPLS_LABEL[[]],load:3->OXM_OF_MPLS_TC[[]],controller
271 cookie=0xa dl_src=40:44:44:44:44:43 actions=push_mpls:0x8847,load:10->OXM_OF_MPLS_LABEL[[]],load:3->OXM_OF_MPLS_TC[[]],controller
272 cookie=0xa dl_src=40:44:44:44:44:44 actions=push_mpls:0x8847,load:10->OXM_OF_MPLS_LABEL[[]],load:3->OXM_OF_MPLS_TC[[]],controller
273 cookie=0xa dl_src=40:44:44:44:44:45 actions=push_mpls:0x8847,load:10->OXM_OF_MPLS_LABEL[[]],load:3->OXM_OF_MPLS_TC[[]],dec_mpls_ttl,controller
274 cookie=0xa dl_src=40:44:44:44:44:46 actions=push_mpls:0x8847,load:10->OXM_OF_MPLS_LABEL[[]],load:3->OXM_OF_MPLS_TC[[]],set_mpls_ttl(10),controller
275 cookie=0xa dl_src=40:44:44:44:44:47 actions=push_mpls:0x8847,load:10->OXM_OF_MPLS_LABEL[[]],load:3->OXM_OF_MPLS_TC[[]],dec_mpls_ttl,set_mpls_ttl(10),controller
276 cookie=0xa dl_src=40:44:44:44:44:48 actions=push_mpls:0x8847,load:10->OXM_OF_MPLS_LABEL[[]],load:3->OXM_OF_MPLS_TC[[]],set_mpls_ttl(10),dec_mpls_ttl,controller
277 cookie=0xb dl_src=50:55:55:55:55:55 dl_type=0x8847 actions=load:1000->OXM_OF_MPLS_LABEL[[]],controller
278 cookie=0xd dl_src=60:66:66:66:66:66 actions=pop_mpls:0x0800,controller
279 cookie=0xc dl_src=70:77:77:77:77:77 actions=push_mpls:0x8848,load:1000->OXM_OF_MPLS_LABEL[[]],load:7->OXM_OF_MPLS_TC[[]],controller
280 ])
281 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
282
283 dnl Flow miss.
284 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
285
286 for i in 1 2 3 ; do
287     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)'
288 done
289 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
290 ovs-appctl -t ovs-ofctl exit
291
292 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
293 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
294 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
295 dnl
296 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
297 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
298 dnl
299 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
300 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
301 ])
302
303 dnl Singleton controller action.
304 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
305
306 for i in 1 2 3 ; do
307     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)'
308 done
309 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
310 ovs-appctl -t ovs-ofctl exit
311
312 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
313 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
314 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
315 dnl
316 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
317 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
318 dnl
319 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
320 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
321 ])
322
323 dnl Modified controller action.
324 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
325
326 for i in 1 2 3 ; do
327     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)'
328 done
329 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
330 ovs-appctl -t ovs-ofctl exit
331
332 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
333 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
334 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
335 dnl
336 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
337 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
338 dnl
339 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
340 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
341 ])
342
343 dnl Modified VLAN controller action.
344 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
345
346 for i in 1 2 3; do
347     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:44:41,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)'
348 done
349 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
350 ovs-appctl -t ovs-ofctl exit
351
352 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
353 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
354 tcp,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:44:41,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 tcp_csum:0
355 dnl
356 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
357 tcp,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:44:41,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 tcp_csum:0
358 dnl
359 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
360 tcp,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:44:41,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 tcp_csum:0
361 ])
362
363 dnl Modified MPLS controller action.
364 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
365
366 for i in 1 2 3; do
367     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:44:42,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)'
368 done
369 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
370 ovs-appctl -t ovs-ofctl exit
371
372 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
373 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
374 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:42,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=64,mpls_bos=1
375 dnl
376 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
377 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:42,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=64,mpls_bos=1
378 dnl
379 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
380 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:42,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=64,mpls_bos=1
381 ])
382
383 dnl Modified MPLS controller action.
384 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
385
386 dnl in_port(1),eth(src=00:01:02:03:04:05,dst=10:11:12:13:14:15),eth_type(0x8847),mpls(label=100,tc=3,ttl=64,bos=1)
387
388 for i in 1 2 3; do
389     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:44:43,dst=50:54:00:00:00:07),eth_type(0x8847),mpls(label=11,tc=3,ttl=64,bos=1)'
390 done
391
392 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
393 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
394 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
395 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:43,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=64,mpls_bos=0
396 dnl
397 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
398 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:43,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=64,mpls_bos=0
399 dnl
400 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
401 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:43,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=64,mpls_bos=0
402 ])
403
404 dnl Modified MPLS controller action.
405 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
406
407 for i in 1 2 3; do
408     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:44:44,dst=50:54:00:00:00:07),eth_type(0x8100),vlan(vid=99,pcp=7),encap(eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no))'
409 done
410 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
411 ovs-appctl -t ovs-ofctl exit
412
413 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
414 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
415 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=7,dl_src=40:44:44:44:44:44,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=64,mpls_bos=1
416 dnl
417 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
418 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=7,dl_src=40:44:44:44:44:44,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=64,mpls_bos=1
419 dnl
420 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
421 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=7,dl_src=40:44:44:44:44:44,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=64,mpls_bos=1
422 ])
423
424 dnl Modified MPLS controller action.
425 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
426
427 for i in 1 2 3; do
428     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:44:45,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)'
429 done
430 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
431 ovs-appctl -t ovs-ofctl exit
432
433 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
434 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
435 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:45,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=63,mpls_bos=1
436 dnl
437 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
438 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:45,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=63,mpls_bos=1
439 dnl
440 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
441 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:45,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=63,mpls_bos=1
442 ])
443
444 dnl Modified MPLS controller action.
445 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
446
447 for i in 1 2 3; do
448     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:44:46,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)'
449 done
450 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
451 ovs-appctl -t ovs-ofctl exit
452
453 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
454 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
455 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:46,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=10,mpls_bos=1
456 dnl
457 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
458 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:46,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=10,mpls_bos=1
459 dnl
460 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
461 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:46,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=10,mpls_bos=1
462 ])
463
464 dnl Modified MPLS controller action.
465 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
466
467 for i in 1 2 3; do
468     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:44:47,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)'
469 done
470 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
471 ovs-appctl -t ovs-ofctl exit
472
473 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
474 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
475 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:47,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=10,mpls_bos=1
476 dnl
477 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
478 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:47,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=10,mpls_bos=1
479 dnl
480 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
481 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:47,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=10,mpls_bos=1
482 ])
483
484 dnl Modified MPLS controller action.
485 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
486
487 for i in 1 2 3; do
488     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:44:48,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)'
489 done
490 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
491 ovs-appctl -t ovs-ofctl exit
492
493 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
494 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
495 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:48,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=9,mpls_bos=1
496 dnl
497 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
498 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:48,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=9,mpls_bos=1
499 dnl
500 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
501 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:48,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=9,mpls_bos=1
502 ])
503
504 dnl Modified MPLS actions.
505 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
506
507 for i in 1 2 3; do
508     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:55:55:55:55:55,dst=50:54:00:00:00:07),eth_type(0x8847),mpls(label=100,tc=7,ttl=64,bos=1)'
509 done
510 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
511 ovs-appctl -t ovs-ofctl exit
512
513 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
514 NXT_PACKET_IN (xid=0x0): cookie=0xb total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
515 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:55:55:55:55:55,dl_dst=50:54:00:00:00:07,mpls_label=1000,mpls_tc=7,mpls_ttl=64,mpls_bos=1
516 dnl
517 NXT_PACKET_IN (xid=0x0): cookie=0xb total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
518 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:55:55:55:55:55,dl_dst=50:54:00:00:00:07,mpls_label=1000,mpls_tc=7,mpls_ttl=64,mpls_bos=1
519 dnl
520 NXT_PACKET_IN (xid=0x0): cookie=0xb total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
521 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:55:55:55:55:55,dl_dst=50:54:00:00:00:07,mpls_label=1000,mpls_tc=7,mpls_ttl=64,mpls_bos=1
522 ])
523
524 dnl Modified MPLS ipv6 controller action.
525 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
526
527 for i in 1 2 3; do
528     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=70:77:77:77:77:77,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)'
529 done
530 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
531 ovs-appctl -t ovs-ofctl exit
532
533 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
534 NXT_PACKET_IN (xid=0x0): cookie=0xc total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
535 mplsm,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=70:77:77:77:77:77,dl_dst=50:54:00:00:00:07,mpls_label=1000,mpls_tc=7,mpls_ttl=64,mpls_bos=1
536 dnl
537 NXT_PACKET_IN (xid=0x0): cookie=0xc total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
538 mplsm,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=70:77:77:77:77:77,dl_dst=50:54:00:00:00:07,mpls_label=1000,mpls_tc=7,mpls_ttl=64,mpls_bos=1
539 dnl
540 NXT_PACKET_IN (xid=0x0): cookie=0xc total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
541 mplsm,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=70:77:77:77:77:77,dl_dst=50:54:00:00:00:07,mpls_label=1000,mpls_tc=7,mpls_ttl=64,mpls_bos=1
542 ])
543
544
545 dnl Modified MPLS pop action.
546 dnl The input is a frame with two MPLS headers which tcpdump -vve shows as:
547 dnl 60:66:66:66:66:66 > 50:54:00:00:00:07, ethertype MPLS multicast (0x8847), length 66: MPLS (label 20, exp 0, ttl 32)
548 dnl             (tos 0x0, ttl 64, id 0, offset 0, flags [none], proto TCP (6), length 44)
549
550 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
551
552 for i in 1 2 3; do
553     ovs-appctl netdev-dummy/receive p1 '50 54 00 00 00 07 60 66 66 66 66 66 88 47 00 01 41 20 45 00 00 2c 00 00 00 00 40 06 3b 78 c0 a8 00 01 c0 a8 00 02 00 50 00 00 00 00 00 2a 00 00 00 2a 50 00 27 10 77 44 00 00 48 4f 47 45'
554 done
555 #for i in 2 3; do
556 #    ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=60:66:66:66:66:66,dst=50:54:00:00:00:07),eth_type(0x8847),mpls(label=10,tc=3,ttl=100,bos=1)'
557 #done
558 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
559 ovs-appctl -t ovs-ofctl exit
560
561 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
562 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered)
563 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=60:66:66:66:66:66,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=80,tp_dst=0 tcp_csum:7744
564 dnl
565 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered)
566 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=60:66:66:66:66:66,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=80,tp_dst=0 tcp_csum:7744
567 dnl
568 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered)
569 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=60:66:66:66:66:66,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=80,tp_dst=0 tcp_csum:7744
570 ])
571
572 dnl Checksum TCP.
573 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --no-chdir --pidfile 2> ofctl_monitor.log])
574
575 for i in 1 ; do
576     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)'
577 done
578 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 18])
579 ovs-appctl -t ovs-ofctl exit
580
581 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
582 NXT_PACKET_IN (xid=0x0): cookie=0x1 total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
583 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
584 dnl
585 NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x3 total_len=64 in_port=1 reg0=0x1 (via action) data_len=64 (unbuffered)
586 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
587 dnl
588 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)
589 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
590 dnl
591 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)
592 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
593 dnl
594 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)
595 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
596 dnl
597 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)
598 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
599 dnl
600 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)
601 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
602 dnl
603 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)
604 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
605 dnl
606 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)
607 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
608 ])
609
610 dnl Checksum UDP.
611 AT_CHECK([ovs-ofctl monitor br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
612
613 for i in 1 ; do
614     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'
615 done
616 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 18])
617 ovs-appctl -t ovs-ofctl exit
618
619 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
620 NXT_PACKET_IN (xid=0x0): cookie=0x1 total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
621 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
622 dnl
623 NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x3 total_len=64 in_port=1 reg0=0x1 (via action) data_len=64 (unbuffered)
624 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
625 dnl
626 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)
627 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
628 dnl
629 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)
630 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
631 dnl
632 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)
633 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
634 dnl
635 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)
636 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
637 dnl
638 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)
639 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
640 dnl
641 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)
642 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
643 dnl
644 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)
645 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
646 ])
647
648 AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
649 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
650  cookie=0x1, n_packets=2, n_bytes=120, dl_src=20:22:22:22:22:22 actions=CONTROLLER:65535,resubmit(80,1)
651  cookie=0x2, n_packets=3, n_bytes=180, dl_src=30:33:33:33:33:33 actions=mod_vlan_vid:15,CONTROLLER:65535
652  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)
653  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)
654  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)
655  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)
656  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)
657  cookie=0x8, table=6, n_packets=2, n_bytes=120, in_port=85 actions=mod_tp_src:85,CONTROLLER:65535,resubmit(86,7)
658  cookie=0x9, table=7, n_packets=2, n_bytes=120, in_port=86 actions=mod_tp_dst:86,CONTROLLER:65535,CONTROLLER:65535
659  cookie=0xa, n_packets=3, n_bytes=180, dl_src=40:44:44:44:44:41 actions=mod_vlan_vid:99,mod_vlan_pcp:1,CONTROLLER:65535
660  cookie=0xa, n_packets=3, n_bytes=180, dl_src=40:44:44:44:44:42 actions=push_mpls:0x8847,load:0xa->OXM_OF_MPLS_LABEL[[]],load:0x3->OXM_OF_MPLS_TC[[]],CONTROLLER:65535
661  cookie=0xa, n_packets=3, n_bytes=180, dl_src=40:44:44:44:44:43 actions=push_mpls:0x8847,load:0xa->OXM_OF_MPLS_LABEL[[]],load:0x3->OXM_OF_MPLS_TC[[]],CONTROLLER:65535
662  cookie=0xa, n_packets=3, n_bytes=180, dl_src=40:44:44:44:44:44 actions=push_mpls:0x8847,load:0xa->OXM_OF_MPLS_LABEL[[]],load:0x3->OXM_OF_MPLS_TC[[]],CONTROLLER:65535
663  cookie=0xa, n_packets=3, n_bytes=180, dl_src=40:44:44:44:44:45 actions=push_mpls:0x8847,load:0xa->OXM_OF_MPLS_LABEL[[]],load:0x3->OXM_OF_MPLS_TC[[]],dec_mpls_ttl,CONTROLLER:65535
664  cookie=0xa, n_packets=3, n_bytes=180, dl_src=40:44:44:44:44:46 actions=push_mpls:0x8847,load:0xa->OXM_OF_MPLS_LABEL[[]],load:0x3->OXM_OF_MPLS_TC[[]],set_mpls_ttl(10),CONTROLLER:65535
665  cookie=0xa, n_packets=3, n_bytes=180, dl_src=40:44:44:44:44:47 actions=push_mpls:0x8847,load:0xa->OXM_OF_MPLS_LABEL[[]],load:0x3->OXM_OF_MPLS_TC[[]],dec_mpls_ttl,set_mpls_ttl(10),CONTROLLER:65535
666  cookie=0xa, n_packets=3, n_bytes=180, dl_src=40:44:44:44:44:48 actions=push_mpls:0x8847,load:0xa->OXM_OF_MPLS_LABEL[[]],load:0x3->OXM_OF_MPLS_TC[[]],set_mpls_ttl(10),dec_mpls_ttl,CONTROLLER:65535
667  cookie=0xb, n_packets=3, n_bytes=180, mpls,dl_src=50:55:55:55:55:55 actions=load:0x3e8->OXM_OF_MPLS_LABEL[[]],CONTROLLER:65535
668  cookie=0xc, n_packets=3, n_bytes=180, dl_src=70:77:77:77:77:77 actions=push_mpls:0x8848,load:0x3e8->OXM_OF_MPLS_LABEL[[]],load:0x7->OXM_OF_MPLS_TC[[]],CONTROLLER:65535
669  cookie=0xd, n_packets=3, n_bytes=186, dl_src=60:66:66:66:66:66 actions=pop_mpls:0x0800,CONTROLLER:65535
670  n_packets=3, n_bytes=180, dl_src=10:11:11:11:11:11 actions=CONTROLLER:65535
671 NXST_FLOW reply:
672 ])
673
674 OVS_VSWITCHD_STOP
675 AT_CLEANUP
676
677 AT_SETUP([ofproto-dpif - VLAN handling])
678 OVS_VSWITCHD_START(
679   [set Bridge br0 fail-mode=standalone -- \
680    add-port br0 p1                                  trunks=10,12 -- \
681    add-port br0 p2                           tag=10              -- \
682    add-port br0 p3                           tag=12              \
683                    other-config:priority-tags=true               -- \
684    add-port br0 p4                           tag=12              -- \
685    add-port br0 p5 vlan_mode=native-tagged   tag=10              -- \
686    add-port br0 p6 vlan_mode=native-tagged   tag=10 trunks=10,12 -- \
687    add-port br0 p7 vlan_mode=native-untagged tag=12              -- \
688    add-port br0 p8 vlan_mode=native-untagged tag=12 trunks=10,12 \
689                    other-config:priority-tags=true               -- \
690    set Interface p1 type=dummy -- \
691    set Interface p2 type=dummy -- \
692    set Interface p3 type=dummy -- \
693    set Interface p4 type=dummy -- \
694    set Interface p5 type=dummy -- \
695    set Interface p6 type=dummy -- \
696    set Interface p7 type=dummy -- \
697    set Interface p8 type=dummy --])
698
699 dnl Each of these specifies an in_port by number, a VLAN VID (or "none"),
700 dnl a VLAN PCP (used if the VID isn't "none") and the expected set of datapath
701 dnl actions.
702 for tuple in \
703         "100 none 0 drop" \
704         "100 0    0 drop" \
705         "100 0    1 drop" \
706         "100 10   0 1,5,6,7,8,pop_vlan,2" \
707         "100 10   1 1,5,6,7,8,pop_vlan,2" \
708         "100 11   0 5,7" \
709         "100 11   1 5,7" \
710         "100 12   0 1,5,6,pop_vlan,3,4,7,8" \
711         "100 12   1 1,5,6,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
712         "1  none 0 drop" \
713         "1  0    0 drop" \
714         "1  0    1 drop" \
715         "1  10   0 5,6,7,8,100,pop_vlan,2" \
716         "1  10   1 5,6,7,8,100,pop_vlan,2" \
717         "1  11   0 drop" \
718         "1  11   1 drop" \
719         "1  12   0 5,6,100,pop_vlan,3,4,7,8" \
720         "1  12   1 5,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
721         "2  none 0 push_vlan(vid=10,pcp=0),1,5,6,7,8,100" \
722         "2  0    0 pop_vlan,push_vlan(vid=10,pcp=0),1,5,6,7,8,100" \
723         "2  0    1 pop_vlan,push_vlan(vid=10,pcp=1),1,5,6,7,8,100" \
724         "2  10   0 drop" \
725         "2  10   1 drop" \
726         "2  11   0 drop" \
727         "2  11   1 drop" \
728         "2  12   0 drop" \
729         "2  12   1 drop" \
730         "3  none 0 4,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
731         "3  0    0 pop_vlan,4,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
732         "3  0    1 8,pop_vlan,4,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
733         "3  10   0 drop" \
734         "3  10   1 drop" \
735         "3  11   0 drop" \
736         "3  11   1 drop" \
737         "3  12   0 drop" \
738         "3  12   1 drop" \
739         "4  none 0 3,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
740         "4  0    0 pop_vlan,3,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
741         "4  0    1 3,8,pop_vlan,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
742         "4  10   0 drop" \
743         "4  10   1 drop" \
744         "4  11   0 drop" \
745         "4  11   1 drop" \
746         "4  12   0 drop" \
747         "4  12   1 drop" \
748         "5  none 0 2,push_vlan(vid=10,pcp=0),1,6,7,8,100" \
749         "5  0    0 pop_vlan,2,push_vlan(vid=10,pcp=0),1,6,7,8,100" \
750         "5  0    1 pop_vlan,2,push_vlan(vid=10,pcp=1),1,6,7,8,100" \
751         "5  10   0 1,6,7,8,100,pop_vlan,2" \
752         "5  10   1 1,6,7,8,100,pop_vlan,2" \
753         "5  11   0 7,100" \
754         "5  11   1 7,100" \
755         "5  12   0 1,6,100,pop_vlan,3,4,7,8" \
756         "5  12   1 1,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
757         "6  none 0 2,push_vlan(vid=10,pcp=0),1,5,7,8,100" \
758         "6  0    0 pop_vlan,2,push_vlan(vid=10,pcp=0),1,5,7,8,100" \
759         "6  0    1 pop_vlan,2,push_vlan(vid=10,pcp=1),1,5,7,8,100" \
760         "6  10   0 1,5,7,8,100,pop_vlan,2" \
761         "6  10   1 1,5,7,8,100,pop_vlan,2" \
762         "6  11   0 drop" \
763         "6  11   1 drop" \
764         "6  12   0 1,5,100,pop_vlan,3,4,7,8" \
765         "6  12   1 1,5,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
766         "7  none 0 3,4,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
767         "7  0    0 pop_vlan,3,4,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
768         "7  0    1 3,8,pop_vlan,4,push_vlan(vid=12,pcp=1),1,5,6,100" \
769         "7  10   0 1,5,6,8,100,pop_vlan,2" \
770         "7  10   1 1,5,6,8,100,pop_vlan,2" \
771         "7  11   0 5,100" \
772         "7  11   1 5,100" \
773         "7  12   0 1,5,6,100,pop_vlan,3,4,8" \
774         "7  12   1 1,5,6,100,pop_vlan,4,push_vlan(vid=0,pcp=1),3,8" \
775         "8  none 0 3,4,7,push_vlan(vid=12,pcp=0),1,5,6,100" \
776         "8  0    0 pop_vlan,3,4,7,push_vlan(vid=12,pcp=0),1,5,6,100" \
777         "8  0    1 3,pop_vlan,4,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
778         "8  10   0 1,5,6,7,100,pop_vlan,2" \
779         "8  10   1 1,5,6,7,100,pop_vlan,2" \
780         "8  11   0 drop" \
781         "8  11   1 drop" \
782         "8  12   0 1,5,6,100,pop_vlan,3,4,7" \
783         "8  12   1 1,5,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3"
784 do
785   set $tuple
786   in_port=$1
787   vlan=$2
788   pcp=$3
789   expected=$4
790
791   if test $vlan = none; then
792     flow="in_port($in_port),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff),eth_type(0xabcd)"
793   else
794     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))"
795   fi
796
797   echo "----------------------------------------------------------------------"
798   echo "in_port=$in_port vlan=$vlan pcp=$pcp"
799
800   AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
801   actual=`tail -1 stdout | sed 's/Datapath actions: //'`
802
803   AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
804   mv stdout expout
805   AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
806 done
807
808 OVS_VSWITCHD_STOP
809 AT_CLEANUP
810
811 AT_SETUP([ofproto-dpif - fragment handling])
812 OVS_VSWITCHD_START
813 ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6], [90])
814 AT_DATA([flows.txt], [dnl
815 priority=75 tcp ip_frag=no    tp_dst=80 actions=output:1
816 priority=75 tcp ip_frag=first tp_dst=80 actions=output:2
817 priority=75 tcp ip_frag=later tp_dst=80 actions=output:3
818 priority=50 tcp ip_frag=no              actions=output:4
819 priority=50 tcp ip_frag=first           actions=output:5
820 priority=50 tcp ip_frag=later           actions=output:6
821 ])
822 AT_CHECK([ovs-ofctl replace-flows br0 flows.txt])
823
824 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"
825 no_flow="$base_flow,frag=no),tcp(src=12345,dst=80)"
826 first_flow="$base_flow,frag=first),tcp(src=12345,dst=80)"
827 later_flow="$base_flow,frag=later)"
828
829     # mode    no  first  later
830 for tuple in \
831     'normal    1     5      6' \
832     'drop      1  drop   drop' \
833     'nx-match  1     2      6'
834 do
835   set $tuple
836   mode=$1
837   no=$2
838   first=$3
839   later=$4
840
841   AT_CHECK([ovs-ofctl set-frags br0 $mode])
842   for type in no first later; do
843     eval flow=\$${type}_flow exp_output=\$$type
844     printf "\n%s\n" "----$mode $type-----"
845     AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
846     : > expout
847     if test $mode = drop && test $type != no; then
848         echo 'Packets dropped because they are IP fragments and the fragment handling mode is "drop".' >> expout
849     fi
850     echo "Datapath actions: $exp_output" >> expout
851     AT_CHECK([grep 'IP fragments' stdout; tail -1 stdout], [0], [expout])
852   done
853 done
854 OVS_VSWITCHD_STOP
855 AT_CLEANUP
856
857 AT_SETUP([ofproto-dpif - exit])
858 OVS_VSWITCHD_START
859 ADD_OF_PORTS([br0], [1], [2], [3], [10], [11], [12], [13], [14])
860 AT_DATA([flows.txt], [dnl
861 in_port=1 actions=output:10,exit,output:11
862 in_port=2 actions=output:12,resubmit:1,output:12
863 in_port=3 actions=output:13,resubmit:2,output:14
864 ])
865 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
866 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy '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])
867 AT_CHECK([tail -1 stdout], [0],
868   [Datapath actions: 10
869 ])
870 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy '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])
871 AT_CHECK([tail -1 stdout], [0],
872   [Datapath actions: 12,10
873 ])
874 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy '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])
875 AT_CHECK([tail -1 stdout], [0],
876   [Datapath actions: 13,12,10
877 ])
878 OVS_VSWITCHD_STOP
879 AT_CLEANUP
880
881
882 AT_SETUP([ofproto-dpif - mirroring, select_all])
883 OVS_VSWITCHD_START
884 ADD_OF_PORTS([br0], 1, 2, 3)
885 ovs-vsctl \
886         set Bridge br0 mirrors=@m --\
887         --id=@p3 get Port p3 --\
888         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
889
890 AT_DATA([flows.txt], [dnl
891 in_port=1 actions=output:2
892 in_port=2 actions=output:1
893 ])
894 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
895
896 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)"
897 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
898 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
899   [Datapath actions: 2,3
900 ])
901
902 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)"
903 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
904 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
905   [Datapath actions: 1,3
906 ])
907
908 OVS_VSWITCHD_STOP
909 AT_CLEANUP
910
911
912 AT_SETUP([ofproto-dpif - mirroring, select_src])
913 OVS_VSWITCHD_START
914 ADD_OF_PORTS([br0], 1, 2, 3)
915 ovs-vsctl \
916         set Bridge br0 mirrors=@m --\
917         --id=@p1 get Port p1 -- --id=@p3 get Port p3 --\
918         --id=@m create Mirror name=mymirror select_src_port=@p1 output_port=@p3
919
920 AT_DATA([flows.txt], [dnl
921 in_port=1 actions=output:2
922 in_port=2 actions=output:1
923 ])
924 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
925
926 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)"
927 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
928 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
929   [Datapath actions: 2,3
930 ])
931
932 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)"
933 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
934 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
935   [Datapath actions: 1
936 ])
937 OVS_VSWITCHD_STOP
938 AT_CLEANUP
939
940 AT_SETUP([ofproto-dpif - mirroring, OFPP_NONE ingress port])
941 OVS_VSWITCHD_START
942 ADD_OF_PORTS([br0], 1, 2)
943 ovs-vsctl \
944         set Bridge br0 mirrors=@m --\
945         --id=@p2 get Port p2 --\
946         --id=@m create Mirror name=mymirror select_all=true output_port=@p2
947
948 AT_CHECK([ovs-ofctl add-flow br0 action=output:1])
949
950 # "in_port" defaults to OFPP_NONE if it's not specified.
951 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"
952 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
953 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
954   [Datapath actions: 1,2
955 ])
956
957 OVS_VSWITCHD_STOP
958 AT_CLEANUP
959
960
961 AT_SETUP([ofproto-dpif - mirroring, select_dst])
962 OVS_VSWITCHD_START
963 ADD_OF_PORTS([br0], 1, 2, 3)
964 ovs-vsctl \
965         set Bridge br0 mirrors=@m --\
966         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
967         --id=@m create Mirror name=mymirror select_dst_port=@p2 output_port=@p3
968
969 AT_DATA([flows.txt], [dnl
970 in_port=1 actions=output:2
971 in_port=2 actions=output:1
972 ])
973 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
974
975 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)"
976 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
977 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
978   [Datapath actions: 2,3
979 ])
980
981 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)"
982 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
983 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
984   [Datapath actions: 1
985 ])
986
987 OVS_VSWITCHD_STOP
988 AT_CLEANUP
989
990
991 AT_SETUP([ofproto-dpif - mirroring, select_vlan])
992 OVS_VSWITCHD_START
993 ADD_OF_PORTS([br0], 1, 2, 3)
994 ovs-vsctl \
995         set Bridge br0 mirrors=@m --\
996         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
997         --id=@m create Mirror name=mymirror select_all=true select_vlan=11 output_port=@p3
998
999 AT_DATA([flows.txt], [dnl
1000 in_port=1, actions=output:2
1001 ])
1002 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1003
1004 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)"
1005 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1006 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1007   [Datapath actions: 2
1008 ])
1009
1010 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))"
1011 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1012 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1013   [Datapath actions: 2
1014 ])
1015
1016 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))"
1017 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1018 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1019   [Datapath actions: 2,3
1020 ])
1021
1022 OVS_VSWITCHD_STOP
1023 AT_CLEANUP
1024
1025
1026 AT_SETUP([ofproto-dpif - mirroring, output_port])
1027 OVS_VSWITCHD_START
1028 ADD_OF_PORTS([br0], 1, 2, 3)
1029 ovs-vsctl \
1030         set Bridge br0 mirrors=@m --\
1031         --id=@p3 get Port p3 --\
1032         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
1033
1034 AT_DATA([flows.txt], [dnl
1035 in_port=1 actions=mod_vlan_vid:17,output:2
1036 in_port=2 actions=output:1
1037 ])
1038 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1039
1040 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)"
1041 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1042 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1043   [Datapath actions: push_vlan(vid=17,pcp=0),2,pop_vlan,3
1044 ])
1045
1046 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)"
1047 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1048 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1049   [Datapath actions: 1,3
1050 ])
1051
1052 OVS_VSWITCHD_STOP
1053 AT_CLEANUP
1054
1055 AT_SETUP([ofproto-dpif - mirroring, output_vlan])
1056 OVS_VSWITCHD_START
1057 ADD_OF_PORTS([br0], 1, 2)
1058 ovs-vsctl \
1059         set Bridge br0 mirrors=@m --\
1060         --id=@m create Mirror name=mymirror select_all=true output_vlan=12
1061
1062 AT_DATA([flows.txt], [dnl
1063 in_port=1 actions=output:2
1064 in_port=2 actions=mod_vlan_vid:17,output:1
1065 ])
1066 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1067
1068 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)"
1069 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1070 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1071
1072 expected="2,push_vlan(vid=12,pcp=0),1,2,100"
1073 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
1074 mv stdout expout
1075 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
1076
1077 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)"
1078 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1079 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1080
1081 expected="push_vlan(vid=17,pcp=0),1,pop_vlan,push_vlan(vid=12,pcp=0),1,2,100"
1082 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
1083 mv stdout expout
1084 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
1085
1086 OVS_VSWITCHD_STOP
1087 AT_CLEANUP
1088
1089 # Two testcases below are for the ofproto/trace command
1090 # The first one tests all correct syntax:
1091 # ofproto/trace [dp_name] odp_flow [-generate|packet]
1092 # ofproto/trace br_name br_flow [-generate|packet]
1093 AT_SETUP([ofproto-dpif - ofproto/trace command 1])
1094 OVS_VSWITCHD_START([set bridge br0 fail-mode=standalone])
1095 ADD_OF_PORTS([br0], 1, 2, 3)
1096
1097 AT_DATA([flows.txt], [dnl
1098 in_port=1 actions=output:2
1099 in_port=2 actions=output:1
1100 ])
1101 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1102
1103 odp_flow="in_port(1)"
1104 br_flow="in_port=1"
1105 # Test command: ofproto/trace odp_flow
1106 AT_CHECK([ovs-appctl ofproto/trace "$odp_flow"], [0], [stdout])
1107 AT_CHECK([tail -1 stdout], [0], [dnl
1108 Datapath actions: 2
1109 ])
1110
1111 # Test command: ofproto/trace dp_name odp_flow
1112 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$odp_flow"], [0], [stdout])
1113 AT_CHECK([tail -1 stdout], [0], [dnl
1114 Datapath actions: 2
1115 ])
1116 # Test commmand: ofproto/trace br_name br_flow
1117 AT_CHECK([ovs-appctl ofproto/trace br0 "$br_flow"], [0], [stdout])
1118 AT_CHECK([tail -1 stdout], [0], [dnl
1119 Datapath actions: 2
1120 ])
1121
1122 # Delete the inserted flows
1123 AT_CHECK([ovs-ofctl del-flows br0 "in_port=1"], [0], [stdout])
1124 AT_CHECK([ovs-ofctl del-flows br0 "in_port=2"], [0], [stdout])
1125
1126 # This section beflow tests the [-generate] option
1127 odp_flow="in_port(3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff)"
1128 br_flow="arp,metadata=0,in_port=3,vlan_tci=0x0000,dl_src=50:54:00:00:00:05,dl_dst=ff:ff:ff:ff:ff:ff"
1129
1130 # Test command: ofproto/trace odp_flow
1131 AT_CHECK([ovs-appctl ofproto/trace "$odp_flow"], [0], [stdout])
1132 # Check for no MAC learning entry
1133 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1134  port  VLAN  MAC                Age
1135 ])
1136
1137 # Test command: ofproto/trace br_name br_flow
1138 AT_CHECK([ovs-appctl ofproto/trace br0 "$br_flow"], [0], [stdout])
1139 # Check for no MAC learning entry
1140 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1141  port  VLAN  MAC                Age
1142 ])
1143
1144 # Test command: ofproto/trace odp_flow -generate
1145 AT_CHECK([ovs-appctl ofproto/trace "$odp_flow" -generate], [0], [stdout])
1146 # Check for the MAC learning entry
1147 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1148  port  VLAN  MAC                Age
1149     3     0  50:54:00:00:00:05    ?
1150 ])
1151
1152 # Test command: ofproto/trace dp_name odp_flow -generate
1153 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy \
1154   "in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05)" \
1155   -generate], [0], [stdout])
1156 # Check for both MAC learning entries
1157 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1158  port  VLAN  MAC                Age
1159     3     0  50:54:00:00:00:05    ?
1160     1     0  50:54:00:00:00:06    ?
1161 ])
1162
1163 # Test command: ofproto/trace br_name br_flow -generate
1164 AT_CHECK([ovs-appctl ofproto/trace br0 \
1165   "in_port=2,dl_src=50:54:00:00:00:07,dl_dst=50:54:00:00:00:06" \
1166   -generate], [0], [stdout])
1167 # Check for both MAC learning entries.
1168 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1169  port  VLAN  MAC                Age
1170     3     0  50:54:00:00:00:05    ?
1171     1     0  50:54:00:00:00:06    ?
1172     2     0  50:54:00:00:00:07    ?
1173 ])
1174
1175 # This section beflow tests the [packet] option
1176 # The ovs-tcpundump of packets between port1 and port2
1177 pkt1to2="50540000000250540000000108064500001C000100004001F98CC0A80001C0A800020800F7FF00000000"
1178 pkt2to1="50540000000150540000000208064500001C000100004001F98CC0A80002C0A800010800F7FF00000000"
1179
1180 # Construct the MAC learning table
1181 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy \
1182   "in_port(1),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff)" \
1183   -generate], [0], [stdout])
1184
1185 # Construct the MAC learning table
1186 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy \
1187   "in_port(2),eth(src=50:54:00:00:00:02,dst=ff:ff:ff:ff:ff:ff)" \
1188   -generate], [0], [stdout])
1189
1190 # Test command: ofproto/trace odp_flow packet
1191 AT_CHECK([ovs-appctl ofproto/trace \
1192   "in_port(1),skb_priority(1),skb_mark(2)" "$pkt1to2"], [0], [stdout])
1193 AT_CHECK([tail -1 stdout], [0], [dnl
1194 Datapath actions: 2
1195 ])
1196 AT_CHECK([head -n 3 stdout], [0], [dnl
1197 Bridge: br0
1198 Packet: arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:54:00:00:00:01,dl_dst=50:54:00:00:00:02,arp_spa=0.0.0.0,arp_tpa=0.0.0.0,arp_sha=00:00:00:00:00:00,arp_tha=00:00:00:00:00:00
1199 Flow: pkt_mark=0x2,skb_priority=0x1,arp,metadata=0,in_port=1,vlan_tci=0x0000,dl_src=50:54:00:00:00:01,dl_dst=50:54:00:00:00:02,arp_spa=0.0.0.0,arp_tpa=0.0.0.0,arp_sha=00:00:00:00:00:00,arp_tha=00:00:00:00:00:00
1200 ])
1201
1202 # Test command: ofproto/trace dp_name odp_flow packet
1203 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy \
1204   "in_port(1),skb_priority(1),skb_mark(2)" "$pkt1to2"], [0], [stdout])
1205 AT_CHECK([tail -1 stdout], [0], [dnl
1206 Datapath actions: 2
1207 ])
1208 AT_CHECK([head -n 3 stdout], [0], [dnl
1209 Bridge: br0
1210 Packet: arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:54:00:00:00:01,dl_dst=50:54:00:00:00:02,arp_spa=0.0.0.0,arp_tpa=0.0.0.0,arp_sha=00:00:00:00:00:00,arp_tha=00:00:00:00:00:00
1211 Flow: pkt_mark=0x2,skb_priority=0x1,arp,metadata=0,in_port=1,vlan_tci=0x0000,dl_src=50:54:00:00:00:01,dl_dst=50:54:00:00:00:02,arp_spa=0.0.0.0,arp_tpa=0.0.0.0,arp_sha=00:00:00:00:00:00,arp_tha=00:00:00:00:00:00
1212 ])
1213
1214 # Test command: ofproto/trace br_name br_flow packet
1215 AT_CHECK([ovs-appctl ofproto/trace br0 \
1216   "in_port=2,skb_priority=2,pkt_mark=1" "$pkt2to1"], [0], [stdout],[stderr])
1217 AT_CHECK([tail -1 stdout], [0], [dnl
1218 Datapath actions: 1
1219 ])
1220 AT_CHECK([head -n 2 stdout], [0], [dnl
1221 Packet: arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:54:00:00:00:02,dl_dst=50:54:00:00:00:01,arp_spa=0.0.0.0,arp_tpa=0.0.0.0,arp_sha=00:00:00:00:00:00,arp_tha=00:00:00:00:00:00
1222 Flow: pkt_mark=0x1,skb_priority=0x2,arp,metadata=0,in_port=2,vlan_tci=0x0000,dl_src=50:54:00:00:00:02,dl_dst=50:54:00:00:00:01,arp_spa=0.0.0.0,arp_tpa=0.0.0.0,arp_sha=00:00:00:00:00:00,arp_tha=00:00:00:00:00:00
1223 ])
1224
1225 OVS_VSWITCHD_STOP
1226 AT_CLEANUP
1227
1228 # The second test tests the corner cases
1229 AT_SETUP([ofproto-dpif - ofproto/trace command 2])
1230 OVS_VSWITCHD_START
1231 ADD_OF_PORTS([br0], 1, 2)
1232
1233 # Define flows
1234 odp_flow="in_port(1),eth(src=50:54:00:00:00:01,dst=50:54:00:00:00:02)"
1235 br_flow="in_port=1,dl_src=50:54:00:00:00:01,dl_dst=50:54:00:00:00:02"
1236 # Define options
1237 generate="-generate"
1238 pkt="50540000000250540000000108064500001C000100004001F98CC0A80001C0A800020800F7FF00000000"
1239
1240 # Test incorrect command: ofproto/trace wrong_name odp_flow [-generate|packet]
1241 m4_foreach(
1242 [option],
1243 [[],
1244 ["$generate"],
1245 ["$pkt"]],
1246 [AT_CHECK([ovs-appctl ofproto/trace wrong_name "$odp_flow" option],
1247   [2], [], [stderr])
1248 AT_CHECK([tail -2 stderr], [0], [dnl
1249 Cannot find datapath of this name
1250 ovs-appctl: ovs-vswitchd: server returned an error
1251 ])])
1252
1253 # Test incorrect command: ofproto/trace empty_string odp_flow [-generate|packet]
1254 m4_foreach(
1255 [option],
1256 [[],
1257 ["$generate"],
1258 ["$pkt"]],
1259 [AT_CHECK([ovs-appctl ofproto/trace "" "$odp_flow" option],
1260   [2], [], [stderr])
1261 AT_CHECK([tail -2 stderr], [0], [dnl
1262 Cannot find datapath of this name
1263 ovs-appctl: ovs-vswitchd: server returned an error
1264 ])])
1265
1266 # Test incorrect command: ofproto/trace nonexist_dp_name odp_flow [-generate|packet]
1267 m4_foreach(
1268 [option],
1269 [[],
1270 ["$generate"],
1271 ["$pkt"]],
1272 [AT_CHECK([ovs-appctl ofproto/trace ovs-system "$odp_flow" option],
1273   [2], [], [stderr])
1274 AT_CHECK([tail -2 stderr], [0], [dnl
1275 Cannot find datapath of this name
1276 ovs-appctl: ovs-vswitchd: server returned an error
1277 ])])
1278
1279 # Test incorrect command: ofproto/trace br_name odp_flow [-generate|packet]
1280 m4_foreach(
1281 [option],
1282 [[],
1283 ["$generate"],
1284 ["$pkt"]],
1285 [AT_CHECK([ovs-appctl ofproto/trace br0 "$odp_flow" option],
1286   [2], [], [stderr])
1287 AT_CHECK([tail -2 stderr], [0], [dnl
1288 Cannot find datapath of this name
1289 ovs-appctl: ovs-vswitchd: server returned an error
1290 ])])
1291
1292 # Test incorrect command: ofproto/trace dp_name br_flow [-generate|packet]
1293 m4_foreach(
1294 [option],
1295 [[],
1296 ["$generate"],
1297 ["$pkt"]],
1298 [AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$br_flow" option],
1299   [2], [], [stderr])
1300 AT_CHECK([tail -2 stderr], [0], [dnl
1301 Unknown bridge name
1302 ovs-appctl: ovs-vswitchd: server returned an error
1303 ])])
1304
1305 # Test incorrect command: ofproto/trace br_flow [-generate|packet]
1306 m4_foreach(
1307 [option],
1308 [[],
1309 ["$generate"],
1310 ["$pkt"]],
1311 [AT_CHECK([ovs-appctl ofproto/trace "$br_flow" option],
1312   [2], [], [stderr])
1313 AT_CHECK([tail -2 stderr], [0], [dnl
1314 Must specify bridge name
1315 ovs-appctl: ovs-vswitchd: server returned an error
1316 ])])
1317
1318 # Test incorrect command: ofproto/trace dp_name odp_flow garbage_option
1319 AT_CHECK([ovs-appctl ofproto/trace \
1320   ovs-dummy "$odp_flow" garbage_option],
1321   [2], [stdout],[stderr])
1322 AT_CHECK([tail -2 stderr], [0], [dnl
1323 Trailing garbage in packet data
1324 ovs-appctl: ovs-vswitchd: server returned an error
1325 ])
1326
1327 # Test incorrect command: ofproto/trace with 4 arguments
1328 AT_CHECK([ovs-appctl ofproto/trace \
1329   arg1, arg2, arg3, arg4], [2], [stdout],[stderr])
1330 AT_CHECK([tail -2 stderr], [0], [dnl
1331 "ofproto/trace" command takes at most 3 arguments
1332 ovs-appctl: ovs-vswitchd: server returned an error
1333 ])
1334
1335 # Test incorrect command: ofproto/trace with 0 argument
1336 AT_CHECK([ovs-appctl ofproto/trace ], [2], [stdout],[stderr])
1337 AT_CHECK([tail -2 stderr], [0], [dnl
1338 "ofproto/trace" command requires at least 1 arguments
1339 ovs-appctl: ovs-vswitchd: server returned an error
1340 ])
1341
1342 OVS_VSWITCHD_STOP
1343 AT_CLEANUP
1344
1345 m4_define([OFPROTO_TRACE],
1346   [flow="$2"
1347    AT_CHECK([ovs-appctl ofproto/trace $1 "$flow" $3], [0], [stdout])
1348    actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1349    expected="$4"
1350    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" $5],
1351      [0], [stdout])
1352    mv stdout expout
1353    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" $5],
1354      [0], [expout])])
1355
1356 AT_SETUP([ofproto-dpif - MAC learning])
1357 OVS_VSWITCHD_START([set bridge br0 fail-mode=standalone])
1358 ADD_OF_PORTS([br0], 1, 2, 3)
1359
1360 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)'
1361
1362 # Trace an ARP packet arriving on p3, to create a MAC learning entry.
1363 OFPROTO_TRACE(
1364   [ovs-dummy],
1365   [in_port(3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
1366   [-generate],
1367   [1,2,100])
1368
1369 # Check for the MAC learning entry.
1370 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1371  port  VLAN  MAC                Age
1372     3     0  50:54:00:00:00:05    ?
1373 ])
1374
1375 # Trace a packet arrival destined for the learned MAC.
1376 # (This will also learn a MAC.)
1377 OFPROTO_TRACE(
1378   [ovs-dummy],
1379   [in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05),$arp],
1380   [-generate],
1381   [3])
1382
1383 # Check for both MAC learning entries.
1384 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1385  port  VLAN  MAC                Age
1386     3     0  50:54:00:00:00:05    ?
1387     1     0  50:54:00:00:00:06    ?
1388 ])
1389
1390 # Trace a packet arrival that updates the first learned MAC entry.
1391 OFPROTO_TRACE(
1392   [ovs-dummy],
1393   [in_port(2),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
1394   [-generate],
1395   [1,3,100])
1396
1397 # Check that the MAC learning entry was updated.
1398 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1399  port  VLAN  MAC                Age
1400     1     0  50:54:00:00:00:06    ?
1401     2     0  50:54:00:00:00:05    ?
1402 ])
1403
1404 # Add another bridge.
1405 AT_CHECK(
1406   [ovs-vsctl \
1407      -- add-br br1 \
1408      -- set bridge br1 datapath-type=dummy])
1409 ADD_OF_PORTS([br1], 4, 5)
1410
1411 # Trace some packet arrivals in br1 to create MAC learning entries there too.
1412 OFPROTO_TRACE(
1413   [ovs-dummy],
1414   [in_port(4),eth(src=50:54:00:00:00:06,dst=ff:ff:ff:ff:ff:ff),$arp],
1415   [-generate],
1416   [5,101])
1417 OFPROTO_TRACE(
1418   [ovs-dummy],
1419   [in_port(5),eth(src=50:54:00:00:00:07,dst=ff:ff:ff:ff:ff:ff),$arp],
1420   [-generate],
1421   [4,101])
1422
1423 # Check that the MAC learning entries were added.
1424 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1425  port  VLAN  MAC                Age
1426     4     0  50:54:00:00:00:06    ?
1427     5     0  50:54:00:00:00:07    ?
1428 ])
1429
1430 # Delete port p1 and see that its MAC learning entry disappeared, and
1431 # that the MAC learning entry for the same MAC was also deleted from br1.
1432 AT_CHECK([ovs-vsctl del-port p1])
1433 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1434  port  VLAN  MAC                Age
1435     2     0  50:54:00:00:00:05    ?
1436 ])
1437 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1438  port  VLAN  MAC                Age
1439     5     0  50:54:00:00:00:07    ?
1440 ])
1441
1442 OVS_VSWITCHD_STOP
1443 AT_CLEANUP
1444
1445 AT_SETUP([ofproto-dpif - MAC table overflow])
1446 OVS_VSWITCHD_START(
1447   [set bridge br0 fail-mode=standalone other-config:mac-table-size=10])
1448 ADD_OF_PORTS([br0], 1, 2, 3)
1449
1450 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)'
1451
1452 AT_CHECK([ovs-appctl time/stop])
1453
1454 # Trace 10 ARP packets arriving on p3, to create MAC learning entries.
1455 for i in 0 1 2 3 4 5 6 7 8 9; do
1456     OFPROTO_TRACE(
1457       [ovs-dummy],
1458       [in_port(3),eth(src=50:54:00:00:00:0$i,dst=ff:ff:ff:ff:ff:ff),$arp],
1459       [-generate],
1460       [1,2,100])
1461     ovs-appctl time/warp 1000
1462 done
1463
1464 # Check for the MAC learning entries.
1465 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/ *[[0-9]]\{1,\}$//' | sort],
1466   [0], [dnl
1467     3     0  50:54:00:00:00:00
1468     3     0  50:54:00:00:00:01
1469     3     0  50:54:00:00:00:02
1470     3     0  50:54:00:00:00:03
1471     3     0  50:54:00:00:00:04
1472     3     0  50:54:00:00:00:05
1473     3     0  50:54:00:00:00:06
1474     3     0  50:54:00:00:00:07
1475     3     0  50:54:00:00:00:08
1476     3     0  50:54:00:00:00:09
1477  port  VLAN  MAC                Age
1478 ])
1479
1480 # Trace another ARP packet on another MAC.
1481 OFPROTO_TRACE(
1482   [ovs-dummy],
1483   [in_port(3),eth(src=50:54:00:00:00:10,dst=ff:ff:ff:ff:ff:ff),$arp],
1484   [-generate],
1485   [1,2,100])
1486
1487 # Check that the new one chased the oldest one out of the table.
1488 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/' | sort],
1489   [0], [dnl
1490     3     0  50:54:00:00:00:01    ?
1491     3     0  50:54:00:00:00:02    ?
1492     3     0  50:54:00:00:00:03    ?
1493     3     0  50:54:00:00:00:04    ?
1494     3     0  50:54:00:00:00:05    ?
1495     3     0  50:54:00:00:00:06    ?
1496     3     0  50:54:00:00:00:07    ?
1497     3     0  50:54:00:00:00:08    ?
1498     3     0  50:54:00:00:00:09    ?
1499     3     0  50:54:00:00:00:10    ?
1500  port  VLAN  MAC                Age
1501 ])
1502 OVS_VSWITCHD_STOP
1503 AT_CLEANUP
1504
1505 dnl Test that sFlow samples packets correctly.
1506 AT_SETUP([ofproto-dpif - sFlow packet sampling])
1507 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
1508
1509 ON_EXIT([kill `cat test-sflow.pid`])
1510 AT_CHECK([test-sflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > sflow.log], [0], [], [ignore])
1511 AT_CAPTURE_FILE([sflow.log])
1512 SFLOW_PORT=`parse_listening_port < test-sflow.log`
1513
1514 ovs-appctl time/stop
1515
1516 ADD_OF_PORTS([br0], 1, 2)
1517 ovs-vsctl \
1518    set Interface br0 options:ifindex=1002 -- \
1519    set Interface p1 options:ifindex=1004 -- \
1520    set Interface p2 options:ifindex=1003 -- \
1521    set Bridge br0 sflow=@sf -- \
1522    --id=@sf create sflow targets=\"127.0.0.1:$SFLOW_PORT\" \
1523      header=128 sampling=1 polling=1
1524
1525 dnl open with ARP packets to seed the bridge-learning.  The output
1526 dnl ifIndex numbers should be reported predictably after that.
1527 dnl Since we set sampling=1 we should see all of these packets
1528 dnl reported. Sorting the output by data-source and seqNo makes
1529 dnl it deterministic. Ensuring that we send at least two packets
1530 dnl into each port means we get to check the seq nos are
1531 dnl incrementing correctly.
1532
1533 ovs-appctl netdev-dummy/receive p1 'in_port(2),eth(src=50:54:00:00:00:05,dst=FF:FF:FF:FF:FF:FF),eth_type(0x0806),arp(sip=192.168.0.2,tip=192.168.0.1,op=1,sha=50:54:00:00:00:05,tha=00:00:00:00:00:00)'
1534 ovs-appctl netdev-dummy/receive p2 'in_port(1),eth(src=50:54:00:00:00:07,dst=FF:FF:FF:FF:FF:FF),eth_type(0x0806),arp(sip=192.168.0.1,tip=192.168.0.2,op=1,sha=50:54:00:00:00:07,tha=00:00:00:00:00:00)'
1535 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)'
1536 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)'
1537 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(0x86dd),ipv6(src=fe80::1,dst=fe80::2,label=0,proto=10,tclass=0x70,hlimit=128,frag=no)'
1538
1539 dnl sleep long enough to get more than one counter sample
1540 dnl from each datasource so we can check sequence numbers
1541 for i in `seq 1 30`; do
1542     ovs-appctl time/warp 100
1543 done
1544 OVS_VSWITCHD_STOP
1545 ovs-appctl -t test-sflow exit
1546
1547 AT_CHECK([[sort sflow.log | $EGREP 'HEADER|ERROR' | sed 's/ /\
1548         /g']], [0], [dnl
1549 HEADER
1550         dgramSeqNo=1
1551         ds=127.0.0.1>2:1000
1552         fsSeqNo=1
1553         in_vlan=0
1554         in_priority=0
1555         out_vlan=0
1556         out_priority=0
1557         meanSkip=1
1558         samplePool=1
1559         dropEvents=0
1560         in_ifindex=1004
1561         in_format=0
1562         out_ifindex=2
1563         out_format=2
1564         hdr_prot=1
1565         pkt_len=64
1566         stripped=4
1567         hdr_len=60
1568         hdr=FF-FF-FF-FF-FF-FF-50-54-00-00-00-05-08-06-00-01-08-00-06-04-00-01-50-54-00-00-00-05-C0-A8-00-02-00-00-00-00-00-00-C0-A8-00-01-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
1569 HEADER
1570         dgramSeqNo=1
1571         ds=127.0.0.1>2:1000
1572         fsSeqNo=2
1573         in_vlan=0
1574         in_priority=0
1575         out_vlan=0
1576         out_priority=0
1577         meanSkip=1
1578         samplePool=2
1579         dropEvents=0
1580         in_ifindex=1003
1581         in_format=0
1582         out_ifindex=2
1583         out_format=2
1584         hdr_prot=1
1585         pkt_len=64
1586         stripped=4
1587         hdr_len=60
1588         hdr=FF-FF-FF-FF-FF-FF-50-54-00-00-00-07-08-06-00-01-08-00-06-04-00-01-50-54-00-00-00-07-C0-A8-00-01-00-00-00-00-00-00-C0-A8-00-02-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
1589 HEADER
1590         dgramSeqNo=1
1591         ds=127.0.0.1>2:1000
1592         fsSeqNo=3
1593         in_vlan=0
1594         in_priority=0
1595         out_vlan=0
1596         out_priority=0
1597         meanSkip=1
1598         samplePool=3
1599         dropEvents=0
1600         in_ifindex=1004
1601         in_format=0
1602         out_ifindex=1003
1603         out_format=0
1604         hdr_prot=1
1605         pkt_len=64
1606         stripped=4
1607         hdr_len=60
1608         hdr=50-54-00-00-00-07-50-54-00-00-00-05-08-00-45-00-00-1C-00-00-00-00-40-01-F9-8D-C0-A8-00-01-C0-A8-00-02-08-00-F7-FF-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
1609 HEADER
1610         dgramSeqNo=1
1611         ds=127.0.0.1>2:1000
1612         fsSeqNo=4
1613         in_vlan=0
1614         in_priority=0
1615         out_vlan=0
1616         out_priority=0
1617         meanSkip=1
1618         samplePool=4
1619         dropEvents=0
1620         in_ifindex=1003
1621         in_format=0
1622         out_ifindex=1004
1623         out_format=0
1624         hdr_prot=1
1625         pkt_len=64
1626         stripped=4
1627         hdr_len=60
1628         hdr=50-54-00-00-00-05-50-54-00-00-00-07-08-00-45-00-00-1C-00-00-00-00-40-01-F9-8D-C0-A8-00-02-C0-A8-00-01-00-00-FF-FF-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
1629 HEADER
1630         dgramSeqNo=1
1631         ds=127.0.0.1>2:1000
1632         fsSeqNo=5
1633         in_vlan=0
1634         in_priority=0
1635         out_vlan=0
1636         out_priority=0
1637         meanSkip=1
1638         samplePool=5
1639         dropEvents=0
1640         in_ifindex=1003
1641         in_format=0
1642         out_ifindex=1004
1643         out_format=0
1644         hdr_prot=1
1645         pkt_len=64
1646         stripped=4
1647         hdr_len=60
1648         hdr=50-54-00-00-00-05-50-54-00-00-00-07-86-DD-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
1649 ])
1650
1651 AT_CHECK([[sort sflow.log | $EGREP 'IFCOUNTERS|ERROR' | head -6 | sed 's/ /\
1652         /g']], [0], [dnl
1653 IFCOUNTERS
1654         dgramSeqNo=2
1655         ds=127.0.0.1>0:1002
1656         csSeqNo=1
1657         ifindex=1002
1658         type=6
1659         ifspeed=100000000
1660         direction=0
1661         status=3
1662         in_octets=0
1663         in_unicasts=0
1664         in_multicasts=0
1665         in_broadcasts=4294967295
1666         in_discards=0
1667         in_errors=0
1668         in_unknownprotos=4294967295
1669         out_octets=120
1670         out_unicasts=2
1671         out_multicasts=4294967295
1672         out_broadcasts=4294967295
1673         out_discards=0
1674         out_errors=0
1675         promiscuous=0
1676 IFCOUNTERS
1677         dgramSeqNo=2
1678         ds=127.0.0.1>0:1003
1679         csSeqNo=1
1680         ifindex=1003
1681         type=6
1682         ifspeed=100000000
1683         direction=0
1684         status=0
1685         in_octets=98
1686         in_unicasts=3
1687         in_multicasts=0
1688         in_broadcasts=4294967295
1689         in_discards=0
1690         in_errors=0
1691         in_unknownprotos=4294967295
1692         out_octets=120
1693         out_unicasts=2
1694         out_multicasts=4294967295
1695         out_broadcasts=4294967295
1696         out_discards=0
1697         out_errors=0
1698         promiscuous=0
1699 IFCOUNTERS
1700         dgramSeqNo=2
1701         ds=127.0.0.1>0:1004
1702         csSeqNo=1
1703         ifindex=1004
1704         type=6
1705         ifspeed=100000000
1706         direction=0
1707         status=0
1708         in_octets=84
1709         in_unicasts=2
1710         in_multicasts=0
1711         in_broadcasts=4294967295
1712         in_discards=0
1713         in_errors=0
1714         in_unknownprotos=4294967295
1715         out_octets=180
1716         out_unicasts=3
1717         out_multicasts=4294967295
1718         out_broadcasts=4294967295
1719         out_discards=0
1720         out_errors=0
1721         promiscuous=0
1722 IFCOUNTERS
1723         dgramSeqNo=3
1724         ds=127.0.0.1>0:1002
1725         csSeqNo=2
1726         ifindex=1002
1727         type=6
1728         ifspeed=100000000
1729         direction=0
1730         status=3
1731         in_octets=0
1732         in_unicasts=0
1733         in_multicasts=0
1734         in_broadcasts=4294967295
1735         in_discards=0
1736         in_errors=0
1737         in_unknownprotos=4294967295
1738         out_octets=120
1739         out_unicasts=2
1740         out_multicasts=4294967295
1741         out_broadcasts=4294967295
1742         out_discards=0
1743         out_errors=0
1744         promiscuous=0
1745 IFCOUNTERS
1746         dgramSeqNo=3
1747         ds=127.0.0.1>0:1003
1748         csSeqNo=2
1749         ifindex=1003
1750         type=6
1751         ifspeed=100000000
1752         direction=0
1753         status=0
1754         in_octets=98
1755         in_unicasts=3
1756         in_multicasts=0
1757         in_broadcasts=4294967295
1758         in_discards=0
1759         in_errors=0
1760         in_unknownprotos=4294967295
1761         out_octets=120
1762         out_unicasts=2
1763         out_multicasts=4294967295
1764         out_broadcasts=4294967295
1765         out_discards=0
1766         out_errors=0
1767         promiscuous=0
1768 IFCOUNTERS
1769         dgramSeqNo=3
1770         ds=127.0.0.1>0:1004
1771         csSeqNo=2
1772         ifindex=1004
1773         type=6
1774         ifspeed=100000000
1775         direction=0
1776         status=0
1777         in_octets=84
1778         in_unicasts=2
1779         in_multicasts=0
1780         in_broadcasts=4294967295
1781         in_discards=0
1782         in_errors=0
1783         in_unknownprotos=4294967295
1784         out_octets=180
1785         out_unicasts=3
1786         out_multicasts=4294967295
1787         out_broadcasts=4294967295
1788         out_discards=0
1789         out_errors=0
1790         promiscuous=0
1791 ])
1792 AT_CLEANUP
1793
1794
1795
1796 dnl Test that basic NetFlow reports flow statistics correctly:
1797 dnl - The initial packet of a flow are correctly accounted.
1798 dnl - Later packets within a flow are correctly accounted.
1799 dnl - Flow actions changing (in this case, due to MAC learning)
1800 dnl   cause a record to be sent.
1801 AT_SETUP([ofproto-dpif - NetFlow flow expiration])
1802
1803 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
1804 ADD_OF_PORTS([br0], 1, 2)
1805
1806 ON_EXIT([kill `cat test-netflow.pid`])
1807 AT_CHECK([test-netflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > netflow.log], [0], [], [ignore])
1808 AT_CAPTURE_FILE([netflow.log])
1809 NETFLOW_PORT=`parse_listening_port < test-netflow.log`
1810
1811 ovs-vsctl \
1812    set Bridge br0 netflow=@nf -- \
1813    --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
1814      engine_id=1 engine_type=2 active_timeout=30 add-id-to-interface=false
1815
1816 for delay in 1000 30000; do
1817     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)'
1818     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)'
1819
1820     ovs-appctl time/warp $delay
1821 done
1822
1823 sleep 1
1824 OVS_VSWITCHD_STOP
1825 ovs-appctl -t test-netflow exit
1826
1827 AT_CHECK([[sed -e 's/, uptime [0-9]*//
1828 s/, now [0-9.]*//
1829 s/time \([0-9]*\)\.\.\.\1$/time <moment>/
1830 s/time [0-9]*\.\.\.[0-9]*/time <range>/
1831 ' netflow.log | sort]], [0],
1832   [
1833 header: v5, seq 0, engine 2,1
1834 header: v5, seq 1, engine 2,1
1835 seq 0: 192.168.0.1 > 192.168.0.2, if 1 > 65535, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
1836 seq 1: 192.168.0.1 > 192.168.0.2, if 1 > 2, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
1837 seq 1: 192.168.0.2 > 192.168.0.1, if 2 > 1, 2 pkts, 120 bytes, ICMP 0:0, time <range>
1838 ])
1839 AT_CLEANUP
1840
1841 dnl Test that basic NetFlow reports active expirations correctly.
1842 AT_SETUP([ofproto-dpif - NetFlow active expiration])
1843
1844 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
1845 ADD_OF_PORTS([br0], 1, 2)
1846
1847 ON_EXIT([kill `cat test-netflow.pid`])
1848 AT_CHECK([test-netflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > netflow.log], [0], [], [ignore])
1849 AT_CAPTURE_FILE([netflow.log])
1850 NETFLOW_PORT=`parse_listening_port < test-netflow.log`
1851
1852 ovs-vsctl \
1853    set Bridge br0 netflow=@nf -- \
1854    --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
1855      engine_id=1 engine_type=2 active_timeout=10 add-id-to-interface=false
1856
1857 AT_CHECK([ovs-appctl time/stop])
1858 n=1
1859 while test $n -le 60; do
1860     n=`expr $n + 1`
1861
1862     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)'
1863     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)'
1864
1865     ovs-appctl time/warp 1000
1866 done
1867
1868 ovs-appctl time/warp 10000
1869
1870 sleep 1
1871 OVS_VSWITCHD_STOP
1872 ovs-appctl -t test-netflow exit
1873
1874 # Count the number of reported packets:
1875 # - From source to destination before MAC learning kicks in (just one).
1876 # - From source to destination after that.
1877 # - From destination to source.
1878 n_learn=0
1879 n_in=0
1880 n_out=0
1881 n_other=0
1882 n_recs=0
1883 none=0
1884 while read line; do
1885     pkts=`echo "$line" | sed 's/.*, \([[0-9]]*\) pkts,.*/\1/'`
1886     case $pkts in
1887          [[0-9]]*) ;;
1888          *) continue ;;
1889     esac
1890
1891     case $line in
1892         "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 65535, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
1893             counter=n_learn
1894             ;;
1895         "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 2, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
1896             counter=n_in
1897             ;;
1898         "seq "*": 192.168.0.2 > 192.168.0.1, if 2 > 1, "*" pkts, "*" bytes, TCP 80 > 1234, time "*)
1899             counter=n_out
1900             ;;
1901         *)
1902             counter=n_other
1903             ;;
1904     esac
1905     eval $counter=\`expr \$$counter + \$pkts\`
1906     n_recs=`expr $n_recs + 1`
1907 done < netflow.log
1908
1909 # There should be exactly 1 MAC learning packet,
1910 # exactly 59 other packets in that direction,
1911 # and exactly 60 packets in the other direction.
1912 AT_CHECK([echo $n_learn $n_in $n_out $n_other], [0], [1 59 60 0
1913 ])
1914
1915 # There should be 1 expiration for MAC learning,
1916 # at least 5 active and a final expiration in one direction,
1917 # and at least 5 active and a final expiration in the other direction.
1918 echo $n_recs
1919 AT_CHECK([test $n_recs -ge 13])
1920
1921 AT_CLEANUP
1922
1923 AT_SETUP([idle_age and hard_age increase over time])
1924 OVS_VSWITCHD_START
1925
1926 # get_ages DURATION HARD IDLE
1927 #
1928 # Fetch the flow duration, hard age, and idle age into the variables
1929 # whose names are given as arguments.  Rounds DURATION down to the
1930 # nearest integer.  If hard_age doesn't appear in the output, sets
1931 # HARD to "none".  If idle_age doesn't appear in the output, sets IDLE
1932 # to 0.
1933 get_ages () {
1934     AT_CHECK([ovs-ofctl dump-flows br0], [0], [stdout])
1935
1936     duration=`sed -n 's/.*duration=\([[0-9]]*\)\(\.[[0-9]]*\)\{0,1\}s.*/\1/p' stdout`
1937     AT_CHECK([[expr X"$duration" : 'X[0-9][0-9]*$']], [0], [ignore])
1938     AS_VAR_COPY([$1], [duration])
1939
1940     hard=`sed -n 's/.*hard_age=\([[0-9]]*\),.*/\1/p' stdout`
1941     if test X"$hard" = X; then
1942         hard=none
1943     else
1944         AT_CHECK([[expr X"$hard" : 'X[0-9][0-9]*$']], [0], [ignore])
1945     fi
1946     AS_VAR_COPY([$2], [hard])
1947
1948     idle=`sed -n 's/.*idle_age=\([[0-9]]*\),.*/\1/p' stdout`
1949     if test X"$idle" = X; then
1950         idle=0
1951     else
1952         AT_CHECK([[expr X"$idle" : 'X[0-9][0-9]*$']], [0], [ignore])
1953     fi
1954     AS_VAR_COPY([$3], [idle])
1955 }
1956
1957 # Add a flow and get its initial hard and idle age.
1958 AT_CHECK([ovs-ofctl add-flow br0 hard_timeout=199,idle_timeout=188,actions=drop])
1959 get_ages duration1 hard1 idle1
1960
1961 # Warp time forward by 10 seconds, then modify the flow's actions.
1962 ovs-appctl time/warp 10000
1963 get_ages duration2 hard2 idle2
1964 AT_CHECK([ovs-ofctl mod-flows br0 actions=flood])
1965
1966 # Warp time forward by 10 seconds.
1967 ovs-appctl time/warp 10000
1968 get_ages duration3 hard3 idle3
1969
1970 # Warp time forward 10 more seconds, then pass some packets through the flow,
1971 # then warp forward a few more times because idle times are only updated
1972 # occasionally.
1973 ovs-appctl time/warp 10000
1974 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)'
1975 ovs-appctl time/warp 1000
1976 ovs-appctl time/warp 1000
1977 ovs-appctl time/warp 1000
1978 get_ages duration4 hard4 idle4
1979
1980 printf "duration: %4s => %4s => %4s => %4s\n" $duration1 $duration2 $duration3 $duration4
1981 printf "hard_age: %4s => %4s => %4s => %4s\n" $hard1 $hard2 $hard3 $hard4
1982 printf "idle_age: %4s => %4s => %4s => %4s\n" $idle1 $idle2 $idle3 $idle4
1983
1984 # Duration should increase steadily over time.
1985 AT_CHECK([test $duration1 -lt $duration2])
1986 AT_CHECK([test $duration2 -lt $duration3])
1987 AT_CHECK([test $duration3 -lt $duration4])
1988
1989 # Hard age should be "none" initially because it's the same as flow_duration,
1990 # then it should increase.
1991 AT_CHECK([test $hard1 = none])
1992 AT_CHECK([test $hard2 = none])
1993 AT_CHECK([test $hard3 != none])
1994 AT_CHECK([test $hard4 != none])
1995 AT_CHECK([test $hard3 -lt $hard4])
1996
1997 # Idle age should increase from 1 to 2 to 3, then decrease.
1998 AT_CHECK([test $idle1 -lt $idle2])
1999 AT_CHECK([test $idle2 -lt $idle3])
2000 AT_CHECK([test $idle3 -gt $idle4])
2001
2002 # Check some invariant relationships.
2003 AT_CHECK([test $duration1 = $idle1])
2004 AT_CHECK([test $duration2 = $idle2])
2005 AT_CHECK([test $duration3 = $idle3])
2006 AT_CHECK([test $idle3 -gt $hard3])
2007 AT_CHECK([test $idle4 -lt $hard4])
2008 AT_CHECK([test $hard4 -lt $duration4])
2009
2010 OVS_VSWITCHD_STOP
2011 AT_CLEANUP
2012
2013 AT_SETUP([ofproto-dpif - fin_timeout])
2014 OVS_VSWITCHD_START
2015 AT_DATA([flows.txt], [dnl
2016 in_port=1 actions=output:2
2017 in_port=2 actions=mod_vlan_vid:17,output:1
2018 ])
2019 AT_CHECK([ovs-ofctl add-flow br0 'idle_timeout=60,actions=fin_timeout(idle_timeout=5)'])
2020 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
2021 [NXST_FLOW reply:
2022  idle_timeout=60, actions=fin_timeout(idle_timeout=5)
2023 ])
2024 # Check that a TCP SYN packet does not change the timeout.  (Because
2025 # flow stats updates are mainly what implements the fin_timeout
2026 # feature, we warp forward a couple of times to ensure that flow stats
2027 # run before re-checking the flow table.)
2028 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f908004500003c2e2440004006465dac11370dac11370b828b0016751e267b00000000a00216d017360000020405b40402080a2d25085f0000000001030307])
2029 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
2030 warped
2031 ])
2032 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
2033 [NXST_FLOW reply:
2034  n_packets=1, n_bytes=74, idle_timeout=60, actions=fin_timeout(idle_timeout=5)
2035 ])
2036 # Check that a TCP FIN packet does change the timeout.
2037 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f90800451000342e3e40004006463bac11370dac11370b828b0016751e319dfc96399b801100717ae800000101080a2d250a9408579588])
2038 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
2039 warped
2040 ])
2041 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
2042 [NXST_FLOW reply:
2043  n_packets=2, n_bytes=140, idle_timeout=5, actions=fin_timeout(idle_timeout=5)
2044 ])
2045 OVS_VSWITCHD_STOP
2046 AT_CLEANUP
2047
2048 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-dps])
2049 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
2050 ADD_OF_PORTS([br0], [1], [2])
2051 ADD_OF_PORTS([br1], [3])
2052
2053 AT_CHECK([ovs-appctl dpif/dump-dps], [0], [dnl
2054 dummy@br0
2055 dummy@br1
2056 ])
2057 OVS_VSWITCHD_STOP
2058 AT_CLEANUP
2059
2060 AT_SETUP([ofproto-dpif - ovs-appctl dpif/show])
2061 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
2062 ADD_OF_PORTS([br0], [1], [2])
2063 ADD_OF_PORTS([br1], [3])
2064
2065 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
2066 dummy@ovs-dummy: hit:0 missed:0
2067         flows: cur: 0, avg: 0, max: 0, life span: 0ms
2068         overall avg: add rate: 0.000/min, del rate: 0.000/min
2069         br0: hit:0 missed:0
2070                 br0 65534/100: (dummy)
2071                 p1 1/1: (dummy)
2072                 p2 2/2: (dummy)
2073         br1: hit:0 missed:0
2074                 br1 65534/101: (dummy)
2075                 p3 3/3: (dummy)
2076 ])
2077 OVS_VSWITCHD_STOP
2078 AT_CLEANUP
2079
2080 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-flows])
2081 OVS_VSWITCHD_START([add-br br1 -- \
2082                     set bridge br1 datapath-type=dummy fail-mode=secure])
2083 ADD_OF_PORTS([br0], [1], [2])
2084 ADD_OF_PORTS([br1], [3])
2085
2086 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)'])
2087 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)'])
2088 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)'])
2089
2090 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
2091 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=192.168.0.1/0.0.0.0,dst=192.168.0.2/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller))
2092 skb_priority(0),in_port(2),eth_type(0x0800),ipv4(src=192.168.0.2/0.0.0.0,dst=192.168.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller))
2093 ])
2094
2095 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
2096 skb_priority(0),in_port(3),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller))
2097 ])
2098
2099 OVS_VSWITCHD_STOP
2100 AT_CLEANUP
2101
2102 AT_SETUP([ofproto-dpif - ovs-appctl dpif/del-flows])
2103 OVS_VSWITCHD_START([add-br br1 -- \
2104                     set bridge br1 datapath-type=dummy fail-mode=secure])
2105 ADD_OF_PORTS([br0], [1], [2])
2106 ADD_OF_PORTS([br1], [3])
2107
2108 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)'])
2109 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)'])
2110 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)'])
2111
2112 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
2113 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=192.168.0.1/0.0.0.0,dst=192.168.0.2/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller))
2114 skb_priority(0),in_port(2),eth_type(0x0800),ipv4(src=192.168.0.2/0.0.0.0,dst=192.168.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller))
2115 ])
2116
2117 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
2118 skb_priority(0),in_port(3),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller))
2119 ])
2120
2121 AT_CHECK([ovs-appctl dpif/del-flows br0])
2122 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
2123 ])
2124
2125 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
2126 skb_priority(0),in_port(3),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller))
2127 ])
2128
2129 OVS_VSWITCHD_STOP
2130 AT_CLEANUP
2131
2132 AT_SETUP([ofproto-dpif - patch ports])
2133 OVS_VSWITCHD_START([add-br br1 \
2134 -- set bridge br1 datapath-type=dummy fail-mode=secure \
2135 -- add-port br1 pbr1 -- set int pbr1 type=patch options:peer=pbr0 \
2136 -- add-port br0 pbr0 -- set int pbr0 type=patch options:peer=pbr1])
2137
2138 ADD_OF_PORTS([br0], [2])
2139 ADD_OF_PORTS([br1], [3])
2140
2141 AT_CHECK([ovs-appctl time/stop]) dnl Make life span averages consistent.
2142
2143 AT_CHECK([ovs-ofctl add-flow br0 actions=LOCAL,output:1,output:2])
2144 AT_CHECK([ovs-ofctl add-flow br1 actions=LOCAL,output:1,output:3])
2145
2146 for i in $(seq 1 10); do
2147     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)'
2148 done
2149
2150 for i in $(seq 1 5); do
2151     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)'
2152 done
2153
2154 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
2155 warped
2156 ])
2157
2158 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
2159 dummy@ovs-dummy: hit:13 missed:2
2160         flows: cur: 2, avg: 1, max: 2, life span: 1250ms
2161         overall avg: add rate: 0.000/min, del rate: 0.000/min
2162         br0: hit:9 missed:1
2163                 br0 65534/100: (dummy)
2164                 p2 2/2: (dummy)
2165                 pbr0 1/none: (patch: peer=pbr1)
2166         br1: hit:4 missed:1
2167                 br1 65534/101: (dummy)
2168                 p3 3/3: (dummy)
2169                 pbr1 1/none: (patch: peer=pbr0)
2170 ])
2171
2172 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_USED], [0], [dnl
2173 skb_priority(0),in_port(100),eth_type(0x0800),ipv4(src=192.168.0.1/0.0.0.0,dst=192.168.0.2/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:9, bytes:540, used:0.0s, actions:101,3,2
2174 ]),
2175 AT_CHECK([ovs-appctl dpif/dump-flows br1 | STRIP_USED], [0], [dnl
2176 skb_priority(0),in_port(101),eth_type(0x0800),ipv4(src=192.168.0.2/0.0.0.0,dst=192.168.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:4, bytes:240, used:0.0s, actions:100,2,3
2177 ])
2178
2179 AT_CHECK([ovs-ofctl dump-ports br0 pbr0], [0], [dnl
2180 OFPST_PORT reply (xid=0x4): 1 ports
2181   port  1: rx pkts=5, bytes=300, drop=0, errs=0, frame=0, over=0, crc=0
2182            tx pkts=10, bytes=600, drop=0, errs=0, coll=0
2183 ])
2184
2185 AT_CHECK([ovs-ofctl dump-ports br1 pbr1], [0], [dnl
2186 OFPST_PORT reply (xid=0x4): 1 ports
2187   port  1: rx pkts=10, bytes=600, drop=0, errs=0, frame=0, over=0, crc=0
2188            tx pkts=5, bytes=300, drop=0, errs=0, coll=0
2189 ])
2190
2191 OVS_VSWITCHD_STOP
2192 AT_CLEANUP
2193
2194 AT_SETUP([ofproto-dpif - ovs-appctl dpif/show rates])
2195 OVS_VSWITCHD_START([set Bridge br0 fail-mode=secure])
2196 ADD_OF_PORTS([br0], 1, 2)
2197
2198 AT_CHECK([ovs-appctl time/stop]) dnl Make life span averages consistent.
2199 AT_CHECK([ovs-ofctl add-flow br0 actions=LOCAL,output:1,output:2])
2200
2201 for i in $(seq 1 61); do
2202     ovs-appctl netdev-dummy/receive 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=64,frag=no),icmp(type=8,code=0)'
2203     ovs-appctl time/warp 10000
2204     ovs-appctl time/warp 50000
2205 done
2206
2207 AT_CHECK([ovs-appctl time/warp 10000], [0], [warped
2208 ])
2209
2210 AT_CHECK([ovs-appctl dpif/show | sed 's/ 10[[0-9]]\{3\}(ms)$/ 10000(ms)/'], [0], [dnl
2211 dummy@ovs-dummy: hit:0 missed:61
2212         flows: cur: 0, avg: 0, max: 1, life span: 1666ms
2213         hourly avg: add rate: 0.641/min, del rate: 0.641/min
2214         overall avg: add rate: 1.000/min, del rate: 1.000/min
2215         br0: hit:0 missed:61
2216                 br0 65534/100: (dummy)
2217                 p1 1/1: (dummy)
2218                 p2 2/2: (dummy)
2219 ])
2220
2221 OVS_VSWITCHD_STOP
2222 AT_CLEANUP
2223
2224 AT_SETUP([ofproto-dpif - port duration])
2225 OVS_VSWITCHD_START([set Bridge br0 protocols=OpenFlow13])
2226 ADD_OF_PORTS([br0], 1, 2)
2227
2228 ovs-appctl time/warp 10000
2229
2230 AT_CHECK([ovs-ofctl -O openflow13 dump-ports br0], [0], [stdout])
2231 AT_CHECK([sed 's/=[[0-9]][[0-9]]\(\.[[0-9]][[0-9]]*\)\{0,1\}s/=?s/' stdout], [0],
2232 [dnl
2233 OFPST_PORT reply (OF1.3) (xid=0x2): 3 ports
2234   port  1: rx pkts=0, bytes=0, drop=0, errs=0, frame=0, over=0, crc=0
2235            tx pkts=0, bytes=0, drop=0, errs=0, coll=0
2236            duration=?s
2237   port  2: rx pkts=0, bytes=0, drop=0, errs=0, frame=0, over=0, crc=0
2238            tx pkts=0, bytes=0, drop=0, errs=0, coll=0
2239            duration=?s
2240   port LOCAL: rx pkts=0, bytes=0, drop=0, errs=0, frame=0, over=0, crc=0
2241            tx pkts=0, bytes=0, drop=0, errs=0, coll=0
2242            duration=?s
2243 ])
2244 OVS_VSWITCHD_STOP
2245 AT_CLEANUP
2246
2247 dnl ----------------------------------------------------------------------
2248 AT_BANNER([ofproto-dpif -- megaflows])
2249
2250 # Strips out uninteresting parts of megaflow output, as well as parts
2251 # that vary from one run to another (e.g., timing and bond actions).
2252 m4_define([STRIP_USED], [[sed '
2253     s/used:[0-9]*\.[0-9]*/used:0.0/
2254 ' | sort]])
2255 m4_define([STRIP_XOUT], [[sed '
2256     s/used:[0-9]*\.[0-9]*/used:0.0/
2257     s/Datapath actions:.*/Datapath actions: <del>/
2258 ' | sort]])
2259
2260 AT_SETUP([ofproto-dpif megaflow - port classification])
2261 OVS_VSWITCHD_START
2262 ADD_OF_PORTS([br0], [1], [2])
2263 AT_DATA([flows.txt], [dnl
2264 table=0 in_port=1 actions=output(2)
2265 ])
2266 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2267 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),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)'])
2268 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2269 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2270 skb_priority=0,ip,in_port=1,nw_frag=no, n_subfacets:2, used:0.0s, Datapath actions: <del>
2271 ])
2272 OVS_VSWITCHD_STOP
2273 AT_CLEANUP
2274
2275 AT_SETUP([ofproto-dpif megaflow - L2 classification])
2276 OVS_VSWITCHD_START
2277 ADD_OF_PORTS([br0], [1], [2])
2278 AT_DATA([flows.txt], [dnl
2279 table=0 in_port=1,dl_src=50:54:00:00:00:09 actions=output(2)
2280 ])
2281 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2282 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),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)'])
2283 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2284 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2285 skb_priority=0,ip,in_port=1,dl_src=50:54:00:00:00:09,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: <del>
2286 skb_priority=0,ip,in_port=1,dl_src=50:54:00:00:00:0b,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: <del>
2287 ])
2288 OVS_VSWITCHD_STOP
2289 AT_CLEANUP
2290
2291 AT_SETUP([ofproto-dpif megaflow - L3 classification])
2292 OVS_VSWITCHD_START
2293 ADD_OF_PORTS([br0], [1], [2])
2294 AT_DATA([flows.txt], [dnl
2295 table=0 in_port=1,icmp,nw_src=10.0.0.4 actions=output(2)
2296 ])
2297 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2298 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),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)'])
2299 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2300 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2301 skb_priority=0,icmp,in_port=1,nw_src=10.0.0.2,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: <del>
2302 skb_priority=0,icmp,in_port=1,nw_src=10.0.0.4,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: <del>
2303 ])
2304 OVS_VSWITCHD_STOP
2305 AT_CLEANUP
2306
2307 AT_SETUP([ofproto-dpif megaflow - L4 classification])
2308 OVS_VSWITCHD_START
2309 ADD_OF_PORTS([br0], [1], [2])
2310 AT_DATA([flows.txt], [dnl
2311 table=0 in_port=1,icmp,icmp_type=8 actions=output(2)
2312 ])
2313 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2314 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),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)'])
2315 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2316 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2317 skb_priority=0,icmp,in_port=1,nw_frag=no,icmp_type=8, n_subfacets:2, used:0.0s, Datapath actions: <del>
2318 ])
2319 OVS_VSWITCHD_STOP
2320 AT_CLEANUP
2321
2322 AT_SETUP([ofproto-dpif megaflow - normal])
2323 OVS_VSWITCHD_START
2324 ADD_OF_PORTS([br0], [1], [2])
2325 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
2326 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),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)'])
2327 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2328 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2329 skb_priority=0,ip,in_port=1,vlan_tci=0x0000/0x1fff,dl_src=50:54:00:00:00:09,dl_dst=50:54:00:00:00:0a,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: <del>
2330 skb_priority=0,ip,in_port=1,vlan_tci=0x0000/0x1fff,dl_src=50:54:00:00:00:0b,dl_dst=50:54:00:00:00:0c,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: <del>
2331 ])
2332 OVS_VSWITCHD_STOP
2333 AT_CLEANUP
2334
2335 AT_SETUP([ofproto-dpif megaflow - mpls])
2336 OVS_VSWITCHD_START
2337 ADD_OF_PORTS([br0], [1], [2])
2338 AT_DATA([flows.txt], [dnl
2339 table=0 dl_src=50:54:00:00:00:09 actions=push_mpls:0x8847,2
2340 table=0 dl_src=50:54:00:00:00:0b actions=pop_mpls:0x0800,2
2341 ])
2342 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2343 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x8847),mpls(label=11,tc=3,ttl=64,bos=1)'])
2344 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0a),eth_type(0x8847),mpls(label=11,tc=3,ttl=64,bos=1)'])
2345 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2346 skb_priority=0,mpls,in_port=1,dl_src=50:54:00:00:00:09,mpls_label=11,mpls_tc=3,mpls_ttl=64,mpls_bos=1,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: <del>
2347 skb_priority=0,mpls,in_port=1,dl_src=50:54:00:00:00:0b,mpls_label=11,mpls_tc=3,mpls_ttl=64,mpls_bos=1,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: <del>
2348 ])
2349 OVS_VSWITCHD_STOP
2350 AT_CLEANUP
2351
2352 AT_SETUP([ofproto-dpif megaflow - netflow])
2353 OVS_VSWITCHD_START
2354 ADD_OF_PORTS([br0], [1], [2])
2355
2356 dnl NetFlow configuration disables wildcarding relevant fields
2357 ON_EXIT([kill `cat test-netflow.pid`])
2358 AT_CHECK([test-netflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > netflow.log], [0], [], [ignore])
2359 AT_CAPTURE_FILE([netflow.log])
2360 NETFLOW_PORT=`parse_listening_port < test-netflow.log`
2361 ovs-vsctl \
2362    set Bridge br0 netflow=@nf -- \
2363    --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
2364      engine_id=1 engine_type=2 active_timeout=30 add-id-to-interface=false
2365
2366 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
2367 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),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)'])
2368 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2369 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2370 skb_priority=0,icmp,in_port=1,vlan_tci=0x0000/0x1fff,dl_src=50:54:00:00:00:09,dl_dst=50:54:00:00:00:0a,nw_src=10.0.0.2,nw_dst=10.0.0.1,nw_tos=0,nw_frag=no,icmp_type=8,icmp_code=0, n_subfacets:1, used:0.0s, Datapath actions: <del>
2371 skb_priority=0,icmp,in_port=1,vlan_tci=0x0000/0x1fff,dl_src=50:54:00:00:00:0b,dl_dst=50:54:00:00:00:0c,nw_src=10.0.0.4,nw_dst=10.0.0.3,nw_tos=0,nw_frag=no,icmp_type=8,icmp_code=0, n_subfacets:1, used:0.0s, Datapath actions: <del>
2372 ])
2373 OVS_VSWITCHD_STOP
2374 AT_CLEANUP
2375
2376 AT_SETUP([ofproto-dpif megaflow - normal, active-backup bonding])
2377 OVS_VSWITCHD_START(
2378   [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1 -- \
2379    add-bond br0 bond0 p2 p3 bond_mode=active-backup -- \
2380    set interface p2 type=dummy ofport_request=2 -- \
2381    set interface p3 type=dummy ofport_request=3])
2382 AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK
2383 ])
2384
2385 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
2386 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),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)'])
2387 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2388 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2389 skb_priority=0,ip,in_port=1,vlan_tci=0x0000/0x1fff,dl_src=50:54:00:00:00:09,dl_dst=50:54:00:00:00:0a,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: <del>
2390 skb_priority=0,ip,in_port=1,vlan_tci=0x0000/0x1fff,dl_src=50:54:00:00:00:0b,dl_dst=50:54:00:00:00:0c,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: <del>
2391 ])
2392 OVS_VSWITCHD_STOP
2393 AT_CLEANUP
2394
2395 AT_SETUP([ofproto-dpif megaflow - normal, balance-slb bonding])
2396 OVS_VSWITCHD_START(
2397   [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1 -- \
2398    add-bond br0 bond0 p2 p3 bond_mode=balance-slb -- \
2399    set interface p2 type=dummy ofport_request=2 -- \
2400    set interface p3 type=dummy ofport_request=3])
2401 AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK
2402 ])
2403
2404 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
2405 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),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)'])
2406 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2407 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2408 skb_priority=0,ip,in_port=1,vlan_tci=0x0000/0x1fff,dl_src=50:54:00:00:00:09,dl_dst=50:54:00:00:00:0a,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: <del>
2409 skb_priority=0,ip,in_port=1,vlan_tci=0x0000/0x1fff,dl_src=50:54:00:00:00:0b,dl_dst=50:54:00:00:00:0c,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: <del>
2410 ])
2411 OVS_VSWITCHD_STOP
2412 AT_CLEANUP
2413
2414 AT_SETUP([ofproto-dpif megaflow - normal, balance-tcp bonding])
2415 # Create bond0 on br0 with interfaces p0 and p1
2416 #    and bond1 on br1 with interfaces p2 and p3
2417 # with p0 patched to p2 and p1 patched to p3.
2418 OVS_VSWITCHD_START(
2419   [add-bond br0 bond0 p0 p1 bond_mode=balance-tcp lacp=active \
2420                             other-config:lacp-time=fast \
2421                             other-config:bond-rebalance-interval=0 -- \
2422    set interface p0 type=patch options:peer=p2 ofport_request=1 -- \
2423    set interface p1 type=patch options:peer=p3 ofport_request=2 -- \
2424    add-br br1 -- \
2425    set bridge br1 other-config:hwaddr=aa:66:aa:66:00:00 -- \
2426    set bridge br1 datapath-type=dummy other-config:datapath-id=1234 \
2427                   fail-mode=secure -- \
2428    add-bond br1 bond1 p2 p3 bond_mode=balance-tcp lacp=active \
2429                             other-config:lacp-time=fast \
2430                             other-config:bond-rebalance-interval=0 -- \
2431    set interface p2 type=patch options:peer=p0 ofport_request=3 -- \
2432    set interface p3 type=patch options:peer=p1 ofport_request=4 --])
2433
2434 AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK
2435 ])
2436 ADD_OF_PORTS([br0], [7])
2437 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
2438 AT_CHECK([ovs-ofctl add-flow br1 action=normal])
2439 ovs-appctl time/warp 5000
2440 AT_CHECK([ovs-appctl netdev-dummy/receive p7 'in_port(1),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)'])
2441 AT_CHECK([ovs-appctl netdev-dummy/receive p7 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2442
2443 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2444 skb_priority=0,icmp,in_port=7,vlan_tci=0x0000/0x1fff,dl_src=50:54:00:00:00:09,dl_dst=50:54:00:00:00:0a,nw_src=10.0.0.2,nw_dst=10.0.0.1,nw_frag=no,icmp_type=8,icmp_code=0, n_subfacets:1, used:0.0s, Datapath actions: <del>
2445 skb_priority=0,icmp,in_port=7,vlan_tci=0x0000/0x1fff,dl_src=50:54:00:00:00:0b,dl_dst=50:54:00:00:00:0c,nw_src=10.0.0.4,nw_dst=10.0.0.3,nw_frag=no,icmp_type=8,icmp_code=0, n_subfacets:1, used:0.0s, Datapath actions: <del>
2446 ])
2447 OVS_VSWITCHD_STOP
2448 AT_CLEANUP
2449
2450 AT_SETUP([ofproto-dpif megaflow - resubmit port action])
2451 OVS_VSWITCHD_START
2452 ADD_OF_PORTS([br0], [1], [2])
2453 AT_DATA([flows.txt], [dnl
2454 table=0 in_port=1,ip actions=resubmit(90)
2455 table=0 in_port=90,dl_src=50:54:00:00:00:09 actions=output(2)
2456 ])
2457 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2458 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),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)'])
2459 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2460 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2461 skb_priority=0,ip,in_port=1,dl_src=50:54:00:00:00:09,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: <del>
2462 skb_priority=0,ip,in_port=1,dl_src=50:54:00:00:00:0b,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: <del>
2463 ])
2464 OVS_VSWITCHD_STOP
2465 AT_CLEANUP
2466
2467 AT_SETUP([ofproto-dpif megaflow - resubmit table action])
2468 OVS_VSWITCHD_START
2469 ADD_OF_PORTS([br0], [1], [2])
2470 AT_DATA([flows.txt], [dnl
2471 table=0 in_port=1,ip actions=resubmit(,1)
2472 table=1 dl_src=50:54:00:00:00:09 actions=output(2)
2473 ])
2474 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2475 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),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)'])
2476 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=
2477 1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2478 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2479 skb_priority=0,ip,in_port=1,dl_src=50:54:00:00:00:09,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: <del>
2480 skb_priority=0,ip,in_port=1,dl_src=50:54:00:00:00:0b,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: <del>
2481 ])
2482 OVS_VSWITCHD_STOP
2483 AT_CLEANUP
2484
2485 AT_SETUP([ofproto-dpif megaflow - goto_table action])
2486 OVS_VSWITCHD_START
2487 ADD_OF_PORTS([br0], [1], [2])
2488 AT_DATA([flows.txt], [dnl
2489 table=0 in_port=1,ip actions=goto_table(1)
2490 table=1 dl_src=50:54:00:00:00:09 actions=output(2)
2491 ])
2492 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flows br0 flows.txt])
2493 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),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)'])
2494 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2495 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2496 skb_priority=0,ip,in_port=1,dl_src=50:54:00:00:00:09,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: <del>
2497 skb_priority=0,ip,in_port=1,dl_src=50:54:00:00:00:0b,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: <del>
2498 ])
2499 OVS_VSWITCHD_STOP
2500 AT_CLEANUP
2501
2502 AT_SETUP([ofproto-dpif megaflow - mirroring, select_all])
2503 OVS_VSWITCHD_START
2504 ADD_OF_PORTS([br0], [1], [2], [3])
2505 ovs-vsctl \
2506         set Bridge br0 mirrors=@m --\
2507         --id=@p3 get Port p3 --\
2508         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
2509
2510 AT_DATA([flows.txt], [dnl
2511 in_port=1 actions=output:2
2512 ])
2513 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2514 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),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)'])
2515 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2516 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2517 skb_priority=0,ip,in_port=1,nw_frag=no, n_subfacets:2, used:0.0s, Datapath actions: <del>
2518 ])
2519 OVS_VSWITCHD_STOP
2520 AT_CLEANUP
2521
2522 AT_SETUP([ofproto-dpif megaflow - mirroring, select_vlan])
2523 OVS_VSWITCHD_START
2524 ADD_OF_PORTS([br0], [1], [2], [3])
2525 ovs-vsctl \
2526         set Bridge br0 mirrors=@m --\
2527         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
2528         --id=@m create Mirror name=mymirror select_all=true select_vlan=11 output_port=@p3
2529
2530 AT_DATA([flows.txt], [dnl
2531 in_port=1 actions=output:2
2532 ])
2533 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2534 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x8100),vlan(vid=11,pcp=7),encap(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))'])
2535 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2536 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2537 skb_priority=0,ip,in_port=1,dl_vlan=11,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: <del>
2538 skb_priority=0,ip,in_port=1,vlan_tci=0x0000/0x1fff,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: <del>
2539 ])
2540 OVS_VSWITCHD_STOP
2541 AT_CLEANUP
2542
2543 AT_SETUP([ofproto-dpif megaflow - move action])
2544 OVS_VSWITCHD_START
2545 ADD_OF_PORTS([br0], [1], [2])
2546 AT_DATA([flows.txt], [dnl
2547 table=0 in_port=1 ip,actions=move:NXM_OF_IP_SRC[[]]->NXM_NX_REG0[[]],resubmit(90)
2548 table=0 in_port=90 ip,actions=move:NXM_NX_REG0[[]]->NXM_NX_REG1[[]],resubmit(91)
2549 table=0 in_port=91 reg0=0x0a000002,actions=output(2)
2550 ])
2551 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2552 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),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)'])
2553 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2554 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2555 skb_priority=0,ip,in_port=1,nw_src=10.0.0.2,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: <del>
2556 skb_priority=0,ip,in_port=1,nw_src=10.0.0.4,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: <del>
2557 ])
2558 OVS_VSWITCHD_STOP
2559 AT_CLEANUP
2560
2561 AT_SETUP([ofproto-dpif megaflow - push action])
2562 OVS_VSWITCHD_START
2563 ADD_OF_PORTS([br0], [1], [2])
2564 AT_DATA([flows.txt], [dnl
2565 table=0 in_port=1 ip,actions=push:NXM_OF_IP_SRC[[]],output(2)
2566 ])
2567 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2568 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),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)'])
2569 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2570 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2571 skb_priority=0,ip,in_port=1,nw_src=10.0.0.2,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: <del>
2572 skb_priority=0,ip,in_port=1,nw_src=10.0.0.4,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: <del>
2573 ])
2574 OVS_VSWITCHD_STOP
2575 AT_CLEANUP
2576
2577 AT_SETUP([ofproto-dpif megaflow - learning])
2578 OVS_VSWITCHD_START
2579 ADD_OF_PORTS([br0], [1], [2])
2580 AT_DATA([flows.txt], [dnl
2581 table=0 in_port=1 actions=load:2->NXM_NX_REG0[[0..15]],learn(table=1,priority=65535,NXM_OF_ETH_SRC[[]],NXM_OF_VLAN_TCI[[0..11]],output:NXM_NX_REG0[[0..15]]),output:2
2582 ])
2583 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2584 # We send each packet twice because the first packet in each flow causes the
2585 # flow table to change and thus revalidations, which (depending on timing)
2586 # can keep a megaflow from being installed.  The revalidations are done by
2587 # the second iteration, allowing the flows to be installed.
2588 for i in 1 2; do
2589     AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),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)'])
2590     AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2591     ovs-appctl time/warp 100
2592 done
2593 dnl The original flow is missing due to a revalidation.
2594 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2595 skb_priority=0,ip,in_port=1,vlan_tci=0x0000/0x0fff,dl_src=50:54:00:00:00:09,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: <del>
2596 skb_priority=0,ip,in_port=1,vlan_tci=0x0000/0x0fff,dl_src=50:54:00:00:00:0b,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: <del>
2597 ])
2598 OVS_VSWITCHD_STOP
2599 AT_CLEANUP
2600
2601 AT_SETUP([ofproto-dpif megaflow - tunnels])
2602 OVS_VSWITCHD_START(
2603   [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1 \
2604      ofport_request=1 -- \
2605    add-port br0 p2 -- set Interface p2 type=gre options:remote_ip=1.1.1.1 \
2606      ofport_request=2 options:key=flow -- \
2607    add-port br0 p3 -- set Interface p3 type=dummy ofport_request=3 \
2608      ofport_request=3 -- \
2609    add-port br0 p4 -- set Interface p4 type=gre options:remote_ip=1.1.1.2 \
2610      options:tos=inherit options:ttl=inherit ofport_request=4 options:key=flow])
2611 AT_DATA([flows.txt], [dnl
2612 in_port=1,actions=output(2)
2613 in_port=3,actions=output(4)
2614 ])
2615 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2616 dnl ECN bits are always copied out, but don't use 0x3 (CE), since that
2617 dnl will cause the packet to be dropped.
2618 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),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=0xfd,ttl=128,frag=no),icmp(type=8,code=0)'])
2619 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0x1,ttl=64,frag=no),icmp(type=8,code=0)'])
2620 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=0xfd,ttl=128,frag=no),icmp(type=8,code=0)'])
2621 AT_CHECK([ovs-appctl netdev-dummy/receive p3 'in_port(3),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0x1,ttl=64,frag=no),icmp(type=8,code=0)'])
2622 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2623 skb_priority=0,ip,in_port=1,nw_ecn=1,nw_frag=no, n_subfacets:2, used:0.0s, Datapath actions: <del>
2624 skb_priority=0,ip,in_port=3,nw_tos=0,nw_ecn=1,nw_ttl=64,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: <del>
2625 skb_priority=0,ip,in_port=3,nw_tos=252,nw_ecn=1,nw_ttl=128,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: <del>
2626 ])
2627 OVS_VSWITCHD_STOP
2628 AT_CLEANUP
2629
2630 AT_SETUP([ofproto-dpif megaflow - dec_ttl])
2631 OVS_VSWITCHD_START
2632 ADD_OF_PORTS([br0], [1], [2])
2633 AT_DATA([flows.txt], [dnl
2634 table=0 in_port=1,icmp,nw_src=10.0.0.4 actions=dec_ttl,output(2)
2635 ])
2636 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2637 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),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)'])
2638 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2639 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2640 skb_priority=0,icmp,in_port=1,nw_src=10.0.0.2,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: <del>
2641 skb_priority=0,icmp,in_port=1,nw_src=10.0.0.4,nw_dst=10.0.0.3,nw_tos=0,nw_ecn=0,nw_ttl=64, n_subfacets:1, used:0.0s, Datapath actions: <del>
2642 ])
2643 OVS_VSWITCHD_STOP
2644 AT_CLEANUP
2645
2646 AT_SETUP([ofproto-dpif megaflow - set dl_dst])
2647 OVS_VSWITCHD_START
2648 ADD_OF_PORTS([br0], [1], [2])
2649 AT_DATA([flows.txt], [dnl
2650 table=0 in_port=1 actions=mod_dl_dst(50:54:00:00:00:0a),output(2)
2651 ])
2652 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2653 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),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)'])
2654 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2655 dnl The megaflows do not match the same fields, since the first packet
2656 dnl is essentially a no-op.  (The new destination MAC is the same as the
2657 dnl original.) The ofproto-dpif library un-wildcards the destination MAC
2658 dnl so that a packet that doesn't need its MAC address changed doesn't
2659 dnl hide one that does.  Since the first entry doesn't need to change,
2660 dnl only the destination MAC address is matched (as decided by
2661 dnl ofproto-dpif).  The second entry actually updates the destination
2662 dnl MAC, so both the source and destination MAC addresses are
2663 dnl un-wildcarded, since the ODP commit functions update both the source
2664 dnl and destination MAC addresses.
2665 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_USED], [0], [dnl
2666 skb_priority=0,ip,in_port=1,dl_dst=50:54:00:00:00:0a,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: 2
2667 skb_priority=0,ip,in_port=1,dl_src=50:54:00:00:00:0b,dl_dst=50:54:00:00:00:0c,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: set(eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0a)),2
2668 ])
2669 OVS_VSWITCHD_STOP
2670 AT_CLEANUP
2671
2672 AT_SETUP([ofproto-dpif - datapath port number change])
2673 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
2674 ADD_OF_PORTS([br0], 1)
2675
2676 # Trace a flow that should output to p1.
2677 AT_CHECK([ovs-appctl ofproto/trace br0 in_port=LOCAL,dl_src=10:20:30:40:50:60],
2678   [0], [stdout])
2679 AT_CHECK([tail -1 stdout], [0], [Datapath actions: 1
2680 ])
2681
2682 # Change p1's port number to 5.
2683 AT_CHECK([ovs-appctl dpif-dummy/change-port-number ovs-dummy p1 5])
2684
2685 # Trace a flow that should output to p1 in its new location.
2686 AT_CHECK([ovs-appctl ofproto/trace br0 in_port=LOCAL,dl_src=10:20:30:40:50:60],
2687   [0], [stdout])
2688 AT_CHECK([tail -1 stdout], [0], [Datapath actions: 5
2689 ])
2690 OVS_VSWITCHD_STOP
2691 AT_CLEANUP