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