coverage: Reimplement the "ovs-appctl coverage/show" command.
[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         overall avg: add rate: 0.000/min, del rate: 0.000/min
2134         br0: hit:0 missed:0
2135                 br0 65534/100: (dummy)
2136                 p1 1/1: (dummy)
2137                 p2 2/2: (dummy)
2138         br1: hit:0 missed:0
2139                 br1 65534/101: (dummy)
2140                 p3 3/3: (dummy)
2141 ])
2142 OVS_VSWITCHD_STOP
2143 AT_CLEANUP
2144
2145 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-flows])
2146 OVS_VSWITCHD_START([add-br br1 -- \
2147                     set bridge br1 datapath-type=dummy fail-mode=secure])
2148 ADD_OF_PORTS([br0], [1], [2])
2149 ADD_OF_PORTS([br1], [3])
2150
2151 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2152 AT_CHECK([ovs-appctl netdev-dummy/receive p2 'in_port(2),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x0800),ipv4(src=192.168.0.2,dst=192.168.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=0,code=0)'])
2153 AT_CHECK([ovs-appctl netdev-dummy/receive p3 'in_port(3),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2154
2155 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
2156 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=192.168.0.1/0.0.0.0,dst=192.168.0.2/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller))
2157 skb_priority(0),in_port(2),eth_type(0x0800),ipv4(src=192.168.0.2/0.0.0.0,dst=192.168.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller))
2158 ])
2159
2160 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
2161 skb_priority(0),in_port(3),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller))
2162 ])
2163
2164 OVS_VSWITCHD_STOP
2165 AT_CLEANUP
2166
2167 AT_SETUP([ofproto-dpif - ovs-appctl dpif/del-flows])
2168 OVS_VSWITCHD_START([add-br br1 -- \
2169                     set bridge br1 datapath-type=dummy fail-mode=secure])
2170 ADD_OF_PORTS([br0], [1], [2])
2171 ADD_OF_PORTS([br1], [3])
2172
2173 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)'])
2174 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)'])
2175 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)'])
2176
2177 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
2178 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))
2179 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))
2180 ])
2181
2182 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
2183 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))
2184 ])
2185
2186 AT_CHECK([ovs-appctl dpif/del-flows br0])
2187 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
2188 ])
2189
2190 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
2191 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))
2192 ])
2193
2194 OVS_VSWITCHD_STOP
2195 AT_CLEANUP
2196
2197 AT_SETUP([ofproto-dpif - patch ports])
2198 OVS_VSWITCHD_START([add-br br1 \
2199 -- set bridge br1 datapath-type=dummy fail-mode=secure \
2200 -- add-port br1 pbr1 -- set int pbr1 type=patch options:peer=pbr0 \
2201 -- add-port br0 pbr0 -- set int pbr0 type=patch options:peer=pbr1])
2202
2203 ADD_OF_PORTS([br0], [2])
2204 ADD_OF_PORTS([br1], [3])
2205
2206 AT_CHECK([ovs-appctl time/stop]) dnl Make life span averages consistent.
2207
2208 AT_CHECK([ovs-ofctl add-flow br0 actions=LOCAL,output:1,output:2])
2209 AT_CHECK([ovs-ofctl add-flow br1 actions=LOCAL,output:1,output:3])
2210
2211 for i in $(seq 1 10); do
2212     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)'
2213 done
2214
2215 for i in $(seq 1 5); do
2216     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)'
2217 done
2218
2219 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
2220 warped
2221 ])
2222
2223 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
2224 dummy@ovs-dummy: hit:13 missed:2
2225         flows: cur: 2, avg: 1, max: 2, life span: 1250ms
2226         overall avg: add rate: 0.000/min, del rate: 0.000/min
2227         br0: hit:9 missed:1
2228                 br0 65534/100: (dummy)
2229                 p2 2/2: (dummy)
2230                 pbr0 1/none: (patch: peer=pbr1)
2231         br1: hit:4 missed:1
2232                 br1 65534/101: (dummy)
2233                 p3 3/3: (dummy)
2234                 pbr1 1/none: (patch: peer=pbr0)
2235 ])
2236
2237 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_USED], [0], [dnl
2238 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
2239 ]),
2240 AT_CHECK([ovs-appctl dpif/dump-flows br1 | STRIP_USED], [0], [dnl
2241 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
2242 ])
2243
2244 AT_CHECK([ovs-ofctl dump-ports br0 pbr0], [0], [dnl
2245 OFPST_PORT reply (xid=0x4): 1 ports
2246   port  1: rx pkts=5, bytes=300, drop=0, errs=0, frame=0, over=0, crc=0
2247            tx pkts=10, bytes=600, drop=0, errs=0, coll=0
2248 ])
2249
2250 AT_CHECK([ovs-ofctl dump-ports br1 pbr1], [0], [dnl
2251 OFPST_PORT reply (xid=0x4): 1 ports
2252   port  1: rx pkts=10, bytes=600, drop=0, errs=0, frame=0, over=0, crc=0
2253            tx pkts=5, bytes=300, drop=0, errs=0, coll=0
2254 ])
2255
2256 OVS_VSWITCHD_STOP
2257 AT_CLEANUP
2258
2259 AT_SETUP([ofproto-dpif - ovs-appctl dpif/show rates])
2260 OVS_VSWITCHD_START([set Bridge br0 fail-mode=secure])
2261 ADD_OF_PORTS([br0], 1, 2)
2262
2263 AT_CHECK([ovs-appctl time/stop]) dnl Make life span averages consistent.
2264 AT_CHECK([ovs-ofctl add-flow br0 actions=LOCAL,output:1,output:2])
2265
2266 for i in $(seq 1 61); do
2267     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)'
2268     ovs-appctl time/warp 10000
2269     ovs-appctl time/warp 50000
2270 done
2271
2272 AT_CHECK([ovs-appctl time/warp 10000], [0], [warped
2273 ])
2274
2275 AT_CHECK([ovs-appctl dpif/show | sed 's/ 10[[0-9]]\{3\}(ms)$/ 10000(ms)/'], [0], [dnl
2276 dummy@ovs-dummy: hit:0 missed:61
2277         flows: cur: 0, avg: 0, max: 1, life span: 1666ms
2278         hourly avg: add rate: 0.641/min, del rate: 0.641/min
2279         overall avg: add rate: 1.000/min, del rate: 1.000/min
2280         br0: hit:0 missed:61
2281                 br0 65534/100: (dummy)
2282                 p1 1/1: (dummy)
2283                 p2 2/2: (dummy)
2284 ])
2285
2286 OVS_VSWITCHD_STOP
2287 AT_CLEANUP
2288
2289 AT_SETUP([ofproto-dpif - port duration])
2290 OVS_VSWITCHD_START([set Bridge br0 protocols=OpenFlow13])
2291 ADD_OF_PORTS([br0], 1, 2)
2292
2293 ovs-appctl time/stop
2294 ovs-appctl time/warp 10000
2295
2296 AT_CHECK([ovs-ofctl -O openflow13 dump-ports br0], [0], [stdout])
2297 AT_CHECK([sed 's/=[[0-9]][[0-9]]\(\.[[0-9]][[0-9]]*\)\{0,1\}s/=?s/' stdout], [0],
2298 [dnl
2299 OFPST_PORT reply (OF1.3) (xid=0x2): 3 ports
2300   port  1: rx pkts=0, bytes=0, drop=0, errs=0, frame=0, over=0, crc=0
2301            tx pkts=0, bytes=0, drop=0, errs=0, coll=0
2302            duration=?s
2303   port  2: rx pkts=0, bytes=0, drop=0, errs=0, frame=0, over=0, crc=0
2304            tx pkts=0, bytes=0, drop=0, errs=0, coll=0
2305            duration=?s
2306   port LOCAL: rx pkts=0, bytes=0, drop=0, errs=0, frame=0, over=0, crc=0
2307            tx pkts=0, bytes=0, drop=0, errs=0, coll=0
2308            duration=?s
2309 ])
2310 OVS_VSWITCHD_STOP
2311 AT_CLEANUP
2312
2313 dnl ----------------------------------------------------------------------
2314 AT_BANNER([ofproto-dpif -- megaflows])
2315
2316 # Strips out uninteresting parts of megaflow output, as well as parts
2317 # that vary from one run to another (e.g., timing and bond actions).
2318 m4_define([STRIP_USED], [[sed '
2319     s/used:[0-9]*\.[0-9]*/used:0.0/
2320 ' | sort]])
2321 m4_define([STRIP_XOUT], [[sed '
2322     s/used:[0-9]*\.[0-9]*/used:0.0/
2323     s/Datapath actions:.*/Datapath actions: <del>/
2324 ' | sort]])
2325
2326 AT_SETUP([ofproto-dpif megaflow - port classification])
2327 OVS_VSWITCHD_START
2328 ADD_OF_PORTS([br0], [1], [2])
2329 AT_DATA([flows.txt], [dnl
2330 table=0 in_port=1 actions=output(2)
2331 ])
2332 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2333 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)'])
2334 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)'])
2335 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2336 skb_priority=0,ip,in_port=1,nw_frag=no, n_subfacets:2, used:0.0s, Datapath actions: <del>
2337 ])
2338 OVS_VSWITCHD_STOP
2339 AT_CLEANUP
2340
2341 AT_SETUP([ofproto-dpif megaflow - L2 classification])
2342 OVS_VSWITCHD_START
2343 ADD_OF_PORTS([br0], [1], [2])
2344 AT_DATA([flows.txt], [dnl
2345 table=0 in_port=1,dl_src=50:54:00:00:00:09 actions=output(2)
2346 ])
2347 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2348 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)'])
2349 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)'])
2350 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2351 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>
2352 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>
2353 ])
2354 OVS_VSWITCHD_STOP
2355 AT_CLEANUP
2356
2357 AT_SETUP([ofproto-dpif megaflow - L3 classification])
2358 OVS_VSWITCHD_START
2359 ADD_OF_PORTS([br0], [1], [2])
2360 AT_DATA([flows.txt], [dnl
2361 table=0 in_port=1,icmp,nw_src=10.0.0.4 actions=output(2)
2362 ])
2363 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2364 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2365 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2366 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2367 skb_priority=0,icmp,in_port=1,nw_src=10.0.0.2,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: <del>
2368 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>
2369 ])
2370 OVS_VSWITCHD_STOP
2371 AT_CLEANUP
2372
2373 AT_SETUP([ofproto-dpif megaflow - L4 classification])
2374 OVS_VSWITCHD_START
2375 ADD_OF_PORTS([br0], [1], [2])
2376 AT_DATA([flows.txt], [dnl
2377 table=0 in_port=1,icmp,icmp_type=8 actions=output(2)
2378 ])
2379 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2380 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)'])
2381 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)'])
2382 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2383 skb_priority=0,icmp,in_port=1,nw_frag=no,icmp_type=8, n_subfacets:2, used:0.0s, Datapath actions: <del>
2384 ])
2385 OVS_VSWITCHD_STOP
2386 AT_CLEANUP
2387
2388 AT_SETUP([ofproto-dpif megaflow - normal])
2389 OVS_VSWITCHD_START
2390 ADD_OF_PORTS([br0], [1], [2])
2391 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
2392 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)'])
2393 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)'])
2394 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2395 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>
2396 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>
2397 ])
2398 OVS_VSWITCHD_STOP
2399 AT_CLEANUP
2400
2401 AT_SETUP([ofproto-dpif megaflow - mpls])
2402 OVS_VSWITCHD_START
2403 ADD_OF_PORTS([br0], [1], [2])
2404 AT_DATA([flows.txt], [dnl
2405 table=0 dl_src=50:54:00:00:00:09 actions=push_mpls:0x8847,2
2406 table=0 dl_src=50:54:00:00:00:0b actions=pop_mpls:0x0800,2
2407 ])
2408 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2409 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)'])
2410 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)'])
2411 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2412 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>
2413 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>
2414 ])
2415 OVS_VSWITCHD_STOP
2416 AT_CLEANUP
2417
2418 AT_SETUP([ofproto-dpif megaflow - netflow])
2419 OVS_VSWITCHD_START
2420 ADD_OF_PORTS([br0], [1], [2])
2421
2422 dnl NetFlow configuration disables wildcarding relevant fields
2423 ON_EXIT([kill `cat test-netflow.pid`])
2424 AT_CHECK([test-netflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > netflow.log], [0], [], [ignore])
2425 AT_CAPTURE_FILE([netflow.log])
2426 NETFLOW_PORT=`parse_listening_port < test-netflow.log`
2427 ovs-vsctl \
2428    set Bridge br0 netflow=@nf -- \
2429    --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
2430      engine_id=1 engine_type=2 active_timeout=30 add-id-to-interface=false
2431
2432 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
2433 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)'])
2434 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)'])
2435 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2436 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>
2437 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>
2438 ])
2439 OVS_VSWITCHD_STOP
2440 AT_CLEANUP
2441
2442 AT_SETUP([ofproto-dpif megaflow - normal, active-backup bonding])
2443 OVS_VSWITCHD_START(
2444   [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1 -- \
2445    add-bond br0 bond0 p2 p3 bond_mode=active-backup -- \
2446    set interface p2 type=dummy ofport_request=2 -- \
2447    set interface p3 type=dummy ofport_request=3])
2448 AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK
2449 ])
2450
2451 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
2452 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)'])
2453 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)'])
2454 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2455 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>
2456 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>
2457 ])
2458 OVS_VSWITCHD_STOP
2459 AT_CLEANUP
2460
2461 AT_SETUP([ofproto-dpif megaflow - normal, balance-slb bonding])
2462 OVS_VSWITCHD_START(
2463   [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1 -- \
2464    add-bond br0 bond0 p2 p3 bond_mode=balance-slb -- \
2465    set interface p2 type=dummy ofport_request=2 -- \
2466    set interface p3 type=dummy ofport_request=3])
2467 AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK
2468 ])
2469
2470 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
2471 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)'])
2472 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)'])
2473 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2474 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>
2475 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>
2476 ])
2477 OVS_VSWITCHD_STOP
2478 AT_CLEANUP
2479
2480 AT_SETUP([ofproto-dpif megaflow - normal, balance-tcp bonding])
2481 # Create bond0 on br0 with interfaces p0 and p1
2482 #    and bond1 on br1 with interfaces p2 and p3
2483 # with p0 patched to p2 and p1 patched to p3.
2484 OVS_VSWITCHD_START(
2485   [add-bond br0 bond0 p0 p1 bond_mode=balance-tcp lacp=active \
2486                             other-config:lacp-time=fast \
2487                             other-config:bond-rebalance-interval=0 -- \
2488    set interface p0 type=patch options:peer=p2 ofport_request=1 -- \
2489    set interface p1 type=patch options:peer=p3 ofport_request=2 -- \
2490    add-br br1 -- \
2491    set bridge br1 other-config:hwaddr=aa:66:aa:66:00:00 -- \
2492    set bridge br1 datapath-type=dummy other-config:datapath-id=1234 \
2493                   fail-mode=secure -- \
2494    add-bond br1 bond1 p2 p3 bond_mode=balance-tcp lacp=active \
2495                             other-config:lacp-time=fast \
2496                             other-config:bond-rebalance-interval=0 -- \
2497    set interface p2 type=patch options:peer=p0 ofport_request=3 -- \
2498    set interface p3 type=patch options:peer=p1 ofport_request=4 --])
2499
2500 AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK
2501 ])
2502 ADD_OF_PORTS([br0], [7])
2503 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
2504 AT_CHECK([ovs-ofctl add-flow br1 action=normal])
2505 ovs-appctl time/stop
2506 ovs-appctl time/warp 5000
2507 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)'])
2508 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)'])
2509
2510 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2511 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>
2512 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>
2513 ])
2514 OVS_VSWITCHD_STOP
2515 AT_CLEANUP
2516
2517 AT_SETUP([ofproto-dpif megaflow - resubmit port action])
2518 OVS_VSWITCHD_START
2519 ADD_OF_PORTS([br0], [1], [2])
2520 AT_DATA([flows.txt], [dnl
2521 table=0 in_port=1,ip actions=resubmit(90)
2522 table=0 in_port=90,dl_src=50:54:00:00:00:09 actions=output(2)
2523 ])
2524 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2525 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)'])
2526 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)'])
2527 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2528 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>
2529 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>
2530 ])
2531 OVS_VSWITCHD_STOP
2532 AT_CLEANUP
2533
2534 AT_SETUP([ofproto-dpif megaflow - resubmit table action])
2535 OVS_VSWITCHD_START
2536 ADD_OF_PORTS([br0], [1], [2])
2537 AT_DATA([flows.txt], [dnl
2538 table=0 in_port=1,ip actions=resubmit(,1)
2539 table=1 dl_src=50:54:00:00:00:09 actions=output(2)
2540 ])
2541 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2542 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)'])
2543 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=
2544 1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2545 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2546 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>
2547 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>
2548 ])
2549 OVS_VSWITCHD_STOP
2550 AT_CLEANUP
2551
2552 AT_SETUP([ofproto-dpif megaflow - goto_table action])
2553 OVS_VSWITCHD_START
2554 ADD_OF_PORTS([br0], [1], [2])
2555 AT_DATA([flows.txt], [dnl
2556 table=0 in_port=1,ip actions=goto_table(1)
2557 table=1 dl_src=50:54:00:00:00:09 actions=output(2)
2558 ])
2559 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flows br0 flows.txt])
2560 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)'])
2561 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)'])
2562 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2563 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>
2564 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>
2565 ])
2566 OVS_VSWITCHD_STOP
2567 AT_CLEANUP
2568
2569 AT_SETUP([ofproto-dpif megaflow - mirroring, select_all])
2570 OVS_VSWITCHD_START
2571 ADD_OF_PORTS([br0], [1], [2], [3])
2572 ovs-vsctl \
2573         set Bridge br0 mirrors=@m --\
2574         --id=@p3 get Port p3 --\
2575         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
2576
2577 AT_DATA([flows.txt], [dnl
2578 in_port=1 actions=output:2
2579 ])
2580 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2581 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)'])
2582 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)'])
2583 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2584 skb_priority=0,ip,in_port=1,nw_frag=no, n_subfacets:2, used:0.0s, Datapath actions: <del>
2585 ])
2586 OVS_VSWITCHD_STOP
2587 AT_CLEANUP
2588
2589 AT_SETUP([ofproto-dpif megaflow - mirroring, select_vlan])
2590 OVS_VSWITCHD_START
2591 ADD_OF_PORTS([br0], [1], [2], [3])
2592 ovs-vsctl \
2593         set Bridge br0 mirrors=@m --\
2594         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
2595         --id=@m create Mirror name=mymirror select_all=true select_vlan=11 output_port=@p3
2596
2597 AT_DATA([flows.txt], [dnl
2598 in_port=1 actions=output:2
2599 ])
2600 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2601 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))'])
2602 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)'])
2603 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2604 skb_priority=0,ip,in_port=1,dl_vlan=11,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: <del>
2605 skb_priority=0,ip,in_port=1,vlan_tci=0x0000/0x1fff,nw_frag=no, n_subfacets:1, used:0.0s, Datapath actions: <del>
2606 ])
2607 OVS_VSWITCHD_STOP
2608 AT_CLEANUP
2609
2610 AT_SETUP([ofproto-dpif megaflow - move action])
2611 OVS_VSWITCHD_START
2612 ADD_OF_PORTS([br0], [1], [2])
2613 AT_DATA([flows.txt], [dnl
2614 table=0 in_port=1 ip,actions=move:NXM_OF_IP_SRC[[]]->NXM_NX_REG0[[]],resubmit(90)
2615 table=0 in_port=90 ip,actions=move:NXM_NX_REG0[[]]->NXM_NX_REG1[[]],resubmit(91)
2616 table=0 in_port=91 reg0=0x0a000002,actions=output(2)
2617 ])
2618 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2619 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)'])
2620 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)'])
2621 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2622 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>
2623 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>
2624 ])
2625 OVS_VSWITCHD_STOP
2626 AT_CLEANUP
2627
2628 AT_SETUP([ofproto-dpif megaflow - push action])
2629 OVS_VSWITCHD_START
2630 ADD_OF_PORTS([br0], [1], [2])
2631 AT_DATA([flows.txt], [dnl
2632 table=0 in_port=1 ip,actions=push:NXM_OF_IP_SRC[[]],output(2)
2633 ])
2634 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2635 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2636 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2637 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2638 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>
2639 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>
2640 ])
2641 OVS_VSWITCHD_STOP
2642 AT_CLEANUP
2643
2644 AT_SETUP([ofproto-dpif megaflow - learning])
2645 OVS_VSWITCHD_START
2646 ADD_OF_PORTS([br0], [1], [2])
2647 AT_DATA([flows.txt], [dnl
2648 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
2649 ])
2650 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2651 ovs-appctl time/stop
2652 # We send each packet twice because the first packet in each flow causes the
2653 # flow table to change and thus revalidations, which (depending on timing)
2654 # can keep a megaflow from being installed.  The revalidations are done by
2655 # the second iteration, allowing the flows to be installed.
2656 for i in 1 2; do
2657     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)'])
2658     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)'])
2659     ovs-appctl time/warp 100
2660 done
2661 dnl The original flow is missing due to a revalidation.
2662 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2663 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>
2664 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>
2665 ])
2666 OVS_VSWITCHD_STOP
2667 AT_CLEANUP
2668
2669 AT_SETUP([ofproto-dpif megaflow - tunnels])
2670 OVS_VSWITCHD_START(
2671   [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1 \
2672      ofport_request=1 -- \
2673    add-port br0 p2 -- set Interface p2 type=gre options:remote_ip=1.1.1.1 \
2674      ofport_request=2 options:key=flow -- \
2675    add-port br0 p3 -- set Interface p3 type=dummy ofport_request=3 \
2676      ofport_request=3 -- \
2677    add-port br0 p4 -- set Interface p4 type=gre options:remote_ip=1.1.1.2 \
2678      options:tos=inherit options:ttl=inherit ofport_request=4 options:key=flow])
2679 AT_DATA([flows.txt], [dnl
2680 in_port=1,actions=output(2)
2681 in_port=3,actions=output(4)
2682 ])
2683 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2684 dnl ECN bits are always copied out, but don't use 0x3 (CE), since that
2685 dnl will cause the packet to be dropped.
2686 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)'])
2687 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)'])
2688 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)'])
2689 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)'])
2690 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2691 skb_priority=0,ip,in_port=1,nw_ecn=1,nw_frag=no, n_subfacets:2, used:0.0s, Datapath actions: <del>
2692 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>
2693 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>
2694 ])
2695 OVS_VSWITCHD_STOP
2696 AT_CLEANUP
2697
2698 AT_SETUP([ofproto-dpif megaflow - dec_ttl])
2699 OVS_VSWITCHD_START
2700 ADD_OF_PORTS([br0], [1], [2])
2701 AT_DATA([flows.txt], [dnl
2702 table=0 in_port=1,icmp,nw_src=10.0.0.4 actions=dec_ttl,output(2)
2703 ])
2704 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2705 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)'])
2706 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)'])
2707 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_XOUT], [0], [dnl
2708 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>
2709 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>
2710 ])
2711 OVS_VSWITCHD_STOP
2712 AT_CLEANUP
2713
2714 AT_SETUP([ofproto-dpif megaflow - set dl_dst])
2715 OVS_VSWITCHD_START
2716 ADD_OF_PORTS([br0], [1], [2])
2717 AT_DATA([flows.txt], [dnl
2718 table=0 in_port=1 actions=mod_dl_dst(50:54:00:00:00:0a),output(2)
2719 ])
2720 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2721 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)'])
2722 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)'])
2723 dnl The megaflows do not match the same fields, since the first packet
2724 dnl is essentially a no-op.  (The new destination MAC is the same as the
2725 dnl original.) The ofproto-dpif library un-wildcards the destination MAC
2726 dnl so that a packet that doesn't need its MAC address changed doesn't
2727 dnl hide one that does.  Since the first entry doesn't need to change,
2728 dnl only the destination MAC address is matched (as decided by
2729 dnl ofproto-dpif).  The second entry actually updates the destination
2730 dnl MAC, so both the source and destination MAC addresses are
2731 dnl un-wildcarded, since the ODP commit functions update both the source
2732 dnl and destination MAC addresses.
2733 AT_CHECK([ovs-appctl dpif/dump-megaflows br0 | STRIP_USED], [0], [dnl
2734 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
2735 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
2736 ])
2737 OVS_VSWITCHD_STOP
2738 AT_CLEANUP
2739
2740 AT_SETUP([ofproto-dpif - datapath port number change])
2741 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
2742 ADD_OF_PORTS([br0], 1)
2743
2744 # Trace a flow that should output to p1.
2745 AT_CHECK([ovs-appctl ofproto/trace br0 in_port=LOCAL,dl_src=10:20:30:40:50:60],
2746   [0], [stdout])
2747 AT_CHECK([tail -1 stdout], [0], [Datapath actions: 1
2748 ])
2749
2750 # Change p1's port number to 5.
2751 AT_CHECK([ovs-appctl dpif-dummy/change-port-number ovs-dummy p1 5])
2752
2753 # Trace a flow that should output to p1 in its new location.
2754 AT_CHECK([ovs-appctl ofproto/trace br0 in_port=LOCAL,dl_src=10:20:30:40:50:60],
2755   [0], [stdout])
2756 AT_CHECK([tail -1 stdout], [0], [Datapath actions: 5
2757 ])
2758 OVS_VSWITCHD_STOP
2759 AT_CLEANUP
2760
2761 # Tests the bundling with various bfd and cfm configurations.
2762 AT_SETUP([ofproto - bundle with variable bfd/cfm config])
2763 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy -- \
2764                     add-bond br0 br0bond p0 p2 bond-mode=active-backup -- \
2765                     add-bond br1 br1bond p1 p3 bond-mode=active-backup -- \
2766                     set Interface p1 type=patch options:peer=p0 ofport_request=2 -- \
2767                     set Interface p3 type=patch options:peer=p2 ofport_request=4 -- \
2768                     set Interface p0 type=patch options:peer=p1 ofport_request=1 -- \
2769                     set Interface p2 type=patch options:peer=p3 ofport_request=3 -- \
2770                     set Interface p0 bfd:enable=true bfd:min_tx=300 bfd:min_rx=300 -- \
2771                     set Interface p0 cfm_mpid=1 -- \
2772                     set Interface p1 bfd:enable=true bfd:min_tx=500 bfd:min_rx=500])
2773
2774 ovs-appctl time/stop
2775 # advance the clock to stablize everything.
2776 for i in `seq 0 49`; do ovs-appctl time/warp 100; done
2777 # cfm/show should show 'recv' fault.
2778 AT_CHECK([ovs-appctl cfm/show | sed -n '/^.*fault:.*/p'], [0], [dnl
2779         fault: recv
2780 ])
2781 # bfd/show should show 'up'.
2782 AT_CHECK([ovs-appctl bfd/show | sed -n '/^.*Session State:.*/p'], [0], [dnl
2783         Local Session State: up
2784         Remote Session State: up
2785         Local Session State: up
2786         Remote Session State: up
2787 ])
2788 # bond/show should show 'may-enable: true' for all slaves.
2789 AT_CHECK([ovs-appctl bond/show | sed -n '/^.*may_enable:.*/p'], [0], [dnl
2790         may_enable: true
2791         may_enable: true
2792         may_enable: true
2793         may_enable: true
2794 ])
2795
2796 # now disable the bfd on p1.
2797 AT_CHECK([ovs-vsctl set Interface p1 bfd:enable=false])
2798 # advance the clock to stablize everything.
2799 for i in `seq 0 49`; do ovs-appctl time/warp 100; done
2800 # cfm/show should show 'recv' fault.
2801 AT_CHECK([ovs-appctl cfm/show | sed -n '/^.*fault:.*/p'], [0], [dnl
2802         fault: recv
2803 ])
2804 # bfd/show should show 'down'.
2805 AT_CHECK([ovs-appctl bfd/show | sed -n '/^.*Session State:.*/p'], [0], [dnl
2806         Local Session State: down
2807         Remote Session State: down
2808 ])
2809 # bond/show should show 'may-enable: false' for p0.
2810 AT_CHECK([ovs-appctl bond/show | sed -n '/^.*may_enable:.*/p'], [0], [dnl
2811         may_enable: false
2812         may_enable: true
2813         may_enable: true
2814         may_enable: true
2815 ])
2816
2817 # now enable the bfd on p1 and disable bfd on p0.
2818 AT_CHECK([ovs-vsctl set Interface p1 bfd:enable=true])
2819 AT_CHECK([ovs-vsctl set Interface p0 bfd:enable=false])
2820 # advance the clock to stablize everything.
2821 for i in `seq 0 49`; do ovs-appctl time/warp 100; done
2822 # cfm/show should show 'recv' fault.
2823 AT_CHECK([ovs-appctl cfm/show | sed -n '/^.*fault:.*/p'], [0], [dnl
2824         fault: recv
2825 ])
2826 # bfd/show should show 'down'.
2827 AT_CHECK([ovs-appctl bfd/show | sed -n '/^.*Session State:.*/p'], [0], [dnl
2828         Local Session State: down
2829         Remote Session State: down
2830 ])
2831 # bond/show should show 'may-enable: false' for p0 and p1.
2832 AT_CHECK([ovs-appctl bond/show | sed -n '/^.*may_enable:.*/p'], [0], [dnl
2833         may_enable: false
2834         may_enable: true
2835         may_enable: false
2836         may_enable: true
2837 ])
2838
2839 OVS_VSWITCHD_STOP
2840 AT_CLEANUP
2841
2842 # Unit test for appctl coverage/show command
2843 AT_SETUP([ofproto-dpif - coverage/show])
2844 OVS_VSWITCHD_START
2845
2846 ovs-appctl time/stop
2847 # before the first 5 seconds, nothing can be calculated but the total count.
2848 # there should be two unixctl commands received, but the count of the "appctl
2849 # coverage/show" command is not updated to the total. so there show only 1.
2850 AT_CHECK([ovs-appctl coverage/show | sed -n '/^unixctl_received.*/p'], [], [dnl
2851 unixctl_received           0.0/sec     0.000/sec        0.0000/sec   total: 1
2852 ])
2853
2854 ovs-appctl time/warp 5000
2855 # at first 5 second time instant, should have stats.
2856 AT_CHECK([ovs-appctl coverage/show | sed -n '/^unixctl_received.*/p'], [], [dnl
2857 unixctl_received           0.6/sec     0.050/sec        0.0008/sec   total: 3
2858 ])
2859
2860 for i in `seq 0 10`; do ovs-appctl time/warp 5000; done
2861 # advance to first 1 minute time instant.
2862 AT_CHECK([ovs-appctl coverage/show | sed -n '/^unixctl_received.*/p'], [], [dnl
2863 unixctl_received           0.2/sec     0.250/sec        0.0042/sec   total: 15
2864 ])
2865
2866 ovs-appctl time/warp 60000
2867 # advance to next 1 minute time instant directly, should observe the per-minute
2868 # rate drop.
2869 AT_CHECK([ovs-appctl coverage/show | sed -n '/^unixctl_received.*/p'], [], [dnl
2870 unixctl_received           0.4/sec     0.033/sec        0.0047/sec   total: 17
2871 ])
2872
2873 OVS_VSWITCHD_STOP
2874 AT_CLEANUP