4 This tutorial is intended to give you a tour of the basic OVN features using
5 `ovs-sandbox` as a simulated test environment. It’s assumed that you have an
6 understanding of OVS before going through this tutorial. Detail about OVN is
7 covered in `ovn-architecture(7)`, but this tutorial lets you quickly see it in
13 For some general information about `ovs-sandbox`, see the “Getting Started”
14 section of [Tutorial.md].
16 `ovs-sandbox` does not include OVN support by default. To enable OVN, you must
17 pass the `--ovn` flag. For example, if running it straight from the ovs git
20 $ make sandbox SANDBOXFLAGS=”--ovn”
22 Running the sandbox with OVN enabled does the following additional steps to the
25 1. Creates the `OVN_Northbound` and `OVN_Southbound` databases as described in
26 `ovn-nb(5)` and `ovn-sb(5)`.
28 2. Creates the `hardware_vtep` database as described in `vtep(5)`.
30 3. Runs the `ovn-northd`, `ovn-controller`, and `ovn-controller-vtep` daemons.
32 4. Makes OVN and VTEP utilities available for use in the environment,
33 including `vtep-ctl`, `ovn-nbctl`, and `ovn-sbctl`.
35 Note that each of these demos assumes you start with a fresh sandbox
36 environment. Re-run `ovs-sandbox` before starting each section.
38 1) Simple two-port setup
39 ------------------------
41 This first environment is the simplest OVN example. It demonstrates using OVN
42 with a single logical switch that has two logical ports, both residing on the
45 Start by running the setup script for this environment.
47 [View ovn/env1/setup.sh][env1setup].
51 You can use the `ovn-nbctl` utility to see an overview of the logical topology.
54 lswitch 78687d53-e037-4555-bcd3-f4f8eaf3f2aa (sw0)
56 macs: 00:00:00:00:00:01
58 macs: 00:00:00:00:00:02
60 The `ovn-sbctl` utility can be used to see into the state stored in the
61 `OVN_Southbound` database. The `show` command shows that there is a single
62 chassis with two logical ports bound to it. In a more realistic
63 multi-hypervisor environment, this would list all hypervisors and where all
64 logical ports are located.
67 Chassis “56b18105-5706-46ef-80c4-ff20979ab068”
70 Port_Binding “sw0-port1”
71 Port_Binding “sw0-port2”
73 OVN creates logical flows to describe how the network should behave in logical
74 space. Each chassis then creates OpenFlow flows based on those logical flows
75 that reflect its own local view of the network. The `ovn-sbctl` command can
76 show the logical flows.
78 $ ovn-sbctl lflow-list
79 Datapath: d3466847-2b3a-4f17-8eb2-34f5b0727a70 Pipeline: ingress
80 table=0(port_sec), priority= 100, match=(eth.src[40]), action=(drop;)
81 table=0(port_sec), priority= 100, match=(vlan.present), action=(drop;)
82 table=0(port_sec), priority= 50, match=(inport == "sw0-port1" && eth.src == {00:00:00:00:00:01}), action=(next;)
83 table=0(port_sec), priority= 50, match=(inport == "sw0-port2" && eth.src == {00:00:00:00:00:02}), action=(next;)
84 table=1( acl), priority= 0, match=(1), action=(next;)
85 table=2( l2_lkup), priority= 100, match=(eth.dst[40]), action=(outport = "_MC_flood"; output;)
86 table=2( l2_lkup), priority= 50, match=(eth.dst == 00:00:00:00:00:01), action=(outport = "sw0-port1"; output;)
87 table=2( l2_lkup), priority= 50, match=(eth.dst == 00:00:00:00:00:02), action=(outport = "sw0-port2"; output;)
88 Datapath: d3466847-2b3a-4f17-8eb2-34f5b0727a70 Pipeline: egress
89 table=0( acl), priority= 0, match=(1), action=(next;)
90 table=1(port_sec), priority= 100, match=(eth.dst[40]), action=(output;)
91 table=1(port_sec), priority= 50, match=(outport == "sw0-port1" && eth.dst == {00:00:00:00:00:01}), action=(output;)
92 table=1(port_sec), priority= 50, match=(outport == "sw0-port2" && eth.dst == {00:00:00:00:00:02}), action=(output;)
94 Now we can start taking a closer look at how `ovn-controller` has programmed the
95 local switch. Before looking at the flows, we can use `ovs-ofctl` to verify the
96 OpenFlow port numbers for each of the logical ports on the switch. The output
97 shows that `lport1`, which corresponds with our logical port `sw0-port1`, has an
98 OpenFlow port number of `1`. Similarly, `lport2` has an OpenFlow port number of
101 $ ovs-ofctl show br-int
102 OFPT_FEATURES_REPLY (xid=0x2): dpid:00003e1ba878364d
103 n_tables:254, n_buffers:256
104 capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
105 actions: output enqueue set_vlan_vid set_vlan_pcp strip_vlan mod_dl_src mod_dl_dst mod_nw_src mod_nw_dst mod_nw_tos mod_tp_src mod_tp_dst
106 1(lport1): addr:aa:55:aa:55:00:07
109 speed: 0 Mbps now, 0 Mbps max
110 2(lport2): addr:aa:55:aa:55:00:08
113 speed: 0 Mbps now, 0 Mbps max
114 LOCAL(br-int): addr:3e:1b:a8:78:36:4d
117 speed: 0 Mbps now, 0 Mbps max
118 OFPT_GET_CONFIG_REPLY (xid=0x4): frags=normal miss_send_len=0
120 Finally, use `ovs-ofctl` to see the OpenFlow flows for `br-int`. Note that some
121 fields have been omitted for brevity.
123 $ ovs-ofctl -O OpenFlow13 dump-flows br-int
124 OFPST_FLOW reply (OF1.3) (xid=0x2):
125 table=0, priority=100,in_port=1 actions=set_field:0x1->metadata,set_field:0x1->reg6,resubmit(,16)
126 table=0, priority=100,in_port=2 actions=set_field:0x1->metadata,set_field:0x2->reg6,resubmit(,16)
127 table=16, priority=100,metadata=0x1,dl_src=01:00:00:00:00:00/01:00:00:00:00:00 actions=drop
128 table=16, priority=100,metadata=0x1,vlan_tci=0x1000/0x1000 actions=drop
129 table=16, priority=50,reg6=0x1,metadata=0x1,dl_src=00:00:00:00:00:01 actions=resubmit(,17)
130 table=16, priority=50,reg6=0x2,metadata=0x1,dl_src=00:00:00:00:00:02 actions=resubmit(,17)
131 table=17, priority=0,metadata=0x1 actions=resubmit(,18)
132 table=18, priority=100,metadata=0x1,dl_dst=01:00:00:00:00:00/01:00:00:00:00:00 actions=set_field:0xffff->reg7,resubmit(,32)
133 table=18, priority=50,metadata=0x1,dl_dst=00:00:00:00:00:01 actions=set_field:0x1->reg7,resubmit(,32)
134 table=18, priority=50,metadata=0x1,dl_dst=00:00:00:00:00:02 actions=set_field:0x2->reg7,resubmit(,32)
135 table=32, priority=0 actions=resubmit(,33)
136 table=33, priority=100,reg7=0x1,metadata=0x1 actions=resubmit(,34)
137 table=33, priority=100,reg7=0xffff,metadata=0x1 actions=set_field:0x2->reg7,resubmit(,34),set_field:0x1->reg7,resubmit(,34)
138 table=33, priority=100,reg7=0x2,metadata=0x1 actions=resubmit(,34)
139 table=34, priority=100,reg6=0x1,reg7=0x1,metadata=0x1 actions=drop
140 table=34, priority=100,reg6=0x2,reg7=0x2,metadata=0x1 actions=drop
141 table=34, priority=0 actions=set_field:0->reg0,set_field:0->reg1,set_field:0->reg2,set_field:0->reg3,set_field:0->reg4,set_field:0->reg5,resubmit(,48)
142 table=48, priority=0,metadata=0x1 actions=resubmit(,49)
143 table=49, priority=100,metadata=0x1,dl_dst=01:00:00:00:00:00/01:00:00:00:00:00 actions=resubmit(,64)
144 table=49, priority=50,reg7=0x1,metadata=0x1,dl_dst=00:00:00:00:00:01 actions=resubmit(,64)
145 table=49, priority=50,reg7=0x2,metadata=0x1,dl_dst=00:00:00:00:00:02 actions=resubmit(,64)
146 table=64, priority=100,reg7=0x1,metadata=0x1 actions=output:1
147 table=64, priority=100,reg7=0x2,metadata=0x1 actions=output:2
149 The `ovs-appctl` command can be used to generate and OpenFlow trace of how a
150 packet would be processed in this configuration. This first trace shows a
151 packet from `sw0-port1` to `sw0-port2`. The packet arrives from port `1` and
152 should be output to port `2`.
154 [View ovn/env1/packet1.sh][env1packet1].
156 $ ovn/env1/packet1.sh
158 Trace a broadcast packet from `sw0-port1`. The packet arrives from port `1` and
159 should be output to port `2`.
161 [View ovn/env1/packet2.sh][env1packet2].
163 $ ovn/env1/packet2.sh
165 You can extend this setup by adding additional ports. For example, to add a
166 third port, run this command:
168 [View ovn/env1/add-third-port.sh][env1thirdport].
170 $ ovn/env1/add-third-port.sh
172 Now if you do another trace of a broadcast packet from `sw0-port1`, you will see
173 that it is output to both ports `2` and `3`.
175 $ ovn/env1/packet2.sh
177 2) 2 switches, 4 ports
178 ----------------------
180 This environment is an extension of the last example. The previous example
181 showed two ports on a single logical switch. In this environment we add a
182 second logical switch that also has two ports. This lets you start to see how
183 `ovn-controller` creates flows for isolated networks to co-exist on the same
186 [View ovn/env2/setup.sh][env2setup].
190 View the logical topology with `ovn-nbctl`.
193 lswitch e3190dc2-89d1-44ed-9308-e7077de782b3 (sw0)
195 macs: 00:00:00:00:00:01
197 macs: 00:00:00:00:00:02
198 lswitch c8ed4c5f-9733-43f6-93da-795b1aabacb1 (sw1)
200 macs: 00:00:00:00:00:03
202 macs: 00:00:00:00:00:04
204 Physically, all ports reside on the same chassis.
207 Chassis “56b18105-5706-46ef-80c4-ff20979ab068”
210 Port_Binding “sw1-port2”
211 Port_Binding “sw0-port2”
212 Port_Binding “sw0-port1”
213 Port_Binding “sw1-port1”
215 OVN creates separate logical flows for each logical switch.
217 $ ovn-sbctl lflow-list
218 Datapath: 5aa8be0b-8369-49e2-a878-f68872a8d211 Pipeline: ingress
219 table=0(port_sec), priority= 100, match=(eth.src[40]), action=(drop;)
220 table=0(port_sec), priority= 100, match=(vlan.present), action=(drop;)
221 table=0(port_sec), priority= 50, match=(inport == "sw0-port1" && eth.src == {00:00:00:00:00:01}), action=(next;)
222 table=0(port_sec), priority= 50, match=(inport == "sw0-port2" && eth.src == {00:00:00:00:00:02}), action=(next;)
223 table=1( acl), priority= 0, match=(1), action=(next;)
224 table=2( l2_lkup), priority= 100, match=(eth.dst[40]), action=(outport = "_MC_flood"; output;)
225 table=2( l2_lkup), priority= 50, match=(eth.dst == 00:00:00:00:00:01), action=(outport = "sw0-port1"; output;)
226 table=2( l2_lkup), priority= 50, match=(eth.dst == 00:00:00:00:00:02), action=(outport = "sw0-port2"; output;)
227 Datapath: 5aa8be0b-8369-49e2-a878-f68872a8d211 Pipeline: egress
228 table=0( acl), priority= 0, match=(1), action=(next;)
229 table=1(port_sec), priority= 100, match=(eth.dst[40]), action=(output;)
230 table=1(port_sec), priority= 50, match=(outport == "sw0-port1" && eth.dst == {00:00:00:00:00:01}), action=(output;)
231 table=1(port_sec), priority= 50, match=(outport == "sw0-port2" && eth.dst == {00:00:00:00:00:02}), action=(output;)
232 Datapath: 631fb3c9-b0a3-4e56-bac3-1717c8cbb826 Pipeline: ingress
233 table=0(port_sec), priority= 100, match=(eth.src[40]), action=(drop;)
234 table=0(port_sec), priority= 100, match=(vlan.present), action=(drop;)
235 table=0(port_sec), priority= 50, match=(inport == "sw1-port1" && eth.src == {00:00:00:00:00:03}), action=(next;)
236 table=0(port_sec), priority= 50, match=(inport == "sw1-port2" && eth.src == {00:00:00:00:00:04}), action=(next;)
237 table=1( acl), priority= 0, match=(1), action=(next;)
238 table=2( l2_lkup), priority= 100, match=(eth.dst[40]), action=(outport = "_MC_flood"; output;)
239 table=2( l2_lkup), priority= 50, match=(eth.dst == 00:00:00:00:00:03), action=(outport = "sw1-port1"; output;)
240 table=2( l2_lkup), priority= 50, match=(eth.dst == 00:00:00:00:00:04), action=(outport = "sw1-port2"; output;)
241 Datapath: 631fb3c9-b0a3-4e56-bac3-1717c8cbb826 Pipeline: egress
242 table=0( acl), priority= 0, match=(1), action=(next;)
243 table=1(port_sec), priority= 100, match=(eth.dst[40]), action=(output;)
244 table=1(port_sec), priority= 50, match=(outport == "sw1-port1" && eth.dst == {00:00:00:00:00:03}), action=(output;)
245 table=1(port_sec), priority= 50, match=(outport == "sw1-port2" && eth.dst == {00:00:00:00:00:04}), action=(output;)
247 In this setup, `sw0-port1` and `sw0-port2` can send packets to each other, but
248 not to either of the ports on `sw1`. This first trace shows a packet from
249 `sw0-port1` to `sw0-port2`. You should see th packet arrive on OpenFlow port
250 `1` and output to OpenFlow port `2`.
252 [View ovn/env2/packet1.sh][env2packet1].
254 $ ovn/env2/packet1.sh
256 This next example shows a packet from `sw0-port1` with a destination MAC address
257 of `00:00:00:00:00:03`, which is the MAC address for `sw1-port1`. Since these
258 ports are not on the same logical switch, the packet should just be dropped.
260 [View ovn/env2/packet2.sh][env2packet2].
262 $ ovn/env2/packet2.sh
267 The first two examples started by showing OVN on a single hypervisor. A more
268 realistic deployment of OVN would span multiple hypervisors. This example
269 creates a single logical switch with 4 logical ports. It then simulates having
270 two hypervisors with two of the logical ports bound to each hypervisor.
272 [View ovn/env3/setup.sh][env3setup].
276 You can start by viewing the logical topology with `ovn-nbctl`.
279 lswitch b977dc03-79a5-41ba-9665-341a80e1abfd (sw0)
281 macs: 00:00:00:00:00:01
283 macs: 00:00:00:00:00:02
285 macs: 00:00:00:00:00:04
287 macs: 00:00:00:00:00:03
289 Using `ovn-sbctl` to view the state of the system, we can see that there are two
290 chassis: one local that we can interact with, and a fake remote chassis. Two
291 logical ports are bound to each. Both chassis have an IP address of localhost,
292 but in a realistic deployment that would be the IP address used for tunnels to
296 Chassis “56b18105-5706-46ef-80c4-ff20979ab068”
299 Port_Binding “sw0-port2”
300 Port_Binding “sw0-port1”
304 Port_Binding “sw0-port4”
305 Port_Binding “sw0-port3”
307 Packets between `sw0-port1` and `sw0-port2` behave just like the previous
308 examples. Packets to ports on a remote chassis are the interesting part of this
309 example. You may have noticed before that OVN’s logical flows are broken up
310 into ingress and egress tables. Given a packet from `sw0-port1` on the local
311 chassis to `sw0-port3` on the remote chassis, the ingress pipeline is executed
312 on the local switch. OVN then determines that it must forward the packet over a
313 geneve tunnel. When it arrives at the remote chassis, the egress pipeline will
316 This first packet trace shows the first part of this example. It’s a packet
317 from `sw0-port1` to `sw0-port3` from the perspective of the local chassis.
318 `sw0-port1` is OpenFlow port `1`. The tunnel to the fake remote chassis is
319 OpenFlow port `3`. You should see the ingress pipeline being executed and then
320 the packet output to port `3`, the geneve tunnel.
322 [View ovn/env3/packet1.sh][env3packet1].
324 $ ovn/env3/packet1.sh
326 To simulate what would happen when that packet arrives at the remote chassis we
327 can flip this example around. Consider a packet from `sw0-port3` to
328 `sw0-port1`. This trace shows what would happen when that packet arrives at the
329 local chassis. The packet arrives on OpenFlow port `3` (the tunnel). You should
330 then see the egress pipeline get executed and the packet output to OpenFlow port
333 [View ovn/env3/packet2.sh][env3packet2].
335 $ ovn/env3/packet2.sh
337 4) Locally attached networks
338 ----------------------------
340 While OVN is generally focused on the implementation of logical networks using
341 overlays, it’s also possible to use OVN as a control plane to manage logically
342 direct connectivity to networks that are locally accessible to each chassis.
344 This example includes two hypervisors. Both hypervisors have two ports on them.
345 We want to use OVN to manage the connectivity of these ports to a network
346 attached to each hypervisor that we will call “physnet1”.
348 This scenario requires some additional configuration of `ovn-controller`. We
349 must configure a mapping between `physnet1` and a local OVS bridge that provides
350 connectivity to that network. We call these “bridge mappings”. For our
351 example, the following script creates a bridge called `br-eth1` and then
352 configures `ovn-controller` with a bridge mapping from `physnet1` to `br-eth1`.
354 [View ovn/env4/setup1.sh][env4setup1].
358 At this point we should be able to see that `ovn-controller` has automatically
359 created patch ports between `br-int` and `br-eth1`.
362 aea39214-ebec-4210-aa34-1ae7d6921720
365 Port “patch-br-int-to-br-eth1”
366 Interface “patch-br-int-to-br-eth1”
368 options: {peer=”patch-br-eth1-to-br-int”}
376 Port “patch-br-eth1-to-br-int”
377 Interface “patch-br-eth1-to-br-int”
379 options: {peer=”patch-br-int-to-br-eth1”}
381 Now we can move on to the next setup phase for this example. We want to create
382 a fake second chassis and then create the topology that tells OVN we want both
383 ports on both hypervisors connected to `physnet1`. The way this is modeled in
384 OVN is by creating a logical switch for each port. The logical switch has the
385 regular VIF port and a `localnet` port.
387 [View ovn/env4/setup2.sh][env4setup2].
391 The logical topology from `ovn-nbctl` should look like this.
394 lswitch 5a652488-cfba-4f3e-929d-00010cdfde40 (provnet1-2)
395 lport provnet1-2-physnet1
397 lport provnet1-2-port1
398 macs: 00:00:00:00:00:02
399 lswitch 5829b60a-eda8-4d78-94f6-7017ff9efcf0 (provnet1-4)
400 lport provnet1-4-port1
401 macs: 00:00:00:00:00:04
402 lport provnet1-4-physnet1
404 lswitch 06cbbcb6-38e3-418d-a81e-634ec9b54ad6 (provnet1-1)
405 lport provnet1-1-port1
406 macs: 00:00:00:00:00:01
407 lport provnet1-1-physnet1
409 lswitch 9cba3b3b-59ae-4175-95f5-b6f1cd9c2afb (provnet1-3)
410 lport provnet1-3-physnet1
412 lport provnet1-3-port1
413 macs: 00:00:00:00:00:03
415 `port1` on each logical switch represents a regular logical port for a VIF on a
416 hypervisor. `physnet1` on each logical switch is the special `localnet` port.
417 You can use `ovn-nbctl` to see that this port has a `type` and `options` set.
419 $ ovn-nbctl lport-get-type provnet1-1-physnet1
422 $ ovn-nbctl lport-get-options provnet1-1-physnet1
423 network_name=physnet1
425 The physical topology should reflect that there are two regular ports on each
432 Port_Binding “provnet1-3-port1”
433 Port_Binding “provnet1-4-port1”
434 Chassis “56b18105-5706-46ef-80c4-ff20979ab068”
437 Port_Binding “provnet1-2-port1”
438 Port_Binding “provnet1-1-port1”
440 All four of our ports should be able to communicate with each other, but they do
441 so through `physnet1`. A packet from any of these ports to any destination
442 should be output to the OpenFlow port number that corresponds to the patch port
445 This example assumes following OpenFlow port number mappings:
447 * 1 = patch port to `br-eth1`
448 * 2 = tunnel to the fake second chassis
449 * 3 = lport1, which is the logical port named `provnet1-1-port1`
450 * 4 = lport2, which is the logical port named `provnet1-2-port1`
452 We get those port numbers using `ovs-ofctl`:
454 $ ovs-ofctl show br-int
455 OFPT_FEATURES_REPLY (xid=0x2): dpid:0000765054700040
456 n_tables:254, n_buffers:256
457 capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
458 actions: output enqueue set_vlan_vid set_vlan_pcp strip_vlan mod_dl_src
459 mod_dl_dst mod_nw_src mod_nw_dst mod_nw_tos mod_tp_src mod_tp_dst
460 1(patch-br-int-to): addr:de:29:14:95:8a:b8
463 speed: 0 Mbps now, 0 Mbps max
464 2(ovn-fakech-0): addr:aa:55:aa:55:00:08
467 speed: 0 Mbps now, 0 Mbps max
468 3(lport1): addr:aa:55:aa:55:00:09
471 speed: 0 Mbps now, 0 Mbps max
472 4(lport2): addr:aa:55:aa:55:00:0a
475 speed: 0 Mbps now, 0 Mbps max
476 LOCAL(br-int): addr:76:50:54:70:00:40
479 speed: 0 Mbps now, 0 Mbps max
480 OFPT_GET_CONFIG_REPLY (xid=0x4): frags=normal miss_send_len=0
482 This first trace shows a packet from `provnet1-1-port1` with a destination MAC
483 address of `provnet1-2-port1`. Despite both of these ports being on the same
484 local switch (`lport1` and `lport2`), we expect all packets to be sent out to
485 `br-eth1` (OpenFlow port 1). We then expect the network to handle getting the
486 packet to its destination. In practice, this will be optimized at `br-eth1` and
487 the packet won’t actually go out and back on the network.
489 [View ovn/env4/packet1.sh][env4packet1].
491 $ ovn/env4/packet1.sh
493 This next trace is a continuation of the previous one. This shows the packet
494 coming back into `br-int` from `br-eth1`. We now expect the packet to be output
495 to `provnet1-2-port1`, which is OpenFlow port 4.
497 [View ovn/env4/packet2.sh][env4packet2].
499 $ ovn/env4/packet2.sh
501 This next trace shows an example of a packet being sent to a destination on
502 another hypervisor. The source is `provnet1-2-port1`, but the destination is
503 `provnet1-3-port1`, which is on the other fake chassis. As usual, we expect the
504 output to be to OpenFlow port 1, the patch port to `br-et1`.
506 [View ovn/env4/packet3.sh][env4packet3].
508 $ ovn/env4/packet3.sh
510 This next test shows a broadcast packet. The destination should still only be
513 [View ovn/env4/packet4.sh][env4packet4]
515 $ ovn/env4/packet4.sh
517 Finally, this last trace shows what happens when a broadcast packet arrives
518 from the network. In this case, it simulates a broadcast that originated from a
519 port on the remote fake chassis and arrived at the local chassis via `br-eth1`.
520 We should see it output to both local ports that are attached to this network
521 (OpenFlow ports 3 and 4).
523 [View ovn/env4/packet5.sh][env4packet5]
525 $ ovn/env4/packet5.sh
527 5) Locally attached networks with VLANs
528 ---------------------------------------
530 This example is an extension of the previous one. We take the same setup and
531 add two more ports to each hypervisor. Instead of having the new ports directly
532 connected to `physnet1` as before, we indicate that we want them on VLAN 101 of
533 `physnet1`. This shows how `localnet` ports can be used to provide connectivity
534 to either a flat network or a VLAN on that network.
536 [View ovn/env5/setup.sh][env5setup]
540 The logical topology shown by `ovn-nbctl` is similar to `env4`, except we now
541 have 8 regular VIF ports connected to `physnet1` instead of 4. The additional 4
542 ports we have added are all on VLAN 101 of `physnet1`. Note that the `localnet`
543 ports representing connectivity to VLAN 101 of `physnet1` have the `tag` field
547 lswitch 12ea93d0-694b-48e9-adef-d0ddd3ec4ac9 (provnet1-7-101)
548 lport provnet1-7-physnet1-101
551 lport provnet1-7-101-port1
552 macs: 00:00:00:00:00:07
553 lswitch c9a5ce3a-15ec-48ea-a898-416013463589 (provnet1-4)
554 lport provnet1-4-port1
555 macs: 00:00:00:00:00:04
556 lport provnet1-4-physnet1
558 lswitch e07d4f7a-2085-4fbb-9937-d6192b79a397 (provnet1-1)
559 lport provnet1-1-physnet1
561 lport provnet1-1-port1
562 macs: 00:00:00:00:00:01
563 lswitch 6c098474-0509-4219-bc9b-eb4e28dd1aeb (provnet1-2)
564 lport provnet1-2-physnet1
566 lport provnet1-2-port1
567 macs: 00:00:00:00:00:02
568 lswitch 723c4684-5d58-4202-b8e3-4ba99ad5ed9e (provnet1-8-101)
569 lport provnet1-8-101-port1
570 macs: 00:00:00:00:00:08
571 lport provnet1-8-physnet1-101
574 lswitch 8444e925-ceb2-4b02-ac20-eb2e4cfb954d (provnet1-6-101)
575 lport provnet1-6-physnet1-101
578 lport provnet1-6-101-port1
579 macs: 00:00:00:00:00:06
580 lswitch e11e5605-7c46-4395-b28d-cff57451fc7e (provnet1-3)
581 lport provnet1-3-port1
582 macs: 00:00:00:00:00:03
583 lport provnet1-3-physnet1
585 lswitch 0706b697-6c92-4d54-bc0a-db5bababb74a (provnet1-5-101)
586 lport provnet1-5-101-port1
587 macs: 00:00:00:00:00:05
588 lport provnet1-5-physnet1-101
592 The physical topology shows that we have 4 regular VIF ports on each simulated
596 Chassis “56b18105-5706-46ef-80c4-ff20979ab068”
599 Port_Binding “provnet1-6-101-port1”
600 Port_Binding “provnet1-1-port1”
601 Port_Binding “provnet1-2-port1”
602 Port_Binding “provnet1-5-101-port1”
606 Port_Binding “provnet1-4-port1”
607 Port_Binding “provnet1-3-port1”
608 Port_Binding “provnet1-8-101-port1”
609 Port_Binding “provnet1-7-101-port1”
611 All of the traces from the previous example, `env4`, should work in this
612 environment and provide the same result. Now we can show what happens for the
613 ports connected to VLAN 101. This first example shows a packet originating from
614 `provnet1-5-101-port1`, which is OpenFlow port 5. We should see VLAN tag 101
615 pushed on the packet and then output to OpenFlow port 1, the patch port to
616 `br-eth1` (the bridge providing connectivity to `physnet1`).
618 [View ovn/env5/packet1.sh][env5packet1].
620 $ ovn/env5/packet1.sh
622 If we look at a broadcast packet arriving on VLAN 101 of `physnet1`, we should
623 see it output to OpenFlow ports 5 and 6 only.
625 [View ovn/env5/packet2.sh][env5packet2].
627 $ ovn/env5/packet2.sh
630 [Tutorial.md]:./Tutorial.md
631 [env1setup]:./ovn/env1/setup.sh
632 [env1packet1]:./ovn/env1/packet1.sh
633 [env1packet2]:./ovn/env1/packet2.sh
634 [env1thirdport]:./ovn/env1/add-third-port.sh
635 [env2setup]:./ovn/env2/setup.sh
636 [env2packet1]:./ovn/env2/packet1.sh
637 [env2packet2]:./ovn/env2/packet2.sh
638 [env3setup]:./ovn/env3/setup.sh
639 [env3packet1]:./ovn/env3/packet1.sh
640 [env3packet2]:./ovn/env3/packet2.sh
641 [env4setup1]:./ovn/env4/setup1.sh
642 [env4setup2]:./ovn/env4/setup2.sh
643 [env4packet1]:./ovn/env4/packet1.sh
644 [env4packet2]:./ovn/env4/packet2.sh
645 [env4packet3]:./ovn/env4/packet3.sh
646 [env4packet4]:./ovn/env4/packet4.sh
647 [env4packet5]:./ovn/env4/packet5.sh
648 [env5setup]:./ovn/env5/setup.sh
649 [env5packet1]:./ovn/env5/packet1.sh
650 [env5packet2]:./ovn/env5/packet2.sh