ovn: Convert tabs to spaces in ovn-sb.xml.
[cascardo/ovs.git] / ovn / ovn-sb.xml
1 <?xml version="1.0" encoding="utf-8"?>
2 <database name="ovn-sb" title="OVN Southbound Database">
3   <p>
4     This database holds logical and physical configuration and state for the
5     Open Virtual Network (OVN) system to support virtual network abstraction.
6     For an introduction to OVN, please see <code>ovn-architecture</code>(7).
7   </p>
8
9   <p>
10     The OVN Southbound database sits at the center of the OVN
11     architecture.  It is the one component that speaks both southbound
12     directly to all the hypervisors and gateways, via
13     <code>ovn-controller</code>, and northbound to the Cloud Management
14     System, via <code>ovn-northd</code>:
15   </p>
16
17   <h2>Database Structure</h2>
18
19   <p>
20     The OVN Southbound database contains three classes of data with
21     different properties, as described in the sections below.
22   </p>
23
24   <h3>Physical Network (PN) data</h3>
25
26   <p>
27     PN tables contain information about the chassis nodes in the system.  This
28     contains all the information necessary to wire the overlay, such as IP
29     addresses, supported tunnel types, and security keys.
30   </p>
31
32   <p>
33     The amount of PN data is small (O(n) in the number of chassis) and it
34     changes infrequently, so it can be replicated to every chassis.
35   </p>
36
37   <p>
38     The <ref table="Chassis"/> and <ref table="Gateway"/> tables comprise the
39     PN tables.
40   </p>
41
42   <h3>Logical Network (LN) data</h3>
43
44   <p>
45     LN tables contain the topology of logical switches and routers, ACLs,
46     firewall rules, and everything needed to describe how packets traverse a
47     logical network, represented as logical datapath flows (see Logical
48     Datapath Flows, below).
49   </p>
50
51   <p>
52     LN data may be large (O(n) in the number of logical ports, ACL rules,
53     etc.).  Thus, to improve scaling, each chassis should receive only data
54     related to logical networks in which that chassis participates.  Past
55     experience shows that in the presence of large logical networks, even
56     finer-grained partitioning of data, e.g. designing logical flows so that
57     only the chassis hosting a logical port needs related flows, pays off
58     scale-wise.  (This is not necessary initially but it is worth bearing in
59     mind in the design.)
60   </p>
61
62   <p>
63     The LN is a slave of the cloud management system running northbound of OVN.
64     That CMS determines the entire OVN logical configuration and therefore the
65     LN's content at any given time is a deterministic function of the CMS's
66     configuration, although that happens indirectly via the OVN Northbound DB
67     and <code>ovn-northd</code>.
68   </p>
69
70   <p>
71     LN data is likely to change more quickly than PN data.  This is especially
72     true in a container environment where VMs are created and destroyed (and
73     therefore added to and deleted from logical switches) quickly.
74   </p>
75
76   <p>
77     The <ref table="Pipeline"/> table is currently the only LN table.
78   </p>
79
80   <h3>Bindings data</h3>
81
82   <p>
83     The Binding tables contain the current placement of logical components
84     (such as VMs and VIFs) onto chassis and the bindings between logical ports
85     and MACs.
86   </p>
87
88   <p>
89     Bindings change frequently, at least every time a VM powers up or down
90     or migrates, and especially quickly in a container environment.  The
91     amount of data per VM (or VIF) is small.
92   </p>
93
94   <p>
95     Each chassis is authoritative about the VMs and VIFs that it hosts at any
96     given time and can efficiently flood that state to a central location, so
97     the consistency needs are minimal.
98   </p>
99
100   <p>
101     The <ref table="Binding"/> table is currently the only binding data.
102   </p>
103
104   <table name="Chassis" title="Physical Network Hypervisor and Gateway Information">
105     <p>
106       Each row in this table represents a hypervisor or gateway (a chassis) in
107       the physical network (PN).  Each chassis, via
108       <code>ovn-controller</code>, adds and updates its own row, and keeps a
109       copy of the remaining rows to determine how to reach other hypervisors.
110     </p>
111
112     <p>
113       When a chassis shuts down gracefully, it should remove its own row.
114       (This is not critical because resources hosted on the chassis are equally
115       unreachable regardless of whether the row is present.)  If a chassis
116       shuts down permanently without removing its row, some kind of manual or
117       automatic cleanup is eventually needed; we can devise a process for that
118       as necessary.
119     </p>
120
121     <column name="name">
122       A chassis name, taken from <ref key="system-id" table="Open_vSwitch"
123       column="external_ids" db="Open_vSwitch"/> in the Open_vSwitch
124       database's <ref table="Open_vSwitch" db="Open_vSwitch"/> table.  OVN does
125       not prescribe a particular format for chassis names.
126     </column>
127
128     <group title="Encapsulation Configuration">
129       <p>
130         OVN uses encapsulation to transmit logical dataplane packets
131         between chassis.
132       </p>
133
134       <column name="encaps">
135         Points to supported encapsulation configurations to transmit
136         logical dataplane packets to this chassis.  Each entry is a <ref
137         table="Encap"/> record that describes the configuration.
138       </column>
139     </group>
140
141     <group title="Gateway Configuration">
142       <p>
143         A <dfn>gateway</dfn> is a chassis that forwards traffic between a
144         logical network and a physical VLAN.  Gateways are typically dedicated
145         nodes that do not host VMs.
146       </p>
147
148       <column name="gateway_ports">
149         Maps from the name of a port attached to the OVN integration bridge
150         (typically a physical port or an Open vSwitch patch port) to a <ref
151         table="Gateway"/> record that describes the details of the gatewaying
152         function.
153       </column>
154     </group>
155   </table>
156
157   <table name="Encap" title="Encapsulation Types">
158     <p>
159       The <ref column="encaps" table="Chassis"/> column in the <ref
160       table="Chassis"/> table refers to rows in this table to identify
161       how OVN may transmit logical dataplane packets to this chassis.
162       Each chassis, via <code>ovn-controller</code>(8), adds and updates
163       its own rows and keeps a copy of the remaining rows to determine
164       how to reach other chassis.
165     </p>
166
167     <column name="type">
168       The encapsulation to use to transmit packets to this chassis.
169       Hypervisors must use either <code>geneve</code> or
170       <code>stt</code>.  Gateways may use <code>vxlan</code>,
171       <code>geneve</code>, or <code>stt</code>.
172     </column>
173
174     <column name="options">
175       Options for configuring the encapsulation, e.g. IPsec parameters when
176       IPsec support is introduced.  No options are currently defined.
177     </column>
178
179     <column name="ip">
180       The IPv4 address of the encapsulation tunnel endpoint.
181     </column>
182   </table>
183
184   <table name="Gateway" title="Physical Network Gateway Ports">
185     <p>
186       The <ref column="gateway_ports" table="Chassis"/> column in the <ref
187       table="Chassis"/> table refers to rows in this table to connect a chassis
188       port to a gateway function.  Each row in this table describes the logical
189       networks to which a gateway port is attached.  Each chassis, via
190       <code>ovn-controller</code>(8), adds and updates its own rows, if any
191       (since most chassis are not gateways), and keeps a copy of the remaining
192       rows to determine how to reach other chassis.
193     </p>
194
195     <column name="vlan_map">
196       Maps from a VLAN ID to a logical port name.  Thus, each named logical
197       port corresponds to one VLAN on the gateway port.
198     </column>
199   </table>
200
201   <table name="Pipeline" title="Logical Network Pipeline">
202     <p>
203       Each row in this table represents one logical flow.  The cloud management
204       system, via its OVN integration, populates this table with logical flows
205       that implement the L2 and L3 topology specified in the CMS configuration.
206       Each hypervisor, via <code>ovn-controller</code>, translates the logical
207       flows into OpenFlow flows specific to its hypervisor and installs them
208       into Open vSwitch.
209     </p>
210
211     <p>
212       Logical flows are expressed in an OVN-specific format, described here.  A
213       logical datapath flow is much like an OpenFlow flow, except that the
214       flows are written in terms of logical ports and logical datapaths instead
215       of physical ports and physical datapaths.  Translation between logical
216       and physical flows helps to ensure isolation between logical datapaths.
217       (The logical flow abstraction also allows the CMS to do less work, since
218       it does not have to separately compute and push out physical flows to each
219       chassis.)
220     </p>
221
222     <p>
223       The default action when no flow matches is to drop packets.
224     </p>
225
226     <column name="logical_datapath">
227       The logical datapath to which the logical flow belongs.  A logical
228       datapath implements a logical pipeline among the ports in the <ref
229       table="Binding"/> table associated with it.  (No table represents a
230       logical datapath.)  In practice, the pipeline in a given logical datapath
231       implements either a logical switch or a logical router, and
232       <code>ovn-northd</code> reuses the UUIDs for those logical entities from
233       the <code>OVN_Northbound</code> for logical datapaths.
234     </column>
235
236     <column name="table_id">
237       The stage in the logical pipeline, analogous to an OpenFlow table number.
238     </column>
239
240     <column name="priority">
241       The flow's priority.  Flows with numerically higher priority take
242       precedence over those with lower.  If two logical datapath flows with the
243       same priority both match, then the one actually applied to the packet is
244       undefined.
245     </column>
246
247     <column name="match">
248       <p>
249         A matching expression.  OVN provides a superset of OpenFlow matching
250         capabilities, using a syntax similar to Boolean expressions in a
251         programming language.
252       </p>
253
254       <p>
255         The most important components of match expression are
256         <dfn>comparisons</dfn> between <dfn>symbols</dfn> and
257         <dfn>constants</dfn>, e.g. <code>ip4.dst == 192.168.0.1</code>,
258         <code>ip.proto == 6</code>, <code>arp.op == 1</code>, <code>eth.type ==
259         0x800</code>.  The logical AND operator <code>&amp;&amp;</code> and
260         logical OR operator <code>||</code> can combine comparisons into a
261         larger expression.
262       </p>
263
264       <p>
265         Matching expressions also support parentheses for grouping, the logical
266         NOT prefix operator <code>!</code>, and literals <code>0</code> and
267         <code>1</code> to express ``false'' or ``true,'' respectively.  The
268         latter is useful by itself as a catch-all expression that matches every
269         packet.
270       </p>
271
272       <p><em>Symbols</em></p>
273
274       <p>
275         <em>Type</em>.  Symbols have <dfn>integer</dfn> or <dfn>string</dfn>
276         type.  Integer symbols have a <dfn>width</dfn> in bits.
277       </p>
278
279       <p>
280         <em>Kinds</em>.  There are three kinds of symbols:
281       </p>
282
283       <ul>
284         <li>
285           <p>
286             <dfn>Fields</dfn>.  A field symbol represents a packet header or
287             metadata field.  For example, a field
288             named <code>vlan.tci</code> might represent the VLAN TCI field in a
289             packet.
290           </p>
291
292           <p>
293             A field symbol can have integer or string type.  Integer fields can
294             be nominal or ordinal (see <em>Level of Measurement</em>,
295             below).
296           </p>
297         </li>
298
299         <li>
300           <p>
301             <dfn>Subfields</dfn>.  A subfield represents a subset of bits from
302             a larger field.  For example, a field <code>vlan.vid</code> might
303             be defined as an alias for <code>vlan.tci[0..11]</code>.  Subfields
304             are provided for syntactic convenience, because it is always
305             possible to instead refer to a subset of bits from a field
306             directly.
307           </p>
308
309           <p>
310             Only ordinal fields (see <em>Level of Measurement</em>,
311             below) may have subfields.  Subfields are always ordinal.
312           </p>
313         </li>
314
315         <li>
316           <p>
317             <dfn>Predicates</dfn>.  A predicate is shorthand for a Boolean
318             expression.  Predicates may be used much like 1-bit fields.  For
319             example, <code>ip4</code> might expand to <code>eth.type ==
320             0x800</code>.  Predicates are provided for syntactic convenience,
321             because it is always possible to instead specify the underlying
322             expression directly.
323           </p>
324
325           <p>
326             A predicate whose expansion refers to any nominal field or
327             predicate (see <em>Level of Measurement</em>, below) is nominal;
328             other predicates have Boolean level of measurement.
329           </p>
330         </li>
331       </ul>
332
333       <p>
334         <em>Level of Measurement</em>.  See
335         http://en.wikipedia.org/wiki/Level_of_measurement for the statistical
336         concept on which this classification is based.  There are three
337         levels:
338       </p>
339
340       <ul>
341         <li>
342           <p>
343             <dfn>Ordinal</dfn>.  In statistics, ordinal values can be ordered
344             on a scale.  OVN considers a field (or subfield) to be ordinal if
345             its bits can be examined individually.  This is true for the
346             OpenFlow fields that OpenFlow or Open vSwitch makes ``maskable.''
347           </p>
348
349           <p>
350             Any use of a nominal field may specify a single bit or a range of
351             bits, e.g. <code>vlan.tci[13..15]</code> refers to the PCP field
352             within the VLAN TCI, and <code>eth.dst[40]</code> refers to the
353             multicast bit in the Ethernet destination address.
354           </p>
355
356           <p>
357             OVN supports all the usual arithmetic relations (<code>==</code>,
358             <code>!=</code>, <code>&lt;</code>, <code>&lt;=</code>,
359             <code>&gt;</code>, and <code>&gt;=</code>) on ordinal fields and
360             their subfields, because OVN can implement these in OpenFlow and
361             Open vSwitch as collections of bitwise tests.
362           </p>
363         </li>
364
365         <li>
366           <p>
367             <dfn>Nominal</dfn>.  In statistics, nominal values cannot be
368             usefully compared except for equality.  This is true of OpenFlow
369             port numbers, Ethernet types, and IP protocols are examples: all of
370             these are just identifiers assigned arbitrarily with no deeper
371             meaning.  In OpenFlow and Open vSwitch, bits in these fields
372             generally aren't individually addressable.
373           </p>
374
375           <p>
376             OVN only supports arithmetic tests for equality on nominal fields,
377             because OpenFlow and Open vSwitch provide no way for a flow to
378             efficiently implement other comparisons on them.  (A test for
379             inequality can be sort of built out of two flows with different
380             priorities, but OVN matching expressions always generate flows with
381             a single priority.)
382           </p>
383
384           <p>
385             String fields are always nominal.
386           </p>
387         </li>
388
389         <li>
390           <p>
391             <dfn>Boolean</dfn>.  A nominal field that has only two values, 0
392             and 1, is somewhat exceptional, since it is easy to support both
393             equality and inequality tests on such a field: either one can be
394             implemented as a test for 0 or 1.
395           </p>
396
397           <p>
398             Only predicates (see above) have a Boolean level of measurement.
399           </p>
400
401           <p>
402             This isn't a standard level of measurement.
403           </p>
404         </li>
405       </ul>
406
407       <p>
408         <em>Prerequisites</em>.  Any symbol can have prerequisites, which are
409         additional condition implied by the use of the symbol.  For example,
410         For example, <code>icmp4.type</code> symbol might have prerequisite
411         <code>icmp4</code>, which would cause an expression <code>icmp4.type ==
412         0</code> to be interpreted as <code>icmp4.type == 0 &amp;&amp;
413         icmp4</code>, which would in turn expand to <code>icmp4.type == 0
414         &amp;&amp; eth.type == 0x800 &amp;&amp; ip4.proto == 1</code> (assuming
415         <code>icmp4</code> is a predicate defined as suggested under
416         <em>Types</em> above).
417       </p>
418
419       <p><em>Relational operators</em></p>
420
421       <p>
422         All of the standard relational operators <code>==</code>,
423         <code>!=</code>, <code>&lt;</code>, <code>&lt;=</code>,
424         <code>&gt;</code>, and <code>&gt;=</code> are supported.  Nominal
425         fields support only <code>==</code> and <code>!=</code>, and only in a
426         positive sense when outer <code>!</code> are taken into account,
427         e.g. given string field <code>inport</code>, <code>inport ==
428         "eth0"</code> and <code>!(inport != "eth0")</code> are acceptable, but
429         not <code>inport != "eth0"</code>.
430       </p>
431
432       <p>
433         The implementation of <code>==</code> (or <code>!=</code> when it is
434         negated), is more efficient than that of the other relational
435         operators.
436       </p>
437
438       <p><em>Constants</em></p>
439
440       <p>
441         Integer constants may be expressed in decimal, hexadecimal prefixed by
442         <code>0x</code>, or as dotted-quad IPv4 addresses, IPv6 addresses in
443         their standard forms, or Ethernet addresses as colon-separated hex
444         digits.  A constant in any of these forms may be followed by a slash
445         and a second constant (the mask) in the same form, to form a masked
446         constant.  IPv4 and IPv6 masks may be given as integers, to express
447         CIDR prefixes.
448       </p>
449
450       <p>
451         String constants have the same syntax as quoted strings in JSON (thus,
452         they are Unicode strings).  String constants are used for naming
453         logical ports.  Thus, the useful values are <ref
454         column="logical_port"/> names from the <ref column="Binding"/> and
455         <ref column="Gateway"/> tables in a logical flow's <ref
456         column="logical_datapath"/>.
457       </p>
458
459       <p>
460         Some operators support sets of constants written inside curly braces
461         <code>{</code> ... <code>}</code>.  Commas between elements of a set,
462         and after the last elements, are optional.  With <code>==</code>,
463         ``<code><var>field</var> == { <var>constant1</var>,
464         <var>constant2</var>,</code> ... <code>}</code>'' is syntactic sugar
465         for ``<code><var>field</var> == <var>constant1</var> ||
466         <var>field</var> == <var>constant2</var> || </code>...<code></code>.
467         Similarly, ``<code><var>field</var> != { <var>constant1</var>,
468         <var>constant2</var>, </code>...<code> }</code>'' is equivalent to
469         ``<code><var>field</var> != <var>constant1</var> &amp;&amp;
470         <var>field</var> != <var>constant2</var> &amp;&amp;
471         </code>...<code></code>''.
472       </p>
473
474       <p><em>Miscellaneous</em></p>
475
476       <p>
477         Comparisons may name the symbol or the constant first,
478         e.g. <code>tcp.src == 80</code> and <code>80 == tcp.src</code> are both
479         acceptable.
480       </p>
481
482       <p>
483         Tests for a range may be expressed using a syntax like <code>1024 &lt;=
484         tcp.src &lt;= 49151</code>, which is equivalent to <code>1024 &lt;=
485         tcp.src &amp;&amp; tcp.src &lt;= 49151</code>.
486       </p>
487
488       <p>
489         For a one-bit field or predicate, a mention of its name is equivalent
490         to <code><var>symobl</var> == 1</code>, e.g. <code>vlan.present</code>
491         is equivalent to <code>vlan.present == 1</code>.  The same is true for
492         one-bit subfields, e.g. <code>vlan.tci[12]</code>.  There is no
493         technical limitation to implementing the same for ordinal fields of all
494         widths, but the implementation is expensive enough that the syntax
495         parser requires writing an explicit comparison against zero to make
496         mistakes less likely, e.g. in <code>tcp.src != 0</code> the comparison
497         against 0 is required.
498       </p>
499
500       <p>
501         <em>Operator precedence</em> is as shown below, from highest to lowest.
502         There are two exceptions where parentheses are required even though the
503         table would suggest that they are not: <code>&amp;&amp;</code> and
504         <code>||</code> require parentheses when used together, and
505         <code>!</code> requires parentheses when applied to a relational
506         expression.  Thus, in <code>(eth.type == 0x800 || eth.type == 0x86dd)
507         &amp;&amp; ip.proto == 6</code> or <code>!(arp.op == 1)</code>, the
508         parentheses are mandatory.
509       </p>
510
511       <ul>
512         <li><code>()</code></li>
513         <li><code>==   !=   &lt;   &lt;=   &gt;   &gt;=</code></li>
514         <li><code>!</code></li>
515         <li><code>&amp;&amp;   ||</code></li>
516       </ul>
517
518       <p>
519         <em>Comments</em> may be introduced by <code>//</code>, which extends
520         to the next new-line.  Comments within a line may be bracketed by
521         <code>/*</code> and <code>*/</code>.  Multiline comments are not
522         supported.
523       </p>
524
525       <p><em>Symbols</em></p>
526
527       <ul>
528         <li>
529           <code>metadata</code> <code>reg0</code> ... <code>reg7</code>
530           <code>xreg0</code> ... <code>xreg3</code>
531         </li>
532         <li><code>inport</code> <code>outport</code> <code>queue</code></li>
533         <li><code>eth.src</code> <code>eth.dst</code> <code>eth.type</code></li>
534         <li><code>vlan.tci</code> <code>vlan.vid</code> <code>vlan.pcp</code> <code>vlan.present</code></li>
535         <li><code>ip.proto</code> <code>ip.dscp</code> <code>ip.ecn</code> <code>ip.ttl</code> <code>ip.frag</code></li>
536         <li><code>ip4.src</code> <code>ip4.dst</code></li>
537         <li><code>ip6.src</code> <code>ip6.dst</code> <code>ip6.label</code></li>
538         <li><code>arp.op</code> <code>arp.spa</code> <code>arp.tpa</code> <code>arp.sha</code> <code>arp.tha</code></li>
539         <li><code>tcp.src</code> <code>tcp.dst</code> <code>tcp.flags</code></li>
540         <li><code>udp.src</code> <code>udp.dst</code></li>
541         <li><code>sctp.src</code> <code>sctp.dst</code></li>
542         <li><code>icmp4.type</code> <code>icmp4.code</code></li>
543         <li><code>icmp6.type</code> <code>icmp6.code</code></li>
544         <li><code>nd.target</code> <code>nd.sll</code> <code>nd.tll</code></li>
545       </ul>
546
547     </column>
548
549     <column name="actions">
550       <p>
551         Logical datapath actions, to be executed when the logical flow
552         represented by this row is the highest-priority match.
553       </p>
554
555       <p>
556         Actions share lexical syntax with the <ref column="match"/> column.  An
557         empty set of actions (or one that contains just white space or
558         comments), or a set of actions that consists of just
559         <code>drop;</code>, causes the matched packets to be dropped.
560         Otherwise, the column should contain a sequence of actions, each
561         terminated by a semicolon.
562       </p>
563
564       <p>
565         The following actions will be initially supported:
566       </p>
567
568       <dl>
569         <dt><code>output;</code></dt>
570         <dd>
571           Outputs the packet to the logical port current designated by
572           <code>outport</code>.  Output to the ingress port is implicitly
573           dropped, that is, <code>output</code> becomes a no-op if
574           <code>outport</code> == <code>inport</code>.
575         </dd>
576
577         <dt><code>next;</code></dt>
578         <dd>
579           Executes the next logical datapath table as a subroutine.
580         </dd>
581
582         <dt><code><var>field</var> = <var>constant</var>;</code></dt>
583         <dd>
584           Sets data or metadata field <var>field</var> to constant value
585           <var>constant</var>, e.g. <code>outport = "vif0";</code> to set the
586           logical output port.  Assigning to a field with prerequisites
587           implicitly adds those prerequisites to <ref column="match"/>; thus,
588           for example, a flow that sets <code>tcp.dst</code> applies only to
589           TCP flows, regardless of whether its <ref column="match"/> mentions
590           any TCP field.  To set only a subset of bits in a field,
591           <var>field</var> may be a subfield or <var>constant</var> may be
592           masked, e.g. <code>vlan.pcp[2] = 1;</code> and <code>vlan.pcp =
593           4/4;</code> both set the most sigificant bit of the VLAN PCP.  Not
594           all fields are modifiable (e.g. <code>eth.type</code> and
595           <code>ip.proto</code> are read-only), and not all modifiable fields
596           may be partially modified (e.g. <code>ip.ttl</code> must assigned as
597           a whole).
598         </dd>
599       </dl>
600
601       <p>
602         The following actions will likely be useful later, but they have not
603         been thought out carefully.
604       </p>
605
606       <dl>
607         <dt><code><var>field1</var> = <var>field2</var>;</code></dt>
608         <dd>
609           Extends the assignment action to allow copying between fields.
610         </dd>
611
612         <dt><code>learn</code></dt>
613
614         <dt><code>conntrack</code></dt>
615
616         <dt><code>dec_ttl { <var>action</var>, </code>...<code> } { <var>action</var>; </code>...<code>};</code></dt>
617         <dd>
618           decrement TTL; execute first set of actions if
619           successful, second set if TTL decrement fails
620         </dd>
621
622         <dt><code>icmp_reply { <var>action</var>, </code>...<code> };</code></dt>
623         <dd>generate ICMP reply from packet, execute <var>action</var>s</dd>
624
625         <dt><code>arp { <var>action</var>, </code>...<code> }</code></dt>
626         <dd>generate ARP from packet, execute <var>action</var>s</dd>
627       </dl>
628     </column>
629   </table>
630
631   <table name="Binding" title="Physical-Logical Bindings">
632     <p>
633       Each row in this table identifies the physical location of a logical
634       port.
635     </p>
636
637     <p>
638       For every <code>Logical_Port</code> record in <code>OVN_Northbound</code>
639       database, <code>ovn-northd</code> creates a record in this table.
640       <code>ovn-northd</code> populates and maintains every column except
641       the <code>chassis</code> column, which it leaves empty in new records.
642     </p>
643
644     <p>
645       <code>ovn-controller</code> populates the <code>chassis</code> column
646       for the records that identify the logical ports that are located on its
647       hypervisor, which <code>ovn-controller</code> in turn finds out by
648       monitoring the local hypervisor's Open_vSwitch database, which
649       identifies logical ports via the conventions described in
650       <code>IntegrationGuide.md</code>.
651     </p>
652
653     <p>
654       When a chassis shuts down gracefully, it should cleanup the
655       <code>chassis</code> column that it previously had populated.
656       (This is not critical because resources hosted on the chassis are equally
657       unreachable regardless of whether their rows are present.)  To handle the
658       case where a VM is shut down abruptly on one chassis, then brought up
659       again on a different one, <code>ovn-controller</code> must overwrite the
660       <code>chassis</code> column with new information.
661     </p>
662
663     <column name="logical_datapath">
664       The logical datapath to which the logical port belongs.  A logical
665       datapath implements a logical pipeline via logical flows in the <ref
666       table="Pipeline"/> table.  (No table represents a logical datapath.)
667     </column>
668
669     <column name="logical_port">
670       A logical port, taken from <ref table="Logical_Port" column="name"
671       db="OVN_Northbound"/> in the OVN_Northbound database's
672       <ref table="Logical_Port" db="OVN_Northbound"/> table.  OVN does not
673       prescribe a particular format for the logical port ID.
674     </column>
675
676     <column name="tunnel_key">
677       <p>
678         A number that represents the logical port in the key (e.g. VXLAN VNI or
679         STT key) field carried within tunnel protocol packets.  (This avoids
680         wasting space for a whole UUID in tunneled packets.  It also allows OVN
681         to support encapsulations that cannot fit an entire UUID in their
682         tunnel keys.)
683       </p>
684
685       <p>
686         Tunnel ID 0 is reserved for internal use within OVN.
687       </p>
688     </column>
689
690     <column name="parent_port">
691       For containers created inside a VM, this is taken from
692       <ref table="Logical_Port" column="parent_name" db="OVN_Northbound"/>
693       in the OVN_Northbound database's <ref table="Logical_Port"
694       db="OVN_Northbound"/> table.  It is left empty if
695       <ref column="logical_port"/> belongs to a VM or a container created
696       in the hypervisor.
697     </column>
698
699     <column name="tag">
700       When <ref column="logical_port"/> identifies the interface of a container
701       spawned inside a VM, this column identifies the VLAN tag in
702       the network traffic associated with that container's network interface.
703       It is left empty if <ref column="logical_port"/> belongs to a VM or a
704       container created in the hypervisor.
705     </column>
706
707     <column name="chassis">
708       The physical location of the logical port.  To successfully identify a
709       chassis, this column must be a <ref table="Chassis"/> record.  This is
710       populated by <code>ovn-controller</code>.
711     </column>
712
713     <column name="mac">
714       <p>
715         The Ethernet address or addresses used as a source address on the
716         logical port, each in the form
717         <var>xx</var>:<var>xx</var>:<var>xx</var>:<var>xx</var>:<var>xx</var>:<var>xx</var>.
718         The string <code>unknown</code> is also allowed to indicate that the
719         logical port has an unknown set of (additional) source addresses.
720       </p>
721
722       <p>
723         A VM interface would ordinarily have a single Ethernet address.  A
724         gateway port might initially only have <code>unknown</code>, and then
725         add MAC addresses to the set as it learns new source addresses.
726       </p>
727     </column>
728   </table>
729 </database>