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