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