refactor for new netdev_rx class
[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 252`; do echo "table=$i actions=goto_table($(($i+1)))"; done >> flows.txt
28 echo "table=253 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 br0 '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 br0 '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 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=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 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=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 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=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 br0 '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 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=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:65534,enqueue:1:1,enqueue:1:2,enqueue:1:2,enqueue:1:1,output:1,mod_nw_tos:0,output:1,output:65534
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 br0 '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:65534,output:1,output:2,output:3,output:4,output:5,output:6,output:7
201 in_port=4 actions=enqueue:65534: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 br0 '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 br0 '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 br0 '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 br0 '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 br0 '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
255 AT_CAPTURE_FILE([ofctl_monitor.log])
256 AT_DATA([flows.txt], [dnl
257 cookie=0x0 dl_src=10:11:11:11:11:11 actions=controller
258 cookie=0x1 dl_src=20:22:22:22:22:22 actions=controller,resubmit(80,1)
259 cookie=0x2 dl_src=30:33:33:33:33:33 actions=mod_vlan_vid:15,controller
260
261 cookie=0x3 table=1 in_port=80 actions=load:1->NXM_NX_REG0[[]],mod_vlan_vid:80,controller,resubmit(81,2)
262 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)
263 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)
264 cookie=0x6 table=4 in_port=83 actions=load:4->NXM_NX_REG3[[]],mod_nw_src:83.83.83.83,controller,resubmit(84,5)
265 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)
266 cookie=0x8 table=6 in_port=85 actions=mod_tp_src:85,controller,resubmit(86,7)
267 cookie=0x9 table=7 in_port=86 actions=mod_tp_dst:86,controller,controller
268 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
269 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
270 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
271 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
272 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
273 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
274 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
275 cookie=0xb dl_src=50:55:55:55:55:55 dl_type=0x8847 actions=load:1000->OXM_OF_MPLS_LABEL[[]],controller
276 cookie=0xd dl_src=60:66:66:66:66:66 actions=pop_mpls:0x0800,controller
277 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
278 ])
279 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
280
281 dnl Flow miss.
282 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
283
284 for i in 1 2 3 ; do
285     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)'
286 done
287
288 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
289 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
290 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
291 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
292 dnl
293 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
294 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=9 tcp_csum:0
295 dnl
296 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
297 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=9 tcp_csum:0
298 ])
299
300 dnl Singleton controller action.
301 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
302
303 for i in 1 2 3 ; do
304     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)'
305 done
306
307 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
308 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
309 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
310 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
311 dnl
312 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
313 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
314 dnl
315 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
316 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=10:11:11:11:11:11,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=10 tcp_csum:0
317 ])
318
319 dnl Modified controller action.
320 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
321
322 for i in 1 2 3 ; do
323     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)'
324 done
325
326 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
327 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
328 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
329 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
330 dnl
331 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
332 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
333 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 ])
337
338 dnl Modified MPLS controller action.
339 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
340
341 for i in 1 2 3; do
342     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)'
343 done
344
345 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
346 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
347 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
348 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
349 dnl
350 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
351 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
352 dnl
353 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
354 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
355 ])
356
357 dnl Modified MPLS controller action.
358 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
359
360 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)
361
362 for i in 1 2 3; do
363     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)'
364 done
365
366 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
367 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
368 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
369 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
370 dnl
371 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
372 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
373 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:43,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=64,mpls_bos=0
376 ])
377
378 dnl Modified MPLS controller action.
379 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
380
381 for i in 1 2 3; do
382     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))'
383 done
384
385 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
386 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
387 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
388 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
389 dnl
390 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
391 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
392 dnl
393 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
394 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
395 ])
396
397 dnl Modified MPLS controller action.
398 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
399
400 for i in 1 2 3; do
401     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)'
402 done
403
404 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
405 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
406 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
407 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
408 dnl
409 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
410 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
411 dnl
412 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
413 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
414 ])
415
416 dnl Modified MPLS controller action.
417 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
418
419 for i in 1 2 3; do
420     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)'
421 done
422
423 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
424 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
425 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
426 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
427 dnl
428 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
429 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
430 dnl
431 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
432 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
433 ])
434
435 dnl Modified MPLS controller action.
436 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
437
438 for i in 1 2 3; do
439     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)'
440 done
441
442 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
443 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
444 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
445 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
446 dnl
447 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
448 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
449 dnl
450 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
451 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
452 ])
453
454 dnl Modified MPLS controller action.
455 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
456
457 for i in 1 2 3; do
458     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)'
459 done
460
461 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
462 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
463 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
464 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
465 dnl
466 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
467 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
468 dnl
469 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
470 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
471 ])
472
473 dnl Modified MPLS actions.
474 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
475
476 for i in 1 2 3; do
477     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)'
478 done
479
480 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
481 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
482 NXT_PACKET_IN (xid=0x0): cookie=0xb total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
483 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
484 dnl
485 NXT_PACKET_IN (xid=0x0): cookie=0xb total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
486 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
487 dnl
488 NXT_PACKET_IN (xid=0x0): cookie=0xb total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
489 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
490 ])
491
492 dnl Modified MPLS ipv6 controller action.
493 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
494
495 for i in 1 2 3; do
496     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)'
497 done
498
499 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
500 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
501 NXT_PACKET_IN (xid=0x0): cookie=0xc total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
502 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
503 dnl
504 NXT_PACKET_IN (xid=0x0): cookie=0xc total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
505 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
506 dnl
507 NXT_PACKET_IN (xid=0x0): cookie=0xc total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
508 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
509 ])
510
511
512 dnl Modified MPLS pop action.
513 dnl The input is a frame with two MPLS headers which tcpdump -vve shows as:
514 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)
515 dnl             (tos 0x0, ttl 64, id 0, offset 0, flags [none], proto TCP (6), length 44)
516
517 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
518
519 for i in 1 2 3; do
520     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'
521 done
522 #for i in 2 3; do
523 #    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)'
524 #done
525
526 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
527 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
528 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered)
529 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
530 dnl
531 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered)
532 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
533 dnl
534 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered)
535 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
536 ])
537
538 dnl Checksum TCP.
539 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --no-chdir --pidfile 2> ofctl_monitor.log])
540
541 for i in 1 ; do
542     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)'
543 done
544
545 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
546 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
547 NXT_PACKET_IN (xid=0x0): cookie=0x1 total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
548 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
549 dnl
550 NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x3 total_len=64 in_port=1 reg0=0x1 (via action) data_len=64 (unbuffered)
551 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
552 dnl
553 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)
554 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
555 dnl
556 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)
557 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
558 dnl
559 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)
560 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
561 dnl
562 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)
563 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
564 dnl
565 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)
566 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
567 dnl
568 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)
569 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
570 dnl
571 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)
572 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
573 ])
574
575 dnl Checksum UDP.
576 AT_CHECK([ovs-ofctl monitor br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
577
578 for i in 1 ; do
579     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'
580 done
581
582 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
583 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
584 NXT_PACKET_IN (xid=0x0): cookie=0x1 total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
585 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
586 dnl
587 NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x3 total_len=64 in_port=1 reg0=0x1 (via action) data_len=64 (unbuffered)
588 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
589 dnl
590 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)
591 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
592 dnl
593 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)
594 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
595 dnl
596 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)
597 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
598 dnl
599 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)
600 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
601 dnl
602 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)
603 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
604 dnl
605 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)
606 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
607 dnl
608 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)
609 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
610 ])
611
612 AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
613 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
614  cookie=0x1, n_packets=2, n_bytes=120, dl_src=20:22:22:22:22:22 actions=CONTROLLER:65535,resubmit(80,1)
615  cookie=0x2, n_packets=3, n_bytes=180, dl_src=30:33:33:33:33:33 actions=mod_vlan_vid:15,CONTROLLER:65535
616  cookie=0x3, table=1, n_packets=2, n_bytes=120, in_port=80 actions=load:0x1->NXM_NX_REG0[[]],mod_vlan_vid:80,CONTROLLER:65535,resubmit(81,2)
617  cookie=0x4, table=2, n_packets=2, n_bytes=120, in_port=81 actions=load:0x2->NXM_NX_REG1[[]],mod_dl_src:80:81:81:81:81:81,CONTROLLER:65535,resubmit(82,3)
618  cookie=0x5, table=3, n_packets=2, n_bytes=120, in_port=82 actions=load:0x3->NXM_NX_REG2[[]],mod_dl_dst:82:82:82:82:82:82,CONTROLLER:65535,resubmit(83,4)
619  cookie=0x6, table=4, n_packets=2, n_bytes=120, in_port=83 actions=load:0x4->NXM_NX_REG3[[]],mod_nw_src:83.83.83.83,CONTROLLER:65535,resubmit(84,5)
620  cookie=0x7, table=5, n_packets=2, n_bytes=120, 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)
621  cookie=0x8, table=6, n_packets=2, n_bytes=120, in_port=85 actions=mod_tp_src:85,CONTROLLER:65535,resubmit(86,7)
622  cookie=0x9, table=7, n_packets=2, n_bytes=120, in_port=86 actions=mod_tp_dst:86,CONTROLLER:65535,CONTROLLER:65535
623  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
624  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
625  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
626  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
627  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
628  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
629  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
630  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
631  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
632  cookie=0xd, n_packets=3, n_bytes=186, dl_src=60:66:66:66:66:66 actions=pop_mpls:0x0800,CONTROLLER:65535
633  n_packets=3, n_bytes=180, dl_src=10:11:11:11:11:11 actions=CONTROLLER:65535
634 NXST_FLOW reply:
635 ])
636
637 OVS_VSWITCHD_STOP
638 AT_CLEANUP
639
640 AT_SETUP([ofproto-dpif - VLAN handling])
641 OVS_VSWITCHD_START(
642   [set Bridge br0 fail-mode=standalone -- \
643    add-port br0 p1                                  trunks=10,12 -- \
644    add-port br0 p2                           tag=10              -- \
645    add-port br0 p3                           tag=12              \
646                    other-config:priority-tags=true               -- \
647    add-port br0 p4                           tag=12              -- \
648    add-port br0 p5 vlan_mode=native-tagged   tag=10              -- \
649    add-port br0 p6 vlan_mode=native-tagged   tag=10 trunks=10,12 -- \
650    add-port br0 p7 vlan_mode=native-untagged tag=12              -- \
651    add-port br0 p8 vlan_mode=native-untagged tag=12 trunks=10,12 \
652                    other-config:priority-tags=true               -- \
653    set Interface p1 type=dummy -- \
654    set Interface p2 type=dummy -- \
655    set Interface p3 type=dummy -- \
656    set Interface p4 type=dummy -- \
657    set Interface p5 type=dummy -- \
658    set Interface p6 type=dummy -- \
659    set Interface p7 type=dummy -- \
660    set Interface p8 type=dummy --])
661
662 dnl Each of these specifies an in_port by number, a VLAN VID (or "none"),
663 dnl a VLAN PCP (used if the VID isn't "none") and the expected set of datapath
664 dnl actions.
665 for tuple in \
666         "100 none 0 drop" \
667         "100 0    0 drop" \
668         "100 0    1 drop" \
669         "100 10   0 1,5,6,7,8,pop_vlan,2" \
670         "100 10   1 1,5,6,7,8,pop_vlan,2" \
671         "100 11   0 5,7" \
672         "100 11   1 5,7" \
673         "100 12   0 1,5,6,pop_vlan,3,4,7,8" \
674         "100 12   1 1,5,6,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
675         "1  none 0 drop" \
676         "1  0    0 drop" \
677         "1  0    1 drop" \
678         "1  10   0 5,6,7,8,100,pop_vlan,2" \
679         "1  10   1 5,6,7,8,100,pop_vlan,2" \
680         "1  11   0 drop" \
681         "1  11   1 drop" \
682         "1  12   0 5,6,100,pop_vlan,3,4,7,8" \
683         "1  12   1 5,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
684         "2  none 0 push_vlan(vid=10,pcp=0),1,5,6,7,8,100" \
685         "2  0    0 pop_vlan,push_vlan(vid=10,pcp=0),1,5,6,7,8,100" \
686         "2  0    1 pop_vlan,push_vlan(vid=10,pcp=1),1,5,6,7,8,100" \
687         "2  10   0 drop" \
688         "2  10   1 drop" \
689         "2  11   0 drop" \
690         "2  11   1 drop" \
691         "2  12   0 drop" \
692         "2  12   1 drop" \
693         "3  none 0 4,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
694         "3  0    0 pop_vlan,4,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
695         "3  0    1 8,pop_vlan,4,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
696         "3  10   0 drop" \
697         "3  10   1 drop" \
698         "3  11   0 drop" \
699         "3  11   1 drop" \
700         "3  12   0 drop" \
701         "3  12   1 drop" \
702         "4  none 0 3,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
703         "4  0    0 pop_vlan,3,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
704         "4  0    1 3,8,pop_vlan,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
705         "4  10   0 drop" \
706         "4  10   1 drop" \
707         "4  11   0 drop" \
708         "4  11   1 drop" \
709         "4  12   0 drop" \
710         "4  12   1 drop" \
711         "5  none 0 2,push_vlan(vid=10,pcp=0),1,6,7,8,100" \
712         "5  0    0 pop_vlan,2,push_vlan(vid=10,pcp=0),1,6,7,8,100" \
713         "5  0    1 pop_vlan,2,push_vlan(vid=10,pcp=1),1,6,7,8,100" \
714         "5  10   0 1,6,7,8,100,pop_vlan,2" \
715         "5  10   1 1,6,7,8,100,pop_vlan,2" \
716         "5  11   0 7,100" \
717         "5  11   1 7,100" \
718         "5  12   0 1,6,100,pop_vlan,3,4,7,8" \
719         "5  12   1 1,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
720         "6  none 0 2,push_vlan(vid=10,pcp=0),1,5,7,8,100" \
721         "6  0    0 pop_vlan,2,push_vlan(vid=10,pcp=0),1,5,7,8,100" \
722         "6  0    1 pop_vlan,2,push_vlan(vid=10,pcp=1),1,5,7,8,100" \
723         "6  10   0 1,5,7,8,100,pop_vlan,2" \
724         "6  10   1 1,5,7,8,100,pop_vlan,2" \
725         "6  11   0 drop" \
726         "6  11   1 drop" \
727         "6  12   0 1,5,100,pop_vlan,3,4,7,8" \
728         "6  12   1 1,5,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
729         "7  none 0 3,4,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
730         "7  0    0 pop_vlan,3,4,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
731         "7  0    1 3,8,pop_vlan,4,push_vlan(vid=12,pcp=1),1,5,6,100" \
732         "7  10   0 1,5,6,8,100,pop_vlan,2" \
733         "7  10   1 1,5,6,8,100,pop_vlan,2" \
734         "7  11   0 5,100" \
735         "7  11   1 5,100" \
736         "7  12   0 1,5,6,100,pop_vlan,3,4,8" \
737         "7  12   1 1,5,6,100,pop_vlan,4,push_vlan(vid=0,pcp=1),3,8" \
738         "8  none 0 3,4,7,push_vlan(vid=12,pcp=0),1,5,6,100" \
739         "8  0    0 pop_vlan,3,4,7,push_vlan(vid=12,pcp=0),1,5,6,100" \
740         "8  0    1 3,pop_vlan,4,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
741         "8  10   0 1,5,6,7,100,pop_vlan,2" \
742         "8  10   1 1,5,6,7,100,pop_vlan,2" \
743         "8  11   0 drop" \
744         "8  11   1 drop" \
745         "8  12   0 1,5,6,100,pop_vlan,3,4,7" \
746         "8  12   1 1,5,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3"
747 do
748   set $tuple
749   in_port=$1
750   vlan=$2
751   pcp=$3
752   expected=$4
753
754   if test $vlan = none; then
755     flow="in_port($in_port),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff),eth_type(0xabcd)"
756   else
757     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))"
758   fi
759
760   echo "----------------------------------------------------------------------"
761   echo "in_port=$in_port vlan=$vlan pcp=$pcp"
762
763   AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
764   actual=`tail -1 stdout | sed 's/Datapath actions: //'`
765
766   AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
767   mv stdout expout
768   AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
769 done
770
771 OVS_VSWITCHD_STOP
772 AT_CLEANUP
773
774 AT_SETUP([ofproto-dpif - fragment handling])
775 OVS_VSWITCHD_START
776 ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6], [90])
777 AT_DATA([flows.txt], [dnl
778 priority=75 tcp ip_frag=no    tp_dst=80 actions=output:1
779 priority=75 tcp ip_frag=first tp_dst=80 actions=output:2
780 priority=75 tcp ip_frag=later tp_dst=80 actions=output:3
781 priority=50 tcp ip_frag=no              actions=output:4
782 priority=50 tcp ip_frag=first           actions=output:5
783 priority=50 tcp ip_frag=later           actions=output:6
784 ])
785 AT_CHECK([ovs-ofctl replace-flows br0 flows.txt])
786
787 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"
788 no_flow="$base_flow,frag=no),tcp(src=12345,dst=80)"
789 first_flow="$base_flow,frag=first),tcp(src=12345,dst=80)"
790 later_flow="$base_flow,frag=later)"
791
792     # mode    no  first  later
793 for tuple in \
794     'normal    1     5      6' \
795     'drop      1  drop   drop' \
796     'nx-match  1     2      6'
797 do
798   set $tuple
799   mode=$1
800   no=$2
801   first=$3
802   later=$4
803
804   AT_CHECK([ovs-ofctl set-frags br0 $mode])
805   for type in no first later; do
806     eval flow=\$${type}_flow exp_output=\$$type
807     AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
808     AT_CHECK_UNQUOTED([tail -1 stdout], [0], [Datapath actions: $exp_output
809 ])
810   done
811 done
812 OVS_VSWITCHD_STOP
813 AT_CLEANUP
814
815 AT_SETUP([ofproto-dpif - exit])
816 OVS_VSWITCHD_START
817 ADD_OF_PORTS([br0], [1], [2], [3], [10], [11], [12], [13], [14])
818 AT_DATA([flows.txt], [dnl
819 in_port=1 actions=output:10,exit,output:11
820 in_port=2 actions=output:12,resubmit:1,output:12
821 in_port=3 actions=output:13,resubmit:2,output:14
822 ])
823 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
824 AT_CHECK([ovs-appctl ofproto/trace 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=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
825 AT_CHECK([tail -1 stdout], [0],
826   [Datapath actions: 10
827 ])
828 AT_CHECK([ovs-appctl ofproto/trace br0 '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])
829 AT_CHECK([tail -1 stdout], [0],
830   [Datapath actions: 12,10
831 ])
832 AT_CHECK([ovs-appctl ofproto/trace br0 '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])
833 AT_CHECK([tail -1 stdout], [0],
834   [Datapath actions: 13,12,10
835 ])
836 OVS_VSWITCHD_STOP
837 AT_CLEANUP
838
839
840 AT_SETUP([ofproto-dpif - mirroring, select_all])
841 OVS_VSWITCHD_START
842 ADD_OF_PORTS([br0], 1, 2, 3)
843 ovs-vsctl \
844         set Bridge br0 mirrors=@m --\
845         --id=@p3 get Port p3 --\
846         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
847
848 AT_DATA([flows.txt], [dnl
849 in_port=1 actions=output:2
850 in_port=2 actions=output:1
851 ])
852 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
853
854 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)"
855 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
856 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
857   [Datapath actions: 2,3
858 ])
859
860 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)"
861 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
862 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
863   [Datapath actions: 1,3
864 ])
865
866 OVS_VSWITCHD_STOP
867 AT_CLEANUP
868
869
870 AT_SETUP([ofproto-dpif - mirroring, select_src])
871 OVS_VSWITCHD_START
872 ADD_OF_PORTS([br0], 1, 2, 3)
873 ovs-vsctl \
874         set Bridge br0 mirrors=@m --\
875         --id=@p1 get Port p1 -- --id=@p3 get Port p3 --\
876         --id=@m create Mirror name=mymirror select_src_port=@p1 output_port=@p3
877
878 AT_DATA([flows.txt], [dnl
879 in_port=1 actions=output:2
880 in_port=2 actions=output:1
881 ])
882 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
883
884 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)"
885 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
886 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
887   [Datapath actions: 2,3
888 ])
889
890 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)"
891 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
892 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
893   [Datapath actions: 1
894 ])
895 OVS_VSWITCHD_STOP
896 AT_CLEANUP
897
898 AT_SETUP([ofproto-dpif - mirroring, OFPP_NONE ingress port])
899 OVS_VSWITCHD_START
900 ADD_OF_PORTS([br0], 1, 2)
901 ovs-vsctl \
902         set Bridge br0 mirrors=@m --\
903         --id=@p2 get Port p2 --\
904         --id=@m create Mirror name=mymirror select_all=true output_port=@p2
905
906 AT_CHECK([ovs-ofctl add-flow br0 action=output:1])
907
908 # "in_port" defaults to OFPP_NONE if it's not specified.
909 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"
910 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
911 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
912   [Datapath actions: 1,2
913 ])
914
915 OVS_VSWITCHD_STOP
916 AT_CLEANUP
917
918
919 AT_SETUP([ofproto-dpif - mirroring, select_dst])
920 OVS_VSWITCHD_START
921 ADD_OF_PORTS([br0], 1, 2, 3)
922 ovs-vsctl \
923         set Bridge br0 mirrors=@m --\
924         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
925         --id=@m create Mirror name=mymirror select_dst_port=@p2 output_port=@p3
926
927 AT_DATA([flows.txt], [dnl
928 in_port=1 actions=output:2
929 in_port=2 actions=output:1
930 ])
931 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
932
933 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)"
934 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
935 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
936   [Datapath actions: 2,3
937 ])
938
939 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)"
940 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
941 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
942   [Datapath actions: 1
943 ])
944
945 OVS_VSWITCHD_STOP
946 AT_CLEANUP
947
948
949 AT_SETUP([ofproto-dpif - mirroring, select_vlan])
950 OVS_VSWITCHD_START
951 ADD_OF_PORTS([br0], 1, 2, 3)
952 ovs-vsctl \
953         set Bridge br0 mirrors=@m --\
954         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
955         --id=@m create Mirror name=mymirror select_all=true select_vlan=11 output_port=@p3
956
957 AT_DATA([flows.txt], [dnl
958 in_port=1, actions=output:2
959 ])
960 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
961
962 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)"
963 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
964 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
965   [Datapath actions: 2
966 ])
967
968 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))"
969 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
970 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
971   [Datapath actions: 2
972 ])
973
974 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))"
975 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
976 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
977   [Datapath actions: 2,3
978 ])
979
980 OVS_VSWITCHD_STOP
981 AT_CLEANUP
982
983
984 AT_SETUP([ofproto-dpif - mirroring, output_port])
985 OVS_VSWITCHD_START
986 ADD_OF_PORTS([br0], 1, 2, 3)
987 ovs-vsctl \
988         set Bridge br0 mirrors=@m --\
989         --id=@p3 get Port p3 --\
990         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
991
992 AT_DATA([flows.txt], [dnl
993 in_port=1 actions=mod_vlan_vid:17,output:2
994 in_port=2 actions=output:1
995 ])
996 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
997
998 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)"
999 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
1000 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1001   [Datapath actions: push_vlan(vid=17,pcp=0),2,pop_vlan,3
1002 ])
1003
1004 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)"
1005 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
1006 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1007   [Datapath actions: 1,3
1008 ])
1009
1010 OVS_VSWITCHD_STOP
1011 AT_CLEANUP
1012
1013 AT_SETUP([ofproto-dpif - mirroring, output_vlan])
1014 OVS_VSWITCHD_START
1015 ADD_OF_PORTS([br0], 1, 2)
1016 ovs-vsctl \
1017         set Bridge br0 mirrors=@m --\
1018         --id=@m create Mirror name=mymirror select_all=true output_vlan=12
1019
1020 AT_DATA([flows.txt], [dnl
1021 in_port=1 actions=output:2
1022 in_port=2 actions=mod_vlan_vid:17,output:1
1023 ])
1024 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1025
1026 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)"
1027 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
1028 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1029
1030 expected="2,push_vlan(vid=12,pcp=0),1,2,100"
1031 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
1032 mv stdout expout
1033 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
1034
1035 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)"
1036 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
1037 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1038
1039 expected="push_vlan(vid=17,pcp=0),1,pop_vlan,push_vlan(vid=12,pcp=0),1,2,100"
1040 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
1041 mv stdout expout
1042 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
1043
1044 OVS_VSWITCHD_STOP
1045 AT_CLEANUP
1046
1047 m4_define([OFPROTO_TRACE],
1048   [flow="$2"
1049    AT_CHECK([ovs-appctl ofproto/trace $1 "$flow" $3], [0], [stdout])
1050    actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1051    expected="$4"
1052    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" $5],
1053      [0], [stdout])
1054    mv stdout expout
1055    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" $5],
1056      [0], [expout])])
1057
1058 AT_SETUP([ofproto-dpif - MAC learning])
1059 OVS_VSWITCHD_START([set bridge br0 fail-mode=standalone])
1060 ADD_OF_PORTS([br0], 1, 2, 3)
1061
1062 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)'
1063
1064 # Trace an ARP packet arriving on p3, to create a MAC learning entry.
1065 OFPROTO_TRACE(
1066   [br0],
1067   [in_port(3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
1068   [-generate],
1069   [1,2,100])
1070
1071 # Check for the MAC learning entry.
1072 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1073  port  VLAN  MAC                Age
1074     3     0  50:54:00:00:00:05    ?
1075 ])
1076
1077 # Trace a packet arrival destined for the learned MAC.
1078 # (This will also learn a MAC.)
1079 OFPROTO_TRACE(
1080   [br0],
1081   [in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05),$arp],
1082   [-generate],
1083   [3])
1084
1085 # Check for both MAC learning entries.
1086 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1087  port  VLAN  MAC                Age
1088     3     0  50:54:00:00:00:05    ?
1089     1     0  50:54:00:00:00:06    ?
1090 ])
1091
1092 # Trace a packet arrival that updates the first learned MAC entry.
1093 OFPROTO_TRACE(
1094   [br0],
1095   [in_port(2),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
1096   [-generate],
1097   [1,3,100])
1098
1099 # Check that the MAC learning entry was updated.
1100 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1101  port  VLAN  MAC                Age
1102     1     0  50:54:00:00:00:06    ?
1103     2     0  50:54:00:00:00:05    ?
1104 ])
1105
1106 # Add another bridge.
1107 AT_CHECK(
1108   [ovs-vsctl \
1109      -- add-br br1 \
1110      -- set bridge br1 datapath-type=dummy \
1111      -- add-port br1 p4 -- set interface p4 type=dummy \
1112      -- add-port br1 p5 -- set interface p5 type=dummy])
1113
1114 # Trace some packet arrivals in br1 to create MAC learning entries there too.
1115 OFPROTO_TRACE(
1116   [br1],
1117   [in_port(4),eth(src=50:54:00:00:00:06,dst=ff:ff:ff:ff:ff:ff),$arp],
1118   [-generate],
1119   [5,101])
1120 OFPROTO_TRACE(
1121   [br1],
1122   [in_port(5),eth(src=50:54:00:00:00:07,dst=ff:ff:ff:ff:ff:ff),$arp],
1123   [-generate],
1124   [4,101])
1125
1126 # Check that the MAC learning entries were added.
1127 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1128  port  VLAN  MAC                Age
1129     4     0  50:54:00:00:00:06    ?
1130     5     0  50:54:00:00:00:07    ?
1131 ])
1132
1133 # Delete port p1 and see that its MAC learning entry disappeared, and
1134 # that the MAC learning entry for the same MAC was also deleted from br1.
1135 AT_CHECK([ovs-vsctl del-port p1])
1136 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1137  port  VLAN  MAC                Age
1138     2     0  50:54:00:00:00:05    ?
1139 ])
1140 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1141  port  VLAN  MAC                Age
1142     5     0  50:54:00:00:00:07    ?
1143 ])
1144
1145 OVS_VSWITCHD_STOP
1146 AT_CLEANUP
1147
1148 AT_SETUP([ofproto-dpif - MAC table overflow])
1149 OVS_VSWITCHD_START(
1150   [set bridge br0 fail-mode=standalone other-config:mac-table-size=10 -- \
1151    add-port br0 p1 -- set Interface p1 type=dummy -- \
1152    add-port br0 p2 -- set Interface p2 type=dummy -- \
1153    add-port br0 p3 -- set Interface p3 type=dummy])
1154
1155 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)'
1156
1157 AT_CHECK([ovs-appctl time/stop])
1158
1159 # Trace 10 ARP packets arriving on p3, to create MAC learning entries.
1160 for i in 0 1 2 3 4 5 6 7 8 9; do
1161     OFPROTO_TRACE(
1162       [br0],
1163       [in_port(3),eth(src=50:54:00:00:00:0$i,dst=ff:ff:ff:ff:ff:ff),$arp],
1164       [-generate],
1165       [1,2,100])
1166     ovs-appctl time/warp 1000
1167 done
1168
1169 # Check for the MAC learning entries.
1170 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/ *[[0-9]]\{1,\}$//' | sort],
1171   [0], [dnl
1172     3     0  50:54:00:00:00:00
1173     3     0  50:54:00:00:00:01
1174     3     0  50:54:00:00:00:02
1175     3     0  50:54:00:00:00:03
1176     3     0  50:54:00:00:00:04
1177     3     0  50:54:00:00:00:05
1178     3     0  50:54:00:00:00:06
1179     3     0  50:54:00:00:00:07
1180     3     0  50:54:00:00:00:08
1181     3     0  50:54:00:00:00:09
1182  port  VLAN  MAC                Age
1183 ])
1184
1185 # Trace another ARP packet on another MAC.
1186 OFPROTO_TRACE(
1187   [br0],
1188   [in_port(3),eth(src=50:54:00:00:00:10,dst=ff:ff:ff:ff:ff:ff),$arp],
1189   [-generate],
1190   [1,2,100])
1191
1192 # Check that the new one chased the oldest one out of the table.
1193 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/' | sort],
1194   [0], [dnl
1195     3     0  50:54:00:00:00:01    ?
1196     3     0  50:54:00:00:00:02    ?
1197     3     0  50:54:00:00:00:03    ?
1198     3     0  50:54:00:00:00:04    ?
1199     3     0  50:54:00:00:00:05    ?
1200     3     0  50:54:00:00:00:06    ?
1201     3     0  50:54:00:00:00:07    ?
1202     3     0  50:54:00:00:00:08    ?
1203     3     0  50:54:00:00:00:09    ?
1204     3     0  50:54:00:00:00:10    ?
1205  port  VLAN  MAC                Age
1206 ])
1207 OVS_VSWITCHD_STOP
1208 AT_CLEANUP
1209
1210 dnl Test that sFlow samples packets correctly.
1211 AT_SETUP([ofproto-dpif - sFlow packet sampling])
1212 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
1213
1214 ON_EXIT([kill `cat test-sflow.pid`])
1215 AT_CHECK([test-sflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > sflow.log], [0], [], [ignore])
1216 AT_CAPTURE_FILE([sflow.log])
1217 SFLOW_PORT=`parse_listening_port < test-sflow.log`
1218
1219 ovs-appctl time/stop
1220
1221 ADD_OF_PORTS([br0], 1, 2)
1222 ovs-vsctl \
1223    set Interface br0 options:ifindex=1002 -- \
1224    set Interface p1 options:ifindex=1004 -- \
1225    set Interface p2 options:ifindex=1003 -- \
1226    set Bridge br0 sflow=@sf -- \
1227    --id=@sf create sflow targets=\"127.0.0.1:$SFLOW_PORT\" \
1228      header=128 sampling=1 polling=1
1229
1230 dnl open with ARP packets to seed the bridge-learning.  The output
1231 dnl ifIndex numbers should be reported predictably after that.
1232 dnl Since we set sampling=1 we should see all of these packets
1233 dnl reported. Sorting the output by data-source and seqNo makes
1234 dnl it deterministic. Ensuring that we send at least two packets
1235 dnl into each port means we get to check the seq nos are
1236 dnl incrementing correctly.
1237
1238 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)'
1239 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)'
1240 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)'
1241 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)'
1242 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)'
1243
1244 dnl sleep long enough to get more than one counter sample
1245 dnl from each datasource so we can check sequence numbers
1246 for i in `seq 1 30`; do
1247     ovs-appctl time/warp 100
1248 done
1249 OVS_VSWITCHD_STOP
1250 ovs-appctl -t test-sflow exit
1251
1252 AT_CHECK([[sort sflow.log | $EGREP 'HEADER|ERROR' | sed 's/ /\
1253         /g']], [0], [dnl
1254 HEADER
1255         dgramSeqNo=1
1256         ds=127.0.0.1>2:1000
1257         fsSeqNo=1
1258         in_vlan=0
1259         in_priority=0
1260         out_vlan=0
1261         out_priority=0
1262         meanSkip=1
1263         samplePool=1
1264         dropEvents=0
1265         in_ifindex=1004
1266         in_format=0
1267         out_ifindex=2
1268         out_format=2
1269         hdr_prot=1
1270         pkt_len=64
1271         stripped=4
1272         hdr_len=60
1273         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
1274 HEADER
1275         dgramSeqNo=1
1276         ds=127.0.0.1>2:1000
1277         fsSeqNo=2
1278         in_vlan=0
1279         in_priority=0
1280         out_vlan=0
1281         out_priority=0
1282         meanSkip=1
1283         samplePool=2
1284         dropEvents=0
1285         in_ifindex=1003
1286         in_format=0
1287         out_ifindex=2
1288         out_format=2
1289         hdr_prot=1
1290         pkt_len=64
1291         stripped=4
1292         hdr_len=60
1293         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
1294 HEADER
1295         dgramSeqNo=1
1296         ds=127.0.0.1>2:1000
1297         fsSeqNo=3
1298         in_vlan=0
1299         in_priority=0
1300         out_vlan=0
1301         out_priority=0
1302         meanSkip=1
1303         samplePool=3
1304         dropEvents=0
1305         in_ifindex=1004
1306         in_format=0
1307         out_ifindex=1003
1308         out_format=0
1309         hdr_prot=1
1310         pkt_len=64
1311         stripped=4
1312         hdr_len=60
1313         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
1314 HEADER
1315         dgramSeqNo=1
1316         ds=127.0.0.1>2:1000
1317         fsSeqNo=4
1318         in_vlan=0
1319         in_priority=0
1320         out_vlan=0
1321         out_priority=0
1322         meanSkip=1
1323         samplePool=4
1324         dropEvents=0
1325         in_ifindex=1003
1326         in_format=0
1327         out_ifindex=1004
1328         out_format=0
1329         hdr_prot=1
1330         pkt_len=64
1331         stripped=4
1332         hdr_len=60
1333         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
1334 HEADER
1335         dgramSeqNo=1
1336         ds=127.0.0.1>2:1000
1337         fsSeqNo=5
1338         in_vlan=0
1339         in_priority=0
1340         out_vlan=0
1341         out_priority=0
1342         meanSkip=1
1343         samplePool=5
1344         dropEvents=0
1345         in_ifindex=1003
1346         in_format=0
1347         out_ifindex=1004
1348         out_format=0
1349         hdr_prot=1
1350         pkt_len=64
1351         stripped=4
1352         hdr_len=60
1353         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
1354 ])
1355
1356 AT_CHECK([[sort sflow.log | $EGREP 'IFCOUNTERS|ERROR' | head -6 | sed 's/ /\
1357         /g']], [0], [dnl
1358 IFCOUNTERS
1359         dgramSeqNo=2
1360         ds=127.0.0.1>0:1002
1361         csSeqNo=1
1362         ifindex=1002
1363         type=6
1364         ifspeed=100000000
1365         direction=0
1366         status=3
1367         in_octets=0
1368         in_unicasts=0
1369         in_multicasts=0
1370         in_broadcasts=4294967295
1371         in_discards=0
1372         in_errors=0
1373         in_unknownprotos=4294967295
1374         out_octets=120
1375         out_unicasts=2
1376         out_multicasts=4294967295
1377         out_broadcasts=4294967295
1378         out_discards=0
1379         out_errors=0
1380         promiscuous=0
1381 IFCOUNTERS
1382         dgramSeqNo=2
1383         ds=127.0.0.1>0:1003
1384         csSeqNo=1
1385         ifindex=1003
1386         type=6
1387         ifspeed=100000000
1388         direction=0
1389         status=0
1390         in_octets=98
1391         in_unicasts=3
1392         in_multicasts=0
1393         in_broadcasts=4294967295
1394         in_discards=0
1395         in_errors=0
1396         in_unknownprotos=4294967295
1397         out_octets=120
1398         out_unicasts=2
1399         out_multicasts=4294967295
1400         out_broadcasts=4294967295
1401         out_discards=0
1402         out_errors=0
1403         promiscuous=0
1404 IFCOUNTERS
1405         dgramSeqNo=2
1406         ds=127.0.0.1>0:1004
1407         csSeqNo=1
1408         ifindex=1004
1409         type=6
1410         ifspeed=100000000
1411         direction=0
1412         status=0
1413         in_octets=84
1414         in_unicasts=2
1415         in_multicasts=0
1416         in_broadcasts=4294967295
1417         in_discards=0
1418         in_errors=0
1419         in_unknownprotos=4294967295
1420         out_octets=180
1421         out_unicasts=3
1422         out_multicasts=4294967295
1423         out_broadcasts=4294967295
1424         out_discards=0
1425         out_errors=0
1426         promiscuous=0
1427 IFCOUNTERS
1428         dgramSeqNo=3
1429         ds=127.0.0.1>0:1002
1430         csSeqNo=2
1431         ifindex=1002
1432         type=6
1433         ifspeed=100000000
1434         direction=0
1435         status=3
1436         in_octets=0
1437         in_unicasts=0
1438         in_multicasts=0
1439         in_broadcasts=4294967295
1440         in_discards=0
1441         in_errors=0
1442         in_unknownprotos=4294967295
1443         out_octets=120
1444         out_unicasts=2
1445         out_multicasts=4294967295
1446         out_broadcasts=4294967295
1447         out_discards=0
1448         out_errors=0
1449         promiscuous=0
1450 IFCOUNTERS
1451         dgramSeqNo=3
1452         ds=127.0.0.1>0:1003
1453         csSeqNo=2
1454         ifindex=1003
1455         type=6
1456         ifspeed=100000000
1457         direction=0
1458         status=0
1459         in_octets=98
1460         in_unicasts=3
1461         in_multicasts=0
1462         in_broadcasts=4294967295
1463         in_discards=0
1464         in_errors=0
1465         in_unknownprotos=4294967295
1466         out_octets=120
1467         out_unicasts=2
1468         out_multicasts=4294967295
1469         out_broadcasts=4294967295
1470         out_discards=0
1471         out_errors=0
1472         promiscuous=0
1473 IFCOUNTERS
1474         dgramSeqNo=3
1475         ds=127.0.0.1>0:1004
1476         csSeqNo=2
1477         ifindex=1004
1478         type=6
1479         ifspeed=100000000
1480         direction=0
1481         status=0
1482         in_octets=84
1483         in_unicasts=2
1484         in_multicasts=0
1485         in_broadcasts=4294967295
1486         in_discards=0
1487         in_errors=0
1488         in_unknownprotos=4294967295
1489         out_octets=180
1490         out_unicasts=3
1491         out_multicasts=4294967295
1492         out_broadcasts=4294967295
1493         out_discards=0
1494         out_errors=0
1495         promiscuous=0
1496 ])
1497 AT_CLEANUP
1498
1499
1500
1501 dnl Test that basic NetFlow reports flow statistics correctly:
1502 dnl - The initial packet of a flow are correctly accounted.
1503 dnl - Later packets within a flow are correctly accounted.
1504 dnl - Flow actions changing (in this case, due to MAC learning)
1505 dnl   cause a record to be sent.
1506 AT_SETUP([ofproto-dpif - NetFlow flow expiration])
1507
1508 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
1509 ADD_OF_PORTS([br0], 1, 2)
1510
1511 ON_EXIT([kill `cat test-netflow.pid`])
1512 AT_CHECK([test-netflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > netflow.log], [0], [], [ignore])
1513 AT_CAPTURE_FILE([netflow.log])
1514 NETFLOW_PORT=`parse_listening_port < test-netflow.log`
1515
1516 ovs-vsctl \
1517    set Bridge br0 netflow=@nf -- \
1518    --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
1519      engine_id=1 engine_type=2 active_timeout=30 add-id-to-interface=false
1520
1521 for delay in 1000 30000; do
1522     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)'
1523     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)'
1524
1525     ovs-appctl time/warp $delay
1526 done
1527
1528 sleep 1
1529 OVS_VSWITCHD_STOP
1530 ovs-appctl -t test-netflow exit
1531
1532 AT_CHECK([[sed -e 's/, uptime [0-9]*//
1533 s/, now [0-9.]*//
1534 s/time \([0-9]*\)\.\.\.\1$/time <moment>/
1535 s/time [0-9]*\.\.\.[0-9]*/time <range>/
1536 ' netflow.log | sort]], [0],
1537   [
1538 header: v5, seq 0, engine 2,1
1539 header: v5, seq 1, engine 2,1
1540 seq 0: 192.168.0.1 > 192.168.0.2, if 1 > 65535, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
1541 seq 1: 192.168.0.1 > 192.168.0.2, if 1 > 2, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
1542 seq 1: 192.168.0.2 > 192.168.0.1, if 2 > 1, 2 pkts, 120 bytes, ICMP 0:0, time <range>
1543 ])
1544 AT_CLEANUP
1545
1546 dnl Test that basic NetFlow reports active expirations correctly.
1547 AT_SETUP([ofproto-dpif - NetFlow active expiration])
1548
1549 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
1550 ADD_OF_PORTS([br0], 1, 2)
1551
1552 ON_EXIT([kill `cat test-netflow.pid`])
1553 AT_CHECK([test-netflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > netflow.log], [0], [], [ignore])
1554 AT_CAPTURE_FILE([netflow.log])
1555 NETFLOW_PORT=`parse_listening_port < test-netflow.log`
1556
1557 ovs-vsctl \
1558    set Bridge br0 netflow=@nf -- \
1559    --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
1560      engine_id=1 engine_type=2 active_timeout=10 add-id-to-interface=false
1561
1562 AT_CHECK([ovs-appctl time/stop])
1563 n=1
1564 while test $n -le 60; do
1565     n=`expr $n + 1`
1566
1567     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)'
1568     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)'
1569
1570     ovs-appctl time/warp 1000
1571 done
1572
1573 ovs-appctl time/warp 10000
1574
1575 sleep 1
1576 OVS_VSWITCHD_STOP
1577 ovs-appctl -t test-netflow exit
1578
1579 # Count the number of reported packets:
1580 # - From source to destination before MAC learning kicks in (just one).
1581 # - From source to destination after that.
1582 # - From destination to source.
1583 n_learn=0
1584 n_in=0
1585 n_out=0
1586 n_other=0
1587 n_recs=0
1588 none=0
1589 while read line; do
1590     pkts=`echo "$line" | sed 's/.*, \([[0-9]]*\) pkts,.*/\1/'`
1591     case $pkts in
1592          [[0-9]]*) ;;
1593          *) continue ;;
1594     esac
1595
1596     case $line in
1597         "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 65535, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
1598             counter=n_learn
1599             ;;
1600         "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 2, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
1601             counter=n_in
1602             ;;
1603         "seq "*": 192.168.0.2 > 192.168.0.1, if 2 > 1, "*" pkts, "*" bytes, TCP 80 > 1234, time "*)
1604             counter=n_out
1605             ;;
1606         *)
1607             counter=n_other
1608             ;;
1609     esac
1610     eval $counter=\`expr \$$counter + \$pkts\`
1611     n_recs=`expr $n_recs + 1`
1612 done < netflow.log
1613
1614 # There should be exactly 1 MAC learning packet,
1615 # exactly 59 other packets in that direction,
1616 # and exactly 60 packets in the other direction.
1617 AT_CHECK([echo $n_learn $n_in $n_out $n_other], [0], [1 59 60 0
1618 ])
1619
1620 # There should be 1 expiration for MAC learning,
1621 # at least 5 active and a final expiration in one direction,
1622 # and at least 5 active and a final expiration in the other direction.
1623 echo $n_recs
1624 AT_CHECK([test $n_recs -ge 13])
1625
1626 AT_CLEANUP
1627
1628 AT_SETUP([idle_age and hard_age increase over time])
1629 OVS_VSWITCHD_START
1630
1631 # get_ages DURATION HARD IDLE
1632 #
1633 # Fetch the flow duration, hard age, and idle age into the variables
1634 # whose names are given as arguments.  Rounds DURATION down to the
1635 # nearest integer.  If hard_age doesn't appear in the output, sets
1636 # HARD to "none".  If idle_age doesn't appear in the output, sets IDLE
1637 # to 0.
1638 get_ages () {
1639     AT_CHECK([ovs-ofctl dump-flows br0], [0], [stdout])
1640
1641     duration=`sed -n 's/.*duration=\([[0-9]]*\)\(\.[[0-9]]*\)\{0,1\}s.*/\1/p' stdout`
1642     AT_CHECK([[expr X"$duration" : 'X[0-9][0-9]*$']], [0], [ignore])
1643     AS_VAR_COPY([$1], [duration])
1644
1645     hard=`sed -n 's/.*hard_age=\([[0-9]]*\),.*/\1/p' stdout`
1646     if test X"$hard" = X; then
1647         hard=none
1648     else
1649         AT_CHECK([[expr X"$hard" : 'X[0-9][0-9]*$']], [0], [ignore])
1650     fi
1651     AS_VAR_COPY([$2], [hard])
1652
1653     idle=`sed -n 's/.*idle_age=\([[0-9]]*\),.*/\1/p' stdout`
1654     if test X"$idle" = X; then
1655         idle=0
1656     else
1657         AT_CHECK([[expr X"$idle" : 'X[0-9][0-9]*$']], [0], [ignore])
1658     fi
1659     AS_VAR_COPY([$3], [idle])
1660 }
1661
1662 # Add a flow and get its initial hard and idle age.
1663 AT_CHECK([ovs-ofctl add-flow br0 hard_timeout=199,idle_timeout=188,actions=drop])
1664 get_ages duration1 hard1 idle1
1665
1666 # Warp time forward by 10 seconds, then modify the flow's actions.
1667 ovs-appctl time/warp 10000
1668 get_ages duration2 hard2 idle2
1669 AT_CHECK([ovs-ofctl mod-flows br0 actions=flood])
1670
1671 # Warp time forward by 10 seconds.
1672 ovs-appctl time/warp 10000
1673 get_ages duration3 hard3 idle3
1674
1675 # Warp time forward 10 more seconds, then pass some packets through the flow,
1676 # then warp forward a few more times because idle times are only updated
1677 # occasionally.
1678 ovs-appctl time/warp 10000
1679 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)'
1680 ovs-appctl time/warp 1000
1681 ovs-appctl time/warp 1000
1682 ovs-appctl time/warp 1000
1683 get_ages duration4 hard4 idle4
1684
1685 printf "duration: %4s => %4s => %4s => %4s\n" $duration1 $duration2 $duration3 $duration4
1686 printf "hard_age: %4s => %4s => %4s => %4s\n" $hard1 $hard2 $hard3 $hard4
1687 printf "idle_age: %4s => %4s => %4s => %4s\n" $idle1 $idle2 $idle3 $idle4
1688
1689 # Duration should increase steadily over time.
1690 AT_CHECK([test $duration1 -lt $duration2])
1691 AT_CHECK([test $duration2 -lt $duration3])
1692 AT_CHECK([test $duration3 -lt $duration4])
1693
1694 # Hard age should be "none" initially because it's the same as flow_duration,
1695 # then it should increase.
1696 AT_CHECK([test $hard1 = none])
1697 AT_CHECK([test $hard2 = none])
1698 AT_CHECK([test $hard3 != none])
1699 AT_CHECK([test $hard4 != none])
1700 AT_CHECK([test $hard3 -lt $hard4])
1701
1702 # Idle age should increase from 1 to 2 to 3, then decrease.
1703 AT_CHECK([test $idle1 -lt $idle2])
1704 AT_CHECK([test $idle2 -lt $idle3])
1705 AT_CHECK([test $idle3 -gt $idle4])
1706
1707 # Check some invariant relationships.
1708 AT_CHECK([test $duration1 = $idle1])
1709 AT_CHECK([test $duration2 = $idle2])
1710 AT_CHECK([test $duration3 = $idle3])
1711 AT_CHECK([test $idle3 -gt $hard3])
1712 AT_CHECK([test $idle4 -lt $hard4])
1713 AT_CHECK([test $hard4 -lt $duration4])
1714
1715 OVS_VSWITCHD_STOP
1716 AT_CLEANUP
1717
1718 AT_SETUP([ofproto-dpif - fin_timeout])
1719 OVS_VSWITCHD_START
1720 AT_DATA([flows.txt], [dnl
1721 in_port=1 actions=output:2
1722 in_port=2 actions=mod_vlan_vid:17,output:1
1723 ])
1724 AT_CHECK([ovs-ofctl add-flow br0 'idle_timeout=60,actions=fin_timeout(idle_timeout=5)'])
1725 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1726 [NXST_FLOW reply:
1727  idle_timeout=60, actions=fin_timeout(idle_timeout=5)
1728 ])
1729 # Check that a TCP SYN packet does not change the timeout.  (Because
1730 # flow stats updates are mainly what implements the fin_timeout
1731 # feature, we warp forward a couple of times to ensure that flow stats
1732 # run before re-checking the flow table.)
1733 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f908004500003c2e2440004006465dac11370dac11370b828b0016751e267b00000000a00216d017360000020405b40402080a2d25085f0000000001030307], [0], [success
1734 ])
1735 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
1736 warped
1737 ])
1738 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1739 [NXST_FLOW reply:
1740  n_packets=1, n_bytes=74, idle_timeout=60, actions=fin_timeout(idle_timeout=5)
1741 ])
1742 # Check that a TCP FIN packet does change the timeout.
1743 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f90800451000342e3e40004006463bac11370dac11370b828b0016751e319dfc96399b801100717ae800000101080a2d250a9408579588], [0], [success
1744 ])
1745 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
1746 warped
1747 ])
1748 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1749 [NXST_FLOW reply:
1750  n_packets=2, n_bytes=140, idle_timeout=5, actions=fin_timeout(idle_timeout=5)
1751 ])
1752 OVS_VSWITCHD_STOP
1753 AT_CLEANUP
1754
1755 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-dps])
1756 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
1757 ADD_OF_PORTS([br0], [1], [2])
1758 ADD_OF_PORTS([br1], [3])
1759
1760 AT_CHECK([ovs-appctl dpif/dump-dps], [0], [dnl
1761 dummy@br0
1762 dummy@br1
1763 ])
1764 OVS_VSWITCHD_STOP
1765 AT_CLEANUP
1766
1767 AT_SETUP([ofproto-dpif - ovs-appctl dpif/show])
1768 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
1769 ADD_OF_PORTS([br0], [1], [2])
1770 ADD_OF_PORTS([br1], [3])
1771
1772 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
1773 br0 (dummy@ovs-dummy):
1774         lookups: hit:0 missed:0
1775         flows: cur: 0, avg: 0.000, max: 0, life span: 0(ms)
1776                 overall avg: add rate: 0.000/min, del rate: 0.000/min
1777         br0 65534/100: (dummy)
1778         p1 1/1: (dummy)
1779         p2 2/2: (dummy)
1780 br1 (dummy@ovs-dummy):
1781         lookups: hit:0 missed:0
1782         flows: cur: 0, avg: 0.000, max: 0, life span: 0(ms)
1783                 overall avg: add rate: 0.000/min, del rate: 0.000/min
1784         br1 65534/101: (dummy)
1785         p3 3/3: (dummy)
1786 ])
1787
1788 AT_CHECK([ovs-appctl dpif/show br0], [0], [dnl
1789 br0 (dummy@ovs-dummy):
1790         lookups: hit:0 missed:0
1791         flows: cur: 0, avg: 0.000, max: 0, life span: 0(ms)
1792                 overall avg: add rate: 0.000/min, del rate: 0.000/min
1793         br0 65534/100: (dummy)
1794         p1 1/1: (dummy)
1795         p2 2/2: (dummy)
1796 ])
1797 OVS_VSWITCHD_STOP
1798 AT_CLEANUP
1799
1800 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-flows])
1801 OVS_VSWITCHD_START([add-br br1 -- \
1802                     set bridge br1 datapath-type=dummy fail-mode=secure])
1803 ADD_OF_PORTS([br0], [1], [2])
1804 ADD_OF_PORTS([br1], [3])
1805
1806 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)'], [0], [success
1807 ])
1808 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)'], [0], [success
1809 ])
1810 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)'], [0], [success
1811 ])
1812
1813 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
1814 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), packets:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller))
1815 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), packets:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller))
1816 ])
1817
1818 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
1819 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), packets:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller))
1820 ])
1821
1822 OVS_VSWITCHD_STOP
1823 AT_CLEANUP
1824
1825 AT_SETUP([ofproto-dpif - ovs-appctl dpif/del-flows])
1826 OVS_VSWITCHD_START([add-br br1 -- \
1827                     set bridge br1 datapath-type=dummy fail-mode=secure])
1828 ADD_OF_PORTS([br0], [1], [2])
1829 ADD_OF_PORTS([br1], [3])
1830
1831 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)'], [0], [success
1832 ])
1833 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)'], [0], [success
1834 ])
1835 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)'], [0], [success
1836 ])
1837
1838 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
1839 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), packets:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller))
1840 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), packets:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller))
1841 ])
1842
1843 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
1844 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), packets:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller))
1845 ])
1846
1847 AT_CHECK([ovs-appctl dpif/del-flows br0])
1848 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
1849 ])
1850
1851 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
1852 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), packets:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller))
1853 ])
1854
1855 OVS_VSWITCHD_STOP
1856 AT_CLEANUP
1857
1858 AT_SETUP([ofproto-dpif - patch ports])
1859 OVS_VSWITCHD_START([add-br br1 \
1860 -- set bridge br1 datapath-type=dummy fail-mode=secure \
1861 -- add-port br1 pbr1 -- set int pbr1 type=patch options:peer=pbr0 \
1862 -- add-port br0 pbr0 -- set int pbr0 type=patch options:peer=pbr1])
1863
1864 ADD_OF_PORTS([br0], [2])
1865 ADD_OF_PORTS([br1], [3])
1866
1867 AT_CHECK([ovs-ofctl add-flow br0 actions=LOCAL,output:1,output:2])
1868 AT_CHECK([ovs-ofctl add-flow br1 actions=LOCAL,output:1,output:3])
1869
1870 for i in $(seq 1 10); do
1871     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)'
1872 done
1873
1874 for i in $(seq 1 5); do
1875     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)'
1876 done
1877
1878 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
1879 warped
1880 ])
1881
1882 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
1883 br0 (dummy@ovs-dummy):
1884         lookups: hit:9 missed:1
1885         flows: cur: 1, avg: 1.000, max: 1, life span: 0(ms)
1886                 overall avg: add rate: 0.000/min, del rate: 0.000/min
1887         br0 65534/100: (dummy)
1888         p2 2/2: (dummy)
1889         pbr0 1/none: (patch: peer=pbr1)
1890 br1 (dummy@ovs-dummy):
1891         lookups: hit:4 missed:1
1892         flows: cur: 1, avg: 1.000, max: 1, life span: 0(ms)
1893                 overall avg: add rate: 0.000/min, del rate: 0.000/min
1894         br1 65534/101: (dummy)
1895         p3 3/3: (dummy)
1896         pbr1 1/none: (patch: peer=pbr0)
1897 ])
1898
1899 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_USED], [0], [dnl
1900 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), packets:9, bytes:540, used:0.0s, actions:101,3,2
1901 ]),
1902 AT_CHECK([ovs-appctl dpif/dump-flows br1 | STRIP_USED], [0], [dnl
1903 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), packets:4, bytes:240, used:0.0s, actions:100,2,3
1904 ])
1905
1906 AT_CHECK([ovs-ofctl dump-ports br0 pbr0], [0], [dnl
1907 OFPST_PORT reply (xid=0x4): 1 ports
1908   port  1: rx pkts=5, bytes=300, drop=0, errs=0, frame=0, over=0, crc=0
1909            tx pkts=10, bytes=600, drop=0, errs=0, coll=0
1910 ])
1911
1912 AT_CHECK([ovs-ofctl dump-ports br1 pbr1], [0], [dnl
1913 OFPST_PORT reply (xid=0x4): 1 ports
1914   port  1: rx pkts=10, bytes=600, drop=0, errs=0, frame=0, over=0, crc=0
1915            tx pkts=5, bytes=300, drop=0, errs=0, coll=0
1916 ])
1917
1918 OVS_VSWITCHD_STOP
1919 AT_CLEANUP
1920
1921 AT_SETUP([ofproto-dpif - ovs-appctl dpif/show rates])
1922 OVS_VSWITCHD_START([set Bridge br0 fail-mode=secure])
1923 ADD_OF_PORTS([br0], 1, 2)
1924
1925 AT_CHECK([ovs-ofctl add-flow br0 actions=LOCAL,output:1,output:2])
1926
1927 for i in $(seq 1 61); do
1928     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)'
1929     ovs-appctl time/warp 10000
1930     ovs-appctl time/warp 50000
1931 done
1932
1933 AT_CHECK([ovs-appctl time/warp 10000], [0], [warped
1934 ])
1935
1936 AT_CHECK([ovs-appctl dpif/show | sed 's/ 10[[0-9]]\{3\}(ms)$/ 10000(ms)/'], [0], [dnl
1937 br0 (dummy@ovs-dummy):
1938         lookups: hit:0 missed:61
1939         flows: cur: 0, avg: 1.000, max: 1, life span: 10000(ms)
1940                 hourly avg: add rate: 0.641/min, del rate: 0.641/min
1941                 overall avg: add rate: 1.000/min, del rate: 1.000/min
1942         br0 65534/100: (dummy)
1943         p1 1/1: (dummy)
1944         p2 2/2: (dummy)
1945 ])
1946
1947 OVS_VSWITCHD_STOP
1948 AT_CLEANUP