]> git.proxmox.com Git - mirror_frr.git/commitdiff
*: add a vrf update hook to be informed of the vrf name
authorPhilippe Guibert <philippe.guibert@6wind.com>
Tue, 29 May 2018 09:17:10 +0000 (11:17 +0200)
committerPhilippe Guibert <philippe.guibert@6wind.com>
Tue, 28 Aug 2018 14:23:50 +0000 (16:23 +0200)
The Vrf aliases can be known with a specific hook. That hook will then,
from zebra propagate the information to the relevant zapi clients.
The registration hook function is the same for all daemons.

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
21 files changed:
bgpd/bgp_main.c
eigrpd/eigrp_main.c
isisd/isis_main.c
ldpd/ldpd.c
lib/vrf.c
lib/vrf.h
nhrpd/nhrp_main.c
ospf6d/ospf6_main.c
ospfd/ospfd.c
pbrd/pbr_main.c
pimd/pim_instance.c
ripd/rip_main.c
ripngd/ripng_main.c
sharpd/sharp_main.c
staticd/static_vrf.c
tests/bgpd/test_capability.c
tests/bgpd/test_mp_attr.c
tests/bgpd/test_mpath.c
tests/bgpd/test_packet.c
tests/bgpd/test_peer_attr.c
zebra/zebra_vrf.c

index 138788194dba7944914e1d222201727ed88d33e5..2308a32a23dd435c0a626da860e96df457f2bc79 100644 (file)
@@ -332,7 +332,8 @@ static int bgp_vrf_disable(struct vrf *vrf)
 
 static void bgp_vrf_init(void)
 {
-       vrf_init(bgp_vrf_new, bgp_vrf_enable, bgp_vrf_disable, bgp_vrf_delete);
+       vrf_init(bgp_vrf_new, bgp_vrf_enable, bgp_vrf_disable,
+                bgp_vrf_delete, NULL);
 }
 
 static void bgp_vrf_terminate(void)
index 31101a52d4f4d61dcf4dd72f6dedbd7350292991..9e9c4649fcb2f3166668a062b07092b39d9c7955 100644 (file)
@@ -170,7 +170,7 @@ int main(int argc, char **argv, char **envp)
        master = eigrp_om->master;
 
        eigrp_error_init();
-       vrf_init(NULL, NULL, NULL, NULL);
+       vrf_init(NULL, NULL, NULL, NULL, NULL);
 
        /*EIGRPd init*/
        eigrp_if_init();
index 5b18ab0a2c0d3c701ea815c581fa55f177e86567..3b4168adb97fca0597c1420186fb02bbe292c456 100644 (file)
@@ -192,7 +192,7 @@ int main(int argc, char **argv, char **envp)
         */
        isis_error_init();
        access_list_init();
-       vrf_init(NULL, NULL, NULL, NULL);
+       vrf_init(NULL, NULL, NULL, NULL, NULL);
        prefix_list_init();
        isis_init();
        isis_circuit_init();
index e830263ded81c9b5e4f964e352feebdfc3be71a8..935e959596587dbed50e960ac28f62b02ec9d66f 100644 (file)
@@ -330,7 +330,7 @@ main(int argc, char *argv[])
        master = frr_init();
 
        vty_config_lockless();
-       vrf_init(NULL, NULL, NULL, NULL);
+       vrf_init(NULL, NULL, NULL, NULL, NULL);
        access_list_init();
        ldp_vty_init();
        ldp_zebra_init(master);
index b7c5e5e9a668f79764be51e542ef4ba20d989b6a..0bb6a65bf6358c1184cd627cdfd6304e00ff3898 100644 (file)
--- a/lib/vrf.c
+++ b/lib/vrf.c
@@ -71,6 +71,7 @@ struct vrf_master {
        int (*vrf_delete_hook)(struct vrf *);
        int (*vrf_enable_hook)(struct vrf *);
        int (*vrf_disable_hook)(struct vrf *);
+       int (*vrf_update_name_hook)(struct vrf *vrf);
 } vrf_master = {
        0,
 };
@@ -461,7 +462,8 @@ static const struct cmd_variable_handler vrf_var_handlers[] = {
 
 /* Initialize VRF module. */
 void vrf_init(int (*create)(struct vrf *), int (*enable)(struct vrf *),
-             int (*disable)(struct vrf *), int (*delete)(struct vrf *))
+             int (*disable)(struct vrf *), int (*delete)(struct vrf *),
+             int ((*update)(struct vrf *)))
 {
        struct vrf *default_vrf;
 
@@ -475,6 +477,7 @@ void vrf_init(int (*create)(struct vrf *), int (*enable)(struct vrf *),
        vrf_master.vrf_enable_hook = enable;
        vrf_master.vrf_disable_hook = disable;
        vrf_master.vrf_delete_hook = delete;
+       vrf_master.vrf_update_name_hook = update;
 
        /* The default VRF always exists. */
        default_vrf = vrf_get(VRF_DEFAULT, VRF_DEFAULT_NAME);
@@ -897,6 +900,8 @@ void vrf_set_default_name(const char *default_name)
                        vrf_default_name, NS_NAMSIZ);
                strlcpy(def_vrf->name, vrf_default_name, sizeof(def_vrf->name));
                RB_INSERT(vrf_name_head, &vrfs_by_name, def_vrf);
+               if (vrf_master.vrf_update_name_hook)
+                       (*vrf_master.vrf_update_name_hook)(def_vrf);
        }
 }
 
index 7fb3f7ec81ab62cbd3d101a02bdcfcd1c15a3931..c962ac4c6941f83d49b6a6681c7413395e82a64c 100644 (file)
--- a/lib/vrf.h
+++ b/lib/vrf.h
@@ -199,8 +199,10 @@ extern int vrf_bitmap_check(vrf_bitmap_t, vrf_id_t);
  * delete -> Called back when a vrf is being deleted from
  *           the system ( 2 and 3 ) above.
  */
-extern void vrf_init(int (*create)(struct vrf *), int (*enable)(struct vrf *),
-                    int (*disable)(struct vrf *), int (*delete)(struct vrf *));
+extern void vrf_init(int (*create)(struct vrf *vrf), int (*enable)(struct vrf *vrf),
+                    int (*disable)(struct vrf *vrf), int (*delete)(struct vrf *vrf),
+                    int ((*update)(struct vrf *vrf)));
+
 /*
  * Call vrf_terminate when the protocol is being shutdown
  */
index e9f44e855862bc888ad5bab34cb66d53780a8357..737e70103e553e125c512ddc31a36b79e926c913 100644 (file)
@@ -130,7 +130,7 @@ int main(int argc, char **argv)
        /* Library inits. */
        master = frr_init();
        nhrp_error_init();
-       vrf_init(NULL, NULL, NULL, NULL);
+       vrf_init(NULL, NULL, NULL, NULL, NULL);
        nhrp_interface_init();
        resolver_init();
 
index 9580d87cf031c365431bf8a43a68923dd422e77d..eadc856cac25bc344effb7e440fd463d4bb96a0c 100644 (file)
@@ -208,7 +208,7 @@ int main(int argc, char *argv[], char *envp[])
        /* thread master */
        master = frr_init();
 
-       vrf_init(NULL, NULL, NULL, NULL);
+       vrf_init(NULL, NULL, NULL, NULL, NULL);
        access_list_init();
        prefix_list_init();
 
index bfaedf2fe70236495ac6906007a923df275017f2..62de94a475dd05df439cfaf24c91ec52558db1fe 100644 (file)
@@ -2149,7 +2149,7 @@ static int ospf_vrf_disable(struct vrf *vrf)
 void ospf_vrf_init(void)
 {
        vrf_init(ospf_vrf_new, ospf_vrf_enable, ospf_vrf_disable,
-                ospf_vrf_delete);
+                ospf_vrf_delete, NULL);
 }
 
 void ospf_vrf_terminate(void)
index ba0962108375eeabdd75a2282a8c41e44325bd4e..f555ccc056bd5ddf69a4ec0d77ddf5f402ab1fb8 100644 (file)
@@ -146,7 +146,7 @@ int main(int argc, char **argv, char **envp)
 
        pbr_debug_init();
 
-       vrf_init(NULL, NULL, NULL, NULL);
+       vrf_init(NULL, NULL, NULL, NULL, NULL);
        nexthop_group_init(pbr_nhgroup_add_cb,
                           pbr_nhgroup_add_nexthop_cb,
                           pbr_nhgroup_del_nexthop_cb,
index 8dc48cc004615b2e06cf81d9b979777a7b312c02..bf8d05d1e117671e1cb946a9bcd53bf193089d40 100644 (file)
@@ -196,7 +196,8 @@ static int pim_vrf_config_write(struct vty *vty)
 
 void pim_vrf_init(void)
 {
-       vrf_init(pim_vrf_new, pim_vrf_enable, pim_vrf_disable, pim_vrf_delete);
+       vrf_init(pim_vrf_new, pim_vrf_enable, pim_vrf_disable,
+                pim_vrf_delete, NULL);
 
        vrf_cmd_init(pim_vrf_config_write, &pimd_privs);
 }
index e5a5c3e227ff8895b02d76dd7dc46b4324744bda..16087c2349ee5963a78d502c32cd0911052e281f 100644 (file)
@@ -170,7 +170,7 @@ int main(int argc, char **argv)
        /* Library initialization. */
        rip_error_init();
        keychain_init();
-       vrf_init(NULL, NULL, NULL, NULL);
+       vrf_init(NULL, NULL, NULL, NULL, NULL);
 
        /* RIP related initialization. */
        rip_init();
index e4501d6f80aa5d1687c01e9e6dea86fb69b08be0..bc81a956d6cffd5957f4da544d23b3d8f2064826 100644 (file)
@@ -166,7 +166,7 @@ int main(int argc, char **argv)
        master = frr_init();
 
        /* Library inits. */
-       vrf_init(NULL, NULL, NULL, NULL);
+       vrf_init(NULL, NULL, NULL, NULL, NULL);
 
        /* RIPngd inits. */
        ripng_init();
index f0e6e3db4acfe60a27d6c650df78d4c41fa808ce..65b1837f68f14a50c1075822a22e91443456b2a4 100644 (file)
@@ -146,7 +146,7 @@ int main(int argc, char **argv, char **envp)
 
        master = frr_init();
 
-       vrf_init(NULL, NULL, NULL, NULL);
+       vrf_init(NULL, NULL, NULL, NULL, NULL);
 
        access_list_init();
        route_map_init();
index 6946f21271e455a602d83597e67683e880f96225..d33c1539c8142cb4fc21350e02067b05ad99db6a 100644 (file)
@@ -190,7 +190,7 @@ int static_vrf_has_config(struct static_vrf *svrf)
 void static_vrf_init(void)
 {
        vrf_init(static_vrf_new, static_vrf_enable,
-                static_vrf_disable, static_vrf_delete);
+                static_vrf_disable, static_vrf_delete, NULL);
 
        vrf_cmd_init(static_vrf_config_write, &static_privs);
 }
index fef7d39ff5904923733dbcc45c26c16d5d977cbc..83af5e9c6dffd773a3609f976d6b5a77d8c84519 100644 (file)
@@ -913,7 +913,7 @@ int main(void)
        qobj_init();
        master = thread_master_create(NULL);
        bgp_master_init(master);
-       vrf_init(NULL, NULL, NULL, NULL);
+       vrf_init(NULL, NULL, NULL, NULL, NULL);
        bgp_option_set(BGP_OPT_NO_LISTEN);
 
        bgp_pthreads_init();
index 8db1cb2ca1d385edea51cae5fdaf26d4f1693114..603b678cf17621b311327941cad84441489cc798 100644 (file)
@@ -1079,7 +1079,7 @@ int main(void)
        bgp_vty_init();
        master = thread_master_create("test mp attr");
        bgp_master_init(master);
-       vrf_init(NULL, NULL, NULL, NULL);
+       vrf_init(NULL, NULL, NULL, NULL, NULL);
        bgp_option_set(BGP_OPT_NO_LISTEN);
        bgp_attr_init();
 
index d8d2286bf7c92c808577fc74f07c4dac07eecdc0..42f7d767597b68564a723b8aa8b95303b099a574 100644 (file)
@@ -379,7 +379,7 @@ static int global_test_init(void)
        master = thread_master_create(NULL);
        zclient = zclient_new_notify(master, &zclient_options_default);
        bgp_master_init(master);
-       vrf_init(NULL, NULL, NULL, NULL);
+       vrf_init(NULL, NULL, NULL, NULL, NULL);
        bgp_option_set(BGP_OPT_NO_LISTEN);
 
        if (fileno(stdout) >= 0)
index c58a85eed37a3c2097ef7caf623aaaf02748ba8c..9719aceec99b01e29823a5506894cee69baf28db 100644 (file)
@@ -59,7 +59,7 @@ int main(int argc, char *argv[])
        bgp_attr_init();
        master = thread_master_create(NULL);
        bgp_master_init(master);
-       vrf_init(NULL, NULL, NULL, NULL);
+       vrf_init(NULL, NULL, NULL, NULL, NULL);
        bgp_option_set(BGP_OPT_NO_LISTEN);
 
        if (bgp_get(&bgp, &asn, NULL, BGP_INSTANCE_TYPE_DEFAULT))
index 16bd5d96dab51e53d8cdbaffb12c6467d431cf3b..452245ec16fa75bc981e7c9db0f3bc73a274525a 100644 (file)
@@ -1387,7 +1387,7 @@ static void bgp_startup(void)
        master = thread_master_create(NULL);
        bgp_master_init(master);
        bgp_option_set(BGP_OPT_NO_LISTEN);
-       vrf_init(NULL, NULL, NULL, NULL);
+       vrf_init(NULL, NULL, NULL, NULL, NULL);
        bgp_init();
        bgp_pthreads_run();
 }
index 05ae418b57f039cfa23a3c15bc95818e1e128fda..be8f879246b8ae3be58f405cbeee2d44bbd2c41a 100644 (file)
@@ -282,6 +282,19 @@ static int zebra_vrf_delete(struct vrf *vrf)
        return 0;
 }
 
+static int zebra_vrf_update(struct vrf *vrf)
+{
+       struct zebra_vrf *zvrf = vrf->info;
+
+       assert(zvrf);
+       if (IS_ZEBRA_DEBUG_EVENT)
+               zlog_debug("VRF %s id %u, name updated", vrf->name,
+                          zvrf_id(zvrf));
+       zebra_vrf_add_update(zvrf);
+       return 0;
+}
+
+
 /* Return if this VRF has any FRR configuration or not.
  * IMPORTANT: This function needs to be updated when additional configuration
  * is added for a VRF.
@@ -491,7 +504,7 @@ static int vrf_config_write(struct vty *vty)
 void zebra_vrf_init(void)
 {
        vrf_init(zebra_vrf_new, zebra_vrf_enable, zebra_vrf_disable,
-                zebra_vrf_delete);
+                zebra_vrf_delete, zebra_vrf_update);
 
        vrf_cmd_init(vrf_config_write, &zserv_privs);
 }