ovn-northd.8: Correct description of sending out inport.
[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 default is <code>db.sock</code>
25       in the local Open vSwitch's "run" directory.  This may be
26       overridden with the following commands:
27     </p>
28     <ul>
29       <li>
30         <p>
31           <code>--ovnnb-db=<var>database</var></code>
32         </p>
33         <p>
34           The database containing the OVN Northbound Database.
35         </p>
36       </li>
37       <li>
38         <p>
39           <code>--ovsnb-db=<var>database</var></code>
40         </p>
41         <p>
42           The database containing the OVN Southbound Database.
43         </p>
44       </li>
45     </ul>
46     <p>
47       The <var>database</var> argument must take one of the following forms:
48     </p>
49     <ul>
50       <li>
51         <p>
52           <code>ssl:<var>ip</var>:<var>port</var></code>
53         </p>
54         <p>
55           The specified SSL <var>port</var> on the host at the given
56           <var>ip</var>, which must be expressed as an IP address (not a DNS
57           name) in IPv4 or IPv6 address format.  If <var>ip</var> is an IPv6
58           address, then wrap <var>ip</var> with square brackets, e.g.:
59           <code>ssl:[::1]:6640</code>.  The <code>--private-key</code>,
60           <code>--certificate</code>, and <code>--ca-cert</code> options are
61           mandatory when this form is used.
62         </p>
63       </li>
64       <li>
65         <p>
66           <code>tcp:<var>ip</var>:<var>port</var></code>
67         </p>
68         <p>
69           Connect to the given TCP <var>port</var> on <var>ip</var>, where
70           <var>ip</var> can be IPv4 or IPv6 address. If <var>ip</var> is an
71           IPv6 address, then wrap <var>ip</var> with square brackets, e.g.:
72           <code>tcp:[::1]:6640</code>.
73         </p>
74       </li>
75       <li>
76         <p>
77           <code>unix:<var>file</var></code>
78         </p>
79         <p>
80           On POSIX, connect to the Unix domain server socket named
81           <var>file</var>.
82         </p>
83         <p>
84           On Windows, connect to a localhost TCP port whose value is written
85           in <var>file</var>.
86         </p>
87       </li>
88     </ul>
89
90     <h1>Runtime Management Commands</h1>
91     <p>
92       <code>ovs-appctl</code> can send commands to a running
93       <code>ovn-northd</code> process.  The currently supported commands
94       are described below.
95       <dl>
96       <dt><code>exit</code></dt>
97       <dd>
98         Causes <code>ovn-northd</code> to gracefully terminate.
99       </dd>
100       </dl>
101     </p>
102
103     <h1>Logical Flow Table Structure</h1>
104
105     <p>
106       One of the main purposes of <code>ovn-northd</code> is to populate the
107       <code>Logical_Flow</code> table in the <code>OVN_Southbound</code>
108       database.  This section describes how <code>ovn-northd</code> does this
109       for switch and router logical datapaths.
110     </p>
111
112     <h2>Logical Switch Datapaths</h2>
113
114     <h3>Ingress Table 0: Admission Control and Ingress Port Security</h3>
115
116     <p>
117       Ingress table 0 contains these logical flows:
118     </p>
119
120     <ul>
121       <li>
122         Priority 100 flows to drop packets with VLAN tags or multicast Ethernet
123         source addresses.
124       </li>
125
126       <li>
127         Priority 50 flows that implement ingress port security for each enabled
128         logical port.  For logical ports on which port security is enabled,
129         these match the <code>inport</code> and the valid <code>eth.src</code>
130         address(es) and advance only those packets to the next flow table.  For
131         logical ports on which port security is not enabled, these advance all
132         packets that match the <code>inport</code>.
133       </li>
134     </ul>
135
136     <p>
137       There are no flows for disabled logical ports because the default-drop
138       behavior of logical flow tables causes packets that ingress from them to
139       be dropped.
140     </p>
141
142     <h3>Ingress Table 1: <code>from-lport</code> Pre-ACLs</h3>
143
144     <p>
145       Ingress table 1 prepares flows for possible stateful ACL processing
146       in table 2.  It contains a priority-0 flow that simply moves
147       traffic to table 2.  If stateful ACLs are used in the logical
148       datapath, a priority-100 flow is added that sends IP packets to
149       the connection tracker before advancing to table 2.
150     </p>
151
152     <h3>Ingress table 2: <code>from-lport</code> ACLs</h3>
153
154     <p>
155       Logical flows in this table closely reproduce those in the
156       <code>ACL</code> table in the <code>OVN_Northbound</code> database
157       for the <code>from-lport</code> direction.  <code>allow</code>
158       ACLs translate into logical flows with the <code>next;</code>
159       action, <code>allow-related</code> ACLs translate into logical
160       flows with the <code>ct_next;</code> action, other ACLs translate
161       to <code>drop;</code>.  The <code>priority</code> values from the
162       <code>ACL</code> table are used directly.
163     </p>
164
165     <p>
166       Ingress table 2 also contains a priority 0 flow with action
167       <code>next;</code>, so that ACLs allow packets by default.  If the
168       logical datapath has a statetful ACL, the following flows will
169       also be added:
170     </p>
171
172     <ul>
173       <li>
174         A priority-1 flow to commit IP traffic to the connection
175         tracker.  This is needed for the default allow policy because,
176         while the initiater's direction may not have any stateful rules,
177         the server's may and then its return traffic would not be known
178         and marked as invalid.
179       </li>
180
181       <li>
182         A priority-65535 flow that allows any traffic that has been
183         committed to the connection tracker (i.e., established flows).
184       </li>
185
186       <li>
187         A priority-65535 flow that allows any traffic that is considered
188         related to a committed flow in the connection tracker (e.g., an
189         ICMP Port Unreachable from a non-listening UDP port).
190       </li>
191
192       <li>
193         A priority-65535 flow that drops all traffic marked by the
194         connection tracker as invalid.
195       </li>
196     </ul>
197
198     <h3>Ingress Table 3: Destination Lookup</h3>
199
200     <p>
201       This table implements switching behavior.  It contains these logical
202       flows:
203     </p>
204
205     <ul>
206       <li>
207         A priority-100 flow that outputs all packets with an Ethernet broadcast
208         or multicast <code>eth.dst</code> to the <code>MC_FLOOD</code>
209         multicast group, which <code>ovn-northd</code> populates with all
210         enabled logical ports.
211       </li>
212
213       <li>
214         One priority-50 flow that matches each known Ethernet address against
215         <code>eth.dst</code> and outputs the packet to the single associated
216         output port.
217       </li>
218
219       <li>
220         One priority-0 fallback flow that matches all packets and outputs them
221         to the <code>MC_UNKNOWN</code> multicast group, which
222         <code>ovn-northd</code> populates with all enabled logical ports that
223         accept unknown destination packets.  As a small optimization, if no
224         logical ports accept unknown destination packets,
225         <code>ovn-northd</code> omits this multicast group and logical flow.
226       </li>
227     </ul>
228
229     <h3>Egress Table 0: <code>to-lport</code> Pre-ACLs</h3>
230
231     <p>
232       This is similar to ingress table 1 except for <code>to-lport</code>
233       traffic.
234     </p>
235
236     <h3>Egress Table 1: <code>to-lport</code> ACLs</h3>
237
238     <p>
239       This is similar to ingress table 2 except for <code>to-lport</code> ACLs.
240     </p>
241
242     <h3>Egress Table 2: Egress Port Security</h3>
243
244     <p>
245       This is similar to the ingress port security logic in ingress table 0,
246       but with important differences.  Most obviously, <code>outport</code> and
247       <code>eth.dst</code> are checked instead of <code>inport</code> and
248       <code>eth.src</code>.  Second, packets directed to broadcast or multicast
249       <code>eth.dst</code> are always accepted instead of being subject to the
250       port security rules; this is implemented through a priority-100 flow that
251       matches on <code>eth.mcast</code> with action <code>output;</code>.
252       Finally, to ensure that even broadcast and multicast packets are not
253       delivered to disabled logical ports, a priority-150 flow for each
254       disabled logical <code>outport</code> overrides the priority-100 flow
255       with a <code>drop;</code> action.
256     </p>
257
258     <h2>Logical Router Datapaths</h2>
259
260     <h3>Ingress Table 0: L2 Admission Control</h3>
261
262     <p>
263       This table drops packets that the router shouldn't see at all based on
264       their Ethernet headers.  It contains the following flows:
265     </p>
266
267     <ul>
268       <li>
269         Priority-100 flows to drop packets with VLAN tags or multicast Ethernet
270         source addresses.
271       </li>
272
273       <li>
274         For each enabled router port <var>P</var> with Ethernet address
275         <var>E</var>, a priority-50 flow that matches <code>inport ==
276         <var>P</var> &amp;&amp; (eth.mcast || eth.dst ==
277         <var>E</var></code>), with action <code>next;</code>.
278       </li>
279     </ul>
280
281     <p>
282       Other packets are implicitly dropped.
283     </p>
284
285     <h3>Ingress Table 1: IP Input</h3>
286
287     <p>
288       This table is the core of the logical router datapath functionality.  It
289       contains the following flows to implement very basic IP host
290       functionality.
291     </p>
292
293     <ul>
294       <li>
295         <p>
296           L3 admission control: A priority-100 flow drops packets that match
297           any of the following:
298         </p>
299
300         <ul>
301           <li>
302             <code>ip4.src[28..31] == 0xe</code> (multicast source)
303           </li>
304           <li>
305             <code>ip4.src == 255.255.255.255</code> (broadcast source)
306           </li>
307           <li>
308             <code>ip4.src == 127.0.0.0/8 || ip4.dst == 127.0.0.0/8</code>
309             (localhost source or destination)
310           </li>
311           <li>
312             <code>ip4.src == 0.0.0.0/8 || ip4.dst == 0.0.0.0/8</code> (zero
313             network source or destination)
314           </li>
315           <li>
316             <code>ip4.src</code> is any IP address owned by the router.
317           </li>
318           <li>
319             <code>ip4.src</code> is the broadcast address of any IP network
320             known to the router.
321           </li>
322         </ul>
323       </li>
324
325       <li>
326         <p>
327           ICMP echo reply.  These flows reply to ICMP echo requests received
328           for the router's IP address.  Let <var>A</var> be an IP address or
329           broadcast address owned by a router port.  Then, for each
330           <var>A</var>, a priority-90 flow matches on <code>ip4.dst ==
331           <var>A</var></code> and <code>icmp4.type == 8 &amp;&amp; icmp4.code
332           == 0</code> (ICMP echo request).  These flows use the following
333           actions where, if <var>A</var> is unicast, then <var>S</var> is
334           <var>A</var>, and if <var>A</var> is broadcast, <var>S</var> is the
335           router's IP address in <var>A</var>'s network:
336         </p>
337
338         <pre>
339 ip4.dst = ip4.src;
340 ip4.src = <var>S</var>;
341 ip4.ttl = 255;
342 icmp4.type = 0;
343 next;
344         </pre>
345
346         <p>
347           Similar flows match on <code>ip4.dst == 255.255.255.255</code> and
348           each individual <code>inport</code>, and use the same actions in
349           which <var>S</var> is a function of <code>inport</code>.
350         </p>
351
352         <p>
353           Not yet implemented.
354         </p>
355       </li>
356
357       <li>
358         <p>
359           ARP reply.  These flows reply to ARP requests for the router's own IP
360           address.  For each router port <var>P</var> that owns IP address
361           <var>A</var> and Ethernet address <var>E</var>, a priority-90 flow
362           matches <code>inport == <var>P</var> &amp;&amp; arp.tpa ==
363           <var>A</var> &amp;&amp; arp.op == 1</code> (ARP request) with the
364           following actions:
365         </p>
366
367         <pre>
368 eth.dst = eth.src;
369 eth.src = <var>E</var>;
370 arp.op = 2; /* ARP reply. */
371 arp.tha = arp.sha;
372 arp.sha = <var>E</var>;
373 arp.tpa = arp.spa;
374 arp.spa = <var>A</var>;
375 outport = <var>P</var>;
376 inport = \"\"; /* Allow sending out inport. */
377 output;
378         </pre>
379       </li>
380
381       <li>
382         <p>
383           UDP port unreachable.  Priority-80 flows generate ICMP port
384           unreachable messages in reply to UDP datagrams directed to the
385           router's IP address.  The logical router doesn't accept any UDP
386           traffic so it always generates such a reply.
387         </p>
388
389         <p>
390           These flows should not match IP fragments with nonzero offset.
391         </p>
392
393         <p>
394           Details TBD.  Not yet implemented.
395         </p>
396       </li>
397
398       <li>
399         <p>
400           TCP reset.  Priority-80 flows generate TCP reset messages in reply to
401           TCP datagrams directed to the router's IP address.  The logical
402           router doesn't accept any TCP traffic so it always generates such a
403           reply.
404         </p>
405
406         <p>
407           These flows should not match IP fragments with nonzero offset.
408         </p>
409
410         <p>
411           Details TBD.  Not yet implemented.
412         </p>
413       </li>
414
415       <li>
416         <p>
417           Protocol unreachable.  Priority-70 flows generate ICMP protocol
418           unreachable messages in reply to packets directed to the router's IP
419           address on IP protocols other than UDP, TCP, and ICMP.
420         </p>
421
422         <p>
423           These flows should not match IP fragments with nonzero offset.
424         </p>
425
426         <p>
427           Details TBD.  Not yet implemented.
428         </p>
429       </li>
430
431       <li>
432         Drop other IP traffic to this router.  These flows drop any other
433         traffic destined to an IP address of this router that is not already
434         handled by one of the flows above, which amounts to ICMP (other than
435         echo requests) and fragments with nonzero offsets.  For each IP address
436         <var>A</var> owned by the router, a priority-60 flow matches
437         <code>ip4.dst == <var>A</var></code> and drops the traffic.
438       </li>
439     </ul>
440
441     <p>
442       The flows above handle all of the traffic that might be directed to the
443       router itself.  The following flows (with lower priorities) handle the
444       remaining traffic, potentially for forwarding:
445     </p>
446
447     <ul>
448       <li>
449         Drop Ethernet local broadcast.  A priority-50 flow with match
450         <code>eth.bcast</code> drops traffic destined to the local Ethernet
451         broadcast address.  By definition this traffic should not be forwarded.
452       </li>
453
454       <li>
455         Drop IP multicast.  A priority-50 flow with match
456         <code>ip4.mcast</code> drops IP multicast traffic.
457       </li>
458
459       <li>
460         <p>
461           ICMP time exceeded.  For each router port <var>P</var>, whose IP
462           address is <var>A</var>, a priority-40 flow with match <code>inport
463           == <var>P</var> &amp;&amp; ip4.ttl == {0, 1} &amp;&amp;
464           !ip.later_frag</code> matches packets whose TTL has expired, with the
465           following actions to send an ICMP time exceeded reply:
466         </p>
467
468         <pre>
469 icmp4 {
470     icmp4.type = 11; /* Time exceeded. */
471     icmp4.code = 0;  /* TTL exceeded in transit. */
472     ip4.dst = ip4.src;
473     ip4.src = <var>A</var>;
474     ip4.ttl = 255;
475     next;
476 };
477         </pre>
478
479         <p>
480           Not yet implemented.
481         </p>
482       </li>
483
484       <li>
485         TTL discard.  A priority-30 flow with match <code>ip4.ttl == {0,
486         1}</code> and actions <code>drop;</code> drops other packets whose TTL
487         has expired, that should not receive a ICMP error reply (i.e. fragments
488         with nonzero offset).
489       </li>
490
491       <li>
492         Next table.  A priority-0 flows match all packets that aren't already
493         handled and uses actions <code>next;</code> to feed them to the ingress
494         table for routing.
495       </li>
496     </ul>
497
498     <h3>Ingress Table 2: IP Routing</h3>
499
500     <p>
501       A packet that arrives at this table is an IP packet that should be routed
502       to the address in <code>ip4.dst</code>.  This table implements IP
503       routing, setting <code>reg0</code> to the next-hop IP address (leaving
504       <code>ip4.dst</code>, the packet's final destination, unchanged) and
505       advances to the next table for ARP resolution.
506     </p>
507
508     <p>
509       This table contains the following logical flows:
510     </p>
511
512     <ul>
513       <li>
514         <p>
515           Routing table.  For each route to IPv4 network <var>N</var> with
516           netmask <var>M</var>, a logical flow with match <code>ip4.dst ==
517           <var>N</var>/<var>M</var></code>, whose priority is the number of
518           1-bits in <var>M</var>, has the following actions:
519         </p>
520
521         <pre>
522 ip4.ttl--;
523 reg0 = <var>G</var>;
524 next;
525         </pre>
526
527         <p>
528           (Ingress table 1 already verified that <code>ip4.ttl--;</code> will
529           not yield a TTL exceeded error.)
530         </p>
531
532         <p>
533           If the route has a gateway, <var>G</var> is the gateway IP address,
534           otherwise it is <code>ip4.dst</code>.
535         </p>
536       </li>
537
538       <li>
539         <p>
540           Destination unreachable.  For each router port <var>P</var>, which
541           owns IP address <var>A</var>, a priority-0 logical flow with match
542           <code>in_port == <var>P</var> &amp;&amp; !ip.later_frag &amp;&amp;
543           !icmp</code> has the following actions:
544         </p>
545
546         <pre>
547 icmp4 {
548     icmp4.type = 3; /* Destination unreachable. */
549     icmp4.code = 0; /* Network unreachable. */
550     ip4.dst = ip4.src;
551     ip4.src = <var>A</var>;
552     ip4.ttl = 255;
553     next(2);
554 };
555         </pre>
556
557         <p>
558           (The <code>!icmp</code> check prevents recursion if the destination
559           unreachable message itself cannot be routed.)
560         </p>
561
562         <p>
563           These flows are omitted if the logical router has a default route,
564           that is, a route with netmask 0.0.0.0.
565         </p>
566       </li>
567     </ul>
568
569     <h3>Ingress Table 3: ARP Resolution</h3>
570
571     <p>
572       Any packet that reaches this table is an IP packet whose next-hop IP
573       address is in <code>reg0</code>.  (<code>ip4.dst</code> is the final
574       destination.)  This table resolves the IP address in <code>reg0</code>
575       into an output port in <code>outport</code> and an Ethernet address in
576       <code>eth.dst</code>, using the following flows:
577     </p>
578
579     <ul>
580       <li>
581         <p>
582           Known MAC bindings.  For each IP address <var>A</var> whose host is
583           known to have Ethernet address <var>HE</var> and reside on router
584           port <var>P</var> with Ethernet address <var>PE</var>, a priority-200
585           flow with match <code>reg0 == <var>A</var></code> has the following
586           actions:
587         </p>
588
589         <pre>
590 eth.src = <var>PE</var>;
591 eth.dst = <var>HE</var>;
592 outport = <var>P</var>;
593 output;
594         </pre>
595
596         <p>
597           MAC bindings can be known statically based on data in the
598           <code>OVN_Northbound</code> database.  For router ports connected to
599           logical switches, MAC bindings can be known statically from the
600           <code>addresses</code> column in the <code>Logical_Port</code> table.
601           For router ports connected to other logical routers, MAC bindings can
602           be known statically from the <code>mac</code> and
603           <code>network</code> column in the <code>Logical_Router_Port</code>
604           table.
605         </p>
606       </li>
607
608       <li>
609         <p>
610           Unknown MAC bindings.  For each non-gateway route to IPv4 network
611           <var>N</var> with netmask <var>M</var> on router port <var>P</var>
612           that owns IP address <var>A</var> and Ethernet address <var>E</var>,
613           a logical flow with match <code>ip4.dst ==
614           <var>N</var>/<var>M</var></code>, whose priority is the number of
615           1-bits in <var>M</var>, has the following actions:
616         </p>
617
618         <pre>
619 arp {
620     eth.dst = ff:ff:ff:ff:ff:ff;
621     eth.src = <var>E</var>;
622     arp.sha = <var>E</var>;
623     arp.tha = 00:00:00:00:00:00;
624     arp.spa = <var>A</var>;
625     arp.tpa = ip4.dst;
626     arp.op = 1;  /* ARP request. */
627     outport = <var>P</var>;
628     output;
629 };
630         </pre>
631
632         <p>
633           TBD: How to install MAC bindings when an ARP response comes back.
634           (Implement a "learn" action?)
635         </p>
636
637         <p>
638           Not yet implemented.
639         </p>
640       </li>
641     </ul>
642
643     <h3>Egress Table 0: Delivery</h3>
644
645     <p>
646       Packets that reach this table are ready for delivery.  It contains
647       priority-100 logical flows that match packets on each enabled logical
648       router port, with action <code>output;</code>.
649     </p>
650
651 </manpage>