ovn-northd: Ensure that flows are added to correct types of datapaths.
[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 "openvswitch/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 "ovn/lib/ovn-util.h"
33 #include "packets.h"
34 #include "poll-loop.h"
35 #include "smap.h"
36 #include "sset.h"
37 #include "stream.h"
38 #include "stream-ssl.h"
39 #include "unixctl.h"
40 #include "util.h"
41 #include "uuid.h"
42 #include "openvswitch/vlog.h"
43
44 VLOG_DEFINE_THIS_MODULE(ovn_northd);
45
46 static unixctl_cb_func ovn_northd_exit;
47
48 struct northd_context {
49     struct ovsdb_idl *ovnnb_idl;
50     struct ovsdb_idl *ovnsb_idl;
51     struct ovsdb_idl_txn *ovnnb_txn;
52     struct ovsdb_idl_txn *ovnsb_txn;
53 };
54
55 static const char *ovnnb_db;
56 static const char *ovnsb_db;
57
58 static const char *default_nb_db(void);
59 static const char *default_sb_db(void);
60 \f
61 /* Pipeline stages. */
62
63 /* The two pipelines in an OVN logical flow table. */
64 enum ovn_pipeline {
65     P_IN,                       /* Ingress pipeline. */
66     P_OUT                       /* Egress pipeline. */
67 };
68
69 /* The two purposes for which ovn-northd uses OVN logical datapaths. */
70 enum ovn_datapath_type {
71     DP_SWITCH,                  /* OVN logical switch. */
72     DP_ROUTER                   /* OVN logical router. */
73 };
74
75 /* Returns an "enum ovn_stage" built from the arguments.
76  *
77  * (It's better to use ovn_stage_build() for type-safety reasons, but inline
78  * functions can't be used in enums or switch cases.) */
79 #define OVN_STAGE_BUILD(DP_TYPE, PIPELINE, TABLE) \
80     (((DP_TYPE) << 9) | ((PIPELINE) << 8) | (TABLE))
81
82 /* A stage within an OVN logical switch or router.
83  *
84  * An "enum ovn_stage" indicates whether the stage is part of a logical switch
85  * or router, whether the stage is part of the ingress or egress pipeline, and
86  * the table within that pipeline.  The first three components are combined to
87  * form the stage's full name, e.g. S_SWITCH_IN_PORT_SEC_L2,
88  * S_ROUTER_OUT_DELIVERY. */
89 enum ovn_stage {
90 #define PIPELINE_STAGES                                               \
91     /* Logical switch ingress stages. */                              \
92     PIPELINE_STAGE(SWITCH, IN,  PORT_SEC_L2,    0, "ls_in_port_sec_l2")     \
93     PIPELINE_STAGE(SWITCH, IN,  PORT_SEC_IP,    1, "ls_in_port_sec_ip")     \
94     PIPELINE_STAGE(SWITCH, IN,  PORT_SEC_ND,    2, "ls_in_port_sec_nd")     \
95     PIPELINE_STAGE(SWITCH, IN,  PRE_ACL,        3, "ls_in_pre_acl")      \
96     PIPELINE_STAGE(SWITCH, IN,  PRE_LB,         4, "ls_in_pre_lb")         \
97     PIPELINE_STAGE(SWITCH, IN,  PRE_STATEFUL,   5, "ls_in_pre_stateful")    \
98     PIPELINE_STAGE(SWITCH, IN,  ACL,            6, "ls_in_acl")          \
99     PIPELINE_STAGE(SWITCH, IN,  LB,             7, "ls_in_lb")           \
100     PIPELINE_STAGE(SWITCH, IN,  STATEFUL,       8, "ls_in_stateful")     \
101     PIPELINE_STAGE(SWITCH, IN,  ARP_ND_RSP,     9, "ls_in_arp_rsp")      \
102     PIPELINE_STAGE(SWITCH, IN,  L2_LKUP,       10, "ls_in_l2_lkup")      \
103                                                                       \
104     /* Logical switch egress stages. */                               \
105     PIPELINE_STAGE(SWITCH, OUT, PRE_LB,       0, "ls_out_pre_lb")     \
106     PIPELINE_STAGE(SWITCH, OUT, PRE_ACL,      1, "ls_out_pre_acl")     \
107     PIPELINE_STAGE(SWITCH, OUT, PRE_STATEFUL, 2, "ls_out_pre_stateful")  \
108     PIPELINE_STAGE(SWITCH, OUT, LB,           3, "ls_out_lb")            \
109     PIPELINE_STAGE(SWITCH, OUT, ACL,          4, "ls_out_acl")            \
110     PIPELINE_STAGE(SWITCH, OUT, STATEFUL,     5, "ls_out_stateful")       \
111     PIPELINE_STAGE(SWITCH, OUT, PORT_SEC_IP,  6, "ls_out_port_sec_ip")    \
112     PIPELINE_STAGE(SWITCH, OUT, PORT_SEC_L2,  7, "ls_out_port_sec_l2")    \
113                                                                       \
114     /* Logical router ingress stages. */                              \
115     PIPELINE_STAGE(ROUTER, IN,  ADMISSION,   0, "lr_in_admission")    \
116     PIPELINE_STAGE(ROUTER, IN,  IP_INPUT,    1, "lr_in_ip_input")     \
117     PIPELINE_STAGE(ROUTER, IN,  UNSNAT,      2, "lr_in_unsnat")       \
118     PIPELINE_STAGE(ROUTER, IN,  DNAT,        3, "lr_in_dnat")         \
119     PIPELINE_STAGE(ROUTER, IN,  IP_ROUTING,  4, "lr_in_ip_routing")   \
120     PIPELINE_STAGE(ROUTER, IN,  ARP_RESOLVE, 5, "lr_in_arp_resolve")  \
121     PIPELINE_STAGE(ROUTER, IN,  ARP_REQUEST, 6, "lr_in_arp_request")  \
122                                                                       \
123     /* Logical router egress stages. */                               \
124     PIPELINE_STAGE(ROUTER, OUT, SNAT,      0, "lr_out_snat")          \
125     PIPELINE_STAGE(ROUTER, OUT, DELIVERY,  1, "lr_out_delivery")
126
127 #define PIPELINE_STAGE(DP_TYPE, PIPELINE, STAGE, TABLE, NAME)   \
128     S_##DP_TYPE##_##PIPELINE##_##STAGE                          \
129         = OVN_STAGE_BUILD(DP_##DP_TYPE, P_##PIPELINE, TABLE),
130     PIPELINE_STAGES
131 #undef PIPELINE_STAGE
132 };
133
134 /* Due to various hard-coded priorities need to implement ACLs, the
135  * northbound database supports a smaller range of ACL priorities than
136  * are available to logical flows.  This value is added to an ACL
137  * priority to determine the ACL's logical flow priority. */
138 #define OVN_ACL_PRI_OFFSET 1000
139
140 #define REGBIT_CONNTRACK_DEFRAG "reg0[0]"
141 #define REGBIT_CONNTRACK_COMMIT "reg0[1]"
142 #define REGBIT_CONNTRACK_NAT    "reg0[2]"
143
144 /* Returns an "enum ovn_stage" built from the arguments. */
145 static enum ovn_stage
146 ovn_stage_build(enum ovn_datapath_type dp_type, enum ovn_pipeline pipeline,
147                 uint8_t table)
148 {
149     return OVN_STAGE_BUILD(dp_type, pipeline, table);
150 }
151
152 /* Returns the pipeline to which 'stage' belongs. */
153 static enum ovn_pipeline
154 ovn_stage_get_pipeline(enum ovn_stage stage)
155 {
156     return (stage >> 8) & 1;
157 }
158
159 /* Returns the table to which 'stage' belongs. */
160 static uint8_t
161 ovn_stage_get_table(enum ovn_stage stage)
162 {
163     return stage & 0xff;
164 }
165
166 /* Returns a string name for 'stage'. */
167 static const char *
168 ovn_stage_to_str(enum ovn_stage stage)
169 {
170     switch (stage) {
171 #define PIPELINE_STAGE(DP_TYPE, PIPELINE, STAGE, TABLE, NAME)       \
172         case S_##DP_TYPE##_##PIPELINE##_##STAGE: return NAME;
173     PIPELINE_STAGES
174 #undef PIPELINE_STAGE
175         default: return "<unknown>";
176     }
177 }
178
179 /* Returns the type of the datapath to which a flow with the given 'stage' may
180  * be added. */
181 static enum ovn_datapath_type
182 ovn_stage_to_datapath_type(enum ovn_stage stage)
183 {
184     switch (stage) {
185 #define PIPELINE_STAGE(DP_TYPE, PIPELINE, STAGE, TABLE, NAME)       \
186         case S_##DP_TYPE##_##PIPELINE##_##STAGE: return DP_##DP_TYPE;
187     PIPELINE_STAGES
188 #undef PIPELINE_STAGE
189     default: OVS_NOT_REACHED();
190     }
191 }
192 \f
193 static void
194 usage(void)
195 {
196     printf("\
197 %s: OVN northbound management daemon\n\
198 usage: %s [OPTIONS]\n\
199 \n\
200 Options:\n\
201   --ovnnb-db=DATABASE       connect to ovn-nb database at DATABASE\n\
202                             (default: %s)\n\
203   --ovnsb-db=DATABASE       connect to ovn-sb database at DATABASE\n\
204                             (default: %s)\n\
205   -h, --help                display this help message\n\
206   -o, --options             list available options\n\
207   -V, --version             display version information\n\
208 ", program_name, program_name, default_nb_db(), default_sb_db());
209     daemon_usage();
210     vlog_usage();
211     stream_usage("database", true, true, false);
212 }
213 \f
214 struct tnlid_node {
215     struct hmap_node hmap_node;
216     uint32_t tnlid;
217 };
218
219 static void
220 destroy_tnlids(struct hmap *tnlids)
221 {
222     struct tnlid_node *node;
223     HMAP_FOR_EACH_POP (node, hmap_node, tnlids) {
224         free(node);
225     }
226     hmap_destroy(tnlids);
227 }
228
229 static void
230 add_tnlid(struct hmap *set, uint32_t tnlid)
231 {
232     struct tnlid_node *node = xmalloc(sizeof *node);
233     hmap_insert(set, &node->hmap_node, hash_int(tnlid, 0));
234     node->tnlid = tnlid;
235 }
236
237 static bool
238 tnlid_in_use(const struct hmap *set, uint32_t tnlid)
239 {
240     const struct tnlid_node *node;
241     HMAP_FOR_EACH_IN_BUCKET (node, hmap_node, hash_int(tnlid, 0), set) {
242         if (node->tnlid == tnlid) {
243             return true;
244         }
245     }
246     return false;
247 }
248
249 static uint32_t
250 allocate_tnlid(struct hmap *set, const char *name, uint32_t max,
251                uint32_t *hint)
252 {
253     for (uint32_t tnlid = *hint + 1; tnlid != *hint;
254          tnlid = tnlid + 1 <= max ? tnlid + 1 : 1) {
255         if (!tnlid_in_use(set, tnlid)) {
256             add_tnlid(set, tnlid);
257             *hint = tnlid;
258             return tnlid;
259         }
260     }
261
262     static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
263     VLOG_WARN_RL(&rl, "all %s tunnel ids exhausted", name);
264     return 0;
265 }
266 \f
267 /* The 'key' comes from nbs->header_.uuid or nbr->header_.uuid or
268  * sb->external_ids:logical-switch. */
269 struct ovn_datapath {
270     struct hmap_node key_node;  /* Index on 'key'. */
271     struct uuid key;            /* (nbs/nbr)->header_.uuid. */
272
273     const struct nbrec_logical_switch *nbs;  /* May be NULL. */
274     const struct nbrec_logical_router *nbr;  /* May be NULL. */
275     const struct sbrec_datapath_binding *sb; /* May be NULL. */
276
277     struct ovs_list list;       /* In list of similar records. */
278
279     /* Logical switch data. */
280     struct ovn_port **router_ports;
281     size_t n_router_ports;
282
283     struct hmap port_tnlids;
284     uint32_t port_key_hint;
285
286     bool has_unknown;
287 };
288
289 static struct ovn_datapath *
290 ovn_datapath_create(struct hmap *datapaths, const struct uuid *key,
291                     const struct nbrec_logical_switch *nbs,
292                     const struct nbrec_logical_router *nbr,
293                     const struct sbrec_datapath_binding *sb)
294 {
295     struct ovn_datapath *od = xzalloc(sizeof *od);
296     od->key = *key;
297     od->sb = sb;
298     od->nbs = nbs;
299     od->nbr = nbr;
300     hmap_init(&od->port_tnlids);
301     od->port_key_hint = 0;
302     hmap_insert(datapaths, &od->key_node, uuid_hash(&od->key));
303     return od;
304 }
305
306 static void
307 ovn_datapath_destroy(struct hmap *datapaths, struct ovn_datapath *od)
308 {
309     if (od) {
310         /* Don't remove od->list.  It is used within build_datapaths() as a
311          * private list and once we've exited that function it is not safe to
312          * use it. */
313         hmap_remove(datapaths, &od->key_node);
314         destroy_tnlids(&od->port_tnlids);
315         free(od->router_ports);
316         free(od);
317     }
318 }
319
320 /* Returns 'od''s datapath type. */
321 static enum ovn_datapath_type
322 ovn_datapath_get_type(const struct ovn_datapath *od)
323 {
324     return od->nbs ? DP_SWITCH : DP_ROUTER;
325 }
326
327 static struct ovn_datapath *
328 ovn_datapath_find(struct hmap *datapaths, const struct uuid *uuid)
329 {
330     struct ovn_datapath *od;
331
332     HMAP_FOR_EACH_WITH_HASH (od, key_node, uuid_hash(uuid), datapaths) {
333         if (uuid_equals(uuid, &od->key)) {
334             return od;
335         }
336     }
337     return NULL;
338 }
339
340 static struct ovn_datapath *
341 ovn_datapath_from_sbrec(struct hmap *datapaths,
342                         const struct sbrec_datapath_binding *sb)
343 {
344     struct uuid key;
345
346     if (!smap_get_uuid(&sb->external_ids, "logical-switch", &key) &&
347         !smap_get_uuid(&sb->external_ids, "logical-router", &key)) {
348         return NULL;
349     }
350     return ovn_datapath_find(datapaths, &key);
351 }
352
353 static bool
354 lrouter_is_enabled(const struct nbrec_logical_router *lrouter)
355 {
356     return !lrouter->enabled || *lrouter->enabled;
357 }
358
359 static void
360 join_datapaths(struct northd_context *ctx, struct hmap *datapaths,
361                struct ovs_list *sb_only, struct ovs_list *nb_only,
362                struct ovs_list *both)
363 {
364     hmap_init(datapaths);
365     ovs_list_init(sb_only);
366     ovs_list_init(nb_only);
367     ovs_list_init(both);
368
369     const struct sbrec_datapath_binding *sb, *sb_next;
370     SBREC_DATAPATH_BINDING_FOR_EACH_SAFE (sb, sb_next, ctx->ovnsb_idl) {
371         struct uuid key;
372         if (!smap_get_uuid(&sb->external_ids, "logical-switch", &key) &&
373             !smap_get_uuid(&sb->external_ids, "logical-router", &key)) {
374             ovsdb_idl_txn_add_comment(
375                 ctx->ovnsb_txn,
376                 "deleting Datapath_Binding "UUID_FMT" that lacks "
377                 "external-ids:logical-switch and "
378                 "external-ids:logical-router",
379                 UUID_ARGS(&sb->header_.uuid));
380             sbrec_datapath_binding_delete(sb);
381             continue;
382         }
383
384         if (ovn_datapath_find(datapaths, &key)) {
385             static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 1);
386             VLOG_INFO_RL(
387                 &rl, "deleting Datapath_Binding "UUID_FMT" with "
388                 "duplicate external-ids:logical-switch/router "UUID_FMT,
389                 UUID_ARGS(&sb->header_.uuid), UUID_ARGS(&key));
390             sbrec_datapath_binding_delete(sb);
391             continue;
392         }
393
394         struct ovn_datapath *od = ovn_datapath_create(datapaths, &key,
395                                                       NULL, NULL, sb);
396         ovs_list_push_back(sb_only, &od->list);
397     }
398
399     const struct nbrec_logical_switch *nbs;
400     NBREC_LOGICAL_SWITCH_FOR_EACH (nbs, ctx->ovnnb_idl) {
401         struct ovn_datapath *od = ovn_datapath_find(datapaths,
402                                                     &nbs->header_.uuid);
403         if (od) {
404             od->nbs = nbs;
405             ovs_list_remove(&od->list);
406             ovs_list_push_back(both, &od->list);
407         } else {
408             od = ovn_datapath_create(datapaths, &nbs->header_.uuid,
409                                      nbs, NULL, NULL);
410             ovs_list_push_back(nb_only, &od->list);
411         }
412     }
413
414     const struct nbrec_logical_router *nbr;
415     NBREC_LOGICAL_ROUTER_FOR_EACH (nbr, ctx->ovnnb_idl) {
416         if (!lrouter_is_enabled(nbr)) {
417             continue;
418         }
419
420         struct ovn_datapath *od = ovn_datapath_find(datapaths,
421                                                     &nbr->header_.uuid);
422         if (od) {
423             if (!od->nbs) {
424                 od->nbr = nbr;
425                 ovs_list_remove(&od->list);
426                 ovs_list_push_back(both, &od->list);
427             } else {
428                 /* Can't happen! */
429                 static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 1);
430                 VLOG_WARN_RL(&rl,
431                              "duplicate UUID "UUID_FMT" in OVN_Northbound",
432                              UUID_ARGS(&nbr->header_.uuid));
433                 continue;
434             }
435         } else {
436             od = ovn_datapath_create(datapaths, &nbr->header_.uuid,
437                                      NULL, nbr, NULL);
438             ovs_list_push_back(nb_only, &od->list);
439         }
440     }
441 }
442
443 static uint32_t
444 ovn_datapath_allocate_key(struct hmap *dp_tnlids)
445 {
446     static uint32_t hint;
447     return allocate_tnlid(dp_tnlids, "datapath", (1u << 24) - 1, &hint);
448 }
449
450 /* Updates the southbound Datapath_Binding table so that it contains the
451  * logical switches and routers specified by the northbound database.
452  *
453  * Initializes 'datapaths' to contain a "struct ovn_datapath" for every logical
454  * switch and router. */
455 static void
456 build_datapaths(struct northd_context *ctx, struct hmap *datapaths)
457 {
458     struct ovs_list sb_only, nb_only, both;
459
460     join_datapaths(ctx, datapaths, &sb_only, &nb_only, &both);
461
462     if (!ovs_list_is_empty(&nb_only)) {
463         /* First index the in-use datapath tunnel IDs. */
464         struct hmap dp_tnlids = HMAP_INITIALIZER(&dp_tnlids);
465         struct ovn_datapath *od;
466         LIST_FOR_EACH (od, list, &both) {
467             add_tnlid(&dp_tnlids, od->sb->tunnel_key);
468         }
469
470         /* Add southbound record for each unmatched northbound record. */
471         LIST_FOR_EACH (od, list, &nb_only) {
472             uint16_t tunnel_key = ovn_datapath_allocate_key(&dp_tnlids);
473             if (!tunnel_key) {
474                 break;
475             }
476
477             od->sb = sbrec_datapath_binding_insert(ctx->ovnsb_txn);
478
479             char uuid_s[UUID_LEN + 1];
480             sprintf(uuid_s, UUID_FMT, UUID_ARGS(&od->key));
481             const char *key = od->nbs ? "logical-switch" : "logical-router";
482             const struct smap id = SMAP_CONST1(&id, key, uuid_s);
483             sbrec_datapath_binding_set_external_ids(od->sb, &id);
484
485             sbrec_datapath_binding_set_tunnel_key(od->sb, tunnel_key);
486         }
487         destroy_tnlids(&dp_tnlids);
488     }
489
490     /* Delete southbound records without northbound matches. */
491     struct ovn_datapath *od, *next;
492     LIST_FOR_EACH_SAFE (od, next, list, &sb_only) {
493         ovs_list_remove(&od->list);
494         sbrec_datapath_binding_delete(od->sb);
495         ovn_datapath_destroy(datapaths, od);
496     }
497 }
498 \f
499 struct ovn_port {
500     struct hmap_node key_node;  /* Index on 'key'. */
501     char *key;                  /* nbs->name, nbr->name, sb->logical_port. */
502     char *json_key;             /* 'key', quoted for use in JSON. */
503
504     const struct sbrec_port_binding *sb;         /* May be NULL. */
505
506     /* Logical switch port data. */
507     const struct nbrec_logical_switch_port *nbs; /* May be NULL. */
508
509     struct lport_addresses *lsp_addrs;  /* Logical switch port addresses. */
510     unsigned int n_lsp_addrs;
511
512     struct lport_addresses *ps_addrs;   /* Port security addresses. */
513     unsigned int n_ps_addrs;
514
515     /* Logical router port data. */
516     const struct nbrec_logical_router_port *nbr; /* May be NULL. */
517
518     struct lport_addresses lrp_networks;
519
520     struct ovn_port *peer;
521
522     struct ovn_datapath *od;
523
524     struct ovs_list list;       /* In list of similar records. */
525 };
526
527 static struct ovn_port *
528 ovn_port_create(struct hmap *ports, const char *key,
529                 const struct nbrec_logical_switch_port *nbs,
530                 const struct nbrec_logical_router_port *nbr,
531                 const struct sbrec_port_binding *sb)
532 {
533     struct ovn_port *op = xzalloc(sizeof *op);
534
535     struct ds json_key = DS_EMPTY_INITIALIZER;
536     json_string_escape(key, &json_key);
537     op->json_key = ds_steal_cstr(&json_key);
538
539     op->key = xstrdup(key);
540     op->sb = sb;
541     op->nbs = nbs;
542     op->nbr = nbr;
543     hmap_insert(ports, &op->key_node, hash_string(op->key, 0));
544     return op;
545 }
546
547 static void
548 ovn_port_destroy(struct hmap *ports, struct ovn_port *port)
549 {
550     if (port) {
551         /* Don't remove port->list.  It is used within build_ports() as a
552          * private list and once we've exited that function it is not safe to
553          * use it. */
554         hmap_remove(ports, &port->key_node);
555
556         for (int i = 0; i < port->n_lsp_addrs; i++) {
557             destroy_lport_addresses(&port->lsp_addrs[i]);
558         }
559         free(port->lsp_addrs);
560
561         for (int i = 0; i < port->n_ps_addrs; i++) {
562             destroy_lport_addresses(&port->ps_addrs[i]);
563         }
564         free(port->ps_addrs);
565
566         destroy_lport_addresses(&port->lrp_networks);
567         free(port->json_key);
568         free(port->key);
569         free(port);
570     }
571 }
572
573 static struct ovn_port *
574 ovn_port_find(struct hmap *ports, const char *name)
575 {
576     struct ovn_port *op;
577
578     HMAP_FOR_EACH_WITH_HASH (op, key_node, hash_string(name, 0), ports) {
579         if (!strcmp(op->key, name)) {
580             return op;
581         }
582     }
583     return NULL;
584 }
585
586 static uint32_t
587 ovn_port_allocate_key(struct ovn_datapath *od)
588 {
589     return allocate_tnlid(&od->port_tnlids, "port",
590                           (1u << 15) - 1, &od->port_key_hint);
591 }
592
593 static void
594 join_logical_ports(struct northd_context *ctx,
595                    struct hmap *datapaths, struct hmap *ports,
596                    struct ovs_list *sb_only, struct ovs_list *nb_only,
597                    struct ovs_list *both)
598 {
599     hmap_init(ports);
600     ovs_list_init(sb_only);
601     ovs_list_init(nb_only);
602     ovs_list_init(both);
603
604     const struct sbrec_port_binding *sb;
605     SBREC_PORT_BINDING_FOR_EACH (sb, ctx->ovnsb_idl) {
606         struct ovn_port *op = ovn_port_create(ports, sb->logical_port,
607                                               NULL, NULL, sb);
608         ovs_list_push_back(sb_only, &op->list);
609     }
610
611     struct ovn_datapath *od;
612     HMAP_FOR_EACH (od, key_node, datapaths) {
613         if (od->nbs) {
614             for (size_t i = 0; i < od->nbs->n_ports; i++) {
615                 const struct nbrec_logical_switch_port *nbs = od->nbs->ports[i];
616                 struct ovn_port *op = ovn_port_find(ports, nbs->name);
617                 if (op) {
618                     if (op->nbs || op->nbr) {
619                         static struct vlog_rate_limit rl
620                             = VLOG_RATE_LIMIT_INIT(5, 1);
621                         VLOG_WARN_RL(&rl, "duplicate logical port %s",
622                                      nbs->name);
623                         continue;
624                     }
625                     op->nbs = nbs;
626                     ovs_list_remove(&op->list);
627                     ovs_list_push_back(both, &op->list);
628
629                     /* This port exists due to a SB binding, but should
630                      * not have been initialized fully. */
631                     ovs_assert(!op->n_lsp_addrs && !op->n_ps_addrs);
632                 } else {
633                     op = ovn_port_create(ports, nbs->name, nbs, NULL, NULL);
634                     ovs_list_push_back(nb_only, &op->list);
635                 }
636
637                 op->lsp_addrs
638                     = xmalloc(sizeof *op->lsp_addrs * nbs->n_addresses);
639                 for (size_t j = 0; j < nbs->n_addresses; j++) {
640                     if (!strcmp(nbs->addresses[j], "unknown")) {
641                         continue;
642                     }
643                     if (!extract_lsp_addresses(nbs->addresses[j],
644                                            &op->lsp_addrs[op->n_lsp_addrs])) {
645                         static struct vlog_rate_limit rl
646                             = VLOG_RATE_LIMIT_INIT(1, 1);
647                         VLOG_INFO_RL(&rl, "invalid syntax '%s' in logical "
648                                           "switch port addresses. No MAC "
649                                           "address found",
650                                           op->nbs->addresses[j]);
651                         continue;
652                     }
653                     op->n_lsp_addrs++;
654                 }
655
656                 op->ps_addrs
657                     = xmalloc(sizeof *op->ps_addrs * nbs->n_port_security);
658                 for (size_t j = 0; j < nbs->n_port_security; j++) {
659                     if (!extract_lsp_addresses(nbs->port_security[j],
660                                                &op->ps_addrs[op->n_ps_addrs])) {
661                         static struct vlog_rate_limit rl
662                             = VLOG_RATE_LIMIT_INIT(1, 1);
663                         VLOG_INFO_RL(&rl, "invalid syntax '%s' in port "
664                                           "security. No MAC address found",
665                                           op->nbs->port_security[j]);
666                         continue;
667                     }
668                     op->n_ps_addrs++;
669                 }
670
671                 op->od = od;
672             }
673         } else {
674             for (size_t i = 0; i < od->nbr->n_ports; i++) {
675                 const struct nbrec_logical_router_port *nbr = od->nbr->ports[i];
676
677                 struct lport_addresses lrp_networks;
678                 if (!extract_lrp_networks(nbr, &lrp_networks)) {
679                     static struct vlog_rate_limit rl
680                         = VLOG_RATE_LIMIT_INIT(5, 1);
681                     VLOG_WARN_RL(&rl, "bad 'mac' %s", nbr->mac);
682                     continue;
683                 }
684
685                 if (!lrp_networks.n_ipv4_addrs && !lrp_networks.n_ipv6_addrs) {
686                     continue;
687                 }
688
689                 struct ovn_port *op = ovn_port_find(ports, nbr->name);
690                 if (op) {
691                     if (op->nbs || op->nbr) {
692                         static struct vlog_rate_limit rl
693                             = VLOG_RATE_LIMIT_INIT(5, 1);
694                         VLOG_WARN_RL(&rl, "duplicate logical router port %s",
695                                      nbr->name);
696                         continue;
697                     }
698                     op->nbr = nbr;
699                     ovs_list_remove(&op->list);
700                     ovs_list_push_back(both, &op->list);
701
702                     /* This port exists but should not have been
703                      * initialized fully. */
704                     ovs_assert(!op->lrp_networks.n_ipv4_addrs
705                                && !op->lrp_networks.n_ipv6_addrs);
706                 } else {
707                     op = ovn_port_create(ports, nbr->name, NULL, nbr, NULL);
708                     ovs_list_push_back(nb_only, &op->list);
709                 }
710
711                 op->lrp_networks = lrp_networks;
712                 op->od = od;
713             }
714         }
715     }
716
717     /* Connect logical router ports, and logical switch ports of type "router",
718      * to their peers. */
719     struct ovn_port *op;
720     HMAP_FOR_EACH (op, key_node, ports) {
721         if (op->nbs && !strcmp(op->nbs->type, "router")) {
722             const char *peer_name = smap_get(&op->nbs->options, "router-port");
723             if (!peer_name) {
724                 continue;
725             }
726
727             struct ovn_port *peer = ovn_port_find(ports, peer_name);
728             if (!peer || !peer->nbr) {
729                 continue;
730             }
731
732             peer->peer = op;
733             op->peer = peer;
734             op->od->router_ports = xrealloc(
735                 op->od->router_ports,
736                 sizeof *op->od->router_ports * (op->od->n_router_ports + 1));
737             op->od->router_ports[op->od->n_router_ports++] = op;
738         } else if (op->nbr && op->nbr->peer) {
739             op->peer = ovn_port_find(ports, op->nbr->peer);
740         }
741     }
742 }
743
744 static void
745 ovn_port_update_sbrec(const struct ovn_port *op)
746 {
747     sbrec_port_binding_set_datapath(op->sb, op->od->sb);
748     if (op->nbr) {
749         /* If the router is for l3 gateway, it resides on a chassis
750          * and its port type is "gateway". */
751         const char *chassis = smap_get(&op->od->nbr->options, "chassis");
752         if (chassis) {
753             sbrec_port_binding_set_type(op->sb, "gateway");
754         } else {
755             sbrec_port_binding_set_type(op->sb, "patch");
756         }
757
758         const char *peer = op->peer ? op->peer->key : "<error>";
759         struct smap new;
760         smap_init(&new);
761         smap_add(&new, "peer", peer);
762         if (chassis) {
763             smap_add(&new, "gateway-chassis", chassis);
764         }
765         sbrec_port_binding_set_options(op->sb, &new);
766         smap_destroy(&new);
767
768         sbrec_port_binding_set_parent_port(op->sb, NULL);
769         sbrec_port_binding_set_tag(op->sb, NULL, 0);
770         sbrec_port_binding_set_mac(op->sb, NULL, 0);
771     } else {
772         if (strcmp(op->nbs->type, "router")) {
773             sbrec_port_binding_set_type(op->sb, op->nbs->type);
774             sbrec_port_binding_set_options(op->sb, &op->nbs->options);
775         } else {
776             const char *chassis = NULL;
777             if (op->peer && op->peer->od && op->peer->od->nbr) {
778                 chassis = smap_get(&op->peer->od->nbr->options, "chassis");
779             }
780
781             /* A switch port connected to a gateway router is also of
782              * type "gateway". */
783             if (chassis) {
784                 sbrec_port_binding_set_type(op->sb, "gateway");
785             } else {
786                 sbrec_port_binding_set_type(op->sb, "patch");
787             }
788
789             const char *router_port = smap_get(&op->nbs->options,
790                                                "router-port");
791             if (!router_port) {
792                 router_port = "<error>";
793             }
794             struct smap new;
795             smap_init(&new);
796             smap_add(&new, "peer", router_port);
797             if (chassis) {
798                 smap_add(&new, "gateway-chassis", chassis);
799             }
800             sbrec_port_binding_set_options(op->sb, &new);
801             smap_destroy(&new);
802         }
803         sbrec_port_binding_set_parent_port(op->sb, op->nbs->parent_name);
804         sbrec_port_binding_set_tag(op->sb, op->nbs->tag, op->nbs->n_tag);
805         sbrec_port_binding_set_mac(op->sb, (const char **) op->nbs->addresses,
806                                    op->nbs->n_addresses);
807     }
808 }
809
810 /* Updates the southbound Port_Binding table so that it contains the logical
811  * switch ports specified by the northbound database.
812  *
813  * Initializes 'ports' to contain a "struct ovn_port" for every logical port,
814  * using the "struct ovn_datapath"s in 'datapaths' to look up logical
815  * datapaths. */
816 static void
817 build_ports(struct northd_context *ctx, struct hmap *datapaths,
818             struct hmap *ports)
819 {
820     struct ovs_list sb_only, nb_only, both;
821
822     join_logical_ports(ctx, datapaths, ports, &sb_only, &nb_only, &both);
823
824     /* For logical ports that are in both databases, update the southbound
825      * record based on northbound data.  Also index the in-use tunnel_keys. */
826     struct ovn_port *op, *next;
827     LIST_FOR_EACH_SAFE (op, next, list, &both) {
828         ovn_port_update_sbrec(op);
829
830         add_tnlid(&op->od->port_tnlids, op->sb->tunnel_key);
831         if (op->sb->tunnel_key > op->od->port_key_hint) {
832             op->od->port_key_hint = op->sb->tunnel_key;
833         }
834     }
835
836     /* Add southbound record for each unmatched northbound record. */
837     LIST_FOR_EACH_SAFE (op, next, list, &nb_only) {
838         uint16_t tunnel_key = ovn_port_allocate_key(op->od);
839         if (!tunnel_key) {
840             continue;
841         }
842
843         op->sb = sbrec_port_binding_insert(ctx->ovnsb_txn);
844         ovn_port_update_sbrec(op);
845
846         sbrec_port_binding_set_logical_port(op->sb, op->key);
847         sbrec_port_binding_set_tunnel_key(op->sb, tunnel_key);
848     }
849
850     /* Delete southbound records without northbound matches. */
851     LIST_FOR_EACH_SAFE(op, next, list, &sb_only) {
852         ovs_list_remove(&op->list);
853         sbrec_port_binding_delete(op->sb);
854         ovn_port_destroy(ports, op);
855     }
856 }
857 \f
858 #define OVN_MIN_MULTICAST 32768
859 #define OVN_MAX_MULTICAST 65535
860
861 struct multicast_group {
862     const char *name;
863     uint16_t key;               /* OVN_MIN_MULTICAST...OVN_MAX_MULTICAST. */
864 };
865
866 #define MC_FLOOD "_MC_flood"
867 static const struct multicast_group mc_flood = { MC_FLOOD, 65535 };
868
869 #define MC_UNKNOWN "_MC_unknown"
870 static const struct multicast_group mc_unknown = { MC_UNKNOWN, 65534 };
871
872 static bool
873 multicast_group_equal(const struct multicast_group *a,
874                       const struct multicast_group *b)
875 {
876     return !strcmp(a->name, b->name) && a->key == b->key;
877 }
878
879 /* Multicast group entry. */
880 struct ovn_multicast {
881     struct hmap_node hmap_node; /* Index on 'datapath' and 'key'. */
882     struct ovn_datapath *datapath;
883     const struct multicast_group *group;
884
885     struct ovn_port **ports;
886     size_t n_ports, allocated_ports;
887 };
888
889 static uint32_t
890 ovn_multicast_hash(const struct ovn_datapath *datapath,
891                    const struct multicast_group *group)
892 {
893     return hash_pointer(datapath, group->key);
894 }
895
896 static struct ovn_multicast *
897 ovn_multicast_find(struct hmap *mcgroups, struct ovn_datapath *datapath,
898                    const struct multicast_group *group)
899 {
900     struct ovn_multicast *mc;
901
902     HMAP_FOR_EACH_WITH_HASH (mc, hmap_node,
903                              ovn_multicast_hash(datapath, group), mcgroups) {
904         if (mc->datapath == datapath
905             && multicast_group_equal(mc->group, group)) {
906             return mc;
907         }
908     }
909     return NULL;
910 }
911
912 static void
913 ovn_multicast_add(struct hmap *mcgroups, const struct multicast_group *group,
914                   struct ovn_port *port)
915 {
916     struct ovn_datapath *od = port->od;
917     struct ovn_multicast *mc = ovn_multicast_find(mcgroups, od, group);
918     if (!mc) {
919         mc = xmalloc(sizeof *mc);
920         hmap_insert(mcgroups, &mc->hmap_node, ovn_multicast_hash(od, group));
921         mc->datapath = od;
922         mc->group = group;
923         mc->n_ports = 0;
924         mc->allocated_ports = 4;
925         mc->ports = xmalloc(mc->allocated_ports * sizeof *mc->ports);
926     }
927     if (mc->n_ports >= mc->allocated_ports) {
928         mc->ports = x2nrealloc(mc->ports, &mc->allocated_ports,
929                                sizeof *mc->ports);
930     }
931     mc->ports[mc->n_ports++] = port;
932 }
933
934 static void
935 ovn_multicast_destroy(struct hmap *mcgroups, struct ovn_multicast *mc)
936 {
937     if (mc) {
938         hmap_remove(mcgroups, &mc->hmap_node);
939         free(mc->ports);
940         free(mc);
941     }
942 }
943
944 static void
945 ovn_multicast_update_sbrec(const struct ovn_multicast *mc,
946                            const struct sbrec_multicast_group *sb)
947 {
948     struct sbrec_port_binding **ports = xmalloc(mc->n_ports * sizeof *ports);
949     for (size_t i = 0; i < mc->n_ports; i++) {
950         ports[i] = CONST_CAST(struct sbrec_port_binding *, mc->ports[i]->sb);
951     }
952     sbrec_multicast_group_set_ports(sb, ports, mc->n_ports);
953     free(ports);
954 }
955 \f
956 /* Logical flow generation.
957  *
958  * This code generates the Logical_Flow table in the southbound database, as a
959  * function of most of the northbound database.
960  */
961
962 struct ovn_lflow {
963     struct hmap_node hmap_node;
964
965     struct ovn_datapath *od;
966     enum ovn_stage stage;
967     uint16_t priority;
968     char *match;
969     char *actions;
970 };
971
972 static size_t
973 ovn_lflow_hash(const struct ovn_lflow *lflow)
974 {
975     size_t hash = uuid_hash(&lflow->od->key);
976     hash = hash_2words((lflow->stage << 16) | lflow->priority, hash);
977     hash = hash_string(lflow->match, hash);
978     return hash_string(lflow->actions, hash);
979 }
980
981 static bool
982 ovn_lflow_equal(const struct ovn_lflow *a, const struct ovn_lflow *b)
983 {
984     return (a->od == b->od
985             && a->stage == b->stage
986             && a->priority == b->priority
987             && !strcmp(a->match, b->match)
988             && !strcmp(a->actions, b->actions));
989 }
990
991 static void
992 ovn_lflow_init(struct ovn_lflow *lflow, struct ovn_datapath *od,
993               enum ovn_stage stage, uint16_t priority,
994               char *match, char *actions)
995 {
996     lflow->od = od;
997     lflow->stage = stage;
998     lflow->priority = priority;
999     lflow->match = match;
1000     lflow->actions = actions;
1001 }
1002
1003 /* Adds a row with the specified contents to the Logical_Flow table. */
1004 static void
1005 ovn_lflow_add(struct hmap *lflow_map, struct ovn_datapath *od,
1006               enum ovn_stage stage, uint16_t priority,
1007               const char *match, const char *actions)
1008 {
1009     ovs_assert(ovn_stage_to_datapath_type(stage) == ovn_datapath_get_type(od));
1010
1011     struct ovn_lflow *lflow = xmalloc(sizeof *lflow);
1012     ovn_lflow_init(lflow, od, stage, priority,
1013                    xstrdup(match), xstrdup(actions));
1014     hmap_insert(lflow_map, &lflow->hmap_node, ovn_lflow_hash(lflow));
1015 }
1016
1017 static struct ovn_lflow *
1018 ovn_lflow_find(struct hmap *lflows, struct ovn_datapath *od,
1019                enum ovn_stage stage, uint16_t priority,
1020                const char *match, const char *actions)
1021 {
1022     struct ovn_lflow target;
1023     ovn_lflow_init(&target, od, stage, priority,
1024                    CONST_CAST(char *, match), CONST_CAST(char *, actions));
1025
1026     struct ovn_lflow *lflow;
1027     HMAP_FOR_EACH_WITH_HASH (lflow, hmap_node, ovn_lflow_hash(&target),
1028                              lflows) {
1029         if (ovn_lflow_equal(lflow, &target)) {
1030             return lflow;
1031         }
1032     }
1033     return NULL;
1034 }
1035
1036 static void
1037 ovn_lflow_destroy(struct hmap *lflows, struct ovn_lflow *lflow)
1038 {
1039     if (lflow) {
1040         hmap_remove(lflows, &lflow->hmap_node);
1041         free(lflow->match);
1042         free(lflow->actions);
1043         free(lflow);
1044     }
1045 }
1046
1047 /* Appends port security constraints on L2 address field 'eth_addr_field'
1048  * (e.g. "eth.src" or "eth.dst") to 'match'.  'ps_addrs', with 'n_ps_addrs'
1049  * elements, is the collection of port_security constraints from an
1050  * OVN_NB Logical_Switch_Port row generated by extract_lsp_addresses(). */
1051 static void
1052 build_port_security_l2(const char *eth_addr_field,
1053                        struct lport_addresses *ps_addrs,
1054                        unsigned int n_ps_addrs,
1055                        struct ds *match)
1056 {
1057     if (!n_ps_addrs) {
1058         return;
1059     }
1060
1061     ds_put_format(match, " && %s == {", eth_addr_field);
1062
1063     for (size_t i = 0; i < n_ps_addrs; i++) {
1064         ds_put_format(match, "%s ", ps_addrs[i].ea_s);
1065     }
1066     ds_chomp(match, ' ');
1067     ds_put_cstr(match, "}");
1068 }
1069
1070 static void
1071 build_port_security_ipv6_nd_flow(
1072     struct ds *match, struct eth_addr ea, struct ipv6_netaddr *ipv6_addrs,
1073     int n_ipv6_addrs)
1074 {
1075     ds_put_format(match, " && ip6 && nd && ((nd.sll == "ETH_ADDR_FMT" || "
1076                   "nd.sll == "ETH_ADDR_FMT") || ((nd.tll == "ETH_ADDR_FMT" || "
1077                   "nd.tll == "ETH_ADDR_FMT")", ETH_ADDR_ARGS(eth_addr_zero),
1078                   ETH_ADDR_ARGS(ea), ETH_ADDR_ARGS(eth_addr_zero),
1079                   ETH_ADDR_ARGS(ea));
1080     if (!n_ipv6_addrs) {
1081         ds_put_cstr(match, "))");
1082         return;
1083     }
1084
1085     char ip6_str[INET6_ADDRSTRLEN + 1];
1086     struct in6_addr lla;
1087     in6_generate_lla(ea, &lla);
1088     memset(ip6_str, 0, sizeof(ip6_str));
1089     ipv6_string_mapped(ip6_str, &lla);
1090     ds_put_format(match, " && (nd.target == %s", ip6_str);
1091
1092     for(int i = 0; i < n_ipv6_addrs; i++) {
1093         memset(ip6_str, 0, sizeof(ip6_str));
1094         ipv6_string_mapped(ip6_str, &ipv6_addrs[i].addr);
1095         ds_put_format(match, " || nd.target == %s", ip6_str);
1096     }
1097
1098     ds_put_format(match, ")))");
1099 }
1100
1101 static void
1102 build_port_security_ipv6_flow(
1103     enum ovn_pipeline pipeline, struct ds *match, struct eth_addr ea,
1104     struct ipv6_netaddr *ipv6_addrs, int n_ipv6_addrs)
1105 {
1106     char ip6_str[INET6_ADDRSTRLEN + 1];
1107
1108     ds_put_format(match, " && %s == {",
1109                   pipeline == P_IN ? "ip6.src" : "ip6.dst");
1110
1111     /* Allow link-local address. */
1112     struct in6_addr lla;
1113     in6_generate_lla(ea, &lla);
1114     ipv6_string_mapped(ip6_str, &lla);
1115     ds_put_format(match, "%s, ", ip6_str);
1116
1117     /* Allow ip6.dst=ff00::/8 for multicast packets */
1118     if (pipeline == P_OUT) {
1119         ds_put_cstr(match, "ff00::/8, ");
1120     }
1121     for(int i = 0; i < n_ipv6_addrs; i++) {
1122         ipv6_string_mapped(ip6_str, &ipv6_addrs[i].addr);
1123         ds_put_format(match, "%s, ", ip6_str);
1124     }
1125     /* Replace ", " by "}". */
1126     ds_chomp(match, ' ');
1127     ds_chomp(match, ',');
1128     ds_put_cstr(match, "}");
1129 }
1130
1131 /**
1132  * Build port security constraints on ARP and IPv6 ND fields
1133  * and add logical flows to S_SWITCH_IN_PORT_SEC_ND stage.
1134  *
1135  * For each port security of the logical port, following
1136  * logical flows are added
1137  *   - If the port security has no IP (both IPv4 and IPv6) or
1138  *     if it has IPv4 address(es)
1139  *      - Priority 90 flow to allow ARP packets for known MAC addresses
1140  *        in the eth.src and arp.spa fields. If the port security
1141  *        has IPv4 addresses, allow known IPv4 addresses in the arp.tpa field.
1142  *
1143  *   - If the port security has no IP (both IPv4 and IPv6) or
1144  *     if it has IPv6 address(es)
1145  *     - Priority 90 flow to allow IPv6 ND packets for known MAC addresses
1146  *       in the eth.src and nd.sll/nd.tll fields. If the port security
1147  *       has IPv6 addresses, allow known IPv6 addresses in the nd.target field
1148  *       for IPv6 Neighbor Advertisement packet.
1149  *
1150  *   - Priority 80 flow to drop ARP and IPv6 ND packets.
1151  */
1152 static void
1153 build_port_security_nd(struct ovn_port *op, struct hmap *lflows)
1154 {
1155     struct ds match = DS_EMPTY_INITIALIZER;
1156
1157     for (size_t i = 0; i < op->n_ps_addrs; i++) {
1158         struct lport_addresses *ps = &op->ps_addrs[i];
1159
1160         bool no_ip = !(ps->n_ipv4_addrs || ps->n_ipv6_addrs);
1161
1162         ds_clear(&match);
1163         if (ps->n_ipv4_addrs || no_ip) {
1164             ds_put_format(&match,
1165                           "inport == %s && eth.src == %s && arp.sha == %s",
1166                           op->json_key, ps->ea_s, ps->ea_s);
1167
1168             if (ps->n_ipv4_addrs) {
1169                 ds_put_cstr(&match, " && arp.spa == {");
1170                 for (size_t j = 0; j < ps->n_ipv4_addrs; j++) {
1171                     /* When the netmask is applied, if the host portion is
1172                      * non-zero, the host can only use the specified
1173                      * address in the arp.spa.  If zero, the host is allowed
1174                      * to use any address in the subnet. */
1175                     if (ps->ipv4_addrs[j].plen == 32
1176                         || ps->ipv4_addrs[j].addr & ~ps->ipv4_addrs[j].mask) {
1177                         ds_put_cstr(&match, ps->ipv4_addrs[j].addr_s);
1178                     } else {
1179                         ds_put_format(&match, "%s/%d",
1180                                       ps->ipv4_addrs[j].network_s,
1181                                       ps->ipv4_addrs[j].plen);
1182                     }
1183                     ds_put_cstr(&match, ", ");
1184                 }
1185                 ds_chomp(&match, ' ');
1186                 ds_chomp(&match, ',');
1187                 ds_put_cstr(&match, "}");
1188             }
1189             ovn_lflow_add(lflows, op->od, S_SWITCH_IN_PORT_SEC_ND, 90,
1190                           ds_cstr(&match), "next;");
1191         }
1192
1193         if (ps->n_ipv6_addrs || no_ip) {
1194             ds_clear(&match);
1195             ds_put_format(&match, "inport == %s && eth.src == %s",
1196                           op->json_key, ps->ea_s);
1197             build_port_security_ipv6_nd_flow(&match, ps->ea, ps->ipv6_addrs,
1198                                              ps->n_ipv6_addrs);
1199             ovn_lflow_add(lflows, op->od, S_SWITCH_IN_PORT_SEC_ND, 90,
1200                           ds_cstr(&match), "next;");
1201         }
1202     }
1203
1204     ds_clear(&match);
1205     ds_put_format(&match, "inport == %s && (arp || nd)", op->json_key);
1206     ovn_lflow_add(lflows, op->od, S_SWITCH_IN_PORT_SEC_ND, 80,
1207                   ds_cstr(&match), "drop;");
1208     ds_destroy(&match);
1209 }
1210
1211 /**
1212  * Build port security constraints on IPv4 and IPv6 src and dst fields
1213  * and add logical flows to S_SWITCH_(IN/OUT)_PORT_SEC_IP stage.
1214  *
1215  * For each port security of the logical port, following
1216  * logical flows are added
1217  *   - If the port security has IPv4 addresses,
1218  *     - Priority 90 flow to allow IPv4 packets for known IPv4 addresses
1219  *
1220  *   - If the port security has IPv6 addresses,
1221  *     - Priority 90 flow to allow IPv6 packets for known IPv6 addresses
1222  *
1223  *   - If the port security has IPv4 addresses or IPv6 addresses or both
1224  *     - Priority 80 flow to drop all IPv4 and IPv6 traffic
1225  */
1226 static void
1227 build_port_security_ip(enum ovn_pipeline pipeline, struct ovn_port *op,
1228                        struct hmap *lflows)
1229 {
1230     char *port_direction;
1231     enum ovn_stage stage;
1232     if (pipeline == P_IN) {
1233         port_direction = "inport";
1234         stage = S_SWITCH_IN_PORT_SEC_IP;
1235     } else {
1236         port_direction = "outport";
1237         stage = S_SWITCH_OUT_PORT_SEC_IP;
1238     }
1239
1240     for (size_t i = 0; i < op->n_ps_addrs; i++) {
1241         struct lport_addresses *ps = &op->ps_addrs[i];
1242
1243         if (!(ps->n_ipv4_addrs || ps->n_ipv6_addrs)) {
1244             continue;
1245         }
1246
1247         if (ps->n_ipv4_addrs) {
1248             struct ds match = DS_EMPTY_INITIALIZER;
1249             if (pipeline == P_IN) {
1250                 /* Permit use of the unspecified address for DHCP discovery */
1251                 struct ds dhcp_match = DS_EMPTY_INITIALIZER;
1252                 ds_put_format(&dhcp_match, "inport == %s"
1253                               " && eth.src == %s"
1254                               " && ip4.src == 0.0.0.0"
1255                               " && ip4.dst == 255.255.255.255"
1256                               " && udp.src == 68 && udp.dst == 67",
1257                               op->json_key, ps->ea_s);
1258                 ovn_lflow_add(lflows, op->od, stage, 90,
1259                               ds_cstr(&dhcp_match), "next;");
1260                 ds_destroy(&dhcp_match);
1261                 ds_put_format(&match, "inport == %s && eth.src == %s"
1262                               " && ip4.src == {", op->json_key,
1263                               ps->ea_s);
1264             } else {
1265                 ds_put_format(&match, "outport == %s && eth.dst == %s"
1266                               " && ip4.dst == {255.255.255.255, 224.0.0.0/4, ",
1267                               op->json_key, ps->ea_s);
1268             }
1269
1270             for (int j = 0; j < ps->n_ipv4_addrs; j++) {
1271                 ovs_be32 mask = ps->ipv4_addrs[j].mask;
1272                 /* When the netmask is applied, if the host portion is
1273                  * non-zero, the host can only use the specified
1274                  * address.  If zero, the host is allowed to use any
1275                  * address in the subnet.
1276                  */
1277                 if (ps->ipv4_addrs[j].plen == 32
1278                     || ps->ipv4_addrs[j].addr & ~mask) {
1279                     ds_put_format(&match, "%s", ps->ipv4_addrs[j].addr_s);
1280                     if (pipeline == P_OUT && ps->ipv4_addrs[j].plen != 32) {
1281                         /* Host is also allowed to receive packets to the
1282                          * broadcast address in the specified subnet. */
1283                         ds_put_format(&match, ", %s",
1284                                       ps->ipv4_addrs[j].bcast_s);
1285                     }
1286                 } else {
1287                     /* host portion is zero */
1288                     ds_put_format(&match, "%s/%d", ps->ipv4_addrs[j].network_s,
1289                                   ps->ipv4_addrs[j].plen);
1290                 }
1291                 ds_put_cstr(&match, ", ");
1292             }
1293
1294             /* Replace ", " by "}". */
1295             ds_chomp(&match, ' ');
1296             ds_chomp(&match, ',');
1297             ds_put_cstr(&match, "}");
1298             ovn_lflow_add(lflows, op->od, stage, 90, ds_cstr(&match), "next;");
1299             ds_destroy(&match);
1300         }
1301
1302         if (ps->n_ipv6_addrs) {
1303             struct ds match = DS_EMPTY_INITIALIZER;
1304             if (pipeline == P_IN) {
1305                 /* Permit use of unspecified address for duplicate address
1306                  * detection */
1307                 struct ds dad_match = DS_EMPTY_INITIALIZER;
1308                 ds_put_format(&dad_match, "inport == %s"
1309                               " && eth.src == %s"
1310                               " && ip6.src == ::"
1311                               " && ip6.dst == ff02::/16"
1312                               " && icmp6.type == {131, 135, 143}", op->json_key,
1313                               ps->ea_s);
1314                 ovn_lflow_add(lflows, op->od, stage, 90,
1315                               ds_cstr(&dad_match), "next;");
1316                 ds_destroy(&dad_match);
1317             }
1318             ds_put_format(&match, "%s == %s && %s == %s",
1319                           port_direction, op->json_key,
1320                           pipeline == P_IN ? "eth.src" : "eth.dst", ps->ea_s);
1321             build_port_security_ipv6_flow(pipeline, &match, ps->ea,
1322                                           ps->ipv6_addrs, ps->n_ipv6_addrs);
1323             ovn_lflow_add(lflows, op->od, stage, 90,
1324                           ds_cstr(&match), "next;");
1325             ds_destroy(&match);
1326         }
1327
1328         char *match = xasprintf("%s == %s && %s == %s && ip",
1329                                 port_direction, op->json_key,
1330                                 pipeline == P_IN ? "eth.src" : "eth.dst",
1331                                 ps->ea_s);
1332         ovn_lflow_add(lflows, op->od, stage, 80, match, "drop;");
1333         free(match);
1334     }
1335
1336 }
1337
1338 static bool
1339 lsp_is_enabled(const struct nbrec_logical_switch_port *lsp)
1340 {
1341     return !lsp->enabled || *lsp->enabled;
1342 }
1343
1344 static bool
1345 lsp_is_up(const struct nbrec_logical_switch_port *lsp)
1346 {
1347     return !lsp->up || *lsp->up;
1348 }
1349
1350 static bool
1351 has_stateful_acl(struct ovn_datapath *od)
1352 {
1353     for (size_t i = 0; i < od->nbs->n_acls; i++) {
1354         struct nbrec_acl *acl = od->nbs->acls[i];
1355         if (!strcmp(acl->action, "allow-related")) {
1356             return true;
1357         }
1358     }
1359
1360     return false;
1361 }
1362
1363 static void
1364 build_pre_acls(struct ovn_datapath *od, struct hmap *lflows,
1365                struct hmap *ports)
1366 {
1367     bool has_stateful = has_stateful_acl(od);
1368     struct ovn_port *op;
1369
1370     /* Ingress and Egress Pre-ACL Table (Priority 0): Packets are
1371      * allowed by default. */
1372     ovn_lflow_add(lflows, od, S_SWITCH_IN_PRE_ACL, 0, "1", "next;");
1373     ovn_lflow_add(lflows, od, S_SWITCH_OUT_PRE_ACL, 0, "1", "next;");
1374
1375     /* If there are any stateful ACL rules in this dapapath, we must
1376      * send all IP packets through the conntrack action, which handles
1377      * defragmentation, in order to match L4 headers. */
1378     if (has_stateful) {
1379         HMAP_FOR_EACH (op, key_node, ports) {
1380             if (op->od == od && !strcmp(op->nbs->type, "router")) {
1381                 /* Can't use ct() for router ports. Consider the
1382                  * following configuration: lp1(10.0.0.2) on
1383                  * hostA--ls1--lr0--ls2--lp2(10.0.1.2) on hostB, For a
1384                  * ping from lp1 to lp2, First, the response will go
1385                  * through ct() with a zone for lp2 in the ls2 ingress
1386                  * pipeline on hostB.  That ct zone knows about this
1387                  * connection. Next, it goes through ct() with the zone
1388                  * for the router port in the egress pipeline of ls2 on
1389                  * hostB.  This zone does not know about the connection,
1390                  * as the icmp request went through the logical router
1391                  * on hostA, not hostB. This would only work with
1392                  * distributed conntrack state across all chassis. */
1393                 struct ds match_in = DS_EMPTY_INITIALIZER;
1394                 struct ds match_out = DS_EMPTY_INITIALIZER;
1395
1396                 ds_put_format(&match_in, "ip && inport == %s", op->json_key);
1397                 ds_put_format(&match_out, "ip && outport == %s", op->json_key);
1398                 ovn_lflow_add(lflows, od, S_SWITCH_IN_PRE_ACL, 110,
1399                               ds_cstr(&match_in), "next;");
1400                 ovn_lflow_add(lflows, od, S_SWITCH_OUT_PRE_ACL, 110,
1401                               ds_cstr(&match_out), "next;");
1402
1403                 ds_destroy(&match_in);
1404                 ds_destroy(&match_out);
1405             }
1406         }
1407         /* Ingress and Egress Pre-ACL Table (Priority 110).
1408          *
1409          * Not to do conntrack on ND packets. */
1410         ovn_lflow_add(lflows, od, S_SWITCH_IN_PRE_ACL, 110, "nd", "next;");
1411         ovn_lflow_add(lflows, od, S_SWITCH_OUT_PRE_ACL, 110, "nd", "next;");
1412
1413         /* Ingress and Egress Pre-ACL Table (Priority 100).
1414          *
1415          * Regardless of whether the ACL is "from-lport" or "to-lport",
1416          * we need rules in both the ingress and egress table, because
1417          * the return traffic needs to be followed.
1418          *
1419          * 'REGBIT_CONNTRACK_DEFRAG' is set to let the pre-stateful table send
1420          * it to conntrack for tracking and defragmentation. */
1421         ovn_lflow_add(lflows, od, S_SWITCH_IN_PRE_ACL, 100, "ip",
1422                       REGBIT_CONNTRACK_DEFRAG" = 1; next;");
1423         ovn_lflow_add(lflows, od, S_SWITCH_OUT_PRE_ACL, 100, "ip",
1424                       REGBIT_CONNTRACK_DEFRAG" = 1; next;");
1425     }
1426 }
1427
1428 /* For a 'key' of the form "IP:port" or just "IP", sets 'port' and
1429  * 'ip_address'.  The caller must free() the memory allocated for
1430  * 'ip_address'. */
1431 static void
1432 ip_address_and_port_from_lb_key(const char *key, char **ip_address,
1433                                 uint16_t *port)
1434 {
1435     char *ip_str, *start, *next;
1436     *ip_address = NULL;
1437     *port = 0;
1438
1439     next = start = xstrdup(key);
1440     ip_str = strsep(&next, ":");
1441     if (!ip_str || !ip_str[0]) {
1442         static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 1);
1443         VLOG_WARN_RL(&rl, "bad ip address for load balancer key %s", key);
1444         free(start);
1445         return;
1446     }
1447
1448     ovs_be32 ip, mask;
1449     char *error = ip_parse_masked(ip_str, &ip, &mask);
1450     if (error || mask != OVS_BE32_MAX) {
1451         static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 1);
1452         VLOG_WARN_RL(&rl, "bad ip address for load balancer key %s", key);
1453         free(start);
1454         free(error);
1455         return;
1456     }
1457
1458     int l4_port = 0;
1459     if (next && next[0]) {
1460         if (!str_to_int(next, 0, &l4_port) || l4_port < 0 || l4_port > 65535) {
1461             static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 1);
1462             VLOG_WARN_RL(&rl, "bad ip port for load balancer key %s", key);
1463             free(start);
1464             return;
1465         }
1466     }
1467
1468     *port = l4_port;
1469     *ip_address = strdup(ip_str);
1470     free(start);
1471 }
1472
1473 static void
1474 build_pre_lb(struct ovn_datapath *od, struct hmap *lflows)
1475 {
1476     /* Allow all packets to go to next tables by default. */
1477     ovn_lflow_add(lflows, od, S_SWITCH_IN_PRE_LB, 0, "1", "next;");
1478     ovn_lflow_add(lflows, od, S_SWITCH_OUT_PRE_LB, 0, "1", "next;");
1479
1480     struct sset all_ips = SSET_INITIALIZER(&all_ips);
1481     if (od->nbs->load_balancer) {
1482         struct nbrec_load_balancer *lb = od->nbs->load_balancer;
1483         struct smap *vips = &lb->vips;
1484         struct smap_node *node;
1485         bool vip_configured = false;
1486
1487         SMAP_FOR_EACH (node, vips) {
1488             vip_configured = true;
1489
1490             /* node->key contains IP:port or just IP. */
1491             char *ip_address = NULL;
1492             uint16_t port;
1493             ip_address_and_port_from_lb_key(node->key, &ip_address, &port);
1494             if (!ip_address) {
1495                 continue;
1496             }
1497
1498             if (!sset_contains(&all_ips, ip_address)) {
1499                 sset_add(&all_ips, ip_address);
1500             }
1501
1502             free(ip_address);
1503
1504             /* Ignore L4 port information in the key because fragmented packets
1505              * may not have L4 information.  The pre-stateful table will send
1506              * the packet through ct() action to de-fragment. In stateful
1507              * table, we will eventually look at L4 information. */
1508         }
1509
1510         /* 'REGBIT_CONNTRACK_DEFRAG' is set to let the pre-stateful table send
1511          * packet to conntrack for defragmentation. */
1512         const char *ip_address;
1513         SSET_FOR_EACH(ip_address, &all_ips) {
1514             char *match = xasprintf("ip && ip4.dst == %s", ip_address);
1515             ovn_lflow_add(lflows, od, S_SWITCH_IN_PRE_LB,
1516                           100, match, REGBIT_CONNTRACK_DEFRAG" = 1; next;");
1517             free(match);
1518         }
1519
1520         sset_destroy(&all_ips);
1521
1522         if (vip_configured) {
1523             ovn_lflow_add(lflows, od, S_SWITCH_OUT_PRE_LB,
1524                           100, "ip", REGBIT_CONNTRACK_DEFRAG" = 1; next;");
1525         }
1526     }
1527 }
1528
1529 static void
1530 build_pre_stateful(struct ovn_datapath *od, struct hmap *lflows)
1531 {
1532     /* Ingress and Egress pre-stateful Table (Priority 0): Packets are
1533      * allowed by default. */
1534     ovn_lflow_add(lflows, od, S_SWITCH_IN_PRE_STATEFUL, 0, "1", "next;");
1535     ovn_lflow_add(lflows, od, S_SWITCH_OUT_PRE_STATEFUL, 0, "1", "next;");
1536
1537     /* If REGBIT_CONNTRACK_DEFRAG is set as 1, then the packets should be
1538      * sent to conntrack for tracking and defragmentation. */
1539     ovn_lflow_add(lflows, od, S_SWITCH_IN_PRE_STATEFUL, 100,
1540                   REGBIT_CONNTRACK_DEFRAG" == 1", "ct_next;");
1541     ovn_lflow_add(lflows, od, S_SWITCH_OUT_PRE_STATEFUL, 100,
1542                   REGBIT_CONNTRACK_DEFRAG" == 1", "ct_next;");
1543 }
1544
1545 static void
1546 build_acls(struct ovn_datapath *od, struct hmap *lflows)
1547 {
1548     bool has_stateful = has_stateful_acl(od);
1549
1550     /* Ingress and Egress ACL Table (Priority 0): Packets are allowed by
1551      * default.  A related rule at priority 1 is added below if there
1552      * are any stateful ACLs in this datapath. */
1553     ovn_lflow_add(lflows, od, S_SWITCH_IN_ACL, 0, "1", "next;");
1554     ovn_lflow_add(lflows, od, S_SWITCH_OUT_ACL, 0, "1", "next;");
1555
1556     if (has_stateful) {
1557         /* Ingress and Egress ACL Table (Priority 1).
1558          *
1559          * By default, traffic is allowed.  This is partially handled by
1560          * the Priority 0 ACL flows added earlier, but we also need to
1561          * commit IP flows.  This is because, while the initiater's
1562          * direction may not have any stateful rules, the server's may
1563          * and then its return traffic would not have an associated
1564          * conntrack entry and would return "+invalid". */
1565         ovn_lflow_add(lflows, od, S_SWITCH_IN_ACL, 1, "ip",
1566                       REGBIT_CONNTRACK_COMMIT" = 1; next;");
1567         ovn_lflow_add(lflows, od, S_SWITCH_OUT_ACL, 1, "ip",
1568                       REGBIT_CONNTRACK_COMMIT" = 1; next;");
1569
1570         /* Ingress and Egress ACL Table (Priority 65535).
1571          *
1572          * Always drop traffic that's in an invalid state.  This is
1573          * enforced at a higher priority than ACLs can be defined. */
1574         ovn_lflow_add(lflows, od, S_SWITCH_IN_ACL, UINT16_MAX,
1575                       "ct.inv", "drop;");
1576         ovn_lflow_add(lflows, od, S_SWITCH_OUT_ACL, UINT16_MAX,
1577                       "ct.inv", "drop;");
1578
1579         /* Ingress and Egress ACL Table (Priority 65535).
1580          *
1581          * Always allow traffic that is established to a committed
1582          * conntrack entry.  This is enforced at a higher priority than
1583          * ACLs can be defined. */
1584         ovn_lflow_add(lflows, od, S_SWITCH_IN_ACL, UINT16_MAX,
1585                       "ct.est && !ct.rel && !ct.new && !ct.inv",
1586                       "next;");
1587         ovn_lflow_add(lflows, od, S_SWITCH_OUT_ACL, UINT16_MAX,
1588                       "ct.est && !ct.rel && !ct.new && !ct.inv",
1589                       "next;");
1590
1591         /* Ingress and Egress ACL Table (Priority 65535).
1592          *
1593          * Always allow traffic that is related to an existing conntrack
1594          * entry.  This is enforced at a higher priority than ACLs can
1595          * be defined.
1596          *
1597          * NOTE: This does not support related data sessions (eg,
1598          * a dynamically negotiated FTP data channel), but will allow
1599          * related traffic such as an ICMP Port Unreachable through
1600          * that's generated from a non-listening UDP port.  */
1601         ovn_lflow_add(lflows, od, S_SWITCH_IN_ACL, UINT16_MAX,
1602                       "!ct.est && ct.rel && !ct.new && !ct.inv",
1603                       "next;");
1604         ovn_lflow_add(lflows, od, S_SWITCH_OUT_ACL, UINT16_MAX,
1605                       "!ct.est && ct.rel && !ct.new && !ct.inv",
1606                       "next;");
1607
1608         /* Ingress and Egress ACL Table (Priority 65535).
1609          *
1610          * Not to do conntrack on ND packets. */
1611         ovn_lflow_add(lflows, od, S_SWITCH_IN_ACL, UINT16_MAX, "nd", "next;");
1612         ovn_lflow_add(lflows, od, S_SWITCH_OUT_ACL, UINT16_MAX, "nd", "next;");
1613     }
1614
1615     /* Ingress or Egress ACL Table (Various priorities). */
1616     for (size_t i = 0; i < od->nbs->n_acls; i++) {
1617         struct nbrec_acl *acl = od->nbs->acls[i];
1618         bool ingress = !strcmp(acl->direction, "from-lport") ? true :false;
1619         enum ovn_stage stage = ingress ? S_SWITCH_IN_ACL : S_SWITCH_OUT_ACL;
1620
1621         if (!strcmp(acl->action, "allow")) {
1622             /* If there are any stateful flows, we must even commit "allow"
1623              * actions.  This is because, while the initiater's
1624              * direction may not have any stateful rules, the server's
1625              * may and then its return traffic would not have an
1626              * associated conntrack entry and would return "+invalid". */
1627             const char *actions = has_stateful
1628                                     ? REGBIT_CONNTRACK_COMMIT" = 1; next;"
1629                                     : "next;";
1630             ovn_lflow_add(lflows, od, stage,
1631                           acl->priority + OVN_ACL_PRI_OFFSET,
1632                           acl->match, actions);
1633         } else if (!strcmp(acl->action, "allow-related")) {
1634             struct ds match = DS_EMPTY_INITIALIZER;
1635
1636             /* Commit the connection tracking entry, which allows all
1637              * other traffic related to this entry to flow due to the
1638              * 65535 priority flow defined earlier. */
1639             ds_put_format(&match, "ct.new && (%s)", acl->match);
1640             ovn_lflow_add(lflows, od, stage,
1641                           acl->priority + OVN_ACL_PRI_OFFSET,
1642                           ds_cstr(&match),
1643                           REGBIT_CONNTRACK_COMMIT" = 1; next;");
1644
1645             ds_destroy(&match);
1646         } else if (!strcmp(acl->action, "drop")) {
1647             ovn_lflow_add(lflows, od, stage,
1648                           acl->priority + OVN_ACL_PRI_OFFSET,
1649                           acl->match, "drop;");
1650         } else if (!strcmp(acl->action, "reject")) {
1651             /* xxx Need to support "reject". */
1652             VLOG_INFO("reject is not a supported action");
1653             ovn_lflow_add(lflows, od, stage,
1654                           acl->priority + OVN_ACL_PRI_OFFSET,
1655                           acl->match, "drop;");
1656         }
1657     }
1658 }
1659
1660 static void
1661 build_lb(struct ovn_datapath *od, struct hmap *lflows)
1662 {
1663     /* Ingress and Egress LB Table (Priority 0): Packets are allowed by
1664      * default.  */
1665     ovn_lflow_add(lflows, od, S_SWITCH_IN_LB, 0, "1", "next;");
1666     ovn_lflow_add(lflows, od, S_SWITCH_OUT_LB, 0, "1", "next;");
1667
1668     if (od->nbs->load_balancer) {
1669         /* Ingress and Egress LB Table (Priority 65535).
1670          *
1671          * Send established traffic through conntrack for just NAT. */
1672         ovn_lflow_add(lflows, od, S_SWITCH_IN_LB, UINT16_MAX,
1673                       "ct.est && !ct.rel && !ct.new && !ct.inv",
1674                       REGBIT_CONNTRACK_NAT" = 1; next;");
1675         ovn_lflow_add(lflows, od, S_SWITCH_OUT_LB, UINT16_MAX,
1676                       "ct.est && !ct.rel && !ct.new && !ct.inv",
1677                       REGBIT_CONNTRACK_NAT" = 1; next;");
1678     }
1679 }
1680
1681 static void
1682 build_stateful(struct ovn_datapath *od, struct hmap *lflows)
1683 {
1684     /* Ingress and Egress stateful Table (Priority 0): Packets are
1685      * allowed by default. */
1686     ovn_lflow_add(lflows, od, S_SWITCH_IN_STATEFUL, 0, "1", "next;");
1687     ovn_lflow_add(lflows, od, S_SWITCH_OUT_STATEFUL, 0, "1", "next;");
1688
1689     /* If REGBIT_CONNTRACK_COMMIT is set as 1, then the packets should be
1690      * committed to conntrack. */
1691     ovn_lflow_add(lflows, od, S_SWITCH_IN_STATEFUL, 100,
1692                   REGBIT_CONNTRACK_COMMIT" == 1", "ct_commit; next;");
1693     ovn_lflow_add(lflows, od, S_SWITCH_OUT_STATEFUL, 100,
1694                   REGBIT_CONNTRACK_COMMIT" == 1", "ct_commit; next;");
1695
1696     /* If REGBIT_CONNTRACK_NAT is set as 1, then packets should just be sent
1697      * through nat (without committing).
1698      *
1699      * REGBIT_CONNTRACK_COMMIT is set for new connections and
1700      * REGBIT_CONNTRACK_NAT is set for established connections. So they
1701      * don't overlap.
1702      */
1703     ovn_lflow_add(lflows, od, S_SWITCH_IN_STATEFUL, 100,
1704                   REGBIT_CONNTRACK_NAT" == 1", "ct_lb;");
1705     ovn_lflow_add(lflows, od, S_SWITCH_OUT_STATEFUL, 100,
1706                   REGBIT_CONNTRACK_NAT" == 1", "ct_lb;");
1707
1708     /* Load balancing rules for new connections get committed to conntrack
1709      * table.  So even if REGBIT_CONNTRACK_COMMIT is set in a previous table
1710      * a higher priority rule for load balancing below also commits the
1711      * connection, so it is okay if we do not hit the above match on
1712      * REGBIT_CONNTRACK_COMMIT. */
1713     if (od->nbs->load_balancer) {
1714         struct nbrec_load_balancer *lb = od->nbs->load_balancer;
1715         struct smap *vips = &lb->vips;
1716         struct smap_node *node;
1717
1718         SMAP_FOR_EACH (node, vips) {
1719             uint16_t port = 0;
1720
1721             /* node->key contains IP:port or just IP. */
1722             char *ip_address = NULL;
1723             ip_address_and_port_from_lb_key(node->key, &ip_address, &port);
1724             if (!ip_address) {
1725                 continue;
1726             }
1727
1728             /* New connections in Ingress table. */
1729             char *action = xasprintf("ct_lb(%s);", node->value);
1730             struct ds match = DS_EMPTY_INITIALIZER;
1731             ds_put_format(&match, "ct.new && ip && ip4.dst == %s", ip_address);
1732             if (port) {
1733                 if (lb->protocol && !strcmp(lb->protocol, "udp")) {
1734                     ds_put_format(&match, "&& udp && udp.dst == %d", port);
1735                 } else {
1736                     ds_put_format(&match, "&& tcp && tcp.dst == %d", port);
1737                 }
1738                 ovn_lflow_add(lflows, od, S_SWITCH_IN_STATEFUL,
1739                               120, ds_cstr(&match), action);
1740             } else {
1741                 ovn_lflow_add(lflows, od, S_SWITCH_IN_STATEFUL,
1742                               110, ds_cstr(&match), action);
1743             }
1744
1745             ds_destroy(&match);
1746             free(action);
1747        }
1748     }
1749 }
1750
1751 static void
1752 build_lswitch_flows(struct hmap *datapaths, struct hmap *ports,
1753                     struct hmap *lflows, struct hmap *mcgroups)
1754 {
1755     /* This flow table structure is documented in ovn-northd(8), so please
1756      * update ovn-northd.8.xml if you change anything. */
1757
1758     struct ds match = DS_EMPTY_INITIALIZER;
1759     struct ds actions = DS_EMPTY_INITIALIZER;
1760
1761     /* Build pre-ACL and ACL tables for both ingress and egress.
1762      * Ingress tables 3 and 4.  Egress tables 0 and 1. */
1763     struct ovn_datapath *od;
1764     HMAP_FOR_EACH (od, key_node, datapaths) {
1765         if (!od->nbs) {
1766             continue;
1767         }
1768
1769         build_pre_acls(od, lflows, ports);
1770         build_pre_lb(od, lflows);
1771         build_pre_stateful(od, lflows);
1772         build_acls(od, lflows);
1773         build_lb(od, lflows);
1774         build_stateful(od, lflows);
1775     }
1776
1777     /* Logical switch ingress table 0: Admission control framework (priority
1778      * 100). */
1779     HMAP_FOR_EACH (od, key_node, datapaths) {
1780         if (!od->nbs) {
1781             continue;
1782         }
1783
1784         /* Logical VLANs not supported. */
1785         ovn_lflow_add(lflows, od, S_SWITCH_IN_PORT_SEC_L2, 100, "vlan.present",
1786                       "drop;");
1787
1788         /* Broadcast/multicast source address is invalid. */
1789         ovn_lflow_add(lflows, od, S_SWITCH_IN_PORT_SEC_L2, 100, "eth.src[40]",
1790                       "drop;");
1791
1792         /* Port security flows have priority 50 (see below) and will continue
1793          * to the next table if packet source is acceptable. */
1794     }
1795
1796     /* Logical switch ingress table 0: Ingress port security - L2
1797      *  (priority 50).
1798      *  Ingress table 1: Ingress port security - IP (priority 90 and 80)
1799      *  Ingress table 2: Ingress port security - ND (priority 90 and 80)
1800      */
1801     struct ovn_port *op;
1802     HMAP_FOR_EACH (op, key_node, ports) {
1803         if (!op->nbs) {
1804             continue;
1805         }
1806
1807         if (!lsp_is_enabled(op->nbs)) {
1808             /* Drop packets from disabled logical ports (since logical flow
1809              * tables are default-drop). */
1810             continue;
1811         }
1812
1813         ds_clear(&match);
1814         ds_put_format(&match, "inport == %s", op->json_key);
1815         build_port_security_l2("eth.src", op->ps_addrs, op->n_ps_addrs,
1816                                &match);
1817         ovn_lflow_add(lflows, op->od, S_SWITCH_IN_PORT_SEC_L2, 50,
1818                       ds_cstr(&match), "next;");
1819
1820         if (op->nbs->n_port_security) {
1821             build_port_security_ip(P_IN, op, lflows);
1822             build_port_security_nd(op, lflows);
1823         }
1824     }
1825
1826     /* Ingress table 1 and 2: Port security - IP and ND, by default goto next.
1827      * (priority 0)*/
1828     HMAP_FOR_EACH (od, key_node, datapaths) {
1829         if (!od->nbs) {
1830             continue;
1831         }
1832
1833         ovn_lflow_add(lflows, od, S_SWITCH_IN_PORT_SEC_ND, 0, "1", "next;");
1834         ovn_lflow_add(lflows, od, S_SWITCH_IN_PORT_SEC_IP, 0, "1", "next;");
1835     }
1836
1837     /* Ingress table 9: ARP responder, skip requests coming from localnet ports.
1838      * (priority 100). */
1839     HMAP_FOR_EACH (op, key_node, ports) {
1840         if (!op->nbs) {
1841             continue;
1842         }
1843
1844         if (!strcmp(op->nbs->type, "localnet")) {
1845             ds_clear(&match);
1846             ds_put_format(&match, "inport == %s", op->json_key);
1847             ovn_lflow_add(lflows, op->od, S_SWITCH_IN_ARP_ND_RSP, 100,
1848                           ds_cstr(&match), "next;");
1849         }
1850     }
1851
1852     /* Ingress table 9: ARP/ND responder, reply for known IPs.
1853      * (priority 50). */
1854     HMAP_FOR_EACH (op, key_node, ports) {
1855         if (!op->nbs) {
1856             continue;
1857         }
1858
1859         /*
1860          * Add ARP/ND reply flows if either the
1861          *  - port is up or
1862          *  - port type is router
1863          */
1864         if (!lsp_is_up(op->nbs) && strcmp(op->nbs->type, "router")) {
1865             continue;
1866         }
1867
1868         for (size_t i = 0; i < op->n_lsp_addrs; i++) {
1869             for (size_t j = 0; j < op->lsp_addrs[i].n_ipv4_addrs; j++) {
1870                 ds_clear(&match);
1871                 ds_put_format(&match, "arp.tpa == %s && arp.op == 1",
1872                               op->lsp_addrs[i].ipv4_addrs[j].addr_s);
1873                 ds_clear(&actions);
1874                 ds_put_format(&actions,
1875                     "eth.dst = eth.src; "
1876                     "eth.src = %s; "
1877                     "arp.op = 2; /* ARP reply */ "
1878                     "arp.tha = arp.sha; "
1879                     "arp.sha = %s; "
1880                     "arp.tpa = arp.spa; "
1881                     "arp.spa = %s; "
1882                     "outport = inport; "
1883                     "inport = \"\"; /* Allow sending out inport. */ "
1884                     "output;",
1885                     op->lsp_addrs[i].ea_s, op->lsp_addrs[i].ea_s,
1886                     op->lsp_addrs[i].ipv4_addrs[j].addr_s);
1887                 ovn_lflow_add(lflows, op->od, S_SWITCH_IN_ARP_ND_RSP, 50,
1888                               ds_cstr(&match), ds_cstr(&actions));
1889             }
1890
1891             if (op->lsp_addrs[i].n_ipv6_addrs > 0) {
1892                 ds_clear(&match);
1893                 ds_put_cstr(&match, "icmp6 && icmp6.type == 135 && ");
1894                 if (op->lsp_addrs[i].n_ipv6_addrs == 1) {
1895                     ds_put_format(&match, "nd.target == %s",
1896                                   op->lsp_addrs[i].ipv6_addrs[0].addr_s);
1897                 } else {
1898                     ds_put_format(&match, "nd.target == {");
1899                     for (size_t j = 0; j < op->lsp_addrs[i].n_ipv6_addrs; j++) {
1900                         ds_put_cstr(&match,
1901                                       op->lsp_addrs[i].ipv6_addrs[j].addr_s);
1902                     }
1903                     ds_chomp(&match, ' ');
1904                     ds_chomp(&match, ',');
1905                     ds_put_cstr(&match, "}");
1906                 }
1907                 ds_clear(&actions);
1908                 ds_put_format(&actions,
1909                     "na { eth.src = %s; "
1910                     "nd.tll = %s; "
1911                     "outport = inport; "
1912                     "inport = \"\"; /* Allow sending out inport. */ "
1913                     "output; };",
1914                     op->lsp_addrs[i].ea_s,
1915                     op->lsp_addrs[i].ea_s);
1916
1917                 ovn_lflow_add(lflows, op->od, S_SWITCH_IN_ARP_ND_RSP, 50,
1918                               ds_cstr(&match), ds_cstr(&actions));
1919
1920             }
1921         }
1922     }
1923
1924     /* Ingress table 9: ARP/ND responder, by default goto next.
1925      * (priority 0)*/
1926     HMAP_FOR_EACH (od, key_node, datapaths) {
1927         if (!od->nbs) {
1928             continue;
1929         }
1930
1931         ovn_lflow_add(lflows, od, S_SWITCH_IN_ARP_ND_RSP, 0, "1", "next;");
1932     }
1933
1934     /* Ingress table 10: Destination lookup, broadcast and multicast handling
1935      * (priority 100). */
1936     HMAP_FOR_EACH (op, key_node, ports) {
1937         if (!op->nbs) {
1938             continue;
1939         }
1940
1941         if (lsp_is_enabled(op->nbs)) {
1942             ovn_multicast_add(mcgroups, &mc_flood, op);
1943         }
1944     }
1945     HMAP_FOR_EACH (od, key_node, datapaths) {
1946         if (!od->nbs) {
1947             continue;
1948         }
1949
1950         ovn_lflow_add(lflows, od, S_SWITCH_IN_L2_LKUP, 100, "eth.mcast",
1951                       "outport = \""MC_FLOOD"\"; output;");
1952     }
1953
1954     /* Ingress table 10: Destination lookup, unicast handling (priority 50), */
1955     HMAP_FOR_EACH (op, key_node, ports) {
1956         if (!op->nbs) {
1957             continue;
1958         }
1959
1960         for (size_t i = 0; i < op->nbs->n_addresses; i++) {
1961             struct eth_addr mac;
1962
1963             if (eth_addr_from_string(op->nbs->addresses[i], &mac)) {
1964                 ds_clear(&match);
1965                 ds_put_format(&match, "eth.dst == "ETH_ADDR_FMT,
1966                               ETH_ADDR_ARGS(mac));
1967
1968                 ds_clear(&actions);
1969                 ds_put_format(&actions, "outport = %s; output;", op->json_key);
1970                 ovn_lflow_add(lflows, op->od, S_SWITCH_IN_L2_LKUP, 50,
1971                               ds_cstr(&match), ds_cstr(&actions));
1972             } else if (!strcmp(op->nbs->addresses[i], "unknown")) {
1973                 if (lsp_is_enabled(op->nbs)) {
1974                     ovn_multicast_add(mcgroups, &mc_unknown, op);
1975                     op->od->has_unknown = true;
1976                 }
1977             } else {
1978                 static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
1979
1980                 VLOG_INFO_RL(&rl,
1981                              "%s: invalid syntax '%s' in addresses column",
1982                              op->nbs->name, op->nbs->addresses[i]);
1983             }
1984         }
1985     }
1986
1987     /* Ingress table 10: Destination lookup for unknown MACs (priority 0). */
1988     HMAP_FOR_EACH (od, key_node, datapaths) {
1989         if (!od->nbs) {
1990             continue;
1991         }
1992
1993         if (od->has_unknown) {
1994             ovn_lflow_add(lflows, od, S_SWITCH_IN_L2_LKUP, 0, "1",
1995                           "outport = \""MC_UNKNOWN"\"; output;");
1996         }
1997     }
1998
1999     /* Egress tables 6: Egress port security - IP (priority 0)
2000      * Egress table 7: Egress port security L2 - multicast/broadcast
2001      *                 (priority 100). */
2002     HMAP_FOR_EACH (od, key_node, datapaths) {
2003         if (!od->nbs) {
2004             continue;
2005         }
2006
2007         ovn_lflow_add(lflows, od, S_SWITCH_OUT_PORT_SEC_IP, 0, "1", "next;");
2008         ovn_lflow_add(lflows, od, S_SWITCH_OUT_PORT_SEC_L2, 100, "eth.mcast",
2009                       "output;");
2010     }
2011
2012     /* Egress table 6: Egress port security - IP (priorities 90 and 80)
2013      * if port security enabled.
2014      *
2015      * Egress table 7: Egress port security - L2 (priorities 50 and 150).
2016      *
2017      * Priority 50 rules implement port security for enabled logical port.
2018      *
2019      * Priority 150 rules drop packets to disabled logical ports, so that they
2020      * don't even receive multicast or broadcast packets. */
2021     HMAP_FOR_EACH (op, key_node, ports) {
2022         if (!op->nbs) {
2023             continue;
2024         }
2025
2026         ds_clear(&match);
2027         ds_put_format(&match, "outport == %s", op->json_key);
2028         if (lsp_is_enabled(op->nbs)) {
2029             build_port_security_l2("eth.dst", op->ps_addrs, op->n_ps_addrs,
2030                                    &match);
2031             ovn_lflow_add(lflows, op->od, S_SWITCH_OUT_PORT_SEC_L2, 50,
2032                           ds_cstr(&match), "output;");
2033         } else {
2034             ovn_lflow_add(lflows, op->od, S_SWITCH_OUT_PORT_SEC_L2, 150,
2035                           ds_cstr(&match), "drop;");
2036         }
2037
2038         if (op->nbs->n_port_security) {
2039             build_port_security_ip(P_OUT, op, lflows);
2040         }
2041     }
2042
2043     ds_destroy(&match);
2044     ds_destroy(&actions);
2045 }
2046
2047 static bool
2048 lrport_is_enabled(const struct nbrec_logical_router_port *lrport)
2049 {
2050     return !lrport->enabled || *lrport->enabled;
2051 }
2052
2053 /* Returns a string of the IP address of the router port 'op' that
2054  * overlaps with 'ip_s".  If one is not found, returns NULL.
2055  *
2056  * The caller must not free the returned string. */
2057 static const char *
2058 find_lrp_member_ip(const struct ovn_port *op, const char *ip_s)
2059 {
2060     ovs_be32 ip;
2061
2062     if (!ip_parse(ip_s, &ip)) {
2063         static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 1);
2064         VLOG_WARN_RL(&rl, "bad ip address %s", ip_s);
2065         return NULL;
2066     }
2067
2068     for (int i = 0; i < op->lrp_networks.n_ipv4_addrs; i++) {
2069         const struct ipv4_netaddr *na = &op->lrp_networks.ipv4_addrs[i];
2070
2071         if (!((na->network ^ ip) & na->mask)) {
2072             /* There should be only 1 interface that matches the
2073              * next hop.  Otherwise, it's a configuration error,
2074              * because subnets of router's interfaces should NOT
2075              * overlap. */
2076             return na->addr_s;
2077         }
2078     }
2079
2080     return NULL;
2081 }
2082
2083 static void
2084 add_route(struct hmap *lflows, const struct ovn_port *op,
2085           const char *lrp_addr_s, const char *network_s, int plen,
2086           const char *gateway)
2087 {
2088     char *match = xasprintf("ip4.dst == %s/%d", network_s, plen);
2089
2090     struct ds actions = DS_EMPTY_INITIALIZER;
2091     ds_put_cstr(&actions, "ip.ttl--; reg0 = ");
2092     if (gateway) {
2093         ds_put_cstr(&actions, gateway);
2094     } else {
2095         ds_put_cstr(&actions, "ip4.dst");
2096     }
2097     ds_put_format(&actions, "; "
2098                   "reg1 = %s; "
2099                   "eth.src = %s; "
2100                   "outport = %s; "
2101                   "inport = \"\"; /* Allow sending out inport. */ "
2102                   "next;",
2103                   lrp_addr_s,
2104                   op->lrp_networks.ea_s,
2105                   op->json_key);
2106
2107     /* The priority here is calculated to implement longest-prefix-match
2108      * routing. */
2109     ovn_lflow_add(lflows, op->od, S_ROUTER_IN_IP_ROUTING, plen, match,
2110                   ds_cstr(&actions));
2111     ds_destroy(&actions);
2112     free(match);
2113 }
2114
2115 static void
2116 build_static_route_flow(struct hmap *lflows, struct ovn_datapath *od,
2117                         struct hmap *ports,
2118                         const struct nbrec_logical_router_static_route *route)
2119 {
2120     ovs_be32 prefix, nexthop, mask;
2121     const char *lrp_addr_s;
2122
2123     /* Verify that next hop is an IP address with 32 bits mask. */
2124     char *error = ip_parse_masked(route->nexthop, &nexthop, &mask);
2125     if (error || mask != OVS_BE32_MAX) {
2126         static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 1);
2127         VLOG_WARN_RL(&rl, "bad next hop ip address %s", route->nexthop);
2128         free(error);
2129         return;
2130     }
2131
2132     /* Verify that ip prefix is a valid CIDR address. */
2133     error = ip_parse_masked(route->ip_prefix, &prefix, &mask);
2134     if (error || !ip_is_cidr(mask)) {
2135         static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 1);
2136         VLOG_WARN_RL(&rl, "bad 'ip_prefix' in static routes %s",
2137                      route->ip_prefix);
2138         free(error);
2139         return;
2140     }
2141
2142     /* Find the outgoing port. */
2143     struct ovn_port *out_port = NULL;
2144     if (route->output_port) {
2145         out_port = ovn_port_find(ports, route->output_port);
2146         if (!out_port) {
2147             static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 1);
2148             VLOG_WARN_RL(&rl, "Bad out port %s for static route %s",
2149                          route->output_port, route->ip_prefix);
2150             return;
2151         }
2152         lrp_addr_s = find_lrp_member_ip(out_port, route->nexthop);
2153     } else {
2154         /* output_port is not specified, find the
2155          * router port matching the next hop. */
2156         int i;
2157         for (i = 0; i < od->nbr->n_ports; i++) {
2158             struct nbrec_logical_router_port *lrp = od->nbr->ports[i];
2159             out_port = ovn_port_find(ports, lrp->name);
2160             if (!out_port) {
2161                 /* This should not happen. */
2162                 continue;
2163             }
2164
2165             lrp_addr_s = find_lrp_member_ip(out_port, route->nexthop);
2166             if (lrp_addr_s) {
2167                 break;
2168             }
2169         }
2170     }
2171
2172      if (!lrp_addr_s) {
2173         /* There is no matched out port. */
2174         static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 1);
2175         VLOG_WARN_RL(&rl, "No path for static route %s; next hop %s",
2176                      route->ip_prefix, route->nexthop);
2177         return;
2178     }
2179
2180     char *prefix_s = xasprintf(IP_FMT, IP_ARGS(prefix & mask));
2181     add_route(lflows, out_port, lrp_addr_s, prefix_s,
2182               ip_count_cidr_bits(mask), route->nexthop);
2183     free(prefix_s);
2184 }
2185
2186 static void
2187 op_put_networks(struct ds *ds, const struct ovn_port *op, bool add_bcast)
2188 {
2189     if (!add_bcast && op->lrp_networks.n_ipv4_addrs == 1) {
2190         ds_put_format(ds, "%s", op->lrp_networks.ipv4_addrs[0].addr_s);
2191         return;
2192     }
2193
2194     ds_put_cstr(ds, "{");
2195     for (int i = 0; i < op->lrp_networks.n_ipv4_addrs; i++) {
2196         ds_put_format(ds, "%s, ", op->lrp_networks.ipv4_addrs[i].addr_s);
2197         if (add_bcast) {
2198             ds_put_format(ds, "%s, ", op->lrp_networks.ipv4_addrs[i].bcast_s);
2199         }
2200     }
2201     ds_chomp(ds, ' ');
2202     ds_chomp(ds, ',');
2203     ds_put_cstr(ds, "}");
2204 }
2205
2206 static void
2207 build_lrouter_flows(struct hmap *datapaths, struct hmap *ports,
2208                     struct hmap *lflows)
2209 {
2210     /* This flow table structure is documented in ovn-northd(8), so please
2211      * update ovn-northd.8.xml if you change anything. */
2212
2213     struct ds match = DS_EMPTY_INITIALIZER;
2214     struct ds actions = DS_EMPTY_INITIALIZER;
2215
2216     /* Logical router ingress table 0: Admission control framework. */
2217     struct ovn_datapath *od;
2218     HMAP_FOR_EACH (od, key_node, datapaths) {
2219         if (!od->nbr) {
2220             continue;
2221         }
2222
2223         /* Logical VLANs not supported.
2224          * Broadcast/multicast source address is invalid. */
2225         ovn_lflow_add(lflows, od, S_ROUTER_IN_ADMISSION, 100,
2226                       "vlan.present || eth.src[40]", "drop;");
2227     }
2228
2229     /* Logical router ingress table 0: match (priority 50). */
2230     struct ovn_port *op;
2231     HMAP_FOR_EACH (op, key_node, ports) {
2232         if (!op->nbr) {
2233             continue;
2234         }
2235
2236         if (!lrport_is_enabled(op->nbr)) {
2237             /* Drop packets from disabled logical ports (since logical flow
2238              * tables are default-drop). */
2239             continue;
2240         }
2241
2242         ds_clear(&match);
2243         ds_put_format(&match, "(eth.mcast || eth.dst == %s) && inport == %s",
2244                       op->lrp_networks.ea_s, op->json_key);
2245         ovn_lflow_add(lflows, op->od, S_ROUTER_IN_ADMISSION, 50,
2246                       ds_cstr(&match), "next;");
2247     }
2248
2249     /* Logical router ingress table 1: IP Input. */
2250     HMAP_FOR_EACH (od, key_node, datapaths) {
2251         if (!od->nbr) {
2252             continue;
2253         }
2254
2255         /* L3 admission control: drop multicast and broadcast source, localhost
2256          * source or destination, and zero network source or destination
2257          * (priority 100). */
2258         ovn_lflow_add(lflows, od, S_ROUTER_IN_IP_INPUT, 100,
2259                       "ip4.mcast || "
2260                       "ip4.src == 255.255.255.255 || "
2261                       "ip4.src == 127.0.0.0/8 || "
2262                       "ip4.dst == 127.0.0.0/8 || "
2263                       "ip4.src == 0.0.0.0/8 || "
2264                       "ip4.dst == 0.0.0.0/8",
2265                       "drop;");
2266
2267         /* ARP reply handling.  Use ARP replies to populate the logical
2268          * router's ARP table. */
2269         ovn_lflow_add(lflows, od, S_ROUTER_IN_IP_INPUT, 90, "arp.op == 2",
2270                       "put_arp(inport, arp.spa, arp.sha);");
2271
2272         /* Drop Ethernet local broadcast.  By definition this traffic should
2273          * not be forwarded.*/
2274         ovn_lflow_add(lflows, od, S_ROUTER_IN_IP_INPUT, 50,
2275                       "eth.bcast", "drop;");
2276
2277         /* TTL discard.
2278          *
2279          * XXX Need to send ICMP time exceeded if !ip.later_frag. */
2280         ds_clear(&match);
2281         ds_put_cstr(&match, "ip4 && ip.ttl == {0, 1}");
2282         ovn_lflow_add(lflows, od, S_ROUTER_IN_IP_INPUT, 30,
2283                       ds_cstr(&match), "drop;");
2284
2285         /* Pass other traffic not already handled to the next table for
2286          * routing. */
2287         ovn_lflow_add(lflows, od, S_ROUTER_IN_IP_INPUT, 0, "1", "next;");
2288     }
2289
2290     HMAP_FOR_EACH (op, key_node, ports) {
2291         if (!op->nbr) {
2292             continue;
2293         }
2294
2295         /* L3 admission control: drop packets that originate from an IP address
2296          * owned by the router or a broadcast address known to the router
2297          * (priority 100). */
2298         ds_clear(&match);
2299         ds_put_cstr(&match, "ip4.src == ");
2300         op_put_networks(&match, op, true);
2301         ovn_lflow_add(lflows, op->od, S_ROUTER_IN_IP_INPUT, 100,
2302                       ds_cstr(&match), "drop;");
2303
2304         /* ICMP echo reply.  These flows reply to ICMP echo requests
2305          * received for the router's IP address. Since packets only
2306          * get here as part of the logical router datapath, the inport
2307          * (i.e. the incoming locally attached net) does not matter.
2308          * The ip.ttl also does not matter (RFC1812 section 4.2.2.9) */
2309         ds_clear(&match);
2310         ds_put_cstr(&match, "ip4.dst == ");
2311         op_put_networks(&match, op, false);
2312         ds_put_cstr(&match, " && icmp4.type == 8 && icmp4.code == 0");
2313
2314         ds_clear(&actions);
2315         ds_put_format(&actions,
2316             "ip4.dst <-> ip4.src; "
2317             "ip.ttl = 255; "
2318             "icmp4.type = 0; "
2319             "inport = \"\"; /* Allow sending out inport. */ "
2320             "next; ");
2321         ovn_lflow_add(lflows, op->od, S_ROUTER_IN_IP_INPUT, 90,
2322                       ds_cstr(&match), ds_cstr(&actions));
2323
2324         /* ARP reply.  These flows reply to ARP requests for the router's own
2325          * IP address. */
2326         for (int i = 0; i < op->lrp_networks.n_ipv4_addrs; i++) {
2327             ds_clear(&match);
2328             ds_put_format(&match,
2329                           "inport == %s && arp.tpa == %s && arp.op == 1",
2330                           op->json_key, op->lrp_networks.ipv4_addrs[i].addr_s);
2331
2332             ds_clear(&actions);
2333             ds_put_format(&actions,
2334                 "eth.dst = eth.src; "
2335                 "eth.src = %s; "
2336                 "arp.op = 2; /* ARP reply */ "
2337                 "arp.tha = arp.sha; "
2338                 "arp.sha = %s; "
2339                 "arp.tpa = arp.spa; "
2340                 "arp.spa = %s; "
2341                 "outport = %s; "
2342                 "inport = \"\"; /* Allow sending out inport. */ "
2343                 "output;",
2344                 op->lrp_networks.ea_s,
2345                 op->lrp_networks.ea_s,
2346                 op->lrp_networks.ipv4_addrs[i].addr_s,
2347                 op->json_key);
2348             ovn_lflow_add(lflows, op->od, S_ROUTER_IN_IP_INPUT, 90,
2349                           ds_cstr(&match), ds_cstr(&actions));
2350         }
2351
2352         /* ARP handling for external IP addresses.
2353          *
2354          * DNAT IP addresses are external IP addresses that need ARP
2355          * handling. */
2356         for (int i = 0; i < op->od->nbr->n_nat; i++) {
2357             const struct nbrec_nat *nat;
2358
2359             nat = op->od->nbr->nat[i];
2360
2361             if(!strcmp(nat->type, "snat")) {
2362                 continue;
2363             }
2364
2365             ovs_be32 ip;
2366             if (!ip_parse(nat->external_ip, &ip) || !ip) {
2367                 static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 1);
2368                 VLOG_WARN_RL(&rl, "bad ip address %s in dnat configuration "
2369                              "for router %s", nat->external_ip, op->key);
2370                 continue;
2371             }
2372
2373             ds_clear(&match);
2374             ds_put_format(&match,
2375                           "inport == %s && arp.tpa == "IP_FMT" && arp.op == 1",
2376                           op->json_key, IP_ARGS(ip));
2377
2378             ds_clear(&actions);
2379             ds_put_format(&actions,
2380                 "eth.dst = eth.src; "
2381                 "eth.src = %s; "
2382                 "arp.op = 2; /* ARP reply */ "
2383                 "arp.tha = arp.sha; "
2384                 "arp.sha = %s; "
2385                 "arp.tpa = arp.spa; "
2386                 "arp.spa = "IP_FMT"; "
2387                 "outport = %s; "
2388                 "inport = \"\"; /* Allow sending out inport. */ "
2389                 "output;",
2390                 op->lrp_networks.ea_s,
2391                 op->lrp_networks.ea_s,
2392                 IP_ARGS(ip),
2393                 op->json_key);
2394             ovn_lflow_add(lflows, op->od, S_ROUTER_IN_IP_INPUT, 90,
2395                           ds_cstr(&match), ds_cstr(&actions));
2396         }
2397
2398         /* Drop IP traffic to this router, unless the router ip is used as
2399          * SNAT ip. */
2400         ovs_be32 *nat_ips = xmalloc(sizeof *nat_ips * op->od->nbr->n_nat);
2401         size_t n_nat_ips = 0;
2402         for (int i = 0; i < op->od->nbr->n_nat; i++) {
2403             const struct nbrec_nat *nat;
2404             ovs_be32 ip;
2405
2406             nat = op->od->nbr->nat[i];
2407             if (strcmp(nat->type, "snat")) {
2408                 continue;
2409             }
2410
2411             if (!ip_parse(nat->external_ip, &ip) || !ip) {
2412                 static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 1);
2413                 VLOG_WARN_RL(&rl, "bad ip address %s in snat configuration "
2414                          "for router %s", nat->external_ip, op->key);
2415                 continue;
2416             }
2417
2418             nat_ips[n_nat_ips++] = ip;
2419         }
2420
2421         ds_clear(&match);
2422         ds_put_cstr(&match, "ip4.dst == {");
2423         bool has_drop_ips = false;
2424         for (int i = 0; i < op->lrp_networks.n_ipv4_addrs; i++) {
2425             for (int j = 0; j < n_nat_ips; j++) {
2426                 if (op->lrp_networks.ipv4_addrs[i].addr == nat_ips[j]) {
2427                     continue;
2428                 }
2429             }
2430             ds_put_format(&match, "%s, ",
2431                           op->lrp_networks.ipv4_addrs[i].addr_s);
2432             has_drop_ips = true;
2433         }
2434         ds_chomp(&match, ' ');
2435         ds_chomp(&match, ',');
2436         ds_put_cstr(&match, "}");
2437
2438         if (has_drop_ips) {
2439             /* Drop IP traffic to this router. */
2440             ovn_lflow_add(lflows, op->od, S_ROUTER_IN_IP_INPUT, 60,
2441                           ds_cstr(&match), "drop;");
2442         }
2443
2444         free(nat_ips);
2445     }
2446
2447     /* NAT in Gateway routers. */
2448     HMAP_FOR_EACH (od, key_node, datapaths) {
2449         if (!od->nbr) {
2450             continue;
2451         }
2452
2453         /* Packets are allowed by default. */
2454         ovn_lflow_add(lflows, od, S_ROUTER_IN_UNSNAT, 0, "1", "next;");
2455         ovn_lflow_add(lflows, od, S_ROUTER_OUT_SNAT, 0, "1", "next;");
2456         ovn_lflow_add(lflows, od, S_ROUTER_IN_DNAT, 0, "1", "next;");
2457
2458         /* NAT rules are only valid on Gateway routers. */
2459         if (!smap_get(&od->nbr->options, "chassis")) {
2460             continue;
2461         }
2462
2463         for (int i = 0; i < od->nbr->n_nat; i++) {
2464             const struct nbrec_nat *nat;
2465
2466             nat = od->nbr->nat[i];
2467
2468             ovs_be32 ip, mask;
2469
2470             char *error = ip_parse_masked(nat->external_ip, &ip, &mask);
2471             if (error || mask != OVS_BE32_MAX) {
2472                 static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 1);
2473                 VLOG_WARN_RL(&rl, "bad external ip %s for nat",
2474                              nat->external_ip);
2475                 free(error);
2476                 continue;
2477             }
2478
2479             /* Check the validity of nat->logical_ip. 'logical_ip' can
2480              * be a subnet when the type is "snat". */
2481             error = ip_parse_masked(nat->logical_ip, &ip, &mask);
2482             if (!strcmp(nat->type, "snat")) {
2483                 if (error) {
2484                     static struct vlog_rate_limit rl =
2485                         VLOG_RATE_LIMIT_INIT(5, 1);
2486                     VLOG_WARN_RL(&rl, "bad ip network or ip %s for snat "
2487                                  "in router "UUID_FMT"",
2488                                  nat->logical_ip, UUID_ARGS(&od->key));
2489                     free(error);
2490                     continue;
2491                 }
2492             } else {
2493                 if (error || mask != OVS_BE32_MAX) {
2494                     static struct vlog_rate_limit rl =
2495                         VLOG_RATE_LIMIT_INIT(5, 1);
2496                     VLOG_WARN_RL(&rl, "bad ip %s for dnat in router "
2497                         ""UUID_FMT"", nat->logical_ip, UUID_ARGS(&od->key));
2498                     free(error);
2499                     continue;
2500                 }
2501             }
2502
2503             /* Ingress UNSNAT table: It is for already established connections'
2504              * reverse traffic. i.e., SNAT has already been done in egress
2505              * pipeline and now the packet has entered the ingress pipeline as
2506              * part of a reply. We undo the SNAT here.
2507              *
2508              * Undoing SNAT has to happen before DNAT processing.  This is
2509              * because when the packet was DNATed in ingress pipeline, it did
2510              * not know about the possibility of eventual additional SNAT in
2511              * egress pipeline. */
2512             if (!strcmp(nat->type, "snat")
2513                 || !strcmp(nat->type, "dnat_and_snat")) {
2514                 ds_clear(&match);
2515                 ds_put_format(&match, "ip && ip4.dst == %s", nat->external_ip);
2516                 ovn_lflow_add(lflows, od, S_ROUTER_IN_UNSNAT, 100,
2517                               ds_cstr(&match), "ct_snat; next;");
2518             }
2519
2520             /* Ingress DNAT table: Packets enter the pipeline with destination
2521              * IP address that needs to be DNATted from a external IP address
2522              * to a logical IP address. */
2523             if (!strcmp(nat->type, "dnat")
2524                 || !strcmp(nat->type, "dnat_and_snat")) {
2525                 /* Packet when it goes from the initiator to destination.
2526                  * We need to zero the inport because the router can
2527                  * send the packet back through the same interface. */
2528                 ds_clear(&match);
2529                 ds_put_format(&match, "ip && ip4.dst == %s", nat->external_ip);
2530                 ds_clear(&actions);
2531                 ds_put_format(&actions,"inport = \"\"; ct_dnat(%s);",
2532                               nat->logical_ip);
2533                 ovn_lflow_add(lflows, od, S_ROUTER_IN_DNAT, 100,
2534                               ds_cstr(&match), ds_cstr(&actions));
2535             }
2536
2537             /* Egress SNAT table: Packets enter the egress pipeline with
2538              * source ip address that needs to be SNATted to a external ip
2539              * address. */
2540             if (!strcmp(nat->type, "snat")
2541                 || !strcmp(nat->type, "dnat_and_snat")) {
2542                 ds_clear(&match);
2543                 ds_put_format(&match, "ip && ip4.src == %s", nat->logical_ip);
2544                 ds_clear(&actions);
2545                 ds_put_format(&actions, "ct_snat(%s);", nat->external_ip);
2546
2547                 /* The priority here is calculated such that the
2548                  * nat->logical_ip with the longest mask gets a higher
2549                  * priority. */
2550                 ovn_lflow_add(lflows, od, S_ROUTER_OUT_SNAT,
2551                               count_1bits(ntohl(mask)) + 1,
2552                               ds_cstr(&match), ds_cstr(&actions));
2553             }
2554         }
2555
2556         /* Re-circulate every packet through the DNAT zone.
2557         * This helps with two things.
2558         *
2559         * 1. Any packet that needs to be unDNATed in the reverse
2560         * direction gets unDNATed. Ideally this could be done in
2561         * the egress pipeline. But since the gateway router
2562         * does not have any feature that depends on the source
2563         * ip address being external IP address for IP routing,
2564         * we can do it here, saving a future re-circulation.
2565         *
2566         * 2. Any packet that was sent through SNAT zone in the
2567         * previous table automatically gets re-circulated to get
2568         * back the new destination IP address that is needed for
2569         * routing in the openflow pipeline. */
2570         ovn_lflow_add(lflows, od, S_ROUTER_IN_DNAT, 50,
2571                       "ip", "inport = \"\"; ct_dnat;");
2572     }
2573
2574     /* Logical router ingress table 4: IP Routing.
2575      *
2576      * A packet that arrives at this table is an IP packet that should be
2577      * routed to the address in ip4.dst. This table sets outport to the correct
2578      * output port, eth.src to the output port's MAC address, and reg0 to the
2579      * next-hop IP address (leaving ip4.dst, the packet’s final destination,
2580      * unchanged), and advances to the next table for ARP resolution. */
2581     HMAP_FOR_EACH (op, key_node, ports) {
2582         if (!op->nbr) {
2583             continue;
2584         }
2585
2586         for (int i = 0; i < op->lrp_networks.n_ipv4_addrs; i++) {
2587             add_route(lflows, op, op->lrp_networks.ipv4_addrs[i].addr_s,
2588                       op->lrp_networks.ipv4_addrs[i].network_s,
2589                       op->lrp_networks.ipv4_addrs[i].plen, NULL);
2590         }
2591     }
2592
2593     HMAP_FOR_EACH (od, key_node, datapaths) {
2594         if (!od->nbr) {
2595             continue;
2596         }
2597
2598         /* Convert the static routes to flows. */
2599         for (int i = 0; i < od->nbr->n_static_routes; i++) {
2600             const struct nbrec_logical_router_static_route *route;
2601
2602             route = od->nbr->static_routes[i];
2603             build_static_route_flow(lflows, od, ports, route);
2604         }
2605     }
2606     /* XXX destination unreachable */
2607
2608     /* Local router ingress table 5: ARP Resolution.
2609      *
2610      * Any packet that reaches this table is an IP packet whose next-hop IP
2611      * address is in reg0. (ip4.dst is the final destination.) This table
2612      * resolves the IP address in reg0 into an output port in outport and an
2613      * Ethernet address in eth.dst. */
2614     HMAP_FOR_EACH (op, key_node, ports) {
2615         if (op->nbr) {
2616             /* This is a logical router port. If next-hop IP address in 'reg0'
2617              * matches ip address of this router port, then the packet is
2618              * intended to eventually be sent to this logical port. Set the
2619              * destination mac address using this port's mac address.
2620              *
2621              * The packet is still in peer's logical pipeline. So the match
2622              * should be on peer's outport. */
2623             if (op->nbr->peer) {
2624                 struct ovn_port *peer = ovn_port_find(ports, op->nbr->peer);
2625                 if (!peer) {
2626                     continue;
2627                 }
2628
2629                 ds_clear(&match);
2630                 ds_put_format(&match, "outport == %s && reg0 == ",
2631                               peer->json_key);
2632                 op_put_networks(&match, op, false);
2633
2634                 ds_clear(&actions);
2635                 ds_put_format(&actions, "eth.dst = %s; next;",
2636                               op->lrp_networks.ea_s);
2637                 ovn_lflow_add(lflows, peer->od, S_ROUTER_IN_ARP_RESOLVE,
2638                               100, ds_cstr(&match), ds_cstr(&actions));
2639             }
2640         } else if (op->od->n_router_ports && strcmp(op->nbs->type, "router")) {
2641             /* This is a logical switch port that backs a VM or a container.
2642              * Extract its addresses. For each of the address, go through all
2643              * the router ports attached to the switch (to which this port
2644              * connects) and if the address in question is reachable from the
2645              * router port, add an ARP entry in that router's pipeline. */
2646
2647             for (size_t i = 0; i < op->n_lsp_addrs; i++) {
2648                 const char *ea_s = op->lsp_addrs[i].ea_s;
2649                 for (size_t j = 0; j < op->lsp_addrs[i].n_ipv4_addrs; j++) {
2650                     const char *ip_s = op->lsp_addrs[i].ipv4_addrs[j].addr_s;
2651                     for (size_t k = 0; k < op->od->n_router_ports; k++) {
2652                         /* Get the Logical_Router_Port that the
2653                          * Logical_Switch_Port is connected to, as
2654                          * 'peer'. */
2655                         const char *peer_name = smap_get(
2656                             &op->od->router_ports[k]->nbs->options,
2657                             "router-port");
2658                         if (!peer_name) {
2659                             continue;
2660                         }
2661
2662                         struct ovn_port *peer = ovn_port_find(ports, peer_name);
2663                         if (!peer || !peer->nbr) {
2664                             continue;
2665                         }
2666
2667                         if (!find_lrp_member_ip(peer, ip_s)) {
2668                             continue;
2669                         }
2670
2671                         ds_clear(&match);
2672                         ds_put_format(&match, "outport == %s && reg0 == %s",
2673                                       peer->json_key, ip_s);
2674
2675                         ds_clear(&actions);
2676                         ds_put_format(&actions, "eth.dst = %s; next;", ea_s);
2677                         ovn_lflow_add(lflows, peer->od,
2678                                       S_ROUTER_IN_ARP_RESOLVE, 100,
2679                                       ds_cstr(&match), ds_cstr(&actions));
2680                     }
2681                 }
2682             }
2683         } else if (!strcmp(op->nbs->type, "router")) {
2684             /* This is a logical switch port that connects to a router. */
2685
2686             /* The peer of this switch port is the router port for which
2687              * we need to add logical flows such that it can resolve
2688              * ARP entries for all the other router ports connected to
2689              * the switch in question. */
2690
2691             const char *peer_name = smap_get(&op->nbs->options,
2692                                              "router-port");
2693             if (!peer_name) {
2694                 continue;
2695             }
2696
2697             struct ovn_port *peer = ovn_port_find(ports, peer_name);
2698             if (!peer || !peer->nbr) {
2699                 continue;
2700             }
2701
2702             for (size_t i = 0; i < op->od->n_router_ports; i++) {
2703                 const char *router_port_name = smap_get(
2704                                     &op->od->router_ports[i]->nbs->options,
2705                                     "router-port");
2706                 struct ovn_port *router_port = ovn_port_find(ports,
2707                                                              router_port_name);
2708                 if (!router_port || !router_port->nbr) {
2709                     continue;
2710                 }
2711
2712                 /* Skip the router port under consideration. */
2713                 if (router_port == peer) {
2714                    continue;
2715                 }
2716
2717                 ds_clear(&match);
2718                 ds_put_format(&match, "outport == %s && reg0 == ",
2719                               peer->json_key);
2720                 op_put_networks(&match, router_port, false);
2721
2722                 ds_clear(&actions);
2723                 ds_put_format(&actions, "eth.dst = %s; next;",
2724                               router_port->lrp_networks.ea_s);
2725                 ovn_lflow_add(lflows, peer->od, S_ROUTER_IN_ARP_RESOLVE,
2726                               100, ds_cstr(&match), ds_cstr(&actions));
2727             }
2728         }
2729     }
2730
2731     HMAP_FOR_EACH (od, key_node, datapaths) {
2732         if (!od->nbr) {
2733             continue;
2734         }
2735
2736         ovn_lflow_add(lflows, od, S_ROUTER_IN_ARP_RESOLVE, 0, "1",
2737                       "get_arp(outport, reg0); next;");
2738     }
2739
2740     /* Local router ingress table 6: ARP request.
2741      *
2742      * In the common case where the Ethernet destination has been resolved,
2743      * this table outputs the packet (priority 0).  Otherwise, it composes
2744      * and sends an ARP request (priority 100). */
2745     HMAP_FOR_EACH (od, key_node, datapaths) {
2746         if (!od->nbr) {
2747             continue;
2748         }
2749
2750         ovn_lflow_add(lflows, od, S_ROUTER_IN_ARP_REQUEST, 100,
2751                       "eth.dst == 00:00:00:00:00:00",
2752                       "arp { "
2753                       "eth.dst = ff:ff:ff:ff:ff:ff; "
2754                       "arp.spa = reg1; "
2755                       "arp.op = 1; " /* ARP request */
2756                       "output; "
2757                       "};");
2758         ovn_lflow_add(lflows, od, S_ROUTER_IN_ARP_REQUEST, 0, "1", "output;");
2759     }
2760
2761     /* Logical router egress table 1: Delivery (priority 100).
2762      *
2763      * Priority 100 rules deliver packets to enabled logical ports. */
2764     HMAP_FOR_EACH (op, key_node, ports) {
2765         if (!op->nbr) {
2766             continue;
2767         }
2768
2769         if (!lrport_is_enabled(op->nbr)) {
2770             /* Drop packets to disabled logical ports (since logical flow
2771              * tables are default-drop). */
2772             continue;
2773         }
2774
2775         ds_clear(&match);
2776         ds_put_format(&match, "outport == %s", op->json_key);
2777         ovn_lflow_add(lflows, op->od, S_ROUTER_OUT_DELIVERY, 100,
2778                       ds_cstr(&match), "output;");
2779     }
2780
2781     ds_destroy(&match);
2782     ds_destroy(&actions);
2783 }
2784
2785 /* Updates the Logical_Flow and Multicast_Group tables in the OVN_SB database,
2786  * constructing their contents based on the OVN_NB database. */
2787 static void
2788 build_lflows(struct northd_context *ctx, struct hmap *datapaths,
2789              struct hmap *ports)
2790 {
2791     struct hmap lflows = HMAP_INITIALIZER(&lflows);
2792     struct hmap mcgroups = HMAP_INITIALIZER(&mcgroups);
2793
2794     build_lswitch_flows(datapaths, ports, &lflows, &mcgroups);
2795     build_lrouter_flows(datapaths, ports, &lflows);
2796
2797     /* Push changes to the Logical_Flow table to database. */
2798     const struct sbrec_logical_flow *sbflow, *next_sbflow;
2799     SBREC_LOGICAL_FLOW_FOR_EACH_SAFE (sbflow, next_sbflow, ctx->ovnsb_idl) {
2800         struct ovn_datapath *od
2801             = ovn_datapath_from_sbrec(datapaths, sbflow->logical_datapath);
2802         if (!od) {
2803             sbrec_logical_flow_delete(sbflow);
2804             continue;
2805         }
2806
2807         enum ovn_datapath_type dp_type = od->nbs ? DP_SWITCH : DP_ROUTER;
2808         enum ovn_pipeline pipeline
2809             = !strcmp(sbflow->pipeline, "ingress") ? P_IN : P_OUT;
2810         struct ovn_lflow *lflow = ovn_lflow_find(
2811             &lflows, od, ovn_stage_build(dp_type, pipeline, sbflow->table_id),
2812             sbflow->priority, sbflow->match, sbflow->actions);
2813         if (lflow) {
2814             ovn_lflow_destroy(&lflows, lflow);
2815         } else {
2816             sbrec_logical_flow_delete(sbflow);
2817         }
2818     }
2819     struct ovn_lflow *lflow, *next_lflow;
2820     HMAP_FOR_EACH_SAFE (lflow, next_lflow, hmap_node, &lflows) {
2821         enum ovn_pipeline pipeline = ovn_stage_get_pipeline(lflow->stage);
2822         uint8_t table = ovn_stage_get_table(lflow->stage);
2823
2824         sbflow = sbrec_logical_flow_insert(ctx->ovnsb_txn);
2825         sbrec_logical_flow_set_logical_datapath(sbflow, lflow->od->sb);
2826         sbrec_logical_flow_set_pipeline(
2827             sbflow, pipeline == P_IN ? "ingress" : "egress");
2828         sbrec_logical_flow_set_table_id(sbflow, table);
2829         sbrec_logical_flow_set_priority(sbflow, lflow->priority);
2830         sbrec_logical_flow_set_match(sbflow, lflow->match);
2831         sbrec_logical_flow_set_actions(sbflow, lflow->actions);
2832
2833         const struct smap ids = SMAP_CONST1(&ids, "stage-name",
2834                                             ovn_stage_to_str(lflow->stage));
2835         sbrec_logical_flow_set_external_ids(sbflow, &ids);
2836
2837         ovn_lflow_destroy(&lflows, lflow);
2838     }
2839     hmap_destroy(&lflows);
2840
2841     /* Push changes to the Multicast_Group table to database. */
2842     const struct sbrec_multicast_group *sbmc, *next_sbmc;
2843     SBREC_MULTICAST_GROUP_FOR_EACH_SAFE (sbmc, next_sbmc, ctx->ovnsb_idl) {
2844         struct ovn_datapath *od = ovn_datapath_from_sbrec(datapaths,
2845                                                           sbmc->datapath);
2846         if (!od) {
2847             sbrec_multicast_group_delete(sbmc);
2848             continue;
2849         }
2850
2851         struct multicast_group group = { .name = sbmc->name,
2852                                          .key = sbmc->tunnel_key };
2853         struct ovn_multicast *mc = ovn_multicast_find(&mcgroups, od, &group);
2854         if (mc) {
2855             ovn_multicast_update_sbrec(mc, sbmc);
2856             ovn_multicast_destroy(&mcgroups, mc);
2857         } else {
2858             sbrec_multicast_group_delete(sbmc);
2859         }
2860     }
2861     struct ovn_multicast *mc, *next_mc;
2862     HMAP_FOR_EACH_SAFE (mc, next_mc, hmap_node, &mcgroups) {
2863         sbmc = sbrec_multicast_group_insert(ctx->ovnsb_txn);
2864         sbrec_multicast_group_set_datapath(sbmc, mc->datapath->sb);
2865         sbrec_multicast_group_set_name(sbmc, mc->group->name);
2866         sbrec_multicast_group_set_tunnel_key(sbmc, mc->group->key);
2867         ovn_multicast_update_sbrec(mc, sbmc);
2868         ovn_multicast_destroy(&mcgroups, mc);
2869     }
2870     hmap_destroy(&mcgroups);
2871 }
2872
2873 /* OVN_Northbound and OVN_Southbound have an identical Address_Set table.
2874  * We always update OVN_Southbound to match the current data in
2875  * OVN_Northbound, so that the address sets used in Logical_Flows in
2876  * OVN_Southbound is checked against the proper set.*/
2877 static void
2878 sync_address_sets(struct northd_context *ctx)
2879 {
2880     struct shash sb_address_sets = SHASH_INITIALIZER(&sb_address_sets);
2881
2882     const struct sbrec_address_set *sb_address_set;
2883     SBREC_ADDRESS_SET_FOR_EACH (sb_address_set, ctx->ovnsb_idl) {
2884         shash_add(&sb_address_sets, sb_address_set->name, sb_address_set);
2885     }
2886
2887     const struct nbrec_address_set *nb_address_set;
2888     NBREC_ADDRESS_SET_FOR_EACH (nb_address_set, ctx->ovnnb_idl) {
2889         sb_address_set = shash_find_and_delete(&sb_address_sets,
2890                                                nb_address_set->name);
2891         if (!sb_address_set) {
2892             sb_address_set = sbrec_address_set_insert(ctx->ovnsb_txn);
2893             sbrec_address_set_set_name(sb_address_set, nb_address_set->name);
2894         }
2895
2896         sbrec_address_set_set_addresses(sb_address_set,
2897                 /* "char **" is not compatible with "const char **" */
2898                 (const char **) nb_address_set->addresses,
2899                 nb_address_set->n_addresses);
2900     }
2901
2902     struct shash_node *node, *next;
2903     SHASH_FOR_EACH_SAFE (node, next, &sb_address_sets) {
2904         sbrec_address_set_delete(node->data);
2905         shash_delete(&sb_address_sets, node);
2906     }
2907     shash_destroy(&sb_address_sets);
2908 }
2909 \f
2910 static void
2911 ovnnb_db_run(struct northd_context *ctx)
2912 {
2913     if (!ctx->ovnsb_txn) {
2914         return;
2915     }
2916     struct hmap datapaths, ports;
2917     build_datapaths(ctx, &datapaths);
2918     build_ports(ctx, &datapaths, &ports);
2919     build_lflows(ctx, &datapaths, &ports);
2920
2921     sync_address_sets(ctx);
2922
2923     struct ovn_datapath *dp, *next_dp;
2924     HMAP_FOR_EACH_SAFE (dp, next_dp, key_node, &datapaths) {
2925         ovn_datapath_destroy(&datapaths, dp);
2926     }
2927     hmap_destroy(&datapaths);
2928
2929     struct ovn_port *port, *next_port;
2930     HMAP_FOR_EACH_SAFE (port, next_port, key_node, &ports) {
2931         ovn_port_destroy(&ports, port);
2932     }
2933     hmap_destroy(&ports);
2934 }
2935
2936 /*
2937  * The only change we get notified about is if the 'chassis' column of the
2938  * 'Port_Binding' table changes.  When this column is not empty, it means we
2939  * need to set the corresponding logical port as 'up' in the northbound DB.
2940  */
2941 static void
2942 ovnsb_db_run(struct northd_context *ctx)
2943 {
2944     if (!ctx->ovnnb_txn) {
2945         return;
2946     }
2947     struct hmap lports_hmap;
2948     const struct sbrec_port_binding *sb;
2949     const struct nbrec_logical_switch_port *nb;
2950
2951     struct lport_hash_node {
2952         struct hmap_node node;
2953         const struct nbrec_logical_switch_port *nb;
2954     } *hash_node;
2955
2956     hmap_init(&lports_hmap);
2957
2958     NBREC_LOGICAL_SWITCH_PORT_FOR_EACH(nb, ctx->ovnnb_idl) {
2959         hash_node = xzalloc(sizeof *hash_node);
2960         hash_node->nb = nb;
2961         hmap_insert(&lports_hmap, &hash_node->node, hash_string(nb->name, 0));
2962     }
2963
2964     SBREC_PORT_BINDING_FOR_EACH(sb, ctx->ovnsb_idl) {
2965         nb = NULL;
2966         HMAP_FOR_EACH_WITH_HASH(hash_node, node,
2967                                 hash_string(sb->logical_port, 0),
2968                                 &lports_hmap) {
2969             if (!strcmp(sb->logical_port, hash_node->nb->name)) {
2970                 nb = hash_node->nb;
2971                 break;
2972             }
2973         }
2974
2975         if (!nb) {
2976             /* The logical port doesn't exist for this port binding.  This can
2977              * happen under normal circumstances when ovn-northd hasn't gotten
2978              * around to pruning the Port_Binding yet. */
2979             continue;
2980         }
2981
2982         if (sb->chassis && (!nb->up || !*nb->up)) {
2983             bool up = true;
2984             nbrec_logical_switch_port_set_up(nb, &up, 1);
2985         } else if (!sb->chassis && (!nb->up || *nb->up)) {
2986             bool up = false;
2987             nbrec_logical_switch_port_set_up(nb, &up, 1);
2988         }
2989     }
2990
2991     HMAP_FOR_EACH_POP(hash_node, node, &lports_hmap) {
2992         free(hash_node);
2993     }
2994     hmap_destroy(&lports_hmap);
2995 }
2996 \f
2997
2998 static char *default_nb_db_;
2999
3000 static const char *
3001 default_nb_db(void)
3002 {
3003     if (!default_nb_db_) {
3004         default_nb_db_ = xasprintf("unix:%s/ovnnb_db.sock", ovs_rundir());
3005     }
3006     return default_nb_db_;
3007 }
3008
3009 static char *default_sb_db_;
3010
3011 static const char *
3012 default_sb_db(void)
3013 {
3014     if (!default_sb_db_) {
3015         default_sb_db_ = xasprintf("unix:%s/ovnsb_db.sock", ovs_rundir());
3016     }
3017     return default_sb_db_;
3018 }
3019
3020 static void
3021 parse_options(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
3022 {
3023     enum {
3024         DAEMON_OPTION_ENUMS,
3025         VLOG_OPTION_ENUMS,
3026     };
3027     static const struct option long_options[] = {
3028         {"ovnsb-db", required_argument, NULL, 'd'},
3029         {"ovnnb-db", required_argument, NULL, 'D'},
3030         {"help", no_argument, NULL, 'h'},
3031         {"options", no_argument, NULL, 'o'},
3032         {"version", no_argument, NULL, 'V'},
3033         DAEMON_LONG_OPTIONS,
3034         VLOG_LONG_OPTIONS,
3035         STREAM_SSL_LONG_OPTIONS,
3036         {NULL, 0, NULL, 0},
3037     };
3038     char *short_options = ovs_cmdl_long_options_to_short_options(long_options);
3039
3040     for (;;) {
3041         int c;
3042
3043         c = getopt_long(argc, argv, short_options, long_options, NULL);
3044         if (c == -1) {
3045             break;
3046         }
3047
3048         switch (c) {
3049         DAEMON_OPTION_HANDLERS;
3050         VLOG_OPTION_HANDLERS;
3051         STREAM_SSL_OPTION_HANDLERS;
3052
3053         case 'd':
3054             ovnsb_db = optarg;
3055             break;
3056
3057         case 'D':
3058             ovnnb_db = optarg;
3059             break;
3060
3061         case 'h':
3062             usage();
3063             exit(EXIT_SUCCESS);
3064
3065         case 'o':
3066             ovs_cmdl_print_options(long_options);
3067             exit(EXIT_SUCCESS);
3068
3069         case 'V':
3070             ovs_print_version(0, 0);
3071             exit(EXIT_SUCCESS);
3072
3073         default:
3074             break;
3075         }
3076     }
3077
3078     if (!ovnsb_db) {
3079         ovnsb_db = default_sb_db();
3080     }
3081
3082     if (!ovnnb_db) {
3083         ovnnb_db = default_nb_db();
3084     }
3085
3086     free(short_options);
3087 }
3088
3089 static void
3090 add_column_noalert(struct ovsdb_idl *idl,
3091                    const struct ovsdb_idl_column *column)
3092 {
3093     ovsdb_idl_add_column(idl, column);
3094     ovsdb_idl_omit_alert(idl, column);
3095 }
3096
3097 int
3098 main(int argc, char *argv[])
3099 {
3100     int res = EXIT_SUCCESS;
3101     struct unixctl_server *unixctl;
3102     int retval;
3103     bool exiting;
3104
3105     fatal_ignore_sigpipe();
3106     set_program_name(argv[0]);
3107     service_start(&argc, &argv);
3108     parse_options(argc, argv);
3109
3110     daemonize_start(false);
3111
3112     retval = unixctl_server_create(NULL, &unixctl);
3113     if (retval) {
3114         exit(EXIT_FAILURE);
3115     }
3116     unixctl_command_register("exit", "", 0, 0, ovn_northd_exit, &exiting);
3117
3118     daemonize_complete();
3119
3120     nbrec_init();
3121     sbrec_init();
3122
3123     /* We want to detect all changes to the ovn-nb db. */
3124     struct ovsdb_idl_loop ovnnb_idl_loop = OVSDB_IDL_LOOP_INITIALIZER(
3125         ovsdb_idl_create(ovnnb_db, &nbrec_idl_class, true, true));
3126
3127     struct ovsdb_idl_loop ovnsb_idl_loop = OVSDB_IDL_LOOP_INITIALIZER(
3128         ovsdb_idl_create(ovnsb_db, &sbrec_idl_class, false, true));
3129
3130     ovsdb_idl_add_table(ovnsb_idl_loop.idl, &sbrec_table_logical_flow);
3131     add_column_noalert(ovnsb_idl_loop.idl,
3132                        &sbrec_logical_flow_col_logical_datapath);
3133     add_column_noalert(ovnsb_idl_loop.idl, &sbrec_logical_flow_col_pipeline);
3134     add_column_noalert(ovnsb_idl_loop.idl, &sbrec_logical_flow_col_table_id);
3135     add_column_noalert(ovnsb_idl_loop.idl, &sbrec_logical_flow_col_priority);
3136     add_column_noalert(ovnsb_idl_loop.idl, &sbrec_logical_flow_col_match);
3137     add_column_noalert(ovnsb_idl_loop.idl, &sbrec_logical_flow_col_actions);
3138
3139     ovsdb_idl_add_table(ovnsb_idl_loop.idl, &sbrec_table_multicast_group);
3140     add_column_noalert(ovnsb_idl_loop.idl,
3141                        &sbrec_multicast_group_col_datapath);
3142     add_column_noalert(ovnsb_idl_loop.idl,
3143                        &sbrec_multicast_group_col_tunnel_key);
3144     add_column_noalert(ovnsb_idl_loop.idl, &sbrec_multicast_group_col_name);
3145     add_column_noalert(ovnsb_idl_loop.idl, &sbrec_multicast_group_col_ports);
3146
3147     ovsdb_idl_add_table(ovnsb_idl_loop.idl, &sbrec_table_datapath_binding);
3148     add_column_noalert(ovnsb_idl_loop.idl,
3149                        &sbrec_datapath_binding_col_tunnel_key);
3150     add_column_noalert(ovnsb_idl_loop.idl,
3151                        &sbrec_datapath_binding_col_external_ids);
3152
3153     ovsdb_idl_add_table(ovnsb_idl_loop.idl, &sbrec_table_port_binding);
3154     add_column_noalert(ovnsb_idl_loop.idl, &sbrec_port_binding_col_datapath);
3155     add_column_noalert(ovnsb_idl_loop.idl,
3156                        &sbrec_port_binding_col_logical_port);
3157     add_column_noalert(ovnsb_idl_loop.idl,
3158                        &sbrec_port_binding_col_tunnel_key);
3159     add_column_noalert(ovnsb_idl_loop.idl,
3160                        &sbrec_port_binding_col_parent_port);
3161     add_column_noalert(ovnsb_idl_loop.idl, &sbrec_port_binding_col_tag);
3162     add_column_noalert(ovnsb_idl_loop.idl, &sbrec_port_binding_col_type);
3163     add_column_noalert(ovnsb_idl_loop.idl, &sbrec_port_binding_col_options);
3164     add_column_noalert(ovnsb_idl_loop.idl, &sbrec_port_binding_col_mac);
3165     ovsdb_idl_add_column(ovnsb_idl_loop.idl, &sbrec_port_binding_col_chassis);
3166
3167     ovsdb_idl_add_table(ovnsb_idl_loop.idl, &sbrec_table_address_set);
3168     add_column_noalert(ovnsb_idl_loop.idl, &sbrec_address_set_col_name);
3169     add_column_noalert(ovnsb_idl_loop.idl, &sbrec_address_set_col_addresses);
3170
3171     /* Main loop. */
3172     exiting = false;
3173     while (!exiting) {
3174         struct northd_context ctx = {
3175             .ovnnb_idl = ovnnb_idl_loop.idl,
3176             .ovnnb_txn = ovsdb_idl_loop_run(&ovnnb_idl_loop),
3177             .ovnsb_idl = ovnsb_idl_loop.idl,
3178             .ovnsb_txn = ovsdb_idl_loop_run(&ovnsb_idl_loop),
3179         };
3180
3181         ovnnb_db_run(&ctx);
3182         ovnsb_db_run(&ctx);
3183
3184         unixctl_server_run(unixctl);
3185         unixctl_server_wait(unixctl);
3186         if (exiting) {
3187             poll_immediate_wake();
3188         }
3189         ovsdb_idl_loop_commit_and_wait(&ovnnb_idl_loop);
3190         ovsdb_idl_loop_commit_and_wait(&ovnsb_idl_loop);
3191
3192         poll_block();
3193         if (should_service_stop()) {
3194             exiting = true;
3195         }
3196     }
3197
3198     unixctl_server_destroy(unixctl);
3199     ovsdb_idl_loop_destroy(&ovnnb_idl_loop);
3200     ovsdb_idl_loop_destroy(&ovnsb_idl_loop);
3201     service_stop();
3202
3203     free(default_nb_db_);
3204     free(default_sb_db_);
3205     exit(res);
3206 }
3207
3208 static void
3209 ovn_northd_exit(struct unixctl_conn *conn, int argc OVS_UNUSED,
3210                 const char *argv[] OVS_UNUSED, void *exiting_)
3211 {
3212     bool *exiting = exiting_;
3213     *exiting = true;
3214
3215     unixctl_command_reply(conn, NULL);
3216 }