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