]> git.puffer.fish Git - mirror/frr.git/commitdiff
lib,sharpd,pbrd: `set installable` nhg command
authorStephen Worley <sworley@cumulusnetworks.com>
Wed, 27 May 2020 21:39:41 +0000 (17:39 -0400)
committerStephen Worley <sworley@cumulusnetworks.com>
Mon, 28 Sep 2020 16:40:59 +0000 (12:40 -0400)
Add a command `set installable` that allows configured nexthop
groups to be treated as separate/installable objects in the RIB.

A callback needs to be implemented per daemon to handle installing
the NHG into the rib via zapi when this command is set. This
patch includes the implementation for sharpd.

Signed-off-by: Stephen Worley <sworley@cumulusnetworks.com>
doc/user/pbr.rst
lib/nexthop_group.c
lib/nexthop_group.h
pbrd/pbr_main.c
sharpd/sharp_nht.c

index c869c6bc450a3d25ddbb2b645600efbb2b861ddc..a57a176f3c0f1e094be5b9a9b869b00388e54e3b 100644 (file)
@@ -45,6 +45,17 @@ listing of ECMP nexthops used to forward packets for when a pbr-map is matched.
    are used to are allowed here.  The syntax was intentionally kept the same as
    creating nexthops as you would for static routes.
 
+.. clicmd:: set installable
+
+   Sets the nexthop group to be installable i.e. treated as a separate object in
+   the protocol client and zebra's RIB. The proto will send down the object
+   separately from the route to install into into the RIB and dataplane.
+
+.. note::
+   ``set installable`` is only supported for groups with onlink, interface, and
+   gateway/interface nexthop types at the moment. Recursive nexthops
+   (gateway only) are considered undefined behavior.
+
 .. clicmd:: [no] pbr table range (10000-4294966272) (10000-4294966272)
 
    Set or unset the range used to assign numeric table ID's to new
index 83905abe4363c37d544245323408cbc4eac8d5db..136970cff425221a5f6c0e75d39f755c0222bb99 100644 (file)
@@ -54,6 +54,7 @@ struct nexthop_group_hooks {
        void (*del_nexthop)(const struct nexthop_group_cmd *nhg,
                            const struct nexthop *nhop);
        void (*delete)(const char *name);
+       void (*installable)(const struct nexthop_group_cmd *nhg);
 };
 
 static struct nexthop_group_hooks nhg_hooks;
@@ -675,6 +676,37 @@ DEFPY(no_nexthop_group_backup, no_nexthop_group_backup_cmd,
        return CMD_SUCCESS;
 }
 
+DEFPY(set_installable, set_installable_cmd,
+      "set installable",
+      "Set for nexthop-group\n"
+      "Install nexthop-group into RIB as separate object\n")
+{
+       VTY_DECLVAR_CONTEXT(nexthop_group_cmd, nhgc);
+
+       nhgc->installable = true;
+
+       if (nhg_hooks.installable)
+               nhg_hooks.installable(nhgc);
+
+       return CMD_SUCCESS;
+}
+
+DEFPY(no_set_installable, no_set_installable_cmd,
+      "no set installable",
+      NO_STR
+      "Set for nexthop-group\n"
+      "Install nexthop-group into RIB as separate object\n")
+{
+       VTY_DECLVAR_CONTEXT(nexthop_group_cmd, nhgc);
+
+       nhgc->installable = false;
+
+       if (nhg_hooks.installable)
+               nhg_hooks.installable(nhgc);
+
+       return CMD_SUCCESS;
+}
+
 static void nexthop_group_save_nhop(struct nexthop_group_cmd *nhgc,
                                    const char *nhvrf_name,
                                    const union sockunion *addr,
@@ -1147,6 +1179,9 @@ static int nexthop_group_write(struct vty *vty)
 
                vty_out(vty, "nexthop-group %s\n", nhgc->name);
 
+               if (nhgc->installable)
+                       vty_out(vty, " set installable\n");
+
                if (nhgc->backup_list_name[0])
                        vty_out(vty, " backup-group %s\n",
                                nhgc->backup_list_name);
@@ -1316,12 +1351,14 @@ static const struct cmd_variable_handler nhg_name_handlers[] = {
        {.tokenname = "NHGNAME", .completions = nhg_name_autocomplete},
        {.completions = NULL}};
 
-void nexthop_group_init(void (*new)(const char *name),
-                       void (*add_nexthop)(const struct nexthop_group_cmd *nhg,
-                                           const struct nexthop *nhop),
-                       void (*del_nexthop)(const struct nexthop_group_cmd *nhg,
-                                           const struct nexthop *nhop),
-                       void (*delete)(const char *name))
+void nexthop_group_init(
+       void (*new)(const char *name),
+       void (*add_nexthop)(const struct nexthop_group_cmd *nhg,
+                           const struct nexthop *nhop),
+       void (*del_nexthop)(const struct nexthop_group_cmd *nhg,
+                           const struct nexthop *nhop),
+       void (*delete)(const char *name),
+       void (*installable)(const struct nexthop_group_cmd *nhg))
 {
        RB_INIT(nhgc_entry_head, &nhgc_entries);
 
@@ -1334,6 +1371,8 @@ void nexthop_group_init(void (*new)(const char *name),
        install_default(NH_GROUP_NODE);
        install_element(NH_GROUP_NODE, &nexthop_group_backup_cmd);
        install_element(NH_GROUP_NODE, &no_nexthop_group_backup_cmd);
+       install_element(NH_GROUP_NODE, &set_installable_cmd);
+       install_element(NH_GROUP_NODE, &no_set_installable_cmd);
        install_element(NH_GROUP_NODE, &ecmp_nexthops_cmd);
 
        memset(&nhg_hooks, 0, sizeof(nhg_hooks));
@@ -1346,4 +1385,6 @@ void nexthop_group_init(void (*new)(const char *name),
                nhg_hooks.del_nexthop = del_nexthop;
        if (delete)
                nhg_hooks.delete = delete;
+       if (installable)
+               nhg_hooks.installable = installable;
 }
index 5f7bde0defbd1bb470723b8e4d49fe67c435db3b..e06035ce68386d3a0e409a1178004878c9adb70b 100644 (file)
@@ -97,6 +97,9 @@ struct nexthop_group_cmd {
 
        struct list *nhg_list;
 
+       /* Install nhg as separate object in RIB */
+       bool installable;
+
        QOBJ_FIELDS
 };
 RB_HEAD(nhgc_entry_head, nexthp_group_cmd);
@@ -116,7 +119,8 @@ void nexthop_group_init(
                            const struct nexthop *nhop),
        void (*del_nexthop)(const struct nexthop_group_cmd *nhgc,
                            const struct nexthop *nhop),
-       void (*destroy)(const char *name));
+       void (*destroy)(const char *name),
+       void (*installable)(const struct nexthop_group_cmd *nhg));
 
 void nexthop_group_enable_vrf(struct vrf *vrf);
 void nexthop_group_disable_vrf(struct vrf *vrf);
index 9a9edd79c6712266b4f6c0e26a8fd8ea36f07ea3..bae8be4f956aca34a363d8397f683b702f2223e8 100644 (file)
@@ -157,10 +157,9 @@ int main(int argc, char **argv, char **envp)
 
        pbr_debug_init();
 
-       nexthop_group_init(pbr_nhgroup_add_cb,
-                          pbr_nhgroup_add_nexthop_cb,
-                          pbr_nhgroup_del_nexthop_cb,
-                          pbr_nhgroup_delete_cb);
+       nexthop_group_init(pbr_nhgroup_add_cb, pbr_nhgroup_add_nexthop_cb,
+                          pbr_nhgroup_del_nexthop_cb, pbr_nhgroup_delete_cb,
+                          NULL);
 
        /*
         * So we safely ignore these commands since
index 731d58e560b04cf45550fe3fbfa2ec03c23245b2..e76b1016a8fe8eec98835f6edeaf242ee2ed1d7f 100644 (file)
@@ -78,6 +78,8 @@ struct sharp_nhg {
        uint32_t id;
 
        char name[256];
+
+       bool installable;
 };
 
 static uint32_t nhg_id;
@@ -120,7 +122,9 @@ static void sharp_nhgroup_add_nexthop_cb(const struct nexthop_group_cmd *nhgc,
        strncpy(lookup.name, nhgc->name, sizeof(lookup.name));
        snhg = sharp_nhg_rb_find(&nhg_head, &lookup);
 
-       nhg_add(snhg->id, &nhgc->nhg);
+       if (snhg->installable)
+               nhg_add(snhg->id, &nhgc->nhg);
+
        return;
 }
 
@@ -133,7 +137,9 @@ static void sharp_nhgroup_del_nexthop_cb(const struct nexthop_group_cmd *nhgc,
        strncpy(lookup.name, nhgc->name, sizeof(lookup.name));
        snhg = sharp_nhg_rb_find(&nhg_head, &lookup);
 
-       nhg_add(snhg->id, &nhgc->nhg);
+       if (snhg->installable)
+               nhg_add(snhg->id, &nhgc->nhg);
+
        return;
 }
 
@@ -147,12 +153,34 @@ static void sharp_nhgroup_delete_cb(const char *name)
        if (!snhg)
                return;
 
-       nhg_del(snhg->id);
+       if (snhg->installable)
+               nhg_del(snhg->id);
+
        sharp_nhg_rb_del(&nhg_head, snhg);
        XFREE(MTYPE_NHG, snhg);
        return;
 }
 
+static void sharp_nhgroup_installable_cb(const struct nexthop_group_cmd *nhgc)
+{
+       struct sharp_nhg lookup;
+       struct sharp_nhg *snhg;
+
+       strncpy(lookup.name, nhgc->name, sizeof(lookup.name));
+       snhg = sharp_nhg_rb_find(&nhg_head, &lookup);
+       if (!snhg)
+               return;
+
+       snhg->installable = nhgc->installable;
+
+       if (snhg->installable)
+               nhg_add(snhg->id, &nhgc->nhg);
+       else
+               nhg_del(snhg->id);
+
+       return;
+}
+
 uint32_t sharp_nhgroup_get_id(const char *name)
 {
        struct sharp_nhg lookup;
@@ -163,6 +191,9 @@ uint32_t sharp_nhgroup_get_id(const char *name)
        if (!snhg)
                return 0;
 
+       if (!snhg->installable)
+               return 0;
+
        return snhg->id;
 }
 
@@ -173,5 +204,6 @@ void sharp_nhgroup_init(void)
 
        nexthop_group_init(sharp_nhgroup_add_cb, sharp_nhgroup_add_nexthop_cb,
                           sharp_nhgroup_del_nexthop_cb,
-                          sharp_nhgroup_delete_cb);
+                          sharp_nhgroup_delete_cb,
+                          sharp_nhgroup_installable_cb);
 }