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