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