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