ovn: Apply ACL changes to existing connections.
[cascardo/ovs.git] / ovn / northd / ovn-northd.8.xml
1 <?xml version="1.0" encoding="utf-8"?>
2 <manpage program="ovn-northd" section="8" title="ovn-northd">
3     <h1>Name</h1>
4     <p>ovn-northd -- Open Virtual Network central control daemon</p>
5
6     <h1>Synopsis</h1>
7     <p><code>ovn-northd</code> [<var>options</var>]</p>
8
9     <h1>Description</h1>
10     <p>
11       <code>ovn-northd</code> is a centralized daemon responsible for
12       translating the high-level OVN configuration into logical
13       configuration consumable by daemons such as
14       <code>ovn-controller</code>.  It translates the logical network
15       configuration in terms of conventional network concepts, taken
16       from the OVN Northbound Database (see <code>ovn-nb</code>(5)),
17       into logical datapath flows in the OVN Southbound Database (see
18       <code>ovn-sb</code>(5)) below it.
19     </p>
20
21     <h1>Configuration</h1>
22     <p>
23       <code>ovn-northd</code> requires a connection to the Northbound
24       and Southbound databases.  The defaults are <code>ovnnb_db.sock</code>
25       and <code>ovnsb_db.sock</code> respectively
26       in the local Open vSwitch's "run" directory.  This may be
27       overridden with the following commands:
28     </p>
29     <ul>
30       <li>
31         <p>
32           <code>--ovnnb-db=<var>database</var></code>
33         </p>
34         <p>
35           The database containing the OVN Northbound Database.
36         </p>
37       </li>
38       <li>
39         <p>
40           <code>--ovnsb-db=<var>database</var></code>
41         </p>
42         <p>
43           The database containing the OVN Southbound Database.
44         </p>
45       </li>
46     </ul>
47     <p>
48       The <var>database</var> argument must take one of the following forms:
49     </p>
50     <ul>
51       <li>
52         <p>
53           <code>ssl:<var>ip</var>:<var>port</var></code>
54         </p>
55         <p>
56           The specified SSL <var>port</var> on the host at the given
57           <var>ip</var>, which must be expressed as an IP address (not a DNS
58           name) in IPv4 or IPv6 address format.  If <var>ip</var> is an IPv6
59           address, then wrap <var>ip</var> with square brackets, e.g.:
60           <code>ssl:[::1]:6640</code>.  The <code>--private-key</code>,
61           <code>--certificate</code>, and <code>--ca-cert</code> options are
62           mandatory when this form is used.
63         </p>
64       </li>
65       <li>
66         <p>
67           <code>tcp:<var>ip</var>:<var>port</var></code>
68         </p>
69         <p>
70           Connect to the given TCP <var>port</var> on <var>ip</var>, where
71           <var>ip</var> can be IPv4 or IPv6 address. If <var>ip</var> is an
72           IPv6 address, then wrap <var>ip</var> with square brackets, e.g.:
73           <code>tcp:[::1]:6640</code>.
74         </p>
75       </li>
76       <li>
77         <p>
78           <code>unix:<var>file</var></code>
79         </p>
80         <p>
81           On POSIX, connect to the Unix domain server socket named
82           <var>file</var>.
83         </p>
84         <p>
85           On Windows, connect to a localhost TCP port whose value is written
86           in <var>file</var>.
87         </p>
88       </li>
89     </ul>
90
91     <h1>Runtime Management Commands</h1>
92     <p>
93       <code>ovs-appctl</code> can send commands to a running
94       <code>ovn-northd</code> process.  The currently supported commands
95       are described below.
96       <dl>
97       <dt><code>exit</code></dt>
98       <dd>
99         Causes <code>ovn-northd</code> to gracefully terminate.
100       </dd>
101       </dl>
102     </p>
103
104     <h1>Logical Flow Table Structure</h1>
105
106     <p>
107       One of the main purposes of <code>ovn-northd</code> is to populate the
108       <code>Logical_Flow</code> table in the <code>OVN_Southbound</code>
109       database.  This section describes how <code>ovn-northd</code> does this
110       for switch and router logical datapaths.
111     </p>
112
113     <h2>Logical Switch Datapaths</h2>
114
115     <h3>Ingress Table 0: Admission Control and Ingress Port Security - L2</h3>
116
117     <p>
118       Ingress table 0 contains these logical flows:
119     </p>
120
121     <ul>
122       <li>
123         Priority 100 flows to drop packets with VLAN tags or multicast Ethernet
124         source addresses.
125       </li>
126
127       <li>
128         Priority 50 flows that implement ingress port security for each enabled
129         logical port.  For logical ports on which port security is enabled,
130         these match the <code>inport</code> and the valid <code>eth.src</code>
131         address(es) and advance only those packets to the next flow table.  For
132         logical ports on which port security is not enabled, these advance all
133         packets that match the <code>inport</code>.
134       </li>
135     </ul>
136
137     <p>
138       There are no flows for disabled logical ports because the default-drop
139       behavior of logical flow tables causes packets that ingress from them to
140       be dropped.
141     </p>
142
143     <h3>Ingress Table 1: Ingress Port Security - IP</h3>
144
145     <p>
146       Ingress table 1 contains these logical flows:
147     </p>
148
149     <ul>
150       <li>
151         <p>
152           For each element in the port security set having one or more IPv4 or
153           IPv6 addresses (or both),
154         </p>
155
156         <ul>
157           <li>
158             Priority 90 flow to allow IPv4 traffic if it has IPv4 addresses
159             which match the <code>inport</code>, valid <code>eth.src</code>
160             and valid <code>ip4.src</code> address(es).
161           </li>
162
163           <li>
164             Priority 90 flow to allow IPv4 DHCP discovery traffic if it has a
165             valid <code>eth.src</code>. This is necessary since DHCP discovery
166             messages are sent from the unspecified IPv4 address (0.0.0.0) since
167             the IPv4 address has not yet been assigned.
168           </li>
169
170           <li>
171             Priority 90 flow to allow IPv6 traffic if it has IPv6 addresses
172             which match the <code>inport</code>, valid <code>eth.src</code> and
173             valid <code>ip6.src</code> address(es).
174           </li>
175
176           <li>
177             Priority 90 flow to allow IPv6 DAD (Duplicate Address Detection)
178             traffic if it has a valid <code>eth.src</code>. This is is
179             necessary since DAD include requires joining an multicast group and
180             sending neighbor solicitations for the newly assigned address. Since
181             no address is yet assigned, these are sent from the unspecified
182             IPv6 address (::).
183           </li>
184
185           <li>
186             Priority 80 flow to drop IP (both IPv4 and IPv6) traffic which
187             match the <code>inport</code> and valid <code>eth.src</code>.
188           </li>
189         </ul>
190       </li>
191
192       <li>
193         One priority-0 fallback flow that matches all packets and advances to
194         the next table.
195       </li>
196     </ul>
197
198     <h3>Ingress Table 2: Ingress Port Security - Neighbor discovery</h3>
199
200     <p>
201       Ingress table 2 contains these logical flows:
202     </p>
203
204     <ul>
205       <li>
206         <p>
207           For each element in the port security set,
208         </p>
209
210         <ul>
211           <li>
212             Priority 90 flow to allow ARP traffic which match the
213             <code>inport</code> and valid <code>eth.src</code> and
214             <code>arp.sha</code>. If the element has one or more
215             IPv4 addresses, then it also matches the valid
216             <code>arp.spa</code>.
217           </li>
218
219           <li>
220             Priority 90 flow to allow IPv6 Neighbor Solicitation and
221             Advertisement traffic which match the <code>inport</code>,
222             valid <code>eth.src</code> and
223             <code>nd.sll</code>/<code>nd.tll</code>.
224             If the element has one or more IPv6 addresses, then it also
225             matches the valid <code>nd.target</code> address(es) for Neighbor
226             Advertisement traffic.
227           </li>
228
229           <li>
230             Priority 80 flow to drop ARP and IPv6 Neighbor Solicitation and
231             Advertisement traffic which match the <code>inport</code> and
232             valid <code>eth.src</code>.
233           </li>
234         </ul>
235       </li>
236
237       <li>
238         One priority-0 fallback flow that matches all packets and advances to
239         the next table.
240       </li>
241     </ul>
242
243     <h3>Ingress Table 3: <code>from-lport</code> Pre-ACLs</h3>
244
245     <p>
246       This table prepares flows for possible stateful ACL processing in
247       ingress table <code>ACLs</code>.  It contains a priority-0 flow that
248       simply moves traffic to the next table.  If stateful ACLs are used in the
249       logical datapath, a priority-100 flow is added that sets a hint
250       (with <code>reg0[0] = 1; next;</code>) for table
251       <code>Pre-stateful</code> to send IP packets to the connection tracker
252       before eventually advancing to ingress table <code>ACLs</code>.
253     </p>
254
255     <h3>Ingress Table 4: Pre-LB</h3>
256
257     <p>
258       This table prepares flows for possible stateful load balancing processing
259       in ingress table <code>LB</code> and <code>Stateful</code>.  It contains
260       a priority-0 flow that simply moves traffic to the next table.  If load
261       balancing rules with virtual IP addresses (and ports) are configured in
262       <code>OVN_Northbound</code> database for a logical datapath, a
263       priority-100 flow is added for each configured virtual IP address
264       <var>VIP</var> with a match <code>ip &amp;&amp; ip4.dst == <var>VIP</var>
265       </code> that sets an action <code>reg0[0] = 1; next;</code> to act as a
266       hint for table <code>Pre-stateful</code> to send IP packets to the
267       connection tracker for packet de-fragmentation before eventually
268       advancing to ingress table <code>LB</code>.
269     </p>
270
271     <h3>Ingress Table 5: Pre-stateful</h3>
272
273     <p>
274       This table prepares flows for all possible stateful processing
275       in next tables.  It contains a priority-0 flow that simply moves
276       traffic to the next table.  A priority-100 flow sends the packets to
277       connection tracker based on a hint provided by the previous tables
278       (with a match for <code>reg0[0] == 1</code>) by using the
279       <code>ct_next;</code> action.
280     </p>
281
282     <h3>Ingress table 6: <code>from-lport</code> ACLs</h3>
283
284     <p>
285       Logical flows in this table closely reproduce those in the
286       <code>ACL</code> table in the <code>OVN_Northbound</code> database
287       for the <code>from-lport</code> direction. The <code>priority</code>
288       values from the <code>ACL</code> table have a limited range and have
289       1000 added to them to leave room for OVN default flows at both
290       higher and lower priorities.
291     </p>
292     <ul>
293       <li>
294         <code>allow</code> ACLs translate into logical flows with
295         the <code>next;</code> action.  If there are any stateful ACLs
296         on this datapath, then <code>allow</code> ACLs translate to
297         <code>ct_commit; next;</code> (which acts as a hint for the next tables
298         to commit the connection to conntrack),
299       </li>
300       <li>
301         <code>allow-related</code> ACLs translate into logical
302         flows with the <code>ct_commit(ct_label=0/1); next;</code> actions
303         for new connections and <code>reg0[1] = 1; next;</code> for existing
304         connections.
305       </li>
306       <li>
307         Other ACLs translate to <code>drop;</code> for new or untracked
308         connections and <code>ct_commit(ct_label=1/1);</code> for known
309         connections.  Setting <code>ct_label</code> marks a connection
310         as one that was previously allowed, but should no longer be
311         allowed due to a policy change.
312       </li>
313     </ul>
314
315     <p>
316       This table also contains a priority 0 flow with action
317       <code>next;</code>, so that ACLs allow packets by default.  If the
318       logical datapath has a statetful ACL, the following flows will
319       also be added:
320     </p>
321
322     <ul>
323       <li>
324         A priority-1 flow that sets the hint to commit IP traffic to the
325         connection tracker (with action <code>reg0[1] = 1; next;</code>).  This
326         is needed for the default allow policy because, while the initiator's
327         direction may not have any stateful rules, the server's may and then
328         its return traffic would not be known and marked as invalid.
329       </li>
330
331       <li>
332         A priority-65535 flow that allows any traffic in the reply
333         direction for a connection that has been committed to the
334         connection tracker (i.e., established flows), as long as
335         the committed flow does not have <code>ct_label[0]</code> set.
336         We only handle traffic in the reply direction here because
337         we want all packets going in the request direction to still
338         go through the flows that implement the currently defined
339         policy based on ACLs.  If a connection is no longer allowed by
340         policy, <code>ct_label[0]</code> will get set and packets in the
341         reply direction will no longer be allowed, either.
342       </li>
343
344       <li>
345         A priority-65535 flow that allows any traffic that is considered
346         related to a committed flow in the connection tracker (e.g., an
347         ICMP Port Unreachable from a non-listening UDP port), as long
348         as the committed flow does not have <code>ct_label[0]</code> set.
349       </li>
350
351       <li>
352         A priority-65535 flow that drops all traffic marked by the
353         connection tracker as invalid.
354       </li>
355
356       <li>
357         A priority-65535 flow that drops all trafic in the reply direction
358         with <code>ct_label[0]</code> set meaning that the connection
359         should no longer be allowed due to a policy change.  Packets
360         in the request direction are skipped here to let a newly created
361         ACL re-allow this connection.
362       </li>
363     </ul>
364
365     <h3>Ingress Table 7: LB</h3>
366
367     <p>
368       It contains a priority-0 flow that simply moves traffic to the next
369       table.  For established connections a priority 100 flow matches on
370       <code>ct.est &amp;&amp; !ct.rel &amp;&amp; !ct.new &amp;&amp;
371       !ct.inv</code> and sets an action <code>reg0[2] = 1; next;</code> to act
372       as a hint for table <code>Stateful</code> to send packets through
373       connection tracker to NAT the packets.  (The packet will automatically
374       get DNATed to the same IP address as the first packet in that
375       connection.)
376     </p>
377
378     <h3>Ingress Table 8: Stateful</h3>
379
380     <ul>
381       <li>
382         For all the configured load balancing rules in
383         <code>OVN_Northbound</code> database that includes a L4 port
384         <var>PORT</var> of protocol <var>P</var> and IPv4 address
385         <var>VIP</var>, a priority-120 flow that matches on
386         <code>ct.new &amp;&amp; ip &amp;&amp; ip4.dst == <var>VIP
387         </var>&amp;&amp; <var>P</var> &amp;&amp; <var>P</var>.dst == <var>PORT
388         </var></code> with an action of <code>ct_lb(<var>args</var>)</code>,
389         where <var>args</var> contains comma separated IPv4 addresses (and
390         optional port numbers) to load balance to.
391       </li>
392       <li>
393         For all the configured load balancing rules in
394         <code>OVN_Northbound</code> database that includes just an IP address
395         <var>VIP</var> to match on, a priority-110 flow that matches on
396         <code>ct.new &amp;&amp; ip &amp;&amp; ip4.dst == <var>VIP</var></code>
397         with an action of <code>ct_lb(<var>args</var>)</code>, where
398         <var>args</var> contains comma separated IPv4 addresses.
399       </li>
400       <li>
401         A priority-100 flow commits packets to connection tracker using
402         <code>ct_commit; next;</code> action based on a hint provided by
403         the previous tables (with a match for <code>reg0[1] == 1</code>).
404       </li>
405       <li>
406         A priority-100 flow sends the packets to connection tracker using
407         <code>ct_lb;</code> as the action based on a hint provided by the
408         previous tables (with a match for <code>reg0[2] == 1</code>).
409       </li>
410       <li>
411         A priority-0 flow that simply moves traffic to the next table.
412       </li>
413     </ul>
414
415     <h3>Ingress Table 9: ARP responder</h3>
416
417     <p>
418       This table implements ARP responder for known IPs.  It contains these
419       logical flows:
420     </p>
421
422     <ul>
423       <li>
424         Priority-100 flows to skip ARP responder if inport is of type
425         <code>localnet</code>, and advances directly to the next table.
426       </li>
427
428       <li>
429         <p>
430           Priority-50 flows that matches ARP requests to each known IP address
431           <var>A</var> of logical port <var>P</var>, and respond with ARP
432           replies directly with corresponding Ethernet address <var>E</var>:
433         </p>
434
435         <pre>
436 eth.dst = eth.src;
437 eth.src = <var>E</var>;
438 arp.op = 2; /* ARP reply. */
439 arp.tha = arp.sha;
440 arp.sha = <var>E</var>;
441 arp.tpa = arp.spa;
442 arp.spa = <var>A</var>;
443 outport = <var>P</var>;
444 inport = ""; /* Allow sending out inport. */
445 output;
446         </pre>
447
448         <p>
449           These flows are omitted for logical ports (other than router ports)
450           that are down.
451         </p>
452       </li>
453
454       <li>
455         One priority-0 fallback flow that matches all packets and advances to
456         the next table.
457       </li>
458     </ul>
459
460     <h3>Ingress Table 10: Destination Lookup</h3>
461
462     <p>
463       This table implements switching behavior.  It contains these logical
464       flows:
465     </p>
466
467     <ul>
468       <li>
469         A priority-100 flow that outputs all packets with an Ethernet broadcast
470         or multicast <code>eth.dst</code> to the <code>MC_FLOOD</code>
471         multicast group, which <code>ovn-northd</code> populates with all
472         enabled logical ports.
473       </li>
474
475       <li>
476         One priority-50 flow that matches each known Ethernet address against
477         <code>eth.dst</code> and outputs the packet to the single associated
478         output port.
479       </li>
480
481       <li>
482         One priority-0 fallback flow that matches all packets and outputs them
483         to the <code>MC_UNKNOWN</code> multicast group, which
484         <code>ovn-northd</code> populates with all enabled logical ports that
485         accept unknown destination packets.  As a small optimization, if no
486         logical ports accept unknown destination packets,
487         <code>ovn-northd</code> omits this multicast group and logical flow.
488       </li>
489     </ul>
490
491     <h3>Egress Table 0: Pre-LB</h3>
492
493     <p>
494       This table is similar to ingress table <code>Pre-LB</code>.  It
495       contains a priority-0 flow that simply moves traffic to the next table.
496       If any load balancing rules exist for the datapath, a priority-100 flow
497       is added with a match of <code>ip</code> and action of <code>reg0[0] = 1;
498        next;</code> to act as a hint for table <code>Pre-stateful</code> to
499       send IP packets to the connection tracker for packet de-fragmentation.
500     </p>
501
502     <h3>Egress Table 1: <code>to-lport</code> Pre-ACLs</h3>
503
504     <p>
505       This is similar to ingress table <code>Pre-ACLs</code> except for
506      <code>to-lport</code> traffic.
507     </p>
508
509     <h3>Egress Table 2: Pre-stateful</h3>
510
511     <p>
512       This is similar to ingress table <code>Pre-stateful</code>.
513     </p>
514
515     <h3>Egress Table 3: LB</h3>
516     <p>
517       This is similar to ingress table <code>LB</code>.
518     </p>
519
520     <h3>Egress Table 4: <code>to-lport</code> ACLs</h3>
521
522     <p>
523       This is similar to ingress table <code>ACLs</code> except for
524       <code>to-lport</code> ACLs.
525     </p>
526
527     <h3>Egress Table 5: Stateful</h3>
528
529     <p>
530       This is similar to ingress table <code>Stateful</code> except that
531       there are no rules added for load balancing new connections.
532     </p>
533
534     <h3>Egress Table 6: Egress Port Security - IP</h3>
535
536     <p>
537       This is similar to the port security logic in table
538       <code>Ingress Port Security - IP</code> except that <code>outport</code>,
539       <code>eth.dst</code>, <code>ip4.dst</code> and <code>ip6.dst</code>
540       are checked instead of <code>inport</code>, <code>eth.src</code>,
541       <code>ip4.src</code> and <code>ip6.src</code>
542     </p>
543
544     <h3>Egress Table 7: Egress Port Security - L2</h3>
545
546     <p>
547       This is similar to the ingress port security logic in ingress table
548       <code>Admission Control and Ingress Port Security - L2</code>,
549       but with important differences.  Most obviously, <code>outport</code> and
550       <code>eth.dst</code> are checked instead of <code>inport</code> and
551       <code>eth.src</code>.  Second, packets directed to broadcast or multicast
552       <code>eth.dst</code> are always accepted instead of being subject to the
553       port security rules; this is implemented through a priority-100 flow that
554       matches on <code>eth.mcast</code> with action <code>output;</code>.
555       Finally, to ensure that even broadcast and multicast packets are not
556       delivered to disabled logical ports, a priority-150 flow for each
557       disabled logical <code>outport</code> overrides the priority-100 flow
558       with a <code>drop;</code> action.
559     </p>
560
561     <h2>Logical Router Datapaths</h2>
562
563     <p>
564       Logical router datapaths will only exist for <ref table="Logical_Router"
565       db="OVN_Northbound"/> rows in the <ref db="OVN_Northbound"/> database
566       that do not have <ref column="enabled" table="Logical_Router"
567       db="OVN_Northbound"/> set to <code>false</code>
568     </p>
569
570     <h3>Ingress Table 0: L2 Admission Control</h3>
571
572     <p>
573       This table drops packets that the router shouldn't see at all based on
574       their Ethernet headers.  It contains the following flows:
575     </p>
576
577     <ul>
578       <li>
579         Priority-100 flows to drop packets with VLAN tags or multicast Ethernet
580         source addresses.
581       </li>
582
583       <li>
584         For each enabled router port <var>P</var> with Ethernet address
585         <var>E</var>, a priority-50 flow that matches <code>inport ==
586         <var>P</var> &amp;&amp; (eth.mcast || eth.dst ==
587         <var>E</var></code>), with action <code>next;</code>.
588       </li>
589     </ul>
590
591     <p>
592       Other packets are implicitly dropped.
593     </p>
594
595     <h3>Ingress Table 1: IP Input</h3>
596
597     <p>
598       This table is the core of the logical router datapath functionality.  It
599       contains the following flows to implement very basic IP host
600       functionality.
601     </p>
602
603     <ul>
604       <li>
605         <p>
606           L3 admission control: A priority-100 flow drops packets that match
607           any of the following:
608         </p>
609
610         <ul>
611           <li>
612             <code>ip4.src[28..31] == 0xe</code> (multicast source)
613           </li>
614           <li>
615             <code>ip4.src == 255.255.255.255</code> (broadcast source)
616           </li>
617           <li>
618             <code>ip4.src == 127.0.0.0/8 || ip4.dst == 127.0.0.0/8</code>
619             (localhost source or destination)
620           </li>
621           <li>
622             <code>ip4.src == 0.0.0.0/8 || ip4.dst == 0.0.0.0/8</code> (zero
623             network source or destination)
624           </li>
625           <li>
626             <code>ip4.src</code> is any IP address owned by the router.
627           </li>
628           <li>
629             <code>ip4.src</code> is the broadcast address of any IP network
630             known to the router.
631           </li>
632         </ul>
633       </li>
634
635       <li>
636         <p>
637           ICMP echo reply.  These flows reply to ICMP echo requests received
638           for the router's IP address.  Let <var>A</var> be an IP address
639           owned by a router port.  Then, for each <var>A</var>, a priority-90
640           flow matches on <code>ip4.dst == <var>A</var></code> and <code>
641           icmp4.type == 8 &amp;&amp; icmp4.code == 0</code> (ICMP echo
642           request).  The port of the router that receives the echo request
643           does not matter. Also, the ip.ttl of the echo request packet is not
644           checked, so it complies with RFC 1812, section 4.2.2.9. These flows
645           use the following actions:
646         </p>
647
648         <pre>
649 ip4.dst &lt;-&gt; ip4.src;
650 ip.ttl = 255;
651 icmp4.type = 0;
652 inport = ""; /* Allow sending out inport. */
653 next;
654         </pre>
655       </li>
656
657       <li>
658         <p>
659           Reply to ARP requests.
660         </p>
661
662         <p>
663           These flows reply to ARP requests for the router's own IP address.
664           For each router port <var>P</var> that owns IP address <var>A</var>
665           and Ethernet address <var>E</var>, a priority-90 flow matches
666           <code>inport == <var>P</var> &amp;&amp; arp.op == 1 &amp;&amp;
667           arp.tpa == <var>A</var></code> (ARP request) with the following
668           actions:
669         </p>
670
671         <pre>
672 eth.dst = eth.src;
673 eth.src = <var>E</var>;
674 arp.op = 2; /* ARP reply. */
675 arp.tha = arp.sha;
676 arp.sha = <var>E</var>;
677 arp.tpa = arp.spa;
678 arp.spa = <var>A</var>;
679 outport = <var>P</var>;
680 inport = ""; /* Allow sending out inport. */
681 output;
682         </pre>
683       </li>
684
685       <li>
686         <p>
687           These flows reply to ARP requests for the virtual IP addresses
688           configured in the router for DNAT. For a configured DNAT IP address
689           <var>A</var>, for each router port <var>P</var> with Ethernet
690           address <var>E</var>, a priority-90 flow matches
691           <code>inport == <var>P</var> &amp;&amp; arp.op == 1 &amp;&amp;
692           arp.tpa == <var>A</var></code> (ARP request)
693           with the following actions:
694         </p>
695
696         <pre>
697 eth.dst = eth.src;
698 eth.src = <var>E</var>;
699 arp.op = 2; /* ARP reply. */
700 arp.tha = arp.sha;
701 arp.sha = <var>E</var>;
702 arp.tpa = arp.spa;
703 arp.spa = <var>A</var>;
704 outport = <var>P</var>;
705 inport = ""; /* Allow sending out inport. */
706 output;
707         </pre>
708       </li>
709
710       <li>
711         ARP reply handling.  These flows use ARP replies to populate the
712         logical router's ARP table.  A priority-90 flow with match <code>arp.op
713         == 2</code> has actions <code>put_arp(inport, arp.spa,
714         arp.sha);</code>.
715       </li>
716
717       <li>
718         <p>
719           UDP port unreachable.  Priority-80 flows generate ICMP port
720           unreachable messages in reply to UDP datagrams directed to the
721           router's IP address.  The logical router doesn't accept any UDP
722           traffic so it always generates such a reply.
723         </p>
724
725         <p>
726           These flows should not match IP fragments with nonzero offset.
727         </p>
728
729         <p>
730           Details TBD.  Not yet implemented.
731         </p>
732       </li>
733
734       <li>
735         <p>
736           TCP reset.  Priority-80 flows generate TCP reset messages in reply to
737           TCP datagrams directed to the router's IP address.  The logical
738           router doesn't accept any TCP traffic so it always generates such a
739           reply.
740         </p>
741
742         <p>
743           These flows should not match IP fragments with nonzero offset.
744         </p>
745
746         <p>
747           Details TBD.  Not yet implemented.
748         </p>
749       </li>
750
751       <li>
752         <p>
753           Protocol unreachable.  Priority-70 flows generate ICMP protocol
754           unreachable messages in reply to packets directed to the router's IP
755           address on IP protocols other than UDP, TCP, and ICMP.
756         </p>
757
758         <p>
759           These flows should not match IP fragments with nonzero offset.
760         </p>
761
762         <p>
763           Details TBD.  Not yet implemented.
764         </p>
765       </li>
766
767       <li>
768         Drop other IP traffic to this router.  These flows drop any other
769         traffic destined to an IP address of this router that is not already
770         handled by one of the flows above, which amounts to ICMP (other than
771         echo requests) and fragments with nonzero offsets.  For each IP address
772         <var>A</var> owned by the router, a priority-60 flow matches
773         <code>ip4.dst == <var>A</var></code> and drops the traffic.  An
774         exception is made and the above flow is not added if the router
775         port's own IP address is used to SNAT packets passing through that
776         router.
777       </li>
778     </ul>
779
780     <p>
781       The flows above handle all of the traffic that might be directed to the
782       router itself.  The following flows (with lower priorities) handle the
783       remaining traffic, potentially for forwarding:
784     </p>
785
786     <ul>
787       <li>
788         Drop Ethernet local broadcast.  A priority-50 flow with match
789         <code>eth.bcast</code> drops traffic destined to the local Ethernet
790         broadcast address.  By definition this traffic should not be forwarded.
791       </li>
792
793       <li>
794         <p>
795           ICMP time exceeded.  For each router port <var>P</var>, whose IP
796           address is <var>A</var>, a priority-40 flow with match <code>inport
797           == <var>P</var> &amp;&amp; ip.ttl == {0, 1} &amp;&amp;
798           !ip.later_frag</code> matches packets whose TTL has expired, with the
799           following actions to send an ICMP time exceeded reply:
800         </p>
801
802         <pre>
803 icmp4 {
804     icmp4.type = 11; /* Time exceeded. */
805     icmp4.code = 0;  /* TTL exceeded in transit. */
806     ip4.dst = ip4.src;
807     ip4.src = <var>A</var>;
808     ip.ttl = 255;
809     next;
810 };
811         </pre>
812
813         <p>
814           Not yet implemented.
815         </p>
816       </li>
817
818       <li>
819         TTL discard.  A priority-30 flow with match <code>ip.ttl == {0,
820         1}</code> and actions <code>drop;</code> drops other packets whose TTL
821         has expired, that should not receive a ICMP error reply (i.e. fragments
822         with nonzero offset).
823       </li>
824
825       <li>
826         Next table.  A priority-0 flows match all packets that aren't already
827         handled and uses actions <code>next;</code> to feed them to the ingress
828         table for routing.
829       </li>
830     </ul>
831
832     <h3>Ingress Table 2: UNSNAT</h3>
833
834     <p>
835       This is for already established connections' reverse traffic.
836       i.e., SNAT has already been done in egress pipeline and now the
837       packet has entered the ingress pipeline as part of a reply.  It is
838       unSNATted here.
839     </p>
840
841     <ul>
842       <li>
843         <p>
844           For each configuration in the OVN Northbound database, that asks
845           to change the source IP address of a packet from <var>A</var> to
846           <var>B</var>, a priority-100 flow matches <code>ip &amp;&amp;
847           ip4.dst == <var>B</var></code> with an action
848           <code>ct_snat; next;</code>.
849         </p>
850
851         <p>
852           A priority-0 logical flow with match <code>1</code> has actions
853           <code>next;</code>.
854         </p>
855       </li>
856     </ul>
857
858     <h3>Ingress Table 3: DNAT</h3>
859
860     <p>
861       Packets enter the pipeline with destination IP address that needs to
862       be DNATted from a virtual IP address to a real IP address.  Packets
863       in the reverse direction needs to be unDNATed.
864     </p>
865     <ul>
866       <li>
867         <p>
868           For each configuration in the OVN Northbound database, that asks
869           to change the destination IP address of a packet from <var>A</var> to
870           <var>B</var>, a priority-100 flow matches <code>ip &amp;&amp;
871           ip4.dst == <var>A</var></code> with an action <code>inport = "";
872           ct_dnat(<var>B</var>);</code>.
873         </p>
874
875         <p>
876           For all IP packets of a Gateway router, a priority-50 flow with an
877           action <code>inport = ""; ct_dnat;</code>.
878         </p>
879
880         <p>
881           A priority-0 logical flow with match <code>1</code> has actions
882           <code>next;</code>.
883         </p>
884       </li>
885     </ul>
886
887     <h3>Ingress Table 4: IP Routing</h3>
888
889     <p>
890       A packet that arrives at this table is an IP packet that should be routed
891       to the address in <code>ip4.dst</code>.  This table implements IP
892       routing, setting <code>reg0</code> to the next-hop IP address (leaving
893       <code>ip4.dst</code>, the packet's final destination, unchanged) and
894       advances to the next table for ARP resolution.  It also sets
895       <code>reg1</code> to the IP address owned by the selected router port
896       (which is used later in table 6 as the IP source address for an ARP
897       request, if needed).
898     </p>
899
900     <p>
901       This table contains the following logical flows:
902     </p>
903
904     <ul>
905       <li>
906         <p>
907           Routing table.  For each route to IPv4 network <var>N</var> with
908           netmask <var>M</var>, on router port <var>P</var> with IP address
909           <var>A</var> and Ethernet
910           address <var>E</var>, a logical flow with match <code>ip4.dst ==
911           <var>N</var>/<var>M</var></code>, whose priority is the number of
912           1-bits in <var>M</var>, has the following actions:
913         </p>
914
915         <pre>
916 ip.ttl--;
917 reg0 = <var>G</var>;
918 reg1 = <var>A</var>;
919 eth.src = <var>E</var>;
920 outport = <var>P</var>;
921 inport = ""; /* Allow sending out inport. */
922 next;
923         </pre>
924
925         <p>
926           (Ingress table 1 already verified that <code>ip.ttl--;</code> will
927           not yield a TTL exceeded error.)
928         </p>
929
930         <p>
931           If the route has a gateway, <var>G</var> is the gateway IP address.
932           Instead, if the route is from a configured static route, <var>G</var>
933           is the next hop IP address.  Else it is <code>ip4.dst</code>.
934         </p>
935       </li>
936
937       <li>
938         <p>
939           Destination unreachable.  For each router port <var>P</var>, which
940           owns IP address <var>A</var>, a priority-0 logical flow with match
941           <code>in_port == <var>P</var> &amp;&amp; !ip.later_frag &amp;&amp;
942           !icmp</code> has the following actions:
943         </p>
944
945         <pre>
946 icmp4 {
947     icmp4.type = 3; /* Destination unreachable. */
948     icmp4.code = 0; /* Network unreachable. */
949     ip4.dst = ip4.src;
950     ip4.src = <var>A</var>;
951     ip.ttl = 255;
952     next(2);
953 };
954         </pre>
955
956         <p>
957           (The <code>!icmp</code> check prevents recursion if the destination
958           unreachable message itself cannot be routed.)
959         </p>
960
961         <p>
962           These flows are omitted if the logical router has a default route,
963           that is, a route with netmask 0.0.0.0.
964         </p>
965       </li>
966     </ul>
967
968     <h3>Ingress Table 5: ARP Resolution</h3>
969
970     <p>
971       Any packet that reaches this table is an IP packet whose next-hop IP
972       address is in <code>reg0</code>.  (<code>ip4.dst</code> is the final
973       destination.)  This table resolves the IP address in <code>reg0</code>
974       into an output port in <code>outport</code> and an Ethernet address in
975       <code>eth.dst</code>, using the following flows:
976     </p>
977
978     <ul>
979       <li>
980         <p>
981           Static MAC bindings.  MAC bindings can be known statically based on
982           data in the <code>OVN_Northbound</code> database.  For router ports
983           connected to logical switches, MAC bindings can be known statically
984           from the <code>addresses</code> column in the
985           <code>Logical_Switch_Port</code> table.  For router ports
986           connected to other logical routers, MAC bindings can be known
987           statically from the <code>mac</code> and <code>networks</code>
988           column in the <code>Logical_Router_Port</code> table.
989         </p>
990
991         <p>
992           For each IP address <var>A</var> whose host is known to have Ethernet
993           address <var>E</var> on router port <var>P</var>, a priority-100 flow
994           with match <code>outport === <var>P</var> &amp;&amp; reg0 ==
995           <var>A</var></code> has actions <code>eth.dst = <var>E</var>;
996           next;</code>.
997         </p>
998
999         <p>
1000           For each logical router port with an IP address <var>A</var> and
1001           a mac address of <var>E</var> that is reachable via a different
1002           logical router port <var>P</var>, a priority-100 flow with
1003           match <code>outport === <var>P</var> &amp;&amp; reg0 ==
1004           <var>A</var></code> has actions <code>eth.dst = <var>E</var>;
1005           next;</code>.
1006         </p>
1007       </li>
1008
1009       <li>
1010         <p>
1011           Dynamic MAC bindings.  This flows resolves MAC-to-IP bindings that
1012           have become known dynamically through ARP.  (The next table will
1013           issue an ARP request for cases where the binding is not yet known.)
1014         </p>
1015
1016         <p>
1017           A priority-0 logical flow with match <code>1</code> has actions
1018           <code>get_arp(outport, reg0); next;</code>.
1019         </p>
1020       </li>
1021     </ul>
1022
1023     <h3>Ingress Table 6: ARP Request</h3>
1024
1025     <p>
1026       In the common case where the Ethernet destination has been resolved, this
1027       table outputs the packet.  Otherwise, it composes and sends an ARP
1028       request.  It holds the following flows:
1029     </p>
1030
1031     <ul>
1032       <li>
1033         <p>
1034           Unknown MAC address.  A priority-100 flow with match <code>eth.dst ==
1035           00:00:00:00:00:00</code> has the following actions:
1036         </p>
1037
1038         <pre>
1039 arp {
1040     eth.dst = ff:ff:ff:ff:ff:ff;
1041     arp.spa = reg1;
1042     arp.op = 1;  /* ARP request. */
1043     output;
1044 };
1045         </pre>
1046
1047         <p>
1048           (Ingress table 4 initialized <code>reg1</code> with the IP address
1049           owned by <code>outport</code>.)
1050         </p>
1051
1052         <p>
1053           The IP packet that triggers the ARP request is dropped.
1054         </p>
1055       </li>
1056
1057       <li>
1058         Known MAC address.  A priority-0 flow with match <code>1</code> has
1059         actions <code>output;</code>.
1060       </li>
1061     </ul>
1062
1063     <h3>Egress Table 0: SNAT</h3>
1064
1065     <p>
1066       Packets that are configured to be SNATed get their source IP address
1067       changed based on the configuration in the OVN Northbound database.
1068     </p>
1069     <ul>
1070       <li>
1071         <p>
1072           For each configuration in the OVN Northbound database, that asks
1073           to change the source IP address of a packet from an IP address of
1074           <var>A</var> or to change the source IP address of a packet that
1075           belongs to network <var>A</var> to <var>B</var>, a flow matches
1076           <code>ip &amp;&amp; ip4.src == <var>A</var></code> with an action
1077           <code>ct_snat(<var>B</var>);</code>.  The priority of the flow
1078           is calculated based on the mask of <var>A</var>, with matches
1079           having larger masks getting higher priorities.
1080         </p>
1081         <p>
1082           A priority-0 logical flow with match <code>1</code> has actions
1083           <code>next;</code>.
1084         </p>
1085       </li>
1086     </ul>
1087
1088     <h3>Egress Table 1: Delivery</h3>
1089
1090     <p>
1091       Packets that reach this table are ready for delivery.  It contains
1092       priority-100 logical flows that match packets on each enabled logical
1093       router port, with action <code>output;</code>.
1094     </p>
1095
1096 </manpage>