nicira-ext: Add Nicira actions NXAST_STACK_PUSH and NXAST_STACK_POP.
[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 - registers])
24 OVS_VSWITCHD_START
25 ADD_OF_PORTS([br0], [20], [21], [22], [33], [90])
26 AT_DATA([flows.txt], [dnl
27 in_port=90                 actions=resubmit:2,resubmit:3,resubmit:4,resubmit:91
28 in_port=91                 actions=resubmit:5,resubmit:6,resubmit:7,resubmit:92
29 in_port=92                 actions=resubmit:8,resubmit:9,resubmit:10,resubmit:11,resubmit:93
30 in_port=93                 actions=resubmit:12,resubmit:13,resubmit:14,resubmit:15
31
32 in_port=2                  actions=load:0x000db000->NXM_NX_REG0[[]]
33 in_port=3                  actions=load:0xdea->NXM_NX_REG0[[20..31]]
34 in_port=4                  actions=load:0xeef->NXM_NX_REG0[[0..11]]
35 in_port=5                  actions=move:NXM_NX_REG0[[]]->NXM_NX_REG1[[]]
36 in_port=6                  actions=load:0x22222222->NXM_NX_REG2[[]]
37 in_port=7                  actions=move:NXM_NX_REG1[[20..31]]->NXM_NX_REG2[[0..11]]
38 in_port=8                  actions=move:NXM_NX_REG1[[0..11]]->NXM_NX_REG2[[20..31]]
39 in_port=9,reg0=0xdeadbeef  actions=output:20
40 in_port=10,reg1=0xdeadbeef actions=output:21
41 in_port=11,reg2=0xeef22dea actions=output:22
42
43 dnl Sanilty check all registers
44 in_port=12 actions=load:0x10->NXM_NX_REG0[[]],load:0x11->NXM_NX_REG1[[]],load:0x12->NXM_NX_REG2[[]]
45 in_port=13 actions=load:0x13->NXM_NX_REG3[[]],load:0x14->NXM_NX_REG4[[]],load:0x15->NXM_NX_REG5[[]]
46 in_port=14 actions=load:0x16->NXM_NX_REG6[[]],load:0x17->NXM_NX_REG7[[]]
47 in_port=15,reg0=0x10,reg1=0x11,reg2=0x12,reg3=0x13,reg4=0x14,reg5=0x15,reg6=0x16,reg7=0x17 actions=output:33
48
49 ])
50 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
51 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])
52 AT_CHECK([tail -1 stdout], [0],
53   [Datapath actions: 20,21,22,33
54 ])
55 OVS_VSWITCHD_STOP
56 AT_CLEANUP
57
58 AT_SETUP([ofproto-dpif - push-pop])
59 OVS_VSWITCHD_START
60 ADD_OF_PORTS([br0], [20], [21], [22], [33], [90])
61 AT_DATA([flows.txt], [dnl
62 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
63 in_port=2            actions=pop:NXM_NX_REG0[[0..7]],output:NXM_NX_REG0[[]]
64 in_port=3            actions=pop:NXM_NX_REG1[[0..7]],output:NXM_NX_REG1[[]]
65 in_port=4            actions=pop:NXM_NX_REG2[[0..15]],output:NXM_NX_REG2[[]]
66 in_port=5            actions=pop:NXM_NX_REG3[[]],output:NXM_NX_REG3[[]]
67
68 ])
69 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
70 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])
71 AT_CHECK([tail -1 stdout], [0],
72   [Datapath actions: 33,22,21,20
73 ])
74 OVS_VSWITCHD_STOP
75 AT_CLEANUP
76
77 AT_SETUP([ofproto-dpif - output])
78 OVS_VSWITCHD_START
79 ADD_OF_PORTS([br0], [1], [9], [10], [11], [55], [66], [77], [88])
80 AT_DATA([flows.txt], [dnl
81 in_port=1 actions=resubmit:2,resubmit:3,resubmit:4,resubmit:5,resubmit:6,resubmit:7
82 in_port=2 actions=output:9
83 in_port=3 actions=load:55->NXM_NX_REG0[[]],output:NXM_NX_REG0[[]],load:66->NXM_NX_REG1[[]]
84 in_port=4 actions=output:10,output:NXM_NX_REG0[[]],output:NXM_NX_REG1[[]],output:11
85 in_port=5 actions=load:77->NXM_NX_REG0[[0..15]],load:88->NXM_NX_REG0[[16..31]]
86 in_port=6 actions=output:NXM_NX_REG0[[0..15]],output:NXM_NX_REG0[[16..31]]
87 in_port=7 actions=load:0x110000ff->NXM_NX_REG0[[]],output:NXM_NX_REG0[[]]
88 ])
89 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
90 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])
91 AT_CHECK([tail -1 stdout], [0],
92   [Datapath actions: 9,55,10,55,66,11,77,88
93 ])
94 OVS_VSWITCHD_STOP
95 AT_CLEANUP
96
97 AT_SETUP([ofproto-dpif - dec_ttl])
98 OVS_VSWITCHD_START
99 ADD_OF_PORTS([br0], [1], [2], [3], [4])
100 AT_DATA([flows.txt], [dnl
101 table=0 in_port=1 action=dec_ttl,output:2,resubmit(1,1),output:4
102 table=1 in_port=1 action=dec_ttl,output:3
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=2,frag=no)' -generate], [0], [stdout])
106 AT_CHECK([tail -3 stdout], [0],
107   [Datapath actions: set(ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=1,frag=no)),2,4
108 This flow is handled by the userspace slow path because it:
109         - Sends "packet-in" messages to the OpenFlow controller.
110 ])
111 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])
112 AT_CHECK([tail -1 stdout], [0],
113   [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
114 ])
115 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])
116 AT_CHECK([tail -1 stdout], [0],
117   [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
118 ])
119
120 AT_CAPTURE_FILE([ofctl_monitor.log])
121 AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl --detach --no-chdir --pidfile 2> ofctl_monitor.log])
122 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])
123 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
124 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
125 NXT_PACKET_IN (xid=0x0): table_id=1 total_len=42 in_port=1 (via invalid_ttl) data_len=42 (unbuffered)
126 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
127 ])
128 OVS_VSWITCHD_STOP
129 AT_CLEANUP
130
131
132 AT_SETUP([ofproto-dpif - output, OFPP_NONE ingress port])
133 OVS_VSWITCHD_START
134 ADD_OF_PORTS([br0], [1], [2])
135
136 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
137
138 # "in_port" defaults to OFPP_NONE if it's not specified.
139 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"
140 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
141 AT_CHECK([tail -1 stdout | sed 's/Datapath actions: //' | tr "," "\n" | sort -n], [0], [dnl
142 1
143 2
144 100
145 ])
146
147 OVS_VSWITCHD_STOP
148 AT_CLEANUP
149
150 AT_SETUP([ofproto-dpif - DSCP])
151 OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=dummy])
152 ADD_OF_PORTS([br0], [9])
153 AT_DATA([flows.txt], [dnl
154 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
155 ])
156 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
157 AT_CHECK([ovs-vsctl -- \
158         set Port p1 qos=@newqos --\
159         --id=@newqos create QoS type=linux-htb queues=1=@q1,2=@q2 --\
160         --id=@q1 create Queue dscp=1 --\
161         --id=@q2 create Queue dscp=2], [0], [ignore])
162 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])
163 AT_CHECK([tail -1 stdout], [0],
164   [Datapath actions: dnl
165 100,dnl
166 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
167 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
168 1,dnl
169 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
170 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
171 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0x3,ttl=128,frag=no)),1,dnl
172 100
173 ])
174 OVS_VSWITCHD_STOP
175 AT_CLEANUP
176
177 AT_SETUP([ofproto-dpif - output/flood flags])
178 OVS_VSWITCHD_START
179 ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6], [7])
180
181 AT_DATA([flows.txt], [dnl
182 in_port=local actions=local,flood
183 in_port=1 actions=flood
184 in_port=2 actions=all
185 in_port=3 actions=output:65534,output:1,output:2,output:3,output:4,output:5,output:6,output:7
186 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
187 ])
188 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
189 AT_CHECK([ovs-ofctl mod-port br0 5 noforward])
190 AT_CHECK([ovs-ofctl mod-port br0 6 noflood])
191
192 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])
193 AT_CHECK([tail -1 stdout \
194 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
195 1
196 2
197 3
198 4
199 7
200 ])
201
202 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])
203 AT_CHECK([tail -1 stdout \
204 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
205 100
206 2
207 3
208 4
209 7
210 ])
211
212 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])
213 AT_CHECK([tail -1 stdout \
214 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
215 1
216 100
217 3
218 4
219 6
220 7
221 ])
222
223 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])
224 AT_CHECK([tail -1 stdout], [0],
225   [Datapath actions: 100,1,2,4,6,7
226 ])
227
228 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])
229 AT_CHECK([tail -1 stdout], [0],
230   [Datapath actions: set(skb_priority(0x1)),100,1,2,set(skb_priority(0x2)),3,set(skb_priority(0x1)),6,7
231 ])
232 OVS_VSWITCHD_STOP
233 AT_CLEANUP
234
235 AT_SETUP([ofproto-dpif - controller])
236 OVS_VSWITCHD_START([dnl
237    add-port br0 p1 -- set Interface p1 type=dummy
238 ])
239
240 AT_CAPTURE_FILE([ofctl_monitor.log])
241 AT_DATA([flows.txt], [dnl
242 cookie=0x0 dl_src=10:11:11:11:11:11 actions=controller
243 cookie=0x1 dl_src=20:22:22:22:22:22 actions=controller,resubmit(80,1)
244 cookie=0x2 dl_src=30:33:33:33:33:33 actions=mod_vlan_vid:15,controller
245
246 cookie=0x3 table=1 in_port=80 actions=load:1->NXM_NX_REG0[[]],mod_vlan_vid:80,controller,resubmit(81,2)
247 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)
248 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)
249 cookie=0x6 table=4 in_port=83 actions=load:4->NXM_NX_REG3[[]],mod_nw_src:83.83.83.83,controller,resubmit(84,5)
250 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)
251 cookie=0x8 table=6 in_port=85 actions=mod_tp_src:85,controller,resubmit(86,7)
252 cookie=0x9 table=7 in_port=86 actions=mod_tp_dst:86,controller,controller
253 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
254 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
255 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
256 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
257 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
258 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
259 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
260 cookie=0xb dl_src=50:55:55:55:55:55 dl_type=0x8847 actions=load:1000->OXM_OF_MPLS_LABEL[[]],controller
261 cookie=0xd dl_src=60:66:66:66:66:66 actions=pop_mpls:0x0800,controller
262 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
263 ])
264 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
265
266 dnl Flow miss.
267 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
268
269 for i in 1 2 3 ; do
270     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)'
271 done
272
273 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
274 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
275 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
276 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
277 dnl
278 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
279 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
280 dnl
281 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
282 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
283 ])
284
285 dnl Singleton controller action.
286 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
287
288 for i in 1 2 3 ; do
289     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=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)'
290 done
291
292 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
293 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
294 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
295 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
296 dnl
297 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
298 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
299 dnl
300 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
301 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
302 ])
303
304 dnl Modified controller action.
305 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
306
307 for i in 1 2 3 ; do
308     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=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)'
309 done
310
311 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
312 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
313 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
314 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
315 dnl
316 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
317 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
318 dnl
319 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
320 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
321 ])
322
323 dnl Modified MPLS controller action.
324 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
325
326 for i in 1 2 3; do
327     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=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)'
328 done
329
330 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
331 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
332 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
333 mpls(label:10,tc:3,ttl:64,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:42,dl_dst=50:54:00:00:00:07
334 dnl
335 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
336 mpls(label:10,tc:3,ttl:64,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:42,dl_dst=50:54:00:00:00:07
337 dnl
338 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
339 mpls(label:10,tc:3,ttl:64,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:42,dl_dst=50:54:00:00:00:07
340 ])
341
342 dnl Modified MPLS controller action.
343 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
344
345 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)
346
347 for i in 1 2 3; do
348     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:44:43,dst=50:54:00:00:00:07),eth_type(0x8847),mpls(label=11,tc=3,ttl=64,bos=1)'
349 done
350
351 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
352 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
353 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
354 mpls(label:10,tc:3,ttl:64,bos:0),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:43,dl_dst=50:54:00:00:00:07
355 dnl
356 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
357 mpls(label:10,tc:3,ttl:64,bos:0),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:43,dl_dst=50:54:00:00:00:07
358 dnl
359 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
360 mpls(label:10,tc:3,ttl:64,bos:0),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:43,dl_dst=50:54:00:00:00:07
361 ])
362
363 dnl Modified MPLS controller action.
364 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
365
366 for i in 1 2 3; do
367     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:44: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))'
368 done
369
370 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
371 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
372 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
373 mpls(label:10,tc:3,ttl:64,bos:1),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
374 dnl
375 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
376 mpls(label:10,tc:3,ttl:64,bos:1),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
377 dnl
378 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
379 mpls(label:10,tc:3,ttl:64,bos:1),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
380 ])
381
382 dnl Modified MPLS controller action.
383 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
384
385 for i in 1 2 3; do
386     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)'
387 done
388
389 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
390 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
391 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
392 mpls(label:10,tc:3,ttl:63,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:45,dl_dst=50:54:00:00:00:07
393 dnl
394 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
395 mpls(label:10,tc:3,ttl:63,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:45,dl_dst=50:54:00:00:00:07
396 dnl
397 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
398 mpls(label:10,tc:3,ttl:63,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:45,dl_dst=50:54:00:00:00:07
399 ])
400
401 dnl Modified MPLS controller action.
402 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
403
404 for i in 1 2 3; do
405     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)'
406 done
407
408 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
409 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
410 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
411 mpls(label:10,tc:3,ttl:10,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:46,dl_dst=50:54:00:00:00:07
412 dnl
413 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
414 mpls(label:10,tc:3,ttl:10,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:46,dl_dst=50:54:00:00:00:07
415 dnl
416 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
417 mpls(label:10,tc:3,ttl:10,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:46,dl_dst=50:54:00:00:00:07
418 ])
419
420 dnl Modified MPLS controller action.
421 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
422
423 for i in 1 2 3; do
424     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)'
425 done
426
427 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
428 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
429 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
430 mpls(label:10,tc:3,ttl:10,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:47,dl_dst=50:54:00:00:00:07
431 dnl
432 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
433 mpls(label:10,tc:3,ttl:10,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:47,dl_dst=50:54:00:00:00:07
434 dnl
435 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
436 mpls(label:10,tc:3,ttl:10,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:47,dl_dst=50:54:00:00:00:07
437 ])
438
439 dnl Modified MPLS controller action.
440 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
441
442 for i in 1 2 3; do
443     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)'
444 done
445
446 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
447 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
448 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
449 mpls(label:10,tc:3,ttl:9,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:48,dl_dst=50:54:00:00:00:07
450 dnl
451 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
452 mpls(label:10,tc:3,ttl:9,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:48,dl_dst=50:54:00:00:00:07
453 dnl
454 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
455 mpls(label:10,tc:3,ttl:9,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:48,dl_dst=50:54:00:00:00:07
456 ])
457
458 dnl Modified MPLS actions.
459 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
460
461 for i in 1 2 3; do
462     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),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no)'
463 done
464
465 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
466 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
467 NXT_PACKET_IN (xid=0x0): cookie=0xb total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
468 mpls(label:1000,tc:7,ttl:64,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:55:55:55:55:55,dl_dst=50:54:00:00:00:07
469 dnl
470 NXT_PACKET_IN (xid=0x0): cookie=0xb total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
471 mpls(label:1000,tc:7,ttl:64,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:55:55:55:55:55,dl_dst=50:54:00:00:00:07
472 dnl
473 NXT_PACKET_IN (xid=0x0): cookie=0xb total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
474 mpls(label:1000,tc:7,ttl:64,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:55:55:55:55:55,dl_dst=50:54:00:00:00:07
475 ])
476
477 dnl Modified MPLS ipv6 controller action.
478 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
479
480 for i in 1 2 3; do
481     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)'
482 done
483
484 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
485 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
486 NXT_PACKET_IN (xid=0x0): cookie=0xc total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
487 mplsm(label:1000,tc:7,ttl:64,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=70:77:77:77:77:77,dl_dst=50:54:00:00:00:07
488 dnl
489 NXT_PACKET_IN (xid=0x0): cookie=0xc total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
490 mplsm(label:1000,tc:7,ttl:64,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=70:77:77:77:77:77,dl_dst=50:54:00:00:00:07
491 dnl
492 NXT_PACKET_IN (xid=0x0): cookie=0xc total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
493 mplsm(label:1000,tc:7,ttl:64,bos:1),metadata=0,in_port=0,vlan_tci=0x0000,dl_src=70:77:77:77:77:77,dl_dst=50:54:00:00:00:07
494 ])
495
496
497 dnl Modified MPLS pop action.
498 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
499
500 for i in 1 2 3; do
501     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),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no)'
502 done
503
504 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
505 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
506 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=56 in_port=1 (via action) data_len=56 (unbuffered)
507 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 tcp_csum:0
508 dnl
509 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=56 in_port=1 (via action) data_len=56 (unbuffered)
510 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 tcp_csum:0
511 dnl
512 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=56 in_port=1 (via action) data_len=56 (unbuffered)
513 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 tcp_csum:0
514 ])
515
516 dnl Checksum TCP.
517 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --no-chdir --pidfile 2> ofctl_monitor.log])
518
519 for i in 1 ; do
520     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)'
521 done
522
523 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
524 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
525 NXT_PACKET_IN (xid=0x0): cookie=0x1 total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
526 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
527 dnl
528 NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x3 total_len=64 in_port=1 reg0=0x1 (via action) data_len=64 (unbuffered)
529 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
530 dnl
531 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)
532 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
533 dnl
534 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)
535 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
536 dnl
537 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)
538 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
539 dnl
540 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)
541 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
542 dnl
543 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)
544 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
545 dnl
546 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)
547 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
548 dnl
549 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)
550 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
551 ])
552
553 dnl Checksum UDP.
554 AT_CHECK([ovs-ofctl monitor br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
555
556 for i in 1 ; do
557     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'
558 done
559
560 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
561 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
562 NXT_PACKET_IN (xid=0x0): cookie=0x1 total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
563 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
564 dnl
565 NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x3 total_len=64 in_port=1 reg0=0x1 (via action) data_len=64 (unbuffered)
566 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
567 dnl
568 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)
569 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
570 dnl
571 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)
572 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
573 dnl
574 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)
575 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
576 dnl
577 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)
578 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
579 dnl
580 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)
581 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
582 dnl
583 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)
584 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
585 dnl
586 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)
587 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
588 ])
589
590 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
591  cookie=0x1, n_packets=2, n_bytes=120, dl_src=20:22:22:22:22:22 actions=CONTROLLER:65535,resubmit(80,1)
592  cookie=0x2, n_packets=3, n_bytes=180, dl_src=30:33:33:33:33:33 actions=mod_vlan_vid:15,CONTROLLER:65535
593  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)
594  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)
595  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)
596  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)
597  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)
598  cookie=0x8, table=6, n_packets=2, n_bytes=120, in_port=85 actions=mod_tp_src:85,CONTROLLER:65535,resubmit(86,7)
599  cookie=0x9, table=7, n_packets=2, n_bytes=120, in_port=86 actions=mod_tp_dst:86,CONTROLLER:65535,CONTROLLER:65535
600  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
601  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
602  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
603  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
604  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
605  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
606  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
607  cookie=0xb, n_packets=3, n_bytes=180, dl_src=50:55:55:55:55:55,dl_type=0x8847 actions=load:0x3e8->OXM_OF_MPLS_LABEL[[]],CONTROLLER:65535
608  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
609  cookie=0xd, n_packets=3, n_bytes=180, dl_src=60:66:66:66:66:66 actions=pop_mpls:0x0800,CONTROLLER:65535
610  n_packets=3, n_bytes=180, dl_src=10:11:11:11:11:11 actions=CONTROLLER:65535
611 NXST_FLOW reply:
612 ])
613
614 OVS_VSWITCHD_STOP
615 AT_CLEANUP
616
617 AT_SETUP([ofproto-dpif - VLAN handling])
618 OVS_VSWITCHD_START(
619   [set Bridge br0 fail-mode=standalone -- \
620    add-port br0 p1                                  trunks=10,12 -- \
621    add-port br0 p2                           tag=10              -- \
622    add-port br0 p3                           tag=12              \
623                    other-config:priority-tags=true               -- \
624    add-port br0 p4                           tag=12              -- \
625    add-port br0 p5 vlan_mode=native-tagged   tag=10              -- \
626    add-port br0 p6 vlan_mode=native-tagged   tag=10 trunks=10,12 -- \
627    add-port br0 p7 vlan_mode=native-untagged tag=12              -- \
628    add-port br0 p8 vlan_mode=native-untagged tag=12 trunks=10,12 \
629                    other-config:priority-tags=true               -- \
630    set Interface p1 type=dummy -- \
631    set Interface p2 type=dummy -- \
632    set Interface p3 type=dummy -- \
633    set Interface p4 type=dummy -- \
634    set Interface p5 type=dummy -- \
635    set Interface p6 type=dummy -- \
636    set Interface p7 type=dummy -- \
637    set Interface p8 type=dummy --])
638
639 dnl Each of these specifies an in_port by number, a VLAN VID (or "none"),
640 dnl a VLAN PCP (used if the VID isn't "none") and the expected set of datapath
641 dnl actions.
642 for tuple in \
643         "100 none 0 drop" \
644         "100 0    0 drop" \
645         "100 0    1 drop" \
646         "100 10   0 1,5,6,7,8,pop_vlan,2" \
647         "100 10   1 1,5,6,7,8,pop_vlan,2" \
648         "100 11   0 5,7" \
649         "100 11   1 5,7" \
650         "100 12   0 1,5,6,pop_vlan,3,4,7,8" \
651         "100 12   1 1,5,6,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
652         "1  none 0 drop" \
653         "1  0    0 drop" \
654         "1  0    1 drop" \
655         "1  10   0 5,6,7,8,100,pop_vlan,2" \
656         "1  10   1 5,6,7,8,100,pop_vlan,2" \
657         "1  11   0 drop" \
658         "1  11   1 drop" \
659         "1  12   0 5,6,100,pop_vlan,3,4,7,8" \
660         "1  12   1 5,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
661         "2  none 0 push_vlan(vid=10,pcp=0),1,5,6,7,8,100" \
662         "2  0    0 pop_vlan,push_vlan(vid=10,pcp=0),1,5,6,7,8,100" \
663         "2  0    1 pop_vlan,push_vlan(vid=10,pcp=1),1,5,6,7,8,100" \
664         "2  10   0 drop" \
665         "2  10   1 drop" \
666         "2  11   0 drop" \
667         "2  11   1 drop" \
668         "2  12   0 drop" \
669         "2  12   1 drop" \
670         "3  none 0 4,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
671         "3  0    0 pop_vlan,4,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
672         "3  0    1 8,pop_vlan,4,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
673         "3  10   0 drop" \
674         "3  10   1 drop" \
675         "3  11   0 drop" \
676         "3  11   1 drop" \
677         "3  12   0 drop" \
678         "3  12   1 drop" \
679         "4  none 0 3,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
680         "4  0    0 pop_vlan,3,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
681         "4  0    1 3,8,pop_vlan,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
682         "4  10   0 drop" \
683         "4  10   1 drop" \
684         "4  11   0 drop" \
685         "4  11   1 drop" \
686         "4  12   0 drop" \
687         "4  12   1 drop" \
688         "5  none 0 2,push_vlan(vid=10,pcp=0),1,6,7,8,100" \
689         "5  0    0 pop_vlan,2,push_vlan(vid=10,pcp=0),1,6,7,8,100" \
690         "5  0    1 pop_vlan,2,push_vlan(vid=10,pcp=1),1,6,7,8,100" \
691         "5  10   0 1,6,7,8,100,pop_vlan,2" \
692         "5  10   1 1,6,7,8,100,pop_vlan,2" \
693         "5  11   0 7,100" \
694         "5  11   1 7,100" \
695         "5  12   0 1,6,100,pop_vlan,3,4,7,8" \
696         "5  12   1 1,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
697         "6  none 0 2,push_vlan(vid=10,pcp=0),1,5,7,8,100" \
698         "6  0    0 pop_vlan,2,push_vlan(vid=10,pcp=0),1,5,7,8,100" \
699         "6  0    1 pop_vlan,2,push_vlan(vid=10,pcp=1),1,5,7,8,100" \
700         "6  10   0 1,5,7,8,100,pop_vlan,2" \
701         "6  10   1 1,5,7,8,100,pop_vlan,2" \
702         "6  11   0 drop" \
703         "6  11   1 drop" \
704         "6  12   0 1,5,100,pop_vlan,3,4,7,8" \
705         "6  12   1 1,5,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
706         "7  none 0 3,4,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
707         "7  0    0 pop_vlan,3,4,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
708         "7  0    1 3,8,pop_vlan,4,push_vlan(vid=12,pcp=1),1,5,6,100" \
709         "7  10   0 1,5,6,8,100,pop_vlan,2" \
710         "7  10   1 1,5,6,8,100,pop_vlan,2" \
711         "7  11   0 5,100" \
712         "7  11   1 5,100" \
713         "7  12   0 1,5,6,100,pop_vlan,3,4,8" \
714         "7  12   1 1,5,6,100,pop_vlan,4,push_vlan(vid=0,pcp=1),3,8" \
715         "8  none 0 3,4,7,push_vlan(vid=12,pcp=0),1,5,6,100" \
716         "8  0    0 pop_vlan,3,4,7,push_vlan(vid=12,pcp=0),1,5,6,100" \
717         "8  0    1 3,pop_vlan,4,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
718         "8  10   0 1,5,6,7,100,pop_vlan,2" \
719         "8  10   1 1,5,6,7,100,pop_vlan,2" \
720         "8  11   0 drop" \
721         "8  11   1 drop" \
722         "8  12   0 1,5,6,100,pop_vlan,3,4,7" \
723         "8  12   1 1,5,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3"
724 do
725   set $tuple
726   in_port=$1
727   vlan=$2
728   pcp=$3
729   expected=$4
730
731   if test $vlan = none; then
732     flow="in_port($in_port),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff),eth_type(0xabcd)"
733   else
734     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))"
735   fi
736
737   echo "----------------------------------------------------------------------"
738   echo "in_port=$in_port vlan=$vlan pcp=$pcp"
739
740   AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
741   actual=`tail -1 stdout | sed 's/Datapath actions: //'`
742
743   AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
744   mv stdout expout
745   AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
746 done
747
748 OVS_VSWITCHD_STOP
749 AT_CLEANUP
750
751 AT_SETUP([ofproto-dpif - fragment handling])
752 OVS_VSWITCHD_START
753 ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6], [90])
754 AT_DATA([flows.txt], [dnl
755 priority=75 tcp ip_frag=no    tp_dst=80 actions=output:1
756 priority=75 tcp ip_frag=first tp_dst=80 actions=output:2
757 priority=75 tcp ip_frag=later tp_dst=80 actions=output:3
758 priority=50 tcp ip_frag=no              actions=output:4
759 priority=50 tcp ip_frag=first           actions=output:5
760 priority=50 tcp ip_frag=later           actions=output:6
761 ])
762 AT_CHECK([ovs-ofctl replace-flows br0 flows.txt])
763
764 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"
765 no_flow="$base_flow,frag=no),tcp(src=12345,dst=80)"
766 first_flow="$base_flow,frag=first),tcp(src=12345,dst=80)"
767 later_flow="$base_flow,frag=later)"
768
769     # mode    no  first  later
770 for tuple in \
771     'normal    1     5      6' \
772     'drop      1  drop   drop' \
773     'nx-match  1     2      6'
774 do
775   set $tuple
776   mode=$1
777   no=$2
778   first=$3
779   later=$4
780
781   AT_CHECK([ovs-ofctl set-frags br0 $mode])
782   for type in no first later; do
783     eval flow=\$${type}_flow exp_output=\$$type
784     AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
785     AT_CHECK_UNQUOTED([tail -1 stdout], [0], [Datapath actions: $exp_output
786 ])
787   done
788 done
789 OVS_VSWITCHD_STOP
790 AT_CLEANUP
791
792 AT_SETUP([ofproto-dpif - exit])
793 OVS_VSWITCHD_START
794 ADD_OF_PORTS([br0], [1], [2], [3], [10], [11], [12], [13], [14])
795 AT_DATA([flows.txt], [dnl
796 in_port=1 actions=output:10,exit,output:11
797 in_port=2 actions=output:12,resubmit:1,output:12
798 in_port=3 actions=output:13,resubmit:2,output:14
799 ])
800 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
801 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])
802 AT_CHECK([tail -1 stdout], [0],
803   [Datapath actions: 10
804 ])
805 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])
806 AT_CHECK([tail -1 stdout], [0],
807   [Datapath actions: 12,10
808 ])
809 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])
810 AT_CHECK([tail -1 stdout], [0],
811   [Datapath actions: 13,12,10
812 ])
813 OVS_VSWITCHD_STOP
814 AT_CLEANUP
815
816
817 AT_SETUP([ofproto-dpif - mirroring, select_all])
818 OVS_VSWITCHD_START
819 ADD_OF_PORTS([br0], 1, 2, 3)
820 ovs-vsctl \
821         set Bridge br0 mirrors=@m --\
822         --id=@p3 get Port p3 --\
823         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
824
825 AT_DATA([flows.txt], [dnl
826 in_port=1 actions=output:2
827 in_port=2 actions=output:1
828 ])
829 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
830
831 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)"
832 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
833 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
834   [Datapath actions: 2,3
835 ])
836
837 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)"
838 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
839 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
840   [Datapath actions: 1,3
841 ])
842
843 OVS_VSWITCHD_STOP
844 AT_CLEANUP
845
846
847 AT_SETUP([ofproto-dpif - mirroring, select_src])
848 OVS_VSWITCHD_START
849 ADD_OF_PORTS([br0], 1, 2, 3)
850 ovs-vsctl \
851         set Bridge br0 mirrors=@m --\
852         --id=@p1 get Port p1 -- --id=@p3 get Port p3 --\
853         --id=@m create Mirror name=mymirror select_src_port=@p1 output_port=@p3
854
855 AT_DATA([flows.txt], [dnl
856 in_port=1 actions=output:2
857 in_port=2 actions=output:1
858 ])
859 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
860
861 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)"
862 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
863 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
864   [Datapath actions: 2,3
865 ])
866
867 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)"
868 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
869 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
870   [Datapath actions: 1
871 ])
872 OVS_VSWITCHD_STOP
873 AT_CLEANUP
874
875 AT_SETUP([ofproto-dpif - mirroring, OFPP_NONE ingress port])
876 OVS_VSWITCHD_START
877 ADD_OF_PORTS([br0], 1, 2)
878 ovs-vsctl \
879         set Bridge br0 mirrors=@m --\
880         --id=@p2 get Port p2 --\
881         --id=@m create Mirror name=mymirror select_all=true output_port=@p2
882
883 AT_CHECK([ovs-ofctl add-flow br0 action=output:1])
884
885 # "in_port" defaults to OFPP_NONE if it's not specified.
886 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"
887 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
888 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
889   [Datapath actions: 1,2
890 ])
891
892 OVS_VSWITCHD_STOP
893 AT_CLEANUP
894
895
896 AT_SETUP([ofproto-dpif - mirroring, select_dst])
897 OVS_VSWITCHD_START
898 ADD_OF_PORTS([br0], 1, 2, 3)
899 ovs-vsctl \
900         set Bridge br0 mirrors=@m --\
901         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
902         --id=@m create Mirror name=mymirror select_dst_port=@p2 output_port=@p3
903
904 AT_DATA([flows.txt], [dnl
905 in_port=1 actions=output:2
906 in_port=2 actions=output:1
907 ])
908 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
909
910 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)"
911 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
912 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
913   [Datapath actions: 2,3
914 ])
915
916 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)"
917 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
918 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
919   [Datapath actions: 1
920 ])
921
922 OVS_VSWITCHD_STOP
923 AT_CLEANUP
924
925
926 AT_SETUP([ofproto-dpif - mirroring, select_vlan])
927 OVS_VSWITCHD_START
928 ADD_OF_PORTS([br0], 1, 2, 3)
929 ovs-vsctl \
930         set Bridge br0 mirrors=@m --\
931         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
932         --id=@m create Mirror name=mymirror select_all=true select_vlan=11 output_port=@p3
933
934 AT_DATA([flows.txt], [dnl
935 in_port=1, actions=output:2
936 ])
937 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
938
939 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)"
940 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
941 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
942   [Datapath actions: 2
943 ])
944
945 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))"
946 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
947 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
948   [Datapath actions: 2
949 ])
950
951 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))"
952 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
953 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
954   [Datapath actions: 2,3
955 ])
956
957 OVS_VSWITCHD_STOP
958 AT_CLEANUP
959
960
961 AT_SETUP([ofproto-dpif - mirroring, output_port])
962 OVS_VSWITCHD_START
963 ADD_OF_PORTS([br0], 1, 2, 3)
964 ovs-vsctl \
965         set Bridge br0 mirrors=@m --\
966         --id=@p3 get Port p3 --\
967         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
968
969 AT_DATA([flows.txt], [dnl
970 in_port=1 actions=mod_vlan_vid:17,output:2
971 in_port=2 actions=output:1
972 ])
973 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
974
975 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)"
976 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
977 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
978   [Datapath actions: push_vlan(vid=17,pcp=0),2,pop_vlan,3
979 ])
980
981 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)"
982 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
983 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
984   [Datapath actions: 1,3
985 ])
986
987 OVS_VSWITCHD_STOP
988 AT_CLEANUP
989
990 AT_SETUP([ofproto-dpif - mirroring, output_vlan])
991 OVS_VSWITCHD_START
992 ADD_OF_PORTS([br0], 1, 2)
993 ovs-vsctl \
994         set Bridge br0 mirrors=@m --\
995         --id=@m create Mirror name=mymirror select_all=true output_vlan=12
996
997 AT_DATA([flows.txt], [dnl
998 in_port=1 actions=output:2
999 in_port=2 actions=mod_vlan_vid:17,output:1
1000 ])
1001 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1002
1003 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)"
1004 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
1005 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1006
1007 expected="2,push_vlan(vid=12,pcp=0),1,2,100"
1008 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
1009 mv stdout expout
1010 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
1011
1012 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)"
1013 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
1014 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1015
1016 expected="push_vlan(vid=17,pcp=0),1,pop_vlan,push_vlan(vid=12,pcp=0),1,2,100"
1017 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
1018 mv stdout expout
1019 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
1020
1021 OVS_VSWITCHD_STOP
1022 AT_CLEANUP
1023
1024 m4_define([OFPROTO_TRACE],
1025   [flow="$2"
1026    AT_CHECK([ovs-appctl ofproto/trace $1 "$flow" $3], [0], [stdout])
1027    actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1028    expected="$4"
1029    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" $5],
1030      [0], [stdout])
1031    mv stdout expout
1032    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" $5],
1033      [0], [expout])])
1034
1035 AT_SETUP([ofproto-dpif - MAC learning])
1036 OVS_VSWITCHD_START([set bridge br0 fail-mode=standalone])
1037 ADD_OF_PORTS([br0], 1, 2, 3)
1038
1039 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)'
1040
1041 # Trace an ARP packet arriving on p3, to create a MAC learning entry.
1042 OFPROTO_TRACE(
1043   [br0],
1044   [in_port(3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
1045   [-generate],
1046   [1,2,100])
1047
1048 # Check for the MAC learning entry.
1049 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1050  port  VLAN  MAC                Age
1051     3     0  50:54:00:00:00:05    ?
1052 ])
1053
1054 # Trace a packet arrival destined for the learned MAC.
1055 # (This will also learn a MAC.)
1056 OFPROTO_TRACE(
1057   [br0],
1058   [in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05),$arp],
1059   [-generate],
1060   [3])
1061
1062 # Check for both MAC learning entries.
1063 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1064  port  VLAN  MAC                Age
1065     3     0  50:54:00:00:00:05    ?
1066     1     0  50:54:00:00:00:06    ?
1067 ])
1068
1069 # Trace a packet arrival that updates the first learned MAC entry.
1070 OFPROTO_TRACE(
1071   [br0],
1072   [in_port(2),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
1073   [-generate],
1074   [1,3,100])
1075
1076 # Check that the MAC learning entry was updated.
1077 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1078  port  VLAN  MAC                Age
1079     1     0  50:54:00:00:00:06    ?
1080     2     0  50:54:00:00:00:05    ?
1081 ])
1082
1083 # Add another bridge.
1084 AT_CHECK(
1085   [ovs-vsctl \
1086      -- add-br br1 \
1087      -- set bridge br1 datapath-type=dummy \
1088      -- add-port br1 p4 -- set interface p4 type=dummy \
1089      -- add-port br1 p5 -- set interface p5 type=dummy])
1090
1091 # Trace some packet arrivals in br1 to create MAC learning entries there too.
1092 OFPROTO_TRACE(
1093   [br1],
1094   [in_port(4),eth(src=50:54:00:00:00:06,dst=ff:ff:ff:ff:ff:ff),$arp],
1095   [-generate],
1096   [5,101])
1097 OFPROTO_TRACE(
1098   [br1],
1099   [in_port(5),eth(src=50:54:00:00:00:07,dst=ff:ff:ff:ff:ff:ff),$arp],
1100   [-generate],
1101   [4,101])
1102
1103 # Check that the MAC learning entries were added.
1104 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1105  port  VLAN  MAC                Age
1106     4     0  50:54:00:00:00:06    ?
1107     5     0  50:54:00:00:00:07    ?
1108 ])
1109
1110 # Delete port p1 and see that its MAC learning entry disappeared, and
1111 # that the MAC learning entry for the same MAC was also deleted from br1.
1112 AT_CHECK([ovs-vsctl del-port p1])
1113 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1114  port  VLAN  MAC                Age
1115     2     0  50:54:00:00:00:05    ?
1116 ])
1117 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1118  port  VLAN  MAC                Age
1119     5     0  50:54:00:00:00:07    ?
1120 ])
1121
1122 OVS_VSWITCHD_STOP
1123 AT_CLEANUP
1124
1125 AT_SETUP([ofproto-dpif - MAC table overflow])
1126 OVS_VSWITCHD_START(
1127   [set bridge br0 fail-mode=standalone other-config:mac-table-size=10 -- \
1128    add-port br0 p1 -- set Interface p1 type=dummy -- \
1129    add-port br0 p2 -- set Interface p2 type=dummy -- \
1130    add-port br0 p3 -- set Interface p3 type=dummy])
1131
1132 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)'
1133
1134 AT_CHECK([ovs-appctl time/stop])
1135
1136 # Trace 10 ARP packets arriving on p3, to create MAC learning entries.
1137 for i in 0 1 2 3 4 5 6 7 8 9; do
1138     OFPROTO_TRACE(
1139       [br0],
1140       [in_port(3),eth(src=50:54:00:00:00:0$i,dst=ff:ff:ff:ff:ff:ff),$arp],
1141       [-generate],
1142       [1,2,100])
1143     ovs-appctl time/warp 1000
1144 done
1145
1146 # Check for the MAC learning entries.
1147 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/ *[[0-9]]\{1,\}$//' | sort],
1148   [0], [dnl
1149     3     0  50:54:00:00:00:00
1150     3     0  50:54:00:00:00:01
1151     3     0  50:54:00:00:00:02
1152     3     0  50:54:00:00:00:03
1153     3     0  50:54:00:00:00:04
1154     3     0  50:54:00:00:00:05
1155     3     0  50:54:00:00:00:06
1156     3     0  50:54:00:00:00:07
1157     3     0  50:54:00:00:00:08
1158     3     0  50:54:00:00:00:09
1159  port  VLAN  MAC                Age
1160 ])
1161
1162 # Trace another ARP packet on another MAC.
1163 OFPROTO_TRACE(
1164   [br0],
1165   [in_port(3),eth(src=50:54:00:00:00:10,dst=ff:ff:ff:ff:ff:ff),$arp],
1166   [-generate],
1167   [1,2,100])
1168
1169 # Check that the new one chased the oldest one out of the table.
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:01    ?
1173     3     0  50:54:00:00:00:02    ?
1174     3     0  50:54:00:00:00:03    ?
1175     3     0  50:54:00:00:00:04    ?
1176     3     0  50:54:00:00:00:05    ?
1177     3     0  50:54:00:00:00:06    ?
1178     3     0  50:54:00:00:00:07    ?
1179     3     0  50:54:00:00:00:08    ?
1180     3     0  50:54:00:00:00:09    ?
1181     3     0  50:54:00:00:00:10    ?
1182  port  VLAN  MAC                Age
1183 ])
1184 OVS_VSWITCHD_STOP
1185 AT_CLEANUP
1186
1187 dnl Test that basic NetFlow reports flow statistics correctly:
1188 dnl - The initial packet of a flow are correctly accounted.
1189 dnl - Later packets within a flow are correctly accounted.
1190 dnl - Flow actions changing (in this case, due to MAC learning)
1191 dnl   cause a record to be sent.
1192 AT_SETUP([ofproto-dpif - NetFlow flow expiration])
1193
1194 AT_CHECK([perl $srcdir/choose-port.pl], [0], [stdout])
1195 NETFLOW_PORT=`cat stdout`
1196
1197 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
1198 ADD_OF_PORTS([br0], 1, 2)
1199 ovs-vsctl \
1200    set Bridge br0 netflow=@nf -- \
1201    --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
1202      engine_id=1 engine_type=2 active_timeout=30 add-id-to-interface=false
1203
1204 ON_EXIT([kill `cat test-netflow.pid`])
1205 AT_CHECK([test-netflow --detach --no-chdir --pidfile $NETFLOW_PORT:127.0.0.1 > netflow.log])
1206 AT_CAPTURE_FILE([netflow.log])
1207
1208 for delay in 1000 30000; do
1209     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)'
1210     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)'
1211
1212     ovs-appctl time/warp $delay
1213 done
1214
1215 sleep 1
1216 OVS_VSWITCHD_STOP
1217 ovs-appctl -t test-netflow exit
1218
1219 AT_CHECK([[sed -e 's/, uptime [0-9]*//
1220 s/, now [0-9.]*//
1221 s/time \([0-9]*\)\.\.\.\1$/time <moment>/
1222 s/time [0-9]*\.\.\.[0-9]*/time <range>/
1223 ' netflow.log | sort]], [0],
1224   [
1225 header: v5, seq 0, engine 2,1
1226 header: v5, seq 1, engine 2,1
1227 seq 0: 192.168.0.1 > 192.168.0.2, if 1 > 65535, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
1228 seq 1: 192.168.0.1 > 192.168.0.2, if 1 > 2, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
1229 seq 1: 192.168.0.2 > 192.168.0.1, if 2 > 1, 2 pkts, 120 bytes, ICMP 0:0, time <range>
1230 ])
1231 AT_CLEANUP
1232
1233 dnl Test that basic NetFlow reports active expirations correctly.
1234 AT_SETUP([ofproto-dpif - NetFlow active expiration])
1235
1236 AT_CHECK([perl $srcdir/choose-port.pl], [0], [stdout])
1237 NETFLOW_PORT=`cat stdout`
1238
1239 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
1240 ADD_OF_PORTS([br0], 1, 2)
1241 ovs-vsctl \
1242    set Bridge br0 netflow=@nf -- \
1243    --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
1244      engine_id=1 engine_type=2 active_timeout=10 add-id-to-interface=false
1245
1246 ON_EXIT([kill `cat test-netflow.pid`])
1247 AT_CHECK([test-netflow --detach --no-chdir --pidfile $NETFLOW_PORT:127.0.0.1 > netflow.log])AT_CAPTURE_FILE([netflow.log])
1248
1249 AT_CHECK([ovs-appctl time/stop])
1250 n=1
1251 while test $n -le 60; do
1252     n=`expr $n + 1`
1253
1254     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)'
1255     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)'
1256
1257     ovs-appctl time/warp 1000
1258 done
1259
1260 ovs-appctl time/warp 10000
1261
1262 sleep 1
1263 OVS_VSWITCHD_STOP
1264 ovs-appctl -t test-netflow exit
1265
1266 # Count the number of reported packets:
1267 # - From source to destination before MAC learning kicks in (just one).
1268 # - From source to destination after that.
1269 # - From destination to source.
1270 n_learn=0
1271 n_in=0
1272 n_out=0
1273 n_other=0
1274 n_recs=0
1275 none=0
1276 while read line; do
1277     pkts=`echo "$line" | sed 's/.*, \([[0-9]]*\) pkts,.*/\1/'`
1278     case $pkts in
1279          [[0-9]]*) ;;
1280          *) continue ;;
1281     esac
1282
1283     case $line in
1284         "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 65535, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
1285             counter=n_learn
1286             ;;
1287         "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 2, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
1288             counter=n_in
1289             ;;
1290         "seq "*": 192.168.0.2 > 192.168.0.1, if 2 > 1, "*" pkts, "*" bytes, TCP 80 > 1234, time "*)
1291             counter=n_out
1292             ;;
1293         *)
1294             counter=n_other
1295             ;;
1296     esac
1297     eval $counter=\`expr \$$counter + \$pkts\`
1298     n_recs=`expr $n_recs + 1`
1299 done < netflow.log
1300
1301 # There should be exactly 1 MAC learning packet,
1302 # exactly 59 other packets in that direction,
1303 # and exactly 60 packets in the other direction.
1304 AT_CHECK([echo $n_learn $n_in $n_out $n_other], [0], [1 59 60 0
1305 ])
1306
1307 # There should be 1 expiration for MAC learning,
1308 # at least 5 active and a final expiration in one direction,
1309 # and at least 5 active and a final expiration in the other direction.
1310 echo $n_recs
1311 AT_CHECK([test $n_recs -ge 13])
1312
1313 AT_CLEANUP
1314
1315 AT_SETUP([idle_age and hard_age increase over time])
1316 OVS_VSWITCHD_START
1317
1318 # get_ages DURATION HARD IDLE
1319 #
1320 # Fetch the flow duration, hard age, and idle age into the variables
1321 # whose names are given as arguments.  Rounds DURATION down to the
1322 # nearest integer.  If hard_age doesn't appear in the output, sets
1323 # HARD to "none".  If idle_age doesn't appear in the output, sets IDLE
1324 # to 0.
1325 get_ages () {
1326     AT_CHECK([ovs-ofctl dump-flows br0], [0], [stdout])
1327
1328     duration=`sed -n 's/.*duration=\([[0-9]]*\)\(\.[[0-9]]*\)\{0,1\}s.*/\1/p' stdout`
1329     AT_CHECK([[expr X"$duration" : 'X[0-9][0-9]*$']], [0], [ignore])
1330     AS_VAR_COPY([$1], [duration])
1331
1332     hard=`sed -n 's/.*hard_age=\([[0-9]]*\),.*/\1/p' stdout`
1333     if test X"$hard" = X; then
1334         hard=none
1335     else
1336         AT_CHECK([[expr X"$hard" : 'X[0-9][0-9]*$']], [0], [ignore])
1337     fi
1338     AS_VAR_COPY([$2], [hard])
1339
1340     idle=`sed -n 's/.*idle_age=\([[0-9]]*\),.*/\1/p' stdout`
1341     if test X"$idle" = X; then
1342         idle=0
1343     else
1344         AT_CHECK([[expr X"$idle" : 'X[0-9][0-9]*$']], [0], [ignore])
1345     fi
1346     AS_VAR_COPY([$3], [idle])
1347 }
1348
1349 # Add a flow and get its initial hard and idle age.
1350 AT_CHECK([ovs-ofctl add-flow br0 hard_timeout=199,idle_timeout=188,actions=drop])
1351 get_ages duration1 hard1 idle1
1352
1353 # Warp time forward by 10 seconds, then modify the flow's actions.
1354 ovs-appctl time/warp 10000
1355 get_ages duration2 hard2 idle2
1356 AT_CHECK([ovs-ofctl mod-flows br0 actions=flood])
1357
1358 # Warp time forward by 10 seconds.
1359 ovs-appctl time/warp 10000
1360 get_ages duration3 hard3 idle3
1361
1362 # Warp time forward 10 more seconds, then pass some packets through the flow,
1363 # then warp forward a few more times because idle times are only updated
1364 # occasionally.
1365 ovs-appctl time/warp 10000
1366 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)'
1367 ovs-appctl time/warp 1000
1368 ovs-appctl time/warp 1000
1369 ovs-appctl time/warp 1000
1370 get_ages duration4 hard4 idle4
1371
1372 printf "duration: %4s => %4s => %4s => %4s\n" $duration1 $duration2 $duration3 $duration4
1373 printf "hard_age: %4s => %4s => %4s => %4s\n" $hard1 $hard2 $hard3 $hard4
1374 printf "idle_age: %4s => %4s => %4s => %4s\n" $idle1 $idle2 $idle3 $idle4
1375
1376 # Duration should increase steadily over time.
1377 AT_CHECK([test $duration1 -lt $duration2])
1378 AT_CHECK([test $duration2 -lt $duration3])
1379 AT_CHECK([test $duration3 -lt $duration4])
1380
1381 # Hard age should be "none" initially because it's the same as flow_duration,
1382 # then it should increase.
1383 AT_CHECK([test $hard1 = none])
1384 AT_CHECK([test $hard2 = none])
1385 AT_CHECK([test $hard3 != none])
1386 AT_CHECK([test $hard4 != none])
1387 AT_CHECK([test $hard3 -lt $hard4])
1388
1389 # Idle age should increase from 1 to 2 to 3, then decrease.
1390 AT_CHECK([test $idle1 -lt $idle2])
1391 AT_CHECK([test $idle2 -lt $idle3])
1392 AT_CHECK([test $idle3 -gt $idle4])
1393
1394 # Check some invariant relationships.
1395 AT_CHECK([test $duration1 = $idle1])
1396 AT_CHECK([test $duration2 = $idle2])
1397 AT_CHECK([test $duration3 = $idle3])
1398 AT_CHECK([test $idle3 -gt $hard3])
1399 AT_CHECK([test $idle4 -lt $hard4])
1400 AT_CHECK([test $hard4 -lt $duration4])
1401
1402 OVS_VSWITCHD_STOP
1403 AT_CLEANUP
1404
1405 AT_SETUP([ofproto-dpif - fin_timeout])
1406 OVS_VSWITCHD_START
1407 AT_DATA([flows.txt], [dnl
1408 in_port=1 actions=output:2
1409 in_port=2 actions=mod_vlan_vid:17,output:1
1410 ])
1411 AT_CHECK([ovs-ofctl add-flow br0 'idle_timeout=60,actions=fin_timeout(idle_timeout=5)'])
1412 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1413 [NXST_FLOW reply:
1414  idle_timeout=60, actions=fin_timeout(idle_timeout=5)
1415 ])
1416 # Check that a TCP SYN packet does not change the timeout.  (Because
1417 # flow stats updates are mainly what implements the fin_timeout
1418 # feature, we warp forward a couple of times to ensure that flow stats
1419 # run before re-checking the flow table.)
1420 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f908004500003c2e2440004006465dac11370dac11370b828b0016751e267b00000000a00216d017360000020405b40402080a2d25085f0000000001030307], [0], [success
1421 ])
1422 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
1423 warped
1424 ])
1425 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1426 [NXST_FLOW reply:
1427  n_packets=1, n_bytes=74, idle_timeout=60, actions=fin_timeout(idle_timeout=5)
1428 ])
1429 # Check that a TCP FIN packet does change the timeout.
1430 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f90800451000342e3e40004006463bac11370dac11370b828b0016751e319dfc96399b801100717ae800000101080a2d250a9408579588], [0], [success
1431 ])
1432 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
1433 warped
1434 ])
1435 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1436 [NXST_FLOW reply:
1437  n_packets=2, n_bytes=140, idle_timeout=5, actions=fin_timeout(idle_timeout=5)
1438 ])
1439 OVS_VSWITCHD_STOP
1440 AT_CLEANUP
1441
1442 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-dps])
1443 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
1444 ADD_OF_PORTS([br0], [1], [2])
1445 ADD_OF_PORTS([br1], [3])
1446
1447 AT_CHECK([ovs-appctl dpif/dump-dps], [0], [dnl
1448 dummy@br0
1449 dummy@br1
1450 ])
1451 OVS_VSWITCHD_STOP
1452 AT_CLEANUP
1453
1454 AT_SETUP([ofproto-dpif - ovs-appctl dpif/show])
1455 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
1456 ADD_OF_PORTS([br0], [1], [2])
1457 ADD_OF_PORTS([br1], [3])
1458
1459 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
1460 br0 (dummy@ovs-dummy):
1461         lookups: hit:0 missed:0 lost:0
1462         flows: 0
1463         br0 65534/100: (dummy)
1464         p1 1/1: (dummy)
1465         p2 2/2: (dummy)
1466 br1 (dummy@ovs-dummy):
1467         lookups: hit:0 missed:0 lost:0
1468         flows: 0
1469         br1 65534/101: (dummy)
1470         p3 3/3: (dummy)
1471 ])
1472
1473 AT_CHECK([ovs-appctl dpif/show br0], [0], [dnl
1474 br0 (dummy@ovs-dummy):
1475         lookups: hit:0 missed:0 lost:0
1476         flows: 0
1477         br0 65534/100: (dummy)
1478         p1 1/1: (dummy)
1479         p2 2/2: (dummy)
1480 ])
1481 OVS_VSWITCHD_STOP
1482 AT_CLEANUP
1483
1484 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-flows])
1485 OVS_VSWITCHD_START([add-br br1 -- \
1486                     set bridge br1 datapath-type=dummy fail-mode=secure])
1487 ADD_OF_PORTS([br0], [1], [2])
1488 ADD_OF_PORTS([br1], [3])
1489
1490 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
1491 ])
1492 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
1493 ])
1494 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
1495 ])
1496
1497 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
1498 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:drop
1499 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:drop
1500 ])
1501
1502 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
1503 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:drop
1504 ])
1505
1506 OVS_VSWITCHD_STOP
1507 AT_CLEANUP
1508
1509 AT_SETUP([ofproto-dpif - ovs-appctl dpif/del-flows])
1510 OVS_VSWITCHD_START([add-br br1 -- \
1511                     set bridge br1 datapath-type=dummy fail-mode=secure])
1512 ADD_OF_PORTS([br0], [1], [2])
1513 ADD_OF_PORTS([br1], [3])
1514
1515 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
1516 ])
1517 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
1518 ])
1519 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
1520 ])
1521
1522 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
1523 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:drop
1524 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:drop
1525 ])
1526
1527 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
1528 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:drop
1529 ])
1530
1531 AT_CHECK([ovs-appctl dpif/del-flows br0])
1532 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
1533 ])
1534
1535 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
1536 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:drop
1537 ])
1538
1539 OVS_VSWITCHD_STOP
1540 AT_CLEANUP
1541
1542 AT_SETUP([ofproto-dpif - patch ports])
1543 OVS_VSWITCHD_START([add-br br1 \
1544 -- set bridge br1 datapath-type=dummy fail-mode=secure \
1545 -- add-port br1 pbr1 -- set int pbr1 type=patch options:peer=pbr0 \
1546 -- add-port br0 pbr0 -- set int pbr0 type=patch options:peer=pbr1])
1547
1548 ADD_OF_PORTS([br0], [2])
1549 ADD_OF_PORTS([br1], [3])
1550
1551 AT_CHECK([ovs-ofctl add-flow br0 actions=LOCAL,output:1,output:2])
1552 AT_CHECK([ovs-ofctl add-flow br1 actions=LOCAL,output:1,output:3])
1553
1554 for i in $(seq 1 10); do
1555     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)'
1556 done
1557
1558 for i in $(seq 1 5); do
1559     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)'
1560 done
1561
1562 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
1563 br0 (dummy@ovs-dummy):
1564         lookups: hit:13 missed:2 lost:0
1565         flows: 1
1566         br0 65534/100: (dummy)
1567         p2 2/2: (dummy)
1568         pbr0 1/none: (patch: peer=pbr1)
1569 br1 (dummy@ovs-dummy):
1570         lookups: hit:13 missed:2 lost:0
1571         flows: 1
1572         br1 65534/101: (dummy)
1573         p3 3/3: (dummy)
1574         pbr1 1/none: (patch: peer=pbr0)
1575 ])
1576
1577 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_USED], [0], [dnl
1578 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
1579 ]),
1580 AT_CHECK([ovs-appctl dpif/dump-flows br1 | STRIP_USED], [0], [dnl
1581 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
1582 ])
1583
1584 AT_CHECK([ovs-ofctl dump-ports br0 pbr0], [0], [dnl
1585 OFPST_PORT reply (xid=0x4): 1 ports
1586   port  1: rx pkts=5, bytes=300, drop=0, errs=0, frame=0, over=0, crc=0
1587            tx pkts=10, bytes=600, drop=0, errs=0, coll=0
1588 ])
1589
1590 AT_CHECK([ovs-ofctl dump-ports br1 pbr1], [0], [dnl
1591 OFPST_PORT reply (xid=0x4): 1 ports
1592   port  1: rx pkts=10, bytes=600, drop=0, errs=0, frame=0, over=0, crc=0
1593            tx pkts=5, bytes=300, drop=0, errs=0, coll=0
1594 ])
1595
1596 OVS_VSWITCHD_STOP
1597 AT_CLEANUP