]> git.proxmox.com Git - mirror_frr.git/commitdiff
zebra: start detangling rtadv & irdp
authorDavid Lamparter <equinox@opensourcerouting.org>
Sun, 6 Aug 2017 06:08:39 +0000 (08:08 +0200)
committerDavid Lamparter <equinox@opensourcerouting.org>
Tue, 15 Aug 2017 11:25:44 +0000 (13:25 +0200)
Replace some cross-dependencies with hooks & move bits to where they
belong.

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
zebra/interface.c
zebra/interface.h
zebra/irdp.h
zebra/irdp_interface.c
zebra/irdp_main.c
zebra/main.c
zebra/rtadv.c
zebra/rtadv.h

index 48158c82c48e650db669c45b9fe6eb7fa48e0e18..c17e408ea0e062903fb19ec91a3969228f57854d 100644 (file)
 
 #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);
 
index 970c3c52927b78fe5d67883cb245ba679628273c..7b56dcd4a40c7263f1b1ba1052963153df1fc4d3 100644 (file)
 
 #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)
index 01308b915b3f4a316e142a771d465fb42b3fd6c5..f8f7811248a4e370137c39dda4e0778071d41966 100644 (file)
@@ -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);
index 5682e12e6f51385e07095b67e35b16fed835b4ef..032090adf2a93b0ba3e6fa12b3625be27785646d 100644 (file)
@@ -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);
index 6220c9d81b1fda53083e053540568987058329f3..e463608af1f165d7b30eae41e1e6c311999b6215 100644 (file)
@@ -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 */
index c3a7d3635fd9b3460a8148578ddae3e0092e37a3..72f96add8671d2c4841504a26577e57777cb6a96 100644 (file)
@@ -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);
index b8cf2d490afbe2a269c1e9969fb629c765a5bfe8..2182d6618ce4a33fa4a24c0b19a387424119cd1d 100644 (file)
@@ -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);
index 029c97cddc50687dbeba2d5850bc736ee3d9ef60..dcaeb3ed28bf1e359add90fc355f670f10ec645a 100644 (file)
@@ -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