ovn-northd: Can't use ct() for router ports.
[cascardo/ovs.git] / ovn / northd / ovn-northd.c
1 /*
2  * Licensed under the Apache License, Version 2.0 (the "License");
3  * you may not use this file except in compliance with the License.
4  * You may obtain a copy of the License at:
5  *
6  *     http://www.apache.org/licenses/LICENSE-2.0
7  *
8  * Unless required by applicable law or agreed to in writing, software
9  * distributed under the License is distributed on an "AS IS" BASIS,
10  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11  * See the License for the specific language governing permissions and
12  * limitations under the License.
13  */
14
15 #include <config.h>
16
17 #include <getopt.h>
18 #include <stdlib.h>
19 #include <stdio.h>
20
21 #include "command-line.h"
22 #include "daemon.h"
23 #include "dirs.h"
24 #include "dynamic-string.h"
25 #include "fatal-signal.h"
26 #include "hash.h"
27 #include "hmap.h"
28 #include "json.h"
29 #include "ovn/lib/lex.h"
30 #include "ovn/lib/ovn-nb-idl.h"
31 #include "ovn/lib/ovn-sb-idl.h"
32 #include "poll-loop.h"
33 #include "smap.h"
34 #include "stream.h"
35 #include "stream-ssl.h"
36 #include "unixctl.h"
37 #include "util.h"
38 #include "uuid.h"
39 #include "openvswitch/vlog.h"
40
41 VLOG_DEFINE_THIS_MODULE(ovn_northd);
42
43 static unixctl_cb_func ovn_northd_exit;
44
45 struct northd_context {
46     struct ovsdb_idl *ovnnb_idl;
47     struct ovsdb_idl *ovnsb_idl;
48     struct ovsdb_idl_txn *ovnnb_txn;
49     struct ovsdb_idl_txn *ovnsb_txn;
50 };
51
52 static const char *ovnnb_db;
53 static const char *ovnsb_db;
54
55 static const char *default_db(void);
56 \f
57 /* Pipeline stages. */
58
59 /* The two pipelines in an OVN logical flow table. */
60 enum ovn_pipeline {
61     P_IN,                       /* Ingress pipeline. */
62     P_OUT                       /* Egress pipeline. */
63 };
64
65 /* The two purposes for which ovn-northd uses OVN logical datapaths. */
66 enum ovn_datapath_type {
67     DP_SWITCH,                  /* OVN logical switch. */
68     DP_ROUTER                   /* OVN logical router. */
69 };
70
71 /* Returns an "enum ovn_stage" built from the arguments.
72  *
73  * (It's better to use ovn_stage_build() for type-safety reasons, but inline
74  * functions can't be used in enums or switch cases.) */
75 #define OVN_STAGE_BUILD(DP_TYPE, PIPELINE, TABLE) \
76     (((DP_TYPE) << 9) | ((PIPELINE) << 8) | (TABLE))
77
78 /* A stage within an OVN logical switch or router.
79  *
80  * An "enum ovn_stage" indicates whether the stage is part of a logical switch
81  * or router, whether the stage is part of the ingress or egress pipeline, and
82  * the table within that pipeline.  The first three components are combined to
83  * form the stage's full name, e.g. S_SWITCH_IN_PORT_SEC,
84  * S_ROUTER_OUT_DELIVERY. */
85 enum ovn_stage {
86 #define PIPELINE_STAGES                                               \
87     /* Logical switch ingress stages. */                              \
88     PIPELINE_STAGE(SWITCH, IN,  PORT_SEC,    0, "ls_in_port_sec")     \
89     PIPELINE_STAGE(SWITCH, IN,  PRE_ACL,     1, "ls_in_pre_acl")      \
90     PIPELINE_STAGE(SWITCH, IN,  ACL,         2, "ls_in_acl")          \
91     PIPELINE_STAGE(SWITCH, IN,  L2_LKUP,     3, "ls_in_l2_lkup")      \
92                                                                       \
93     /* Logical switch egress stages. */                               \
94     PIPELINE_STAGE(SWITCH, OUT, PRE_ACL,     0, "ls_out_pre_acl")     \
95     PIPELINE_STAGE(SWITCH, OUT, ACL,         1, "ls_out_acl")         \
96     PIPELINE_STAGE(SWITCH, OUT, PORT_SEC,    2, "ls_out_port_sec")    \
97                                                                       \
98     /* Logical router ingress stages. */                              \
99     PIPELINE_STAGE(ROUTER, IN,  ADMISSION,   0, "lr_in_admission")    \
100     PIPELINE_STAGE(ROUTER, IN,  IP_INPUT,    1, "lr_in_ip_input")     \
101     PIPELINE_STAGE(ROUTER, IN,  IP_ROUTING,  2, "lr_in_ip_routing")   \
102     PIPELINE_STAGE(ROUTER, IN,  ARP,         3, "lr_in_arp")          \
103                                                                       \
104     /* Logical router egress stages. */                               \
105     PIPELINE_STAGE(ROUTER, OUT, DELIVERY,    0, "lr_out_delivery")
106
107 #define PIPELINE_STAGE(DP_TYPE, PIPELINE, STAGE, TABLE, NAME)   \
108     S_##DP_TYPE##_##PIPELINE##_##STAGE                          \
109         = OVN_STAGE_BUILD(DP_##DP_TYPE, P_##PIPELINE, TABLE),
110     PIPELINE_STAGES
111 #undef PIPELINE_STAGE
112 };
113
114 /* Due to various hard-coded priorities need to implement ACLs, the
115  * northbound database supports a smaller range of ACL priorities than
116  * are available to logical flows.  This value is added to an ACL
117  * priority to determine the ACL's logical flow priority. */
118 #define OVN_ACL_PRI_OFFSET 1000
119
120 /* Returns an "enum ovn_stage" built from the arguments. */
121 static enum ovn_stage
122 ovn_stage_build(enum ovn_datapath_type dp_type, enum ovn_pipeline pipeline,
123                 uint8_t table)
124 {
125     return OVN_STAGE_BUILD(dp_type, pipeline, table);
126 }
127
128 /* Returns the pipeline to which 'stage' belongs. */
129 static enum ovn_pipeline
130 ovn_stage_get_pipeline(enum ovn_stage stage)
131 {
132     return (stage >> 8) & 1;
133 }
134
135 /* Returns the table to which 'stage' belongs. */
136 static uint8_t
137 ovn_stage_get_table(enum ovn_stage stage)
138 {
139     return stage & 0xff;
140 }
141
142 /* Returns a string name for 'stage'. */
143 static const char *
144 ovn_stage_to_str(enum ovn_stage stage)
145 {
146     switch (stage) {
147 #define PIPELINE_STAGE(DP_TYPE, PIPELINE, STAGE, TABLE, NAME)       \
148         case S_##DP_TYPE##_##PIPELINE##_##STAGE: return NAME;
149     PIPELINE_STAGES
150 #undef PIPELINE_STAGE
151         default: return "<unknown>";
152     }
153 }
154 \f
155 static void
156 usage(void)
157 {
158     printf("\
159 %s: OVN northbound management daemon\n\
160 usage: %s [OPTIONS]\n\
161 \n\
162 Options:\n\
163   --ovnnb-db=DATABASE       connect to ovn-nb database at DATABASE\n\
164                             (default: %s)\n\
165   --ovnsb-db=DATABASE       connect to ovn-sb database at DATABASE\n\
166                             (default: %s)\n\
167   -h, --help                display this help message\n\
168   -o, --options             list available options\n\
169   -V, --version             display version information\n\
170 ", program_name, program_name, default_db(), default_db());
171     daemon_usage();
172     vlog_usage();
173     stream_usage("database", true, true, false);
174 }
175 \f
176 struct tnlid_node {
177     struct hmap_node hmap_node;
178     uint32_t tnlid;
179 };
180
181 static void
182 destroy_tnlids(struct hmap *tnlids)
183 {
184     struct tnlid_node *node, *next;
185     HMAP_FOR_EACH_SAFE (node, next, hmap_node, tnlids) {
186         hmap_remove(tnlids, &node->hmap_node);
187         free(node);
188     }
189     hmap_destroy(tnlids);
190 }
191
192 static void
193 add_tnlid(struct hmap *set, uint32_t tnlid)
194 {
195     struct tnlid_node *node = xmalloc(sizeof *node);
196     hmap_insert(set, &node->hmap_node, hash_int(tnlid, 0));
197     node->tnlid = tnlid;
198 }
199
200 static bool
201 tnlid_in_use(const struct hmap *set, uint32_t tnlid)
202 {
203     const struct tnlid_node *node;
204     HMAP_FOR_EACH_IN_BUCKET (node, hmap_node, hash_int(tnlid, 0), set) {
205         if (node->tnlid == tnlid) {
206             return true;
207         }
208     }
209     return false;
210 }
211
212 static uint32_t
213 allocate_tnlid(struct hmap *set, const char *name, uint32_t max,
214                uint32_t *hint)
215 {
216     for (uint32_t tnlid = *hint + 1; tnlid != *hint;
217          tnlid = tnlid + 1 <= max ? tnlid + 1 : 1) {
218         if (!tnlid_in_use(set, tnlid)) {
219             add_tnlid(set, tnlid);
220             *hint = tnlid;
221             return tnlid;
222         }
223     }
224
225     static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
226     VLOG_WARN_RL(&rl, "all %s tunnel ids exhausted", name);
227     return 0;
228 }
229 \f
230 /* The 'key' comes from nbs->header_.uuid or nbr->header_.uuid or
231  * sb->external_ids:logical-switch. */
232 struct ovn_datapath {
233     struct hmap_node key_node;  /* Index on 'key'. */
234     struct uuid key;            /* (nbs/nbr)->header_.uuid. */
235
236     const struct nbrec_logical_switch *nbs;  /* May be NULL. */
237     const struct nbrec_logical_router *nbr;  /* May be NULL. */
238     const struct sbrec_datapath_binding *sb; /* May be NULL. */
239
240     struct ovs_list list;       /* In list of similar records. */
241
242     /* Logical router data (digested from nbr). */
243     ovs_be32 gateway;
244
245     /* Logical switch data. */
246     struct ovn_port **router_ports;
247     size_t n_router_ports;
248
249     struct hmap port_tnlids;
250     uint32_t port_key_hint;
251
252     bool has_unknown;
253 };
254
255 static struct ovn_datapath *
256 ovn_datapath_create(struct hmap *datapaths, const struct uuid *key,
257                     const struct nbrec_logical_switch *nbs,
258                     const struct nbrec_logical_router *nbr,
259                     const struct sbrec_datapath_binding *sb)
260 {
261     struct ovn_datapath *od = xzalloc(sizeof *od);
262     od->key = *key;
263     od->sb = sb;
264     od->nbs = nbs;
265     od->nbr = nbr;
266     hmap_init(&od->port_tnlids);
267     od->port_key_hint = 0;
268     hmap_insert(datapaths, &od->key_node, uuid_hash(&od->key));
269     return od;
270 }
271
272 static void
273 ovn_datapath_destroy(struct hmap *datapaths, struct ovn_datapath *od)
274 {
275     if (od) {
276         /* Don't remove od->list.  It is used within build_datapaths() as a
277          * private list and once we've exited that function it is not safe to
278          * use it. */
279         hmap_remove(datapaths, &od->key_node);
280         destroy_tnlids(&od->port_tnlids);
281         free(od->router_ports);
282         free(od);
283     }
284 }
285
286 static struct ovn_datapath *
287 ovn_datapath_find(struct hmap *datapaths, const struct uuid *uuid)
288 {
289     struct ovn_datapath *od;
290
291     HMAP_FOR_EACH_WITH_HASH (od, key_node, uuid_hash(uuid), datapaths) {
292         if (uuid_equals(uuid, &od->key)) {
293             return od;
294         }
295     }
296     return NULL;
297 }
298
299 static struct ovn_datapath *
300 ovn_datapath_from_sbrec(struct hmap *datapaths,
301                         const struct sbrec_datapath_binding *sb)
302 {
303     struct uuid key;
304
305     if (!smap_get_uuid(&sb->external_ids, "logical-switch", &key) &&
306         !smap_get_uuid(&sb->external_ids, "logical-router", &key)) {
307         return NULL;
308     }
309     return ovn_datapath_find(datapaths, &key);
310 }
311
312 static void
313 join_datapaths(struct northd_context *ctx, struct hmap *datapaths,
314                struct ovs_list *sb_only, struct ovs_list *nb_only,
315                struct ovs_list *both)
316 {
317     hmap_init(datapaths);
318     list_init(sb_only);
319     list_init(nb_only);
320     list_init(both);
321
322     const struct sbrec_datapath_binding *sb, *sb_next;
323     SBREC_DATAPATH_BINDING_FOR_EACH_SAFE (sb, sb_next, ctx->ovnsb_idl) {
324         struct uuid key;
325         if (!smap_get_uuid(&sb->external_ids, "logical-switch", &key) &&
326             !smap_get_uuid(&sb->external_ids, "logical-router", &key)) {
327             ovsdb_idl_txn_add_comment(
328                 ctx->ovnsb_txn,
329                 "deleting Datapath_Binding "UUID_FMT" that lacks "
330                 "external-ids:logical-switch and "
331                 "external-ids:logical-router",
332                 UUID_ARGS(&sb->header_.uuid));
333             sbrec_datapath_binding_delete(sb);
334             continue;
335         }
336
337         if (ovn_datapath_find(datapaths, &key)) {
338             static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 1);
339             VLOG_INFO_RL(
340                 &rl, "deleting Datapath_Binding "UUID_FMT" with "
341                 "duplicate external-ids:logical-switch/router "UUID_FMT,
342                 UUID_ARGS(&sb->header_.uuid), UUID_ARGS(&key));
343             sbrec_datapath_binding_delete(sb);
344             continue;
345         }
346
347         struct ovn_datapath *od = ovn_datapath_create(datapaths, &key,
348                                                       NULL, NULL, sb);
349         list_push_back(sb_only, &od->list);
350     }
351
352     const struct nbrec_logical_switch *nbs;
353     NBREC_LOGICAL_SWITCH_FOR_EACH (nbs, ctx->ovnnb_idl) {
354         struct ovn_datapath *od = ovn_datapath_find(datapaths,
355                                                     &nbs->header_.uuid);
356         if (od) {
357             od->nbs = nbs;
358             list_remove(&od->list);
359             list_push_back(both, &od->list);
360         } else {
361             od = ovn_datapath_create(datapaths, &nbs->header_.uuid,
362                                      nbs, NULL, NULL);
363             list_push_back(nb_only, &od->list);
364         }
365     }
366
367     const struct nbrec_logical_router *nbr;
368     NBREC_LOGICAL_ROUTER_FOR_EACH (nbr, ctx->ovnnb_idl) {
369         struct ovn_datapath *od = ovn_datapath_find(datapaths,
370                                                     &nbr->header_.uuid);
371         if (od) {
372             if (!od->nbs) {
373                 od->nbr = nbr;
374                 list_remove(&od->list);
375                 list_push_back(both, &od->list);
376             } else {
377                 /* Can't happen! */
378                 static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 1);
379                 VLOG_WARN_RL(&rl,
380                              "duplicate UUID "UUID_FMT" in OVN_Northbound",
381                              UUID_ARGS(&nbr->header_.uuid));
382                 continue;
383             }
384         } else {
385             od = ovn_datapath_create(datapaths, &nbr->header_.uuid,
386                                      NULL, nbr, NULL);
387             list_push_back(nb_only, &od->list);
388         }
389
390         od->gateway = 0;
391         if (nbr->default_gw) {
392             ovs_be32 ip, mask;
393             char *error = ip_parse_masked(nbr->default_gw, &ip, &mask);
394             if (error || !ip || mask != OVS_BE32_MAX) {
395                 static struct vlog_rate_limit rl
396                     = VLOG_RATE_LIMIT_INIT(5, 1);
397                 VLOG_WARN_RL(&rl, "bad 'gateway' %s", nbr->default_gw);
398                 free(error);
399             } else {
400                 od->gateway = ip;
401             }
402         }
403     }
404 }
405
406 static uint32_t
407 ovn_datapath_allocate_key(struct hmap *dp_tnlids)
408 {
409     static uint32_t hint;
410     return allocate_tnlid(dp_tnlids, "datapath", (1u << 24) - 1, &hint);
411 }
412
413 static void
414 build_datapaths(struct northd_context *ctx, struct hmap *datapaths)
415 {
416     struct ovs_list sb_only, nb_only, both;
417
418     join_datapaths(ctx, datapaths, &sb_only, &nb_only, &both);
419
420     if (!list_is_empty(&nb_only)) {
421         /* First index the in-use datapath tunnel IDs. */
422         struct hmap dp_tnlids = HMAP_INITIALIZER(&dp_tnlids);
423         struct ovn_datapath *od;
424         LIST_FOR_EACH (od, list, &both) {
425             add_tnlid(&dp_tnlids, od->sb->tunnel_key);
426         }
427
428         /* Add southbound record for each unmatched northbound record. */
429         LIST_FOR_EACH (od, list, &nb_only) {
430             uint16_t tunnel_key = ovn_datapath_allocate_key(&dp_tnlids);
431             if (!tunnel_key) {
432                 break;
433             }
434
435             od->sb = sbrec_datapath_binding_insert(ctx->ovnsb_txn);
436
437             char uuid_s[UUID_LEN + 1];
438             sprintf(uuid_s, UUID_FMT, UUID_ARGS(&od->key));
439             const char *key = od->nbs ? "logical-switch" : "logical-router";
440             const struct smap id = SMAP_CONST1(&id, key, uuid_s);
441             sbrec_datapath_binding_set_external_ids(od->sb, &id);
442
443             sbrec_datapath_binding_set_tunnel_key(od->sb, tunnel_key);
444         }
445         destroy_tnlids(&dp_tnlids);
446     }
447
448     /* Delete southbound records without northbound matches. */
449     struct ovn_datapath *od, *next;
450     LIST_FOR_EACH_SAFE (od, next, list, &sb_only) {
451         list_remove(&od->list);
452         sbrec_datapath_binding_delete(od->sb);
453         ovn_datapath_destroy(datapaths, od);
454     }
455 }
456 \f
457 struct ovn_port {
458     struct hmap_node key_node;  /* Index on 'key'. */
459     char *key;                  /* nbs->name, nbr->name, sb->logical_port. */
460     char *json_key;             /* 'key', quoted for use in JSON. */
461
462     const struct nbrec_logical_port *nbs;        /* May be NULL. */
463     const struct nbrec_logical_router_port *nbr; /* May be NULL. */
464     const struct sbrec_port_binding *sb;         /* May be NULL. */
465
466     /* Logical router port data. */
467     ovs_be32 ip, mask;          /* 192.168.10.123/24. */
468     ovs_be32 network;           /* 192.168.10.0. */
469     ovs_be32 bcast;             /* 192.168.10.255. */
470     struct eth_addr mac;
471     struct ovn_port *peer;
472
473     struct ovn_datapath *od;
474
475     struct ovs_list list;       /* In list of similar records. */
476 };
477
478 static struct ovn_port *
479 ovn_port_create(struct hmap *ports, const char *key,
480                 const struct nbrec_logical_port *nbs,
481                 const struct nbrec_logical_router_port *nbr,
482                 const struct sbrec_port_binding *sb)
483 {
484     struct ovn_port *op = xzalloc(sizeof *op);
485
486     struct ds json_key = DS_EMPTY_INITIALIZER;
487     json_string_escape(key, &json_key);
488     op->json_key = ds_steal_cstr(&json_key);
489
490     op->key = xstrdup(key);
491     op->sb = sb;
492     op->nbs = nbs;
493     op->nbr = nbr;
494     hmap_insert(ports, &op->key_node, hash_string(op->key, 0));
495     return op;
496 }
497
498 static void
499 ovn_port_destroy(struct hmap *ports, struct ovn_port *port)
500 {
501     if (port) {
502         /* Don't remove port->list.  It is used within build_ports() as a
503          * private list and once we've exited that function it is not safe to
504          * use it. */
505         hmap_remove(ports, &port->key_node);
506         free(port->json_key);
507         free(port->key);
508         free(port);
509     }
510 }
511
512 static struct ovn_port *
513 ovn_port_find(struct hmap *ports, const char *name)
514 {
515     struct ovn_port *op;
516
517     HMAP_FOR_EACH_WITH_HASH (op, key_node, hash_string(name, 0), ports) {
518         if (!strcmp(op->key, name)) {
519             return op;
520         }
521     }
522     return NULL;
523 }
524
525 static uint32_t
526 ovn_port_allocate_key(struct ovn_datapath *od)
527 {
528     return allocate_tnlid(&od->port_tnlids, "port",
529                           (1u << 15) - 1, &od->port_key_hint);
530 }
531
532 static void
533 join_logical_ports(struct northd_context *ctx,
534                    struct hmap *datapaths, struct hmap *ports,
535                    struct ovs_list *sb_only, struct ovs_list *nb_only,
536                    struct ovs_list *both)
537 {
538     hmap_init(ports);
539     list_init(sb_only);
540     list_init(nb_only);
541     list_init(both);
542
543     const struct sbrec_port_binding *sb;
544     SBREC_PORT_BINDING_FOR_EACH (sb, ctx->ovnsb_idl) {
545         struct ovn_port *op = ovn_port_create(ports, sb->logical_port,
546                                               NULL, NULL, sb);
547         list_push_back(sb_only, &op->list);
548     }
549
550     struct ovn_datapath *od;
551     HMAP_FOR_EACH (od, key_node, datapaths) {
552         if (od->nbs) {
553             for (size_t i = 0; i < od->nbs->n_ports; i++) {
554                 const struct nbrec_logical_port *nbs = od->nbs->ports[i];
555                 struct ovn_port *op = ovn_port_find(ports, nbs->name);
556                 if (op) {
557                     if (op->nbs || op->nbr) {
558                         static struct vlog_rate_limit rl
559                             = VLOG_RATE_LIMIT_INIT(5, 1);
560                         VLOG_WARN_RL(&rl, "duplicate logical port %s",
561                                      nbs->name);
562                         continue;
563                     }
564                     op->nbs = nbs;
565                     list_remove(&op->list);
566                     list_push_back(both, &op->list);
567                 } else {
568                     op = ovn_port_create(ports, nbs->name, nbs, NULL, NULL);
569                     list_push_back(nb_only, &op->list);
570                 }
571
572                 op->od = od;
573             }
574         } else {
575             for (size_t i = 0; i < od->nbr->n_ports; i++) {
576                 const struct nbrec_logical_router_port *nbr
577                     = od->nbr->ports[i];
578
579                 struct eth_addr mac;
580                 if (!eth_addr_from_string(nbr->mac, &mac)) {
581                     static struct vlog_rate_limit rl
582                         = VLOG_RATE_LIMIT_INIT(5, 1);
583                     VLOG_WARN_RL(&rl, "bad 'mac' %s", nbr->mac);
584                     continue;
585                 }
586
587                 ovs_be32 ip, mask;
588                 char *error = ip_parse_masked(nbr->network, &ip, &mask);
589                 if (error || mask == OVS_BE32_MAX || !ip_is_cidr(mask)) {
590                     static struct vlog_rate_limit rl
591                         = VLOG_RATE_LIMIT_INIT(5, 1);
592                     VLOG_WARN_RL(&rl, "bad 'network' %s", nbr->network);
593                     free(error);
594                     continue;
595                 }
596
597                 struct ovn_port *op = ovn_port_find(ports, nbr->name);
598                 if (op) {
599                     if (op->nbs || op->nbr) {
600                         static struct vlog_rate_limit rl
601                             = VLOG_RATE_LIMIT_INIT(5, 1);
602                         VLOG_WARN_RL(&rl, "duplicate logical router port %s",
603                                      nbr->name);
604                         continue;
605                     }
606                     op->nbr = nbr;
607                     list_remove(&op->list);
608                     list_push_back(both, &op->list);
609                 } else {
610                     op = ovn_port_create(ports, nbr->name, NULL, nbr, NULL);
611                     list_push_back(nb_only, &op->list);
612                 }
613
614                 op->ip = ip;
615                 op->mask = mask;
616                 op->network = ip & mask;
617                 op->bcast = ip | ~mask;
618                 op->mac = mac;
619
620                 op->od = od;
621             }
622         }
623     }
624
625     /* Connect logical router ports, and logical switch ports of type "router",
626      * to their peers. */
627     struct ovn_port *op;
628     HMAP_FOR_EACH (op, key_node, ports) {
629         if (op->nbs && !strcmp(op->nbs->type, "router")) {
630             const char *peer_name = smap_get(&op->nbs->options, "router-port");
631             if (!peer_name) {
632                 continue;
633             }
634
635             struct ovn_port *peer = ovn_port_find(ports, peer_name);
636             if (!peer || !peer->nbr) {
637                 continue;
638             }
639
640             peer->peer = op;
641             op->peer = peer;
642             op->od->router_ports = xrealloc(
643                 op->od->router_ports,
644                 sizeof *op->od->router_ports * (op->od->n_router_ports + 1));
645             op->od->router_ports[op->od->n_router_ports++] = op;
646         } else if (op->nbr && op->nbr->peer) {
647             op->peer = ovn_port_find(ports, op->nbr->name);
648         }
649     }
650 }
651
652 static void
653 ovn_port_update_sbrec(const struct ovn_port *op)
654 {
655     sbrec_port_binding_set_datapath(op->sb, op->od->sb);
656     if (op->nbr) {
657         sbrec_port_binding_set_type(op->sb, "patch");
658
659         const char *peer = op->peer ? op->peer->key : "<error>";
660         const struct smap ids = SMAP_CONST1(&ids, "peer", peer);
661         sbrec_port_binding_set_options(op->sb, &ids);
662
663         sbrec_port_binding_set_parent_port(op->sb, NULL);
664         sbrec_port_binding_set_tag(op->sb, NULL, 0);
665         sbrec_port_binding_set_mac(op->sb, NULL, 0);
666     } else {
667         if (strcmp(op->nbs->type, "router")) {
668             sbrec_port_binding_set_type(op->sb, op->nbs->type);
669             sbrec_port_binding_set_options(op->sb, &op->nbs->options);
670         } else {
671             sbrec_port_binding_set_type(op->sb, "patch");
672
673             const char *router_port = smap_get(&op->nbs->options,
674                                                "router-port");
675             if (!router_port) {
676                 router_port = "<error>";
677             }
678             const struct smap ids = SMAP_CONST1(&ids, "peer", router_port);
679             sbrec_port_binding_set_options(op->sb, &ids);
680         }
681         sbrec_port_binding_set_parent_port(op->sb, op->nbs->parent_name);
682         sbrec_port_binding_set_tag(op->sb, op->nbs->tag, op->nbs->n_tag);
683         sbrec_port_binding_set_mac(op->sb, (const char **) op->nbs->addresses,
684                                    op->nbs->n_addresses);
685     }
686 }
687
688 static void
689 build_ports(struct northd_context *ctx, struct hmap *datapaths,
690             struct hmap *ports)
691 {
692     struct ovs_list sb_only, nb_only, both;
693
694     join_logical_ports(ctx, datapaths, ports, &sb_only, &nb_only, &both);
695
696     /* For logical ports that are in both databases, update the southbound
697      * record based on northbound data.  Also index the in-use tunnel_keys. */
698     struct ovn_port *op, *next;
699     LIST_FOR_EACH_SAFE (op, next, list, &both) {
700         ovn_port_update_sbrec(op);
701
702         add_tnlid(&op->od->port_tnlids, op->sb->tunnel_key);
703         if (op->sb->tunnel_key > op->od->port_key_hint) {
704             op->od->port_key_hint = op->sb->tunnel_key;
705         }
706     }
707
708     /* Add southbound record for each unmatched northbound record. */
709     LIST_FOR_EACH_SAFE (op, next, list, &nb_only) {
710         uint16_t tunnel_key = ovn_port_allocate_key(op->od);
711         if (!tunnel_key) {
712             continue;
713         }
714
715         op->sb = sbrec_port_binding_insert(ctx->ovnsb_txn);
716         ovn_port_update_sbrec(op);
717
718         sbrec_port_binding_set_logical_port(op->sb, op->key);
719         sbrec_port_binding_set_tunnel_key(op->sb, tunnel_key);
720     }
721
722     /* Delete southbound records without northbound matches. */
723     LIST_FOR_EACH_SAFE(op, next, list, &sb_only) {
724         list_remove(&op->list);
725         sbrec_port_binding_delete(op->sb);
726         ovn_port_destroy(ports, op);
727     }
728 }
729 \f
730 #define OVN_MIN_MULTICAST 32768
731 #define OVN_MAX_MULTICAST 65535
732
733 struct multicast_group {
734     const char *name;
735     uint16_t key;               /* OVN_MIN_MULTICAST...OVN_MAX_MULTICAST. */
736 };
737
738 #define MC_FLOOD "_MC_flood"
739 static const struct multicast_group mc_flood = { MC_FLOOD, 65535 };
740
741 #define MC_UNKNOWN "_MC_unknown"
742 static const struct multicast_group mc_unknown = { MC_UNKNOWN, 65534 };
743
744 static bool
745 multicast_group_equal(const struct multicast_group *a,
746                       const struct multicast_group *b)
747 {
748     return !strcmp(a->name, b->name) && a->key == b->key;
749 }
750
751 /* Multicast group entry. */
752 struct ovn_multicast {
753     struct hmap_node hmap_node; /* Index on 'datapath' and 'key'. */
754     struct ovn_datapath *datapath;
755     const struct multicast_group *group;
756
757     struct ovn_port **ports;
758     size_t n_ports, allocated_ports;
759 };
760
761 static uint32_t
762 ovn_multicast_hash(const struct ovn_datapath *datapath,
763                    const struct multicast_group *group)
764 {
765     return hash_pointer(datapath, group->key);
766 }
767
768 static struct ovn_multicast *
769 ovn_multicast_find(struct hmap *mcgroups, struct ovn_datapath *datapath,
770                    const struct multicast_group *group)
771 {
772     struct ovn_multicast *mc;
773
774     HMAP_FOR_EACH_WITH_HASH (mc, hmap_node,
775                              ovn_multicast_hash(datapath, group), mcgroups) {
776         if (mc->datapath == datapath
777             && multicast_group_equal(mc->group, group)) {
778             return mc;
779         }
780     }
781     return NULL;
782 }
783
784 static void
785 ovn_multicast_add(struct hmap *mcgroups, const struct multicast_group *group,
786                   struct ovn_port *port)
787 {
788     struct ovn_datapath *od = port->od;
789     struct ovn_multicast *mc = ovn_multicast_find(mcgroups, od, group);
790     if (!mc) {
791         mc = xmalloc(sizeof *mc);
792         hmap_insert(mcgroups, &mc->hmap_node, ovn_multicast_hash(od, group));
793         mc->datapath = od;
794         mc->group = group;
795         mc->n_ports = 0;
796         mc->allocated_ports = 4;
797         mc->ports = xmalloc(mc->allocated_ports * sizeof *mc->ports);
798     }
799     if (mc->n_ports >= mc->allocated_ports) {
800         mc->ports = x2nrealloc(mc->ports, &mc->allocated_ports,
801                                sizeof *mc->ports);
802     }
803     mc->ports[mc->n_ports++] = port;
804 }
805
806 static void
807 ovn_multicast_destroy(struct hmap *mcgroups, struct ovn_multicast *mc)
808 {
809     if (mc) {
810         hmap_remove(mcgroups, &mc->hmap_node);
811         free(mc->ports);
812         free(mc);
813     }
814 }
815
816 static void
817 ovn_multicast_update_sbrec(const struct ovn_multicast *mc,
818                            const struct sbrec_multicast_group *sb)
819 {
820     struct sbrec_port_binding **ports = xmalloc(mc->n_ports * sizeof *ports);
821     for (size_t i = 0; i < mc->n_ports; i++) {
822         ports[i] = CONST_CAST(struct sbrec_port_binding *, mc->ports[i]->sb);
823     }
824     sbrec_multicast_group_set_ports(sb, ports, mc->n_ports);
825     free(ports);
826 }
827 \f
828 /* Logical flow generation.
829  *
830  * This code generates the Logical_Flow table in the southbound database, as a
831  * function of most of the northbound database.
832  */
833
834 struct ovn_lflow {
835     struct hmap_node hmap_node;
836
837     struct ovn_datapath *od;
838     enum ovn_stage stage;
839     uint16_t priority;
840     char *match;
841     char *actions;
842 };
843
844 static size_t
845 ovn_lflow_hash(const struct ovn_lflow *lflow)
846 {
847     size_t hash = uuid_hash(&lflow->od->key);
848     hash = hash_2words((lflow->stage << 16) | lflow->priority, hash);
849     hash = hash_string(lflow->match, hash);
850     return hash_string(lflow->actions, hash);
851 }
852
853 static bool
854 ovn_lflow_equal(const struct ovn_lflow *a, const struct ovn_lflow *b)
855 {
856     return (a->od == b->od
857             && a->stage == b->stage
858             && a->priority == b->priority
859             && !strcmp(a->match, b->match)
860             && !strcmp(a->actions, b->actions));
861 }
862
863 static void
864 ovn_lflow_init(struct ovn_lflow *lflow, struct ovn_datapath *od,
865               enum ovn_stage stage, uint16_t priority,
866               char *match, char *actions)
867 {
868     lflow->od = od;
869     lflow->stage = stage;
870     lflow->priority = priority;
871     lflow->match = match;
872     lflow->actions = actions;
873 }
874
875 /* Adds a row with the specified contents to the Logical_Flow table. */
876 static void
877 ovn_lflow_add(struct hmap *lflow_map, struct ovn_datapath *od,
878               enum ovn_stage stage, uint16_t priority,
879               const char *match, const char *actions)
880 {
881     struct ovn_lflow *lflow = xmalloc(sizeof *lflow);
882     ovn_lflow_init(lflow, od, stage, priority,
883                    xstrdup(match), xstrdup(actions));
884     hmap_insert(lflow_map, &lflow->hmap_node, ovn_lflow_hash(lflow));
885 }
886
887 static struct ovn_lflow *
888 ovn_lflow_find(struct hmap *lflows, struct ovn_datapath *od,
889                enum ovn_stage stage, uint16_t priority,
890                const char *match, const char *actions)
891 {
892     struct ovn_lflow target;
893     ovn_lflow_init(&target, od, stage, priority,
894                    CONST_CAST(char *, match), CONST_CAST(char *, actions));
895
896     struct ovn_lflow *lflow;
897     HMAP_FOR_EACH_WITH_HASH (lflow, hmap_node, ovn_lflow_hash(&target),
898                              lflows) {
899         if (ovn_lflow_equal(lflow, &target)) {
900             return lflow;
901         }
902     }
903     return NULL;
904 }
905
906 static void
907 ovn_lflow_destroy(struct hmap *lflows, struct ovn_lflow *lflow)
908 {
909     if (lflow) {
910         hmap_remove(lflows, &lflow->hmap_node);
911         free(lflow->match);
912         free(lflow->actions);
913         free(lflow);
914     }
915 }
916
917 /* Appends port security constraints on L2 address field 'eth_addr_field'
918  * (e.g. "eth.src" or "eth.dst") to 'match'.  'port_security', with
919  * 'n_port_security' elements, is the collection of port_security constraints
920  * from an OVN_NB Logical_Port row. */
921 static void
922 build_port_security(const char *eth_addr_field,
923                     char **port_security, size_t n_port_security,
924                     struct ds *match)
925 {
926     size_t base_len = match->length;
927     ds_put_format(match, " && %s == {", eth_addr_field);
928
929     size_t n = 0;
930     for (size_t i = 0; i < n_port_security; i++) {
931         struct eth_addr ea;
932
933         if (eth_addr_from_string(port_security[i], &ea)) {
934             ds_put_format(match, ETH_ADDR_FMT, ETH_ADDR_ARGS(ea));
935             ds_put_char(match, ' ');
936             n++;
937         }
938     }
939     ds_chomp(match, ' ');
940     ds_put_cstr(match, "}");
941
942     if (!n) {
943         match->length = base_len;
944     }
945 }
946
947 static bool
948 lport_is_enabled(const struct nbrec_logical_port *lport)
949 {
950     return !lport->enabled || *lport->enabled;
951 }
952
953 static bool
954 has_stateful_acl(struct ovn_datapath *od)
955 {
956     for (size_t i = 0; i < od->nbs->n_acls; i++) {
957         struct nbrec_acl *acl = od->nbs->acls[i];
958         if (!strcmp(acl->action, "allow-related")) {
959             return true;
960         }
961     }
962
963     return false;
964 }
965
966 static void
967 build_acls(struct ovn_datapath *od, struct hmap *lflows, struct hmap *ports)
968 {
969     bool has_stateful = has_stateful_acl(od);
970     struct ovn_port *op;
971     struct ds match_in, match_out;
972
973     /* Ingress and Egress Pre-ACL Table (Priority 0): Packets are
974      * allowed by default. */
975     ovn_lflow_add(lflows, od, S_SWITCH_IN_PRE_ACL, 0, "1", "next;");
976     ovn_lflow_add(lflows, od, S_SWITCH_OUT_PRE_ACL, 0, "1", "next;");
977
978     /* Ingress and Egress ACL Table (Priority 0): Packets are allowed by
979      * default.  A related rule at priority 1 is added below if there
980      * are any stateful ACLs in this datapath. */
981     ovn_lflow_add(lflows, od, S_SWITCH_IN_ACL, 0, "1", "next;");
982     ovn_lflow_add(lflows, od, S_SWITCH_OUT_ACL, 0, "1", "next;");
983
984     /* If there are any stateful ACL rules in this dapapath, we must
985      * send all IP packets through the conntrack action, which handles
986      * defragmentation, in order to match L4 headers. */
987     if (has_stateful) {
988         HMAP_FOR_EACH (op, key_node, ports) {
989             if (op->od == od && !strcmp(op->nbs->type, "router")) {
990                 /* Can't use ct() for router ports. Consider the following configuration:
991                 lp1(10.0.0.2) on hostA--ls1--lr0--ls2--lp2(10.0.1.2) on hostB,
992                 For a ping from lp1 to lp2, First, the response will go through ct()
993                 with a zone for lp2 in the ls2 ingress pipeline on hostB.
994                 That ct zone knows about this connection. Next, it goes through ct()
995                 with the zone for the router port in the egress pipeline of ls2 on hostB.
996                 This zone does not know about the connection, as the icmp request
997                 went through the logical router on hostA, not hostB. This would only work
998                 with distributed conntrack state across all chassis. */
999
1000                 ds_init(&match_in);
1001                 ds_init(&match_out);
1002                 ds_put_format(&match_in, "ip && inport == %s", op->json_key);
1003                 ds_put_format(&match_out, "ip && outport == %s", op->json_key);
1004                 ovn_lflow_add(lflows, od, S_SWITCH_IN_PRE_ACL, 110, ds_cstr(&match_in), "next;");
1005                 ovn_lflow_add(lflows, od, S_SWITCH_OUT_PRE_ACL, 110, ds_cstr(&match_out), "next;");
1006
1007                 ds_destroy(&match_in);
1008                 ds_destroy(&match_out);
1009             }
1010         }
1011
1012         /* Ingress and Egress Pre-ACL Table (Priority 100).
1013          *
1014          * Regardless of whether the ACL is "from-lport" or "to-lport",
1015          * we need rules in both the ingress and egress table, because
1016          * the return traffic needs to be followed. */
1017         ovn_lflow_add(lflows, od, S_SWITCH_IN_PRE_ACL, 100, "ip", "ct_next;");
1018         ovn_lflow_add(lflows, od, S_SWITCH_OUT_PRE_ACL, 100, "ip", "ct_next;");
1019
1020         /* Ingress and Egress ACL Table (Priority 1).
1021          *
1022          * By default, traffic is allowed.  This is partially handled by
1023          * the Priority 0 ACL flows added earlier, but we also need to
1024          * commit IP flows.  This is because, while the initiater's
1025          * direction may not have any stateful rules, the server's may
1026          * and then its return traffic would not have an associated
1027          * conntrack entry and would return "+invalid". */
1028         ovn_lflow_add(lflows, od, S_SWITCH_IN_ACL, 1, "ip",
1029                       "ct_commit; next;");
1030         ovn_lflow_add(lflows, od, S_SWITCH_OUT_ACL, 1, "ip",
1031                       "ct_commit; next;");
1032
1033         /* Ingress and Egress ACL Table (Priority 65535).
1034          *
1035          * Always drop traffic that's in an invalid state.  This is
1036          * enforced at a higher priority than ACLs can be defined. */
1037         ovn_lflow_add(lflows, od, S_SWITCH_IN_ACL, UINT16_MAX,
1038                       "ct.inv", "drop;");
1039         ovn_lflow_add(lflows, od, S_SWITCH_OUT_ACL, UINT16_MAX,
1040                       "ct.inv", "drop;");
1041
1042         /* Ingress and Egress ACL Table (Priority 65535).
1043          *
1044          * Always allow traffic that is established to a committed
1045          * conntrack entry.  This is enforced at a higher priority than
1046          * ACLs can be defined. */
1047         ovn_lflow_add(lflows, od, S_SWITCH_IN_ACL, UINT16_MAX,
1048                       "ct.est && !ct.rel && !ct.new && !ct.inv",
1049                       "next;");
1050         ovn_lflow_add(lflows, od, S_SWITCH_OUT_ACL, UINT16_MAX,
1051                       "ct.est && !ct.rel && !ct.new && !ct.inv",
1052                       "next;");
1053
1054         /* Ingress and Egress ACL Table (Priority 65535).
1055          *
1056          * Always allow traffic that is related to an existing conntrack
1057          * entry.  This is enforced at a higher priority than ACLs can
1058          * be defined.
1059          *
1060          * NOTE: This does not support related data sessions (eg,
1061          * a dynamically negotiated FTP data channel), but will allow
1062          * related traffic such as an ICMP Port Unreachable through
1063          * that's generated from a non-listening UDP port.  */
1064         ovn_lflow_add(lflows, od, S_SWITCH_IN_ACL, UINT16_MAX,
1065                       "!ct.est && ct.rel && !ct.new && !ct.inv",
1066                       "next;");
1067         ovn_lflow_add(lflows, od, S_SWITCH_OUT_ACL, UINT16_MAX,
1068                       "!ct.est && ct.rel && !ct.new && !ct.inv",
1069                       "next;");
1070     }
1071
1072     /* Ingress or Egress ACL Table (Various priorities). */
1073     for (size_t i = 0; i < od->nbs->n_acls; i++) {
1074         struct nbrec_acl *acl = od->nbs->acls[i];
1075         bool ingress = !strcmp(acl->direction, "from-lport") ? true :false;
1076         enum ovn_stage stage = ingress ? S_SWITCH_IN_ACL : S_SWITCH_OUT_ACL;
1077
1078         if (!strcmp(acl->action, "allow")) {
1079             /* If there are any stateful flows, we must even commit "allow"
1080              * actions.  This is because, while the initiater's
1081              * direction may not have any stateful rules, the server's
1082              * may and then its return traffic would not have an
1083              * associated conntrack entry and would return "+invalid". */
1084             const char *actions = has_stateful ? "ct_commit; next;" : "next;";
1085             ovn_lflow_add(lflows, od, stage,
1086                           acl->priority + OVN_ACL_PRI_OFFSET,
1087                           acl->match, actions);
1088         } else if (!strcmp(acl->action, "allow-related")) {
1089             struct ds match = DS_EMPTY_INITIALIZER;
1090
1091             /* Commit the connection tracking entry, which allows all
1092              * other traffic related to this entry to flow due to the
1093              * 65535 priority flow defined earlier. */
1094             ds_put_format(&match, "ct.new && (%s)", acl->match);
1095             ovn_lflow_add(lflows, od, stage,
1096                           acl->priority + OVN_ACL_PRI_OFFSET,
1097                           ds_cstr(&match), "ct_commit; next;");
1098
1099             ds_destroy(&match);
1100         } else if (!strcmp(acl->action, "drop")) {
1101             ovn_lflow_add(lflows, od, stage,
1102                           acl->priority + OVN_ACL_PRI_OFFSET,
1103                           acl->match, "drop;");
1104         } else if (!strcmp(acl->action, "reject")) {
1105             /* xxx Need to support "reject". */
1106             VLOG_INFO("reject is not a supported action");
1107             ovn_lflow_add(lflows, od, stage,
1108                           acl->priority + OVN_ACL_PRI_OFFSET,
1109                           acl->match, "drop;");
1110         }
1111     }
1112 }
1113
1114 static void
1115 build_lswitch_flows(struct hmap *datapaths, struct hmap *ports,
1116                     struct hmap *lflows, struct hmap *mcgroups)
1117 {
1118     /* This flow table structure is documented in ovn-northd(8), so please
1119      * update ovn-northd.8.xml if you change anything. */
1120
1121     /* Build pre-ACL and ACL tables for both ingress and egress.
1122      * Ingress tables 1 and 2.  Egress tables 0 and 1. */
1123     struct ovn_datapath *od;
1124     HMAP_FOR_EACH (od, key_node, datapaths) {
1125         if (!od->nbs) {
1126             continue;
1127         }
1128
1129         build_acls(od, lflows, ports);
1130     }
1131
1132     /* Logical switch ingress table 0: Admission control framework (priority
1133      * 100). */
1134     HMAP_FOR_EACH (od, key_node, datapaths) {
1135         if (!od->nbs) {
1136             continue;
1137         }
1138
1139         /* Logical VLANs not supported. */
1140         ovn_lflow_add(lflows, od, S_SWITCH_IN_PORT_SEC, 100, "vlan.present",
1141                       "drop;");
1142
1143         /* Broadcast/multicast source address is invalid. */
1144         ovn_lflow_add(lflows, od, S_SWITCH_IN_PORT_SEC, 100, "eth.src[40]",
1145                       "drop;");
1146
1147         /* Port security flows have priority 50 (see below) and will continue
1148          * to the next table if packet source is acceptable. */
1149     }
1150
1151     /* Logical switch ingress table 0: Ingress port security (priority 50). */
1152     struct ovn_port *op;
1153     HMAP_FOR_EACH (op, key_node, ports) {
1154         if (!op->nbs) {
1155             continue;
1156         }
1157
1158         if (!lport_is_enabled(op->nbs)) {
1159             /* Drop packets from disabled logical ports (since logical flow
1160              * tables are default-drop). */
1161             continue;
1162         }
1163
1164         struct ds match = DS_EMPTY_INITIALIZER;
1165         ds_put_format(&match, "inport == %s", op->json_key);
1166         build_port_security("eth.src",
1167                             op->nbs->port_security, op->nbs->n_port_security,
1168                             &match);
1169         ovn_lflow_add(lflows, op->od, S_SWITCH_IN_PORT_SEC, 50,
1170                       ds_cstr(&match), "next;");
1171         ds_destroy(&match);
1172     }
1173
1174     /* Ingress table 3: Destination lookup, ARP reply for known IPs.
1175      * (priority 150). */
1176     HMAP_FOR_EACH (op, key_node, ports) {
1177         if (!op->nbs) {
1178             continue;
1179         }
1180
1181         for (size_t i = 0; i < op->nbs->n_addresses; i++) {
1182             struct eth_addr ea;
1183             ovs_be32 ip;
1184
1185             if (ovs_scan(op->nbs->addresses[i],
1186                          ETH_ADDR_SCAN_FMT" "IP_SCAN_FMT,
1187                          ETH_ADDR_SCAN_ARGS(ea), IP_SCAN_ARGS(&ip))) {
1188                 char *match = xasprintf(
1189                     "arp.tpa == "IP_FMT" && arp.op == 1", IP_ARGS(ip));
1190                 char *actions = xasprintf(
1191                     "eth.dst = eth.src; "
1192                     "eth.src = "ETH_ADDR_FMT"; "
1193                     "arp.op = 2; /* ARP reply */ "
1194                     "arp.tha = arp.sha; "
1195                     "arp.sha = "ETH_ADDR_FMT"; "
1196                     "arp.tpa = arp.spa; "
1197                     "arp.spa = "IP_FMT"; "
1198                     "outport = inport; "
1199                     "inport = \"\"; /* Allow sending out inport. */ "
1200                     "output;",
1201                     ETH_ADDR_ARGS(ea),
1202                     ETH_ADDR_ARGS(ea),
1203                     IP_ARGS(ip));
1204                 ovn_lflow_add(lflows, op->od, S_SWITCH_IN_L2_LKUP, 150,
1205                               match, actions);
1206                 free(match);
1207                 free(actions);
1208             }
1209         }
1210     }
1211
1212     /* Ingress table 3: Destination lookup, broadcast and multicast handling
1213      * (priority 100). */
1214     HMAP_FOR_EACH (op, key_node, ports) {
1215         if (!op->nbs) {
1216             continue;
1217         }
1218
1219         if (lport_is_enabled(op->nbs)) {
1220             ovn_multicast_add(mcgroups, &mc_flood, op);
1221         }
1222     }
1223     HMAP_FOR_EACH (od, key_node, datapaths) {
1224         if (!od->nbs) {
1225             continue;
1226         }
1227
1228         ovn_lflow_add(lflows, od, S_SWITCH_IN_L2_LKUP, 100, "eth.mcast",
1229                       "outport = \""MC_FLOOD"\"; output;");
1230     }
1231
1232     /* Ingress table 3: Destination lookup, unicast handling (priority 50), */
1233     HMAP_FOR_EACH (op, key_node, ports) {
1234         if (!op->nbs) {
1235             continue;
1236         }
1237
1238         for (size_t i = 0; i < op->nbs->n_addresses; i++) {
1239             struct eth_addr mac;
1240
1241             if (eth_addr_from_string(op->nbs->addresses[i], &mac)) {
1242                 struct ds match, actions;
1243
1244                 ds_init(&match);
1245                 ds_put_format(&match, "eth.dst == "ETH_ADDR_FMT,
1246                               ETH_ADDR_ARGS(mac));
1247
1248                 ds_init(&actions);
1249                 ds_put_format(&actions, "outport = %s; output;", op->json_key);
1250                 ovn_lflow_add(lflows, op->od, S_SWITCH_IN_L2_LKUP, 50,
1251                               ds_cstr(&match), ds_cstr(&actions));
1252                 ds_destroy(&actions);
1253                 ds_destroy(&match);
1254             } else if (!strcmp(op->nbs->addresses[i], "unknown")) {
1255                 if (lport_is_enabled(op->nbs)) {
1256                     ovn_multicast_add(mcgroups, &mc_unknown, op);
1257                     op->od->has_unknown = true;
1258                 }
1259             } else {
1260                 static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
1261
1262                 VLOG_INFO_RL(&rl,
1263                              "%s: invalid syntax '%s' in addresses column",
1264                              op->nbs->name, op->nbs->addresses[i]);
1265             }
1266         }
1267     }
1268
1269     /* Ingress table 3: Destination lookup for unknown MACs (priority 0). */
1270     HMAP_FOR_EACH (od, key_node, datapaths) {
1271         if (!od->nbs) {
1272             continue;
1273         }
1274
1275         if (od->has_unknown) {
1276             ovn_lflow_add(lflows, od, S_SWITCH_IN_L2_LKUP, 0, "1",
1277                           "outport = \""MC_UNKNOWN"\"; output;");
1278         }
1279     }
1280
1281     /* Egress table 2: Egress port security multicast/broadcast (priority
1282      * 100). */
1283     HMAP_FOR_EACH (od, key_node, datapaths) {
1284         if (!od->nbs) {
1285             continue;
1286         }
1287
1288         ovn_lflow_add(lflows, od, S_SWITCH_OUT_PORT_SEC, 100, "eth.mcast",
1289                       "output;");
1290     }
1291
1292     /* Egress table 2: Egress port security (priorities 50 and 150).
1293      *
1294      * Priority 50 rules implement port security for enabled logical port.
1295      *
1296      * Priority 150 rules drop packets to disabled logical ports, so that they
1297      * don't even receive multicast or broadcast packets. */
1298     HMAP_FOR_EACH (op, key_node, ports) {
1299         if (!op->nbs) {
1300             continue;
1301         }
1302
1303         struct ds match = DS_EMPTY_INITIALIZER;
1304         ds_put_format(&match, "outport == %s", op->json_key);
1305         if (lport_is_enabled(op->nbs)) {
1306             build_port_security("eth.dst", op->nbs->port_security,
1307                                 op->nbs->n_port_security, &match);
1308             ovn_lflow_add(lflows, op->od, S_SWITCH_OUT_PORT_SEC, 50,
1309                           ds_cstr(&match), "output;");
1310         } else {
1311             ovn_lflow_add(lflows, op->od, S_SWITCH_OUT_PORT_SEC, 150,
1312                           ds_cstr(&match), "drop;");
1313         }
1314
1315         ds_destroy(&match);
1316     }
1317 }
1318
1319 static bool
1320 lrport_is_enabled(const struct nbrec_logical_router_port *lrport)
1321 {
1322     return !lrport->enabled || *lrport->enabled;
1323 }
1324
1325 static void
1326 add_route(struct hmap *lflows, struct ovn_datapath *od,
1327           ovs_be32 network, ovs_be32 mask, ovs_be32 gateway)
1328 {
1329     char *match = xasprintf("ip4.dst == "IP_FMT"/"IP_FMT,
1330                             IP_ARGS(network), IP_ARGS(mask));
1331
1332     struct ds actions = DS_EMPTY_INITIALIZER;
1333     ds_put_cstr(&actions, "ip.ttl--; reg0 = ");
1334     if (gateway) {
1335         ds_put_format(&actions, IP_FMT, IP_ARGS(gateway));
1336     } else {
1337         ds_put_cstr(&actions, "ip4.dst");
1338     }
1339     ds_put_cstr(&actions, "; next;");
1340
1341     /* The priority here is calculated to implement longest-prefix-match
1342      * routing. */
1343     ovn_lflow_add(lflows, od, S_ROUTER_IN_IP_ROUTING,
1344                   count_1bits(ntohl(mask)), match, ds_cstr(&actions));
1345     ds_destroy(&actions);
1346     free(match);
1347 }
1348
1349 static void
1350 build_lrouter_flows(struct hmap *datapaths, struct hmap *ports,
1351                     struct hmap *lflows)
1352 {
1353     /* This flow table structure is documented in ovn-northd(8), so please
1354      * update ovn-northd.8.xml if you change anything. */
1355
1356     /* Logical router ingress table 0: Admission control framework. */
1357     struct ovn_datapath *od;
1358     HMAP_FOR_EACH (od, key_node, datapaths) {
1359         if (!od->nbr) {
1360             continue;
1361         }
1362
1363         /* Logical VLANs not supported.
1364          * Broadcast/multicast source address is invalid. */
1365         ovn_lflow_add(lflows, od, S_ROUTER_IN_ADMISSION, 100,
1366                       "vlan.present || eth.src[40]", "drop;");
1367     }
1368
1369     /* Logical router ingress table 0: match (priority 50). */
1370     struct ovn_port *op;
1371     HMAP_FOR_EACH (op, key_node, ports) {
1372         if (!op->nbr) {
1373             continue;
1374         }
1375
1376         if (!lrport_is_enabled(op->nbr)) {
1377             /* Drop packets from disabled logical ports (since logical flow
1378              * tables are default-drop). */
1379             continue;
1380         }
1381
1382         char *match = xasprintf(
1383             "(eth.mcast || eth.dst == "ETH_ADDR_FMT") && inport == %s",
1384             ETH_ADDR_ARGS(op->mac), op->json_key);
1385         ovn_lflow_add(lflows, op->od, S_ROUTER_IN_ADMISSION, 50,
1386                       match, "next;");
1387         free(match);
1388     }
1389
1390     /* Logical router ingress table 1: IP Input. */
1391     HMAP_FOR_EACH (od, key_node, datapaths) {
1392         if (!od->nbr) {
1393             continue;
1394         }
1395
1396         /* L3 admission control: drop multicast and broadcast source, localhost
1397          * source or destination, and zero network source or destination
1398          * (priority 100). */
1399         ovn_lflow_add(lflows, od, S_ROUTER_IN_IP_INPUT, 100,
1400                       "ip4.mcast || "
1401                       "ip4.src == 255.255.255.255 || "
1402                       "ip4.src == 127.0.0.0/8 || "
1403                       "ip4.dst == 127.0.0.0/8 || "
1404                       "ip4.src == 0.0.0.0/8 || "
1405                       "ip4.dst == 0.0.0.0/8",
1406                       "drop;");
1407
1408         /* Drop Ethernet local broadcast.  By definition this traffic should
1409          * not be forwarded.*/
1410         ovn_lflow_add(lflows, od, S_ROUTER_IN_IP_INPUT, 50,
1411                       "eth.bcast", "drop;");
1412
1413         /* Drop IP multicast. */
1414         ovn_lflow_add(lflows, od, S_ROUTER_IN_IP_INPUT, 50,
1415                       "ip4.mcast", "drop;");
1416
1417         /* TTL discard.
1418          *
1419          * XXX Need to send ICMP time exceeded if !ip.later_frag. */
1420         char *match = xasprintf("ip4 && ip.ttl == {0, 1}");
1421         ovn_lflow_add(lflows, od, S_ROUTER_IN_IP_INPUT, 30, match, "drop;");
1422         free(match);
1423
1424         /* Pass other traffic not already handled to the next table for
1425          * routing. */
1426         ovn_lflow_add(lflows, od, S_ROUTER_IN_IP_INPUT, 0, "1", "next;");
1427     }
1428
1429     HMAP_FOR_EACH (op, key_node, ports) {
1430         if (!op->nbr) {
1431             continue;
1432         }
1433
1434         /* L3 admission control: drop packets that originate from an IP address
1435          * owned by the router or a broadcast address known to the router
1436          * (priority 100). */
1437         char *match = xasprintf("ip4.src == {"IP_FMT", "IP_FMT"}",
1438                                 IP_ARGS(op->ip), IP_ARGS(op->bcast));
1439         ovn_lflow_add(lflows, op->od, S_ROUTER_IN_IP_INPUT, 100,
1440                       match, "drop;");
1441         free(match);
1442
1443         /* ICMP echo reply.  These flows reply to ICMP echo requests
1444          * received for the router's IP address. */
1445         match = xasprintf(
1446             "inport == %s && (ip4.dst == "IP_FMT" || ip4.dst == "IP_FMT") && "
1447             "icmp4.type == 8 && icmp4.code == 0",
1448             op->json_key, IP_ARGS(op->ip), IP_ARGS(op->bcast));
1449         char *actions = xasprintf(
1450             "ip4.dst = ip4.src; "
1451             "ip4.src = "IP_FMT"; "
1452             "ip.ttl = 255; "
1453             "icmp4.type = 0; "
1454             "inport = \"\"; /* Allow sending out inport. */ "
1455             "next; ",
1456             IP_ARGS(op->ip));
1457         ovn_lflow_add(lflows, op->od, S_ROUTER_IN_IP_INPUT, 90,
1458                       match, actions);
1459         free(match);
1460         free(actions);
1461
1462         /* ARP reply.  These flows reply to ARP requests for the router's own
1463          * IP address. */
1464         match = xasprintf(
1465             "inport == %s && arp.tpa == "IP_FMT" && arp.op == 1",
1466             op->json_key, IP_ARGS(op->ip));
1467         actions = xasprintf(
1468             "eth.dst = eth.src; "
1469             "eth.src = "ETH_ADDR_FMT"; "
1470             "arp.op = 2; /* ARP reply */ "
1471             "arp.tha = arp.sha; "
1472             "arp.sha = "ETH_ADDR_FMT"; "
1473             "arp.tpa = arp.spa; "
1474             "arp.spa = "IP_FMT"; "
1475             "outport = %s; "
1476             "inport = \"\"; /* Allow sending out inport. */ "
1477             "output;",
1478             ETH_ADDR_ARGS(op->mac),
1479             ETH_ADDR_ARGS(op->mac),
1480             IP_ARGS(op->ip),
1481             op->json_key);
1482         ovn_lflow_add(lflows, op->od, S_ROUTER_IN_IP_INPUT, 90,
1483                       match, actions);
1484         free(match);
1485         free(actions);
1486
1487         /* Drop IP traffic to this router. */
1488         match = xasprintf("ip4.dst == "IP_FMT, IP_ARGS(op->ip));
1489         ovn_lflow_add(lflows, op->od, S_ROUTER_IN_IP_INPUT, 60,
1490                       match, "drop;");
1491         free(match);
1492     }
1493
1494     /* Logical router ingress table 2: IP Routing.
1495      *
1496      * A packet that arrives at this table is an IP packet that should be
1497      * routed to the address in ip4.dst. This table sets reg0 to the next-hop
1498      * IP address (leaving ip4.dst, the packet’s final destination, unchanged)
1499      * and advances to the next table for ARP resolution. */
1500     HMAP_FOR_EACH (op, key_node, ports) {
1501         if (!op->nbr) {
1502             continue;
1503         }
1504
1505         add_route(lflows, op->od, op->network, op->mask, 0);
1506     }
1507     HMAP_FOR_EACH (od, key_node, datapaths) {
1508         if (!od->nbr) {
1509             continue;
1510         }
1511
1512         if (od->gateway) {
1513             add_route(lflows, od, 0, 0, od->gateway);
1514         }
1515     }
1516     /* XXX destination unreachable */
1517
1518     /* Local router ingress table 3: ARP Resolution.
1519      *
1520      * Any packet that reaches this table is an IP packet whose next-hop IP
1521      * address is in reg0. (ip4.dst is the final destination.) This table
1522      * resolves the IP address in reg0 into an output port in outport and an
1523      * Ethernet address in eth.dst. */
1524     HMAP_FOR_EACH (op, key_node, ports) {
1525         if (op->nbr) {
1526             /* XXX ARP for neighboring router */
1527         } else if (op->od->n_router_ports) {
1528             for (size_t i = 0; i < op->nbs->n_addresses; i++) {
1529                 struct eth_addr ea;
1530                 ovs_be32 ip;
1531
1532                 if (ovs_scan(op->nbs->addresses[i],
1533                              ETH_ADDR_SCAN_FMT" "IP_SCAN_FMT,
1534                              ETH_ADDR_SCAN_ARGS(ea), IP_SCAN_ARGS(&ip))) {
1535                     for (size_t j = 0; j < op->od->n_router_ports; j++) {
1536                         /* Get the Logical_Router_Port that the Logical_Port is
1537                          * connected to, as 'peer'. */
1538                         const char *peer_name = smap_get(
1539                             &op->od->router_ports[j]->nbs->options,
1540                             "router-port");
1541                         if (!peer_name) {
1542                             continue;
1543                         }
1544
1545                         struct ovn_port *peer
1546                             = ovn_port_find(ports, peer_name);
1547                         if (!peer || !peer->nbr) {
1548                             continue;
1549                         }
1550
1551                         /* Make sure that 'ip' is in 'peer''s network. */
1552                         if ((ip ^ peer->network) & peer->mask) {
1553                             continue;
1554                         }
1555
1556                         char *match = xasprintf("reg0 == "IP_FMT, IP_ARGS(ip));
1557                         char *actions = xasprintf("eth.src = "ETH_ADDR_FMT"; "
1558                                                   "eth.dst = "ETH_ADDR_FMT"; "
1559                                                   "outport = %s; "
1560                                                   "output;",
1561                                                   ETH_ADDR_ARGS(peer->mac),
1562                                                   ETH_ADDR_ARGS(ea),
1563                                                   peer->json_key);
1564                         ovn_lflow_add(lflows, peer->od,
1565                                       S_ROUTER_IN_ARP, 200, match, actions);
1566                         free(actions);
1567                         free(match);
1568                         break;
1569                     }
1570                 }
1571             }
1572         }
1573     }
1574
1575     /* Logical router egress table 0: Delivery (priority 100).
1576      *
1577      * Priority 100 rules deliver packets to enabled logical ports. */
1578     HMAP_FOR_EACH (op, key_node, ports) {
1579         if (!op->nbr) {
1580             continue;
1581         }
1582
1583         if (!lrport_is_enabled(op->nbr)) {
1584             /* Drop packets to disabled logical ports (since logical flow
1585              * tables are default-drop). */
1586             continue;
1587         }
1588
1589         char *match = xasprintf("outport == %s", op->json_key);
1590         ovn_lflow_add(lflows, op->od, S_ROUTER_OUT_DELIVERY, 100,
1591                       match, "output;");
1592         free(match);
1593     }
1594 }
1595
1596 /* Updates the Logical_Flow and Multicast_Group tables in the OVN_SB database,
1597  * constructing their contents based on the OVN_NB database. */
1598 static void
1599 build_lflows(struct northd_context *ctx, struct hmap *datapaths,
1600              struct hmap *ports)
1601 {
1602     struct hmap lflows = HMAP_INITIALIZER(&lflows);
1603     struct hmap mcgroups = HMAP_INITIALIZER(&mcgroups);
1604
1605     build_lswitch_flows(datapaths, ports, &lflows, &mcgroups);
1606     build_lrouter_flows(datapaths, ports, &lflows);
1607
1608     /* Push changes to the Logical_Flow table to database. */
1609     const struct sbrec_logical_flow *sbflow, *next_sbflow;
1610     SBREC_LOGICAL_FLOW_FOR_EACH_SAFE (sbflow, next_sbflow, ctx->ovnsb_idl) {
1611         struct ovn_datapath *od
1612             = ovn_datapath_from_sbrec(datapaths, sbflow->logical_datapath);
1613         if (!od) {
1614             sbrec_logical_flow_delete(sbflow);
1615             continue;
1616         }
1617
1618         enum ovn_datapath_type dp_type = od->nbs ? DP_SWITCH : DP_ROUTER;
1619         enum ovn_pipeline pipeline
1620             = !strcmp(sbflow->pipeline, "ingress") ? P_IN : P_OUT;
1621         struct ovn_lflow *lflow = ovn_lflow_find(
1622             &lflows, od, ovn_stage_build(dp_type, pipeline, sbflow->table_id),
1623             sbflow->priority, sbflow->match, sbflow->actions);
1624         if (lflow) {
1625             ovn_lflow_destroy(&lflows, lflow);
1626         } else {
1627             sbrec_logical_flow_delete(sbflow);
1628         }
1629     }
1630     struct ovn_lflow *lflow, *next_lflow;
1631     HMAP_FOR_EACH_SAFE (lflow, next_lflow, hmap_node, &lflows) {
1632         enum ovn_pipeline pipeline = ovn_stage_get_pipeline(lflow->stage);
1633         uint8_t table = ovn_stage_get_table(lflow->stage);
1634
1635         sbflow = sbrec_logical_flow_insert(ctx->ovnsb_txn);
1636         sbrec_logical_flow_set_logical_datapath(sbflow, lflow->od->sb);
1637         sbrec_logical_flow_set_pipeline(
1638             sbflow, pipeline == P_IN ? "ingress" : "egress");
1639         sbrec_logical_flow_set_table_id(sbflow, table);
1640         sbrec_logical_flow_set_priority(sbflow, lflow->priority);
1641         sbrec_logical_flow_set_match(sbflow, lflow->match);
1642         sbrec_logical_flow_set_actions(sbflow, lflow->actions);
1643
1644         const struct smap ids = SMAP_CONST1(&ids, "stage-name",
1645                                             ovn_stage_to_str(lflow->stage));
1646         sbrec_logical_flow_set_external_ids(sbflow, &ids);
1647
1648         ovn_lflow_destroy(&lflows, lflow);
1649     }
1650     hmap_destroy(&lflows);
1651
1652     /* Push changes to the Multicast_Group table to database. */
1653     const struct sbrec_multicast_group *sbmc, *next_sbmc;
1654     SBREC_MULTICAST_GROUP_FOR_EACH_SAFE (sbmc, next_sbmc, ctx->ovnsb_idl) {
1655         struct ovn_datapath *od = ovn_datapath_from_sbrec(datapaths,
1656                                                           sbmc->datapath);
1657         if (!od) {
1658             sbrec_multicast_group_delete(sbmc);
1659             continue;
1660         }
1661
1662         struct multicast_group group = { .name = sbmc->name,
1663                                          .key = sbmc->tunnel_key };
1664         struct ovn_multicast *mc = ovn_multicast_find(&mcgroups, od, &group);
1665         if (mc) {
1666             ovn_multicast_update_sbrec(mc, sbmc);
1667             ovn_multicast_destroy(&mcgroups, mc);
1668         } else {
1669             sbrec_multicast_group_delete(sbmc);
1670         }
1671     }
1672     struct ovn_multicast *mc, *next_mc;
1673     HMAP_FOR_EACH_SAFE (mc, next_mc, hmap_node, &mcgroups) {
1674         sbmc = sbrec_multicast_group_insert(ctx->ovnsb_txn);
1675         sbrec_multicast_group_set_datapath(sbmc, mc->datapath->sb);
1676         sbrec_multicast_group_set_name(sbmc, mc->group->name);
1677         sbrec_multicast_group_set_tunnel_key(sbmc, mc->group->key);
1678         ovn_multicast_update_sbrec(mc, sbmc);
1679         ovn_multicast_destroy(&mcgroups, mc);
1680     }
1681     hmap_destroy(&mcgroups);
1682 }
1683 \f
1684 static void
1685 ovnnb_db_run(struct northd_context *ctx)
1686 {
1687     if (!ctx->ovnsb_txn) {
1688         return;
1689     }
1690     VLOG_DBG("ovn-nb db contents may have changed.");
1691     struct hmap datapaths, ports;
1692     build_datapaths(ctx, &datapaths);
1693     build_ports(ctx, &datapaths, &ports);
1694     build_lflows(ctx, &datapaths, &ports);
1695
1696     struct ovn_datapath *dp, *next_dp;
1697     HMAP_FOR_EACH_SAFE (dp, next_dp, key_node, &datapaths) {
1698         ovn_datapath_destroy(&datapaths, dp);
1699     }
1700     hmap_destroy(&datapaths);
1701
1702     struct ovn_port *port, *next_port;
1703     HMAP_FOR_EACH_SAFE (port, next_port, key_node, &ports) {
1704         ovn_port_destroy(&ports, port);
1705     }
1706     hmap_destroy(&ports);
1707 }
1708
1709 /*
1710  * The only change we get notified about is if the 'chassis' column of the
1711  * 'Port_Binding' table changes.  When this column is not empty, it means we
1712  * need to set the corresponding logical port as 'up' in the northbound DB.
1713  */
1714 static void
1715 ovnsb_db_run(struct northd_context *ctx)
1716 {
1717     if (!ctx->ovnnb_txn) {
1718         return;
1719     }
1720     struct hmap lports_hmap;
1721     const struct sbrec_port_binding *sb;
1722     const struct nbrec_logical_port *nb;
1723
1724     struct lport_hash_node {
1725         struct hmap_node node;
1726         const struct nbrec_logical_port *nb;
1727     } *hash_node, *hash_node_next;
1728
1729     VLOG_DBG("Recalculating port up states for ovn-nb db.");
1730
1731     hmap_init(&lports_hmap);
1732
1733     NBREC_LOGICAL_PORT_FOR_EACH(nb, ctx->ovnnb_idl) {
1734         hash_node = xzalloc(sizeof *hash_node);
1735         hash_node->nb = nb;
1736         hmap_insert(&lports_hmap, &hash_node->node, hash_string(nb->name, 0));
1737     }
1738
1739     SBREC_PORT_BINDING_FOR_EACH(sb, ctx->ovnsb_idl) {
1740         nb = NULL;
1741         HMAP_FOR_EACH_WITH_HASH(hash_node, node,
1742                                 hash_string(sb->logical_port, 0),
1743                                 &lports_hmap) {
1744             if (!strcmp(sb->logical_port, hash_node->nb->name)) {
1745                 nb = hash_node->nb;
1746                 break;
1747             }
1748         }
1749
1750         if (!nb) {
1751             /* The logical port doesn't exist for this port binding.  This can
1752              * happen under normal circumstances when ovn-northd hasn't gotten
1753              * around to pruning the Port_Binding yet. */
1754             continue;
1755         }
1756
1757         if (sb->chassis && (!nb->up || !*nb->up)) {
1758             bool up = true;
1759             nbrec_logical_port_set_up(nb, &up, 1);
1760         } else if (!sb->chassis && (!nb->up || *nb->up)) {
1761             bool up = false;
1762             nbrec_logical_port_set_up(nb, &up, 1);
1763         }
1764     }
1765
1766     HMAP_FOR_EACH_SAFE(hash_node, hash_node_next, node, &lports_hmap) {
1767         hmap_remove(&lports_hmap, &hash_node->node);
1768         free(hash_node);
1769     }
1770     hmap_destroy(&lports_hmap);
1771 }
1772 \f
1773
1774 static char *default_db_;
1775
1776 static const char *
1777 default_db(void)
1778 {
1779     if (!default_db_) {
1780         default_db_ = xasprintf("unix:%s/db.sock", ovs_rundir());
1781     }
1782     return default_db_;
1783 }
1784
1785 static void
1786 parse_options(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
1787 {
1788     enum {
1789         DAEMON_OPTION_ENUMS,
1790         VLOG_OPTION_ENUMS,
1791     };
1792     static const struct option long_options[] = {
1793         {"ovnsb-db", required_argument, NULL, 'd'},
1794         {"ovnnb-db", required_argument, NULL, 'D'},
1795         {"help", no_argument, NULL, 'h'},
1796         {"options", no_argument, NULL, 'o'},
1797         {"version", no_argument, NULL, 'V'},
1798         DAEMON_LONG_OPTIONS,
1799         VLOG_LONG_OPTIONS,
1800         STREAM_SSL_LONG_OPTIONS,
1801         {NULL, 0, NULL, 0},
1802     };
1803     char *short_options = ovs_cmdl_long_options_to_short_options(long_options);
1804
1805     for (;;) {
1806         int c;
1807
1808         c = getopt_long(argc, argv, short_options, long_options, NULL);
1809         if (c == -1) {
1810             break;
1811         }
1812
1813         switch (c) {
1814         DAEMON_OPTION_HANDLERS;
1815         VLOG_OPTION_HANDLERS;
1816         STREAM_SSL_OPTION_HANDLERS;
1817
1818         case 'd':
1819             ovnsb_db = optarg;
1820             break;
1821
1822         case 'D':
1823             ovnnb_db = optarg;
1824             break;
1825
1826         case 'h':
1827             usage();
1828             exit(EXIT_SUCCESS);
1829
1830         case 'o':
1831             ovs_cmdl_print_options(long_options);
1832             exit(EXIT_SUCCESS);
1833
1834         case 'V':
1835             ovs_print_version(0, 0);
1836             exit(EXIT_SUCCESS);
1837
1838         default:
1839             break;
1840         }
1841     }
1842
1843     if (!ovnsb_db) {
1844         ovnsb_db = default_db();
1845     }
1846
1847     if (!ovnnb_db) {
1848         ovnnb_db = default_db();
1849     }
1850
1851     free(short_options);
1852 }
1853
1854 static void
1855 add_column_noalert(struct ovsdb_idl *idl,
1856                    const struct ovsdb_idl_column *column)
1857 {
1858     ovsdb_idl_add_column(idl, column);
1859     ovsdb_idl_omit_alert(idl, column);
1860 }
1861
1862 int
1863 main(int argc, char *argv[])
1864 {
1865     extern struct vlog_module VLM_reconnect;
1866     unsigned int ovnnb_seqno, ovnsb_seqno;
1867     int res = EXIT_SUCCESS;
1868     struct unixctl_server *unixctl;
1869     int retval;
1870     bool exiting;
1871
1872     fatal_ignore_sigpipe();
1873     set_program_name(argv[0]);
1874     service_start(&argc, &argv);
1875     vlog_set_levels(NULL, VLF_CONSOLE, VLL_WARN);
1876     vlog_set_levels(&VLM_reconnect, VLF_ANY_DESTINATION, VLL_WARN);
1877     parse_options(argc, argv);
1878
1879     daemonize_start(false);
1880
1881     retval = unixctl_server_create(NULL, &unixctl);
1882     if (retval) {
1883         exit(EXIT_FAILURE);
1884     }
1885     unixctl_command_register("exit", "", 0, 0, ovn_northd_exit, &exiting);
1886
1887     daemonize_complete();
1888
1889     nbrec_init();
1890     sbrec_init();
1891
1892     /* We want to detect all changes to the ovn-nb db. */
1893     struct ovsdb_idl_loop ovnnb_idl_loop = OVSDB_IDL_LOOP_INITIALIZER(
1894         ovsdb_idl_create(ovnnb_db, &nbrec_idl_class, true, true));
1895
1896     struct ovsdb_idl_loop ovnsb_idl_loop = OVSDB_IDL_LOOP_INITIALIZER(
1897         ovsdb_idl_create(ovnsb_db, &sbrec_idl_class, false, true));
1898
1899     ovsdb_idl_add_table(ovnsb_idl_loop.idl, &sbrec_table_logical_flow);
1900     add_column_noalert(ovnsb_idl_loop.idl,
1901                        &sbrec_logical_flow_col_logical_datapath);
1902     add_column_noalert(ovnsb_idl_loop.idl, &sbrec_logical_flow_col_pipeline);
1903     add_column_noalert(ovnsb_idl_loop.idl, &sbrec_logical_flow_col_table_id);
1904     add_column_noalert(ovnsb_idl_loop.idl, &sbrec_logical_flow_col_priority);
1905     add_column_noalert(ovnsb_idl_loop.idl, &sbrec_logical_flow_col_match);
1906     add_column_noalert(ovnsb_idl_loop.idl, &sbrec_logical_flow_col_actions);
1907
1908     ovsdb_idl_add_table(ovnsb_idl_loop.idl, &sbrec_table_multicast_group);
1909     add_column_noalert(ovnsb_idl_loop.idl,
1910                        &sbrec_multicast_group_col_datapath);
1911     add_column_noalert(ovnsb_idl_loop.idl,
1912                        &sbrec_multicast_group_col_tunnel_key);
1913     add_column_noalert(ovnsb_idl_loop.idl, &sbrec_multicast_group_col_name);
1914     add_column_noalert(ovnsb_idl_loop.idl, &sbrec_multicast_group_col_ports);
1915
1916     ovsdb_idl_add_table(ovnsb_idl_loop.idl, &sbrec_table_datapath_binding);
1917     add_column_noalert(ovnsb_idl_loop.idl,
1918                        &sbrec_datapath_binding_col_tunnel_key);
1919     add_column_noalert(ovnsb_idl_loop.idl,
1920                        &sbrec_datapath_binding_col_external_ids);
1921
1922     ovsdb_idl_add_table(ovnsb_idl_loop.idl, &sbrec_table_port_binding);
1923     add_column_noalert(ovnsb_idl_loop.idl, &sbrec_port_binding_col_datapath);
1924     add_column_noalert(ovnsb_idl_loop.idl,
1925                        &sbrec_port_binding_col_logical_port);
1926     add_column_noalert(ovnsb_idl_loop.idl,
1927                        &sbrec_port_binding_col_tunnel_key);
1928     add_column_noalert(ovnsb_idl_loop.idl,
1929                        &sbrec_port_binding_col_parent_port);
1930     add_column_noalert(ovnsb_idl_loop.idl, &sbrec_port_binding_col_tag);
1931     add_column_noalert(ovnsb_idl_loop.idl, &sbrec_port_binding_col_type);
1932     add_column_noalert(ovnsb_idl_loop.idl, &sbrec_port_binding_col_options);
1933     add_column_noalert(ovnsb_idl_loop.idl, &sbrec_port_binding_col_mac);
1934     ovsdb_idl_add_column(ovnsb_idl_loop.idl, &sbrec_port_binding_col_chassis);
1935
1936     ovnnb_seqno = ovsdb_idl_get_seqno(ovnnb_idl_loop.idl);
1937     ovnsb_seqno = ovsdb_idl_get_seqno(ovnsb_idl_loop.idl);
1938
1939     /* Main loop. */
1940     exiting = false;
1941     while (!exiting) {
1942         struct northd_context ctx = {
1943             .ovnnb_idl = ovnnb_idl_loop.idl,
1944             .ovnnb_txn = ovsdb_idl_loop_run(&ovnnb_idl_loop),
1945             .ovnsb_idl = ovnsb_idl_loop.idl,
1946             .ovnsb_txn = ovsdb_idl_loop_run(&ovnsb_idl_loop),
1947         };
1948
1949         if (ovnnb_seqno != ovsdb_idl_get_seqno(ctx.ovnnb_idl)) {
1950             ovnnb_seqno = ovsdb_idl_get_seqno(ctx.ovnnb_idl);
1951             ovnnb_db_run(&ctx);
1952         }
1953         if (ovnsb_seqno != ovsdb_idl_get_seqno(ctx.ovnsb_idl)) {
1954             ovnsb_seqno = ovsdb_idl_get_seqno(ctx.ovnsb_idl);
1955             ovnsb_db_run(&ctx);
1956         }
1957
1958         unixctl_server_run(unixctl);
1959         unixctl_server_wait(unixctl);
1960         if (exiting) {
1961             poll_immediate_wake();
1962         }
1963         ovsdb_idl_loop_commit_and_wait(&ovnnb_idl_loop);
1964         ovsdb_idl_loop_commit_and_wait(&ovnsb_idl_loop);
1965
1966         poll_block();
1967         if (should_service_stop()) {
1968             exiting = true;
1969         }
1970     }
1971
1972     unixctl_server_destroy(unixctl);
1973     ovsdb_idl_loop_destroy(&ovnnb_idl_loop);
1974     ovsdb_idl_loop_destroy(&ovnsb_idl_loop);
1975     service_stop();
1976
1977     free(default_db_);
1978     exit(res);
1979 }
1980
1981 static void
1982 ovn_northd_exit(struct unixctl_conn *conn, int argc OVS_UNUSED,
1983                 const char *argv[] OVS_UNUSED, void *exiting_)
1984 {
1985     bool *exiting = exiting_;
1986     *exiting = true;
1987
1988     unixctl_command_reply(conn, NULL);
1989 }