timeval: Remove CACHE_TIME scheme.
[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 ovs-appctl time/stop
649 AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
650
651 dnl Checksum SCTP.
652 AT_CHECK([ovs-ofctl monitor br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
653
654 for i in 1 ; do
655     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'
656 done
657
658 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
659 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
660 NXT_PACKET_IN (xid=0x0): cookie=0x1 total_len=98 in_port=1 (via action) data_len=98 (unbuffered)
661 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
662 dnl
663 NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x3 total_len=102 in_port=1 reg0=0x1 (via action) data_len=102 (unbuffered)
664 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
665 dnl
666 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)
667 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
668 dnl
669 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)
670 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
671 dnl
672 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)
673 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
674 dnl
675 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)
676 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
677 dnl
678 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)
679 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
680 dnl
681 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)
682 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
683 dnl
684 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)
685 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
686 ])
687
688 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
689  cookie=0x1, n_packets=3, n_bytes=218, dl_src=20:22:22:22:22:22 actions=CONTROLLER:65535,resubmit(80,1)
690  cookie=0x2, n_packets=3, n_bytes=180, dl_src=30:33:33:33:33:33 actions=mod_vlan_vid:15,CONTROLLER:65535
691  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)
692  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)
693  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)
694  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)
695  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)
696  cookie=0x8, table=6, n_packets=3, n_bytes=218, in_port=85 actions=mod_tp_src:85,CONTROLLER:65535,resubmit(86,7)
697  cookie=0x9, table=7, n_packets=3, n_bytes=218, in_port=86 actions=mod_tp_dst:86,CONTROLLER:65535,CONTROLLER:65535
698  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
699  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
700  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
701  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
702  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
703  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
704  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
705  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
706  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
707  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
708  cookie=0xd, n_packets=3, n_bytes=186, dl_src=60:66:66:66:66:66 actions=pop_mpls:0x0800,CONTROLLER:65535
709  n_packets=3, n_bytes=180, dl_src=10:11:11:11:11:11 actions=CONTROLLER:65535
710 NXST_FLOW reply:
711 ])
712
713 OVS_VSWITCHD_STOP
714 AT_CLEANUP
715
716 AT_SETUP([ofproto-dpif - VLAN handling])
717 OVS_VSWITCHD_START(
718   [set Bridge br0 fail-mode=standalone -- \
719    add-port br0 p1                                  trunks=10,12 -- \
720    add-port br0 p2                           tag=10              -- \
721    add-port br0 p3                           tag=12              \
722                    other-config:priority-tags=true               -- \
723    add-port br0 p4                           tag=12              -- \
724    add-port br0 p5 vlan_mode=native-tagged   tag=10              -- \
725    add-port br0 p6 vlan_mode=native-tagged   tag=10 trunks=10,12 -- \
726    add-port br0 p7 vlan_mode=native-untagged tag=12              -- \
727    add-port br0 p8 vlan_mode=native-untagged tag=12 trunks=10,12 \
728                    other-config:priority-tags=true               -- \
729    set Interface p1 type=dummy -- \
730    set Interface p2 type=dummy -- \
731    set Interface p3 type=dummy -- \
732    set Interface p4 type=dummy -- \
733    set Interface p5 type=dummy -- \
734    set Interface p6 type=dummy -- \
735    set Interface p7 type=dummy -- \
736    set Interface p8 type=dummy --])
737
738 dnl Each of these specifies an in_port by number, a VLAN VID (or "none"),
739 dnl a VLAN PCP (used if the VID isn't "none") and the expected set of datapath
740 dnl actions.
741 for tuple in \
742         "100 none 0 drop" \
743         "100 0    0 drop" \
744         "100 0    1 drop" \
745         "100 10   0 1,5,6,7,8,pop_vlan,2" \
746         "100 10   1 1,5,6,7,8,pop_vlan,2" \
747         "100 11   0 5,7" \
748         "100 11   1 5,7" \
749         "100 12   0 1,5,6,pop_vlan,3,4,7,8" \
750         "100 12   1 1,5,6,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
751         "1  none 0 drop" \
752         "1  0    0 drop" \
753         "1  0    1 drop" \
754         "1  10   0 5,6,7,8,100,pop_vlan,2" \
755         "1  10   1 5,6,7,8,100,pop_vlan,2" \
756         "1  11   0 drop" \
757         "1  11   1 drop" \
758         "1  12   0 5,6,100,pop_vlan,3,4,7,8" \
759         "1  12   1 5,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
760         "2  none 0 push_vlan(vid=10,pcp=0),1,5,6,7,8,100" \
761         "2  0    0 pop_vlan,push_vlan(vid=10,pcp=0),1,5,6,7,8,100" \
762         "2  0    1 pop_vlan,push_vlan(vid=10,pcp=1),1,5,6,7,8,100" \
763         "2  10   0 drop" \
764         "2  10   1 drop" \
765         "2  11   0 drop" \
766         "2  11   1 drop" \
767         "2  12   0 drop" \
768         "2  12   1 drop" \
769         "3  none 0 4,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
770         "3  0    0 pop_vlan,4,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
771         "3  0    1 8,pop_vlan,4,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
772         "3  10   0 drop" \
773         "3  10   1 drop" \
774         "3  11   0 drop" \
775         "3  11   1 drop" \
776         "3  12   0 drop" \
777         "3  12   1 drop" \
778         "4  none 0 3,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
779         "4  0    0 pop_vlan,3,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
780         "4  0    1 3,8,pop_vlan,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
781         "4  10   0 drop" \
782         "4  10   1 drop" \
783         "4  11   0 drop" \
784         "4  11   1 drop" \
785         "4  12   0 drop" \
786         "4  12   1 drop" \
787         "5  none 0 2,push_vlan(vid=10,pcp=0),1,6,7,8,100" \
788         "5  0    0 pop_vlan,2,push_vlan(vid=10,pcp=0),1,6,7,8,100" \
789         "5  0    1 pop_vlan,2,push_vlan(vid=10,pcp=1),1,6,7,8,100" \
790         "5  10   0 1,6,7,8,100,pop_vlan,2" \
791         "5  10   1 1,6,7,8,100,pop_vlan,2" \
792         "5  11   0 7,100" \
793         "5  11   1 7,100" \
794         "5  12   0 1,6,100,pop_vlan,3,4,7,8" \
795         "5  12   1 1,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
796         "6  none 0 2,push_vlan(vid=10,pcp=0),1,5,7,8,100" \
797         "6  0    0 pop_vlan,2,push_vlan(vid=10,pcp=0),1,5,7,8,100" \
798         "6  0    1 pop_vlan,2,push_vlan(vid=10,pcp=1),1,5,7,8,100" \
799         "6  10   0 1,5,7,8,100,pop_vlan,2" \
800         "6  10   1 1,5,7,8,100,pop_vlan,2" \
801         "6  11   0 drop" \
802         "6  11   1 drop" \
803         "6  12   0 1,5,100,pop_vlan,3,4,7,8" \
804         "6  12   1 1,5,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
805         "7  none 0 3,4,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
806         "7  0    0 pop_vlan,3,4,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
807         "7  0    1 3,8,pop_vlan,4,push_vlan(vid=12,pcp=1),1,5,6,100" \
808         "7  10   0 1,5,6,8,100,pop_vlan,2" \
809         "7  10   1 1,5,6,8,100,pop_vlan,2" \
810         "7  11   0 5,100" \
811         "7  11   1 5,100" \
812         "7  12   0 1,5,6,100,pop_vlan,3,4,8" \
813         "7  12   1 1,5,6,100,pop_vlan,4,push_vlan(vid=0,pcp=1),3,8" \
814         "8  none 0 3,4,7,push_vlan(vid=12,pcp=0),1,5,6,100" \
815         "8  0    0 pop_vlan,3,4,7,push_vlan(vid=12,pcp=0),1,5,6,100" \
816         "8  0    1 3,pop_vlan,4,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
817         "8  10   0 1,5,6,7,100,pop_vlan,2" \
818         "8  10   1 1,5,6,7,100,pop_vlan,2" \
819         "8  11   0 drop" \
820         "8  11   1 drop" \
821         "8  12   0 1,5,6,100,pop_vlan,3,4,7" \
822         "8  12   1 1,5,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3"
823 do
824   set $tuple
825   in_port=$1
826   vlan=$2
827   pcp=$3
828   expected=$4
829
830   if test $vlan = none; then
831     flow="in_port($in_port),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff),eth_type(0xabcd)"
832   else
833     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))"
834   fi
835
836   echo "----------------------------------------------------------------------"
837   echo "in_port=$in_port vlan=$vlan pcp=$pcp"
838
839   AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
840   actual=`tail -1 stdout | sed 's/Datapath actions: //'`
841
842   AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
843   mv stdout expout
844   AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
845 done
846
847 OVS_VSWITCHD_STOP
848 AT_CLEANUP
849
850 AT_SETUP([ofproto-dpif - fragment handling])
851 OVS_VSWITCHD_START
852 ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6], [90])
853 AT_DATA([flows.txt], [dnl
854 priority=75 tcp ip_frag=no    tp_dst=80 actions=output:1
855 priority=75 tcp ip_frag=first tp_dst=80 actions=output:2
856 priority=75 tcp ip_frag=later tp_dst=80 actions=output:3
857 priority=50 tcp ip_frag=no              actions=output:4
858 priority=50 tcp ip_frag=first           actions=output:5
859 priority=50 tcp ip_frag=later           actions=output:6
860 ])
861 AT_CHECK([ovs-ofctl replace-flows br0 flows.txt])
862
863 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"
864 no_flow="$base_flow,frag=no),tcp(src=12345,dst=80)"
865 first_flow="$base_flow,frag=first),tcp(src=12345,dst=80)"
866 later_flow="$base_flow,frag=later)"
867
868     # mode    no  first  later
869 for tuple in \
870     'normal    1     5      6' \
871     'drop      1  drop   drop' \
872     'nx-match  1     2      6'
873 do
874   set $tuple
875   mode=$1
876   no=$2
877   first=$3
878   later=$4
879
880   AT_CHECK([ovs-ofctl set-frags br0 $mode])
881   for type in no first later; do
882     eval flow=\$${type}_flow exp_output=\$$type
883     printf "\n%s\n" "----$mode $type-----"
884     AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
885     : > expout
886     if test $mode = drop && test $type != no; then
887         echo 'Packets dropped because they are IP fragments and the fragment handling mode is "drop".' >> expout
888     fi
889     echo "Datapath actions: $exp_output" >> expout
890     AT_CHECK([grep 'IP fragments' stdout; tail -1 stdout], [0], [expout])
891   done
892 done
893 OVS_VSWITCHD_STOP
894 AT_CLEANUP
895
896 AT_SETUP([ofproto-dpif - exit])
897 OVS_VSWITCHD_START
898 ADD_OF_PORTS([br0], [1], [2], [3], [10], [11], [12], [13], [14])
899 AT_DATA([flows.txt], [dnl
900 in_port=1 actions=output:10,exit,output:11
901 in_port=2 actions=output:12,resubmit:1,output:12
902 in_port=3 actions=output:13,resubmit:2,output:14
903 ])
904 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
905 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])
906 AT_CHECK([tail -1 stdout], [0],
907   [Datapath actions: 10
908 ])
909 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])
910 AT_CHECK([tail -1 stdout], [0],
911   [Datapath actions: 12,10
912 ])
913 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])
914 AT_CHECK([tail -1 stdout], [0],
915   [Datapath actions: 13,12,10
916 ])
917 OVS_VSWITCHD_STOP
918 AT_CLEANUP
919
920
921 AT_SETUP([ofproto-dpif - mirroring, select_all])
922 OVS_VSWITCHD_START
923 ADD_OF_PORTS([br0], 1, 2, 3)
924 ovs-vsctl \
925         set Bridge br0 mirrors=@m --\
926         --id=@p3 get Port p3 --\
927         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
928
929 AT_DATA([flows.txt], [dnl
930 in_port=1 actions=output:2
931 in_port=2 actions=output:1
932 ])
933 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
934
935 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)"
936 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
937 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
938   [Datapath actions: 2,3
939 ])
940
941 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)"
942 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
943 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
944   [Datapath actions: 1,3
945 ])
946
947 OVS_VSWITCHD_STOP
948 AT_CLEANUP
949
950
951 AT_SETUP([ofproto-dpif - mirroring, select_src])
952 OVS_VSWITCHD_START
953 ADD_OF_PORTS([br0], 1, 2, 3)
954 ovs-vsctl \
955         set Bridge br0 mirrors=@m --\
956         --id=@p1 get Port p1 -- --id=@p3 get Port p3 --\
957         --id=@m create Mirror name=mymirror select_src_port=@p1 output_port=@p3
958
959 AT_DATA([flows.txt], [dnl
960 in_port=1 actions=output:2
961 in_port=2 actions=output:1
962 ])
963 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
964
965 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)"
966 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
967 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
968   [Datapath actions: 2,3
969 ])
970
971 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)"
972 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
973 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
974   [Datapath actions: 1
975 ])
976 OVS_VSWITCHD_STOP
977 AT_CLEANUP
978
979 AT_SETUP([ofproto-dpif - mirroring, OFPP_NONE ingress port])
980 OVS_VSWITCHD_START
981 ADD_OF_PORTS([br0], 1, 2)
982 ovs-vsctl \
983         set Bridge br0 mirrors=@m --\
984         --id=@p2 get Port p2 --\
985         --id=@m create Mirror name=mymirror select_all=true output_port=@p2
986
987 AT_CHECK([ovs-ofctl add-flow br0 action=output:1])
988
989 # "in_port" defaults to OFPP_NONE if it's not specified.
990 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"
991 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
992 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
993   [Datapath actions: 1,2
994 ])
995
996 OVS_VSWITCHD_STOP
997 AT_CLEANUP
998
999
1000 AT_SETUP([ofproto-dpif - mirroring, select_dst])
1001 OVS_VSWITCHD_START
1002 ADD_OF_PORTS([br0], 1, 2, 3)
1003 ovs-vsctl \
1004         set Bridge br0 mirrors=@m --\
1005         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
1006         --id=@m create Mirror name=mymirror select_dst_port=@p2 output_port=@p3
1007
1008 AT_DATA([flows.txt], [dnl
1009 in_port=1 actions=output:2
1010 in_port=2 actions=output:1
1011 ])
1012 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1013
1014 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)"
1015 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1016 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1017   [Datapath actions: 2,3
1018 ])
1019
1020 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)"
1021 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1022 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1023   [Datapath actions: 1
1024 ])
1025
1026 OVS_VSWITCHD_STOP
1027 AT_CLEANUP
1028
1029
1030 AT_SETUP([ofproto-dpif - mirroring, select_vlan])
1031 OVS_VSWITCHD_START
1032 ADD_OF_PORTS([br0], 1, 2, 3)
1033 ovs-vsctl \
1034         set Bridge br0 mirrors=@m --\
1035         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
1036         --id=@m create Mirror name=mymirror select_all=true select_vlan=11 output_port=@p3
1037
1038 AT_DATA([flows.txt], [dnl
1039 in_port=1, actions=output:2
1040 ])
1041 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1042
1043 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)"
1044 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1045 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1046   [Datapath actions: 2
1047 ])
1048
1049 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))"
1050 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1051 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1052   [Datapath actions: 2
1053 ])
1054
1055 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))"
1056 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1057 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1058   [Datapath actions: 2,3
1059 ])
1060
1061 OVS_VSWITCHD_STOP
1062 AT_CLEANUP
1063
1064
1065 AT_SETUP([ofproto-dpif - mirroring, output_port])
1066 OVS_VSWITCHD_START
1067 ADD_OF_PORTS([br0], 1, 2, 3)
1068 ovs-vsctl \
1069         set Bridge br0 mirrors=@m --\
1070         --id=@p3 get Port p3 --\
1071         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
1072
1073 AT_DATA([flows.txt], [dnl
1074 in_port=1 actions=mod_vlan_vid:17,output:2
1075 in_port=2 actions=output:1
1076 ])
1077 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1078
1079 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)"
1080 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1081 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1082   [Datapath actions: push_vlan(vid=17,pcp=0),2,pop_vlan,3
1083 ])
1084
1085 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)"
1086 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1087 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1088   [Datapath actions: 1,3
1089 ])
1090
1091 OVS_VSWITCHD_STOP
1092 AT_CLEANUP
1093
1094 AT_SETUP([ofproto-dpif - mirroring, output_vlan])
1095 OVS_VSWITCHD_START
1096 ADD_OF_PORTS([br0], 1, 2)
1097 ovs-vsctl \
1098         set Bridge br0 mirrors=@m --\
1099         --id=@m create Mirror name=mymirror select_all=true output_vlan=12
1100
1101 AT_DATA([flows.txt], [dnl
1102 in_port=1 actions=output:2
1103 in_port=2 actions=mod_vlan_vid:17,output:1
1104 ])
1105 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1106
1107 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)"
1108 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1109 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1110
1111 expected="2,push_vlan(vid=12,pcp=0),1,2,100"
1112 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
1113 mv stdout expout
1114 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
1115
1116 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)"
1117 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1118 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1119
1120 expected="push_vlan(vid=17,pcp=0),1,pop_vlan,push_vlan(vid=12,pcp=0),1,2,100"
1121 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
1122 mv stdout expout
1123 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
1124
1125 OVS_VSWITCHD_STOP
1126 AT_CLEANUP
1127
1128 # Two testcases below are for the ofproto/trace command
1129 # The first one tests all correct syntax:
1130 # ofproto/trace [dp_name] odp_flow [-generate|packet]
1131 # ofproto/trace br_name br_flow [-generate|packet]
1132 AT_SETUP([ofproto-dpif - ofproto/trace command 1])
1133 OVS_VSWITCHD_START([set bridge br0 fail-mode=standalone])
1134 ADD_OF_PORTS([br0], 1, 2, 3)
1135
1136 AT_DATA([flows.txt], [dnl
1137 in_port=1 actions=output:2
1138 in_port=2 actions=output:1
1139 ])
1140 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1141
1142 odp_flow="in_port(1)"
1143 br_flow="in_port=1"
1144 # Test command: ofproto/trace odp_flow
1145 AT_CHECK([ovs-appctl ofproto/trace "$odp_flow"], [0], [stdout])
1146 AT_CHECK([tail -1 stdout], [0], [dnl
1147 Datapath actions: 2
1148 ])
1149
1150 # Test command: ofproto/trace dp_name odp_flow
1151 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$odp_flow"], [0], [stdout])
1152 AT_CHECK([tail -1 stdout], [0], [dnl
1153 Datapath actions: 2
1154 ])
1155 # Test commmand: ofproto/trace br_name br_flow
1156 AT_CHECK([ovs-appctl ofproto/trace br0 "$br_flow"], [0], [stdout])
1157 AT_CHECK([tail -1 stdout], [0], [dnl
1158 Datapath actions: 2
1159 ])
1160
1161 # Delete the inserted flows
1162 AT_CHECK([ovs-ofctl del-flows br0 "in_port=1"], [0], [stdout])
1163 AT_CHECK([ovs-ofctl del-flows br0 "in_port=2"], [0], [stdout])
1164
1165 # This section beflow tests the [-generate] option
1166 odp_flow="in_port(3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff)"
1167 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"
1168
1169 # Test command: ofproto/trace odp_flow
1170 AT_CHECK([ovs-appctl ofproto/trace "$odp_flow"], [0], [stdout])
1171 # Check for no MAC learning entry
1172 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1173  port  VLAN  MAC                Age
1174 ])
1175
1176 # Test command: ofproto/trace br_name br_flow
1177 AT_CHECK([ovs-appctl ofproto/trace br0 "$br_flow"], [0], [stdout])
1178 # Check for no MAC learning entry
1179 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1180  port  VLAN  MAC                Age
1181 ])
1182
1183 # Test command: ofproto/trace odp_flow -generate
1184 AT_CHECK([ovs-appctl ofproto/trace "$odp_flow" -generate], [0], [stdout])
1185 # Check for the MAC learning entry
1186 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1187  port  VLAN  MAC                Age
1188     3     0  50:54:00:00:00:05    ?
1189 ])
1190
1191 # Test command: ofproto/trace dp_name odp_flow -generate
1192 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy \
1193   "in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05)" \
1194   -generate], [0], [stdout])
1195 # Check for both MAC learning entries
1196 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1197  port  VLAN  MAC                Age
1198     3     0  50:54:00:00:00:05    ?
1199     1     0  50:54:00:00:00:06    ?
1200 ])
1201
1202 # Test command: ofproto/trace br_name br_flow -generate
1203 AT_CHECK([ovs-appctl ofproto/trace br0 \
1204   "in_port=2,dl_src=50:54:00:00:00:07,dl_dst=50:54:00:00:00:06" \
1205   -generate], [0], [stdout])
1206 # Check for both MAC learning entries.
1207 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1208  port  VLAN  MAC                Age
1209     3     0  50:54:00:00:00:05    ?
1210     1     0  50:54:00:00:00:06    ?
1211     2     0  50:54:00:00:00:07    ?
1212 ])
1213
1214 # This section beflow tests the [packet] option
1215 # The ovs-tcpundump of packets between port1 and port2
1216 pkt1to2="50540000000250540000000108064500001C000100004001F98CC0A80001C0A800020800F7FF00000000"
1217 pkt2to1="50540000000150540000000208064500001C000100004001F98CC0A80002C0A800010800F7FF00000000"
1218
1219 # Construct the MAC learning table
1220 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy \
1221   "in_port(1),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff)" \
1222   -generate], [0], [stdout])
1223
1224 # Construct the MAC learning table
1225 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy \
1226   "in_port(2),eth(src=50:54:00:00:00:02,dst=ff:ff:ff:ff:ff:ff)" \
1227   -generate], [0], [stdout])
1228
1229 # Test command: ofproto/trace odp_flow packet
1230 AT_CHECK([ovs-appctl ofproto/trace \
1231   "in_port(1),skb_priority(1),skb_mark(2)" "$pkt1to2"], [0], [stdout])
1232 AT_CHECK([tail -1 stdout], [0], [dnl
1233 Datapath actions: 2
1234 ])
1235 AT_CHECK([head -n 3 stdout], [0], [dnl
1236 Bridge: br0
1237 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
1238 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
1239 ])
1240
1241 # Test command: ofproto/trace dp_name odp_flow packet
1242 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy \
1243   "in_port(1),skb_priority(1),skb_mark(2)" "$pkt1to2"], [0], [stdout])
1244 AT_CHECK([tail -1 stdout], [0], [dnl
1245 Datapath actions: 2
1246 ])
1247 AT_CHECK([head -n 3 stdout], [0], [dnl
1248 Bridge: br0
1249 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
1250 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
1251 ])
1252
1253 # Test command: ofproto/trace br_name br_flow packet
1254 AT_CHECK([ovs-appctl ofproto/trace br0 \
1255   "in_port=2,skb_priority=2,pkt_mark=1" "$pkt2to1"], [0], [stdout],[stderr])
1256 AT_CHECK([tail -1 stdout], [0], [dnl
1257 Datapath actions: 1
1258 ])
1259 AT_CHECK([head -n 2 stdout], [0], [dnl
1260 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
1261 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
1262 ])
1263
1264 OVS_VSWITCHD_STOP
1265 AT_CLEANUP
1266
1267 # The second test tests the corner cases
1268 AT_SETUP([ofproto-dpif - ofproto/trace command 2])
1269 OVS_VSWITCHD_START
1270 ADD_OF_PORTS([br0], 1, 2)
1271
1272 # Define flows
1273 odp_flow="in_port(1),eth(src=50:54:00:00:00:01,dst=50:54:00:00:00:02)"
1274 br_flow="in_port=1,dl_src=50:54:00:00:00:01,dl_dst=50:54:00:00:00:02"
1275 # Define options
1276 generate="-generate"
1277 pkt="50540000000250540000000108064500001C000100004001F98CC0A80001C0A800020800F7FF00000000"
1278
1279 # Test incorrect command: ofproto/trace wrong_name odp_flow [-generate|packet]
1280 m4_foreach(
1281 [option],
1282 [[],
1283 ["$generate"],
1284 ["$pkt"]],
1285 [AT_CHECK([ovs-appctl ofproto/trace wrong_name "$odp_flow" option],
1286   [2], [], [stderr])
1287 AT_CHECK([tail -2 stderr], [0], [dnl
1288 Cannot find datapath of this name
1289 ovs-appctl: ovs-vswitchd: server returned an error
1290 ])])
1291
1292 # Test incorrect command: ofproto/trace empty_string odp_flow [-generate|packet]
1293 m4_foreach(
1294 [option],
1295 [[],
1296 ["$generate"],
1297 ["$pkt"]],
1298 [AT_CHECK([ovs-appctl ofproto/trace "" "$odp_flow" option],
1299   [2], [], [stderr])
1300 AT_CHECK([tail -2 stderr], [0], [dnl
1301 Cannot find datapath of this name
1302 ovs-appctl: ovs-vswitchd: server returned an error
1303 ])])
1304
1305 # Test incorrect command: ofproto/trace nonexist_dp_name odp_flow [-generate|packet]
1306 m4_foreach(
1307 [option],
1308 [[],
1309 ["$generate"],
1310 ["$pkt"]],
1311 [AT_CHECK([ovs-appctl ofproto/trace ovs-system "$odp_flow" option],
1312   [2], [], [stderr])
1313 AT_CHECK([tail -2 stderr], [0], [dnl
1314 Cannot find datapath of this name
1315 ovs-appctl: ovs-vswitchd: server returned an error
1316 ])])
1317
1318 # Test incorrect command: ofproto/trace br_name odp_flow [-generate|packet]
1319 m4_foreach(
1320 [option],
1321 [[],
1322 ["$generate"],
1323 ["$pkt"]],
1324 [AT_CHECK([ovs-appctl ofproto/trace br0 "$odp_flow" option],
1325   [2], [], [stderr])
1326 AT_CHECK([tail -2 stderr], [0], [dnl
1327 Cannot find datapath of this name
1328 ovs-appctl: ovs-vswitchd: server returned an error
1329 ])])
1330
1331 # Test incorrect command: ofproto/trace dp_name br_flow [-generate|packet]
1332 m4_foreach(
1333 [option],
1334 [[],
1335 ["$generate"],
1336 ["$pkt"]],
1337 [AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$br_flow" option],
1338   [2], [], [stderr])
1339 AT_CHECK([tail -2 stderr], [0], [dnl
1340 Unknown bridge name
1341 ovs-appctl: ovs-vswitchd: server returned an error
1342 ])])
1343
1344 # Test incorrect command: ofproto/trace br_flow [-generate|packet]
1345 m4_foreach(
1346 [option],
1347 [[],
1348 ["$generate"],
1349 ["$pkt"]],
1350 [AT_CHECK([ovs-appctl ofproto/trace "$br_flow" option],
1351   [2], [], [stderr])
1352 AT_CHECK([tail -2 stderr], [0], [dnl
1353 Must specify bridge name
1354 ovs-appctl: ovs-vswitchd: server returned an error
1355 ])])
1356
1357 # Test incorrect command: ofproto/trace dp_name odp_flow garbage_option
1358 AT_CHECK([ovs-appctl ofproto/trace \
1359   ovs-dummy "$odp_flow" garbage_option],
1360   [2], [stdout],[stderr])
1361 AT_CHECK([tail -2 stderr], [0], [dnl
1362 Trailing garbage in packet data
1363 ovs-appctl: ovs-vswitchd: server returned an error
1364 ])
1365
1366 # Test incorrect command: ofproto/trace with 4 arguments
1367 AT_CHECK([ovs-appctl ofproto/trace \
1368   arg1, arg2, arg3, arg4], [2], [stdout],[stderr])
1369 AT_CHECK([tail -2 stderr], [0], [dnl
1370 "ofproto/trace" command takes at most 3 arguments
1371 ovs-appctl: ovs-vswitchd: server returned an error
1372 ])
1373
1374 # Test incorrect command: ofproto/trace with 0 argument
1375 AT_CHECK([ovs-appctl ofproto/trace ], [2], [stdout],[stderr])
1376 AT_CHECK([tail -2 stderr], [0], [dnl
1377 "ofproto/trace" command requires at least 1 arguments
1378 ovs-appctl: ovs-vswitchd: server returned an error
1379 ])
1380
1381 OVS_VSWITCHD_STOP
1382 AT_CLEANUP
1383
1384 m4_define([OFPROTO_TRACE],
1385   [flow="$2"
1386    AT_CHECK([ovs-appctl ofproto/trace $1 "$flow" $3], [0], [stdout])
1387    actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1388    expected="$4"
1389    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" $5],
1390      [0], [stdout])
1391    mv stdout expout
1392    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" $5],
1393      [0], [expout])])
1394
1395 AT_SETUP([ofproto-dpif - MAC learning])
1396 OVS_VSWITCHD_START([set bridge br0 fail-mode=standalone])
1397 ADD_OF_PORTS([br0], 1, 2, 3)
1398
1399 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)'
1400
1401 # Trace an ARP packet arriving on p3, to create a MAC learning entry.
1402 OFPROTO_TRACE(
1403   [ovs-dummy],
1404   [in_port(3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
1405   [-generate],
1406   [1,2,100])
1407
1408 # Check for the MAC learning entry.
1409 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1410  port  VLAN  MAC                Age
1411     3     0  50:54:00:00:00:05    ?
1412 ])
1413
1414 # Trace a packet arrival destined for the learned MAC.
1415 # (This will also learn a MAC.)
1416 OFPROTO_TRACE(
1417   [ovs-dummy],
1418   [in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05),$arp],
1419   [-generate],
1420   [3])
1421
1422 # Check for both MAC learning entries.
1423 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1424  port  VLAN  MAC                Age
1425     3     0  50:54:00:00:00:05    ?
1426     1     0  50:54:00:00:00:06    ?
1427 ])
1428
1429 # Trace a packet arrival that updates the first learned MAC entry.
1430 OFPROTO_TRACE(
1431   [ovs-dummy],
1432   [in_port(2),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
1433   [-generate],
1434   [1,3,100])
1435
1436 # Check that the MAC learning entry was updated.
1437 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1438  port  VLAN  MAC                Age
1439     1     0  50:54:00:00:00:06    ?
1440     2     0  50:54:00:00:00:05    ?
1441 ])
1442
1443 # Add another bridge.
1444 AT_CHECK(
1445   [ovs-vsctl \
1446      -- add-br br1 \
1447      -- set bridge br1 datapath-type=dummy])
1448 ADD_OF_PORTS([br1], 4, 5)
1449
1450 # Trace some packet arrivals in br1 to create MAC learning entries there too.
1451 OFPROTO_TRACE(
1452   [ovs-dummy],
1453   [in_port(4),eth(src=50:54:00:00:00:06,dst=ff:ff:ff:ff:ff:ff),$arp],
1454   [-generate],
1455   [5,101])
1456 OFPROTO_TRACE(
1457   [ovs-dummy],
1458   [in_port(5),eth(src=50:54:00:00:00:07,dst=ff:ff:ff:ff:ff:ff),$arp],
1459   [-generate],
1460   [4,101])
1461
1462 # Check that the MAC learning entries were added.
1463 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1464  port  VLAN  MAC                Age
1465     4     0  50:54:00:00:00:06    ?
1466     5     0  50:54:00:00:00:07    ?
1467 ])
1468
1469 # Delete port p1 and see that its MAC learning entry disappeared, and
1470 # that the MAC learning entry for the same MAC was also deleted from br1.
1471 AT_CHECK([ovs-vsctl del-port p1])
1472 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1473  port  VLAN  MAC                Age
1474     2     0  50:54:00:00:00:05    ?
1475 ])
1476 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1477  port  VLAN  MAC                Age
1478     5     0  50:54:00:00:00:07    ?
1479 ])
1480
1481 OVS_VSWITCHD_STOP
1482 AT_CLEANUP
1483
1484 AT_SETUP([ofproto-dpif - MAC table overflow])
1485 OVS_VSWITCHD_START(
1486   [set bridge br0 fail-mode=standalone other-config:mac-table-size=10])
1487 ADD_OF_PORTS([br0], 1, 2, 3)
1488
1489 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)'
1490
1491 AT_CHECK([ovs-appctl time/stop])
1492
1493 # Trace 10 ARP packets arriving on p3, to create MAC learning entries.
1494 for i in 0 1 2 3 4 5 6 7 8 9; do
1495     OFPROTO_TRACE(
1496       [ovs-dummy],
1497       [in_port(3),eth(src=50:54:00:00:00:0$i,dst=ff:ff:ff:ff:ff:ff),$arp],
1498       [-generate],
1499       [1,2,100])
1500     ovs-appctl time/warp 1000
1501 done
1502
1503 # Check for the MAC learning entries.
1504 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/ *[[0-9]]\{1,\}$//' | sort],
1505   [0], [dnl
1506     3     0  50:54:00:00:00:00
1507     3     0  50:54:00:00:00:01
1508     3     0  50:54:00:00:00:02
1509     3     0  50:54:00:00:00:03
1510     3     0  50:54:00:00:00:04
1511     3     0  50:54:00:00:00:05
1512     3     0  50:54:00:00:00:06
1513     3     0  50:54:00:00:00:07
1514     3     0  50:54:00:00:00:08
1515     3     0  50:54:00:00:00:09
1516  port  VLAN  MAC                Age
1517 ])
1518
1519 # Trace another ARP packet on another MAC.
1520 OFPROTO_TRACE(
1521   [ovs-dummy],
1522   [in_port(3),eth(src=50:54:00:00:00:10,dst=ff:ff:ff:ff:ff:ff),$arp],
1523   [-generate],
1524   [1,2,100])
1525
1526 # Check that the new one chased the oldest one out of the table.
1527 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/' | sort],
1528   [0], [dnl
1529     3     0  50:54:00:00:00:01    ?
1530     3     0  50:54:00:00:00:02    ?
1531     3     0  50:54:00:00:00:03    ?
1532     3     0  50:54:00:00:00:04    ?
1533     3     0  50:54:00:00:00:05    ?
1534     3     0  50:54:00:00:00:06    ?
1535     3     0  50:54:00:00:00:07    ?
1536     3     0  50:54:00:00:00:08    ?
1537     3     0  50:54:00:00:00:09    ?
1538     3     0  50:54:00:00:00:10    ?
1539  port  VLAN  MAC                Age
1540 ])
1541 OVS_VSWITCHD_STOP
1542 AT_CLEANUP
1543
1544 dnl Test that sFlow samples packets correctly.
1545 AT_SETUP([ofproto-dpif - sFlow packet sampling])
1546 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
1547
1548 ON_EXIT([kill `cat test-sflow.pid`])
1549 AT_CHECK([test-sflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > sflow.log], [0], [], [ignore])
1550 AT_CAPTURE_FILE([sflow.log])
1551 SFLOW_PORT=`parse_listening_port < test-sflow.log`
1552
1553 ovs-appctl time/stop
1554
1555 ADD_OF_PORTS([br0], 1, 2)
1556 ovs-vsctl \
1557    set Interface br0 options:ifindex=1002 -- \
1558    set Interface p1 options:ifindex=1004 -- \
1559    set Interface p2 options:ifindex=1003 -- \
1560    set Bridge br0 sflow=@sf -- \
1561    --id=@sf create sflow targets=\"127.0.0.1:$SFLOW_PORT\" \
1562      header=128 sampling=1 polling=1
1563
1564 dnl open with ARP packets to seed the bridge-learning.  The output
1565 dnl ifIndex numbers should be reported predictably after that.
1566 dnl Since we set sampling=1 we should see all of these packets
1567 dnl reported. Sorting the output by data-source and seqNo makes
1568 dnl it deterministic. Ensuring that we send at least two packets
1569 dnl into each port means we get to check the seq nos are
1570 dnl incrementing correctly.
1571
1572 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)'
1573 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)'
1574 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)'
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(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)'
1576 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)'
1577
1578 dnl sleep long enough to get more than one counter sample
1579 dnl from each datasource so we can check sequence numbers
1580 for i in `seq 1 30`; do
1581     ovs-appctl time/warp 100
1582 done
1583 OVS_VSWITCHD_STOP
1584 ovs-appctl -t test-sflow exit
1585
1586 AT_CHECK([[sort sflow.log | $EGREP 'HEADER|ERROR' | sed 's/ /\
1587         /g']], [0], [dnl
1588 HEADER
1589         dgramSeqNo=1
1590         ds=127.0.0.1>2:1000
1591         fsSeqNo=1
1592         in_vlan=0
1593         in_priority=0
1594         out_vlan=0
1595         out_priority=0
1596         meanSkip=1
1597         samplePool=1
1598         dropEvents=0
1599         in_ifindex=1004
1600         in_format=0
1601         out_ifindex=2
1602         out_format=2
1603         hdr_prot=1
1604         pkt_len=64
1605         stripped=4
1606         hdr_len=60
1607         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
1608 HEADER
1609         dgramSeqNo=1
1610         ds=127.0.0.1>2:1000
1611         fsSeqNo=2
1612         in_vlan=0
1613         in_priority=0
1614         out_vlan=0
1615         out_priority=0
1616         meanSkip=1
1617         samplePool=2
1618         dropEvents=0
1619         in_ifindex=1003
1620         in_format=0
1621         out_ifindex=2
1622         out_format=2
1623         hdr_prot=1
1624         pkt_len=64
1625         stripped=4
1626         hdr_len=60
1627         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
1628 HEADER
1629         dgramSeqNo=1
1630         ds=127.0.0.1>2:1000
1631         fsSeqNo=3
1632         in_vlan=0
1633         in_priority=0
1634         out_vlan=0
1635         out_priority=0
1636         meanSkip=1
1637         samplePool=3
1638         dropEvents=0
1639         in_ifindex=1004
1640         in_format=0
1641         out_ifindex=1003
1642         out_format=0
1643         hdr_prot=1
1644         pkt_len=64
1645         stripped=4
1646         hdr_len=60
1647         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
1648 HEADER
1649         dgramSeqNo=1
1650         ds=127.0.0.1>2:1000
1651         fsSeqNo=4
1652         in_vlan=0
1653         in_priority=0
1654         out_vlan=0
1655         out_priority=0
1656         meanSkip=1
1657         samplePool=4
1658         dropEvents=0
1659         in_ifindex=1003
1660         in_format=0
1661         out_ifindex=1004
1662         out_format=0
1663         hdr_prot=1
1664         pkt_len=64
1665         stripped=4
1666         hdr_len=60
1667         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
1668 HEADER
1669         dgramSeqNo=1
1670         ds=127.0.0.1>2:1000
1671         fsSeqNo=5
1672         in_vlan=0
1673         in_priority=0
1674         out_vlan=0
1675         out_priority=0
1676         meanSkip=1
1677         samplePool=5
1678         dropEvents=0
1679         in_ifindex=1003
1680         in_format=0
1681         out_ifindex=1004
1682         out_format=0
1683         hdr_prot=1
1684         pkt_len=64
1685         stripped=4
1686         hdr_len=60
1687         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
1688 ])
1689
1690 AT_CHECK([[sort sflow.log | $EGREP 'IFCOUNTERS|ERROR' | head -6 | sed 's/ /\
1691         /g']], [0], [dnl
1692 IFCOUNTERS
1693         dgramSeqNo=2
1694         ds=127.0.0.1>0:1002
1695         csSeqNo=1
1696         ifindex=1002
1697         type=6
1698         ifspeed=100000000
1699         direction=0
1700         status=3
1701         in_octets=0
1702         in_unicasts=0
1703         in_multicasts=0
1704         in_broadcasts=4294967295
1705         in_discards=0
1706         in_errors=0
1707         in_unknownprotos=4294967295
1708         out_octets=120
1709         out_unicasts=2
1710         out_multicasts=4294967295
1711         out_broadcasts=4294967295
1712         out_discards=0
1713         out_errors=0
1714         promiscuous=0
1715 IFCOUNTERS
1716         dgramSeqNo=2
1717         ds=127.0.0.1>0:1003
1718         csSeqNo=1
1719         ifindex=1003
1720         type=6
1721         ifspeed=100000000
1722         direction=0
1723         status=0
1724         in_octets=98
1725         in_unicasts=3
1726         in_multicasts=0
1727         in_broadcasts=4294967295
1728         in_discards=0
1729         in_errors=0
1730         in_unknownprotos=4294967295
1731         out_octets=120
1732         out_unicasts=2
1733         out_multicasts=4294967295
1734         out_broadcasts=4294967295
1735         out_discards=0
1736         out_errors=0
1737         promiscuous=0
1738 IFCOUNTERS
1739         dgramSeqNo=2
1740         ds=127.0.0.1>0:1004
1741         csSeqNo=1
1742         ifindex=1004
1743         type=6
1744         ifspeed=100000000
1745         direction=0
1746         status=0
1747         in_octets=84
1748         in_unicasts=2
1749         in_multicasts=0
1750         in_broadcasts=4294967295
1751         in_discards=0
1752         in_errors=0
1753         in_unknownprotos=4294967295
1754         out_octets=180
1755         out_unicasts=3
1756         out_multicasts=4294967295
1757         out_broadcasts=4294967295
1758         out_discards=0
1759         out_errors=0
1760         promiscuous=0
1761 IFCOUNTERS
1762         dgramSeqNo=3
1763         ds=127.0.0.1>0:1002
1764         csSeqNo=2
1765         ifindex=1002
1766         type=6
1767         ifspeed=100000000
1768         direction=0
1769         status=3
1770         in_octets=0
1771         in_unicasts=0
1772         in_multicasts=0
1773         in_broadcasts=4294967295
1774         in_discards=0
1775         in_errors=0
1776         in_unknownprotos=4294967295
1777         out_octets=120
1778         out_unicasts=2
1779         out_multicasts=4294967295
1780         out_broadcasts=4294967295
1781         out_discards=0
1782         out_errors=0
1783         promiscuous=0
1784 IFCOUNTERS
1785         dgramSeqNo=3
1786         ds=127.0.0.1>0:1003
1787         csSeqNo=2
1788         ifindex=1003
1789         type=6
1790         ifspeed=100000000
1791         direction=0
1792         status=0
1793         in_octets=98
1794         in_unicasts=3
1795         in_multicasts=0
1796         in_broadcasts=4294967295
1797         in_discards=0
1798         in_errors=0
1799         in_unknownprotos=4294967295
1800         out_octets=120
1801         out_unicasts=2
1802         out_multicasts=4294967295
1803         out_broadcasts=4294967295
1804         out_discards=0
1805         out_errors=0
1806         promiscuous=0
1807 IFCOUNTERS
1808         dgramSeqNo=3
1809         ds=127.0.0.1>0:1004
1810         csSeqNo=2
1811         ifindex=1004
1812         type=6
1813         ifspeed=100000000
1814         direction=0
1815         status=0
1816         in_octets=84
1817         in_unicasts=2
1818         in_multicasts=0
1819         in_broadcasts=4294967295
1820         in_discards=0
1821         in_errors=0
1822         in_unknownprotos=4294967295
1823         out_octets=180
1824         out_unicasts=3
1825         out_multicasts=4294967295
1826         out_broadcasts=4294967295
1827         out_discards=0
1828         out_errors=0
1829         promiscuous=0
1830 ])
1831 AT_CLEANUP
1832
1833
1834
1835 dnl Test that basic NetFlow reports flow statistics correctly:
1836 dnl - The initial packet of a flow are correctly accounted.
1837 dnl - Later packets within a flow are correctly accounted.
1838 dnl - Flow actions changing (in this case, due to MAC learning)
1839 dnl   cause a record to be sent.
1840 AT_SETUP([ofproto-dpif - NetFlow flow expiration])
1841
1842 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
1843 ADD_OF_PORTS([br0], 1, 2)
1844
1845 ovs-appctl time/stop
1846 ON_EXIT([kill `cat test-netflow.pid`])
1847 AT_CHECK([test-netflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > netflow.log], [0], [], [ignore])
1848 AT_CAPTURE_FILE([netflow.log])
1849 NETFLOW_PORT=`parse_listening_port < test-netflow.log`
1850
1851 ovs-vsctl \
1852    set Bridge br0 netflow=@nf -- \
1853    --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
1854      engine_id=1 engine_type=2 active_timeout=30 add-id-to-interface=false
1855
1856 for delay in 1000 30000; do
1857     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)'
1858     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)'
1859
1860     ovs-appctl time/warp $delay
1861 done
1862
1863 sleep 1
1864 OVS_VSWITCHD_STOP
1865 ovs-appctl -t test-netflow exit
1866
1867 AT_CHECK([[sed -e 's/, uptime [0-9]*//
1868 s/, now [0-9.]*//
1869 s/time \([0-9]*\)\.\.\.\1$/time <moment>/
1870 s/time [0-9]*\.\.\.[0-9]*/time <range>/
1871 ' netflow.log | sort]], [0],
1872   [
1873 header: v5, seq 0, engine 2,1
1874 header: v5, seq 1, engine 2,1
1875 seq 0: 192.168.0.1 > 192.168.0.2, if 1 > 65535, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
1876 seq 1: 192.168.0.1 > 192.168.0.2, if 1 > 2, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
1877 seq 1: 192.168.0.2 > 192.168.0.1, if 2 > 1, 2 pkts, 120 bytes, ICMP 0:0, time <range>
1878 ])
1879 AT_CLEANUP
1880
1881 dnl Test that basic NetFlow reports active expirations correctly.
1882 AT_SETUP([ofproto-dpif - NetFlow active expiration])
1883
1884 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
1885 ADD_OF_PORTS([br0], 1, 2)
1886
1887 ON_EXIT([kill `cat test-netflow.pid`])
1888 AT_CHECK([test-netflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > netflow.log], [0], [], [ignore])
1889 AT_CAPTURE_FILE([netflow.log])
1890 NETFLOW_PORT=`parse_listening_port < test-netflow.log`
1891
1892 ovs-vsctl \
1893    set Bridge br0 netflow=@nf -- \
1894    --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
1895      engine_id=1 engine_type=2 active_timeout=10 add-id-to-interface=false
1896
1897 AT_CHECK([ovs-appctl time/stop])
1898 n=1
1899 while test $n -le 60; do
1900     n=`expr $n + 1`
1901
1902     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)'
1903     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)'
1904
1905     ovs-appctl time/warp 1000
1906 done
1907
1908 ovs-appctl time/warp 10000
1909
1910 sleep 1
1911 OVS_VSWITCHD_STOP
1912 ovs-appctl -t test-netflow exit
1913
1914 # Count the number of reported packets:
1915 # - From source to destination before MAC learning kicks in (just one).
1916 # - From source to destination after that.
1917 # - From destination to source.
1918 n_learn=0
1919 n_in=0
1920 n_out=0
1921 n_other=0
1922 n_recs=0
1923 none=0
1924 while read line; do
1925     pkts=`echo "$line" | sed 's/.*, \([[0-9]]*\) pkts,.*/\1/'`
1926     case $pkts in
1927          [[0-9]]*) ;;
1928          *) continue ;;
1929     esac
1930
1931     case $line in
1932         "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 65535, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
1933             counter=n_learn
1934             ;;
1935         "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 2, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
1936             counter=n_in
1937             ;;
1938         "seq "*": 192.168.0.2 > 192.168.0.1, if 2 > 1, "*" pkts, "*" bytes, TCP 80 > 1234, time "*)
1939             counter=n_out
1940             ;;
1941         *)
1942             counter=n_other
1943             ;;
1944     esac
1945     eval $counter=\`expr \$$counter + \$pkts\`
1946     n_recs=`expr $n_recs + 1`
1947 done < netflow.log
1948
1949 # There should be exactly 1 MAC learning packet,
1950 # exactly 59 other packets in that direction,
1951 # and exactly 60 packets in the other direction.
1952 AT_CHECK([echo $n_learn $n_in $n_out $n_other], [0], [1 59 60 0
1953 ])
1954
1955 # There should be 1 expiration for MAC learning,
1956 # at least 5 active and a final expiration in one direction,
1957 # and at least 5 active and a final expiration in the other direction.
1958 echo $n_recs
1959 AT_CHECK([test $n_recs -ge 13])
1960
1961 AT_CLEANUP
1962
1963 AT_SETUP([idle_age and hard_age increase over time])
1964 OVS_VSWITCHD_START
1965
1966 # get_ages DURATION HARD IDLE
1967 #
1968 # Fetch the flow duration, hard age, and idle age into the variables
1969 # whose names are given as arguments.  Rounds DURATION down to the
1970 # nearest integer.  If hard_age doesn't appear in the output, sets
1971 # HARD to "none".  If idle_age doesn't appear in the output, sets IDLE
1972 # to 0.
1973 get_ages () {
1974     AT_CHECK([ovs-ofctl dump-flows br0], [0], [stdout])
1975
1976     duration=`sed -n 's/.*duration=\([[0-9]]*\)\(\.[[0-9]]*\)\{0,1\}s.*/\1/p' stdout`
1977     AT_CHECK([[expr X"$duration" : 'X[0-9][0-9]*$']], [0], [ignore])
1978     AS_VAR_COPY([$1], [duration])
1979
1980     hard=`sed -n 's/.*hard_age=\([[0-9]]*\),.*/\1/p' stdout`
1981     if test X"$hard" = X; then
1982         hard=none
1983     else
1984         AT_CHECK([[expr X"$hard" : 'X[0-9][0-9]*$']], [0], [ignore])
1985     fi
1986     AS_VAR_COPY([$2], [hard])
1987
1988     idle=`sed -n 's/.*idle_age=\([[0-9]]*\),.*/\1/p' stdout`
1989     if test X"$idle" = X; then
1990         idle=0
1991     else
1992         AT_CHECK([[expr X"$idle" : 'X[0-9][0-9]*$']], [0], [ignore])
1993     fi
1994     AS_VAR_COPY([$3], [idle])
1995 }
1996
1997 # Add a flow and get its initial hard and idle age.
1998 AT_CHECK([ovs-ofctl add-flow br0 hard_timeout=199,idle_timeout=188,actions=drop])
1999 get_ages duration1 hard1 idle1
2000
2001 ovs-appctl time/stop
2002 # Warp time forward by 10 seconds, then modify the flow's actions.
2003 ovs-appctl time/warp 10000
2004 get_ages duration2 hard2 idle2
2005 AT_CHECK([ovs-ofctl mod-flows br0 actions=flood])
2006
2007 # Warp time forward by 10 seconds.
2008 ovs-appctl time/warp 10000
2009 get_ages duration3 hard3 idle3
2010
2011 # Warp time forward 10 more seconds, then pass some packets through the flow,
2012 # then warp forward a few more times because idle times are only updated
2013 # occasionally.
2014 ovs-appctl time/warp 10000
2015 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)'
2016 ovs-appctl time/warp 1000
2017 ovs-appctl time/warp 1000
2018 ovs-appctl time/warp 1000
2019 get_ages duration4 hard4 idle4
2020
2021 printf "duration: %4s => %4s => %4s => %4s\n" $duration1 $duration2 $duration3 $duration4
2022 printf "hard_age: %4s => %4s => %4s => %4s\n" $hard1 $hard2 $hard3 $hard4
2023 printf "idle_age: %4s => %4s => %4s => %4s\n" $idle1 $idle2 $idle3 $idle4
2024
2025 # Duration should increase steadily over time.
2026 AT_CHECK([test $duration1 -lt $duration2])
2027 AT_CHECK([test $duration2 -lt $duration3])
2028 AT_CHECK([test $duration3 -lt $duration4])
2029
2030 # Hard age should be "none" initially because it's the same as flow_duration,
2031 # then it should increase.
2032 AT_CHECK([test $hard1 = none])
2033 AT_CHECK([test $hard2 = none])
2034 AT_CHECK([test $hard3 != none])
2035 AT_CHECK([test $hard4 != none])
2036 AT_CHECK([test $hard3 -lt $hard4])
2037
2038 # Idle age should increase from 1 to 2 to 3, then decrease.
2039 AT_CHECK([test $idle1 -lt $idle2])
2040 AT_CHECK([test $idle2 -lt $idle3])
2041 AT_CHECK([test $idle3 -gt $idle4])
2042
2043 # Check some invariant relationships.
2044 AT_CHECK([test $duration1 = $idle1])
2045 AT_CHECK([test $duration2 = $idle2])
2046 AT_CHECK([test $duration3 = $idle3])
2047 AT_CHECK([test $idle3 -gt $hard3])
2048 AT_CHECK([test $idle4 -lt $hard4])
2049 AT_CHECK([test $hard4 -lt $duration4])
2050
2051 OVS_VSWITCHD_STOP
2052 AT_CLEANUP
2053
2054 AT_SETUP([ofproto-dpif - fin_timeout])
2055 OVS_VSWITCHD_START
2056 AT_DATA([flows.txt], [dnl
2057 in_port=1 actions=output:2
2058 in_port=2 actions=mod_vlan_vid:17,output:1
2059 ])
2060 AT_CHECK([ovs-ofctl add-flow br0 'idle_timeout=60,actions=fin_timeout(idle_timeout=5)'])
2061 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
2062 [NXST_FLOW reply:
2063  idle_timeout=60, actions=fin_timeout(idle_timeout=5)
2064 ])
2065
2066 ovs-appctl time/stop
2067 # Check that a TCP SYN packet does not change the timeout.  (Because
2068 # flow stats updates are mainly what implements the fin_timeout
2069 # feature, we warp forward a couple of times to ensure that flow stats
2070 # run before re-checking the flow table.)
2071 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f908004500003c2e2440004006465dac11370dac11370b828b0016751e267b00000000a00216d017360000020405b40402080a2d25085f0000000001030307])
2072 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
2073 warped
2074 ])
2075 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
2076 [NXST_FLOW reply:
2077  n_packets=1, n_bytes=74, idle_timeout=60, actions=fin_timeout(idle_timeout=5)
2078 ])
2079 # Check that a TCP FIN packet does change the timeout.
2080 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f90800451000342e3e40004006463bac11370dac11370b828b0016751e319dfc96399b801100717ae800000101080a2d250a9408579588])
2081 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
2082 warped
2083 ])
2084 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
2085 [NXST_FLOW reply:
2086  n_packets=2, n_bytes=140, idle_timeout=5, actions=fin_timeout(idle_timeout=5)
2087 ])
2088 OVS_VSWITCHD_STOP
2089 AT_CLEANUP
2090
2091 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-dps])
2092 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
2093 ADD_OF_PORTS([br0], [1], [2])
2094 ADD_OF_PORTS([br1], [3])
2095
2096 AT_CHECK([ovs-appctl dpif/dump-dps], [0], [dnl
2097 dummy@br0
2098 dummy@br1
2099 ])
2100 OVS_VSWITCHD_STOP
2101 AT_CLEANUP
2102
2103 AT_SETUP([ofproto-dpif - ovs-appctl dpif/show])
2104 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
2105 ADD_OF_PORTS([br0], [1], [2])
2106 ADD_OF_PORTS([br1], [3])
2107
2108 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
2109 dummy@ovs-dummy: hit:0 missed:0
2110         flows: cur: 0, avg: 0, max: 0, life span: 0ms
2111         overall avg: add rate: 0.000/min, del rate: 0.000/min
2112         br0: hit:0 missed:0
2113                 br0 65534/100: (dummy)
2114                 p1 1/1: (dummy)
2115                 p2 2/2: (dummy)
2116         br1: hit:0 missed:0
2117                 br1 65534/101: (dummy)
2118                 p3 3/3: (dummy)
2119 ])
2120 OVS_VSWITCHD_STOP
2121 AT_CLEANUP
2122
2123 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-flows])
2124 OVS_VSWITCHD_START([add-br br1 -- \
2125                     set bridge br1 datapath-type=dummy fail-mode=secure])
2126 ADD_OF_PORTS([br0], [1], [2])
2127 ADD_OF_PORTS([br1], [3])
2128
2129 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)'])
2130 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)'])
2131 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)'])
2132
2133 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
2134 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))
2135 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))
2136 ])
2137
2138 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
2139 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))
2140 ])
2141
2142 OVS_VSWITCHD_STOP
2143 AT_CLEANUP
2144
2145 AT_SETUP([ofproto-dpif - ovs-appctl dpif/del-flows])
2146 OVS_VSWITCHD_START([add-br br1 -- \
2147                     set bridge br1 datapath-type=dummy fail-mode=secure])
2148 ADD_OF_PORTS([br0], [1], [2])
2149 ADD_OF_PORTS([br1], [3])
2150
2151 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)'])
2152 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)'])
2153 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)'])
2154
2155 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
2156 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))
2157 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))
2158 ])
2159
2160 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
2161 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))
2162 ])
2163
2164 AT_CHECK([ovs-appctl dpif/del-flows br0])
2165 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
2166 ])
2167
2168 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
2169 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))
2170 ])
2171
2172 OVS_VSWITCHD_STOP
2173 AT_CLEANUP
2174
2175 AT_SETUP([ofproto-dpif - patch ports])
2176 OVS_VSWITCHD_START([add-br br1 \
2177 -- set bridge br1 datapath-type=dummy fail-mode=secure \
2178 -- add-port br1 pbr1 -- set int pbr1 type=patch options:peer=pbr0 \
2179 -- add-port br0 pbr0 -- set int pbr0 type=patch options:peer=pbr1])
2180
2181 ADD_OF_PORTS([br0], [2])
2182 ADD_OF_PORTS([br1], [3])
2183
2184 AT_CHECK([ovs-appctl time/stop]) dnl Make life span averages consistent.
2185
2186 AT_CHECK([ovs-ofctl add-flow br0 actions=LOCAL,output:1,output:2])
2187 AT_CHECK([ovs-ofctl add-flow br1 actions=LOCAL,output:1,output:3])
2188
2189 for i in $(seq 1 10); do
2190     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)'
2191 done
2192
2193 for i in $(seq 1 5); do
2194     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)'
2195 done
2196
2197 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
2198 warped
2199 ])
2200
2201 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
2202 dummy@ovs-dummy: hit:13 missed:2
2203         flows: cur: 2, avg: 1, max: 2, life span: 1250ms
2204         overall avg: add rate: 0.000/min, del rate: 0.000/min
2205         br0: hit:9 missed:1
2206                 br0 65534/100: (dummy)
2207                 p2 2/2: (dummy)
2208                 pbr0 1/none: (patch: peer=pbr1)
2209         br1: hit:4 missed:1
2210                 br1 65534/101: (dummy)
2211                 p3 3/3: (dummy)
2212                 pbr1 1/none: (patch: peer=pbr0)
2213 ])
2214
2215 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_USED], [0], [dnl
2216 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
2217 ]),
2218 AT_CHECK([ovs-appctl dpif/dump-flows br1 | STRIP_USED], [0], [dnl
2219 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
2220 ])
2221
2222 AT_CHECK([ovs-ofctl dump-ports br0 pbr0], [0], [dnl
2223 OFPST_PORT reply (xid=0x4): 1 ports
2224   port  1: rx pkts=5, bytes=300, drop=0, errs=0, frame=0, over=0, crc=0
2225            tx pkts=10, bytes=600, drop=0, errs=0, coll=0
2226 ])
2227
2228 AT_CHECK([ovs-ofctl dump-ports br1 pbr1], [0], [dnl
2229 OFPST_PORT reply (xid=0x4): 1 ports
2230   port  1: rx pkts=10, bytes=600, drop=0, errs=0, frame=0, over=0, crc=0
2231            tx pkts=5, bytes=300, drop=0, errs=0, coll=0
2232 ])
2233
2234 OVS_VSWITCHD_STOP
2235 AT_CLEANUP
2236
2237 AT_SETUP([ofproto-dpif - ovs-appctl dpif/show rates])
2238 OVS_VSWITCHD_START([set Bridge br0 fail-mode=secure])
2239 ADD_OF_PORTS([br0], 1, 2)
2240
2241 AT_CHECK([ovs-appctl time/stop]) dnl Make life span averages consistent.
2242 AT_CHECK([ovs-ofctl add-flow br0 actions=LOCAL,output:1,output:2])
2243
2244 for i in $(seq 1 61); do
2245     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)'
2246     ovs-appctl time/warp 10000
2247     ovs-appctl time/warp 50000
2248 done
2249
2250 AT_CHECK([ovs-appctl time/warp 10000], [0], [warped
2251 ])
2252
2253 AT_CHECK([ovs-appctl dpif/show | sed 's/ 10[[0-9]]\{3\}(ms)$/ 10000(ms)/'], [0], [dnl
2254 dummy@ovs-dummy: hit:0 missed:61
2255         flows: cur: 0, avg: 0, max: 1, life span: 1666ms
2256         hourly avg: add rate: 0.641/min, del rate: 0.641/min
2257         overall avg: add rate: 1.000/min, del rate: 1.000/min
2258         br0: hit:0 missed:61
2259                 br0 65534/100: (dummy)
2260                 p1 1/1: (dummy)
2261                 p2 2/2: (dummy)
2262 ])
2263
2264 OVS_VSWITCHD_STOP
2265 AT_CLEANUP
2266
2267 AT_SETUP([ofproto-dpif - port duration])
2268 OVS_VSWITCHD_START([set Bridge br0 protocols=OpenFlow13])
2269 ADD_OF_PORTS([br0], 1, 2)
2270
2271 ovs-appctl time/stop
2272 ovs-appctl time/warp 10000
2273
2274 AT_CHECK([ovs-ofctl -O openflow13 dump-ports br0], [0], [stdout])
2275 AT_CHECK([sed 's/=[[0-9]][[0-9]]\(\.[[0-9]][[0-9]]*\)\{0,1\}s/=?s/' stdout], [0],
2276 [dnl
2277 OFPST_PORT reply (OF1.3) (xid=0x2): 3 ports
2278   port  1: 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   port  2: rx pkts=0, bytes=0, drop=0, errs=0, frame=0, over=0, crc=0
2282            tx pkts=0, bytes=0, drop=0, errs=0, coll=0
2283            duration=?s
2284   port LOCAL: rx pkts=0, bytes=0, drop=0, errs=0, frame=0, over=0, crc=0
2285            tx pkts=0, bytes=0, drop=0, errs=0, coll=0
2286            duration=?s
2287 ])
2288 OVS_VSWITCHD_STOP
2289 AT_CLEANUP
2290
2291 dnl ----------------------------------------------------------------------
2292 AT_BANNER([ofproto-dpif -- megaflows])
2293
2294 # Strips out uninteresting parts of megaflow output, as well as parts
2295 # that vary from one run to another (e.g., timing and bond actions).
2296 m4_define([STRIP_USED], [[sed '
2297     s/used:[0-9]*\.[0-9]*/used:0.0/
2298 ' | sort]])
2299 m4_define([STRIP_XOUT], [[sed '
2300     s/used:[0-9]*\.[0-9]*/used:0.0/
2301     s/Datapath actions:.*/Datapath actions: <del>/
2302 ' | sort]])
2303
2304 AT_SETUP([ofproto-dpif megaflow - port classification])
2305 OVS_VSWITCHD_START
2306 ADD_OF_PORTS([br0], [1], [2])
2307 AT_DATA([flows.txt], [dnl
2308 table=0 in_port=1 actions=output(2)
2309 ])
2310 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2311 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)'])
2312 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)'])
2313 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2314 skb_priority=0,ip,in_port=1,nw_frag=no, n_subfacets:2, used:0.0s, Datapath actions: <del>
2315 ])
2316 OVS_VSWITCHD_STOP
2317 AT_CLEANUP
2318
2319 AT_SETUP([ofproto-dpif megaflow - L2 classification])
2320 OVS_VSWITCHD_START
2321 ADD_OF_PORTS([br0], [1], [2])
2322 AT_DATA([flows.txt], [dnl
2323 table=0 in_port=1,dl_src=50:54:00:00:00:09 actions=output(2)
2324 ])
2325 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2326 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2327 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2328 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2329 skb_priority=0,ip,in_port=1,dl_src=50:54:00:00:00:09,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: <del>
2330 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>
2331 ])
2332 OVS_VSWITCHD_STOP
2333 AT_CLEANUP
2334
2335 AT_SETUP([ofproto-dpif megaflow - L3 classification])
2336 OVS_VSWITCHD_START
2337 ADD_OF_PORTS([br0], [1], [2])
2338 AT_DATA([flows.txt], [dnl
2339 table=0 in_port=1,icmp,nw_src=10.0.0.4 actions=output(2)
2340 ])
2341 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2342 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)'])
2343 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)'])
2344 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2345 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>
2346 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>
2347 ])
2348 OVS_VSWITCHD_STOP
2349 AT_CLEANUP
2350
2351 AT_SETUP([ofproto-dpif megaflow - L4 classification])
2352 OVS_VSWITCHD_START
2353 ADD_OF_PORTS([br0], [1], [2])
2354 AT_DATA([flows.txt], [dnl
2355 table=0 in_port=1,icmp,icmp_type=8 actions=output(2)
2356 ])
2357 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2358 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)'])
2359 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)'])
2360 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2361 skb_priority=0,icmp,in_port=1,nw_frag=no,icmp_type=8, n_subfacets:2, used:0.0s, Datapath actions: <del>
2362 ])
2363 OVS_VSWITCHD_STOP
2364 AT_CLEANUP
2365
2366 AT_SETUP([ofproto-dpif megaflow - normal])
2367 OVS_VSWITCHD_START
2368 ADD_OF_PORTS([br0], [1], [2])
2369 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
2370 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)'])
2371 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)'])
2372 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2373 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>
2374 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>
2375 ])
2376 OVS_VSWITCHD_STOP
2377 AT_CLEANUP
2378
2379 AT_SETUP([ofproto-dpif megaflow - mpls])
2380 OVS_VSWITCHD_START
2381 ADD_OF_PORTS([br0], [1], [2])
2382 AT_DATA([flows.txt], [dnl
2383 table=0 dl_src=50:54:00:00:00:09 actions=push_mpls:0x8847,2
2384 table=0 dl_src=50:54:00:00:00:0b actions=pop_mpls:0x0800,2
2385 ])
2386 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2387 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)'])
2388 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)'])
2389 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2390 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>
2391 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>
2392 ])
2393 OVS_VSWITCHD_STOP
2394 AT_CLEANUP
2395
2396 AT_SETUP([ofproto-dpif megaflow - netflow])
2397 OVS_VSWITCHD_START
2398 ADD_OF_PORTS([br0], [1], [2])
2399
2400 dnl NetFlow configuration disables wildcarding relevant fields
2401 ON_EXIT([kill `cat test-netflow.pid`])
2402 AT_CHECK([test-netflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > netflow.log], [0], [], [ignore])
2403 AT_CAPTURE_FILE([netflow.log])
2404 NETFLOW_PORT=`parse_listening_port < test-netflow.log`
2405 ovs-vsctl \
2406    set Bridge br0 netflow=@nf -- \
2407    --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
2408      engine_id=1 engine_type=2 active_timeout=30 add-id-to-interface=false
2409
2410 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
2411 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)'])
2412 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)'])
2413 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2414 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>
2415 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>
2416 ])
2417 OVS_VSWITCHD_STOP
2418 AT_CLEANUP
2419
2420 AT_SETUP([ofproto-dpif megaflow - normal, active-backup bonding])
2421 OVS_VSWITCHD_START(
2422   [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1 -- \
2423    add-bond br0 bond0 p2 p3 bond_mode=active-backup -- \
2424    set interface p2 type=dummy ofport_request=2 -- \
2425    set interface p3 type=dummy ofport_request=3])
2426 AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK
2427 ])
2428
2429 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
2430 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)'])
2431 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)'])
2432 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2433 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>
2434 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>
2435 ])
2436 OVS_VSWITCHD_STOP
2437 AT_CLEANUP
2438
2439 AT_SETUP([ofproto-dpif megaflow - normal, balance-slb bonding])
2440 OVS_VSWITCHD_START(
2441   [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1 -- \
2442    add-bond br0 bond0 p2 p3 bond_mode=balance-slb -- \
2443    set interface p2 type=dummy ofport_request=2 -- \
2444    set interface p3 type=dummy ofport_request=3])
2445 AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK
2446 ])
2447
2448 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
2449 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)'])
2450 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)'])
2451 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2452 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>
2453 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>
2454 ])
2455 OVS_VSWITCHD_STOP
2456 AT_CLEANUP
2457
2458 AT_SETUP([ofproto-dpif megaflow - normal, balance-tcp bonding])
2459 # Create bond0 on br0 with interfaces p0 and p1
2460 #    and bond1 on br1 with interfaces p2 and p3
2461 # with p0 patched to p2 and p1 patched to p3.
2462 OVS_VSWITCHD_START(
2463   [add-bond br0 bond0 p0 p1 bond_mode=balance-tcp lacp=active \
2464                             other-config:lacp-time=fast \
2465                             other-config:bond-rebalance-interval=0 -- \
2466    set interface p0 type=patch options:peer=p2 ofport_request=1 -- \
2467    set interface p1 type=patch options:peer=p3 ofport_request=2 -- \
2468    add-br br1 -- \
2469    set bridge br1 other-config:hwaddr=aa:66:aa:66:00:00 -- \
2470    set bridge br1 datapath-type=dummy other-config:datapath-id=1234 \
2471                   fail-mode=secure -- \
2472    add-bond br1 bond1 p2 p3 bond_mode=balance-tcp lacp=active \
2473                             other-config:lacp-time=fast \
2474                             other-config:bond-rebalance-interval=0 -- \
2475    set interface p2 type=patch options:peer=p0 ofport_request=3 -- \
2476    set interface p3 type=patch options:peer=p1 ofport_request=4 --])
2477
2478 AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK
2479 ])
2480 ADD_OF_PORTS([br0], [7])
2481 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
2482 AT_CHECK([ovs-ofctl add-flow br1 action=normal])
2483 ovs-appctl time/stop
2484 ovs-appctl time/warp 5000
2485 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)'])
2486 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)'])
2487
2488 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2489 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>
2490 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>
2491 ])
2492 OVS_VSWITCHD_STOP
2493 AT_CLEANUP
2494
2495 AT_SETUP([ofproto-dpif megaflow - resubmit port action])
2496 OVS_VSWITCHD_START
2497 ADD_OF_PORTS([br0], [1], [2])
2498 AT_DATA([flows.txt], [dnl
2499 table=0 in_port=1,ip actions=resubmit(90)
2500 table=0 in_port=90,dl_src=50:54:00:00:00:09 actions=output(2)
2501 ])
2502 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2503 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)'])
2504 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)'])
2505 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2506 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>
2507 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>
2508 ])
2509 OVS_VSWITCHD_STOP
2510 AT_CLEANUP
2511
2512 AT_SETUP([ofproto-dpif megaflow - resubmit table action])
2513 OVS_VSWITCHD_START
2514 ADD_OF_PORTS([br0], [1], [2])
2515 AT_DATA([flows.txt], [dnl
2516 table=0 in_port=1,ip actions=resubmit(,1)
2517 table=1 dl_src=50:54:00:00:00:09 actions=output(2)
2518 ])
2519 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2520 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)'])
2521 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=
2522 1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2523 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2524 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>
2525 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>
2526 ])
2527 OVS_VSWITCHD_STOP
2528 AT_CLEANUP
2529
2530 AT_SETUP([ofproto-dpif megaflow - goto_table action])
2531 OVS_VSWITCHD_START
2532 ADD_OF_PORTS([br0], [1], [2])
2533 AT_DATA([flows.txt], [dnl
2534 table=0 in_port=1,ip actions=goto_table(1)
2535 table=1 dl_src=50:54:00:00:00:09 actions=output(2)
2536 ])
2537 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flows br0 flows.txt])
2538 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)'])
2539 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)'])
2540 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2541 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>
2542 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>
2543 ])
2544 OVS_VSWITCHD_STOP
2545 AT_CLEANUP
2546
2547 AT_SETUP([ofproto-dpif megaflow - mirroring, select_all])
2548 OVS_VSWITCHD_START
2549 ADD_OF_PORTS([br0], [1], [2], [3])
2550 ovs-vsctl \
2551         set Bridge br0 mirrors=@m --\
2552         --id=@p3 get Port p3 --\
2553         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
2554
2555 AT_DATA([flows.txt], [dnl
2556 in_port=1 actions=output:2
2557 ])
2558 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2559 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)'])
2560 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)'])
2561 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2562 skb_priority=0,ip,in_port=1,nw_frag=no, n_subfacets:2, used:0.0s, Datapath actions: <del>
2563 ])
2564 OVS_VSWITCHD_STOP
2565 AT_CLEANUP
2566
2567 AT_SETUP([ofproto-dpif megaflow - mirroring, select_vlan])
2568 OVS_VSWITCHD_START
2569 ADD_OF_PORTS([br0], [1], [2], [3])
2570 ovs-vsctl \
2571         set Bridge br0 mirrors=@m --\
2572         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
2573         --id=@m create Mirror name=mymirror select_all=true select_vlan=11 output_port=@p3
2574
2575 AT_DATA([flows.txt], [dnl
2576 in_port=1 actions=output:2
2577 ])
2578 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2579 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))'])
2580 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)'])
2581 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2582 skb_priority=0,ip,in_port=1,dl_vlan=11,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: <del>
2583 skb_priority=0,ip,in_port=1,vlan_tci=0x0000/0x1fff,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: <del>
2584 ])
2585 OVS_VSWITCHD_STOP
2586 AT_CLEANUP
2587
2588 AT_SETUP([ofproto-dpif megaflow - move action])
2589 OVS_VSWITCHD_START
2590 ADD_OF_PORTS([br0], [1], [2])
2591 AT_DATA([flows.txt], [dnl
2592 table=0 in_port=1 ip,actions=move:NXM_OF_IP_SRC[[]]->NXM_NX_REG0[[]],resubmit(90)
2593 table=0 in_port=90 ip,actions=move:NXM_NX_REG0[[]]->NXM_NX_REG1[[]],resubmit(91)
2594 table=0 in_port=91 reg0=0x0a000002,actions=output(2)
2595 ])
2596 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2597 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)'])
2598 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)'])
2599 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2600 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>
2601 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>
2602 ])
2603 OVS_VSWITCHD_STOP
2604 AT_CLEANUP
2605
2606 AT_SETUP([ofproto-dpif megaflow - push action])
2607 OVS_VSWITCHD_START
2608 ADD_OF_PORTS([br0], [1], [2])
2609 AT_DATA([flows.txt], [dnl
2610 table=0 in_port=1 ip,actions=push:NXM_OF_IP_SRC[[]],output(2)
2611 ])
2612 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2613 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)'])
2614 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)'])
2615 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2616 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>
2617 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>
2618 ])
2619 OVS_VSWITCHD_STOP
2620 AT_CLEANUP
2621
2622 AT_SETUP([ofproto-dpif megaflow - learning])
2623 OVS_VSWITCHD_START
2624 ADD_OF_PORTS([br0], [1], [2])
2625 AT_DATA([flows.txt], [dnl
2626 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
2627 ])
2628 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2629 ovs-appctl time/stop
2630 # We send each packet twice because the first packet in each flow causes the
2631 # flow table to change and thus revalidations, which (depending on timing)
2632 # can keep a megaflow from being installed.  The revalidations are done by
2633 # the second iteration, allowing the flows to be installed.
2634 for i in 1 2; do
2635     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)'])
2636     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)'])
2637     ovs-appctl time/warp 100
2638 done
2639 dnl The original flow is missing due to a revalidation.
2640 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2641 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>
2642 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>
2643 ])
2644 OVS_VSWITCHD_STOP
2645 AT_CLEANUP
2646
2647 AT_SETUP([ofproto-dpif megaflow - tunnels])
2648 OVS_VSWITCHD_START(
2649   [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1 \
2650      ofport_request=1 -- \
2651    add-port br0 p2 -- set Interface p2 type=gre options:remote_ip=1.1.1.1 \
2652      ofport_request=2 options:key=flow -- \
2653    add-port br0 p3 -- set Interface p3 type=dummy ofport_request=3 \
2654      ofport_request=3 -- \
2655    add-port br0 p4 -- set Interface p4 type=gre options:remote_ip=1.1.1.2 \
2656      options:tos=inherit options:ttl=inherit ofport_request=4 options:key=flow])
2657 AT_DATA([flows.txt], [dnl
2658 in_port=1,actions=output(2)
2659 in_port=3,actions=output(4)
2660 ])
2661 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2662 dnl ECN bits are always copied out, but don't use 0x3 (CE), since that
2663 dnl will cause the packet to be dropped.
2664 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)'])
2665 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)'])
2666 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)'])
2667 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)'])
2668 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2669 skb_priority=0,ip,in_port=1,nw_ecn=1,nw_frag=no, n_subfacets:2, used:0.0s, Datapath actions: <del>
2670 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>
2671 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>
2672 ])
2673 OVS_VSWITCHD_STOP
2674 AT_CLEANUP
2675
2676 AT_SETUP([ofproto-dpif megaflow - dec_ttl])
2677 OVS_VSWITCHD_START
2678 ADD_OF_PORTS([br0], [1], [2])
2679 AT_DATA([flows.txt], [dnl
2680 table=0 in_port=1,icmp,nw_src=10.0.0.4 actions=dec_ttl,output(2)
2681 ])
2682 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2683 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)'])
2684 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)'])
2685 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2686 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>
2687 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>
2688 ])
2689 OVS_VSWITCHD_STOP
2690 AT_CLEANUP
2691
2692 AT_SETUP([ofproto-dpif megaflow - set dl_dst])
2693 OVS_VSWITCHD_START
2694 ADD_OF_PORTS([br0], [1], [2])
2695 AT_DATA([flows.txt], [dnl
2696 table=0 in_port=1 actions=mod_dl_dst(50:54:00:00:00:0a),output(2)
2697 ])
2698 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2699 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)'])
2700 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)'])
2701 dnl The megaflows do not match the same fields, since the first packet
2702 dnl is essentially a no-op.  (The new destination MAC is the same as the
2703 dnl original.) The ofproto-dpif library un-wildcards the destination MAC
2704 dnl so that a packet that doesn't need its MAC address changed doesn't
2705 dnl hide one that does.  Since the first entry doesn't need to change,
2706 dnl only the destination MAC address is matched (as decided by
2707 dnl ofproto-dpif).  The second entry actually updates the destination
2708 dnl MAC, so both the source and destination MAC addresses are
2709 dnl un-wildcarded, since the ODP commit functions update both the source
2710 dnl and destination MAC addresses.
2711 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_USED], [0], [dnl
2712 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
2713 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
2714 ])
2715 OVS_VSWITCHD_STOP
2716 AT_CLEANUP
2717
2718 AT_SETUP([ofproto-dpif - datapath port number change])
2719 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
2720 ADD_OF_PORTS([br0], 1)
2721
2722 # Trace a flow that should output to p1.
2723 AT_CHECK([ovs-appctl ofproto/trace br0 in_port=LOCAL,dl_src=10:20:30:40:50:60],
2724   [0], [stdout])
2725 AT_CHECK([tail -1 stdout], [0], [Datapath actions: 1
2726 ])
2727
2728 # Change p1's port number to 5.
2729 AT_CHECK([ovs-appctl dpif-dummy/change-port-number ovs-dummy p1 5])
2730
2731 # Trace a flow that should output to p1 in its new location.
2732 AT_CHECK([ovs-appctl ofproto/trace br0 in_port=LOCAL,dl_src=10:20:30:40:50:60],
2733   [0], [stdout])
2734 AT_CHECK([tail -1 stdout], [0], [Datapath actions: 5
2735 ])
2736 OVS_VSWITCHD_STOP
2737 AT_CLEANUP
2738
2739 # Tests the bundling with various bfd and cfm configurations.
2740 AT_SETUP([ofproto - bundle with variable bfd/cfm config])
2741 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy -- \
2742                     add-bond br0 br0bond p0 p2 bond-mode=active-backup -- \
2743                     add-bond br1 br1bond p1 p3 bond-mode=active-backup -- \
2744                     set Interface p1 type=patch options:peer=p0 ofport_request=2 -- \
2745                     set Interface p3 type=patch options:peer=p2 ofport_request=4 -- \
2746                     set Interface p0 type=patch options:peer=p1 ofport_request=1 -- \
2747                     set Interface p2 type=patch options:peer=p3 ofport_request=3 -- \
2748                     set Interface p0 bfd:enable=true bfd:min_tx=300 bfd:min_rx=300 -- \
2749                     set Interface p0 cfm_mpid=1 -- \
2750                     set Interface p1 bfd:enable=true bfd:min_tx=500 bfd:min_rx=500])
2751
2752 ovs-appctl time/stop
2753 # advance the clock to stablize everything.
2754 for i in `seq 0 49`; do ovs-appctl time/warp 100; done
2755 # cfm/show should show 'recv' fault.
2756 AT_CHECK([ovs-appctl cfm/show | sed -n '/^.*fault:.*/p'], [0], [dnl
2757         fault: recv
2758 ])
2759 # bfd/show should show 'up'.
2760 AT_CHECK([ovs-appctl bfd/show | sed -n '/^.*Session State:.*/p'], [0], [dnl
2761         Local Session State: up
2762         Remote Session State: up
2763         Local Session State: up
2764         Remote Session State: up
2765 ])
2766 # bond/show should show 'may-enable: true' for all slaves.
2767 AT_CHECK([ovs-appctl bond/show | sed -n '/^.*may_enable:.*/p'], [0], [dnl
2768         may_enable: true
2769         may_enable: true
2770         may_enable: true
2771         may_enable: true
2772 ])
2773
2774 # now disable the bfd on p1.
2775 AT_CHECK([ovs-vsctl set Interface p1 bfd:enable=false])
2776 # advance the clock to stablize everything.
2777 for i in `seq 0 49`; do ovs-appctl time/warp 100; done
2778 # cfm/show should show 'recv' fault.
2779 AT_CHECK([ovs-appctl cfm/show | sed -n '/^.*fault:.*/p'], [0], [dnl
2780         fault: recv
2781 ])
2782 # bfd/show should show 'down'.
2783 AT_CHECK([ovs-appctl bfd/show | sed -n '/^.*Session State:.*/p'], [0], [dnl
2784         Local Session State: down
2785         Remote Session State: down
2786 ])
2787 # bond/show should show 'may-enable: false' for p0.
2788 AT_CHECK([ovs-appctl bond/show | sed -n '/^.*may_enable:.*/p'], [0], [dnl
2789         may_enable: false
2790         may_enable: true
2791         may_enable: true
2792         may_enable: true
2793 ])
2794
2795 # now enable the bfd on p1 and disable bfd on p0.
2796 AT_CHECK([ovs-vsctl set Interface p1 bfd:enable=true])
2797 AT_CHECK([ovs-vsctl set Interface p0 bfd:enable=false])
2798 # advance the clock to stablize everything.
2799 for i in `seq 0 49`; do ovs-appctl time/warp 100; done
2800 # cfm/show should show 'recv' fault.
2801 AT_CHECK([ovs-appctl cfm/show | sed -n '/^.*fault:.*/p'], [0], [dnl
2802         fault: recv
2803 ])
2804 # bfd/show should show 'down'.
2805 AT_CHECK([ovs-appctl bfd/show | sed -n '/^.*Session State:.*/p'], [0], [dnl
2806         Local Session State: down
2807         Remote Session State: down
2808 ])
2809 # bond/show should show 'may-enable: false' for p0 and p1.
2810 AT_CHECK([ovs-appctl bond/show | sed -n '/^.*may_enable:.*/p'], [0], [dnl
2811         may_enable: false
2812         may_enable: true
2813         may_enable: false
2814         may_enable: true
2815 ])
2816
2817 OVS_VSWITCHD_STOP
2818 AT_CLEANUP