From: David Lamparter Date: Sun, 6 Aug 2017 06:08:39 +0000 (+0200) Subject: zebra: start detangling rtadv & irdp X-Git-Tag: frr-4.0-dev~394^2~3 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=2eb27eecf011a06c01e58a735d8bf087d7519979;p=matthieu%2Ffrr.git zebra: start detangling rtadv & irdp Replace some cross-dependencies with hooks & move bits to where they belong. Signed-off-by: David Lamparter --- diff --git a/zebra/interface.c b/zebra/interface.c index 48158c82c4..c17e408ea0 100644 --- a/zebra/interface.c +++ b/zebra/interface.c @@ -52,11 +52,10 @@ #define ZEBRA_PTM_SUPPORT -#if defined(HAVE_RTADV) -/* Order is intentional. Matches RFC4191. This array is also used for - command matching, so only modify with care. */ -const char *rtadv_pref_strs[] = {"medium", "high", "INVALID", "low", 0}; -#endif /* HAVE_RTADV */ +DEFINE_HOOK(zebra_if_extra_info, (struct vty *vty, struct interface *ifp), + (vty, ifp)) +DEFINE_HOOK(zebra_if_config_wr, (struct vty *vty, struct interface *ifp), + (vty, ifp)) static void if_down_del_nbr_connected(struct interface *ifp); @@ -996,74 +995,6 @@ static void nbr_connected_dump_vty(struct vty *vty, vty_out(vty, "\n"); } -#if defined(HAVE_RTADV) -/* Dump interface ND information to vty. */ -static void nd_dump_vty(struct vty *vty, struct interface *ifp) -{ - struct zebra_if *zif; - struct rtadvconf *rtadv; - int interval; - - zif = (struct zebra_if *)ifp->info; - rtadv = &zif->rtadv; - - if (rtadv->AdvSendAdvertisements) { - vty_out(vty, - " ND advertised reachable time is %d milliseconds\n", - rtadv->AdvReachableTime); - vty_out(vty, - " ND advertised retransmit interval is %d milliseconds\n", - rtadv->AdvRetransTimer); - vty_out(vty, " ND router advertisements sent: %d rcvd: %d\n", - zif->ra_sent, zif->ra_rcvd); - interval = rtadv->MaxRtrAdvInterval; - if (interval % 1000) - vty_out(vty, - " ND router advertisements are sent every " - "%d milliseconds\n", - interval); - else - vty_out(vty, - " ND router advertisements are sent every " - "%d seconds\n", - interval / 1000); - if (rtadv->AdvDefaultLifetime != -1) - vty_out(vty, - " ND router advertisements live for %d seconds\n", - rtadv->AdvDefaultLifetime); - else - vty_out(vty, - " ND router advertisements lifetime tracks ra-interval\n"); - vty_out(vty, - " ND router advertisement default router preference is " - "%s\n", - rtadv_pref_strs[rtadv->DefaultPreference]); - if (rtadv->AdvManagedFlag) - vty_out(vty, - " Hosts use DHCP to obtain routable addresses.\n"); - else - vty_out(vty, - " Hosts use stateless autoconfig for addresses.\n"); - if (rtadv->AdvHomeAgentFlag) { - vty_out(vty, - " ND router advertisements with Home Agent flag bit set.\n"); - if (rtadv->HomeAgentLifetime != -1) - vty_out(vty, - " Home Agent lifetime is %u seconds\n", - rtadv->HomeAgentLifetime); - else - vty_out(vty, - " Home Agent lifetime tracks ra-lifetime\n"); - vty_out(vty, " Home Agent preference is %u\n", - rtadv->HomeAgentPreference); - } - if (rtadv->AdvIntervalOption) - vty_out(vty, - " ND router advertisements with Adv. Interval option.\n"); - } -} -#endif /* HAVE_RTADV */ - static const char *zebra_ziftype_2str(zebra_iftype_t zif_type) { switch (zif_type) { @@ -1277,12 +1208,8 @@ static void if_dump_vty(struct vty *vty, struct interface *ifp) inet_ntoa(iflp->rmt_ip), iflp->rmt_as); } -#ifdef RTADV - nd_dump_vty(vty, ifp); -#endif /* RTADV */ -#if defined(HAVE_RTADV) - nd_dump_vty(vty, ifp); -#endif /* HAVE_RTADV */ + hook_call(zebra_if_extra_info, vty, ifp); + if (listhead(ifp->nbr_connected)) vty_out(vty, " Neighbor address(s):\n"); for (ALL_LIST_ELEMENTS_RO(ifp->nbr_connected, node, nbr_connected)) @@ -2911,13 +2838,7 @@ static int if_config_write(struct vty *vty) : "no "); } -#if defined(HAVE_RTADV) - rtadv_config_write(vty, ifp); -#endif /* HAVE_RTADV */ - -#ifdef HAVE_IRDP - irdp_config_write(vty, ifp); -#endif /* IRDP */ + hook_call(zebra_if_config_wr, vty, ifp); link_params_config_write(vty, ifp); diff --git a/zebra/interface.h b/zebra/interface.h index 970c3c5292..7b56dcd4a4 100644 --- a/zebra/interface.h +++ b/zebra/interface.h @@ -23,10 +23,7 @@ #include "redistribute.h" #include "vrf.h" - -#ifdef HAVE_IRDP -#include "zebra/irdp.h" -#endif +#include "hook.h" #include "zebra/zebra_l2.h" @@ -202,6 +199,8 @@ typedef enum { ZEBRA_IF_SLAVE_OTHER, /* Something else - e.g., bond slave */ } zebra_slave_iftype_t; +struct irdp_interface; + /* `zebra' daemon local interface structure. */ struct zebra_if { /* Shutdown configuration. */ @@ -227,9 +226,7 @@ struct zebra_if { unsigned int ra_sent, ra_rcvd; #endif /* HAVE_RTADV */ -#ifdef HAVE_IRDP - struct irdp_interface irdp; -#endif + struct irdp_interface *irdp; #ifdef HAVE_STRUCT_SOCKADDR_DL union { @@ -273,6 +270,11 @@ struct zebra_if { struct interface *link; }; +DECLARE_HOOK(zebra_if_extra_info, (struct vty *vty, struct interface *ifp), + (vty, ifp)) +DECLARE_HOOK(zebra_if_config_wr, (struct vty *vty, struct interface *ifp), + (vty, ifp)) + static inline void zebra_if_set_ziftype(struct interface *ifp, zebra_iftype_t zif_type, zebra_slave_iftype_t zif_slave_type) diff --git a/zebra/irdp.h b/zebra/irdp.h index 01308b915b..f8f7811248 100644 --- a/zebra/irdp.h +++ b/zebra/irdp.h @@ -139,9 +139,9 @@ struct Adv { }; extern void irdp_init(void); +extern void irdp_if_init(void); extern int irdp_sock_init(void); -extern void irdp_finish(void); -extern void irdp_config_write(struct vty *, struct interface *); +extern int irdp_config_write(struct vty *, struct interface *); extern int irdp_send_thread(struct thread *t_advert); extern void irdp_advert_off(struct interface *ifp); extern void process_solicit(struct interface *ifp); diff --git a/zebra/irdp_interface.c b/zebra/irdp_interface.c index 5682e12e6f..032090adf2 100644 --- a/zebra/irdp_interface.c +++ b/zebra/irdp_interface.c @@ -316,7 +316,7 @@ static void irdp_if_no_shutdown(struct interface *ifp) /* Write configuration to user */ -void irdp_config_write(struct vty *vty, struct interface *ifp) +int irdp_config_write(struct vty *vty, struct interface *ifp) { struct zebra_if *zi = ifp->info; struct irdp_interface *irdp = &zi->irdp; @@ -348,6 +348,7 @@ void irdp_config_write(struct vty *vty, struct interface *ifp) vty_out(vty, " ip irdp maxadvertinterval %ld\n", irdp->MaxAdvertInterval); } + return 0; } @@ -678,8 +679,10 @@ DEFUN (ip_irdp_debug_disable, return CMD_SUCCESS; } -void irdp_init() +void irdp_if_init() { + hook_register(zebra_if_config_wr, irdp_config_write); + install_element(INTERFACE_NODE, &ip_irdp_broadcast_cmd); install_element(INTERFACE_NODE, &ip_irdp_multicast_cmd); install_element(INTERFACE_NODE, &no_ip_irdp_cmd); diff --git a/zebra/irdp_main.c b/zebra/irdp_main.c index 6220c9d81b..e463608af1 100644 --- a/zebra/irdp_main.c +++ b/zebra/irdp_main.c @@ -301,7 +301,7 @@ void process_solicit(struct interface *ifp) &irdp->t_advertise); } -void irdp_finish() +static int irdp_finish(void) { struct vrf *vrf; struct listnode *node, *nnode; @@ -328,4 +328,11 @@ void irdp_finish() } } +void irdp_init(void) +{ + irdp_if_init(); + + hook_register(frr_early_fini, irdp_finish); +} + #endif /* HAVE_IRDP */ diff --git a/zebra/main.c b/zebra/main.c index c3a7d3635f..72f96add86 100644 --- a/zebra/main.c +++ b/zebra/main.c @@ -126,9 +126,6 @@ static void sigint(void) zlog_notice("Terminating on signal"); frr_early_fini(); -#ifdef HAVE_IRDP - irdp_finish(); -#endif zebra_ptm_finish(); list_delete_all_node(zebrad.client_list); diff --git a/zebra/rtadv.c b/zebra/rtadv.c index b8cf2d490a..2182d6618c 100644 --- a/zebra/rtadv.c +++ b/zebra/rtadv.c @@ -62,6 +62,10 @@ extern struct zebra_privs_t zserv_privs; #define ALLNODE "ff02::1" #define ALLROUTER "ff02::2" +/* Order is intentional. Matches RFC4191. This array is also used for + command matching, so only modify with care. */ +const char *rtadv_pref_strs[] = {"medium", "high", "INVALID", "low", 0}; + enum rtadv_event { RTADV_START, RTADV_STOP, @@ -1456,9 +1460,76 @@ DEFUN (no_ipv6_nd_mtu, return CMD_SUCCESS; } +/* Dump interface ND information to vty. */ +static int nd_dump_vty(struct vty *vty, struct interface *ifp) +{ + struct zebra_if *zif; + struct rtadvconf *rtadv; + int interval; + + zif = (struct zebra_if *)ifp->info; + rtadv = &zif->rtadv; + + if (rtadv->AdvSendAdvertisements) { + vty_out(vty, + " ND advertised reachable time is %d milliseconds\n", + rtadv->AdvReachableTime); + vty_out(vty, + " ND advertised retransmit interval is %d milliseconds\n", + rtadv->AdvRetransTimer); + vty_out(vty, " ND router advertisements sent: %d rcvd: %d\n", + zif->ra_sent, zif->ra_rcvd); + interval = rtadv->MaxRtrAdvInterval; + if (interval % 1000) + vty_out(vty, + " ND router advertisements are sent every " + "%d milliseconds\n", + interval); + else + vty_out(vty, + " ND router advertisements are sent every " + "%d seconds\n", + interval / 1000); + if (rtadv->AdvDefaultLifetime != -1) + vty_out(vty, + " ND router advertisements live for %d seconds\n", + rtadv->AdvDefaultLifetime); + else + vty_out(vty, + " ND router advertisements lifetime tracks ra-interval\n"); + vty_out(vty, + " ND router advertisement default router preference is " + "%s\n", + rtadv_pref_strs[rtadv->DefaultPreference]); + if (rtadv->AdvManagedFlag) + vty_out(vty, + " Hosts use DHCP to obtain routable addresses.\n"); + else + vty_out(vty, + " Hosts use stateless autoconfig for addresses.\n"); + if (rtadv->AdvHomeAgentFlag) { + vty_out(vty, + " ND router advertisements with Home Agent flag bit set.\n"); + if (rtadv->HomeAgentLifetime != -1) + vty_out(vty, + " Home Agent lifetime is %u seconds\n", + rtadv->HomeAgentLifetime); + else + vty_out(vty, + " Home Agent lifetime tracks ra-lifetime\n"); + vty_out(vty, " Home Agent preference is %u\n", + rtadv->HomeAgentPreference); + } + if (rtadv->AdvIntervalOption) + vty_out(vty, + " ND router advertisements with Adv. Interval option.\n"); + } + return 0; +} + /* Write configuration about router advertisement. */ -void rtadv_config_write(struct vty *vty, struct interface *ifp) +static int rtadv_config_write(struct vty *vty, struct interface *ifp) { struct zebra_if *zif; struct listnode *node; @@ -1539,6 +1610,7 @@ void rtadv_config_write(struct vty *vty, struct interface *ifp) vty_out(vty, " router-address"); vty_out(vty, "\n"); } + return 0; } @@ -1600,6 +1672,9 @@ void rtadv_terminate(struct zebra_ns *zns) void rtadv_cmd_init(void) { + hook_register(zebra_if_extra_info, nd_dump_vty); + hook_register(zebra_if_config_wr, rtadv_config_write); + install_element(INTERFACE_NODE, &ipv6_nd_suppress_ra_cmd); install_element(INTERFACE_NODE, &no_ipv6_nd_suppress_ra_cmd); install_element(INTERFACE_NODE, &ipv6_nd_ra_interval_cmd); diff --git a/zebra/rtadv.h b/zebra/rtadv.h index 029c97cddc..dcaeb3ed28 100644 --- a/zebra/rtadv.h +++ b/zebra/rtadv.h @@ -55,8 +55,6 @@ struct rtadv_prefix { #endif }; -extern void rtadv_config_write(struct vty *, struct interface *); - /* RFC4584 Extension to Sockets API for Mobile IPv6 */ #ifndef ND_OPT_ADV_INTERVAL