zebra: fpm: convert into module

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
This commit is contained in:
David Lamparter 2017-02-13 00:29:37 +01:00
parent 5986b66b82
commit 4f8ea50c0d
9 changed files with 80 additions and 141 deletions

View File

@ -365,9 +365,7 @@ if test "${enable_shell_access}" = "yes"; then
AC_DEFINE(HAVE_SHELL_ACCESS,,Allow user to use ssh/telnet/bash)
fi
if test "${enable_fpm}" = "yes"; then
AC_DEFINE(HAVE_FPM,,Forwarding Plane Manager support)
fi
AM_CONDITIONAL([FPM], [test "x$enable_fpm" = "xyes"])
if test "x${enable_dev_build}" = "xyes"; then
AC_DEFINE(DEV_BUILD,,Build for development)

View File

@ -19,18 +19,6 @@ mpls_method = @MPLS_METHOD@
otherobj = $(ioctl_method) $(ipforward) $(if_method) \
$(rt_method) $(rtread_method) $(kernel_method) $(mpls_method)
if HAVE_NETLINK
othersrc = zebra_fpm_netlink.c
endif
if HAVE_PROTOBUF
protobuf_srcs = zebra_fpm_protobuf.c
endif
if DEV_BUILD
dev_srcs = zebra_fpm_dt.c
endif
AM_CFLAGS = $(WERROR)
sbin_PROGRAMS = zebra
@ -41,11 +29,12 @@ zebra_SOURCES = \
zebra_memory.c \
zserv.c main.c interface.c connected.c zebra_rib.c zebra_routemap.c \
redistribute.c debug.c rtadv.c zebra_vty.c \
irdp_main.c irdp_interface.c irdp_packet.c router-id.c zebra_fpm.c \
$(othersrc) zebra_ptm.c zebra_rnh.c zebra_ptm_redistribute.c \
irdp_main.c irdp_interface.c irdp_packet.c router-id.c \
zebra_ptm.c zebra_rnh.c zebra_ptm_redistribute.c \
zebra_ns.c zebra_vrf.c zebra_static.c zebra_mpls.c zebra_mpls_vty.c \
$(protobuf_srcs) zebra_mroute.c \
$(dev_srcs) label_manager.c
zebra_mroute.c \
label_manager.c \
# end
testzebra_SOURCES = test_main.c zebra_rib.c interface.c connected.c debug.c \
zebra_vty.c zebra_ptm.c zebra_routemap.c zebra_ns.c zebra_vrf.c \
@ -57,12 +46,12 @@ noinst_HEADERS = \
zebra_memory.h \
connected.h ioctl.h rib.h rt.h zserv.h redistribute.h debug.h rtadv.h \
interface.h ipforward.h irdp.h router-id.h kernel_socket.h \
rt_netlink.h zebra_fpm.h zebra_fpm_private.h zebra_rnh.h \
rt_netlink.h zebra_fpm_private.h zebra_rnh.h \
zebra_ptm_redistribute.h zebra_ptm.h zebra_routemap.h \
zebra_ns.h zebra_vrf.h ioctl_solaris.h zebra_static.h zebra_mpls.h \
kernel_netlink.h if_netlink.h zebra_mroute.h label_manager.h
zebra_LDADD = $(otherobj) ../lib/libfrr.la $(LIBCAP) $(Q_FPM_PB_CLIENT_LDOPTS)
zebra_LDADD = $(otherobj) ../lib/libfrr.la $(LIBCAP)
testzebra_LDADD = ../lib/libfrr.la $(LIBCAP)
@ -75,6 +64,23 @@ zebra_snmp_la_SOURCES = zebra_snmp.c
zebra_snmp_la_LDFLAGS = -avoid-version -module -shared -export-dynamic
zebra_snmp_la_LIBADD = ../lib/libfrrsnmp.la
if FPM
module_LTLIBRARIES += zebra_fpm.la
endif
zebra_fpm_la_LDFLAGS = -avoid-version -module -shared -export-dynamic
zebra_fpm_la_LIBADD = $(Q_FPM_PB_CLIENT_LDOPTS)
zebra_fpm_la_SOURCES = zebra_fpm.c
if HAVE_NETLINK
zebra_fpm_la_SOURCES += zebra_fpm_netlink.c
endif
if HAVE_PROTOBUF
zebra_fpm_la_SOURCES += zebra_fpm_protobuf.c
endif
if DEV_BUILD
zebra_fpm_la_SOURCES += zebra_fpm_dt.c
endif
EXTRA_DIST = if_ioctl.c if_ioctl_solaris.c if_netlink.c \
if_sysctl.c ipforward_proc.c \
ipforward_solaris.c ipforward_sysctl.c rt_netlink.c \

View File

@ -43,7 +43,6 @@
#include "zebra/router-id.h"
#include "zebra/irdp.h"
#include "zebra/rtadv.h"
#include "zebra/zebra_fpm.h"
#include "zebra/zebra_ptm.h"
#include "zebra/zebra_ns.h"
#include "zebra/redistribute.h"
@ -84,7 +83,6 @@ struct option longopts[] =
{ "batch", no_argument, NULL, 'b'},
{ "allow_delete", no_argument, NULL, 'a'},
{ "keep_kernel", no_argument, NULL, 'k'},
{ "fpm_format", required_argument, NULL, 'F'},
{ "socket", required_argument, NULL, 'z'},
{ "ecmp", required_argument, NULL, 'e'},
{ "label_socket", no_argument, NULL, 'l'},
@ -221,21 +219,18 @@ main (int argc, char **argv)
{
// int batch_mode = 0;
char *zserv_path = NULL;
char *fpm_format = NULL;
/* Socket to external label manager */
char *lblmgr_path = NULL;
frr_preinit(&zebra_di, argc, argv);
frr_opt_add("bakF:z:e:l:r"
frr_opt_add("bakz:e:l:r"
#ifdef HAVE_NETLINK
"s:"
#endif
, longopts,
" -b, --batch Runs in batch mode\n"
" -a, --allow_delete Allow other processes to delete zebra routes\n"
" -F, --fpm_format Set fpm format to 'netlink' or 'protobuf'\n"
" -z, --socket Set path of zebra socket\n"
" -e, --ecmp Specify ECMP to use.\n"
" -l, --label_socket Socket to external label manager\n"\
@ -266,9 +261,6 @@ main (int argc, char **argv)
case 'k':
keep_kernel_mode = 1;
break;
case 'F':
fpm_format = optarg;
break;
case 'e':
multipath_num = atoi (optarg);
if (multipath_num > MULTIPATH_NUM || multipath_num <= 0)
@ -329,12 +321,6 @@ main (int argc, char **argv)
/* Initialize NS( and implicitly the VRF module), and make kernel routing socket. */
zebra_ns_init ();
#ifdef HAVE_FPM
zfpm_init (zebrad.master, 1, 0, fpm_format);
#else
zfpm_init (zebrad.master, 0, 0, fpm_format);
#endif
/* Process the configuration file. Among other configuration
* directives we can meet those installing static routes. Such
* requests will not be executed immediately, but queued in

View File

@ -25,7 +25,6 @@
#include "zebra/rtadv.h"
#include "zebra/irdp.h"
#include "zebra/interface.h"
#include "zebra/zebra_fpm.h"
void rtadv_config_write (struct vty *vty, struct interface *ifp) { return; }
void irdp_config_write (struct vty *vty, struct interface *ifp) { return; }
@ -35,9 +34,3 @@ void ifstat_update_proc (void) { return; }
#ifdef HAVE_NET_RT_IFLIST
void ifstat_update_sysctl (void) { return; }
#endif
void
zfpm_trigger_update (struct route_node *rn, const char *reason)
{
return;
}

View File

@ -24,6 +24,7 @@
#define _ZEBRA_RIB_H
#include "zebra.h"
#include "hook.h"
#include "linklist.h"
#include "prefix.h"
#include "table.h"
@ -490,4 +491,6 @@ rib_tables_iter_cleanup (rib_tables_iter_t *iter)
iter->state = RIB_TABLES_ITER_S_DONE;
}
DECLARE_HOOK(rib_update, (struct route_node *rn, const char *reason), (rn, reason))
#endif /*_ZEBRA_RIB_H */

View File

@ -25,10 +25,12 @@
#include <zebra.h>
#include "log.h"
#include "libfrr.h"
#include "stream.h"
#include "thread.h"
#include "network.h"
#include "command.h"
#include "version.h"
#include "zebra/rib.h"
#include "zebra/zserv.h"
@ -36,7 +38,6 @@
#include "zebra/zebra_vrf.h"
#include "fpm/fpm.h"
#include "zebra_fpm.h"
#include "zebra_fpm_private.h"
/*
@ -254,6 +255,8 @@ typedef struct zfpm_glob_t_
static zfpm_glob_t zfpm_glob_space;
static zfpm_glob_t *zfpm_g = &zfpm_glob_space;
static int zfpm_trigger_update (struct route_node *rn, const char *reason);
static int zfpm_read_cb (struct thread *thread);
static int zfpm_write_cb (struct thread *thread);
@ -1296,7 +1299,6 @@ zfpm_start_connect_timer (const char *reason)
zfpm_set_state (ZFPM_STATE_ACTIVE, reason);
}
#if defined (HAVE_FPM)
/*
* zfpm_is_enabled
*
@ -1307,7 +1309,6 @@ zfpm_is_enabled (void)
{
return zfpm_g->enabled;
}
#endif
/*
* zfpm_conn_is_up
@ -1331,7 +1332,7 @@ zfpm_conn_is_up (void)
* The zebra code invokes this function to indicate that we should
* send an update to the FPM about the given route_node.
*/
void
static int
zfpm_trigger_update (struct route_node *rn, const char *reason)
{
rib_dest_t *dest;
@ -1342,7 +1343,7 @@ zfpm_trigger_update (struct route_node *rn, const char *reason)
* all destinations once the connection comes up.
*/
if (!zfpm_conn_is_up ())
return;
return 0;
dest = rib_dest_from_rnode (rn);
@ -1353,12 +1354,12 @@ zfpm_trigger_update (struct route_node *rn, const char *reason)
if (!zfpm_is_table_for_fpm (rib_dest_table (dest)))
{
zfpm_g->stats.non_fpm_table_triggers++;
return;
return 0;
}
if (CHECK_FLAG (dest->flags, RIB_DEST_UPDATE_FPM)) {
zfpm_g->stats.redundant_triggers++;
return;
return 0;
}
if (reason)
@ -1375,9 +1376,10 @@ zfpm_trigger_update (struct route_node *rn, const char *reason)
* Make sure that writes are enabled.
*/
if (zfpm_g->t_write)
return;
return 0;
zfpm_write_on ();
return 0;
}
/*
@ -1411,7 +1413,6 @@ zfpm_stats_timer_cb (struct thread *t)
return 0;
}
#if defined (HAVE_FPM)
/*
* zfpm_stop_stats_timer
*/
@ -1424,7 +1425,6 @@ zfpm_stop_stats_timer (void)
zfpm_debug ("Stopping existing stats timer");
THREAD_TIMER_OFF (zfpm_g->t_stats);
}
#endif
/*
* zfpm_start_stats_timer
@ -1447,7 +1447,6 @@ zfpm_start_stats_timer (void)
zfpm_g->last_ivl_stats.counter, VTY_NEWLINE); \
} while (0)
#if defined (HAVE_FPM)
/*
* zfpm_show_stats
*/
@ -1600,7 +1599,6 @@ DEFUN ( no_fpm_remote_ip,
return CMD_SUCCESS;
}
#endif
/*
* zfpm_init_message_format
@ -1670,7 +1668,7 @@ zfpm_init_message_format (const char *format)
* Returns ZERO on success.
*/
int fpm_remote_srv_write (struct vty *vty )
static int fpm_remote_srv_write (struct vty *vty)
{
struct in_addr in;
@ -1684,6 +1682,15 @@ int fpm_remote_srv_write (struct vty *vty )
}
/* Zebra node */
static struct cmd_node zebra_node =
{
ZEBRA_NODE,
"",
1
};
/**
* zfpm_init
*
@ -1695,17 +1702,12 @@ int fpm_remote_srv_write (struct vty *vty )
*
* Returns TRUE on success.
*/
int
zfpm_init (struct thread_master *master, int enable, uint16_t port,
const char *format)
static int
zfpm_init (struct thread_master *master)
{
static int initialized = 0;
if (initialized) {
return 1;
}
initialized = 1;
int enable = 1;
uint16_t port = 0;
const char *format = THIS_MODULE->load_args;
memset (zfpm_g, 0, sizeof (*zfpm_g));
zfpm_g->master = master;
@ -1717,12 +1719,11 @@ zfpm_init (struct thread_master *master, int enable, uint16_t port,
zfpm_stats_init (&zfpm_g->last_ivl_stats);
zfpm_stats_init (&zfpm_g->cumulative_stats);
#if defined (HAVE_FPM)
install_node (&zebra_node, fpm_remote_srv_write);
install_element (ENABLE_NODE, &show_zebra_fpm_stats_cmd);
install_element (ENABLE_NODE, &clear_zebra_fpm_stats_cmd);
install_element (CONFIG_NODE, &fpm_remote_ip_cmd);
install_element (CONFIG_NODE, &no_fpm_remote_ip_cmd);
#endif
zfpm_init_message_format(format);
@ -1734,10 +1735,6 @@ zfpm_init (struct thread_master *master, int enable, uint16_t port,
zfpm_g->enabled = enable;
if (!enable) {
return 1;
}
if (!zfpm_g->fpm_server)
zfpm_g->fpm_server = FPM_DEFAULT_IP;
@ -1751,6 +1748,20 @@ zfpm_init (struct thread_master *master, int enable, uint16_t port,
zfpm_start_stats_timer ();
zfpm_start_connect_timer ("initialized");
return 1;
return 0;
}
static int
zebra_fpm_module_init (void)
{
hook_register(rib_update, zfpm_trigger_update);
hook_register(frr_late_init, zfpm_init);
return 0;
}
FRR_MODULE_SETUP(
.name = "zebra_fpm",
.version = FRR_VERSION,
.description = "zebra FPM (Forwarding Plane Manager) module",
.init = zebra_fpm_module_init,
)

View File

@ -1,36 +0,0 @@
/*
* Header file exported by the zebra FPM module to zebra.
*
* Copyright (C) 2012 by Open Source Routing.
* Copyright (C) 2012 by Internet Systems Consortium, Inc. ("ISC")
*
* This file is part of GNU Zebra.
*
* GNU Zebra is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* GNU Zebra is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Zebra; see the file COPYING. If not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef _ZEBRA_FPM_H
#define _ZEBRA_FPM_H
/*
* Externs.
*/
extern int zfpm_init (struct thread_master *master, int enable, uint16_t port,
const char *message_format);
extern void zfpm_trigger_update (struct route_node *rn, const char *reason);
extern int fpm_remote_srv_write (struct vty *vty);
#endif /* _ZEBRA_FPM_H */

View File

@ -48,11 +48,12 @@
#include "zebra/redistribute.h"
#include "zebra/zebra_routemap.h"
#include "zebra/debug.h"
#include "zebra/zebra_fpm.h"
#include "zebra/zebra_rnh.h"
#include "zebra/interface.h"
#include "zebra/connected.h"
DEFINE_HOOK(rib_update, (struct route_node *rn, const char *reason), (rn, reason))
/* Should we allow non Quagga processes to delete our routes */
extern int allow_delete;
@ -1110,7 +1111,7 @@ rib_install_kernel (struct route_node *rn, struct rib *rib, struct rib *old)
* Make sure we update the FPM any time we send new information to
* the kernel.
*/
zfpm_trigger_update (rn, "installing in kernel");
hook_call(rib_update, rn, "installing in kernel");
ret = kernel_route_rib (p, src_p, old, rib);
/* If install succeeds, update FIB flag for nexthops. */
@ -1154,7 +1155,7 @@ rib_uninstall_kernel (struct route_node *rn, struct rib *rib)
* Make sure we update the FPM any time we send new information to
* the kernel.
*/
zfpm_trigger_update (rn, "uninstalling from kernel");
hook_call(rib_update, rn, "uninstalling from kernel");
ret = kernel_route_rib (p, src_p, rib, NULL);
for (ALL_NEXTHOPS_RO(rib->nexthop, nexthop, tnexthop, recursing))
@ -1172,7 +1173,7 @@ rib_uninstall (struct route_node *rn, struct rib *rib)
if (CHECK_FLAG (rib->status, RIB_ENTRY_SELECTED_FIB))
{
if (info->safi == SAFI_UNICAST)
zfpm_trigger_update (rn, "rib_uninstall");
hook_call(rib_update, rn, "rib_uninstall");
if (! RIB_SYSTEM_ROUTE (rib))
rib_uninstall_kernel (rn, rib);
@ -1253,7 +1254,7 @@ static void
rib_process_add_fib(struct zebra_vrf *zvrf, struct route_node *rn,
struct rib *new)
{
zfpm_trigger_update (rn, "new route selected");
hook_call(rib_update, rn, "new route selected");
/* Update real nexthop. This may actually determine if nexthop is active or not. */
if (!nexthop_active_update (rn, new, 1))
@ -1289,7 +1290,7 @@ static void
rib_process_del_fib(struct zebra_vrf *zvrf, struct route_node *rn,
struct rib *old)
{
zfpm_trigger_update (rn, "removing existing route");
hook_call(rib_update, rn, "removing existing route");
/* Uninstall from kernel. */
if (IS_ZEBRA_DEBUG_RIB)
@ -1326,7 +1327,7 @@ rib_process_update_fib (struct zebra_vrf *zvrf, struct route_node *rn,
if (new != old ||
CHECK_FLAG (new->status, RIB_ENTRY_CHANGED))
{
zfpm_trigger_update (rn, "updating existing route");
hook_call(rib_update, rn, "updating existing route");
/* Update the nexthop; we could determine here that nexthop is inactive. */
if (nexthop_active_update (rn, new, 1))
@ -2874,7 +2875,7 @@ rib_close_table (struct route_table *table)
continue;
if (info->safi == SAFI_UNICAST)
zfpm_trigger_update (rn, NULL);
hook_call(rib_update, rn, NULL);
if (! RIB_SYSTEM_ROUTE (rib))
rib_uninstall_kernel (rn, rib);

View File

@ -53,7 +53,6 @@
#include "zebra/zebra_ptm.h"
#include "zebra/rtadv.h"
#include "zebra/zebra_mpls.h"
#include "zebra/zebra_fpm.h"
#include "zebra/zebra_mroute.h"
#include "zebra/label_manager.h"
@ -2850,25 +2849,6 @@ static struct cmd_node forwarding_node =
1
};
#ifdef HAVE_FPM
/* function to write the fpm config info */
static int
config_write_fpm (struct vty *vty)
{
return
fpm_remote_srv_write (vty);
}
/* Zebra node */
static struct cmd_node zebra_node =
{
ZEBRA_NODE,
"",
1
};
#endif
/* Initialisation of zebra and installation of commands. */
void
zebra_init (void)
@ -2879,9 +2859,6 @@ zebra_init (void)
/* Install configuration write function. */
install_node (&table_node, config_write_table);
install_node (&forwarding_node, config_write_forwarding);
#ifdef HAVE_FPM
install_node (&zebra_node, config_write_fpm);
#endif
install_element (VIEW_NODE, &show_ip_forwarding_cmd);
install_element (CONFIG_NODE, &ip_forwarding_cmd);