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