diff options
author | Feng Lu <lu.feng@6wind.com> | 2015-05-22 11:40:09 +0200 |
---|---|---|
committer | David Lamparter <equinox@opensourcerouting.org> | 2015-06-02 07:48:34 +0200 |
commit | 267ceb2ce3adf4ce1357deb7ce48f151d6c58b92 (patch) | |
tree | 0b86ed01d5d2ea61f0bb509a60cad32916de061e /zebra/test_main.c | |
parent | fb2bfc1ba2416c1561bc9bfb30dfb5adf3e65616 (diff) | |
download | quagga-267ceb2ce3adf4ce1357deb7ce48f151d6c58b92.tar.bz2 quagga-267ceb2ce3adf4ce1357deb7ce48f151d6c58b92.tar.xz |
zebra: add hooks upon enabling / disabling a VRF
zebra_vrf_enable() is the callback for VRF_ENABLE_HOOK.
It presently needs do nothing.
zebra_vrf_disable() is the callback for VRF_DISABLE_HOOK.
It presently withdraws routes, shuts down interfaces, and
clears the router-id candidates in that VRF.
Signed-off-by: Feng Lu <lu.feng@6wind.com>
Reviewed-by: Alain Ritoux <alain.ritoux@6wind.com>
Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
Acked-by: Vincent JARDIN <vincent.jardin@6wind.com>
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
Diffstat (limited to 'zebra/test_main.c')
-rw-r--r-- | zebra/test_main.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/zebra/test_main.c b/zebra/test_main.c index aad616f7..17014ea7 100644 --- a/zebra/test_main.c +++ b/zebra/test_main.c @@ -212,11 +212,48 @@ zebra_vrf_new (vrf_id_t vrf_id, void **info) return 0; } +/* Callback upon enabling a VRF. */ +static int +zebra_vrf_enable (vrf_id_t vrf_id, void **info) +{ + struct zebra_vrf *zvrf = (struct zebra_vrf *) (*info); + + assert (zvrf); + + return 0; +} + +/* Callback upon disabling a VRF. */ +static int +zebra_vrf_disable (vrf_id_t vrf_id, void **info) +{ + struct zebra_vrf *zvrf = (struct zebra_vrf *) (*info); + struct listnode *list_node; + struct interface *ifp; + + assert (zvrf); + + rib_close_table (zvrf->table[AFI_IP][SAFI_UNICAST]); + rib_close_table (zvrf->table[AFI_IP6][SAFI_UNICAST]); + + for (ALL_LIST_ELEMENTS_RO (vrf_iflist (vrf_id), list_node, ifp)) + { + int operative = if_is_operative (ifp); + UNSET_FLAG (ifp->flags, IFF_UP); + if (operative) + if_down (ifp); + } + + return 0; +} + /* Zebra VRF initialization. */ static void zebra_vrf_init (void) { vrf_add_hook (VRF_NEW_HOOK, zebra_vrf_new); + vrf_add_hook (VRF_ENABLE_HOOK, zebra_vrf_enable); + vrf_add_hook (VRF_DISABLE_HOOK, zebra_vrf_disable); vrf_init (); } |